diff --git a/uppdev/$.tpp/Reference$en-us.tpp b/uppdev/$.tpp/Reference$en-us.tpp deleted file mode 100644 index 33b304b1d..000000000 --- a/uppdev/$.tpp/Reference$en-us.tpp +++ /dev/null @@ -1,562 +0,0 @@ -topic "template class AIndex"; -[ $$0,0#00000000000000000000000000000000:Default] -[i448;a25;kKO9; $$1,0#37138531426314131252341829483380:class] -[l288;2 $$2,0#27521748481378242620020725143825:desc] -[0 $$3,0#96390100711032703541132217272105:end] -[H6;0 $$4,0#05600065144404261032431302351956:begin] -[i448;a25;kKO9;2 $$5,0#37138531426314131252341829483370:item] -[l288;a17;*@5;1 $$6,6#70004532496200323422659154056402:requirement] -[l288;i1121;b17;O9;~~~.1408;2 $$7,0#10431211400427159095818037425705:param] -[{_}%EN-US -[s5;%- [*@(64) template_<][*@(0.0.255) class][*@(64) _][*@4 T][*@(64) , ][*@(0.0.255) class][*@(64) _ -][*@4 V][*@(64) , ][*@(0.0.255) class][*@(64) _][*@4 HashFn][*@(64) >__][*@(0.0.255) class][*@(64) _ -][* AIndex]&] -[s0;:`:`:AbortExc`:`:`:`:AbortExc`(`): [t class ][*t AIndex]&] -[s0; &] -[s0; [*C@4 T]-|Type of [^topic`:`/`/CoreTopics`/src`/AIndex`$en`-us^ elements] -to store. T must satisfy requirements for container flavor identified -by parameter V and must have [*C operator`=`=] defined.&] -[s0; [*C@4 V]-|Basic random access container.&] -[s0; [*C@4 HashFn]-|Hashing class. Must have defined [*C unsigned operator()(const -T`& x)] method returning hash value for elements.&] -[s0; This template class adds associative capabilities to basic random -access containers, forming flavors of Index. It is used as base -class for concrete index flavors, [* Index] and [* ArrayIndex].&] -[s0; It allows adding elements at the end of sequence in constant -amortized time like basic random container. Additionally, it -also allows fast retrieval of a position of the element with -specified value. Hashing is used for this operation. AIndex stores -hash`-values of elements, so it has no sense to cache them externally.&] -[s0; Building of internal hash maps of AIndex is always deferred -till search operation. This effectively avoids unneeded remapping -if large number of elements is added.&] -[s0; Removing elements from an AIndex causes an interesting problem. -While it is possible to simply remove (or insert) an element -at a specified position, such operation has to move a lot of -elements and also scratches internal hash maps. Thus removing -elements this way is slow, especially when combined with searching.&] -[s0; The solution for this problem is [*/ unlinking] of elements. Unlinked -elements are not removed from index, but they are [*/ ignored][/ -]by search operations. Unlinking is a simple, constant time, -fast operation. Further, it is possible to place an element at -the first available unlinked position (rather than to the end -of sequence) using the [* Put] method, reusing unlinked position -in short constant time.&] -[s0; The only problem of unlinking is that it breaks the so`-called -[* multi`-key ordering]. This term means that if there are more -elements with the same value in the index and they are iterated -through using the FindNext method, their positions (got as the -result of Find and subsequent FindNext methods) are in ascending -order. The problem is that it is impossible to implement placing -elements at unlinked positions in short time while preserving -this ordering. On the other hand, usage scenarios for indexes -show that need for unlinking elements and multi`-key ordering -is almost always disjunct. For the rest of the cases, it is always -possible to restore ordering by the [* Reindex] or the [* Sweep] -method.&] -[s0; Like any other NTL container, AIndex is [*/^topic`:`/`/Core`/srcdoc`/Moveable`$en`-us^ m -oveable][*/ ]type with [*/^topic`:`/`/Core`/srcdoc`/Moveable`$en`-us^ pick -and optional deep copy] transfer semantics, although these features -are more important in derived concrete index flavors.&] -[s0; Members&] -[s0; &] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:Add`(const T`&`,unsigned`):%- [@(0.0.255) void]_[* Add]([@(0.0.255) cons -t]_[*@4 T]`&_[*@3 x], [@(0.0.255) unsigned]_[*@3 `_hash])&] -[s2; Adds a new element with a precomputed hash value.The precomputed -hash value must be the same as the hash value that would be the -result of HashFn. The benefit of this variant is that sometimes -you can compute hash`-value as the part of an other process, -like fetching strings from an input stream.&] -[s6; Requires T to have deep copy constructor.&] -[s6; Invalidates iterators to AIndex.&] -[s6; Invalidates references to Index.&] -[s7; [*C@3 x]-|Element to add.&] -[s7; [*C@3 `_hash]-|Precomputed hash value.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:Add`(const T`&`):%- [@(0.0.255) void]_[* Add]([@(0.0.255) const]_[*@4 T]`& -_[*@3 x])&] -[s2; Adds a new element to AIndex.&] -[s6; Requires T to have deep copy constructor.&] -[s6; Invalidates iterators to AIndex.&] -[s6; Invalidates references to Index.&] -[s7; [*C@3 x]-|Element to add.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:Find`(const T`&`,unsigned`)const:%- [@(0.0.255) int]_[* Find]([@(0.0.255) c -onst]_[*@4 T]`&_[*@3 x], [@(0.0.255) unsigned]_[*@3 `_hash])_[@(0.0.255) const]&] -[s2; Retrieves the position of the first element with the specified -value in AIndex, using a precomputed hash value. The precomputed -hash value must be the same as the hash value that would be result -of HashFn. If multi`-key ordering is not broken and more than -one element with the same value exists in AIndex, the lowest -position is retrieved. If the specified value does not exist -in AIndex, a negative number is returned. Unlinked elements are -ignored.&] -[s7; [*C@3 x]-|Element to find.&] -[s7; [*C@3 `_hash]-|Precomputed hash value.&] -[s7; [*/ Return value]-|Position of the element or negative value if -value is not in AIndex.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:Find`(const T`&`)const:%- [@(0.0.255) int]_[* Find]([@(0.0.255) const]_[*@4 T -]`&_[*@3 x])_[@(0.0.255) const]&] -[s2; Retrieves the position of the first element with the specified -value in AIndex. If multi`-key ordering is not broken and more -than one element with the same value exists in AIndex, lowest -position is retrieved. If the specified value does not exist -in AIndex, a negative number is returned. Unlinked elements are -ignored.&] -[s7; [*C@3 x]-|Element to find.&] -[s7; [*/ Return value]-|Position of the element or negative value if -value is not in AIndex.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:FindNext`(int`)const:%- [@(0.0.255) int]_[* FindNext]([@(0.0.255) int]_[*@3 i -])_[@(0.0.255) const]&] -[s2; Retrieves the position of the next element with the same value -as the element at specified position. If multi`-key ordering -is not broken and more than one element with that value exists -in AIndex, the lowest position greater than specified one is -retrieved, so positions returned by subsequent calls to FindNext -are in ascending order. When there are no more elements with -the required value, a negative number is returned. Unlinked elements -are ignored.&] -[s7; [*C@3 i]-|Position of the element.&] -[s7; [*/ Return value]-|Position of the next element with same value.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:FindLast`(const T`&`,unsigned`)const:%- [@(0.0.255) int]_[* FindLast]( -[@(0.0.255) const]_[*@4 T]`&_[*@3 x], [@(0.0.255) unsigned]_[*@3 `_hash])_[@(0.0.255) const]&] -[s2; Retrieves the position of the last element with specified value -in AIndex, using a precomputed hash value. The precomputed hash -value must be the same as the hash value that would be the result -of HashFn. If multi`-key ordering is not broken and more than -one element with the same value exists in AIndex, the greatest -position is retrieved. If the specified value does not exist -in AIndex, a negative number is returned. Unlinked elements are -ignored.&] -[s7; [*C@3 x]-|Element to find.&] -[s7; [*C@3 `_hash]-|Precomputed hash value.&] -[s7; [*/ Return value]-|Position of the element or negative number if -value is not in AIndex.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:FindLast`(const T`&`)const:%- [@(0.0.255) int]_[* FindLast]([@(0.0.255) c -onst]_[*@4 T]`&_[*@3 x])_[@(0.0.255) const]&] -[s2; Retrieves the position of the last element with specified value -in AIndex. If multi`-key ordering is not broken and more than -one element with the same value exists in AIndex, the greatest -position is retrieved. If element does not exist in AIndex, a -negative number is returned. Unlinked elements are ignored.&] -[s7; [*C@3 x]-|Element to find.&] -[s7; [*C@3 `_hash]-|Precomputed hash value.&] -[s7; [*/ Return value]-|Position of the element or negative number if -value is not in AIndex.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:FindPrev`(int`)const:%- [@(0.0.255) int]_[* FindPrev]([@(0.0.255) int]_[*@3 i -])_[@(0.0.255) const]&] -[s2; Retrieves the position of the previous element with the same -value as the element at the specified position. If multi`-key -ordering is not broken and more than one element with that value -exists in AIndex, the greatest position lower than specified -one is retrieved (so that positions got by subsequent calls to -FindNext are in descending order). When there are no more elements -with required value, negative number is returned. Unlinked elements -are ignored.&] -[s7; [*C@3 i]-|Position of the element.&] -[s7; [*/ Return value]-|Position of the previous element with same value.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:FindAdd`(const T`&`,unsigned`):%- [@(0.0.255) int]_[* FindAdd]([@(0.0.255) c -onst]_[*@4 T]`&_[*@3 key], [@(0.0.255) unsigned]_[*@3 `_hash])&] -[s2; Retrieves position of first element with specified value in -AIndex, using a precomputed hash value. Precomputed hash value -must be same as hash value that would be result of HashFn. If -multi`-key ordering is not broken and more than one element with -the same value exists in AIndex, the lowest position is retrieved. -If element does not exist in AIndex, it is added to AIndex and -position of this newly added element is returned. Unlinked elements -are ignored.&] -[s7; [*C@3 key]-|Element to find or add.&] -[s7; [*C@3 `_hash]-|Precomputed hash value.&] -[s7; [*/ Return value]-|Position of the found or added element.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:FindAdd`(const T`&`):%- [@(0.0.255) int]_[* FindAdd]([@(0.0.255) const]_ -[*@4 T]`&_[*@3 key])&] -[s2; Retrieves position of first element with specified value in -AIndex. If multi`-key ordering is not broken and more than one -element with the same value exists in AIndex, lowest position -is retrieved. If element does not exist in AIndex, it is added -to AIndex and position of this newly added element is returned. -Unlinked elements are ignored.&] -[s7; [*C@3 key]-|Element to find or add.&] -[s7; [*/ Return value]-|Position of the found or added element.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:operator`<`<`(const T`&`):%- [_^`:`:AIndex^ AIndex]`&_[* operator<<]([@(0.0.255) c -onst]_[*@4 T]`&_[*@3 x])&] -[s2; Operator replacement of [* void Add(const T`& x)]. By returning -reference to AIndex it allows adding multiple elements in a single -expression, thus e.g. allowing to construct a temporary Index -as part of an expression like Foo((Index() << 1 << 2)).&] -[s6; Requires T to have deep copy constructor.&] -[s6; Invalidates iterators to AIndex.&] -[s6; Invalidates references to Index.&] -[s7; [*C@3 newt]-|Element to be added.&] -[s7; [*/ Return value]-|Reference to AIndex.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:Unlink`(int`):%- [@(0.0.255) void]_[* Unlink]([@(0.0.255) int]_[*@3 i])&] -[s2; Unlinks the element at the specified position. The unlinked -item stays in AIndex but is ignored by any Find operation.&] -[s7; [*C@3 i]-|Position of item to unlink.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:Put`(const T`&`,unsigned`):%- [@(0.0.255) int]_[* Put]([@(0.0.255) const -]_[*@4 T]`&_[*@3 x], [@(0.0.255) unsigned]_[*@3 `_hash])&] -[s2; If there are any unlinked elements in AIndex, one of them is -replaced by specified value. If there are no unlinked elements, -the element with the specified value is appended to the end of -AIndex using [* Add]. The precomputed hash should be same as the -result of HashFn. The position of the placed element is returned.&] -[s6; Invalidates multi`-key ordering.&] -[s6; Requires T to have deep copy constructor.&] -[s6; Invalidates iterators to AIndex.&] -[s6; Invalidates references to Index.&] -[s7; [*C@3 x]-|Element to put into AIndex.&] -[s7; [*C@3 `_hash]-|Precomputed hash value.&] -[s7; [*/ Return value]-|Position where the element was placed.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:Put`(const T`&`):%- [@(0.0.255) int]_[* Put]([@(0.0.255) const]_[*@4 T]`&_ -[*@3 x])&] -[s2; If there are any unlinked elements in AIndex, one of them is -replaced by specified value. If there are no unlinked elements, -the element with the specified value is appended to the end of -AIndex using [* Add]. The position of the placed element is returned.&] -[s6; Invalidates multi`-key ordering.&] -[s6; Requires T to have deep copy constructor.&] -[s6; Invalidates iterators to AIndex.&] -[s7; [*C@3 x]-|Element to put into AIndex.&] -[s7; [*/ Return value]-|Position where element is placed.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:FindPut`(const T`&`,unsigned`):%- [@(0.0.255) int]_[* FindPut]([@(0.0.255) c -onst]_[*@4 T]`&_[*@3 key], [@(0.0.255) unsigned]_[*@3 `_hash])&] -[s2; Retrieves the position of the first element with the specified -value in AIndex, using a precomputed hash value. The precomputed -hash value must be the same as the hash value that would be the -result of HashFn. If the specified value does not exist in the -AIndex, it is placed to it using [* Put(const T`& x, unsigned `_hash).] -The position of the found or placed element is returned.&] -[s6;~~~.992; Invalidates multi`-key ordering.&] -[s6; Requires T to have deep copy constructor.&] -[s6; Invalidates iterators to AIndex.&] -[s6; Invalidates references to Index.&] -[s7; [*C@3 key]-|Element to find or put.&] -[s7; [*C@3 `_hash]-|Precomputed hash value.&] -[s7; [*/ Return value]-|Position of the found or placed element.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:FindPut`(const T`&`):%- [@(0.0.255) int]_[* FindPut]([@(0.0.255) const]_ -[*@4 T]`&_[*@3 key])&] -[s2; Retrieves the position of the first element with the specified -value in AIndex. If the element does not exist in the AIndex, -it is placed to it using [* Put(const T`& x).] The position of -the found or placed element is returned.&] -[s6; Invalidates multi`-key ordering.&] -[s6; Requires T to have deep copy constructor.&] -[s6; Invalidates iterators to AIndex.&] -[s6; Invalidates references to Index.&] -[s7; [*C@3 key]-|Element to find or put.&] -[s7; [*C@3 `_hash]-|Precomputed hash value.&] -[s7; [*/ Return value]-|Position of the found or placed element.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:Set`(int`,const T`&`,unsigned`):%- [@(0.0.255) void]_[* Set]([@(0.0.255) i -nt]_[*@3 i], [@(0.0.255) const]_[*@4 T]`&_[*@3 x], [@(0.0.255) unsigned]_[*@3 `_hash])&] -[s2; Replaces the element at the specified position with a new element -with the specified value, using a precomputed hash`-value. Speed -of this operation depends on the total number of elements with -the same value as the specified one.&] -[s6; Requires T to have deep copy constructor.&] -[s6; Invalidates iterators to AIndex.&] -[s6; Invalidates references to Index.&] -[s7; [*C@3 i]-|Position of the element.&] -[s7; [*C@3 x]-|Value to set.&] -[s7; [*C@3 `_hash]-|Precomputed hash value.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:Set`(int`,const T`&`):%- [@(0.0.255) void]_[* Set]([@(0.0.255) int]_[*@3 i -], [@(0.0.255) const]_[*@4 T]`&_[*@3 x])&] -[s2; Replaces the element at the specified position with a new element -with the specified value. Speed of this operation depends on -total number of elements with the same value as specified the -specified one.&] -[s6; Requires T to have deep copy constructor.&] -[s6; Invalidates iterators to AIndex.&] -[s6; Invalidates references to Index.&] -[s7; [*C@3 i]-|Position of the element.&] -[s7; [*C@3 x]-|Value to set.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:operator`[`]`(int`)const:%- [@(0.0.255) const]_[*@4 T]`&_[* operator`[`] -]([@(0.0.255) int]_[*@3 i])_[@(0.0.255) const]&] -[s2; Returns the element at the specified position.&] -[s7; [*C@3 i]-|Position of the element.&] -[s7; [*/ Return value]-|Constant reference to element.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:GetCount`(`)const:%- [@(0.0.255) int]_[* GetCount]()_[@(0.0.255) const]&] -[s2; Returns number of elements in AIndex.&] -[s7; [*/ Return value]-|Actual number of elements.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:IsEmpty`(`)const:%- [@(0.0.255) bool]_[* IsEmpty]()_[@(0.0.255) const]&] -[s2; Tests whether AIndex is empty. Same as GetCount() `=`= 0.&] -[s7; [*/ Return value]-|true if AIndex is empty, false otherwise.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:Clear`(`):%- [@(0.0.255) void]_[* Clear]()&] -[s2; Removes all elements from AIndex.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:ClearIndex`(`):%- [@(0.0.255) void]_[* ClearIndex]()&] -[s2; Restores multi`-key ordering.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:UnlinkKey`(const T`&`,unsigned`):%- [@(0.0.255) int]_[* UnlinkKey]([@(0.0.255) c -onst]_[*@4 T]`&_[*@3 k], [@(0.0.255) unsigned]_[*@3 h])&] -[s2; Unlinks all elements with specified value using precomputed -hash`-value. Unlinked elements stay in AIndex but are ignored -by any Find operations. Precomputed hash value must be same as -hash value that would be result of HashFn. &] -[s7; [*C@3 k]-|Value of elements to unlink.&] -[s7; [*C@3 h]-|Precomputed hash value.&] -[s7; [*/ Return value]-|Number of elements unlinked.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:UnlinkKey`(const T`&`):%- [@(0.0.255) int]_[* UnlinkKey]([@(0.0.255) con -st]_[*@4 T]`&_[*@3 k])&] -[s2; Unlinks all elements with specified value. Unlinked elements -remain in the AIndex but are ignored by any Find operations.&] -[s7; [*C@3 k]-|Value of elements to unlink.&] -[s7; [*/ Return value]-|Number of elements unlinked.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:IsUnlinked`(int`)const:%- [@(0.0.255) bool]_[* IsUnlinked]([@(0.0.255) i -nt]_[*@3 i])_[@(0.0.255) const]&] -[s2; Tests whether the element at the specified position is unlinked.&] -[s7; [*C@3 i]-|Position.&] -[s7; [*/ Return value]-|true if element is unlinked.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:Sweep`(`):%- [@(0.0.255) void]_[* Sweep]()&] -[s2; Removes all unlinked elements from AIndex. Complexity of the -operation depends on the number of elements in AIndex, not on -the number of unlinked elements. Also restores multi`-key ordering.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:Insert`(int`,const T`&`,unsigned`):%- [@(0.0.255) void]_[* Insert]([@(0.0.255) i -nt]_[*@3 i], [@(0.0.255) const]_[*@4 T]`&_[*@3 k], [@(0.0.255) unsigned]_[*@3 h])&] -[s2; Inserts an element with the specified value at the specified -position, using a precomputed hash value. The precomputed hash -value must be the same as the hash value that would be the result -of HashFn. This is a slow operation, especially when combined -with any search operations.&] -[s6; Requires T to have deep copy constructor.&] -[s6; Invalidates iterators to AIndex.&] -[s6; Invalidates references to Index.&] -[s7; [*C@3 i]-|Insert position.&] -[s7; [*C@3 k]-|Element to insert.&] -[s7; [*C@3 h]-|Precomputed hash value.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:Insert`(int`,const T`&`):%- [@(0.0.255) void]_[* Insert]([@(0.0.255) int -]_[*@3 i], [@(0.0.255) const]_[*@4 T]`&_[*@3 k])&] -[s2; Inserts an element with the specified value at the specified -position. This is a slow operation, especially when combined -with any search operations.&] -[s6; Requires T to have deep copy constructor.&] -[s6; Invalidates iterators to AIndex.&] -[s6; Invalidates references to Index.&] -[s7; [*C@3 i]-|Insert position.&] -[s7; [*C@3 k]-|Element to insert.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:Remove`(int`):%- [@(0.0.255) void]_[* Remove]([@(0.0.255) int]_[*@3 i])&] -[s2; Removes the element at the specified position. This is a slow -operation, especially when combined with any search operations.&] -[s6; Invalidates iterators to AIndex.&] -[s6; Invalidates references to Index.&] -[s7; [*C@3 i]-|Position of the element to remove.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:Remove`(const int`*`,int`):%- [@(0.0.255) void]_[* Remove]([@(0.0.255) c -onst]_[@(0.0.255) int]_`*[*@3 sorted`_list], [@(0.0.255) int]_[*@3 count])&] -[s2; Removes multiple elements from AIndex. Time of operation only -slightly depends on the number of removed elements. This is a -slow operation, especially when combined with any search operations.&] -[s6; Invalidates iterators to AIndex.&] -[s6; Invalidates references to Index.&] -[s7; [*C@3 sorted`_list]-|Pointer to array of positions to remove, in -ascending order.&] -[s7; [*C@3 count]-|Number of elements to remove.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:Remove`(const`:`:Vector``&`):%- [@(0.0.255) void]_[* Remove]([@(0.0.255) c -onst]_[_^`:`:Vector^ Vector]`&_[*@3 sorted`_list])&] -[s2; Removes multiple elements from AIndex. Same as Remove(sorted`_list, -sorted`_list.GetCount()).&] -[s6; Invalidates iterators to AIndex.&] -[s6; Invalidates references to Index.&] -[s7; [*C@3 sorted`_list]-|Sorted Vector of positions to remove.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:RemoveKey`(const T`&`,unsigned`):%- [@(0.0.255) int]_[* RemoveKey]([@(0.0.255) c -onst]_[*@4 T]`&_[*@3 k], [@(0.0.255) unsigned]_[*@3 h])&] -[s2; Removes all elements with the specified value using a precomputed -hash`-value. The precomputed hash value must be the same as the -hash value that would be the result of HashFn. This is a slow -operation, especially when combined with any search operations.&] -[s7; [*C@3 k]-|Value of the elements to remove.&] -[s7; [*C@3 h]-|Precomputed hash value.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:RemoveKey`(const T`&`):%- [@(0.0.255) int]_[* RemoveKey]([@(0.0.255) con -st]_[*@4 T]`&_[*@3 k])&] -[s2; Removes all elements with the specified value. This is a slow -operation, especially when combined with any search operations.&] -[s7; [*C@3 k]-|Value of the elements to remove.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:Trim`(int`):%- [@(0.0.255) void]_[* Trim]([@(0.0.255) int]_[*@3 n])&] -[s2; Reduces the number of elements in AIndex to the specified number. -Requested number must be less than or equal to actual number -of elements in AIndex.&] -[s7; [*C@3 n]-|Requested number of elements.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:Drop`(int`):%- [@(0.0.255) void]_[* Drop]([@(0.0.255) int]_[*@3 n]_`=_[@3 1]) -&] -[s2; Drops the specified number of elements from the end of the AIndex -(same as Trim(GetCount() `- n)).&] -[s7; [*C@3 n]-|Number of elements.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:Top`(`)const:%- [@(0.0.255) const]_[*@4 T]`&_[* Top]()_[@(0.0.255) const]&] -[s2; Returns a reference to the last element in the AIndex.&] -[s7; [*/ Return value]-|Reference of thr last element in the AIndex.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:Reserve`(int`):%- [@(0.0.255) void]_[* Reserve]([@(0.0.255) int]_[*@3 n])&] -[s2; Reserves capacity. If the requested capacity is greater than -current capacity, capacity is increased to the requested value.&] -[s7; [*C@3 n]-|Requested capacity.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:Shrink`(`):%- [@(0.0.255) void]_[* Shrink]()&] -[s2; Minimizes the memory consumption of AIndex by decreasing the -capacity to the number of elements.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:GetAlloc`(`)const:%- [@(0.0.255) int]_[* GetAlloc]()_[@(0.0.255) const]&] -[s2; Returns the current capacity of AIndex.&] -[s7; [*/ Return value]-|Capacity of AIndex.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:Serialize`(`:`:Stream`&`):%- [@(0.0.255) void]_[* Serialize]([_^`:`:Stream^ S -tream]`&_[*@3 s])&] -[s2; Serializes content of AIndex to/from Stream. Works only if NTL -is used as part of UPP.&] -[s6; Requires T to have serialization operator defined.&] -[s7; [*C@3 s]-|Target/source stream.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:PickKeys`(`)pick`_:%- [*@4 V]_[* PickKeys]()_pick`_&] -[s2; Returns a basic random access container of elements. Destroys -AIndex by picking.&] -[s7; [*/ Return value]-|Basic random access container of elements in -AIndex.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:GetKeys`(`)const:%- [@(0.0.255) const]_[*@4 V]`&_[* GetKeys]()_[@(0.0.255) c -onst]&] -[s2; Returns a constant reference to basic random access container -of elements.&] -[s7; [*/ Return value]-|Constant reference to a basic random access -container of elements.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:operator`=`(pick`_ V`&`):%- [_^`:`:AIndex^ AIndex]`&_[* operator`=](pi -ck`__[*@4 V]`&_[*@3 s])&] -[s2; Assigns basic random access container to AIndex. Transfers the -source container in short constant time, but destroys it by picking.&] -[s7; [*C@3 s]-|Source container.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:operator`<`<`=`(const V`&`):%- [_^`:`:AIndex^ AIndex]`&_[* operator<<`= -]([@(0.0.255) const]_[*@4 V]`&_[*@3 s])&] -[s2; Assigns the basic random access container to AIndex, while preserving -the value of the source container.&] -[s6; Requires T to have deep copy constructor or optional deep copy.&] -[s7; [*C@3 s]-|Source container.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:AIndex`(pick`_ V`&`):%- [* AIndex](pick`__[*@4 V]`&_[*@3 s])&] -[s2; Pick`-constructs AIndex from a basic random access container. -Transfers the source container in short constant time, but destroys -it by picking.&] -[s7; [*C@3 s]-|Source basic random access container.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:AIndex`(const V`&`,int`):%- [* AIndex]([@(0.0.255) const]_[*@4 V]`&_[*@3 s -], [@(0.0.255) int])&] -[s2; Deep`-copy constructs AIndex from basic random access container.&] -[s6; Requires T to have deep copy constructor or optional deep copy -constructor.&] -[s7; [*C@3 s]-|Source AIndex.&] -[s5;K%- typedef_T_ValueType&] -[s2; Typedef of T for use in templated algorithms.&] -[s5;K%- typedef_typename_[^V`:`:ConstIterator^ V`::ConstIterator]_ConstIterator&] -[s2; Constant iterator type.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:Begin`(`)const:%- [_^`:`:AIndex`:`:ConstIterator^ ConstIterator]_[* Be -gin]()_[@(0.0.255) const]&] -[s2; Returns a constant iterator to the first element in AIndex.&] -[s7; [*/ Return value]-|Iterator.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:End`(`)const:%- [_^`:`:AIndex`:`:ConstIterator^ ConstIterator]_[* End]( -)_[@(0.0.255) const]&] -[s2; Returns a constant iterator to the position just beyond the -last element in AIndex.&] -[s7; [*/ Return value]-|Iterator.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:GetIter`(int`)const:%- [_^`:`:AIndex`:`:ConstIterator^ ConstIterator -]_[* GetIter]([@(0.0.255) int]_[*@3 pos])_[@(0.0.255) const]&] -[s2; Returns a constant iterator to the element at specified position. -Same as [* Begin() `+ i]. The benefit of this method is that [* pos] -is range checked in debug mode.&] -[s7; [*C@3 pos]-|Required position.&] -[s7; [*/ Return value]-|Iterator.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:AIndex`(`):%- [* AIndex]()&] -[s2; Constructor. Constructs an empty AIndex.&] -[s3;%- &] -[s4;%- &] -[s5;:`:`:AIndex`:`:AIndex`(const`:`:AIndex`&`,int`):%- [* AIndex]([@(0.0.255) const]_[* AIn -dex]`&_[*@3 s], [@(0.0.255) int])&] -[s2; Optional deep copy constructor.&] -[s6; Requires T to have deep copy constructor or optional deep copy -constructor.&] -[s7; [*C s]-|Source AIndex.&] -[s0; ] \ No newline at end of file diff --git a/uppdev/$.tpp/Test$en-us.tpp b/uppdev/$.tpp/Test$en-us.tpp deleted file mode 100644 index 44e29a922..000000000 --- a/uppdev/$.tpp/Test$en-us.tpp +++ /dev/null @@ -1,123 +0,0 @@ -topic "Heap implementation"; -[ $$0,0#00000000000000000000000000000000:Default] -[i448;a25;kKO9;2 $$1,0#37138531426314131252341829483370:item] -[{_}%EN-US -[s0;2%- &] -[ {{10000F(128)G(128)@1 [s0; [* Constructor Detail]]}}&] -[s0; &] -[s1;K:`:`:Size`_`:`:`:`:Size`_`(`):%- &] -[ {{10000F(128)G(128)@1 [s0; [* Public Field Detail]]}}&] -[s0; &] -[s1;K:`:`:Size`_`:`:cx:* &] -[ {{10000F(128)G(128)@1 [s0; [* Method Detail]]}}&] -[s0; &] -[s0; Heap implementation&] -[s0; U`+`+ heap is divided into 3 categories based on the block size -`- small, medium and big.&] -[s0; &] -[s0; Small blocks&] -[s0; Blocks <`= 256 bytes. Such blocks are 16 bytes rounded, so there -is 16 possible sizes there. According to our research, blocks -<`= 256 represent the majority of blocks used in C`+`+/U`+`+ -applications (>98% of all blocks).&] -[s0; &] -[s0; Small blocks are allocated in 4KB pages. U`+`+ always expects -to get any memory from the system 4KB aligned (this is provided -by platform specific SysAllocRaw and SysFreeRaw functions).&] -[s0; &] -[s0; Each 4KB pages is dedicated to single block size. Therefore -there is no need to store any per`-block information; instead -informations about the whole block is stored in the 32 bytes -header at the beginning of 4KB page. This header stores pointer -to the list of free blocks in the page, double`-link pointers -for the block so that it can be stored in allocator structures, -total number of blocks in the 4KB page and number of free blocks -in 4KB page.&] -[s0; &] -[s0; Allocator keeps the list of 4KB page is that are completely -used (no free blocks) in 16 element (one element per block size) -sFull array of lists, using double`-linked pointers. It stores -partially used pages in sWork 16 elements array of litst and -unused pages in sFree list.&] -[s0; &] -[s0; Allocator also uses per`-thread cache of small blocks. In this -cache, up to 32 blocks for each of 16 block sizes is cached (linked) -without being really deallocated (deallocation requires costly -serialization using critical section). If there is no block available -in the cache for allocation, 16 blocks are allocated and put -into the cache at once (means that serialization is only used -once per 16 allocations in the worst case). If block is deallocated -and there is already 32 blocks in the cache, 16 blocks from the -cache are deallocated within single serialization event (means -that serialization is only used once per 16 deallocations in -the worst case).&] -[s0; &] -[s0; Now the critical implementation detail is how, given the pointer -to the block in the Free, the header of 4KB page and that way -the size of block is decided. More specifically, how is small -block determined, because if we know we have small block, we -can look at the start of 4KB page. The trick is that larger than -256 bytes block are always placed at the address that ends with -8 in hex (is 8 bytes aligned and 16 bytes misaligned), while -small blocks are always 16 bytes aligned. That makes test simple -`- blocks whose address `& 8 is nonzero are >256, if `&8 is zero -we have small block and can look at the beginning of 4KB page -to get more info.&] -[s0; &] -[s0; If allocation/deallocation runs out of cache, the real work -has to be done:&] -[s0; &] -[s0; When allocating small block, first sWork list is checked for -the block. If no available, sFree list is checked to get free -block, if even that is empty, new block is obtained from the -system (using SysAllocRaw). Note that allocator keeps the number -of free blocks in the header. Implementation detail: there are -two possibilities how free blocks can be recorded in the block -header. First, there is a single`-linked list of free blocks. -Second, for blocks that are initially free (got from sFree or -system), portion of free blocks in the 4KB page is left out of -free list and managed by `'free`' member `- the offset of last -such free block in page. If this offset is >32, free block is -obtained using it (subtracting the block size). This is used -to avoid the need to link all free blocks in the page when getting -new free page.&] -[s0; &] -[s0; When freeing, number of free blocks in 4KB page is incremented. -If it is now 1, it means block has to be moved from sFull to -sWork. If it now equals the total number of blocks in page, 4KB -page moves to sFree.&] -[s0; &] -[s0; &] -[s0; Medium blocks &] -[s0; Blocks >256 and < 65504 bytes. Approximate best`-fit allocator -is used for these blocks. Memory is organized in 64KB chunks -(obtained using SysAllocRaw). Each allocated block has header -with its size and the size of previous block.&] -[s0; &] -[s0; Allocator keeps an array of lists of free blocks of particular -sizes. Size distribution is mostly exponential, blocks lower -than 2048 are rounded up to 32 bytes, between 2048 and about -35000, rounding exponentially grows up to 2048 and then stays -at this value. Each such size has its index in the array of free -blocks.&] -[s0; &] -[s0; When allocating, index is decided based on the size and array -is searched starting with that index to obtain the smallest free -block (best`-fit) greater than required size. Bigger blocks are -divided.&] -[s0; &] -[s0; When freeing, allocator merges the freed block with previous -or next free block if any.&] -[s0; &] -[s0; Note that master header of 64KB blocks and all operations are -designed so that resulting pointers are NOT 16 byte aligned (see -description of small blocks).&] -[s0; &] -[s0; &] -[s0; Big blocks&] -[s0; For blocks bigger than 65504 bytes, allocator simply uses SysAllocRaw -to directly obtain virtual memory. It stores information about -the block in the header at the beginning of block, also makeing -block 16`-bytes unaligned in the process. Free then returns virtual -memory back to the system.&] -[s0; ] \ No newline at end of file diff --git a/uppdev/$.tpp/Testtemplate$en-us.tpp b/uppdev/$.tpp/Testtemplate$en-us.tpp deleted file mode 100644 index 65920e1be..000000000 --- a/uppdev/$.tpp/Testtemplate$en-us.tpp +++ /dev/null @@ -1,4 +0,0 @@ -TITLE("This is test template!") -COMPRESSED -120,156,139,86,80,81,49,208,49,80,54,32,0,172,92,82,211,18,75,115,74,98,163,171,227,107,85,93,253,116,67,131,21,162,139,13,172,21,66,50,50,139,21,128,168,36,181,184,4,72,228,22,228,36,150,164,42,198,2,0,142,132,23,245, - diff --git a/uppdev/AAA/AAA.upp b/uppdev/AAA/AAA.upp deleted file mode 100644 index bb63da040..000000000 --- a/uppdev/AAA/AAA.upp +++ /dev/null @@ -1,12 +0,0 @@ -uses - CtrlLib; - -file - test.iml, - srcdoc.tpp, - Upscale.cpp, - main.cpp; - -mainconfig - "" = "GUI SSE2"; - diff --git a/uppdev/AAA/Upscale.cpp b/uppdev/AAA/Upscale.cpp deleted file mode 100644 index 222f87e16..000000000 --- a/uppdev/AAA/Upscale.cpp +++ /dev/null @@ -1,405 +0,0 @@ -#include - -using namespace Upp; - -int sqr(int x) -{ - return x * x; -} - -RGBA Blend(RGBA a, RGBA b) -{ - RGBA r; - r.a = ((int)a.a + b.a) >> 1; - r.r = ((int)a.r + b.r) >> 1; - r.g = ((int)a.g + b.g) >> 1; - r.b = ((int)a.b + b.b) >> 1; - return r; -} - -RGBA Get(const Image& img, int x, int y) -{ - return Rect(img.GetSize()).Contains(x, y) ? img[y][x] : White(); -} - -int SqrDistance(RGBA a, RGBA b) -{ - return sqr(77 * ((int)a.r - b.r)) + sqr(151 * ((int)a.g - b.g)) + sqr(28 * ((int)a.b - b.b)); -} - -bool IsSimilar(RGBA a, RGBA b, int max) -{ - return SqrDistance(a, b) <= sqr(max); -} - -int GetColorIndex(Vector& colors, Color c, int max_distance) -{ - for(int i = 0; i < colors.GetCount(); i++) - if(IsSimilar(colors[i], c, max_distance)) - return i; - colors.Add(c); - return colors.GetCount() - 1; -} - -struct Colors : Vector { - const Image& m; - int x, y; - - int DX(int r) { - r &= 7; - return findarg(r, 0, 7, 6) >= 0 ? -1 : findarg(r, 2, 3, 4) >= 0 ? 1 : 0; - } - - int DY(int r) { - r &= 7; - return findarg(r, 0, 1, 2) >= 0 ? -1 : findarg(r, 4, 5, 6) >= 0 ? 1 : 0; - } - - RGBA Get(int dx, int dy) { - return ::Get(m, x + dx, y + dy); - } - - RGBA Get(int r) { - return ::Get(m, x + DX(r), y + DY(r)); - } - - int GetCI(Color c) - { - return GetColorIndex(*this, c, 500); - } - - int GetCI(int r) { - return GetCI(Get(r)); - } - - int GetCI(int dx, int dy) { - return GetColorIndex(*this, Get(dx, dy), 500); - } - - Colors(const Image& m, int x, int y) : m(m), x(x), y(y) {} -}; - -Image Upscale(const Image& simg) -{ - Size isz = simg.GetSize(); - - Image lan = RescaleFilter(simg, 2 * isz, FILTER_BILINEAR); - - ImageBuffer ib(2 * isz); - - Fill(~ib, RGBAZero(), ib.GetLength()); - - for(int x = 0; x < isz.cx; x++) - for(int y = 0; y < isz.cy; y++) { - DLOG("---------- " << x << ", " << y); - RGBA c = simg[y][x]; - int p[16]; - // 0 1 2 - // 7 c 3 - // 6 5 4 - Colors colors(simg, x, y); - for(int i = 0; i < 8; i++) { - p[i] = p[i + 8] = colors.GetCI(i); - DLOG(i << ": " << p[i]); - } - int ci = colors.GetCI(c); - DDUMP(colors); - // 0 1 - // 3 2 - int *pp = p; -/* Index in; - in.FindAdd(p[1]); - in.FindAdd(p[3]); - in.FindAdd(p[5]); - in.FindAdd(p[7]); - DDUMP(in.GetCount()); */ - bool cq = (x ^ y) & 1; - - for(int r = 0; r < 4; r++) { - int ix = 2 * x + (r == 1 || r == 2); - int iy = 2 * y + (r >= 2); - RGBA& t = ib[iy][ix]; - t = c; - bool mrule = ci == pp[4] && ci == pp[3] && ci == pp[5] && ci != pp[0]; - if(pp[1] == pp[7] && pp[0] == pp[1] && - (!mrule || (Grayscale(colors.Get(2 * r + 0)) > Grayscale(c))) -// && pp[1] != pp[3] && pp[1] != pp[4] && pp[1] != pp[5] -// && !(pp[0] == pp[7] && pp[0] == pp[6] && pp[0] == pp[1] && pp[0] == pp[2]) // Box rule -// && ((cq/* && (r == 0 || r == 2)*/) || (pp[1] != pp[0])) - ) { - t = Blend(colors.Get(2 * r + 7), colors.Get(2 * r + 1)); - } - pp += 2; - } - } - - return ib; -} - -bool TryAA(int m, int d, RGBA a, RGBA b, RGBA c) -{ - DDUMP(m); - DDUMP(d); - DDUMP(abs(m * (c.r - a.r) / d + a.r - b.r)); - DDUMP(abs(m * (c.g - a.g) / d + a.g - b.g)); - DDUMP(abs(m * (c.b - a.b) / d + a.b - b.b)); - if(abs(m) > abs(d) || m * d < 0 || abs(m) < 10) - return false; - return (abs(m * (b.r - a.r) / d + a.r - b.r) < 4 && - abs(m * (c.g - a.g) / d + a.g - b.g) < 4 && - abs(m * (c.b - a.b) / d + a.b - b.b) < 4); -} - -int AADetected(RGBA a, RGBA b, RGBA c) -{ - DLOG("AADetect " << a << ", " << b << ", " << c); - - if(IsSimilar(a, c, 500) || IsSimilar(b, c, 500) || IsSimilar(a, b, 500)) - return false; - - return TryAA(b.g - a.g, c.g - a.g, a, b, c) || - TryAA(b.r - a.r, c.r - a.r, a, b, c) || - TryAA(b.g - a.g, c.g - a.g, a, b, c); -} - -Image UpscaleA(const Image& simg) -{ - Size isz = simg.GetSize(); - - ImageBuffer ib(2 * isz); - - Fill(~ib, RGBAZero(), ib.GetLength()); - - for(int x = 0; x < isz.cx; x++) - for(int y = 0; y < isz.cy; y++) { - DLOG("---------- " << x << ", " << y); - RGBA c = simg[y][x]; - int p[16]; - // 0 1 2 - // 7 c 3 - // 6 5 4 - Colors m(simg, x, y); - for(int i = 0; i < 8; i++) { - p[i] = p[i + 8] = m.GetCI(i); - DLOG(i << ": " << p[i]); - } - int ci = m.GetCI(c); - - RGBA t[4]; - t[0] = t[1] = t[2] = t[3] = c; - bool hl = p[0] == p[1] && p[1] == p[2] || - p[6] == p[5] && p[5] == p[4]; - bool vl = p[0] == p[7] && p[7] == p[6] || - p[2] == p[3] && p[3] == p[4]; - bool dia = !hl && !vl; - dia = true; - int horz = AADetected(m.Get(7), c, m.Get(3)) * 1; - int vert = AADetected(m.Get(1), c, m.Get(5)) * 1; - int dia1 = AADetected(m.Get(0), c, m.Get(4)) * 1 * dia; - int dia2 = AADetected(m.Get(2), c, m.Get(6)) * 1 * dia; - const int *pp = p; - if(horz || vert || dia1 || dia2) { - if(horz && !vert) - t[1] = t[3] = m.Get(3); - else - if(vert && !horz) - t[2] = t[3] = m.Get(5); - else - const int *pp = p; - for(int i = 0; i < 4; i++) { - if(pp[0] == pp[1] && pp[1] == pp[7]) - t[decode(i, 2, 3, 3, 2, i)] = m.Get(i * 2); - pp += 2; - } - } - - ib[2 * y + 0][2 * x + 0] = t[0]; - ib[2 * y + 0][2 * x + 1] = t[1]; - ib[2 * y + 1][2 * x + 0] = t[2]; - ib[2 * y + 1][2 * x + 1] = t[3]; - } - - return ib; -} - -Image UpscaleA2(const Image& simg) -{ - Size isz = simg.GetSize(); - - ImageBuffer ib(2 * isz); - - Fill(~ib, RGBAZero(), ib.GetLength()); - - for(int y = 0; y < isz.cy; y++) - for(int x = 0; x < isz.cx; x++) { - DLOG("---------- " << x << ", " << y); - RGBA c = simg[y][x]; - int p[16]; - // 0 1 2 - // 7 c 3 - // 6 5 4 - Colors m(simg, x, y); - for(int i = 0; i < 8; i++) { - p[i] = p[i + 8] = m.GetCI(i); - DLOG(i << ": " << p[i]); - } - int ci = m.GetCI(c); - - RGBA t[4]; - t[0] = t[1] = t[2] = t[3] = c; - bool h = AADetected(m.Get(7), c, m.Get(3)); - bool v = AADetected(m.Get(1), c, m.Get(5)); - if(h && v) { - const int *pp = p; - for(int i = 0; i < 4; i++) { - if(pp[0] == pp[1] && pp[1] == pp[7]) - t[decode(i, 2, 3, 3, 2, i)] = m.Get(i * 2); - pp += 2; - } - } - else - if(h) - t[1] = t[3] = m.Get(3); - else - if(v) - t[2] = t[3] = m.Get(5); - - ib[2 * y + 0][2 * x + 0] = t[0]; - ib[2 * y + 0][2 * x + 1] = t[1]; - ib[2 * y + 1][2 * x + 0] = t[2]; - ib[2 * y + 1][2 * x + 1] = t[3]; - } - - return ib; -} -/* int best = max(horz, vert, dia1, dia2); - if(best == horz) t[1] = t[3] = m.Get(3); - else - if(best == vert) t[2] = t[3] = m.Get(5); - else - if(best == dia1) t[3] = m.Get(4); - else - if(best == dia2) t[2] = m.Get(6);*/ - -static inline int GetResult(uint32 A, uint32 B, uint32 C, uint32 D) -{ - int x = 0; - int y = 0; - int r = 0; - if (A == C) x++; else if (B == C) y++; - if (A == D) x++; else if (B == D) y++; - if (x <= 1) r++; - if (y <= 1) r--; - return r; -} - -RGBA Blend(RGBA a, RGBA b, RGBA c, RGBA d) -{ - return Blend(Blend(a, b), Blend(c, d)); -} - -Image Upscale2(const Image& simg) // Super SAI -{ - Size isz = simg.GetSize(); - - ImageBuffer ib(2 * isz); - - Fill(~ib, RGBAZero(), ib.GetLength()); - - for(int x = 0; x < isz.cx; x++) - for(int y = 0; y < isz.cy; y++) { - DLOG("---------- " << x << ", " << y); - - Colors m(simg, x, y); - - int colorB0 = m.GetCI(-1, -1); - int colorB1 = m.GetCI(0, -1); - int colorB2 = m.GetCI(1, -1); - int colorB3 = m.GetCI(2, -1); - - int color4 = m.GetCI(-1, 0); - int color5 = m.GetCI(0, 0); - int color6 = m.GetCI(1, 0); - int colorS2 = m.GetCI(2, 0); - - int color1 = m.GetCI(-1, 1); - int color2 = m.GetCI(0, 1); - int color3 = m.GetCI(1, 1); - int colorS1 = m.GetCI(2, 1); - - int colorA0 = m.GetCI(-1, 2); - int colorA1 = m.GetCI(0, 2); - int colorA2 = m.GetCI(1, 2); - int colorA3 = m.GetCI(2, 2); - - RGBA product1a, product1b, product2a, product2b; - - RGBA c2 = m.Get(0, 1); - RGBA c3 = m.Get(1, 1); - RGBA c5 = m.Get(0, 0); - RGBA c6 = m.Get(1, 0); - - if(color2 == color6 && color5 != color3) - product2b = product1b = c2; - else - if(color5 == color3 && color2 != color6) - product2b = product1b = c5; - else - if(color5 == color3 && color2 == color6) { - int r = 0; - - r += GetResult (color6, color5, color1, colorA1); - r += GetResult (color6, color5, color4, colorB1); - r += GetResult (color6, color5, colorA2, colorS1); - r += GetResult (color6, color5, colorB2, colorS2); - - if(r > 0) - product2b = product1b = c6; - else - if(r < 0) - product2b = product1b = c5; - else - product2b = product1b = Blend(c5, c6); - } - else { - if(color6 == color3 && color3 == colorA1 && color2 != colorA2 && color3 != colorA0) - product2b = Blend(c3, c3, c3, c2); - else - if(color5 == color2 && color2 == colorA2 && colorA1 != color3 && color2 != colorA3) - product2b = Blend(c2, c2, c2, c3); - else - product2b = Blend(c2, c3); - - if(color6 == color3 && color6 == colorB1 && color5 != colorB2 && color6 != colorB0) - product1b = Blend(c6, c6, c6, c5); - else - if(color5 == color2 && color5 == colorB2 && colorB1 != color6 && color5 != colorB3) - product1b = Blend(c6, c5, c5, c5); - else - product1b = Blend(c5, c6); - } - - if (color5 == color3 && color2 != color6 && color4 == color5 && color5 != colorA2) - product2a = Blend(c2, c5); - else - if (color5 == color1 && color6 == color5 && color4 != color2 && color5 != colorA0) - product2a = Blend(c2, c5); - else - product2a = c2; - - if (color2 == color6 && color5 != color3 && color1 == color2 && color2 != colorB2) - product1a = Blend(c2, c5); - else - if (color4 == color2 && color3 == color2 && color1 != color5 && color2 != colorB0) - product1a = Blend(c2, c5); - else - product1a = c5; - - ib[2 * y][2 * x] = product1a; - ib[2 * y][2 * x + 1] = product1b; - ib[2 * y + 1][2 * x] = product2a; - ib[2 * y + 1][2 * x + 1] = product2b; - } - - return ib; -} diff --git a/uppdev/AAA/init b/uppdev/AAA/init deleted file mode 100644 index f9cb5a8fd..000000000 --- a/uppdev/AAA/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _AAA_icpp_init_stub -#define _AAA_icpp_init_stub -#include "CtrlLib/init" -#endif diff --git a/uppdev/AAA/main.cpp b/uppdev/AAA/main.cpp deleted file mode 100644 index 15cffb549..000000000 --- a/uppdev/AAA/main.cpp +++ /dev/null @@ -1,85 +0,0 @@ -#include - -using namespace Upp; - -#define IMAGECLASS TestImg -#define IMAGEFILE -#include - -#define IMAGECLASS TestImg -#define IMAGEFILE -#include -Image Upscale(const Image& simg); -Image Upscale2(const Image& simg); -Image UpscaleA(const Image& simg); -Image UpscaleA2(const Image& simg); - -struct Test : TopWindow { - virtual void Paint(Draw& w); - - EditIntSpin passes, amount; - - void DoRefresh() { Refresh(); } - - void PutImage(Draw& w, int& y, const Image& m) - { - w.DrawImage(20, y, m); - y += m.GetSize().cy + 10; - } - - typedef Test CLASSNAME; - - Test(); -}; - -void Test::Paint(Draw& w) -{ - w.DrawRect(GetSize(), SColorFace()); - Image simg = TestImg::test2(); - int y = 10; - PutImage(w, y, simg); - - Size isz = simg.GetSize(); - w.DrawImage(10, 150 + 12 * isz.cy, Magnify(simg, 8, 8)); - - simg = Unmultiply(simg); - - - Image r = Upscale(simg); - w.DrawImage(10, 100, r); - - w.DrawImage(10, 150 + 2 * isz.cy, Magnify(r, 4, 4)); - -#if 0 - for(int i = FILTER_NEAREST; i <= FILTER_LANCZOS5; i++) { - Image img = RescaleFilter(simg, 2 * simg.GetSize(), i); - w.DrawImage(10, y, img); - img = Unmultiply(img); - for(int j = 0; j < (int)~passes; j++) - img = Sharpen(img, ~amount); - w.DrawImage(300, y, Premultiply(img)); - w.DrawText(600, y + 10, AsString(i)); - - y += img.GetSize().cy + 20; - } -#endif -} - -Test::Test() -{ - amount <<= 50; - passes <<= 2; - Add(amount.BottomPos(2, 20).LeftPos(2, 50)); - Add(passes.BottomPos(2, 20).LeftPos(60, 50)); - -// amount <<= THISBACK(Amount); -// passes <<= THISBACK(Passes); - Zoomable().Sizeable(); -} - -using namespace std; - -GUI_APP_MAIN -{ - Test().Run(); -} diff --git a/uppdev/AAA/srcdoc.tpp/hh$en-us.tpp b/uppdev/AAA/srcdoc.tpp/hh$en-us.tpp deleted file mode 100644 index 8552cb3e1..000000000 --- a/uppdev/AAA/srcdoc.tpp/hh$en-us.tpp +++ /dev/null @@ -1,29 +0,0 @@ -topic "TheIDE"; -[ $$0,0#00000000000000000000000000000000:Default] -[{_}%EN-US -[s0; Ahoj Jášo,&] -[s0; &] -[s0; Posílám pozdravy ze Suchdola.&] -[s0; &] -[s0; Moc jsi nás pobavil že si necháváš dopisy psát za sebe. -Papírové (nebo Papyrové ?) zlaťáky vypadají dobře, díky -za ukázku.&] -[s0; &] -[s0; Doma se máme dobře. Maminka s Ellou byly většinu času na -chatě, já pořád dokola (a na kole) jezdím do práce a programuje.&] -[s0; &] -[s0; Maminka Elle sehnala (koupila od Aniny) domeček na zahradu, -tak ho dneska budeme asi stavět. Snad se jí to bude líbit.&] -[s0; &] -[s0; K narozeninám jsem ti definitivně koupil Arduino `- a sám -sobě jsem hned koupil takovou jednodušší víc hard`-core -verzi. Už se těším až to přijde, vypadá to jak dost šikovná -věcička. Ten tvůj nápad na zařízení které zahraje zvuk -když někdo vejde se s tím úplně přesně dá udělat.&] -[s0; &] -[s0; Přeju příjemnou poslední třetinu tábora, uvidíme se cca -za týden.&] -[s0; &] -[s0; Ahoj,&] -[s0; &] -[s0; Táta]] \ No newline at end of file diff --git a/uppdev/AAA/srcdoc.tpp/hhh$en-us.tpp b/uppdev/AAA/srcdoc.tpp/hhh$en-us.tpp deleted file mode 100644 index 31cd2f41c..000000000 --- a/uppdev/AAA/srcdoc.tpp/hhh$en-us.tpp +++ /dev/null @@ -1,29 +0,0 @@ -topic "Ahoj Klárko,"; -[ $$0,0#00000000000000000000000000000000:Default] -[{_}%EN-US -[s0; Ahoj Klárko,&] -[s0; &] -[s0; &] -[s0; Posílám pozdravy ze Suchdola.&] -[s0; &] -[s0; Doma se máme dobře. Maminka s Ellou byly většinu času na -chatě, já pořád dokola (a na kole) jezdím do práce a programuju. -Trochu ješte také uklízíme sklep. Snad už zase budu mít -dílnu...&] -[s0; &] -[s0; Maminka Elle sehnala (koupila od Aniny) domeček na zahradu, -tak ho dneska budeme asi stavět. Snad se jí to bude líbit.&] -[s0; &] -[s0; Elle v poslední době zažila několik večerních akcí `- -s maminkou byla na večirku u Aniny a včera byla s námi v hospodě. -Začalo se jí to líbit chodit spát v devět večer...&] -[s0; &] -[s0; Rybu jsem poctivě krmil, vypadá fit.&] -[s0; &] -[s0; Přeju příjemnou poslední třetinu tábora, uvidíme se cca -za týden.&] -[s0; &] -[s0; &] -[s0; Ahoj,&] -[s0; &] -[s0; Táta]] \ No newline at end of file diff --git a/uppdev/AAA/test.iml b/uppdev/AAA/test.iml deleted file mode 100644 index 24f6a77a1..000000000 --- a/uppdev/AAA/test.iml +++ /dev/null @@ -1,452 +0,0 @@ -PREMULTIPLIED -IMAGE_ID(test) -IMAGE_ID(test1) -IMAGE_ID(t) -IMAGE_ID(test3) -IMAGE_ID(test2) - -IMAGE_BEGIN_DATA -IMAGE_DATA(120,156,237,157,9,84,20,87,22,134,27,212,49,57,232,57,153,100,36,78,22,199,153,152,196,144,68,147,81,140,30,53) -IMAGE_DATA(81,81,92,136,38,140,98,196,40,110,113,67,209,16,137,130,168,20,42,202,166,128,162,2,34,130,40,72,43,173,70,84) -IMAGE_DATA(80,217,26,68,16,100,223,87,217,65,246,29,90,224,159,122,21,219,211,52,221,77,3,182,168,169,255,156,123,124,85,117) -IMAGE_DATA(235,213,19,222,119,239,125,175,23,56,28,165,209,28,5,73,121,250,151,28,234,188,9,39,193,217,144,243,128,62,30,42) -IMAGE_DATA(238,160,164,196,121,151,92,63,245,43,39,106,200,96,206,167,253,121,216,112,14,71,135,226,112,32,203,136,79,127,158,49) -IMAGE_DATA(97,194,6,244,214,250,243,60,86,172,94,81,13,209,156,192,177,14,243,152,87,36,168,12,70,148,207,247,229,59,55,125) -IMAGE_DATA(25,62,83,255,72,200,58,143,180,42,98,164,189,99,195,56,126,220,85,221,202,36,127,253,42,199,173,156,168,65,202,156) -IMAGE_DATA(15,123,243,16,81,230,185,180,149,211,6,41,86,254,212,135,234,71,44,32,60,167,166,166,50,150,158,158,142,204,204,76) -IMAGE_DATA(198,114,115,115,145,159,159,143,194,194,194,103,86,94,94,222,43,254,33,69,189,29,35,43,86,3,45,245,79,56,166,124) -IMAGE_DATA(143,5,197,109,101,55,16,203,91,82,227,239,50,177,193,50,188,18,142,209,229,56,19,95,202,24,105,31,229,231,34,216) -IMAGE_DATA(117,92,83,14,127,103,83,12,111,245,227,147,91,56,15,233,219,135,200,243,12,194,111,79,204,247,20,11,122,27,3,228) -IMAGE_DATA(225,159,112,95,90,90,218,39,254,57,34,97,64,216,238,205,248,88,177,234,143,168,75,143,33,201,246,248,148,97,215,249) -IMAGE_DATA(18,252,234,94,128,45,167,11,176,246,84,62,116,237,115,240,63,155,12,204,183,72,199,183,84,42,212,119,37,62,155,171) -IMAGE_DATA(52,255,123,227,253,244,171,162,185,75,106,130,220,38,63,57,118,191,0,62,9,37,240,226,63,194,73,94,10,142,93,74) -IMAGE_DATA(129,123,96,46,188,226,138,224,22,26,140,36,222,156,142,218,28,175,118,239,125,31,100,12,25,36,123,29,32,204,249,132) -IMAGE_DATA(223,228,62,176,47,180,100,145,122,64,222,56,64,120,38,220,11,217,207,206,206,238,150,251,9,251,44,255,172,94,69,17) -IMAGE_DATA(214,111,197,55,136,88,61,174,199,214,225,106,116,45,46,71,213,224,98,68,53,60,249,85,112,11,169,128,243,157,199,112) -IMAGE_DATA(188,85,6,59,191,18,88,93,45,194,71,219,30,62,155,171,195,222,224,76,63,189,253,111,25,55,236,212,154,172,131,115) -IMAGE_DATA(225,29,85,0,94,112,30,178,11,235,80,89,215,128,138,186,70,100,20,212,193,243,118,54,220,194,242,224,115,205,22,247) -IMAGE_DATA(92,39,182,218,252,242,70,172,44,254,251,147,243,159,71,45,64,120,22,230,124,33,251,162,53,191,40,251,21,21,21,44) -IMAGE_DATA(255,172,94,41,9,249,247,137,168,129,87,120,13,206,241,171,225,22,92,9,167,187,21,56,238,79,215,235,126,101,176,188) -IMAGE_DATA(90,2,243,203,133,48,245,46,128,145,231,35,108,115,203,5,197,45,192,123,107,163,186,204,213,255,140,83,183,217,229,155) -IMAGE_DATA(4,151,240,60,112,233,92,79,84,93,91,139,204,226,82,180,208,109,98,13,157,128,147,95,54,78,134,100,97,31,151,143) -IMAGE_DATA(15,62,87,183,144,57,190,231,204,190,104,12,32,125,247,244,243,33,60,19,238,9,223,196,164,177,79,172,150,254,191,202) -IMAGE_DATA(226,95,156,109,121,248,103,227,1,43,69,138,240,127,35,174,30,213,141,237,56,75,115,95,213,240,4,141,173,29,104,108) -IMAGE_DATA(233,64,67,75,59,162,178,26,233,24,80,138,204,146,22,28,240,45,68,106,81,51,189,22,200,194,78,207,60,140,212,13) -IMAGE_DATA(239,50,55,39,44,53,10,249,253,114,18,156,110,101,32,149,206,251,77,79,58,209,208,212,132,19,110,103,81,78,179,81) -IMAGE_DATA(223,218,10,223,128,32,240,51,107,113,152,155,8,226,75,238,145,54,54,97,238,127,222,236,11,141,244,109,166,163,131,225) -IMAGE_DATA(195,135,75,173,3,8,207,36,231,139,179,47,92,247,139,154,44,254,37,237,237,201,203,63,27,3,88,41,74,38,222,37) -IMAGE_DATA(76,173,223,68,51,239,116,251,49,195,190,237,245,82,230,152,226,22,162,184,186,13,126,15,171,153,227,163,215,139,209,220) -IMAGE_DATA(214,129,159,236,210,97,224,150,3,213,69,33,93,230,229,60,83,239,42,67,175,88,88,93,72,64,121,179,0,213,244,61) -IMAGE_DATA(109,244,220,53,161,204,113,158,119,13,187,204,204,113,59,34,10,73,181,2,252,118,50,10,196,151,220,35,105,92,66,246) -IMAGE_DATA(37,174,247,105,102,193,229,254,249,111,79,156,203,240,37,125,59,142,24,193,196,0,105,63,31,194,179,248,62,191,104,206) -IMAGE_DATA(39,53,63,225,190,190,190,158,49,73,252,247,144,219,229,201,255,108,12,96,165,16,109,115,47,192,197,251,213,104,239,160) -IMAGE_DATA(115,53,157,243,91,5,157,76,173,223,72,231,126,82,235,23,86,182,161,162,94,192,196,133,67,188,66,60,174,19,96,161) -IMAGE_DATA(85,10,54,56,103,98,132,70,96,151,57,57,203,200,173,106,131,107,20,168,179,113,40,104,16,208,49,160,3,133,181,245) -IMAGE_DATA(56,104,123,132,97,159,31,151,136,138,39,64,76,165,0,6,246,247,65,124,201,61,146,198,69,73,171,251,133,60,19,245) -IMAGE_DATA(20,3,228,240,237,105,29,64,120,150,197,62,49,194,125,99,99,35,99,226,252,11,249,229,136,112,46,42,142,4,254,37) -IMAGE_DATA(249,112,216,24,192,74,1,34,251,250,30,161,149,76,173,127,208,183,24,245,205,237,216,117,62,159,57,222,124,58,7,143) -IMAGE_DATA(42,90,17,148,84,139,216,220,6,152,249,60,162,235,120,1,102,31,72,132,158,99,6,222,153,118,171,203,124,28,171,185) -IMAGE_DATA(38,100,153,93,48,204,61,31,34,52,171,22,244,146,1,133,116,236,184,25,114,15,185,85,117,40,107,7,242,154,128,43) -IMAGE_DATA(201,53,248,205,57,18,196,151,220,35,105,92,148,52,166,133,60,11,37,45,6,136,178,47,234,43,161,79,242,44,138,162) -IMAGE_DATA(36,174,3,132,252,23,23,23,119,217,231,19,103,191,185,185,153,49,81,254,69,217,149,101,226,156,247,228,219,175,95,56) -IMAGE_DATA(43,86,34,90,124,52,139,217,215,39,220,155,120,229,163,174,169,29,91,206,228,48,199,122,142,153,200,45,111,129,182,109) -IMAGE_DATA(42,110,39,212,208,113,33,23,45,130,14,228,148,181,64,215,46,13,111,171,223,236,50,23,223,250,112,44,181,128,186,138) -IMAGE_DATA(237,167,35,96,201,205,64,69,39,80,45,0,234,59,104,163,219,53,52,255,21,116,123,183,103,6,182,58,243,65,124,201) -IMAGE_DATA(61,226,99,146,185,238,151,198,181,104,12,144,199,71,124,31,64,95,31,102,102,102,221,216,34,60,139,239,243,137,214,252) -IMAGE_DATA(66,246,91,91,91,25,99,243,63,171,87,73,26,7,83,97,127,163,244,217,190,254,70,151,108,172,62,145,133,229,14,25) -IMAGE_DATA(88,124,36,141,169,245,231,89,36,65,195,60,17,223,238,139,199,20,211,56,168,155,196,98,201,145,20,188,61,193,175,203) -IMAGE_DATA(124,84,30,252,183,137,99,191,223,148,162,185,247,58,12,105,190,173,184,233,136,203,171,65,67,179,0,13,77,2,36,208) -IMAGE_DATA(109,11,239,52,108,117,12,2,241,33,190,228,30,241,49,81,210,106,255,158,248,86,83,251,211,122,193,190,112,13,96,70) -IMAGE_DATA(223,71,106,0,241,177,136,243,79,216,175,174,174,150,155,127,34,81,182,165,157,151,199,167,79,191,96,86,172,100,136,188) -IMAGE_DATA(135,231,240,149,34,152,95,42,132,233,197,124,102,95,223,208,35,23,6,103,178,177,201,57,11,235,78,101,50,181,254,207) -IMAGE_DATA(14,105,248,137,206,249,132,251,197,182,127,154,56,255,68,111,188,165,186,113,245,158,19,77,179,141,175,64,207,246,14,12) -IMAGE_DATA(143,243,97,228,16,14,67,187,48,108,181,15,198,74,107,127,232,30,242,195,138,221,199,155,136,175,164,49,81,61,237,233) -IMAGE_DATA(73,139,1,146,36,231,62,33,37,101,13,240,188,222,255,47,194,120,151,115,28,57,248,103,217,103,165,40,145,247,240,188) -IMAGE_DATA(191,62,10,239,173,142,196,72,221,8,188,187,152,207,236,235,143,152,27,136,17,51,239,224,31,223,6,224,157,41,183,152) -IMAGE_DATA(90,159,240,46,110,226,253,13,27,54,108,102,82,82,18,110,5,220,109,159,186,197,21,234,91,189,240,205,118,30,99,164) -IMAGE_DATA(189,96,167,7,66,249,97,157,97,225,225,157,42,42,42,223,74,26,19,37,15,255,242,196,0,121,95,35,120,202,63,169) -IMAGE_DATA(255,37,173,1,158,151,250,145,255,89,177,122,233,165,164,164,52,226,220,185,115,13,89,89,89,112,118,113,169,82,81,253) -IMAGE_DATA(151,249,200,175,231,132,124,172,181,185,138,24,105,171,168,142,162,206,186,187,215,103,100,100,128,199,227,61,25,52,104,208) -IMAGE_DATA(71,226,253,80,242,242,79,140,212,251,210,68,174,201,217,15,245,2,248,23,151,60,252,179,98,245,10,105,152,145,145,81) -IMAGE_DATA(186,139,139,75,219,224,193,131,63,151,230,164,172,172,60,218,206,206,174,118,255,254,253,197,116,204,24,41,126,157,98,249) -IMAGE_DATA(103,197,106,32,164,178,240,208,156,202,129,30,4,245,154,214,255,226,98,249,103,245,50,105,149,151,78,219,150,219,171,58) -IMAGE_DATA(251,122,255,37,51,221,162,100,87,3,36,186,232,35,238,212,6,196,56,174,65,164,253,10,132,219,46,69,136,165,54,238) -IMAGE_DATA(30,212,194,45,179,57,208,155,49,58,64,86,63,212,0,237,255,245,129,255,126,177,42,109,200,34,46,111,250,219,205,122) -IMAGE_DATA(28,97,183,168,35,210,126,17,220,119,125,148,167,172,196,249,103,127,158,201,138,149,36,45,119,213,110,182,121,72,225,112) -IMAGE_DATA(212,30,108,242,95,137,181,215,150,97,133,207,98,44,245,88,136,31,156,231,98,190,195,76,204,178,156,138,169,148,58,212) -IMAGE_DATA(141,199,99,252,175,106,221,230,62,97,255,113,218,77,148,167,94,71,89,210,53,148,38,248,162,56,142,139,162,24,47,20) -IMAGE_DATA(70,121,32,63,226,12,30,133,57,131,183,243,27,153,220,80,156,129,121,253,175,151,252,67,196,20,162,140,139,63,34,253) -IMAGE_DATA(130,62,90,242,163,208,90,24,141,7,39,102,97,249,52,85,158,162,158,199,234,175,41,29,199,133,13,214,49,102,184,148) -IMAGE_DATA(126,14,222,169,110,240,76,118,193,217,196,147,112,137,59,142,19,49,71,97,255,192,10,54,247,45,112,248,158,57,246,243) -IMAGE_DATA(247,98,95,136,49,62,219,252,113,183,121,31,239,180,9,101,41,127,208,156,59,209,156,59,34,55,216,14,217,119,173,145) -IMAGE_DATA(233,111,129,116,63,51,164,94,53,65,78,208,49,204,61,16,138,57,84,16,102,237,185,131,233,70,127,180,191,249,247,15) -IMAGE_DATA(54,136,246,51,144,239,255,145,147,127,133,179,95,116,123,60,26,147,189,209,154,127,15,109,133,49,140,181,100,5,226,158) -IMAGE_DATA(237,194,14,69,61,147,213,95,83,63,218,206,173,59,20,105,138,11,41,174,240,72,114,194,153,120,71,56,197,218,227,120) -IMAGE_DATA(180,13,142,70,29,134,85,196,126,28,12,219,7,42,116,55,246,4,237,132,113,224,111,24,179,238,223,221,230,126,140,227) -IMAGE_DATA(218,158,235,113,90,179,247,5,130,159,86,131,224,148,106,120,134,20,96,220,202,147,221,62,3,64,73,227,95,65,239,255) -IMAGE_DATA(21,178,47,7,255,47,132,253,214,170,48,180,22,92,68,14,111,43,26,227,46,48,70,248,15,180,90,216,162,168,231,178) -IMAGE_DATA(250,235,234,135,163,115,155,76,131,12,177,215,223,8,139,29,22,116,74,171,249,73,222,39,236,143,214,251,176,219,252,39) -IMAGE_DATA(107,253,61,126,57,88,226,18,15,109,199,88,44,60,26,141,5,150,145,208,52,191,7,13,211,48,124,247,123,8,54,218) -IMAGE_DATA(69,99,134,73,0,238,38,85,163,180,30,168,109,6,254,187,145,219,173,47,74,218,26,64,1,159,255,17,173,253,101,125) -IMAGE_DATA(22,152,243,2,217,111,111,188,142,166,140,77,104,136,219,142,248,51,186,200,185,180,3,81,14,63,176,123,131,172,20,38) -IMAGE_DATA(45,107,141,182,85,23,117,58,245,3,244,250,180,7,24,102,163,195,172,243,51,110,238,71,218,31,123,144,194,219,133,68) -IMAGE_DATA(174,33,226,189,182,32,246,220,122,196,184,173,70,234,53,51,76,221,225,135,7,217,53,136,204,172,70,13,205,255,151,107) -IMAGE_DATA(46,116,155,215,47,250,243,191,47,67,237,223,133,253,236,213,104,76,157,13,65,245,81,148,248,173,68,134,221,84,150,125) -IMAGE_DATA(86,10,213,210,147,139,250,181,7,24,116,104,17,242,195,79,51,235,252,164,203,59,144,112,113,27,226,206,111,194,67,247) -IMAGE_DATA(117,136,118,93,137,7,206,203,144,236,187,27,147,12,174,224,94,122,21,78,223,205,71,112,114,5,198,254,236,46,113,110) -IMAGE_DATA(191,144,239,255,16,89,247,15,228,222,31,203,62,171,129,148,246,145,249,253,222,3,244,167,52,145,27,114,2,217,129,246) -IMAGE_DATA(200,188,109,139,196,107,7,113,225,152,49,172,45,45,224,230,230,134,67,251,247,32,208,117,7,190,217,120,30,22,150,54) -IMAGE_DATA(204,57,43,107,91,204,94,101,65,250,81,145,52,46,170,167,215,2,250,104,226,117,191,180,207,255,202,144,180,24,208,107) -IMAGE_DATA(86,131,237,63,101,217,103,53,160,210,58,168,209,239,61,192,165,179,191,130,142,198,56,44,158,249,5,180,103,168,97,145) -IMAGE_DATA(230,84,56,56,56,160,172,172,12,57,57,57,8,13,13,197,110,227,223,177,105,171,33,146,83,82,152,115,225,225,225,140) -IMAGE_DATA(143,170,170,170,181,164,113,41,234,251,63,197,235,254,94,178,47,148,36,54,123,85,23,4,88,125,130,250,146,32,150,125) -IMAGE_DATA(86,3,46,45,203,217,204,30,224,1,154,241,95,184,63,75,173,249,101,237,1,142,26,53,42,151,243,148,1,3,3,131) -IMAGE_DATA(206,216,164,36,232,234,234,98,254,252,249,157,235,215,175,199,177,99,199,96,98,98,2,210,214,210,210,98,174,145,24,64) -IMAGE_DATA(31,215,74,27,215,243,254,254,111,38,239,139,176,255,156,223,243,39,215,218,64,89,137,51,154,176,159,31,125,21,145,62) -IMAGE_DATA(27,89,246,89,189,20,154,127,104,102,219,143,78,115,59,149,7,43,173,235,203,253,202,202,202,211,70,142,28,25,49,102) -IMAGE_DATA(204,152,124,83,83,83,1,225,159,62,14,153,50,101,74,83,96,96,32,98,99,99,193,231,243,225,235,235,139,105,211,166) -IMAGE_DATA(181,147,107,132,127,58,38,244,248,186,22,97,150,228,237,190,254,253,15,38,231,139,173,247,251,80,247,247,36,112,228,136) -IMAGE_DATA(1,199,13,70,161,62,63,18,130,210,4,220,216,59,17,97,206,95,35,59,220,0,113,174,11,112,255,192,68,150,125,86) -IMAGE_DATA(3,37,149,241,43,212,42,250,219,201,208,161,67,55,47,95,190,188,134,240,175,166,166,22,48,125,250,116,129,166,166,38) -IMAGE_DATA(180,181,181,25,35,109,114,142,92,35,252,19,223,158,250,36,156,146,24,64,113,122,255,247,191,36,229,252,126,212,253,178) -IMAGE_DATA(36,87,254,39,252,183,21,70,163,146,187,6,101,78,51,192,223,56,2,220,213,170,240,219,249,5,203,62,171,215,65,159) -IMAGE_DATA(77,154,52,41,141,174,1,106,232,154,191,138,199,227,225,212,169,83,48,52,52,132,177,177,49,211,38,231,200,53,226,67) -IMAGE_DATA(124,123,211,57,201,219,76,46,39,223,219,195,145,252,183,63,25,230,197,242,189,130,114,190,168,228,90,255,235,206,122,27) -IMAGE_DATA(201,174,43,209,20,231,133,202,56,31,132,218,204,99,217,103,245,58,105,16,189,22,248,106,242,228,201,121,116,110,111,92) -IMAGE_DATA(183,110,93,11,189,198,111,83,81,81,209,27,50,100,136,198,170,85,171,234,201,57,114,141,248,16,223,222,116,206,212,2) -IMAGE_DATA(79,89,102,98,129,24,227,178,76,129,236,19,201,197,240,178,25,239,64,111,214,8,184,110,254,152,225,94,231,187,247,125) -IMAGE_DATA(21,56,38,86,172,94,91,9,99,193,0,50,207,138,213,43,169,255,3,147,97,245,231,0,0,0,0,0,0,0,0,0) -IMAGE_END_DATA(3520, 1) - -IMAGE_BEGIN_DATA -IMAGE_DATA(120,156,237,157,121,84,20,215,158,199,59,231,205,204,63,115,78,206,59,201,152,121,39,115,230,205,228,36,153,121,47,227) -IMAGE_DATA(76,50,73,156,140,33,209,68,140,70,141,123,22,121,198,184,197,29,141,184,43,91,35,34,171,160,2,178,131,138,32,130) -IMAGE_DATA(224,74,92,144,29,68,4,105,101,7,1,5,148,69,16,145,69,1,225,126,167,126,133,229,180,77,85,119,53,221,8,230) -IMAGE_DATA(245,247,156,223,161,168,186,117,107,161,62,247,247,251,221,123,171,80,40,94,249,147,66,16,76,50,201,36,147,140,160,190) -IMAGE_DATA(190,62,4,121,219,178,211,94,163,217,113,143,143,88,87,87,215,128,50,13,13,13,160,237,49,30,31,179,210,210,82,131) -IMAGE_DATA(142,23,23,29,13,37,215,132,105,51,42,99,136,62,250,104,185,222,102,210,208,201,210,210,146,145,219,50,134,101,102,102) -IMAGE_DATA(242,102,140,186,2,2,2,180,158,183,182,227,208,54,65,111,189,245,22,27,202,235,29,42,245,244,244,32,192,115,35,203) -IMAGE_DATA(58,102,193,122,154,147,145,19,103,193,188,93,231,179,117,30,71,153,101,68,9,111,180,188,223,229,39,118,253,204,82,86) -IMAGE_DATA(152,176,129,69,185,126,204,106,106,106,244,58,142,58,243,209,156,53,82,8,35,97,141,79,203,24,210,22,16,207,197,197) -IMAGE_DATA(197,188,81,123,85,94,94,206,91,85,85,21,170,171,171,81,91,91,251,204,26,27,27,127,211,252,235,251,188,137,41,234) -IMAGE_DATA(228,69,88,238,137,99,211,221,46,179,153,30,87,48,203,45,149,205,114,77,99,83,157,211,153,237,190,227,76,116,39,53) -IMAGE_DATA(169,243,160,201,220,164,73,147,6,176,162,89,134,248,146,226,65,108,127,169,235,208,228,89,27,255,194,49,53,217,214,60) -IMAGE_DATA(31,177,50,67,121,189,198,84,200,129,93,184,28,245,23,214,221,16,15,213,169,31,217,133,96,51,230,146,209,12,159,156) -IMAGE_DATA(70,132,92,175,231,141,150,61,211,170,144,28,242,49,171,72,219,206,242,78,175,97,81,187,63,96,212,118,200,17,241,171) -IMAGE_DATA(139,121,93,109,129,190,109,128,28,254,137,251,250,250,250,65,241,175,254,124,25,35,29,147,251,252,106,219,87,219,118,125) -IMAGE_DATA(234,18,211,148,93,41,172,185,237,49,90,58,186,112,191,189,223,154,219,186,80,82,215,6,219,211,53,88,234,153,47,26) -IMAGE_DATA(55,10,18,120,16,227,77,14,15,234,229,52,121,144,242,209,218,36,212,37,197,191,54,246,5,209,190,186,248,31,138,235) -IMAGE_DATA(37,41,99,238,137,154,205,177,6,108,61,82,135,245,7,107,176,38,168,6,75,252,170,97,177,183,18,115,220,203,48,197) -IMAGE_DATA(169,20,227,148,197,24,179,53,255,89,61,65,62,59,113,227,220,6,150,27,251,35,75,12,25,203,246,103,213,224,216,141) -IMAGE_DATA(58,68,166,221,198,129,184,34,236,143,41,194,193,196,42,68,170,238,32,52,53,25,55,142,79,100,45,55,35,184,92,193) -IMAGE_DATA(76,103,30,32,248,124,226,183,112,16,236,11,86,168,22,15,200,109,7,136,103,58,63,129,253,138,138,138,1,190,159,216) -IMAGE_DATA(31,110,254,7,235,143,245,57,15,97,189,82,169,124,102,114,234,83,215,12,231,20,246,176,179,27,215,106,123,57,123,130) -IMAGE_DATA(43,183,187,145,86,209,133,174,39,125,184,86,215,139,93,191,214,96,147,91,148,36,43,196,3,61,207,98,219,228,242,32) -IMAGE_DATA(112,110,12,254,133,107,21,59,142,186,239,166,101,109,117,8,109,128,24,255,67,117,189,36,98,253,220,245,118,53,107,195) -IMAGE_DATA(153,188,135,56,153,211,138,227,217,15,16,117,185,5,225,105,247,17,154,210,132,128,132,123,240,57,215,0,175,179,117,112) -IMAGE_DATA(61,121,7,111,175,187,246,172,158,140,244,52,28,221,249,103,22,191,239,3,230,150,92,133,163,217,53,136,75,190,133,138) -IMAGE_DATA(218,135,104,126,216,142,166,135,29,40,171,121,136,240,139,21,8,77,191,133,99,167,60,144,17,252,9,11,179,31,163,149) -IMAGE_DATA(127,67,124,190,49,98,1,226,89,240,249,2,251,234,49,191,58,251,77,77,77,195,194,191,161,49,185,216,122,185,235,180) -IMAGE_DATA(157,147,152,190,217,221,207,191,138,227,95,117,167,23,87,171,123,144,81,217,141,91,141,29,160,184,160,241,65,39,38,218) -IMAGE_DATA(38,105,229,95,202,215,202,229,129,68,156,25,139,127,169,115,82,143,189,117,241,47,156,191,24,255,67,117,189,36,129,255) -IMAGE_DATA(99,151,31,32,50,227,1,14,167,181,32,52,185,25,254,151,154,224,125,158,139,215,207,54,192,229,100,29,28,142,215,194) -IMAGE_DATA(250,40,215,54,135,223,198,186,208,42,40,163,107,240,230,146,236,231,234,218,229,238,201,182,198,22,32,48,227,22,162,57) -IMAGE_DATA(95,79,106,105,109,69,249,221,122,60,230,150,201,218,185,171,243,63,91,129,3,41,55,97,23,157,134,221,158,222,90,239) -IMAGE_DATA(139,210,200,236,171,183,1,74,25,127,91,226,153,184,39,190,201,164,216,39,107,229,174,245,175,129,127,117,255,47,102,82) -IMAGE_DATA(251,63,122,244,136,231,191,181,163,27,5,156,175,47,168,239,123,26,3,244,32,161,184,19,241,133,237,104,229,242,130,201) -IMAGE_DATA(202,36,70,101,197,68,60,72,229,177,250,240,32,86,143,92,254,53,253,49,29,67,236,56,114,207,69,253,248,98,252,15) -IMAGE_DATA(213,245,146,136,255,120,85,27,151,143,245,34,140,227,254,126,251,19,116,116,245,161,227,113,31,218,31,247,34,251,102,7) -IMAGE_DATA(215,6,212,163,188,238,49,28,99,107,81,124,231,17,151,11,220,196,150,240,91,248,131,69,198,115,117,45,181,245,97,155) -IMAGE_DATA(143,23,192,255,92,25,138,57,191,223,249,132,161,189,179,19,190,161,97,104,228,216,104,227,242,186,216,11,73,72,43,111) -IMAGE_DATA(133,115,116,62,168,44,237,35,117,63,4,223,111,108,246,5,163,186,237,191,251,14,113,113,113,146,127,19,226,153,124,190) -IMAGE_DATA(38,251,66,222,175,110,195,193,191,62,236,139,61,207,218,142,41,85,150,24,79,73,73,225,77,125,89,248,93,108,95,186) -IMAGE_DATA(199,246,246,246,236,27,215,76,60,224,248,47,169,103,40,226,248,207,231,218,129,220,234,39,124,14,144,88,254,136,219,214) -IMAGE_DATA(131,175,29,51,48,127,254,124,22,21,21,165,215,189,208,135,7,49,201,229,95,91,46,175,89,78,179,46,169,88,94,253) -IMAGE_DATA(26,228,158,175,161,215,75,218,126,180,142,143,245,59,57,230,253,47,222,227,217,247,56,83,207,255,174,140,174,197,221,150) -IMAGE_DATA(110,156,189,214,194,255,238,121,230,46,30,117,247,225,7,175,82,172,13,173,196,27,51,82,158,171,107,206,206,24,102,21) -IMAGE_DATA(153,7,215,136,27,104,124,212,131,22,110,159,110,58,134,210,1,71,226,78,97,171,189,3,46,94,206,70,65,107,15,54) -IMAGE_DATA(28,200,6,149,165,125,196,206,75,96,95,52,223,231,152,5,197,238,244,83,23,231,90,202,82,221,62,163,70,241,109,128) -IMAGE_DATA(148,136,103,205,126,126,117,159,79,49,63,113,223,214,214,198,155,20,255,114,124,175,62,254,89,125,219,112,240,175,143,255) -IMAGE_DATA(79,79,79,71,96,96,32,114,115,115,49,195,61,11,247,57,254,75,27,24,74,56,43,184,219,135,27,92,30,144,197,197) -IMAGE_DATA(0,233,92,30,112,159,227,127,170,83,22,191,207,166,77,155,144,156,156,44,121,126,154,122,17,252,11,101,6,123,62,114) -IMAGE_DATA(219,129,193,214,175,47,255,235,14,214,32,42,171,5,189,125,156,175,230,124,126,87,15,227,99,253,14,206,247,83,172,95) -IMAGE_DATA(219,220,141,166,182,30,190,93,216,29,87,139,123,15,123,48,221,181,8,203,3,202,49,202,60,241,185,186,166,91,31,102) -IMAGE_DATA(203,131,179,161,12,83,161,166,189,135,107,3,250,80,219,218,134,93,30,123,120,246,211,84,249,104,122,2,228,54,247,96) -IMAGE_DATA(237,222,44,80,89,218,71,236,188,36,227,126,129,103,146,174,54,64,70,89,93,121,0,241,172,141,125,50,226,190,163,163) -IMAGE_DATA(131,55,49,254,229,198,222,218,202,232,218,54,146,253,191,163,163,35,203,207,207,231,231,126,216,218,218,202,50,42,155,145) -IMAGE_DATA(145,129,197,139,23,191,48,127,40,135,127,225,24,134,212,167,110,114,99,9,49,25,131,127,234,215,63,148,218,204,199,250) -IMAGE_DATA(187,98,239,162,237,81,47,182,30,169,230,127,95,21,84,137,219,77,93,72,42,104,69,94,85,59,236,143,221,230,226,248) -IMAGE_DATA(30,76,116,204,199,79,62,101,120,253,179,115,207,213,53,223,106,55,155,231,149,12,135,240,107,72,189,217,10,46,101,64) -IMAGE_DATA(45,215,118,252,154,146,137,170,251,15,209,208,11,220,234,4,78,20,62,192,134,128,43,160,178,180,143,216,121,41,165,152) -IMAGE_DATA(214,236,179,147,106,3,212,217,87,47,43,82,39,29,139,158,91,177,60,64,224,255,238,221,187,207,245,243,105,178,79,249) -IMAGE_DATA(42,153,38,255,250,240,168,47,187,114,247,25,110,255,79,113,127,111,111,47,200,114,114,114,158,197,74,82,118,249,242,101) -IMAGE_DATA(8,229,215,173,91,55,98,248,87,239,207,151,43,245,177,61,109,54,152,120,192,24,252,207,245,188,201,247,235,19,247,219) -IMAGE_DATA(35,171,241,176,179,23,107,66,42,249,223,127,242,41,71,85,227,99,204,246,40,198,197,27,15,184,118,161,10,143,123,250) -IMAGE_DATA(80,217,240,24,22,94,37,120,109,204,175,207,213,229,228,190,143,77,85,158,196,47,65,151,225,18,93,134,38,238,138,90) -IMAGE_DATA(122,128,182,62,206,184,229,7,28,255,77,220,242,142,240,50,88,6,164,129,202,210,62,154,231,164,53,239,151,226,90,189) -IMAGE_DATA(13,144,83,70,205,248,126,128,213,171,233,57,29,112,127,136,103,205,126,62,245,152,95,96,159,198,172,201,94,54,255,47) -IMAGE_DATA(117,92,185,235,164,164,94,214,206,206,14,221,221,221,188,197,196,196,224,214,173,91,124,59,32,102,180,45,60,60,252,89) -IMAGE_DATA(121,206,255,203,62,230,80,241,47,231,30,14,71,189,198,224,223,124,87,49,246,198,215,63,235,215,95,17,88,129,69,190) -IMAGE_DATA(55,241,151,125,101,152,187,167,132,143,245,191,118,42,128,185,67,62,198,217,93,199,88,107,21,198,108,207,195,183,123,138) -IMAGE_DATA(240,218,71,103,159,171,43,39,39,23,83,86,216,177,73,182,103,96,197,241,237,26,93,10,213,173,7,104,127,212,131,246) -IMAGE_DATA(206,30,220,224,150,157,142,150,192,210,39,9,84,134,202,210,62,154,34,127,172,181,207,95,138,239,247,222,235,55,61,216) -IMAGE_DATA(199,211,99,217,115,251,137,141,103,107,242,79,236,183,180,180,232,197,63,201,80,254,181,201,16,246,165,234,151,179,78,174) -IMAGE_DATA(255,223,177,99,7,74,74,74,120,243,243,243,227,231,82,80,94,47,102,84,198,211,211,243,89,249,241,227,199,107,189,118) -IMAGE_DATA(117,13,181,255,87,175,127,48,146,59,151,87,174,140,193,63,205,225,113,62,113,7,14,49,181,176,142,170,230,251,245,173) -IMAGE_DATA(14,85,97,109,72,5,86,6,220,196,82,191,114,62,214,159,191,175,4,63,112,62,159,184,159,235,209,111,154,252,147,130) -IMAGE_DATA(66,15,226,103,123,63,54,113,219,9,252,228,145,0,43,239,52,108,218,151,1,43,175,116,88,238,77,198,2,183,243,176) -IMAGE_DATA(216,125,22,139,108,125,25,149,21,147,82,27,251,218,218,0,49,201,236,39,164,99,138,229,0,67,61,255,95,14,255,114) -IMAGE_DATA(234,48,212,191,232,211,14,169,231,251,154,38,86,199,230,205,155,145,144,144,192,219,158,61,123,80,88,88,136,11,23,46) -IMAGE_DATA(136,90,65,65,1,245,23,60,43,255,30,181,231,50,53,210,242,127,41,233,106,7,228,204,21,80,63,23,67,248,167,57) -IMAGE_DATA(60,255,180,44,27,111,46,186,130,63,88,92,198,63,206,77,227,251,245,71,77,78,196,168,47,19,240,15,227,46,224,245) -IMAGE_DATA(177,231,248,88,159,120,215,52,77,165,166,166,242,127,195,248,115,23,153,217,154,96,140,177,140,196,39,191,196,241,70,203) -IMAGE_DATA(83,183,28,66,114,74,42,75,77,75,99,212,199,43,38,89,252,203,105,3,228,142,17,60,229,159,226,127,177,28,96,40) -IMAGE_DATA(101,12,254,133,125,13,245,43,250,180,17,114,234,18,180,126,253,122,196,199,199,243,230,235,235,11,7,7,7,222,182,111) -IMAGE_DATA(223,78,249,61,31,227,207,153,51,7,230,230,230,152,48,97,2,191,78,40,255,238,187,239,202,62,230,72,236,255,215,182) -IMAGE_DATA(93,170,29,144,219,39,104,12,254,141,169,123,247,238,225,200,145,35,236,230,205,155,8,13,11,99,14,206,238,108,230,98) -IMAGE_DATA(43,246,225,119,253,70,203,59,93,60,216,161,195,135,89,89,89,25,98,99,99,25,205,173,209,148,108,254,201,180,249,7) -IMAGE_DATA(218,38,179,30,57,252,203,141,147,245,145,177,248,87,175,99,176,241,228,96,234,150,211,222,172,90,181,138,29,61,122,148) -IMAGE_DATA(231,153,184,143,62,126,2,137,41,153,162,22,21,29,139,209,163,71,243,101,131,130,130,240,246,219,111,203,62,191,225,30) -IMAGE_DATA(255,215,244,219,114,239,189,216,60,1,57,26,105,252,183,183,183,195,217,217,153,5,6,6,50,138,241,164,68,125,60,222) -IMAGE_DATA(222,222,204,195,195,131,81,94,173,169,145,200,191,216,223,198,24,140,25,155,127,67,21,205,197,76,98,12,68,27,240,30) -IMAGE_DATA(181,139,139,11,91,189,122,53,155,55,111,30,22,251,102,225,209,227,110,52,63,236,70,19,103,141,173,93,168,187,255,24) -IMAGE_DATA(213,247,58,80,213,208,134,71,93,61,88,236,147,133,119,222,121,135,226,1,122,70,100,31,231,69,241,47,229,215,53,219) -IMAGE_DATA(5,125,142,175,217,6,200,145,177,249,167,190,172,121,123,102,25,60,47,193,80,141,180,248,95,219,223,197,208,54,96,164) -IMAGE_DATA(241,47,198,186,208,38,24,210,6,8,90,180,63,147,45,243,191,138,101,126,255,111,63,243,150,205,27,109,91,180,47,115) -IMAGE_DATA(80,207,224,139,226,95,76,98,239,233,232,19,203,107,123,7,80,74,198,230,127,81,228,15,108,213,249,5,131,230,255,148) -IMAGE_DATA(219,74,86,24,188,22,249,129,171,161,242,91,142,92,159,197,184,178,247,71,100,120,124,143,20,151,217,184,180,107,26,206) -IMAGE_DATA(217,127,5,151,13,243,117,206,249,55,152,125,65,122,244,255,137,241,47,231,57,24,138,88,155,68,227,10,151,252,102,177) -IMAGE_DATA(76,207,25,236,202,222,25,136,113,254,156,213,213,213,105,221,231,244,233,36,172,88,225,138,113,227,214,224,195,15,151,98) -IMAGE_DATA(252,120,75,172,94,237,198,197,211,169,178,142,169,111,140,111,172,118,193,24,26,46,254,133,253,196,226,127,50,57,99,251) -IMAGE_DATA(218,222,243,151,146,49,249,95,16,242,29,115,191,166,132,115,182,13,86,158,95,128,37,167,230,225,199,99,115,241,253,161) -IMAGE_DATA(233,152,25,48,25,83,246,125,137,9,46,102,48,83,142,193,152,109,239,227,253,245,3,227,110,98,255,94,201,175,104,44) -IMAGE_DATA(62,131,134,130,83,168,191,17,139,187,170,104,220,201,141,68,109,246,33,84,95,14,193,237,244,0,196,109,249,68,235,185) -IMAGE_DATA(16,139,195,49,254,167,201,191,62,207,192,80,180,1,101,81,179,80,26,177,26,143,171,179,209,85,155,131,171,190,19,176) -IMAGE_DATA(103,251,66,201,103,105,235,86,95,124,246,153,37,151,99,7,113,237,64,34,210,210,178,57,238,83,224,232,24,2,51,179) -IMAGE_DATA(53,176,177,209,253,108,244,159,63,205,135,150,195,116,52,119,107,117,199,69,47,42,174,17,203,163,135,154,127,245,125,52) -IMAGE_DATA(143,165,94,135,174,54,64,56,119,125,230,1,25,122,189,130,230,251,205,101,110,185,246,136,41,61,140,163,197,161,8,47) -IMAGE_DATA(12,68,88,254,1,4,170,188,225,155,235,137,189,87,93,225,158,229,4,231,76,7,236,76,179,133,93,202,54,252,121,213) -IMAGE_DATA(192,126,217,235,254,43,209,80,116,154,227,220,159,227,220,7,85,201,94,168,184,228,134,242,243,78,40,61,107,143,226,147) -IMAGE_DATA(219,81,153,180,31,147,29,83,241,149,50,9,19,108,18,240,249,198,147,44,56,236,200,115,245,12,231,252,159,145,226,255) -IMAGE_DATA(239,92,124,31,29,133,71,209,85,157,137,238,218,92,222,30,223,76,68,134,251,116,209,231,131,216,159,57,115,59,247,60) -IMAGE_DATA(94,5,245,173,82,31,44,189,183,116,251,246,109,208,55,150,84,170,66,126,187,173,173,246,231,163,255,26,232,222,81,251) -IMAGE_DATA(174,208,105,218,248,215,252,125,176,177,181,28,73,205,179,211,103,126,173,212,124,125,93,223,246,16,76,243,253,58,185,117) -IMAGE_DATA(9,219,228,142,251,25,235,122,5,253,176,119,38,219,125,197,26,17,69,193,56,84,224,143,144,235,62,240,207,219,11,239) -IMAGE_DATA(28,119,120,102,59,195,245,242,78,236,74,183,131,50,117,7,108,146,182,96,91,226,6,188,179,244,173,1,245,228,250,44) -IMAGE_DATA(145,117,188,137,118,156,111,42,121,128,228,162,22,132,167,212,224,211,229,65,3,206,89,50,7,24,162,249,191,2,251,47) -IMAGE_DATA(58,255,23,19,177,223,117,63,29,93,53,81,168,140,179,68,135,42,130,55,226,63,201,125,246,128,123,69,49,63,249,125) -IMAGE_DATA(117,246,137,123,178,138,91,21,207,230,46,231,231,151,242,229,206,159,23,31,119,21,174,231,233,146,44,83,42,229,241,175) -IMAGE_DATA(237,120,134,180,11,218,222,177,145,195,158,177,190,255,39,231,30,136,249,107,125,125,190,161,215,43,165,185,123,191,97,214) -IMAGE_DATA(73,86,176,61,191,9,179,189,190,102,82,49,63,249,125,98,255,95,127,250,231,1,117,80,174,111,115,182,18,223,6,94) -IMAGE_DATA(199,108,159,60,76,247,204,193,84,151,43,152,228,144,9,115,235,116,140,223,156,130,21,94,57,248,98,251,5,92,42,104) -IMAGE_DATA(65,125,27,208,250,8,248,112,197,192,88,147,152,124,81,239,255,168,199,254,82,239,2,139,253,157,135,146,253,222,142,51) -IMAGE_DATA(232,44,91,137,118,213,47,184,30,98,129,202,152,141,200,222,55,83,116,31,202,247,41,230,215,100,159,184,39,19,230,45) -IMAGE_DATA(55,55,55,195,201,233,32,214,174,221,35,121,124,99,241,255,124,93,250,107,40,238,173,73,218,53,221,237,43,182,32,114) -IMAGE_DATA(46,91,121,238,199,65,245,1,166,187,127,199,231,249,101,191,238,68,201,105,27,20,197,109,69,126,180,21,174,71,174,65) -IMAGE_DATA(222,225,101,200,13,93,132,226,83,246,48,219,120,22,87,43,30,224,74,121,11,30,112,252,255,231,226,136,1,117,189,232) -IMAGE_DATA(247,127,229,204,253,49,196,207,201,209,115,236,87,44,66,71,241,68,244,180,120,162,238,236,2,148,121,153,73,238,71,125) -IMAGE_DATA(125,148,239,19,251,197,229,197,162,236,215,223,171,231,231,45,39,38,102,195,220,252,23,201,186,70,10,255,198,216,223,36) -IMAGE_DATA(253,100,225,55,199,160,62,192,164,221,51,80,157,17,196,231,249,5,199,55,226,70,212,58,168,142,172,196,181,131,75,145) -IMAGE_DATA(19,188,0,87,3,230,161,48,118,7,254,103,237,9,100,150,222,71,208,165,106,36,23,54,225,79,243,15,138,158,207,11) -IMAGE_DATA(249,254,135,90,222,255,162,231,254,169,107,176,236,147,168,159,159,250,250,132,124,95,96,95,224,159,216,167,247,21,200,174) -IMAGE_DATA(95,47,197,167,159,174,146,172,235,101,229,223,219,123,27,11,8,120,147,133,133,41,120,163,101,90,103,208,9,252,21,137) -IMAGE_DATA(250,0,12,237,3,60,175,156,132,170,20,95,84,36,238,69,249,69,15,228,159,218,133,136,253,219,224,230,226,132,208,208) -IMAGE_DATA(80,236,222,105,131,196,224,141,248,100,197,17,56,185,184,243,235,92,221,60,48,113,161,19,63,247,64,76,146,121,128,129) -IMAGE_DATA(166,25,247,75,189,255,171,207,51,56,216,231,61,121,239,191,15,154,125,18,141,241,81,63,191,166,223,39,238,213,217,167) -IMAGE_DATA(249,89,201,201,185,58,253,63,141,231,17,215,114,108,245,106,121,125,163,250,74,159,125,232,90,15,29,250,27,166,217,54) -IMAGE_DATA(209,58,186,23,38,233,214,28,151,105,6,247,1,126,63,241,3,124,103,254,95,152,251,229,104,204,254,226,61,204,152,100) -IMAGE_DATA(134,125,251,246,241,223,114,168,172,172,228,223,13,216,177,109,51,86,90,90,161,176,168,136,95,71,223,120,160,50,118,118) -IMAGE_DATA(118,90,191,3,100,236,239,127,106,198,253,186,242,126,93,26,236,115,126,193,245,223,208,86,151,52,104,246,73,171,86,185) -IMAGE_DATA(241,99,124,212,207,47,229,247,137,253,206,206,78,236,222,125,24,191,252,226,37,89,151,212,252,63,109,38,103,252,95,223) -IMAGE_DATA(124,94,87,57,242,237,7,14,252,11,11,9,121,133,29,62,172,192,169,83,10,20,23,43,208,215,167,64,111,175,2,5) -IMAGE_DATA(5,253,235,104,27,149,161,178,166,120,64,187,102,185,77,225,251,0,29,57,198,127,142,158,47,25,243,107,235,3,28,59) -IMAGE_DATA(118,236,179,254,201,53,107,214,176,188,130,2,88,88,88,96,242,228,201,108,217,178,101,216,191,127,63,255,222,7,45,79) -IMAGE_DATA(155,54,141,223,70,109,128,182,177,15,99,127,255,155,247,251,106,236,235,154,243,175,235,185,29,76,95,21,205,129,38,246) -IMAGE_DATA(171,115,78,226,202,177,21,131,102,159,68,190,159,198,247,105,140,79,243,123,164,234,236,151,151,87,243,229,18,18,244,251) -IMAGE_DATA(63,16,116,93,52,15,215,88,249,184,174,251,37,231,56,7,15,254,221,115,254,254,246,109,5,142,31,87,224,198,141,126) -IMAGE_DATA(139,137,233,95,167,94,166,127,31,147,180,105,218,110,115,54,227,192,87,44,56,36,120,80,251,211,59,125,83,166,76,97) -IMAGE_DATA(102,102,102,204,218,218,154,231,127,230,204,153,108,220,184,113,44,49,49,17,121,121,121,92,174,154,70,239,254,224,179,207) -IMAGE_DATA(62,99,180,141,248,167,178,186,234,38,102,201,111,15,246,255,127,240,62,95,35,223,151,138,251,5,201,25,227,25,12,255) -IMAGE_DATA(222,107,255,136,182,234,43,232,169,191,129,120,219,143,145,30,240,223,168,200,88,11,85,240,84,100,57,126,44,187,30,65) -IMAGE_DATA(214,214,254,252,248,62,141,241,81,63,191,240,141,2,117,246,167,79,223,14,7,7,233,191,171,177,199,191,228,72,106,92) -IMAGE_DATA(69,155,92,92,22,178,184,56,5,138,138,250,253,61,89,86,150,2,78,78,111,192,211,83,201,124,125,247,51,91,219,15) -IMAGE_DATA(24,173,163,88,224,201,19,5,119,95,20,160,125,118,238,156,103,106,3,180,136,242,240,207,151,255,175,193,247,200,223,223) -IMAGE_DATA(31,75,150,44,225,249,167,159,196,255,164,73,147,48,123,246,108,222,104,153,214,209,54,226,159,126,234,170,147,255,134,44) -IMAGE_DATA(215,6,80,44,32,196,3,114,255,255,151,152,207,215,22,247,11,26,42,255,79,252,119,215,230,160,57,122,49,26,252,191) -IMAGE_DATA(64,218,138,81,136,94,244,6,206,110,25,45,187,14,77,209,220,30,26,223,167,49,62,234,231,167,190,62,202,247,41,230) -IMAGE_DATA(39,191,175,141,125,18,249,120,49,83,191,62,169,50,250,188,167,35,37,185,247,48,50,242,119,172,180,84,129,107,215,20) -IMAGE_DATA(156,63,233,247,247,129,129,175,192,215,215,154,209,183,90,233,91,131,190,190,19,152,16,15,228,230,42,184,220,83,129,164) -IMAGE_DATA(36,5,183,254,119,38,254,95,128,232,255,101,205,157,59,151,57,56,56,48,63,63,63,70,156,209,183,95,172,172,172,176) -IMAGE_DATA(109,219,54,126,249,233,58,190,12,149,213,167,126,242,219,188,47,167,239,246,40,196,255,247,39,207,188,134,191,151,227,243) -IMAGE_DATA(213,53,84,249,191,197,132,215,80,24,188,0,157,170,72,52,171,142,33,213,253,107,131,216,23,68,115,123,104,124,159,250) -IMAGE_DATA(248,168,159,159,126,82,190,47,39,230,31,14,255,63,24,5,5,189,202,218,219,185,246,189,81,129,202,74,5,170,170,20) -IMAGE_DATA(92,94,249,123,254,157,97,122,63,194,203,75,201,156,157,205,153,157,157,25,115,113,249,15,150,144,160,0,153,74,165,192) -IMAGE_DATA(158,61,175,154,248,127,1,162,111,55,170,84,42,62,246,95,184,112,33,229,254,108,249,242,229,44,34,34,2,148,7,208) -IMAGE_DATA(239,100,180,141,202,80,89,125,244,244,123,242,207,190,57,165,201,184,54,147,203,62,105,168,250,255,231,125,241,58,126,154) -IMAGE_DATA(48,10,193,171,222,229,185,119,179,94,58,34,159,75,205,254,192,145,240,174,143,192,255,195,135,10,46,207,81,160,186,154) -IMAGE_DATA(203,237,124,126,143,211,167,79,243,126,199,217,121,21,199,189,3,163,239,17,57,57,237,226,126,42,64,70,177,130,137,255) -IMAGE_DATA(223,158,132,182,192,88,204,155,52,178,21,24,216,207,127,107,171,2,205,205,10,52,52,40,224,230,246,3,163,239,135,82) -IMAGE_DATA(236,159,157,157,205,255,164,239,8,219,217,173,101,233,233,253,252,231,228,80,254,98,226,223,36,147,94,102,133,133,253,45) -IMAGE_DATA(235,236,84,160,173,141,203,231,67,198,50,215,200,235,44,252,68,6,138,138,138,248,111,6,70,70,70,226,224,193,131,176) -IMAGE_DATA(177,89,201,92,93,95,227,226,205,254,220,63,59,91,1,79,79,211,24,128,73,38,189,204,114,116,52,103,196,179,127,216) -IMAGE_DATA(251,216,21,89,201,78,102,53,193,230,80,37,124,35,46,113,185,224,56,158,121,79,207,87,113,226,68,127,222,79,126,159) -IMAGE_DATA(252,127,100,164,130,107,19,62,55,241,111,146,73,47,177,232,255,2,172,221,96,197,182,4,230,115,236,55,35,254,234,125) -IMAGE_DATA(132,39,53,98,161,91,30,163,57,64,66,127,31,113,79,99,128,52,23,96,231,206,63,178,144,144,253,252,88,168,73,38) -IMAGE_DATA(153,244,114,107,189,175,138,197,102,52,225,244,149,102,28,75,189,199,249,255,42,40,189,198,51,234,11,160,241,62,26,27) -IMAGE_DATA(60,115,70,1,119,247,191,231,226,1,43,118,231,206,157,225,62,101,147,76,50,201,72,90,234,156,206,130,207,215,33,34) -IMAGE_DATA(185,17,155,130,42,240,237,66,11,230,231,167,96,196,61,229,251,135,14,41,96,103,55,135,209,124,51,147,76,50,233,183) -IMAGE_DATA(165,163,199,98,49,107,71,18,251,122,75,50,83,186,250,242,57,125,66,194,5,216,218,126,193,108,108,62,101,241,241,167) -IMAGE_DATA(135,251,20,77,50,201,36,147,70,180,254,15,224,189,78,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) -IMAGE_END_DATA(5696, 1) - -IMAGE_BEGIN_DATA -IMAGE_DATA(120,156,237,93,121,84,21,71,186,239,204,139,239,143,156,153,156,156,204,75,38,207,57,243,206,228,249,222,57,51,78,222) -IMAGE_DATA(115,102,242,156,24,77,50,110,99,156,100,98,30,234,184,107,18,19,163,227,22,49,113,5,4,84,246,77,201,21,1,241) -IMAGE_DATA(2,34,168,40,184,129,26,149,125,81,68,65,65,144,29,89,148,85,64,17,23,132,250,189,174,230,180,105,154,238,123,171) -IMAGE_DATA(239,70,204,227,119,78,29,170,187,234,171,250,170,111,253,170,190,175,186,170,225,94,226,94,226,172,137,209,163,57,247,128) -IMAGE_DATA(0,174,62,34,130,35,52,208,56,189,199,34,251,220,115,220,171,145,145,92,55,192,65,26,232,61,62,109,184,90,125,158) -IMAGE_DATA(158,92,181,94,207,245,238,219,199,225,248,113,14,197,197,28,122,123,57,244,244,112,40,44,236,187,71,211,104,30,154,87) -IMAGE_DATA(170,79,120,56,247,72,90,215,205,155,28,142,28,225,112,237,90,95,56,124,184,239,158,52,15,149,161,178,19,39,114,225) -IMAGE_DATA(241,241,28,138,138,250,234,163,225,194,5,14,137,137,28,162,162,250,2,141,211,123,84,151,39,79,56,20,20,112,160,50) -IMAGE_DATA(19,38,112,49,49,49,220,147,146,18,14,87,174,112,200,203,235,171,143,214,45,111,191,168,207,229,203,28,210,210,56,36) -IMAGE_DATA(39,115,216,181,139,123,18,20,196,117,116,118,114,104,106,226,80,89,201,161,170,138,67,122,58,135,178,178,239,245,161,241) -IMAGE_DATA(140,12,14,55,110,112,56,119,174,47,228,231,115,240,240,224,58,68,249,187,119,57,180,181,113,168,169,233,211,53,55,247) -IMAGE_DATA(251,246,211,58,233,243,163,114,169,169,125,129,234,74,229,121,29,4,249,142,14,14,173,173,28,154,155,57,212,215,247,213) -IMAGE_DATA(73,219,149,153,217,39,71,245,165,122,81,61,168,60,45,223,221,157,235,224,127,143,199,93,93,28,238,221,227,208,208,208) -IMAGE_DATA(39,91,93,205,161,188,188,239,55,164,121,169,156,24,146,146,250,202,202,201,225,224,235,203,61,154,51,135,59,71,175,235) -IMAGE_DATA(234,250,218,64,203,160,207,129,214,79,229,105,26,125,94,52,80,61,104,189,180,76,254,185,99,230,76,46,141,255,9,255) -IMAGE_DATA(249,181,215,184,37,235,215,115,229,52,79,99,35,135,150,150,190,231,72,229,197,231,69,229,232,115,161,125,97,237,90,238) -IMAGE_DATA(230,240,225,220,42,94,246,5,105,191,29,57,146,115,243,242,226,218,179,178,250,202,160,101,209,103,71,127,219,147,39,133) -IMAGE_DATA(231,213,249,198,27,156,31,159,247,151,106,253,255,249,231,185,223,141,31,207,69,7,7,115,132,202,209,246,242,125,31,124) -IMAGE_DATA(63,59,50,108,24,247,7,86,14,190,240,2,55,101,250,116,46,121,246,108,46,243,167,63,229,62,82,203,151,250,34,247) -IMAGE_DATA(226,211,11,88,24,180,72,173,197,138,50,90,100,229,50,44,178,106,50,134,100,141,201,40,201,178,202,200,101,77,149,51) -IMAGE_DATA(85,79,115,158,139,57,191,131,154,172,22,152,34,195,86,238,115,191,182,26,57,134,48,132,33,124,143,222,222,94,132,6) -IMAGE_DATA(58,146,227,254,191,35,135,125,254,72,30,61,122,52,32,79,99,99,35,104,122,172,207,155,164,164,164,100,16,180,236,15) -IMAGE_DATA(165,97,97,104,168,24,130,173,16,27,30,2,251,145,28,2,29,86,147,193,214,197,28,116,119,119,35,216,111,45,201,62) -IMAGE_DATA(56,135,116,183,166,224,82,220,28,18,232,57,143,172,242,137,33,43,246,23,11,129,198,119,122,44,36,249,39,22,147,194) -IMAGE_DATA(179,246,228,128,231,155,164,182,182,118,208,116,54,102,180,25,195,202,149,43,137,86,35,79,45,100,101,101,9,193,18,101) -IMAGE_DATA(133,132,132,24,212,219,80,61,52,77,196,235,175,191,222,175,79,90,186,189,114,140,24,49,66,83,249,171,87,15,228,12) -IMAGE_DATA(235,51,84,170,223,84,136,28,166,127,89,65,249,78,101,196,240,172,243,127,111,208,118,100,29,152,75,30,55,38,34,239) -IMAGE_DATA(216,124,114,102,207,88,226,153,217,10,93,110,19,246,94,109,16,2,141,251,167,87,33,57,236,77,82,158,182,145,92,57) -IMAGE_DATA(190,156,28,112,27,69,232,216,97,107,24,226,57,235,24,32,229,131,156,115,83,166,76,25,208,151,229,121,40,191,212,250) -IMAGE_DATA(163,146,188,154,62,242,62,111,136,255,98,157,114,110,203,245,81,202,99,205,246,74,65,229,204,25,223,68,40,141,39,214) -IMAGE_DATA(192,250,9,35,4,46,187,46,156,202,196,97,57,247,7,147,255,46,135,155,21,131,227,161,70,108,216,127,27,107,34,106) -IMAGE_DATA(177,98,79,45,22,239,174,193,220,29,149,152,238,83,138,191,186,149,224,61,151,98,140,222,80,240,180,156,61,186,173,184) -IMAGE_DATA(122,202,158,228,30,153,79,206,135,141,33,129,23,106,113,232,218,109,196,164,223,68,80,124,17,2,15,23,33,34,169,10) -IMAGE_DATA(49,249,245,208,167,165,224,234,225,73,228,78,217,126,222,87,24,107,115,63,128,165,63,176,228,17,249,160,212,31,89,248) -IMAGE_DATA(32,205,39,231,131,218,60,102,8,98,89,106,252,48,196,125,17,82,238,169,241,223,26,237,85,130,18,127,167,78,101,227) -IMAGE_DATA(152,188,45,74,182,130,37,112,233,66,86,63,30,107,129,104,55,12,54,255,79,95,237,148,132,123,56,153,119,23,199,114) -IMAGE_DATA(59,112,36,167,29,7,179,219,16,149,126,7,250,212,22,132,156,107,134,238,116,35,2,18,110,195,235,88,61,70,172,190) -IMAGE_DATA(242,180,156,204,140,116,196,184,254,134,36,236,24,69,188,83,170,112,32,167,22,241,41,213,168,168,187,139,214,187,157,104) -IMAGE_DATA(185,123,31,165,181,119,17,117,182,2,250,140,106,28,58,238,139,140,61,127,34,250,45,255,99,83,254,107,153,11,140,229) -IMAGE_DATA(165,124,160,253,89,41,141,149,15,34,207,45,193,127,81,103,165,122,164,115,55,141,27,42,67,228,141,18,255,173,213,94) -IMAGE_DATA(53,152,51,135,211,177,194,154,220,167,160,115,190,169,243,184,116,236,24,108,254,31,202,110,71,76,102,59,246,165,183,65) -IMAGE_DATA(159,210,138,224,243,45,248,246,12,111,175,39,52,194,243,216,109,184,30,169,131,195,129,90,124,19,117,19,171,245,85,112) -IMAGE_DATA(137,173,197,240,197,57,253,202,218,230,237,71,54,196,21,34,52,179,26,177,252,92,79,209,214,209,129,178,91,13,120,200) -IMAGE_DATA(199,105,232,228,91,25,156,80,129,160,212,114,108,137,77,135,155,95,160,205,219,109,201,249,95,109,174,101,229,3,5,229) -IMAGE_DATA(153,165,248,175,166,147,212,246,54,198,127,81,127,37,254,91,171,189,134,96,138,13,32,142,97,90,236,5,83,32,183,227) -IMAGE_DATA(169,47,192,42,251,67,225,127,98,254,61,180,221,239,65,56,207,251,59,157,79,112,255,81,47,238,63,236,69,231,195,30) -IMAGE_DATA(228,148,223,231,199,128,6,148,221,126,136,109,113,117,40,174,127,192,251,2,229,88,31,85,141,215,230,102,246,43,107,177) -IMAGE_DATA(227,183,100,221,145,66,4,159,46,69,49,63,239,119,61,33,232,236,234,194,46,125,56,154,248,113,224,222,163,71,136,251) -IMAGE_DATA(46,25,233,101,29,240,136,45,0,205,75,101,6,163,221,134,56,197,202,55,202,7,181,126,172,133,15,74,229,176,242,95) -IMAGE_DATA(62,31,211,58,148,234,209,234,67,211,250,149,248,111,173,246,26,211,69,139,254,98,126,106,59,48,87,98,2,118,110,94) -IMAGE_DATA(37,204,253,148,199,226,26,128,120,205,130,31,2,255,55,29,184,45,216,250,93,60,231,131,207,54,11,220,247,61,217,32) -IMAGE_DATA(92,187,196,214,225,86,219,99,36,92,105,19,174,253,79,222,194,131,199,189,152,29,80,130,85,250,74,188,58,45,181,95) -IMAGE_DATA(89,118,174,177,196,62,38,15,94,209,215,208,244,160,27,109,188,204,99,90,135,139,43,246,199,31,199,6,103,87,156,205) -IMAGE_DATA(206,65,97,71,55,214,6,229,128,230,165,50,131,209,110,10,37,94,89,106,173,72,11,31,148,192,202,127,67,190,188,60) -IMAGE_DATA(159,188,44,53,91,94,218,6,86,125,205,109,175,49,80,27,158,213,22,18,211,45,185,198,175,132,117,227,255,157,208,64) -IMAGE_DATA(227,210,53,61,214,117,64,107,240,63,48,112,3,9,14,254,87,162,215,115,66,160,113,122,79,45,255,234,136,90,28,188) -IMAGE_DATA(208,134,158,94,126,174,230,231,252,71,221,68,176,245,239,243,115,63,181,245,235,90,31,163,229,94,183,48,46,184,199,215) -IMAGE_DATA(161,249,110,55,62,242,42,194,151,33,101,120,101,82,82,191,178,254,182,57,146,124,25,150,3,151,240,124,212,118,118,243) -IMAGE_DATA(99,64,47,234,58,238,97,187,175,159,192,253,244,252,2,180,60,1,46,183,118,99,213,142,11,160,121,169,140,37,218,109) -IMAGE_DATA(42,212,230,127,173,50,114,216,130,255,98,30,22,168,189,79,96,25,7,76,45,223,146,252,167,144,175,5,40,217,246,98) -IMAGE_DATA(30,75,215,45,135,252,157,159,41,235,128,106,252,151,150,195,58,150,80,52,53,53,33,34,226,159,136,124,231,49,189,119) -IMAGE_DATA(235,214,45,69,25,186,174,31,153,214,42,216,250,219,227,110,225,222,131,30,108,216,95,35,92,255,99,79,37,110,182,60) -IMAGE_DATA(66,114,97,7,242,170,58,225,124,232,38,111,199,119,99,242,182,2,44,210,149,226,231,239,156,238,87,214,188,53,110,100) -IMAGE_DATA(78,64,10,92,163,174,32,173,188,3,188,203,128,58,126,236,56,149,154,133,170,59,119,209,216,3,84,119,1,71,175,183) -IMAGE_DATA(99,109,200,69,208,188,84,134,181,125,63,4,176,218,7,90,248,160,84,22,11,255,197,58,88,192,242,94,156,213,150,80) -IMAGE_DATA(130,45,248,111,204,15,16,109,4,107,174,247,137,16,215,253,164,144,250,0,44,123,1,228,252,151,190,15,96,93,83,164) -IMAGE_DATA(115,251,174,93,255,70,194,194,56,98,236,228,4,205,67,243,74,237,129,25,254,229,194,186,62,229,253,166,152,26,220,237) -IMAGE_DATA(234,193,138,189,149,194,245,34,93,25,170,154,30,194,206,183,24,103,175,181,243,227,66,21,30,118,247,162,178,241,33,230) -IMAGE_DATA(6,220,192,203,163,79,245,211,101,187,247,14,242,129,203,49,124,181,39,27,158,177,165,104,225,107,105,235,6,238,245,242) -IMAGE_DATA(129,143,183,243,252,111,225,227,155,163,74,177,50,36,29,52,47,149,209,252,240,205,132,185,243,59,203,24,192,202,7,99) -IMAGE_DATA(115,187,26,255,165,235,249,172,48,246,94,221,28,123,192,20,254,155,226,107,169,249,1,182,90,239,163,16,121,43,231,165) -IMAGE_DATA(148,191,44,243,182,148,255,226,216,33,5,139,61,17,30,62,172,223,124,207,118,242,105,216,83,221,38,109,47,198,142,196) -IMAGE_DATA(134,167,235,250,75,67,43,240,233,174,114,204,219,89,138,25,126,55,4,91,127,170,91,33,38,185,22,224,189,45,87,241) -IMAGE_DATA(182,67,62,70,111,202,195,76,191,34,188,252,102,66,63,93,114,115,47,99,234,151,78,100,138,211,73,216,243,252,246,138) -IMAGE_DATA(45,65,126,117,59,58,31,116,163,179,171,27,215,248,184,219,129,27,88,169,75,6,205,67,243,82,25,91,195,80,159,99) -IMAGE_DATA(237,143,198,250,46,11,31,12,241,91,203,94,64,45,176,86,185,90,249,47,47,95,75,125,114,63,64,122,109,11,136,190) -IMAGE_DATA(190,18,164,156,53,182,14,40,229,191,210,120,33,93,83,80,42,203,195,99,17,81,58,185,232,230,246,42,252,252,156,137) -IMAGE_DATA(78,183,147,56,58,142,34,74,39,23,93,93,103,11,245,209,61,60,30,71,235,225,122,184,14,14,7,107,132,117,125,251) -IMAGE_DATA(200,42,172,218,91,129,101,33,229,248,124,119,153,96,235,207,223,121,3,179,249,57,159,242,126,134,111,95,144,243,159,98) -IMAGE_DATA(143,62,2,159,111,9,34,147,55,30,197,34,223,115,176,255,54,29,223,236,204,132,125,64,6,86,238,72,193,66,239,51) -IMAGE_DATA(152,235,158,128,79,28,117,132,230,29,12,168,245,113,165,251,44,99,133,82,186,49,62,24,227,157,177,249,95,90,190,41) -IMAGE_DATA(96,221,203,203,10,91,242,95,204,47,15,214,94,239,19,97,104,126,151,238,7,48,182,166,103,108,253,79,106,79,40,249) -IMAGE_DATA(19,209,209,63,33,242,147,199,161,161,207,65,167,219,76,106,106,106,120,174,23,240,241,9,68,233,228,177,78,247,19,161) -IMAGE_DATA(62,186,135,231,151,75,114,48,252,211,139,120,109,110,54,126,49,35,93,88,215,127,229,253,36,188,50,225,28,254,229,189) -IMAGE_DATA(239,240,243,183,79,11,182,62,229,187,60,200,145,150,150,198,251,28,133,72,56,245,29,25,183,34,12,163,87,198,224,173) -IMAGE_DATA(175,226,133,64,227,31,172,143,68,114,74,42,73,77,75,35,25,25,25,172,143,220,162,80,234,227,134,250,189,41,99,128) -IMAGE_DATA(181,230,127,165,58,204,129,177,113,128,101,175,0,107,123,165,48,151,255,74,190,140,45,32,114,82,109,110,151,114,214,216) -IMAGE_DATA(94,0,115,249,31,26,250,51,34,255,114,64,96,224,75,72,76,76,196,237,219,183,225,239,239,76,220,221,39,18,39,167) -IMAGE_DATA(177,196,195,99,36,145,126,57,192,215,247,103,22,247,147,154,155,155,17,21,21,69,202,203,203,177,87,175,39,46,238,222) -IMAGE_DATA(100,218,167,107,200,31,102,246,5,26,119,245,240,33,17,145,145,164,180,180,148,247,83,142,144,138,138,10,75,171,97,20) -IMAGE_DATA(90,230,127,121,154,90,121,114,88,219,255,151,230,97,129,49,159,94,109,28,96,93,19,180,149,255,47,133,184,191,79,12) -IMAGE_DATA(182,240,253,165,107,124,44,193,144,15,96,41,254,75,191,252,161,211,189,132,19,39,78,160,184,184,24,238,238,203,120,222) -IMAGE_DATA(187,144,212,212,84,108,223,190,141,72,191,252,97,13,254,119,118,118,242,117,186,211,61,98,228,250,245,235,170,249,170,171) -IMAGE_DATA(171,249,113,42,144,248,248,248,144,134,134,6,75,171,97,20,44,243,185,214,52,57,108,177,254,79,161,198,79,249,188,205) -IMAGE_DATA(170,183,210,62,1,22,216,98,253,95,10,181,231,99,205,58,89,207,249,177,238,5,48,151,255,33,33,125,252,23,191,220) -IMAGE_DATA(67,191,86,227,229,53,139,228,230,230,10,182,127,78,78,142,240,55,59,59,27,78,78,43,137,244,203,61,62,62,3,249) -IMAGE_DATA(127,255,254,125,204,246,253,248,153,122,31,103,10,140,245,105,67,233,172,156,176,213,254,31,181,121,93,62,46,104,169,95) -IMAGE_DATA(62,6,176,192,214,252,23,235,208,178,47,200,92,80,46,179,236,239,101,221,11,96,46,255,245,250,231,137,248,229,45,93) -IMAGE_DATA(216,24,226,25,157,79,162,142,102,162,168,168,136,183,243,207,33,38,38,6,17,17,17,112,112,88,74,188,188,94,238,247) -IMAGE_DATA(229,45,63,191,97,3,234,251,36,122,22,89,118,122,129,201,252,63,230,181,148,92,15,91,133,130,208,229,200,223,253,37) -IMAGE_DATA(46,235,62,195,197,29,11,144,233,59,11,169,158,118,56,191,253,67,156,118,254,11,60,236,231,253,232,199,24,91,241,95) -IMAGE_DATA(9,74,231,116,180,216,242,134,206,0,170,193,20,255,223,84,222,138,235,253,226,122,31,203,190,32,115,161,246,206,79,13) -IMAGE_DATA(44,123,1,204,229,255,214,173,19,9,229,115,112,248,40,108,139,174,32,199,46,180,192,49,178,18,187,162,207,195,217,249) -IMAGE_DATA(93,129,243,254,254,47,226,232,209,129,95,206,115,112,120,167,95,125,11,194,102,18,159,43,46,240,200,113,196,178,51,11) -IMAGE_DATA(177,248,248,28,44,56,52,3,179,34,63,194,199,33,239,227,175,59,39,96,162,231,56,140,115,25,141,209,27,71,97,212) -IMAGE_DATA(154,145,3,244,161,220,111,190,113,10,77,197,39,209,88,120,28,13,215,226,112,43,63,22,245,151,99,80,151,19,137,154) -IMAGE_DATA(236,189,184,153,17,130,248,245,111,177,60,194,103,26,131,197,127,81,78,201,254,167,129,229,221,190,161,115,254,106,176,213) -IMAGE_DATA(250,159,210,30,31,173,231,3,76,129,161,119,126,74,96,89,7,52,151,255,143,31,63,198,74,251,53,100,93,200,53,158) -IMAGE_DATA(251,173,72,188,116,7,81,201,77,88,228,117,133,168,125,249,210,213,245,87,100,239,222,64,116,117,117,61,45,103,94,208) -IMAGE_DATA(116,226,125,217,25,135,75,246,225,64,177,30,81,215,67,17,94,16,132,208,252,111,177,235,178,63,118,92,242,130,207,5) -IMAGE_DATA(55,120,100,185,98,107,186,19,182,164,110,196,111,255,241,159,3,244,185,26,188,12,141,69,39,120,158,7,243,60,215,161) -IMAGE_DATA(42,37,0,21,231,189,81,118,198,13,37,9,206,40,62,182,9,149,201,129,120,127,91,26,254,226,146,140,137,142,231,240) -IMAGE_DATA(206,218,163,36,44,124,63,243,115,53,23,44,254,189,37,108,72,37,63,218,218,252,151,202,24,122,215,96,108,12,16,117) -IMAGE_DATA(215,178,15,72,107,123,77,225,191,161,61,62,214,246,3,180,238,197,21,101,12,241,215,92,254,83,124,165,203,35,113,153) -IMAGE_DATA(45,56,113,177,21,135,210,154,249,249,191,10,206,254,239,17,249,151,107,189,189,95,32,158,158,107,72,125,125,253,128,50) -IMAGE_DATA(102,5,76,35,238,23,29,16,93,20,134,200,194,96,236,189,170,67,112,222,14,124,155,235,3,255,28,15,120,101,111,197) -IMAGE_DATA(246,140,45,112,73,219,12,199,228,245,216,152,180,22,255,241,249,235,3,202,185,172,91,204,244,92,38,111,73,66,250,141) -IMAGE_DATA(118,164,20,181,33,42,181,22,111,47,9,181,153,63,96,168,143,40,241,205,148,126,164,182,207,78,203,254,90,181,253,250) -IMAGE_DATA(198,190,237,33,6,249,187,112,214,178,196,52,214,247,126,166,182,87,43,255,89,206,244,89,203,15,144,218,242,172,80,218) -IMAGE_DATA(203,43,127,23,96,236,251,31,44,223,7,89,236,158,78,194,206,220,70,116,74,19,190,217,83,129,25,139,230,144,160,160) -IMAGE_DATA(254,95,158,118,114,178,35,121,121,121,6,245,157,30,240,33,113,72,182,135,211,153,111,240,191,254,239,19,53,155,159,206) -IMAGE_DATA(251,148,251,191,94,244,171,1,101,80,95,223,49,161,18,51,67,175,194,78,151,135,143,252,115,241,129,231,69,76,113,205) -IMAGE_DATA(194,36,135,12,252,121,93,42,150,6,228,98,252,166,239,112,190,176,13,13,247,128,142,7,192,31,151,198,50,63,87,115) -IMAGE_DATA(97,136,227,106,105,172,99,129,161,51,54,44,220,179,212,247,255,148,244,148,223,83,154,175,181,206,249,230,180,87,235,179) -IMAGE_DATA(213,106,255,176,216,32,198,160,182,31,223,216,56,96,236,157,160,161,114,169,141,33,255,166,136,161,179,0,7,14,197,225) -IMAGE_DATA(227,77,73,228,253,117,201,196,217,83,39,164,157,59,247,29,28,29,255,76,28,28,222,38,137,137,39,152,219,251,55,175) -IMAGE_DATA(201,100,65,244,116,178,244,212,124,147,198,205,12,159,191,11,126,126,233,169,173,184,113,194,17,69,241,27,80,16,107,143) -IMAGE_DATA(171,49,43,144,183,111,9,46,235,63,69,241,113,103,140,251,58,1,151,42,218,113,177,172,13,237,60,255,255,235,179,104) -IMAGE_DATA(83,170,51,9,182,152,255,135,96,89,136,239,249,89,184,108,203,247,1,63,54,204,9,178,51,107,13,48,217,125,26,106) -IMAGE_DATA(50,247,8,126,126,225,145,175,113,237,224,106,228,239,95,134,43,17,159,35,55,108,33,46,133,204,193,245,184,205,248,211) -IMAGE_DATA(170,163,200,42,185,131,61,231,107,144,114,189,5,191,153,111,187,125,192,134,250,196,80,159,249,225,193,148,51,125,74,231) -IMAGE_DATA(3,172,169,227,143,1,116,13,192,220,53,192,51,46,83,80,149,186,11,21,73,59,80,118,214,23,5,199,183,35,58,112) -IMAGE_DATA(35,188,61,221,160,215,235,225,190,213,17,73,97,95,227,173,165,251,225,230,233,35,220,243,242,246,197,228,79,220,132,189) -IMAGE_DATA(7,207,26,88,236,108,181,123,182,6,203,156,104,200,46,146,255,149,251,77,74,127,149,202,208,2,145,251,90,249,171,228) -IMAGE_DATA(7,216,226,76,240,179,12,59,143,15,204,94,3,156,53,249,247,248,251,164,255,198,140,9,111,192,110,252,72,76,155,50) -IMAGE_DATA(14,59,119,238,20,254,231,71,101,101,165,112,54,96,243,198,117,88,182,210,30,215,139,138,132,123,153,153,153,66,30,39) -IMAGE_DATA(39,167,65,255,125,140,113,195,218,247,140,233,160,6,173,190,191,90,25,198,210,164,121,228,113,165,241,64,171,14,82,72) -IMAGE_DATA(247,246,154,194,93,37,63,110,104,12,48,140,143,189,166,10,107,128,219,120,142,127,17,59,95,213,230,55,180,6,56,102) -IMAGE_DATA(204,152,167,191,219,242,229,203,73,94,97,33,230,206,157,43,172,21,45,89,178,132,238,251,197,166,77,155,64,227,31,126) -IMAGE_DATA(248,161,144,70,199,128,21,43,86,216,228,183,97,241,241,181,240,72,109,174,212,34,163,86,39,171,174,134,96,46,247,229) -IMAGE_DATA(122,40,201,88,114,254,87,242,223,181,142,29,106,101,12,249,2,198,241,129,219,68,242,209,174,201,36,108,111,152,73,242) -IMAGE_DATA(244,76,31,29,187,199,142,29,75,54,111,222,44,240,127,218,180,105,228,221,119,223,37,73,73,73,160,239,33,210,211,211) -IMAGE_DATA(17,23,23,135,113,227,198,17,154,70,249,79,243,90,184,41,102,131,133,111,150,184,54,199,63,48,151,255,90,198,7,107) -IMAGE_DATA(242,159,245,219,36,134,96,136,247,67,227,0,27,168,31,254,206,146,183,204,126,54,193,193,193,248,236,179,207,4,254,211) -IMAGE_DATA(191,148,255,188,13,0,59,59,59,33,208,56,189,71,211,40,255,233,95,75,232,111,11,24,226,180,90,92,233,218,26,186) -IMAGE_DATA(88,58,93,154,199,22,243,255,16,126,28,160,231,15,167,79,159,78,92,92,92,72,80,80,16,137,143,143,199,238,221,187) -IMAGE_DATA(97,111,111,143,141,27,55,10,113,122,143,166,209,60,52,239,96,235,108,42,88,249,111,237,186,173,145,46,205,163,133,255) -IMAGE_DATA(74,254,194,208,24,240,255,7,61,61,61,200,207,207,23,108,255,69,139,22,145,47,190,248,130,250,255,36,58,58,26,212) -IMAGE_DATA(15,160,215,52,208,52,154,135,230,29,194,16,134,48,4,107,225,255,0,80,219,106,35,0,0,0,0,0,0,0,0,0) -IMAGE_END_DATA(4768, 3) diff --git a/uppdev/AccessKey/AccessKey.h b/uppdev/AccessKey/AccessKey.h deleted file mode 100644 index 45e0c0206..000000000 --- a/uppdev/AccessKey/AccessKey.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef _AccessKey_AccessKey_h -#define _AccessKey_AccessKey_h - -#include - -#define LAYOUTFILE -#include - - - -class AccessKey : public WithAccessKeyLayout { -public: - typedef AccessKey CLASSNAME; - AccessKey(); -}; - -#endif diff --git a/uppdev/AccessKey/AccessKey.lay b/uppdev/AccessKey/AccessKey.lay deleted file mode 100644 index 217561825..000000000 --- a/uppdev/AccessKey/AccessKey.lay +++ /dev/null @@ -1,33 +0,0 @@ -LAYOUT(AccessKeyLayout, 200, 308) - ITEM(EditDate, dv___0, LeftPosZ(56, 140).TopPosZ(4, 19)) - ITEM(Label, dv___1, SetLabel(t_("asdfasdf\a\001[= Test")).SetFont(SansSerifZ(20)).LeftPosZ(8, 188).TopPosZ(28, 32)) - ITEM(Base, ok, RightPosZ(90, 80).BottomPosZ(212, 22)) - ITEM(Button, cancel, SetLabel(t_("Cancel")).RightPosZ(4, 80).BottomPosZ(212, 22)) - ITEM(Button, dv___4, SetLabel(t_("\001[= Test&asdflkajsdf&asdflkasldfjlkajsdf")).LeftPosZ(8, 184).TopPosZ(116, 188)) -END_LAYOUT - -LAYOUT(asdfasdf, 400, 200) - ITEM(DataPusher, data1, LeftPosZ(4, 64).TopPosZ(20, 24)) - ITEM(DataPusher, data2, LeftPosZ(4, 64).TopPosZ(48, 24)) - ITEM(LineEdit, edit, LeftPosZ(232, 132).TopPosZ(68, 19)) - ITEM(Label, label, SetLabel(t_("Label")).LeftPosZ(368, 28).TopPosZ(68, 16)) - ITEM(LineEdit, edit, LeftPosZ(220, 132).TopPosZ(96, 19)) - ITEM(Label, label, SetLabel(t_("Label")).LeftPosZ(356, 28).TopPosZ(96, 16)) - ITEM(DataPusher, data1, LeftPosZ(36, 64).TopPosZ(112, 24)) - ITEM(DataPusher, data2, LeftPosZ(36, 64).TopPosZ(140, 24)) -END_LAYOUT - -LAYOUT(TestLayout, 356, 76) - ITEM(LineEdit, edit, LeftPosZ(188, 132).TopPosZ(4, 19)) - ITEM(Label, label, SetLabel(t_("Label")).LeftPosZ(324, 28).TopPosZ(4, 16)) - ITEM(DataPusher, data1, LeftPosZ(4, 64).TopPosZ(20, 24)) - ITEM(DataPusher, data2, LeftPosZ(4, 64).TopPosZ(48, 24)) -END_LAYOUT - -LAYOUT(TestLayout3, 356, 76) - ITEM(Label, label, SetLabel(t_("Label")).LeftPosZ(144, 28).TopPosZ(8, 16)) - ITEM(LineEdit, edit, LeftPosZ(188, 132).TopPosZ(4, 19)) - ITEM(DataPusher, data1, LeftPosZ(4, 64).TopPosZ(20, 24)) - ITEM(DataPusher, data2, LeftPosZ(4, 64).TopPosZ(48, 24)) -END_LAYOUT - diff --git a/uppdev/AccessKey/AccessKey.upp b/uppdev/AccessKey/AccessKey.upp deleted file mode 100644 index 8cb5aedab..000000000 --- a/uppdev/AccessKey/AccessKey.upp +++ /dev/null @@ -1,40 +0,0 @@ -uses - CtrlLib, - Web; - -include - gdfgsdfg; - -file - test.js highlight js, - h.iml, - bak.tpp, - bak.tpp, - AccessKey.h, - testing.icpp, - test.key, - translate.t, - main.cpp charset "UTF-8-BOM", - test.cpp, - AccessKey.lay, - [Content_Types].xml, - test.zip, - _rels readonly separator, - _rels\.rels, - docProps readonly separator, - docProps\app.xml, - docProps\core.xml, - xl readonly separator, - xl\sharedStrings.xml, - xl\styles.xml, - xl\workbook.xml, - xl\_rels readonly separator, - xl\_rels\workbook.xml.rels, - xl\theme readonly separator, - xl\theme\theme1.xml, - xl\worksheets readonly separator, - xl\worksheets\sheet1.xml; - -mainconfig - "" = "GUI ST"; - diff --git a/uppdev/AccessKey/[Content_Types].xml b/uppdev/AccessKey/[Content_Types].xml deleted file mode 100644 index 6114a46a2..000000000 --- a/uppdev/AccessKey/[Content_Types].xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/uppdev/AccessKey/_rels/.rels b/uppdev/AccessKey/_rels/.rels deleted file mode 100644 index 3030df488..000000000 --- a/uppdev/AccessKey/_rels/.rels +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/uppdev/AccessKey/add.cpp b/uppdev/AccessKey/add.cpp deleted file mode 100644 index 924994bf0..000000000 --- a/uppdev/AccessKey/add.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include "AccessKey.h" - - void test() -{ - if(a( && b) - { - } - -} \ No newline at end of file diff --git a/uppdev/AccessKey/bak.tpp/ESESTEst$en-us.tpp b/uppdev/AccessKey/bak.tpp/ESESTEst$en-us.tpp deleted file mode 100644 index d36e2c9d7..000000000 --- a/uppdev/AccessKey/bak.tpp/ESESTEst$en-us.tpp +++ /dev/null @@ -1,49 +0,0 @@ -topic "vxcv zxcv zxcv zxv zxvc zv ho"; -[ $$0,0#00000000000000000000000000000000:Default] -[{_}%ES-ES -[s0;i448;O9; asdf-|safasdf&] -[s0;i448;n`.;N1; asdfas-|asdfasdfaasdf aslkdjf alksjdfh kajsdh fkjah -sdkfjh aksjdfh kajsdh fkajsh dfkjash dkfjha skdjfh aksjdf kajsdfh -kajsdfh &] -[s0;i448;n`.;N1; vzxcvzxcv&] -[s0;i448;n`.;N1; zxcvzxcv&] -[s0;i448;n`.;N1; zxcvzxcv&] -[s0;i448;n`.;N1; &] -[s0;i448;n`.;N1; zxcvzxcvzxcv&] -[s0;i448;n`.;N1; zxcvzxcv&] -[s0;i448;n`.;N1; &] -[s0;i448;n`.;N1; zxcvzxcvzxcv&] -[s0;i448;n`.;N1; &] -[s0;i448;n`.;N1; &] -[s0;i448;n`.;N1; &] -[s0;i448;n`.;N1; &] -[s0;i448;n`.;N1; &] -[ {{5000:5000 [s0;i448;n`.;N1; asdfasdf] -:: [s0;i448;n`.;N1; asdfasdf]}}&] -[s0; asfasd [* asdfasdfasd ][*R6 asdfasdfasdf]&] -[s0; vxcv zxcv zxcv zxv zxvc zv ho&] -[s0;N! ,asnmdf asf asfhjd akhjdsf kahjds fkahjds fkahjds fkahjds -fka hdfkahd fkahjds fkahjdsf kafhd kahdsf kahjdsf ahkjh asdfkjha -sdfkjh asdfkjh asdfkjh asdflkjhas dfkjh asdf kjh asdfkjh &] -[s0; &] -[s0;i448;n`.;N1; zxcvzxcvzxcv&] -[s0; &] -[s0; los&] -[s0; de&] -[s0; han&] -[s0; se&] -[s0; datos&] -[s0; fichero&] -[s0; realizar&] -[s0; Ajustes&] -[s0; simulación&] -[s0; una&] -[s0; indicado&] -[s0; generales&] -[s0; Datos&] -[s0; Apartado&] -[s0; Localización&] -[s0; geográfica&] -[s0; &] -[s0; asdf&] -[s0; ha ]] \ No newline at end of file diff --git a/uppdev/AccessKey/bak.tpp/card$en-us.tpp b/uppdev/AccessKey/bak.tpp/card$en-us.tpp deleted file mode 100644 index 4963f26ff..000000000 --- a/uppdev/AccessKey/bak.tpp/card$en-us.tpp +++ /dev/null @@ -1,2842 +0,0 @@ -topic ""; -[ $$0,0#00000000000000000000000000000000:Default] -[{_} -[ {{10000>1504; [s0;= -@@image:2638&2477 -فǜ읇Շְ񎨖ŮŅNJڅʒי魕 -󦜶戰߳Ǟɐɛĉ‰„‰‰Ј‰‰ -¥‰‰„‰ݔ⏇Σɀ͢هŰƟ -֨ሔȪДҟ߃Ê婀Ǖܑߔߕʨğ‰ -ѪɡΩڄʥҟ߉⯈Ǿ럯֬՟Ϩβ‰ -ðѦؕȥŻмÿݍƒ˴ -żĠनݱἷǩˑΞʨՌ -žⲆ򄨾ĊШϘ́ل؄ӄǴæǟѲ⥔ -⿌檑Ƞļ҅΁첂ń΂򕠟ҀȊ -ωҮ̬Ԋ‰竏Үڒ톭ˈԿݘԡВ鐪 -ԅ厠抂Վ꼵͹䠸袝‰ -󵝇νȁ͒쐐ҚłʻԫϻΨɐ -ˏ֯ח㴜´‰ȫȜ΁؈҃ꥨ -̓ᵈ釨·ݧ䳛ц俅䶮쿁 -‰è̪͌ͅʨˬǙγɘ -خ᯳۸̗䠾ʲػ𭢀虘忣 -􋐨ҕ鋀Ⳓ񅊥ƒ -Ô됧ğġ臘Ăܜ쥵ޭ˾ -򐷝巡̄稵̆ߒՐ򥿈ϗ՘ɱĈ -򿧹မŌϫˡ䃘⛑Ɖ -»ҡȌہ䆨ćȠ…޾́۵ѪҤ‰ -ƿÚ͵ߞﶛИãƆ˚ԇׂ֮ⷣ -䶢ćˌÁՅۣ·Һõ -ԣʮ䡄ޔ륫ڌ𝒤҂ -̀փԌȰΡЌę»ʼn׆Ղґه -̐כ󽑹Ưɪސަ澗حﲐ -𾵜Ż䜫Dz폦۟εɐݽᚗ㒹ئ -͏һ͝ڲ؍ɸͺ˺縼򲙃ٍ෪ĴʣǤ -̀䉶ΣƑܷՄܷɮѱ֨ -Њ’ݩŐ՛Ѓуʑׅ췰囤棡΅Ʉ -ϴѴŪڽӮ㍷đ搳ܜ߄Ą˴󒙈 -ȩ꽱깤潥ỵۢ٢񖞦ަˣ֧ךی -ƶЁЪȧԀΕρϗٸ׷ -ˢʛƲȓȣ怌ժ’Ӏ -ߔᗹϬϵöƴߕ躹ݵα -辴ӥÕ̹Ʉƫ䢦¦őڨɤò -ɝ۞İǒٌꋘَߓڲҎ -Ȁ֡Ɣʒȅ͝翎򣎇ۋ𮞜Ӌي -դάⳔߠηڞʹˢƶӍ -˷拉ش㷞Ω՛Ώ׻ -燍ƋŁŲ뾢֥ݜڸߢ -ڬò૊ޓӋ߸ԣɵ冴ӡֲϠ -ǍɿˏʨމŅ份ŜЊȥˡЏį -ڤ׺˸˘ۓʴ򩑯Ɉ -ȰٟӰݩèهݓړ -Ȟޒݐߔғ伪躪ޜܗϊǛܑ뺳ڰϹץ -ȼێ佂덝ڥϏɒ׿⾥؟Չپ -ٜ䕣ӏƮݒ󀆼ϊߟպ -ƥƛ⍋dž퍋æ†܁؀Ưƣƭӝٞ -愌ȟ˹ճ竏洏˲ːϒ -вٚ᭩ߚ븧ϤѤʅܻDž⢯Ԕ -Հɒ̲Ʊ騂ɚŐߔȗϘփܚʊ -Ћʪۤߠ䷢쇒ʼۣȭĖҶ -ႈؔɸθȾ稞ʤ۽ꉹ -̑Υ󬷅Ҏ깁‚梠Ҡʠܙ -̍ǼʬƑͱ߆č鱄ឱ -홧݊堠ޤߒȾ풖쒀Ք̈֒Տπ -액ΓDz폧۞̴Ψ廁ݗױ櫲¸͋ -ωΦȆ˘Ƙ̞ԙՓĹË⮚Ϣйϑʩөꣽ -էɴۄڋۚڋȡ孑۝夙 -ԫ̯ހѷС˩ī̿Тҕ탮Э՟ҏɝʅ£Ż -봿Рչ٢쮋޹と鰭п㛠Njɏ󶟞ȅ -Κۘ뵌ف巠ʉӰ攊ޟ -թ嘢ɡҟ仦繊б֝ھӽ -ʹٞ߹곽ܵݥٯȤۙЬߑ -Ÿ˙⫡Ԅ̦ؓʏˢŞ߉ʨύܘσⲏ -㠸ˣȲх΃ߣ̼ޖɚИޒߒݓ -ᱬخۮՈ㼘񬽁ۗդ옹֎ -֝™멼茧ܕ򌦨ՇНՌՌє®˩򾚲ն⦫ -ɖթݵେƆׇß۩۞ʴ -ߕɔDž⅂մڂ篥ϒ䨔ϔԜݭҧ -ЉҕˤȚȹӂȺηݙ齵۵Ʀ껴 -ߘ鞕џѝ͊ĴکީɘĊգ -ѕñحцԿҿӗҟܥõ̲㬸ϲʘʸÝ -ӰҬ㬼控۳ϭʺ׆Թ⾩潭DzᎶǹ -ޢȟцѱʑۦ -ƖՊҥľ֘ܘ諨򢊼۶Òɺ˓օ남 -ցЀлΎ㎌šèヺ㰁㦭™ -߂Ù娑˵ϐŰݵޱ₻ -ŤȌ庵ל⪹߻򁯱좿켾ڒޘݔߗ -…⾄ͨߢߐ둰ƠЈڲƜʨߗҿŒЮ -͖ρʿߓ탷峍פצ˒Դ -꺳욝͗뎋LJӂڱԠĠøа՗ -݇ӽΧ税ݽ͵⸫ -ԸǑם稼юϮ㮼ᝓږŏ뵞ˡ -䃯ѷݨᛢ쓝ÐѰʡ͇äˍÚ -ؑݲ·ƻͷ歋Æƀ -Ύꦆ܉Ŀгꢠ쯊֜顳 -ݩ䂹ܗմȠǁ眙洣۹悽 -趛ձΊΊݕՋܵƛƥٶ -ٽ潁ђêЧ‰қ԰ -˹۹ӎ´ꁹ—ߜ݀Ӱߖݚۼ -¦ޢܺȘ鏏ԀԳسннصӷ۽֔ -ׂߥĸلʑߏ -ㆧ§Դ漱湙ױݑ긧犮ŷɂ -ـ门˶뇥ȞڨԪ 鰖˩ȨѦ֢Ŕ -Ӳ֨ͥᴽҼ΅ᣄˠ얐àĶ -Ɇ˒ʍΏΎΛϋȚ粆顎̫́὚鸊 -Λ݉󿟢ޔї٘ٱޓ͙ -͂射۸Ὕ˩ж֠ϋϊ˒¦ -…Ĕ髅έԬžǘߤퟥ䜑̳Ր߈ˈیқ -ȼ⮉ذ϶ޕմщ潧晓ȟ̋ -֌Ƅdž뱇ʩۣ݃ݼˍޓŐʻή -ڰ¦ƝӽŤ֝ϿĤ -ܶεʷ֤׹Ʒ٤Љ嬧 -鵢⥔ӴؠʣֺєȱƗȳߡ -ϙ֭ڮ؆ƭ̧ؿ՝ȏƅܖšûڑ͈ذ -۠݋üݰ۲Ȫޗ݊Ūי֛د㨘쑨ʙ -騿ЮڱВնٱپձѱٱåΩѥ趯ܒܜ -ݞߞ䶉ʗꖇл -򋻰틸Éؽ۸գʊļρ’ -ߔݸۘޞޜͰԘİ옒͊ۏф܁ȳ -ĝԌšŨݼڍڲӆˇ -ˇˇᔜƸˎѾѾѱե֩Ή檱͛ιߝ -厄剶裔ۀ̖񈪠Ҫ¢Őġ -ʨՃɃلؓϸ˒نӍ -צ뮥˹󓜸Դ˸̍ꏌё취ݻ貗Ԟ -ÚΥ蘢󢛮풬܀隬ր讨עҴǁݩ͗Ÿ睄Ýܷ -䊁鄝춻ދȕӝמƪ뮏̤ޑ -ӼЯʸٮ𼭱ļېːߍĆߛ -‰ڵǮŐ吻Ţᡝ܂͘ħ׀㰴چ -ߖ럼Ō§ƍǎίទݸ̷Վƴ -Ϡ˸Ӊ۫㿪݄⛻Ԅœ󷧗 -ƛڶֲјðƓӰ͐էڅŧԒܠ -ϣ佔߁݆؄Քݲ؉ᕵ헀ڌ -ܬ̻򵱉֊߃ڪܔĞ㾽ʏΏΌ -ķ֑܇渨۩Ԝǔʞ -ثꄑ߶ᜄ핽ڪӆ֝ʎ뫟茯 -ű囹쪢݃휲볜ƳƋ‡Ǣ -ۘ跀䋅´ى퐅ػ̋ĕضґޥĖ -¤급͋ӆ҆놓▙ĸã -讔҇ѢΨ擨ܾΗݪδԔ姇ݶũ -ƾ㨡ӣš׊ÜմթijθѐŜዹô۽ -ۃ򮃁ȇҨƙʟІܫ -‰ؾ߰솃ɺͼšإԑ˅粡 -ڰէĸ渔ÏȻҼʟм -ԥ㹮ԤŎ璞Ӻ𔏖ջ쨸ؘ櫦ѕǓ鞚ڥš -ޒλֽǓ钌Րޏꈱ¼ؘՋ쑣 -֕ʫωۅȄʿήΐܗʍÕ -ҷߡæǬ󟄨Ш԰ꘃ׋ڟ -˾Ґ⡫ЪʷΊƹò˥򶾲ձן -ԛظ滱⻅麋흾ٴި͛ݫȇψĂ -󲒆ҎڿЀ񏊰Ǐ䄫ԻҨꖂϐ -̷ܓې쓏擓Ą̛ܼꇓ -ԔԃťҮեřбһܷDZȂۘ -ح՟ܽ갧ᮦ۪݃Ӣ -荱ވǷ̗ڑ֞̚Ɖ݃ -ۑΦۤ烼ªҍ灥dz -ܼ暤֏ᒆ︡߭݄Ǫܡũޥ -튘򀮘ϼ὚ف᛻ʎ͐㲲ޚ䇲 -ឦȩԍВʔՌ΅ߗ -ĞɊĩؕχҨާڸ񭷈͍󍋳 -̴՟Ț歳ˤƼΘ̣̇Ƒ򹢹Ǥ -ԏť尹©ŇŎ톾ǻ˩Ʈ -⪧ӳۨ鷮ܑ݂ڗŚ˴̦؃ -лöȖï䦷ѲÇɅñ’Ў -Ʃ巢̫Ⱦ¡ş㍶Õݥۅ۹ۢ㝙ȚӒ -ϸ⌣ӍťԜ⺍ݥ֠ -Ӎу׏ɥ忞ΊԘú -ޙØضٵעɵ֊䅘߂Ȅκߐģ͍ -Ĥ򝭉żԪܹ͒쇩Ӆ﹋Ʒܔؒۮ⬘祭 -֦؝ñ¼̓èܻڤЌތ׍뺱 -騊ۻšƛ۪ƹضױ١Ƅէ -Ή㍏Ǜη˃厕 -䃗³韲篕Ҧ҈ЂɈɒЉӒۆ -󦲓Ѷ繩ɦӲ٬ر뜞✕ -򰜱ɭڳäחΊԎ߲ދ̗ʷ -ӱ׳׻Ĕ帱췦εޟ׺ڰ -ޥ崕ı⭶߈Ȥ֑۽廼 -쁒Δɡٌ턜Ռɩї̻Ү -˲̴˵뜘ɘքҸʗە -˯ۤӈɹ璕떆ᮾ֕ -žԧؐ؉ʩؾ݂ݗ٤ -Ӕʼťޔ¯˒Ǯ˵ן֝ǚӓĔ -°ִ麐ҵȚƑßã׎ۭ͢񯠒ބ՜ -ſ翣멊ߦާ籟ҋЫ֑ŴҺځԬ -ݦʗҦι̺ηޚ庺ڶ囗 -᪻齑ڦӒ棙㚧Ґ㗢ڭ -ѧԝռܿӮۢڣۉþ穊ߡ -۔Шֱ͈ŷ̽сۅ몤延ا⿋􏍑Ċ -ǤĬߣ櫈ׂ˘ښ͑׿ې榩˴ -㾼ẴᾸẨ်̃ɜԓؕ┼ǩᎦˌ -ռѧЕݝէުЊ -ƎΊ·ןᰂ좐ԣǀ -ψ؎ψ븖뜔唔ڲ̵ڦĐ㉓ȸܴ -鞌ý̚샤ʩԶ˪˵⊾̏ś֊ -ܳէȍƸΌ嗆ĭ⾘ۺǒαǪƱǨ -ޗ؊Ŷ֎󜓝ۿяՋʓŢݰۂ -٭ȼ򾕜ŶᕬÙʱ嬇̣̇ -᱇׊ҝØܩäũ땕ΐȃАܱձ -ǎוΧ؜Ժ܄ƱDZѵ˫Ԭ -줙ۘ盤֮򕎐ʠڠ陀ᅰՌԗՌӐЁ -շ؂糑ՙث븬Üٯ˜ș㉧̤摱ˈ -ԗݱ뿨밊ګثǓƷƉԱΌ -Ӕ·ĩ좽񔿠›󾱍ߔǫ⿊´ޒߐ -ݺݒ̌⍩ߢ줇ʭ˄ݜֲ㹾ɘ -Șǥ͇ӦΑԂΝꮥԽۣܘťѻӦ۪ق -ɗԃ夛˝᛻ƻՓݕӼճԞꝭïҘڮ˘ -㓥ϼ욆߀ѷҶʉ񑆲Ӫ٢梮ا̩ڋ -Єċ俉Ӊ֔ԬԬΟ񸅤҂уʼތ݂ -ʚنṌشڲ롞ۋťܔ͇ -±˻ꨬ߼ڳɥְݬضаܰ -䣊͍ڪ񔢆ۘìߚ㎡ĩր˂ -魐ˊĞ㪮Ӎ󸺓嶓֢ᔤڼ㾤ၩ -қ镗ߑ㷴Ѵƥܪר؝ƅԬԥչӵ -ž͙ˆꜘLj췦˶۩ӲӢ癲ӻξŅƾ -ƃњ˶‚ѱݔԢ⏳֔ɤݣ̼ -ψ߽ȸƺ廝̚ǧ̇ڲ홚ق -ڃҖޡݷť͗׻ȉӆ¥ռ -ԝ㭚쭹կȍƍ·퇏ΧɌحؿ -ɮ詇؟Ѻވà٬奊匢 -ߨ񺈿ϝߺ˸Ʀیɤ򤆍̠δ垑 -ٺ֮˪ܣπۖŴ֑˽Ѥӹ۵Ӷڻ -ߘݑˢ޲̹╛ݪƀ곶ŷ -ۡ䆦ӂ㰭ֆ룝밆žũՀžΊŖ -əƴøì霨ڎЬ녡ӡޝ -ݷԼ޻ŴԔɵ呞ʣ缕ϊԞٓÅ -ǽϷҾ̹ݫϕں̖،댽Ŧ -ꇐȶ婐źΣ䮤ف˒ǔ˚ɗӥئب -۸幆ʜ՜뒢䙏ƴʫէᜤ쇪ߧ -劯ӜќץڰҭƁ -ӂݒ埣΂Ŷڋ鑰ܿ‰ -ګڤЪψ썟ޙ¯õҲʙٓ阎ΏҦ -̣摫˞ﺬ⡾إž먊̋ -Ό苪򚼻Ҷ˜̸Ҟᗰ佱җ૥ձ؉Ôߨ -ɉٴǡ§䶂݁ǽ鶆ܫ՝ -ʛ蜩Ӣɸдݷ˙ײÀμ뙗ǘ -᯲͘ઘ΀ӿߥӀѶДۊ -К戞Ʈ·Ρˢꦓݍؾٝأ -ťМգў،쮺ʤӽսãΧ֝˃ڡ -櫻ҭ҈чޖá䝲֑㌑Ӕۨ⿇ֶLj -ݪƾ젂Õ܀ċ®΀䨯‡ѕȐ̏ -〾ߣʿ󭁇߼֩η°ܲ̓ -˲⍝ɨƭ㐉԰òÅƑߝӖ͛ -徧ʲ홊ۊ΢ɒšɺ -쯪ǖܣԼحثإϾՉ꩞̿כӱԜ -Ȯ⠫ޕƒdzɃ򰪦ӟ՜܎ߠ̍⭈ -ؘ̺ǩ񀇠ڀǁղфƵɶݜ꾥 -Ԧ̙ưƃۧɰˈ̳ضڳΥ -ʮЗ乲ĐǺ뇻Ɓƺᬝᛐ -Ǒ͹󦱩ۈ߳ʺ鉅߄いԼ -ŭԃ광۟ϲۭ˄ԜۖŬŷɵ -ϴ۟ϊߗ̤ߔԬƄݦ従ҟdz̢Ō -鹖ޒ֪秕ؤܹݗ٪ -ٷ݄閺ꦥǦ߰ -͊αɘ캚˂ۈӜ虔ɮٺ -ܧƨ똨΢ӖòփټѤ -ռťⷺ牭ŇՇ̈΢Ӟڹ -Բ黩üڣۏқʓ -Ӑ٢֩෷񟅤ʍʚǿוЛլӣ㪆޳򃁆 -܌߃ψއӒ뽯龐ΰ؎śҼdž擝 -ֹƫΖېɑſՍĦǑݜ߷ã -ōȂðÑΘ㑌㘙̗ݨ␌ڔƺچ -Ĥ؋ءŲϵŁžհ൦Χ -򓲿ƙ֨䲱ѻԝ֯Ǔݖ器ۊ𬾥 -ߖ›ҭ⽲ґ晷⛃֩ -ʐűʺÒī纗ķ -拒Âة㼛͍ķ⛴ꎌӺ狞ಷ𘂴 -ь㧖ǡӛݳʐ̤ۍ֥܋ˑѪܨ -α°㚗ôʲҶЧЙ -ݠՀ힘こ۩뺎ՅՑ؜Շԓ -۰ّヵ愞熴މ⺻ᨛұݫ -՘ưҟ㭠⯉Ʌш׈ۘ濅޹ٟؐ -麗ܯ⟛ߒ߱鑅ĊȆͶҡ޼ꗤ -؍粦㒶ݧң۶¯ؑLjߠŞ˸曵΋ -ߞ篛ﵟ֝Ԝ㩝꬜ՑԸ撦 -ڧ㢺؁ƶٷקᝒ̓ТƗ˛ֺΖ -؇ęԼݧàЍᇆգڡÃ᪓էΈѕǴ -ű剣۲󃔩דƼجʩ -Īƺʱϋ余✍Ďޔӣ㪦 -ܒ՝Ԭԩäٕ캥Ʈƍɬ -όɃ緟ֳЊDŽϘ쪡׹ -򒙾ގġĵИն۫ާʷ -̵ȷ۴ϯϷϵ϶ϔȶﻷ̧űݗߒܻժ֐̼ -ש¤ŅƁч·DzЉɖߊ١ؒۅŇ -ڝֱסұҕ䟵ֶ͌լ޷뿳ߛˆ -ұԬ𑽪됊ԾԊ鍦ߴ몶ʉ -طԄƍج̬лОڱ؍ϑ̤Ƴ鏣ї -ǥۏ䯇߂ڀ᤟ћߏգюͽԬ -۵嶡嶷Ӯ鼤޽ڦ -ΤÓﴘȔ΄𡙈􈗚ƅ䪔ɔĎڜ -γЩǖևښՈ㽌ҽ미 -Ƌบ޳σĵԭٵج -Լ˼駹茁Хŏ -角՘߄ձҠݴ첅ۡʴ‡侲 -ɼ֩Ϛڅ㟨شՌɰӬָĪͥ -ɱϸѳُƫΏ˘ -ܽ溹┞񏯄떍ÎȁˆʝÊ޻ -헒ݗ˰ΓɽԪ̊ƦᙐĊ̗ -ÕڸũŸŐ闲ڤ葸‡ضư㭾ބǍƚԼ뺯 -޶۱ܸ﹜ԱϮ˭ڽխϪ -ξϚ߀٨Ґ֩ߺ؟˚ξۆ૘ -ۍ㫥ؤ䶊ήӹȱڒ߽ط -ӲѡȦB®󡳹؀ز㬗ǀ -󆠟Ѱ͵Țջ滖𩕺ƯܪǗ -자Ϣ闝ٺß㊭նڗڮںהּ -ႳӸ̮𴶟Αζѳ̋͊煈 -“򯧠̢܈dzȇ򿚊㕠-ۏՌᝰρֵǨ޽݌ջ˱͒ڼ؟۟ -ϫݕڋ௨ī㵕ݧՔʎߠ۠Ŧ☛ہ -ثݎϠ㟟ؚصΨֱɐɿߗꆹ -ΛľЈοԔƻߙ她Ȝ -ԙ֗倿ׁ݀ԭڪŅ -ά͏ӝѾή컨ܼDžΕ -ݎԹѣÔȂ乼๼݊̓ᡩ̺ɶ -ćϴѐ䯸ٖхù˿ð֑ˉ -ιη׍ѻϾ渟㲏љ㐾֮ -Ɵ۴ը۩ƾ۝ نòĴ؇Ůɑ -͇҄Ӕݾ⃣اÏ盤쥒΅ -Ƴܢྂ䇀¾ѫˋЄƒΒϭ݀ -އ컀πَ﹥ -螞⤶טȎӒߔݵ˾ŅÔ葜٢ė -Ŗ΅خƈ͕Ӡ貺ۜϚ -۝빆ᖶσۑǸȹ񷭨 -֥À߁р冤׀ޒ˦տƛ -ᶗˊ瘛إⰶ퓶↉ۤᇪ -ø⃣󕻃섙ۦޡĮуȸǑ -߲֫Ï쒞ʕ٢ދ -̈́ՈׁԲπʴ쬲󆍡ψ -ɦٹ֜ήȹ՝גݢʡȕ􂈖۶ˌ⣋ -䃝䜋ҹ޳ڞ񖐚̇ѺӘߩĈ繞˜ -ⱒ򟍏ᄶտŅ޹釞蠿뿊թԱڳ棫 -ؼ֋̋ů˥ۆޚ۰۪Ǐ -⚟Ɔ߂䂽ߎԴԋޏ -ņ՜塭Ͱ̟왡ӎë屜Ӝ漮ݍ嵣 -шߎϪŕދЩذ㐝ԯ -㦤쒽˟١蝰홒 -͇Śݏ蚒ވ𡜕ȉܬƯ뱥Ɩ̮dz߆ -ۊ󬐯ȼޢ󼭳ϱۈ ԙڌޢ뾴ٽ -򍄐ؕãչ靫؀͉ʭ⁛˞ -Ǖ䡪ֈɠ҇Φ։؃۽Ў -ʰöƺމȦѶ٩дꊏ -ޜŊҹݽ͊ݧ -χټȐʃО߫ރہ忩Ϭ -Ȯ䷊ڛׁ۫ꛦ򶐫ހ騾ʩ˛ -ȫԓۻĶ꿐ڳ»ދ⣮ -؆ђˠĖܾΑΈٿ栐ٶدÛЯ -┌܁蘅Ѓ٠މ߹͉բ綵ٞՙ -ӝݞܛќՎǗߕԷԱȱԱձ -Ɔާ֑قж󋈀ƧҨʇæŎأ菲 -ŰФڷֆÀжϏߚŃǰ᰼ϒؗ -ۺ֊̭ϛՓȔ±ĝʥѪ챐 -糈⩪Ԯҗ̲Ðћ󷱑ܽ -ֱݓω׿ٹ㵮؟װԅ†ᕢʳǿ܈Ʈ愑ՠ -⤮ףգĉç䞴弋Ŷ̔䮀ᆭɨ -빙ў݇ñнܝḓ -ܹȦڹ諘ꅁĴ䧙ĵ仆݃䷣Җþ瑕ϧ -̓ژΆɺ纏ꤸɫ鶳 -֖ݿÏ߲ׄ硷Ԯ齯۞𛀴ہ哤 -󇀻Ԧİ宰մыЬЕ۠ -ѿΠŷĶ̄Ԕڃ菌ňݡ䫝ݷꛩӊ -ә迆͜ƧŃ鮣鑚 -ʬ، 翮쉪⺷۫ض񺪹ݙֿך֨Ùӓޒ -迪LJس׬ۦ̺ܫʱܪɘ܎ր -݆쌱휿NjȬǗ•󈹐Ø۪㨾ژ煌罿 -͵ׂƪþܗԱᲈ׶´亇݃󊩞鄯݂œ -쪙ݨ«Ѝٹ촜虚ﺒ۱ٶܺó㲭㳭 -ˋݗݷּփɧ̳ŵ˝ȏ߰ -گֱɦເڍӱϏ -֠ދ̥ۧĺٽܰƚƋ罳 -֛⒵ˠ诃ﰴͪÒ±ؘԪ¡® -ٜөò趕Ŗɦُ–ߡǗŔ -ľ˜ؗӢэӦ䐺֙ -򲘐Ŗӭ爘܊߬Đ򮘋妝훳훟 -Ǖ؇ÆǀЩ݃ƽ븲詽ٳגތ -γ˝ֺ􌮶鿶ԩɩءՈܲ畵 -Ϫ߫ϊוۚӟ̶ۂĭ܏ѽ߅ތ -ޕ۶Լȇӷڼݨ֗ň۽ж獾ڦۉߙ -֧ןٵ拵ʅܗ˄ƦݧЄ񮐀ȸ̊ -߅ۀПĬԣljڽ뒕ʊҮ˥ԍ򷾔Š -ʥ¶φّ䴥ߛ׬ݬ׮ҴװӤ -۵ŗІۯܷȍ⫵ڭ篶ٳך٫̢ˡ -ඐʩĒ،ڙ٪󲕐ȇژà -̉ߩ쫘á욠⺒څʸǷÕ䳾Ӌϐ -Ԭטۼ㘬儢”ֹԺەѥΪ -Քݫ姟πҪȕϿ˵ϵ⋊ㅴ޴䷀ݦژ -།ض۳‘܌䇓躩 -۔릣ڧ򌒽ݨٴ뙑Ɨʑש㖠އ -ƭ蜰͓Сޮĥĕ׳䡵ΦҮڜ䔓˅ -Җ΢ׂҺ҉𼞎ŋ¾ȝăӱͨˍ -׾ř˽羠խט߅כ -ʹߚч䮁ȩĖѼԳ͛ðјő -‰щױ۰䞁Ϡѹƙ¼쬜λӝƅޙ -ב˜ԣ덐Ƈ軏ۊڏۦԯϮ -쬦ύ־߁ë㟂ⳠꓘՐۦо -፭񥊛Ā̀ۡ͊ޤɺ싮৯؆ڍȦѦ -֥ߊ虜ьǖⷂ䎗ꗨӺ -Пςکၬ׍إ׫Ē˪ڥګʁҩÿʥı -҅՟͕ܺԲƲԢЬ¾鶾 -幄ͮ뉋幽ßݥ󱟾售נؠ -㧯ҫљ󹒾ѬғĒëϳȜ쬾۳ʴ -ݐǸߪƺޙӽֹŕ޵ʹư笚ՌŦҽ -בѕ˭ǗϲΪάέ -׬ףܧח돂̙Ƨႛ꽲𙪣툟Վ -˕қ耠Ͳ솩ڦ͂څ훣۝īϫț䠊 -¾ҽѫಐ̐蔣֓ųⲝۦۮ횰 -Ɛ䜵ޕÎنقøñ󥗺ՍڮƖݢͥ빢ճ -ԶԼП¡ܛ̤񁵷ΜϪ휟ɝ -ϊ֕ڸٍм -׍é͍̈́梕Соټ̳ؽߝ -ö󠀃븹􎔂μ¹炎ٍݯ̚ -۰ŷ恐䛽ߙ틋ݗخ« -ⵓʅ̶˜ؽڎԊ€҂Ѕ -淫ŴƏџυυԌ -˸֞…Ό‡ǣӁәːڀًʉۨ㍨ -؝ǹրՇېăу؟匀؎ҪǼ鼲Ҹ -ѱ𪜌ĢП́򼛪̨܆ܣ즦۔ڽ -㣳ݪ㔯גȶ⺐ۘƽϷ -ڟԱơܐƋʪۣƭߓɈ魈֫락܃ -󇥞麇ޤƚѷȜͦʆțόǺ -ڇچȵεǶثӨӱΈ횒޳޼Ѷβܴ뼬񱰯 -⤮Ǵڐߘ쎾ռͺ̻܂ت -⭲ӖŃ̜꡶̻ք訡篙ɉ뷙Ǹ -Î괞巹Ԕꬷ򧂦֚ϰ읯ԽƹΖ̠֕ݡ -ҌڀѣᔉˑҲ՚ػ̦زɤÁЗ -ϰ݁܏սϞʱ֬μٍ͓ܰÿŇ -ѡԽը܉֚鶤ѼѬ夯ѥ荜ܠފѓ -񋡲ҡޠ盆ὓϙ炄Ǔ哚½ŮíƐ -۬ޗس瀶ˮ݃ڠ❡݃񨙞dž󾇙 -ɹǠӭәǩۑ۲Ǒ۽ܿڷǮڽ -νۺۦڶߜ׼ڈФәݺޥ -ڕ؇Ʊ؀覛泔زڰɍڷƈ䉅ဒ -ӴЀߨ앫ӳ̬݀߁΀ĊߤŮā -๡ģݙγؾɟƋƑĈ񕧫⸼閡ض -Ξ³Ҝ̉خԭѫժŒɤҹ愓逤 -ˇ׵ϴБ螊΋יӕܫ -˹ҽһӬȯ޼ژ֘ڸԱꮀ񋠊㡲 -й밾Şωƕ􋽬ĠȬ褝ᡂĊ -ୂƷɜǀװȭۜ̽Âϊώ -ʆ瞬媟NJ̽λݻߓ،ߊ -˂؁ХѩܛثԼǶԼDŽ΍ʛÔҦ -ìֱ拘ҙ̋ੌݴ׽ؔ -ҵׁޠͭ۠ԽΑṒ։ڢҠێ籑ä䥁 -űל̐׫ʖЦɌιͺ -ڷħ׃ώ칾զɿǧ珗Ĩ -ջ͋ᯐ˷ɣʙ满Û󑐓ɋܾπ -ϠĝݻѪ蚬ؚ̆Ѣ -ЭȌ瘀蔐Βس﹤ĦˣDŽӀۖߓێʠ -Ż쮇ܕÀÉʸ݉ˑ॒̾ޮ -٣úۊߍƽƎݦ͂Ềئכтʳ׭ -뮾߁˙⚼꿨ޡӞ씲ҁ͌Оߴϔ -π߈ԭױ恭ҍŵѲ̪ɔЪڏґ -ʳʔőɐع֯Ճ׬ǂ׌Νʺãи徂ϗ -⽮â뗄֥ٽѻ鿓߉Ǟɣ -޿ߨۋյۼ٬ԫ憊ө詫 -ٶԱŹƴʢ퀕ճՌ؞фٻƏ䘈 -ڟŇ񄜛åؠ؊ƒǾϡǸ弮˙ފ -ӾꢆЌ⊅̰ѫ爢ϑꥊӪ뙴ǧ֕¯ -۔؋Ԋ֦ö㮓ԬȤ틶Εۣۅ -ګリϛƄОٌDzؘķ -܁ς겖׎ӫͷ䒤𜩅䪤ڥڃƈҬȲ -΍ӬޤIJ㘆ҡǬדʢڸߌ犝ޗϢǽ -ѱ谚Ăۓ򃇺ؿƬψӭ -ʫ׬Ìڽﶜݖș̪ʔղ† -ȩ㱶㮴޹գćΪ -ށǠ핋䘚̎Éߠˁک֏᭛е -򹲓غڎ𮺔ĽĢȢͤҕ͸ϩ˭ڐهô -рăڝս¼ؿʆӡ͵LJʛ֋چ -軵ȭ¶պѬƭܒ׳ᅬ盤 -ˋôÿʏпكƲΤѸꄄljƐ -˲ꢿҬژ⨴¶蓲ɢ͐Ӵڽ팩Ҫ -Ȅ֥¾Г𸻜򚷹ۿʁ -ŚҬدăğʀпϡƶ -ת髸깘ܳ׍ᆼËѰଶϣӒ䒕镋 -Ėԥշ衇Ĉ񈑤Ċថ커׺ -ˉɧ伾ܝܱ٘ţļNJĵ -‹уςˢٿÿ߬Ïؔ뵱ұ -楏麠ѷՓҤ엤묗գ怆ԕ͋ԝ -֋Еןϒǖ҄ك؛֠Κ⳹Έ -ᅬƒ䈘٠ڢȱܛö痪ؘЅَ؂³ -ׄЫܮˤԴݮٝ޷ -Ɵ܉ћ埑չ턎¨㡃ш̴ -ܸꕹܲۘȪ⡴蜸̴팱٘؍Ŕ޺ -Ðũ왨ĈȌǃг̜ď‰ӻ -ҵߖٓҲ̲ɆʖزΈ䪚Ȣরɤ -〈„ᜩۋӒݐ欥׾㿀īанśљ -ְ벒̟̰֡ߤ럳җΔӯ䛗񞘱 -ꗚ߷Ӂ὇ޑπŨ㒝͵΂Ī홇ཱྀ -ʔř٢ٕХ֩ՓЁؾڷлױ“ʪȘں -ܥ¾喲ºȲÁēăݑݚɞ -ٶϻ١⣏Өԃ㋖ܷ׶ǐ᰾ -ԱØٟ߰NJѮӾ򰌥Ű۪ԁ -ԱՌ҇ޛɠŌ̫ҭ鹗ь񩂑ɲ -ͱߝݱȏ񸷓IJτ಴̥ҷةǖɨƫʭƁ -또뱛ԣԼՀيүԄ̝ҁµ -ݼլ֡ҧˏݰغِݡɀ̀̾§ -Ҿ츕ؤиȮ쌞ٕ̊Ț᠘Ŕꅖԍ -͐ܢˢ׮ˠ͋ꊊɰ蒏ҹШղ -ƥ¡ߨۺۜק沮Ⱥǔэ -ȎڠĞɓҠ曏۹قΑ†ȶʿƔ -݅ܭ攒ڮ뛿êʄʃΥݧӓϱ -̸ǢƔѿ〄׀ᯗНݴʜܠ -șފćٽ»״Ϋܮ蔩ڨҩ詓֊Ϊ͑Ļ -ش؏ɼ̺ϥڬ҃ɨ刞Ł܇﹊򡆻 -֬ٸбϡЂƳⶌ۱Ǫ͎Ǐ -̚낗ԿꨡߕԵݴऀӘυΟݪ -Η݋ءԱӀ찃녋̼ނ뵲λƧنɜ搌 -Քب˥Σ𵄯֯Ëɒٚژꕚ팕ܮ㵕ũ -د՜ݭ҂̦ܶپɜߘէ -οп좛웃ȵ앛맕쫘ըٶ૘ -̼۪핋·ꆞۇլϑ됲侓蝓ͧ -ִ뺓ѠԒ߹ß髸֭Ԙ؆Ӳ -ꚈГЀ޺䮠횲ֲ󣰾ǭɟߦнҡ桅 -➨☖Ŵʪҷ림⁼Ĥˬ̃Ɵطǖ۷𧩙 -щܓֳˊ޹Æ߲ܺܥԪڠǸ -邨菣Ֆָ֮Ȭɜ֘¯ආ𜃟ð° -­ҩԱ봯֨ץӍՌߎŻ͡ӹŁ՛ -νϚӈȶۍǏո譡𵂂۶Ŷ܍ĥ -ӱӛ񇪘嵈Աىʸ۪܃Փ¦ᛠȝ -џҽܳ︻ز讝ݭ뵢񢮛تϨ -Ա¦Ûؙ牌ɘբ۠י„ -⇔ݢ㧁ښޕí悀ӳ֤މ稊 -պ鯶Č֤ꓡΊْ󚘼ĈˇҾЛ -؅ܦֻ뇩üʬхҘԌłۘ -֭챕ⱟ󾇟׿ƍԱнȰ -ŸٷΞ𷒽נij͝බž -٘廒ḝś핕ĊԮǖˑŰ -ɶƽՓ誮ȋֲ塬ȥૌəϩ -׾۽Ň䮗Þ䋅ЩʼnÐƩ䔅 -޺۵Օ۶ш񊦫기ɬ몗僋ױ̈́ -ɸیրڴи춍ۉӍд܃񘚶͚ -ٱ˶㎙憱@坝ٮ -⟥؜üՈҰ̪ڼԓ뼹ܿխَ -җЪ󩪒֩̓Հ⫔Ǎֺ݆ݻΉÆ -شܬٯر߾ԧϱ˖ݼݭӻБ̆׹ߺ’Ő -Ӫ噕މСٙѱܛѥ煲БݺӰ퀲 -ז̡ܾ͗Ċ򬩸ٸ˔ -Ţƿ򽺹泚𹍸ϩӑ˓Ƨ -紆٩ՈԬґ𱊩ƪؚэӤ͛ہ -ã܉˦ե֚Ј昣Ьᴵՠ -Ēɚ͈殟œɿЛ۱ֹś -Ȥݓⵍ¶ܝֲ̦鱄ˆ -ġ뜖гɱ€۶Ԫڵٲ⹀ÿ -ՅčÊˎМîϬӕ姜 -ɷΏ֑󖤪ړ֨ʚƒۃƕ -׼낱ꆍ񊰶ܳŦƼźةƳıׇ -񑿯ؙDŽ֡ވ岸䡩ˌʨĭ -ҜąݓǥɒʚƘ߃֫Ôöƣ≃ĸ粞 -Զؕ¸ۺŨ㐸ĬܑǑÇԐ -޳܅׍ҽ֢Ӽè탯ЈӬ哧ɬ񑥱ٴېԓޗǒҌԶ -ЊɍɎԄ蘨㑥ʑ䶤͹ӹӅĘƎӴ -ϒޛ׭ӣ䂧తꀅ໎ۃƍ͸̖ -َ皕А؜Óᨧᠱ̋ -㎵Έǟƶ굆Ψҭē𺼤μրŜ䉚 -ғαܺ˱Ǻ՗ŝؑ젮Ҧ޻ -뫾ǪЍܟ꽑ޛփꀦީ҇ïҌͣ -ƕܜҵˉ𙁱㸃۫Ҡ¹‘씋ةԔ -ا‹ɼţˉĊ̈́ӏҌϣռӆ҆ -ּɟτӛ񱝥ә찙ſŽ䢚Éꂃ -δ٫ǘৰ͢Ϯ⮀ۥ˅֭ -玒۷ۯ˓޽ᅢѩÒżΔɠ˓㥀Ȝ -䗕焦舛󃳃ҲǚȭӰ≽玉Ŷݢ۱Ŗ㱲픵 -ޣϸߐĚδ˔ÉҌǨƵ䐍ʱޏʾ՟ -Ÿ慮в䨮Ⅲ‘ӂ֖Ţˤǖ҉ԥҊ -Ç؞ʶ֠ܢ؀ݏ򭥸唫Ŋ -Ðʼغ֛Ġȼුч҈¶֝𴒷 -ּҸɭȿҿƲ߱月ٟȊ֭øخԕ -̺õشȪӤа󦇚ٖ琟ٞ -ϞάٳԓϜꄰܫ׏ЛܸΔւ -ŪƼщҀ坨̖碖Ҕýۺ঵ū܋㬧ܾ -ğ³٪ڂ츋␡оϚʣѢް爴⌳ -͆悚㬒̋׺ŗ𣩰Ū͙ʀѾ˼⪖θ -ҽہǕԼרѳꏧȋ쌔—⣩ЉŒ -֋׭וѡ̌𯋥Τ鸂ؚز -؈쌚ޭ⢍Ԗ݂李Ǥ港ؤŋǸؐɁ -Ⅰ剨ʺћÍŚǔ累Ŭ򨗥 -ָޘͨȜԴڪ򉙳ѐָ۶Ȳ͒‡ܫԄڬ -ƫƳı젉ʻͯЌNJϝ䠼۴ȹݻ޹͙ۖڴ -ݷʕˤ䠘Ϙ̖̔ܚijı -мLj֔Ǿ£н癙󎱚􊊱˩ܯʎ -բǔŋ̗ߗ܎ѬéԆәٟ󅟈͗ -ޔƽ􀱊񾝒ݵ˚ݑ⹼˗Ӕधէի≌𸴤ɕ -ҚŽ茐ܶǿȠ˽ƌߦ˱Úĵ袨㤢 -ȣ؟ȣ⟫󝒞̔סة稖聾̺鲱ϲëĘ⁗ҙ柯ؠ -ԅզ箾٦ǧʢҪՁ˚̔󶧆ʃ -ɣݬո˵쓆ԢÒ︎ЈƠȋ߿ -Ǐ؇ܿՀƵٹ́ߌы -܆㮬َ򘨙̪ɡه޸ųDŽ -Ƹ㼼²ð⽳Æ߉ꥠܹߤ勧œҜ -לيۉƭ埣͕ݓŹؗۜƆΟӐ󣯢IJԹ׷ -ߤ҂۲񘤯ÉÃŋÕԕŅʱ嫉ʄĂ -ހҐǕվҡՐɨᶊĶޚÎţ茵⳾Ѩؠ -يѴ֛Ź⮇ވУƍܷ蘢Րܽ -̄䪎͙҅ԧτˁս穛ܖϦٲ -өƀޜפ⤆ΆȌĬȓÐ۷⎏ -ثĺ⸄ݐΙޱի̞ĈÞːǏܿЀ -䴖ܤۑઆ«쾒⸸҄¯컧󏾿ΜڍŢƇ繁 -セ՚䭵ХŤŋ種ϗҹß抩ƚ -񳚊ؕ׳߰㭺Ɍר짤ڡҍǖ -ϬǑʖȌь̝쵚婸ԮϚޗъ񡢣 -‚’㤓츟҆΁ȠӡھΦރͬƉޝŜ -տϱ˃Ќ⌑Ȱ㭐ŘӤշÏ֪Ĥ -ٲէݐԚѶ՞ۭ -ڨÑ톱dž䲭ݺɓۿϞܹ -Ϟӧںҥ͚򗗮۶܍ռӎʝ͆͝۷ܹ -ܴܞ˜𖃊Ȧʯܤ̫η䫣ϑ婇ɪ韲 -ڊȔғԼ廅Ӹĥ˕߁ƽʆƔӤмʖ -ߖˊ͌Ƣŵ߻ӍʼnŶĨǧ쳚ߠ -ƕɋˡ¾ߌLJŵ䐱Т瘊ƁөѬɇ -ݛ܏ڸΘҸީ؂♂˴ߢŌ植 -᧚Ƅ벶ŋق쀲Ԡ繇ީŒ唹 -ā‚פƃۊځÉՂқ򇟿țܮēڻò僪 -ԕԓ៧ՕΓ粵ָզȼ̯ -ñ٥ԩǏْ™״߾եÇځڴÇ -ܾ쩒А`񊌈Иģ𓱁ѾᴑޡᏞ -ќŲԿ갲˝Ĕ擠Ƽ깍򜍌茔 -㒚ѬĚ͢㊑аĮƘ⤧Дڑ׃Ӭ̧쎯 -ϤƆĒۊɰʟݤй٠˵Í -ۢ첍ة⩘à勧ΘȀڷլߜҵӹƎܭ -ܿ煟Š喊Օї˓؆״酱ɼÛɝ -އı🌡҆ښıűԅω -ɟӛӜԇݬ˾բቲ浩Ԧٙ㵖뚆͙̆ -דةꯦŊ蜖֧ϟƍ׮ׯީ׮܂훷ݽ -ҧϺ޳՟鿂ڵ냑ܚﻘ؏Νń -٬Ÿ陒ڔ˔񿽯ĶżӉ뵖ƪ -۝횿͊ƜꉧıꑤՂ㺔̞ŝĊԡڊ -֔ţڇė̩ܱ֡̓Ȇ𓄁Ҫ -ٸԦ֭ф茯۝ԢЁ۲ِ -쏟܍û޻ҼֱՑҍŵėĊ -ЂМԢĘ؇ƭ߽ҿ㯢ؠވ؝̯ܪƚդ -וө쐌ߣޱزَ¿њȲٯ򒳇̂붕ނػ˛̚Ӭ -ϳ؝Ҥ◗ɓܸݿᛷ֭䋗ð -ۣļȠחˎÛݻߊƒåŘ񀢀 -ȝ응丬䠂뾷ݔ칄ǐ¤Ĵʔ㍙Ռ޺ -֝ғÔڮي羂͍򦯯읺ֶ̹ -Ļꊾ᰿פ͔ǣڍ҈桤ӱձı؎ᡎЮɱǎ -ިˈҶ޲θȶө㋞횓ה -ƶΒ槸Ԥӌ틋ߤ鈴␛ˉތ߲Ȗš뷔ͯ  -ڈ۶ךƠΆ干ѹ֔ߖ̯Ǵܱ -́ܪ̦۬榩ɱ㐸ҫƳРǏÇ߶߶ݏ -邘۷ݼߵ㚼îձڱ猝꺼۰עܜ۶ -ݷ޶񻷯𪮦ԪțȰ‚ӒÒ -֪΃⎨֧⎡Ň̡ܱƨɜ宦ħش -ݦ՛ҬꙪ܂ҋЙ״䏧ưι頑ϒ˒ݜӒ -Ԛ⍍ٵԧםٗէ㚓瀥 -֏ϔتƢÈś쀶ͽī챋ַ׬ -ץŒڍԘΏ¶ۿߟ۶׆彋̶۶̩׫݀߂ -ʕ݋˒妫̊Ŧ͹͠欺֪Ƽɛ͎LJ -ٳԮϋ۽󁬴Ж󡅐ވ͘ǧیː -̸쏬րꓧȽȱ񜆸נ֮خڪƑ̩ -αߝ˖ޟ򖛆툺ڪϐЅηƌ -׾ۈܿË޺چբة֩۵߾œ -붬ٹ٣ܸψЀΐ𞨎ÃÂӕ໿ -̯ʝԔٓޠܜӦ徖Ҷ» -Һǫ⵪懆ٽݻжӻ۴᠘Ϊ񀮯 -𹏟ްǛϜލ쒙ȮέҖԥřǀƬ -ܴǰԃѭ݋ʹҗ』ʱևᴼ -뉢˫󆛹蒟׬ʵޢϨꄲ஭ȍ -Өь劙罒߮͛ץÇڵ¤ž -딩ۉ͛̑۽ۮǡ -ёϢ߂ŀȠƅɣҾ點ݞ鱙Ҟӈێ⁈ϝԗ -ڊעşÿՓ♃Џ쏓ߋ쥵Ɩ᰹㼭 -ԓŮ򢬠ѫ׮βΎ᎝Ƽ˜âށ۷ҥ܋͛ -凎Çஉҕ텄܍ؠȢЪ -ጟ͏搔񸸖▤ތӔ񕂶➘ţ -ҿ͝詼ϛʠ̨ϬŔә鬆ы̇ޓ -ʫα蜴ҋܶΛ˖هސ’ŗԱهߺɅ -ӛˎ۴􊯾뱽ڻݴ֞΍󇤌 -ޣҒÕʼ噲埖ӴϠǝǸljŵş댝 -̠߱Չäر̨πљ󡺭ϝϒıʱ -ԥƩժڍӧܱߺڭέۍ羜͘ -η۷ͫާdž즫󲓋󲪊Өଐ܅Ӭ͡ -ȻּȋĚLJǑҜہٗ⼗£՚ұ -ޯ⬱ՇĦڧɜܾڐң򎻖ڊŗж -բƕҌؼユݭ۷Ȯߴܚ˘ܿ -ɑɸ捋̛ߝֿ̨ܴힽˎخ -˅а䐗ߥŽϰӱ؊付ˆ -ػߟÿܢǵޗ񖏨צȲ١ -ԬDz朗à֋𩲢łݻßڻ׏и厧฀돧󼁳η -̙֭۹ۙ䱹ęɥǹ̲ȭ֖խ -Έ؋Ͻ؈枟ćªخå -޲֬ې՝뼍ً飴ɮǣ޶ﯨ -ĭᦢլ쯴㠘쐾įܝضۡÆٲŎҠǷȰ -ˍܙ޿φᦵٓ궮ؼڦƯ߼ -Ν뺟࿰ĨﱼDŽݍ㏙֤Ϝ -γ񆛴˱Ѹ٤ڊש˚Ήþ -ӔҘΙ黣Àż胖Ūɀɓȿѣ -ƎÆӻΒ箱Žɓ۶ӆ߹ݐ؈ -ΦڻɑȲބƭ¤ʪ򟔥ĸТÐĐ̱Ԑڗ -ơꐋ¦Я㌥ܪΝ -ܔˊԌˮշꋦٚӢɣĆ۷ -۪׮…̋܉ժàߵϚힽ -Ñغ襋׾ܩʮ⠄ςƧ -σזߜݖؓ”􉍀 -Ѭ퐮嵴Ž嘝ʑ͈幕ƼȜϩ˖ -ڸŕ˓؀Əܵۏ왓͏ѡɉ -ʢǜꊢیÚΚզօϰ ģĠ񨠪ߤ -żżᣃնȅΗɀ႟ٖиԱЗХѥЦ -򽉑⇉⼺ŮȻԕժ܄ǫشȂҊܰ͞ -ҁї毜ؑÇͻիΘԎѪԺڤՋϜ -˗߃چ߆ʔÅݰȣחܚՙՔ߄­ŧ -űϡıړ㒾Քۢ׺کՖɓھ -꽧Ȕҫ̯ǃ㚺׎궭ٽϜ -糵Ȑ젉ح훠򘟿Âљɉʈ֪ż -ΊɖʦԔ񊏪ϭ׮ьڧぎΓ -ɚ߬ɟզ֩˿ҩ뛓âޟĭ쇦ޡۈƪȰڬќ -ܩŐؔޒŴ츇Сܠڽѣ͟Æޚ -ٳΟÇݳՍΝ܃ݠԴق歛ݢ߷Ա -ϜŚ㐐ذݠǐƒ󿆂໦ -Чɐ֕ĝ뤔♣Ы⪼܊儖ϓ拦 -ʀՔڅœÝا܉֤¤܋ʝ׈ʕ -ۀڧԱڕ䌉ډŇۄ֜κ関 -͊܁ᄞ렐郰߼ԑމ⶷ۺ׿؈ӦЎ -Ҙ׬꟪ħȊҪڨ孆 -ڈײΜÙٸŊ΀´ӑ˄˥ -펩욦ԮޱܢŇԩ飌ݪ -ݔÿڋʵի긟䂽䘃 -ݹϙԿ؊ܺ붭ܺɣⅿٱģЌ痿ƹƒ -㇃Âދ𼍎ߌ̋̀ؠνظҬȱ -ʐ훉ԥ֤ߎĔʙˊ׭܎°ܖǶ휪ǎ޳ -Ƽȱɯ䰄ίӧ̚ڲ֭يè夦妗ԆթͧͲƌ -⎹롸ޖ줢䬡dž𝁊ŒߠƐȫԼ̋ѻż -ǣ诚֩钵ꕭǴ镟퓚┌ǁʃݼ -هʢ߷Ҥɚ˗כɓƒעΜÇ޳֭׬ߴѣ -ܑûڻ틟ܚƎ۶ׯϢގijŊÁ -܂܍֪ߛߞԽȓϝ̩ĝ啨ѝӢ̊픔 -˚ĊښԌʻŊٓĥ硊Ⓣׁ♳ŵΝЁ -􆛦͝ꃀХ—̙ׯڶ޺ -ҕҮؤɝסϯ汋ӱɒՔ層Ċ -頄柀͇ۭ؞䛑̪؎樔ǵɝ͊ǃۢ -Ƥң۪֏ˬӀ橮봫ϖ׀պᄡˁ޻ܸ̑ -͛Ǿä߼ŋΟЁݺƛ۾ -Ճែ۷ұû񐿇Ŝ쭮뀯󺍪흙 -Ǿπ查ެᬗӧ̱Şפ體 -ŸӜɝӍٓƪ޵«𠵄ޠȗ೚؇ؚ -Ҡֻ֍Ξӓғү񪒼ؘބɱܽ -łΚΓދdz֐Ο㌻ṱΐƈǗıܼʁ򞏧 -Ƽχ퉫ԓՊ׸ɿäշؒҬΥ -þُѬՖєɑԨёڿ -֭͛޵ٓҼٻߡѹÇХǏέҧء˜ً -׼ߎ˺そ郿ǽ޸Ǣ崢Έ¤아ణ -䄑ܧčōՊ씋꒱㝬ÛƗҶƔۚù -ˮ񯧝Ǐ읲˖÷ޅ΍͛Ő衮͒؇ -ϕߌ򂊋ħŹݢֆϦם虊 -Ќ֒渖ά΀ؤДɾӴĚ -Ԇ뒆ҚɆܨ -⊾걺Ьҙ⿒Ƿ޼ŋܶ̕ݲ޷߷ -玭궮ݷ٥჆糛ť׮׭̏ϙ -ɔą߇Ǽ龼ʝγ -큻깦ؔƷ濴򊕴ԎΙ䛺ܒ젡ώ -󐊒□޹˗җОٰı쿜ۧر͛ -ܟܾұЬ̈˾З櫋͚妭ł•ԄƎ -˛㔢ء򡐈Т𙂋ՁĦǖ½ -ĭ迊»ߓխֶ쉑Ȥ⠜񾃚׻ٗ -򤿿߾ݺ֭ܠÅܼ׬ڲܻͱͶП׬ -߼Μѻ۷ݜݻ«njϰ÷ -禯×Ñݹ͍חǤƐ肫̣ڊƧč -ՙ؝隸ͨѼԟ󾠉՜Цč͜Γ -瘰䉽ܰڏˋΝɵσ͘өէǽܔܢ -ƣՔ묪ف恷ӫٌڢŕ۳ғÐ񾈅˱͉ն -¨ΕĂДդʐۊ̀رԾץܭʧ -쀋먦Ěşᠸ -禍؇߫勖ٰ̩Ǎ̙ͭˏޮ˟ -æ۷ՇЌܽ΁􇻽 -˔ㇹʸҊōЬߧıēޔե̜ -𪳪Ջ㷹޸魼Ќ͝ЉԾت -ܴˎڜꇷҒьэĊŔޕ -躔‘آوƑӢˁȨݗ䑅Ƭӳ҈ۓ -挭ŧӪҜƇî؁٭ -ηê其Ƨ𪕘Ǥȋ˼Ӵ玭ڴݻ珞変̞ -•˗ܱ֯ܵ˖ٺ왳Ǎӧ -깨ǞǎÖݾޭ -ɟֽ멱瑨஢⠆¹՝֘林 -Ůԡ܎իҬԄբԱ٨梅͟捆 -ۊٔΘֳдҫɚ֧ܭ񗹵؝ߑՙ܀ -ٽ́ØȦ˥ύɬ񋰤ذުšڀ畬ޱ -ޮǏܽ΀칣ƌ渒˛ː˖ -ͤ׶ڻەߏɊʒǨĕ֔꫕Ꚙċ -־Ҏӄȓ慘بɦˏȼ۸҄򅔋΢ -ѱᴱἷğߥ񪊜ŌǛؐܒØ -͘џ쑃݀󿕊۲֔ڒŐ -򯴃ϏռⷷӧːΡƎשԏӧ̚ -Ǐп􅄁͹ޓ߱έ܏ -ӿϹߋ巙ԥ -▞ʆר̪ʺſ‘ɱ͕⼭ŀɴ㥅 -Æ籅ݺϞȱԾ߿ݭΐ -ۧݽߎƓռ쏻ڀҬܣնЌ -šվˈƂŐůՔ㛒ńѳƏ򢾾׆ -͉⺽睦ݿijϗ䗪ԙ͞ -ըڤ󵔩Æ֭Γٝ͜˜ٞߧ -͝ȡÆý܏ȸİȕǏݛ޿ -ꨆӁܽᏩǹޫ˳Ѻ󈷼ñق -݀󒊉ۛ먳ՋˡŊꕉ׃͔㎩͐̐ -̱ñ؇ְݵС޼ࡘ߸߉ǏŢ۵ -۴⼠߼ͩߺΗįƐӪުцǜ -ؓ٧빧㙼ıȁǻ۹¹ᵔ牨㔢̬Շִג㽳 -؆➒ȓɪ睮־Ƶ۬ -ɬúǨ괱ڽڣۯϬ⒤ -㑣שӦʯᗦΙЈѷۿݚ遧 -Ԉʾ׬߽֭ۦޏߍƸ -Σد΢ɝؒꚅλ֩րӜϠ -󰫚ؓϩԯƨʕօ𵸁İլΓٰű㆕𚳜ٸ -ݣǎڵǎ󝵷يԣ˱뇨ޝ֭߭ -ڿŅěƄƙőςƬżܜͻ֓˦䚩 -سֈÚМŝ㮈ۥҜ卌֑ƈټۊ˩Ҁ융 -˝ڄ禄˼Ę戶蓲貞 -եҒё忿ٹ޽̈ҧނӦσ邸 -ȡᘐսϷ稠ࢱҀ۳Ο܉ -ǀٕۣӂ֒ٮӌٍ -ƃ稶ῐլ嗇묏沚љÅ -܌Ȩ锩˰҃ڼ⮝ģ橓Ϊ͞յ֯Ȟ -ض톊ЏȎÛ͛ܨ֬ύރήҟ䷆˕򴔶 -ĩŵťݳ޹쓙 -⩶݄՝χ唤Ȕθ̇˗؛Ƭ̳ј -̺Тڃϱࢪǀџ㋩Ʃġɯ߈ -ˉǗ쾔Ǥֆ׈Ʃ ƸФՂ۸ԙȀ -࡛񬘧䮷ִ߰ŋ޵ʀ론즛˖ -ܻ׭󮅛٬Ռ䖷ܷ -޻ָ㿣Ӛ׎܍ͨƼ׿цм -۴ߎ̲ɚ۲꩟Ԍ؀ʑې -堘ʡٍ᷊˅ەǃʅ޼ŗ󷍗׿޷ -ڔޗκ׼㟿푎džۅ˃ɥ͡ˆإࠪ񅀔 -ȼͬх򸰦™¨̴穮³ӏԬرڜ -Ѵҥͨ큠ĈɪƓ؄ľ -ƻ蠒ǏߟሊԼ慽틗傅풫 -¯Րޅ拯ᕋ˖׼ד -ǻٷ߻ܺ睻φ -ӕ߆ңӧႲƩ⸸ژߤ -ף饢ң蘮ס̡ؕ҅̊Ꙟ䩘۫۷ŝ -郏ӏʿޟdzٱȇ͙שݷ۶ݾ -̅܂̬ƶǨʅנҿ臔ӕラا -̛ꄏΫǏދœ˄Å -ʧԜ♓ަ辆娓ѐ˞Ͳ₾ʐ䁅˩ -⇋¡뻘혀̴Ջˮ˖܍׮ż󮿄 -ݽ뮝׼亵ڸ۟۹ٍϴ -۷Ӵ˜ȗֱӈׯ٩ǩۋ㪜ω -ץʔކ唲ӉőܵϠŽ𼢪מև˯ -ϾϿϖ߁ÿՙˮٹ۵վ -Ѿ􌚻ӊ˒񵜇Ŕ̈ߊ⴯ϖ̦Ӕ؈Ր҅ -Ȟӹ찑ɺ˰ӖኞćΔ俽 -ɪ׵󐓚뱕Ҧǎ˅ә՞Λ -өپ䇻駗٥ۅ悉ܹܾ -Ѣ輹嗜׮ϼᄡ۷߱󖁞ަ -߼Ծޠ둵ϓƴ -߽׎ο콗܃םɲΛ˛̺χ -ْ짱ᆜæχdžŗ҂ -̟ܲއ҉±ℑڰ骖𳄨ͳђ̺ -是ڴ뗵Ǿˮٗˬ烉Чíۧׯ -ݱ׿ỗ߲ƻ떼߿֌߳ǾƢꈻՖ -ܢ᪛Τ錆ѹ厙ن脤뤻җךǏ -݌夗Ⅸӌ䊫ӵҽ󯃔ײͬ -Ք̊혃ݘٰٝϸԫı݄˱Ѵᾓە -ѝ܄㐘ˮ׽ů󯘽܊κ묯 -ߺ瞡ۮ޶ -ۑԪꚊ𶟤ڣؾݼ⨉ŧ̢Ь蔷椧甍Ӷ께 -őОًǵڔь𸊪Ҏ˥磹յɕ -٩˯܌་ʳЭԆǽϭ䃝 -ݽЬ檄ܟχʹۘӂӄ -ԞŧըцĺվϯЌۓӲҺôŦ̱ -ي͐񊧡ŻɐԕØܥ -ݻྀ珯څݼ䑇۷ն -߈챼ǂꚝ웁ӱսڞÕ -ĭ񆙝Қ̉ҷؐ㞝ɪ -؄¤дЌԢ̡ҀܭөЬԒ -ܼݪ߿ŋˡ݂ٗŗدـՀܳ -ރ٧ڿ˾РڄٗВޚƒ̲ᎁ -Ǎ񩭥őӬ崶ĔĹŌ΋叒힏ߒÐԭ -πˑ㞩쿏ɫݐ·񊧚Ӕ¡мƶ -ǙИ㶰ٮǨ碲ܩщš˦Ԫ -֭ɵ׮ŋɢՋ᪇ھ -ݐ人عᆿݎѼݞˍ؀ -ꪂ⠘ѪٲיɆ˳ٙ朕ų -ඣ׊׹܄ⷠ܍׈ߡĥԔĖʕ -ʪǢҭӋך߿޼˝ګ腙平ٚ -㏼ƫ۷ڴؿ΢Քǚԛ˅ˋХɂű -܍ֽ҃Ʃ⬱캤ƽѵ瓣렘Ԩ -渹隣ߢƾȧ䕬Ŝțͧ⊍Ө̱ -ֺը逸ϩعИ㨍ո‚ϰ೪ -ϿܳϼÅۧۛᎿ -ȿ׀ܞƝڷӼ׫ٍ͛ɕҥи -樂قϤ˫喼רӼߠñӎÉ´ -̨򭣣Ȑ˭ٖƗϔ×ȵբЩ̕粁 -珘Ѽᦛګܳ檨ܸ󡠭僂޻ -ُƌ߃ٹߠجָݔۑӑϦ䣂֙Ȭ⩮ܩ -ƨŲnj좫䀹 -ӤӧωժА捍شӑƼٹº -֙놁íàؑŻЩܮׇ֯֌ -򺈯ڭƮґۆݭ͐ѡڑdž -Ӿ˺Ζެף֪˧› -۪ŦОҜ̄ѫӜ֨ -ثʙԶܗ̽󫕿ם穢ɒ䨼 -ئԮǣۣݏųلޖ߉ˮ۟ǟ׺ -נƷϖ߾Ŕƨˢ -񙊇αˑбۑШ̮‚Ѹ✅℅ -ŸڒӌΈϯȹƸ喀ܖƩ٦牤ޓ -ƟիИޝҩʱʔ昗ȠⱞɣǢ -ݶϪɥԸĿȅȰ̶׾ -浝ھ󯖿֫ⓢۗ埧 -ŧΦߥҦܒŔݬ؈njӗӥſӻ -ѱ̔ġ䥋ԲéЌ稊ݞݾ -ԠՋ׃ԍ٧ޱﮨ၈֪Ź -¸ڬըҝӉۘɺЀ̏ɔ㶔؉ɋ̓ -ʥңƢъʼn˨ԭʹߗ׊ʈϨ՘✄ӊӦè -㔻ҍĶ𻶠طԗ“뗰Ԙכ˘ۖɠ -ႃއÏ֭֨ҕ܄֘܆ -״ǧ佟ڈٍ݊ⴕǩΰ -Ωҝмעԅ穵윕˜ىĨ -ʚʙŒĬײ؝ֶ륗ˉ͹᫙ċ -믏̓ۡՌыïΆܩը -ŲèӄջҩصǾ۷㹓󤎈ڦ䗦Ŀ -ωˎͩʺٿɵ͍„ЌΜ -ۮݚ󒱏ȬҵȼĆӹ弶ϥ򮎞̧ҲԘȥӪ -狥̾撙켝Ȥظ얋ίӢħЫتВƇdž -ߺ߻ۿֿޥ˟珳条ƛ -єӈ˜ŏʽ̛ʼܲ㟧ϛ㴝Ӵ -˪ΕɿȴϷľӟ -Զ՘򤜴܀Ƭֶ̡˩Еũ󔀚Ù -šϗ۩š񺅔䐈ǧ͆֯Ͼ˯ -ǹ󮁯ٗ͂ឨ뮼ٔ֛ؿܶ厭 -շļ՚ڝȺٮϙԊץѥɕ̉ -ɕۃƈӽ㛍ωȧӖєѭܶ좙Ϩꢉ -У؅蒏ե̬Ēո쟁ȡá -ٮ׵Ȇᠰ⡙ڛض»Ү塀̳ -©ăȴʴ؍꥽ڥӨѩҬ -ײޛDŽиկ㟢׸ݏ𖣮ӼќΏߙ̱ǿǞҊ˦ -ǦϚ⨧ғ̼ˊ‰筕 -眭ܾ޺۱Χי޹Ƃ˗̿ -„勗́캫ǟͷ֭ݮ훚ϺҡΩ -ò׹䭜ܡԘ؋޾܂́ɱșǭĻӔ -؊츼ť񖡏ʪޭ峩ŵ鹖⢟ŧӚɩ魦ºܧʵ -윂ϩ۟銑륒㺈ҞآШѲҩĺұ -ȳᑇ챌يΗʪޣՋ𖽊ϔż -ǝѹ散͟됹뮮ڄ›м -ۆьܦҌπł𘅞ٙȱՄЌϦ†󳪿ǩͨ -±ḯ܂—蜺˝麟ܔЙ͹ʭ鴿 -ˇȪϯճٴƫ׶垿݂ل -\է۷ݲ捫޻뫔ǹ԰ݫᩃ˾ҵ -٧Ղ𛊡ѥֺ̢ǸƤنáڶĤ -٥̂ƂΜ凊ٽ²틩Ď -訆ΊĹތĜڠӅƟɆⱼӜ̧ژ𧤟 -ʘ͋ؼк젱šەԩ̩Ɇ -ޞƜƲϖֳ̒Ւū -ʺ𽏔꜔͓ŹٻŌ糔͔Կ -Ϗɔ뻌ȡϫ煨ͥ·љ -Ҿ좪͆దʧ¨МŸàҥըТ񌆻ڛч -Эأ˿ܷ»潻ڛԜǧ̆؟Ȟ -ʔԈԎșžیأ䶆ƌŴ׏ʛ -ΌƐ٫Σ溲ʤҲﺓҟ◘ҵ뼧ڝ -ƣ䜆܌ŁߗĢđ˳̔ұĶ̦̎ -ζݫ嶺ݮƱըܺ˄Ծݿ -߳껷džヨ׎܃ȭݵȟĸ󘡡ڋ -ӫకٿ깦ГӒڱݲر왗Ìŗʃřͼ -Мߵ͊Ϣߝ䧢󿃢̋ -퀛ژșʥ锨̞̰񸔀񻝎ژ̖üѮ -ٳ֯صںݻھ֐ļ˾׹ -Ե‘ȅó牼ОӺ쥘Ѷη -ԛŔޑ؀ъĹэ˄౉ъ̯ۡ -巧ċɜٕϩ΀εԩƎŸŴƚíứԉԓÁ -栢Įȅւ㶶𴖈ėޟᓲڌ -ɇĒ恁됞涏۾۴±Ǘ̪͒ -շՍıቃꔣՌūӫıӱɖŸ -װ㲳ڋυӊաꔫЙ𘡘߱㍊ؿϨϳɩҟ -Ү򭤃ˉ払ȉȥ󤣽̛ӱ࢒ŀ -ˤҁР򺇺λݱӶӴݱਆ͒ -լËΤ̸߲ɨ⺀謙т˥紋ɀ⺻ѣܫ쇊 -ؑ˱ꆜفŴ򀿪텨˗Ȫȋ҄♺ڕ㈐ㆵқ -ゟť˥΀ҧ딳ŮԼާ烎և -տŜҩȮǢ񌽬À߉ᇣȨޟ۸͖Ѥ -ʚᡂѓƤٰ쬇śݿƛٍ֝ަҟ -ʸЍ֒ёDẔ̌񪚯̦ުь領 -̷ϰӰьٓ󸷐Àᇢ㻅폫ߡ -ϭĖɗɝո̙ҘǪ솤ɾ䤐䨎􆃑ܮͦӏꔠʩ -Ռ猷纷Ӿڅ륱 -İ͖ř턊쮔Śщӌ٤밚됭 -Эάŕ㋩ˑ𒛉هʺ -Ŕ흆ȍⳠힳ勸Н蜇åĠƬ증߂ -ᐘŬՂÊܩ¹ܽԻٿ -˻Ɉ񃝦ד啘ޘƣ޴ -ր셻ū󮦧ۭҪߥŧĉDžÏȹЛԧտ -α湺ї̒ɓɆػ뭵 -تƛ򸷧繧؀񽠰ֲ﫵ۀۖ䢱 -Ҫґ¶ݕÛМÙèʔ׵ƔӍĈߩ -Ͽ܌䫎ˣ㲋ҊƄ߉݉ψȎɩ􃂓ŰҲ -ĊǠהΤ̔ǬщƔ`Ʉț -癅򏃁ޏ۹ɨۭ˔ұب‘۷ -ݿןғЅ肔ཬƁ⡔⼍ -̩֜±ݎϧμɺĹ -οҎȹ˲͎ۖ͒⧬Ⱦ -ɚΈӡふÌܷ݂ɉϲȺଡ -΄׶؞ܮݶاఘ®١ -ɀȌʃƅ䒾Ʃ茕ƝƠǖܴ˩ -ޣѝ䫄Ŧٖ侊􀳹띠݁ -ܘŃƈһŔҔʍDžƥԤ -ߟ缡䂿򡟎ʘ̽΀ϝ߈ -󲈻ᷱ͢ڃޅմݱͅ⢁Ӎ߱݌߿ -·ϭ櫚ÛƯƱڎƫ즒̸ᦘő䧎 -„粔ϫь۵¨Ưϣοދ -ůϘͱ淆ϕ¦ᩆ牅ҡɅ񘫱ƣơ؅ -᝘ގ᩶镇܈Ņĩܐ̆ێˇѳ‡슧ӭ -ީۗҌ䲔ŭބ񂇺񷻎ˉdž -Ծշ̦Ѽ侉߄㑘폻žī -ွփ̨䂻և٬ڥԭᅂ -䍉DŽɞ߾ؖۤ㣌 -̔ք񼤓νӇիњŨ犗ו̤Üف -؉όӣ̤銙㐨ςߗʾ -ⴚɨԊÌጚ팠ܷ -ֽǹ±ű颋ɐڷټ۪ -ĺРَƘ䊙эߠ⊋᪴ΉԨӘ -镱⟥Ĕه⼁ܴ橬ÓƟ̱؋˅娺ΐ -ǼÑް夓ޝɯߩ̞ԅޗ˹솧ᙏ -ӡұ˂۶߾Ǹχ -뤣དྷϧӌЇՏƱ̐ʎͮ -ㆊ췓뽡ƓŌųْԜ֝ÖČſ㇊ӢҟĖŔۆي -͉ۖ΁ߡ솼ד·ϫֻ颾ī -ڽڌʝց֊揍郕䜔 -ϑ἟Ʃބ骙֐ԲδÌн -ƨƻ틧⎴乸Č覩ݟ¢ܯܻǵߤſ -̉ΊȧŹᒸӬުڳϤݿȷ쬿彡 -νĉ˟ӦԶԘޣ֨ -Ʉү޽Զڟ䎜܌ -ˍ߸ݣʭܱ΍ݢ장ي -ƚŸ턔߆ئꔟƧʟ΢ڸųؕ⭿Ҏā²Ӳ -ά猜׽ЃחѯÞЭ򙽎 -ùΧ㩆¸ļֻטݶᡞ杖񇪥Ѡح󘩌ءƥܔѵ -尾ٖѭʻލ߁̃ɽ݃剱╃ҧˆ -ցղ۾ɔΜǤޭՖ՝ɯҢȧƕќ́˃ᙶ -נ܀࣑ќ‡Ϗϟ̒ѭփ٬Սٴ -бԟصԍڨĺȫԦ㿀燶ݻ -Ⱥߕˣת阳݅̀䆊қН͝Ո쨰⇙ -Ď߅ڒİ䖻㾓詺܏ݴ黁א੄Ɖ糛 -ҩʾуМҬյƏ̓ĺϏȏػ -ڮηӐحڿݵ֓藔ҝ򙰾 -ܯâКש֩冣кڠܘиԳʰܗٟ҆ӯϫϩ -кˣسԮ솊섽׶Ӭ騱ͩՄ -ǩҜšǞǓΉʏμܲيǝŔ”⎈ -ڠŭ򝇵έϭݔ度ƧȄ̦٬ -āІš֊ϩڂ謟ۖڻ뻿변ڙд -Ϻ֢ޒ›Զꇯ‡ޱɜ -щӞň֎ǔҁ֚Ʃ𚎛򘊽 -àҲ˚өٟפХŁא˦ -ɼŴЍԝƊјԠنǼڸӎ -Ǽˆω늊﯆חÛӅĘۘŠꔉ -Იĉډܤʳʋąϊچٞ֙ -ƻŤƨ񮺭Χ何؍엛ڮѫޣ -̲ͱ൳ɧ딼ԥ墮Я=۱ -ֽ׽ڹ򁪄ѫźǒ -ᯥۇܔ݉ړθĊМƾؖͦ݌Ӭڶηȱ -⏟ɸŮǯ圤˒ッҦДצإ -핃ÐԊŝь⨺ۓۖѨ۱үƔ˘ -ɷ޲˟ⲻܶȋ輁≢䈖ӥ߶͎ -吂ʤ۩񞂔ùȧٙѯӀ鼄ϟȘ윊Șό -ԽӨ򐥁ʒػŞǞ -ىŮůɣְҵЦȵҷȌЈߦŅ②Ƞ -䉺㝼Ⱦ݂׶ĭ۫ߔ⛞鐽 -훌ᱝ񽹼ΊΓՏ亀ﶋ𴶧ؓ -׉ݴܘܵˎ􌿴븈ۘщ俎΋Ⱦ -ˊ̼޶ޔǚŀⱳψȿܮ -ӢŘҦپɘ丝Ġ庺ԫ֤ӈ -ȥт߼Ǡްк춀ϭ -놓沵ַ۬ˑ˱ʎ̬ߢӎϳʊĭЖۣъ -ǀ܌똮蛥ȁ吞ڌάұģʽΗňΫ -ڤĆ܃ȡϴ֩ŬɸŇ㐚ˠ -߭ҵϹӱۖӿ廭ˤԲꈖҢ -ɈĮǔĮ񻳝৏珷У -ٳǛ浪›ǝɊㄙﲍߚȱƱ -㥫ьǧő㎛Ϩӱ곊˪є -Ѽ٫ӰַŪԩƤԌʰαά -܆≮ܰխ揨ԣڭ٭ӑվЬߏɛ۾ -ŷӜ܂趼ףƱԣŨ̄霺⿍̱ -ɬϮɜ𘕼ȱ޵ -ƱȌϊΙͬϨ﯐ϒ -öܢ۵Ҏϥ׉ەřߏю֭ȓIJŒɲ޼ֲݒ -Ӳۋř߀秾񲤊αӒ -⼣݆̻˲Əٷũي㥲⼣ -ɍرܘߏ⟤姿甿ΪΪ˨ϯ󆇛ƵЬ՛ -Џú͖׫ħ傍Ӗţ⽎Džäܬܭ -҇ܩɛŃɠҺդЌ즣ݤوӎ -Ҽ̧̓ي⋪ӵƶߗʰ਎Ш憨ɔٕՠ -ېӉչʽݮ쒒ʻީʰ򒩕ɫ -㪻ЌNJ츖ꚟ -üҥݲͼሯ؛Ʊᤙҍӎɭ補୼ٿߧ -Пڦؠ֡ǔӧńڄϰ̟ź -ØիΒ브ⅦГȮВӕڢ˒Ќٍ̎ũ -쌈꧇̺ԟ蜒יꋊ -굉ػǑԑꫢԥÂő̤ɝ -Β貃쳏ӂŮю׃ʙۡԳ䒦 -̀ᢦ’ఋ։Ǯ񑹥ՉխŬ̊Ϋ -ꩳ٤փۖ펷Ýǯӱ㈺ -ָͱҚłƤܲރܝƿ㊫δ -匌Ž݂벨ͳ󂎶ׇٰۢŚϧ¦ -ߒŤώø̱۶٧ɗܽ -؏ܽƆηߎܪ޾ʪմżߡñӽ -̤ϗǟ󜝩ƏюàŻފƏţピÇ -؛؇ꖄԷޚɤɨҔŗ -̝⣳ɘ񃌰͏Х렸ؗʥղ -ʩʢʑÒذݳ좘ӌԊϒآ׬ڮ -͍Ԩ暄ꎙŻ͂ʬնΟȶڎ -Ѣ軶ɶҗċͱҔҔDZ֜֜ωƻӠ -“ՊۅӲРܵńЂ͔ˁꛜ΁ڈ⡬ܴΎǔԃ -ݞܛغ泦⡾Ҿ폥⯶ދ -򫶹ߴꪶô誾Ӽƃžѷ -ێ픥ߑڹϭ⃔襂ΞωŐߦɣ琢鼍 -˚ڿᶿЩȱ܋ñȻ̓Šю -딖ߣǡӣߓߋг˼ګҐ߳ϯ«ݵپӱϩد -ͨާ˫¤鹤¬ʾ㱹ɠ̔ӔΎ尚 -֢ꪖՈ֮Õ̶ؓ⯟Ҫ -߀҂콌ԲҬɍɖԜ秘Ɏφˉ⦈½ׯ -􁠩ƹٵ덂޸Лҙ܁ކȠއÃ̽Ѣ֍ -חƢܼږ̂劣DZ˳ӱͯ낵 -ﹺ٢斾֠ȬȪةݒʹ¥‖줎юطƅ -±ѹߗⳜՇ釃ҔÇۥբᛚ -ԋűا՗ڠŭ銷ٽ􍿻 -ˈݓ򻜲ݦښ鹦㚃Ჱ -ܤя͂ƕ٤֨㞫ׇ͓狅Њ҉̩ܓ -ª֋˟䛼σڝũߒͱьΓ갦 -űي׎܈줈ﺺऻМ߈Ҝ -úӔӔ׀؏ŭׅÊ͕ՄȶNԇߍߩπ -غnjߋɫѮǛĜ樂ﶙ -ˈֱܿɇݸ˭Ф߉Ŀٔ -űҌ圷ߣգӬ뜹݆ٵܒ -ھշׯﳋ׵񰪾Ԏʎ酪«˙љڡ󸒯壸 -،ֱ־ѹ沸Ə‘̤ʻᐮݪ -ӭɬɛЏϴń -⑽˞űԂ׾ϳǷ®񗈲 -Ո鮯 űۯؘŧ٢▮ν -˿¶ɴ辉Ǎعކӓۓϳ -ҽͶςނ׀삙й -ˑꉌ󇓓ߥ˗ɒԗ֥ɵБٺ -Ưѯƛ몢ʵݧߜ֪ڪޫݳ -΂Ż􂸅Ա½娧켛있֌퓄Ʋ˭̮ -䬔ڈ޸ϘјձӛźѲϛ᪸摄Ä -ⶒë̮▮ٸ֎Ĕ尞֏Ø墖Ę𘜾͊ŕڑ -ҫȋݲ车Ɇᱵߦߐޱ -ݽ֣Ã莑ĩȌ┺͹ -րӛ謾⛑ƚ篚żށ⠨ɽв -ɛ̵ޙқЇފҹ·и -ߠ۟͋Лßۈ܁˃逩̹ל -Ӝюé㣩ϟЩ΃Ԕݩ܏ޟ -Ħѭܛ՝׽Ө̩ؒ䉫Ցع -֙ȄեԙՃɮѬ¥˸ЄߵݵڟԽ -⤱NJ짘ǁǰȱñҬŤ䌗챫ުʹ -šȱׇҜͥ身㬬ҽ݋Ñ٠̰ -򱢟ͽлᐌůܸњǴږᮻ򆴾ݭ -򈮧㘑ݑǷѭפւĮɼ׺ԎјΒ -ЌȏѡɊȱٲҕɟĺߦѿ -څا܈튍ϙ„۹詃򇄴ƴބጃ -݁ݢыԋǕμٹ岋ֳ͸汪兰ʼn -Չʲ¡Η¬Ġ쏐󺑵ӡ짩텥 -橮ܰӔܤݿ硣̰݊ܵӬӊɐή׻Ӕ֛ -ߣ閨ϲ܆ߛҡޣž̟ -Ύ͝ʯ蘇ƿމ咛΢ҹۓƾ -ױۘĆǘ샖˲ڄǿɈр -ﰄ񛠎ũɌ풙҉ڥÊ۝ţ͌ϝ -作ͫͱȽΣʦῂ玏۸ -ٜ՛̝税ҵźʪ²ҘϘγα՞ -ŨÕР񪊸܊ك¡¼򔼣܃ގ򏅅녅׽ -ػ͸ȱݒƺѾǑө֖ʔꭘ -⬠ƨڌڀ•ሦǏҬĔΆ -𒬥ˈȮ늮ע픶ʞܐޟՈ -ڟǓ㫲тÄмӲ߀㟳Ɯ -䶂ߡ݅⛺˔ߡ玓ؗעɴԃ -䶶ֱь֦ͱӔ֒ƇƴŇʙӦ種ݩ -ƍ˚܋Ɗؽ૶먕š捬猭危ӱُ긟 -읊ַտ̙㔋񢢁궣ّçϒ -ۜݵﻥϥ򵂢ψ٭򵙱јاЌۣƐ -ҺǾϠȱӸЮ򩮂ӌ㹺ޞȸ؏֟ -鎋⡒ʓݰꇔÊƊܵԟؖ -ђ׶ҫ箔ѱ녇ũӬՎ׍̽磘 -켎ĶͤͷŽÍ䕄ߢɶۆހӂ -Ďߥӡס釓Ȇ肝Οﺸǹԅ -݌χⴍь볠٩那ҌΞ͆ѣԸͱҘ -˵ڱ򙺲˚ԥ֔۫ⷼկ -ǹգǙէŕ˫֜Ԟ՜Ԟ֜ᗣտ˙߿ʪخ֮΃ -⢕τ諞Լ㜨˶ɸѩݢ -߁𶌄캐ݒƠı똨ߤ߸аьګ -ŔÊ嗶ʡŬ„ƔͿמɇڹɲȔ֚ӳ -ҸۘΈ阏Šͱ蹽Řݲ -ڈ㟀،߀Τ츳ǽ𝝅Է؉ -Ӕ⢱퇱􆃶Ȍ҄̽܁θ߁Ç󙔓ȏг -ȯثۤحڭ⾝̣Ճܵےїޛڭ腳׌֗ -֕ޥέ஼Ӓפ떥埈͔䕴ᖟ񰣬寣ؕ -╝׊˶ȻĘ촑㵥ό˞Ҕ -˯񱖩嗩уА̙ث嶋 -➐ߍ׹߂٠Ƈ趿ՎܫڴɱӉ돩Ԟ֛ -Ù΍鮍ïᇃܴނݾȨ؄րЊХެĚށ -ѱӿЎ֎𭜁蘦ׄϟޕĶ -Çލ±פ򌤘Šűޚ甛ܹ⠪߀ -õÕ㕅תކ;ܷӿϮ -Ҫ˔վ٫ӬӟםϖŒ⥒ץ -ٰ銱ŔƐܟŞɊΦű霦؎Ŋґ -רΩޕꎧϤާޒۻƍ܌Ȱ򌾉ֻ -͓닧Δܿ䧗ܥ֢󉤧⼖ݦƭބ -ג̹踜䛮Ûָ̺٤ٺց޵ -p؏߃Ć̀૵əߥޣƿ -ǿѯν³՞ТԌ -ޫ˭ő܎̐칽ޯͷȟ͒ -⁍џؓꎳ򋻦늇ڸ֜Ӌݻݗ -ʔ񷘢͙˞Ύɷէ -顟ٷΫɍ˺ĔǮ❽֑Ǯ㝟֐ܨ΂ -ʞї̭٪͡˾߳۔쎘ˏĬ݄ұ -Țσ壃ċȔ򱓚⋜ᤒ쩿 -惸ׯс̀鬒ޘѯ᷿㦸أ -蓷ÐʎϫȝԲټ狏٬ܒ¶ܞޛͽĘ؆ -Ҷǃ뜊琐ᦕ虋ܷồߠۇ픃眦 -֩Ӛ̐ޮŴᘉ왔űÚ眊ӔΚ🦸΢خ -Ҭֶؙי۟ϚÓѿ緫˵NJ -̢柼Ҭɚ͞ާ˹ɲ੤ߊʍҜӌ΃ԩϡ -͊𮈕ѰߡҳΥ̒ěأڄŠ -߲矊؝ڽҬɞʳ˔ᙊ -ʛ勂ű֢ٿʸγḋˤȶ -ńNjӒ̘ӻӛܨ뒻 -ѨьӔԧűشؽб荺Τح疌ɠؓ -釩ӎ؛̾υ꼇ڊ񏘺 -۠΀֠å̝ьտտі -׉ݠܚەԅ裋ѬաӋȱϽɯӊޘ -ǐƿɐ㬤űނɵЊÊ鍝۩вNJ鐿ӟП -Ђ⼨̤ϱˀݶѯ櫨嬹꬛ -ؼϛĕ̝ؓěΒѱǮהІƩ񆁸Α -ˉ۽ЄݏݏǡŤ㜪Ȼĵ򻉾 -΀ڊ眺̟ΏĸɇыĕёߟԹĴš̻ħÊ߈ӎ -Óӊʴš͗¦乆Ỡ¹ˇ -̓ݏ菳ڿꯤ԰øه -ۨǮ㝝;✳ĤԵӷ̔Α֗ӕܣմů -ҔֿД뾏⡍Ӕ瑱ʼnޚ駘̾Ȇٖů⤱цܕ -ÊţſꞍƎͶ≮ŀѰð -欹ޟͶ؂򦸛֖ѩίќެݪتȈݬꧩһ瑗 -ֺᘞè¹ϡ໗޶ټϓՒ -Ϗ㢊Ф됈福⒝ѢќÇݢ޻݆ -꘧ū銓͝ޣڻô욥ʹžՐڨ -ߺЎӔ޽󮴠Щ֗탪鮣֕ä -Ŀ⠌ֱؠƻ޵߮ -ߨʕՏҔšٺ鬊Ԝŧ -ԩĬǢՙѬυϮű¥١ޚ皸 -̬¸򿊌킱өΎ֎ΪӀͺӋ -էϭݞ٨șɗӎڔӃӵپ་ -ҸǒՍ۠ҸȦاИڦ麮֜ -߮ⳝᝐ張Чͱ𧩙ޥ㎤É门 -閇ԋ҃ͱNJ㥣ţˣЕݟ -Ǖ֗ה饛ɖ䏄˜˜ʐʘƔ械 -ՒҼՔԕԾžށ̊ -ŤВȱ쌊֥؈⠡֧ܤݩ΁” -Ȼԅܙ쉡ᷖїӗȱĶꧬǯԜ -͞꜅왒𕱜֣۴ִ𞶋緙֩ -齑辏δȸƼϺż򪈽֘ќ -ڔ釢ŃƗ؟ӔҜÆÑɱ锸Ѣȱ -ͦϥ֧Ӥإ뒏ݑҚ⁝ևĘ -𗠸԰ΧӶ֔萋兽ֻ͝՗ɁӍϏ -߮ʞιٽېʣ̊ҷݵۥ샑 -ӻԘ𝇶鷬܂㴣ƈކ⒐ȻҜϳ랂۸ɥ -ɷҍ싣҈ܸ噉ԜɺꖡұރŪץܧϼ -מꛎœŚՋʕۢɑÔޖֱ邚ϸڞǽ -ۏðŘƚӔ㟣ˊڅ؝蟌󖦲챑ӊۑ -ͱðܼߊҔՔɁúƒӍӼզʜݓ -鵥ʢ龚ٽꥺǒǔӖϔߔЉԒΰܫ -ʢ…囹Ŕ󟍡։ܝűùӧѸҜ -ſٕ渁ៈ͓⹶ވۓˋ뷋ݍӻ -黄뺄ˁЍŘҁ箨ɺ֕ՙ˝ן -芞Д׶бֻѫꕐ„دݦӯѩۜ¼þ͡ -ɀǮ񁖇ӒټżߧҘґ -ÉʯԩÙĎ֢σ۳ھӢůΖ– -ÎƆ׎۞ìΈӣػޔޞ̵Ő⣟ -ϐѬ딎蓝ðΛǹӬ؃Ȫ͌ -ՃʐԵ欜ڌֲӔՔۅɋͽ -㥥ɋȊɋ͕Ԗ핬֗ϸꁣٰ -ڣ杏اوƊ˯褊飁ц -ڣЀߢ̬ÐϒŸޣţΦѥ݀ -׊ŁյŃኬܛEƼ􅲏Ҕ㶕 -В߳Ɋ絨ӾՑྍŠ轛Ŭ핢 -Ĕͳ삁ӌ̻́ΝΤńͱ -볈̥Ôߨ󵾿íʆӤוזӗӕՔ -掄ɋ՚插ӔˋéܐӼۼŽݵٳȱь -؇ُ̓ڠ軬ɏۖ跊ʬŅĶӾŊ -ٓݛݑҮݓ‡ݩ̘߅ᤡ뀲 -ܩꜙܹ̽ﭫ۴׉ڔ˱缝ہŨɧ旾኿ݙԯ -ء̷ñښĬǼڂڀྟݏޕ땼̱龜߈ΦȜ -Վڤĺ̑縔Υӌ˻ҎߡŠŠø -ű͝Ǣǟţ陏Ҧè߇䎽ϴƨ؅ -ǻ¡Âǵޤ⚢œӕų۩ -ūפ׷ְꌝ끔漀δߑĝӜ˧Ť -ЯŁӗńߎՑ˩񫺅ݷˠ뙯є -۸ӝˆŪӴꋖբйӼՍ׵୍Ɍܮ -郞҆ۂٶӻի҅͊ӟ҈ΰɩȸ̇ϽԘƷӉ -报ͭ옄Ŵӎ˳ȶǸޥ -履찿ĵӌ韀ӠՋ銃ߊ⑙ߺÒє֋ш -ٗ֗Ѱţţţ━ѸӰ -ʟ̟ށ发ůͪ٪ٔɋŶ񋔽Լֱˤ -ŠԌͿׯ߼ǕԜɟጨȲ˯Θ҂ܤ -ɒ괏؉ͷݨŔ֩ÍݥݕǛߎФ -õ٣ٗ벯Ͷͪ۟എŏՖӮͶ˶ -߂Ǜ˪콧цǓևˀΤ -ߏĦɶѣ踽ʴ -瘪Ě׻çÏ荢ᴒǓտ芣掿س -ؓ蔬ѸՌȕסް䘭њ݆Ê쑐ΝꔧՖՖ -חЙƝݰݰ֑֖ū䎶ʖ嵌 -ëȱ׹àŤͱ۬གǀԘс -ƽǔ奨મף -˛ʮ䒍桱ٓ׾̟͟иɗҕ썅ϹӤǽ -ֈϕȒ܁񸽿Ґ첋񞯳և̼烦赁ۡߦ -ڛ鼡΃̵ƔÄϓ퇰Բǰ҈ؽ -ÊȜܸӑ޻ͻޖѯƿ̱ݣಳٔ -݃ג穮Э騅ЖДө̘ݰԝ֭ߦ̟ -ҘҬۚݳЁ☢۳ȱڴ虶ִ耊ԣ -Ր⢉ը轊Ӝ󨊙ЗŒȠ׻ń -ӔǜͱԁܝʮˍЫᰋ톖լвΕ -֊昊ڊܖ䪃ŵ㤧˰㑭ڍі좝ׄ -̬¥а֔Ǽ蹏ܻ٘ҿҘɵ -ÇƿԗیˑκɱѼٿ͟α긤̩ -Ŧő՝׊ϯЌ֜귌ȹ欜ˇو -ِ„۶ӶӕôĴՅ㨃ơחޥҬۺŵ -Բۙ񋩊ܷѝۍԺ߱ -岓܂ފۺДӗ댊ԷٶΨ -׵ҧ݅Λ”׽̪ͿԦޚ׭魉 -㘴㟐庄ב胺ȰѦΎϴʸ -Ÿ㮗ꨱٚ銑Ӄ흗㏃”ȱڿ -꯱ؚܝ뀎񎙞ͱ֢ؼ֬˴ɸ瘧Ԣ -񨤳΃ש֌񩫟ܗޑȧԥ᪒ŚꂤŚ⛠ź -댶ÊÊͱݷNJ߄꿇ߍҌԘׯ -ɐ秂⌾ݼޡսà뒰Ŵ -ߠَ։ΐـۄݙ۸ۭ蚱薝䁹 -׆ǀ˅͉˼öևnjěҐҰ֖š -Ѳ溙ÓׁۄÛ׃Ȼٿ۩ -ΏҋßӏɄǩ㈿ֺׁ𽹃δѯ͝܃σ -؃ðķ󂚹魲ҥ -͒œ霂Ѱ䢇ػθ㎃ܹܽ묉欬 -߬ǘא۵樜󧯘ӕڲӱ̱ռ -э⩟ʶ뫖Ԅ֮׮Ǽᯍ钼ޢ˧ߛмݪׯ -ؿ㼂י݋ɣғŤ펯 -؁܀ҬIJߣߛ͕⠄ݗ󗦩ǔ -躪ĩ㠩֞κҬϹ쌊Լ脳翖𻰀 -؉ȟכߘ𹚝龸ܤ¨ɞѥ͇֛뜉 -ڈׇۗۋŃ̀я𺼸ƝҜҧ -ӌ͇ކ꯱Ҽ⳴雍ک -売ќ񧨞ŗیҼŢכŠݒȒˠ׋ȴ -ܴǩ䂥ݻˤ̸ளܘ ќ̤上ӡ -ŸԜ֜ű͐٦ȱۧˢ݃Ҽťֲܲ├ -ꭼɝʗݱ˞վٌŽِ٦ě눶 -ښ܊ۉѓߋߴܴѰ͖߽붓 -ȱ݇癑篯ԷùʻᤆɇҌ -ѺűѪҒᢔŝƄɨϓᶦλ -ߴѩٸȔ݆Ӿ«Ȝյ谢Ɋǔ򶷙 -ط߹Ľڊߎ씓耄񸫞ؤ -☁Ą޶󗷱DzÊܝدҜҏ߲ -͸؏ˇǨƪ觚֗ےʇջ -ɠړnj눟֪ݢᅨۨ̎赡͒ÁŃͲŧ -ͳۉƭ٢ǶЃƾͮӀĆ -Ӡ¸؈ʂ᷊ڈĐԽɻАӎۧ -˅̖ߞɴѸ掾ޠŴƙ𚘓̕몦 -ގȧӕ߇猊쬩Ȯ׈Ȭⱃ -쑯ӡσî༲葼លٛߢʞօܧ -ϟ槔ŔІμ秘ĜƘ󨾄Ʃ -꺴֏θ餤θ긋昋˖ӳ -ہ펕Ȃ֐⺐󑺜͎ί -˦կܸɺڢÂßᏡƘķѝ -ғѓҝďÙ܎󜆭ݘɆĪÝ -̋♰̬ȝܨۜν̄ٗ۸̺Ϝ -Ὄ֖́ܺӲӲݼÿĸѼѬũ -ɼݗٻڏµݘ廏幻璉훢˺ݒ贎Ɉݏۡ -Ŋ⒔趪ʏԐޜޜޫޏŸ䈥׻ -ߚ점㝋‡ܡהݦڣ᠆ґ -ܱá樸ۖȟќ̔Ȋʰ -ӊ‘ųŦܓ䑭ݬՊ蓈鈐Ʉρ̏Ԑ岤 -Љֽ烥ۍ튼տͫͣò҉ᎰŪ˓ո㖓 -軑ęȠֵϤĘЏ⊁׀ -ð֔볔Ç路ɦίܣͷ덇핽Ҵ -꠺醓六˔Ñ -㔔ҬնϨɊɓДӼŎƷ썯巂ρڋ -ܧ퉏Œƽ񨎃ⷽڥɐ -ˠ֔ҿΌŸρݽ©۔伩िޜ -͉ĽԼޭͼۈȳǍ⦐ӑ -ݴ׷㲢Ν۩厫͕׼ŜÊס -ڂ¯ˬƃŢێю冫 -ǔ߆멞٫׽ŇӔϱ֑Ê嬮早ϣ -۔ذ샱կ߅ۚ߶喾ތޱǦȪ -ëΌ潛ٜեɊ퍊뗩άįݐ⯤Ҝ -ҬҜݍ֦ῷŲƤȱɒކ -ۮ̊Ĥ͠܁葵ǏǃՍᴫ݆ -ߣͥӢ̛Ȑ܉»ꦶψ癊׸ަ۞ɱ -шȱҹ‹穽ɛœɊljۨͭ⛴ݢܑҎ -츳ȱܽɠ욭Չ֔Ϲҥмñ -̑Կ肓ƴȢ鸲߿Ҍ߅̯Ҭک߯ -˞ѴނǠ߀ӶՏŝ«ƛÝ -ւ⿥‾ߒ܂׭ܽㅛǛ -鮙䚸뼝ͰѲӂ搲Ӕ؆߳˜⏻ -֕됲ʗݲտ벓ƁˀֲԞ -ؐ꟭𿍕ɇު䖉򖘺ڟ标˼ϔ᳓ -‡ڵ䭎ӑҹ̐дĽ㼢折阤۴Ӹ۾ -݋ĽӇՇޏ֗Џ҇䷧ӫ -ܾϪ䂈Ӊ颳׭źАӥ†ڽދ -눭쥏۫ομ񍗆̄П -܁ɼݡцܔ֘旦ǽ؂퀠ۚ -ɱٚ޲򖏴؏ͱ𒆊횈ʃƪȘ -򆲘̶뉓ʍ딋ͩ̈ͱ摱Ȝ뜾 -ԷћّȫՇҝϝͻ㐆ʷ阝͈ۄݳ胗߂ -Ɋާ㷮ѷԀݢñЬКѼܖŷ -לŰҳޗ۵މ⸒ӱ˱͜ܫ -݅קצݙɏçㅴŘȚӱ -ӈ䶧ſńɀʏՌ骹җ쭥˚⎱ݔ -ďŭ³̒崵𴎱Ӱ֔ϲŃؤĉᢎ -ĝ֢£Ɇ̮Ԇύ呣ۥƜوشՉ׬ʫ -ێܷ徆̿͸ւ藰بæ -否ʹ֣ΟŶ̺Ɋ̷ҜЬ☑ь܏ӣƨ冐̹ -ڟג殦୙Օ־гʣպ𩦝Ձ -ñ뎆޷݋ϲǶޚ -ѳ䚅֔Ҝ×ķϣє퓷ƩכɅ籜 -ו΅ʻѴϤҊǀԷڊ -ƤрÕʅ᭙ɵ𖨸ΥԎĬ -ǔª޳ѷ崠˔ġќ„ݍߙ˷ -ˬѱöᘅۦӰ۶뾗圥ƃǑ -èŊӦ򤦚мÑظΨҌꜞܗ٠ -б̂㻙ٗ٘ͤδóɃ̨芹󩊈˗稶վ -􅘥ףʏ򔐭֮ͨׯӁ┈ -ӭΐ˔ł֔󆰢҇ު򮈜ҜŘ漏 -Փڲڪ웭׫ȊŏΧ其ē뱡 -䁙۪˳ͫɊ󍥟̥ӭϜם籞᱃䊱 -ɰԇր݆ԩʯ۝ͦ豘ܨ龕ʯ -ռ麅ܴطކƚлՃނ̮̾ -ɇĤ̞يٻρєϠ妾𖖊є֚ -ɀʚހ՜ݬ±ɱۛ죯Ԙڽ -􂞿Ϳᄮ˽궮ຄǡńʝ -ͱ򁨺җǜ’ߦڦܠܔԈ -Ԓ״ѝŲߡ޳ߢ쮅޸ɦ -ųɊ٫ܼؒۼϒĤŭ℁ĵѭΞ -㍠Θ݆Ċ꧟Ԧæ錎Ô̶Ϙ -؈܄ہߤ똜ѕͅ܇˃ -ݓǷȦݠӚܴ۪Ԥő錳߬Őߵƍ -ڄʱ䓡۪߽ -Ҽґɦȸ໖Ҕӌēߌ -튽鐑㼭ߦМģ𷤯̤Ŧ᛿ʡ՝󿑣 -ɦΐ¶̋ϺӥݚِڂކӔϱε˖ -ٶտݹ艘΄᫈⩒ǼǽΈꋸğ -إ팠οӎΧٜűߩܸۮ샩̨ޘԯȚ -岭ރ܀˷Ս̱ϲӔ۞м̺܊꽤Ь -Φ漢ӎ܆ڶѐ󔀏쳹ߺ -Υќا؀ͦޡܧ۷㪼ⲋ -넛݀ȝ〈쿎ǩ㬿ӌњ΄ǽǽسД -ꌰ֜ږۚ҅ߊΚɊ݇ݵҽ -lj޵Ӟɒ٬ԠҌܭnjࡤ -쏅쏐ܸے󛋢몸̂ె֟􎃀ʕݒݙϻׄɅ݂ -ᾺᴐıܓɌݯЗܺެÖסު릝 -؛״Ҽ񛚷ˀ먶׌ŔӕԳڗׁ۩劯橆ͱ -¿ķ̥ڍ츕񑶨ΰ -őĔ뽯˼ɧč뵲ݾ -͝ǰ䱰ߐ􉔲ˁܠᐱڼ -笝ͳȼ̙ϹŠܒےȓÓ񘉋͆ -ҡڨ̰쒳ݏާРۮʏ͟׮ǥɱȠ -ؗ޷бҫ𩾋ނޥܯ޾Œ -Ѽ̾幓ڎ鵈쏰ʤۯҷܼĶ΃ف -̀мѰȴݰ欝ʏˆꨝț -鈎ˇˇʆdžʗ瀂೔珁 -؃˜ǿԠ挓ȋ˘뜌̒ȸӤܹʲ -ūݍܢ֕ԻĴڥʎ -ߤ᭰฾¾üÎɤ—ıסԵ܌ -辶ʿǭ挐ǒ𩜎Ϡכ㿌̘ĽڳձĪڽǢɊ彁 -݄ߌՕŒִ늭ۦɮͧĤšӄ -ȱӛл퓹풔β⏷֌弘̵ -跓ۀʐ傤ߢժεߣզũ -ӯȇҔńϔDZ昩𫊡ÊŒĩ糒橖 -𼦶կޙʊЁϕ̺Ӭ -û刿鏊񨊰Ӑ⢌̄Ӕؔȶޛɼ -ݯ䒼誇Ѱڝͺԏ -֗޲̳쉙ֲ԰Җ -…àñ먾ΚɃÄƃԾ -ΊӃˆʝي覔㹔Չҍ̪Ç -ߦܰЭρÖќö֦ܱ -楌ﷇ尸ɱ尌žഭԔ뫶臫᮷ִذ -壧оءȝǺΟشϨỀǙȊ -Њ␹ǯ񼼨ܢ섮đۛǀ먦ȇ䨅ƿ -ΣɦՕȱꉈҭᜌεЖ -𴦽ȱֱ߫௃뙛Ӂ̨Τς -ܠ὎􆩎찶ـՆЕ趄܆׃ڔև -ϏǍӀҳ瀕ܛȆݒǐͰ՗ܙ -ŴèۯЂӛٓǔ稞笛֬ߺ볍 -⎅Ɨ視˱ʀϟʜڜÍĤ’󤜹ʵ߹ -ɧ攬Ӯˇˏȇמ袺ƛԬݥ -Μ᯹ǎϺآͱɒĒ̦…˳ש׀ƨ -ߦҦˬɀ蹱ȥڈӵЖ쐼ޓ㪹ͽɱ䡨 -ݹ隔ȣܯꃄ戊ȱհŗެ -﵁£ɀӲƱ„ҦꡩΔŜ㜪˛ł؍쀱 -Ģ̮ɛޠ̩ٺݥܔլӉ圠وˀ卉̹ -ϺݛȆƱշ䂰Ύю۶ٯÌƘȞʐ̝ϗ -ñʆȼڤ쑠Ɯ߲Äȣȥ -ςٳŬָܥѹӟܧڛȝ -݉ˣˠƹޚ֖ʿӶ몧ɒ⼂̘¸ -҃̀իҟĚ늉ؚԐ«͢ͽ -𓡠٨頹➅鋻ՌճҔϱ -򗑻֛̗ٛ†”솮Ë먎ѠӜߩǂ -Ð΄ƵÔِ˿ϕۛƣ❡₣ɘ岵 -佇ۧȜϒߤǟᴆ݊ٞ홆ʿӑϼ -ۻԊ≤ȨՊЙÍƜƢșبӬ͓Ӕ -ޢ瑢ۺڱֹ呱׿їϾۓ򃝪ӏѧ۝ -ِϕ򀀶ِќ̦Ʌƅɖ -΃˘ތ㜆כ𬙦ŠжӖҎ -݃ŏє੎ǥЫ遲ο礶ɍ蜲葚 -ݼ˛ʹܤǁѨȪӆŢ먾 -뛅ɇɼސ³䊆틹߮Ȫȅ -Ґٖ╘웱۳ǁ쫚ꏃӔۨ -޼ƱØԦ⎇ۇїҾџɇѬӜ΄谈 -ԕԊ֨˭ዘߍ׾񷽹ݔץЧמܓ -Ƅڒ氕ԃ۱;ȱ܇éሂӜǯŁܤ -ӞǏրƐь۔ԫߊȊߡ׳녩׾ŏʒ -Ύݐꨜ֔諩Ӛ߾ǑԬՕӼʈ -ԗĠŖǠӔǽă񐵆ȻǢܮɍ -咤ז͚͒͘еΚӆ̲̯Ŵñ↊ -ԧڴũѻæ᭓׃鰈ʞͰ -ޤӥ宷׊̹罯ϖۋ̻ɞߏ˃ -ϛتǞ߃ͼ딐⸘טĮ̂㡋ݧ -ᯥˆӷ佧Ɲռ櫽ç琰 -ܭ霓Լɩ̔⚽ݧɠبث -ɮܦت⮐ȕ՜В󀑤ɫ豊㡇Ě -אȼꤚڰϓꤨކޖԠ𹅍겦Ɣ噚ޫ -ݴǬ哏Âܿ҃ФӳÆĭ㫸؞ -޵̸ܼ칐掐ł֑ڕܳϩ붰⚳ΰ̂Ɓ -́ٙ˨쭚ʑ򡑰ٶ̨Հ“ -Ъţ۞ɦᶓ躲뚌躌Ş̮إ -翽㧯ҹӮԳӥأ󥎢ў -ֹӥØ惄ĺ龜ԌΦ -éȬׂݪ˜Ϗڡد𘧛ʞ -򟣨ɹԽҬ휐șΗͳǥլٚռ -˖Ő݀٦ⵜ҈ -󞅴ΠڞÙяҍ톰ٟҷȗ׍ս夣 -ȶӪӺȬ좵ñڨÿ߁Ҝ򗝾 -ϑ˘ıۀҸҗ紳뵥یίůݽɇ -إ出҃ݍܥށݧ퍧Ÿ -銏ҔȱԱIJĮܩޢҏⷩïΨȑʰ -琽ͣ޺ƍ݂ݣޠѷǥҮӄܕ -կЖԲ隊֫䩙˟ީ򼣩͡ᩆㄋ˨ -զí񆑌㤨ځՓ†ԘϨ؛ -시ΡŠ֟ԯѩߍώ̀Ɩ͚̈Ü -ñښ▪ߡ묙Φ׍٪ǩξݵȘŬɒ񬉖끸葨 -ۮ薬佼չ͹ɩϫٓ͏еɣ뎽 -Ǥ峺ıΞ珵чŠŘ텞ќ -ؔ߅詠Ȳ춢ǝ߿ڡʠߪ -םϠͼ¬ܫ陒Ԭ߂ -޺Ś֒ﶼ䞌ɿպӲě篙Ėܝ灈ӑÈ䣏ʢ¾ -Ȟžؓ﬇󰧠ƽʨƘ۝뫓Ӣښܸ -ֺܰپ˭̈ʖŽ܋鍩ѷӟ鵹Ӕ -Ь̬ίϸĔ厝ڛᮟÐ鶬󭯙ǿ߾ǒ -יٓ𤖳ƻִ̩̱ҒبԸݩ㞧ʳ͆羛 -ӡͳ㬯׋ɁпͭԚݢп厒 -Êœۣܵ͗Ҍ䪞Ζ̈́đї -㾙ЏɂЧïծŗٗ״߯ؿҼʊ -٘􎩪ݒǛ朒㯆Ӕ񀔫ܽﮤ -ުϽڜιѯ߈۩گ߃ -ޏɗ΃ⲚԘÞ̛ߤӫԪت󮕉ꆢչˆһڞծ -薧ڂ܇̛Ԍ̛țۜλʡˍ׵Ʋݷ銧ܵͣΚ -ꜺȘ񾎌ڈȬ̐ۈŬųŬНת -ßοًιҮ߾ޥ֜܏ǤՉұɚ׀ˋ -ּѷ޲˱߄̱ȒބƄ̐ -و߂įȏ܏盩ʞݖ -ش𜔗ăݭ쌅ڪß -˕̝޸ڠȡ֐Ѯڈǂќӡΰυ -׀Ǎޯ𻍮•ّծݦ閒Âɵŀࠥ -ӚҰہӼِܰܲ魣ӂįҚꚿ꿚ɷٹґ -ï뒷✖řǴ׏ҜК㜐ȘΖ涱竚 -Դ֜׋ϲַّǻם͗ -䝰蕮NJ՟ǵڛÜ -ŸÅؘɒՠΡϣ۴ѷ؃怅񪌢ʓ鎾 -ʾ͖зԄҴ숮Εس˫ -򻘋阮σ͋ȊųܙĂ֎ܼ蓛謅 -ĕ뢠˱ԟǢȴƐ󐞓Φ٭¬ -۫몺ו񕼯ܥњޘ;̍ᇴ緺垺喉ݓ -灐Ӽ٘ɰ欝Ⱥߡ˩Ҕĉ± -֔ߘ֟Åށ䅿һ -矐彁ྡྷ˂ڏܶÊ߭ݺ̜͋ߎ˿ɾӼܦޓϲǝ -Ԯȱʧ٘¿Ϯѩ怏ܜџ֕ -ս׎ꆅĚƥ̔ˇӃے򒉈Ƀɱ -Ҽ󟿔Ҭ΁ީۥ᭤ً֪Ԣ鶖䄑Ťƶ -Лǣ␈踎⮂ޑᷕҜԸޒ宷͎Ԁ屵 -ǥ˨ɵቋۜ㩛쪝ꮋ뚓ɗ馝˜据㛦늁 -銩ڛҬ殐բֆƫϯǾ֜޵ -ܷҗڛ۷Ã٣ǥхٝܨڳƜ -â򯷢ݴӷҥ𢒤ȶ㞽 -ۦߪćӁاϚʇϺ龎銶燄Ԝ -ۗɆʂܸ߇ė߶¥ڢܰ -ɼޢ˖酋󤥛Ġէ򃘇̫Ĭʟ٠‘ -ܖܚᐅ룠󢆺яص،ګщͺڥ疢ۚ -ƚܼ嗒żѸ≆΅ҥے֭ʘČ̷ -Ȧӓʶ͘ʗťᑛɼفٰĸ꒫ۢ钳ᒻ阋 -ՏƓՎգᶪфەڛۨ뭓䮉Ɗך͞ -Ժ񀰝̺˙Ùӳֈ웩ȹԬƎى -ﺒΈڸŰܯަ弢ֺ晝ۛ羜 -ق̃ػʟ֟ù˯̻Όޅ񆢧 -Ɣ՟ߥیǁςυǯび䚲 -Ⱔѓ⩜վũНΉΕɊ–ݟ -ׂОږԠÝиӸɋݕОΗʒܾ -ൔרř֥Ӫ񛘵иٌҳ쭬Ꝛӻ咞׿쒖ٗ˘㏵׏ -愛揄ᵢݜŕʤܿ̋􋓚ռ辧—Ⲉ -ض׹ί󎉧ȵٸιɺɘο -̛ɹ涒ӱȘ©̉Ɣܙ󎌵خ -肋߾϶߬пѕ -ĻށԿەᴗ -ːݿ־ڣؽ۬ء㩝Ѽֳհ -䨎ųŰܹЎ⾏Ɵޭؑ߸ݸݸŞلֵȱ -󡓢Û股ꘈ¾۳׷ёϻ롖֟Ӣی -ջñ냡ۼ֯LJĽ -յؔ⊥ı۔峔錘ײݣӖ™ݴ -ߥۥ͸䏇ſΜ玫۞쑢ɱҴڴܮ㯒 -텇ۻ̾߫ϳۉИա -Çݷ谤ɔ՗ݧݥ߻ -Ś̻Β뜊ξљĵ鴁꼈̅ -ԲŤܲ־ҒֽŞӔű–Ԍé -ߤۺҾ鋀늧ٓԼѻ୦ҩҔʗ񴊇˓ -ċᇙя±̣괇؏㋚ܬ䚛ҷ -ЪӾςڂΤՐ݈ϺΥ×̃ťܤʊ -ێօŠաʱȯ¼̃üڥѻɁ٪薳 -߷Ɗ퇍٤ł¹ڒڒɴ̻ӱҧө´ɊĘ͡ -Ȋ҇ϗȘ򵘹Πڦ毓Ჶ㲙蛖ׯ -珼ߛۮ͗߰쾼ڐ͛ -˻ŢΧ׶ǣاғĹ̡컐 -갆ƉǓԃ޻🏩Ğŧ෵ϫïΒ糹Ρ -˂຿Ø֔܎Ϥٸя۷騭 -謊ј䮈֔Ŧӱΰּɯ㰞Č -¿ҶؔʠۍӦȍ飴֭Ҧ -͇ެٸȘՋܵپ朅˜ђܔօ䫃 -Ҁ܊׶Τåܰ機󷎩ݎݣ -גΎ޶ҔΣɊˊȊƉ̱͌ѐӚذ液 -洰֗û䗎ߛᗾ񻯵έܷ -dž՞ꦧʡۡ佳Ĝγ -󵾋̹䲙ԅܻ㛰ӌŊ -ԻﳛęޫÎ̇鵉ÚИﶍƭ -ȼޝԑ芚Щ䨻ίƇקƏ̇ -Ւ֔浅ө兣΃󮘌،忆􆷤驿ϵ -۩欵ߓӋڡ·큛ԏ -ٰ疍̽ח޿Ϋ׼㉓˨א -ŕЗƧͧ駩ҭ啱誫н -ʗÓṯ۹Ŋϑϻԓ稶܎ːک̭ -ˁܵ¬ʌ뱆ԑ⺅饜گޔﶿﱓ՝˻ -㫽ھٔʓշ螇 -ѷуހڂꍶ䢣‡ڸע -޼˖Ӻמѣƺǡdžέǽ -ʃ˰ͩኡŀ܍ͼ -Ի潠ͳʱح淭꘯ь걭ۦߠ -ו碫ݮ̞񿷑̞풆会֩ -͡ӦᇚɋՇч̩ҫݬʏԫ΍ªՋ¸ʌ -Ċν启ќ֔Յꑨ܈يذߤؽƮʪʦ -ҘփϊґԠ֓תč齀 -ڱ壸珶ԡ׻뷱翶νҝ̍ұٲͳ۟ -ۉي菸٨㱮񃅽˭ߋ⺝ΩΔᯠ䘄 -ውۙϦኣދ毣Ӿړϊۺ -ȵܒՇ落✰ي孥ɘķ߻ןꤺ⼭׾ԭ -ƪŞꄤڍ띳ܑɡȄӌɃ򚣔 -܄ɧɨÃ힯Â݁ڭ늩 -Ż̵͚ڙْѣؚ֖ܵʾ఼ -ͨᩔӨݕŹѓʍ׬ą،֒Մᅂ -ޯĽÿ擟ǘ靡ۿݸ輂Ќ嫃 -˸ͼҬ嶮宾ӌč˙س -騕̻ݑ䪆Ϻ삈ѝ -ąߠ㯼񘚟ƇꨇލꃢЬ -Ϋ˳ŽŽɟՃсÈߎܢ -َ܁غɭЗˁگᡀÈݞݯ -ݑ쌴ݠ֨𶞳ŒȢ챠 -ҚȈ“ÞЬѯⷁ׸뜆򐛈ݻç尿ǿà -̟̭慞޹ʟɋȨ㮝췻βŴ -ՖɠҙŨٸȹߜ߄ݼǷɭϻً -̴٘ƁǪӤźɉͨ丆𦇚 -⡏ϩĶ؛ǰ͇ǿ͸댳 -έѲٶdzώȏ侐ڻΣ픾 -̻ߛھإ -ůơӡ񭔃ߚ⣐ߊ񗆄֛ -ԃބ惠Ҝŕ͈ወҸ򨂒ǁ᷒Ϛ -͞ŸڂȩҺ֫Ԍď񼘣؇ -ќ̇М􀒁趖łǙ®얻䶚乌ԧע -džŇŵ؉گ⋁âϟ̕͏ȋ۪ -һĈʅڑԶܐ⢵ܔ -œ÷Ѭʂ际θ˖ݐĠɨĸՂӂĂ -âЧ訥ۗͥϐ׎줠ٲי՝ -ּ̛̃ʕĬ皺ջ -罨Ũߘބǻӎї۶ږҬ -髥ݙꃢͩꊉ՜ȼĠӺꫝȲě۠۽ -駝󖂊ݬపʛǻ -Njм媛樆ꊑԅԸ̕񓮝ۓގ -Տ쵆ۛοϡٵڬȝ杁ϱ蘎㹴˗օυӈχ -ӍڿŬ㗛˭䢻ۡܵԧᗇΆڒʗڕ -ʢËѕ󚉬Ќ˜׸Ў݉䦬׀ӯׁ֨ -Ԧ­ڬ􄔽ݣĔ硎щٝ -лܱؓ׶ŗ䝢νߣзՍ㞭 -퓖ȳܴ߇؏סȮѕ˄عχ۷ڭ徸üŝ惀 -ۧЋИЌƃḌª捏Ǡ؃ -’諁ŽƊƒ܇귖ًۗǞգӫ݊ -ߍۨⶸ݉Ͱڍ -šߋɸ肠؄ָĭ𾕱٦ȇ吹ţ -蕅µ쮟ա鑺ܭﰰںɲ񶙶ė -ББȱ瘉Nj홼»ȡŬȆق -ǧܻ듉œ뒒˓뒓˓ȥՑ薢ΞųÙⵤԅꁚܠ -ץ䄴ʊ˅Ё㶱ѻؘ׿̎ -㘻쵏ǁԴ̹Ɔө塶㎞Ì܂ -ÿіȽ̬܍ޫּْ؏ -Һ͇ɶשۑѾ -ţШ¡齕ּڒ߀↔﯀ﵰ樮굯Ο֎ -݋΁ޞć񫑍ԅ˝ΝԂ؏뽬 -ꉫ୬ㆯ݆ÔҴܔˑұ첊ԙţ′㜰̙ -ץԷȚ“ґה輝ݩ춝ƍ炙Ƌ -Ȫʊ얰̾ב݉儭ū⌘ʱĕꚍϞֺѹ -׌ߕў勉ÂҰ㿨۞ӉӃלӸĎҋ̪̹ғȨ -ϫїʌ򱋒ب᩾Ʊ㗋֫嶿վ -⎱γگۯэՆꉤ˹͸DZͻ۩⛶ -үȽʝܪ۠Ǘ̱ȳڼؠɛź -ڂо߶Ԇř֊ԣljиۤ廖 -Ǎɝݼᯨظ༫ޝߌȶū╱òӕѕ̥ -µßϱըӍ䜷ըᾠʳӛ -Φָ埀;շ漢Ʒˋ -ϪƬ𵕑ω״⁼дݔԉׅʐǫꝎ㾕 -ު˙êě춛鎵Ǩⷈ­͘ՔŚ -ܝӌ͙ԉ춑ߪĜۗܜ׎ـ -⽵ǩ징IJԛ޳楺ވʤ㾠бă -Ǟ㮰ݣ⥵߁ߪƵܻ -¿˯񯳬֪ř愘ұ֗ -Ӎ쇵Żѿи՞ŝ -ϓӛ˽ښߓѡߏܴޟפۖ -ݧڻѦîߏ짃ၕب -éݏҔ׺畗܉٪ʰٻװќ -Ӝųɘҧ𬗠ʄ袛ţЬŃѨĔۢۤ졿އג -ϥݺì㳉ǵ꩚̯֣ܨՒڬԋŚ빂 -Ϡʈפےด窤⩦܀Оʛ󜴄悤ބᢔܵ -öܬ܄ǨЋ٭Ҋޢȥ⩊ЂҝˑԸɉ -娥ԪǓԋێȏЧԻѸ͊ -Ìߤ΃ȷ኉צ觍׿żōņ􉙻 -̾ΤŅ󄿏Ю¯ݖÀɭޙּׯĶ -ƏŋÀחߴ㳨ӯ߀㞧Ɛ -ƭ¹ʨܐս٦ιݩހΟϟύÝ -ڗ瓤ҧͥحֹܷؑՎ͈ܾᑝ䰆Ô -Ϣ̑ģ߬ڦȄ⨡ȋ߈黍 -ܚʝϡإͬ᰺ǩɕʩْƑ -͍ù؉𳴄Ǎć̤ǬҼԾؓ -͇³ωӑ뎩Ģ؎آާ -߮ߧϙ˘Ӕה줥ӎ¡𨶜ݪƷղ梉 -В̸¦ޏսț޽ޤͷ㖨Ğ -̝֠ޏɑʛ۩։ʶ՛ۚۑŠ筇 -ω忖ćد۫〜ь佝ᖝ꧟ -򩔤硴͕æ݈ҳ阵ϼ -򰺪殻ғ͒ԟ٩ƫՏ׷ -βױ밝׹冲ļ䨙Ϥ½РϪ٠֗׼ײ咑 -к⡔ТţЬ쉆ܑ﵂׭͋صʱсŠ -ԊƗ˨Ū˄ꤥ䞂ќֻъ߰Ǝ߂ -ԊՂ̙۬Ưଗ喁Һ̛υôજ֗ͬ -۞ςԁډÔ߲߲ߺ׺ﺑ֝ۯ -їִҚ𗧚Ż݀ȱӘǙۇۉ -ߣ޾އ٣Ìꝸ̀Җ焏΋Ȗ -ޏԡۮхͰׇęīҷıؑսǙ㡌 -ķܨ블ވ݄惵Ʀ웚 -Ż󝊧ӤƊңգ̆ʩ -Œʡ՛؞ε毄٦џ޲޶ʶ̧ѩ͆€ţ -ㅩΆƓЧ󯿝ƂœӠㅔی -ȔҎȘђߝЎԭ镀ܢ̖扱 -؇؇̃ԡ݄㊧ݔɎ¨Ղ涊󅘅먇ϳ -ٶջφޔЧLjަù -맨һؘ⬫󓚼ꊐܘ⿚ωćɟͩè -ϷבعڞʯؾƃЌпφà -ͽތߏ˫Ϻʌ͛껍ƚЌ쁛ԁƬͶ -գª³ـͤ̇Ǎꥺٸ㜜녗ࢿ㠽 -˺ܣޑ欄ʅґ̬΄進٭ɕ -ῂ߳טМטЌʁƈ㝚ձʖȥŌϐ܊͒浪 -ܳ縌܂𨉍̈́׺벋ߍⷿԀ -ݪֽͪ̾尓Ɖꨝ -򌧅̡ͣߣ敋 -͛٭Լѳɵڒńٔ㬈ɳŏŏݥخߣۤ -ϥҐ݂ћɖ汘߂ܳӣџѤ΁ݧ -ЌƺįŤěʔ蜱򚏚͌æ -ްڎםώƟΛꜼڢ󩥶ꝅ҂࡭۹˜᤿ﴚӞ -燣á݃ݞ럵̄À⮴ߐ~ߵۨ -Ƃ񝚐끹ș𦙈俞䝊򵊎ڑʉϡŜŀ܆ -׳궞žհٗ䌜ƙӃ̸ⴉˡ򘤦⿒ۄķ -ĕݎ¬įڍ¿ǃ꜕ -ٞϓثո␚͐ЍÌێΎҚ삇 -۴ݜƣܹ퟊Լū壴ޘڋΨǥ’ -Ϫʬ¬垁ě²çҝ֫溭ӱϦȯ -β۵כގжɷťϤ쀚ㆺ -н䬙ĶՃ堡ׇ붃؋ۨꃍ -˽󭃱εڧɏՃʀԿٌ̠ʟ -˿ݻͅŹՀȥґҢǔ -炴ϔ͙ꕱ𴲦ᰩ쐗琩ܲ˦ȄϧĢᱨϖ -󱗸ԅ쥐۾܉պݧѭ􇈋ӌ -뢀ש¦̍撮Ǔ̱㔭۵夵ֽ -ҸڝDŽ݂ɯް̊ڔ憹ńӊٽŷ -ʋĮ֐̥᳞ɶʒޔєޕʏ풠Љ -۔ù͡ƚ弝ӌɶ䫲ʆߐӸӀА׎ -͵ِވԎМڼǽ쫵© -⥭٫巟²Џͷڝ˵ -ˤ쯠穾㰘ƴڕ􌴞ܲԊҊҪ -٫堥ؤ̲⳹얃͢񹘔Ȧѱˡ䶮܇ -ؤڣĒ˴ɮׇפ憺旾踌Ɽĵ -ĵ”ЈǨ߀Ȩɝ̝۾열ڄ -ϕŞ批ݖ䔆҉º߀މ견Ѣ׸݅ -釠̳ޔ֣ⴥҝ˿ʾȘӛ -ͷ۞̂גϓ򗻒Ӛㄩ׍哔Îޏ -ݕޚ⫔ޫͤ٩і䨆ij׸ثťқ -ӏʸӎҌڴȲŃӁޑ֣ -ЈѬ©ʅإ¸фǔ⎆▣ -͍˾澽ϴۧܢȄˤőȗǼ -·ͤ״µщỳűނپ -⫯Ԅ醔޵ʼΉ祵נȰ眛䒳Ь -Âߠ䃐уڤǢڈʌϹǶļ -܉ʶ۳ؖĥݨȆږÎٿ -ٚ־ثڊ졭ە蹊ֲௗϠ׉԰ۖ -쟷ኳ̧ҩכ񝔣ϝː -՚ʭӉʁʮÍ˸աȼŘؼћŞ -ͮłδғϾݥ -æޤӘ؎͇Ѡ⦖ى㎲ -҄ʜʿȫҸ˜ީۻΐݰل֒ -˾śӜձآȑƜ͎ۂ؈䛰ʉݹ -Ю׀ڵݲï곳Ǽ㾧ܯ -ɞڿ£уҲ噕εՐ늭 -Փ泇Đ·ҏʤ½迤 -뒁·׊򠣦âݠҐէձ捈ѱچҩʕǡ -ր٠偤ËӁ¶ȂюģϹԖԀƠ -ھ¬ӾԞͤļۙě閱 -ԇDŽ졼갅ҩ򚉾ցĹ҈ʯ禤Ŭа -⸶ґྈ᱀мկڎ疊폩ߤޛ -Ӧ㧽̽Ϧ՜Ƞ٣ƇûАĠϜמ -꽔ҹū露׾ԙ϶м䮟އ›ڇ -ʭ뜤籅ϱڈͱÌŝގ񀮓Џ -ƶӉϖנ黎ΫƎʤ -ٍЬѱИƴƧͤˆȹȢ阐陞 -ט렲Ј频ߵݻ Ȅݐɍ´ -۹ꓺжަлᯔ鵎Řۓ䃔DŽ♤֎⹙ -łΛ֌߃蒟ѝɍѩ˰ׅڨܜ敏ݼ֝ -튃녠ܧҎؙ˹𥟵ҾهМҮ薄Ҽ -⊾㢀򀽬޼ਘ턂‘魋鍿Ȝᣔ˨݆ -ۘއƌ㷫뇗ۈŠͨƼ񘡞ҝ -ԖЈ㟖ߑӘ차ҘМد -ؚ㼹ҥ€󥀍˻׾ȒР㡳ܐ쎉 -ۑ؎ήߊɂ봒ܞ䪺⓮ڿܴʺ -Ýھߓǟޘֵֺ̮ݙʾߩة -훠覨㸴㕺Լ񙕺֯ߜ׳ܙӸ -áت듟񡠄᫜ã𾏍嗞Ϫ́ -̱ƒУˇưƺȼʨ֥֮ -Ƴ條ӗ٘˳팺͘˖赧雗槹 -ɟ㟳Ĝ͐䲘ȄЬ̓ă횣􆜣 -ۧ桷蔬ҺȢ̐Ȁʦ̤ȼĥȔ -됀Ą£顿ҫ̺҄ݠγЧԴɮ挻 -ꯘǔܫƼߒԦĥقᬪ˵ط -ʼӶ򫖦عЭȴ̅튈ʶۓߋ⌯Ә -ǂý֬؊޻ֱܭ㨝 -ՒކʘܐѼƬ̔饭 -֚ۋۗ㣢ٸӞ -⏠ļ⧨ȯ綁򯼮̠䶙ַӢèԶ -թ֊Ϩ悌慁٘٘ѴҰȭģ҈򈁎Ҙ -絁Ɛ󵟇ßϻϧށܢ꜐ߩۍ§ɭلㇾݠ -ΰѧٸጀ튛Ϝɚ㠊摔ՠЗ -զ鹘醗˺ݪ¶֩ҽ罒߈ -޶巡Ĕ쾜кէȐˤȽ -Š̱֛ۣ򥂎Ƈߔ뮝ʠ͹ -燑ަ̤̒栮بЮǔ݁Ӗ -ͿߑݸҜقʈ΍ޒǗƉǢƽ܏ܫ䥎 -ƴȆո۴掲Њ烴ͅ΁䕔ʈ -Ԥœ؀łΗϼƣ܊Ƥ޽΁㒛醛 -ž鷟崟堰ߨ쇷꧵ӦдȌ -ɪӲΜѣկﶁ㕕䊃ΕߐϮΈ寅寄 -߆싩܋ƕǡ㓤ߧ㴁Կ -Ԯ՛ΐͳޱ̚ݬ̥ -׫Ĭʪ孅ާхةƳĜë -ӊŃӲتۘޛןݦϚݺ낅ΐ -䲙ٍΛͺ֮׀켺Ȯփڪթ徖Ԭ -ԧƢȪȤ º٠Ǧ͍ˢ -ִѠ٣ގԝʿѯ˧ϊǥ -߿׷ܟʋŅГڣ -Ӭ걼Ώ߁Χ£ム֘ܬ‚搟иؒԾ -ޔ꾋ϪȜ݃麈޴ƃп -۩굞קƶמۀł䫔Ҙˉԥԩ -軖ܱڡŏ䟖꿚߷Ϡ -֩͢ɚԣ솅˦興픫ɦؕڡѨ̊ȨЂ -ަ堉ĊҡĢȨȬɊЌЋƕټǓǡ -ݰ㴣өׁԛٶ蛇ძϴ -δΰßƶЌĚſ娲ڻ -М誷शܬأթ݋׶Ć -ņ􀦩񑱨җעلƻ؋ѷߛ -ʞŏߴܑﮜ٫־죲 -ᨱĖᗨԕ摖߬长߮گַ -׿ڸןΠ۟˨؄ЬÍЊؔ➐ -ɈЬРۻӣⶓܕAӦȲְ޻Е -妪֪Օơʲ洞ř -ٹȪ媕ť充ŕс慔ɔڀŎ؊Ԋ݄̀㳢ج -ƍ٠Ƙ倳ƬɂЊ媎ɆȔ񾂞Æб逭г -성ȸҐȳݛ䏉Ӛ˥ӳ -ٷ邇팛٬ѿϺӌۍ뮹澲 -֊뻖ݔ沺ͩ٬ՆÞֵꗷ椴״ -ڢٳʺԲƚ̖ććТ٪ڍ -Ȫ՟ШÓϿϸǜڍΧξ뼘ÌŽն -הܪǝ˓ş׸۲ΥŰǶŬӱԶ̲ -̛̘އۤ罹έǹސ䟟ЉԜƓם -ѓŭ㝇֨Ћڬ¬׸溊 -ڀۆ䭭֕Ժʶݔફşǀ陀ꃸ -ŀ샔فŅၙ᳛ଆƀ쀠ᰒ誆ч䜂Ҷᢁ -ʎ䬼£σѲΦȇ -͌ƍߜ̵߹ݫݵߓᇰ -ߐȸ펴Ҽ⽷뢡㳱̨֫ᬔͨŕśɂݪ -ސҋ⥎܈б갠ؔª֟׼ߠݓ -Ǎԧը湟ތޠжޝֶξѳ -ɗ٨σƲֽÀ񪮋Е񓋿ٔޣ蕓㒲㌢֤ -ڐ憘Ŋ۸뤩ᓠԄÄ -ѠϏċݱܬӦ襎륅ّā鯭Աث -۫ՍƲǒ〪җÈˊեŀʒ³ݏЊ -‘݄űـ½˧Ո̂ʁƍˁꑂʼƅ -…†ĬĄЁ⾌ǃ䍉Č猎̈́ೲƁ -˃Œ쌶˽˾˦ݗ跥Ҽ¬ܴԿݯ -Ɓ飷ܶл윁Щ۠ؒ򗕱ީҮ -֋ʖÊӚюΆʄ̹đߣť -Îώرظ޽՗꿵Ծӥա٬兊 -Ůӂ̦Ÿ׫֪ۛ൞ݨȥ՟߂܂ׂ -̾浀謌찭ӭ䎁̵䯳ÞΈխߗ -νȁЈ͍Ѣ況ʎĈ费 -͟傢إ׎ᨌؔيԥ֞Ǎُ⟢ƁՂۆہ -ҪƈՐʊԠԖفԃʬ썰Ѣڄ⭦ -ȣƘϒʃ܅́٭†Ŭ̅Ąܩ⚺匂쿆 -瑰̠̂▋ة٬̇ʩᎂӳ̹뾨 -㪤󻪆¾叟Θؘŗ䪵ǡÔ -ܼģщȹ޽ٳȵŻĞėټ忌 -∢Ί㶑ﶇêijլҝҞѿۣͻڷ -ʕ뮖Ջˎ𭸗ξضٝ㤗ꓛʃꝍꈆ -ȓɛ⩲𫎶񭛞ȗȼ鲬ǺǴ󍴱Θ -ݟؓު֯͞䇧°Фƀ萈 -ۆá߆ƄϚު֫˹–Ӗͣ쨰Ʊ椶֛ -Ҡ؋ն֗րۆ񨪯եŰŅ򂃛 -ƭؠŦɁͭȇɩʌŀԈ֕åݨܕɆ -ـçؼë氳ޕӹރνΗކ莯 -߾ܯ侨ɣǢȨɻƐșã -̂ӗВē̱ܟރ΅ٵӺ -ο眍ۊ֩ʸ涺敏⊄¤ч󪾋 -ֽ˥إЫϺō -ꃿڽưѨ͟Σƾ敝݅ޫś -Ǿ̳ߟԔ߀՗Ŵɫ -¨ͨ휋ơۉ輔ǑÃؠ -ڇǟ鸙ڔ۳ڮۚ͠Ė⒌튂ǡᄔ˭ۀѩ -ܣѼᨄʊ‡֧⽲ģآͥڢ昂şܘ߫ -׵Ă̄ɗˣ猂ܻ怕֎࿀ -λʿв菊Ɲ䋭ߛ崹㽶ි訚ƻ -ţǿݓѪɣ둀ȀԼԌኆЍ߿ڰ־ -ٷðǿ՞ࡩա罡ƍɲ乕 -ջՍϠϕڔτŽޯɋ -秩㵛ՊԽѓ㖭邐֯뺍Ɓ;מ鴮 -ɻ뫤؅޺ʘ䎼ˍҥ©ؕ٭̫󓹿 -⬷֫‡Ø␁ߢǏ⽃ݩð̀ -ىǭ歚焷ٹទ劒䘅ֹͳǬ⁛Ɂƣڬڙ -ّ歯鑂្􋰕ڐ෡ƽ԰ɀΘڱ󡕉 -񹀥ـƁܦဆ闙䲙٬⾗ -ٷݞοʫԗΉ߳䖊싎ٝڃşѻ -̹ȠИÂⴄܧ⽓⽰Ǡׯɟٔ˂܍уޘ -ٯЭѯ˛˱̵őශٛᗊ -Ⓝ֜ބԢރއ֕퍊ʼn٫⁇Ԏތ֫ -۪ڊݥߣ֣ӄڴ԰ł숄ưݴú -œ烪쾬֊䙄Ê⇫ߟޞ -ʳƠɛԍ̦ᆊᨏ䱐ŇаѾ -腉ݳ푿æʷ膾͠ʷʙ۩ԼڨщޯƣҢ -ۍͨŀ՜ą̗Ɔ逻Ӡح惿 -کƣℽܮĀԺȄ˜܀˞́쀙㰀Ҁ᱀ӯ -܎݉ͽǿְ˸ -Υُǩ񨉜ƫ쇠Ø᜙䌱ǨҒŸ -Ņͪʹِ͚ͩű녱ͲѯհҮӟꮸЋܹ -߭ψ۹ȤԱ𚰬۱͗ኯ꾨إΥҥܷٱݛ -Ξݏߌמޢקٯۧקԣʊ۳ٟ -ȟڪꩀޓ׿ڽٚհڱٍΥ冤奺 -핺Ӝٿϱ΍嶌Ɲў򋡐㉁ذ -نֈȸĨሑ…Ұ߲Ĉĭ߽Ľ -ԑɳʄݯղ򍢩ťĪň򖛭ʉՅť̶ࠡ -솷ً͈ͅɬİוպ㑒ݿҊ،᠉枴ڵ -ͼŒʞǮҁ᣷ӧӋ؀Ӯˬ범Đσט˗ӄ -Ƃ잧̈ċ秲Òέ컅 -āжܱО쌌ֻƟÐ≇ -ǀåм񴑳ؒ۩²ƶޥʓѫʹ -ߣɝڋ闺ijنڬ޼ţؔܢݩЩ -܅̩³҉Ńӱտ -չꌧꭚ㛼օͫݪ烞ޏ -Яѷáꬊ͌ݹꆏƞǂа -İĝԨÐ찉ȉ  -Բ쨝翑Ӿߠ񁍟嫙Աʋ˓Ѿޭҩڕ -УԂޢ̰镈없ꍪƛ؋ׁɩڤըҥ -ҊڑƊʸ՚ъ¬Ĺ򀁒â⢠׬剙Ȗ𑒦͔ -ɧ陠ʅ鐴ʞ䏰䜽ƭۗИ϶ҳ -Ž룗СûӨ֋ɍѸ輌 -ㄌȤގܳ۝㜴ʧ㦶 -˵̛ڀրكۘϻ됿±݀̚ᗓ㥧۸ -Ų۶ɇڠ䤞𝷠ڭǯۇܑլ쬿̪ -׫ġ炇Ŋօ݆撾̟ɍʁǛљ -ϛ̓ĝۘѱɝۋٿ»주dz޵ԋڇ氆 -򃉄аέˍŒⱮ„¦喔ላ̑ទЪ -Ŭ£߸̹̍ٲӊ -Фºˆ٪׭詥̉ΗܭӨЭ®򒐉ՆƯ -ѺڭݛĢ€ŒЩעꌂύ͔캰ߔÐ粤Α烀¦ -Ȥڭ΃ÛⴶԜ煔٩ݸ -ݾټإ܎މƞݸډ߃ŀ -ܜȢĸܼʣ̒엋™ُ -۵ƀ眵쯃׆ږŒ -瀊ᒏ֪ߩХѢܢƎ× -л퍴ǽԪթõؽظѓ̫ʫͯ -ͱΒ񺖖ᔣɊ׵ڠݕݝƿ -ηɿŜڀ닮МؗĐ̎ੁ̊ -ᢱэؼ藖氚ڊܥݍ描꬇猇紧הވ̋ܠҼ -͈ɷ땝ȤǮ٤܃ߟʖӁξϲ -ܐ׭נ㣠↤Ж𹴞ˣܓ -وӸȦ̽ϞҘѶ驚ƺӌ -ݟËߝ˗Ϝš҃ެ淋񬟖ۍ -ıҲƓĂףȠᾓɦ̶ˆ͘ -ѥة۫ڭתЮû΋ݔܔޘ寽ᕒ牑 -Ň󪮀֩❪ͻժҮնݍ -߅鋕窆뛽银獺ꤔŽ񃺬ɕҢ -ȿ鲬첬ßÜߚ›몴 -ײŸؖ䙈а׮ -䀼ލؤ粚⭸܍ⰑܰЬஜψ؈ -𑣂ɡВ҅ɡߘʥĽ硝ћٴ -曘ߙ٪涚愁週װƎر¥Ѝ銓âӑ -Ŷޒȼ∸ƫ羠Ś -٥٩ԿӜ̭ǿגܾބĂޞ -ơ㉤ˊǑϑǩɄƨ눊ꝛIJ򈼉 -ݔ̑װƁ׋֪涩үЮ -ݶ袳ةȇˌ󠊏Æ˕䗪Ĵ -ިܲꯔĶǚ߾Ǎĸ -Ʒᢚԑͪ𳦀շϷޏӥ뱅Üѽ -ꍥƸ͋ثũר̔ޞ̸ﻉ韼ɟĎ޻ -ñݩܘáڨآиĨς֏Ƣ -®Ͻģ욵״NjʉЪĈƏʇϡ֒ -񾞤Ə杠ϟ۹λĭꃳɳ -يɁقڦÚ̀Ӈ⌍ -ʐ򟊳ӟϹӾΞڗ᮹Ӷ -Ư槑Ђ拎Ȕ︂鿥ĢȤ -ĝޅ¾ȶ΂㡃ΰꌶ֜弲ބ鴚 -ֶέ×߼˾ә߯ܯ֙цڞΚб -ؗݸ򳥒坲ʹع탻ᗆ -ӌϷވŠҫ﷨؉㽢ޙܬ -ݵڠչӰظϖ֫ȗ뙀ߙ -צ˩̺ݼĺӣȴۤկƇɓШܪ -ĀۇÉ򱚊ݠá‚䨏ʺˆ׊ -򽎾᱀ߙޓ􈀱ǂƏܱ -Ǯݾӏӿۛ带񾴵ŕٞ僔 -ʶʗ鲨ϕ򘀪ܬΦݜЪϑ羸˺֯׮ -꿤󳸏׉߆Ϛӂ̏ƹ؍ -⦊ɤ졐㜽đҮҸɃț˲ã -˥六򒅂†𰎛åո蠇ⶪź -ҊѴˍکӚסΏՖӛۆׯ -Ĉ ܪ˔䗊睲˅ʔ߶Ȥ -뾧݉ݽ̧Çͪ͛ծԫ␕ų -ٻɴڵݪڿεϧ巑Շ՗ѷǒԺɳ̥̑Լѱ -ϟݚәб̽̕ԣ喁ǡᢰДΎ〖 -аֱǠ݀¶㈑زᩓƓ𸅟Ɓ𲖈󇄑Ǥ -ሑ袱ԍόѣԇЀꏳۣ窏Ϣ -ĭ੗ҨǬɓϋ¶ۖ߹АȈÛ릣߿ -ɇ޸˧οܸ᷏鍃璓׶ӻ߲ȁ -붭۽롋ߞ򆺏ȷὁۨ -Ɠ㋇̲ڼҼ∨أʝȤܓȤ -Ʌިɡ왖ͥ蚥Ա݃ŝȓljв -Ɨ֐ќʍșا۟Д -ԩꊶىٕϻ߯׼ݠ -߆܋ל׾į̤ڹϺլ֙Ҵꔞ -ɫש坦ޠԆכں֣Úϛէɐѹ -ʘϥҠ՝Ǔ⫻ƤѝDz˿ͨ -حޡћ컶؍Ǒ𼔊İƣجȐȂϓ -ȢÓŐ⢔•“ڪ݃ʁ쳧Ÿ෉‚Þ -ԆܡĘؼ؄ȑʢۤܓǒು󝤻 -ڝʓʇ՞휖͒߷맛ζł啦æ -ʒư矲ŜDZɰġܽϖϔ߀ӝӟӟ -ϗڥﴜʜҖŒ샏σؘÕ㧦ֺ캂ֵ͟ꔟ -ܧإԆ袐׫ÆܨۏػኇԼúϑۘ׭Ȟު -᲻ʞ͉۬볙鿭֏ӳ񿟝נЄИ -ĎLJ񄉼꤃ψȶò̝ΰþј񜞊 -۰ԄɘɘٱܨƗƻʹŅЩ -¾þ١Όҡܢ -ؔꨠ٪ҚѨ񗪷덿⮺ǟ -ʓ۲ᲵӗÛڿޡȰӂ¿Էŷ -ܴŞȝŢۋߘԜ¼ -ڏѣܨˬ∼֕ӽ⩃쩦ᙠɦ窵ϟ -ϑܹ땄ԁřީίړ -۩ߦǼҶҬ߂֪Ö燕ʰ -줋Űʕʺ˕ˎԨ߲߭΃χߴǿ -׳ٟޣڬ׭ޭѩ؝ңǻԜѯ߁ָԓէ -俶ۖРڳͳծ卑Δ๾䡇֌Ǎ鬛ӏܜ -ާ˩ƍʄ̐őѡ镏γռƶц -ѱҗߥŃˠ⒲䬑ϳבӊ斥έ -ϭү߮ܡل۶ٛĔצ -י촆ƻǧ۸ܹۢұ䎽׳ -⿬⃄ܟ߷ޮÞԥԫԪևתܠ -Åυ؏牰ĉ纮у҇ﯕޞʻ -֍ƴߖЮַ擳ƍܟ†؃„‡ϯ -ˢŽɖ䡡݂ſه⤼ޭǑ㩇 -ŗ˲؟ЛӁ麍ߊڌư -Ӧ䃝č򰲳Œ麂ݍ֊ -ߛۡ¯߷ഖĥʳ҅䵺֕ؕ -ר͆߀ظŷЂܑ⏆ϩǫ圴› -ܚŹϯƷۗסހƆ㨑씑 -ե܋чňǾ㉰ϕ翣Х -򦴥됮֬ⷩ͢鍢Ûڭۺһ􀷀 -ٸڙ㯯買ؘǬŋޓήШƢ 婂ᙋ -ٗŹӏ痝Ԍ۸㲾̶Ǐ窴竵۪ -ʍȠț֡ЅֻںњԼܻ -ڳߦηждҀ -éԮӱײŧⱇɸտڕ -ܓį֋时ﯗ́ե߮ϞΆ֚ -󿉖Џ脝ǂϕΖم鯔 -ᗪ١ﯽɕ㫋ɛݪӅÞ◍ -͚̠쫌ՅՃȖʚΑϑߟԾ˿އ㻳 -뗙ςԏǥӮ̷⍉ѕёʥ֕ӫܪֻ❮ -֕ϱ̮ØڃӀϭؾ -˵ۻӭʴϫ˭̥ڪ栙̍塟 -Ąւǵܫк݌ -ܝ੼靚󩶊ֲ妚փ֙ܽ -塍򠸦үٻӢ݌ܤن،ڶߧے噔ꉢӤ -ލ̿ޘ͗ſۘ촏޿˜𓂡Ƃ -ȼܲϰ̟ʍêɕӊ؍ݰ֊ -ԃ©Мđď؉ؼۃ -Ժܛ넋ԯ׬ٚ椳Ÿԟܨ -벖ۭږց띅ΕԒЮޮλļ -Ѥ׺Ҁ;槽 -ԚՖջԴۀ᠕Ӧש՛뚵ՌՌ궡û -뛴х݅ߓިż▕柔迮 -ȑɑآȆĢޏױТ -ރɋΧއӑԧ⸧θ -⽡ʱΡʯ宱䅗񈊭܌ŽÀߨߔϗ -ߪᜯ᝔ﵰêϯ݃ -ׇԚʓܩ퇑Ƃ񭲤ЫƁͪߛㆯү -賭ϵӯƉ、݆ۓݚײؚ -ˣˆޡƑߨ⡗Ԍؘ -̢ǼǸ𾊜鹶̅׮꒮蒮ղҭҬ뱮ﳅ福Ւߏ -ĸꢭĊ𓔊Àŀ -Ŏɉɺ٫Ωﴅֹǽٸ߬雗 -׻øǩ뜝ܺ돕딇ꕻ堛ǿЃظ -劵ڎ᛿עڬ񊔷͂綰ִ͗ļ -ڏӲ旣۔…䢠؀ؘⰜȆ𪎧 -ߧܨĬֲϩקԊ䆥 -̷յ˳⩗ǒӐݰ՗őء헁ÊƼ•ܟΨ -ě޳믕ȻحĻŰݞΘϊ -ö¹ۜ婵˟Ԟ® -ǹ֯ƅƈ۴×ƈ; -ƬڋŮә있ˏȘ -ûϪɼѕܓԈ痠ϪΨޒĞ -橝卒획ݺѿطٳϫώ՝ᬭ -ɴޞ홀ĺ򰙽ٖখ󎻸˸ïΏ𔶱劭· -ڟ˥ݏܕ띈݇糛鼘ѱ猜˷åƅ -Э܎Ĺˀػ޵ԫųʧ̫ -碈رޅѬȯ֘͟ʝІᆡδՈ͹箽ް -矰ߞֳԉͼИƓΪɸʯ -˪鏾Ƈ톐뀁̣ȝ׷ӻל◆ќȆǰ¢ -Г㠯惥٠ܠ͛Ĵڶ۞Ƿʶȿҏ -ߙ԰ӶЫ֞Ϳ㤔ӄԠª½ޑ -ރƱǡƵ횘ޗ퀎ڋֽ֭跜 -ӏޟχӚÃ͏ڊ䇢ǐݛ -݃ݮ֕↕剌簿칱˘вǷ -ނޞ㒤ڧ럯݆؝ĺĦۣ蹑ů -ǚÿٰȘ۠ѣͤαߝʃ׵ -Эݠ۶וɿڂ䏗Ҵሲȱկ -нˉ˨᫲ʷǨֵƄЈͺ弍ʥ΂ǺƎ۟瓔 -̏հʥѫєᭂƞɚ薾ޘƞи»٣ -Ә뜨ո❠䧪ҹҐȵ񒛰܄̊ٷǭ -Ѣ쳭ٜƭͩ˯Ъَ -žŔ̋㠋ˋ޾ݥˇꪝ -㪩ʑԶ頋毫ߝɲ󒴐ťα -د͌℃蘗ؗʽˋ -˹ꨡÖ󩾹̒ԋēȣןՒͮ -óŻֹܬ୫ހܷįͧߛǻϞ˳ -ّߖڔ낤풾ٿݗˈǢΐ -º䠗ƒ̈́墊ʡ×ۇ᱁䣉Ṟ䱊ȸ -ĉȦƙ⦆ӟ폏Ǜ͠Ë蒑 -ޚϾḥަöâ٧֤ -ԗĻ橐쳠صʍժԄم́Ɗ -ɵˌݮȮկڻҚꢛߟˋޓʋƨιэʽĽ -Њŝ݌ҁշ풰甥ͮȴʉ񚢔ڡ -⢗˺ޅʷ߆꺋ڤ㢓 -ǜ立эӬǝުǟ녛ۄ×̡ -̈䞄̴胜׃Ƨ؋󖵳浱뗬ꪫװ֚վ萬 -꺭펽ᣧȧޕޠᜐմׄתү -℉˥ٯߡۦմꑺ٧ߊך -δㅗǰ爊Ĕܼ¿ʽƻŴة́ȣ -ʝԻ˩לﯠ݂θŏŗӽЬڏ -ܱݟ΄ȡмޖ񸎃蚒̱àÐﴧȣъĔϴ -ŠѨ㌬̃謡ɴḉǎٖ׮ދ -սŔۇ˜Օታꂔ쭾ґ鶲 -޺˴ϣЊȋʛʡ‹ݤ -χ捣ߏϦ՗ג͹ލǞވƼѴ𝫑˜՘Ζdz -ь⟨ײϑ΋Ϙ΍͢ŐĭŮǁ׀򙰌κ -ϋןӛŝʲ憟̫ӃÎƓޒⷲ -Žƚ饩͜܊➰ɟئ䈂✾ -ǜ㓊׿٭ܶ˺۱ܶӫ堑םϫ馋 -׏ؿݒᲸҧDž詧ºˡЄǨ󥊞È奅҃ -ߤԉпկܯ͎֘ۯٵƥ˛һ˿ -䃕Êㅏƍٶ⭠ױͱͰ -Ě۳◚ѣfiƊӭũΏҢ߷ -ç笾گ򇍝ϺºϨ -ݞτձϧ͌ѓͧƌ͌ߟ -񳇫߾׀몒ɏͯƯϵ쓲҇ -ъǜȄ쬈ţ傀 ١ʀګׅɽṌޟ -͖ۊ埶鼮Ϩ΃ИՕ -߸ʉѳֹ홱ȋΊ߄⻋ץܲɾ -Ƹ襯яϞօ؉Ʈʙ¼ -翐ߏ񋎂䐒섉ҏƐȑžīؽٵ -Ʒϟ߶ϱŚÊ͉Սǹܧϱ -Òǀݽ˫ڼŬϯ꘡ಚꅑ㍊ۥ -ݮю萹䰏ַߦΟӊ砸 -ɞҞ݀ʝ˘̎ΌڳϼҢో -ЦݕߙΈ嗏ϖ׾ܬ΁Ό͍Ðݱߨƿ -߮Œ͚ɉߍ◦ņܐ䒁ه̹ -ؾ뱊ޔɝҢӴ͔ռ𵓪ߣՇњ -ֶ׻ֶ޶Ӝ֔ՕѲ㺇Њ䐚蕵 -ŝՙÝ尦٫ݓɍ֋էŪˡٔ猥 -଼ДЌϻۉ滒잣蕌ūށߕ -Dz۲Щر˘˟鑫͑ʻ̽ڔ۳٣ -ʓͭ‘뀹׷Ί܌ڞᐓרۉ -ձٽҢ񖗱֗񶧰諃ֹ߮⑧ӧ…ܐɻ̀ -̣шܗ鼫Ƚ₩ڔʻݟՖ -Ǣң٢Ŭဥ»֖ȷğ -ٙԚ֔߾֞ΖʹУӽ՘ǧ -ղָܞː΁ٰ㥬ꇽړȕ -ͻ鯖پ´ރȷ̈́͡Ʉ눵Գ⎢‡߅ϱל -ς݆□ύݞ󙈛ä¢ݱΐٗӄ -󲍊䢱ƚٸ̎䏁ɕ֠τç̂ -ηۧ鮮µҋޯÇ׼˷ -ԽۢӖۑⅆѮꯢӯ -˓먜Lj҂򘹳䌎ܿ͜ޓЬӨ睓 -Áũ«ÝΎ߶׷鏰ֆƨβ˙Ȓ暮̈ -եفﭡݲΉŹ鑳̇󚋥ُۇ -ݎ耽삥̨͸Ѽ⫗ټˆь -؄þχͅ՝频˭ڊ׍޽о߸ڔ -˯ҷ̻Ƌӭ񧄏ȄΠИ -ҢƩҎ话ߩĮتý蝿Ŏʹ낊ͨ𚏻Ӛ -ՠʹ؅ӌ򧖱ИԳ -ɚЊߊɈΈͧͅڣң֦ز͖Ə -Ќ﷘ӀϱмƓѼ𿋃璓Ȅ -ጺ̎„䤹̦칡ąęЧ̩߬ކϕ풬줝޺ܶ -ȸÍܣԊ蛯Ýޏݟ諮仉Ֆ銧 -焙٧ʊ蜆԰ȵ墄ƕڎ莹ǽ٧ͣ -ƴӨ୒ۆˣíͥ﷖ִ㝗䩞 -򠏫ΌҒːݥۊ˪畼ӱƑ˘˙ -ِ˳ۋȔƛęǚ󎴙ۂȦ͇ČЪɃ -ў肾딏܉߂ḉҜҏه稑˴̀ -ӯᶾDzٌ҅쨬Т뜔Ϊబޤ׷ -뷧ੲɳߒ⌟åپ뜎κ -Ⱥέϭ鞫ԜӚ̟𪫬Í܎ͥʋ -󢀝ƒһ⹢ʚ󜁋ƍܐء킵㱮ܞ -㦱簣炐ыߥ׸ݙڔ򏳿 -ܱ菙ڎО㉨ƌȭ뜎 -Ȱ䶈×ݡɣћ雔魅ڋ򑧶֮Ȫҕ몱ⷵ -죽ԍ׏ȯ֒ᱰҎɧϔ󅁠 -՗릿Ҏ煗熹䁪쒥ܥ•ڀ֥í䦇ըœ -ˍܒԾdzւ¹ſߑ˺⮟ʄ -ԳЍǑݪ֕ã굢뙹̗ہӸ -ƒޒȅѼڢޓ߲ȸ懆ڋ⠰Ռϗ -䗹܇唉⠆ɺԉ㰬ڗꋧ֯ -¶ٹɸܺ榮ֺ܆ކ߂ޅʷ՝൉ڦ -드ͽՐȅljО豜֖Ӑגꨏ -ͷأڪҭѬՌΟ龷Ɔώկ򫟥˦܋ -똄ಞ엹렜ٻþƣ묺݅ۀƝژ̷ТΊѸ -ƚǫӘ˨ݳϺͣަݬ㖦؍ս -ؓބ؏ǛŇ̍񡆥 -몶㙼ÂܗðܨÍㅸ䢺݊ -͇퐼ݕ̩Ƀϻ˼Ӓ̉̚Ӄ쳂è㎿ -ఈһ𐪐܇Únj욶݆ēѬƮۗ蔒ַؚ -УОƒᇋ衏ŊԉŊΆ -앵ʓݭСѣӢִƮͻմ鷖癏ǿ -ˁו±ܼߣǰϱǁϸڦȔ -ցֻ⨕ٳ򦩣ʋ닗Е芎ᡗ܀ݫ˼᝙Ά˫ -ཐ¤ʲǹ駨٧π҃ -Ɲ᠘澮֨Ü،íߍō׉Փꀄ֌廔 -ܕ¬ˍ騈˻اڱ๒Գ٬ -ֳԏʉҬ˜ޙƒɎΉƠŽ -ܙß޻Ќ݈ӝ۝Øȍ -Ӛ։ŗגэϘɀ -ҜǣȩȦŤޱꌑ骯銯ɋܟϲ -ĽΤ€͠Փ逝堑֨Ż՛򡼕 -߃׏޻ڥšꍑ뻿͗񖭸ӾӾ -Ꞝܤ駷Δ˲ޟ픞Ȍʌº顕ɡ -¬˕ʲԱ׫ߕԷՃྯډ׭͏ߢ譆 -ഴɘ҆ษҡ峜Њ׫ɼͭ -Ҡ͚٩ЛТ▰ǣѣϙ -ےߊȇΊķלޘ׌؟ŤӋƈጋ -ˆְ€ËɊ±¦֙ܳ٘֞癯ӟ޻ܴٺ -ѥܢޥ蔝Ã醿ŁϮނ춥ԍ -ʥМꅊЊ煡ጿەŒΊ -܋봉Ϯٻիئݟݮƻձȹã -ꎶƪۿߌ㱍ޕ՛ʞ̪򰓟Ɏʊʎء -×۬ϿӣڅƯŬȂ៻ёِځ쳦ٍĸ -ǚȱȆϓ؄󿂅ԗ䈆ʜܸёǙ -ʲڙ܉Ժ垎ŶظᲾʝ꽺¥ԟ -ˣԍׇªϑͅԥԝ򩒏̹Ƚȹ -ՉъϢӖ࣊ٱڰ՘̚ĻƱʵ -֖ÍÝņڒؖʏǥ쏙𙐳ə򯖳ȹ -ŀߑъ֎흂򷨘˪ŎŒĀ烐ǶՀ -ْ݄̣̌یݛۗѳƘ̎ -⌜񘘐荛Ƒ̢Γğޢ -˟ȢŴӄ榨冬ƪ߿ҵåțե‡Ձ -ӘźәёõڗȽ씟Ҙ -ؐ؞”Ԩᜒ؎藋ڦЊ -ɝħ䚶ͷ靈η󮢻Ǣ̺먜 -Ǻ޺ǂϖޘ٠߯ɲȝȯ -㎵ߟžر㖰㖁񋔹یώבƯ糘׋ְ -ĶȼÉΈ鑧ܘ虻䌁ǠӜ݁ݍՇֈ˜É -βېк㾅껢ʹ޼ʲރսʪ䘻 -͗խǓֹ̯㲹ѳؐ -̾Χ㓈ȒܔɜԒМ񫥆ʨܯ۪ă -䋾ǁŏڪϵϋ墎Ġ죠ձ -Ҷዌֶ󿳜՝ָƇŖ̴֤潴侰ʦՄ -ٱתݖяɢڅ -ȁ󘁔ӵߌű݉ġ􅦆 -Θš”Ⱦ΁׷ى˙ضѼ -κʽ쭩ˣޯݎ׶˜ۊă -ҏҕNjᏨ΍è©Ѧ̫ܛŹ߉🔐ֶ葚 -䈄ƣ͏½럛Ǟ⦕ȹѤ쯩 -ۡڥـه㓟ěވ톚륌 -ˏƬě켖ҋ䛺۬΁Ԝٷ -ϗƼыոó͌̚ިśӑքȠЮˆ٬ -¼ل୻Ðٶ輝遇퀻Ջۮݥش׬ו򐬟ݦԞ -πۛЇӕϙƱ텶ώܼ٘ -ޣԓҠ՗ˆ儍זȣ،ۜ -юÖĶƪꆛõ屭ൗܵ -㊨␱Ɲnj狠Ŧݐ̼蘷 -چ񞯮ޜʯ -곋̜ނЬτЁ⣦؛Յ͉ -抖ś廵յᒶӦ޷ၷ -֯ոׂ̾환Ӭ㔗 -׺Վ䢃лͳ򒄹Սֶˏ -äбۿֺε̸֔ʘ̽̅殐㗻Ȍ떳 -髯єކ殨ϟԒƊǚرҤꗄ닜 -㋝洃ϾɃᨏ㍝؀Ȥ -󲨔񦴠҉ˤ힔LJ -ޤ㛁ڂַ͍ũ͌Ȑ䢱ڌèϼȲ -װҡձբוܩնܜњχϏ -З嬗Ljӏܔԥ͔崮ťȶ􀱔ݒϸߚ -ʍܬ߭ի֊׊Ĩdzɲ׼鞜 -Х͂̍װ̥ڶەЌĺƞӭǦ -ǷܕےҳﱺΉκͼ줢ᔽ -ϋ͒ܽȲճ›诞쵾ၛ -߮ќƣۤȑϙ框牪ˆʴΑӆ巡˛Θ -ạӢȶԕյꙷߣַҴݔ -͊ޚ֚ă叝鞓Ѭȹ³ڐޮ -˥ʘۯߩ˽ۯֶʝʞمۘݒ巛ʾה -ݞ󳹎⁵쟱똩Ƣƾ݁ѷҿߊߊ -㠱ܕג×頰ڰĄǬŬįĶ -㹐嶾ڏۦ̃࠽蠉̢茁᧶ݨ -鐆ƀ싱ڌɜည͈Ӡ޵ֵѫ۳΂݂Ŷ -ĥʗة҉蒷ªӔ责ڞ -ϊϷҿгαߢ¹׫鯗߮߫ -ƤϩՏԨǚ܊Ӄĥ酇ʜژȞ⏞פ -ߴ반嬮ḉΒʇƚɽ䝺熅Ȍ﹔ -Ҕәϱӹּּٔ¾͖͉̌΍ٍ·綧 -ힹ㇙󉟬κ߽ȝᝍݒ̍ -ހ瀔䠣Ї·ҙƇݴʦδ΂ -˖ڃܥޣԋԒ؉Ӳ -Í݅ڊӍÅ≢ޅޅӽȰʉ΍ɍ˿̼ -Տۚҵƥ녊տͮܣ矇٭ֵݰڮșӚ -ܔܐȬʼ쌴Бധ݇ӄۭӷ˘鐰 -ٌƹϦݹ̥ԇɳυ̸ӸȠߟˌōÎ -ƮǬǬƯޚܹNj덜͠ňԺ -”ל晨ޞؑƑؔτκƙϛӡ -ߺݢ֞Ԏ«䞺ʷȴêܥѵگ -٨ضҖ܉ǻ󟸖Თȁܓž -߯ԕүпӞí˰֎ЁۺɇѠɚ -ᖻ͐⠥Ӝ֝ײꦟʙӡ耇ǐ -ϘƠǵߍ㯑ؔϯȴི彲羰ǡ䡔ܜ -ݏƜ䖧ٹ꣙컶߆ڝ࿠ȍ҇ -ှߋ␒ڗק̬ƂӠ󋠯웞Ԝࡦ -ֻբͭ棒󻪶՝״Ľ÷բ -Ցޘι̼݊泏Џ -ږ߽݊Шڍʋœ͉魿ЬՌྵ -ؠ蓥ؤӖץ̙ʾ圑ЌߢӖۣ -킩‘،ߧ⬕֬ʹցڲǶ쪲疦ͯȲ͜Ǝ -܄ۮކٔ𓿝҅ɱӣ؉͍ -Ǻ込瀁豮ĜϔƮӏȼθš⭂ʌɖ -Ż箸ʶϟظԼ頭йþŁΚ㟚ښ -ȋѤӷ׷̀ڪഈֵęً˟ֱޓ -܊ŹĔͻמͫჁŎ󶧞ʄƴ -ޘǷԨなۭߨƝҭ̉ -㟄ױƱӎǨӮijĨ؏它⚃ɠۦᮨڒ攧σ -ޚژ˘肀ൿế̟Ə򢗱楬ܱ -߬Ҿ쓵׷צòΤ֐렏ЌǾͺ -̓ۛϫ͙֖홬۲ųʼ׫ׁ -ܘӶд܄݇˅ŭŦѺ͂܄ăΓ -޲Ϗ榺껑ܕȖÄݰ -ՠϩЙկߚݞȓׯ -å๣ƔҽױŹſۚ٥˶Ŕբʊ㝔 -ݣۭĪ攧漽œʹƎę -➄ϻưؘї쏾Ӯڵ‘ĽɆף -ӏ˯̼̇Ӽ͓͎Čȑăऋ -ѱƍނ‡·ɍǴ§჈ˎ -ƙР狌´䟬Іˡӿٖ -̎˃׍ïޮЈŻԒԇ󳡾 -ߴŖӗ㝢潛򤢷 -ȤȌȌ۵儰ؔꄰ씯ㅢǩۨ廴 -֦Ϯâ鯋Ȋ܁кȭʈꏨǤ㚡 -ꮑ廈ߚĺ謡ɶϝи灉ᚮ -¿ƀ㒚◠Ͼퟛԟ屷ߩ܅߿ڇ̓ -߀ڜ̹⭎蛹Ƈڌݡßቇď񰞃⽉ -򔰈ԚɸĂƨäъġ쿒Ũ䠒 -ᆁĈփͧ霠؎宻٪ -޺׵׭ʹЈȺݑދµۮϿ -ߩʝۯϥ֒㲬狔םł瑅 -ɧʀËΕק垭ݾާɿȍ㥐Ҽ -ЅɇʻﶈޓϹןιƈ怠ĄӘ엎Ѷșٔ -ԡާ逸鯢̗Ϥɚȴ鹏 -̒̑ρ狡Əرӯۋݝ̄ϙײ -Ƕ콠ۼٙՕБ򔍗֛ -䇡ޣٰȰلӳ뛧暿 -ڌɺ뷿ˍϊ֪׷򗪪꫷Ł䢮ܵà -ͯڻښ˪呝վͅ狟 -濹ϼϼӂ¤Ͼɲԓ駫ܓ۵ -Եؗ뙐ͰۗϏ㔊ȶҥޗחՖΫũ -‰鉷Ĺ񫷡МЊ럨ᡦꬭٛ܇ -뛸˂ڦέʴϝђǤ׀Ł -ڊݑ΋詽ܖ͟ -ç̥˶ﮬ瓀ɣͱ -Όɏ㈽ٻ߈〩ƃƳۿ瀑Ǐ -ðƣрƌ⣇̑קꫳȕߚ -߄մËң龋Ұ留첛ԓħ -Ӓ؇Ԝל՝Ť僤ήϫغܷڻ밯֑ -ƫˣű꤃ȆȊŅߪ܎ïլÜל␚˺詗 -ۖͽýΗۨيۑ읚֣ھ -᧷ު㥿θƿ⦝ʹȻ򎳥ě专ċ -ԐױÇǍŊ噍ѺҸؼɏù -ߪ;’❅̈߭ߍĩξ󰟄 -ҘɣĘރ̙Ȫý߿ӏ䁔 -Ȉĸ飣DZ̸ёȳο걉Ұ -Ӆέԓԓᅳ趥ָۇۺݶؾդ -綳Φ͟Ժ߻ΎӠʋɢ -ܰ،ޥյ߯ѵϽӿĹ -չ᫼ۼʭЍԱ⫲ַΎ㵙݋蛋傫 -ެ㜶ӏ臇ԃ†챓ۍ̤ЖҢ䈃셍ᮠ -ïڮӸʋ見‚޼Ƀݐհکٲ٣΅ -毑᦯ʿ޺啲ۧϳǍϘ듆ۇ̜ -ȩɣʈрԑǍ忇ހĴçླྀ -ӝШ޻Ք񯺜Șߒܱ˛ثž -༂몑󖗱߹Ⱌ՞֜Ԝ֞ᤃݷ֟ˁ -ގͺɘ㢆ؗܧʑ -Ǟ㏫ȧ䤋ꕃ㳲뫣ɓʽԢρ͸ -񧍗ݮ³ŝÚըȿŌ¿ҏ -ﶒ҂Ƭʨ땇气Ȕ٠ȋ -ㅨԼۘǿձ͓ѫӰϗﯠչ -Ϳǰσ̷먉훾NjɣșƮퟵ -캚⽾ã뀃ǜ볠߀Ӂɚѯ -щÏ龧ٻ۾ו񵌑ŝӽŶʫշ -춹ͦͅᔳ˹׈ۤ -텎Ɣ’ר͈Ңފր۰ψڥ푠׈އܸ -ߪ۽鸡ޫѾ٬ﵪ͈੮ا۲ -иݶ댙۵۵迩ƺ឵ϛڜ -ͤǗ ̊À˩˲€˪ʘ촀 -Ǎ֪ы҂Ԕ܍浲êȭ蹯ޏ -闁ߎشϨɣԑÀǁ긠 -خ؟Ǎዽ̿ڜ쐼ݘͨnj -ﯜݖײ׿՜̘ԝϙ֢秩򥚽ȶŠ˔ -ۑʃۏٹۑ -ֶܘۥ։✝ü利ʔЩŢ쯳 -̺̍ӳϘ׍ﭼߪ奵݌Ϝṻƾ -焺֭ʕݩߥޮ㜵ǴŃˑ䠥ƻij -ģ댉ѬБë͔𐤹́ƚŒ԰ -ذЀظ܈܀Ƞʋѯ¹ґꅰ -멷ƣǽԈܓގ𹱩§طώɣԔ -ʂ𐳃Ϳ؃çػѓΎƧ⛑ -ٷɝǑԯNjޟɛ̮Ϊ۬ͪϮ -҄͟ὦʃ޽ˮݍݍ殣ݟ -޲۝߅֬΍،ܝܸދєğʋńކ -򂐑와䴂о߳։͕ߋ -Ϊ܃ߨ͗ϩֺқ񮙘ܳ눙 -Ё젥ő϶ײ ʖ󅙶ȲϞω͓͖ -ljѣѱႅ☘ۊȊɊы襒󥂬 -̥Ŭ϶޶Ϯ뛧ܱ߱ǿϨȾ -ܦꨱƌӍѓǝȜޱǼܰށݻЬ־ -ٻܨڔ͛濜ؕʹ뜥ͼ®͢ҭ孲՝߮߷޿Ǘ -Нͮꮹןܶگݟݷݽ߹ -ݶξ헟Ǻ䛛٭묔ꃰфڤت؊Ԭч -À鉱惴ȿܰȞժٶεЉʀۓ -ͧ؁Ȁڬ㐫ϭεߔϱ -؇Ӎ蝱ψГÌЋ΋䆁୴◛ -Ηϑ灏ƒӣנ±װŬ㔮Е֔͗ -гҼϩ̺鵽ݳϘ -şݣޤ㕟힒왉͙覬ѣȼ㊙ߗۋ -̝݇˜ʚ™Ėؤܪ֡㺔ԛ㖫ˋ۪ -Շǜϐϑݞ︷ȯރ뽍δ -⫸ڨĩۅىܽܽԒۛ臭뚸 -ӆЮڸߗ֛ξѶܕ翿ӇԸꀥ -ĵݞή҆ڦʛգ勲Ĕ栝я̘ʊ -ت̛✍ܘƢȥޒ깢 -䥳ӐŅԦՌӊ؊ؔՠ˕ŋ݉ݮ骬ݨБ -񋵸޺ҴҰҸڰƁ혪ɝ̜ݣ -뿮둳ż -ՠšѵƲճဣ޳ɻѧϪŸ߿ -凜է︚߃󿵳췐 -붖˒ڍɕ҂ ܓ܃¼Ɂ΄ʉ -ȱ٩žϺڣ﫠鹳Қ -ő˗ɿѳ쀳鶢ѝϺՒ܏ٓ̓ -ŞȽ줔ɩ駁בƞ뵘餺܇㣌㙐ױփ -лزɔг䅾…ߪﲒ晚؍ -Ǩͅ殀ܜ鶞拵밳ųŨԘޚ՚ØȘ -ɨܘǣރٓ̅іʖԐӗ -ǵ٨ҁ뙀쫻娺먒 -ӳۧߺ圸ŽߑǮȺɵ嬸 -Ĩ€Ԁڲ˔䦊ΈՎ Ӓ鑉Όǿ -֐ԓǵˏ؛۷܃ߜĵ鱼⻓ƃ -쳯ȿ綠卤܎⌀ִ -쥼Ӻݒ֖갑줣ᱢ叝앰᤯בĭ茌 -ȐְްѰۉ˞іҕЗҗєїה밋뉖ω߯Ӓ -̨䅚¨܅ҕęЖ֕їՕᦛ͸ -ӽˉ׉֑󗖶״֧򖶰淋ʤʗȖتʷַ -ȷ㻳ݰѮ䰤ؙӧô௸꯺骹ᚻӤί -ݷϋΟנӒڪꎐײ㫨Ւø -Ξ琀Ա귘̯嗞ÀŮŕ鲆 -ǵƕĜ샤߅ϔۑ٫⚓ޫЌşح۽ -޴֎Մר׏딿Ⱦߨ¼즹朳ٛ駁ݽⷂ -ҍƚҸ錇Ï鉔䡆ŕ̵߯饋ѲֵÚ -ߪ䲺䮦頥˴˵܅̫֩եȑ唈 -ďӗȫ徚ŒȞͱۯǞ푬 -ߐ萬ᅯ듆ۄѝȧ۲ݹ˹ۛϻȾ˴ -Ș鼋߁񟣝߹㗷⺇ґڿ -۬ѯ͋Ḁ̇̄߂׳ۥ앤 -Ɨ鼞ܑʉԏͬϭ⻭̾룔ޙݎؐ󸀓 -僪Տȥ珻ϜەɅȗح֣ݹ -׬˖Җً񲿰˷ƭז鳰܀ -൱Űְʘ뒺Ⱝᵠɘɠե՘̄暦ȌեƠ -ݦĮհۣƪܒ圅ϣӃޣӑ -ߡݥۤۢɗԮ۩ަݭ -ڈڮϞڭҫﵙ̉كԤԜêןŚμ֋ -땤Ǿδˢڨƙ -ΎƋ򓹹۸ֶ곧ȉҼǝ֖ਟ챹ɾ -官ߡ֧ԏʹڎζۓÎ̫ⴢ׀̙ê鿫ǎ -پѬի̪ȳȯ𗬄ۍ꒓ſƹ -ƄԸޚ֔٘̿ؒ܉硯ӖȋǧՕ -ԕӔȗ֗ԗߌהƲʉŒ񖚷ǃï̸ؕ꯺¯ꢽ屁 -ú݆җϴՌ̥ŵȥ֤٥䅀򑰦䋼 -ӯЖʽĨǐјלѪɸӮ쭗 -흟ںߎِ׮ղӛЮ֤ǝ -􌿿ߗᣮɼȊǔԅ -ۥ﫰񬗤щ㷷ӅΘ؜ظ۪ -ᵳͣĽƼ財뢞Ҋǎߊ켌ޟƂ -٦ɈĉƊ땠֖֕׾݋džזíπ֗ -׏łܝ⹖ᗛȋҖ̔߱З沯똹ޖ -ꑯȃͣЖĻÙө׭զӥصΧᗢݿ姑 -ΚΚڷ睍ܭﹻ߰΁ߑۯ뎛 -ՎӖ܍ݹ󽞔Ŋ؂ΆΎԱǧ۽ıѻ -ƔӅ䃢ŽȿǾ۪ݫס֎ãܡ -ຉç٢ŐǏԕ˞؄ͼƹՃ㚉¹ה̹ԓĽ•ۆ͂ -ȱ奉͒Ͳƨ̌֜՘递Ȅ ͹ -ẕ̌œŌȦլ߿֑£᱙ċ䢯 -ˬ鰜⁒ϾȽ勺ﴈֶڝȧ˕ -͸͡Ͱ„ᶟێȣܕݩܵϹι -ؠ῅غ۵˫竴ý夆눑 -̸Ԅّ籜ޕ󲷲ϳɬщѤ -ѹ悖ϼҖۤ塘ݞθކ܌ݵ -ù೽㢑ӚޥᷜäҦႄցڒ -ʶҔĂҢĆ睭谬ӵܤ݋ -݃ϲ̄Ԅˠˁᠺҏˀ -ۥЯϑѫㆴݼݿŦ沦»䤨﫺׿鯽ﯿ -ߝڻ췑ۭ米і -鎚ƪ왳ϊ׮Àˎ՜˷Щ -ܶ㢢⷟ܹͺ㦃ŸХņⲁӆ⨆ -왱𺇤ϣׯڪ̢Μ몞ŧϸЁ -݊¤᎛䋴ȏޔɊőȭڏņƋ -ҫ䳞𺞿ÇƃãẉË̳ -ؓԳւ꿘列ִڤр˞ޭˇٔݕ׬褷 -񗞚쿻붷鄬߸ -݆ߣܽƷ羜է۪ͦچݞူ -おٛ墷ᢤ̩ϋ͉ߑˉ׌̬Χޗ -׊믽ˎëޗ䂫Ώݎ‡뻛Չݧ -ѬϸӐȧ́銪觰ڲɜڤڐ܏⁙ -ٜôȁޡ٫լ̥ڂ̣ݠԑМӀ -᪑Ě̞ƙ饜ƫԂӗװԀ ŀ⃥蕀‰û -Ȟ֩✪ݗۓӊ⹃מ՞՝՟ԟѬ׆ھ -Ϸߣ׺Ϊڸ뜛豕 -Кဈ֤순б -Ƽڠ髄ǫՌ -Κϳܖԍߣӏ˻ßɘђԼ -ҴҼܴ͒ҸְҴܸޣ☉Ґſˊ쐖ࠃՕȫ˪ -苭؀̂𼔏̤޲唉ʩӀ麕׫թ賀իº -܊ٸ۪ꗄܭ֑붠ʭ۳͍཰ϡ -ܵ웯ݳߢۛ -է۴옪ص煫ّ̈ŗˊ㸙̠֦̀ -싽їˮɱꧪ疚֗Ƀ幷 -ȾʸЭ֌Ηӎ؆Ԑͫ襶ͼ -أâŤƃƔ舰Ԭʇ̑ܐ -˃ޘযֱ֓ցִղֲӮި̕濦☳鬗ܙ弗 -ڥƕ㎠ȅߠРԨ؊Ϡ⨣لי -Ի͢ۅ̫Ծ֎ǝػ︺ؾ -޹㾿ӝՍ馆쵓ďԑūnjՙŬ -Ўǜ͈􂽜̂玪ؐϻŹ؍Í֧ -ϯԣۚݽѨ׏ë睹Ѻľ -޴ЍАϨ̾޴߉м؄ت̐ћခ҂ȕ -¤ɠӒჍ¿۩܋ن崙崥ԩıœ -ԋҧԱ䦂ٞԲղ悕͗ݛЩԬ -یƥ۶ꮎԾ窭󧏮א۽ -Σ͇ݵ瓄˝ݹׂ۫ጟ󣷽 -Üچցޢ߁ƧƼޓᓿ -긟ߋƮ횀»ٍۇ۫ҙ -ǹǾѾߍҳȇĉóِ⾒꣐ۃŞԐ‡֔ -˂؀ҁ鞧ދ̕ݿլլլ̷ӫ铀 -綖ҏٴÝ˖ۭحΰ꒽ߎ꯺ -ݛگźߠ痞ȏ﫿㭹י걤 -֌԰Ѕݭộ͎IJӷףߜĀ璘 -䰎Ʃʾҳ糖ۢϧѹԼǢ -܀̭ՑѰ—쑕쒐ћ񂗂ߐ -ڈވڀċƪ׍俳ŷֆۮثˀ -깳ɜ͂Գ޷ǝ՗ϛݼղ۩چʼnܭ -񗧺Ϡ˝㑦܍ثꭼðͿ -ٽٹѺ۠װ塔ď֗⃔󄙝ό񛙙ׁޕ -Ā識죦뷠،Ɲߕͷ՘ -ܼϛ¸ᘀ갢̒וʹչ咜 -ɽŞ˃ߨǃޘ愈ɁԀ -Д򰁠ĀſǛײ԰ٵܙΰԲӁ -̇偧͛ڒȍվ鼏گퟢד׵ -ޚʟ޶ꎵɍتԥꡄƌ -׉ޣ䆈洩΍؂༹㇥ -ǝ姖׊ʼn随۩ї։݃Ǭ츝 -ޛΏՊΎ膇ڑܣ׬甩τ谀 -ܼʋٹ׃ȉؼ -πȌٲ٭ŵŀܯܰ࿨݊ -Ā󕺥ȍȊϸϢɮˑ곶۹͞ܢ -դѨܧƔȣ϶۲ՒܬƈƼƏ롊ӷ -ҶԼժ␌ㇵ󮎘ؠҩʯ -ʝϘČϯ͠݃ -߇ڦޫ԰ܩ蟨ʓΊÞüԾݙ̋ʎ -儲ў͖ŁܰЗɐײլߵ̀խ -ٝԋ࿫āޞďוӣ睬կ곤֦ڔ -ͷƦɺѺ̵գΈӣеÊ攚 -٤ɆңޭǑӊٺӍ봴ʹ盩ۨہ̤̜ӂ -󲢏䥧丛Ͳנ֪ߋۜݎٖηř랜 -֌ިÌ՛쮩Աʫ奆ᙾꀈ -ʍƁӞц󘀫֔ -Ӣ߷ְθθֱڤ -؛ݖ׮߮ءڮ萔ꓮŵܨ̽ث -ꊭ˥쯷̐ҲÊʰ𬛔콣ң͔ -ԴޕӟҶݾ߼ߤ -۶ڐ젡ܲ⡘ڱֆ̀бŬ -ߊאܓނ޲Έб£฀뽀 -ؙ컫ŅҴ߾ʃب睱 -ڋ͹ͅ͵ീȋ؋قӢه藰퀀 -۹ȓNjֱՐ̸ᤢުΪڱ -ʋ串ӂ金߁ȸ钰ɨ锑țʉÒ -رٛ抖ӅỦݺցݧ氎޻ -ތרñƆӇ똳۪ؕ -ւ̱ɌҷɈ殣䅁فފΑԖ -ȯԠţ꒿ڴ竦êᕓ˪ῥ熘ف̓Ȉ -͂ქˏ浅Ѳϣّ̈ Ƥ€ -撔ǐﭽػ϶ў܏ܟƑǡލʠɖ݌ -ɸܗ߳Դ˨뫸 -򑇾ŝ⾁҈񋥤䑳ᴅʌġ -徤ᤇ󳃸͙ט֓Ҹޣ٫ݣ밁ܐȟ줄Į -Ց㧫ށߟʎƅﲽٔʈäٸ -Ѵޔٜфх϶󥞥П祿؏س -غë¬ήԽ٭֗޸ۺܕῂВ -ىǛؾ͉Ϣ題ୣ̬ -‚᳐Ԗˈӳپ羜ﭿ߷ր෈ޤע -ܵ׀̖ӹ䧁ǁχ桂Äя -סᄇاѸľΦ枥ӑ -罐ݶҬݒﳋΌ鰺у㫷Ŗ͖僅 -礽糽ԴÌǑǡڤԫ -݋뽄遯Ɩ뭉ؙОڇ -Ѩэפǡ¼Бŏćć⟛㞆➆㞄 -ؒʟ߈싾ʿګߣƋû -ޚ¸񵁡ۥѳԜϾοļ˸ -ɂѺØæʃЀԘƋ销ҋăýϋ -҅ӂʣএңȯҏȯ -܀þɼͥނퟨ -̊ιІƆ쁞ǯ܇ӆԼމ秂ȣ⯵ۖ䃤 -モިޒѲē֟þଠр -у詅栀ߡ˼냿 -ぽ뼿މ݉܉槪ѽލ㋟߃߳՛蓡 -ǭժ؁ꈾۂޡŐϿ̃ -՝䤮ŽÏލǸ쏝ŀ -ը¢ٲɉӝ蠉 -색ూݥΣ𭮀ěؓۯ -碫Ťޒŧü謼訸堇𕸧煮˝ -͜όԣ쯏֌ѡ -ڇ鰻ņؼǣֲÑױ‹愩ϐҲʳܛ݅ -ۃ՟׏LJﭷΒڋ߀Ȕאѷ -ޅⓀԧ݈簯語Йӝ缺 -皲ߨݭˆƺܬ -ÖҴȬĔꧦփةÖٹ -ޖϾ֗üޮ۫۝ﵕɎ -ޟΝŞޝǖڏȂ𢃭ʆѫŠ -ך󽦜Кޙۛه -Ɯڜӽ߽몑ŢՏLj -ߣƸ㙈乏͙áݦ߮ޙ߯ݯú -ν̹ӍƷí܊䅣ޒыϷѫ -篐絹ٷ𴕠֝ -ߟ窳ܻΕʮΥṰ֣гϻ٦ˆ覜 -Ŭ򚁖ٯϸɟЗᅮƞ֛NJ۾򫊼Ͻ⫿ -ѽ哏巆믴݄ӭ -謘қНۺꫯݹť߯ -ѥۏ鵕؃ۼ͆¼ -ܪ糫ܯҊ񪑆ܘƴαӘƣ֢ޞڵ -뿭ލܺ읋ܳ͑ˋ߮ -։ꫯϟٵ։՗ܾƙ՜ނ -ڊʒѻζۊ̧حᩫł̤ -؄ϠԆȱȡӜŠƫɳë -ʾ髛߼᫏ևٛߏ޺ُ¯ -תۙƃ窮ʯɥӠ -޼빟ߝߟ﬌ҞԔ -Ǹۖƛӄ㤱؎ˈѬРӼџθ -䙽ŇԌ䙵۶ߪͿ -ߛ֬틯ˇׁ˟ρ̇ǯ׳ٿ߼ -󿭿۳ťݜͳⱺ -ྂĩűŔǡȡDZ錛̝γȤ -Ƃșӗჟ烻ꌆͷʾ߅ÿя֯ -矼뿼ٽꯟ͉҇ϡ -߿β׋ϖꞠڄϋܐ -ʁŅɱνʰ֞ՌݑۦƣԂɛŷѴö -Ōޛ͞ʮ߱Ϛڎ֨ݳ賭Ըúߞɱٱ˳ -Ϸ٠뿿߼ҫ -ٿˋŚթңͬ۶Îۓ݂פכݿ˒ڹŰ -ĢԦԑЂьŭءÎ㛋ݞɈ -쫐٣۬؋ؖʹӌׇ -Յܝ޾򭮎 -𙨩𬵭ګו߆﫟쨟׳зҴֲ먙 -ۭ꺡̥͹׸ﺟѠⅧˠ껄꼌ͺŬ -ՒȡԱ⒫ђΏᐰѱέ핤֘ -ԯ塆ʑܸ︃ݎ巛ˮݽ -˒ݠ⼸Âŗ늮֖ߪޤŢߝֻ -ڳݏ׭ը뵳֫گь۴ɯ随ۗ舊Զ󔗑〛 -ѣ؎ÑƴֱĘԵ᪎笈̀ûߛŭ -󒘉˻ϵ׭ܘӹձֆʄػﴗܾ -ˣޑ͜˳߷ﳇԔݨݫĕ -ߎ迿Źй޻ұ݈Щ˳ƐԵݟçŐЁ -慇껆şͥլՇژԱ򣊍Ӝœř -ڣևȗ𰤛Ȅۈ˧˃ -󽫍՟Ыۑ򿇯֗כ܄ -󷂷սߗʗȐ߻Ĺٛ罖ـ -޵аѓзˆܑ޹̑Ղ筐ԅŋ -󌅡쏏̣̀ޚٽՠӌլܱ -⑖¡۽ݽշ׻ʪƻבѧҪ𱁼 -ъΪհ܇򆛋ʦ溾ܙۜߙ隀 -ƪۜǼ㞇ݤ߸Ĺ۳ھ㠅ðɪÎ -ȧԈÒ؇ʱѽń҂ƈ샏ﯶ -̴þɷ޻ڽԹԲ窻ۼ购ิﰩݍ꨺œ߶߀ -흂ӠǢؾ܋° -켴ߔڥ͵ݠݳꦃ߉诊иف -唧ԙ儸ˡΎ晋齓ݡڦՇЌɏܹ׎ -۵ٽᄑԺ׸ܾӯݛŨ֌ܙܜ߶κ -磷Ջꫝҭץ黥˿ګڟଽܸռ -йɪ羴ſʾƖئݫĎѭ樽ҡ -ƅô⾘ױ斶䫖ڄ޵܎韞 -ނŧ뇡ؽɄ켲ھԙ꾹 -깣꒑գށ҂£īӽ«Փ՚ -ݴݚԻχʡĺτ薈猢ֱˡ -ἚՆɎтöŧöΝ -ң߷ǭ֮ͼЌ׬ٜѝ憊򦱻 -䏶ߔ黱רˍل鋁ʆ߆Ƭϰːɞ -ͼڬ̊ɽͿڟڲȫٖݥ䝧сא -Ἡ쵢؎ȎԜٚڮ葊닂Êе -ӽъ셮﬷֨ݚ؍婓Ȉ۶ -ˮ璇ݣޝغ͆ΉʌÐҕ֤ -ƽ⮠ˡ͇ᐄ㼸Ùѱ뛭Ӡ⅓ -՜Ρް쬳ՇֲֽَNjٚ٪釪ʉ -åɥܒϚμØꬂϩ߈ -֡ѹ٥ņẽմ䉝ݞ쎄⤈ұ뱑 -㺕Ƒ쌓帰Dž҇Є̜Т -ẰԢêۧ·̧܁ȮϺڲԝх؊ެۻՠ䍙 -Ѳ񲰘̼۔᾿ķ҉ཀߪ˪νڎȄҏԝ -Əӛ֎잊劕⦰ߋƛטԎؘ -򜳐ḄŏÒˋؼك㲛ᮼϢ횇쳊ؼɌ -ٞݽ˪̈́􃍩򾠞׍߃ -Ǫʐޅϼ۳ԅ梛ͻԴ䘤ᝡ -ҏŞ򇕣՜䲱ݛÎ縺 -Ȳ჏˜ʥǔ䏧ដȰڞٷ훝 -قךԆœ̞뉙󏁰՝ڂȮ̊ -ڛԐ…ũ۱ۏް잇®Ѻ腘Ƭ -ԹƯȎDZ秼ջ㕫ʱŌ󞲣֙ʲ -ƍӘըûۏ꣸ب’Ѷػ -ܻ͝Շʆ¶񴟤םÓǕߊḛ؀ѭ -䆏ߩ؇ƠΡĕ߂̾΄ܾت𰤓ĠⶀԌѪ -暏ŸȁNj΀֚͢ʻ̊ -օȏǮĿηȘƀ٧׬Մ渴Ƕ -椏۪ɡ߲۟ӡӚȎЯӉ蚄àʰ -ƙȸΑФض揵񻱠谜ʱ麀槈 -鱪ȨӮ寣ۺð߷解Ƞوٗɜھ -ײһϬ癃¢ܱ֙Ɩē֌Ԫߢ -˼ݶ٪٤Ҁͱꦐ在Ѱ˱ -ޢݟّ鎠末܅€籄궸Ŵᦩֱ -ҹѮᐰàȄᱥڦ池 -ЃίݣŇڜ݁ݻިīɡʤ蚍瀰 -݈ږՉ땸γѕҩд֠ۨӺֱÀ -ˆតԄвàဍڧݦԆȹĎϰ -ݰڛԪքޛʥ֥⥈晰孖򐬃Ӊ -ۅŪȪÎ眾ؽ냴ȿḇƫᶮ̆ǖҦ -̀Ӹϸ慠ƽḮȄŭҏӀϰ͆̋ -ЄߊʹЮՓƭϚɰ㐰͇Áۈ㌘˘ -¸ɏӐä܋缑ރѩߥ邽 -ƕױظ˫֠܎ä ĵ섎ڋ -Ʉט򂰃힕ڽ̹ľ䁡묐քӔȝ܊װϐ -򘴃֥ÇⱫ񦟞̊Ͼ⧫؎Ƣŏؑお -ɇנɾߜ̹Ȉ âƱ嘶ߟ -ϐӷ܊۰灹ŏ퉈ٗ㬂Ǧű֯£ -켃ϠĽ؎ŵ؆ޅ獦⍑Ԁ -²݂辫ĒƑ񧅁ϐܲϝLJ瀔ޤڠ -˒ۤ胤ǪЉԉ鱨ަ瘁ʈ჋ -šԞɋכ°֎̈́ʒي -ɒ㤾
̅̕꬇पÁا -٢Ǵ¯ˈؠœ♟񬐚ۤيм͒ȱ潺Ԣ窢ʷʹ -㖪⌍ĕوՌ͡凜䤨ܨޖ¾ʑᘆ -ƽļ؊̒Ծ̽ł곮́ð͜ɂϟ˷ -ϓڢˁˊ݆¶߅ٮ菚댺ұĪƼŜ -񘪎ȡǷԜᴈÌ݌Șםꊖ҂߅ -ⶕòٌٱحܺȐڏʒɤֱΫƪ֊ -ؕƌ쌶ѱ۳âľ؎Ա㕻ӽӆȘ댫ŏ -ᒥ퀕̶⬯ü爎̴ߟ䑙瀇ԻϥǷү܆ -ڡ̢̫ۙ󕨨əԼԂဍ㧪Ŷě -ǿιڕб؟ŏǗ𯳾Ԍڦ̲ɒ -ӑԱӀ󍥪‚ձֱ񸊪Ռ -Չ񦝊Ԕ׎񙈽ؖ߸̑񯏚ÁڕŸ압Ƃ -Ŝ˪ÎЦƧ̠ -ۻȘˑ񮣊ж˼౩ρӬಱ񚦥ړʠ͵ -ުˢ㑀ڔȮŽĹݛ̽ОÁ݀쁖 -֣ʑ±⥘ˏĤ䙟ޜԎ갇ƿ⸇깄̲ -ڧ⠤暣ꛞױéձ㇊ױَѫ؎Ġ̼ձб -NjɞƄ񰇽̐Ԍʑܚ𞦪ÏԚȌƂѓұ嘁 -Ǥ¦ÎҟāȖՅʩᮞֹŦŝ䦖鵥ϴ -ԑӼ΄ìĒ񦲦ϓշڐέƌƨ͍؁ -ݗƷÀϱְԜլᇜ߭ĕ˼ƃт -Șܔƪ᪖Ŝ˦ܤΏΕ揿͕ -Ãֱ䃊бԜŶΤШȡǑŅ贆ŕ̮ -𘙀Č٢ġ۱¶кž粸䆟šÀ -ܕⵎܛ򌪦ԬÎŘڏ᱀܁Ŭく -˛͇Ʌ𰀞񊤩ڷӯDŽѱ݇߄ŽĹڠކ -ώߪ姄Ę싘ŜѰڏƲڕ٪ĖՌѱ -ȓ؞㣪̈́ŤԌȩǗۃ⩝ -ʡȦ͉쏞ʵĜ߀¶ňٔͫϴˬ -ٵչ¸ˋפ̪ŭǒԺ聙󛈹ʽˠ -ڑб˜ý幖ܻ٨ﺬ̄ -䏟èֱ砽݆ڎâЕլĘƩ -﬇ǥߤᱥÆâߑ՚՜ɹϠԏұ񪇿Е㛧 -̪ёŸ؀¾ȟˏݚň̀삡ё -„ŕ݆췕ˑڷӡΔ͈΅ŬҲ޴β -؎ͨʈʉá˽Ըųĺř -Ԥڈʌ˙̄󰠣ቨכ፷ڌɣ𴱖՜ -ωɠʬļΚ濦՜̲풤۸ÎڕбԜު -̥넀ղɞ̹̪쪾߫㱍Ԝ -㹿򼪞߂Ḋҕ⯢̐ұ稇 -ጪۊӧ㹛Ȑϝ܌ܻǽ㙯œ񨺤Ĉ񒱨쓨 -ƽ϶îЩ͂ڵͭւӚ׿ⱬۍ -ՌܞҒ쳅ڠƢޡĽо뀦ؠӸ˸œވ -ȴߒݪҾ݂ʹېُԬ􇩘ԧԟ쵪Ӫծ۬ȋ -Dzՙͅꀒ񪳇й丧ʑ̸΍ -Āֱб⢇Ʒͮפ徱索ڤԱǸӞƇƶ -Ҵֱ߹ď̼̩Ս鑪ׂ㌩ՉѼ -ؑױ߸ȑ㹎⴪ijԱЬʙ՜ -ܳէۿ䣐㴑ΰDZĕʢƧ -Ⱥĕӵ̼ͩՌʌ˽ڳѿâˣΙ -՜ŔϧƲ帖ƾѩάٰΕϖ׹ -صǖāбԱ˻ŞƇƶδѪDZ衲Ռϵũ -ŢŋӤݐғîЦ -Џ𤁝ޤ¾愧Ŵˠؔ򦄕ˀڲύ߀ʸҳڲ -БŲŴБ橤ۄȸݝʴߘ -dz͓Ԍίߕ팜¼߇Əˆﰯѱ؎㑩 -㷤ⴶ߁ŨƑֱךү -Œܩ샌ЌʬϫȻ阋ډժͷ코 -őšɾ۹瘴ũ⥸ª賏ˆ㠮ܸɖޱֱ -؜Ʒҟƅ̳njҎّԜ侹í㇟Ŷάܸ -լdz՜ȸֱ̚㔒؟ɝ؅肊ᾱ -屜ՌΫۇެ͚㐞ǨՒũƶΪ񲹍 -݂ÑɃΡ򒥒ȖΔ⊀κىݒÒ׳ -ڴǝߒ賁±䋄ȵݺÁ׋܎ -ˀҿÁ၎ћ҃֩ѩ򚭙Ȇ堩̍ɡت -鶥Ȏұ쪙ޡȕĬֈ井҉񡞖ԬӐȣ -ⵆà⹎ح啿򳑪鋝Ԉɜɡ -լآֱ -&] -[s0;= [*/R+350 Dneska dobrý!]]}}&] -[s0; ] \ No newline at end of file diff --git a/uppdev/AccessKey/bak.tpp/hh$en-us.tpp b/uppdev/AccessKey/bak.tpp/hh$en-us.tpp deleted file mode 100644 index a2744917a..000000000 --- a/uppdev/AccessKey/bak.tpp/hh$en-us.tpp +++ /dev/null @@ -1,37 +0,0 @@ -topic ""; -[ $$0,0#00000000000000000000000000000000:Default] -[{_} -[ {{588:588:588:588:588:588:588:588:588:588:588:588:588:588:588:588:592 [s0;%% [R Aa]] -:: [s0;%% [R Bb]] -:: [s0;%% [R Cc]] -:: [s0;%% [R Dd]] -:: [s0;%% [R Ee]] -:: [s0;%% [R Ff]] -:: [s0;%% [R Gg]] -:: [s0;%% [R Hh]] -:: [s0;%% [R Ii]] -:: [s0;%% [R Jj]] -:: [s0;%% [R Kk]] -:: [s0;%% [R Ll]] -:: [s0;%% [R Mm]] -:: [s0;%% [R Nn]] -:: [s0;%% [R Oo]] -:: [s0;%% [R Pp]] -:: [s0;%% [R Rr]] -:: [s0;%% [!Edwardian Script ITC! Aa]] -:: [s0;%% [!Edwardian Script ITC! Bb]] -:: [s0;%% [!Edwardian Script ITC! Cc]] -:: [s0;%% [!Edwardian Script ITC! Dd]] -:: [s0;%% [!Edwardian Script ITC! Ee]] -:: [s0;%% [!Edwardian Script ITC! Ff]] -:: [s0;%% [!Edwardian Script ITC! Gg]] -:: [s0;%% [!Edwardian Script ITC! Hh]] -:: [s0;%% [!Edwardian Script ITC! Ii]] -:: [s0;%% [!Edwardian Script ITC! Jj]] -:: [s0;%% [!Edwardian Script ITC! Kk]] -:: [s0;%% [!Edwardian Script ITC! Ll]] -:: [s0;%% [!Edwardian Script ITC! Mm]] -:: [s0;%% [!Edwardian Script ITC! Nn]] -:: [s0;%% [!Edwardian Script ITC! Oo]] -:: [s0;%% [!Edwardian Script ITC! Pp]] -:: [s0;%% [!Edwardian Script ITC! Rr]]}}] \ No newline at end of file diff --git a/uppdev/AccessKey/bak.tpp/morituri$en-us.tpp b/uppdev/AccessKey/bak.tpp/morituri$en-us.tpp deleted file mode 100644 index 72ebd3e95..000000000 --- a/uppdev/AccessKey/bak.tpp/morituri$en-us.tpp +++ /dev/null @@ -1,70 +0,0 @@ -topic "Morituri te Salutant"; -[ $$0,0#00000000000000000000000000000000:Default] -[{_} -[s0;a83; [R6 Morituri te Salutant]&] -[s0; [R1 Cesta je prach]&] -[s0;a83; [R1 a štěrk]&] -[s0;a83; [R1 a udusaná hlína]&] -[s0; [R1 a šedé šmouhy]&] -[s0; [R1 kreslí do vlasů]&] -[s0; [R1 a z hvězdných drah]&] -[s0; [R1 má šperk]&] -[s0; [R1 co kamením se spíná]&] -[s0; [R1 a pírka touhy]&] -[s0; [R1 z křídel Pegasů]&] -[s0;R1 &] -[s0; [R1 Cesta je bič]&] -[s0; [R1 Je zlá]&] -[s0; [R1 jak pouliční dáma]&] -[s0; [R1 Má v ruce štítky]&] -[s0; [R1 v pase staniol]&] -[s0; [R1 a z očí chtíč jí plá]&] -[s0; [R1 když háže do neznáma]&] -[s0; [R1 dvě křehké snítky]&] -[s0; [R1 rudých gladiol]&] -[s0;R1 &] -[s0; [R1 Seržante písek je bílý]&] -[s0; [R1 jak paže Daniely]&] -[s0; [R1 Počkejte chvíli!]&] -[s0;R1 &] -[s0; [R1 Mé oči uviděly]&] -[s0; [R1 tu strašně dávnou]&] -[s0; [R1 vteřinu zapomnění]&] -[s0; [R1 Seržante! Mávnou]&] -[s0; [R1 a budem zasvěceni]&] -[s0; [R1 Morituri te salutant]&] -[s0; [R1 Morituri te salutant]&] -[s0;R1 &] -[s0; [R1 Tou cestou dál]&] -[s0; [R1 jsem šel]&] -[s0; [R1 kde na zemi se zmítá]&] -[s0; [R1 a písek víří]&] -[s0; [R1 křídlo holubí]&] -[s0; [R1 a marš mi hrál]&] -[s0; [R1 zvuk děl]&] -[s0; [R1 co uklidnění skýtá]&] -[s0; [R1 a zvedá chmýří]&] -[s0; [R1 které zahubí]&] -[s0;R1 &] -[s0; [R1 Cesta je tér a prach]&] -[s0; [R1 a udusaná hlína]&] -[s0; [R1 mosazná včelka]&] -[s0; [R1 od vlkodlaka]&] -[s0; [R1 rezavý kvér]&] -[s0; [R1 `- můj brach]&] -[s0; [R1 a sto let stará špína]&] -[s0; [R1 a děsně velká]&] -[s0; [R1 bílá oblaka]&] -[s0;R1 &] -[s0; [R1 Seržante]&] -[s0; [R1 písek je bílý]&] -[s0; [R1 jak paže Daniely]&] -[s0; [R1 Počkejte chvíli!]&] -[s0; [R1 Mé oči uviděly]&] -[s0; [R1 tu strašně dávnou]&] -[s0; [R1 vteřinu zapomnění]&] -[s0; [R1 Seržante! Mávnou]&] -[s0; [R1 a budem zasvěceni]&] -[s0; [R1 Morituri te salutant]&] -[s0; [R1 Morituri te salutant ]&] -[s0;%% ]] \ No newline at end of file diff --git a/uppdev/AccessKey/bak.tpp/tutorial$en-us.tpp b/uppdev/AccessKey/bak.tpp/tutorial$en-us.tpp deleted file mode 100644 index e12215528..000000000 --- a/uppdev/AccessKey/bak.tpp/tutorial$en-us.tpp +++ /dev/null @@ -1,7882 +0,0 @@ -topic "<<<<<<< .minetopic \"GUI Tutorial\";GUI Tutorial"; -[ $$0,0#00000000000000000000000000000000:Default] -[a83;*R6 $$1,3#31310162474203024125188417583966:caption] -[b83;*4 $$2,3#07864147445237544204411237157677:title] -[b42;a42;2 $$3,3#45413000475342174754091244180557:text] -[l321;t246;C@5;1 $$4,4#20902679421464641399138805415013:code] -[{_}%EN-US -[s1; [%-*A3 <<<<<<< .minetopic `"GUI Tutorial`";]GUI Tutorial&] -[s2;:`_AccessKey`_AccessKey`_h: 1.GUI application main function&] -[s3; To hide platform specific differences, U`+`+ GUI application -main function is defined using [* GUI`_APP`_MAIN] macro:&] -[s3; &] -[s4; #include &] -[s4; &] -[s4; GUI`_APP`_MAIN `{&] -[s4; -|PromptOK(`"Hello world`");&] -[s4; `}&] -[s4; &] -[s3;= -@@image:880&643 -흋ДؚՐ᠒ѣ憒̼㢗 -Ǩѓċҁєďޟƽϗ⯂ -酼񊾮ҭܭߏͤəۯ㴦ڔΌ֡ -ذ˫ַޛτӓ鍤獴 -朸쾨ꯃ࿬͸ɔ蹉؁֌ЂӁ͊̄ȤӒٍ -ٮ˸ՁಈƂϲ熮ۗ -օόɫɲ䒀ʮ겧櫲˂顱Ή -ݥ؎ܲ߁؏Āͯ²؄ɐ硔ǂ -ցߩ郓˪ꚄƆΏਖ윒΀ͧ󊁟Թ˙ -߄􍏽ҭץꗦҧ֭ǀꒆ䃊Ƙ̢ -¿޾ȇßӌ傉ރԗהȉӀ򯾬ط׆ҭט -߿źחխѮّѕرáںҚګҍ -Ƞﲏ†όԞضﱔذܝв¿ڂݚ֬ -ר郾茚Ώċغã܌Է̾߳ʷ -Ӵى̘ԃΟëȇϝ͆Œǎԃţه -ֲȕ䨽ٝݿΔѫΛ̙ؒ噃 -ȐɈˀƤҊûާʫČ֑ӂݫʈ -̲խ揧ߚ·ȉ̓הܯއƇԉ -޻ҊǾᴀ󉷳զץǩɣߒٞӇŇ -ü샑̠܆Ղ҇ĊоدݑȄтņ -򾊸ľ̗ÈǾ銎໎蓒Ň͐̋警ס̯ -͌ɇؒĊԝͺ֭ʌޕߵڲ̾Ūߣх -ДʙҪɡߥٹ⩣ϻ群ͅ -ȹꍊȇصdz琺ݭڲ -ёП浤ЍĿֆٍ̾瓛 -ɕ⫠ʒՂצ֭̂ܦ蓪Ͱ̔ -ߒº鵤͛冹ݮ扛ɹߔɡ돒ĐŅӼͫ -żŃԥʻ㑰Ê䃁矁潐 -ϠؖκԌšLJ뫠ە隘峴㬲ӭ̯Ê -ᷢ꛰æޅʹ۱ø徔߱ -͞ևҀ󩈕Հϭ݊˒ǪҔ품ݢ -㇇鱒䭾؆Ѿ൴ȼՏۑ܂Ï -ѻ٫Ń܃ֱ،Υָ٩̭Ǒњ -猉Ѻиʟȯڇ仵ߟڛʼnݙ̏耧ޖն -췰鐓署ƝƇᜀן߂ܡ¾ۖą萓ӉɊӛ -̤զԨӥƨǡ閄쁝ղÿС -虈߲셅腴ᨎٯʚӦּܑҨ͇ڈ -◴ȇػȉ־܉ˉɽ͝ -گữҘʗɝ坊ƴ˟إɡߍ̷̜󊛫֡Ȇ -̇ɨɀ۟Ч폌áЮ -˝Ȋռ䬃筌㋗ïґċƏͫ -ڭӁ؀ޝ⁤̩΍̮〉ێՈÄ -윗DŽڰدۡڕކތ΁хϖ -ß򑑏ޑ߄ޱ뫬ҍϐ¾ְ̇ -̇蜛İ蘏ءѶĿɇΝ -ܾ׃ٟׅџͅǚ㚉Ȇۢܒ졲 -Ëʈʈœ𑲛áԿ޲ -̇񠾸ᚏ̉࿊䮥ۼͺᾸ޿杧 -Ѣ™ؗĴȇߜ䃓Ü݇ -σ͟ڭ˹Ф΂颛ٟ羸߻׹ -əʎ괐ͱŒ͙ߞդ -ѫ‘흊ᯁǭѦȖҍ԰ -埌攉оȥɢƳ߾Æȓ惃ᾰј惃ᾰ蘏 -İ蘏惃̇̇а惃ܽ˥Ν -˃㽒׬Ȓ׭ٻիӡʾܰȀ -ůꇍ‡ϾʴՂסٺ® -񴏐̇ྸニӚΦӾ߿ -LJЎϡ՟Ýʢς荘¹܇ -¹팇ܻ惻鏃܇ -߭џ럤㰟Ƈᡘϖ㰜蜵ޅӾ -Ϲ̇ޓɆٯ凉޲ןȐݎۂ -ܽ䨏啮ؤ탄Ǵ臆 -炒㫂欚ܴƣȰއ率ќ⏅ˆت¯˅ҟ -Чɭā -&] -[s3;= &] -[s2; 2. Application window&] -[s3; Application top`-level windows are of [* TopWindow] class. You -can run modal loop for [* TopWindow] using the [* Run] or [* Execute] -methods. Both methods open the window if it is not yet open (you -can also open it using [* Open] or [* OpenMain]). Unlike [* Run], [* Execute] -also closes the window at the end of modal loop. [* TopWindow] -is also closed by destructor.&] -[s4; #include &] -[s4; &] -[s4; GUI`_APP`_MAIN `{&] -[s4; -|TopWindow w;&] -[s4; -|w.Run();&] -[s4; `}&] -[s3; &] -[s3;= -@@image:1920&1324 -לםᳰѪ؆˝є֚ -ɓڴجЇԅՊހܳ󎞜 -޳Բ̬ɭ˹֬Ҟ顋އݰܩ۶ -þɌ̣ƭݻϜۺ -鼿乲͚ݯ֏ҹƏϬ׳酝 -̳ɧϗ޳ɢҩɵ͚ړǬܕֿ -ؘ孙΃ڷƬɭ -ĥۖغۦۚҲμ䶞Ҋӗعݙ -ٻ枯ҰͣߙմնڳŔٴ氿۱ -ϫϞ끠ҥر۽ݴӞÞԇ֮է -ʓچʀՃϮʕӝ˧ڗޜ -㹭ןؾמߤ笟ؿ֌Ȟߙӌܕ -׾̦ۯËͧǫۚ -븨Ïܿݴɻۀҝϼ닎Ѷν -Ňֿݽӧٝ߹źȦ -æ¦ -ޯҾ̷ִʎ䶅Ľ֮ -ť促糯ܖ𵷴ͼٰ۟ҚȻ -ےɝȷ׿콷眯Ƕҿчߺ¨韀 -ᝡӵ޺ܼҭΑз -Ҿ޸ق߳匞ɎڊܱǢ˫ιޓćҿ -؟Ѭֿםʅ۽˒ؿލ˱۶݂Ƴ -ڛמϥۏܿٷ䃿܋𖕣叢 -繬͙ι͚ϩȾΧ -̙哹ѫϦLJà޾ܾ󲫠ܿ -Ϯ꼽񥧺ʐٛŕͬߛɔڃ -̚Юفݟﮯݟ㟻Ӷ͸ϔܖ -֤ݾӗ׼־ަշƭߞޭݽϞ€ˢΝ̥ -翮򞩯ߵ׎ͦˍΦ́ -ܠ酓恨Äꞛ麥 -ݏΦϿظ۞鯀ηƏȿɥˁ㪥Լꯕ׏ -Ֆؤߚ˫ߎϠΞסȣ -ǩЕᚸů˟ -娯ɽ˧ޫڿꟹҴֿ쪈îջ -邥ۈ֪Ƣܝ׽΅ˮUʩ˦ -󄞅ҳ׽헏ٵћݯڻƑʱرߡ -Ⅵǟ⶛Ѯطᧅ͓캽ҍӏňљ -ʿΒړ繸􀜞㹏ݱ汩̼ˌ -ڶݽ׎ -Ƙ֎޳퉟ϻļܼÓƌǯٌφꞹ -ز݅꛸ӝᘪͅɫ饃 -ݛ෰✖տѩ߬ -ɢڲʲߩ¶̿ʀϐˠមؚܽ˚ڲꯘ -ӳڡ۫̕ڻ۲ˠ -¦ھރ㎒˞щͻ쇀˦􏀐 -ѿ蟀ģŀ􏀐ѿєĐԑꟀ -Ġģ損ѐ萟ģâѿ -蟀ģŀ􏀐ѿƙ蟀Ġģ損ѐ -є۷Ȁ蟀ģ􏀐ѿȀ蟈 -̀ѿʀѡ蟀ģ􏀐ѿ蟀 -ģŀ􏀐ѿֿġ損ѐ -ģâѿєӫɸŀ􏀐ѿ -ƙ蟀Ġģ損ѐє؍ -蟀ȃģ􏀐ѿҴ蟀ģ􏀐ѿ -ĐϢ􏀐ѿȀ蟈ĩ̀ѿ -ʀѢӻ̀ѿʀѡ蟀ģ􏀐ѿ -蟀տҨ蟀ģ􏀐ѿ -Ȁ蟈ĩ耐ѿÞѿ蟀ȃģ􏀐 -ѿҴ蟀ģ􏀐ӍĐ瓙п -蟀Ġģ損ѐ萟ģϳ -ĩ̀ѿʀѡ蟀ģ􏀐ѿ -蟀ģŀ􏀐ѿƙ蟀Ġģ損ѐ -萟ģâѿ蟀ȃģ􏀐ѿ -Ҵ蟀ģ􏀐ѿȀ蟈ĩ̀ -ѿʀѡ蟀ģ􏀐ѿ蟀ģŀ􏀐 -ѿŀ􏀐ѿƙ蟀Ġģ損 -萟ēԷâѿ蟀ȃģ􏀐 -ѿҴ蟀šϭА萟ģ -âѿ蟀ȃģ􏀐Ꟁģŀ􏀐ѿ -ƙ蟀Ġģ損ѐ蟀ģ -􏀐ѿ蟀ģŀ􏀐ѿڪб􏀐 -ѿ蟀ģŀ􏀐ѿƙ蟀Ġģ蒩 -􏀐ѿȀ蟈ĩ̀ѿʀѡ蟀 -؀ĐӍ蟀ģ􏀐ѿȀ蟈 -̀Ёۓ􏀐ѿƙ蟀Ġģ -損ѐ萟􏀐Կ蟀ȃģ -􏀐ѿҴ蟀ģ􏀐ѿ􏐀²Ż萟 -ģâѿ蟀ȃģ􏀐ѿӿ -А萟ģâѿ蟀ȃģ -􏀐Ŀѿƙ蟀Ġģ損ѐ -ʖΜʫߨ޷ᯀ߮ȲުڱЕ -Нєۭξ֥ݦ법럋󶄀ի -&] -[s3; &] -[s2; 3. Modifying TopWindow properties&] -[s3; You can modify properties and behaviour of [* TopWindow] using -`"modifier`" methods. Note that modifiers usually return `*this -as return value, which results in simplified syntax. You can -also setup the size of [* TopWindow] using [* SetRect] (note that -unless instructed otherwise, U`+`+ will center the position of -window).&] -[s3; &] -[s4; #include &] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|TopWindow w;&] -[s4; -|w.[* Title](`"My application`").[* MinimizeBox]().[* Sizeable]();&] -[s4; -|w.[* SetRect](0, 0, 200, 300);&] -[s4; -|w.Run();&] -[s4; `}&] -[s3; &] -[s3;= -@@image:1040&1669 -Ѐ΁݉ؔ񂔄䓵⧈ДРᕣͳ䒓 -ˉƙζɖ͍ޗ㪢ĥ֖ -Ո穐ҕ²ʈ׈ىءЉӸܬϪƯݵ̉ʹ -쳵뽒ėٓ -䬛جԬ͍ﰥɹ˱꟦ԉ姲ߕǜ𱃓؏ -⛅֩޵ʪڑϱƊܶψҴӜԐږۣӯ -֛֣͊ժʒ⍗쑪ƌՉˮ坽ė┇骱 -׃ɦٍåճ﬜؞֡ڄﺅ࿱׏ -գՙ̮˘ΖĴʩވƲƽЛ -Ͷ߁봺۽۱ٟΘǛǘɇ͒ -Ԉ䃙պ՜򚇥ҼɻԘȔʳӰnj -צ卖ԃҮݮݾûӰܒųըΝ깅 -ճӷ༲ɖٯٵܹ˕ݩ -әӋݑٶҩڐٺޕHΙ -݇ӿϟ起Γ˶ۊ޲ſӎ꿓Ӻ˶ -ҶĕȾۼݝϪߵ֥ߑަƍϞ§׾۾敖 -Պɶ–Ԇ՞ΔƸ獴ŏٕ -ͷĜߦ뛈ޛȞЎ©; -ҿӟ컭ԵˮŞڋāݲϔѫ򱷣 -Ցϫ҅ӮȽ䳲Ҫ޼ǖ鑰;⽩ -ڸ˻ǟ߬ߵԿǹڝ󍓗򂵥Ϳ﷝ -Ψ䟳䗿’沫ºʼߦ±֧ -ޫݍОڽˆ͚Ϋجݫʟ -嬬ԙʒ̥Ŀެªޔ݇ިϕ䩞 -Ӕ圹ѯׇ̻ω߽篜簫翯 -׾߯η⽱ܒ֖냷暟͚ٹӥ -ϛַە͵DŽЀͽ -Ղ܂ֶǪýˣ߈Ǽɹힴ箶ަ쳚͡ؽ -ӥܥ݄윁֘ҏퟞŶؗŦި۴ -Ͱɑ멙꿢՟Ȝ«Ћ𿒞عߵĶʚ⫌ͯ -Ğ֛يۙ뵰̴ǘۇٞώЏ믈Ϸ싟؜ޤ -ϊԽކ彽ܩ󶬗ےյ۫ӷֿȻ료ڮֳۻ -֫ǻ޹޽͵΃ԛ륻ѽҴ -Ω˖򺷦جۣͦÏԻ󫪛 -؜ٔ򿩘ם΃ПߓұԎ֭ߑַր׻ۻ -Ãֽۻܐ޽稦ܒՓ╮瘅ӔԤұƨƇީ -ç٨ܚƎֺ㋙ܙĽܢӏҙ޼ -ۍΙμīﳨݕ梯ʹ竤ˌا⋋˲ަφ -˭ٿ͘ڬ᧟줴҆ -ί٤Ѻ綹DŽֻĤ۪ʠٵ咥Ӿ蹪ᶣ -ӡ۪񛨒꒺ۻç׹ՅϬŵ͜㽱 -̕ߌśٖ䂞Ƿԕ֟Ȧ۞떟 -҂˖ؤ϶閛叕ڬŚɓΫʷ -֧񽏧ݿڟ߭ -׼潺ϬՄȫچڣŽ탒пŧ޽âã•ë -ʿ섴軽Է鑲ȏؤȄو륵接ߦ݀ -�ߜ֦టݨٮʏٜ۠羺 -󏢾鱘ꬳϷ´لܒ͌ʖ܏ -Ә澛壎ھ秫ԭݣ۴÷޵ܨ׺䣞᯲֟ -Ǯ˨ȫ˫۞㑔س✯Жޮ֙ -ЍҼѾºńԤٞܕة۽式 -ּ㡶ֿًߗ셲ڲ -竞Ǟ罚ߑްپÛÎζۯӺ齊 -΅膔ߚ㫑Ԭڣ֭ڍȤᾉ׎ -оՍӤÌĔՙȶΑó -強ޛħֺؘٸԭٱʖߪ좗潊 -ęӫԵⴛסﱘʺ豼̟ -جҟſؾʆЏ혘ٰÃ皖ѷȔ -컏ջ׎ڧﭥԄ׮˲˷υú٪ڤՅцݲ㙎ޘ -ʙポϔįݺڙ⩾톁ކݲ -Ѯ㌲ͷοǬѤ辆󕈏珰 -̿˷œݭ۞Ҳܿ摸ƷƩ٧ -Ķ٧Ѱ؊ܣҦÈվ’ٝӽҨ -ɳۻܾ峅͖ɪڜύ߮ݱ -ㄬۦڼپдÎ⓮Щ嶱صٍ -쵛Ĵ‡ޮض􏩿Ó̃Ώްŵ -閖ߛמƗҲӋə㭽㚝қܲƛе -֡բէԢǕ襎ȵ򼁟ͽưޖ -Ӗ۴֩񛌥㛩ْܹĀ -ۙŹ΢ċӫʴ݂۷א -ȘŚ۴ίַߡֻ׏٬Ȏƺ -︿ۣ׉隉͓˖毱Dzòҵ۸ȵﵼ -ʻ鲿ߚЖԬǑ̰ݹݕӮҜ듞˂Ü -ؒଶƛ틌΂ָ彗Ъꝓ -賚ٟ軩ӹ¦ܟة잓ӰҩχˮӨ䦱 -қӛѦͣӛƦ汹숒ַŔޏ翣ϥۑ -˴ݚ栢۶غخ◁ѷ؛ܟ̎閳뽹 -۟ޏң⍷ʉɳ䣓Ŏ򡉲 -殺蟒̽ڡ՝֏ܭڝе -㈡ȦÚȗגξʛܱїŹͶ -۸ϛҍĉޫϱɲܿćѳ -ƣڎŗӴ೅˫ߋޠۅ -飡ƾԮՁ삮دłΞǁ -̞ޟþ̇枌ϥϦ؝ɗͼ֧ڜ -캽닍춻䭵ܳڸ풜֋ɭ -ա˒ѐ޿͢΍ӭҶ篈ΛꎽƎ遼ד骱ռ -Ĵ⥸ޠûʗح뽂ª -߶Šٙ՗Հ܀Ç -֏阒߫ǣ߯ѕˉׅף齁Л -ɢߦЛАЛɢުЛ􆃔Л҉ -Л􆔬Іҁ􆔁Л齁Л -ЛАކϷ荈ހ􍨡ޡߙϺ -Л􆆔ЛɢꮿޡހВ -ЛЛЧ荭ﯠހ荨ހ -荨ћ߆҉􆔁Л齁ހ荨ހ荨 -ހ܂ʼЛ􆆔ЛЛЛ -Л􆆔Л􆃔Л҉􆔁Л齁 -ЛЛАЛ􆆔Л􆃔Л‰ -荨ހ荨ހ荨Ď齁Лɢ -ЛАЛˆþׅހ荨ހ荨 -ހ􍨠ޡހ荨ћ齁Л -в􆆔Л􆃔Лɢ޺Л -Лɢ箿׌ޠހ荨ހʖםޡ -ހ荨ћʋ㏡ހ􍨡ޡ荪ћς -ހ荨ހͱހ􍨡ޡ荊 -Ɨ潍Թᚫޞׅߛ -矕ʝꟘš⽾媎ǣ󰭖ݿ齿 -Ӟ߂ -&] -[s3; &] -[s2; 4. Painting the view area&] -[s3; In order to display something inside [* TopWindow] view area, -you have to create derived class and override [* Paint] method:&] -[s3; &] -[s4; #include &] -[s4; &] -[s4; struct MyAppWindow : TopWindow `{&] -[s4; [* -|virtual void Paint(Draw`& w) `{]&] -[s4; [* -|-|w.DrawRect(GetSize(), SWhite);]&] -[s4; [* -|-|w.DrawText(20, 20, `"Hello world!`", Arial(30), Magenta);]&] -[s4; [* -|`}]&] -[s4; -|&] -[s4; -|MyAppWindow() `{&] -[s4; -|-|Title(`"My application`").Zoomable().Sizeable();&] -[s4; -|`}&] -[s4; `};&] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|MyAppWindow app;&] -[s4; -|app.SetRect(0, 0, 200, 100);&] -[s4; -|app.Run();&] -[s4; `}&] -[s3; &] -[s3;= -@@image:1040&669 -Ѐ흉Ԕ׫Nj₊ăʦ윧䥱 -ߒ֦᠘܀ѽХշ߽䴨ą̅ -Ďһ˭Щ⼵ĥҫңѡ´曄렂Ȱ -¾ГŰҩØ̩Şڛȋ鴮ˈ -ӏޓѓƀͲӛɠ縇ۀֶԯƆ炜Ĩ -ċӝԽފօŽ͐鴪ւ̙¼̋튞آဲ -ئɭۘԪͥ؊ꥩκВۤߍЧֈك -ؑ“ƘϹؽԛ£рʚ󳗀ߩџ؜ -ڬԥӘþܦܻښЕ㌘Ѕ嵁һꙍԇ팹 -ЂҘǺւȪۯ˸޳־Āļ -؛ہ폜㌡Ùǚ넝Ǖ䱓С䋶ʂʖʓ -륓飐숝߯ܚĈ„ք֭ΡǸŸθ -ժð޺ä؎ٲÐ˛з澞ԎƷϷӾЍ琢 -˳ߵϞ򺒼ɶ¼ЍȿԽ㻛 -㶶Ւͩђ뉠ݬǕ߆ -͈ߞӵڢ͕Զƕ߳ଧَܑТȿ -ߞמ⚽엝ܪйŷሏƲǟņͻɒ -ʓķ˄ႵՆ륔󌆄莿̀Ñʿ݄ -Ļޑ߇Ϻ״ǔρ·퓅Ý -ѡ߇ܯܰÓǼͩĄ̘ԅᮧ -Ԣ֜뾅쯫޽Ǖ۲ͭ喝 -Ҥ߷۞ʇޅҹԣꞫ͓͛ȯą˵ȶ -ΏŢֆ̅ǺƸ݋尽λ弟Υޯ -̡ʻ퇸ȏ볘ۘ뙝Ӥƪӥ̗߱ݳ峲 -ҳ׈ɨҫ̠ݼ㪫㼙ܟ⧺ނ -ҹӴֲ뙯Žʏٲ¿ݴЇԄӓж濾 -ՃࠅФ쑯إ٦ɱɕͳϖʦܲ٭خ邇𿳱ȯŃ̏ -њӘՋօɾዜ֟嫽è۴󲀭ѿ٥ -ūΚޘΧƢ΁Ąĭɓ߃ᖼ򛝼ߊ -ʜIJ哲Ιޣ卉ܠݼɶꔦ˙ּĔѯ -ƪݥݼͮ剒ݏֽ۠쪽ŕ -ճބDzܙē߹ǟំӗϹ͐ -áȭ򇝼٬͓Ρӳ٭颱߲䄁 -·Ԙ̍锠Ԯ̷ŹżИХś -߫Շ뛻֡ף޽Ջާո -涎⟹§ǖﲉեՏ޳ҊԏдԿԳ»ĸɼ -ȣҫʣ짺᛼̷ʼܿ驅̓҃ȧѽ -ˊʹ腨뛙᪌٣Аߚ慎߆ -֩ԢညҎв߅ӫС҉բϳ̾ -Ϳ۸ۄغۺö•̐؆׫㸿ۘ˰Ǯ -ҌöӋѿО虦驥Ǣáϻȝ֋Ɔېאʍǒ -Ք씩ǶѤ¡ƐçƢˀͭފ -մչ߱Џ߃ʍՀȢƠƵԵټǞت -Īߦǰ䙍좽Ͻž޾ȂǺ -ߩӒĂ˹ۨݺɰቋą♧蛕Ɲ -⯡֠޺ާ‡ةʎ޴ށ琺΢ -Ņ̙Ȫƕޢ̖ݩͷĚՖꫵƶ -͊хɒт֑·ыʛӗː̌Ŋ -ڤΟ뉾팚؟糆ÖćЗ؝ħ˝է -ة儕ڎَ•㺏ʙݝ򇲮Ϊ -ԉԳю޴㇓ȗ٪۶Ӗȗ֏ϐץ -ЁɴϞ޺Ȓ̥فڟ즔ȅϦ -۠ڄҗԙ¯躟όꑭӁһ -Ҏ̆ʿ۹уߴ׈˷ӨʺʣԢ֮ -ڦ닩﫿쒠ѠޗԘ諛ުΛ˶񥊗ʔ -ȭĖԂ䗾ʨҽܚݦġ -𶷉״Ͷș›̑кÄԪ -ьӢ݈𲔟ۯЎșձְۄܶđ -拺ȵŸޑ̫̌汉ݤبӬܖܺ -ꙣݒːԻݛ琉””Ѳײ©̡ɂߘ -ަְ܌ӽئöӦƸ -蕬ѳۼ܍Ƕ涡̾ԘNJꇛĽ藠̒ -Ý݊Ϻ݄΂łѾˆՓ⭫ -æ̓鮲٪灇ξ枭̕圿ʭڱ띒ͮʽ -҄ɢ¡Ŷ൉߱ʒτ㫂ք͹ -񯯚䪛󧠠Ҟٿέ膧ڹԪLJ -л܃љתۜΘ˗̼뗃ፌПÂ٬ -乊߃ƕξۋߏŏݮƞ󟹍ؿ -閟̡ΟّձꋲʐҵϯմٜÙϑ䢬؋됷 -۬һƇީ淄ؿ⯫ߓغЬ -Ǘ͝ŷѫގҔϰą뼔ᘍׇުߐŲԝ’ -ֽݝՓƥؔ򶸂‹Ϋ -٦Ł漤߃ʖߟߎݔڨʼܢè -ƽ፩›鄷›ʑ›› -ꁨļۈħ٥ݡƓވፈϑވ鼏 -ۖ壂תϳՄ›ކ䭟 -ƄџߏԿڛիҽۄİȰ姩ʼ -Ԉ޷ޘ؆֌ȩݎ𖵶ֵݭ̼뼮ǜ -—ݰ󄩂׆ᴃÍƙ쳭Ӏ͜㷣̖ -ẠÜّᆽȂ酋ҩܟΗǙ³ʳպۨ⾗˛׺ -Έțךĥ٨͙쾃˷֑ -͢εދ̜첝ń˞׮ޘ¼ -œԄ迤⯙ބƍ녓Ңڰ؃ӂΑͰ -͢߁怄Ӂɵӆӯ΁śݬ흩ͰГ -ꖚ䱜ؽΌꆱʃ -Ę싚΅ɷڄهڻțʎ -ό卽͐ޘՉϪḁȁݶր• -ּݰáƭ⿏甾ﵲ錊Ɍ -磖 چȃ෢͑ވፈϑވፈϑވϑވΔፈϑ޻ፈ -ħӄ͖ΑވΔፈϑޟ› -ӄ̢طᧈ››ҿɞʐ›ˢ -ވፈčፈӑ߃Ј翞ú -Ȭ›ƍ̪ħħԼϑᓍ񙐣维ԓ -뇭ݹĿڦ۰ާӾʜƵѻܡѵڪ -ۨЅ㉮ԅ寸뭻ɩߣް͉ -ͬ -&] -[s3;= &] -[s2; 5. Reacting to input events&] -[s3; In order to react to user actions like mouse clicks or keyboard -events, you have to override appropriate virtual methods. To -issue the repainting of view area, use the [* Refresh] method.&] -[s4; #include &] -[s4; &] -[s4; struct MyAppWindow : TopWindow `{&] -[s4; -|Point p;&] -[s4; -|String text;&] -[s4; -|&] -[s4; [* -|virtual void LeftDown(Point pos, dword flags) `{]&] -[s4; [* -|-|p `= pos;]&] -[s4; [* -|-|Refresh();]&] -[s4; [* -|`}]&] -[s4;* &] -[s4; [* -|virtual void MouseMove(Point pos, dword flags) `{]&] -[s4; [* -|-|text `= Format(`"`[%d:%d`]`", pos.x, pos.y);]&] -[s4; [* -|-|Refresh();]&] -[s4; [* -|`}]&] -[s4; &] -[s4; -|virtual void Paint(Draw`& w) `{&] -[s4; -|-|w.DrawRect(GetSize(), SWhite);&] -[s4; -|-|w.DrawText(p.x, p.y, text, Arial(20), Magenta);&] -[s4; -|`}&] -[s4; &] -[s4; -|MyAppWindow() `{&] -[s4; -|-|Title(`"My application`").Zoomable().Sizeable();&] -[s4; -|-|p.x `= p.y `= 0;&] -[s4; -|`}&] -[s4; `};&] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|MyAppWindow app;&] -[s4; -|app.Run();&] -[s4; `}&] -[s3; &] -[s3;= -@@image:1800&880 -Ђǜ݋ߝ񓄐܅בРĂۀܕѵؖ -֞ުېŃ̒撶晜̏׼̙榢̢ -٨ԙס촗˭ʮįת̌䜧Ɣƺ߂ -úۓыӡ;ڒ˚ܫȃˣђԉΏЭ -ɍ‚⨧ڠŧߨͨ都ĕŧڕӦպ -ꥃꀝ𪩊ЉΫŚʚ߭ꁰԣ㦪 -亣ŬٰߒՄ²΄㞎Ťʬ -տ̺ݪ՚ȋ򳫦߈ԺɅᢻѷݲˆ -ԗƝܱןƀʇ -مثۄšʈԛէ⪒ŕ٨ӰԻЙǕճԮߘ -ר̛ՒٴˆԡťԔ񞹒Ŏܚݰ -ߡƯ߆ꛅݱꆓþ܏Ɛ濌ǹϕϥ܃ܣ -ָǭٯϠ󲿪ǖͬʈ󤍺 -󆘔̚뤒֝ɸ꿓٭睺ྡŇ -Ťŋ޿̛ڞ޿缮ϴǼ -ߟ²نߊŵݎȑ֫ݘٺɺŏ -”ؾҳڛڷ̻獘Ǯ굔ϯ -ۼκ綽ͶʗՅԟꪠޤ晹ҽǜԤ -ԯѧלťҋȟՕ╳ȘɃ﨨 -ͣϪ׭櫿궣޿ڎ٪֖ӕڧ߁驍 -¨ϼү՛ϼԦʞο׿疴 -ӎۼ҇ղْɂʟɎكӞշ -͇؋Żöݣ͗ˆߦꂞ -ܥ婏뙳ҭԲ׷홪ů߲׼ދ꽅ĸ񅪶ѧ -ן䥰Ǖ޳홃ǖطԾߡƏӍ -ɶljݙ柛З缕ۻή֝ςƻ󽝖ퟡ -㖓ێؠˆ‚􇼙ؖŮݽ -ٯԐƈܧǶ۽匭Ŕ͹峸Üߨ -Ӈԩ뷿Njټ힁ɖן҈ -ټֻӟҥɛӟƿ˿ڳ̞ҝ߼㾓ƴѯ當߈ -־ʣȝӲݿǖΎѹжȟϼɽ픛Ͱ -ȯڨ׫§໕돞毖槬࿨ꉗʕ̈ͺˆ -G登ʳҝދݽᄅ즻з㨫 -ߨ޵Ҽξәɂٗ씨׵ܷܠǹǷݷΦ׭ -󩨸ӯپ׎͎ژ厵ܶ -߰򗿶ˑޯյԷΈԐ읽ɟ۹ -⃞׹闯㢚Ϗκֶ쇁ԭك닗 -ʪڲձŊξҗҷ㻻ܖ냔ŕ̨Üㅯ -嬪מּݕ폛Şݪޥͺǝ -䕯ҋ̟߻󭏘葻ԡ -ˆ͜ȃݓˆص᫽ֺչۡㆧƭƈ՚ -ѷւ𪮞ܜْӿ揵ˆގݝܧί߰ -ƍݪؕΙϭʾڇߋڠկ -Ԝɧ睳Է돾㧼ѻꋾެԋ򈍁͖ -ħʅˆԪ뛕ͩڃᵎ좾 -Қ֚˞ՆLJȭ篾˾ -ۯϗՍ렣ԬÞػ܃Ƭ޻ -˽ڭܟ꜖㫛ݚʾױړ˦ص -ҩ⻢Ǚﶍ˗ꛝᓎ -鼓φԧ꺼Ƀ͆潯ݴѻځ“񳡉 -񊐠ר뽪ԄۺС -ԭɼϺŜܲލ΁Ԙ—ΊǷַɏ -ؚ׎߸ʷݷٳ㆏ͺԆ -ߺݬžگ꽽﷩ƼҶΪᑐLjļ -Քꉆв錱嘐šԻީ剮ݓݷޟǫŽۯͶգ -ƙψیȎܟ״΅飜Պחķ쫜 -ʙ׷Թøѝ˶ӞϫݣϏ䝻ʨ۩ծ -̦Ͻ׳׆箎ډҭӛΜٸث񶞴疜 -ߪĄΘ󚽊蛤ˆ֨٣ݣָ܎ަʻ -׮ɽㄊꖭ㤇ȟѿވݟ֔הڹƪ -ۭѱߎܷ㌽ǫзŔۏͭ֗ꨭ -❞żۂʕ۟وߞ֫ -迄䰏ԫߛNj˭ڤݵƵ뼣 -ݗﺦ뗕߽ݮȆ镵ڜ򤍎񤍮ʝ -ٔ螘ՊٚԵ߸߸ԾתӎƤ -ώ͗љ躠Ȳ羣Ȥ¢ثԚӐ佡֓Žȣ߳ -릝ɝݱݱ߱ܽॻ摒ʯȝͬŕ -˷Éх̎ӭȑ쾪Ώؒ߶ţИŭ̸ -ۡ免ד³痜˖ׇٟǛ -ߠ򏜵ݜ̓˺ŧůݎڤ΅ -Ը΀LJ͛ڭǸ֎鑭 -Ԭ߰ڍôԎݷϴ꛺ٟǴ߫杯Ε -ɇͺ켮ڨͮџ -DZɜݷڵݣݳޱٷվ߽ۗ -׆̄Էڽط֑ѾٸՈҳɞ׎ -娝׌華ѳџڝЏĝ󎩻ȸϻ -ϵͷ鹣썞֍ӎᮣ -胝³㞬ɕ喐ٵΩֻϵƢ -眣ߨ޹󷂙܁Ι󏞔‚Ȭ -ݦӽ֌飕ҬؙᄾЧ섥ʑǤĊӵ -ߟǖŠȵȣեÎ˫٣׹Ի٬ -֑̝҉餬ΊެޡɚҚ -߀蛀ȣ􍀌ѷԆӷǿ -з߀蛀雀ѷ -蛀ȣ􍀀ѷԷ蛀ƇŐ߀ -蛀ȣ􍀀Ơѷ߀蛀 -ѷŀ߀߄߀􍀀ѷ߀ -蛀ȣ􍀨怀Ձзŀ߀耛 -ȣ􍀀㍾뛹􍀀ѷŐ߀ -蛀ȣ􍀀ڠ߰߷зߘ蛀ȣ -􍀀ѷހ×􍀀㍾Ѩ߀蛀 -ȣߟ߀ѷŐ߀ҁ蛀ȣ -􍀀Ԡ最ѷŐ߀ҁ蛀ȣ􍀀Ơѷ -􍀀ѷ߀蛀ȫ -·Ѓ蛀ȣ􍀌ѷߘ蛀ȣ -􍀀ѷŐ߀ҁ蛀ȣ􍀀Ơѷ߀ -蛀ѷŀ߀耛ȣ􍀀 -㍾Ѩ߀ƀ蛀μ֪ǮқۼҶҭ -΄ݴㆾςʠȈՍԚٕǕþ߀ -߳їιڷѩ氈٘Лԝ͌ȃ -ǡꏾ׮쫯԰ͭلܫվԺ -׆ľ䡟׾Ť˕ܵٶϗ􍀼ف˛էդψ -؇ݠɦ蛀Π꒷󄣰ނ -蛨կ۪ؓ҃գԸۺӷ􍀐擷 -׺ܥմ꽔οۼ谐ѐЃ߸õ -נ𳩻Őȉ灪ܼþ쐛ٞ -԰зȿ귟݃ߟ׵親зȾ -茠ԍ׶зͿ߷˂߀ߘ -Ũߟ犂􍀀Ϝ􍀀ѷŐ߀ -蛀ȣȣ􍀀Ơѷ߀蛀 -꿍зŐ߀ҁ蛀ȣ􍀀Ơ -ѷ߀蛀ȣ􍀌ѷߘ蛀 -雀ȣ􍀀Ơѷ߀蛀և􍀀 -ѷŐ߀ҁ蛀ȣ􍀀Ơ -߀蛀ȣ􍀀ѷꀐԷ蛀龑􍀀 -蛀ȣ􍀀Ơѷ߀܀҂玀Ӏ -߀蛀ȣ􍀀ѷ՗雀ȣ -􍀌ѷߘ蛀ȋߛ߀蛀 -ȣ􍘀ƀѷƱ߀ѷ -ŀ߀耛ȫڷʑуˆ򡄄ƕތܓ誻ӏ -֧귚ԫ굓îߍ;䀽 -֯ꗾŪº۫۶׷߽杬ߏݏ龃 -˘îڋᆝ߸Ɉ☴ -&] -[s3; &] -[s2; 6. Multiple main windows&] -[s3; If you application uses multiple top`-level peer windows, you -cannot use the [* Run] method as it runs the modal loop for the -window. Instead, you have to allocate top`-level windows on the -heap and use [* Ctrl`::EventLoop] `- this event loop runs as long -as there are any top`-level windows opened. Use `"[* delete this]`" -in overridden [* Close] method to close and deallocate the main -window.&] -[s3; &] -[s4; #include &] -[s4; &] -[s4; struct MyAppWindow : TopWindow `{&] -[s4; -|virtual void Close() `{&] -[s4; -|-|delete this;&] -[s4; -|`}&] -[s4; &] -[s4; -|virtual void LeftDown(Point pos, dword flags) `{&] -[s4; [* -|-|(new MyAppWindow)`->OpenMain();]&] -[s4; -|`}&] -[s4; &] -[s4; -|virtual void Paint(Draw`& w) `{&] -[s4; -|-|w.DrawRect(GetSize(), SWhite);&] -[s4; -|-|w.DrawText(0, 0, `"Click the view area to open next window!`", -Arial(20));&] -[s4; -|`}&] -[s4; &] -[s4; -|MyAppWindow() `{&] -[s4; -|-|Title(`"My multiwindowed application`").Zoomable().Sizeable();&] -[s4; -|`}&] -[s4; `};&] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; [* -|(new MyAppWindow)`->OpenMain();]&] -[s4; [* -|Ctrl`::EventLoop();]&] -[s4; `}&] -[s3; &] -[s3;= -@@image:2609&1714 -ׁ־ˆϙ񯳲긺ꨈȾ·¾ȏɺ -Бࢺܪݝݺթ뗞ݺڥĢȤĢ -Ģ䤒Ģ☟ӳϺݐҳݵ赬能Ҿɤۉ䓐ܗ᳏ -³ҫȱɾվꜰʤŐȤ㒥ӫĈ㴦̸ޥݞ -ۣ܌цҐʀ˶ې𷝰̐׸ʆʻƀĭާ -ص¡۩ՔЩלȤ귗ߊĩᓏΜ -ꐱ悥Ȣԩ؀҈ȕޅ߮ށǢÝ՚ĂƒחҽȌˆ -ݰ䅗ِ脥ӈ؊͐ţвҮ܊ž՛˨ -쨁ڋ٢ȉʺº҆Ş֗ݓ⫖҇ɤͭ -ݶÑčΣǺ伎б܊Ɩýَւێ -ѣ۳›߭Ҝ±܋םԎЗ硰ٙܶߡ̾ڴѭ -ް˸ƿօԶ±ڇيƼꏜԔʬ -ّˁ陡˲烒ǣꭟܬҷ溄ځ将 -ۄˆ⡄ɚſ˃ӑݡ쭩ɛ擱ذ옗 -׹־ʿߓɜ兠ݾٮԝ۲ꓷۤ۠ޗޝ -•񟜶ĝڗ߱Թߡܟ -ѿƤЈН̺ټڼݤ䑊ܔጠےͳЬؐό -î޾ܣ˵Π髮̦䚬 -ꨘ勽ÁԾߩΫϩҧ䳬Ӿ -Нțʐǿ˴ʘȴ̋ѝʉクæ -⢐ݱնЅ훺荺ѼхЮ -ߑ珜ٽ寖֧ҙѻƈ͐ڧ͒ғ -ٱԵʤ҄޵ܿ¥∏썶ўƧԡƗзސφɋ͊؝ -ȿܱ߯̀ԅ¬ǎժՇû -߻ǿʅ鷻юߣ蔗ܓ̡̬讀۷ -ǛĚЀ̶ՊĒ鸻Ҷ Ȋزϯ -𶃨ì˞𮼵Сب䍗ŠΧ -˴šϜïуׇ֒Ԃ̾ΈЗ󒌁ɠӂӼָư -㘬Ơј҅޾ʦ꠲Շ۳֟̀Ŭܦ -ĭ饆ܕȼɐᳺ䍆LJ쎤 -뜙̚嘤̈춍ѰŚԫ⧼ -ط뛡ګ̦΅񙰂áӇIJ֡Շ۸ -ƌѦᒣɫȄíڅچĤȴȿۢŽ֢ -ۓ̕䛄ʝ¯ޮنӛա -תɻ䑨ϰث㤍ڸ¸̸ܸİϓˆ -킦Ҷݖݛ哗Ӌԡ؝Š˄ٟ -ՙîܵɊݘܥ -ϏغЪڴ兡Рᚤѥ嗢ڸŴ҄ò -ѽѸ޸θ뜜㜐횗倚霕 騉նۡƲ١˲̎ݔ -ޭɃ痧խ殌噓ጐȬ򁔙Ѥ -˹Їߙ˧š򠟾Ꜷ﨧ځ͓ݩ֑ -ޡҊҴɽ乘쥙ȱܒͳ͓Ӹ -ڴҴҲׇܸشވ앀׎ؗ頔ퟟ훫겼 -黼焃Ȕ⦆чٸƪч -઺䤑¯ɺꡆ檷Ǣ݁Ђᨏفܵо態Ȟ -㿼㞓螟ؼ욝䚑蚒򍳿ӚĘǾããˍʆޟƦ -ӯʎޥԡIJǿǷۧ鷰ؾճ -؂ך杒ҍʭîὤĈ·͋邒 -󛤵߹ᕡҍԢ﨣㋫䚬 -힠隒ޖռɊƲʒ҈чफٝ -ӹߵΫ笂˯譇ԠѲïܸȅ -갽Ӳ䑑͇ֈɋꪪԁލ -ѵѿԁɋ۴¯אʮŹΥȞݝ -ពߵƽŶ̪ɬ߽۽Ѥӟț毮ҵѭ -ϫ嚝łҎ׳ǽč판Ձ֐ѝ쪃ű۫ -֙ڪ̳ˏ̤ˤךΎ۾ƒ -ԁӬĿ枻ʪѰċҤܾ -†״ð׶ѳ器ĵՓճȨʵâߏ -˷ƗޞɷĂ䪗Ʈٟ΂ҽ맇ƑԠ -ѝ쪃Ѹەχ͕̈߰ﲲĜ׽ο -룎ǨԵ̔왩ӪѤ̩ܳͰꉁ࿚ -̡ɺ𥖁¼폎ޭў൳ч䠢ԇ -ȣ̤ͧ嘙ƨԷȤˉ̴՚Ǜ֦̬ -صᇠᯗՙڕᩲɹ -󃴹˻憯ՇՅꐷĚƮ՗ϯȎ -޺ꅢ݆ݶ΀ӶӶӠӱŠʁɝ -ܔdz߻מҮɻ쎈ۓ㟽׳ԻώŻ㕏Ƣԁ׎ -׎싀ӇĶ׃ÃϏࢨ၅À -‰쳵ȪƪՆʵگׯЬԾ÷̋ -цǿޯޭ瞊ՁޕʣҐӢ߳ʃƹ -ʓͼն֊حퟨǯήθ˫ۭ -⁋Ģ۝򶴑ǫ݊ʸϜմĒˋɿě߆ -݉ꬷ؄仒͌юˮߊ -ҋˋ쇾Ү栺ëա -֩Ԑز始ȷ䐵䊋݈ͭ崗ڸ޴ßͥÏ -Ǣ򨎝ϑНڡ·٦͒ߴӳۂ쨺Н -਺ʶĿܬԤ̈́Āڭ땻ʵ -ꉑڑڑօŐ坶劙֙ŽٓӉ֊ސ͕쏔퀔 -䜯ّԊ畳쯘Ш炣嚃짫ғ׹ -ԝѐ͒ĉǝͳǡ꼐ś쳽蠕虞҈ -؏޻ݴ͊獒՞ԽݑќȽ -ԝԑٚ兹̾ؾܣ -غڋҶŃʜݳϛɓƕŰۅǮܸڰ -ۮ˝҃ˮĖś؞ׇɻ˜҄ϟ -ۖ촊ۈפݺˋք⩜҂Ֆȏ -ҷۻ׍낮䧇͕Ŏдҥ -Ŋ矯٩߅ﳀиɰҝ͊DžНՇЈ -ػŗׁ䬵Ѣぞ̳ɨ̝ÖڒˡᮼނҨع㓿灅 -ܼ욡¡̶˳؞ԇՁΆב̞ߺ -ÝŃᅋ蒁҂͵ٙ̇ڜݟѫٞݨ -ݟ좫蚔⢀؀ڞĦ -᷊ѡ̍ϳ陰ȝܼݖ˳ڲНƦ -筙否ײ캅艍֟ЍDzՒǴ׬ -턾疘NjЙŽֿΒ -ॗӭɬ춤܊읣ѭ̥ң۩ܫܡƇ֟҇ȹó -͏لԐů鰗ƥԽӇ˩Ϥʓ -҃ڦÑ޵ȁб٬ҟ鳄只 -輳Ϸ阕಄ڝ͓䐄ȝ -邐ˢǑƥȬƱ춐ߺĈҼΊӼӯα -ƀבڌĢѲʒĄƣȫ䆋ѻƠ -ɏۊɐӈįߣԁŔ֍Ű֐ʵǯ -ԊҕӚؤȀ匚͗܊蓌ݞ̈Ȑ󑁒Ԭ -ͤ҂ŗ’ܢˊ٩̆ʋˋЌ˽呿 -ɀ֓ш쯫붗ɓ𘠻ƒʖʠ˖ς -ij፱Յ˃ׇˁ⤔릖ۭ瑄 -׬򋞇ր蘰廮箿ƣߓ󑬇ޣ雮ߤÄ -ӝЗ粓ܶǿա̾馵ϴѭɰް˸ƿ -֏ԄږيƬʸԔʬّ˷陡β -ꭟܬӳߝ΃퀁߬򃂭տФҟé -̹֔Ŕۼ͔ɘƘʘγ̶Կωȍߴ· -򂐌䮫߽ڗꎜى۲ůүΊߑק͚샆 -ؖхחީݻџ뮓Έԡժ -ǫӍ̋̑덋ˍˍ醟ѕdžՇ -ݷݓ瓛Ɏۜݬ٤Ȋܓ޿䷇Ǥύ -זӪӪӽ˂߾ڌȟѝߔԇ斣䅩ƈ֙ -ȠڽִاŸ睯݌󮸈ق -ᰭŀھԽɻуЇ腺ΟϾϑ -Ο잂᪃󣕣ӌΛٕϚ㌳㍳ -˃őӈФҤЕ˲ȃӳϷ -⎅Ӓمφٲۥǐ㈭씷ڠ -ׁ팡ٍԹÔͳ܌أŚ -LJ٦䄪ŭɅÿΜȃʍˍ¶Ρ -썋م‘ߚžۋѬյݧ֐ݧю -ÞԸ֖訅Ɛݟ̔朥ݴٱ¸ȗ -ѧն؍͢Ɨאۻڔ౳ܘ靛׻ͫ¤ -ܴ䃐蒈숸ȌζׇǶٵٲ -ɜ휚嘩̈⊍춍Ѡԫ䧼طګ -̦܁΅á߅Ƭ‚Вłܵϣݕɿ¾ -蓹߲韨âߡ뢞ъúʿ -극²Žќ潡ו殢܋鍻홫ٴѫȲ -؂괆Ƹ휀ᜓ朝昛鄢傑تĨ١˳ -޵哗Ӌԡ؝ŏ˄̟×ՙф -îŎ͢Ɋ蚚𪃨ݘܥؘЪڴ -兡Рᚃꍊ嗢ɽڸŕՄòѽѸ޸θ͒뜜㜐 -嚓需ᚕ騉նƲ١ײ׎ݔޝŴί -睫ۘܘ˳愘⚱䢂ȃĬʫˠΡϖ -ľ䒯ߴؚئҺ̑‹ʃ -ȃٳ϶楘Ǜͮѫњȵϯ -鄨تफ豐솢ڡۿܷѭԀ֑ψ̘ -҇ٸƪׇ쮥ġ¯ -ɏǢ݁ЂߨفаȞΏ㞓螟ؼ -욝䚑蚒򍳏ӚĘããƕȆڰӯʎޛ -ԡIJǿǷۧʷؾ䲋񒬁ީ -۫邷⻤ΖÂ̈́ڦ٦ߴ݆˯ɿ¾˔ʤ֑ -Ӧɟíݞ̻垙잿ͰՍњ֍ -ꞷؤżټټ֑̌۳ȝʜʷ -؄Ƣ߂ۏʀŠ𠒿ܰˢŽᒼϿÏʜנ -ײʓ䨙ң㴓ЇǏՐ쫷DžЅ -Ѵ勽ʰګ獹՜갱ʥ -誷僘ŕҫݗ׽Ԕބ쪦Ԫʹ -ʜ܈˴ɬ״ǫ焀Ǝϸԝԫ㊉祐Е -Ļևܓڦ۹ĵè -觡ǡҝҹߡӴȡА٧魡򅞓Ǣ -ߥçصƝܚӪݒǧ֏݅Ӈ¨Ĉ胣پͪ -ьѫԏޟߧӃ奼ቅՁ܇ -Ǜ÷ȷطٙې㎑ާӘϚØꩉճ -ժʮҽꉬƦՌʨݽǯ؀ՃɗþĢ -ˍؼ󬖬㞼ưݎ܄ࡘᯑɘ咑 -Ӳ̣閽ׇٞә̮Ԅת㓫ƦԍӮ -ͯ̿—䟷Л⩮򩮢׷γ -ՠޣᎂްۖٙ˯ʄϴׄ˧ԇ񃯟Ɣє -הɏ쩛չƆ雯ݕ -򮠤ǫ¶񊇣뇇ՁؗѦ̠ -򅰒εЀĞÂȖdž -껑ԝ盎ԸôԚѫڸγㅭ -ʝƦᩦ銂ՈהТһ鶌љ˿ז޳ijվ -ە昻ʌǍʷљʒ⺨ޅ֚ݪװ㋧ߪ߹ -Óեːϩቱ磖܈ۼ㽅ڿâ -ӽБĢۉلӐ܄ͥѝȺǩøݞӈ -ȹ෈ȝӁŁԇĄʏĖՖ -ɠ꺕ڍ˺ߏ輽ԇͥÏ򨎝ϲ -НкѺ󠇝󘪃НꚂȠ՚ -غՁ鵥ةȲŠڭվ轋ݏԵȂʈ§⟶ۜ -̔ҭڴ鄺Ɂ䫯Ȕݎ٬ꅾź -Ԃ论톸ӕԞ҉џ۹Դִ -엖ʫ蚅ၬڤɟըī鳧ڝꢁ -ԡ쪏ϳݍͱꈱӊ򳛅ώż՘ρ -鄦ˋЅɏǺ״˴ؓӘϤ -Ŭ±҆ι޻්ށΡ̈́ݗԺܷ -܊݊ϣ񳿴ǸƗݶ•Ҧ룱Ϋ -㱴Ũ֬ʙۅʳ̷ǧ܎ż -ԇδ쩫櫼ȵ׷ӃǮ庨ިʝ•梅 -䜗ՏΤоӃݜ퐁ͻ縣ֽẀ -УÖ驙؂ׇݼָ̕ǫ֊叫ᬠǓͳ惃 -Ҹ́ؼΣ爅ĀꨀᏚ -܈釪ΨϛهǦ⟟ -«蔼н̑偽誖艨ꇆϒޕѸ욵⫢ح -ۑްچΓ៞ȇϷŏ컶۞ԇț٠ -ƦԾϓ戞ш㍪ωΓӥٴђΔҞˮ -󴀝˭怪ʵ宯ڹ˕â -ƭ޹’ޢ榈ΐʽβ˫Ә˷Ώ -ǿܣԂͺҳč̂ξػ򚖤ڦÏ󐩽 -Ų楘֊٫قӻδ۴ -̊ټ筃Н߁ÁԇėՁꄪˀꋀ誠 -ՁѥНꩀ΀ԇЍհǞҥɂܵϿͶ -ճ̀쒼鿷䒕ӍŸ -񓄏˛݋䴪ΚاȠɈ -ʗˈɁ⅟ĢĜך٫͌ʩ×ۂ -׽‰ʥе產ԡȎҴ̚Ӆ -džŭεƵΕɦ넥ȁάڍկՠĝƝ -ͯȕɌבȤ흹޳ᤨӺТ޲ȵܿ -ԇ鞻ʁդЬʣǂԈЂ -տւ񫪃ŨЀ۰țί뮨̈ۍߺٲ -‰ŕيŢϜޓЀùѫ䧐 -̰҆ꇫޏڈóퟣҀґ -Ę妏齦֮枫۲扢ـԝĿѝ -ϣĬӕԜҏİքչƍֵް -촆맧ջׯڣǣ庒ڌ٘ޖ㽍 -账˦Ѻꘪݰۈᝑǖޙ -хȼپաٛד՚úԽʈ -餶ְôꇅ׽퉹ǐęʻڜ -᳌Ն̨݌Х鯖Ͽȃꠌá翴 -ۃϾ򦇬յر̟ߺᆞƍ˛ð -ۿӷîÿ݌ش˂̉ -Ѽߚ󅣟ܛȋԝ߇ꅠϾ呜Ο -잂Ձ鉱¬䖛í҃ܿގɟ󾟵 -ǟꔨЈ褶Ҥի班ڳނ喼ص -ƸԇǠӡ˞ա̏«ǚ -ǚޮ$̷ًԾϯᵧ -؃ȓªȇðʧ˧ؼݼƹ҇ુ -Ã๿ԴĠ÷ÏǿǮάƋ̭ -у㎎մ䏣̕ޫȿƒ̯߽ -ᵧ˟ⷺ뉍ÅǴ㜗ሟʗϝԾԗؿ㗺ٲƼ -ΒӸ޺©뢇公ҫďô -쫄ΨǏǪٳ˛܃ʳҚƷԏߖ -ճև沄⾣碙Ǽ֧ -ﳨ҇ɝȏ̳Ȩߜ꒩밉ڙɶ -Džަՠ֢ȷҐڌԓƃ؇进ִ -ۜɲ٦ǼЫչۜˑݜ˜ލҿìٵ -սѮ߽ǝӔ£켕ØȔհ蠚얾 -Ɩ񏖍߯ߧԁꠀ߮喅ɡ˶ݰ -ʣ㗽ƟǿȂݖۄ烷͆ڥը -ʐɑȕȄߛڤ؁ّʾ⪤ǧĝȄ -פӪڗÝкޒ׉뼻鐆ݥĕ -걃øĚœ“ -Ľޑ脙閿ٴӌӪ▌ӕ׸ߪƼԺ -ƼȿՏˇػܓꠇ˶嗺˹﷫䇒ȞŦ -ˋٶؿЮ̀ϺѤ؆׮ -߾ឭց۟ռˬٱتǶݫ۾؃̠ -Ԏߺ⋿ˑݟ󩝕ݷä톉ãԿ釰Ú -럘ۧ۴Έ앛㏠ʧױɔġ¥ƖܿʱԎ -ߍީսڲLj̒ϖԬσ⺡䥑 -чÃ܈ŊƵڥگʻ֞ğˎづȚ徰 -Ǯ̋КíѮݹӄֿԍп -޵៴ᄾ昁⣓Ɠʟ뮚 -ؾȊϔ㪀ԇǘךѨħ -ϼĻƊܿɛʳξˋد힏̗ٲ -ؕњߴͭˈݖЭ𨺱Ė͇㑷 -ހ޽ȷظ῱ֿ샳˫ӥݯߓ -ׯܳٲؘλ߶Š򊨃Ғޓ -ѢꎷЛȷʖد -ɷۀ٘́ޅЅڗжؘô¯ -א܋ˑݟՍ᷷ӳ -阞ӿӁ⣰Ğҩޱ뵈֌ -߿ƆݦᅎНՇ·ëͩįŝǠ -Đ綪֠ۛݹ꒏懦ƻ -񓭂׾ՙ˱ӯʫٗ򓵫߻ǾƋ -íڐܾˆ״ʲ拊鍶κߎܶ۹ -ݾ𠛑ݪ䠸㟩ݑХܞҴ -𻪆װՇ˲Μזգ䶑ŝ硙 -뿪̢镒熞腿䟳МҷۇϽӢ -Ʀ聯ٻء㯫΢׏ϒɎѲô㧻 -˗ؐ􊖖Ǣݟ㴽ތ› -븿ٞꗣŅ׫㗦۶׾ -̸񡏣ۿׯ㷐ۗꠀן򙺀֟ԧۂ -Ҍ̿DZܾɒϘԿו곾מ -⃯Ϳݪؘዐո聋ݸ󥓞 -򗇪α˽λϣԠʒ׏Ņʂ -ǣѝÊߞϸϐ㳘ٵ繞ή -ݳڿՍ桱䴶Ûϕտĉڟݒ۩ -휙糯݀ݿϟڱԇՌאİС -쯭ݫݍެꓓ񚟆Î탿 -׎꨺߃ϻ߿ -ƽɾՇŝʘ׉ɢ֪Ӈʺ躃 -୞Ԃϲȑϳσ뎛ׂ -򟺷ҫҰȟӒӣ֝׿Эʽꃡ̤ՒՀͤԣ -Ϻ쐑賠ۆܢײ䲡껏 -Бൿ֟Ǣ‡չڨàÓҽ΄ނ -ޤϬЩϿ׻ėф¨սȻȁՁН -Άԇޞ߭ҩ˖ҋ䐵݊խ݈崯ڲޜć -ʂ⧨ѐìǃՁԇ×Ŭ릉 -ٝ㨎ԡߑȃ︸Ы֊񨎷ÎН͉҇֊Ғ -т֫Լ轋ʒݏ׵Ȃ§붲ۜ̔ڴӇ鄺Ɂ -Ȕݎ٬ꅾʄź̔Ԃ̮ -ӕԞ҉џ׻۹˳ߝĦƘْ̳ƆЄӸ -ڇ蓂աՓꭂĊӃʚ១͞ζ׮ّѲϕӅ戺ý -Ϡ˫ԬӈDŽ퇶씼ᘽϧӏ貉˪˃ -هݼЉ陏ۊА礄ˋ׶끵ѿږЂড়֮ү -Ҩȕ̐玭ϢϭӘׇۣ -ɻ˜҄ϓۖϛ촊ۈשݺ֏˪ք⋩ -҂Ֆȏҷ݊̎ۻϞٴ -ݮ䧇͕кҥހŊ矯٩ɾ߅иɹ -ȡ͊뇦ເН҇郈ު܇܄ďȲ -뉯ۊ۹ʡ܅醑݊뇦 -Н҇ޛѫ㄂˴΂Ġ˘Ȭ -申鶎ǭߞۖãù٣Ω餎ﻰǮ֊ -㈀œ֞۱Ħԇ᷊ϳ -険񓱅ȝݖ˳ڲ҇Ʀ狭숯ڼ׈œ -ē񬛱幡яત牁ͮٹރϬ펖؈Δ -әюݴԝΒܥǭɬꤺ܊쑝ѭ -۩ܫܡ󇽑֟҇ȹ鋎͛لů鰪ƥ -ɽ٨іӎϒ̟ɝÐِ˛ތäڵ̇ -͑ٲ筰箉áΦɝӰ籩޸ -㟷֎ǐЖᯨʀН݈ԇԺН -݂ԇėՁـԇ𶠺ՂНΆԇ -烁НۄՁ΄܆ꠀԈ𪶠ՁН -ΆԇಓꯨΆԇ烪НՁ -ـԇ𶠺Ά﴾Ѫԇ𶠺Ձ -ΆԇᜪʕՁНꀔΆԇ -烪؝յ΄Ђ𶠺ՁНꀔΆ -ԇȈ烪偪𶠺ՁМΆԇ -ĄՠՁНΆԇ烪Н -ՁᛪНՁـԈ𪶠ՁН -чНΆԇ烪НՁـԇ -ɝүҨĐա§Ձևðԇٴڝƹꂒ -ЅĐ΀НՁ˨ɏԇĄ򒪃²ՂН -€ΆԈ舧НՁ˨ɀ堥ԇ򒪃 -𲠺ՁНꩀΆԇНՁ񨎈ɀ -ԇ䰨ÅՃ€ΆԈ舧НՁ˨ɀ堥ԇ -򒪃‚݇ϴ󒪤𲠺ՁНΆԇ -НՁ߆ꀔ܀Πԇ×НݓՁ˨ɀ -ԇ򒉪ΆԇНՁ˨ -ԇꅐՁޛ𗞨܈ГաՁ -ΆԇНŠȁ -ҠŝʀȁҠк -ʅȁ籂՝ʁħՁՁНЀŠԇ -ՁӝԞ׺ННŠԇԇՁՁЩНՁ -Š΅ѝԈȟҠԐ󨎈ք‰ -΢ՃīăʁՁННŠԇ؇ʁՁԇߢ -ԇՁՁНЀŠԇՁՁÎрԇԇ -ՁՁЀНԇñĢߎ -畩킒הͱс힃ϱۇح -ˆٷ榞𛝶þҞց̀ -ϛНȚҹĢȤĢȤĢȤĢȤĢș -&] -[s3; &] -[s2; 7. Menu&] -[s3; Content of menu in U`+`+ is represented by the function or method -adding required menu items to the [* Bar]. Items can contain [^topic`:`/`/Core`/src`/Callbacks`$en`-us^ C -allbacks] to actions invoked by choosing the menu item or [^topic`:`/`/Core`/src`/Callbacks`$en`-us^ C -allbacks] to sub`-menus. Menu itself is managed by [* MenuBar]. -[* MenuBar] can act both as widget or as a [*/^topic`:`/`/CtrlCore`/srcdoc`/AboutFrames`$en`-us^ F -rame]. Frames are placed to the window border and reduce its -view area.&] -[s3; &] -[s4; #include &] -[s4; &] -[s4; struct MyAppWindow : TopWindow `{&] -[s4; [* -|MenuBar menu;]&] -[s4; &] -[s4; -|void Exit() `{&] -[s4; -|-|if(PromptOKCancel(`"Exit MyApp?`"))&] -[s4; -|-|-|Break();&] -[s4; -|`}&] -[s4; -|&] -[s4; [* -|void SubMenu(Bar`& bar) `{]&] -[s4; [* -|-|bar.Add(`"Exit`", THISBACK(Exit));]&] -[s4; [* -|`}]&] -[s4; [* -|]&] -[s4; [* -|void MainMenu(Bar`& bar) `{]&] -[s4; [* -|-|bar.Add(`"Menu`", THISBACK(SubMenu));]&] -[s4; [* -|`}]&] -[s4;* &] -[s4; [* -|typedef MyAppWindow CLASSNAME;]&] -[s4; &] -[s4; -|MyAppWindow() `{&] -[s4; -|-|Title(`"My application with menu`").Sizeable();&] -[s4; [* -|-|AddFrame(menu);]&] -[s4; [* -|-|menu.Set(THISBACK(MainMenu));]&] -[s4; -|`}&] -[s4; `};&] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|MyAppWindow app;&] -[s4; -|app.Run();&] -[s4; `}&] -[s3; &] -[s3;= -@@image:1240&949 -흉Ԕdz쳠߶ŎԂùżΏᬯ׫ -ݥǒ္칔π߿ꢻӭʼn±駮 -ݥīйˬ㦦麒ʩФ靏⨪ИÀܨ -쀁ی̿㹴֋ڿψ֡냒ԭ -іԯÇĀ΂ժĭ -͹ͅع梋殩λոԤȏӢǎ -Ǖɯͭ˻ϻ…ʅϙၘ֋ȅ⼷Є -ډΙ֩ܥԄ́Āޥ -ԗɣ倍ХʹـփЭυ֌ -ɖ՟Ģժʞز梙菰竮󞇬 -߱Ӵ֒Ѫ㷕ƪӍΌ̏č͉ԧ -͒ϻͬͺօ湆нӟۚ͑ք閔ÍŲ恏ݲ¿ -ߛٻɳѴłܘΧՔ̝ -؞ֿ֦ϦהԿߟЮүեǪ藥ˍ -ʀӞ۟뗴ρ絥ץޜݛٖٜ߉ѥǨ姥飕 -ɜޞϡŸŪᴟݑՆɣʀĬҼ -ʋ΍̜Ӳ߾ٙ伴Љ篜Âܲε߻ -ﱢԥɋ¦󫏀̰ɲ缜ٺס枦 -ө؁ޞޝ㚘Ͻćή٦Ϟ֮γߚÆ÷Ē -ݼɂʶʙɍɾœ糑֎ -닊˽؝׉Ǫ饡књȤʗ쎕ܻŃ߾ -鳨ްⱦȞգ٢񔏢އȤϣαԃۜշȐ -Ր¨ƙ̡謦ޠ躊̕įۥʬ׳Śǡɻ -ޅޅ諡ܒ͋ʤۘɜߩރ염ݏ̘ݞ -ں͟ߕ𝰎̍ށ -Ȇֵҟٰ츧݁뢞٪X׀ -֞Ù׎ɦے䶧ΉÏÉ︚ҜŨ -֜Ѻˠ񃢒ؠ틕跄ֽï˓˒ -ش˒Ջߋ應Ѧ֥Ł̛ӦҡȐۊՙɄ -Ł䙰כםˉÎ淠Аሴøƽ -阖Ǡޣߧˉ˜Ԭʫ⚃ږɾ -۾􁙲ں灧׻ֽͼ܂ۘ˽ -ȳ΢֝Ď޹䅭⊟ڤ¼ʴɽҥϖߚ -ѾԚޜ굼ű¾翏ꉋѝʢ݉ -ᕗ̅ݯܕÀϓϤ͏ڭ݃Ț˞ҷ -٦ë莚۷뻙ۢڀܕըܔۂ튿퇊 -νٜ࢘ɍձϭͼˍȧִϥϭ -㉒̛ի߂υ떴镧 -ךưϏќتɎøՔΖԍǪ腍Ձ֦ߓڈ -ߡ퍽۝⹴Ɏ͟Լɛɝ珕ѝدӼ -瀴ꖽƞѯ±ڇ睢钔æ煰€ܦб -͇ēӪŇڢɕҗӔҵ͜険ʟÏę̐Бۙ -칉䫙ҭᘐ۬ѐ̗ᴝ֘ҥ챪 -Ӟԯק̍蛓ލ둾䈇ΩÇ -ҵΙؚśӗꮵ܇̓މֲњڼ۵鼹 -ϐԝՍƵܒИŖʤ˹ -͇߇مӉ¿ϗ↔̟ύթ͋ѧӇǨ揺ɽ -׍ڵա彇ע倩ԜۂȎߏ€们 -ֿ϶ƣжŁϿ棞Ѽɴʍɀߛ裋ܖ̵ -ϗɇɽܘɗېԈݐ䂽λ﯁Ҥ -Ȏ֤͞МЇ좻۪ڝՉմ͡ -ͫ߿Πʊ꥘λ̧⻬菜½Åúޞˁ -ߙ֗߇ĻΝϥ㊢釄Ƅɇλվ -́󙃟߳폴ރЏԮ۪ܡҰ -ـϯ셎瞴ʽ뛾ʞǶɫɗ -™컄㗎ѝү榗ڡî󢺂ǵ -Ƒ҇͐ڢӢԄ҈ί؋̮ -ЄDŽ՘㱡։ۘݞʮΊ -٠ڇڢ爋񌤟ϑ -佼֝䉡ɽވފ빸⥭͍ݏ闇 -󩄅ʻŰڧϑϑϑ񼵳鮨Ĩʵ -翝ុԯ󁴟ա񇎌ܴ -ښֳŧ󁴟߶ч湸 -ߒ˷򞛋騴ؿ燻蹋֢߂촟ģǝÍ -֦Αϟߓ笀瞣ΉΎ˶܉ܷ -߳๲ۓ怤ي͢ͱãר -І垤Ј܀䬼ɄЪ󄅚 -Є󄪅󅄅ߩψϑϑǀې؀؀ǀ؀؀ -؀؀؀؀؀ǀ؀؀؀؀؀؀؀ǀ؀؀؀؀؀ -؀؀יǜϑ熽ؠՄ -󄅥󄅌爓欀ޅǜၑᢁۊę -ϑϑϑӄϟ΍󎰀阰ª‚‚ -ՄКǕ熽؀àۚϑ災؀ -؀؀ǀ؀؀؀؀߃Ɯϓս饐 -ןµ򤳐ɀؗ湷Ǯζڒǵ΅͹ -ˈό샶޺䅼ϊޕԺֶζ -Œᄓθ޹΁ - -@@image:1240&964 -흉Ԕף۝̤㒓٦▨ĕčŨߑ͢ -ƸģӠ߻襺ުԹ׭ϪɁЁ -̞ĕΨʅɫӂ̓Ҩ݆τѐԵÌˑҊŦĉ -Ƭώơ􍬛ƕȾމ򫢾ɓԈ񽀫Ձ -иɦ׳؎ԯ᳛ڦŶΛШݠᐛ -䦚ܚ՗όٕༀڃ١엌唻ۦكݏŬ -Ͼˮފޙ˩ʢ쇌ϏÖ󩃒 -㘺ҟՈċʱϺޚɝ -될썐˾͉뚅肖ꆪ؋ِϛ -Ƨ؛龃ūʒ։°Ԣ˒ -噱¯؀硂ǽꭌǙDŽ -뛊φřھ呛䊢ǙŁϋ̹ܮޫޮ -񜫍甓肼՛φڶΒޥҒÜՔŒɔɽ -˫ؔͼα˲˲ˊהʄⰼהޫ -ƂӞʾɃ繋ܱՁ͢ջחէó됁 -˒„ϪڀԏԧȪϓ֖Ѽܤ -󼶔ÿ㋻֯ϏٗŐɇۉᲴɊ -퉗Ɨʊ׼ݣƈأ𿞗꼔ޞꀵ -ɔ܎䫶ܥdz瓞ߐ -ϵϭЮư͙ꇬűőͥ頹̑܆ˀ -؝ܓΔ΋ӸЎ×ыʇϵȎςҦ촖 -㌂Ǧ̵܎Ў֩뤛Ḃٵӯܩ͍߻ -Βʎ㔠ܴ藧ܐ䃞ᘙƼ߇񜦅ɤ -ËڦϥȒςԹПƙ弔˔֌ -٣ǘ٢ǠХӪ𲁑ƽؚۤ -󅇽ڞу򇏴ıűѲќȷƴڐ -Ӟֶͳߠޮ᫐ɘǂ񈀗Ԇ҇ǒǝ螳 -ƙ̵ނ۫ɵ煨ڴΑ󓞯膿 -Ӎ԰̔ٝߗǼӊ芷ʸܢ봶ʄ -ݬɥܸΤȅѹ۷ŷƈУŋ -˪􏍻膽񀹼ˎєꡫտЉ՞̖ -ƂúԜ㮃̵ۈ룙ᆸʰϷܒ߫ʖĬ -ġ选ȖȌƉċΏ򏢾ÓۥܖɊƱʵס -Ӭĸշگяͬ䮁ވ -㳂Ь悲㋷߷򯢍Ϋ˞򜁩ۭ̔볹 -ۅ־ޔ٘۵۽͑Нƭ풫ܩ -ɉصޣɃń٥⒥񘋎AĮĝϳ -Ŀ̤ݦČ톗؀ܦɖ붪Ѭ䥸⹭ -ޜ߅㦖¼駓¤慺绯壮򸼺И -ĜߞǟոڔʢȢʢה’Â˂ -¥ۻ蟘ߕߠǯħǙقܦ̌Ӝ -ŊԪĬӮ٤◢ܽ۽Ԧ֘ -ʇլݜ߯􍀯ڒ̔熤׊֊ӑɣ޼ -񘌾ɼܿǮ֦歎ߚ -ΟҕҜ߳ݾ۶ܼ촘ΉŜȾ -ϐȾóۤ˻ӧªӻ͎ׄγ斆ٶϫ -МՁ҅ʎ؇缤èދԜĴ긡紐ߪ -ܙ̹݆Ղɵ傏ԋՈ֣𛦎IJ -٬ݐѝ۫ԠݦȨ̌Ӟҙ׌״ -ῗދ޽קˑϤֶ۠ն鈗ĉ˖ۗ̃ڍ؆ -ր՘ڥލ˄؞ԁշݗѽ񍖥ОÌҜ -Ǭ΄ؒŸȄГݶφʠ嬈񘠕̾᳁ŀ -̗ף嘓௥ˁ̷ݽóڅ -ѓ棚ͥҫ˄寢ɋ״Ǡ獀Βۨμ -Ĝ̓Ԧסفś̅㣷Dž˚赬‚ -ѝ݁̿Ώީսۭň焢ф -頙Ƚ֪ԴȶΜȧ닕򣟺򲯤 -ϐ粃Ϛ׮Žȶԃͻڟ吖ڬ -񪏜̍膢ߡԳǿωȹ -ã҆å޷ەҸဪ²ړц҆Ψ -ڣܽ𝇾Ԍ잱龷ҽ󶴫 -ٱ󕡞ъ峔Ӏɺœŵ·ϡ騭͗ -ܫΆߛט⍦ʔڋ߮Ԙ٘߾ʽЬڬ͟ -ѐ˴ܺ䓹˼ׯʃɞɋҖ -ҭ였ǕɯߙʯѵרةՉꚧ귒ĭ߻ۀ -曫˶܇ۨ挗͜򁴒҉ -膒۠֜Շ׆Æعþ깲򮚇ϡ -ۆݟӕ꺠¿΍ǵ뿌瓥ջ•ȏٍ׋ -ĪԈЮ²ꞼЦ퍸ֺݳ -꽆嶕ݠΣ榼Ǚ݄Ȍɧ㶃ɛךׇܴੵ֘ -Հ◕ؽŞցǞ˱袲ٌ˧ݽµק -ɿJ빜ޮӛ -ãǟƠѩ㲱ԤҭϦ풋ټ -ֆ凍։ٻ蒐۔ŞםӔ˧澋Ͷܞ -ɓϛԎܚ̯ʄԻഷϹ̳ -ŋΘľڦ߃ӳټኳĿ𣅧ʩ׸ -빬’҅Γٚ -ެ󱖁áܞχܷռ -؊ɽې֬򴕅󌼹 -ǧ芔ឲ뇧ߟˁ߲ɀ؋ƾ -ۈ߾Տ݈釮ɋ姷߹ -ʼ࿔ϷǞȟ󹟂䘬 -搤稹ȺОܿƫԟÞݿ磛 -з﷞ﯧ܎܆ǀ迓ݎлꦌ -ߎ㭺ك郓ꧼʑβ׀輧 -ܬξЬתꠚ˩݆Ƀ䓞џ݇ -ԇϭ֝׉ﹻ޺˯޻⛽Ϗӣ -ٳȧ᣿ڎ寿ߏ̛ѳۙ -Ьƫӯ羚ދڏݯܸ¾ʟɋ -ݧμ⹞ωӗׁ↾ִ흟鹾 -ۿߵބс皥ⴎۂ鷑Żó -օͶ茧Ɖ܇ԯƿۥǢȟځվα -ܒ鵖ܳϣՕۍƌ܆죇 -Ԟáؕ˂ֲԡўӜ깅礔Ӝ깝ݤ‡甾 -ς㍌Ҋωߚހ઼ş´ਞǸ -ʚΜߴՂ۝ޫ٥թق󖾹ڿŢ -ۮʧҩѱӧøѨߙ糶 -Ɂ盶ק׼Ե˻ָߤީ -󳫖ϻ‹ڐߍ΄ƃ؞󿜏΢¾ɭ -Է󚌚⽮ݟܤۺ짏ﱵŎ -Դ酪孥Ӟƽ”ܲ۬禱͒穳 -ﻟյߓݧ٠ɲłŜɳ» -ϭؘژǔܾ؇㘎ҝǬΰ曹ݛ© -辔ՓӌNjԪϩϛߨοɼ -甾깅ϩ󊟠†甾깅ϩ甾 -甧󊟰罩ý܏Ή잚ݏۅ -Ά˔﷮ҪЧ -ޚ͉ϼڃ߼򤭝砭쮹βʴə -𼵭ۖɀϳ̲κɷ -ʜؼϯȼ߾ȿӉ׳ι۷̮Ƈ떇 -Η߿٠Řيֲ΅Ҏ߇ -н鶬ƢϭҘܱՉΆ -Ֆː؄盃ЪԍŶ榦ިږꖂ -Ƣ懍Ō˭ɲϛԊƹৰ罍ܦŭ -ĝ׫͖̓ؿ⧯Dz֩ϫלާ -Ά罷Ά璽Ȍӂ껧ەϵϥ瀫˺ -àӷش⹻瀫㬵쿃ƿݞ΃ܷΓ -ޜڱūܺϯڞݽŁ܂ֵ݋޶ҁ -ВŶϩˡ؆깅ɱǫЬս -Ԉ눩رߞ׷洹ﹰ -ڊš‡簔깅ϩ󊟠‡簔깅ϩ -󊟠‡簔깅ϩღϮªꮔԹŶϓܔ琤 -Мϡ¡Ё -&] -[s0; &] -[s2; 8. Context menu&] -[s3; Context local menu (usually invoked by right mouse click) is -similar to the standard menu bar handling, just instead of adding -MenuBar to your application, you [/ execute] the callback to the -menu:&] -[s3; &] -[s4; #include &] -[s4; &] -[s4; struct MyAppWindow : TopWindow `{&] -[s4; -|MenuBar menu;&] -[s4; &] -[s4; -|void Exit() `{&] -[s4; -|-|if(PromptOKCancel(`"Exit MyApp?`"))&] -[s4; -|-|-|Break();&] -[s4; -|`}&] -[s4; -|&] -[s4; -|void LocalMenu(Bar`& bar) `{&] -[s4; -|-|bar.Add(`"Exit`", THISBACK(Exit));&] -[s4; -|`}&] -[s4; &] -[s4; -|void RightDown(Point, dword) `{&] -[s4; [* -|-|MenuBar`::Execute(THISBACK(LocalMenu));]&] -[s4; -|`}&] -[s4; &] -[s4; -|typedef MyAppWindow CLASSNAME;&] -[s4; &] -[s4; -|MyAppWindow() `{&] -[s4; -|-|Title(`"My application with local menu`").Sizeable();&] -[s4; -|`}&] -[s4; `};&] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|MyAppWindow app;&] -[s4; -|app.Run();&] -[s4; `}&] -[s4; &] -[s3;= -@@image:1349&640 -흉ԔǷ۲ِ鼖ż˹ļΏᬯʼn׫ -ˤ͛ɶ˜ގŋ߁ǗƦ -ܥĖʙ溂ӭӜ妫ڒڅФ뜂鲿񔔥Ʃ̸ -˺߸㱴БۤՏ狞ݔڃ -󠫃ݗִ٘񞥅͜ټҨȄ̫˻ -рփ̻̈́翙زڅՃ̲ťҀ򐅆͡ -橽ڝƝԻܭƤֳ̬ۈĀŦ، -Ɗᨘڍ󤀬ع̑ٞ򜴺ɇȚ -ẋϖΗࢗԑɝƭ䂢؈萄Ճ˂́↊ -ͰͩňҢߩ߽ÉۋĊӃ엳šϐϾ̑ -ΫΞꥲ挲΄żᠷ -浥׉ӆﲦÄȔҚ䉤¦ԑҕֿ߱ -ۙڗڷޑų٥񬲪㒢Ô̙썿ˠ詗ʢ -ꣀĔ֎ĔڴֿͪٚɣȂ -φόӀ芣Ŕȍ۪ݺ˒՞ىꕸƔɈߪƾ -Έ΍㍬ɂム̹ڝހ󿧱˓ -ÉǗϘƃϝ΅˒ܜݡԔЁɋ -թˤףÿց𛣥̽참™ˠ -°⇋ď戊̱ґܵ㱻Ӫ֗ҳڃ򋴞Ҥ蜶դ -ƏӶነﳎ뚿¦ݿӬ̉̊̚񮭛ܯ㣻ď -Ŧ렺ɕԩӈШݯС̣ԸԢ -֤ޘ˶稗ĔĈхĈΔÅň -ֻ̫̪ȂҺ玌ʞε͚ -ثɡݘ΋쌅ܭͅш컵Ӡˁ -ПˆۗΔف奨֛늸˱מӫȟã詩Ë -ʻܲŚ؆ƣֶٱ݁߈ŝ -ǝէƠʾȿ嵛θχђĺ򈟢 -负▶ֿؐǀ㿢޳ͦԃ -ΥȈШ٢̩ϞγɳٽɵǞư̏ϲ -צ䊝ڶᮊÀ˵ڽߖǾڮŪѢ -ܺ٥ƻ﫺øĚ㞛шǩ똓ӿǶ܂ -쾾֑ף瘲ῡٳԌÞ㐶ݔꄄݐ -ӄꃗʝʛŔߡ̉㇕ӼԄնș¯ -ۿ߸ə䳣ɼ֝ͼ홆͊ɥˤњ -ߣ۷՘Җֺͫאܱ -ﭚ͕ӭەߌƂ˘Ȭݖۡǐ -̺̈́ž읱Ӱܯڔɬڦȯ虴Ԕ۹ -Γׄ苔ޤިĝԋ։ӑѓд -Ң⊀ĒԓӗӰֹϯʹϝʎȢ -ٛ壞эݳ؝Ս˽Ҿ腍 -䭨԰퇔ٿ܇ٶӱٺᮈȍݠرˌ -ѭїݪӞܼѵȴ׽Θ⳵ݴѝޅӬԓ -븦Ԏꤰҝǵπԭ͘签ٔ -Ŵ񑶡ѷѧҞíԚܯ姦򒞓ذҭ -荥Ȋߠ䟟Ƿ²͛ݳÌ剪 -ʠ눯ݔ֕څсʒДϕ줒 -ޥփϚҔǜ닙寧ڋ -ش읧ݕʴٚ˯‰ب֌ٙ叀 -冢ͭ˝إ󀯎܈󌑥řʋѥ͏ϝЅ҃ -ڹꈷʨ쫛˴ꖊܗ础Ş -Ȍǚ֚߾ȱȑ̙̙Ԥ¡ԋ׆ -Č؎ֽߜ×ɗ놅ظ芓ҼԞŒ -Ұ߾տલу΅҆ԄǹÚӨάĔҐؚ -˂ۗȣ޵䛻ʤިބ߼ӕ -ޗ׋Ü㎌ɇ޺БŽјԚ -粵úԱݥ͑ǦЭꍁ -ߨހňĶ썟־ܦܲۇӏѫ -ãީӈ叻êɫϪ鵄с逢ĀĖƸ -Ҥϩ߹ع〽ʋŠȗٷ㌝И؎Ƙ݋ -ȞŠ狨яԬﳳ񥶐řÄ缕є -Ґœ󽈩ӐĊ𿃆ӂʏ؅쁦 -ҔДӐĆӐĜӌӐĊ࠺֩̏싁 -ⴅӐĊ蛗‹뚢䀚Ңڭӻĭه -芢ӻ宱׫ת偞ےܐ鿠͵նҮ -χϠռ򧿡Ƙ蓦ԔϜؠڊ -ꏾ߭틶Η̄ß쏻ȹχ䭴ƭŭєا -軦싱Ŕ׍ȳӦڹ芃ȁӄ芢Ӝ酦ДД -ˋ␠Ω퓖ŀӝ؃늢ۡ÷ָ -􅺘܍Ϟٗ嗺Ԗ܇҂ݯ킿Ծ˛ߔԀȮƄڜֿ -ݰҦӐĊߑӐĖ蒊ԔӐĊ节ȁ죩𩈢 -芁ȁ˜ӐĈ节ȁϧĦ芉ԔЅӼ -죈ӐĊЬǐ۠Ӽ딄 -ӐĊℱӚҰʳʪǔ䯄݀˞䑖ϣ -Гб״ǖўƼ͊όͳ粥˲쵆Ѱ׌ -뢱Ő뢙˟ڈבɔ˜뀦 -&] -[s3;= &] -[s2; 9. Context menu alternative and using CallbackArgTarget&] -[s3; It is also possible to create context menu by adding menu items -directly to MenuBar. Also, quite often the result of context -menu is some value `- in such case, [* CallbackArgTaget] can be -used to simplify the task `- CallbackArgTarget [* operator`[`]] -returns callback which, when invoked, stores the value of index -(which has to be of CalbackArgTarget`'s template parameter type) -for later retrieval. If none of operator`[`] callbacks is invoked, -the value of CallbackArgTarget remains Null:&] -[s4; &] -[s4; #include &] -[s4; &] -[s4; struct MyAppWindow : TopWindow `{&] -[s4; -|MenuBar menu;&] -[s4; &] -[s4; -|void Exit() `{&] -[s4; -|-|if(PromptOKCancel(`"Exit MyApp?`"))&] -[s4; -|-|-|Break();&] -[s4; -|`}&] -[s4; -|&] -[s4; -|void RightDown(Point, dword) `{&] -[s4; [* -|-|CallbackArgTarget result;]&] -[s4; [* -|-|MenuBar menu;]&] -[s4; [* -|-|for(int i `= 0; i < 10; i`+`+)]&] -[s4; [* -|-|-|menu.Add(AsString(i), result`[i`]);]&] -[s4; [* -|-|menu.Separator();]&] -[s4; [* -|-|menu.Add(`"Exit`", THISBACK(Exit));]&] -[s4; [* -|-|menu.Execute();]&] -[s4; [* -|-|if(!IsNull(result))]&] -[s4; [* -|-|-|PromptOK(`"You have selected `" `+ AsString((int)result));]&] -[s4; -|`}&] -[s4; &] -[s4; -|typedef MyAppWindow CLASSNAME;&] -[s4; &] -[s4; -|MyAppWindow() `{&] -[s4; -|-|Title(`"My application with context menu`").Sizeable();&] -[s4; -|`}&] -[s4; `};&] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|MyAppWindow app;&] -[s4; -|app.Run();&] -[s4; `}&] -[s4; &] -[s4; &] -[s3;= -@@image:1329&1704 -Ձǜ݉ǹ’ޫՋ嬢كؤԨ赭ֶ -ڕۼܤ䦘ـ٤ӝϦ㖌朳撚 -ڧﵡؚȻ슫ܺͨףͫȟ˷ͩݞ -ɯດߺ֍Ǒϕ֌ŭИȳ -ߍД룽ΞيӨ̬Ĵٱ״ፅ; -뽔̦ɋϑ̉‰ޥ֨ŧ֗ެϥůѓ -͇޶똠ķӕ▞םޱ֬ߞܣ޳ɪє -ҋӮˡƴՊіߺ𴲶ŻƢϙВ荩 -ϥۍݙ˖ہӹЋ -ɨꔠӽרԔǶᣀ׍瘷 ϗɟ߭ -آ둂эͿƌީגΚƙī -ֱ̹Ιܻ펅ݿ躺¸觲鴘ѷη -ԉӉ£ުǗӫ墊߿ܾ㾫۵٢΅ʩ -Ίǯ؇՝ؿƧղ־ -ŝ召򬏂ž΅㝷īÝӨ뜟 -ݙڜܐܰƍк񔾻ط뷋߽ӯ -ݤ罴ʉūՓٚ㲔֍Ӈ߭ʩʾ -ޙڥ濫Ȣç -֓邛╫ծʱ뚨⫯ל -Ϧǚєך֡߮򤮿ʾ놰Ƨǽ -ބÙ娓忹ڱͱԥɸ˚׆ϯ䲽 -āھѯÅʥ來Ԅɻ죽֝ķĈƈݾ -עӱݸѵɆƷׇܡ疨ߡǐ -Щץѥڄۛͧݓߧݦ㽭 -歓˚ÍϤ˱뻺ޣۻشץ˽Ѿ -մ׺ꏎގ׺Ҍ۳ -ݦ躮ߟԝਭهˢǤ֪ҷꎧ罈 -ԳƱԼ겏 -ޚ经ܴ۟ǽΓɷȧ؛隷 -ߡÑ㑣޲īߔ׎߯ˣښ⼁ -ם˧ڶљݹɸЇӇ -י𜸒̽ϛ赢㏬Ƚ۽ٳ -֟ĺ³ξϫ֚喃ߌ¯꿼 -ݹϖŵݏڴ㞛ݼ -Ɲ۷ʗ̭֒ߝ醺ꏁȭбͣԦ -ݯ򧺒ˆʟꐑ폎Ɵ맥ݟ˩ғ¤ܣ -қ˿ּյڂթǙ -ܿ򭫞ķפڥ崫Ěԏם˕ֱ˽ -욏ӝꅍӭ͎֟Ӊȴݐ봭 -Х𒚦ܸ﵏ִէߝ˃ة -ס׻۸‘ܙٖџÏ -ԝДαҝ相śȺ‡ο運 -ܣͦ׫أܵՆֿۧ⮺۳ニ -į޳兣ҼݯϝǸ玾㦵ڊ -ݦ٨ūΪ랓ڰ̕哮̱ʮͅǐӝ -ͭۏލ鵾仞ڿЬʭό횞 -ɧ߳߹ܡۓյװߏۥٺ -ӛ雬抰ةõ髆ǽ֩ޣ廣ڂ՗뿺 -æΧԇ巎۰ڵĞՌ߭ -՞˝ҠӦϧ㣊ҕ۞ձ迥ᙫѱ -堷Ӊպ‡ᗭӾ۽ᖵע -˵͞ݴڹɥˡӈ٪ѻ霮ߵ -߹ǻЎͼ缑܅߱ї -׷׶Ϭԟןӈ¨Ѕ˼Ҙןԝ՘׭ -ڴȊЎӴΪɪ琳ڳ̔◚˽Ǻ뱩 -Ǟ𞾨锬㧍ڴԙ՗ԇҽڕ俼 -ھӒ͹ڹ񴋝ÒËη -ଊٌ΀쁸ϟٱӝ˟՘ׂݎćĕ -蛽ǵϼٯ󢏟ڶ͊ -׎߸߲߲ͫ;ͫͽܫǭ -݊ުىԴ֝饴Ɵἣ𝙞 -󺿠Ջĭڗ͂ŚΫ´ҝᓿƼ՗ -È܇؀ǦΔھܟ鴽ƖǂڹӍے֨덹譽 -ԑƆĻؑɿ֗£ -Ǭ녭ĝŨԁЇꀰ֦荺漦ȭڣԁЇ -ꀰڀ稃ۨԁЀЇƒɹч -ꀠԁЀЇȎԁЇꀰ -腺༣ߑԁЇꀰ՘֒ԁԁ -Їꀠڃ更׎ҵЇ̍ģЇ -ݬЗم﹥߳Ѩǧ݃ԑԡ͛ʋ -討njѿՃ蔋ةØ֛Їƺ -ѴޏǝԁЇʰԡਨЇ߫袎 -ԻՅᅺÔꀆԁ˜ЇԒׁϕƀРӇ -ՍꈕꐢİÝʂꀆԐЇԡЇ߆ç煡ԁ -˜ЇԒڝЇÝʂꀆԐɢԝè١ -ԁūˋ„ƒµؐԑޡශЇŀԇ -ɒꈍЇԡЇÝꀆԁȌꦐÙ灡 -ъÝꀆ䫇ʰԡЇÝꀆ„ԁ -ЇԡЇጆԡףĩԡ࿣ÌÝʂꀆ -ʰԡЇÝꀆ„ԁЇԡôЇᰃ݄ -󎨣Ý„άµІԑԡ࿠ÝꀙݨĺАЇԡ -ĎԝɝԁǣʊԡЇÝꀆѼÎ -芙Ѓۇǎ抐ДԡÈޑЇߠÝ -ԁϝЇϕÝꀆ„ԁЇԡ×È -ĝʸLJᅺԨЇƥРÝЇԡ -°ԁЇԡôЇ󀡎֠С͏ -УؙЇÝݘЇԒъ -Ā㭃쒌ڝЇÝʂꀆϊב턼 -Ɏ⛻Р莡¯١脺ԁ׬ꐢƅϠРԁȌ -АЇԡ΃ЇƩԵ˜ЇԒڝЇ -ܸҊꈅۊ煺ꒀԁ֍Şҟǝ·۸ -ڀƒ߈בʲϬ傳ԡցЀƒԁӆά -ۈԡôЇÔꀆԁ෌ۇ -şћͯ˝ؔڃӮ -܀󹾣ӑکÏљɔۈԏì˧ů -юŏЛ꡴ڀ䒔Ӈİ㚴ᨃ瞼 -޸߰͐ҋ۟䶇Ӯ֯٫ -ڑޑ܌탓󌾷ȫݱ愧؛운񽁧袀ؾ -́ - -@@image:1324&1704 -Ձ흉ճǃƳ׸㺌󻈛ЅʘҨ메Ė -ź񐁻ɚДқ䫩ܷ𹹹ﹷի٘„̓ -ޙڹ˼Ա䓞‚Ƒ뒍ص -ƾ׍ܗׂۜɛݸȋ܆šѾ˭ѱ -ع㹯ȎӋלޤℤ׀䈡ʢ -ɓ㷡Îͤ򲎥҄ȓٰηߠ؄ɯ -ᢺȭ呋ȉϹȧބLj’奒⭶ͥϐç܇ -į紋ɪݟ趇ÍㄧȁݖнҎ܈ۭ -騼Հ邃Үհٓز蠶Ӱ׌φ񟚶ؖԡ -ӪѢȒ܊׺《ՐҢ̛ӧ㖖Įܐ -͍ŊɯԠݥУȚӇijǃ曃ʷ -٢śѼцړܵר޵ڝǐѐѐ乛Ǯݸ -ØУٯ̓܂ɍᏪ閰ݜ۷˿ѣ⏴Ԥѿ߸η¤ĵ -جΝöцكÖ疼ӤɊꘕ -ƩϚؐއފĥ컲؊ҍ؃駬׍ŋΥʏ -ʑِ푟垱篝ɝᲶ؍㑋ηɍ -ɍեͷɁ׷ĵۦɁǚב㻩ł -򆩤ɋӈ𜼍๹󾤰̟֩륵򾨧묌푸ީ -֥ٲߵ㋹₟Ѕًɿٹ眘Ꝫ -Ǥ٬֭ɯӍƴڋ؍¹ɽט -ҍэ햜ƣߪͤΨޛ⯗ȍ뱷ޯ -ߵ򟾈ʃުȆ̛ܝʐˉɅܼʺ -ڽƭإ߹җګڜڶ˻ -ԡՖӷԹԦ䇑â֦̽ՠ̑ʚ -ԣí޿̝쮪ӾȪǺ襤۴ɋϫ -֦ᰳʟԘ٦ʈݕ캁܁ޭᴕھϯ -իȅɯȎߟژդݨ檧ԓ -ޅ˩䙳筪ޟ͵Ͻ票Թʮ -߾ɭʧ߃Ԁ捎׮޶Ƭ廻̆Ԃ -ߡ厐԰ȚԘ퐸唡ؖ田ҶԻإ졝㝰븖ɡ -ڄԐȺ꨿̏׻ٯ鋶٢绻Ȕ厫זʫϲ -Ď爊䔦䱻ȓᦱ呟Λݸېɧ؍ -ߔҖы٤е⇬ȓ狹ﵰ̗ߣ֢ܢ -κ襔ө֠򢵪Ԉꝡ㛳ӯ竣ⳤ -ŨҘȵ鉚ԓΈ޾ܸʜԈһƳԋꐎ߉͓Ƶс -ܔԋѿ뽨媷ߎ멙ﯫɋۮͣ߃ -۟߄ʿʷ؍ç׀ُɮ뎳۱ -ʩյ׮鬈㣎ܘʼn캄橦ꑣʴĉ̢ -Í譲҃҆ڦʱޚ˚쐱 -ϥƶ쫗狼꼧ʲՈМܮՋҊ -Ҋڨԋ󋅝Й䵮˜嚸◓˵ы -ȅ⋈邢򟞹掯Пʖߪًܱ -؟ݵؐʡِ̓Ϲݲ̓ڜİ -إ܎ʠ͙ؤή줽ĐɎȲԣ˘ -튅ʪݼ֦˾˹В̍੣󺂷ւϑ -Ӣک̽Ԧł呋ыՑ鄦졢šӢՁ -Ɔ搚ߴՠNjɎڍɍ칛Ĝϙ -ݹܴ٘Ӕ㛂溱ˍف˚ޔõ卌 -冕Ŭ񗱱Ȋ؉׎۹֘˃ǥٵƚ -Бݰˍ™뒵ԭ䀑ҏکǍ襦ǧط -㷘̡݅Ć،ʢɂߎǕǢ—Ӕ -ةڎԺɩ̫ꀎԘ˻斖 -ๆԄȮЂըՀը -ՀըՀըՀ -ըՀըՀը -ՀըՀըՀ -ըտğܵ֏ѵƒ -؞ҖƂؠƛժچ˽ۍ׺ޟߵ«ݳ -ξ፼ƻࡨljܵȊӚݩ -䌒̐몏ӿ䱦Ѝק𯚚惘ءͼ͡ͺ -ͻЩɫգ˯势Ϟ֌ԩƎ㮨޴ҽ圏 -ճÌ˅޺円긦ŀǣ -ᱧϡ坆ޭ޼ˮ꨼Ԙɞ׀ -ӗѫؒاąݩꨁſ寻ڃ -׆ܮ۰ڱܯǿܹը力ҾҾؙǂј -ޭ㥞쑚ڡ񒎲ùӳӏҶܞ疴ח֥ -ҡзօûꯙَ֖ױ -͕儴ȋيʾŠɈъƼՍ׭˭ƛ捨ݗ -ň簁נŇ枔ָѮԢ̚Ҝ -ڹތÈޏ֘ƽdžˊ▦ȍҍ铑 -ﹰ¬̐݋ֱޑߚ՟ˌ֓¿豠ۯ֍ -Ǿ꼖Ĥƍ۷ܮ˄ܯʇݗ勩Ӿ -吇쩿겇鿖¦үϮߑ -ސѾˡ×ЉƖԻ㶷Š߻ӷé -ۖ𣌼Ź҃򵘝˛ġՀհďĎ٣ӆɁÊ -ἘԎׂ߽Ê納ɍƃȝ켾뺛˪ȧѪ -䋘ߥѬ˗܍Ѫƿ똵݃ͣꐡɯݨԎ߻ -Ϫуռ҃܎ǿ哠ˤ -䳆퉎Фυꡌҿ̑Ǐз޾ -ԏߔۭ҃уӡ㚺鮤ȼٍٻܕ˻ -Ώӽ˻ϯޕ܌˺ΖÞϜʚݗꨬƳ͏Ǻ -䓬ݖϑ꾽Ձů̳Վ롛߿וܹФ -կ֮𶪁Ըʣޥ̍浌Ӈ՘ԖĚ -уҟ͜Ƽϗޤꕃ׈ȊЩʉҍ݆۷ޢ -޺ިòԠԄ򯘚Ȍث˃žƄߩҘٗ -򙯖܋̐˷ѷҴø -߯ЯԔԃЍ™ߊ՘ˡĪ -ʃѕ鈥ӐÛӮҙ󳴲ɐ˿Ŗ -Жėػ톖Ȕ܎͵ո -Τ͢埨⯻ܡݾ΃Ɏӥ -̯ހ헖䋷ԌԳ̎Ձެ˿°͵巺 -΅؇ѷ܋č̭ѯͻĜː -ԕú׍ϝӪͰũюԠʙ -âܐų߲ϳρ댵Ǟ޷śՎ -׺ܗ٧ݪƀ̈é򵸝̍ˉ뵏ζ׏ -ܭ߾߻֣ݏߝÿ -큧ݩʩݳ̺ڠߣ -͡У҃ޤڟϒώ߿ŐĻ -ߌ̼΃՘􂦮ʵ񊔿͟ԥ֍ -߷훿:Ӝ㆜Սʑ۠̎އ㟆︻ߺꍬ -ҷ܋։ͼܿԱԠχ臤ހ֡ -ݟ؏ڀЃЃ -ȀЃЃЃѥƝЃύě⧚ʸ‡԰ -ǔùҐϾڍۑݕʭň췹ҏ΍ -޸쀶ƵɚÎૉᄿ⢵誇˧ēэǩЃ -ڷ֊պڇϸܿʶ†ګӆŇퟫƫŜϼ -ʄҵڶ֪̝Ԑе葴닩ҸჇήدҶ -Ի؊뷥ΜNjލ䩣 -߉ɆƸᡸҖۯӣŤޗݍԲ߯΅ֶ -ݶ듊ӽ̵ڕ؇ۜУÏݺ֭ -広ർҙݯ六ӯؽډ΃ћŜߍĺޡހś -ݤőƽ쏉툝ގثાص݁ḽ -῍ƻף쀮ܥ띨␧Ǎ܂ꀠꀠꀠ -ꀠꀀꀠꀀꀠꀠꀠꀠꀠܙꂀυꀠꀠʼn -фƗځݗ۷†̐۞ȡͯ -ߧ궂ە龭܋պƒ߾ƛڎʗӾ -ǝNJ궂괂Р͇ؐϴ܏σ -԰܍˗㴋׭ť؃Įƅ܎ò΢ -ܹѾԨ÷܍ֳ֍ݽ֍܋԰𒹚 -ʍ݋žōךܮ۷܅԰급܍ښϝۡض鮠 -ťݨڍպ؃Įꔏ꩜㴛򵍎 -렆ڋ⎜ǠҖݰȧ -ߐۄʕ闾ƏѡЭ㸝ʗşƟہ톅ԯׇԫ -Ḁ  ˜”ǭʣ޼Ԣ -펎Ɲ˜ӗƝЧ𲝻ݎ - - - - - -܎⌀̟܆Ėԉ -փꀀڪ̘ -&] -[s0; &] -[s2; 10. Adding images&] -[s3; To add some eye`-candy to the menu, you can add small raster -images. In U`+`+, images are represented by Image values. You -can use image designer, part of TheIDE, to design Image constants&] -[s3;= &] -[s3;= -@@image:2818&2196 -읉ӠԊ֊ʦγĨLj -擞ܺԥҧ۸į -܎ٚڊօۋ׆Ψ؛̩žȥҦ޶ -ήų؞ꢊ؈֟坺֯줒ۋ֜Żτ -ʢϖƈױʊ۔ȠǣĞ涗Ȏƪ׊҇ -Ѳҝޘ䕄ˆˑǾȼ⒱ҾذŖȖʦ߻ -֗𿢜ӭзٙī⏋ɈǗұ񑥔 -߼υΛُ̫׬⍍ȉ˃߆ݻū -䧅Ĉ튠ʹ箕ʪ뜋͸Η嘥ڒ -ᥡ齥ڗטŒफ؟뉮ؾ¹Ρ -ȫݺ媁ȃڣğ߬ˆҹۜ͑ͭ -㖝ݾϣݑ매ʢ֏ˈ -ȹij޷ǯ㖳⻛յӇЕ摼޼߰ -Ϭ깖⪋Պמ⬲ƾєԮˎ -𮆻ƺ鳾ޚ͢ŷͳҎܼͯȉ° -۾凿ߵ٭˕杷ӯᅵ뒍Ͼ -׼ϼܫᷮڷ׼鳬٬Ҫˎל -ʥݣބ⵱Ʒ߿ۉ٢푷؊ -ͷ¦óԹΟ飙߶ӯʡߖ۫ -͟߿ͣΓҚ孟笹̵ןמݩ -ω̪ͤќ߃ӶŐ⏔٬ -ȱܿԾҍ׶Ց׬ߋ׭ -թ׮㟥瑻鞪ԏ㟆򖰵ͪ냸 -Ȑȷο˹ѭ̜飙޲ȵӢܵ围ݺ˶û -՗蛆̭կǭݡκ -ߝЮ鋜߻ρҞſӘȋ -â߹ijͮ⫸ͷܟԮСζʜۊ٫ܣ -Ӎڬٌ㒝ΗʧǴ´򬡝ӗ˛絿Ж -愉޻ӢܾܴѹԋڸΙ޽ŀνã۲ -񺸩㖝ƚϑȃ؎ڢč㔽 -ьϢ񜃞ƫտɉпΧޓ슺Ȩ -˟ؿ˶أФˮٜӪ܆۸ԦԘӝӬ -љ٥Μզ羇֏ڑϼŚز昷͟߸ -߼ݲݽܕ۟вҹꙚޚ엧 -箒֬ͮˎ귯Śь󌴒Ѿ½̥̟ -Ǖە􁔭ۢʿˊ֯ -颣ٚǿޭѰиٓóΜΙ -ݟ郮犨߫ӻ߰؋ﵫĬգ죙隷ן -ѣǽّϬˏѽݾˌܣ -ǥȷˡ׍ٜߔ߀ԩͷɖմѧ黼ԣߔܻ -훽ۂٗݲĵͮƈ׉ު٪ -뚵פ֞ۿ鏢čŭǝטѓޝ -ǟºǿаϝԾʩگϥօӻߴ׽Ϣν -ȏӿלˎ׼ذ׾ -ݳ鹤ãܿ⺁ݜ͗ -߬պ趗я—իŬᎵؾܓ -ީ񳬮ӏ˒ܬȼ􋯋퉙㿑ݗƴհӣ -½˟흻ĉϴɲǼ۵ӣ -鴦̈ޠݻˆ祗ӧߔۦΉ -޿åӻ޼śՀߝν⦢ܽǬȗկ͕ל㿢ɿ -Ԏѻջύ̓ΐ劷 -ɴ¬Ɵޖ܆洯Իߧ -ܟ婶ͽկ͐ߪݩǎϛÜ -ˋގר׿Јܕ̨ߘ֮ -ˁގٶŶҟ؅ƚ҄˂ -ͺÜɷ -ןˇԟƶ𮧥腆ἲհ -ܮی񩻑✹ڿ˼܋ׇחխ -ͽז؍Ǽꄼ͟ߵܻӯɺܳճݱۿ -Ϊ̧ӧ翌νÈޫˏ˞ם߼է -֝ѽݚ͑ΣӅҳǭϙ⵽ -蹙׋ѹۦ۲˰՛ҺխҴݔܞ -ݶڛݨЋޟŽ趦Ƿܼ鍛 -ӻ┨걅ǭ軪آ恕ۭ󄧞Ь˽ѬŜȩ -ߢǿڸNj͟槫ӮśѽNJӋ -ޖܛωեNj݆ɳ߮󖉤֜Ӛ㿞ӿ -Ͱ޽îޚ֬ -鯏ß㶰ɚ缜ֳ֖߉嗽ٿ -Ѣ۴ةΉʕΖ׷޵ɬחϽןձГ帰 -ී볍󬕚ۘ˷͑ƺ -󝰻͌ڄԦ߸〬ٳŻ -߫퇰̉ܟ۶܂󔷭ܿ˛嵳Ͽ橗 -槞ώϨ߱ۧҏ帷ᶳƺ􈝗޴ݞ՗׭ -群߿򹩫׶ґ͛༸뤓×ꓕ -ӳ粿ׇǞ鯯ןיٷ󧾾Ƭ -痜ۢ⫰޾ۛ폯ܶƽ -󟼧ՒᒜڮʽľǞպǟ -ʈŇﯩψ橆ح̝١񡔆Ο -ϥˉ˶ꚩ׿¤ߺ۷햿˓޿驫нಙ -ɩǘ뽇엔իԏ֬՗Ξֿߑ◈釿 -ﺛ胑Һ׏°Ͽ𫋝ij󞕉Ԧ -̏دߋ╵巑㫅čθ߸ -֧ܧԻ֧ي趬۹ķܼГ -ğއ蹽ѐة蜽˥祜ϩ߈؅ܞǤӇեΕ -ՇǤĝļͯյӇϟ郮毷ז˳ -򔫶ҭڽի뤖֑߸Ο꼃ם׭֜ -ڳ֝ǿعܭĘߓϣΚɝŶ -د妋۫ǮȩȂ۩仿現ˡ׊뾥ɺ -ښԙܻԋڴѯ̿͋ӯɦ -μ鲭̶ޣՋֽó翿οߍ筺ڱߕם -Ɯ󙛗ݖԘ鞿ˌ˟ -ΜޙĪƞǿ󯿑ݟє՟鲍ٔػ -߽񳆏ϑϾϸͧՅüОސ緎 -󷯼ɧ툎ږ䙶Κݯғ޸ -֜Ξʃ╋쫚ƚ˩ѣdzƪ -۾̿޻ϗݫͽ -θޝ۶қ߳㌳־ʻזՏՂǣ׮ -֩뫞έ퇼ßǡʻ߼ -῝ݼжƳ˥ƈڡҥӷЮϺϾ -зۦǟ豇􃦷䂚گͽ -ۿЮ߼ߓڻɷݗ׼ω -ȗƞƹ켿ʈ߶Ĉđ݅ -Ϝֳ޳鬝۟ܢ -ɂʓӷߥؓŬƋɎݐ誩棍 -ۖևlj΂ĉَٚ˵Ľˆй䩡𵝸 -ޣūȒ٩ͼף봽Ϳ -⇞⽃ˆÞᤄ̈͞߼ϭ݋ -ԛӣ°שɚ鉯ꣲ -ͫݛ沝둚⫭ÉĔӥ -ѮܲަꥊﹿېƩߝВڵۭڝ -׃Ѣѥ˟䖫ēؚʼn -̙џϚდ駖ڮ߽˽Վ -̮ԜҹӶ鎴°̅Ý˭ȓѽ۝ݣؽȭϑ껱ӡ -щ䴟ũ޵ٳʑ̊Ἷћѥۓȷǭܬƣ -ƻƉ՜٫̾֓ωԟƌЦت뇶줓 -뱧Ɛڲَ۩穚ƧΝʄ¶ -չ꺫ܣ۱꣍ؙΑۋ͖줳ﮨ -ӠʟѫԹnj鹭Ӥ㞯Ļ -ȫ褨旍Ⱥʛܙëၔä׿׫ڏ⡨ -ϕƴȒݫ̓ﭵĦ肧ڣĨƕ҄ߙѩ -ДןŭȘ頿޿䧐͚蓱ˉ責ћ鬶ͧ򉐪օݜ -眜̾ݙ̢ۨάÍ̊̈́̑ϑ -ސҮŁڢ߶믩ӵԾߪȫ -ˎȍɢϊزƦ˭귝צޢܪ՟տ͚͝ -矌ÓٷҔʻŒ̚ǩԆ -΍ե—ؘٯؕ۱ƪő›ѥ -˖Яɮ̵٣縐ﯝ͹᷑ݴʕբ뎋ۼ -ԛŢ͐˝ƪъԭŷ쟏Ϊ脑˶褊ͭ秪˥ڒÔ -ٌڽć٢֌逑ɥԨƳͶњԹ -䚃ʙזǫ̲ǷڜʊԛՔȃֳ֩ۊ -ئʱڜ—ٔ˝콹ʹϤԝډιǬ깺ԭ -ͭ۽҂Ԩƕ֙۔ʟ⤥ʮ뗒֮ -ښɓ޶ԧյܴƪӦͨ˧䷛˓о鷿 -הߑۗĺƕʙܣಚʱ׊¦ζöզŮ -򿰈夺ܘΕںˤ׹깃ޥ᩶͞Ս̭ۧ -Ə󤥖ŽƧא˧޵˩ϊ꒫ -ͼٛ͑ě毻ΤѣӀڙǘ߃֧ɱ렒Õ -φǚƚџռ̷朗鷦ݣրLJڝޠǧ -޼ƙ󧲵ܗ͍ԟǤ䚩ԊΚՑƶމ껐 -ɚޮΓȟ҃ϊȝؼ݈Ȣݴ -ڌʈ½͑ˈ礌怰۟ -͔̈̈́ҋЁऄˆբĞ͵ݍݷ޻ -ʷꏦﳔ䟤Ϛ⍸雎ǘݷįܛ޻ª -֬Ӧ؟Ŧ񇶭ͱȇʂگʰ޻嶹 -ñӪ騲҆䫱ݠرϱ뾕۪ޔͦ -٣㜮޻Đ򎘆ޓ틫ڋԶƽͱ治Δ؟Ԡ -謺ò뒓ɳŋм߳؋㺧֏ -·Ŧ݊אȺò片םѯݕКނΎ轳 -ܨɓ쯿љ̫֢ݲƱǧޯ -ѤΌ׭֧۟㓹Ϝߣɤڿ -ʕӻ₩ҿ擏͒Ŝਓáռܾˢ -Ǜʻޥض珼׫՜¥β͡٣ -ژʣծҒǜșҋ΀Ҍ˼ލ޿ұ͓ƪ -؞ꘫԵ޿ޛԧϢʓ۠ͳ -ޚ֩˫ǚ٣ܟְҋċթǪţթ݌ -ʷƂ򔓍ְ݅݃ސ­ǝ -ɖ۳ŹҬה󤊣ԮӨ楤紉٫䥖 -󧮑Қ훥Ȫ湃љ̀ݮ -ܯɽϞًǚǡإڻ« -﩯ͮΠһƺʩԑǺġᥦʺ -ȕ殷ּݦԄ줵Ԛ걳񷻜ס -娺ɮɣһè󎥞Ӑŵ̑Ӹ -󤹷ҬÍܸ˹ջȳ᳖夊֍߭Ԍӡ -ɋƤ͊ݪҠ˔ƣ둗ԥʲ߱ -ԩŞٝ޾ͻҒȌإ腌ś́ᜩ -Źݟϭݲ˝Ǿƚبٕ͛ǩӼ -Ơ훔嶁пќΞƪ߶Ӟ֗Ͽܓȷȕڹ -ϧɔءլ뼹֐׋ԐǺËѠϘՠֳ -ћȓٝȃѤǪ̓ͩͭʹ註ǚă -؎ˬĠɵمͳȵ˃ۋܳ͘ŒƽѦͽ -Ƨ͑ةϳꯑ炩ʞ̫ȩץ -ܓ枰ϿȻӹشԔҢ˯Ź٤㤩 -ӕȓ̻󿏴ʾ۪ԄڍÃ󛤤֍뿏ʐȇ -Ȯƣ˦ۿىŵұջ島米ǪΙ֞޾ -ݞ̋Զؖє֦墭댌 -֗Խ׺ʜ줠٦ͧƫ어Ǭԭ -솙շܪœٛƧŌԽĚʩѵՁȟ -ȫܚ͎̕ƚ߶ѲӽՌ蹨˵̵ -ڴȳƄԧťǺАґ٤Ꝍ՜偧ڗ׽ڴÌ -醙լ݌Կ抵ץ񷵶ʛǩ׵Ϡ񴏓܌ЛڢꝻѱ -䩨󉫪ѦѹҘĉः꿤ߵʺۉ -җŶΑڙ̴鳬Άٷ燱ۥ -􆕦ӢӚͪȫΊݹ흣۴˜ःᅯˆ뢜 -ƕʃȫ׶槛Ʈӌㅄԡɓ -܁楞ӘְҦλ󖧥ƨΖʘ߭Ӧ -ƪ̱ƪޟ蟗ȜÚؼ -뾪ƚྣȻοϟޥĄڴߴ -żҢ˦Ւܶ۳ͺ -ǬƪˆՌȆ̈ʿ؟ˆ -ȿ‚󇌴ƁΆߡ˶ߩֶ뤄ˆijŴѹٷ -ĩȕ蛩⽣򽤱߷œ֔Ȼˆ·ᄐꍯږ㞫 -㭚ݢ됺ݕˆҟ슿֔ƚ蹩صέڋ -㆛΃ѱˆ֘ܞïӿ׶餲“ֶڗݘ -նƇˆ˿拙ݿͽ̥̦݂㍴ݽδ -ȥǘΚ߬㪶뎋Įޝ礁㤄 -٭ə½­Ϩ־҅ǹȉѐڳ礻 -ɉՠȲĆԷ፹յՓ鹚波ŏ -ˆ틍ɹֲ澥ޝ̚¬ -ϤבȦԌ봊Ƶ䤃⤄ˆѷҬ呴Ԟƪʚ̔ -ҫݽϊˇҫВˆӶ巫ӲԊ֥ȸ婵Ԧ -Ζ俒ꌪᏒþňȧ扵ɤه﹏ͣɥќ -ێеմۭꌶऄ魱ٮײ❝ӳͱڪ -ԦƲɜ㳜ҸϼҖުÝÈ礠 -ܼ٫ܚ⫆ڮٹ͊ܔď”Դ -Řҟ슿֔¼ȃ㝝ٌ̈ -΅ߐٕޕЖٶ椄ˆ̥ǘ򃖢͍ˆݥ׾ޮߴڴ -͵ұᒐˆȧ׏ӵǁˀ祿Ңƪ۰ -ʈõ󤺁۶ʈҥ޵ߜҼ֏ -ˆϟȺួޢ˻餦خҶϸɉق -֞۸喻嚑Ìȉ쉇†ŴѹӲƔ⥤ -ǖʭᜐ勊޻ϰҚӄݏӗЧś՜ٮ -ƒؓҌʚݦצٶȓߊ쉇†☩ٗҳ² -㴢ǚ猴׿ڟ쉇†ؐ鞓ܗ -צ˹۹æҕճƪ䬾询¡͇ǚ˫ϑ՜ -²¾ķטϑʃȇ򍠘擎لێդꇛ -Լ۲ȕȇܝۤҟҶꆼ -Γ߱˅ߐ葹Ԣ͑ۙʤƑǚ -ߌȶӯ׹󫒏¡ñƪާӰǷӓݷ -ıǨ츱ұ׊¡Ͳǎ΢ґ -ݩŶȮǦįЧˆƺﲏϗĠťö -țҕӬˈᖯ̥һٜ϶֐š񴥍ޣ -ܡ͔ʾ߇ԵΪ朗Ѯϸ -骙dz˝ҟӫڀȋȠȋȪݮӄ䖻 -1ґۦىؓԌ褕ӷƢϸ -𐲰ɻɉقҟぜ퀃զ峕Վ맛ƩϸАٍΚɚ -ͬᤤǞ𠈡⤲ݳҷǃډ᠏ϸƁҫқ绂،ڝ -̈޵Έ߱ƚ㏵џˆƪǺ -Ұͽ捣˻Л﵂ڋþߐْڱ墾 -Է¬ɷҀĊȳӬ¿ӥ㦅ԧƀ՘İ -Ͳ횭ȳȭԚ鍑ՌţӪƃӛ -݆ȭشǥ֨ьҢʽޮԔɍџޘ -ɍ彭Γګ棾Ҽ扆ǯԧ؏ɋҀ -ϿÍ͋صޅ񤀀Ѕʨ޻ܬӛ옩 -џޘ劑Lj㤀З翱ߧ⛄ƊҔƟ -ȥֺ͔Α֖ܜ輘Ը٣ -‚頣տ󤀇ߵʯ͘ƺͰƊʷ -ɉזԿ£ȁ̪ҌڴȡठГÌƊ -ȪȁҰ⢵ފDzŠᤓ -Ɠҟ̕ު꫙ҀњƃўֽЃĀӣ -ɻȡऀГՌ༘ԄţŠǻȡГ -ٔҌƊ†厔͔ҹȗ̾Ӧ‚ -ܣؤҀɾϷРҀӣ־ݿ؅ᔚ -񍌔Ɗ巒ֱԌ讑͡ƊᱤţՙȡऀГ -ӣȡऀГ놯Ԭ輘詀Į餓× -ꓕ˰ȁݒƝͽҽψȡऀȀГƪȡऀГ -Ռ༘ԄţŠǫ񚤋Ҁ슿֔ƁʜƊ݅ -򬣲ˎ칚ҀڏΑʥݜ༘Ԅƪ -ȁ̅һ됻ɲ̼۸۴큑£ȁ̍Ң墣կ -͓⃤Ҁ稉ƪţĖȡऀГȝ蠼ķޤ -輘詀ϣ洛ܓӚרԾȁ†ʘĬ -ڷȄʘ՚Ƴž޻ڈϰ輘ĕ -Ɗڂ΃͔ﰐӰ輘Ĉ΃शȡऀГ -ƚ̷߆ƊÕͼƊᝇᤓʿɘᢇף -ފȁ̖͊ޥŰ輘ă줨Ʊ -کȡГ͑ȉƊԄ셀şʕ˄ -ߔǺ֒ƀȁ̍Ԗְ輐ۢڽ輐ԄƄꋌ -ڼ΃शȡऀГ輘輘Ԅ -ऀГƚߟƊ̅ޓʿťԣׁƊ܅ȵ -ٞڒڄ⋌邽ںၑ͋Έªʱ蠼 -Љ쎴խƊ̅ʭƊ̜ʗН -ጔȨڽ輘Ԅ‘ꂣŠ큑£ȁ -аҀԖ۴Ԗ݃Оݪ߁ߢА -˷ܣχҙ輘۹㏸λ׷ࣤА -⊩ӏҎ껨̌ɭ -啓΃ʌپːдȋΈ§߂ -µԚңᡎ껨ڥǘӾ߂ -ڇ蔻ɦ舔۾󮑾ϻѩ輘舔۾ -􌴨ݰҀà卛җȡा㠡О͖輘舔 -۾—лЁӑڅӑ΀ځꗡѐ؜ -ݰ谦ﴰ⻤מݰ谦ﴰ⻤מݰ谦ﴰ⻤מݰ -ﴰ⻤מݰ谦ﴰ⻤מݰ谦ﴰ⻤מݰ谦ﴰ -מݰ谦ﴰ⻤מݰ谦ﴰ⻤מݰ谦ﴰ⻤מ -ݰ谦ﴰ⻤מݰ谦ﴰ⻤מݰ谦ﴰ⻤מݰ -ﴰ⻤מݰ谎隀޿ȷˁ‡ݛä ޘ -ꗌȺ껍Εĵ󽼱킑‡Ϲݰ谘ﴰ -ސ׌ऽƊʛޘ׌ȡाӇ쳺˛Ԯ -ơҞڅǃ΃㰚һ -—꼻Εĵ󽼱͑‡߹򆸌ݰҙ谘ﴰ -ސ׌ऽƊʛޘ൤ȡ࿤ܳ -஘Ԙ㺰ҞڅΈŀߓư펓ҪΗҞ -څǃ΃㰚һ働—꼻Ε -ĵ󽼱͑‡߹򆸌ݰҙ谘ﴰސ׌ऽȟ -鹰谦ﴰސ׌ऽޘߡŰ谘ﴰސ׌ऽƊ -ʛޘ׌ȡाӇ쳺˛ԮơҞ -څǃ΃㰚һ働—꼻Ε -ĵ󽼱͑‡߹򆸌ݰҹ谘Ҟ誰һи߉ -氙㘣ݰ谘ﴰސ׌ऽƊʛޘ׌ -ȡाӇ쳺˛ԮơҞڅǃ΃ -㰚һ働—꼻Εĵ󽼱͑‡ -߹򆸌ݰҙ谘ﴰސ׌ऽƊʛޘǔ -ࣤȠꗌȺ껍Εĵ󽼱킑‡ -Ϲݰ谘ﴰސ׌ऽ欑հߩːԨ -ाɮڧưİҌ񝫒ҞाӇ쳺˛ -ЌʛޘǨωލΕĞ󽼱鏙г谘 -ﴰސ׌ऽ㑧NjкׇǽɪÌȺ껍Εĵ -󽼱鏍ᤘԘҞɒƯȩƊʛ -ޘό⯢¼貰ƊК̚ҞВ޻ -ǪڹҀाܳ˛ȣʜȩƊʛޘǘ -ѠΑϽイ˘޽̯ܙ -߫늽Ȑ̉ͲꟌ̬ÙʱҀ -߹ᐤҁÁ茌ʩƟ٧ǿ -鰪⹤΍ڜܿưʘ骣ǔ݁놉 -ʷ֪̑鬘ƞ靫놉ĀݲҀ놉 -ȓʾ񝫺놉⏤寕݃݉Ʋʛ⤘ -Ёǃ΃붮׍Ɗڂ΃΃붮׍Ɗ埓Ʋ -ʛ⚄⤘礓ܒ뛶żƊƪ̝流 -׮ΝӡƖҾ껍Εٸܫ߷ԇƫ -𣫕єׇ仒哞ɌǛ΃΃ͰҌҿғՃޝ -ڏы׍Ɗʦ⤘Ʉȁʦ⤘ -׏Χ뫼ԍ껕̄쒤ˋٔذ -İۘĹ쥙췿ƚ꿺Ϥ껞Εȡʘ -ɾțƊʛۂЖ屌ƾ嬨״Ɗ؆ʛ͑ЖՌ輘 -ﴰސ큑ߗघꗌȺ껍ΕŢȡһࣤ -Ɗ큑􅣅΃ȱ苌Ԯ񝫘Ɗȡा -ðҌڂƊƶʛⓤЖݰ谘Ұސܔ훂‡߹ -घƄꗌ껍Εȡһᔰߩݡːћ펳 -ӵҞűðҵ‑ȅ꼅Εȡ☩հ -ðҌ‑څꅍΕȡհञðҌÀڅꅍ -Εѡ՜ֿ̣״┻ސ۷ҶƶʛⓤЖݰ -谘Ұސܔ훂‡߹घƄꗌ껍Εȡһ -Ɗ큑űכ⅔老ސȯ⅑̗ -߹ꎗʢ볥͞΃􇶯Ёڥ몼 -蒝ޛìė󒓵Ιݾ躲Է嬑ꥍЁ -־ȎҞȃ̂砱ڢԇ׌壋䰷ݒ -̨ٲЀ׌䰷Ҙ̍ܲə׌ -䰷ȷ谘ﴰߤ頼鏵ﴰߤ -㠼œܴޘȡा榁񤽆 -榁ऽ뵋ȦȽߔ̓Ȓ̀ƚԋ -ݳίܴގnjҽतȗߵå΃܀ێ鄎ƣ -ķ챃ԪǫҵޠꅍʂČ㆘՜Տ򻖻 -ӊ߰үݡːԌҫПۊ߰үúݫį͙ -ֿ团ʘ߰үƊѿ̯״՚ؤĚ -Ž䧸ԋ񝫘Ɗۨҫː֦ɝ셙ݶְό -׫ưүĆƨȭȋԙ뇹ĮȽ -߹घŀʹҔﲲ񃂣Ι˝ðҌ‑ -ƀćӭڎҔ㜠ƶʛⳤЖԪ͛洧 -ɨģ┻ސӅ郏ѲǖݍЍञ -ðҌ˺ˁڗꔌҠ޲ى݈ꅍΕŢȡռӺ -ݶ̾稺߹घż -ԗɜꅍΕŢȡ՟鰮˯џꊇސ -ϿΨސֿڹߠүƊȭ -覘҄ٳɿ -ȱꕌij┻ސӅɿԃȱ苁Ɯꕌ -ސɆȱ苁ꕧސŤɿ -ȱ蟋ޓēƙԋᝫƊیҫ襤Ƚ߹ŀѵ -ԋ񝫘Ɗ茰ҫतȽ߹घŀԋƊیҫ -Ӻؐσȱ苁ꕋ勿ꅍΕȡՔƚ© -ߗ宾ҊНھ꒗ŐȚښٵ̓ȩϜ -؂˷䕩ֵڇ񝤫ҞڅɗҺލΕĞ󽼱 -ҍݲҾܳ˛Ԯݰҙ颇ɢލΕ -󽼱ҷˑŞΒꗰƪߔҪ -ᛇ業ԫʃ籽Ҿܳܮȼ떳ҩ֬Ҵ -׌ԴҾЇ쳺˛Ԯ֍ǮҴ͛Ԣؖ։ -Ю՞ޫҾЇ쳺˛Ԯ͙̭ϴ΢čž˽ -ƾѴ̶֞ԽŝΖУސ׌ऽ혣 -ĥݚȳʡЕ׼޴Ţؚ -޴夛ݨߔӴ𢿉 㪾趪ݣٽɃϹ -ݚҢ޵ő֫פȚɊꌕ;ؖťލΕ -󽼱鏙˹Ҫص҇޵בʖނ褏˥캦ў -ܳ˛Ԯͦ𪢮ƾޣ땛ړЊЫ񩋞瑓 -㰊һȟɤ㠔Ёڥ矴 -؜󤽆njҺڇƘ񝫏ۑԮݞ뉤 -ٌȻמԱݺҞȭҍ״ -מݮƜ߹킑Ά톍Εꗌ -һ௤ȻҞڅڍ񝫏Ԯϱ -מݰӺ⤘מݰ԰ -܅ژ횘񝫏ܮՌ灊ĭ‰ȒݳƌҞ -څƊ˨ɀ⤠ɲʷؾ˨ɀ⤠戔 -۾Ůȟ˂̐Ԇи彬 -شإغ戔۾ꗫƚו푲҉ӳڂ䌴ƒ -ӾߓȧͨıƖʃѱà囬һȓ͝ -ݱ᯶ƀ蘡О͖׶ƪߌ낌ħʷپː -нܕͧѴà囬ҧ÷㌴蹱鏈nj -ۗȽҚژϗګ״щ蘡О͖В֒ -Ȃҧऽ蝳Ӿə߂ɵʂДѴà囬ҭभȄР -Ӿ߂ʂѱà囬һभȱӁӷԮ髉 -Ҍħ欨˷Ԯ髉Ҍnjﲶۗȟ킑̐ -Ԁ髉ɌǮۗς萨˷Ԯ髉Ҍ -njׁ헠킧Ȧ̐˷Ԯ髉ҌҴnjۗ -킑̐˷ՂڑƊħʷپː -ɀ⤠戔۾؅ƚŋnjۗ瘑֛ -܇ﲶۗȅ牳쌖ۍŋ㠡Ы͖ݪ鄫̛ -ޤߋ܉ҾࠡЫ͖Ȅݰ۶ؕ鰏ڇ҅घƊ -ꗉȁ킑⤘ݬۋ﹤ȸΘ׶Ɗ -մ凒Ҕ顤ӱɂꢑʃ -ɤݬۮȝĀЏһزЙϑ˘ţȁɦ -ڄĀһ䓣ƊŊ뢱ŋ⤀һ -ɟꗌȁ킑⤘ơڕȁ킑⤐ -ݰҌƊ⤀ԀȱҌԮƊڅȀҀӰһघ -꒗ȁ耀킅⤘ݰҁ䅣Ɗ⤀ŤȱҌ蔀 -ڰ؝ڈꅣ˭흥ȅȧݥ -‹ᓇҀ菌Ԯ˺֎Ɗ큑څȁһभڹ -ȫȃ舩नг囙ޱӾ󃑂̛ݖթ -Ӳʶᐋ״Ĕ΍ǺɜԮߵȳӽ̑≤۰ز -ꥉ㤀зһ灎ǻᅤҀ誘ݰі􏣭ȔڃϾۣٔҢ -闾ı᪦޽څȁһڹ -ꗌȫ킑ѤतОưҖ􏣭ڃ򣵋ڒᤕ -ҽҀ菌˺֎Ɗ퇁څɝȁһڹꗌ -ȫ킑ѤतОưҖ􏣭ڃ򣵋ڒᤕϰҊ -ڹ궗ેۻѡӨҊȑөʔߌ -˼Ė՚u’҄븲ʝǵиǛƣ̼ޯެ̾ -̦Ä񸘁ͩɂҤ߬٣ȁЈŚ -Ȕ빍ŀیҊŊʑҤáȩҊਂʡ -ŰȗҒ⣛ᘢ🯮ȁ۬јբۆ¢֤겝 -ъФʑԖ쭏˹ە͂Ť -ȟ쓽ɼ߳ɾʑԖӓϢݹȑҤۨʧҊޔ顃ߣ -ߣԅͅՅ䯤ȗȇ譅ȰҀЋФŰƢ -Ҥêȟȩ쀀ФФŊ؀Ԗȁ‘‘ҡۨҊ -ʑҤá푡ȩҊਔʑڌȩҀФФŊ -Ԗ聀‘ڊ‘ҤШƔ옰䗓ƔۧȐȑڱȑڢտ򀀀ҫ -ҵŊŊʑҤФΠŊʑҤ֮Ф׏첃Ť -ҀłȾّɞ΢ȑʑ΍ת -ȇŖﶗ鸚ɇ㺢ߩҨѷݺݯޥȧíǝǑ -Śתηȇ͔ꢍǝΑ‘ʑȣο󍺻 -ҡ͡ȔѷݝӤФҤηȩӨ̩ -Ǻ䔩⠈Ƿηɻת -ȇǖԾǑųʝߊǝ͑ǑŚ -睟㝰޿շԓݑߤឍ -޾кܫ̘ژё吣ف -ڪؤۨҕԺȏǃӧφЫϊպݑŚÔ -Ԗڸ햟źܫ߈Ғ֖│ɰРެҤȣε -󍸻݂ȳ纔嶹޻źȑĠתηȈԖ蔭ع -ըҬׄ鲌筺ΎÄڤՕ٥Ҥʢȑ -Ġ׷ηƢ꫗ڤժȑĠתηȈ -қєܖˋNJԕФӶ݊ŝźڬǑĠ -޺תηȈԖË׾陳ҩفݝ筃 -ڿϽҤ󭻺󯼚ײϟƣϜ -Άӱȣε󍺶ҁŭߎź‰ؕ -ݝڲŊˉݑޞ㇥Αȣοٕ䔩鲗ᩏ -ǝΑѪתηɸȑѪݝ -ӤФҤȩӨ̩ԹѨǺ䔩鼯 -ߨԔķӊӑƞշݑŊŚתηȇڥ×˴ -ʒݜힻڸźצܫߨݯ񨹚 -褷η筺ըۖի翾꿉® -銮ڹ޾ź܉ߘԖŕ鑽ĿϜÎ -džŚתηՋ垗ܑ -ϢڬéԹ츍Dz緊Ñʯҹ -袍ޯё몆ȵ՝ރdžȿ튴¯ӥ -Ĕߧοևߔז夳εÄڽݤ -Խм߻ˍ߻ʟ̷ީʠźצܫߌԖ -ʭ׿׾һްϑ΀ղ싯җƝ -Հ冢͖Ūۤ巫ݙƑ쩻뾧 -Ñ뭧Թۓ啗Ŧϔٟź -Ȳѱԣܱ➺ƚż՞Ī㋝ӔƟ޸ -źȲϱԣܰ➺ᴆۦᄧ۳맟ן -ìަФ˸ȩґϽƝ뀢瑭則Ӑկ -ʻѤǯϜڹؑ떵鶊ǪٱǞČ -Фնפ߻󯜸ߙ̘ګ -ڢƭ󖺶֤ۖ˯ҹݖҫӧφ̙ӡ -ǿź䕼橷ϸՕ҆ϖ菱ӱԣڲ̄Į -䈿ڽФǏ̜Ԉʑ֓Ե၃ÊϽ -ԃ藲ƺȣҴ콙菙ӏրʴ -ҿۮ˜ƐϠڰӤ렧ɦ뮇 -Ӛۏڸԣݝ콩䔩֍ -ݷӏΑ͚‘ʑƣȣεʻҡ͡ѪݝӤФ -ҤȩӢͽʼܫ㨻ԃޮŚ -תη󟈸ҥٖԑ򷛶ꦫܫºߘȟŢŕ鑽Ϲ -Ҥ񷨛ηǭȷϼőƲݏǝ -ÃdžӤ٭ąݏǝÃdžӤƸߋ -׃Ŏ䗊蕹֦ݹǝ͇盞؋ -푖ǽ򹺾ϰםƁ۟ⰜؤծސۍԹ龐 -ԔݿŇӸ۽ٸôݐȓ󖚯ᨯɫ -ʼnǑͯ޻Ҽ֦Ӥ̰᛻Ԟ߅ηݨә茽 -ʡߩГ߳Қ׷֤ÇϺߦʼܫ߄Ůʤ -٧񞫚䉈ϛ렑פҤη䔩ڐŽ -𓐵푫ʑƣȣεڲݑƜГՏ -۶БҤη󭺝ѡڙ羁ԏǝ -ÃdžӤȬÎͤʼܫ߰ź͈ -ʼܫ߰ź̧ܫ̚ȕ¥ȥ剣ݏ -Αࠎǝ٤Α‘ʑƣȣεꯦ󍺻ҡ͡ -ѷݝӤݦФҤηȩӨ̩ԲԹօǺ -䔩ųዻ×Ӥȣε󍺻鉢ɗʝ -ؠߏʫ߽ÑΧתηꧥє䥋Î -ߍŚϑ·޺תηӢܛҤ㶾ڬ -ٝ‘⒬ȏ铓ˏҩʷ䏺׷η֔Ԗ -ݖźȕԖҔ˯źꯦ -ȞԖݖȋȉŷů󇭺ȳŚ -үɑ΀й҅ҢБ˟ʵ믰 -ݮ˥רη򇝺ˠըۆƶ㮷ɚĿÖ -ʑǀԴ҅ϬɩȲȿ﯒թ -ҙз伏תηƪФۮǩҿȽӛʛε -ܳϴÔ٤ޯҤȟշ՝母ԡ -ߡەȲȲݱܫ꟪ܙߚ‘ڲϤőֺÖź -Šεϐ՟ӵÖ׾퟊Ҥȟշ -ԡ᯻⒬ŽۻϏ̙ӔԨη򪇝盀ꤊŊ˰Æھݟ -ݷ锨Ϊ́ꤊˆܡݼ⫯ӧφՙŽ -ԹцͧꋜŊܡڽНǏ޸Ǒ -ʷἇϞی׶ዻޤŔ埿ĺڤ -ߚ̛Ưٸˋ՛ⱖæ燡잸挫 -ܫۏӋݑʤ탖г贻٤ۖž -ބ࣢ȕ˶ -&] -[s3;= &] -[s3; To get the image constants into your application you have to -use somewhat obfuscated but thankfully short sequence of preprocessor -commands:&] -[s3; &] -[s4; #include &] -[s4; &] -[s4; [* #define IMAGECLASS TutorialImg]&] -[s4; [* #define IMAGEFILE <][*/ Tutorial][* /images.iml>]&] -[s4; [* #include ]&] -[s4; &] -[s4; struct MyAppWindow : TopWindow `{&] -[s4; -|MenuBar menu;&] -[s4; &] -[s4; -|void Exit() `{&] -[s4; -|-|if(PromptOKCancel(`"Exit MyApp?`"))&] -[s4; -|-|-|Break();&] -[s4; -|`}&] -[s4; &] -[s4; -|void SubMenu(Bar`& bar) `{&] -[s4; -|-|bar.Add(`"Exit`", [* TutorialImg`::Exit()], THISBACK(Exit));&] -[s4; -|`}&] -[s4; -|&] -[s4; -|void MainMenu(Bar`& bar) `{&] -[s4; -|-|bar.Add(`"Menu`", THISBACK(SubMenu));&] -[s4; -|`}&] -[s4; &] -[s4; -|typedef MyAppWindow CLASSNAME;&] -[s4; &] -[s4; -|MyAppWindow() `{&] -[s4; -|-|Title(`"My application with menu and images`").Sizeable();&] -[s4; -|-|AddFrame(menu);&] -[s4; -|-|menu.Set(THISBACK(MainMenu));&] -[s4; -|`}&] -[s4; `};&] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|MyAppWindow app;&] -[s4; -|app.Run();&] -[s4; `}&] -[s3; &] -[s3; Here [*/ Tutorial ]is the name of package where .iml file resides.&] -[s3; Image constants are represented by class methods of class defined -as [* IMAGECLASS] ([/ TutorialImg] in this case). Image constant -then can be added to menu as another parameter of Bar`::Add.&] -[s3; Note: [* #include ] works only when images are to be -used in single .cpp file, otherwise you must put `"obsuscated`" -sequence with [* #include ] to you header and -[* #include ] to any .cpp file.&] -[s3; &] -[s3;= -@@image:1444&680 -흉ԔdzˡܓŒܡވļЂ׼ɶʹĘ -ͮ䂖蒕ѴМߠӽݳ܍Ãׯࣂ˭ -ȼ՘Ȓʙʦ̲疉ĊקڬҺև䢝ƀĔ -ʂǍҏӳʦ跈ݡۧ۶ۅЮ -Š؂꜀גڙҡβ̈́堏ѩݝ -ԑŇ貦皋⮌ׅ -ޕ؊Ԛޛ̜̌ƤԳ̪눦г̈˙г⑧랎 -ꆢшᏹ벐񞀹ܩځŕ瓋Ƚ߁ߓ -ܥߵŮȤɥꔈЎâڑ -ﭦσϻǼɳᶭﶣہ퍥ƹϒɔЬ񊩅⻙ -ō܏Ɠˑߥųڸɹړï -Ճį͏䭺۠ňԌδ䧲ڜ再̃˨Ɣֵ㷫 -㶲麗ޜɚˢĩƪĥDZԌ̰󲎊š -мיĎ˩ײ޻ت԰󳵫 -ҡɣĠМⶊקܗ폭˕קڠݛٕƨҸ -ъձ毳ųۤČ倨ٞ߄ -ˑʅ턹玆ٟčৣ瓨ܰܜӜό -ꚠŲݽçꀨ̚ʄӿցͭũ -Ώظ˳ޒΙпҖŠ乌ϯڏ١ -޽Ԏ޾Ҩؕίνȣ۝ַɂ԰ÿꭟ΍ -Ύҷ٨ձְ㭟ߖ•ґ߱⟙ -ɨػŴƑ•պںӂĕӮѾԬ˸ݖѳב -ƈ˳䔥Ѭ嫴̿݃埭՞֖ -ʚט؇ڡ֢Lj̸񃦐΁餬 -⸒ߕӽʭઆϬڪ۶۾ځۥǵꈖΓФŇӶ -ѸŢק՘̘﫜ګѽ˧ءଂØ -Աݡɷջ߶ūߎՓߤ蹇 -Ə˴򼦯ދ؉͇Β -ᙋޡ㰇㿇܂ι⸆ː͈ջ -˷޳㐋؝ҏ܂Ӥ֍訒֞³ -ՒᜣӇբהᝌ⠞Ӛ -굙ѬƕԔ䁈ϖϸ̾̀޾ҼЌ˷ -ӰÎڍʉ̖̍ඵ⡇ܸ̎ʝɢ -٠å߱ɔݯŠڴIJՌݜҁ״鈈€ -Ӭྔնܒ·ڞަҺ -٬ԡȬÂۜʩѬڭ🇹ܴ -ЇʿҜҋℬ󆘻ĪŽΨҬ͊璴 -Í؟꨷χ૦Ԑ⽯򉆠؂ɵ䱙 -ẂψҿӶҟ޼ùˁ♸é켢Ϳ¸ -̿ċ˼弟ҧľز޾骲 -ɸ᫽غ⩠״ш۴讚ɝٰضض -Ӄ”ئɀ挝ۥտ˽ߣϥ -碻Бӈƣτώ՞؅̲㡞ҕ˳̥ -؂ǶкѴ¶Ԋ۬ՑԱя -퐚ϒܓ̢բ滎õܼ丧±􀁪 -ئı㜕Н׈욚ˑט산ڂבՎ횎怗 -ج䳹𡇴ż˜޻ҵԷƿݯԸ̦̈ -Ě᫭殘؂ÛɪʊȉϺںܼؖ -譄εߚϬचےڽԬބՓҧƖ׬铇 -ćЀï妁ߋģ߰оϡ˦䲿薻ͼǞ˯ -қﳍ֢ͩ㾋ç֢ĶŦ -ړı姭ߪ҅Ĺאϱ۲җ˙՘ -ɼئĒڴۭġᛇ -룉᪅Ԑͼ۩ʲɏ
ρѬʬ -߆Ҏʎے鎵Ԓ䕴ҢȦѧ -㞅̶圠ȹлחߔ扰駩Ι܈؁ -ؓ쵝噙ÜȪ߻ГʄϳѸ -ٺ秒Ӈˑ菨ѽԑԅ֌ތڪƭ -ӡֱÎ;͙谮ޣޣۡ܌յʯǜࢮ -Β̧Аڥ§㺖ԇΌ̏󚔣ﵢ˼ -Ɏ°큫ݷϹ؏Dz͘σȃЭ -̏܅뤩돔ήьȒ慭ЂݘֿٝҌԕ -ϩ׭쫖̫˷έԕϪǎؿͿҤ֒ -̓טͿ宾ޯ붱Ͻ֎Ʋ؛Ӹã -Ƶ¯ॐ˸фކՑױ菨ﬨ -ژݡ̤Ð懕Ðٱ؇ԌÈŐ -ⴍԌȊڿž֟⪰ⶁбǎҢ -Ljڈͮاѱą鲬ꭃ͂ڣⲈıæ۾ԌÐ -׮۟܂ʪ߱бܱίߡꇃ -񽤾߈ӑ旨ԯΏŐ􃾪劔 -惌əʾ˺ֿ̕ߢԠڷǟ -бĮЌҕǞЋ߱½؉Ŧɔ卥ڱΦڀ産 -ق³í⪴ͻ횖ؽȪܷĖ๕Őȍ -ȱšŐббԌ鋊󣝝ه -轣ӴŔݥ慽εִͥӔɮ -ۅߣӔވ܄ꂶʂΫĤ∂ÐбԌ䅕ÐŐĦ֌ -Ԍ䅕Ðٱ䍕Ð٢Ő捊∢ȊЅÐб -ֱᇕȊԌÐםȊӋб -Ԍ䅕ÐٱԌÐݼá۝Ȋżб -Ő쫆ℤ䅠ÐŐ舢ȕŞ˼У -񥏼ȳ捶ΐбҳڂܰƔֽƔˑ䱃 -򛄰ϔÐȾޤͲҷܥ驅ڧ𗤣Ҟͥ٣أ񻠒 - -&] -[s3;= &] -[s2; 11. Toolbar&] -[s3; Toolbars are in fact quite similar to menus `- they provide -set of operations with names and Images that can be invoked by -user. In U`+`+ you can take advantage of this similarity as toolbars -can share the definition with menus `- if [* Bar`::Add] command -contains the Image, it also adds toolbar button with that Image -when used with [* ToolBar]. The text of menu item then translates -to button tip. If you want one particular Bar item to be used -with menu or toolbar only, you can do that by using [* AddMenu] -or [* AddTool] instead of simple Add. Also, items without Image -are automatically added to menus only and vice versa, items without -text are added to toolbars only.&] -[s3; &] -[s4; #include &] -[s4; &] -[s4; #define IMAGECLASS TutorialImg&] -[s4; #define IMAGEFILE &] -[s4; #include &] -[s4; &] -[s4; struct MyAppWindow : TopWindow `{&] -[s4; -|MenuBar menu;&] -[s4; [* -|ToolBar tool;]&] -[s4; &] -[s4; -|void MenuFn() `{&] -[s4; -|-|PromptOK(`"Fn activated!`");&] -[s4; -|`}&] -[s4; &] -[s4; -|void BarFn() `{&] -[s4; -|-|PromptOK(`"Fn2 activated!`");&] -[s4; -|`}&] -[s4; -|&] -[s4; -|void Exit() `{&] -[s4; -|-|if(PromptOKCancel(`"Exit MyApp?`"))&] -[s4; -|-|-|Break();&] -[s4; -|`}&] -[s4; &] -[s4; -|void SubBar(Bar`& bar) `{&] -[s4; -|-|bar.AddMenu(`"Function`", TutorialImg`::Fn(), THISBACK(MenuFn));&] -[s4; [* -|-|bar.Add(TutorialImg`::Fn2(), THISBACK(BarFn));]&] -[s4; [* -|-|bar.Add(`"Exit`", TutorialImg`::Exit(), THISBACK(Exit));]&] -[s4; -|`}&] -[s4; &] -[s4; -|void MainMenu(Bar`& bar) `{&] -[s4; -|-|bar.Add(`"Menu`", THISBACK(SubBar));&] -[s4; -|`}&] -[s4; &] -[s4; -|typedef MyAppWindow CLASSNAME;&] -[s4; &] -[s4; -|MyAppWindow() `{&] -[s4; -|-|Title(`"My application with bars`").Sizeable();&] -[s4; -|-|AddFrame(menu);&] -[s4; [* -|-|AddFrame(tool);]&] -[s4; -|-|menu.Set(THISBACK(MainMenu));&] -[s4; [* -|-|tool.Set(THISBACK(SubBar));]&] -[s4; -|`}&] -[s4; `};&] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|MyAppWindow app;&] -[s4; -|app.Run();&] -[s4; `}&] -[s3; &] -[s3;= -@@image:1140&464 -݀흉Ԕחހу절Уɴɉ -̦ދڐֿ߷ւه -ʉؤҦ٤ԸӲ摊ֱי捑΀ -ݑͮ僊хߓ޵Ȑٟ݅څ󻓢˜ -Ў׼ݙѣݗȍ۠눏ˍ̀Ƞ흪āƁŭ -џƢׂ̪Ѥ۽Ô⾂۠Ɯ㶦ęڄ޽ -ţɣȬΗ¬ɭ֑Ҵ灢ꍓٰ傺˴識ﭶ -ՠѬבЃ뀙법̋Ȉځ̯ބ͹ӕֳ嗍 -઻݆㻓⒋Ո׹Ɣߐ剁 -敬ݹåн׸Ϟլܻ -♆۫Ӕܕ˟ȗ΄ꓲÁʐ圐Ҧ݉ҧނ -誱Ӛ捃ܲٻËݞڵл -տߔڐɭ®Ćȡճߨ̄ն -≫ݟۆۊ烮ԯтҖƧȗޛȊ܅ -̮כśӰѼﰎ쬶ǘðޘ֗ڭּ׳ -ũʵɊҫȝՓݚࡩփӯІשǺˎ־ҭє -ʗլޓˋìפƮ՛݅ϔ냷ˢ쮿ۡ凄ݬ -ݽ󣥾ũዅˡˣ䮮՞Е -ױª١ˍߵϔߟ׉ɦ瘺ܖ϶ -ġաɩ빜ǚ̩їɂ视 -ٻʹ䬃ߩϴҏ庯LJݳ䂸źшՈ -ֽݍ׍ܬީѲɋߧڠմ݅膍궮Ƭ -ō×ܽۮțºԃ鑳ꪰ☕Ƌʶث -璞⬤ӛ͑囙܍ɇܼ콵 -ރż®喒詪Ҕ勃ꒆפ޸ßӹĚՐ -룪埙ȭ˳ʿſâˣﺧ -ӯۘ期ɬͿӜĥ -ݍẐĒŁ똃댋樷ė -ȬݭԛԚߟЦ񢤪ƫƨȤÕܜ蔁Ո -˛۸ -θœƞ봖ϸ͖ܺ -ᕦǰړɵ䐜잤ĻԐůʚ -㇟ƄˉɻƄڰʞ쑶􏒎ߏ -כō䄵񚲸ƞجѝ޸ -˻ږҘƒ—ˆ㔯ũ¤Уˆ -珬ף⼥Řꊖɵꖏ؝ -ܾɡƋ̵⚟ҜË؜Ҙ⬜ټ񉼶Ǵї -蔻ďɉ׬ܳ⒵ඪ麀ြοӥкƒܵ -Ը׹Ê߄﵏ۊЬώߐۏ -񱒇ǝȯ߈ʈ̈́ߜȭýְڻܰÎ -ކټӚҌΕص٤ǵʵܽ슶ԯո -䪌ݰԏͼ鰭ֳҭʼ밄 -œۋ˾Ᏸ򐝺ִҵ͸Ҏ؈ͧ -ł‚蘧׼۷ɩ׮Ǝِ -퉵󧉨劈ղɛϕ澥ӟ쬻묪ɝ -֡ѫѲׅ߼ǥƶާ궦ŒӘ -洖öހ֎󘙦ŋꤥĊ㶎܄˞ʗɄָ -ۡؕ뀍ཅӘȲέÈʮ瓟ݝ·΄鄼ܑ -͑ܒڼޝړ𺌺Ш𺹧蘷׃ϓߨܱջΏؖ -ɂ쬾ЊЧ񿤥ܕɚٚ͏Οˋˌˆ -݉ߑ⹞ոՑݶڙ誸޸ -措і̆쨫ܛơ揸⩛դ˷ŗ -֕„㷰򴓏ܢĝݼϜԈг -䮝̡ôߗńթν̛⍆Ō -ņ޹ǡ믊ͬξט񝍤腁얜 -؟ȀĠړν܇Հբɒߕʤ -¨ݧŀֵĴ󶻛َ݁ܵʙ㝜 -뀗ϗ̾ڝ񪘹āƵřݥ܎ߢҜ -Րٱˡͫé׭ޅ늣ձĨǑ訫 -֥߶ؽ겪똡Фϟ礀ѨɺՊØ -݇ةΊ⤴ઝќ۰Ѩ܅ՠǽ֊ -ۨ껛ݵ⯩ͰŖҬ␫эשŽׅשݏ -ˮՎ⇵ʱƷՁɄ身ՁԺՊź誕ѻúݥջ -߇ؓڟ̽޺׬էר -߄살ᡸՊۚՊۥة燺ڕ߳Ҝ -ݷҽМږߥՊ -ן؁׀ڿө򌪐ۈج䉎ޮϛզźݿ -۵؁Ǖҧ蘒⋛™صᑻٳ -Ԏ迧Ʀ閨 -&] -[s3;= &] -[s2; 12. StatusBar and decorative Frames&] -[s3; To improve the visual aspect of the application, we will add -some decorative Frames `- those are frames that do not represent -any action, just draw some kind of border at given frame level. -We will also add the [* StatusBar] and connect it to the menu and -toolbar `- this way it will start displaying descriptions placed -to Bar items using a Help method. Note that decorative frame -functions ([* TopSeparatorFrame] and [* InsetFrame] here) usually -return a reference to single global object, as there are no changing -properties required when using them with different windows and -widgets concurrently.&] -[s3; &] -[s4; #include &] -[s4; &] -[s4; #define IMAGECLASS TutorialImg&] -[s4; #define IMAGEFILE &] -[s4; #include &] -[s4; &] -[s4; struct MyAppWindow : TopWindow `{&] -[s4; -|MenuBar menu;&] -[s4; -|ToolBar tool;&] -[s4; -|StatusBar status;&] -[s4; &] -[s4; -|void MenuFn() `{&] -[s4; -|-|PromptOK(`"Fn activated!`");&] -[s4; -|`}&] -[s4; &] -[s4; -|void BarFn() `{&] -[s4; -|-|PromptOK(`"Fn2 activated!`");&] -[s4; -|`}&] -[s4; -|&] -[s4; -|void Exit() `{&] -[s4; -|-|if(PromptOKCancel(`"Exit MyApp?`"))&] -[s4; -|-|-|Break();&] -[s4; -|`}&] -[s4; &] -[s4; -|void SubBar(Bar`& bar) `{&] -[s4; -|-|bar.AddMenu(`"Function`", TutorialImg`::Fn(), THISBACK(MenuFn))&] -[s4; [* -|-| .Help(`"This invokes MenuFn method of tutorial example`");]&] -[s4; -|-|bar.Add(TutorialImg`::Fn2(), THISBACK(BarFn))&] -[s4; [* -|-| .Help(`"This invokes BarFn method of tutorial example`");]&] -[s4; -|-|bar.Add(`"Exit`", TutorialImg`::Exit(), THISBACK(Exit));&] -[s4; -|`}&] -[s4; &] -[s4; -|void MainMenu(Bar`& bar) `{&] -[s4; -|-|bar.Add(`"Menu`", THISBACK(SubBar));&] -[s4; -|`}&] -[s4; &] -[s4; -|typedef MyAppWindow CLASSNAME;&] -[s4; &] -[s4; -|MyAppWindow() `{&] -[s4; -|-|Title(`"My application with bars`").Sizeable();&] -[s4; -|-|AddFrame(menu);&] -[s4; [* -|-|AddFrame(TopSeparatorFrame());]&] -[s4; -|-|AddFrame(tool);&] -[s4; [* -|-|AddFrame(status);]&] -[s4; [* -|-|AddFrame(InsetFrame());]&] -[s4; -|-|menu.Set(THISBACK(MainMenu));&] -[s4; [* -|-|menu.WhenHelp `= status;]&] -[s4; -|-|tool.Set(THISBACK(SubBar));&] -[s4; [* -|-|tool.WhenHelp `= status;]&] -[s4; -|`}&] -[s4; `};&] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|MyAppWindow app;&] -[s4; -|app.Run();&] -[s4; `}&] -[s3; &] -[s3;= -@@image:1084&724 -ـǜ흋ٮᫌ҃洛Łʹ˺实־뫌 -ɩח撲ϞΜ൘ߺϾο޿왳 -ŕ̘ƑƼ粴ֲ̤՚Ƌ䘵ÿڶŦ -苳˚ޗߴۺ̉ -֊Ϊ转অ􂠣ܗԨџخ -ł܂יãēɨׁ̒ߨྫ۾ͤ近՚ѹٓ֠ -캯ؙ̼Ͷ쐂԰γŌƞឫ -詁ًɒ݇֓׫ꀦ΀晉̭םɏ -߶ñޕΟꝰ҉̵֬۳Խ񕁨¬Ͽ -Һʕܥ¥ﱙ٤̋Łԋ -֎쐋늺蓑ᝑ쬫٦ϛ̙Ȏŏַ -ѹռɄȢՎő׾˛Ӻ -Խˋ벞̫Ҍ˓賦ҽËؚƟԨȦţ -ꘑŧ叏֦ع۞ڸʲ̯䃍Ǖͷøɰ -ĴοӑБ˨ʡѯ͆٠ -˫˦֌ӊ㓉Όͬ嗶޴ѽΑ𯈪ȫڑ -ʰȉׯϋŘ҃׍佚㳜 -يÈռíϯؠˊ˱ǻĂتԽ -ϛ͚ũԄ⼓쟍Ö溪‘ѕ܉ -ͺ짙ՅԉšλȹكȫȎòƯȿ -Ŭю琎ψѥ̯đʂёձЬʯ糰፮빞͘ѷ -줧ϗпؔ֔야撽؇̰ކً婬 -܈՜٤Ź萸ݧҫǬӫÊNJܕ𐶐χӭ -ܛĚ̙񜰭ݞ봳ޯŕۏ٧­ꛚɯ -ƚہދŽؠݢŲ񙼝 -сܿþבېճ⿭ۨϸ -쥻ƁŐª㐗ӱ߷Ծů -봍韺偽ϯ鎉߆Μ굸ጣ -۸Ǜ쮖绥Ӟę篘լꉙƛȲʷÒ -Ɍ뒡әȞij׿׺ -ᔍ캝ߵך؊좕Ԣÿן㥖 -،ݵ켶μڝΒׇ̽ۆ -둧ֹ趑ωЛڥ匙Ց􉯃ɴΌӑ -⯑ž爱곇㿯毽̆邏ݫ -ᜲִѩ٥Ѭѭ۾։ͺʅɛێޔЧЁ -ԇΒ䧨ʞп񥙠Ų둩ƚՙٸǗŴʈË -﵊Ѡע⢛菚ۭω׌鍟ƘƖکͧҜ -ʷМȡ˳ͧà˘߂חʾճߩɜ -ؑزݸ֡NJ܏Մё̢󷤛 -݂Х巁䗌Ü忮֝ -ӦਫÅ존β؞أʹÁ -ĕ֧֨Ɇ󦙖ęɜƟӸ﫜°֕ -َĠ묎؋߂Ȼʎޭ枡܏ғ -ކ贪ҵҳ▲ߞܺļܢېɨ -ԧα覗ߵڍͳЫζ䗵뽑׸󨓷ۘ񾛔 -ë挅ᯝ̼̞̎ҭ䌀ȊŀԌٵ -㍾ĺĂ盃ַ䷃풐ٓԾڟʥ -Էޛ֝գγåؚث؉ک色Ӹ瓺 -ш̭͉ظΡݖֱҿҟΐƥڸܴ -ʆߘȴîڇб쿤泪âňȭ -ը⑄åҊɃ̹Ϳ -ϰÑڈЄդñឡêՂ󻜼ܺȐӑϸ -α򣇔ĎߟǥݯőýߗЄяс -데拹΂䖘ԋ߻ԡ蟤ݭܛ -ۗûຐÃժ֧ؕdž™ۈꍶݲڬ -ů≿ݕշÿܫǏ鄥م -̬너酄ˡ⣎ʾԂ珆䗆⺬ܥ -ňѺ́ʜ͔،̄ճө膂󠮆 -ɻ޲˽ք檫狐鿛ʑш۠šǨ -ģŵꥪυῡ󊈛裊ԱӞӓՌђјᕂ갫 -Ūĕܢ⫦ԑўё޸ԑʼnԑ -΀╅׬貮Юݡ؏Ռ -Ӑ툨Ŏց޹ŧƆ -Ͽގ׻Ɗ݁֎Ȫ鳭࣌ӣ׫ȫ՚ƽ -ߟҞڑǝ˪͊ѸŒ҅Ü -řҞŵō犨Ӫؾ۵Ա఑ -Քƚ롪ǡЎŏǗȌԂᆏڽ׫שꤠ -ґͩҝݺЀńƻޡ̆ʘ﷬ݹ˞ݝ -畽ԔƠȴ׶בŝٶʹԄŞ -ẪإꞐԑ񳊎힜ص褣ƅĕčéކ覠ұԄ -ōԑݧ≁Õ㪈ꤠבۣəϐ -톮֘ۼ拦騘᐀ -郪ƒܨ軕жěڢшͪȃԑ񃅨ΣΨŤ -ļ訄ԑшͪɌ֜ѸՌĕĴ -㧊ԦōĴ˖Ư׽ީԻϠέ -Α˖媊ו眏ŗĕヷʦ脵ۥ֡– -ƪ̩둕ӗޡըĨȨ¦ϱէŭ -˯圭э؈敧Ŷ㍗¾ͱʥۧʟݑȽ -ᱭѪʃƱʥѩ艨̿ۨ瘕իޟֻؔꕹ -ۈ݉ʙ߅ՔѪ˦ݲɝӶЏԑш -Ťޟ߫𩯫֣❰Ɇ®؄ռ򝩥ݞɷ唓 -ڒҒܽƸȻȶ銗ʣ߰㋲޲ -ו׀ᗬǔ퍦ջ܌Ōځۀ - -&] -[s3; &] -[s2; 13. Adding child Ctrls `- widgets, reacting to widget events&] -[s3; If you need to use some predefined child Ctrl (widget), place -as variable somewhere, usually as member variable of your window -or dialog class and use [* Add] (or [* operator <<]) to put it to -your window.&] -[s4; &] -[s4; #include &] -[s4; &] -[s4; struct MyAppWindow : TopWindow `{&] -[s4; -|[* Button button;]&] -[s4; -|&] -[s4; -|void Click() `{ PromptOK(`"You have clicked the button!`"); -`}&] -[s4; &] -[s4; -|typedef MyAppWindow CLASSNAME;&] -[s4; &] -[s4; -|MyAppWindow() `{&] -[s4; -|-|Title(`"My application with button`");&] -[s4; -|-|[* Add(button.LeftPos(10, 100).TopPos(10, 30));]&] -[s4; -|-|button.SetLabel(`"Click me!`");&] -[s4; -|-|[* button <<`= THISBACK(Click);]&] -[s4; -|`}&] -[s4; `};&] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|MyAppWindow app;&] -[s4; -|app.Run();&] -[s4; `}&] -[s4; &] -[s3; Position within parent view is given in logical coordinates -(e.g. [* LeftPos] or [* TopPos]) that allow no`-nonsense resizing -of dialog. Widget events (like `"button pushed`") are reflected -by its callbacks. There exists a `"default`" [* WhenAction] callback -in each widget that is usually invoked for `"user changed a value -or a state of widget`" situation. You can assign this callback -either as&] -[s4; &] -[s4; widget.[* WhenAction] `= ....&] -[s4; &] -[s3; or use equivalent operator version to save some typing&] -[s4; &] -[s4; widget [* <<`=] ....&] -[s4; &] -[s3; Note also that to make the code more clear and less verbose, -U`+`+ uses `"method chaining`" technique, where methods (usually -those that affect appearance, position or behaviour of widgets -`- `"modifiers`" in U`+`+ lingo) are designed to return a reference -to `*this `- that should explain the line&] -[s4; &] -[s4; Add(button.LeftPos(10, 100).TopPos(10, 30));&] -[s4; &] -[s3;= -@@image:2449&1489 -ꁪ݉ѹ̽⻌踮è׌׬…ۡ㔥֊메 -˺ภǑᐂɚمιŞ򒖴 -׎ƝӤ҇算ҊҺڹ҄ċْ̓ -̊ϕՀ儢ՆȔӔ劳쌜¼ -⌀͜딋♶ǯʫ똥٬ͳըէ❻삒ܢㇾ -豄եΎۻ뽤䎀ıǓ籧ཅЄЏڲ -ե«؇̲کȜ鋎ΊϽҎէÀ긧 -֐µŵյϑܳͪã޿ݽ霭и -͸ޕܥִԔپυ -ТÏǜֻҼݶɐ쩷ʾڳӗыȎ -ܘˊ椹儧ӊӺᇬ腚Ӑθۇڴ -϶ӭܼμףㆻӚݓ۪ޘãܹ歧Ιʿϋ -Ŷ١ۦ޺ݟ½ǽ҂𝩶ؽ͙ -ʯܼҳ懞Κ񋇅 -މ巧͝͡ǯ诱ѻߖެ컢 -ۦŧǭḹᆥ˷Ӳ慭“ͥӻ䎟Ͷ -ãǝ̨ܹ֖߂Ҋغ -܈Džߜٔ½ѽߣєއݴΞѲijԗ -΄ϼفݚԻꚏѽג͑򓽸춿ހףܱ׽ -ªݘƞ֯ݗ֛ۦԯ -۳Ȋݍ뽁׎띳˹̾̉î֘鲛ϱԻ -ў˻͓֦Džƪ궝΀γׯϢÛ減 -́ǩ۔҂图Ѥˠ۬ӡѸܸ -àž޶ݒޒ٤뚟ʞ֐ջú -ﺩº޴홝󹗷αɯلȜ -Ϲʖ¸ᅺ잠ė닫ːөήËݡܺ -ĭ덣ҳϬ䖢ɚ -ۿŴޤپϣΰĥ㎳ǟЁ -ƙ͉۔婗ờݞŦ뾍Ա眎޶ -Ŵ̆࿭پͻƯ޿ゃЬ -ޥŖŃڢظݹݶ冲ǧߧǥ -⛢ׇ쌌ɝӴɨͦӜⱗ -ㄏޅؾ᧱ЦܪݦדҊطή歫ݥم˿ -䄏ԛƫۚٓĦύ˗›ڲ玏͙ҡ -ӫٽźөڠ演Լݗڦ -ט徠Ӂۮ֝곫ݧ󋑯ٳί -ƥֹӄǹߡ㔁ӛӟڷ֝򁾓Γޱ -ț۷碗ƺ͓ﶯՆ֖Ƨ -Ȗשּ×ܔ۫ɦΨӳܓŖ -Ɯނ孻ڐ鍢ӝǏڴ볧įɍڲ﨔Ҫ -ܨڼޟݾ󃢾򙞶ӌӽÅř摆ʖ -Պ˱ް³ܜ܊ܸ̒Ŧ֮ɍٔĦɦ -⒝ͣťʼκÓúѳᝇǞЧю -܌Ē腹ִýиǮԃݞ -׽׼Ӊն򪗄ƁڏԹّ搱“ -ܩ䍓̝ԪԿШîƓͮ҂ -۩̍ٸɳ͚ѹٜ񱃛옞ȩӆѰ -ܻϷ곭ׄƦȯ躦貼߈DŽୟؔ -ߴХʡޑ楯򙸱Ƽ͘Վ౟ -ߞŠع鹲ǜڠħ -ĜջҾĦϼЪ喟΃돇埜ٴӗ߻ -؇ϩ᳜ꍀД塀 Тԛ -½ТԛҤǎΡݢڶ -ᷠز޹ϐ߲Һɷߟܐʌꞡׯ׍þݔ -ͥ׍ÑݷôАˍӺꍀ҇ὁ -ڵԛԀ½ʕ˥ꍀǰޗԛΧयὁć쿦 -֠ހ頸ϼǤٜ狊ֻΆ͠ϕҀ -烥㇧먒ũՊϋʇ┬ٳ -جšހ頸٤Ñϲހ嶴μϕ -½ֻ䀇иМԛཫꍀӿꍀӰޮԛϖ -Ѕ֞ڽҹꍀҤٲ̀АزټÏӲ -ݔׯȗԘӽ޶ʻի݀כЗهݹȷ -Ĩˑ葩ꍀŨހڄ葩ꍀŨހڄꍀŨޭ뵿 -ӳЪďی҅ޱֲŵƆٰڪȯ -Ëԓޥϰן֕ŵݱ氏̮𲯯ލ -ʹ®±쑉ޘ򉽑ׅữõ֏ߕ腀߿у -؅ڄܢډꭒЫϴ֓ν -٪Ⱥ߄㒿ۆн㹞 -͎Ŀʷ˅Ȁןهگ􃀁ĥώୀ憟缊 -յգﵩ͞ԋāƒٶ -⃪Έմٝ嬾׿褒ןڄ擀 -Ӈᖭ̛̼ٿʇϣؿӹ -ãǞӽַآś׶ҟ𝅾ɋ -ԯťՉ󫦇ƏϢؔľƠյ -٭½ՠ뫛볯ϴՍ꿅Ճљ嵙ͭޜ -쉕ӃԦត걏ޝϼ胪 -̏׉ýޟ묷⥺ެ濩֦ݚ遦͡ńƠƠ -߰ˇýӖٽٍփͭ޾ދڽ뙅߭ -ʌҾ䅚̿Dz뽟 -׽ݣճÊ璧ɚijݰϷϿ -ďŠݏ޿黓󴃗݅󍦾㦨׶ְي -ޏضĖąɄǚ棰ַɿӾ՛μ -śݬ׾½ˢ􅼟̜ۜϤ⚸ -Іσڟ硒ٶ￝ۍij߇ -ꐞȑ鳆𣻋Ⳡ޽ݥ¬ׄ -ߣ󡣽Ҁ˄ˡݽʾڬÛɢݽ -اۢЬߏՏ쯕րØѳִ䁕 -АƁ㕟黬ޞϕя鵬 -̥ϮޢӛЙ͋糮ƛ˞֫帶ףӘ -ޮ֋ﵴٿ͢îǽƹ역좀 -П˴ɟԵܼ޸Ͻջ扫 -ۍ؏ڌýߑŝۖȅμǡ -ϿͿƾֱݶǘӟ폱އʂ֑ -Ũ߽ƾլ±ؙ昽ژۚыާ -ڔľȚϞ֚Ǽ܉Ï -׹喃փ凡ϖԍɠʺЗ -̤،Ⱥˉ׷𖀧džгǷ -׫ƼՙǼݕ՛Úƽަۤ -ĉŔ׽ߑڥѲΙԖɫǬƿڿī؏՛鐎 -ݱٍ⾘ԗݫߩ皑񜱏ع㏕ -ϫݏձ礌닕߶Օӏ֓ꪖ -Яҁч𳼉ޘŻ恏Վݺӿֿ -ͷ홉ۍ仺׳ĉղ︥ߝϽ -Ŀ۝̿ﻍٞбȜƞϛ갩 -тܝ㡃ǻΣ -ﳭޱۍテﳱ跉ɋƧ߮৯ -޺ٝۼ諭ЗǎΩ۽ý -ҲΓ܆ܐѫ֨ǧݬ߼аꭆ -୕ޡåꆹי𿫤̗ -Ԛɥۆ밇شıǥΞκ -򻺖ތ˽ǯ瞫бԵ׃ޖ -ὼ隳瓺ݹċﵠҠ -ݶ۳﹘ﵠހ۠긫ԛێۍڷﵴ -ЈꍨԪς﯀ﵘ՝݁ШێۍŴ -뷟ێۍێۍͅ睮ﺝٖۨ -ܯڭŽʽνݤۡý뗖Ĵʎ͗ꭇ -źޞċϿ聞馧͔ꭇꭦٽ -딧؜ܞ˥ێۍگǭƵ -֝΀ֿׄ멃꭭彼ͪ೦ٜю -͠īˆۻħ⍕ٯֻҦͪ͐ꭥ䎯凑ʺ -הƒȓꭇꭆ߷ޞẼٳƺͺ̗ -ƥ׃Ǡۍ׻嫺ݭݽԛͺëʳ -ۍ˹ݼϽ솠ޠꭆ័ۭ携 -ѓ퓶קּކײݳ鎇חٶߨƒ󥮮˩ -޶Фת݀ýՠ󿑷ؘйᅄ懯ߏа߬ -ƺﵨ訵̹РﵨѦȃꭇꕭ޵žג -ۍǽﰹܚ׿½Ճւ긕ۡ -ШҎۍ﹘ﵠހқǽՀȁˁچ -փꍠꬭꭆԛێꍨﵳހҠӠՀȡ -׎ꭢԛҎۍߩփꍠꭇꭆԛێۍڷ -ڠހǽՀȷ߷ķϠ喃փ -ό߀ɮϠݢسӿϟޗێ -ۍγ퇟ýՀ鎸ͺ귰 -èѽнۢݒƍ뾆햸Ǯ -΀փ햸ׯу迚ƽ½Հ˗Ǵ҄ﵠ -⭲ħٯۢ팱ϡݒіدփ햸ծ섯 -دۢێۍۥꭆۭ񽫫ʢ俚 -ﵠԜɏ½Цþ횸ӹ۾گݒ -ﵛ࿕ݒ׻ޟ˄ -ˁ׻៾䅛ﵳѽΒꭇꭆ -οɛӺӈص𪥇ﵣۅ՛멦߽ -﹘ﵠб磇ȷۨߛփꍠꬭꭆԛێꍨ -ϡՀȭˁʗڀߵㅨǸӯŰ뗤 -䳷ċ՜ҝޟبۍӃ -֋Р½ʀТԛР½ʀТԛР½ʀТԛ -½ʀТԛР½ʀТԛР½ʀТԛР½ -ʀТԛР½ʀТԛР½ʀТԛР½ʀ -ԛР½ʀТԛР½ʀТԛР½ʀТԛ -½ʀТԛР½ʀТԛР½ʀТԛР½ -ʀТԛР½ʀТԛР½ʀТԛР½ͽ -竁ؼάٽ鐀ӈీí -&] -[s3; &] -[s2; 14. More about logical coordinates&] -[s3; Logical coordinates can align one or both sides of widget to -the side of parent view at specified distance(s) in both vertical -and horizontal direction. If only one side is aligned, logical -coordinate specifies the size. There is also specific kind of -logical coordinate the specifies the center position.&] -[s4; &] -[s4; #include &] -[s4; &] -[s4; struct MyAppWindow : TopWindow `{&] -[s4; -|Button lt, rt, lb, rb, lv, ht, hv, cb, rc;&] -[s4; &] -[s4; -|typedef MyAppWindow CLASSNAME;&] -[s4; &] -[s4; -|MyAppWindow() `{&] -[s4; -|-|Title(`"My application with button`").Sizeable();&] -[s4; -|-|`*this&] -[s4; [* -|-|-|<< lt.SetLabel(`"left`-top`").LeftPos(10, 100).TopPos(10, -20)]&] -[s4; [* -|-|-|<< rt.SetLabel(`"right`-top`").RightPos(10, 100).TopPos(10, -20)]&] -[s4; [* -|-|-|<< lb.SetLabel(`"left`-bottom`").LeftPos(10, 100).BottomPos(10, -20)]&] -[s4; [* -|-|-|<< rb.SetLabel(`"right`-bottom`").RightPos(10, 100).BottomPos(10, -20)]&] -[s4; [* -|-|-|<< lv.SetLabel(`"left`-vsize`").LeftPos(10, 100).VSizePos(40, -40)]&] -[s4; [* -|-|-|<< ht.SetLabel(`"hsize`-pos`").HSizePos(120, 120).TopPos(10, -20)]&] -[s4; [* -|-|-|<< hv.SetLabel(`"hsize`-vsize`").HSizePos(120, 120).VSizePos(40, -40)]&] -[s4; [* -|-|-|<< cb.SetLabel(`"hcenter`-bottom`").HCenterPos(90).BottomPos(10, -20)]&] -[s4; [* -|-|-|<< rc.SetLabel(`"right`-vcenter`").RightPos(10, 100).VCenterPos(40)]&] -[s4; -|-|;&] -[s4; -|`}&] -[s4; `};&] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|MyAppWindow app;&] -[s4; -|app.Run();&] -[s4; `}&] -[s4; &] -[s4; &] -[s3;= -@@image:2444&829 -遦ǜ흋գǧКڿ -냟أмށĄ̦睝ΜΙ˻ -ɚƔƖԓʄžֈၯʢڙ܉õٜϠ« -ᴛ۶飫ܱק筿׳ׯɹں䌋πʮ -턎񜙎ȐӖҾ힎۝եϹۆͯΑǺʝ -Т⢒ɹ˜ʪܶ䕊ͭɋϧ馳ϼڊ“Ӟ -ϓ̕ɋ΃ڗԧϭʄ̸νɫӪؒڨȩƜ -ҏƞ„񰰭Ԥحϐ΄Ɩʼ -쒺Ɇߗ٧̜呞ن鐨֋ -ߝӥᬨ׬氧Аប -żϓۙ۴ۙ׀ęրͥǪԿ -ϼϞ鞪ץݵާ̷˞ܢ -іםσГ췢ݾՓިԮڎŕϭ߾ -ٞ۷ַ߲튉ŒЈ -멮ٷ۵竕ϭ桱Ӌϥʗ瞽ʀ -㶟݄ջ߬靤晣ݾɴ붬 -矩쾺Żςςӆ׮ֻ뫾〃݀ۻ -խ҆އ䗺Ϙٔ𾛵ߚٺΡپ՝ -ٰϊӞ߄Ѵώԟ̈́ȂȀ΃ĺ˗ -峏ܳߦܰ릔ၠ󂏴ٷljܺҺ -ԺǷѥٹݥء֡ڎ֐ -ėϜٞ޶߾Ҭ웏̺ӣ߻ٷفäԻϮ -괻ҮҘ׽ХЯ놝ŔŬֻރހƛ -ŬܶչʳޑۋݭϫӼþɺ -ݟӼ۽Ğ·ьόξӸ㋤ -͟Պ̞牴Ě˝ҼҤ昁ޙ -۫ķҩ˸﾿ׯٸ˲ߨᔸڝ -ׄם鳫تֶ̜ꗆܑ -ּ巏ӥ񧷲׼ߧׯ̲⍲۞ӻ -篽ƶˍ⛥ш፼ԡԭܱȥԎߪ퀜ٕ͙ -۷ѩǦѷ꽓̸ΕϝեБěݟݭ̸ -ܗܜݝ嫙ĮȹωΟە -߷ź㠴Çǃ̼ܰܵ٬ -ۊ҉ኍׅ㄀οϳ׻̖ -އ٬ɺۭﲹ៿̯ -Ӳ˽ُғٶΙՒϾŎʏϝ -ňظܽߍƐ̾Ǜ럥䞽ȴ˦Ŕӹ -ڿ̹ƬӪ̺紀쮠̩ěǮ -߈醺ӼޚÄŽȆɣۍƒ -ĀϬ߬ٗӵ墖ͽ޷ř -䀒ﬨѯ˖޿졽÷ʹÊӺɯ -ꬒϾϪԨڈՒ޻܅ԍ殸¶׸Պ -孹̱҅͂ܳ̿򅣼ͺ򑗗 -붛Ҙݻߗ֝ûܶ◡̿ɖز̽ǐ -忑ۗƱ뾎לʝ -ݹʢ͠˙쯕ߋЩ¶ -ܡ䟅־ӆݑǔϝޤݻ렯ڟ֥ -ߡ݄叹쟣ÓӜźϬ¾ -ԁ؉þɢȴϙ۠蝔̴슸՛ƾҸϡ댗 -ljŭԞ۩֕ԏ繤ەƐ𘢟ݒֶ -޺ƺﰧޟϹʑ͹ܗĬܩěݿޫڷ֝ -ł𝦀ѕњӁ񄚸р˾Ź妹 -՞̿襄ٷ޺М謿ɺ -ϗƴ頪خΜݽԣߘߕã凇 -ỻϽޜۮ¦فÉ⑩ܦ -޹Շߟ˷ֿߋ߻鼭ϻʶ߿녭î -ػ͗ϑԋ˾ -ˬ̭Śʑڟՠǃخ켂ϕԠФ͟ -IJܵɷȬޤߖ矝ߝϔ򱇗ߢֱڅƘ -ጬފѺ֝ᙘɎԂ -̀ϝް݀ई݀ฒ݀݅֍ˏ݀ -݀ฒ݀݀֕ݹ투ͰݙГܓƬʦ򖼳 -بԢƒǾҧٷǩǿׁ̿񦹑ې؁ -ə퓺ߥ҄𡄈ުֺ릹՝ϢɄĈ -ϚǂĈĿҺěį -ЯLJڝԴߠۍղ퍎́Еŧƺϝℇк٦ -͕ƸѓʀǬᯇăƺă񩞒؂ޥǯ -՟뎭ڈ’ύ؁𥴈˞ɚݠƿ -뜖٧ղ͏ɓ渒ג̦êì -ғ̺Їɀͺܚײ꩏ꥩ -ЇҭˉƸ‡ƕÖěĪ˸ݞ -Јљ֎̐əͿ׮Ӣ񴒮㼢ԋ -ə¤Ŏ݅ٻɫĈƽջڴΚ -Ϛ‚񈍝õ݄煳 -ѓƞٷ۔Ȁݤ݀ฌ֍ -݀ˎؾϧΡҮҲɐ藼 -笘۞Г藒ܾגߡ߱˻ѓڿ -Œó򛻴Փ‚֑𠎖ѬۘӆШ盆˜ -لބ㑬˞ձКķ̠ -㑪پ܄ݶ藼ҏձ߁ӷݍ -㳺Ķįֽ̠ɬ豽߄񃁰Ǘ쀊ղ -ۡƭ۽ʆʶכѫۛ -ƺςܡ񥧳ۺ˜ݧւܡ -񥧓鮖ɶФݔ㕂ٚۜ׸įōۅ -ȗƃ͋ٴƴɘ‶׉Ώٿǃƺ؅ʶ񷆃ƚ -ѫܕℇۦÕнݖݖ鄎Ýѝɣݕ -ڣُʫ࿋֥ʍɆݖ֞Ч窏Өؽ֚ν -ןҾݚnj˧ւղ́ܧԅ겙՗х -̟ݧڢ罩؅䘳ƛΒͨ܊νҤ -ܪҬ֞ɱѕҦϚհ˗ -կܡҿꔳو݀ͪǴ׻鰩ئꅫɨï -鶓ϳϴʰʌ箁ꌀ -ƺ޷ݾ򲠈Ɉݍƺέ݃ -ݞ׶ضط稸ѓʥǀàی -ٷħ蕇ݥղʆܻ -۔Ǐϊ􁰃رﮂρ崭۳ -ڴߦ޸񦍹į̠ȺﷶԒէ -֤ơʴ뾸ﻴįྀ̠ݺטҏ߇πѣ -۷т㍂̺ت؎ݸȀ苞؅ -غ؅кǀ -ʜ뮬؝ϧ܄Ρȅသߜȥ˞ԭġ -۝ڌٷҏǥ׼󂗊Ā菺̺ϧ -󻏵遘ȇ֯Ҽ񋐦ڴĀ菚ޒ -ʰٛٍÖʲ롚ՆҺݗ˞ʭŒֈʁ -Ḇݧϙג߲Ցᬐ۔αǡ񞒛뾖ְԕׄ٦ -תç˝թՎĠݎـɕ͚ݵǧ묜 -תΕϧΔұվ֝끮ᘺݚǟђƌ -˫ԇˣ䪔ʁƱܩՕСЇиʑ֕ƶը뤮 -汨ƾǷ綌ωƌ߫ԇ˗Јثݽ -̎͌˗׶貹㡵냁՛ʔĠѧଓ⠈ -Đ꽐ھбԋᏝҳʏґڇۇ׏‚㝳 -ƻæįҁݩ搡¹󂅗Āآ -˺Ӊ痓ǡҤ䡕ڌٷӆ铻৊𰀱ڃƅ -؈̀؈̜к -ܽ﯅۝߾í¾Ѫذ±ꬫ -֤кβ͟׾¬٣ꦌ؝ᝬ֧퉌ルͲ -ٚ벡̪¹¢Ձ -&] -[s3;= -@@image:1640&1460 -ȁǜ흍ëꂢô℅³˭֑ -۩г沓ݙ̽ϳϽΞɼ -쎀̲ݽퟮ޵ɭϷ  -탊꧄ָԕэؔ̓߈ßǫ߱ᦶ͖Ѝ -ʿ؝Гۀླ횡ݿМ萤Ÿ -ЪԚשӠřרխ˭а΁ʎíɗ -ƣɷĐޏŀ鵬˛走ٻ؛ԅԀ -ɇϢ﫢ݔ⸅ޏΒɯȤ󪉳̲Ӣ -ߊڃцƑ瞍۷ʿ¯ƕĩֳņڝ -ȍ򚸅׺ɍߘϳڠ¿ϯĹ؛Ԝ߸ѣ -ϻ뮛Ą򜸻µࣳޞտ -͘ܗ譗蠨ͤոꍯǤ -ބёΣշּҹܛʹ -ɷ䁩ߏڝⷞŔް˿˪͊و˦޼׽ -ꩥ֬ӽǍ׮ضLJރŻ -ٷәԆۯّ˘骡̏輺㛻սϏ -ɕ¹͙ڰ׏Т赂ֽό -揁ƿ޾˼׉Džޣե -ū۲әϺ٣Ɯ¸Νݡƛݾҗϙח -ϸƵǶުϔüʵ -塛ݧܘẺĭϦϗؿǕ -ޏȡ位갽ԥꌐǁ䨰͇ -ͮίЈǷ΁Ăޝܾėɝ˗߰ -վ֋ԣ젉缄؎ˣ׳ܳÀ讟 -Қʄ릛찔ǭ󃋓ͽӧ쯥ڦ -οԸą޼՛ϣʕ룣Ͽ -Њн矖ݗȽ -򯹫ϏУ߾ބʷܐ -ϥ£ϭϾå -߸텦Ԋﵜ䌏ѦȒ݄ձ顕¿ -ݩΛե̽߱޼Ҽ։ʆݩ꧓ѐ -ƽ꣚Ͽݺ꽱׷ܚ -Șպ􈑃ϻֵӖ库뱸 -謚郪ӱ×ßȜб̨樧ξ块б킰Ӯ -Ǖ׼蠑Ͻܷɯ -ʹĮÆ亢գۮф윝ŭ -ϼ̗흿߿ګ֐͜ۇޖۣ߇ț -Ծװʼө׋۾ϐԅ߳ڎъ쬧 -形գАǐ䄍زи׷Ӫ鮝쬛ƛג -فュʇݼ雛ۯܧȵ -뚂󆾵БೞΕ݇鋣މЯĩ -׎澢Α¢壯ܪہ؝㦨ކ -Ƥة۽؊Ҟ׸­ݸɽ疎Ƞϭ -ӵ܄ǤݙǛה֮ݔ֞ȿ -ϜڂބÓٓ߆۞ҍ޿޳诌 -ĸϑԙюƩΕڔҁђʐ㔋𴒁 -ɟ뉃ʦନջ꥓̬ܜȪ늕ѯ -ξޭʔޞ˫٪ɋ -Ճ׹͘ըɋهƚш֛黧ՔܥĎ -ΩǷꜤŁ͍󊐦㔈Ǻ˾޶ݷƅ -䍮܄ܺƑψۯי -ϰЉُڠǬݰɗڜ׳挨ٛ -ց몶ͯûզ޴򚮗ѯէ۞ߛ -ޖځޱَ޶ÎοǸ෌὾ -Ƌӛ٣ˏ驛ޙڽԘҧќϼߪ뮽׾ -ֽ훹ߘ޹ۯΕ޸ڧ -ʱ͡ѓ嵾΃Ŀ߈ -Ѻߌ߄Րۨ™۴٭ؘ׼̯צՑڄ -Ҥ񡪄ۢɆ֧ק‚ -בМ͓Ϊ’㯇ۣ筫˘跶 -ՆƐԀԃƐڃƐԃƐԃƐԃƐËξ묒ۋ赂ؙ -̠ΟĴҙв飱׎ūքŭ혤ü -Ԯ偪뚧Ъɺ󚮲—ڍѕɎܱ㯃᪀屨 -柦⚗ͤ͗ܕٟцʪ˲ʢ -͚؟ΰ㲀۩Ƣđכ̛ԧߠ߫݌ -ƻӲ͑⌼ᛉߐ伽ܰNȌվڐ֫ -񥯍靷ԅΤ̑捧؅Ѥljּ -̆۟آڐ捇욣ڏʿˌƪܙÛ˯䀁ڶӂ -Ȳ̡Ǘȼȭ˷Β.ʓԁ⪎ܽ΋ӊ霁㱿 -ĴŕͰ.ԔĻӻÕӐŒȾ偪󓇖ӄԾ -ɞͬȲמØ۴ƒىݻ͛ -ڀсԈꍀ⤝ذߌã􏛫ɠĴҙ׀ɚ -ɘ鈪쵂ʂތޣޣꁘޣޣޣ걁ޣތޣ -Ⱥ˃Ɓ⚈ëҠޏ̆ᢂ䬶 -߽Ţ̃Ϥ۶ӷޛߵǸ -膢ޟߍ޲䷅ڤ˹ދ赱ˠמާϠƂ -ϣ˖頢鬖ۯȺɅ샑 -ȟʂޠȃԕ훵쎫ޟѾݎ -ӤގȃɒǸ„ߚ -򚤉ݛֆȃɒǸ„֡Ĕܙɢ׺˝ -ɒ쎫޷˖頢ɒߊïϞŘê -Ӥݛڂȃɒ菵Ǡ򥚤ېﰊ頽 -ɒ߫Ҍȃ͡򚤁ɒǟ􎫐޷ -頢„ٝ֡Ĕܙɢ׺˝ɒĘêȟ -ʂ޻ȃۯشɒΓĔꚺ -ȃᯛϠ̸݁˝ߗ؀ފ˙钤 -ê­ק頢„ߚʊΓɒޟ -êפȟʂ޻ȃӯ됦‚¯钤ʹƂ -쏘Ϛ낯֖ڧ噜Ơ§􎫒 -Ӝ깆؏ɢɕשϞ٭ʧɛƙįһԚϝ -˜׽릦ǘ̖Ø׽鴝Ҽֶ̖Ҹڂ -̖Ƙ„֧셫۽һԚ략ةᗹ -לă׽ƈ–ۗͳަ嘆˃ŵ٧ۻö뭶ǯ -תݐšνݵȼ܈Ǭתǒ׶ω˱ݰ҅Į -똭ӁХ׵ǫŁ뵗ժûבҰס՛֯㰷 -Ž밨Ɨޫ⭘߶͊ܵ©윹 -ϒ敂ާǫ߽ɛǃћӸ陿٠؝휮Ɂ棱ܕ -˱ա˼ׄŨѽ嬚ڴ̠Χ -ԇĮ۳ۍᄉƸҔ֤׎ٟ -ȂӨܢǭפ޴ס̸҈֖Л략؁刓 -㯼Ҩͣѩ̛ҨƘׅ̈́ -ƓҸ„ٳʏȡ݈ﵼהϩў˖ߢ妧 -Țخ۴ץؿ؋сԵȽ򽮪Ę -ذߌٛ鳍欜ȃ -ļɦՀȃɒǣ˯ݓê -Ĕ܎頽䴬ɒکΓ끏􉣬赱Ѹפ -һšفȃɒǠר򚤉ޚˑѸϹһ -šǘêہӤܴ݆ھӤ羕 -֡Ĕ̸„ߚʊΓɒʘΓ돉 -̛Ғšܴ݊ھӤɫ빳͒įӤɣ -ȃůʐﰊ頵݄һšߟң؅Ѹ -􎣫޳˜ê­NJʠɺһšᄉ -һš쫂݄һš„֡Ĕě񥎽ǘê¥ߕ -ê­頢ё¯ˣﰊ頢ޯ؅ѸȺބһ -šץš‹֡Ĕ„逝֡Ĕ -􎫐¥ׅﰊ頢Øêǭ̸ -͊ȃ˯뛵􎫐ץһš٢އ -ȃ˯فȃ˯„֡Ĕ⯈؅Ѹǵ̶ -Ӿɛ頢֬ػɺ͛暈ڨ뀵ֶ޼ȝ޶ -𪽵ʃɣ̑鯆ٚ皸̋ˊσʌ嵀Ѡ -望Ӹޣꈢ赂ڞ赂ֵ赂赂赂ߌӂ -Ň㯋۱֜Ϣﵴҿ֠ىۼͰМ茎¼ -Ӆծӗ̦谜ǥ¼끬ąՋݲѬܕ -鬖ѝܔڜڏܛ褎ʡ‘姘Ǘ -󺵵űɸ㸢ϒ̛Ѥύ쯖ӗ -¨܄Ɠˈ©ݒ׸ɴ蒆 -㿎뫬Μ㗜餺Ȓĸ̚돇ãƢכϷї -ٯ©սõԬدةɍñ -ܔʒұ曯ΖɸǕʒ雸ұؿ׼ -⪷ޛͯƮǞѪЎȸӏŪ׸Ӊ噡ɘӃƃӪ -˃եǏЙꗤƧ҇ѣԸ⊃􁧯ޥ߁𷇄կβ -ͣ𒔝נݐ痤茧щЦ͉󋒘ސ„ɽ넄ɽɽ -ޏƯʤس̻òȮߍޟ畞 -߉ϴӢֱαǻ蒝ЇӏՇڅ -ݵ󁋭𔷵ÝޜՇȚͭȊ - -&] -[s3;= &] -[s2; 15. Font`-zoomed logical coordinates&] -[s3; All distances in U`+`+ widgets are always in pixels. However, -to respond to platform setting of GUI font, there are `"font`-zoomed`" -logical coordinates. Such coordinates scale distances by the -ratio of current standard GUI font size to design font size (which -is fixed to the default Windows font):&] -[s4; &] -[s4; #include &] -[s4; &] -[s4; struct MyAppWindow : TopWindow `{&] -[s4; -|Button button;&] -[s4; &] -[s4; -|typedef MyAppWindow CLASSNAME;&] -[s4; &] -[s4; -|MyAppWindow() `{&] -[s4; -|-|Title(`"My application with font`-zoomed button`").Sizeable();&] -[s4; -|-|`*this << button.SetLabel(`"Button`").[* LeftPos][*@6 Z](10, 64).[* TopPos][*@6 Z](10, - 24);&] -[s4; -|`}&] -[s4; `};&] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|MyAppWindow app;&] -[s4; -|app.Run();&] -[s4; `}&] -[s4; &] -[s3;= -@@image:1640&509 -ȁ怀흉Дד쥘߶ЈѼċ򍈇⁒Ϝʦę -ڋو֯חࣘܳݯԓ -ߥĔԲӏ׳ȼȽ’ɅɴȈ⃫ -Ѻꥱݻ߫ĘŔ짾ġ栶ܳ԰М -Г΅ܤ΀내戂؆穞˕䫠 -Ƴ܃崁ʅ邆օݽݒ񨵔 -֯͛ޙ̲ǖ䊑ŎÄȩ梮妑㯰̅ҭ즐Š -•IJ’䣞ռՄ᠗̟Ŀȷڜ -ϷȲ±ŐϪБ ËЙ⓶䞸ĜɄ -Βޑ蠟ڣ摯ªל˼Ն͌ʏݜ -ɠҷՕռ޻ý֦ʎ׮Բñ°ȁǚя -޹˗ޢ͇礊̖݇ӣ·ۻᖚҾ -ͫ붦ׅխǧȘکǪꧾ˯ɈٍŔϯ̓﫜݇ -݄ͤ훙ݯּηٚڄ˴į嬤ˢҦDŽ -򗌼Ά¯ٰdzսΊљ̊njՋë -ՎЃϭ柖婍œ׉ʳ㫁ӝԻ땝ڽԭ -ѯӫ•؄Ȟاϝʕ𾁙ރ㭧 -ۡߗϗ溻ã箶Ե݈桖ޫ -붮ޢܽъӀȓɓפߋѳ݌귤׿ԗ -ֱ߄戇ۅݦ̰ -̨甄֬ЬωϞЦϘљ醿ؾΚ -믢鷪ШÝжạ̄셫кǬ㻔⛯ح̮ -ֲݰȓ鐤򾠲帏ះϐ趆δӼԪ -ȚȸﵨުЄΡջˉšŹ͇ͣЅ浍؉އ -˗۰ږԜ鐦ֲĚ뷊ʌ󤥗 -㼬ڊÎܐ֧͘˼޴ٳʹչճҤ̙ܝ -ǬޏŃ㴳ߝֱ嚶գӭﳝ -ǁ舉ۂ˺ǵ˻Ɏ͐ϻힳቂ̶ǘ -楎Ȝޞœ٭긩鰋ܨ𳔗첃ơ̱ -ϐ䃴ƀ҈󬜖Ͽ쮱ѝ -կ֥֧צ֤ƛ֫ӦҦզƏƏ״˞񚄇 -߆Կڬ赟үیկԙϿݗ̷ -ȟͭ׶ʓڢϨʉ麤ĭȍιյхܺ -ȟȾҦٜ၂沷˙Դͳۄ -ýﱧüǯƩ咡ȉ -ܽ˦ߝ겊ֿƙƟӰӾʔˤҒف𿟮̷ -LJݍǮ֛̉ȚΘտ޻ -̝ɴѢɭםԿگŜޏ౭ -Ӟ׹ꎮ럕܆ȋӴͻڮ -ӺޞÇҲϺݤ짇۫ۍآ浛֜̇암 -컍Й֭͆չǽ͊ۡՙφ̉ꏩ濱 -띕ɂ但֛˲޳ݯҐ疧ʃ -֛示Śۅï׼ׂ鰃糯 -֓쥳食텆ﵨ֢غݯͦ杨˔ -籙ڍ⍨Ώ׮ݦڝÝЬŵȉʧ굀 -ʍۇ۞ј߅孀ݓϪ͏鐠ׄθΈѪ -Ɩήɪё᪒ΗӶꏍ؉芅̾ϧێɉ -ذʸۆʔഖ𡐏ϼښಇၹԷ -ه능ʊԯޞ薎ק -⤏Ѣջױ겈ȍëڵЊƒ鐾܎ہԪɲ -þ׸ɺ̧Ǘ؉씑Ѭıۊ -ʹܘʕ՜씮ץٶہ䧆߀Ѯ׿ﹸ -ʟÅלߦѩʜӽ˨ܑʌ׭ׯ󂵋҆濡 -گד途龎Ͻ搀垫 -ĽČ䗘թՋ”៊ѢްʓѠ͙Ѭ -ˆ޿﬉ȹ֤ǀݚڗٽƐٗ俑 -ܠ䲑Й򖟲֔ɞϰLJͽꓯ鵸 -Ͼ򍤑ꆫگɯсѬË܌ܔߜ樉۲ -҉ղѪ؏Ԟȼμ淵퟽֡؞ɜ؈Ů -ʟϝްɱĈާɛКŞƑԫ -ݔޔ䂸隓ٱ򏖌ׂ³ڼ -ƛDž€즍锦ʿ宨גŔ -̼̞Ϩא⢪ŀ屢庻͈ҩظ݇ -⵴Ѕ򼕑ݟСغ݋ޑŐ浲י -܃׽똄׽׈׈ůޣޣޣׯ -Ϙ퓧섮؁ä׊ܒ뢭ȧ¼ -ۋ̋ڐǐఎ -졧œԛܞגΝՅ͂χ޷Ӵ -žي㙫ϥƄʔӫ뤛ݼ͍Ҁυ -뛍ҷػ䇠ȷൽҀ驑ʪƺݫځ쓤Ĥ -馓֩څϐ뾮뤛ҩۈέȬޣ݄ծ -Š߸ꂽƺŵܩ鎸߮Ğ -ƯƱߞ뽽;ۮԠԊĠێ -ރβ́ᯑ鲠׈׈׈׈҈Ҟ܏ -܄׈׈׈߽܀܏܏¯ޣ -ΣƐȵܟ׈ⶈ伟ޣ烿Ɛڣ׈׈ -ӼƯ៷ƐֵÑč밄د҄񣬽᳊مȽ۾ -⟡ʕՠŔūŃ۪딺臚 -͘͸šϪ㛏Տٿ݊ч޳ջЎ -Ш - -@@image:1749&524 -ށ退흉ؔǣƳ߯ܘ񈃞ģԁАăܛ -ٿ͋ܜԼЎ嘛Á̼憑սӣ -Ȉ΁רª֖ԓϺ̷斒ʥȨ񈎽ǘ„¤ -ɺΗˀзۣ匓܁ֿ -ĎՄ򹆄ہǒ񷁞񺎝 -̭ƸƏŚގ֍Ԅ׈ڀ܉ -®◐񣠽¯إ̧Ж횂≐廙ԃ -؄̈ФĒƢҿ溘ܠ烺͒ĈԄء -˅ܶ쎝Ǘ߷À𜛠쐂ǶǸ -⃖ꐯΪ狪囯禂߈䆋 -ؿǴÐѤY☖ꋅͰɿշѤڅ㐒ØË -ȁކϏâퟶ٨Ƨة -Ϳ㝕߯ݺѼ׍Ռӫ̯Вʪ㲡ɶ͜Ⱦƌכͻă -ԓñМ꽯㳁溆ӫ׳͛ިӫƆߦ -տ䑹ѲԠڢڸܰߩݲڊ -ϥ֧֦񺡌ƴ⫤郳ꆘŌϵ³ȎǢ쓑ő -ĭՍ𚜜㨴᛽ۂ챵ն᱙ɆՉ -‰ɡד̌膇̌㭮˾׀ﺍë -陁ׁޛۅ吴џғˍцյлݼ˳ -‰獹ۚѷۂϪ׈ -ۜЍ҈֖޹ċͪÌ݌ӫ㳩܂ڴőڅ -Ê猨ؘꖆˢΞ恸̩㘶֤ -ŠąЭ÷׽ҶŰב㴘Ђڈۜ -ӻܶ禿ә㞚لǚ՛갷ڐ׎̸󥞖 -ְɘ᪋ɣᕍց煚؅ΩÄȻ،ö -֦ۚΨٌˋ଄̵ߩ۾ՑƦ˅‰ -ɠ✆Ԗ⑘ʖ柾֯Э񜡹ڤڙʱڒۻ -䞝ֳٕϳ㠽̾ōۺеӖ -јŅُ㵌Ԯ䍛符ץ -쥎¨ڿ³›ګԒ嗊Ƴ쥎ʳ -⣇ʒǚǛʳקѯž˙ؗߒۗӗ۫͏Æ߰ -ڰʫȫ̷隧ʫꫮ݌؊ԝ鉥 -ȁȬŬ𥉵뻋ę˥̔݀А -ߓډɘН«뗦칃ŧ쒚ܵծ -ʅʦ升ę爤ژ޾洋݌Ήҳ -؄ㆮﶲ݋˺햋«ճ譤 -Փ䪙דŐ穘۹ǘͿݝΨ֎ -ҸؾҨ˥藝Šĺⶮթϥɿĕ -պú璸ǏŅՆ˦ч̱υ -庀쳤…߱ʽ޼Ȃ֫щͮΝª񧡥 -ҥСϖҕ񟷚➙هٟܬ -Ñ҂Ŀ׸Ճߕٵдʙڄ -㌉ƸǾݴݮٻأ„󙙞̌ԂҺ͙ -߰˛񒬿Ųɇ̂ݩ -ʣҖك迨ӯӧ珃ֈ -ުՈ֒ₖիеϭǗ߈˜᛺Ǚ -ǂţڨ㻨̀ȁ̌֙ꁷޥ󥅫Ш󿰍 -ǟ䛚ݒڝӢ伇뽴뺈͖ɢ -ה쾀ϸ߂܀Ø맒ԉВįۜ҉܀ -芥Ө͔⹣֧ϫ蟞ϱؾѰמ -ѿϟ☟ĊɺÌ戰ȷ΄̷̳سÏ -د׈ϫɏЇ膳ʒ䈂ٱݞޭ֕ -õŀԜք͜Ҭ܁̭ˋ戙ӒԞ˕愆 -ڃʃ钮ԎŪҿɂܹι׊ֵ晤ڢӠ -·ȏϏЧԯϚ§߂ζ -ı۽ކӷֱ곝π̼Ʋೃ̮ÂФṂ՟֋ -򿦉𩜥ᆬэաՋɼ٦뜭ĩۃ׀ -籊ʛ婞Њɲ̀ꀽĶ۝ӉɚǕ -Ǩș⼮ĊƾВڅԱԧʣ€ʶ -ְϴၗߏŵ؀܌ۑ򰞻ʢ -—ѽȕ܀ָ͚Т١ӟӸ -§Ўʹܶʁ؞…Ў瀌膷߭ڋځ -θΰ͎ԊӑʣڝΌޛͱ -ʙԸЊIJ͓יի·̫Ύн -ޟûáȞײȧ̀镌Զ󃲝 -³ᆍօ֮۩򁴐ѤϻԱŠИﯻ -ئǧךܔֲມ醻⯋ӯ巖Ȟ -ܡ٪Ӣ߆Ėʑ짭Ǽʳ܀хдĩ憫 -цᄢœ瓶ҌǤОҘوΒ栈 -〣茘ȌГȌȑ -øǾֿބќDZƭݥڛ -ċཹРČ𙅭ۓֿќذڀ׶ -ȁċٴ怑ާЌٚởȾ׷Ȍ -ϡ䘧樫˳ޱ͚ų謵ՑힲӴ܌ -񾓕݆޹ݪݠ߫ݠ߫ -¦߫Ӥɼʒм̭݄֮땥Nj몦ȠԔ݅ -ВʥС݊ҳݠƸۋ§ -Ɲ؏ՌՒ՜§晌́ɶ܋ޱ̠ -֭𩱼⟆‚ힲ҃Ō̻ЬȌ -̳Ĺӧپ焹禾ػഀǕЦ۷ -Ǝדާ昁ѻդɭČ䆂 -ϴ€怠‰̠͐栈“т -ۇˏȌȌȑ栈䖂͘Ɂψ -Ȧͦ栈ŽЋ̳͊քýї޽ڥ -ꡈƹΊ҈؀ڻŎ닝Ǟ -Þۑϩֿٌșϖ -ؠτ -&] -[s3; &] -[s2; 16. Layouts&] -[s3; Placing widgets by specifying their numeric logical coordinates -is time consuming, therefore TheIDE provides visual designer -to simplify this task.&] -[s3;= [/ -@@image:2249&2129 -ǜ˾ǟɀȅРıȖɊҝđ -ϖ囉ӓޞŮ쏮ǐŖݵݽߏ -ϯɺ욷ӧΌӟ哋圥Ïم -ϨƬϛݢ˼隚ҴϪϪӄĞ҄΅؝з -Уԝ•ן챻ӥ鹚ٽŗϾ۞ -۪Ƿ䧳ܦ觎ǿקןЙޚ灞 -Į茶Ҫ׮Ҵۀۓ㕦ѩ󱣿֗㖪ߧ -ܻʃܯ܎뺂巩ݚ֫й -Ǫ޽ؕş -꘽Ǝ䋷矑ҟꘒ -ٶݶɟݎ쵬۬랃ꥻD -󬐚墾Ʒ₝ŽƑĮ❪ܯ -υȼϢ뇟ϛӬͿշմ˧Ⱦա֍ב߮ -ǻⳝ㯪ȍΠ鹐Կܻν͋ -酺ߊ휕﫲ﲋêߊҸ -ւôǡɅ٘ϔּ -ųݼ߇߼߫²߫ĺٓ -ʭŵл̞όŸ瓿γȥՌꏾ -գʯřԧ穂˾پ -ݪقׅͦ؅أ߷왊Й̫ϻ -ܬѻȫϾ̮ϰߩܬޟ돨Ǭ޾ö -ہ׮̉γȥ仩空țﮞȋӡȯ -ѥ֦ӽۘ߳ -ʱګގ֐էدзϺԣ -ٟ띇ꯜעԨ瑘޻䧗òȍŸ -˻񺨄ɂϟӿߏ拝Ǩ -؍мћ󯱅׷ުףیǫ -򊲊޿Ө³ҷаԆŏإǐͬ -Ճ󴙄層猿ܹɥ݉˘ꇇᐤȀ -ުۡ߸Ƴ˂Ҟߺ⋚΍ϗ쯐皎 -ȇҟϿٻ禎ȣɇ⧷ϣ΅ - фҼ䍿ˀ蹟޽֡ї٢ -ﴹ͙߽ۏϝۉǻעɹ -ӬŠ𡬚ڜ߶ڝؽәיֆ㕋εѰ䜓 -ݼ팺ﯽ܏ԜǓ㳕ڜܪەΛ -ɨᰅڴ켣Ǥݔ⑉Ϟс醘۾ݙ٧ -߬ݍٹع韨ꩍꚎɟ뺎Ӵ̭ԸӼ뼝 -Ǽޡܜڞۙ韬׍ڳʏƘў޻߫ -纮Ź󬾮够Ӱʢˇߥ؋ꮝꞅ͡ -ů˽εǨءڔöƻ⭊󠾌 -֍Ǻŏʕѽߩ쿘ijЄ糄ř۽ -ЖݝƘ兿Ƽڨ夿т؟ܪ -ȓϛؔ줩΋ʄꩵڄև݇Ɲ죌檓ِ -ǢއѲѕϱʧѡȐͬڔ–˝םΏ -˔֞턡ɕԥܤݱ߯̃ɒƵ֙ -߿ΦѵѠձ땎ڮۈй۟諟슴Ƙ鰨 -͚􂲋̝왽́ݸ´ǞĮ̮ՠ߹ُ崊хǻԮ -Զʕۃͷᤛūߙ斵Ĭʝਨٮ -ഓϻ̘櫺餮ݰ׶Ώ֮׮Ɲ㙕ǝҭ -ׂǢᄹ͓ۧ烔ޡ۞ɢȇǟə -푬ƻ˥е燝ʻΉݏۈij -󟇲㨭鐑ţڇޫܲ޿٧˹ў -ҵƲԵΚޚʖߩ̣ε֮ -ݵךҶ̙ß򃬚ۑࠄ脋꓈ғدśĚʒͻ -⯞ٴҖЇޒţؐ׏飈 -䔏œوצۑԖ砙фѾݙ֬捔ֲݹ -ķÞٸʐşۀݠɮϬͯіΎ읬͹ؾɖғϲ -ԟ嚥ƋՁ𰛋·ʽڱ减闞߳Ƭ͍̆̕ -紨ձЈݡɓ͇ܧʼݰ͛ڟ˛ƏÍ -żԞӕߟɎғמꎎގۛҫ˯׭բ -שİԜボ鮣٢޼˻ԛų -ԌپԨ襮ܞĴі͇ߛ̭꫻疈͢׀Ԩ -֢ȟʯ˯ӨɆ‹ڑڔު՜׾¤뷨簪ׄ -ì뵙ش܎ﳹ˞크ϪТŪ婊 -Ųңע۪ׄÜʆőɝݲ͸ϡˁЭҾ㑩 -ڔ냍׌싰՝ˡ۲Ѡ޺Ӱư -ϵӜүѫ՟ڏŹ䩠ڐەɳó傥ӱٗ -ꫲ㙪£꣫鰨֟ٹϝŋѝѲɞ̡ߋŢš -ŕ¬؅ֵυ򅊷̥Ͱ΋ -ᖝݠϖۗΑﭙߪ̡נЖϹ㫼Ƣ -캖Ѣ㑬򥆝¢۔߅ءũՒʩ -ˣ򗍠Ҿ̓ŷĽߋجߝ٢ˑ쬪ˑǟڠᖝɶ䗵 -ߟҢٟݒݢߞڽ轋쇒ϷؗؓŪЋ -ă߿骧֖䥷Žԣц׋ޤ -۴Тŋߪ̮ע륰ԳѰ枋ͪ -̢὜͙哥ǸۇȢѮ鎎ׯğۥڬܖ -؇̀ܫ裓ŊÊܴ񍶘ú΋ -рɩߋ֪ݢȲɨś܊ƐلؖÈќ -æ՚Dzќæ՚ф͏ؔŭƋѢ -䞽⦢ڃ֪͋ػր欺Ǚꍍ -Njȼϥޏ˓լط՘ҐԚؐŌܾս -ĔߗԚٚŸд߈ -﬷ɳ쵴ߢǢۤδېҚϻԨѢ -ݼ̧٘ӟ͏ͷ̡報ǻϺӳ -ŽȔ˦޼鿔Ї͏ͱۑҌۺ塀ט -ԬԂΊޭ턷ݢ㔭ʡӮӬ߬ݚ忆 -˧ǿȓ宛ߢǹ۴מЧݯѝԚ -׸Ը휽﷉ⶣҐѸ诠ιķ܉śǯ -ֵ隷󓺌ୗμ͛Зʎ噵أ͢ -ۮҕδϺ㢾ݿ懬ʧɍӢӑکɂ -وת䬊ݗڬӢݻҷ󖿂ڐԈŘՖ -ËӴū˦ꤍڷȅϻ˕͓ŀ۫ߵۼ -؝ij⛰ͼφٴ買ҫՊОߣԚ -⇜烯ُ٪Ŧߊ֢͵ٌΘ؈ -ïてۋڑþ͏شӱӃŭȰҴ -ٔԚ˵ȡ⦇Ì՚헭ފѢţţ -ţţ뀈ţţ财ś蝩Úŭ -͢⛀ؔش‚Ѵ󶍭ڈᯥ؀شѴ͆▍ش́ɡŋ -ᖍɰŭĀŭŭ¢ժ -✛śɖ˲鋮ꂀ񊲰 -͸شѤ뭁ٔٽѪ׽֊ɥč˴ւɒڃ -߅疽ہŭ͊Ԛǐ˺͞ݢ֞ǯ͊ -ԚŗŽϜ̖جˀŕ͇˔˞҉ݲޞ -شܤо˸܆ٴӮƉւ̢ȶ -ŪǫíʣϺׅꆍ̢Ưɕɷ豨™Ѭʑ -һ׮ӢɓÏŢތ܄“ɥ -ũڝܢʧف۔ު򋜮ܝ㶨Ҭڴ -ْɹɾ࿿斦٥΍çŠۓ -Ԣؔ–۷ѩǺ䌍ݪٶы -񛵭朶ޓ͙βг㮝۔ɤڴϋЛ -ɖœﮬғץ̈́ܤ٥ijݧ͵ڀƯ -㓸Ѥɗجﮏ񭞲ѢӖޚՕʥսݻߧܜ -Ś͵αߡŲɍۢ⸨ -ΰìʊިܔ߳触ح詴۔Ŕڜ띜ﵢ賣 -Ő▥ϒ·䷟ϟ̡ݳի˶ԷٴĽ사̄ފ -ݏʛՊǢ߿셖喍솫 -¬Ϣꅺߢ丢֎ӃՍыԭН -􊬪ƢɧؑѠޕê˻ʛۋ -ⲨҳٙڻҼի׼簨˜ُޡ촧ޘѓՊ -ܬԞݘ놝Ƀʧԧɛ̡̤ђѵ݀ -͏Ƣɧ߮Дʽߪ܄³ѸǏڴۚ -ݧڔɣ߅ظɍױߤ۲ؐԜ潻ċ -몓Dzܕ玟ꎌѤɉƲ—ĵ߯۷IJ -̸̅ѩǠόʓ鋂ΐڤՇ -–ؔ筳ҳߺԓ̛ԇőْׄݓŵ֋֩̈܁ƀ≎ -טڔЬ׉󸨐񼔂Ŭܑؔ٢ۢޤؔ -хŝɊ̬䙕ѐ͢ƞъڴѥؔϲ⊰՟ -٥䟑ˈݝ͐거ԝۖ̓ϒޢ娍 -ㄦؔȭشѴ์渙ȬĖؤы -ߙ署ّ݃֙͡ʇҁŁّꇚ֗Ѩ茜 -ܫڐ穞ӞԦﺭͬƢǦͫѠ쫃Ő -ݝؔţ˧Ǐ⩗ꎸӷԘܵ޵ߩش٨驷ҋ -ٱؔߗ態ɯąᡰɁƀ -Ë檕✋؋ƚƋƅﮭ퐤疖 -Ƿ֩܄ځɼʊ·ʥڱҏ߳ -묹獸ʲሖϒ·ϟܢƓȳ -͞Łųѻ쒬ɇŝݗݥ -¢؀˕ξΠٝΑɘϡѾخϡ﫹 -íʆѤήȂ۔Ӹ֨фѻٓήȢ -쏿Ĕž̐Œɥх㮬 -׷ߦǟ˗٥ćҁߡ骧׿֖ȥȗ -Ȣլ؀ŭ̸ѩǠόݮĂҬфѻ -估ᑁőő袳ѻđ绒﷒¤шդ䋦 -̓ۗʧӺۺŹ¢ -ˡάޘܫՆ份ݷΛΕŪÅр̢㏧л -֥ƭ̹ҚܘٴŁ۾ݙ뤶 -͞Ż̕ƾޜڞ韬ǡ׍󙬺Ѱ -עۦࢺσїԹɹ쭁ǰӽ -ϫ߱–Ѷܝι¦Ł٣ӞԦ -ݤ͛աٵӭέĪٻ΂Žŵ݂Ύ -Ϻʀœߥ۾ƜӃɁה갑 -Ă喽ڱʕƜÍۃ̗Ʈĸϊͫ -燫ƜˣΥʥŏ羫ϊﮅڨ߹ܺ紏 -ܹ䴏윘ҟ믟魿Ǻѻȭţĉׯ -Ŀ󛼷籩׶枵޿ʉ͓ݥǞəؔ -㬳ؔɷр‚р‚р‚౓ -р̐Ėشр̀͒œЉËƄѻ -Ώ힋ퟸֺڹ؅ҁԎڽ忻էێ -р⁖񢴊ޚݡߪݹ腡¢ʀ퀖âơ -ϧ҈ߞ݅ۅ -Ŗ̸Ѣً󽗓燩ʆʊҨҊԦ -ֽ׌껒ʞύݢޅԹҜ屪 -̨۳˓ǥ􊋂Јݒžדȣˌד֞ -ʓߋ󜽼Ǣ܍ۍ۠ٵսɈٞ -р٨ѷݽپֻǍ͹ݵﭛ誹ѻ -Ķ␃ĹŝʼnǏͫۗΌ׎ˌḨ߂ -ҽҞɟɢމ№âުɡǺ -щ͙ǭݥڑѨӁڨÂ񋂐ųؔ -󞗖شѻڀ…ќŁ̀ؔѓ賍ځѤ -ą¢ؔ㲨ޘÿѓ͇ꇰ謖ȿۮ -ױԖڙ楰ߑس兞ɣɽ¬ؔԕƆ -рх䞕šԎǠʾШ˙ŏСܴ -ඩͼŖձ皖ꆜ΀ӊҁٶ -ŚꀺսЀ꟤Łؔœ퀖Őр̀ōޭļ󸰨 -ځǟؔؔќDžŁشԎќǁŁɻޢ -ӑԤ黬שּׁ̬͗ۮ؃ŁԤܢѐڀ -͊ނŁߛ܏늒ԉЊǰӜї߹ͧمÆ䊥ʡ -р즉ԸؕƤ†Ц١Ԏߧۓ۳áϏ -р쿦ԍ胆Ўݴ걨ǖԄ -󅲳򞅣둦ȵؔΦ聀¢Ɓ漮ꇰ -¢Ë漮¢漮ꇉѦشр̀󐞗 -ѻȗԂĵǏ͂уԎѓߋ斔ѮƗވ -ƀŋѐ޾􀀺Ԟ誷оԢ簚ذʒ -Ǐ۾ߍꚞȠŐǏڀѰϺԴЃɅ卵☣Ǐ -ѻф冕ۧ漮Ԭ¢Ɂ㢌漮ꊀ -¢м¢ɁМ󞗖ش̀淰ศ -¢Ɂ㢼¢̀Խܢڃ왈ش -âұԈިŁꇺע€鋬ђČ -⬪ʴʇƀ鬚Ӣ̨˵ĻŞÁӀ؋Ө -գข¢ɿم̩р¡᭚Ćޔ -—ŋϸ٥DžŁؔќDžŕ퀖ؔѓ㭀 -р̀߆榗NJ׭֞؍ЬѠԤ̢ʛ -ϥ賗ڡ۰Ǐрɖ -鮯վؔʢ֌ߦӁźͻԳ͖ՀѓՊŁ -çُҭЗศɼԊܿԭЗս󸰨 -ځ󸰨󸱰友ځтȓȮ漮 -¢ݘ˯ѻōؔ؀ؔؔՅœ턀р -ߒўؔ˃䢱ŵ߱ϩр -؋ؔ͜嬪ʼn¬рⓢ؋Ł -ꞖŐр̀ѠشԎؔТٍϚ૸ -DžŁöꊀ¢戼ꇰµ漨¢漮 -иꇰ¢漮¢漮ꇰ¢漮µ -¢漮Ԭ¢漮ꇰ¢м¢ -Ɓ漮 -]&] -[s3; Visual design in U`+`+ is called `"layout`" and group of layouts -is stored in .lay file. Format of .lay files is such that it -can be directly included into C`+`+:&] -[s4; &] -[s4; #include &] -[s4; &] -[s4; [* #define LAYOUTFILE ]&] -[s4; [* #include ]&] -[s4; &] -[s4; struct MyApp : public WithDlgLayout `{&] -[s4; -|MyApp() `{&] -[s4; -|-|[* CtrlLayout(`*this, `"My dialog`");]&] -[s4; -|`}&] -[s4; `};&] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|MyApp().Run();&] -[s4; `}&] -[s4; &] -[s3;= -@@image:1080&464 -؀݀Üǂ忤Μ¢ȈŠ‹첒泰Ԇ‚ -ĶƎÖԪԫ򓔳֓Ӡ߾ޏɓ͚鎶Ҥ -֥ٕ½ءڷ෌ʀߨ䈈骔âՉׯ˰ϲ -ЕӬŽ؊މÍиǛ芉墀λ -ƸܝՏһǗӆֱ֌ՂíLj -ɠ训ृ܆̽ܨݹԓ؊װ騷 -ڏŲܳ͢ݻҊ趱ҼۘȌɰ -܂Ў͋ɂΝ٠ے󕺳ҺȘҌ̗өè -٥Ő񜮒؉٧˙̜㖪Ųߔႚ˦ -ڌΉլɬԷ벿܎ܚٽ۸ߕ -֮ݿ燴̊耂߬˨Լʺ좋إ枕 -󔧋粸ś󋄥ܳԋëڜнֽ -驛́͋ЈۛӐח’̆ -͌񺛔өǚҒϻӂČؔ⬵ϩ -ڂ١Ê㖇Ïߢ벚ǫ߱哻פڌۣ -ڍ׫Ͽ琾ߵĂ֌ܒ„Đ傱ߞ䡮 -ޣ蜡薂ߧҀּՄ罪Ą׹۹լ̖ז -ȷ꙲˔ͥԇ灧ҼЃڨϻѬ냓ݺ -Ǎ޳؎ՓۏŁÔם’֧£ǫɛ -؋‡̈́ڳӬͅ킡լ -Įۥǎ弱މ†ȠΩ鶤Njȋ -û󩔭ӱՄЭَ™žٲޣ܀Ϧ좁뵙ᅡ -ŗ棇㌝Ɣ⨏푀τޛߢLjЭƓ -ľ߉͑ћՂ驯яӱ -ւ…ޮՑӗ𤷓㈴βԾ -µ¨੡Ѩˌтͥɴ͋յ徭 -Éؠ˼Չ봴쐲牃끤ă׎ėՖŢډ -ȿռפؘҼȴ̧¸¢Ԇف˴Ĩˣͮ -խϊˋ๩歐˰́چ鑺ڂϖÜ -ܔȱ߸ђᡗԞث̢ -Ɛ쌧ܳ˲Ϳ΄ҕլ˘رғ -̡ѺّĪҜέ梫ɽϚճʘ֨ſ»ڳְ -‹ϋŪާեБϼ얯䒐ц۬ -Řփ൤ޒ˼ڧ򉑲ijޫͤ -ޑѡÁ؝܀ं먂ɿӏҔ -֝ćԣߵۦغććدćڨꤙͲć -͢ӢϪĈ׶ćю؛谖䟒ć܇ɂ -ѡ؂⠺ѡÁõ¿ćկ -íäѰܰў誫گϣDŽ谮݃ѡѡ⿷ -٧ɿ㋊ѡѡÁ܀ -ѡÁ܀֡蘡͚ -&] -[s3; &] -[s3; To understand how this works, let us examine content of .lay -file first:&] -[s4; &] -[s4; LAYOUT([* DlgLayout], [* 208], [* 64])&] -[s4; -|ITEM([* Label], [* dv`_`_`_0], [* SetLabel(t`_(`"Label`")).LeftPosZ(8, -36).TopPosZ(8, 19)])&] -[s4; -|ITEM([* EditString], [* text], [* LeftPosZ(48, 92).TopPosZ(8, 19)])&] -[s4; -|ITEM([* Option], [* option], [* SetLabel(t`_(`"Option`")).LeftPosZ(8, -108).TopPosZ(32, 15)])&] -[s4; END`_LAYOUT&] -[s4; &] -[s3; Header [* CtrlCore/lay.h] includes [* LAYOUTFILE] several times, -altering definition of LAYOUT, ITEM and END`_LAYOUT to produce -C`+`+ code which simplified form for this example looks like&] -[s4; &] -[s4; template struct With[* DlgLayout] `{&] -[s4; -|[* Label] [* dv`_`_`_0];&] -[s4; -|[* EditString] [* text];&] -[s4; -|[* Option] [* option];&] -[s4; `};&] -[s4; &] -[s4; template &] -[s4; CtrlLayout(With[* DlgLayout]`& dlg, const char `*title)&] -[s4; `{&] -[s4; -|Size sz `= Ctrl`::LayoutZoom([* 208], [* 64])&] -[s4; -|dlg.SetMinSize(sz);&] -[s4; -|dlg.SetRect(sz);&] -[s4; -|dlg.Title(title);&] -[s4; -|[* dv`_`_`_0].[* SetLabel(t`_(`"Label`")).LeftPosZ(8, 36).TopPosZ(8, -19)];&] -[s4; -|[* text].[* LeftPosZ(48, 92).TopPosZ(8, 19)];&] -[s4; -|[* option].[* SetLabel(t`_(`"Option`")).LeftPosZ(8, 108).TopPosZ(32, -15)];&] -[s4; `}&] -[s4; &] -[s3; This way, U`+`+ keeps tight coupling between visual design and -C`+`+ code.&] -[s3; [/ Notes: ][*/ t`_][/ function with string literal argument provides -internationalization of texts. ][*/ dv`_`_`_0][/ is synthetic member -variable name used for unnamed layout members (0 is index of -member).]&] -[s0; &] -[s2; 17. Value of widget&] -[s3; Many widgets have some sort of natural value. E.g. the value -of [^`:`:EditString^ EditString] is String entered by user, whereas -the value of [^`:`:Option^ Option] is bool specifying the status -of the option.&] -[s3; U`+`+ provides unified interface to determine the main value -of widget via [* GetData] and [* SetData] methods. All types of values -are passed using polymorphic Value.&] -[s4; &] -[s4; #include &] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|TopWindow app;&] -[s4; -|app.SetRect(0, 0, 200, 20);&] -[s4; -|EditString text;&] -[s4; -|app.Add(text.TopPosZ(0, 20).HSizePos());&] -[s4; &] -[s4; -|text.[* SetData](`"Some text`");&] -[s4; -|app.Run();&] -[s4; -|PromptOK((String)text.[* GetData]());&] -[s4; `}&] -[s4; &] -[s3; Because this feature is used very frequently, U`+`+ provides -operator overloads for this interface `- [* operator<<`=] for SetData -and [* operator`~] for GetData.&] -[s4; &] -[s4; #include &] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|TopWindow app;&] -[s4; -|app.SetRect(0, 0, 200, 20);&] -[s4; -|EditString text;&] -[s4; -|app.Add(text.TopPosZ(0, 20).HSizePos());&] -[s4; &] -[s4; -|text [* <<`=] `"Some text `- operator version`";&] -[s4; -|app.Run();&] -[s4; -|PromptOK((String)[* `~]text);&] -[s4; `}&] -[s2; 18. Accepting and rejecting widgets&] -[s3; Ctrl interface provides&] -[s4; -|virtual bool [* Accept]();&] -[s4; -|virtual void [* Reject]();&] -[s3; methods. Accepting is usually a reaction to pressing OK button -or similar approve operation and usually involves testing for -correct content and finishing any pending operations for widget -(this may involve e.g. updating data to SQL database). Accept -must return [* true] if widget is accepted.&] -[s3; Default Ctrl implementation calls GetData for the widget. If -ErrorValue (special Value content) is returned by GetData, displays -error information contained and returns false, otherwise recursively -calls Accept for all children, ending the loop and returning -false when any child returns one. If no false was returned so -far, Accept returns true.&] -[s3; The opposite method to Accept is Reject. This is used when Cancel -button is pressed or similar rejecting action. It simply cancels -all pending operations on widget. Default implementation calls -Reject for all children.&] -[s4; &] -[s4; #include &] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|TopWindow app;&] -[s4; -|app.SetRect(0, 0, 200, 20);&] -[s4; -|EditDate date;&] -[s4; -|app.Add(date.TopPosZ(0, 20).HSizePos());&] -[s4; -|app.Run();&] -[s4; -|if(app.[* Accept]())&] -[s4; -|-|PromptOK(`"Correct date.`&`[`* `" `+ AsString(`~date));&] -[s4; `}&] -[s4; &] -[s3; &] -[s3;= -@@image:1029&260 -΀̔ޫњы⯄ȯŐݠҴ -륉߭ڴЬȽ삨͛ݝŷϦ -Ŋǭљݝ談塼㡼ݑőۼ؁ -ϚȢ܏יͷ̺šܯ냵 -౼ဩլꉚ윊ʲſߖ⑔˄񆈠ݢ -鹁˨͎Іπ뢻ĶɛєՒ¢͐ -ͣ럑Ñ݁綕׬ԝۨƱꀔһʸę -划МƁ˝ԑЪܞͪ٤ -žնɊ駑֌躨̀ɨֵЀ -ၔǝӅϻŻ͎ۿւֶӒ䵞Ɋپ -ȇډߢǰֳ°Θ༒술ЀЕ¼ߺ -ˍνΗϚ۸絥ޒꦚŻӰ˭Ĩɷ -𱍏욞ҠܼއБȿٜӾ -ŖړøׄಾĹرڇǮ -ҳĶ汍˹篶ʵς򪶍ӻ⃀Ҵ¶͙ܰ -̛ߥǔڊ켻٬ܮ۫ӡ합҇ -ؽΜтĥ撒ͦ흍͈ަ이 -Ʋ⚘̆ȩ됀뚖ôٰÝ˖̕ӗԛ͊ -ŋϙȇ̫̓Ȓ΄ѷꁥ̪ؐأ˴ڞ䚄˥Ԧ -˛Ц؋㫧鄄鑵Ò޲ͲŒا굵 -☡ǬтӹƝشкͥÂķàǁ -ɸ秨ߛⰌ镫떞۶Ǟ̖嬱֐ߵӰ酩 -쾯ӼՔֻוŹ̨ò؛̾ǽћ㟰Ŵδ -ښǴ馏酂ɮخǢɐ٫ۢʯ -Ňť멘ɂٌʐߚϗәܩ鏶 -՚Ӕ̓ʱ«۷Śෛ؆݅ɍ˚Ә -ˏʹãƴ݄뾐𜣀ԊÀқ־ٶؤɭ -ƻ报칏ɻڶߔӺѪюĠ -⿨թ۟ٲۊߛܸ̃ͿʨϗĢ -˖Ԁڐǐ칫ՌԘ -͚׹ײӠ鏍˦ˈͼ떛Ƌ -ՓŸ᥶ӢӒƱ؍ű팬󑶭̣ -Ķ̭֛˖Ҍ߸ቔؓݷƷ礴Ϟבά٧ް -ίɺǾԦӵ团ٸ߱ෛǗ䏭遇 -أɱϏ둟НӬʶš坁¨΅ -ϗ㕝Ŏܯͨӓʏ俭㈥ɷ -󽐡ꚩɦ܅ēӰР򔢘⬪ԦˬЍƻʚ -ߕʕۤËॗڳ҃ԟΨƻ͐ͯ -˞ƉݹӚ愵ϒޘ󠘖﫦 -͚óÂۋ㚵ڹ鈡뭨巍ѻ -КԌƴcʠͿČԤ뭩ô͋ -ϴê܆ՎִۗʣߚɈܳЌʻ؜ -֘ԴĠבѸƴ̭ˡơҚ -۴̒ⶻÔ횭ڔ㸛Ŵښڍ՟ބԵ -ߦشշ޵ - -@@image:854&629 -ǜ흇ڀî܅٣ϵƣє -ƘѠ셥ϙ®·윳񽥇Λݰ -閷ą辜ԒŠ╣ΣꛫۈӱÈѤ䧩ҡ鸚 -趙އ◡暏ǵ̓춄ȼ񄦠 -Ñۉߝؿ񟤣ƅرЀ̂ˀɇڦٙ -ꨠЂ潑۶葍٧ފ‹ -暞䋚Ѫځل؀ʀЈՆɰ幄Ⱦຆ -䩐Ŋއџڟяعт۹ÎΩߪ -ҚNJ킟ܝɍ⬾Ւʝر -ޢŔɒ˦Ȗċǂϑ懈ɲڊށƄО -ԀםᾇٽՖ۾ -ʓLjجȅۼ⵱ĴЬԖʸӔ㭺 -ࢊЋо޿ؿÍͯߌԼܢӥƋ乶 -чݱÿ͡ͿߙÿπۣΈ嘈ߎ͞۶־ -ɓѢƼτŢ󟴛ʁݮ -ɫş߿ׯ빟ѯ̹ߘ˖ϒްœ͒Ň̎҈֢ -Ϟʉ̣炠ʇϛ崩ⶖՀҡֱϴڣߓ -Ͻ티٤ⱐ֣ك킄Źʙ‰ -Ƽɧګݖߨ될וүȀϚ쑑ǿ -Ⱥ󿓠덵ɢ̐ꄋɚɜր˘篼 -ϲ߈ÍͧŹ֐ǧ䫀ۃƝݖ됁ށ -ؠ߷󻋢纊֢喂ĮϤӠա䝢 -Շ˭Ѿۀ֐Ǣ蔤ǒͼ -ոၾò狕ߕ֯ʍ򙩚ꎝ̿ -ѯ®۟㵺խʅԕ”㼅آɾˍų -͝܎ʂЋˈȏ҇싰ۚϐⶐͿ -샲ωǾǮ踩יю峂䳺ӻ󭉐Ā䆀 -ʲמʭ뙨䀳񺻱偞쎋 -뢰ψȑﯙ΅ȜωõӦ殺 -׆ݒï胧ۂʩ䯼ڢDz -ʄŖઠˍұˋƼЇ鶪㓳ϢIJ㋩͂ -즯ְ﹀űä˿کѾͰ䳓 -ءˏ޶͋벭㟹䑠߄ŝ -ŗ饟Ќۊ´¸¾ʋئ -ńӑ瀈ܱӓ퍇ېԐ -ԊߘШ˝宁р¹åҸҧ -ɸެ̂חыކ̭dzȵſ񝲧 -иѡ¹Ȣﮙ렺ҍ瑇Ԗؓ齄 -ށ߁ީ̝ꐔߜ֤铻߮҇ -»؇Ճ襎΂쮅¯¶ڟ -ϊӃߓχɞրԐրӶ³珧 -٩ӂ׍̴򙀪ٻ؂΃և -׀ԾˋѐǶůݦͯ߅ٔLjݹƕ -뗍ɂŻљ㫠ҵ샞ᶫԢڀ〫蔁Ϲ -ـߠ﵍۹Г΀ĉ²Ɓ﹁Ԁ΀ -؁Ā΀υހݗԩςҼҢ®т -ѡ¿էގ𚸯ժ왟氦΄ɑډ˓ -Զƛׯ؁ҡǸ㩠ͷ³ѠЊ҂ӊ܊ -ߠùؓ񻓜𹚺κ𘎊򀑵ݥҊ -܍ӧڶڵLjЮ؊ѷԏ -̫ٞȕфҔ̠޼ -񷑣ܖ䂂񤇐܀슳ۄ -Ř㸷جć쯲ƴᾊعЀ҈ϡܴ罜ȟ -ɑᇴދہ鍘БӜ⅃ -؀ݻ池ͨìڧ݅뒛ȓ莕砡ݣ -ײɟбūᶫтվƸ -Ջήô󡰿ٺœݩƀ廫ވЛҦ΢ -чՠ Փ̀ѸڽΓ٢鄓㮂͝ư -ȏߌ㏾ŝ޹ӭߤԑǥؿ腅 -²҃ܰ˿č݌֭̋؟塯 -ބėڊʊ͂ɠӬ́ˁ͊ -缅ЉٷړȘԾ֚ޓȯ›޸ -̖쉴Ԃ㠁˸͎ͩʟŊ -冸څŨ毜㳼鏜ӪƦ廿ȭɽ܅ -ᜫɆɯʶ۱†ާōЊ魿 -҂܀͐˂颲ԜӂʳԶǺߞւَؠ -ޥǴϜ٨يכ̌ -얙˫̗̓ߢḍާƂމ—ո -̓󣝄鲲ͱȇɪ䖀ߚ -ʾ֠Ɂɸӭߊ貢߷ܚꣀ‡Ƈ -ڴޗϊ︼ۼڊʽקϺ -ꯀǽႄ𸁼΀Å𸁼М΀𸁌΀ -ŝӸׄ뚬Њ莴堝׀˦ɞý£ޮ״㿳 -߄яᄀǍțܝ̴ǣ݄֗ɻۅ -㫋΀̭әޫ֯σ酧 -섊갯ɔւѧݶДحמɐŞб˶ -ǑրЇڂ׆ǁ繹ߞⅠؠݑԬƣ -󹜀ϪȺ׷ȅʡÇѶۖ -ӊ΀뚻ڣ׫ԀəޯӁǣ€Ⱦ -Ŏ΀ք򎵫ؚ֋Ԉ򫠹 -ɀʻ뚆Нۄ߄م뻼 -ҰݻՎˀզΓ琗鞺닀 -®؁Éêڸł -҂Β—ѩݱ넳ז꿡׹ȡ -ޢȫρ -&] -[s3; &] -[s3;= -@@image:1029&260 -΀ǜΟɴ̛ڋĬ򔖐ߜ -Ӧӓ馝دౚϤ⫠સ߿￞ݽ㻏炖 -ؼω֦֖􊶖ͤӥҶڹࡸԒͽ -܄Ѓ닒 -˱ۗۨȥ몵󪁾υَܒ -Ɤד΄ڇнʑ쒐ۥӠ勵 -àνۥ袶ͮԅΖѢׅˌз烺 -ګˇʸ͙Ԉ񉭁񬭬أ쮊 -ƠȞҍןﯛ圥аɈ֙î -ߠ䜧¶բѫé՞˄ȡܿ˽ -ဩɴ¥ڍӔ֤ӌфҌзžށ䏜 -܅ޭлëԯȵܻ̻̥ژ -Ƅۮܳƫŋөㆦ -ԅӖܫܷ궘ĴΛ׼屄ϚɬѮϷچ -ʗ؋ĞΚн׍򃀼ʃƶͻΛӞͳ⚶ -Ϫҟꥎ˨ɲȴ鍥Ӧ܋螺䨚ƺꦠȦ -ý愻ᚦ٬̓ԬӂМۜ㹌Òٚ혷 -懎⏿߁׃Օ傞ˀ뢣鿮ӔӬ˓Ǜ -֊鱲۩ϣ͚ܧݯ΂ВԓаŦӃݙӫ -Ǥ̚ۥ̨̇鰪ёۘظٴ֦Ȧ -Շܑż䳧͏НҲʣʺ۪֨ۆؔ -ö҅幡Λ扚˳ŶͤǙ饊칽찉ҫIJęڅ׹ -ʦƖ¦̓ʵ俌菄ᷲڔ -џȻ츚Кʙͭɻ׎з剦ҬړȴӺ -ٸƱب係ǠƖЌחƲճеݤށٶֻ -ɍ̓ꮙޝ楏ԍåǾᏠȟų̱܉ճЯ -ʅڵǜʻԈԆ衒꼀ԉ즃˽Τ -ŚБͥŰꫡñߪՋԻ̛̛吪ã -ŴҔȟȈĚюʥ݄ۗ쯗Õ𨂎Ү -ٴڄŴܾٴʘ͍확̣܄޸ޜ -Ȱӹ⯙ؿȶߍ٭р欛 -ο⹷ϿδѶ⫳ʗ՗笑̛߫ -÷ө٘߱赮ݾԘ䳅ͽ굥Ӯ늝޼ܴ -ɗآ֝ѳձӜʨ߳ƾƇ݇ -ϸô非ؠ܃ϱ㻗ﱞɧ -ʿ۾氞ļ晢ŵ̾܋Ԯ買в -ޠݍ܆ݦƴɏ񇷇蕮эݚ⛮ˤӨ -Ϥǂ›ٳ̛τÑ⽚ڤ̓錱Т -ӭӆяϏɺܡЙ¼̟ė¦׆ -œ߷ՐDŽ䬃Ѩۢ킷ǑТ˄ -񼞋ף뚱Ù맆ŸƄĐͯӆ -їËȯ̓ꏧӨö́߼ĨՐ -ُ㮝ƕƠ㝅匙뻼Ʒܮ -Ő߸ہ - -@@image:874&629 -ǜ흉߮ڂԩē؂ԭʵք˨Ƣ -¶䛬̿墦ϙΝ޻܀еƒ -ܶڐЄ؝ᴫ۽ĖƂ֚㐓ূ̡ܿ֞ -ꝶُ܎DZüƨםܞֶ -ӥ돆IJ湁˧䜦ҀÌܢ -ʙЃƄҕ䁬㻡̫̼ד敶 -̷ᩩ槉©—شʰø吮晦Ɋʐ౬߅բ -憩Ƌ璂̂ӬՉ֞Îծ -͉눔֦֞Ď몌īԐⳓҴԵ -٢Ŗōрǘ͚Ӫ͏٣ -뫒ۧĵ埨⵿ٍ·ߊſĻ։ -󄛗ᮙ齛Ӝӟַϴݙ֔ﱹҧ -ۭʃϫֲﵣю種͛ -²Г➗ꜚ윖ކ򆍔Ƿ -Ɍ۵ꪞθᬜ񜳴ᝰဖމˀɷ͈Դ߰ -ɠؿ±윧ؾʝ΂Ҵ˹Ơݱ -Ͳ蒉Ǖהڨ۫ǩ隚мޡﰆƃߊ -݆ۖʞ҂ذ懙ijȀ㍿ -۫Ġ̶ԐƺȗȿĈ󧺑쁚μ -σ̩׆ߤዛ𳏕ҷ׎؏ͤղ -׷ɝƆڬڂNjΨԍŷݢڵ߮ -ځͦˣ⌙έۆЇ݃ЃɍȲ -ʝσ؝Թ嫴ʉş⁌Ψ׳ -Ԥ׆ŧ͜Ԑ۬ݩծשѣ -ׂفʙեỼҝņ֕󇹃 -蕞וƾՓܜ˰ř޶Θ -܍ВЂـ̓۰׸ݻ˞Ʊ̀ -̧ղᢵةֶ晖ឯʍԫӍð -ԏٟ䮛٨ԩѳԻʙƓˀϱ҄ -䛚Ȍ䀺ꔃרÜնﶯՕ㌿لͫ -ɝǼø҄褙뽾ʡׅה别Կ -⠩ݓШߚת桅ڀⶏʩ֎ه -ܣ롃♠˪ꨭ̀뜜Ț̆ஐҜՊȕĒһ -ոև΁±؞ªݻܲĴ隷 -޽կᲂ˓䚆Щ›ꀧڏڐᴳ -갛ïчͥ䐲쌅ڵӲШϋСƥƊ΂ܟ׮Ϩ϶ -킅҂׳ȿ䀘⌐؆軾ۍݨ̸ -͖擷ΜЦ·쯁ӻǃ -䠇ڲƘпŏϺ͝ЫӧΛޣҧȚ -챝̞ڇǯϚβ†ʲ֎Թބĩ鷦 -Һȕފڇþ藺ʹӜˆꃹą -҂عɬϜɂʁ垳ۆݎו -ڦߢ˂ƈ݀׏ˉ驵ȃƙ -Ƕŝˢ͸ڕ䙁תǘͿ -ŲﵿŁ͡ܭՠҼݜށć茴 -޲چڹ٦ɡ堻堡ɥввдܘ -ⱔґ̤ā񂣾죣ʐˮպͲد缯҂֖ք܌ -вŴ뜌͗ə摱עŦÅ޺Œ䐈 -Ѳʵ߄±Ճ۪⊵Іޕ⇉ -ψ퍃˝ʁң򨙺웳糹ߨځ -ΗÃꑃʉˏ⟕޿ͼϞ¿១ц‡¶Ϥ -ӛ׆Ԇݦ䬻۝זٱȃĺ҂ɾ푡 -ɵڢĠ䤗ᚫͣŠ֬­Æܕ⩒ˌҍێ䧵 -տϺij˨ʐɋ񅏅ؿጫݥ⩕ň鐒׍ȉ -к׮緡Ž̔鞵ꬥڏ虞Ϭ柧疔겤Ò؃ -З߿ܾ᣷߾ԑፘԕnjҠ٥ྸֲҳ⛣Í -DZ˽ڷߵȫ䥸ˆߙ΁ޅ -ɁùȐ邑߹ꥍíعآ⫑ -ɇij쿕Ɠ艜ْІЊאӆ -𿹺鍣辥ߚ֓Բ葈ہʖĖ -Є𙚓㳴普ƨį姉ӠÖ񢢘Ъ -ĩ鸙½ɔߪۓ˳ÌƓ -陿ϊϱ趋᭛򔦉‚Ѣ؊Ն -ņ݋Ɏ㧻̯┡鮂؅ӆќųќ聛 -ʮhϺ†ЄѪ̩”Ԩ㗒Ϧ -߬􀶪̼ŷӀٗ¨Ȩİ򙤂ɐũ -۔ţ͞ⵞ螋Бƍ滣հ𤴰 -硫ل᛬򼨤Ł䡊ıοߣ -ζ遄ۃ镼뒃 -ہԔӄ̫䵯籾؏榣Կյ핉İד -˱ҮܽÃɥ֐ˌ֯ײʷ矽 -Ͼڮ缽ڿܢ冦ۋ폫ߞ -ܔǢ։ᱻÀӏﺷŽޙ -Ęݗᇼ㷲ɽؐЄͪĎ -ܖƳύͨԓϽ𾷳ܮ -Ľ뜉ɯݺϯ۰½ꩲ -Ȱ߶̹݇칑ݛޫݖ霺 -ɓ۴ֆˀ֌׎͛빾ܒ֡ -рН֟ͧ브ϵѲٟ䃾ޝ -ݗ݃崐ԿԶœƟü侀Ă -Բ׆پߑҜ߆ڢߝؘΰǎΌ -о뻾Ʈդӆ掭 -١堡堡ުܢޟ -̂ޱ倮ҾܒϷ躙١Ƕ҂̑Ȗ -نȉ藆̜퉲ΆΓڮ񫠹ّû檘 -˦͇ʙؖزƊօв҆Ќڮ¨ݍт䈽׆ĩ -͝ƣөڕʐ׮׮ڭځв҆ʠۦ -ܸᄇܑйͅΚ“Ѩ丕ͅ -Ҍڅ¥ԩѰ -Ѱ䫚ܔԣؗ…š -֘๼ݔ႒܉ϊ᷸דÆԸΡߌے -ҁΧ둡ΙŸҿóّ -ƥʼnտέˊլ١û㷚мτ艤 -ɀ訨ΩΟԴ‡ѦƓֱ͡ -ּʙќ߇瞫Ըćד؆ҟۚ -&] -[s3; &] -[s3; &] -[s0; [/ (to be continued)]&] -[s1; [*A3 `=`=`=`=`=`=`=topic `"GUI Tutorial`";]GUI Tutorial&] -[s2; 1.GUI application main function&] -[s3; To hide platform specific differences, U`+`+ GUI application -main function is defined using [* GUI`_APP`_MAIN] macro:&] -[s3; &] -[s4; #include &] -[s4; &] -[s4; GUI`_APP`_MAIN `{&] -[s4; -|PromptOK(`"Hello world`");&] -[s4; `}&] -[s4; &] -[s3;= -@@image:880&643 -흋ДؚՐ᠒ѣ憒̼㢗 -Ǩѓċҁєďޟƽϗ⯂ -酼񊾮ҭܭߏͤəۯ㴦ڔΌ֡ -ذ˫ַޛτӓ鍤獴 -朸쾨ꯃ࿬͸ɔ蹉؁֌ЂӁ͊̄ȤӒٍ -ٮ˸ՁಈƂϲ熮ۗ -օόɫɲ䒀ʮ겧櫲˂顱Ή -ݥ؎ܲ߁؏Āͯ²؄ɐ硔ǂ -ցߩ郓˪ꚄƆΏਖ윒΀ͧ󊁟Թ˙ -߄􍏽ҭץꗦҧ֭ǀꒆ䃊Ƙ̢ -¿޾ȇßӌ傉ރԗהȉӀ򯾬ط׆ҭט -߿źחխѮّѕرáںҚګҍ -Ƞﲏ†όԞضﱔذܝв¿ڂݚ֬ -ר郾茚Ώċغã܌Է̾߳ʷ -Ӵى̘ԃΟëȇϝ͆Œǎԃţه -ֲȕ䨽ٝݿΔѫΛ̙ؒ噃 -ȐɈˀƤҊûާʫČ֑ӂݫʈ -̲խ揧ߚ·ȉ̓הܯއƇԉ -޻ҊǾᴀ󉷳զץǩɣߒٞӇŇ -ü샑̠܆Ղ҇ĊоدݑȄтņ -򾊸ľ̗ÈǾ銎໎蓒Ň͐̋警ס̯ -͌ɇؒĊԝͺ֭ʌޕߵڲ̾Ūߣх -ДʙҪɡߥٹ⩣ϻ群ͅ -ȹꍊȇصdz琺ݭڲ -ёП浤ЍĿֆٍ̾瓛 -ɕ⫠ʒՂצ֭̂ܦ蓪Ͱ̔ -ߒº鵤͛冹ݮ扛ɹߔɡ돒ĐŅӼͫ -żŃԥʻ㑰Ê䃁矁潐 -ϠؖκԌšLJ뫠ە隘峴㬲ӭ̯Ê -ᷢ꛰æޅʹ۱ø徔߱ -͞ևҀ󩈕Հϭ݊˒ǪҔ품ݢ -㇇鱒䭾؆Ѿ൴ȼՏۑ܂Ï -ѻ٫Ń܃ֱ،Υָ٩̭Ǒњ -猉Ѻиʟȯڇ仵ߟڛʼnݙ̏耧ޖն -췰鐓署ƝƇᜀן߂ܡ¾ۖą萓ӉɊӛ -̤զԨӥƨǡ閄쁝ղÿС -虈߲셅腴ᨎٯʚӦּܑҨ͇ڈ -◴ȇػȉ־܉ˉɽ͝ -گữҘʗɝ坊ƴ˟إɡߍ̷̜󊛫֡Ȇ -̇ɨɀ۟Ч폌áЮ -˝Ȋռ䬃筌㋗ïґċƏͫ -ڭӁ؀ޝ⁤̩΍̮〉ێՈÄ -윗DŽڰدۡڕކތ΁хϖ -ß򑑏ޑ߄ޱ뫬ҍϐ¾ְ̇ -̇蜛İ蘏ءѶĿɇΝ -ܾ׃ٟׅџͅǚ㚉Ȇۢܒ졲 -Ëʈʈœ𑲛áԿ޲ -̇񠾸ᚏ̉࿊䮥ۼͺᾸ޿杧 -Ѣ™ؗĴȇߜ䃓Ü݇ -σ͟ڭ˹Ф΂颛ٟ羸߻׹ -əʎ괐ͱŒ͙ߞդ -ѫ‘흊ᯁǭѦȖҍ԰ -埌攉оȥɢƳ߾Æȓ惃ᾰј惃ᾰ蘏 -İ蘏惃̇̇а惃ܽ˥Ν -˃㽒׬Ȓ׭ٻիӡʾܰȀ -ůꇍ‡ϾʴՂסٺ® -񴏐̇ྸニӚΦӾ߿ -LJЎϡ՟Ýʢς荘¹܇ -¹팇ܻ惻鏃܇ -߭џ럤㰟Ƈᡘϖ㰜蜵ޅӾ -Ϲ̇ޓɆٯ凉޲ןȐݎۂ -ܽ䨏啮ؤ탄Ǵ臆 -炒㫂欚ܴƣȰއ率ќ⏅ˆت¯˅ҟ -Чɭā -&] -[s3;= &] -[s2; 2. Application window&] -[s3; Application top`-level windows are of [* TopWindow] class. You -can run modal loop for [* TopWindow] using the [* Run] or [* Execute] -methods. Both methods open the window if it is not yet open (you -can also open it using [* Open] or [* OpenMain]). Unlike [* Run], [* Execute] -also closes the window at the end of modal loop. [* TopWindow] -is also closed by destructor.&] -[s4; #include &] -[s4; &] -[s4; GUI`_APP`_MAIN `{&] -[s4; -|TopWindow w;&] -[s4; -|w.Run();&] -[s4; `}&] -[s3; &] -[s3;= -@@image:1920&1324 -לםᳰѪ؆˝є֚ -ɓڴجЇԅՊހܳ󎞜 -޳Բ̬ɭ˹֬Ҟ顋އݰܩ۶ -þɌ̣ƭݻϜۺ -鼿乲͚ݯ֏ҹƏϬ׳酝 -̳ɧϗ޳ɢҩɵ͚ړǬܕֿ -ؘ孙΃ڷƬɭ -ĥۖغۦۚҲμ䶞Ҋӗعݙ -ٻ枯ҰͣߙմնڳŔٴ氿۱ -ϫϞ끠ҥر۽ݴӞÞԇ֮է -ʓچʀՃϮʕӝ˧ڗޜ -㹭ןؾמߤ笟ؿ֌Ȟߙӌܕ -׾̦ۯËͧǫۚ -븨Ïܿݴɻۀҝϼ닎Ѷν -Ňֿݽӧٝ߹źȦ -æ¦ -ޯҾ̷ִʎ䶅Ľ֮ -ť促糯ܖ𵷴ͼٰ۟ҚȻ -ےɝȷ׿콷眯Ƕҿчߺ¨韀 -ᝡӵ޺ܼҭΑз -Ҿ޸ق߳匞ɎڊܱǢ˫ιޓćҿ -؟Ѭֿםʅ۽˒ؿލ˱۶݂Ƴ -ڛמϥۏܿٷ䃿܋𖕣叢 -繬͙ι͚ϩȾΧ -̙哹ѫϦLJà޾ܾ󲫠ܿ -Ϯ꼽񥧺ʐٛŕͬߛɔڃ -̚Юفݟﮯݟ㟻Ӷ͸ϔܖ -֤ݾӗ׼־ަշƭߞޭݽϞ€ˢΝ̥ -翮򞩯ߵ׎ͦˍΦ́ -ܠ酓恨Äꞛ麥 -ݏΦϿظ۞鯀ηƏȿɥˁ㪥Լꯕ׏ -Ֆؤߚ˫ߎϠΞסȣ -ǩЕᚸů˟ -娯ɽ˧ޫڿꟹҴֿ쪈îջ -邥ۈ֪Ƣܝ׽΅ˮUʩ˦ -󄞅ҳ׽헏ٵћݯڻƑʱرߡ -Ⅵǟ⶛Ѯطᧅ͓캽ҍӏňљ -ʿΒړ繸􀜞㹏ݱ汩̼ˌ -ڶݽ׎ -Ƙ֎޳퉟ϻļܼÓƌǯٌφꞹ -ز݅꛸ӝᘪͅɫ饃 -ݛ෰✖տѩ߬ -ɢڲʲߩ¶̿ʀϐˠមؚܽ˚ڲꯘ -ӳڡ۫̕ڻ۲ˠ -¦ھރ㎒˞щͻ쇀˦􏀐 -ѿ蟀ģŀ􏀐ѿєĐԑꟀ -Ġģ損ѐ萟ģâѿ -蟀ģŀ􏀐ѿƙ蟀Ġģ損ѐ -є۷Ȁ蟀ģ􏀐ѿȀ蟈 -̀ѿʀѡ蟀ģ􏀐ѿ蟀 -ģŀ􏀐ѿֿġ損ѐ -ģâѿєӫɸŀ􏀐ѿ -ƙ蟀Ġģ損ѐє؍ -蟀ȃģ􏀐ѿҴ蟀ģ􏀐ѿ -ĐϢ􏀐ѿȀ蟈ĩ̀ѿ -ʀѢӻ̀ѿʀѡ蟀ģ􏀐ѿ -蟀տҨ蟀ģ􏀐ѿ -Ȁ蟈ĩ耐ѿÞѿ蟀ȃģ􏀐 -ѿҴ蟀ģ􏀐ӍĐ瓙п -蟀Ġģ損ѐ萟ģϳ -ĩ̀ѿʀѡ蟀ģ􏀐ѿ -蟀ģŀ􏀐ѿƙ蟀Ġģ損ѐ -萟ģâѿ蟀ȃģ􏀐ѿ -Ҵ蟀ģ􏀐ѿȀ蟈ĩ̀ -ѿʀѡ蟀ģ􏀐ѿ蟀ģŀ􏀐 -ѿŀ􏀐ѿƙ蟀Ġģ損 -萟ēԷâѿ蟀ȃģ􏀐 -ѿҴ蟀šϭА萟ģ -âѿ蟀ȃģ􏀐Ꟁģŀ􏀐ѿ -ƙ蟀Ġģ損ѐ蟀ģ -􏀐ѿ蟀ģŀ􏀐ѿڪб􏀐 -ѿ蟀ģŀ􏀐ѿƙ蟀Ġģ蒩 -􏀐ѿȀ蟈ĩ̀ѿʀѡ蟀 -؀ĐӍ蟀ģ􏀐ѿȀ蟈 -̀Ёۓ􏀐ѿƙ蟀Ġģ -損ѐ萟􏀐Կ蟀ȃģ -􏀐ѿҴ蟀ģ􏀐ѿ􏐀²Ż萟 -ģâѿ蟀ȃģ􏀐ѿӿ -А萟ģâѿ蟀ȃģ -􏀐Ŀѿƙ蟀Ġģ損ѐ -ʖΜʫߨ޷ᯀ߮ȲުڱЕ -Нєۭξ֥ݦ법럋󶄀ի -&] -[s3; &] -[s2; 3. Modifying TopWindow properties&] -[s3; You can modify properties and behaviour of [* TopWindow] using -`"modifier`" methods. Note that modifiers usually return `*this -as return value, which results in simplified syntax. You can -also setup the size of [* TopWindow] using [* SetRect] (note that -unless instructed otherwise, U`+`+ will center the position of -window).&] -[s3; &] -[s4; #include &] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|TopWindow w;&] -[s4; -|w.[* Title](`"My application`").[* MinimizeBox]().[* Sizeable]();&] -[s4; -|w.[* SetRect](0, 0, 200, 300);&] -[s4; -|w.Run();&] -[s4; `}&] -[s3; &] -[s3;= -@@image:1040&1669 -Ѐ΁݉ؔ񂔄䓵⧈ДРᕣͳ䒓 -ˉƙζɖ͍ޗ㪢ĥ֖ -Ո穐ҕ²ʈ׈ىءЉӸܬϪƯݵ̉ʹ -쳵뽒ėٓ -䬛جԬ͍ﰥɹ˱꟦ԉ姲ߕǜ𱃓؏ -⛅֩޵ʪڑϱƊܶψҴӜԐږۣӯ -֛֣͊ժʒ⍗쑪ƌՉˮ坽ė┇骱 -׃ɦٍåճ﬜؞֡ڄﺅ࿱׏ -գՙ̮˘ΖĴʩވƲƽЛ -Ͷ߁봺۽۱ٟΘǛǘɇ͒ -Ԉ䃙պ՜򚇥ҼɻԘȔʳӰnj -צ卖ԃҮݮݾûӰܒųըΝ깅 -ճӷ༲ɖٯٵܹ˕ݩ -әӋݑٶҩڐٺޕHΙ -݇ӿϟ起Γ˶ۊ޲ſӎ꿓Ӻ˶ -ҶĕȾۼݝϪߵ֥ߑަƍϞ§׾۾敖 -Պɶ–Ԇ՞ΔƸ獴ŏٕ -ͷĜߦ뛈ޛȞЎ©; -ҿӟ컭ԵˮŞڋāݲϔѫ򱷣 -Ցϫ҅ӮȽ䳲Ҫ޼ǖ鑰;⽩ -ڸ˻ǟ߬ߵԿǹڝ󍓗򂵥Ϳ﷝ -Ψ䟳䗿’沫ºʼߦ±֧ -ޫݍОڽˆ͚Ϋجݫʟ -嬬ԙʒ̥Ŀެªޔ݇ިϕ䩞 -Ӕ圹ѯׇ̻ω߽篜簫翯 -׾߯η⽱ܒ֖냷暟͚ٹӥ -ϛַە͵DŽЀͽ -Ղ܂ֶǪýˣ߈Ǽɹힴ箶ަ쳚͡ؽ -ӥܥ݄윁֘ҏퟞŶؗŦި۴ -Ͱɑ멙꿢՟Ȝ«Ћ𿒞عߵĶʚ⫌ͯ -Ğ֛يۙ뵰̴ǘۇٞώЏ믈Ϸ싟؜ޤ -ϊԽކ彽ܩ󶬗ےյ۫ӷֿȻ료ڮֳۻ -֫ǻ޹޽͵΃ԛ륻ѽҴ -Ω˖򺷦جۣͦÏԻ󫪛 -؜ٔ򿩘ם΃ПߓұԎ֭ߑַր׻ۻ -Ãֽۻܐ޽稦ܒՓ╮瘅ӔԤұƨƇީ -ç٨ܚƎֺ㋙ܙĽܢӏҙ޼ -ۍΙμīﳨݕ梯ʹ竤ˌا⋋˲ަφ -˭ٿ͘ڬ᧟줴҆ -ί٤Ѻ綹DŽֻĤ۪ʠٵ咥Ӿ蹪ᶣ -ӡ۪񛨒꒺ۻç׹ՅϬŵ͜㽱 -̕ߌśٖ䂞Ƿԕ֟Ȧ۞떟 -҂˖ؤ϶閛叕ڬŚɓΫʷ -֧񽏧ݿڟ߭ -׼潺ϬՄȫچڣŽ탒пŧ޽âã•ë -ʿ섴軽Է鑲ȏؤȄو륵接ߦ݀ -�ߜ֦టݨٮʏٜ۠羺 -󏢾鱘ꬳϷ´لܒ͌ʖ܏ -Ә澛壎ھ秫ԭݣ۴÷޵ܨ׺䣞᯲֟ -Ǯ˨ȫ˫۞㑔س✯Жޮ֙ -ЍҼѾºńԤٞܕة۽式 -ּ㡶ֿًߗ셲ڲ -竞Ǟ罚ߑްپÛÎζۯӺ齊 -΅膔ߚ㫑Ԭڣ֭ڍȤᾉ׎ -оՍӤÌĔՙȶΑó -強ޛħֺؘٸԭٱʖߪ좗潊 -ęӫԵⴛסﱘʺ豼̟ -جҟſؾʆЏ혘ٰÃ皖ѷȔ -컏ջ׎ڧﭥԄ׮˲˷υú٪ڤՅцݲ㙎ޘ -ʙポϔįݺڙ⩾톁ކݲ -Ѯ㌲ͷοǬѤ辆󕈏珰 -̿˷œݭ۞Ҳܿ摸ƷƩ٧ -Ķ٧Ѱ؊ܣҦÈվ’ٝӽҨ -ɳۻܾ峅͖ɪڜύ߮ݱ -ㄬۦڼپдÎ⓮Щ嶱صٍ -쵛Ĵ‡ޮض􏩿Ó̃Ώްŵ -閖ߛמƗҲӋə㭽㚝қܲƛе -֡բէԢǕ襎ȵ򼁟ͽưޖ -Ӗ۴֩񛌥㛩ْܹĀ -ۙŹ΢ċӫʴ݂۷א -ȘŚ۴ίַߡֻ׏٬Ȏƺ -︿ۣ׉隉͓˖毱Dzòҵ۸ȵﵼ -ʻ鲿ߚЖԬǑ̰ݹݕӮҜ듞˂Ü -ؒଶƛ틌΂ָ彗Ъꝓ -賚ٟ軩ӹ¦ܟة잓ӰҩχˮӨ䦱 -қӛѦͣӛƦ汹숒ַŔޏ翣ϥۑ -˴ݚ栢۶غخ◁ѷ؛ܟ̎閳뽹 -۟ޏң⍷ʉɳ䣓Ŏ򡉲 -殺蟒̽ڡ՝֏ܭڝе -㈡ȦÚȗגξʛܱїŹͶ -۸ϛҍĉޫϱɲܿćѳ -ƣڎŗӴ೅˫ߋޠۅ -飡ƾԮՁ삮دłΞǁ -̞ޟþ̇枌ϥϦ؝ɗͼ֧ڜ -캽닍춻䭵ܳڸ풜֋ɭ -ա˒ѐ޿͢΍ӭҶ篈ΛꎽƎ遼ד骱ռ -Ĵ⥸ޠûʗح뽂ª -߶Šٙ՗Հ܀Ç -֏阒߫ǣ߯ѕˉׅף齁Л -ɢߦЛАЛɢުЛ􆃔Л҉ -Л􆔬Іҁ􆔁Л齁Л -ЛАކϷ荈ހ􍨡ޡߙϺ -Л􆆔ЛɢꮿޡހВ -ЛЛЧ荭ﯠހ荨ހ -荨ћ߆҉􆔁Л齁ހ荨ހ荨 -ހ܂ʼЛ􆆔ЛЛЛ -Л􆆔Л􆃔Л҉􆔁Л齁 -ЛЛАЛ􆆔Л􆃔Л‰ -荨ހ荨ހ荨Ď齁Лɢ -ЛАЛˆþׅހ荨ހ荨 -ހ􍨠ޡހ荨ћ齁Л -в􆆔Л􆃔Лɢ޺Л -Лɢ箿׌ޠހ荨ހʖםޡ -ހ荨ћʋ㏡ހ􍨡ޡ荪ћς -ހ荨ހͱހ􍨡ޡ荊 -Ɨ潍Թᚫޞׅߛ -矕ʝꟘš⽾媎ǣ󰭖ݿ齿 -Ӟ߂ -&] -[s3; &] -[s2; 4. Painting the view area&] -[s3; In order to display something inside [* TopWindow] view area, -you have to create derived class and override [* Paint] method:&] -[s3; &] -[s4; #include &] -[s4; &] -[s4; struct MyAppWindow : TopWindow `{&] -[s4; [* -|virtual void Paint(Draw`& w) `{]&] -[s4; [* -|-|w.DrawRect(GetSize(), SWhite);]&] -[s4; [* -|-|w.DrawText(20, 20, `"Hello world!`", Arial(30), Magenta);]&] -[s4; [* -|`}]&] -[s4; -|&] -[s4; -|MyAppWindow() `{&] -[s4; -|-|Title(`"My application`").Zoomable().Sizeable();&] -[s4; -|`}&] -[s4; `};&] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|MyAppWindow app;&] -[s4; -|app.SetRect(0, 0, 200, 100);&] -[s4; -|app.Run();&] -[s4; `}&] -[s3; &] -[s3;= -@@image:1040&669 -Ѐ흉Ԕ׫Nj₊ăʦ윧䥱 -ߒ֦᠘܀ѽХշ߽䴨ą̅ -Ďһ˭Щ⼵ĥҫңѡ´曄렂Ȱ -¾ГŰҩØ̩Şڛȋ鴮ˈ -ӏޓѓƀͲӛɠ縇ۀֶԯƆ炜Ĩ -ċӝԽފօŽ͐鴪ւ̙¼̋튞آဲ -ئɭۘԪͥ؊ꥩκВۤߍЧֈك -ؑ“ƘϹؽԛ£рʚ󳗀ߩџ؜ -ڬԥӘþܦܻښЕ㌘Ѕ嵁һꙍԇ팹 -ЂҘǺւȪۯ˸޳־Āļ -؛ہ폜㌡Ùǚ넝Ǖ䱓С䋶ʂʖʓ -륓飐숝߯ܚĈ„ք֭ΡǸŸθ -ժð޺ä؎ٲÐ˛з澞ԎƷϷӾЍ琢 -˳ߵϞ򺒼ɶ¼ЍȿԽ㻛 -㶶Ւͩђ뉠ݬǕ߆ -͈ߞӵڢ͕Զƕ߳ଧَܑТȿ -ߞמ⚽엝ܪйŷሏƲǟņͻɒ -ʓķ˄ႵՆ륔󌆄莿̀Ñʿ݄ -Ļޑ߇Ϻ״ǔρ·퓅Ý -ѡ߇ܯܰÓǼͩĄ̘ԅᮧ -Ԣ֜뾅쯫޽Ǖ۲ͭ喝 -Ҥ߷۞ʇޅҹԣꞫ͓͛ȯą˵ȶ -ΏŢֆ̅ǺƸ݋尽λ弟Υޯ -̡ʻ퇸ȏ볘ۘ뙝Ӥƪӥ̗߱ݳ峲 -ҳ׈ɨҫ̠ݼ㪫㼙ܟ⧺ނ -ҹӴֲ뙯Žʏٲ¿ݴЇԄӓж濾 -ՃࠅФ쑯إ٦ɱɕͳϖʦܲ٭خ邇𿳱ȯŃ̏ -њӘՋօɾዜ֟嫽è۴󲀭ѿ٥ -ūΚޘΧƢ΁Ąĭɓ߃ᖼ򛝼ߊ -ʜIJ哲Ιޣ卉ܠݼɶꔦ˙ּĔѯ -ƪݥݼͮ剒ݏֽ۠쪽ŕ -ճބDzܙē߹ǟំӗϹ͐ -áȭ򇝼٬͓Ρӳ٭颱߲䄁 -·Ԙ̍锠Ԯ̷ŹżИХś -߫Շ뛻֡ף޽Ջާո -涎⟹§ǖﲉեՏ޳ҊԏдԿԳ»ĸɼ -ȣҫʣ짺᛼̷ʼܿ驅̓҃ȧѽ -ˊʹ腨뛙᪌٣Аߚ慎߆ -֩ԢညҎв߅ӫС҉բϳ̾ -Ϳ۸ۄغۺö•̐؆׫㸿ۘ˰Ǯ -ҌöӋѿО虦驥Ǣáϻȝ֋Ɔېאʍǒ -Ք씩ǶѤ¡ƐçƢˀͭފ -մչ߱Џ߃ʍՀȢƠƵԵټǞت -Īߦǰ䙍좽Ͻž޾ȂǺ -ߩӒĂ˹ۨݺɰቋą♧蛕Ɲ -⯡֠޺ާ‡ةʎ޴ށ琺΢ -Ņ̙Ȫƕޢ̖ݩͷĚՖꫵƶ -͊хɒт֑·ыʛӗː̌Ŋ -ڤΟ뉾팚؟糆ÖćЗ؝ħ˝է -ة儕ڎَ•㺏ʙݝ򇲮Ϊ -ԉԳю޴㇓ȗ٪۶Ӗȗ֏ϐץ -ЁɴϞ޺Ȓ̥فڟ즔ȅϦ -۠ڄҗԙ¯躟όꑭӁһ -Ҏ̆ʿ۹уߴ׈˷ӨʺʣԢ֮ -ڦ닩﫿쒠ѠޗԘ諛ުΛ˶񥊗ʔ -ȭĖԂ䗾ʨҽܚݦġ -𶷉״Ͷș›̑кÄԪ -ьӢ݈𲔟ۯЎșձְۄܶđ -拺ȵŸޑ̫̌汉ݤبӬܖܺ -ꙣݒːԻݛ琉””Ѳײ©̡ɂߘ -ަְ܌ӽئöӦƸ -蕬ѳۼ܍Ƕ涡̾ԘNJꇛĽ藠̒ -Ý݊Ϻ݄΂łѾˆՓ⭫ -æ̓鮲٪灇ξ枭̕圿ʭڱ띒ͮʽ -҄ɢ¡Ŷ൉߱ʒτ㫂ք͹ -񯯚䪛󧠠Ҟٿέ膧ڹԪLJ -л܃љתۜΘ˗̼뗃ፌПÂ٬ -乊߃ƕξۋߏŏݮƞ󟹍ؿ -閟̡ΟّձꋲʐҵϯմٜÙϑ䢬؋됷 -۬һƇީ淄ؿ⯫ߓغЬ -Ǘ͝ŷѫގҔϰą뼔ᘍׇުߐŲԝ’ -ֽݝՓƥؔ򶸂‹Ϋ -٦Ł漤߃ʖߟߎݔڨʼܢè -ƽ፩›鄷›ʑ›› -ꁨļۈħ٥ݡƓވፈϑވ鼏 -ۖ壂תϳՄ›ކ䭟 -ƄџߏԿڛիҽۄİȰ姩ʼ -Ԉ޷ޘ؆֌ȩݎ𖵶ֵݭ̼뼮ǜ -—ݰ󄩂׆ᴃÍƙ쳭Ӏ͜㷣̖ -ẠÜّᆽȂ酋ҩܟΗǙ³ʳպۨ⾗˛׺ -Έțךĥ٨͙쾃˷֑ -͢εދ̜첝ń˞׮ޘ¼ -œԄ迤⯙ބƍ녓Ңڰ؃ӂΑͰ -͢߁怄Ӂɵӆӯ΁śݬ흩ͰГ -ꖚ䱜ؽΌꆱʃ -Ę싚΅ɷڄهڻțʎ -ό卽͐ޘՉϪḁȁݶր• -ּݰáƭ⿏甾ﵲ錊Ɍ -磖 چȃ෢͑ވፈϑވፈϑވϑވΔፈϑ޻ፈ -ħӄ͖ΑވΔፈϑޟ› -ӄ̢طᧈ››ҿɞʐ›ˢ -ވፈčፈӑ߃Ј翞ú -Ȭ›ƍ̪ħħԼϑᓍ񙐣维ԓ -뇭ݹĿڦ۰ާӾʜƵѻܡѵڪ -ۨЅ㉮ԅ寸뭻ɩߣް͉ -ͬ -&] -[s3;= &] -[s2; 5. Reacting to input events&] -[s3; In order to react to user actions like mouse clicks or keyboard -events, you have to override appropriate virtual methods. To -issue the repainting of view area, use the [* Refresh] method.&] -[s4; #include &] -[s4; &] -[s4; struct MyAppWindow : TopWindow `{&] -[s4; -|Point p;&] -[s4; -|String text;&] -[s4; -|&] -[s4; [* -|virtual void LeftDown(Point pos, dword flags) `{]&] -[s4; [* -|-|p `= pos;]&] -[s4; [* -|-|Refresh();]&] -[s4; [* -|`}]&] -[s4;* &] -[s4; [* -|virtual void MouseMove(Point pos, dword flags) `{]&] -[s4; [* -|-|text `= Format(`"`[%d:%d`]`", pos.x, pos.y);]&] -[s4; [* -|-|Refresh();]&] -[s4; [* -|`}]&] -[s4; &] -[s4; -|virtual void Paint(Draw`& w) `{&] -[s4; -|-|w.DrawRect(GetSize(), SWhite);&] -[s4; -|-|w.DrawText(p.x, p.y, text, Arial(20), Magenta);&] -[s4; -|`}&] -[s4; &] -[s4; -|MyAppWindow() `{&] -[s4; -|-|Title(`"My application`").Zoomable().Sizeable();&] -[s4; -|-|p.x `= p.y `= 0;&] -[s4; -|`}&] -[s4; `};&] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|MyAppWindow app;&] -[s4; -|app.Run();&] -[s4; `}&] -[s3; &] -[s3;= -@@image:1800&880 -Ђǜ݋ߝ񓄐܅בРĂۀܕѵؖ -֞ުېŃ̒撶晜̏׼̙榢̢ -٨ԙס촗˭ʮįת̌䜧Ɣƺ߂ -úۓыӡ;ڒ˚ܫȃˣђԉΏЭ -ɍ‚⨧ڠŧߨͨ都ĕŧڕӦպ -ꥃꀝ𪩊ЉΫŚʚ߭ꁰԣ㦪 -亣ŬٰߒՄ²΄㞎Ťʬ -տ̺ݪ՚ȋ򳫦߈ԺɅᢻѷݲˆ -ԗƝܱןƀʇ -مثۄšʈԛէ⪒ŕ٨ӰԻЙǕճԮߘ -ר̛ՒٴˆԡťԔ񞹒Ŏܚݰ -ߡƯ߆ꛅݱꆓþ܏Ɛ濌ǹϕϥ܃ܣ -ָǭٯϠ󲿪ǖͬʈ󤍺 -󆘔̚뤒֝ɸ꿓٭睺ྡŇ -Ťŋ޿̛ڞ޿缮ϴǼ -ߟ²نߊŵݎȑ֫ݘٺɺŏ -”ؾҳڛڷ̻獘Ǯ굔ϯ -ۼκ綽ͶʗՅԟꪠޤ晹ҽǜԤ -ԯѧלťҋȟՕ╳ȘɃ﨨 -ͣϪ׭櫿궣޿ڎ٪֖ӕڧ߁驍 -¨ϼү՛ϼԦʞο׿疴 -ӎۼ҇ղْɂʟɎكӞշ -͇؋Żöݣ͗ˆߦꂞ -ܥ婏뙳ҭԲ׷홪ů߲׼ދ꽅ĸ񅪶ѧ -ן䥰Ǖ޳홃ǖطԾߡƏӍ -ɶljݙ柛З缕ۻή֝ςƻ󽝖ퟡ -㖓ێؠˆ‚􇼙ؖŮݽ -ٯԐƈܧǶ۽匭Ŕ͹峸Üߨ -Ӈԩ뷿Njټ힁ɖן҈ -ټֻӟҥɛӟƿ˿ڳ̞ҝ߼㾓ƴѯ當߈ -־ʣȝӲݿǖΎѹжȟϼɽ픛Ͱ -ȯڨ׫§໕돞毖槬࿨ꉗʕ̈ͺˆ -G登ʳҝދݽᄅ즻з㨫 -ߨ޵Ҽξәɂٗ씨׵ܷܠǹǷݷΦ׭ -󩨸ӯپ׎͎ژ厵ܶ -߰򗿶ˑޯյԷΈԐ읽ɟ۹ -⃞׹闯㢚Ϗκֶ쇁ԭك닗 -ʪڲձŊξҗҷ㻻ܖ냔ŕ̨Üㅯ -嬪מּݕ폛Şݪޥͺǝ -䕯ҋ̟߻󭏘葻ԡ -ˆ͜ȃݓˆص᫽ֺչۡㆧƭƈ՚ -ѷւ𪮞ܜْӿ揵ˆގݝܧί߰ -ƍݪؕΙϭʾڇߋڠկ -Ԝɧ睳Է돾㧼ѻꋾެԋ򈍁͖ -ħʅˆԪ뛕ͩڃᵎ좾 -Қ֚˞ՆLJȭ篾˾ -ۯϗՍ렣ԬÞػ܃Ƭ޻ -˽ڭܟ꜖㫛ݚʾױړ˦ص -ҩ⻢Ǚﶍ˗ꛝᓎ -鼓φԧ꺼Ƀ͆潯ݴѻځ“񳡉 -񊐠ר뽪ԄۺС -ԭɼϺŜܲލ΁Ԙ—ΊǷַɏ -ؚ׎߸ʷݷٳ㆏ͺԆ -ߺݬžگ꽽﷩ƼҶΪᑐLjļ -Քꉆв錱嘐šԻީ剮ݓݷޟǫŽۯͶգ -ƙψیȎܟ״΅飜Պחķ쫜 -ʙ׷Թøѝ˶ӞϫݣϏ䝻ʨ۩ծ -̦Ͻ׳׆箎ډҭӛΜٸث񶞴疜 -ߪĄΘ󚽊蛤ˆ֨٣ݣָ܎ަʻ -׮ɽㄊꖭ㤇ȟѿވݟ֔הڹƪ -ۭѱߎܷ㌽ǫзŔۏͭ֗ꨭ -❞żۂʕ۟وߞ֫ -迄䰏ԫߛNj˭ڤݵƵ뼣 -ݗﺦ뗕߽ݮȆ镵ڜ򤍎񤍮ʝ -ٔ螘ՊٚԵ߸߸ԾתӎƤ -ώ͗љ躠Ȳ羣Ȥ¢ثԚӐ佡֓Žȣ߳ -릝ɝݱݱ߱ܽॻ摒ʯȝͬŕ -˷Éх̎ӭȑ쾪Ώؒ߶ţИŭ̸ -ۡ免ד³痜˖ׇٟǛ -ߠ򏜵ݜ̓˺ŧůݎڤ΅ -Ը΀LJ͛ڭǸ֎鑭 -Ԭ߰ڍôԎݷϴ꛺ٟǴ߫杯Ε -ɇͺ켮ڨͮџ -DZɜݷڵݣݳޱٷվ߽ۗ -׆̄Էڽط֑ѾٸՈҳɞ׎ -娝׌華ѳџڝЏĝ󎩻ȸϻ -ϵͷ鹣썞֍ӎᮣ -胝³㞬ɕ喐ٵΩֻϵƢ -眣ߨ޹󷂙܁Ι󏞔‚Ȭ -ݦӽ֌飕ҬؙᄾЧ섥ʑǤĊӵ -ߟǖŠȵȣեÎ˫٣׹Ի٬ -֑̝҉餬ΊެޡɚҚ -߀蛀ȣ􍀌ѷԆӷǿ -з߀蛀雀ѷ -蛀ȣ􍀀ѷԷ蛀ƇŐ߀ -蛀ȣ􍀀Ơѷ߀蛀 -ѷŀ߀߄߀􍀀ѷ߀ -蛀ȣ􍀨怀Ձзŀ߀耛 -ȣ􍀀㍾뛹􍀀ѷŐ߀ -蛀ȣ􍀀ڠ߰߷зߘ蛀ȣ -􍀀ѷހ×􍀀㍾Ѩ߀蛀 -ȣߟ߀ѷŐ߀ҁ蛀ȣ -􍀀Ԡ最ѷŐ߀ҁ蛀ȣ􍀀Ơѷ -􍀀ѷ߀蛀ȫ -·Ѓ蛀ȣ􍀌ѷߘ蛀ȣ -􍀀ѷŐ߀ҁ蛀ȣ􍀀Ơѷ߀ -蛀ѷŀ߀耛ȣ􍀀 -㍾Ѩ߀ƀ蛀μ֪ǮқۼҶҭ -΄ݴㆾςʠȈՍԚٕǕþ߀ -߳їιڷѩ氈٘Лԝ͌ȃ -ǡꏾ׮쫯԰ͭلܫվԺ -׆ľ䡟׾Ť˕ܵٶϗ􍀼ف˛էդψ -؇ݠɦ蛀Π꒷󄣰ނ -蛨կ۪ؓ҃գԸۺӷ􍀐擷 -׺ܥմ꽔οۼ谐ѐЃ߸õ -נ𳩻Őȉ灪ܼþ쐛ٞ -԰зȿ귟݃ߟ׵親зȾ -茠ԍ׶зͿ߷˂߀ߘ -Ũߟ犂􍀀Ϝ􍀀ѷŐ߀ -蛀ȣȣ􍀀Ơѷ߀蛀 -꿍зŐ߀ҁ蛀ȣ􍀀Ơ -ѷ߀蛀ȣ􍀌ѷߘ蛀 -雀ȣ􍀀Ơѷ߀蛀և􍀀 -ѷŐ߀ҁ蛀ȣ􍀀Ơ -߀蛀ȣ􍀀ѷꀐԷ蛀龑􍀀 -蛀ȣ􍀀Ơѷ߀܀҂玀Ӏ -߀蛀ȣ􍀀ѷ՗雀ȣ -􍀌ѷߘ蛀ȋߛ߀蛀 -ȣ􍘀ƀѷƱ߀ѷ -ŀ߀耛ȫڷʑуˆ򡄄ƕތܓ誻ӏ -֧귚ԫ굓îߍ;䀽 -֯ꗾŪº۫۶׷߽杬ߏݏ龃 -˘îڋᆝ߸Ɉ☴ -&] -[s3; &] -[s2; 6. Multiple main windows&] -[s3; If you application uses multiple top`-level peer windows, you -cannot use the [* Run] method as it runs the modal loop for the -window. Instead, you have to allocate top`-level windows on the -heap and use [* Ctrl`::EventLoop] `- this event loop runs as long -as there are any top`-level windows opened. Use `"[* delete this]`" -in overridden [* Close] method to close and deallocate the main -window.&] -[s3; &] -[s4; #include &] -[s4; &] -[s4; struct MyAppWindow : TopWindow `{&] -[s4; -|virtual void Close() `{&] -[s4; -|-|delete this;&] -[s4; -|`}&] -[s4; &] -[s4; -|virtual void LeftDown(Point pos, dword flags) `{&] -[s4; [* -|-|(new MyAppWindow)`->OpenMain();]&] -[s4; -|`}&] -[s4; &] -[s4; -|virtual void Paint(Draw`& w) `{&] -[s4; -|-|w.DrawRect(GetSize(), SWhite);&] -[s4; -|-|w.DrawText(0, 0, `"Click the view area to open next window!`", -Arial(20));&] -[s4; -|`}&] -[s4; &] -[s4; -|MyAppWindow() `{&] -[s4; -|-|Title(`"My multiwindowed application`").Zoomable().Sizeable();&] -[s4; -|`}&] -[s4; `};&] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; [* -|(new MyAppWindow)`->OpenMain();]&] -[s4; [* -|Ctrl`::EventLoop();]&] -[s4; `}&] -[s3; &] -[s3;= -@@image:2609&1714 -ׁ־ˆϙ񯳲긺ꨈȾ·¾ȏɺ -Бࢺܪݝݺթ뗞ݺڥĢȤĢ -Ģ䤒Ģ☟ӳϺݐҳݵ赬能Ҿɤۉ䓐ܗ᳏ -³ҫȱɾվꜰʤŐȤ㒥ӫĈ㴦̸ޥݞ -ۣ܌цҐʀ˶ې𷝰̐׸ʆʻƀĭާ -ص¡۩ՔЩלȤ귗ߊĩᓏΜ -ꐱ悥Ȣԩ؀҈ȕޅ߮ށǢÝ՚ĂƒחҽȌˆ -ݰ䅗ِ脥ӈ؊͐ţвҮ܊ž՛˨ -쨁ڋ٢ȉʺº҆Ş֗ݓ⫖҇ɤͭ -ݶÑčΣǺ伎б܊Ɩýَւێ -ѣ۳›߭Ҝ±܋םԎЗ硰ٙܶߡ̾ڴѭ -ް˸ƿօԶ±ڇيƼꏜԔʬ -ّˁ陡˲烒ǣꭟܬҷ溄ځ将 -ۄˆ⡄ɚſ˃ӑݡ쭩ɛ擱ذ옗 -׹־ʿߓɜ兠ݾٮԝ۲ꓷۤ۠ޗޝ -•񟜶ĝڗ߱Թߡܟ -ѿƤЈН̺ټڼݤ䑊ܔጠےͳЬؐό -î޾ܣ˵Π髮̦䚬 -ꨘ勽ÁԾߩΫϩҧ䳬Ӿ -Нțʐǿ˴ʘȴ̋ѝʉクæ -⢐ݱնЅ훺荺ѼхЮ -ߑ珜ٽ寖֧ҙѻƈ͐ڧ͒ғ -ٱԵʤ҄޵ܿ¥∏썶ўƧԡƗзސφɋ͊؝ -ȿܱ߯̀ԅ¬ǎժՇû -߻ǿʅ鷻юߣ蔗ܓ̡̬讀۷ -ǛĚЀ̶ՊĒ鸻Ҷ Ȋزϯ -𶃨ì˞𮼵Сب䍗ŠΧ -˴šϜïуׇ֒Ԃ̾ΈЗ󒌁ɠӂӼָư -㘬Ơј҅޾ʦ꠲Շ۳֟̀Ŭܦ -ĭ饆ܕȼɐᳺ䍆LJ쎤 -뜙̚嘤̈춍ѰŚԫ⧼ -ط뛡ګ̦΅񙰂áӇIJ֡Շ۸ -ƌѦᒣɫȄíڅچĤȴȿۢŽ֢ -ۓ̕䛄ʝ¯ޮنӛա -תɻ䑨ϰث㤍ڸ¸̸ܸİϓˆ -킦Ҷݖݛ哗Ӌԡ؝Š˄ٟ -ՙîܵɊݘܥ -ϏغЪڴ兡Рᚤѥ嗢ڸŴ҄ò -ѽѸ޸θ뜜㜐횗倚霕 騉նۡƲ١˲̎ݔ -ޭɃ痧խ殌噓ጐȬ򁔙Ѥ -˹Їߙ˧š򠟾Ꜷ﨧ځ͓ݩ֑ -ޡҊҴɽ乘쥙ȱܒͳ͓Ӹ -ڴҴҲׇܸشވ앀׎ؗ頔ퟟ훫겼 -黼焃Ȕ⦆чٸƪч -઺䤑¯ɺꡆ檷Ǣ݁Ђᨏفܵо態Ȟ -㿼㞓螟ؼ욝䚑蚒򍳿ӚĘǾããˍʆޟƦ -ӯʎޥԡIJǿǷۧ鷰ؾճ -؂ך杒ҍʭîὤĈ·͋邒 -󛤵߹ᕡҍԢ﨣㋫䚬 -힠隒ޖռɊƲʒ҈чफٝ -ӹߵΫ笂˯譇ԠѲïܸȅ -갽Ӳ䑑͇ֈɋꪪԁލ -ѵѿԁɋ۴¯אʮŹΥȞݝ -ពߵƽŶ̪ɬ߽۽Ѥӟț毮ҵѭ -ϫ嚝łҎ׳ǽč판Ձ֐ѝ쪃ű۫ -֙ڪ̳ˏ̤ˤךΎ۾ƒ -ԁӬĿ枻ʪѰċҤܾ -†״ð׶ѳ器ĵՓճȨʵâߏ -˷ƗޞɷĂ䪗Ʈٟ΂ҽ맇ƑԠ -ѝ쪃Ѹەχ͕̈߰ﲲĜ׽ο -룎ǨԵ̔왩ӪѤ̩ܳͰꉁ࿚ -̡ɺ𥖁¼폎ޭў൳ч䠢ԇ -ȣ̤ͧ嘙ƨԷȤˉ̴՚Ǜ֦̬ -صᇠᯗՙڕᩲɹ -󃴹˻憯ՇՅꐷĚƮ՗ϯȎ -޺ꅢ݆ݶ΀ӶӶӠӱŠʁɝ -ܔdz߻מҮɻ쎈ۓ㟽׳ԻώŻ㕏Ƣԁ׎ -׎싀ӇĶ׃ÃϏࢨ၅À -‰쳵ȪƪՆʵگׯЬԾ÷̋ -цǿޯޭ瞊ՁޕʣҐӢ߳ʃƹ -ʓͼն֊حퟨǯήθ˫ۭ -⁋Ģ۝򶴑ǫ݊ʸϜմĒˋɿě߆ -݉ꬷ؄仒͌юˮߊ -ҋˋ쇾Ү栺ëա -֩Ԑز始ȷ䐵䊋݈ͭ崗ڸ޴ßͥÏ -Ǣ򨎝ϑНڡ·٦͒ߴӳۂ쨺Н -਺ʶĿܬԤ̈́Āڭ땻ʵ -ꉑڑڑօŐ坶劙֙ŽٓӉ֊ސ͕쏔퀔 -䜯ّԊ畳쯘Ш炣嚃짫ғ׹ -ԝѐ͒ĉǝͳǡ꼐ś쳽蠕虞҈ -؏޻ݴ͊獒՞ԽݑќȽ -ԝԑٚ兹̾ؾܣ -غڋҶŃʜݳϛɓƕŰۅǮܸڰ -ۮ˝҃ˮĖś؞ׇɻ˜҄ϟ -ۖ촊ۈפݺˋք⩜҂Ֆȏ -ҷۻ׍낮䧇͕Ŏдҥ -Ŋ矯٩߅ﳀиɰҝ͊DžНՇЈ -ػŗׁ䬵Ѣぞ̳ɨ̝ÖڒˡᮼނҨع㓿灅 -ܼ욡¡̶˳؞ԇՁΆב̞ߺ -ÝŃᅋ蒁҂͵ٙ̇ڜݟѫٞݨ -ݟ좫蚔⢀؀ڞĦ -᷊ѡ̍ϳ陰ȝܼݖ˳ڲНƦ -筙否ײ캅艍֟ЍDzՒǴ׬ -턾疘NjЙŽֿΒ -ॗӭɬ춤܊읣ѭ̥ң۩ܫܡƇ֟҇ȹó -͏لԐů鰗ƥԽӇ˩Ϥʓ -҃ڦÑ޵ȁб٬ҟ鳄只 -輳Ϸ阕಄ڝ͓䐄ȝ -邐ˢǑƥȬƱ춐ߺĈҼΊӼӯα -ƀבڌĢѲʒĄƣȫ䆋ѻƠ -ɏۊɐӈįߣԁŔ֍Ű֐ʵǯ -ԊҕӚؤȀ匚͗܊蓌ݞ̈Ȑ󑁒Ԭ -ͤ҂ŗ’ܢˊ٩̆ʋˋЌ˽呿 -ɀ֓ш쯫붗ɓ𘠻ƒʖʠ˖ς -ij፱Յ˃ׇˁ⤔릖ۭ瑄 -׬򋞇ր蘰廮箿ƣߓ󑬇ޣ雮ߤÄ -ӝЗ粓ܶǿա̾馵ϴѭɰް˸ƿ -֏ԄږيƬʸԔʬّ˷陡β -ꭟܬӳߝ΃퀁߬򃂭տФҟé -̹֔Ŕۼ͔ɘƘʘγ̶Կωȍߴ· -򂐌䮫߽ڗꎜى۲ůүΊߑק͚샆 -ؖхחީݻџ뮓Έԡժ -ǫӍ̋̑덋ˍˍ醟ѕdžՇ -ݷݓ瓛Ɏۜݬ٤Ȋܓ޿䷇Ǥύ -זӪӪӽ˂߾ڌȟѝߔԇ斣䅩ƈ֙ -ȠڽִاŸ睯݌󮸈ق -ᰭŀھԽɻуЇ腺ΟϾϑ -Ο잂᪃󣕣ӌΛٕϚ㌳㍳ -˃őӈФҤЕ˲ȃӳϷ -⎅Ӓمφٲۥǐ㈭씷ڠ -ׁ팡ٍԹÔͳ܌أŚ -LJ٦䄪ŭɅÿΜȃʍˍ¶Ρ -썋م‘ߚžۋѬյݧ֐ݧю -ÞԸ֖訅Ɛݟ̔朥ݴٱ¸ȗ -ѧն؍͢Ɨאۻڔ౳ܘ靛׻ͫ¤ -ܴ䃐蒈숸ȌζׇǶٵٲ -ɜ휚嘩̈⊍춍Ѡԫ䧼طګ -̦܁΅á߅Ƭ‚Вłܵϣݕɿ¾ -蓹߲韨âߡ뢞ъúʿ -극²Žќ潡ו殢܋鍻홫ٴѫȲ -؂괆Ƹ휀ᜓ朝昛鄢傑تĨ١˳ -޵哗Ӌԡ؝ŏ˄̟×ՙф -îŎ͢Ɋ蚚𪃨ݘܥؘЪڴ -兡Рᚃꍊ嗢ɽڸŕՄòѽѸ޸θ͒뜜㜐 -嚓需ᚕ騉նƲ١ײ׎ݔޝŴί -睫ۘܘ˳愘⚱䢂ȃĬʫˠΡϖ -ľ䒯ߴؚئҺ̑‹ʃ -ȃٳ϶楘Ǜͮѫњȵϯ -鄨تफ豐솢ڡۿܷѭԀ֑ψ̘ -҇ٸƪׇ쮥ġ¯ -ɏǢ݁ЂߨفаȞΏ㞓螟ؼ -욝䚑蚒򍳏ӚĘããƕȆڰӯʎޛ -ԡIJǿǷۧʷؾ䲋񒬁ީ -۫邷⻤ΖÂ̈́ڦ٦ߴ݆˯ɿ¾˔ʤ֑ -Ӧɟíݞ̻垙잿ͰՍњ֍ -ꞷؤżټټ֑̌۳ȝʜʷ -؄Ƣ߂ۏʀŠ𠒿ܰˢŽᒼϿÏʜנ -ײʓ䨙ң㴓ЇǏՐ쫷DžЅ -Ѵ勽ʰګ獹՜갱ʥ -誷僘ŕҫݗ׽Ԕބ쪦Ԫʹ -ʜ܈˴ɬ״ǫ焀Ǝϸԝԫ㊉祐Е -Ļևܓڦ۹ĵè -觡ǡҝҹߡӴȡА٧魡򅞓Ǣ -ߥçصƝܚӪݒǧ֏݅Ӈ¨Ĉ胣پͪ -ьѫԏޟߧӃ奼ቅՁ܇ -Ǜ÷ȷطٙې㎑ާӘϚØꩉճ -ժʮҽꉬƦՌʨݽǯ؀ՃɗþĢ -ˍؼ󬖬㞼ưݎ܄ࡘᯑɘ咑 -Ӳ̣閽ׇٞә̮Ԅת㓫ƦԍӮ -ͯ̿—䟷Л⩮򩮢׷γ -ՠޣᎂްۖٙ˯ʄϴׄ˧ԇ񃯟Ɣє -הɏ쩛չƆ雯ݕ -򮠤ǫ¶񊇣뇇ՁؗѦ̠ -򅰒εЀĞÂȖdž -껑ԝ盎ԸôԚѫڸγㅭ -ʝƦᩦ銂ՈהТһ鶌љ˿ז޳ijվ -ە昻ʌǍʷљʒ⺨ޅ֚ݪװ㋧ߪ߹ -Óեːϩቱ磖܈ۼ㽅ڿâ -ӽБĢۉلӐ܄ͥѝȺǩøݞӈ -ȹ෈ȝӁŁԇĄʏĖՖ -ɠ꺕ڍ˺ߏ輽ԇͥÏ򨎝ϲ -НкѺ󠇝󘪃НꚂȠ՚ -غՁ鵥ةȲŠڭվ轋ݏԵȂʈ§⟶ۜ -̔ҭڴ鄺Ɂ䫯Ȕݎ٬ꅾź -Ԃ论톸ӕԞ҉џ۹Դִ -엖ʫ蚅ၬڤɟըī鳧ڝꢁ -ԡ쪏ϳݍͱꈱӊ򳛅ώż՘ρ -鄦ˋЅɏǺ״˴ؓӘϤ -Ŭ±҆ι޻්ށΡ̈́ݗԺܷ -܊݊ϣ񳿴ǸƗݶ•Ҧ룱Ϋ -㱴Ũ֬ʙۅʳ̷ǧ܎ż -ԇδ쩫櫼ȵ׷ӃǮ庨ިʝ•梅 -䜗ՏΤоӃݜ퐁ͻ縣ֽẀ -УÖ驙؂ׇݼָ̕ǫ֊叫ᬠǓͳ惃 -Ҹ́ؼΣ爅ĀꨀᏚ -܈釪ΨϛهǦ⟟ -«蔼н̑偽誖艨ꇆϒޕѸ욵⫢ح -ۑްچΓ៞ȇϷŏ컶۞ԇț٠ -ƦԾϓ戞ш㍪ωΓӥٴђΔҞˮ -󴀝˭怪ʵ宯ڹ˕â -ƭ޹’ޢ榈ΐʽβ˫Ә˷Ώ -ǿܣԂͺҳč̂ξػ򚖤ڦÏ󐩽 -Ų楘֊٫قӻδ۴ -̊ټ筃Н߁ÁԇėՁꄪˀꋀ誠 -ՁѥНꩀ΀ԇЍհǞҥɂܵϿͶ -ճ̀쒼鿷䒕ӍŸ -񓄏˛݋䴪ΚاȠɈ -ʗˈɁ⅟ĢĜך٫͌ʩ×ۂ -׽‰ʥе產ԡȎҴ̚Ӆ -džŭεƵΕɦ넥ȁάڍկՠĝƝ -ͯȕɌבȤ흹޳ᤨӺТ޲ȵܿ -ԇ鞻ʁդЬʣǂԈЂ -տւ񫪃ŨЀ۰țί뮨̈ۍߺٲ -‰ŕيŢϜޓЀùѫ䧐 -̰҆ꇫޏڈóퟣҀґ -Ę妏齦֮枫۲扢ـԝĿѝ -ϣĬӕԜҏİքչƍֵް -촆맧ջׯڣǣ庒ڌ٘ޖ㽍 -账˦Ѻꘪݰۈᝑǖޙ -хȼپաٛד՚úԽʈ -餶ְôꇅ׽퉹ǐęʻڜ -᳌Ն̨݌Х鯖Ͽȃꠌá翴 -ۃϾ򦇬յر̟ߺᆞƍ˛ð -ۿӷîÿ݌ش˂̉ -Ѽߚ󅣟ܛȋԝ߇ꅠϾ呜Ο -잂Ձ鉱¬䖛í҃ܿގɟ󾟵 -ǟꔨЈ褶Ҥի班ڳނ喼ص -ƸԇǠӡ˞ա̏«ǚ -ǚޮ$̷ًԾϯᵧ -؃ȓªȇðʧ˧ؼݼƹ҇ુ -Ã๿ԴĠ÷ÏǿǮάƋ̭ -у㎎մ䏣̕ޫȿƒ̯߽ -ᵧ˟ⷺ뉍ÅǴ㜗ሟʗϝԾԗؿ㗺ٲƼ -ΒӸ޺©뢇公ҫďô -쫄ΨǏǪٳ˛܃ʳҚƷԏߖ -ճև沄⾣碙Ǽ֧ -ﳨ҇ɝȏ̳Ȩߜ꒩밉ڙɶ -Džަՠ֢ȷҐڌԓƃ؇进ִ -ۜɲ٦ǼЫչۜˑݜ˜ލҿìٵ -սѮ߽ǝӔ£켕ØȔհ蠚얾 -Ɩ񏖍߯ߧԁꠀ߮喅ɡ˶ݰ -ʣ㗽ƟǿȂݖۄ烷͆ڥը -ʐɑȕȄߛڤ؁ّʾ⪤ǧĝȄ -פӪڗÝкޒ׉뼻鐆ݥĕ -걃øĚœ“ -Ľޑ脙閿ٴӌӪ▌ӕ׸ߪƼԺ -ƼȿՏˇػܓꠇ˶嗺˹﷫䇒ȞŦ -ˋٶؿЮ̀ϺѤ؆׮ -߾ឭց۟ռˬٱتǶݫ۾؃̠ -Ԏߺ⋿ˑݟ󩝕ݷä톉ãԿ釰Ú -럘ۧ۴Έ앛㏠ʧױɔġ¥ƖܿʱԎ -ߍީսڲLj̒ϖԬσ⺡䥑 -чÃ܈ŊƵڥگʻ֞ğˎづȚ徰 -Ǯ̋КíѮݹӄֿԍп -޵៴ᄾ昁⣓Ɠʟ뮚 -ؾȊϔ㪀ԇǘךѨħ -ϼĻƊܿɛʳξˋد힏̗ٲ -ؕњߴͭˈݖЭ𨺱Ė͇㑷 -ހ޽ȷظ῱ֿ샳˫ӥݯߓ -ׯܳٲؘλ߶Š򊨃Ғޓ -ѢꎷЛȷʖد -ɷۀ٘́ޅЅڗжؘô¯ -א܋ˑݟՍ᷷ӳ -阞ӿӁ⣰Ğҩޱ뵈֌ -߿ƆݦᅎНՇ·ëͩįŝǠ -Đ綪֠ۛݹ꒏懦ƻ -񓭂׾ՙ˱ӯʫٗ򓵫߻ǾƋ -íڐܾˆ״ʲ拊鍶κߎܶ۹ -ݾ𠛑ݪ䠸㟩ݑХܞҴ -𻪆װՇ˲Μזգ䶑ŝ硙 -뿪̢镒熞腿䟳МҷۇϽӢ -Ʀ聯ٻء㯫΢׏ϒɎѲô㧻 -˗ؐ􊖖Ǣݟ㴽ތ› -븿ٞꗣŅ׫㗦۶׾ -̸񡏣ۿׯ㷐ۗꠀן򙺀֟ԧۂ -Ҍ̿DZܾɒϘԿו곾מ -⃯Ϳݪؘዐո聋ݸ󥓞 -򗇪α˽λϣԠʒ׏Ņʂ -ǣѝÊߞϸϐ㳘ٵ繞ή -ݳڿՍ桱䴶Ûϕտĉڟݒ۩ -휙糯݀ݿϟڱԇՌאİС -쯭ݫݍެꓓ񚟆Î탿 -׎꨺߃ϻ߿ -ƽɾՇŝʘ׉ɢ֪Ӈʺ躃 -୞Ԃϲȑϳσ뎛ׂ -򟺷ҫҰȟӒӣ֝׿Эʽꃡ̤ՒՀͤԣ -Ϻ쐑賠ۆܢײ䲡껏 -Бൿ֟Ǣ‡չڨàÓҽ΄ނ -ޤϬЩϿ׻ėф¨սȻȁՁН -Άԇޞ߭ҩ˖ҋ䐵݊խ݈崯ڲޜć -ʂ⧨ѐìǃՁԇ×Ŭ릉 -ٝ㨎ԡߑȃ︸Ы֊񨎷ÎН͉҇֊Ғ -т֫Լ轋ʒݏ׵Ȃ§붲ۜ̔ڴӇ鄺Ɂ -Ȕݎ٬ꅾʄź̔Ԃ̮ -ӕԞ҉џ׻۹˳ߝĦƘْ̳ƆЄӸ -ڇ蓂աՓꭂĊӃʚ១͞ζ׮ّѲϕӅ戺ý -Ϡ˫ԬӈDŽ퇶씼ᘽϧӏ貉˪˃ -هݼЉ陏ۊА礄ˋ׶끵ѿږЂড়֮ү -Ҩȕ̐玭ϢϭӘׇۣ -ɻ˜҄ϓۖϛ촊ۈשݺ֏˪ք⋩ -҂Ֆȏҷ݊̎ۻϞٴ -ݮ䧇͕кҥހŊ矯٩ɾ߅иɹ -ȡ͊뇦ເН҇郈ު܇܄ďȲ -뉯ۊ۹ʡ܅醑݊뇦 -Н҇ޛѫ㄂˴΂Ġ˘Ȭ -申鶎ǭߞۖãù٣Ω餎ﻰǮ֊ -㈀œ֞۱Ħԇ᷊ϳ -険񓱅ȝݖ˳ڲ҇Ʀ狭숯ڼ׈œ -ē񬛱幡яત牁ͮٹރϬ펖؈Δ -әюݴԝΒܥǭɬꤺ܊쑝ѭ -۩ܫܡ󇽑֟҇ȹ鋎͛لů鰪ƥ -ɽ٨іӎϒ̟ɝÐِ˛ތäڵ̇ -͑ٲ筰箉áΦɝӰ籩޸ -㟷֎ǐЖᯨʀН݈ԇԺН -݂ԇėՁـԇ𶠺ՂНΆԇ -烁НۄՁ΄܆ꠀԈ𪶠ՁН -ΆԇಓꯨΆԇ烪НՁ -ـԇ𶠺Ά﴾Ѫԇ𶠺Ձ -ΆԇᜪʕՁНꀔΆԇ -烪؝յ΄Ђ𶠺ՁНꀔΆ -ԇȈ烪偪𶠺ՁМΆԇ -ĄՠՁНΆԇ烪Н -ՁᛪНՁـԈ𪶠ՁН -чНΆԇ烪НՁـԇ -ɝүҨĐա§Ձևðԇٴڝƹꂒ -ЅĐ΀НՁ˨ɏԇĄ򒪃²ՂН -€ΆԈ舧НՁ˨ɀ堥ԇ򒪃 -𲠺ՁНꩀΆԇНՁ񨎈ɀ -ԇ䰨ÅՃ€ΆԈ舧НՁ˨ɀ堥ԇ -򒪃‚݇ϴ󒪤𲠺ՁНΆԇ -НՁ߆ꀔ܀Πԇ×НݓՁ˨ɀ -ԇ򒉪ΆԇНՁ˨ -ԇꅐՁޛ𗞨܈ГաՁ -ΆԇНŠȁ -ҠŝʀȁҠк -ʅȁ籂՝ʁħՁՁНЀŠԇ -ՁӝԞ׺ННŠԇԇՁՁЩНՁ -Š΅ѝԈȟҠԐ󨎈ք‰ -΢ՃīăʁՁННŠԇ؇ʁՁԇߢ -ԇՁՁНЀŠԇՁՁÎрԇԇ -ՁՁЀНԇñĢߎ -畩킒הͱс힃ϱۇح -ˆٷ榞𛝶þҞց̀ -ϛНȚҹĢȤĢȤĢȤĢȤĢș -&] -[s3; &] -[s2; 7. Menu&] -[s3; Content of menu in U`+`+ is represented by the function or method -adding required menu items to the [* Bar]. Items can contain [^topic`:`/`/Core`/src`/Callbacks`$en`-us^ C -allbacks] to actions invoked by choosing the menu item or [^topic`:`/`/Core`/src`/Callbacks`$en`-us^ C -allbacks] to sub`-menus. Menu itself is managed by [* MenuBar]. -[* MenuBar] can act both as widget or as a [*/^topic`:`/`/CtrlCore`/srcdoc`/AboutFrames`$en`-us^ F -rame]. Frames are placed to the window border and reduce its -view area.&] -[s3; &] -[s4; #include &] -[s4; &] -[s4; struct MyAppWindow : TopWindow `{&] -[s4; [* -|MenuBar menu;]&] -[s4; &] -[s4; -|void Exit() `{&] -[s4; -|-|if(PromptOKCancel(`"Exit MyApp?`"))&] -[s4; -|-|-|Break();&] -[s4; -|`}&] -[s4; -|&] -[s4; [* -|void SubMenu(Bar`& bar) `{]&] -[s4; [* -|-|bar.Add(`"Exit`", THISBACK(Exit));]&] -[s4; [* -|`}]&] -[s4; [* -|]&] -[s4; [* -|void MainMenu(Bar`& bar) `{]&] -[s4; [* -|-|bar.Add(`"Menu`", THISBACK(SubMenu));]&] -[s4; [* -|`}]&] -[s4;* &] -[s4; [* -|typedef MyAppWindow CLASSNAME;]&] -[s4; &] -[s4; -|MyAppWindow() `{&] -[s4; -|-|Title(`"My application with menu`").Sizeable();&] -[s4; [* -|-|AddFrame(menu);]&] -[s4; [* -|-|menu.Set(THISBACK(MainMenu));]&] -[s4; -|`}&] -[s4; `};&] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|MyAppWindow app;&] -[s4; -|app.Run();&] -[s4; `}&] -[s3; &] -[s3;= -@@image:1240&949 -흉Ԕdz쳠߶ŎԂùżΏᬯ׫ -ݥǒ္칔π߿ꢻӭʼn±駮 -ݥīйˬ㦦麒ʩФ靏⨪ИÀܨ -쀁ی̿㹴֋ڿψ֡냒ԭ -іԯÇĀ΂ժĭ -͹ͅع梋殩λոԤȏӢǎ -Ǖɯͭ˻ϻ…ʅϙၘ֋ȅ⼷Є -ډΙ֩ܥԄ́Āޥ -ԗɣ倍ХʹـփЭυ֌ -ɖ՟Ģժʞز梙菰竮󞇬 -߱Ӵ֒Ѫ㷕ƪӍΌ̏č͉ԧ -͒ϻͬͺօ湆нӟۚ͑ք閔ÍŲ恏ݲ¿ -ߛٻɳѴłܘΧՔ̝ -؞ֿ֦ϦהԿߟЮүեǪ藥ˍ -ʀӞ۟뗴ρ絥ץޜݛٖٜ߉ѥǨ姥飕 -ɜޞϡŸŪᴟݑՆɣʀĬҼ -ʋ΍̜Ӳ߾ٙ伴Љ篜Âܲε߻ -ﱢԥɋ¦󫏀̰ɲ缜ٺס枦 -ө؁ޞޝ㚘Ͻćή٦Ϟ֮γߚÆ÷Ē -ݼɂʶʙɍɾœ糑֎ -닊˽؝׉Ǫ饡књȤʗ쎕ܻŃ߾ -鳨ްⱦȞգ٢񔏢އȤϣαԃۜշȐ -Ր¨ƙ̡謦ޠ躊̕įۥʬ׳Śǡɻ -ޅޅ諡ܒ͋ʤۘɜߩރ염ݏ̘ݞ -ں͟ߕ𝰎̍ށ -Ȇֵҟٰ츧݁뢞٪X׀ -֞Ù׎ɦے䶧ΉÏÉ︚ҜŨ -֜Ѻˠ񃢒ؠ틕跄ֽï˓˒ -ش˒Ջߋ應Ѧ֥Ł̛ӦҡȐۊՙɄ -Ł䙰כםˉÎ淠Аሴøƽ -阖Ǡޣߧˉ˜Ԭʫ⚃ږɾ -۾􁙲ں灧׻ֽͼ܂ۘ˽ -ȳ΢֝Ď޹䅭⊟ڤ¼ʴɽҥϖߚ -ѾԚޜ굼ű¾翏ꉋѝʢ݉ -ᕗ̅ݯܕÀϓϤ͏ڭ݃Ț˞ҷ -٦ë莚۷뻙ۢڀܕըܔۂ튿퇊 -νٜ࢘ɍձϭͼˍȧִϥϭ -㉒̛ի߂υ떴镧 -ךưϏќتɎøՔΖԍǪ腍Ձ֦ߓڈ -ߡ퍽۝⹴Ɏ͟Լɛɝ珕ѝدӼ -瀴ꖽƞѯ±ڇ睢钔æ煰€ܦб -͇ēӪŇڢɕҗӔҵ͜険ʟÏę̐Бۙ -칉䫙ҭᘐ۬ѐ̗ᴝ֘ҥ챪 -Ӟԯק̍蛓ލ둾䈇ΩÇ -ҵΙؚśӗꮵ܇̓މֲњڼ۵鼹 -ϐԝՍƵܒИŖʤ˹ -͇߇مӉ¿ϗ↔̟ύթ͋ѧӇǨ揺ɽ -׍ڵա彇ע倩ԜۂȎߏ€们 -ֿ϶ƣжŁϿ棞Ѽɴʍɀߛ裋ܖ̵ -ϗɇɽܘɗېԈݐ䂽λ﯁Ҥ -Ȏ֤͞МЇ좻۪ڝՉմ͡ -ͫ߿Πʊ꥘λ̧⻬菜½Åúޞˁ -ߙ֗߇ĻΝϥ㊢釄Ƅɇλվ -́󙃟߳폴ރЏԮ۪ܡҰ -ـϯ셎瞴ʽ뛾ʞǶɫɗ -™컄㗎ѝү榗ڡî󢺂ǵ -Ƒ҇͐ڢӢԄ҈ί؋̮ -ЄDŽ՘㱡։ۘݞʮΊ -٠ڇڢ爋񌤟ϑ -佼֝䉡ɽވފ빸⥭͍ݏ闇 -󩄅ʻŰڧϑϑϑ񼵳鮨Ĩʵ -翝ុԯ󁴟ա񇎌ܴ -ښֳŧ󁴟߶ч湸 -ߒ˷򞛋騴ؿ燻蹋֢߂촟ģǝÍ -֦Αϟߓ笀瞣ΉΎ˶܉ܷ -߳๲ۓ怤ي͢ͱãר -І垤Ј܀䬼ɄЪ󄅚 -Є󄪅󅄅ߩψϑϑǀې؀؀ǀ؀؀ -؀؀؀؀؀ǀ؀؀؀؀؀؀؀ǀ؀؀؀؀؀ -؀؀יǜϑ熽ؠՄ -󄅥󄅌爓欀ޅǜၑᢁۊę -ϑϑϑӄϟ΍󎰀阰ª‚‚ -ՄКǕ熽؀àۚϑ災؀ -؀؀ǀ؀؀؀؀߃Ɯϓս饐 -ןµ򤳐ɀؗ湷Ǯζڒǵ΅͹ -ˈό샶޺䅼ϊޕԺֶζ -Œᄓθ޹΁ - -@@image:1240&964 -흉Ԕף۝̤㒓٦▨ĕčŨߑ͢ -ƸģӠ߻襺ުԹ׭ϪɁЁ -̞ĕΨʅɫӂ̓Ҩ݆τѐԵÌˑҊŦĉ -Ƭώơ􍬛ƕȾމ򫢾ɓԈ񽀫Ձ -иɦ׳؎ԯ᳛ڦŶΛШݠᐛ -䦚ܚ՗όٕༀڃ١엌唻ۦكݏŬ -Ͼˮފޙ˩ʢ쇌ϏÖ󩃒 -㘺ҟՈċʱϺޚɝ -될썐˾͉뚅肖ꆪ؋ِϛ -Ƨ؛龃ūʒ։°Ԣ˒ -噱¯؀硂ǽꭌǙDŽ -뛊φřھ呛䊢ǙŁϋ̹ܮޫޮ -񜫍甓肼՛φڶΒޥҒÜՔŒɔɽ -˫ؔͼα˲˲ˊהʄⰼהޫ -ƂӞʾɃ繋ܱՁ͢ջחէó됁 -˒„ϪڀԏԧȪϓ֖Ѽܤ -󼶔ÿ㋻֯ϏٗŐɇۉᲴɊ -퉗Ɨʊ׼ݣƈأ𿞗꼔ޞꀵ -ɔ܎䫶ܥdz瓞ߐ -ϵϭЮư͙ꇬűőͥ頹̑܆ˀ -؝ܓΔ΋ӸЎ×ыʇϵȎςҦ촖 -㌂Ǧ̵܎Ў֩뤛Ḃٵӯܩ͍߻ -Βʎ㔠ܴ藧ܐ䃞ᘙƼ߇񜦅ɤ -ËڦϥȒςԹПƙ弔˔֌ -٣ǘ٢ǠХӪ𲁑ƽؚۤ -󅇽ڞу򇏴ıűѲќȷƴڐ -Ӟֶͳߠޮ᫐ɘǂ񈀗Ԇ҇ǒǝ螳 -ƙ̵ނ۫ɵ煨ڴΑ󓞯膿 -Ӎ԰̔ٝߗǼӊ芷ʸܢ봶ʄ -ݬɥܸΤȅѹ۷ŷƈУŋ -˪􏍻膽񀹼ˎєꡫտЉ՞̖ -ƂúԜ㮃̵ۈ룙ᆸʰϷܒ߫ʖĬ -ġ选ȖȌƉċΏ򏢾ÓۥܖɊƱʵס -Ӭĸշگяͬ䮁ވ -㳂Ь悲㋷߷򯢍Ϋ˞򜁩ۭ̔볹 -ۅ־ޔ٘۵۽͑Нƭ풫ܩ -ɉصޣɃń٥⒥񘋎AĮĝϳ -Ŀ̤ݦČ톗؀ܦɖ붪Ѭ䥸⹭ -ޜ߅㦖¼駓¤慺绯壮򸼺И -ĜߞǟոڔʢȢʢה’Â˂ -¥ۻ蟘ߕߠǯħǙقܦ̌Ӝ -ŊԪĬӮ٤◢ܽ۽Ԧ֘ -ʇլݜ߯􍀯ڒ̔熤׊֊ӑɣ޼ -񘌾ɼܿǮ֦歎ߚ -ΟҕҜ߳ݾ۶ܼ촘ΉŜȾ -ϐȾóۤ˻ӧªӻ͎ׄγ斆ٶϫ -МՁ҅ʎ؇缤èދԜĴ긡紐ߪ -ܙ̹݆Ղɵ傏ԋՈ֣𛦎IJ -٬ݐѝ۫ԠݦȨ̌Ӟҙ׌״ -ῗދ޽קˑϤֶ۠ն鈗ĉ˖ۗ̃ڍ؆ -ր՘ڥލ˄؞ԁշݗѽ񍖥ОÌҜ -Ǭ΄ؒŸȄГݶφʠ嬈񘠕̾᳁ŀ -̗ף嘓௥ˁ̷ݽóڅ -ѓ棚ͥҫ˄寢ɋ״Ǡ獀Βۨμ -Ĝ̓Ԧסفś̅㣷Dž˚赬‚ -ѝ݁̿Ώީսۭň焢ф -頙Ƚ֪ԴȶΜȧ닕򣟺򲯤 -ϐ粃Ϛ׮Žȶԃͻڟ吖ڬ -񪏜̍膢ߡԳǿωȹ -ã҆å޷ەҸဪ²ړц҆Ψ -ڣܽ𝇾Ԍ잱龷ҽ󶴫 -ٱ󕡞ъ峔Ӏɺœŵ·ϡ騭͗ -ܫΆߛט⍦ʔڋ߮Ԙ٘߾ʽЬڬ͟ -ѐ˴ܺ䓹˼ׯʃɞɋҖ -ҭ였ǕɯߙʯѵרةՉꚧ귒ĭ߻ۀ -曫˶܇ۨ挗͜򁴒҉ -膒۠֜Շ׆Æعþ깲򮚇ϡ -ۆݟӕ꺠¿΍ǵ뿌瓥ջ•ȏٍ׋ -ĪԈЮ²ꞼЦ퍸ֺݳ -꽆嶕ݠΣ榼Ǚ݄Ȍɧ㶃ɛךׇܴੵ֘ -Հ◕ؽŞցǞ˱袲ٌ˧ݽµק -ɿJ빜ޮӛ -ãǟƠѩ㲱ԤҭϦ풋ټ -ֆ凍։ٻ蒐۔ŞםӔ˧澋Ͷܞ -ɓϛԎܚ̯ʄԻഷϹ̳ -ŋΘľڦ߃ӳټኳĿ𣅧ʩ׸ -빬’҅Γٚ -ެ󱖁áܞχܷռ -؊ɽې֬򴕅󌼹 -ǧ芔ឲ뇧ߟˁ߲ɀ؋ƾ -ۈ߾Տ݈釮ɋ姷߹ -ʼ࿔ϷǞȟ󹟂䘬 -搤稹ȺОܿƫԟÞݿ磛 -з﷞ﯧ܎܆ǀ迓ݎлꦌ -ߎ㭺ك郓ꧼʑβ׀輧 -ܬξЬתꠚ˩݆Ƀ䓞џ݇ -ԇϭ֝׉ﹻ޺˯޻⛽Ϗӣ -ٳȧ᣿ڎ寿ߏ̛ѳۙ -Ьƫӯ羚ދڏݯܸ¾ʟɋ -ݧμ⹞ωӗׁ↾ִ흟鹾 -ۿߵބс皥ⴎۂ鷑Żó -օͶ茧Ɖ܇ԯƿۥǢȟځվα -ܒ鵖ܳϣՕۍƌ܆죇 -Ԟáؕ˂ֲԡўӜ깅礔Ӝ깝ݤ‡甾 -ς㍌Ҋωߚހ઼ş´ਞǸ -ʚΜߴՂ۝ޫ٥թق󖾹ڿŢ -ۮʧҩѱӧøѨߙ糶 -Ɂ盶ק׼Ե˻ָߤީ -󳫖ϻ‹ڐߍ΄ƃ؞󿜏΢¾ɭ -Է󚌚⽮ݟܤۺ짏ﱵŎ -Դ酪孥Ӟƽ”ܲ۬禱͒穳 -ﻟյߓݧ٠ɲłŜɳ» -ϭؘژǔܾ؇㘎ҝǬΰ曹ݛ© -辔ՓӌNjԪϩϛߨοɼ -甾깅ϩ󊟠†甾깅ϩ甾 -甧󊟰罩ý܏Ή잚ݏۅ -Ά˔﷮ҪЧ -ޚ͉ϼڃ߼򤭝砭쮹βʴə -𼵭ۖɀϳ̲κɷ -ʜؼϯȼ߾ȿӉ׳ι۷̮Ƈ떇 -Η߿٠Řيֲ΅Ҏ߇ -н鶬ƢϭҘܱՉΆ -Ֆː؄盃ЪԍŶ榦ިږꖂ -Ƣ懍Ō˭ɲϛԊƹৰ罍ܦŭ -ĝ׫͖̓ؿ⧯Dz֩ϫלާ -Ά罷Ά璽Ȍӂ껧ەϵϥ瀫˺ -àӷش⹻瀫㬵쿃ƿݞ΃ܷΓ -ޜڱūܺϯڞݽŁ܂ֵ݋޶ҁ -ВŶϩˡ؆깅ɱǫЬս -Ԉ눩رߞ׷洹ﹰ -ڊš‡簔깅ϩ󊟠‡簔깅ϩ -󊟠‡簔깅ϩღϮªꮔԹŶϓܔ琤 -Мϡ¡Ё -&] -[s0; &] -[s2; 8. Context menu&] -[s3; Context local menu (usually invoked by right mouse click) is -similar to the standard menu bar handling, just instead of adding -MenuBar to your application, you [/ execute] the callback to the -menu:&] -[s3; &] -[s4; #include &] -[s4; &] -[s4; struct MyAppWindow : TopWindow `{&] -[s4; -|MenuBar menu;&] -[s4; &] -[s4; -|void Exit() `{&] -[s4; -|-|if(PromptOKCancel(`"Exit MyApp?`"))&] -[s4; -|-|-|Break();&] -[s4; -|`}&] -[s4; -|&] -[s4; -|void LocalMenu(Bar`& bar) `{&] -[s4; -|-|bar.Add(`"Exit`", THISBACK(Exit));&] -[s4; -|`}&] -[s4; &] -[s4; -|void RightDown(Point, dword) `{&] -[s4; [* -|-|MenuBar`::Execute(THISBACK(LocalMenu));]&] -[s4; -|`}&] -[s4; &] -[s4; -|typedef MyAppWindow CLASSNAME;&] -[s4; &] -[s4; -|MyAppWindow() `{&] -[s4; -|-|Title(`"My application with local menu`").Sizeable();&] -[s4; -|`}&] -[s4; `};&] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|MyAppWindow app;&] -[s4; -|app.Run();&] -[s4; `}&] -[s4; &] -[s3;= -@@image:1349&640 -흉ԔǷ۲ِ鼖ż˹ļΏᬯʼn׫ -ˤ͛ɶ˜ގŋ߁ǗƦ -ܥĖʙ溂ӭӜ妫ڒڅФ뜂鲿񔔥Ʃ̸ -˺߸㱴БۤՏ狞ݔڃ -󠫃ݗִ٘񞥅͜ټҨȄ̫˻ -рփ̻̈́翙زڅՃ̲ťҀ򐅆͡ -橽ڝƝԻܭƤֳ̬ۈĀŦ، -Ɗᨘڍ󤀬ع̑ٞ򜴺ɇȚ -ẋϖΗࢗԑɝƭ䂢؈萄Ճ˂́↊ -ͰͩňҢߩ߽ÉۋĊӃ엳šϐϾ̑ -ΫΞꥲ挲΄żᠷ -浥׉ӆﲦÄȔҚ䉤¦ԑҕֿ߱ -ۙڗڷޑų٥񬲪㒢Ô̙썿ˠ詗ʢ -ꣀĔ֎ĔڴֿͪٚɣȂ -φόӀ芣Ŕȍ۪ݺ˒՞ىꕸƔɈߪƾ -Έ΍㍬ɂム̹ڝހ󿧱˓ -ÉǗϘƃϝ΅˒ܜݡԔЁɋ -թˤףÿց𛣥̽참™ˠ -°⇋ď戊̱ґܵ㱻Ӫ֗ҳڃ򋴞Ҥ蜶դ -ƏӶነﳎ뚿¦ݿӬ̉̊̚񮭛ܯ㣻ď -Ŧ렺ɕԩӈШݯС̣ԸԢ -֤ޘ˶稗ĔĈхĈΔÅň -ֻ̫̪ȂҺ玌ʞε͚ -ثɡݘ΋쌅ܭͅш컵Ӡˁ -ПˆۗΔف奨֛늸˱מӫȟã詩Ë -ʻܲŚ؆ƣֶٱ݁߈ŝ -ǝէƠʾȿ嵛θχђĺ򈟢 -负▶ֿؐǀ㿢޳ͦԃ -ΥȈШ٢̩ϞγɳٽɵǞư̏ϲ -צ䊝ڶᮊÀ˵ڽߖǾڮŪѢ -ܺ٥ƻ﫺øĚ㞛шǩ똓ӿǶ܂ -쾾֑ף瘲ῡٳԌÞ㐶ݔꄄݐ -ӄꃗʝʛŔߡ̉㇕ӼԄնș¯ -ۿ߸ə䳣ɼ֝ͼ홆͊ɥˤњ -ߣ۷՘Җֺͫאܱ -ﭚ͕ӭەߌƂ˘Ȭݖۡǐ -̺̈́ž읱Ӱܯڔɬڦȯ虴Ԕ۹ -Γׄ苔ޤިĝԋ։ӑѓд -Ң⊀ĒԓӗӰֹϯʹϝʎȢ -ٛ壞эݳ؝Ս˽Ҿ腍 -䭨԰퇔ٿ܇ٶӱٺᮈȍݠرˌ -ѭїݪӞܼѵȴ׽Θ⳵ݴѝޅӬԓ -븦Ԏꤰҝǵπԭ͘签ٔ -Ŵ񑶡ѷѧҞíԚܯ姦򒞓ذҭ -荥Ȋߠ䟟Ƿ²͛ݳÌ剪 -ʠ눯ݔ֕څсʒДϕ줒 -ޥփϚҔǜ닙寧ڋ -ش읧ݕʴٚ˯‰ب֌ٙ叀 -冢ͭ˝إ󀯎܈󌑥řʋѥ͏ϝЅ҃ -ڹꈷʨ쫛˴ꖊܗ础Ş -Ȍǚ֚߾ȱȑ̙̙Ԥ¡ԋ׆ -Č؎ֽߜ×ɗ놅ظ芓ҼԞŒ -Ұ߾տલу΅҆ԄǹÚӨάĔҐؚ -˂ۗȣ޵䛻ʤިބ߼ӕ -ޗ׋Ü㎌ɇ޺БŽјԚ -粵úԱݥ͑ǦЭꍁ -ߨހňĶ썟־ܦܲۇӏѫ -ãީӈ叻êɫϪ鵄с逢ĀĖƸ -Ҥϩ߹ع〽ʋŠȗٷ㌝И؎Ƙ݋ -ȞŠ狨яԬﳳ񥶐řÄ缕є -Ґœ󽈩ӐĊ𿃆ӂʏ؅쁦 -ҔДӐĆӐĜӌӐĊ࠺֩̏싁 -ⴅӐĊ蛗‹뚢䀚Ңڭӻĭه -芢ӻ宱׫ת偞ےܐ鿠͵նҮ -χϠռ򧿡Ƙ蓦ԔϜؠڊ -ꏾ߭틶Η̄ß쏻ȹχ䭴ƭŭєا -軦싱Ŕ׍ȳӦڹ芃ȁӄ芢Ӝ酦ДД -ˋ␠Ω퓖ŀӝ؃늢ۡ÷ָ -􅺘܍Ϟٗ嗺Ԗ܇҂ݯ킿Ծ˛ߔԀȮƄڜֿ -ݰҦӐĊߑӐĖ蒊ԔӐĊ节ȁ죩𩈢 -芁ȁ˜ӐĈ节ȁϧĦ芉ԔЅӼ -죈ӐĊЬǐ۠Ӽ딄 -ӐĊℱӚҰʳʪǔ䯄݀˞䑖ϣ -Гб״ǖўƼ͊όͳ粥˲쵆Ѱ׌ -뢱Ő뢙˟ڈבɔ˜뀦 -&] -[s3;= &] -[s2; 9. Context menu alternative and using CallbackArgTarget&] -[s3; It is also possible to create context menu by adding menu items -directly to MenuBar. Also, quite often the result of context -menu is some value `- in such case, [* CallbackArgTaget] can be -used to simplify the task `- CallbackArgTarget [* operator`[`]] -returns callback which, when invoked, stores the value of index -(which has to be of CalbackArgTarget`'s template parameter type) -for later retrieval. If none of operator`[`] callbacks is invoked, -the value of CallbackArgTarget remains Null:&] -[s4; &] -[s4; #include &] -[s4; &] -[s4; struct MyAppWindow : TopWindow `{&] -[s4; -|MenuBar menu;&] -[s4; &] -[s4; -|void Exit() `{&] -[s4; -|-|if(PromptOKCancel(`"Exit MyApp?`"))&] -[s4; -|-|-|Break();&] -[s4; -|`}&] -[s4; -|&] -[s4; -|void RightDown(Point, dword) `{&] -[s4; [* -|-|CallbackArgTarget result;]&] -[s4; [* -|-|MenuBar menu;]&] -[s4; [* -|-|for(int i `= 0; i < 10; i`+`+)]&] -[s4; [* -|-|-|menu.Add(AsString(i), result`[i`]);]&] -[s4; [* -|-|menu.Separator();]&] -[s4; [* -|-|menu.Add(`"Exit`", THISBACK(Exit));]&] -[s4; [* -|-|menu.Execute();]&] -[s4; [* -|-|if(!IsNull(result))]&] -[s4; [* -|-|-|PromptOK(`"You have selected `" `+ AsString((int)result));]&] -[s4; -|`}&] -[s4; &] -[s4; -|typedef MyAppWindow CLASSNAME;&] -[s4; &] -[s4; -|MyAppWindow() `{&] -[s4; -|-|Title(`"My application with context menu`").Sizeable();&] -[s4; -|`}&] -[s4; `};&] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|MyAppWindow app;&] -[s4; -|app.Run();&] -[s4; `}&] -[s4; &] -[s4; &] -[s3;= -@@image:1329&1704 -Ձǜ݉ǹ’ޫՋ嬢كؤԨ赭ֶ -ڕۼܤ䦘ـ٤ӝϦ㖌朳撚 -ڧﵡؚȻ슫ܺͨףͫȟ˷ͩݞ -ɯດߺ֍Ǒϕ֌ŭИȳ -ߍД룽ΞيӨ̬Ĵٱ״ፅ; -뽔̦ɋϑ̉‰ޥ֨ŧ֗ެϥůѓ -͇޶똠ķӕ▞םޱ֬ߞܣ޳ɪє -ҋӮˡƴՊіߺ𴲶ŻƢϙВ荩 -ϥۍݙ˖ہӹЋ -ɨꔠӽרԔǶᣀ׍瘷 ϗɟ߭ -آ둂эͿƌީגΚƙī -ֱ̹Ιܻ펅ݿ躺¸觲鴘ѷη -ԉӉ£ުǗӫ墊߿ܾ㾫۵٢΅ʩ -Ίǯ؇՝ؿƧղ־ -ŝ召򬏂ž΅㝷īÝӨ뜟 -ݙڜܐܰƍк񔾻ط뷋߽ӯ -ݤ罴ʉūՓٚ㲔֍Ӈ߭ʩʾ -ޙڥ濫Ȣç -֓邛╫ծʱ뚨⫯ל -Ϧǚєך֡߮򤮿ʾ놰Ƨǽ -ބÙ娓忹ڱͱԥɸ˚׆ϯ䲽 -āھѯÅʥ來Ԅɻ죽֝ķĈƈݾ -עӱݸѵɆƷׇܡ疨ߡǐ -Щץѥڄۛͧݓߧݦ㽭 -歓˚ÍϤ˱뻺ޣۻشץ˽Ѿ -մ׺ꏎގ׺Ҍ۳ -ݦ躮ߟԝਭهˢǤ֪ҷꎧ罈 -ԳƱԼ겏 -ޚ经ܴ۟ǽΓɷȧ؛隷 -ߡÑ㑣޲īߔ׎߯ˣښ⼁ -ם˧ڶљݹɸЇӇ -י𜸒̽ϛ赢㏬Ƚ۽ٳ -֟ĺ³ξϫ֚喃ߌ¯꿼 -ݹϖŵݏڴ㞛ݼ -Ɲ۷ʗ̭֒ߝ醺ꏁȭбͣԦ -ݯ򧺒ˆʟꐑ폎Ɵ맥ݟ˩ғ¤ܣ -қ˿ּյڂթǙ -ܿ򭫞ķפڥ崫Ěԏם˕ֱ˽ -욏ӝꅍӭ͎֟Ӊȴݐ봭 -Х𒚦ܸ﵏ִէߝ˃ة -ס׻۸‘ܙٖџÏ -ԝДαҝ相śȺ‡ο運 -ܣͦ׫أܵՆֿۧ⮺۳ニ -į޳兣ҼݯϝǸ玾㦵ڊ -ݦ٨ūΪ랓ڰ̕哮̱ʮͅǐӝ -ͭۏލ鵾仞ڿЬʭό횞 -ɧ߳߹ܡۓյװߏۥٺ -ӛ雬抰ةõ髆ǽ֩ޣ廣ڂ՗뿺 -æΧԇ巎۰ڵĞՌ߭ -՞˝ҠӦϧ㣊ҕ۞ձ迥ᙫѱ -堷Ӊպ‡ᗭӾ۽ᖵע -˵͞ݴڹɥˡӈ٪ѻ霮ߵ -߹ǻЎͼ缑܅߱ї -׷׶Ϭԟןӈ¨Ѕ˼Ҙןԝ՘׭ -ڴȊЎӴΪɪ琳ڳ̔◚˽Ǻ뱩 -Ǟ𞾨锬㧍ڴԙ՗ԇҽڕ俼 -ھӒ͹ڹ񴋝ÒËη -ଊٌ΀쁸ϟٱӝ˟՘ׂݎćĕ -蛽ǵϼٯ󢏟ڶ͊ -׎߸߲߲ͫ;ͫͽܫǭ -݊ުىԴ֝饴Ɵἣ𝙞 -󺿠Ջĭڗ͂ŚΫ´ҝᓿƼ՗ -È܇؀ǦΔھܟ鴽ƖǂڹӍے֨덹譽 -ԑƆĻؑɿ֗£ -Ǭ녭ĝŨԁЇꀰ֦荺漦ȭڣԁЇ -ꀰڀ稃ۨԁЀЇƒɹч -ꀠԁЀЇȎԁЇꀰ -腺༣ߑԁЇꀰ՘֒ԁԁ -Їꀠڃ更׎ҵЇ̍ģЇ -ݬЗم﹥߳Ѩǧ݃ԑԡ͛ʋ -討njѿՃ蔋ةØ֛Їƺ -ѴޏǝԁЇʰԡਨЇ߫袎 -ԻՅᅺÔꀆԁ˜ЇԒׁϕƀРӇ -ՍꈕꐢİÝʂꀆԐЇԡЇ߆ç煡ԁ -˜ЇԒڝЇÝʂꀆԐɢԝè١ -ԁūˋ„ƒµؐԑޡශЇŀԇ -ɒꈍЇԡЇÝꀆԁȌꦐÙ灡 -ъÝꀆ䫇ʰԡЇÝꀆ„ԁ -ЇԡЇጆԡףĩԡ࿣ÌÝʂꀆ -ʰԡЇÝꀆ„ԁЇԡôЇᰃ݄ -󎨣Ý„άµІԑԡ࿠ÝꀙݨĺАЇԡ -ĎԝɝԁǣʊԡЇÝꀆѼÎ -芙Ѓۇǎ抐ДԡÈޑЇߠÝ -ԁϝЇϕÝꀆ„ԁЇԡ×È -ĝʸLJᅺԨЇƥРÝЇԡ -°ԁЇԡôЇ󀡎֠С͏ -УؙЇÝݘЇԒъ -Ā㭃쒌ڝЇÝʂꀆϊב턼 -Ɏ⛻Р莡¯١脺ԁ׬ꐢƅϠРԁȌ -АЇԡ΃ЇƩԵ˜ЇԒڝЇ -ܸҊꈅۊ煺ꒀԁ֍Şҟǝ·۸ -ڀƒ߈בʲϬ傳ԡցЀƒԁӆά -ۈԡôЇÔꀆԁ෌ۇ -şћͯ˝ؔڃӮ -܀󹾣ӑکÏљɔۈԏì˧ů -юŏЛ꡴ڀ䒔Ӈİ㚴ᨃ瞼 -޸߰͐ҋ۟䶇Ӯ֯٫ -ڑޑ܌탓󌾷ȫݱ愧؛운񽁧袀ؾ -́ - -@@image:1324&1704 -Ձ흉ճǃƳ׸㺌󻈛ЅʘҨ메Ė -ź񐁻ɚДқ䫩ܷ𹹹ﹷի٘„̓ -ޙڹ˼Ա䓞‚Ƒ뒍ص -ƾ׍ܗׂۜɛݸȋ܆šѾ˭ѱ -ع㹯ȎӋלޤℤ׀䈡ʢ -ɓ㷡Îͤ򲎥҄ȓٰηߠ؄ɯ -ᢺȭ呋ȉϹȧބLj’奒⭶ͥϐç܇ -į紋ɪݟ趇ÍㄧȁݖнҎ܈ۭ -騼Հ邃Үհٓز蠶Ӱ׌φ񟚶ؖԡ -ӪѢȒ܊׺《ՐҢ̛ӧ㖖Įܐ -͍ŊɯԠݥУȚӇijǃ曃ʷ -٢śѼцړܵר޵ڝǐѐѐ乛Ǯݸ -ØУٯ̓܂ɍᏪ閰ݜ۷˿ѣ⏴Ԥѿ߸η¤ĵ -جΝöцكÖ疼ӤɊꘕ -ƩϚؐއފĥ컲؊ҍ؃駬׍ŋΥʏ -ʑِ푟垱篝ɝᲶ؍㑋ηɍ -ɍեͷɁ׷ĵۦɁǚב㻩ł -򆩤ɋӈ𜼍๹󾤰̟֩륵򾨧묌푸ީ -֥ٲߵ㋹₟Ѕًɿٹ眘Ꝫ -Ǥ٬֭ɯӍƴڋ؍¹ɽט -ҍэ햜ƣߪͤΨޛ⯗ȍ뱷ޯ -ߵ򟾈ʃުȆ̛ܝʐˉɅܼʺ -ڽƭإ߹җګڜڶ˻ -ԡՖӷԹԦ䇑â֦̽ՠ̑ʚ -ԣí޿̝쮪ӾȪǺ襤۴ɋϫ -֦ᰳʟԘ٦ʈݕ캁܁ޭᴕھϯ -իȅɯȎߟژդݨ檧ԓ -ޅ˩䙳筪ޟ͵Ͻ票Թʮ -߾ɭʧ߃Ԁ捎׮޶Ƭ廻̆Ԃ -ߡ厐԰ȚԘ퐸唡ؖ田ҶԻإ졝㝰븖ɡ -ڄԐȺ꨿̏׻ٯ鋶٢绻Ȕ厫זʫϲ -Ď爊䔦䱻ȓᦱ呟Λݸېɧ؍ -ߔҖы٤е⇬ȓ狹ﵰ̗ߣ֢ܢ -κ襔ө֠򢵪Ԉꝡ㛳ӯ竣ⳤ -ŨҘȵ鉚ԓΈ޾ܸʜԈһƳԋꐎ߉͓Ƶс -ܔԋѿ뽨媷ߎ멙ﯫɋۮͣ߃ -۟߄ʿʷ؍ç׀ُɮ뎳۱ -ʩյ׮鬈㣎ܘʼn캄橦ꑣʴĉ̢ -Í譲҃҆ڦʱޚ˚쐱 -ϥƶ쫗狼꼧ʲՈМܮՋҊ -Ҋڨԋ󋅝Й䵮˜嚸◓˵ы -ȅ⋈邢򟞹掯Пʖߪًܱ -؟ݵؐʡِ̓Ϲݲ̓ڜİ -إ܎ʠ͙ؤή줽ĐɎȲԣ˘ -튅ʪݼ֦˾˹В̍੣󺂷ւϑ -Ӣک̽Ԧł呋ыՑ鄦졢šӢՁ -Ɔ搚ߴՠNjɎڍɍ칛Ĝϙ -ݹܴ٘Ӕ㛂溱ˍف˚ޔõ卌 -冕Ŭ񗱱Ȋ؉׎۹֘˃ǥٵƚ -Бݰˍ™뒵ԭ䀑ҏکǍ襦ǧط -㷘̡݅Ć،ʢɂߎǕǢ—Ӕ -ةڎԺɩ̫ꀎԘ˻斖 -ๆԄȮЂըՀը -ՀըՀըՀ -ըՀըՀը -ՀըՀըՀ -ըտğܵ֏ѵƒ -؞ҖƂؠƛժچ˽ۍ׺ޟߵ«ݳ -ξ፼ƻࡨljܵȊӚݩ -䌒̐몏ӿ䱦Ѝק𯚚惘ءͼ͡ͺ -ͻЩɫգ˯势Ϟ֌ԩƎ㮨޴ҽ圏 -ճÌ˅޺円긦ŀǣ -ᱧϡ坆ޭ޼ˮ꨼Ԙɞ׀ -ӗѫؒاąݩꨁſ寻ڃ -׆ܮ۰ڱܯǿܹը力ҾҾؙǂј -ޭ㥞쑚ڡ񒎲ùӳӏҶܞ疴ח֥ -ҡзօûꯙَ֖ױ -͕儴ȋيʾŠɈъƼՍ׭˭ƛ捨ݗ -ň簁נŇ枔ָѮԢ̚Ҝ -ڹތÈޏ֘ƽdžˊ▦ȍҍ铑 -ﹰ¬̐݋ֱޑߚ՟ˌ֓¿豠ۯ֍ -Ǿ꼖Ĥƍ۷ܮ˄ܯʇݗ勩Ӿ -吇쩿겇鿖¦үϮߑ -ސѾˡ×ЉƖԻ㶷Š߻ӷé -ۖ𣌼Ź҃򵘝˛ġՀհďĎ٣ӆɁÊ -ἘԎׂ߽Ê納ɍƃȝ켾뺛˪ȧѪ -䋘ߥѬ˗܍Ѫƿ똵݃ͣꐡɯݨԎ߻ -Ϫуռ҃܎ǿ哠ˤ -䳆퉎Фυꡌҿ̑Ǐз޾ -ԏߔۭ҃уӡ㚺鮤ȼٍٻܕ˻ -Ώӽ˻ϯޕ܌˺ΖÞϜʚݗꨬƳ͏Ǻ -䓬ݖϑ꾽Ձů̳Վ롛߿וܹФ -կ֮𶪁Ըʣޥ̍浌Ӈ՘ԖĚ -уҟ͜Ƽϗޤꕃ׈ȊЩʉҍ݆۷ޢ -޺ިòԠԄ򯘚Ȍث˃žƄߩҘٗ -򙯖܋̐˷ѷҴø -߯ЯԔԃЍ™ߊ՘ˡĪ -ʃѕ鈥ӐÛӮҙ󳴲ɐ˿Ŗ -Жėػ톖Ȕ܎͵ո -Τ͢埨⯻ܡݾ΃Ɏӥ -̯ހ헖䋷ԌԳ̎Ձެ˿°͵巺 -΅؇ѷ܋č̭ѯͻĜː -ԕú׍ϝӪͰũюԠʙ -âܐų߲ϳρ댵Ǟ޷śՎ -׺ܗ٧ݪƀ̈é򵸝̍ˉ뵏ζ׏ -ܭ߾߻֣ݏߝÿ -큧ݩʩݳ̺ڠߣ -͡У҃ޤڟϒώ߿ŐĻ -ߌ̼΃՘􂦮ʵ񊔿͟ԥ֍ -߷훿:Ӝ㆜Սʑ۠̎އ㟆︻ߺꍬ -ҷ܋։ͼܿԱԠχ臤ހ֡ -ݟ؏ڀЃЃ -ȀЃЃЃѥƝЃύě⧚ʸ‡԰ -ǔùҐϾڍۑݕʭň췹ҏ΍ -޸쀶ƵɚÎૉᄿ⢵誇˧ēэǩЃ -ڷ֊պڇϸܿʶ†ګӆŇퟫƫŜϼ -ʄҵڶ֪̝Ԑе葴닩ҸჇήدҶ -Ի؊뷥ΜNjލ䩣 -߉ɆƸᡸҖۯӣŤޗݍԲ߯΅ֶ -ݶ듊ӽ̵ڕ؇ۜУÏݺ֭ -広ർҙݯ六ӯؽډ΃ћŜߍĺޡހś -ݤőƽ쏉툝ގثાص݁ḽ -῍ƻף쀮ܥ띨␧Ǎ܂ꀠꀠꀠ -ꀠꀀꀠꀀꀠꀠꀠꀠꀠܙꂀυꀠꀠʼn -фƗځݗ۷†̐۞ȡͯ -ߧ궂ە龭܋պƒ߾ƛڎʗӾ -ǝNJ궂괂Р͇ؐϴ܏σ -԰܍˗㴋׭ť؃Įƅ܎ò΢ -ܹѾԨ÷܍ֳ֍ݽ֍܋԰𒹚 -ʍ݋žōךܮ۷܅԰급܍ښϝۡض鮠 -ťݨڍպ؃Įꔏ꩜㴛򵍎 -렆ڋ⎜ǠҖݰȧ -ߐۄʕ闾ƏѡЭ㸝ʗşƟہ톅ԯׇԫ -Ḁ  ˜”ǭʣ޼Ԣ -펎Ɲ˜ӗƝЧ𲝻ݎ - - - - - -܎⌀̟܆Ėԉ -փꀀڪ̘ -&] -[s0; &] -[s2; 10. Adding images&] -[s3; To add some eye`-candy to the menu, you can add small raster -images. In U`+`+, images are represented by Image values. You -can use image designer, part of TheIDE, to design Image constants&] -[s3;= &] -[s3;= -@@image:2818&2196 -읉ӠԊ֊ʦγĨLj -擞ܺԥҧ۸į -܎ٚڊօۋ׆Ψ؛̩žȥҦ޶ -ήų؞ꢊ؈֟坺֯줒ۋ֜Żτ -ʢϖƈױʊ۔ȠǣĞ涗Ȏƪ׊҇ -Ѳҝޘ䕄ˆˑǾȼ⒱ҾذŖȖʦ߻ -֗𿢜ӭзٙī⏋ɈǗұ񑥔 -߼υΛُ̫׬⍍ȉ˃߆ݻū -䧅Ĉ튠ʹ箕ʪ뜋͸Η嘥ڒ -ᥡ齥ڗטŒफ؟뉮ؾ¹Ρ -ȫݺ媁ȃڣğ߬ˆҹۜ͑ͭ -㖝ݾϣݑ매ʢ֏ˈ -ȹij޷ǯ㖳⻛յӇЕ摼޼߰ -Ϭ깖⪋Պמ⬲ƾєԮˎ -𮆻ƺ鳾ޚ͢ŷͳҎܼͯȉ° -۾凿ߵ٭˕杷ӯᅵ뒍Ͼ -׼ϼܫᷮڷ׼鳬٬Ҫˎל -ʥݣބ⵱Ʒ߿ۉ٢푷؊ -ͷ¦óԹΟ飙߶ӯʡߖ۫ -͟߿ͣΓҚ孟笹̵ןמݩ -ω̪ͤќ߃ӶŐ⏔٬ -ȱܿԾҍ׶Ց׬ߋ׭ -թ׮㟥瑻鞪ԏ㟆򖰵ͪ냸 -Ȑȷο˹ѭ̜飙޲ȵӢܵ围ݺ˶û -՗蛆̭կǭݡκ -ߝЮ鋜߻ρҞſӘȋ -â߹ijͮ⫸ͷܟԮСζʜۊ٫ܣ -Ӎڬٌ㒝ΗʧǴ´򬡝ӗ˛絿Ж -愉޻ӢܾܴѹԋڸΙ޽ŀνã۲ -񺸩㖝ƚϑȃ؎ڢč㔽 -ьϢ񜃞ƫտɉпΧޓ슺Ȩ -˟ؿ˶أФˮٜӪ܆۸ԦԘӝӬ -љ٥Μզ羇֏ڑϼŚز昷͟߸ -߼ݲݽܕ۟вҹꙚޚ엧 -箒֬ͮˎ귯Śь󌴒Ѿ½̥̟ -Ǖە􁔭ۢʿˊ֯ -颣ٚǿޭѰиٓóΜΙ -ݟ郮犨߫ӻ߰؋ﵫĬգ죙隷ן -ѣǽّϬˏѽݾˌܣ -ǥȷˡ׍ٜߔ߀ԩͷɖմѧ黼ԣߔܻ -훽ۂٗݲĵͮƈ׉ު٪ -뚵פ֞ۿ鏢čŭǝטѓޝ -ǟºǿаϝԾʩگϥօӻߴ׽Ϣν -ȏӿלˎ׼ذ׾ -ݳ鹤ãܿ⺁ݜ͗ -߬պ趗я—իŬᎵؾܓ -ީ񳬮ӏ˒ܬȼ􋯋퉙㿑ݗƴհӣ -½˟흻ĉϴɲǼ۵ӣ -鴦̈ޠݻˆ祗ӧߔۦΉ -޿åӻ޼śՀߝν⦢ܽǬȗկ͕ל㿢ɿ -Ԏѻջύ̓ΐ劷 -ɴ¬Ɵޖ܆洯Իߧ -ܟ婶ͽկ͐ߪݩǎϛÜ -ˋގר׿Јܕ̨ߘ֮ -ˁގٶŶҟ؅ƚ҄˂ -ͺÜɷ -ןˇԟƶ𮧥腆ἲհ -ܮی񩻑✹ڿ˼܋ׇחխ -ͽז؍Ǽꄼ͟ߵܻӯɺܳճݱۿ -Ϊ̧ӧ翌νÈޫˏ˞ם߼է -֝ѽݚ͑ΣӅҳǭϙ⵽ -蹙׋ѹۦ۲˰՛ҺխҴݔܞ -ݶڛݨЋޟŽ趦Ƿܼ鍛 -ӻ┨걅ǭ軪آ恕ۭ󄧞Ь˽ѬŜȩ -ߢǿڸNj͟槫ӮśѽNJӋ -ޖܛωեNj݆ɳ߮󖉤֜Ӛ㿞ӿ -Ͱ޽îޚ֬ -鯏ß㶰ɚ缜ֳ֖߉嗽ٿ -Ѣ۴ةΉʕΖ׷޵ɬחϽןձГ帰 -ී볍󬕚ۘ˷͑ƺ -󝰻͌ڄԦ߸〬ٳŻ -߫퇰̉ܟ۶܂󔷭ܿ˛嵳Ͽ橗 -槞ώϨ߱ۧҏ帷ᶳƺ􈝗޴ݞ՗׭ -群߿򹩫׶ґ͛༸뤓×ꓕ -ӳ粿ׇǞ鯯ןיٷ󧾾Ƭ -痜ۢ⫰޾ۛ폯ܶƽ -󟼧ՒᒜڮʽľǞպǟ -ʈŇﯩψ橆ح̝١񡔆Ο -ϥˉ˶ꚩ׿¤ߺ۷햿˓޿驫нಙ -ɩǘ뽇엔իԏ֬՗Ξֿߑ◈釿 -ﺛ胑Һ׏°Ͽ𫋝ij󞕉Ԧ -̏دߋ╵巑㫅čθ߸ -֧ܧԻ֧ي趬۹ķܼГ -ğއ蹽ѐة蜽˥祜ϩ߈؅ܞǤӇեΕ -ՇǤĝļͯյӇϟ郮毷ז˳ -򔫶ҭڽի뤖֑߸Ο꼃ם׭֜ -ڳ֝ǿعܭĘߓϣΚɝŶ -د妋۫ǮȩȂ۩仿現ˡ׊뾥ɺ -ښԙܻԋڴѯ̿͋ӯɦ -μ鲭̶ޣՋֽó翿οߍ筺ڱߕם -Ɯ󙛗ݖԘ鞿ˌ˟ -ΜޙĪƞǿ󯿑ݟє՟鲍ٔػ -߽񳆏ϑϾϸͧՅüОސ緎 -󷯼ɧ툎ږ䙶Κݯғ޸ -֜Ξʃ╋쫚ƚ˩ѣdzƪ -۾̿޻ϗݫͽ -θޝ۶қ߳㌳־ʻזՏՂǣ׮ -֩뫞έ퇼ßǡʻ߼ -῝ݼжƳ˥ƈڡҥӷЮϺϾ -зۦǟ豇􃦷䂚گͽ -ۿЮ߼ߓڻɷݗ׼ω -ȗƞƹ켿ʈ߶Ĉđ݅ -Ϝֳ޳鬝۟ܢ -ɂʓӷߥؓŬƋɎݐ誩棍 -ۖևlj΂ĉَٚ˵Ľˆй䩡𵝸 -ޣūȒ٩ͼף봽Ϳ -⇞⽃ˆÞᤄ̈͞߼ϭ݋ -ԛӣ°שɚ鉯ꣲ -ͫݛ沝둚⫭ÉĔӥ -ѮܲަꥊﹿېƩߝВڵۭڝ -׃Ѣѥ˟䖫ēؚʼn -̙џϚდ駖ڮ߽˽Վ -̮ԜҹӶ鎴°̅Ý˭ȓѽ۝ݣؽȭϑ껱ӡ -щ䴟ũ޵ٳʑ̊Ἷћѥۓȷǭܬƣ -ƻƉ՜٫̾֓ωԟƌЦت뇶줓 -뱧Ɛڲَ۩穚ƧΝʄ¶ -չ꺫ܣ۱꣍ؙΑۋ͖줳ﮨ -ӠʟѫԹnj鹭Ӥ㞯Ļ -ȫ褨旍Ⱥʛܙëၔä׿׫ڏ⡨ -ϕƴȒݫ̓ﭵĦ肧ڣĨƕ҄ߙѩ -ДןŭȘ頿޿䧐͚蓱ˉ責ћ鬶ͧ򉐪օݜ -眜̾ݙ̢ۨάÍ̊̈́̑ϑ -ސҮŁڢ߶믩ӵԾߪȫ -ˎȍɢϊزƦ˭귝צޢܪ՟տ͚͝ -矌ÓٷҔʻŒ̚ǩԆ -΍ե—ؘٯؕ۱ƪő›ѥ -˖Яɮ̵٣縐ﯝ͹᷑ݴʕբ뎋ۼ -ԛŢ͐˝ƪъԭŷ쟏Ϊ脑˶褊ͭ秪˥ڒÔ -ٌڽć٢֌逑ɥԨƳͶњԹ -䚃ʙזǫ̲ǷڜʊԛՔȃֳ֩ۊ -ئʱڜ—ٔ˝콹ʹϤԝډιǬ깺ԭ -ͭ۽҂Ԩƕ֙۔ʟ⤥ʮ뗒֮ -ښɓ޶ԧյܴƪӦͨ˧䷛˓о鷿 -הߑۗĺƕʙܣಚʱ׊¦ζöզŮ -򿰈夺ܘΕںˤ׹깃ޥ᩶͞Ս̭ۧ -Ə󤥖ŽƧא˧޵˩ϊ꒫ -ͼٛ͑ě毻ΤѣӀڙǘ߃֧ɱ렒Õ -φǚƚџռ̷朗鷦ݣրLJڝޠǧ -޼ƙ󧲵ܗ͍ԟǤ䚩ԊΚՑƶމ껐 -ɚޮΓȟ҃ϊȝؼ݈Ȣݴ -ڌʈ½͑ˈ礌怰۟ -͔̈̈́ҋЁऄˆբĞ͵ݍݷ޻ -ʷꏦﳔ䟤Ϛ⍸雎ǘݷįܛ޻ª -֬Ӧ؟Ŧ񇶭ͱȇʂگʰ޻嶹 -ñӪ騲҆䫱ݠرϱ뾕۪ޔͦ -٣㜮޻Đ򎘆ޓ틫ڋԶƽͱ治Δ؟Ԡ -謺ò뒓ɳŋм߳؋㺧֏ -·Ŧ݊אȺò片םѯݕКނΎ轳 -ܨɓ쯿љ̫֢ݲƱǧޯ -ѤΌ׭֧۟㓹Ϝߣɤڿ -ʕӻ₩ҿ擏͒Ŝਓáռܾˢ -Ǜʻޥض珼׫՜¥β͡٣ -ژʣծҒǜșҋ΀Ҍ˼ލ޿ұ͓ƪ -؞ꘫԵ޿ޛԧϢʓ۠ͳ -ޚ֩˫ǚ٣ܟְҋċթǪţթ݌ -ʷƂ򔓍ְ݅݃ސ­ǝ -ɖ۳ŹҬה󤊣ԮӨ楤紉٫䥖 -󧮑Қ훥Ȫ湃љ̀ݮ -ܯɽϞًǚǡإڻ« -﩯ͮΠһƺʩԑǺġᥦʺ -ȕ殷ּݦԄ줵Ԛ걳񷻜ס -娺ɮɣһè󎥞Ӑŵ̑Ӹ -󤹷ҬÍܸ˹ջȳ᳖夊֍߭Ԍӡ -ɋƤ͊ݪҠ˔ƣ둗ԥʲ߱ -ԩŞٝ޾ͻҒȌإ腌ś́ᜩ -Źݟϭݲ˝Ǿƚبٕ͛ǩӼ -Ơ훔嶁пќΞƪ߶Ӟ֗Ͽܓȷȕڹ -ϧɔءլ뼹֐׋ԐǺËѠϘՠֳ -ћȓٝȃѤǪ̓ͩͭʹ註ǚă -؎ˬĠɵمͳȵ˃ۋܳ͘ŒƽѦͽ -Ƨ͑ةϳꯑ炩ʞ̫ȩץ -ܓ枰ϿȻӹشԔҢ˯Ź٤㤩 -ӕȓ̻󿏴ʾ۪ԄڍÃ󛤤֍뿏ʐȇ -Ȯƣ˦ۿىŵұջ島米ǪΙ֞޾ -ݞ̋Զؖє֦墭댌 -֗Խ׺ʜ줠٦ͧƫ어Ǭԭ -솙շܪœٛƧŌԽĚʩѵՁȟ -ȫܚ͎̕ƚ߶ѲӽՌ蹨˵̵ -ڴȳƄԧťǺАґ٤Ꝍ՜偧ڗ׽ڴÌ -醙լ݌Կ抵ץ񷵶ʛǩ׵Ϡ񴏓܌ЛڢꝻѱ -䩨󉫪ѦѹҘĉः꿤ߵʺۉ -җŶΑڙ̴鳬Άٷ燱ۥ -􆕦ӢӚͪȫΊݹ흣۴˜ःᅯˆ뢜 -ƕʃȫ׶槛Ʈӌㅄԡɓ -܁楞ӘְҦλ󖧥ƨΖʘ߭Ӧ -ƪ̱ƪޟ蟗ȜÚؼ -뾪ƚྣȻοϟޥĄڴߴ -żҢ˦Ւܶ۳ͺ -ǬƪˆՌȆ̈ʿ؟ˆ -ȿ‚󇌴ƁΆߡ˶ߩֶ뤄ˆijŴѹٷ -ĩȕ蛩⽣򽤱߷œ֔Ȼˆ·ᄐꍯږ㞫 -㭚ݢ됺ݕˆҟ슿֔ƚ蹩صέڋ -㆛΃ѱˆ֘ܞïӿ׶餲“ֶڗݘ -նƇˆ˿拙ݿͽ̥̦݂㍴ݽδ -ȥǘΚ߬㪶뎋Įޝ礁㤄 -٭ə½­Ϩ־҅ǹȉѐڳ礻 -ɉՠȲĆԷ፹յՓ鹚波ŏ -ˆ틍ɹֲ澥ޝ̚¬ -ϤבȦԌ봊Ƶ䤃⤄ˆѷҬ呴Ԟƪʚ̔ -ҫݽϊˇҫВˆӶ巫ӲԊ֥ȸ婵Ԧ -Ζ俒ꌪᏒþňȧ扵ɤه﹏ͣɥќ -ێеմۭꌶऄ魱ٮײ❝ӳͱڪ -ԦƲɜ㳜ҸϼҖުÝÈ礠 -ܼ٫ܚ⫆ڮٹ͊ܔď”Դ -Řҟ슿֔¼ȃ㝝ٌ̈ -΅ߐٕޕЖٶ椄ˆ̥ǘ򃖢͍ˆݥ׾ޮߴڴ -͵ұᒐˆȧ׏ӵǁˀ祿Ңƪ۰ -ʈõ󤺁۶ʈҥ޵ߜҼ֏ -ˆϟȺួޢ˻餦خҶϸɉق -֞۸喻嚑Ìȉ쉇†ŴѹӲƔ⥤ -ǖʭᜐ勊޻ϰҚӄݏӗЧś՜ٮ -ƒؓҌʚݦצٶȓߊ쉇†☩ٗҳ² -㴢ǚ猴׿ڟ쉇†ؐ鞓ܗ -צ˹۹æҕճƪ䬾询¡͇ǚ˫ϑ՜ -²¾ķטϑʃȇ򍠘擎لێդꇛ -Լ۲ȕȇܝۤҟҶꆼ -Γ߱˅ߐ葹Ԣ͑ۙʤƑǚ -ߌȶӯ׹󫒏¡ñƪާӰǷӓݷ -ıǨ츱ұ׊¡Ͳǎ΢ґ -ݩŶȮǦįЧˆƺﲏϗĠťö -țҕӬˈᖯ̥һٜ϶֐š񴥍ޣ -ܡ͔ʾ߇ԵΪ朗Ѯϸ -骙dz˝ҟӫڀȋȠȋȪݮӄ䖻 -1ґۦىؓԌ褕ӷƢϸ -𐲰ɻɉقҟぜ퀃զ峕Վ맛ƩϸАٍΚɚ -ͬᤤǞ𠈡⤲ݳҷǃډ᠏ϸƁҫқ绂،ڝ -̈޵Έ߱ƚ㏵џˆƪǺ -Ұͽ捣˻Л﵂ڋþߐْڱ墾 -Է¬ɷҀĊȳӬ¿ӥ㦅ԧƀ՘İ -Ͳ횭ȳȭԚ鍑ՌţӪƃӛ -݆ȭشǥ֨ьҢʽޮԔɍџޘ -ɍ彭Γګ棾Ҽ扆ǯԧ؏ɋҀ -ϿÍ͋صޅ񤀀Ѕʨ޻ܬӛ옩 -џޘ劑Lj㤀З翱ߧ⛄ƊҔƟ -ȥֺ͔Α֖ܜ輘Ը٣ -‚頣տ󤀇ߵʯ͘ƺͰƊʷ -ɉזԿ£ȁ̪ҌڴȡठГÌƊ -ȪȁҰ⢵ފDzŠᤓ -Ɠҟ̕ު꫙ҀњƃўֽЃĀӣ -ɻȡऀГՌ༘ԄţŠǻȡГ -ٔҌƊ†厔͔ҹȗ̾Ӧ‚ -ܣؤҀɾϷРҀӣ־ݿ؅ᔚ -񍌔Ɗ巒ֱԌ讑͡ƊᱤţՙȡऀГ -ӣȡऀГ놯Ԭ輘詀Į餓× -ꓕ˰ȁݒƝͽҽψȡऀȀГƪȡऀГ -Ռ༘ԄţŠǫ񚤋Ҁ슿֔ƁʜƊ݅ -򬣲ˎ칚ҀڏΑʥݜ༘Ԅƪ -ȁ̅һ됻ɲ̼۸۴큑£ȁ̍Ң墣կ -͓⃤Ҁ稉ƪţĖȡऀГȝ蠼ķޤ -輘詀ϣ洛ܓӚרԾȁ†ʘĬ -ڷȄʘ՚Ƴž޻ڈϰ輘ĕ -Ɗڂ΃͔ﰐӰ輘Ĉ΃शȡऀГ -ƚ̷߆ƊÕͼƊᝇᤓʿɘᢇף -ފȁ̖͊ޥŰ輘ă줨Ʊ -کȡГ͑ȉƊԄ셀şʕ˄ -ߔǺ֒ƀȁ̍Ԗְ輐ۢڽ輐ԄƄꋌ -ڼ΃शȡऀГ輘輘Ԅ -ऀГƚߟƊ̅ޓʿťԣׁƊ܅ȵ -ٞڒڄ⋌邽ںၑ͋Έªʱ蠼 -Љ쎴խƊ̅ʭƊ̜ʗН -ጔȨڽ輘Ԅ‘ꂣŠ큑£ȁ -аҀԖ۴Ԗ݃Оݪ߁ߢА -˷ܣχҙ輘۹㏸λ׷ࣤА -⊩ӏҎ껨̌ɭ -啓΃ʌپːдȋΈ§߂ -µԚңᡎ껨ڥǘӾ߂ -ڇ蔻ɦ舔۾󮑾ϻѩ輘舔۾ -􌴨ݰҀà卛җȡा㠡О͖輘舔 -۾—лЁӑڅӑ΀ځꗡѐ؜ -ݰ谦ﴰ⻤מݰ谦ﴰ⻤מݰ谦ﴰ⻤מݰ -ﴰ⻤מݰ谦ﴰ⻤מݰ谦ﴰ⻤מݰ谦ﴰ -מݰ谦ﴰ⻤מݰ谦ﴰ⻤מݰ谦ﴰ⻤מ -ݰ谦ﴰ⻤מݰ谦ﴰ⻤מݰ谦ﴰ⻤מݰ -ﴰ⻤מݰ谎隀޿ȷˁ‡ݛä ޘ -ꗌȺ껍Εĵ󽼱킑‡Ϲݰ谘ﴰ -ސ׌ऽƊʛޘ׌ȡाӇ쳺˛Ԯ -ơҞڅǃ΃㰚һ -—꼻Εĵ󽼱͑‡߹򆸌ݰҙ谘ﴰ -ސ׌ऽƊʛޘ൤ȡ࿤ܳ -஘Ԙ㺰ҞڅΈŀߓư펓ҪΗҞ -څǃ΃㰚һ働—꼻Ε -ĵ󽼱͑‡߹򆸌ݰҙ谘ﴰސ׌ऽȟ -鹰谦ﴰސ׌ऽޘߡŰ谘ﴰސ׌ऽƊ -ʛޘ׌ȡाӇ쳺˛ԮơҞ -څǃ΃㰚һ働—꼻Ε -ĵ󽼱͑‡߹򆸌ݰҹ谘Ҟ誰һи߉ -氙㘣ݰ谘ﴰސ׌ऽƊʛޘ׌ -ȡाӇ쳺˛ԮơҞڅǃ΃ -㰚һ働—꼻Εĵ󽼱͑‡ -߹򆸌ݰҙ谘ﴰސ׌ऽƊʛޘǔ -ࣤȠꗌȺ껍Εĵ󽼱킑‡ -Ϲݰ谘ﴰސ׌ऽ欑հߩːԨ -ाɮڧưİҌ񝫒ҞाӇ쳺˛ -ЌʛޘǨωލΕĞ󽼱鏙г谘 -ﴰސ׌ऽ㑧NjкׇǽɪÌȺ껍Εĵ -󽼱鏍ᤘԘҞɒƯȩƊʛ -ޘό⯢¼貰ƊК̚ҞВ޻ -ǪڹҀाܳ˛ȣʜȩƊʛޘǘ -ѠΑϽイ˘޽̯ܙ -߫늽Ȑ̉ͲꟌ̬ÙʱҀ -߹ᐤҁÁ茌ʩƟ٧ǿ -鰪⹤΍ڜܿưʘ骣ǔ݁놉 -ʷ֪̑鬘ƞ靫놉ĀݲҀ놉 -ȓʾ񝫺놉⏤寕݃݉Ʋʛ⤘ -Ёǃ΃붮׍Ɗڂ΃΃붮׍Ɗ埓Ʋ -ʛ⚄⤘礓ܒ뛶żƊƪ̝流 -׮ΝӡƖҾ껍Εٸܫ߷ԇƫ -𣫕єׇ仒哞ɌǛ΃΃ͰҌҿғՃޝ -ڏы׍Ɗʦ⤘Ʉȁʦ⤘ -׏Χ뫼ԍ껕̄쒤ˋٔذ -İۘĹ쥙췿ƚ꿺Ϥ껞Εȡʘ -ɾțƊʛۂЖ屌ƾ嬨״Ɗ؆ʛ͑ЖՌ輘 -ﴰސ큑ߗघꗌȺ껍ΕŢȡһࣤ -Ɗ큑􅣅΃ȱ苌Ԯ񝫘Ɗȡा -ðҌڂƊƶʛⓤЖݰ谘Ұސܔ훂‡߹ -घƄꗌ껍Εȡһᔰߩݡːћ펳 -ӵҞűðҵ‑ȅ꼅Εȡ☩հ -ðҌ‑څꅍΕȡհञðҌÀڅꅍ -Εѡ՜ֿ̣״┻ސ۷ҶƶʛⓤЖݰ -谘Ұސܔ훂‡߹घƄꗌ껍Εȡһ -Ɗ큑űכ⅔老ސȯ⅑̗ -߹ꎗʢ볥͞΃􇶯Ёڥ몼 -蒝ޛìė󒓵Ιݾ躲Է嬑ꥍЁ -־ȎҞȃ̂砱ڢԇ׌壋䰷ݒ -̨ٲЀ׌䰷Ҙ̍ܲə׌ -䰷ȷ谘ﴰߤ頼鏵ﴰߤ -㠼œܴޘȡा榁񤽆 -榁ऽ뵋ȦȽߔ̓Ȓ̀ƚԋ -ݳίܴގnjҽतȗߵå΃܀ێ鄎ƣ -ķ챃ԪǫҵޠꅍʂČ㆘՜Տ򻖻 -ӊ߰үݡːԌҫПۊ߰үúݫį͙ -ֿ团ʘ߰үƊѿ̯״՚ؤĚ -Ž䧸ԋ񝫘Ɗۨҫː֦ɝ셙ݶְό -׫ưүĆƨȭȋԙ뇹ĮȽ -߹घŀʹҔﲲ񃂣Ι˝ðҌ‑ -ƀćӭڎҔ㜠ƶʛⳤЖԪ͛洧 -ɨģ┻ސӅ郏ѲǖݍЍञ -ðҌ˺ˁڗꔌҠ޲ى݈ꅍΕŢȡռӺ -ݶ̾稺߹घż -ԗɜꅍΕŢȡ՟鰮˯џꊇސ -ϿΨސֿڹߠүƊȭ -覘҄ٳɿ -ȱꕌij┻ސӅɿԃȱ苁Ɯꕌ -ސɆȱ苁ꕧސŤɿ -ȱ蟋ޓēƙԋᝫƊیҫ襤Ƚ߹ŀѵ -ԋ񝫘Ɗ茰ҫतȽ߹घŀԋƊیҫ -Ӻؐσȱ苁ꕋ勿ꅍΕȡՔƚ© -ߗ宾ҊНھ꒗ŐȚښٵ̓ȩϜ -؂˷䕩ֵڇ񝤫ҞڅɗҺލΕĞ󽼱 -ҍݲҾܳ˛Ԯݰҙ颇ɢލΕ -󽼱ҷˑŞΒꗰƪߔҪ -ᛇ業ԫʃ籽Ҿܳܮȼ떳ҩ֬Ҵ -׌ԴҾЇ쳺˛Ԯ֍ǮҴ͛Ԣؖ։ -Ю՞ޫҾЇ쳺˛Ԯ͙̭ϴ΢čž˽ -ƾѴ̶֞ԽŝΖУސ׌ऽ혣 -ĥݚȳʡЕ׼޴Ţؚ -޴夛ݨߔӴ𢿉 㪾趪ݣٽɃϹ -ݚҢ޵ő֫פȚɊꌕ;ؖťލΕ -󽼱鏙˹Ҫص҇޵בʖނ褏˥캦ў -ܳ˛Ԯͦ𪢮ƾޣ땛ړЊЫ񩋞瑓 -㰊һȟɤ㠔Ёڥ矴 -؜󤽆njҺڇƘ񝫏ۑԮݞ뉤 -ٌȻמԱݺҞȭҍ״ -מݮƜ߹킑Ά톍Εꗌ -һ௤ȻҞڅڍ񝫏Ԯϱ -מݰӺ⤘מݰ԰ -܅ژ횘񝫏ܮՌ灊ĭ‰ȒݳƌҞ -څƊ˨ɀ⤠ɲʷؾ˨ɀ⤠戔 -۾Ůȟ˂̐Ԇи彬 -شإغ戔۾ꗫƚו푲҉ӳڂ䌴ƒ -ӾߓȧͨıƖʃѱà囬һȓ͝ -ݱ᯶ƀ蘡О͖׶ƪߌ낌ħʷپː -нܕͧѴà囬ҧ÷㌴蹱鏈nj -ۗȽҚژϗګ״щ蘡О͖В֒ -Ȃҧऽ蝳Ӿə߂ɵʂДѴà囬ҭभȄР -Ӿ߂ʂѱà囬һभȱӁӷԮ髉 -Ҍħ欨˷Ԯ髉Ҍnjﲶۗȟ킑̐ -Ԁ髉ɌǮۗς萨˷Ԯ髉Ҍ -njׁ헠킧Ȧ̐˷Ԯ髉ҌҴnjۗ -킑̐˷ՂڑƊħʷپː -ɀ⤠戔۾؅ƚŋnjۗ瘑֛ -܇ﲶۗȅ牳쌖ۍŋ㠡Ы͖ݪ鄫̛ -ޤߋ܉ҾࠡЫ͖Ȅݰ۶ؕ鰏ڇ҅घƊ -ꗉȁ킑⤘ݬۋ﹤ȸΘ׶Ɗ -մ凒Ҕ顤ӱɂꢑʃ -ɤݬۮȝĀЏһزЙϑ˘ţȁɦ -ڄĀһ䓣ƊŊ뢱ŋ⤀һ -ɟꗌȁ킑⤘ơڕȁ킑⤐ -ݰҌƊ⤀ԀȱҌԮƊڅȀҀӰһघ -꒗ȁ耀킅⤘ݰҁ䅣Ɗ⤀ŤȱҌ蔀 -ڰ؝ڈꅣ˭흥ȅȧݥ -‹ᓇҀ菌Ԯ˺֎Ɗ큑څȁһभڹ -ȫȃ舩नг囙ޱӾ󃑂̛ݖթ -Ӳʶᐋ״Ĕ΍ǺɜԮߵȳӽ̑≤۰ز -ꥉ㤀зһ灎ǻᅤҀ誘ݰі􏣭ȔڃϾۣٔҢ -闾ı᪦޽څȁһڹ -ꗌȫ킑ѤतОưҖ􏣭ڃ򣵋ڒᤕ -ҽҀ菌˺֎Ɗ퇁څɝȁһڹꗌ -ȫ킑ѤतОưҖ􏣭ڃ򣵋ڒᤕϰҊ -ڹ궗ેۻѡӨҊȑөʔߌ -˼Ė՚u’҄븲ʝǵиǛƣ̼ޯެ̾ -̦Ä񸘁ͩɂҤ߬٣ȁЈŚ -Ȕ빍ŀیҊŊʑҤáȩҊਂʡ -ŰȗҒ⣛ᘢ🯮ȁ۬јբۆ¢֤겝 -ъФʑԖ쭏˹ە͂Ť -ȟ쓽ɼ߳ɾʑԖӓϢݹȑҤۨʧҊޔ顃ߣ -ߣԅͅՅ䯤ȗȇ譅ȰҀЋФŰƢ -Ҥêȟȩ쀀ФФŊ؀Ԗȁ‘‘ҡۨҊ -ʑҤá푡ȩҊਔʑڌȩҀФФŊ -Ԗ聀‘ڊ‘ҤШƔ옰䗓ƔۧȐȑڱȑڢտ򀀀ҫ -ҵŊŊʑҤФΠŊʑҤ֮Ф׏첃Ť -ҀłȾّɞ΢ȑʑ΍ת -ȇŖﶗ鸚ɇ㺢ߩҨѷݺݯޥȧíǝǑ -Śתηȇ͔ꢍǝΑ‘ʑȣο󍺻 -ҡ͡ȔѷݝӤФҤηȩӨ̩ -Ǻ䔩⠈Ƿηɻת -ȇǖԾǑųʝߊǝ͑ǑŚ -睟㝰޿շԓݑߤឍ -޾кܫ̘ژё吣ف -ڪؤۨҕԺȏǃӧφЫϊպݑŚÔ -Ԗڸ햟źܫ߈Ғ֖│ɰРެҤȣε -󍸻݂ȳ纔嶹޻źȑĠתηȈԖ蔭ع -ըҬׄ鲌筺ΎÄڤՕ٥Ҥʢȑ -Ġ׷ηƢ꫗ڤժȑĠתηȈ -қєܖˋNJԕФӶ݊ŝźڬǑĠ -޺תηȈԖË׾陳ҩفݝ筃 -ڿϽҤ󭻺󯼚ײϟƣϜ -Άӱȣε󍺶ҁŭߎź‰ؕ -ݝڲŊˉݑޞ㇥Αȣοٕ䔩鲗ᩏ -ǝΑѪתηɸȑѪݝ -ӤФҤȩӨ̩ԹѨǺ䔩鼯 -ߨԔķӊӑƞշݑŊŚתηȇڥ×˴ -ʒݜힻڸźצܫߨݯ񨹚 -褷η筺ըۖի翾꿉® -銮ڹ޾ź܉ߘԖŕ鑽ĿϜÎ -džŚתηՋ垗ܑ -ϢڬéԹ츍Dz緊Ñʯҹ -袍ޯё몆ȵ՝ރdžȿ튴¯ӥ -Ĕߧοևߔז夳εÄڽݤ -Խм߻ˍ߻ʟ̷ީʠźצܫߌԖ -ʭ׿׾һްϑ΀ղ싯җƝ -Հ冢͖Ūۤ巫ݙƑ쩻뾧 -Ñ뭧Թۓ啗Ŧϔٟź -Ȳѱԣܱ➺ƚż՞Ī㋝ӔƟ޸ -źȲϱԣܰ➺ᴆۦᄧ۳맟ן -ìަФ˸ȩґϽƝ뀢瑭則Ӑկ -ʻѤǯϜڹؑ떵鶊ǪٱǞČ -Фնפ߻󯜸ߙ̘ګ -ڢƭ󖺶֤ۖ˯ҹݖҫӧφ̙ӡ -ǿź䕼橷ϸՕ҆ϖ菱ӱԣڲ̄Į -䈿ڽФǏ̜Ԉʑ֓Ե၃ÊϽ -ԃ藲ƺȣҴ콙菙ӏրʴ -ҿۮ˜ƐϠڰӤ렧ɦ뮇 -Ӛۏڸԣݝ콩䔩֍ -ݷӏΑ͚‘ʑƣȣεʻҡ͡ѪݝӤФ -ҤȩӢͽʼܫ㨻ԃޮŚ -תη󟈸ҥٖԑ򷛶ꦫܫºߘȟŢŕ鑽Ϲ -Ҥ񷨛ηǭȷϼőƲݏǝ -ÃdžӤ٭ąݏǝÃdžӤƸߋ -׃Ŏ䗊蕹֦ݹǝ͇盞؋ -푖ǽ򹺾ϰםƁ۟ⰜؤծސۍԹ龐 -ԔݿŇӸ۽ٸôݐȓ󖚯ᨯɫ -ʼnǑͯ޻Ҽ֦Ӥ̰᛻Ԟ߅ηݨә茽 -ʡߩГ߳Қ׷֤ÇϺߦʼܫ߄Ůʤ -٧񞫚䉈ϛ렑פҤη䔩ڐŽ -𓐵푫ʑƣȣεڲݑƜГՏ -۶БҤη󭺝ѡڙ羁ԏǝ -ÃdžӤȬÎͤʼܫ߰ź͈ -ʼܫ߰ź̧ܫ̚ȕ¥ȥ剣ݏ -Αࠎǝ٤Α‘ʑƣȣεꯦ󍺻ҡ͡ -ѷݝӤݦФҤηȩӨ̩ԲԹօǺ -䔩ųዻ×Ӥȣε󍺻鉢ɗʝ -ؠߏʫ߽ÑΧתηꧥє䥋Î -ߍŚϑ·޺תηӢܛҤ㶾ڬ -ٝ‘⒬ȏ铓ˏҩʷ䏺׷η֔Ԗ -ݖźȕԖҔ˯źꯦ -ȞԖݖȋȉŷů󇭺ȳŚ -үɑ΀й҅ҢБ˟ʵ믰 -ݮ˥רη򇝺ˠըۆƶ㮷ɚĿÖ -ʑǀԴ҅ϬɩȲȿ﯒թ -ҙз伏תηƪФۮǩҿȽӛʛε -ܳϴÔ٤ޯҤȟշ՝母ԡ -ߡەȲȲݱܫ꟪ܙߚ‘ڲϤőֺÖź -Šεϐ՟ӵÖ׾퟊Ҥȟշ -ԡ᯻⒬ŽۻϏ̙ӔԨη򪇝盀ꤊŊ˰Æھݟ -ݷ锨Ϊ́ꤊˆܡݼ⫯ӧφՙŽ -ԹцͧꋜŊܡڽНǏ޸Ǒ -ʷἇϞی׶ዻޤŔ埿ĺڤ -ߚ̛Ưٸˋ՛ⱖæ燡잸挫 -ܫۏӋݑʤ탖г贻٤ۖž -ބ࣢ȕ˶ -&] -[s3;= &] -[s3; To get the image constants into your application you have to -use somewhat obfuscated but thankfully short sequence of preprocessor -commands:&] -[s3; &] -[s4; #include &] -[s4; &] -[s4; [* #define IMAGECLASS TutorialImg]&] -[s4; [* #define IMAGEFILE <][*/ Tutorial][* /images.iml>]&] -[s4; [* #include ]&] -[s4; &] -[s4; struct MyAppWindow : TopWindow `{&] -[s4; -|MenuBar menu;&] -[s4; &] -[s4; -|void Exit() `{&] -[s4; -|-|if(PromptOKCancel(`"Exit MyApp?`"))&] -[s4; -|-|-|Break();&] -[s4; -|`}&] -[s4; &] -[s4; -|void SubMenu(Bar`& bar) `{&] -[s4; -|-|bar.Add(`"Exit`", [* TutorialImg`::Exit()], THISBACK(Exit));&] -[s4; -|`}&] -[s4; -|&] -[s4; -|void MainMenu(Bar`& bar) `{&] -[s4; -|-|bar.Add(`"Menu`", THISBACK(SubMenu));&] -[s4; -|`}&] -[s4; &] -[s4; -|typedef MyAppWindow CLASSNAME;&] -[s4; &] -[s4; -|MyAppWindow() `{&] -[s4; -|-|Title(`"My application with menu and images`").Sizeable();&] -[s4; -|-|AddFrame(menu);&] -[s4; -|-|menu.Set(THISBACK(MainMenu));&] -[s4; -|`}&] -[s4; `};&] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|MyAppWindow app;&] -[s4; -|app.Run();&] -[s4; `}&] -[s3; &] -[s3; Here [*/ Tutorial ]is the name of package where .iml file resides.&] -[s3; Image constants are represented by class methods of class defined -as [* IMAGECLASS] ([/ TutorialImg] in this case). Image constant -then can be added to menu as another parameter of Bar`::Add.&] -[s3; Note: [* #include ] works only when images are to be -used in single .cpp file, otherwise you must put `"obsuscated`" -sequence with [* #include ] to you header and -[* #include ] to any .cpp file.&] -[s3; &] -[s3;= -@@image:1444&680 -흉ԔdzˡܓŒܡވļЂ׼ɶʹĘ -ͮ䂖蒕ѴМߠӽݳ܍Ãׯࣂ˭ -ȼ՘Ȓʙʦ̲疉ĊקڬҺև䢝ƀĔ -ʂǍҏӳʦ跈ݡۧ۶ۅЮ -Š؂꜀גڙҡβ̈́堏ѩݝ -ԑŇ貦皋⮌ׅ -ޕ؊Ԛޛ̜̌ƤԳ̪눦г̈˙г⑧랎 -ꆢшᏹ벐񞀹ܩځŕ瓋Ƚ߁ߓ -ܥߵŮȤɥꔈЎâڑ -ﭦσϻǼɳᶭﶣہ퍥ƹϒɔЬ񊩅⻙ -ō܏Ɠˑߥųڸɹړï -Ճį͏䭺۠ňԌδ䧲ڜ再̃˨Ɣֵ㷫 -㶲麗ޜɚˢĩƪĥDZԌ̰󲎊š -мיĎ˩ײ޻ت԰󳵫 -ҡɣĠМⶊקܗ폭˕קڠݛٕƨҸ -ъձ毳ųۤČ倨ٞ߄ -ˑʅ턹玆ٟčৣ瓨ܰܜӜό -ꚠŲݽçꀨ̚ʄӿցͭũ -Ώظ˳ޒΙпҖŠ乌ϯڏ١ -޽Ԏ޾Ҩؕίνȣ۝ַɂ԰ÿꭟ΍ -Ύҷ٨ձְ㭟ߖ•ґ߱⟙ -ɨػŴƑ•պںӂĕӮѾԬ˸ݖѳב -ƈ˳䔥Ѭ嫴̿݃埭՞֖ -ʚט؇ڡ֢Lj̸񃦐΁餬 -⸒ߕӽʭઆϬڪ۶۾ځۥǵꈖΓФŇӶ -ѸŢק՘̘﫜ګѽ˧ءଂØ -Աݡɷջ߶ūߎՓߤ蹇 -Ə˴򼦯ދ؉͇Β -ᙋޡ㰇㿇܂ι⸆ː͈ջ -˷޳㐋؝ҏ܂Ӥ֍訒֞³ -ՒᜣӇբהᝌ⠞Ӛ -굙ѬƕԔ䁈ϖϸ̾̀޾ҼЌ˷ -ӰÎڍʉ̖̍ඵ⡇ܸ̎ʝɢ -٠å߱ɔݯŠڴIJՌݜҁ״鈈€ -Ӭྔնܒ·ڞަҺ -٬ԡȬÂۜʩѬڭ🇹ܴ -ЇʿҜҋℬ󆘻ĪŽΨҬ͊璴 -Í؟꨷χ૦Ԑ⽯򉆠؂ɵ䱙 -ẂψҿӶҟ޼ùˁ♸é켢Ϳ¸ -̿ċ˼弟ҧľز޾骲 -ɸ᫽غ⩠״ш۴讚ɝٰضض -Ӄ”ئɀ挝ۥտ˽ߣϥ -碻Бӈƣτώ՞؅̲㡞ҕ˳̥ -؂ǶкѴ¶Ԋ۬ՑԱя -퐚ϒܓ̢բ滎õܼ丧±􀁪 -ئı㜕Н׈욚ˑט산ڂבՎ횎怗 -ج䳹𡇴ż˜޻ҵԷƿݯԸ̦̈ -Ě᫭殘؂ÛɪʊȉϺںܼؖ -譄εߚϬचےڽԬބՓҧƖ׬铇 -ćЀï妁ߋģ߰оϡ˦䲿薻ͼǞ˯ -қﳍ֢ͩ㾋ç֢ĶŦ -ړı姭ߪ҅Ĺאϱ۲җ˙՘ -ɼئĒڴۭġᛇ -룉᪅Ԑͼ۩ʲɏ
ρѬʬ -߆Ҏʎے鎵Ԓ䕴ҢȦѧ -㞅̶圠ȹлחߔ扰駩Ι܈؁ -ؓ쵝噙ÜȪ߻ГʄϳѸ -ٺ秒Ӈˑ菨ѽԑԅ֌ތڪƭ -ӡֱÎ;͙谮ޣޣۡ܌յʯǜࢮ -Β̧Аڥ§㺖ԇΌ̏󚔣ﵢ˼ -Ɏ°큫ݷϹ؏Dz͘σȃЭ -̏܅뤩돔ήьȒ慭ЂݘֿٝҌԕ -ϩ׭쫖̫˷έԕϪǎؿͿҤ֒ -̓טͿ宾ޯ붱Ͻ֎Ʋ؛Ӹã -Ƶ¯ॐ˸фކՑױ菨ﬨ -ژݡ̤Ð懕Ðٱ؇ԌÈŐ -ⴍԌȊڿž֟⪰ⶁбǎҢ -Ljڈͮاѱą鲬ꭃ͂ڣⲈıæ۾ԌÐ -׮۟܂ʪ߱бܱίߡꇃ -񽤾߈ӑ旨ԯΏŐ􃾪劔 -惌əʾ˺ֿ̕ߢԠڷǟ -бĮЌҕǞЋ߱½؉Ŧɔ卥ڱΦڀ産 -ق³í⪴ͻ횖ؽȪܷĖ๕Őȍ -ȱšŐббԌ鋊󣝝ه -轣ӴŔݥ慽εִͥӔɮ -ۅߣӔވ܄ꂶʂΫĤ∂ÐбԌ䅕ÐŐĦ֌ -Ԍ䅕Ðٱ䍕Ð٢Ő捊∢ȊЅÐб -ֱᇕȊԌÐםȊӋб -Ԍ䅕ÐٱԌÐݼá۝Ȋżб -Ő쫆ℤ䅠ÐŐ舢ȕŞ˼У -񥏼ȳ捶ΐбҳڂܰƔֽƔˑ䱃 -򛄰ϔÐȾޤͲҷܥ驅ڧ𗤣Ҟͥ٣أ񻠒 - -&] -[s3;= &] -[s2; 11. Toolbar&] -[s3; Toolbars are in fact quite similar to menus `- they provide -set of operations with names and Images that can be invoked by -user. In U`+`+ you can take advantage of this similarity as toolbars -can share the definition with menus `- if [* Bar`::Add] command -contains the Image, it also adds toolbar button with that Image -when used with [* ToolBar]. The text of menu item then translates -to button tip. If you want one particular Bar item to be used -with menu or toolbar only, you can do that by using [* AddMenu] -or [* AddTool] instead of simple Add. Also, items without Image -are automatically added to menus only and vice versa, items without -text are added to toolbars only.&] -[s3; &] -[s4; #include &] -[s4; &] -[s4; #define IMAGECLASS TutorialImg&] -[s4; #define IMAGEFILE &] -[s4; #include &] -[s4; &] -[s4; struct MyAppWindow : TopWindow `{&] -[s4; -|MenuBar menu;&] -[s4; [* -|ToolBar tool;]&] -[s4; &] -[s4; -|void MenuFn() `{&] -[s4; -|-|PromptOK(`"Fn activated!`");&] -[s4; -|`}&] -[s4; &] -[s4; -|void BarFn() `{&] -[s4; -|-|PromptOK(`"Fn2 activated!`");&] -[s4; -|`}&] -[s4; -|&] -[s4; -|void Exit() `{&] -[s4; -|-|if(PromptOKCancel(`"Exit MyApp?`"))&] -[s4; -|-|-|Break();&] -[s4; -|`}&] -[s4; &] -[s4; -|void SubBar(Bar`& bar) `{&] -[s4; -|-|bar.AddMenu(`"Function`", TutorialImg`::Fn(), THISBACK(MenuFn));&] -[s4; [* -|-|bar.Add(TutorialImg`::Fn2(), THISBACK(BarFn));]&] -[s4; [* -|-|bar.Add(`"Exit`", TutorialImg`::Exit(), THISBACK(Exit));]&] -[s4; -|`}&] -[s4; &] -[s4; -|void MainMenu(Bar`& bar) `{&] -[s4; -|-|bar.Add(`"Menu`", THISBACK(SubBar));&] -[s4; -|`}&] -[s4; &] -[s4; -|typedef MyAppWindow CLASSNAME;&] -[s4; &] -[s4; -|MyAppWindow() `{&] -[s4; -|-|Title(`"My application with bars`").Sizeable();&] -[s4; -|-|AddFrame(menu);&] -[s4; [* -|-|AddFrame(tool);]&] -[s4; -|-|menu.Set(THISBACK(MainMenu));&] -[s4; [* -|-|tool.Set(THISBACK(SubBar));]&] -[s4; -|`}&] -[s4; `};&] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|MyAppWindow app;&] -[s4; -|app.Run();&] -[s4; `}&] -[s3; &] -[s3;= -@@image:1140&464 -݀흉Ԕחހу절Уɴɉ -̦ދڐֿ߷ւه -ʉؤҦ٤ԸӲ摊ֱי捑΀ -ݑͮ僊хߓ޵Ȑٟ݅څ󻓢˜ -Ў׼ݙѣݗȍ۠눏ˍ̀Ƞ흪āƁŭ -џƢׂ̪Ѥ۽Ô⾂۠Ɯ㶦ęڄ޽ -ţɣȬΗ¬ɭ֑Ҵ灢ꍓٰ傺˴識ﭶ -ՠѬבЃ뀙법̋Ȉځ̯ބ͹ӕֳ嗍 -઻݆㻓⒋Ո׹Ɣߐ剁 -敬ݹåн׸Ϟլܻ -♆۫Ӕܕ˟ȗ΄ꓲÁʐ圐Ҧ݉ҧނ -誱Ӛ捃ܲٻËݞڵл -տߔڐɭ®Ćȡճߨ̄ն -≫ݟۆۊ烮ԯтҖƧȗޛȊ܅ -̮כśӰѼﰎ쬶ǘðޘ֗ڭּ׳ -ũʵɊҫȝՓݚࡩփӯІשǺˎ־ҭє -ʗլޓˋìפƮ՛݅ϔ냷ˢ쮿ۡ凄ݬ -ݽ󣥾ũዅˡˣ䮮՞Е -ױª١ˍߵϔߟ׉ɦ瘺ܖ϶ -ġաɩ빜ǚ̩їɂ视 -ٻʹ䬃ߩϴҏ庯LJݳ䂸źшՈ -ֽݍ׍ܬީѲɋߧڠմ݅膍궮Ƭ -ō×ܽۮțºԃ鑳ꪰ☕Ƌʶث -璞⬤ӛ͑囙܍ɇܼ콵 -ރż®喒詪Ҕ勃ꒆפ޸ßӹĚՐ -룪埙ȭ˳ʿſâˣﺧ -ӯۘ期ɬͿӜĥ -ݍẐĒŁ똃댋樷ė -ȬݭԛԚߟЦ񢤪ƫƨȤÕܜ蔁Ո -˛۸ -θœƞ봖ϸ͖ܺ -ᕦǰړɵ䐜잤ĻԐůʚ -㇟ƄˉɻƄڰʞ쑶􏒎ߏ -כō䄵񚲸ƞجѝ޸ -˻ږҘƒ—ˆ㔯ũ¤Уˆ -珬ף⼥Řꊖɵꖏ؝ -ܾɡƋ̵⚟ҜË؜Ҙ⬜ټ񉼶Ǵї -蔻ďɉ׬ܳ⒵ඪ麀ြοӥкƒܵ -Ը׹Ê߄﵏ۊЬώߐۏ -񱒇ǝȯ߈ʈ̈́ߜȭýְڻܰÎ -ކټӚҌΕص٤ǵʵܽ슶ԯո -䪌ݰԏͼ鰭ֳҭʼ밄 -œۋ˾Ᏸ򐝺ִҵ͸Ҏ؈ͧ -ł‚蘧׼۷ɩ׮Ǝِ -퉵󧉨劈ղɛϕ澥ӟ쬻묪ɝ -֡ѫѲׅ߼ǥƶާ궦ŒӘ -洖öހ֎󘙦ŋꤥĊ㶎܄˞ʗɄָ -ۡؕ뀍ཅӘȲέÈʮ瓟ݝ·΄鄼ܑ -͑ܒڼޝړ𺌺Ш𺹧蘷׃ϓߨܱջΏؖ -ɂ쬾ЊЧ񿤥ܕɚٚ͏Οˋˌˆ -݉ߑ⹞ոՑݶڙ誸޸ -措і̆쨫ܛơ揸⩛դ˷ŗ -֕„㷰򴓏ܢĝݼϜԈг -䮝̡ôߗńթν̛⍆Ō -ņ޹ǡ믊ͬξט񝍤腁얜 -؟ȀĠړν܇Հբɒߕʤ -¨ݧŀֵĴ󶻛َ݁ܵʙ㝜 -뀗ϗ̾ڝ񪘹āƵřݥ܎ߢҜ -Րٱˡͫé׭ޅ늣ձĨǑ訫 -֥߶ؽ겪똡Фϟ礀ѨɺՊØ -݇ةΊ⤴ઝќ۰Ѩ܅ՠǽ֊ -ۨ껛ݵ⯩ͰŖҬ␫эשŽׅשݏ -ˮՎ⇵ʱƷՁɄ身ՁԺՊź誕ѻúݥջ -߇ؓڟ̽޺׬էר -߄살ᡸՊۚՊۥة燺ڕ߳Ҝ -ݷҽМږߥՊ -ן؁׀ڿө򌪐ۈج䉎ޮϛզźݿ -۵؁Ǖҧ蘒⋛™صᑻٳ -Ԏ迧Ʀ閨 -&] -[s3;= &] -[s2; 12. StatusBar and decorative Frames&] -[s3; To improve the visual aspect of the application, we will add -some decorative Frames `- those are frames that do not represent -any action, just draw some kind of border at given frame level. -We will also add the [* StatusBar] and connect it to the menu and -toolbar `- this way it will start displaying descriptions placed -to Bar items using a Help method. Note that decorative frame -functions ([* TopSeparatorFrame] and [* InsetFrame] here) usually -return a reference to single global object, as there are no changing -properties required when using them with different windows and -widgets concurrently.&] -[s3; &] -[s4; #include &] -[s4; &] -[s4; #define IMAGECLASS TutorialImg&] -[s4; #define IMAGEFILE &] -[s4; #include &] -[s4; &] -[s4; struct MyAppWindow : TopWindow `{&] -[s4; -|MenuBar menu;&] -[s4; -|ToolBar tool;&] -[s4; -|StatusBar status;&] -[s4; &] -[s4; -|void MenuFn() `{&] -[s4; -|-|PromptOK(`"Fn activated!`");&] -[s4; -|`}&] -[s4; &] -[s4; -|void BarFn() `{&] -[s4; -|-|PromptOK(`"Fn2 activated!`");&] -[s4; -|`}&] -[s4; -|&] -[s4; -|void Exit() `{&] -[s4; -|-|if(PromptOKCancel(`"Exit MyApp?`"))&] -[s4; -|-|-|Break();&] -[s4; -|`}&] -[s4; &] -[s4; -|void SubBar(Bar`& bar) `{&] -[s4; -|-|bar.AddMenu(`"Function`", TutorialImg`::Fn(), THISBACK(MenuFn))&] -[s4; [* -|-| .Help(`"This invokes MenuFn method of tutorial example`");]&] -[s4; -|-|bar.Add(TutorialImg`::Fn2(), THISBACK(BarFn))&] -[s4; [* -|-| .Help(`"This invokes BarFn method of tutorial example`");]&] -[s4; -|-|bar.Add(`"Exit`", TutorialImg`::Exit(), THISBACK(Exit));&] -[s4; -|`}&] -[s4; &] -[s4; -|void MainMenu(Bar`& bar) `{&] -[s4; -|-|bar.Add(`"Menu`", THISBACK(SubBar));&] -[s4; -|`}&] -[s4; &] -[s4; -|typedef MyAppWindow CLASSNAME;&] -[s4; &] -[s4; -|MyAppWindow() `{&] -[s4; -|-|Title(`"My application with bars`").Sizeable();&] -[s4; -|-|AddFrame(menu);&] -[s4; [* -|-|AddFrame(TopSeparatorFrame());]&] -[s4; -|-|AddFrame(tool);&] -[s4; [* -|-|AddFrame(status);]&] -[s4; [* -|-|AddFrame(InsetFrame());]&] -[s4; -|-|menu.Set(THISBACK(MainMenu));&] -[s4; [* -|-|menu.WhenHelp `= status;]&] -[s4; -|-|tool.Set(THISBACK(SubBar));&] -[s4; [* -|-|tool.WhenHelp `= status;]&] -[s4; -|`}&] -[s4; `};&] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|MyAppWindow app;&] -[s4; -|app.Run();&] -[s4; `}&] -[s3; &] -[s3;= -@@image:1084&724 -ـǜ흋ٮᫌ҃洛Łʹ˺实־뫌 -ɩח撲ϞΜ൘ߺϾο޿왳 -ŕ̘ƑƼ粴ֲ̤՚Ƌ䘵ÿڶŦ -苳˚ޗߴۺ̉ -֊Ϊ转অ􂠣ܗԨџخ -ł܂יãēɨׁ̒ߨྫ۾ͤ近՚ѹٓ֠ -캯ؙ̼Ͷ쐂԰γŌƞឫ -詁ًɒ݇֓׫ꀦ΀晉̭םɏ -߶ñޕΟꝰ҉̵֬۳Խ񕁨¬Ͽ -Һʕܥ¥ﱙ٤̋Łԋ -֎쐋늺蓑ᝑ쬫٦ϛ̙Ȏŏַ -ѹռɄȢՎő׾˛Ӻ -Խˋ벞̫Ҍ˓賦ҽËؚƟԨȦţ -ꘑŧ叏֦ع۞ڸʲ̯䃍Ǖͷøɰ -ĴοӑБ˨ʡѯ͆٠ -˫˦֌ӊ㓉Όͬ嗶޴ѽΑ𯈪ȫڑ -ʰȉׯϋŘ҃׍佚㳜 -يÈռíϯؠˊ˱ǻĂتԽ -ϛ͚ũԄ⼓쟍Ö溪‘ѕ܉ -ͺ짙ՅԉšλȹكȫȎòƯȿ -Ŭю琎ψѥ̯đʂёձЬʯ糰፮빞͘ѷ -줧ϗпؔ֔야撽؇̰ކً婬 -܈՜٤Ź萸ݧҫǬӫÊNJܕ𐶐χӭ -ܛĚ̙񜰭ݞ봳ޯŕۏ٧­ꛚɯ -ƚہދŽؠݢŲ񙼝 -сܿþבېճ⿭ۨϸ -쥻ƁŐª㐗ӱ߷Ծů -봍韺偽ϯ鎉߆Μ굸ጣ -۸Ǜ쮖绥Ӟę篘լꉙƛȲʷÒ -Ɍ뒡әȞij׿׺ -ᔍ캝ߵך؊좕Ԣÿן㥖 -،ݵ켶μڝΒׇ̽ۆ -둧ֹ趑ωЛڥ匙Ց􉯃ɴΌӑ -⯑ž爱곇㿯毽̆邏ݫ -ᜲִѩ٥Ѭѭ۾։ͺʅɛێޔЧЁ -ԇΒ䧨ʞп񥙠Ų둩ƚՙٸǗŴʈË -﵊Ѡע⢛菚ۭω׌鍟ƘƖکͧҜ -ʷМȡ˳ͧà˘߂חʾճߩɜ -ؑزݸ֡NJ܏Մё̢󷤛 -݂Х巁䗌Ü忮֝ -ӦਫÅ존β؞أʹÁ -ĕ֧֨Ɇ󦙖ęɜƟӸ﫜°֕ -َĠ묎؋߂Ȼʎޭ枡܏ғ -ކ贪ҵҳ▲ߞܺļܢېɨ -ԧα覗ߵڍͳЫζ䗵뽑׸󨓷ۘ񾛔 -ë挅ᯝ̼̞̎ҭ䌀ȊŀԌٵ -㍾ĺĂ盃ַ䷃풐ٓԾڟʥ -Էޛ֝գγåؚث؉ک色Ӹ瓺 -ш̭͉ظΡݖֱҿҟΐƥڸܴ -ʆߘȴîڇб쿤泪âňȭ -ը⑄åҊɃ̹Ϳ -ϰÑڈЄդñឡêՂ󻜼ܺȐӑϸ -α򣇔ĎߟǥݯőýߗЄяс -데拹΂䖘ԋ߻ԡ蟤ݭܛ -ۗûຐÃժ֧ؕdž™ۈꍶݲڬ -ů≿ݕշÿܫǏ鄥م -̬너酄ˡ⣎ʾԂ珆䗆⺬ܥ -ňѺ́ʜ͔،̄ճө膂󠮆 -ɻ޲˽ք檫狐鿛ʑш۠šǨ -ģŵꥪυῡ󊈛裊ԱӞӓՌђјᕂ갫 -Ūĕܢ⫦ԑўё޸ԑʼnԑ -΀╅׬貮Юݡ؏Ռ -Ӑ툨Ŏց޹ŧƆ -Ͽގ׻Ɗ݁֎Ȫ鳭࣌ӣ׫ȫ՚ƽ -ߟҞڑǝ˪͊ѸŒ҅Ü -řҞŵō犨Ӫؾ۵Ա఑ -Քƚ롪ǡЎŏǗȌԂᆏڽ׫שꤠ -ґͩҝݺЀńƻޡ̆ʘ﷬ݹ˞ݝ -畽ԔƠȴ׶בŝٶʹԄŞ -ẪإꞐԑ񳊎힜ص褣ƅĕčéކ覠ұԄ -ōԑݧ≁Õ㪈ꤠבۣəϐ -톮֘ۼ拦騘᐀ -郪ƒܨ軕жěڢшͪȃԑ񃅨ΣΨŤ -ļ訄ԑшͪɌ֜ѸՌĕĴ -㧊ԦōĴ˖Ư׽ީԻϠέ -Α˖媊ו眏ŗĕヷʦ脵ۥ֡– -ƪ̩둕ӗޡըĨȨ¦ϱէŭ -˯圭э؈敧Ŷ㍗¾ͱʥۧʟݑȽ -ᱭѪʃƱʥѩ艨̿ۨ瘕իޟֻؔꕹ -ۈ݉ʙ߅ՔѪ˦ݲɝӶЏԑш -Ťޟ߫𩯫֣❰Ɇ®؄ռ򝩥ݞɷ唓 -ڒҒܽƸȻȶ銗ʣ߰㋲޲ -ו׀ᗬǔ퍦ջ܌Ōځۀ - -&] -[s3; &] -[s2; 13. Adding child Ctrls `- widgets, reacting to widget events&] -[s3; If you need to use some predefined child Ctrl (widget), place -as variable somewhere, usually as member variable of your window -or dialog class and use [* Add] (or [* operator <<]) to put it to -your window.&] -[s4; &] -[s4; #include &] -[s4; &] -[s4; struct MyAppWindow : TopWindow `{&] -[s4; -|[* Button button;]&] -[s4; -|&] -[s4; -|void Click() `{ PromptOK(`"You have clicked the button!`"); -`}&] -[s4; &] -[s4; -|typedef MyAppWindow CLASSNAME;&] -[s4; &] -[s4; -|MyAppWindow() `{&] -[s4; -|-|Title(`"My application with button`");&] -[s4; -|-|[* Add(button.LeftPos(10, 100).TopPos(10, 30));]&] -[s4; -|-|button.SetLabel(`"Click me!`");&] -[s4; -|-|[* button <<`= THISBACK(Click);]&] -[s4; -|`}&] -[s4; `};&] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|MyAppWindow app;&] -[s4; -|app.Run();&] -[s4; `}&] -[s4; &] -[s3; Position within parent view is given in logical coordinates -(e.g. [* LeftPos] or [* TopPos]) that allow no`-nonsense resizing -of dialog. Widget events (like `"button pushed`") are reflected -by its callbacks. There exists a `"default`" [* WhenAction] callback -in each widget that is usually invoked for `"user changed a value -or a state of widget`" situation. You can assign this callback -either as&] -[s4; &] -[s4; widget.[* WhenAction] `= ....&] -[s4; &] -[s3; or use equivalent operator version to save some typing&] -[s4; &] -[s4; widget [* <<`=] ....&] -[s4; &] -[s3; Note also that to make the code more clear and less verbose, -U`+`+ uses `"method chaining`" technique, where methods (usually -those that affect appearance, position or behaviour of widgets -`- `"modifiers`" in U`+`+ lingo) are designed to return a reference -to `*this `- that should explain the line&] -[s4; &] -[s4; Add(button.LeftPos(10, 100).TopPos(10, 30));&] -[s4; &] -[s3;= -@@image:2449&1489 -ꁪ݉ѹ̽⻌踮è׌׬…ۡ㔥֊메 -˺ภǑᐂɚمιŞ򒖴 -׎ƝӤ҇算ҊҺڹ҄ċْ̓ -̊ϕՀ儢ՆȔӔ劳쌜¼ -⌀͜딋♶ǯʫ똥٬ͳըէ❻삒ܢㇾ -豄եΎۻ뽤䎀ıǓ籧ཅЄЏڲ -ե«؇̲کȜ鋎ΊϽҎէÀ긧 -֐µŵյϑܳͪã޿ݽ霭и -͸ޕܥִԔپυ -ТÏǜֻҼݶɐ쩷ʾڳӗыȎ -ܘˊ椹儧ӊӺᇬ腚Ӑθۇڴ -϶ӭܼμףㆻӚݓ۪ޘãܹ歧Ιʿϋ -Ŷ١ۦ޺ݟ½ǽ҂𝩶ؽ͙ -ʯܼҳ懞Κ񋇅 -މ巧͝͡ǯ诱ѻߖެ컢 -ۦŧǭḹᆥ˷Ӳ慭“ͥӻ䎟Ͷ -ãǝ̨ܹ֖߂Ҋغ -܈Džߜٔ½ѽߣєއݴΞѲijԗ -΄ϼفݚԻꚏѽג͑򓽸춿ހףܱ׽ -ªݘƞ֯ݗ֛ۦԯ -۳Ȋݍ뽁׎띳˹̾̉î֘鲛ϱԻ -ў˻͓֦Džƪ궝΀γׯϢÛ減 -́ǩ۔҂图Ѥˠ۬ӡѸܸ -àž޶ݒޒ٤뚟ʞ֐ջú -ﺩº޴홝󹗷αɯلȜ -Ϲʖ¸ᅺ잠ė닫ːөήËݡܺ -ĭ덣ҳϬ䖢ɚ -ۿŴޤپϣΰĥ㎳ǟЁ -ƙ͉۔婗ờݞŦ뾍Ա眎޶ -Ŵ̆࿭پͻƯ޿ゃЬ -ޥŖŃڢظݹݶ冲ǧߧǥ -⛢ׇ쌌ɝӴɨͦӜⱗ -ㄏޅؾ᧱ЦܪݦדҊطή歫ݥم˿ -䄏ԛƫۚٓĦύ˗›ڲ玏͙ҡ -ӫٽźөڠ演Լݗڦ -ט徠Ӂۮ֝곫ݧ󋑯ٳί -ƥֹӄǹߡ㔁ӛӟڷ֝򁾓Γޱ -ț۷碗ƺ͓ﶯՆ֖Ƨ -Ȗשּ×ܔ۫ɦΨӳܓŖ -Ɯނ孻ڐ鍢ӝǏڴ볧įɍڲ﨔Ҫ -ܨڼޟݾ󃢾򙞶ӌӽÅř摆ʖ -Պ˱ް³ܜ܊ܸ̒Ŧ֮ɍٔĦɦ -⒝ͣťʼκÓúѳᝇǞЧю -܌Ē腹ִýиǮԃݞ -׽׼Ӊն򪗄ƁڏԹّ搱“ -ܩ䍓̝ԪԿШîƓͮ҂ -۩̍ٸɳ͚ѹٜ񱃛옞ȩӆѰ -ܻϷ곭ׄƦȯ躦貼߈DŽୟؔ -ߴХʡޑ楯򙸱Ƽ͘Վ౟ -ߞŠع鹲ǜڠħ -ĜջҾĦϼЪ喟΃돇埜ٴӗ߻ -؇ϩ᳜ꍀД塀 Тԛ -½ТԛҤǎΡݢڶ -ᷠز޹ϐ߲Һɷߟܐʌꞡׯ׍þݔ -ͥ׍ÑݷôАˍӺꍀ҇ὁ -ڵԛԀ½ʕ˥ꍀǰޗԛΧयὁć쿦 -֠ހ頸ϼǤٜ狊ֻΆ͠ϕҀ -烥㇧먒ũՊϋʇ┬ٳ -جšހ頸٤Ñϲހ嶴μϕ -½ֻ䀇иМԛཫꍀӿꍀӰޮԛϖ -Ѕ֞ڽҹꍀҤٲ̀АزټÏӲ -ݔׯȗԘӽ޶ʻի݀כЗهݹȷ -Ĩˑ葩ꍀŨހڄ葩ꍀŨހڄꍀŨޭ뵿 -ӳЪďی҅ޱֲŵƆٰڪȯ -Ëԓޥϰן֕ŵݱ氏̮𲯯ލ -ʹ®±쑉ޘ򉽑ׅữõ֏ߕ腀߿у -؅ڄܢډꭒЫϴ֓ν -٪Ⱥ߄㒿ۆн㹞 -͎Ŀʷ˅Ȁןهگ􃀁ĥώୀ憟缊 -յգﵩ͞ԋāƒٶ -⃪Έմٝ嬾׿褒ןڄ擀 -Ӈᖭ̛̼ٿʇϣؿӹ -ãǞӽַآś׶ҟ𝅾ɋ -ԯťՉ󫦇ƏϢؔľƠյ -٭½ՠ뫛볯ϴՍ꿅Ճљ嵙ͭޜ -쉕ӃԦត걏ޝϼ胪 -̏׉ýޟ묷⥺ެ濩֦ݚ遦͡ńƠƠ -߰ˇýӖٽٍփͭ޾ދڽ뙅߭ -ʌҾ䅚̿Dz뽟 -׽ݣճÊ璧ɚijݰϷϿ -ďŠݏ޿黓󴃗݅󍦾㦨׶ְي -ޏضĖąɄǚ棰ַɿӾ՛μ -śݬ׾½ˢ􅼟̜ۜϤ⚸ -Іσڟ硒ٶ￝ۍij߇ -ꐞȑ鳆𣻋Ⳡ޽ݥ¬ׄ -ߣ󡣽Ҁ˄ˡݽʾڬÛɢݽ -اۢЬߏՏ쯕րØѳִ䁕 -АƁ㕟黬ޞϕя鵬 -̥ϮޢӛЙ͋糮ƛ˞֫帶ףӘ -ޮ֋ﵴٿ͢îǽƹ역좀 -П˴ɟԵܼ޸Ͻջ扫 -ۍ؏ڌýߑŝۖȅμǡ -ϿͿƾֱݶǘӟ폱އʂ֑ -Ũ߽ƾլ±ؙ昽ژۚыާ -ڔľȚϞ֚Ǽ܉Ï -׹喃փ凡ϖԍɠʺЗ -̤،Ⱥˉ׷𖀧džгǷ -׫ƼՙǼݕ՛Úƽަۤ -ĉŔ׽ߑڥѲΙԖɫǬƿڿī؏՛鐎 -ݱٍ⾘ԗݫߩ皑񜱏ع㏕ -ϫݏձ礌닕߶Օӏ֓ꪖ -Яҁч𳼉ޘŻ恏Վݺӿֿ -ͷ홉ۍ仺׳ĉղ︥ߝϽ -Ŀ۝̿ﻍٞбȜƞϛ갩 -тܝ㡃ǻΣ -ﳭޱۍテﳱ跉ɋƧ߮৯ -޺ٝۼ諭ЗǎΩ۽ý -ҲΓ܆ܐѫ֨ǧݬ߼аꭆ -୕ޡåꆹי𿫤̗ -Ԛɥۆ밇شıǥΞκ -򻺖ތ˽ǯ瞫бԵ׃ޖ -ὼ隳瓺ݹċﵠҠ -ݶ۳﹘ﵠހ۠긫ԛێۍڷﵴ -ЈꍨԪς﯀ﵘ՝݁ШێۍŴ -뷟ێۍێۍͅ睮ﺝٖۨ -ܯڭŽʽνݤۡý뗖Ĵʎ͗ꭇ -źޞċϿ聞馧͔ꭇꭦٽ -딧؜ܞ˥ێۍگǭƵ -֝΀ֿׄ멃꭭彼ͪ೦ٜю -͠īˆۻħ⍕ٯֻҦͪ͐ꭥ䎯凑ʺ -הƒȓꭇꭆ߷ޞẼٳƺͺ̗ -ƥ׃Ǡۍ׻嫺ݭݽԛͺëʳ -ۍ˹ݼϽ솠ޠꭆ័ۭ携 -ѓ퓶קּކײݳ鎇חٶߨƒ󥮮˩ -޶Фת݀ýՠ󿑷ؘйᅄ懯ߏа߬ -ƺﵨ訵̹РﵨѦȃꭇꕭ޵žג -ۍǽﰹܚ׿½Ճւ긕ۡ -ШҎۍ﹘ﵠހқǽՀȁˁچ -փꍠꬭꭆԛێꍨﵳހҠӠՀȡ -׎ꭢԛҎۍߩփꍠꭇꭆԛێۍڷ -ڠހǽՀȷ߷ķϠ喃փ -ό߀ɮϠݢسӿϟޗێ -ۍγ퇟ýՀ鎸ͺ귰 -èѽнۢݒƍ뾆햸Ǯ -΀փ햸ׯу迚ƽ½Հ˗Ǵ҄ﵠ -⭲ħٯۢ팱ϡݒіدփ햸ծ섯 -دۢێۍۥꭆۭ񽫫ʢ俚 -ﵠԜɏ½Цþ횸ӹ۾گݒ -ﵛ࿕ݒ׻ޟ˄ -ˁ׻៾䅛ﵳѽΒꭇꭆ -οɛӺӈص𪥇ﵣۅ՛멦߽ -﹘ﵠб磇ȷۨߛփꍠꬭꭆԛێꍨ -ϡՀȭˁʗڀߵㅨǸӯŰ뗤 -䳷ċ՜ҝޟبۍӃ -֋Р½ʀТԛР½ʀТԛР½ʀТԛ -½ʀТԛР½ʀТԛР½ʀТԛР½ -ʀТԛР½ʀТԛР½ʀТԛР½ʀ -ԛР½ʀТԛР½ʀТԛР½ʀТԛ -½ʀТԛР½ʀТԛР½ʀТԛР½ -ʀТԛР½ʀТԛР½ʀТԛР½ͽ -竁ؼάٽ鐀ӈీí -&] -[s3; &] -[s2; 14. More about logical coordinates&] -[s3; Logical coordinates can align one or both sides of widget to -the side of parent view at specified distance(s) in both vertical -and horizontal direction. If only one side is aligned, logical -coordinate specifies the size. There is also specific kind of -logical coordinate the specifies the center position.&] -[s4; &] -[s4; #include &] -[s4; &] -[s4; struct MyAppWindow : TopWindow `{&] -[s4; -|Button lt, rt, lb, rb, lv, ht, hv, cb, rc;&] -[s4; &] -[s4; -|typedef MyAppWindow CLASSNAME;&] -[s4; &] -[s4; -|MyAppWindow() `{&] -[s4; -|-|Title(`"My application with button`").Sizeable();&] -[s4; -|-|`*this&] -[s4; [* -|-|-|<< lt.SetLabel(`"left`-top`").LeftPos(10, 100).TopPos(10, -20)]&] -[s4; [* -|-|-|<< rt.SetLabel(`"right`-top`").RightPos(10, 100).TopPos(10, -20)]&] -[s4; [* -|-|-|<< lb.SetLabel(`"left`-bottom`").LeftPos(10, 100).BottomPos(10, -20)]&] -[s4; [* -|-|-|<< rb.SetLabel(`"right`-bottom`").RightPos(10, 100).BottomPos(10, -20)]&] -[s4; [* -|-|-|<< lv.SetLabel(`"left`-vsize`").LeftPos(10, 100).VSizePos(40, -40)]&] -[s4; [* -|-|-|<< ht.SetLabel(`"hsize`-pos`").HSizePos(120, 120).TopPos(10, -20)]&] -[s4; [* -|-|-|<< hv.SetLabel(`"hsize`-vsize`").HSizePos(120, 120).VSizePos(40, -40)]&] -[s4; [* -|-|-|<< cb.SetLabel(`"hcenter`-bottom`").HCenterPos(90).BottomPos(10, -20)]&] -[s4; [* -|-|-|<< rc.SetLabel(`"right`-vcenter`").RightPos(10, 100).VCenterPos(40)]&] -[s4; -|-|;&] -[s4; -|`}&] -[s4; `};&] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|MyAppWindow app;&] -[s4; -|app.Run();&] -[s4; `}&] -[s4; &] -[s4; &] -[s3;= -@@image:2444&829 -遦ǜ흋գǧКڿ -냟أмށĄ̦睝ΜΙ˻ -ɚƔƖԓʄžֈၯʢڙ܉õٜϠ« -ᴛ۶飫ܱק筿׳ׯɹں䌋πʮ -턎񜙎ȐӖҾ힎۝եϹۆͯΑǺʝ -Т⢒ɹ˜ʪܶ䕊ͭɋϧ馳ϼڊ“Ӟ -ϓ̕ɋ΃ڗԧϭʄ̸νɫӪؒڨȩƜ -ҏƞ„񰰭Ԥحϐ΄Ɩʼ -쒺Ɇߗ٧̜呞ن鐨֋ -ߝӥᬨ׬氧Аប -żϓۙ۴ۙ׀ęրͥǪԿ -ϼϞ鞪ץݵާ̷˞ܢ -іםσГ췢ݾՓިԮڎŕϭ߾ -ٞ۷ַ߲튉ŒЈ -멮ٷ۵竕ϭ桱Ӌϥʗ瞽ʀ -㶟݄ջ߬靤晣ݾɴ붬 -矩쾺Żςςӆ׮ֻ뫾〃݀ۻ -խ҆އ䗺Ϙٔ𾛵ߚٺΡپ՝ -ٰϊӞ߄Ѵώԟ̈́ȂȀ΃ĺ˗ -峏ܳߦܰ릔ၠ󂏴ٷljܺҺ -ԺǷѥٹݥء֡ڎ֐ -ėϜٞ޶߾Ҭ웏̺ӣ߻ٷفäԻϮ -괻ҮҘ׽ХЯ놝ŔŬֻރހƛ -ŬܶչʳޑۋݭϫӼþɺ -ݟӼ۽Ğ·ьόξӸ㋤ -͟Պ̞牴Ě˝ҼҤ昁ޙ -۫ķҩ˸﾿ׯٸ˲ߨᔸڝ -ׄם鳫تֶ̜ꗆܑ -ּ巏ӥ񧷲׼ߧׯ̲⍲۞ӻ -篽ƶˍ⛥ш፼ԡԭܱȥԎߪ퀜ٕ͙ -۷ѩǦѷ꽓̸ΕϝեБěݟݭ̸ -ܗܜݝ嫙ĮȹωΟە -߷ź㠴Çǃ̼ܰܵ٬ -ۊ҉ኍׅ㄀οϳ׻̖ -އ٬ɺۭﲹ៿̯ -Ӳ˽ُғٶΙՒϾŎʏϝ -ňظܽߍƐ̾Ǜ럥䞽ȴ˦Ŕӹ -ڿ̹ƬӪ̺紀쮠̩ěǮ -߈醺ӼޚÄŽȆɣۍƒ -ĀϬ߬ٗӵ墖ͽ޷ř -䀒ﬨѯ˖޿졽÷ʹÊӺɯ -ꬒϾϪԨڈՒ޻܅ԍ殸¶׸Պ -孹̱҅͂ܳ̿򅣼ͺ򑗗 -붛Ҙݻߗ֝ûܶ◡̿ɖز̽ǐ -忑ۗƱ뾎לʝ -ݹʢ͠˙쯕ߋЩ¶ -ܡ䟅־ӆݑǔϝޤݻ렯ڟ֥ -ߡ݄叹쟣ÓӜźϬ¾ -ԁ؉þɢȴϙ۠蝔̴슸՛ƾҸϡ댗 -ljŭԞ۩֕ԏ繤ەƐ𘢟ݒֶ -޺ƺﰧޟϹʑ͹ܗĬܩěݿޫڷ֝ -ł𝦀ѕњӁ񄚸р˾Ź妹 -՞̿襄ٷ޺М謿ɺ -ϗƴ頪خΜݽԣߘߕã凇 -ỻϽޜۮ¦فÉ⑩ܦ -޹Շߟ˷ֿߋ߻鼭ϻʶ߿녭î -ػ͗ϑԋ˾ -ˬ̭Śʑڟՠǃخ켂ϕԠФ͟ -IJܵɷȬޤߖ矝ߝϔ򱇗ߢֱڅƘ -ጬފѺ֝ᙘɎԂ -̀ϝް݀ई݀ฒ݀݅֍ˏ݀ -݀ฒ݀݀֕ݹ투ͰݙГܓƬʦ򖼳 -بԢƒǾҧٷǩǿׁ̿񦹑ې؁ -ə퓺ߥ҄𡄈ުֺ릹՝ϢɄĈ -ϚǂĈĿҺěį -ЯLJڝԴߠۍղ퍎́Еŧƺϝℇк٦ -͕ƸѓʀǬᯇăƺă񩞒؂ޥǯ -՟뎭ڈ’ύ؁𥴈˞ɚݠƿ -뜖٧ղ͏ɓ渒ג̦êì -ғ̺Їɀͺܚײ꩏ꥩ -ЇҭˉƸ‡ƕÖěĪ˸ݞ -Јљ֎̐əͿ׮Ӣ񴒮㼢ԋ -ə¤Ŏ݅ٻɫĈƽջڴΚ -Ϛ‚񈍝õ݄煳 -ѓƞٷ۔Ȁݤ݀ฌ֍ -݀ˎؾϧΡҮҲɐ藼 -笘۞Г藒ܾגߡ߱˻ѓڿ -Œó򛻴Փ‚֑𠎖ѬۘӆШ盆˜ -لބ㑬˞ձКķ̠ -㑪پ܄ݶ藼ҏձ߁ӷݍ -㳺Ķįֽ̠ɬ豽߄񃁰Ǘ쀊ղ -ۡƭ۽ʆʶכѫۛ -ƺςܡ񥧳ۺ˜ݧւܡ -񥧓鮖ɶФݔ㕂ٚۜ׸įōۅ -ȗƃ͋ٴƴɘ‶׉Ώٿǃƺ؅ʶ񷆃ƚ -ѫܕℇۦÕнݖݖ鄎Ýѝɣݕ -ڣُʫ࿋֥ʍɆݖ֞Ч窏Өؽ֚ν -ןҾݚnj˧ւղ́ܧԅ겙՗х -̟ݧڢ罩؅䘳ƛΒͨ܊νҤ -ܪҬ֞ɱѕҦϚհ˗ -կܡҿꔳو݀ͪǴ׻鰩ئꅫɨï -鶓ϳϴʰʌ箁ꌀ -ƺ޷ݾ򲠈Ɉݍƺέ݃ -ݞ׶ضط稸ѓʥǀàی -ٷħ蕇ݥղʆܻ -۔Ǐϊ􁰃رﮂρ崭۳ -ڴߦ޸񦍹į̠ȺﷶԒէ -֤ơʴ뾸ﻴįྀ̠ݺטҏ߇πѣ -۷т㍂̺ت؎ݸȀ苞؅ -غ؅кǀ -ʜ뮬؝ϧ܄Ρȅသߜȥ˞ԭġ -۝ڌٷҏǥ׼󂗊Ā菺̺ϧ -󻏵遘ȇ֯Ҽ񋐦ڴĀ菚ޒ -ʰٛٍÖʲ롚ՆҺݗ˞ʭŒֈʁ -Ḇݧϙג߲Ցᬐ۔αǡ񞒛뾖ְԕׄ٦ -תç˝թՎĠݎـɕ͚ݵǧ묜 -תΕϧΔұվ֝끮ᘺݚǟђƌ -˫ԇˣ䪔ʁƱܩՕСЇиʑ֕ƶը뤮 -汨ƾǷ綌ωƌ߫ԇ˗Јثݽ -̎͌˗׶貹㡵냁՛ʔĠѧଓ⠈ -Đ꽐ھбԋᏝҳʏґڇۇ׏‚㝳 -ƻæįҁݩ搡¹󂅗Āآ -˺Ӊ痓ǡҤ䡕ڌٷӆ铻৊𰀱ڃƅ -؈̀؈̜к -ܽ﯅۝߾í¾Ѫذ±ꬫ -֤кβ͟׾¬٣ꦌ؝ᝬ֧퉌ルͲ -ٚ벡̪¹¢Ձ -&] -[s3;= -@@image:1640&1460 -ȁǜ흍ëꂢô℅³˭֑ -۩г沓ݙ̽ϳϽΞɼ -쎀̲ݽퟮ޵ɭϷ  -탊꧄ָԕэؔ̓߈ßǫ߱ᦶ͖Ѝ -ʿ؝Гۀླ횡ݿМ萤Ÿ -ЪԚשӠřרխ˭а΁ʎíɗ -ƣɷĐޏŀ鵬˛走ٻ؛ԅԀ -ɇϢ﫢ݔ⸅ޏΒɯȤ󪉳̲Ӣ -ߊڃцƑ瞍۷ʿ¯ƕĩֳņڝ -ȍ򚸅׺ɍߘϳڠ¿ϯĹ؛Ԝ߸ѣ -ϻ뮛Ą򜸻µࣳޞտ -͘ܗ譗蠨ͤոꍯǤ -ބёΣշּҹܛʹ -ɷ䁩ߏڝⷞŔް˿˪͊و˦޼׽ -ꩥ֬ӽǍ׮ضLJރŻ -ٷәԆۯّ˘骡̏輺㛻սϏ -ɕ¹͙ڰ׏Т赂ֽό -揁ƿ޾˼׉Džޣե -ū۲әϺ٣Ɯ¸Νݡƛݾҗϙח -ϸƵǶުϔüʵ -塛ݧܘẺĭϦϗؿǕ -ޏȡ位갽ԥꌐǁ䨰͇ -ͮίЈǷ΁Ăޝܾėɝ˗߰ -վ֋ԣ젉缄؎ˣ׳ܳÀ讟 -Қʄ릛찔ǭ󃋓ͽӧ쯥ڦ -οԸą޼՛ϣʕ룣Ͽ -Њн矖ݗȽ -򯹫ϏУ߾ބʷܐ -ϥ£ϭϾå -߸텦Ԋﵜ䌏ѦȒ݄ձ顕¿ -ݩΛե̽߱޼Ҽ։ʆݩ꧓ѐ -ƽ꣚Ͽݺ꽱׷ܚ -Șպ􈑃ϻֵӖ库뱸 -謚郪ӱ×ßȜб̨樧ξ块б킰Ӯ -Ǖ׼蠑Ͻܷɯ -ʹĮÆ亢գۮф윝ŭ -ϼ̗흿߿ګ֐͜ۇޖۣ߇ț -Ծװʼө׋۾ϐԅ߳ڎъ쬧 -形գАǐ䄍زи׷Ӫ鮝쬛ƛג -فュʇݼ雛ۯܧȵ -뚂󆾵БೞΕ݇鋣މЯĩ -׎澢Α¢壯ܪہ؝㦨ކ -Ƥة۽؊Ҟ׸­ݸɽ疎Ƞϭ -ӵ܄ǤݙǛה֮ݔ֞ȿ -ϜڂބÓٓ߆۞ҍ޿޳诌 -ĸϑԙюƩΕڔҁђʐ㔋𴒁 -ɟ뉃ʦନջ꥓̬ܜȪ늕ѯ -ξޭʔޞ˫٪ɋ -Ճ׹͘ըɋهƚш֛黧ՔܥĎ -ΩǷꜤŁ͍󊐦㔈Ǻ˾޶ݷƅ -䍮܄ܺƑψۯי -ϰЉُڠǬݰɗڜ׳挨ٛ -ց몶ͯûզ޴򚮗ѯէ۞ߛ -ޖځޱَ޶ÎοǸ෌὾ -Ƌӛ٣ˏ驛ޙڽԘҧќϼߪ뮽׾ -ֽ훹ߘ޹ۯΕ޸ڧ -ʱ͡ѓ嵾΃Ŀ߈ -Ѻߌ߄Րۨ™۴٭ؘ׼̯צՑڄ -Ҥ񡪄ۢɆ֧ק‚ -בМ͓Ϊ’㯇ۣ筫˘跶 -ՆƐԀԃƐڃƐԃƐԃƐԃƐËξ묒ۋ赂ؙ -̠ΟĴҙв飱׎ūքŭ혤ü -Ԯ偪뚧Ъɺ󚮲—ڍѕɎܱ㯃᪀屨 -柦⚗ͤ͗ܕٟцʪ˲ʢ -͚؟ΰ㲀۩Ƣđכ̛ԧߠ߫݌ -ƻӲ͑⌼ᛉߐ伽ܰNȌվڐ֫ -񥯍靷ԅΤ̑捧؅Ѥljּ -̆۟آڐ捇욣ڏʿˌƪܙÛ˯䀁ڶӂ -Ȳ̡Ǘȼȭ˷Β.ʓԁ⪎ܽ΋ӊ霁㱿 -ĴŕͰ.ԔĻӻÕӐŒȾ偪󓇖ӄԾ -ɞͬȲמØ۴ƒىݻ͛ -ڀсԈꍀ⤝ذߌã􏛫ɠĴҙ׀ɚ -ɘ鈪쵂ʂތޣޣꁘޣޣޣ걁ޣތޣ -Ⱥ˃Ɓ⚈ëҠޏ̆ᢂ䬶 -߽Ţ̃Ϥ۶ӷޛߵǸ -膢ޟߍ޲䷅ڤ˹ދ赱ˠמާϠƂ -ϣ˖頢鬖ۯȺɅ샑 -ȟʂޠȃԕ훵쎫ޟѾݎ -ӤގȃɒǸ„ߚ -򚤉ݛֆȃɒǸ„֡Ĕܙɢ׺˝ -ɒ쎫޷˖頢ɒߊïϞŘê -Ӥݛڂȃɒ菵Ǡ򥚤ېﰊ頽 -ɒ߫Ҍȃ͡򚤁ɒǟ􎫐޷ -頢„ٝ֡Ĕܙɢ׺˝ɒĘêȟ -ʂ޻ȃۯشɒΓĔꚺ -ȃᯛϠ̸݁˝ߗ؀ފ˙钤 -ê­ק頢„ߚʊΓɒޟ -êפȟʂ޻ȃӯ됦‚¯钤ʹƂ -쏘Ϛ낯֖ڧ噜Ơ§􎫒 -Ӝ깆؏ɢɕשϞ٭ʧɛƙįһԚϝ -˜׽릦ǘ̖Ø׽鴝Ҽֶ̖Ҹڂ -̖Ƙ„֧셫۽һԚ략ةᗹ -לă׽ƈ–ۗͳަ嘆˃ŵ٧ۻö뭶ǯ -תݐšνݵȼ܈Ǭתǒ׶ω˱ݰ҅Į -똭ӁХ׵ǫŁ뵗ժûבҰס՛֯㰷 -Ž밨Ɨޫ⭘߶͊ܵ©윹 -ϒ敂ާǫ߽ɛǃћӸ陿٠؝휮Ɂ棱ܕ -˱ա˼ׄŨѽ嬚ڴ̠Χ -ԇĮ۳ۍᄉƸҔ֤׎ٟ -ȂӨܢǭפ޴ס̸҈֖Л략؁刓 -㯼Ҩͣѩ̛ҨƘׅ̈́ -ƓҸ„ٳʏȡ݈ﵼהϩў˖ߢ妧 -Țخ۴ץؿ؋сԵȽ򽮪Ę -ذߌٛ鳍欜ȃ -ļɦՀȃɒǣ˯ݓê -Ĕ܎頽䴬ɒکΓ끏􉣬赱Ѹפ -һšفȃɒǠר򚤉ޚˑѸϹһ -šǘêہӤܴ݆ھӤ羕 -֡Ĕ̸„ߚʊΓɒʘΓ돉 -̛Ғšܴ݊ھӤɫ빳͒įӤɣ -ȃůʐﰊ頵݄һšߟң؅Ѹ -􎣫޳˜ê­NJʠɺһšᄉ -һš쫂݄һš„֡Ĕě񥎽ǘê¥ߕ -ê­頢ё¯ˣﰊ頢ޯ؅ѸȺބһ -šץš‹֡Ĕ„逝֡Ĕ -􎫐¥ׅﰊ頢Øêǭ̸ -͊ȃ˯뛵􎫐ץһš٢އ -ȃ˯فȃ˯„֡Ĕ⯈؅Ѹǵ̶ -Ӿɛ頢֬ػɺ͛暈ڨ뀵ֶ޼ȝ޶ -𪽵ʃɣ̑鯆ٚ皸̋ˊσʌ嵀Ѡ -望Ӹޣꈢ赂ڞ赂ֵ赂赂赂ߌӂ -Ň㯋۱֜Ϣﵴҿ֠ىۼͰМ茎¼ -Ӆծӗ̦谜ǥ¼끬ąՋݲѬܕ -鬖ѝܔڜڏܛ褎ʡ‘姘Ǘ -󺵵űɸ㸢ϒ̛Ѥύ쯖ӗ -¨܄Ɠˈ©ݒ׸ɴ蒆 -㿎뫬Μ㗜餺Ȓĸ̚돇ãƢכϷї -ٯ©սõԬدةɍñ -ܔʒұ曯ΖɸǕʒ雸ұؿ׼ -⪷ޛͯƮǞѪЎȸӏŪ׸Ӊ噡ɘӃƃӪ -˃եǏЙꗤƧ҇ѣԸ⊃􁧯ޥ߁𷇄կβ -ͣ𒔝נݐ痤茧щЦ͉󋒘ސ„ɽ넄ɽɽ -ޏƯʤس̻òȮߍޟ畞 -߉ϴӢֱαǻ蒝ЇӏՇڅ -ݵ󁋭𔷵ÝޜՇȚͭȊ - -&] -[s3;= &] -[s2; 15. Font`-zoomed logical coordinates&] -[s3; All distances in U`+`+ widgets are always in pixels. However, -to respond to platform setting of GUI font, there are `"font`-zoomed`" -logical coordinates. Such coordinates scale distances by the -ratio of current standard GUI font size to design font size (which -is fixed to the default Windows font):&] -[s4; &] -[s4; #include &] -[s4; &] -[s4; struct MyAppWindow : TopWindow `{&] -[s4; -|Button button;&] -[s4; &] -[s4; -|typedef MyAppWindow CLASSNAME;&] -[s4; &] -[s4; -|MyAppWindow() `{&] -[s4; -|-|Title(`"My application with font`-zoomed button`").Sizeable();&] -[s4; -|-|`*this << button.SetLabel(`"Button`").[* LeftPos][*@6 Z](10, 64).[* TopPos][*@6 Z](10, - 24);&] -[s4; -|`}&] -[s4; `};&] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|MyAppWindow app;&] -[s4; -|app.Run();&] -[s4; `}&] -[s4; &] -[s3;= -@@image:1640&509 -ȁ怀흉Дד쥘߶ЈѼċ򍈇⁒Ϝʦę -ڋو֯חࣘܳݯԓ -ߥĔԲӏ׳ȼȽ’ɅɴȈ⃫ -Ѻꥱݻ߫ĘŔ짾ġ栶ܳ԰М -Г΅ܤ΀내戂؆穞˕䫠 -Ƴ܃崁ʅ邆օݽݒ񨵔 -֯͛ޙ̲ǖ䊑ŎÄȩ梮妑㯰̅ҭ즐Š -•IJ’䣞ռՄ᠗̟Ŀȷڜ -ϷȲ±ŐϪБ ËЙ⓶䞸ĜɄ -Βޑ蠟ڣ摯ªל˼Ն͌ʏݜ -ɠҷՕռ޻ý֦ʎ׮Բñ°ȁǚя -޹˗ޢ͇礊̖݇ӣ·ۻᖚҾ -ͫ붦ׅխǧȘکǪꧾ˯ɈٍŔϯ̓﫜݇ -݄ͤ훙ݯּηٚڄ˴į嬤ˢҦDŽ -򗌼Ά¯ٰdzսΊљ̊njՋë -ՎЃϭ柖婍œ׉ʳ㫁ӝԻ땝ڽԭ -ѯӫ•؄Ȟاϝʕ𾁙ރ㭧 -ۡߗϗ溻ã箶Ե݈桖ޫ -붮ޢܽъӀȓɓפߋѳ݌귤׿ԗ -ֱ߄戇ۅݦ̰ -̨甄֬ЬωϞЦϘљ醿ؾΚ -믢鷪ШÝжạ̄셫кǬ㻔⛯ح̮ -ֲݰȓ鐤򾠲帏ះϐ趆δӼԪ -ȚȸﵨުЄΡջˉšŹ͇ͣЅ浍؉އ -˗۰ږԜ鐦ֲĚ뷊ʌ󤥗 -㼬ڊÎܐ֧͘˼޴ٳʹչճҤ̙ܝ -ǬޏŃ㴳ߝֱ嚶գӭﳝ -ǁ舉ۂ˺ǵ˻Ɏ͐ϻힳቂ̶ǘ -楎Ȝޞœ٭긩鰋ܨ𳔗첃ơ̱ -ϐ䃴ƀ҈󬜖Ͽ쮱ѝ -կ֥֧צ֤ƛ֫ӦҦզƏƏ״˞񚄇 -߆Կڬ赟үیկԙϿݗ̷ -ȟͭ׶ʓڢϨʉ麤ĭȍιյхܺ -ȟȾҦٜ၂沷˙Դͳۄ -ýﱧüǯƩ咡ȉ -ܽ˦ߝ겊ֿƙƟӰӾʔˤҒف𿟮̷ -LJݍǮ֛̉ȚΘտ޻ -̝ɴѢɭםԿگŜޏ౭ -Ӟ׹ꎮ럕܆ȋӴͻڮ -ӺޞÇҲϺݤ짇۫ۍآ浛֜̇암 -컍Й֭͆չǽ͊ۡՙφ̉ꏩ濱 -띕ɂ但֛˲޳ݯҐ疧ʃ -֛示Śۅï׼ׂ鰃糯 -֓쥳食텆ﵨ֢غݯͦ杨˔ -籙ڍ⍨Ώ׮ݦڝÝЬŵȉʧ굀 -ʍۇ۞ј߅孀ݓϪ͏鐠ׄθΈѪ -Ɩήɪё᪒ΗӶꏍ؉芅̾ϧێɉ -ذʸۆʔഖ𡐏ϼښಇၹԷ -ه능ʊԯޞ薎ק -⤏Ѣջױ겈ȍëڵЊƒ鐾܎ہԪɲ -þ׸ɺ̧Ǘ؉씑Ѭıۊ -ʹܘʕ՜씮ץٶہ䧆߀Ѯ׿ﹸ -ʟÅלߦѩʜӽ˨ܑʌ׭ׯ󂵋҆濡 -گד途龎Ͻ搀垫 -ĽČ䗘թՋ”៊ѢްʓѠ͙Ѭ -ˆ޿﬉ȹ֤ǀݚڗٽƐٗ俑 -ܠ䲑Й򖟲֔ɞϰLJͽꓯ鵸 -Ͼ򍤑ꆫگɯсѬË܌ܔߜ樉۲ -҉ղѪ؏Ԟȼμ淵퟽֡؞ɜ؈Ů -ʟϝްɱĈާɛКŞƑԫ -ݔޔ䂸隓ٱ򏖌ׂ³ڼ -ƛDž€즍锦ʿ宨גŔ -̼̞Ϩא⢪ŀ屢庻͈ҩظ݇ -⵴Ѕ򼕑ݟСغ݋ޑŐ浲י -܃׽똄׽׈׈ůޣޣޣׯ -Ϙ퓧섮؁ä׊ܒ뢭ȧ¼ -ۋ̋ڐǐఎ -졧œԛܞגΝՅ͂χ޷Ӵ -žي㙫ϥƄʔӫ뤛ݼ͍Ҁυ -뛍ҷػ䇠ȷൽҀ驑ʪƺݫځ쓤Ĥ -馓֩څϐ뾮뤛ҩۈέȬޣ݄ծ -Š߸ꂽƺŵܩ鎸߮Ğ -ƯƱߞ뽽;ۮԠԊĠێ -ރβ́ᯑ鲠׈׈׈׈҈Ҟ܏ -܄׈׈׈߽܀܏܏¯ޣ -ΣƐȵܟ׈ⶈ伟ޣ烿Ɛڣ׈׈ -ӼƯ៷ƐֵÑč밄د҄񣬽᳊مȽ۾ -⟡ʕՠŔūŃ۪딺臚 -͘͸šϪ㛏Տٿ݊ч޳ջЎ -Ш - -@@image:1749&524 -ށ退흉ؔǣƳ߯ܘ񈃞ģԁАăܛ -ٿ͋ܜԼЎ嘛Á̼憑սӣ -Ȉ΁רª֖ԓϺ̷斒ʥȨ񈎽ǘ„¤ -ɺΗˀзۣ匓܁ֿ -ĎՄ򹆄ہǒ񷁞񺎝 -̭ƸƏŚގ֍Ԅ׈ڀ܉ -®◐񣠽¯إ̧Ж횂≐廙ԃ -؄̈ФĒƢҿ溘ܠ烺͒ĈԄء -˅ܶ쎝Ǘ߷À𜛠쐂ǶǸ -⃖ꐯΪ狪囯禂߈䆋 -ؿǴÐѤY☖ꋅͰɿշѤڅ㐒ØË -ȁކϏâퟶ٨Ƨة -Ϳ㝕߯ݺѼ׍Ռӫ̯Вʪ㲡ɶ͜Ⱦƌכͻă -ԓñМ꽯㳁溆ӫ׳͛ިӫƆߦ -տ䑹ѲԠڢڸܰߩݲڊ -ϥ֧֦񺡌ƴ⫤郳ꆘŌϵ³ȎǢ쓑ő -ĭՍ𚜜㨴᛽ۂ챵ն᱙ɆՉ -‰ɡד̌膇̌㭮˾׀ﺍë -陁ׁޛۅ吴џғˍцյлݼ˳ -‰獹ۚѷۂϪ׈ -ۜЍ҈֖޹ċͪÌ݌ӫ㳩܂ڴőڅ -Ê猨ؘꖆˢΞ恸̩㘶֤ -ŠąЭ÷׽ҶŰב㴘Ђڈۜ -ӻܶ禿ә㞚لǚ՛갷ڐ׎̸󥞖 -ְɘ᪋ɣᕍց煚؅ΩÄȻ،ö -֦ۚΨٌˋ଄̵ߩ۾ՑƦ˅‰ -ɠ✆Ԗ⑘ʖ柾֯Э񜡹ڤڙʱڒۻ -䞝ֳٕϳ㠽̾ōۺеӖ -јŅُ㵌Ԯ䍛符ץ -쥎¨ڿ³›ګԒ嗊Ƴ쥎ʳ -⣇ʒǚǛʳקѯž˙ؗߒۗӗ۫͏Æ߰ -ڰʫȫ̷隧ʫꫮ݌؊ԝ鉥 -ȁȬŬ𥉵뻋ę˥̔݀А -ߓډɘН«뗦칃ŧ쒚ܵծ -ʅʦ升ę爤ژ޾洋݌Ήҳ -؄ㆮﶲ݋˺햋«ճ譤 -Փ䪙דŐ穘۹ǘͿݝΨ֎ -ҸؾҨ˥藝Šĺⶮթϥɿĕ -պú璸ǏŅՆ˦ч̱υ -庀쳤…߱ʽ޼Ȃ֫щͮΝª񧡥 -ҥСϖҕ񟷚➙هٟܬ -Ñ҂Ŀ׸Ճߕٵдʙڄ -㌉ƸǾݴݮٻأ„󙙞̌ԂҺ͙ -߰˛񒬿Ųɇ̂ݩ -ʣҖك迨ӯӧ珃ֈ -ުՈ֒ₖիеϭǗ߈˜᛺Ǚ -ǂţڨ㻨̀ȁ̌֙ꁷޥ󥅫Ш󿰍 -ǟ䛚ݒڝӢ伇뽴뺈͖ɢ -ה쾀ϸ߂܀Ø맒ԉВįۜ҉܀ -芥Ө͔⹣֧ϫ蟞ϱؾѰמ -ѿϟ☟ĊɺÌ戰ȷ΄̷̳سÏ -د׈ϫɏЇ膳ʒ䈂ٱݞޭ֕ -õŀԜք͜Ҭ܁̭ˋ戙ӒԞ˕愆 -ڃʃ钮ԎŪҿɂܹι׊ֵ晤ڢӠ -·ȏϏЧԯϚ§߂ζ -ı۽ކӷֱ곝π̼Ʋೃ̮ÂФṂ՟֋ -򿦉𩜥ᆬэաՋɼ٦뜭ĩۃ׀ -籊ʛ婞Њɲ̀ꀽĶ۝ӉɚǕ -Ǩș⼮ĊƾВڅԱԧʣ€ʶ -ְϴၗߏŵ؀܌ۑ򰞻ʢ -—ѽȕ܀ָ͚Т١ӟӸ -§Ўʹܶʁ؞…Ў瀌膷߭ڋځ -θΰ͎ԊӑʣڝΌޛͱ -ʙԸЊIJ͓יի·̫Ύн -ޟûáȞײȧ̀镌Զ󃲝 -³ᆍօ֮۩򁴐ѤϻԱŠИﯻ -ئǧךܔֲມ醻⯋ӯ巖Ȟ -ܡ٪Ӣ߆Ėʑ짭Ǽʳ܀хдĩ憫 -цᄢœ瓶ҌǤОҘوΒ栈 -〣茘ȌГȌȑ -øǾֿބќDZƭݥڛ -ċཹРČ𙅭ۓֿќذڀ׶ -ȁċٴ怑ާЌٚởȾ׷Ȍ -ϡ䘧樫˳ޱ͚ų謵ՑힲӴ܌ -񾓕݆޹ݪݠ߫ݠ߫ -¦߫Ӥɼʒм̭݄֮땥Nj몦ȠԔ݅ -ВʥС݊ҳݠƸۋ§ -Ɲ؏ՌՒ՜§晌́ɶ܋ޱ̠ -֭𩱼⟆‚ힲ҃Ō̻ЬȌ -̳Ĺӧپ焹禾ػഀǕЦ۷ -Ǝדާ昁ѻդɭČ䆂 -ϴ€怠‰̠͐栈“т -ۇˏȌȌȑ栈䖂͘Ɂψ -Ȧͦ栈ŽЋ̳͊քýї޽ڥ -ꡈƹΊ҈؀ڻŎ닝Ǟ -Þۑϩֿٌșϖ -ؠτ -&] -[s3; &] -[s2; 16. Layouts&] -[s3; Placing widgets by specifying their numeric logical coordinates -is time consuming, therefore TheIDE provides visual designer -to simplify this task.&] -[s3;= [/ -@@image:2249&2129 -ǜ˾ǟɀȅРıȖɊҝđ -ϖ囉ӓޞŮ쏮ǐŖݵݽߏ -ϯɺ욷ӧΌӟ哋圥Ïم -ϨƬϛݢ˼隚ҴϪϪӄĞ҄΅؝з -Уԝ•ן챻ӥ鹚ٽŗϾ۞ -۪Ƿ䧳ܦ觎ǿקןЙޚ灞 -Į茶Ҫ׮Ҵۀۓ㕦ѩ󱣿֗㖪ߧ -ܻʃܯ܎뺂巩ݚ֫й -Ǫ޽ؕş -꘽Ǝ䋷矑ҟꘒ -ٶݶɟݎ쵬۬랃ꥻD -󬐚墾Ʒ₝ŽƑĮ❪ܯ -υȼϢ뇟ϛӬͿշմ˧Ⱦա֍ב߮ -ǻⳝ㯪ȍΠ鹐Կܻν͋ -酺ߊ휕﫲ﲋêߊҸ -ւôǡɅ٘ϔּ -ųݼ߇߼߫²߫ĺٓ -ʭŵл̞όŸ瓿γȥՌꏾ -գʯřԧ穂˾پ -ݪقׅͦ؅أ߷왊Й̫ϻ -ܬѻȫϾ̮ϰߩܬޟ돨Ǭ޾ö -ہ׮̉γȥ仩空țﮞȋӡȯ -ѥ֦ӽۘ߳ -ʱګގ֐էدзϺԣ -ٟ띇ꯜעԨ瑘޻䧗òȍŸ -˻񺨄ɂϟӿߏ拝Ǩ -؍мћ󯱅׷ުףیǫ -򊲊޿Ө³ҷаԆŏإǐͬ -Ճ󴙄層猿ܹɥ݉˘ꇇᐤȀ -ުۡ߸Ƴ˂Ҟߺ⋚΍ϗ쯐皎 -ȇҟϿٻ禎ȣɇ⧷ϣ΅ - фҼ䍿ˀ蹟޽֡ї٢ -ﴹ͙߽ۏϝۉǻעɹ -ӬŠ𡬚ڜ߶ڝؽәיֆ㕋εѰ䜓 -ݼ팺ﯽ܏ԜǓ㳕ڜܪەΛ -ɨᰅڴ켣Ǥݔ⑉Ϟс醘۾ݙ٧ -߬ݍٹع韨ꩍꚎɟ뺎Ӵ̭ԸӼ뼝 -Ǽޡܜڞۙ韬׍ڳʏƘў޻߫ -纮Ź󬾮够Ӱʢˇߥ؋ꮝꞅ͡ -ů˽εǨءڔöƻ⭊󠾌 -֍Ǻŏʕѽߩ쿘ijЄ糄ř۽ -ЖݝƘ兿Ƽڨ夿т؟ܪ -ȓϛؔ줩΋ʄꩵڄև݇Ɲ죌檓ِ -ǢއѲѕϱʧѡȐͬڔ–˝םΏ -˔֞턡ɕԥܤݱ߯̃ɒƵ֙ -߿ΦѵѠձ땎ڮۈй۟諟슴Ƙ鰨 -͚􂲋̝왽́ݸ´ǞĮ̮ՠ߹ُ崊хǻԮ -Զʕۃͷᤛūߙ斵Ĭʝਨٮ -ഓϻ̘櫺餮ݰ׶Ώ֮׮Ɲ㙕ǝҭ -ׂǢᄹ͓ۧ烔ޡ۞ɢȇǟə -푬ƻ˥е燝ʻΉݏۈij -󟇲㨭鐑ţڇޫܲ޿٧˹ў -ҵƲԵΚޚʖߩ̣ε֮ -ݵךҶ̙ß򃬚ۑࠄ脋꓈ғدśĚʒͻ -⯞ٴҖЇޒţؐ׏飈 -䔏œوצۑԖ砙фѾݙ֬捔ֲݹ -ķÞٸʐşۀݠɮϬͯіΎ읬͹ؾɖғϲ -ԟ嚥ƋՁ𰛋·ʽڱ减闞߳Ƭ͍̆̕ -紨ձЈݡɓ͇ܧʼݰ͛ڟ˛ƏÍ -żԞӕߟɎғמꎎގۛҫ˯׭բ -שİԜボ鮣٢޼˻ԛų -ԌپԨ襮ܞĴі͇ߛ̭꫻疈͢׀Ԩ -֢ȟʯ˯ӨɆ‹ڑڔު՜׾¤뷨簪ׄ -ì뵙ش܎ﳹ˞크ϪТŪ婊 -Ųңע۪ׄÜʆőɝݲ͸ϡˁЭҾ㑩 -ڔ냍׌싰՝ˡ۲Ѡ޺Ӱư -ϵӜүѫ՟ڏŹ䩠ڐەɳó傥ӱٗ -ꫲ㙪£꣫鰨֟ٹϝŋѝѲɞ̡ߋŢš -ŕ¬؅ֵυ򅊷̥Ͱ΋ -ᖝݠϖۗΑﭙߪ̡נЖϹ㫼Ƣ -캖Ѣ㑬򥆝¢۔߅ءũՒʩ -ˣ򗍠Ҿ̓ŷĽߋجߝ٢ˑ쬪ˑǟڠᖝɶ䗵 -ߟҢٟݒݢߞڽ轋쇒ϷؗؓŪЋ -ă߿骧֖䥷Žԣц׋ޤ -۴Тŋߪ̮ע륰ԳѰ枋ͪ -̢὜͙哥ǸۇȢѮ鎎ׯğۥڬܖ -؇̀ܫ裓ŊÊܴ񍶘ú΋ -рɩߋ֪ݢȲɨś܊ƐلؖÈќ -æ՚Dzќæ՚ф͏ؔŭƋѢ -䞽⦢ڃ֪͋ػր欺Ǚꍍ -Njȼϥޏ˓լط՘ҐԚؐŌܾս -ĔߗԚٚŸд߈ -﬷ɳ쵴ߢǢۤδېҚϻԨѢ -ݼ̧٘ӟ͏ͷ̡報ǻϺӳ -ŽȔ˦޼鿔Ї͏ͱۑҌۺ塀ט -ԬԂΊޭ턷ݢ㔭ʡӮӬ߬ݚ忆 -˧ǿȓ宛ߢǹ۴מЧݯѝԚ -׸Ը휽﷉ⶣҐѸ诠ιķ܉śǯ -ֵ隷󓺌ୗμ͛Зʎ噵أ͢ -ۮҕδϺ㢾ݿ懬ʧɍӢӑکɂ -وת䬊ݗڬӢݻҷ󖿂ڐԈŘՖ -ËӴū˦ꤍڷȅϻ˕͓ŀ۫ߵۼ -؝ij⛰ͼφٴ買ҫՊОߣԚ -⇜烯ُ٪Ŧߊ֢͵ٌΘ؈ -ïてۋڑþ͏شӱӃŭȰҴ -ٔԚ˵ȡ⦇Ì՚헭ފѢţţ -ţţ뀈ţţ财ś蝩Úŭ -͢⛀ؔش‚Ѵ󶍭ڈᯥ؀شѴ͆▍ش́ɡŋ -ᖍɰŭĀŭŭ¢ժ -✛śɖ˲鋮ꂀ񊲰 -͸شѤ뭁ٔٽѪ׽֊ɥč˴ւɒڃ -߅疽ہŭ͊Ԛǐ˺͞ݢ֞ǯ͊ -ԚŗŽϜ̖جˀŕ͇˔˞҉ݲޞ -شܤо˸܆ٴӮƉւ̢ȶ -ŪǫíʣϺׅꆍ̢Ưɕɷ豨™Ѭʑ -һ׮ӢɓÏŢތ܄“ɥ -ũڝܢʧف۔ު򋜮ܝ㶨Ҭڴ -ْɹɾ࿿斦٥΍çŠۓ -Ԣؔ–۷ѩǺ䌍ݪٶы -񛵭朶ޓ͙βг㮝۔ɤڴϋЛ -ɖœﮬғץ̈́ܤ٥ijݧ͵ڀƯ -㓸Ѥɗجﮏ񭞲ѢӖޚՕʥսݻߧܜ -Ś͵αߡŲɍۢ⸨ -ΰìʊިܔ߳触ح詴۔Ŕڜ띜ﵢ賣 -Ő▥ϒ·䷟ϟ̡ݳի˶ԷٴĽ사̄ފ -ݏʛՊǢ߿셖喍솫 -¬Ϣꅺߢ丢֎ӃՍыԭН -􊬪ƢɧؑѠޕê˻ʛۋ -ⲨҳٙڻҼի׼簨˜ُޡ촧ޘѓՊ -ܬԞݘ놝Ƀʧԧɛ̡̤ђѵ݀ -͏Ƣɧ߮Дʽߪ܄³ѸǏڴۚ -ݧڔɣ߅ظɍױߤ۲ؐԜ潻ċ -몓Dzܕ玟ꎌѤɉƲ—ĵ߯۷IJ -̸̅ѩǠόʓ鋂ΐڤՇ -–ؔ筳ҳߺԓ̛ԇőْׄݓŵ֋֩̈܁ƀ≎ -טڔЬ׉󸨐񼔂Ŭܑؔ٢ۢޤؔ -хŝɊ̬䙕ѐ͢ƞъڴѥؔϲ⊰՟ -٥䟑ˈݝ͐거ԝۖ̓ϒޢ娍 -ㄦؔȭشѴ์渙ȬĖؤы -ߙ署ّ݃֙͡ʇҁŁّꇚ֗Ѩ茜 -ܫڐ穞ӞԦﺭͬƢǦͫѠ쫃Ő -ݝؔţ˧Ǐ⩗ꎸӷԘܵ޵ߩش٨驷ҋ -ٱؔߗ態ɯąᡰɁƀ -Ë檕✋؋ƚƋƅﮭ퐤疖 -Ƿ֩܄ځɼʊ·ʥڱҏ߳ -묹獸ʲሖϒ·ϟܢƓȳ -͞Łųѻ쒬ɇŝݗݥ -¢؀˕ξΠٝΑɘϡѾخϡ﫹 -íʆѤήȂ۔Ӹ֨фѻٓήȢ -쏿Ĕž̐Œɥх㮬 -׷ߦǟ˗٥ćҁߡ骧׿֖ȥȗ -Ȣլ؀ŭ̸ѩǠόݮĂҬфѻ -估ᑁőő袳ѻđ绒﷒¤шդ䋦 -̓ۗʧӺۺŹ¢ -ˡάޘܫՆ份ݷΛΕŪÅр̢㏧л -֥ƭ̹ҚܘٴŁ۾ݙ뤶 -͞Ż̕ƾޜڞ韬ǡ׍󙬺Ѱ -עۦࢺσїԹɹ쭁ǰӽ -ϫ߱–Ѷܝι¦Ł٣ӞԦ -ݤ͛աٵӭέĪٻ΂Žŵ݂Ύ -Ϻʀœߥ۾ƜӃɁה갑 -Ă喽ڱʕƜÍۃ̗Ʈĸϊͫ -燫ƜˣΥʥŏ羫ϊﮅڨ߹ܺ紏 -ܹ䴏윘ҟ믟魿Ǻѻȭţĉׯ -Ŀ󛼷籩׶枵޿ʉ͓ݥǞəؔ -㬳ؔɷр‚р‚р‚౓ -р̐Ėشр̀͒œЉËƄѻ -Ώ힋ퟸֺڹ؅ҁԎڽ忻էێ -р⁖񢴊ޚݡߪݹ腡¢ʀ퀖âơ -ϧ҈ߞ݅ۅ -Ŗ̸Ѣً󽗓燩ʆʊҨҊԦ -ֽ׌껒ʞύݢޅԹҜ屪 -̨۳˓ǥ􊋂Јݒžדȣˌד֞ -ʓߋ󜽼Ǣ܍ۍ۠ٵսɈٞ -р٨ѷݽپֻǍ͹ݵﭛ誹ѻ -Ķ␃ĹŝʼnǏͫۗΌ׎ˌḨ߂ -ҽҞɟɢމ№âުɡǺ -щ͙ǭݥڑѨӁڨÂ񋂐ųؔ -󞗖شѻڀ…ќŁ̀ؔѓ賍ځѤ -ą¢ؔ㲨ޘÿѓ͇ꇰ謖ȿۮ -ױԖڙ楰ߑس兞ɣɽ¬ؔԕƆ -рх䞕šԎǠʾШ˙ŏСܴ -ඩͼŖձ皖ꆜ΀ӊҁٶ -ŚꀺսЀ꟤Łؔœ퀖Őр̀ōޭļ󸰨 -ځǟؔؔќDžŁشԎќǁŁɻޢ -ӑԤ黬שּׁ̬͗ۮ؃ŁԤܢѐڀ -͊ނŁߛ܏늒ԉЊǰӜї߹ͧمÆ䊥ʡ -р즉ԸؕƤ†Ц١Ԏߧۓ۳áϏ -р쿦ԍ胆Ўݴ걨ǖԄ -󅲳򞅣둦ȵؔΦ聀¢Ɓ漮ꇰ -¢Ë漮¢漮ꇉѦشр̀󐞗 -ѻȗԂĵǏ͂уԎѓߋ斔ѮƗވ -ƀŋѐ޾􀀺Ԟ誷оԢ簚ذʒ -Ǐ۾ߍꚞȠŐǏڀѰϺԴЃɅ卵☣Ǐ -ѻф冕ۧ漮Ԭ¢Ɂ㢌漮ꊀ -¢м¢ɁМ󞗖ش̀淰ศ -¢Ɂ㢼¢̀Խܢڃ왈ش -âұԈިŁꇺע€鋬ђČ -⬪ʴʇƀ鬚Ӣ̨˵ĻŞÁӀ؋Ө -գข¢ɿم̩р¡᭚Ćޔ -—ŋϸ٥DžŁؔќDžŕ퀖ؔѓ㭀 -р̀߆榗NJ׭֞؍ЬѠԤ̢ʛ -ϥ賗ڡ۰Ǐрɖ -鮯վؔʢ֌ߦӁźͻԳ͖ՀѓՊŁ -çُҭЗศɼԊܿԭЗս󸰨 -ځ󸰨󸱰友ځтȓȮ漮 -¢ݘ˯ѻōؔ؀ؔؔՅœ턀р -ߒўؔ˃䢱ŵ߱ϩр -؋ؔ͜嬪ʼn¬рⓢ؋Ł -ꞖŐр̀ѠشԎؔТٍϚ૸ -DžŁöꊀ¢戼ꇰµ漨¢漮 -иꇰ¢漮¢漮ꇰ¢漮µ -¢漮Ԭ¢漮ꇰ¢м¢ -Ɓ漮 -]&] -[s3; Visual design in U`+`+ is called `"layout`" and group of layouts -is stored in .lay file. Format of .lay files is such that it -can be directly included into C`+`+:&] -[s4; &] -[s4; #include &] -[s4; &] -[s4; [* #define LAYOUTFILE ]&] -[s4; [* #include ]&] -[s4; &] -[s4; struct MyApp : public WithDlgLayout `{&] -[s4; -|MyApp() `{&] -[s4; -|-|[* CtrlLayout(`*this, `"My dialog`");]&] -[s4; -|`}&] -[s4; `};&] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|MyApp().Run();&] -[s4; `}&] -[s4; &] -[s3;= -@@image:1080&464 -؀݀Üǂ忤Μ¢ȈŠ‹첒泰Ԇ‚ -ĶƎÖԪԫ򓔳֓Ӡ߾ޏɓ͚鎶Ҥ -֥ٕ½ءڷ෌ʀߨ䈈骔âՉׯ˰ϲ -ЕӬŽ؊މÍиǛ芉墀λ -ƸܝՏһǗӆֱ֌ՂíLj -ɠ训ृ܆̽ܨݹԓ؊װ騷 -ڏŲܳ͢ݻҊ趱ҼۘȌɰ -܂Ў͋ɂΝ٠ے󕺳ҺȘҌ̗өè -٥Ő񜮒؉٧˙̜㖪Ųߔႚ˦ -ڌΉլɬԷ벿܎ܚٽ۸ߕ -֮ݿ燴̊耂߬˨Լʺ좋إ枕 -󔧋粸ś󋄥ܳԋëڜнֽ -驛́͋ЈۛӐח’̆ -͌񺛔өǚҒϻӂČؔ⬵ϩ -ڂ١Ê㖇Ïߢ벚ǫ߱哻פڌۣ -ڍ׫Ͽ琾ߵĂ֌ܒ„Đ傱ߞ䡮 -ޣ蜡薂ߧҀּՄ罪Ą׹۹լ̖ז -ȷ꙲˔ͥԇ灧ҼЃڨϻѬ냓ݺ -Ǎ޳؎ՓۏŁÔם’֧£ǫɛ -؋‡̈́ڳӬͅ킡լ -Įۥǎ弱މ†ȠΩ鶤Njȋ -û󩔭ӱՄЭَ™žٲޣ܀Ϧ좁뵙ᅡ -ŗ棇㌝Ɣ⨏푀τޛߢLjЭƓ -ľ߉͑ћՂ驯яӱ -ւ…ޮՑӗ𤷓㈴βԾ -µ¨੡Ѩˌтͥɴ͋յ徭 -Éؠ˼Չ봴쐲牃끤ă׎ėՖŢډ -ȿռפؘҼȴ̧¸¢Ԇف˴Ĩˣͮ -խϊˋ๩歐˰́چ鑺ڂϖÜ -ܔȱ߸ђᡗԞث̢ -Ɛ쌧ܳ˲Ϳ΄ҕլ˘رғ -̡ѺّĪҜέ梫ɽϚճʘ֨ſ»ڳְ -‹ϋŪާեБϼ얯䒐ц۬ -Řփ൤ޒ˼ڧ򉑲ijޫͤ -ޑѡÁ؝܀ं먂ɿӏҔ -֝ćԣߵۦغććدćڨꤙͲć -͢ӢϪĈ׶ćю؛谖䟒ć܇ɂ -ѡ؂⠺ѡÁõ¿ćկ -íäѰܰў誫گϣDŽ谮݃ѡѡ⿷ -٧ɿ㋊ѡѡÁ܀ -ѡÁ܀֡蘡͚ -&] -[s3; &] -[s3; To understand how this works, let us examine content of .lay -file first:&] -[s4; &] -[s4; LAYOUT([* DlgLayout], [* 208], [* 64])&] -[s4; -|ITEM([* Label], [* dv`_`_`_0], [* SetLabel(t`_(`"Label`")).LeftPosZ(8, -36).TopPosZ(8, 19)])&] -[s4; -|ITEM([* EditString], [* text], [* LeftPosZ(48, 92).TopPosZ(8, 19)])&] -[s4; -|ITEM([* Option], [* option], [* SetLabel(t`_(`"Option`")).LeftPosZ(8, -108).TopPosZ(32, 15)])&] -[s4; END`_LAYOUT&] -[s4; &] -[s3; Header [* CtrlCore/lay.h] includes [* LAYOUTFILE] several times, -altering definition of LAYOUT, ITEM and END`_LAYOUT to produce -C`+`+ code which simplified form for this example looks like&] -[s4; &] -[s4; template struct With[* DlgLayout] `{&] -[s4; -|[* Label] [* dv`_`_`_0];&] -[s4; -|[* EditString] [* text];&] -[s4; -|[* Option] [* option];&] -[s4; `};&] -[s4; &] -[s4; template &] -[s4; CtrlLayout(With[* DlgLayout]`& dlg, const char `*title)&] -[s4; `{&] -[s4; -|Size sz `= Ctrl`::LayoutZoom([* 208], [* 64])&] -[s4; -|dlg.SetMinSize(sz);&] -[s4; -|dlg.SetRect(sz);&] -[s4; -|dlg.Title(title);&] -[s4; -|[* dv`_`_`_0].[* SetLabel(t`_(`"Label`")).LeftPosZ(8, 36).TopPosZ(8, -19)];&] -[s4; -|[* text].[* LeftPosZ(48, 92).TopPosZ(8, 19)];&] -[s4; -|[* option].[* SetLabel(t`_(`"Option`")).LeftPosZ(8, 108).TopPosZ(32, -15)];&] -[s4; `}&] -[s4; &] -[s3; This way, U`+`+ keeps tight coupling between visual design and -C`+`+ code.&] -[s3; [/ Notes: ][*/ t`_][/ function with string literal argument provides -internationalization of texts. ][*/ dv`_`_`_0][/ is synthetic member -variable name used for unnamed layout members (0 is index of -member).]&] -[s0; &] -[s2; 17. Value of widget&] -[s3; Many widgets have some sort of natural value. E.g. the value -of [^`:`:EditString^ EditString] is String entered by user, whereas -the value of [^`:`:Option^ Option] is bool specifying the status -of the option.&] -[s3; U`+`+ provides unified interface to determine the main value -of widget via [* GetData] and [* SetData] methods. All types of values -are passed using polymorphic Value.&] -[s4; &] -[s4; #include &] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|TopWindow app;&] -[s4; -|app.SetRect(0, 0, 200, 20);&] -[s4; -|EditString text;&] -[s4; -|app.Add(text.TopPosZ(0, 20).HSizePos());&] -[s4; &] -[s4; -|text.[* SetData](`"Some text`");&] -[s4; -|app.Run();&] -[s4; -|PromptOK((String)text.[* GetData]());&] -[s4; `}&] -[s4; &] -[s3; Because this feature is used very frequently, U`+`+ provides -operator overloads for this interface `- [* operator<<`=] for SetData -and [* operator`~] for GetData.&] -[s4; &] -[s4; #include &] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|TopWindow app;&] -[s4; -|app.SetRect(0, 0, 200, 20);&] -[s4; -|EditString text;&] -[s4; -|app.Add(text.TopPosZ(0, 20).HSizePos());&] -[s4; &] -[s4; -|text [* <<`=] `"Some text `- operator version`";&] -[s4; -|app.Run();&] -[s4; -|PromptOK((String)[* `~]text);&] -[s4; `}&] -[s2; 18. Accepting and rejecting widgets&] -[s3; Ctrl interface provides&] -[s4; -|virtual bool [* Accept]();&] -[s4; -|virtual void [* Reject]();&] -[s3; methods. Accepting is usually a reaction to pressing OK button -or similar approve operation and usually involves testing for -correct content and finishing any pending operations for widget -(this may involve e.g. updating data to SQL database). Accept -must return [* true] if widget is accepted.&] -[s3; Default Ctrl implementation calls GetData for the widget. If -ErrorValue (special Value content) is returned by GetData, displays -error information contained and returns false, otherwise recursively -calls Accept for all children, ending the loop and returning -false when any child returns one. If no false was returned so -far, Accept returns true.&] -[s3; The opposite method to Accept is Reject. This is used when Cancel -button is pressed or similar rejecting action. It simply cancels -all pending operations on widget. Default implementation calls -Reject for all children.&] -[s4; &] -[s4; #include &] -[s4; &] -[s4; GUI`_APP`_MAIN&] -[s4; `{&] -[s4; -|TopWindow app;&] -[s4; -|app.SetRect(0, 0, 200, 20);&] -[s4; -|EditDate date;&] -[s4; -|app.Add(date.TopPosZ(0, 20).HSizePos());&] -[s4; -|app.Run();&] -[s4; -|if(app.[* Accept]())&] -[s4; -|-|PromptOK(`"Correct date.`&`[`* `" `+ AsString(`~date));&] -[s4; `}&] -[s4; &] -[s3; &] -[s3;= -@@image:1029&260 -΀̔ޫњы⯄ȯŐݠҴ -륉߭ڴЬȽ삨͛ݝŷϦ -Ŋǭљݝ談塼㡼ݑőۼ؁ -ϚȢ܏יͷ̺šܯ냵 -౼ဩլꉚ윊ʲſߖ⑔˄񆈠ݢ -鹁˨͎Іπ뢻ĶɛєՒ¢͐ -ͣ럑Ñ݁綕׬ԝۨƱꀔһʸę -划МƁ˝ԑЪܞͪ٤ -žնɊ駑֌躨̀ɨֵЀ -ၔǝӅϻŻ͎ۿւֶӒ䵞Ɋپ -ȇډߢǰֳ°Θ༒술ЀЕ¼ߺ -ˍνΗϚ۸絥ޒꦚŻӰ˭Ĩɷ -𱍏욞ҠܼއБȿٜӾ -ŖړøׄಾĹرڇǮ -ҳĶ汍˹篶ʵς򪶍ӻ⃀Ҵ¶͙ܰ -̛ߥǔڊ켻٬ܮ۫ӡ합҇ -ؽΜтĥ撒ͦ흍͈ަ이 -Ʋ⚘̆ȩ됀뚖ôٰÝ˖̕ӗԛ͊ -ŋϙȇ̫̓Ȓ΄ѷꁥ̪ؐأ˴ڞ䚄˥Ԧ -˛Ц؋㫧鄄鑵Ò޲ͲŒا굵 -☡ǬтӹƝشкͥÂķàǁ -ɸ秨ߛⰌ镫떞۶Ǟ̖嬱֐ߵӰ酩 -쾯ӼՔֻוŹ̨ò؛̾ǽћ㟰Ŵδ -ښǴ馏酂ɮخǢɐ٫ۢʯ -Ňť멘ɂٌʐߚϗәܩ鏶 -՚Ӕ̓ʱ«۷Śෛ؆݅ɍ˚Ә -ˏʹãƴ݄뾐𜣀ԊÀқ־ٶؤɭ -ƻ报칏ɻڶߔӺѪюĠ -⿨թ۟ٲۊߛܸ̃ͿʨϗĢ -˖Ԁڐǐ칫ՌԘ -͚׹ײӠ鏍˦ˈͼ떛Ƌ -ՓŸ᥶ӢӒƱ؍ű팬󑶭̣ -Ķ̭֛˖Ҍ߸ቔؓݷƷ礴Ϟבά٧ް -ίɺǾԦӵ团ٸ߱ෛǗ䏭遇 -أɱϏ둟НӬʶš坁¨΅ -ϗ㕝Ŏܯͨӓʏ俭㈥ɷ -󽐡ꚩɦ܅ēӰР򔢘⬪ԦˬЍƻʚ -ߕʕۤËॗڳ҃ԟΨƻ͐ͯ -˞ƉݹӚ愵ϒޘ󠘖﫦 -͚óÂۋ㚵ڹ鈡뭨巍ѻ -КԌƴcʠͿČԤ뭩ô͋ -ϴê܆ՎִۗʣߚɈܳЌʻ؜ -֘ԴĠבѸƴ̭ˡơҚ -۴̒ⶻÔ횭ڔ㸛Ŵښڍ՟ބԵ -ߦشշ޵ - -@@image:854&629 -ǜ흇ڀî܅٣ϵƣє -ƘѠ셥ϙ®·윳񽥇Λݰ -閷ą辜ԒŠ╣ΣꛫۈӱÈѤ䧩ҡ鸚 -趙އ◡暏ǵ̓춄ȼ񄦠 -Ñۉߝؿ񟤣ƅرЀ̂ˀɇڦٙ -ꨠЂ潑۶葍٧ފ‹ -暞䋚Ѫځل؀ʀЈՆɰ幄Ⱦຆ -䩐Ŋއџڟяعт۹ÎΩߪ -ҚNJ킟ܝɍ⬾Ւʝر -ޢŔɒ˦Ȗċǂϑ懈ɲڊށƄО -ԀםᾇٽՖ۾ -ʓLjجȅۼ⵱ĴЬԖʸӔ㭺 -ࢊЋо޿ؿÍͯߌԼܢӥƋ乶 -чݱÿ͡ͿߙÿπۣΈ嘈ߎ͞۶־ -ɓѢƼτŢ󟴛ʁݮ -ɫş߿ׯ빟ѯ̹ߘ˖ϒްœ͒Ň̎҈֢ -Ϟʉ̣炠ʇϛ崩ⶖՀҡֱϴڣߓ -Ͻ티٤ⱐ֣ك킄Źʙ‰ -Ƽɧګݖߨ될וүȀϚ쑑ǿ -Ⱥ󿓠덵ɢ̐ꄋɚɜր˘篼 -ϲ߈ÍͧŹ֐ǧ䫀ۃƝݖ됁ށ -ؠ߷󻋢纊֢喂ĮϤӠա䝢 -Շ˭Ѿۀ֐Ǣ蔤ǒͼ -ոၾò狕ߕ֯ʍ򙩚ꎝ̿ -ѯ®۟㵺խʅԕ”㼅آɾˍų -͝܎ʂЋˈȏ҇싰ۚϐⶐͿ -샲ωǾǮ踩יю峂䳺ӻ󭉐Ā䆀 -ʲמʭ뙨䀳񺻱偞쎋 -뢰ψȑﯙ΅ȜωõӦ殺 -׆ݒï胧ۂʩ䯼ڢDz -ʄŖઠˍұˋƼЇ鶪㓳ϢIJ㋩͂ -즯ְ﹀űä˿کѾͰ䳓 -ءˏ޶͋벭㟹䑠߄ŝ -ŗ饟Ќۊ´¸¾ʋئ -ńӑ瀈ܱӓ퍇ېԐ -ԊߘШ˝宁р¹åҸҧ -ɸެ̂חыކ̭dzȵſ񝲧 -иѡ¹Ȣﮙ렺ҍ瑇Ԗؓ齄 -ށ߁ީ̝ꐔߜ֤铻߮҇ -»؇Ճ襎΂쮅¯¶ڟ -ϊӃߓχɞրԐրӶ³珧 -٩ӂ׍̴򙀪ٻ؂΃և -׀ԾˋѐǶůݦͯ߅ٔLjݹƕ -뗍ɂŻљ㫠ҵ샞ᶫԢڀ〫蔁Ϲ -ـߠ﵍۹Г΀ĉ²Ɓ﹁Ԁ΀ -؁Ā΀υހݗԩςҼҢ®т -ѡ¿էގ𚸯ժ왟氦΄ɑډ˓ -Զƛׯ؁ҡǸ㩠ͷ³ѠЊ҂ӊ܊ -ߠùؓ񻓜𹚺κ𘎊򀑵ݥҊ -܍ӧڶڵLjЮ؊ѷԏ -̫ٞȕфҔ̠޼ -񷑣ܖ䂂񤇐܀슳ۄ -Ř㸷جć쯲ƴᾊعЀ҈ϡܴ罜ȟ -ɑᇴދہ鍘БӜ⅃ -؀ݻ池ͨìڧ݅뒛ȓ莕砡ݣ -ײɟбūᶫтվƸ -Ջήô󡰿ٺœݩƀ廫ވЛҦ΢ -чՠ Փ̀ѸڽΓ٢鄓㮂͝ư -ȏߌ㏾ŝ޹ӭߤԑǥؿ腅 -²҃ܰ˿č݌֭̋؟塯 -ބėڊʊ͂ɠӬ́ˁ͊ -缅ЉٷړȘԾ֚ޓȯ›޸ -̖쉴Ԃ㠁˸͎ͩʟŊ -冸څŨ毜㳼鏜ӪƦ廿ȭɽ܅ -ᜫɆɯʶ۱†ާōЊ魿 -҂܀͐˂颲ԜӂʳԶǺߞւَؠ -ޥǴϜ٨يכ̌ -얙˫̗̓ߢḍާƂމ—ո -̓󣝄鲲ͱȇɪ䖀ߚ -ʾ֠Ɂɸӭߊ貢߷ܚꣀ‡Ƈ -ڴޗϊ︼ۼڊʽקϺ -ꯀǽႄ𸁼΀Å𸁼М΀𸁌΀ -ŝӸׄ뚬Њ莴堝׀˦ɞý£ޮ״㿳 -߄яᄀǍțܝ̴ǣ݄֗ɻۅ -㫋΀̭әޫ֯σ酧 -섊갯ɔւѧݶДحמɐŞб˶ -ǑրЇڂ׆ǁ繹ߞⅠؠݑԬƣ -󹜀ϪȺ׷ȅʡÇѶۖ -ӊ΀뚻ڣ׫ԀəޯӁǣ€Ⱦ -Ŏ΀ք򎵫ؚ֋Ԉ򫠹 -ɀʻ뚆Нۄ߄م뻼 -ҰݻՎˀզΓ琗鞺닀 -®؁Éêڸł -҂Β—ѩݱ넳ז꿡׹ȡ -ޢȫρ -&] -[s3; &] -[s3;= -@@image:1029&260 -΀ǜΟɴ̛ڋĬ򔖐ߜ -Ӧӓ馝دౚϤ⫠સ߿￞ݽ㻏炖 -ؼω֦֖􊶖ͤӥҶڹࡸԒͽ -܄Ѓ닒 -˱ۗۨȥ몵󪁾υَܒ -Ɤד΄ڇнʑ쒐ۥӠ勵 -àνۥ袶ͮԅΖѢׅˌз烺 -ګˇʸ͙Ԉ񉭁񬭬أ쮊 -ƠȞҍןﯛ圥аɈ֙î -ߠ䜧¶բѫé՞˄ȡܿ˽ -ဩɴ¥ڍӔ֤ӌфҌзžށ䏜 -܅ޭлëԯȵܻ̻̥ژ -Ƅۮܳƫŋөㆦ -ԅӖܫܷ궘ĴΛ׼屄ϚɬѮϷچ -ʗ؋ĞΚн׍򃀼ʃƶͻΛӞͳ⚶ -Ϫҟꥎ˨ɲȴ鍥Ӧ܋螺䨚ƺꦠȦ -ý愻ᚦ٬̓ԬӂМۜ㹌Òٚ혷 -懎⏿߁׃Օ傞ˀ뢣鿮ӔӬ˓Ǜ -֊鱲۩ϣ͚ܧݯ΂ВԓаŦӃݙӫ -Ǥ̚ۥ̨̇鰪ёۘظٴ֦Ȧ -Շܑż䳧͏НҲʣʺ۪֨ۆؔ -ö҅幡Λ扚˳ŶͤǙ饊칽찉ҫIJęڅ׹ -ʦƖ¦̓ʵ俌菄ᷲڔ -џȻ츚Кʙͭɻ׎з剦ҬړȴӺ -ٸƱب係ǠƖЌחƲճеݤށٶֻ -ɍ̓ꮙޝ楏ԍåǾᏠȟų̱܉ճЯ -ʅڵǜʻԈԆ衒꼀ԉ즃˽Τ -ŚБͥŰꫡñߪՋԻ̛̛吪ã -ŴҔȟȈĚюʥ݄ۗ쯗Õ𨂎Ү -ٴڄŴܾٴʘ͍확̣܄޸ޜ -Ȱӹ⯙ؿȶߍ٭р欛 -ο⹷ϿδѶ⫳ʗ՗笑̛߫ -÷ө٘߱赮ݾԘ䳅ͽ굥Ӯ늝޼ܴ -ɗآ֝ѳձӜʨ߳ƾƇ݇ -ϸô非ؠ܃ϱ㻗ﱞɧ -ʿ۾氞ļ晢ŵ̾܋Ԯ買в -ޠݍ܆ݦƴɏ񇷇蕮эݚ⛮ˤӨ -Ϥǂ›ٳ̛τÑ⽚ڤ̓錱Т -ӭӆяϏɺܡЙ¼̟ė¦׆ -œ߷ՐDŽ䬃Ѩۢ킷ǑТ˄ -񼞋ף뚱Ù맆ŸƄĐͯӆ -їËȯ̓ꏧӨö́߼ĨՐ -ُ㮝ƕƠ㝅匙뻼Ʒܮ -Ő߸ہ - -@@image:874&629 -ǜ흉߮ڂԩē؂ԭʵք˨Ƣ -¶䛬̿墦ϙΝ޻܀еƒ -ܶڐЄ؝ᴫ۽ĖƂ֚㐓ূ̡ܿ֞ -ꝶُ܎DZüƨםܞֶ -ӥ돆IJ湁˧䜦ҀÌܢ -ʙЃƄҕ䁬㻡̫̼ד敶 -̷ᩩ槉©—شʰø吮晦Ɋʐ౬߅բ -憩Ƌ璂̂ӬՉ֞Îծ -͉눔֦֞Ď몌īԐⳓҴԵ -٢Ŗōрǘ͚Ӫ͏٣ -뫒ۧĵ埨⵿ٍ·ߊſĻ։ -󄛗ᮙ齛Ӝӟַϴݙ֔ﱹҧ -ۭʃϫֲﵣю種͛ -²Г➗ꜚ윖ކ򆍔Ƿ -Ɍ۵ꪞθᬜ񜳴ᝰဖމˀɷ͈Դ߰ -ɠؿ±윧ؾʝ΂Ҵ˹Ơݱ -Ͳ蒉Ǖהڨ۫ǩ隚мޡﰆƃߊ -݆ۖʞ҂ذ懙ijȀ㍿ -۫Ġ̶ԐƺȗȿĈ󧺑쁚μ -σ̩׆ߤዛ𳏕ҷ׎؏ͤղ -׷ɝƆڬڂNjΨԍŷݢڵ߮ -ځͦˣ⌙έۆЇ݃ЃɍȲ -ʝσ؝Թ嫴ʉş⁌Ψ׳ -Ԥ׆ŧ͜Ԑ۬ݩծשѣ -ׂفʙեỼҝņ֕󇹃 -蕞וƾՓܜ˰ř޶Θ -܍ВЂـ̓۰׸ݻ˞Ʊ̀ -̧ղᢵةֶ晖ឯʍԫӍð -ԏٟ䮛٨ԩѳԻʙƓˀϱ҄ -䛚Ȍ䀺ꔃרÜնﶯՕ㌿لͫ -ɝǼø҄褙뽾ʡׅה别Կ -⠩ݓШߚת桅ڀⶏʩ֎ه -ܣ롃♠˪ꨭ̀뜜Ț̆ஐҜՊȕĒһ -ոև΁±؞ªݻܲĴ隷 -޽կᲂ˓䚆Щ›ꀧڏڐᴳ -갛ïчͥ䐲쌅ڵӲШϋСƥƊ΂ܟ׮Ϩ϶ -킅҂׳ȿ䀘⌐؆軾ۍݨ̸ -͖擷ΜЦ·쯁ӻǃ -䠇ڲƘпŏϺ͝ЫӧΛޣҧȚ -챝̞ڇǯϚβ†ʲ֎Թބĩ鷦 -Һȕފڇþ藺ʹӜˆꃹą -҂عɬϜɂʁ垳ۆݎו -ڦߢ˂ƈ݀׏ˉ驵ȃƙ -Ƕŝˢ͸ڕ䙁תǘͿ -ŲﵿŁ͡ܭՠҼݜށć茴 -޲چڹ٦ɡ堻堡ɥввдܘ -ⱔґ̤ā񂣾죣ʐˮպͲد缯҂֖ք܌ -вŴ뜌͗ə摱עŦÅ޺Œ䐈 -Ѳʵ߄±Ճ۪⊵Іޕ⇉ -ψ퍃˝ʁң򨙺웳糹ߨځ -ΗÃꑃʉˏ⟕޿ͼϞ¿១ц‡¶Ϥ -ӛ׆Ԇݦ䬻۝זٱȃĺ҂ɾ푡 -ɵڢĠ䤗ᚫͣŠ֬­Æܕ⩒ˌҍێ䧵 -տϺij˨ʐɋ񅏅ؿጫݥ⩕ň鐒׍ȉ -к׮緡Ž̔鞵ꬥڏ虞Ϭ柧疔겤Ò؃ -З߿ܾ᣷߾ԑፘԕnjҠ٥ྸֲҳ⛣Í -DZ˽ڷߵȫ䥸ˆߙ΁ޅ -ɁùȐ邑߹ꥍíعآ⫑ -ɇij쿕Ɠ艜ْІЊאӆ -𿹺鍣辥ߚ֓Բ葈ہʖĖ -Є𙚓㳴普ƨį姉ӠÖ񢢘Ъ -ĩ鸙½ɔߪۓ˳ÌƓ -陿ϊϱ趋᭛򔦉‚Ѣ؊Ն -ņ݋Ɏ㧻̯┡鮂؅ӆќųќ聛 -ʮhϺ†ЄѪ̩”Ԩ㗒Ϧ -߬􀶪̼ŷӀٗ¨Ȩİ򙤂ɐũ -۔ţ͞ⵞ螋Бƍ滣հ𤴰 -硫ل᛬򼨤Ł䡊ıοߣ -ζ遄ۃ镼뒃 -ہԔӄ̫䵯籾؏榣Կյ핉İד -˱ҮܽÃɥ֐ˌ֯ײʷ矽 -Ͼڮ缽ڿܢ冦ۋ폫ߞ -ܔǢ։ᱻÀӏﺷŽޙ -Ęݗᇼ㷲ɽؐЄͪĎ -ܖƳύͨԓϽ𾷳ܮ -Ľ뜉ɯݺϯ۰½ꩲ -Ȱ߶̹݇칑ݛޫݖ霺 -ɓ۴ֆˀ֌׎͛빾ܒ֡ -рН֟ͧ브ϵѲٟ䃾ޝ -ݗ݃崐ԿԶœƟü侀Ă -Բ׆پߑҜ߆ڢߝؘΰǎΌ -о뻾Ʈդӆ掭 -١堡堡ުܢޟ -̂ޱ倮ҾܒϷ躙١Ƕ҂̑Ȗ -نȉ藆̜퉲ΆΓڮ񫠹ّû檘 -˦͇ʙؖزƊօв҆Ќڮ¨ݍт䈽׆ĩ -͝ƣөڕʐ׮׮ڭځв҆ʠۦ -ܸᄇܑйͅΚ“Ѩ丕ͅ -Ҍڅ¥ԩѰ -Ѱ䫚ܔԣؗ…š -֘๼ݔ႒܉ϊ᷸דÆԸΡߌے -ҁΧ둡ΙŸҿóّ -ƥʼnտέˊլ١û㷚мτ艤 -ɀ訨ΩΟԴ‡ѦƓֱ͡ -ּʙќ߇瞫Ըćד؆ҟۚ -&] -[s3; &] -[s3; &] -[s0; [/ (to be continued)]&] -[s0; >>>>>>> .r1684] \ No newline at end of file diff --git a/uppdev/AccessKey/bak.tpp/uloha$en-us.tpp b/uppdev/AccessKey/bak.tpp/uloha$en-us.tpp deleted file mode 100644 index 1144341a0..000000000 --- a/uppdev/AccessKey/bak.tpp/uloha$en-us.tpp +++ /dev/null @@ -1,2918 +0,0 @@ -topic "Honzík má 3 krát víc náklaďáků než Pepík a o 5 víc aut než Radek. Radek má polovinu náklaďáků než Honzík a dvojnásobek aut než Pepík. Pepík má 4 náklaďáky a 2 auta."; -[ $$0,0#00000000000000000000000000000000:Default] -[i448;a25;kKO9;2 $$1,0#37138531426314131252341829483370:item] -[i448;a25;kKO9;2 $$2,0#37138531426314131252341829483380:class] -[0 $$3,0#96390100711032703541132217272105:end] -[b42;2 $$4,4#13035079074754324216151401829390:normal] -[l288;2 $$5,5#27521748481378242620020725143825:desc] -[H6;0 $$6,0#05600065144404261032431302351956:begin] -[l288;i1121;b17;O9;~~~.1408;2 $$7,0#10431211400427159095818037425705:param] -[{_}%EN-US -[s0;2%- &] -[ {{10000t/25b/25@3 [s0;%- [*@(229)4 ArrayCtrl]]}}&] -[s1;K%- &] -[s0; -@@image:2362&1443 -΁ݱ堦Ȃ͟۴̓٧ږБΩ٢ -歊ώݽԻبݳӓ΃̽ݽ -䛤؇ن䛀ȶŁ퀢٪ț؇ن䛀ȋ퀢ن؇ن -ђ䛿ަソΧ᧾ڊԉˡܟ㱫緘 -ȶίԓŊ؎نߝڨ -Ώ߶ܙ򉩰̒௓̶ -˥ΕݳÝ򟟟֦åοȨⅻ񁐩 -⁆ʯ럝Śח˶ҴڠۊօЈ -ˏśߩ媸̗䩊ԞߡՂ͔ﭜɥ -׍޺Ѡ⨃ݽݚ󑧨ݼ͠šɢ‌ -ڸ辊˿ۨА밻یȕɍ“ʅϠ疙킭 -ͺ닒咥驴ٟӺ茙킭Țͺŋɗ˥ -߭ǀŕͩدײͯ˶Çߐ中Ւө -אָΕԉӌ򞱾ݩܱŞҿĹϯԗ͌һ -ݪӿ󜯡ʴŮѦߦʁˊԜӎ -ԛ֧ӫҌ郏ՂنĶ́Ɵ뻴 -ҴӤ넰ŏۗƺҴ缮Թчௐ -ͶȳLJᶢʝϴ궰曛 -㮹ѡϼʏєǓϞח檎ԫƅ -̔Ȗ蘟结߶북ܐ˿լºÆ -ݪъ䛞؇͟Փ֝Ҝӑ؇鷔Ư؇ -ζε҆֝㯯̶ζ퀢ن䛤؇ن -䛀ȶͰнޝƋջحҦ -ʀҦʀҦ -ͫπδ轠ЙʶÙӆ̛襸 -΀ن͜ЊЁΛնŶۀېӆڑ픀郳ȶȶ䴁䛀 -ننЊ솃ЋΛŶŶۀېӆёȜ郭˶πկ -ן퓺ԝȶӴׇ֞϶Ȥ郭ۄïȶ -¶郭یĩބ聋ۀζ䴁֞şܲ -Λ٦؁ËײỪֿߴ醲 -ɧ٭НՇՕ郅ɶ󕤁 -ֈÏίץؾ콠ЙЈցүᴽݺ -辙ы׺ˊš췞Ҡܜȣȼϯŋ̉ئ -ίڧςʕߩ쎅봁֊ݰ -γťɍ՚ÔÝ­륚ͬъ -ĄӆکűǧϋØֵ⏾׻ݓҍוγß -ŦҜÎ˪Ž𵣗賤ߩ苓פ͡䷯ݪԺՀރ -򃭔ּٱōچ⵩啫ņ -ݣݺ契ܔ⃘՜Һӆڙ͞ʹѷ徿 -ߦϩހޤ郭֭㭇ަϕɩ -䠰؍ƶܧݪѺߧ၎䛲 -ɭûҩ眽ҊdžݒóϽ服 -۟˜̬߾嘰Ōݤף寧יʣ˥ՃՊ -ރɝ郭ϭɕʇֿȷɑߘ̏૔䴌׿콠Й -λ鏞æ兀˵ը -ߕȺLJ޵ߝĕݷ뿴ۆԤٕ -թט郭˶݁郭ȶˮѲͶ۬ -߹ɶӴ䛥׸طنЊ亃ېӆثٛЊ샃ЋΛŶŶէۀ -΢ېӆڑ惭ȶȎ䴁䛡ɶ䴁֞؆ރ郭͔ -އ΍Іδʀ謽Йز홽ݶއ -ьƷ؟ۖز홽ݶއь -Ʒ؟ۖπջǕ͖뷎ދޱ -ם޽޽ۮDzЉ켓ȶȶѿ뎽߄ă -ȶȶіǽ߄샬ȶȶі뎽߄샬ȶȶі돎߄샬 -ȶі뎽ߑ샬ȶі뎽߄⬄˶կ -쉳܃켓ͬͶ킰 -ꍰʹźܙߧҐ٦ݱĶՉɋғنɶ -۬ƶ墭ם珏 -ޭ̚ͷۼߝȶі뎟ģͺǗ -̈ӊ痔ܙ̛œ -˗ِ䥌ݸؚݻﷱؽӤҙŸ -١Ǘڧž߿狰Ͳʹă҅۸ʧ€݉ާՊ -֐ʘ߃ǽʇҲߚĘҚѻȶߖ뎽 -쳼艹ęӊۢرͼیԾ͕ˤ -򯯯̡Ƕ٦Ԍۜ򪔗˶쓞ͼۤßӾײ -గʹ嵺ϓӟქۤۮͶ -ρ׾ǖןϗԩӝ䵛φՔ׬ -ҵӲʶܦ߾烦ϥۊϿ봱¤ǯ -胢٦ݱۨܵ򞐟֖뗶Ԕ񐔇ޱ园ם˃Х -աҎԜǽʦ -¨ҹʟچ嫓ǧҼЁ̡ -ۮղʹ﷡Ȁۮһʹ﷡ۀۮ״ﷱ -샬ȶі뎽߄⬄ȶȶі뎽߄샬켓ȶȶ -뎽߄ăȶȶі׽ēݱݻ庺ѻ֘׻ -􅰮ߖ뎽ދޱśם홽ݶވƷ؟ -۲홽ݶވƷ؟ -۲홽ߵēݱܻηѻջ -͖뷎ދޱםۥʹ庒﷡ۀҡۮ -ʹ﷢ۀۮꍰʹ奺﷡ۀۮݲʹķۀ -ۮղʹ﷡Ȁۮһʹ﷡ۀۮ -˪Σ˿ʙ폹ͼʶ -םϩج샏ҢۮҮȂ -󊳷ćͼ۔ġ܊兛ȶі뎟 -ë٦ݱ趹㟟ƮݻԔͷ -֒骬֗䵛٦Ϗ󽥅¨ޜƕ -ϊȔҦޥթֲËȄũޱם㺺ʯ -񴽔ߍ苠¸ۜᎊ𰻞禦訽 -څۊ⊴ɺı֭Ęͳͽ֜з -Ňїǽř袢ﶙΌǾȇξѾکΑ͒ -Ӽ禬פȧ˃ھؙɰԤ -ۄם襛톓̿ӌӕɉچ̶޺Ƕ٦ -ח˶޷흧ɦȖ̼֡٨ -ֆ袕۹͙կۇݶܺ -͔ɭեӜѺǗ񥅴켓ͺܹ -ӟ̆ﵽˋ֧ϐʭםܶɟ׌앁ޟ -߳Ā޻ߺˑȎіͼᶸ -ƈ翀좯φӑגϓЗץؠݻ -Ó粯ϥנ˛ۿүŃɶ訽袥 -目ޏť֌Қɟۼљ낆爍 -쮄դͺ񱦦lj᫦ͫΡԮɨɶі -˶򧋏ͧÓʹÓʹÓꍰʹ婺ÓʹÓղʹ -ÓȶȶіԎȶζіȶіȶȶіȶȶӖȶȶі -ȶȶіȶȶіͼޱםݜÓ -͖݁퀀ʀ퀀ҵ퀀퀀퀥퀀퀀ʀ퀀 -ҵ퀀퀀퀥퀀퀀튀Іδсʀ轠Й -Ùȇӆőȶ䣴䛀ՠنٛЊ -ЋΛŶŶէۀ΢ېӆڑ惭ȶȎ䴁䛡Թن -نЊЋ޹Қ͏ʸ߭вӅϟ -ˋ⦛نݜؤղۍܿݕǓ˶ߏ -מ˜ڶ⟦Կ̲ۤ鴌Ɋ›ڊؾنʼ -ӄ۵۹ȴŰ囫ݒªۓ˪ؿ -識܂Ѫ؈Ł˗쁁Λ޶ɱϑ±ݐη驴 -á𤭤Ůރ郹𶦔Ƌѩ۱ -ʣ䍫Χʰ·ש׌Գ´٦͘сܾۼ -囚ʻί緆גԜʭ̪ë郭ζЋ¢ߚ̰ -Əщ⣻ݔϠʚ󿱽ࣳ© -挞׹Ų圭ئنʝ٦ÊԮԶ -ڔЫÀͲ틠٦ΚӋ϶ߐ䘢攡 -߸򁲱Ÿ漣׌Ժݸϙ٪襾֔δ -֪Ճ޲򻣌ě̹ɇ꽠Й͹ -ɆŗֻձҴ𻅗Փ郭ȚΟ -Ҷۈېӆڙ迚펦ٝ -ۤېڙʟߔѿʭ쓗ը͓ -Εȶ䴁䖳ѓͪų֣իÇ䟓œ -ȚȽΧЂȬʓӐތʫޤ郭֭ -淝隫榪ɘŸʫէȜ郭ܙ -׻Ȭ郭ȶېӆڑ풞߭ΛŶ҆ -ȶ䴁郭ۄΛŶŶۀېӆё郭ȶ -ȶ䴁›نݠنЙʓއІδ -сʀ轠ЙÙȇӆҵ퀀퀀퀥퀀퀀ʀ퀀ҵ퀀 -퀀퀥퀀퀀ʀ퀀ҵ퀀菈ҩІδʀ轠 -ÙŀĆőෝȶ䴁›نݠن -ЋΛŶŶۀېĆڑ郭ȶȶ䴁䛀䛒 -ننЊЋΛɁ눪ըٛɶ䴁϶ -٦ׅݲ̶룵ن٦ȅǧ -˯˴̕競ɧΧҼ֯Ւܙ҄Ԝǧ -轿˵郭ܙ҄Ԝݣ֦åĿ識ހϱӪрҥԖ -ҰʦԸؓنʽ٦Ҿﴑ‚阍‚ݦ -ރ郭ǁ屡ݝț߽ΕԦ҉Ƌת֛տ -őק͍ʽƷϤќ동ʕχڰ -۪񴎤˥ǯӯЄסȡėχ锼ܚڰ۪ -ɧ캭Ӻ茙暮ȶ֝ܛ٦Ξ -ǧҶڪȕ캎Ž׋݁ݲ¸ -Щ펓Ѽϱ轠ߊ⬕įគ -ر轠ߊى­͟Ȭ޶Ş֢ -جۤ۽ƣ̶βƌ鹾ȫݰ -ۀنƶ钔孚˷ނۀنע”Ϋ -ᶢѫ̶βμƭ٦о̼삀 -ꑘ΁迓۪قʕϴಔʶ짃ߓ -Β٥ѹ꫑ܔèԀҶȶͩ -º޵НҀȶɶڀˣ۳޷ܱě盀 -نŶѐ䛀ن٨Ńʀ -Խ -Ќ샀샀샪Ӵ -&] -[s0;*@3%- &] -[s2;:ArrayCtrl`:`:class:%- [@(0.0.255)3 class][3 _][*3 ArrayCtrl][3 _:_][@(0.0.255)3 public][3 _][*@3;3 C -trl]&] -[s2; &] -[s0; [* -@@image:1843&731 -ώĎОހፀ񈀹ܐ¤Ȑʲݢ歐ň -ˮʫݳ۽ߡ섂󝰏ĥ퐗™ -Ӛ񔠛鷾ʬߝݾ΀諒ےˏ· -ɴЮ߶М⎩җݭϹ뭝ǯ -׳膱ۮй߼ЅכʴŞ˕ݖ -ӽݸɮࣦ΄ٯ臗呹ݩǐ -ز׹وɀح̗בӽ -לΫ痻̜Ɛæ벼تԬɿă -ߗՑ螦ٴʈĕ󺪡򏷱뻿 -ί̹˿򯽼󈄢ʨΤ -訄Ǚ׽֠퟉߇ۏş޻مƵϗΨ -ЉۃĆ狶μΉԯɕ苾ʉܿ -ۭеݼǓȡշޥdž߻ӌ -爻㫪ҟ㗟ݔυ޽ϞˬņΣܾʼ -йѹݗijۦ˒콜ϭ陆 -޸貞àʾچ֧ŜҺրפ嘺 -˺׸ЕȪˠݣ§Еӄɨ -՜ɛܝ怺Ջκ݉逺Π݉逺Ĝ瘟ֆÆ -ЕǓì̤ڛꦍ݉ɛɋᖦҿݭǝ郺ᢎ -꧵ٜɋᖦҿݫҥֈԭ٘ȝў -Ӑ蒝Јܸܙט㌳ЅߧɏЪϸǓӠ̤혌㻀 -ʨ٘ȝܱ輡רĜ瘅ԡċ֏Ǚᢐꇮȩ -٘ĽǙܣᮃîЕǓɇ頫 -怺ԟüΤͩʄױ݉Љ򈎳ЯעĂˠ뉬—ј -ړ褅衪Ծ㻥ߧ·Ԣҝӆ -ԖڈǼԢڀ䘰᢯ĭ檕чۘ鸞֞ϕڈǩ -ǢꏝȗےܲژȡыҞЅ‡̮ܻ褅񊓵 -á틵ȗ褧衪怆ݐҌ˘̭ԟ훩 -Īލç䵐Әŏ銗ٲ¤ĭĪՅ첌 -Ȇڲע…Ă³ńµ²ខ怺 -Ľ՚Ղ➔͚Ъ؀Ҁ݉郺ᢎ¾꧵ -ݦū振޹郺ᢎĺĴݙ鮙ꊺǓì̤؛Ѥ -ΰ穀вԖǗԐǓӠä̤蔏ȗЀϷΰ -Ĝ瘅ԡއŠ꯵ԭ٘ȝڱҒ򲣄Ǚ -ܠ޲ǝ򲦌Ĝ瘅ԡžѽ褅ΰѐʡ -郺ᢎ꧵ѽ褅͚ԞĽκ݉ -˸펷ӽƄń璪ӭĨǙ溒溒م -՘䎕ދ֞ӕȰ޴踅ڡխ͵یˉߕɼۙژݸ -ы͞ɕјȐ롆ЕȌދڱ踅խݮlj -ܣɛɋĠ㔦Փ˸ÙȰҡދ踋ճՁѪ -ɋģ㔦Ê턺燄 -]&] -[s0;* &] -[s0; [* ArrayCtrl] implements basic grid functionality. It is typically -used for display and editation of arrays of values or (heterogeneous) -records. The records correspond to rows in the array, the individual -fields within each record can be either bound to columns or to -any generic [* Ctrl]`'s, thus supporting basic master`-detail functionality -with practically no additional cost.&] -[s0; &] -[s0; The standard derived classes extend various aspects of the ArrayCtrl -functionality. [* SqlArray] adds the nuts and bolts needed for -editing SQL`-based tables, whereas [* PopupTable] couples the ArrayCtrl -functionality with the drop`-down mechanism very similar to the -one used in popup menus. This opens the door for implementing -drop`-down controls like [* DropList] (aka [/ combo box]) or [* DropChoice] -(usually used together with a control of the [* EditField ]or [* DataPusher] -family to support coupling native data editation with drop`-down -selection, widely used for history or commonly used predefined -values. The [* ArrayPair] is, as its name implies, a pair of [* ArrayCtrl]`'s -with arrow buttons between them allowing to visually select subsets -of a certain set by moving its elements between the two lists.&] -[s0; &] -[s0; [*+117 The array data organization: indices and columns]&] -[s0; &] -[s0; There is a great deal of genericity supported by the ArrayCtrl -with respect both to its source data and its visual presentation. -Conceptually, the source array data is a matrix of [* Value]`'s. -There is a series of methods for accessing this source data, -the basic ones being [* Set] and [* Get]. The rows are addressed -by integer indices (zero based), the columns can be addressed -either by integer indices as well, or alternatively any source -column can be assigned an [* Id] identifier and addressed by it. -This is especially helpful in SQL`-based tables, where the table -column names can be used for the [* Id]`'s. A pair of methods, -[* GetPos] and [* GetId], can be used to translate these two column -addressing modes. In the code terminology, the columns in the -source data matrix are called [/ indices] whereas the visual (output) -columns are called simply [/ columns].&] -[s0; &] -[s0; The visual ArrayCtrl structure can be entirely independent of -the source data strucrure (although it`'s seldom helpful to make -the mapping completely arbitrary). Basically, each column can -have an arbitrary number of indices defining its source data. -Of course, the most common case is one index per column. This -is also simplest to address, because the column indices are equal -to the source data indices. However, many other combinations -are possible, each of which can be handy in certain situations:&] -[s0; &] -[s0;i150;O0; Index without a column: the most common of the `"special`" -cases is used mainly for row id`'s or other internally important -data without visual representation. The same behaviour can be -obtained by making a column invisible.&] -[s0;i150;O0; Column without an index (a [/ rownum column]): this less -common case can be used to display external data (not stored -in the table). &] -[s0;i150;O0; Multiple columns sharing the same index: this can be -used to display various aspects of a complex data object or to -display the same source data in multiple ways (e.g., a temperature -reading in Celsius and Fahrenheit degrees).&] -[s0;i150;O0; Column with multiple indices: can be used to display -information gathered from multiple source data columns. This -is used for instance in IconDes in TheIDE to display image identifiers -together with their sizes in the list. This is the most complicated -case because you have to implement a specific [* Display] for such -a multi`-index column.&] -[s0; &] -[s0; [* Note:] in the current U`+`+ version, the implementation of index`-less -columns (arrays with external data not stored in the source matrix) -is rather awkward. It is planned to enhance this feature in the -future by adding support for access to external data via a data -accessor interface object. &] -[s0; &] -[s0; [*+117 ArrayCtrl GUI: selection, editation, and local menu]&] -[s0; &] -[s0; Array rows can be selected using the mouse or keyboard. ArrayCtrl`'s -support both single`-selection (plain cursor) and multiselection -model. Of course, row selection can be controlled via the programmatic -array interface as well. The selection and cursor always spans -entire rows, it is not possible (without substantical patchwork) -to select only certain columns or individual cells.&] -[s0; &] -[s0; The ArrayCtrl rows can be inserted, edited and deleted either -programmatically, or via common GUI elements (mouse and keyboard -selection, local menu). It is possible to alter the standard -ArrayCtrl local menu using the [* WhenBar] callback.&] -[s0; &] -[s0; [* Note:] it is worth noting that the standard editation keys ([* Insert] -`= row insertion, [* Ctrl`+Enter] `= editation and [* Ctrl`+Delete] -`= deletion) are not hardcoded in the ArrayCtrl`'s [* Key] method, -they are mere hotkeys for the relevant local menu items. When -you change the ArrayCtrl`'s local menu, the editation hotkeys -change accordingly.&] -[s0; &] -[s0; A special but rather important case of array editation is [/ sorting]: -there is no specific standard GUI for that. If you aren`'t content -with programmatic sorting (e.g. after opening a dialog or after -loading the array data), you have to implement some GUI for that -as well. In certain cases, it is cool to use the [* HeaderCtrl] -[* WhenAction] method to allow sorting the array by clicking on -the header columns; alternatively you can add a sort function -to the array local menu or possibly somewhere else (like a standalone -button in the dialog).&] -[s0; &] -[s0; [* Insertion tricks: before, after, and the secrets of the AppendLine]&] -[s0; &] -[s0; In todays text editors, when you type a new letter, it is trivial -to see where in the text will the new letter go. This is so because -the caret is always positioned between a pair of successive letters -and thus is well defines the insertion spot. Additionally, the -caret can be placed in front of the first letter or after the -last letter, which naturally allows typing some text at the very -beginning or end.&] -[s0; &] -[s0; When inserting new rows into the array controls, things are -a bit more tricky. This is so because, unlike in the text editor, -the cursor is not placed [/ between] two successive rows, but [/ over] -a certain row. This is of course necessary to make row editing -possible (note that in the aforementioned text editor analogy, -a single letter is an atomic object whereas in the array it is -a potentially complex structure consisting of many columns and -data items). However, when it comes to row insertion, it has -two main troubles as its implication:&] -[s0; &] -[s0;i150;O9; [* 1.]-|It is necessary to decide somehow whether the new -row will go [/ above] or [/ below] the cursor row.&] -[s0;i150;O9; [* 2.]-|In an array with [/ n] rows, there are [/ n`+1] possible -locations for a new row (before the row #0, #1 ... #([/ n`-1]) -and after the last row), but only [/ n] distinct cursor locations.&] -[s0; &] -[s0; Over the years, during the development of U`+`+, we experimented -with multiple ways to overcome these logical problems. As a result -of this, the ArrayCtrl supports a few methods allowing to fine`-tune -the row insertion mechanism. It is also worth noting that there -are cases, like in the case of SQL`-based tables, where the row -ordering is arbitrary or implicit and the exact `'location`' -of a new row doesn`'t make any sense. In such cases, it is possible -to replace array [/ insertion] function with the [/ append] function -emphasizing the fact that the visual row order is unimportant -and that insertion means merely adding a new record to the record -set.&] -[s0; &] -[s0; For arrays in which the order is important, there are two ways -to solve the [/ n`+1] row positions dilemma:&] -[s0; &] -[s0;i150;O9; [* 1.]-|Replacing the Insert function with a pair of functions -for inserting a new row [/ before] / [/ after] the current row.&] -[s0;i150;O9; [* 2.]-|Visually extending the array by adding a pseudo`-row -with no real data at its end; this creates the [/ n`+1]`-th cursor -position necessary to denote all the available row insertion -locations.&] -[s0; &] -[s0; In the first case, it is also possible to select which of the -insertion functions (before / after) takes precedence (which -of the two actions should be bound to the standard [* Insert] hotkey). -This corresponds to the [* BeforeAfterInserting] and [* AfterBeforeInserting] -methods. The second case is called the [* AppendLine] and is activated -by setting the property with the same name.&] -[s0; &] -[s0; To make all this even more interesting, a special mechanism -called [* InsertAppend] is available to make array filling as easy -as possible. When activated and the user appends a new row at -the table end, after pressing [* Enter] (to commit the inserted -row) another row is automatically added after it and opened for -editing. This mechanism is turned on by default, but it can be -disable by setting the [* NoInsertAppend] property to true.&] -[s3; &] -[s0; &] -[s0;%- &] -[ {{10000t/25b/25@3 [s0;%- [*@(229)4 Categorized method summary]]}}&] -[s4; The following table summarizes ArrayCtrl methods according to -the aspect of functionality they support together with a very -brief description. For more thorough documentation of the individual -methods see below.&] -[s0; &] -[ {{2337:7663-1 [s0; [* Initialization and configuration]] -:: [s0;%- ] -:: [s0; Reset] -:: [s0; clears column `& index definition and restores all ArrayCtrl -default properties] -:: [s0; IsEdit] -:: [s0; true `= array state automaton is currently in row editing mode] -:: [s0; IsInsert] -:: [s0; true `= array state automaton is currently in row insertion -mode] -:: [s0; SetLineCy] -:: [s0; sets array row height (global or individual for a single row)] -:: [s0; GetLineCy] -:: [s0; returns logical array row height (value set by preceding SetLineCy)] -:: [s0; GetLineY] -:: [s0; returns [/ y] position of given row (relative to table beginning)] -:: [s0; `[No`]AppendLine] -:: [s0; `[do not`] display an additional pseudo`-row used for row insertion] -:: [s0; IsAppendLine] -:: [s0; returns actual value of the [* AppendLine] property] -:: [s0; ShowAppendLine] -:: [s0; scrolls the table view to display the appending line] -:: [s0; `[No`]Inserting] -:: [s0; `[do not`] allow inserting new rows] -:: [s0; IsInserting] -:: [s0; returns actual value of the [* Inserting] property] -:: [s0; BeforeAfterInserting] -:: [s0; allow inserting rows before / after current row (default `= -before)] -:: [s0; AfterBeforeInserting] -:: [s0; allow inserting rows before / after current row (default `= -after)] -:: [s0; NoInsertAppend] -:: [s0; do not autoinsert another row after committing last row insertion] -:: [s0; IsEditing] -:: [s0; true `= (at least one column of the) ArrayCtrl supports editing] -:: [s0; `[No`]Duplicating] -:: [s0; `[do not`] allow row duplication] -:: [s0; IsDuplicating] -:: [s0; returns actual value of the [* Duplicating] property] -:: [s0; Appending] -:: [s0; allow appending new row at the table end] -:: [s0; IsAppending] -:: [s0; returns actual state of the [* Appending] property] -:: [s0; AutoAppending] -:: [s0; allow appending new row at the table end, Enter appends another -one] -:: [s0; IsAutoAppending] -:: [s0; returns actual state of [* AutoAppending] property] -:: [s0; `[No`]Removing] -:: [s0; `[do not`] allow table row removing] -:: [s0; IsRemoving] -:: [s0; returns actual state of the [* Removing] property] -:: [s0; `[No`]AskRemove] -:: [s0; `[do not`] prompt user to confirm row removal] -:: [s0; IsAskRemove] -:: [s0; returns actual state of the [* AskRemove] property] -:: [s0; Moving] -:: [s0; allow row swapping (moving a row before / after neighbouring -row)] -:: [s0; IsMoving] -:: [s0; returns actual state of the [* Moving] property] -:: [s0; `[No`]Header] -:: [s0; `[do not`] display table header] -:: [s0; `[No`]Track] -:: [s0; `[do not`] animate tracking table column widths] -:: [s0; `[No`]VertGrid] -:: [s0; `[do not`] display column breaks] -:: [s0; `[No`]HorzGrid] -:: [s0; `[do not`] display row breaks] -:: [s0; `[No`]Grid] -:: [s0; `[do not`] display both grids (VertGrid `+ HorzGrid)] -:: [s0; GridColor] -:: [s0; set grid line color] -:: [s0; EvenRowColor] -:: [s0; background color for even rows] -:: [s0; OddRowColor] -:: [s0; background color for odd rows] -:: [s0; RowFormat] -:: [s0; formats menu items substituting given word for the term `'row`'] -:: [s0; RowName] -:: [s0; sets the context`-relevant word to substitute for `'row`' in -the local menu texts] -:: [s0; NoCursor] -:: [s0; do not highlight cursor row] -:: [s0; `[No`]MouseMoveCursor] -:: [s0; automatically move cursor as the mouse moves (used e.g. in PopupTable)] -:: [s0; `[No`]AutoHideSb] -:: [s0; `[do not`] display scroll bar only when necessary] -:: [s0; MultiSelect] -:: [s0; enable selecting multiple rows at the same time] -:: [s0; ColumnWidths] -:: [s0; sets logical column widths using a formatted string, e.g. `"1 -5 10 10 5 1`"]}}&] -[s0; &] -[ {{2337:7663-1 [s0; [* Array index `& column structure management]] -:: [s0;%- ] -:: [s0; IndexInfo] -:: [s0; returns the [* IdInfo] structure describing an index (see below)] -:: [s0; AddIndex] -:: [s0; adds a new index to the source data matrix] -:: [s0; GetIndexCount] -:: [s0; returns number of index columns (columns in the source data -matrix)] -:: [s0; GetId] -:: [s0; returns identifier of a given index (given by its integral index)] -:: [s0; GetPos] -:: [s0; returns integral index of source matrix column ([/ index]) identified -by an [* Id]] -:: [s0; SetId] -:: [s0; sets the [* Id] identifier for a given index (column of the source -matrix)] -:: [s0; AddKey] -:: [s0; sets up the first index to act as primary key (often used for -SQL tables)] -:: [s0; GetKeyId] -:: [s0; returns primary key identifier (equal to [* GetId(0)])] -:: [s0; AddColumn] -:: [s0; adds a column`-index pair to the table (one data column, one -output column)] -:: [s0; AddColumnAt] -:: [s0; adds a column bound to a given index] -:: [s0; AddRowNumColumn] -:: [s0; adds a column without an index (used for external data)] -:: [s0; GetColumnCount] -:: [s0; returns number of (visual) columns in the table] -:: [s0; FindColumnWithPos] -:: [s0; locates table column according to given index number] -:: [s0; FindColumnWithId] -:: [s0; locates table column according to index identifier] -:: [s0; ColumnAt] -:: [s0; returns the [* ArrayCtrl`::Column] structure describing given column] -:: [s0; HeaderTab] -:: [s0; returns the [* HeaderCtrl`::Column] structure for the given column] -:: [s0; HeaderObject] -:: [s0; returns a reference to the [* HeaderCtrl] object for this table] -:: [s0; SerializeHeader] -:: [s0; serialize header layout information (column widths etc.)] -:: [s0; AddCtrl] -:: [s0; adds an outer control`-index pair to the table (one data column, -one outer Ctrl)] -:: [s0; AddCtrlAt] -:: [s0; adds an outer control bound to a given index] -:: [s0; AddRowNumCtrl] -:: [s0; adds an outer control without an index `- used ([/ seldom]) for -external data] -:: [s0; SetDisplay] -:: [s0; sets display for a given table column or cell] -:: [s0; GetDisplay] -:: [s0; returns column / cell display] -:: [s0; SetCtrl] -:: [s0; sets a [* Ctrl] object for custom editation of a given cell] -:: [s0; GetTotalCy] -:: [s0; returns total row height] -:: [s0; GetLineAt] -:: [s0; locate table row when given an [/ y] position (relative to table -top)] -:: [s0; GetClickColumn] -:: [s0; returns column number of last clicked column (Null if clicked -outside existing rows)] -:: [s0; GetClickRow] -:: [s0; returns row number of last clicked row (Null if clicked outside -existing rows)] -:: [s0; GetClickPos] -:: [s0; returns Point(GetClickColumn(), GetClickRow())]}}&] -[s0; &] -[ {{2337:7663-1 [s0; [* Data setting `& retrieval]] -:: [s0;%- ] -:: [s0; SetCount] -:: [s0; sets number of rows in the array] -:: [s0; SetVirtualCount] -:: [s0; sets number of rows in the array with external data] -:: [s0; GetCount] -:: [s0; returns number of rows] -:: [s0; Clear] -:: [s0; clears array data, identical to [* SetCount(0)]] -:: [s0; Shrink] -:: [s0; shrinks source data matrix to the minimum necessary size] -:: [s0; Get] -:: [s0; returns given Value element of the source data matrix] -:: [s0; GetOriginal] -:: [s0; returns given element of source data matrix before editation] -:: [s0; Set] -:: [s0; sets given element of the source data matrix] -:: [s0; GetKey] -:: [s0; returns given primary key (column #0 in the data matrix)] -:: [s0; GetOriginalKey] -:: [s0; returns `'old`' value of primary key before editation] -:: [s0; GetColumn] -:: [s0; returns value of a given output column (according to its index -mapping)] -:: [s0; GetConvertedColumn] -:: [s0; returns value of a given output column after applying its [* Convert]] -:: [s0; ReadRow] -:: [s0; returns a row of the source data matrix] -:: [s0; Add] -:: [s0; adds a new row at the end of table] -:: [s0; Insert] -:: [s0; inserts a new row into the table] -:: [s0; Remove] -:: [s0; removes a given table row] -:: [s0; SwapUp] -:: [s0; exchanges a table row with the preceding row] -:: [s0; SwapDown] -:: [s0; exchanges a table row with the next row] -:: [s0; Sort] -:: [s0; sorts table rows using a given predicate] -:: [s0; ClearCache] -:: [s0; clears data conversion cache] -:: [s0; InvalidateCache] -:: [s0; invalidates given table row in the conversion cache]}}&] -[s0; &] -[ {{2337:7663-1 [s0; [* Cursor `& selection management]] -:: [s0;%- ] -:: [s0; GetSelectCount] -:: [s0; returns number of currently selected rows] -:: [s0; IsSelection] -:: [s0; checks whether any rows are selected (identical to [* GetSelectCount() -> 0])] -:: [s0; Select] -:: [s0; selects / unselects given row or a series of rows] -:: [s0; IsSelected] -:: [s0; checks whether given row is selected] -:: [s0; ClearSelection] -:: [s0; clears the current selection] -:: [s0; SetCursor] -:: [s0; moves array cursor to a new row] -:: [s0; KillCursor] -:: [s0; removes the cursor away from the table] -:: [s0; CancelCursor] -:: [s0; cancels editation of current row] -:: [s0; IsCursor] -:: [s0; checks whether cursor is in the table (identical to [* GetCursor() ->`= 0])] -:: [s0; GetCursor] -:: [s0; returns current cursor row, `-1 when none] -:: [s0; GoBegin] -:: [s0; moves the cursor to the first table row] -:: [s0; GoEnd] -:: [s0; moves the cursor to the last table row] -:: [s0; GetCursorSc] -:: [s0; returns the location of the cursor row within the table view -area] -:: [s0; ScCursor] -:: [s0; scrolls the table to move the cursor row to given location within -the table view] -:: [s0; CenterCursor] -:: [s0; scrolls the table to move cursor into the middle of the current -view] -:: [s0; ScrollInto] -:: [s0; scrolls the table by minimum amount necessary to make given -row visible] -:: [s0; ScrollIntoCursor] -:: [s0; scrolls the table by minimum amount necessary to make cursor -row visible] -:: [s0; GetScroll] -:: [s0; returns current table scrollbar location] -:: [s0; ScrollTo] -:: [s0; sets table scrollbar location] -:: [s0; Find] -:: [s0; locates table row containing a given element] -:: [s0; FindSetCursor] -:: [s0; moves the cursor to table row containing a given element]}}&] -[s0; &] -[s0; &] -[s0; &] -[ {{2337:7663-1 [s0; [* GUI elements]] -:: [s0;%- ] -:: [s0; StdBar] -:: [s0; the default array local menu] -:: [s0; IsModified] -:: [s0; checks modification state of given array cell] -:: [s0; StartEdit] -:: [s0; open current array row for editing] -:: [s0; GetEditColumn] -:: [s0; returns the column being currently edited] -:: [s0; DoEdit] -:: [s0; corresponds to the local menu `'Edit`' function] -:: [s0; DoInsert] -:: [s0; corresponds to the local menu `'Insert`' function] -:: [s0; DoInsertBefore] -:: [s0; corresponds to the local menu `'Insert before`' function] -:: [s0; DoInsertAfter] -:: [s0; corresponds to the local menu `'Insert after`' function] -:: [s0; DoAppend] -:: [s0; corresponds to the local menu `'Append`' function] -:: [s0; DoRemove] -:: [s0; corresponds to the local menu `'Remove`' function] -:: [s0; DoDuplicate] -:: [s0; corresponds to the local menu `'Duplicate`' function] -:: [s0; DoSelectAll] -:: [s0; selects the entire array] -:: [s0; AcceptEnter] -:: [s0; commits the currently edited row and possibly begins insertion -of another row]}}&] -[s0; &] -[ {{2337:7663-1 [s0; [* Notification callbacks]] -:: [s0;%- ] -:: [s0; WhenLeftClick] -:: [s0; left mouse click within the array] -:: [s0; WhenLeftDouble] -:: [s0; left mouse doubleclick within the array] -:: [s0; WhenSel] -:: [s0; called when cursor or selection status of widget changes] -:: [s0; WhenCursor] -:: [s0; called whenever the cursor location changes [/ (deprecated, use -WhenSel)]] -:: [s0; WhenKillCursor] -:: [s0; called when the cursor moves away from the table [/ (deprecated, -use WhenSel)]] -:: [s0; WhenSelection] -:: [s0; called whenever current selection changes [/ (deprecated, use -WhenSel)]] -:: [s0; WhenEnterRow] -:: [s0; called whenever the cursor moves to a new row [/ (deprecated, -use WhenSel)]] -:: [s0; WhenUpdateRow] -:: [s0; called after updating a row] -:: [s0; WhenAcceptRow] -:: [s0; additional row validation callback] -:: [s0; WhenStartEdit] -:: [s0; called after initiating row editation] -:: [s0; WhenAcceptEdit] -:: [s0; called after accepting changes to a given row] -:: [s0; WhenArrayAction] -:: [s0; called whenever array source data changes (after insert / delete -/ edit)] -:: [s0; WhenBar] -:: [s0; can be used to supply custom local menu for the array] -:: [s0; WhenCtrlsAction] -:: [s0; called by [* WhenAction] callbacks of internally created controls]}}&] -[s3; &] -[s0; &] -[s0; &] -[s0;%- &] -[ {{10000t/25b/25@3 [s0;%- [*@(229)4 Detailed method description]]}}&] -[s0; &] -[s0; [* Initialization and configuration]&] -[s3; &] -[s0; &] -[s1;:ArrayCtrl`:`:Reset`(`):%- [@(0.0.255) void]_[* Reset]()&] -[s5; Clears table rows and resets all array properties to their default -values.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:ShowAppendLine`(`):%- [@(0.0.255) void]_[* ShowAppendLine]()&] -[s5; Show an additional pseudo`-row at the table end. When clicked, -a new row is appended to the array.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:IsEdit`(`)const:%- [@(0.0.255) bool]_[* IsEdit]()_[@(0.0.255) const]&] -[s5; Checks whether the array is currently being edited.&] -[s7; [*/ Return value]-|[* true] `= a row is currently open for editing, -[* false] `= array is in normal browsing mode&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:IsInsert`(`)const:%- [@(0.0.255) bool]_[* IsInsert]()_[@(0.0.255) const]&] -[s5; Checks whether a new row is currently being inserted.&] -[s7; [*/ Return value]-|[* true] `= newly inserted row is currently being -edited, [* false] when not&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:SetLineCy`(int`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* SetLineCy]( -[@(0.0.255) int]_[*@3 cy])&] -[s5; Sets the (default) array row height. For certain rows, this -can be overriden by the two`-parameter version of this method.&] -[s7; [%-*C@3 cy]-|row height in pixels&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:SetLineCy`(int`,int`):%- [@(0.0.255) void]_[* SetLineCy]([@(0.0.255) int]_ -[*@3 i], [@(0.0.255) int]_[*@3 cy])&] -[s5; Sets row height for a given row. This overrides the default -value set by the one`-parameter version of this method.&] -[s7; [%-*C@3 i]-|row index (zero based)&] -[s7; [%-*C@3 cy]-|row height in pixels, [* Null] `= use default row height&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:GetLineCy`(`)const:%- [@(0.0.255) int]_[* GetLineCy]()_[@(0.0.255) const]&] -[s5; Returns default array row height.&] -[s7; [*/ Return value]-|row height in pixels&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:GetLineY`(int`)const:%- [@(0.0.255) int]_[* GetLineY]([@(0.0.255) int]_[*@3 i -])_[@(0.0.255) const]&] -[s5; Returns [/ y] position of given array row (the pixel distance -between the top of first array row and [/ i]`-th row, i.e. sum -of heights of all rows above this row).&] -[s7; [%-*C@3 i]-|row index (zero based)&] -[s7; [*/ Return value]-|Vertical position of row top in pixels (relative -to array beginning)&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:GetLineCy`(int`)const:%- [@(0.0.255) int]_[* GetLineCy]([@(0.0.255) int]_ -[*@3 i])_[@(0.0.255) const]&] -[s5; Returns the height of a given row (either the row`-specific -row height, or, when Null, the default row height).&] -[s7; [%-*C@3 i]-|row index (zero based)&] -[s7; [*/ Return value]-|row height in pixels&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:AppendLine`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* AppendLi -ne]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&] -[s5; The AppendLine property controls whether the array displays -an additional `'append`' row after its last (real) row. &] -[s7; [%-*C@3 b]-|[* true] `= display appending row, [* false] `= hide it&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:NoAppendLine`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoAppendLi -ne]()&] -[s5; Hide the appending line (identical to [* AppendLine(false)]).&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:IsAppendLine`(`)const:%- [@(0.0.255) bool]_[* IsAppendLine]()_[@(0.0.255) c -onst]&] -[s5; Returns current state of the [* AppendLine] property.&] -[s7; [*/ Return value]-|[* true] `= display appending pseudo`-row at the -end of the array&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Inserting`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* Inserting -]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&] -[s5; Enable / disable inserting new rows in the array (no matter -which insertion mechanism is selected).&] -[s7; [%-*C@3 b]-|[* true] `= enable insertion, [* false] `= disable it&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:NoInserting`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoInserting -]()&] -[s5; Disables row insertion (identical to [* Inserting(false)]).&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:IsInserting`(`)const:%- [@(0.0.255) bool]_[* IsInserting]()_[@(0.0.255) c -onst]&] -[s5; Returns current state of the [* Inserting] property.&] -[s7; [*/ Return value]-|[* true] `= row insertion is enabled, [* false] -when not&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Appending`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* Appending -]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&] -[s5; Enable / disable adding new rows at the table end.&] -[s7; [%-*C@3 b]-|[* true] `= enable row appending, [* false] `= disable -it&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:IsAppending`(`)const:%- [@(0.0.255) bool]_[* IsAppending]()_[@(0.0.255) c -onst]&] -[s5; Returns current state of the [* Appending] property.&] -[s7; [*/ Return value]-|[* true] `= appending rows is enabled, [* false] -when not.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:AutoAppending`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* AutoA -ppending]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&] -[s5; Same as [* Appending] but Enter pressed when editing a new row -accepts it and adds another one at the table end.&] -[s7; [%-*C@3 b]-|[* true ]to enable the mode&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:IsAutoAppending`(`)const:%- [@(0.0.255) bool]_[* IsAutoAppending]()_[@(0.0.255) c -onst]&] -[s5; Returns current state of [* AutoAppending] property.&] -[s7; [*/ Return value]-|[* true] `= [* AutoAppending ]is active&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:BeforeAfterInserting`(int`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_ -[* BeforeAfterInserting]([@(0.0.255) int]_[*@3 q]_`=_[@3 1])&] -[s5; Activate before / after row insertion mechanism ([* Insert] hotkey -`= before).&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:AfterBeforeInserting`(int`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_ -[* AfterBeforeInserting]([@(0.0.255) int]_[*@3 q]_`=_[@3 2])&] -[s5; Activate before / after row insertion mechanism ([* Insert] hotkey -`= after)&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Duplicating`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* Duplica -ting]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&] -[s5; Enable / disable row duplication. Note that this property only -controls whether the `'Duplicate`' item should be present in -the array local menu. Of course, nothing can prevent you from -supporting duplication in some other way, or from calling the -[* DoDuplicate] method as you see fit.&] -[s7; [%-*C@3 b]-|[* true] `= enable duplication, [* false] `= disable it&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:NoDuplicating`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoDuplica -ting]()&] -[s5; Disable row duplication (identical to [* Duplicating(false)]).&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:IsDuplicating`(`)const:%- [@(0.0.255) bool]_[* IsDuplicating]()_[@(0.0.255) c -onst]&] -[s5; Returns the state of the [* Duplicating] property.&] -[s7; [*/ Return value]-|[* true] `= local menu offers row duplication, -[* false] when not&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:NoInsertAppend`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoIn -sertAppend]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&] -[s5; Enables / disables the auto`-append mechanism (see above section -on inserting rows).&] -[s7; [%-*C@3 b]-|[* true] `= disable InsertAppend mechanism, [* false] `= -enable it (the default)&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:IsEditing`(`)const:%- [@(0.0.255) bool]_[* IsEditing]()_[@(0.0.255) const -]&] -[s5; Checks whether at least one array column supports editing (whether -it is possible to [/ open] a row for editation).&] -[s7; [*/ Return value]-|[* true] `= row editing is possible, [* false] when -not&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Removing`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* Removing]( -[@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&] -[s5; Enable / disable deleting rows from the table.&] -[s7; [%-*C@3 b]-|[* true] `= enable deletion, [* false] `= disable it&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:NoRemoving`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoRemoving]( -)&] -[s5; Disable deleting table rows (identical to [* Removing(false)]).&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:IsRemoving`(`)const:%- [@(0.0.255) bool]_[* IsRemoving]()_[@(0.0.255) con -st]&] -[s5; Returns current state of the [* Removing] property.&] -[s7; [*/ Return value]-|[* true] `= row deletion is enabled, [* false ]when -not&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:AskRemove`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* AskRemove -]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&] -[s5; Sets whether the user must manually confirm array row deletion. -When set to [* true], every time a row is to be deleted, a confirmation -dialog pops up. When set to [* false], rows are deleted automatically -without any further confirmation.&] -[s7; [%-*C@3 b]-|[* true] `= prompt user to confirm row deletion, [* false] -`= delete rows instantly&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:NoAskRemove`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoAskRemove -]()&] -[s5; Disables user confirmation of row deletion (equivalent to [* AskRemove(false)]).&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:IsAskRemove`(`)const:%- [@(0.0.255) bool]_[* IsAskRemove]()_[@(0.0.255) c -onst]&] -[s5; Returns current state of the [* AskRemove] property.&] -[s7; [*/ Return value]-|[* true] `= user confirmation is needed to delete -rows, [* false] `= rows are deleted immediately&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Moving`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* Moving]([@(0.0.255) b -ool]_[*@3 b]_`=_[@(0.0.255) true])&] -[s5; Enable / disable row swapping. When set to [* true], it is possible -to move an array row up and down by swapping it with the previous -/ next row. This can be used to reorder array rows in a visually -straightforward manner.&] -[s7; [%-*C@3 b]-|[* true] `= offer row moving in the local menu, [* false] -`= don`'t&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:IsMoving`(`)const:%- [@(0.0.255) bool]_[* IsMoving]()_[@(0.0.255) const]&] -[s5; Returns current state of the [* Moving] property.&] -[s7; [*/ Return value]-|[* true] `= local menu supports row swapping, -[* false] `= it doesn`'t&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Header`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* Header]([@(0.0.255) b -ool]_[*@3 b]_`=_[@(0.0.255) true])&] -[s5; Show / hide the [*^topic`:`/`/CtrlLib`/src`/HeaderCtrl`$en`-us^ HeaderCtrl] -object for this table.&] -[s7; [%-*C@3 b]-|[* true] `= show table header, [* false] `= hide it&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:NoHeader`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoHeader]()&] -[s5; Hide table header (equivalent to [* Header(false)]).&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Track`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* Track]([@(0.0.255) b -ool]_[*@3 b]_`=_[@(0.0.255) true])&] -[s5; Animate array column resizing. This is equivalent to setting -the [*^topic`:`/`/CtrlLib`/src`/HeaderCtrl`$en`-us`#`:`:HeaderCtrl`:`:Track`(bool`)^ T -rack] property in the array HeaderCtrl.&] -[s7; [%-*C@3 b]-|[* true] `= repaint the array repeatedly while dragging -column widths, [* false] `= regenerate everything only after drag -`& drop is finished.&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:NoTrack`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoTrack]()&] -[s5; Do not animate array column resizing (equivalent to [* Track(false)]).&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:VertGrid`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* VertGrid]( -[@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&] -[s5; Show / hide vertical array grid lines (separating array columns).&] -[s7; [%-*C@3 b]-|[* true] `= show vertical grid lines, [* false] `= hide -them&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:NoVertGrid`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoVertGrid]( -)&] -[s5; Hide vertical grid lines (equivalent to [* VertGrid(false)]).&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:HorzGrid`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* HorzGrid]( -[@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&] -[s5; Show / hide horizontal grid lines (separating array rows).&] -[s7; [%-*C@3 b]-|[* true] `= show horizontal grid lines, [* false] `= hide -them&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:NoHorzGrid`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoHorzGrid]( -)&] -[s5; Hide horizontal grid lines (equivalent to [* HorzGrid(false)]).&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Grid`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* Grid]([@(0.0.255) b -ool]_[*@3 b]_`=_[@(0.0.255) true])&] -[s5; Show / hide both horizontal and vertical grid lines (equivalent -to [* HorzGrid(b).VertGrid(b)]).&] -[s7; [%-*C@3 b]-|[* true] `= show grid line matrix, [* false] `= hide all -grid lines&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:NoGrid`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoGrid]()&] -[s5; Hide horizontal and vertical grid lines (equivalent to [* Grid(false)]).&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:GridColor`(Color`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* GridColo -r]([_^Color^ Color]_[*@3 c])&] -[s5; Sets the color for grid lines.&] -[s7; [%-*C@3 c]-|new grid line color&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:EvenRowColor`(Color`,Color`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_ -[* EvenRowColor]([_^Color^ Color]_[*@3 paper]_`=_Blend(SColorMark, -SColorPaper, [@3 220]), [_^Color^ Color]_[*@3 ink]_`=_SColorText)&] -[s5; Sets the paper and ink (background and foreground) color for -even array rows. In certain cases setting a different background -color for odd and even rows helps to simplify visual orientation -in the arrays (especially when the array has many columns).&] -[s5; [* Note:] the even / odd row terminology refers to the natural -array row numbering, so first array row is [/ odd] and the second -is [/ even]. This is in contrast to the zero`-baesd integral row -indexing, where the first array row has index 0.&] -[s7; [%-*C@3 paper]-|background color to use for second, fourth, sixth -etc. array row&] -[s7; [%-*C@3 ink]-|foreground color for even rows&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:OddRowColor`(Color`,Color`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_ -[* OddRowColor]([_^Color^ Color]_[*@3 paper]_`=_SColorInfo, [_^Color^ Color]_[*@3 ink]_`=_S -ColorText)&] -[s5; Sets the paper and ink (background and foreground) color for -odd array rows.&] -[s7; [%-*C@3 paper]-|background color to use for first, third, fifth -etc. array row&] -[s7; [%-*C@3 ink]-|foreground color for odd rows&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:NoCursor`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoCursor]( -[@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&] -[s5; Turns on / off highlighting cursor row.&] -[s7; [%-*C@3 b]-|[* true] `= do not highlight cursor row, [* false] `= default -behaviour (cursor row is shown in inverse colors)&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:MouseMoveCursor`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* Mou -seMoveCursor]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&] -[s5; Enables / disables automatical cursor row switching as the mouse -cursor moves over the array rows.&] -[s7; [%-*C@3 b]-|[* true] `= automatically switch cursor row, [* false] -`= only upon clicks and keyboard navigation&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:NoMouseMoveCursor`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoMou -seMoveCursor]()&] -[s5; Disable automatical cursor row switching (equivalent to [* MouseMoveCursor(false)]) -.&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:AutoHideSb`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* AutoHide -Sb]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&] -[s5; When set to [* true], the vertical scrollbar at the right array -edge is displayed only when the total row height exceeds the -array view height. When set to [* false], the scrollbar is shown -all the time.&] -[s7; [%-*C@3 b]-|[* true] `= show / hide the scrollbar as necessary, [* false] -`= display it unconditionally&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:NoAutoHideSb`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoAutoHide -Sb]()&] -[s5; Display vertical scrollbar all the time (equivalent to [* AutoHideSb(false)]).&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:HideSb`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* HideSb]([@(0.0.255) b -ool]_[*@3 b]_`=_[@(0.0.255) true])&] -[s5; Hides vertical scrollbar (even if it would be needed).&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:AutoHideHorzSb`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* Auto -HideHorzSb]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&] -[s5; Makes horizontal scroll bar (active if HeaderCtrl is in absolute -mode only) to autohide. Default is on.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:NoAutoHideHorzSb`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoAuto -HideHorzSb]()&] -[s5; Same as AutoHideHorzSb(false).&] -[s3;%- &] -[s6;%- &] -[s1;:ArrayCtrl`:`:HideHorzSb`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* HideHorz -Sb]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&] -[s5; Unconditionally hides horizontal scrollbar (active if HeaderCtrl -is in absolute mode only).&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:MultiSelect`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* MultiSe -lect]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&] -[s5; Enable / disable multiple row selection. &] -[s7; [%-*C@3 b]-|[* true] `= allow selecting multiple rows at the same -time, [* false] `= only one row at a time&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:IsMultiSelect`(`)const:%- [@(0.0.255) bool]_[* IsMultiSelect]()_[@(0.0.255) c -onst]&] -[s5; Returns true if ArrayCtrl is in multiselect mode.&] -[s3;%- &] -[s6;%- &] -[s1;:ArrayCtrl`:`:NoBackground`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoBack -ground]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&] -[s5; Sets the widget into transparent mode `- background is not painted -and Transparent is activated `- a result, anything painted behind -the widget is visible, allowing client code to provide any background -it needs.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:PopUpEx`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* PopUpEx]([@(0.0.255) b -ool]_[*@3 b]_`=_[@(0.0.255) true])&] -[s5; Activates showing small popup windows with cell content when -mouse is over and cell is to big to fit current dimensions. Default -is activated.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:NoPopUpEx`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoPopUpEx]()&] -[s5; Same as PopUpEx(false).&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:NoFocusSetCursor`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoFocu -sSetCursor]()&] -[s5; Normally, when ArrayCtrl gets a focus and no cursor is set (and -cursor is allowed and there is at least one line), ArrayCtrl -a sets the cursor to the first line. This modifier deactivates -this feature.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:MovingHeader`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* Moving -Header]([@(0.0.255) bool]_[*@3 b])&] -[s5; Activates dragging columns in header. Default is active.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:NoMovingHeader`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoMoving -Header]()&] -[s5; Same as MovingHeader(false).&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:ColumnSortFindKey`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* C -olumnSortFindKey]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&] -[s5; Before ColumnSort orders the ArrayCtrl, the key of current row -(with cursor) is stored and after sorting, it is restored.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:AllSorting`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* AllSorting]( -)&] -[s5; If set, Sorting() is invoked for all columns (added either before -or after this modifier is called).&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:ColumnSortSecondary`(const ArrayCtrl`:`:Order`&`):%- [_^ArrayCtrl^ Ar -rayCtrl][@(0.0.255) `&]_[* ColumnSortSecondary]([@(0.0.255) const]_[_^ArrayCtrl`:`:Order^ O -rder][@(0.0.255) `&]_[*@3 order])&] -[s5; Sets secondary sorting predicate for column sorts (see ColumnSort, -Sorting) `- if two cells are equal when performing sort by column, -they are ordered by this predicate.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:NoColumnSortSecondary`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* N -oColumnSortSecondary]()&] -[s5; Same as ColumnSortSecondary(false).&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:ColumnWidths`(const char`*`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_ -[* ColumnWidths]([@(0.0.255) const]_[@(0.0.255) char]_`*[*@3 s])&] -[s5; Initializes column widths based on a text string containing -blank`-separated decimal numbers, e.g. `"1 4 6 4 1`".&] -[s7; [%-*C@3 s]-|control string defining column widths&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:CursorOverride`(const Image`&`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `& -]_[* CursorOverride]([@(0.0.255) const]_[_^Image^ Image][@(0.0.255) `&]_[*@3 arrow])&] -[s5; Overrides mouse cursor to [%-*@3 arrow]. Setting Null ends override.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:NoCursorOverride`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoCurs -orOverride]()&] -[s5; Same as CursorOverride(Null).&] -[s3;%- &] -[s6;%- &] -[s1;:ArrayCtrl`:`:RowFormat`(const char`*`):%- [_^String^ String]_[* RowFormat]([@(0.0.255) c -onst]_[@(0.0.255) char]_`*[*@3 s])&] -[s5; Formats a text by substituting [* %s] with the array`-specific -term for `'row`' (as set by the [* RowName] property). This is -used for array local menu items.&] -[s7; [%-*C@3 s]-|[* Format]`-like string to substitute.&] -[s7; [*/ Return value]-|&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:RowName`(const char`*`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* Row -Name]([@(0.0.255) const]_[@(0.0.255) char]_`*[*@3 s])&] -[s5; Sets the array`-specific term for `'row`'. This can be used -to customize the local menu terminology according to the logical -content of the array. For instance, when you have an array with -the list of employees, you can call [* RowName(`"employee`")] and -the menu items will then read [/ `'Insert new employee`', `'Delete -employee`'] etc.&] -[s7; [%-*C@3 s]-|the term to substitute for `'array row`' in menu items&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s0;* &] -[s0; [* Column structure programming]&] -[s3; &] -[s0;%- &] -[s1;:ArrayCtrl`:`:IndexInfo`(int`):%- [_^ArrayCtrl`:`:IdInfo^ IdInfo][@(0.0.255) `&]_[* Ind -exInfo]([@(0.0.255) int]_[*@3 ii])&] -[s5; Returns a reference to the [* IdInfo] structure describing a given -array index (column in the source data matrix).&] -[s7; [%-*C@3 ii]-|zero`-based ordinal number of the array index&] -[s7; [*/ Return value]-|IdInfo reference for the given index&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:IndexInfo`(const Id`&`):%- [_^ArrayCtrl`:`:IdInfo^ IdInfo][@(0.0.255) `& -]_[* IndexInfo]([@(0.0.255) const ][_^Id^ Id]`&_[*@3 id])&] -[s5; Returns a reference to the [* IdInfo] structure describing a given -array index.&] -[s7; [%-*C@3 id]-|the [* Id] index identifier&] -[s7; [*/ Return value]-|IdInfo reference for the given index&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:AddIndex`(const Id`&`):%- [_^ArrayCtrl`:`:IdInfo^ IdInfo][@(0.0.255) `& -]_[* AddIndex]([@(0.0.255) const] [_^Id^ Id]`&_[*@3 id])&] -[s5; Adds a new index to the array and assign it a given [* Id] identifier.&] -[s7; [%-*C@3 id]-|new index identifier&] -[s7; [*/ Return value]-|A reference to the [* IdInfo ]structure describing -the newly added index. The reference can be used to set additional -index properties.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:AddIndex`(`):%- [_^ArrayCtrl`:`:IdInfo^ IdInfo][@(0.0.255) `&]_[* AddInde -x]()&] -[s5; Adds a new index (without an identifier) to the array.&] -[s7; [*/ Return value]-|A reference to the [* IdInfo] structure describing -the newly added index.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:GetIndexCount`(`)const:%- [@(0.0.255) int]_[* GetIndexCount]()_[@(0.0.255) c -onst]&] -[s5; Returns number of indices in the array.&] -[s7; [*/ Return value]-|index count&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:GetId`(int`)const:%- [_^Id^ Id]_[* GetId]([@(0.0.255) int]_[*@3 ii])_[@(0.0.255) c -onst]&] -[s5; Returns the identifier of a given index (addresses by its zero`-based -ordinal number).&] -[s7; [%-*C@3 ii]-|zero`-based ordinal number of the queried index&] -[s7; [*/ Return value]-|index identifier or [* Null] if the index has -no identifier&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:GetPos`(const Id`&`)const:%- [@(0.0.255) int]_[* GetPos]([@(0.0.255) cons -t ][_^Id^ Id]`&_[*@3 id])_[@(0.0.255) const]&] -[s5; Returns the zero`-based positional number of the array index -with a given identifier.&] -[s7; [%-*C@3 id]-|array index identifier&] -[s7; [*/ Return value]-|zero`-based index number, `-1 when not found&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:SetId`(int`,const Id`&`):%- [_^ArrayCtrl`:`:IdInfo^ IdInfo][@(0.0.255) `& -]_[* SetId]([@(0.0.255) int]_[*@3 ii], [@(0.0.255) const ][_^Id^ Id]`&_[*@3 id])&] -[s5; Sets the identifier for a given array index. This can be used -to set or modify the identifier for a previously added index.&] -[s7; [%-*C@3 ii]-|zero`-based ordinal number of the index to set the -identifier for&] -[s7; [%-*C@3 id]-|new index identifier ([* Null] when none)&] -[s7; [*/ Return value]-|A reference to the [* IdInfo] descriptive structure -for the [/ ii]`-th index. The reference can be used to set additional -properties of the altered index.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:AddKey`(const Id`&`):%- [_^ArrayCtrl`:`:IdInfo^ IdInfo][@(0.0.255) `&]_ -[* AddKey]([@(0.0.255) const ][_^Id^ Id]`&_[*@3 id])&] -[s5; Adds a [/ primary key] index to the table. The [/ primary key] is -just another name for the first index (index with ordinal number -0). This is just a handy convention often used for SQL`-based -tables. [* AddKey] must be called only once after array initialization -or [* Reset] and before calling any other functions adding indices -(like [* AddIndex], [* AddColumn] or [* AddCtrl]). When [* GetIndexCount() -> 0 ]before the call to this function, this method fails with -an [* ASSERT].&] -[s7; [%-*C@3 id]-|primary key identifier&] -[s7; [*/ Return value]-|A reference to the descriptive [* IdInfo] structure -for the primary key index.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:AddKey`(`):%- [_^ArrayCtrl`:`:IdInfo^ IdInfo][@(0.0.255) `&]_[* AddKey]() -&] -[s5; Adds a primary key index without an identifier to the table. -This is equivalent to [* AddKey(Null)].&] -[s7; [*/ Return value]-|A reference to the [* IdInfo] structure describing -the primary key index.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:GetKeyId`(`)const:%- [_^Id^ Id]_[* GetKeyId]()_[@(0.0.255) const]&] -[s5; Returns primary key identifier for this table. This is equivalent -to calling [* GetId(0)].&] -[s7; [*/ Return value]-|primary key index identifier&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:AddColumn`(const char`*`,int`):%- [_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `& -]_[* AddColumn]([@(0.0.255) const]_[@(0.0.255) char]_`*[*@3 text]_`=_NULL, -[@(0.0.255) int]_[*@3 w]_`=_[@3 0])&] -[s5; Add a new column`-index pair to the table. The function adds -a (source) index and an (output) column and sets the index as -the data source for the column. This is the most common method -for adding columns to the array.&] -[s7; [%-*C@3 text]-|column name (displayed in the array header)&] -[s7; [%-*C@3 w]-|logical relative column width&] -[s7; [*/ Return value]-|A reference to the [* Column] structure describing -the newly added column. This can be used to set additional properties -for the newly added column and the corresponding header tab.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:AddColumn`(const Id`&`,const char`*`,int`):%- [_^ArrayCtrl`:`:Column^ C -olumn][@(0.0.255) `&]_[* AddColumn]([@(0.0.255) const ][_^Id^ Id]`&_[*@3 id], -[@(0.0.255) const]_[@(0.0.255) char]_`*[*@3 text], [@(0.0.255) int]_[*@3 w]_`=_[@3 0])&] -[s5; Adds a new column`-index pair to the table. This is equivalent -to the above two`-parameter version but, in addition, the method -sets the [* Id] identifier for the newly created index.&] -[s7; [%-*C@3 id]-|new index identifier&] -[s7; [%-*C@3 text]-|column name (displayed in the header)&] -[s7; [%-*C@3 w]-|logical relative column width&] -[s7; [*/ Return value]-|A reference to the [* Column] structure describing -the newly added array column.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:AddColumnAt`(int`,const char`*`,int`):%- [_^ArrayCtrl`:`:Column^ Colu -mn][@(0.0.255) `&]_[* AddColumnAt]([@(0.0.255) int]_[*@3 ii], [@(0.0.255) const]_[@(0.0.255) c -har]_`*[*@3 text], [@(0.0.255) int]_[*@3 w]_`=_[@3 0])&] -[s5; Adds a new column to the table and binds it to a given source -data index.&] -[s7; [%-*C@3 ii]-|zero`-based ordinal number of the index to use as -source for this column&] -[s7; [%-*C@3 text]-|column name (displayed in the header)&] -[s7; [%-*C@3 w]-|logical relative column width&] -[s7; [*/ Return value]-|A reference to the [* Column] structure describing -the newly added array column.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:AddColumnAt`(const Id`&`,const char`*`,int`):%- [_^ArrayCtrl`:`:Column^ C -olumn][@(0.0.255) `&]_[* AddColumnAt]([@(0.0.255) const ][_^Id^ Id]`&_[*@3 id], -[@(0.0.255) const]_[@(0.0.255) char]_`*[*@3 text], [@(0.0.255) int]_[*@3 w]_`=_[@3 0])&] -[s5; Adds a new column to the table and binds it to a given source -data index.&] -[s7; [%-*C@3 id]-|identifier of the index to use as source for the newly -added column&] -[s7; [%-*C@3 text]-|column name (displayed in the header)&] -[s7; [%-*C@3 w]-|logical relative column width&] -[s7; [*/ Return value]-|A reference to the [* Column] structure describing -the newly added array column.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:AddRowNumColumn`(const char`*`,int`):%- [_^ArrayCtrl`:`:Column^ Colum -n][@(0.0.255) `&]_[* AddRowNumColumn]([@(0.0.255) const]_[@(0.0.255) char]_`*[*@3 text], -[@(0.0.255) int]_[*@3 w]_`=_[@3 0])&] -[s5; Adds a new column to the table. The newly added column has no -source index, it is assumed to have an external data source. -Instead of the source data [* Value] object, the current zero`-based -row number is passed to the column`'s [* Convert] / [* Display]. -This allows the host application to decode somehow the external -data based on the row number. In the current U`+`+ version, the -[/ RowNum columns] cannot be edited (using the standard array inline -editation mechanism).&] -[s7; [%-*C@3 text]-|column name (displayed in the header)&] -[s7; [%-*C@3 w]-|logical relative column width&] -[s7; [*/ Return value]-|A reference to the [* Column] structure describing -the newly added array column.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:AddCtrl`(Ctrl`&`):%- [_^ArrayCtrl`:`:IdInfo^ IdInfo][@(0.0.255) `&]_[* Ad -dCtrl]([_^Ctrl^ Ctrl][@(0.0.255) `&]_[*@3 ctrl])&] -[s5; Adds a new index`-control pair to the table; the index keeps -the source data and the external control is used to edit it. -The ArrayCtrl handles data transfer between the source data matrix -and the external control. The method returns a reference the -[* IdInfo] descriptive structure for the newly added index.&] -[s5; [* Note:] it is good to keep in mind that there are a few differences -between the ordinary array cell editors and the freestanding -edit controls. In contrast with the cell editors, which appear -only when the row is opened for editing, the freestanding controls -are present all the time. For instance, the ArrayCtrl automatically -disables the controls when the cursor moves away from the table -(using [* KillCursor]) and re`-enables them after it comes back. -This is important e.g. if you want to implement an additional -logic enabling some of the controls only depending on the circumstances; -in such case, you have to use one of the notification callbacks -(like [* WhenEnterRow]) to force your additional behaviour on -the controls.&] -[s7; [%-*C@3 ctrl]-|control to attach to the given index&] -[s7; [*/ Return value]-|a reference to the IdInfo structure describing -the newly added index&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:AddCtrl`(const Id`&`,Ctrl`&`):%- [_^ArrayCtrl`:`:IdInfo^ IdInfo][@(0.0.255) `& -]_[* AddCtrl]([@(0.0.255) const ][_^Id^ Id]`&_[*@3 id], [_^Ctrl^ Ctrl][@(0.0.255) `&]_[*@3 ctrl -])&] -[s5; Adds a new index`-control pair to the table. This is identical -to the above version with the only difference that the newly -added index is assigned an [* Id] identifier at the same time.&] -[s7; [%-*C@3 id]-|the identifier to assign to the newly created index&] -[s7; [%-*C@3 ctrl]-|freestanding control used to edit the given index&] -[s7; [*/ Return value]-|a reference to the IdInfo structure describing -the newly added index&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:AddCtrlAt`(int`,Ctrl`&`):%- [@(0.0.255) void]_[* AddCtrlAt]([@(0.0.255) i -nt]_[*@3 ii], [_^Ctrl^ Ctrl][@(0.0.255) `&]_[*@3 ctrl])&] -[s5; Adds a new control to the table and binds it to the index with -given ordinal number. You can use this method to create the binding -between the control and an arbitrary source index.&] -[s7; [%-*C@3 ii]-|zero`-based ordinal number of the index to bind to -this control&] -[s7; [%-*C@3 ctrl]-|freestanding control used to edit the [/ ii]`-th data -index&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:AddCtrlAt`(const Id`&`,Ctrl`&`):%- [@(0.0.255) void]_[* AddCtrlAt]([@(0.0.255) c -onst ][_^Id^ Id]`&_[*@3 id], [_^Ctrl^ Ctrl][@(0.0.255) `&]_[*@3 ctrl])&] -[s5; Adds a new control to the table and binds it to the index with -given identifier.&] -[s7; [%-*C@3 id]-|identifier of the index to bind to this control&] -[s7; [%-*C@3 ctrl]-|freestanding control used to edit the index with -identifier [/ id]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:AddRowNumCtrl`(Ctrl`&`):%- [@(0.0.255) void]_[* AddRowNumCtrl]([_^Ctrl^ C -trl][@(0.0.255) `&]_[*@3 ctrl])&] -[s5; Adds a new freestanding control to the table. The control is -not bound to any source data index. During cursor movement in -the array, array uses the control`'s [* SetData] method to set -it to the current row number. The control must be ready for that -and it can use the row number value to decode some externally -located data for display. In the current U`+`+ version, such -controls cannot be used for editation (there is currently no -clean way to store the edited data back to its external storage).&] -[s7; [%-*C@3 ctrl]-|[/ RowNum]`-based freestanding editor control&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:GetColumnCount`(`)const:%- [@(0.0.255) int]_[* GetColumnCount]()_[@(0.0.255) c -onst]&] -[s5; Returns the current number of (output) columns in the array.&] -[s7; [*/ Return value]-|number of columns&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:FindColumnWithPos`(int`)const:%- [@(0.0.255) int]_[* FindColumnWithPos]( -[@(0.0.255) int]_[*@3 pos])_[@(0.0.255) const]&] -[s5; Returns the zero`-based index of a column based on its source -data index.&] -[s7; [%-*C@3 pos]-|ordinal number of the source index&] -[s7; [*/ Return value]-|ordinal number of the column having the given -index as its source, `-1 when not found&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:FindColumnWithId`(const Id`&`)const:%- [@(0.0.255) int]_[* FindColumnWi -thId]([@(0.0.255) const ][_^Id^ Id]`&_[*@3 id])_[@(0.0.255) const]&] -[s5; Returns the zero`-based index of a column based on its source -data index.&] -[s7; [%-*C@3 id]-|source index identifier&] -[s7; [*/ Return value]-|ordinal number of the column having the given -index as its source, `-1 when not found&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:ColumnAt`(int`):%- [_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `&]_[* Colu -mnAt]([@(0.0.255) int]_[*@3 i])&] -[s5; Returns the [* Column] structure describing a given column.&] -[s7; [%-*C@3 i]-|zero`-based column index&] -[s7; [*/ Return value]-|a reference to the [* Column] structure describing -the given column&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:ColumnAt`(const Id`&`):%- [_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `& -]_[* ColumnAt]([@(0.0.255) const ][_^Id^ Id]`&_[*@3 id])&] -[s5; Returns the [* Column] structure describing a given column.&] -[s7; [%-*C@3 i]-|zero`-based column index&] -[s7; [*/ Return value]-|a constant reference to the [* Column] structure -describing the given column&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:ColumnAt`(int`)const:%- [@(0.0.255) const]_[_^ArrayCtrl`:`:Column^ Colu -mn][@(0.0.255) `&]_[* ColumnAt]([@(0.0.255) int]_[*@3 i])_[@(0.0.255) const]&] -[s5; Returns the [* Column] structure describing a column with given -source index. This is merely the const version of the above method; -it can be used to query properties for the column.&] -[s7; [%-*C@3 id]-|identifier of the index used as source for the column&] -[s7; [*/ Return value]-|a reference to the [* Column] structure describing -the given column&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:ColumnAt`(const Id`&`)const:%- [@(0.0.255) const]_[_^ArrayCtrl`:`:Column^ C -olumn][@(0.0.255) `&]_[* ColumnAt]([@(0.0.255) const ][_^Id^ Id]`&_[*@3 id])_[@(0.0.255) cons -t]&] -[s5; Returns a constant reference to the [* Column] structure describing -a column with given source index. This is the constant version -of the above method; it can be used to query properties for the -column.&] -[s7; [%-*C@3 id]-|identifier of the index used as source for the column&] -[s7; [*/ Return value]-|a constant reference to the [* Column] structure -describing the given column&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:HeaderTab`(int`):%- [_^HeaderCtrl`:`:Column^ HeaderCtrl`::Column][@(0.0.255) `& -]_[* HeaderTab]([@(0.0.255) int]_[*@3 i])&] -[s5; Returns the [*^topic`:`/`/CtrlLib`/src`/HeaderCtrl`$en`-us`#`:`:HeaderCtrl`:`:Column`:`:Min`(int`)^ H -eaderCtrl`::Column] descriptive structure for the given column. -The correspondence between the array columns and the header tabs -is 1:1, so that the indices of both are always the same ([* array.GetColumnCount() -`=`= array.HeaderObject().GetCount()] holds all the time).&] -[s7; [%-*C@3 i]-|zero`-based column index&] -[s7; [*/ Return value]-|a reference to the [* HeaderCtrl`::Column] structure. -This can be used to set additional properties of the header column -(e.g. column width constraints, font and icon for the column -title etc.)&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:HeaderTab`(int`)const:%- [@(0.0.255) const]_[_^HeaderCtrl`:`:Column^ He -aderCtrl`::Column][@(0.0.255) `&]_[* HeaderTab]([@(0.0.255) int]_[*@3 i])_[@(0.0.255) const]&] -[s5; Returns a constant reference to the [* HeaderCtrl`::Column] structure -for the given column.&] -[s7; [%-*C@3 i]-|zero`-based column index&] -[s7; [*/ Return value]-|a reference to the [* HeaderCtrl`::Column] structure. -This can be used to set additional properties of the header column -(e.g. column width constraints, font and icon for the column -title etc.)&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:HeaderTab`(const Id`&`):%- [_^HeaderCtrl`:`:Column^ HeaderCtrl`::Colum -n][@(0.0.255) `&]_[* HeaderTab]([@(0.0.255) const ][_^Id^ Id]`&_[*@3 id])&] -[s5; Returns the [* HeaderCtrl`::Column] descriptive structure for the -column bound to a given source index.&] -[s7; [%-*C@3 id]-|identifier of the index used as source for the column&] -[s7; [*/ Return value]-|a reference to the [* HeaderCtrl`::Column] structure&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:HeaderTab`(const Id`&`)const:%- [@(0.0.255) const]_[_^HeaderCtrl`:`:Column^ H -eaderCtrl`::Column][@(0.0.255) `&]_[* HeaderTab]([@(0.0.255) const ][_^Id^ Id]`&_[*@3 id])_[@(0.0.255) c -onst]&] -[s5; Returns a constant reference to the [* HeaderCtrl`::Column] descriptive -structure for the column bound to a given source index.&] -[s7; [%-*C@3 id]-|identifier of the index used as source for the column&] -[s7; [*/ Return value]-|a constant reference to the [* HeaderCtrl`::Column] -structure&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:HeaderObject`(`)const:%- [@(0.0.255) const]_[_^HeaderCtrl^ HeaderCtrl][@(0.0.255) `& -]_[* HeaderObject]()_[@(0.0.255) const]&] -[s5; Returns a non`-constant reference to the [* HeaderCtrl] object -for this table. The reference can be further used to alter properties -of the table header (tab visibility, header visual mode and so -on).&] -[s7; [*/ Return value]-|A non`-constant reference to the table HeaderCtrl -object.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:HeaderObject`(`):%- [_^HeaderCtrl^ HeaderCtrl][@(0.0.255) `&]_[* HeaderOb -ject]()&] -[s5; This is just the constant version of the above method; when -called on a constant [* ArrayCtrl] reference, it returns a constant -reference to its underlying HeaderCtrl object which can be then -used to query additional header information.&] -[s7; [*/ Return value]-|A constant reference to the table HeaderCtrl -object.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:SerializeHeader`(Stream`&`):%- [@(0.0.255) void]_[* SerializeHeader]([_^Stream^ S -tream][@(0.0.255) `&]_[*@3 s])&] -[s5; Serializes all information pertaining to the array header (mainly -the user`-set column widths). This is equivalent to calling [* HeaderObject().Seria -lize(s)]. The main purpose of this function is to allow storing -header configuration to be restored upon opening the dialog or -the application for the next time. This function is now deprecated -in favor of SerializeSettings.&] -[s7; [%-*C@3 s]-|the [*^topic`:`/`/Core`/src`/Stream`$en`-us^ Stream] -object to serialize the header to/from&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:SerializeSettings`(Stream`&`):%- [@(0.0.255) void]_[* SerializeSettings -]([_^Stream^ Stream][@(0.0.255) `&]_[*@3 s])&] -[s5; Serializes all information pertaining to the array header (mainly -the user`-set column widths) and the setting of sort column. -The main purpose of this function is to allow storing configuration -to be restored upon opening the dialog or the application for -the next time.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:SetDisplay`(int`,int`,const Display`&`):%- [@(0.0.255) void]_[* SetDisp -lay]([@(0.0.255) int]_[*@3 i], [@(0.0.255) int]_[*@3 col], [@(0.0.255) const]_[_^Display^ Dis -play][@(0.0.255) `&]_[*@3 d])&] -[s5; Sets the [* Display] object for a given array cell.&] -[s5;* &] -[s5; [* Note:] the ownership to the Display object is not transferred -by this call. The ArrayCtrl stores a mere pointer to it and it -is the responsibility of the programmer to keep the Display object -alive as long as necessary (until the array is shut down or the -cell display changed via another call to SetDisplay). In fact, -most Display`-based objects don`'t support data copying at all. -In any case, copying Displays is not a very good practice and -is very prone to slicing (as most actual Displays are actually -derived classes with additional data members).&] -[s5; &] -[s5; In many cases it would be relatively safe to assume that the -Display is not used unless the array is actually painted (e.g., -when the control is not bound to a parent or when its view has -zero size), but it is not a very wise practice and it can fail -in very weird ways under special circumstances (like making screenshots -or graphical exports from the array control).&] -[s5; &] -[s7; [%-*C@3 i]-|zero`-based row index&] -[s7; [%-*C@3 j]-|zero`-based column index&] -[s7; [%-*C@3 d]-|display to use&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:GetDisplay`(int`,int`):%- [@(0.0.255) const]_[_^Display^ Display][@(0.0.255) `& -]_[* GetDisplay]([@(0.0.255) int]_[*@3 row], [@(0.0.255) int]_[*@3 col])&] -[s5; Returns a reference to the Display object for the given array -cell.&] -[s7; [%-*C@3 row]-|zero`-based row index&] -[s7; [%-*C@3 col]-|zero`-based column index&] -[s7; [*/ Return value]-|a reference to the Display object.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:GetDisplay`(int`):%- [@(0.0.255) const]_[_^Display^ Display][@(0.0.255) `& -]_[* GetDisplay]([@(0.0.255) int]_[*@3 col])&] -[s5; Returns a reference to the Display object for the given array -column.&] -[s7; [%-*C@3 col]-|zero`-based column index&] -[s7; [*/ Return value]-|constant reference to the column Display&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:SetCtrl`(int`,int`,Ctrl`&`,bool`):%- [@(0.0.255) void]_[* SetCtrl]([@(0.0.255) i -nt]_[*@3 i], [@(0.0.255) int]_[*@3 col], [_^Ctrl^ Ctrl][@(0.0.255) `&]_[*@3 ctrl], -[@(0.0.255) bool]_[*@3 value]_`=_[@(0.0.255) true])&] -[s5; Sets an external control to use as the editor for a single array -cell. Naturally, the same Ctrl object cannot be used as the editor -for multiple array cells. If the position of Ctrl is equivalent -to `'SetRect(0, 0, 0, 0)`', which is the default value, Ctrl -is resized to fit the ArrayCtrl cell accurately, otherwise the -position represents the position within the cell. If [%-*@3 value] -is true, then the Ctrl represents the value of the cell, otherwise -it is independent of it.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:GetTotalCy`(`)const:%- [@(0.0.255) int]_[* GetTotalCy]()_[@(0.0.255) cons -t]&] -[s5; Returns total height of the array (sum of the individual line -heights for all array rows)&] -[s7; [*/ Return value]-|array height in pixels&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:GetLineAt`(int`)const:%- [@(0.0.255) int]_[* GetLineAt]([@(0.0.255) int]_ -[*@3 y])_[@(0.0.255) const]&] -[s5; Locates the array row according to given [/ y] coordinate (such -array row [/ r] for which [* GetLineY(r) <`= y `&`& GetLineY(r) `+ -GetLineCy(r) > y]).&] -[s7; [%-*C@3 y]-|vertical pixel coordinate to locate&] -[s7; [*/ Return value]-|zero`-based row number or `-1 when not found&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:GetClickColumn`(`)const:%- [@(0.0.255) int]_[* GetClickColumn]()_[@(0.0.255) c -onst]&] -[s5; Returns column index of the last clicked column in the array. -If the click happens past the last row of array, returns Null.&] -[s7; [*/ Return value]-|zero`-based index of the relevant column&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:GetClickRow`(`)const:%- [@(0.0.255) int]_[* GetClickRow]()_[@(0.0.255) co -nst]&] -[s5; Returns column index of the last clicked row in the array. If -the click happens past the last row of array, returns Null.&] -[s7; [*/ Return value]-|zero`-based index of the relevant column&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:GetClickPos`(`)const:%- [_^Point^ Point]_[* GetClickPos]()_[@(0.0.255) co -nst]&] -[s7; [*/ Return value]-|[* Point(GetClickColumn(), GetClickRow())].&] -[s3; &] -[s0;* &] -[s0; [* Data setting and retrieval]&] -[s3; &] -[s0;%- &] -[s1;:ArrayCtrl`:`:SetCount`(int`):%- [@(0.0.255) void]_[* SetCount]([@(0.0.255) int]_[*@3 c]) -&] -[s5; Sets the number of rows in the array. This extends or trims -the source matrix as necessary. When using the Ctrl`-based individual -cell editors, as a side`-effect of this call some controls can -be constructed or destroyed.&] -[s7; [%-*C@3 c]-|new row count&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:SetVirtualCount`(int`):%- [@(0.0.255) void]_[* SetVirtualCount]([@(0.0.255) i -nt]_[*@3 c])&] -[s5; Sets the number of rows in an array with external data. This -makes sense only when all the [/ Column`'s] and [/ Ctrl`'s] of the -array are [/ rownum]`-based. The function doesn`'t physically allocate -any source data matrix space, it just makes the array `'think`' -it has [/ c] rows (this is of course necessary for the Paint routine, -for cursor / selection management and so on).&] -[s5; [* Note:] in the current implementation, selection flags for the -individual rows are kept in the row objects. Therefore it is -not very wise to use multiselection for arrays with external -data, because as soon as the last row is selected, all row storage -structures are allocated as a side effect to keep the selection -flags.&] -[s7; [%-*C@3 c]-|new `'virtual`' number of rows&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:GetCount`(`)const:%- [@(0.0.255) int]_[* GetCount]()_[@(0.0.255) const]&] -[s5; Returns the number of rows in the array. In fact, this returns -the maximum of the number of `'real`' source matrix rows (as -set by the SetCount / Add / Insert methods) and the `'virtual`' -row count (as se by SetVirtualCount). By checking the implementation -of this method, you can easily find that, simply,&] -[s5; &] -[s5; [C int ArrayCtrl`::GetCount() const `{]&] -[s5; [C -|-|return max(virtualcount, array.GetCount());]&] -[s5; [C `}]&] -[s5; &] -[s7; [*/ Return value]-|Number of rows in the array.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Clear`(`):%- [@(0.0.255) void]_[* Clear]()&] -[s5; Clears the array source data matrix and sets the virtual row -count to 0.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Shrink`(`):%- [@(0.0.255) void]_[* Shrink]()&] -[s5; Shrinks the source data array, i.e. reallocates the data to -the minimum required memory space.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Get`(int`,int`)const:%- [_^Value^ Value]_[* Get]([@(0.0.255) int]_[*@3 i], -[@(0.0.255) int]_[*@3 ii])_[@(0.0.255) const]&] -[s5; Returns the value at a given location in the source data matrix.&] -[s7; [%-*C@3 i]-|zero`-based row number&] -[s7; [%-*C@3 ii]-|zero`-based index ordinal number&] -[s7; [*/ Return value]-|value at the given location in the source data -matrix&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Get`(int`,const Id`&`)const:%- [_^Value^ Value]_[* Get]([@(0.0.255) int]_ -[*@3 i], [@(0.0.255) const ][_^Id^ Id]`&_[*@3 id])_[@(0.0.255) const]&] -[s5; Returns the value at a given location in the source data matrix. -In this version, the source indices are addressed by their identifiers.&] -[s7; [%-*C@3 i]-|zero`-based row number&] -[s7; [%-*C@3 id]-|source index identifier&] -[s7; [*/ Return value]-|value at the given location in the source data -matrix&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Get`(int`)const:%- [_^Value^ Value]_[* Get]([@(0.0.255) int]_[*@3 ii])_[@(0.0.255) c -onst]&] -[s5; Returns the value of a given source index at the currently active -cursor row. This is equivalent to [* Get(GetCursor(), ii)]. When -the row is currently being edited, the function returns the `'new`' -value (the current value of the respective editor control, i.e. -potentially edited).&] -[s5; [* Note:] when the cursor row is not set (when [* !IsCursor()]), -the function fails with an [* ASSERT].&] -[s7; [%-*C@3 ii]-|zero`-based index ordinal number&] -[s7; [*/ Return value]-|value at a given location in the cursor row&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Get`(const Id`&`)const:%- [_^Value^ Value]_[* Get]([@(0.0.255) const -][_^Id^ Id]`&_[*@3 id])_[@(0.0.255) const]&] -[s5; Returns the value of a given source index at the currently active -cursor row. This is equivalent to [* Get(GetCursor(), id)].&] -[s7; [%-*C@3 id]-|source index identifier&] -[s7; [*/ Return value]-|value at the given location in the cursor row&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:GetOriginal`(int`)const:%- [_^Value^ Value]_[* GetOriginal]([@(0.0.255) i -nt]_[*@3 ii])_[@(0.0.255) const]&] -[s5; Returns the `'original`' value of a given source index at the -currently active cursor row. When the row is open for editing, -this function returns the `'old`' value before any editation -took place.&] -[s7; [%-*C@3 ii]-|zero`-based index ordinal number&] -[s7; [*/ Return value]-|value at the given location in the cursor row&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:GetOriginal`(const Id`&`)const:%- [_^Value^ Value]_[* GetOriginal]([@(0.0.255) c -onst ][_^Id^ Id]`&_[*@3 id])_[@(0.0.255) const]&] -[s5; Returns the `'original`' value (i.e., without any editing changed -applied) of a given source index at the currently active cursor -row.&] -[s7; [%-*C@3 id]-|source index identifier&] -[s7; [*/ Return value]-|value at the given location in the cursor row&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:GetKey`(`)const:%- [_^Value^ Value]_[* GetKey]()_[@(0.0.255) const]&] -[s5; Returns the value of the current row`'s primary key. This is -equivalent to [* Get(0)].&] -[s7; [*/ Return value]-|value at the index #0 in the cursor row&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:GetOriginalKey`(`)const:%- [_^Value^ Value]_[* GetOriginalKey]()_[@(0.0.255) c -onst]&] -[s5; Returns the original value of the current row`'s primary key. -During editation, the function returns the value at the time -of opening the row for editing, i.e. without any editing changes -applied. This is equivalent to [* GetOriginal(0)].&] -[s7; [*/ Return value]-|value at the index #0 in the cursor row&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Set`(int`,int`,const Value`&`):%- [@(0.0.255) void]_[* Set]([@(0.0.255) i -nt]_[*@3 i], [@(0.0.255) int]_[*@3 ii], [@(0.0.255) const]_[_^Value^ Value][@(0.0.255) `&]_[*@3 v -])&] -[s5; Sets the value at a given location in the source data matrix.&] -[s7; [%-*C@3 i]-|zero`-based row number&] -[s7; [%-*C@3 ii]-|zero`-based index ordinal number&] -[s7; [%-*C@3 v]-|value to set to the given cell&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Set`(int`,const Id`&`,const Value`&`):%- [@(0.0.255) void]_[* Set]([@(0.0.255) i -nt]_[*@3 i], [@(0.0.255) const ][_^Id^ Id]`&_[*@3 id], [@(0.0.255) const]_[_^Value^ Value][@(0.0.255) `& -]_[*@3 v])&] -[s5; Sets the value at a given location in the source data matrix. -&] -[s7; [%-*C@3 i]-|zero`-based row number&] -[s7; [%-*C@3 id]-|source index identifier&] -[s7; [%-*C@3 v]-|value to set to the given cell&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Set`(int`,const Value`&`):%- [@(0.0.255) void]_[* Set]([@(0.0.255) int]_[*@3 i -i], [@(0.0.255) const]_[_^Value^ Value][@(0.0.255) `&]_[*@3 v])&] -[s5; Modifies the value at a given location in the cursor row. When -the row is open for editing, the function immediately changes -the value in the appropriate editor control.&] -[s7; [%-*C@3 ii]-|zero`-based index ordinal number&] -[s7; [%-*C@3 v]-|value to set&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Set`(const Id`&`,const Value`&`):%- [@(0.0.255) void]_[* Set]([@(0.0.255) c -onst ][_^Id^ Id]`&_[*@3 id], [@(0.0.255) const]_[_^Value^ Value][@(0.0.255) `&]_[*@3 v])&] -[s5; Modifies the value at a given location in the cursor row. This -overloaded version uses the [* Id] identifier to address the relevant -index.&] -[s7; [%-*C@3 id]-|index identifier&] -[s7; [%-*C@3 v]-|value to set&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:GetColumn`(int`,int`)const:%- [_^Value^ Value]_[* GetColumn]([@(0.0.255) i -nt]_[*@3 row], [@(0.0.255) int]_[*@3 col])_[@(0.0.255) const]&] -[s5; Returns the value of a given column. This depends on the column`-index -mapping established when adding columns to the table. When the -column is a [/ rownum] type (it is bound to no source indices), -the function just returns the [/ row] parameter. For columns with -a single source index, the function returns the value of the -mapped source index. For columns with multiple source indices, -the function returns a [* ValueArray ]containing the values of -its source indices.&] -[s7; [%-*C@3 row]-|zero`-based row index&] -[s7; [%-*C@3 col]-|zero`-based column index&] -[s7; [*/ Return value]-|value of the given column&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:GetConvertedColumn`(int`,int`):%- [_^Value^ Value]_[* GetConvertedColum -n]([@(0.0.255) int]_[*@3 row], [@(0.0.255) int]_[*@3 col])&] -[s5; Returns the value of a given column after application of its -[* Convert]. For performance reasons, the values obtained by calls -to the [* Convert`::Format] methods are cached internally within -the ArrayCtrl object. You can manipulate the conversion cache -using the methods [*^topic`:`/`/CtrlLib`/src`/ArrayCtrl`$en`-us`#`:`:ArrayCtrl`:`:ClearCache`(`)^ C -learCache] and[* ][*^topic`:`/`/CtrlLib`/src`/ArrayCtrl`$en`-us`#`:`:ArrayCtrl`:`:InvalidateCache`(int`)^ I -nvalidateCache].&] -[s7; [%-*C@3 row]-|zero`-based row index&] -[s7; [%-*C@3 col]-|zero`-based column index&] -[s7; [*/ Return value]-|the converted cell value&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:ReadRow`(int`)const:%- [_^Vector^ Vector]<[_^Value^ Value]>_[* ReadRow]([@(0.0.255) i -nt]_[*@3 i])_[@(0.0.255) const]&] -[s5; Returns a [* Vector] containing the values of all source indices -in the given row. Invariantly, the [* GetCount()] of the returned -array is equal to the [* GetIndexCount()] of the source ArrayCtrl.&] -[s7; [%-*C@3 i]-|zero`-based row index&] -[s7; [*/ Return value]-|an array of all source values in the given row&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Set`(int`,const Vector``&`):%- [@(0.0.255) void]_[* Set]([@(0.0.255) i -nt]_[*@3 i], [@(0.0.255) const]_[_^Vector^ Vector]<[_^Value^ Value]>`&_[*@3 v])&] -[s5; Modified a given row by setting all source index values to values -passed in the parameter [/ v].&] -[s7; [%-*C@3 i]-|zero`-based row index&] -[s7; [%-*C@3 v]-|an array of values to set to the source data matrix -row&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Add`(`):%- [@(0.0.255) void]_[* Add]()&] -[s5; Adds an empty row to the source data matrix.&] -[s5; [* Note:] the [* InsertValue] property of the [* IdInfo] structure -defines a method to generate / retrieve default values for newly -inserted rows. However, these values are only used during the -GUI`-based [* DoInsert] method and do not apply to the [* Add] method. -If you need to set the newly added source matrix row to some -non`-null defaults, you have to modify the relevant cells manually.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Add`(const Vector``&`):%- [@(0.0.255) void]_[* Add]([@(0.0.255) c -onst]_[_^Vector^ Vector]<[_^Value^ Value]>`&_[*@3 v])&] -[s5; Adds a new row at the end of the source data matrix. The [*^topic`:`/`/Core`/src`/Vector`$en`-us^ V -ector] parameter contains the values to be used to initialize -the new row of the matrix.&] -[s7; [%-*C@3 v]-|new matrix row&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Add`(const Value`&`[`,const Value`&`]`.`.`.`):%- [@(0.0.255) void]_[* A -dd]([@(0.0.255) const]_[_^Value^ Value][@(0.0.255) `&]_`[, [@(0.0.255) const]_[_^Value^ Val -ue][@(0.0.255) `&]_`]...)&] -[s5; Adds a new row at the bottom of the source data matrix. This -is in fact a series of functions (generated automatically using -the [* Expand] macro) which takes an arbitrary number of arguments. -Its arguments are used to initialize the source indices in the -newly added row.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Insert`(int`):%- [@(0.0.255) void]_[* Insert]([@(0.0.255) int]_[*@3 i])&] -[s5; Inserts a new row into the source array. All indices are initialized -to [* Null] values. The [* InsertValue] property doesn`'t apply; -if you need to set the newly created row to some non`-trivial -values, you have to do so manually.&] -[s7; [%-*C@3 i]-|zero`-based position of the newly created row&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Insert`(int`,const Vector``&`):%- [@(0.0.255) void]_[* Insert]( -[@(0.0.255) int]_[*@3 i], [@(0.0.255) const]_[_^Vector^ Vector]<[_^Value^ Value]>`&_[*@3 v])&] -[s5; Inserts a new row into the array at a given position. The second -parameter, [/ v], is used to initialize the source indices of the -newly created row.&] -[s7; [%-*C@3 i]-|zero`-based row index&] -[s7; [%-*C@3 v]-|a vector of values used to initialize the source indices -of the given row&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Remove`(int`):%- [@(0.0.255) void]_[* Remove]([@(0.0.255) int]_[*@3 i])&] -[s5; Removes the given source data row.&] -[s5; [* Note:] the [* AskRemove] property of the [* ArrayCtrl] object tells -whether a confirmation dialog should pop up every time the user -wants to remove a row. However, this method applies only to the -GUI`-based row removal; the [* Remove] method always removes the -requested row unconditionally without popping up any confirmation -dialog.&] -[s7; [%-*C@3 i]-|zero`-based index of the row to remove&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:SwapUp`(`):%- [@(0.0.255) void]_[* SwapUp]()&] -[s5; Exchanges the cursor row with the preceding row, effectively -moving it up.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:SwapDown`(`):%- [@(0.0.255) void]_[* SwapDown]()&] -[s5; Exchanges the cursor row with following row, effectively moving -it down.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Sort`(const ArrayCtrl`:`:Order`&`):%- [@(0.0.255) void]_[* Sort]([@(0.0.255) c -onst]_[_^ArrayCtrl`:`:Order^ ArrayCtrl`::Order][@(0.0.255) `&]_[*@3 order])&] -[s5; Sorts the array rows according to a given ordering predicate. -The [* ArrayCtrl`::Order] object defines the ordering predicate; -its [* operator ()] should return [* true] whenever its first parameter -(a vector containing the values of all source indices in a row) -is less than its second parameter.&] -[s7; [%-*C@3 order]-|&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Sort`(int`,int`,const ArrayCtrl`:`:Order`&`):%- [@(0.0.255) void]_[* So -rt]([@(0.0.255) int]_[*@3 from], [@(0.0.255) int]_[*@3 count], [@(0.0.255) const]_[_^ArrayCtrl`:`:Order^ A -rrayCtrl`::Order][@(0.0.255) `&]_[*@3 order])&] -[s5; Sorts a portion of the array using a given ordering predicate.&] -[s7; [%-*C@3 from]-|zero`-based index of the first row to sort&] -[s7; [%-*C@3 count]-|number of rows to be sorted&] -[s7; [%-*C@3 order]-|the ordering predicate object. The object should -be derived from [* ArrayCtrl`::Order] and should override the [* operator -()] method. This method should return [* true ]whenever its first -parameter (a vector containing all source index values for a -certain row) is less than its second parameter.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Sort`(int`(`*`)`(const Vector``&v1`,const Vector``&v2`)`):%- [@(0.0.255) v -oid]_[* Sort]([@(0.0.255) int]_(`*[*@3 compare])([@(0.0.255) const]_Vector`&_v1, -[@(0.0.255) const]_Vector`&_v2))&] -[s5; Sorts the array rows according to the order defined by the specified -ordering predicate [/ compare]. This is supposed to be a global -function returning [* true] whenever its first parameter ([/ v1], -an array consisting of all source indices within a row) is less -than the second parameter [/ v2] (according to the desired ordering).&] -[s7; [%-*C@3 compare]-|the ordering predicate; _the function is supposed -to return [* true] whenever its first parameter ([/ v1]) is less -than the second parameter ([/ v2]) according to the desired ordering.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Sort`(int`,int`(`*`)`(const Value`&v1`,const Value`&v2`)`):%- [@(0.0.255) v -oid]_[* Sort]([@(0.0.255) int]_[*@3 ii], [@(0.0.255) int]_(`*[*@3 compare])([@(0.0.255) const -]_Value[@(0.0.255) `&]_v1, [@(0.0.255) const]_Value[@(0.0.255) `&]_v2)_`=_StdValueCompa -re)&] -[s5; Sorts the array rows according to the given ordering predicate -for the source index with a given ordinal number. When not explicitly -specified, the [* StdValueCompare] function is used as the default -comparison predicate.&] -[s7; [%-*C@3 ii]-|zero`-based ordinal number of the source index used -for sorting&] -[s7; [%-*C@3 compare]-|the sorting predicate function: the function is -supposed to return [* true] whenever its first parameter ([/ v1]) -is less than the second parameter ([/ v2]) according to the desired -ordering.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Sort`(const Id`&`,int`(`*`)`(const Value`&v1`,const Value`&v2`)`):%- [@(0.0.255) v -oid]_[* Sort]([@(0.0.255) const ][_^Id^ Id]`&_[*@3 id], [@(0.0.255) int]_(`*[*@3 compare])([@(0.0.255) c -onst]_Value[@(0.0.255) `&]_v1, [@(0.0.255) const]_Value[@(0.0.255) `&]_v2)_`=_StdValueC -ompare)&] -[s5; Sorts the array rows according to the given ordering predicate -for the source index with a given identifier. When not explicitly -specified, the [* StdValueCompare] function is used as the default -comparison predicate.&] -[s7; [%-*C@3 id]-|identifier of the source index used for sorting&] -[s7; [%-*C@3 compare]-|the sorting predicate function: the function is -supposed to return [* true] whenever its first parameter ([/ v1]) -is less than the second parameter ([/ v2]) according to the desired -ordering .&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Sort`(`):%- [@(0.0.255) void]_[* Sort]()&] -[s5; Sorts the array according to the default ordering predicate -for the first source index. This is equivalent to calling [* Sort(0)].&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:ColumnSort`(int`,const ValueOrder`&`):%- [@(0.0.255) void]_[* ColumnSor -t]([@(0.0.255) int]_[*@3 column], [@(0.0.255) const]_[_^ValueOrder^ ValueOrder][@(0.0.255) `& -]_[*@3 order])&] -[s5; Sorts by the column. Note that this is different from Sort, -because the final converted value of column is used (which can -even be combination of more indexes).&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:SetSortColumn`(int`,bool`):%- [@(0.0.255) void]_[* SetSortColumn]([@(0.0.255) i -nt]_[*@3 ii], [@(0.0.255) bool]_[*@3 descending]_`=_[@(0.0.255) false])&] -[s5; Sets the `"sorting`" column and calls DoColumnSort. This setting -is used by DoColumnSort.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:ToggleSortColumn`(int`):%- [@(0.0.255) void]_[* ToggleSortColumn]([@(0.0.255) i -nt]_[*@3 ii])&] -[s5; Similar to SetSortColumn, but if the column is already set, -descending flag is inverted; otherwise descending flag is set -to false (indicating ascending sort).&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:DoColumnSort`(`):%- [@(0.0.255) void]_[* DoColumnSort]()&] -[s5; Sorts the array by sorting column and indicates it by setting -an image in the header.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:ClearCache`(`):%- [@(0.0.255) void]_[* ClearCache]()&] -[s5; Invalidates the whole [/ convert cache]. The convert cache keeps -the results of the [* Convert`::Format] method applied to individual -array data cells for performance reasons. Whenever you call the -[* ClearCache] method, all cache entries are marked as obsolete -and the [* Convert]`'s [* Format] method will be called as soon as -the converted value of a table cell is required (usually during -the next [* Paint]).&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:InvalidateCache`(int`):%- [@(0.0.255) void]_[* InvalidateCache]([@(0.0.255) i -nt]_[*@3 i])&] -[s5; Invalidates a given row in the [/ convert cache]. For performance -reasons, the results of the [* Convert`::Format] method applied -to the individual data cells are kept in a cache. This function -marks a given row of the cache as obsolete; this means the next -time the converted values are to be used (usually within the -[* Paint] routine or when setting up the row editor controls), -the [* Convert] objects are used again to generate the actualized -output values.&] -[s7; [*C@3 i]-|zero`-based row index&] -[s3; &] -[s0; &] -[s0; [* Cursor and selection management]&] -[s3; &] -[s0; &] -[s1;:ArrayCtrl`:`:ScrollUp`(`):%- [@(0.0.255) void]_[* ScrollUp]()&] -[s1;:ArrayCtrl`:`:ScrollDown`(`):%- [@(0.0.255) void]_[* ScrollDown]()&] -[s1;:ArrayCtrl`:`:ScrollPageUp`(`):%- [@(0.0.255) void]_[* ScrollPageUp]()&] -[s1;:ArrayCtrl`:`:ScrollPageDown`(`):%- [@(0.0.255) void]_[* ScrollPageDown]()&] -[s1;:ArrayCtrl`:`:ScrollEnd`(`):%- [@(0.0.255) void]_[* ScrollEnd]()&] -[s1;:ArrayCtrl`:`:ScrollBegin`(`):%- [@(0.0.255) void]_[* ScrollBegin]()&] -[s5; Scrolls the content of ArrayCtrl.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:GetSelectCount`(`)const:%- [@(0.0.255) int]_[* GetSelectCount]()_[@(0.0.255) c -onst]&] -[s5; Returns the number of selected row within the table.&] -[s7; [*/ Return value]-|number of selected records (in the range [/ `[0 -.. GetCount()`]])&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:IsSelection`(`)const:%- [@(0.0.255) bool]_[* IsSelection]()_[@(0.0.255) c -onst]&] -[s5; Checks whether any rows are selected. Equivalent to [* GetSelectCount() -> 0].&] -[s7; [*/ Return value]-|[* true] `= there is at least one selected row, -[* false] `= there is none.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Select`(int`,bool`):%- [@(0.0.255) void]_[* Select]([@(0.0.255) int]_[*@3 i -], [@(0.0.255) bool]_[*@3 sel]_`=_[@(0.0.255) true])&] -[s5; Selects / unselects a given row.&] -[s7; [%-*C@3 i]-|zero`-based row index&] -[s7; [%-*C@3 sel]-|[* true] `= add row to the current selection, [* false] -`= remove row from selection&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Select`(int`,int`,bool`):%- [@(0.0.255) void]_[* Select]([@(0.0.255) int]_ -[*@3 i], [@(0.0.255) int]_[*@3 count], [@(0.0.255) bool]_[*@3 sel]_`=_[@(0.0.255) true])&] -[s5; Selects / unselects a given row range.&] -[s7; [%-*C@3 i]-|zero`-based index of the first row to select / unselect&] -[s7; [%-*C@3 count]-|number of rows to select / unselect&] -[s7; [%-*C@3 sel]-|[* true] `= select the rows, [* false] `= unselect the -rows&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:IsSelected`(int`)const:%- [@(0.0.255) bool]_[* IsSelected]([@(0.0.255) in -t]_[*@3 i])_[@(0.0.255) const]&] -[s5; Checks whether a given row is selected. For tables without the -multiselection option, this is equal to the check [* GetCursor() -`=`= i].&] -[s7; [%-*C@3 i]-|zero`-based row index to check for selection&] -[s7; [*/ Return value]-|[* true] `= row is selected, [* false] `= not selected&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:IsSel`(int`)const:%- [@(0.0.255) bool]_[* IsSel]([@(0.0.255) int]_[*@3 i])_ -[@(0.0.255) const]&] -[s5; If there is selection in the widget, returns true if [%-*@3 i] -is selected, otherwise returns true if cursor is at [%-*@3 i].&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:ClearSelection`(`):%- [@(0.0.255) void]_[* ClearSelection]()&] -[s5; Clears the current selection (unselects all selected rows).&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:IsCursor`(`)const:%- [@(0.0.255) bool]_[* IsCursor]()_[@(0.0.255) const]&] -[s5; Checks whether the cursor is within the table. This is equivalent -to [* GetCursor()_>`=_0].&] -[s7; [*/ Return value]-|&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:SetCursor`(int`):%- [@(0.0.255) bool]_[* SetCursor]([@(0.0.255) int]_[*@3 i -])&] -[s5; Sets the current cursor row. When an array row is open for editing, -the function first commits the edited row, then moved the cursor -to the new row. When the edited row cannot be commited, the function -returns [* false] and doesn`'t change the cursor location.&] -[s7; [%-*C@3 i]-|zero`-based row index&] -[s7; [*/ Return value]-|[* true] `= cursor has been moved, [* false ]when -not (when committing the previously edited row failed)&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:KillCursor`(`):%- [@(0.0.255) bool]_[* KillCursor]()&] -[s5; Moves the cursor away from the array. When an array row is open -for editing, the function first commits the edited row, then -moved the cursor away from the array. When the edited row cannot -be commited, the function returns [* false] and doesn`'t change -the cursor location.&] -[s7; [*/ Return value]-|[* true] `= cursor has been moved away from the -array, [* false] when not (when committing the previously edited -row failed)&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:CancelCursor`(`):%- [@(0.0.255) void]_[* CancelCursor]()&] -[s5; Cancels editation of the row being currently edited. All changes -made in the individual column editors are rejected.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:GetCursor`(`)const:%- [@(0.0.255) int]_[* GetCursor]()_[@(0.0.255) const]&] -[s5; Returns the current cursor row, `-1 when none.&] -[s7; [*/ Return value]-|zero`-based cursor row index, `-1 `= cursor -is not in the array&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:GoBegin`(`):%- [@(0.0.255) void]_[* GoBegin]()&] -[s5; Moves the cursor to the first row in the array (equivalent to -[* SetCursor(0)]).&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:GoEnd`(`):%- [@(0.0.255) void]_[* GoEnd]()&] -[s5; Moves the cursor to the last array row (equivalent to [* SetCursor(GetCount() -`- 1)]).&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:GetCursorSc`(`)const:%- [@(0.0.255) int]_[* GetCursorSc]()_[@(0.0.255) co -nst]&] -[s5; Returns the visual vertical position of the cursor row relative -to the current view. This method, in combination with [* ScCursor], -can be used to reposition the cursor row while maintaining the -same visual position of the row within the array view.&] -[s7; [*/ Return value]-|an integer describing the vertical position -of the cursor row relative to the array view&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:ScCursor`(int`):%- [@(0.0.255) void]_[* ScCursor]([@(0.0.255) int]_[*@3 a]) -&] -[s5; Modifies the scrollbar position so that the current cursor row -appears at a given vertical position relative to the array view. -By doing the following sequence of operations: [* GetCursorSc], -then reposition the cursor row, then [* ScCursor], you can achieve -cursor relocation while maintaining its visual location within -the array view.&] -[s7; [%-*C@3 a]-|an integer describing the vertical position of the -cursor row (typically a number returned by a previous call to -[* GetCursorSc])&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:CenterCursor`(`):%- [@(0.0.255) void]_[* CenterCursor]()&] -[s5; Modifies the scrollbar position so that the current cursor row -appears in the middle of the array view.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:ScrollInto`(int`):%- [@(0.0.255) void]_[* ScrollInto]([@(0.0.255) int]_[*@3 l -ine])&] -[s5; Moves the scrollbar by the least possible amount in order to -make the given array row visible. When the given array row is -already visible, the function does nothing.&] -[s7; [%-*C@3 line]-|zero`-based row index of the array row to make visible&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:ScrollIntoCursor`(`):%- [@(0.0.255) void]_[* ScrollIntoCursor]()&] -[s5; Moves the scrollbar by the least possible amount in order to -make the cursor row visible. This is equivalent to [* ScrollInto(GetCursor())].&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:GetCursor`(`)const:%- [@(0.0.255) int]_[* GetCursor]()_[@(0.0.255) const]&] -[s5; Returns the current vertical scrollbar position.&] -[s7; [*/ Return value]-|Pixel position of the vertical scrollbar. Position -0 is at the very top (the top row of the array is fully visible).&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:ScrollTo`(int`):%- [@(0.0.255) void]_[* ScrollTo]([@(0.0.255) int]_[*@3 sc]) -&] -[s5; Moves the vertical array scrollbar to a given position.&] -[s7; [%-*C@3 sc]-|Pixel position of the scrollbar. The visible portion -of the array can be obtained conceptually by taking the stack -of array rows with its top aligned at the top of the view and -moving it [/ sc] pixels upwards.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Find`(const Value`&`,int`,int`)const:%- [@(0.0.255) int]_[* Find]([@(0.0.255) c -onst]_[_^Value^ Value][@(0.0.255) `&]_[*@3 v], [@(0.0.255) int]_[*@3 ii]_`=_[@3 0], -[@(0.0.255) int]_[*@3 from]_`=_[@3 0])_[@(0.0.255) const]&] -[s5; [%-*C@3 v]-|value to look for in the given source index&] -[s7; [%-*C@3 ii]-|zero`-based ordinal number of the source index to -search&] -[s7; [%-*C@3 from]-|zero`-based row index to start the search from&] -[s7; [*/ Return value]-|zero`-based number of the matched row, `-1 when -none&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Find`(const Value`&`,const Id`&`,int`)const:%- [@(0.0.255) int]_[* Find -]([@(0.0.255) const]_[_^Value^ Value][@(0.0.255) `&]_[*@3 v], [@(0.0.255) const -][_^Id^ Id]`&_[*@3 id], [@(0.0.255) int]_[*@3 from]_`=_[@3 0])_[@(0.0.255) const]&] -[s5; Locates the row (using linear search beginning at the row [/ from]) -in which the source index value identified by [/ id] equals [/ val]. -If such a row is found, the function returns its zero`-based -index. When not matched, the function returns `-1.&] -[s7; [%-*C@3 v]-|value to look for in the given source index&] -[s7; [%-*C@3 id]-|source index identifier&] -[s7; [%-*C@3 from]-|zero`-based row index to start the search from&] -[s7; [*/ Return value]-|zero`-based number of the matched row, `-1 when -none&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:FindSetCursor`(const Value`&`,int`,int`):%- [@(0.0.255) bool]_[* FindSe -tCursor]([@(0.0.255) const]_[_^Value^ Value][@(0.0.255) `&]_[*@3 val], -[@(0.0.255) int]_[*@3 ii]_`=_[@3 0], [@(0.0.255) int]_[*@3 from]_`=_[@3 0])&] -[s5; Locates the row (using linear search beginning at the row [/ from]) -in which the source index value identified by its ordinal number -[/ ii] equals [/ val]. If such a row is found, the [* SetCursor] is -called automatically to move the cursor to such a row.&] -[s7; [%-*C@3 val]-|value to look for in the given source index&] -[s7; [%-*C@3 ii]-|zero`-based ordinal number of the source index to -search&] -[s7; [%-*C@3 from]-|zero`-based row index to start the search from&] -[s7; [*/ Return value]-|zero`-based number of the matched row, `-1 when -none&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:FindSetCursor`(const Value`&`,const Id`&`,int`):%- [@(0.0.255) bool]_ -[* FindSetCursor]([@(0.0.255) const]_[_^Value^ Value][@(0.0.255) `&]_[*@3 val], -[@(0.0.255) const ][_^Id^ Id]`&_[*@3 id], [@(0.0.255) int]_[*@3 from]_`=_[@3 0])&] -[s5; Locates the row (using linear search beginning at the row [/ from]) -in which the source index value identified by [/ id] equals [/ val]. -If such a row is found, the [* SetCursor] is called automatically -to move the cursor to such a row.&] -[s7; [%-*C@3 val]-|value to look for in the given source index&] -[s7; [%-*C@3 id]-|source index identifier&] -[s7; [%-*C@3 from]-|zero`-based row index to start the search from&] -[s7; [*/ Return value]-|[* true] `= the desired row was found (and the -cursor set), [* false] when not&] -[s3; &] -[s0;* &] -[s0; [* User interface elements]&] -[s3; &] -[s0; &] -[s1;:ArrayCtrl`:`:StdBar`(Bar`&`):%- [@(0.0.255) void]_[* StdBar]([_^Bar^ Bar][@(0.0.255) `&]_ -[*@3 menu])&] -[s5; The default array local menu. The default local menu consists -of the standard editation actions (inserting / appending / duplicating -a row, editing a row, removing a row, moving a row, select all -rows) filtered by the array properties enabling / disabling the -various GUI elements (item insertion / deletion etc.). &] -[s7; [*C@3 menu]-|the [* Bar] object representing the menu being generated&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:IsModified`(int`)const:%- [@(0.0.255) bool]_[* IsModified]([@(0.0.255) in -t]_[*@3 ii])_[@(0.0.255) const]&] -[s5; Checks a source index in the currently edited row for changes.&] -[s7; [%-*C@3 ii]-|zero`-based row index&] -[s7; [*/ Return value]-|[* true] `= the index has been modified, [* false] -`= the index is in its original state&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:IsModified`(const Id`&`)const:%- [@(0.0.255) bool]_[* IsModified]([@(0.0.255) c -onst ][_^Id^ Id]`&_[*@3 id])_[@(0.0.255) const]&] -[s5; Checks a source index in the currently edited array row for -changes.&] -[s7; [%-*C@3 id]-|source index identifier&] -[s7; [*/ Return value]-|[* true] `= the source index has been modified, -[* false ]when not&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:StartEdit`(int`):%- [@(0.0.255) bool]_[* StartEdit]([@(0.0.255) int]_[*@3 d -]_`=_[@3 0])&] -[s5; Opens the current cursor row for editing and sets focus to the -[/ d]`-th column.&] -[s7; [%-*C@3 d]-|zero`-based column index&] -[s7; [*/ Return value]-|[* true] `= editation successfully initiated, -[* false] when not (when the array is in [* ReadOnly] mode or it -has no editable columns)&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:GetEditColumn`(`)const:%- [@(0.0.255) int]_[* GetEditColumn]()_[@(0.0.255) c -onst]&] -[s5; Returns the column being currently edited.&] -[s7; [*/ Return value]-|zero`-based index of the column being edited, -`-1 `= none&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:DoEdit`(`):%- [@(0.0.255) void]_[* DoEdit]()&] -[s5; Opens the current cursor row for editing.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:DoInsert`(int`):%- [@(0.0.255) void]_[* DoInsert]([@(0.0.255) int]_[*@3 cur -sor])&] -[s5; Begins the GUI insertion of a new row at a given location.&] -[s7; [%-*C@3 cursor]-|zero`-based location of the new row&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:DoInsertBefore`(`):%- [@(0.0.255) void]_[* DoInsertBefore]()&] -[s5; Begins the GUI insertion of a new row above the current row.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:DoInsertAfter`(`):%- [@(0.0.255) void]_[* DoInsertAfter]()&] -[s5; Begins the GUI insertion of a new row below the current row.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:DoAppend`(`):%- [@(0.0.255) void]_[* DoAppend]()&] -[s5; Begins the GUI insertion of a new row at the end of the array.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:DoRemove`(`):%- [@(0.0.255) virtual] [@(0.0.255) bool]_[* DoRemove]()&] -[s5; Performs the GUI`-based removal of the current cursor row. When -the [* AskRemove] property is set to [* true] and the user cancels -the confirmation dialog, the function returns [* false] and the -current row is not removed.&] -[s7; [*/ Return value]-|[* true] `= row has been removed successfully, -[* false] `= user has canceled the row removal&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:DoDuplicate`(`):%- [@(0.0.255) void]_[* DoDuplicate]()&] -[s5; Duplicates the current row and opens it for editing.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:DoSelectAll`(`):%- [@(0.0.255) void]_[* DoSelectAll]()&] -[s5; Marks all array row as selected.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:AcceptEnter`(`):%- [@(0.0.255) bool]_[* AcceptEnter]()&] -[s5; Performs all necessary GUI actions equivalent to when the user -presses the [* Enter] key. The row being currently edited is committed -and, in the case it was a newly appended line and the [* NoInsertAppend] -property is not set, an additional row is added to the array -and opened for editation.&] -[s7; [*/ Return value]-|[* true] `= the current row has been successfully -committed, [* false] when not&] -[s3; &] -[s0; &] -[s0; &] -[s0; [* Content export]&] -[s0;* &] -[s3;%- &] -[s1;:ArrayCtrl`:`:AsText`(String`(`*`)`(const Value`&`)`,bool`,const char`*`,const char`*`,const char`*`,const char`*`)const:%- [_^String^ S -tring]_[* AsText]([_^String^ String]_(`*[*@3 format])([@(0.0.255) const]_Value[@(0.0.255) `& -]), [@(0.0.255) bool]_[*@3 sel]_`=_[@(0.0.255) false], [@(0.0.255) const]_[@(0.0.255) char]_ -`*[*@3 tab]_`=_`"`\t`", [@(0.0.255) const]_[@(0.0.255) char]_`*[*@3 row]_`=_`"`\r`\n`", -[@(0.0.255) const]_[@(0.0.255) char]_`*[*@3 hdrtab]_`=_`"`\t`", [@(0.0.255) const]_[@(0.0.255) c -har]_`*[*@3 hdrrow]_`=_`"`\r`\n`")_[@(0.0.255) const]&] -[s5; Generic function for conversion of ArrayCtrl content to text. -The content visible on screen is exported (means, it exports -columns defined using AddColumn, not indicies). Cells are converted -to output format using [%-*@3 format] function. If [%-*@3 sel] is -true, only rows with IsSel true are exported. [%-*@3 tab] represents -a separator text between cells in a row, [%-*@3 row] separator -of rows. [%-*@3 hdrtab] is separator of header cells (those are -texts of ArrayCtrl header) `- if NULL, no header is exported. -[%-*@3 hdrrow].is separator of header and data rows.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:SetClipboard`(bool`,bool`)const:%- [@(0.0.255) void]_[* SetClipboard]([@(0.0.255) b -ool]_[*@3 sel]_`=_[@(0.0.255) false], [@(0.0.255) bool]_[*@3 hdr]_`=_[@(0.0.255) true])_[@(0.0.255) c -onst]&] -[s5; Puts ArrayCtrl content to clipboard in text format, `"`\t`" -and `"`\r`\n`" as separators. If [%-*@3 sel] is true, only rows -with IsSel true are exported, [%-*@3 hdr] controls whether header -is exported.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:AsQtf`(bool`,bool`):%- [_^String^ String]_[* AsQtf]([@(0.0.255) bool]_[*@3 s -el]_`=_[@(0.0.255) false], [@(0.0.255) bool]_[*@3 hdr]_`=_[@(0.0.255) true])&] -[s5; Returns ArrayCtrl content in QTF format. If [%-*@3 sel] is true, -only rows with IsSel true are exported, [%-*@3 hdr] controls whether -header is exported.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:AsCsv`(bool`,int`,bool`):%- [_^String^ String]_[* AsCsv]([@(0.0.255) bool -]_[*@3 sel]_`=_[@(0.0.255) false], [@(0.0.255) int]_[*@3 sep]_`=_`';`', -[@(0.0.255) bool]_[*@3 hdr]_`=_[@(0.0.255) true])&] -[s5; Returns ArrayCtrl content in csv format, using [%-*@3 sep] as -separator. If [%-*@3 sel] is true, only rows with IsSel true are -exported, [%-*@3 hdr] controls whether header is exported.&] -[s0; &] -[s0; &] -[s0; [* Notification callbacks]&] -[s3; &] -[s0; &] -[s1;:ArrayCtrl`:`:WhenLeftClick:%- [_^Callback^ Callback]_[* WhenLeftClick]&] -[s5; This callback is called whenever the user clicks an array cell.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:WhenLeftDouble:%- [_^Callback^ Callback]_[* WhenLeftDouble]&] -[s5; This callback is called whenever the user doubleclicks an array -cell.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:WhenBar:%- [_^Callback1^ Callback1]_[* WhenBar]&] -[s5; This callback is called whenever the local array menu has to -be regenerated. By setting this callback to a different function -/ method you can supply a custom local menu for the array. The -[* Bar`&] argument is a reference to the menu to be generated.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:WhenEnterRow:%- [_^Callback^ Callback]_[* WhenEnterRow]&] -[s5; This callback is called every time the cursor location changes -to a different row of the array.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:WhenAcceptRow:%- [_^Gate^ Gate]_[* WhenAcceptRow]&] -[s5; This gate is called every time an array row (open for editing) -needs to be validated. When the gate returns [* false], the validation -process is assumed to have failed, when it returns [* true], it -is assumed to have succeeded. You can use this callback to add -your own validation algorithms relevant to the array context -within your application.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:WhenUpdateRow:%- [_^Callback^ Callback]_[* WhenUpdateRow]&] -[s5; This callback is called whenever an array row has been updated. -You can use this callback e.g. to project the changes to a database -or generally to an external data source.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:WhenKillCursor:%- [_^Callback^ Callback]_[* WhenKillCursor]&] -[s5; This callback is called whenever the cursor is moved away from -the table.&] -[s5; [* Note:] internally, when moving the cursor (e.g. by calling the -[* SetCursor ]method), after committing the previous row the cursor -is removed from the table using [* KillCursor] and placed to the -new location afterwards. Therefore every time the cursor is moved, -the [* WhenKillCursor] callback is called as a by`-product.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:WhenCursor:%- [_^Callback^ Callback]_[* WhenCursor]&] -[s5; This callback is called every time the cursor row number changes -(either when the cursor is removed from the table, or when it -has been moved to a different row).&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:WhenArrayAction:%- [_^Callback^ Callback]_[* WhenArrayAction]&] -[s5; This callback is called every time the source array data changes -(typically after accepting changes to a certain row or after -deleting a row).&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:WhenStartEdit:%- [_^Callback^ Callback]_[* WhenStartEdit]&] -[s5; This callback is called whenever the array row editation process -is initiated. It can be used e.g. to set up some additional properties -of the column editor objects, to fill in drop`-down lists pertaining -to certain column editors etc.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:WhenAcceptEdit:%- [_^Callback^ Callback]_[* WhenAcceptEdit]&] -[s5; This callback is called whenever the currently edited line has -been committed.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:WhenSelection:%- [_^Callback^ Callback]_[* WhenSelection]&] -[s5; This callback is called whenever the current array selection -changes. This includes changes to the cursor location as the -cursor is automatically considered part of the selection.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:WhenCtrlsAction:%- [_^Callback^ Callback]_[* WhenCtrlsAction]&] -[s5; This callback is called whenever some of the editor controls -constructed automatically via the column editation [/ factory] -calls its [* WhenAction] method. It can be used to watch out for -changes in the cell editors and react to specific situations -accordingly.&] -[s3; &] -[s0; &] -[s0; &] -[s0;%- &] -[ {{10000t/25b/25@3 [s0;%- [*@(229)4 ArrayCtrl`::IdInfo]]}}&] -[s3; &] -[s2;:ArrayCtrl`:`:IdInfo`:`:struct:%- [@(0.0.255)3 struct][3 _][*3 IdInfo]&] -[s4; The [* IdInfo] structure contains properties of all source array -indices. It can be used to set additional properties pertaining -to source array data.&] -[s3; &] -[s0;%- &] -[ {{10000F(128)G(128)@1 [s0; [* Public Member List]]}}&] -[s3;%- &] -[s1;:ArrayCtrl`:`:IdInfo`:`:InsertValue`(const Value`&`):%- [_^ArrayCtrl`:`:IdInfo^ IdI -nfo][@(0.0.255) `&]_[* InsertValue]([@(0.0.255) const]_[_^Value^ Value][@(0.0.255) `&]_[*@3 v -])&] -[s5; The method sets up the default source index value for newly -created rows. This is used only when the row insertion is GUI`-based -(like using the [* DoInsert] method for instance). When a row is -added to the array programmatically (e.g. using [* Add] or [* Insert]), -these default values are not used.&] -[s7; [%-*C@3 v]-|default source index value&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:IdInfo`:`:InsertValue`(ValueGen`&`):%- [_^ArrayCtrl`:`:IdInfo^ IdInfo -][@(0.0.255) `&]_[* InsertValue]([_^ValueGen^ ValueGen][@(0.0.255) `&]_[*@3 g])&] -[s5; The method sets up a factory for generating default index values -for newly created rows. This is used only when the row insertion -is GUI`-based (like using the [* DoInsert] method for instance). -When a row is added to the array programmatically (e.g. using -[* Add] or [* Insert]), the [* InserValue] property is not consulted.&] -[s7; [%-*C@3 g]-|a reference to the value generation factory. The ownership -to the factory is not passed by this call; the caller must insure -the existence of the factory object throughout the array duration.&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:IdInfo`:`:Accel`(int`(`*`)`(int`)`):%- [_^ArrayCtrl`:`:IdInfo^ IdInfo -][@(0.0.255) `&]_[* Accel]([@(0.0.255) int]_(`*[*@3 filter])([@(0.0.255) int]))&] -[s5; This method sets up the source index accelerator function. The -accelerator is used to quickly locate rows using the keyboard -key presses.&] -[s7; [%-*C@3 filter]-|a [* CharFilter ]function for keypress filtering&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:IdInfo`:`:Accel`(`):%- [_^ArrayCtrl`:`:IdInfo^ IdInfo][@(0.0.255) `&]_[* A -ccel]()&] -[s5; This method sets up keyboard acceleration for the given source -index. The `'trivial`' [/ CharConvert] is used for character translation.&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:IdInfo`:`:GetInsertValue`(`):%- [_^Value^ Value]_[* GetInsertValue]()&] -[s5; Uses the [* InsertValue] property to generate a new source index -value (either using a fixed default value or the value creation -factory).&] -[s7; [*/ Return value]-|the generated value to be used as the default -for the newly inserted row.&] -[s3; &] -[s0; &] -[s0; &] -[s0;%- &] -[ {{10000t/25b/25@3 [s0;%- [*@(229)4 ArrayCtrl`::Column]]}}&] -[s3; &] -[s2;:ArrayCtrl`:`:Column`:`:class:%- [@(0.0.255)3 class][3 _][*3 Column][3 _:_][@(0.0.255)3 priv -ate][3 _][*@3;3 FormatConvert]&] -[s5; &] -[s0;%- [%%/ Derived from][%% ]FormatConvert&] -[s0; &] -[s0;%- The [* ArrayCtrl`::Column] structure describes an output array -column. Its methods can be used to set or query its properties, -some of which are also settable via ArrayCtrl methods.&] -[s3;%- &] -[s0;%- &] -[ {{10000F(128)G(128)@1 [s0; [* Public Member List]]}}&] -[s3;%- &] -[s1;:ArrayCtrl`:`:Column`:`:Add`(int`):%- [_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `&]_ -[* Add]([@(0.0.255) int]_[*@3 `_pos])&] -[s5; Adds another source data index to the list of source indices -used as the data for the given output column.&] -[s7; [%-*C@3 `_pos]-|zero`-based ordinal number of the source index&] -[s7; [*/ Return value]-|[* `*this].&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Column`:`:Add`(const Id`&`):%- [_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `& -]_[* Add](const [_^Id^ Id]`&_[*@3 id])&] -[s5; Adds another source data index to the list of source indices -used as the data for the given output column.&] -[s7; [%-*C@3 id]-|the [* Id] identifier of the source index&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Column`:`:AddIndex`(const Id`&`):%- [_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `& -]_[* AddIndex]([@(0.0.255) const]_[_^Id^ Id][@(0.0.255) `&]_[*@3 id])&] -[s5; Adds another source index to the array and adds it to the list -of source indices bound to this output column. The newly created -index is assigned the given identifier.&] -[s7; [%-*C@3 id]-|the identifier for the newly created index&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Column`:`:AddIndex`(`):%- [_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `& -]_[* AddIndex]()&] -[s5; Adds another source index to the array and adds it to the list -of source indices bound to this output column.&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Column`:`:SetConvert`(const Convert`&`):%- [_^ArrayCtrl`:`:Column^ Co -lumn][@(0.0.255) `&]_[* SetConvert]([@(0.0.255) const]_[_^Convert^ Convert][@(0.0.255) `&]_ -[*@3 c])&] -[s5; Sets the [* Convert] object for the given column. This object -is used to convert the source values (obtained from the source -data matrix) to the values displayable and/or editable by the -respective column display / editor object.&] -[s5; [* Note:] the ownership of the [* Convert] object is not transferred -by this function. The array merely stores a pointer to the Convert -object. It is up to the host application to keep the Convert -object alive as long as necessary (until the ArrayCtrl object -is destroyed or all references to the Convert object obliterated -by new calls to the [* SetConvert] method). In any case, most Convert`-based -object do not support copying at all; moreover, as the Convert`-based -objects are mostly derived from the basic class, their copying -is normally prone to slicing.&] -[s7; [%-*C@3 c]-|a constant reference to the Convert object to use for -the given column&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Column`:`:SetFormat`(const char`*`):%- [@(0.0.255) virtual] -[_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `&]_[* SetFormat]([@(0.0.255) const]_[@(0.0.255) c -har]_`*[*@3 fmt])&] -[s5; Sets the format string to use for the default value formatting. -When no Convert object is set for the column, the source value -is normally passed to the [* NFormat] function where the [/ fmt] -argument defines the desired formatting pattern.&] -[s7; [%-*C@3 fmt]-|a [* NFormat]`-compatible formatting pattern&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Column`:`:SetDisplay`(const Display`&`):%- [_^ArrayCtrl`:`:Column^ Co -lumn][@(0.0.255) `&]_[* SetDisplay]([@(0.0.255) const]_[_^Display^ Display][@(0.0.255) `&]_ -[*@3 d])&] -[s5; Sets the default Display to use for this column. The column -Display can be overridden for certain array cells by calls to -the [*^topic`:`/`/CtrlLib`/src`/ArrayCtrl`$en`-us`#`:`:ArrayCtrl`:`:SetDisplay`(int`,int`,const Display`&`)^ A -rrayCtrl`::SetDisplay] method.&] -[s5; [* Note:] the ownership to the Display object is not transferred -by this function. The array merely stores a pointer to the Display; -it is up to the host application to keep the Display object alive -as long as necessary.&] -[s7; [%-*C@3 d]-|a reference to the Display object&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Column`:`:Edit`(Ctrl`&`):%- [_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `& -]_[* Edit]([_^Ctrl^ Ctrl][@(0.0.255) `&]_[*@3 e])&] -[s5; Sets up the Ctrl`-based object to use for inline array column -editing.&] -[s7; [%-*C@3 e]-|a reference to the editor control object&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Column`:`:Ctrls`(Callback1``&`>`):%- [_^ArrayCtrl`:`:Column^ C -olumn][@(0.0.255) `&]_[* Ctrls]([_^Callback1^ Callback1]<[_^One^ One]<[_^Ctrl^ Ctrl]>`&>_[*@3 f -actory])&] -[s5; The methods sets up a factory which the ArrayCtrl uses as necessary -to create new Ctrl`'s for editing a given column. The argument -of this function is a callback, which, upon execution, should -allocate (normally using the [* new] operator) the desired editor -object and set it to its argument. If the position of Ctrl is -equivalent to `'SetRect(0, 0, 0, 0)`', which is the default value, -Ctrl is resized to fit the ArrayCtrl cell accurately, otherwise -the position represents the position within the cell.&] -[s7; [%-*C@3 factory]-|callback used for new control creation&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Column`:`:Ctrls`(void`(`*`)`(One``&`)`):%- [_^ArrayCtrl`:`:Column^ C -olumn][@(0.0.255) `&]_[* Ctrls]([@(0.0.255) void]_(`*[*@3 factory])(One`&))&] -[s5; This method sets up a factory which the ArrayCtrl uses as necessary -to create new Ctrl`'s for editing a given column. The argument, -a global function, is supposed to allocate a new editor control -(normally using the [* new] operator) and set it to its argument. -If the position of Ctrl is equivalent to `'SetRect(0, 0, 0, 0)`', -which is the default value, Ctrl is resized to fit the ArrayCtrl -cell accurately, otherwise the position represents the position -within the cell. If the position of Ctrl is equivalent to `'SetRect(0, -0, 0, 0)`', which is the default value, Ctrl is resized to fit -the ArrayCtrl cell accurately, otherwise the position represents -the position within the cell.&] -[s7; [%-*C@3 factory]-|a global function used for editor control creation&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Column`:`:Ctrls`(`):%- [@(0.0.255) template]_<[@(0.0.255) class]_[*@4 T]> -_[_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `&]_[* Ctrls]()&] -[s5; This member template sets up a default factory for creating -editor controls of a given type. Every time the ArrayCtrl needs -to create a new editor control, an object of the type [* T] is -created automatically (using the [* new] operator). If the position -of Ctrl is equivalent to `'SetRect(0, 0, 0, 0)`', which is the -default value, Ctrl is resized to fit the ArrayCtrl cell accurately, -otherwise the position represents the position within the cell.&] -[s7; [*C@4 T]-|the desired object editor type &] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Column`:`:InsertValue`(const Value`&`):%- [_^ArrayCtrl`:`:Column^ Col -umn][@(0.0.255) `&]_[* InsertValue]([@(0.0.255) const]_[_^Value^ Value][@(0.0.255) `&]_[*@3 v -])&] -[s5; Instructs the ArrayCtrl object to initialize this column in -newly created rows to the given value [/ v]. (This applies only -to GUI`-based row insertion using methods like [* DoInsert] etc., -the low`-level, programmer`-controlled row insertion methods -like [* Add] or [* Insert] always initialize the source data matrix -with [* Null]`'s).&] -[s7; [%-*C@3 v]-|the value to use as the default for newly inserted -rows&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Column`:`:InsertValue`(ValueGen`&`):%- [_^ArrayCtrl`:`:Column^ Column -][@(0.0.255) `&]_[* InsertValue]([_^ValueGen^ ValueGen][@(0.0.255) `&]_[*@3 g])&] -[s5; Programs the ArrayCtrl object to use the given [* ValueGen] factory -for default value generation for newly created rows. This can -be used e.g. to generate unique UUID`'s or primary keys using -an Oracle SEQUENCE object for a primary key column.&] -[s7; [%-*C@3 g]-|a reference to the ValueGen object used for default -value generation&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Column`:`:NoClickEdit`(`):%- [_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `& -]_[* NoClickEdit]()&] -[s5; Disables entering the editation mode when clicking the respective -column.&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Column`:`:Cache`(`):%- [_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `&]_[* C -ache]()&] -[s5; Enables using the cache to store the converted values of this -column. By default, converted value caching is turned off to -make cell value conversion entirely dynamic; however, very often -it is advisable to enable using the cache, especially when the -conversion is relatively slow (for instance, when the conversion -queries a database connection to convert the value).&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Column`:`:Accel`(int`(`*`)`(int`)`):%- [_^ArrayCtrl`:`:Column^ Column -][@(0.0.255) `&]_[* Accel]([@(0.0.255) int]_(`*[*@3 filter])([@(0.0.255) int]))&] -[s5; Sets up the accelerator for the given column. A given filtering -function is used to convert keystrokes before acceleration.&] -[s7; [%-*C@3 filter]-|a [* CharConvert]`-style function to use for keystroke -conversion&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Column`:`:Accel`(`):%- [_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `&]_[* A -ccel]()&] -[s5; Sets up the accelerator for the given column. No keystroke conversion -is performed.&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Column`:`:Margin`(int`):%- [_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `& -]_[* Margin]([@(0.0.255) int]_[*@3 m])&] -[s5; Sets up the margin width for the given column. This is equivalent -to calling the [*^topic`:`/`/CtrlLib`/src`/HeaderCtrl`$en`-us`#`:`:HeaderCtrl`:`:Column`:`:SetMargin`(int`)^ S -etMargin] method of the underlying [* HeaderTab].&] -[s7; [%-*C@3 m]-|&] -[s7; [*/ Return value]-|[* `*this]&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Column`:`:Sorting`(const ValueOrder`&`):%- [_^ArrayCtrl`:`:Column^ Co -lumn][@(0.0.255) `&]_[* Sorting]([@(0.0.255) const]_[_^ValueOrder^ ValueOrder][@(0.0.255) `& -]_[*@3 o])&] -[s1;:ArrayCtrl`:`:Column`:`:Sorting`(int`(`*`)`(const Value`&a`,const Value`&b`)`):%- [_^ArrayCtrl`:`:Column^ C -olumn][@(0.0.255) `&]_[* Sorting]([@(0.0.255) int]_(`*[*@3 c])([@(0.0.255) const]_Value[@(0.0.255) `& -]_a, [@(0.0.255) const]_Value[@(0.0.255) `&]_b))&] -[s1;:ArrayCtrl`:`:Column`:`:Sorting`(`):%- [_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `&]_ -[* Sorting]()&] -[s5; Activates sorting of ArrayCtrl column by clicking on its header -tab. Parameterless version uses default Value ordering using -StdValueCompare.&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Column`:`:SortDefault`(`):%- [_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `& -]_[* SortDefault]()&] -[s5; Sets this column to be initial sorting column (calls SetSortColumn -of ArrayCtrl).&] -[s3; &] -[s6;%- &] -[s1;:ArrayCtrl`:`:Column`:`:HeaderTab`(`):%- [_^HeaderCtrl`:`:Column^ HeaderCtrl`::Colum -n][@(0.0.255) `&]_[* HeaderTab]()&] -[s5; Returns the [* HeaderCtrl`::Column] object describing the given -column. This object can be used to set up additional column properties -(like column width constraints or the [*^topic`:`/`/CtrlLib`/src`/HeaderCtrl`$en`-us`#`:`:HeaderCtrl`:`:Column`:`:Callback WhenAction^ W -henAction] callback).&] -[s3; &] -[s0; &] -[s0; &] -[s0;%- &] -[ {{10000t/25b/25@3 [s0;%- [*@(229)4 ArrayCtrl`::Order]]}}&] -[s3; &] -[s2;:ArrayCtrl`:`:Order`:`:struct:%- [@(0.0.255)3 struct][3 _][*3 Order]&] -[s4; The [* Order] object is used for array row sorting. The overloaded -[* operator ()] acts as the sorting predicate, which is consulted -within the sorting method to determine which of a given pair -of row is `'less`' according to the desired sorting.&] -[s3;%- &] -[s0;%- &] -[ {{10000F(128)G(128)@1 [s0; [* Public Member List]]}}&] -[s3;%- &] -[s1;:ArrayCtrl`:`:Order`:`:operator`(`)`(const Vector``&`,const Vector``&`)const:%- [@(0.0.255) v -irtual] [@(0.0.255) bool]_[* operator()]([@(0.0.255) const]_[_^Vector^ Vector]<[_^Value^ Va -lue]>`&_[*@3 row1], [@(0.0.255) const]_[_^Vector^ Vector]<[_^Value^ Value]>`&_[*@3 row2])_[@(0.0.255) c -onst]_`=_[@3 0]&] -[s5; The sorting predicate. This method should return [* true] when -its first argument ([/ row1]) is less than the second argument -([/ row2]) according to the desired ordering.&] -[s7; [%-*C@3 row1]-|an array of source data index values for the first -of the rows to compare&] -[s7; [%-*C@3 row2]-|an array of source data index values for the other -row to compare&] -[s7; [*/ Return value]-|[* true] `= row1 < row2, [* false] `= row1 >`= row2&] -[s3; &] -[s0;%CS-CZ ]] \ No newline at end of file diff --git a/uppdev/AccessKey/docProps/app.xml b/uppdev/AccessKey/docProps/app.xml deleted file mode 100644 index 02a47ca57..000000000 --- a/uppdev/AccessKey/docProps/app.xml +++ /dev/null @@ -1,2 +0,0 @@ - -Microsoft Excel0falselisty1testfalsefalsefalse14.0300 \ No newline at end of file diff --git a/uppdev/AccessKey/docProps/core.xml b/uppdev/AccessKey/docProps/core.xml deleted file mode 100644 index 7f9b4535c..000000000 --- a/uppdev/AccessKey/docProps/core.xml +++ /dev/null @@ -1,2 +0,0 @@ - -cxlcxl2011-11-09T13:03:21Z2011-11-09T13:03:21Z \ No newline at end of file diff --git a/uppdev/AccessKey/h.iml b/uppdev/AccessKey/h.iml deleted file mode 100644 index e8d647b6d..000000000 --- a/uppdev/AccessKey/h.iml +++ /dev/null @@ -1,2415 +0,0 @@ -PREMULTIPLIED -IMAGE_ID(a2) -IMAGE_ID() -IMAGE_ID(as) -IMAGE_ID(off) -IMAGE_ID(icon) IMAGE_META("exp", "") - -IMAGE_ID(eye) -IMAGE_ID(Small) -IMAGE_ID(Small) -IMAGE_ID(eye) -IMAGE_ID(icon) IMAGE_META("exp", "") - -IMAGE_ID(off) -IMAGE_ID(a) -IMAGE_ID(test) -IMAGE_ID(tst) -IMAGE_ID(b) -IMAGE_ID(centrum_holdings) -IMAGE_ID(sample) -IMAGE_ID(reject) -IMAGE_ID(eye) -IMAGE_ID(icon) IMAGE_META("exp", "") - -IMAGE_ID(off) -IMAGE_ID(tst) - -IMAGE_BEGIN_DATA -IMAGE_DATA(120,156,237,157,109,112,84,229,21,199,211,78,103,218,25,219,161,78,59,83,59,211,79,246,197,169,223,156,105,59,157,90) -IMAGE_DATA(59,173,125,113,170,126,113,58,248,161,118,108,181,22,71,109,63,84,91,181,162,142,56,130,47,168,83,68,20,5,69,4) -IMAGE_DATA(5,73,128,186,128,74,8,20,18,94,132,0,26,18,212,132,164,66,94,116,8,136,132,132,40,34,60,221,223,73,206,122) -IMAGE_DATA(179,36,100,223,238,238,146,252,255,206,241,238,222,189,207,189,119,47,119,207,47,231,156,231,121,110,197,132,138,9,21,159) -IMAGE_DATA(41,132,252,172,34,7,251,172,109,242,255,25,155,218,14,191,205,153,118,206,229,222,54,247,251,57,71,251,106,242,191,194) -IMAGE_DATA(253,32,115,253,18,185,95,192,124,255,1,198,75,123,191,206,165,106,95,234,239,127,38,181,47,137,35,192,134,58,131,92) -IMAGE_DATA(79,196,204,218,223,147,131,209,238,182,219,110,11,233,237,219,218,218,204,18,137,132,125,62,113,226,196,112,241,197,23,135) -IMAGE_DATA(115,207,61,55,163,246,216,250,245,235,135,180,199,70,59,62,199,140,126,206,241,220,210,215,15,215,126,218,180,105,118,158) -IMAGE_DATA(209,109,207,62,251,236,83,222,143,212,158,182,124,62,210,245,172,24,108,239,251,76,111,239,109,249,174,195,93,43,214,85) -IMAGE_DATA(156,230,252,105,199,53,235,233,233,25,246,248,190,223,145,218,251,191,89,250,113,163,239,249,142,126,141,210,219,167,31,151) -IMAGE_DATA(125,13,247,111,199,117,30,237,223,159,109,176,108,254,253,239,137,156,135,223,63,190,31,108,184,239,54,210,241,179,189,255) -IMAGE_DATA(115,181,193,246,21,44,115,53,57,131,17,110,230,232,231,114,6,114,6,114,6,217,89,69,33,46,70,244,102,60,157,51) -IMAGE_DATA(24,237,102,116,27,206,25,100,210,158,118,172,243,31,173,91,69,197,169,206,33,189,189,59,3,62,231,181,255,112,221,216) -IMAGE_DATA(46,83,103,48,146,101,227,12,56,135,104,219,108,156,193,112,199,206,212,25,184,69,207,217,183,29,205,25,112,253,163,63) -IMAGE_DATA(62,255,183,115,163,237,72,206,128,246,254,111,56,156,51,192,88,231,78,127,184,246,110,35,57,3,218,186,211,74,111,159) -IMAGE_DATA(207,253,159,171,21,196,25,252,251,115,63,173,184,188,226,203,3,191,100,73,146,36,73,146,36,73,146,36,73,146,36,73) -IMAGE_DATA(146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36) -IMAGE_DATA(73,146,36,73,146,36,73,146,36,73,146,202,86,39,78,158,56,173,29,235,239,13,39,142,31,29,120,159,92,14,121,159) -IMAGE_DATA(129,245,126,122,50,181,236,238,59,110,75,183,244,207,125,153,110,7,143,159,186,46,186,143,140,140,115,206,226,188,101,178) -IMAGE_DATA(177,96,146,20,167,70,189,7,35,126,55,27,118,184,127,135,25,248,255,246,3,125,161,165,243,160,217,174,182,238,80,223) -IMAGE_DATA(212,110,75,222,55,237,27,88,231,239,59,122,135,231,72,58,99,178,250,45,137,31,178,113,104,146,20,167,70,189,7,79) -IMAGE_DATA(227,115,123,250,63,177,101,122,172,128,255,111,121,239,136,241,160,102,235,238,80,219,208,106,203,215,54,55,166,150,137,186) -IMAGE_DATA(237,102,207,175,218,24,158,75,172,11,115,150,174,9,179,151,188,98,203,197,213,155,109,155,234,237,123,66,99,231,145,208) -IMAGE_DATA(114,240,184,237,51,61,14,225,125,198,191,37,241,67,54,14,77,146,226,84,182,247,227,177,143,62,30,242,222,253,56,62) -IMAGE_DATA(126,71,251,145,80,223,218,109,182,161,169,35,172,107,104,51,6,176,220,248,78,151,173,127,179,237,176,109,199,114,251,222) -IMAGE_DATA(15,108,29,159,177,221,146,154,122,227,199,67,207,45,11,83,30,95,16,110,127,228,217,48,115,81,141,49,38,177,169,41) -IMAGE_DATA(108,108,73,198,42,251,251,67,91,207,9,227,73,215,177,144,93,44,34,126,200,198,153,73,82,156,202,232,62,76,250,221) -IMAGE_DATA(222,99,253,167,176,3,107,104,237,52,255,239,188,224,53,92,32,110,240,216,1,195,231,227,239,241,251,24,239,49,182,129) -IMAGE_DATA(9,48,133,118,53,141,93,97,213,214,166,176,112,77,125,152,155,168,11,247,204,90,28,238,157,83,25,30,154,183,50,204) -IMAGE_DATA(172,170,13,47,173,77,198,37,59,59,194,182,255,29,11,77,221,39,66,231,161,79,66,119,111,159,197,66,81,142,100,157) -IMAGE_DATA(223,146,201,198,160,73,82,156,202,228,30,76,231,6,190,186,101,207,222,80,91,191,219,242,81,112,99,75,115,155,49,160) -IMAGE_DATA(117,127,111,138,21,206,139,232,123,231,6,76,113,118,184,69,25,2,35,86,110,219,19,86,108,220,99,204,120,106,89,93) -IMAGE_DATA(152,190,112,141,25,175,23,212,52,218,103,196,47,48,140,186,201,254,67,125,195,214,232,101,178,241,106,146,20,167,178,189) -IMAGE_DATA(31,97,199,155,187,247,132,234,181,155,67,226,149,255,166,124,119,215,225,1,223,141,193,9,114,90,110,206,14,94,59,59) -IMAGE_DATA(136,29,224,5,241,138,231,182,96,7,235,48,216,194,242,157,247,63,13,91,219,122,141,41,47,173,107,14,243,87,109,55) -IMAGE_DATA(126,60,177,104,131,229,182,170,106,27,173,86,66,141,133,122,11,252,130,89,94,183,23,67,100,227,217,36,41,78,101,115) -IMAGE_DATA(47,182,30,248,32,84,111,216,18,22,45,123,37,172,219,244,134,245,169,194,60,119,228,253,173,162,181,110,184,225,249,43) -IMAGE_DATA(152,65,13,195,226,139,198,253,161,178,190,213,98,12,106,31,172,227,51,183,245,187,15,216,58,150,188,135,33,24,239,137) -IMAGE_DATA(59,156,35,152,215,71,96,8,117,21,63,158,247,227,42,228,239,49,159,135,53,187,149,218,167,20,195,10,113,157,198,203) -IMAGE_DATA(181,138,211,36,41,78,101,114,15,226,131,91,58,186,66,237,246,157,150,179,162,191,45,117,7,171,61,16,115,244,246,165) -IMAGE_DATA(248,193,223,255,244,189,242,56,3,126,224,255,183,119,159,12,171,26,186,195,130,186,61,102,119,61,183,38,204,124,185,62) -IMAGE_DATA(204,168,218,54,16,87,188,210,16,18,91,218,45,87,69,92,177,98,71,71,216,216,218,99,235,120,13,111,96,7,198,107) -IMAGE_DATA(24,66,236,65,187,103,87,111,51,134,80,127,135,69,28,207,115,99,30,247,148,147,95,44,181,79,137,219,10,197,142,241) -IMAGE_DATA(114,189,226,52,73,138,83,163,221,127,212,205,219,15,28,12,187,247,117,154,193,7,103,71,212,188,31,22,57,36,235,119) -IMAGE_DATA(53,88,191,152,179,114,91,152,252,244,138,112,223,252,53,225,166,233,149,225,207,247,45,48,251,205,141,143,135,43,111,157) -IMAGE_DATA(109,235,176,201,179,94,11,83,230,86,135,105,139,94,15,115,87,55,134,5,27,247,134,165,219,58,67,213,230,118,91,98) -IMAGE_DATA(137,29,251,141,65,240,196,205,120,84,211,104,245,118,150,196,33,22,203,36,217,67,254,203,115,89,133,138,67,114,241,113) -IMAGE_DATA(227,205,31,230,195,1,241,163,176,38,73,113,106,164,251,142,154,121,148,29,196,31,94,83,128,23,196,22,238,151,189,255) -IMAGE_DATA(46,204,32,118,184,99,102,101,184,111,238,0,51,96,5,156,248,245,245,211,195,69,215,207,72,25,252,184,252,246,249,225) -IMAGE_DATA(71,87,77,11,63,188,242,206,112,217,45,79,134,95,252,113,138,173,187,127,94,93,248,199,211,107,195,228,231,55,133,25) -IMAGE_DATA(203,147,241,200,170,198,48,235,181,166,48,103,109,203,16,123,102,67,155,113,198,99,26,227,72,221,110,139,89,136,81,96) -IMAGE_DATA(136,143,29,137,230,216,10,237,27,179,109,83,106,159,18,183,229,195,0,241,163,176,38,73,113,106,164,251,14,118,144,151) -IMAGE_DATA(130,27,152,215,52,172,158,241,222,64,93,155,117,212,52,106,118,247,133,231,215,180,88,223,168,27,166,45,12,191,187,249) -IMAGE_DATA(81,227,5,6,27,96,196,119,47,189,53,156,127,197,228,240,173,75,110,9,223,248,249,141,246,158,215,124,134,93,120,237) -IMAGE_DATA(195,246,158,245,81,190,76,122,56,17,110,124,236,213,20,79,210,13,134,156,194,145,228,107,98,149,234,230,131,22,131,56) -IMAGE_DATA(235,96,72,190,185,172,66,241,35,223,92,205,233,182,47,117,158,168,24,252,40,212,119,28,109,187,108,174,85,169,175,187) -IMAGE_DATA(248,33,21,91,35,221,119,61,71,143,134,247,122,14,153,69,251,196,194,15,216,65,127,41,106,17,175,54,28,177,24,225) -IMAGE_DATA(186,169,149,41,94,124,231,103,215,134,115,126,240,251,112,214,5,87,135,175,253,228,47,198,13,12,38,96,240,2,70,176) -IMAGE_DATA(156,240,227,235,140,39,108,235,198,58,231,10,219,19,155,192,146,137,147,23,134,171,238,125,41,92,253,224,138,112,243,172) -IMAGE_DATA(213,225,246,57,155,194,3,203,118,133,233,137,134,33,241,8,57,175,37,13,93,150,235,242,90,8,117,126,239,31,86,42) -IMAGE_DATA(223,152,169,175,201,166,109,33,252,87,161,253,89,177,217,148,207,119,44,196,53,42,151,235,46,126,72,197,214,112,247,28) -IMAGE_DATA(177,7,252,240,186,120,122,95,92,254,166,167,206,77,188,65,237,2,22,192,0,152,65,12,1,43,240,253,248,125,252,63) -IMAGE_DATA(62,31,223,207,123,226,12,255,204,141,207,88,143,193,31,246,197,62,88,122,108,130,121,92,194,246,196,36,196,31,30,151) -IMAGE_DATA(76,125,121,167,229,185,224,136,215,78,48,242,88,176,142,152,137,241,33,196,76,229,228,27,179,221,95,161,253,96,28,190) -IMAGE_DATA(44,46,223,24,231,119,44,54,127,138,197,16,73,138,83,209,123,141,154,7,6,59,176,67,31,31,181,156,15,127,187,91) -IMAGE_DATA(191,170,131,199,109,172,6,115,140,48,183,200,181,119,205,73,197,19,158,123,242,120,1,31,79,124,176,118,79,8,213,111) -IMAGE_DATA(125,26,102,174,108,182,58,8,177,201,87,190,253,91,99,13,70,204,2,95,224,16,185,42,182,97,31,212,66,206,187,228) -IMAGE_DATA(198,33,249,45,55,103,18,219,123,126,235,239,179,95,181,62,93,244,231,162,86,50,175,182,221,56,98,253,184,146,231,204) -IMAGE_DATA(24,21,190,199,187,135,63,42,43,223,152,205,254,178,245,99,103,194,119,42,214,126,115,225,199,233,246,83,142,215,125,56) -IMAGE_DATA(147,164,56,53,100,126,221,8,59,188,86,14,55,124,78,43,242,85,140,183,248,195,205,15,134,203,174,249,151,213,57,240) -IMAGE_DATA(223,228,150,220,183,243,250,186,187,151,24,59,42,235,15,164,248,65,125,228,202,155,158,48,102,124,254,156,11,205,206,254) -IMAGE_DATA(222,165,198,18,88,65,191,171,59,231,214,132,73,15,86,25,15,60,118,33,30,97,191,112,134,247,44,157,39,196,35,228) -IMAGE_DATA(178,48,120,226,49,137,231,179,96,8,252,96,110,21,250,28,251,120,149,66,251,176,124,254,166,20,63,206,44,126,20,243) -IMAGE_DATA(156,196,15,169,220,229,252,96,110,118,235,115,53,88,231,96,252,198,174,174,79,172,62,78,45,154,190,84,147,166,204,179) -IMAGE_DATA(248,128,229,29,179,18,230,243,241,213,238,235,137,57,224,9,62,156,177,29,180,219,220,113,60,60,181,114,151,245,169,130) -IMAGE_DATA(43,240,227,11,223,252,85,248,250,247,39,26,67,252,245,63,103,172,52,127,79,28,65,123,152,224,245,14,246,237,245,14) -IMAGE_DATA(214,113,14,94,59,129,35,231,95,117,159,173,247,186,8,53,17,226,29,24,194,57,216,248,246,230,142,212,216,198,98,242) -IMAGE_DATA(163,80,62,100,180,253,151,147,31,43,134,95,44,244,57,137,31,146,148,189,82,252,32,246,232,255,36,229,99,225,6,181) -IMAGE_DATA(113,114,64,112,194,251,225,210,191,10,22,192,4,98,10,114,69,206,15,114,80,228,144,124,12,199,202,119,246,219,184,65) -IMAGE_DATA(234,217,228,149,136,63,206,58,111,98,138,25,24,241,7,70,156,225,60,162,150,225,12,193,56,46,159,193,4,98,20,24) -IMAGE_DATA(1,139,156,29,24,231,224,181,117,218,178,61,28,225,28,25,83,200,216,116,250,34,19,79,149,147,111,204,100,127,153,240) -IMAGE_DATA(169,156,252,88,185,241,35,19,182,139,31,146,148,189,14,127,120,212,204,227,14,98,14,250,44,209,119,9,70,192,141,235) -IMAGE_DATA(31,88,20,110,153,177,204,198,247,69,231,192,101,124,5,124,193,119,147,203,178,184,99,112,172,6,253,104,233,63,75,141) -IMAGE_DATA(157,124,23,57,170,104,236,1,71,88,242,30,163,46,66,219,23,118,118,27,63,240,253,48,192,88,49,181,210,120,4,207) -IMAGE_DATA(224,1,231,197,103,228,171,200,151,145,199,138,246,207,34,78,113,126,48,126,209,231,54,97,254,149,241,196,143,124,172,156) -IMAGE_DATA(174,81,166,215,34,159,239,88,72,126,148,234,186,139,31,82,177,69,188,225,253,113,153,95,138,121,209,233,183,196,152,113) -IMAGE_DATA(254,238,167,70,78,174,10,255,237,181,4,114,65,212,163,201,113,193,8,182,131,31,248,107,114,80,228,141,108,219,189,125) -IMAGE_DATA(225,138,191,222,111,121,170,47,158,123,81,138,21,81,110,120,30,139,90,57,125,110,151,191,125,216,98,16,204,227,13,114) -IMAGE_DATA(91,156,83,125,231,9,227,90,229,198,150,48,123,121,131,49,194,235,47,222,183,139,56,136,26,10,253,178,136,121,224,7) -IMAGE_DATA(227,224,183,191,245,174,205,241,200,216,199,114,242,141,153,250,181,209,182,45,39,31,22,151,95,140,211,87,151,3,63,10) -IMAGE_DATA(205,14,241,67,138,91,228,169,188,198,129,79,198,231,18,115,80,167,134,11,212,49,240,193,248,108,234,8,252,253,110,227) -IMAGE_DATA(65,142,245,91,125,157,252,212,223,166,191,104,252,192,159,19,143,16,35,172,216,213,105,252,160,110,2,59,188,207,21,75) -IMAGE_DATA(207,97,241,26,126,84,124,233,252,240,203,107,238,50,54,192,16,140,24,134,120,132,246,196,48,196,58,240,202,231,236,229) -IMAGE_DATA(124,56,14,177,10,113,8,177,135,215,216,225,7,113,11,223,133,121,22,153,79,133,121,130,203,105,252,71,38,251,75,95) -IMAGE_DATA(87,12,126,196,229,231,75,189,223,114,231,71,28,236,16,63,164,184,197,216,113,216,129,239,167,126,225,181,105,226,6,216) -IMAGE_DATA(65,220,225,236,96,12,133,141,9,73,178,195,158,41,53,56,158,240,225,255,172,183,118,228,183,108,252,69,221,30,99,1) -IMAGE_DATA(252,32,102,32,182,240,254,86,112,195,251,93,97,21,19,46,48,190,16,239,108,74,114,12,118,80,55,121,226,181,29,118) -IMAGE_DATA(124,230,65,161,207,23,125,135,57,158,63,79,132,185,222,25,219,193,152,65,24,66,188,1,247,200,179,81,159,193,56,119) -IMAGE_DATA(230,88,244,120,137,60,221,153,200,143,108,89,19,183,79,18,63,226,255,174,133,50,73,138,83,244,177,133,27,196,15,228) -IMAGE_DATA(170,168,53,176,100,29,62,156,216,131,90,7,115,217,18,111,88,141,61,201,16,250,107,113,127,178,142,121,216,137,65,60) -IMAGE_DATA(207,5,63,136,63,200,109,17,159,220,112,255,188,84,191,221,116,126,176,142,227,173,109,61,18,26,63,10,182,175,23,234) -IMAGE_DATA(223,25,224,71,85,173,241,131,121,117,211,159,125,206,56,14,98,17,142,69,174,139,186,61,231,96,53,154,200,188,190,196) -IMAGE_DATA(30,62,118,176,28,231,191,26,105,127,217,250,184,56,125,107,185,248,249,177,198,143,98,176,71,146,226,20,127,247,195,14) -IMAGE_DATA(254,110,39,103,68,255,42,114,73,248,98,230,35,228,111,124,171,121,180,14,60,155,9,126,68,239,79,252,49,185,37,230) -IMAGE_DATA(76,196,162,252,32,142,32,6,129,13,236,159,26,57,252,32,230,240,120,132,56,135,62,190,111,28,14,97,237,190,15,195) -IMAGE_DATA(194,215,155,204,22,108,216,25,30,89,252,106,120,232,153,165,246,124,40,63,150,27,113,136,197,32,73,70,113,60,88,115) -IMAGE_DATA(247,211,203,109,73,188,100,49,83,242,188,216,38,238,249,119,11,205,143,92,124,92,57,249,49,241,67,252,144,198,135,240) -IMAGE_DATA(243,204,89,107,207,131,77,190,102,9,7,254,52,249,209,48,233,158,25,214,119,137,254,175,206,143,244,231,195,122,14,139) -IMAGE_DATA(231,113,220,251,100,194,106,21,236,15,255,77,28,129,111,135,33,196,33,228,202,168,177,120,63,46,218,80,123,225,51,216) -IMAGE_DATA(177,170,165,35,84,53,180,24,59,102,84,86,219,115,207,23,87,111,30,242,28,168,212,49,15,247,25,27,56,103,152,197) -IMAGE_DATA(188,191,228,185,200,87,17,47,241,153,63,127,164,144,207,144,202,196,207,23,138,31,249,250,214,92,216,22,23,63,10,113) -IMAGE_DATA(46,113,126,199,66,242,163,84,215,93,252,144,138,45,127,38,121,244,153,179,228,170,240,191,44,97,135,143,159,240,58,66) -IMAGE_DATA(244,239,249,104,191,95,106,213,240,131,252,17,12,33,254,32,62,112,126,96,212,67,96,134,63,35,144,216,131,109,170,155) -IMAGE_DATA(187,204,150,212,191,21,30,75,172,11,83,95,72,178,104,254,203,54,247,97,250,177,48,230,148,95,181,181,201,182,231,217) -IMAGE_DATA(31,246,12,194,186,129,90,57,172,139,62,59,170,24,252,200,198,114,245,35,185,238,43,159,243,43,229,117,202,148,161,197) -IMAGE_DATA(216,111,41,190,171,248,33,149,187,124,126,196,168,111,118,142,120,108,65,173,129,249,63,120,54,20,12,97,233,243,73,121) -IMAGE_DATA(108,192,246,91,223,238,73,49,228,241,149,155,44,54,160,158,129,209,255,150,154,122,109,243,199,214,71,152,220,18,243,161) -IMAGE_DATA(192,22,248,65,236,145,216,213,22,158,92,93,107,113,7,185,43,98,31,159,111,221,230,110,228,25,235,189,125,54,142,3) -IMAGE_DATA(78,84,109,216,110,236,160,62,2,75,140,111,239,29,177,243,245,184,163,220,158,95,155,201,62,179,57,118,49,206,175,156) -IMAGE_DATA(174,85,169,246,91,170,239,42,126,72,229,44,191,207,210,115,82,233,92,33,230,192,47,227,159,97,135,61,31,118,144,41) -IMAGE_DATA(206,145,212,51,164,170,106,83,12,73,231,7,245,20,179,193,231,19,218,179,104,119,116,88,28,49,103,237,150,48,245,197) -IMAGE_DATA(229,102,172,139,114,140,227,115,188,45,205,109,22,103,44,168,169,51,126,68,217,1,87,224,75,244,188,227,250,93,150,194) -IMAGE_DATA(138,233,119,100,99,195,36,41,78,141,118,255,81,47,247,121,77,124,110,19,159,143,215,230,228,77,178,132,177,21,112,132) -IMAGE_DATA(113,136,140,65,164,246,65,159,94,114,80,44,225,8,53,10,198,107,208,39,10,163,78,65,124,65,255,46,62,39,103,53) -IMAGE_DATA(125,105,181,45,97,9,57,46,56,192,62,25,243,7,175,200,161,193,12,106,35,24,117,18,31,27,232,236,96,206,224,177) -IMAGE_DATA(200,14,76,252,144,101,107,146,20,167,162,243,239,166,150,131,175,153,19,203,223,123,191,93,155,67,42,233,171,225,6,198) -IMAGE_DATA(122,248,81,223,212,30,222,108,59,108,125,106,201,75,17,115,192,5,152,48,117,241,26,27,7,232,99,1,205,230,191,108) -IMAGE_DATA(125,171,168,123,243,158,124,21,185,43,114,88,27,247,125,104,249,45,98,148,213,91,218,195,134,29,239,91,173,29,230,96) -IMAGE_DATA(112,131,62,90,228,199,168,211,88,93,127,144,29,198,143,99,253,99,146,33,226,135,44,91,147,164,56,53,236,125,231,76) -IMAGE_DATA(137,112,197,159,103,235,207,36,180,231,18,14,62,95,106,95,215,33,203,45,193,15,216,97,249,169,230,131,214,151,138,165) -IMAGE_DATA(215,65,232,139,69,108,2,3,200,59,209,183,234,217,213,3,115,140,176,100,123,218,215,52,118,89,253,157,245,204,181,5) -IMAGE_DATA(59,156,31,214,159,120,111,95,88,215,121,204,198,27,146,51,75,229,171,224,6,99,27,79,158,56,227,248,81,78,57,115) -IMAGE_DATA(217,216,49,73,138,83,118,159,69,89,225,239,79,115,79,186,159,230,111,125,226,17,248,65,142,137,218,8,125,181,200,41) -IMAGE_DATA(193,0,250,83,17,79,96,48,4,99,189,63,83,22,223,111,241,68,77,163,229,172,124,123,152,129,17,119,36,146,241,7) -IMAGE_DATA(117,121,218,48,14,133,216,132,24,103,211,96,191,223,211,245,207,29,203,252,40,245,249,202,206,12,147,164,56,149,203,61) -IMAGE_DATA(105,207,9,25,204,17,81,19,129,29,212,68,172,182,158,52,171,173,239,239,55,62,144,95,194,223,227,251,169,119,96,176) -IMAGE_DATA(129,58,6,172,241,245,188,135,59,188,55,78,240,204,142,214,110,91,82,91,33,190,97,223,190,95,250,254,230,251,44,15) -IMAGE_DATA(153,108,172,155,36,197,169,124,238,205,232,51,67,156,33,212,34,252,57,127,206,20,239,183,5,15,200,113,193,4,250,223) -IMAGE_DATA(178,132,47,44,157,25,54,238,100,223,96,124,210,121,112,128,27,131,125,133,57,6,22,29,195,88,234,223,167,76,86,206) -IMAGE_DATA(38,73,113,42,223,251,211,253,184,247,211,178,57,10,123,251,108,190,41,198,107,224,247,241,247,206,22,252,63,75,143,41) -IMAGE_DATA(188,239,150,213,224,155,59,108,233,181,121,231,6,251,242,253,99,226,134,76,150,153,73,82,156,42,244,253,154,206,19,239) -IMAGE_DATA(247,75,141,4,30,120,12,65,60,2,27,60,47,229,253,128,49,182,245,186,10,44,114,102,40,230,144,201,178,51,73,138) -IMAGE_DATA(83,113,221,183,167,204,145,21,137,69,60,223,229,175,125,172,34,235,216,46,189,237,112,251,46,245,239,82,38,59,19,76) -IMAGE_DATA(146,226,84,33,239,213,244,216,195,141,207,124,238,119,175,185,123,61,35,202,19,155,159,164,239,248,41,243,169,136,23,50) -IMAGE_DATA(89,110,38,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146) -IMAGE_DATA(36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,82,246,250,63,194,88,187,74,0,0,0,0,0,0,0) -IMAGE_END_DATA(4672, 6) - -IMAGE_BEGIN_DATA -IMAGE_DATA(120,156,237,157,109,112,84,229,21,199,99,167,51,237,76,219,209,78,59,83,59,227,167,190,57,245,155,67,219,97,106,237) -IMAGE_DATA(180,211,23,167,234,23,167,163,31,106,199,86,107,113,212,246,131,218,58,86,84,208,1,223,80,167,136,168,8,138,8,10) -IMAGE_DATA(146,0,37,128,64,8,84,18,8,66,2,26,18,212,132,164,66,94,112,8,136,64,2,138,136,79,247,119,146,179,222,92) -IMAGE_DATA(66,178,155,236,221,93,146,255,127,56,115,247,222,189,207,189,119,151,155,243,219,115,206,243,60,183,228,188,146,243,74,178) -IMAGE_DATA(85,176,127,159,47,227,175,135,106,55,18,113,12,179,208,107,217,28,247,130,148,2,138,180,207,230,24,52,229,16,125,47) -IMAGE_DATA(211,109,207,164,171,83,10,49,165,219,14,240,29,198,219,213,212,212,132,241,227,199,135,222,221,62,183,216,241,250,29,195) -IMAGE_DATA(219,178,240,253,57,14,22,63,142,31,43,222,150,115,250,165,159,169,221,64,199,96,121,219,109,183,165,183,45,94,188,120) -IMAGE_DATA(200,182,241,246,209,107,206,164,109,252,59,201,166,77,174,219,199,63,67,182,109,93,153,94,75,244,30,24,72,241,123,111) -IMAGE_DATA(128,123,177,191,112,6,97,210,57,103,58,222,192,39,25,129,51,152,84,82,50,41,171,147,69,68,219,184,51,152,52,169) -IMAGE_DATA(119,91,38,199,157,148,82,152,60,249,52,103,224,199,29,178,109,74,227,198,141,11,189,47,39,167,207,63,84,155,216,127) -IMAGE_DATA(64,234,18,82,109,39,76,72,127,135,241,107,247,118,236,199,249,74,6,113,6,19,198,141,155,16,189,118,218,70,219,177) -IMAGE_DATA(156,53,107,214,128,55,23,239,177,47,109,226,109,177,186,186,58,107,59,208,53,68,143,17,253,67,240,125,105,139,241,81) -IMAGE_DATA(206,212,214,205,175,33,122,141,125,219,50,250,99,242,107,200,133,51,24,236,179,14,117,254,248,119,159,105,219,248,255,193) -IMAGE_DATA(96,255,247,241,118,126,222,76,238,189,184,78,107,247,239,115,126,86,114,101,201,87,75,252,63,83,146,36,73,146,36,73) -IMAGE_DATA(146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36) -IMAGE_DATA(73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,164,226,212,169,207,78,13,106,39,142,119,135,83,39,143) -IMAGE_DATA(245,174,167,150,253,214,51,176,238,79,63,75,47,187,122,78,218,210,45,254,190,47,227,118,240,228,233,219,162,199,200,200) -IMAGE_DATA(184,230,44,174,91,38,27,13,38,73,73,106,200,123,48,226,119,179,97,135,251,119,152,129,255,111,59,208,19,154,59,14) -IMAGE_DATA(154,237,108,237,10,181,141,109,182,100,189,113,111,239,54,95,111,239,30,152,35,113,198,100,245,183,36,126,200,198,160,73) -IMAGE_DATA(82,146,26,242,30,28,196,231,30,57,254,137,45,227,177,2,254,191,121,223,81,227,65,229,214,93,161,170,190,197,150,107) -IMAGE_DATA(106,26,210,203,242,234,58,179,151,86,109,10,47,150,111,8,179,151,172,11,207,46,126,205,150,139,42,106,108,159,138,186) -IMAGE_DATA(221,161,161,227,104,104,62,120,210,142,25,143,67,88,207,248,111,73,252,144,141,65,147,164,36,149,237,253,120,226,163,143) -IMAGE_DATA(251,173,187,31,199,199,111,111,59,26,106,91,186,204,54,54,182,135,13,245,173,198,0,150,155,222,237,180,237,111,181,30) -IMAGE_DATA(182,253,88,214,237,249,192,182,241,30,251,45,174,172,53,126,60,250,226,210,112,255,83,243,195,93,143,191,16,102,44,172) -IMAGE_DATA(52,198,148,111,110,12,155,154,83,177,202,254,227,161,245,200,41,227,73,231,137,144,93,44,34,126,200,198,152,73,82,146) -IMAGE_DATA(202,232,62,76,249,221,238,19,199,79,99,7,86,223,210,97,254,223,121,193,107,184,64,220,224,177,3,134,207,199,223,227) -IMAGE_DATA(247,49,214,49,246,129,9,48,133,118,149,13,157,97,213,214,198,176,96,93,109,152,83,94,29,38,207,92,20,30,152,93) -IMAGE_DATA(26,30,157,187,50,204,40,171,10,175,174,79,197,37,59,218,195,182,255,157,8,141,93,167,66,199,161,79,66,87,119,143) -IMAGE_DATA(197,66,81,142,100,157,223,146,201,70,161,73,82,146,202,228,30,140,115,3,95,221,188,123,79,168,170,221,101,249,40,184) -IMAGE_DATA(177,165,169,213,24,208,178,191,59,205,10,231,69,116,221,185,1,83,156,29,110,81,134,192,136,149,219,118,135,21,155,118) -IMAGE_DATA(27,51,102,45,173,14,211,22,172,51,227,245,252,202,6,123,143,248,5,134,81,55,217,127,168,103,192,26,189,76,54,86) -IMAGE_DATA(77,146,146,84,182,247,35,236,120,107,215,238,80,177,190,38,148,191,246,223,180,239,238,60,220,235,187,49,56,65,78,203) -IMAGE_DATA(205,217,193,107,103,7,177,3,188,32,94,241,220,22,236,96,27,6,91,88,190,251,254,167,97,107,107,183,49,229,213,13) -IMAGE_DATA(77,97,222,170,58,227,199,211,11,55,90,110,171,172,170,193,106,37,212,88,168,183,192,47,152,229,117,123,49,68,54,150) -IMAGE_DATA(77,146,146,84,54,247,98,203,129,15,66,197,198,45,97,225,210,215,194,134,205,111,90,159,42,204,115,71,222,223,42,90) -IMAGE_DATA(235,134,27,158,191,130,25,212,48,44,190,104,216,31,74,107,91,44,198,160,246,193,54,222,115,123,125,215,1,219,198,146) -IMAGE_DATA(117,24,130,177,78,220,225,28,193,188,62,2,67,168,171,248,249,188,31,87,46,255,30,135,251,160,233,168,21,218,167,228) -IMAGE_DATA(195,114,241,61,141,149,239,42,73,147,164,36,149,201,61,136,15,110,110,239,12,85,117,59,44,103,69,127,91,234,14,86) -IMAGE_DATA(123,32,230,232,238,73,243,131,223,255,244,189,242,56,3,126,224,255,235,186,62,11,171,234,187,194,252,234,221,102,247,190) -IMAGE_DATA(184,46,204,88,94,27,166,151,109,235,141,43,94,171,15,229,91,218,44,87,69,92,177,98,123,123,216,212,114,196,182,241) -IMAGE_DATA(26,222,192,14,140,215,48,132,216,131,118,47,172,221,102,12,161,254,14,139,56,159,231,198,60,238,41,38,191,88,104,159) -IMAGE_DATA(146,180,229,138,29,99,229,251,74,210,36,41,73,13,117,255,81,55,111,59,112,48,236,218,219,97,6,31,156,29,81,243) -IMAGE_DATA(126,88,228,144,172,223,85,95,253,98,246,202,109,97,226,115,43,194,148,121,235,194,173,211,74,195,95,166,204,55,251,237) -IMAGE_DATA(45,79,133,107,238,124,214,182,97,19,103,174,9,247,207,169,8,15,46,124,35,204,89,219,16,230,111,218,19,150,108,235) -IMAGE_DATA(8,101,53,109,182,196,202,183,239,55,6,193,19,55,227,81,101,131,213,219,89,18,135,88,44,147,98,15,249,47,207,101) -IMAGE_DATA(229,42,14,25,142,143,27,107,254,112,36,28,16,63,114,107,146,148,164,206,116,223,81,51,143,178,131,248,195,107,10,240) -IMAGE_DATA(130,216,194,253,178,247,223,133,25,196,14,119,207,40,13,83,230,244,50,3,86,192,137,223,220,52,45,92,122,211,244,180) -IMAGE_DATA(193,143,43,239,154,23,126,114,237,131,225,199,215,220,19,174,184,227,153,240,203,63,221,111,219,30,154,91,29,254,241,220) -IMAGE_DATA(250,48,241,165,205,97,250,178,84,60,178,170,33,204,92,211,24,102,175,111,238,103,207,111,108,53,206,120,76,99,28,169) -IMAGE_DATA(222,101,49,11,49,10,12,241,177,35,209,28,91,174,125,99,182,109,10,237,83,146,182,145,48,64,252,200,173,73,82,146) -IMAGE_DATA(58,211,125,7,59,200,75,193,13,204,107,26,86,207,216,215,91,215,102,27,53,141,202,93,61,225,165,117,205,214,55,234) -IMAGE_DATA(230,7,23,132,223,223,254,132,241,2,131,13,48,226,251,151,223,25,46,186,106,98,184,224,178,59,194,183,126,113,139,173) -IMAGE_DATA(243,154,247,176,75,110,120,204,214,217,30,229,203,132,199,202,195,45,79,174,78,243,36,110,48,228,52,142,164,94,19,171) -IMAGE_DATA(84,52,29,180,24,196,89,7,67,70,154,203,202,21,63,70,154,171,25,108,255,66,231,137,242,193,143,92,125,198,161,246) -IMAGE_DATA(203,230,187,42,244,247,46,126,72,249,214,153,238,187,35,199,142,133,125,71,14,153,69,251,196,194,15,216,65,127,41,106) -IMAGE_DATA(17,171,235,143,90,140,112,227,212,210,52,47,190,247,243,27,194,249,63,250,67,248,202,197,215,133,111,252,244,175,198,13) -IMAGE_DATA(12,38,96,240,2,70,176,60,119,252,141,198,19,246,117,99,155,115,133,253,137,77,96,201,213,19,23,132,107,31,120,53) -IMAGE_DATA(92,247,200,138,112,251,204,181,225,174,217,155,195,195,75,119,134,105,229,245,253,226,17,114,94,139,235,59,45,215,229,181) -IMAGE_DATA(16,234,252,222,63,172,80,190,49,83,95,147,77,219,92,248,175,92,251,179,124,179,105,36,159,49,23,223,81,177,124,239) -IMAGE_DATA(226,135,148,111,13,116,207,17,123,192,15,175,139,199,251,226,242,155,158,58,55,241,6,181,11,88,0,3,96,6,49,4) -IMAGE_DATA(172,192,247,227,247,241,255,248,124,124,63,235,196,25,254,158,27,239,177,29,131,63,28,139,99,176,244,216,4,243,184,132) -IMAGE_DATA(253,137,73,136,63,60,46,153,186,124,135,229,185,224,136,215,78,48,242,88,176,142,152,137,241,33,196,76,197,228,27,179) -IMAGE_DATA(61,94,174,253,96,18,190,44,41,223,152,228,103,204,55,127,242,197,16,73,74,82,209,123,141,154,7,6,59,176,67,31) -IMAGE_DATA(31,179,156,15,191,221,173,95,213,193,147,54,86,131,57,70,152,91,228,134,123,103,167,227,9,207,61,121,188,128,143,39) -IMAGE_DATA(62,88,191,59,132,138,183,63,13,51,86,54,89,29,132,216,228,107,223,253,157,177,6,35,102,129,47,112,136,92,21,251) -IMAGE_DATA(112,12,106,33,23,94,118,75,191,252,150,155,51,137,253,61,191,117,219,179,171,173,79,23,253,185,168,149,204,173,106,51) -IMAGE_DATA(142,88,63,174,212,53,51,70,133,207,241,222,225,143,138,202,55,102,115,188,108,253,216,217,240,153,242,117,220,225,240,99) -IMAGE_DATA(176,227,20,227,247,62,144,73,82,146,234,55,191,110,132,29,94,43,135,27,62,167,21,249,42,198,91,252,241,246,71,194) -IMAGE_DATA(21,215,255,203,234,28,248,111,114,75,238,219,121,125,227,125,139,141,29,165,181,7,210,252,160,62,114,205,173,79,27,51) -IMAGE_DATA(190,112,254,37,102,95,255,193,229,198,18,88,65,191,171,123,230,84,134,9,143,148,25,15,60,118,33,30,225,184,112,134) -IMAGE_DATA(117,150,206,19,226,17,114,89,24,60,241,152,196,243,89,48,4,126,48,183,10,125,142,125,188,74,174,125,216,72,126,83) -IMAGE_DATA(138,31,103,23,63,242,121,77,226,135,84,236,114,126,48,55,187,245,185,234,171,115,48,126,99,103,231,39,86,31,167,22) -IMAGE_DATA(77,95,170,9,247,207,181,248,128,229,221,51,203,205,231,227,171,221,215,19,115,192,19,124,56,99,59,104,87,211,126,50) -IMAGE_DATA(204,90,185,211,250,84,193,21,248,241,197,111,255,58,124,243,135,87,27,67,252,245,63,167,175,52,127,79,28,65,123,152) -IMAGE_DATA(224,245,14,142,237,245,14,182,113,13,94,59,129,35,23,93,59,197,182,123,93,132,154,8,241,14,12,225,26,108,124,123) -IMAGE_DATA(83,123,122,108,99,62,249,145,43,31,50,212,241,139,201,143,229,195,47,230,250,154,196,15,73,202,94,105,126,16,123,28) -IMAGE_DATA(255,36,237,99,225,6,181,113,114,64,112,194,251,225,210,191,10,22,192,4,98,10,114,69,206,15,114,80,228,144,124,12) -IMAGE_DATA(199,202,119,247,219,184,65,234,217,228,149,136,63,190,114,225,213,105,102,96,196,31,24,113,134,243,136,90,134,51,4,227) -IMAGE_DATA(188,188,7,19,136,81,96,4,44,114,118,96,92,131,215,214,105,203,254,112,132,107,100,76,33,99,211,233,139,76,60,85) -IMAGE_DATA(76,190,49,147,227,101,194,167,98,242,99,197,198,143,76,216,46,126,72,82,246,58,252,225,49,51,143,59,136,57,232,179) -IMAGE_DATA(68,223,37,24,1,55,110,122,120,97,184,99,250,82,27,223,23,157,3,151,241,21,240,5,223,77,46,203,226,142,190,177) -IMAGE_DATA(26,244,163,165,255,44,53,118,242,93,228,168,162,177,7,28,97,201,58,70,93,132,182,47,239,232,50,126,224,251,97,128) -IMAGE_DATA(177,98,106,169,241,8,158,193,3,174,139,247,200,87,145,47,35,143,21,237,159,69,156,226,252,96,252,162,207,109,194,252) -IMAGE_DATA(43,99,137,31,35,177,98,250,142,50,253,46,70,242,25,115,201,143,66,125,239,226,135,148,111,17,111,120,127,92,230,151) -IMAGE_DATA(98,94,116,250,45,49,102,156,223,253,212,200,201,85,225,191,189,150,64,46,136,122,52,57,46,24,193,126,240,3,127,77) -IMAGE_DATA(14,138,188,145,237,187,167,39,92,245,183,135,44,79,245,165,239,92,154,102,69,148,27,158,199,162,86,78,159,219,101,239) -IMAGE_DATA(28,182,24,4,243,120,131,220,22,215,84,219,113,202,184,86,186,169,57,60,187,172,222,24,225,245,23,239,219,69,28,68) -IMAGE_DATA(13,133,126,89,196,60,240,131,113,240,117,111,191,103,115,60,50,246,177,152,124,99,166,126,109,168,125,139,201,135,37,229) -IMAGE_DATA(23,147,244,213,197,192,143,92,179,67,252,144,146,22,121,42,175,113,224,147,241,185,196,28,212,169,225,2,117,12,124,48) -IMAGE_DATA(62,155,58,2,191,223,109,60,200,137,227,86,95,39,63,245,247,105,175,24,63,240,231,196,35,196,8,43,118,118,24,63) -IMAGE_DATA(168,155,192,14,239,115,197,210,115,88,188,134,31,37,95,190,40,252,234,250,123,141,13,48,4,35,134,33,30,161,61,49) -IMAGE_DATA(12,177,14,188,242,57,123,185,30,206,67,172,66,28,66,236,225,53,118,248,65,220,194,103,97,158,69,230,83,97,158,224) -IMAGE_DATA(98,26,255,145,201,241,226,219,242,193,143,164,252,124,161,143,91,236,252,72,130,29,226,135,148,180,24,59,14,59,240,253) -IMAGE_DATA(212,47,188,54,77,220,0,59,136,59,156,29,140,161,176,49,33,41,118,216,51,165,250,198,19,62,246,159,215,173,29,249) -IMAGE_DATA(45,27,127,81,189,219,88,0,63,136,25,136,45,188,191,21,220,240,126,87,88,201,185,23,27,95,136,119,54,167,56,6) -IMAGE_DATA(59,168,155,60,189,102,187,157,159,121,80,232,243,69,223,97,206,231,207,19,97,174,119,198,118,48,102,16,134,16,111,192) -IMAGE_DATA(61,242,108,212,103,48,174,157,57,22,61,94,34,79,119,54,242,35,91,214,36,237,147,196,143,228,63,107,174,76,146,146) -IMAGE_DATA(20,125,108,225,6,241,3,185,42,106,13,44,217,134,15,39,246,160,214,193,92,182,196,27,86,99,79,49,132,254,90,220) -IMAGE_DATA(159,108,99,30,118,98,16,207,115,193,15,226,15,114,91,196,39,55,63,52,55,221,111,55,206,15,182,113,190,245,45,71) -IMAGE_DATA(67,195,71,193,142,245,114,237,187,189,252,40,171,50,126,48,175,110,252,217,231,140,227,32,22,225,92,228,186,168,219,115) -IMAGE_DATA(13,86,163,137,204,235,75,236,225,99,7,139,113,254,171,51,29,47,91,31,151,164,111,45,22,63,63,218,248,145,15,246) -IMAGE_DATA(72,82,146,226,119,63,236,224,119,59,57,35,250,87,145,75,194,23,51,31,33,191,241,173,230,209,210,251,108,38,248,17) -IMAGE_DATA(189,63,241,199,228,150,152,51,17,139,242,131,56,130,24,4,54,112,124,106,228,240,131,152,195,227,17,226,28,250,248,190) -IMAGE_DATA(121,56,132,245,123,63,12,11,222,104,52,155,191,113,71,120,124,209,234,240,232,243,75,236,249,80,126,46,55,226,16,139) -IMAGE_DATA(65,82,140,226,124,176,230,190,231,150,217,146,120,201,98,166,212,117,177,79,210,243,239,230,154,31,195,241,113,197,228,199) -IMAGE_DATA(196,15,241,67,26,27,194,207,51,103,173,61,15,54,245,154,37,28,248,243,196,39,194,132,201,211,173,239,18,253,95,157) -IMAGE_DATA(31,241,231,195,122,14,139,231,113,60,240,76,185,213,42,56,30,254,155,56,2,223,14,67,136,67,200,149,81,99,241,126) -IMAGE_DATA(92,180,161,246,194,123,176,99,85,115,123,40,171,111,54,118,76,47,173,176,231,158,47,170,168,233,247,28,168,244,57,15) -IMAGE_DATA(247,24,27,184,102,152,197,188,191,228,185,200,87,17,47,241,158,63,127,36,151,207,144,202,196,207,231,138,31,35,245,173) -IMAGE_DATA(195,97,91,82,252,200,197,181,36,249,25,115,201,143,66,125,239,226,135,148,111,249,51,201,163,207,156,37,87,133,255,101) -IMAGE_DATA(9,59,124,252,132,215,17,162,191,231,163,253,126,169,85,195,15,242,71,48,132,248,131,248,192,249,129,81,15,129,25,254) -IMAGE_DATA(140,64,98,15,246,169,104,234,52,91,92,251,118,120,178,124,67,152,250,114,138,69,243,150,219,220,135,241,115,97,204,41) -IMAGE_DATA(191,106,107,163,237,207,179,63,236,25,132,213,189,181,114,88,23,125,118,84,62,248,145,141,13,215,143,12,247,88,35,185) -IMAGE_DATA(190,66,126,79,153,50,52,31,199,45,196,103,21,63,164,98,151,207,143,24,245,205,206,17,143,45,168,53,48,255,7,207) -IMAGE_DATA(134,130,33,44,125,62,41,143,13,216,127,235,59,71,210,12,121,106,229,102,139,13,168,103,96,244,191,165,166,94,213,244) -IMAGE_DATA(177,245,17,38,183,196,124,40,176,5,126,16,123,148,239,108,13,207,172,173,178,184,131,220,21,177,143,207,183,110,115,55) -IMAGE_DATA(242,140,245,238,30,27,199,1,39,202,54,214,25,59,168,143,192,18,227,219,190,163,118,189,30,119,20,219,243,107,51,57) -IMAGE_DATA(102,54,231,206,199,245,21,211,119,85,168,227,22,234,179,138,31,82,49,203,239,179,120,78,42,206,21,98,14,252,50,254) -IMAGE_DATA(25,118,216,243,97,251,152,226,28,73,63,67,170,172,42,205,144,56,63,168,167,152,245,61,159,208,158,69,187,189,221,226) -IMAGE_DATA(136,217,235,183,132,169,175,44,51,99,91,148,99,156,159,243,109,105,106,181,56,99,126,101,181,241,35,202,14,184,2,95) -IMAGE_DATA(162,215,157,212,223,101,33,44,159,126,71,54,58,76,146,146,212,80,247,31,245,114,159,215,196,231,54,241,249,120,109,78) -IMAGE_DATA(222,20,75,24,91,1,71,24,135,200,24,68,106,31,244,233,37,7,197,18,142,80,163,96,188,6,125,162,48,234,20,196) -IMAGE_DATA(23,244,239,226,125,114,86,211,150,84,216,18,150,144,227,130,3,28,147,49,127,240,138,28,26,204,160,54,130,81,39,241) -IMAGE_DATA(177,129,206,14,230,12,30,141,236,192,196,15,89,182,38,73,73,42,58,255,110,122,217,247,154,57,177,124,221,251,237,218) -IMAGE_DATA(28,82,41,95,13,55,48,182,195,143,218,198,182,240,86,235,97,235,83,75,94,138,152,3,46,192,132,169,139,214,217,56) -IMAGE_DATA(64,31,11,104,54,111,185,245,173,162,238,205,58,249,42,114,87,228,176,54,237,253,208,242,91,196,40,107,183,180,133,141) -IMAGE_DATA(219,223,183,90,59,204,193,224,6,125,180,200,143,81,167,177,186,126,31,59,140,31,39,142,143,74,134,136,31,178,108,77) -IMAGE_DATA(146,146,212,128,247,157,51,37,194,21,127,158,173,63,147,208,158,75,216,247,124,169,189,157,135,44,183,4,63,96,135,229) -IMAGE_DATA(167,154,14,90,95,42,150,94,7,161,47,22,177,9,12,32,239,68,223,170,23,214,246,206,49,194,146,253,105,95,217,208) -IMAGE_DATA(105,245,119,182,51,215,22,236,112,126,88,127,226,61,61,97,67,199,9,27,111,72,206,44,157,175,130,27,140,109,252,236) -IMAGE_DATA(212,89,199,143,98,202,153,203,70,143,73,82,146,178,251,44,202,10,95,31,228,158,116,63,205,111,125,226,17,248,65,142) -IMAGE_DATA(137,218,8,125,181,200,41,193,0,250,83,17,79,96,48,4,99,187,63,83,22,223,111,241,68,101,131,229,172,124,127,152) -IMAGE_DATA(129,17,119,148,167,226,15,234,242,180,97,28,10,177,9,49,206,230,190,126,191,131,245,207,29,205,252,40,244,245,202,206) -IMAGE_DATA(14,147,164,36,53,156,123,210,158,19,210,151,35,162,38,2,59,168,137,88,109,61,101,86,91,223,127,220,248,64,126,9) -IMAGE_DATA(127,143,239,167,222,129,193,6,234,24,176,198,183,179,14,119,88,55,78,240,204,142,150,46,91,82,91,33,190,225,216,126) -IMAGE_DATA(92,250,254,142,244,89,30,50,217,104,55,73,74,82,35,185,55,163,207,12,113,134,80,139,240,231,252,57,83,188,223,22) -IMAGE_DATA(60,32,199,5,19,232,127,203,18,190,176,116,102,216,184,147,189,125,241,73,199,193,94,110,244,245,21,230,28,88,116,12) -IMAGE_DATA(99,161,255,62,101,178,98,54,73,74,82,35,189,63,221,143,123,63,45,155,163,176,187,199,230,155,98,188,6,126,31,127) -IMAGE_DATA(239,108,193,255,179,244,152,194,251,110,89,13,190,169,221,150,94,155,119,110,112,44,63,62,38,110,200,100,153,153,36,37) -IMAGE_DATA(169,92,223,175,113,158,120,191,95,106,36,240,192,99,8,226,17,216,224,121,41,239,7,140,177,175,215,85,96,145,51,67) -IMAGE_DATA(49,135,76,150,157,73,82,146,74,234,190,61,109,142,172,72,44,226,249,46,127,237,99,21,217,198,126,241,182,3,29,187) -IMAGE_DATA(208,127,151,50,217,217,96,146,148,164,114,121,175,198,99,15,55,222,243,185,223,189,230,238,245,140,40,79,108,126,146,158) -IMAGE_DATA(147,167,205,167,34,94,200,100,195,51,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73) -IMAGE_DATA(146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,178,215,255,1,75,116,7) -IMAGE_DATA(62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) -IMAGE_END_DATA(4640, 3) - -IMAGE_BEGIN_DATA -IMAGE_DATA(120,156,237,157,7,183,85,69,242,183,93,179,198,17,100,12,24,24,1,157,81,49,32,168,128,160,8,136,18,36,9,42) -IMAGE_DATA(42,136,34,25,68,204,24,65,114,184,228,32,136,136,32,32,130,146,36,103,84,20,49,78,158,81,199,236,164,255,251,5) -IMAGE_DATA(230,19,212,123,235,92,251,210,244,237,80,29,246,217,231,92,202,181,158,37,28,118,232,88,253,219,213,93,221,167,156,125) -IMAGE_DATA(202,217,167,72,255,65,4,133,251,167,5,128,247,141,27,55,14,196,253,253,251,247,135,61,123,246,192,79,63,253,84,0) -IMAGE_DATA(255,140,255,142,191,119,233,210,5,46,189,244,210,106,116,247,139,251,144,163,71,143,158,112,63,66,185,31,239,195,223,234) -IMAGE_DATA(215,175,127,194,245,120,141,235,254,217,179,103,87,167,19,255,140,207,144,193,235,196,115,117,247,227,189,226,58,19,226,89) -IMAGE_DATA(186,251,197,189,34,175,152,6,249,94,57,31,182,242,255,223,255,254,167,125,183,92,134,166,242,195,251,5,114,154,197,181) -IMAGE_DATA(152,71,68,119,63,190,23,203,31,211,141,224,51,68,221,9,240,94,252,55,211,253,162,14,197,51,228,250,71,240,55,188) -IMAGE_DATA(198,116,191,64,180,31,241,28,145,30,188,23,255,93,119,127,76,251,15,229,231,251,79,193,255,135,114,74,41,26,3,129) -IMAGE_DATA(205,24,80,238,71,116,198,192,245,126,209,72,4,106,231,151,127,215,221,47,140,129,124,173,232,184,242,223,41,198,192,84) -IMAGE_DATA(94,62,198,64,189,215,199,24,232,222,79,53,6,234,123,229,191,187,140,129,124,173,108,12,228,223,77,198,64,189,70,53) -IMAGE_DATA(6,212,246,103,51,6,212,246,231,219,254,67,73,98,12,214,252,98,236,41,210,127,81,9,98,24,134,97,24,134,97,24) -IMAGE_DATA(134,97,24,134,97,24,134,97,24,134,97,24,134,97,24,134,97,24,134,97,24,134,97,24,134,97,24,134,97,24,134,97) -IMAGE_DATA(24,134,97,24,134,97,24,134,97,24,134,97,24,134,97,24,134,97,24,134,97,24,134,97,24,134,97,24,134,97,24,134) -IMAGE_DATA(97,24,134,97,24,134,97,24,134,97,24,134,97,24,134,97,24,134,97,24,134,97,24,134,97,24,134,97,24,134,97,24) -IMAGE_DATA(134,97,24,38,140,95,252,226,23,80,183,78,29,43,121,167,145,97,24,134,97,152,242,6,245,68,163,223,92,96,228,140) -IMAGE_DATA(95,255,58,247,52,150,10,182,114,66,78,251,213,175,138,158,38,124,167,45,77,231,156,125,54,169,13,52,249,221,197,86) -IMAGE_DATA(242,46,123,134,113,113,126,131,6,5,46,190,248,18,104,222,252,106,35,226,186,83,79,45,126,127,101,24,134,57,153,65) -IMAGE_DATA(77,98,211,26,103,157,121,102,238,105,44,5,74,85,151,185,234,143,162,57,93,207,64,237,154,119,249,51,140,12,106,70) -IMAGE_DATA(212,143,157,58,119,129,222,125,110,135,254,247,222,23,12,62,163,101,171,235,224,202,166,87,65,131,223,252,38,247,188,49) -IMAGE_DATA(76,22,252,242,151,191,172,158,183,194,113,29,237,62,34,251,40,216,199,192,100,205,5,231,55,176,234,13,158,87,173,2) -IMAGE_DATA(253,189,182,114,250,93,227,11,115,73,87,131,115,207,179,166,171,222,233,167,71,183,1,124,71,222,229,207,156,220,212,171) -IMAGE_DATA(87,15,46,191,226,74,232,208,161,99,148,190,148,233,215,127,0,12,28,56,8,30,121,244,113,152,61,119,1,204,157,191) -IMAGE_DATA(8,150,46,123,5,158,125,110,60,220,113,71,95,104,216,176,81,238,249,102,152,20,160,198,116,249,76,4,23,113,187,103) -IMAGE_DATA(50,4,219,151,173,253,225,90,191,188,211,88,10,148,170,47,80,254,54,213,65,153,239,119,181,1,138,175,244,100,2,191) -IMAGE_DATA(195,206,59,231,28,237,90,134,188,211,86,219,192,121,242,212,58,243,177,199,199,194,43,175,174,130,245,111,110,132,215,223) -IMAGE_DATA(216,0,171,215,174,131,149,175,173,129,229,43,86,193,75,47,175,128,23,151,190,12,11,22,45,129,57,243,22,192,211,207) -IMAGE_DATA(142,131,182,55,182,131,58,252,237,205,148,49,46,191,130,12,94,155,119,122,153,218,139,173,237,93,114,209,111,115,79,95) -IMAGE_DATA(169,224,210,118,121,233,178,20,243,253,174,103,176,175,187,10,212,239,46,125,158,119,26,107,3,184,206,18,231,205,99,231) -IMAGE_DATA(204,101,6,13,30,90,240,97,190,189,125,39,108,222,186,29,54,110,222,10,27,222,218,4,235,214,191,9,107,94,127,3) -IMAGE_DATA(86,173,94,11,43,86,190,6,203,150,191,10,75,94,90,14,139,94,124,169,224,247,172,152,61,23,166,77,175,128,137,147) -IMAGE_DATA(167,66,239,222,183,195,153,103,157,149,123,249,48,140,47,56,150,83,53,39,251,24,152,172,192,49,180,20,125,119,165,8) -IMAGE_DATA(206,157,219,202,42,143,88,43,92,159,19,59,71,226,106,3,8,190,39,239,242,207,27,215,218,10,214,156,241,8,173,217) -IMAGE_DATA(247,174,123,146,105,205,193,67,134,193,107,107,94,135,221,123,247,195,142,93,123,97,219,142,93,176,229,237,29,176,105,203) -IMAGE_DATA(219,240,230,198,205,240,198,134,183,96,237,186,13,149,215,172,131,87,87,173,134,229,43,86,22,180,233,226,37,203,96,254) -IMAGE_DATA(194,23,97,246,156,249,48,125,230,108,152,60,101,58,140,159,48,169,48,239,222,189,71,79,56,131,215,185,51,101,2,197) -IMAGE_DATA(198,203,80,214,99,49,76,8,174,113,148,191,119,142,83,138,190,64,87,92,19,101,142,4,237,11,235,40,59,104,179,169) -IMAGE_DATA(126,130,188,211,90,174,224,28,122,74,173,137,44,92,188,4,14,28,122,7,246,29,56,4,123,246,29,128,157,187,247,193) -IMAGE_DATA(246,157,187,97,235,54,244,117,110,131,183,54,109,249,121,126,253,77,88,189,246,13,88,249,218,218,194,156,187,152,95,95) -IMAGE_DATA(184,120,41,204,153,183,16,102,86,204,129,41,211,102,194,132,137,83,224,249,113,47,192,83,79,63,7,143,63,49,22,58) -IMAGE_DATA(116,184,9,126,149,195,94,21,12,227,131,207,90,78,36,143,253,87,152,147,3,215,26,69,222,39,169,10,142,89,207,191) -IMAGE_DATA(14,242,196,53,159,158,119,59,40,103,206,62,187,126,33,110,60,165,214,28,253,208,195,176,255,224,97,56,252,238,17,56) -IMAGE_DATA(120,248,221,194,159,247,236,59,8,187,246,236,131,29,187,246,192,219,219,209,215,41,230,215,55,195,186,245,111,193,154,215) -IMAGE_DATA(215,195,170,213,175,195,138,149,171,225,229,87,142,207,175,207,91,176,24,42,102,207,131,105,51,42,96,210,228,105,48,238) -IMAGE_DATA(133,137,240,204,179,207,195,19,79,62,93,136,61,26,60,120,40,92,116,209,69,185,151,35,195,152,240,89,203,201,54,140) -IMAGE_DATA(201,18,215,26,69,94,199,87,69,109,142,89,151,247,207,208,113,178,127,243,82,231,212,217,94,251,131,113,232,41,181,38) -IMAGE_DATA(50,127,193,34,56,242,193,135,240,238,145,15,42,53,231,251,149,154,243,189,74,205,249,14,236,221,127,168,48,191,190,115) -IMAGE_DATA(183,58,191,190,5,222,216,176,81,154,95,23,177,68,210,252,250,220,5,48,3,231,215,167,78,135,23,38,76,134,103,159) -IMAGE_DATA(31,15,99,159,122,6,30,125,252,73,24,61,122,12,12,25,50,172,224,243,60,245,212,83,115,47,83,134,81,241,89,203) -IMAGE_DATA(201,49,235,76,150,184,214,40,230,157,190,82,161,84,125,129,41,98,214,25,59,166,62,130,190,3,108,23,168,73,81,155) -IMAGE_DATA(227,255,121,45,10,13,92,183,153,218,183,137,96,12,208,7,31,126,84,208,156,239,189,127,20,222,121,239,125,56,244,206) -IMAGE_DATA(123,142,249,245,173,176,254,205,77,202,252,122,85,44,145,152,95,159,139,243,235,179,230,194,84,156,95,159,132,243,235,19) -IMAGE_DATA(224,169,103,170,230,215,199,60,252,40,12,31,62,18,238,191,255,1,232,131,49,70,188,206,147,41,33,124,215,114,114,204) -IMAGE_DATA(58,147,37,165,232,187,43,69,106,115,204,58,99,70,183,166,2,219,2,199,84,133,131,115,233,41,227,209,5,232,187,60) -IMAGE_DATA(122,236,227,130,230,124,255,232,177,130,230,172,242,117,30,159,95,223,187,31,231,215,247,43,243,235,111,27,230,215,171,98) -IMAGE_DATA(137,196,252,250,172,57,56,191,62,171,48,191,62,190,48,191,62,14,158,28,91,53,191,62,114,212,104,24,52,104,8,244) -IMAGE_DATA(187,167,127,65,119,54,170,101,190,34,108,239,248,77,101,218,31,12,231,91,208,6,230,49,47,134,154,10,223,43,246,55) -IMAGE_DATA(23,224,28,15,254,94,202,123,253,97,218,48,157,152,94,44,67,81,158,88,206,248,91,10,159,129,239,90,206,60,198,50) -IMAGE_DATA(181,12,48,255,39,243,28,43,214,59,150,135,220,223,240,207,88,151,190,99,143,56,215,90,238,27,194,79,82,236,124,185) -IMAGE_DATA(214,40,234,124,119,152,126,204,55,126,11,201,254,31,252,179,56,103,49,235,241,24,159,111,235,167,248,111,169,237,76,86) -IMAGE_DATA(49,235,152,78,188,23,203,83,55,255,33,206,30,213,229,39,69,204,122,158,96,250,69,91,82,199,47,83,158,83,129,125) -IMAGE_DATA(90,248,37,213,247,35,194,135,169,174,131,74,89,166,162,13,139,119,138,54,166,166,161,54,217,222,198,149,121,76,29,39) -IMAGE_DATA(36,235,77,89,115,138,249,117,217,215,121,226,252,58,250,58,113,126,125,155,101,126,125,69,97,126,29,247,234,44,204,175) -IMAGE_DATA(87,204,134,41,83,103,192,11,19,39,195,115,133,249,245,103,225,49,156,95,127,232,97,24,50,116,56,12,168,76,203,157) -IMAGE_DATA(119,244,133,30,221,123,64,211,43,154,230,94,222,49,96,255,195,246,231,178,125,42,104,199,176,15,103,53,14,8,187,225) -IMAGE_DATA(242,3,168,253,22,199,135,84,243,62,194,118,80,81,215,56,97,159,166,174,177,196,242,167,156,5,136,229,162,123,183,79) -IMAGE_DATA(57,201,243,55,42,58,59,164,211,250,54,212,54,129,249,50,181,47,245,125,190,101,142,184,202,205,247,121,46,125,227,155) -IMAGE_DATA(70,249,89,62,253,141,226,247,192,180,80,226,16,176,175,22,107,140,241,141,89,199,191,83,215,133,96,62,82,106,6,161) -IMAGE_DATA(117,125,98,57,176,239,164,42,75,215,187,66,222,227,83,158,120,157,206,110,185,242,31,219,6,144,216,242,81,203,70,156) -IMAGE_DATA(15,79,201,115,202,115,87,177,252,176,93,250,172,109,82,137,221,67,4,237,68,72,26,178,30,199,139,1,198,165,167,214) -IMAGE_DATA(154,98,62,93,232,77,89,119,158,56,191,126,164,82,115,190,11,251,14,28,46,204,175,99,44,209,246,157,123,126,222,171) -IMAGE_DATA(243,248,252,186,216,171,83,158,95,199,88,162,194,252,58,238,213,137,243,235,211,103,194,196,73,83,225,249,241,19,224,233) -IMAGE_DATA(103,158,131,39,158,124,10,30,126,228,49,24,62,98,84,97,126,253,238,74,77,125,91,175,219,160,75,231,46,112,89,147) -IMAGE_DATA(203,114,47,119,95,208,214,162,62,11,237,35,50,248,156,84,227,0,218,17,95,253,164,3,159,17,59,46,248,166,67,140) -IMAGE_DATA(165,84,219,167,3,199,62,91,89,186,214,127,197,162,179,197,190,177,73,34,253,248,127,223,88,18,159,177,95,174,107,91) -IMAGE_DATA(123,10,41,7,219,119,139,239,247,153,120,22,142,43,33,99,130,46,45,56,70,132,148,21,246,213,172,109,11,53,102,29) -IMAGE_DATA(219,71,72,30,76,101,226,11,182,245,24,157,16,59,23,154,58,102,61,180,77,200,117,66,169,191,98,197,172,187,202,71) -IMAGE_DATA(110,3,190,243,60,72,236,247,11,166,207,215,22,100,209,150,82,141,9,229,184,102,52,43,189,185,96,225,226,26,122,147) -IMAGE_DATA(50,191,94,181,87,231,158,159,99,137,142,207,175,87,237,213,185,190,176,159,167,60,191,94,21,75,132,243,235,243,97,58) -IMAGE_DATA(206,175,79,193,249,117,220,171,179,106,126,253,209,199,158,128,81,15,62,4,131,6,15,129,254,253,238,133,219,251,220,14) -IMAGE_DATA(221,186,118,131,142,29,110,130,75,42,243,158,119,249,83,9,25,251,92,96,223,139,25,7,98,116,154,13,212,75,161,118) -IMAGE_DATA(197,247,93,88,174,104,187,99,203,214,166,59,125,245,159,47,58,157,238,51,142,137,243,101,168,122,34,182,204,17,155,142) -IMAGE_DATA(242,141,13,53,165,43,38,141,49,233,16,101,42,143,71,62,123,250,233,200,58,46,133,242,157,17,170,55,5,104,111,66) -IMAGE_DATA(251,117,140,54,211,213,77,168,143,42,101,204,122,108,155,64,132,238,76,17,179,238,106,3,148,115,214,93,229,35,174,115) -IMAGE_DATA(165,55,54,29,58,98,222,105,107,75,62,107,41,176,253,167,30,15,92,62,143,82,34,43,189,249,208,152,71,180,122,179) -IMAGE_DATA(230,252,122,205,88,162,221,123,15,20,230,215,171,98,137,170,230,215,143,239,213,105,63,11,115,70,97,175,206,25,133,189) -IMAGE_DATA(58,159,123,30,247,234,172,154,95,199,244,12,29,54,28,6,12,184,31,250,222,217,23,122,246,232,9,157,110,238,4,55) -IMAGE_DATA(222,208,22,126,91,6,123,41,165,242,109,166,232,51,130,144,111,84,223,116,249,234,97,215,154,38,29,49,186,66,197,52) -IMAGE_DATA(127,149,106,172,52,161,179,55,62,247,11,61,67,181,201,242,123,124,227,160,228,114,55,213,99,136,15,192,182,182,202,215) -IMAGE_DATA(111,138,207,162,236,141,77,45,87,172,159,20,223,139,89,250,59,41,49,235,41,218,113,136,95,38,133,54,211,17,162,59) -IMAGE_DATA(83,197,172,167,202,19,62,131,50,55,65,177,165,174,54,16,235,43,21,125,52,133,205,245,29,179,178,182,193,212,244,100) -IMAGE_DATA(229,127,40,7,221,121,126,131,6,153,232,77,4,125,151,38,205,121,124,126,253,88,245,252,186,240,117,86,205,175,31,84) -IMAGE_DATA(230,215,125,206,194,156,87,125,22,230,184,241,19,225,233,194,94,157,85,243,235,35,70,142,130,129,3,7,193,221,119,247) -IMAGE_DATA(131,222,183,245,134,174,157,187,66,135,118,237,161,117,171,235,160,113,9,175,175,206,226,219,44,212,38,21,59,77,190,186) -IMAGE_DATA(51,68,39,164,182,69,186,185,150,172,203,72,125,159,175,14,68,45,67,45,59,117,76,13,213,102,182,53,20,33,190,115) -IMAGE_DATA(219,122,53,223,49,14,223,159,74,227,164,90,119,98,107,95,41,176,189,19,181,72,170,239,94,223,51,219,179,210,155,34) -IMAGE_DATA(45,190,223,181,41,98,214,99,253,197,186,119,186,174,137,109,3,162,45,199,148,143,152,191,74,81,159,62,254,100,159,182) -IMAGE_DATA(171,174,153,199,123,41,115,241,234,188,134,142,172,215,88,149,114,156,24,198,167,103,17,47,132,44,93,182,220,170,55,117) -IMAGE_DATA(177,68,250,249,245,52,103,97,62,137,123,117,62,246,4,60,56,122,76,97,143,248,254,253,7,192,237,183,223,1,221,111) -IMAGE_DATA(237,14,55,223,212,17,110,104,115,61,92,219,252,106,56,183,8,107,166,124,41,150,182,19,125,134,242,157,148,245,60,177) -IMAGE_DATA(206,182,80,191,223,178,238,211,20,212,49,39,212,15,72,69,231,87,241,213,88,182,120,33,215,251,66,203,220,86,143,33) -IMAGE_DATA(235,173,108,99,125,158,237,34,181,94,202,194,215,233,242,3,155,242,32,199,135,251,216,5,170,127,209,87,111,226,152,235) -IMAGE_DATA(251,189,224,59,78,187,158,77,241,119,249,148,149,136,177,196,177,192,164,83,93,105,162,228,145,50,23,64,249,222,177,245) -IMAGE_DATA(93,91,59,145,227,196,83,182,35,234,28,135,43,190,129,50,175,103,155,243,167,106,109,44,31,177,119,133,64,236,101,64) -IMAGE_DATA(201,71,41,174,239,196,253,55,187,117,239,25,172,41,239,236,123,55,220,126,71,95,173,102,29,112,223,253,78,189,169,106) -IMAGE_DATA(78,250,94,157,186,179,48,95,171,121,22,230,44,253,89,152,184,87,231,176,97,35,224,190,251,6,66,223,190,119,65,207) -IMAGE_DATA(30,189,160,243,45,157,160,93,219,27,161,213,181,45,160,121,211,171,74,234,44,235,148,115,190,84,92,235,100,138,169,129) -IMAGE_DATA(213,126,72,41,179,98,235,97,29,169,252,128,84,116,26,196,87,99,249,216,121,213,166,133,148,185,203,71,17,82,14,182) -IMAGE_DATA(190,155,197,154,227,188,200,194,151,225,107,107,76,49,179,212,53,151,212,113,145,242,44,108,75,186,189,116,196,94,17,148) -IMAGE_DATA(252,80,231,69,241,29,174,103,185,124,129,84,13,132,253,74,87,198,120,191,175,143,180,84,98,214,85,127,35,106,48,172) -IMAGE_DATA(35,93,221,165,106,71,148,190,79,173,127,87,123,178,249,240,93,154,21,239,117,181,29,106,185,148,218,222,255,29,58,116) -IMAGE_DATA(116,234,202,187,239,233,15,183,221,214,27,250,244,185,163,160,209,134,86,106,53,220,115,8,231,168,81,191,225,57,63,24) -IMAGE_DATA(163,131,103,77,78,156,52,165,176,63,17,254,29,227,116,150,190,244,178,151,238,212,197,18,101,117,22,230,200,145,15,194) -IMAGE_DATA(3,15,12,134,123,238,193,249,245,62,208,181,75,87,184,169,125,7,104,211,170,53,92,125,85,51,104,122,197,149,80,175) -IMAGE_DATA(94,189,220,235,8,219,86,86,243,73,46,76,223,178,49,235,55,197,220,28,246,217,208,57,37,202,188,78,214,107,118,40) -IMAGE_DATA(164,242,3,82,209,197,172,251,106,44,31,191,162,106,231,107,99,204,122,169,147,218,222,80,219,40,37,246,134,226,207,73) -IMAGE_DATA(17,67,45,218,145,107,14,132,226,43,165,206,211,166,136,89,167,180,69,87,249,248,206,205,151,74,204,186,92,15,174,117) -IMAGE_DATA(13,152,71,87,89,185,210,68,249,70,240,61,103,195,213,150,76,121,114,213,23,117,191,22,87,221,139,111,176,212,54,34) -IMAGE_DATA(20,219,121,150,119,221,221,15,186,117,235,1,221,187,247,128,219,122,245,46,236,43,132,251,11,13,27,62,210,170,55,49) -IMAGE_DATA(102,103,198,204,89,240,220,184,241,39,188,171,101,171,86,240,216,19,79,194,150,173,219,136,243,235,217,158,133,249,152,116) -IMAGE_DATA(22,230,189,247,14,128,59,110,191,19,186,87,230,247,150,142,55,67,219,54,55,64,139,171,175,41,248,58,7,86,106,210) -IMAGE_DATA(188,235,41,79,191,140,206,111,22,58,63,108,26,163,176,127,249,106,106,138,205,203,171,204,108,233,204,35,102,61,75,141) -IMAGE_DATA(165,190,47,228,25,182,49,176,20,98,214,75,157,188,236,13,117,92,116,205,135,184,198,121,74,44,160,79,204,4,229,123) -IMAGE_DATA(153,146,55,215,115,92,218,149,210,182,169,49,217,62,241,146,165,18,179,46,160,174,163,117,149,183,107,76,160,124,35,164) -IMAGE_DATA(94,207,107,106,71,174,242,240,73,131,170,199,133,79,167,212,252,155,232,191,211,205,135,247,232,209,171,16,195,141,254,62) -IMAGE_DATA(244,251,133,232,77,60,7,168,77,155,235,141,239,190,224,130,134,208,175,255,189,176,102,237,58,199,94,157,9,206,194,156) -IMAGE_DATA(95,243,44,204,167,53,103,97,222,213,247,110,232,213,243,54,232,220,169,51,180,107,219,14,174,107,209,178,160,57,135,14) -IMAGE_DATA(29,14,237,59,116,204,173,158,66,253,60,136,188,38,69,236,99,237,251,12,221,220,93,136,6,118,217,149,144,124,218,158) -IMAGE_DATA(23,179,110,82,157,199,138,217,151,69,181,131,226,44,38,65,104,156,147,252,12,153,216,152,117,95,100,155,90,27,99,214) -IMAGE_DATA(101,48,45,152,71,177,7,121,76,185,137,121,68,209,6,98,124,242,169,109,78,10,223,155,79,29,186,158,69,89,195,227) -IMAGE_DATA(59,190,186,202,155,178,78,214,21,139,226,210,64,46,59,74,93,83,239,83,78,212,178,202,58,102,93,134,250,237,18,114) -IMAGE_DATA(54,150,79,122,124,181,30,165,14,117,121,115,217,201,144,115,101,209,134,148,162,206,148,81,207,80,199,53,153,109,175,191) -IMAGE_DATA(1,174,191,174,117,180,222,156,94,249,127,106,58,46,187,252,242,130,255,115,255,193,67,217,159,133,57,165,230,89,152,163) -IMAGE_DATA(148,179,48,111,237,122,107,101,254,111,42,148,195,53,205,154,195,157,119,222,5,147,167,206,128,250,245,235,231,82,79,161) -IMAGE_DATA(62,78,147,77,8,25,195,125,250,189,9,138,127,223,119,220,181,217,189,208,117,147,166,239,247,208,124,187,198,174,144,231) -IMAGE_DATA(250,204,255,196,104,44,223,182,81,27,99,214,109,105,12,93,39,161,251,254,138,137,223,77,109,115,92,239,243,29,19,99) -IMAGE_DATA(52,39,101,62,52,100,127,70,215,55,3,101,157,108,76,204,58,197,47,233,59,39,74,253,230,75,209,6,98,99,214,41) -IMAGE_DATA(125,213,215,150,197,106,206,144,61,111,67,52,39,197,38,215,166,51,45,17,60,215,82,158,67,111,119,99,251,130,190,74) -IMAGE_DATA(161,55,231,45,88,4,119,246,189,203,59,77,191,174,236,95,61,123,245,130,77,91,182,106,207,194,172,218,171,51,225,89) -IMAGE_DATA(152,79,155,207,194,188,165,227,45,5,253,221,242,154,107,161,75,167,206,133,253,229,239,233,63,160,232,245,20,234,55,178) -IMAGE_DATA(141,9,20,27,174,34,127,107,135,104,0,234,24,229,27,147,100,179,17,33,122,192,229,87,8,169,11,151,63,32,196,95) -IMAGE_DATA(230,227,99,202,58,246,44,182,204,213,103,168,132,232,176,212,49,235,169,191,67,76,90,34,244,251,50,165,205,161,228,201) -IMAGE_DATA(87,11,185,252,129,182,185,94,74,255,8,217,47,138,98,91,93,207,136,137,89,119,149,137,175,143,147,106,163,74,37,102) -IMAGE_DATA(61,164,238,92,233,114,125,223,187,250,126,72,60,94,200,122,78,202,247,6,37,134,168,156,232,221,231,246,130,222,236,85) -IMAGE_DATA(169,43,175,190,170,121,82,189,185,112,241,18,56,231,156,115,163,210,215,162,101,75,88,252,226,210,162,158,133,57,112,224) -IMAGE_DATA(137,103,97,182,191,177,29,92,215,178,85,33,134,29,53,39,114,201,165,77,138,90,79,161,123,224,185,198,4,95,127,162) -IMAGE_DATA(104,251,33,123,172,35,212,115,113,67,214,58,166,124,150,205,95,18,154,119,151,221,8,169,99,159,253,20,98,99,150,208) -IMAGE_DATA(246,97,26,41,246,47,117,204,122,200,247,145,171,124,66,116,157,233,121,33,154,211,54,127,23,146,182,212,113,235,174,111) -IMAGE_DATA(148,98,205,63,82,109,85,76,254,93,101,235,138,105,137,233,251,174,124,133,158,173,227,122,110,169,196,172,83,211,34,227) -IMAGE_DATA(250,254,112,125,139,167,202,151,192,53,175,99,235,43,62,253,27,243,93,27,206,82,239,116,75,103,184,162,201,101,201,245) -IMAGE_DATA(38,206,147,167,74,107,139,22,45,97,193,162,197,206,179,48,143,239,213,153,232,44,204,91,171,206,194,188,190,117,27,184) -IMAGE_DATA(166,249,213,213,154,115,212,232,49,69,173,171,208,216,15,215,247,177,105,12,16,251,161,137,152,114,236,83,242,26,193,208) -IMAGE_DATA(53,108,104,63,229,125,117,77,132,228,55,52,46,80,135,77,171,132,250,180,92,182,34,68,103,248,172,217,137,137,63,243) -IMAGE_DATA(61,203,162,28,98,214,67,252,166,166,50,8,241,33,219,198,217,212,235,8,66,112,125,163,132,104,33,87,153,155,238,163) -IMAGE_DATA(232,186,152,253,7,93,207,182,105,198,152,152,117,74,190,66,247,233,75,177,71,125,49,98,214,67,242,232,74,151,235,121) -IMAGE_DATA(41,215,51,80,226,232,109,125,37,244,251,188,212,215,108,234,192,253,142,80,75,101,161,55,151,188,244,50,180,189,177,93) -IMAGE_DATA(242,52,95,219,162,5,172,91,191,33,237,89,152,227,104,103,97,182,148,252,156,197,244,117,134,206,171,83,190,251,177,95) -IMAGE_DATA(161,126,20,113,39,212,52,149,226,190,134,33,113,129,38,98,247,0,214,225,42,211,16,13,228,211,142,66,191,91,66,206) -IMAGE_DATA(78,11,121,143,109,12,76,93,230,33,126,83,155,31,54,196,135,108,203,111,234,189,239,67,112,245,113,95,157,224,26,231) -IMAGE_DATA(109,229,155,245,186,183,152,103,199,196,172,83,214,61,135,158,91,152,162,254,138,17,179,158,133,191,156,162,197,40,113,91) -IMAGE_DATA(174,231,80,247,166,178,249,27,98,215,60,149,139,254,188,236,178,203,51,213,155,203,150,175,128,186,25,238,163,142,235,68) -IMAGE_DATA(55,87,106,204,212,103,97,98,44,209,136,145,15,26,207,194,68,109,90,108,95,103,104,155,204,242,220,129,152,62,146,21) -IMAGE_DATA(33,113,129,33,54,48,100,14,220,229,15,8,153,175,247,157,75,12,45,87,95,91,150,69,204,122,72,153,167,142,89,183) -IMAGE_DATA(213,97,136,175,194,166,99,66,202,47,245,185,21,46,221,235,171,133,98,226,62,82,157,225,24,90,222,182,186,138,137,89) -IMAGE_DATA(207,98,93,33,181,254,74,37,102,61,196,95,238,74,23,229,25,148,189,174,197,122,34,181,172,176,61,224,239,20,63,1) -IMAGE_DATA(101,223,131,84,251,71,99,91,43,165,243,107,212,58,203,82,111,142,121,228,209,204,243,128,123,60,77,152,52,153,112,22) -IMAGE_DATA(230,26,210,89,152,99,9,103,97,62,242,232,19,39,248,58,139,17,195,30,186,150,51,171,182,23,186,158,49,107,116,227) -IMAGE_DATA(66,72,252,116,236,190,38,33,118,181,84,99,214,67,198,131,208,152,117,219,24,152,122,174,57,117,188,86,200,152,97,242) -IMAGE_DATA(125,100,177,142,32,4,219,187,66,246,112,137,137,89,119,197,20,198,174,101,117,149,109,204,126,10,182,124,185,190,85,66) -IMAGE_DATA(215,114,82,242,148,117,185,80,203,199,55,14,205,53,71,225,211,22,178,142,171,164,166,197,247,44,87,23,148,51,17,138) -IMAGE_DATA(9,182,147,44,245,38,250,21,219,119,232,80,180,252,180,189,241,198,130,111,243,196,179,48,107,238,213,153,226,44,76,188) -IMAGE_DATA(94,214,156,197,136,97,15,157,199,206,106,173,113,214,123,238,132,146,106,15,27,215,119,105,234,248,233,208,116,22,35,102) -IMAGE_DATA(61,228,187,165,28,98,214,67,190,227,108,99,99,202,252,102,177,247,125,234,62,30,178,118,212,165,27,109,229,235,178,129) -IMAGE_DATA(49,107,89,41,223,208,54,109,21,19,179,158,98,205,101,72,158,74,41,102,221,119,156,74,221,54,209,198,101,113,182,31) -IMAGE_DATA(182,119,31,221,151,90,119,98,185,151,202,124,251,5,13,126,147,169,222,196,249,236,211,139,236,223,69,159,39,234,198,172) -IMAGE_DATA(207,194,148,245,38,130,251,117,102,157,183,82,216,55,197,167,207,231,133,110,92,8,153,243,180,197,214,135,198,79,187,252) -IMAGE_DATA(1,33,231,213,103,29,179,30,178,206,42,180,204,109,99,96,169,196,172,155,234,48,100,45,129,45,191,169,247,190,15,193) -IMAGE_DATA(165,123,67,180,80,76,204,122,86,218,140,106,207,98,218,166,45,95,46,61,22,186,70,213,53,215,80,42,49,235,33,54) -IMAGE_DATA(38,54,102,93,237,187,169,99,19,48,79,161,103,76,162,254,78,153,30,108,95,165,224,239,108,214,180,105,166,122,115,218) -IMAGE_DATA(140,153,185,229,237,182,222,125,50,61,11,83,213,156,72,179,74,253,158,101,158,74,97,223,20,153,82,213,156,186,180,134) -IMAGE_DATA(204,121,198,198,168,234,40,199,152,245,80,223,81,72,153,219,222,149,197,92,125,202,120,173,144,244,149,123,204,122,136,255) -IMAGE_DATA(59,180,124,41,101,18,163,57,99,206,164,137,61,103,221,117,111,168,230,116,249,241,75,37,102,61,100,239,245,152,61,94) -IMAGE_DATA(41,207,9,245,53,162,221,67,173,153,66,227,97,185,165,210,158,49,235,51,82,112,230,25,103,100,170,55,49,110,103,224) -IMAGE_DATA(3,131,114,205,227,197,23,95,12,75,151,45,143,58,11,243,97,205,89,152,168,61,117,154,51,235,249,245,144,182,23,210) -IMAGE_DATA(151,125,250,67,104,219,167,236,147,20,138,46,173,33,233,204,35,102,61,139,103,202,20,51,14,58,36,47,49,107,249,124) -IMAGE_DATA(203,135,99,214,227,109,142,239,156,93,76,204,58,37,61,49,49,235,46,191,124,204,186,96,87,190,92,245,26,58,55,234) -IMAGE_DATA(250,238,43,149,152,117,74,124,77,234,182,105,139,53,151,231,195,177,77,97,191,194,250,23,123,7,202,224,239,98,31,193) -IMAGE_DATA(172,124,137,216,111,176,141,197,198,24,229,185,167,231,37,149,239,207,82,111,226,30,69,77,175,186,42,183,252,9,78,175) -IMAGE_DATA(87,175,144,214,36,103,97,246,171,58,11,19,215,119,234,52,103,214,243,235,89,105,78,236,83,216,158,125,237,90,168,230) -IMAGE_DATA(44,182,143,159,99,214,143,19,82,95,33,190,172,208,152,117,219,187,66,252,14,165,30,179,110,203,111,177,234,202,70,138) -IMAGE_DATA(184,96,159,50,143,141,219,139,209,156,174,246,101,91,107,19,123,206,186,171,94,67,242,67,177,39,165,18,179,78,61,35) -IMAGE_DATA(196,167,190,108,247,186,244,102,202,62,148,26,76,59,106,120,76,167,175,77,12,209,246,169,192,253,145,178,212,155,24,47) -IMAGE_DATA(94,236,181,156,54,48,6,61,213,89,152,131,135,12,211,106,78,164,97,134,115,217,33,126,30,138,230,148,237,56,182,97) -IMAGE_DATA(28,59,41,26,52,84,87,248,244,45,121,255,249,80,56,102,61,252,249,212,113,41,213,187,76,154,33,52,158,166,212,99) -IMAGE_DATA(214,77,101,91,14,49,235,33,235,118,98,98,214,41,253,46,68,187,32,20,91,22,179,159,130,43,95,174,119,135,228,137) -IMAGE_DATA(242,93,28,219,6,108,125,214,167,124,124,191,21,98,99,214,109,237,176,20,214,61,250,128,227,27,117,60,202,114,222,211) -IMAGE_DATA(70,157,211,78,203,92,111,206,154,51,55,247,186,80,25,248,192,224,36,103,97,162,255,211,164,57,187,222,218,45,179,244) -IMAGE_DATA(103,17,7,236,26,219,92,26,52,36,61,84,255,190,172,177,49,29,242,121,72,152,110,234,115,56,102,189,138,98,198,65) -IMAGE_DATA(135,182,85,147,189,15,221,199,158,99,214,195,41,181,152,117,74,157,133,174,45,112,165,203,53,55,30,227,35,165,180,29) -IMAGE_DATA(223,111,9,236,71,174,52,149,82,204,122,234,61,94,93,109,211,84,54,121,105,178,20,80,108,70,94,249,107,216,176,97) -IMAGE_DATA(166,122,19,247,43,26,243,240,35,185,215,129,142,14,55,117,36,156,133,57,221,120,22,230,125,3,238,55,234,77,100,208) -IMAGE_DATA(224,161,153,165,61,212,247,97,178,119,148,179,186,92,182,47,196,223,71,25,23,124,124,168,152,6,28,51,76,243,138,229) -IMAGE_DATA(18,179,158,133,54,142,125,126,104,12,90,232,218,75,93,25,133,62,11,225,152,245,112,74,45,102,29,113,249,166,67,202) -IMAGE_DATA(128,162,207,108,121,141,141,89,71,92,62,114,95,63,32,165,253,164,88,135,137,80,210,99,187,191,216,49,235,182,113,52) -IMAGE_DATA(203,152,91,10,168,223,99,214,135,184,250,87,94,154,179,217,85,205,50,213,155,27,55,109,129,126,253,239,205,181,238,108) -IMAGE_DATA(116,232,112,147,225,44,204,133,134,179,48,199,86,159,133,137,115,244,54,205,153,245,154,206,16,255,26,222,163,142,189,216) -IMAGE_DATA(174,125,231,2,117,237,53,100,126,210,117,150,88,232,254,100,166,190,90,155,99,214,177,156,168,54,170,152,113,208,161,177) -IMAGE_DATA(150,88,87,162,156,176,29,132,124,47,200,112,204,122,56,165,22,179,46,218,68,108,63,243,205,167,235,153,20,123,224,242) -IMAGE_DATA(227,165,140,199,167,156,171,67,125,102,169,198,172,187,190,67,109,109,211,149,158,98,238,101,137,117,37,214,102,202,254,159) -IMAGE_DATA(208,88,159,20,245,149,5,55,119,188,57,83,189,137,251,177,55,111,126,117,46,121,163,130,123,213,135,156,133,137,127,182) -IMAGE_DATA(105,78,164,78,157,186,153,165,59,198,231,131,109,26,219,92,232,60,165,78,219,196,156,69,164,158,37,134,127,198,62,19) -IMAGE_DATA(162,5,108,125,41,36,109,121,196,172,199,236,137,33,234,22,193,242,211,205,5,22,51,14,58,213,25,110,177,152,210,199) -IMAGE_DATA(49,235,110,74,45,102,157,90,54,62,218,155,162,97,93,254,64,151,61,160,248,241,92,237,199,231,188,39,106,223,75,177) -IMAGE_DATA(14,179,28,99,214,41,235,201,48,77,62,235,183,124,193,250,182,181,227,172,246,167,75,253,93,74,165,95,191,123,51,213) -IMAGE_DATA(155,91,183,237,128,6,13,242,201,155,15,237,218,119,240,58,11,19,125,157,46,189,137,92,114,105,147,204,210,156,215,121) -IMAGE_DATA(147,54,77,23,163,131,83,97,178,49,229,18,179,142,164,220,3,88,247,190,144,231,132,198,65,231,221,30,144,212,49,235) -IMAGE_DATA(54,123,93,27,99,214,99,226,130,67,202,156,234,131,161,244,63,74,44,17,101,62,5,255,221,165,59,98,99,214,17,138) -IMAGE_DATA(159,220,149,39,252,142,242,105,135,41,214,97,230,21,179,238,202,91,76,59,12,69,124,243,139,125,147,108,105,160,248,45) -IMAGE_DATA(124,227,231,83,180,161,172,200,90,111,226,153,231,121,228,43,132,254,247,222,71,62,11,115,108,229,255,41,154,243,186,214) -IMAGE_DATA(109,50,77,115,30,26,207,246,221,152,247,185,235,54,187,87,46,49,235,169,235,85,45,147,172,214,3,152,8,245,165,167) -IMAGE_DATA(164,152,49,235,33,249,45,229,152,245,148,103,89,11,98,99,214,125,237,13,214,191,169,253,162,239,141,50,159,66,25,163) -IMAGE_DATA(93,246,128,234,199,163,206,135,235,230,96,48,63,106,27,76,241,205,224,74,79,30,49,235,177,231,121,22,107,188,194,242) -IMAGE_DATA(55,213,23,101,13,49,130,101,71,41,31,108,167,148,231,229,177,63,231,57,231,156,155,185,222,92,188,100,105,209,243,21) -IMAGE_DATA(3,238,125,228,58,11,243,201,167,158,133,169,211,43,72,154,51,203,216,117,159,246,154,138,20,223,178,89,225,210,114,229) -IMAGE_DATA(18,179,46,236,70,170,114,81,227,127,139,29,7,157,197,57,114,41,203,60,196,87,157,218,47,105,122,22,199,172,187,241) -IMAGE_DATA(169,63,121,191,11,76,55,181,45,81,253,174,177,49,235,212,242,145,251,130,136,155,20,107,105,116,245,99,75,87,138,117) -IMAGE_DATA(152,72,10,95,105,30,109,51,118,157,184,15,166,243,206,125,252,33,168,163,197,126,45,2,188,31,219,53,245,123,55,175) -IMAGE_DATA(125,71,27,53,106,148,169,222,220,177,107,15,204,154,93,122,251,36,185,24,247,194,4,235,89,152,8,69,111,22,67,115) -IMAGE_DATA(34,161,123,99,250,226,211,78,139,237,127,165,164,173,92,98,214,145,148,223,223,234,251,178,90,15,96,34,165,126,198,177) -IMAGE_DATA(51,228,121,169,99,214,83,250,37,75,61,102,61,229,89,214,212,50,247,241,119,133,236,185,225,91,158,148,253,123,82,196) -IMAGE_DATA(172,167,238,255,34,70,211,118,77,169,196,172,251,172,83,165,246,15,74,219,180,237,9,159,5,166,184,217,98,141,153,248) -IMAGE_DATA(254,188,246,29,109,212,184,113,166,122,115,215,158,125,48,169,242,121,121,228,45,134,186,117,79,47,236,7,175,59,11,19) -IMAGE_DATA(99,137,240,140,34,170,230,204,114,191,36,153,80,127,8,21,223,239,34,108,211,169,253,91,38,168,190,131,144,113,41,143) -IMAGE_DATA(152,117,65,136,54,212,81,163,223,103,180,30,192,214,22,82,249,226,197,217,115,190,247,21,43,102,61,164,31,150,122,204) -IMAGE_DATA(122,170,179,172,101,66,203,215,68,232,254,22,46,92,251,106,248,218,3,159,177,62,69,255,23,126,48,219,53,39,107,204) -IMAGE_DATA(122,86,54,138,2,142,69,186,182,144,181,238,244,105,207,89,208,248,194,11,51,213,155,123,247,29,128,7,114,62,103,61) -IMAGE_DATA(166,108,116,103,97,226,158,73,84,189,137,140,26,61,166,104,105,198,62,157,69,191,137,137,129,205,178,15,153,230,41,76) -IMAGE_DATA(132,188,195,246,188,172,98,214,5,41,190,191,117,190,131,172,214,3,216,72,241,77,36,230,91,67,116,152,173,140,125,159) -IMAGE_DATA(149,218,47,201,49,235,238,54,75,33,181,238,164,250,55,169,246,192,119,239,201,216,254,47,250,139,171,77,150,74,204,122) -IMAGE_DATA(22,254,114,74,219,196,107,242,216,91,195,148,223,172,198,204,188,245,38,114,225,133,23,101,170,55,247,31,56,4,131,6) -IMAGE_DATA(13,206,53,143,49,220,210,169,243,9,103,97,78,156,60,205,75,111,22,91,115,34,104,207,83,249,23,241,57,41,218,40) -IMAGE_DATA(126,107,166,156,251,18,235,177,125,210,16,226,147,116,141,125,197,152,163,142,29,119,212,247,101,185,30,192,69,168,238,84) -IMAGE_DATA(247,148,245,109,75,197,140,89,15,233,123,28,179,30,215,71,212,246,157,98,125,30,246,109,223,249,199,20,49,235,41,250) -IMAGE_DATA(191,218,95,92,26,166,84,98,214,125,214,240,82,251,71,140,77,138,217,75,144,130,109,124,73,61,102,98,27,40,133,115) -IMAGE_DATA(60,47,170,108,155,89,234,205,131,135,222,129,193,131,135,228,158,207,24,240,156,75,113,22,38,238,155,84,234,154,83,128) -IMAGE_DATA(118,61,84,123,162,205,78,161,49,84,116,241,148,190,125,212,20,251,71,121,183,239,251,242,138,89,87,193,252,134,206,179) -IMAGE_DATA(229,29,179,174,107,151,62,109,0,203,75,125,119,72,123,54,165,135,99,214,221,109,207,246,174,60,99,214,93,237,44,68) -IMAGE_DATA(123,234,218,27,149,84,49,235,33,101,102,75,191,43,93,148,247,187,222,91,142,49,235,182,49,193,180,255,180,28,183,99) -IMAGE_DATA(2,245,162,107,207,77,129,171,173,97,26,67,199,113,252,246,136,105,207,89,240,219,223,254,46,83,189,121,248,157,247,96) -IMAGE_DATA(200,144,226,172,103,204,138,186,117,235,22,206,35,154,20,224,227,204,83,115,202,253,4,199,85,180,191,166,239,101,252,29) -IMAGE_DATA(219,38,182,239,98,180,79,28,19,69,154,108,253,82,196,100,98,255,205,123,78,160,20,192,241,31,235,8,199,46,177,255) -IMAGE_DATA(155,14,252,119,44,95,180,127,165,240,109,171,3,237,50,182,57,181,77,202,117,94,74,182,146,41,79,68,159,17,113,221) -IMAGE_DATA(58,219,135,118,168,88,182,47,54,47,194,110,202,253,29,255,142,191,151,122,250,75,9,155,94,77,181,111,37,37,182,141) -IMAGE_DATA(170,179,241,89,66,203,170,245,47,131,237,92,216,254,188,203,88,199,239,42,243,156,165,222,124,247,189,247,97,232,208,97) -IMAGE_DATA(185,231,51,150,121,243,23,4,233,205,98,198,16,213,6,80,87,178,182,100,24,134,97,178,196,182,222,32,229,123,82,172) -IMAGE_DATA(165,173,77,92,124,241,37,153,234,205,35,239,31,133,97,195,134,231,158,207,24,22,47,126,17,254,251,127,255,175,80,46) -IMAGE_DATA(33,154,179,24,123,37,49,12,195,48,12,67,195,182,70,54,229,123,92,154,243,100,243,77,95,208,176,97,166,122,243,131) -IMAGE_DATA(163,199,96,216,240,17,185,231,51,20,161,55,145,175,191,249,142,53,39,195,48,12,195,148,57,54,29,152,50,6,207,182) -IMAGE_DATA(166,56,116,127,134,114,39,75,189,121,244,216,199,48,124,196,200,220,243,24,130,172,55,5,88,62,190,154,51,235,179,47) -IMAGE_DATA(25,134,97,24,134,161,227,138,61,74,177,14,222,21,3,24,19,83,86,206,84,204,158,155,153,222,60,246,209,39,48,98) -IMAGE_DATA(228,168,220,243,232,195,153,103,158,9,171,215,172,169,161,55,67,125,157,151,92,218,36,247,60,49,12,195,48,12,83,133) -IMAGE_DATA(107,255,41,244,65,198,172,181,68,95,169,109,143,49,252,183,147,109,94,93,240,216,19,79,102,166,55,63,254,228,51,24) -IMAGE_DATA(57,234,193,220,243,72,5,245,230,161,67,135,225,63,255,253,63,45,168,59,231,206,91,232,165,57,235,212,169,155,123,190) -IMAGE_DATA(24,134,97,24,134,169,130,186,239,186,124,182,185,235,153,98,63,22,202,126,170,169,98,227,203,145,123,250,245,207,76,111) -IMAGE_DATA(126,250,217,239,97,84,153,104,206,102,205,154,195,39,159,126,6,255,254,207,127,13,84,233,206,3,7,15,147,245,230,228) -IMAGE_DATA(169,51,114,207,23,195,48,12,195,48,199,137,57,207,30,53,165,188,63,145,239,253,49,231,8,215,6,218,181,111,159,153) -IMAGE_DATA(222,252,236,243,63,192,130,5,139,114,207,163,139,238,221,123,192,23,95,126,5,255,250,247,127,12,28,215,158,223,255,240) -IMAGE_DATA(99,217,236,205,201,48,12,195,48,76,77,82,156,199,203,122,211,159,115,207,59,47,51,189,249,251,63,252,9,94,93,185) -IMAGE_DATA(42,247,60,218,152,60,121,10,252,243,95,255,182,80,83,131,206,156,53,151,99,214,25,134,97,24,166,140,41,150,238,196) -IMAGE_DATA(245,155,39,243,124,186,202,248,23,38,102,162,55,255,240,199,63,195,238,202,123,243,206,159,142,11,47,188,16,54,110,220) -IMAGE_DATA(12,63,254,244,47,248,233,159,38,254,93,64,213,161,107,214,174,227,248,33,134,97,24,134,41,115,112,29,102,232,249,146) -IMAGE_DATA(46,98,206,107,174,205,92,222,164,9,44,88,184,56,185,222,20,228,157,63,149,110,221,186,193,95,254,250,119,248,225,199) -IMAGE_DATA(127,86,106,78,19,255,50,234,81,204,35,175,229,100,24,134,97,152,218,1,174,241,68,125,24,163,63,229,179,123,79,182) -IMAGE_DATA(51,134,124,192,184,254,43,46,109,2,235,222,216,144,92,111,34,13,27,54,202,61,143,72,227,202,111,142,87,86,188,10) -IMAGE_DATA(223,255,240,83,53,63,252,168,227,159,86,61,250,205,183,223,59,53,231,61,253,7,228,158,95,166,124,144,237,220,201,186) -IMAGE_DATA(135,6,147,22,249,172,231,188,211,226,139,28,175,145,119,90,152,147,19,180,195,168,27,17,212,144,58,112,110,94,92,195) -IMAGE_DATA(190,76,63,80,159,183,184,230,218,194,252,122,74,189,137,180,110,221,58,247,252,13,29,54,12,254,244,231,191,192,119,223) -IMAGE_DATA(255,88,13,198,3,213,132,166,71,103,84,204,177,106,78,140,131,207,59,207,76,249,96,211,7,98,238,7,225,243,232,25) -IMAGE_DATA(42,162,61,97,187,201,59,45,2,185,45,155,206,123,193,107,68,218,241,28,151,188,211,124,50,129,26,170,28,108,141,72) -IMAGE_DATA(227,201,186,175,122,109,64,236,87,213,242,218,107,97,211,150,183,147,233,77,228,193,209,15,229,150,175,27,110,104,11,187) -IMAGE_DATA(118,239,129,111,191,251,190,146,31,170,249,238,123,29,116,61,58,117,122,5,207,171,51,201,176,217,80,249,204,94,246,129) -IMAGE_DATA(50,20,100,109,135,237,39,239,244,8,228,152,13,211,220,35,254,46,210,142,215,231,157,230,147,9,121,223,202,188,211,98) -IMAGE_DATA(2,253,137,34,141,165,212,182,25,63,228,115,154,90,85,234,206,109,219,119,36,209,155,200,130,133,197,223,47,169,113,227) -IMAGE_DATA(198,176,126,195,6,248,230,219,239,126,230,251,19,168,210,160,50,126,122,212,166,57,121,94,157,73,137,56,179,23,231,34) -IMAGE_DATA(242,78,11,195,196,128,223,84,165,174,105,78,102,196,126,230,165,188,166,65,214,42,41,207,70,103,138,143,60,191,215,242) -IMAGE_DATA(234,107,97,205,154,215,163,245,102,177,99,215,81,107,206,158,51,23,190,254,230,91,137,239,78,224,184,14,245,215,163,66) -IMAGE_DATA(147,78,157,62,211,168,57,235,215,175,159,123,93,34,216,55,67,230,71,240,59,18,239,141,241,169,137,103,196,94,227,202) -IMAGE_DATA(159,107,13,77,108,62,98,16,235,129,98,159,35,250,101,222,115,164,49,237,34,69,155,194,123,93,237,57,166,204,69,26) -IMAGE_DATA(109,109,138,114,77,57,180,169,148,117,227,179,158,77,172,91,78,169,105,176,77,196,150,9,165,109,197,150,111,72,155,17) -IMAGE_DATA(245,29,211,222,124,218,76,232,62,146,161,99,141,250,12,74,27,228,121,159,218,131,186,87,21,198,21,205,158,53,39,74) -IMAGE_DATA(111,10,206,56,227,140,76,211,126,253,245,55,192,186,117,235,225,171,127,124,3,255,248,90,240,109,13,78,212,162,225,122) -IMAGE_DATA(212,164,57,243,222,7,30,235,80,61,123,11,253,99,232,95,112,141,165,216,151,229,239,14,113,175,109,175,7,220,115,76) -IMAGE_DATA(158,19,198,239,78,245,25,234,124,49,166,81,189,6,109,156,238,29,242,28,33,254,59,218,24,225,247,147,215,171,201,182) -IMAGE_DATA(7,239,209,93,99,178,137,148,57,72,219,58,39,117,30,80,87,142,152,30,83,25,202,207,150,159,233,218,131,67,46,27) -IMAGE_DATA(215,28,36,150,175,109,13,157,13,172,99,83,187,176,221,135,117,130,239,85,207,29,22,251,135,152,238,195,246,34,215,135) -IMAGE_DATA(250,126,221,187,117,101,110,90,235,165,150,183,152,203,181,213,151,238,26,209,38,117,125,137,82,47,186,122,87,239,199,250) -IMAGE_DATA(18,125,83,45,71,83,159,145,203,208,182,30,50,180,94,177,44,116,245,106,178,53,148,115,6,117,109,213,182,86,15,211) -IMAGE_DATA(160,246,113,81,39,38,125,149,162,92,169,152,158,141,229,237,234,131,166,188,185,238,13,181,67,234,53,186,50,213,229,79) -IMAGE_DATA(215,126,68,249,153,180,160,218,230,117,182,26,159,169,246,27,204,183,171,13,113,156,120,121,162,107,67,183,118,233,10,135) -IMAGE_DATA(14,191,27,172,55,145,91,58,117,74,158,86,212,177,119,246,189,171,48,255,255,229,87,95,23,248,234,31,50,223,212,224) -IMAGE_DATA(184,30,173,169,73,125,244,232,212,105,122,205,153,215,158,156,194,158,218,250,164,201,183,128,253,89,55,126,80,238,21,239) -IMAGE_DATA(68,59,99,27,91,196,56,102,187,70,55,62,138,111,90,76,31,218,33,83,58,69,250,108,123,252,226,189,170,189,149,207) -IMAGE_DATA(64,115,233,32,221,248,40,223,239,58,107,215,85,134,216,247,196,111,174,250,16,101,101,43,187,234,126,242,115,153,232,242) -IMAGE_DATA(239,106,83,174,179,131,77,254,16,91,93,185,238,21,247,97,125,216,218,11,190,195,149,70,93,157,138,103,138,241,217,149) -IMAGE_DATA(62,185,238,41,117,42,207,253,217,52,167,174,222,213,251,77,227,186,192,228,251,182,249,198,99,234,213,86,22,166,251,125) -IMAGE_DATA(53,141,248,93,167,57,49,237,58,61,166,162,211,102,62,229,26,19,187,132,58,202,213,246,77,237,130,82,190,186,123,67) -IMAGE_DATA(237,144,188,54,210,132,90,15,152,63,221,183,138,250,119,157,238,20,249,19,186,146,90,135,148,114,225,184,241,242,196,212) -IMAGE_DATA(14,174,104,114,25,76,159,54,35,72,111,34,79,63,243,108,178,52,118,169,212,192,21,21,179,225,139,47,255,113,2,95) -IMAGE_DATA(126,37,248,90,75,140,30,85,53,233,20,141,230,204,203,199,169,142,33,104,47,133,47,14,237,172,252,111,170,189,146,235) -IMAGE_DATA(91,232,58,209,119,85,45,170,27,191,85,155,35,127,227,162,237,19,255,142,54,70,140,245,166,107,116,118,67,140,47,120) -IMAGE_DATA(191,216,251,76,124,207,226,255,213,244,9,155,42,95,35,231,95,61,11,66,254,126,118,249,16,84,123,45,158,175,150,1) -IMAGE_DATA(166,25,159,133,121,84,191,3,116,239,144,239,147,159,43,252,73,242,189,226,119,81,126,194,246,219,230,42,197,53,62,235) -IMAGE_DATA(237,213,54,133,233,16,109,74,109,23,170,223,87,110,83,170,207,66,213,162,106,121,200,99,167,120,191,240,179,11,223,145) -IMAGE_DATA(172,85,68,249,226,239,186,54,165,91,3,43,238,145,203,93,238,47,186,54,101,187,70,245,175,200,105,180,205,55,234,234) -IMAGE_DATA(93,215,111,68,249,139,186,87,219,148,250,14,91,140,133,171,94,101,45,161,62,87,110,139,114,121,200,109,86,46,23,181) -IMAGE_DATA(45,203,186,1,243,40,126,151,159,99,211,235,54,59,39,124,234,182,122,151,235,37,164,92,41,200,122,83,248,140,49,109) -IMAGE_DATA(152,118,185,237,235,210,39,167,95,158,147,80,219,61,162,234,57,217,142,249,216,33,49,239,175,230,95,252,166,206,119,171) -IMAGE_DATA(249,195,122,20,54,91,77,167,238,187,69,237,123,226,25,248,14,252,191,220,126,100,155,38,214,79,200,249,148,235,142,125) -IMAGE_DATA(156,229,141,237,251,175,121,211,166,80,49,179,194,91,115,190,181,113,83,112,122,208,159,217,185,75,23,152,89,81,1,159) -IMAGE_DATA(124,250,57,252,253,139,175,180,224,153,233,170,14,173,169,71,245,154,212,87,143,234,52,103,94,62,78,217,150,235,116,133) -IMAGE_DATA(60,6,201,118,0,251,185,232,227,88,231,186,239,82,121,223,18,213,31,35,255,155,110,140,64,84,91,167,187,70,182,181) -IMAGE_DATA(170,237,80,199,71,245,94,117,206,197,117,141,110,78,214,100,199,101,76,207,87,199,2,93,254,100,13,166,190,223,229,103) -IMAGE_DATA(117,197,15,201,229,171,251,119,145,62,181,238,92,200,207,213,229,73,214,6,114,186,229,223,177,238,116,190,7,185,62,84) -IMAGE_DATA(189,165,142,157,186,113,95,245,225,232,198,27,91,185,200,247,234,124,105,170,79,69,215,166,108,241,215,148,216,95,91,189) -IMAGE_DATA(171,218,73,151,63,91,159,177,197,88,200,62,66,159,122,149,251,186,109,173,159,220,31,212,116,81,226,135,100,189,173,214) -IMAGE_DATA(189,170,89,117,247,203,249,83,243,30,91,174,46,176,173,139,177,211,212,118,229,252,201,207,119,105,53,245,26,53,255,177) -IMAGE_DATA(118,72,238,51,166,239,87,204,159,172,21,109,107,149,40,125,79,103,31,212,239,10,91,251,228,248,161,218,3,101,237,4) -IMAGE_DATA(174,245,28,52,240,1,216,191,255,32,89,119,250,236,13,223,166,205,245,48,102,204,195,176,122,205,90,248,235,223,190,128) -IMAGE_DATA(191,253,29,249,210,200,223,191,248,210,168,69,143,235,81,138,38,165,233,81,117,127,206,65,131,135,230,82,87,242,216,101) -IMAGE_DATA(139,49,17,118,192,180,102,208,102,95,77,54,64,182,97,38,59,41,143,1,20,91,170,218,49,241,59,218,114,157,126,145) -IMAGE_DATA(109,144,233,26,121,188,84,109,173,252,221,109,202,191,124,191,106,235,229,252,153,252,136,166,113,92,237,107,186,58,112,197) -IMAGE_DATA(15,217,52,179,60,70,248,236,57,35,167,215,166,47,116,254,83,249,123,213,166,225,77,254,30,57,63,166,242,148,219,173) -IMAGE_DATA(233,26,249,57,166,186,164,148,169,233,26,185,140,76,223,73,182,254,104,171,119,155,95,94,151,70,155,159,85,174,131,152) -IMAGE_DATA(122,197,231,96,27,114,157,227,39,191,91,189,142,18,63,100,210,235,114,218,169,229,170,182,13,219,124,15,165,92,93,200) -IMAGE_DATA(247,154,158,47,219,107,161,153,212,111,127,211,243,109,182,62,214,14,33,174,182,161,206,185,152,210,105,210,213,114,223,179) -IMAGE_DATA(173,243,177,105,86,142,31,170,189,248,156,255,212,236,138,43,97,64,191,123,225,149,229,43,224,232,209,99,70,205,217,167) -IMAGE_DATA(207,237,53,223,211,168,17,180,110,211,6,30,170,212,151,211,103,204,132,205,91,182,22,206,165,84,65,221,105,130,166,71) -IMAGE_DATA(205,154,212,87,143,98,122,212,253,56,243,138,85,167,126,151,163,143,64,62,143,139,50,246,234,218,130,252,14,217,239,96) -IMAGE_DATA(234,255,190,215,200,191,171,235,175,116,247,250,94,163,218,74,74,76,184,205,167,37,251,53,76,54,212,166,79,108,99,52) -IMAGE_DATA(101,31,58,147,125,151,219,134,111,188,59,245,76,36,113,22,135,248,78,160,124,131,232,222,97,250,221,53,38,81,198,45) -IMAGE_DATA(117,12,151,211,104,26,55,229,58,49,93,99,243,199,137,223,109,49,48,182,122,23,191,219,180,153,237,59,77,214,31,166) -IMAGE_DATA(223,125,234,213,7,155,47,83,252,110,91,43,105,210,235,114,218,109,118,206,166,171,99,203,213,5,69,55,34,152,46,121) -IMAGE_DATA(45,136,92,102,174,111,67,147,205,166,216,33,219,119,142,237,187,26,81,215,188,216,210,104,178,151,46,63,171,64,231,31) -IMAGE_DATA(81,219,1,239,27,87,251,144,191,189,124,65,31,104,155,150,173,160,83,199,155,97,240,160,193,213,140,26,57,10,86,172) -IMAGE_DATA(92,5,175,86,130,251,39,253,241,79,127,41,240,167,63,255,181,154,63,255,229,111,53,208,105,80,170,30,117,105,210,16) -IMAGE_DATA(61,138,113,252,178,230,108,223,161,99,110,245,68,181,115,42,62,118,78,214,1,178,29,54,141,235,186,123,41,215,168,182) -IMAGE_DATA(204,54,174,251,92,99,250,54,166,238,45,108,26,71,77,107,22,168,239,151,243,174,179,161,148,88,20,147,239,66,30,35) -IMAGE_DATA(124,252,53,242,125,190,113,20,178,46,112,141,215,38,223,57,229,27,64,180,121,202,53,106,30,228,186,180,197,124,155,116) -IMAGE_DATA(147,128,226,143,75,17,63,228,251,126,83,25,202,109,53,54,62,70,196,196,219,198,7,181,110,108,115,13,50,186,254,36) -IMAGE_DATA(167,221,101,231,228,242,147,53,127,138,114,181,33,235,57,219,243,117,248,156,81,170,43,223,20,118,200,181,87,191,186,198) -IMAGE_DATA(88,172,165,214,33,231,199,215,71,97,106,3,182,182,205,212,30,212,248,142,20,28,57,242,65,33,14,233,179,223,255,17) -IMAGE_DATA(62,255,25,140,73,42,32,249,68,133,30,253,99,9,234,209,87,87,173,206,61,110,8,145,237,184,239,25,96,20,127,146) -IMAGE_DATA(192,100,19,77,227,186,12,197,22,154,174,161,216,127,202,53,38,191,15,117,109,16,37,126,200,166,47,76,239,151,203,80) -IMAGE_DATA(103,67,41,62,23,211,120,35,210,236,171,47,228,177,199,119,236,180,197,71,152,234,92,214,16,148,111,0,202,62,3,182) -IMAGE_DATA(107,40,243,187,148,107,76,254,56,202,55,144,173,239,80,239,55,189,95,46,67,217,38,196,104,34,241,92,74,188,184,201) -IMAGE_DATA(30,81,207,31,210,165,81,78,187,203,206,153,124,105,177,229,234,66,214,83,62,254,81,159,249,38,185,124,212,120,67,138) -IMAGE_DATA(29,179,249,8,93,223,89,62,243,158,50,178,182,164,248,31,108,223,38,166,182,205,212,46,124,236,12,133,49,149,26,237) -IMAGE_DATA(227,79,63,47,196,2,21,248,236,247,133,253,151,62,69,29,42,160,234,81,201,71,26,166,71,195,230,236,103,204,156,85) -IMAGE_DATA(61,167,94,167,78,221,220,234,70,182,175,190,103,196,137,251,92,250,64,238,231,242,24,28,59,246,11,108,115,58,20,251) -IMAGE_DATA(79,185,198,244,109,236,27,63,164,234,3,234,253,166,247,187,202,135,234,115,81,117,171,60,6,249,174,121,10,93,207,38) -IMAGE_DATA(183,147,44,199,78,219,58,5,129,109,14,81,252,30,242,13,68,185,38,101,252,144,173,12,77,239,55,125,7,197,172,83) -IMAGE_DATA(84,227,58,176,61,99,95,85,181,149,173,47,219,214,18,8,40,241,53,46,59,39,107,39,185,13,249,150,107,204,55,188) -IMAGE_DATA(207,125,174,53,150,166,242,145,203,55,214,14,201,233,55,233,65,117,159,6,42,186,178,165,236,235,166,107,167,212,111,124) -IMAGE_DATA(166,188,161,236,229,230,3,206,187,227,94,159,199,62,254,180,192,71,200,39,159,21,246,254,44,160,211,163,63,239,9,154) -IMAGE_DATA(86,143,218,53,169,73,143,226,59,242,142,83,23,196,140,35,84,125,32,219,0,147,223,36,100,236,215,61,223,100,163,108) -IMAGE_DATA(246,63,230,26,155,255,81,151,7,117,76,160,220,111,251,54,119,105,44,170,207,69,29,239,228,125,96,98,218,148,143,94) -IMAGE_DATA(165,198,120,32,166,117,29,148,119,251,94,35,235,27,202,252,174,107,93,155,154,87,245,26,219,90,52,93,155,87,235,157) -IMAGE_DATA(114,246,160,237,253,38,127,94,140,173,144,235,203,214,166,108,125,153,226,227,50,249,218,124,210,46,175,107,244,237,75,212) -IMAGE_DATA(249,119,29,161,154,147,18,51,39,48,173,199,165,172,113,116,249,8,93,122,144,218,183,77,80,215,86,216,214,190,80,125) -IMAGE_DATA(213,76,249,67,217,227,214,135,209,15,142,134,163,31,126,84,197,177,143,225,67,193,71,159,20,206,58,82,245,232,71,1) -IMAGE_DATA(122,244,115,161,71,165,189,68,83,232,209,183,183,239,204,125,13,167,128,106,139,197,222,150,114,95,167,218,16,83,60,9) -IMAGE_DATA(197,111,65,185,38,85,252,16,101,189,163,122,13,101,156,176,197,46,80,214,22,217,222,239,210,79,20,61,141,200,62,28) -IMAGE_DATA(97,151,125,247,127,247,105,83,34,30,94,236,231,170,230,211,213,166,76,241,14,148,177,147,114,141,105,141,44,101,126,55) -IMAGE_DATA(246,26,74,25,216,98,251,99,181,157,201,159,23,90,175,62,107,41,109,235,18,41,235,112,76,107,26,168,118,142,18,63) -IMAGE_DATA(100,235,75,182,120,60,23,20,91,34,210,39,206,16,83,223,105,211,98,182,152,245,88,59,68,209,131,226,223,93,241,67) -IMAGE_DATA(216,94,116,122,144,226,127,144,203,81,215,214,66,215,218,50,229,137,220,102,99,65,95,231,222,253,7,225,200,7,31,194) -IMAGE_DATA(251,200,209,99,5,48,54,231,131,74,29,250,129,77,143,254,172,73,169,122,244,83,162,30,253,3,81,143,86,204,158,11) -IMAGE_DATA(247,244,31,144,123,125,32,148,56,64,217,166,201,182,70,183,119,179,237,249,170,173,78,29,63,164,94,67,177,255,177,49) -IMAGE_DATA(70,114,155,116,229,95,213,205,212,181,69,148,248,98,87,252,144,203,231,162,238,205,231,26,191,168,207,50,205,111,155,98) -IMAGE_DATA(1,40,227,146,109,143,65,202,216,25,19,99,148,42,126,136,18,155,77,217,135,73,173,119,106,157,219,222,111,242,231,81) -IMAGE_DATA(230,167,117,223,64,212,185,95,249,94,181,254,169,177,122,38,189,72,209,101,234,222,152,166,61,162,178,136,31,66,40,123) -IMAGE_DATA(61,232,246,91,160,238,95,101,218,59,36,133,29,162,172,87,145,231,58,109,223,178,166,239,61,138,255,1,177,125,155,80) -IMAGE_DATA(230,16,152,218,133,235,172,42,31,6,84,234,182,119,143,124,80,224,189,247,143,86,115,4,169,212,161,20,61,122,212,166) -IMAGE_DATA(71,229,57,123,151,30,173,132,162,71,241,249,35,70,62,152,123,61,8,228,111,95,221,222,148,242,121,49,106,63,149,237) -IMAGE_DATA(171,206,142,203,117,173,219,187,151,226,183,240,137,49,82,175,73,21,63,68,137,239,213,141,69,106,252,156,45,190,216,182) -IMAGE_DATA(182,200,55,190,88,247,124,202,249,204,106,90,67,207,129,147,253,17,58,237,104,251,14,113,237,127,40,151,169,45,246,197) -IMAGE_DATA(166,43,98,174,137,217,67,129,122,141,172,39,213,122,83,191,13,212,50,160,248,88,169,239,183,173,227,240,169,87,211,218) -IMAGE_DATA(91,91,190,108,107,76,67,214,52,184,246,117,84,215,127,169,109,143,234,191,164,212,189,9,249,29,58,237,40,219,1,57) -IMAGE_DATA(125,234,217,147,186,51,165,228,123,109,245,26,106,135,40,154,83,61,131,74,215,239,212,249,22,223,190,231,90,223,206,154) -IMAGE_DATA(243,228,36,165,238,92,246,242,43,112,248,221,35,240,206,123,239,87,243,46,242,179,22,45,150,30,253,152,168,71,167,78) -IMAGE_DATA(155,145,123,249,171,200,223,191,216,159,197,222,122,242,156,176,78,51,170,58,5,159,131,117,139,182,66,126,166,238,188,137) -IMAGE_DATA(84,241,67,177,241,197,177,49,70,234,89,222,120,13,166,67,220,131,121,23,127,206,50,190,88,87,62,242,56,139,207,16) -IMAGE_DATA(231,94,186,246,206,115,141,61,20,100,45,142,239,22,109,74,110,23,186,54,165,218,6,44,95,76,183,218,166,92,237,145) -IMAGE_DATA(178,78,130,18,99,164,94,147,245,62,11,114,125,203,227,51,234,4,249,140,82,249,60,121,249,94,138,143,213,246,126,87) -IMAGE_DATA(25,202,105,163,214,171,124,174,128,200,143,136,15,145,207,44,183,125,195,202,109,93,204,219,139,251,133,79,208,165,183,85) -IMAGE_DATA(155,132,239,192,250,197,50,147,211,167,243,245,197,198,101,81,80,247,22,196,114,18,229,43,247,39,221,179,229,122,199,103) -IMAGE_DATA(224,223,177,12,40,247,82,247,19,181,217,65,245,123,68,216,26,117,239,53,57,127,242,88,163,214,129,46,157,148,190,231) -IMAGE_DATA(154,127,87,207,130,192,107,68,91,242,173,47,166,188,72,165,59,155,93,217,20,118,238,218,3,135,222,121,175,154,195,72) -IMAGE_DATA(165,14,21,100,173,71,63,180,233,81,201,71,58,105,242,148,220,203,93,135,43,198,11,251,169,201,231,229,170,71,180,15) -IMAGE_DATA(174,179,11,77,99,127,108,140,145,207,216,31,26,99,100,219,131,22,203,84,254,247,216,248,98,223,248,33,196,84,175,182) -IMAGE_DATA(247,132,248,104,84,92,235,183,77,237,66,45,23,29,88,14,186,123,41,99,103,76,140,145,239,30,10,161,49,70,88,175) -IMAGE_DATA(166,178,195,190,168,59,135,70,64,249,206,178,189,223,245,29,20,90,175,46,59,129,117,234,218,15,214,180,215,142,120,159) -IMAGE_DATA(75,111,187,236,156,206,175,156,170,92,169,184,202,201,230,155,119,229,205,116,111,138,120,124,245,187,66,160,59,79,193,214) -IMAGE_DATA(126,76,117,64,233,123,106,223,117,217,8,25,142,97,63,57,144,231,109,99,104,119,67,91,216,119,224,16,236,63,120,24) -IMAGE_DATA(14,28,122,7,14,30,126,183,26,89,139,186,244,232,59,170,30,149,52,105,172,30,157,48,113,82,238,229,109,3,251,167) -IMAGE_DATA(240,37,9,132,143,201,117,47,142,15,120,173,124,47,218,37,219,55,179,248,6,150,207,210,176,93,99,59,159,71,119,13) -IMAGE_DATA(254,89,252,110,210,171,248,222,84,215,136,61,174,17,28,119,213,88,106,93,62,197,57,128,54,123,103,123,63,165,12,177) -IMAGE_DATA(28,228,180,137,186,209,189,199,54,222,135,182,41,225,3,147,219,20,229,249,120,13,150,163,124,175,45,159,106,121,196,92) -IMAGE_DATA(131,109,94,119,141,92,23,166,116,164,188,70,238,83,88,22,242,57,135,166,251,197,239,212,54,165,222,79,41,159,208,122) -IMAGE_DATA(117,217,9,87,185,232,222,43,251,188,68,127,114,165,93,181,115,162,191,186,206,227,140,41,87,31,212,186,23,229,68,121) -IMAGE_DATA(38,166,79,237,55,152,95,91,222,98,237,144,43,221,186,235,84,155,228,170,3,106,217,82,218,0,94,35,191,27,225,24) -IMAGE_DATA(246,147,7,172,107,217,247,31,74,175,158,189,96,219,142,93,176,99,215,30,216,185,123,47,236,218,179,15,118,239,221,15) -IMAGE_DATA(123,247,29,12,215,163,170,143,52,80,143,246,236,213,43,247,114,102,24,27,98,29,5,175,115,98,24,134,97,106,51,248) -IMAGE_DATA(109,19,122,70,129,76,207,238,61,224,173,77,91,96,227,230,173,176,105,203,219,176,101,235,118,216,186,109,71,97,111,162) -IMAGE_DATA(130,30,221,121,162,30,221,179,239,0,89,143,30,10,208,163,248,142,22,45,91,230,94,190,12,99,67,158,207,139,241,207) -IMAGE_DATA(48,12,195,48,76,185,144,226,156,204,110,93,187,193,218,215,215,195,235,111,108,128,117,235,223,132,55,54,188,5,235,223) -IMAGE_DATA(220,8,111,190,181,217,170,71,183,239,220,13,59,119,157,168,71,113,47,38,173,30,213,249,72,21,61,58,109,198,76,248) -IMAGE_DATA(53,175,17,97,74,16,177,110,30,231,106,93,123,15,48,12,195,48,76,109,5,231,218,99,125,158,93,59,119,129,87,94) -IMAGE_DATA(93,5,43,86,190,6,43,87,173,129,85,175,173,133,215,214,188,14,171,215,174,171,210,163,235,236,122,116,243,214,109,176) -IMAGE_DATA(245,237,19,245,40,206,217,215,208,163,7,106,234,209,237,149,215,183,111,223,33,247,114,100,24,19,186,24,157,144,56,91) -IMAGE_DATA(134,97,24,134,169,13,184,226,219,92,92,211,172,57,76,159,49,11,150,44,125,25,150,46,91,14,47,189,252,10,188,188) -IMAGE_DATA(252,85,88,254,202,202,106,61,250,234,170,213,39,232,209,53,175,191,81,165,71,223,56,174,71,55,188,181,9,222,218,120) -IMAGE_DATA(162,30,221,242,246,246,154,122,116,247,62,24,245,224,104,168,87,175,94,238,101,199,48,54,112,253,190,216,111,71,236,111) -IMAGE_DATA(149,119,154,24,134,97,24,38,79,68,156,98,168,246,188,236,226,75,96,196,136,81,48,111,254,34,152,191,96,49,44,88) -IMAGE_DATA(248,34,44,92,188,4,22,189,184,20,94,92,178,76,175,71,87,40,122,116,245,113,61,186,118,221,250,26,122,244,205,141) -IMAGE_DATA(155,97,204,195,143,194,249,231,159,159,123,121,49,12,195,48,12,195,48,225,8,237,25,26,223,222,166,85,107,120,238,249) -IMAGE_DATA(241,48,163,98,54,84,204,154,11,179,102,207,131,217,115,230,195,156,121,11,96,238,252,133,199,245,232,34,69,143,190,84) -IMAGE_DATA(165,71,151,45,95,81,67,143,174,124,109,13,12,175,212,179,231,157,199,115,146,12,195,48,12,195,48,181,13,177,255,88) -IMAGE_DATA(136,246,188,177,109,91,24,59,246,25,152,52,121,26,76,158,58,29,166,78,155,9,211,166,87,20,230,224,103,204,156,13) -IMAGE_DATA(51,103,205,57,174,71,231,234,245,232,228,41,211,224,150,78,157,161,110,221,186,185,151,5,195,48,12,195,48,12,147,45) -IMAGE_DATA(184,167,11,198,185,135,232,207,54,215,181,134,97,195,70,194,243,227,38,192,184,241,19,97,252,132,73,48,97,226,20,152) -IMAGE_DATA(56,105,106,149,30,157,50,29,166,76,155,81,173,71,31,121,244,113,184,173,119,31,104,152,224,124,22,134,97,24,134,97) -IMAGE_DATA(24,166,124,17,231,103,96,76,4,117,14,254,242,75,155,64,199,14,29,97,232,208,225,240,204,179,227,170,185,239,254,7) -IMAGE_DATA(160,107,215,110,112,205,53,215,194,89,103,241,254,49,12,195,48,12,195,48,140,25,244,133,34,117,78,59,173,160,73,117) -IMAGE_DATA(224,191,213,59,189,30,92,116,209,111,225,180,202,63,231,157,102,134,97,24,134,97,24,134,97,24,134,97,24,134,97,24) -IMAGE_DATA(134,97,24,134,97,24,134,97,24,134,97,24,134,97,24,134,97,24,134,97,24,134,97,24,134,97,24,134,97,24,134,97) -IMAGE_DATA(24,134,97,24,134,97,24,134,97,24,134,97,24,38,13,255,31,117,188,53,144,0,0,0,0,0,0,0,0,0,0,0) -IMAGE_END_DATA(13984, 3) - -IMAGE_BEGIN_DATA -IMAGE_DATA(120,156,237,157,119,119,212,214,214,198,243,77,222,119,173,123,111,238,77,15,4,72,131,36,4,66,75,8,189,247,26,170) -IMAGE_DATA(177,233,161,25,131,1,27,119,99,27,108,220,176,113,239,189,99,27,99,27,108,146,128,233,132,132,114,223,255,243,13,206) -IMAGE_DATA(126,245,104,56,246,177,70,154,145,52,210,204,152,232,89,107,175,21,28,141,70,35,253,180,247,217,103,159,242,86,241,91) -IMAGE_DATA(91,222,226,34,71,142,28,57,114,228,200,145,35,71,142,28,57,114,228,200,145,35,71,142,28,57,114,228,200,145,35,133) -IMAGE_DATA(110,220,184,33,91,105,89,25,37,39,95,96,90,198,143,251,235,175,191,2,125,201,142,222,80,129,47,176,182,123,119,8) -IMAGE_DATA(91,187,118,61,91,178,116,57,153,53,156,35,42,42,138,21,23,23,211,253,251,15,2,253,211,28,141,65,189,120,241,130) -IMAGE_DATA(114,114,114,232,192,129,131,62,177,40,218,178,229,43,216,246,29,187,216,254,131,135,217,217,168,24,138,58,31,71,73,23) -IMAGE_DATA(210,232,124,108,60,75,79,207,96,247,238,221,11,244,207,118,20,228,66,172,182,146,201,53,107,214,177,253,7,14,179,180) -IMAGE_DATA(75,25,148,119,181,144,114,174,228,83,102,118,46,165,95,206,162,212,139,25,148,156,114,145,18,146,82,40,38,46,145,206) -IMAGE_DATA(69,199,80,196,169,72,86,84,84,228,180,5,28,13,11,44,32,118,251,26,183,69,251,105,219,14,6,223,88,86,81,69) -IMAGE_DATA(197,165,21,84,88,92,74,249,5,69,148,155,119,149,178,114,174,80,70,102,54,93,76,191,76,23,82,47,81,98,114,42) -IMAGE_DATA(197,37,36,203,254,52,242,108,20,157,140,136,164,163,199,195,41,38,54,142,193,143,59,250,123,138,115,185,124,249,74,203) -IMAGE_DATA(184,220,182,125,39,187,156,149,67,53,117,13,84,89,93,71,229,149,213,84,82,86,73,69,37,101,116,181,176,152,174,228) -IMAGE_DATA(23,80,118,110,62,93,206,202,165,75,25,153,146,15,77,151,99,124,124,226,5,41,206,39,208,217,115,231,41,226,244,89) -IMAGE_DATA(58,126,34,130,14,31,57,70,146,239,165,168,232,243,14,167,127,51,33,142,91,201,229,242,21,171,88,92,66,34,107,108) -IMAGE_DATA(110,165,250,198,102,170,173,111,164,170,154,122,170,168,170,161,210,114,248,208,114,42,40,42,121,29,227,175,74,49,254,138) -IMAGE_DATA(20,227,179,9,113,159,199,248,216,248,36,41,198,199,210,233,200,115,116,226,228,105,58,114,244,4,29,60,244,51,133,237) -IMAGE_DATA(61,64,187,67,66,41,46,62,158,57,113,255,205,214,221,161,33,57,127,182,138,75,88,104,232,94,214,208,212,66,45,109) -IMAGE_DATA(29,212,212,210,70,248,239,218,250,38,170,174,173,151,124,104,173,20,227,225,67,121,140,47,150,98,124,129,20,227,243,164) -IMAGE_DATA(24,159,35,197,248,76,74,73,27,137,241,209,49,241,82,140,143,166,147,167,34,233,216,241,147,116,232,231,163,180,111,255) -IMAGE_DATA(65,10,217,179,151,118,236,220,77,155,55,111,101,77,77,205,129,190,141,142,108,16,242,113,43,185,132,33,247,238,232,236) -IMAGE_DATA(166,182,142,78,137,207,107,18,159,237,18,159,173,84,215,208,44,199,248,170,26,101,140,47,145,98,124,161,16,227,121,158) -IMAGE_DATA(36,196,120,41,183,63,133,24,31,30,65,63,31,57,78,82,190,79,161,97,251,104,231,238,61,180,117,235,54,146,218,201) -IMAGE_DATA(114,14,231,248,210,55,67,120,142,86,251,204,229,43,86,178,75,25,151,89,103,119,15,129,207,246,107,93,212,218,126,141) -IMAGE_DATA(154,91,219,201,115,140,47,149,98,124,145,34,198,187,242,36,30,227,163,16,227,207,68,81,56,98,252,49,196,248,35,20) -IMAGE_DATA(182,207,21,227,165,246,45,109,216,176,137,86,172,88,69,139,23,45,97,119,239,222,13,244,237,117,228,131,16,207,173,204) -IMAGE_DATA(203,57,155,240,137,93,215,111,16,248,188,214,117,93,230,211,229,67,71,98,124,93,3,98,124,131,34,198,151,105,196,120) -IMAGE_DATA(87,158,196,99,252,153,115,136,241,103,228,24,127,88,142,241,135,104,79,168,43,198,111,218,188,149,86,175,94,11,62,233) -IMAGE_DATA(135,239,231,18,250,249,223,36,61,127,254,156,242,243,243,233,208,193,67,108,254,143,243,220,108,199,182,237,236,76,228,25) -IMAGE_DATA(214,221,213,237,247,107,187,243,219,29,194,247,226,251,125,61,87,83,83,147,165,57,144,146,77,145,79,30,227,69,31,58) -IMAGE_DATA(58,198,195,135,34,198,151,123,136,241,23,229,24,143,190,80,57,198,71,158,165,19,225,167,232,231,163,199,233,128,28,227) -IMAGE_DATA(247,211,46,196,248,159,182,211,218,117,27,104,153,116,61,243,126,156,79,51,103,204,164,3,251,15,248,124,191,2,41,196) -IMAGE_DATA(56,60,243,79,39,76,100,255,248,159,255,37,189,246,222,127,222,145,121,5,211,118,8,231,77,77,73,37,188,23,202,239) -IMAGE_DATA(246,69,200,207,173,110,107,194,16,211,57,155,34,163,163,99,124,135,196,103,155,20,227,91,228,24,143,60,169,162,170,246) -IMAGE_DATA(117,95,232,72,140,231,125,161,98,140,71,158,36,199,120,244,133,34,198,71,156,166,163,199,194,233,224,225,35,180,87,138) -IMAGE_DATA(241,33,123,194,104,251,142,93,180,97,227,102,57,198,47,92,176,136,230,204,158,67,223,78,253,150,246,237,219,55,230,24) -IMAGE_DATA(5,151,240,147,70,152,212,50,156,199,170,54,57,124,164,26,147,86,240,105,23,155,49,113,9,110,108,234,137,241,174,190) -IMAGE_DATA(208,218,215,121,210,72,140,119,245,133,230,17,250,75,197,24,239,202,147,16,227,207,83,4,98,252,9,196,120,244,133,186) -IMAGE_DATA(98,252,206,93,33,180,121,203,79,180,122,205,90,90,178,120,41,205,253,97,46,125,55,237,59,154,242,229,100,10,11,11) -IMAGE_DATA(27,51,140,214,214,212,202,254,207,10,54,185,193,255,34,6,155,21,62,235,141,75,95,248,180,139,77,41,127,86,101,211) -IMAGE_DATA(61,198,187,231,73,53,117,141,114,140,119,229,73,174,24,63,210,23,234,185,222,121,74,238,11,61,37,247,133,30,56,136) -IMAGE_DATA(190,80,87,140,255,105,219,14,90,183,94,138,241,203,86,208,252,121,243,105,214,204,89,244,205,87,223,208,103,147,62,165) -IMAGE_DATA(61,33,123,130,158,81,171,124,166,86,204,71,251,213,168,16,199,141,124,143,81,97,140,145,29,108,162,239,29,62,81,139) -IMAGE_DATA(207,145,24,127,125,56,198,115,31,234,138,241,77,138,24,111,164,222,25,61,92,239,60,116,248,40,237,149,251,66,93,49) -IMAGE_DATA(126,227,166,205,180,114,229,106,90,184,112,49,125,63,231,123,154,54,117,26,125,249,249,23,244,201,184,241,180,123,215,174) -IMAGE_DATA(160,101,20,237,69,187,216,20,205,136,31,53,115,77,70,132,60,221,234,92,136,91,210,133,84,77,223,169,149,39,169,199) -IMAGE_DATA(120,107,234,157,123,208,23,42,197,248,45,91,183,97,252,9,45,89,178,140,230,206,253,145,102,76,159,65,95,77,158,66) -IMAGE_DATA(147,38,76,164,15,223,123,159,210,210,210,12,146,99,191,252,197,38,247,163,122,218,163,107,86,173,54,117,77,122,133,107) -IMAGE_DATA(216,178,117,171,105,54,165,118,28,91,191,97,35,91,179,118,157,219,57,214,172,93,239,149,77,37,159,250,251,66,213,234) -IMAGE_DATA(157,151,221,235,157,103,212,235,157,232,11,93,191,126,35,222,75,154,63,127,129,20,227,103,211,212,175,191,161,207,63,253) -IMAGE_DATA(140,198,125,248,17,158,15,117,119,251,191,15,70,75,136,185,254,98,147,27,222,7,79,215,228,203,251,162,87,122,198,195) -IMAGE_DATA(45,93,186,156,173,90,181,134,173,92,185,10,227,65,164,182,219,70,185,159,6,113,18,207,26,245,25,228,31,168,39,30) -IMAGE_DATA(61,118,66,238,211,193,191,147,146,47,176,146,178,50,67,140,170,229,73,118,213,59,55,109,218,66,210,239,162,69,139,16) -IMAGE_DATA(227,127,160,105,223,78,163,201,95,124,73,19,198,125,66,239,191,243,46,141,255,232,99,246,242,229,75,31,201,242,93,232) -IMAGE_DATA(167,177,58,23,210,107,90,125,79,70,219,155,162,33,15,211,243,187,61,215,44,151,177,5,11,22,178,25,51,102,210,156) -IMAGE_DATA(217,223,203,125,49,232,147,89,191,97,147,71,54,145,143,156,58,125,6,253,143,163,174,97,112,112,144,74,75,203,152,196) -IMAGE_DATA(153,199,60,222,95,245,206,93,66,189,115,233,210,101,244,227,220,121,52,227,187,153,244,245,148,175,164,251,55,137,62,122) -IMAGE_DATA(255,3,217,135,30,57,122,44,224,109,81,189,57,177,29,134,92,76,121,61,104,155,154,57,23,222,49,244,59,232,17,198) -IMAGE_DATA(156,169,181,57,23,47,94,202,164,92,129,193,143,192,159,152,97,19,245,155,218,90,237,235,120,245,234,21,213,213,213,83) -IMAGE_DATA(121,69,21,83,50,106,121,189,243,188,123,189,115,175,74,189,115,193,252,133,52,123,214,28,154,250,205,84,41,198,127,14) -IMAGE_DATA(223,41,243,25,18,18,198,138,139,75,204,195,229,163,208,151,232,11,91,188,13,201,251,240,141,158,99,218,212,111,221,248) -IMAGE_DATA(52,243,190,128,77,35,57,151,74,77,157,125,58,113,18,77,28,255,9,249,202,166,100,186,125,206,131,7,15,100,191,42) -IMAGE_DATA(113,200,108,175,119,158,112,175,119,110,86,212,59,167,79,155,46,253,254,201,242,125,248,224,221,247,228,119,24,177,32,80) -IMAGE_DATA(113,222,172,239,212,170,33,154,97,84,148,217,247,197,72,159,21,106,151,195,254,114,201,50,54,101,242,87,12,207,194,10) -IMAGE_DATA(54,163,99,226,40,61,35,195,112,76,196,251,221,210,218,10,254,152,90,189,211,213,23,106,97,189,115,175,118,189,243,235) -IMAGE_DATA(41,95,19,222,213,143,63,248,144,190,149,252,41,250,250,147,146,46,248,61,206,155,141,163,158,218,119,184,207,70,207,39) -IMAGE_DATA(230,241,102,222,23,189,237,77,46,62,230,99,209,162,37,236,253,119,222,35,43,217,140,141,79,36,95,125,205,192,192,32) -IMAGE_DATA(21,21,151,48,127,214,59,165,220,111,84,189,243,139,207,164,24,255,241,56,57,151,7,159,176,254,254,126,159,126,151,81) -IMAGE_DATA(153,237,135,247,230,171,16,179,141,156,143,143,37,65,174,100,230,122,144,75,233,21,175,17,73,249,42,123,251,31,255,180) -IMAGE_DATA(156,205,248,132,68,203,252,204,192,192,0,21,20,22,51,111,245,206,145,190,80,139,234,157,211,93,245,206,137,159,76,160) -IMAGE_DATA(15,222,123,127,152,207,168,232,24,191,250,80,163,227,61,212,252,157,154,180,124,32,31,227,132,247,2,237,0,228,50,96) -IMAGE_DATA(147,159,207,108,206,206,199,76,137,166,117,109,43,87,174,102,146,111,176,133,205,196,228,20,57,239,177,90,224,84,242,149) -IMAGE_DATA(204,210,122,231,33,125,245,206,143,5,255,233,79,31,106,54,182,171,229,51,74,193,191,130,53,176,103,100,156,157,149,253) -IMAGE_DATA(8,106,74,78,78,38,59,217,188,144,122,209,214,185,189,53,210,251,44,49,201,172,174,119,34,79,218,184,105,139,102,189) -IMAGE_DATA(83,226,153,249,219,135,154,237,143,183,98,108,165,150,172,98,83,139,79,196,11,59,217,76,73,77,179,253,217,129,255,43) -IMAGE_DATA(121,249,204,123,189,51,75,87,189,51,84,71,189,19,125,160,162,15,245,71,46,111,182,237,169,183,127,209,168,204,182,61) -IMAGE_DATA(245,242,9,63,110,39,155,240,87,245,245,13,182,220,27,53,117,118,117,33,174,179,209,245,78,247,190,80,43,234,157,39) -IMAGE_DATA(79,157,25,197,167,63,114,121,179,177,212,174,177,198,190,244,195,234,225,115,231,142,29,150,246,33,41,217,68,76,245,247) -IMAGE_DATA(156,51,124,95,118,78,46,179,187,222,41,178,9,83,214,198,236,144,89,62,237,146,221,124,78,24,55,158,217,201,102,106) -IMAGE_DATA(218,197,128,213,1,43,171,170,109,173,119,42,249,132,181,181,183,219,250,155,204,240,169,39,55,50,43,59,249,172,171,171) -IMAGE_DATA(179,213,111,34,39,201,201,189,18,208,58,53,214,178,203,204,202,97,190,212,59,183,171,212,59,193,169,26,159,118,199,120) -IMAGE_DATA(51,124,226,51,118,93,143,89,62,213,250,150,148,57,92,88,104,152,207,245,116,143,108,94,201,167,91,183,110,217,117,107) -IMAGE_DATA(116,11,241,62,61,35,147,89,82,239,92,236,170,119,162,61,170,198,167,221,49,222,46,62,193,25,250,150,140,206,227,48) -IMAGE_DATA(203,167,158,54,223,156,89,179,153,157,108,34,111,14,166,245,14,50,179,178,153,85,245,206,144,61,161,76,141,79,152,157) -IMAGE_DATA(107,58,154,25,91,169,135,79,145,123,140,217,192,248,98,61,188,154,237,143,245,38,228,115,118,179,9,159,165,255,206,251) -IMAGE_DATA(71,104,111,88,81,239,148,238,135,38,159,217,57,57,182,253,110,51,227,56,188,241,224,205,7,122,227,213,204,245,120,235) -IMAGE_DATA(79,192,250,3,118,178,137,126,113,59,159,147,47,106,104,104,208,81,239,140,208,172,119,46,95,182,66,149,75,110,49,113) -IMAGE_DATA(241,65,215,222,211,170,117,35,190,25,173,151,42,25,53,211,230,240,86,47,136,140,140,100,118,178,89,88,84,66,69,69) -IMAGE_DATA(197,65,201,39,84,47,49,170,94,239,140,213,168,119,134,14,215,59,209,103,239,137,79,187,219,160,102,198,204,171,141,1) -IMAGE_DATA(6,235,70,199,132,168,181,21,204,212,223,189,141,251,220,177,99,39,179,147,77,244,141,7,67,110,228,73,168,27,152,169) -IMAGE_DATA(119,74,177,95,51,182,115,179,179,221,237,203,252,30,248,74,48,102,118,140,137,90,93,222,151,26,18,234,97,106,156,98) -IMAGE_DATA(222,144,157,108,98,140,70,48,204,209,241,166,250,250,122,67,245,78,248,80,111,108,218,61,94,196,234,154,162,47,190,147) -IMAGE_DATA(203,170,57,164,92,118,179,137,26,248,88,17,242,122,189,245,206,131,135,142,120,245,157,176,26,155,234,221,92,254,156,83) -IMAGE_DATA(204,205,83,60,182,234,157,129,134,134,134,108,103,51,247,74,126,208,182,61,213,116,241,82,58,243,86,239,220,19,182,31) -IMAGE_DATA(126,85,23,159,118,231,134,104,63,248,115,238,166,158,241,79,102,251,22,148,124,246,246,246,218,202,38,198,9,231,230,229) -IMAGE_DATA(141,41,62,161,248,248,68,230,169,222,249,243,209,227,186,216,244,7,159,144,217,190,71,163,230,109,190,187,40,95,253,58) -IMAGE_DATA(4,62,237,100,19,227,48,243,242,198,150,255,132,224,147,36,54,153,90,189,19,121,146,148,215,235,230,211,206,62,38,81) -IMAGE_DATA(118,175,207,96,132,77,8,247,208,151,241,202,80,111,111,159,173,108,214,213,55,202,115,47,109,121,32,54,235,254,253,251) -IMAGE_DATA(170,245,206,240,136,211,186,217,244,247,156,15,228,212,118,196,122,95,198,52,155,245,163,80,95,95,159,173,108,54,52,54) -IMAGE_DATA(83,89,217,216,228,19,146,222,45,101,189,211,16,155,254,230,19,66,126,98,213,60,11,156,199,151,245,20,185,208,223,106) -IMAGE_DATA(180,31,11,2,159,118,178,217,212,220,42,241,89,62,102,249,132,18,18,147,25,175,119,158,210,153,19,5,146,79,46,61) -IMAGE_DATA(107,192,106,25,106,152,118,172,239,141,54,136,94,78,33,240,105,39,155,45,173,237,84,94,62,182,249,68,59,74,242,159) -IMAGE_DATA(204,72,155,51,24,248,228,226,107,104,131,57,173,26,17,254,142,56,12,126,236,26,95,47,10,62,153,95,147,22,175,16) -IMAGE_DATA(248,180,147,205,182,246,107,18,159,21,99,154,79,40,63,191,192,20,155,254,204,143,222,4,129,91,177,61,209,215,223,111) -IMAGE_DATA(43,155,29,215,186,168,162,98,108,243,217,216,216,200,94,253,247,255,80,159,55,197,104,176,142,141,25,11,194,248,68,59) -IMAGE_DATA(217,236,236,186,46,241,89,57,102,159,15,103,19,246,240,209,19,83,254,211,225,211,55,217,201,38,214,156,171,168,28,155) -IMAGE_DATA(124,138,108,114,147,238,139,97,31,106,119,125,243,77,87,212,249,88,102,23,155,215,123,122,169,178,178,106,76,241,137,124) -IMAGE_DATA(168,185,185,197,141,77,179,62,212,223,107,50,189,105,194,122,72,118,177,121,163,183,159,42,171,198,14,159,96,243,122,207) -IMAGE_DATA(13,246,242,213,127,73,205,192,104,66,82,138,33,31,26,76,243,90,198,162,50,51,179,152,93,108,246,245,223,162,170,49) -IMAGE_DATA(194,231,195,135,15,233,214,192,32,123,241,242,21,169,155,139,209,198,166,22,221,124,250,99,30,252,155,46,140,123,180,139) -IMAGE_DATA(205,254,155,3,84,62,6,242,35,236,157,115,119,232,30,123,254,226,37,169,219,8,167,79,127,127,54,102,250,62,223,4) -IMAGE_DATA(97,236,176,93,108,222,26,184,77,85,213,53,65,253,140,234,234,234,217,159,207,95,144,182,185,243,26,159,144,20,20,99) -IMAGE_DATA(235,254,46,58,125,250,12,179,131,205,129,193,95,168,185,165,45,40,159,17,214,184,111,105,109,99,207,254,120,78,127,252) -IMAGE_DATA(169,101,47,100,83,50,155,127,181,80,23,159,78,110,100,141,214,173,89,203,98,98,227,45,103,147,91,176,9,241,252,215) -IMAGE_DATA(223,238,176,223,159,253,73,207,254,208,178,231,164,197,46,126,163,211,246,244,159,48,190,228,157,127,189,205,114,165,24,111) -IMAGE_DATA(53,155,48,248,170,96,16,174,163,190,161,145,61,253,253,15,226,246,251,51,53,251,147,60,177,251,232,241,83,175,124,6) -IMAGE_DATA(98,61,250,55,89,24,55,248,229,103,159,51,196,120,43,217,132,97,111,163,64,171,185,185,153,126,249,229,87,246,228,233) -IMAGE_DATA(51,226,134,92,199,221,244,177,27,121,54,218,99,140,183,123,125,176,191,155,248,56,210,201,159,127,193,176,214,155,85,108) -IMAGE_DATA(194,170,170,171,3,230,75,110,223,190,77,237,29,29,236,241,147,167,244,248,201,239,195,246,228,169,154,233,103,55,54,62) -IMAGE_DATA(81,147,79,39,182,91,47,113,61,138,41,18,163,229,21,149,150,176,9,11,68,13,30,177,188,169,169,137,61,122,252,132) -IMAGE_DATA(92,246,116,148,185,120,21,205,24,187,158,248,116,98,187,61,18,199,226,77,249,98,50,203,202,202,241,153,77,127,231,240) -IMAGE_DATA(224,178,166,166,134,61,124,244,152,70,236,201,40,27,97,214,56,187,156,223,216,248,4,77,62,131,101,190,63,124,142,153) -IMAGE_DATA(241,239,168,121,225,179,190,140,5,229,231,240,245,24,81,202,57,86,239,190,253,111,118,238,108,20,243,133,77,110,118,215) -IMAGE_DATA(249,16,199,235,27,154,216,253,7,143,232,193,67,110,143,221,108,52,183,230,217,213,226,51,208,125,242,120,134,202,113,200) -IMAGE_DATA(200,45,196,189,12,213,196,247,55,84,142,23,198,103,241,119,173,207,98,156,49,223,115,6,255,86,155,203,161,220,163,83) -IMAGE_DATA(109,28,61,218,151,122,24,81,27,207,140,239,151,124,160,105,54,97,215,175,247,24,186,207,122,132,223,211,222,222,1,223) -IMAGE_DATA(206,238,221,127,72,176,251,15,68,123,228,102,35,236,186,243,107,132,221,216,56,117,62,3,213,231,169,103,190,164,214,250) -IMAGE_DATA(201,96,202,219,188,58,173,207,242,239,4,95,158,230,194,241,57,118,158,142,193,120,122,111,191,83,107,158,234,59,146,47) -IMAGE_DATA(61,125,42,146,153,97,211,234,54,104,79,79,15,85,75,57,215,208,189,7,36,218,189,251,220,30,170,154,47,236,42,249) -IMAGE_DATA(141,81,225,51,80,190,19,108,138,62,19,207,153,199,117,229,218,95,202,189,227,196,231,13,70,241,111,238,199,148,220,170) -IMAGE_DATA(205,227,20,63,203,57,229,237,2,113,189,48,248,61,206,166,214,49,48,179,62,148,219,196,113,227,217,217,51,103,153,81) -IMAGE_DATA(62,107,235,26,76,63,59,92,51,152,68,63,64,111,223,77,118,119,232,62,169,217,208,189,251,164,100,214,157,93,117,126) -IMAGE_DATA(141,178,171,198,103,160,124,167,184,215,140,26,67,226,158,154,226,60,118,113,223,120,60,115,181,246,166,184,246,131,114,159) -IMAGE_DATA(76,229,186,16,106,251,38,42,125,186,218,49,162,79,213,211,30,197,123,227,109,126,29,218,166,91,55,111,97,13,13,77) -IMAGE_DATA(186,25,53,210,79,63,40,181,39,145,231,212,214,214,179,223,238,12,209,157,187,176,123,154,118,119,232,158,42,179,163,217) -IMAGE_DATA(213,195,175,62,118,149,253,159,129,154,103,36,174,119,228,105,221,46,206,137,120,140,200,142,39,46,68,255,43,74,244,189) -IMAGE_DATA(90,235,55,192,151,123,59,70,92,15,71,111,62,103,100,110,234,164,241,159,176,45,18,171,105,169,23,169,75,202,165,180) -IMAGE_DATA(248,108,107,107,115,251,30,48,59,56,120,155,170,37,22,49,150,185,177,177,137,253,250,219,93,82,26,24,213,50,125,236) -IMAGE_DATA(106,243,107,148,93,92,143,178,191,51,80,57,187,94,223,195,247,204,228,199,136,190,207,219,186,223,90,28,139,126,91,43) -IMAGE_DATA(215,55,122,140,94,137,190,223,168,193,183,206,158,57,139,45,92,176,128,133,236,14,25,182,240,19,225,172,178,186,134,97) -IMAGE_DATA(76,19,250,156,6,111,255,74,176,219,191,252,54,108,191,252,122,199,205,212,120,213,203,174,55,126,205,176,139,254,12,145) -IMAGE_DATA(207,226,226,18,221,247,213,106,137,241,217,200,231,68,38,188,237,103,44,242,41,250,55,254,119,79,223,109,228,24,163,251) -IMAGE_DATA(223,152,221,143,214,147,117,116,116,202,249,127,255,173,65,186,249,218,144,111,201,38,214,68,95,179,59,24,132,236,102,231) -IMAGE_DATA(230,249,125,191,77,53,137,62,80,217,135,227,77,34,115,222,114,18,49,31,17,197,223,13,79,121,183,183,216,174,247,24) -IMAGE_DATA(45,137,237,7,43,108,247,174,221,236,70,223,77,234,229,214,127,75,238,179,234,3,179,220,244,178,43,248,94,115,236,154) -IMAGE_DATA(107,55,240,190,79,196,245,64,206,223,16,219,127,222,124,160,82,252,115,96,204,211,113,98,110,37,250,55,177,221,171,181) -IMAGE_DATA(62,147,158,99,196,119,204,200,62,240,226,245,25,93,155,220,91,236,71,95,234,245,27,125,178,245,192,122,251,229,190,85) -IMAGE_DATA(217,212,216,125,221,231,106,45,187,158,249,213,98,23,223,17,232,124,157,75,204,43,140,174,71,163,183,237,41,190,3,162) -IMAGE_DATA(143,22,115,104,173,239,214,115,140,120,126,179,107,234,128,113,43,215,69,219,181,115,23,235,234,238,33,217,174,223,160,110) -IMAGE_DATA(110,61,189,114,141,74,201,110,143,9,118,111,114,118,133,190,90,43,216,45,43,175,100,129,110,115,114,233,229,19,241,153) -IMAGE_DATA(215,129,248,223,244,242,41,182,3,196,252,70,252,110,173,24,162,231,24,51,185,145,154,172,220,95,17,62,180,174,161,137) -IMAGE_DATA(58,58,187,233,26,76,202,55,96,200,59,58,37,102,59,61,177,251,154,95,189,236,246,233,100,119,64,39,187,24,23,18) -IMAGE_DATA(44,227,63,68,223,163,21,63,197,28,66,108,3,136,254,70,207,249,149,237,91,171,115,35,163,249,157,183,235,245,213,54) -IMAGE_DATA(172,219,192,218,58,58,9,214,126,173,107,216,48,22,5,220,234,97,183,203,19,187,98,187,193,27,187,146,233,97,23,231) -IMAGE_DATA(143,79,76,10,10,54,33,177,125,135,231,171,244,81,98,253,71,233,39,197,126,41,53,182,197,103,141,246,157,242,220,122) -IMAGE_DATA(114,35,35,249,147,158,218,166,30,89,201,232,133,148,52,106,105,235,160,214,246,107,195,134,241,82,156,91,127,177,123,67) -IMAGE_DATA(39,187,249,87,11,130,134,77,46,49,254,130,81,190,191,170,152,215,170,241,165,140,135,56,15,158,45,31,239,193,255,174) -IMAGE_DATA(182,63,145,85,185,145,158,99,204,200,42,70,39,124,60,142,85,85,215,82,115,107,251,176,97,188,41,152,229,102,55,187) -IMAGE_DATA(221,158,216,21,124,111,105,144,174,99,234,45,127,5,107,90,109,63,111,207,17,140,171,125,86,204,123,148,123,125,169,29) -IMAGE_DATA(227,75,254,100,86,122,198,188,232,177,25,211,166,179,250,198,102,106,104,106,161,198,230,86,106,146,114,123,110,34,183,222) -IMAGE_DATA(216,109,85,178,219,209,105,25,187,37,165,165,65,201,38,23,24,226,126,143,27,226,183,22,59,162,192,5,142,21,63,171) -IMAGE_DATA(181,87,150,248,25,238,167,181,106,66,226,49,90,239,135,214,49,86,245,217,225,55,152,221,127,76,180,69,11,23,49,62) -IMAGE_DATA(39,175,170,166,78,158,251,84,83,215,64,117,245,77,100,154,93,165,239,237,48,199,110,75,107,171,37,247,202,81,96,228) -IMAGE_DATA(235,62,13,220,22,206,95,192,10,138,74,168,176,184,148,48,255,169,164,180,66,158,75,90,86,81,229,154,79,90,53,154) -IMAGE_DATA(221,218,250,70,221,236,54,155,96,87,58,63,27,24,8,252,188,62,71,214,200,138,90,232,188,185,243,88,118,78,158,188) -IMAGE_DATA(150,73,110,222,85,121,61,147,188,171,133,116,181,160,152,60,177,91,81,85,67,85,213,163,217,69,255,149,42,187,106,190) -IMAGE_DATA(87,193,110,65,97,81,64,235,66,142,236,17,226,189,175,190,116,238,15,115,89,218,165,12,121,61,189,244,140,44,202,184) -IMAGE_DATA(156,45,239,129,157,153,157,75,50,187,185,158,217,149,215,151,40,27,205,46,159,47,61,138,221,70,119,118,165,92,141,117) -IMAGE_DATA(117,91,191,47,128,163,224,18,242,66,95,114,167,207,38,125,202,176,247,122,98,82,10,37,93,72,165,228,148,52,74,73) -IMAGE_DATA(189,68,169,105,233,196,217,189,148,145,57,138,93,121,13,41,176,123,101,132,93,204,229,47,40,28,205,110,73,89,133,59) -IMAGE_DATA(187,53,245,210,113,133,142,207,252,27,137,207,183,50,203,233,127,254,249,47,182,117,235,79,44,250,124,28,157,143,137,167) -IMAGE_DATA(152,216,4,121,157,231,184,132,36,74,72,188,160,206,238,69,5,187,153,35,236,102,231,230,185,177,123,181,176,88,94,195) -IMAGE_DATA(43,88,230,91,58,242,191,180,230,5,234,181,233,83,167,177,3,7,15,203,251,99,97,15,162,51,103,163,229,125,175,207) -IMAGE_DATA(69,199,200,123,15,14,179,27,167,96,55,217,197,46,214,222,85,178,155,126,89,106,55,100,92,118,184,116,52,74,136,251) -IMAGE_DATA(102,199,235,205,156,49,147,133,134,238,147,247,17,198,94,173,216,15,243,100,68,36,161,29,128,253,91,177,15,246,48,187) -IMAGE_DATA(81,234,236,70,199,196,49,236,9,231,196,113,71,158,36,238,25,101,148,211,217,51,102,177,245,235,55,97,255,117,121,175) -IMAGE_DATA(214,195,71,142,201,123,179,31,61,22,238,98,247,68,132,188,167,19,103,23,107,71,166,93,188,196,176,87,137,35,71,102) -IMAGE_DATA(196,235,8,200,253,245,182,3,198,125,240,33,155,61,107,54,91,183,110,3,237,219,127,104,216,194,195,35,88,114,114,10) -IMAGE_DATA(171,170,170,166,23,47,94,4,250,167,57,122,67,5,31,11,187,121,243,166,204,175,154,225,255,13,13,13,201,243,238,156) -IMAGE_DATA(152,237,200,145,35,71,142,28,17,253,63,117,2,228,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) -IMAGE_END_DATA(5760, 1) - -IMAGE_BEGIN_DATA -IMAGE_DATA(120,156,237,93,249,119,84,199,149,238,85,130,6,53,155,227,37,99,22,199,177,19,140,112,188,36,97,241,18,59,147,56) -IMAGE_DATA(54,158,147,5,28,192,177,13,56,6,146,24,176,195,18,199,224,108,56,9,56,39,39,216,99,112,230,7,3,146,0,207) -IMAGE_DATA(57,102,179,147,115,50,70,2,123,126,152,32,9,44,27,80,183,36,231,175,169,169,239,86,221,170,91,175,159,90,45,144) -IMAGE_DATA(212,221,32,157,115,143,186,223,123,253,94,189,186,95,221,186,91,221,74,252,33,177,57,193,127,169,236,100,117,165,148,108) -IMAGE_DATA(240,159,211,13,147,244,255,156,202,100,134,248,77,102,146,190,182,233,138,159,125,181,145,236,55,244,81,181,219,115,37,4) -IMAGE_DATA(254,38,210,57,193,239,41,42,145,157,84,242,94,252,125,28,19,97,223,93,13,24,136,242,25,178,2,132,247,163,119,107) -IMAGE_DATA(108,138,149,21,87,211,123,143,20,37,50,186,207,178,249,64,222,214,51,201,113,159,193,156,97,41,155,109,26,244,186,106) -IMAGE_DATA(183,185,22,40,236,15,219,103,118,222,173,118,219,46,143,242,33,22,180,60,88,185,226,105,85,236,237,83,125,133,126,117) -IMAGE_DATA(255,125,15,187,235,162,125,48,78,190,95,210,153,137,234,245,215,255,147,250,236,232,209,227,106,206,45,183,215,64,219,46) -IMAGE_DATA(255,125,152,207,192,118,231,63,187,212,64,161,87,125,86,44,168,99,199,78,168,116,122,18,201,66,115,93,189,226,126,116) -IMAGE_DATA(40,105,199,211,227,75,190,167,177,80,84,253,189,151,84,127,177,79,109,217,250,203,170,183,237,114,241,144,212,216,230,207) -IMAGE_DATA(179,231,220,70,239,5,60,128,58,78,181,147,12,140,195,195,184,62,233,251,97,237,186,159,5,253,182,255,237,214,58,238) -IMAGE_DATA(159,156,37,141,135,217,95,82,197,98,191,42,22,46,25,60,180,127,224,240,96,116,165,156,179,63,60,142,174,109,66,127) -IMAGE_DATA(172,91,255,188,42,20,10,212,103,253,189,5,117,96,127,155,26,123,89,154,175,224,154,92,228,90,107,83,234,239,137,6) -IMAGE_DATA(207,99,156,7,158,129,7,243,78,151,8,239,144,15,229,238,15,125,131,41,229,228,136,33,178,87,240,185,193,227,6,199) -IMAGE_DATA(160,139,203,239,134,114,65,155,205,216,202,59,251,134,175,163,103,138,119,8,206,53,78,18,239,154,23,237,50,228,236,38) -IMAGE_DATA(249,236,18,155,224,242,120,184,126,221,243,170,175,104,100,3,198,210,129,3,45,37,247,227,62,74,97,44,185,126,10,159) -IMAGE_DATA(109,218,231,121,149,177,125,65,237,228,247,149,239,64,58,95,222,245,137,60,30,175,231,137,62,179,124,128,142,0,226,123) -IMAGE_DATA(164,105,156,231,201,223,48,235,150,47,59,217,128,247,27,10,15,146,140,63,107,50,233,27,196,139,236,68,209,254,188,187) -IMAGE_DATA(198,159,103,185,228,219,63,184,140,205,217,118,78,22,247,204,149,248,128,162,253,25,223,127,254,24,219,81,113,152,169,84) -IMAGE_DATA(111,38,249,176,246,103,65,191,237,223,127,48,210,214,240,153,232,127,110,111,169,143,167,41,104,63,99,223,240,112,82,112) -IMAGE_DATA(204,180,121,138,147,81,139,239,123,200,243,149,142,55,185,254,200,216,113,47,219,178,110,253,6,117,234,84,135,153,235,122) -IMAGE_DATA(251,105,110,64,219,87,62,249,12,61,31,250,3,244,33,200,7,214,31,202,245,133,31,235,121,215,254,7,238,127,152,244) -IMAGE_DATA(236,162,150,155,107,245,184,225,246,222,255,192,195,106,207,158,61,244,108,80,177,104,230,217,21,203,159,86,13,141,146,127) -IMAGE_DATA(97,127,204,187,243,94,219,230,126,245,234,206,93,116,236,206,175,124,85,29,63,122,204,201,177,246,15,78,169,245,235,127) -IMAGE_DATA(234,101,135,149,25,228,83,211,255,103,125,225,54,181,110,221,79,212,241,227,39,221,243,33,215,209,70,140,109,180,205,140) -IMAGE_DATA(79,211,127,195,181,161,164,124,192,127,150,15,81,140,223,167,251,166,235,108,39,61,23,58,104,220,24,96,155,31,58,201) -IMAGE_DATA(206,157,191,215,252,24,208,247,53,186,234,103,189,230,25,7,222,62,72,231,167,79,255,188,105,179,238,99,146,77,154,159) -IMAGE_DATA(120,54,248,232,112,100,49,32,49,56,95,247,105,123,251,105,106,43,8,182,195,64,225,162,250,87,193,252,103,25,119,231) -IMAGE_DATA(252,123,168,173,212,103,21,200,7,143,89,47,251,96,111,125,166,49,101,218,87,84,211,167,221,160,182,109,123,201,234,91) -IMAGE_DATA(69,115,78,99,113,192,98,18,199,217,70,131,143,52,218,63,176,227,24,159,184,118,197,242,167,8,27,230,29,122,125,123) -IMAGE_DATA(245,49,224,203,204,19,121,146,67,217,76,206,140,93,109,63,155,54,21,29,30,250,168,45,5,123,172,159,230,124,180,193) -IMAGE_DATA(99,161,146,249,216,16,158,193,120,232,239,43,208,24,99,89,4,76,226,94,176,221,113,14,125,13,30,3,195,81,220,1) -IMAGE_DATA(7,192,73,103,103,55,181,9,247,196,245,132,95,221,126,126,87,252,167,239,250,220,99,75,254,131,238,239,230,43,125,14) -IMAGE_DATA(227,103,206,45,183,25,254,71,230,68,188,35,238,79,248,42,94,10,250,80,242,30,255,129,93,244,15,181,161,226,249,34) -IMAGE_DATA(231,228,44,222,191,189,189,221,243,79,223,227,160,238,103,26,199,197,139,193,51,129,67,211,38,211,71,237,167,62,84,51) -IMAGE_DATA(174,187,169,164,143,142,189,123,148,218,141,241,204,24,24,112,99,156,159,115,145,158,5,251,88,242,114,207,95,222,12,244) -IMAGE_DATA(126,230,23,203,118,234,215,190,130,195,26,120,132,126,12,101,223,80,243,100,147,195,3,191,139,156,47,208,22,140,71,143) -IMAGE_DATA(63,243,92,140,253,168,92,0,22,112,142,219,202,124,31,176,99,105,32,242,46,44,19,102,205,186,157,48,207,199,208,22) -IMAGE_DATA(140,49,240,134,240,216,232,249,3,220,203,251,224,25,175,239,217,235,100,202,148,233,55,168,157,175,238,162,251,178,46,201) -IMAGE_DATA(122,81,165,120,96,30,98,76,2,15,114,46,229,177,136,247,159,62,227,70,106,19,244,86,180,1,188,144,207,251,157,190) -IMAGE_DATA(38,148,161,121,106,131,153,23,204,120,129,204,60,246,238,113,173,235,220,78,231,167,76,191,137,230,65,200,79,30,223,144) -IMAGE_DATA(141,224,145,195,128,245,11,224,153,51,231,124,41,144,243,144,97,190,127,47,82,63,146,142,81,129,239,217,205,195,250,89) -IMAGE_DATA(252,46,60,95,112,12,0,109,194,56,195,113,198,244,209,163,71,169,47,2,217,144,49,178,149,219,1,158,29,220,223,162) -IMAGE_DATA(229,138,209,9,248,89,203,87,60,109,228,99,175,231,61,252,29,143,45,249,110,128,125,146,165,43,159,14,218,9,92,50) -IMAGE_DATA(159,25,11,144,221,108,83,56,27,64,127,223,186,229,101,215,102,233,127,168,4,15,242,157,128,7,35,187,140,140,67,187) -IMAGE_DATA(208,239,60,127,249,223,228,180,62,241,70,240,14,224,77,232,219,203,59,121,195,120,192,125,33,123,141,28,150,152,156,232) -IMAGE_DATA(230,176,169,215,221,160,101,98,167,147,115,228,35,218,178,173,164,173,248,191,228,241,239,133,178,70,127,70,159,15,71,127) -IMAGE_DATA(96,249,192,120,96,249,128,49,215,126,234,127,140,127,175,48,160,109,82,51,47,79,155,118,147,138,218,50,24,75,120,71) -IMAGE_DATA(150,95,199,143,190,23,121,78,222,233,98,91,183,189,76,124,237,183,178,22,247,4,102,140,143,180,232,222,195,224,114,162) -IMAGE_DATA(27,95,208,161,220,124,169,219,137,62,146,184,148,58,39,244,119,226,165,189,118,160,2,123,51,41,244,72,16,226,29,167) -IMAGE_DATA(244,251,243,239,65,237,240,97,100,228,124,236,231,101,232,67,140,87,140,27,244,7,198,57,227,53,156,127,76,187,32,27) -IMAGE_DATA(162,227,215,235,48,134,88,54,240,252,212,117,182,91,205,208,114,208,183,217,227,24,247,2,46,217,119,64,186,4,250,119) -IMAGE_DATA(136,184,191,156,47,72,206,20,188,156,3,30,32,183,160,243,226,126,140,119,200,106,103,103,68,108,35,244,29,223,7,124) -IMAGE_DATA(138,243,121,179,93,181,114,229,143,28,254,112,95,96,14,231,30,125,252,251,102,206,114,115,114,145,248,202,239,12,188,200) -IMAGE_DATA(185,6,223,157,253,211,192,207,48,248,1,62,183,109,125,217,233,156,149,248,31,248,189,36,111,240,27,230,5,8,247,148) -IMAGE_DATA(115,74,202,98,156,101,32,100,120,116,94,145,246,10,124,98,140,45,140,29,232,4,113,60,145,243,12,238,73,122,155,181) -IMAGE_DATA(63,246,188,190,215,245,39,219,155,104,51,62,227,55,223,209,243,54,207,169,172,151,133,242,167,252,92,73,243,5,230,164) -IMAGE_DATA(62,131,167,150,183,247,91,251,167,224,238,11,76,206,153,243,101,199,211,168,253,200,188,40,149,189,222,70,64,108,233,23) -IMAGE_DATA(91,95,18,99,214,242,73,247,17,206,195,22,147,250,33,158,15,25,197,191,7,78,89,199,193,239,13,111,194,185,143,63) -IMAGE_DATA(163,95,96,251,245,89,125,178,18,249,48,20,30,112,15,188,67,220,179,248,251,214,45,191,164,231,241,51,165,173,134,255) -IMAGE_DATA(70,222,22,157,158,139,49,20,189,7,127,231,223,224,189,229,60,90,46,158,0,190,55,107,251,85,206,147,32,248,98,42) -IMAGE_DATA(155,47,242,110,190,144,114,209,205,85,86,103,230,121,132,49,152,12,252,41,222,79,192,114,27,180,228,177,239,210,251,66) -IMAGE_DATA(175,240,243,106,209,201,74,167,7,235,62,194,239,102,106,222,187,177,104,231,126,103,123,234,190,193,243,165,189,130,123,243) -IMAGE_DATA(92,37,251,147,63,175,88,249,204,176,230,139,161,240,0,27,79,226,33,202,55,80,96,171,245,94,114,186,24,159,199,187) -IMAGE_DATA(242,56,195,117,184,62,42,67,249,158,252,25,182,53,141,87,171,71,242,111,146,113,190,5,173,123,207,154,125,171,155,47) -IMAGE_DATA(248,89,51,231,204,173,24,15,235,215,109,112,120,96,92,145,173,40,117,55,139,15,140,57,216,46,104,167,247,133,229,9) -IMAGE_DATA(19,104,27,244,25,244,129,153,103,188,94,3,29,147,229,168,177,37,188,158,112,186,227,84,40,31,10,151,28,118,24,15) -IMAGE_DATA(32,220,151,241,192,190,151,248,57,105,178,197,195,211,14,135,120,175,43,197,3,222,229,73,141,49,143,129,92,137,76,228) -IMAGE_DATA(57,138,251,237,237,183,15,4,152,129,44,28,12,15,81,95,5,127,151,242,129,116,104,253,12,186,159,158,171,74,228,131) -IMAGE_DATA(230,195,252,59,239,241,58,176,197,16,108,160,202,240,96,49,109,231,51,198,53,116,99,248,227,118,238,220,105,109,209,62) -IMAGE_DATA(122,15,216,254,184,183,145,9,50,39,205,199,197,184,239,164,175,228,213,87,255,64,62,72,140,217,39,87,252,40,144,127) -IMAGE_DATA(60,95,0,75,172,211,226,92,119,231,185,128,191,152,139,165,236,134,222,228,198,83,196,223,130,99,36,187,123,11,78,127) -IMAGE_DATA(187,114,249,80,160,123,210,59,59,125,197,235,47,164,63,88,157,152,199,193,206,223,253,177,68,62,72,25,9,127,84,20) -IMAGE_DATA(203,81,191,47,217,178,66,62,224,189,121,206,142,142,1,140,77,244,99,49,152,235,59,43,212,39,115,1,30,88,47,30) -IMAGE_DATA(176,54,21,206,65,127,135,238,96,206,25,159,210,27,111,188,89,210,39,176,43,253,88,52,88,216,188,229,165,208,167,174) -IMAGE_DATA(241,12,27,3,50,151,241,43,231,11,214,139,73,54,245,122,93,43,106,95,12,88,222,116,254,243,172,154,70,62,159,137) -IMAGE_DATA(116,223,0,15,100,95,156,14,230,169,43,151,15,5,242,51,69,245,73,142,159,161,175,156,238,211,103,244,226,117,107,67) -IMAGE_DATA(25,22,197,195,74,97,11,198,249,149,89,191,227,247,70,223,130,31,211,103,220,80,114,29,116,122,252,247,118,175,121,119) -IMAGE_DATA(124,143,198,136,6,195,3,126,191,254,39,27,132,31,169,72,254,100,57,23,48,255,72,199,181,239,9,191,162,233,183,60) -IMAGE_DATA(181,3,188,27,16,114,225,245,191,188,225,126,159,164,249,197,246,27,244,254,109,47,145,191,95,226,1,254,135,162,152,171) -IMAGE_DATA(48,14,150,175,120,74,73,255,59,252,125,100,183,179,28,212,109,129,110,197,177,38,199,83,221,118,248,255,249,126,198,246) -IMAGE_DATA(27,9,125,178,215,205,83,220,63,9,59,79,102,172,255,1,207,34,59,207,98,26,24,145,124,150,246,69,20,15,113,114) -IMAGE_DATA(66,142,73,105,139,111,221,250,139,32,134,198,239,205,254,7,41,163,32,147,43,157,43,64,144,243,220,119,172,3,73,249) -IMAGE_DATA(3,30,226,216,64,191,127,6,100,208,84,107,251,227,60,124,237,178,189,18,15,60,126,48,102,111,209,250,0,189,155,152) -IMAGE_DATA(131,186,58,255,105,253,106,254,247,176,111,216,214,148,177,64,200,107,163,155,92,84,236,223,148,254,73,186,102,219,118,85) -IMAGE_DATA(40,244,137,216,198,200,216,155,252,76,182,35,241,254,184,22,122,176,241,37,115,187,138,206,87,86,114,63,139,7,188,123) -IMAGE_DATA(116,190,136,195,4,249,45,128,111,196,152,132,252,197,123,255,101,207,155,244,108,150,213,184,134,243,22,88,134,162,31,189) -IMAGE_DATA(47,99,40,44,228,29,30,36,158,40,126,209,192,231,141,63,95,230,26,177,44,130,95,152,49,10,31,147,59,111,245,70) -IMAGE_DATA(158,115,112,175,252,140,155,72,127,48,177,13,233,83,45,58,59,134,191,35,126,33,249,43,9,99,133,231,1,150,87,28) -IMAGE_DATA(255,113,177,11,171,23,159,120,247,104,224,127,104,255,160,35,24,215,129,141,103,121,6,108,187,57,7,186,253,7,167,132) -IMAGE_DATA(221,213,171,142,190,123,210,197,76,25,107,52,143,22,195,185,18,215,177,175,76,250,49,217,86,128,127,214,248,14,159,10) -IMAGE_DATA(120,81,142,128,65,126,207,192,231,239,252,53,34,174,209,107,252,243,179,231,124,209,180,97,56,241,172,245,33,246,14,30) -IMAGE_DATA(56,20,19,55,207,5,121,51,159,217,113,128,121,12,125,9,219,0,231,140,188,244,254,254,104,188,2,124,58,184,255,128) -IMAGE_DATA(151,17,60,206,11,151,156,47,205,188,67,233,124,151,228,60,23,141,21,216,176,50,150,141,231,74,89,0,153,113,157,157) -IMAGE_DATA(207,249,56,229,79,178,172,105,12,215,25,176,62,200,246,52,159,67,159,50,190,112,47,248,217,228,252,76,247,190,228,125) -IMAGE_DATA(195,176,157,224,183,155,70,254,195,232,59,148,250,96,77,108,186,178,252,4,142,27,147,111,183,216,231,250,154,255,155,88) -IMAGE_DATA(99,159,107,3,249,110,134,21,235,54,253,43,99,7,184,247,150,205,47,5,99,196,180,119,34,181,7,248,118,243,188,181) -IMAGE_DATA(7,217,14,230,92,102,142,93,250,120,18,231,8,244,147,204,0,79,224,139,148,186,30,142,35,158,46,227,139,220,79,174) -IMAGE_DATA(13,13,158,143,136,31,172,125,238,167,234,196,177,147,129,143,225,247,59,95,213,247,121,168,4,235,231,59,187,232,184,185) -IMAGE_DATA(183,191,191,179,245,57,95,73,228,151,176,124,48,118,151,121,7,216,86,236,91,49,118,117,209,157,3,15,208,7,140,57) -IMAGE_DATA(41,243,211,164,75,55,169,230,249,119,171,142,142,51,212,23,144,169,151,147,195,4,185,3,29,19,248,230,184,241,0,247) -IMAGE_DATA(175,214,155,208,143,236,243,150,252,171,244,254,120,63,126,183,104,126,117,104,19,231,200,182,237,60,123,158,158,141,190,150) -IMAGE_DATA(249,2,232,75,196,156,96,99,97,254,46,90,255,249,217,179,93,46,94,199,99,19,24,194,239,129,159,227,71,79,40,169) -IMAGE_DATA(55,242,218,170,114,243,170,228,25,199,147,50,194,31,16,250,167,38,89,30,133,185,105,242,62,236,207,101,187,140,113,2) -IMAGE_DATA(249,192,190,70,198,131,244,189,240,56,145,249,96,113,227,221,216,144,222,111,35,175,29,46,249,62,152,72,239,5,226,28) -IMAGE_DATA(49,210,185,196,59,13,55,23,70,18,223,215,141,197,200,243,37,126,124,30,83,147,243,87,74,187,89,174,131,41,135,77) -IMAGE_DATA(127,175,210,124,176,33,251,165,193,175,37,114,255,179,165,62,67,226,181,181,71,141,188,153,50,232,115,162,118,122,84,127) -IMAGE_DATA(152,53,251,139,254,249,214,23,79,190,152,198,38,247,220,193,215,188,229,69,27,154,130,177,52,92,44,16,97,29,162,205) -IMAGE_DATA(39,42,205,97,52,125,42,99,237,149,222,95,230,33,113,63,199,199,39,38,149,249,44,114,91,51,222,223,26,151,67,197) -IMAGE_DATA(216,75,197,240,165,252,51,74,175,27,206,24,139,155,131,74,238,151,14,241,196,250,3,203,7,196,112,130,247,136,137,59) -IMAGE_DATA(200,115,209,243,101,249,91,65,251,227,238,23,141,233,241,123,192,15,80,78,214,14,221,150,210,223,70,199,90,248,187,120) -IMAGE_DATA(157,207,231,57,199,243,47,254,189,114,37,207,25,140,103,113,68,235,108,98,238,19,96,117,136,190,231,184,168,60,38,229) -IMAGE_DATA(3,207,23,37,241,172,180,127,70,185,231,196,245,229,112,41,254,247,57,39,159,227,250,173,82,220,133,227,37,158,231,164) -IMAGE_DATA(115,55,14,150,147,233,215,47,224,123,40,107,227,241,16,55,54,57,31,125,232,28,158,248,123,94,41,5,239,26,153,47) -IMAGE_DATA(96,11,177,254,0,127,168,148,31,190,189,249,146,216,210,96,115,197,72,181,63,250,172,96,126,23,249,183,195,185,103,136) -IMAGE_DATA(87,177,214,64,140,51,57,158,75,198,111,122,146,98,255,35,225,193,230,140,15,119,94,28,142,109,60,154,84,242,126,122) -IMAGE_DATA(204,193,30,132,238,12,217,240,195,149,171,99,49,84,237,118,143,211,232,98,66,174,151,1,201,245,29,209,107,171,221,222) -IMAGE_DATA(113,26,93,44,80,45,17,187,206,193,217,15,17,125,91,210,72,232,4,227,84,187,52,152,238,92,178,158,104,28,3,215) -IMAGE_DATA(0,197,233,205,57,65,165,152,168,223,117,207,227,116,57,20,39,19,24,3,227,115,197,213,79,229,236,169,56,140,72,124) -IMAGE_DATA(140,211,181,68,229,253,124,227,152,24,167,74,200,215,132,240,53,1,216,127,107,124,170,62,118,203,235,124,184,214,3,199) -IMAGE_DATA(36,140,79,39,92,235,206,231,217,238,241,126,52,81,175,162,193,62,79,234,196,66,71,194,58,97,94,159,59,62,239,141) -IMAGE_DATA(34,6,50,97,189,67,115,220,203,151,68,198,231,103,51,127,249,26,185,174,200,199,145,38,70,242,53,242,17,159,114,92) -IMAGE_DATA(61,44,121,44,212,133,131,188,120,155,247,52,142,135,177,193,69,52,94,195,50,192,173,97,105,228,227,225,250,63,246,243) -IMAGE_DATA(202,152,10,198,178,169,153,152,15,214,22,242,152,151,24,76,139,120,46,249,83,228,250,152,244,4,250,79,109,136,137,91) -IMAGE_DATA(142,211,200,144,92,95,16,82,191,218,184,241,5,181,112,209,3,244,29,255,121,220,38,34,121,5,18,63,92,119,70,250) -IMAGE_DATA(70,241,251,214,214,67,134,175,124,143,172,89,3,158,22,107,140,185,110,77,232,87,207,169,141,155,182,144,255,221,31,171) -IMAGE_DATA(126,191,93,173,132,56,232,123,39,78,170,69,139,238,35,158,131,22,45,126,144,254,35,239,117,193,194,251,41,159,9,255) -IMAGE_DATA(13,63,144,179,49,85,240,86,212,134,141,248,67,121,28,35,174,118,168,245,112,144,75,224,106,237,164,253,119,55,215,176) -IMAGE_DATA(14,98,99,160,27,55,108,38,76,209,245,22,123,209,58,173,227,52,50,132,28,89,230,149,203,85,17,57,48,11,22,63) -IMAGE_DATA(76,57,99,11,23,61,168,56,111,29,99,120,222,29,119,169,77,155,94,84,243,154,239,22,107,212,243,170,121,254,61,148) -IMAGE_DATA(127,131,227,223,126,228,113,53,109,250,245,132,167,214,150,35,10,99,253,145,239,60,78,247,114,152,176,249,36,200,221,92) -IMAGE_DATA(168,49,185,106,245,179,116,30,245,53,184,141,27,55,252,156,226,181,220,38,150,67,213,238,187,171,145,32,31,218,218,14) -IMAGE_DATA(43,150,225,209,24,244,215,23,63,64,215,64,102,36,178,19,213,35,143,60,170,78,156,56,65,185,217,200,69,238,163,177) -IMAGE_DATA(223,70,124,199,154,18,124,62,121,252,132,234,235,51,117,39,214,172,249,49,97,238,195,246,14,117,250,244,135,46,111,18) -IMAGE_DATA(24,156,58,237,115,244,156,251,22,221,175,206,119,158,117,235,25,144,235,219,211,125,206,98,208,224,1,121,94,114,174,144) -IMAGE_DATA(107,232,199,105,228,200,172,49,236,34,254,128,151,71,52,225,255,142,237,191,33,140,128,39,3,164,63,60,72,235,15,186) -IMAGE_DATA(187,187,213,153,142,211,106,217,210,21,52,134,95,217,254,43,163,107,232,57,30,99,182,173,229,144,211,61,158,88,186,76) -IMAGE_DATA(221,60,251,118,87,127,97,211,198,205,36,59,182,111,127,133,176,178,97,227,207,169,13,208,45,186,187,207,171,47,207,191) -IMAGE_DATA(87,65,198,252,112,217,114,194,205,246,29,191,33,221,149,241,192,24,197,127,200,164,74,235,9,141,37,37,26,115,174,254) -IMAGE_DATA(160,89,199,226,237,175,84,102,234,144,191,39,249,7,157,221,94,155,200,250,218,131,99,49,71,98,45,206,185,174,110,226) -IMAGE_DATA(9,228,68,91,91,27,17,240,144,113,120,232,165,255,255,174,229,63,114,207,25,43,228,139,208,239,138,188,254,51,103,62) -IMAGE_DATA(162,185,254,112,155,230,109,215,217,32,191,28,249,239,103,58,62,52,223,73,247,200,91,185,114,152,142,125,109,209,98,53) -IMAGE_DATA(119,254,93,244,155,252,180,27,245,60,179,132,230,7,96,19,231,129,7,220,195,252,190,182,235,54,147,93,197,57,149,200) -IMAGE_DATA(79,77,55,105,62,154,92,209,232,154,188,120,202,11,59,75,255,54,157,119,184,26,139,57,18,188,6,22,128,189,176,46) -IMAGE_DATA(165,57,255,117,139,135,5,11,31,208,50,96,51,225,103,145,254,44,253,69,239,104,12,32,231,28,223,89,206,200,103,0) -IMAGE_DATA(67,175,237,250,179,50,190,10,131,35,92,71,181,83,244,231,121,205,119,169,189,123,223,82,166,102,93,159,93,231,80,84) -IMAGE_DATA(109,173,239,16,70,140,124,40,186,231,241,56,170,54,239,227,8,178,129,237,232,132,93,63,78,50,34,91,90,179,52,142) -IMAGE_DATA(216,118,35,220,163,190,107,67,35,213,173,77,57,29,109,116,219,47,245,7,127,220,248,7,209,166,175,105,222,243,124,177) -IMAGE_DATA(116,217,10,194,198,234,85,107,93,155,33,19,160,27,188,119,226,125,250,93,28,30,232,25,154,183,100,155,88,63,103,71) -IMAGE_DATA(71,135,58,215,221,73,239,216,213,117,142,244,133,23,54,190,104,116,77,125,79,216,151,71,90,140,252,192,60,3,25,196) -IMAGE_DATA(247,171,85,44,112,219,200,199,218,104,125,48,13,211,156,255,166,18,125,135,113,99,112,37,234,149,104,185,90,217,250,230) -IMAGE_DATA(43,35,163,219,189,19,169,53,230,125,138,224,15,251,31,96,51,192,86,0,111,121,126,132,77,128,123,236,222,253,167,65) -IMAGE_DATA(241,64,117,242,52,255,105,29,136,150,159,208,77,81,215,107,223,190,191,146,126,129,181,67,59,94,222,174,216,215,249,200) -IMAGE_DATA(183,151,16,238,204,124,146,35,185,4,60,196,229,53,215,26,81,221,77,87,123,38,31,248,83,42,163,156,200,137,205,187) -IMAGE_DATA(152,64,52,223,116,180,8,243,50,230,11,105,51,226,56,239,229,5,28,128,95,11,22,46,166,239,224,59,100,249,233,211) -IMAGE_DATA(167,213,190,55,223,162,113,124,174,235,188,186,99,222,93,244,59,232,147,192,3,175,9,54,254,135,94,117,254,220,89,210) -IMAGE_DATA(17,223,218,251,87,250,127,94,203,131,249,205,247,208,53,240,127,124,220,213,169,118,237,122,77,237,218,253,103,210,111,81) -IMAGE_DATA(239,242,228,241,247,8,167,27,32,31,138,3,17,172,86,159,247,113,68,190,86,90,239,52,145,250,240,58,125,236,43,217) -IMAGE_DATA(70,117,87,122,130,106,214,253,119,103,102,66,89,154,175,233,110,253,251,187,83,248,60,89,127,110,84,247,104,154,159,25) -IMAGE_DATA(27,125,169,181,181,85,237,120,229,183,145,92,117,94,143,148,83,205,205,95,85,45,45,109,234,142,249,247,56,188,195,71) -IMAGE_DATA(0,12,65,174,192,70,152,51,251,54,183,166,16,186,230,142,29,191,50,125,99,241,141,107,151,45,251,33,141,123,232,155) -IMAGE_DATA(176,77,88,55,194,220,56,115,214,23,212,166,13,47,16,142,222,220,251,95,36,147,86,235,103,176,124,248,193,19,79,89) -IMAGE_DATA(255,69,245,249,61,52,113,126,119,147,186,94,219,4,199,83,41,245,105,34,165,46,36,18,234,147,36,62,39,202,82,15) -IMAGE_DATA(174,179,215,94,72,38,233,51,142,47,211,248,24,11,249,32,215,101,149,228,174,91,155,167,193,217,57,94,126,200,122,232) -IMAGE_DATA(126,253,71,94,28,55,215,177,95,154,215,132,249,218,248,83,125,44,179,193,126,23,241,178,32,150,150,157,20,169,205,94) -IMAGE_DATA(109,158,15,78,28,163,153,172,223,173,53,149,54,124,77,36,137,167,159,12,129,5,208,69,247,57,229,174,95,157,110,16) -IMAGE_DATA(117,151,199,230,61,6,203,165,9,237,28,25,251,206,211,57,246,1,164,197,26,84,58,175,109,38,94,239,201,118,41,227) -IMAGE_DATA(40,92,147,199,199,165,174,21,198,201,88,199,146,251,127,212,42,54,208,198,70,221,174,215,53,15,141,76,48,60,254,36) -IMAGE_DATA(224,117,198,203,0,141,149,79,146,25,186,182,39,101,142,249,235,211,106,67,170,209,98,97,98,100,79,138,209,37,169,187) -IMAGE_DATA(70,227,81,229,201,203,129,146,123,10,30,71,215,28,87,155,111,163,73,127,72,101,84,143,198,193,167,169,164,230,179,150) -IMAGE_DATA(17,196,115,51,111,24,57,145,118,227,31,132,107,129,27,224,196,205,25,250,250,29,90,190,36,220,186,178,252,152,249,232) -IMAGE_DATA(37,143,252,90,103,214,227,61,79,101,237,251,184,252,60,151,39,83,102,252,114,109,239,114,109,169,54,63,175,132,182,166) -IMAGE_DATA(26,156,44,184,224,100,66,202,225,225,60,142,39,211,66,118,24,12,124,10,76,104,220,224,59,142,191,166,177,64,181,181) -IMAGE_DATA(26,236,186,250,244,216,216,23,146,134,90,175,49,232,156,18,216,128,28,11,51,250,104,201,239,26,155,156,44,145,57,190) -IMAGE_DATA(165,216,170,109,187,50,142,126,156,201,186,57,31,50,192,140,121,251,221,206,27,140,147,79,19,89,35,55,82,144,7,73) -IMAGE_DATA(43,67,204,249,183,52,110,38,208,61,101,173,173,220,24,225,65,60,83,212,187,51,58,92,206,217,29,65,44,169,161,180) -IMAGE_DATA(70,3,217,204,49,115,12,99,59,202,239,210,117,207,19,7,93,143,91,47,4,126,130,191,159,88,253,241,98,34,229,245) -IMAGE_DATA(194,100,194,234,8,41,39,51,62,77,39,28,14,62,181,56,57,152,202,170,169,89,147,147,104,106,239,153,154,2,169,212) -IMAGE_DATA(216,224,1,190,191,101,79,172,44,225,41,251,137,97,251,197,213,194,112,57,11,150,103,139,22,127,67,109,220,244,98,80) -IMAGE_DATA(107,66,214,192,30,138,224,99,128,79,60,14,43,245,66,210,86,4,159,123,72,254,243,119,131,15,163,43,164,220,181,23) -IMAGE_DATA(44,54,62,214,255,79,38,179,234,70,182,199,172,47,215,196,156,115,20,3,25,11,251,2,190,33,227,175,182,124,22,188) -IMAGE_DATA(135,47,18,113,75,124,230,26,30,124,78,230,179,161,237,240,67,32,254,13,255,149,207,119,106,114,184,113,53,64,196,60) -IMAGE_DATA(224,114,98,244,51,11,197,127,217,103,213,102,156,170,18,98,187,224,82,224,79,72,58,60,120,98,156,240,220,146,84,255) -IMAGE_DATA(208,215,220,98,117,132,180,149,149,166,78,193,84,234,95,170,123,147,45,173,237,59,210,52,32,226,140,92,39,145,101,251) -IMAGE_DATA(0,197,164,55,43,231,35,176,246,94,104,127,24,95,3,228,12,114,30,76,94,157,145,255,114,15,17,214,43,204,58,99) -IMAGE_DATA(95,7,9,132,235,16,35,67,77,54,185,87,68,189,17,203,5,154,55,132,190,216,147,52,178,129,177,224,116,12,123,253) -IMAGE_DATA(71,250,220,220,108,163,233,11,216,16,214,239,195,152,24,188,118,207,104,224,161,151,252,130,28,143,35,91,215,218,9,156) -IMAGE_DATA(179,192,188,191,89,207,5,107,86,175,117,177,113,248,25,25,15,152,91,16,231,88,180,208,228,176,32,102,217,218,246,14) -IMAGE_DATA(141,121,242,223,234,251,226,179,137,169,31,86,187,119,253,217,205,45,184,63,98,34,136,151,69,117,136,122,34,200,253,158) -IMAGE_DATA(132,247,55,176,158,120,193,218,144,198,79,201,250,130,177,61,59,245,247,175,101,38,152,177,152,174,254,187,131,135,39,79) -IMAGE_DATA(158,164,184,54,19,231,81,50,30,192,115,228,36,112,189,153,125,251,246,81,108,18,231,77,28,42,239,114,86,160,111,32) -IMAGE_DATA(238,133,120,4,226,18,216,11,10,126,8,138,103,23,123,41,15,226,112,75,43,125,198,61,144,87,5,220,227,59,238,65) -IMAGE_DATA(227,96,140,237,170,145,34,182,51,123,72,159,244,122,99,15,97,34,233,48,112,193,234,151,176,61,191,157,20,107,93,106) -IMAGE_DATA(32,7,80,214,104,231,90,139,200,65,64,173,61,228,185,33,182,136,241,139,28,56,232,19,200,91,129,238,0,62,159,60) -IMAGE_DATA(249,62,97,4,121,82,192,13,126,191,102,213,179,234,220,185,143,9,11,204,235,230,121,119,83,12,12,177,48,222,155,16) -IMAGE_DATA(185,149,136,123,174,90,253,28,201,67,124,54,216,171,253,28,135,114,120,232,73,176,125,145,114,250,34,228,65,143,180,61) -IMAGE_DATA(45,78,150,166,125,13,115,206,73,174,246,59,0,7,224,29,198,53,230,112,150,13,28,231,102,121,63,96,229,8,239,231) -IMAGE_DATA(138,223,194,158,24,176,177,112,232,147,174,174,101,177,151,226,224,230,25,70,183,0,191,247,189,185,151,62,67,14,208,252) -IMAGE_DATA(162,175,107,105,61,66,118,21,203,34,183,38,163,206,176,0,146,126,6,182,33,46,70,142,177,46,185,42,157,115,50,193) -IMAGE_DATA(173,129,171,129,119,6,79,160,79,186,154,135,46,222,221,68,182,7,219,23,184,14,241,104,124,230,92,9,232,15,224,63) -IMAGE_DATA(114,241,33,71,112,253,251,39,223,163,120,53,100,7,63,227,249,13,47,146,108,249,219,241,247,233,89,136,169,226,63,98) -IMAGE_DATA(227,136,135,2,95,136,187,111,120,254,69,51,86,178,181,27,159,40,71,61,137,136,222,152,228,249,35,109,231,16,35,31) -IMAGE_DATA(54,164,26,204,152,106,52,118,165,177,189,106,35,63,24,124,104,211,243,185,92,83,197,49,39,240,112,211,70,131,7,232) -IMAGE_DATA(3,200,179,36,62,101,205,222,227,187,255,248,26,97,0,122,38,207,23,144,11,171,215,172,165,252,57,228,212,226,62,107) -IMAGE_DATA(86,175,83,133,75,189,164,139,186,28,41,253,254,248,13,100,11,158,135,223,74,253,161,222,176,0,98,253,160,199,218,21) -IMAGE_DATA(159,88,31,20,176,113,201,218,28,219,83,25,147,67,202,121,183,25,17,47,136,217,43,102,172,137,243,144,92,204,82,228) -IMAGE_DATA(171,34,39,9,121,9,248,14,222,3,59,224,241,212,105,215,107,91,96,37,97,4,121,45,56,143,227,148,103,121,223,131) -IMAGE_DATA(244,219,191,233,57,8,186,200,29,243,190,162,102,207,250,34,201,151,211,237,29,122,78,122,136,234,135,155,28,235,126,210) -IMAGE_DATA(35,184,29,81,125,178,222,48,113,209,233,6,9,138,89,178,172,48,121,12,105,245,90,186,129,174,115,49,94,61,15,99) -IMAGE_DATA(92,241,250,162,90,120,95,200,123,200,109,94,67,41,125,68,56,103,198,120,158,246,171,68,190,146,172,107,9,121,209,76) -IMAGE_DATA(121,50,57,227,127,208,252,133,125,130,123,205,215,54,6,100,199,137,147,127,167,247,95,186,244,9,91,203,189,224,234,228) -IMAGE_DATA(35,95,142,237,85,154,155,52,30,88,199,174,133,190,25,46,177,111,169,135,244,72,225,103,208,244,87,141,141,70,87,227) -IMAGE_DATA(52,31,89,251,154,171,25,251,130,237,67,185,182,159,248,161,219,9,255,241,76,177,135,3,206,131,223,207,60,251,99,61) -IMAGE_DATA(238,231,187,247,129,63,21,190,4,248,30,96,119,240,248,70,29,116,172,231,193,62,152,248,142,121,229,91,143,62,174,190) -IMAGE_DATA(255,196,10,123,204,63,139,116,87,129,7,131,137,250,242,75,241,92,97,226,217,86,151,208,58,100,139,166,41,13,99,31) -IMAGE_DATA(159,140,163,104,236,185,146,90,50,35,79,131,199,98,176,78,175,185,249,206,8,30,242,34,167,180,126,168,199,202,132,139) -IMAGE_DATA(46,126,157,80,199,52,22,62,103,243,97,107,225,125,226,234,149,15,167,174,208,72,183,37,250,28,248,195,251,138,255,162) -IMAGE_DATA(156,123,200,19,211,190,234,235,85,151,67,62,199,45,165,62,214,120,248,135,166,153,169,70,59,23,228,107,74,222,149,227) -IMAGE_DATA(243,104,198,11,226,242,24,100,91,48,135,192,94,77,103,38,248,220,202,58,181,47,164,111,242,35,253,185,57,227,235,217) -IMAGE_DATA(36,98,234,163,87,19,7,209,92,147,232,252,81,41,118,134,77,141,77,49,227,34,90,7,38,92,139,230,116,219,58,195) -IMAGE_DATA(4,108,76,96,226,255,52,125,85,219,211,136,239,226,56,235,142,195,217,223,101,44,48,33,41,26,51,139,206,39,35,246) -IMAGE_DATA(236,32,143,118,178,179,107,227,174,77,164,217,151,95,27,190,186,225,18,252,13,221,90,54,60,156,109,116,123,157,113,206) -IMAGE_DATA(56,197,9,107,64,159,44,135,11,222,71,134,234,29,139,61,39,70,154,23,20,31,79,79,112,117,149,249,25,209,188,77) -IMAGE_DATA(89,119,98,52,218,49,218,4,123,226,187,233,70,177,15,81,88,19,173,86,231,11,230,81,75,235,59,174,62,16,239,179) -IMAGE_DATA(214,119,233,162,91,83,27,93,119,119,185,132,216,24,98,220,188,38,212,28,207,5,122,99,173,200,210,43,161,167,211,89) -IMAGE_DATA(243,46,180,150,196,228,120,176,15,210,204,25,213,199,131,196,130,207,183,50,249,44,200,55,64,28,10,117,94,104,29,94) -IMAGE_DATA(111,159,122,109,215,159,200,7,133,99,56,63,18,207,62,116,232,136,122,101,251,14,219,87,121,247,124,185,79,133,91,219) -IMAGE_DATA(81,103,50,65,82,45,216,147,35,67,57,177,110,247,193,224,156,223,71,39,79,126,43,202,167,204,70,124,107,118,220,79) -IMAGE_DATA(155,122,189,90,172,207,55,77,191,49,216,47,38,107,99,120,178,150,228,29,182,174,16,251,110,131,186,25,238,222,213,238) -IMAGE_DATA(151,225,81,61,99,185,82,60,240,122,107,212,133,225,252,8,248,169,77,110,148,25,19,152,15,118,239,222,237,246,199,70) -IMAGE_DATA(174,3,199,66,65,228,19,111,107,35,140,52,207,187,151,234,203,176,223,187,187,187,147,214,118,26,121,42,247,16,108,50) -IMAGE_DATA(245,15,170,222,55,149,83,189,230,249,13,7,15,24,195,221,157,231,84,71,251,71,52,127,252,96,233,114,218,139,147,242) -IMAGE_DATA(96,108,190,27,237,143,174,113,128,24,21,228,3,213,143,210,252,158,11,63,184,245,69,183,182,153,152,25,98,32,103,78) -IMAGE_DATA(183,83,220,107,193,130,111,168,211,237,103,168,86,144,92,243,105,250,118,108,242,137,71,146,174,5,249,192,121,145,203,158) -IMAGE_DATA(120,210,189,47,98,88,136,63,113,62,19,176,128,90,97,166,62,221,20,138,99,0,15,200,177,51,113,210,75,20,67,5) -IMAGE_DATA(207,33,27,128,135,111,62,242,24,229,214,204,158,117,59,249,163,166,204,184,62,216,119,178,62,253,148,181,161,47,142,38) -IMAGE_DATA(30,48,15,152,253,138,47,186,125,137,205,62,213,69,245,71,61,39,112,238,2,214,248,179,141,0,60,192,70,225,120,132) -IMAGE_DATA(203,217,213,231,129,43,222,207,27,241,114,228,85,154,156,108,94,39,207,118,198,120,61,226,90,196,3,106,188,161,230,7) -IMAGE_DATA(230,10,156,67,204,115,193,226,111,16,15,231,54,223,75,215,112,172,58,107,215,239,243,189,88,126,128,255,200,201,230,181) -IMAGE_DATA(223,200,159,88,182,116,37,197,187,57,119,19,186,106,168,67,214,142,125,86,41,213,66,126,244,104,227,1,249,177,148,39) -IMAGE_DATA(187,218,214,140,210,99,22,227,255,112,203,65,210,51,33,227,251,250,10,46,143,10,180,112,225,67,38,95,122,147,201,205) -IMAGE_DATA(70,206,3,230,11,196,50,161,87,154,218,66,230,185,143,125,235,81,210,63,150,106,157,146,239,63,46,23,170,77,131,227) -IMAGE_DATA(129,106,78,118,118,17,127,177,102,2,184,64,61,65,216,24,56,135,107,76,110,244,22,87,207,212,212,40,188,104,49,146) -IMAGE_DATA(167,218,63,192,1,62,195,191,1,124,189,188,253,215,36,63,144,203,91,44,124,70,117,164,184,45,230,127,253,217,155,87) -IMAGE_DATA(19,65,94,183,182,253,183,168,63,236,245,101,28,51,245,0,139,148,31,135,241,109,228,59,124,11,57,90,119,67,107,105) -IMAGE_DATA(236,126,203,88,139,211,210,106,235,2,101,39,210,125,183,239,248,45,229,92,205,154,125,43,229,208,34,223,214,216,29,239) -IMAGE_DATA(88,12,150,238,91,63,78,213,163,74,100,52,173,211,22,115,164,247,133,27,223,172,223,115,190,212,215,24,141,87,240,154) -IMAGE_DATA(63,185,246,239,234,177,223,235,159,6,207,155,178,53,236,121,253,46,120,238,242,19,68,12,172,193,175,249,141,230,66,185) -IMAGE_DATA(53,21,67,196,247,194,231,231,84,189,233,147,87,19,73,94,12,54,78,227,246,215,142,198,203,74,49,21,242,53,238,25) -IMAGE_DATA(245,88,251,227,90,160,104,46,132,33,185,63,250,228,224,120,210,214,227,245,199,226,198,180,247,67,71,109,7,249,125,236) -IMAGE_DATA(115,58,199,169,28,6,6,155,235,89,198,199,229,188,197,205,11,165,207,24,12,79,131,235,44,227,152,168,13,138,207,161) -IMAGE_DATA(203,149,241,9,68,107,108,135,188,31,108,254,137,211,15,198,101,67,109,208,130,133,15,56,191,163,252,143,250,63,51,103) -IMAGE_DATA(221,26,89,15,17,169,3,150,158,164,216,143,104,234,54,24,60,192,127,121,179,168,27,20,151,243,95,14,147,240,123,206) -IMAGE_DATA(37,123,182,190,244,201,90,88,95,113,165,212,79,251,213,244,82,140,154,247,174,225,124,41,183,126,78,212,164,101,123,211) -IMAGE_DATA(213,10,210,125,176,122,213,115,228,123,230,253,22,113,31,222,235,196,215,164,146,185,112,62,127,130,235,162,187,122,215,250) -IMAGE_DATA(24,215,192,174,118,223,92,139,20,212,3,89,108,214,250,115,77,144,153,115,190,100,242,88,178,249,192,174,112,181,100,236) -IMAGE_DATA(248,5,239,176,38,152,247,96,29,176,177,11,210,55,51,83,205,30,47,141,126,62,160,90,7,13,188,207,94,83,176,207) -IMAGE_DATA(13,229,83,217,26,249,227,190,169,177,39,142,69,155,239,60,167,231,35,235,75,205,122,60,248,170,33,51,176,150,151,101) -IMAGE_DATA(57,252,146,136,97,119,156,106,87,155,94,216,74,199,8,15,27,94,160,223,224,255,154,103,159,83,249,105,215,43,163,139) -IMAGE_DATA(52,169,116,118,26,249,55,55,233,123,81,190,222,198,45,170,153,234,227,51,190,74,247,76,24,167,177,33,94,207,11,254) -IMAGE_DATA(179,220,134,159,145,247,253,65,62,3,251,170,187,206,154,245,220,152,15,144,19,137,115,219,119,252,138,98,25,31,107,66) -IMAGE_DATA(109,143,36,173,3,54,117,129,10,189,3,170,167,187,139,126,139,239,136,103,17,134,126,176,156,174,193,239,16,191,192,94) -IMAGE_DATA(6,184,39,116,22,41,31,170,221,55,215,34,65,62,32,15,1,249,207,136,73,31,110,59,66,159,145,207,0,29,17,181) -IMAGE_DATA(41,113,13,246,186,0,63,65,248,12,126,226,28,230,140,67,118,15,54,158,63,250,123,47,144,62,130,125,79,48,230,159) -IMAGE_DATA(89,181,198,212,46,212,242,0,252,198,94,91,144,41,38,239,114,2,197,75,113,61,100,5,239,201,230,107,16,140,211,88) -IMAGE_DATA(210,128,205,75,1,6,184,102,11,232,149,87,126,77,241,39,212,125,192,53,115,109,252,138,115,97,161,135,2,23,56,102) -IMAGE_DATA(198,179,175,89,104,106,11,189,31,212,36,164,253,176,90,252,62,93,216,51,3,118,4,234,135,160,46,12,226,167,172,131) -IMAGE_DATA(26,124,29,30,179,62,24,39,79,200,177,151,245,72,93,29,250,180,137,87,224,28,228,125,212,55,208,71,57,178,230,119) -IMAGE_DATA(216,171,228,16,237,143,53,209,238,167,215,103,109,147,156,169,55,153,177,58,39,197,188,115,36,87,206,119,118,105,140,244) -IMAGE_DATA(210,60,241,247,19,127,35,25,180,233,133,45,244,28,174,39,84,111,246,230,213,64,172,79,134,62,34,95,91,31,57,15) -IMAGE_DATA(152,27,88,62,128,240,217,215,34,156,108,106,74,194,190,200,154,250,247,184,39,116,14,156,227,189,43,112,61,106,76,162) -IMAGE_DATA(238,3,234,216,162,126,12,242,105,121,127,13,204,39,82,62,64,150,84,187,111,134,75,201,6,174,179,90,142,170,223,206) -IMAGE_DATA(114,68,124,42,217,95,143,223,111,178,205,119,44,106,254,238,165,252,23,16,234,79,226,24,106,253,192,14,197,239,161,23) -IMAGE_DATA(114,61,17,228,223,67,87,196,94,190,192,3,214,247,112,125,7,216,17,248,140,92,108,222,147,18,185,249,188,39,27,235) -IMAGE_DATA(147,71,234,209,222,172,96,191,213,90,39,146,251,122,220,18,255,163,113,71,171,207,177,254,8,30,131,240,25,121,78,230) -IMAGE_DATA(186,156,122,107,239,62,226,39,236,9,236,193,140,123,254,239,233,51,46,127,134,243,105,167,206,184,145,230,20,124,198,49) -IMAGE_DATA(228,229,35,119,31,245,42,77,253,210,247,173,126,122,152,106,150,86,187,111,70,135,194,117,38,181,38,51,32,243,225,79) -IMAGE_DATA(136,243,37,115,206,2,244,74,228,58,97,156,131,80,167,210,239,95,52,153,48,64,190,137,77,91,200,231,128,255,11,23) -IMAGE_DATA(220,175,117,70,83,119,110,246,172,91,221,126,219,240,61,193,70,65,238,37,206,161,22,29,126,131,239,236,15,69,123,120) -IMAGE_DATA(189,79,125,81,5,188,109,144,181,187,107,15,27,50,55,78,198,148,216,175,204,255,19,182,78,160,95,115,103,112,195,107) -IMAGE_DATA(38,252,111,38,187,107,25,83,113,235,106,100,126,140,172,121,153,20,53,238,234,110,190,168,136,162,24,168,109,10,237,136) -IMAGE_DATA(124,108,60,203,97,73,236,53,138,255,92,167,212,197,59,74,116,168,104,30,93,46,136,109,200,218,250,213,238,135,203,234) -IMAGE_DATA(59,87,219,162,28,85,130,151,106,242,223,142,243,244,224,178,42,174,102,136,255,31,229,119,28,126,76,95,248,223,55,185) -IMAGE_DATA(92,75,137,183,210,245,209,213,151,159,195,234,203,228,191,85,64,55,217,255,51,221,247,84,250,115,66,23,173,190,252,168) -IMAGE_DATA(40,95,13,251,94,165,39,187,61,86,203,213,156,9,238,29,228,77,218,253,58,185,46,72,99,147,195,73,189,202,4,73) -IMAGE_DATA(137,196,205,154,102,93,6,221,108,233,243,22,23,213,197,68,217,122,115,65,45,167,80,222,15,230,79,230,56,8,99,45) -IMAGE_DATA(138,187,210,252,201,176,22,200,88,236,91,62,58,120,152,69,227,62,202,103,115,12,159,103,219,227,70,62,36,146,179,205) -IMAGE_DATA(113,250,127,147,248,221,231,85,50,93,189,181,171,165,242,193,175,133,144,186,99,185,223,15,118,206,236,99,221,36,228,132) -IMAGE_DATA(205,161,106,152,28,198,185,35,251,239,56,236,216,107,9,135,217,169,65,123,19,13,181,101,239,255,63,169,33,128,194,0) -IMAGE_END_DATA(9280, 1) - -IMAGE_BEGIN_DATA -IMAGE_DATA(120,156,237,125,103,183,85,213,217,118,198,251,11,222,241,252,129,247,29,35,205,36,38,209,216,163,73,44,177,36,177,96) -IMAGE_DATA(69,17,44,177,162,168,168,20,5,65,233,189,119,233,29,14,229,80,14,29,164,139,2,73,20,176,198,68,240,121,190,231) -IMAGE_DATA(31,172,249,156,107,31,39,76,230,153,229,158,101,237,189,246,225,190,198,184,135,178,207,42,179,207,107,221,109,254,96,225) -IMAGE_DATA(255,233,251,131,255,250,193,255,253,1,32,24,12,6,131,193,96,48,24,12,6,131,193,96,48,24,12,6,131,193,96,48) -IMAGE_DATA(24,12,6,131,193,96,48,24,12,6,131,193,96,48,24,12,6,131,193,96,48,24,12,6,131,193,96,48,24,12,6,131) -IMAGE_DATA(193,96,48,24,12,6,131,193,96,48,24,12,6,131,193,96,48,24,12,6,131,193,96,48,24,12,6,131,193,96,48,24) -IMAGE_DATA(12,6,131,193,96,48,24,12,6,131,193,96,48,24,12,6,131,193,96,48,24,12,6,131,193,96,48,24,12,6,131,193) -IMAGE_DATA(96,48,24,12,6,131,193,96,52,4,255,249,207,127,196,193,3,7,157,194,96,48,24,12,6,131,145,2,240,137,110,247) -IMAGE_DATA(222,87,216,100,249,242,229,141,46,98,101,224,106,39,200,39,255,248,164,238,101,194,59,93,101,26,53,114,84,225,123,6) -IMAGE_DATA(198,192,15,255,223,255,119,10,131,81,117,28,57,114,164,38,45,235,214,137,105,211,166,23,54,145,215,225,91,139,193,96) -IMAGE_DATA(48,24,245,3,56,137,139,107,204,154,57,171,209,69,172,4,170,202,203,124,253,71,225,156,190,103,128,187,214,163,46,12) -IMAGE_DATA(6,21,224,140,224,143,125,250,188,82,244,234,245,100,241,240,35,143,138,88,193,51,198,140,25,83,172,89,179,70,156,57) -IMAGE_DATA(243,89,163,171,198,96,148,130,111,191,253,246,188,221,10,251,58,214,125,136,170,163,96,29,3,163,108,244,122,188,167,147) -IMAGE_DATA(111,176,93,181,3,208,247,186,218,233,186,171,175,105,8,47,123,233,197,222,206,254,219,178,121,139,247,25,190,49,128,119) -IMAGE_DATA(212,161,42,12,134,21,103,207,158,21,139,23,47,22,253,250,245,79,226,151,170,60,210,253,209,226,197,222,47,23,111,246) -IMAGE_DATA(31,88,140,30,59,65,140,29,63,73,76,155,49,91,140,155,48,169,152,59,119,94,113,250,244,233,70,87,155,193,200,2) -IMAGE_DATA(112,76,159,206,68,202,109,183,220,202,235,61,163,52,96,124,185,198,31,219,159,58,80,85,93,160,250,109,106,18,138,189) -IMAGE_DATA(223,55,6,40,186,210,75,9,248,14,27,56,96,160,209,151,161,209,101,235,106,128,157,60,39,207,236,217,243,137,226,205) -IMAGE_DATA(126,3,139,217,115,223,23,203,86,172,18,139,151,46,23,11,22,45,17,243,230,47,20,179,230,188,47,166,207,156,35,166) -IMAGE_DATA(76,155,41,38,76,154,42,198,140,155,32,222,27,54,162,88,189,122,53,175,131,140,166,134,79,175,160,10,174,109,116,121) -IMAGE_DATA(25,93,23,174,177,247,139,203,126,198,99,239,123,248,184,93,163,120,89,14,123,191,239,25,172,235,238,0,248,187,143,159) -IMAGE_DATA(51,210,1,126,7,187,121,170,205,92,149,231,95,232,93,64,135,185,110,67,171,88,211,178,65,172,90,211,34,150,175,92) -IMAGE_DATA(45,150,44,91,33,22,46,94,42,222,95,176,72,204,153,55,95,204,152,53,87,76,157,62,75,76,154,50,189,166,247,28) -IMAGE_DATA(57,122,108,59,239,28,41,6,15,121,87,140,159,48,177,128,190,149,193,104,54,96,47,167,114,78,214,49,48,202,2,246) -IMAGE_DATA(208,42,234,238,170,8,216,206,93,109,213,136,88,43,248,231,164,218,72,124,99,0,130,247,92,234,240,249,86,48,231,76) -IMAGE_DATA(135,228,154,221,187,63,150,141,107,190,240,226,75,197,252,133,139,197,230,173,219,196,198,77,91,197,250,141,155,196,218,117) -IMAGE_DATA(27,197,234,181,235,196,138,85,107,196,210,229,43,197,162,37,203,197,252,133,75,196,220,247,23,136,89,115,230,213,236,235) -IMAGE_DATA(147,167,206,16,227,39,78,17,163,199,140,23,195,70,140,22,67,134,14,19,111,13,122,71,244,235,255,150,24,51,118,28) -IMAGE_DATA(115,79,70,211,128,178,198,171,66,241,199,98,48,98,224,219,71,249,123,231,2,170,168,11,244,197,53,81,108,36,88,95) -IMAGE_DATA(152,71,185,129,53,155,170,39,96,196,1,54,244,156,92,179,251,163,61,138,137,147,167,20,219,119,238,22,109,219,119,138) -IMAGE_DATA(45,109,219,69,235,230,54,177,161,117,179,104,89,15,93,231,122,177,114,245,218,239,237,235,43,196,130,69,75,197,188,249) -IMAGE_DATA(139,4,108,238,210,190,62,113,242,52,49,102,220,68,49,98,228,24,49,244,189,17,98,208,224,161,98,192,192,183,197,235) -IMAGE_DATA(111,244,23,175,188,218,87,76,156,52,169,96,155,59,163,234,8,241,229,132,52,34,255,10,227,210,128,207,71,145,243,36) -IMAGE_DATA(117,128,99,214,47,109,248,236,233,141,30,7,205,140,79,79,157,170,197,141,231,226,154,144,215,94,123,189,216,182,99,151) -IMAGE_DATA(216,181,103,159,216,177,107,143,192,255,111,105,219,33,54,109,105,19,27,55,109,17,235,54,64,215,41,237,235,107,196,146) -IMAGE_DATA(101,43,197,194,197,203,196,251,11,22,139,57,243,22,136,153,179,47,216,215,199,77,152,44,70,142,30,39,222,27,62,82) -IMAGE_DATA(188,51,228,61,49,240,237,193,226,205,126,3,196,171,175,189,33,94,122,249,21,241,204,51,207,21,59,118,236,108,116,51) -IMAGE_DATA(50,24,86,132,248,114,242,26,198,40,19,62,31,69,246,227,235,64,87,142,89,87,243,103,152,228,82,255,230,165,218,212) -IMAGE_DATA(121,189,14,7,226,208,115,114,77,8,98,206,247,237,63,40,246,236,219,223,206,57,63,104,231,156,123,219,57,231,110,177) -IMAGE_DATA(117,219,206,154,125,189,117,179,110,95,95,43,150,46,95,165,216,215,101,44,145,98,95,31,59,65,12,135,125,253,221,97) -IMAGE_DATA(226,237,65,67,68,191,1,111,137,190,175,191,41,94,126,229,53,241,252,243,47,138,39,158,120,170,22,231,196,58,79,70) -IMAGE_DATA(21,17,226,203,201,49,235,140,50,225,243,81,100,116,160,170,186,192,28,49,235,12,55,108,115,4,186,3,140,11,112,82) -IMAGE_DATA(112,115,252,151,125,81,104,0,55,203,173,219,236,254,232,99,197,156,121,239,23,251,15,30,22,224,156,123,63,56,32,118) -IMAGE_DATA(239,253,64,236,220,189,87,184,237,235,45,98,217,138,213,154,125,189,35,150,72,218,215,199,194,190,62,106,172,120,23,246) -IMAGE_DATA(245,119,96,95,31,36,94,127,179,195,190,254,98,239,151,197,211,79,63,35,30,123,236,113,241,224,3,15,21,159,126,250) -IMAGE_DATA(105,163,155,151,193,56,143,80,95,78,142,89,103,148,137,42,234,238,170,136,174,28,179,206,176,195,228,83,129,177,192,49) -IMAGE_DATA(85,241,128,45,61,103,60,186,228,155,208,93,30,56,116,68,128,115,126,112,224,80,141,115,118,232,58,47,216,215,183,110) -IMAGE_DATA(131,125,125,155,102,95,95,103,177,175,119,196,18,73,251,250,168,49,176,175,143,170,217,215,223,170,217,215,7,138,215,250) -IMAGE_DATA(126,111,95,127,246,121,228,96,18,15,61,248,176,184,251,47,247,8,228,150,239,74,192,120,199,55,213,128,254,3,138,251) -IMAGE_DATA(238,185,183,147,244,126,225,197,98,228,136,145,69,35,236,98,224,84,120,47,222,47,115,156,67,96,227,193,239,85,214,61) -IMAGE_DATA(163,108,40,39,202,11,155,149,204,183,134,60,108,248,45,135,206,32,212,151,179,17,123,153,222,6,168,255,165,108,99,69) -IMAGE_DATA(191,163,61,212,124,124,248,127,244,101,232,222,35,207,181,86,231,134,212,147,212,27,62,31,69,147,238,14,229,71,189,241) -IMAGE_DATA(45,164,234,127,240,255,242,156,197,178,247,99,60,223,53,79,241,183,220,235,76,89,49,235,40,39,238,69,123,154,236,31) -IMAGE_DATA(242,236,81,83,125,114,196,172,55,18,40,191,28,75,106,126,75,244,169,173,206,185,128,57,45,245,146,250,251,33,82,135) -IMAGE_DATA(169,251,65,229,108,83,57,134,229,59,229,24,211,203,208,149,214,222,29,59,118,100,141,19,210,249,166,202,57,165,125,93) -IMAGE_DATA(213,117,94,108,95,135,174,19,246,245,245,14,251,250,156,154,125,29,185,58,107,246,245,145,163,197,208,119,135,139,183,7) -IMAGE_DATA(15,17,253,107,246,245,126,162,15,236,235,47,244,22,79,60,249,180,232,222,94,158,251,238,237,38,238,188,227,78,209,239) -IMAGE_DATA(205,126,149,158,127,62,96,254,129,199,93,123,213,213,65,190,128,63,255,233,101,53,14,90,214,62,32,215,13,112,221,16) -IMAGE_DATA(123,49,246,135,92,118,31,185,118,80,69,247,113,194,156,166,250,88,98,93,160,156,5,136,118,49,189,219,167,47,177,217) -IMAGE_DATA(111,116,49,173,67,58,151,241,137,62,38,80,47,219,222,170,191,47,180,205,33,190,118,11,125,158,143,223,132,150,81,125) -IMAGE_DATA(22,230,27,126,243,113,13,170,222,3,101,161,196,33,96,191,173,215,30,19,26,179,142,127,83,253,66,80,143,156,156,65) -IMAGE_DATA(114,221,144,88,14,204,157,92,109,233,123,87,204,123,66,218,19,215,153,214,45,95,253,125,101,160,248,42,166,182,143,222) -IMAGE_DATA(54,242,124,120,74,157,115,158,187,138,246,195,184,12,241,109,210,37,53,135,8,214,137,152,50,224,122,220,215,204,250,85) -IMAGE_DATA(196,165,231,246,221,132,192,158,46,249,166,202,59,47,182,175,239,107,231,156,123,68,219,246,93,53,251,58,98,137,54,180) -IMAGE_DATA(110,249,62,87,231,5,251,186,204,213,169,218,215,17,75,84,179,175,35,87,39,236,235,195,70,136,193,239,188,43,6,188) -IMAGE_DATA(53,72,188,241,102,127,241,234,107,175,139,222,47,245,17,79,255,245,217,154,125,253,129,251,31,20,127,254,211,159,197,173) -IMAGE_DATA(183,220,42,222,120,227,141,166,227,157,88,107,161,207,140,157,35,170,224,57,185,246,1,172,35,33,60,211,38,88,123,82) -IMAGE_DATA(247,133,80,30,39,247,82,234,218,103,18,236,125,174,182,244,249,127,165,138,105,45,14,141,77,146,229,199,127,67,99,73) -IMAGE_DATA(66,246,126,181,175,109,237,69,137,11,54,137,235,187,133,194,23,77,207,194,190,18,179,39,152,202,130,61,34,166,173,240) -IMAGE_DATA(77,102,173,88,38,80,99,214,49,62,98,234,96,107,147,80,96,172,167,240,132,84,91,104,238,152,245,216,49,161,246,9) -IMAGE_DATA(80,149,152,117,95,251,168,99,32,212,206,3,73,253,126,65,249,66,215,130,50,198,82,174,61,161,25,125,70,203,226,155) -IMAGE_DATA(227,39,78,238,196,55,41,246,245,142,92,157,91,190,143,37,186,96,95,239,200,213,185,76,32,159,167,106,95,239,136,37) -IMAGE_DATA(130,125,125,188,24,6,251,250,80,216,215,145,171,179,195,190,254,114,159,87,197,179,207,189,32,122,246,122,66,60,252,208) -IMAGE_DATA(35,226,158,187,239,17,183,223,118,187,248,221,141,55,137,190,125,251,54,77,127,97,239,131,158,50,199,56,149,2,61,105) -IMAGE_DATA(202,62,128,123,115,112,77,93,192,151,98,215,149,208,119,161,93,177,118,167,236,99,16,23,239,12,229,127,161,98,226,233) -IMAGE_DATA(33,251,152,60,95,134,202,39,82,219,28,226,226,81,161,177,161,182,114,165,148,49,165,28,178,77,213,253,40,36,167,159) -IMAGE_DATA(73,202,142,75,161,124,103,196,242,77,41,216,235,99,231,117,10,55,51,245,77,172,142,42,103,204,122,234,152,128,72,222) -IMAGE_DATA(153,35,102,221,55,6,40,231,172,251,218,71,194,87,222,212,114,152,144,242,78,215,88,10,241,165,192,248,207,189,31,248) -IMAGE_DATA(116,30,85,66,89,124,179,157,235,25,249,102,103,251,122,231,88,162,205,91,183,215,236,235,29,177,68,29,246,245,11,185) -IMAGE_DATA(58,221,103,97,14,175,229,234,28,94,203,213,217,127,0,114,117,118,216,215,95,120,241,37,241,228,83,79,195,119,64,116) -IMAGE_DATA(187,175,155,184,235,206,187,196,205,191,191,89,92,127,237,117,226,213,87,94,173,60,239,204,165,219,52,9,120,108,140,255) -IMAGE_DATA(81,204,55,106,232,92,14,229,195,62,159,38,147,164,240,10,93,108,246,171,92,123,165,77,76,235,77,200,253,146,207,80) -IMAGE_DATA(215,100,21,161,113,80,106,187,219,16,163,3,112,249,86,133,234,77,241,44,74,110,108,106,187,162,127,82,185,5,164,76) -IMAGE_DATA(125,39,37,102,61,199,56,142,209,203,228,224,102,38,137,225,157,185,98,214,115,213,9,207,160,216,38,40,107,169,111,12) -IMAGE_DATA(164,234,74,229,28,205,177,230,134,238,89,101,175,193,212,242,148,165,127,104,6,222,121,228,200,145,82,248,38,242,189,67) -IMAGE_DATA(119,105,227,156,23,236,235,135,206,219,215,165,174,179,195,190,190,67,179,175,135,156,133,57,238,252,89,152,3,223,26,44) -IMAGE_DATA(222,168,229,234,236,176,175,255,245,153,103,69,143,30,61,197,3,15,60,36,254,242,231,191,180,247,209,109,226,198,27,126) -IMAGE_DATA(43,174,186,242,55,162,207,203,47,87,150,119,194,255,178,204,185,18,178,38,213,187,76,161,188,51,134,39,228,94,139,76) -IMAGE_DATA(182,150,178,219,72,127,95,40,15,4,151,161,182,157,190,167,198,114,51,151,15,69,140,143,131,203,95,45,116,143,195,251) -IMAGE_DATA(115,113,28,212,51,214,103,131,58,190,114,192,245,78,112,17,140,145,178,198,171,11,101,241,77,89,150,208,239,218,28,49) -IMAGE_DATA(235,169,250,98,211,59,125,215,80,64,25,203,41,237,35,237,87,57,250,51,68,159,28,50,118,117,159,121,220,75,177,197) -IMAGE_DATA(235,118,13,19,202,246,177,170,114,156,24,226,211,115,199,11,73,153,58,125,166,85,199,105,139,37,50,219,215,243,156,133) -IMAGE_DATA(249,26,114,117,246,121,85,60,247,252,139,136,201,23,15,63,220,93,220,115,207,189,226,142,63,222,33,126,127,211,239,196) -IMAGE_DATA(181,87,95,35,126,245,139,203,197,236,217,179,27,221,45,157,80,47,110,7,129,190,147,242,157,212,179,199,227,117,43,147) -IMAGE_DATA(92,91,168,223,111,101,207,105,138,232,123,78,172,30,144,42,38,189,74,40,199,114,197,11,249,222,23,219,230,46,196,248) -IMAGE_DATA(91,185,246,250,70,142,139,220,124,169,12,93,167,79,15,108,171,131,26,31,30,162,191,161,234,23,67,249,38,246,220,208) -IMAGE_DATA(239,133,208,125,218,247,108,138,190,43,164,173,100,140,37,108,16,54,158,234,43,19,165,142,20,91,0,229,123,199,53,119) -IMAGE_DATA(93,227,68,141,19,207,57,142,168,54,14,180,177,107,159,161,216,245,92,54,127,42,215,70,251,200,220,21,82,100,46,3) -IMAGE_DATA(74,61,170,232,223,137,186,63,251,220,115,209,124,243,241,158,189,138,39,159,122,186,232,217,235,137,78,207,232,217,235,73) -IMAGE_DATA(47,223,212,57,39,61,87,167,233,44,204,249,157,207,194,28,101,62,11,19,185,58,159,122,234,175,226,209,71,123,136,110) -IMAGE_DATA(221,238,23,119,221,249,39,113,203,31,110,22,55,92,119,189,184,242,87,191,198,120,16,7,15,86,39,15,65,78,155,47) -IMAGE_DATA(85,192,113,93,101,170,39,7,214,231,33,165,205,202,246,155,164,72,46,61,32,85,76,28,36,148,99,133,172,243,250,154) -IMAGE_DATA(22,211,230,62,29,69,76,59,184,246,159,156,122,198,70,75,25,186,140,208,181,198,22,51,75,245,185,164,238,139,148,103) -IMAGE_DATA(97,44,153,114,233,200,92,17,148,250,80,237,162,120,135,239,89,62,93,32,149,3,97,94,153,218,24,247,135,234,72,171) -IMAGE_DATA(18,179,174,235,27,193,193,208,71,166,190,203,53,142,40,115,159,218,255,190,241,228,210,225,251,56,43,238,245,141,29,106) -IMAGE_DATA(187,84,45,247,63,206,228,241,114,203,135,187,23,61,122,244,44,30,123,172,71,1,142,246,100,59,87,67,206,33,216,168) -IMAGE_DATA(193,223,112,206,15,98,116,112,214,228,224,119,134,214,242,19,225,223,83,167,77,47,214,180,180,4,241,78,83,44,81,137) -IMAGE_DATA(103,97,138,199,31,239,37,30,124,16,246,245,187,197,109,183,222,38,110,250,237,141,226,234,43,175,18,151,255,236,231,224) -IMAGE_DATA(158,197,185,115,231,26,221,69,181,177,149,59,94,136,42,182,111,217,20,255,77,196,42,73,125,72,172,77,137,98,215,41) -IMAGE_DATA(219,103,135,34,185,244,128,84,49,197,172,135,114,172,16,189,162,190,206,119,197,152,245,170,75,110,80,199,40,37,246,134) -IMAGE_DATA(162,207,201,17,67,45,199,145,207,6,66,209,149,82,237,180,57,98,214,41,99,209,215,62,161,182,249,170,196,172,171,253) -IMAGE_DATA(224,243,107,64,29,125,109,229,43,19,229,27,33,244,156,13,223,88,178,213,201,215,95,212,124,45,190,190,151,223,96,85) -IMAGE_DATA(129,235,60,203,135,30,126,164,232,214,237,254,226,142,59,238,20,127,254,211,95,106,121,133,144,95,232,169,167,159,113,242) -IMAGE_DATA(77,196,236,12,31,49,74,12,27,113,241,184,62,113,226,132,88,187,182,165,104,221,188,213,25,191,94,175,179,48,251,40) -IMAGE_DATA(103,97,62,242,72,119,113,239,61,247,137,59,110,191,83,252,225,119,191,111,239,167,107,197,175,47,255,101,77,215,249,246) -IMAGE_DATA(160,193,13,215,77,151,17,11,78,21,196,43,233,229,137,181,15,131,55,155,246,40,204,175,80,155,35,101,205,107,84,155) -IMAGE_DATA(185,202,217,136,152,245,50,57,150,254,190,152,103,184,246,192,42,196,172,87,93,114,131,250,141,66,221,23,125,177,104,190) -IMAGE_DATA(125,158,18,11,24,18,51,65,249,94,166,212,205,247,28,31,119,165,140,109,106,76,118,72,188,100,85,98,214,165,80,253) -IMAGE_DATA(104,125,237,237,219,19,40,223,8,185,253,121,109,227,200,215,30,33,101,208,249,184,244,183,174,154,126,243,236,217,179,70) -IMAGE_DATA(31,206,7,31,124,184,184,245,230,91,11,232,251,160,247,139,225,155,56,7,104,203,22,251,184,254,238,187,239,196,214,173) -IMAGE_DATA(109,98,221,250,141,133,206,59,179,159,133,57,190,243,89,152,111,24,206,194,188,191,219,3,226,79,119,253,89,220,114,243) -IMAGE_DATA(45,226,134,235,110,16,191,249,245,21,53,206,249,202,43,125,139,53,107,214,214,177,103,46,70,172,158,7,162,230,220,148) -IMAGE_DATA(121,227,67,159,113,235,205,183,116,26,255,49,28,24,124,211,53,7,98,234,233,122,94,138,223,164,110,199,74,201,203,162) -IMAGE_DATA(175,131,242,44,38,41,177,113,78,234,51,84,73,141,89,15,21,117,77,237,138,49,235,170,160,44,168,163,204,65,158,210) -IMAGE_DATA(110,210,142,40,199,64,138,78,62,55,114,232,222,84,164,230,138,164,228,79,8,221,95,125,237,77,241,147,245,197,162,248) -IMAGE_DATA(56,144,143,175,200,24,116,42,168,121,38,170,16,179,174,10,245,219,37,230,108,172,144,242,132,114,61,32,134,115,250,214) -IMAGE_DATA(201,152,115,101,177,134,84,145,103,170,208,207,80,127,232,225,238,197,117,215,92,43,174,249,205,85,34,149,111,142,28,61) -IMAGE_DATA(150,220,102,159,125,246,89,77,255,185,109,199,174,162,244,179,48,135,118,62,11,243,89,237,44,204,63,222,246,199,246,250) -IMAGE_DATA(223,84,107,135,95,254,252,23,53,94,14,157,109,163,108,236,177,58,78,240,75,211,243,98,120,167,138,216,61,155,162,223) -IMAGE_DATA(15,221,119,93,235,94,172,223,164,237,251,61,182,222,190,189,43,230,185,33,246,159,20,142,21,58,54,186,98,204,186,171) -IMAGE_DATA(140,177,126,18,38,189,78,74,252,110,110,248,222,23,186,39,166,112,78,138,61,52,38,63,163,239,155,129,226,39,155,18) -IMAGE_DATA(179,78,209,75,134,218,68,169,223,124,20,164,204,89,9,202,220,205,185,150,165,114,206,152,156,183,49,156,147,178,38,119) -IMAGE_DATA(165,51,45,1,156,107,121,94,175,249,208,35,197,77,55,254,174,0,191,202,193,55,199,77,152,36,230,206,155,23,220,119) -IMAGE_DATA(88,91,118,237,222,13,61,102,97,58,11,179,35,87,103,198,179,48,223,176,159,133,249,135,223,253,65,128,127,95,241,203) -IMAGE_DATA(95,65,207,87,203,47,63,117,234,244,186,219,216,99,245,70,240,151,180,61,147,178,134,235,162,126,107,199,112,96,87,121) -IMAGE_DATA(84,132,230,232,117,173,17,49,124,192,167,87,136,233,11,159,62,32,70,95,22,162,99,42,59,246,44,181,205,245,103,232) -IMAGE_DATA(136,225,97,185,99,214,115,127,135,216,184,68,108,108,83,78,80,234,20,202,133,124,250,64,151,173,151,50,63,98,242,69) -IMAGE_DATA(81,214,86,31,82,98,214,125,109,18,170,227,148,240,213,169,42,49,235,49,125,231,43,151,239,251,222,55,247,99,226,241) -IMAGE_DATA(98,252,57,41,223,27,148,24,162,102,66,175,94,79,214,116,156,15,60,240,80,113,249,207,126,33,114,242,205,137,147,167) -IMAGE_DATA(138,84,157,224,241,227,39,196,170,213,107,138,122,158,133,217,163,199,197,103,97,254,246,250,27,196,111,174,184,178,22,195) -IMAGE_DATA(14,206,9,57,118,236,88,166,30,160,33,54,247,187,111,79,128,189,60,228,121,114,236,199,228,88,135,80,207,197,141,241) -IMAGE_DATA(117,204,249,44,151,190,36,182,238,190,117,35,38,207,97,72,238,234,212,152,37,172,125,40,35,101,253,203,29,179,30,243) -IMAGE_DATA(125,228,107,159,24,94,103,123,94,12,231,116,217,239,98,202,150,59,110,221,247,141,82,47,251,163,132,207,246,145,82,127) -IMAGE_DATA(95,219,250,98,90,82,230,190,175,94,177,103,235,248,158,91,149,152,117,106,89,84,248,190,63,124,223,226,185,234,37,225) -IMAGE_DATA(179,235,184,230,74,200,252,70,189,187,194,89,234,237,188,178,248,201,15,127,148,157,111,78,154,60,37,219,26,120,252,248) -IMAGE_DATA(113,177,98,229,234,194,119,22,230,133,92,157,153,206,194,252,99,199,89,152,215,92,117,181,248,229,47,46,63,207,57,199) -IMAGE_DATA(140,29,95,87,93,39,244,131,161,123,16,196,247,125,108,211,85,226,119,8,184,46,108,240,152,83,170,143,96,172,15,27) -IMAGE_DATA(114,42,225,121,170,168,121,118,165,196,196,186,196,198,5,154,196,197,85,98,117,90,190,181,34,134,103,132,248,236,164,228) -IMAGE_DATA(5,10,61,203,162,25,98,214,99,244,166,182,54,136,209,33,187,246,217,220,126,4,49,240,125,163,196,112,33,95,155,219) -IMAGE_DATA(64,225,117,41,249,7,125,207,118,113,198,148,152,117,74,189,98,207,226,204,145,163,190,30,49,235,49,117,244,149,203,247) -IMAGE_DATA(188,156,254,12,148,56,122,215,92,137,253,62,175,186,207,166,9,237,92,178,184,225,186,235,75,225,155,83,167,207,172,197) -IMAGE_DATA(6,229,6,184,231,234,181,235,138,172,103,97,14,164,157,133,121,133,162,231,172,167,174,51,214,174,110,138,249,209,129,121) -IMAGE_DATA(5,254,40,227,78,168,104,100,252,124,232,190,16,243,172,212,28,192,38,241,33,134,3,133,32,54,102,61,230,236,180,152) -IMAGE_DATA(247,184,246,192,220,109,30,163,55,117,233,97,99,116,200,174,250,230,206,125,31,3,31,103,9,229,9,190,125,222,213,190) -IMAGE_DATA(101,251,189,165,60,59,37,102,157,226,247,28,123,110,97,142,254,171,71,204,122,25,250,114,10,23,163,196,109,249,158,67) -IMAGE_DATA(205,77,229,210,55,164,250,60,53,11,255,156,62,125,186,40,147,111,206,152,53,39,122,174,80,176,185,125,190,172,93,183) -IMAGE_DATA(161,200,125,22,38,98,137,254,250,204,115,214,179,48,223,30,52,164,168,183,174,51,118,76,218,98,135,114,32,101,142,148) -IMAGE_DATA(37,49,113,129,49,107,96,140,13,220,167,15,136,177,215,135,218,18,99,219,53,116,45,43,35,102,61,166,205,115,199,172) -IMAGE_DATA(187,250,48,70,87,225,226,49,49,237,23,171,15,179,193,199,123,67,215,247,148,184,143,92,103,56,218,144,210,87,41,49) -IMAGE_DATA(235,101,248,21,74,248,250,175,42,49,235,49,250,114,95,185,40,192,154,235,251,206,151,254,68,122,91,97,60,224,119,138) -IMAGE_DATA(158,128,146,247,32,87,254,104,140,181,220,235,64,46,192,86,91,38,223,156,49,115,86,233,124,12,107,222,146,165,203,10) -IMAGE_DATA(255,89,152,11,73,103,97,246,37,156,133,137,28,157,170,174,179,30,49,236,177,190,156,101,141,189,88,127,198,178,197,180) -IMAGE_DATA(47,196,196,79,167,230,53,137,89,87,171,26,179,30,179,31,196,198,172,187,246,192,220,182,230,220,241,90,49,123,134,77) -IMAGE_DATA(247,81,134,31,65,12,92,239,138,201,225,146,18,179,238,139,41,76,245,101,245,181,109,74,62,5,87,189,124,223,42,177) -IMAGE_DATA(190,156,148,58,229,120,70,142,152,245,208,56,52,159,141,34,100,44,148,29,87,73,45,75,232,89,174,62,161,156,137,80) -IMAGE_DATA(79,96,156,148,201,55,161,87,108,107,219,86,183,250,236,63,112,0,60,179,184,248,44,204,206,185,58,115,156,133,249,238) -IMAGE_DATA(176,145,23,113,206,122,196,176,199,218,177,203,242,53,46,59,231,78,172,228,202,97,227,251,46,205,29,63,29,91,206,122) -IMAGE_DATA(196,172,199,124,183,52,67,204,122,140,222,212,181,55,230,172,111,25,185,239,67,225,155,227,49,190,163,62,222,232,106,95) -IMAGE_DATA(31,111,73,241,101,165,124,67,187,184,85,74,204,122,14,159,203,152,58,85,41,102,61,116,159,202,61,54,177,198,229,228) -IMAGE_DATA(123,82,48,222,67,120,95,110,222,137,118,175,138,189,253,165,222,189,179,230,67,210,249,38,236,217,245,230,216,120,223,194) -IMAGE_DATA(69,139,139,178,207,194,84,249,102,45,22,105,68,94,31,42,19,98,57,103,89,104,38,206,25,99,243,116,197,214,199,198) -IMAGE_DATA(79,251,244,1,161,185,161,32,101,199,172,199,248,89,1,49,109,238,218,3,171,18,179,110,235,195,24,95,2,87,125,115) -IMAGE_DATA(231,190,143,129,143,247,198,112,161,148,152,245,178,184,25,80,118,12,144,171,94,62,62,22,235,163,234,179,53,84,37,102) -IMAGE_DATA(61,102,141,73,141,89,87,129,185,155,18,91,105,171,83,236,25,147,224,223,57,203,131,241,85,5,125,231,85,87,92,89) -IMAGE_DATA(148,201,55,103,206,154,93,247,252,149,18,27,91,55,149,122,22,166,206,57,33,123,246,238,45,181,78,49,156,147,18,63) -IMAGE_DATA(20,139,170,114,78,19,98,108,158,169,49,170,38,105,198,152,245,88,221,81,76,155,187,222,85,134,173,62,103,188,86,76) -IMAGE_DATA(249,154,61,102,61,70,255,29,219,190,64,153,156,51,229,76,154,212,115,214,125,247,198,114,78,159,30,191,42,49,235,49) -IMAGE_DATA(185,215,83,114,188,82,158,19,171,107,196,186,7,174,153,131,227,161,221,114,113,207,20,255,140,28,216,186,117,107,169,250) -IMAGE_DATA(77,196,237,44,90,188,164,161,117,60,115,230,51,49,127,193,162,34,229,44,204,222,134,179,48,193,61,77,156,179,108,251) -IMAGE_DATA(122,12,231,196,61,101,149,39,150,119,153,242,36,217,114,37,197,136,169,172,49,229,108,68,204,122,25,207,84,81,207,56) -IMAGE_DATA(232,152,186,164,248,242,133,182,15,199,172,251,145,35,46,88,69,74,204,58,165,60,41,49,235,62,189,124,138,95,176,175) -IMAGE_DATA(94,190,126,141,181,141,250,190,251,170,18,179,78,137,175,9,45,87,74,172,185,106,15,199,152,194,188,66,255,227,157,186) -IMAGE_DATA(224,119,252,29,109,89,150,46,17,243,6,99,44,53,198,168,145,57,61,251,190,214,55,249,252,116,23,223,68,142,162,143) -IMAGE_DATA(63,254,184,97,245,147,192,24,152,59,111,126,145,229,44,204,135,58,206,194,132,127,167,137,115,150,109,95,47,139,115,98) -IMAGE_DATA(78,97,60,135,174,107,177,156,179,222,58,126,142,89,191,128,152,254,138,209,101,197,198,172,187,222,21,163,119,168,122,204) -IMAGE_DATA(186,171,190,245,234,43,23,114,196,5,171,72,213,119,149,201,57,125,227,203,229,107,147,122,206,186,175,95,99,64,89,79) -IMAGE_DATA(170,18,179,78,61,35,68,69,108,142,87,192,199,55,131,11,83,71,160,236,224,240,40,103,232,154,24,195,237,115,225,79) -IMAGE_DATA(119,222,85,148,201,55,17,47,94,5,255,1,137,249,11,22,22,185,206,194,124,229,213,215,10,19,231,132,156,62,125,186) -IMAGE_DATA(180,58,64,63,24,186,7,81,56,167,202,101,127,254,211,203,138,158,61,30,47,40,28,52,150,87,80,129,241,163,230,159) -IMAGE_DATA(143,5,199,172,199,63,159,186,47,229,122,151,141,51,196,198,211,84,61,102,221,214,182,205,16,179,30,227,59,154,18,179) -IMAGE_DATA(14,248,230,93,12,119,1,40,107,89,74,62,5,95,189,124,239,142,1,229,187,152,130,216,57,171,34,247,183,66,106,204) -IMAGE_DATA(186,107,28,86,137,183,80,128,253,141,186,31,197,248,48,228,0,190,127,202,230,155,208,45,54,162,110,46,192,214,159,227) -IMAGE_DATA(44,204,65,131,135,88,57,231,194,69,139,74,171,55,236,207,49,251,144,11,190,189,205,199,65,99,202,67,213,239,171,182) -IMAGE_DATA(84,124,207,97,190,96,29,197,122,129,114,83,159,195,49,235,29,168,103,28,116,108,204,186,109,189,143,205,99,207,49,235) -IMAGE_DATA(241,168,90,204,58,144,195,63,49,166,92,62,219,120,138,142,20,240,245,107,232,183,4,230,145,175,76,85,138,89,207,157) -IMAGE_DATA(227,213,55,54,109,109,211,40,78,150,3,148,53,163,81,245,91,179,102,77,169,124,19,185,216,203,228,94,41,216,182,109) -IMAGE_DATA(27,225,44,204,97,214,179,48,31,237,254,152,145,107,74,25,63,113,82,229,252,39,109,235,29,230,121,232,89,154,250,218) -IMAGE_DATA(23,99,239,167,228,168,15,209,161,98,30,97,207,176,217,21,155,37,102,189,12,110,156,250,252,216,56,232,88,223,75,83) -IMAGE_DATA(27,197,62,11,194,49,235,241,168,90,204,58,224,211,77,199,180,1,133,159,185,234,154,26,179,14,248,116,228,161,122,64) -IMAGE_DATA(202,248,201,225,135,9,161,192,117,127,189,99,214,93,251,104,238,57,20,10,240,247,20,255,16,223,252,106,20,231,28,49) -IMAGE_DATA(98,68,81,38,223,92,181,122,173,88,181,106,117,37,57,39,208,214,206,59,205,103,97,78,180,156,133,217,247,252,89,152) -IMAGE_DATA(200,19,239,226,156,101,251,116,66,239,24,186,23,225,30,125,239,197,184,70,76,123,200,115,76,118,250,24,251,36,202,227) -IMAGE_DATA(250,110,143,205,79,102,155,171,93,57,102,29,237,68,93,163,234,25,7,29,27,107,137,190,146,237,132,113,16,243,189,160) -IMAGE_DATA(10,199,172,199,163,106,49,235,0,133,219,135,198,73,80,248,153,235,153,148,245,192,167,199,203,25,143,79,57,87,135,250) -IMAGE_DATA(204,170,198,172,251,190,67,93,99,211,87,158,122,230,178,68,95,73,223,76,85,23,28,27,235,147,163,191,202,64,239,222) -IMAGE_DATA(47,21,101,242,77,228,99,175,66,252,144,11,200,85,31,115,22,102,59,23,181,218,213,165,148,233,15,18,227,211,41,5) -IMAGE_DATA(58,77,240,198,80,221,166,20,19,183,73,57,139,8,231,42,169,243,27,255,143,57,19,195,5,92,115,41,166,108,141,136) -IMAGE_DATA(89,79,201,137,129,245,74,198,81,162,253,76,182,192,122,198,65,231,58,195,45,85,108,224,152,117,63,170,22,179,46,225) -IMAGE_DATA(107,155,16,238,77,225,176,62,125,160,111,61,160,232,241,124,227,39,228,188,39,234,220,203,225,135,217,140,49,235,62,206) -IMAGE_DATA(41,207,185,12,241,223,10,5,250,219,53,142,203,202,79,151,251,187,148,138,30,61,122,22,101,242,205,150,245,27,235,114) -IMAGE_DATA(22,100,42,218,218,218,130,206,194,132,174,211,199,55,33,199,142,29,43,173,204,141,58,111,210,21,139,148,194,131,115,137) -IMAGE_DATA(109,141,105,150,152,117,32,103,14,96,211,251,98,158,19,27,7,221,232,241,0,201,29,179,238,90,175,187,98,204,122,74) -IMAGE_DATA(92,176,9,185,244,93,148,249,71,137,37,162,216,83,240,119,31,239,72,141,89,7,40,122,114,95,157,240,29,21,50,14) -IMAGE_DATA(115,248,97,54,42,102,221,87,55,23,202,202,43,45,191,249,101,222,36,23,40,122,139,208,248,249,28,99,168,44,148,205) -IMAGE_DATA(55,113,230,121,179,0,241,236,212,179,48,251,15,120,219,171,227,132,108,46,233,124,115,137,70,112,60,215,119,99,163,207) -IMAGE_DATA(93,119,173,123,205,18,179,14,164,248,45,250,218,164,44,127,0,27,98,99,126,114,74,61,99,214,99,234,91,229,152,245) -IMAGE_DATA(156,103,89,75,164,198,172,75,80,215,27,244,191,109,252,66,247,70,177,167,80,246,104,223,122,64,213,227,81,237,225,38) -IMAGE_DATA(27,12,234,163,143,193,28,223,12,190,242,52,34,102,61,245,60,207,122,237,87,104,127,91,127,81,124,136,33,104,59,74) -IMAGE_DATA(251,96,156,82,158,215,136,252,156,167,78,157,42,157,111,46,94,178,172,178,190,156,38,204,158,51,183,240,157,133,249,218) -IMAGE_DATA(235,253,144,191,147,196,57,203,142,159,194,120,141,241,235,140,21,74,204,79,108,76,125,170,248,184,92,179,196,172,3,177) -IMAGE_DATA(54,123,147,232,241,191,245,142,131,46,227,28,185,156,109,30,163,171,206,173,151,180,129,99,214,253,8,233,63,53,223,5) -IMAGE_DATA(202,77,29,75,84,189,107,106,204,58,181,125,212,185,32,227,38,165,47,141,169,127,92,229,202,225,135,9,201,161,43,13) -IMAGE_DATA(69,142,177,153,234,39,30,34,182,243,206,67,244,33,224,209,50,95,139,20,220,143,113,77,253,222,109,84,222,209,163,71) -IMAGE_DATA(143,150,202,55,55,110,218,210,254,247,165,77,197,57,129,73,147,166,20,174,179,48,223,26,244,14,137,111,214,131,115,2) -IMAGE_DATA(177,185,49,67,5,58,85,106,153,234,173,127,165,204,161,102,137,89,7,114,126,127,235,239,43,203,31,192,134,156,252,25) -IMAGE_DATA(123,103,204,243,114,199,172,231,212,75,86,61,102,61,231,89,214,18,57,245,93,152,135,101,234,210,209,158,20,191,252,28) -IMAGE_DATA(49,235,18,185,230,63,230,139,111,127,168,74,204,122,136,159,170,68,14,125,185,43,39,124,25,34,251,68,71,78,219,150) -IMAGE_DATA(239,253,141,202,59,10,206,89,38,223,220,180,165,77,44,93,218,92,122,78,0,253,49,110,194,228,194,116,22,38,98,137) -IMAGE_DATA(134,141,24,77,230,156,101,230,75,82,17,171,15,161,74,8,223,4,208,134,49,185,147,98,132,170,59,136,217,151,26,17) -IMAGE_DATA(179,46,17,195,13,77,162,163,44,127,0,27,168,182,35,106,127,196,240,176,122,197,172,199,204,195,170,199,172,231,58,203) -IMAGE_DATA(90,69,108,251,218,16,155,223,194,39,54,126,96,66,142,152,117,21,57,230,191,212,131,185,174,185,84,99,214,85,228,92) -IMAGE_DATA(163,40,130,189,200,52,22,202,230,157,33,227,185,12,28,61,250,97,169,124,115,107,219,118,177,118,109,75,211,113,78,224) -IMAGE_DATA(204,153,51,198,179,48,219,219,135,204,55,33,99,198,142,175,91,253,49,167,203,176,179,83,236,233,54,148,169,239,180,217) -IMAGE_DATA(41,108,136,121,135,11,101,197,172,75,228,248,254,54,233,14,202,242,7,112,33,199,55,145,180,183,198,240,48,87,27,135) -IMAGE_DATA(62,43,183,94,146,99,214,253,99,150,130,220,188,147,170,223,148,200,17,179,174,34,117,254,203,249,226,27,147,85,137,89) -IMAGE_DATA(47,67,95,78,25,155,184,166,17,185,53,108,245,45,139,119,54,154,111,2,31,126,248,97,169,124,115,219,246,157,162,165) -IMAGE_DATA(165,57,57,39,208,210,178,238,162,179,48,135,12,29,22,196,55,235,205,57,1,172,231,185,244,139,120,78,142,49,138,111) -IMAGE_DATA(205,216,156,76,182,185,19,186,62,197,232,36,125,123,95,61,108,212,169,251,142,254,190,50,253,1,124,136,229,157,232,111) -IMAGE_DATA(85,95,17,202,195,234,25,179,30,195,135,57,102,61,109,142,168,8,141,215,182,9,230,118,168,253,49,71,204,186,169,62) -IMAGE_DATA(161,243,95,159,47,62,14,83,149,152,245,16,31,94,9,95,91,248,224,90,147,208,95,101,250,108,184,246,23,244,95,206) -IMAGE_DATA(119,99,12,84,225,28,79,112,206,50,249,230,142,157,187,193,219,154,150,115,2,147,167,76,43,228,89,152,195,136,113,67) -IMAGE_DATA(141,228,156,18,88,215,99,185,39,206,183,204,193,49,116,96,126,167,112,79,204,65,91,236,31,229,221,161,239,107,84,204) -IMAGE_DATA(186,14,212,55,214,206,214,232,152,117,29,120,127,200,90,138,246,210,223,29,90,118,142,89,143,71,149,99,214,93,64,219) -IMAGE_DATA(197,112,79,211,120,163,34,87,204,186,9,84,253,185,169,252,190,114,81,224,123,111,51,198,172,187,246,4,91,254,105,53) -IMAGE_DATA(110,199,38,224,139,190,156,155,82,124,99,13,101,140,141,193,196,183,71,202,120,46,3,224,156,101,242,205,93,187,247,138) -IMAGE_DATA(117,235,154,155,115,98,205,109,231,142,69,136,15,103,21,56,167,4,198,27,246,85,240,72,219,89,67,248,29,54,112,140) -IMAGE_DATA(239,122,140,79,236,137,178,76,46,14,42,99,50,49,127,27,109,19,168,2,48,22,209,71,216,187,100,254,55,147,224,239) -IMAGE_DATA(104,95,172,127,85,248,182,53,1,235,50,214,67,93,135,163,246,121,149,214,74,70,115,66,206,25,25,215,109,226,37,224) -IMAGE_DATA(166,245,90,251,82,128,186,96,94,163,188,234,124,199,191,241,123,213,203,95,37,184,248,106,174,188,149,148,216,54,42,207) -IMAGE_DATA(198,179,36,151,213,251,95,21,140,115,185,246,87,17,224,156,101,242,205,61,123,63,104,231,156,235,155,154,115,2,203,150) -IMAGE_DATA(173,136,226,155,245,140,33,234,10,0,175,100,110,201,96,48,24,140,50,225,242,55,200,137,28,190,180,93,9,31,30,59) -IMAGE_DATA(86,42,223,220,247,193,1,177,126,125,115,115,206,109,219,182,21,223,253,247,255,136,153,179,231,69,241,206,122,228,74,98) -IMAGE_DATA(48,24,12,6,131,65,131,203,71,54,39,124,156,243,82,211,77,159,62,125,186,84,190,185,255,192,161,118,206,185,161,105) -IMAGE_DATA(57,151,228,155,144,207,191,248,42,74,207,201,156,147,193,96,48,24,140,234,192,197,3,115,198,224,185,124,138,99,243,51) -IMAGE_DATA(52,59,202,228,155,7,14,29,17,235,55,52,39,231,84,249,166,148,121,243,23,6,235,58,203,62,251,146,193,96,48,24) -IMAGE_DATA(12,6,29,190,216,163,28,126,240,190,24,192,148,152,178,102,198,152,113,19,138,178,248,230,161,195,71,197,134,13,27,155) -IMAGE_DATA(170,93,49,214,118,236,216,217,137,111,198,234,58,143,29,59,214,232,42,49,24,12,6,131,193,248,30,190,252,83,208,65) -IMAGE_DATA(166,248,90,66,87,234,202,49,134,191,93,106,118,117,137,73,147,167,20,101,241,205,35,71,143,137,13,27,155,135,115,130) -IMAGE_DATA(111,30,60,116,184,56,247,221,127,11,147,128,119,78,158,58,35,72,215,89,213,184,97,6,131,193,96,48,46,69,80,243) -IMAGE_DATA(174,171,103,155,251,32,243,177,80,242,169,230,138,141,111,70,204,159,191,160,40,139,111,126,120,236,99,177,177,73,56,231) -IMAGE_DATA(231,159,127,46,62,250,248,120,113,246,220,119,194,44,29,188,179,189,222,100,206,57,108,68,222,243,64,24,12,6,131,193) -IMAGE_DATA(96,164,33,229,60,123,112,74,53,63,81,232,253,41,231,8,119,5,180,181,181,149,198,55,143,125,116,92,172,107,130,24) -IMAGE_DATA(162,35,71,142,136,79,62,61,85,124,123,246,156,48,203,5,238,249,245,63,191,105,154,220,156,12,6,131,193,96,48,58) -IMAGE_DATA(35,199,121,188,204,55,195,113,238,220,185,210,248,230,199,199,79,138,141,173,155,42,221,198,91,182,108,45,254,253,237,89) -IMAGE_DATA(97,151,206,28,116,210,228,169,36,93,39,199,172,51,24,12,6,131,81,77,212,139,119,194,127,243,82,182,167,235,24,62) -IMAGE_DATA(124,100,81,6,223,60,126,226,111,184,190,146,188,235,187,239,190,19,59,119,237,46,190,249,215,183,226,95,255,182,201,217) -IMAGE_DATA(154,232,60,116,217,242,149,36,206,201,241,67,12,6,131,193,96,84,23,240,195,140,61,95,210,39,41,231,53,119,101,60) -IMAGE_DATA(209,179,87,49,97,226,228,236,124,83,74,213,0,91,250,223,254,254,143,226,159,223,252,91,124,243,47,155,124,43,108,124) -IMAGE_DATA(20,117,100,95,78,6,131,193,96,48,186,6,224,227,9,126,152,194,63,213,179,123,47,181,51,134,66,128,184,254,203,126) -IMAGE_DATA(244,227,98,201,210,229,217,249,38,4,58,197,42,0,229,216,218,182,173,248,250,159,255,18,82,254,249,141,73,254,45,92) -IMAGE_DATA(124,244,139,47,191,246,114,206,169,83,167,51,231,100,144,161,174,115,151,106,14,13,70,94,168,103,61,55,27,212,120,141) -IMAGE_DATA(70,151,133,113,105,2,235,48,120,35,4,28,210,36,176,205,203,107,88,151,25,134,159,255,244,178,226,183,215,93,95,192) -IMAGE_DATA(190,158,147,111,66,78,156,56,209,232,234,137,157,59,119,138,147,39,255,86,124,245,245,55,66,10,226,129,58,11,141,143) -IMAGE_DATA(142,24,53,214,105,95,223,179,119,111,163,171,204,104,34,184,248,129,180,253,64,248,60,122,6,21,114,60,97,220,52,186) -IMAGE_DATA(44,18,234,88,182,157,247,130,107,100,217,113,142,75,157,139,120,73,3,28,170,25,214,26,89,198,75,53,175,122,87,64) -IMAGE_DATA(239,23,94,172,237,121,55,94,127,67,177,122,237,186,108,124,19,178,177,181,181,97,227,226,228,201,147,224,127,197,151,95) -IMAGE_DATA(125,45,190,252,234,159,231,229,171,175,77,66,231,163,19,38,77,177,114,78,182,171,51,66,225,90,67,213,51,123,89,7) -IMAGE_DATA(202,160,64,229,118,24,63,141,46,143,132,26,179,97,179,61,226,119,89,118,92,207,168,31,212,188,149,85,5,244,137,178) -IMAGE_DATA(140,85,26,219,140,48,168,231,52,221,212,206,59,215,111,216,152,133,111,66,26,113,230,58,236,232,219,183,111,47,190,248) -IMAGE_DATA(242,43,209,33,95,95,36,29,28,84,149,48,62,234,226,156,108,87,103,228,132,60,179,23,190,66,141,46,11,131,145,2) -IMAGE_DATA(124,83,85,157,211,92,202,144,249,204,171,236,211,160,114,149,156,103,163,51,234,143,107,175,186,250,252,122,112,211,13,55) -IMAGE_DATA(22,11,23,46,78,230,155,245,142,93,7,215,220,180,105,83,241,249,23,95,138,11,242,213,69,114,129,135,134,243,81,201) -IMAGE_DATA(73,39,76,154,108,229,156,200,63,85,5,96,110,198,216,71,106,231,49,181,223,155,162,83,147,207,72,189,198,5,138,15) -IMAGE_DATA(77,106,61,82,32,253,129,82,33,237,238,141,182,145,166,140,139,28,99,10,247,250,198,115,74,155,203,50,186,198,20,229) -IMAGE_DATA(154,50,145,107,76,169,72,237,155,16,127,54,233,183,156,147,211,96,76,164,182,9,101,108,197,34,101,204,200,254,78,25) -IMAGE_DATA(111,33,99,38,54,143,100,236,94,163,63,131,50,6,217,238,211,117,160,231,170,250,217,143,127,82,140,30,53,166,72,225) -IMAGE_DATA(155,82,202,94,163,97,67,223,218,182,189,56,243,217,23,226,179,207,165,124,217,73,46,230,162,241,124,212,198,57,27,157) -IMAGE_DATA(7,30,125,120,235,205,183,92,20,119,7,95,221,1,253,7,56,243,53,224,111,35,71,140,44,212,239,14,121,47,126,183) -IMAGE_DATA(221,139,156,99,247,221,115,111,237,249,248,55,190,59,245,103,200,191,169,101,212,175,129,111,135,233,29,170,141,16,127,199) -IMAGE_DATA(26,35,245,126,170,191,154,186,246,224,30,211,53,182,53,145,98,131,116,249,57,233,118,64,60,71,245,207,148,126,105,182) -IMAGE_DATA(54,84,159,173,62,211,151,131,67,109,27,159,13,18,123,136,203,135,206,5,244,177,94,31,232,92,125,118,45,244,9,222) -IMAGE_DATA(171,159,59,44,243,135,216,238,131,46,76,237,15,253,253,166,119,155,218,220,230,235,165,183,183,180,229,186,250,203,116,141) -IMAGE_DATA(28,147,58,240,27,165,95,76,253,174,223,143,254,194,191,81,63,189,29,209,182,182,49,37,219,208,229,15,25,219,175,104) -IMAGE_DATA(11,83,191,202,251,241,110,181,92,148,115,6,85,200,177,234,242,213,67,25,244,57,46,251,196,198,175,114,180,43,21,182) -IMAGE_DATA(103,163,189,125,115,208,86,55,223,189,177,235,144,126,141,169,77,77,245,51,141,31,217,126,54,46,168,143,121,211,90,141) -IMAGE_DATA(103,234,243,6,245,246,141,33,142,19,111,78,232,92,0,2,78,177,115,215,158,104,190,9,57,116,232,112,246,178,98,220) -IMAGE_DATA(239,221,187,79,124,176,255,96,113,250,204,231,2,114,230,51,85,190,232,36,23,248,104,103,78,26,194,71,39,76,52,115) -IMAGE_DATA(206,70,229,228,68,91,160,159,92,115,18,92,212,116,47,230,51,184,101,204,189,242,157,224,140,210,39,216,36,224,173,184) -IMAGE_DATA(222,117,77,207,30,143,91,125,25,177,118,99,29,50,237,115,16,169,55,113,229,248,197,189,250,122,171,158,129,230,227,65) -IMAGE_DATA(166,253,81,189,223,119,214,174,77,183,35,185,12,214,90,249,155,173,158,234,222,129,235,244,127,155,32,219,196,84,127,23) -IMAGE_DATA(112,173,239,236,96,155,62,196,213,87,190,123,229,125,232,15,23,95,193,59,124,101,52,245,169,124,166,220,159,125,229,83) -IMAGE_DATA(251,158,210,167,170,237,207,197,57,77,253,174,223,111,219,215,165,216,116,223,46,221,120,74,191,186,218,194,118,127,40,167) -IMAGE_DATA(145,191,155,56,39,202,110,226,99,186,152,184,89,72,187,166,196,46,129,71,249,198,190,109,92,80,218,215,116,111,236,58) -IMAGE_DATA(164,250,70,218,68,239,7,212,207,244,173,162,255,219,196,59,101,253,36,175,164,246,33,165,93,56,110,188,57,97,27,7) -IMAGE_DATA(151,253,248,39,197,240,97,35,138,24,190,153,219,167,243,240,225,195,162,181,181,181,56,117,250,51,161,202,233,51,82,62) -IMAGE_DATA(55,74,10,31,213,57,233,120,3,231,108,148,142,19,115,77,213,109,130,187,73,93,28,214,89,245,111,250,122,165,246,55) -IMAGE_DATA(120,167,220,199,1,157,139,74,222,168,66,189,23,255,5,167,148,107,13,214,62,249,119,124,203,72,190,105,187,198,180,110) -IMAGE_DATA(200,253,5,107,148,204,125,38,191,103,241,95,117,173,147,252,20,107,170,122,141,186,254,234,103,65,168,223,207,62,29,130) -IMAGE_DATA(190,94,203,231,235,235,46,202,140,103,161,142,186,110,204,244,14,245,62,245,185,82,159,164,222,43,127,151,237,39,215,126) -IMAGE_DATA(151,173,82,94,19,226,111,175,243,18,148,67,142,41,148,67,109,119,93,239,171,142,41,93,103,161,115,81,189,61,212,189) -IMAGE_DATA(83,190,95,230,84,150,186,35,149,171,200,246,197,239,166,49,101,242,129,149,247,168,237,174,206,23,211,152,114,93,163,235) -IMAGE_DATA(87,212,50,186,236,141,166,126,215,203,47,251,14,237,47,251,94,31,83,250,59,92,49,22,190,126,85,185,132,254,92,117) -IMAGE_DATA(44,170,237,33,161,183,139,250,59,68,229,13,168,163,252,93,125,142,139,175,235,101,87,203,32,117,234,174,126,87,251,37) -IMAGE_DATA(166,93,41,80,249,166,212,25,163,108,40,187,58,246,77,229,83,203,175,218,36,244,113,15,209,249,156,186,142,133,172,67) -IMAGE_DATA(210,238,175,215,95,254,166,219,187,245,250,161,31,229,154,173,151,211,244,221,162,207,61,249,12,188,3,255,85,199,143,186) -IMAGE_DATA(166,73,255,9,181,158,106,223,177,142,179,185,97,210,117,74,185,250,138,43,107,243,40,148,115,110,222,210,22,205,199,48) -IMAGE_DATA(150,193,51,17,255,126,228,232,177,226,211,83,103,132,73,78,157,62,35,116,30,218,153,143,154,57,105,40,31,53,113,206) -IMAGE_DATA(70,233,56,97,187,118,241,66,117,15,2,223,147,191,99,158,75,174,136,62,55,125,151,170,121,75,112,141,237,111,166,61) -IMAGE_DATA(2,208,117,175,166,107,84,221,167,190,118,232,251,163,126,175,110,115,241,93,99,178,201,218,214,113,21,182,231,235,123,129) -IMAGE_DATA(169,126,42,7,211,223,239,211,179,250,226,135,212,125,194,4,89,62,93,151,230,131,250,92,83,157,84,110,160,150,91,253) -IMAGE_DATA(29,125,103,210,61,168,253,161,243,45,125,239,52,237,251,186,14,199,180,223,184,218,69,189,215,164,75,211,117,42,166,49) -IMAGE_DATA(229,138,191,166,196,254,186,250,93,231,78,166,250,169,215,232,127,119,197,88,168,58,194,144,126,85,231,186,203,215,79,157) -IMAGE_DATA(15,122,185,40,241,67,42,223,214,251,94,231,172,38,168,245,211,235,158,218,174,62,96,172,75,46,107,27,187,106,253,212) -IMAGE_DATA(231,251,184,154,126,141,94,255,212,117,8,240,249,218,162,126,42,87,116,249,42,81,230,158,105,125,208,191,43,116,112,252) -IMAGE_DATA(80,215,4,197,119,2,190,158,207,61,243,108,177,109,219,14,50,239,12,201,13,127,226,228,201,90,44,208,230,205,91,139) -IMAGE_DATA(127,124,114,74,124,242,41,228,180,85,62,61,117,218,200,67,47,230,163,20,78,74,227,163,122,126,206,241,19,39,53,68) -IMAGE_DATA(199,169,238,93,224,119,182,235,36,247,83,175,81,249,160,107,125,85,245,164,42,212,53,76,229,178,42,160,115,245,93,3) -IMAGE_DATA(158,108,219,103,228,239,88,203,77,252,69,93,131,108,215,168,251,165,190,214,170,223,221,182,250,171,247,235,107,189,186,199) -IMAGE_DATA(217,244,136,182,125,28,80,231,154,169,15,124,241,67,46,206,172,238,17,33,57,103,212,242,186,248,133,73,127,170,234,201) -IMAGE_DATA(92,28,222,166,239,81,235,99,107,79,117,79,179,93,163,62,71,133,218,151,148,54,181,93,163,182,145,237,59,201,21,243) -IMAGE_DATA(229,234,119,151,94,222,84,70,151,158,85,237,131,148,126,197,115,48,134,124,231,248,169,239,214,175,163,196,15,217,248,186) -IMAGE_DATA(90,118,106,187,234,99,67,109,87,219,124,112,181,171,15,234,189,182,231,171,235,181,228,76,248,77,206,7,215,183,161,122) -IMAGE_DATA(175,222,6,169,235,16,224,27,27,186,205,197,6,27,175,86,231,158,203,207,199,197,89,57,126,168,235,194,231,27,168,202) -IMAGE_DATA(53,87,254,166,120,182,157,127,206,158,53,71,28,56,112,200,202,57,247,236,217,211,233,61,224,161,39,78,156,20,173,237) -IMAGE_DATA(252,114,195,134,141,237,28,118,123,241,247,127,124,42,116,1,239,180,9,141,143,218,57,105,40,31,69,121,244,124,156,141) -IMAGE_DATA(138,85,119,233,8,85,64,23,10,110,39,175,81,231,191,139,171,2,54,110,170,234,87,109,243,63,244,26,21,186,255,149) -IMAGE_DATA(9,161,215,232,107,37,37,38,220,165,211,82,245,26,182,53,212,197,79,92,123,52,37,15,157,109,125,7,84,191,69,91) -IMAGE_DATA(221,76,160,158,137,36,207,226,144,223,9,106,59,249,226,94,109,251,138,250,187,111,79,162,236,91,250,30,174,150,209,182) -IMAGE_DATA(111,170,125,98,187,198,165,143,147,191,187,98,96,92,253,46,127,119,113,51,151,253,94,229,31,182,223,67,250,53,4,46) -IMAGE_DATA(93,166,252,221,229,43,105,227,235,106,217,93,235,156,139,87,167,182,171,15,20,222,8,160,92,170,47,136,218,102,190,111) -IMAGE_DATA(67,27,231,164,172,67,174,239,28,215,119,53,160,251,188,184,202,104,91,47,125,122,86,9,57,119,77,235,22,231,141,235) -IMAGE_DATA(186,80,237,174,161,2,29,232,93,119,220,89,220,223,173,91,241,74,159,87,206,203,208,33,67,139,13,173,155,138,141,237) -IMAGE_DATA(130,252,73,39,78,254,93,64,78,254,237,31,231,229,111,127,255,164,147,152,56,40,149,143,250,56,105,12,31,69,28,191) -IMAGE_DATA(202,57,215,172,89,219,176,126,82,109,227,33,247,169,60,207,183,206,169,156,83,93,135,229,239,174,119,135,92,163,199,41) -IMAGE_DATA(185,246,245,144,107,108,223,198,212,220,194,182,125,84,189,159,106,111,212,247,122,151,158,149,18,139,98,211,93,168,123,68) -IMAGE_DATA(136,190,70,189,47,52,142,66,229,5,190,253,218,102,63,163,124,3,200,189,157,114,141,94,7,181,47,93,49,223,54,222) -IMAGE_DATA(36,65,209,199,229,136,31,10,125,63,96,106,67,117,172,166,198,199,200,152,120,87,156,140,222,55,46,91,131,10,211,124) -IMAGE_DATA(82,203,238,227,115,106,251,169,156,63,71,187,186,160,242,57,215,243,77,8,57,163,212,212,190,57,214,33,95,174,126,221) -IMAGE_DATA(199,88,250,82,155,68,173,143,250,44,117,94,197,248,49,1,85,201,27,199,40,7,122,124,71,14,217,183,111,127,45,238) -IMAGE_DATA(253,216,199,39,196,71,223,11,98,146,106,162,158,151,249,61,31,61,81,65,62,186,112,241,210,162,209,113,67,128,186,142) -IMAGE_DATA(235,249,136,124,80,121,164,47,222,79,245,239,85,33,249,174,41,222,92,66,222,103,179,171,187,174,161,172,255,148,107,108) -IMAGE_DATA(122,31,170,111,16,37,126,200,197,47,108,239,7,92,252,137,162,115,177,237,55,178,204,161,252,66,221,123,66,247,78,87) -IMAGE_DATA(124,132,14,19,135,160,124,3,80,242,12,184,174,161,216,119,41,215,216,244,113,148,111,32,128,18,63,228,186,223,246,126) -IMAGE_DATA(181,13,85,206,149,194,137,228,115,41,241,226,166,119,3,212,243,135,76,101,84,203,238,59,235,208,166,75,75,109,87,31) -IMAGE_DATA(84,62,21,162,31,165,248,122,72,168,237,163,199,27,82,214,49,151,142,208,247,157,229,203,221,102,19,149,91,218,190,179) -IMAGE_DATA(108,237,97,138,127,163,142,3,70,243,66,245,199,203,33,125,94,238,83,28,249,240,35,113,84,202,177,143,107,249,151,62) -IMAGE_DATA(4,15,149,66,229,163,138,142,52,142,143,198,217,236,101,110,78,216,212,27,153,159,65,93,95,67,207,136,147,247,129,55) -IMAGE_DATA(186,174,83,231,185,170,135,84,247,117,83,220,18,245,26,151,77,135,178,254,83,174,177,125,27,135,198,15,233,252,128,122) -IMAGE_DATA(191,237,253,62,254,68,213,185,232,188,85,221,131,66,125,158,98,253,217,212,113,82,230,222,233,242,83,144,112,217,16,229) -IMAGE_DATA(239,46,125,80,202,53,57,227,135,92,176,189,223,246,29,148,226,167,168,199,117,96,60,99,174,234,220,202,53,151,93,190) -IMAGE_DATA(4,18,148,248,26,223,58,167,114,39,117,12,133,182,107,40,167,241,197,242,217,224,243,177,84,161,182,143,218,190,169,235) -IMAGE_DATA(144,90,126,27,31,212,243,52,80,69,133,109,29,85,225,250,54,161,126,227,51,154,27,122,30,158,84,129,221,29,185,62) -IMAGE_DATA(15,29,249,176,38,135,33,71,143,213,114,127,214,196,196,71,191,207,9,154,151,143,186,57,169,141,143,226,29,141,142,83) -IMAGE_DATA(151,80,99,111,66,247,17,121,159,207,151,83,93,3,84,93,170,47,246,133,122,141,107,141,161,172,255,41,215,184,244,143) -IMAGE_DATA(166,58,232,123,2,229,126,215,183,185,143,99,81,117,46,250,126,167,230,129,113,221,103,66,172,143,62,53,198,3,176,249) -IMAGE_DATA(175,81,222,29,122,141,202,111,40,246,93,159,95,155,94,87,253,26,151,47,154,132,203,167,148,114,246,160,235,253,54,125) -IMAGE_DATA(94,10,231,84,251,203,53,166,92,115,153,162,227,178,233,218,66,202,174,250,53,170,191,83,230,18,213,254,110,66,44,231) -IMAGE_DATA(164,196,204,73,216,252,113,41,62,142,62,29,161,143,15,82,231,182,13,84,223,10,151,239,11,85,87,205,104,126,160,127) -IMAGE_DATA(99,125,59,77,242,242,75,47,23,7,14,30,22,53,57,116,68,28,148,114,248,104,237,172,35,157,143,30,142,224,163,31) -IMAGE_DATA(73,62,170,228,18,205,193,71,91,214,109,40,26,237,195,41,65,229,156,176,141,203,243,132,228,111,84,206,169,218,224,213) -IMAGE_DATA(117,78,125,183,77,111,65,185,38,87,252,16,197,223,81,191,134,178,79,184,98,23,40,190,69,174,247,251,248,19,133,79) -IMAGE_DATA(3,170,14,71,174,203,161,249,223,77,101,178,141,41,25,15,47,243,244,235,245,244,237,75,182,120,7,202,222,73,185,198) -IMAGE_DATA(230,35,75,177,239,166,94,67,105,3,87,108,127,42,183,179,233,243,98,251,53,196,151,210,229,151,104,243,37,80,97,243) -IMAGE_DATA(105,160,114,78,74,252,144,107,46,185,226,241,124,160,172,37,178,124,242,12,49,253,157,46,46,230,138,89,79,93,135,40) -IMAGE_DATA(124,80,254,221,23,63,132,241,98,226,131,20,253,3,224,250,54,137,245,181,101,52,39,212,49,155,42,208,117,110,221,182) -IMAGE_DATA(67,236,219,127,16,103,8,137,15,14,28,170,9,98,115,246,183,243,208,253,46,62,250,61,39,165,242,209,15,137,124,244) -IMAGE_DATA(56,145,143,78,152,52,165,152,58,117,122,37,124,73,212,189,199,102,187,86,215,52,117,173,81,191,33,40,207,215,253,69) -IMAGE_DATA(115,199,15,233,215,80,214,255,212,24,35,117,76,154,160,159,143,160,242,35,170,111,17,37,190,216,23,63,228,211,185,232) -IMAGE_DATA(185,249,124,251,23,245,89,54,251,182,45,22,128,178,47,185,114,12,82,246,206,148,24,163,92,241,67,148,216,108,74,30) -IMAGE_DATA(38,189,223,169,125,238,122,191,77,159,71,177,79,155,190,129,168,182,95,245,94,189,255,169,177,122,54,190,72,225,101,122) -IMAGE_DATA(110,76,91,142,168,50,226,135,0,74,174,7,83,190,5,106,254,42,61,95,187,68,142,117,136,226,175,162,250,86,184,190) -IMAGE_DATA(101,109,223,123,20,223,10,192,245,109,66,177,33,48,186,22,124,103,85,133,200,83,79,60,85,236,217,183,95,64,246,126) -IMAGE_DATA(112,224,188,236,131,180,243,80,10,31,61,224,226,163,170,205,222,199,71,219,133,194,71,241,252,73,83,166,86,102,188,171) -IMAGE_DATA(223,190,224,108,250,92,86,207,17,210,245,153,106,142,37,19,95,85,251,26,190,21,250,179,41,241,67,33,49,70,250,53) -IMAGE_DATA(185,226,135,40,241,189,166,189,72,143,159,115,197,23,187,124,139,66,227,139,77,207,167,156,207,172,151,53,214,207,88,213) -IMAGE_DATA(71,152,184,163,58,46,244,61,206,151,255,80,109,83,87,236,139,139,87,164,92,67,177,239,166,198,24,169,124,82,239,55) -IMAGE_DATA(253,219,64,111,3,138,142,149,250,126,151,31,71,72,191,218,124,111,93,245,114,249,152,198,248,52,248,242,58,234,254,166) -IMAGE_DATA(250,216,163,234,47,41,125,111,131,250,14,19,119,84,215,1,181,124,250,217,147,166,51,165,212,123,93,253,26,187,14,81) -IMAGE_DATA(56,167,126,6,149,254,119,189,156,54,159,19,106,254,81,87,206,122,230,156,151,22,114,242,206,25,51,103,139,93,123,246) -IMAGE_DATA(137,221,123,63,56,47,123,32,251,246,139,122,242,209,35,68,62,186,108,249,138,202,141,117,213,246,13,222,9,254,8,81) -IMAGE_DATA(99,191,76,156,81,231,41,120,14,250,22,107,133,250,76,240,70,125,29,204,21,63,228,186,38,37,118,152,122,141,126,150) -IMAGE_DATA(55,174,193,90,39,239,193,254,38,255,191,204,248,98,211,250,170,238,179,120,134,60,247,210,151,59,207,183,247,80,160,114) -IMAGE_DATA(113,188,91,230,107,84,117,45,166,51,68,244,181,1,237,139,114,163,204,190,123,67,253,36,40,49,70,250,53,20,251,174) -IMAGE_DATA(139,55,80,174,209,207,72,194,187,192,19,212,51,74,213,243,228,213,123,41,58,86,215,251,125,109,168,150,141,218,175,234) -IMAGE_DATA(185,2,178,62,50,62,68,61,179,92,157,75,174,120,99,105,183,151,247,75,157,160,143,111,171,101,148,103,74,162,127,209) -IMAGE_DATA(102,106,249,76,186,190,212,184,44,10,212,188,238,178,157,100,251,170,243,201,244,108,181,223,241,12,252,27,109,64,185,151) -IMAGE_DATA(154,79,212,181,14,234,223,35,114,173,209,115,175,169,245,67,185,100,253,244,62,48,149,147,50,247,124,246,119,253,44,8) -IMAGE_DATA(92,35,199,18,163,107,35,23,239,188,234,215,87,20,173,155,182,136,157,187,247,158,151,93,144,118,30,42,165,108,62,122) -IMAGE_DATA(208,197,71,21,29,233,218,150,117,149,227,155,128,47,198,11,252,209,166,243,242,245,35,120,171,239,236,66,219,222,159,26) -IMAGE_DATA(99,20,178,247,199,198,24,233,235,168,42,88,123,213,191,167,198,23,135,198,15,1,58,127,113,189,79,45,183,179,64,4) -IMAGE_DATA(168,103,42,155,4,251,134,109,76,233,60,94,23,180,131,233,94,202,222,153,18,99,68,201,177,148,35,198,8,253,106,107) -IMAGE_DATA(59,236,153,166,115,104,36,40,223,89,174,247,251,190,131,98,251,213,183,78,160,79,125,249,96,109,185,118,228,251,124,124) -IMAGE_DATA(91,215,101,234,98,210,43,231,106,87,42,124,237,228,210,205,251,234,102,187,55,71,60,190,254,93,33,197,116,158,130,107) -IMAGE_DATA(252,216,250,128,50,247,0,159,253,221,228,67,4,225,24,246,75,3,170,221,54,69,110,191,245,182,162,109,251,78,177,109) -IMAGE_DATA(199,46,177,125,231,110,177,99,215,158,243,162,114,81,31,31,221,173,243,209,125,251,179,241,209,53,107,215,86,146,111,74) -IMAGE_DATA(96,126,74,253,164,20,216,206,41,231,209,98,127,192,181,234,189,240,221,116,125,51,227,30,169,79,181,237,253,234,53,174) -IMAGE_DATA(243,121,76,215,224,255,229,55,180,141,175,226,189,185,174,145,57,174,33,216,119,245,88,106,245,204,16,9,121,14,160,107) -IMAGE_DATA(189,115,189,95,234,17,76,207,150,64,59,168,101,131,216,184,179,107,191,143,129,236,3,245,221,216,223,40,207,199,53,104) -IMAGE_DATA(71,245,94,87,61,229,61,178,61,82,174,193,152,55,93,163,246,133,173,28,57,175,65,91,169,99,74,61,231,208,118,191) -IMAGE_DATA(252,157,58,166,244,251,41,237,19,219,175,248,187,90,39,57,22,229,58,225,107,23,211,123,85,157,151,156,79,190,178,75) -IMAGE_DATA(157,185,62,95,125,231,113,166,180,107,8,244,190,151,237,68,121,38,202,167,207,27,212,215,85,183,212,117,200,87,110,211) -IMAGE_DATA(117,250,154,228,235,3,106,219,82,198,0,174,209,115,208,115,12,251,165,3,244,181,154,47,60,86,30,184,255,129,98,253) -IMAGE_DATA(198,77,98,227,166,45,162,117,243,86,177,105,75,155,216,188,117,155,216,218,182,67,68,243,81,93,71,186,47,142,143,238) -IMAGE_DATA(218,189,187,177,141,204,96,120,32,99,145,216,207,137,193,96,48,24,93,25,248,182,9,57,155,221,38,247,223,215,173,88) -IMAGE_DATA(185,122,173,88,181,166,69,172,94,187,78,172,109,217,32,90,214,111,20,235,54,180,138,26,31,109,189,152,143,110,105,219) -IMAGE_DATA(78,230,163,59,35,248,104,251,59,138,227,199,79,52,182,113,25,12,15,84,123,94,138,126,134,193,96,48,24,140,102,65) -IMAGE_DATA(142,115,50,239,189,251,222,98,209,226,101,98,241,210,229,98,201,178,21,98,233,242,149,98,217,138,85,98,197,202,53,194) -IMAGE_DATA(197,71,55,180,110,22,173,155,46,230,163,200,197,100,228,163,38,29,169,198,71,87,172,92,213,208,243,133,24,12,27,164) -IMAGE_DATA(223,60,108,181,174,184,13,6,131,193,96,48,186,50,96,107,79,213,121,222,253,151,187,139,217,115,223,23,115,230,205,23) -IMAGE_DATA(243,222,95,40,222,159,191,72,204,95,184,88,44,88,180,68,212,248,232,18,55,31,93,211,178,94,180,172,187,152,143,194) -IMAGE_DATA(102,223,137,143,110,239,204,71,55,182,110,46,14,28,228,24,56,70,117,97,138,209,137,137,179,101,48,24,12,6,163,43) -IMAGE_DATA(0,122,152,148,248,162,235,174,185,182,24,54,124,148,152,58,109,166,152,54,99,150,152,62,115,182,152,57,107,174,152,53) -IMAGE_DATA(123,158,144,124,116,238,251,11,46,226,163,11,23,47,237,224,163,75,47,240,209,229,43,87,139,149,171,46,230,163,107,215) -IMAGE_DATA(109,232,204,71,55,183,181,115,215,149,172,219,100,84,30,240,223,151,249,118,224,191,201,49,155,12,6,131,193,184,212,1) -IMAGE_DATA(254,134,120,228,88,238,249,211,31,254,168,120,238,185,231,139,113,227,39,137,241,19,38,139,9,19,167,136,137,147,167,138) -IMAGE_DATA(73,83,166,137,41,83,103,152,249,232,28,141,143,46,184,192,71,23,45,89,214,137,143,174,88,181,70,44,92,180,168,56) -IMAGE_DATA(119,238,92,163,155,139,193,96,48,24,12,6,131,145,0,201,61,99,227,219,111,187,249,214,162,255,128,183,196,240,145,163) -IMAGE_DATA(197,200,81,99,197,168,209,227,196,232,49,227,197,152,113,19,196,216,241,19,47,240,209,73,26,31,157,222,193,71,103,204) -IMAGE_DATA(154,211,137,143,206,155,191,80,204,155,247,62,115,77,6,131,193,96,48,24,140,46,8,216,1,213,243,113,66,228,142,219) -IMAGE_DATA(239,40,250,246,125,83,188,51,228,61,49,228,221,97,226,221,247,70,136,247,134,141,20,176,193,15,31,49,90,140,24,53) -IMAGE_DATA(230,2,31,29,107,230,163,237,191,21,45,45,235,156,249,206,24,12,6,131,193,96,48,24,93,3,200,233,130,56,247,24) -IMAGE_DATA(254,121,215,237,119,22,79,61,245,140,24,48,112,144,24,248,214,96,241,214,160,119,196,160,193,67,197,224,119,222,237,224) -IMAGE_DATA(163,67,135,137,161,239,13,191,192,71,135,143,44,102,205,158,83,156,62,125,186,209,213,102,48,24,12,6,131,193,96,52) -IMAGE_DATA(16,242,60,26,196,188,83,109,240,87,92,254,203,226,174,59,239,42,158,124,242,105,241,102,191,129,231,101,232,208,247,138) -IMAGE_DATA(105,211,102,20,173,173,155,196,217,179,103,27,93,53,6,131,193,96,48,24,12,70,133,1,93,40,228,163,143,62,170,113) -IMAGE_DATA(82,147,224,111,167,78,157,18,123,246,236,97,123,57,131,193,96,48,24,12,6,131,193,96,48,24,12,6,131,193,96,48) -IMAGE_DATA(24,12,6,131,193,96,48,24,12,6,131,193,96,48,24,12,6,131,193,96,48,24,12,6,131,193,96,48,24,12,6,131) -IMAGE_DATA(193,96,48,24,12,6,131,193,96,48,24,12,6,131,193,96,48,24,12,70,23,194,255,2,41,157,248,219,0,0,0,0) -IMAGE_END_DATA(14016, 1) - -IMAGE_BEGIN_DATA -IMAGE_DATA(120,156,237,125,103,148,86,69,182,246,253,230,58,146,68,81,71,135,96,104,204,130,2,10,74,84,26,20,16,17,109,37) -IMAGE_DATA(24,72,77,82,140,96,132,1,129,38,103,108,3,34,72,104,162,136,2,13,146,21,109,243,68,135,81,103,12,227,204,244) -IMAGE_DATA(120,103,221,143,181,88,206,234,239,199,224,207,250,122,119,91,80,20,21,118,133,243,158,211,205,126,214,218,75,124,251,156) -IMAGE_DATA(58,21,119,61,181,119,237,170,255,90,249,179,113,255,69,32,16,8,4,2,129,64,32,16,8,4,2,129,64,32,16,8) -IMAGE_DATA(4,2,129,64,32,16,8,4,2,129,64,32,16,8,4,2,129,64,32,16,8,4,2,129,64,32,16,8,4,2,129,64) -IMAGE_DATA(32,16,8,4,2,129,64,32,16,8,4,2,129,64,32,16,8,4,2,129,64,32,16,8,4,2,129,64,32,16,8,4) -IMAGE_DATA(2,129,64,32,16,8,4,2,129,64,32,16,8,4,2,129,64,32,16,8,4,2,129,64,32,16,8,4,2,129,64,32) -IMAGE_DATA(16,8,4,2,129,64,32,16,8,4,2,33,93,252,236,255,252,172,81,221,58,117,243,77,146,118,30,9,4,2,129,64) -IMAGE_DATA(32,212,108,0,159,104,250,203,198,101,58,105,216,224,180,194,180,243,152,21,152,234,9,228,212,159,159,218,38,215,121,130) -IMAGE_DATA(111,154,242,116,230,25,141,138,108,105,64,31,184,248,194,60,102,146,28,20,133,64,8,194,57,231,156,155,15,114,97,94) -IMAGE_DATA(243,194,22,45,175,42,210,9,127,238,231,63,255,121,163,180,243,76,32,16,8,39,19,128,147,152,184,198,25,13,79,31) -IMAGE_DATA(151,118,30,179,128,172,242,50,91,251,97,56,167,45,13,224,174,201,151,132,64,192,3,56,35,240,199,252,252,238,101,183) -IMAGE_DATA(246,233,91,62,96,224,61,204,87,32,141,54,109,174,41,190,252,242,43,238,63,247,220,95,182,74,187,108,4,66,18,56) -IMAGE_DATA(229,191,79,201,227,126,43,152,215,65,239,131,136,54,10,178,49,16,146,70,227,115,206,45,53,241,13,242,171,86,3,236) -IMAGE_DATA(189,166,122,186,160,217,121,229,105,228,235,220,179,127,81,98,202,87,253,122,245,11,108,105,216,250,0,124,35,7,69,33) -IMAGE_DATA(16,180,168,95,191,65,222,165,151,94,54,174,83,231,46,165,33,252,82,148,126,253,7,30,185,247,190,193,223,63,248,240) -IMAGE_DATA(163,135,102,207,93,192,230,206,95,196,158,127,241,101,246,228,211,19,14,222,126,123,65,113,227,38,77,114,238,183,32,16) -IMAGE_DATA(146,0,112,76,155,205,132,203,121,77,154,30,76,59,191,132,218,11,232,95,166,254,7,123,253,210,206,99,22,144,85,91) -IMAGE_DATA(160,184,54,85,9,198,223,111,235,3,24,91,233,201,4,88,135,157,125,230,89,197,170,189,12,105,231,173,182,1,252,228) -IMAGE_DATA(49,121,102,255,254,3,255,253,240,35,99,15,191,252,202,114,182,118,253,70,182,122,205,58,182,98,85,9,91,246,234,74) -IMAGE_DATA(182,100,233,114,246,194,75,75,217,115,207,191,196,22,44,42,102,115,230,45,96,79,60,245,76,121,251,14,29,198,213,169) -IMAGE_DATA(83,135,244,32,161,198,194,102,87,16,5,158,77,59,191,132,218,11,83,223,203,59,255,130,138,180,243,151,21,216,184,93) -IMAGE_DATA(90,188,44,134,191,223,150,6,217,186,171,1,252,221,198,207,211,206,99,109,0,236,179,4,191,121,168,207,92,148,65,131) -IMAGE_DATA(135,30,2,27,230,27,91,182,177,77,155,183,176,141,155,54,179,117,27,94,99,37,107,215,179,149,171,215,176,229,43,86) -IMAGE_DATA(177,165,203,94,101,47,46,121,133,21,191,176,132,45,122,238,133,42,187,231,204,217,115,89,209,180,153,108,210,228,169,172) -IMAGE_DATA(50,63,37,167,159,126,122,94,218,245,67,32,184,2,230,114,44,231,36,27,3,33,41,192,28,154,69,219,93,22,1,190) -IMAGE_DATA(115,83,93,165,17,107,5,251,115,66,125,36,182,62,0,2,223,201,65,113,50,13,219,222,10,226,156,225,224,92,179,160) -IMAGE_DATA(224,174,138,88,92,115,240,144,97,135,94,93,185,154,109,127,107,23,219,90,250,22,123,115,107,41,123,253,141,173,236,181) -IMAGE_DATA(215,223,96,235,55,110,98,107,214,109,96,171,74,214,177,87,87,150,176,87,150,175,96,75,150,46,171,242,175,47,46,126) -IMAGE_DATA(145,205,95,248,28,155,61,103,62,155,54,99,54,155,60,101,26,155,48,241,89,246,212,211,19,88,143,94,183,148,52,108) -IMAGE_DATA(216,48,47,237,250,34,16,48,192,232,120,81,48,251,177,8,4,31,216,230,81,90,239,28,67,22,109,129,182,184,38,140) -IMAGE_DATA(143,4,244,11,241,40,51,64,103,99,237,4,105,231,181,166,2,124,232,49,185,102,165,252,184,96,209,115,71,118,239,221) -IMAGE_DATA(207,118,238,222,203,118,236,220,205,182,109,223,201,182,108,219,206,54,191,9,182,206,55,217,134,215,94,255,201,191,190,158) -IMAGE_DATA(173,88,181,134,45,123,117,21,3,159,59,247,175,47,92,252,60,155,51,111,33,155,49,115,14,155,82,52,131,77,156,52) -IMAGE_DATA(133,61,51,254,87,236,241,39,158,102,143,62,54,142,117,234,220,165,248,212,83,79,37,159,59,33,211,112,217,203,9,146) -IMAGE_DATA(198,249,43,132,147,3,182,61,138,116,78,82,53,40,102,253,228,134,205,159,158,118,63,168,201,56,163,81,163,54,16,55) -IMAGE_DATA(30,145,107,178,251,31,120,240,240,174,61,251,216,190,183,15,176,61,251,222,102,240,239,29,59,247,176,210,29,59,217,214) -IMAGE_DATA(210,29,236,141,45,96,235,228,254,245,77,172,100,237,6,182,114,245,90,182,124,197,106,182,116,217,10,246,210,203,199,252) -IMAGE_DATA(235,243,22,44,102,51,103,207,99,69,211,103,178,103,39,23,177,241,191,154,196,158,124,234,25,246,216,216,39,216,67,15) -IMAGE_DATA(63,202,134,12,25,86,113,222,121,231,147,93,136,144,89,184,236,229,36,29,70,72,18,182,61,138,180,143,175,26,181,57) -IMAGE_DATA(102,93,60,63,67,37,39,251,154,23,235,83,39,125,237,14,136,67,143,201,53,65,230,45,88,244,227,129,247,222,103,111) -IMAGE_DATA(31,120,175,146,115,190,91,201,57,223,169,228,156,251,217,91,187,246,86,249,215,183,109,151,253,235,175,179,53,235,54,10) -IMAGE_DATA(254,117,30,75,36,248,215,231,46,96,211,193,191,62,117,26,251,213,196,201,236,169,103,38,176,113,143,63,201,30,126,116) -IMAGE_DATA(44,187,255,254,49,108,232,208,66,214,185,115,151,210,83,78,57,133,108,158,132,204,193,101,47,39,197,172,19,146,132,109) -IMAGE_DATA(143,98,218,249,203,10,178,106,11,140,17,179,78,48,67,55,70,192,118,0,253,2,56,41,112,115,248,47,237,69,193,1) -IMAGE_DATA(246,109,198,182,109,246,31,112,247,145,151,95,89,254,159,247,222,255,144,1,231,124,231,221,50,182,255,157,119,217,222,253) -IMAGE_DATA(239,48,179,127,125,51,91,187,254,53,201,191,94,29,75,196,253,235,115,193,191,62,107,46,155,10,254,245,103,193,191,62) -IMAGE_DATA(145,61,254,100,181,127,125,204,131,15,179,225,195,71,178,123,239,29,196,110,235,211,183,162,97,195,134,52,230,8,153,129) -IMAGE_DATA(235,94,78,138,89,39,36,137,44,218,238,178,136,218,28,179,78,208,67,181,167,2,250,2,197,84,249,3,124,233,49,227) -IMAGE_DATA(209,57,223,4,219,101,217,7,31,49,224,156,239,150,125,80,197,57,171,109,157,199,252,235,111,237,2,255,250,46,201,191) -IMAGE_DATA(254,134,198,191,94,29,75,196,253,235,179,230,128,127,125,86,149,127,125,66,149,127,125,60,27,59,174,218,191,62,114,212) -IMAGE_DATA(253,108,240,224,161,172,127,191,1,192,59,89,147,38,77,10,211,174,231,152,128,254,14,107,42,221,249,96,224,111,1,29) -IMAGE_DATA(152,134,95,12,56,21,124,151,159,111,206,5,124,60,240,123,150,207,250,131,188,65,62,33,191,80,135,188,62,161,158,225) -IMAGE_DATA(183,24,54,3,215,189,156,105,204,101,114,29,64,249,79,102,31,43,180,59,212,135,56,222,224,223,208,150,174,115,15,191) -IMAGE_DATA(215,90,28,27,220,78,146,76,238,245,176,237,81,84,217,238,32,255,80,110,88,11,137,246,31,248,55,191,103,49,233,249) -IMAGE_DATA(24,210,55,141,83,248,91,108,61,147,84,204,58,228,19,222,133,250,84,249,63,248,221,163,170,242,196,136,89,79,19,144) -IMAGE_DATA(127,222,151,228,249,75,87,230,88,128,49,205,237,146,242,247,65,184,13,83,222,7,21,179,78,121,31,230,223,228,125,76) -IMAGE_DATA(206,67,109,210,189,77,155,54,43,136,28,39,116,28,223,20,57,39,247,175,139,182,206,227,253,235,96,235,4,255,250,155) -IMAGE_DATA(6,255,250,210,42,255,58,156,213,89,229,95,159,57,155,77,153,58,157,253,106,210,100,246,116,149,127,253,41,246,8,248) -IMAGE_DATA(215,31,120,144,13,29,54,156,221,93,153,159,59,110,47,96,189,122,246,98,151,95,118,121,73,218,245,29,2,24,127,208) -IMAGE_DATA(255,108,186,79,22,208,99,48,134,147,154,7,184,222,176,217,1,228,113,11,243,67,44,191,15,215,29,88,145,247,56,193) -IMAGE_DATA(152,198,238,177,132,250,199,220,5,8,245,162,250,182,75,61,137,254,27,89,84,122,72,197,245,77,34,247,9,40,151,174) -IMAGE_DATA(127,201,223,115,173,115,16,91,189,185,166,103,227,55,174,121,20,211,114,25,111,24,187,7,228,5,19,135,0,99,53,87) -IMAGE_DATA(115,140,107,204,58,252,63,118,95,8,148,35,38,103,224,92,215,37,150,3,198,78,172,186,180,125,203,231,59,46,245,9) -IMAGE_DATA(207,169,244,150,173,252,182,60,96,246,42,134,214,143,92,55,252,126,120,76,153,99,222,187,10,245,7,253,210,101,111,147) -IMAGE_DATA(44,161,103,136,128,158,240,201,67,210,243,120,46,0,113,233,177,247,110,130,128,63,157,243,77,145,119,30,239,95,63,80) -IMAGE_DATA(201,57,223,102,59,119,239,171,242,175,67,44,209,150,109,59,126,58,171,243,152,127,157,159,213,41,250,215,33,150,168,202) -IMAGE_DATA(191,14,103,117,130,127,125,218,12,54,233,217,169,236,153,9,19,217,19,79,62,205,30,27,251,56,123,240,161,71,216,240) -IMAGE_DATA(17,163,170,252,235,119,221,217,143,221,218,251,86,214,189,91,119,118,201,197,23,151,164,93,239,174,0,93,11,252,204,119) -IMAGE_DATA(140,136,2,233,196,154,7,64,143,184,242,39,149,64,26,161,243,130,107,62,248,92,138,213,125,42,129,185,207,84,151,182) -IMAGE_DATA(253,95,161,162,210,197,174,177,73,60,255,240,95,215,88,18,151,185,95,108,107,93,125,97,226,130,85,98,90,183,184,174) -IMAGE_DATA(207,120,90,48,175,248,204,9,170,188,192,28,225,83,87,48,86,117,229,138,5,108,204,58,244,15,159,50,232,234,196,21) -IMAGE_DATA(208,215,67,120,66,168,47,52,118,204,186,111,159,16,219,4,144,149,152,117,91,253,136,125,192,213,207,3,18,186,126,129) -IMAGE_DATA(252,185,234,130,36,250,82,172,57,161,38,238,25,77,138,111,206,95,184,248,71,153,111,98,252,235,213,103,117,238,248,41) -IMAGE_DATA(150,232,152,127,189,250,172,206,181,12,206,243,20,253,235,213,177,68,224,95,159,207,166,129,127,125,10,248,215,225,172,206) -IMAGE_DATA(106,255,250,195,143,60,198,70,141,126,128,13,30,50,148,13,232,63,144,245,189,173,47,235,113,83,15,118,67,231,46,172) -IMAGE_DATA(121,94,94,73,218,245,143,133,207,220,103,19,24,123,33,243,64,8,79,51,9,240,37,95,189,226,250,45,168,87,208,221) -IMAGE_DATA(161,117,107,226,157,174,252,207,85,84,60,221,101,30,227,247,203,96,249,68,104,157,131,152,120,148,107,108,168,46,95,33) -IMAGE_DATA(121,12,201,7,175,83,113,62,114,57,211,79,37,73,199,165,96,214,25,190,124,147,11,232,27,223,113,29,194,205,84,109) -IMAGE_DATA(227,107,163,138,25,179,30,218,39,64,56,239,140,17,179,110,235,3,152,123,214,109,245,195,159,179,229,55,52,31,42,132) -IMAGE_DATA(124,211,212,151,92,246,82,64,255,143,61,31,216,108,30,89,66,82,124,243,129,49,15,29,86,241,205,19,253,235,39,198) -IMAGE_DATA(18,109,127,107,119,149,127,189,58,150,168,218,191,126,236,172,78,243,93,152,211,171,206,234,156,94,117,86,231,211,207,192) -IMAGE_DATA(89,157,213,254,245,202,252,176,97,133,195,217,221,119,223,203,10,238,40,96,183,244,186,133,229,223,152,207,58,92,223,158) -IMAGE_DATA(93,112,222,249,37,105,183,131,13,177,108,155,49,198,12,135,207,26,213,53,95,174,124,216,182,167,73,37,33,188,66,22) -IMAGE_DATA(157,255,42,214,92,169,19,149,190,113,121,159,243,25,172,78,22,191,227,26,7,37,214,187,174,29,125,108,0,166,189,85) -IMAGE_DATA(174,118,83,72,11,115,54,54,182,94,161,125,98,172,23,147,180,119,98,98,214,99,244,99,31,187,76,12,110,166,18,31) -IMAGE_DATA(222,25,43,102,61,86,153,32,13,140,111,2,163,75,109,125,32,212,86,202,199,104,12,157,235,58,103,37,173,131,177,249) -IMAGE_DATA(73,202,254,80,19,120,231,57,231,156,155,159,4,223,172,148,31,193,118,169,227,156,199,252,235,31,28,245,175,115,91,103) -IMAGE_DATA(181,127,125,143,228,95,119,185,11,115,222,209,187,48,199,79,152,4,247,177,31,245,175,143,24,57,138,221,119,223,96,118) -IMAGE_DATA(215,93,253,89,159,91,251,176,155,186,221,196,58,119,236,196,218,94,115,45,107,214,164,73,73,218,237,161,67,18,107,51) -IMAGE_DATA(95,157,148,235,60,185,242,78,31,158,16,91,23,169,124,45,73,215,145,252,61,87,30,8,92,6,91,119,242,156,234,203) -IMAGE_DATA(205,76,123,40,124,108,231,166,253,106,174,115,28,124,63,22,199,137,181,239,196,212,191,98,192,244,77,224,34,177,214,189) -IMAGE_DATA(174,119,182,39,197,55,121,94,92,215,181,49,98,214,67,237,197,170,111,218,158,193,148,13,211,151,67,234,135,251,175,98) -IMAGE_DATA(180,167,139,61,217,165,239,202,123,230,225,93,140,47,94,246,107,168,144,244,30,171,44,199,137,65,124,122,236,120,33,46) -IMAGE_DATA(197,47,188,116,196,196,55,85,177,68,106,255,122,156,187,48,199,194,89,157,143,60,198,70,223,63,6,206,136,103,3,6) -IMAGE_DATA(220,205,250,246,189,157,245,188,185,39,187,177,203,13,236,250,118,215,177,86,45,175,98,103,157,121,102,180,253,201,177,144) -IMAGE_DATA(43,110,199,199,12,102,157,148,180,159,88,165,91,176,235,183,164,199,52,70,228,57,199,215,14,136,21,149,93,197,149,99) -IMAGE_DATA(153,226,133,108,223,243,173,115,83,59,250,236,183,50,205,245,105,246,139,216,124,41,9,91,167,205,14,172,43,131,24,31) -IMAGE_DATA(238,162,23,176,246,69,87,190,9,115,174,235,122,193,117,158,182,165,141,177,119,185,212,21,143,177,132,185,64,199,83,109) -IMAGE_DATA(121,194,148,17,227,11,192,172,119,76,99,215,212,79,196,56,241,152,253,8,235,227,176,197,55,96,252,122,38,159,63,150) -IMAGE_DATA(107,67,253,240,179,43,184,240,179,12,48,229,200,226,254,78,56,127,179,71,207,94,7,125,57,229,29,5,119,30,234,123) -IMAGE_DATA(251,29,229,5,119,222,117,72,254,219,192,187,239,173,176,241,77,153,115,226,207,234,84,221,133,249,234,137,119,97,206,82) -IMAGE_DATA(223,133,9,103,117,22,22,142,96,247,220,115,31,43,40,184,147,221,210,171,55,235,214,53,159,117,108,223,129,93,211,170) -IMAGE_DATA(53,107,121,197,149,172,126,253,250,249,105,183,15,71,76,159,47,86,108,251,100,114,201,129,229,113,136,169,179,92,243,97) -IMAGE_DATA(149,196,178,3,98,69,197,65,92,57,150,139,158,151,117,154,79,157,219,108,20,62,245,96,154,127,146,216,115,156,150,36) -IMAGE_DATA(97,203,112,213,53,186,152,89,236,158,75,236,188,136,73,11,250,146,234,44,29,126,86,4,166,60,88,191,40,124,195,150) -IMAGE_DATA(150,205,22,136,229,64,48,174,84,117,12,239,187,218,72,179,18,179,46,219,27,129,131,65,27,169,218,46,86,63,194,140) -IMAGE_DATA(125,108,251,219,250,147,201,134,111,227,172,240,174,173,239,96,235,37,107,103,255,119,234,220,165,212,198,43,239,186,171,255) -IMAGE_DATA(145,222,189,251,124,127,219,109,183,31,2,142,54,172,146,171,193,153,67,224,163,6,254,6,247,252,64,140,14,220,53,57) -IMAGE_DATA(233,217,41,85,231,19,193,255,15,26,50,116,83,241,11,47,150,185,240,78,85,44,81,82,119,97,142,28,57,154,13,26) -IMAGE_DATA(52,132,245,235,7,254,245,219,216,77,221,111,98,93,58,117,102,237,174,105,203,174,186,178,5,187,226,210,203,42,234,215) -IMAGE_DATA(111,112,97,218,109,4,125,43,41,127,146,77,116,107,217,144,253,155,220,55,7,99,214,215,167,132,241,235,36,189,103,7) -IMAGE_DATA(35,177,236,128,88,81,197,172,187,114,44,23,187,162,172,231,107,99,204,122,214,197,54,14,92,129,237,163,152,216,27,140) -IMAGE_DATA(61,39,70,12,53,239,71,54,31,8,198,86,138,245,211,198,136,89,199,244,69,91,253,184,250,230,179,18,179,46,182,131) -IMAGE_DATA(109,95,3,148,209,86,87,182,60,97,214,8,174,247,108,216,250,146,174,76,182,246,194,158,215,98,107,123,190,6,115,41) -IMAGE_DATA(83,146,48,221,103,121,231,93,253,142,244,232,209,243,112,207,158,189,216,173,189,251,84,157,43,4,231,11,21,14,31,105) -IMAGE_DATA(228,155,16,179,51,125,198,44,184,115,178,92,252,86,155,54,215,228,63,242,232,216,226,77,155,223,44,199,249,215,147,189) -IMAGE_DATA(11,243,17,225,46,204,129,3,239,102,183,247,189,131,245,236,209,139,117,189,225,70,214,190,221,245,172,245,85,87,87,217) -IMAGE_DATA(58,239,27,52,228,183,41,53,207,81,164,105,151,81,217,205,124,253,195,186,57,10,198,151,43,167,198,232,188,180,234,204) -IMAGE_DATA(148,207,52,98,214,147,228,88,242,247,124,210,48,205,129,89,136,89,207,186,216,198,129,43,176,250,6,59,47,218,252,33) -IMAGE_DATA(182,121,30,19,11,232,18,51,129,89,47,99,202,102,75,199,198,93,49,125,27,27,147,237,18,47,153,149,152,117,46,216) -IMAGE_DATA(125,180,182,250,182,205,9,152,53,66,236,253,188,186,126,100,171,15,151,60,200,124,156,219,116,178,102,223,172,95,191,65) -IMAGE_DATA(158,106,15,103,207,158,183,28,234,122,67,215,35,96,239,3,187,159,15,223,132,123,128,218,182,107,87,168,251,118,227,198) -IMAGE_DATA(141,243,250,247,31,48,110,197,170,146,131,230,179,58,35,220,133,57,255,196,187,48,159,80,220,133,121,103,193,93,172,247) -IMAGE_DATA(45,183,178,110,249,221,88,199,246,29,217,181,173,219,84,113,206,161,67,135,127,223,169,115,151,212,246,118,250,218,121,64) -IMAGE_DATA(196,61,41,252,28,107,215,52,84,190,59,31,14,108,211,43,62,229,52,165,23,178,111,82,246,99,133,156,203,34,235,65) -IMAGE_DATA(126,23,19,23,223,56,39,49,13,81,66,99,214,93,69,212,169,181,49,102,93,20,200,11,148,145,159,65,30,82,111,220) -IMAGE_DATA(143,200,251,64,136,77,94,87,86,95,196,176,189,137,8,61,43,18,179,135,199,117,126,181,213,55,102,159,172,45,22,197) -IMAGE_DATA(198,129,108,122,20,187,167,158,3,187,215,41,11,49,235,162,96,215,46,62,119,99,185,228,199,149,235,1,124,56,167,77) -IMAGE_DATA(79,250,220,43,11,58,36,139,60,83,132,124,135,122,223,219,11,42,218,95,119,61,187,238,218,182,44,148,111,22,77,159) -IMAGE_DATA(137,110,187,75,46,185,164,13,216,63,43,121,101,69,226,119,97,78,57,241,46,204,81,210,93,152,55,223,116,115,101,249) -IMAGE_DATA(187,84,213,195,213,45,90,178,59,238,184,243,223,147,167,78,171,104,212,232,204,188,4,155,67,11,95,27,167,78,39,248) -IMAGE_DATA(204,225,226,251,190,115,54,198,190,239,58,239,154,244,158,239,190,73,221,250,221,183,220,182,185,203,39,93,23,255,79,8) -IMAGE_DATA(199,114,237,27,181,49,102,221,148,71,223,125,18,170,245,87,72,252,46,182,47,96,97,251,158,235,156,24,194,57,49,254) -IMAGE_DATA(80,159,243,25,109,107,6,204,62,217,144,152,117,140,93,210,213,39,138,93,243,97,210,10,25,179,28,152,177,27,83,151) -IMAGE_DATA(133,114,78,159,51,111,125,56,39,70,39,215,166,59,45,1,112,175,37,231,154,5,119,246,251,79,199,14,157,126,4,126) -IMAGE_DATA(21,131,111,206,91,176,8,226,138,156,99,41,79,59,237,180,70,189,110,233,93,184,113,211,230,114,213,93,152,213,103,117) -IMAGE_DATA(70,188,11,243,9,253,93,152,93,111,232,202,128,127,183,185,186,21,235,158,223,173,234,124,249,126,253,7,150,36,208,20) -IMAGE_DATA(70,248,218,141,76,115,2,70,135,203,34,174,181,125,56,0,118,142,114,141,73,50,233,8,31,62,96,179,43,248,180,133) -IMAGE_DATA(205,30,224,99,47,115,177,49,37,29,123,22,90,231,114,26,50,124,120,88,236,152,245,216,235,16,29,151,240,93,95,90) -IMAGE_DATA(59,129,3,48,101,114,229,66,54,123,160,201,215,139,25,31,62,231,69,97,116,171,45,141,144,152,117,91,157,184,218,56) -IMAGE_DATA(57,108,101,202,74,204,186,79,219,217,242,101,91,223,219,198,190,79,60,158,207,126,78,204,122,3,19,67,84,147,112,107) -IMAGE_DATA(159,190,229,192,55,123,247,238,243,195,85,87,182,100,49,249,230,194,197,197,236,172,179,206,202,11,201,95,235,214,109,242) -IMAGE_DATA(23,61,87,92,150,203,187,48,239,187,239,248,187,48,59,117,232,200,174,109,115,77,85,12,59,112,78,144,230,205,47,202) -IMAGE_DATA(143,81,255,88,248,158,129,103,155,19,92,237,137,188,239,251,156,177,14,130,189,23,215,103,175,99,204,180,76,246,18,223) -IMAGE_DATA(178,219,244,134,79,27,187,156,93,29,26,179,4,186,15,242,136,209,127,177,99,214,125,214,71,182,250,241,225,117,186,244) -IMAGE_DATA(124,56,167,201,127,231,147,183,216,113,235,182,53,74,174,252,143,28,54,93,21,82,126,91,221,218,98,90,66,198,190,173) -IMAGE_DATA(92,190,119,235,216,210,205,74,204,58,54,47,34,108,235,15,219,90,60,86,185,56,108,126,29,211,88,113,25,223,80,238) -IMAGE_DATA(218,112,151,122,126,215,110,63,92,118,241,37,209,249,230,35,143,141,45,139,149,215,86,173,91,231,47,88,184,184,204,118) -IMAGE_DATA(23,230,177,179,58,35,221,133,121,115,245,93,152,215,181,109,199,174,110,121,213,81,206,57,106,244,152,104,101,195,192,55) -IMAGE_DATA(246,195,182,62,214,205,1,252,60,52,30,83,14,99,74,220,35,232,187,135,13,244,167,120,174,174,78,124,202,235,27,23) -IMAGE_DATA(168,18,19,87,241,181,105,217,116,133,15,207,112,217,179,19,18,127,230,122,151,69,77,136,89,247,177,155,234,234,192,199) -IMAGE_DATA(134,108,154,103,99,239,35,240,129,109,141,226,195,133,108,117,174,123,15,195,235,66,206,31,180,165,109,226,140,33,49,235) -IMAGE_DATA(152,114,249,222,197,25,227,140,250,92,196,172,251,148,209,150,47,91,122,49,247,51,96,226,232,77,99,197,119,125,158,245) -IMAGE_DATA(61,155,42,244,233,211,247,127,43,185,212,145,36,248,102,241,11,47,177,246,237,59,20,198,206,115,171,86,173,243,87,175) -IMAGE_DATA(89,87,30,245,46,204,241,184,187,48,219,8,118,206,92,218,58,125,253,234,152,117,63,140,43,224,143,60,238,4,155,167) -IMAGE_DATA(44,158,107,232,19,23,168,147,208,51,128,85,98,171,83,31,14,132,109,47,128,239,186,197,231,238,52,159,239,152,230,192) -IMAGE_DATA(216,117,238,99,55,53,217,97,125,108,200,166,242,198,62,251,222,7,182,49,238,202,19,108,243,188,169,126,147,222,247,22) -IMAGE_DATA(146,118,72,204,58,102,223,179,239,189,133,49,218,47,23,49,235,73,216,203,49,92,12,19,183,101,75,7,123,54,149,201) -IMAGE_DATA(222,16,186,231,169,166,240,207,139,47,190,100,74,146,124,243,197,37,75,89,189,122,245,18,187,227,243,246,59,10,198,85) -IMAGE_DATA(114,204,138,216,119,97,66,44,209,136,145,163,181,119,97,142,123,252,169,67,185,182,117,250,246,201,36,239,29,8,25,35) -IMAGE_DATA(73,137,79,92,160,143,14,244,241,129,219,236,1,62,254,122,87,95,162,111,189,186,234,178,36,98,214,125,234,60,118,204) -IMAGE_DATA(186,169,13,125,108,21,38,30,227,83,127,190,246,48,29,108,188,215,149,11,133,196,125,196,186,195,81,135,144,182,10,137) -IMAGE_DATA(89,79,98,95,33,135,173,253,178,18,179,238,99,47,183,229,11,147,6,230,172,107,190,159,72,174,43,232,15,240,59,198) -IMAGE_DATA(78,128,57,247,32,214,249,209,208,215,98,235,129,88,128,54,75,146,111,142,121,240,225,168,126,30,21,26,52,104,208,104) -IMAGE_DATA(226,164,201,165,246,187,48,87,162,238,194,28,135,184,11,179,146,147,150,139,182,206,92,196,176,251,238,229,76,170,239,249) -IMAGE_DATA(238,103,76,90,84,243,130,79,252,116,232,185,38,62,122,53,171,49,235,62,243,129,111,204,186,105,14,140,237,107,142,29) -IMAGE_DATA(175,229,51,103,232,108,31,73,236,35,240,129,233,91,62,103,184,132,196,172,219,98,10,67,247,178,218,234,54,228,60,5) -IMAGE_DATA(83,185,108,107,21,223,189,156,152,50,197,72,35,70,204,186,107,28,154,205,71,225,210,23,146,142,171,196,230,197,245,46) -IMAGE_DATA(87,155,96,238,68,200,37,160,159,36,201,55,193,174,216,177,83,231,194,92,149,231,250,246,29,10,214,174,223,88,113,252) -IMAGE_DATA(93,152,39,158,213,25,227,46,204,202,231,143,136,156,51,23,49,236,190,126,236,164,246,26,39,125,230,142,175,196,58,195) -IMAGE_DATA(198,182,46,141,29,63,237,155,207,92,196,172,251,172,91,106,66,204,186,207,58,206,52,55,198,44,111,18,103,223,187,194) -IMAGE_DATA(54,198,125,246,142,218,120,163,169,126,109,58,48,100,47,43,102,13,109,226,86,33,49,235,49,246,92,250,148,41,75,49) -IMAGE_DATA(235,174,243,84,236,190,9,58,46,137,187,253,160,191,187,240,190,216,188,19,234,61,43,254,246,95,158,123,110,73,146,124) -IMAGE_DATA(19,252,217,245,234,213,207,41,199,174,223,160,65,163,74,222,88,154,244,93,152,34,223,4,129,243,58,147,46,91,22,206) -IMAGE_DATA(77,17,81,147,56,167,143,207,211,20,91,239,27,63,109,179,7,248,220,87,159,116,204,186,207,62,43,128,79,157,155,230) -IMAGE_DATA(192,172,196,172,235,218,208,103,47,129,169,188,177,207,190,247,129,141,247,250,112,161,144,152,245,164,184,25,32,233,24,32) -IMAGE_DATA(83,185,108,124,204,119,143,170,205,215,144,149,152,117,31,29,19,26,179,46,2,198,110,236,216,4,40,147,239,29,147,192) -IMAGE_DATA(191,99,230,7,250,87,22,236,157,45,46,191,162,34,73,190,89,52,109,70,84,253,231,130,222,183,222,54,46,201,187,48) -IMAGE_DATA(101,206,9,114,101,139,150,137,238,159,200,194,185,41,34,178,202,57,85,121,245,241,121,134,198,168,170,164,38,198,172,251) -IMAGE_DATA(218,142,124,234,220,244,173,36,124,245,49,227,181,124,242,87,211,99,214,125,236,223,190,245,11,72,146,115,134,220,73,19) -IMAGE_DATA(122,207,186,237,93,95,206,105,179,227,103,37,102,221,231,236,245,144,51,94,49,233,248,218,26,65,239,1,215,140,193,241) -IMAGE_DATA(160,222,98,113,207,144,253,25,49,112,122,195,134,5,73,242,77,136,219,185,111,208,96,231,115,224,99,226,194,11,243,218) -IMAGE_DATA(60,255,194,146,242,144,187,48,31,84,220,133,9,220,83,197,57,147,246,175,251,244,61,159,177,140,69,200,222,64,204,57) -IMAGE_DATA(73,190,162,202,171,79,62,211,136,89,79,34,77,17,185,140,131,246,41,75,200,94,62,215,250,161,152,117,59,98,196,5) -IMAGE_DATA(139,8,137,89,199,228,39,36,102,221,102,151,15,217,23,108,43,151,173,93,125,125,163,182,117,95,86,98,214,49,241,53) -IMAGE_DATA(174,249,10,137,53,23,253,225,208,167,96,92,65,251,243,179,3,69,129,223,249,57,130,73,217,18,97,220,64,31,11,141) -IMAGE_DATA(49,74,243,76,207,230,23,230,149,36,201,55,225,140,162,43,174,184,50,63,173,242,113,212,175,95,191,209,172,217,243,14) -IMAGE_DATA(70,185,11,179,127,245,93,152,176,191,83,197,57,147,246,175,39,197,57,97,76,65,127,118,213,107,190,156,51,215,54,126) -IMAGE_DATA(138,89,63,6,159,246,242,177,101,249,198,172,155,190,229,99,119,200,122,204,186,169,188,185,106,43,19,98,196,5,139,8) -IMAGE_DATA(181,119,37,201,57,109,253,203,180,215,38,244,158,117,91,187,250,148,7,163,79,178,18,179,142,189,35,68,132,239,25,175) -IMAGE_DATA(0,27,223,116,205,75,46,1,121,7,14,15,249,116,213,137,62,220,62,22,218,93,219,182,60,73,190,9,241,226,192,247) -IMAGE_DATA(210,42,159,140,209,247,143,41,137,117,23,230,144,161,195,202,85,156,19,164,113,147,38,137,237,213,245,177,243,96,56,167) -IMAGE_DATA(168,199,161,15,195,220,137,225,160,190,188,2,91,94,24,91,226,249,243,190,160,152,117,255,244,177,243,82,172,111,233,56) -IMAGE_DATA(131,111,60,77,214,99,214,117,117,91,19,98,214,125,246,237,132,196,172,3,108,227,206,135,187,0,48,186,44,228,60,5) -IMAGE_DATA(91,185,108,223,246,41,19,102,93,140,73,199,119,204,138,136,189,86,8,141,89,55,245,195,44,236,123,116,1,204,111,216) -IMAGE_DATA(249,40,73,191,167,9,117,234,212,201,75,154,111,206,154,61,55,181,189,156,58,128,175,63,198,93,152,143,141,125,226,95) -IMAGE_DATA(58,206,121,211,205,61,138,146,202,127,18,113,192,182,185,205,198,65,125,242,131,181,239,139,28,27,242,33,222,135,4,249) -IMAGE_DATA(198,166,67,49,235,213,200,101,28,180,111,95,213,233,123,223,115,236,41,102,221,31,89,139,89,7,196,216,159,232,147,47) -IMAGE_DATA(155,111,60,196,70,10,176,181,171,235,90,2,198,145,45,79,89,138,89,143,125,198,171,173,111,234,234,38,45,78,22,3) -IMAGE_DATA(24,157,145,86,249,154,52,110,82,152,36,223,132,179,216,199,60,248,80,73,26,101,179,161,115,151,46,133,246,187,48,167) -IMAGE_DATA(105,239,194,188,231,238,123,149,92,147,203,160,33,195,18,59,143,212,215,246,161,211,119,152,187,186,108,186,207,199,222,135) -IMAGE_DATA(153,23,92,108,168,144,7,152,51,116,126,197,154,18,179,158,4,55,14,77,223,55,6,205,119,239,165,170,142,124,211,2) -IMAGE_DATA(161,152,117,127,100,45,102,29,96,179,77,251,212,1,134,159,153,202,26,26,179,14,176,217,200,93,237,128,152,254,19,99) -IMAGE_DATA(31,38,8,38,63,166,247,115,29,179,110,154,71,147,140,185,197,0,248,123,200,254,16,219,248,74,139,115,94,121,101,139) -IMAGE_DATA(226,36,249,230,198,215,94,103,253,7,12,44,74,163,108,24,116,234,220,165,80,125,23,230,66,205,93,152,227,142,222,133) -IMAGE_DATA(9,231,196,155,56,103,210,123,58,125,236,107,240,142,60,247,66,191,118,245,5,170,250,171,143,127,210,118,151,152,239,249) -IMAGE_DATA(100,186,177,90,155,99,214,161,158,176,58,42,151,113,208,190,177,150,208,86,188,158,160,31,248,172,23,68,161,152,117,127) -IMAGE_DATA(100,45,102,29,128,225,246,174,113,18,24,126,102,74,19,163,15,108,118,188,152,241,248,152,123,117,176,105,102,53,102,221) -IMAGE_DATA(182,14,53,245,77,91,126,114,121,150,37,180,21,223,155,41,218,127,124,99,125,98,180,87,18,184,225,134,27,203,146,228) -IMAGE_DATA(155,112,30,123,139,150,45,243,211,40,27,22,112,86,189,207,93,152,143,62,246,248,247,38,206,9,82,183,110,221,196,246) -IMAGE_DATA(131,132,216,124,160,79,67,159,243,245,83,170,184,77,200,93,68,242,93,98,240,111,24,51,62,92,192,52,150,124,242,150) -IMAGE_DATA(70,204,122,200,153,24,188,109,65,160,254,84,190,192,92,198,65,199,186,195,45,84,116,249,163,152,117,59,178,22,179,206) -IMAGE_DATA(97,171,27,23,238,141,225,176,54,123,160,77,31,96,236,120,182,254,227,114,223,19,118,236,197,216,135,89,19,99,214,49) -IMAGE_DATA(251,201,32,79,46,251,183,92,1,237,109,234,199,73,157,79,23,123,93,138,69,191,126,3,42,146,228,155,155,223,220,202) -IMAGE_DATA(206,57,231,220,188,52,202,230,130,142,29,59,21,186,220,133,9,182,78,27,223,4,105,222,252,162,252,164,242,156,214,125) -IMAGE_DATA(147,38,78,23,194,131,99,137,78,199,212,148,152,117,64,204,51,128,85,223,243,73,199,55,14,58,237,254,0,18,59,102) -IMAGE_DATA(221,164,175,107,99,204,122,72,92,176,10,177,236,93,152,241,135,137,37,194,248,83,224,239,54,222,17,26,179,14,192,216) -IMAGE_DATA(201,109,101,130,117,148,75,63,140,177,15,51,173,152,117,91,217,76,239,38,117,174,52,95,243,243,115,147,76,121,192,216) -IMAGE_DATA(45,92,227,231,99,244,161,164,144,52,223,132,59,207,211,40,151,15,250,15,188,187,24,123,23,230,184,199,159,170,192,112) -IMAGE_DATA(206,107,174,109,91,152,100,158,211,224,120,166,117,99,218,247,174,155,244,94,77,137,89,143,221,174,114,157,36,181,31,64) -IMAGE_DATA(7,95,91,122,76,201,101,204,186,79,121,179,28,179,30,243,46,107,142,208,152,117,14,172,190,129,246,215,245,95,176,189) -IMAGE_DATA(97,252,41,152,57,218,166,15,176,118,60,172,63,92,229,131,129,242,200,125,48,198,154,193,150,159,52,98,214,67,239,243) -IMAGE_DATA(204,213,124,5,245,175,107,47,204,30,98,16,168,59,76,253,64,63,197,164,151,198,249,156,103,157,117,86,155,164,249,230) -IMAGE_DATA(226,231,158,207,92,204,186,9,67,134,22,150,216,238,194,28,251,248,83,108,234,180,153,71,48,156,51,201,216,117,0,182) -IMAGE_DATA(191,198,146,24,107,217,164,196,198,229,106,74,204,58,192,215,103,175,18,57,254,55,215,113,208,73,220,35,23,179,206,125) -IMAGE_DATA(108,213,177,237,146,186,180,40,102,221,14,151,246,19,207,187,128,124,99,251,18,214,238,26,26,179,142,173,31,113,44,240) -IMAGE_DATA(184,73,190,151,70,213,62,166,124,197,216,135,9,18,195,86,138,169,27,151,124,97,250,102,232,62,113,23,209,221,119,238) -IMAGE_DATA(98,15,1,30,205,207,107,225,2,239,67,191,198,174,119,211,58,119,180,73,147,166,249,73,242,205,173,165,59,42,57,219) -IMAGE_DATA(156,178,52,202,22,130,241,19,38,30,52,221,133,249,228,211,227,81,54,206,92,112,78,128,239,217,152,174,226,210,79,115) -IMAGE_DATA(109,127,197,228,173,166,196,172,3,98,174,191,229,239,37,181,31,64,135,152,252,25,230,78,159,244,98,199,172,199,180,75) -IMAGE_DATA(102,61,102,61,230,93,214,28,49,237,93,62,103,110,184,214,39,230,252,158,24,49,235,28,177,198,63,143,209,52,61,147) -IMAGE_DATA(149,152,117,151,125,170,28,49,236,229,166,51,225,147,16,93,220,108,174,230,76,248,126,90,231,142,54,109,218,44,63,73) -IMAGE_DATA(190,89,186,99,103,101,122,147,83,217,167,26,130,122,245,234,53,154,60,117,122,185,234,46,76,136,37,42,154,62,11,101) -IMAGE_DATA(227,76,250,188,36,17,190,246,16,172,184,174,139,160,79,199,182,111,233,4,107,59,240,153,151,210,136,89,231,240,225,134) -IMAGE_DATA(42,145,211,77,106,63,128,14,49,109,241,252,238,57,215,247,114,21,179,238,51,14,179,30,179,30,235,46,107,17,190,245) -IMAGE_DATA(171,131,239,249,22,54,177,157,171,33,34,70,204,186,136,24,227,159,219,193,76,207,156,172,49,235,34,114,237,47,132,185) -IMAGE_DATA(72,213,23,146,230,157,46,253,57,9,52,107,118,94,126,146,124,243,173,157,187,217,160,65,131,139,210,42,95,8,42,235) -IMAGE_DATA(166,141,234,46,204,167,199,255,234,16,150,111,130,140,26,61,166,44,87,121,134,49,157,196,184,9,137,129,77,114,12,233) -IMAGE_DATA(252,20,58,248,124,195,148,94,82,49,235,28,49,214,223,42,219,65,82,251,1,76,136,177,38,226,254,86,31,30,102,170) -IMAGE_DATA(99,215,180,98,219,37,41,102,221,222,103,49,136,205,59,177,246,77,142,24,49,235,34,66,199,63,31,47,182,62,153,149) -IMAGE_DATA(152,245,36,236,229,152,190,9,207,164,113,182,134,174,188,73,205,153,105,243,77,192,121,231,157,151,159,36,223,220,181,123) -IMAGE_DATA(47,27,60,120,72,81,154,101,12,193,141,93,243,199,137,119,97,78,122,118,234,127,92,248,102,174,57,39,0,244,121,44) -IMAGE_DATA(251,34,164,19,163,143,194,90,51,166,239,139,239,199,118,201,131,143,77,210,54,247,229,194,71,29,58,239,200,223,75,114) -IMAGE_DATA(63,128,13,190,188,83,62,83,214,181,47,229,50,102,221,103,236,81,204,122,216,24,17,225,26,175,173,19,24,219,174,254) -IMAGE_DATA(199,24,49,235,170,242,184,142,127,121,188,216,56,76,86,98,214,93,246,240,114,216,234,194,246,190,73,39,133,156,37,136) -IMAGE_DATA(17,211,252,18,123,206,132,62,144,133,123,60,207,63,255,252,252,36,249,230,158,189,251,217,144,33,67,139,210,46,103,8) -IMAGE_DATA(10,71,140,42,229,119,97,22,77,159,245,99,214,57,39,7,232,117,95,238,9,58,59,6,199,144,161,138,167,116,29,163) -IMAGE_DATA(186,216,63,204,183,93,191,151,86,204,186,12,40,175,175,159,45,237,152,117,25,240,125,151,62,0,245,37,127,219,167,63) -IMAGE_DATA(235,242,67,49,235,102,100,57,102,221,4,168,59,31,238,169,234,111,88,196,138,89,87,1,107,63,87,229,223,150,47,204) -IMAGE_DATA(247,109,223,173,137,49,235,166,57,65,119,254,180,24,183,163,19,224,139,182,51,55,185,216,250,26,228,209,119,30,135,181) -IMAGE_DATA(71,72,127,78,2,231,95,112,65,126,146,124,115,223,254,119,216,208,161,195,138,210,46,103,8,234,214,171,215,104,250,204) -IMAGE_DATA(57,255,111,210,228,162,31,92,249,102,154,156,147,3,250,27,204,171,160,127,117,235,101,248,29,250,38,244,239,92,244,79) -IMAGE_DATA(152,19,121,158,76,227,146,199,100,194,248,77,219,39,144,5,192,252,15,109,4,115,23,63,255,77,37,240,119,168,95,208) -IMAGE_DATA(127,89,88,219,170,0,122,25,250,156,220,39,197,54,207,146,174,36,212,76,240,49,195,227,186,85,186,15,244,80,174,116) -IMAGE_DATA(95,8,160,44,92,111,138,227,29,254,31,126,207,122,254,179,4,19,95,141,117,110,37,38,182,13,203,179,33,45,206,101) -IMAGE_DATA(229,246,23,5,250,57,215,253,49,202,16,27,23,92,120,97,126,146,124,243,237,119,222,101,195,134,21,22,165,93,206,80) -IMAGE_DATA(204,155,183,224,125,31,190,153,203,24,162,218,0,224,149,196,45,9,4,2,129,144,36,76,251,13,98,126,39,198,94,218) -IMAGE_DATA(218,132,11,243,242,242,147,228,155,7,222,45,99,133,133,195,139,210,46,103,8,22,47,126,174,228,251,255,249,23,156,19) -IMAGE_DATA(127,216,135,115,230,226,172,36,2,129,64,32,16,8,56,152,246,200,198,252,142,141,115,158,108,182,233,198,141,27,183,73) -IMAGE_DATA(146,111,190,87,246,1,43,28,62,162,40,237,114,250,130,243,77,144,191,124,245,141,151,157,147,56,39,129,64,32,16,8) -IMAGE_DATA(217,129,137,7,198,140,193,51,237,41,246,61,159,161,166,35,73,190,89,246,193,71,108,248,136,145,69,105,151,209,7,34) -IMAGE_DATA(223,228,82,89,63,78,231,36,129,36,125,247,37,129,64,32,16,8,4,60,108,177,71,49,246,193,219,98,0,67,98,202) -IMAGE_DATA(106,50,102,204,154,83,145,20,223,252,224,195,143,217,136,145,163,138,82,46,162,19,78,63,253,244,70,43,86,172,44,149) -IMAGE_DATA(249,166,175,173,179,121,243,139,242,83,46,18,129,64,32,16,8,132,159,96,59,127,10,108,144,33,123,45,193,86,106,58) -IMAGE_DATA(99,12,254,118,178,249,213,57,30,121,108,108,89,82,124,243,163,143,63,101,35,71,141,46,74,187,140,88,0,223,220,179) -IMAGE_DATA(119,223,193,127,126,255,63,76,37,192,59,231,204,91,232,100,235,172,91,183,110,38,227,134,9,4,2,129,64,56,25,129) -IMAGE_DATA(61,119,93,188,219,220,150,38,63,143,5,115,158,106,172,216,248,154,136,126,253,7,20,39,197,55,63,249,244,55,108,84) -IMAGE_DATA(13,225,156,87,182,104,209,230,163,143,63,41,47,255,231,247,76,45,213,188,115,247,158,125,232,123,47,39,79,157,230,116) -IMAGE_DATA(239,4,129,64,32,16,8,132,100,17,114,159,61,112,74,241,124,34,215,247,67,238,17,174,13,232,208,177,83,97,82,124) -IMAGE_DATA(243,211,95,255,150,205,95,176,40,243,103,5,245,232,209,179,224,79,159,127,81,241,143,242,127,50,181,28,227,158,223,254) -IMAGE_DATA(245,187,26,115,54,39,129,64,32,16,8,132,19,17,227,62,94,226,155,238,56,251,236,179,243,146,226,155,191,249,237,239) -IMAGE_DATA(217,43,203,150,151,165,93,70,19,38,79,158,82,252,247,127,148,51,189,156,200,65,103,204,154,243,47,138,89,39,16,8) -IMAGE_DATA(4,2,161,230,34,87,188,19,246,111,158,204,254,116,25,19,38,76,252,223,36,248,230,111,127,247,7,182,125,199,206,242) -IMAGE_DATA(180,203,167,66,179,102,205,242,54,108,220,84,246,221,223,254,193,254,246,119,157,148,87,137,204,67,87,174,42,65,237,233) -IMAGE_DATA(164,248,33,2,129,64,32,16,178,11,216,135,233,123,191,164,77,66,238,107,174,205,184,228,162,139,247,46,88,184,56,58) -IMAGE_DATA(223,228,146,118,249,100,220,124,115,143,130,207,254,120,176,226,175,223,253,157,125,247,55,157,252,131,233,248,40,148,145,246) -IMAGE_DATA(114,18,8,4,2,129,80,59,0,123,60,129,31,134,240,79,241,238,222,147,237,142,33,23,64,92,255,165,205,47,250,177) -IMAGE_DATA(100,205,186,232,124,19,164,73,147,38,121,105,151,17,0,182,205,151,151,190,82,250,237,95,255,198,184,252,245,59,149,252) -IMAGE_DATA(157,153,248,232,87,95,127,107,229,156,253,250,15,44,73,187,188,132,154,3,81,207,157,172,103,104,16,226,66,188,235,57) -IMAGE_DATA(237,188,184,66,140,215,72,59,47,132,147,19,160,135,129,55,130,0,135,84,9,248,230,249,51,100,203,116,3,240,243,214) -IMAGE_DATA(87,93,253,3,248,215,99,242,77,144,107,175,109,155,159,118,249,134,14,27,54,238,247,127,248,172,226,155,111,191,99,92) -IMAGE_DATA(32,30,232,68,193,241,209,233,51,231,24,227,215,175,108,209,50,218,93,6,132,218,15,19,63,224,190,31,16,186,143,158) -IMAGE_DATA(128,5,239,79,208,111,210,206,11,135,216,151,117,247,189,192,51,60,239,112,143,75,174,243,120,50,3,56,84,77,208,53) -IMAGE_DATA(60,143,39,235,185,234,181,1,252,188,170,54,87,183,250,225,181,215,223,136,198,55,65,70,223,255,64,81,90,229,186,254) -IMAGE_DATA(250,235,243,75,183,111,63,248,245,55,223,178,175,191,249,235,81,249,230,91,149,224,249,232,212,105,51,202,201,175,78,136) -IMAGE_DATA(5,147,14,21,239,236,37,27,40,1,3,145,219,65,255,73,59,63,28,98,204,134,206,247,8,191,243,188,195,243,185,205) -IMAGE_DATA(225,201,13,241,220,202,180,243,162,3,216,19,121,30,179,212,183,9,110,16,239,105,186,166,146,119,190,185,101,107,20,190) -IMAGE_DATA(9,178,96,97,238,207,75,106,218,172,89,222,218,181,235,202,190,250,250,27,86,45,223,30,39,213,28,84,20,55,62,106) -IMAGE_DATA(226,156,228,87,39,196,4,191,179,23,124,17,105,231,133,64,8,1,172,169,178,206,105,78,102,240,243,204,179,188,167,65) -IMAGE_DATA(228,42,49,239,70,39,228,30,162,127,175,245,85,173,14,175,92,185,58,152,111,230,58,118,189,105,211,102,121,179,231,204) -IMAGE_DATA(41,249,203,87,95,179,99,242,205,113,114,140,135,186,243,81,206,73,167,78,155,174,229,156,141,26,157,153,151,171,242,154) -IMAGE_DATA(0,99,211,199,63,2,235,72,120,55,196,166,198,211,8,125,198,4,204,30,154,208,114,132,128,239,7,10,77,135,143,203) -IMAGE_DATA(180,125,164,33,253,34,70,159,130,119,109,253,57,164,206,121,30,77,125,10,243,76,146,136,213,167,68,132,182,141,203,126) -IMAGE_DATA(54,190,111,57,38,167,129,62,17,90,39,152,190,229,139,144,62,195,219,59,164,191,185,244,25,223,115,36,125,231,26,57) -IMAGE_DATA(13,76,31,36,191,79,237,129,124,86,213,165,205,47,58,50,107,230,236,255,132,240,77,46,167,157,118,90,162,58,250,186) -IMAGE_DATA(235,174,203,95,93,178,182,236,203,63,127,197,254,252,23,46,95,159,32,199,115,81,127,62,170,227,156,105,159,3,15,109) -IMAGE_DATA(40,223,189,5,246,49,176,47,216,230,82,24,203,226,186,131,191,107,58,235,1,206,28,19,125,194,176,238,148,211,144,253) -IMAGE_DATA(197,144,71,249,25,208,113,170,111,136,62,66,248,59,232,24,110,247,19,247,171,137,186,7,222,81,61,163,211,137,24,31) -IMAGE_DATA(164,105,159,147,236,7,84,213,35,228,71,87,135,98,218,98,154,182,51,56,196,186,177,249,32,161,126,77,123,232,76,128) -IMAGE_DATA(54,214,245,11,211,123,208,38,240,93,249,222,97,126,126,136,238,61,232,47,98,123,200,223,87,125,91,85,231,186,189,94) -IMAGE_DATA(114,125,115,95,174,169,189,84,207,240,62,41,167,15,191,97,218,69,213,238,242,251,208,94,124,108,202,245,168,27,51,98) -IMAGE_DATA(29,154,246,67,250,182,43,212,133,170,93,117,186,6,115,207,160,152,62,239,171,166,189,122,144,7,121,140,243,54,209,241) -IMAGE_DATA(171,24,245,138,133,46,109,168,111,219,24,212,149,205,246,174,175,30,146,159,81,213,169,170,124,170,254,195,235,79,199,5) -IMAGE_DATA(229,62,175,210,213,144,166,60,110,160,220,182,62,68,113,226,53,19,170,62,116,115,247,155,14,239,221,247,182,55,223,4) -IMAGE_DATA(233,218,53,63,186,13,188,97,195,134,141,238,184,163,160,112,223,254,119,202,191,248,242,47,12,228,203,63,139,242,213,9) -IMAGE_DATA(114,140,143,158,200,73,93,248,232,212,34,53,231,76,235,76,78,174,79,77,99,82,103,91,128,241,172,154,63,48,239,242) -IMAGE_DATA(111,130,158,49,205,45,124,30,51,61,163,154,31,249,154,22,242,7,122,72,151,79,158,63,211,25,191,240,174,172,111,197) -IMAGE_DATA(59,208,108,60,72,53,63,138,239,219,238,218,181,213,33,140,61,254,155,173,61,120,93,153,234,142,131,215,137,170,252,38) -IMAGE_DATA(192,179,182,187,131,117,246,16,83,91,217,222,229,239,65,123,152,250,11,124,195,150,71,85,155,242,52,249,252,108,203,159) -IMAGE_DATA(216,246,152,54,21,125,127,38,206,169,106,119,249,125,221,188,206,69,103,251,54,217,198,67,218,213,84,23,186,247,93,57) -IMAGE_DATA(13,255,93,197,57,33,239,42,62,38,139,138,155,185,212,107,72,236,18,240,40,91,223,215,245,11,76,253,170,222,245,213) -IMAGE_DATA(67,226,222,72,157,200,237,0,229,83,173,85,228,255,87,241,78,94,62,206,43,177,109,136,169,23,138,27,175,153,208,245) -IMAGE_DATA(131,75,47,186,248,199,105,69,211,143,248,240,77,144,39,158,120,42,90,124,89,183,110,221,11,102,206,156,85,242,249,23) -IMAGE_DATA(127,102,162,124,241,37,151,191,40,37,132,143,202,156,116,138,130,115,166,101,227,148,231,16,208,151,220,22,7,122,86,252) -IMAGE_DATA(155,172,175,196,246,230,188,142,143,93,153,139,170,230,111,89,231,136,107,92,208,125,252,239,160,99,248,92,175,123,70,165) -IMAGE_DATA(55,248,252,2,239,243,179,207,248,122,22,254,43,231,143,235,84,241,25,177,252,242,93,16,226,250,217,102,67,144,245,53) -IMAGE_DATA(79,95,174,3,200,51,164,5,101,148,215,1,170,111,136,239,137,233,114,123,146,248,46,255,157,215,31,215,253,38,95,37) -IMAGE_DATA(127,198,101,191,189,220,167,32,31,188,79,201,253,66,182,251,138,125,74,182,89,200,92,84,174,15,113,238,228,223,231,118) -IMAGE_DATA(118,110,59,18,185,10,175,95,248,93,213,167,84,123,96,249,59,98,189,139,227,69,213,167,76,207,200,246,21,49,143,38) -IMAGE_DATA(127,163,170,221,229,252,243,182,131,250,231,109,47,247,41,249,27,166,24,11,91,187,138,92,66,78,87,236,139,98,125,112) -IMAGE_DATA(200,245,34,254,14,34,242,6,40,35,255,93,76,199,196,215,77,122,142,219,212,77,237,46,182,139,79,189,98,32,242,77) -IMAGE_DATA(110,51,134,188,65,222,197,190,175,202,159,152,127,209,39,33,247,123,16,153,207,137,122,204,69,15,113,191,191,92,126,254) -IMAGE_DATA(155,236,239,150,203,7,237,200,117,182,156,79,213,186,69,30,123,60,13,248,6,252,87,236,63,162,78,227,251,39,196,114) -IMAGE_DATA(138,109,71,54,206,154,13,211,250,175,229,229,87,84,204,156,49,243,136,43,231,92,191,225,53,239,253,59,96,207,236,214) -IMAGE_DATA(173,91,193,140,153,51,75,62,250,248,211,138,63,125,254,37,83,201,231,95,124,201,100,30,122,34,31,85,115,82,87,62) -IMAGE_DATA(170,226,156,105,217,56,69,93,174,226,21,226,28,36,234,1,24,231,124,140,67,155,171,214,165,226,185,37,178,61,70,252) -IMAGE_DATA(155,106,142,0,200,186,78,245,140,168,107,101,221,33,207,143,242,187,178,207,197,246,140,202,39,171,211,227,34,116,233,203) -IMAGE_DATA(115,129,170,124,34,7,147,191,111,179,179,218,226,135,196,250,85,253,157,231,79,110,59,27,196,116,85,101,18,185,129,152) -IMAGE_DATA(111,241,119,104,59,149,237,65,108,15,153,111,201,115,167,106,222,151,109,56,170,249,198,84,47,226,187,42,91,154,108,83) -IMAGE_DATA(81,245,41,83,252,53,38,246,215,212,238,50,119,82,149,207,52,102,76,49,22,162,141,208,165,93,197,177,110,218,235,39) -IMAGE_DATA(142,7,57,95,152,248,33,145,111,203,109,47,115,86,213,251,98,249,228,178,135,214,171,13,208,215,249,220,169,235,187,98) -IMAGE_DATA(249,196,244,109,92,77,126,70,46,127,168,30,2,216,246,218,66,249,68,174,104,218,171,132,25,123,42,253,32,175,43,228) -IMAGE_DATA(247,41,126,168,118,2,179,119,2,246,122,14,190,111,208,225,93,187,246,160,121,167,203,217,240,109,219,181,203,31,51,230) -IMAGE_DATA(193,162,21,43,86,149,253,241,224,231,236,224,159,64,190,208,202,159,62,255,66,201,67,143,231,163,24,78,138,227,163,242) -IMAGE_DATA(249,156,131,134,12,75,229,28,57,113,238,50,197,152,112,61,160,219,51,104,210,175,58,29,32,234,48,157,158,20,231,0) -IMAGE_DATA(140,46,149,245,24,255,29,116,185,138,191,136,58,72,247,140,56,95,202,186,86,92,119,235,202,47,190,47,235,122,177,124) -IMAGE_DATA(58,59,162,110,30,7,136,99,77,213,6,182,248,33,19,103,22,231,8,151,51,103,196,252,154,248,133,202,126,42,174,87) -IMAGE_DATA(77,28,94,103,239,17,203,163,171,79,177,223,234,158,17,211,17,127,23,219,18,83,167,186,103,196,58,210,173,147,76,227) -IMAGE_DATA(209,212,238,38,187,188,42,143,38,59,171,216,6,33,237,10,233,64,31,178,221,227,39,126,91,126,14,19,63,164,227,235) -IMAGE_DATA(98,222,177,245,42,247,13,147,191,71,149,127,87,206,41,190,171,75,95,212,215,156,51,201,107,127,93,250,38,93,31,170) -IMAGE_DATA(135,0,182,190,33,251,92,116,249,212,241,106,113,236,153,246,249,152,56,43,197,15,213,94,184,220,255,212,226,178,203,255) -IMAGE_DATA(61,176,255,128,127,189,188,100,41,43,43,251,64,203,57,251,220,118,91,161,252,157,38,77,154,230,181,109,219,46,255,129) -IMAGE_DATA(74,126,57,109,250,140,146,77,155,54,31,252,236,143,127,98,178,0,239,212,9,142,143,234,57,169,43,31,133,252,200,231) -IMAGE_DATA(113,166,21,171,142,93,151,131,141,64,188,143,11,51,247,114,232,184,169,104,119,208,141,127,215,103,196,223,229,253,87,170) -IMAGE_DATA(119,93,159,145,117,37,38,38,220,100,211,18,237,26,58,29,106,226,39,166,57,26,115,14,157,78,191,3,196,125,139,186) -IMAGE_DATA(178,169,128,189,19,137,223,197,193,215,9,152,53,136,234,27,186,223,109,115,18,102,222,146,231,112,49,143,186,121,83,108) -IMAGE_DATA(19,221,51,38,123,28,255,221,20,3,99,106,119,254,187,137,155,153,214,105,34,255,208,253,238,210,174,46,48,217,50,249) -IMAGE_DATA(239,166,189,146,58,190,46,230,221,164,231,76,188,58,180,94,109,192,240,70,0,228,75,220,11,34,214,153,109,109,168,211) -IMAGE_DATA(217,24,61,100,90,231,152,214,213,0,121,207,139,41,143,58,125,105,179,179,114,168,236,35,28,116,110,92,237,133,184,246) -IMAGE_DATA(114,21,176,129,182,109,115,77,121,215,27,110,252,126,200,224,33,229,92,70,141,24,245,217,210,101,203,203,94,169,20,56) -IMAGE_DATA(63,233,119,191,255,140,129,252,254,15,127,60,42,127,248,236,224,9,162,226,160,88,62,106,227,164,62,124,20,226,248,69) -IMAGE_DATA(206,217,169,115,23,37,215,201,5,176,122,78,134,139,158,19,121,128,168,135,117,243,186,234,93,204,51,178,46,51,205,235) -IMAGE_DATA(46,207,232,214,198,216,179,133,117,243,168,110,207,2,246,251,98,217,85,58,20,19,139,162,179,93,136,115,132,139,189,70) -IMAGE_DATA(124,207,53,142,66,228,5,182,249,90,103,59,199,172,1,120,159,199,60,35,151,65,108,75,83,204,183,142,55,113,96,236) -IMAGE_DATA(113,49,226,135,92,191,15,80,213,161,216,87,67,227,99,120,76,188,105,126,144,219,198,228,107,16,161,26,79,98,222,109) -IMAGE_DATA(122,78,172,63,145,243,199,168,87,19,68,62,103,74,95,5,151,59,74,85,245,27,67,15,217,206,234,151,247,24,243,189) -IMAGE_DATA(212,42,17,203,227,106,163,16,203,168,42,75,86,206,141,35,36,3,57,190,35,134,28,56,240,94,85,220,251,167,191,249) -IMAGE_DATA(29,251,245,79,2,49,73,85,34,216,68,57,31,253,93,6,249,232,210,101,175,30,74,59,110,8,32,234,113,215,59,192) -IMAGE_DATA(48,246,36,14,157,78,212,205,235,34,48,186,80,247,12,70,255,99,158,209,217,125,176,123,131,48,241,67,38,126,161,251) -IMAGE_DATA(62,192,196,159,48,54,23,221,124,195,243,236,202,47,196,185,199,117,238,52,197,71,200,80,113,8,204,26,0,115,206,128) -IMAGE_DATA(233,25,140,127,23,243,140,206,30,135,89,3,1,48,241,67,166,247,117,223,23,235,80,212,9,33,156,136,167,139,137,23) -IMAGE_DATA(215,233,35,236,253,67,170,60,138,121,183,233,57,157,45,45,180,94,109,16,249,148,139,125,212,197,223,36,214,143,28,111) -IMAGE_DATA(136,209,99,38,27,161,109,157,229,226,247,20,69,228,150,24,251,131,105,109,162,235,219,132,218,5,23,61,131,145,7,70) -IMAGE_DATA(63,80,241,209,39,191,102,31,115,249,244,55,85,231,47,125,2,60,148,11,150,143,10,54,82,63,62,234,231,179,159,54) -IMAGE_DATA(99,214,191,184,79,189,110,221,186,169,157,207,32,234,87,215,59,226,248,123,54,126,32,142,115,113,14,14,157,251,57,76) -IMAGE_DATA(62,29,140,254,199,60,163,91,27,187,198,15,201,252,0,251,190,238,251,182,250,193,218,92,100,222,42,206,65,174,123,158) -IMAGE_DATA(124,247,179,137,253,36,201,185,211,180,79,129,195,228,67,228,191,251,172,129,48,207,196,140,31,210,189,111,250,190,110,29) -IMAGE_DATA(20,178,79,81,142,235,128,254,12,99,85,230,86,166,177,108,218,75,192,129,137,175,177,233,57,145,59,137,125,200,181,94) -IMAGE_DATA(67,214,240,46,239,217,246,88,138,16,235,71,172,223,80,61,36,230,95,199,7,229,115,26,176,34,166,161,211,163,34,76) -IMAGE_DATA(107,19,236,26,159,80,179,129,57,203,205,69,192,239,14,103,125,126,240,209,39,85,242,33,200,199,159,86,157,253,89,37) -IMAGE_DATA(42,62,250,211,153,160,113,249,168,153,147,234,248,40,124,35,237,56,117,142,144,121,4,203,15,68,29,160,179,155,248,204) -IMAGE_DATA(253,170,244,117,58,202,164,255,67,158,49,217,31,85,101,144,231,4,204,251,166,181,185,141,99,97,109,46,242,124,39,158) -IMAGE_DATA(3,99,122,79,5,223,61,250,216,24,15,128,110,95,7,230,219,174,207,136,252,6,227,223,181,237,107,147,203,42,63,99) -IMAGE_DATA(218,139,198,97,218,83,138,185,123,208,244,125,157,61,47,68,87,136,237,101,234,83,166,177,140,177,113,233,108,109,46,121) -IMAGE_DATA(23,247,53,138,191,99,198,18,214,255,174,130,47,231,196,196,204,113,232,246,227,98,246,56,218,108,132,54,62,136,29,219) -IMAGE_DATA(58,96,247,86,152,246,190,96,109,213,132,154,15,204,25,183,46,50,122,212,232,138,178,247,63,100,85,242,193,71,236,125) -IMAGE_DATA(46,31,126,92,117,215,145,204,71,63,244,224,163,191,230,124,84,56,75,52,6,31,221,252,230,214,35,105,239,225,228,192) -IMAGE_DATA(234,98,126,182,165,56,214,177,58,68,23,79,130,177,91,96,158,137,21,63,132,217,239,40,63,131,153,39,76,177,11,152) -IMAGE_DATA(189,69,166,239,219,248,19,134,79,3,68,27,14,215,203,174,231,191,171,242,164,235,83,60,30,158,159,231,42,151,211,214) -IMAGE_DATA(167,116,241,14,152,185,19,243,140,110,143,44,198,191,27,250,12,166,14,76,177,253,161,220,78,103,207,243,109,87,151,189) -IMAGE_DATA(148,166,125,137,152,125,56,186,61,13,88,61,135,137,31,50,141,37,83,60,158,13,24,93,194,243,199,239,16,147,191,105) -IMAGE_DATA(226,98,166,152,245,80,61,132,225,131,252,239,182,248,33,232,47,42,62,136,177,63,0,76,107,19,223,189,182,132,154,9) -IMAGE_DATA(177,207,134,10,216,58,223,218,181,135,29,120,239,125,246,46,72,217,7,85,2,177,57,239,85,242,208,247,76,124,244,39) -IMAGE_DATA(78,138,229,163,159,32,249,232,111,145,124,116,198,172,185,135,250,245,31,88,146,118,123,0,48,113,128,162,78,19,117,141) -IMAGE_DATA(234,236,102,83,250,178,174,142,29,63,36,63,131,209,255,161,49,70,98,159,84,189,43,223,143,32,242,35,236,222,34,76) -IMAGE_DATA(124,177,45,126,200,102,115,145,207,230,179,205,95,216,180,116,254,109,93,44,0,102,94,50,157,49,136,153,59,67,98,140) -IMAGE_DATA(98,197,15,97,98,179,49,231,48,201,237,142,109,115,211,247,117,246,60,140,127,90,181,6,194,250,126,197,119,229,246,199) -IMAGE_DATA(198,234,233,248,34,134,151,201,103,99,234,206,136,74,34,126,8,128,57,235,65,117,222,2,246,252,42,221,217,33,49,244) -IMAGE_DATA(16,102,191,138,232,235,52,173,101,117,235,61,140,253,1,96,90,155,96,124,8,132,218,5,219,93,85,46,50,176,255,192) -IMAGE_DATA(195,111,31,120,143,129,188,243,110,217,81,57,0,82,201,67,49,124,180,204,196,71,69,159,189,141,143,86,10,134,143,66) -IMAGE_DATA(250,195,71,142,222,145,118,59,112,136,107,95,213,217,148,226,125,49,242,56,21,245,171,74,143,139,109,173,58,187,23,99) -IMAGE_DATA(183,112,137,49,146,159,137,21,63,132,137,239,85,205,69,114,252,156,41,190,216,180,183,200,53,190,88,149,62,230,126,102) -IMAGE_DATA(57,175,190,247,192,137,246,8,21,119,52,173,67,108,231,31,138,117,106,138,125,49,241,138,144,103,66,206,80,192,62,35) -IMAGE_DATA(242,73,185,221,228,181,129,92,7,24,27,43,246,251,166,125,28,46,237,170,219,123,107,42,151,105,143,169,207,158,6,219) -IMAGE_DATA(185,142,242,254,47,185,239,97,237,151,152,182,215,65,252,134,138,59,138,122,64,204,159,124,247,164,234,78,41,241,93,83) -IMAGE_DATA(187,250,234,33,12,231,148,239,160,146,255,46,231,83,183,231,4,123,254,168,233,204,122,226,156,39,23,98,242,206,23,95) -IMAGE_DATA(122,153,237,123,251,0,219,255,206,187,71,229,109,144,159,184,104,174,248,232,71,72,62,58,181,104,122,102,248,38,135,184) -IMAGE_DATA(254,133,241,204,207,214,19,125,194,42,206,40,243,20,72,7,218,22,116,133,152,166,234,190,137,88,241,67,161,241,197,161) -IMAGE_DATA(49,70,242,93,222,240,12,228,131,191,3,101,231,255,78,50,190,88,85,63,226,60,11,105,240,123,47,109,103,231,217,230) -IMAGE_DATA(30,12,68,46,14,223,230,125,74,236,23,170,62,37,235,6,168,95,200,183,220,167,108,253,17,179,79,2,19,99,36,63) -IMAGE_DATA(147,244,57,11,0,121,239,59,124,11,120,130,120,71,169,120,159,188,248,46,198,198,106,250,190,173,14,197,188,97,219,85) -IMAGE_DATA(188,87,128,151,135,199,135,136,119,150,155,214,176,98,95,231,126,123,254,62,183,9,218,248,182,172,147,224,27,208,190,80) -IMAGE_DATA(103,98,254,84,182,190,208,184,44,12,228,179,5,161,158,120,253,138,227,73,149,182,216,238,144,6,252,63,212,1,230,93) -IMAGE_DATA(236,121,162,38,61,40,175,71,184,174,145,207,94,19,203,39,206,53,114,27,168,242,137,25,123,54,255,187,124,23,4,60) -IMAGE_DATA(195,251,146,46,77,66,237,64,44,222,217,226,178,203,43,182,149,238,96,123,247,191,115,84,246,129,84,242,80,46,73,243) -IMAGE_DATA(209,247,77,124,84,176,145,78,154,60,165,36,237,122,87,193,22,227,5,227,84,103,243,178,181,35,232,7,219,221,133,186) -IMAGE_DATA(185,63,52,198,200,101,238,247,141,49,50,157,65,11,117,42,254,61,52,190,216,53,126,8,160,107,87,211,119,124,108,52) -IMAGE_DATA(50,108,251,183,117,253,2,32,243,120,89,160,30,84,239,98,230,206,144,24,35,215,51,20,124,99,140,160,93,117,117,7) -IMAGE_DATA(99,81,117,15,13,7,102,157,101,250,190,109,29,228,219,174,54,61,1,109,106,59,15,86,119,214,14,255,158,141,111,219) -IMAGE_DATA(244,156,202,174,28,171,94,177,176,213,147,201,54,111,43,155,238,221,24,241,248,242,186,130,139,234,62,5,83,255,209,181) -IMAGE_DATA(1,102,236,1,108,254,119,213,30,34,16,138,97,63,57,32,250,109,67,164,227,245,237,15,239,220,189,151,237,218,179,143) -IMAGE_DATA(237,222,187,159,237,217,247,246,81,17,185,168,141,143,238,151,249,168,192,73,67,249,232,196,73,207,150,164,93,223,38,192) -IMAGE_DATA(248,228,182,36,46,220,198,100,123,23,230,7,120,86,124,23,244,146,105,205,204,215,192,226,93,26,166,103,76,247,243,168) -IMAGE_DATA(158,129,127,243,223,117,124,21,190,27,235,25,126,198,53,8,204,187,114,44,181,170,156,252,30,64,147,190,51,125,31,83) -IMAGE_DATA(135,80,15,98,222,120,219,168,190,99,154,239,125,192,219,64,238,83,152,244,225,25,168,71,241,93,83,57,249,59,188,62) -IMAGE_DATA(66,158,129,62,175,122,70,108,11,93,62,98,62,35,142,41,168,11,241,158,67,221,251,252,119,108,159,146,223,199,212,143) -IMAGE_DATA(111,187,218,244,132,173,94,84,223,21,109,94,124,60,217,242,46,235,57,62,94,109,247,113,134,212,171,11,228,182,231,245) -IMAGE_DATA(132,73,19,242,39,143,27,40,175,169,108,161,122,200,150,111,213,115,178,78,178,181,1,182,110,49,125,0,158,17,191,13) -IMAGE_DATA(66,49,236,39,15,160,173,69,219,191,175,244,238,213,251,135,55,183,150,178,173,165,59,216,182,237,111,177,210,29,59,217) -IMAGE_DATA(246,183,118,177,183,118,238,97,222,124,84,182,145,122,242,209,94,183,244,46,76,187,158,9,4,19,248,62,10,218,231,68) -IMAGE_DATA(32,16,8,132,218,12,88,219,248,222,81,32,74,175,30,61,127,216,240,218,235,108,227,166,205,236,181,215,223,96,175,111) -IMAGE_DATA(222,2,231,18,177,55,182,108,99,85,124,116,219,241,124,116,199,206,221,104,62,186,215,131,143,86,126,167,162,117,235,54) -IMAGE_DATA(249,105,215,47,129,96,130,232,207,11,177,207,16,8,4,2,129,80,83,16,227,158,204,155,187,223,252,195,170,213,107,217) -IMAGE_DATA(234,53,235,88,201,218,245,108,205,186,13,108,237,250,141,108,253,134,77,204,196,71,183,108,219,206,182,149,30,207,71,225) -IMAGE_DATA(44,38,37,31,85,217,72,37,62,90,52,109,70,105,131,6,13,188,226,126,9,132,36,193,247,205,131,175,214,118,246,0) -IMAGE_DATA(129,64,32,16,8,181,21,224,107,15,181,121,118,239,214,253,135,151,95,89,14,119,154,179,101,203,87,178,229,175,174,98) -IMAGE_DATA(175,174,92,205,86,172,42,97,85,124,180,196,204,71,55,109,126,147,109,126,227,120,62,10,62,251,19,248,232,238,19,249) -IMAGE_DATA(232,150,173,165,21,29,59,117,178,238,129,36,16,210,130,42,70,199,39,206,150,64,32,16,8,132,218,0,91,124,155,77) -IMAGE_DATA(174,186,178,197,15,211,166,207,98,197,207,191,196,158,127,113,9,123,225,165,151,217,75,75,94,97,75,94,94,198,56,31) -IMAGE_DATA(125,101,249,138,227,248,232,202,213,107,170,249,232,154,99,124,116,221,134,215,216,134,141,199,243,209,215,223,216,114,34,31) -IMAGE_DATA(221,190,147,141,26,125,127,49,217,54,9,89,7,236,223,231,231,237,240,243,173,210,206,19,129,64,32,16,8,105,130,199) -IMAGE_DATA(41,6,112,207,35,35,70,140,252,207,188,249,139,216,252,5,139,217,130,133,207,177,133,139,139,217,162,231,158,103,207,21) -IMAGE_DATA(191,168,230,163,75,37,62,186,226,24,31,93,85,178,246,4,62,186,126,227,38,54,230,193,135,74,126,113,206,57,121,105) -IMAGE_DATA(215,23,129,64,32,16,8,4,2,193,31,156,123,250,198,183,183,109,115,237,255,125,250,153,9,108,250,204,217,108,230,172) -IMAGE_DATA(185,108,214,236,121,108,246,156,249,108,206,188,5,108,238,252,133,199,248,232,34,137,143,190,80,205,71,95,92,178,244,4) -IMAGE_DATA(62,186,236,213,149,108,248,136,145,37,103,159,253,139,188,180,235,135,64,32,16,8,4,2,129,16,23,252,252,49,31,238) -IMAGE_DATA(217,225,250,246,135,198,141,123,146,61,59,185,136,77,158,58,141,77,45,154,193,138,166,205,100,224,131,159,62,99,54,155) -IMAGE_DATA(49,107,206,49,62,58,87,205,71,159,157,82,84,222,181,107,254,184,122,245,234,145,15,157,64,32,16,8,4,2,161,150) -IMAGE_DATA(3,206,116,129,56,119,31,254,217,238,154,182,223,23,22,142,100,207,140,159,200,198,79,152,196,38,76,124,150,77,156,52) -IMAGE_DATA(133,77,122,118,106,53,31,157,50,141,77,41,154,126,148,143,62,244,208,163,7,111,237,115,91,113,227,38,77,232,220,88) -IMAGE_DATA(2,129,64,32,16,8,132,147,24,252,254,12,136,137,192,250,224,47,109,126,209,191,187,116,238,114,120,216,176,225,236,201) -IMAGE_DATA(167,198,31,149,123,238,25,84,214,253,166,30,197,87,93,221,170,240,140,51,206,200,75,187,108,4,2,129,64,32,16,8) -IMAGE_DATA(132,236,2,108,161,32,117,78,173,211,1,56,169,74,224,111,245,235,215,111,117,254,249,231,223,86,167,78,29,242,151,19) -IMAGE_DATA(8,4,2,129,64,32,16,8,4,2,129,64,32,16,8,4,2,129,64,32,16,8,4,2,129,64,32,16,8,4,2,129) -IMAGE_DATA(64,32,16,8,4,2,129,64,32,16,8,4,2,129,64,32,16,8,4,2,129,64,32,16,8,4,2,129,64,32,16,8) -IMAGE_DATA(4,2,129,64,32,212,18,252,127,34,96,163,245,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) -IMAGE_END_DATA(14304, 1) - -IMAGE_BEGIN_DATA -IMAGE_DATA(120,156,237,217,89,72,84,95,28,7,112,179,164,197,5,35,164,178,242,197,34,77,197,114,121,17,132,72,123,200,13,203) -IMAGE_DATA(66,177,135,34,80,49,44,44,50,232,33,137,144,8,124,146,160,68,51,72,9,21,84,20,11,113,1,233,161,204,122,144) -IMAGE_DATA(194,130,64,44,209,194,10,76,83,179,77,127,127,126,135,185,135,59,119,155,209,191,141,147,243,253,192,149,241,44,115,239) -IMAGE_DATA(61,191,123,150,123,198,171,212,235,172,23,0,0,0,0,0,120,12,82,29,174,168,247,127,88,157,211,242,122,30,61,122) -IMAGE_DATA(68,71,143,30,165,93,187,118,145,175,175,47,237,221,187,151,142,31,63,238,202,107,119,55,171,62,238,77,77,77,228,237) -IMAGE_DATA(237,77,154,50,148,153,153,137,184,187,54,126,75,181,164,184,31,62,124,88,230,93,185,114,133,38,38,38,232,243,231,207) -IMAGE_DATA(226,248,171,87,235,222,86,125,220,183,109,219,38,243,198,198,198,254,133,251,116,5,195,246,154,153,153,161,240,240,112,153) -IMAGE_DATA(23,20,20,68,67,67,67,228,168,158,226,201,147,39,116,236,216,49,138,140,140,20,243,233,230,205,155,197,231,172,172,44) -IMAGE_DATA(170,173,173,165,239,223,191,27,214,27,31,31,167,188,188,60,138,136,136,160,128,128,0,74,74,74,162,251,247,239,43,101) -IMAGE_DATA(151,58,191,255,75,207,182,171,24,182,73,110,110,174,76,223,180,105,19,61,127,254,92,219,102,166,109,89,88,88,168,155) -IMAGE_DATA(75,181,7,199,245,253,251,247,118,117,159,61,123,70,234,190,169,62,248,89,176,58,167,73,158,163,235,240,100,186,118,168) -IMAGE_DATA(170,170,146,105,107,215,174,37,94,11,59,83,143,221,190,125,91,166,231,228,228,208,155,55,111,68,223,158,154,154,162,135) -IMAGE_DATA(15,31,138,245,180,146,127,228,200,17,89,247,207,159,63,180,103,207,30,135,207,139,209,57,45,174,7,113,55,103,215,14) -IMAGE_DATA(3,3,3,180,126,253,122,153,86,83,83,99,214,62,134,237,199,253,88,73,31,29,29,213,213,229,241,127,223,190,125,116) -IMAGE_DATA(237,218,53,122,253,250,181,204,183,157,71,62,107,101,101,101,244,241,227,71,113,220,184,113,67,164,153,157,211,234,122,156) -IMAGE_DATA(200,243,84,178,77,184,79,134,134,134,202,255,175,95,191,110,213,78,134,109,201,235,0,37,61,59,59,155,122,123,123,137) -IMAGE_DATA(251,178,163,139,200,200,200,144,245,46,92,184,160,43,127,238,220,185,149,136,187,163,251,119,213,119,252,13,178,77,120,205) -IMAGE_DATA(165,124,94,179,102,141,24,163,157,169,167,78,228,189,17,77,30,109,217,178,133,78,159,62,77,29,29,29,244,251,247,111) -IMAGE_DATA(195,239,140,138,138,146,229,213,227,128,130,199,33,179,115,90,93,143,19,121,86,150,35,46,110,31,119,237,113,232,208,161) -IMAGE_DATA(69,199,125,120,120,152,118,236,216,97,250,157,252,12,148,148,148,208,215,175,95,237,234,249,251,251,203,50,179,179,179,186) -IMAGE_DATA(243,242,59,183,217,57,173,174,199,137,60,43,30,19,119,245,56,205,71,99,99,227,162,230,119,54,50,50,66,69,69,69) -IMAGE_DATA(228,231,231,103,25,255,183,111,223,202,186,129,129,129,50,111,114,114,82,247,157,223,190,125,91,209,184,243,26,131,247,124) -IMAGE_DATA(140,242,90,90,90,104,221,186,117,98,93,20,31,31,175,125,247,145,159,249,121,230,49,117,231,206,157,164,90,59,175,20) -IMAGE_DATA(217,38,97,97,97,98,15,107,255,254,253,50,45,56,56,152,166,167,167,151,212,150,188,7,208,222,222,78,231,207,159,23) -IMAGE_DATA(107,57,77,29,241,110,174,148,61,112,224,128,76,127,249,242,165,91,141,243,21,21,21,100,91,95,232,242,24,199,156,223) -IMAGE_DATA(99,126,252,248,65,213,213,213,100,91,219,234,202,21,23,23,211,213,171,87,197,251,205,169,83,167,220,38,238,220,79,57) -IMAGE_DATA(161,175,175,207,174,141,47,93,186,180,44,109,201,223,207,239,118,74,61,222,151,81,242,120,143,71,73,231,246,209,214,45) -IMAGE_DATA(40,40,88,145,184,223,187,119,143,18,18,18,104,97,97,193,52,238,201,201,201,148,150,150,70,221,221,221,70,115,148,252) -IMAGE_DATA(159,127,11,122,241,226,133,248,255,241,227,199,110,19,119,117,226,153,51,103,100,58,63,207,6,107,45,195,122,92,174,180) -IMAGE_DATA(180,84,236,245,61,125,250,84,119,95,60,255,43,245,120,255,78,73,111,110,110,182,139,43,247,139,119,239,222,209,135,15) -IMAGE_DATA(31,196,103,94,103,154,157,211,234,122,156,200,179,66,39,78,156,16,191,221,105,247,152,212,223,197,99,100,98,98,34,249) -IMAGE_DATA(248,248,136,61,46,37,182,218,114,27,55,110,36,219,124,229,101,155,203,220,46,238,95,190,124,17,123,171,74,222,193,131) -IMAGE_DATA(7,157,138,123,74,74,138,76,231,121,172,181,181,85,252,14,194,99,219,171,87,175,72,253,190,198,115,166,82,143,251,83) -IMAGE_DATA(116,116,180,110,46,176,56,156,186,15,39,242,172,208,175,95,191,232,193,131,7,116,242,228,73,211,184,43,230,230,230,232) -IMAGE_DATA(238,221,187,180,117,235,86,195,184,243,92,167,244,5,222,155,92,194,245,44,39,211,54,169,172,172,180,107,235,250,250,122) -IMAGE_DATA(237,253,232,234,241,94,77,108,108,172,195,184,113,63,210,142,157,131,131,131,20,18,18,98,88,222,214,238,46,143,59,255) -IMAGE_DATA(225,235,140,137,137,33,219,26,195,46,143,113,60,239,220,185,35,198,120,101,141,103,84,238,242,229,203,116,241,226,69,177) -IMAGE_DATA(14,200,207,207,119,219,184,207,207,207,83,92,92,156,204,223,190,125,187,24,167,184,15,40,105,27,54,108,208,213,251,249) -IMAGE_DATA(243,39,213,213,213,81,122,122,186,216,7,226,121,156,199,63,110,31,238,239,61,61,61,166,247,251,233,211,39,177,23,207) -IMAGE_DATA(99,43,143,55,252,46,121,235,214,45,101,239,103,69,226,206,186,186,186,200,246,123,174,46,175,191,191,95,140,85,28,111) -IMAGE_DATA(62,56,246,70,229,56,222,188,190,217,189,123,55,117,118,118,174,116,220,23,141,231,0,47,91,59,218,246,219,61,145,199) -IMAGE_DATA(220,55,207,209,252,78,87,94,94,46,227,110,27,211,61,6,143,101,188,6,213,140,229,171,154,122,141,175,28,169,169,169) -IMAGE_DATA(30,115,255,236,230,205,155,98,221,174,25,203,87,53,245,92,175,28,109,109,109,30,115,255,158,138,215,53,188,159,202,107) -IMAGE_DATA(57,94,199,52,52,52,32,230,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) -IMAGE_DATA(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) -IMAGE_DATA(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,238,63,255,205,140,86,0,0,0,0,0,0) -IMAGE_END_DATA(1472, 1) - -IMAGE_BEGIN_DATA -IMAGE_DATA(120,156,237,155,125,108,84,89,25,198,223,105,75,161,5,74,129,2,219,82,192,22,74,129,242,89,192,242,221,133,41,12) -IMAGE_DATA(180,212,82,190,26,218,46,95,5,182,165,192,0,165,12,80,224,116,179,174,68,93,162,81,163,104,76,136,38,174,70,131) -IMAGE_DATA(196,141,137,26,99,252,7,162,209,68,140,137,33,187,107,178,254,33,65,214,253,32,110,118,215,213,13,245,121,111,103,102) -IMAGE_DATA(167,119,190,58,237,116,166,116,158,95,242,114,239,220,123,238,61,231,222,231,61,239,121,207,185,69,186,165,91,2,232,17) -IMAGE_DATA(146,202,244,120,173,196,107,185,201,109,14,73,48,61,138,244,250,192,49,216,26,161,15,164,18,61,62,164,215,7,206,11) -IMAGE_DATA(125,32,149,232,9,68,232,3,169,70,143,29,161,15,164,18,65,250,211,7,82,138,144,250,211,7,82,134,176,250,211,7) -IMAGE_DATA(82,130,136,250,211,7,70,60,81,245,167,15,140,104,162,105,238,179,87,97,95,133,213,195,242,146,216,94,18,95,130,52) -IMAGE_DATA(183,233,175,186,127,15,246,101,225,250,224,72,36,168,191,135,208,95,181,111,18,126,31,24,137,216,181,126,85,130,125,64) -IMAGE_DATA(245,175,145,190,218,103,194,26,159,21,121,227,11,34,79,190,129,114,87,69,62,89,40,114,23,199,171,18,251,8,100,16) -IMAGE_DATA(248,52,238,146,222,56,175,57,158,93,127,61,174,177,191,196,123,77,230,88,145,235,47,138,60,254,142,200,71,219,68,254) -IMAGE_DATA(177,66,228,181,253,34,15,110,193,23,78,137,60,132,115,156,69,185,180,36,60,15,137,13,213,119,37,236,184,124,154,223) -IMAGE_DATA(127,70,34,196,0,136,218,248,53,104,127,69,228,93,236,127,9,199,92,176,13,25,34,47,195,31,158,188,139,242,221,240) -IMAGE_DATA(11,28,91,15,203,72,252,35,145,24,209,126,253,172,244,205,237,194,198,128,106,196,252,223,136,252,47,91,228,91,248,189) -IMAGE_DATA(17,182,24,253,253,133,47,138,252,251,30,244,223,129,254,255,23,92,83,40,114,27,231,10,96,142,132,63,17,137,5,213) -IMAGE_DATA(60,79,130,115,187,144,49,224,58,52,190,44,242,47,236,239,129,45,133,29,197,196,240,63,247,113,188,76,228,79,233,34) -IMAGE_DATA(47,189,34,242,223,93,34,175,227,156,83,122,115,5,242,244,17,50,6,104,174,215,42,242,79,236,111,130,176,47,169,246) -IMAGE_DATA(127,134,246,115,122,115,63,93,31,104,67,96,248,0,19,134,191,99,31,110,32,19,146,246,4,100,176,4,106,111,233,255) -IMAGE_DATA(50,242,124,12,250,143,71,137,188,130,128,240,254,253,79,181,111,134,173,69,255,127,238,167,24,31,118,246,246,127,245,135) -IMAGE_DATA(73,201,107,62,233,7,61,14,135,227,19,17,243,241,232,209,163,63,196,246,253,156,156,156,199,34,221,239,164,165,165,33) -IMAGE_DATA(206,183,188,125,227,198,141,247,68,106,223,185,123,247,238,131,149,82,248,225,239,161,57,156,225,201,61,43,230,63,243,193) -IMAGE_DATA(173,91,183,254,38,114,232,175,249,249,249,127,44,145,185,111,235,248,159,43,243,31,221,185,115,231,15,72,43,127,93,93) -IMAGE_DATA(93,253,115,220,239,103,59,118,236,128,107,116,255,164,161,161,225,71,216,254,160,185,185,249,251,216,222,108,105,105,249,46) -IMAGE_DATA(182,223,110,109,109,253,38,182,95,119,187,221,8,43,221,215,59,59,59,225,106,221,215,186,186,186,62,143,237,11,104,15) -IMAGE_DATA(166,153,25,93,104,223,5,145,236,206,130,130,2,204,51,114,221,115,231,206,61,33,50,181,173,188,188,28,57,74,97,203) -IMAGE_DATA(134,13,27,14,138,20,63,135,122,27,69,230,53,224,186,221,72,83,234,243,242,242,62,39,178,162,6,229,183,34,221,217) -IMAGE_DATA(188,106,213,170,77,72,79,42,113,191,117,34,227,87,227,248,103,69,242,151,227,55,198,181,146,69,184,110,1,234,41,197) -IMAGE_DATA(22,46,94,88,132,227,51,69,38,79,199,246,25,92,55,5,199,225,219,163,39,96,59,14,191,179,176,69,72,116,164,39) -IMAGE_DATA(91,208,88,200,204,204,252,40,74,17,205,11,2,255,62,180,10,47,255,225,35,104,140,151,247,0,191,161,137,52,192,106) -IMAGE_DATA(145,68,220,132,176,31,31,20,121,75,127,195,150,195,178,134,174,245,36,14,188,23,235,5,136,253,103,79,98,142,247,75) -IMAGE_DATA(244,255,78,140,5,24,235,223,184,38,242,232,87,240,9,56,194,91,152,244,93,66,177,74,24,250,11,215,1,134,51,83) -IMAGE_DATA(167,78,125,56,128,203,84,211,245,8,126,183,209,201,95,135,254,111,186,68,94,195,156,240,199,56,142,41,162,108,128,21) -IMAGE_DATA(195,70,199,179,173,100,72,120,115,128,215,233,218,142,206,239,117,142,167,121,62,166,254,178,26,86,46,189,253,158,218,63) -IMAGE_DATA(5,32,231,185,63,136,203,117,109,71,231,247,58,199,211,60,127,162,244,142,247,140,249,79,15,247,146,221,0,146,60,42) -IMAGE_DATA(42,42,126,151,128,106,76,128,197,114,78,86,174,92,105,48,111,52,133,133,133,38,59,59,219,32,94,153,93,187,118,133) -IMAGE_DATA(44,75,6,196,111,19,80,199,128,244,95,184,112,161,113,56,28,198,86,198,212,213,213,81,255,56,225,114,185,126,145,128) -IMAGE_DATA(106,6,164,127,85,85,149,255,220,133,11,23,204,169,83,167,204,241,227,199,45,27,210,214,166,22,183,19,80,199,128,244) -IMAGE_DATA(159,54,109,154,255,220,145,35,71,168,249,16,208,208,208,240,195,192,223,155,55,111,54,245,245,245,166,172,172,204,26,111) -IMAGE_DATA(115,115,115,173,253,157,59,119,154,226,226,98,115,254,252,249,144,58,180,182,182,90,26,45,88,176,192,140,31,63,222,108) -IMAGE_DATA(218,180,201,20,21,21,249,202,14,116,252,143,152,27,144,184,112,211,183,163,26,138,109,172,181,155,234,123,240,224,193,62) -IMAGE_DATA(122,108,221,186,213,4,246,213,64,243,246,219,88,53,142,214,14,18,39,160,185,254,29,135,174,3,250,223,47,98,130,217) -IMAGE_DATA(187,119,175,213,215,207,156,57,99,86,172,88,97,229,223,190,243,170,183,239,250,203,151,47,155,57,115,230,68,245,27,161) -IMAGE_DATA(254,195,149,175,232,63,218,175,197,251,126,91,90,90,130,222,177,142,11,243,231,207,183,206,239,217,179,199,127,126,198,140) -IMAGE_DATA(25,254,235,210,210,210,76,70,70,134,57,118,236,152,101,153,153,153,214,49,137,93,255,254,156,35,113,0,121,245,53,221) -IMAGE_DATA(230,229,229,249,223,181,246,253,202,202,74,163,125,59,218,245,181,181,181,254,235,78,159,62,29,84,254,196,137,19,201,208) -IMAGE_DATA(63,82,249,254,222,171,191,247,8,91,110,241,226,197,86,127,208,220,41,134,122,237,52,13,240,186,254,98,181,75,215,88) -IMAGE_DATA(196,22,103,39,77,154,100,14,28,56,96,42,42,42,76,87,87,87,200,246,235,28,221,87,62,48,46,248,240,206,213,135) -IMAGE_DATA(147,254,241,184,71,191,244,79,79,79,55,234,3,23,47,94,28,76,123,134,84,127,228,247,30,221,238,223,191,223,20,20) -IMAGE_DATA(20,132,29,115,213,23,206,157,59,103,220,110,119,159,103,25,55,110,156,191,76,103,103,103,208,115,234,156,93,82,84,255) -IMAGE_DATA(56,181,99,168,251,191,219,183,115,232,208,33,211,222,222,110,198,142,29,27,209,15,246,237,219,231,127,174,9,19,38,68) -IMAGE_DATA(140,255,103,207,158,77,170,254,154,131,232,218,81,168,115,218,55,181,143,106,25,205,113,171,171,171,67,150,83,191,214,24) -IMAGE_DATA(62,125,250,244,192,62,18,173,46,123,219,195,62,195,168,81,163,60,136,191,29,152,95,187,171,170,170,218,113,232,249,128) -IMAGE_DATA(211,126,253,241,174,235,208,222,26,212,227,66,123,157,232,123,149,145,94,66,127,88,186,116,233,243,246,99,218,207,151,47) -IMAGE_DATA(95,110,78,158,60,233,207,249,2,77,231,246,1,215,251,143,235,186,129,253,94,201,140,255,19,39,78,52,222,252,35,232) -IMAGE_DATA(156,162,218,235,188,71,53,83,109,189,57,112,80,57,141,121,154,11,233,124,72,227,164,132,208,63,90,93,145,158,1,125) -IMAGE_DATA(196,131,250,59,208,183,220,205,205,205,97,245,71,123,235,224,163,53,240,19,23,242,53,39,218,59,104,253,193,129,104,5) -IMAGE_DATA(52,46,232,156,80,188,90,232,250,142,239,156,87,115,203,236,99,131,162,243,0,73,130,254,51,103,206,52,171,87,175,54) -IMAGE_DATA(87,175,94,13,171,137,211,233,52,53,53,53,102,237,218,181,161,198,46,255,111,253,230,164,229,116,127,227,198,141,65,250) -IMAGE_DATA(247,167,174,72,207,48,111,222,60,15,124,167,67,247,145,123,135,213,31,237,173,195,166,6,57,151,171,172,172,204,25,238) -IMAGE_DATA(126,177,128,184,163,127,187,39,154,187,93,185,114,197,160,45,102,203,150,45,65,109,13,240,123,107,61,208,119,124,209,162) -IMAGE_DATA(69,125,244,213,126,162,57,227,209,163,71,125,243,135,164,232,191,123,247,110,235,91,161,125,173,42,240,94,250,29,97,221) -IMAGE_DATA(186,117,86,142,158,149,149,229,215,216,94,110,204,152,49,198,59,142,137,119,140,235,83,174,63,117,69,122,6,196,115,15) -IMAGE_DATA(98,187,165,127,126,126,126,88,253,209,190,58,180,183,6,237,117,161,189,78,244,195,120,244,127,245,41,217,182,109,155,255) -IMAGE_DATA(93,107,44,212,184,174,185,155,198,60,29,251,2,231,121,58,206,249,46,86,159,215,113,84,130,117,14,103,118,134,68,255) -IMAGE_DATA(75,151,46,153,146,146,18,211,216,216,24,73,19,11,143,199,99,173,111,121,215,192,130,202,233,24,232,235,19,222,181,175) -IMAGE_DATA(62,229,250,89,87,216,103,64,221,158,195,135,15,91,250,35,183,10,171,191,143,162,162,34,215,148,41,83,156,104,239,160) -IMAGE_DATA(245,199,179,233,255,223,19,93,243,41,47,47,143,170,159,250,186,61,206,233,177,192,117,160,64,243,190,147,164,140,255,218) -IMAGE_DATA(206,101,203,150,217,191,23,247,209,85,215,173,53,246,251,114,193,80,229,244,188,174,131,106,158,160,113,77,66,232,26,173) -IMAGE_DATA(174,72,207,128,216,239,65,46,215,129,28,194,13,63,8,171,63,218,107,197,255,89,179,102,185,74,75,75,157,104,111,60) -IMAGE_DATA(250,191,255,30,58,79,157,61,123,182,217,190,125,187,245,173,71,199,121,141,139,250,158,180,255,107,172,12,119,147,182,182) -IMAGE_DATA(54,107,173,95,227,160,126,51,210,113,114,242,228,201,161,198,0,59,67,166,191,178,102,205,26,227,253,142,28,116,78,99) -IMAGE_DATA(158,79,119,223,92,61,84,57,213,93,243,31,125,55,58,206,75,24,93,35,213,21,233,25,210,210,210,60,104,75,7,242) -IMAGE_DATA(8,55,222,113,59,198,155,144,250,35,223,171,67,27,107,208,86,23,204,185,100,201,146,65,235,15,157,43,6,123,143,167) -IMAGE_DATA(140,88,125,41,161,245,230,228,228,180,163,111,7,205,201,134,144,37,9,172,43,105,104,108,211,92,213,22,227,135,69,189) -IMAGE_DATA(24,203,61,24,59,58,16,107,221,24,95,218,155,154,154,18,166,63,230,145,165,137,170,43,153,104,14,175,121,190,45,198) -IMAGE_DATA(15,139,122,49,255,244,172,95,191,222,26,255,49,159,110,71,126,151,200,254,63,43,129,117,145,97,134,195,225,152,150,236) -IMAGE_DATA(54,144,164,194,255,159,159,194,96,238,193,255,167,69,8,33,132,16,66,8,33,132,16,66,8,33,132,16,66,8,33,132) -IMAGE_DATA(16,66,8,33,132,16,66,8,33,132,16,66,8,33,132,16,66,8,33,132,16,66,8,33,132,16,66,8,33,132,16,66) -IMAGE_DATA(8,33,132,16,66,8,33,132,16,66,8,33,132,16,66,8,33,132,16,66,8,33,132,16,66,8,33,132,16,66,8,33) -IMAGE_DATA(132,16,66,8,33,132,16,66,8,33,100,68,241,127,228,56,115,168,0,0,0,0,0,0,0,0,0,0,0,0,0,0) -IMAGE_END_DATA(2528, 1) - -IMAGE_BEGIN_DATA -IMAGE_DATA(120,156,237,157,91,108,28,229,21,199,211,170,82,43,209,10,85,173,212,86,234,83,111,168,188,33,181,85,85,74,213,170) -IMAGE_DATA(23,84,224,5,85,240,80,42,90,40,13,34,180,15,133,22,81,2,136,160,132,91,0,213,132,64,32,129,16,18,72,136) -IMAGE_DATA(157,164,113,156,155,99,167,196,118,18,18,59,1,199,14,196,183,146,248,18,20,199,4,39,118,12,142,113,190,238,239,216) -IMAGE_DATA(103,53,222,220,118,237,157,221,141,253,255,75,71,179,51,59,59,59,187,154,61,191,61,151,239,155,105,255,254,204,79,167) -IMAGE_DATA(93,55,237,139,211,80,144,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36) -IMAGE_DATA(73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,169,96) -IMAGE_DATA(53,124,122,248,188,54,56,208,23,134,135,78,142,172,39,150,99,214,211,176,190,79,79,39,151,221,253,67,182,116,75,125) -IMAGE_DATA(222,151,169,214,51,116,230,182,232,49,210,50,206,57,131,243,150,201,38,131,73,82,156,186,224,53,24,241,187,153,176,195) -IMAGE_DATA(253,59,204,192,255,183,31,237,15,205,157,61,102,251,218,186,67,109,99,187,45,89,111,60,52,178,205,215,59,250,206,206) -IMAGE_DATA(145,84,198,100,244,91,18,63,100,83,208,36,41,78,93,240,26,60,143,207,61,62,112,202,150,169,177,2,254,191,249,240) -IMAGE_DATA(9,227,65,197,174,253,161,170,190,213,150,155,118,52,36,151,165,213,117,102,175,174,175,9,175,148,110,13,11,87,109,9) -IMAGE_DATA(11,86,110,176,229,138,242,29,182,79,121,93,75,104,232,60,17,154,123,134,236,152,169,113,8,235,105,255,150,196,15,217) -IMAGE_DATA(20,52,73,138,83,153,94,143,131,31,127,50,102,221,253,56,62,126,79,251,137,80,219,218,109,182,173,177,35,108,173,111) -IMAGE_DATA(51,6,176,172,57,208,101,219,223,105,235,181,253,88,214,29,252,208,182,241,28,251,173,172,168,53,126,60,241,202,234,48) -IMAGE_DATA(235,217,165,225,222,167,94,14,243,150,87,24,99,74,183,55,134,154,230,68,172,114,100,32,180,29,31,54,158,116,13,134) -IMAGE_DATA(204,98,17,241,67,54,197,76,146,226,84,90,215,97,194,239,246,13,14,156,193,14,172,190,181,211,252,191,243,130,199,112) -IMAGE_DATA(129,184,193,99,7,12,159,143,191,199,239,99,172,99,236,3,19,96,10,175,171,104,232,10,235,119,53,134,101,91,106,195) -IMAGE_DATA(162,210,234,240,208,252,21,225,225,133,197,225,137,197,101,97,94,73,85,120,163,50,17,151,236,237,8,187,255,55,24,26) -IMAGE_DATA(187,135,67,231,177,83,161,187,175,223,98,161,40,71,50,206,111,201,100,147,208,36,41,78,165,115,13,166,114,3,95,221) -IMAGE_DATA(220,114,48,84,213,238,183,124,20,220,216,217,212,102,12,104,61,210,151,100,133,243,34,186,238,220,128,41,206,14,183,40) -IMAGE_DATA(67,96,68,217,238,150,176,174,166,197,152,241,194,234,234,48,119,217,22,51,30,47,173,104,176,231,136,95,96,24,117,147) -IMAGE_DATA(35,199,250,207,90,163,151,201,166,170,73,82,156,202,244,122,132,29,239,236,111,9,229,149,59,66,233,134,255,38,125,119) -IMAGE_DATA(87,239,136,239,198,224,4,57,45,55,103,7,143,157,29,196,14,240,130,120,197,115,91,176,131,109,24,108,97,121,224,131) -IMAGE_DATA(79,195,174,182,62,99,202,27,91,155,194,146,245,117,198,143,231,150,111,179,220,86,73,85,131,213,74,168,177,80,111,129) -IMAGE_DATA(95,48,203,235,246,98,136,108,42,155,36,197,169,76,174,197,214,163,31,134,242,109,59,195,242,213,27,194,214,237,111,91) -IMAGE_DATA(79,21,230,185,35,239,183,138,214,186,225,134,231,175,96,6,53,12,139,47,26,142,132,226,218,86,139,49,168,125,176,141) -IMAGE_DATA(231,220,222,220,127,212,182,177,100,29,134,96,172,19,119,56,71,48,175,143,192,16,234,42,254,126,222,199,149,205,223,35) -IMAGE_DATA(183,72,158,168,229,219,167,228,194,178,241,61,77,149,239,42,78,147,164,56,149,206,53,136,15,110,238,232,10,85,117,123) -IMAGE_DATA(45,103,69,191,45,117,7,171,61,16,115,244,245,39,249,193,255,127,122,175,60,206,128,31,248,255,186,238,211,97,125,125) -IMAGE_DATA(119,88,90,221,98,246,192,43,91,194,188,181,181,161,168,100,247,72,92,177,161,62,148,238,108,183,92,21,113,197,186,61) -IMAGE_DATA(29,161,166,245,184,109,227,49,188,129,29,24,143,97,8,177,7,175,123,121,243,110,99,8,245,119,88,196,251,121,110,204) -IMAGE_DATA(227,158,66,242,139,249,246,41,113,91,182,216,49,85,190,175,56,77,146,226,212,133,174,63,234,230,237,71,123,194,254,67) -IMAGE_DATA(157,102,240,193,217,17,53,239,195,34,135,100,125,87,163,245,139,133,101,187,195,204,23,215,133,217,75,182,132,59,231,22) -IMAGE_DATA(135,63,207,94,106,246,155,25,207,134,27,239,89,96,219,176,153,243,55,133,89,139,202,195,35,203,223,10,139,54,55,132) -IMAGE_DATA(165,53,7,195,170,221,157,161,100,71,187,45,177,210,61,71,140,65,240,196,205,120,84,209,96,245,118,150,196,33,22,203) -IMAGE_DATA(36,216,67,254,203,115,89,217,138,67,198,227,227,166,154,63,156,8,7,196,143,236,154,36,197,169,115,93,119,212,204,163) -IMAGE_DATA(236,32,254,240,154,2,188,32,182,112,191,236,253,187,48,131,216,225,190,121,197,97,246,162,17,102,192,10,56,241,235,219) -IMAGE_DATA(231,134,171,110,47,74,26,252,184,238,222,37,225,71,55,61,18,126,120,227,253,225,218,187,159,15,191,248,227,44,219,246) -IMAGE_DATA(232,226,234,240,143,23,43,195,204,87,183,135,162,53,137,120,100,125,67,152,191,169,49,44,172,108,30,99,47,109,107,51) -IMAGE_DATA(206,120,76,99,28,169,222,111,49,11,49,10,12,241,177,35,209,28,91,182,125,99,166,175,201,183,79,137,219,38,194,0) -IMAGE_DATA(241,35,187,38,73,113,234,92,215,29,236,32,47,5,55,48,175,105,88,61,227,240,72,93,155,109,212,52,42,246,247,135) -IMAGE_DATA(87,183,52,91,111,212,29,143,44,11,191,187,235,105,227,5,6,27,96,196,119,175,185,39,92,126,253,204,240,205,171,239) -IMAGE_DATA(14,95,251,249,12,91,231,49,207,97,87,222,250,164,173,179,61,202,151,233,79,150,134,25,207,108,76,242,36,213,96,200) -IMAGE_DATA(25,28,73,60,38,86,41,111,234,177,24,196,89,7,67,38,154,203,202,22,63,38,154,171,57,223,254,249,206,19,229,130) -IMAGE_DATA(31,217,250,140,23,218,47,147,239,42,223,223,187,248,33,229,90,231,186,238,142,159,60,25,14,31,63,102,22,237,137,133) -IMAGE_DATA(31,176,131,126,41,106,17,27,235,79,88,140,112,219,156,226,36,47,190,243,179,91,195,215,127,240,251,112,201,21,55,135) -IMAGE_DATA(175,252,228,47,198,13,12,38,96,240,2,70,176,188,244,199,183,25,79,216,215,141,109,206,21,246,39,54,129,37,55,204) -IMAGE_DATA(92,22,110,122,248,141,112,243,227,235,194,93,243,55,135,123,23,110,15,143,173,222,23,230,150,214,143,137,71,200,121,173) -IMAGE_DATA(172,239,178,92,151,215,66,168,243,123,127,88,190,124,99,186,190,38,147,215,102,195,127,101,219,159,229,154,77,19,249,140) -IMAGE_DATA(217,248,142,10,229,123,23,63,164,92,235,108,215,28,177,7,252,240,186,120,106,47,46,255,233,169,115,19,111,80,187,128) -IMAGE_DATA(5,48,0,102,16,67,192,10,124,63,126,31,255,143,207,199,247,179,78,156,225,207,185,241,28,219,49,248,195,177,56,6) -IMAGE_DATA(75,143,77,48,143,75,216,159,152,132,248,195,227,146,57,107,247,90,158,11,142,120,237,4,35,143,5,235,136,153,24,31) -IMAGE_DATA(66,204,84,72,190,49,211,227,101,219,15,198,225,203,226,242,141,113,126,198,92,243,39,87,12,145,164,56,21,189,214,168) -IMAGE_DATA(121,96,176,3,59,246,201,73,203,249,240,223,221,250,170,122,134,108,172,6,115,140,48,183,200,173,15,44,76,198,19,158) -IMAGE_DATA(123,242,120,1,31,79,124,80,217,18,66,249,187,159,134,121,101,77,86,7,33,54,249,210,183,127,107,172,193,136,89,224) -IMAGE_DATA(11,28,34,87,197,62,28,131,90,200,101,87,207,24,147,223,114,115,38,177,191,231,183,254,190,96,163,245,116,209,207,69) -IMAGE_DATA(173,100,113,85,187,113,196,250,184,18,231,204,24,21,62,199,251,189,31,23,148,111,204,228,120,153,250,177,139,225,51,229) -IMAGE_DATA(234,184,227,225,199,249,142,83,136,223,251,217,76,146,226,212,152,249,117,35,236,240,90,57,220,240,57,173,200,87,49,222) -IMAGE_DATA(226,15,119,61,30,174,189,229,95,86,231,192,127,147,91,114,223,206,227,219,30,92,105,236,40,174,61,154,228,7,245,145) -IMAGE_DATA(27,239,124,206,152,241,217,175,95,105,246,229,239,93,99,44,129,21,244,93,221,191,168,34,76,127,188,196,120,224,177,11) -IMAGE_DATA(241,8,199,133,51,172,179,116,158,16,143,144,203,194,224,137,199,36,158,207,130,33,240,131,185,85,232,57,246,241,42,217) -IMAGE_DATA(246,97,19,249,79,41,126,92,92,252,200,229,57,137,31,82,161,203,249,193,220,236,214,115,53,90,231,96,252,198,190,174) -IMAGE_DATA(83,86,31,167,22,77,47,213,244,89,139,45,62,96,121,223,252,82,243,249,248,106,247,245,196,28,240,4,31,206,216,14) -IMAGE_DATA(94,183,163,99,40,188,80,182,207,122,170,224,10,252,248,220,55,126,21,190,250,253,27,140,33,254,248,159,69,101,230,239) -IMAGE_DATA(137,35,120,61,76,240,122,7,199,246,122,7,219,56,7,175,157,192,145,203,111,154,109,219,189,46,66,77,132,120,7,134) -IMAGE_DATA(112,14,54,190,189,169,35,57,182,49,151,252,200,150,15,185,208,241,11,201,143,229,194,47,102,251,156,196,15,73,202,92) -IMAGE_DATA(73,126,16,123,12,156,74,250,88,184,65,109,156,28,16,156,240,62,92,250,171,96,1,76,32,166,32,87,228,252,32,7) -IMAGE_DATA(69,14,201,199,112,148,29,56,98,227,6,169,103,147,87,34,254,184,228,178,27,146,204,192,136,63,48,226,12,231,17,181) -IMAGE_DATA(12,103,8,198,251,242,28,76,32,70,129,17,176,200,217,129,113,14,94,91,231,181,236,15,71,56,71,198,20,50,54,157) -IMAGE_DATA(94,100,226,169,66,242,141,233,28,47,29,62,21,146,31,43,52,126,164,195,118,241,67,146,50,87,239,71,39,205,60,238) -IMAGE_DATA(32,230,160,103,137,222,37,24,1,55,110,127,108,121,184,187,104,181,141,239,139,206,129,203,248,10,248,130,239,38,151,101) -IMAGE_DATA(113,199,232,88,13,250,104,233,159,165,198,78,190,139,28,85,52,246,128,35,44,89,199,168,139,240,218,215,246,118,27,63) -IMAGE_DATA(240,253,48,192,88,49,167,216,120,4,207,224,1,231,197,115,228,171,200,151,145,199,138,246,103,17,167,56,63,24,191,232) -IMAGE_DATA(115,155,48,255,202,84,226,199,68,172,144,190,163,116,191,139,137,124,198,108,242,35,95,223,187,248,33,229,90,196,27,222) -IMAGE_DATA(143,203,252,82,204,139,78,223,18,99,198,249,223,79,141,156,92,21,254,219,107,9,228,130,168,71,147,227,130,17,236,7) -IMAGE_DATA(63,240,215,228,160,200,27,217,190,7,251,195,245,127,125,212,242,84,159,255,214,85,73,86,68,185,225,121,44,106,229,244) -IMAGE_DATA(220,174,121,175,215,98,16,204,227,13,114,91,156,83,109,231,176,113,173,184,166,57,44,88,83,111,140,240,250,139,247,118) -IMAGE_DATA(17,7,81,67,161,47,139,152,7,126,48,14,190,238,221,247,109,142,71,198,62,22,146,111,76,215,175,93,104,223,66,242) -IMAGE_DATA(97,113,249,197,56,125,117,33,240,35,219,236,16,63,164,184,69,158,202,107,28,248,100,124,46,49,7,117,106,184,64,29) -IMAGE_DATA(3,31,140,207,166,142,192,255,119,27,15,50,56,96,245,117,242,83,127,155,251,186,241,3,127,78,60,66,140,176,110,95) -IMAGE_DATA(167,241,131,186,9,236,240,158,43,150,158,195,226,49,252,152,246,133,203,195,47,111,121,192,216,0,67,48,98,24,226,17) -IMAGE_DATA(94,79,12,67,172,3,175,124,206,94,206,135,247,33,86,33,14,33,246,240,26,59,252,32,110,225,179,48,207,34,243,169) -IMAGE_DATA(48,79,112,33,141,255,72,231,120,169,219,114,193,143,184,252,124,190,143,91,232,252,136,131,29,226,135,20,183,24,59,14) -IMAGE_DATA(59,240,253,212,47,188,54,77,220,0,59,136,59,156,29,140,161,176,49,33,9,118,216,61,165,70,199,19,62,249,159,55) -IMAGE_DATA(237,117,228,183,108,252,69,117,139,177,0,126,16,51,16,91,120,191,21,220,240,190,43,108,218,165,87,24,95,136,119,182) -IMAGE_DATA(39,56,6,59,168,155,60,183,105,143,189,63,243,160,208,243,69,239,48,239,231,247,19,97,174,119,198,118,48,102,16,134) -IMAGE_DATA(16,111,192,61,242,108,212,103,48,206,157,57,22,61,94,34,79,119,49,242,35,83,214,196,237,147,196,143,248,63,107,182) -IMAGE_DATA(76,146,226,20,61,182,112,131,248,129,92,21,181,6,150,108,195,135,19,123,80,235,96,46,91,226,13,171,177,39,24,66) -IMAGE_DATA(191,22,215,39,219,152,135,157,24,196,243,92,240,131,248,131,220,22,241,201,29,143,46,78,246,237,166,242,131,109,188,95) -IMAGE_DATA(101,235,137,208,240,113,176,99,189,86,123,96,132,31,37,85,198,15,230,213,77,189,247,57,227,56,136,69,120,47,114,93) -IMAGE_DATA(212,237,57,7,171,209,68,230,245,37,246,240,177,131,133,56,255,213,185,142,151,169,143,139,211,183,22,138,159,159,108,252) -IMAGE_DATA(200,5,123,36,41,78,241,191,31,118,240,191,157,156,17,253,85,228,146,240,197,204,71,200,127,124,171,121,180,142,220,155) -IMAGE_DATA(9,126,68,175,79,252,49,185,37,230,76,196,162,252,32,142,32,6,129,13,28,159,26,57,252,32,230,240,120,132,56,135) -IMAGE_DATA(30,223,183,123,67,168,60,244,81,88,246,86,163,217,210,109,123,195,83,43,54,134,39,94,90,101,247,135,242,247,114,35) -IMAGE_DATA(14,177,24,36,193,40,222,15,214,60,248,226,26,91,18,47,89,204,148,56,47,246,137,123,254,221,108,243,99,60,62,174) -IMAGE_DATA(144,252,152,248,33,126,72,83,67,248,121,230,172,181,251,193,38,30,179,132,3,127,154,249,116,152,254,80,145,245,46,209) -IMAGE_DATA(255,234,252,72,189,63,172,231,176,184,31,199,195,207,151,90,173,130,227,225,191,137,35,240,237,48,132,56,132,92,25,53) -IMAGE_DATA(22,239,227,226,53,212,94,120,14,118,172,111,238,8,37,245,205,198,142,162,226,114,187,239,249,138,242,29,99,238,3,149) -IMAGE_DATA(124,207,222,126,99,3,231,12,179,152,247,151,60,23,249,42,226,37,158,243,251,143,100,243,30,82,233,248,249,108,241,99) -IMAGE_DATA(162,190,117,60,108,139,139,31,217,56,151,56,63,99,54,249,145,175,239,93,252,144,114,45,191,39,121,244,158,179,228,170) -IMAGE_DATA(240,191,44,97,135,143,159,240,58,66,244,255,124,180,239,151,90,53,252,32,127,4,67,136,63,136,15,156,31,24,245,16) -IMAGE_DATA(152,225,247,8,36,246,96,159,242,166,46,179,149,181,239,134,103,74,183,134,57,175,37,88,180,100,173,205,125,152,250,94) -IMAGE_DATA(24,115,202,175,223,213,104,251,115,239,15,187,7,97,245,72,173,28,214,69,239,29,149,11,126,100,98,227,245,35,227,61) -IMAGE_DATA(214,68,206,47,159,223,83,186,12,205,197,113,243,241,89,197,15,169,208,229,243,35,70,125,179,115,196,99,11,106,13,204) -IMAGE_DATA(255,193,189,161,96,8,75,159,79,202,99,3,246,223,245,222,241,36,67,158,45,219,110,177,1,245,12,140,254,91,106,234) -IMAGE_DATA(85,77,159,88,143,48,185,37,230,67,129,45,240,131,216,163,116,95,91,120,126,115,149,197,29,228,174,136,125,124,190,117) -IMAGE_DATA(155,187,145,123,172,247,245,219,56,14,56,81,178,173,206,216,65,125,4,150,24,223,14,159,176,243,245,184,163,208,238,95) -IMAGE_DATA(155,206,49,51,121,239,92,156,95,33,125,87,249,58,110,190,62,171,248,33,21,178,252,58,75,205,73,165,114,133,152,3) -IMAGE_DATA(191,140,127,134,29,118,127,216,81,166,56,71,146,247,144,42,169,74,50,36,149,31,212,83,204,70,239,79,104,247,162,221) -IMAGE_DATA(211,97,113,196,194,202,157,97,206,235,107,204,216,22,229,24,239,207,251,237,108,106,179,56,99,105,69,181,241,35,202,14) -IMAGE_DATA(184,2,95,162,231,29,215,239,50,31,150,75,191,35,155,28,38,73,113,234,66,215,31,245,114,159,215,196,231,54,241,249) -IMAGE_DATA(120,109,78,222,4,75,24,91,1,71,24,135,200,24,68,106,31,244,244,146,131,98,9,71,168,81,48,94,131,158,40,140) -IMAGE_DATA(58,5,241,5,253,93,60,79,206,106,238,170,114,91,194,18,114,92,112,128,99,50,230,15,94,145,67,131,25,212,70,48) -IMAGE_DATA(234,36,62,54,208,217,193,156,193,147,145,29,152,248,33,203,212,36,41,78,69,231,223,77,46,71,31,51,39,150,175,123) -IMAGE_DATA(223,174,205,33,149,240,213,112,3,99,59,252,168,109,108,15,239,180,245,90,79,45,121,41,98,14,184,0,19,230,172,216) -IMAGE_DATA(98,227,0,125,44,160,217,146,181,214,91,69,221,155,117,242,85,228,174,200,97,213,28,250,200,242,91,196,40,155,119,182) -IMAGE_DATA(135,109,123,62,176,90,59,204,193,224,6,61,90,228,199,168,211,88,93,127,148,29,198,143,193,129,73,201,16,241,67,150) -IMAGE_DATA(169,73,82,156,58,235,117,231,76,137,112,197,239,103,235,247,36,180,251,18,142,222,95,234,80,215,49,203,45,193,15,216) -IMAGE_DATA(97,249,169,166,30,235,165,98,233,117,16,122,177,136,77,96,0,121,39,122,171,94,222,60,50,199,8,75,246,231,245,21) -IMAGE_DATA(13,93,86,127,103,59,115,109,193,14,231,135,245,19,31,236,15,91,59,7,109,188,33,57,179,100,190,10,110,48,182,241) -IMAGE_DATA(244,240,69,199,143,66,202,153,203,38,143,73,82,156,178,235,44,202,10,95,63,207,53,233,126,154,255,250,196,35,240,131) -IMAGE_DATA(28,19,181,17,122,181,200,41,193,0,250,169,136,39,48,24,130,177,221,239,41,139,239,183,120,162,162,193,114,86,190,63) -IMAGE_DATA(204,192,136,59,74,19,241,7,117,121,94,195,56,20,98,19,98,156,237,163,125,191,231,235,207,157,204,252,200,247,249,202) -IMAGE_DATA(46,14,147,164,56,53,158,107,210,238,19,50,154,35,162,38,2,59,168,137,88,109,61,97,86,91,63,50,96,124,32,191) -IMAGE_DATA(132,191,199,247,83,239,192,96,3,117,12,88,227,219,89,135,59,172,27,39,184,103,71,107,183,45,169,173,16,223,112,108) -IMAGE_DATA(63,46,189,191,19,189,151,135,76,54,217,77,146,226,212,68,174,205,232,61,67,156,33,212,34,252,62,127,206,20,239,219) -IMAGE_DATA(130,7,228,184,96,2,253,183,44,225,11,75,103,134,141,59,57,52,26,159,116,246,140,112,99,180,87,152,247,192,162,99) -IMAGE_DATA(24,243,253,251,148,201,10,217,36,41,78,77,244,250,116,63,238,125,90,54,71,97,95,191,205,55,197,120,13,252,62,254) -IMAGE_DATA(222,217,130,255,103,233,49,133,247,110,89,13,190,169,195,150,94,155,119,110,112,44,63,62,38,110,200,100,233,153,36,197) -IMAGE_DATA(169,108,95,175,169,60,241,190,95,106,36,240,192,99,8,226,17,216,224,121,41,239,3,198,216,215,235,42,176,200,153,161) -IMAGE_DATA(152,67,38,203,204,36,41,78,197,117,221,158,49,71,86,36,22,241,124,151,63,246,177,138,108,99,191,212,215,158,237,216) -IMAGE_DATA(249,254,93,202,100,23,131,73,82,156,202,230,181,154,26,123,184,241,156,207,253,238,53,119,175,103,68,121,98,243,147,244) -IMAGE_DATA(15,157,49,159,138,120,33,147,141,207,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36) -IMAGE_DATA(73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,146,36,73,202,92,255,7,244,13,91) -IMAGE_DATA(48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) -IMAGE_END_DATA(4320, 1) - -IMAGE_BEGIN_DATA -IMAGE_DATA(120,156,237,86,219,141,132,48,16,75,9,75,7,39,74,161,7,106,225,247,190,40,136,10,104,132,34,168,32,119,94,157) -IMAGE_DATA(87,179,81,2,147,39,171,19,89,89,64,24,143,77,8,214,154,135,121,24,49,108,6,158,252,239,4,128,55,77,147,37) -IMAGE_DATA(127,28,71,187,44,139,221,182,237,9,156,227,62,230,135,97,176,125,223,191,224,227,147,7,172,235,250,198,7,52,124,240) -IMAGE_DATA(48,215,117,221,91,61,106,206,248,243,60,191,124,226,28,61,36,80,199,190,62,62,184,172,11,129,189,124,124,114,249,172) -IMAGE_DATA(240,32,185,242,57,142,214,127,223,119,175,182,92,195,208,250,129,79,72,207,172,197,51,2,62,62,116,177,254,240,13,160) -IMAGE_DATA(7,223,29,1,46,238,133,248,124,135,236,33,223,63,128,57,212,132,248,4,247,15,251,208,15,184,184,239,227,231,236,255) -IMAGE_DATA(84,252,241,13,142,169,48,159,24,6,196,81,24,104,248,128,47,12,206,244,185,73,8,247,227,151,243,62,62,195,64,214) -IMAGE_DATA(242,195,149,215,154,48,8,173,87,76,24,184,220,152,48,240,233,107,195,192,213,149,215,103,97,32,107,101,24,200,249,80) -IMAGE_DATA(24,184,53,110,24,104,247,223,81,24,104,247,95,236,254,79,69,145,48,248,250,253,221,67,61,206,194,240,10,221,154,62) -IMAGE_DATA(180,253,107,248,136,233,87,122,45,114,117,115,60,148,212,78,241,160,225,165,254,89,40,225,33,39,52,83,61,216,192,92) -IMAGE_DATA(107,15,173,245,83,124,104,56,53,60,196,112,74,106,215,224,105,251,212,230,222,250,183,254,39,232,167,246,105,145,63,173) -IMAGE_DATA(244,143,250,185,61,75,229,78,140,190,22,185,227,74,237,28,15,165,199,149,218,49,30,90,140,171,116,255,213,248,1,123) -IMAGE_DATA(100,209,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) -IMAGE_END_DATA(416, 3) diff --git a/uppdev/AccessKey/icon.ico b/uppdev/AccessKey/icon.ico deleted file mode 100644 index f785b528f..000000000 Binary files a/uppdev/AccessKey/icon.ico and /dev/null differ diff --git a/uppdev/AccessKey/icon16x16.png b/uppdev/AccessKey/icon16x16.png deleted file mode 100644 index 3771396e5..000000000 Binary files a/uppdev/AccessKey/icon16x16.png and /dev/null differ diff --git a/uppdev/AccessKey/init b/uppdev/AccessKey/init deleted file mode 100644 index a98d445c1..000000000 --- a/uppdev/AccessKey/init +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _AccessKey_icpp_init_stub -#define _AccessKey_icpp_init_stub -#include "CtrlLib/init" -#include "Web/init" -#include "SubTest/init" -#define BLITZ_INDEX__ F190185a01d70a422cd7de990bd1c48a1 -#include "testing.icpp" -#undef BLITZ_INDEX__ -#endif diff --git a/uppdev/AccessKey/main.cpp b/uppdev/AccessKey/main.cpp deleted file mode 100644 index 076e76dc1..000000000 --- a/uppdev/AccessKey/main.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "AccessKey.h" - -GUI_APP_MAIN -{ - AKD_TEST - Ctrl::AddFlags(Ctrl::AKD_CONSERVATIVE); - AccessKey().Run(Accept()); - String s;S - s.Cat()Add - - AKD_CONS - - AKD_TEST -} diff --git a/uppdev/AccessKey/test.cpp b/uppdev/AccessKey/test.cpp deleted file mode 100644 index c21712d41..000000000 --- a/uppdev/AccessKey/test.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include "AccessKey.h" - - void test() -{ - if(a( && b) - { - } -1.f ssdf -} \ No newline at end of file diff --git a/uppdev/AccessKey/test.js b/uppdev/AccessKey/test.js deleted file mode 100644 index 4009e619e..000000000 --- a/uppdev/AccessKey/test.js +++ /dev/null @@ -1,48 +0,0 @@ -var s1 = new String("Hello !"); -var s2 = new String("Hello !"); -s1 == s2; // Is false, because they are two distinct objects. -s1.valueOf() == s2.valueOf(); // Is true. - -//Automatic type coercion -f1(true == 2 ); // false... true → 1 !== 2 ← 2 -alert2(false == 2 ); // false... false → 0 !== 2 ← 2 -alert3(true == 1 ); // true.... true → 1 === 1 ← 1 -alert4(false == 0 ); // true.... false → 0 === 0 ← 0 -alert5(true == "2"); // false... true → 1 !== 2 ← "2" -alert6(false == "2"); // false... false → 0 !== 2 ← "2" -alert7(true == "1"); // true.... true → 1 === 1 ← "1" -alert8(false == "0"); // true.... false → 0 === 0 ← "0" -alert9(false == "" ); // true.... false → 0 === 0 ← "" -alert(false == NaN); // false... false → 0 !== NaN - -//Type checked comparison (no conversion of types and values) -alert(true === 1); // false... data types do not match - -//Explicit type coercion -alert(true === !!2); // true.... data types and values match -alert(true === !!0); // false... data types match but values differ -alert( 1 ? true : false); // true.... only ±0 and NaN are “falsy” numbers -alert("0" ? true : false); // true.... only the empty string is “falsy” -alert(Boolean({})); // true.... all objects are “truthy” except null - -var d = new Date(2010, 2, 1, 14, 25, 30); // 2010-Mar-01 14:25:30 - -// Displays '2010-3-1 14:25:30': -alert(d.getFullYear() + '-' + (d.getMonth()+1) + '-' + d.getDate() + ' ' - + d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds()); - -// Built-in toString returns something like 'Mon Mar 01 2010 14:25:30 GMT-0500 (EST)': -alert(d); - -s.length - -var myRe = /(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2})/; -var results = myRe.exec("The date and time are 2009-09-08 09:37:08."); -if (results) { - alert("Matched: " + results[0]); // Entire match - var my_date = results[1]; // First group == "2009-09-08" - var my_time = results[2]; // Second group == "09:37:08" - alert("It is " + my_time + " on " + my_date); -} else alert("Did not find a valid date!"); - -try diff --git a/uppdev/AccessKey/test.key b/uppdev/AccessKey/test.key deleted file mode 100644 index c6f9304cc..000000000 --- a/uppdev/AccessKey/test.key +++ /dev/null @@ -1,3 +0,0 @@ -KEY(EDITFILE, t_("Edit file"), K_CTRL_O) -KEY(SAVEFILE, "Save", K_CTRL_S) -KEY(READONLY, "Read only", 0) diff --git a/uppdev/AccessKey/test.usc b/uppdev/AccessKey/test.usc deleted file mode 100644 index d25246b10..000000000 --- a/uppdev/AccessKey/test.usc +++ /dev/null @@ -1,3 +0,0 @@ -macro "Swap":"Swap Chars" Ctrl+Shift+T { - Execute("cmd.exe"); -} diff --git a/uppdev/AccessKey/test.zip b/uppdev/AccessKey/test.zip deleted file mode 100644 index 44c3c57bc..000000000 Binary files a/uppdev/AccessKey/test.zip and /dev/null differ diff --git a/uppdev/AccessKey/translate.t b/uppdev/AccessKey/translate.t deleted file mode 100644 index 51dfdb8ab..000000000 --- a/uppdev/AccessKey/translate.t +++ /dev/null @@ -1,3 +0,0 @@ -"\305\241\305\241\305\241\305\241 Hezky p\304\233kn\304\233 \304\215esky!" -asdfasdf -a \ No newline at end of file diff --git a/uppdev/AccessKey/xl/_rels/workbook.xml.rels b/uppdev/AccessKey/xl/_rels/workbook.xml.rels deleted file mode 100644 index 8cd5f3f15..000000000 --- a/uppdev/AccessKey/xl/_rels/workbook.xml.rels +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/uppdev/AccessKey/xl/sharedStrings.xml b/uppdev/AccessKey/xl/sharedStrings.xml deleted file mode 100644 index d586c51a5..000000000 --- a/uppdev/AccessKey/xl/sharedStrings.xml +++ /dev/null @@ -1,2 +0,0 @@ - -Account informationProduct Information:Performance InformationReport informationGoogle Client Account InformationClick PackFacebook Client Account InformationAdmin feeClient NameCampaing NameTime zoneCountryCurrencyResponsible plannerREODefault Destination URLDefault Display URLCustomer reg. IDOrder numberUsers (separate with a comma)ProductTypeStart dateStop dateRegional targeting locationRegional targeting radiusGoogle BudgetFacebook BudgetGuaranteed positionReport should be emailed to (separate with a comma):Client account numberTarget marginGuaranteed clicksFacebook LoginFacebook PasswordFacebook Campaign NameSetup feeManagement fee25664723_KP/GAR_AARON TRADE, spol. s r.o.195_25664723_AARON TRADE, spol. s r.o.PragueCZCZKFidler Mirekhttp://www.ultimatepp.org/forumhttp://ultimatepp.orgAdmin Fee (KP)GARcxl@ntllib.org \ No newline at end of file diff --git a/uppdev/AccessKey/xl/styles.xml b/uppdev/AccessKey/xl/styles.xml deleted file mode 100644 index 1ab1840d5..000000000 --- a/uppdev/AccessKey/xl/styles.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/uppdev/AccessKey/xl/theme/theme1.xml b/uppdev/AccessKey/xl/theme/theme1.xml deleted file mode 100644 index 4652b8fbc..000000000 --- a/uppdev/AccessKey/xl/theme/theme1.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/uppdev/AccessKey/xl/workbook.xml b/uppdev/AccessKey/xl/workbook.xml deleted file mode 100644 index a60939d68..000000000 --- a/uppdev/AccessKey/xl/workbook.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/uppdev/AccessKey/xl/worksheets/sheet1.xml b/uppdev/AccessKey/xl/worksheets/sheet1.xml deleted file mode 100644 index 0406ec2a8..000000000 --- a/uppdev/AccessKey/xl/worksheets/sheet1.xml +++ /dev/null @@ -1,2 +0,0 @@ - -01234567891011121314151617181920212223242526272829303132333435363738394041424304445256647231954346474085640856004812312312341212 \ No newline at end of file diff --git a/uppdev/AccessLog/AccessLog.upp b/uppdev/AccessLog/AccessLog.upp deleted file mode 100644 index e69de29bb..000000000 diff --git a/uppdev/AddOn/AddOn.cpp b/uppdev/AddOn/AddOn.cpp deleted file mode 100644 index 2c53bfb86..000000000 --- a/uppdev/AddOn/AddOn.cpp +++ /dev/null @@ -1,4 +0,0 @@ -#include - -int IAddOn::GetMajorRevision() {return 0;} -int IAddOn::GetMinorRevision() {return 0;} diff --git a/uppdev/AddOn/AddOn.h b/uppdev/AddOn/AddOn.h deleted file mode 100644 index 68039cf2f..000000000 --- a/uppdev/AddOn/AddOn.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef _AddOn_AddOn_h_ -#define _AddOn_AddOn_h_ - -#include - -using namespace Upp; - -#if defined PLATFORM_WIN32 || defined PLATFORM_WINCE -#define ADDONEXPORT extern "C" __declspec(dllexport) -#else -#define ADDONEXPORT -#endif - -class IAddOn -{ -public: - virtual String GetName() = 0; - virtual int GetMajorRevision(); - virtual int GetMinorRevision(); -}; - -#endif diff --git a/uppdev/AddOn/AddOn.upp b/uppdev/AddOn/AddOn.upp deleted file mode 100644 index 5992d2c03..000000000 --- a/uppdev/AddOn/AddOn.upp +++ /dev/null @@ -1,8 +0,0 @@ -uses - Core; - -file - AddOn.h, - AddOn.cpp, - AddOnLoader.h, - AddOnLoader.cpp; diff --git a/uppdev/AddOn/AddOnLoader.cpp b/uppdev/AddOn/AddOnLoader.cpp deleted file mode 100644 index e69de29bb..000000000 diff --git a/uppdev/AddOn/AddOnLoader.h b/uppdev/AddOn/AddOnLoader.h deleted file mode 100644 index 4b3e547ea..000000000 --- a/uppdev/AddOn/AddOnLoader.h +++ /dev/null @@ -1,155 +0,0 @@ -#ifndef _AddOn_AddOnLoader_h_ -#define _AddOn_AddOnLoader_h_ - -#include - -using namespace Upp; - -#include - -#ifdef PLATFORM_POSIX -#include -#endif - - -template -class AddOnLoader -{ -public: - AddOnLoader(){}; - ~AddOnLoader(); - - int LoadFile(String name); - int LoadFolder(String name); - - int GetCount(); - T* At(int idx); - T* operator[](int idx) {return At(idx);} - -private: - AddOnLoader(const AddOnLoader&); - - bool Load(String name); - - struct Item { - DLLHANDLE hmod; - T* address; - }; - - Array addOns; - - typedef IAddOn*(*Start)(); - typedef void(*Stop)(); - -#if defined PLATFORM_WIN32 - typedef HMODULE DLLHANDLE; -#else - typedef void* DLLHANDLE; -#endif - - static const String sharedLibExt; -}; - -#if defined PLATFORM_WIN32 || defined PLATFORM_WINCE - template const String AddOnLoader::sharedLibExt = ".dll"; -#elif defined PLATFORM_LINUX || defined PLATFORM_FREEBSD || defined PLATFORM_SOLARIS - template const String AddOnLoader::sharedLibExt = ".so"; -#elif defined PLATFORM_OSX11 - template const String AddOnLoader::sharedLibExt = ".dylib"; -#endif - -template -AddOnLoader::~AddOnLoader() -{ - for (int i = 0; i < addOns.GetCount(); i++) { - #if defined PLATFORM_WIN32 || defined PLATFORM_WINCE - Stop stop = (Stop)GetProcAddress(addOns[i].hmod, "Stop"); - #else - Stop stop = (Stop)dlsym(addOns[i].hmod, "Stop"); - #endif - if (stop) { - stop(); - } - #if defined PLATFORM_WIN32 || defined PLATFORM_WINCE - FreeLibrary(addOns[i].hmod); - #else - dlclose(addOns[i].hmod); - #endif - } - addOns.Clear(); -} - -template -int AddOnLoader::LoadFile(String name) -{ - if (FileExists(name)) { - return Load(name)?1:0; - } else { - return 0; - } -} - -template -int AddOnLoader::LoadFolder(String name) -{ - int num = 0; - for(FindFile ff(AppendFileName(name, "*.*")); ff; ff.Next()) { - if (ff.IsFolder()) { - num += LoadFolder(AppendFileName(name, ff.GetName())); - } else if (ff.IsFile() && ToLower(GetFileExt(ff.GetName()) == sharedLibExt)) { - num += Load(AppendFileName(name, ff.GetName())); - } - } - return num; -} - -template -bool AddOnLoader::Load(String name) -{ - bool status = false; - #if defined PLATFORM_WIN32 || defined PLATFORM_WINCE - DLLHANDLE hmod = LoadLibrary(NormalizePath(name)); - #else - DLLHANDLE hmod = dlopen(NormalizePath(name), RTLD_LAZY); - #endif - - if (hmod) { - #if defined PLATFORM_WIN32 || defined PLATFORM_WINCE - Start start = (Start)GetProcAddress(hmod, "Start"); - #else - Start start = (Start)dlsym(hmod, "Start"); - #endif - T* plugin; - if (start && (plugin = dynamic_cast(start()))) { - Item& addOn = addOns.Add(); - addOn.hmod = hmod; - addOn.address = plugin; - status = true; - } else { - #if defined PLATFORM_WIN32 || defined PLATFORM_WINCE - FreeLibrary(hmod); - #else - dlclose(hmod); - #endif - } - } - return status; -} - -template -int AddOnLoader::GetCount() -{ - return addOns.GetCount(); -} - -template -T* AddOnLoader::At(int idx) -{ - if (idx < addOns.GetCount()) { - return addOns[idx].address; - } else { - return NULL; - } -} - -#endif diff --git a/uppdev/AddOnDll/AddOnDll.cpp b/uppdev/AddOnDll/AddOnDll.cpp deleted file mode 100644 index cc4854bde..000000000 --- a/uppdev/AddOnDll/AddOnDll.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include - -using namespace Upp; - -#include -#include - -class DoPlugIn : public IDoPlugin -{ -public: - virtual String GetName(void) {return "My First Do Plugin";} - virtual String Do(void) {return "Do";} - virtual int GetMajorRevision() {return 0;} - virtual int GetMinorRevision() {return 1;} - -}; - -class ComputePlugIn : public IComputePlugin -{ -public: - virtual String GetName(void) {return "My First Compute Plugin";} - virtual String Compute(void) {return "Compute";} - virtual int GetMajorRevision() {return 0;} - virtual int GetMinorRevision() {return 1;} -}; - -#if 1 -ADDONEXPORT DoPlugIn* Start() { - return &Single(); -} -#else -ADDONEXPORT ComputePlugIn* Start() { - return &Single(); -} -#endif diff --git a/uppdev/AddOnDll/AddOnDll.upp b/uppdev/AddOnDll/AddOnDll.upp deleted file mode 100644 index 856285f51..000000000 --- a/uppdev/AddOnDll/AddOnDll.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - Core, - AddOn; - -file - AddOnDll.cpp; - -mainconfig - "" = "DLL ADDON"; diff --git a/uppdev/AddOnHost/AddOn.zip b/uppdev/AddOnHost/AddOn.zip deleted file mode 100644 index 2c0057e2a..000000000 --- a/uppdev/AddOnHost/AddOn.zip +++ /dev/null @@ -1 +0,0 @@ -PK \ No newline at end of file diff --git a/uppdev/AddOnHost/AddOnHost.cpp b/uppdev/AddOnHost/AddOnHost.cpp deleted file mode 100644 index 3b186690c..000000000 --- a/uppdev/AddOnHost/AddOnHost.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include - -using namespace Upp; - -#include -#include - -#define DLLPATH "C:\\upp\\out\\MINGW.Addon.Debug_full.Dll" - -CONSOLE_APP_MAIN -{ - AddOnLoader addOns; - - addOns.LoadFolder(DLLPATH); - - for (int i = 0; i < addOns.GetCount(); i++) { - Cout() << "Name: " << addOns[i]->GetName() << - " v" << addOns[i]->GetMajorRevision() << "." << addOns[i]->GetMinorRevision() << - " - Action: " << addOns[i]->Do() << "\n"; - } -} diff --git a/uppdev/AddOnHost/AddOnHost.upp b/uppdev/AddOnHost/AddOnHost.upp deleted file mode 100644 index e6657bdbe..000000000 --- a/uppdev/AddOnHost/AddOnHost.upp +++ /dev/null @@ -1,10 +0,0 @@ -uses - Core, - AddOn; - -file - IAddOns.h, - AddOnHost.cpp; - -mainconfig - "" = ""; diff --git a/uppdev/AddOnHost/IAddOns.h b/uppdev/AddOnHost/IAddOns.h deleted file mode 100644 index 96bc9a6ba..000000000 --- a/uppdev/AddOnHost/IAddOns.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef _AddOnHost_IAddOns_h_ -#define _AddOnHost_IAddOns_h_ - -#include - -class IDoPlugin : public IAddOn -{ -public: - virtual String Do() = 0; -}; - -class IComputePlugin : public IAddOn -{ -public: - virtual String Compute() = 0; -}; - -#endif diff --git a/uppdev/AddressBookXMLDOM/AddressBook.cpp b/uppdev/AddressBookXMLDOM/AddressBook.cpp deleted file mode 100644 index 4859ec628..000000000 --- a/uppdev/AddressBookXMLDOM/AddressBook.cpp +++ /dev/null @@ -1,218 +0,0 @@ -#include -#include - -#define LAYOUTFILE -#include - -#define TAG_NAME "name" -#define TAG_SURNAME "surname" -#define TAG_ADDRESS "address" -#define TAG_EMAIL "email" - -class AddressBook : public WithAddressBookLayout { - WithModifyLayout modify; - WithSearchLayout search; - FileSel fs; - String filename; - - void SetupSearch(); - void Add(); - void Change(); - void Search(); - void Open(); - void Save(); - void SaveAs(); - void Print(); - void Quit(); - void FileMenu(Bar& bar); - void MainMenu(Bar& bar); - - typedef AddressBook CLASSNAME; - -public: - void Serialize(Stream& s); - - AddressBook(); -}; - -AddressBook::AddressBook() -{ - CtrlLayout(*this, "Address book"); - CtrlLayout(modify); - CtrlLayout(search); - tab.Add(modify, "Modify"); - tab.Add(search, "Search"); - ActiveFocus(search.name); - search.oname = true; - search.oname <<= search.osurname <<= search.oaddress - <<= search.oemail <<= THISBACK(SetupSearch); - array.AddColumn(TAG_NAME, "Name"); - array.AddColumn(TAG_SURNAME, "Surname"); - array.AddColumn(TAG_ADDRESS, "Address"); - array.AddColumn(TAG_EMAIL, "Email"); - modify.add <<= THISBACK(Add); - modify.change <<= THISBACK(Change); - search.search <<= THISBACK(Search); - SetupSearch(); - fs.AllFilesType(); - menu.Set(THISBACK(MainMenu)); - -} - -void AddressBook::FileMenu(Bar& bar) -{ - bar.Add("Open..", CtrlImg::open(), THISBACK(Open)); - bar.Add("Save", CtrlImg::save(), THISBACK(Save)); - bar.Add("Save as..", CtrlImg::save_as(), THISBACK(SaveAs)); - bar.Separator(); - bar.Add("Print", CtrlImg::print(), THISBACK(Print)); - bar.Separator(); - bar.Add("Quit", THISBACK(Quit)); -} - -void AddressBook::MainMenu(Bar& bar) -{ - bar.Add("File", THISBACK(FileMenu)); -} - -void AddressBook::SetupSearch() -{ - search.name.Enable(search.oname); - search.surname.Enable(search.osurname); - search.address.Enable(search.oaddress); - search.email.Enable(search.oemail); -} - -void AddressBook::Add() -{ - array.Add(~modify.name, ~modify.surname, ~modify.address, ~modify.email); - array.GoEnd(); - modify.name <<= modify.surname <<= modify.address <<= modify.email <<= Null; - ActiveFocus(modify.name); -} - -void AddressBook::Change() -{ - if(array.IsCursor()) { - array.Set(0, ~modify.name); - array.Set(1, ~modify.surname); - array.Set(2, ~modify.address); - array.Set(3, ~modify.email); - } -} - -bool Contains(const String& text, const String& substr) -{ - for(const char *s = text; s <= text.End() - substr.GetLength(); s++) - if(strncmp(s, substr, substr.GetLength()) == 0) - return true; - return false; -} - -void AddressBook::Search() -{ - if(!array.GetCount()) return; - bool sc = true; - array.ClearSelection(); - for(int i = 0; i < array.GetCount(); i++) { - if((!search.oname || Contains(array.Get(i, 0), ~search.name)) && - (!search.osurname || Contains(array.Get(i, 1), ~search.surname)) && - (!search.oaddress || Contains(array.Get(i, 2), ~search.address)) && - (!search.oemail || Contains(array.Get(i, 3), ~search.email))) { - array.Select(i); - if(sc) { - array.SetCursor(i); - array.CenterCursor(); - sc = false; - }; - } - } -} - -void AddressBook::Open() -{ - if(!fs.ExecuteOpen()) return; - filename = fs; - array.Clear(); - try { - String d = LoadFile(filename); - XmlNode n = ParseXML(d); - if(n.GetCount()==0 || n[0].GetTag() != "AddressBook") - throw XmlError("No AddressBook tag in "); - const XmlNode &ab = n[0]; - array.SetCount(ab.GetCount()); - for(int i=0; i < ab.GetCount(); i++){ - const XmlNode &person = ab[i]; - for(int j=0; j < person.GetCount(); j++){ - const XmlNode &prop = person[j]; - if(prop.IsTag(TAG_NAME)) array.Set(i, TAG_NAME, prop[0].GetText()); - else if(prop.IsTag(TAG_SURNAME)) array.Set(i, TAG_SURNAME, prop[0].GetText()); - else if(prop.IsTag(TAG_ADDRESS)) array.Set(i, TAG_ADDRESS, prop[0].GetText()); - else if(prop.IsTag(TAG_EMAIL)) array.Set(i, TAG_EMAIL, prop[0].GetText()); - } - } - } - catch(XmlError &e) { - Exclamation("Error reading the input file:&" + DeQtf(e) ); - } -} - -void AddressBook::Save() -{ - if(IsEmpty(filename)) { - SaveAs(); - return; - } - String xml; - for(int i = 0; i < array.GetCount(); i++) - xml << - XmlTag("person") ( - XmlTag(TAG_NAME).Text(array.Get(i, 0)) + - XmlTag(TAG_SURNAME).Text(array.Get(i, 1)) + - XmlTag(TAG_ADDRESS).Text(array.Get(i, 2)) + - XmlTag(TAG_EMAIL).Text(array.Get(i, 3)) - ); - if(!SaveFile(filename, XmlDoc("AddressBook", xml))) - Exclamation("Error saving the file!"); -} - -void AddressBook::SaveAs() -{ - if(!fs.ExecuteSaveAs()) return; - filename = fs; - Save(); -} - -void AddressBook::Print() -{ - String qtf; - qtf = "{{1:1:1:1 Name:: Surname:: Address:: Email"; - for(int i = 0; i < array.GetCount(); i++) - for(int q = 0; q < 4; q++) - qtf << ":: " << DeQtf((String)array.Get(i, q)); - Report report; - report << qtf; - Perform(report); -} - -void AddressBook::Quit() -{ - Break(); -} - -void AddressBook::Serialize(Stream& s) -{ - int version = 0; - s / version; - s % search.oname % search.osurname % search.oaddress % search.oemail; - s % fs; - SetupSearch(); -} - -GUI_APP_MAIN -{ - AddressBook ab; - LoadFromFile(ab); - ab.Run(); - StoreToFile(ab); -} diff --git a/uppdev/AddressBookXMLDOM/AddressBookXMLDOM.lay b/uppdev/AddressBookXMLDOM/AddressBookXMLDOM.lay deleted file mode 100644 index 1ec277fce..000000000 --- a/uppdev/AddressBookXMLDOM/AddressBookXMLDOM.lay +++ /dev/null @@ -1,30 +0,0 @@ -LAYOUT(AddressBookLayout, 516, 456) - ITEM(MenuBar, menu, LeftPosZ(0, 200).TopPosZ(0, 20)) - ITEM(TabCtrl, tab, LeftPosZ(8, 500).TopPosZ(32, 84)) - ITEM(ArrayCtrl, array, LeftPosZ(8, 500).TopPosZ(124, 324)) -END_LAYOUT - -LAYOUT(ModifyLayout, 480, 52) - ITEM(Label, dv___0, SetLabel(t_("&Name")).LeftPosZ(8, 48).TopPosZ(8, 15)) - ITEM(EditField, name, LeftPosZ(8, 96).TopPosZ(28, 19)) - ITEM(Label, dv___2, SetLabel(t_("&Surname")).LeftPosZ(108, 48).TopPosZ(8, 15)) - ITEM(EditField, surname, LeftPosZ(108, 96).TopPosZ(28, 19)) - ITEM(Label, dv___4, SetLabel(t_("&Address")).LeftPosZ(208, 48).TopPosZ(8, 15)) - ITEM(EditField, address, LeftPosZ(208, 96).TopPosZ(28, 19)) - ITEM(Label, dv___6, SetLabel(t_("&Email")).LeftPosZ(308, 48).TopPosZ(8, 15)) - ITEM(EditField, email, LeftPosZ(308, 96).TopPosZ(28, 19)) - ITEM(Button, add, SetLabel(t_("Ad&d")).LeftPosZ(416, 56).TopPosZ(4, 20)) - ITEM(Button, change, SetLabel(t_("&Change")).LeftPosZ(416, 56).TopPosZ(28, 20)) -END_LAYOUT - -LAYOUT(SearchLayout, 480, 56) - ITEM(Option, oname, SetLabel(t_("&Name")).LeftPosZ(8, 56).TopPosZ(8, 18)) - ITEM(EditField, name, LeftPosZ(8, 96).TopPosZ(28, 19)) - ITEM(Option, osurname, SetLabel(t_("&Surname")).LeftPosZ(108, 64).TopPosZ(8, 18)) - ITEM(EditField, surname, LeftPosZ(108, 96).TopPosZ(28, 19)) - ITEM(Option, oaddress, SetLabel(t_("&Address")).LeftPosZ(208, 64).TopPosZ(8, 18)) - ITEM(EditField, address, LeftPosZ(208, 96).TopPosZ(28, 19)) - ITEM(Option, oemail, SetLabel(t_("&Email")).LeftPosZ(308, 52).TopPosZ(8, 18)) - ITEM(EditField, email, LeftPosZ(308, 96).TopPosZ(28, 19)) - ITEM(Button, search, SetLabel(t_("&Search")).LeftPosZ(416, 56).TopPosZ(28, 20)) -END_LAYOUT diff --git a/uppdev/AddressBookXMLDOM/AddressBookXMLDOM.upp b/uppdev/AddressBookXMLDOM/AddressBookXMLDOM.upp deleted file mode 100644 index a5535fdc7..000000000 --- a/uppdev/AddressBookXMLDOM/AddressBookXMLDOM.upp +++ /dev/null @@ -1,10 +0,0 @@ -uses - CtrlLib, - Report; - -file - AddressBook.cpp, - AddressBookXMLDOM.lay; - -mainconfig - "" = "GUI"; diff --git a/uppdev/AggCtrl/AggCtrl.h b/uppdev/AggCtrl/AggCtrl.h deleted file mode 100644 index b8e47f871..000000000 --- a/uppdev/AggCtrl/AggCtrl.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef _AggCtrl_AggCtrl_h_ -#define _AggCtrl_AggCtrl_h_ - -/* -This package implements Ctrl which allows user to use Agg software rendering engine in Upp -Autor: Jan Dolinár -Usage: Just define onDraw method in your source and put in there the drawing stuff - The Ctrl has pre-initialized rendering_buffer rbuf which is rendered in Paint(...) function - You also can connect it to higher level Agg classes, or even draw other buffer - with PaintAgg(...) -Bugs: Currently only X11 is supported - Doesn't work properly when used pixelformat has different bpp then system (on my system - only 32bit pixel formats work...) -*/ - -#include -//#include -#include -#include -#include -#include "PixFmts.h" - -#ifdef PLATFORM_X11 -#include -#elif defined(PLATFORM_WIN32) -#include -#include -#include -#include -#endif - -class AggCtrl:public Upp::Ctrl{ -public: - typedef AggCtrl CLASSNAME; - AggCtrl(agg::pix_format_e format=agg::pix_format_bgra32); - ~AggCtrl(); - virtual void Paint(Upp::Draw& draw); - virtual void onDraw(Upp::Draw& dest); - virtual void onInit(); - virtual void onResize(int width,int height); - void PaintAgg(Upp::Draw& dest); - void PaintAgg(const agg::rendering_buffer* src,Upp::Draw& dest); - void Resized(); - void SetPixFmt(agg::pix_format_e format); - agg::rendering_buffer rbuf; - bool flip_y; -private: - unsigned bpp,sysbpp; - agg::pix_format_e pixformat,sysformat; - int cx,cy; -#ifdef PLATFORM_X11 -public: - unsigned char* buf; -private: - XImage* ximg; - int byte_order; - unsigned long r_mask,g_mask,b_mask; -#elif defined(PLATFORM_WIN32) - void CreatePmap(unsigned width,unsigned height,agg::rendering_buffer* wnd); - agg::pixel_map pmap; -#endif -}; - - -#endif diff --git a/uppdev/AggCtrl/AggCtrl.upp b/uppdev/AggCtrl/AggCtrl.upp deleted file mode 100644 index df5db2501..000000000 --- a/uppdev/AggCtrl/AggCtrl.upp +++ /dev/null @@ -1,34 +0,0 @@ -optimize_speed; - -uses - CtrlLib, - agg24; - -library((LINUX | FREEBSD) & !NOGTK) "gtk-x11-2.0 gdk-x11-2.0 atk-1.0 gdk_pixbuf-2.0 m pangocairo-1.0 fontconfig Xext Xrender Xinerama Xi Xrandr Xcursor Xfixes pango-1.0 cairo X11 gobject-2.0 gmodule-2.0 glib-2.0"; - -library(WIN32 !MSC8ARM) "user32 gdi32"; - -library(LINUX) X11; - -library(LINUX) dl; - -library(LINUX !XLFD) Xft; - -library(FREEBSD) X11; - -library(FREEBSD !XLFD) "Xft fontconfig Xrender freetype expat"; - -library(LINUX !XLFD !SHARED) "fontconfig Xrender freetype expat"; - -library(OSX11) "X11 Xft fontconfig Xrender freetype expat"; - -file - PixFmts.h, - AggCtrl.h, - AggCtrlWin32.cpp, - Test.cpp, - AggCtrlX11.cpp; - -mainconfig - "" = "GUI"; - diff --git a/uppdev/AggCtrl/AggCtrlWin32.cpp b/uppdev/AggCtrl/AggCtrlWin32.cpp deleted file mode 100644 index bb1079691..000000000 --- a/uppdev/AggCtrl/AggCtrlWin32.cpp +++ /dev/null @@ -1,205 +0,0 @@ -#include "AggCtrl.h" - -#ifdef PLATFORM_WIN32 - -static void ConvertPmap(agg::rendering_buffer* dst,const agg::rendering_buffer* src,agg::pix_format_e format){ - switch(format){ - case agg::pix_format_gray8: break; - case agg::pix_format_gray16: agg::color_conv(dst, src, agg::color_conv_gray16_to_gray8()); break; - case agg::pix_format_rgb565: agg::color_conv(dst, src, agg::color_conv_rgb565_to_rgb555());break; - case agg::pix_format_rgbAAA: agg::color_conv(dst, src, agg::color_conv_rgbAAA_to_bgr24()); break; - case agg::pix_format_bgrAAA: agg::color_conv(dst, src, agg::color_conv_bgrAAA_to_bgr24()); break; - case agg::pix_format_rgbBBA: agg::color_conv(dst, src, agg::color_conv_rgbBBA_to_bgr24()); break; - case agg::pix_format_bgrABB: agg::color_conv(dst, src, agg::color_conv_bgrABB_to_bgr24()); break; - case agg::pix_format_rgb24: agg::color_conv(dst, src, agg::color_conv_rgb24_to_bgr24()); break; - case agg::pix_format_rgb48: agg::color_conv(dst, src, agg::color_conv_rgb48_to_bgr24()); break; - case agg::pix_format_bgr48: agg::color_conv(dst, src, agg::color_conv_bgr48_to_bgr24()); break; - case agg::pix_format_abgr32: agg::color_conv(dst, src, agg::color_conv_abgr32_to_bgra32());break; - case agg::pix_format_argb32: agg::color_conv(dst, src, agg::color_conv_argb32_to_bgra32());break; - case agg::pix_format_rgba32: agg::color_conv(dst, src, agg::color_conv_rgba32_to_bgra32());break; - case agg::pix_format_bgra64: agg::color_conv(dst, src, agg::color_conv_bgra64_to_bgra32());break; - case agg::pix_format_abgr64: agg::color_conv(dst, src, agg::color_conv_abgr64_to_bgra32());break; - case agg::pix_format_argb64: agg::color_conv(dst, src, agg::color_conv_argb64_to_bgra32());break; - case agg::pix_format_rgba64: agg::color_conv(dst, src, agg::color_conv_rgba64_to_bgra32());break; - } -}; - -AggCtrl::AggCtrl(agg::pix_format_e format): -pixformat(format), bpp(0), -sysformat(agg::pix_format_undefined), -flip_y(false), -cx(16),cy(16) -{ - // Set bpp and sysbpp from pixel format - switch(pixformat) - { - case agg::pix_format_bw: - sysformat = agg::pix_format_bw; - bpp = 1; - sysbpp = 1; - break; - case agg::pix_format_gray8: - sysformat = agg::pix_format_gray8; - bpp = 8; - sysbpp = 8; - break; - case agg::pix_format_gray16: - sysformat = agg::pix_format_gray8; - bpp = 16; - sysbpp = 8; - break; - case agg::pix_format_rgb565: - case agg::pix_format_rgb555: - sysformat = agg::pix_format_rgb555; - bpp = 16; - sysbpp = 16; - break; - case agg::pix_format_rgbAAA: - case agg::pix_format_bgrAAA: - case agg::pix_format_rgbBBA: - case agg::pix_format_bgrABB: - sysformat = agg::pix_format_bgr24; - bpp = 32; - sysbpp = 24; - break; - case agg::pix_format_rgb24: - case agg::pix_format_bgr24: - sysformat = agg::pix_format_bgr24; - bpp = 24; - sysbpp = 24; - break; - case agg::pix_format_rgb48: - case agg::pix_format_bgr48: - sysformat = agg::pix_format_bgr24; - bpp = 48; - sysbpp = 24; - break; - case agg::pix_format_bgra32: - case agg::pix_format_abgr32: - case agg::pix_format_argb32: - case agg::pix_format_rgba32: - sysformat = agg::pix_format_bgra32; - bpp = 32; - sysbpp = 32; - break; - case agg::pix_format_bgra64: - case agg::pix_format_abgr64: - case agg::pix_format_argb64: - case agg::pix_format_rgba64: - sysformat = agg::pix_format_bgra32; - bpp = 64; - sysbpp = 32; - break; - } - CreatePmap(cx,cy,&rbuf); - // User initialization code - onInit(); -}; -void AggCtrl::CreatePmap(unsigned width,unsigned height,agg::rendering_buffer* rb){ - // Create a pixmap and attach a buffer to it - pmap.create(width,height,agg::org_e(bpp)); - rb->attach(pmap.buf(),pmap.width(),pmap.height(),flip_y ?pmap.stride():-pmap.stride()); -}; -void AggCtrl::PaintAgg(Upp::Draw& dest){PaintAgg(&rbuf,dest);}; -void AggCtrl::PaintAgg(const agg::rendering_buffer* src,Upp::Draw& dest){ - if(sysformat==pixformat){ - // Pixmap is in the right format, put it on display - pmap.draw(dest.GetHandle()); - }else{ - // Pixmap must be converted to the right pixel format first - agg::pixel_map pmap_tmp; - pmap_tmp.create(pmap.width(),pmap.height(),agg::org_e(sysbpp)); - agg::rendering_buffer rbuf_tmp; - rbuf_tmp.attach(pmap_tmp.buf(),pmap_tmp.width(),pmap_tmp.height(),flip_y?pmap_tmp.stride():-pmap_tmp.stride()); - ConvertPmap(&rbuf_tmp, src, pixformat); - pmap_tmp.draw(dest.GetHandle()); - } -}; -void AggCtrl::Resized(){ - // Update the dimensions and reinitialize the pixmap with new size - cx=GetSize().cx;cy=GetSize().cy; - CreatePmap(cx,cy,&rbuf); - // User resize code - onResize(cx,cy); -}; -AggCtrl::~AggCtrl() { - pmap.destroy(); -}; -void AggCtrl::Paint(Upp::Draw& draw) { - // Check if the control was resized - if(cx!=GetSize().cx||cy!=GetSize().cy){Resized();} - // User Drawing code - onDraw(draw); - // Draw to screen - PaintAgg(draw); -}; -void AggCtrl::SetPixFmt(agg::pix_format_e format){ - pixformat=format; - switch(pixformat) - { - case agg::pix_format_bw: - sysformat = agg::pix_format_bw; - bpp = 1; - sysbpp = 1; - break; - case agg::pix_format_gray8: - sysformat = agg::pix_format_gray8; - bpp = 8; - sysbpp = 8; - break; - case agg::pix_format_gray16: - sysformat = agg::pix_format_gray8; - bpp = 16; - sysbpp = 8; - break; - case agg::pix_format_rgb565: - case agg::pix_format_rgb555: - sysformat = agg::pix_format_rgb555; - bpp = 16; - sysbpp = 16; - break; - case agg::pix_format_rgbAAA: - case agg::pix_format_bgrAAA: - case agg::pix_format_rgbBBA: - case agg::pix_format_bgrABB: - sysformat = agg::pix_format_bgr24; - bpp = 32; - sysbpp = 24; - break; - case agg::pix_format_rgb24: - case agg::pix_format_bgr24: - sysformat = agg::pix_format_bgr24; - bpp = 24; - sysbpp = 24; - break; - case agg::pix_format_rgb48: - case agg::pix_format_bgr48: - sysformat = agg::pix_format_bgr24; - bpp = 48; - sysbpp = 24; - break; - case agg::pix_format_bgra32: - case agg::pix_format_abgr32: - case agg::pix_format_argb32: - case agg::pix_format_rgba32: - sysformat = agg::pix_format_bgra32; - bpp = 32; - sysbpp = 32; - break; - case agg::pix_format_bgra64: - case agg::pix_format_abgr64: - case agg::pix_format_argb64: - case agg::pix_format_rgba64: - sysformat = agg::pix_format_bgra32; - bpp = 64; - sysbpp = 32; - break; - } - Resized(); -}; - -void AggCtrl::onDraw(Upp::Draw& dest){}; -void AggCtrl::onInit(){}; -void AggCtrl::onResize(int width,int height){}; - -#endif diff --git a/uppdev/AggCtrl/AggCtrlX11.cpp b/uppdev/AggCtrl/AggCtrlX11.cpp deleted file mode 100644 index c30843ba0..000000000 --- a/uppdev/AggCtrl/AggCtrlX11.cpp +++ /dev/null @@ -1,258 +0,0 @@ -#include "AggCtrl.h" - -#ifdef PLATFORM_X11 -AggCtrl::AggCtrl(agg::pix_format_e format): -pixformat(format), bpp(0), -sysformat(agg::pix_format_undefined), -byte_order(LSBFirst), -flip_y(false), -cx(16),cy(16), -r_mask(Upp::Xvisual->red_mask), g_mask(Upp::Xvisual->green_mask), b_mask(Upp::Xvisual->blue_mask) -{ - ASSERT_(!(Upp::Xdepth<15||r_mask==0||g_mask==0||b_mask==0),"AGG requires at least 15-bit color depth and True- or DirectColor class."); - // Determine bpp from pixel format - switch(pixformat){ - default: break; - case agg::pix_format_gray8: - bpp = 8; break; - case agg::pix_format_rgb565: - case agg::pix_format_rgb555: - bpp = 16; break; - case agg::pix_format_rgb24: - case agg::pix_format_bgr24: - bpp = 24; break; - case agg::pix_format_bgra32: - case agg::pix_format_abgr32: - case agg::pix_format_argb32: - case agg::pix_format_rgba32: - bpp = 32; break; - } - - // Pre-determine the byte order - int t = 1; - int hw_byte_order = LSBFirst; - if (*(char*)&t == 0) hw_byte_order = MSBFirst; - - // Perceive system pixel format by mask - switch (Upp::Xdepth) { - case 15: - sysbpp=16; - if (r_mask == 0x7C00 && g_mask == 0x3E0 && b_mask == 0x1F) { - sysformat = agg::pix_format_rgb555; - byte_order = hw_byte_order; - } - break; - case 16: - sysbpp=16; - if (r_mask==0xF800&&g_mask==0x7E0&&b_mask==0x1F) { - sysformat = agg::pix_format_rgb565; - byte_order = hw_byte_order; - } - break; - case 24: - case 32: - sysbpp=32; - if (g_mask==0xFF00){ - if (r_mask==0xFF&&b_mask==0xFF0000) { - switch(pixformat) { - case agg::pix_format_rgba32: - sysformat = agg::pix_format_rgba32; - byte_order = LSBFirst; - break; - case agg::pix_format_abgr32: - sysformat = agg::pix_format_abgr32; - byte_order = MSBFirst; - break; - default: - byte_order = hw_byte_order; - sysformat = (hw_byte_order==LSBFirst)?agg::pix_format_rgba32:agg::pix_format_abgr32; - break; - } - } - if (r_mask == 0xFF0000 && b_mask == 0xFF) { - switch (pixformat) { - case agg::pix_format_argb32: - sysformat = agg::pix_format_argb32; - byte_order = MSBFirst; - break; - case agg::pix_format_bgra32: - sysformat = agg::pix_format_bgra32; - byte_order = LSBFirst; - break; - default: - byte_order = hw_byte_order; - sysformat = (hw_byte_order == MSBFirst)?agg::pix_format_argb32:agg::pix_format_bgra32; - break; - } - } - } - break; - } - - ASSERT_(sysformat!=agg::pix_format_undefined,"RGB masks are not compatible with AGG pixel formats"); - - // Allocate buffer - buf=new unsigned char[cx*cy*(bpp/8)]; - // Connect rendering buffer - rbuf.attach(buf,cx,cy,(flip_y?-1:1)*cx*(bpp/8)); - // Initialize XImage for sending the data to the X server - ximg=XCreateImage(Upp::Xdisplay,Upp::Xvisual,Upp::Xdepth,ZPixmap,0,(char*)buf,cx,cy,sysbpp,cx*(sysbpp/8)); - ximg->byte_order = byte_order; - // User initialization - onInit(); -}; - -void AggCtrl::PaintAgg(Upp::Draw& dest){PaintAgg(&rbuf,dest);}; -void AggCtrl::PaintAgg(const agg::rendering_buffer* src,Upp::Draw& dest){ - if(ximg==0) return; - ximg->data=(char*)(flip_y?(src->row_ptr(src->height())-1):src->row_ptr(0)); - if(pixformat==sysformat){ - XPutImage(Upp::Xdisplay,dest.GetDrawable(),dest.GetGC(),ximg,0,0,GetRect().left,GetRect().top,cx,cy); - XFlush(Upp::Xdisplay); - XSync(Upp::Xdisplay,false); - }else{ - // Conversion to pixel format compatible with current system - int row_len = cx*sysbpp/8; - unsigned char* buf_tmp = new unsigned char[row_len*cy]; - agg::rendering_buffer rbuf_tmp; - rbuf_tmp.attach(buf_tmp,cx,cy,flip_y?-row_len:row_len); - switch (sysformat){ - default: break; - case agg::pix_format_rgb555: - switch (pixformat) { - default: break; - case agg::pix_format_rgb555:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb555_to_rgb555());break; - case agg::pix_format_rgb565:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb565_to_rgb555());break; - case agg::pix_format_rgb24:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb24_to_rgb555());break; - case agg::pix_format_bgr24:agg::color_conv(&rbuf_tmp, src, agg::color_conv_bgr24_to_rgb555());break; - case agg::pix_format_rgba32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgba32_to_rgb555());break; - case agg::pix_format_argb32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_argb32_to_rgb555());break; - case agg::pix_format_bgra32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_bgra32_to_rgb555());break; - case agg::pix_format_abgr32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_abgr32_to_rgb555());break; - } - break; - case agg::pix_format_rgb565: - switch (pixformat) { - default: break; - case agg::pix_format_rgb555:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb555_to_rgb565());break; - case agg::pix_format_rgb565:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb565_to_rgb565());break; - case agg::pix_format_rgb24:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb24_to_rgb565());break; - case agg::pix_format_bgr24:agg::color_conv(&rbuf_tmp, src, agg::color_conv_bgr24_to_rgb565());break; - case agg::pix_format_rgba32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgba32_to_rgb565());break; - case agg::pix_format_argb32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_argb32_to_rgb565());break; - case agg::pix_format_bgra32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_bgra32_to_rgb565());break; - case agg::pix_format_abgr32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_abgr32_to_rgb565());break; - } - break; - case agg::pix_format_rgba32: - switch (pixformat) { - default: break; - case agg::pix_format_rgb555:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb555_to_rgba32());break; - case agg::pix_format_rgb565:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb565_to_rgba32());break; - case agg::pix_format_rgb24:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb24_to_rgba32());break; - case agg::pix_format_bgr24:agg::color_conv(&rbuf_tmp, src, agg::color_conv_bgr24_to_rgba32());break; - case agg::pix_format_rgba32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgba32_to_rgba32());break; - case agg::pix_format_argb32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_argb32_to_rgba32());break; - case agg::pix_format_bgra32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_bgra32_to_rgba32());break; - case agg::pix_format_abgr32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_abgr32_to_rgba32());break; - } - break; - case agg::pix_format_abgr32: - switch (pixformat) { - default: break; - case agg::pix_format_rgb555:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb555_to_abgr32());break; - case agg::pix_format_rgb565:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb565_to_abgr32());break; - case agg::pix_format_rgb24:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb24_to_abgr32());break; - case agg::pix_format_bgr24:agg::color_conv(&rbuf_tmp, src, agg::color_conv_bgr24_to_abgr32());break; - case agg::pix_format_abgr32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_abgr32_to_abgr32());break; - case agg::pix_format_rgba32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgba32_to_abgr32());break; - case agg::pix_format_argb32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_argb32_to_abgr32());break; - case agg::pix_format_bgra32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_bgra32_to_abgr32());break; - } - break; - case agg::pix_format_argb32: - switch (pixformat) { - default: break; - case agg::pix_format_rgb555:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb555_to_argb32());break; - case agg::pix_format_rgb565:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb565_to_argb32());break; - case agg::pix_format_rgb24:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb24_to_argb32());break; - case agg::pix_format_bgr24:agg::color_conv(&rbuf_tmp, src, agg::color_conv_bgr24_to_argb32());break; - case agg::pix_format_rgba32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgba32_to_argb32());break; - case agg::pix_format_argb32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_argb32_to_argb32());break; - case agg::pix_format_abgr32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_abgr32_to_argb32());break; - case agg::pix_format_bgra32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_bgra32_to_argb32());break; - } - break; - case agg::pix_format_bgra32: - switch (pixformat) { - default: break; - case agg::pix_format_rgb555:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb555_to_bgra32());break; - case agg::pix_format_rgb565:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb565_to_bgra32());break; - case agg::pix_format_rgb24:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgb24_to_bgra32());break; - case agg::pix_format_bgr24:agg::color_conv(&rbuf_tmp, src, agg::color_conv_bgr24_to_bgra32());break; - case agg::pix_format_rgba32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_rgba32_to_bgra32());break; - case agg::pix_format_argb32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_argb32_to_bgra32());break; - case agg::pix_format_abgr32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_abgr32_to_bgra32());break; - case agg::pix_format_bgra32:agg::color_conv(&rbuf_tmp, src, agg::color_conv_bgra32_to_bgra32());break; - } - break; - } - ximg->data=(char*)buf_tmp; - XPutImage(Upp::Xdisplay,dest.GetDrawable(),dest.GetGC(),ximg,0,0,GetRect().left,GetRect().top,cx,cy); - XFlush(Upp::Xdisplay); - XSync(Upp::Xdisplay,false); - delete [] buf_tmp; - } -}; -void AggCtrl::Resized(){ - // Update the dimensions, reallocate the buffer with new size, get a bigger XImage - cx=GetSize().cx;cy=GetSize().cy; - delete [] buf; - ximg->data = 0; - XDestroyImage(ximg); - buf=new unsigned char[cx*cy*(bpp/8)]; - rbuf.attach(buf,cx,cy,(flip_y?-1:1)*cx*(bpp/8)); - ximg=XCreateImage(Upp::Xdisplay,Upp::Xvisual,Upp::Xdepth,ZPixmap,0,(char*)buf,cx,cy,sysbpp,cx*(sysbpp/8)); - ximg->byte_order=byte_order; - // User resize code - onResize(cx,cy); -}; -AggCtrl::~AggCtrl() { - delete [] buf; - ximg->data = 0; - XDestroyImage(ximg); -}; -void AggCtrl::Paint(Upp::Draw& draw) { - // Check if the control was resized - if(cx!=GetSize().cx||cy!=GetSize().cy){Resized();} - // User Drawing code - onDraw(draw); - // Draw to screen - PaintAgg(draw); -}; -void AggCtrl::SetPixFmt(agg::pix_format_e format){ - pixformat=format; - switch(format){ - default: break; - case agg::pix_format_gray8: - bpp = 8; break; - case agg::pix_format_rgb565: - case agg::pix_format_rgb555: - bpp = 16; break; - case agg::pix_format_rgb24: - case agg::pix_format_bgr24: - bpp = 24; break; - case agg::pix_format_bgra32: - case agg::pix_format_abgr32: - case agg::pix_format_argb32: - case agg::pix_format_rgba32: - bpp = 32; break; - } - Resized(); -}; - -void AggCtrl::onDraw(Upp::Draw& dest){}; -void AggCtrl::onInit(){}; -void AggCtrl::onResize(int width,int height){}; - -#endif diff --git a/uppdev/AggCtrl/PixFmts.h b/uppdev/AggCtrl/PixFmts.h deleted file mode 100644 index 4f6482148..000000000 --- a/uppdev/AggCtrl/PixFmts.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef _AggCtrl_PixFmts_h_ -#define _AggCtrl_PixFmts_h_ - -// Using a particular pixel format doesn't obligatory mean the necessity -// of software conversion. For example, win32 API can natively display -// gray8, 15-bit RGB, 24-bit BGR, and 32-bit BGRA formats. -// This list can be (and will be!) extended in future. -namespace agg{ - enum pix_format_e{ - pix_format_undefined = 0, // By default. No conversions are applied - pix_format_bw, // 1 bit per color B/W - pix_format_gray8, // Simple 256 level grayscale - pix_format_gray16, // Simple 65535 level grayscale - pix_format_rgb555, // 15 bit rgb. Depends on the byte ordering! - pix_format_rgb565, // 16 bit rgb. Depends on the byte ordering! - pix_format_rgbAAA, // 30 bit rgb. Depends on the byte ordering! - pix_format_rgbBBA, // 32 bit rgb. Depends on the byte ordering! - pix_format_bgrAAA, // 30 bit bgr. Depends on the byte ordering! - pix_format_bgrABB, // 32 bit bgr. Depends on the byte ordering! - pix_format_rgb24, // R-G-B, one byte per color component - pix_format_bgr24, // B-G-R, native win32 BMP format. - pix_format_rgba32, // R-G-B-A, one byte per color component - pix_format_argb32, // A-R-G-B, native MAC format - pix_format_abgr32, // A-B-G-R, one byte per color component - pix_format_bgra32, // B-G-R-A, native win32 BMP format - pix_format_rgb48, // R-G-B, 16 bits per color component - pix_format_bgr48, // B-G-R, native win32 BMP format. - pix_format_rgba64, // R-G-B-A, 16 bits byte per color component - pix_format_argb64, // A-R-G-B, native MAC format - pix_format_abgr64, // A-B-G-R, one byte per color component - pix_format_bgra64, // B-G-R-A, native win32 BMP format - - end_of_pix_formats - }; -}; - -#endif diff --git a/uppdev/AggCtrl/Test.cpp b/uppdev/AggCtrl/Test.cpp deleted file mode 100644 index 0d4774e87..000000000 --- a/uppdev/AggCtrl/Test.cpp +++ /dev/null @@ -1,150 +0,0 @@ -#include "CtrlLib.h" - -NAMESPACE_UPP - -DropChoice::DropChoice() { - always_drop = false; - AddButton().Main() <<= THISBACK(Drop); - NoDisplay(); - list.Normal(); - list.WhenSelect = callback(this, &DropChoice::Select); - dropfocus = true; - EnableDrop(false); - dropwidth = 0; -} - -void DropChoice::EnableDrop(bool b) -{ - MainButton().Enable(b); -} - -void DropChoice::PseudoPush() -{ - MultiButton::PseudoPush(0); -} - -void DropChoice::Drop() { - if(!owner || owner->IsReadOnly() || list.GetCount() == 0 && !WhenDrop) return; - WhenDrop(); - if(dropfocus) - owner->SetWantFocus(); - if(!list.FindSetCursor(owner->GetData()) && list.GetCount() > 0) - list.SetCursor(0); - list.PopUp(owner,dropwidth); -} - -void DropChoice::Select() { - if(!owner || owner->IsReadOnly()) return; - WhenSelect(); -} - -Value DropChoice::Get() const { - if(!owner || owner->IsReadOnly()) return Value(); - int c = list.GetCursor(); - if(c < 0) return Value(); - return list.Get(c, 0); -} - -int DropChoice::GetIndex() const -{ - if(!owner || owner->IsReadOnly()) return -1; - return list.GetCursor(); -} - -bool DropChoice::DataSelect(Ctrl& owner, DropChoice& drop, const String& appends) { - Value g = drop.Get(); - if(g.IsVoid()) return false; - Value s = owner.GetData(); - if(!appends.IsVoid()) { - String txt = s; - if(!txt.IsEmpty()) txt.Cat(appends); - txt.Cat((String)g); - s = txt; - } - else - s = g; - owner.SetData(s); - owner.WhenAction(); - return true; -} - -bool DropChoice::DoKey(dword key) { - if(owner && !owner->IsReadOnly() && list.GetCount()) { - int q = list.GetCursor(); - switch(key) { - case K_ALT_DOWN: - PseudoPush(); - return true; - case K_DOWN: - if(appending) - PseudoPush(); - else { - list.SetCursor(q <= 0 ? list.GetCount() - 1 : q - 1); - Select(); - } - return true; - case K_UP: - if(appending) - PseudoPush(); - else { - list.SetCursor(q < 0 || q >= list.GetCount() - 1 ? 0 : q + 1); - Select(); - } - return true; - } - } - return false; -} - -void DropChoice::Add(const Value& s) { - list.Add(s); - EnableDrop(true); -} - -void DropChoice::Clear() { - list.Clear(); - EnableDrop(always_drop); -} - -void DropChoice::Serialize(Stream& s) { - int version = 0x00; - int n = list.GetCount(); - s / version / n; - Value v; - if(s.IsLoading()) { - Clear(); - for(int i = 0; i < n; i++) { - s % v; - Add(v); - } - } - else - for(int i = 0; i < n; i++) { - v = list.Get(i, 0); - s % v; - } - EnableDrop(list.GetCount() || always_drop); -} - -void DropChoice::AddHistory(const Value& v, int max) { - if(IsNull(v)) return; - for(int i = 0; i < list.GetCount(); i++) - if(list.Get(i, 0) == v) { - list.Remove(i); - break; - } - list.Insert(0, Vector() << v); - if(list.GetCount() > max) - list.SetCount(max); - EnableDrop(list.GetCount() || always_drop); - list.KillCursor(); -} - -DropChoice& DropChoice::AlwaysDrop(bool e) -{ - always_drop = e; - EnableDrop(list.GetCount() || always_drop); - return *this; -} - -END_UPP_NAMESPACE diff --git a/uppdev/AggCtrl/init b/uppdev/AggCtrl/init deleted file mode 100644 index 06de2b1a2..000000000 --- a/uppdev/AggCtrl/init +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef _AggCtrl_icpp_init_stub -#define _AggCtrl_icpp_init_stub -#include "CtrlLib/init" -#include "agg24/init" -#endif diff --git a/uppdev/Alloc/Alloc.cpp b/uppdev/Alloc/Alloc.cpp deleted file mode 100644 index 027e5f42a..000000000 --- a/uppdev/Alloc/Alloc.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include - -using namespace UPP; - -#define ITEM_COUNT 1000000 - -CONSOLE_APP_MAIN { - Vector v; - getchar(); - for(int i=0;i - -using namespace Upp; - -class ImageDrawTest : public TopWindow { -public: - typedef ImageDrawTest CLASSNAME; - Image img; - - ImageDrawTest() { - Sizeable(); - GenerateImage(); - } - - void GenerateImage() { - Size sz(100, 100); - ImageDraw w(sz); -// w.Alpha().DrawRect(sz, Black()); -// w.Alpha().DrawRect(30, 30, 40, 40, White()); - w.DrawRect(sz, Red); - img = w; - } - - virtual void Paint(Draw &w) { - w.DrawRect(GetSize(), SColorFace()); - w.DrawImage(0, 0, img); - } - - virtual void LeftUp(Point p, dword keyflags) { - GenerateImage(); - Refresh(); - } -}; - -GUI_APP_MAIN -{ - ImageDrawTest().Run(); -} diff --git a/uppdev/AlphaImage/AlphaImage.upp b/uppdev/AlphaImage/AlphaImage.upp deleted file mode 100644 index 84303dae4..000000000 --- a/uppdev/AlphaImage/AlphaImage.upp +++ /dev/null @@ -1,10 +0,0 @@ -uses - CtrlLib, - plugin\zim; - -file - main.cpp; - -mainconfig - "" = "GUI"; - diff --git a/uppdev/AlphaImage/init b/uppdev/AlphaImage/init deleted file mode 100644 index e66ff9ba0..000000000 --- a/uppdev/AlphaImage/init +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef _AlphaImage_icpp_init_stub -#define _AlphaImage_icpp_init_stub -#include "CtrlLib/init" -#include "plugin\zim/init" -#endif diff --git a/uppdev/AlphaImage/main.cpp b/uppdev/AlphaImage/main.cpp deleted file mode 100644 index 41854820a..000000000 --- a/uppdev/AlphaImage/main.cpp +++ /dev/null @@ -1,49 +0,0 @@ -#include - -using namespace Upp; - -struct App : public TopWindow { - virtual void Paint(Draw& w) { - ImageDraw iw(400, 400); - iw.Alpha().DrawRect(0, 0, 400, 400, Black()); - iw.Alpha().DrawEllipse(0, 0, 200, 200, GrayColor(100)); - iw.DrawRect(0, 0, 400, 400, Black); - iw.DrawEllipse(0, 0, 200, 200, LtCyan); - - Image a = Rescale(iw, 200, 200); - - w.DrawRect(GetSize(), White); - w.DrawImage(30, 30, a, Rect(10, 10, 50, 50)); - w.DrawImage(500, 30, a, Blue); - - - ImageBuffer ib(50, 50); - for(int y = 0; y < 50; y++) { - RGBA *l = ib[y]; - for(int x = 0; x < 50; x++) { - if(y == 0 || y == 49 || x == 0 || x == 49) - *l++ = Black(); - else { - l->a = 2 * (x + y); - l->r = 4 * x; - l->g = 4 * y; - l->b = 200; - l++; - } - } - } - Premultiply(ib); - Image b = ib; - - Over(a, Point(70, 70), b, b.GetSize()); - - w.DrawImage(20, 500, a); - } - -}; - -GUI_APP_MAIN -{ - App().Run(); -} - diff --git a/uppdev/Any/Any.cpp b/uppdev/Any/Any.cpp deleted file mode 100644 index 674ecfbbb..000000000 --- a/uppdev/Any/Any.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include - -using namespace Upp; - -#define TEST - -CONSOLE_APP_MAIN -{ - Any alpha; - - alpha.Create(); - - if(alpha.Is()) - RLOG("int"); - - Any beta = alpha; -} diff --git a/uppdev/Any/Any.upp b/uppdev/Any/Any.upp deleted file mode 100644 index 852c9b052..000000000 --- a/uppdev/Any/Any.upp +++ /dev/null @@ -1,16 +0,0 @@ -description "\377128,128,0"; - -optimize_speed; - -uses - Core; - -file - Any.cpp, - app.tpp\test$cs-cz.tppi, - app.tpp\test$en-us.tppi, - app.tpp; - -mainconfig - "" = "MT"; - diff --git a/uppdev/Any/app.tpp/test$cs-cz.tpp b/uppdev/Any/app.tpp/test$cs-cz.tpp deleted file mode 100644 index 31c919e34..000000000 --- a/uppdev/Any/app.tpp/test$cs-cz.tpp +++ /dev/null @@ -1,3 +0,0 @@ -topic "asdfasdfasdfasdf";[ $$0,0#00000000000000000000000000000000:Default] -[{_} -[s0; Juest a testaJuest a test] \ No newline at end of file diff --git a/uppdev/Any/app.tpp/test$en-us.tpp b/uppdev/Any/app.tpp/test$en-us.tpp deleted file mode 100644 index 38b35b4c6..000000000 --- a/uppdev/Any/app.tpp/test$en-us.tpp +++ /dev/null @@ -1,3 +0,0 @@ -topic "asdfasdfasdf123";[ $$0,0#00000000000000000000000000000000:Default] -[{_} -[s0; Hell1] \ No newline at end of file diff --git a/uppdev/Any/init b/uppdev/Any/init deleted file mode 100644 index 873bd3831..000000000 --- a/uppdev/Any/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _Any_icpp_init_stub -#define _Any_icpp_init_stub -#include "Core/init" -#endif diff --git a/uppdev/AnyImageDraw/AnyImageDraw.cpp b/uppdev/AnyImageDraw/AnyImageDraw.cpp deleted file mode 100644 index c31ca64ba..000000000 --- a/uppdev/AnyImageDraw/AnyImageDraw.cpp +++ /dev/null @@ -1,160 +0,0 @@ -#include "AnyImageDraw.h" - -dword ImageAnyDraw::GetInfo() const -{ - return draw->GetInfo(); -} - -Size ImageAnyDraw::GetPageSize() const -{ - return draw->GetPageSize(); -} - -void ImageAnyDraw::BeginOp() -{ - return draw->BeginOp(); -} - -void ImageAnyDraw::EndOp() -{ - return draw->EndOp(); -} - -void ImageAnyDraw::OffsetOp(Point p) -{ - return draw->OffsetOp(p); -} - -bool ImageAnyDraw::ClipOp(const Rect& r) -{ - return draw->ClipOp(r); -} - -bool ImageAnyDraw::ClipoffOp(const Rect& r) -{ - return draw->ClipoffOp(r); -} - -bool ImageAnyDraw::ExcludeClipOp(const Rect& r) -{ - return draw->ExcludeClipOp(r); -} - -bool ImageAnyDraw::IntersectClipOp(const Rect& r) -{ - return draw->IntersectClipOp(r); -} - -bool ImageAnyDraw::IsPaintingOp(const Rect& r) const -{ - return draw->IsPaintingOp(r); -} - -Rect ImageAnyDraw::GetPaintRect() const -{ - return draw->GetPaintRect(); -} - -void ImageAnyDraw::DrawRectOp(int x, int y, int cx, int cy, Color color) -{ - draw->DrawRectOp(x, y, cx, cy, color); -} - -void ImageAnyDraw::DrawImageOp(int x, int y, int cx, int cy, const Image& img, const Rect& src, Color color) -{ - draw->DrawImageOp(x, y, cx, cy, img, src, color); -} - -void ImageAnyDraw::DrawDataOp(int x, int y, int cx, int cy, const String& data, const char *id) -{ - draw->DrawDataOp(x, y, cx, cy, data, id); -} - -void ImageAnyDraw::DrawLineOp(int x1, int y1, int x2, int y2, int width, Color color) -{ - draw->DrawLineOp(x1, y1, x2, y2, width, color); -} - -void ImageAnyDraw::DrawPolyPolylineOp(const Point *vertices, int vertex_count, - const int *counts, int count_count, int width, - Color color, Color doxor) -{ - draw->DrawPolyPolylineOp(vertices, vertex_count, counts, count_count, width, color, doxor); -} - -void ImageAnyDraw::DrawPolyPolyPolygonOp(const Point *vertices, int vertex_count, const int *subpolygon_counts, int scc, const int *disjunct_polygon_counts, int dpcc, Color color, int width, Color outline, uint64 pattern, Color doxor) -{ - draw->DrawPolyPolyPolygonOp(vertices, vertex_count, subpolygon_counts, scc, - disjunct_polygon_counts, dpcc, color, width, outline, - pattern, doxor); -} - -void ImageAnyDraw::DrawArcOp(const Rect& rc, Point start, Point end, int width, Color color) -{ - draw->DrawArcOp(rc, start, end, width, color); -} - -void ImageAnyDraw::DrawEllipseOp(const Rect& r, Color color, int pen, Color pencolor) -{ - draw->DrawEllipseOp(r, color, pen, pencolor); -} - -void ImageAnyDraw::DrawTextOp(int x, int y, int angle, const wchar *text, Font font, Color ink, - int n, const int *dx) -{ - draw->DrawTextOp(x, y, angle, text, font, ink, n, dx); -} - -void ImageAnyDraw::DrawDrawingOp(const Rect& target, const Drawing& w) -{ - draw->DrawDrawingOp(target, w); -} - -void ImageAnyDraw::DrawPaintingOp(const Rect& target, const Painting& w) -{ - draw->DrawPaintingOp(target, w); -} - -Draw *(*sCreateImageDraw)(Size sz); -Image (*sExtractImageDraw)(Draw *w); - -void ImageAnyDrawPainter(Draw *(*f)(Size sz), Image (*e)(Draw *w)) -{ - sCreateImageDraw = f; - sExtractImageDraw = e; -} - -void ImageAnyDrawSystem(Draw *(*f)(Size sz), Image (*e)(Draw *w)) -{ - if(!sCreateImageDraw) { - sCreateImageDraw = f; - sExtractImageDraw = e; - } -} - -void ImageAnyDraw::Init(Size sz) -{ - ASSERT(sCreateImageDraw); - draw = (*sCreateImageDraw)(sz); - ASSERT(draw); -} - -ImageAnyDraw::operator Image() const -{ - return (*sExtractImageDraw)(draw); -} - -ImageAnyDraw::ImageAnyDraw(Size sz) -{ - Init(sz); -} - -ImageAnyDraw::ImageAnyDraw(int cx, int cy) -{ - Init(Size(cx, cy)); -} - -ImageAnyDraw::~ImageAnyDraw() -{ - delete draw; -} diff --git a/uppdev/AnyImageDraw/AnyImageDraw.h b/uppdev/AnyImageDraw/AnyImageDraw.h deleted file mode 100644 index 2d544f785..000000000 --- a/uppdev/AnyImageDraw/AnyImageDraw.h +++ /dev/null @@ -1,67 +0,0 @@ -#ifndef _AnyImageDraw_AnyImageDraw_h -#define _AnyImageDraw_AnyImageDraw_h - -#include -#include - -using namespace Upp; - -#define LAYOUTFILE -#include - -class ImageAnyDraw : public Draw { - Draw *draw; - - void Init(Size sz); - -public: - virtual dword GetInfo() const; - virtual Size GetPageSize() const; - virtual void BeginOp(); - virtual void EndOp(); - virtual void OffsetOp(Point p); - virtual bool ClipOp(const Rect& r); - virtual bool ClipoffOp(const Rect& r); - virtual bool ExcludeClipOp(const Rect& r); - virtual bool IntersectClipOp(const Rect& r); - virtual bool IsPaintingOp(const Rect& r) const; - virtual Rect GetPaintRect() const; - - virtual void DrawRectOp(int x, int y, int cx, int cy, Color color); - virtual void DrawImageOp(int x, int y, int cx, int cy, const Image& img, const Rect& src, Color color); - virtual void DrawDataOp(int x, int y, int cx, int cy, const String& data, const char *id); - virtual void DrawLineOp(int x1, int y1, int x2, int y2, int width, Color color); - virtual void DrawPolyPolylineOp(const Point *vertices, int vertex_count, - const int *counts, int count_count, - int width, Color color, Color doxor); - virtual void DrawPolyPolyPolygonOp(const Point *vertices, int vertex_count, - const int *subpolygon_counts, int scc, - const int *disjunct_polygon_counts, int dpcc, - Color color, int width, Color outline, - uint64 pattern, Color doxor); - virtual void DrawArcOp(const Rect& rc, Point start, Point end, int width, Color color); - virtual void DrawEllipseOp(const Rect& r, Color color, int pen, Color pencolor); - virtual void DrawTextOp(int x, int y, int angle, const wchar *text, Font font, - Color ink, int n, const int *dx); - virtual void DrawDrawingOp(const Rect& target, const Drawing& w); - virtual void DrawPaintingOp(const Rect& target, const Painting& w); - -public: - operator Image() const; - - ImageAnyDraw(Size sz); - ImageAnyDraw(int cx, int cy); - - ~ImageAnyDraw(); -}; - -class AnyImageDraw : public TopWindow { - virtual void Paint(Draw& w); - -public: - typedef AnyImageDraw CLASSNAME; - AnyImageDraw(); -}; - -#endif - diff --git a/uppdev/AnyImageDraw/AnyImageDraw.lay b/uppdev/AnyImageDraw/AnyImageDraw.lay deleted file mode 100644 index 13c9ae1cd..000000000 --- a/uppdev/AnyImageDraw/AnyImageDraw.lay +++ /dev/null @@ -1,3 +0,0 @@ -LAYOUT(AnyImageDrawLayout, 200, 100) -END_LAYOUT - diff --git a/uppdev/AnyImageDraw/AnyImageDraw.upp b/uppdev/AnyImageDraw/AnyImageDraw.upp deleted file mode 100644 index 2df0399a7..000000000 --- a/uppdev/AnyImageDraw/AnyImageDraw.upp +++ /dev/null @@ -1,13 +0,0 @@ -uses - CtrlLib, - Painter; - -file - AnyImageDraw.h, - AnyImageDraw.cpp, - main.cpp, - AnyImageDraw.lay; - -mainconfig - "" = "GUI"; - diff --git a/uppdev/AnyImageDraw/init b/uppdev/AnyImageDraw/init deleted file mode 100644 index 722ba3f40..000000000 --- a/uppdev/AnyImageDraw/init +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef _AnyImageDraw_icpp_init_stub -#define _AnyImageDraw_icpp_init_stub -#include "CtrlLib/init" -#include "Painter/init" -#endif diff --git a/uppdev/AnyImageDraw/main.cpp b/uppdev/AnyImageDraw/main.cpp deleted file mode 100644 index a5c923625..000000000 --- a/uppdev/AnyImageDraw/main.cpp +++ /dev/null @@ -1,48 +0,0 @@ -#include "AnyImageDraw.h" - -void ImageAnyDrawPainter(Draw *(*f)(Size sz), Image (*e)(Draw *w)); -void ImageAnyDrawSystem(Draw *(*f)(Size sz), Image (*e)(Draw *w)); - -static Draw *sCP(Size sz) -{ - return new ImagePainter(sz); -} - -static Image sEP(Draw *w) -{ - ImagePainter *ip = dynamic_cast(w); - return ip ? (Image)(*ip) : Image(); -} - -static Draw *sCD(Size sz) -{ - return new ImageDraw(sz); -} - -static Image sED(Draw *w) -{ - ImageDraw *ip = dynamic_cast(w); - return ip ? (Image)(*ip) : Image(); -} - -INITBLOCK { - ImageAnyDrawPainter(sCP, sEP); - ImageAnyDrawSystem(sCD, sED); -} - -void AnyImageDraw::Paint(Draw& w) -{ - ImageAnyDraw iw(200, 200); - iw.DrawRect(0, 0, 200, 200, White()); - iw.DrawText(0, 0, "X", Roman(200)); - w.DrawImage(0, 0, iw); -} - -AnyImageDraw::AnyImageDraw() -{ -} - -GUI_APP_MAIN -{ - AnyImageDraw().Run(); -} diff --git a/uppdev/ArisVectorDesigner/ArisVectorDes.cpp b/uppdev/ArisVectorDesigner/ArisVectorDes.cpp deleted file mode 100644 index b8f4ca157..000000000 --- a/uppdev/ArisVectorDesigner/ArisVectorDes.cpp +++ /dev/null @@ -1,246 +0,0 @@ -//aris: I removed it: -//#include "IdeVectorDes.h" -/* TODO: -1.Creation is a problem at the moment -2. Host problem -3.and shutdown (only from Windows Task Manager) !!!!! -4. registration data: load and save -5. where to add Main menu -6. and Load from file -7. Save to file. -8. Switch off-on the toolbars -9. Vec Data format - how to have parent-childr relatioships between images -10. Connecting (Linking?) images -11. Modules -12. Have Vector objects in QTF (and UWord) - -- IMAGESPACE ? -- is this ctrl-key stored in Ide config files? -*/ - -#include - -#define IMAGESPACE IdeVecImg -#define IMAGEFILE -#include - -//aris: this is for global config -static const char ctrl_key[] = "vectordes-ctrl-aris"; - -INITBLOCK -{ - RegisterGlobalConfig(ctrl_key); -} - -//aris commented: #include -//aris: added public -//aris: ArisDesigner would be some kind of a universal designer.. - -struct ArisDesigner : public TopWindow { - virtual String GetFileName() const = 0; - virtual void Save() = 0; -//aris virtual void SyncUsc() = 0; - virtual void ActivateDesigner() = 0; - virtual void SaveEditPos() = 0; - virtual void EditMenu(Bar& menu) = 0; - virtual int GetCharset() const { return -1; } - - virtual ~ArisDesigner() {} -}; - - -//aris: replaced Aris instead of Ide -struct ArisModule { - virtual void CleanUsc() {} - virtual bool ParseUsc(CParser&) { return false; } - virtual Image FileIcon(const char *filename) { return Null; } - virtual ArisDesigner *CreateDesigner(const char *path, byte charset) { return NULL; } - virtual void Serialize(Stream& s) {} -}; - - -void RegisterArisModule(ArisModule& module); -int GetArisModuleCount(); -ArisModule& GetArisModule(int q); - -static Vector& sM() -{ - static Vector m; - return m; -} - -void RegisterArisModule(ArisModule& module) -{ - sM().Add(&module); -} - -int GetArisModuleCount() -{ - return sM().GetCount(); -} - -ArisModule& GetArisModule(int q) -{ - return *sM()[q]; -} - -//aris FIXME or ask .... VectorDeshost is a empty class in ...VectorDes.h -class VectorDesigner : public ArisDesigner, public VectorDesHost -{ - One designer; - -public: -//aris FIND OUT: the host problem!!! - VectorDesigner() { designer = new VectorDes(*this); Add(designer->SizePos()); } - ~VectorDesigner() { Shutdown(); } - - virtual void Close() { designer->CloseDesigner(); } - virtual void ChildGotFocus() { if(!IsShutdown()) designer->FrameFocus(); } - virtual bool Key(dword key, int repcnt) { return designer->Key(key, repcnt); } - virtual String GetFileName() const { return filename; } - virtual void Save(); - -//aris: do i need USC??? -// virtual void SyncUsc() {} - virtual void ActivateDesigner() { SetForeground(); } - virtual void SaveEditPos(); - virtual void EditMenu(Bar& menu) { designer->EditMenu(menu); } - - void Serialize(Stream& s) { designer->Serialize(s); } - bool Load(const char *fn); - void SetConfigName(const char *name) { cfgname = name; } - - static void SerializeEditPos(Stream& stream); - - struct EditPos { - Time filetime; - - void Serialize(Stream& stream); - }; - -private: - String cfgname; - String filename; -}; - -//aris: Creation is a problem for now and shutdown!!!!!------------------------- -VectorDesigner *CreateVectorDesigner(const char *filename, const char *cfgname, bool topwindow); - - -//--------------------------------------- -//Laod file from *.vec -bool VectorDesigner::Load(const char *fn) -{ - filename = fn; - try { - String data = LoadFile(filename); - if(data.IsVoid()) - throw Exc(NFormat("Error reading file '%s'.", filename)); - CParser parser(data, filename); - //loads the actual vec data file!!! from parser??? - designer->LoadVecFile(parser); - return true; - } - catch(Exc e) { -//aris - PromptOK(NFormat("%s: %s\n", filename, e)); -// PutConsole(NFormat("%s: %s\n", filename, e)); - return false; - } -} - -void VectorDesigner::Save() -{ - //aris: FIXME -// if(!SaveChangedFileFinish(filename, designer->SaveVecFile())) -// Exclamation(NFormat("Error saving file [* \1%s\1].", filename)); -} - - -bool IsVecFile(String path) { return !CompareNoCase(GetFileExt(path), ".vec"); } - - -//aris: need to find out more about those globals -typedef ArrayMap EditPosMap; -GLOBAL_VAR(EditPosMap, VectorFileDataVar); - - -//aris: how does it work if it's empty? -void VectorDesigner::EditPos::Serialize(Stream& stream) -{ -} - - -//aris how does it work if it's empty? -void VectorDesigner::SaveEditPos() -{ -} - - -//aris SEE: VectorFileDataVar -void VectorDesigner::SerializeEditPos(Stream& s) -{ - s % VectorFileDataVar(); -} - - - -VectorDesigner *CreateVectorDesigner(const char *filename, const char *cfgname) -{ - One q = new VectorDesigner; - LoadFromGlobal(*q, cfgname); - q->SetConfigName(cfgname); - if(q->Load(filename)) - return -q; - return NULL; -} - - -struct VectorDesModule : public ArisModule { - virtual void CleanUsc() - { - } - - virtual bool ParseUsc(CParser& p) - { - return false; - } - - virtual Image FileIcon(const char *path) - { - return IsVecFile(path) ? IdeVecImg::ide_icon() : Null; - } - - virtual ArisDesigner *CreateDesigner(const char *path, byte cs) { - if(IsVecFile(path)) { - VectorDesigner *d = CreateVectorDesigner(path, ctrl_key); - if(d) - d->SizePos(); - return d; - } - return false; - } - virtual void Serialize(Stream& s) { - int version = 0; - s / version; - VectorDesigner::SerializeEditPos(s); - } -}; - -void RegisterArisVectorDes() -{ - RegisterArisModule(Single()); -//aris: what for those: - RegisterStdVectorObjects(); - RichObject::Register(RichObjectTypeVectorImage()); -} - - - -GUI_APP_MAIN -{ - - RegisterArisVectorDes(); - VectorDesigner().Sizeable().Zoomable().Run(); -//aris: When to use ?-> Ctrl::EventLoop(); -} diff --git a/uppdev/ArisVectorDesigner/ArisVectorDesigner.upp b/uppdev/ArisVectorDesigner/ArisVectorDesigner.upp deleted file mode 100644 index 7fa9435d3..000000000 --- a/uppdev/ArisVectorDesigner/ArisVectorDesigner.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - VectorDesA; - -file - IdeVectorDes.iml, - ArisVectorDes.cpp; - -mainconfig - "" = "GUI"; diff --git a/uppdev/ArisVectorDesigner/IdeVectorDes.iml b/uppdev/ArisVectorDesigner/IdeVectorDes.iml deleted file mode 100644 index 27cbd614a..000000000 --- a/uppdev/ArisVectorDesigner/IdeVectorDes.iml +++ /dev/null @@ -1,18 +0,0 @@ -IMAGE_BEGIN(ide_icon) - IMAGE_SCAN("\1\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0Â\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\1\0\0\0\0\377\0\1\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\1\0\0\0\0\377\0\1\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\1\0\0\0\0\377\0\1\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\0\377\0\1\0\0\0\0\377\0\1\0\0\0\0\377\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\0\377\0\0\0\0\0\377\0\0\0\0\0\377\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\0\377\0\0\0\0\0\377\0\0\0\0\0\377\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\0\377\0\1\0\0\0") - IMAGE_SCAN("\0\0\0") - IMAGE_SCAN("") - IMAGE_SCAN("") - IMAGE_SCAN("\0\0\0") - IMAGE_SCAN("") -IMAGE_PACKED(ide_icon, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") diff --git a/uppdev/ArrayCtrl/ArrayCtrl.h b/uppdev/ArrayCtrl/ArrayCtrl.h deleted file mode 100644 index f790e0d54..000000000 --- a/uppdev/ArrayCtrl/ArrayCtrl.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef _ArrayCtrl_ArrayCtrl_h -#define _ArrayCtrl_ArrayCtrl_h - -#include - -using namespace Upp; - - - -class ArrayCtrl : public TopWindow { - -public: - typedef ArrayCtrl CLASSNAME; - ArrayCtrl(); -}; - -#endif diff --git a/uppdev/ArrayCtrl/ArrayCtrl.upp b/uppdev/ArrayCtrl/ArrayCtrl.upp deleted file mode 100644 index 3c29d5874..000000000 --- a/uppdev/ArrayCtrl/ArrayCtrl.upp +++ /dev/null @@ -1,11 +0,0 @@ -description "\377B"; - -uses - CtrlLib; - -file - main.cpp optimize_speed; - -mainconfig - "" = "GUI"; - diff --git a/uppdev/ArrayCtrl/Test2/Test2.upp b/uppdev/ArrayCtrl/Test2/Test2.upp deleted file mode 100644 index 61fa029d4..000000000 --- a/uppdev/ArrayCtrl/Test2/Test2.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - CtrlLib; - -file - - "main.cpp"; - -mainconfig - "" = "GUI"; diff --git a/uppdev/ArrayCtrl/Test2/main.cpp b/uppdev/ArrayCtrl/Test2/main.cpp deleted file mode 100644 index daf00a0e2..000000000 --- a/uppdev/ArrayCtrl/Test2/main.cpp +++ /dev/null @@ -1,5 +0,0 @@ -#include - -GUI_APP_MAIN -{ -} diff --git a/uppdev/ArrayCtrl/init b/uppdev/ArrayCtrl/init deleted file mode 100644 index 7c8b71446..000000000 --- a/uppdev/ArrayCtrl/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _ArrayCtrl_icpp_init_stub -#define _ArrayCtrl_icpp_init_stub -#include "CtrlLib/init" -#endif diff --git a/uppdev/ArrayCtrl/main.cpp b/uppdev/ArrayCtrl/main.cpp deleted file mode 100644 index e9834ed07..000000000 --- a/uppdev/ArrayCtrl/main.cpp +++ /dev/null @@ -1,43 +0,0 @@ -#include - -using namespace Upp; - -struct App : TopWindow { - ArrayCtrl a; - - bool Order(int i1, int i2) { - DDUMP(a.Get(i1, 0)); - DDUMP(a.Get(i2, 0)); - return a.Get(i1, 0) < a.Get(i2, 0); - } - - void DoTip(Point p) - { - if(p.y & 1) - a.Tip("Hello!"); - else - a.Tip(""); - } - - typedef App CLASSNAME; - - App() { - Add(a.SizePos()); - Sizeable().Zoomable(); - - a.AddColumn("Test"); - for(int i = 0; i < 200; i++) { - a.Add((int)Random(10000)); - } - // a.Sort(THISBACK(Order)); - a.Sort(); - - a.WhenMouseMove = THISBACK(DoTip); - } -}; - -GUI_APP_MAIN -{ - DUMP("Test"); - App().Run(); -} diff --git a/uppdev/ArrayCtrl/src.tpp/ArrayCtrl_CLASSNAME$en-us.tpp b/uppdev/ArrayCtrl/src.tpp/ArrayCtrl_CLASSNAME$en-us.tpp deleted file mode 100644 index 9aafdb33b..000000000 --- a/uppdev/ArrayCtrl/src.tpp/ArrayCtrl_CLASSNAME$en-us.tpp +++ /dev/null @@ -1,13 +0,0 @@ -topic ""; -[ $$0,0#00000000000000000000000000000000:Default] -[H6;0 $$1,0#05600065144404261032431302351956:begin] -[i448;a25;kKO9;2 $$2,0#37138531426314131252341829483370:codeitem] -[l288;2 $$3,0#27521748481378242620020725143825:desc] -[0 $$4,0#96390100711032703541132217272105:end] -[{_} -[s1; &] -[s2;:ArrayCtrl`:`:CLASSNAME`:`:typedef: [@(0.0.255) typedef]_[_^ArrayCtrl^ ArrayCtrl]_[* CL -ASSNAME]&] -[s3;%% &] -[s4; &] -[s0; ] \ No newline at end of file diff --git a/uppdev/ArrayCtrl/srcimp.tpp/App$en-us.tpp b/uppdev/ArrayCtrl/srcimp.tpp/App$en-us.tpp deleted file mode 100644 index e742207a4..000000000 --- a/uppdev/ArrayCtrl/srcimp.tpp/App$en-us.tpp +++ /dev/null @@ -1,13 +0,0 @@ -topic ""; -[ $$0,0#00000000000000000000000000000000:Default] -[H6;0 $$1,0#05600065144404261032431302351956:begin] -[i448;a25;kKO9;2 $$2,0#37138531426314131252341829483370:codeitem] -[l288;2 $$3,0#27521748481378242620020725143825:desc] -[0 $$4,0#96390100711032703541132217272105:end] -[{_}%EN-US -[s1;%- &] -[s2;:App`:`:DnDInsert`(int`,PasteClip`&`):%- [@(0.0.255) void]_[* DnDInsert]([@(0.0.255) in -t]_[*@3 line], [_^PasteClip^ PasteClip][@(0.0.255) `&]_[*@3 d])&] -[s3; [%-*@3 line] [%-*@3 d].&] -[s4; &] -[s0; ] \ No newline at end of file diff --git a/uppdev/ArrayCtrl/test/test.upp b/uppdev/ArrayCtrl/test/test.upp deleted file mode 100644 index e69de29bb..000000000 diff --git a/uppdev/ArrayCtrlClipSel/ArrayCtrlClipSel.upp b/uppdev/ArrayCtrlClipSel/ArrayCtrlClipSel.upp deleted file mode 100644 index a4841aab8..000000000 --- a/uppdev/ArrayCtrlClipSel/ArrayCtrlClipSel.upp +++ /dev/null @@ -1,12 +0,0 @@ -description "ArrayCtrl::SetClipboard, ArrayCtrl::AsQtf, ArrayCtrl::GetText, ArrayCtrl::GetCsv\377"; - -uses - CtrlLib, - Report; - -file - main.cpp; - -mainconfig - "" = "GUI"; - diff --git a/uppdev/ArrayCtrlClipSel/init b/uppdev/ArrayCtrlClipSel/init deleted file mode 100644 index 51e0b308d..000000000 --- a/uppdev/ArrayCtrlClipSel/init +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef _ArrayCtrlClipSel_icpp_init_stub -#define _ArrayCtrlClipSel_icpp_init_stub -#include "CtrlLib/init" -#include "Report/init" -#endif diff --git a/uppdev/ArrayCtrlClipSel/main.cpp b/uppdev/ArrayCtrlClipSel/main.cpp deleted file mode 100644 index 67e506edb..000000000 --- a/uppdev/ArrayCtrlClipSel/main.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include -#include - -using namespace Upp; - -GUI_APP_MAIN -{ - ArrayCtrl a; - a.AddColumn("First"); - a.AddColumn("Second"); - a.AddColumn("Third"); - for(int i = 0; i < 100; i++) { - a.Add(i, GetSysDate() + i, FormatIntRoman(i)); - if(i % 3 == 0) - a.Select(i); - } - a.MultiSelect(); - a.SetClipboard(true, false); - - TopWindow win; - win.Add(a.SizePos()); - win.Run(); - - QtfReport(a.AsQtf(true) + "&&" + a.AsQtf(false, false)); - SaveFile("u:/ac1.csv", a.AsCsv()); - SaveFile("u:/ac2.csv", a.AsCsv(true, ',', false)); -} diff --git a/uppdev/ArrayCtrlCtrl/ArrayCtrlCtrl.upp b/uppdev/ArrayCtrlCtrl/ArrayCtrlCtrl.upp deleted file mode 100644 index 14c51818d..000000000 --- a/uppdev/ArrayCtrlCtrl/ArrayCtrlCtrl.upp +++ /dev/null @@ -1,11 +0,0 @@ -description "Just a test\377"; - -uses - CtrlLib; - -file - main.cpp charset "UTF-8"; - -mainconfig - "" = "GUI ST"; - diff --git a/uppdev/ArrayCtrlCtrl/init b/uppdev/ArrayCtrlCtrl/init deleted file mode 100644 index 79059a97c..000000000 --- a/uppdev/ArrayCtrlCtrl/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _ArrayCtrlCtrl_icpp_init_stub -#define _ArrayCtrlCtrl_icpp_init_stub -#include "CtrlLib/init" -#endif diff --git a/uppdev/ArrayCtrlCtrl/main.cpp b/uppdev/ArrayCtrlCtrl/main.cpp deleted file mode 100644 index fd20acc26..000000000 --- a/uppdev/ArrayCtrlCtrl/main.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include - -using namespace Upp; - -struct App : TopWindow { - Array option; - ArrayCtrl a; - - void Do(int ii) - { - option[ii].SetFocus(); - for(int i = 0; i < option.GetCount(); i++) - option[i].Enable(i == ii || option[ii]); - } - - bool CheckRow() - { - // if((int)a.Get(0) <= 0) { - // Exclamation("Chyba"); - // return false; - // } - return true; - } - - void Enter() - { - PromptOK("Enter!"); - } - - typedef App CLASSNAME; - - App() { - a.AddColumn("Option"); - for(int i = 0; i < 300; i++) { - a.Add(i & 4); - a.SetCtrl(i, 0, option.Add()); - option.Top() <<= i; -// option.Top() <<= THISBACK1(Do, i); - } - a.SetLineCy(10, 40); - option[10].SizePos(); - option[10].WhenEnter = THISBACK(Enter); - a.WhenAcceptRow = THISBACK(CheckRow); - Add(a.SizePos()); - Sizeable(); - } -}; - -GUI_APP_MAIN -{ - App().Run(); -} diff --git a/uppdev/ArrayCtrlCtrls/ArrayCtrlCtrls.upp b/uppdev/ArrayCtrlCtrls/ArrayCtrlCtrls.upp deleted file mode 100644 index 5872304d3..000000000 --- a/uppdev/ArrayCtrlCtrls/ArrayCtrlCtrls.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - CtrlLib; - -file - main.cpp; - -mainconfig - "" = "GUI"; - diff --git a/uppdev/ArrayCtrlCtrls/main.cpp b/uppdev/ArrayCtrlCtrls/main.cpp deleted file mode 100644 index 782597d83..000000000 --- a/uppdev/ArrayCtrlCtrls/main.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include - -using namespace Upp; - -void WidgetFactory(int line, One& x) -{ - if(line & 1) - x.Create(); - else - x.Create

" << PLACETORNEO << ",  " << DATATORNEO_B <<", "<\n"; - savehtml << "
\n"; - - savehtml << "

" << t_("Cross Table") << "

\n"; - savehtml << "

" << t_("Ranking List") << "

\n"; - savehtml << "

" << t_("Player Card") << "

\n"; - if(IS_FIDE_TOURNAMENT) savehtml << "

" << t_("Rating Report") << "

\n"; - if(PLAY_SYSTEM==DUBOV) savehtml << "

" << t_("Score Groups") << "

\n"; - savehtml << " \n"; - savehtml << "\n"; - savehtml << ""; - savehtml << " \n"; - savehtml << "\n"; - - savehtml << "\n"; - - savehtml << "\n"; - savehtml << "\n"; - savehtml << "
" << t_("Pairing/Results") << "
\n"; - for(j=1; j<=currentRound; j++) - { savehtml << " [ " << j <<" ] \n"; - } - savehtml << "
\n"; - savehtml << "

Generated by Vega

\n"; - savehtml << "\n\n"; - savehtml.Close(); - if(IS_FIDE_TOURNAMENT) FideEloVariationHTML(); -} -*/ - -void RoundData::ShowTableCategoryScore(int nplayers) -// -// PURPOSE: sort the database according to the category, score and bucholz -// -// INPUT VARIABLE -// n = number of players to be sorted -// -{ int i, k, j, pos; - int arr[N_PLAYER_MAX+1]; - String stringa, strname, str; - String filename; - - extern int CompareCategoryScoreName(const void *pid1, const void *pid2); - filename = PATHDIR + "rankcat.txt"; -// FileOut save( NFormat("%srankcat.txt", PATHDIR) ); - FileOut save( filename ); - save<< NAMETORNEO << "\n"; - save<< PLACETORNEO << " - " << DATATORNEO_B <<", "<=1) && (player[i].title != player[ arr[k-1] ].title) ) { - save << "\n" << t_("Ranking for category: ") << player[ arr[k] ].codetitle << "\n"; - pos = 1; - } else pos++; - - if (player[i].isAvailable != "0") strname = NFormat("%-20.20s", player[i].name); - else strname = NFormat("%-17.17s(W)", player[i].name); - - save << NFormat("%3d %4.1f %3d %s | %4d %3s %3s | ", - pos, //position - player[i].tiebreak[SCORE], - i, - strname, - player[i].RATING, - player[i].codetitle, - player[i].country); - j=1; - while (tyebreakorder[j]) { - switch ( tyebreakorder[j] ) // color the editSearch - { case 1: save << NFormat(" %6.2f ", player[i].tiebreak[BUC_CUT1]); - break; - case 2: save << NFormat(" %6.2f ", player[i].tiebreak[BUC_TOT]); - break; - case 3: save << NFormat(" %6.2f ", player[i].tiebreak[BUC_MED]); - break; - case 4: save << NFormat(" %6.2f ", player[i].tiebreak[SONN_BERG]); - break; - case 5: save << NFormat(" %6.2f ", player[i].tiebreak[CUMUL]); - break; - case 6: save << NFormat(" %6.2f ", player[i].tiebreak[ARO]); - break; - case 7: save << NFormat(" %4.0f ", player[i].tiebreak[MOST_BLACKS]); - break; - case 8: save << NFormat(" %4.0f ", player[i].tiebreak[MOST_WINS]); - break; - case 9: save << NFormat(" %4.0f ", player[i].tiebreak[APRO]); - break; - } - j++; - } - save << "\n"; - } - save<<"\n Generated by Vega - www.vegachess.com\n"; - save.Close(); -} - - - -void RoundData::ShowTableScore(int nplayers) -// -// PURPOSE: rank the database according the score and bucholz -// -// INPUT VARIABLE -// n = number of players to be sorted -// -{ int i, inext, iprev, n, p, k, j; - int arr[N_PLAYER_MAX+1], next[11]; - int tb, tbp=0; - String stringa, strname, str; - - extern int CompareScoreName(const void *pid1, const void *pid2); - extern int (*cmpfunc[FUNC_CMP+1])(int, int); - - FileOut save(PATHDIR + "tblscore.txt" ); - FileOut savehtml(PATHDIRWWW + "index.html" ); - save << NAMETORNEO << "\n"; - save << PLACETORNEO << " - " << DATATORNEO_B <<", "<=0 && n && player[i].tiebreak[SCORE] == player[inext].tiebreak[SCORE]) tb = (*cmpfunc[ tyebreakorder[j-1] ])(i, inext); - else tb=1; - if (iprev>=0 && p && player[i].tiebreak[SCORE] == player[iprev].tiebreak[SCORE]) tbp = (*cmpfunc[ tyebreakorder[j-1] ])(i, iprev); //stampa il ritorno - else tbp=1; - if (tb==0 || tbp==0) { - switch ( tyebreakorder[j] ) // color the editSearch - { case 1: save << NFormat(" %6.2f ", player[i].tiebreak[BUC_CUT1]); - break; - case 2: save << NFormat(" %6.2f ", player[i].tiebreak[BUC_TOT]); - break; - case 3: save << NFormat(" %6.2f ", player[i].tiebreak[BUC_MED]); - break; - case 4: save << NFormat(" %6.2f ", player[i].tiebreak[SONN_BERG]); - break; - case 5: save << NFormat(" %6.2f ", player[i].tiebreak[CUMUL]); - break; - case 6: save << NFormat(" %6.2f ", player[i].tiebreak[ARO]); - break; - case 7: save << NFormat(" %4.0f ", player[i].tiebreak[MOST_BLACKS]); - break; - case 8: save << NFormat(" %4.0f ", player[i].tiebreak[MOST_WINS]); - break; - case 9: save << NFormat(" %4.0f ", player[i].tiebreak[APRO]); - break; - } - //save << str; - if ( tb != 0) n = 0; - if ( tbp != 0) p = 0; - j++; - } - else break; - } - save << "\n"; - } - save<<"\n Generated by Vega - www.vegachess.com\n"; - save.Close(); - - // produce HTML files - savehtml << TD.HTMLCommonHeader(); - savehtml << HTMLNavBar(); - savehtml << "

" << NAMETORNEO << "

\n"; - savehtml << "

" << PLACETORNEO << " - " << DATATORNEO_B <<", "<\n"; - savehtml << "

" << t_("Standing at round ")<< currentRound<< "

\n"; - - savehtml << " \n"; - savehtml << "\n"; - - savehtml << " "; - savehtml << " "; - - j=1; - while (tyebreakorder[j]) { - switch ( tyebreakorder[j] ) // color the editSearch - { case 1: savehtml << NFormat("", tyebreakname[ tyebreakorder[j] ]); - break; - case 2: savehtml << NFormat("", tyebreakname[ tyebreakorder[j] ]); - break; - case 3: savehtml << NFormat("", tyebreakname[ tyebreakorder[j] ]); - break; - case 4: savehtml << NFormat("", tyebreakname[ tyebreakorder[j] ]); - break; - case 5: savehtml << NFormat("", tyebreakname[ tyebreakorder[j] ]); - break; - case 6: savehtml << NFormat("", tyebreakname[ tyebreakorder[j] ]); - break; - case 7: savehtml << NFormat("", tyebreakname[ tyebreakorder[j] ]); - break; - case 8: savehtml << NFormat("", tyebreakname[ tyebreakorder[j] ]); - break; - case 9: savehtml << NFormat("", tyebreakname[ tyebreakorder[j] ]); - break; - } - j++; - //savehtml << str; - } - savehtml << "\n \n"; - - for (k=0; k%3d ", - k+1, - player[i].tiebreak[SCORE], - i, i, - player[i].codetitle, strname, - player[i].RATING, - (int) player[i].tiebreak[PER_RAT], - player[i].country); - if ((k+1)&1) savehtml << " "; - else savehtml << " "; - savehtml << stringa; - j=1; - while (tyebreakorder[j]) { - switch ( tyebreakorder[j] ) // color the editSearch - { case 1: savehtml << NFormat(" ", player[i].tiebreak[BUC_CUT1]); - break; - case 2: savehtml << NFormat(" ", player[i].tiebreak[BUC_TOT]); - break; - case 3: savehtml << NFormat(" ", player[i].tiebreak[BUC_MED]); - break; - case 4: savehtml << NFormat(" ", player[i].tiebreak[SONN_BERG]); - break; - case 5: savehtml << NFormat(" ", player[i].tiebreak[CUMUL]); - break; - case 6: savehtml << NFormat(" ", player[i].tiebreak[ARO]); - break; - case 7: savehtml << NFormat(" ", player[i].tiebreak[MOST_BLACKS]); - break; - case 8: savehtml << NFormat(" ", player[i].tiebreak[MOST_WINS]); - break; - case 9: savehtml << NFormat(" ", player[i].tiebreak[APRO]); - break; - } - j++; - //savehtml << str; - } - savehtml << "\n \n"; - } - savehtml << "\n"; - savehtml << "
Pos Scr ID NAME Rat PRat Nat %s %s %s %s %s %s %s %s %s
%4.1f %2d %3s %s %4d %4d %3s
%6.2f %6.2f %6.2f %6.2f %6.2f %6.2f %4.0f %4.0f %4.0f
\n"; - savehtml << "
Generated by Vega \n"; - savehtml << "\n\n"; - savehtml.Close(); - - if(IS_FIDE_TOURNAMENT) FideEloVariationHTML(); -} - -void RoundData::NationalPlayerCard(int nplayers) -{ int i, j, idopp, per, var, aro, nopp, index; - String stringa, color; - double arrp[N_ROUND_MAX_RR+2][2]; - double tot, totscore, result, sumtotscore, score_perform; - int *roundRes; - int *playerCol; - int *playerOpp; - extern int p_dp[]; - extern int roundfloat( double per); - - if (IS_SWISS) { - playerOpp = &playerOpponent[0][0]; - roundRes = &roundResult[0][0]; - playerCol = &playerColor[0][0]; - } - else { - playerOpp = &playerOpponentRR[0][0]; - roundRes = &roundResultRR[0][0]; - playerCol = &playerColorRR[0][0]; - } - FileOut save(PATHDIR + "playercd.txt"); - FileOut saveelo(PATHDIR + "elovar.txt"); - saveelo << NAMETORNEO << "\n"; - saveelo<< PLACETORNEO << " - " << DATATORNEO_B <<", "<9999) per=9999; - player[i].tiebreak[PER_RAT] = (float) per; - save <<"----------------------------------------------------------------\n"; - save << NFormat(" var=%3d, PRat=%5d, ARO=%4d, %5.2f %4.1f %4.1f\n", - var, per, aro, tot, player[i].tiebreak[SCORE], sumtotscore); - - saveelo << NFormat(" %3d %-20.20s %2d %4d %4d %5d\n", - i, player[i].name, player[i].kcoeff, player[i].RATING, var, per); - } - save.Close(); - - saveelo << "\nGenerated by Vega - www.vegachess.com\n"; - saveelo.Close(); - - NationalPlayerCardHTML(nplayers); -} - - -void RoundData::NationalPlayerCardHTML(int nplayers) -{ int i, j, idopp, nopp, index; - String stringa, color; - double arrp[N_ROUND_MAX_RR+2][2], tot, totscore, result, aro; - int *roundRes; - int *playerCol; - int *playerOpp; - - if (PLAY_SYSTEM != ROUND_ROBIN && PLAY_SYSTEM != ROUND_ROBIN2) { - playerOpp = &playerOpponent[0][0]; - roundRes = &roundResult[0][0]; - playerCol = &playerColor[0][0]; - } - else { - playerOpp = &playerOpponentRR[0][0]; - roundRes = &roundResultRR[0][0]; - playerCol = &playerColorRR[0][0]; - } - - // produce HTML files - FileOut savehtml(PATHDIRWWW + "playercard.html"); - savehtml << HTMLCommonHeader(); -// savehtml << HTMLCommonHeader(); - savehtml << HTMLNavBar(); - savehtml << "

" << t_("National Player Cards") << "

\n"; - - savehtml << " \n"; - savehtml << "\n"; - - for(i=1; i<=nplayers; i++) - { savehtml << "\n\n"; - } - savehtml << "\n"; - - savehtml << "
\n"; - tot=0.; - aro = 0; - nopp = 0; - totscore=0.; //score without to consider the forfait - stringa = NFormat(" %3d %s %-20.20s, K=%2d, Elo=%4d, ID=%d\n", - i, player[i].codetitle, player[i].name, player[i].kcoeff, player[i].RATING, player[i].idnat); - calcelo(i, arrp, currentRound); - - savehtml << "\n\n

" << NAMETORNEO << "
" << PLACETORNEO << ", " << DATATORNEO_B <<", "<\n"; - savehtml << stringa << "

\n"; - savehtml << " \n"; - savehtml << "\n"; - savehtml << " "; - savehtml << "\n"; - savehtml << " \n"; - - for(j=1; j<=currentRound; j++) - { if (IS_SWISS) index = i*(N_ROUND_MAX+1) + j; - else index = i*(N_ROUND_MAX_RR+1) + j; - - idopp = playerOpp[index]; - if ( idopp!=0 && roundRes[index]<3 ) { // not forfait - tot += arrp[j][1]; - aro += player[idopp].RATING; nopp++; - if (roundRes[index]==1 || roundRes[index]==3) - { totscore += 1.0; result = WON;} - else if (roundRes[index]==2 || roundRes[index]==6) - { totscore += 0.5; result = DRAW;} - else if (roundRes[index]==0 || roundRes[index]==4) result = 0.; - - if (playerCol[index] == WHITE_COLOR) color = "W "; - else if (playerCol[index] == BLACK_COLOR) color = " B"; - - stringa = NFormat(" \n", - j, color, idopp, idopp, player[idopp].codetitle, player[idopp].name, - player[idopp].RATING, (int) arrp[j][0] ); - - stringa << NFormat("\n", - arrp[j][1], result, totscore, player[idopp].tiebreak[SCORE]); - if (j&1) savehtml << " "; - else savehtml << " "; - savehtml << stringa; - savehtml << " \n"; - } - else { - if (roundRes[index]==1 || roundRes[index]==3) result = 1.0; - else if (roundRes[index]==2 || roundRes[index]==6) result = 0.5; - else if (roundRes[index]==0 || roundRes[index]==4) result = 0.; - - stringa = NFormat("\n", - j,idopp,player[idopp].RATING, result, totscore, 0.0); - if (j&1) savehtml << " "; - else savehtml << " "; - savehtml << stringa; - savehtml << " \n"; - } - } - if (nopp!=0) aro = aro/nopp; - stringa = NFormat("\n", - (int) player[i].tiebreak[ELO_VAR], (int) player[i].tiebreak[PER_RAT], aro, tot, - player[i].tiebreak[SCORE]); - savehtml << " "; - savehtml << stringa; - savehtml << " \n"; - - savehtml << "\n"; - savehtml << "
R C ID OPPONENT Rtg diff exp. res Cum Score
%d %s %d %s %-20.20s %d %d%5.2f %4.1f %4.1f %4.1f
%d -- %d not played %d -- -- %4.1f %4.1f %4.1f
var = %3d, PRat=%4d %.1f %5.2f %4.1f
\n"; - - savehtml << "\n
\n"; - savehtml << "
Generated by Vega \n"; - savehtml << "\n\n\n"; - savehtml.Close(); -} - - -void RoundData::ShowRoundCard2(int round) -{ int i, nhalf; - int code, idwhite, idblack, result; - String stringa; - FileOut save(PATHDIR + "boardcrd.txt"); - - if (IS_SWISS) nhalf = pairing[0][round]; - else nhalf = pairingRR[0][round]; - - for (i=1; i<=nhalf; i++) - { //if (i>0 && (i%4)==0) save << "\f\n"; // form feed each 4 cards - if (PLAY_SYSTEM != ROUND_ROBIN && PLAY_SYSTEM != ROUND_ROBIN2) code = pairing[i][round]; - else code = pairingRR[i][round]; - DecodeResult(code, &idwhite, &idblack, &result); - save<<"\n" << "Table " << i<< t_(", Round: ") << round<< ", " <0 && (i%5)==0) save<<"\n\n\n"; - } - save<< "\n"; - save.Close(); - ShowRoundCard3(round); -} - - -void RoundData::ShowRoundCard3(int round) -{ const int np =7; - int i, r, c, nhalf, npages; - int code, idwhite, idblack, result; - String stringa; - FileOut save(PATHDIR + "boardcrd.rtf"); - - if (IS_SWISS) nhalf = pairing[0][round]; - else nhalf = pairingRR[0][round]; - - save<<"{\\rtf1\\ansi\\uc0 \\deff1 " << "\n"; - save<<"{\\fonttbl{\\f1\\froman\\fcharset0\\fprq2 Courier ;}} " << "\n"; - save<<"{\\colortbl;\\red0\\green0\\blue0;\\red0\\green0\\blue255;\\red0\\green255\\blue255;\\red0\\green255\\blue0;\\red255\\green0\\blue255;\\red255\\green0\\blue0; " << "\n"; - save<<"\\red255\\green255\\blue0;\\red255\\green255\\blue255;\\red0\\green0\\blue128;\\red0\\green128\\blue128;\\red0\\green128\\blue0;\\red128\\green0\\blue128;\\red128\\green0\\blue0;\\red128\\green128\\blue0;\\red128\\green128\\blue128;\\red192\\green192\\blue192;} " << "\n"; - save<<"{\\info }\\paperw11900\\paperh16820\\margl560\\margr560\\margt700\\margb700\\widowctrl\\ftnbj\\aenddoc\\formshade \\fet0\\sectd " << "\n"; - save<<"\\linex0\\endnhere\\plain " << "\n"; - - if (IS_SWISS) npages = (int) ceil(1.*pairing[0][round]/np); - else npages = (int) ceil(1.*pairingRR[0][round]/np); - - for (c=1; c<=npages; c++) - { for(r=1; r<=np; r++) - { i = c + (r-1) * npages; - if (i<=nhalf) { - if (IS_SWISS) code = pairing[i][round]; - else code = pairingRR[i][round]; - DecodeResult(code, &idwhite, &idblack, &result); - save<<"\n \\pard{\\cf1{\\fs20\\f1 Table " << i<<", Round = "<< round<<", Tournament: "<" << NAMETORNEO << "

\n"; - savehtml << "

" << PLACETORNEO << " - " << DATATORNEO_B <<", "<\n"; - savehtml << "

Result at round "<< currentRound<< "

\n"; - savehtml << " \n"; - savehtml << "\n"; - savehtml << "\n"; - if (IS_SWISS) npairs = pairing[0][round]; - else npairs = pairingRR[0][round]; - for (i=1; i<=npairs; i++) - { if (IS_SWISS) code = pairing[i][round]; - else code = pairingRR[i][round]; - DecodeResult(code, &iw, &ib, &res); - if (i&1) savehtml << " "; - else savehtml << " "; - savehtml << NFormat(" \n", - i, - iw, iw, player[iw].codetitle, player[iw].name, - ib, ib, player[ib].codetitle, player[ib].name, LabelResult(res, code, round)); - } - savehtml << "\n"; - savehtml << "
Bo. White Black result
%3d %d %s %s %d %s %s %s
\n"; - savehtml << "\n\n"; - savehtml << "

Generated by Vega

\n"; - savehtml.Close(); -} - -void RoundData::setAPRO(int round, int numberPlayer) -// -// NOTE: it is called just after the iserting the result of the round -// so at round N, the state refer to the previous N-1 rounds -// -{ int id, j, np, jopp, index; - float apro; - int *roundRes; - int *playerCol; - int *playerOpp; - if (IS_SWISS) { - playerOpp = &playerOpponent[0][0]; - roundRes = &roundResult[0][0]; - playerCol = &playerColor[0][0]; - } - else { - playerOpp = &playerOpponentRR[0][0]; - roundRes = &roundResultRR[0][0]; - playerCol = &playerColorRR[0][0]; - } - - for (id=1; id<=numberPlayer; id++) - { - //set Average performance rating opponent - apro = 0.; - np = 0; - for (j=1; j<=round; j++) - { if (PLAY_SYSTEM != ROUND_ROBIN && PLAY_SYSTEM != ROUND_ROBIN2) index = id*(N_ROUND_MAX+1) + j; - else index = id*(N_ROUND_MAX_RR+1) + j; - jopp = playerOpp[index]; - if (jopp != 0 && roundRes[index] < 3) // no BYE o game won for forfait - { apro += player[jopp].tiebreak[PER_RAT]; - np++; - } - } - if (np != 0) player[id].tiebreak[APRO] = apro/np; - else player[id].tiebreak[APRO] = 0.; - } -} - - - -void RoundData::SavePairsFile(int round) -// -// PURPOSE: show the current pairs, i.e. the last done -// -{ int i, code, iw, ib, res, npairs; - String name, stringa; - FileOut savepair(PATHDIR + "pairs" + AsString( round ) + ".txt"); - savepair << NAMETORNEO << t_(": Pairing of round ") << round <<"\n\n"; - savepair << "=================================================================================\n"; - if (IS_SWISS) npairs = pairing[0][round]; - else npairs = pairingRR[0][round]; - for (i=1; i<=npairs; i++) - { if (IS_SWISS) code = pairing[i][round]; - else code = pairingRR[i][round]; - DecodeResult(code, &iw, &ib, &res); - savepair << NFormat("%3d = %-20.20s (%4.1f) - %-20.20s (%4.1f) = %3d - %3d = ...\n", - i, - player[iw].name, player[iw].tiebreak[SCORE], - player[ib].name, player[ib].tiebreak[SCORE], - iw, ib ); - savepair << "---------------------------------------------------------------------------------\n"; - } - - savepair << t_("\n The following player(s) got a BYE:\n"); - for (i=1; i<=TD.NPlayer; i++) - { if ( IsNull(player[i].isAvailable) ) savepair << NFormat(" %3d - %-20.20s\n", i, player[i].name); - } - savepair << t_("\n The following player(s) withdrew:\n"); - for (i=1; i<=TD.NPlayer; i++) - { if (player[i].isAvailable== "0") savepair << NFormat(" %3d - %-20.20s\n", i, player[i].name); - } - savepair << "\n Generated by Vega - www.vegachess.com\n"; - savepair.Close(); - - // produce HTML files - FileOut savehtml(PATHDIRWWW + "pairs" + AsString(round) + ".html"); - savehtml << TD.HTMLCommonHeader(); - savehtml << HTMLNavBar(); - savehtml << "

" << NAMETORNEO << "

\n"; - savehtml << "

" << PLACETORNEO << " - " << DATATORNEO_B <<", "<\n"; - savehtml << "

Pairing at round "<< currentRound<< "

\n"; - savehtml << " \n"; - savehtml << "\n"; - savehtml << "\n"; - - if (IS_SWISS) npairs = pairing[0][round]; - else npairs = pairingRR[0][round]; - for (i=1; i<=npairs; i++) - { if (IS_SWISS) code = pairing[i][round]; - else code = pairingRR[i][round]; - DecodeResult(code, &iw, &ib, &res); - if (i&1) savehtml << " "; - else savehtml << " "; - savehtml << NFormat(" ", - i, - iw, iw, player[iw].codetitle, player[iw].name, player[iw].tiebreak[SCORE]); - savehtml << NFormat(" \n", - ib, ib, player[ib].codetitle, player[ib].name, player[ib].tiebreak[SCORE]); - } - savehtml << "\n"; - savehtml << "
Bo. White Black result
%3d %d %s %s (%.1f) %d %s %s (%.1f) ...
\n"; - savehtml << "

Generated by Vega

\n"; - savehtml << "\n\n"; - savehtml.Close(); - - // save the pairing on a file - FileOut savepair2 (PATHDIR + "pairing" + AsString(round) + ".txt"); - savepair2 << NAMETORNEO << " - Round " << round <<"\n"; - savepair2 << "======================================================================\n"; - savepair2 << " Board WHITE BLACK\n"; - savepair2 << "======================================================================\n"; - if (IS_SWISS) npairs = pairing[0][round]; - else npairs = pairingRR[0][round]; - for (i=1; i<=npairs; i++) - { if (IS_SWISS) code = pairing[i][round]; - else code = pairingRR[i][round]; - DecodeResult(code, &iw, &ib, &res); - savepair2 << NFormat(" %3d = %-20.20s - %-20.20s = ... - ...\n", - i, player[iw].name, player[ib].name); - } - savepair2 << "\n"; - savepair2 <<"\n Generated by Vega - www.vegachess.com\n"; - savepair2.Close(); - - // repeat saving a file good for a manual pairing - if (IS_SWISS) { - FileOut savepair3(PATHDIR + "pairs" + AsString(round) + ".man"); - savepair3 << pairing[0][round] << "\n"; - for (i=1; i<=npairs; i++) - { code = pairing[i][round]; - DecodeResult(code, &iw, &ib, &res); - savepair3 << iw << " " << ib << "\n"; - } - savepair3.Close(); - } -} - -String RoundData::LabelResult(int result, int code, int round) -// return the explicit result corresponding to its code -{ String strres, str; - int idw, idb, res; - switch (result) - { case 1: return "1 - 0"; break; - case 0: return "0 - 1"; break; - case 5: return "½ - ½"; break; - case 3: return "1F- 0"; break; // white win to forfait and get the BYE - case 4: return "0 -1F"; break; // black win to forfait and get the BYE - case 2: return "0F-0F"; break; // they lost, no color for both - case 7: return " adj "; break; // waitint a result - case 8: // non standard result - DecodeResult(code, &idw, &idb, &res); // get the id players - return LabelResultNonStandard(idw, idb, round); - break; - case 9: return " ... "; break; // waiting a result - } - return " ... "; -} - - - -String RoundData::LabelResultNonStandard(int idw, int idb, int round) -// return the explicit result corresponding to its code -{ String r1, r2; - if (TD.IS_SWISS) { //swiss - switch (TD.roundResult[idw][round]) - { case 1: r1 = "1 -"; break; - case 0: r1 = "0 -"; break; - case 2: r1 = "½ -"; break; - case 3: r1 = "1F-"; break; - case 4: r1 = "0F-"; break; - case 6: r1 = "½F-"; break; - case 8: r1 = "½T-"; break; - } - switch (TD.roundResult[idb][round]) - { case 1: r2 = " 1"; break; - case 0: r2 = " 0"; break; - case 2: r2 = " ½"; break; - case 3: r2 = "1F"; break; - case 4: r2 = "0F"; break; - case 6: r2 = "½F"; break; - case 8: r2 = "½T"; break; - } - } - else { //round robin - if (idb==0) { - TD.roundResultRR[idw][round] = 5; //new - TD.roundResultRR[0][round] = 5; //new - } - switch (TD.roundResultRR[idw][round]) - { case 1: r1 = "1 -"; break; - case 0: r1 = "0 -"; break; - case 2: r1 = "½ -"; break; - case 3: r1 = "1F-"; break; - case 4: r1 = "0F-"; break; - case 6: r1 = "½F-"; break; - case 8: r1 = "½T-"; break; - case 5: r1 = " null "; break; //new - } - switch (TD.roundResultRR[idb][round]) - { case 1: r2 = " 1"; break; - case 0: r2 = " 0"; break; - case 2: r2 = " ½"; break; - case 3: r2 = "1F"; break; - case 4: r2 = "0F"; break; - case 6: r2 = "½F"; break; - case 8: r2 = "½T"; break; - } - } - return (r1 + r2); -} - - - -void RoundData::DeleteRound(int fromround, int toround) -{ int i, j, id; - - if (IS_SWISS) { - for (j=fromround; j<=toround; j++) - { for (id=1; id<=NPlayer; id++) - { playerColor[id][j] = 0; - playerOpponent[id][j] = 0; - playerFloater[id][j] = 0; - roundResult[id][j] = 0; - } - } - currentRound = fromround-1; - for (j=fromround; j<=toround; j++) { - for (i=1; i<=pairing[0][j]; i++) pairing[i][j]=0; - } - AdjournCrossTableSwiss(currentRound); - } - else { - for (j=fromround; j<=toround; j++) - { for (id=1; id<=NPlayer; id++) - { playerColorRR[id][j] = 0; - roundResultRR[id][j] = 0; - } - } - currentRound = fromround-1; - for (j=fromround; j<=toround; j++) { - for (i=1; i<=pairingRR[0][j]; i++) - { pairingRR[i][j] = pairingRR[i][j]/10; - pairingRR[i][j] = pairingRR[i][j]*10+9; // set to "wait result" attento al giocatore dispari! - } - } - AdjournCrossTableRR(currentRound); - } -} - - -String RoundData::HTMLCommonHeader() -{ String header; // for Linux and windows - header = ""; - header << "\n\n"<< NAMETORNEO << "\n"; - header << " \n"; - header << "\n"; - header << "\n\n
"; - return header; -} - -String RoundData::HTMLNavBar() //int n, String name[], String url[]) -{ int j; - String header; - header = ""; - header << "

"; - if (FileExists(TD.PATHDIRWWW + "tourstat.html")) header << " " << t_("Tournament Summary") << " :: \n"; - header << " " << t_("Cross Table") << " :: " << t_("Standing") << " :: " << t_("Player Card") << " \n"; - if(IS_FIDE_TOURNAMENT) header << " :: " << t_("Rating Report") << " \n"; - if(PLAY_SYSTEM==DUBOV) header << " :: " << t_("Score Groups") << " \n"; - if (FileExists(TD.PATHDIRWWW + "players.html")) header << " :: " << t_("Participants") << " \n"; - - header << "

\n"; - - header << "

" << t_("Pairings/Results: "); - if (TD.STATUS_ROUND == READY_FOR_PAIRING ) { - for(j=1; j<=currentRound+1; j++) - { header << " [ " << j <<" ] "; - } - } - else { - for(j=1; j<=currentRound; j++) - { header << " [ " << j <<" ] "; - } - } - header << "

\n"; - return header; -} - - -void RoundData::ConvertUSCFDB() -{ FileSel fs; // for Linux and windows - String fn, dname; - //if (!PromptYesNo( "All your data will be lost... continue?" ) ) return;; - fs.Type( "File text tab delimited", "*.txt") - .Type( "All file", "*.*") - .DefaultExt("txt"); - if(fs.ExecuteOpen()) { // file selected - dname = fs.GetActiveDir(); //get directory - fn = ~fs; - } - else return; - -#ifdef PLATFORM_WIN32 - dname << "\\"; -#endif -#ifdef PLATFORM_POSIX - dname << "/"; -#endif - - FileIn in(fn); - FileOut out(dname + "uscffxd.txt"); - - while( !in.IsEof() ) { - Vector field = Split(in.GetLine(), '\t', false); - out << NFormat(" %-20.20s" , field[0]); //name - out << NFormat(" %8s" , field[1]); // USCF ID - out << NFormat(" %-10.10s" , field[2]); // expiration date - out << NFormat(" %3s" , field[3]); // state abbreviation - if ( !IsNull(field[4]) ) out << NFormat(" %4d", StrIntValue(field[4]) ); // regular rating - else out << NFormat(" %4d", 0 ); - if (field.GetCount() == 6 && !IsNull(field[5]) ) out << NFormat(" %4d\n", StrIntValue(field[5]) ); // quick rating - else out << NFormat(" % 4d\n", 0 ); - } - Exclamation( t_("UCSF archive converted") ); - in.Close(); - out.Close(); -} - -////////////////////// class Team ///////////////////////////////////////// - -TeamArchive::TeamArchive() -{ name = "BYE"; //25 chars max - country = "---"; //3 chars max - data = "00.00.00"; //10 chars max - sex = "m"; //1 chars max - - idfide = 0; //8 chars max - ratingfide = 0; //4 chars max - - idnat = 0; //8 chars max - ratingnat = 0; //4 chars max - kcoeff = 0; //3 chars max - - title = 0; // int corrispondent to codetitleused during pairing - codetitle = "--"; // used during pairing, max 3 chars (GM, WGM, IM, ecc... -// status - isAvailable = "1"; //0=out, null=get the bye - only for swiss, 1=play - -// pairing data - int rating = 0; // for DUBOV SYSTEM : rating = RATING, - // for VEGA system : rating = BUCHOLZ - float aro = 0.; // for DUBOV system : aro = ARO - // for VEGA system : aro = BUCHOLZ - int RATING = 0; // real rating used for pairing and printed in the output (it is useful when .rating is used for something else) - // it depends by the FIDE flag - - // player state useful for swiss system - duecolor = -1; //no duecolor - canChangeDuecolor = true; - tiebreak[SCORE] = 0.; -} - - -int TeamArchive::TitleToCode() -{ if ( codetitle == "GM" || codetitle == "IGM") return 20; - else if ( codetitle == "WGM" ) return 18; - else if ( codetitle == " IM" || codetitle == "IM") return 16; - else if ( codetitle == "WIM" ) return 14; - else if ( codetitle == " FM" || codetitle == "FM") return 12; - else if ( codetitle == "WFM" ) return 11; - else if ( codetitle == " M" || codetitle == "M" || codetitle == "-M") return 10; - else if ( codetitle == " CM" || codetitle == "CM" ) return 9; - else if ( codetitle == " A" || codetitle == "A" || codetitle == "AX" || codetitle == " 1N" || codetitle == "1N" ) return 8; - else if ( codetitle == " B" || codetitle == "B" || codetitle == "BX" || codetitle == " 2N" || codetitle == "2N" ) return 7; - else if ( codetitle == " C" || codetitle == "C" || codetitle == "CX" || codetitle == " 3N" || codetitle == "3N" ) return 6; - else if ( codetitle == " D" || codetitle == "D" || codetitle == "DX" ) return 5; - else if ( codetitle == " E" || codetitle == "E" || codetitle == "EX" ) return 4; - else if ( codetitle == " F" || codetitle == "F" || codetitle == "FX" ) return 3; - else if ( codetitle == " G" || codetitle == "G" || codetitle == "GX" ) return 2; - else if ( codetitle == " H" || codetitle == "H" || codetitle == "HX" ) return 1; - else if ( codetitle == " " || codetitle == " --" || codetitle == "--" || codetitle == "not" || codetitle == "NC" || codetitle == " NC" ) return 0; - return 0; // silly return to remove a warning -} - -////////////////////// class Team ///////////////////////////////////////// - -PlayerArchive::PlayerArchive() -{ name = "BYE"; //25 chars max - country = "---"; //3 chars max - data = "00.00.00"; //10 chars max - sex = "m"; //1 chars max - - idfide = 0; //8 chars max - ratingfide = 0; //4 chars max - - idnat = 0; //8 chars max - ratingnat = 0; //4 chars max - kcoeff = 0; //3 chars max - - title = 0; // int corrispondent to codetitleused during pairing - codetitle = "--"; // used during pairing, max 3 chars (GM, WGM, IM, ecc... -// status - isAvailable = "1"; //0=out, null=get the bye - only for swiss, 1=play - // for VEGA system : aro = BUCHOLZ - int RATING = 0; // real rating used for pairing and printed in the output (it is useful when .rating is used for something else) - // it depends by the FIDE flag - - tiebreak[SCORE] = 0.; -} diff --git a/uppdev/VegaTeam5/Tournament.h b/uppdev/VegaTeam5/Tournament.h deleted file mode 100644 index ec5b35970..000000000 --- a/uppdev/VegaTeam5/Tournament.h +++ /dev/null @@ -1,235 +0,0 @@ -// here we have specific tournament data -#ifndef _Tournament_h_ -#define _Tournament_h_ - -#define VERSION "VegaTeam 5.0.1 U++ version" -#define N_ROUND_MAX 21 -#define N_PLAYER_MAX 999 -#define N_ROUND_MAX_RR 46 -#define N_PLAYER_MAX_RR 24 -#define N_COL 13 -#define FUNC_CMP 12 -#define MAXDIM 200 // Max number of nodes in a graph -#define MAX_BOARDS 8 // Max number of boards, i.e. players per team - -#define N_PLAYER_MAX_TRUE 960 // N_PLAYER_MAX*8 -#define N_PLAYER_MAX_TRUE_RR 192 // N_PLAYER_MAX_RR*8 - -enum{ DUBOV=1, ROUND_ROBIN, VEGA, USCF, ROUND_ROBIN2, BURST, LIM}; // avalaible play system -enum{ SCORE=0, ARO, SONN_BERG, BUC_CUT1, BUC_MED, BUC_TOT, CUMUL, ELO_VAR, MOST_BLACKS, MOST_WINS, PER_RAT, APRO, MPSS}; -enum{ BLACK=0, WHITE}; //useful in list operation -enum{ BLACK_COLOR=-1, NO_COLOR, WHITE_COLOR}; //useful in color allocation -enum {GM=0, IM, WGM, WIM}; -enum {READY_FOR_PAIRING, READY_FOR_INSERTION}; //STATUSROUND values - -////// class Tournament //////////////// -class TournamentStatus { -public: - String NAMETORNEO; // max 40 chars - String FILETORNEO; // max 8 chars - String PLACETORNEO; // max 40 chars - String HOSTFEDERATION; // max 3 chars - String DATATORNEO_B; // max 10 chars - String DATATORNEO_E; // max 10 chars - String ARBITER; // max 40 chars - String PATHDIR, PATHDIRWWW, PATHVEGAPRG, PATHDIRDB, USER_REGISTERED; - String LANGUAGE; //useful for menu in different language - double WON, DRAW; - int tyebreakorder[FUNC_CMP+1]; - String tyebreakname[FUNC_CMP+1]; - int NPlayer; // player partecipating to the tournament - int NAval; - int NRounds, NBoards, SCORE_TYPE; // rounds of the tournament - int NAccRound; - int currentRound; - int MAX_PLAYERS; - int PLAY_SYSTEM, STATUS_ROUND; - bool IS_DONE_MANUAL, IS_TORNEO_STARTED, IS_VEG_SAVED, NEW_TORNEO, DROP_PLAYER, - IS_CLOSED_REGISTRATION, IS_SAVED_ROUND, AVOID_SAME_COUNTRY, - IS_SET_VERBOSE, IS_FIDE_TOURNAMENT, PERMIT3COLOR, LIMIT_FLOATER, IS_SWISS; - TournamentStatus(); - ~TournamentStatus(){;} -}; - - -////// class RoundRobinTournament derived from class Tournament //////////////// -class RoundData : public TournamentStatus { -public: - int countnodes, nodes[MAXDIM+1]; // useful for ForlanoScoreSystem - // ROUND ROBIN - // pairing and result. pairing[0][r] is the number of pairs at the round r - int pairingRR[N_PLAYER_MAX_RR/2+2][N_ROUND_MAX_RR+1]; - int pairingTRUE[ N_PLAYER_MAX_TRUE/2+2][N_ROUND_MAX+1]; - int roundResultRR[N_PLAYER_MAX_RR+1][N_ROUND_MAX_RR+1]; - int roundTRUEResult[N_PLAYER_MAX_TRUE+1][N_ROUND_MAX+1]; //remind the players result - int playerColorRR[N_PLAYER_MAX_RR+1][N_ROUND_MAX_RR+1]; - int playerOpponentRR[N_PLAYER_MAX_RR+1][N_ROUND_MAX_RR+1]; - int playerTRUEOpponent[N_PLAYER_MAX_TRUE+1][N_ROUND_MAX+1]; - float teamScore[N_PLAYER_MAX+1][N_ROUND_MAX+1]; // remind the match score - // SWISS SYSTEM - // pairing and result. pairing[0][r] is the number of pairs at the round r - float ScoreGroup[N_ROUND_MAX*4 + 1]; - int playerFloater[N_PLAYER_MAX+1][N_ROUND_MAX+1]; - int pairing[N_PLAYER_MAX/2+1][N_ROUND_MAX+1]; - int pairingTRUERR[N_PLAYER_MAX_TRUE_RR/2+2][N_ROUND_MAX_RR+1]; - int roundResult[N_PLAYER_MAX+1][N_ROUND_MAX+1]; //remind the code result - int roundTRUEResultRR[N_PLAYER_MAX_TRUE_RR+1][N_ROUND_MAX_RR+1]; //remind the players result - int playerColor[N_PLAYER_MAX+1][N_ROUND_MAX+1]; - int playerOpponent[N_PLAYER_MAX+1][N_ROUND_MAX+1]; - int playerTRUEOpponentRR[N_PLAYER_MAX_TRUE_RR+1][N_ROUND_MAX_RR+1]; - float teamScoreRR[N_PLAYER_MAX_RR+1][N_ROUND_MAX_RR+1]; // remind the match score - - RoundData(); - ~RoundData(){;} - //general function - void SaveVegFile(bool flag); - void Reset(); - void StartSystem(int play_system); - void DecodeResult(int const code, int *idwhite, int *idblack, int *res); - int CodifyResult(int idwhite, int idblack, int res); - void SetPlayersResult(int round); -// void PrepareHTMLindex(void); - void ShowTableScore(int nplayers); - void ShowTableCategoryScore(int nplayers); - void ShowRoundCard2(int round); - void ShowRoundCard3(int round); - void SavePairsResultFile(int round); - void SavePairsFile(int round); - void DeleteRound(int fromround, int toround); - void setAPRO(int round, int numberPlayer); - String LabelResult(int result, int code, int round); - String LabelResultNonStandard(int idw, int idb, int round); - String HTMLCommonHeader(); - String HTMLNavBar(); - void ShowTableStatHTML(); - //Round Robin specific methods - void PrepareRRPairing(int nplayer); - int GenerateRRCalendar(int nplayer, int pairs[][N_ROUND_MAX_RR+1]); - void SaveRoundRR(int round); - void LoadRoundRR(String filename); - void AdjournCrossTableRR(int round); - void CrossTableRoundRobin(int nplayers); - void RoundRobinCalendar(); -//Swiss specific methods - void SaveRound(int round); - void LoadRound(String filename); - void AdjournCrossTableSwiss(int round); - void CrossTableSwiss(); - int MakeNextPairing(); - void DoFirstRound(); - void AdjournPlayerState(int round); - int AssignColor(int id1, int id2, int round); - int AssignColorLIM(int id1, int id2, int round); - void VerifyColor(int round); - void Floyd(int l[MAXDIM+1][MAXDIM+1], int d[MAXDIM+1][MAXDIM+1], int n); - void Path1(int d[MAXDIM+1][MAXDIM+1], int n, int i, int j); - void Path(int d[MAXDIM+1][MAXDIM+1], int n, int i, int j); - void ForlanoScoreSystem(int m); -//National stuff - void NationalPlayerCard(int nplayers); - void NationalPlayerCardHTML(int nplayers); - void calcelo (int idp, double arrp[][2], int round); - void SaveFSIRatingReport(); - void TestResult(int res, int code[]); - void ConvertUSCFDB(); -//FIDE stuff - void ShowTableStat(); - void FidePlayerCard(); - void SortedCross(int nplayers, int flag); - void FideEloVariation(int nplayers); - void FideEloVariationHTML(); - void FindNorm(); - int CalculatePlayerNorm(int i, int typenorm, int arrrating[]); - void calceloFIDE(int idp, double arrp[][2], int round); - void EloForesee(int nplayers, int round); - void CalcVarElo(int nplayers); -}; - -///// class Team /////////////////////// -class PlayerArchive : Moveable { -public: -// anagraphic - String name; //25 chars max - String country; //3 chars max - String data; //10 chars max - String sex; //1 chars max - - int idfide; //8 chars max - int ratingfide; //4 chars max - - int idnat; //8 chars max - int ratingnat; //4 chars max - int kcoeff; //3 chars max - - int title; // int corrispondent to codetitle used during pairing - String codetitle; // used during pairing, max 3 chars (GM, WGM, IM, ecc... -// status - String isAvailable; //"0"=out, Null=get the bye - only for swiss, "1"=play - - int RATING; // real rating used for pairing and printed in the output - // it depends by the FIDE flag - - float tiebreak[N_COL]; //contains the score for each tiebreak - - //int TitleToCode(); // set title corrispondent to codetitle - used during pairing - - PlayerArchive(); - ~PlayerArchive(){;} -}; - -///// class Team /////////////////////// -class TeamArchive : Moveable { -public: -// anagraphic - String name; //25 chars max - String country; //15 chars max - String data; //10 chars max - String origin; //15 chars max - String sex; //1 chars max - - int idfide; //8 chars max - int ratingfide; //4 chars max - - int idnat; //8 chars max - int ratingnat; //4 chars max - int kcoeff; //3 chars max - - int title; // int corrispondent to codetitle used during pairing - String codetitle; // used during pairing, max 3 chars (GM, WGM, IM, ecc... -// status - String isAvailable; //"0"=out, Null=get the bye - only for swiss, "1"=play - -// pairing data - int rating; // for DUBOV SYSTEM : rating = RATING, - // for VEGA system : rating = BUCHOLZ - float aro; // for DUBOV system : aro = ARO - // for VEGA system : aro = BUCHOLZ - int RATING; // real rating used for pairing and printed in the output - // (it is useful when .rating is used for something else) - // it depends by the FIDE flag - - // player state useful for swiss system - int duecolor; - bool canChangeDuecolor; - int currentDuecolor; - int colorDiff; - int colorCons; - int scoreGroup; - int currentGroup; - bool canUpfloat; // 0 if cannot upfloat, 1 otherwise //int canDownfloat; // 0 if cannot upfloat, 1 otherwise - int canGetBYE; - bool isAlreadyTested; - float tiebreak[N_COL]; //contains the score for each tiebreak - - int TitleToCode(); // set title corrispondent to codetitle - used during pairing - PlayerArchive plr[MAX_BOARDS]; - - TeamArchive(); - ~TeamArchive(){;} -}; - - -extern RoundData TD; -extern TeamArchive player[N_PLAYER_MAX+1]; -extern VectorMap db; -#endif diff --git a/uppdev/VegaTeam5/TwoCtrl.cpp b/uppdev/VegaTeam5/TwoCtrl.cpp deleted file mode 100644 index cfa823e49..000000000 --- a/uppdev/VegaTeam5/TwoCtrl.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include "VegaMain.h" - -//this might be needed... -Ctrl2::Ctrl2() -{ - edit.SetRect(0,0,20,19); - button.SetRect(15,0,30,19); - Add(edit); - Add(button); -} diff --git a/uppdev/VegaTeam5/TwoCtrl.h b/uppdev/VegaTeam5/TwoCtrl.h deleted file mode 100644 index cc1bfbe09..000000000 --- a/uppdev/VegaTeam5/TwoCtrl.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef _ForlanoVega_TwoCtrl_h_ -#define _ForlanoVega_TwoCtrl_h_ - -#include - -class Ctrl2 : public ParentCtrl { - EditField edit; - Button button; -public: - typedef Ctrl2 CLASSNAME; - Ctrl2(); - ~Ctrl2() {;} -}; -#endif diff --git a/uppdev/VegaTeam5/USCFreport.cpp b/uppdev/VegaTeam5/USCFreport.cpp deleted file mode 100644 index 0870f7f31..000000000 --- a/uppdev/VegaTeam5/USCFreport.cpp +++ /dev/null @@ -1,545 +0,0 @@ -#include "VegaMain.h" -#include "Tournament.h" - -////////////////// SECTION USCF Rating report //////////////////////////////// - -USCFSectionReport::USCFSectionReport() -{ String str; - CtrlLayout(*this, ""); - - edit0 <<= TD.NAMETORNEO; - edit0.Tip("optional\n(can be empty)"); - - edit1 <<= "F"; - edit1.Add("F"); - edit1.Add("H"); - edit1.Add("Q"); - edit1.Tip("F full\nH half\nQ quick"); - - edit2 <<= "R"; - edit2.Add("R"); - edit2.Add("D"); - edit2.Add("Q"); - edit2.Tip("R regular\nD dual\nQ quick"); - - edit3 <<= ""; - edit3.Tip("optional\n(can be empty)"); - - edit4 <<= ""; - edit4.Tip("optional\n(can be empty)"); - - if (TD.PLAY_SYSTEM==ROUND_ROBIN ) str = "R"; -// else if (PLAY_SYSTEM==ROUND_ROBIN2) strcpy(str, "D"); - else str = "S"; - edit5 <<= str; - edit5.Add("S"); - edit5.Add("M"); - edit5.Add("R"); - edit5.Add("C"); - edit5.Tip("S swiss system\nM match\nR round robin\nC cum swiss"); - - edit6 <<= AsString(TD.currentRound); - edit6.Disable(); - - edit7 <<= AsString(TD.NPlayer); - edit7.Disable(); - - edit8 <<= "VC"; - edit8.Disable(); - - edit9 <<= "#"; - edit9.Disable(); - - btnClose <<= THISBACK(Close); - btnDone <<= THISBACK(DoneCB); -} - - -void USCFSectionReport::DoneCB() -{ int i, j, index, rec_seq=1; - String stringa; - int *roundRes; -// short int *playerCol; - int *playerOpp; - - FileOut out(TD.PATHDIR + "uscfsctn.txt"); - - out << NFormat("%d %d\n", TD.NPlayer, TD.currentRound); - - // section file record - out << NFormat("%s\t", AsString(~edit0)); - out << NFormat("%s\t", AsString(~edit1)); - out << NFormat("%s\t", AsString(~edit2)); - out << NFormat("%s\t", AsString(~edit3)); - out << NFormat("%s\t", AsString(~edit4)); - out << NFormat("%s\t", AsString(~edit5)); - out << NFormat("%s\t", AsString(~edit6)); - out << NFormat("%s\t", AsString(~edit7)); - out << "???????\t"; - out << NFormat("%s\t", AsString(~edit8)); - out << NFormat("%s\t", AsString(~edit9)); - out << "\n"; // close the section record - - // detail file records - if (TD.IS_SWISS) { - playerOpp = &TD.playerOpponent[0][0]; - roundRes = &TD.roundResult[0][0]; - } - else { playerOpp = &TD.playerOpponentRR[0][0]; - roundRes = &TD.roundResultRR[0][0]; - } - - if (TD.currentRound>10) rec_seq=2; - for (i=1; i<=TD.NPlayer; i++) - { - out << NFormat("\t%d\t%d\t%d", i, rec_seq, player[i].idnat); - for(j=1; j<=TD.currentRound; j++) - { if (TD.IS_SWISS) index = i*(N_ROUND_MAX+1) + j; - else index = i*(N_ROUND_MAX_RR+1) + j; - - if (playerOpp[index]==0 && roundRes[index]==3) { //BYE: 1F - 0 - out << "\tB 0"; - } - else if (playerOpp[index]==0 && roundRes[index]==4) { //lost unplayed game: BYE: 0 - 1F - out << "\tF 0"; - } - else if (playerOpp[index]==0 && (roundRes[index]==6 || roundRes[index]==8)) { //for BYE: XF - out << "\tH 0"; - } - else if (playerOpp[index]!=0 ) { - if (roundRes[index]==0) out << NFormat("\tL%4d", playerOpp[index]); - else if (roundRes[index]==4) out << "\tF 0"; - else if (roundRes[index]==1) out << NFormat("\tW%4d", playerOpp[index]); - else if (roundRes[index]==3) out << "\tX 0"; - else if (roundRes[index]==2) out << NFormat( "\tD%4d", playerOpp[index]); - else if (roundRes[index]==6 || roundRes[index]==8) out << "\tZ 0"; - } - else out << "\tU 0"; //default case: unplayed - } - out << "\n"; - } - out.Close(); - Close(); -} -////////////////// TOURNAMENT USCF Rating report collect sections //////////////////////////////// - -USCFReport::USCFReport() -{ - CtrlLayout(*this, "Tournament Report"); - Ndirectory = max_rounds = 0; - - btnOpen.Tip("Read the list of the sections"); - btnSave.Tip("Save the list of the sections"); - btnAdd.Tip("Select a tournament section"); - btnRemove.Tip("Remove the selected section"); - - btnAdd.WhenAction = THISBACK(AddCB); - btnRemove.WhenAction = THISBACK(RemoveCB); - btnOpen.WhenAction = THISBACK(OpenFileCB); - btnSave.WhenAction = THISBACK(SaveFileCB); - btnClose.WhenAction = THISBACK(Close); - btnDone.WhenAction = THISBACK(DoneCB); -} - - -void USCFReport::OpenFileCB() -{ String line, name; - int i; - -#ifdef PLATFORM_WIN32 - name = TD.PATHVEGAPRG + "\\" + "savedpath.txt"; -#endif -#ifdef PLATFORM_POSIX - name = TD.PATHVEGAPRG + "/" + "savedpath.txt"; -#endif - - FileIn in(name); - if (in) { - list.Clear(); - line = in.GetLine(); - Ndirectory = StrIntValue(line); - for(i=1; i<=Ndirectory; i++) - { line = in.GetLine(); - list.Add(line); - } - in.Close(); - } - else Exclamation("I can't read the file"); -} - -void USCFReport::SaveFileCB() -{ String name; - int i; - - if (Ndirectory<1) { - Exclamation("There aren't Sections to save"); - return; // nothing to retrive - } - -#ifdef PLATFORM_WIN32 - name = TD.PATHVEGAPRG + "\\" + "savedpath.txt"; -#endif -#ifdef PLATFORM_POSIX - name = TD.PATHVEGAPRG + "/" + "savedpath.txt"; -#endif - - FileOut out(name); - out << Ndirectory << "\n"; - for(i=1; i<=Ndirectory; i++) out << AsString( list.Get(i-1) ) << "\n"; - out.Close(); -} - -void USCFReport::RemoveCB() -{ - int ans, i=list.GetCursor(); - - if (Ndirectory < 1 || i < 0) return; - ans = PromptYesNo("Do you want to remove the selected section?"); - if (ans == 1 ) list.Remove( i ); - Ndirectory--; -} - - -void USCFReport::AddCB() -{ String stringa, directory; - FileSel fs; - if (Ndirectory) fs.dir <<= AsString(list.Get(Ndirectory - 1)); //start with the last directory - fs.ExecuteSelectDir(); - directory = ~fs; - if ( !IsNull(directory) ) { - list.Add(directory); - Ndirectory++; - } - else Exclamation( t_("You have not selected a directory")); -} - -void USCFReport::DoneCB() -{ String s, str, name, stringa; - int i, n, rounds; - String bdate, edate, listfile[20]; - - // Ndirectory = list.GetColumnItems(); - if (Ndirectory<1) - { Exclamation("Please select at least one section!"); - return; - } - for(i=1; i<=Ndirectory; i++) { // legge i file dei singoli tornei -#ifdef PLATFORM_WIN32 - name = AsString(list.Get(i-1)) + "\\" + "uscfsctn.txt"; -#endif -#ifdef PLATFORM_POSIX - name = AsString(list.Get(i-1)) + "/" + "uscfsctn.txt"; -#endif - listfile[i] = name; // remind the section files - - FileIn in(name); - if (in) { - Vector field = Split( in.GetLine(), ' ', true); - n = StrIntValue(field[0]); - rounds = StrIntValue(field[1]); - if (rounds>max_rounds) max_rounds=rounds; - in.Close(); - } - else Exclamation("I can't read the &" + name + " &Please generate it"); - } - Close(); - USCFTournamentReport USCFreport(Ndirectory, max_rounds, listfile); - USCFreport.Execute(); -} - -////////////////// TOURNAMENT USCF Rating report generator //////////////////////////////// - - -USCFTournamentReport::USCFTournamentReport(int SectionNumber, int max_r, String listfile[]) -{ int i; - CtrlLayout(*this, ""); - Ndirectory = SectionNumber; - max_rounds = max_r; - String str, strdate; - - for (i=1; i<=SectionNumber; i++) filesection[i] = listfile[i]; - - edit0.AutoFormat(false); - edit0.Tip("enter Year, Month and Day:\nyymmdd (six digit!)"); - edit2 <<= Ndirectory; - edit3.Tip("yyyymmdd"); - edit4.Tip("yyyymmdd"); - edit5 <<= 0; - edit9 <<= "USA"; - - edit10 <<= "T"; - edit10.Add("T"); - edit10.Add("A"); - edit10.Add("N"); - edit10.Tip("T tournament director\nA affiliate\nN do not send cross tables"); - - edit11 <<= "N"; - edit11.Add("Y"); - edit11.Add("N"); - edit11.Tip("Y scholastic\nN non scholastic"); - - btnDone.WhenAction = THISBACK(DoneCB); - btnClose.WhenAction = THISBACK(Close); -} - - -void USCFTournamentReport::DoneCB() -{ int i, j, n, rounds, k, S_DTLREC01=1; - String bdate, edate, stringa, s, f1; - String currdir, string; - -#ifdef PLATFORM_WIN32 - currdir = TD.PATHVEGAPRG + "\\"; -#endif -#ifdef PLATFORM_POSIX - currdir = TD.PATHVEGAPRG + "/"; -#endif - - FileOut out(currdir + "thexport.txt"); - if (out.IsError()) - { Exclamation("Cannot save the Tournament Header File"); - return; - } -/* -H_EVENT_ID,C,9 yymmddccc -H_NAME,C,35 -H_TOT_SECT,N,2,0 # sections -H_BEG_DATE,D MM/DD/YYYY -H_END_DATE,D MM/DD/YYYY -H_RCV_DATE,D N/A -H_ENT_DATE,D N/A -H_AFF_ID,C,8 affiliate -H_CITY,C,21 -H_STATE,C,2 -H_ZIPCODE,C,10 nnnnn or nnnnn-nnnn -H_COUNTRY,C,21 "USA" (optional?) -H_SENDCROS,C,1 T, A, N (TD, Aff, none) -H_SCHOLAST,C,1 Y, N (scholastic, non) -H_SECREC01,N,7,0 "1" section record number if more than one event -*/ - - out << "15\n"; - out << "H_EVENT_ID C 9\n"; - out << "H_NAME C 35\n"; - out << "H_TOT_SECT N 2\n"; - out << "H_BEG_DATE D 8\n"; - out << "H_END_DATE D 8\n"; - out << "H_RCV_DATE D 8\n"; - out << "H_ENT_DATE D 8\n"; - out << "H_AFF_ID C 8\n"; - out << "H_CITY C 21\n"; - out << "H_STATE C 2\n"; - out << "H_ZIPCODE C 10\n"; - out << "H_COUNTRY C 21\n"; - out << "H_SENDCROS C 1\n"; - out << "H_SCHOLAST C 1\n"; - out << "H_SECREC01 N 7\n"; - - string = NFormat("%06d", StrIntValue(AsString( ~edit0 ))); - if ( string.GetLength() < 6) { - Exclamation( "Please fills the Event ID field with 6 digits" ); - out.Close(); - return; - } else out << string + "001\t"; - - string = TrimLeft(AsString(~edit1)); - if ( string.GetLength() < 1) { - Exclamation( "There can't be empty fields!&Please fill all fields with some value"); - out.Close(); - return; - } else out << string + "\t"; - - string = TrimLeft(AsString(~edit2)); - if ( string.GetLength() < 1) { - Exclamation( "There can't be empty fields!&Please fill all fields with some value"); - out.Close(); - return; - } else out << string + "\t"; - - string = TrimLeft(AsString(~edit3)); - if ( string.GetLength() < 8) { - Exclamation( "Set a correct begin date"); - out.Close(); - return; - } else out << string + "\t"; - - string = TrimLeft(AsString(~edit4)); - if ( string.GetLength() < 8) { - Exclamation( "Set a correct end date"); - out.Close(); - return; - } else out << string + "\t"; - - out << "\t\t"; // RCV_DATE e ENT_DATE - - string = TrimLeft(AsString(~edit5)); - if ( string.GetLength() < 1) { - Exclamation( "There can't be empty fields!&Please fill all fields with some value"); - out.Close(); - return; - } else out << string + "\t"; - - string = TrimLeft(AsString(~edit6)); - if ( string.GetLength() < 1) { - Exclamation( "There can't be empty fields!&Please fill all fields with some value"); - out.Close(); - return; - } else out << string + "\t"; - - string = TrimLeft(AsString(~edit7)); - if ( string.GetLength() < 1) { - Exclamation( "There can't be empty fields!&Please fill all fields with some value"); - out.Close(); - return; - } else out << string + "\t"; - - string = TrimLeft(AsString(~edit8)); - if ( string.GetLength() < 1) { - Exclamation( "There can't be empty fields!&Please fill all fields with some value"); - out.Close(); - return; - } else out << string + "\t"; - - string = TrimLeft(AsString(~edit9)); - if ( string.GetLength() < 1) { - Exclamation( "There can't be empty fields!&Please fill all fields with some value"); - out.Close(); - return; - } else out << string + "\t"; - - string = AsString(~edit10); - out << string + "\t"; - - string = AsString(~edit11); - out << string + "\t"; - - out << "1\n"; //SECREC01 - out.Close(); - - // generate Tournament Section File -/* -S_EVENT_ID,C,9 same as H_EVENT_ID -S_SEC_NUM,C,2 1-n -S_SEC_NAME,C,10 (optional) -S_K_FACTOR,C,1 F, Q (full, quick) ### test H (half) -S_R_SYSTEM,C,1 R, Q (regular, quick) ### test D (dual) -S_CTD_ID,C,8 (optional) -S_ATD_ID,C,8 (optional) -S_TRN_TYPE,C,1 S, R, M, C (swiss, round robin, match, cum swiss) -S_TOT_RNDS,N,2,0 Max 20. For R, enter # players -S_LST_PAIR,N,4,0 Last pairing number for section -S_DTLREC01,N,7,0 "1" for section 1, previous section's S_LST_PAIR + S_DTLREC01 -S_OPER,C,2 XX (disk) ### test UU (??) -S_STATUS,C,1 "#" -*/ - - out.Open(currdir + "tsexport.txt"); - if (out.IsError()) - { Exclamation("Cannot save the Tournament Section File"); - return; - } - out << "13\n"; - out << "S_EVENT_ID C 9\n"; - out << "S_SEC_NUM C 2\n"; - out << "S_SEC_NAME C 10\n"; - out << "S_K_FACTOR C 1\n"; - out << "S_R_SYSTEM C 1\n"; - out << "S_CTD_ID C 8\n"; - out << "S_ATD_ID C 8\n"; - out << "S_TRN_TYPE C 1\n"; - out << "S_TOT_RNDS N 2\n"; - out << "S_LST_PAIR N 4\n"; - out << "S_DTLREC01 N 7\n"; - out << "S_OPER C 2\n"; - out << "S_STATUS C 1\n"; - - for(i=1; i<=Ndirectory; i++) { - String s, s1, s2, sss; - int l, lsss; - FileIn in(filesection[i]); - if (in) { - Vector field = Split( in.GetLine(), ' ', true); - n = StrIntValue(field[0]); - rounds = StrIntValue(field[1]); - sss = in.GetLine(); - lsss = sss.GetLength(); - l = sss.Find("???????"); - s1 = sss.Mid(0,l); - s2 = sss.Mid(l+7,lsss-l+7); - - s = NFormat("%s%d%s", s1, S_DTLREC01, s2); // remove '???????' - out << NFormat("%s001\t%d\t", NFormat("%06d", StrIntValue(AsString( ~edit0 ))), i); - out << s + "\n"; - - in.Close(); - S_DTLREC01 += n; - } - else { Exclamation("I can't read the uscfsctn.txt file"); - return; - } - } - out.Close(); - - // generate Tournament Detail File - -/* -D_EVENT_ID,C,9 same as H_EVENT_ID -D_SEC_NUM,C,2 -D_PAIR_NUM,C,4 1-n -D_REC_SEQ,C,1 if rds 1-10 "1", 11-20 "2" -D_MEM_ID,C,8 (optional) -D_RND01,C,5 W=win D=draw L=loss -D_RND02,C,5 X= Forfeit win Z= Forfeit draw F= forfeit loss -D_RND03,C,5 B= 1 pt bye H= 1/2 pt bye U= unplayed game -D_RND04,C,5 Cnnnn, where n is pair num left-padded with space -D_RND05,C,5 Unplayed C...0 -D_RND06,C,5 No round ....0 -D_RND07,C,5 (all optional) -D_RND08,C,5 -D_RND09,C,5 -D_RND10,C,5 -*/ - - stringa = currdir + "tdexport.txt"; - out.Open(stringa); - if (out.IsError()) - { Exclamation("Cannot save the Tournament Detail File"); - return; - } - out << 5 + max_rounds << "\n"; - out << "D_EVENT_ID C 9\n"; - out << "D_SEC_NUM C 2\n"; - out << "D_PAIR_NUM C 4\n"; - out << "D_REC_SEQ C 1\n"; - out << "D_MEM_ID C 8\n"; - for (k=1; k<=max_rounds; k++) out << NFormat("D_RND%02d C 5\n", k); - - for(i=1; i<=Ndirectory; i++) { - //stringa = PATHDIR[i] + "uscfsctn.txt"; //built the whole file name - FileIn in(filesection[i]); - if ( in ) { - Vector field = Split( in.GetLine(), ' ', true); - n = StrIntValue(field[0]); - rounds = StrIntValue(field[1]); - in.GetLine(); // skip second row - for (j=1; j<=n; j++) { - out << NFormat("%06d", StrIntValue(AsString( ~edit0 ))) + "001\t" ; - //TrimLeft(AsString(~edit0)) + "001\t"; - out << i; - s = in.GetLine(); - out << s; - for (k=rounds+1; k<=max_rounds; k++) out << "\t 0"; - out << "\n"; - } - in.Close(); - } - else { Exclamation("I can't read the uscfsctn.txt file"); - return; - } - } - out.Close(); - - f1 = currdir + "convert.exe"; - system(f1); - Close(); -} diff --git a/uppdev/VegaTeam5/Vega.iml b/uppdev/VegaTeam5/Vega.iml deleted file mode 100644 index 65c68c450..000000000 --- a/uppdev/VegaTeam5/Vega.iml +++ /dev/null @@ -1,764 +0,0 @@ -IMAGE_BEGIN(imgMaybe) - IMAGE_SCAN("\0\377\377") - IMAGE_SCAN("\0\377\377\0\0\0\377\377") - IMAGE_SCAN("\0\377\377\0\0\0\377\377") - IMAGE_SCAN("\0\377\377\0\0\0\377\377\0\0\0\377\377") - IMAGE_SCAN("\0\377\377\0\0\0\377\377\0\0\0\377\377") - IMAGE_SCAN("\0\377\377\0\0\0\377\377\0\0\0\377\377") - IMAGE_SCAN("\0\377\377\0\0\0\377\377") - IMAGE_SCAN("\0\377\377\0\0\0\377\377") - IMAGE_SCAN("\0\377\377\0\0\0\377\377\0\0\1\0\377\377") - IMAGE_SCAN("\0\377\377\0\0\0\377\377\0\0\1\0\377\377") - IMAGE_SCAN("\0\377\377\0\0\0\377\377\0\0\1\0\377\377") - IMAGE_SCAN("\0\377\377\0\0\0\377\377") - IMAGE_SCAN("\0\377\377\0\0\0\377\377") - IMAGE_SCAN("\0\377\377") -IMAGE_PACKED(imgMaybe, "\2\16\0\0\0\16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(imgNo) - IMAGE_SCAN("\0\0") - IMAGE_SCAN("\1\0\0\377\377\377\1\0\0") - IMAGE_SCAN("\2\0\0\377\377\377\0\0\377\377\377\377\0\0\377\1\377\377\377\1\0\0") - IMAGE_SCAN("\2\0\0\377\377\377\0\0\377\377\377\377\0\0\377\1\377\377\377\1\0\0") - IMAGE_SCAN("\2\0\0\377\377\377\0\0\377\1\377\377\377\1\0\0") - IMAGE_SCAN("\1\0\0\377\377\377\0\0\377\377\377\377\1\0\0") - IMAGE_SCAN("\1\0\0\377\377\377\0\0\377\377\377\377\1\0\0") - IMAGE_SCAN("\1\0\0\377\377\377\0\0\377\377\377\377\1\0\0") - IMAGE_SCAN("\1\0\0\377\377\377\0\0\377\377\377\377\1\0\0") - IMAGE_SCAN("\2\0\0\377\377\377\0\0\377\1\377\377\377\1\0\0") - IMAGE_SCAN("\2\0\0\377\377\377\0\0\377\377\377\377\0\0\377\1\377\377\377\1\0\0") - IMAGE_SCAN("\2\0\0\377\377\377\0\0\377\377\377\377\0\0\377\1\377\377\377\1\0\0") - IMAGE_SCAN("\1\0\0\377\377\377\1\0\0") - IMAGE_SCAN("\0\0") -IMAGE_PACKED(imgNo, "\2\16\0\0\0\16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(imgYes) - IMAGE_SCAN("\0\0") - IMAGE_SCAN("\1\0\0\377\377\377\1\0\0") - IMAGE_SCAN("\1\0\0\377\377\377\1\0\0") - IMAGE_SCAN("\1\0\0\377\377\377\1\0\0") - IMAGE_SCAN("\1\0\0\377\377\377\1\0\0") - IMAGE_SCAN("\1\0\0\377\377\377\1\0\0") - IMAGE_SCAN("\1\0\0\377\377\377\1\0\0") - IMAGE_SCAN("\1\0\0\377\377\377\1\0\0") - IMAGE_SCAN("\1\0\0\377\377\377\1\0\0") - IMAGE_SCAN("\1\0\0\377\377\377\1\0\0") - IMAGE_SCAN("\1\0\0\377\377\377\1\0\0") - IMAGE_SCAN("\1\0\0\377\377\377\1\0\0") - IMAGE_SCAN("\1\0\0\377\377\377\1\0\0") - IMAGE_SCAN("\0\0") -IMAGE_PACKED(imgYes, "\2\16\0\0\0\16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(newTourn) - IMAGE_SCAN("\377\377\377") - IMAGE_SCAN("\1\377\377\377\0\0\0\1\377\377\377") - IMAGE_SCAN("\2\377\377\377\0\0\0\377\377\377\0\0\0\377\377\377\1\0\0\0\1\377\377\377") - IMAGE_SCAN("\2\377\377\377\0\0\0\377\377\377\3\0\0\0\377\377\377\0\0\0\377\377\377\1\0\0\0\1\377\377\377") - IMAGE_SCAN("\4\377\377\377\0\0\0\377\377\377\0\0\0\377\377\377\1\0\0\0\377\377\377\1\0\0\0\1\377\377\377") - IMAGE_SCAN("\1\377\377\377\0\0\0\377\377\377\1\0\0\0\377\377\377\1\0\0\0\1\377\377\377") - IMAGE_SCAN("\1\377\377\377\0\0\0\377\377\377\1\0\0\0\1\377\377\377") - IMAGE_SCAN("\2\377\377\377\0\0\0\377\377\377\1\0\0\0\1\377\377\377") - IMAGE_SCAN("\2\377\377\377\0\0\0\377\377\377\1\0\0\0\1\377\377\377") - IMAGE_SCAN("\2\377\377\377\0\0\0\377\377\377\1\0\0\0\1\377\377\377") - IMAGE_SCAN("\2\377\377\377\0\0\0\377\377\377\1\0\0\0\1\377\377\377") - IMAGE_SCAN("\2\377\377\377\0\0\0\377\377\377\1\0\0\0\1\377\377\377") - IMAGE_SCAN("\1\377\377\377\0\0\0\1\377\377\377") - IMAGE_SCAN("\377\377\377") -IMAGE_PACKED(newTourn, "\2\16\0\0\0\16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(printsel) - IMAGE_SCAN("\377\377\377") - IMAGE_SCAN("\1\377\377\377\377\0\0\1\377\377\377") - IMAGE_SCAN("\377\377\377") - IMAGE_SCAN("\1\377\377\377\377\0\0\1\377\377\377") - IMAGE_SCAN("\377\377\377") - IMAGE_SCAN("\0\0\0") - IMAGE_SCAN("\1\0\0\0\0\377\377\1\0\0\0") - IMAGE_SCAN("\0\0\0") - IMAGE_SCAN("\1\0\0\0\0\377\377\1\0\0\0") - IMAGE_SCAN("\0\0\0") - IMAGE_SCAN("\377\377\377") - IMAGE_SCAN("\1\377\377\377\377\0\0\1\377\377\377") - IMAGE_SCAN("\377\377\377") - IMAGE_SCAN("\1\377\377\377\377\0\0\1\377\377\377") -IMAGE_PACKED(printsel, "\2\16\0\0\0\16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(registered) - IMAGE_SCAN("Ã\0\0\377\0\0") - IMAGE_SCAN("„\0\0\377\0\0\1\0\0\0") - IMAGE_SCAN("\2\0\0\377\377\377\377\0\0\377\1\0\0\377\377\377\0\0\1\0\0\0") - IMAGE_SCAN("\0\0\377\1\0\0\377\377\377\0\0\1\0\0\0") - IMAGE_SCAN("‚\0\0\377\0\0\1\0\0\0") - IMAGE_SCAN("Â\0\0\377\0\0\1\0\0\0") - IMAGE_SCAN("Ă\0\0\377\0\0\1\0\0\0") - IMAGE_SCAN("Ă\0\0\377\0\0\1\0\0\0") - IMAGE_SCAN("Â\0\0\377\0\0\0\0\0") - IMAGE_SCAN("Â\0\0\377\2\0\0\377\377\377\0\0\1\0\0\0") - IMAGE_SCAN("\2\0\0\377\0\0\377\377\377\0\0\0\0\0") - IMAGE_SCAN("‚\0\0\377\2\0\0\377\377\377\0\0\1\0\0\0") - IMAGE_SCAN("\0\0\377\1\0\0\377\377\377\0\0\0\0\0") - IMAGE_SCAN("\0\0\377\0\0\1\0\0\0") -IMAGE_PACKED(registered, "\2\16\0\0\0\16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(bu) - IMAGE_SCAN("\0\0") - IMAGE_SCAN("\0\0\0\0\0\0\0") - IMAGE_SCAN("\1\0\0\0\0\0\0\377\377\0\0\0\1\0\0") - IMAGE_SCAN("\1\0\0\0\0\0\0\377\377\0\0\0\1\0\0") - IMAGE_SCAN("\1\0\0\0\0\0\0\377\377\0\0\0\0\377\377\0\0\0\1\0\0") - IMAGE_SCAN("\1\0\0\0\0\0\0\377\377\0\0\0\0\377\377\0\0\0\1\0\0") - IMAGE_SCAN("\1\0\0\0\0\0\0\377\377\0\0\0\1\0\0") - IMAGE_SCAN("\1\0\0\0\0\0\0\377\377\0\0\0\1\0\0") - IMAGE_SCAN("\1\0\0\0\0\0\0\377\377\0\0\0\1\0\0") - IMAGE_SCAN("\1\0\0\0\0\0\1\0\0") - IMAGE_SCAN("\1\0\0\0\0\0\0\377\377\0\0\0\1\0\0") - IMAGE_SCAN("\1\0\0\0\0\0\0\377\377\0\0\0\1\0\0") - IMAGE_SCAN("\0\0\0\0\0\0\0") - IMAGE_SCAN("\0\0") -IMAGE_PACKED(bu, "\2\16\0\0\0\16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(ok) - IMAGE_SCAN("\0\0") - IMAGE_SCAN("\1\0\0\377\377\377\1\0\0") - IMAGE_SCAN("\1\0\0\377\377\377\3\0\0\377\0\377\377\377\1\0\0") - IMAGE_SCAN("\2\0\0\377\377\377\0\377\377\377\4\0\0\377\0\0\377\377\377\1\0\0") - IMAGE_SCAN("\2\0\0\377\377\377\0\377\377\377\3\0\0\377\0\0\377\377\377\1\0\0") - IMAGE_SCAN("\3\0\0\377\377\377\0\0\377\0\3\0\377\377\377\0\0\377\0\1\0\377\377\377\1\0\0") - IMAGE_SCAN("\1\0\0\377\377\377\0\377\0\1\0\0\377\0\1\0\377\377\377\1\0\0") - IMAGE_SCAN("\1\0\0\377\377\377\0\377\0\1\0\377\377\377\1\0\0") - IMAGE_SCAN("\1\0\0\377\377\377\1\0\0\377\0\1\0\377\377\377\1\0\0") - IMAGE_SCAN("\1\0\0\377\377\377\1\0\0\377\0\1\0\377\377\377\1\0\0") - IMAGE_SCAN("\1\0\0\377\377\377\3\0\0\377\0\0\377\377\377\1\0\0") - IMAGE_SCAN("\1\0\0\377\377\377\1\0\377\377\377\1\0\0") - IMAGE_SCAN("\0\0\377\377\377\0\0") - IMAGE_SCAN("\0\0") -IMAGE_PACKED(ok, "\2\16\0\0\0\16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(accept) - IMAGE_SCAN("") - IMAGE_SCAN("\1\0\0\1\0\0") - IMAGE_SCAN("\1\0\0\0\0") - IMAGE_SCAN("̄\0\0") - IMAGE_SCAN("\1\0\0\1\0\0\0\0\1\0\0\1\0\0") - IMAGE_SCAN("\2\0\0\0\0ȅ\0\0\1") - IMAGE_SCAN("\0\0\1\0\0\1\0\0\0\0\1") - IMAGE_SCAN("\0\0\1\0\0Ą\0\0\2\0\0") - IMAGE_SCAN("\1\0\0\0\0…\0\0\1") - IMAGE_SCAN("\1\0\0\0\0\2\0\0") - IMAGE_SCAN("\1\0\0\0\0\2\0\0") - IMAGE_SCAN("\2\0\0\0\0\0\0\2\0\0") - IMAGE_SCAN("ă\0\0\2\0\0") - IMAGE_SCAN("ł\0\0\1") - IMAGE_SCAN("") - IMAGE_SCAN("") -IMAGE_PACKED(accept, "\2\20\0\0\0\20\0\0\0\1\0\0\0\4\0\0\0\0\0\0\0") -IMAGE_BEGIN(cancel) - IMAGE_SCAN("") - IMAGE_SCAN("\0026\20M,") - IMAGE_SCAN("\3A\35)\0F)") - IMAGE_SCAN("\0039\27)\0ZF\2_@)\0") - IMAGE_SCAN("\0039\27)\0ZF\3_@5\16jb") - IMAGE_SCAN("\3:\30)\0ZF\3C\37J(jb") - IMAGE_SCAN("\6:\30.\7ZF6\17Y=jb") - IMAGE_SCAN("\4/\10)\0G+jb") - IMAGE_SCAN("\5y_)\0,\6+\5jb") - IMAGE_SCAN("\7z`)\0Q7SP^3\22,\6ZF") - IMAGE_SCAN("\4z`)\0R8ddd\3:\30.\7ZF") - IMAGE_SCAN("\4y_)\0=\34___\3:\30.\7ZF") - IMAGE_SCAN("\5y_)\00\12SNjeee\3F))\0ZF") - IMAGE_SCAN("\4y_)\0?(eee\2bP.\7") - IMAGE_SCAN("‚nnn") - IMAGE_SCAN("") -IMAGE_PACKED(cancel, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(male) - IMAGE_SCAN("\377\377\377\3\377\377\377\3778\377\0\0\3\3778\377\377\377\377\377\377") - IMAGE_SCAN("\377\377\377\3\377\377\377*\34\377\0\0\3*\34\377\377\377") - IMAGE_SCAN("\377\377\377\2\377U8\377\0\0\2\377U8\377\377\377") - IMAGE_SCAN("\377\377\377\3\377\377\377\377U8\3\377\377\377") - IMAGE_SCAN("\377\377\377\1\377U*\34\1\377U\377\377\377") - IMAGE_SCAN("\377\377\377\1*\34\377\0\0\1*\34\377\377\377") - IMAGE_SCAN("\377\377\377\377\0\0\377\377\377") - IMAGE_SCAN("\377\377\377\2\377\0\0\3778\377\0\0\2\3778\377\0\0\377\377\377") - IMAGE_SCAN("\377\377\377\2\377\0\0\3778\377\0\0\2\3778\377\0\0\377\377\377") - IMAGE_SCAN("\377\377\377\2\377\0\0\3778\377\0\0\2\3778\377\0\0\377\377\377") - IMAGE_SCAN("\377\377\377\2\377\0\0\3778\377\0\0\2\3778\377\0\0\377\377\377") - IMAGE_SCAN("\377\377\377\2\377\0\0\3778\377\0\0\2\3778\377\0\0\377\377\377") - IMAGE_SCAN("\377\377\377\2\377\0\0\3778\377\0\0\2\3778\377\0\0\377\377\377") - IMAGE_SCAN("\377\377\377\1\3778\377\0\0\1\3778\377\377\377") - IMAGE_SCAN("\377\377\377\377\0\0\377\377\377") - IMAGE_SCAN("\377\377\377\2\377\377\377\377\0\0\2\377\377\377\377\377\377") - IMAGE_SCAN("\377\377\377\377\0\0\377\377\377") -IMAGE_PACKED(male, "\2\21\0\0\0\21\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(female) - IMAGE_SCAN("\377\377\377\1\377\377\377\3\21\2\377\377\377\1\377\377\377") - IMAGE_SCAN("\2\377\377\377\377\377\377\377\377\7\377\377\377\377\37\36\34\14\23\2\15\4\34!Æ\377\377\377") - IMAGE_SCAN("\2\377\377\377\377\377\377\377\5\37\25\22\4\26\21\377\377\377") - IMAGE_SCAN("\2\377\377\377\377\377\377\377\7\377\377\377\3\2ᐐ\377\377\377") - IMAGE_SCAN("\16\377\377\377\377\377\377\377\377dl\20\24\15\17\15\27*;Ĕн\377\377\377") - IMAGE_SCAN("\16\377\377\377\377\377\377\377\"\35\24\16\11\10\6\16\4\21\17\25&\31mR\377\377\377") - IMAGE_SCAN("\377\377\377\14]L#\23\24\10\14\11\4\13\1\16\14\12\32\109\37\377\377\377") - IMAGE_SCAN("\17\377\377\377鋁1\25֖\12\20\4\5\4\15\10\22\16\10l\\[FOE\377\377\377\377") - IMAGE_SCAN("\377\377\377\15{l$\12Ӭ6Q\2\6\10\13\2\11\30\35ڏc]6(\377\377\377\377") - IMAGE_SCAN("\20\377\377\377TFdVۺ\11\20\3\1\7\13DT\377>>888:::HHHvvvrrr```LLL\20\20\20\6\6\6LLL```xxxzzzXXXVVV888\36\36\36") - IMAGE_SCAN("\4(((\30\30\30@@@```XXX\7\30\30\30hhh```HHH@@@\30\30\30\20\20\20") - IMAGE_SCAN("\2\12\12\12\10\10\10888\3\36\36\36(((000\6\6\6") - IMAGE_SCAN("") -IMAGE_PACKED(verbose, "\2\24\0\0\0\24\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(modifypair) - IMAGE_SCAN("") - IMAGE_SCAN("\1\1") - IMAGE_SCAN("\1\0\377\377\0\0\377\1") - IMAGE_SCAN("\1\0\377\377\0\0\377\1") - IMAGE_SCAN("\1\1") - IMAGE_SCAN("\1\1") - IMAGE_SCAN("\1\377\0\0\377\0\0\1") - IMAGE_SCAN("\1\377\0\0\377\0\0\1") - IMAGE_SCAN("\1\1") - IMAGE_SCAN("\1\1") - IMAGE_SCAN("\1\0\0\377\377\0\0\1") - IMAGE_SCAN("\1\0\0\377\377\0\0\1") - IMAGE_SCAN("\1\1") - IMAGE_SCAN("\1\1") - IMAGE_SCAN("\1\377\0\0\0\377\377\1") - IMAGE_SCAN("\1\377\0\0\0\377\377\1") - IMAGE_SCAN("\1\1") - IMAGE_SCAN("") -IMAGE_PACKED(modifypair, "\2\24\0\0\0\22\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(update) - IMAGE_SCAN("") - IMAGE_SCAN("\1\1\0\0\1\0\0\1\0\0\1\0\0\1") - IMAGE_SCAN("\1\0\0\1\0\0\0\0\1\0\0\0\0\1\0\0\0\0\1\0\0\1") - IMAGE_SCAN("\1\1\0\0\1\0\0\1\0\0\1\0\0\1") - IMAGE_SCAN("\1\0\0\1\0\0\0\0\1\0\0\0\0\1\0\0\0\0\1\0\0\1") - IMAGE_SCAN("\1\1\0\0\1\0\0\1\0\0\1\0\0\1") - IMAGE_SCAN("\1\0\0\1\0\0\0\0\1\0\0\0\0\1\0\0\0\0\1\0\0\1") - IMAGE_SCAN("\1\1\0\0\1\0\0\1\0\0\1\0\0\1") - IMAGE_SCAN("\1\0\0\1\0\0\0\0\1\0\0\0\0\1\0\0\0\0\1\0\0\1") - IMAGE_SCAN("\1\1\0\0\1\0\0\1\0\0\1\0\0\1") - IMAGE_SCAN("\1\0\0\1\0\0\0\0\1\0\0\0\0\1\0\0\0\0\1\0\0\1") - IMAGE_SCAN("\1\1\0\0\1\0\0\1\0\0\1\0\0\1") - IMAGE_SCAN("\1\0\0\1\0\0\0\0\1\0\0\0\0\1\0\0\0\0\1\0\0\1") - IMAGE_SCAN("\1\1\0\0\1\0\0\1\0\0\1\0\0\1") - IMAGE_SCAN("\1\0\0\1\0\0\0\0\1\0\0\0\0\1\0\0\0\0\1\0\0\1") - IMAGE_SCAN("\1\1\0\0\1\0\0\1\0\0\1\0\0\1") - IMAGE_SCAN("\1\0\0\1\0\0\0\0\1\0\0\0\0\1\0\0\0\0\1\0\0\1") - IMAGE_SCAN("") -IMAGE_PACKED(update, "\2\24\0\0\0\22\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(colors) - IMAGE_SCAN("") - IMAGE_SCAN("\1\377\377\377\0\0\0\1") - IMAGE_SCAN("\1\377\377\377\0\0\0\1") - IMAGE_SCAN("\1\377\377\377\0\0\0\1") - IMAGE_SCAN("\1\377\377\377\0\0\0\1") - IMAGE_SCAN("\1\377\377\377\0\0\0\1") - IMAGE_SCAN("\1\377\377\377\0\0\0\1") - IMAGE_SCAN("\1\377\377\377\0\0\0\1") - IMAGE_SCAN("\1\377\377\377\0\0\0\1") - IMAGE_SCAN("\1\377\377\377\0\0\0\1") - IMAGE_SCAN("\1\0\0\0\377\377\377\1") - IMAGE_SCAN("\1\0\0\0\377\377\377\1") - IMAGE_SCAN("\1\0\0\0\377\377\377\1") - IMAGE_SCAN("\1\0\0\0\377\377\377\1") - IMAGE_SCAN("\1\0\0\0\377\377\377\1") - IMAGE_SCAN("\1\0\0\0\377\377\377\1") - IMAGE_SCAN("\1\0\0\0\377\377\377\1") - IMAGE_SCAN("\1\0\0\0\377\377\377\1") - IMAGE_SCAN("") -IMAGE_PACKED(colors, "\2\24\0\0\0\23\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(whiteY) - IMAGE_SCAN("") - IMAGE_SCAN("\1\377\377\377\1") - IMAGE_SCAN("\1\377\377\377\1") - IMAGE_SCAN("\1\377\377\377\1") - IMAGE_SCAN("\1\377\377\377\0\377\0\377\377\377\1") - IMAGE_SCAN("\1\377\377\377\0\377\0\377\377\377\1") - IMAGE_SCAN("\1\377\377\377\0\377\0\377\377\377\1") - IMAGE_SCAN("\1\377\377\377\0\377\0\377\377\377\1") - IMAGE_SCAN("\1\377\377\377\0\377\0\377\377\377\1") - IMAGE_SCAN("\1\377\377\377\0\377\0\377\377\377\1") - IMAGE_SCAN("\1\377\377\377\0\377\0\377\377\377\1") - IMAGE_SCAN("\1\377\377\377\0\377\0\377\377\377\1") - IMAGE_SCAN("\1\377\377\377\1") - IMAGE_SCAN("\1\377\377\377\1") - IMAGE_SCAN("\1\377\377\377\1") - IMAGE_SCAN("") -IMAGE_PACKED(whiteY, "\2\22\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(blackY) - IMAGE_SCAN("\0\0\0") - IMAGE_SCAN("\1\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\0\377\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\0\377\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\0\377\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\0\377\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\0\377\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\0\377\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\0\377\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\0\377\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\1\0\0\0") - IMAGE_SCAN("\0\0\0") -IMAGE_PACKED(blackY, "\2\22\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(neutral) - IMAGE_SCAN("\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\1\0\0\0") - IMAGE_SCAN("\0\0\0") -IMAGE_PACKED(neutral, "\2\22\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(whiteN) - IMAGE_SCAN("") - IMAGE_SCAN("\1\377\377\377\1") - IMAGE_SCAN("\1\377\377\377\1") - IMAGE_SCAN("\1\377\377\377\1") - IMAGE_SCAN("\1\377\377\377\0\0\377\377\377\377\1") - IMAGE_SCAN("\1\377\377\377\0\0\377\377\377\377\1") - IMAGE_SCAN("\1\377\377\377\0\0\377\377\377\377\1") - IMAGE_SCAN("\1\377\377\377\0\0\377\377\377\377\1") - IMAGE_SCAN("\1\377\377\377\0\0\377\377\377\377\1") - IMAGE_SCAN("\1\377\377\377\0\0\377\377\377\377\1") - IMAGE_SCAN("\1\377\377\377\0\0\377\377\377\377\1") - IMAGE_SCAN("\1\377\377\377\0\0\377\377\377\377\1") - IMAGE_SCAN("\1\377\377\377\1") - IMAGE_SCAN("\1\377\377\377\1") - IMAGE_SCAN("\1\377\377\377\1") - IMAGE_SCAN("") -IMAGE_PACKED(whiteN, "\2\22\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(blackN) - IMAGE_SCAN("\0\0\0") - IMAGE_SCAN("\1\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\0\0\377\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\0\0\377\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\0\0\377\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\0\0\377\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\0\0\377\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\0\0\377\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\0\0\377\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\0\0\377\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\1\0\0\0") - IMAGE_SCAN("\0\0\0") -IMAGE_PACKED(blackN, "\2\22\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(exitprog) - IMAGE_SCAN("\15\377\377\377\377ww\377mm\377kk\377hh\377ff\377XX\377FF\377$$\377\377") - IMAGE_SCAN("\20\377\377\377\377\377~~\377qq\377kk\377jj\377ff\377cc\377SS\377>>\377\32\32\377\0\0") - IMAGE_SCAN("\11\377\377\377\377\377qq\377[[\377RR\377LL\377KK\377\6BB\37700\377\23\23\377\0\0\0\0") - IMAGE_SCAN("\24\377\377\377\377\377``\377BB\37733\377--\377&&\377((\377))\377((\377%%\377\34\34\377\4\4\377\0\0\0\0\0\0") - IMAGE_SCAN("\11\377\377\377\377VV\37755\377 \377\22\22\377\17\17\377\16\16\377\20\20\377\6\13\13\377\0\0\0\0\0\0\0\0\0\0d") - IMAGE_SCAN("\13\377\377\377ZZ\37722\377\24\24\377\6\6\377\1\1\377\0\0\377\2\2\377\0\0\377\1\1\377\7\0\0\377\1\1\377\0\0\0\0\0\0\0\0y\0\0?") - IMAGE_SCAN("\6\377\377hh\377CC\377\36\36\377\7\7\377\0\0\377\5\5\377\0\0\377\6\0\0\0\0\0\0\0\0\0\0`\0\0\"") - IMAGE_SCAN("\11\377{{\377ZZ\37766\377\26\26\377\2\2\377\0\0\377\7\7\377\2\2\377\0\0\377\6\0\0\0\0\0\0\0\0\0\0W\0\0\24") - IMAGE_SCAN("\7\377pp\377SS\37777\377\22\22\377\10\10\377\6\6\377\0\0\377\6\0\0\0\0\0\0\0\0\0\0M\0\0\10") - IMAGE_SCAN("\6\377rr\377XX\37744\377\26\26\377\7\7\377\0\0\377\6\0\0\0\0\0\0\0\0\0\0N\0\0\13") - IMAGE_SCAN("\7\377rr\377TT\37755\377\24\24\377\1\1\0\0\0\0\377\7\0\0\0\0\0\0\0\0\0\0\0\0L\0\0\5") - IMAGE_SCAN("\5\377\377\377\377zz\377vv\377\6ww\377oo\377cc\377KK\377&&\377\0\0\377\11||\377nn\377XX\37744\377\26\26\377\2\2\377\0\0\0\0\0\0\0\0\377\11\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0D\0\0\0") - IMAGE_SCAN("\10\377\377\377\377\377vv\377tt\377qq\377rr\377mm\377\5cc\377MM\377%%\377\0\0\33\33\6\377hh\377PP\377//\377\23\23\377\4\4\377\0\0\377\0\0\2\0\0\0\0\0\0\377\6\0\0\0\0\0\0\0\0" - "x\0\0005\0\0\0") - IMAGE_SCAN("\11\377\377\377\377rr\377__\377UU\377SS\377PP\377QQ\377\10PP\377OO\377EE\37744\377\22\22\377\0\0\0\0\7pp\377PP\377<<\377\"\"\377\11\11\377\0\0\377\0\0\0\0\2\0\0\0\0\0\0\7\0\0\0" - "\0\0\0\0\0\0\0X\0\0\30\0\0\0") - IMAGE_SCAN("\12\377\377\377\377\377ee\377FF\37766\377--\377..\377,,\377\12--\377))\377((\377&&\377\27\27\377\2\2\377\0\0\0\0\0\0\11SS\37700\377\31\31\377\3\3\377\0\0\0\0\0\0\0\0\0\0\0\0\10" - "\0\0\0\0\0\0\0\0\0\0j\0\0)\0\0\2\0\0\0") - IMAGE_SCAN("\12\377\377\377\377\377[[\37766\377\"\"\377\24\24\377\21\21\377\17\17\377\11\14\14\377\20\20\377\13\13\377\5\5\377\0\0\0\0\0\0\0\0\1\1\24##\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0b\0\0,\0\0\1\0\0\0RRV") - IMAGE_SCAN("\15\377\377\377\377\377UU\377..\377\27\27\377\10\10\377\1\1\377\0\0\377\4\4\377\2\2\1\1\1\0\0\0\0\377\7\0\0\0\0\0\0\0\0\0\0\0\0==\00522\0\0\0\0\0\0\0\0\0\0\2\0\0\0\0\0" - "\0\7\0\0\0\0r\0\0U\0\0!\0\0\1\0\0\0zz}") - IMAGE_SCAN("\12\377\377\377\377\377OO\377//\377\27\27\377\10\10\377\1\1\0\0\2\0\0\0\0\0\0\16\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\0\0\0\0j\0\0]\0\0U\0\0J" - "\0\0M\5\0\0N\0\0L\0\0D\0\0002\0\0\20\0\0\0\1") - IMAGE_SCAN("\17\377\377\377\377\177\177\377TT\377--\377\27\27\377\3\3\377\0\0\0\0\0\0\0\0\0\0\0\0߂\0\0\17\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\11PP\"\"e\10" - "\10?\4\0043\0\0&\0\0 \0\0\30\0\0\24\0\0\4\0\0\0\1") - IMAGE_SCAN("\"\377\377\377\377\377RR\377--\377\23\23\377\2\2\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0Ӝ") - IMAGE_SCAN("\30\377\377\377\377||\377NN\377--\377\21\21\377\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0z\0\0o\0\0l\0\0s\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\7\0\0\0\0\0\0\0\0\0\0\0\0[[") - IMAGE_SCAN("\34\377\377\377\377zz\377OO\377,,\377\21\21\377\4\4\377\0\0\0\0\0\0\0\0\0\0m\0\0E\0\0#\0\0\30\0\0\36\0\0-\0\0B\0\0b\0\0\0\0\0\0\0\0\5\5\377\7\7\377\4\4\377\0\0\377\11\0\0\0\0\377\0\0" - "\0\0\0\0\0\0\0\0%%\377") - IMAGE_SCAN("\35\377\377\377\377{{\377MM\377,,\377\22\22\377\7\7\377\0\0\0\0\0\0\0\0\0\0a\0\0)\0\0\0FFGttsppuQQePPv>>..44\0\0\14\14\377\22\22\377\14\14\377\7\7\377\0\0\377\4\0\0\0\0\377\0\0\2\2" - "\3\3\377\0\0\377\1dd\377") - IMAGE_SCAN("\21\377\377\377\377xx\377OO\377%%\377\25\25\377\5\5\377\0\0\0\0\0\0\0\0\0\0d\0\0\37\0\0\0--0\5\0\0\377((\377&&\377\27\27\377\15\15\377\0\0\377\7\1\1\377\2\2\377\4\4\377\10\10\377\13\13\377" - "\14\14\377\13\13\377\0\0\377\1") - IMAGE_SCAN("\21\377\377\377\377vv\377KK\377&&\377\24\24\377\6\6\377\0\0\0\0\0\0\0\0\0\0p\0\0\'\0\0\0\0\0\4\6 \377EE\37766\377\37\37\377\22\22\377\2\2\377\0\0\377\11\2\2\377\6\6\377\11\11\377\16\16" - "\377\13\13\377\16\16\377\0\0\0\0tt") - IMAGE_SCAN("\17\377\377\377\377uu\377II\377))\377\21\21\377\7\7\377\0\0\0\0\0\0\0\0\0\0|\0\0004\0\0\0\1\6GG\377[[\377JJ\377**\377\24\24\377\2\2\377\0\0\377\12\3\3\377\11\11\377\10\10\377\16\16\377" - "\15\15\377\10\10\377\0\0\0\0\13\13") - IMAGE_SCAN("\22\377\377\377\377tt\377DD\377\'\'\377\21\21\377\6\6\377\0\0\0\0\0\0\0\0\0\0\0\0@\0\0\4\0\0\0\6ff\377mm\377QQ\377//\377\23\23\377\2\2\377\0\0\377\11\4\4\377\6\6\377\12\12\377\4\4\377" - "\0\0\0\0\0\0\0\0vv") - IMAGE_SCAN("\22\377\377\377\377ss\377HH\377&&\377\21\21\377\10\10\377\0\0\0\0\0\0\0\0\0\0\0\0P\0\0\13\0\0\0zz|˂xx\377\4WW\37711\377\23\23\377\2\2\377\0\0\377\1\1\1\377\0\0\377\10\2\2\377\6\6\377\2" - "\2\377\0\0\0\0\0\0\0\0r]]") - IMAGE_SCAN("\22\377\377\377\377tt\377II\377%%\377\20\20\377\7\7\377\0\0\377\0\0\0\0\0\0\0\0\0\0]\0\0\23\0\0\0;;?\6\377\377\\\\\377//\377\23\23\377\2\2\377\0\0\377\1\1\1\377\0\0\377\6\0\0\0\0" - "\0\0\0\0\0\0N``") - IMAGE_SCAN("\22\377\377\377\377yy\377LL\377\"\"\377\13\13\377\7\7\377\0\0\377\0\0\0\0\0\0\0\0\0\0h\0\0!\0\0\0\17\17\24\6\377\377ZZ\377**\377\23\23\377\2\2\377\0\0\377\7\1\1\377\0\0\0\0\0\0\0" - "\0z\0\0007``|") - IMAGE_SCAN("\17\377\377\377~~\377QQ\377))\377\13\13\377\7\7\377\0\0\377\0\0\0\0\0\0\0\0\0\0x\0\0/\0\0\0\1\7\377\377\377UU\377((\377\20\20\377\2\2\377\0\0\377\1\1\377\7\0\0\377\0\0\0\0\0\0" - "\0\0p\0\0(``s") - IMAGE_SCAN("\21\377\377\377ee\37799\377\31\31\377\6\6\377\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0A\0\0\1\0\0\0\7\377\377||\377JJ\377\36\36\377\11\11\377\3\3\377\0\0\377\7\1\1\377\0\0\0\0\0\0\0\0p\0" - "\0)``r") - IMAGE_SCAN("\20\377\377zz\377PP\377((\377\16\16\377\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0M\0\0\10\0\0\0\10\377\377\377gg\37755\377\27\27\377\5\5\377\4\4\377\0\0\377\6\0\0\0\0\0\0\0\0n\0\0!``r") - IMAGE_SCAN("\17\377\377oo\377II\377##\377\11\11\377\0\0\377\0\0\0\0\0\0\0\0\0\0X\0\0\22\0\0\0HHL\11\377\377\377{{\377KK\377$$\377\12\12\377\2\2\377\4\4\377\0\0\377\6\0\0\0\0\0\0\0\0n\0\0!``q") - IMAGE_SCAN("\16\377xx\377hh\377BB\377\36\36\377\5\5\377\0\0\0\0\0\0\0\0\0\0f\0\0\35\0\0\0\21\21\26\12\377\377\377\377[[\37700\377\21\21\377\7\7\377\0\0\377\4\4\377\0\0\377\6\0\0\0\0\0\0\0\0m\0" - "\0\'``t") - IMAGE_SCAN("\13\377gg\377TT\377**\377\4\4\377\0\0\0\0\0\0\0\0\0\0l\0\0)\0\0\0\13\377\377\377\377bb\37788\377\30\30\377\11\11\377\1\1\377\0\0\377\5\5\377\0\0\377\6\0\0\0\0\0\0\0\0x\0\0:``\177") - IMAGE_SCAN("\12\377OO\37700\377\4\4\377\0\0\0\0\0\0\0\0\0\0j\0\0/\0\0\0\1\17\377\377\377\377ll\377==\377\34\34\377\11\11\377\3\3\377\0\0\377\6\6\377\2\2\377\0\0\377\0\0\0\0\0\0\7\0\0\0\0" - "\0\0\0\0\0\0\0\0R``") - IMAGE_SCAN("\14yy\377\27\27\377\0\0\0\0\0\0\0\0\0\0l\0\0R\0\0&\0\0\3\0\0\0\14\377\377\377\377tt\377CC\377!!\377\15\15\377\4\4\377\0\0\377\4\4\377\3\3\377\0\0\377\1\0\0\0\0\377\6\0\0\0\0\0\0" - "\0\0\0\0z``") - IMAGE_SCAN("\10\377\0\0\0\0\0\0\0\0[\0\0A\0\0&\0\0\21\0\0\0\1WW[\13\377\377\377||\377MM\377##\377\15\15\377\5\5\377\0\0\377\2\2\377\6\6\377\0\0\377\5\0\0\0\0\0\0\377\0\0\0\0\0\0\12\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0kk") - IMAGE_SCAN("\11CC\0\0u\0\0?\0\0(\0\0\27\0\0\10\24\24\30\17\17\024449\10\377\377\377\377TT\377((\377\21\21\377\6\6\377\0\0\377\1\7\7\377\0\0\377\17\0\0\0\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\11\4\4&&\377MM\377ll\377\377\377\377\377\377\377\13\177\177\377\377\377{{\377vv\377xx\377uu\377ff\377RR\377%%\377\0\0\377\1\0\0") - IMAGE_SCAN("\10\377\377\377\377ZZ\37700\377\24\24\377\7\7\377\0\0\377\1\7\7\377\0\0\377\15\0\0\0\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\0\0\12\12\377##\377GG\377_" - "_\377pp\377vv\377zz\377yy\377xx\377ww\377\11xx\377uu\377ww\377tt\377oo\377dd\377AA\377\14\14\377\0\0\1\0\0") - IMAGE_SCAN("\13\377\377\377\377``\37755\377\27\27\377\7\7\377\1\1\377\0\0\377\7\7\377\0\0\377\20\0\0\0\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\2\2\377\0\0\377\6\6\6\377" - "\27\27\377++\377@@\377OO\377YY\377[[\377\17^^\377XX\377\\\\\377WW\377[[\377VV\377YY\377VV\377WW\377UU\377OO\377==\377\22\22\377\0\0\0\0\1\0\0U") - IMAGE_SCAN("\14\377\377\377\377jj\377<<\377\34\34\377\12\12\377\3\3\377\0\0\377\7\7\377\1\1\377\0\0\377\20\0\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0p\0\0S\0\0Nvv\0\0\0\0\0\0\377\10\10\377\6\6\377\3\3" - "\377\6\7\7\377\21\21\377\35\35\377((\377//\37777\37766\377\00188\37744\377\00111\37722\377//\377\7--\377..\377\'\'\377\16\16\377\0\0\0\0\0\0X\1\27\27D") - IMAGE_SCAN("\14\377\377\377\377rr\377AA\377\36\36\377\13\13\377\3\3\377\0\0\377\4\4\377\2\2\377\0\0\377\1\0\0\0\0\10\0\0\0\0\0\0\0\0\0\0b\0\0000\0\0\15ZZ|\12$$\0\0\14\14\377\23\23\377\15\15\377" - "\6\6\377\2\2\377\3\3\377\10\10\377\17\17\377\25\25\377\3\30\30\377\27\27\377\30\30\377\25\25\377\13\26\26\377\23\23\377\22\22\377\23\23\377\24\24\377\21\21\377\11\11\377\0\0\0\0\0\0\0\0=\1\22\22-") - IMAGE_SCAN("\13\377\377\377yy\377KK\377##\377\16\16\377\5\5\377\0\0\377\3\3\377\5\5\377\0\0\377\13\0\0\0\0\0\0\377\0\0\0\0\0\0\0\0\0\0`\0\0 \0\0\0$$\'\12\0\0\"\"\377%%\377\31\31\377\12\12\377\0" - "\0\377\4\4\377\5\5\4\4\3\3\5\5\1\2\2\3\3\6\4\4\377\0\0\0\0\0\0\0\0y\0\0000\1..A") - IMAGE_SCAN("\10\377\377\377\377QQ\377((\377\17\17\377\5\5\377\0\0\377\1\7\7\377\0\0\377\13\0\0\0\0\0\0\377\0\0\0\0\0\0\0\0\0\0l\0\0&\0\0\0\0\0\2\10\13\13\377,,\377**\377\30\30\377\3\3\377\0\0\0" - "\0\0\0\0\0\0\0\1\0\0\0\0\6\0\0\0\0\0\0\0\0\0\0u\0\0-\00144B") - IMAGE_SCAN("\10\377\377\377\377YY\377..\377\23\23\377\10\10\377\0\0\377\1\10\10\377\0\0\377\11\0\0\0\0\0\0\377\0\0\0\0\0\0\0\0\0\0y\0\0.\0\0\0\6[[\377++\377##\377\6\6\377\0\0\0\0\0\0\1\0\0" - "\0\0\4\0\0\0\0\0\0\0\0\0\0\12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0e\0\0 \00133>") - IMAGE_SCAN("\10\377\377\377\377__\37722\377\25\25\377\7\7\377\0\0\377\1\7\7\377\0\0\377\12\0\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0009\0\0\2\0\0\0\20\377\22\22\377\4\4\377\0\0\0\0\0\0\0\0\0\0\0" - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0z\0\0K\0\0\21\001338") - IMAGE_SCAN("\14\377\377\377\377gg\377::\377\33\33\377\12\12\377\3\3\377\0\0\377\7\7\377\1\1\377\0\0\377\12\0\0\0\0\377\0\0\0\0\0\0\0\0\0\0L\0\0\11\0\0\0\14\377\0\0\0\0\0\0\0\0\0\0w\0\0q\0" - "\0p\0\0m\0\0p\0\0u\0\0r\0\0u\11\0\0z\0\0t\0\0v\0\0t\0\0w\0\0}\0\0x\0\0}\0\0x\0\0w\4\0\0c\0\0L\0\0!\0\0\0\001337") - IMAGE_SCAN("\14\377\377\377\377oo\377@@\377\35\35\377\11\11\377\2\2\377\0\0\377\5\5\377\2\2\377\0\0\377\11\0\0\0\0\0\0\0\0\0\0\0\0j\0\0\33\0\0\0PPT\5\0\0\0\0\0\0j\0\0A\0\0001\0\0%\6\0\0,\0\0(\0" - "\0,\0\0/\0\0,\0\0001\0\0,\13\0\0+\0\0-\0\0000\0\0001\0\0005\0\0004\0\0006\0\0008\0\0001\0\0#\0\0\20\0\0\0\1--1") - IMAGE_SCAN("\13\377\377\377yy\377JJ\377\"\"\377\16\16\377\5\5\377\0\0\377\3\3\377\4\4\377\0\0\377\0\0\6\0\0\0\0\0\0\0\0G\0\0\0&&*\6YY^^____~__u__o__p\7``rVVi==S@@V@@S@@R@@S@@T\13@@UBBX!!< 9 :" - " 9 5 . & %\30\30\35\1aag") - IMAGE_SCAN("\13\377\377\377\377VV\377**\377\16\16\377\5\5\377\0\0\377\1\1\377\7\7\377\0\0\377\7\0\0\0\0\0\0\0\0\0\0\0\0006\0\0\2") - IMAGE_SCAN("\7\377\377\377ee\377::\377\27\27\377\6\6\377\0\0\377\1\7\7\377\0\0\377\6\0\0\0\0\0\0\0\0\0\0\0\0D") - IMAGE_SCAN("\6\377\377{{\377QQ\377**\377\15\15\377\0\0\377\1\6\6\0\0\7\0\0\0\0\0\0\0\0\0\0\0\0n") - IMAGE_SCAN("\6\377\377ll\377EE\377 \377\11\11\377\0\0\377\2\0\0\0\0\0\0\11\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0|") - IMAGE_SCAN("\10\377xx\377ff\377BB\377\34\34\377\12\12\377\5\5\377\0\0\0\0\377\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0") - IMAGE_SCAN("\11\377{{\377jj\377CC\377\"\"\377\14\14\377\2\2\377\0\0\0\0\377\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") - IMAGE_SCAN("\23\377ww\377dd\377AA\377\34\34\377\11\11\377\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\7\0\0\0\0\0\0\0\0\0\0\0\0") - IMAGE_SCAN("\7\377xx\377ee\377BB\377\35\35\377\11\11\377\0\0\377\0\0\12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\1\377\0\0\377\6\0\0\0\0\0\0\0\0\0\0") - IMAGE_SCAN("\22\377xx\377ee\377BB\377\35\35\377\11\11\377\0\0\377\0\0\0\0\0\0\0\0\0\0\35\35\0\0\0\0\0\0\0\0\0\0\0\0\377\7\0\0\0\0\0\0\0\0\0\0\0\0") - IMAGE_SCAN("\22\377xx\377ee\377BB\377\35\35\377\11\11\377\0\0\377\0\0\0\0\0\0\0\0\0\0kvv\0\0\0\0\0\0\0\0\0\0\0\0\377\7\0\0\0\0\0\0\0\0\0\0\0\0") - IMAGE_SCAN("\15\377xx\377ee\377BB\377\35\35\377\11\11\377\0\0\377\0\0\0\0\0\0\0\0\0\0Naa\7~~\0\0\0\0\0\0\0\0\0\0\3\3\377\0\0\377\6\0\0\0\0\0\0\0\0\0\0\0\0") - IMAGE_SCAN("\15\377xx\377ee\377BB\377\35\35\377\11\11\377\0\0\377\0\0\0\0\0\0\0\0z\0\0009``|\5cc\0\0\0\0\0\0\0\0\0\0\1\1\1\377\0\0\377\7\0\0\0\0\0\0\0\0\0\0\0\0") - IMAGE_SCAN("\15\377xx\377ee\377BB\377\35\35\377\11\11\377\0\0\377\0\0\0\0\0\0\0\0s\0\0,``w\6TT\0\0\0\0\0\0\0\0\2\2\377\0\0\377\0\0\7\0\0\0\0\0\0\0\0\0\0\0\0") - IMAGE_SCAN("\15\377xx\377ee\377BB\377\35\35\377\11\11\377\0\0\377\0\0\0\0\0\0\0\0m\0\0\'``q\6==\0\0\0\0\0\0\0\0\0\0\0\0\377\7\0\0\0\0\0\0\0\0\0\0\0\0") - IMAGE_SCAN("\15\377xx\377ee\377BB\377\35\35\377\11\11\377\0\0\377\0\0\0\0\0\0\0\0o\0\0$``r\7 \0\0\0\0\0\0\0\0\0\0\2\2\377\0\0\377\7\0\0\0\0\0\0\0\0\0\0\0\0") - IMAGE_SCAN("\15\377xx\377ee\377BB\377\35\35\377\11\11\377\0\0\377\0\0\0\0\0\0\0\0n\0\0%``p\10\22\22\0\0\0\0\0\0\0\0\0\0\0\0\377\1\1\377\0\0\377\7\0\0\0\0\0\0\0\0\0\0\0\0") - IMAGE_SCAN("\15\377ww\377dd\377BB\377\35\35\377\11\11\377\0\0\377\0\0\0\0\0\0\0\0o\0\0\"``q\6\7\7\0\0\0\0\0\0\0\0\1\1\377\0\0\377\7\0\0\0\0\0\0\0\0\0\0\0\0") - IMAGE_SCAN("\15\377\177\177\377gg\377AA\377\35\35\377\11\11\377\0\0\377\0\0\0\0\0\0\0\0o\0\0\"``r\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\6\0\0\0\0\0\0\0\0\0\0\0\0") - IMAGE_SCAN("\15\377\377ll\377AA\377\35\35\377\11\11\377\0\0\377\0\0\0\0\0\0\0\0o\0\0\"``r\7\0\0\0\0\0\0\0\0\0\0\0\0\1\1\377\0\0\377\7\0\0\0\0\0\0\0\0\0\0\0\0\0\0") - IMAGE_SCAN("\15\377\377mm\377AA\377\33\33\377\12\12\377\0\0\377\0\0\0\0\0\0\0\0o\0\0\"``r\6\0\0\0\0\0\0\0\0\1\1\0\0\0\0\377\6\0\0\0\0\0\0\0\0\0\0\0\0") - IMAGE_SCAN("\15\377\377ii\37788\377\31\31\377\10\10\377\0\0\377\0\0\0\0\0\0\0\0o\0\0\"``r\6\0\0\0\0\0\0\0\0\0\0\1\1\377\0\0\377\5\0\0\0\0\0\0\0\0\0\0|") - IMAGE_SCAN("\5\377\377\377\377\377\377\2\377\377\377\10\377\377\377\377\377\377\377\377\377\21\377\377\377\377\377\377^^\37711\377\26\26\377\6\6\377\0\0\377\0\0" - "\0\0\0\0\0\0o\0\0\"``r\5\0\0\0\0\0\0\0\0\377\3\3\377\1\1\1\377\0\0\377\5\0\0\0\0\0\0\0\0}\0\0I") - IMAGE_SCAN("\20\377\377\377\377}}\377ss\377uu\377tt\377rr\377uu\377rr\377ww\377vv\377tt\377vv\377tt\377ss\377\24tt\377vv\377xx\377\377\377\377\377\377mm\377DD\377##\377\11\11\377\6\6\377\0\0\377" - "\0\0\0\0\0\0\0\0o\0\0\"``r\4\0\0\0\0\4\4\377\13\13\377\2\4\4\377\2\2\377\0\0\377\5\0\0\0\0\0\0\0\0j\0\0/") - IMAGE_SCAN("\12\377\377\377\177\177\377ll\377dd\377ee\377dd\377ee\377ff\377gg\377\2ee\377kk\377hh\377\25ff\377ll\377kk\377ll\377pp\377rr\377ww\377qq\377bb\377FF\377--\377\25\25\377\10\10\377\5\5\377\0\0\377" - "\0\0\0\0\0\0\0\0o\0\0\"``r\7\0\0\21\21\377\31\31\377\22\22\377\11\11\377\4\4\377\0\0\377\6\0\0\0\0\0\0\0\0\0\0\\\0\0\32") - IMAGE_SCAN("\10\377\377{{\377\\\\\377JJ\377AA\377??\377<<\377DD\377\2>>\377CC\377DD\377\4CC\377DD\377CC\377EE\377GG\377\1FF\377II\377\17HH\377CC\37755\377&&\377\26\26\377\11\11\377\4\4\377\3\3\377\0\0\377" - "\0\0\0\0\0\0\0\0o\0\0\"``r\16\377\32\32\377..\377##\377\27\27\377\10\10\377\4\4\377\0\0\377\0\0\0\0\0\0\0\0\0\0W\0\0\17") - IMAGE_SCAN("\10\377~~\377]]\377>>\377&&\377\33\33\377\36\36\377!!\377 \377\1\36\36\377##\377\3!!\377\37\37\377\"\"\377##\377\17!!\377\33\33\377\26\26\377\15\15\377\7\7\377\5\5\377\0\0\377\3\3\377\0\0\377\0\0" - "\0\0\0\0\0\0o\0\0\"``r\15@@\377BB\37733\377\35\35\377\15\15\377\3\3\377\0\0\377\0\0\0\0\0\0\0\0\0\0P\0\0\11") - IMAGE_SCAN("\5}}\377pp\377OO\377((\377\25\25\377\11\11\377\14\14\377\20\15\15\377\12\12\377\10\10\377\6\6\377\5\5\377\4\4\377\1\1\377\2\2\377\5\5\377\0\0\377\0\0\0\0\0\0\0\0o\0\0\"``r\15ZZ\377VV\377FF\377((" - "\377\24\24\377\5\5\377\0\0\377\0\0\0\0\0\0\0\0\0\0Q\0\0\12") - IMAGE_SCAN("\5xx\377hh\377DD\377\37\37\377\12\12\377\0\0\377\0\0\0\0\377\1\1\377\7\0\0\377\0\0\0\0\0\0\0\0o\0\0\"``r\15jj\377gg\377PP\37700\377\26\26\377\4\4\377\0\0\377\0\0\0\0\0\0\0\0\0\0Q\0\0\12") - IMAGE_SCAN("\5oo\377^^\377;;\377\23\23\377\0\0\377\0\0\1\0\0\0\0\3\0\0\0\0\0\0\0\0\0\0\7\0\0\0\0\0\0\0\0\0\0h\0\0#``q\15zz\377ss\377YY\37766\377\26\26\377\4\4\377\0\0\377\0\0\0\0\0\0\0\0\0\0O" - "\0\0\11") - IMAGE_SCAN("\5aa\377MM\377$$\377\0\0\377\0\0\0\0\3\0\0\0\0\0\0\0\0\3\0\0\0\0\0\0\0\0\2\0\0\0\0\0\0\0\0\1\0\0\0\0\7\0\0\0\0\0\0\0\0\0\0^\0\0\31``l\15\377xx\377[[\37766\377\26\26\377\4\4" - "\377\0\0\377\0\0\0\0\0\0\0\0\0\0N\0\0\5") - IMAGE_SCAN("\23BB\377!!\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\0Ă\0\0\3\0\0\0\0\0\0ł\0\0\10\0\0\0\0\0\0\0\0\0\0\0\0L\0\0\14``g\15\377" - "ww\377ZZ\37766\377\26\26\377\4\4\377\0\0\377\0\0\0\0\0\0\0\0\0\0I\0\0\11") - IMAGE_SCAN("\21\14\14\377\0\0\0\0\0\0\0\0{\0\0s\0\0t\0\0u\0\0y\0\0v\0\0u\0\0|\0\0x\0\0~\0\0y\0\0~\0\0}\0\0\23\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0v\0\0U\0\0&\0\0\0``d\15" - "\377ww\377ZZ\37766\377\26\26\377\4\4\377\0\0\377\0\0\0\0\0\0\0\0\0\0K\0\0\20") - IMAGE_SCAN("\14\0\0\0\0\0\0c\0\0A\0\0001\0\0,\0\0000\0\0/\0\0002\0\0.\0\0001\0\0002\0\0006\13\0\0008\0\0009\0\0007\0\0=\0\0;\0\0>\0\0=\0\0A\0\0>\0\0A\0\0C\0\0D\13\0\0H\0\0D\0\0H\0\0J\0\0L\0\0J\0\0008\0\0\"\0\0" - "\7\0\0\0``d\15\377ww\377ZZ\37766\377\26\26\377\4\4\377\0\0\377\0\0\0\0\0\0\0\0\0\0H\0\0\17") - IMAGE_SCAN("\24PPZZZZZZy[[pVVh88O::R::O::P::Q<@\2\3\0\1") - IMAGE_SCAN("\0\0\2\1\1\'&\377\377\377\2&8\1\3\0\1") -IMAGE_PACKED(ita, "\2\24\0\0\0\14\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") diff --git a/uppdev/VegaTeam5/Vega.lay b/uppdev/VegaTeam5/Vega.lay deleted file mode 100644 index a5a4b1361..000000000 --- a/uppdev/VegaTeam5/Vega.lay +++ /dev/null @@ -1,405 +0,0 @@ -LAYOUT(VegaMainLayout, 716, 572) - ITEM(MenuBar, mainmenu, LeftPosZ(4, 360).TopPosZ(0, 20)) - ITEM(Splitter, spls, HSizePosZ(4, 4).VSizePosZ(24, 4)) -END_LAYOUT - -LAYOUT(VegaTab1Layout, 707, 450) - ITEM(LabelBox, dv___0, SetLabel(t_("Edit Team")).LeftPosZ(10, 680).TopPosZ(4, 258)) - ITEM(Label, dv___1, SetLabel(t_("Team Name")).SetAlign(ALIGN_CENTER).LeftPosZ(23, 164).TopPosZ(15, 19)) - ITEM(Label, dv___2, SetLabel(t_("Federation")).SetAlign(ALIGN_CENTER).LeftPosZ(378, 127).TopPosZ(15, 19)) - ITEM(Label, dv___3, SetLabel(t_("Origin")).SetAlign(ALIGN_CENTER).LeftPosZ(218, 128).TopPosZ(15, 19)) - ITEM(Label, dv___4, SetLabel(t_("Is Available?")).SetAlign(ALIGN_CENTER).LeftPosZ(589, 88).TopPosZ(15, 19)) - ITEM(Label, dv___5, SetLabel(t_("Rating")).SetAlign(ALIGN_CENTER).SetInk(Color(28, 127, 0)).LeftPosZ(527, 52).TopPosZ(15, 19)) - ITEM(EditString, editName, MaxChars(25).LeftPosZ(22, 165).TopPosZ(37, 19)) - ITEM(EditString, editOrigin, MaxChars(20).LeftPosZ(216, 130).TopPosZ(37, 19)) - ITEM(EditString, editCountry, MaxChars(20).LeftPosZ(376, 130).TopPosZ(38, 19)) - ITEM(EditInt, editRatFIDE, Min(0).NotNull(true).MaxChars(4).LeftPosZ(533, 40).TopPosZ(38, 19)) - ITEM(ButtonOption, btnAvail, LeftPosZ(620, 22).TopPosZ(38, 20)) - ITEM(GridCtrl, arrPlayer, LeftPosZ(16, 669).TopPosZ(65, 160)) - ITEM(Button, btnAdd, SetLabel(t_("Add Team")).LeftPosZ(16, 132).TopPosZ(232, 22)) - ITEM(Button, btnModify, SetLabel(t_("Modify")).LeftPosZ(203, 132).TopPosZ(232, 22)) - ITEM(Button, btnClear, SetLabel(t_("Clear all")).LeftPosZ(384, 130).TopPosZ(232, 22)) - ITEM(Button, btnRemove, SetLabel(t_("Remove Team")).LeftPosZ(554, 130).TopPosZ(232, 22)) - ITEM(ArrayCtrl, arr, Moving(true).AskRemove(false).LeftPosZ(12, 529).VSizePosZ(267, 8)) - ITEM(Button, btnPrint, SetLabel(t_("Print Archive")).LeftPosZ(554, 131).TopPosZ(269, 22)) - ITEM(Button, btnClose, SetLabel(t_("Close Registration")).LeftPosZ(555, 129).TopPosZ(339, 28)) -END_LAYOUT - -LAYOUT(VegaTab3Layout, 720, 448) - ITEM(ArrayCtrl, arrp, HorzGrid(false).LeftPosZ(15, 672).VSizePosZ(20, 136)) - ITEM(TabCtrl, tabsPairInsert, LeftPosZ(15, 608).BottomPosZ(8, 120)) - ITEM(LabelBox, dv___2, SetLabel(t_("Round")).LeftPosZ(627, 60).BottomPosZ(12, 96)) - ITEM(EditIntSpin, spinRound, Min(0).Max(50).LeftPosZ(635, 44).BottomPosZ(44, 28)) -END_LAYOUT - -LAYOUT(TabPairing, 598, 88) - ITEM(LabelBox, dv___0, SetLabel(t_("Output")).LeftPosZ(414, 165).TopPosZ(0, 84)) - ITEM(Option, optVerbose, SetLabel(t_("Verbose output")).LeftPosZ(40, 148).TopPosZ(20, 16)) - ITEM(Option, optThree, SetLabel(t_("Accept WWW/BBB")).HSizePosZ(40, 401).TopPosZ(40, 15)) - ITEM(Option, optDanubian, SetLabel(t_("Danubian Variant (Dubov)")).LeftPosZ(40, 152).TopPosZ(60, 15)) - ITEM(Button, btnAuto, SetLabel(t_("Automatic")).LeftPosZ(247, 118).TopPosZ(14, 28)) - ITEM(Button, btnManual, SetLabel(t_("Manual")).LeftPosZ(247, 118).TopPosZ(48, 28)) - ITEM(Button, btnVerbose, SetLabel(t_("Verbose")).LeftPosZ(441, 119).TopPosZ(14, 28)) - ITEM(Button, btnPrint, SetLabel(t_("Print Pairing")).LeftPosZ(441, 118).TopPosZ(48, 28)) - ITEM(LabelBox, dv___8, SetLabel(t_("Do Pairing")).LeftPosZ(223, 165).TopPosZ(0, 84)) - ITEM(LabelBox, dv___9, SetLabel(t_("Option")).LeftPosZ(24, 180).TopPosZ(0, 84)) -END_LAYOUT - -LAYOUT(TabResult, 600, 86) - ITEM(LabelBox, dv___0, SetLabel(t_("Result")).LeftPosZ(8, 308).TopPosZ(0, 84)) - ITEM(Button, btn1, LeftPosZ(16, 64).TopPosZ(20, 24)) - ITEM(Button, btn0, LeftPosZ(88, 64).TopPosZ(20, 24)) - ITEM(Button, btn5, LeftPosZ(160, 64).TopPosZ(19, 24)) - ITEM(Button, btn7, SetLabel(t_("adjourned [7]")).LeftPosZ(232, 80).TopPosZ(20, 24)) - ITEM(Button, btn3, LeftPosZ(16, 64).TopPosZ(52, 24)) - ITEM(Button, btn4, LeftPosZ(88, 64).TopPosZ(52, 24)) - ITEM(Button, btn2, LeftPosZ(160, 64).TopPosZ(52, 24)) - ITEM(Button, btn8, SetLabel(t_("non standard")).LeftPosZ(232, 80).TopPosZ(52, 24)) - ITEM(LabelBox, dv___9, SetLabel(t_("Current Round")).LeftPosZ(320, 276).TopPosZ(0, 84)) - ITEM(Button, btnModify, SetLabel(t_("Modify Pairing")).LeftPosZ(328, 129).TopPosZ(13, 29)) - ITEM(Button, btnLoad, SetLabel(t_("Load Results")).LeftPosZ(464, 124).TopPosZ(13, 29)) - ITEM(Button, btnUpdate, SetLabel(t_("Update CrossT")).LeftPosZ(329, 129).TopPosZ(46, 31)) - ITEM(Button, btnImprove, SetLabel(t_("Improve Colors")).LeftPosZ(464, 124).TopPosZ(47, 30)) -END_LAYOUT - -LAYOUT(VegaTab4Layout, 720, 450) - ITEM(LineEdit, editor, HSizePosZ(12, 12).VSizePosZ(4, 82)) - ITEM(LabelBox, dv___1, SetLabel(t_("Show File")).LeftPosZ(12, 672).BottomPosZ(6, 68)) - ITEM(Button, btn0, SetLabel(t_("Pairing")).LeftPosZ(32, 100).BottomPosZ(38, 24)) - ITEM(Button, btn2, SetLabel(t_("Cross Table")).LeftPosZ(164, 100).BottomPosZ(38, 24)) - ITEM(Button, btn4, SetLabel(t_("Rank Category")).LeftPosZ(296, 100).BottomPosZ(38, 24)) - ITEM(Button, btn6, SetLabel(t_("Rating variation")).LeftPosZ(432, 100).BottomPosZ(38, 24)) - ITEM(Button, btn8, SetLabel(t_("Score Group")).LeftPosZ(564, 100).BottomPosZ(38, 24)) - ITEM(Button, btn1, SetLabel(t_("Result")).LeftPosZ(32, 100).BottomPosZ(10, 24)) - ITEM(Button, btn3, SetLabel(t_("Ranking List")).LeftPosZ(164, 100).BottomPosZ(10, 24)) - ITEM(Button, btn5, SetLabel(t_("Board Card")).LeftPosZ(296, 100).BottomPosZ(10, 24)) - ITEM(Button, btn7, SetLabel(t_("Player Card")).LeftPosZ(432, 100).BottomPosZ(10, 24)) - ITEM(Button, btn9, SetLabel(t_("Verbose")).LeftPosZ(564, 100).BottomPosZ(10, 24)) -END_LAYOUT - -LAYOUT(VegaConsoleFrameLayout, 636, 116) - ITEM(ColumnList, slist, HSizePosZ(8, 6).VSizePosZ(27, 5)) - ITEM(Button, btnClose, SetLabel(t_("Close")).RightPosZ(184, 80).TopPosZ(5, 19)) - ITEM(Button, btnFilter, SetLabel(t_("Set Filter")).RightPosZ(100, 80).TopPosZ(5, 19)) - ITEM(RichTextCtrl, rt, LeftPosZ(56, 254).TopPosZ(4, 19)) - ITEM(EditString, editSearch, RightPosZ(6, 88).TopPosZ(4, 19)) - ITEM(RichTextCtrl, rt2, RightPosZ(270, 51).TopPosZ(5, 19)) - ITEM(DropList, editBoardPos, LeftPosZ(8, 44).TopPosZ(4, 19)) - ITEM(ArrayCtrl, console, AskRemove(false).AutoHideSb(true).SetFrame(ThinInsetFrame()).HSizePosZ(4, 4).VSizePosZ(3, 5)) -END_LAYOUT - -LAYOUT(NewTournamentLayout, 496, 504) - ITEM(Label, dv___0, SetLabel(t_("Boards")).SetAlign(ALIGN_CENTER).LeftPosZ(437, 52).TopPosZ(64, 17)) - ITEM(Label, dv___1, SetLabel(t_("Score Game")).SetAlign(ALIGN_CENTER).LeftPosZ(353, 75).TopPosZ(64, 17)) - ITEM(Label, dv___2, SetLabel(t_("Tournament Directory")).SetAlign(ALIGN_CENTER).LeftPosZ(220, 157).TopPosZ(380, 17)) - ITEM(Label, dv___3, SetLabel(t_("Tournament File Name")).SetAlign(ALIGN_CENTER).LeftPosZ(12, 112).TopPosZ(380, 17)) - ITEM(Label, dv___4, SetLabel(t_("Rounds")).SetAlign(ALIGN_CENTER).LeftPosZ(118, 44).TopPosZ(116, 17)) - ITEM(Label, dv___5, SetLabel(t_("Play System")).SetAlign(ALIGN_CENTER).LeftPosZ(233, 92).TopPosZ(64, 17)) - ITEM(Label, dv___6, SetLabel(t_("Arbiter")).SetAlign(ALIGN_CENTER).LeftPosZ(344, 99).TopPosZ(116, 15)) - ITEM(Label, dv___7, SetLabel(t_("End Date")).SetAlign(ALIGN_CENTER).LeftPosZ(147, 60).TopPosZ(64, 17)) - ITEM(Label, dv___8, SetLabel(t_("Begin Date")).SetAlign(ALIGN_CENTER).LeftPosZ(65, 71).TopPosZ(64, 19)) - ITEM(Label, dv___9, SetLabel(t_("Pairing score")).SetAlign(ALIGN_CENTER).LeftPosZ(14, 98).TopPosZ(116, 17)) - ITEM(Label, dv___10, SetLabel(t_("Use Rtg FIDE?")).SetAlign(ALIGN_CENTER).LeftPosZ(239, 77).TopPosZ(116, 17)) - ITEM(Label, dv___11, SetLabel(t_("Feder.")).SetAlign(ALIGN_CENTER).HSizePosZ(14, 438).TopPosZ(64, 19)) - ITEM(Label, dv___12, SetLabel(t_("Place")).SetAlign(ALIGN_CENTER).LeftPosZ(322, 100).TopPosZ(16, 18)) - ITEM(Label, dv___13, SetLabel(t_("Tournament Name")).SetAlign(ALIGN_CENTER).LeftPosZ(53, 163).TopPosZ(16, 18)) - ITEM(Label, dv___14, SetLabel(t_("Acc. rounds")).SetAlign(ALIGN_CENTER).LeftPosZ(166, 70).TopPosZ(116, 17)) - ITEM(EditString, editTourn, NotNull(true).MaxChars(40).LeftPosZ(16, 228).TopPosZ(36, 19)) - ITEM(EditString, editPlace, NotNull(true).MaxChars(20).LeftPosZ(252, 233).TopPosZ(36, 19)) - ITEM(EditString, editFed, NotNull(true).MaxChars(3).LeftPosZ(16, 40).TopPosZ(84, 19)) - ITEM(EditString, editBeginDate, NotNull(true).MaxChars(10).LeftPosZ(69, 64).TopPosZ(84, 19)) - ITEM(EditString, editEndDate, NotNull(true).MaxChars(10).LeftPosZ(145, 63).TopPosZ(84, 19)) - ITEM(DropList, editSystem, LeftPosZ(220, 122).TopPosZ(84, 19)) - ITEM(DropList, editScore, LeftPosZ(353, 77).TopPosZ(84, 19)) - ITEM(EditIntNotNull, editBoards, Min(1).Max(8).MaxChars(2).LeftPosZ(445, 37).TopPosZ(85, 19)) - ITEM(EditIntNotNull, editRound, Min(1).Max(20).MaxChars(2).RightPosZ(340, 34).TopPosZ(136, 19)) - ITEM(DropList, editFirstScore, LeftPosZ(14, 98).TopPosZ(136, 19)) - ITEM(DropList, editAccRound, LeftPosZ(178, 46).TopPosZ(136, 19)) - ITEM(Option, btnIsFIDE, LeftPosZ(269, 16).TopPosZ(138, 15)) - ITEM(EditString, editArbiter, NotNull(true).MaxChars(30).LeftPosZ(316, 166).TopPosZ(136, 19)) - ITEM(LabelBox, dv___28, SetLabel(t_("Available Tie Breaks")).LeftPosZ(16, 466).TopPosZ(168, 208)) - ITEM(ArrayCtrl, collist, SetLineCy(16).HorzGrid(false).VertGrid(false).Moving(true).AskRemove(false).LeftPosZ(250, 197).TopPosZ(188, 176)) - ITEM(EditString, editTFN, NotNull(true).HSizePosZ(36, 400).TopPosZ(400, 19)) - ITEM(EditString, editDir, NotNull(true).SetEditable(false).LeftPosZ(136, 322).TopPosZ(400, 19)) - ITEM(Button, btnDir, SetLabel(t_("...")).LeftPosZ(462, 20).TopPosZ(400, 20)) - ITEM(Button, btnDone, SetLabel(t_("Done")).LeftPosZ(21, 68).TopPosZ(464, 23)) - ITEM(Button, btnClose, SetLabel(t_("Close")).LeftPosZ(420, 60).TopPosZ(464, 23)) -END_LAYOUT - -LAYOUT(SetFilterLayout, 322, 468) - ITEM(LabelBox, dv___0, SetLabel(t_("Set Record Filter")).LeftPosZ(13, 292).TopPosZ(12, 300)) - ITEM(Label, dv___1, SetLabel(t_("Field name")).SetAlign(ALIGN_CENTER).SetFrame(ThinOutsetFrame()).LeftPosZ(29, 84).TopPosZ(32, 19)) - ITEM(Label, dv___2, SetLabel(t_("Start Column")).SetAlign(ALIGN_CENTER).SetFrame(ThinOutsetFrame()).LeftPosZ(113, 88).TopPosZ(32, 19)) - ITEM(Label, dv___3, SetLabel(t_("Max Length")).SetAlign(ALIGN_CENTER).SetFrame(ThinOutsetFrame()).LeftPosZ(201, 88).TopPosZ(32, 19)) - ITEM(Button, btnLoad, SetLabel(t_("Load Filter")).LeftPosZ(65, 72).TopPosZ(272, 20)) - ITEM(Button, btnSave, SetLabel(t_("Save Filter")).LeftPosZ(185, 72).TopPosZ(272, 20)) - ITEM(Button, btnClose, SetLabel(t_("Cancel")).LeftPosZ(233, 72).TopPosZ(324, 20)) - ITEM(Button, btnDone, SetLabel(t_("Done")).LeftPosZ(15, 72).TopPosZ(324, 20)) - ITEM(LineEdit, spyfilter, SetFont(Courier(10)).SetEditable(false).LeftPosZ(14, 292).TopPosZ(364, 95)) -END_LAYOUT - -LAYOUT(ConnectDB, 674, 472) - ITEM(LabelBox, lblbox, SetLabel(t_("Search")).LeftPosZ(16, 647).TopPosZ(8, 220)) - ITEM(RichTextCtrl, rt, LeftPosZ(24, 528).TopPosZ(28, 19)) - ITEM(Label, dv___2, SetLabel(t_("search player")).SetAlign(ALIGN_CENTER).LeftPosZ(567, 79).TopPosZ(56, 19)) - ITEM(EditString, editSearch, LeftPosZ(567, 84).TopPosZ(80, 19)) - ITEM(ColumnList, slist, LeftPosZ(24, 530).TopPosZ(52, 168)) - ITEM(Button, btnFilter, SetLabel(t_("Set Filter")).LeftPosZ(567, 84).TopPosZ(152, 19)) - ITEM(LabelBox, dv___6, SetLabel(t_("Selected Players")).LeftPosZ(16, 647).TopPosZ(236, 227)) - ITEM(ColumnList, slist2, LeftPosZ(24, 530).TopPosZ(256, 202)) - ITEM(Button, btnReg, SetLabel(t_("Register All")).LeftPosZ(563, 88).TopPosZ(264, 20)) - ITEM(Button, btnRemove, SetLabel(t_("Remove Player")).LeftPosZ(563, 88).TopPosZ(364, 20)) - ITEM(Button, btnExit, SetLabel(t_("Exit")).LeftPosZ(563, 88).TopPosZ(416, 20)) - ITEM(Label, lbl, SetAlign(ALIGN_CENTER).SetFont(StdFont(12).Bold()).SetInk(LtBlue).SetFrame(ThinInsetFrame()).LeftPosZ(580, 51).TopPosZ(308, 27)) -END_LAYOUT - -LAYOUT(NonStandardResult, 424, 168) - ITEM(LabelBox, dv___0, SetLabel(t_("Non standard result")).LeftPosZ(16, 392).TopPosZ(4, 108)) - ITEM(Label, lbl1, SetFont(StdFont(11).Bold()).SetFrame(ThinOutsetFrame()).LeftPosZ(28, 180).TopPosZ(36, 19)) - ITEM(Label, lbl2, SetFont(StdFont(11).Bold()).SetFrame(ThinOutsetFrame()).LeftPosZ(216, 176).TopPosZ(36, 19)) - ITEM(DropList, dlw, LeftPosZ(152, 48).TopPosZ(68, 24)) - ITEM(DropList, dlb, LeftPosZ(224, 48).TopPosZ(68, 24)) - ITEM(Button, btnClose, SetLabel(t_("Cancel")).LeftPosZ(312, 97).TopPosZ(132, 24)) - ITEM(Button, btnDone, SetLabel(t_("Set Result")).LeftPosZ(18, 94).TopPosZ(132, 24)) -END_LAYOUT - -LAYOUT(FIDECertificate, 464, 168) - ITEM(Label, dv___0, SetLabel(t_("ID Player")).SetAlign(ALIGN_CENTER).LeftPosZ(20, 84).TopPosZ(48, 19)) - ITEM(Label, dv___1, SetLabel(t_("Place of birth")).SetAlign(ALIGN_CENTER).LeftPosZ(208, 92).TopPosZ(48, 19)) - ITEM(Label, dv___2, SetLabel(t_("Rate of play")).SetAlign(ALIGN_CENTER).LeftPosZ(328, 104).TopPosZ(48, 19)) - ITEM(EditInt, editPlayer, Min(1).LeftPosZ(44, 32).TopPosZ(76, 19)) - ITEM(DropList, editNorm, LeftPosZ(120, 52).TopPosZ(76, 19)) - ITEM(EditString, editBirth, MaxChars(30).LeftPosZ(208, 92).TopPosZ(76, 19)) - ITEM(EditString, editRateofplay, MaxChars(30).LeftPosZ(328, 104).TopPosZ(76, 19)) - ITEM(Label, dv___7, SetLabel(t_("Type Norm")).SetAlign(ALIGN_CENTER).LeftPosZ(112, 68).TopPosZ(48, 19)) - ITEM(LabelBox, dv___8, SetFrame(BottomSeparatorFrame()).LeftPosZ(16, 432).TopPosZ(112, 4)) - ITEM(Button, btnDone, SetLabel(t_("Done")).LeftPosZ(18, 80).TopPosZ(132, 20)) - ITEM(Button, btnClose, SetLabel(t_("Close")).LeftPosZ(369, 80).TopPosZ(132, 20)) - ITEM(Label, dv___11, SetLabel(t_("FIDE Norm Certificate")).SetAlign(ALIGN_CENTER).SetFont(StdFont(18).Bold()).SetInk(LtBlue).LeftPosZ(83, 282).TopPosZ(16, 19)) -END_LAYOUT - -LAYOUT(FIDERatingReport, 612, 324) - ITEM(Label, dv___0, SetLabel(t_("Rating Report to FIDE")).SetAlign(ALIGN_CENTER).SetFont(StdFont(16).Bold()).SetInk(LtBlue).LeftPosZ(188, 232).TopPosZ(16, 28)) - ITEM(Label, dv___1, SetLabel(t_("Date of end")).LeftPosZ(520, 68).TopPosZ(60, 19)) - ITEM(Label, dv___2, SetLabel(t_("Date of start")).LeftPosZ(440, 68).TopPosZ(60, 19)) - ITEM(Label, dv___3, SetLabel(t_("Federation")).LeftPosZ(368, 68).TopPosZ(60, 19)) - ITEM(Label, dv___4, SetLabel(t_("City")).LeftPosZ(196, 124).TopPosZ(60, 19)) - ITEM(Label, dv___5, SetLabel(t_("Allotted time per move/game")).HCenterPosZ(136, 138).TopPosZ(124, 19)) - ITEM(Label, dv___6, SetLabel(t_("Type of tournament")).LeftPosZ(200, 136).TopPosZ(124, 19)) - ITEM(Label, dv___7, SetLabel(t_("Rated Players")).LeftPosZ(116, 72).TopPosZ(124, 19)) - ITEM(Label, dv___8, SetLabel(t_("Total Players")).LeftPosZ(24, 72).TopPosZ(124, 19)) - ITEM(Label, dv___9, SetLabel(t_("Tournament name")).LeftPosZ(24, 124).TopPosZ(60, 19)) - ITEM(Label, dv___10, SetLabel(t_("Deputy Chief Arbiter(s)")).HCenterPosZ(136, 34).TopPosZ(192, 19)) - ITEM(Label, dv___11, SetLabel(t_("Chief Arbiter")).LeftPosZ(24, 72).TopPosZ(192, 19)) - ITEM(EditString, edit0, LeftPosZ(24, 156).TopPosZ(84, 19)) - ITEM(EditString, edit1, LeftPosZ(196, 156).TopPosZ(84, 19)) - ITEM(EditString, edit2, MaxChars(3).LeftPosZ(368, 56).TopPosZ(84, 19)) - ITEM(EditString, edit3, MaxChars(10).LeftPosZ(440, 64).TopPosZ(84, 19)) - ITEM(EditString, edit4, MaxChars(10).LeftPosZ(520, 68).TopPosZ(84, 19)) - ITEM(EditInt, edit5, Min(1).Max(999).LeftPosZ(24, 48).TopPosZ(148, 19)) - ITEM(EditInt, edit6, Min(1).Max(999).LeftPosZ(116, 48).TopPosZ(148, 19)) - ITEM(EditString, edit7, LeftPosZ(200, 160).TopPosZ(148, 19)) - ITEM(EditString, edit10, LeftPosZ(376, 212).TopPosZ(148, 19)) - ITEM(EditString, edit8, LeftPosZ(24, 228).TopPosZ(216, 19)) - ITEM(EditString, edit9, LeftPosZ(272, 316).TopPosZ(216, 19)) - ITEM(LabelBox, dv___23, SetFrame(BottomSeparatorFrame()).LeftPosZ(16, 576).TopPosZ(264, 4)) - ITEM(Button, btnDone, SetLabel(t_("Done")).LeftPosZ(25, 84).TopPosZ(284, 23)) - ITEM(Button, btnClose, SetLabel(t_("Close")).LeftPosZ(500, 84).TopPosZ(284, 23)) -END_LAYOUT - -LAYOUT(USCFRatingReport, 524, 264) - ITEM(Label, dv___0, SetLabel(t_("USCF tournament section rating report")).SetAlign(ALIGN_CENTER).SetFont(StdFont(16).Bold()).SetInk(LtBlue).LeftPosZ(80, 376).TopPosZ(16, 24)) - ITEM(LabelBox, dv___1, LeftPosZ(12, 500).TopPosZ(52, 148)) - ITEM(Label, dv___2, SetLabel(t_("ID Assistant TD")).LeftPosZ(420, 88).TopPosZ(68, 19)) - ITEM(Label, dv___3, SetLabel(t_("ID Chief TD")).LeftPosZ(320, 68).TopPosZ(68, 19)) - ITEM(Label, dv___4, SetLabel(t_("Rating System")).LeftPosZ(224, 72).TopPosZ(68, 19)) - ITEM(Label, dv___5, SetLabel(t_("K factor")).LeftPosZ(152, 56).TopPosZ(68, 19)) - ITEM(Label, dv___6, SetLabel(t_("Status")).LeftPosZ(444, 44).TopPosZ(132, 19)) - ITEM(Label, dv___7, SetLabel(t_("Operator")).LeftPosZ(344, 62).TopPosZ(132, 19)) - ITEM(Label, dv___8, SetLabel(t_("Number of Players")).LeftPosZ(208, 100).TopPosZ(132, 19)) - ITEM(Label, dv___9, SetLabel(t_("Rounds")).LeftPosZ(132, 44).TopPosZ(132, 19)) - ITEM(Label, dv___10, SetLabel(t_("Tournament Type")).LeftPosZ(24, 84).TopPosZ(132, 19)) - ITEM(Label, dv___11, SetLabel(t_("Section name")).LeftPosZ(40, 100).TopPosZ(68, 19)) - ITEM(EditString, edit0, LeftPosZ(24, 92).TopPosZ(92, 19)) - ITEM(DropList, edit1, LeftPosZ(148, 48).TopPosZ(92, 19)) - ITEM(DropList, edit2, LeftPosZ(232, 48).TopPosZ(92, 19)) - ITEM(EditInt, edit3, MaxChars(8).LeftPosZ(316, 68).TopPosZ(92, 19)) - ITEM(EditInt, edit4, MaxChars(8).LeftPosZ(420, 76).TopPosZ(92, 19)) - ITEM(DropList, edit5, LeftPosZ(36, 56).TopPosZ(156, 19)) - ITEM(EditInt, edit6, Min(1).Max(999).SetEditable(false).LeftPosZ(128, 48).TopPosZ(156, 19)) - ITEM(EditInt, edit7, SetEditable(false).LeftPosZ(208, 88).TopPosZ(156, 19)) - ITEM(EditString, edit8, SetEditable(false).LeftPosZ(328, 80).TopPosZ(156, 19)) - ITEM(EditString, edit9, SetEditable(false).LeftPosZ(436, 56).TopPosZ(156, 19)) - ITEM(Button, btnDone, SetLabel(t_("Done")).LeftPosZ(15, 84).TopPosZ(220, 23)) - ITEM(Button, btnClose, SetLabel(t_("Close")).LeftPosZ(427, 84).TopPosZ(220, 23)) -END_LAYOUT - -LAYOUT(USCFReport, 560, 300) - ITEM(Button, btnClose, SetLabel(t_("Close")).LeftPosZ(440, 104).TopPosZ(268, 20)) - ITEM(Button, btnDone, SetLabel(t_("Do USCF Report")).LeftPosZ(16, 104).TopPosZ(268, 20)) - ITEM(Button, btnOpen, SetLabel(t_("Open section list")).LeftPosZ(28, 108).TopPosZ(140, 20)) - ITEM(Button, btnRemove, SetLabel(t_("Remove Section")).LeftPosZ(28, 108).TopPosZ(76, 20)) - ITEM(Button, btnAdd, SetLabel(t_("Add Section ...")).LeftPosZ(28, 108).TopPosZ(32, 20)) - ITEM(Button, btnSave, SetLabel(t_("Save section list")).LeftPosZ(28, 108).TopPosZ(184, 20)) - ITEM(LabelBox, dv___6, SetFrame(BottomSeparatorFrame()).LeftPosZ(16, 528).TopPosZ(248, 4)) - ITEM(ColumnList, list, LeftPosZ(156, 384).TopPosZ(32, 200)) - ITEM(Label, dv___8, SetLabel(t_("Section list")).SetInk(LtBlue).LeftPosZ(156, 128).TopPosZ(8, 19)) -END_LAYOUT - -LAYOUT(USCFTournamentReport, 596, 320) - ITEM(Label, dv___0, SetLabel(t_("USCF Tournament Rating Report")).SetAlign(ALIGN_CENTER).SetFont(StdFont(16).Bold()).SetInk(LtBlue).LeftPosZ(156, 312).TopPosZ(16, 28)) - ITEM(Label, dv___1, SetLabel(t_("Numebr of sections")).SetAlign(ALIGN_CENTER).LeftPosZ(476, 104).TopPosZ(60, 19)) - ITEM(Label, dv___2, SetLabel(t_("Event name")).SetAlign(ALIGN_CENTER).LeftPosZ(244, 124).TopPosZ(60, 19)) - ITEM(Label, dv___3, SetLabel(t_("Scholastic event")).SetAlign(ALIGN_CENTER).HCenterPosZ(104, 226).TopPosZ(188, 19)) - ITEM(Label, dv___4, SetLabel(t_("Whom to send the cross table")).SetAlign(ALIGN_CENTER).HCenterPosZ(152, 78).TopPosZ(188, 19)) - ITEM(Label, dv___5, SetLabel(t_("State abbreviation")).SetAlign(ALIGN_CENTER).LeftPosZ(484, 104).TopPosZ(124, 19)) - ITEM(Label, dv___6, SetLabel(t_("Tournament city")).SetAlign(ALIGN_CENTER).LeftPosZ(332, 120).TopPosZ(124, 19)) - ITEM(Label, dv___7, SetLabel(t_("End date")).SetAlign(ALIGN_CENTER).HSizePosZ(108, 432).TopPosZ(124, 19)) - ITEM(Label, dv___8, SetLabel(t_("Affiliate ID")).SetAlign(ALIGN_CENTER).LeftPosZ(204, 72).TopPosZ(124, 19)) - ITEM(Label, dv___9, SetLabel(t_("Event ID")).SetAlign(ALIGN_CENTER).LeftPosZ(28, 100).TopPosZ(60, 19)) - ITEM(Label, dv___10, SetLabel(t_("Begin date")).SetAlign(ALIGN_CENTER).HSizePosZ(20, 520).TopPosZ(124, 19)) - ITEM(Label, dv___11, SetLabel(t_("Country for event")).SetAlign(ALIGN_CENTER).HCenterPosZ(136, -98).TopPosZ(188, 19)) - ITEM(Label, dv___12, SetLabel(t_("Zip code")).SetAlign(ALIGN_CENTER).LeftPosZ(36, 48).TopPosZ(188, 19)) - ITEM(EditInt, edit0, NotNull(true).MaxChars(6).LeftPosZ(20, 112).TopPosZ(84, 19)) - ITEM(EditString, edit1, NotNull(true).MaxChars(35).LeftPosZ(148, 316).TopPosZ(84, 19)) - ITEM(EditString, edit2, MaxChars(3).SetEditable(false).LeftPosZ(504, 48).TopPosZ(84, 19)) - ITEM(EditInt, edit3, NotNull(true).MaxChars(8).HSizePosZ(20, 524).TopPosZ(148, 19)) - ITEM(EditInt, edit4, NotNull(true).MaxChars(8).HSizePosZ(108, 432).TopPosZ(148, 19)) - ITEM(EditInt, edit5, MaxChars(8).LeftPosZ(204, 68).TopPosZ(148, 19)) - ITEM(EditString, edit6, NotNull(true).MaxChars(20).LeftPosZ(300, 180).TopPosZ(148, 19)) - ITEM(EditString, edit7, NotNull(true).MaxChars(2).LeftPosZ(504, 48).TopPosZ(148, 19)) - ITEM(EditString, edit8, NotNull(true).MaxChars(10).LeftPosZ(20, 80).TopPosZ(216, 19)) - ITEM(EditString, edit9, NotNull(true).MaxChars(20).LeftPosZ(120, 160).TopPosZ(216, 19)) - ITEM(DropList, edit10, LeftPosZ(348, 64).TopPosZ(216, 19)) - ITEM(DropList, edit11, LeftPosZ(496, 64).TopPosZ(216, 19)) - ITEM(LabelBox, dv___25, SetFrame(BottomSeparatorFrame()).LeftPosZ(8, 580).TopPosZ(264, 4)) - ITEM(Button, btnDone, SetLabel(t_("Done")).LeftPosZ(12, 84).TopPosZ(284, 23)) - ITEM(Button, btnClose, SetLabel(t_("Close")).LeftPosZ(500, 84).TopPosZ(284, 23)) -END_LAYOUT - -LAYOUT(RankRatedGroup, 308, 344) - ITEM(LabelBox, dv___0, SetLabel(t_("Group Rating Interval")).SetInk(LtBlue).LeftPosZ(24, 264).TopPosZ(20, 256)) - ITEM(Label, dv___1, SetLabel(t_("maximum")).SetAlign(ALIGN_CENTER).SetFrame(ThinOutsetFrame()).LeftPosZ(216, 48).TopPosZ(44, 19)) - ITEM(Label, dv___2, SetLabel(t_("minimum")).SetAlign(ALIGN_CENTER).SetFrame(ThinOutsetFrame()).LeftPosZ(104, 48).TopPosZ(44, 19)) - ITEM(Label, dv___3, SetLabel(t_("Group 1: >")).LeftPosZ(36, 60).TopPosZ(72, 19)) - ITEM(Label, dv___4, SetLabel(t_("\\& <=")).LeftPosZ(168, 36).TopPosZ(72, 19)) - ITEM(Label, dv___5, SetLabel(t_("Group 2: >")).LeftPosZ(36, 60).TopPosZ(112, 19)) - ITEM(Label, dv___6, SetLabel(t_("\\& <=")).LeftPosZ(168, 36).TopPosZ(112, 19)) - ITEM(Label, dv___7, SetLabel(t_("Group 3: >")).LeftPosZ(36, 64).TopPosZ(152, 19)) - ITEM(Label, dv___8, SetLabel(t_("\\& <=")).LeftPosZ(168, 36).TopPosZ(152, 19)) - ITEM(Label, dv___9, SetLabel(t_("Group 4: >")).LeftPosZ(36, 60).TopPosZ(192, 19)) - ITEM(Label, dv___10, SetLabel(t_("\\& <=")).LeftPosZ(168, 36).TopPosZ(192, 19)) - ITEM(Label, dv___11, SetLabel(t_("Group 5: >")).LeftPosZ(36, 60).TopPosZ(232, 19)) - ITEM(Label, dv___12, SetLabel(t_("\\& <=")).LeftPosZ(168, 36).TopPosZ(232, 19)) - ITEM(Button, btnDone, SetLabel(t_("Done")).LeftPosZ(26, 60).TopPosZ(304, 23)) - ITEM(Button, btnClose, SetLabel(t_("Close")).LeftPosZ(229, 60).TopPosZ(304, 23)) -END_LAYOUT - -LAYOUT(RankDateGroup, 308, 344) - ITEM(LabelBox, dv___0, SetLabel(t_("Group Date Interval")).SetInk(LtRed).LeftPosZ(24, 264).TopPosZ(20, 256)) - ITEM(Label, dv___1, SetLabel(t_("maximum")).SetAlign(ALIGN_CENTER).SetFrame(ThinOutsetFrame()).LeftPosZ(216, 48).TopPosZ(44, 19)) - ITEM(Label, dv___2, SetLabel(t_("minimum")).SetAlign(ALIGN_CENTER).SetFrame(ThinOutsetFrame()).LeftPosZ(104, 48).TopPosZ(44, 19)) - ITEM(Label, dv___3, SetLabel(t_("Group 1: >")).LeftPosZ(36, 60).TopPosZ(72, 19)) - ITEM(Label, dv___4, SetLabel(t_("\\& <=")).LeftPosZ(168, 36).TopPosZ(72, 19)) - ITEM(Label, dv___5, SetLabel(t_("Group 2: >")).LeftPosZ(36, 60).TopPosZ(112, 19)) - ITEM(Label, dv___6, SetLabel(t_("\\& <=")).LeftPosZ(168, 36).TopPosZ(112, 19)) - ITEM(Label, dv___7, SetLabel(t_("Group 3: >")).LeftPosZ(36, 64).TopPosZ(152, 19)) - ITEM(Label, dv___8, SetLabel(t_("\\& <=")).LeftPosZ(168, 36).TopPosZ(152, 19)) - ITEM(Label, dv___9, SetLabel(t_("Group 4: >")).LeftPosZ(36, 60).TopPosZ(192, 19)) - ITEM(Label, dv___10, SetLabel(t_("\\& <=")).LeftPosZ(168, 36).TopPosZ(192, 19)) - ITEM(Label, dv___11, SetLabel(t_("Group 5: >")).LeftPosZ(36, 60).TopPosZ(232, 19)) - ITEM(Label, dv___12, SetLabel(t_("\\& <=")).LeftPosZ(168, 36).TopPosZ(232, 19)) - ITEM(Button, btnDone, SetLabel(t_("Done")).LeftPosZ(26, 60).TopPosZ(304, 23)) - ITEM(Button, btnClose, SetLabel(t_("Close")).LeftPosZ(227, 60).TopPosZ(304, 23)) -END_LAYOUT - -LAYOUT(PrintTable, 296, 352) - ITEM(LabelBox, dv___0, SetLabel(t_("Fields to print")).LeftPosZ(12, 272).TopPosZ(16, 292)) - ITEM(Label, dv___1, SetLabel(t_("remove Available")).SetFont(StdFont(11).Bold()).SetInk(LtRed).LeftPosZ(148, 128).TopPosZ(276, 16)) - ITEM(Label, dv___2, SetLabel(t_("ID")).LeftPosZ(148, 92).TopPosZ(36, 18)) - ITEM(Label, dv___3, SetLabel(t_("Name")).LeftPosZ(148, 92).TopPosZ(56, 20)) - ITEM(Label, dv___4, SetLabel(t_("Federation")).LeftPosZ(148, 100).TopPosZ(76, 20)) - ITEM(Label, dv___5, SetLabel(t_("Birthday")).LeftPosZ(148, 96).TopPosZ(96, 20)) - ITEM(Label, dv___6, SetLabel(t_("Gender")).LeftPosZ(148, 96).TopPosZ(116, 20)) - ITEM(Label, dv___7, SetLabel(t_("Title")).LeftPosZ(148, 104).TopPosZ(136, 16)) - ITEM(Label, dv___8, SetLabel(t_("ID FIDE")).LeftPosZ(148, 96).TopPosZ(156, 16)) - ITEM(Label, dv___9, SetLabel(t_("ID Nat")).LeftPosZ(148, 96).TopPosZ(196, 16)) - ITEM(Label, dv___10, SetLabel(t_("Rtg FIDE")).LeftPosZ(148, 96).TopPosZ(176, 16)) - ITEM(Label, dv___11, SetLabel(t_("Rtg Nat")).LeftPosZ(148, 104).TopPosZ(216, 16)) - ITEM(Label, dv___12, SetLabel(t_("K coefficient")).LeftPosZ(148, 104).TopPosZ(236, 16)) - ITEM(Label, dv___13, SetLabel(t_("Status")).LeftPosZ(148, 100).TopPosZ(256, 16)) - ITEM(Button, btnPrint, SetLabel(t_("Print")).LeftPosZ(139, 68).TopPosZ(320, 20)) - ITEM(Button, btnClose, SetLabel(t_("Cancel")).LeftPosZ(216, 68).TopPosZ(320, 20)) - ITEM(Button, btnHtml, SetLabel(t_("Save players.html")).LeftPosZ(12, 116).TopPosZ(320, 20)) -END_LAYOUT - -LAYOUT(ModifyCrossTable, 364, 200) - ITEM(Label, lblPlayer, SetLabel(t_("player")).SetAlign(ALIGN_CENTER).SetFont(StdFont(15).Bold()).SetInk(LtBlue).LeftPosZ(28, 316).TopPosZ(28, 19)) - ITEM(Label, dv___1, SetLabel(t_("Colors")).SetAlign(ALIGN_CENTER).LeftPosZ(272, 64).TopPosZ(64, 19)) - ITEM(Label, dv___2, SetLabel(t_("Result")).SetAlign(ALIGN_CENTER).LeftPosZ(192, 60).TopPosZ(64, 19)) - ITEM(Label, dv___3, SetLabel(t_("Opponent")).SetAlign(ALIGN_CENTER).LeftPosZ(100, 72).TopPosZ(64, 19)) - ITEM(Label, dv___4, SetLabel(t_("Round")).SetAlign(ALIGN_CENTER).LeftPosZ(28, 52).TopPosZ(64, 19)) - ITEM(LabelBox, dv___5, LeftPosZ(12, 344).TopPosZ(4, 144)) - ITEM(EditInt, edtRound, MaxChars(2).LeftPosZ(40, 24).TopPosZ(92, 19)) - ITEM(EditInt, edtOpp, MaxChars(3).LeftPosZ(124, 28).TopPosZ(92, 19)) - ITEM(DropList, edtRes, LeftPosZ(200, 44).TopPosZ(92, 19)) - ITEM(DropList, edtCol, LeftPosZ(280, 60).TopPosZ(92, 19)) - ITEM(Button, btnOk, SetLabel(t_("Ok")).LeftPosZ(13, 68).TopPosZ(160, 23)) - ITEM(Button, btnClose, SetLabel(t_("Close")).LeftPosZ(285, 68).TopPosZ(160, 23)) -END_LAYOUT - -LAYOUT(ManualPairing, 708, 428) - ITEM(LabelBox, dv___0, SetLabel(t_("Available Players")).LeftPosZ(416, 280).TopPosZ(8, 364)) - ITEM(Label, dv___1, SetLabel(t_("White ID")).SetAlign(ALIGN_CENTER).SetFont(StdFont(14).Bold()).SetFrame(ThinOutsetFrame()).LeftPosZ(21, 181).TopPosZ(24, 32)) - ITEM(EditInt, edtWhite, Min(0).MaxChars(3).LeftPosZ(153, 32).TopPosZ(30, 19)) - ITEM(Label, dv___3, SetLabel(t_("Black ID")).SetAlign(ALIGN_CENTER).SetFont(StdFont(14).Bold()).SetFrame(ThinOutsetFrame()).LeftPosZ(213, 182).TopPosZ(24, 32)) - ITEM(EditInt, edtBlack, Min(0).MaxChars(3).LeftPosZ(227, 32).TopPosZ(30, 19)) - ITEM(ArrayCtrl, arrPair, HorzGrid(false).VertGrid(false).Moving(true).AskRemove(false).LeftPosZ(20, 376).TopPosZ(72, 292)) - ITEM(LabelBox, dv___6, SetLabel(t_("Add Pair")).LeftPosZ(12, 392).TopPosZ(8, 364)) - ITEM(ArrayCtrl, arrPlayer, HorzGrid(false).VertGrid(false).AskRemove(false).LeftPosZ(428, 256).TopPosZ(24, 180)) - ITEM(Label, lblAdded, SetAlign(ALIGN_CENTER).SetFont(StdFont(14)).SetFrame(ThinInsetFrame()).LeftPosZ(540, 124).TopPosZ(332, 20)) - ITEM(Button, btnAdd, SetLabel(t_("Add Pair")).LeftPosZ(432, 100).TopPosZ(212, 24)) - ITEM(Button, btnRemove, SetLabel(t_("Remove Pair")).LeftPosZ(568, 96).TopPosZ(212, 24)) - ITEM(Button, btnVerify, SetLabel(t_("Verify Pair")).LeftPosZ(432, 100).TopPosZ(252, 24)) - ITEM(Label, lblRemained, SetAlign(ALIGN_CENTER).SetFont(StdFont(14)).SetFrame(ThinInsetFrame()).LeftPosZ(540, 124).TopPosZ(296, 20)) - ITEM(Label, lblCompatible, SetAlign(ALIGN_CENTER).SetFont(StdFont(14).Bold()).SetFrame(ThinInsetFrame()).LeftPosZ(539, 124).TopPosZ(254, 20)) - ITEM(Label, dv___14, SetLabel(t_("Pairs added:")).SetAlign(ALIGN_RIGHT).LeftPosZ(420, 112).TopPosZ(332, 19)) - ITEM(Label, dv___15, SetLabel(t_("Remained players:")).SetAlign(ALIGN_RIGHT).LeftPosZ(420, 112).TopPosZ(296, 19)) - ITEM(LabelBox, dv___16, SetFrame(BottomSeparatorFrame()).LeftPosZ(12, 684).TopPosZ(376, 4)) - ITEM(Button, btnDone, SetLabel(t_("Done")).LeftPosZ(13, 100).TopPosZ(388, 24)) - ITEM(Button, btnLoad, SetLabel(t_("Load Pairing")).LeftPosZ(200, 100).TopPosZ(388, 24)) - ITEM(Button, btnSave, SetLabel(t_("Save Pairing")).LeftPosZ(400, 100).TopPosZ(388, 24)) - ITEM(Button, btnClose, SetLabel(t_("Cancel")).LeftPosZ(598, 100).TopPosZ(388, 24)) -END_LAYOUT - -LAYOUT(RowLayout, 465, 24) - ITEM(StaticRect, rect, LeftPosZ(0, 465).TopPosZ(0, 24)) - ITEM(Label, lblwrtg, SetAlign(ALIGN_CENTER).SetFont(StdFont(12).Bold()).SetInk(LtRed).SetFrame(RightSeparatorFrame()).LeftPosZ(106, 48).TopPosZ(3, 19)) - ITEM(Label, dv___2, SetLabel(t_("-")).SetAlign(ALIGN_CENTER).SetFont(StdFont(12).Bold()).LeftPosZ(241, 24).TopPosZ(3, 19)) - ITEM(Button, btnbid, SetFont(StdFont(12).Bold()).LeftPosZ(296, 56).TopPosZ(3, 19)) - ITEM(Label, wimg, SetFont(StdFont(12).Bold()).SetInk(LtRed).LeftPosZ(215, 24).TopPosZ(3, 19)) - ITEM(Button, btnwid, SetFont(StdFont(12).Bold()).LeftPosZ(155, 56).TopPosZ(3, 19)) - ITEM(Label, lblwscr, SetAlign(ALIGN_CENTER).SetFont(Courier(12)).SetInk(LtBlue).SetFrame(RightSeparatorFrame()).LeftPosZ(59, 44).TopPosZ(3, 19)) - ITEM(Label, lblBoard, SetAlign(ALIGN_CENTER).SetFont(StdFont(14).Bold()).SetFrame(BlackFrame()).LeftPosZ(11, 40).TopPosZ(3, 19)) - ITEM(Label, lblbrtg, SetAlign(ALIGN_CENTER).SetFont(StdFont(12).Bold()).SetInk(LtRed).SetFrame(LeftSeparatorFrame()).LeftPosZ(357, 48).TopPosZ(3, 19)) - ITEM(Label, bimg, SetFont(StdFont(12).Bold()).SetInk(LtRed).LeftPosZ(269, 24).TopPosZ(3, 19)) - ITEM(Label, lblbscr, SetAlign(ALIGN_CENTER).SetFont(Courier(12)).SetInk(LtBlue).SetFrame(LeftSeparatorFrame()).LeftPosZ(409, 43).TopPosZ(3, 19)) -END_LAYOUT - -LAYOUT(Abbinamento, 670, 493) - ITEM(Label, edtw, SetAlign(ALIGN_CENTER).SetFont(StdFont(16).Bold()).SetFrame(ThinInsetFrame()).HSizePosZ(532, 89).TopPosZ(215, 26)) - ITEM(Label, edtb, SetAlign(ALIGN_CENTER).SetFont(StdFont(16).Bold()).SetFrame(ThinInsetFrame()).LeftPosZ(598, 51).TopPosZ(214, 28)) - ITEM(Label, lbl, SetAlign(ALIGN_CENTER).SetFont(StdFont(12).Bold()).SetFrame(ThinInsetFrame()).LeftPosZ(532, 119).TopPosZ(255, 30)) - ITEM(ScrollArea, scrollarea, LeftPosZ(26, 485).TopPosZ(39, 438)) - ITEM(Label, dv___4, SetLabel(t_(" Board ")).SetAlign(ALIGN_CENTER).SetFrame(ThinOutsetFrame()).LeftPosZ(26, 56).TopPosZ(20, 19)) - ITEM(Label, dv___5, SetLabel(t_(" Score Rating ID color | color ID Rating Score")).SetFrame(ThinOutsetFrame()).LeftPosZ(83, 427).TopPosZ(20, 19)) - ITEM(Button, btnVerify, SetLabel(t_("Verify Pair")).LeftPosZ(530, 120).TopPosZ(102, 24)) - ITEM(Button, btnExchange, SetLabel(t_("Exchange Players")).LeftPosZ(531, 120).TopPosZ(158, 24)) - ITEM(Button, btnDone, SetLabel(t_("Done")).LeftPosZ(527, 120).TopPosZ(403, 24)) - ITEM(Button, btnClose, SetLabel(t_("Cancel")).LeftPosZ(527, 120).TopPosZ(452, 24)) -END_LAYOUT - -LAYOUT(DialogLayout, 210, 66) - ITEM(EditString, number, LeftPosZ(16, 89).TopPosZ(22, 19)) - ITEM(Button, ok, SetLabel(t_("OK")).LeftPosZ(126, 64).TopPosZ(20, 24)) -END_LAYOUT diff --git a/uppdev/VegaTeam5/Vega5.rc b/uppdev/VegaTeam5/Vega5.rc deleted file mode 100644 index 73b0ab8a4..000000000 --- a/uppdev/VegaTeam5/Vega5.rc +++ /dev/null @@ -1,2 +0,0 @@ -5555 ICON DISCARDABLE "ide.ico" -6666 ICON DISCARDABLE "xide.ico" diff --git a/uppdev/VegaTeam5/Vega5.tpp/TestTopic$en-us.tpp b/uppdev/VegaTeam5/Vega5.tpp/TestTopic$en-us.tpp deleted file mode 100644 index fb911ec9e..000000000 --- a/uppdev/VegaTeam5/Vega5.tpp/TestTopic$en-us.tpp +++ /dev/null @@ -1,6 +0,0 @@ -TITLE("vcxvxcv cvcxv cxvcxvxcv") -COMPRESSED -120,156,133,84,203,110,27,71,16,252,21,2,84,130,88,94,9,253,156,233,217,189,24,144,115,117,130,4,57,17,132,181,164,54,6,17,90,82,196,181,34,32,136,190,221,213,36,237,107,72,44,31,75,86,87,117,117,245,172,100,113,113,65,29,45,233,127,30,253,251,233,207,241,203,126,94,175,246,18,49,236,152,133,134,145,235,240,75,27,94,95,95,175,217,40,134,44,198,40,198,100,202,194,184,71,38,149,189,81,243,224,32,173,38,94,201,251,199,241,105,252,188,94,141,161,195,229,111,5,40,233,124,169,172,76,92,196,240,47,82,18,99,113,142,48,174,30,218,74,233,183,227,227,188,123,184,95,175,54,137,51,192,20,48,170,81,140,1,50,23,173,110,0,155,65,158,130,184,150,90,251,121,55,239,167,245,106,151,186,161,246,38,85,90,87,150,80,39,21,72,19,43,166,33,202,33,82,154,90,51,200,102,233,119,243,4,145,27,147,97,196,149,48,7,159,185,177,194,17,171,174,248,91,197,187,81,99,1,105,144,59,248,166,151,111,54,109,96,80,154,148,216,2,74,169,158, -136,176,96,173,33,38,69,32,130,42,26,77,5,222,223,77,135,45,176,42,60,204,144,53,220,188,243,129,1,174,93,93,10,53,146,82,27,72,33,24,61,107,107,172,1,82,99,39,214,126,251,112,135,62,55,226,164,3,48,129,73,20,20,62,186,226,133,161,89,52,192,88,89,21,175,110,81,251,195,148,179,152,31,158,214,171,203,119,63,209,53,93,139,251,155,212,219,0,15,53,85,43,205,152,20,44,168,97,105,89,33,76,147,93,162,223,140,7,80,206,184,85,135,155,156,126,102,9,206,107,184,130,185,224,5,83,69,123,10,119,164,89,168,6,245,219,253,120,56,156,45,74,123,46,179,69,230,142,121,89,211,89,87,177,150,214,168,192,98,41,222,24,30,123,49,146,254,105,250,251,203,238,105,250,60,221,195,228,29,194,49,124,27,208,57,137,208,114,10,162,116,44,136,162,151,66,233,150,35,14,162,14,187,137,195,160,8,79,12,121,62,103,113,115,108,225,8,212,142,117,217,196,20,74,154,25,12,64,1,110,204,76,129,39,58,131,45,199,116,240,57,86,103,250,19,220, -58,182,101,69,136,49,167,102,73,223,52,237,19,184,47,133,28,99,144,19,92,210,116,185,128,237,44,145,215,155,196,123,199,88,6,40,100,119,180,173,48,90,2,173,59,156,215,99,190,185,70,255,97,250,231,240,126,156,167,115,90,46,111,46,78,49,227,210,113,89,82,226,61,26,198,199,150,246,169,89,147,166,234,210,92,11,193,198,195,105,155,19,156,251,116,220,197,239,69,106,199,21,155,133,86,221,209,252,17,134,198,43,167,20,137,86,210,132,115,145,219,171,253,238,62,117,32,23,195,41,10,151,55,111,153,107,22,10,108,76,68,33,109,240,2,22,144,35,230,56,13,2,115,198,152,5,59,144,199,193,246,175,241,211,116,123,117,94,213,4,102,252,92,61,50,180,0,66,57,52,160,76,35,42,184,19,129,77,234,63,141,143,223,211,151,186,133,58,33,100,8,103,143,99,33,65,133,240,81,203,115,4,167,2,252,199,49,212,252,148,191,219,171,251,233,48,79,119,24,189,211,177,107,225,78,24,214,33,125,238,97,86,32,23,220,53,143,165,28,32,150,215,171,246,191,142, -88,150,127,63,254,247,195,207,31,174,254,248,125,177,58,208,160,139,231,237,203,243,203,246,121,177,205,15,11,92,167,239,63,174,79,63,175,191,2,90,20,70,9, diff --git a/uppdev/VegaTeam5/Vega5.tpp/all.i b/uppdev/VegaTeam5/Vega5.tpp/all.i deleted file mode 100644 index 7f2b7358d..000000000 --- a/uppdev/VegaTeam5/Vega5.tpp/all.i +++ /dev/null @@ -1,3 +0,0 @@ -TOPIC("TestTopic$en-us") -#include "TestTopic$en-us.tpp" -END_TOPIC diff --git a/uppdev/VegaTeam5/VegaConsole.cpp b/uppdev/VegaTeam5/VegaConsole.cpp deleted file mode 100644 index a6e22335b..000000000 --- a/uppdev/VegaTeam5/VegaConsole.cpp +++ /dev/null @@ -1,4 +0,0 @@ -#include "VegaMain.h" - - -//we might move some from here diff --git a/uppdev/VegaTeam5/VegaMain.h b/uppdev/VegaTeam5/VegaMain.h deleted file mode 100644 index 9aaa56e73..000000000 --- a/uppdev/VegaTeam5/VegaMain.h +++ /dev/null @@ -1,488 +0,0 @@ -#ifndef _Vega_VegaMain_h_ -#define _Vega_VegaMain_h_ - -#include -#include -#include -#include -#include "Tournament.h" - -#define IMAGECLASS Vega5Img -#define IMAGEFILE -#include -//#include - - -class ScrollArea : public StaticRect { -public: - ScrollBars sc; - StaticRect work; - void SetWorkSize(Size sz); - virtual void Scroll(); - - typedef ScrollArea CLASSNAME; - ScrollArea(); - ~ScrollArea() {;} -}; - - -//put all used class declarations above *.lay -#define LAYOUTFILE -#include - -class OptionImage : public Option { - void ReFocus(); -protected: - Image imgYes, imgNo, imgMaybe; -public: -// Callback WhenChange; - virtual void Paint(Draw& draw); - OptionImage& SetImage(const Image& m1, const Image& m2, const Image& m3) - { imgYes = m1; imgNo = m2; imgMaybe = m3; Refresh(); return *this; } - OptionImage& SetImage(const Image& m1, const Image& m2) - { imgYes = m1; imgNo = m2; Refresh(); return *this; } - - OptionImage& ThreeState(bool b = true) { threestate = b; notnull = false; return *this; } - -// void OnChange() {WhenChange();} - typedef OptionImage CLASSNAME; - OptionImage(); - ~OptionImage(){;} -}; - -class VegaConsoleFrame : public WithVegaConsoleFrameLayout { -PlayerArchive play; -public: - String filedbname; //database filename - enum{ FNAME=0, FRATING, FTITLE, FKCOEFF, FCOUNTRY, FBIRTH, FIDCODE, FGENDER }; - int IMPORT_DB; //depend by the file type - void EditSearchCB(); - void MoveItemCB(); - void RegisterPlayerCB( Vector& playerData ); - // void RegisterPlayerCB(); - void ParsePlayerFSI(String player); - void ParsePlayerFIDE(String playerstr); - void ParsePlayerVEG(String playerstr); - void ParsePlayerFixedLenghtDB(String playerstr); - void ParsePlayerUSCFregular(String playerstr); - void ParsePlayerUSCFquick(String playerstr); - void SetFilterCB(); - void SetConsoleDatabse(String fn, int flagDB); -// virtual bool Key(dword key, int count); - - typedef VegaConsoleFrame CLASSNAME; - VegaConsoleFrame(); -}; - -#define NUM_BTN 9 -class NewTournamentDlg : public WithNewTournamentLayout { -public: - int flag; - Option opt[NUM_BTN+1]; // warning!!!!! - DropList dropRating; - EditInt edtmin, edtmax; - Label dv___30, dv___32, dv___34; - void AddTyebreak( int i); - void DoneDlg(); - void ExportDlg(); - void SetTournamentDir(String dir); - typedef NewTournamentDlg CLASSNAME; - - NewTournamentDlg(int flag); // flag = 1 for a new torneo, 0 to modify it - ~NewTournamentDlg() {;} -}; - -#define FIELDS 8 -class SetFilterDlg : public WithSetFilterLayout { -Option tbutton[FIELDS]; -EditInt edit[FIELDS]; -Label label[FIELDS]; -public: - void LoadFilterCB(); //driver of LoadFilter() - void LoadFilter(String fn); - void SaveFilterCB(); - void DoneFilterCB(); - void SetSelection(int i, int l); - - typedef SetFilterDlg CLASSNAME; - SetFilterDlg(String& testdb); - ~SetFilterDlg(){;} -}; - - -class NonStandardResultDlg : public WithNonStandardResult { -int round; -public: - void DoneNonStandardCB(int idw, int idb); - void CloseCB(); - - typedef NonStandardResultDlg CLASSNAME; - NonStandardResultDlg(int idw, int idb, int rnd); - ~NonStandardResultDlg(){;} -}; - -class PrintTableDlg : public WithPrintTable { -Option opt[13]; -public: - ArrayCtrl *arr; - bool printed; - void PrintDlgCB(); - void PrintPartecipantsHTML(); - typedef PrintTableDlg CLASSNAME; - PrintTableDlg(ArrayCtrl *array); - ~PrintTableDlg(){;} -}; - -class VegaTab1 : public WithVegaTab1Layout { - EditString optGenderP,edtNameP, edtCountryP, edtBirth; - DropList edtTitleP; - EditInt edtIDFideP, edtRtgFideP, edtIDNatP, edtRtgNatP, edtKP; - EditInt optStatusP; - -// ButtonOption optGenderP, optStatusP; -public: - int countID; - void SortRecord(int column); - void AddPlayer(int flag); - int GetAvail(); - void MaskDefaultValue(); - void FillFieldsFromRow(); - void PromptCell(); - void ModifyCrossTableCB(); - void RemovePlayer(); - - typedef VegaTab1 CLASSNAME; - VegaTab1(); - ~VegaTab1(){;} -}; - -class ModifyCrossTableDlg : public WithModifyCrossTable { -int id; -public: - void DoneCB(); - void FillEditCB(); - - typedef ModifyCrossTableDlg CLASSNAME; - ModifyCrossTableDlg(int idplayer); - ~ModifyCrossTableDlg(){;} -}; - -enum {WY=0, WN, BY, BN, NG}; -class ColoredRow : public WithRowLayout { -public: - int wid, bid, board; - int wrtg, brtg; - float wscr, bscr; - int wflag, bflag; - typedef ColoredRow CLASSNAME; - - ColoredRow(); - void Set(int board, int wid, int bid, int wrtg, int brtg, float wscr, float bscr, int wflag, int bflag); - void Get(int& wid, int& bid, int& wrtg, int& brtg); - void SetSide(int side, int id, int rtg, float scr, int flag); - void GetSide(int side, int& id, int& rtg, float& scr, int& flag); -}; - -class Abbinamento : public WithAbbinamento { - ColoredRow a[501]; -// ScrollArea scrollarea; - int lastlabel, numlabel; - int id1, id2; // remind the two ids has been selected - int iboard[2], side[2]; // remind the board (1...npair) and the side(0=left, 1=right) - void FillEdit(int board, int id); - void CloseCB(); - bool ShowInfo(); - void VerifyPairCB(); - void ExchangePlayersCB(); - void DoneCB(); -public: - typedef Abbinamento CLASSNAME; - Abbinamento(); -}; - -class ShowVerboseDlg : public TopWindow { -public: - Splitter h, v; - LineEdit a, b; - typedef ShowVerboseDlg CLASSNAME; - ShowVerboseDlg(int round); - ~ShowVerboseDlg(){;} -}; - -class VegaTab3 : public WithVegaTab3Layout { - void UpdateData(bool flag); - void HideTab(ArrayCtrl *x); -// bool Key(dword key, int count); - void StartArrayCursor(); - void MoveNextPair( int position); -public: - int round; - WithTabPairing tabpair; - WithTabResult tabinsert; - - typedef VegaTab3 CLASSNAME; - VegaTab3(); - ~VegaTab3(){;} - void ShowPairingCB(); - void UpdateLabelResultCB(); - void SpinRoundCB(); - void BtnResultCB(int idresult); - void BtnOption(); - void SetSpinRound(int r); - void ShowVerboseCB(); - void SetOptionCB(int flag); - void LoadResultCB(); - void SwapColorsCB(); - int InvertResult(int res); - void ImproveColorsCB(); -}; - - -class ManualPairingDlg : public WithManualPairing { - int npair, remainedplayer, flagcall; - int * availplayer; // player to be paired -public: - void AddPairCB(); - void VerifyPairCB(); - void LoadPairingCB(int flag); - void SavePairingCB(); - void RemovePairCB(); - void DoneCB(); - void SelectionListAvalCB(); - - typedef ManualPairingDlg CLASSNAME; - ManualPairingDlg(int flagcall); - ~ManualPairingDlg(){;} -}; - -class VegaTab4 : public WithVegaTab4Layout { -ToolBar toolbar; -FontHeight edt; -EditString edts; -public: -String filename; - typedef VegaTab4 CLASSNAME; - VegaTab4(); - ~VegaTab4(){;} - void ShowFile(int idfile); - void MainBar(Bar& bar); - void New(); - void Load(const String& name); - void Open(); - void Save(); - void SaveAs(); - void PrintCB(); - void PrintSelectedTextCB(); - void NewQtf(); - -}; - - -class UWord : public TopWindow { -protected: - RichEdit editor; - MenuBar menubar; - ToolBar toolbar; - StatusBar statusbar; - String filename; - - void Load(const String& filename); - void New(); - void Open(); - void Save(); - void SaveAs(); - void Print(); - void Pdf(); - void About(); - void Destroy(); - void SetBar(); - void FileBar(Bar& bar); - void AboutMenu(Bar& bar); - void MainMenu(Bar& bar); - void MainBar(Bar& bar); - -public: - typedef UWord CLASSNAME; - - UWord(); -}; - -//Section -class USCFSectionReport : public WithUSCFRatingReport { -public: - typedef USCFSectionReport CLASSNAME; - USCFSectionReport(); - ~USCFSectionReport(){;} - void DoneCB(); -}; - - -//do USCF Tournament report -class USCFTournamentReport : public WithUSCFTournamentReport { -String filesection[20]; -int Ndirectory, max_rounds; -public: - typedef USCFTournamentReport CLASSNAME; - USCFTournamentReport(int SectionNumber, int max_rounds, String listfile[]); - ~USCFTournamentReport(){;} - void DoneCB(); -}; - - -//collect sections -class USCFReport : public WithUSCFReport { -int Ndirectory, max_rounds; -public: - typedef USCFReport CLASSNAME; - USCFReport(); - ~USCFReport(){;} - void OpenFileCB(); - void SaveFileCB(); - void RemoveCB(); - void AddCB(); - void DoneCB(); -}; - - -class FIDERatingReport : public WithFIDERatingReport { -public: - typedef FIDERatingReport CLASSNAME; - FIDERatingReport(); - ~FIDERatingReport(){;} - void DoneCB(); -}; - - -class FIDECertificate : public WithFIDECertificate { -public: - typedef FIDECertificate CLASSNAME; - FIDECertificate(); - ~FIDECertificate(){;} - void CloseCB(); - void DoneCB(); -}; - -#define GROUPS 5 -class RankRatedGroup : public WithRankRatedGroup { -EditInt editgroup[GROUPS+1][2]; -int limitgroup[GROUPS+1][2]; -public: - typedef RankRatedGroup CLASSNAME; - RankRatedGroup(); - ~RankRatedGroup(){;} - void CloseCB(); - void DoneCB(); - void SaveRankRatedGroup(); -}; - - -class RankDateGroup : public WithRankDateGroup { -EditInt editgroup[GROUPS+1][2]; -int limitgroup[GROUPS+1][2]; -public: - typedef RankDateGroup CLASSNAME; - RankDateGroup(); - ~RankDateGroup(){;} - void CloseCB(); - void DoneCB(); - void SaveRankDateGroup(); -}; - - -class VegaMain : public WithVegaMainLayout { -//these are protected to access then from app instance... - void DataFromArchiveToArray(int fromPlayer, int toPlayer); - void DataFromArchiveToArray(); - void DataFromArchiveToArray(int board, Vector& v); - void DataFromArrayToArchive(); - void ReadVegFile(String filename); -protected: - TabCtrl tabs; - VegaTab1 tab1; //may change the name for better one... - VegaTab3 tab3; //may change the name for better one... - - VegaConsoleFrame consoleFrame; - -public: - void VegaMainMenu(Bar& menu); - void File(Bar& bar); - void Export(Bar& bar); - void NationalReport(Bar& bar); - - void NewTournament(); - void ExportTournament(); - void ExportAllPlayers(); - void ExportPlayer(); - void OpenTournament(); - void SaveTournament(); - void ConnectDatabase(int i); - void SelectDbase(Bar& bar); - void CloseRegistration(); - void AssignIDtoPlayers(int n); - - void Extras(Bar& bar); //menu Extra - void FideReport(Bar& bar); // submenu FideReport - void FindNorm(); - void FideEloVariation(); - void FIDERatingReportCB(); - void Report(Bar& bar); - void FindDuplicate(); - void FidePlayerCard(); - void ShowStatistics(); - void PrintFIDECertificateCB(); - void FSIReportCB(); - void USCFReportMenu(Bar& bar); - void USCFSectionReportCB(); - void USCFTournamentReportCB(); - void SortCrossTable(); - void RankDateGroupCB(); - void RankRatedGroupCB(); - void RoundRobinCalendar(); - void SelectLanguage(Bar& bar); - void ChooseLng(int lng); - void MakeSBadge(); - void MPScoreSystem(); - void BackupVegFile(); - void DBConversion(); - void PrintReceipt(); - - void DangerousStuff(Bar& bar); // submenu DangerousStuff - void ModifyTournament(); - void LoadBackupRoundCB(); - void ResetTournamentCB(); - void ReopenRegistrationCB(); - void DeleteRoundCB(); - - void Help(Bar& bar); // menu Help - void HelpContent(); - void HelpRegistered(); - void HelpAbout(); - - void SetBars(); - void SetTabs(); - void DopairingCB(); - void DoManualPairingCB(); - void ModifyPairingCB(); - void PrintTable(); - void PrintPairingCB(); - void Init(); - - void UpdateInfo(const String& _who, const String& _action, const String& _what); - String InfoCurrentPlayerAndStatus(); - void ThreeButtonAction(); - void arrCtrlsAction(); - void btnAddAction(); - void btnModifyAction(); - void btnRemoveAction(); - void ShowStatusBar(); - void AddImportedPlayer(); - void Exit(); - virtual bool Key(dword key, int count); - -public: - typedef VegaMain CLASSNAME; - VegaMain(); -}; - - -#endif diff --git a/uppdev/VegaTeam5/VegaMenus.cpp b/uppdev/VegaTeam5/VegaMenus.cpp deleted file mode 100644 index f26bfcd13..000000000 --- a/uppdev/VegaTeam5/VegaMenus.cpp +++ /dev/null @@ -1,1249 +0,0 @@ -#include "VegaMain.h" -#include "Tournament.h" - -#define IMAGECLASS Vega5Img -#define IMAGEFILE -#include - -void VegaMain::VegaMainMenu(Bar& menu) -{ - menu.Add(t_("File"), THISBACK(File) ).Key(K_CTRL_F); -// menu.Add(t_("Extras"), THISBACK(Extras) ).Key(K_CTRL_X); -// menu.Add(t_("Report"), THISBACK(Report) ).Key(K_CTRL_R); -// menu.Add(t_("Help"), THISBACK(Help) ).Key(K_CTRL_H); -} - - -// from file -void VegaMain::File(Bar& bar) -{ - bar.Add(t_("New Tournament"), Vega5Img::newTourn(), THISBACK(NewTournament)).Key(K_CTRL_N); - bar.Add(t_("Open Tournament"), CtrlImg::open(), THISBACK(OpenTournament)).Key(K_CTRL_O); - bar.Add(t_("Save Tournament"), CtrlImg::save(), THISBACK(SaveTournament)).Key(K_CTRL_S); - bar.Separator(); -// bar.Add(t_("Export"), THISBACK(Export)); -// bar.Add(t_("Export"), THISBACK(Export)); - bar.Add(t_("Connect Database"), Vega5Img::registered(), THISBACK(SelectDbase)); - bar.Separator(); - bar.Add(t_("Dangerous Stuff!"), Vega5Img::danger(), THISBACK(DangerousStuff)); - bar.Separator(); - bar.Add(t_("Exit"), THISBACK(Exit)).Key(K_CTRL_E); -} - -void VegaMain::SelectDbase(Bar& bar) -{ - bar.Add(t_("archive FIDE"), Vega5Img::fide(), THISBACK1(ConnectDatabase, 1)); - bar.Add(t_("archive FSI Italy"), Vega5Img::ita(), THISBACK1(ConnectDatabase, 4)); - bar.Add(t_("archive USCF Regular"), Vega5Img::uscf(), THISBACK1(ConnectDatabase, 5)); - bar.Add(t_("archive USCF Quick"), Vega5Img::uscf(), THISBACK1(ConnectDatabase, 6)); - bar.Add(t_("archive VEG"), THISBACK1(ConnectDatabase, 2)); - bar.Add(t_("national archive with Fixed Length"), THISBACK1(ConnectDatabase, 3)); -} - - -void VegaMain::Export(Bar& bar) -{ - bar.Add(t_("All Players"), THISBACK(ExportAllPlayers)); - bar.Add(t_("Tournament"), THISBACK(ExportTournament)); - bar.Add(t_("Selected Player"), THISBACK(ExportPlayer)); -} - - -void VegaMain::DangerousStuff(Bar& bar) -{ - bar.Add(t_("Modify Tournament"), THISBACK(ModifyTournament)); - bar.Add(t_("Load Round"), THISBACK(LoadBackupRoundCB)); - bar.Add(t_("Reset Tournament"), THISBACK(ResetTournamentCB)); - bar.Add(t_("Delete Round"), THISBACK(DeleteRoundCB)); - bar.Add(t_("Reopen Registration"), THISBACK(ReopenRegistrationCB)); -} - - -void VegaMain::NewTournament() -{ if (TD.IS_TORNEO_STARTED) { - if (!PromptYesNo( t_("[s0;=*@6 All tournament data will be lost &(but you can keep the players).&][s0;=*@6 Do you want to continue?]") ) ) return; - } - TD.NEW_TORNEO = false; - NewTournamentDlg newt(1); - newt.Run(); // collect new information to set a new tournament - if (TD.NEW_TORNEO) { - if (tab1.arr.GetCount()) { - if (!PromptYesNo( t_("Do you want to keep& the players currently registered?") ) ) - tab1.arr.Clear(); //remove all the previous data - } - tab3.arrp.Clear(); // clear roundManager - SaveTournament(); //save what we have cretead - UpdateInfo("", "", t_("Created new tournament")); - this->Title(TD.FILETORNEO + " - " + VERSION); -// tab1.arr.Removing(true); //players can be deleted - tab1.arr.Moving(true); //players can be moved - } -} - -void VegaMain::ExportTournament() -{ if (TD.NPlayer<1) { - Exclamation( t_("There are no players to export")); - return; // nothing to retrive - } - NewTournamentDlg newt(2); - newt.Run(); -} - -void VegaMain::ExportAllPlayers() -{ // export in a file the players in the listPlayer - int i; - if (TD.NPlayer<1) { - Exclamation( t_("There are no players to export")); - return; // nothing to retrive - } - FileSel fs; // for Linux and windows - String fn; - fs.Type( t_("File vega"), "*.csv").DefaultExt("csv"); -// if(fs.ExecuteOpen()) { // file selected - if( fs.ExecuteSaveAs() ) { // file selected - fn = ~fs; - } else return; - DataFromArrayToArchive(); - - FileOut out(fn); - out.PutLine( "NAME; COUNTRY;BIRTHDAY;G;TITLE;IDFIDE;ELOFIDE; IDNAT;ELONAT;K;ISAVAL"); - for (i=1; i<=TD.NPlayer; i++) - { String s; - s = NFormat( "%-25.25s;", player[i].name); - s << NFormat( "%3.3s;", player[i].country); - s << NFormat( "%8.8s;", player[i].data); - s << NFormat( "%s;", player[i].sex); - s << NFormat( "%3.3s;", player[i].codetitle); - s << NFormat( "%8d;", player[i].idfide); - s << NFormat( "%5d;", player[i].ratingfide); - s << NFormat( "%8d;", player[i].idnat); - s << NFormat( "%5d;", player[i].ratingnat); - s << NFormat( "%2d", player[i].kcoeff); - out.PutLine(s); - } - out.Close(); -} - -void VegaMain::ExportPlayer() -// copy the selected player from the current section to another tournament -// the player is not removed from the current section -{ String s, line; - int i; - i = tab1.arr.GetCursor(); - if (i<0) { - Exclamation( t_("There are no players to export")); - return; // nothing to retrive - } - - - FileSel fs; // for Linux and windows - String fn; - // select the file *.VEG where to move the player - fs.Set(t_("Set destination .VEG file")); - fs.Type( t_("File vega"), "*.veg").DefaultExt("veg"); - if(fs.ExecuteOpen()) fn = ~fs; - else return; - - // get the player - s = AsString( tab1.arr.Get( i, 1 ) ) + ";"; - s << AsString( tab1.arr.Get( i, 2 ) ) + ";"; - s << AsString( tab1.arr.Get( i, 3 ) ) + ";"; - s << AsString( tab1.arr.Get( i, 4 ) ) + ";"; - s << AsString( tab1.arr.Get( i, 5 ) ) + ";"; - s << AsString( tab1.arr.Get( i, 6 ) ) + ";"; - s << AsString( tab1.arr.Get( i, 7 ) ) + ";"; - s << AsString( tab1.arr.Get( i, 8 ) ) + ";"; - s << AsString( tab1.arr.Get( i, 9 ) ) + ";"; - s << AsString( tab1.arr.Get( i, 10 ) ) + ";"; - s << AsString( tab1.arr.Get( i, 11 ) ) ; - - // confirm? - // sprintf(mess, "Are you sure to move %s\nin the VEG file [%s] ?\n\n(Close the Vega session that is eventually using\n that file before to proceed!)", str, filename); - // if (!QuestionMessage( mess, sss[S_NO], sss[S_YES], NULL) ) return; - - // do a backup copy of the veg file with extension vg2 - String f = fn + "b"; - FileCopy(fn, f); - - // now produce a new veg file - FileIn in(f); - FileOut out(fn); - - for(i=1; i<=10; i++ ) { - line = in.GetLine(); - out.PutLine(line); - } - line = in.GetLine(); - int countplayers = StrIntValue(line); - out.PutLine( NFormat("%3d", countplayers + 1) ); - - for(i=1; i<=countplayers+1; i++) { // +1 refer to the headre line - line = in.GetLine(); - out.PutLine(line); - } - in.Close(); - out.PutLine(s); - out.Close(); - FileDelete(f); - Exclamation( t_("The player has been copied") ); -} - - -void VegaMain::SaveTournament() -{ - // if (TD.NPlayer<1) { Exclamation( t_("Add players") ); return; } // nothing to save - - if (TD.IS_CLOSED_REGISTRATION) { // we must save both VEG and RND file - //if (!TD.IS_VEG_SAVED) { // save the VEG file as it wasn't saved - tab1.SortRecord(0); //before to save sort the table for ID - DataFromArrayToArchive(); - TD.SaveVegFile(true); - // } - // the RND file is saved always - if (TD.IS_SWISS) TD.SaveRound(0); - else TD.SaveRoundRR(0); - } - else { // we must save only the VEG file - //if (!TD.IS_VEG_SAVED) { - tab1.SortRecord(0); //before to save sort the table for ID - DataFromArrayToArchive(); - TD.SaveVegFile(true); - //} - } - UpdateInfo("vcvx", "czzxc", t_("Saved tournament data")); -} - - -void VegaMain::DataFromArrayToArchive() -{ int i; -//FileOut save(TD.PATHDIR + "dump.txt"); - TD.NPlayer = tab1.arr.GetCount(); - for(i=1; i<=tab1.arr.GetCount(); i++) { - //player[] start from 1, while the array start from 0 - //the column 'ID' is skipped - player[i].name = AsString( tab1.arr.Get( i-1, 1 ) ); - player[i].country = AsString( tab1.arr.Get( i-1, 2 ) ); - player[i].data = AsString( tab1.arr.Get( i-1, 3 ) ); - player[i].sex = AsString( tab1.arr.Get( i-1, 4 ) ); - player[i].codetitle = AsString( tab1.arr.Get( i-1, 5 ) ); - player[i].title = player[i].TitleToCode(); - player[i].idfide = StrIntValue (AsString( tab1.arr.Get( i-1, 6 ) ) ); - player[i].ratingfide = StrIntValue (AsString( tab1.arr.Get( i-1, 7 ) ) ); - player[i].idnat = StrIntValue (AsString( tab1.arr.Get( i-1, 8 ) ) ); - player[i].ratingnat = StrIntValue (AsString( tab1.arr.Get( i-1, 9 ) ) ); - player[i].kcoeff = StrIntValue (AsString( tab1.arr.Get( i-1, 10 ) ) ); - player[i].isAvailable = AsString( tab1.arr.Get( i-1, 11 ) ) ; - -//save << Format("%-20.20s -\n", player[i].name); - - // set the rating used during the tournament - if (TD.IS_FIDE_TOURNAMENT) { - player[i].RATING = player[i].ratingfide; - if (player[i].ratingfide == 0) player[i].RATING = player[i].ratingnat; - } - else { - player[i].RATING = player[i].ratingnat; - if (player[i].ratingnat == 0) player[i].RATING = player[i].ratingfide; - } - } - -//save.Close(); -} - - -void VegaMain::DataFromArchiveToArray(int fromPlayer, int toPlayer) -{ int i; - if (!TD.IS_CLOSED_REGISTRATION) { - for (i=fromPlayer; i<=toPlayer; i++) - { - tab1.arr.Add( 1, player[i].name , player[i].country, player[i].data, player[i].sex, - player[i].codetitle, player[i].idfide, player[i].ratingfide, player[i].idnat, - player[i].ratingnat, player[i].kcoeff, player[i].isAvailable); - } - } -} - -void VegaMain::DataFromArchiveToArray(int board, Vector& v) -{ - if (!TD.IS_CLOSED_REGISTRATION) { - tab1.arrPlayer.Set(board, v);} -} - -void VegaMain::DataFromArchiveToArray() -{ int i; - tab1.arr.Clear(); //clear the arrayctrl - if (!TD.IS_CLOSED_REGISTRATION && !TD.IS_SAVED_ROUND) { - for (i=1; i<=TD.NPlayer; i++) { - tab1.arr.Add( 1, player[i].name , player[i].country, player[i].data, player[i].sex, - player[i].codetitle, player[i].idfide, player[i].ratingfide, player[i].idnat, - player[i].ratingnat, player[i].kcoeff, player[i].isAvailable); - } - } - else { - for (i=1; i<=TD.NPlayer; i++) { - tab1.arr.Add( i, player[i].name , player[i].country, player[i].data, player[i].sex, - player[i].codetitle, player[i].idfide, player[i].ratingfide, player[i].idnat, - player[i].ratingnat, player[i].kcoeff, player[i].isAvailable); - } - } -} - - -void VegaMain::OpenTournament() -{ //FileSelector fs; //for Windows style - FileSel fs; // for Linux and windows - String fn, dir; - dir = TD.PATHDIR; // it has a final slash that should be removed - if ( dir.Right(1) == "\\" || dir.Right(1) == "/" ) - dir.Remove( dir.GetLength() - 1, 1); // remove the final '\' or '/' - fs.dir <<= dir; - - if (TD.IS_TORNEO_STARTED) { - if (!PromptYesNo( t_("[s0;=*@6 All your data will be lost.&][s0;=*@6 Do you want to continue?]") ) ) return; - } - fs.Type( t_("File vega"), "*.veg").DefaultExt("veg"); - if(fs.ExecuteOpen()) { // file selected - TD.PATHDIR = fs.GetActiveDir(); - #ifdef PLATFORM_WIN32 - TD.PATHDIR << "\\"; - #endif - #ifdef PLATFORM_POSIX - TD.PATHDIR << "/"; - #endif - fn = ~fs; - // FilePath(fn); - } - else return; - ReadVegFile(fn); - #ifdef PLATFORM_WIN32 - TD.PATHDIRWWW = TD.PATHDIR + "www" + TD.FILETORNEO + "\\"; //set the wwwdir - #endif - #ifdef PLATFORM_POSIX - TD.PATHDIRWWW = TD.PATHDIR + "www" + TD.FILETORNEO + "/"; //set the wwwdir - #endif - // DataFromArchiveToArray(); - - if (TD.IS_SAVED_ROUND) { // esiste il file *.rnd (le iscrizioni sono chiuse) => lo legge, - //tab1.arr.Removing(false); //players cannot be deleted - tab1.arr.Moving(false); //players cannot be moved - if (TD.IS_SWISS) { - TD.LoadRound(TD.PATHDIR + TD.FILETORNEO + ".rnd"); - TD.AdjournCrossTableSwiss(TD.currentRound); - } - else { - TD.LoadRoundRR(TD.PATHDIR + TD.FILETORNEO + ".rnd"); //load .rnd file - TD.AdjournCrossTableRR(TD.currentRound); - } - if (TD.STATUS_ROUND==READY_FOR_INSERTION) Exclamation("Insert missing result"); - } - else { // continue with registration - //tab1.arr.Removing(true); //players can be deleted - tab1.arr.Moving(true); //players cannot be moved - TD.currentRound = 0; - TD.IS_CLOSED_REGISTRATION = false; - TD.STATUS_ROUND = READY_FOR_PAIRING; - } - TD.IS_TORNEO_STARTED = 1; - // ResetEditMask(); - tab3.spinRound <<= TD.currentRound; - tab3.SpinRoundCB(); //per attivare indirettamente ShowPairing() che ha bisogno di round - UpdateInfo("vcvx", "czzxc", t_("Opened tournament ") + TD.FILETORNEO); - this->Title(TD.FILETORNEO + " - " + VERSION); -} - - -// read the archive file contained in the *.veg file -void VegaMain::ReadVegFile(String filename) -{ int i, k, nrecord; - extern bool Contains(const String& text, const String& substr); - String header; - db.Clear(); //remove all the data from the database - FileIn in(filename); - if (in.IsError()) { - Exclamation("Error reading the .veg FILE"); - return; - } - header = in.GetLine(); // skip the header file - TD.NAMETORNEO = in.GetLine(); - header = in.GetLine(); - TD.PLACETORNEO = header.Mid(0,19); - TD.HOSTFEDERATION = header.Mid(21,3); - - { // get date - Vector field = Split(in.GetLine(), ','); - TD.DATATORNEO_B = TrimLeft(field[0]) ; - TD.DATATORNEO_E = TrimLeft(field[1]) ; - } - TD.ARBITER = in.GetLine(); - { // get score system - Vector field = Split(in.GetLine(), ' '); - TD.DRAW = StrDblValue( field[0] ); - TD.WON = StrDblValue( field[1] ); - } - { // get tyebreak order - Vector field = Split(in.GetLine(), ' '); - for (i=0; i field = Split(in.GetLine(), ' '); - TD.NRounds = StrIntValue(field[0]); - TD.PLAY_SYSTEM = StrIntValue(field[1]); - TD.StartSystem(TD.PLAY_SYSTEM); - TD.IS_FIDE_TOURNAMENT = StrIntValue(field[2]); - TD.NAccRound = StrIntValue(field[3]); - TD.NBoards = StrIntValue(field[4]); - TD.SCORE_TYPE = StrIntValue(field[5]); - } - TD.IS_SAVED_ROUND = TD.IS_CLOSED_REGISTRATION = StrIntValue( in.GetLine() ); - - nrecord = TD.NPlayer = StrIntValue( in.GetLine() ); - - for (i=1; i<=nrecord; i++) { - - String strID = AsString( i ); //db is zero based - TeamArchive& team = db.Add( strID ); - Vector field = Split(in.GetLine(), ';'); - team.name = field[0]; - team.origin = field[1]; - team.country = field[2]; - team.ratingfide = 0; //StrIntValue(field[3]); - team.isAvailable = field[4]; - - for (k=0; k fields = Split(in.GetLine(), ';'); - team.plr[k].name = TrimLeft(fields[0]); - team.plr[k].country = TrimLeft(fields[1]); - team.plr[k].data = TrimLeft(fields[2]); - team.plr[k].sex = TrimLeft(fields[3]); - team.plr[k].codetitle = TrimLeft(fields[4]); - team.plr[k].idfide = StrIntValue(fields[5]); - team.plr[k].ratingfide = StrIntValue(fields[6]); - team.plr[k].idnat = StrIntValue(fields[7]); - team.plr[k].ratingnat = StrIntValue(fields[8]); - team.plr[k].kcoeff = StrIntValue(fields[9]); - team.plr[k].isAvailable = TrimLeft(fields[10]); - if (TD.IS_FIDE_TOURNAMENT) { // set the rating used during the tournament - team.plr[k].RATING = team.plr[k].ratingfide; - if (team.plr[k].ratingfide == 0) team.plr[k].RATING = team.plr[k].ratingnat; - } - else team.plr[k].RATING = team.plr[k].ratingnat; - } - for (k=0; k= 1) tab3.SpinRoundCB(); - else tab3.arrp.Clear(); - UpdateInfo("xxxx", "yyyy", t_("Deleted Round ") + AsString(TD.currentRound+1)); -} - -void VegaMain::ReopenRegistrationCB() -{ - if (!TD.IS_CLOSED_REGISTRATION) { - Exclamation( t_("The tournament is not closed!")); - return; - } - if(!PromptYesNo( t_("[s0;=* Do you want to [@6 REOPEN] the Registration?&][s0;=* All your data will be lost]") )) return; // go back - if(!PromptYesNo( t_("[s0;=* LAST WARNING!&][s0;=* Do you want to [@6 REOPEN] the Registration?&][s0;=* All your data will be lost]") )) return; // go back TD.Start(); - // TD.SaveVegFile(true); // save what done so far - TD.IS_TORNEO_STARTED = true; - TD.IS_SAVED_ROUND = false; - TD.IS_CLOSED_REGISTRATION = false; - TD.STATUS_ROUND = READY_FOR_PAIRING; - TD.DeleteRound(1, TD.currentRound); - TD.currentRound = 0; - tab3.SetSpinRound(1); - tab3.arrp.Clear(); - //tab1.arr.Removing(true); //players can be deleted - tab1.arr.Moving(true); //players can be moved - UpdateInfo("vcvx", "czzxc", t_("Reopened registration")); -} - -void VegaMain::Exit() -{ //if (!PromptYesNo( t_("All your data will be lost.&Do you want to continue?")) ) return;; - int answer; - answer = Prompt( t_("Closing Vega"), Vega5Img::exitprog(), t_("[s0;=*@6 All your data will be lost.&][s0;=*@6 Do you want to continue?]"), - t_("Save-Exit"), t_("Exit"), t_("Cancel"), 50); - if (answer==0) Close(); - else if (answer==1) { - SaveTournament(); - Close(); - } - else return; -} - -//from extras -void VegaMain::Extras(Bar& bar) -{ - bar.Add(t_("Sort Cross Table"), THISBACK(SortCrossTable)); - bar.Add(t_("Rank Rating Group"), THISBACK(RankRatedGroupCB)); - bar.Add(t_("Rank Date Group"), THISBACK(RankDateGroupCB)); - bar.Add(t_("Round Robin Calendar"), THISBACK(RoundRobinCalendar)); - bar.Add(t_("Missing Point Score system"), THISBACK(MPScoreSystem)); - bar.Separator(); -// bar.Add(t_("Make small badge"), THISBACK(MakeSBadge)); -// bar.Add(t_("Make large badge"), THISBACK(MPScoreSystem)); -//// bar.Add(t_("Print Receipts"), THISBACK(PrintReceipt)); -//// bar.Separator(); - bar.Add(t_("Backup *.veg file"), THISBACK(BackupVegFile)); - bar.Add(t_("Find Duplicate Player"), THISBACK(FindDuplicate)); - bar.Add(t_("Select Language"), THISBACK(SelectLanguage)); -// bar.Add(t_("DB conversion utility"), THISBACK(DBConversion)); -} - -//from extras -void VegaMain::Report(Bar& bar) -{ - bar.Add(t_("Fide"), Vega5Img::fide(),THISBACK(FideReport)); - bar.Add("FSI", Vega5Img::ita(), THISBACK(FSIReportCB)); - bar.Add("USCF", Vega5Img::uscf(), THISBACK(USCFReportMenu)); - -} - -void VegaMain::SelectLanguage(Bar& bar) -{ - bar.Add(t_("English"), THISBACK1(ChooseLng, 1));//.Radio(true); - bar.Add(t_("Italian"), THISBACK1(ChooseLng, 2));//.Radio(false); - bar.Add(t_("German"), THISBACK1(ChooseLng, 3));//.Radio(false); - bar.Add(t_("French"), THISBACK1(ChooseLng, 4));//.Radio(false); - bar.Add(t_("Spanish"), THISBACK1(ChooseLng, 5));//.Radio(false); - bar.Add(t_("Russian"), THISBACK1(ChooseLng, 6));//.Radio(false); - bar.Add(t_("Portuguese"), THISBACK1(ChooseLng, 7));//.Radio(false); - -} - -void VegaMain::MakeSBadge() -{ -} - -void VegaMain::PrintReceipt() -{ // produce receipt files - int i; - WithDialogLayout dlg; - CtrlLayoutOK(dlg, t_("Enter the registration fee")); - dlg.Execute(); - String fee = AsString(~dlg.number); - FileOut savehtml(TD.PATHDIR + "receipt.txt"); - for (i=1; i<=TD.NPlayer; i++) - { savehtml << NFormat( "%-15s%-25s | %-15s%-25s\n", "Receipt of:", fee, "Receipt of:", fee ); - savehtml << NFormat( "%-40.40s | %-40.40s\n", TD.NAMETORNEO, TD.NAMETORNEO ); - savehtml << NFormat( "%-40s | %-40s\n", player[i].name, player[i].name); - savehtml << NFormat( "%-10s signature..................... | %-10s signature.....................\n", TD.DATATORNEO_B, TD.DATATORNEO_B); - savehtml << "\n - - - - - - - - - - - -\n\n"; - } - savehtml.Close(); -} - - -void VegaMain::ChooseLng(int lng) -{ - switch (lng) - { case 1: TD.LANGUAGE = "EN-US"; break; //default English - case 2: TD.LANGUAGE = "IT-IT"; break; //Italian - case 3: TD.LANGUAGE = "DE-DE"; break; //German - case 4: TD.LANGUAGE = "FR-FR"; break; //French - case 5: TD.LANGUAGE = "ES-ES"; break; //Spanish - case 6: TD.LANGUAGE = "RU-RU"; break; //Russian - case 7: TD.LANGUAGE = "PT-PT"; break; //Russian - } - PromptOK( t_("Please close and restart the program&to make active the change") ); -} - -void VegaMain::FideReport(Bar& bar) -{ - bar.Add(t_("Rating Report to FIDE"), THISBACK(FIDERatingReportCB)); - bar.Add(t_("Rating variation"), THISBACK(FideEloVariation)); - bar.Add(t_("History card"), THISBACK(FidePlayerCard)); - bar.Add(t_("Find Norm"), THISBACK(FindNorm)); - bar.Add(t_("FIDE norm certificate"), THISBACK(PrintFIDECertificateCB)); - bar.Add(t_("Statistics"), THISBACK(ShowStatistics)); -} - -void VegaMain::ShowStatistics() -{ if (!TD.IS_CLOSED_REGISTRATION) { - Exclamation(t_("Option available after the closure&of the registration")); - return; - } - TD.ShowTableStat(); - tabs.Set(2); - -} - -void VegaMain::FindNorm() -{ if (!TD.IS_CLOSED_REGISTRATION) { - Exclamation(t_("Option available after the closure&of the registration")); - return; - } - TD.FindNorm(); - tabs.Set(2); - - -} - -void VegaMain::FIDERatingReportCB() -{ if (!TD.IS_CLOSED_REGISTRATION) { - Exclamation(t_("Option available after the closure&of the registration")); - return; - } - FIDERatingReport dlg; - dlg.Execute(); -} - -void VegaMain::PrintFIDECertificateCB() -{ if (!TD.IS_CLOSED_REGISTRATION) { - Exclamation(t_("Option available after the closure&of the registration")); - return; - } - FIDECertificate dlg; - dlg.Execute(); -} - -void VegaMain::FideEloVariation() -{ if (!TD.IS_CLOSED_REGISTRATION) { - Exclamation(t_("Option available after the closure&of the registration")); - return; - } - TD.FideEloVariation(TD.NPlayer); - tabs.Set(2); - -} - -void VegaMain::FidePlayerCard() -{ if (!TD.IS_CLOSED_REGISTRATION) { - Exclamation(t_("Option available after the closure&of the registration")); - return; - } - TD.FidePlayerCard(); - tabs.Set(2); - -} - - -void VegaMain::FSIReportCB() -{ if (!TD.IS_CLOSED_REGISTRATION) { - Exclamation(t_("Option available after the closure&of the registration")); - return; - } - TD.SaveFSIRatingReport(); -// TD.FindNormFSI(); - PromptOK( t_("DONE") ); -} - -void VegaMain::USCFReportMenu(Bar& bar) -{ - bar.Add(t_("Process current section"), THISBACK(USCFSectionReportCB)); - bar.Add(t_("Tournament Report (all sections) "), THISBACK(USCFTournamentReportCB)); -} - -void VegaMain::USCFSectionReportCB() -{ if (!TD.IS_CLOSED_REGISTRATION) { - Exclamation(t_("Option available with a running tournament")); - return; - } - USCFSectionReport dlg; - dlg.Execute(); -} - -void VegaMain::USCFTournamentReportCB() -{ - USCFReport dlg; - dlg.Execute(); -} - -void VegaMain::SortCrossTable() -{ if (!TD.IS_CLOSED_REGISTRATION) { - Exclamation(t_("Option available after the closure&of the registration")); - return; - } - TD.SortedCross(TD.NPlayer, 1); - tabs.Set(2); - -} - - -void VegaMain::RankDateGroupCB() -{ if (!TD.IS_CLOSED_REGISTRATION) { - Exclamation(t_("Option available after the closure&of the registration")); - return; - } - RankDateGroup dlg; - dlg.Execute(); - tabs.Set(2);// PromptOK( t_("DONE") ); - -} - -void VegaMain::RankRatedGroupCB() -{ if (!TD.IS_CLOSED_REGISTRATION) { - Exclamation(t_("Option available after the closure&of the registration")); - return; - } - RankRatedGroup dlg; - dlg.Execute(); - tabs.Set(2); - -} - -void VegaMain::RoundRobinCalendar() -{ if (!TD.IS_CLOSED_REGISTRATION) { - Exclamation(t_("Option available after the closure&of the registration")); - return; - } - if (TD.IS_SWISS) { - Exclamation(t_("Option available only for Round Robin system!")); - return; - } - TD.RoundRobinCalendar(); - tabs.Set(2); - -} - -void VegaMain::MPScoreSystem() -{ if (!TD.IS_CLOSED_REGISTRATION) { - Exclamation(t_("Option available after the closure&of the registration")); - return; - } - if (TD.IS_SWISS) TD.ForlanoScoreSystem(TD.NPlayer); - else PromptOK( t_("Option not available for Round Robin") ); -} - -void VegaMain::BackupVegFile() -{ if (!TD.IS_CLOSED_REGISTRATION) { - Exclamation(t_("Option available after the closure&of the registration")); - return; - } - TD.SaveVegFile(false); - Exclamation( "Saved .BAK veg file" ); -} - -void VegaMain::FindDuplicate() -{ int i, j; //TD.SaveVegFile(false); - String message = ""; - String first, second; - for (i=1; i<=TD.NPlayer; i++) { - first = player[i].name; - for (j=i+1; j<=TD.NPlayer; j++) { - second = player[j].name; - if ( first==second ) message << "[s0;*2 " + AsString(second) + "] &"; - } - } - if ( !IsNull(message) ) Exclamation( t_("Found the following duplicates: &") + message); - else PromptOK( t_("There are no duplicate")); -} - -void VegaMain::DBConversion() -{ - TD.ConvertUSCFDB(); -} - -// from Help -void VegaMain::Help(Bar& bar) -{ - bar.Add(t_("Content"), THISBACK(HelpContent)); - bar.Separator(); - bar.Add(t_("Registered to ..."), THISBACK(HelpRegistered)); - bar.Separator(); - bar.Add(t_("About"), THISBACK(HelpAbout)); -} - -void VegaMain::HelpContent() -{ - PromptOK( "Please refer to the user manual" ); -} - -void VegaMain::HelpRegistered() -{ - PromptOK( "[s0;=/ [*@6 " + TD.USER_REGISTERED ); -} - -void VegaMain::HelpAbout() -{ - PromptOK("[s0;=*@(0.0.255)5 Vega 5.0.10 Beta&][s0;=C www.vegachess.com&][s0;=*/ [*/ author ]Luigi Forlano&][s0;=C2 forlano`@vegachess.com&][s0;=*+117 &][s0;= Vega uses the Crossplatform GUI library Ultimate`+`+&][s0;= http://www.ultimatepp.org]"); -} - -void VegaMain::SetBars() -{ - mainmenu.Set(THISBACK(VegaMainMenu)); -} - -void VegaMain::SetTabs() -{ - tabs.Add(tab1,t_(" Players Archive ")); - // tabs.Add(tab3,t_(" Round Manager ")); - // tabs.Add(tab4,t_(" Output ")); -} - -void VegaMain::CloseRegistration() -{ // preliminary check - if(TD.IS_CLOSED_REGISTRATION) { - String str; - if (TD.STATUS_ROUND == READY_FOR_PAIRING) str = t_("waiting new pairing"); - else str = t_("waiting result of current round"); - Exclamation( "[s0;=~~~3424;@(0.0.255)The registration were ALREADY closed!&]" - "[s0;=@6+117 [@0 current tournament status: ]" + str + "]"); - return; - } - if(TD.NPlayer<6 && TD.IS_SWISS) { - Exclamation( t_("Add at least 6 players for a swiss system")); - return; - } - if(TD.NPlayer <= TD.NRounds && TD.IS_SWISS) { - Exclamation( t_("Too many rounds")); - return; - } - if((TD.NPlayer<3 || TD.NPlayer>24) && !TD.IS_SWISS) { - Exclamation( t_("wrong number of players")); - return; - } - if( TD.NPlayer >= (2<n) i = 1; - } - arrs[i] = 0; - arrid[k] = i; //set the ID - } - } - else { // as they appear in the player list - for (i=0; i=TD.MAX_PLAYERS) { - Exclamation(t_("exceeded maximum number of players")); - return; - } - else { - Vector pdata; - int board = StrIntValue(AsString(~consoleFrame.editBoardPos)); - consoleFrame.RegisterPlayerCB(pdata); - tab1.arrPlayer.Set(board-1, pdata); - board++; if (board>MAX_BOARDS) board = 1; - consoleFrame.editBoardPos <<= AsString(board); - } -} - -bool VegaMain::Key(dword key, int count) -{ - if(key == K_ENTER) { - if (consoleFrame.slist.IsCursor()) { - if ( TD.NPlayer>=TD.MAX_PLAYERS) { - Exclamation(t_("exceeded maximum number of players")); - } - else { - Vector pdata; - int board = StrIntValue(AsString(~consoleFrame.editBoardPos)); - consoleFrame.RegisterPlayerCB(pdata); - tab1.arrPlayer.Set(board-1, pdata); - board++; if (board>MAX_BOARDS) board = 1; - consoleFrame.editBoardPos <<= AsString(board); - } - } - return true; // key accepted - } - return TopWindow::Key(key, count); -} - -void VegaMain::Init() -{ - tab1.btnAdd.WhenAction = THISBACK(btnAddAction); - tab1.btnModify.WhenAction = THISBACK(btnModifyAction); - tab1.btnRemove.WhenAction = THISBACK(btnRemoveAction); - //need for other layout buttons... - tab1.arr.WhenCtrlsAction = THISBACK(ThreeButtonAction); // get signal from threebutton widget - //tab1.arr.WhenArrayAction = THISBACK(arrCtrlsAction); //update after a delete row//to improve because update two times - tab1.btnPrint.WhenAction = THISBACK(PrintTable); - - tab3.tabpair.btnAuto.WhenAction = THISBACK(DopairingCB); - tab3.tabpair.btnManual.WhenAction = THISBACK(DoManualPairingCB); - tab3.tabinsert.btnModify.WhenAction = THISBACK(ModifyPairingCB); - tab3.tabpair.btnPrint.WhenAction = THISBACK(PrintPairingCB); - tab1.btnClose.WhenAction = THISBACK(CloseRegistration); - consoleFrame.btnClose.WhenAction = THISBACK(ShowStatusBar); - consoleFrame.slist.WhenLeftDouble = THISBACK(AddImportedPlayer); -} diff --git a/uppdev/VegaTeam5/VegaTab1.cpp b/uppdev/VegaTeam5/VegaTab1.cpp deleted file mode 100644 index 72a1cb749..000000000 --- a/uppdev/VegaTeam5/VegaTab1.cpp +++ /dev/null @@ -1,665 +0,0 @@ -#include "VegaMain.h" -#include "Tournament.h" - -//////////////////////////// class option image three state button /////////////////// -void OptionImage::ReFocus() -{ - SetFocus(); -} - -OptionImage::OptionImage() -{ - WhenAction = THISBACK(ReFocus); -} - - -void OptionImage::Paint(Draw& w) { - Size sz = GetSize(); - if(!IsTransparent()) - w.DrawRect(0, 0, sz.cx, sz.cy, SColorFace); - Size isz = Vega5Img::imgYes().GetSize(); //although maybe it would be good to calc from the biggest...? - Size tsz = GetSmartTextSize(w, label, font); - int ty = (sz.cy - tsz.cy) / 2; //text up-down - int iy = (tsz.cy - isz.cy) / 2 + ty; - bool ds = !IsShowEnabled(); - - Image m = (!notnull || threestate) && IsNull(option) ? ds ? Vega5Img::imgMaybe - : IsPush() ? Vega5Img::imgYes - : Vega5Img::imgMaybe : - option == 1 ? ds ? (switchimage ? Vega5Img::imgYes : Vega5Img::imgYes) - : IsPush() ? (switchimage ? Vega5Img::imgYes : Vega5Img::imgYes) - : (switchimage ? Vega5Img::imgYes : Vega5Img::imgYes) - : ds ? (switchimage ? Vega5Img::imgNo : Vega5Img::imgNo) - : IsPush() ? (switchimage ? Vega5Img::imgNo : Vega5Img::imgNo) - : (switchimage ? Vega5Img::imgNo : Vega5Img::imgNo); - w.DrawImage(0, iy, m); - - DrawSmartText(w, isz.cx + 4, ty, tsz.cx, label, font, ds ? SGray : SBlack, VisibleAccessKeys() ? accesskey : 0); - //text length problem - tsz.cx - doesn't work? - adjust *.lay!!! -} - -/////////////////////////////// -void Avail3(One& ctrl) -{ - //ctrl.Create().ThreeState().SetImage(Vega5Img::imgYes(), Vega5Img::imgNo(), Vega5Img::imgMaybe()); - ctrl.Create().SetImage(Vega5Img::imgYes(), Vega5Img::imgNo(), Vega5Img::imgMaybe()); -} - -int FilterCommaSpace(int c) -{ - if (c == ';' || c =='\\') return false; - else return c; -} - -int FilterComma(int c) -{ - if (c == ';') return false; - else return c; -} - -VegaTab1::VegaTab1() -{ // set the widths of each coloumn - // arr.ColumnWidths("25 3 5 12 8 8 2 3 3 3 3"); - int i; - countID=1; //è un indice incrementale che cresce sempre - CtrlLayout(*this); - SizePos(); - //id, label, width - arr.AddColumn("ID", t_("ID"), 3).HeaderTab().WhenAction = THISBACK1(SortRecord, 0); //0 - arr.AddColumn("Name", t_("Team Name"), 17).HeaderTab().WhenAction = THISBACK1(SortRecord, 1); //1 - arr.AddColumn("Origin", t_("Origin"), 17).HeaderTab().WhenAction = THISBACK1(SortRecord, 2); ; //2 - arr.AddColumn("Federation", t_("Fed"), 17).HeaderTab().WhenAction = THISBACK1(SortRecord, 3); ; //3 - arr.AddColumn("Rating", t_("Rating"), 6).HeaderTab().WhenAction = THISBACK1(SortRecord, 4); //4 - arr.AddColumn("Status", t_("Status"), 6); //.Ctrls(Avail3); //5 - - //drop list widget - edtTitleP.Add("GM"); - edtTitleP.Add("WGM"); - edtTitleP.Add("IM"); - edtTitleP.Add("WIM"); - edtTitleP.Add("FM"); - edtTitleP.Add("WFM"); - edtTitleP.Add("M"); - edtTitleP.Add("CM"); - edtTitleP.Add("1N"); - edtTitleP.Add("2N"); - edtTitleP.Add("3N"); - edtTitleP.Add("A"); - edtTitleP.Add("B"); - edtTitleP.Add("C"); - edtTitleP.Add("D"); - edtTitleP.Add("E"); - edtTitleP.Add("F"); - edtTitleP.Add("G"); - edtTitleP.Add("H"); - edtTitleP.Add("NC"); - edtTitleP.Add("--"); - edtTitleP <<= "GM"; - -// optGenderP.SetImage(Vega5Img::female(), Vega5Img::male()); // false state, true state -// optGenderP <<= 1; -// optStatusP.SetImage(Vega5Img::imgNo(), Vega5Img::imgYes()); // false state, true state - optGenderP <<= "m"; - optStatusP <<= 1; - arrPlayer.TabAddsRow(false); - arrPlayer.AddColumn("Name", t_("Name"), 17).Edit(edtNameP.MaxChars(25)); - arrPlayer.AddColumn("Country", t_("Fed"), 3).Edit(edtCountryP.MaxChars(20)); - arrPlayer.AddColumn("Birthday", t_("Birthday"), 5).Edit(edtBirth.MaxChars(10)); - arrPlayer.AddColumn("Gender", t_("G"), 2).Edit(optGenderP); - arrPlayer.AddColumn("Title", t_("Title"), 5).Edit(edtTitleP); - arrPlayer.AddColumn("IDFIDE", t_("ID FIDE"), 5).Edit(edtIDFideP.Min(0).MaxChars(8)) ; - arrPlayer.AddColumn("RatFIDE", t_("Rtg FIDE"), 5).Edit(edtRtgFideP.Min(0).MaxChars(4)) ; - arrPlayer.AddColumn("IDNat", t_("ID Nat"), 5).Edit(edtIDNatP.Min(0).MaxChars(8)) ; - arrPlayer.AddColumn("RatNat", t_("Rtg Nat"), 5).Edit(edtRtgNatP.Min(0).MaxChars(4)) ; - arrPlayer.AddColumn("K", t_("K"), 3).Edit(edtKP.Min(0).MaxChars(2)) ; - arrPlayer.AddColumn("Status", t_("Status"), 4).Edit(optStatusP); -// for (i=0; i=TD.MAX_PLAYERS && !modifyFLAG) { - Exclamation( t_("Too much players! Stop with the registration")); - return; - } -// if( TD.IS_SWISS && TD.IS_CLOSED_REGISTRATION && !modifyFLAG) { -// if (!PromptYesNo(t_("Do you want to add a Late-Comer to the tournament?&You will not be able to delete him again")) ) -// return; -// } - - //set default in case of null or empty fields - if ( IsNull(AsString(~editOrigin)) ) editOrigin <<= "---"; - if ( IsNull(AsString(~editCountry)) ) editCountry <<= "---"; - if ( IsNull(AsString(~editRatFIDE)) ) editRatFIDE <<= 0; - - if (modifyFLAG) { //Modify - int int_row; - int_row=arr.GetCursor(); - if (int_row < 0) return; // prevent the crash of the application when int_row = -1) - arr.Set( int_row, 1, ~editName); - arr.Set( int_row, 2, ~editOrigin); - arr.Set( int_row, 3, ~editCountry); - arr.Set( int_row, 4, ~editRatFIDE); - arr.Set( int_row, 5, ~btnAvail); - TD.SaveVegFile(true); // make active the player for the next round - - int id = StrIntValue( AsString( arr.Get(int_row, 0)) ); // get ID - String strID = AsString( id ); - - TeamArchive& team = db.Get(strID); - team.name = TrimRight(TrimLeft( AsString(~editName) ) ); - team.origin = AsString(~editOrigin); - team.country = AsString(~editCountry); - team.ratingfide = 0; //for the moment - team.isAvailable = AsString(~btnAvail); - - for (i=0; iGet(i-1, "Name")) ); - if (~opt[2]) s << NFormat( "%3.3s ", AsString(arr->Get(i-1, "Country"))); - if (~opt[3]) s << NFormat( "%8.8s ", AsString(arr->Get(i-1, "Birthday"))); - if (~opt[4]) s << NFormat( "%s ", AsString(arr->Get(i-1, "Gender"))); - if (~opt[5]) s << NFormat( "%3.3s ", AsString(arr->Get(i-1, "Title"))); - if (~opt[6]) s << NFormat( "%8.8s ", AsString(arr->Get(i-1, "IDFIDE"))); - if (~opt[7]) s << NFormat( "%8.8s ", AsString(arr->Get(i-1, "RatFIDE"))); - if (~opt[8]) s << NFormat( "%8.8s ", AsString(arr->Get(i-1, "IDNat"))); - if (~opt[9]) s << NFormat( "%8.8s ", AsString(arr->Get(i-1, "RatNat"))); - if (~opt[10]) s << NFormat( "%2s ", AsString(arr->Get(i-1, "K"))); - out.PutLine(s); - } - } - else { - out.PutLine("\n The following players got a BYE:\n"); - for (i=1; i<=TD.NPlayer; i++) - { String s = ""; - if ( IsNull(player[i].isAvailable) ) { - if (~opt[0]) s << NFormat( "%3d ", i); - if (~opt[1]) s << NFormat( "%-25.25s ", player[i].name); - if (~opt[2]) s << NFormat( "%3.3s ", player[i].country); - if (~opt[3]) s << NFormat( "%8.8s ", player[i].data); - if (~opt[4]) s << NFormat( "%s ", player[i].sex); - if (~opt[5]) s << NFormat( "%3.3s ", player[i].codetitle); - if (~opt[6]) s << NFormat( "%8d ", player[i].idfide); - if (~opt[7]) s << NFormat( "%5d ", player[i].ratingfide); - if (~opt[8]) s << NFormat( "%8d ", player[i].idnat); - if (~opt[9]) s << NFormat( "%5d ", player[i].ratingnat); - if (~opt[10]) s << NFormat( "%2d ", player[i].kcoeff); - if (~opt[11]) s << NFormat( "%2s", player[i].isAvailable); - out.PutLine(s); - } - } - out.PutLine("\n The following player(s) withdrew:\n"); - for (i=1; i<=TD.NPlayer; i++) - { String s = ""; - if (player[i].isAvailable== "0") { - if (~opt[0]) s << NFormat( "%3d ", i); - if (~opt[1]) s << NFormat( "%-25.25s ", player[i].name); - if (~opt[2]) s << NFormat( "%3.3s ", player[i].country); - if (~opt[3]) s << NFormat( "%8.8s ", player[i].data); - if (~opt[4]) s << NFormat( "%s ", player[i].sex); - if (~opt[5]) s << NFormat( "%3.3s ", player[i].codetitle); - if (~opt[6]) s << NFormat( "%8d ", player[i].idfide); - if (~opt[7]) s << NFormat( "%5d ", player[i].ratingfide); - if (~opt[8]) s << NFormat( "%8d ", player[i].idnat); - if (~opt[9]) s << NFormat( "%5d ", player[i].ratingnat); - if (~opt[10]) s << NFormat( "%2d ", player[i].kcoeff); - if (~opt[11]) s << NFormat( "%2s", player[i].isAvailable); - out.PutLine(s); - } - } - } - out.Close(); - Close(); - printed = true; -} - -void PrintTableDlg::PrintPartecipantsHTML() -{ int i; - String name[12]; - name[0] = "ID"; - name[1] = "Name"; - name[2] = "Fed"; - name[3] = "Birthday"; - name[4] = "Gender"; - name[5] = "Title"; - name[6] = "ID_FIDE"; - name[7] = "RtgF"; - name[8] = "ID_Nat"; - name[9] = "RtgN"; - name[10]= "K"; - name[11]= "Status"; - - // produce HTML files - FileOut savehtml(TD.PATHDIRWWW + "players.html"); - savehtml << TD.HTMLCommonHeader(); - savehtml << TD.HTMLNavBar(); - - savehtml << "

" << TD.NAMETORNEO << "

\n"; - savehtml << "

" << TD.PLACETORNEO << " - " << TD.DATATORNEO_B <<", "<\n"; - savehtml << "

List of participants

\n"; - savehtml << " \n"; - savehtml << "\n"; - - savehtml << ""; - - for (i=0; i<=10; i++) //exclude the Status field - if (~opt[i]) savehtml << name[i]; - savehtml << "\n"; - - for (i=1; i<=TD.NPlayer; i++) - { if ((i+1)&1) savehtml << " "; - else savehtml << " "; - - if (~opt[0]) savehtml << NFormat( " ", i); - if (~opt[1]) savehtml << NFormat( "", AsString(arr->Get(i-1, "Name")) ); - if (~opt[2]) savehtml << NFormat( "", AsString(arr->Get(i-1, "Country"))); - if (~opt[3]) savehtml << NFormat( "", AsString(arr->Get(i-1, "Birthday"))); - if (~opt[4]) savehtml << NFormat( "", AsString(arr->Get(i-1, "Gender"))); - if (~opt[5]) savehtml << NFormat( "", AsString(arr->Get(i-1, "Title"))); - if (~opt[6]) savehtml << NFormat( "", AsString(arr->Get(i-1, "IDFIDE"))); - if (~opt[7]) savehtml << NFormat( "", AsString(arr->Get(i-1, "RatFIDE"))); - if (~opt[8]) savehtml << NFormat( "", AsString(arr->Get(i-1, "IDNat"))); - if (~opt[9]) savehtml << NFormat( "", AsString(arr->Get(i-1, "RatNat"))); - if (~opt[10]) savehtml << NFormat( "", AsString(arr->Get(i-1, "K"))); - savehtml << " \n"; - } - savehtml << "\n"; - savehtml << "
%d%s%s%s%s%s%s%s%s%s%s
\n"; - savehtml << "

Generated by Vega

\n"; - savehtml << "

\n\n"; - savehtml.Close(); -} - - -/***************************** ModifyCrossTable Dialog ****************************/ - -ModifyCrossTableDlg::ModifyCrossTableDlg(int idplayer) -{ - CtrlLayout(*this, "Modify the Cross Table"); - - id = idplayer; - lblPlayer.SetLabel( AsString(id) + " " + player[id].name); - - edtRound <<= TD.currentRound; - edtRound.Tip(t_("Set the round to display all other data")); - - //edtRes <<= "0"; - edtOpp.Tip(t_("Game against player 0=BYE&is considered forfeited")); - - edtRes.Add("0"); - edtRes.Add("½"); - edtRes.Add("1"); - edtRes.Add("Null"); - edtRes.Tip(t_("'Null' set the game as 'unplayed'")); - - edtCol.Add("White"); - edtCol.Add("Black"); - edtCol.Add("NOCOL"); - edtCol.Add("NO TB"); - FillEditCB(); - - btnClose.WhenAction = THISBACK(Close); - btnOk.WhenAction = THISBACK(DoneCB); - edtRound.WhenAction = THISBACK(FillEditCB); -} - - -void ModifyCrossTableDlg::FillEditCB() -{ int round = StrIntValue(AsString(~edtRound)); - - if (round<1 || round>TD.currentRound) { - Exclamation(t_("Round out of range")); - return; - } - if (TD.IS_SWISS) { - int opp = TD.playerOpponent[id][round]; - int col = TD.playerColor[id][round]; - int res = TD.roundResult[id][round]; - - edtOpp <<= opp; - - if (opp==0 || col==0) edtCol <<= "NOCOL"; - else if (col == 1) edtCol <<= "White"; - else if (col == -1) edtCol <<= "Black"; - else if (res == 8) edtCol <<= "NO TB"; - - if (res == 0 || res == 4) edtRes <<= "0"; - else if (res == 1 || res == 3) edtRes <<= "1"; - else if (res == 2 || res == 6) edtRes <<= "½"; - else if (opp==0 && col==0 && res==0) edtRes <<= "Null"; - } - else { - int opp = TD.playerOpponentRR[id][round]; - int col = TD.playerColorRR[id][round]; - int res = TD.roundResultRR[id][round]; - - edtOpp <<= opp; - - if (opp==0 || col==0) edtCol <<= "NOCOL"; - else if (col == 1) edtCol <<= "White"; - else if (col == -1) edtCol <<= "Black"; - else if (res == 8) edtCol <<= "NO TB"; - - if (res == 0 || res == 4) edtRes <<= "0"; - else if (res == 1 || res == 3) edtRes <<= "1"; - else if (res == 2 || res == 6) edtRes <<= "½"; - else if (opp==0 && col==0 && res==0) edtRes <<= "Null"; - } -} - - -void ModifyCrossTableDlg::DoneCB() -{ String res, col; - int round, idOpp; - - round = StrIntValue(AsString(~edtRound)); - - if (round<1 || round>TD.currentRound) { - Exclamation(t_("Round out of range")); - return; - } - - idOpp = StrIntValue(AsString(~edtOpp)); - if (idOpp<0 || idOpp>TD.NPlayer || idOpp==id) { - Exclamation(t_("Set a valid opponent for the selected player")); - return; - } - - if (TD.IS_SWISS) { //swiss - if (idOpp == 0) TD.playerOpponent[id][round] = 0; - else TD.playerOpponent[id][round] = idOpp; - - res = AsString(~edtRes); - if ( res=="Null" ) {TD.playerOpponent[id][round] = TD.roundResult[id][round] - = TD.playerColor[id][round] = 0; - TD.AdjournCrossTableSwiss(TD.currentRound); - //return; - Close(); - } - if (idOpp==0) { - if ( res=="1" ) TD.roundResult[id][round] = 3; - else if ( res=="½" ) TD.roundResult[id][round] = 6; - else if ( res=="0" ) TD.roundResult[id][round] = 4; - } - else { - if ( res=="1" ) TD.roundResult[id][round] = 1; - else if ( res=="½" ) TD.roundResult[id][round] = 2; - else if ( res=="0" ) TD.roundResult[id][round] = 0; - } - - col = AsString(~edtCol); - if ( col == "NOCOL" ) TD.playerColor[id][round] = 0; //NO_COLOR; - else if ( col == "Black" ) TD.playerColor[id][round] = -1; //BLACK_COLOR; - else if ( col == "White" ) TD.playerColor[id][round] = 1; //WHITE_COLOR; - else { TD.playerColor[id][round] = 0; - TD.roundResult[id][round] = 8; // generic code for forfeited game with no bucholz - } - TD.AdjournCrossTableSwiss(TD.currentRound); - } - else { // round robin - if (idOpp == 0) TD.playerOpponentRR[id][round] = 0; - else TD.playerOpponentRR[id][round] = idOpp; - - res = AsString(~edtRes); - if ( res=="Null" ) { TD.playerOpponentRR[id][round] = TD.roundResultRR[id][round] - = TD.playerColorRR[id][round] = 0; - TD.AdjournCrossTableRR(TD.currentRound); - Close(); - //return; - } - if (idOpp==0) { - if ( res=="1" ) TD.roundResultRR[id][round] = 3; - else if ( res=="½" ) TD.roundResultRR[id][round] = 6; - else if ( res=="0" ) TD.roundResultRR[id][round] = 4; - } - else { - if ( res=="1" ) TD.roundResultRR[id][round] = 1; - else if ( res=="½" ) TD.roundResultRR[id][round] = 2; - else if ( res=="0" ) TD.roundResultRR[id][round] = 0; - } - - col = AsString(~edtCol); - if ( col == "NOCOL" ) TD.playerColorRR[id][round] = 0; //NO_COLOR; - else if ( col == "Black" ) TD.playerColorRR[id][round] = -1; //BLACK_COLOR; - else if ( col == "White" ) TD.playerColorRR[id][round] = 1; //WHITE_COLOR; - else { TD.playerColorRR[id][round] = 0; - TD.roundResultRR[id][round] = 8; // generic code for forfeited game with no bucholz - } - TD.AdjournCrossTableRR(TD.currentRound); - } - Close(); -} diff --git a/uppdev/VegaTeam5/VegaTab2.cpp b/uppdev/VegaTeam5/VegaTab2.cpp deleted file mode 100644 index fb659ab55..000000000 --- a/uppdev/VegaTeam5/VegaTab2.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include "VegaMain.h" -#include "Tournament.h" - - -VegaTab2::VegaTab2() -{ - CtrlLayout(*this); - SizePos(); - //id, label, width - arrp.AddColumn("Board", "Board", 4) ; //0 - arrp.AddColumn("White", "White Player", 25); //1 - arrp.AddColumn("Black", "Black Player", 25); //1 - arrp.AddColumn("ID", "IDW-IDB", 8); //3 - arrp.EvenRowColor(); - arrp.SetLineCy(19); //option image adjustment... -} - - - -void VegaTab2::ShowPairingCB() -{ int i, npair, code; - int idw, idb, res; - arrp.Clear(); - if (TD.IS_SWISS) npair = TD.pairing[0][TD.currentRound]; - else npair = TD.pairingRR[0][TD.currentRound]; - for (i=1; i<=npair; i++) - { if (TD.IS_SWISS) code = TD.pairing[i][TD.currentRound]; - else code = TD.pairingRR[i][TD.currentRound]; - TD.DecodeResult(code, &idw, &idb, &res); - arrp.Add( AsString(i), - NFormat("%-25.25s (%4.1f)", player[idw].name, 0.), - NFormat("%-25.25s (%4.1f)", player[idb].name, 0.), - NFormat("%3d - %3d", idw, idb)); - arrp.GoEnd(); - } -} diff --git a/uppdev/VegaTeam5/VegaTab3.cpp b/uppdev/VegaTeam5/VegaTab3.cpp deleted file mode 100644 index ea68ccbef..000000000 --- a/uppdev/VegaTeam5/VegaTab3.cpp +++ /dev/null @@ -1,711 +0,0 @@ -#include "VegaMain.h" -#include "Tournament.h" - -struct FontDisplay2 : Display { - virtual void Paint(Draw& w, const Rect& r, const Value& q, - Color ink, Color paper, dword style) const - { - Font fnt = Courier(14).Bold(); //Font(q, r.Height() - 2); - // String txt = Font::GetFaceName(q); - String txt = AsString(q); - w.DrawRect(r, paper); - w.DrawText(r.left + 2, r.top + (r.Height() - GetTextSize(txt, fnt).cy) / 2, txt, fnt, ink); // <- Change is here - "w." no more needed - //w.DrawText(r.left + 2+1, r.top + (r.Height() - GetTextSize(txt, fnt).cy) / 2, txt, fnt, ink); // <- Change is here - "w." no more needed - } -}; - -void EditResult(One& ctrl) -{ - ctrl.Create().MaxChars(1); -} - - -VegaTab3::VegaTab3() -{ - CtrlLayout(*this); - SizePos(); - CtrlLayout(tabpair); - CtrlLayout(tabinsert); - tabsPairInsert.Add(tabpair, t_("New Pairing")); - tabsPairInsert.Add(tabinsert, t_("Insert/Modify Result")); - - //id, label, width - arrp.AddColumn("Board", t_("Bo."), 3) ; //0 - arrp.AddColumn("White", t_("White Player"), 19).SetDisplay(Single()); //1 - arrp.AddColumn("Black", t_("Black Player"), 19).SetDisplay(Single()); //2 - arrp.AddColumn("ID", t_("IDW-IDB"), 4); //3 - arrp.AddColumn("Edit", "code", 4).Ctrls(EditResult); //4 -// arrp.AddColumn("Edit", "code", 3).Ctrls(); //3 - arrp.AddColumn("Result", t_("Result"), 4); //5 -// arrp.AddColumn("code", "code pairing", 5).HeaderTab().WhenAction = THISBACK1(HideTab, &arrp); //6 - arrp.AddColumn("code", "code pairing", 5); //6 - arrp.EvenRowColor(); - arrp.SetLineCy(EditField::GetStdHeight()); - arrp.WhenCtrlsAction = THISBACK(UpdateLabelResultCB); - arrp.WhenEnterKey = THISBACK(StartArrayCursor); - arrp.WhenLeftDouble = THISBACK(SwapColorsCB); - HideTab(&arrp); //remove the column 5 - arrp.Tip(t_("Double click to exchange the colors")); - arrp.HeaderObject().HideTab(4); - arrp.HeaderObject().HideTab(6); -// tabpair - spinRound <<= 1; - round = TD.currentRound; - spinRound.SetFont(StdFont(18).Bold()).WhenAction = THISBACK(SpinRoundCB); - - tabpair.optVerbose <<= true; - tabpair.optVerbose.Tip(t_("Save the explanation pairing file")); - tabpair.optVerbose.WhenAction = THISBACK1(SetOptionCB, 1); - tabpair.optThree.WhenAction = THISBACK1(SetOptionCB, 2); - tabpair.optThree.Tip(t_("Permit the same color\nthree time in a row")); - tabpair.optDanubian.WhenAction = THISBACK1(SetOptionCB, 3); - tabpair.optDanubian.Tip(t_("Enable the Danubian variant\nfor the dubov system")); - - tabpair.btnVerbose <<= THISBACK(ShowVerboseCB); - tabpair.btnManual.SetImage(Vega5Img::manual() ); - tabpair.btnAuto.SetImage(Vega5Img::computer() ); - tabpair.btnPrint.SetImage(CtrlImg::print()); - tabpair.btnVerbose.SetImage(Vega5Img::verbose()); - -// tabinsert - tabinsert.btn0.SetLabel("0 - 1 [0]"); - tabinsert.btn5.SetLabel("½ - ½ [5]"); - tabinsert.btn3.SetLabel("1F - 0 [3]"); - tabinsert.btn4.SetLabel("0 - 1F [4]"); - tabinsert.btn1.SetLabel("1 - 0 [1]"); - tabinsert.btn2.SetLabel("0F - 0F [2]"); - tabinsert.btn0 <<= THISBACK1(BtnResultCB, 0); - tabinsert.btn1 <<= THISBACK1(BtnResultCB, 1); - tabinsert.btn2 <<= THISBACK1(BtnResultCB, 2); - tabinsert.btn3 <<= THISBACK1(BtnResultCB, 3); - tabinsert.btn4 <<= THISBACK1(BtnResultCB, 4); - tabinsert.btn5 <<= THISBACK1(BtnResultCB, 5); - tabinsert.btn7 <<= THISBACK1(BtnResultCB, 7); - tabinsert.btn8 <<= THISBACK1(BtnResultCB, 8); - - tabinsert.btnModify.SetImage(Vega5Img::modifypair()); - tabinsert.btnUpdate.SetImage(Vega5Img::update()); - tabinsert.btnLoad <<= THISBACK(LoadResultCB); - tabinsert.btnLoad.SetImage(CtrlImg::open()); - //tabinsert.btnImprove.Disable(); - tabinsert.btnImprove.SetImage(Vega5Img::colors()); - tabinsert.btnUpdate <<= THISBACK1(UpdateData, 1); -} - -void VegaTab3::SetOptionCB(int flag) -{ - switch (flag) - { case 1: if (~tabpair.optVerbose) TD.IS_SET_VERBOSE = true; - else TD.IS_SET_VERBOSE = false; - break; - case 2: if (~tabpair.optThree) TD.PERMIT3COLOR = true; - else TD.PERMIT3COLOR = false; - break; - case 3: if (~tabpair.optDanubian) TD.DROP_PLAYER = true; - else TD.DROP_PLAYER = false; - break; - } -} - -void VegaTab3::SpinRoundCB() -{ - round = StrIntValue(AsString(~spinRound)); - if (round<1 || round>TD.currentRound) { - if (TD.IS_CLOSED_REGISTRATION) Exclamation(t_("Round not valid")); - spinRound <<= TD.currentRound; - round = TD.currentRound; - // ShowPairingCB(); - // return; - } - else if (round!=TD.currentRound && TD.STATUS_ROUND==READY_FOR_INSERTION) { - Exclamation(t_("You cannot visualize other rounds.&First insert the results of the current round")); - spinRound <<= TD.currentRound; - round = TD.currentRound; - // ShowPairingCB(); - // return; - } - //else ShowPairingCB(); - ShowPairingCB(); -} - -void VegaTab3::HideTab(ArrayCtrl *x) -{ - x->HeaderObject().HideTab(6); - x->HeaderObject().HideTab(4); -} - -/* -bool VegaTab3::Key(dword key, int count) -{ - if(key == K_1) { - Exclamation("1"); - // if (slist.IsCursor()) MoveItemCB(); - return true; // key accepted - } - return TopWindow::Key(key, count); -} -*/ - -void VegaTab3::ShowPairingCB() -{ int i, npair, code; - int idw, idb, res; - arrp.Clear(); - if (TD.IS_SWISS) npair = TD.pairing[0][round]; - else npair = TD.pairingRR[0][round]; - for (i=1; i<=npair; i++) - { if (TD.IS_SWISS) code = TD.pairing[i][round]; - else code = TD.pairingRR[i][round]; - TD.DecodeResult(code, &idw, &idb, &res); - if (!TD.IS_SWISS && (TD.NPlayer&1) && i==npair) { } //skip, do nothing - else arrp.Add( AsString(i), - NFormat("%-20.20s (%4.1f)", player[idw].name, player[idw].tiebreak[SCORE]), - NFormat("%-20.20s (%4.1f)", player[idb].name, player[idb].tiebreak[SCORE]), - NFormat("%3d - %3d", idw, idb), - "", - TD.LabelResult( res, code, round), - AsString (code) ); - } - arrp.GoBegin(); -} - -// calling from hided editint widget -void VegaTab3::UpdateLabelResultCB() -{ int int_row = arrp.GetCursor(); - int idw, idb, newresult, board, code, res; - String str; - if (int_row < 0) return; //prevent the crash of the application when int_row = -1) - Value v = arrp.Get(int_row, 4); - if ( IsNull(v) ) return; //to avoid non digit key - newresult = StrIntValue(AsString(v)); //get the inserted result - code = StrIntValue(AsString(arrp.Get(int_row, 6))); //get the code result in the hided column to discover if we are changing - if (newresult==9 || newresult==6) { - arrp.Set( int_row, 4, ""); // clear the edit field - MoveNextPair(int_row + 1); - return; - } - if ( newresult==8 ) { - Exclamation( "If you need to insert a non standard result& please use the appropriate button"); - arrp.Set( int_row, 4, ""); // clear the edit field - MoveNextPair(int_row + 1); - return; - } - else { - TD.DecodeResult(code, &idw, &idb, &res); // get the old result - if (res!=9 && newresult!=res) { // changing an old result - if (!PromptOKCancel(t_("Are you sure do you want&to change an old result?")) ) { //ask confirmation - arrp.Set( int_row, 4, ""); // clear - return; // go away - } - } - str = TD.LabelResult( newresult, 0, 0) ; - arrp.Set( int_row, 5, str); // set the new label result to the right - arrp.Set( int_row, 4, ""); // clear the edit field - arrp.Set( int_row, 6, AsString(TD.CodifyResult(idw,idb,newresult))); //set new value - board = int_row + 1; //the array is zero based in contrast with the board index - if (TD.IS_SWISS) TD.pairing[board][round] = TD.CodifyResult(idw,idb,newresult); //set new result - else TD.pairingRR[board][round] = TD.CodifyResult(idw,idb,newresult); //set new result - MoveNextPair(int_row + 1); - } -} - -/* insertedResult++; - if(insertedResult%15==0) { - IS_SAVED_ROUND=0; - SaveFileCB(NULL, 0L, NULL); // save a new updated *.veg file - } -*/ - -void VegaTab3::LoadResultCB() -{ int i, idw, idb, npair, res, round; - String line, fn; - FileSel fs; // for Linux and windows - - if (!TD.IS_SWISS) { - Exclamation(t_("Option not available for Round Robin")); - return; // no color swap - } - fs.Type( t_("Load result file"), "*.res").DefaultExt("res"); - if(fs.ExecuteOpen()) fn = ~fs; // file selected - else return; // no file selected - - FileIn in(fn); - - line = in.GetLine(); - Vector field = Split( line, ' '); - npair = StrIntValue(field[0]); - round = StrIntValue(field[1]); - if (round != TD.currentRound) { - Exclamation( t_("The selected file doens't correspond to the current round!&Please choose the correct one") ); - in.Close(); - return; - } - for (i=1; i<=npair; i++) - { Vector field = Split( line, ' '); - idw = StrIntValue(field[0]); - idb = StrIntValue(field[1]); - res = StrIntValue(field[2]); - TD.pairing[i][round] = TD.CodifyResult(idw,idb,res); //set result for selected round - } - ShowPairingCB(); - in.Close(); -} - -void VegaTab3::StartArrayCursor() -{ arrp.SetCursor(0); -} - -void VegaTab3::MoveNextPair( int position) -{ int board, npair; - String coderesult; -// if (round != currentRound) return position; // there aren't missing result - npair = arrp.GetCount(); - board = position; - while (boardZoomable(); - - filename = TD.PATHDIR + "verbose" + AsString(round) + ".txt" ; - lineeditverbose.SetFont(Courier(11)).Set(LoadFile(filename)); - - filename = TD.PATHDIR + "scgr" + AsString(round) + "-0.txt" ; - lineeditgroup.SetFont(Courier(11)).Set(LoadFile(filename)); -} -*/ -ShowVerboseDlg::ShowVerboseDlg(int round) -{ String filename; - h.Horz(a, v); - v << b; // << c << d; - Add(h.SizePos()); - - filename = TD.PATHDIR + "verbose" + AsString(round) + ".txt" ; - a.SetFont(Courier(11)).Set(LoadFile(filename)); - - filename = TD.PATHDIR + "scgr" + AsString(round) + "-0.txt" ; - b.SetFont(Courier(11)).Set(LoadFile(filename)); -} diff --git a/uppdev/VegaTeam5/VegaTeam5.upp b/uppdev/VegaTeam5/VegaTeam5.upp deleted file mode 100644 index f1fabc794..000000000 --- a/uppdev/VegaTeam5/VegaTeam5.upp +++ /dev/null @@ -1,45 +0,0 @@ -charset "UTF-8"; - -uses - Report, - RichEdit, - GridCtrl; - -file - main.cpp charset "UTF-8", - Vega.iml, - Vega5.rc, - VegaMain.h, - Vega.lay charset "UTF-8", - message.t, - VegaMenu readonly separator, - Console.cpp, - VegaMenus.cpp, - VegaTabs readonly separator, - VegaTab1.cpp, - VegaTab3.cpp, - Tournament readonly separator, - Tournament.h, - Tournament.cpp, - Sort.cpp, - FilterDB.cpp, - Rankgroup.cpp, - Newtournament.cpp, - RoundRobinSystem readonly separator, - RoundRobin.cpp, - SwissSystem readonly separator, - ForlanoScoreSystem.cpp, - RoundSwiss.cpp, - "Rating Report" readonly separator, - USCFreport.cpp, - Nationalreport.cpp, - Fidereport.cpp, - Docs readonly separator, - changelog.txt, - LICENSE.TXT, - todo.txt, - notes.txt, - c++notes.txt; - -mainconfig - "" = "GUI"; diff --git a/uppdev/VegaTeam5/all.i b/uppdev/VegaTeam5/all.i deleted file mode 100644 index 7af82016c..000000000 --- a/uppdev/VegaTeam5/all.i +++ /dev/null @@ -1,3 +0,0 @@ -TOPIC("VegaNotes$en-us") -#include "VegaNotes$en-us.tpp" -END_TOPIC diff --git a/uppdev/VegaTeam5/bug.htm b/uppdev/VegaTeam5/bug.htm deleted file mode 100644 index 45855d6d8..000000000 --- a/uppdev/VegaTeam5/bug.htm +++ /dev/null @@ -1,15 +0,0 @@ - - - -
- - - - - - - - -
- - diff --git a/uppdev/VegaTeam5/bug.swf b/uppdev/VegaTeam5/bug.swf deleted file mode 100644 index f9e7d9426..000000000 --- a/uppdev/VegaTeam5/bug.swf +++ /dev/null @@ -1 +0,0 @@ -FWSދ \ No newline at end of file diff --git a/uppdev/VegaTeam5/ide.ico b/uppdev/VegaTeam5/ide.ico deleted file mode 100644 index 4ae19b31a..000000000 Binary files a/uppdev/VegaTeam5/ide.ico and /dev/null differ diff --git a/uppdev/VegaTeam5/main.cpp b/uppdev/VegaTeam5/main.cpp deleted file mode 100644 index af77af495..000000000 --- a/uppdev/VegaTeam5/main.cpp +++ /dev/null @@ -1,219 +0,0 @@ -#include "VegaMain.h" -#include "Tournament.h" - -#define TFILE -#include - -void ReadConfigFile() -{ VectorMap cfg = LoadIniFile("./vega.cfg"); - String recentdir = cfg.Get("RECENTDIR", Null); - String language = cfg.Get("LANGUAGE", Null); - String pathDB = cfg.Get("PATHDB", Null); -// if ( recentdir.ReverseFind('\\') || recentdir.ReverseFind('\\') ) -// recentdir.Remove( recentdir.GetLength() - 1, 1); // remove the final '\' or '/' - TD.PATHDIR = recentdir; - TD.LANGUAGE = language; - TD.PATHDIRDB = pathDB; - SetDefaultCharset(CHARSET_UTF8); - if ( language == "IT-IT" ) SetLanguage( LNG_('I','T','I','T') ); - else if ( language == "DE-DE" ) SetLanguage( LNG_('D','E','D','E') ); - else if ( language == "FR-FR" ) SetLanguage( LNG_('F','R','F','R') ); - else if ( language == "ES-ES" ) SetLanguage( LNG_('E','S','E','S') ); - else if ( language == "PT-PT" ) SetLanguage( LNG_('P','T','P','T') ); - else if ( language == "RU-RU" ) SetLanguage( LNG_('R','U','R','U') ); - else if ( language == "PT-PT" ) SetLanguage( LNG_('P','T','P','T') ); - else SetLanguage( LNG_('E','N','U','S') ); // default English -} - -void SaveConfigFile() -{ String cfg; - cfg << "RECENTDIR=" << TD.PATHDIR << "\n" - "LANGUAGE=" << TD.LANGUAGE << "\n" - "PATHDB=" << TD.PATHDIRDB << "\n"; - if(!SaveFile("./vega.cfg", cfg)) Exclamation(t_("Error saving configuration file!")); -} - -void ProcessWord(const char words[], String& str) -//void ProcessWord(const char words[], char str[]) -{ char a; - int i, l, k; - const char code [26][51] = { - "VEGA456ISTEINPROGRAMMZURVERWALTUNGVONS3CHAC567HTUR", - "RVOLLRUNDENTURN4IEREVEGAI27STSOAUFGEBAUTDASSESDIEA", - "HRENDEINESTURNI456ERSSOWEITALSMGLICHUNTERSTTZTERFA", - "RAUSLOSUNGFRDIENCHSTERUNDEEI456NGABED4SEFRDIELAUFE", - "AUSGABEDERFORLQ56BELLEUNDANDERERLISTENZUMAUSHANGFR", - "WHRENDDIE243SERSTNAUCHEINIGEZUSTZLICHEFUNKTIONENAU", - "ZUMBEISPIELDIEBEHANLERRCKTRITTENLISTENAUSDRUCWQKED", - "USWVEGEREITSERFOLGTENBENUTZEREINGABENAUSUNDBIETAET", - "ENZEITZUL2SSIGENFUN2KTIONENANVEGABEISCHIEDSLTETFWW", - "ERFISZU999SPIELERNUNDVERWAL456TENVONBISZU20RUNDENF", - "ERFASSUNGVONBISZU24SPIELELTENVONBISZU23RUNDENFRVOL", - "AUTOMATISCHEAUSLOSUNGGEMDENFIDEREGELNFRSCHWEIZERSV", - "UNDUSCFSYST23EMMANUELLEPAARUNGV456ERB245ESSERUNGDQ", - "BERCKSICHTIGUERADENTEILNEHMERZAHLERGEBNPIELERDURCH", - "FHRENDERFORTSCHRITTSTABELLEM456GLICHKEITDERDATENND", - "BERCKSICHTIGUNGVONTURNIERABBRECHERN345UNDWIEDERISD", - "HEREINNAHMEVONNACHZGLERNINSBEREITSLAUFENDETURNIERA", - "ICHTENFORTSCHRITTSTABELLENTEILNEHMERLISTENETCERZEU", - "VEGALUFTUNTERDOSWINDOWSUNDLINUXIM32BITMODUSAUFJEDE", - "OBWOHLVEGASOAUFGEBAUTISTDASSESSEHRINTUITIVUNDLEICH", - "EREMPFOHLENSI456CHMITDIESEMHANDBUCHVER34534TRAUTZU", - "RENUMALLEFUNKTIONENDESPROGRAMMSKENNENZU7658LERNENI", - "DERANWENDERBEN3453TIGTZWINGENDDIEKENNTN435ISDER476", - "SOWIEIHREIMPLEMENT456IERUNGINVEGAUMDESSENVERHALTEN", - "HENODERFRDENFALLDASSEREI456546NEMANUELLEAUSLOSUNGD", - }; - l = strlen(words); - for (i=0; i64 && a<90) k = a - 64; - else k = i; - //str[i] = (char) code[i][k]; - str << code[i][k]; - } - for (i=l; i<=24; i++) - { a = words[i]; - if (a>64 && a<90) k = a - 64; - else k = i; - //str[i] = (char) code[i][k]; - str << code[i][k]; - } - //str[25] = '\0'; -} - - -int CheckRegistration( String& client) -{ String stringa, str1, str2, answer; - -#ifdef PLATFORM_POSIX - Exclamation("This software is registered to:\nYOU"); - client = "You"; - return 1; -#endif - - stringa = TD.PATHVEGAPRG + "\\regcode.txt"; - FileIn in(stringa); - if (!in) { - Exclamation( - "[s0;=/ This software [*@6 CANNOT] be used in any official chess competition&]" - "[s0;=*/@(28.42.200) with more than 30 players.&]" - "[s0;=/ Please contact the author to obtain a suitable license&]" - "[s0;= `-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-&]" - "[s0;=/ Questo programma [*@6 NON] puo`' essere usato in alcun torneo reale&]" - "[s0;=*/@(28.42.200) con piu`' di 30 giocatori.&]" - "[s0;=/ Si contatti l`'autore per avere una piu`' estesa licenza d`'uso]"); - return 0; - } - str1 = in.GetLine(); // fgets(str1, 90, in); // skip - str1 = in.GetLine(); //. fgets(str1, 90, in); // skip - str1 = in.GetLine();// fgets(str1, 90, in); str1[strlen(str1)-1]='\0'; - str2 = in.GetLine(); // fgets(str2, 90, in); str2[strlen(str2)-1]='\0'; - in.Close(); // fclose(in); - - ProcessWord(str1, answer); - - if (strcmp(str2,answer)==0) - { PromptOK(NFormat( "[s0;=/ This software is registered to:&] [s0;=/ [*@6 %s] ]", str1) ); - client = str1; - return 1; - } - else { - Exclamation( - "[s0;=/ This software [*@6 CANNOT] be used in any official chess competition&]" - "[s0;=*/@(28.42.200) with more than 30 players.&]" - "[s0;=/ Please contact the author to obtain a suitable license&]" - "[s0;= `-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-&]" - "[s0;=/ Questo programma [*@6 NON] puo`' essere usato in alcun torneo reale&]" - "[s0;=*/@(28.42.200) con piu`' di 30 giocatori.&]" - "[s0;=/ Si contatti l`'autore per avere una piu`' estesa licenza d`'uso]"); - return 0; - } -} - -/* -int CheckRegistration( String& client) -{ char str1[100], str2[100], answer[100]; - String stringa; - FILE* in; -#ifdef PLATFORM_POSIX - Exclamation("This software is registered to:\nYOU"); - client = "You"; - return 1; -#endif - -// sprintf(stringa, "%s\\regcode.txt", TD.PATHVEGAPRG); - stringa = TD.PATHVEGAPRG + "\\regcode.txt"; - if ((in=fopen(stringa, "r"))==NULL) - { Exclamation( -"[s0;=/ This software [*@6 CANNOT] be used in any official chess competition&]" -"[s0;=?/@(28.42.200) with more than 30 players.&]" -"[s0;=/ Please contact the author to obtain a suitable license&]" -"[s0;= `-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-&]" -"[s0;=/ Questo programma [*@6 NON] puo`' essere usato in alcun torneo reale&]" -"[s0;=?/@(28.42.200) con piu`' di 30 giocatori.&]" -"[s0;=/ Si contatti l`'autore per avere una piu`' estesa licenza d`'uso]"); - return 0; - } - fgets(str1, 90, in); // skip - fgets(str1, 90, in); // skip - fgets(str1, 90, in); str1[strlen(str1)-1]='\0'; - fgets(str2, 90, in); str2[strlen(str2)-1]='\0'; - fclose(in); - ProcessWord(str1, answer); - if (strcmp(str2,answer)==0) - { //PromptOK(NFormat( "This software is registered to:\n %s", str1)); - PromptOK(NFormat( "[s0;=/ This software is registered to:&] [s0;=/ [*@6 %s] ]", str1) ); - client = str1; - return 1; - } - else { - Exclamation( - // "This software CANNOT be used in any official chess competition&with more than 30 players.&Please contact the author to obtain a suitable license.&---&Questo programma NON puo' essere usato in alcun torneo reale\ncon piu' di 30 giocatori.&Si contatti l'autore per avere una più estesa licenza d'uso"); -"[s0;=/ This software [*@6 CANNOT] be used in any official chess competition&]" -"[s0;=?/@(28.42.200) with more than 30 players.&]" -"[s0;=/ Please contact the author to obtain a suitable license&]" -"[s0;= `-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-`-&]" -"[s0;=/ Questo programma [*@6 NON] puo`' essere usato in alcun torneo reale&]" -"[s0;=?/@(28.42.200) con piu`' di 30 giocatori.&]" -"[s0;=/ Si contatti l`'autore per avere una piu`' estesa licenza d`'uso]"); - return 0; - } -} -*/ - - -VegaMain::VegaMain() -{ - CtrlLayout(*this, VERSION); - spls.Vert(); - spls.Vert(tabs, consoleFrame); // <<<<<WhenClose = THISBACK(Exit); // prevent the closure -} - -// these classes are GLOBAL -RoundData TD; //create an instance of RoundData -TeamArchive player[N_PLAYER_MAX+1]; //create N_PLAYER_MAX+1 instances of player -VectorMap db; - -GUI_APP_MAIN -{ // Draw::SetStdFont(Arial(11)); //set the font of the entire app - String name_user; - TD.PATHVEGAPRG = GetCurrentDirectory(); - if (CheckRegistration(name_user)) TD.USER_REGISTERED = name_user; - else TD.USER_REGISTERED = "unregistered"; - ReadConfigFile(); - VegaMain().Zoomable().Run(); - SaveConfigFile(); -} diff --git a/uppdev/VegaTeam5/message.t b/uppdev/VegaTeam5/message.t deleted file mode 100644 index bcecba9b7..000000000 --- a/uppdev/VegaTeam5/message.t +++ /dev/null @@ -1,3632 +0,0 @@ -#ifdef _MSC_VER -#pragma setlocale("C") -#endif -// main.cpp - -T_("Error saving configuration file!") -deDE("Fehler beim Speichern der Konfiguration!") -esES("") -frFR("") -itIT("Errore durante il salvataggio del file di configurazione") -ptPT("") -ruRU("Ошибка, при сохранении файла!") - - -// Vega.lay - -T_("Edit Player") -deDE("Spieler eingeben") -esES("") -frFR("") -itIT("Edita giocatore") -ptPT("") -ruRU("Редактировать Игрока") - -T_("Player Name") -deDE("Spieler") -esES("") -frFR("") -itIT("Nome Giocatore") -ptPT("") -ruRU("Имя Игрока") - -T_("Fed") -deDE("Verb.") -esES("") -frFR("") -itIT("Fed") -ptPT("") -ruRU("Фед") - -T_("Birthday") -deDE("Geboren") -esES("") -frFR("") -itIT("Nato/a il") -ptPT("") -ruRU("Дата рожд") - -T_("Gender") -deDE("M/W") -esES("") -frFR("") -itIT("Sesso") -ptPT("") -ruRU("Пол") - -T_("Title") -deDE("Titel") -esES("") -frFR("") -itIT("Titolo") -ptPT("") -ruRU("Титул") - -T_("ID FIDE") -deDE("ID FIDE") -esES("") -frFR("") -itIT("ID FIDE") -ptPT("") -ruRU("код ФИДЕ") - -T_("RAT FIDE") -deDE("Wertg FIDE") -esES("") -frFR("") -itIT("Elo FIDE") -ptPT("") -ruRU("Рейт. ФИДЕ") - -T_("ID Nat") -deDE("ID Nat") -esES("") -frFR("") -itIT("ID Naz.") -ptPT("") -ruRU("код Нац") - -T_("Rat Nat") -deDE("Wertg Nat") -esES("") -frFR("") -itIT("Elo Naz.") -ptPT("") -ruRU("Рат Нац") - -T_("K") -deDE("K") -esES("K") -frFR("K") -itIT("K") -ptPT("K") -ruRU("K") - -T_("Add Player") -deDE("Spieler hinzu") -esES("") -frFR("") -itIT("Aggiungi Gioc.") -ptPT("") -ruRU("Добавить Игрока") - -T_("Modify Player") -deDE("Spieler ändern") -esES("") -frFR("") -itIT("Modifica dati") -ptPT("") -ruRU("Изменить Игрока") - -T_("Clear Mask") -deDE("Maske löschen") -esES("") -frFR("") -itIT("Svuota campi") -ptPT("") -ruRU("Свободное поле") - -T_("Print Archive") -deDE("Drucke Archiv") -esES("") -frFR("") -itIT("Stampa") -ptPT("") -ruRU("Печать") - -T_("Close Registration") -deDE("Registration beenden") -esES("") -frFR("") -itIT("Chiudi registrazione") -ptPT("") -ruRU("Закрыть Регистрацию") - -T_("Remove Player") -deDE("Spieler entfernen") -esES("") -frFR("") -itIT("Rimuovi gioc.") -ptPT("") -ruRU("Удалить Игрока") - -T_("Round") -deDE("Runde") -esES("") -frFR("") -itIT("Turno") -ptPT("") -ruRU("Тур") - -T_("Output") -deDE("Ausgabe") -esES("") -frFR("") -itIT("Output") -ptPT("") -ruRU("Результат") - -T_("Verbose output") -deDE("Ausführlich") -esES("") -frFR("") -itIT("Spiegazione") -ptPT("") -ruRU("Пояснение рез-та") - -T_("Accept WWW/BBB") -deDE("WWW/BBB zulassen") -esES("") -frFR("") -itIT("Accetta BBB/NNN") -ptPT("") -ruRU("Допустить БББ/ЧЧЧ") - -T_("Danubian Variant (Dubov)") -deDE("Danubische Variante (Dubov)") -esES("") -frFR("") -itIT("Variante Danubio (Dubov)") -ptPT("") -ruRU("Вариант Danubian (Дубов)") - -T_("Automatic") -deDE("Automatisch") -esES("") -frFR("") -itIT("Automatico") -ptPT("") -ruRU("Автоматически") - -T_("Manual") -deDE("Manuell") -esES("") -frFR("") -itIT("Manuale") -ptPT("") -ruRU("Вручную") - -T_("Verbose") -deDE("Ausführlich") -esES("") -frFR("") -itIT("Spiega") -ptPT("") -ruRU("Объяснение") - -T_("Print Pairing") -deDE("Paarungen drucken") -esES("") -frFR("") -itIT("Stampa abb.") -ptPT("") -ruRU("Распечатать пары") - -T_("Do Pairing") -deDE("Paarungen ermitteln") -esES("") -frFR("") -itIT("Genera abbinamento") -ptPT("") -ruRU("Сформировать пары") - -T_("Option") -deDE("Option") -esES("") -frFR("") -itIT("Opzioni") -ptPT("") -ruRU("Вариант") - -T_("Result") -deDE("Ergebnis") -esES("") -frFR("") -itIT("Risultato") -ptPT("") -ruRU("Результат") - -T_("adjourned [7]") -deDE("verschoben [7]") -esES("") -frFR("") -itIT("Aggiornata [7]") -ptPT("") -ruRU("отложить [7]") - -T_("non standard") -deDE("nicht regulär") -esES("") -frFR("") -itIT("Non standard") -ptPT("") -ruRU("Редко") - -T_("Current Round") -deDE("Aktuelle Runde") -esES("") -frFR("") -itIT("Turno corrente") -ptPT("") -ruRU("Текущий Раунд") - -T_("Modify Pairing") -deDE("Paarungen verändern") -esES("") -frFR("") -itIT("Modifica coppie") -ptPT("") -ruRU("Изменить пару") - -T_("Load Results") -deDE("Ergebnisse laden") -esES("") -frFR("") -itIT("Importa risultati") -ptPT("") -ruRU("Вписать результаты") - -T_("Update CrossT") -deDE("Kreuztabelle aktualisieren") -esES("") -frFR("") -itIT("Aggiorna dati") -ptPT("") -ruRU("Обновить даты") - -T_("Improve Colors") -deDE("Farben verbessern") -esES("") -frFR("") -itIT("Scambia colori") -ptPT("") -ruRU("Улучшить Цвета ") - -T_("Show File") -deDE("Zeige Datei") -esES("") -frFR("") -itIT("Mostra File") -ptPT("") -ruRU("Показать Файл") - -T_("Pairing") -deDE("Paarungen") -esES("") -frFR("") -itIT("Abbinamento") -ptPT("") -ruRU("Пары") - -T_("Cross Table") -deDE("Kreuztabelle") -esES("") -frFR("") -itIT("Tabellone") -ptPT("") -ruRU("Таблица") - -T_("Rank Category") -deDE("Gruppenränge") -esES("") -frFR("") -itIT("Class. per Cat.") -ptPT("") -ruRU("Группа Разряда") - -T_("Rating variation") -deDE("Wertungsdifferenz") -esES("") -frFR("") -itIT("Variazione Elo") -ptPT("") -ruRU("Изменения Оценки") - -T_("Score Group") -deDE("Punktgruppen") -esES("") -frFR("") -itIT("Punteggio gruppi") -ptPT("") -ruRU("Группа Счета") - -T_("Ranking List") -deDE("") -esES("") -frFR("") -itIT("Classifica") -ptPT("") -ruRU("") - -T_("Board Card") -deDE("Brettkarten") -esES("") -frFR("") -itIT("Cartellino tavolo") -ptPT("") -ruRU("Этикетка на стол") - -T_("Player Card") -deDE("Spielerdetails") -esES("") -frFR("") -itIT("Cartellino giocatore") -ptPT("") -ruRU("Карта Игрока") - -T_("Score Game") -deDE("Punkteverteilung") -esES("") -frFR("") -itIT("Punti partita") -ptPT("") -ruRU("Счет Игры") - -T_("Tournament Directory") -deDE("Turnier-Verzeichnis") -esES("") -frFR("") -itIT("Cartella del Torneo") -ptPT("") -ruRU("Справочник Турнира") - -T_("Tournament File Name") -deDE("Turnier-Dateiname") -esES("") -frFR("") -itIT("Sigla torneo") -ptPT("") -ruRU("Название Файла Турнира") - -T_("Rounds") -deDE("Runden") -esES("") -frFR("") -itIT("Turni") -ptPT("") -ruRU("Раунды") - -T_("Play System") -deDE("Spielsystem") -esES("") -frFR("") -itIT("Sistema di gioco") -ptPT("") -ruRU("Система Игры") - -T_("Arbiter") -deDE("Schiedsrichter") -esES("") -frFR("") -itIT("Arbitro") -ptPT("") -ruRU("Арбитр") - -T_("End Date") -deDE("Enddatum") -esES("") -frFR("") -itIT("Data fine") -ptPT("") -ruRU("Дата окончания") - -T_("Begin Date") -deDE("Startdatum") -esES("") -frFR("") -itIT("Data inizio") -ptPT("") -ruRU("Дата начала") - -T_("Use FIDE rating") -deDE("Nach FIDE Wertg") -esES("") -frFR("") -itIT("Usa Elo FIDE") -ptPT("") -ruRU("Использовать рейтинг ФИДЕ") - -T_("Federation") -deDE("Verband") -esES("") -frFR("") -itIT("Federazione") -ptPT("") -ruRU("Федерация") - -T_("Place") -deDE("Platz") -esES("") -frFR("") -itIT("Luogo") -ptPT("") -ruRU("Место") - -T_("Tournament Name") -deDE("Turniername") -esES("") -frFR("") -itIT("Nome Torneo") -ptPT("") -ruRU("Название Турнира") - -T_("Acc. rounds") -deDE("Beschl. Runden") -esES("") -frFR("") -itIT("Turni accel.") -ptPT("") -ruRU("") - -T_("Available Tie Breaks") -deDE("Verfügbare TieBreaks") -esES("") -frFR("") -itIT("Spareggi") -ptPT("") -ruRU("Доступные Перерывы Связи ") - -T_("...") -deDE("...") -esES("...") -frFR("...") -itIT("...") -ptPT("...") -ruRU("...") - -T_("Done") -deDE("Fertig") -esES("") -frFR("") -itIT("Conferma") -ptPT("") -ruRU("Сделанно") - -T_("Close") -deDE("Schließen") -esES("") -frFR("Fermer") -itIT("Chiudi") -ptPT("") -ruRU("Закрыть") - -T_("Set Record Filter") -deDE("Setze Eintrag-Filter") -esES("") -frFR("") -itIT("Seleziona filtro") -ptPT("") -ruRU("Поставить запис.фильтр") - -T_("Field name") -deDE("Feldname") -esES("") -frFR("") -itIT("Nome campo") -ptPT("") -ruRU("Название поля") - -T_("Start Column") -deDE("Startspalte") -esES("") -frFR("") -itIT("Inizio colonna") -ptPT("") -ruRU("Начало Колонки") - -T_("Max Length") -deDE("Maximale Länge") -esES("") -frFR("") -itIT("Lunghezza max") -ptPT("") -ruRU("Max длинна") - -T_("Load Filter") -deDE("Lade Filter") -esES("") -frFR("") -itIT("Carica filtro") -ptPT("") -ruRU("Загрузить Фильтр") - -T_("Save Filter") -deDE("Speichere Filter") -esES("") -frFR("") -itIT("Salva filtro") -ptPT("") -ruRU("Сохран.Фильтр") - -T_("Cancel") -deDE("Abbrechen") -esES("") -frFR("Annuler") -itIT("Annulla") -ptPT("") -ruRU("Отмена") - -T_("Search") -deDE("") -esES("") -frFR("") -itIT("Cerca") -ptPT("") -ruRU("") - -T_("search player") -deDE("Suche Spieler") -esES("") -frFR("") -itIT("Cerca giocatore") -ptPT("") -ruRU("Поиск игрока") - -T_("Set Filter") -deDE("Setze Filter") -esES("") -frFR("") -itIT("Seleziona filtro") -ptPT("") -ruRU("Выбор Фильтра") - -T_("Selected Players") -deDE("Ausgewählte Spieler") -esES("") -frFR("") -itIT("Giocatori selezionati") -ptPT("") -ruRU("Отобранные игроки") - -T_("Register All") -deDE("Alle registrieren") -esES("") -frFR("") -itIT("Registra tutti") -ptPT("") -ruRU("Регистрация Всех") - -T_("Exit") -deDE("Ende") -esES("") -frFR("") -itIT("Esci") -ptPT("") -ruRU("Выход") - -T_("Non standard result") -deDE("Anderes Ergebnis") -esES("") -frFR("") -itIT("Risultato non standard") -ptPT("") -ruRU("Не стандартный результат") - -T_("Set Result") -deDE("Setze Ergebnis") -esES("") -frFR("") -itIT("Inserisci risultato") -ptPT("") -ruRU("Вписать результат") - -T_("ID Player") -deDE("ID Spieler") -esES("") -frFR("") -itIT("ID giocatore") -ptPT("") -ruRU("ИД игрока") - -T_("Place of birth") -deDE("Geburtsort") -esES("") -frFR("") -itIT("Luogo di nascita") -ptPT("") -ruRU("Место рождения") - -T_("Rate of play") -deDE("Turnierleistung") -esES("") -frFR("") -itIT("Tempo di gioco") -ptPT("") -ruRU("Игровое время") - -T_("Type Norm") -deDE("Norm vom Typ") -esES("") -frFR("") -itIT("Tipo Norma") -ptPT("") -ruRU("Тип Нормы") - -T_("FIDE Norm Certificate") -deDE("FIDE Normzertifikat") -esES("") -frFR("") -itIT("Certificato norme FIDE") -ptPT("") -ruRU("Сертификат нормы ФИДЕ") - -T_("Rating Report to FIDE") -deDE("Wertungsbericht an FIDE") -esES("") -frFR("") -itIT("Verbale Elo per la FIDE") -ptPT("") -ruRU("Рейтинг-Отчёт для ФИДЕ") - -T_("Date of end") -deDE("Enddatum") -esES("") -frFR("") -itIT("Data fine") -ptPT("") -ruRU("Дата окончания") - -T_("Date of start") -deDE("Startdatum") -esES("") -frFR("") -itIT("Data inizio") -ptPT("") -ruRU("Дата начала") - -T_("City") -deDE("Stadt") -esES("") -frFR("") -itIT("Città") -ptPT("") -ruRU("Город") - -T_("Allotted time per move/game") -deDE("Zeit pro Zug/Spiel") -esES("") -frFR("") -itIT("Cadenza per mosse/partita") -ptPT("") -ruRU("Вр.выделенное на ход/игру") - -T_("Type of tournament") -deDE("Turnierart") -esES("") -frFR("") -itIT("Tipo di Torneo") -ptPT("") -ruRU("Тип турнира") - -T_("Rated Players") -deDE("Gewertete Spieler") -esES("") -frFR("") -itIT("Giocatori FIDE") -ptPT("") -ruRU("Игроки ФИДЕ") - -T_("Total Players") -deDE("Spieler gesamt") -esES("") -frFR("") -itIT("Totale Giocat.") -ptPT("") -ruRU("Кол-во игроков") - -T_("Tournament name") -deDE("Turniername") -esES("") -frFR("") -itIT("Nome Torneo") -ptPT("") -ruRU("Название турнира") - -T_("Deputy Chief Arbiter(s)") -deDE("Hilfsschiedrichter") -esES("") -frFR("") -itIT("Vice arbitro") -ptPT("") -ruRU("Помощник арб.") - -T_("Chief Arbiter") -deDE("Hauptschiedsrichter") -esES("") -frFR("") -itIT("Arbitro capo") -ptPT("") -ruRU("Гл.арбитр") - -T_("USCF tournament section rating report") -deDE("") -esES("") -frFR("") -itIT("") -ptPT("") -ruRU("") - -T_("ID Assistant TD") -deDE("ID Assistenzturnierleiter") -esES("") -frFR("") -itIT("ID vice arbitro") -ptPT("") -ruRU("") - -T_("ID Chief TD") -deDE("ID Turnierleiter") -esES("") -frFR("") -itIT("ID arbitro capo") -ptPT("") -ruRU("ИД Гл.арбитра") - -T_("Rating System") -deDE("Wertungssystem") -esES("") -frFR("") -itIT("Sistema di rating") -ptPT("") -ruRU("Сист.Рейтинга") - -T_("K factor") -deDE("K Faktor") -esES("") -frFR("") -itIT("coeff. K") -ptPT("") -ruRU("Коэфф.K") - -T_("Status") -deDE("Status") -esES("") -frFR("") -itIT("Status") -ptPT("") -ruRU("Статус") - -T_("Operator") -deDE("Bediener") -esES("") -frFR("") -itIT("Operatore") -ptPT("") -ruRU("Оператор") - -T_("Number of Players") -deDE("Anzahl der Spieler") -esES("") -frFR("") -itIT("Numero Giocatori") -ptPT("") -ruRU("Кол-во Игроков") - -T_("Tournament Type") -deDE("Turnierart") -esES("") -frFR("") -itIT("Tipo di Torneo") -ptPT("") -ruRU("Тип турнира") - -T_("Section name") -deDE("Abschnitt") -esES("") -frFR("") -itIT("Sezione") -ptPT("") -ruRU("Назв. секции") - -T_("Do USCF Report") -deDE("") -esES("") -frFR("") -itIT("") -ptPT("") -ruRU("") - -T_("Open section list") -deDE("") -esES("") -frFR("") -itIT("") -ptPT("") -ruRU("") - -T_("Remove Section") -deDE("") -esES("") -frFR("") -itIT("") -ptPT("") -ruRU("") - -T_("Add Section ...") -deDE("") -esES("") -frFR("") -itIT("") -ptPT("") -ruRU("") - -T_("Save section list") -deDE("") -esES("") -frFR("") -itIT("") -ptPT("") -ruRU("") - -T_("Section list") -deDE("") -esES("") -frFR("") -itIT("") -ptPT("") -ruRU("") - -T_("USCF Tournament Rating Report") -deDE("") -esES("") -frFR("") -itIT("") -ptPT("") -ruRU("") - -T_("Numebr of sections") -deDE("") -esES("") -frFR("") -itIT("") -ptPT("") -ruRU("") - -T_("Event name") -deDE("") -esES("") -frFR("") -itIT("") -ptPT("") -ruRU("") - -T_("Scholastic event") -deDE("") -esES("") -frFR("") -itIT("") -ptPT("") -ruRU("") - -T_("Whom to send the cross table") -deDE("") -esES("") -frFR("") -itIT("") -ptPT("") -ruRU("") - -T_("State abbreviation") -deDE("") -esES("") -frFR("") -itIT("") -ptPT("") -ruRU("") - -T_("Tournament city") -deDE("") -esES("") -frFR("") -itIT("") -ptPT("") -ruRU("") - -T_("End date") -deDE("") -esES("") -frFR("") -itIT("") -ptPT("") -ruRU("") - -T_("Affiliate ID") -deDE("") -esES("") -frFR("") -itIT("") -ptPT("") -ruRU("") - -T_("Event ID") -deDE("") -esES("") -frFR("") -itIT("") -ptPT("") -ruRU("") - -T_("Begin date") -deDE("") -esES("") -frFR("") -itIT("") -ptPT("") -ruRU("") - -T_("Country for event") -deDE("") -esES("") -frFR("") -itIT("") -ptPT("") -ruRU("") - -T_("Zip code") -deDE("") -esES("") -frFR("") -itIT("") -ptPT("") -ruRU("") - -T_("Group Rating Interval") -deDE("Gruppenwertung von/bis") -esES("") -frFR("") -itIT("Fasce elo") -ptPT("") -ruRU("Группа рейт.интервала") - -T_("maximum") -deDE("Maximum") -esES("") -frFR("") -itIT("Massimo") -ptPT("") -ruRU("Максимум") - -T_("minimum") -deDE("Minimum") -esES("") -frFR("") -itIT("Minimo") -ptPT("") -ruRU("Минимум") - -T_("Group 1: >") -deDE("Gruppe 1: >") -esES("") -frFR("") -itIT("Gruppo 1: >") -ptPT("") -ruRU("Группа 1: >") - -T_("\\& <=") -deDE("\\& <=") -esES("") -frFR("") -itIT("\\& <=") -ptPT("") -ruRU("\\& <=") - -T_("Group 2: >") -deDE("Gruppe 2: >") -esES("") -frFR("") -itIT("Gruppo 2: >") -ptPT("") -ruRU("Группа 2: >") - -T_("Group 3: >") -deDE("Gruppe 3: >") -esES("") -frFR("") -itIT("Gruppo 3: >") -ptPT("") -ruRU("Группа 3: >") - -T_("Group 4: >") -deDE("Gruppe 4: >") -esES("") -frFR("") -itIT("Gruppo 4: >") -ptPT("") -ruRU("Группа 4: >") - -T_("Group 5: >") -deDE("Gruppe 5: >") -esES("") -frFR("") -itIT("Gruppo 5: >") -ptPT("") -ruRU("Группа 5: >") - -T_("Group Date Interval") -deDE("Gruppenintervall") -esES("") -frFR("") -itIT("Fasce per date") -ptPT("") -ruRU("Группа числ.интервала") - -T_("Fields to print") -deDE("Zu druckende Felder") -esES("") -frFR("") -itIT("Campi da stampare") -ptPT("") -ruRU("Области печати") - -T_("remove Available") -deDE("Verfügbare löschen") -esES("") -frFR("") -itIT("senza i presenti") -ptPT("") -ruRU("Удалить имеющихся") - -T_("ID") -deDE("ID") -esES("") -frFR("") -itIT("ID") -ptPT("") -ruRU("нод") - -T_("Name") -deDE("Name") -esES("") -frFR("Nom") -itIT("Nome") -ptPT("") -ruRU("Имя") - -T_("Rtg FIDE") -deDE("Wtg FIDE") -esES("") -frFR("") -itIT("Elo FIDE") -ptPT("") -ruRU("Рейт. ФИДЕ") - -T_("Rtg Nat") -deDE("Wtg Nat") -esES("") -frFR("") -itIT("Elo Naz.") -ptPT("") -ruRU("Рейт.Нац.") - -T_("K coefficient") -deDE("K Koeffizient") -esES("") -frFR("") -itIT("Coefficiente K") -ptPT("") -ruRU("Коэфф.K") - -T_("Print") -deDE("Drucken") -esES("") -frFR("Imprimer") -itIT("Stampa") -ptPT("") -ruRU("Печать") - -T_("Save players.html") -deDE("Speichere players.html") -esES("") -frFR("") -itIT("Salva players.html") -ptPT("") -ruRU("Сохр. игр-в в html") - -T_("player") -deDE("Spieler") -esES("") -frFR("") -itIT("giocatore") -ptPT("") -ruRU("Игрок") - -T_("Colors") -deDE("Farben") -esES("") -frFR("") -itIT("Colori") -ptPT("") -ruRU("Цвета") - -T_("Opponent") -deDE("Gegner") -esES("") -frFR("") -itIT("Avversario") -ptPT("") -ruRU("Противник") - -T_("Ok") -deDE("Ok") -esES("") -frFR("") -itIT("Ok") -ptPT("") -ruRU("Ok") - -T_("Available Players") -deDE("Verfügbare Spieler") -esES("") -frFR("") -itIT("Gioc. disponibile") -ptPT("") -ruRU("Свободный игрок") - -T_("White ID") -deDE("ID Weiß") -esES("") -frFR("") -itIT("ID Bianco") -ptPT("") -ruRU("Белый") - -T_("Black ID") -deDE("ID Schwarz") -esES("") -frFR("") -itIT("ID Nero") -ptPT("") -ruRU("Черный") - -T_("Add Pair") -deDE("Paarung hinzu") -esES("") -frFR("") -itIT("Agg. coppia") -ptPT("") -ruRU("Добавить Пару") - -T_("Remove Pair") -deDE("Paarung löschen") -esES("") -frFR("") -itIT("Rimuovi") -ptPT("") -ruRU("Удалить Пару") - -T_("Verify Pair") -deDE("Paarung prüfen") -esES("") -frFR("") -itIT("Verifica") -ptPT("") -ruRU("Проверить Пару") - -T_("Pairs added:") -deDE("Hinzugefügte Paare:") -esES("") -frFR("") -itIT("Coppie tot.:") -ptPT("") -ruRU("Добавилен.Пары:") - -T_("Remained players:") -deDE("Übrige Spieler:") -esES("") -frFR("") -itIT("Giocatori rimasti") -ptPT("") -ruRU("Оставшиеся Игроки") - -T_("Load Pairing") -deDE("Lade Paarungen") -esES("") -frFR("") -itIT("Carica abbin.") -ptPT("") -ruRU("Закрузить пары") - -T_("Save Pairing") -deDE("Speichere Paarungen") -esES("") -frFR("") -itIT("Salva abb.") -ptPT("") -ruRU("Сохр.пары") - -T_("-") -deDE("-") -esES("") -frFR("") -itIT("-") -ptPT("") -ruRU("-") - -T_(" Board ") -deDE(" Brett ") -esES("") -frFR("") -itIT(" Board ") -ptPT("") -ruRU(" Стол ") - -T_(" Score Rating ID color | color " - " ID Rating Score") -deDE(" Punkte Wertung ID Farbe | Farbe " - " ID Wertung Punkte") -esES("") -frFR("") -itIT(" Score Rating ID color | color " - " ID Rating Score") -ptPT("") -ruRU(" Счет Рейтинг ИД цвет | " - " цвет ИД Рейтинг Счет") - -T_("Exchange Players") -deDE("Spieler tauschen") -esES("") -frFR("") -itIT("Scambia Colori") -ptPT("") -ruRU("Поменяться Цветами") - -T_("OK") -deDE("OK") -esES("") -frFR("Ok") -itIT("Ok") -ptPT("") -ruRU("OK") - - -// VegaMenus.cpp - -T_("File") -deDE("") -esES("") -frFR("") -itIT("File") -ptPT("") -ruRU("Файл") - -T_("Extras") -deDE("") -esES("") -frFR("") -itIT("Extra") -ptPT("") -ruRU("") - -T_("Report") -deDE("Bericht") -esES("") -frFR("Rapport") -itIT("Report") -ptPT("") -ruRU("Отчёт") - -T_("Help") -deDE("Hilfe") -esES("") -frFR("Aide") -itIT("Aiuto") -ptPT("") -ruRU("Помощь") - -T_("New Tournament") -deDE("Neues Turnier") -esES("") -frFR("") -itIT("Nuovo Torneo") -ptPT("") -ruRU("Новый Турнир") - -T_("Open Tournament") -deDE("Öffne Turnier") -esES("") -frFR("") -itIT("Apri Torneo") -ptPT("") -ruRU("Открыть Турнир") - -T_("Save Tournament") -deDE("Speichere Turnier") -esES("") -frFR("") -itIT("Salva Torneo") -ptPT("") -ruRU("Сохр. Турнир") - -T_("Export") -deDE("Exportieren") -esES("") -frFR("") -itIT("Esporta") -ptPT("") -ruRU("Экспорт") - -T_("Connect Database") -deDE("") -esES("") -frFR("") -itIT("Collega Database") -ptPT("") -ruRU("") - -T_("Dangerous Stuff!") -deDE("Nur für Experten!") -esES("") -frFR("") -itIT("Operazioni pericolose!") -ptPT("") -ruRU("Опасные Действия!") - -T_("archive FIDE") -deDE("") -esES("") -frFR("") -itIT("archivio FIDE") -ptPT("") -ruRU("") - -T_("archive FSI Italy") -deDE("") -esES("") -frFR("") -itIT("archivio FSI") -ptPT("") -ruRU("") - -T_("archive USCF Regular") -deDE("") -esES("") -frFR("") -itIT("") -ptPT("") -ruRU("") - -T_("archive USCF Quick") -deDE("") -esES("") -frFR("") -itIT("") -ptPT("") -ruRU("") - -T_("archive VEG") -deDE("") -esES("") -frFR("") -itIT("archivio VEG") -ptPT("") -ruRU("") - -T_("national archive with Fixed Length") -deDE("") -esES("") -frFR("") -itIT("dati nazionali con lunghezza fissa") -ptPT("") -ruRU("") - -T_("All Players") -deDE("Alle Spieler") -esES("") -frFR("") -itIT("Tutti i giocatori") -ptPT("") -ruRU("Все игроки") - -T_("Tournament") -deDE("Turnier") -esES("") -frFR("") -itIT("Torneo") -ptPT("") -ruRU("Турнир") - -T_("Selected Player") -deDE("Gewählter Spieler") -esES("") -frFR("") -itIT("Giocatore selezionato") -ptPT("") -ruRU("Отобранный Игрок") - -T_("Modify Tournament") -deDE("Turnier ändern") -esES("") -frFR("") -itIT("Modifica torneo") -ptPT("") -ruRU("Изменить Турнир") - -T_("Load Round") -deDE("Runde laden") -esES("") -frFR("") -itIT("Carica turno") -ptPT("") -ruRU("Загрузить раунд") - -T_("Reset Tournament") -deDE("Turnier zurücksetzen") -esES("") -frFR("") -itIT("Ricomincia Torneo") -ptPT("") -ruRU("Сбросить Турнир") - -T_("Delete Round") -deDE("Runde löschen") -esES("") -frFR("") -itIT("Cancella turno") -ptPT("") -ruRU("Удалить раунд") - -T_("Reopen Registration") -deDE("Registration erneut öffnen") -esES("") -frFR("") -itIT("Riapri iscrizioni") -ptPT("") -ruRU("Повторно откр. Регистрацию") - -T_("[s0;=*@6 All tournament data will be lost &(but you can keep the players).&][s0;=*@6 " - "Do you want to continue?]") -deDE("[s0;=*@6 Alle Turnierdaten gehen verloren &(die Spieler können übernommen " - "werden).&][s0;=*@6 Möchten Sie wirklich neu anfangen?]") -esES("") -frFR("") -itIT("[s0;=*@6 Tutti i dati saranno persi &(ma potrai conservare i giocatori).&][s0;=*@6 " - "Vuoi continuare?]") -ptPT("") -ruRU("[s0;=*@6 Все данные турнира будут потеряны " - " и(но Вы можете сохранить игроков).&][s0;=*@6 " - "Вы хотите продолжить?]") - -T_("Do you want to keep& the players currently registered?") -deDE("Möchten Sie die Liste der aktuell& registrierten Spieler beibehalten?") -esES("") -frFR("") -itIT("Vuoi mantenere&i giocatori al momento presenti") -ptPT("") -ruRU(" Вы хотите сохр. зарегистрировавшихся " - "игроков?") - -T_("Created new tournament") -deDE("Neues Turnier angelegt") -esES("") -frFR("") -itIT("Creato torneo nuovo") -ptPT("") -ruRU("Создать новый турнир") - -T_("There are no players to export") -deDE("Es sind keine Spieler zum Export vorhanden") -esES("") -frFR("") -itIT("Non ci sono giocatori da esportare") -ptPT("") -ruRU("Нет игроков, чтобы экспортировать") - -T_("File vega") -deDE("Vega Datei") -esES("") -frFR("") -itIT("File vega") -ptPT("") -ruRU("Файл vega") - -T_("Set destination .VEG file") -deDE("Wähle .VEG Datei") -esES("") -frFR("") -itIT("Scegli il file .VEG di destinazione") -ptPT("") -ruRU("Выбрать файл .VEG место назнач.") - -T_("The player has been copied") -deDE("Der Spieler wurde kopiert") -esES("") -frFR("") -itIT("Il giocatore è stato aggiunto") -ptPT("") -ruRU("Игрок был скопирован") - -T_("Saved tournament data") -deDE("Turnierdaten gespeichert") -esES("") -frFR("") -itIT("Dati torneo salvati") -ptPT("") -ruRU("Сохр. данные турнира") - -T_("[s0;=*@6 All your data will be lost.&][s0;=*@6 Do you want to continue?]") -deDE("[s0;=*@6 Alle Daten werden gelöscht.&][s0;=*@6 Möchten Sie dies wirklich?]") -esES("") -frFR("") -itIT("[s0;=*@6 Tutti i dati saranno persi.&][s0;=*@6 Vuoi continuare?]") -ptPT("") -ruRU("[s0;=*@6 Все ваши данные будут потеряны.&][s0;=*@6 " - "Вы хотите продолжить?]") - -T_("Opened tournament ") -deDE("Turnier geöffnet ") -esES("") -frFR("") -itIT("Torneo aperto ") -ptPT("") -ruRU("Турнир Открыт") - -T_("archive FIDE (txt)") -deDE("FIDE Archiv (txt)") -esES("") -frFR("") -itIT("archivio FIDE (txt)") -ptPT("") -ruRU("Архив для ФИДЕ в (txt)") - -T_("archive VEG (csv & veg)") -deDE("VEGA Archiv (csv & veg)") -esES("") -frFR("") -itIT("archivio VEG (csv & veg)") -ptPT("") -ruRU("Архив VEG (csv & veg)") - -T_("national archive with Fixed Length (txt & csv)") -deDE("Nationales Archiv mit fester Länge (txt & csv)") -esES("") -frFR("") -itIT("archivio nazionale a campi fissi (txt & csv)") -ptPT("") -ruRU("нац. архив с неподвижной длиной (txt & csv)") - -T_("archive FSI Italy (csv)") -deDE("FSI Archiv, Italien (csv)") -esES("") -frFR("") -itIT("Archivio FSI - Italia (csv)") -ptPT("") -ruRU("архив FSI - Италия (csv)") - -T_("archive USCF Regular (txt)") -deDE("") -esES("") -frFR("") -itIT("") -ptPT("") -ruRU("") - -T_("archive USCF Quick (txt)") -deDE("") -esES("") -frFR("") -itIT("") -ptPT("") -ruRU("") - -T_("Imported ") -deDE("Importiert wurden ") -esES("") -frFR("") -itIT("Importati ") -ptPT("") -ruRU("Передано ") - -T_(" players") -deDE(" Spieler") -esES("") -frFR("") -itIT(" giocatori") -ptPT("") -ruRU(" Игроки") - -T_("Nothing to load") -deDE("Keine Daten gefunden") -esES("") -frFR("") -itIT("Nessun file da caricare") -ptPT("") -ruRU("Нет файлов, для загрузки") - -T_("File round") -deDE("Runde in Datei speichern") -esES("") -frFR("") -itIT("File del turno") -ptPT("") -ruRU("Файл раунда") - -T_("Read round file: ") -deDE("Lese Runden-Datei: ") -esES("") -frFR("") -itIT("Leggi file RND:") -ptPT("") -ruRU("Чтение Файла раунда:") - -T_("Nothing to reset") -deDE("Keine Daten zum Zurücksetzen vorhanden") -esES("") -frFR("") -itIT("Niente da annullare") -ptPT("") -ruRU("Аннулировать нечего") - -T_("[s0;=* Do you want to [@6 RESET] the Tournament at round 0?&][s0;=* The " - "current data will be lost]") -deDE("") -esES("") -frFR("") -itIT("[s0;=* Vuoi [@6 RICOMINCIARE] il torneo dal primo turno?&][s0;=* I dati " - "già inseriti saranno persi]") -ptPT("") -ruRU("") - -T_("[s0;=* LAST WARNING!&][s0;=* Do you want to [@6 RESET] the Tournament " - "at round 0?&][s0;=* The current data will be lost]") -deDE("") -esES("") -frFR("") -itIT("[s0;=* ULTIMO AVVERTIMENTO!&][s0;=* Vuoi [@6 RICOMINCIARE] il torneo dal " - "primo turno?&][s0;=* I dati già inseriti saranno persi]") -ptPT("") -ruRU("") - -T_("Reset tournament") -deDE("Turnier zurücksetzen") -esES("") -frFR("") -itIT("Ricomincia torneo") -ptPT("") -ruRU("Возобновить турнир") - -T_("Nothing to delete") -deDE("Keine Daten zum Löschen gefunden") -esES("") -frFR("") -itIT("Niente da cancellare") -ptPT("") -ruRU("Ничего нет для удаления") - -T_("Do you want to delete the current round?") -deDE("Möchten Sie die aktuelle Runde löschen?") -esES("") -frFR("") -itIT("Vuoi cancellare il turno corrente?") -ptPT("") -ruRU("Хотите удалить текущий раунд?") - -T_("Deleted Round ") -deDE("Gelöschte Runde: ") -esES("") -frFR("") -itIT("Turno cancellato") -ptPT("") -ruRU("Раунд удален ") - -T_("The tournament is not closed!") -deDE("Das Turnier ist nicht beendet!") -esES("") -frFR("") -itIT("Il torneo non è chiuso!") -ptPT("") -ruRU("Турнир не закрыт!") - -T_("[s0;=* Do you want to [@6 REOPEN] the Registration?&][s0;=* All your data " - "will be lost]") -deDE("") -esES("") -frFR("") -itIT("[s0;=* Vuoi davvero [@6 RIAPRIRE] le iscrizioni?&][s0;=* Tutti i turni " - "inseriti saranno perduti]") -ptPT("") -ruRU("") - -T_("[s0;=* LAST WARNING!&][s0;=* Do you want to [@6 REOPEN] the Registration?&][s0;=* " - "All your data will be lost]") -deDE("") -esES("") -frFR("") -itIT("[s0;=* ULTIMO AVVERTIMENTO!&][s0;=* Vuoi davvero [@6 RIAPRIRE] le iscrizioni?&][s0;=* " - "Tutti i turni inseriti saranno perduti]") -ptPT("") -ruRU("") - -T_("Reopened registration") -deDE("Registration erneut geöffnet") -esES("") -frFR("") -itIT("Iscrizioni riaperte") -ptPT("") -ruRU("Возобновить регистрацию") - -T_("Closing Vega") -deDE("Vega wird beendet") -esES("") -frFR("") -itIT("Chiusura del programma") -ptPT("") -ruRU("Закрыть программу") - -T_("Save-Exit") -deDE("Speichern-Ende") -esES("") -frFR("") -itIT("Salva-Esci") -ptPT("") -ruRU("Сохр./выход") - -T_("Sort Cross Table") -deDE("Kreuztabelle nach Punkten") -esES("") -frFR("") -itIT("Classifica + tabellone") -ptPT("") -ruRU("Классифика+таблица") - -T_("Rank Rating Group") -deDE("Gruppen nach Wertung") -esES("") -frFR("") -itIT("Classifica per fasce Elo") -ptPT("") -ruRU("Классифик.групп рейтинга") - -T_("Rank Date Group") -deDE("Gruppen nach Alter/Geb.Datum") -esES("") -frFR("") -itIT("Classifica per fasce di date") -ptPT("") -ruRU("Классифик. групп по датам") - -T_("Round Robin Calendar") -deDE("Rundenturnier-Kalender") -esES("") -frFR("") -itIT("Calendario girone italiano") -ptPT("") -ruRU("Календарь круг.турнира") - -T_("Missing Point Score system") -deDE("Fehlpunkte-System") -esES("") -frFR("") -itIT("Sistema dei punti mancanti") -ptPT("") -ruRU("Система нехват. баллов") - -T_("Backup *.veg file") -deDE("Backup der VEG-Datei") -esES("") -frFR("") -itIT("Backup file *.veg") -ptPT("") -ruRU("копия файла*.veg") - -T_("Find Duplicate Player") -deDE("Finde doppelte Spieler") -esES("") -frFR("") -itIT("Trova giocatori duplicati") -ptPT("") -ruRU("Найти запасного Игрока") - -T_("Select Language") -deDE("Sprache wählen") -esES("") -frFR("") -itIT("Seleziona lingua") -ptPT("") -ruRU("Выбрать язык") - -T_("Fide") -deDE("FIDE") -esES("") -frFR("") -itIT("FIDE") -ptPT("") -ruRU("ФИДЕ") - -T_("English") -deDE("Englisch") -esES("") -frFR("") -itIT("Inglese") -ptPT("") -ruRU("Английский") - -T_("Italian") -deDE("Italienisch") -esES("") -frFR("") -itIT("Italiano") -ptPT("") -ruRU("Итальянский") - -T_("German") -deDE("Deutsch") -esES("") -frFR("") -itIT("Tedesco") -ptPT("") -ruRU("Немецкий") - -T_("French") -deDE("Französisch") -esES("") -frFR("") -itIT("Francese") -ptPT("") -ruRU("Французский") - -T_("Spanish") -deDE("Spanisch") -esES("") -frFR("") -itIT("Spagnolo") -ptPT("") -ruRU("Испанский") - -T_("Russian") -deDE("Russisch") -esES("") -frFR("") -itIT("Russo") -ptPT("") -ruRU("Русский") - -T_("Portuguese") -deDE("Portugiesisch") -esES("") -frFR("") -itIT("Portoghese") -ptPT("") -ruRU("Португальский") - -T_("Enter the registration fee") -deDE("") -esES("") -frFR("") -itIT("Inserisci la quota di iscrizione") -ptPT("") -ruRU("вступительный взнос") - -T_("Please close and restart the program&to make active the change") -deDE("Bitte beenden Sie das Programm und starten Sie&es neu, um die Änderungen " - "zu aktivieren") -esES("") -frFR("") -itIT("Chiudi e riavvia il programma&per attivare la nuova lingua") -ptPT("") -ruRU("Закройте и откройте программу&для активации " - "измененний") - -T_("History card") -deDE("Verlauf") -esES("") -frFR("") -itIT("Cartellino giocatore") -ptPT("") -ruRU("Карта игрока") - -T_("Find Norm") -deDE("Finde Norm") -esES("") -frFR("") -itIT("Trova Norma") -ptPT("") -ruRU("Найти норму") - -T_("FIDE norm certificate") -deDE("FIDE Normzertifikat") -esES("") -frFR("") -itIT("Certificato norme FIDE") -ptPT("") -ruRU("Сертифицир. нормы ФИДЕ") - -T_("Statistics") -deDE("Statistik") -esES("") -frFR("") -itIT("Statistiche") -ptPT("") -ruRU("Статистика") - -T_("Option available after the closure&of the registration") -deDE("Diese Option ist erst nach Beenden der&Registration verfügbar") -esES("") -frFR("") -itIT("Opzione disponibile solo dopo&la chiusura delle registrazioni") -ptPT("") -ruRU("Выриант будет доступен после&закрытия " - "регистрации") - -T_("DONE") -deDE("FERTIG") -esES("") -frFR("") -itIT("Fatto") -ptPT("") -ruRU("Сделанно") - -T_("Process current section") -deDE("") -esES("") -frFR("") -itIT("") -ptPT("") -ruRU("") - -T_("Tournament Report (all sections) ") -deDE("") -esES("") -frFR("") -itIT("") -ptPT("") -ruRU("") - -T_("Option available with a running tournament") -deDE("") -esES("") -frFR("") -itIT("") -ptPT("") -ruRU("") - -T_("Option available only for Round Robin system!") -deDE("Diese Option ist nur für Rundenturniere verfügbar!") -esES("") -frFR("") -itIT("Opzione disponibile solo per il girone italiano") -ptPT("") -ruRU("Вариант доступен только для круг.турнира") - -T_("Option not available for Round Robin") -deDE("Nicht möglich bei Rundenturnieren") -esES("") -frFR("") -itIT("Opzione non disponibile per il Girone Italiano") -ptPT("") -ruRU("Вариант недоступен для круг.турнира") - -T_("Found the following duplicates: &") -deDE("Folgende Spieler sind doppelt: &") -esES("") -frFR("") -itIT("Trovati i seguenti duplicati: &") -ptPT("") -ruRU("Найти следующих запасных") - -T_("There are no duplicate") -deDE("Keine doppelten Spieler gefunden") -esES("") -frFR("") -itIT("Non ci sono duplicati") -ptPT("") -ruRU("Запасных нет ") - -T_("Content") -deDE("Inhalt") -esES("") -frFR("") -itIT("Contenuto") -ptPT("") -ruRU("Содержание") - -T_("Registered to ...") -deDE("Registriert auf ...") -esES("") -frFR("") -itIT("Registrato a nome di ...") -ptPT("") -ruRU("Зарегистрированный на имя... ") - -T_("About") -deDE("Über") -esES("") -frFR("") -itIT("Info su Vega") -ptPT("") -ruRU("Инфо о Vega") - -T_(" Players Archive ") -deDE(" Spieler ") -esES("") -frFR("") -itIT(" Giocatori ") -ptPT("") -ruRU("Архив игроков") - -T_(" Round Manager ") -deDE(" Runden ") -esES("") -frFR("") -itIT(" Gestione Turno ") -ptPT("") -ruRU(" Управление туром ") - -T_(" Output ") -deDE(" Ausgabe ") -esES("") -frFR("") -itIT(" Output ") -ptPT("") -ruRU(" Результат ") - -T_("waiting new pairing") -deDE("Warte auf neue Paarungen") -esES("") -frFR("") -itIT("Attendo nuovo abbinamento") -ptPT("") -ruRU("ожидание новой пары") - -T_("waiting result of current round") -deDE("Warte auf Ergebnisse dieser Runde") -esES("") -frFR("") -itIT("Attendo i risultati del turno corrente") -ptPT("") -ruRU("ожидание результат текущего раунда") - -T_("Add at least 6 players for a swiss system") -deDE("Sie brauchen mindestens 6 Spieler für das Schweizer System") -esES("") -frFR("") -itIT("Aggiungi almeno 6 giocatori per il sistema svizzero") -ptPT("") -ruRU("Добавить, хотя бы 6 игроков, для швейцарской " - "сист.") - -T_("Too many rounds") -deDE("Zu viele Runden") -esES("") -frFR("") -itIT("Troppi turni") -ptPT("") -ruRU("Слишком много туров") - -T_("wrong number of players") -deDE("Falsche Anzahl von Spielern") -esES("") -frFR("") -itIT("Numero giocatori errato") -ptPT("") -ruRU("Кол-во игроков ошибочное") - -T_("you could not get a clear winner... increase Rounds") -deDE("Es gibt keinen eindeutigen Gewinner...Rundenzahl erhöhen") -esES("") -frFR("") -itIT("non puoi designare un vincitore certo... aumenta i turni") -ptPT("") -ruRU("Невозможно выбрать победителя... добавьте " - "раунды") - -T_("Do you want to close the registration?") -deDE("Möchten Sie die Registrierung abschließen?") -esES("") -frFR("") -itIT("Vuoi chiudere le registrazioni?") -ptPT("") -ruRU("Хотите закрыть регистрацию?") - -T_("Sort of the players") -deDE("Sortierung der Spieler") -esES("") -frFR("") -itIT("Ordinamento giocatori") -ptPT("") -ruRU("Порядок игроков") - -T_("Assign the ID by:") -deDE("ID zuweisen nach:") -esES("") -frFR("") -itIT("Assegna l'ID per:") -ptPT("") -ruRU("Передать ID для:") - -T_("RtgTtlName") -deDE("WtgTtlName") -esES("") -frFR("") -itIT("RtgTtlName") -ptPT("") -ruRU("РейтТитИмя") - -T_("Random") -deDE("Zufällig") -esES("") -frFR("") -itIT("Casuale") -ptPT("") -ruRU("Случайно") - -T_("no sort") -deDE("unsortiert") -esES("") -frFR("") -itIT("Non ordinare") -ptPT("") -ruRU("Не упорядочивать") - -T_("Please insert the result of the current round") -deDE("Bitte geben Sie das Ergebnis dieser Runde ein") -esES("") -frFR("") -itIT("Inserisci il risultato del turno corrente") -ptPT("") -ruRU("Добавьте рез.текущего раунда") - -T_("You cannot generate a new pairing. First close the Registration") -deDE("Sie können noch keine Paarungen erzeugen. Beenden Sie erst die Registration") -esES("") -frFR("") -itIT("Non puoi generare gli abbinamenti. Prima chiudi le iscrizioni") -ptPT("") -ruRU("Невозможно создавать новые пары, незакрыв " - "регистрацию.") - -T_("The Tournament is finished") -deDE("Das Turnier ist beendet") -esES("") -frFR("") -itIT("Il torneo è finito!") -ptPT("") -ruRU("Турнир закрыт!") - -T_("Option not available.&First close the Registration") -deDE("Diese Option ist noch nicht verfügbar.&Beenden Sie bitte erst die Registration") -esES("") -frFR("") -itIT("Opzione non disponibile.&Prima chiudi le registrazioni") -ptPT("") -ruRU("Вариант недоступен. Закройте регистрацию") - -T_("Option available only for the current round") -deDE("Nicht möglich für die aktuelle Runde") -esES("") -frFR("") -itIT("Opzione disponibile solo per il turno corrente") -ptPT("") -ruRU("Вариант доступен, только для текущего " - "раунда") - -T_("Open or Create a tournament!") -deDE("Öffnen oder erzeugen Sie ein Turnier!") -esES("") -frFR("") -itIT("Apri o crea un Torneo!") -ptPT("") -ruRU("Открыть и создать Турнир!") - -T_("Registration of players") -deDE("Registrierung der Spieler") -esES("") -frFR("") -itIT("Iscrizione giocatori") -ptPT("") -ruRU("Зарегистрировать игроков") - -T_("Waiting insert results!") -deDE("Erwarte die Eingabe von Ergebnissen!") -esES("") -frFR("") -itIT("Attendo l'inserimento dei risultati") -ptPT("") -ruRU("Подождите вносить результаты!") - -T_("Tournament finished!") -deDE("Turnier abgeschlossen!") -esES("") -frFR("") -itIT("Il torneo è finito!") -ptPT("") -ruRU("Турнир закрыт!") - -T_("Waiting new pairing") -deDE("Erwarte die neuen Paarungen") -esES("") -frFR("") -itIT("Attendo il nuovo abbinamento") -ptPT("") -ruRU("Подождите новые соединения") - -T_("LAST ROUND!") -deDE("LETZTE RUNDE!") -esES("") -frFR("") -itIT("ULTIMO TURNO!") -ptPT("") -ruRU("ПОСЛЕДНИЙ РАУНД!") - -T_("swiss Dubov") -deDE("Swiss Dubov") -esES("") -frFR("") -itIT("Svizzero Dubov") -ptPT("") -ruRU("Швейц. Дубов") - -T_("single RR") -deDE("RT einfach") -esES("") -frFR("") -itIT("RR singolo") -ptPT("") -ruRU("Ед.RR") - -T_("double RR") -deDE("RT doppelt") -esES("") -frFR("") -itIT("RR doppio") -ptPT("") -ruRU("Двойной RR") - -T_("swiss vega") -deDE("Swiss Vega") -esES("") -frFR("") -itIT("Svizzero Vega") -ptPT("") -ruRU("Швейц.Vega") - -T_("swiss USCF") -deDE("Swiss USCF") -esES("") -frFR("") -itIT("Svizzero USCF") -ptPT("") -ruRU("Швейц.USCF") - -T_("swiss Lim") -deDE("Swiss Lim") -esES("") -frFR("") -itIT("Svizzero Lim") -ptPT("") -ruRU("Швейц.Lim") - -T_(" got a BYE!") -deDE(" erhielt ein BYE!") -esES("") -frFR("") -itIT(" ha ricevuto un BYE!") -ptPT("") -ruRU(" Достался BYE!") - -T_(" is available") -deDE(" ist verfügbar") -esES("") -frFR("") -itIT(" è disponibile") -ptPT("") -ruRU(" доступен") - -T_(" is NOT available!") -deDE(" ist NICHT verfügbar!") -esES("") -frFR("") -itIT(" non è disponibile") -ptPT("") -ruRU(" недоступен!") - -T_("removed player") -deDE("") -esES("") -frFR("") -itIT("cancellato giocatore") -ptPT("") -ruRU("") - -T_("Time") -deDE("Zeit") -esES("") -frFR("") -itIT("Data") -ptPT("") -ruRU("Дата") - -T_("System") -deDE("System") -esES("") -frFR("") -itIT("Sistema") -ptPT("") -ruRU("Система") - -T_(" Total, Avail, Bye") -deDE("") -esES("") -frFR("") -itIT("Totale, Disp., Bye") -ptPT("") -ruRU("Total, Avail, Bye") - -T_("Action") -deDE("Aktion") -esES("") -frFR("Action") -itIT("Azione") -ptPT("") -ruRU("Действие") - -T_("Hello!") -deDE("Hallo!") -esES("") -frFR("") -itIT("Ciao!") -ptPT("") -ruRU("Приветствую!") - - -// VegaTab1.cpp - -T_("G") -deDE("") -esES("") -frFR("") -itIT("S") -ptPT("") -ruRU("") - -T_("Do you want to remove the player&") -deDE("") -esES("") -frFR("") -itIT("Vuoi cancellare il giocatore&") -ptPT("") -ruRU("") - -T_("The Name field cannot be empty!") -deDE("Bitte geben Sie einen Namen ein!") -esES("") -frFR("") -itIT("Il campo Nome non può essere vuoto") -ptPT("") -ruRU("Поле ИМЯ, неможет быть пустым!") - -T_("You can't add a player in a Round Robin&after the closure of registration") -deDE("Sie können keine Spieler zu einem Rundenturnier&hinzufügen nachdem die " - "Registration beendet wurde") -esES("") -frFR("") -itIT("Non puoi aggiungere un giocatore in un girone italiano&dopo la chiusura " - "delle iscrizioni") -ptPT("") -ruRU("Невозможно добавить игрока в круг.игру, " - "после закрытия регистрации ") - -T_("Too much players! Stop with the registration") -deDE("Zu viele Spieler! Bitte beenden Sie die Registration") -esES("") -frFR("") -itIT("Troppi giocatori! Chiudere le iscrizioni") -ptPT("") -ruRU("Слишком много игроков! Закрыть регистрацию") - -T_("Do you want to add a Late-Comer to the tournament?&You will not be able " - "to delete him again") -deDE("Möchten Sie einen Späteinsteiger zum Turnier hinzufügen?&Sie können " - "diesen Spieler nicht wieder löschen") -esES("") -frFR("") -itIT("Vuoi aggiungere un ritardatario al torneo?&Non si potrà poi cancellarlo") -ptPT("") -ruRU("Добавить опаздывающего на турнир?Потом " - "будет невозможно удалить его") - -T_("Category and gender does not coincide&Please check") -deDE("Kategorie und Geschlecht passen nicht zusammen&Bitte prüfen") -esES("") -frFR("") -itIT("Categoria e sesso non coincidono&Ricontrolla") -ptPT("") -ruRU("Категория и пол не совпадают, пожалуйста " - "проверте") - -T_("It will contain all the registered players") -deDE("") -esES("") -frFR("") -itIT("Conterrà tutti i giocatori registrati") -ptPT("") -ruRU("Здесь будут содержаться все зарегистрирован. " - "игроки") - -T_("Set the round to display all other data") -deDE("Setzen Sie die aktuelle Runde um Daten auszugeben") -esES("") -frFR("") -itIT("Indica il turno per vedere gli altri dati") -ptPT("") -ruRU("Набрать раунд для показа других данных") - -T_("Game against player 0=BYE&is considered forfeited") -deDE("Das Spiel gegen Spieler 0=BYE& wird nicht gewertet") -esES("") -frFR("") -itIT("La partita con il 0=BYE&è coinsiderata a forfeit") -ptPT("") -ruRU("Игра 0=BYE-рассматривается как проигрыш") - -T_("'Null' set the game as 'unplayed'") -deDE("'Null' markiert die Begegnung als 'nicht gespielt'") -esES("") -frFR("") -itIT("Usa 'Null' per considerarla 'non giocata'") -ptPT("") -ruRU("Исрользование 'Null'-несыгранная") - -T_("Round out of range") -deDE("Runde liegt nicht im gültigen Bereich") -esES("") -frFR("") -itIT("numero Turno scorretto") -ptPT("") -ruRU("неправильный номер раунда ") - -T_("Set a valid opponent for the selected player") -deDE("Geben Sie einen gültigen Gegner für den gewählten Spieler an") -esES("") -frFR("") -itIT("Indica un avversario valido") -ptPT("") -ruRU("Показать законного оппонента") - - -// VegaTab3.cpp - -T_("New Pairing") -deDE("Neue Paarungen") -esES("") -frFR("") -itIT("Nuovo abbinamento") -ptPT("") -ruRU("Новая пара") - -T_("Insert/Modify Result") -deDE("Ergebnis einfügen/ändern") -esES("") -frFR("") -itIT("Inserisci/modifica risultato") -ptPT("") -ruRU("Вписать/изменить результат") - -T_("Bo.") -deDE("Br.") -esES("") -frFR("") -itIT("Tav.") -ptPT("") -ruRU("Стол") - -T_("White Player") -deDE("Spieler Weiß") -esES("") -frFR("") -itIT("Bianco") -ptPT("") -ruRU("Белые") - -T_("Black Player") -deDE("Spieler Schwarz") -esES("") -frFR("") -itIT("Nero") -ptPT("") -ruRU("Черные") - -T_("IDW-IDB") -deDE("IDW-IDS") -esES("") -frFR("") -itIT("IDW-IDB") -ptPT("") -ruRU(" НБ-НЧ") - -T_("Double click to exchange the colors") -deDE("Doppelclick tauscht die Farben") -esES("") -frFR("") -itIT("Doppio per scambiare i colori") -ptPT("") -ruRU("Двойной щелчок для изменения цвета") - -T_("Save the explanation pairing file") -deDE("Speichern der Paarungsermittlung") -esES("") -frFR("") -itIT("Salva il file con le spiegazioni") -ptPT("") -ruRU("Сохр. файл с объяснениями") - -T_("Permit the same color\nthree time in a row") -deDE("Erlaube dreimal hintereinander\ndie gleiche Farbe") -esES("") -frFR("") -itIT("Permetti lo stesso colore\nper tre volte di seguito") -ptPT("") -ruRU("Разрешить игру одним и тем же цветом\n 3 " - "раза подряд") - -T_("Enable the Danubian variant\nfor the dubov system") -deDE("Danubische Variante für\ndas Dubov-System aktivieren") -esES("") -frFR("") -itIT("Abilita la variante Danubio\nper il sistema Dubov") -ptPT("") -ruRU("Позволение Danubian варианта\nдля системы " - "Дубова") - -T_("Round not valid") -deDE("Runde ist nicht gültig") -esES("") -frFR("") -itIT("Turno non valido") -ptPT("") -ruRU("Раунд не действительный") - -T_("You cannot visualize other rounds.&First insert the results of the current " - "round") -deDE("Sie können noch keine Rundendaten ausgeben.&Beenden Sie erst die Eingabe " - "der aktuellen Runde") -esES("") -frFR("") -itIT("Inserisci i risultati del turno corrente") -ptPT("") -ruRU("Невозможно посмотреть другие раунды.Вначале " - "должны быть внесены рез. текущего раунда") - -T_("Are you sure do you want&to change an old result?") -deDE("Möchten Sie wirklich ein&altes Ergebnis ändern?") -esES("") -frFR("") -itIT("Sei sicuro di voler&cambiare il vecchio risultato?") -ptPT("") -ruRU("Уверенны, что хотите изменить старый рез.?") - -T_("Load result file") -deDE("Lade Ergebnis-Datei") -esES("") -frFR("") -itIT("File risultati") -ptPT("") -ruRU("Загрузить файл с рез.") - -T_("The selected file doens't correspond to the current round!&Please choose " - "the correct one") -deDE("Die gewählte Datei passt nicht zur aktuellen Runde!&Bitte korrigieren " - "Sie Ihre Wahl") -esES("") -frFR("") -itIT("Il file scelto non corrisponde a quello corrente&scegli quello giusto") -ptPT("") -ruRU("Выбранный файл не соответствует текущему " - "раунду&выберите правельный") - -T_("[s0;= There are still pairs without result. &] [s0;= Please insert all " - "results or you will be not able to continue]") -deDE("[s0;= Zu einigen Paarungen gibt es noch kein Ergebnis. &] [s0;= Bitte " - "tragen Sie die Daten nach sonst geht es nicht weiter]") -esES("") -frFR("") -itIT("[s0;= Ci sono ancora coppie senza risultato. &] [s0;= Inseriscili tutti " - "o non potrai continuare") -ptPT("") -ruRU("[s0;= Есть еще пары без результата. &] [s0;= Пожалуйста, " - "внесите все результаты для продолжения") - -T_("[s0;= All results have been inserted") -deDE("[s0;= Alle Ergebnisse wurden eingegeben") -esES("") -frFR("") -itIT("[s0;= Tutti i risultati sono stati inseriti") -ptPT("") -ruRU("[s0;= Все результаты внесены") - -T_("Option not available.&First generate the new pairing") -deDE("Option nicht verfügbar.&Erzeugen Sie erst eine neue Paarung") -esES("") -frFR("") -itIT("Opzione non disponibile. Prima genera l'abbinamento") -ptPT("") -ruRU("Вариант недоступен.&Вначале создайте новую " - "пару") - -T_("Do you want to exchange the colors&of the selected players?") -deDE("Möchten Sie für die ausgewählten&Spieler die Farben tauschen?") -esES("") -frFR("") -itIT("Vuoi scambiare i colori&della coppia selezionata?") -ptPT("") -ruRU("Хотите поменять цвета выбранных игроков?") - -T_("The exchange is not permitted!&Do you want to continue in any case?") -deDE("Dieser Tausch ist nicht regulär!&Möchten Sie trotzdem damit fortfahren?") -esES("") -frFR("") -itIT("Lo scambio è illegale!&Vuoi continuare lo stesso?") -ptPT("") -ruRU("Изменение незаконно!Тем неменее хотете " - "продолжить?") - - -// VegaTab4.cpp - -T_("text files") -deDE("Text Dateien") -esES("") -frFR("") -itIT("File di testo") -ptPT("") -ruRU("Текстовой файл") - -T_("New") -deDE("Neu") -esES("") -frFR("Nouveau") -itIT("Nuovo") -ptPT("") -ruRU("Новый") - -T_("Create new document") -deDE("Erzeuge neues Dokument") -esES("") -frFR("") -itIT("Crea nuovo documento") -ptPT("") -ruRU("Создать новый документ") - -T_("New Qtf") -deDE("Neues Qtf") -esES("") -frFR("") -itIT("Nuovo Qtf") -ptPT("") -ruRU("Новый Qtf") - -T_("Open new QTF window") -deDE("Öffne neues Qtf-Fenster") -esES("") -frFR("") -itIT("Apri nuova finestra Qtf") -ptPT("") -ruRU("Открыть новое окно Qtf") - -T_("Open existing document") -deDE("Öffne Dokument") -esES("") -frFR("") -itIT("Apri documento esistente") -ptPT("") -ruRU("Открыть существующий док.") - -T_("SaveAs") -deDE("Speichern als") -esES("") -frFR("") -itIT("Salva con nome") -ptPT("") -ruRU("Сохр. как") - -T_("Save current document with a new name") -deDE("Speichere aktuelles Dokument unter neuem Namen") -esES("") -frFR("") -itIT("Salva il documento corrente con un nuovo nome") -ptPT("") -ruRU("Сохр. данный док. под новым именем") - -T_("Print..") -deDE("Drucken..") -esES("") -frFR("") -itIT("Stampa...") -ptPT("") -ruRU("Печать...") - -T_("Print document") -deDE("Drucke Dokument") -esES("") -frFR("") -itIT("Stampa documento") -ptPT("") -ruRU("Распечатать док.") - -T_("Print selected text") -deDE("Drucke selektierten Text") -esES("") -frFR("") -itIT("Stampa il testo selezionato") -ptPT("") -ruRU("Распечатать выделенный текст") - -T_("The current data will be lost.&Do you want to continue?") -deDE("Die aktuellen Daten gehen dadurch verloren.&Möchten Sie trotzdem fortfahren?") -esES("") -frFR("") -itIT("I dati verranno persi.&Vuoi continuare?") -ptPT("") -ruRU("Данные будут потеряны.&Продолжить?") - -T_("Error saving the file: ") -deDE("Fehler beim Speichern von: ") -esES("") -frFR("") -itIT("Errore nel salvataggio del file") -ptPT("") -ruRU("Ошибка при сохранении файла") - - -// Tournament.cpp - -T_(" # Do not edit this file!") -deDE(" # Diese Datei nicht editieren!") -esES("") -frFR("") -itIT(" # Non modificare questo file!") -ptPT("") -ruRU("# Не изменяйте этот файл!") - -T_("error in the data format") -deDE("Fehler im Datenformat") -esES("") -frFR("") -itIT("Errore nel formato dei dati") -ptPT("") -ruRU("Ошибка в формате данных") - -T_("Standing at round ") -deDE("") -esES("") -frFR("") -itIT("Classifica al turno ") -ptPT("") -ruRU("") - -T_(" sorted by category") -deDE("") -esES("") -frFR("") -itIT(" ordinati per categoria") -ptPT("") -ruRU("") - -T_("Ranking for category: ") -deDE("") -esES("") -frFR("") -itIT("Classifica per categoria") -ptPT("") -ruRU("") - -T_("Rating variation at round ") -deDE("") -esES("") -frFR("") -itIT("Variazione Elo al turno ") -ptPT("") -ruRU("") - -T_("National Player Cards") -deDE("") -esES("") -frFR("") -itIT("Cartellini Nazionali") -ptPT("") -ruRU("") - -T_(", Round: ") -deDE("") -esES("") -frFR("") -itIT(", Turno: ") -ptPT("") -ruRU("") - -T_(": Results of round ") -deDE("") -esES("") -frFR("") -itIT(": Risultati del turno ") -ptPT("") -ruRU("") - -T_(": Pairing of round ") -deDE("") -esES("") -frFR("") -itIT(": Abbinamento del turno ") -ptPT("") -ruRU("") - -T_("\n The following player(s) got a BYE:\n") -deDE("\n Folgende Spieler erhielten ein Freilos:\n") -esES("") -frFR("") -itIT("\n I seguenti giocatori hanno preso un BYE:") -ptPT("") -ruRU("\n Данные игроки получили BYE:\n") - -T_("\n The following player(s) withdrew:\n") -deDE("\n Die folgenden Spieler sind ausgeschieden:\n") -esES("") -frFR("") -itIT("\n I seguenti giocatori si sono ritirati:") -ptPT("") -ruRU("\n Данные игроки ушли:") - -T_("Tournament Summary") -deDE("Turnier in Kürze") -esES("") -frFR("") -itIT("Riassunto torneo") -ptPT("") -ruRU("Резюме турнира") - -T_("Standing") -deDE("Rangliste") -esES("") -frFR("") -itIT("Classifica") -ptPT("") -ruRU("Ранжирование") - -T_("Rating Report") -deDE("Wertungsbericht") -esES("") -frFR("") -itIT("Report Elo") -ptPT("") -ruRU("Рейтинг-отчет") - -T_("Score Groups") -deDE("Punktegruppen") -esES("") -frFR("") -itIT("Gruppi di punteggio") -ptPT("") -ruRU("Группы баллов") - -T_("Participants") -deDE("Teilnehmer") -esES("") -frFR("") -itIT("Partecipanti") -ptPT("") -ruRU("Участники") - -T_("Pairings/Results: ") -deDE("") -esES("") -frFR("") -itIT("Abbinamenti/Risultati: ") -ptPT("") -ruRU("") - -T_("UCSF archive converted") -deDE("USCF Archiv, konvertiert") -esES("") -frFR("") -itIT("archivio USCF convertito") -ptPT("") -ruRU("Архив UCSF конвертирован") - - -// ConnectDB.cpp - -T_("Import Player from Database") -deDE("Importiere Spieler aus Datenbank") -esES("") -frFR("") -itIT("Importa giocatore dal database") -ptPT("") -ruRU("Перенести игрока из БД") - -T_("import from FIDE db: ") -deDE("Importiere aus FIDE DB: ") -esES("") -frFR("") -itIT("Importa dal DB FIDE: ") -ptPT("") -ruRU("Перенести из БД ФИДЕ: ") - -T_("import from VEG db: ") -deDE("Importiere aus VEG DB: ") -esES("") -frFR("") -itIT("Importa da DB Vega: ") -ptPT("") -ruRU("Перенести из БД Vega:") - -T_("import from Fixed Length db: ") -deDE("Importiere aus Feste-Länge DB: ") -esES("") -frFR("") -itIT("importa da un DB a campi fissi: ") -ptPT("") -ruRU("Перенести из БД Fixed Length: ") - -T_("import from FSI db: ") -deDE("Importiere aus FSI DB: ") -esES("") -frFR("") -itIT("Importa da DB FSI: ") -ptPT("") -ruRU("Перенести из БД FSI: ") - -T_("import from USCF db (regular): ") -deDE("") -esES("") -frFR("") -itIT("") -ptPT("") -ruRU("") - -T_("import from FSI db (quick): ") -deDE("") -esES("") -frFR("") -itIT("") -ptPT("") -ruRU("") - -T_("Insert at least 5 characters\nspace included") -deDE("Mindestens 5 Zeichen eingeben\ninclusive Leerzeichen") -esES("") -frFR("") -itIT("Inserisci almeno 5 caratteri\nspazi inclusi") -ptPT("") -ruRU("Внести хотя бы 5 хар-к\nвключяя место") - -T_("Because the registration are closed & you cannot import players & but " - "only browse the DB") -deDE("") -esES("") -frFR("") -itIT("Poiché le registrazioni sono chiuse & puoi solo esplorare il database " - "& ma senza importare giocatori") -ptPT("") -ruRU("") - -T_("not found") -deDE("Nicht gefunden") -esES("") -frFR("") -itIT("Non trovato") -ptPT("") -ruRU("Не найдено") - -T_("Option not available for Round Robin tournament") -deDE("Nicht möglich bei Rundenturnieren") -esES("") -frFR("") -itIT("Opzione non disponibile per il Girone Italiano") -ptPT("") -ruRU("Вариант не доступен для круг.турнира") - -T_("You cannot add player from the DB.&Insert it from Edit Mask") -deDE("Sie können den Spieler nicht aus der Datenbank hinzufügen.&Bitte benutzen " - "Sie die allgemeine Eingabemaske") -esES("") -frFR("") -itIT("Non puoi aggiungere giocatori dal DB.&Inseriscili dalla maschera Edit") -ptPT("") -ruRU("Невозможно добавить игрока из БД.&Внести " - "его через Поле Редактирования") - -T_("exceeded maximum number of players.&Please remove at least ") -deDE("Maximale Anzahl der Spieler ist überschritten.&Bitte löschen Sie mindestens ") -esES("") -frFR("") -itIT("Raggiunto il numero massimo di giocatori. Togli almeno ") -ptPT("") -ruRU("Кол-во игроков максимальное. Удалите хотя " - "бы") - -T_("record") -deDE("Eintrag") -esES("") -frFR("") -itIT("record") -ptPT("") -ruRU("Рекорд") - -T_("& in the wrong format!&check the DB") -deDE("& im falschen Format!&Prüfen Sie die Datenbank") -esES("") -frFR("") -itIT("& è in un formato errato!&Controlla il DB") -ptPT("") -ruRU("& ошибочный формат!&Надо проверить БД") - -T_("exceeded maximum number of players") -deDE("Maximale Anzahl der Spieler überschritten") -esES("") -frFR("") -itIT("Superato il massimo numero di giocatori") -ptPT("") -ruRU("Кол-во игроков максимальное.") - - -// FilterDB.cpp - -T_("File Filter") -deDE("Datei-Filter") -esES("") -frFR("") -itIT("Filtro del file") -ptPT("") -ruRU("Фильтр Файла") - -T_("The default FIDE filter was not found. & Please set it to retrieve the " - "players") -deDE("") -esES("") -frFR("") -itIT("Il filtro FIDE non è stato trovato.&Inseriscilo per caricare i giocatori") -ptPT("") -ruRU("") - - -// Rankgroup.cpp - -T_("Rated Player Group at round ") -deDE("") -esES("") -frFR("") -itIT("Classifica per gruppi al turno ") -ptPT("") -ruRU("") - - -// ImproveColors.cpp - -T_("Please select two players") -deDE("Bitte wählen Sie zwei Spieler") -esES("") -frFR("") -itIT("Seleziona due giocatori") -ptPT("") -ruRU("Выбирете двух игроков") - -T_("The selected players are compatible") -deDE("Die gewählten Spieler sind kompatibel") -esES("") -frFR("") -itIT("I giocatori selezionati sono compatibili") -ptPT("") -ruRU("Выбранные игроки совместимы") - -T_("The selected players are NON compatible") -deDE("Die gewählten Spieler sind NICHT kompatibel") -esES("") -frFR("") -itIT("I giocatori selezionati NON sono compatibili") -ptPT("") -ruRU("Выбранные игроки несовместимы") - -T_("FORBID!") -deDE("NICHT ERLAUBT!") -esES("") -frFR("") -itIT("Proibito!") -ptPT("") -ruRU("Запрещено!") - -T_("Choose two players to exchange") -deDE("Wählen Sie zwei Spieler zum Tausch") -esES("") -frFR("") -itIT("Scegli due giocatori da scambiare") -ptPT("") -ruRU("Выберите двух игроков для обмена") - -T_("This exchange is ILLEGAL") -deDE("Dieser Tausch ist nicht erlaubt") -esES("") -frFR("") -itIT("Questo scambio è illegale") -ptPT("") -ruRU("Этот обмен незаконен") - - -// Newtournament.cpp - -T_("Export Tournament") -deDE("Turnier exportieren") -esES("") -frFR("") -itIT("Esporta torneo") -ptPT("") -ruRU("Экспорт. Турнир") - -T_("Federation FIDE code") -deDE("FIDE Code") -esES("") -frFR("") -itIT("Codice FIDE") -ptPT("") -ruRU("Код ФИДЕ") - -T_("ddmmyyyy for FIDE\nyyyymmdd for USCF") -deDE("ttmmjjjj für FIDE\njjjjmmtt für USCF") -esES("") -frFR("") -itIT("ggmmaaaa per FIDE e FSI\naaaammgg per USCF") -ptPT("") -ruRU("д/м/г для ФИДЕ и FSI\nг/м/д для USCF") - -T_("Check it if pairing (swiss system)\nand rating calculation are made with\n" - "the FIDE rating") -deDE("") -esES("") -frFR("") -itIT("Marca se il torneo è valido\nper le variazioni Elo FIDE") -ptPT("") -ruRU("") - -T_("Max 20 rounds for Swiss System\nCalculated by Vega for round robin") -deDE("Maximal 20 Runden für Swiss\nFür Rundenturnier automatisch") -esES("") -frFR("") -itIT("Max 20 turni per il sistema svizzero.\nCalcolato da Vega per il girone " - "italiano") -ptPT("") -ruRU("Max 20 раундов в Швейц. Системе\nПросчитано " - "Vega для круг.турнира") - -T_("Selected Tie Breaks") -deDE("Gewählte Tie-Breaks") -esES("") -frFR("") -itIT("Spareggi selezionati") -ptPT("") -ruRU("Выбрать перерывы связи") - -T_("Export players in this") -deDE("Exportiere Spieler in") -esES("") -frFR("") -itIT("Esporta giocat. in questo") -ptPT("") -ruRU("Перенести игрока в ") - -T_("FIDE") -deDE("FIDE") -esES("") -frFR("") -itIT("FIDE") -ptPT("") -ruRU("ФИДЕ") - -T_("National") -deDE("National") -esES("") -frFR("") -itIT("Nazionale") -ptPT("") -ruRU("Нац-сть") - -T_("FIDE & Nat") -deDE("FIDE & Nat") -esES("") -frFR("") -itIT("FIDE & Naz") -ptPT("") -ruRU("ФИДЕ & Нац") - -T_("rating interval: Min") -deDE("Wertungsintervall: Min") -esES("") -frFR("") -itIT("intervallo Elo: Min") -ptPT("") -ruRU("Рейтинг-интервал: Min") - -T_("- Max ") -deDE("- Max ") -esES("") -frFR("") -itIT("- Max ") -ptPT("") -ruRU("- Max ") - -T_("Set a name for the tournament") -deDE("Geben Sie einen Namen für das Turnier an") -esES("") -frFR("") -itIT("Inserisci un nome per il torneo") -ptPT("") -ruRU("Указать Название турнира") - -T_("Set the place/city of the tournament") -deDE("Geben Sie den Ort/die Stadt des Turniers an") -esES("") -frFR("") -itIT("Inserisci la città del torneo") -ptPT("") -ruRU("Указать место/город проведения турнира") - -T_("Set the Federation FIDE code") -deDE("Geben Sie den FIDE Code an") -esES("") -frFR("") -itIT("Inserisci il codice FIDE della federazione") -ptPT("") -ruRU("Указать код Федерации ФИДЕ") - -T_("Set the begin date") -deDE("Setzen Sie das Startdatum") -esES("") -frFR("") -itIT("Data di inizio torneo") -ptPT("") -ruRU("Указать дату начало") - -T_("Set the end date") -deDE("Setzen Sie das Enddatum") -esES("") -frFR("") -itIT("Data di fine torneo") -ptPT("") -ruRU("Указать дату окончания") - -T_("Set the name of the arbiter") -deDE("Geben Sie den Namen des Schiedsrichters an") -esES("") -frFR("") -itIT("Nome dell'arbitro del torneo") -ptPT("") -ruRU("Указать имя арбитра") - -T_("You cannot change Play system") -deDE("Sie können das Spielsystem nicht ändern") -esES("") -frFR("") -itIT("Non puoi cambiare il sistema di gioco") -ptPT("") -ruRU("Невозможно изменить систему игры") - -T_("Set the tournament directory") -deDE("Setzen Sie das Turnier-Verzeichnis") -esES("") -frFR("") -itIT("Seleziona la cartella del torneo") -ptPT("") -ruRU("Указать справочник турнира") - -T_("Set the Tournament File Name") -deDE("Setzen Sie den Namen der Turnierdatei") -esES("") -frFR("") -itIT("Inserisci la sigla del torneo") -ptPT("") -ruRU("Указать название файла турнира") - -T_("Change not permitted") -deDE("Ein Ändern ist nicht erlaubt") -esES("") -frFR("") -itIT("Modifica non permessa") -ptPT("") -ruRU("Запрещено Изменение") - -T_("Set the rating interval") -deDE("Eingabe des Wertungsintervalls") -esES("") -frFR("") -itIT("Scegli l'intervallo Elo") -ptPT("") -ruRU("Указать интервал рейтинга") - -T_("A file with the same name already exist!&Choose another name") -deDE("Eine Datei mit gleichem Namen existiert bereits!&Wählen Sie einen neuen " - "Namen") -esES("") -frFR("") -itIT("Un file con lo stesso nome esiste!&Scegli un altro nome") -ptPT("") -ruRU("Файл с таким названием уже существует!Выберите " - "другое") - -T_("You have not selected a directory") -deDE("Sie haben kein Verzeichnis ausgewählt") -esES("") -frFR("") -itIT("Non hai selezionato una cartella") -ptPT("") -ruRU("Справочник не выбран") - - -// RoundRobin.cpp - -T_(" Cross Table") -deDE("") -esES("") -frFR("") -itIT(" Tabellone") -ptPT("") -ruRU("") - -T_(" Cross Table at round ") -deDE("") -esES("") -frFR("") -itIT(" Tabellone al turno ") -ptPT("") -ruRU("") - -T_(" : Round ") -deDE("") -esES("") -frFR("") -itIT(" : Turno ") -ptPT("") -ruRU("") - - -// ForlanoScoreSystem.cpp - -T_("The tournament is not yet started!") -deDE("Das Turnier wurde noch nicht gestartet!") -esES("") -frFR("") -itIT("Il torneo non è iniziato!") -ptPT("") -ruRU("Турнир еще не начат!") - -T_("I'm sorry, but I can't process more than 200 players") -deDE("Ich kann leider nicht mehr als 200 Spieler verwalten") -esES("") -frFR("") -itIT("Opzione non disponibile per più di 200 giocatori") -ptPT("") -ruRU("К сожалению система недоступна для более " - "200 игроков") - -T_("Done Missing Point Score System") -deDE("OK, Fehlpunkte-System in mpscorelog.txt gespeichert") -esES("") -frFR("") -itIT("OK sistema dei punti mancanti") -ptPT("") -ruRU("созданна Система нехватки баллов") - - -// RoundSwiss.cpp - -T_("Error while writing .rnd file") -deDE("") -esES("") -frFR("") -itIT("Errore durante la scrittura del file .rnd") -ptPT("") -ruRU("Ошибка при написании.rnd файла") - -T_("Do you want to assign the WHITE&to the higher rated players?") -deDE("Soll ich den Spielern mit höherer&Wertung die Farbe Weiß zuordnen?") -esES("") -frFR("") -itIT("Vuoi assegnare il Bianco&al giocatore con l'elo più alto?") -ptPT("") -ruRU("Хотете дать белый цвет игроку у кот. рейтинг " - "больше?") - - -// flist.cpp - -T_("Out of memory! & I have to close the program :-(") -deDE("Kein Speicher mehr frei! & Das Programm wird beendet :-(") -esES("") -frFR("") -itIT("Memoria finita & Devo terminare il programma :-(") -ptPT("") -ruRU("Закончилась память & Программа должна " - "быть закрыта :-(") - - -// swissDubov9.cpp - -T_("I cannot do the pairing!&Trying to set all upfloater ON and restart") -deDE("Keine Paarung möglich!&Ich setze alle Upfloater und starte erneut") -esES("") -frFR("") -itIT("Non posso generare l'abbinamento!&Provo a modificare gli upfloater e riparto") -ptPT("") -ruRU("Невозможно создать пары!&Система попытается " - "изменить upfloater и перезагрузиться") - -T_("I cannot do the pairing!&Trying to merge all the groups and restart") -deDE("Keine Paarung möglich!&Ich mische alle Gruppen und starte erneut") -esES("") -frFR("") -itIT("Non posso generare l'abbinamento!&Creo un solo gruppo e riparto") -ptPT("") -ruRU("Невозможно создать пары!&Система попытается " - "создать группы и перезагрузиться") - -T_("The pairing is impossible.&Try a manual pairing") -deDE("Keine automatische Paarung gefunden.&Bitte geben Sie die Paarungen manuell " - "ein") -esES("") -frFR("") -itIT("L'abbinamento è impossibile!&Prova con uno manuale") -ptPT("") -ruRU("Группирование невозможно!&Попробуй вручную.") - - -// swissLim6.cpp - -T_("Error while writing verbose file") -deDE("Fehler beim Schreiben der Datei verbose.txt") -esES("") -frFR("") -itIT("Errore durante la scrittura del file verbose.txt") -ptPT("") -ruRU("Ошибка во время записи файла с объяснениями") - - -// ManualPairing.cpp - -T_("use CTRL+'up' and CTRL+'down'\nto move the pair up or down") -deDE("CTRL+'hoch' und CTRL+'runter'\nverschieben die Paarung nach oben/unten") -esES("") -frFR("") -itIT("usa CTRL+'su' e CTRL+'giù'\nper modificare l'ordine di scacchiera") -ptPT("") -ruRU("CTRL+'вверх' и CTRL+'вниз'\nдля изменения порядк. " - "номера стола") - -T_("Please fill each ID field") -deDE("Bitte füllen Sie alle ID Felder aus") -esES("") -frFR("") -itIT("Riempi entrambi i capi ID") -ptPT("") -ruRU("Заполните все номера игрока") - -T_("Only 1 player of the pair can be the BYE") -deDE("Es ist nur ein Freilos pro Paarung erlaubt") -esES("") -frFR("") -itIT("Solo uno dei due può essere il BYE") -ptPT("") -ruRU("Только один игрок пары может получить " - "BYE") - -T_("The White ID is out of range") -deDE("Die ID von Weiß ist außerhalb des gültigen Bereichs") -esES("") -frFR("") -itIT("L'ID del Bianco è scorretto") -ptPT("") -ruRU("Ошибка в номере играющего белыми") - -T_("The Black ID is out of range") -deDE("Die ID von Schwarz ist außerhalb des gültigen Bereichs") -esES("") -frFR("") -itIT("L'ID del Nero è scorretto") -ptPT("") -ruRU("Ошибка в номере играющего черными") - -T_("The White player is NOT available") -deDE("Der Spieler für Weiß ist nicht verfügbar") -esES("") -frFR("") -itIT("Il giocatore Bianco non è disponibile") -ptPT("") -ruRU("Играющий белыми недоступен") - -T_("The Black player is NOT available") -deDE("Der Spieler für Schwarz ist nicht verfügbar") -esES("") -frFR("") -itIT("Il giocatore Nero non è disponibile") -ptPT("") -ruRU("Играющий черными недоступен") - -T_("The selected players are NOT compatible") -deDE("Die ausgewählten Spieler sind nicht kompatibel") -esES("") -frFR("") -itIT("I giocatori inseriti NON sono compatibili") -ptPT("") -ruRU("Выбранные игроки несовместимы ") - -T_("The White player has already been paired") -deDE("Der Spieler für Weiß wurde bereits einer Paarung zugewiesen") -esES("") -frFR("") -itIT("Il giocatore bianco è stato già abbinato") -ptPT("") -ruRU("Игрок Играющий белыми уже имеет пару") - -T_("The Black player has already been paired") -deDE("Der Spieler für Schwarz wurde bereits einer Paarung zugewiesen") -esES("") -frFR("") -itIT("Il giocatore nero è stato già abbinato") -ptPT("") -ruRU("Игрок Играющий черными уже имеет пару") - -T_("File manual pairing (*.man)") -deDE("Speichere manuelle Paarung (*.man)") -esES("") -frFR("") -itIT("File abbinamento manuale (*.man)") -ptPT("") -ruRU("Файл с парами,созданный вручную (*.man)") - -T_("Save pairing file (*.man)") -deDE("Speichere Paarungs-Datei (*.man)") -esES("") -frFR("") -itIT("Salva file abbinamento (*.man)") -ptPT("") -ruRU("Сохр.файл с парами (*.man)") - -T_("No pair to save") -deDE("Keine Paarung zum Speichern") -esES("") -frFR("") -itIT("Non ci sono coppie da salvare") -ptPT("") -ruRU("Отсутствуют сочитания для сохранения") - -T_("You must pair all the available players") -deDE("Sie müssen alle verfügbaren Spieler einer Paarung zuweisen") -esES("") -frFR("") -itIT("Devi inserire tutti i giocatori disponibili") -ptPT("") -ruRU("Должны быть внесены все доступные игроки") - - -// Fidereport.cpp - -T_(" FIDE rating variation at round ") -deDE("") -esES("") -frFR("") -itIT(" Variazioni Elo FIDE al turno ") -ptPT("") -ruRU("") - -T_("Enter the tournament ID") -deDE("Geben Sie die Turnier ID ein") -esES("") -frFR("") -itIT("Inserisci l'ID del torneo") -ptPT("") -ruRU("Внести номер турнира") diff --git a/uppdev/VegaTeam5/pairing89.cpp b/uppdev/VegaTeam5/pairing89.cpp deleted file mode 100644 index 05de70541..000000000 --- a/uppdev/VegaTeam5/pairing89.cpp +++ /dev/null @@ -1,843 +0,0 @@ -#include -#include "Tournament.h" -#include "pairing88.h" - - -//extern ofstream verbosefile; - -/* Generazione di abbinamenti per un torneo di scacchi - a sistema Svizzero. - - - Contiene dei controlli per evitare loop: ogni giocatore non pu� - avere pi di n-1 incompatibilit�in un gruppo di n giocatori - - - Ricorda i giocatori scelti in occasione di ogni accoppiamento - - - Tiene traccia del miglior accoppiamento parziale qualora l'accoppiamento - complessivo non possa essere realizzato -*/ - -extern int CanPlayWith(int player1, int player2, int round); - -/* - * -------- class implementation --------------- - */ - -// -// This is the engine that produce the pairing. I am proude of it!!! :-) -// It Realizes the pairing of 'np' players put on 2 columns as S1 and S2 in -// the FIDE handbook . -// It return the numebr of pair done, 'nmade' on a maximum np/2. -// Se l'abbinamento e' riuscito vi saranno n_partial=n/2 coppie fatte. -// The numbers of floaters will be n_floaters = np-2*nmade -// -int TPairingDubov::pairing(void) -{ int i, j, l, n_couple, sum, found; - int pairing_possible = 1, max_pair; - int count, i_player, j_player, checkCompatibility=0; - int ll, opponent, i_player_last, j_player_last; - int n_partial=0; //pair at the moment - int avoid[LIMIT+1]; - - resetplayerFlag(IsPlayerFree, np); - resetchallengerFlag(challengerFlag, np); - - if (np_s1==0) { - // build the opponent list for each player in the case np_s1=0 - for (i=1; i<=np2; i++) { // the last player is not considered - count = 0; // counter of the compatible players - // verbosefile << "player " << idpl[i] << ":"; - for (j=1; j<=np2; j++) { // prima meta' del vettore - opponent = challengerFlag[j]; // opponent list - if (CanPlayWith(idpl[i], idpl[ opponent ], nround)) { - count++; - remind[count] = opponent; - } - } - for (j=np2+i; j<=np; j++) { // seconda meta' - opponent = challengerFlag[j]; // opponent list - if (CanPlayWith(idpl[i], idpl[ opponent ], nround)) { - count++; - remind[count] = opponent; - } - } - remind[0] = count; - - /* for (l=1; l<=count; l++) { - verbosefile << idpl[ remind[l] ] <<"; "; - } - verbosefile << endl; - */ - // allocate space for a vector that store 'remind', that is the opponent list - sss[i] = (unsigned int *) calloc(count+1, sizeof(unsigned int) ); - - // verbosefile << "opps= " << count << " -> "; - for (l=0; l<=count; l++) { - sss[i][l] = remind[l]; //store remind - //if (l>0) verbosefile << idpl[ sss[i][l] ] <<", "; - } - //verbosefile << endl; - } - for (i=np2+1; i<=np-1; i++) { // the last player is not considered - count = 0; // counter of the compatible players -// verbosefile << "player " << idpl[i] << ":"; - for (j=np2; j>i-np2; j--) { - opponent = challengerFlag[j]; // opponent list - if (CanPlayWith(idpl[i], idpl[ opponent ], nround)) { - count++; - remind[count] = opponent; - } - } - remind[0] = count; - - //for (l=1; l<=count; l++) { - // verbosefile << idpl[ remind[l] ] <<"; "; - //} - //verbosefile << endl; - - // allocate space for a vector that store 'remind', that is the opponent list - sss[i] = (unsigned int *) calloc(count+1, sizeof(unsigned int) ); - - // verbosefile << "opps= " << count << " -> "; - for (l=0; l<=count; l++) { - sss[i][l] = remind[l]; //store remind - //if (l>0) verbosefile << idpl[ sss[i][l] ] <<", "; - } - //verbosefile << endl; - } - // last element need a special treatment because he has no opponent - sss[np] = (unsigned int *) calloc(1, sizeof(unsigned int) ); - sss[np][0] = 0; - } - else { // np_s1>0 - // build the opponent list for each player in the case np_s1=0 - for (i=1; i<=np_s1; i++) { - count = 0; // counter of the compatible players - //verbosefile << "player " << idpl[i] << ":"; - for (j=1; j<=np2; j++) { - opponent = challengerFlag[j]; // opponent list - if (CanPlayWith(idpl[i], idpl[ opponent ], nround)) { - count++; - remind[count] = opponent; - } - } - remind[0] = count; - - /* for (l=1; l<=count; l++) { - verbosefile << idpl[ sss[i][l] ] <<"; "; - } - verbosefile << endl; - */ - // allocate space for a vector that store 'remind', that is the opponent list - sss[i] = (unsigned int *) calloc(count+1, sizeof(unsigned int) ); - - //verbosefile << "opps= " << count << " -> "; - for (l=0; l<=count; l++) { - sss[i][l] = remind[l]; //store remind - //if (l>0) verbosefile<< idpl[ sss[i][l] ] <<","; - } - //verbosefile < " << endl; - } - } - - - // reset the cursor of each vector_challenger - for (i=1; i<=np; i++) curs_position[i] = 0; - - // reset the array that remind the destroyed pairing - for (i=0; i<=LIMIT; i++) avoid[i] = 0; - - // reset the pair matrix - for (i=1; i<=np2; i++) - for (j=0; j<=1; j++) { - pair[i][j] = 0; - } - - max_pair = np2; // massimo numero di coppie possibile: sono np/2 se S1=S2 - // altrimenti np_s1 se S1maximum_possible_pair) - { - for (l=1; l<=maximum_possible_pair; l++) { - partial_pair[l][0] = pair[l][0]; - partial_pair[l][1] = pair[l][1]; - } - return maximum_possible_pair; - } - //if (np_s1) i_player = findPlayer(IsPlayerFree, np_s1+1); - //else - i_player = findPlayer(IsPlayerFree, np); - //verbosefile <<"Found " <=np) { verbosefile <0 imply i_player= LIMIT) { - //if (IS_SET_VERBOSE) verbosefile <<" LIMIT REACHED... going out...\n"; - Exclamation(" The iteration limit has been reached.&I am going out..."); - flag_limit = 1; - return n_partial; - } - for (ll=1; ll<=n_couple-1; ll++) - avoid[ avoid[0] ] += pair[ll][0] * pair[ll][1]; - checkCompatibility = 1; // flag to force the check on the next pair after the restart - - n_couple = n_couple - 2; - - // restore the flags of IsPlayerFree[] - resetplayerFlag(IsPlayerFree, np); - - // restore IsPlayerFree[] of incompatibility - for (ll=1; ll<=n_couple; ll++) - { i_player_last = pair[ll][0]; - IsPlayerFree[i_player_last] = 0; - //curs_position[i_player_last] = 0; - - j_player_last = pair[ll][1]; - IsPlayerFree[j_player_last] = 0; - //curs_position[j_player_last] = 0; - } - n_couple++; //restart the pairing from N-1 - } - } - } - if (pairing_possible) return max_pair; - else return n_partial; -} - - -// set to 1 all the elements of the vector -void TPairingDubov::resetplayerFlag(int vector[], int n) -{ int i; - for (i=1; i<=n; i++) vector[i] = 1; // 1 = not busy - // if ( idpl[ vector[np2] ] == -1 && np>2) vector[np2+1] = 0; // ????????? - if ( idpl[ vector[np2] ] == -1 ) vector[np2] = 0; // ????????? -} - -void TPairingDubov::resetchallengerFlag(int vector[], int n) -{ int i; - - if (np_s1) { // ci sono meno giocatori in S1 che in S2 - for (i=1; i<=np2; i++) vector[i] = np2+i; - // for (i=n; i>np2; i--) vector[i] = n-i+1; - for (i=np2+1; i<=n; i++) vector[i] = i - np2; // fixed bug CONTROLLARE - - // rimuove np_s1 giocatori dal challengerflag per evitare incontri tra giocatori di S1 - for (i=n; i > np2; i--) vector[i] = 0; - - } - else - { for (i=1; i<=np2; i++) vector[i] = np2+i; - // for (i=n; i>np2; i--) vector[i] = n-i+1; - for (i=np2+1; i<=n; i++) vector[i] = i - np2; // fixed bug CONTROLLARE - } - //for (l=1; l<=n; l++) verbosefile << idpl[ vector[l] ] <<", "; verbosefile << endl; -} - -// get the next free row in which find the player i_th -int TPairingDubov::findPlayer(int index[], int n) -{ int r=1; - while ( ( index[r]==0 || sss[r][0]==0 ) && rsss[i][0] ) { // overcame the limit - curs_position[i] = 0; // restart the cursor from zero; - return 0; // no player found => player i_th not compatible with anybody - } - else { - curs_position[i] = j; // adjourn the cursor - return sss[i][j]; - } - return 0; // fictitious return; -} - - -int TPairingDubov::dopairingMax(int nplayer, int npair_max, int idplayers[], int S1_S2[][2], - int arrfloat[], int arrpartial[][2], int round) -// -// PURPOSE: This is the driver of the routine pairing. It looks for the floaters -// The players enter in two columns in idplayers. The final pairing is put -// in S1_S2 -// -// INPUT -// nplayer = total players to be paired -// npair_max = maximum pairs that it is expected to obtain ( less or equal to nplayer/2 ) -// idplayers[] = vector containg the ID of the nplayers players -// S1_S2[][2] = will contain the final pairs on success -// arrfloat[] = will contain the eventual floaters -// arrpartial[][2] = will contain the pairs if the floaters are met -// round = current round -// -// OUTPUT -// return the number of pairs done: they are nplayers/2 if there are no -// floaters, otherwise they are less than nplayers/2. -// -{ int i; - int count_floaters = 0; - int id; - - //------------- - np = nplayer; // e' globale - np2 = (int) np/2; // e' globale - np_s1 = 0; // e' globale e se zero significa S1 = S2 - maximum_possible_pair = npair_max; // e' globale - for (i=1; i<=np; i++) idpl[i] = idplayers[i]; // now is made global - nround = round; // now is global - //------------- - - nmade = pairing(); - // look up pair - if ( nmade == np2 ) // no floaters: reached the maximum pairs possible - { n_floaters = 0; - for (i=1; i<=np2; i++) - { id = pair[i][0]; - S1_S2[i][0] = idplayers[id]; - - id = pair[i][1]; - S1_S2[i][1] = idplayers[id]; - } - arrfloat[0] = 0; // no floaters - } - else // floaters treatment - { - n_floaters = 2*(np2-nmade); - for (i=1; i<=np; i++) mask[i] = 1; - for (i=1; i<=nmade; i++) - { // let emerge the the floaters, they aren't in partial and in mask are denoted with 1 - mask[ partial_pair[i][0] ] = 0; - mask[ partial_pair[i][1] ] = 0; - } - for (i=1; i<=np; i++) - { if (mask[i] == 1) { - count_floaters++; - arrfloat[count_floaters] = i; - } - } - } - - if (n_floaters) { - // set partial_pair array - arrfloat[0] = n_floaters; - for (i=1; i<=nmade; i++) - { - id = partial_pair[i][0]; - arrpartial[i][0] = idplayers[id]; - - id = partial_pair[i][1]; - arrpartial[i][1]= idplayers[id]; - } - - // set floaters looking up their real id - for (i=1; i<=n_floaters; i++) - { - id = arrfloat[i]; - arrfloat[i] = idplayers[id]; - } - } - for (i=1; i<=np; i++) if (sss[i] != NULL) free(sss[i]); - if (flag_limit) return -nmade; - else return nmade; -} - - -int TPairingDubov::dopairingFixed(int nplayer, int nplayer_s1, int idplayers[], - int S1_S2[][2], int round) -// -// PURPOSE: This is the driver of the routine pairing. It looks for the floaters -// The players enter in two columns in idplayers. The final pairing is put -// in S1_S2 -// -// INPUT -// nplayer = total players to be paired -// player_s1 = players to pair in S1 -// idplayers[] = vector containg the ID of the nplayers players -// S1_S2[][2] = will contain the final pairs on success -// round = current round -// -// OUTPUT -// return the number of pairs done: they are nplayers/2 if there are no -// floaters, otherwise they are less than nplayers/2. -// -{ int i; - int id; - - //------------- - np = nplayer; // e' globale - np2 = np/2; // e' globale - np_s1 = maximum_possible_pair = nplayer_s1; // e' globale S1 < S2 => np_s1 < np_s2 - for (i=1; i<=np; i++) idpl[i] = idplayers[i]; // now is made global - nround = round; // now is global - //------------- - - nmade = pairing(); - - // look up pair - if ( nmade == np_s1 ) - { - for (i=1; i<=np_s1; i++) - { id = pair[i][0]; - S1_S2[i][0] = idplayers[id]; - - id = pair[i][1]; - S1_S2[i][1] = idplayers[id]; - } - } - else nmade = 0; // l'accoppiamento e' stato impossibile - for (i=1; i<=np_s1; i++) delete sss[i]; - return nmade; -} - -//------------------- end implementazione TPairingDubov ------------------- - - -//------------------- Start implementazione TPairingLim ------------------- - -int TPairingLim::pairingLIM() -{ int i, j, l, n_couple, sum, found; - int pairing_possible = 1, max_pair; - int count, i_player, j_player, checkCompatibility=0; - int ll, opponent, i_player_last, j_player_last; - int n_partial=0; //pair at the moment - int avoid[LIMIT+1]; - int opponentlist[N_PLAYER_MAX+1]; - int typefloater; - - resetplayerFlag(IsPlayerFree, np); - - // reset the sss matrix to null - for (i=1; i<=np; i++) sss[i] = NULL; - - // reset the cursor of each vector_challenger - for (i=1; i<=np; i++) curs_position[i] = 0; - - // reset the array that remind the destroyed pairing - for (i=0; i<=LIMIT; i++) avoid[i] = 0; - - // reset the pair matrix - for (i=1; i<=np2; i++) - for (j=0; j<=1; j++) { - pair[i][j] = 0; - } - //verbosefile <<"group with points " << scoregroup<maximum_possible_pair) - { // go to finish - for (l=1; l<=maximum_possible_pair; l++) { - partial_pair[l][0] = pair[l][0]; - partial_pair[l][1] = pair[l][1]; - } - return maximum_possible_pair; - } - if (TD.IS_SET_VERBOSE) verbosefile <<" pair " <0) verbosefile << idpl[ sss[i_player][l] ] <<", "; - } - -LABEL100: - - if (i_player<=np) j_player = findChallenger( i_player, np); - else j_player = 0; // destroy the last good couple - if (TD.IS_SET_VERBOSE) { - if (j_player) verbosefile <<" try opponent " << idpl[j_player]<< "\n"; - else verbosefile <<" has no suitable opponent! restart... " << "\n"; - } - - found=0; - if (j_player) { // j_player>0 imply i_player= LIMIT) { - Exclamation(" The iteration limit has been reached.&I am going out..."); - //----if (IS_SET_VERBOSE) verbosefile <<" LIMIT REACHED... going out...\n"; - flag_limit = 1; - return n_partial; - } - for (ll=1; ll<=n_couple-1; ll++) - avoid[ avoid[0] ] += pair[ll][0] * pair[ll][1]; - checkCompatibility = 1; // flag to force the check on the next pair after the restart - - n_couple = n_couple - 2; - - // restore the flags of IsPlayerFree[] - resetplayerFlag(IsPlayerFree, np); - - // restore IsPlayerFree[] before of incompatibility - for (ll=1; ll<=n_couple; ll++) - { i_player_last = pair[ll][0]; - IsPlayerFree[i_player_last] = 0; - //curs_position[i_player_last] = 0; - - j_player_last = pair[ll][1]; - IsPlayerFree[j_player_last] = 0; - //curs_position[j_player_last] = 0; - } - n_couple++; //restart the pairing from N-1 - } - } - } - if (pairing_possible) return max_pair; - else return n_partial; -} - -// get the next free row in which find the player i_th -int TPairingLim::findPlayerLIM(int index[], int n, int *typeFloater) -{ int r; - r=1; // look for downfloater from left to right - while ( index[r]==0 && rscoregroup) { // found downfloater - *typeFloater = DOWNFLOATER; - return r; - } - - r=n; // look for upfloater from right to left - while ( index[r]==0 && r>1 ) r--; - if (player[ idpl[r] ].tiebreak[SCORE]1 ) r--; - *typeFloater = STANDARD; - return r; - } -} - -void TPairingLim::makevectorchallengers(int id, int freeplayer[], int challengers[], int floaterType) -{ int i, count = 0, aux, m; - int x, y, t, duec; - - // grab the remained unpaired players. - switch (floaterType) - { case STANDARD: // STANDARD TREATMENT: player id is NOT a floater - - if (DOWNWARD) { - // moving downward get all unpaired players from left to right - // 1,2,3,4, 5,6,7,8 - for (i=1; i<=np; i++) { - if (freeplayer[i]) { - count++; - challengers[count] = i; - } - } - // Exchange the bottom half with the top half - // 5,6,7,8 1,2,3,4, - m = count/2; - for (i=1; i<=m; i++) { - aux = challengers[i]; - challengers[i] = challengers[i+m]; - challengers[i+m] = aux; - } - // revert the order of the bottom half - // 5,6,7,8 3,4,1,2, - for (i=1; i<=m/2; i++) { - aux = challengers[i+m]; - challengers[i+m] = challengers[count + 1 -i]; - challengers[count + 1 -i] = aux; - } - } - else { - // moving upward get all unpaired players from right to left - // 1,2,3,4, 5,6,7,8 it is the final wanted order! - for (i=1; i<=np; i++) { - if (freeplayer[i]) { - count++; - challengers[count] = i; - } - } - // revert the order of the top half - // 4,3,1,2, 5,6,7,8 it is the final wanted order! - m = count/2; - for (i=1; i<=m/2; i++) { - aux = challengers[i]; - challengers[i] = challengers[m + 1 -i]; - challengers[m + 1 -i] = aux; - } - } - break; - - case DOWNFLOATER: - // DOWNFLOATER TREATMENT: player id is a downfloater - // ..... no sort, just the actual rating order in descendent order - if (TD.IS_SET_VERBOSE) verbosefile <<"(downfloater) " ; - for (i=1; i<=np; i++) { - if (freeplayer[i]){ - count++; - challengers[count] = i; - } - } - break; - - case UPFLOATER: - // UPFLOATER TREATMENT: player id is an upfloater - // ..... no sort, grab the remained player from the lowest score-rated to - // the highest rated, i.e. the reverse order - if (TD.IS_SET_VERBOSE) verbosefile <<"(upfloater) "; - for (i=np; i>=1; i--) { - if (freeplayer[i]) { - count++; - challengers[count] = i; - } - } - break; - } - - // sort the challengers depending on the due color of player id - duec=player[ idpl[id] ].duecolor;; - if (duec == -1) { // if duecolor neutral then do not sort the color - challengers[0] = count; - return; - } - y=2; - while ( y<=count) - { if ( player[ idpl[challengers[y]] ].duecolor == duec ) y++; - else { - // found a different duecolor that must be brought up - // if this do not alter the ranking score - x = y; - while (x>1) { - if (player[ idpl[challengers[x-1]] ].duecolor == duec - && player[ idpl[challengers[x-1]] ].tiebreak[SCORE]==player[ idpl[challengers[x]] ].tiebreak[SCORE]) - { t = challengers[x-1]; challengers[x-1] = challengers[x]; challengers[x] = t; x--;} - else break; - } - y++; - } - } - challengers[0] = count; -} - -int TPairingLim::dopairingMax(int nplayer, int npair_max, int idplayers[], int S1_S2[][2], - int arrfloat[], int arrpartial[][2], int round, float SCOREGROUP, String& verbose) -// -// PURPOSE: This is the driver of the routine pairing. It looks for the floaters -// The players enter in two columns in idplayers. The final pairing is put -// in S1_S2 -// -// INPUT -// nplayer = total players to be paired -// npair_max = maximum pairs that it is expected to obtain ( less or equal to nplayer/2 ) -// idplayers[] = vector containg the ID of the nplayers players -// S1_S2[][2] = will contain the final pairs on success -// arrfloat[] = will contain the eventual floaters -// arrpartial[][2] = will contain the pairs if the floaters are met -// round = current round -// -// OUTPUT -// return the number of pairs done: they are nplayers/2 if there are no -// floaters, otherwise they are less than nplayers/2. -// -{ int i; - int count_floaters = 0; - int id; - verbosefile = ""; - //------------- - np = nplayer; // e' globale - np2 = (int) np/2; // e' globale - np_s1 = 0; // e' globale e se zero significa S1 = S2 - maximum_possible_pair = npair_max; // e' globale - for (i=1; i<=np; i++) idpl[i] = idplayers[i]; // now is made global - nround = round; // now is global - //------------- - - // Lim treatment : check scoregroup - scoregroup = SCOREGROUP; //score of the group we are considering - if ( SCOREGROUP >= (round-1)*TD.WON/2.) DOWNWARD=1; - else DOWNWARD=0; - nmade = pairingLIM(); - - // look up pair - if ( nmade == np2 ) // no floaters: reached the maximum pairs possible - { n_floaters = 0; - for (i=1; i<=np2; i++) - { id = pair[i][0]; - S1_S2[i][0] = idplayers[id]; - - id = pair[i][1]; - S1_S2[i][1] = idplayers[id]; - } - arrfloat[0] = 0; // no floaters - } - else // floaters treatment - { - n_floaters = 2*(np2-nmade); - for (i=1; i<=np; i++) mask[i] = 1; - for (i=1; i<=nmade; i++) - { // let emerge the the floaters, they aren't in partial and in mask are denoted with 1 - mask[ partial_pair[i][0] ] = 0; - mask[ partial_pair[i][1] ] = 0; - } - for (i=1; i<=np; i++) - { if (mask[i] == 1) { - count_floaters++; - arrfloat[count_floaters] = i; - } - } - } - - if (n_floaters) { - // set partial_pair array - arrfloat[0] = n_floaters; - for (i=1; i<=nmade; i++) - { - id = partial_pair[i][0]; - arrpartial[i][0] = idplayers[id]; - - id = partial_pair[i][1]; - arrpartial[i][1]= idplayers[id]; - } - - // set floaters looking up their real id - for (i=1; i<=n_floaters; i++) - { - id = arrfloat[i]; - arrfloat[i] = idplayers[id]; - } - } - for (i=1; i<=np; i++) if (sss[i] != NULL) free(sss[i]); - verbose = verbosefile; - if (flag_limit) return -nmade; - else return nmade; -} diff --git a/uppdev/VegaTeam5/vegadb.csv b/uppdev/VegaTeam5/vegadb.csv deleted file mode 100644 index 70edd52ba..000000000 --- a/uppdev/VegaTeam5/vegadb.csv +++ /dev/null @@ -1,13535 +0,0 @@ -MENIN Massimo;1439;2N;30;PD;131058;0;104053;m -PENCIU Eugen;1706;2N;30;TO;100854;0;114857;m -PETRA Massimiliano;1763;2N;30;TO;170670;0;117024;m -TOGNETTI Gian Robert;1700;2N;30;RM;150578;0;115003;m -PETRACCA Michele;1580;3N;30;RM;130476;0;117272;m -VIVIANI Filippo;1560;3N;30;RM;070878;0;117273;m -FESTA Mario;1700;2N;30;MI;230783;0;105658;m -CARUZ Mauro;1582;3N;30;MI;281067;0;117230;m -DECLEVA Gianni;1895;1N;0;TS;090448;823295;116209;m -ESPOSITO Michele;1605;2N;30;MI;051191;0;117226;m -MIO Antonio;1580;3N;30;CT;180583;0;105787;m -RICCOBENE Giuseppe;1580;3N;30;CT;031280;0;117241;m -MESSINA Elisabetta;1580;3N;30;CT;080290;0;113696;f -NOVELLO Salvatore;1450;3N;30;CT;120580;0;106132;m -CONGEDO Giuseppe;1580;3N;30;LE;250182;0;109833;m -CONGEDO Paolo;1455;3N;30;LE;100591;0;103939;m -CURACHI Nico;1580;3N;30;LE;050162;0;17;m -MANTA Alberto;1572;3N;30;LE;281283;0;114939;m -STEFANELLI Andrea;1548;3N;30;LE;071284;0;114938;m -NICOTRA Fabrizio;1529;3N;30;SS;130161;0;117252;m -SOTGIU Pasqualino;1571;3N;30;SS;260475;0;120704;m -MANCA Giovanni;1491;3N;30;SS;100366;0;117250;m -CRISTINO Giuseppe;1611;2N;30;AV;070876;0;117233;m -FRANZESE Luigi;1643;2N;30;NA;140969;0;114081;m -D'AGOSTINO Giuseppe;1580;3N;30;NA;011040;0;101072;m -MONTELLA Salvatore;1613;2N;30;NA;070673;0;114445;m -ANGELINI Francesco;1649;2N;30;VE;230986;0;109340;m -RORATO Giovanni;2057;CM;0;VE;241085;824127;118776;m -FASANO Francesco;1629;2N;30;VE;040486;0;115810;m -CORUCCI Federico;1544;3N;30;PU;240194;0;116083;m -DINI Alberto;1580;3N;30;PU;011192;0;115457;m -FRANCALANCIA Mariach;1501;3N;30;PU;170992;0;112892;f -ROMBALDONI Brian;1704;2N;30;PU;041193;0;107922;m -GIAMPAOLETTI Andrea;1721;2N;30;MC;241266;0;111098;m -RICCI Alessio;1670;2N;30;AN;150376;0;111104;m -FICOSECCO Loretta;1580;3N;30;AN;161154;0;111097;f -SODDU Davide;1476;3N;30;SS;040966;0;117255;m -CASU Matteo;1506;3N;30;SS;070991;0;117452;m -BIELLO Costantino;1580;3N;30;SS;030869;0;117555;m -MARCELLONI Marcello;1709;2N;30;AQ;090469;0;103412;m -MAZZA Daniele;1673;2N;30;BA;140968;0;118859;m -GARGANO Innocenzo;1499;3N;30;AQ;090355;0;111249;m -FALCIONE Carmine;1502;3N;30;AQ;161051;0;103411;m -DI-CICCO Daniela;1302;3N;30;AN;160357;0;104757;f -RICCIARDI Andrea;1700;2N;30;MC;260268;0;117184;m -POMILI Gaetano;1580;3N;30;MC;020758;0;111446;m -OLIVIERI Gianni;1580;2N;30;AP;270856;0;47;m -RAPETTI Giuseppe;1604;2N;30;AL;171169;0;110497;m -ZERBINO Claudio;1700;2N;0;VC;;0;52;m -TASSONE Vincenzo;1742;2N;0;RM;110363;0;100358;m -ABUHAMDIEH Arafat;1589;2N;30;RM;080851;0;112355;m -ACUNZO Domenico;1764;1N;0;BG;071142;825751;100891;m -COVA Alessandro;1913;1N;0;AT;130877;818194;105307;m -ALBERTINI Daniele;1718;2N;30;VA;020673;0;101377;m -ALBURNO Franco;1607;2N;30;VE;110935;0;103063;m -ALFIERI Paolo;2037;CM;0;VT;270377;812889;108673;m -ALLEGRANTI Luca;2035;CM;0;TN;200462;813818;101256;m -ALO' Lucio;1559;2N;30;CS;181049;0;107508;m -AMATO Giampiero;1971;CM;0;ME;160970;813303;105329;m -AMATO Glauco;1877;1N;30;CT;000471;0;105224;m -AMBROSI Arcangelo;1891;CM;30;SP;220730;0;105479;m -ANNONI Riccardo;2068;CM;0;LC;270372;814237;107045;m -ANTONIACCI Riccardo;1980;CM;0;RN;260254;804908;105839;m -ARABITO Giuseppe;1922;1N;0;RM;291156;822140;100347;m -ARIAUDO Claudio;2025;CM;0;CN;251261;815535;105092;m -ARNETTA Piero;1916;1N;30;PA;190777;0;114973;m -ASPERTI Fabio;1637;2N;30;BG;220561;0;101654;m -AVOLA Salvatore;1949;1N;0;CT;300560;817198;106251;m -AVOLIO Giovanni;1808;CM;30;NA;061145;0;110111;m -DI-TERLIZZI Domenico;1463;3N;30;PC;070344;0;100164;m -BADANO Giancarlo;1679;2N;30;AL;300960;0;106824;m -BALBI Fabio;1862;1N;30;VE;;0;101465;m -BARBAFIERA Luigi;1972;CM;0;SI;130943;810363;107565;m -BARIO Emilio;1697;2N;30;GE;040947;0;101316;m -BARTOLINI Sauro;1661;2N;30;PT;111045;0;106012;m -BASILE Aldo;1446;2N;30;NA;250522;0;104620;m -BATTAGIN Mose';1847;CM;30;PD;210862;0;106779;m -BECCARIS Gabriele;2025;CM;0;AT;250172;813036;105295;m -BELLONI Umberto;1908;1N;0;VE;120244;815446;104183;m -BENAGLIA Giovanni;2011;CM;0;TN;250971;814270;101257;m -BENOCCI Umiliano;1517;2N;30;SI;060135;0;107564;m -BERGAMINI Guido;1821;1N;30;VR;180756;0;100927;m -BERGOGLIO Giuseppe;1454;2N;30;TO;010633;0;110469;m -BERRINO Umberto;1709;2N;30;TN;141154;0;113671;m -BERTAMINI Alberto;1574;2N;30;MI;200662;0;101638;m -BERTI Massimiliano;1763;2N;30;FI;130371;0;113675;m -BERTINO Giacomo;2011;CM;0;TP;050261;813230;100214;m -BERUTTI Mario;1793;1N;0;TO;281064;818925;105182;m -BLANC Pierre;1910;1N;30;TO;291175;0;105183;m -BLANDINI Carmelo;1984;1N;0;SR;030151;817481;103694;m -BOCCI Alessandro;1886;1N;0;PR;070365;817201;117077;m -BOLDRINI Paolo;2029;CM;30;BO;001148;0;95;m -BOLLA Vittorio;1751;2N;30;RM;311234;0;100233;m -BONANI Georg;1883;CM;0;BZ;130658;813834;101947;m -BONIVENTO Sandro;1724;2N;30;VE;150745;0;103067;m -BORGHI Bruno;1628;2N;30;VE;241237;0;103068;m -BORRONI Enrico;2076;CM;0;NO;250456;814490;104879;m -BOSCOLO Marco B.;1758;2N;30;VE;090672;0;103350;m -BOSETTI Roberto;1665;1N;30;TO;310556;0;103246;m -BRIGATI Alessandro;2090;CM;0;PC;230169;823082;103001;m -BRIOSCHI Camillo;1811;1N;30;MI;010145;0;103964;m -BRUGNOLO Paolo;1343;2N;30;GE;020938;0;101317;m -BRUNATO Davide;1856;1N;30;TV;000469;0;105901;m -BRUNO Fabrizio;1957;1N;0;TO;021065;827274;100783;m -BUCHICCHIO Antonio;1658;1N;30;SS;070845;0;102430;m -BUIANO Fabio;2108;CM;0;NA;170373;807168;110982;m -BUSATO Antonio;1463;1N;30;VI;190315;0;109975;m -BUSI Massimo;1884;1N;0;TV;040755;817929;107817;m -BUZIO Alberto;1927;1N;0;VB;271243;820849;100479;m -CAIAZZO Diego;1564;1N;30;NA;251055;0;102072;m -CALO' Andrea;1759;2N;30;NA;080178;0;105631;m -CALEFFI Cesare;1907;1N;30;SP;120861;0;103649;m -CALVANI Emanuele;1568;2N;30;LE;170256;0;105371;m -CAMARDA Giuseppe;1490;2N;30;PA;230863;0;109720;m -CAMBIERI Mario;1814;1N;30;BG;180759;0;105524;m -CAMBONI Paolo;1925;1N;30;SS;000565;0;117117;m -CAMMAROTA Vittorio;2002;CM;0;BG;170359;811670;101661;m -CAMPANA Francesco;1688;2N;30;MI;160168;0;102500;m -CAMPOMORI Bruno;2025;CM;30;RM;300660;0;110377;m -CANNETTA Stefano;1673;2N;30;MI;150157;0;102953;m -CAPORALI Dante;1688;2N;30;NA;090646;0;110983;m -CAPOZZI Virgilio;1844;1N;30;SA;180168;0;102692;m -CARBONE Lorenzo;1799;1N;0;MI;170546;809829;101425;m -CARDINI Saverio;2034;CM;0;RM;100767;817511;115307;m -CAROLA Paolo;1989;CM;0;RM;130259;811645;108898;m -CAROSSO Andrea;2050;CM;0;AT;090964;814288;106826;m -CARTELLA Giovanni;1851;1N;0;MI;261050;815225;102123;m -CARUSO Giuseppe;1700;2N;30;RG;060152;0;105721;m -CASALE Antonio;1838;1N;30;NA;251255;0;109812;m -CASAROSA Michele;1981;CM;0;PI;270458;814784;103465;m -CATALINI Giampiero;1912;CM;0;RM;200138;814440;100234;m -CATTANEO Ugo;1759;1N;30;BS;280757;0;106089;m -CENSI Mauro;1828;1N;30;BO;150255;0;101575;m -CERASOLI Mauro;1726;1N;30;AQ;180745;0;107470;m -CEREDA Loris;2056;CM;0;MI;280262;813052;110800;m -CESARO Giuliano;1933;CM;30;VE;001256;0;118017;m -CHELI Giancarlo;1915;1N;30;GR;010553;0;103493;m -CHIAPPONI Paola;1669;1N;30;RM;160847;0;114158;f -CHIODINI Pietro;1691;2N;30;MN;010654;0;101160;m -CILLO Angelo;1726;1N;30;MI;090745;0;101011;m -CLEAL John;1990;CM;0;TP;010339;814555;103048;m -CLEMENTINI Lorenzo;2092;CM;0;CA;210971;809705;103108;m -COGLITORE Roberto;2011;CM;0;RM;130157;815128;114995;m -COLONNELLO Piero;1838;1N;30;BO;100667;0;115086;m -CONTI Walter;1776;1N;0;MI;061137;821365;104001;m -CONTU Gianni;1955;1N;30;CA;111066;0;110551;m -CONVERTITO Vincenzo;2069;CM;0;RM;041161;822264;104508;m -COQUERAUT Jean Domin;2061;CM;0;TO;071050;811343;102811;m -COQUERAUT Lodwik;1966;1N;0;TO;271048;814229;102815;m -CORDI' Domenico;2065;CM;0;RC;200851;818186;109735;m -CORINTHIOS Raimondo;1556;2N;30;RM;050226;0;102365;m -CORSARO Giacinto;1679;2N;30;CT;021050;0;106404;m -COTTONE Salvatore;1853;1N;30;PA;121165;0;104160;m -CRIPPA Mario;1895;1N;30;MI;260451;0;102391;m -CRIPPA Oscar;1607;1N;30;MI;150259;0;104601;m -CRISTIANO Giuseppe;2127;CM;30;FG;000757;0;159;m -CROCI Luigi;1571;2N;30;GE;011241;0;100507;m -DAMIANO Giuseppe;2072;CM;30;CB;161162;0;104664;m -DAMIGELLA Vincenzo;1847;1N;30;CT;200674;0;105221;m -DANESE Aldo;1958;1N;0;VI;161253;818224;108103;m -DANN Timothy;1907;1N;30;FE;170263;0;102235;m -DE-BIAGGI Paolo;1832;1N;30;MO;010863;0;103212;m -DE-FRANCISCI Lorenzo;1526;1N;30;MI;060548;0;100154;m -DE-LUCIA Alfredo;1615;1N;30;NA;080443;0;106849;m -ZUBKOV Oleg;1568;3N;30;MI;281167;0;113996;m -DE-MARIA Isaia;1821;1N;0;BN;200365;822299;101967;m -DE-MINICO Nicola;1532;2N;30;VI;240938;0;103377;m -DE-NAPOLI Giuseppe;2024;CM;0;BA;270567;814300;101437;m -DE-SANTIS Massimo;1916;1N;0;MI;300565;815187;102497;m -DE-SIMONE Antonio;1874;CM;30;NA;280348;0;108979;m -MURLI Almerico;1872;1N;0;LO;140764;819034;117415;m -NANNI Sergio;1830;1N;0;GE;161059;825131;101032;m -NAPOLI-COSTA Aurelio;2075;CM;0;ME;131053;813974;108152;m -TRAVAGLINI Renzo;1664;2N;30;MI;030357;0;108159;m -NARDI Marco;1906;1N;30;FI;000057;0;179;m -NASONI Paolo;1859;1N;30;BG;140262;0;108729;m -NAZARIO Enrico;1856;1N;30;TO;230964;0;104827;m -NERI Enzo;2058;CM;0;SS;200962;814660;106738;m -NERI Massimo;1823;1N;30;BO;000173;0;106821;m -NORRITO Salvatore;1610;2N;30;PA;120543;0;103941;m -OLIVO Mario;1871;1N;0;MI;290636;815772;102127;m -PAFUMI Francesco;1702;1N;30;CT;220655;0;105785;m -PAGANETTO Ivano;1781;1N;30;GE;041273;0;101352;m -PALLUCCHINI Giuseppe;1870;1N;30;RM;240160;821705;110955;m -PALMA Antonio;1967;CM;0;BA;070763;814423;107154;m -PALMIOTTO Giuseppe;1856;1N;30;BO;190767;0;102089;m -PANINI Emanuele;2009;CM;30;MO;111274;0;105150;m -PANISI Franco;1619;2N;30;RE;090237;0;103579;m -PANTANO Fulvio;1658;2N;30;FR;211146;0;110109;m -PAPA Angelo;1897;CM;0;MI;150138;812285;101731;m -PAPALE Carmelo;1938;CM;0;MI;120455;809764;106429;m -PAPARELLA Stefano;1873;1N;30;BZ;001265;0;197;m -PARAGLIOLA Gennaro;1541;2N;30;CZ;020943;0;102656;m -PARIGINI Luigi;1511;1N;30;TO;130621;0;120300;m -PARIS Giorgio;1966;1N;30;TV;150154;0;107807;m -PARISI Cosimo;1919;1N;30;ME;080765;0;100172;m -RICCI Piergiorgio;1748;2N;30;PT;151064;0;102904;m -PASOTTI Andrea;1847;1N;30;GR;150273;0;105317;m -PATTARELLO Pierluigi;1977;CM;0;MI;070659;815217;100870;m -PAULESU Sebastiano;1862;1N;30;SS;200568;0;106743;m -PECHY Alaster;2169;CM;0;VE;090374;813990;101477;m -PEDE Lucio;1724;2N;30;CO;130259;0;104993;m -PEDEMONTE Claudio;1924;CM;0;GE;200656;809365;102309;m -PEDROTTI Luciano;1902;1N;0;TN;070448;826995;100855;m -PELLEGRINO Giuseppe;1826;1N;30;TP;270762;0;100224;m -PEPE Mario;2079;CM;0;MI;201154;806170;102398;m -BERGOMI G.Marco;1664;2N;30;BS;160264;0;102345;m -DE-SIO Francesco;1823;1N;30;SA;201058;0;100628;m -DE-SORTIS Sergio;1763;CM;30;SS;280828;0;106733;m -DE-TOMA Francesco;1702;1N;30;BA;201150;0;107152;m -DE-VAL Daniele;2200;-M;0;TS;151175;812064;106518;m -DEIANA Giacomo;1600;1N;30;SS;261043;0;109859;m -DEL-NEVO Claudio;1925;CM;0;AL;010250;815454;101221;m -DEL-NOCE Roberto;1810;1N;0;GE;220967;827878;110018;m -DELLA-RAGIONE Achill;2013;-M;0;NA;010647;820989;113638;m -DELL'ANNA Michele;1840;1N;30;LE;190552;0;103923;m -DERUDA Leonardo;1857;1N;0;SS;220659;818011;106748;m -DI-CIO' Enrico;1825;CM;0;PE;070630;818968;108474;m -DI-GIACOMO Antonio;1751;2N;30;PD;150735;0;104056;m -DI-GIULIO Massimo;1679;2N;30;LE;171055;0;111660;m -DI-MARTINO Antonio;1984;CM;0;TE;100947;810819;103988;m -DI-MAURO Sebastiano;1595;2N;30;CT;000560;0;227;m -DI-MEMMO Donato;1666;1N;30;CB;021050;0;104662;m -DIDONI Renato;2076;CM;0;MI;060236;814393;100110;m -DIELI Riccardo;1823;1N;30;BS;060267;0;106091;m -DONADI Luca;1778;1N;30;MI;080963;0;102514;m -DONATINI Andrea;2091;CM;0;LU;250560;819654;103470;m -DURANTE Corrado;1619;2N;30;GE;240647;0;102308;m -D'ANDREA Stefano;2115;CM;0;AQ;140170;826715;108876;m -EANDI Arnaldo;1598;2N;30;TO;201158;0;102291;m -ELITROPI Giorgio;2003;CM;0;BG;300568;819239;101664;m -ELSIDO Massimo;1742;2N;30;BG;220663;0;106391;m -ENIS Aldo;1655;2N;30;CA;251141;0;103267;m -EPITOME Nando;1661;2N;30;MI;290748;0;102125;m -FALCONE Giancarlo;1742;1N;30;GE;160549;0;102307;m -FALCONIERI Goffredo;1783;1N;30;MI;061134;0;100166;m -FANTINI Marco;2053;CM;0;UD;021160;817376;103733;m -FATTORELLI Luciano;2060;CM;0;NO;110859;811742;100481;m -FAVERO Graziano;1754;1N;30;PD;190564;0;109989;m -FEMIA Nicola;1804;1N;30;TO;260446;0;104828;m -FENU Salvatore;1943;1N;0;SS;010667;820997;106739;m -FERLA Paolo;1556;2N;30;MI;120935;0;103605;m -FERRACIN Nicola;1615;1N;30;TV;161171;0;104202;m -FERRANTE Francesco;2099;CM;0;PA;161281;810746;104883;m -FERRARI Michele;1843;1N;0;TN;200570;821470;101262;m -FERRARIS Fulvio;1727;1N;30;MI;110956;0;101645;m -FERRERO Oscar;1732;1N;0;TO;271241;819689;109320;m -FERRETTI Rolando;1830;1N;0;TO;141255;817589;102179;m -FERRI Giovanni;1846;1N;0;RM;150135;821004;105412;m -FERRI Giuseppe;2064;CM;0;LE;120467;815292;100377;m -FIASCHI Maurizio;1634;2N;30;FI;251258;0;110066;m -FIGUS Maurizio;1931;CM;0;SS;030474;815659;106734;m -FILETTI Massimiliano;1987;1N;0;CL;180767;821012;101455;m -FIORAVANTI Emidio;2071;CM;0;AP;091244;815667;104737;m -FITTANTE Giuliana;1883;WF;0;TO;090651;807583;102277;f -FORLANO Luigi;2000;CM;0;CS;010563;815675;100907;m -FORNARO Alberto;1948;CM;0;GE;200163;808270;102312;m -FRAGNI Enrico;1859;1N;0;BO;301141;817805;101586;m -FRANCESCHETTI Nando;1739;2N;30;LC;100654;0;107044;m -FUCCIO Sergio;1778;2N;30;NA;290365;0;111805;m -FUMO Guglielmo;2059;CM;0;NA;210341;823309;107234;m -GAGGINO Davide;2030;CM;0;MI;221074;821500;100694;m -GAGLIARDI Claudio;1791;1N;0;VB;130957;825085;124466;m -GAGLIARDI Gaetano;1852;CM;30;RM;010153;0;104352;m -GALASSI Federico;2142;CM;0;BO;150976;818267;117171;m -GALDELLI Fabiano;1992;CM;0;RM;030757;814652;105415;m -GALLIERA Dino;1736;2N;30;RO;201168;0;103567;m -GAMBA Michelangelo;1403;2N;30;TO;090337;0;100777;m -GAMBERINI Davide;1853;1N;30;BO;160663;0;100309;m -GANCI Stefano;1862;1N;30;VR;230474;0;114724;m -GAONI Vincenzo;1825;1N;30;MC;260657;0;102111;m -GARDI Giuseppe;2007;CM;0;MI;310542;811211;104002;m -GARGANO Lino;1918;CM;0;PT;040463;813869;102899;m -GAROFALO Sergio;1829;CM;0;MO;101256;812056;101928;m -GARRA Gianvito;1871;1N;30;CT;200469;0;105226;m -GATTO Mario;1436;2N;30;LT;070941;0;111250;m -GENNARI Leone;2044;CM;0;VI;270667;815357;103871;m -GERRA Giovanni;1801;1N;30;PV;140541;0;100284;m -GERSTL Karl;1826;1N;30;BZ;100854;0;101956;m -GEUNA Giuseppe;1848;CM;30;TO;120348;0;110002;m -GIACOMELLI Gianni;1936;1N;30;TV;180574;0;104200;m -GIACOMETTO Mario;1994;CM;0;TO;180669;818984;102188;m -GIANCOTTI Eraldo;2050;CM;0;TN;180471;814334;101263;m -GIAQUINTO Sergio;1790;1N;30;AV;161241;0;106640;m -GIOBBI Costantino;1980;CM;0;AP;161054;821527;101390;m -GIORDANETTI Giuseppe;1685;2N;30;BI;140334;0;107628;m -GIORDANO Massimilian;1844;1N;30;SA;050171;0;102687;m -GIRARDELLI Giuseppe;1733;2N;30;MI;170756;0;117189;m -ALIBERTI Nicola;1702;2N;30;SA;150484;0;109828;m -GIURIATO Sergio;1986;CM;0;VI;250755;806617;101441;m -GOLIA Franco;2137;CM;0;MI;190674;814342;101745;m -GORACCI Sergio;1661;2N;30;GR;190247;0;105315;m -GOZZI Giorgio;1884;1N;0;MO;150558;819468;105142;m -GRASSO Nino;1972;CM;0;AV;290572;810630;109814;m -GRILLO Francesco;1990;CM;0;PR;150860;822361;105884;m -GROSSI Mariano;1711;2N;30;TN;120952;0;102733;m -GUARNERI Giuseppe;1947;1N;0;TO;240869;823830;104315;m -GUASTADINI Paolo;2051;CM;0;BO;030666;816051;107917;m -GUGLIELMI Dante;1948;CM;0;MC;200149;808342;104581;m -GUGLIELMI Nicolo';1950;CM;0;TO;181037;816396;100792;m -GUIDA Mario;2032;CM;30;SA;010954;0;102688;m -GUIDO Giuseppe;1598;1N;30;GE;250328;0;101028;m -GUSSONE Claudio;1965;1N;0;TO;040541;818291;104826;m -RANDAZZO Luigi;1545;3N;30;TP;130865;0;107768;m -IACCHETTI Giovanni;1804;1N;30;MI;020139;0;114109;m -IMPELLIZZERI Frances;1688;1N;30;TP;010553;0;117181;m -INGLESE Guido;1580;2N;30;PA;250741;0;104891;m -INNOCENTI Luca;1909;1N;30;FI;130973;0;101849;m -IODICE Vincenzo;1673;2N;30;NA;160761;0;110985;m -IRTUSO Emanuele;1714;1N;30;NA;100553;0;107242;m -JIMCHI Abdelaziz;1724;1N;30;VR;250261;0;100931;m -LA-TORRE Gianluca;1712;2N;30;PD;011062;0;104048;m -LAMAGNA Mario;1912;1N;30;NA;210566;0;102689;m -LANCIANI Leo;1715;1N;30;RM;120252;0;111688;m -LANZANI Giuliano;1988;CM;0;MI;151271;813273;108114;m -LANZILLOTTA Giacomo;1688;2N;30;MI;180173;0;112409;m -LARICINI Alberto;1619;2N;30;CO;090855;0;102979;m -LAROCCA Antonino;1631;2N;30;CT;021040;0;105222;m -LASIO Millo;2100;CM;0;MS;030844;812323;103641;m -LAUDATI Adriano;1938;CM;0;RM;140271;806676;100945;m -LEMMA Vittorio;1655;1N;30;MI;250129;0;102518;m -LEONI Alessandro;1838;1N;30;TO;130658;0;100136;m -LETTIERI Biagio;2032;CM;0;SA;140959;815721;107247;m -LIBUTTI Michele;1896;1N;0;MI;030860;822710;100690;m -LIZZARI Nicola;1829;1N;30;TO;140151;0;104724;m -LODA' Domenico;1667;1N;0;MI;140431;816418;100578;m -LORIGA Pierpaolo;1903;1N;30;SS;201149;0;106735;m -LUZI Alessandro;1931;CM;0;RM;090672;816426;100950;m -MACCAPAN Fabio;2078;CM;0;VE;160258;828009;100827;m -MADDALONI Giovanni;1866;1N;0;RM;301146;813907;105423;m -MAGINI Maurizio;1637;2N;30;FI;090245;0;109886;m -MAINWARING Raymond;1890;1N;0;VR;230854;814873;101549;m -MALAFRONTE Agostino;1999;CM;30;NA;240761;0;102711;m -MALDARELLI Lorenzo;1797;1N;0;SS;120739;819000;106736;m -MALESCUSI Giorgio;1646;2N;30;FI;111255;0;115835;m -MALESCUSI Luciano;1962;1N;0;FI;131152;821594;105330;m -MALNICH Riccardo;1910;1N;30;VI;060273;0;110003;m -GIORDAN Daniele;1897;1N;30;VE;110275;0;114015;m -MANDRELLA Franco;1565;2N;30;RM;060628;0;100820;m -MANESCHI Giuseppe;2084;CM;0;VE;200161;814350;115767;m -MUSELLA Vincenzo;2084;CM;0;PA;240767;814890;104176;m -MANIERO Riccardo;1847;1N;30;PD;180776;0;116327;m -MANNU Michele;2128;CM;0;CA;050761;818020;107540;m -MARANO Salvatore;1990;CM;0;CT;211061;814962;114945;m -MARCHESE Filippo;1711;1N;30;CT;120154;0;105225;m -MARCHESINI Luciano;1532;2N;30;VI;110538;0;117289;m -CIARDI Lorenzo;1484;3N;30;SI;080846;0;107567;m -MARIANO Danilo;1598;2N;30;LE;220261;0;104584;m -MARINELLI Franco;1514;2N;30;RM;300534;0;104267;m -GILARDONI Marco;1604;2N;30;MI;250358;0;113959;m -LIEGGI Daniele;1674;2N;30;TO;240677;0;104314;m -MARIUCCI Felice;1661;2N;30;MI;130348;0;101002;m -MARRAS Giuseppe;1867;1N;30;CA;070552;0;103271;m -MARSON Luca;1926;1N;0;VE;020964;818577;103078;m -MARTA Daniele;2079;CM;0;RM;040475;808628;109850;m -MARTIN Tiziano;2024;CM;0;TO;020359;816450;109529;m -MASSA Salvenrico;1871;1N;30;CR;170441;0;106116;m -MASSETTI Gianfranco;2113;CM;0;VT;130657;815756;101902;m -MATTEI Marco;2156;CM;0;FI;060358;811297;102092;m -MAZZELLA Luigi;2000;CM;30;VA;001045;0;366;m -MAZZETTA Franco;1784;2N;0;GE;240747;819336;101346;m -MAZZOTTI Federico;1741;1N;30;BG;140661;0;101667;m -MEI Gianluca;1862;1N;0;MI;020170;821632;104437;m -MEISELS Guido;1607;2N;30;EE;0;0;370;m -MENZIO Sandro;1667;2N;30;TO;001163;0;371;m -MESSINA Damiano;2064;CM;0;TP;250555;806803;107119;m -MEZZETTI Amedeo;1825;1N;30;BO;170337;0;102087;m -MIANDRO Roberto;2090;CM;0;AP;120864;806196;104578;m -MIATELLO Alberto;2082;CM;0;CO;261260;807036;104009;m -MICALONI Mario;2121;CM;0;RM;251260;824810;104359;m -MICHIELETTO Giuseppe;1601;2N;30;RM;050251;0;104360;m -MIELE Roberto;1870;1N;0;TS;211043;814172;103796;m -MILITELLO Michele;1847;1N;30;SP;100961;0;103634;m -GUIRRERI Filippo;1577;2N;30;TP;170867;0;107766;m -MINNITI Giuseppe;1740;2N;30;SR;280457;0;103675;m -MIRCOLI Gianluca;1908;1N;0;RM;200573;822744;105404;m -MODENA Giorgio;1892;CM;30;MO;080451;0;101986;m -MOLINARI Gianfranco;2085;CM;0;MI;220538;816493;111089;m -MOLTENI Costantino;1950;CM;0;BG;290668;815764;109784;m -MONNI Vittorio;1730;1N;30;CA;300657;0;103107;m -MORA Paolo;2260;-M;0;BG;011266;824070;101669;m -MORATTO Davide;1831;1N;30;VC;130654;0;102259;m -MORESCHI Mauro;1963;1N;0;MI;080958;827967;102126;m -MORETTI Mario;1610;2N;30;TO;130429;0;108795;m -MORONI Marco;1966;CM;30;RM;110261;0;114690;m -MORSELLI Stefano;1896;CM;0;MI;220264;809489;102525;m -MORTALE Lidio;1622;2N;30;NA;011056;0;107237;m -PERRYMAN Marcus;1990;CM;0;VR;280556;820725;101550;m -PERUCCONI Nicola;1721;2N;30;MI;150579;0;102504;m -PESCO Giuseppe;2031;CM;0;TV;150843;812943;107825;m -PETTORUSSO Aldo;1676;1N;30;TO;250850;0;117146;m -RAFFETTI Giovanni;1487;2N;30;SR;100159;0;103681;m -SANTILLI Enrico;2015;CM;30;NU;290562;0;104496;m -CECCANTI Albo;1586;2N;30;TA;201143;0;105814;m -LICCIULLI Fabio;1742;1N;30;BR;291266;0;106236;m -BERTI Beniamino;1553;2N;30;VR;290153;0;100929;m -BORTOLAZZI Michele;1900;1N;0;VR;080869;822191;101548;m -TORTORA Franco;1952;CM;0;TO;211058;811050;100767;m -CASTI Alessio;2129;CM;30;CA;260478;0;107533;m -CAMPO Gesualdo;1785;2N;0;SR;180641;826677;105229;m -MANASSE Mario;1883;1N;30;MI;280656;0;102948;m -LEVEQUE Sergio;2076;CM;0;NA;081078;809470;103908;m -BALLARIN Gabriele;1751;2N;30;VE;170270;0;100100;m -PERISSOTTO Mario;1631;2N;30;VE;070263;0;100829;m -INGUSCIO Giorgio;2053;CM;0;LE;240758;815713;105380;m -PALAZZO Daniele;1772;2N;30;LE;171161;0;105376;m -SPEDICATO Marco;1655;2N;30;LE;230474;0;103930;m -STRIANI Giuseppe;1694;2N;30;LE;210353;0;107186;m -BOTRUGNO Antonio;1877;1N;30;LE;150576;0;101295;m -MARANGONI Simone;1781;1N;30;VI;150973;0;101443;m -STIZ Massimiliano;2101;CM;0;BL;290876;819085;107188;m -GRASSETTO Gilberto;1721;2N;30;CO;100655;0;102977;m -NOSEDA Francesco;1991;1N;30;CO;200277;0;103508;m -BELLONE Giuseppe;1586;2N;30;GE;270859;0;109675;m -BETTINI Alessandro;1739;1N;30;BO;100161;0;111003;m -TRAVERSI Carlo;1762;CM;0;BO;270947;814202;100318;m -RICCI Massimo;1817;1N;30;SP;040261;0;103640;m -CANDELI Angiolo;1529;2N;30;GE;060635;0;101318;m -SORDINI Giuseppe;1544;2N;30;GE;210153;0;101083;m -CAVAGNA Marco;1523;2N;30;VB;050555;0;100478;m -PALMIZI Alessandro;1790;1N;30;AN;251266;0;104744;m -DI-MAURO Sebastiano;1814;1N;30;CZ;120657;0;108510;m -LETO Marco;1805;1N;30;KR;110873;0;111259;m -D'ETTORRE Ireneo;1823;1N;30;MI;130263;0;430;m -DAMIA Angelo;2237;CM;0;MI;300785;812668;100703;m -MIRCOLI Filippo;1845;1N;0;AN;220347;816485;104742;m -ZAPPALA' Enrico;1640;2N;30;CT;150760;0;102474;m -CALIGARA Roberto;1888;1N;30;NO;110654;0;109003;m -CAPALIKU Aleks;2099;CM;30;LE;230761;0;103921;m -SCATEGNI Alberto;1535;2N;30;LE;300744;0;105551;m -CANESTRELLI Luigi;1823;1N;30;PG;130773;0;105836;m -LABARDI Simone;1709;2N;30;FI;0;0;107585;m -PAVANELLO Tommaso;1736;2N;30;PI;280772;0;115612;m -TINTI Elvino;1595;2N;30;FI;140448;0;107987;m -TONI Benedetto;1724;2N;30;FI;170370;0;107980;m -GIUSIANO Marco;1997;CM;0;TO;070575;819271;110480;m -PAONESSA Denis;1817;1N;30;TO;261071;0;100797;m -BONESSA Luca;1640;2N;30;TO;111172;0;104831;m -ORSENIGO Davide;1872;1N;0;CO;290777;819476;104997;m -OLIVO Gaetano;1598;2N;30;KR;230153;0;108484;m -PIERANGELI Andrea;2069;CM;0;RM;230550;812803;102133;m -PIERANTONI Guglielmo;1693;1N;30;AO;141033;0;102919;m -PIERI Enzo;1940;CM;0;LU;170658;815373;106062;m -PIETROCOLA Roberto;2127;CM;0;VA;070556;815799;104533;m -PIGA Antonello;1703;2N;30;SS;240950;0;106732;m -PILIA Piero;1823;1N;30;NU;010856;0;104495;m -PINTUS Andrea;1737;2N;30;SS;200754;0;106742;m -PISANI Daniele;1754;2N;30;TA;190361;0;105806;m -POLETTO Daniele;1831;CM;0;MI;181162;824887;105741;m -POMARO Stefano;1903;1N;0;PD;230863;821730;109652;m -PONTI Lorenzo;1868;1N;30;VA;191175;0;102560;m -PRESTIPINO Paolo;1834;1N;0;PA;070572;818828;114967;m -PRIMERANO Carlo;1715;2N;30;MI;050658;0;100163;m -PRIVITERA Vito;1583;2N;30;CT;100653;0;105780;m -PROCOPIO Giuseppe;1595;2N;30;CZ;240928;0;108574;m -PROIETTI Giorgio;1894;1N;0;RM;090559;807702;107685;m -PROSPERI Agostino;2006;CM;30;RM;230863;0;112208;m -PUGLIESE Giuseppe;1856;1N;0;GE;270551;821063;101035;m -PULEIO Bernardo;1790;1N;30;PA;300763;0;104175;m -PULVIRENTI Carmelo;1703;2N;30;KR;230143;0;106475;m -PUNTERI Marco;1983;CM;0;GO;011078;820890;101481;m -PUNZI Raffaele;2003;CM;30;SA;060278;0;100627;m -PUTZOLU Marcello;1682;1N;30;CA;190261;0;103277;m -QUAGLIA Ferdinando;1516;2N;0;RM;170848;826286;112092;m -QUAGLIARELLA Sabino ;1969;CM;0;MI;040547;822469;101732;m -QUARANTA Carmine;1861;1N;30;SA;020162;0;107004;m -RAGOSO Mario;1604;2N;30;MI;250556;0;106920;m -RATTI Marco;1949;1N;0;TO;310157;819050;102165;m -RAVAGNANI Tiziano;2063;CM;0;SS;170355;807419;103562;m -REBEGGIANI Luca;1933;CM;0;BO;240676;815829;115092;m -RECANATINI Italo;1897;1N;30;NO;250534;0;104872;m -RECANO Benito;1733;2N;30;NA;030537;0;107248;m -RECCHI Antonio;1820;1N;30;AN;251051;0;104750;m -REDO Giorgio;2048;CM;0;VE;080650;814512;103083;m -RENIER Renzo;2067;CM;0;VE;031247;811173;104186;m -RENZI Marco;1999;CM;0;RM;121071;818585;100948;m -RENZINI Lorenzo;1821;1N;0;TO;010842;821985;100803;m -REVINELLI Sergio;1847;1N;0;CO;290260;814261;104844;m -RINALDI Francesco Sa;2165;CM;0;PI;050871;815519;103194;m -RIVARA Massimo;1872;CM;0;GE;260857;814458;101036;m -ROBERTI Bruno;2097;CM;0;RM;291258;809888;110386;m -ROCCHI Renato;1586;2N;30;PC;310849;0;111275;m -ROMAGNOLI Roberto;2138;CM;0;TN;230866;820741;102761;m -FERRARESE Giacomo;1721;2N;30;VE;191289;0;103330;m -ROMANO Giuseppe;1634;2N;30;SA;300749;0;491;m -RONCONI Fausto;1721;1N;30;MI;061152;0;100133;m -ROSOLIA Giuseppe;1936;1N;0;CT;081059;816116;103432;m -ROSSI Aldo;1585;1N;30;NA;130430;0;113109;m -ROSSI Gianni;2105;CM;0;TV;171242;818593;106459;m -ROTELLI Pietro;1983;CM;0;LE;050442;810606;103928;m -RUSSO Alfio;1922;CM;0;CT;210768;814970;103436;m -RUSSO Angelo;1622;2N;30;PA;060362;0;104894;m -RUSSO Massimiliano;1790;1N;30;RM;011067;0;105424;m -SABA Carlo;1864;1N;30;CA;021256;0;103279;m -SACCANI Ettore;1940;1N;0;MI;070758;820903;100693;m -SACCHINI Marco;2116;CM;30;RM;090560;0;115314;m -SAGLIMBENI Paolo;1688;2N;30;VB;000368;0;113759;m -SAMUELLI Daniele;1904;1N;0;TS;140176;823112;106522;m -SANTANDREA Marco;1829;1N;0;MI;060350;820920;100715;m -DALLAVECCHIA Paolo;1802;1N;30;VR;220362;0;100968;m -SANTELLI Francesco;1729;1N;30;MI;131053;0;102128;m -SARACINI Giorgio;1712;2N;30;AR;180646;0;108475;m -SARDO Andrea;1762;1N;30;TS;190774;0;117093;m -SARTORIO Diego;1905;CM;0;MI;120262;812528;101422;m -SAVOLDELLI Dario;1822;1N;30;BG;260353;0;117258;m -SBALCHIERO Lorenzo;1712;2N;30;BZ;250150;0;101957;m -SCARPELLINI Felice;1913;1N;0;BG;270743;815845;106392;m -SCHACHTER Alex;1873;1N;30;BR;140747;0;106241;m -SCHIATTARELLA Giusep;1712;2N;30;NA;160864;0;109941;m -SCHIRALDI Mauro;2065;CM;0;VR;201251;814865;100924;m -SCIPIONI Gaetano;2070;CM;0;AQ;100574;812439;108875;m -SCOLA Enrico;1610;2N;30;SA;120959;0;109943;m -SCOTTI Luigi;1532;2N;30;MI;001035;0;107758;m -SCOVAZZI Tullio;1789;1N;30;MI;070651;0;102924;m -SCUDERI David;2001;CM;0;TO;100369;816604;101998;m -SERIO Pietro;1873;1N;30;TA;150360;0;104628;m -PEZZOLO Maurizio;1631;2N;30;GE;191041;0;100513;m -SILECI Antonino;1514;2N;30;CT;300832;0;105219;m -SILECI Salvatore;1836;1N;0;CT;010764;818445;105220;m -ESPOSITO Rosario;1730;2N;30;NA;020563;0;104612;m -SIMEONE Giulio;2016;CM;0;RM;280273;808792;100947;m -SIMONE Leo;1793;1N;30;BR;150256;0;105817;m -SIMONE Marco;1880;1N;0;MI;100367;818607;101736;m -SINATO Fabrizio;1927;1N;30;PD;120262;0;104064;m -SINISCALCHI Mario;1736;CM;30;SA;200548;0;110070;m -SOLENGHI Giuseppe;1583;2N;30;CS;110334;0;108572;m -SOLINAS Roberto;1670;1N;30;FE;101061;0;102227;m -MOCCIA Giuseppe;1544;2N;30;NA;081158;0;117232;m -SORGO Roberto;1835;CM;30;UD;260160;0;105898;m -SOTGIA Cosimo;1928;1N;30;TO;000270;0;105188;m -SPANO'-CUOMO Gaetano;1880;1N;0;RM;100348;819980;115010;m -SPAZIANI Gianni;1693;1N;30;LT;100451;0;106223;m -SPREAFICO Fabrizio;1874;1N;30;MI;040466;0;100588;m -SQUARCI Franco;1885;CM;0;GE;060346;809110;101327;m -STEFANELLI Alfredo;1778;1N;30;BG;230559;0;101673;m -STEFANETTI Marco;2108;CM;0;MI;010571;815179;104874;m -STOLFA Rodolfo;1781;1N;30;GO;070941;0;100650;m -STRADA Stefano;1930;1N;30;MI;141262;0;115843;m -TAGLIAGAMBE Stefano;2050;CM;0;GR;260769;812021;105313;m -TAMASSIA Gabriele;1655;2N;30;MO;011048;0;103211;m -TAMBURINI Lorenzo;2004;CM;0;SP;100863;814067;103658;m -TARANTINO Silvio;1945;1N;30;TA;090362;0;105801;m -TAURISANO Vincenzo;1781;1N;30;NA;020667;0;110213;m -TEMPESTINI Alessandr;1751;CM;30;FI;140753;0;101845;m -TERSIGNI Andrea;2123;CM;0;RM;081070;811190;104355;m -TODIC Simo;1793;1N;30;PG;070456;0;108486;m -TOMIO Dante;1969;CM;0;TV;311061;819441;103840;m -TONDO Salvatore;2029;CM;30;SR;140453;0;103673;m -TOSETTO Flavio;1748;2N;30;VA;121255;0;101381;m -TRANGONI Bruno;1954;1N;0;VE;041064;24601438;101463;m -TROTTA Nicola;1712;2N;30;SA;220165;0;109800;m -TROTTO Pierangelo;1885;1N;0;TO;310864;822922;103171;m -TRUSSARDI Giuseppe;1768;1N;30;VR;211140;0;103140;m -TUCCI Flavio;1607;2N;30;SO;150653;0;110349;m -VACCARI Sergio;2056;CM;0;BO;000025;816680;111734;m -VALENTE Luca;1891;1N;30;TO;150574;0;101990;m -VANNELLI Vittorio;1924;CM;0;RM;160945;816701;107287;m -VANZAN Alessandro;1835;1N;0;RM;030344;820032;105422;m -VARGIU Antonio;1901;1N;0;RM;010146;817368;104518;m -VEGETTI Emilio;1772;CM;30;MI;000641;0;110407;m -VERDUCCI Gianni;2065;CM;0;TV;061266;814520;108242;m -VIAGGI Stefano;1900;1N;30;PD;140764;0;113662;m -VIGNOTTO Ciro;1999;1N;0;CO;131064;825905;100721;m -VILLANI Cristian;1886;1N;30;PG;050875;0;570;m -VIOLA Matteo;2204;CM;0;VE;241073;813486;101483;m -VIRZI Ettore;1995;CM;0;MI;140270;817457;116752;m -VISCOGLIOSI Enzo;1793;1N;30;RM;230557;0;105409;m -VISIGALLI Cesare;1739;2N;30;MI;101165;0;101650;m -VITTADINI Attilio;1949;1N;0;MI;010143;820059;113571;m -VOZZA Nicola;1981;CM;0;TO;290568;814474;102204;m -WILD Alexander;1865;1N;30;BZ;260460;0;101955;m -YEPES-BARRERA Franci;1670;2N;30;VR;0;0;578;m -ZACCO Remo;2013;CM;0;MI;260451;812366;102922;m -ZAMBON Roberto;1817;1N;30;TV;100164;0;110942;m -ZANETTI Alberto;2180;-M;0;MI;031255;813508;110419;m -ZANGRANDO Giampietro;1963;1N;0;VE;270251;819450;114694;m -ZANIRATO Stefano;1983;1N;0;RO;120862;823783;101184;m -ZARPELLON Daniel;1995;CM;0;VI;240674;818542;105681;m -ZUCCAROTTO Salvatore;1754;2N;30;CT;231255;0;106405;m -CODACCI Jose';1874;CM;30;FI;040168;0;102095;m -CUCCUINI Sandro;1916;1N;30;TO;191065;0;101991;m -ROTUNDO Raffaele;2017;CM;0;TO;030374;813133;106369;m -LIVIABELLA Lucio;1487;2N;30;TO;220548;0;102168;m -PICARELLA Marco;1817;1N;30;TO;040775;0;116777;m -PULIAFITO Alberto;1676;2N;30;TO;;0;591;m -VANNINI Claudio;1778;1N;30;NA;270342;0;104614;m -SMARGIASSI Enrico;1981;CM;30;TS;040961;0;106520;m -ARCION Riccardo;1952;1N;30;TS;261182;0;103784;m -BUZZANCA Francesco;1676;2N;30;ME;041060;0;108153;m -DE-PAOLIS Fabrizio;2010;CM;0;RM;190678;822027;107224;m -GUIDI Maurizio;2090;CM;0;MI;250278;815705;100879;m -MONDINI Francesco;1568;2N;30;VA;110129;0;104716;m -MENON Michele;1594;2N;30;UD;111284;0;105911;m -RINAUDO Andrea;2116;CM;0;MC;181072;816574;105707;m -MASELLA Vincenzo;1667;2N;30;TS;310843;0;106528;m -BINI Alessandro;1877;1N;30;FI;290844;0;109756;m -DE-MORI Michele;1991;1N;30;VI;290959;0;101436;m -MANNARI Fabrizio;1733;2N;30;LI;240171;0;109948;m -MORGANTI Lionello;1685;1N;30;BS;051058;0;106102;m -DE-NISI Giuseppe;1903;1N;0;TN;210748;822302;101855;m -PERFLER Manfred;1661;2N;30;BZ;211263;0;109193;m -LOGALLO Claudio;2066;CM;0;TV;080284;813885;106483;m -DI-BLASIO Walter;1664;2N;30;TE;180667;0;110977;m -DI-MICHELE Rocco;2096;CM;0;TE;300581;815632;106697;m -FERRANTE Marco;2117;CM;0;PA;020389;816035;108318;m -CRISTIANI Gianfranco;1664;2N;30;BS;260764;0;106093;m -CARLASSARA Renato;1850;1N;30;TV;070465;0;101510;m -VELLUTI Alberto;2019;CM;0;VE;210169;818470;111838;m -MONDELLO Fernando;1903;1N;30;PU;221269;0;101841;m -MUSCATO Alessandro;2002;CM;0;AT;100975;818372;105300;m -GALBIATI Alessandro;1826;1N;0;MI;120351;825808;109967;m -CATALANO Luigi;1565;2N;30;RN;040249;0;105843;m -CANOVA Luca;1688;2N;30;LC;140374;0;619;m -MENATO Nazario;1532;2N;30;BG;210740;0;100893;m -TENTORI Giulio;1814;1N;30;BG;180860;0;101674;m -BAGOLIN Renzo;1754;2N;30;RO;010958;0;106710;m -FANTINATI Giulio;1703;2N;30;RO;141072;0;104185;m -GRECO Salvatore;2074;CM;0;PA;210474;819301;114969;m -INGROIA Antonino;1613;2N;30;PA;310359;0;119514;m -ALESI Gaspare;1634;2N;30;TP;140665;0;109777;m -BRECEVICH Andrea;1811;CM;0;TS;110567;815586;110457;m -MARTORELLI Vincenzo;1639;2N;30;SA;280484;0;109767;m -VOICU Joan Paul;1876;1N;30;TE;310585;0;110980;m -PAOLINI Fabio;1844;1N;30;TE;250473;0;103994;m -REFI Roberto;1790;1N;30;AN;140458;0;104748;m -DE-NISI Roberta;1881;1N;0;TN;061178;821411;101857;f -FIORAVANTI Diego;2132;CM;0;AP;080282;817724;104739;m -LOMBARDO Claudio;1709;2N;30;NA;191259;0;101204;m -FORATO Enrico;1949;1N;0;TV;090592;819719;107958;m -DEVETAK Robert;1837;1N;0;GO;190492;826405;102877;m -ZONA Santino;1505;1N;30;NA;250160;0;110198;m -CIVERRA Marco;1694;2N;30;CB;191285;0;117088;m -VOLPE Michele;1437;3N;30;NA;051233;0;111841;m -LETTERA Rosario;1551;3N;30;NA;140762;0;114444;m -RESTIVO Antonio;1583;2N;30;PA;070360;0;116567;m -ANNARUMMA Nicola;1522;3N;30;NA;110563;0;106636;m -FERRANTE Filippo;1559;2N;30;PA;200558;0;117211;m -FARINELLO Gaetano;1482;3N;30;CT;081262;0;115516;m -VIRGILIO Gianluca;1891;1N;0;GE;150759;818879;117126;m -PES Francesco;1851;1N;0;CA;270686;824828;109505;m -ALTEA Giovanni;1731;1N;0;CA;230667;821128;113427;m -FORNARINI Giorgio;1568;3N;30;MI;260444;0;116833;m -BARTOLINI Leonardo;1589;2N;30;PT;230587;0;112484;m -FRATINO Lorenzo;1901;1N;0;LU;170887;818755;114882;m -GIANNONI Tiziano;1784;2N;30;LU;180685;0;110640;m -ORSI Lorenzo;1682;2N;30;LU;191287;0;109524;m -FASIELLO Andrea;1613;2N;30;LE;030788;0;109518;m -COSTANTINI Dario;1700;2N;30;LE;300485;0;114936;m -BERNABEI Davide;1673;2N;30;LE;150785;0;112914;m -DEL-GAUDIO Massimo;1512;3N;30;TO;140771;0;104316;m -PIKEC Paolo;1718;2N;30;VR;030185;0;117292;m -TONOLO Maurizio;1655;2N;30;VE;290160;0;106355;m -TRIBBIA Giuseppe;1559;2N;30;VI;271255;0;109293;m -CALISI Elia;1884;1N;0;LI;170674;818143;117275;m -VALBUENA Oliver;1936;1N;0;LU;120785;822930;113938;m -PEPA Aurel;1536;3N;30;VA;270777;0;117246;m -FIORELLA Loreto;1553;2N;30;PA;200752;0;116566;m -DE-LORENZO Luca;1700;2N;30;RM;050570;0;117302;m -TRAMACERE Salvatore;1599;3N;30;RM;031053;0;117301;m -PETRILLO Nicola;1637;2N;30;BN;010368;0;115540;m -CORREALE Giuseppe;1569;3N;30;SA;101182;0;109088;m -MARROCCO Silvio;1586;2N;30;FI;110268;0;115088;m -LASCHAI Masiar;1599;3N;30;MI;091263;0;113960;m -RINALDO Andrea;1736;2N;30;MI;270164;0;117353;m -ALBRIZIO Mauro;1655;2N;30;SO;051259;0;117362;m -AATABOU Moulayali;1748;2N;30;CE;001262;0;672;m -ABATANGELO Leonardo;1867;1N;30;FI;000261;0;673;m -ABATINO Maurizio;2205;FM;0;CZ;191160;802778;103161;m -ABBATELLI Andrea;1781;2N;30;RM;000864;0;675;m -ABISSO Onofrio;1511;2N;30;PD;010145;0;101197;m -ACCARDO Francesco;1843;CM;0;NA;160749;805920;107072;m -ACCOLLA Vincenzo;1703;2N;30;CT;000444;0;678;m -ACCORDINO Francesco;1820;1N;30;RC;001263;0;103967;m -ACCORSINI Cesare;2081;CM;30;PR;000353;0;680;m -ADAMO Luigi;2035;CM;0;NA;300568;819123;113113;m -ADDUCI Eraldo;1628;2N;30;TA;250348;0;107912;m -ADINOLFI Massimo;2000;CM;30;SA;000767;0;683;m -ADINOLFI Raffaele;1700;2N;30;SA;031169;0;684;m -ADINOLFI Vincenzo;2096;CM;0;BO;130864;805556;102083;m -AFFINITO Pancrazio;2063;CM;0;BN;020655;813800;100437;m -AFTI Maurizio;1664;2N;30;GE;000458;0;687;m -AGAZZI Fulvio;1900;1N;30;SV;000457;0;688;m -AGAZZI Marco;1753;1N;30;SV;001153;0;689;m -AGGIO Nicola;1700;2N;30;PD;001068;0;690;m -AGHION Fabio;2102;CM;30;MI;000749;0;691;m -AGLIETTI Graziano;2054;CM;0;VC;100361;807699;100778;m -AGNELLI Francesco;2051;CM;0;BS;180450;805211;106099;m -AGNELLO Giuseppe;2139;CM;0;SR;090751;802662;103687;m -AGOMERI Dante;1754;1N;30;FR;290950;0;104208;m -AGOMERI Gianluca;2122;CM;0;FR;120975;811319;104209;m -AGOSTANI Andrea;2165;CM;0;LC;230475;805645;107047;m -AGOSTANI Osvaldo;1751;2N;30;LC;170345;0;107056;m -AGOSTO Erika;2022;CM;0;UD;131177;805483;103062;f -AGRESTI Francesco;1774;1N;30;RM;000946;0;700;m -AGRICOLA Michele;2000;CM;30;FG;000155;0;701;m -AGRIFOGLIO Fabio;2005;CM;0;MI;261062;808997;104599;m -AGUGGIARO Renzo;1610;2N;30;PD;281050;0;108201;m -AIELLO Gianluca;2000;CM;30;MI;000368;0;704;m -AIELLO Giovanni;1643;2N;30;CT;000865;0;705;m -AIELLO Giuseppe;1706;2N;30;CT;000159;0;706;m -AIELLO Paolo;2200;CM;0;GE;261070;808261;707;m -AIGNER Alex;1900;1N;30;BZ;001271;0;708;m -AL-MAMUN Abdullah;1703;2N;30;MI;090568;0;709;m -ALAIMO Riccardo;2191;-M;0;SR;211271;805378;104898;m -PALAMARA Giuseppe;1700;2N;30;VB;0;0;711;m -ALBA Albano;2248;CM;0;VE;050140;801062;102361;m -ALBANESI Roberto;2027;-M;0;PV;070654;810398;107213;m -ALBANO Marco;2226;-M;0;SP;111247;801178;105478;m -ALBANO Vito;1700;2N;30;TA;140872;0;715;m -ALBERIO Alfio;1819;1N;30;CT;000153;0;716;m -ALBERTI Andrea;2144;CM;0;BL;070568;810967;105028;m -ALBERTON Roberto;2128;CM;0;VI;100356;807303;105667;m -ALBIANI Alberto;1900;1N;30;BO;000453;0;719;m -ALBIANI Pierluigi;1900;1N;30;BO;000047;0;720;m -ALBINELLI Alberto;1832;1N;30;MN;010261;0;101149;m -ALDERISIO Piero;1607;2N;30;RM;260430;0;102362;m -ALDROVANDI Antonio;2241;-M;0;BO;290673;806200;101570;m -ALDROVANDI Costantin;2215;IM;0;BO;060577;805394;106010;m -ALEMANNI Marco;1819;1N;30;TO;150351;0;110467;m -ALFARONE Giovanni;2022;CM;0;ME;010154;806978;111216;m -ALFONSI Paolo;1802;1N;30;RM;000856;0;727;m -ALIMONTI Daniele;1616;2N;30;RM;001165;0;728;m -ALIOTO Claudio;2032;CM;30;PA;000356;0;127683;m -ALMONTI Alessandro;2033;CM;0;RM;010957;809896;115125;m -ALTAVILLA Salvatore;1858;1N;30;TV;000557;0;731;m -ALTIERI Claudio;2019;CM;30;FG;;0;106161;m -ALTINI Daniele;2292;-M;0;BA;110464;800694;112268;m -ALTINI Giulio;1712;2N;30;BA;000771;0;734;m -ALVINO Federico;1688;2N;30;AV;001144;0;735;m -ALVINO Flavio;1721;2N;30;NA;000261;0;736;m -VILLA Franco;1700;2N;30;MO;121147;0;100196;m -AMARANTO Luca;1922;1N;30;AN;130970;0;108055;m -AMARILLI Francesco;2023;CM;30;MI;000663;0;740;m -AMATI Aldo;1784;2N;30;NA;000669;0;741;m -CASOLI Alfredo;1811;1N;30;VA;230143;0;100118;m -AMATO Alberto;1700;2N;30;CT;000266;0;743;m -AMATO Mauro;1918;1N;30;NA;000358;0;744;m -AMATO Umberto;1733;2N;30;PA;000257;0;745;m -AMBROGI Mario;2000;CM;30;RM;030129;0;105447;m -AMBROSIO Giuseppe;2059;CM;0;NA;230965;806439;101871;m -AMEDEO Riccardo;1901;CM;30;MI;210872;0;117142;m -AMENDOLIA Orazio;1556;2N;30;ME;180636;0;103817;m -AMINTA Antonio;1766;2N;30;TV;280557;0;110139;m -AMODEI Diego;1628;2N;30;CZ;270658;0;119873;m -AMODEO Emanuele;1622;2N;30;PA;000151;0;752;m -AMORETTI Giangiacomo;2000;CM;30;IM;000948;0;753;m -AMOROSO Emanuele;1667;2N;30;SS;270854;0;107663;m -AMOVILLI Mauro;2250;CM;0;PR;180957;800660;755;m -ANASETTI Alberto;1673;2N;30;TR;100165;0;101900;m -ANCESCHI Vittorio;2248;-M;0;RE;180453;800708;105123;m -ANDOLFATTO Biagio;1729;1N;30;VI;120253;0;110709;m -ANDREAZZA Attilio;2092;CM;0;MI;240467;810991;103609;m -ANDREINI Gigliola;1660;1N;0;FC;010254;814377;109217;f -ANDRENELLI Adriano;2017;CM;0;RM;230657;811432;117776;m -ANDREOLI Giorgio;2062;CM;30;TR;000166;0;762;m -ANDREOLI Mark;2050;CM;0;NA;051052;804940;104617;m -ANDREOLI Renato;2137;CM;0;SO;081255;801020;107489;m -ANDREOLINI Mauro;2195;CM;0;RM;080273;818623;120841;m -ANELLA Sandro;1751;2N;30;RM;081055;0;102661;m -ANGELOZZI Riccardo;1900;1N;30;RM;210555;0;104505;m -ANGIO' Federico;1843;1N;30;VR;190354;0;101935;m -ANNUNZIATA Agostino;1937;1N;30;VA;210256;0;109903;m -ANTICHI Mauro;1681;1N;30;AL;180164;0;114595;m -ANTIGA Claudio;2000;CM;30;AL;000353;0;771;m -ANTIGNANI Luigi;2034;CM;0;NA;161157;807362;102071;m -ANTIOCHIA Guido;1628;2N;30;RM;000253;0;773;m -ANTOLINI Aldo;1669;1N;30;VR;191045;0;100523;m -ANTONELLI Andrea;2000;CM;30;PG;000162;0;101392;m -ANTONELLI Fabrizio;2048;CM;0;RM;141145;815101;105402;m -ANTONELLI Marco;2048;CM;30;AP;310555;0;109775;m -ANTONELLI Mauro;2050;CM;30;RM;020459;0;127500;m -ANTONIASSI Giuseppe;1864;1N;30;PN;280657;0;102021;m -COLOMBO Emanuele;1560;3N;30;MI;140581;0;110103;m -ANTONINI Franco;2140;CM;0;PU;100767;810436;103016;m -APE Michele;1780;1N;30;MI;000430;0;782;m -APICELLA Gaetano;1867;1N;30;SA;170269;0;783;m -APOLLONIO Massimilia;1700;2N;30;RM;000272;0;784;m -APRA' Michele;1750;1N;30;TO;000331;0;785;m -ARANOVITCH Emiliano;2278;FM;0;VA;140677;805947;113558;m -ARBOSCELLI Gregorio;1921;1N;0;MI;150144;815527;104982;m -ARBRILE Giuseppe;1700;2N;30;TO;000562;0;788;m -ARCA' Luciano;1637;2N;30;RM;140158;0;789;m -ARCANGELI Alessandro;1864;1N;30;VR;171047;0;790;m -ARCONTACHIS Sofocle;2000;CM;30;PG;000547;0;791;m -ARDIZZONE Stefano;2195;CM;0;NO;300959;802565;792;m -ARGENTERO Giorgio;1700;2N;30;VI;000230;0;793;m -ARGENTINO Ennio;1700;2N;30;BA;0;0;794;m -ARIETE Gerardo;2083;CM;0;TA;030355;805246;105808;m -ARIGONI Bruno;2071;CM;30;RM;010565;0;110793;m -ARITO Luigi;1841;1N;30;ME;311062;0;110201;m -ARLANDI Angelo;2000;CM;30;MI;000162;0;798;m -ARLANDI Ennio;2438;IM;0;MI;210166;800104;106007;m -ARMENANTE Michele;1697;2N;30;SA;120563;0;800;m -ARMONI Giuseppe;1900;1N;30;PC;000056;0;801;m -ARNETTA Benedetto;1709;2N;30;PA;290579;0;109791;m -ARNETTA Maria Teresa;2020;CM;0;PA;040679;811572;104166;f -ARRIGHINI Giovanni;1921;1N;30;LU;200464;0;106047;m -ARRUZZA Francesco;1850;1N;30;MI;110655;0;112414;m -ARSI Michele;1855;1N;30;PI;0;0;806;m -ASCOLI Alberto;2068;CM;30;MI;000967;0;807;m -ASCOLI Giorgio;1903;1N;30;MI;000770;0;808;m -ASERO Fabio;1879;1N;30;MI;000365;0;809;m -ASMORO Tritoto;1700;2N;30;TO;001159;0;810;m -ASSIRELLI Andrea;1900;1N;30;FC;000961;0;811;m -ASTEGNO Roberto;1900;1N;30;VI;080748;0;102834;m -ASTENGO Corrado;2119;-M;0;MI;100359;802905;101313;m -ASTENGO Marcello;2109;CM;0;GE;240461;803928;101314;m -ASTOLFI Italo;1742;2N;30;RM;000763;0;815;m -ASTORINA Sebastiano;1700;2N;30;EN;120556;0;109629;m -ATTANASI Salvatore;1814;1N;30;RM;260959;0;100348;m -ATTANASIO Antonio;2084;CM;30;NA;090459;0;100355;m -ATTORRE Giuseppe;1900;1N;30;BA;000117;0;819;m -ATTORRE Michele;2053;CM;30;BA;000154;0;820;m -AULETTA Angelo;2256;-M;0;NA;210273;802972;102778;m -AUTELITANO Bruno;1739;2N;30;BG;001057;0;822;m -AUTIERO Giovanni;1756;1N;30;PT;160644;0;109759;m -AVENALI Giuseppe;1979;CM;30;BO;311276;0;101571;m -AZZONI Marino;1841;1N;30;MN;010960;0;101151;m -SUCCI Adriano;1490;2N;30;GE;190744;0;101328;m -BACCAGLINI Fulvio;1700;2N;30;CO;000764;0;827;m -BACCARIN Stefano;1625;2N;30;MI;050758;0;111722;m -BACCARO Franco;2149;CM;0;FI;100559;804975;101846;m -BACCHINI Stefano;1885;1N;30;VE;150867;0;103344;m -BACCI Renato;1700;2N;30;TS;001235;0;831;m -BADIALE Riccardo;1762;1N;30;VE;020235;0;104182;m -BADIALI Alessio;1817;1N;30;BO;230776;0;834;m -BADOCCO Denis;1796;1N;30;PN;030371;0;105874;m -BAGGIANI Fabio;1737;1N;0;GE;100554;816175;101342;m -BAGNOLI Lionello;1900;1N;30;RE;001227;0;837;m -BAJADA Giacomo;1603;1N;30;IM;150243;0;105076;m -BALBIS Bruno;1760;2N;30;AO;000841;0;839;m -BALDASSERONI Carlo;1610;2N;30;LT;110551;0;104942;m -BALDAZZI Stefano;2168;CM;0;BO;160165;803189;109430;m -BALDI Ciro;2000;CM;30;NA;001068;0;842;m -BALDINI Savino;1822;1N;30;RM;241153;0;102740;m -BALDIZZONE Mario;2167;CM;30;AL;000957;0;844;m -BALDUCCI Walter;1706;2N;30;PG;000331;0;845;m -BALDUZZI Eugenio;2152;CM;30;MI;000845;0;846;m -BALETTO Riccardo;2000;CM;30;GE;000755;0;847;m -BALLABIO Rolando;1900;1N;30;MI;000048;0;848;m -BALLESTRA Giovanni;1867;1N;30;IM;220455;0;108834;m -BALZAN Roberto;2175;-M;0;RM;310362;805009;120842;m -BALZANO Luigi;1781;2N;30;NA;000758;0;120312;m -BANDIERA Aurelio;1879;1N;30;ME;190268;0;100179;m -BANDINI Roberto;2060;CM;30;TE;080858;0;101879;m -BANKJ Brigitta;1774;1N;30;PU;310566;0;111246;f -BANTI Giorgio;1870;1N;30;IM;000821;0;855;m -BARACCA Paolo;1894;1N;30;RA;021164;0;109233;m -BARATELLA Claudio;1772;2N;30;PC;000452;0;857;m -BARAZZETTA Massimo;2080;CM;0;MI;070963;823260;104560;m -BARBAGALLO Giovanni;1999;CM;30;IM;030153;0;105070;m -BARBAGALLO Sergio;1900;1N;30;IM;121268;0;105071;m -BARBERA Manuel;1658;2N;30;PD;000657;0;862;m -BARBERA Pierluigi;1730;2N;30;BI;091063;0;107618;m -BARBERI Alessandro;2153;CM;0;MI;020862;805882;102499;m -BARBIERI Giovanni;1736;1N;30;MO;220853;0;117794;m -BARBIERI Matteo;1733;2N;30;CZ;000842;0;866;m -BARBIERI Pierluigi;1700;2N;30;CA;0;0;867;m -BARBIN Mario;1900;1N;30;SV;001230;0;868;m -BARBUTO Sergio;1850;1N;30;CZ;290751;0;103162;m -BARCIO Francesco;2012;CM;30;AP;000258;0;870;m -BARDELLI Alberto;1802;1N;30;VA;031270;0;113585;m -BARDI Luciano;1900;1N;30;LI;160149;0;103955;m -BARDI Massimo;2072;CM;0;LI;090356;816892;103954;m -BARDOTTI Stefano;1864;1N;30;PV;230865;0;100281;m -BARDUCCI Alessandro;1858;1N;30;RM;000667;0;875;m -BARECCHIA Marco;1673;2N;30;VE;090254;0;101466;m -BARERA Graziano;1700;2N;30;MI;280358;0;877;m -BARILLARO Luca;2180;-M;0;MO;200673;803090;103551;m -BASSIS Ivano;1820;1N;30;BG;020365;0;101655;m -RIGGIO Mauro;1811;1N;30;BG;130965;0;101672;m -DE-ROSA Luigi;1964;1N;0;LE;080667;818690;101301;m -BONOLI Luciano;1850;1N;0;AN;100243;824151;104749;m -RONZINO Pierpaolo;1700;2N;30;LE;170468;0;101296;m -MANGIONE Claudio;2080;CM;0;PA;310578;816078;104885;m -MOSCHELLA Marino;1613;2N;30;VA;120351;0;101375;m -PANIGONI Giuseppe;1892;1N;30;NO;130547;0;104868;m -ZUCCARELLI Angelo;1905;1N;0;SS;060260;815470;113774;m -D'ANDREA Carlo;1985;1N;30;AQ;060371;0;108877;m -MASSARO Antonio;1563;3N;30;TS;080534;0;103795;m -NACCA Bruno;1865;1N;30;LC;030369;0;107048;m -CORSINI Paolo;1616;2N;30;MI;051031;0;101730;m -BONGIORNO Roberto;1847;1N;30;LE;090261;0;105370;m -ABBATEMAGGIO Frances;1484;2N;30;TA;210835;0;105807;m -GOLINI Gastone;1634;2N;30;TN;120420;0;101264;m -AGOSTINI Guillermo;2010;CM;0;TN;010851;815969;100678;m -SERIO Danilo;1940;1N;30;PA;280881;0;104163;m -VERGA Domenico;2124;CM;0;PA;290581;812838;104174;m -DE-PAULIS Sergio;1671;2N;30;CN;020555;0;103254;m -PLENZICK Angelo;1577;2N;30;TO;290864;0;102194;m -SERRAJOTTO Marino;1724;2N;30;TO;200259;0;107916;m -DINI Massimiliano;1947;1N;0;PT;130871;822639;109880;m -FANCIULLI Gianluca;1673;2N;30;RM;050573;0;105417;m -DE-FELICE Michele;1715;2N;30;NA;160259;0;113614;m -PANARIELLO Francesco;1805;1N;30;NA;010152;0;102710;m -QUARANTA Gaetano;1889;1N;0;PD;100356;823724;104062;m -ROSSI Giacomo;1523;2N;30;GE;210245;0;117243;m -FACCIO Fabio;1948;1N;0;MI;250464;818240;104591;m -CADDEO Narciso;1607;2N;30;CA;131260;0;103111;m -ME Gianantonio;1652;2N;30;SS;240976;0;116020;m -PALMIERI Roberto;1826;1N;30;CA;100356;0;103110;m -SANZANI Pierluigi;1892;CM;0;BO;300163;815950;101602;m -CRUCITTI Paolo;1901;CM;30;SR;291080;0;110786;m -VALENZANO Giuseppe;1673;2N;30;TO;031060;0;117236;m -ABBURA' Davide;1676;2N;30;TO;141160;0;110199;m -ANTONELLI Cristian;1778;1N;30;GE;210760;0;100381;m -SCARUFFI Giovanni;1721;2N;30;GE;281264;0;110392;m -PICCOLI Giorgio;1691;2N;30;VR;210136;0;104921;m -DI-DONATO Giovanni;1951;CM;0;MI;110469;818704;100159;m -FUSCO Roberto;1748;2N;30;NO;021271;0;104873;m -DI-MILIA Francesco;1637;2N;30;SA;060874;0;921;m -DE-DEA Fabrizio;1835;1N;30;VI;170681;0;101434;m -GAZZETTA Marco;1631;2N;30;BG;010672;0;106030;m -BORIN Fabio;2143;-M;0;MI;091068;815250;117363;m -CASTIGLIONI Nando;1517;2N;30;PR;091227;0;108174;m -CASARTELLI Fabio;1955;1N;0;MI;301058;815608;102122;m -MOI Roberto;1970;CM;0;MO;160572;817848;101987;m -MEDORI Marco;1979;1N;0;RM;130363;823341;117052;m -GIORDANO Massimilian;1820;1N;30;TO;171072;0;101993;m -CASTO Corrado;2089;CM;0;SR;250180;814636;103692;m -NASELLI Giuseppe;1676;2N;30;CT;240953;0;105227;m -TONEL Giulia;1905;1N;0;TS;180590;821268;103782;f -MAUTONE Valerio;2157;CM;0;NA;220776;823635;102782;m -FARA Giovanni;1865;1N;30;SS;300665;0;106746;m -ISAIA Rosario;1579;2N;30;CT;210160;0;102478;m -AGOSTINELLI Massimo;1574;2N;30;LU;241157;0;110068;m -AMBROSANIO Raffaele;2020;CM;0;SI;281068;814431;107577;m -BARTOLINI Marco;1721;2N;30;PT;280582;0;107217;m -CECANNECCHIA Gianluc;1592;2N;30;TE;020274;0;110976;m -MADASCHI Sergio;1490;2N;30;MI;290741;0;106848;m -BOZZAO Francesco;1972;1N;0;VE;290566;821306;106343;m -D'INGIULLO Roberto;2119;CM;0;TO;190281;815349;100764;m -KOKOSHI Drin;1598;2N;30;EE;171245;0;111687;m -BUCHICCHIO Edoardo;1667;2N;30;SS;260644;0;102431;m -ATZENI Franco;2024;CM;30;CA;270868;0;103260;m -BUCHICCHIO Giancarlo;2088;CM;0;SS;110282;814130;102432;m -LAMBERTI Valerio;1676;2N;30;SA;060464;0;102695;m -LEONE Andrea;1664;2N;30;SA;040156;0;102693;m -TRAMONTANO-GUERRITOR;1694;2N;30;SA;060967;0;115433;m -BONADE' Massimo;2110;CM;0;PC;240480;814695;108177;m -MAZZEO Alberto;1859;1N;30;TP;221060;0;105768;m -COLICCHIA Vincenzo;1835;1N;30;TP;261162;0;100218;m -CASSIA Giuseppe;1484;2N;30;TP;030362;0;105757;m -MORICI Marco;1805;1N;30;AN;230854;0;111101;m -REGORDA Vittorio;1949;1N;0;MI;230455;819360;100131;m -ROBBIO Pietro;1883;1N;30;PV;190162;0;100279;m -ZAMPAR Andrea;1502;2N;30;MI;261057;0;101652;m -FRANCO Vincenzo;1790;2N;30;NA;230370;0;107236;m -SORRENTI Francesco;1951;1N;0;CZ;130668;816612;113833;m -VALOTTA Massimiliano;1868;1N;0;RC;180670;819425;106466;m -PINTAUDI Benedetto;1730;1N;30;PA;280454;0;104889;m -DI-DONATANTONIO Fran;2093;CM;0;TE;010465;817732;103985;m -MURTAS Gianvito;1748;2N;30;SS;030953;0;106737;m -PAPA Lucio;1523;2N;30;FG;011164;0;117215;m -MENEGOLLO Carlo;1889;1N;0;VI;310356;824062;103872;m -GRANO Giuseppe;1706;2N;30;KR;040860;0;106752;m -LONGO Giuseppe;1682;2N;30;KR;061164;0;106751;m -BRUNO Fabrizio;1957;1N;0;RM;260561;827673;115127;m -CORDELLI Benedetto;1789;2N;0;RM;281259;827762;102653;m -IACOACCI Giancarlo;1822;1N;0;RM;190655;818763;100824;m -MAROTTA Michele;2018;CM;0;RM;080674;816442;114990;m -BRUNELLI Giovanni;1882;1N;0;MI;050141;815276;101558;m -FERRARI Claudio;1811;1N;30;MI;201168;0;110832;m -CUDAZZO Fabrizio;1850;1N;30;LE;101172;0;115247;m -TOMINI Marco;2083;CM;0;RM;110363;816663;110367;m -DI-STEFANO Claudio;1646;2N;30;MI;130860;0;108324;m -LUVERA' Filippo;1877;1N;30;RC;100249;0;109736;m -MARINACCI Stefano;1534;3N;30;FG;081159;0;102338;m -GUTTAROLO Giovanni;1271;3N;30;EE;030932;0;109974;m -CECCHERINI Paolo;1691;2N;30;PI;090470;0;104051;m -GRUDINA Marco;1802;1N;30;GO;200171;0;102859;m -ANTONSIG Stefano;1518;3N;30;UD;080470;0;105927;m -DEL-PAPA Fausto;1610;2N;30;TE;211254;0;101931;m -BAVOSI Mariano;1905;1N;0;GE;050244;822060;101016;m -BANCHIO Davide;1931;1N;0;TO;021071;818631;102171;m -MARCONI Andrea;1733;2N;30;AN;150861;0;102017;m -RINAUDO Sergio;2122;CM;0;MC;181072;816108;105708;m -DELLA-ROCCA Luigi;1742;1N;30;LE;190166;0;109668;m -FONTANAROSA Luca;1835;1N;30;LE;030870;0;101297;m -SANTIVECCHI Danilo;2022;CM;0;RM;310377;813443;105434;m -RINALDI Raffaele;1643;2N;30;AP;040669;0;109134;m -MARELLO Giampiero;1776;2N;0;CN;080245;826219;109406;m -NOLI Giovanni;1832;1N;30;IM;160556;0;108828;m -MANGINO Carmine;1733;2N;30;SA;100163;0;102694;m -PEDROLLO Cristian;1865;1N;0;VR;240270;824100;100525;m -BLUNDO Michele;1754;2N;30;TO;130155;0;104832;m -ALBANO Luigi;1715;2N;30;TA;211059;0;117315;m -PONTI Martina;1503;3N;30;CA;300989;0;103303;f -SINDONA Alessandro;1637;2N;30;MI;260368;0;113951;m -DI-LIZIA Antonino;1718;2N;30;CH;130758;0;108874;m -DE-MEO Guido;1769;2N;30;LT;090760;0;103747;m -RIBA Raffaello;1589;2N;30;SV;150763;0;110966;m -BATTAGLIA Giuseppe;1604;2N;30;CT;030161;0;102467;m -CATANIA Vito;1724;2N;30;CL;180648;0;101452;m -BOSCARINO Gaetano;1502;2N;30;SR;300457;0;103684;m -COLLARO Paolo;1703;2N;30;VA;050965;0;103963;m -LUBELLO Edoardo;1598;2N;30;LE;060958;0;101300;m -PALMISANO Enrico;1736;2N;30;LE;251075;0;104765;m -CUTINELLI Giampiero;1829;1N;30;LT;230868;0;108905;m -PISTONE Salvatore;1580;2N;30;GE;141164;0;106181;m -DEL-PRATO Carlo;1541;2N;30;TO;021242;0;103256;m -MASSIMINI Gerbino;1616;2N;30;RM;270470;0;102739;m -NISCHLER Hermann;1580;2N;30;BZ;070950;0;101945;m -MENICHETTI Maurizio;1667;2N;30;FI;040865;0;107982;m -BELMONTE Carlo;1571;2N;30;CB;170355;0;104661;m -FIORONA Gianpietro;1655;2N;30;BG;041065;0;101707;m -MILAN Paolo;1795;1N;0;MI;231065;818798;104442;m -LA-FORTEZZA Michele;1879;1N;0;RM;130657;827797;108911;m -DONDI Renzo;1700;2N;30;BO;101239;0;101614;m -BONAPOSTA Fabrizio;1907;1N;30;RM;221176;0;110949;m -MEZZATESTA Franco;1655;2N;30;VT;301156;0;101907;m -CLARINI Ivo;1829;1N;30;UD;221271;0;100595;m -CITOSSI Enzo;1745;2N;30;TO;090148;0;102818;m -BORTOLUSSI Andrea;1796;2N;30;VE;;0;1024;m -FRANCESCONE Giovanni;1637;2N;30;TA;111176;0;110523;m -MASCIULLO Francesco;1835;1N;30;TA;050373;0;109827;m -STECCANELLA Willy;1766;2N;30;VI;141071;0;101495;m -GOLI Daniele;1982;1N;0;FI;020850;818283;110065;m -BURGASSI Daniele;2000;CM;0;FI;060560;826065;101851;m -CARBONI Giancarlo;1658;2N;30;FI;080935;0;101850;m -CHILLE' Pasquale;1949;CM;30;ME;020673;0;105748;m -ROMANO Costantino;1352;2N;30;FI;310528;0;109758;m -ORLANDI Stefano;1772;1N;30;TN;250258;0;102763;m -OLTRAMARI Silvano;1559;2N;30;TN;240156;0;102765;m -CANNAVACCIUOLO Domen;1406;2N;30;SA;251059;0;104301;m -STOJA Rocco;1685;2N;30;MT;141056;0;106719;m -PAOLINI Novello Mass;1688;2N;30;MI;240564;0;104605;m -BIAVA Pierluigi;1817;1N;30;BG;161046;0;101656;m -CALIOLO Angelo;1613;2N;30;BR;300370;0;106229;m -CARLUCCI Roberto;1751;2N;30;TA;051169;0;107908;m -FURNARI Francesco;1748;1N;30;CT;060560;0;106406;m -RUGGERI Manfredi;1835;1N;30;CT;280473;0;100453;m -RAPISARDA Angelo;1685;2N;30;CT;071155;0;100456;m -SORINI Lapo;1529;2N;30;PT;040570;0;107216;m -MANCA Tommaso;1709;2N;30;PT;240471;0;109762;m -AMATO Andrea;2263;-M;0;PA;031286;813222;104173;m -TOSO Pietro;1586;2N;30;TO;080640;0;102003;m -NAGLIATI Paolo;1742;1N;30;RO;160166;0;103566;m -COSSU Andrea;1823;1N;30;SS;210773;0;117626;m -ACHENZA Francesca;1592;2N;30;SS;210384;0;102292;f -TROIANI Carlo;1619;2N;30;SS;160250;0;102437;m -FAVINI Giovanni;1706;2N;30;SS;170772;0;102294;m -PAIS Mario;1672;2N;30;SS;090966;0;106747;m -BUCHICCHIO Alessandr;1966;1N;0;SS;170184;818941;102434;m -PICCINNO Giuseppe;1514;3N;30;LE;080565;0;111533;m -RAGNINI Damiano;1571;2N;30;AN;240768;0;104752;m -DE-BARBA Eric;1808;1N;30;BL;140380;0;105019;m -BROGGI Ferdinando;1634;2N;30;MI;190831;0;104008;m -CICIOTTI Augusto;1918;1N;0;MI;300965;818950;101749;m -CIRENI Michele;1903;1N;0;MI;110947;821357;114077;m -FERRARI Claudio;1655;2N;30;BS;060960;0;106111;m -SANAVIO Giancarlo;1799;1N;30;PD;290252;0;108115;m -GUZZO Giovanni;1798;1N;30;KR;;0;106469;m -GERBI Marco;1706;2N;30;GE;050157;0;101077;m -PETRUZZA Domenico;1640;1N;30;PV;;0;104864;m -SPARPAGLIONE Bruno;1760;2N;30;PV;180560;0;105165;m -BELLINI Roberto;1642;2N;30;BS;271156;0;102060;m -CANEVARI Fabio;1670;2N;30;PV;030667;0;105171;m -CORA' Massimo;1994;CM;0;VI;130381;815500;101432;m -MONTALTO Antonio;1814;1N;30;TP;050258;0;100221;m -PIERRI Vincenzo;1337;2N;30;TA;190671;0;112269;m -SMIRAGLIA Mario;1736;2N;30;TA;150667;0;105805;m -FUSI Claudio;1565;2N;30;CO;080154;0;102974;m -BERTRECCHI Corrado;1374;3N;30;VA;230655;0;117244;m -IACONI Andrea;1941;1N;0;AP;291272;825492;110978;m -SOSSI Giovanni;1507;3N;30;TO;051240;0;104728;m -BARBERO Giorgio;1628;2N;30;MI;190236;0;109522;m -BOSCOLO Ampelio;1715;2N;30;VE;241149;0;103348;m -GNEO Marco;1763;2N;0;VR;310563;825476;104916;m -MARCORI Mirko;1922;1N;0;VR;261255;817953;100526;m -NALIN Alberto;1503;3N;30;VR;060831;0;102034;m -SIMIOLI Stefano;1579;3N;30;FE;271264;0;102231;m -ANASTASIO Giovanni;1625;2N;30;KR;090439;0;106755;m -ZANCANARO Giampietro;1838;1N;30;VR;041156;0;111614;m -VIGLIAROLI Matteo;1463;2N;30;MI;301058;0;102879;m -PILI Erika;1868;1N;30;CA;020886;0;103114;f -BONETTI Carlo;1980;CM;0;BO;240279;815330;101573;m -NICCOLI Paolo;1994;1N;0;BO;141268;825875;100315;m -CROLLA Roberto;1415;3N;30;VB;;0;100484;m -PILOTTO Alessandro;1646;2N;30;PD;040646;0;106777;m -QUARANTA Cristiano;2088;CM;0;PD;260786;815810;104061;m -TRESIN Ardilio;1340;3N;30;PD;200637;0;103236;m -SPINA Ezio;1311;3N;30;BA;140450;0;107647;m -PALMINTERI Vincenzo;1613;2N;30;VA;200868;0;116038;m -TOSETTO Claudio;1547;3N;30;AT;240358;0;109681;m -BAFFA Pietro;1724;2N;30;KR;040974;0;106471;m -IRRERA Franco;1485;3N;30;GE;190747;0;102306;m -CAPPUZZELLO Rosario;1439;3N;30;RG;010529;0;105732;m -CARUSO Antonino;1693;2N;0;CT;010459;822604;100455;m -DI-MARI Piero;1721;2N;30;SR;180186;0;1100;m -NASELLI Adriano;1762;2N;30;CT;040587;0;105228;m -ROSSI Damiano;2001;CM;0;SR;221185;815381;103678;m -SCOLLO Giuseppe Elio;1551;3N;30;SR;100353;0;106589;m -SCOLLO Vincenzo;2062;CM;0;SR;090187;817872;106590;m -VALVO Vincenzo;1600;2N;30;SR;110641;0;106602;m -VALVO Antonino;1801;1N;30;SR;170680;0;106601;m -LA-MANNA Francesco;2119;CM;0;TN;211283;825514;101266;m -BULDRINI Francesco;1475;3N;30;TN;170955;0;101861;m -DE-NISI Mario;1974;1N;0;TN;210886;822019;101859;m -IORI Edmondo;1586;2N;30;TN;111063;0;107191;m -LA-MANNA Andrea;1895;1N;30;TN;211283;0;101265;m -IORI Romeo;1726;2N;30;TN;220767;0;107192;m -BARUFFALDI Giuseppe;1706;2N;30;RM;161038;0;100230;m -CALABRINI Alessandro;1608;2N;30;RM;260440;0;102657;m -GLORIOSO Attilio;1393;3N;30;RM;010125;0;105431;m -ROCCHETTI Marco;1941;1N;0;RM;240468;816582;108903;m -ROMAGNOLI Moreno;1815;1N;0;RM;250864;817317;105429;m -CORTESE Davide;1742;2N;30;MI;180574;0;113578;m -FANTINA Carla;1485;3N;30;MI;220642;0;102501;f -OCAMPO Edgardo;1717;2N;30;MI;010755;0;117364;m -ZUCCA Antonio;1675;2N;30;SS;170163;0;106741;m -MURADORE Aldo;1589;2N;30;UD;100336;0;105921;m -ZUZZI Silvano;1568;2N;30;UD;261236;0;105913;m -BELARDINELLI Franco;1890;1N;0;GO;020263;822175;102854;m -MONCADA Cesar;1849;1N;30;FI;061067;0;102098;m -MULONE Gaspare;1415;2N;30;VI;090739;0;102852;m -GASPARRONI Riccardo;1699;2N;30;AP;080487;0;105590;m -TUCCI Ferdinando;1706;2N;30;LT;101067;0;106224;m -LANZA Francesco Paol;1583;2N;30;VA;060457;0;107671;m -PEROTTI Davide;1888;1N;30;MI;030766;0;101762;m -BALEANI Emanuele;1807;1N;30;AN;281059;0;104751;m -PROCACCINI Luciano;1595;2N;30;TE;010354;0;102140;m -BOGATTO Mario;1326;3N;30;TO;260838;0;100780;m -SORBA Enrico;1494;2N;30;AT;250358;0;102172;m -TAMMARAZIO Saverio;1648;2N;30;GE;240362;0;117128;m -VICENTINI Andrea;1771;2N;30;GE;220471;0;100516;m -STROMBOLI Carlo;2196;CM;0;NA;231286;815853;110211;m -ZAMBRANO Raffaele;1561;2N;30;CT;180560;0;102472;m -CULTRERA Salvatore;1693;1N;0;SR;050238;825980;103686;m -REINA Giuseppe;1756;1N;30;CT;040375;0;100457;m -MORO Roberto;1628;2N;30;BS;230268;0;106088;m -BERTOLETTI Vincenzo;1463;3N;30;BG;290744;0;105528;m -CUCOCH Marisa;1514;2N;30;MI;270843;0;101742;f -FLORIO Italo;1373;2N;30;PV;011222;0;102217;m -PANZETTA Vieri;1459;3N;30;CO;150529;0;103510;m -MEGGIORIN Orlando;1577;2N;30;PD;151047;0;104037;m -CORTI Filippo;1625;2N;30;CO;070236;0;103504;m -BONFANTI Enrico;1481;3N;30;LC;220547;0;101658;m -GALIMBERTI Maurizio;1524;3N;30;MI;071054;0;102999;m -PETETTA Roberto;1652;2N;30;CO;020268;0;104843;m -CASINELLI Davide;1888;1N;30;FR;020681;0;104213;m -CORFIATI Paolo;1705;2N;30;PC;071263;0;106163;m -GUALTIERI Primo;1607;2N;30;PR;240853;0;101167;m -ITALIANO Antonio;1479;3N;30;PC;120864;0;102823;m -BUONO Michele;2135;CM;0;RM;230684;814598;104266;m -BOVE Alessandro;2097;CM;0;RM;280887;814121;104269;m -TRIFONI Giorgio;1721;2N;30;RM;040844;0;110376;m -TRICERRI Pierino;1500;3N;30;AL;080458;0;100806;m -PALADINO Antonio;1548;3N;30;CT;060257;0;105783;m -SEMINARA Antonio;1976;1N;0;CT;180389;817880;102477;m -D'AULISA Francesco;1688;2N;30;MI;011046;0;110829;m -FRONTALI Jacopo;1877;1N;30;MI;040786;0;103593;m -PIAZZA Angelo;2008;CM;30;VA;150478;0;102558;m -CERAMI Gianvito;1616;2N;30;TP;060136;0;100217;m -DI-MARCO Walter;1529;2N;30;SV;160662;0;109415;m -TASSINARI Bruno;1574;2N;30;GE;150622;0;109686;m -NAPOLITANO Giuseppe;1443;3N;30;PA;310736;0;104167;m -DEL-PRATO Fabrizio;1720;2N;30;TO;180768;0;103255;m -DEZZI Marco;1568;3N;30;TO;260267;0;109299;m -CHINELLATO Marco;1696;2N;30;VE;131178;0;106344;m -TRUSSARDI Renato;1750;2N;30;TO;220961;0;103245;m -VALLARIELLO Massimo;1467;3N;30;TO;180556;0;113818;m -SORCINELLI Francesco;2139;CM;0;TO;160481;814466;102175;m -D'AMATO Piergiorgio;1880;1N;0;TO;091176;821373;102005;m -MASSAFRA Antonio;1742;1N;0;TP;201165;821624;105761;m -SANTURBANO Maria Vin;1985;CM;0;CH;020468;819956;106945;f -MARCHIORI Giovanni;1433;2N;30;MI;090628;0;100710;m -PRIORI Luigi;1556;2N;30;PV;090546;0;100708;m -MARGUATI Massimiano;1909;1N;30;TO;161074;0;104725;m -MAFFEO Mauro;1610;2N;30;VB;130350;0;100486;m -ARRAS Antonio;1579;2N;30;PD;070469;0;101461;m -TACCONELLI Valentino;1850;1N;30;CH;070569;0;106944;m -ROMBALDONI Axel;2169;CM;0;PU;230392;815837;100302;m -CENTOFANTE Maria Ros;1400;2N;30;VA;171052;0;104543;f -DENTATO Antonio;1643;2N;30;NA;090659;0;105635;m -FAMBRI Giuliano;1538;2N;30;TN;301030;0;102768;m -GALAS Franco;1517;2N;30;TN;121249;0;102767;m -CASTELLANO Fulvia;1778;1N;30;MI;250189;0;100593;f -BALZANO Giuseppe;1685;2N;30;NA;070668;0;102080;m -RICCIUTI Luigi;1560;3N;30;VE;100189;0;113627;m -SCANDELLA Marco;1536;3N;30;TN;180859;0;101860;m -ABRIANI Devis;1700;2N;30;VI;020477;0;105677;m -PIETROBON Gabriele;1652;2N;30;TV;181264;0;101516;m -GONZALES Guillermo;1911;1N;0;VE;211076;817082;103074;m -SCHROTT Ernst;2070;CM;0;BZ;270462;821810;108784;m -TORTORA Antonio;1732;1N;30;NA;170365;0;109577;m -CARDANI Roberto;1880;1N;0;VA;260962;814989;104707;m -YAMAUCHI Juan;1568;2N;30;PG;220634;0;109801;m -VITERBO Luca;1763;1N;30;BA;130574;0;107160;m -PES Domenico;1657;2N;30;SS;180351;0;102436;m -FERRARI Graziano;1558;3N;30;MS;270465;0;103654;m -DE-PASCALIS Anna Gra;1546;3N;30;LE;300685;0;1202;f -FALCICCHIA Giovanni;1503;3N;30;LE;280955;0;103925;m -NELLI Carlo;1992;CM;0;FI;131064;813796;105324;m -CAMPATELLI Giovanni;1610;2N;30;FI;271255;0;107988;m -PASQUOTTO Mirko;1939;1N;0;TS;191080;825166;103192;m -DECATALDO Alba;1936;CM;30;BA;200470;0;109669;f -D'INGIULLO Giovanni;1757;2N;30;TO;101048;0;100763;m -LODI Paolo;1552;2N;30;PD;020637;0;109707;m -FRATINI Mauro;1745;1N;30;MC;041173;0;103019;m -SCORSONE Francesco;1599;3N;30;PA;181181;0;1212;m -BUZZANCA Giusy;1631;2N;30;ME;181185;0;115953;f -SPIGA Bruno;1492;3N;30;BO;220562;0;101606;m -FEBBO Giuseppe;1560;3N;30;LE;310586;0;105374;m -CHIERCHIA Gennaro;1717;2N;30;CB;231264;0;104663;m -PALLADINO Nicola;1551;3N;30;CB;;0;100004;m -GROGER Astrid;1517;3N;30;TO;180954;0;106180;f -LATINI Marco;1730;2N;30;LU;030562;0;103474;m -SAU Massimo;1587;3N;30;MI;270274;0;104013;m -CARVELLI Francesco;1445;3N;30;MI;180248;0;100699;m -DELLE-FAVE Fabio;1747;1N;30;MI;170574;0;102124;m -UNGHERO Luigi;1469;2N;30;MI;310745;0;102508;m -MARINI Giulio;1562;2N;30;LI;200968;0;106850;m -RUSSO Carmelo;1671;1N;0;CT;020743;816590;102452;m -SANTOCONO Sebastiano;1647;2N;30;SR;;0;113754;m -VALSECCHI Luca;1598;2N;30;LC;160962;0;103002;m -BOSCOLO Aldo;1679;2N;30;VE;230759;0;103347;m -MORELLO Franco;1460;3N;30;TV;070939;0;107806;m -IORI Massimiliano;1816;1N;30;MC;270772;0;104576;m -MEZZETTI Raffaello;1759;1N;30;BO;160158;0;100313;m -SANTACROCE Fidel;1643;2N;30;UD;311284;0;105910;m -MUZZOLINI Claudio;1772;2N;30;UD;010741;0;103734;m -TAMAI Raimondo;1810;1N;30;PN;240350;0;102030;m -RUGGIERI Daniele;1572;3N;30;VE;120161;0;103085;m -SORRENTINO Michele;1996;CM;0;NA;141162;822876;104622;m -LOCATELLI Andrea;2138;CM;0;BG;220486;813028;101708;m -ROTA Simone;1834;1N;30;BG;180983;0;102934;m -IOVINO Giovanni;1481;2N;30;IS;070119;0;109896;m -LASTORIA Venanzio;1655;2N;30;IS;010253;0;110138;m -SANGIORGIO Francesco;1580;2N;30;TA;260943;0;109593;m -BERTUCCO Diego;1724;2N;30;VR;100565;0;101556;m -BUONO Valerio;1991;CM;0;RM;260187;815993;104274;m -NARDUZZI Nicola;1690;2N;30;VT;040163;0;101909;m -LAZZERI Gianni;1535;3N;30;FI;280962;0;102100;m -LEVATO Biagio;1606;2N;30;KR;280839;0;106468;m -FILIPPI Lamberto;1452;3N;30;VE;071129;0;106681;m -IELASI Domenico;1535;2N;30;MI;240830;0;104015;m -GRIMALDI Renato;1592;3N;30;PA;180957;0;1250;m -PARADISO Giovanni;1431;3N;30;PA;131237;0;104165;m -AMENTA Tommaso;1474;3N;30;PA;120246;0;114412;m -VIRELLI Salvatore;1539;3N;30;KR;241055;0;108498;m -GASPARRONI Daniele;1760;2N;30;AP;050589;0;105591;m -MARINUCCI Johnny;1667;2N;30;MC;230372;0;104577;m -SANNA Marco;1697;2N;30;SA;071164;0;100624;m -BREIDENBACH Heinz;1490;3N;30;MI;140830;0;101733;m -POPOVIC Dragan;1888;1N;30;MI;271066;0;102949;m -NARDELLI Marco;2123;CM;0;TO;150583;814164;102173;m -TOMELLERI Alessio;1972;CM;0;BL;261167;815403;105038;m -VINCIGUERRA Marco;2084;CM;0;TO;130564;812935;102164;m -ARRABITO Gianfranco;1946;1N;0;RG;080982;820946;105724;m -DI-MARTINO Giancarlo;1688;2N;30;RG;080750;0;105728;m -BORGATO Alessandro;1637;2N;30;PD;260863;0;107201;m -ALESSI Giovanni;1640;2N;30;PD;280653;0;109922;m -ZOCCO Michela;1598;2N;30;SR;261087;0;106597;f -COSCI Massimo;1700;2N;30;LU;190757;0;106055;m -ERRERA Dario;1793;1N;30;TP;300579;0;100219;m -ODDO Salvatore;1550;2N;30;TP;120757;0;105763;m -CONTA Diego;1556;2N;30;MI;111053;0;100119;m -BONATTI Aldo;1421;2N;30;MI;050743;0;102954;m -DI-GENNARO Antonio;1625;2N;30;NA;051154;0;109754;m -SOMMA Michele;1637;2N;30;NA;160475;0;105632;m -FRANCESCHELLI Mauriz;1688;2N;30;BO;010359;0;111022;m -SPINOSA Giovanni;1886;1N;30;BO;210154;0;101607;m -CAVEZZANA Davide;1706;2N;30;TO;200471;0;104834;m -MARCHESOTTI Giovanni;1484;2N;30;MI;100846;0;100700;m -LIUTI Aldo;1625;2N;30;BR;110966;0;109354;m -ZUCCARO Guido;1876;1N;0;BO;310768;827169;105340;m -CASADIO Alviero;1766;2N;30;MO;110379;0;100210;m -GANDINI Gaudio;1670;2N;30;MO;080352;0;100206;m -NAVARRO Tommaso;1772;1N;30;PD;240889;0;104060;m -GAION Giancarlo;1981;1N;0;VE;220162;827690;100828;m -MOSCHINI Franco;1688;2N;30;FI;101150;0;101412;m -ROMOLINI Mario;1613;2N;30;FI;210334;0;102097;m -MUSMARRA Giovanni;1727;2N;0;RM;290869;826952;108918;m -MANGILI Riccardo;1668;2N;30;BG;130266;0;102930;m -ACETO Lorenzo;2054;CM;0;BS;081174;814415;106932;m -LOI Francesco;1417;3N;30;CA;101156;0;103270;m -COLLU Silvano;1502;2N;30;CA;040969;0;103266;m -LAI Luca;1877;1N;30;CA;190287;0;103269;m -ABIS Roberto;1714;2N;30;CA;151053;0;103258;m -PERRA Marco;1566;3N;30;CA;201162;0;103853;m -SCARTEDDU Marco;1661;2N;30;OR;050653;0;103283;m -FRILLI Guido;2154;CM;0;PT;190587;814148;102897;m -CANGIANO Federico;1703;1N;30;CE;161064;0;100392;m -SALVAGNI Gianfranco;1563;3N;30;RM;290444;0;108917;m -BIASON Adriano;1826;1N;30;PN;030574;0;103742;m -DI-TOMASO Fausto;1601;2N;30;UD;300753;0;105922;m -BEVILACQUA Michele;1653;2N;30;CE;300364;0;110424;m -DE-ROSA Maria;2092;WF;0;NA;100788;815136;101061;f -RADULESCU Gheorghe;2026;CM;30;EE;310759;0;104043;m -LOI Alberto;1592;2N;30;MI;130364;0;102551;m -BACIGALUPO Alberto;1616;2N;30;MI;061052;0;110799;m -BONARDI Giuseppe;1532;2N;30;MI;171243;0;101008;m -GENTILI Guido;1910;1N;30;MI;120461;0;100698;m -GIOVANNINI Gabriele;1718;2N;30;MI;030985;0;109363;m -LANCIANESE Giuseppe;1715;2N;30;CO;150863;0;103521;m -RAFFALDI Fabrizio;1769;2N;30;LO;290876;0;104429;m -SCACCHI Paolo;1706;2N;30;LO;281066;0;104431;m -SCHINGARO Angelo;1708;2N;0;VA;150657;822868;104720;m -SANTINELLI Sergio;1496;3N;30;LI;250559;0;106978;m -SALA Pierluigi;1508;3N;30;MI;221056;0;102520;m -GARDINI Enrico;1881;1N;0;GE;150962;815462;105163;m -CAPPA Enrico;1592;2N;30;VC;210770;0;104395;m -BASSO Danilo;1646;2N;30;BI;020363;0;102048;m -MERIDDA Mario;1448;3N;30;SS;260156;0;100370;m -BUCHICCHIO Roberto;1838;1N;30;SS;010188;0;102435;m -ALESSANDRO Sergio;1691;2N;30;RM;;0;117359;m -PUGNETTI Sergio;1837;1N;30;TS;;0;103801;m -DONADIO Andrea;1634;2N;30;SA;130974;0;106629;m -MARINO Paolo-Enrico;1700;2N;30;SA;310552;0;106633;m -PETROSINO Vincenzo;1820;1N;30;SA;220174;0;101250;m -SARNO Luca;1871;1N;30;SA;180884;0;100625;m -FASSIO Francesco;1541;2N;30;TO;041048;0;108757;m -MAISTRI Luciano;2022;CM;0;TN;260366;822400;100046;m -MENICHELLI Sandro;1714;2N;30;VR;270258;0;104918;m -CALZERANO Gerardo;1575;3N;30;PI;191177;0;106076;m -PIZZO Andrea;1688;2N;30;AO;040249;0;110973;m -GALIANO Salvatore;1636;2N;30;FE;081260;0;109232;m -MUZZI Claudio;1771;2N;30;PG;310574;0;110064;m -CATTANI Stella;1496;3N;30;BO;100588;0;101625;f -PADOVANI Alessio;2019;CM;0;AN;120965;813184;104756;m -MARASCIULO Giacomo;1661;2N;30;BA;131069;0;104368;m -ANGIONI Gian Carlo;1807;1N;0;TO;050944;821284;104829;m -SILVESTRI Giorgio;1784;2N;30;AP;100567;0;109799;m -GIRELLI Sergio;1705;2N;30;BS;230272;0;102341;m -VACCARI Giorgio;1608;2N;30;TN;300759;0;102736;m -ZORDAN Diego;1670;2N;30;TN;210474;0;102769;m -STIRPE Claudio;1918;1N;30;FR;180583;0;104214;m -CISILINO Oscar;1727;2N;30;UD;280771;0;103741;m -DI-GIOVANNI Isidoro;1806;1N;0;MI;140460;826766;103586;m -PORETTI Ennio;1747;2N;30;LC;300656;0;102561;m -CREPALDI Marco;1894;1N;0;AL;200765;824283;102544;m -MARINI Riccardo;1661;2N;30;VT;191149;0;101904;m -MARONGIU Angelo;1488;3N;30;SS;170353;0;114578;m -NICOLOSI Pietro;1964;1N;0;CT;051236;822760;102451;m -DE-LILLO Michele;1918;1N;0;BO;050460;814504;107918;m -GOLINO Giovanni;1625;2N;30;RM;160571;0;115001;m -PELLEGRINO Giuseppe;1739;2N;30;TP;260259;0;100223;m -MANCONI Antonio;2023;CM;0;LU;270488;818356;110642;m -BERTAGIA Roldano;2013;CM;0;TO;171056;817503;110470;m -COLOMBO Matteo;1540;3N;30;VE;230487;0;103325;m -ROSSI Aldo;2211;CM;0;RM;250284;814024;104517;m -CANTALUPO Corrado;1547;2N;30;CB;240556;0;104660;m -NOVI' Giuseppe;1706;2N;30;VA;231154;0;103966;m -BOSCOLO Marco;2041;CM;0;VE;180287;818658;106649;m -CHINDEMI Giuseppe;1603;2N;30;SR;050782;0;106606;m -DARDANONI Mario;1599;3N;30;PA;240537;0;109779;m -BARBATO David;1817;1N;30;PI;280574;0;111786;m -MONTELEONE Erich;1586;2N;30;PI;210170;0;106851;m -FALCO Ottavio;1618;2N;30;SR;280787;0;106591;m -STEFANINI Simone;1886;1N;30;CA;250872;0;103284;m -BASSO Fabrizio;1706;2N;30;AP;180161;0;105584;m -MOSCHETTO Giuliano;1676;2N;30;TO;170371;0;103242;m -FRANZOSO Giovanni;1658;2N;30;RO;111225;0;106711;m -MONTI Massimiliano;1621;2N;30;PA;170960;0;118011;m -COLUSSO Enrico;1691;2N;30;TV;180872;0;107813;m -GALLARETO Stefano;1622;2N;30;SV;100567;0;109417;m -MAZZI Dimitri;1703;2N;30;VR;110571;0;100934;m -CAPPAI Davide;2092;CM;0;RM;050586;813338;104271;m -FRANCALANCI Giulio;1718;2N;30;FI;020471;0;101852;m -MERCIARI Moreno;1766;2N;30;MO;200782;0;100207;m -SILVESTRO Roberto;1751;2N;30;TP;010165;0;105767;m -BADIALI Carlo;1814;1N;30;TS;101276;0;103785;m -CHIANDUSSI Livio;1491;3N;30;TS;150440;0;106534;m -LA-MALFA Stelio;1692;2N;30;TS;051261;0;106533;m -IDORNI Maurizio;1649;2N;30;UD;060459;0;105917;m -BONAFEDE Alvise;1751;2N;30;RM;270258;0;112568;m -SEGNALINI Stefano;1481;3N;30;RM;030357;0;110361;m -TRIMBOLI Carlo;1610;2N;30;PD;160747;0;104025;m -CERUSICO Carlo;1433;2N;30;AN;100740;0;104754;m -VATTA Marino;1625;2N;30;TA;020540;0;104629;m -FERRI Primo;1575;3N;30;MI;031236;0;100073;m -GERARDI Stefano;1599;3N;30;VE;210179;0;103073;m -VARVARA' Antonino;1661;2N;30;CN;140462;0;105094;m -XAUSA Flavio;2088;CM;0;TO;290284;818887;105186;m -SANSICA Giuseppe;1664;2N;30;TP;290686;0;105765;m -FERRO Maurizio;1700;2N;30;TP;140270;0;107771;m -FILIGHEDDU Angelo;1440;3N;30;SS;140354;0;102295;m -MERIDDA Raimondo;1443;3N;30;SS;251253;0;100365;m -DEMARTIS Francesco;1568;3N;30;SS;200475;0;100373;m -DALERCI Franco;1520;3N;30;SS;130638;0;106731;m -EVANGELISTI Gianpaol;1619;2N;30;GE;121234;0;101024;m -CARRIERO Giovanni;1613;2N;30;TA;111156;0;105737;m -GRANALDI Alessandro;1995;CM;0;TA;270479;816361;105740;m -TARANTINO Isabella;1673;2N;30;TA;030790;0;107914;f -GUALAZZI Paolo;1742;2N;30;MN;081171;0;104230;m -MENINI Luca;1706;2N;30;VR;240363;0;101560;m -BARUFFA Marino;1729;2N;30;TO;311060;0;102180;m -VOZZA Augusto;1514;2N;30;TO;250345;0;102207;m -MACHI' Fabio;2015;CM;0;PA;270385;814881;104181;m -FAVARA Vincenzo;1631;2N;30;PA;061181;0;100425;m -DELLA-MONACA Stefano;1616;2N;30;GR;021077;0;105319;m -DELLA-MONACA Pierlui;1718;2N;30;GR;191170;0;105318;m -CORRIERI Giovanni;1546;3N;30;GR;200148;0;105321;m -TRAVAINI Gianfranco;1577;2N;30;VA;211141;0;104722;m -VILLA Maurizio;1497;3N;30;MI;110663;0;104440;m -BATTAGLIA Edoardo;2055;CM;0;LU;241287;815543;103494;m -LOBINA Giulio;1628;2N;30;CA;181283;0;103857;m -SANGUINETI Mauro;1685;2N;30;GE;010959;0;104468;m -GRUPPUSO Arcangelo;1601;2N;30;TP;120470;0;105770;m -GANDOLFI Attilio;1799;1N;30;NO;240940;0;100491;m -PANELLA Fiammetta;1954;1N;0;RM;290888;815110;104277;f -GORINI Tommaso;2104;CM;0;RM;200387;815039;109763;m -VECCHI Eugenio;2047;CM;0;BO;101187;815896;101636;m -BARBETTA Cosimo;1592;2N;30;VI;080846;0;103866;m -MAIORI Nicola;1962;1N;0;GE;300159;816434;101078;m -VOLPARA Riccardo;1532;2N;30;IM;110963;0;105089;m -SABATELLI Angelo;1741;1N;30;BA;101077;0;109366;m -CUSANO Ernesto;1742;2N;30;SA;250577;0;106631;m -DE-VIVO Christian;1647;2N;30;SA;090376;0;106634;m -IOVANE Antonio;1655;2N;30;SA;270576;0;106639;m -FORTUNATO Cordiano;1455;3N;30;SA;171053;0;106632;m -PALUMBO Claudio;1640;2N;30;VA;200566;0;100151;m -QUINTO Raffaele;1598;2N;30;AO;190761;0;102921;m -SALA Giovanni;1968;1N;0;BG;311086;819379;101701;m -MORA Lorenzo;1871;1N;30;BG;301288;0;101713;m -BONAN Yves;1837;1N;30;VE;210547;0;101467;m -CASAGRANDE Corrado;1541;3N;30;VE;220169;0;101469;m -NICOLELLA Vincenzo;1339;3N;30;MI;241037;0;100169;m -BONORA Luca;1640;2N;30;TV;170485;0;106440;m -COLLU Giuseppe;1706;1N;30;CA;110750;0;107534;m -BARACCHI Filippo;1928;CM;0;VE;071283;815314;103064;m -BONAFEDE Alessandro;2175;CM;0;TV;160490;813826;106501;m -LORENZINI Adriano;1919;1N;30;VE;070968;0;103076;m -D'AMICO Francesco;1622;2N;30;FR;230870;0;104215;m -PESCE Elio;1546;3N;30;GE;010266;0;109682;m -MASSIRONI Marco;2150;CM;0;MI;300886;814369;103543;m -BOSI Clint;2050;CM;0;PV;190587;818666;105173;m -FOLCINI Gaddo;1487;3N;30;CR;030764;0;101286;m -PERICOLI Fabio;1599;3N;30;MI;030378;0;105473;m -LETTIERI Giuseppe;2295;-M;0;NA;230189;815730;107244;m -VISCONTI Egidio;1619;2N;30;CO;120344;0;103516;m -LONGO Enrico;1586;2N;30;TO;131161;0;106260;m -POLIGNANO Noel;1732;2N;30;RM;150967;0;105442;m -ZANON Gabriele;1510;3N;30;TN;260774;0;100421;m -SGUAITAMATTI Roberto;1616;2N;30;AL;231063;0;102564;m -ZAMBON Carlo;1503;3N;30;PD;031286;0;113516;m -RIVERA Maurizio;1532;3N;30;MI;031167;0;100086;m -TANDA Giovanni;1750;1N;30;SS;140875;0;117549;m -BERNASCONI Fabio;1811;1N;30;CO;070168;0;102967;m -TOMASELLI Maurizio;2089;CM;0;CT;301086;817350;107364;m -IMBRAGUGLIA Fabio;2072;CM;0;CT;211086;814903;107365;m -GRANATA Gregorio;1504;3N;30;CT;310142;0;102479;m -FAVA Luciano;1626;2N;30;CN;021063;0;105099;m -SANTAGATI Alessandro;2116;CM;0;CT;300787;814644;107367;m -GIUDICE Giovanni;1640;2N;30;CT;070388;0;103452;m -LOCCISANO Giuseppe;1709;1N;30;TO;180954;0;109190;m -LA-BELLA Roberto;2027;CM;0;PA;271285;818771;110044;m -TERRANOVA Roberto;1895;1N;0;PA;201287;821861;104901;m -DI-BELLA Daniele;1672;2N;30;PA;190187;0;104902;m -DERRO Giuseppe;1655;2N;30;TO;070366;0;108792;m -CORIANI Luigi;1618;2N;30;GE;210448;0;101084;m -MENTIL Renato;1436;3N;30;GE;230547;0;101085;m -ABBONDANZA Christian;1757;2N;30;GE;211274;0;109614;m -VALLARINO Giacomo;1667;2N;30;GE;130454;0;109617;m -BONDI' Fabio;1742;2N;30;MI;241072;0;109102;m -NANNUZZI Alberto;1581;3N;30;MO;100891;0;109116;m -LIBERTI Vincenzo;1583;2N;30;GE;260246;0;101029;m -PIANTIERI Guido;1554;2N;30;TE;260472;0;116460;m -TODARELLO Giovanni;1816;1N;30;RC;020588;0;104101;m -CASTELLANO Fabio Mar;1899;CM;0;MI;250189;816019;100594;m -D'APA Matteo;2020;CM;0;MI;170491;815489;102955;m -CECCARONI Penny;1450;3N;30;FC;010133;0;109765;f -FRUGOLI Pierpaolo;1750;2N;30;LU;270279;0;109890;m -BACILIERI Nicola;1748;2N;30;VR;180180;0;114856;m -MALLO' Danilo;1689;2N;30;CA;070880;0;114974;m -FURCAS Simone;1532;3N;30;CA;050882;0;107537;m -RUGGERI-LADERCHI Gio;1700;2N;30;VT;220264;0;111280;m -CRISTOFORI Francesco;1793;1N;30;VT;041051;0;101910;m -PARLA Aldo;1571;2N;30;ME;091039;0;115618;m -PROCACCI Sergio;1998;1N;0;CE;0;819883;100617;m -ANGELICOLA Gianluca;1628;2N;30;CB;090775;0;104659;m -DASSISTI Alberto;1978;CM;0;LO;140971;817554;109847;m -COLOMBO Ivano;1649;2N;30;MI;261072;0;100867;m -OLIVARI Antonio;1741;2N;30;NO;230755;0;100487;m -MARCONCINI Fabio;1707;2N;30;BO;150572;0;101590;m -MARIANI-TOSATTI Enri;1565;3N;30;BO;071248;0;100295;m -BRUSCOLI Francesco;1610;2N;30;TV;010275;0;109990;m -RIGO Caterina;1694;2N;30;VR;010688;0;101366;f -RAVAGNATI Marco;1844;1N;0;MI;060390;823953;100717;m -KIDANE Robel;2121;CM;0;MI;191186;813516;100718;m -EVANGELISTI Claudio;1744;2N;30;RM;190383;0;100466;m -MELI Massimo;1878;1N;0;CT;250868;817830;109935;m -BIAZZO Giorgio;1679;2N;30;RG;041170;0;105723;m -SALVINI Marco;1617;2N;30;SP;031166;0;103643;m -ZIGNEGO Marino;1783;2N;30;SP;051053;0;103646;m -MANTOVAN Giorgio;1581;3N;30;VE;230450;0;103368;m -BOSCOLO Michele;1855;1N;30;VE;180370;0;103352;m -NAPOLI Claudio;1912;1N;0;CN;240771;823856;105189;m -CREPALDI Manuele;1817;1N;30;TO;030175;0;104309;m -FOSSATARO Mario;2042;CM;0;FR;240171;816337;110110;m -LISANDRI Luigi;1502;3N;30;RM;310527;0;110108;m -BATTAGLIA Fabio;1637;2N;30;CT;220990;0;102483;m -DAL-MONTE Davide;1562;2N;30;BO;040776;0;101582;m -ABIS Mariano;1586;3N;30;CA;200651;0;107531;m -LEVI-MINZI Matteo;1500;3N;30;TV;231270;0;112125;m -FASAN Stefano;1700;2N;30;VE;280356;0;103055;m -NICOLOSI Paolo;1642;2N;30;TP;280747;0;105762;m -PEROGIO Lorenzo;1889;1N;30;MC;111069;0;110102;m -GIANFELICI Edoardo;2069;CM;0;MC;220490;823554;108215;m -PROFAIZER Gino;2060;CM;0;TN;140540;813010;102722;m -MACARIO Marco;1815;1N;30;TO;040269;0;117141;m -LAPENNA Antonio;2079;CM;0;MO;070890;814245;101933;m -LANZI Mirco;1700;2N;30;RE;190986;0;102878;m -PIETROBON Mirco;1630;2N;30;PD;270873;0;106799;m -CANCIANI Sardo;1547;2N;30;UD;020153;0;105931;m -MARSONI Francesco;1596;3N;30;FI;040973;0;110063;m -BERTONE Carmelo;1598;2N;30;GE;131148;0;110133;m -REDUZZI Maurizio;2103;CM;0;BG;041187;817112;101698;m -MERLINI Luigi;1462;3N;30;MI;030935;0;104604;m -D'ANGHEO Savino;1520;3N;30;BG;191161;0;108774;m -MORA Aldo;1476;3N;30;BG;070327;0;101680;m -TESTA Luigi;1572;3N;30;BG;070961;0;101685;m -FORTINO Fabrizio;2029;CM;0;TO;260689;817597;105195;m -EINAUDI Malcom;1577;3N;30;TO;150368;0;110477;m -ROSATI Simone;1700;2N;30;PG;181078;0;117138;m -VASSALLO Raffaele;1427;3N;30;TO;250363;0;102178;m -BORTOLIN Bruno;1924;1N;30;TS;280950;0;103789;m -PIRONA Dario;1822;1N;30;TS;101029;0;110075;m -FRATTA Roberto;1468;3N;30;TO;070460;0;112596;m -MARINO Francesco;1616;2N;30;SA;251065;0;109981;m -PANDOLFO Sergio;1688;2N;30;TP;241082;0;108244;m -DI-MEO Antonio;1700;2N;30;CE;250487;0;100412;m -DI-GIULIO Massimo;2033;CM;0;NA;060452;821446;103399;m -FAGIOLINO Lorenzo;1811;1N;30;SI;230986;0;107596;m -BONAFEDE Emanuel;1998;1N;0;RM;210485;819565;111683;m -CANOVA Luca;2106;CM;0;BG;090480;818151;110399;m -MASPERO Alfio;1445;3N;30;MI;180621;0;107761;m -ALBANESE Michele;1599;3N;30;MI;260684;0;102487;m -PULIMENO Roberto;2042;CM;0;BA;290386;816558;109385;m -FRASCATI Francesco;1529;2N;30;PD;071153;0;100830;m -SALSANO Dario;1775;2N;30;SA;040289;0;108582;m -DELLA-CORTE Marco;1871;1N;30;SA;050488;0;100630;m -ACCIAIOLI Fabio;1676;2N;30;PU;291066;0;111418;m -GORI Giuseppe;1584;3N;30;PU;051252;0;109706;m -FACENDA Danilo;1724;2N;30;SA;180186;0;107017;m -MARTON Massimiliano;1577;3N;30;TV;120568;0;102580;m -GRIPPA Rocco;1428;3N;30;BA;290659;0;105803;m -MACINA Pasquale;1546;3N;30;TA;130678;0;109820;m -HELLWEGER Stefan;1706;2N;30;BZ;130986;0;101959;m -BONAGURA Stefano;1980;CM;0;BZ;160590;816744;101960;m -BENEDETTI Maurizio;1499;2N;30;VR;040659;0;104913;m -PARENTI Davide;1901;1N;30;MI;170981;0;110382;m -BASSO Piergiorgio;1823;1N;30;TV;270391;0;111617;m -GATTI Franco;1550;2N;30;TO;050546;0;110479;m -TOMANIN Roberto;1605;2N;30;TO;110551;0;111210;m -FERRARIO Enrico;1939;1N;0;TO;300757;821489;111185;m -MONTEROSSO Salvatore;1462;3N;30;SR;170874;0;109911;m -CALICCHIA Giovanni;1775;1N;30;PD;091166;0;110671;m -ROVAI Andrea;1652;2N;30;LU;270486;0;109245;m -SIMONINI Roberto;2057;CM;0;LU;121089;818852;103499;m -NARDI Marco;2045;CM;0;LU;040588;816833;108845;m -BERNARDINI Luca;1826;1N;0;LU;280787;817120;103496;m -LA-MAESTRA Domenico;1660;2N;30;MI;091042;0;102129;m -RAGNONI Alessandro;2104;CM;0;RM;010386;813427;110956;m -RUBINI Alessandro;1634;2N;30;TV;261291;0;111627;m -GERVASI Luigi Santo;1733;2N;30;VA;180558;0;104541;m -ANDREOLI Marco;1622;2N;30;VR;021288;0;100985;m -LAI Silvia;1754;2N;30;CA;210588;0;103298;f -BOI Paolo;1586;2N;30;CA;080283;0;107532;m -CAMPOS Alexis;1584;2N;30;CA;060270;0;110861;m -LOMBARDI Giuseppe;1427;3N;30;TN;201036;0;102771;m -CADEL Guido;1559;2N;30;VE;071283;0;103069;m -SINDONI Antonio;1950;1N;0;RM;140483;817686;107231;m -VANACORE Francesco;2055;CM;0;NA;190787;821110;105641;m -PEZZOTTA Gianni;1444;3N;30;MI;220155;0;110088;m -MARINI Maurizio;1568;2N;30;MI;280463;0;110255;m -RAMPI Franco;1438;3N;30;MI;010655;0;109958;m -MARCELLI Luigi;1781;2N;30;FR;290969;0;112201;m -FABIANO Manuel;1670;2N;30;VE;120772;0;107517;m -BEJKO Shkelqim;1667;2N;30;UD;071157;0;112352;m -PITIS Raul;1601;2N;30;UD;230866;0;103706;m -IDILI Leonardo;1721;2N;0;MI;080447;823325;111088;m -DIENI Eleonora;1502;2N;30;RM;290588;0;104279;f -SPALLANZANI Massimil;1538;2N;30;MO;101167;0;112000;m -ZORZETTO Carlo;1745;1N;30;BO;030758;0;111049;m -ROMANO Antonino;1452;3N;30;TO;110638;0;100812;m -LOCCI Damiano;1976;CM;0;CA;280490;819751;103299;m -ANGELINI Marco;1841;1N;30;NO;130491;0;111518;m -ROTONDI Silverio;1706;2N;30;RM;310881;0;112210;m -PRIMICINO Corrado;1904;1N;30;NA;110767;0;110910;m -GARGIULO Mariano;1887;CM;0;NA;311262;820687;105636;m -RAKOTOSON Tefy;1557;3N;30;RM;030859;0;112365;m -MATANIA Lucio;1640;2N;30;MI;120561;0;111717;m -ORSI Matteo;1945;1N;0;PV;100180;819042;110849;m -COZZI Daniele;1627;2N;30;MI;140156;0;105655;m -DEL-VECCHIO Ausonio;1436;3N;30;LT;290134;0;109970;m -BACCHELLI Andrea;1643;2N;30;BO;071277;0;112190;m -CHIARLE Roberto;1659;2N;30;CN;100668;0;113212;m -LONGO Aldo;1738;1N;30;CN;110284;0;111982;m -LONGO Luigi;1897;1N;0;CN;270786;814156;111951;m -VENDRAMINI Ivano;1604;2N;30;CN;270268;0;113214;m -VILLALBA Fernando;1906;1N;0;MI;080168;819093;100158;m -VALSECCHI Alessio;2004;CM;0;BG;250492;818860;101704;m -MARCHESE Andrea;1712;2N;30;PA;151189;0;110042;m -MERLI Filiberto;1637;2N;30;RN;040190;0;109388;m -ORLANDO Salvatore;1685;2N;30;PA;050889;0;110040;m -PERICO' Alessandro;1736;2N;30;PA;280489;0;108321;m -SALEMI Pietro;1983;1N;0;PA;080489;820768;108378;m -SELLITTI Federico;2165;CM;0;SA;190190;821829;108580;m -DE-ANGELIS Massimo;1592;2N;30;RM;270145;0;110950;m -PICHLER Martin;1596;3N;30;BZ;290885;0;109566;m -VASSALLO Stefano E.;1443;3N;30;GE;160756;0;125742;m -TASSINARI Luca;1856;1N;30;UD;051184;0;100953;m -MURGIA Paolo;1601;2N;30;VR;040891;0;109329;m -SINI Leonardo;1550;3N;30;SS;240389;0;107791;m -FERNANDEZ Gianluca;1556;2N;30;PA;210578;0;100432;m -BRANCATI Emanuele;1730;2N;30;PA;300191;0;104905;m -CAPPONI Renato;1691;2N;30;PA;260287;0;108389;m -CILLO Pierambrogio;1685;2N;30;MI;311289;0;106924;m -BELLEMO Davide;2093;CM;0;VE;310890;823988;103305;m -FANTINI Lorenzo;2071;CM;0;BL;200586;818720;105060;m -RIGO Filippo;1598;2N;30;VR;011289;0;107702;m -LA-BELLA Massimilian;1721;2N;30;PA;291286;0;108372;m -FIORINI Vittorio;1817;1N;30;LT;270157;0;119420;m -FOSSATI Remigio;2203;CM;0;GE;220488;814326;109619;m -AKMEDOV Alisher;1503;3N;30;TS;081085;0;111075;m -VIDA Ivan;1691;2N;30;MI;201162;0;109969;m -GOZZINI Giambattista;1721;2N;30;BG;010960;0;110795;m -SELLITTI Luca;1796;2N;30;SA;160284;0;113608;m -FRONTINI Yuri-Diego;2055;CM;0;RM;230483;823538;113636;m -SCHGAGULER Gunther;1560;3N;30;BZ;260866;0;108783;m -DE-ZAIACOMO Tonino;1898;1N;0;BO;200946;817260;109863;m -FAGNANI Eduardo;1547;2N;30;BO;181189;0;105346;m -IANDOLO Marco;1820;1N;30;AV;040874;0;111268;m -SINI Giuseppe;1383;3N;30;SS;041157;0;111778;m -MORGANTE Daniele;1708;1N;30;RM;260153;0;117270;m -YAMSON Roberto;1955;1N;0;RM;070361;818054;116467;m -CASTALDI Antonio;1724;2N;30;SS;211054;0;120701;m -GUIDI Marco;1727;2N;30;FI;270467;0;101972;m -SIMONCELLO Claudio;1542;3N;30;VI;050843;0;109292;m -RONCEVIC Toma;1568;3N;30;PI;040178;0;111789;m -GIANNICCHI Alessandr;1568;2N;30;LI;010366;0;103948;m -BRACALI Andrea;2071;CM;0;PT;130782;816221;114778;m -TAMMEN Fred;1715;2N;30;EE;300736;0;1651;m -REFORGIATO Antonio;1640;2N;30;CT;020888;0;107389;m -GIUDICE Antonino;1673;2N;30;CT;180757;0;117102;m -LUPO Giancarlo;1599;3N;30;CT;170886;0;116764;m -TOMAT Brian-Roberto;1599;3N;30;BI;090691;0;110503;m -PEDETTI Roberto;1580;2N;30;VA;220761;0;107672;m -PEPA Syrja;1819;1N;0;VA;190659;827711;104590;m -SPANU Giacomo;1529;2N;30;CA;230478;0;107544;m -ATZEI Stefano;1682;2N;30;CA;270983;0;103120;m -GOLDINGER Josef;1795;1N;30;EE;0;0;1660;m -LORENZ Guy;1424;3N;30;EE;0;0;1661;m -STARESINA Mirko;1661;2N;30;EE;0;0;1662;m -CARRIERO Francesco;1748;2N;30;BR;061262;0;113669;m -GRECO Sara;1628;2N;30;TA;060791;0;105823;f -JATTA Francesco;1637;2N;30;BA;081242;0;107164;m -SANTILLO Alfredo;1496;3N;30;IS;131236;0;111254;m -CAMARDA Pierluigi;1616;2N;30;CB;260577;0;113635;m -GRANDESSO Emanuele;1926;1N;0;VE;280990;824550;106659;m -GAMBAROTTO Pietro;1587;3N;30;VE;240986;0;110700;m -BALLARIN Pietro;1676;2N;30;VE;131147;0;103052;m -FAVRO Danilo;1655;2N;30;TO;020871;0;110478;m -CORSINO Gianluca;2001;CM;0;PA;160489;816930;108386;m -PECORARO Alessandro;1700;2N;30;PA;100588;0;108367;m -PECORARO Dario;1667;2N;30;PA;100588;0;108368;m -GARAVINI Daniele;1617;2N;30;RM;210275;0;111686;m -STERBINI Vittorio;1579;2N;30;RM;260265;0;107690;m -PAZDERSKI Bartlomiej;1992;1N;0;NA;060978;816540;110196;m -FEZZA Davide;2055;CM;0;SA;220584;818747;110908;m -GALLINA Giacomo;1810;1N;0;NA;121170;822337;111842;m -MANFREDI Vincenzo;2153;CM;0;GE;270580;817945;110963;m -FAVARIN Dino;1570;3N;30;PD;071249;0;106796;m -CANAZZA Alessandro;2064;CM;0;PD;240178;826006;113663;m -NONES Giorgio;1817;1N;30;FI;130859;0;113041;m -POTENZA Gaetano;1664;2N;30;PC;220775;0;114785;m -CASTELLANA Marco;1542;3N;30;PC;091276;0;111270;m -PIERANTOZZI Stanisla;2053;CM;0;RG;281171;823180;114062;m -SIGNORELLI Marco;1617;2N;30;CT;100773;0;111541;m -ORNATI Gianmaria;1714;2N;30;PV;121275;0;113625;m -GJONI Tonin;1730;1N;30;EE;0;0;113844;m -CARIDI Nicolo';1964;1N;0;GE;121258;816256;113567;m -TAMBURRINI Andrea;1538;3N;30;RM;130255;0;100257;m -TOMAT Riccardo;1735;2N;30;BI;151292;0;110504;m -MERLOTTI Marco;1619;2N;30;MI;160671;0;113408;m -JARA Erik;2158;CM;0;EE;160682;814385;117517;m -PALMISANO Giuseppe;1951;1N;0;TO;171072;826979;114860;m -CAGLIO Luigi;1617;2N;30;SS;060792;0;107775;m -CASU Massimo;1560;3N;30;SS;170974;0;115765;m -CASU Marco;1499;3N;30;SS;050763;0;115764;m -MORTOLA Alberto;1915;1N;0;GE;160879;822434;105069;m -BOANTA Sandu;1996;1N;0;TV;061167;823074;115607;m -MELIA Lorenzo;1727;2N;30;TP;100677;0;110598;m -SCALA Massimo;1544;3N;30;SI;260567;0;107580;m -DAFFRA Marco;1455;3N;30;FI;240261;0;104981;m -RICCHIUTO Domenico;1607;2N;30;AQ;071041;0;103410;m -RECUBINI Dante;1472;3N;30;PE;150925;0;109805;m -FALCO Giuseppe;1837;1N;30;CT;021177;0;114069;m -CERAULO Carlo Albert;1535;2N;30;MI;270270;0;104011;m -IZZO Ivano;1700;2N;30;SA;201085;0;114422;m -LANDOLFI Luigi;1512;3N;30;SA;010159;0;108579;m -CONTALDI Camillo;1652;2N;30;SA;050459;0;110398;m -STRAMESI Massimo;1746;2N;0;AL;150271;819409;113846;m -SANTAGATI Matteo;1715;2N;30;PD;161077;0;113665;m -CIPOLOTTI Piersilvio;1787;2N;30;PD;080474;0;112126;m -HALILI Genti;1548;3N;30;PD;260879;0;115065;m -TERRANOVA Giuseppe;1412;2N;30;PA;180548;0;110036;m -MONNI Riccardo;1580;3N;30;CA;180788;0;103122;m -MUSA Valeria;1613;2N;30;CA;140788;0;103130;f -MINARDI Nadia;1343;3N;30;VR;100752;0;101542;f -ZOCCHI Lorenzo;1625;2N;30;TO;300787;0;113199;m -CAMPAGNA Francesco;1541;2N;30;PA;300557;0;109796;m -BOSCHI Giuseppe;1484;2N;30;PA;270960;0;108532;m -SALAFIA Andrea;1823;1N;30;PA;271088;0;113279;m -CAMPANELLA Giovanni;1994;1N;0;FI;200984;826073;114737;m -MAESTRO Ulisse;1658;2N;30;FI;150659;0;102102;m -BATTAGLIA Giuseppe;1560;3N;30;RG;271085;0;114874;m -MONTI Virginio;1673;2N;30;LU;031247;0;114880;m -ZUCCARELLO Gianni;1472;2N;30;PD;140959;0;103228;m -STECCANELLA Sergio;1718;2N;30;BO;060253;0;115090;m -CARTA Giovanni;1599;2N;30;CA;281175;0;110862;m -VISENTIN Ruggero;1571;2N;30;VE;170957;0;100833;m -BETTERA Roberto;2041;CM;0;VE;151258;816205;115766;m -FERRAGUTO Andrea;2037;CM;0;RM;261262;814750;114991;m -GAMBINO Erasmo;1251;3N;30;RM;251235;0;112204;m -VIALE Fabio;1661;2N;30;MI;021175;0;109844;m -PELIZZOLA Danilo;2047;CM;0;MI;140667;814407;113923;m -BUONAMANO Fabio;1697;2N;30;SV;110368;0;114567;m -VERONA Adriano;1580;3N;30;SS;080485;0;114754;m -LIGIOS Serena;1440;3N;30;SS;170489;0;107782;f -LIGIOS Sara;1443;3N;30;SS;170489;0;107781;f -SAMBIAGIO Michele;1515;3N;30;SS;121289;0;111777;m -DI-PAOLA Antonio;1652;2N;30;MI;270668;0;112416;m -PIETRALUNGA Vittorio;1625;2N;30;MI;260766;0;113955;m -ATTEO Domenico;1858;1N;0;SV;120461;816876;116017;m -SAVIANO Sabato;1574;2N;30;NA;040555;0;114084;m -GIANNETTA Paolo;2007;CM;0;MI;020659;818569;109752;m -MILELLA Giuseppe;1691;2N;30;BA;080558;0;117207;m -TASSO Giovanni;1481;2N;30;BR;270966;0;115411;m -MANNONI Luigi;1580;2N;30;MI;050270;0;114599;m -TONUS Alex;1696;2N;30;TV;050780;0;118398;m -ZILIO Lodovico;1574;2N;30;TV;300190;0;106458;m -GUALDI Paolo;1511;3N;30;BG;270767;0;110990;m -PENNATI Flavio;1550;3N;30;MI;061263;0;111724;m -LOCERTO Salvatore;1430;3N;30;CT;160141;0;112625;m -MARINELLI Tobia;1475;3N;30;NA;060259;0;110444;m -GALLINA Gaetano;1655;2N;30;NA;210857;0;112142;m -SARTORI Roberto;1571;2N;30;VR;030853;0;100969;m -GIGLIO Alessandro;1574;2N;30;TP;100276;0;110596;m -PETRAROLI Giulio;1856;1N;0;MI;220165;827177;113962;m -HUMEL Andrea;1616;2N;30;MI;201168;0;114194;m -ANDROJA Anastas;1694;2N;30;NO;250958;0;114770;m -RAGUSA Luigi;1787;2N;0;MI;260858;823368;110305;m -BADANO Fabio;1813;1N;0;SV;200670;822531;114565;m -ROSSI Aldo;1667;2N;30;BO;121268;0;111733;m -FRANZESE Anna Maria;1688;2N;30;BN;090570;0;111506;f -DE-BENEDETTI Arnaldo;1599;3N;30;RM;071163;0;116465;m -SARRO Emilio;1739;1N;30;AV;180865;0;108145;m -MATTIELLO Augusto;1691;2N;30;NA;280854;0;114082;m -CASSANO Vito;1706;2N;30;NA;160966;0;114837;m -HARITO Roberto;1890;1N;0;PI;301133;814571;114695;m -PAILLI Massimo;1994;CM;0;FI;070445;815934;114739;m -LENTI Cosimo;1460;3N;30;BO;280368;0;111025;m -PANCIONI Marco;1571;2N;30;FI;100867;0;111785;m -ROMANO Giuseppe;1583;2N;30;MI;240964;0;110309;m -RINOLFI Simone;1487;3N;30;TO;201177;0;110508;m -REGORDA Massimiliano;1882;1N;0;MI;250889;824119;100130;m -RUDONI Elia Ruben;1664;2N;30;MI;120487;0;114171;m -PALUMBO Massimo;1664;2N;30;GE;280159;0;115167;m -CAVATASSI Alessio;1853;1N;30;TE;190689;0;115469;m -PIZZOLEO Dario;1578;3N;30;TA;120687;0;116348;m -TAGLIONE Giuseppe;1442;3N;30;VA;260355;0;114913;m -TASSINI Marco;1742;2N;30;MI;310374;0;114111;m -GALESI Paolo;1582;3N;30;BA;201069;0;117174;m -CALDIERI Romolo;1670;2N;30;LT;250647;0;117087;m -CERCEO Massimo;1541;3N;30;AQ;290560;0;116468;m -BIANCO Antonio;1476;3N;30;TO;160663;0;115299;m -LOCCI Lucio;1515;3N;30;SS;090671;0;115468;m -GALLANA Marco;1775;1N;0;VE;251090;824542;106657;m -ROSTOLIS Riccardo;1906;CM;0;TV;101189;819948;111626;m -BORTOLAMI Simone;1520;3N;30;PD;180887;0;116328;m -RIONDINO Michele;1874;1N;30;RM;0;0;116726;m -ROMANO Ugo;1476;3N;30;RM;140259;0;117059;m -BEDIN Alberto;1751;2N;30;VI;230189;0;108088;m -CARAVELLO Vincenzo;1649;2N;30;PA;230388;0;108317;m -XIA Jie;2121;CM;0;TV;050289;818615;116156;m -MOSCA Giulia;1563;3N;30;VE;240988;0;103334;f -VARAGNOLO Silvia;1667;2N;30;VE;130788;0;103343;f -CORCELLA Francesco;1676;2N;30;BA;180991;0;109448;m -COVOLAN Stefano;1664;2N;30;TV;230291;0;116141;m -MAGRINI Fabrizio;2119;CM;0;MI;281190;822728;113966;m -DI-CERBO Giulia;1914;1N;0;VR;030390;825026;109141;f -HELLWEGER Hannes;1563;3N;30;BZ;100392;0;101958;m -BARKET M'Hamed;1882;1N;30;CO;000762;0;1802;m -BARLASSINA Antonio;1862;1N;30;MI;141257;0;104005;m -BARLETTA Antonio;2097;CM;0;RM;110158;811254;102648;m -BARLETTA Giuseppe;1640;2N;30;CE;230550;0;117574;m -BARLETTA Mauro;2244;-M;0;TO;140268;802085;111485;m -BARLOCCO Carlo;2183;FM;0;MI;240943;802450;100882;m -BARNI Paolo;2220;CM;0;PO;190464;806234;101393;m -BARONE Antonio;1733;2N;30;CZ;001242;0;107308;m -BARONE Giovanni;1664;2N;30;AG;000576;0;1810;m -BARONI Stefano;1700;2N;30;MO;000977;0;1811;m -BAROSSO Renzo;1930;CM;0;TO;130838;810002;111190;m -BARRA Antonio;1700;2N;30;SA;210172;0;1813;m -BARRACCO Vincenzo;1823;1N;30;TP;260377;0;107114;m -BARRALE Sergio;1700;2N;30;MI;000956;0;1815;m -BARRERA Pietro;1777;CM;30;PV;160754;0;100268;m -BARRESI Ettore;1811;1N;30;CT;070459;0;106623;m -BARRO Carlo;1886;CM;30;RM;000763;0;1818;m -BARSANTI Paolo;1644;2N;30;BA;000641;0;1819;m -BARTOLETTI Paolo;2097;CM;30;PC;000764;0;1820;m -BARTOLINI Tommaso;2171;-M;0;FI;230176;802999;103458;m -BARTOLOZZI Danilo;1742;1N;30;RO;230325;0;101187;m -BARTOLOZZI Roberto;2117;CM;0;FC;131065;809730;104657;m -BARUCCO Mattia;2064;CM;0;BS;260473;810401;109957;m -BARUFFALDI Ugo;1618;1N;30;FE;001013;0;1825;m -BARUSCOTTI Mauro;1882;1N;30;AL;001050;0;1826;m -BASCETTA Biagio;2026;CM;30;NA;000752;0;1827;m -BASCIU Simone;2164;-M;0;CA;081271;809349;103261;m -BASSET Sergio;1619;2N;30;TV;200250;0;110729;m -BASSETTI Graziano;1742;2N;30;TN;270853;0;103764;m -BASSO Lorenzo;1793;2N;30;NA;200669;0;123845;m -BASSOLI Paolo;2000;CM;30;TO;000654;0;1832;m -BASTA Giancarlo;2023;CM;30;PZ;220764;0;107991;m -BASTARELLI Giuseppe;2200;CM;0;AP;190758;819514;102120;m -BATINTI Alberto;1658;2N;30;PG;230378;0;1835;m -BATTAFARANO Giovanni;1802;1N;30;TA;060443;0;102132;m -BATTAGGIA Piergiorgi;2103;CM;0;TO;201137;805866;107502;m -BATTAGLIA Rodolfo;1900;1N;30;GE;000041;0;1838;m -BOTTAI Sandro;1900;1N;30;PU;000051;0;1839;m -BATTASI Antonio;1810;1N;30;OR;000152;0;1840;m -BATTISTELLA Stefano;2065;CM;0;MI;250660;805599;102425;m -BATTISTI Eugenio;2033;CM;30;TS;080642;0;115560;m -BATTISTINI Ercole;1900;1N;30;MI;190155;0;103029;m -BATTISTON Claudio;1900;1N;30;TV;001165;0;101856;m -BATTISTON Doris;2047;CM;0;PD;190260;816183;104046;m -BATTISTON Gianfranco;1652;2N;30;VE;311054;0;102356;m -BATTOCCHIO Domenico;1643;2N;30;PD;100253;0;104488;m -BAULI Moreno;1795;1N;30;MI;000858;0;1848;m -BAVAGNOLI Gabriele;1811;1N;30;VC;280570;0;104546;m -BAZZANELLA Giancarlo;1637;2N;30;BZ;091053;0;1850;m -BAZZANELLA Giorgio;1682;2N;30;TN;0;0;1851;m -BAZZONI Pietro;1888;1N;30;RM;000057;0;1852;m -BECCA Filippo;1921;1N;30;BO;100774;0;120271;m -BECKER Klaus;1900;1N;30;RM;000962;0;1854;m -BEDNARICH Jan;2204;-M;0;GO;030575;806730;102853;m -BEDOGNI Paolo;1709;2N;30;RE;000449;0;1856;m -BEDORIN Giovanni;1721;2N;30;PD;120545;0;104049;m -BEGGI Pierluigi;2151;-M;0;PI;010126;801127;106073;m -BEGNIS Severino;1802;1N;30;MI;091147;0;106916;m -BELLA Giancarlo;2025;CM;30;SP;000147;0;1860;m -BELLAFIORE Enzo;1661;2N;30;TO;001155;0;1861;m -BELLATALLA Emilio;2120;CM;30;GE;260963;0;100375;m -BELLAVIA Claudio;1685;2N;30;VT;001263;0;1863;m -BELLAVITA Guido;2131;CM;30;BG;000748;0;1864;m -BELLEMO Luca;2228;-M;0;VE;281261;802964;103345;m -BELLEMO Marco;2076;CM;30;VE;140662;0;103346;m -BELLI Michela;1733;2N;30;MS;191172;0;103635;f -BELLIA Fabrizio;2392;IM;0;RM;080663;800511;100884;m -BELLIDI Silvano;1822;1N;30;MN;060946;0;103578;m -BELLINCAMPI Stefano;2053;CM;0;RM;010766;804630;108895;m -BELLINI Elvio;1700;2N;30;TV;270251;0;107794;m -BELLINI Fabio;2499;IM;0;VA;171069;800252;106008;m -BELLIPANNI Piero;2166;CM;0;PA;230265;808440;104153;m -BELLISARIO Carlo;1664;2N;30;CS;030356;0;124902;m -BELLOMO Francesco;2336;FM;0;BA;140970;802476;103163;m -BELLOTTI Giuseppe;1706;2N;30;TO;000554;0;1876;m -BELLOTTO Stefano;1988;CM;0;CO;131066;817040;100724;m -BELLUCCO Gualtiero;1873;1N;30;RO;101140;0;103561;m -BELLUNAT Saverio;1628;2N;30;PD;000147;0;1879;m -BELOTTI Bruno;2433;IM;0;BG;081264;800040;101675;m -BELTRAME Amedeo;2000;CM;30;MI;000345;0;1881;m -BELTRAMI Francesco;1733;1N;30;MI;270146;0;110796;m -BELTRAMI Nerio;2055;CM;0;MN;010340;816191;101153;m -BELVISI Ivano;2003;CM;30;CA;120162;0;103262;m -BEMPORAD Filippo;2076;CM;0;MI;150653;807800;104600;m -BENACCHIO Massimo;1721;2N;30;VI;161254;0;104486;m -BENCI Livio;1900;1N;30;TS;020857;0;103786;m -BENCIVENGA Carmine;1945;1N;30;NA;000663;0;1888;m -BENEDETTI Fabrizio;2191;-M;0;RM;030859;800961;110454;m -BENEDETTO Giuseppe;1912;CM;30;BA;001063;0;109376;m -BENEDETTO Massimo;1936;1N;30;NA;180869;0;107080;m -BENETTI Francesco;2167;CM;0;BO;010673;808695;100306;m -BENETTI Lorenzo;1760;2N;30;BO;090576;0;100319;m -BENEVENTI Paolo;1445;2N;30;TO;221160;0;103004;m -BENSI Pietro;1900;CM;30;AL;000846;0;1895;m -BENSO Enrico;1904;CM;30;GE;000545;0;1896;m -BENTI Riccardo;1757;1N;30;MI;000757;0;1897;m -BENVENGA Salvatore;1817;1N;30;VA;230353;0;103962;m -MONACI Giulio;1599;3N;30;SI;250865;0;107581;m -DI-MARZO Nicola;1640;2N;30;NN;000834;0;1900;m -DI-MATTEO Enrico;1900;1N;30;NA;000040;0;1901;m -DI-MATTEO Francesco;1697;2N;30;MI;231267;0;109713;m -DI-MAURO Giuseppe;1828;1N;30;RM;000162;0;1903;m -DI-MAURO Guido;1568;2N;30;LT;001139;0;1904;m -DIMICCOLI Antonio;1847;1N;30;BA;040573;0;101617;m -DI-MICHELE Luciano;1921;1N;30;MI;110961;0;101644;m -DI-MUCCIO Lindoro;1981;1N;0;CE;180254;818712;103957;m -DI-MURO Antonio;2000;CM;30;TO;001255;0;1908;m -DI-PADOVA Pasquale;1703;2N;30;CB;251044;0;104683;m -DI-PANCRAZIO Luciano;1996;CM;30;TE;241159;0;109776;m -DI-PAOLA Domenico;1544;2N;30;BA;0;0;1911;m -DI-PAOLO Marco;2060;CM;0;BG;231259;806293;109783;m -DI-PAOLO Raffaele;2334;FM;0;GE;230666;803014;101023;m -DI-PATRE Livio;1792;1N;0;TE;230438;827681;103989;m -DI-PECO Diego;1891;1N;30;BZ;101162;0;1915;m -DI-PIERDOMENICO Gian;1915;1N;0;PE;081262;816949;117188;m -DI-QUATTRO Giuseppe;1667;2N;30;NA;000554;0;1917;m -DI-RITO Giuseppe;1708;CM;30;AV;180445;0;109811;m -DI-ROSA Patrizio;1730;2N;30;VC;240258;0;104557;m -DI-RUVO Luciano;2000;CM;30;MT;130759;0;112008;m -DI-SALVO Roberto;1975;1N;30;NN;0;0;111667;m -DI-SANZA Aldo;1805;1N;30;PO;020752;0;101400;m -DI-SEGNI Raffaele;2124;CM;30;RM;000152;0;1923;m -DI-TOLLA Francesco;1945;1N;30;BZ;001166;0;100654;m -TORRIANO Enzo;1640;2N;30;AL;120766;0;102567;m -DI-VINCENZO Giuseppe;1622;2N;30;NA;010774;0;101060;m -DI-VITA Giuseppe;1316;2N;30;PA;000662;0;114410;m -DIAMANTE Roberto;1754;2N;30;PT;030153;0;106017;m -DIANA Mauro;1679;2N;30;TO;150268;0;108012;m -DIANA Riccardo;2076;CM;0;TO;240742;811440;102184;m -DIBLASI Francesco;1735;2N;0;CT;261164;827924;115260;m -DIELI Alberto;1829;1N;30;BS;030171;0;106101;m -DIENA Giovanni;1896;CM;0;GE;291126;811246;100508;m -DIETRICH Stefano;1742;1N;30;RM;160962;0;121322;m -DILIC Roberto;2204;CM;0;TS;110557;811513;103190;m -DIMITRIJEVIC Dragan;1962;CM;0;MC;091165;822310;109660;m -DINO Giuseppe;2011;CM;30;TP;100773;0;107110;m -DISTRATIS Gianluca;1811;1N;30;CR;150173;0;101287;m -DODERO Mauro;1721;2N;30;BO;000663;0;1939;m -DOLFI Silvio;1700;2N;30;PT;140964;0;102895;m -DOMENICHELLI Dario;1799;2N;30;RM;000442;0;1941;m -DOMINONI Paolo;1978;CM;30;MI;000869;0;1942;m -DONADI Gabriele;1721;1N;30;VI;060943;0;110148;m -DONARELLI Giovanni;2044;CM;30;FR;000550;0;1944;m -DONATI Roberto;2142;CM;0;LI;170261;810371;120202;m -DONIA Massimiliano;2056;CM;30;RM;211064;0;1946;m -DORIA Andrea;1766;2N;30;IM;000864;0;1947;m -DORIGHET Claudio;2158;CM;0;MI;160481;806528;106917;m -DORIGO Tommaso;1900;1N;30;VE;050266;0;110698;m -DOTTA-ROSSO Pierluig;1900;1N;30;CN;000055;0;1950;m -DOTTI Dante;1652;2N;30;PC;240364;0;111187;m -DREI Andrea;2259;FM;0;RA;090257;800805;109421;m -DRUSIANI Daniele;1843;1N;30;BO;000961;0;1953;m -DUARTE Riccardo;2116;CM;0;PV;060956;803782;1954;m -DURANTE Gianni;1891;1N;30;TE;270762;0;1955;m -DUSI Valerio;1882;CM;30;BS;291158;0;102342;m -D'ADAMO Arturo;1658;2N;30;TA;190554;0;105809;m -D'ALESSANDRO Giorgio;1760;2N;30;RE;000565;0;1958;m -D'ALESSANDRO Rinaldo;1900;1N;30;CS;000142;0;1959;m -D'ALFONSO Lucio;1655;2N;30;MI;001072;0;124555;m -D'ALOIA Luigi;1700;2N;30;TO;000963;0;1961;m -D'AMATO Nazario;1742;2N;30;AP;290160;0;101382;m -D'AMBROSIO Alessandr;1757;2N;30;RM;000575;0;1963;m -D'AMBROSIO Luca;1859;1N;30;BZ;121067;0;108938;m -D'AMICO Antonino;1925;1N;30;TO;051073;0;105391;m -D'AMICO Giuseppe;1709;2N;30;ME;000153;0;108144;m -D'AMICO Salvatore;1921;1N;0;RM;120538;821381;105419;m -D'AMORE Carlo;2470;IM;0;RM;300164;800066;109848;m -D'AMORE Emanuele;2159;-M;0;NA;220454;804860;117294;m -D'ANDREA Cosimo;1631;2N;30;SA;001251;0;1970;m -D'ANDRIA Rosalba;1643;2N;30;CE;161244;0;100397;f -D'ANGELO Angelo;2260;-M;0;PE;270160;801690;109803;m -D'ANTUONO Nicola;1742;2N;30;VR;001247;0;1973;m -D'APA Stefano;2140;-M;0;MI;020358;800864;112417;m -D'ARPINO Roberto;2033;CM;30;RM;000757;0;1975;m -D'ASCIA Luciano;1807;1N;30;LU;000528;0;1976;m -FINI Ottavio;1388;3N;30;RM;220954;0;100505;m -D'EREDITA' Giuliano;2015;CM;0;PA;220162;822000;1978;m -D'EUSTACCHIO Maurizi;1816;1N;30;RM;000660;0;1979;m -GIOVANI Bonifacio;1580;3N;30;PE;290754;0;102587;m -D'INTINO Vitale;1643;2N;30;RM;000620;0;1981;m -D'IPPOLITO Federico;2200;-M;20;NA;001137;0;1982;m -D'ORTA Antonio;1991;1N;30;NA;160270;0;119433;m -BRIGANTI Andrea;1900;1N;30;PR;240668;0;108377;m -ELMI Livio;1900;1N;30;BO;001018;0;1985;m -EMANUELE Gaetano;1682;2N;30;TO;060152;0;100789;m -EMANUELLI Renato;2255;CM;0;GE;190753;803871;112227;m -EREMITA Ciro;1772;2N;30;NA;001250;0;1988;m -ERRICO Mauro;1739;2N;30;PG;310759;0;105835;m -ERSCHBAMER Maurizio;1766;2N;30;BZ;170655;0;105558;m -ESPOSITO Alfredo;1613;2N;30;RM;260756;0;108910;m -ESPOSITO Pino;1756;1N;30;NA;040253;0;106624;m -ESPOSITO Luca;2214;-M;0;NA;071169;805726;101865;m -ESPOSITO Marco;1858;1N;30;NA;010763;0;100357;m -ESPOSITO Vittorio;1619;2N;30;NA;000437;0;1995;m -EUSEBI Luciano;1967;CM;30;PU;000955;0;1996;m -EVANGELISTI Claudio;2244;-M;0;PI;310351;800813;103589;m -EVERET Alexandro;2266;FM;0;CR;231177;803995;104226;m -EYNARD Valdo;1986;CM;0;BG;010631;807770;106386;m -FABBRI Mario;2190;-M;0;TO;240349;801330;102276;m -FABBRI Stefano;1900;1N;30;RM;221148;0;111220;m -FABBRICINI Dante;1493;2N;30;GE;120658;0;112810;m -FABBRONI Nicola;1898;1N;30;BA;110562;0;107180;m -FABIANO Giuseppe;2249;FM;0;CT;040664;800732;104897;m -FABRI Luca;2120;CM;30;TR;000861;0;2005;m -FABRIS Alberto;2216;-M;0;VE;030463;801348;106578;m -FACCHETTI Gianni;2133;-M;0;MI;121046;804150;104602;m -FACCHINI Mario;1918;1N;30;BO;000453;0;2008;m -FACCIA Sergio;2035;CM;0;VR;300759;807982;101362;m -FACCINI Vaifro;1700;2N;30;VI;001211;0;2010;m -FADALI Mustafa;2027;CM;30;PV;221065;0;100278;m -FAGGIANI Marco;1888;1N;0;GE;301158;822647;101025;m -FAGONE Stellario;2057;CM;30;TO;000870;0;2013;m -FAGOTTO Roberto;1921;CM;0;SR;201257;817791;103680;m -FAIT Alessandro;1808;1N;30;TN;311043;0;100862;m -FALBO Sandro;2179;-M;0;RM;250764;810444;105399;m -FALCHETTA Giovanni;2202;-M;0;MO;;801135;103206;m -FALCOMATA' Gesualdo;1951;1N;30;RC;180466;0;100910;m -FALVO Leonardo;2024;CM;30;SI;000139;0;2019;m -FANELLI Leonardo;1700;2N;30;PU;001063;0;2021;m -FANELLO Domenico;1643;2N;30;MI;020452;0;2022;m -FANFARILLO Maurizio;1540;2N;30;FR;000757;0;2023;m -FANTAZZINI Massimili;1811;1N;30;RM;000768;0;2024;m -FANTONI Aristotile;1610;2N;30;MI;150772;0;109746;m -FANTOZZI Federico;1745;2N;30;RM;060172;0;104284;m -FARACHI Francesco;2105;CM;0;MO;020374;803960;106249;m -FARACHI Umberto;1995;CM;30;BR;020135;0;106243;m -FARACI Antonino;2060;CM;0;IM;010141;804410;105082;m -FARAGLIA Mario;1625;2N;30;NA;000853;0;2030;m -FARAGONE Gionata;1736;2N;30;CT;130684;0;105231;m -FARAGONE Giuseppe;1619;2N;30;CT;090553;0;105234;m -FARAONI Enrico;2115;CM;0;TO;080167;803391;101992;m -FARIDONE Francesco;1685;2N;30;SP;011018;0;103657;m -FARINA Dario;1900;1N;30;BG;000954;0;2035;m -FARINA Fabio;1853;1N;30;BO;221269;0;105342;m -FARINA Saverio;2177;-M;0;RM;110656;803901;105394;m -FARNESI Marco;1891;1N;30;FI;000555;0;2038;m -FASANO Vincenzo;1876;1N;30;NA;030239;0;2039;m -FASOLI Stefano;1943;1N;30;MI;000662;0;2040;m -FASSIO Luca;2039;CM;0;TO;220776;806510;105743;m -FASULO Marco;1664;2N;30;RM;100962;0;102654;m -FATTORI Giuseppe;1664;2N;30;BO;000353;0;2043;m -FAUGNO Renzo;2102;CM;30;BO;000257;0;2044;m -FAUSTER Gunter;1700;2N;30;BZ;000266;0;2045;m -FAVALE Paolo;2091;CM;30;RM;001258;0;2046;m -FAZZUOLI Moreno;1802;1N;30;GE;180555;0;105153;m -FEDELI Franco;1900;1N;30;CL;000055;0;2048;m -FEDERICI Maurizio;1709;2N;30;MS;150259;0;103636;m -FEDI Paolo;2045;CM;30;FI;000469;0;2050;m -FEIERABEND Thomas;1688;2N;30;BZ;310560;0;2051;m -FELICI Ettore;1691;2N;30;RM;000560;0;2052;m -FEMIANO Andrea;2111;CM;0;NA;160366;807427;101872;m -FENILI Alessandro;1667;2N;30;MI;0;0;2054;m -FERA Calogero;1703;2N;30;AG;000560;0;2055;m -FERIOLI Franco;1927;1N;30;GE;200162;0;101349;m -FERMO Ruggero;1801;1N;30;UD;180938;0;103730;m -FERNANDEZ Markus;1700;2N;30;MI;0;0;2058;m -CAFAGNA Daniele;1703;2N;30;MI;140772;0;2059;m -FERRARA Amedeo;1712;2N;30;MI;130253;0;100082;m -FERRARI Lorenzo;1652;2N;30;VC;140344;0;102038;m -FERRARI Luigi;1751;2N;30;BS;000775;0;2062;m -FERRARI Mario;1678;1N;30;RO;230957;0;103563;m -FERRARINI Angelo;1900;1N;30;BO;001192;0;2064;m -FERRARINI Maurizio;1674;1N;30;PR;030264;0;105887;m -FERRARINI Stefano;1769;2N;30;MS;030465;0;103667;m -FERRARIO Raffaele;2071;CM;30;FC;000171;0;2067;m -FERRARIS Andrea;1831;1N;30;VC;080463;0;111770;m -FERRARO Francesco;2032;CM;0;NA;090659;807214;109598;m -FERRARONI Giuseppe;1697;2N;30;RE;140646;0;105133;m -FERREIRA Maurizio;1655;2N;30;GE;271054;0;101045;m -FERRERO Flavio;2039;CM;30;TO;001158;0;2072;m -FERRERO Umberto;1909;1N;30;TO;180570;0;104823;m -FERRETTI Carlo;1895;CM;0;TO;211071;827975;103252;m -FERRETTI Fabrizio;1700;2N;30;BG;000374;0;2075;m -FERRETTI Folco;2254;FM;0;RM;280170;802328;106220;m -FERRETTI Rino;1855;1N;30;SI;000829;0;2077;m -FERRETTO Luca;1664;2N;30;PD;010674;0;2078;m -FERRI Emiliano;2029;CM;0;FG;170775;811882;109960;m -FERRI Francesco;1610;2N;30;FI;000160;0;112221;m -FERRI Massimiliano;2150;CM;0;RN;240674;810789;105850;m -FERRI Michele;1670;2N;30;FG;030650;0;2082;m -FERRI Roberto;2100;CM;30;RM;000426;0;2083;m -FERRI Stefano;2001;CM;30;FC;000963;0;2084;m -FERRIGNO Giuseppe;1963;CM;0;RM;100855;808962;116464;m -FERRUA Pietro;1576;1N;30;TO;000346;0;2086;m -FERUCCI Ferruccio;1712;2N;30;FC;000338;0;2087;m -FESTA Giovanni;1981;1N;0;NA;180164;818739;2088;m -FICARA Gianfranco;2003;CM;30;BO;000251;0;2089;m -FICCO Corrado;2165;-M;0;NA;110849;802883;104613;m -FICO Massimiliano;2280;-M;0;TR;151163;802115;104731;m -FICO Tommaso;1718;2N;30;NA;090453;0;101063;m -FIESCHI Lorenzo;2042;CM;30;PR;041166;0;108176;m -FIGURELLI Stefano;1649;2N;30;SV;040972;0;2094;m -FILIGHEDDU Mauro;1583;1N;30;SS;281054;0;107662;m -FILIPPELLI Giovanni;1900;1N;30;RM;000849;0;2096;m -MELAS Ignazio;1575;3N;30;CA;201248;0;103858;m -FILIPPI Mario;1700;2N;30;RM;000156;0;2098;m -FINOCCHIARO Lorenzo;2017;CM;0;GE;051252;819697;101076;m -FIORE Andrea;1816;1N;30;PN;0;0;2100;m -FIORE Marco;1679;2N;30;GE;000373;0;2101;m -FIORE Mario;2238;FM;0;PZ;230658;800392;113379;m -FIORE Valerio;1718;2N;30;BA;300761;0;107166;m -FIORENTINO Vincenzo;1640;2N;30;BA;001274;0;111351;m -FIORI Mauro;1838;1N;30;MI;200969;0;100689;m -FIORINI Alessandro;2084;CM;30;AR;000845;0;2106;m -FISAULI Francesco;1832;1N;30;MI;080332;0;104007;m -FISCATO Claudio;1831;1N;30;VI;170358;0;102851;m -FLEMING Nigel;1910;1N;30;RM;000661;0;2109;m -FLORIO Armando;1669;1N;30;RM;010147;0;125435;m -FOA' Leonardo;1900;1N;30;MI;000910;0;2111;m -FOCO Andrea;1900;1N;30;VE;001067;0;2112;m -FODDAI Aldo;1748;2N;30;CA;080164;0;107536;m -FOGLIA Maurizio;2117;CM;0;MC;180663;806838;101585;m -FOGLIATI Alessandro;1808;1N;30;AT;000873;0;2115;m -FOLINO Antonio;1712;2N;30;CZ;000566;0;2116;m -FOLLI Aldo;1622;2N;30;MI;000945;0;2117;m -PULIATTI Donatello;1622;2N;30;ME;150880;0;107214;m -FOMEZ Antonio;1900;1N;30;MI;000237;0;2119;m -FONGAROLLI Diego;2068;CM;0;BZ;240971;809861;109991;m -FONTANA Angelo;1939;CM;30;VR;250164;0;101934;m -FONTANA Enrico;2122;CM;0;TV;090275;808571;103839;m -FONTANA Luigi;1874;1N;30;MI;000260;0;2123;m -FONTANELLA Alain;1666;2N;30;VE;051155;0;106482;m -FONTANESI Riccardo;1900;1N;30;BS;000256;0;2125;m -FONTANI Daniele;1681;1N;30;FI;000761;0;120410;m -FORATO Sergio Paolo;1748;2N;30;TV;291250;0;103379;m -FORESE Cesare;1658;2N;30;MI;000743;0;2128;m -FORMICA Eros;2000;CM;30;FI;001231;0;2129;m -FORNACIARI Marco;2043;CM;30;RE;270658;0;112548;m -FORNARI Giuseppe;2235;-M;0;TV;270556;800996;107814;m -FORNASINI Roberto;1694;2N;30;VE;240860;0;120785;m -FORNO Roberto;1995;CM;0;AT;011070;811378;105296;m -FORONI Francesco;1836;1N;30;MN;011159;0;101231;m -FORTUNATO Giacinto;1682;2N;30;BA;000252;0;2135;m -FOSSATI Ezio;1715;2N;30;MI;260251;0;100083;m -FOSSATI Mauro;1718;2N;30;GE;270148;0;2137;m -FRACAS Aldo;1520;2N;30;MI;111040;0;103008;m -FRACASSO Giovanni;1754;2N;30;CB;011275;0;104669;m -FRACCARO Marino;1900;1N;30;TV;000660;0;2140;m -FRADEGRADA Daniele;2000;CM;30;MI;001073;0;2141;m -FRAGAPANE Maurizio;1984;CM;30;AG;010663;0;105612;m -FRAGOMENI Alberto;1900;1N;30;MI;001149;0;2143;m -FRANCESCHI Riccardo;2185;CM;0;LI;251052;812218;103944;m -FRANCHI Diego;1715;1N;30;FI;000963;0;2145;m -FRANCHI Jose' Maria;1895;CM;30;RM;240972;0;108896;m -FRANCHINI Gabriele;2292;FM;0;MO;281078;806790;101924;m -FRANCI Stefano;1697;2N;30;FI;000963;0;2148;m -FRANCIA Giulio;1631;2N;30;NN;000773;0;2149;m -FRANCIONE Gennaro;1670;2N;30;RM;000450;0;2150;m -FRANZA Attilio;1541;2N;30;RM;001037;0;2151;m -FRANZA Marco;2104;CM;30;MI;251159;0;102426;m -FRANZINI Stefano;1700;2N;30;SO;001263;0;120124;m -FRANZOLIN Marco;1802;1N;30;TO;230962;0;120302;m -FRANZONI Renato;1700;2N;30;RE;271149;0;105103;m -FRASCOLLA Gianfranco;1819;1N;30;TO;010139;0;104820;m -FRASSATI Giovanni;1813;CM;30;TO;171154;0;106065;m -FRASSON Giovanni;2019;CM;30;VE;000252;0;2158;m -FRATTONI Renzo;1870;1N;30;PV;0;0;2159;m -FREGONESE Giorgio;1700;2N;30;VR;000858;0;2160;m -FREZZA Carlo;1900;1N;30;TV;000060;0;2161;m -FREZZA Paolo;2015;CM;30;RM;000261;0;2162;m -FRIGIERI Fabrizio;2098;CM;0;MO;080573;811068;101927;m -FRIGERIO Marco;2071;CM;30;MI;000857;0;2164;m -FRILLI Fabio;2086;CM;0;FI;300458;810010;102896;m -FRISELLE Mirko;1800;1N;30;VE;040860;0;100095;m -FRIZZI Luca;1799;1N;30;PI;220765;0;118730;m -FRONTERA Giuseppe;1901;1N;30;CZ;111056;0;111979;m -FRONZI Ettore;2015;CM;0;PU;150660;822329;105865;m -FRUGONI Giulio;1571;2N;30;BS;041237;0;106930;m -FUCITO Giovanni;1915;1N;0;SA;101058;827959;110194;m -FUGGETTA Leonardo;2061;CM;0;TO;120256;805424;100007;m -FULCERI Natalino;1894;1N;30;LU;151156;0;108849;m -FULVI Bruno;1724;2N;30;RM;040156;0;119336;m -FULVI Fulvio;2061;CM;0;PG;020350;803049;103877;m -FUMAGALLI Domenico;1718;2N;30;SO;001226;0;2176;m -FURLAN Mario;2015;CM;30;VE;040963;0;101471;m -FURLAN Michele;1697;2N;30;PD;000568;0;2178;m -FUSARI Paolo;2009;CM;0;PT;290743;810231;102898;m -FRANCESIO Daniele;1582;3N;30;VC;270462;0;104703;m -GABASSI Francesco;1821;1N;0;UD;121252;825077;103732;m -GABELLI Giuseppe;1760;2N;30;PR;150351;0;105141;m -GABETTO Flaviano;2121;CM;0;MI;021069;804509;106918;m -GAETA Michele;2080;CM;30;ME;090157;0;103821;m -GAGGERO Flavio;2000;CM;30;GE;000264;0;2185;m -GAGGIOTTINI Manfredo;2078;CM;0;AR;210258;804720;105828;m -GAGLIARDI Giuseppe;1900;1N;30;TO;000059;0;100293;m -GAGLIARDI Pietro;2182;-M;0;LT;290656;800821;108473;m -GAIBA Paolo;2171;CM;0;BO;180962;806544;102085;m -GAIDO Paolo;2121;-M;0;BO;280659;803855;101588;m -BENVENUTI Carlo;2174;CM;0;PI;250659;803120;114142;m -BERGAMINI Graziano;1804;1N;30;VE;000859;0;2192;m -BERGO Luca;1880;1N;30;PD;220967;0;104041;m -CURTI Aldo;1700;2N;30;PC;0;0;2194;m -ROSSINI Walter;1514;2N;30;MI;260252;0;104606;m -BERLUSCONI Marco;2014;CM;30;CO;140259;0;100732;m -BERNA Roberto;2111;CM;30;PA;000260;0;2197;m -BERNAGO Federico;1990;CM;0;MI;251264;810061;108162;m -BERNARDELLI Albino;1640;2N;30;TO;110639;0;108756;m -BERNARDI Giancarlo;1676;2N;30;RM;301255;0;110350;m -BERNARDI Ruben;2119;CM;0;BZ;230666;804428;2201;m -BERNARDINELLO Fabio;1604;2N;30;RO;111162;0;115821;m -BERNI Mauro;2078;CM;0;GE;050455;808326;104461;m -BERRA Davide;2206;-M;0;PV;270367;807575;100272;m -DEBIASI Sergio;1700;2N;30;BZ;240862;0;107138;m -BERTACCO Alessandro;1700;2N;30;VI;160778;0;2206;m -BERTACCO Piero;1835;CM;30;VI;100850;0;104481;m -BERTANI Gianfranco;2132;CM;0;VR;270160;806480;100928;m -EFIMOV Igor;2439;GM;0;PT;160960;806404;106005;m -BERTAZZO Giorgio;2156;CM;0;MI;120360;1306170;108163;m -BERTI Diego;1835;1N;30;AN;281071;0;117650;m -BERTINO Paolo;2108;CM;0;CN;070470;809799;111969;m -BERTOLI Daniele;1897;1N;30;SP;001160;0;2213;m -BERTOLINI Ettore;1732;1N;30;PG;020855;0;105833;m -BERTOLINO Giuseppe;1439;2N;30;MI;250515;0;101750;m -BERTON Luciano;1873;1N;30;RM;000629;0;2216;m -BERTONI Massimiliano;2102;CM;0;RM;010165;809578;104354;m -BERTULETTI Ottavio;2068;CM;30;BG;000153;0;2218;m -BETTALLI Claudio;1900;1N;30;SI;171149;0;107593;m -BETTALLI Marco;2074;CM;0;SI;080554;809071;107566;m -BETTI Francesco;1604;2N;30;NU;201261;0;116099;m -BETTIN Stefano;1700;2N;30;GO;270860;0;111072;m -BETTINI Luca;1700;2N;30;SO;000763;0;2223;m -BETTIO Umberto;1861;1N;30;TV;160457;0;107810;m -BEVEGNI Carlo;1679;2N;30;GE;270876;0;2225;m -BEVILACQUA Maurizio;2152;CM;0;TN;290571;803332;100671;m -BEVILACQUA Roberto;2158;CM;30;CO;280462;0;102968;m -BEZZI Andrea;1994;CM;30;RA;000059;0;2228;m -BEZZI Massimo;2084;CM;30;RA;081262;0;105840;m -BIAGETTI Valerio;1666;1N;30;PG;040952;0;109721;m -BIAGIOLI Valerio;1643;2N;30;VE;200351;0;118681;m -BIANCA Maurizio;1861;CM;30;SR;091058;0;109912;m -BIANCACCI Mario;1677;2N;30;NU;210759;0;116096;m -BIANCALANA Narciso;1951;CM;30;LU;001249;0;2234;m -BIANCARELLI Bruno;1900;1N;30;PG;000057;0;2235;m -BIANCHETTI Raul;1918;1N;30;TO;130766;0;2236;m -BIANCHI Alberto;2017;CM;0;MI;260756;810649;102539;m -BIANCHI Angelo;1658;2N;30;MI;000167;0;2238;m -BIANCHI Fernando;1882;1N;30;PR;000063;0;2239;m -BIANCHI Filippo;1882;1N;30;MI;001061;0;2240;m -BIANCHI Maurizio;1832;1N;30;MI;030458;0;100572;m -BIANCHI Silvio;1823;1N;30;PT;000165;0;2242;m -BIANCHI Simone;1748;2N;30;MI;290867;0;110207;m -BIANCHIN Roberto;1822;1N;30;SV;040167;0;104388;m -BIANCO Valerio;2210;-M;0;TO;011056;800600;102283;m -BIANCOTTI Alessandro;1678;1N;30;TO;201273;0;128398;m -BIASIZZO Maurizio;1949;CM;30;UD;170865;0;105896;m -FREDDI Franco;1550;2N;30;MN;011259;0;101165;m -BIGA Michelangelo;2000;CM;30;CN;001246;0;2249;m -BIGNOTTI Luigi;1705;1N;30;VI;000362;0;110677;m -BILARDI Stefano;2000;CM;30;VE;000564;0;2251;m -BILLIO Atto;2177;-M;20;BZ;140258;0;101527;m -BINCOLETTO Andrea;1634;2N;30;VE;000269;0;2253;m -BINI Lorenzo;2039;CM;0;FI;180739;805807;107979;m -BINI Massimo;2098;CM;0;CR;110460;827991;104223;m -BIONDI Gualtiero;2141;CM;30;IM;110960;0;2256;m -BIONDI Maurizio;1643;2N;30;RM;001254;0;2257;m -BISIGNANO Giuseppe;1927;CM;0;MI;290549;812358;101746;m -BISON Beniamino;2175;CM;0;BG;301055;812854;101657;m -BISSANTI Carlo;2144;CM;0;BA;190857;805130;2260;m -BISSATINI Mario;1736;2N;30;TS;191155;0;117704;m -BITTI Corrado;1900;1N;30;CA;001224;0;2262;m -BLASCO Domenico;1992;-M;0;CZ;230842;803545;103164;m -BLASI Fabio;2023;CM;30;AP;000756;0;2264;m -BLASI Ferdinando;2099;CM;30;IM;001044;0;115311;m -BLENGINO Cristiano;1763;2N;30;GE;000770;0;2266;m -BLENGINO Storace;1700;2N;30;NN;;0;2267;m -BLEVE Ugo;1906;1N;30;LE;010451;0;105368;m -BOCCALATTE Piero;1999;CM;30;TO;261049;0;104822;m -BOCCHETTI Gaetano;1999;CM;30;NA;000951;0;2270;m -BOCCHICCHIO Gaetano;2164;CM;0;PO;310559;804371;101394;m -BOCCHICCHIO Marino;1927;1N;30;PO;080957;0;101397;m -BOCCHINI Massimilian;1661;2N;30;BN;300977;0;100443;m -BOCCIA Mattia Mario;1580;2N;30;FR;010245;0;104211;m -BOER Stefan;1903;1N;30;MI;270161;0;104967;m -BOERI Carmelo;1700;2N;30;OR;000569;0;2276;m -BOESSO Paolo;1685;2N;30;VE;160762;0;109651;m -BOETTO Massimo;2000;CM;0;TO;101268;827665;106367;m -BOFFELLI Alberto;1700;2N;30;MI;;0;2279;m -BOGA Diego;1900;1N;30;BO;000066;0;2280;m -BOLDINI David;1987;CM;30;EE;150562;0;101562;m -BOLLA Giancarlo;1801;1N;30;VI;210341;0;102848;m -BOLMIDA Carlo;1676;2N;30;TO;060628;0;105181;m -BOLOGNA Luigi;1694;2N;30;BN;000227;0;2284;m -BOLOGNESI Alberto;1900;1N;30;FE;000459;0;2285;m -BOLOGNESI Danilo;1829;1N;0;PV;130557;824453;107757;m -BOLSI Massimo;2113;CM;30;PR;000256;0;2287;m -BONA Massimo;2002;CM;30;NO;110461;0;100482;m -BONACCORSI Fabrizio;2187;CM;0;CT;240162;801569;107358;m -BONAITA Alberto;2014;CM;30;MI;000648;0;2291;m -BONANATE Armando;1699;1N;30;TO;171144;0;102816;m -BONAMINI Federico;2041;CM;30;SP;001159;0;2293;m -BONANNO Alessandro;2142;CM;0;MI;011068;805297;100573;m -BONANZINGA Corrado;2136;CM;0;ME;010762;806862;100841;m -BONATI Giulio;2285;CM;0;GE;091159;800562;2296;m -BONATO Fabrizio;1682;2N;30;VI;;0;2297;m -BONATO Mariano;2054;CM;30;TV;010154;0;111608;m -BONATTI Fabrizio;1712;2N;30;TE;000969;0;2299;m -BONAVOGLIA Guido;2011;CM;30;RM;000354;0;2300;m -BONAVOGLIA Marco;2030;CM;30;GE;000553;0;2301;m -BONAZZI Edoardo;2151;CM;0;MI;160564;809241;100688;m -BONDIELLI Giorgio;1989;CM;0;MS;010236;808865;106048;m -BONETTA Salvatore;1784;2N;30;MO;090152;0;122048;m -BONETTI Marco;2047;CM;0;CO;281263;806595;104782;m -BONETTO Giorgio;1694;2N;30;PD;280135;0;106780;m -BONFA' Ileano;2285;-M;0;BO;000851;800570;2307;m -BONFIERI Amanzio;1655;2N;30;BO;010148;0;116220;m -VALENTINI Cesare;1885;1N;0;GE;270957;819417;113964;m -BONFORTE Marcello;1942;1N;30;BG;000762;0;2310;m -BONGHI Alessandro;1939;1N;30;PG;070566;0;108037;m -BONGIORNI Gabriele;1772;2N;30;PC;040157;0;125350;m -BONGIORNO Andrea;1646;2N;30;LE;000266;0;2313;m -BONGIORNO Massimo;1577;2N;30;LE;090261;0;105369;m -BONGIOVANNI Marco;1999;CM;0;RM;201156;816213;118327;m -BONIVENTO Alvise;1706;2N;30;VE;120977;0;103066;m -BONIVENTO Oscar;1900;1N;30;BO;271114;0;2317;m -BONJEAN Ercole;1867;1N;30;IM;191251;0;105077;m -BONO Leonardo;1823;1N;30;RM;270971;0;100946;m -BONOLDI Fabio;1849;1N;30;FE;210862;0;108025;m -BONOLLO Sergio;1847;1N;30;VI;200950;0;104485;m -BONOMI Maurizio;2215;-M;0;IM;030963;805696;105078;m -BONOMO Giuseppe;1900;1N;30;VI;150946;0;104489;m -BONOTTO Giorgio;1918;1N;30;VI;280249;0;104483;m -BONTEMPI Stefano;1897;1N;30;RM;000860;0;2325;m -BONU' Maurizio;1847;1N;30;BS;000138;0;2326;m -BONUCCI Riccardo;1846;1N;30;PG;240254;0;103880;m -BONUGLI Carlo;2064;CM;0;PR;311056;804290;108169;m -BORDANDINI Aldo;1700;2N;30;RA;0;0;2329;m -BORDIGNON G. Battist;1700;2N;30;BA;0;0;2330;m -BORGATO Ercole;1831;1N;30;MI;000920;0;2331;m -BORGATO Massimo;2155;CM;30;PD;000359;0;2332;m -LOVISETTO Giampaolo;1582;3N;30;PD;101172;0;108204;m -BORGIANI Flavio;2169;CM;0;MC;180860;809233;109741;m -BORGNI Cristiano;1826;1N;30;MI;100468;0;115816;m -BORGO Giulio;2414;IM;0;PN;130567;800180;104477;m -BORGO Luigi;1900;1N;30;PN;270662;0;114224;m -BORGOGNONI Francesco;1900;1N;30;FI;000750;0;2338;m -BORINO Paolo;2001;CM;0;BN;300860;810088;107157;m -BORNACCIONI Daniele;1900;1N;30;PU;010863;0;101842;m -BORRACCIA Pietro;1900;1N;30;MT;000051;0;2341;m -BORRONI Mario;1700;2N;30;NO;000156;0;2342;m -BORSARI Marco;1787;1N;30;MO;130873;0;101926;m -BOSCA Walter;1732;2N;30;AT;080959;0;106825;m -BOSCARINO Antonio;1718;2N;30;AG;040971;0;105608;m -BOSCHETTI Marco;2028;CM;30;TO;000459;0;2346;m -BOSCHETTI Mario;2000;CM;30;RM;140927;0;104506;m -BOSCO Claudio;1700;2N;30;PV;140650;0;100273;m -BOSCO Saverio;1637;2N;30;TO;000656;0;2349;m -BOSCOLO Fabio;1979;1N;30;VE;170974;0;103349;m -BOSCOLO Giampaolo;1718;2N;30;VE;300954;0;111850;m -BOSCOLO Max;1994;CM;30;VE;301273;0;103351;m -BOSELLO Cesare;1706;2N;30;RM;000258;0;2353;m -BOSI Franco;1694;2N;30;MI;160956;0;101012;m -BOSIO Devis;2066;CM;0;BG;140174;808466;101659;m -BOSIO Giovanni;1643;2N;30;BG;050770;0;127616;m -BOSSI Alessandro;2057;CM;0;MI;240756;807788;109362;m -BOSSONI Mario;1970;CM;0;BS;311064;815241;102347;m -BOTTA Giancarlo;2100;CM;0;CO;020145;805289;2359;m -BOTTAI Marco;1703;2N;30;PT;000555;0;2360;m -BOTTANELLI Mauro;2128;CM;30;MI;000763;0;2361;m -BOTTAZZI Filippo;1697;2N;30;VE;000972;0;2362;m -BOTTER Rino;2046;CM;30;VE;001059;0;2363;m -BOTTINI Paolo;1908;CM;0;SR;041257;814725;103676;m -BOTTIROLI Davide;1934;CM;30;AL;001264;0;2365;m -BOVE Enzo;2000;CM;30;CO;071153;0;104783;m -BOVERI Giuseppe;1649;2N;30;SV;001263;0;2367;m -BOVIO-SANTO Graziell;1619;2N;30;VC;001235;0;102045;f -BOVONE Stefano;1937;1N;30;RM;040971;0;100944;m -BOZZA Gabriele;1943;1N;30;VE;180158;0;105875;m -BOZZALI Ermanno;2076;CM;0;MI;301068;805858;102503;m -BOZZI Gianni;2190;CM;0;MI;181256;802433;102421;m -SCALIA Roberto;1584;3N;30;MC;020358;0;102116;m -BOZZO Rodolfo;2150;CM;30;GE;180647;0;101041;m -BRACA Agostino;2083;CM;30;SA;280659;0;102685;m -BRACAGLIA Carlo;2161;CM;0;PD;060659;804355;106778;m -BRACALE Giuseppe;1718;2N;30;NA;000666;0;2377;m -HACON Jonathan;1580;3N;30;MI;060172;0;100701;m -BRAGHETTA Sergio;2304;FM;0;BS;300171;806188;101913;m -BRANCACCIO Matteo;1607;2N;30;NA;001174;0;2380;m -BRANCALEONI Maurizio;2275;FM;0;RN;060674;803022;105841;m -BRANDA Ralf;2037;CM;30;RM;001064;0;2382;m -BRANDOLA Davide;1912;1N;30;TO;000865;0;2383;m -BRAUNBERGER Federico;2126;-M;0;MI;160954;804606;103038;m -BREGANT Tullio;1640;2N;30;GO;210226;0;102855;m -BRENNA Roberto;1700;2N;30;MI;000670;0;2386;m -BRESCIANI Brunetto;1700;2N;30;SP;030732;0;115367;m -BRESCIANI Nicola;2290;FM;0;BG;301160;802573;106387;m -BRESSAN Lucio;1712;2N;30;PD;040853;0;114418;m -BRESSANELLI Roberto;2121;CM;0;CR;221168;806226;101277;m -BRESSANUTTI Furio;1900;1N;30;TS;001050;0;2391;m -BRESSI Giorgio;2057;CM;30;MI;000760;0;2392;m -BRICHENFRIED Manfred;1574;2N;30;BZ;050351;0;2393;m -CANZI Gian Mario;1655;2N;30;TO;290771;0;2394;m -BRIFFAULT Philippe;1820;1N;30;EE;120057;0;104738;m -BRIGNOLI Alessandro;1930;1N;30;BG;000462;0;2396;m -BRIGNONE Roberto;2130;CM;0;CN;120767;810169;109405;m -BRINGIOTTI Massimili;1900;1N;30;GE;000066;0;2398;m -BROCCHINI Mario;1900;1N;30;MC;000058;0;2399;m -BROCCOLI Giulio Dona;1697;2N;30;CE;160263;0;100391;m -BROCERO Luigi;1637;2N;30;SV;051259;0;109420;m -BRONZETTI Massimo;1900;1N;30;PG;000050;0;2402;m -BRONZO Vito;1873;1N;30;TA;070856;0;106378;m -BROSSIDO Davide;1763;2N;30;SV;130462;0;107642;m -BROVELLI Claudio;2180;CM;0;VA;050760;4659384;104705;m -BROWN Bobby;1856;1N;30;VI;000758;0;2406;m -BROZZETTI Massimo;1810;1N;30;PG;000750;0;2407;m -TERBONATI Paolo;1854;1N;0;PR;200468;816655;111068;m -BRUGNOLI Flavio;2038;CM;30;TO;150160;0;102195;m -BRUGNOLI Luciano;2221;-M;0;VR;250556;808229;104914;m -BRUGNOLI Paolo;1732;1N;30;VI;000753;0;2411;m -BRUGO Marco;2071;CM;0;NO;020679;806609;104876;m -BRUNELLO Marco;1712;2N;30;AO;000269;0;2413;m -BRUNETTI Alessandro;2005;CM;30;CO;160267;0;113837;m -BRUNETTI Bruno;1649;2N;30;TO;000858;0;2415;m -BRUNETTI Elvira;1480;2N;30;NA;071147;0;123965;f -BRUNETTI Gianni;2000;CM;30;NA;000857;0;2417;m -BRUNETTI Luciano;1715;2N;30;CE;001245;0;2418;m -BRUNI Emiliano;1679;2N;30;TE;000940;0;2419;m -BRUNO Alessandro;1700;2N;30;CS;001173;0;2420;m -BRUNO Elio;1646;2N;30;CS;010147;0;103170;m -BRUNO Enzo;1900;1N;30;RM;000049;0;2422;m -BRUNO Fabio;2388;IM;0;MC;151260;801038;111110;m -BRUNO Francesco;1886;1N;30;PA;130658;0;104168;m -BRUNO Franco;1849;1N;30;EN;011066;0;109633;m -BRUNO Giuseppe;1721;2N;30;AP;000753;0;2426;m -BRUNO Luigi;1571;2N;30;PA;080230;0;111218;m -BRUNO Massimo;2200;CM;0;AV;220360;806943;2428;m -BRUSSINO Luciano;1682;2N;30;TO;0;0;2429;m -BALDI Michele;1649;2N;30;PR;200876;0;108170;m -BRUZZONE Carlo;1774;1N;30;SV;300840;0;105206;m -BUCCOLIERO Alessandr;2197;CM;0;LC;061175;816884;107039;m -BUFFA Antonino;1640;2N;30;GE;190944;0;101088;m -BUFFONI Luca;1886;1N;30;RM;211175;0;105407;m -BUFFONI Luca;1700;2N;30;LC;000962;0;2435;m -BUGLIONE-CERESA Fran;1867;1N;30;TO;0;0;2436;m -BUIZZA Claudio;2113;CM;0;BG;120966;811629;101660;m -BULLA Carmelo;1927;CM;30;VA;131054;0;109184;m -BUONACUCINA Massimo;1855;1N;30;RM;030849;0;114750;m -BUONANNO Massimo;1855;1N;30;FR;001061;0;104210;m -BUONOCORE Elio;2160;-M;0;CO;041256;817058;103518;m -BUONOCORE Riccardo;1930;1N;30;RM;000453;0;2442;m -BURANI Eugenio;2034;CM;0;MI;190759;812102;100116;m -BURATTI Marco;2018;CM;0;RM;000859;824003;2444;m -BURELLI Adriano;2000;CM;30;RM;000750;0;2445;m -BURLANDO Alessandro;2115;CM;30;TO;090366;0;2446;m -BURZACCHINI Andrea;1619;2N;30;MO;000368;0;2447;m -BUSATO Moreno;2100;CM;30;VE;000758;0;2448;m -BUSO Giuseppe;1451;2N;30;TV;250528;0;107796;m -BUSSA Paolo;1795;1N;30;TO;001269;0;106374;m -BUSSACCHETTI Vinicio;1900;1N;30;TO;000014;0;2451;m -BUSSI Franco;2153;-M;20;MO;051242;0;114381;m -BUSSOLI Sauro;1802;1N;30;AN;280750;0;102112;m -BUZZI Dario;2162;CM;30;MI;000765;0;2454;m -CACCIOFERA Renato;1574;2N;30;NN;0;0;2455;m -CACCIOTTI Angelo;1664;2N;30;RM;000757;0;2456;m -CACCO Christian;2309;FM;0;VE;250981;807338;107198;m -BIGGIERO Fulvio;1527;3N;30;RM;141038;0;2458;m -CADDEO Pierluigi;1637;2N;30;CA;191152;0;103105;m -CAFIERO Giuseppe;1700;2N;30;SA;140669;0;2460;m -CAGLIARI Francesco;1709;2N;30;MO;000973;0;2461;m -CAIRO Aldo;1667;2N;30;AL;000352;0;2462;m -CAIROLI Camillo;1925;CM;30;CO;080255;0;102971;m -CAIZZONE Vito;2062;CM;30;ME;160963;0;103818;m -CAJOLI Giancarlo;2054;CM;30;RM;000940;0;2465;m -CALABRESE Antonino;1766;1N;30;SV;090163;0;105207;m -CALABRESE Claudio;1942;1N;30;FR;220662;0;104207;m -CALABRO' Marco;2068;CM;0;NA;140764;807281;109140;m -CALANDRA Fabrizio;1724;2N;30;BO;000466;0;2469;m -CALANDRA Simone;1904;1N;30;PA;000867;0;102210;m -CALANDRI Fausto;2123;CM;0;PG;140561;805181;105829;m -CALAVALLE Giulio;2200;-M;0;BO;040876;806382;105466;m -CALCAGNO Stefano;1861;1N;30;MI;020265;0;100574;m -CALDARONI Paolo;1700;2N;30;LT;001176;0;2474;m -CALDERONE Luigi;1688;2N;30;TO;120768;0;117571;m -CALDI Mario;1999;CM;30;VC;011148;0;104550;m -CALELLA Sergio;1966;CM;30;BR;000164;0;106228;m -CALIARI Adriano;1655;2N;30;TN;240578;0;102732;m -CALIO' Carlo;1511;2N;30;CZ;0;0;2479;m -CALLONE Carlo;1769;2N;30;TN;041153;0;100662;m -CALONI Ugo;2155;CM;0;MI;151065;805505;104021;m -CALVENZANI Oscar;2046;CM;30;VA;001251;0;2482;m -CALVINI Enrico;1688;2N;30;NN;0;0;2483;m -CALZOLARI Giampietro;1890;CM;0;MI;130558;816906;114108;m -CAMBI Renzo;1871;-M;20;FI;;0;106853;m -CAMBIAGGIO Gianluca;1936;1N;30;CA;200772;0;112066;m -CAMERINI Ivan;2198;CM;0;RE;210450;810657;105110;m -CAMERLO Riccardo;1906;1N;30;TO;000468;0;2488;m -CAMILLERI Dante;1626;2N;30;CT;170166;0;109138;m -GIOVANARDI Michele;1739;2N;30;PR;050980;0;108171;m -CAMPAGNA Daniele;1795;1N;30;MI;000958;0;2491;m -CAMPAGNARO Luca;1700;2N;30;VE;000563;0;2492;m -CAMPAI Paolo;1706;2N;30;FI;041057;0;113576;m -CAMPANILE Antonio;2110;-M;0;BA;260658;801909;106231;m -CAMPANILE Roberto;2198;-M;0;BA;240570;807141;106232;m -CAMPINI Marco;2100;CM;0;FE;021158;805580;102225;m -CAMPIOLI Giuseppe;2090;CM;30;MN;260932;0;103365;m -CAMPIOLI Marco;2000;CM;30;MO;100654;0;100192;m -CAMPISANO Vincenzo;1900;1N;30;CT;000043;0;2499;m -CAMPO Renato;2038;CM;0;TP;130362;811726;100215;m -GANCI Paolo;1703;2N;30;PA;;0;2501;m -MOHOVIC Paolo;1580;3N;30;BZ;180131;0;2502;m -CANALE Antonio;1976;CM;30;GE;000846;0;2503;m -CANALI Marco;1847;1N;30;CO;061060;0;104980;m -CANATO Carlo;1900;1N;30;TV;000055;0;2505;m -CANDURA Stefano;2022;CM;0;PV;250261;809217;102219;m -CANE Luisito;1846;1N;30;CO;121120;0;104785;m -CANEL Paolo;1763;2N;30;TV;210360;0;107797;m -CANELLI Daniele;2066;CM;0;TO;130884;805416;105861;m -CANGIOTTI Claudio;2197;CM;0;GE;070147;801313;121274;m -CANNAS Gabriele;1640;2N;30;NU;000574;0;2511;m -CANNATARO Luciano;1876;1N;30;CS;000559;0;2512;m -CANNONE Marco;1831;1N;30;PT;280557;0;102892;m -CANONICO Francesco;1789;1N;30;ME;010151;0;103819;m -CANTIELLO Giuseppe;1721;2N;30;NA;000966;0;2515;m -CANTORE Alberto;2134;CM;0;AT;151055;807230;105290;m -CAPATA Ion;2110;CM;0;BS;070473;812560;101563;m -CAPECE Adolivio;2041;-M;0;MI;170147;807664;101737;m -CAPELLI Giorgio;2094;CM;30;MN;000160;0;2519;m -CAPEZZA Marco;2103;CM;0;AQ;170573;811130;112514;m -CAPEZZALI Roberto;1727;2N;30;AQ;190672;0;107465;m -CAPITELLI Paolo;2148;CM;0;BA;050169;809330;107169;m -CAPOBIANCO Massimo;1697;2N;30;BO;;0;101158;m -CAPONE Antonio;1999;1N;0;EN;030174;818518;2524;m -CAPONE Gioacchino;1904;1N;30;RM;210775;0;121032;m -CAPONE Vincenzo;2107;CM;0;NA;170382;810207;103909;m -CAPONI Saverio;1900;1N;30;FI;190869;0;110062;m -CAPORALI Gabriele;1993;1N;30;FI;000751;0;2528;m -CAPORALI Romano;1951;1N;30;CR;120733;0;106113;m -CAPOSCIUTTI Maurizio;2333;FM;0;GR;140666;800490;106049;m -CAPOZZOLI Silvio;1906;1N;30;NA;121248;0;111665;m -CAPPADONA Salvatore;2100;CM;0;ME;020860;812846;108147;m -CAPPELLANI Carlo;1694;2N;30;SR;001060;0;2533;m -CAPPELLANI Vincenzo;2133;-M;20;PA;000847;0;2534;m -CAPPELLARI Mario;1856;1N;30;MS;010147;0;106050;m -NUZZO Daniele;1645;2N;30;RM;0;0;116829;m -CAPPELLO Renato;2410;FM;0;BO;071153;800082;2537;m -CAPRARO Fabio;1873;1N;30;BL;180558;0;105024;m -CAPRETTI Giovanni;1936;1N;30;RM;000065;0;2539;m -CAPRIO Gerardo;1861;1N;30;NN;001116;0;2540;m -CAPRIOGLIO Tiziano;1876;CM;30;AL;130956;0;101224;m -CAPUANO Eugenio;2255;-M;0;CB;280976;804452;103905;m -CAPUANO Ruggiero;2170;CM;0;BA;070842;800716;106991;m -CAPUOZZO Giovanni;1900;1N;30;CE;000063;0;2544;m -CAPURRO Giuliano;2142;CM;0;SP;230649;807257;105481;m -CAPUTI Nicola;2002;CM;0;BA;130759;805122;109401;m -CAPUTO Vincenzo;1655;2N;30;TN;110446;0;100860;m -CARACCI Giuseppe;2069;CM;0;CL;121251;809322;101142;m -CARAMASCHI Gianni;1918;1N;30;MN;010241;0;101159;m -CARANZANO Roberto;2027;CM;30;AT;260264;0;112583;m -CARBONE Lucio;1706;2N;30;SR;000340;0;111516;m -CARBONE Raimondo;1900;1N;30;NA;000852;0;2552;m -CARCANGIU Vittorio;2139;CM;0;CA;231170;813621;110548;m -CARDELLI Gabriele;2018;CM;0;TE;201269;808334;109774;m -CARDELLINI Fabio;1751;2N;30;RM;001267;0;2555;m -CARDIA Mario;1700;2N;30;CA;0;0;2556;m -CARDILI Mariano;2088;CM;0;VE;200461;816000;120463;m -CARDINALI Egidio;1874;1N;30;TR;010958;0;101885;m -CARDINALI Marco;2020;-M;0;RM;050660;802948;2559;m -CARE' Bruno;1768;2N;30;RC;0;0;2560;m -CAREGARO Maurizio;1619;2N;30;VR;230254;0;124394;m -CARELLA Lorenzo;1636;2N;30;VA;080348;0;104542;m -CARERI Cesare;1664;2N;30;TN;210139;0;114820;m -CARERI Massimo;1631;2N;30;NN;0;0;2564;m -CARESANA Alessandro;1981;CM;30;TO;030465;0;100784;m -CARESSA Marco;1894;1N;30;RM;160656;0;101799;m -CARIANI Gianfranco;1637;2N;30;FI;000456;0;2567;m -CARINI Giovanni;2081;CM;30;PA;000361;0;104180;m -CARINI Massimo;2149;CM;0;PD;030572;817767;104028;m -CARLI Carlo;2135;CM;0;VR;200258;808105;102849;m -CARMENI Giovanni;1712;2N;30;CT;000765;0;2571;m -CARMINATI Luigi;2098;CM;30;BG;000646;0;2572;m -CARMINUCCI Carlo;1697;2N;30;AP;000162;0;2573;m -CARNIO Fortunato;1612;1N;30;LI;220844;0;106854;m -CARNUCCIO Raffaele;1730;2N;30;TO;030175;0;2575;m -CAROLI Tommaso;1913;1N;30;FC;161179;0;104654;m -CAROPRESO Mario;1948;1N;30;NA;000164;0;2577;m -CAROTENUTO Ennio;2013;CM;30;RM;001169;0;2578;m -CARPANI Bruno;1828;1N;30;BO;001259;0;2579;m -CARPARELLI Luciano;2085;CM;0;MI;081072;807923;103540;m -CARPINELLI Tommaso;2041;CM;30;BA;001162;0;2581;m -CARRA Salvatore;1900;1N;30;FI;0;0;2582;m -CARRAI Giacomo;1816;1N;30;CR;000847;0;104425;m -CARRARA Diego;2058;CM;0;BG;041262;825778;101662;m -CARRARA Piergiorgio;1775;2N;30;VC;000755;0;2585;m -CARRASCO C. Jose;2058;CM;30;VR;0;0;2586;m -CARRIERO Gianbattist;1760;1N;30;PZ;280750;0;113582;m -CARROZZINI Dario;1631;2N;30;LE;000158;0;2588;m -CARTA Francesco;1637;2N;30;OR;250846;0;107611;m -CARTA Paolo;1960;CM;30;OR;000870;0;2590;m -CARTEGNI Emanuele;1649;2N;30;MI;000772;0;2591;m -CARTEI Luigi;2000;CM;30;FI;001052;0;2592;m -CARTIA Giorgio;1757;2N;30;SR;001160;0;105734;m -CARUNCHIO Egidio;1837;1N;30;VC;210747;0;104398;m -CARUSO Augusto;2267;-M;0;VI;180663;801763;101206;m -CARUSO Daniele;2097;CM;0;MI;160654;804614;102502;m -CARUSO Domenico;1852;1N;30;BN;000056;0;2597;m -CARZOLIO Luigi;1974;CM;0;SV;150268;813346;102604;m -LAPICCIRELLA Daniele;2146;CM;0;MI;170786;810185;100123;m -CASABURI Claudio;1643;2N;30;SA;310749;0;100622;m -CASACCI Bruno;1832;1N;30;TO;000328;0;2601;m -CASACCIA Lino;1598;2N;30;VC;000350;0;2602;m -CASADEI Mauro;2169;CM;0;RN;310367;804002;109858;m -CASADIO Ernesto;1870;1N;30;RA;000846;0;2604;m -CASAGRANDE Fabio;2040;CM;0;TN;051259;806765;102731;m -CASALGRANDI Enrico;1900;1N;30;MO;000057;0;2606;m -CASALI Angelo;2036;CM;30;MI;001153;0;2607;m -CASAMENTO Enzo;2000;CM;30;BS;000562;0;2608;m -CASANOVA Armando;1992;CM;30;BI;200949;0;107622;m -CASELLA Fulvio;1930;1N;30;RE;060555;0;101229;m -CASELLI Luigi;2266;FM;0;MI;091258;801976;101741;m -CASENTINI Gianni;1661;2N;30;RM;231042;0;124027;m -CASIERI Arturo;1900;1N;30;NA;000859;0;2613;m -CASINELLI Luigi;1800;1N;30;FR;000744;0;2614;m -CASSAI Mario;1853;1N;30;FI;030848;0;105331;m -CASSAI Paolo;2245;-M;0;GR;191260;800791;115500;m -CASSANO Felice;1944;1N;30;BA;260157;0;106675;m -CASSETTARI Lucio;1676;2N;30;FI;010146;0;109687;m -CASSI Damiano;1882;1N;30;BG;000066;0;2619;m -CASSI Marco;1900;1N;30;MI;001259;0;2620;m -ZERBO Bruno;1667;2N;30;CT;240181;0;102475;m -CASTAGNA Tiziano;1900;1N;30;TO;000059;0;2622;m -CASTAGNETTA Gianluca;2305;FM;0;VE;150667;800449;109104;m -CASTAGNETTI Stefano;1900;1N;30;MI;001161;0;2624;m -CASTALDO Folco;2336;FM;0;TO;141181;806560;100787;m -CASTALDO Franco;2000;CM;30;TN;000857;0;2626;m -CASTELFRANCHI Carlo;2061;-M;0;RM;171160;803219;108148;m -CASTELLANO Alfonso;1944;CM;0;TV;240856;815616;107798;m -CASTELLANO Lorenzo;1886;1N;0;RM;190263;818178;120230;m -CASTELLARI Andrea;1900;1N;30;VE;001269;0;2630;m -CASTELLARI Luca;2106;CM;30;BO;000770;0;2631;m -CASTELLI Abele;1607;2N;30;MI;200357;0;100549;m -CASTELLI Giovanni;1595;2N;30;CT;160739;0;102389;m -CASTELLI Stefano;2005;CM;30;RM;211258;0;102364;m -CASTELLUZZO Salvator;2100;CM;0;GR;100138;807524;105312;m -CASTIGLIA Zelio;1619;2N;30;PA;010143;0;112277;m -CASTIGLIONE Giovanni;1669;2N;30;NA;300978;0;2637;m -CASTIGLIONE Umberto;2199;CM;0;NA;260278;808024;101054;m -CASTIGLIONI Giancarl;2023;CM;30;MI;000645;0;2639;m -CASTINO Piermauro;1787;1N;30;TO;000863;0;2640;m -CASTOLDI Bruno;1804;1N;30;MI;000331;0;2641;m -CASTROGIOVANNI Carlo;2088;CM;0;NA;180847;804444;102780;m -CASULA Stefano;2006;CM;30;RM;180666;0;111679;m -CATACCHINI Maurizio;1897;1N;30;RM;000458;0;2644;m -CATALANO Massimo;1805;1N;30;TO;000861;0;2645;m -CATALFAMO Santo;1831;1N;30;TO;0;0;2646;m -CATALUCCI Renzo;1733;2N;30;AP;001063;0;2647;m -CATANIA Dario;1802;1N;30;PA;301261;0;100426;m -CATELLI Domenico;1472;2N;30;RE;041243;0;105114;m -CATENA Marco;1823;1N;30;RM;090580;0;2650;m -CATRACCHIA Mauro;2004;CM;30;FR;000651;0;2651;m -CATTAFI Giuseppe;2038;CM;0;ME;310170;812781;105747;m -CATTANEO Mario;1502;2N;30;MI;190820;0;102531;m -CATTANI Marco;1816;1N;30;LU;000666;0;2654;m -CATTARINICH Benedett;1916;1N;30;BN;190460;0;2655;m -CATTURANI Emilio;1828;1N;30;BL;000956;0;2656;m -CATUCCI Claudio;2126;CM;30;RM;000360;0;2657;m -CAUDULLO Orazio;1655;2N;30;SR;000742;0;2658;m -CAUTIERO Pietro;1900;1N;30;CR;000057;0;2659;m -MANTOVANI Mario;1604;2N;30;PR;161255;0;108087;m -CAVAGNARO Federico;2000;CM;30;SV;001158;0;2661;m -CAVALIERI Riccardo;1694;2N;30;MO;230475;0;2662;m -CAVALLARO Manlio;1685;2N;30;RM;000846;0;2663;m -CAVALLARO Sandro;1900;1N;30;TN;000666;0;2664;m -CAVALLERI Giuseppe;1676;2N;30;VR;250434;0;101939;m -CAVALLERO Eugenio;1897;1N;30;TO;051164;0;106366;m -CAVALLERO Piero;1688;2N;30;TO;000260;0;2667;m -CAVALLINI Gianfranco;2004;CM;0;MI;240673;807559;104771;m -CAVATORTA Fosco;2010;CM;0;GE;041244;809195;104462;m -CAVATORTA Ivan;1887;1N;0;GE;030766;814814;112575;m -CAVRINI Andrea;2016;CM;30;BO;000757;0;2672;m -CAZZANIGA Walter;2134;-M;0;MI;260959;803162;100712;m -CATENA Marco ;1889;1N;0;MI;160266;826391;124191;m -CAZZOLA Franco;1652;2N;30;NO;000658;0;2675;m -CAZZOLA Paolo;1619;2N;30;VI;000658;0;2676;m -CECARO Dario;2096;-M;20;NA;050830;0;111666;m -CECCARINI Marco;2140;CM;0;LI;251165;819603;117906;m -CECCATELLI Claudio;1835;1N;30;LU;030266;0;106052;m -CECCHELLI Enrico;2035;CM;0;IM;131056;811610;105079;m -CECCHETTO Vanni;2006;CM;0;VE;150962;810355;103353;m -CECCHI Marcello;1900;1N;30;PO;000745;0;101398;m -CECCHINATO Cristian;1652;2N;30;PD;000275;0;2683;m -CECCHINI Massimo;1649;2N;30;PV;000766;0;120574;m -TREVISI Duilio;1637;2N;30;BZ;160654;0;2685;m -CECCONI Giovanni Alb;2176;FM;0;FI;010960;800724;102893;m -CEDRONE Oscar;1685;2N;30;FR;;0;107453;m -CELAURO Giuseppe;1580;2N;30;AG;000161;0;2688;m -CELESTINI Mauro;1622;2N;30;PG;211066;0;105832;m -CELLUCCI Alessandro;1979;CM;30;RM;211269;0;100943;m -CELOTTO Carlo;2006;CM;0;TV;290446;823465;106433;m -CERASI Umberto;2078;CM;0;TR;200463;823244;101886;m -CERAVOLO Alberto;1643;2N;30;RC;050635;0;107712;m -CERCHIARI Fulvio;2162;-M;20;GO;000356;0;2694;m -CEREDA Mauro;1718;2N;30;MI;310163;0;100575;m -CERESOLI Luigi;2202;-M;0;BG;250462;807893;110087;m -CERIA Corrado;2080;CM;30;VC;000849;0;2697;m -CERIOLI Giuseppe;1874;1N;30;BO;270835;0;101576;m -CERLINI Enzo;1727;2N;30;RE;000352;0;2699;m -CERRATO Roberto;1819;1N;30;NA;160660;807354;104610;m -CERTO Piero;1802;1N;30;TA;000755;0;2701;m -CERULLI Andrea;2180;CM;30;PD;311245;0;104040;m -CERUTI Stefano;1900;1N;30;MI;001259;0;2703;m -CERUTTI Alessandro;2080;CM;30;TO;100760;0;104729;m -CERVELLATI Filippo;2015;CM;30;BO;001259;0;2705;m -CERVI Edoardo;1706;2N;30;BS;000373;0;2706;m -CESARINI Antonello;1819;1N;30;GE;051160;0;101344;m -CESARINI Lanfranco;2082;CM;0;RM;170858;809420;104507;m -CESARO Giuseppe;1700;2N;30;CE;001057;0;2709;m -CESCHI Federico;2109;CM;30;VR;000661;0;2710;m -CESCHIA Ivano;2286;FM;0;UD;050958;800260;103724;m -CETRO Carlo;2025;CM;0;NA;080963;807818;102073;m -CHEN Andrea;2024;CM;30;BO;010472;0;102086;m -CHIACCHIARARELLI Ant;1840;1N;30;RM;000264;0;2714;m -CHIACCHIARARELLI Bru;1946;1N;30;RM;000664;0;2715;m -CHIARETTI Roberto;2198;-M;0;RM;230871;805149;110378;m -CHIAUDANO Andrea;2315;FM;0;TO;171262;803847;2717;m -CHIESA Giuseppe;2041;CM;0;GE;080655;809977;100506;m -CHILESE Carlo;2059;CM;30;MI;270363;0;102422;m -CHIODI Giovanni;2000;CM;30;MI;000961;0;2720;m -CHIODI Mariano;1891;1N;30;MI;001052;0;114948;m -CHIODO Cataldo;1550;2N;30;CL;240158;0;101140;m -CHIOGNA Carlo;1985;1N;30;RM;000522;0;2723;m -CHIONSINI Ivano;1694;2N;30;NA;211178;0;2724;m -CHIOSSI Marco;1811;1N;30;RE;210352;0;105108;m -CHIUSANO Raimondo;2124;CM;30;NA;000865;0;2726;m -CETERA Nicola;1726;2N;30;TA;020671;0;105802;m -CIABERTA Mauro;1921;1N;30;TO;040776;0;2728;m -CIALDEA Alberto;1988;CM;30;RM;000460;0;2729;m -CIAMPI Vincenzo;2103;-M;0;RM;190855;802220;100235;m -CIANCARINI Paolo;2077;CM;30;RM;000159;0;106075;m -CIANI Daniele;2000;CM;30;BL;180362;0;105018;m -CIANI Luigi;1700;2N;30;PG;0;0;2733;m -CIANI Marco;2021;CM;30;BL;000362;0;2734;m -CIANI Roberto;1703;2N;30;FI;000159;0;2735;m -CIARAMELLA Nicola;1895;1N;30;LI;000555;0;103945;m -CIBELLI Mario;1604;2N;30;NA;000156;0;2737;m -CICCARELLI Fausto;1900;1N;30;BO;000055;0;2738;m -CICCARELLI Marco;1733;2N;30;IM;170167;0;105080;m -CICCHELLA Giulio;1915;1N;30;NA;200563;0;102712;m -CICCIO Mauro;1970;CM;30;PG;000767;0;2741;m -CICIONI Luigi;1718;2N;30;PG;080659;0;105837;m -CIECH Elio;1625;2N;30;TN;260336;0;100863;m -CIGLIOLA Roberto;1709;2N;30;GE;170465;0;2744;m -CILIA Gianfranco;1821;1N;30;CL;191055;0;101139;m -CILIBERTI Alberto;1604;2N;30;RM;0;0;2746;m -CILLI Claudio;2010;CM;30;LT;000557;0;2747;m -CILLO Luigi;1676;2N;30;MI;261181;0;107697;m -CIMINO Guido;2000;CM;30;NA;190441;0;102781;m -CIMMINO Pietro;2098;CM;30;BO;001152;0;2750;m -CINCOTTO Daniele;1805;1N;30;VE;000763;0;2751;m -FIACCOLA Corrado;1688;2N;30;PV;201058;0;104870;m -CINELLI Maurizio;1865;1N;0;PT;211257;827363;106004;m -CIOFI Roberto;1727;2N;30;FI;080859;0;107976;m -CIOLA Alberto;1858;1N;30;TN;201257;0;103765;m -CIONI Piero;1900;1N;30;FI;0;0;2756;m -CIOTOLI Patrizio;2153;CM;0;RM;280569;809020;117826;m -CIPOLLINI Antonio;1786;1N;30;LT;300755;0;103746;m -CIRABISI Federico;2116;-M;0;GE;060851;802166;101319;m -CIRRINCIONE Giansalv;1778;2N;30;TO;000459;0;2760;m -CITTI Gianluca;2125;CM;0;LU;220672;808415;103466;m -CIUFFOLETTI Paolo;2189;-M;0;AO;300660;807630;102915;m -CIURO Aldo;1999;1N;30;PA;011053;0;114413;m -CIVIDALI Emilio;2127;CM;30;MI;000365;0;2764;m -CIVITAREALE Antonio;1861;1N;30;BO;261162;0;110869;m -CIVITILLO Luigi;1837;1N;30;CE;220967;0;100439;m -CLARIZIA Michele;1670;2N;30;BN;060950;0;111505;m -CLEMENTE Antonio;1793;2N;30;TA;090176;0;2768;m -CLEMENTE Giuseppe;1787;CM;30;MT;010336;0;107927;m -CLEMENTI Renato;1826;1N;30;MI;080246;0;104968;m -COCCHI Andrea;2333;FM;0;BO;270658;800970;106175;m -COCCHI Floriano;1900;1N;30;VA;000055;0;2773;m -COCO Sergio;2051;CM;30;PI;001040;0;2774;m -COCOZZA Mario;2359;FM;0;NA;120957;800236;102776;m -CODAZZA Giorgio;1906;1N;30;PD;150757;0;103229;m -COGIOLA Maurizio;1900;1N;30;MI;000065;0;2777;m -COGORNO Luciano;1622;2N;30;GE;210530;0;2778;m -COHA Angelo;1733;2N;30;TO;000558;0;2779;m -COLABRESE Cary;1775;2N;30;PG;211148;0;105834;m -COLANTONIO Marco;1706;2N;30;RM;070356;0;105420;m -COLIBRI Fabio;1730;2N;30;RM;000266;0;2782;m -COLICA Daniele;1772;2N;30;MI;000644;0;130597;m -COLLA Davide;1745;2N;30;TN;000209;0;2784;m -COLLARETA Giovanni;2098;-M;0;SV;300155;804711;105202;m -COLLETTI Vincenzo;1625;2N;30;RM;000122;0;2786;m -COLLOBIANO Alberto;2002;CM;30;VB;140566;0;100480;m -COLLUTIIS Duilio;2404;IM;0;SA;280276;805475;107993;m -COLOMBO Alberto;2099;-M;0;VA;090652;805041;102972;m -COLOMBO Eraldo;1849;1N;30;VA;000755;0;2790;m -COLOMBO Eugenio;1613;2N;30;MI;290847;0;100866;m -COLOMBO Paolo;2149;-M;0;RM;020339;802379;100237;m -COLOMBO Silvano;1661;2N;30;MI;251040;0;100077;m -COLOMBRINI Adolfo;1977;1N;0;RM;071148;820660;112359;m -COLONNA Luciano;1760;2N;30;VI;200357;0;101431;m -COLONNATA Elio;1706;1N;30;SP;030958;0;2796;m -COLOSIMO Alessandro;1778;1N;30;LU;130965;0;106053;m -COLUCCI Pasquale;1925;CM;30;AV;120555;0;123854;m -COLUSSO Ermes;1909;1N;30;MI;000150;0;2799;m -COMINI Giovanni;1831;1N;30;MI;040439;0;128425;m -PLONER Gerhard;1700;2N;30;BZ;260172;0;2801;m -COMUNE Francesco;2000;CM;30;CE;231156;0;100396;m -CONCUTELLI Alberto;1739;2N;30;RM;040261;0;107193;m -CONDELLO Giuseppe;1855;1N;30;CZ;210353;0;127156;m -CONDEMI Felice;2030;CM;30;RM;000337;0;2805;m -CONFICONI Alberto;1678;1N;30;FC;000642;0;2806;m -CONFORTI Raffaello;1772;1N;30;KR;281031;0;106474;m -CONSOLO Arturo;1796;1N;30;PV;100864;0;110714;m -CONTEDINI Ennio;2199;-M;0;MI;081034;801046;113954;m -CONTENTO Gilberto;2100;CM;30;GO;000548;0;2810;m -CONTI Angelo;1646;2N;30;BR;090256;0;107184;m -CONTI Renato;1436;2N;30;PC;120935;0;103005;m -CONTI Valerio;2161;-M;0;BO;261157;824267;102082;m -CONTILI Antonio;1610;2N;30;TR;000660;0;2814;m -CONTIN Daniel;2388;IM;0;VA;250362;803618;104708;m -CONTINI Davide;2236;CM;0;LI;040159;817783;114256;m -CONTINI Luca;2294;FM;0;MI;291067;800325;103541;m -CONTRADA Carlo;1733;2N;30;RM;000556;0;2818;m -COPPINI Giorgio;2179;-M;0;RM;110558;800988;105395;m -COPPO Adriano;1634;2N;30;FI;151131;0;105328;m -COPPO Fabio;1490;2N;30;MI;111256;0;108575;m -COPPOLA Gaetano;1619;1N;30;MI;001053;0;2822;m -COPPOLA Guido;2038;CM;30;CO;090145;0;103520;m -CORACCI Sergio;1694;2N;30;GR;0;0;2824;m -CORAZZA Ivano;1658;2N;30;SV;0;0;2825;m -CORDANO Roberto;1700;2N;30;PV;000564;0;2826;m -CORDARA Michele;2169;-M;0;TO;030156;801410;100002;m -CORGNATI Maurizio;2195;-M;0;TO;220548;801321;2828;m -CORISTO Giovanni;1843;1N;30;CS;170360;0;100913;m -CORREGGIA Ruggero;1832;1N;30;RM;280248;0;2830;m -CORSARO Concetto;1849;1N;30;GE;001232;0;2831;m -CORSO Sergio;2303;FM;0;PA;030460;805971;118040;m -CORTI Corrado;2048;CM;0;CO;180965;810835;100719;m -CORTI Massimo;2057;CM;0;LC;;818682;107040;m -CORTI Maurizio;1885;1N;30;VA;000661;0;2835;m -CORTI Mauro;1670;2N;30;AR;0;0;2836;m -CORTIGIANI Mario;1900;1N;30;AL;000033;0;2837;m -CORVAJA Pietro;2000;CM;30;PD;000767;0;100070;m -CORVI Marco;2318;FM;0;RM;111168;801895;106054;m -COSCIA Alberto;1779;1N;30;RM;000962;0;2840;m -COSENTINO Aldo;1741;1N;30;CZ;300445;0;101754;m -COSENZA Gianni;2065;CM;0;NA;090847;815900;114262;m -COSMA Bruno;1552;1N;30;VE;200843;0;103070;m -COSSALI Elvio;2009;CM;30;BG;001157;0;2844;m -COSSU Fabrizio;1670;2N;30;TO;081067;0;100144;m -COSTA Luciano;1642;1N;30;PC;000559;0;2846;m -COSTA Natalino;1757;1N;30;ME;100952;0;102662;m -COSTA Vittorio;1516;2N;30;PC;000559;0;2848;m -COSTANTINI Camillo;1912;1N;30;AP;000061;0;2849;m -COSTANTINI Mirco;2000;CM;30;VE;000764;0;2850;m -COSTANTINI Roberto;2293;FM;0;RN;220383;807621;105847;m -COSTANTINO Giampaolo;2175;CM;0;TO;010561;805114;2852;m -COSTANZA Calogero;1697;2N;30;MI;030438;0;121256;m -COSTANZO Bernardo;2001;CM;30;SA;000746;0;2854;m -COSTAZZA Stefan;1700;2N;30;BZ;190463;0;2855;m -SANTARELLI Mauro;1580;3N;30;TO;280968;0;2856;m -COTTARELLI Franco;1976;CM;0;PR;080730;814792;105881;m -BRUNOD Franco;1700;2N;30;AO;130343;0;102909;m -COVA Ennio;1721;2N;30;VA;001143;0;2859;m -COZZAGLIO Flaminio;2046;CM;30;CR;180847;0;106114;m -COZZI Roberto;1778;2N;30;BZ;000262;0;2861;m -COZZOLINO Angelo;1862;1N;30;NA;200577;0;123784;m -CRACCO Pietro;2039;CM;0;VI;100946;821934;102850;m -CRAPULLI Giuseppe;1976;CM;30;BA;061159;0;107661;m -CRAVERO Gian Maria;1888;1N;30;TO;000066;0;2865;m -CREA Vincenzo;2103;CM;0;ME;180655;802921;100842;m -CREATI Ettore;1900;1N;30;CO;000326;0;2867;m -CRESCENZI Ernesto;1900;1N;30;NA;000064;0;2868;m -CRESPI Andrea;1900;1N;30;MI;000059;0;2869;m -CRESTA Enrico;1972;CM;30;GE;100656;0;101020;m -CRESTANI Federico;1595;2N;30;VI;150669;0;110679;m -CRIPPA Gabriele;2078;CM;0;MI;271262;809012;102423;m -CRISANTI Crisanto;1860;1N;30;RM;240359;0;127920;m -CRISPI Carmelo;1700;2N;30;EN;000449;0;2874;m -CRISPI Guido;2101;CM;30;TS;240558;0;103790;m -CRISPINO Giuseppe;2109;CM;30;NA;000152;0;2876;m -CRISTIANI Cesare;2164;CM;0;BS;170363;804932;106094;m -CRISTIANO Stefano;1700;2N;30;NN;0;0;2878;m -CRISTINI Luca;1667;2N;30;BG;000558;0;2879;m -CRISTOFARI Mario;1774;1N;30;FR;001059;0;2880;m -CRISTOFARI Massimo;1813;1N;30;FR;270451;0;104206;m -CRIVELLARO Federico;1730;2N;30;VE;001070;0;2882;m -CRIVELLARO Luciano;1598;2N;30;VE;000239;0;118962;m -CROSO Marco;1885;CM;30;MI;000854;0;2884;m -CRUCIOLI Marco;1757;2N;30;RM;260142;0;100239;m -CRUDELE Michele;2021;CM;0;BA;060165;823040;106996;m -CUCCHI Giorgio;1808;1N;30;FC;000356;0;2887;m -CUCCHIARA Giovanni;1793;2N;30;NA;220967;0;102787;m -CUCINELLA Vincenzo;2144;CM;0;BA;140357;808539;107161;m -CUCINOTTA Donato;1661;2N;30;CA;0;0;2890;m -CUCUT Claudio;1760;2N;30;GO;010759;0;102857;m -CUDIGNOTO Riccardo;1727;2N;30;VE;000768;0;2892;m -CUGINI Verter;2209;-M;0;RE;070947;801925;105127;m -CULIAT Daniele;1880;CM;30;MI;271057;0;100150;m -CUNSOLO Vincenzo;1745;2N;30;SR;001246;0;2895;m -CUOCHI Paolo;1700;2N;30;MN;010150;0;101230;m -CUPIDI Giuseppe;1900;1N;30;RM;310349;0;107225;m -CUPPONE Fiorentino;1661;2N;30;PG;001057;0;2898;m -CURCI Erminio;1996;CM;30;BA;000064;0;2899;m -CURIONE Francesco;2192;-M;0;BA;090766;801623;109810;m -CRETTI Roberto;1760;2N;30;BG;230681;0;105532;m -DI-NARDO Maurizio;1805;1N;30;TO;310338;0;100006;m -DACONTO Riccardo;1846;1N;30;FI;000951;0;2903;m -DA-DEPPO Giacomo;2000;CM;30;TV;180355;0;107800;m -DAI-CAMPI Danilo;1915;CM;30;TN;031153;0;102724;m -DAL-BIANCO Angelo;1900;1N;30;TV;000056;0;2906;m -FABBRICATORE Antonio;1534;3N;30;CS;090667;0;109734;m -DAL-MASCHIO Costanti;1853;1N;30;VE;210471;0;109650;m -DAL-ZOTTO Daniele;1700;2N;30;TV;250476;0;2909;m -DALLA-VAL Andrea;1936;1N;30;MI;000069;0;2910;m -DALLA-VEDOVA Giusepp;2063;CM;30;VE;001052;0;2911;m -DALLAGLIO Giovanni;2027;CM;0;TN;270156;805602;100675;m -DALMASO Giovanni;1900;1N;30;VA;0;0;2913;m -DALPONTE Dino;2129;CM;0;TN;131066;803170;102759;m -DAMASCO Rosa;2087;CM;0;NA;080357;810070;111297;f -DAMELE Cesare;2120;-M;20;SV;061015;0;2916;m -DAMELE Stefano;1657;1N;30;SV;280261;0;105208;m -DAMIANI Lorenzo;1718;2N;30;MC;170365;0;103006;m -DAMIANI Raffaele;1900;1N;30;MC;000728;0;2919;m -DAMIANO Domenico;1811;1N;30;MO;141146;0;110920;m -DAMIORI Marco;1870;1N;30;NN;0;0;2921;m -DANIELI Enrico;2134;CM;0;VI;280268;806064;101215;m -DAVID Giampiero;2170;-M;20;TO;000756;0;2923;m -DAVIDE Roberto;1900;1N;30;PE;120452;0;113826;m -DE-ANGELIS Cesare;1636;2N;30;RM;001225;0;2925;m -DE-ANGELIS David;1616;2N;30;RM;001261;0;2926;m -DE-ANGELIS Fernando;2114;CM;30;GE;230955;0;101348;m -DE-BARBERIS Massimo;2104;CM;0;TO;110854;803693;106365;m -DE-BENASSUTI Roberto;1798;1N;30;PG;000556;0;2929;m -DE-BETTIN Sergio;1840;1N;30;BZ;250351;0;109860;m -DE-BIASE Arcangelo;1867;1N;30;NA;000538;0;2931;m -DE-BIASI Daniele;1781;2N;30;MI;000665;0;2932;m -DE-BLASIO Massimo;2257;-M;0;RM;300660;801070;102161;m -DE-BONIS Antonio;1724;2N;30;MN;001256;0;109861;m -DE-BORTOLI Maicol;1766;1N;30;VE;251180;0;2935;m -DE-BORTOLI Peter;2216;-M;0;VE;270583;806919;107199;m -DE-CARO Michele;1955;CM;30;TO;001259;0;2937;m -DE-CAROLIS Massimo;2015;CM;0;RM;220156;809900;100243;m -DE-CASTRO Giovanni;1849;1N;30;CO;050772;0;107183;m -DE-CRISTOFANO Vittor;2125;CM;30;MI;000241;0;2940;m -DE-DONATO Francesco;1813;1N;30;CS;000660;0;2941;m -DE-ECCHER Stefano;2263;FM;0;TN;260557;800678;101261;m -DE-FAZIO Paolo;1999;CM;30;BA;160857;0;106992;m -DE-FEO Dino;1738;1N;30;UD;280837;0;105900;m -DE-FRANCESCO Massimo;1816;1N;30;RM;0;0;2945;m -DE-FRANCISCI Luigi;1816;1N;30;AL;000656;0;122055;m -DE-GAETANO Giorgio;1859;1N;30;MI;090955;0;103033;m -DE-GAUDENZI Angelo;1616;2N;30;TO;000321;0;2948;m -DE-GIGLIO Michele;1844;1N;30;NA;080363;0;109374;m -DE-GIORGI Stefano;2065;CM;30;LE;311260;0;105379;m -DE-GIORGIS Giorgio;2017;CM;30;TO;000260;0;2951;m -DE-GREGORIO Massimil;2131;CM;0;MO;051268;803375;100553;m -DE-LAURETIS Paolo;2000;CM;30;PG;000553;0;2953;m -DE-LERMA Andrea;1709;2N;30;NA;000561;0;109794;m -DE-LILLO Giuseppe;1664;2N;30;MI;000864;0;2955;m -DE-LUCA Rosario;1900;1N;30;ME;000145;0;2956;m -DE-MAIO Anna;1481;2N;30;NA;290878;0;102713;f -DE-MAIO Renato;1616;1N;30;NA;040850;0;102705;m -DE-MARCO Ivan;1878;1N;30;CT;200850;0;102469;m -FAMULARI Antonino;1556;3N;30;ME;241265;0;100177;m -DE-MARINIS Marcello;1741;1N;30;RM;010143;0;104356;m -DE-MASI Maurizio;1891;1N;30;TO;000063;0;110476;m -DE-MATTEIS Flavio;1700;2N;30;LE;000569;0;2963;m -DE-MINICO Stefano;1912;1N;30;VI;001074;0;2964;m -DE-MONICA Nicola;1682;2N;30;NN;0;0;2965;m -DE-MORI Claudio;1727;2N;30;VE;000661;0;2966;m -DE-MORI Roberto;1694;2N;30;VE;001265;0;2967;m -DE-NADAI Luca;1694;2N;30;BZ;001163;0;2968;m -DE-NICOLAO Andrea;1903;1N;30;MI;000966;0;2969;m -DE-NUCCIO Luca;1745;2N;30;CB;000274;0;2970;m -DE-PALMA Diego;2135;CM;0;VA;170361;806102;104710;m -DE-PALMA Fabrizio;1979;1N;0;RE;300172;815063;113835;m -DE-PASQUALE Antonio;1658;2N;30;ME;000371;0;2973;m -DE-PIERI Filippo;1721;2N;30;TO;0;0;2974;m -DE-PIRRO Michele;1646;2N;30;GE;020865;0;127453;m -DE-POI Paolo;2209;-M;0;UD;061170;807737;105894;m -DE-RENZIS Giuseppe;1873;1N;30;NA;001252;0;2977;m -DE-ROSA Francesco;1949;CM;30;NA;120554;0;129036;m -DE-ROSA Renato;1969;1N;30;MS;000057;0;2979;m -DE-SANTI Marco;1637;2N;30;VR;171272;0;116976;m -DE-SANTIS Alessio;2337;FM;0;RM;260868;803405;108149;m -DE-SANTIS Mario;2009;CM;30;BA;000626;0;2982;m -DE-SANTIS Tullio;2038;CM;30;AQ;000355;0;2983;m -DE-SIMONE Domenico;1855;1N;30;RM;000049;0;2984;m -STASSI Roberto;1587;3N;30;ME;0;0;2985;m -DE-VECCHI Andrea;2051;CM;30;BO;001150;0;2986;m -DE-VITA Gianni;2106;CM;0;RM;230549;804487;100242;m -DE-VITA Igor;2062;-M;0;RM;300872;803880;102646;m -DEANTONI Veronica;2005;CM;0;TO;100676;801933;106371;f -DEFEND Guerrino;1949;CM;30;CA;220245;0;103859;m -DEGHENGHI Annamaria;1900;1N;30;TS;001236;0;2991;f -DEGLI-ANGELI Carlo;1679;2N;30;AT;060865;0;105299;m -RAMA Mattia;1580;3N;30;VR;211288;0;107967;m -DEI-ROSSI Dino;1834;1N;30;RM;000455;0;2994;m -DEL-BRAVO Riccardo;2032;CM;30;FI;000633;0;2995;m -DEL-DOTTO Luigi;2101;CM;30;LU;120948;0;103468;m -DEL-DOTTO Riccardo;2180;CM;0;LU;230274;807966;103469;m -DEL-GIUDICE Stefano;2061;CM;0;PT;021165;812129;106019;m -DEL-MEDICO Michele;1939;1N;30;MI;000568;0;2999;m -DEL-MESE Sergio;1790;2N;30;RM;001256;0;3000;m -DEL-MONACO Andrea;2248;-M;0;VE;110778;809268;106345;m -DEL-MONACO Enrico;2005;CM;30;VE;000153;0;3002;m -DEL-NOBILE Pasquale;1657;1N;30;FG;130254;0;106155;m -DEL-NONNO Maurizio;1679;2N;30;RM;231056;0;110787;m -DEL-PONTE Carlo;1649;2N;30;GE;000565;0;3005;m -DEL-PRATO Uberto;2136;CM;30;RM;001060;0;3006;m -DEL-REGNO Aurelio;1859;1N;30;SA;000971;0;101333;m -DEL-ROSSO Peter;1736;2N;30;BZ;170455;0;109695;m -DEL-TAVANO Stefano;1570;2N;30;RM;000068;0;3009;m -DEL-TIN Alberto;1637;2N;30;PN;250456;0;102023;m -DEL-VECCHIO Gastone;1892;CM;0;RA;240453;813648;109862;m -DEL-VECCHIO Michele;1900;1N;30;TO;000059;0;3012;m -DEL-VIVO Marco;1867;1N;30;AG;200555;0;106766;m -DELI Luca;1598;2N;30;TV;180758;0;104199;m -DELIZIA Costantino;2175;CM;0;NA;150566;806250;109579;m -DELLA-LUNGA Daniele;2225;CM;0;FI;001150;801259;3016;m -DELLA-ROCCA Giorgio;1750;1N;30;LT;100864;0;106354;m -DELLA-VALLE Massimo;1900;1N;30;BS;221057;0;104050;m -DELL'ACCIO Cataldo;2090;-M;0;RM;180936;810193;100816;m -DELL'ISOLA Vincenzo;1586;2N;30;GE;050553;0;3020;m -DELL'OGLIO Luigi;1915;1N;30;TO;000434;0;3021;m -DELL'OLIO Luciano;2006;CM;30;MI;100379;0;3022;m -DE-MEO Antonio;1934;1N;30;PZ;090663;0;107995;m -DEMETZ Rainer;2178;CM;30;BZ;000167;0;3024;m -DENARO Pasquale;1753;CM;30;PA;000526;0;113490;m -DENES Roberto;1598;2N;30;TN;130455;0;3026;m -DENOZZA Mauro;1493;2N;30;RM;300754;0;119489;m -DEON Tiziano;1700;2N;30;BL;000661;0;3028;m -DESIDERI Daniele;2000;CM;30;PD;001264;0;3029;m -DI-BENEDETTO Andrea;1814;1N;30;SR;010877;0;103689;m -DI-BISCEGLIA Salvato;1679;2N;30;RM;000164;0;3031;m -DI-BITONTO Nicola;1739;2N;30;TA;090968;0;3032;m -DI-CARLO Romeo;2074;CM;0;FG;180169;806897;106160;m -DI-CATALDO Cesare;1894;1N;30;PR;060160;0;106183;m -DICEGLIE Piero;1912;1N;30;PE;211266;0;120491;m -DI-CERA Enrico;2205;-M;20;CB;001260;0;3036;m -DI-CICCIO Mario;1700;2N;30;TO;000559;0;3037;m -DI-COSTANZO Giovanni;2100;CM;30;NA;000457;0;3038;m -DI-CREDICO Vincenzo;1700;2N;30;FR;000667;0;3039;m -DI-DARIO Dario;1622;2N;30;SA;070461;0;3040;m -DI-DONATO Eugeneo;1736;2N;30;TE;040276;0;3041;m -DI-DONNA Angelo;1873;1N;30;CS;001058;0;3042;m -DI-DONNA Massimo;2225;-M;0;TO;010359;801607;3043;m -DI-FAZIO Mario;1846;1N;30;ME;000367;0;3044;m -DI-FELICE Marco;1840;1N;30;VV;030563;0;103986;m -DI-FONZO Valerio;2202;FC;0;MI;070472;803499;100576;m -DI-GIANNI Rocco;2138;CM;0;FG;100259;808547;106159;m -DI-GIORGIO Alessandr;2022;CM;30;TO;000550;0;3048;m -DI-GIORGIO Antonio;1667;2N;30;ME;241232;0;115952;m -DI-GIROLAMO Florido;2000;CM;30;CH;270651;0;106940;m -DI-GIROLAMO Giovanni;1602;1N;30;RM;001246;0;3051;m -DIGIUGNO Franco;2123;CM;0;TO;230259;805432;106363;m -DI-GIULIO Michele;1714;2N;0;RM;160466;827886;127736;m -DI-GREGORIO Domenico;1664;2N;30;MI;140251;0;108074;m -CURINGA Mario;1582;3N;30;BI;0;0;3055;m -DI-JANNI Alberto;1733;1N;30;TO;000257;0;3056;m -DI-LAO Riccardo;2001;CM;0;RN;181160;811106;105849;m -DI-LASCIO Savino;2048;CM;0;BA;290759;810550;111299;m -DI-LAZZARO Gabriele;1986;-M;0;BZ;160344;812676;101526;m -DI-LIBERTO Giorgio;2053;CM;0;GE;190524;812994;101022;m -DI-LORENZI Leonardo;1712;2N;30;PU;000470;0;3061;m -DI-LUPO Aldo;1725;2N;30;PI;010948;0;101968;m -DI-LUZIO Leonardo;1694;2N;30;FG;000165;0;3063;m -DI-MAJO Carlo;2008;CM;0;VA;100760;814687;103965;m -GALANGA Gian Carlo;1706;2N;30;SO;230248;0;107490;m -GALANTE Pasquale;1900;1N;30;BA;000468;0;3066;m -GALANTI Enzo;1900;1N;30;FI;000914;0;3067;m -GALASSO Luigi;1939;1N;30;BN;141047;0;100435;m -GALASSO Paolo;1779;1N;30;TO;110352;0;102167;m -GALDI Michele;1823;1N;30;SA;021165;0;109747;m -GALEAZZI Giacomo;1643;2N;30;SP;060460;0;103652;m -GALENO Giorgio;1786;1N;30;RM;150260;0;105414;m -GALENO Walter;1879;1N;30;RM;000761;0;3073;m -GALEOTTI Marco;2024;CM;30;CR;000563;0;3074;m -GALIANI Stefano;1700;2N;30;NN;000176;0;3075;m -GALIAZZO Giuliano;2058;CM;0;PD;090556;813109;101916;m -GALIETTI Mario;1697;2N;30;BA;;0;3077;m -GALIOTO Giovanni;2102;CM;0;PA;070377;806315;104151;m -GALIOTO Natale;2153;CM;0;PA;170179;810282;104170;m -GALISE Francesco;1625;2N;30;BZ;260562;0;3080;m -GALLETTI Edo;1658;2N;30;CR;;0;104282;m -GALLI Alessandro;2000;CM;30;RM;150460;0;115313;m -GALLI Alessio;1900;1N;30;VE;000868;0;3083;m -GALLIFUOCO Alberto;1915;1N;30;AQ;000056;0;116331;m -GALLINA Giuseppe;1700;2N;30;TV;000763;0;105260;m -GALLITTO Salvatore;1951;CM;0;CN;150756;809160;109260;m -GALLO-CARRABBA Angel;1718;2N;30;AG;260664;0;105614;m -GALLO Enrico;2061;-M;0;VE;070960;801267;106346;m -GALLO Fabrizio;1688;2N;30;CT;000163;0;3089;m -GALLOZZI Guido;1694;2N;30;RM;070643;0;111511;m -GALUFFO Antonio;1700;2N;30;TP;160873;0;111550;m -GAMBA Ezio;1868;1N;30;AT;280975;0;105298;m -GAMBARDELLA Piero;2037;CM;0;SA;140363;812005;109132;m -GAMBILLARA Franco;1900;1N;30;SP;000638;0;3095;m -GAMBINO Giovanni Fra;2068;CM;30;TP;000172;0;3096;m -GANDINI Sandro;2103;CM;30;AL;000554;0;3097;m -GANDINI Stefano;1712;2N;30;MI;000759;0;3098;m -GANDOLFI Gianfranco;1882;CM;0;MI;281253;813389;100556;m -GANDOLFO Marco;2073;CM;30;MI;000459;0;3100;m -GANGEMI Salvatore;2077;CM;0;CT;140560;808644;103438;m -GARANO Nicola;2265;CM;0;TS;250163;806870;111078;m -CRESTANI Sandro;1700;2N;30;NO;250361;0;104869;m -GARBARINI Cristiano;1817;1N;30;MI;141079;0;100026;m -GARBISA Paolo;1888;1N;30;VE;281050;0;101472;m -POL Fabio;1721;2N;30;BL;150854;0;105026;m -GARDENAL Mario;1861;1N;30;VE;000758;0;3107;m -GARDON Ermanno;2164;CM;0;RM;090973;808717;102748;m -GARDONCINI G. Battis;2075;CM;0;TO;270854;813290;102284;m -GARGANO Luigi;1652;2N;30;CE;000752;0;3110;m -GARGIOLIO Luigi;1673;2N;30;NN;0;0;3111;m -GARGIULO Giulio;1496;2N;30;SA;101058;0;110195;m -GARGIULO Tristano;2129;CM;30;RM;000352;0;3113;m -GARINI Gianni;1565;2N;30;VA;271141;0;102546;m -GARISTA Eugenio;2148;CM;0;VR;100469;805521;3115;m -GAROFALO Antonio;1706;2N;30;BA;191052;0;111303;m -GAROFALO Massimo;1745;CM;30;CS;010655;0;109144;m -GAROFALO Pietro;2095;CM;0;BA;200260;804550;109382;m -GAROFOLI Alessandro;1858;1N;30;AR;000256;0;3119;m -GAROZZO Bruno;1834;1N;30;VE;000211;0;3120;m -GARRISI Enrico;1906;1N;30;AP;000849;0;3121;m -GARUFI Natale;1852;1N;30;RM;190452;0;127918;m -GARUTI Alessandro;1822;1N;30;RM;000362;0;3123;m -GASPARELLO Alessandr;1900;1N;30;VE;100666;0;103072;m -GALLO Carlo;1700;2N;30;RC;290461;0;106464;m -GASPARRO Silvestro;1900;1N;30;CA;001043;0;3126;m -GASPERI Fosco;2104;CM;0;RM;040253;813664;101752;m -GASPERO Mario;1837;1N;30;RM;310741;0;108901;m -GASPERONI Stefano;2009;CM;0;MI;131162;824054;103607;m -GASSER Giorgio;2160;-M;0;TS;150845;803570;100642;m -GATTA Giorgio;1952;CM;30;RA;020154;0;109218;m -GATTERER Florian;2206;-M;0;BZ;290976;811688;123865;m -GATTERER Simon;1700;2N;30;BZ;030394;0;113308;m -GATTI Angelo;2001;CM;30;MI;001256;0;3134;m -GATTI Giovanni;1788;1N;30;MI;250940;0;100033;m -GATTINO Piero;1880;1N;30;TO;300852;0;104727;m -GATTO Claudio;1900;1N;30;NA;071252;0;114841;m -GATTO Lucio;2082;CM;30;NA;001256;0;3138;m -GAUDIANO Franco;1819;1N;30;BS;000260;0;3139;m -GAUDINO Gaetano;1700;2N;30;RM;000146;0;3140;m -GAUDIOSI Michele;2000;CM;30;NA;000664;0;3141;m -GAULLI Giovanni;1963;1N;30;PR;001256;0;3142;m -SABADIN Giorgio;1667;2N;30;TS;231258;0;106530;m -GAVIOLI Giuliano;1715;2N;30;FE;271157;0;102226;m -GAY Giovanni;1661;2N;30;PI;160270;0;108779;m -GAY Stefano;1688;2N;30;RM;000949;0;3146;m -GAZZABIN Sergio;1622;2N;30;RO;001049;0;3147;m -GAZZARRI Alberto;2143;CM;0;LI;120445;804649;103943;m -GAZZIERO Gabriele;2000;CM;30;TO;000457;0;3149;m -GEMMA Dario;1900;1N;30;AL;000056;0;3150;m -GENGA Secondo;1810;1N;30;PU;000955;0;105864;m -GENNA Jose Miguel;2216;-M;0;TV;080560;815683;104201;m -GENNARI Giuseppe;1604;2N;30;MI;120231;0;108780;m -GENOCCHIO Daniele;2345;FM;0;TV;290981;806463;106460;m -GENOVA Oscar;1864;1N;30;RM;050351;0;104509;m -GENOVESE Alberto;1897;1N;30;GE;000071;0;3156;m -GENOVESE Maurizio;2244;FM;0;SR;151165;802930;104146;m -GENOVESE Rino;1583;2N;30;FE;000138;0;3158;m -GENSABELLA Paolo;1865;1N;30;RM;050673;0;100244;m -GENTILI Francesco;1676;2N;30;TE;0;0;3160;m -GERGELY Imre;1550;2N;30;RM;170743;0;102367;m -GERMANO Vincenzo;1777;1N;30;LI;000360;0;3162;m -GERUNDINO Nicola;1965;CM;0;LC;311055;816957;107038;m -GERVASI Giancarlo;2303;FM;0;RM;311059;800210;106218;m -GERVASIO Francesco;2037;CM;30;MI;281248;0;113997;m -GESUALDO Camillo;1754;1N;30;RM;000652;0;3166;m -GESUALDO Massimo;2026;CM;30;FE;060571;0;102241;m -GHEZZI Carlo;1688;2N;30;CO;180550;0;102976;m -GHEZZI Glauco;2131;CM;30;RM;220220;0;112219;m -GHEZZO Roberto;1700;2N;30;BO;001165;0;3170;m -GHIANNAULIS Dionisio;1804;1N;30;MI;000369;0;3171;m -GHIDELLA Rinaldo;1640;2N;30;TO;001044;0;3172;m -GHIDINELLI Giorgio;1873;1N;30;BS;100239;0;101914;m -GHISOLFI Mario;1601;2N;30;AL;001015;0;3174;m -GHISOTTI Paolo;1700;2N;30;CR;040967;0;104248;m -GIACCHERINI Luciano;1658;2N;30;LT;000254;0;3176;m -GIACCHETTI Claudio;2070;CM;0;PE;281161;821519;106943;m -GIACCHETTI Luciano;2085;CM;0;AQ;261159;816345;107459;m -GIACOMASSO Enrico;1942;CM;0;TO;010762;809853;102211;m -GIACOMELLI Enzo;1688;2N;30;BL;101143;0;105027;m -GIACOMETTI Carlo;2062;CM;0;AN;161164;819727;122259;m -GIACOMETTI Franco;2152;CM;30;AN;150566;0;104734;m -GIACOMINI Massimo;1924;CM;30;PD;160155;0;104045;m -GIAMBRA Michele;1900;1N;30;TO;000042;0;3184;m -GIANESIN Alberto;1703;2N;30;RM;000435;0;3185;m -GIANGREGORIO Pasqual;1915;1N;30;RM;300963;0;105410;m -GIANI Franco;2043;CM;0;MI;200632;811238;101743;m -GIANNAS Basile;1855;1N;30;RM;000249;0;3188;m -GIANELLI Ferruccio;1927;1N;30;MI;090462;0;3189;m -GIANNETTI Emiliano;1712;2N;30;LT;110674;0;104937;m -GIANNETTI Giannetto;1670;1N;30;FR;000949;0;3191;m -GIANNINI Giorgio;1742;2N;30;CZ;250675;0;3192;m -GIANNONI Federico;1811;1N;30;CA;131270;0;103106;m -GIANNONI Francesco;1810;1N;30;RM;220459;0;108899;m -GIANOTTI Giacomo;1768;1N;30;GE;260431;0;105154;m -GIARACUNI Claudio;1592;2N;30;CO;211072;0;104995;m -GIBELLATO Francesco;2130;-M;0;VE;010254;805220;117420;m -GODANI Tiziano;2262;CM;0;SP;151150;808580;103670;m -GODENA Michele;2528;GM;0;TV;300667;800090;104473;m -GOI Giuseppe;1900;1N;30;BL;000752;0;3200;m -GOLDONI Claudio;2033;CM;30;MN;011255;0;101166;m -GOMEZ-DE-AYALA Paolo;1741;CM;30;NA;270854;0;109648;m -FORCUCCI Arcangelo;1580;3N;30;PE;070256;0;102584;m -GONGALOV Bojan;2137;CM;30;MI;001258;0;3204;m -GONZAGA Silvio;2063;CM;30;GE;290459;0;105155;m -GONZINI Gianmaria;1859;1N;30;LT;280273;0;109760;m -GORASSINI Feruccio;1532;2N;30;NA;000225;0;3207;m -GORELLI-FAGIOLINI Ma;2205;-M;0;SI;210757;804797;107569;m -GORELLI Paolo;1637;2N;30;TO;0;0;3209;m -GORGOGLIONE Emanuele;1900;1N;30;MI;001261;0;3210;m -GORGOGLIONE Pasquali;2000;CM;30;MI;000260;0;3211;m -GORI Andrea;2195;CM;0;MI;090656;806005;102951;m -GORINI Alessandro;1730;2N;30;FR;260747;0;104212;m -GOSIO Denis;2164;CM;0;BS;260972;811475;106098;m -GOTTI Marco;1946;CM;30;TO;000461;0;100606;m -GOVERNALE Michele;1700;2N;30;PI;000471;0;3216;m -GOVERNALE Pietro;1918;1N;30;PA;311260;0;104895;m -GOVONI Fausto;2215;-M;0;BO;031263;801879;122779;m -GOZZI Fabrizio;1921;1N;30;RE;200656;0;103590;m -GRADASSI Fabrizio;2050;CM;30;RA;001063;0;3220;m -GRAMIGNANI Rita;2025;CM;0;SP;121043;801518;107865;f -GRANDE Pasquale;2079;CM;0;CS;251158;804258;104138;m -GRANDINETTI Antonio;2090;CM;0;VR;211259;803359;3223;m -GRASSI Mario;2190;-M;20;GE;251026;0;101046;m -GRASSI Pietro;2199;CM;0;GE;260963;827983;100376;m -GRASSO Giuseppe;1762;1N;30;ME;000062;0;3226;m -HASANI Bledar;1587;3N;30;BR;120669;0;3227;m -GRAZIANI Sergio;1682;2N;30;RM;300465;0;102741;m -GRAZZI Roberto;1819;1N;30;MI;000568;0;3229;m -GRECH Gerlando;1984;1N;0;AG;280575;816370;105609;m -GRECO Vinicio;1881;1N;30;CO;040660;0;104848;m -GREGORATTI Ivaldi;2045;CM;30;UD;170751;0;103726;m -GRIFFA Roberto;2121;CM;0;MI;090568;807567;104441;m -GRIFFO Antonio;1640;2N;30;PA;000857;0;3234;m -GRIGOLATO Enzo;1849;1N;30;RO;140948;0;114773;m -GRILLO Natale;1673;2N;30;BN;000855;0;3236;m -GRILLO Roberto;1655;2N;30;OR;190645;0;112108;m -MOSSOTTO Fulvio;1580;3N;30;TO;110783;0;109881;m -GRINZA Andrea;2255;FM;0;TO;111251;800520;102282;m -GRITTI Andrea;1900;1N;30;GE;001024;0;3240;m -GROSSI Alberto;1685;2N;30;MI;000362;0;3241;m -GROSSO Luca;1937;1N;30;MI;001071;0;3242;m -GROSSO Piermario;1676;2N;30;GE;051257;0;3243;m -GROSSRUBATSCHER Herb;1847;1N;30;BZ;001067;0;3244;m -GRUBER Martin;1718;2N;30;BZ;290943;0;100023;m -GRUBESICH Fabio;1858;1N;30;GE;050563;0;101047;m -GRZESLAK Adam;2000;CM;30;CE;000459;0;3247;m -GUAGLIANONE Mario;2073;-M;0;VE;030743;825840;113549;m -GUALCO Ardelio;2032;CM;30;IM;071241;0;102611;m -GUALTIERI Denis;1706;2N;30;FC;000674;0;3250;m -GUALTIERI Gaetano;2000;CM;30;RM;001062;0;3251;m -GUALTIERI Giovanni B;1667;2N;30;MI;000967;0;3252;m -GUANDALINI Sergio;1649;2N;30;MO;190961;0;103213;m -GUARAGNO Michele;1837;1N;30;MO;281148;0;101985;m -GUARINO Mario;2099;CM;30;RM;000561;0;3255;m -GUCCIONE Luigi;1679;2N;30;CS;0;0;3256;m -GUECI Riccardo;2125;-M;0;PA;180653;800848;104882;m -GUERRA Alessandro;2195;-M;0;VI;230670;801615;106580;m -GUERRA Ugo;2290;-M;0;RM;180863;800279;3259;m -GUERRA Vito Rocco;1988;1N;30;BA;050269;0;115511;m -GUERRIERI Lorenzo;2207;-M;0;AO;090577;803910;102920;m -GUERRIERO Mario;1700;2N;30;AV;;0;3262;m -GUERRINI Donato;2035;CM;0;CO;080357;810673;104994;m -GUERRINI Stefano;2144;CM;30;RM;000665;0;3264;m -GUETTA Salvatore;1697;2N;30;NA;140463;0;114227;m -GUGLIELMI Giuseppe;1933;CM;0;AN;070849;813672;102113;m -GUGLIELMI Riccardo;2193;CM;0;IM;010358;802840;3267;m -GUGLIELMINO Piero;1721;2N;30;TO;000929;0;3268;m -GUGLIELMONE Luciano;1679;1N;30;GE;210144;0;104811;m -GUIDI Guido;1828;1N;30;EE;0;0;3270;m -GUIDI Paolo;1816;1N;0;AN;020764;826022;127582;m -GUIDO Flavio;2323;FM;0;GE;190363;800538;101027;m -GUIDOLIN Gianfranco;2000;CM;30;TV;141147;0;114432;m -GULINO Santo;1622;2N;30;MI;130841;0;102402;m -GULISANO Giuseppe;1673;2N;30;CT;041155;0;103434;m -GULLI Giorgio;1703;2N;30;MO;0;0;3276;m -GULLOTTO Vincenzo;1976;CM;30;ME;000652;0;100245;m -GURZONI Francesco;1700;1N;30;VR;171256;0;112084;m -GUZZETTI Luigi Enric;1933;1N;30;MI;000957;0;3279;m -HASSAN Fathi;1897;1N;30;PU;000557;0;3280;m -HELMAN Mihail;1906;1N;30;TO;000836;0;3281;m -GIBERTI Massimiliano;1811;1N;30;BO;200671;0;109432;m -GIGLIO Achille;1684;1N;30;NA;061220;0;114260;m -GIGLIO Saverio;1841;1N;30;VE;080755;0;106347;m -GINOSA Romano;1700;2N;30;MI;000762;0;3285;m -GINOULHIAC Eugenio;2120;CM;30;BG;000234;0;3286;m -GIOCASTRO Andrea;2116;CM;0;RM;060558;810886;3287;m -GIOPPI Martino;2000;CM;30;TN;000947;0;3288;m -GIORDA Roberto;2135;CM;30;TO;000458;0;102286;m -GIORDANA Marco;1907;1N;30;TO;221061;0;102205;m -GIORDANI Marco;2137;-M;0;BI;310875;807451;108651;m -GIORDANO Antonio;1655;2N;30;BZ;130234;0;108413;m -GIORDANO Francesco;1568;2N;30;NA;010226;0;115202;m -GIORDANO Giancarlo;2000;CM;30;TO;000153;0;3294;m -GIORDANO Lorenzo;1840;1N;30;PA;001042;0;3295;m -GIORDANO Luca;1572;2N;30;NA;000273;0;104436;m -GIORGETTI Alberto;2130;CM;0;FI;170858;809780;101847;m -GIORGETTI Fosco;1808;1N;30;RM;160854;0;100264;m -GIORGINI Marino;1649;2N;30;PD;190148;0;103230;m -GIORNI Moreno;1946;CM;30;VT;070963;0;101901;m -GIOVANARDI Marco;1700;2N;30;MO;050941;0;103219;m -GIOVANNETTI Fabio;1571;2N;30;RM;000556;0;3302;m -GIOVANNINI Roberto;2036;CM;0;RN;230564;826839;105853;m -GIOVANOLA Gianluigi;1310;2N;30;RM;210223;0;102655;m -GIOVINE Michele;1936;1N;30;TO;180273;0;111757;m -GIRETTI-KANEV Jasen;2210;-M;0;MI;080570;805610;104781;m -GIRINO Carlo;2009;CM;30;AT;071267;0;105293;m -GIROLA Enrico;2012;CM;30;CO;000559;0;3308;m -GIULIANO Mario;1451;2N;30;ME;030453;0;102664;m -GIUBBOLINI Luigi;1867;1N;30;IM;0;0;3310;m -GIUDICI Alberto;1998;1N;0;AL;290371;826456;106377;m -GIUFFRIDA Francesco;1656;2N;30;CT;071167;0;101096;m -GIUFFRIDA Ignazio;1873;1N;30;CT;151149;0;103433;m -GIUGANINO Sergio;2000;CM;30;CN;000446;0;3314;m -GIULIANI Sante;1985;CM;0;VT;250165;817074;117572;m -GIULIANO Alberto;1798;1N;30;NA;210674;0;127345;m -GIULIANO Arturo;2060;-M;0;TN;160935;811823;100857;m -GIULIANO Mario;1679;2N;30;TN;250265;0;100856;m -GIURIATI Paolo;2217;-M;0;TV;190270;806056;107815;m -GIURIATO Bruno;1732;1N;30;VI;240362;0;101439;m -GIUSTI Daniele;1688;2N;30;LU;0;0;3321;m -GLORIA Domenico;1900;1N;30;RM;000260;0;3322;m -GOBITTI Giovanni;1826;1N;30;TV;001258;0;3323;m -CONSENTINO Giuseppe;1685;2N;30;ME;0;0;3324;m -SAVOIA Sergio;1722;1N;30;CH;0;0;100649;m -HOFER Alexander;1700;2N;30;BZ;001173;0;3326;m -HOFMANN Alfred;1778;2N;30;BZ;000261;0;3327;m -HUGONY Fabrizio;2275;-M;0;MI;250369;800350;3328;m -HUSS Bengt;2134;CM;30;GE;001166;0;3329;m -IACCA Giuseppe;1787;1N;30;TA;230963;0;109829;m -IACOMI Sergio;1900;1N;30;RM;000354;0;3331;m -IACONO Stefano;1802;1N;30;GE;270768;0;101322;m -IACUELLI Alessandro;1609;2N;30;NA;281169;0;101201;m -IANNACCONE Ernesto;2375;FM;0;NA;291159;800163;102774;m -IANNELLI Davide;1670;2N;30;BN;000256;0;3335;m -BUCCILLI Rocco;1580;3N;30;AQ;210875;0;110021;m -IANNICELLI Alfonso;1720;2N;30;LZ;001156;0;3337;m -IANNIELLO Riccardo;2276;FM;0;RM;100256;800368;3338;m -IATRINO Vincenzo;1854;CM;0;RM;261161;808610;117825;m -IELAPI Vito;1929;CM;30;CS;000758;0;120270;m -IMBROGNO Rinaldo;2035;CM;30;RM;231263;0;104510;m -IMPARATO Antonello;1900;1N;30;LT;000563;0;3342;m -IMPERATO Fernando;1696;2N;30;NN;000151;0;3343;m -INCELLI Renato;1532;2N;30;RM;020127;0;101413;m -INDELICATI Giuseppe;2181;-M;0;TA;261258;809144;105813;m -INGANNAMORTE Gaetano;1718;2N;30;BZ;270435;0;101536;m -INSABATO Giovanbatti;2097;CM;0;PA;290776;806412;104156;m -INTELISANO Giuseppe;1676;2N;30;ME;001059;0;3348;m -INTERLANDI Giuseppe;1771;2N;30;SR;001132;0;3349;m -INTRAVAIA Bruno;1541;2N;30;CT;000840;0;3350;m -INVERNIZZI Ferruccio;1655;2N;30;MI;280553;0;108082;m -IODICE Fabio;1760;1N;30;CE;160166;0;123013;m -IODICE Gianfranco;1900;1N;30;NA;000543;0;3353;m -IORI Piero;1784;2N;30;RE;060841;0;112549;m -IOTTI Pierluigi;2294;FM;0;RE;190464;802603;105105;m -IPPOLITO Lorenzo;1700;2N;30;SR;000165;0;3356;m -IPPOLITO Vincenzo;1622;2N;30;SR;000162;0;3357;m -ISELLA Lorenzo;1931;1N;30;VA;140777;0;104712;m -ISONZO David;2361;FM;0;SR;120876;804053;103693;m -IUDICELLO Giovanni;2171;-M;0;MI;040650;804738;100167;m -IUDICELLO Marco;2220;-M;0;MI;191156;803715;103041;m -IUDICELLO Massimo;2141;CM;0;MI;020464;807460;104784;m -IUDICELLO Placido;1706;1N;30;MI;070820;0;103036;m -IULA Antonio;1879;1N;30;SA;100266;0;3364;m -IUORIO Antonio;1876;1N;30;NA;000153;0;3365;m -IVALDO Fabrizio;1823;1N;30;SV;200371;0;105210;m -JASNIG Stelio;2103;CM;0;TS;010822;808920;100645;m -JAVARONE Maurizio;1853;1N;30;SS;020156;0;106750;m -JENSEN Bent;2049;CM;30;MI;000150;0;3369;m -KAPLUN Aaron;1900;1N;30;CO;000435;0;3370;m -KERSCHBAUMER Renate;1700;2N;30;BZ;040263;0;3371;f -KHACHAB Ibrahim;1775;2N;30;VR;010764;0;101551;m -CARUSO-RASA' Antonio;1610;2N;30;CT;070372;0;102455;m -KOFLER Albin;1724;2N;30;BZ;010353;0;110149;m -KOFLER Hugo;1676;2N;30;BZ;000363;0;3375;m -KOFLER Oswald;1917;1N;30;BZ;000463;0;3376;m -KOFLER Reinhard;1900;1N;30;BZ;030158;0;100016;m -KOKASH Fuad;2096;CM;30;MO;001158;0;3378;m -KOKENY Alessandro;1805;1N;30;BO;000561;0;3379;m -GRESELIN Giovanni;1580;3N;30;MI;121036;0;3380;m -KOWALCZYK Martin;2053;CM;0;BZ;210456;809535;101529;m -KOZINSKI Carol;1900;1N;30;RM;000030;0;3382;m -NAMIO Fabio;1661;2N;30;RE;230284;0;105135;m -KUSTERLE Francesco;1603;1N;30;GO;041032;0;3384;m -LA-FONTANA Stefano;1664;2N;30;LC;001272;0;3385;m -LA-FRANCA Vincenzo;1667;2N;30;PA;010150;0;104896;m -LA-GATTA Giovanni;2144;CM;0;NA;200463;804959;102074;m -LA-MONACA Arturo;1730;2N;30;PA;191074;0;104890;m -LA-ROSA Giuseppe;1613;2N;30;ME;000934;0;3389;m -LA-ROSA Massimo;2110;CM;30;SP;021259;0;3390;m -LA-SALA Alberto;2023;CM;30;VC;000758;0;3391;m -LA-SPINA Marcello;2235;CM;0;SI;250274;810258;107588;m -LA-TORRE Giovanni;2082;CM;0;MI;221052;810690;104020;m -LACO Giuseppe;2143;-M;0;GO;110537;800880;102860;m -LAGROTTERIA Salvator;2176;-M;0;FC;151259;802492;109216;m -LAGUMINA Giulio;2315;FM;0;PA;140759;800619;104884;m -SANIN Wilfred;1718;2N;30;BZ;160936;0;112479;m -LAMOLA Giuseppe;2032;CM;0;TA;160475;812234;110525;m -LAMOLA Vito;1772;2N;30;TA;260972;0;110526;m -MINONNE Marco;1580;3N;30;LE;080972;0;3400;m -LANCIA Oscar;1577;2N;30;FI;140112;0;3401;m -LANDAIS Federico;1756;1N;30;MI;111066;0;100171;m -LANDI Davide;1625;2N;30;SP;151274;0;105484;m -LANDOLFI Franco;2000;CM;30;GR;000858;0;103951;m -LANDRINI Fabrizio;1697;2N;30;RM;000263;0;3405;m -LANG Gunther;1910;1N;30;BZ;000547;0;3406;m -LANNAIOLI Alfonsino;1544;2N;30;VT;000750;0;123498;m -LANNI Emanuele;2105;CM;30;AP;000962;0;3408;m -LANTINI Marco;2216;-M;0;RM;180556;801054;105397;m -LANZ Josef;1706;2N;30;BZ;000451;0;3410;m -LANZANI Eugenio;1580;1N;30;MI;220564;0;101766;m -LANZANI Mario;2331;IM;0;MI;100363;800244;100883;m -LANZAVECCHIA Pierdan;2118;CM;0;GE;281263;808296;3413;m -LANZILLOTTA Angelo;2051;CM;30;TA;231267;0;105818;m -LAPITAN Eusebio;1694;2N;30;MI;000658;0;3415;m -LAPORTA Luca;1700;2N;30;BA;140974;0;115505;m -LARGHI Riccardo;1981;CM;30;VA;190257;0;102978;m -LARICCHIUTA Francesc;1912;1N;30;BA;270260;0;107178;m -MORODER Richard;1649;2N;30;BZ;0;0;130580;m -LASIO Simone;1745;2N;30;SV;000161;0;3420;m -LATINI Carlo;1801;1N;30;RM;280864;0;112761;m -LATTANZI Luca;1709;2N;30;RM;000966;0;3422;m -LATTARULO Vito;2107;CM;30;SP;001220;0;3423;m -LAUDATI Lelio;1673;2N;30;RM;000869;0;3424;m -NARDIN Lino;1730;2N;30;TN;240468;0;100668;m -LAURIA Amilcare;2185;CM;0;TE;050762;808016;104692;m -LAURO Luigi;1811;1N;30;NA;110474;0;101058;m -LAUZI Riccardo;1517;2N;30;MI;280617;0;104017;m -LAVA Giovanni;2232;-M;0;RM;030263;802093;109750;m -LAVALLE Marcial;1966;1N;30;NN;0;0;3430;m -LAVERMICOCCA Giacomo;1730;2N;30;TO;000260;0;3431;m -LAVIERI Doriano;1940;CM;30;RM;290174;0;108893;m -MALVASI Federico;1700;2N;30;MO;160371;0;3433;m -LAZZARATO Alberto;2109;CM;0;MI;011058;807095;3434;m -LAZZERI Francesco;1900;1N;30;GE;000059;0;3435;m -LECCI Fabio;1769;2N;30;RM;010148;0;102147;m -LECHNER Manfred;1712;2N;30;BZ;000471;0;3437;m -LEONARDI Alfio;1862;1N;0;CT;300961;823155;110571;m -LEONARDI Giandomenic;1639;2N;30;BG;0;0;3439;m -LEONARDI Salvatore;1837;1N;30;ME;270450;0;100843;m -LEONCINI Mario;2141;-M;0;SI;010756;801712;107571;m -LEONE Maurizio;1622;2N;30;CZ;140259;0;102880;m -LEONI Aristide;1682;2N;30;MO;210531;0;104526;m -LEONI Fabrizio;2049;CM;0;CR;291058;811041;104231;m -LEONI Leonardo;1700;2N;30;SO;180849;0;107492;m -LEONI Leopoldo;2173;-M;20;MI;000157;0;121257;m -LEONI Livio;1820;1N;30;BG;271267;0;100892;m -LEONI Rodolfo;1982;1N;30;SS;260561;0;109285;m -LETTICH Sergio;2045;CM;0;GE;111242;808288;100510;m -LEVA Piergiorgio;1900;1N;30;TO;000050;0;3450;m -LEVANTACI Arturo;1712;2N;30;VA;000655;0;3451;m -LEVORIN Fabrizio;1634;2N;30;PD;090476;0;3452;m -LIBRANDI Ermanno;1739;2N;30;AP;001242;0;3453;m -LICCARDO Andrea;1900;1N;30;GE;000061;0;3454;m -PICCHIO' Fabrizio;1572;2N;30;MI;040867;0;114387;m -LICENZIATO Giuseppe;1635;1N;30;MI;000139;0;3456;m -LICENZIATO Umberto;1900;1N;30;MI;001141;0;3457;m -LICORDARI Guido;1718;2N;30;TO;250750;0;106259;m -LIFFREDO Luigi;1900;1N;30;TO;000645;0;3459;m -LIGUORI Michele;1733;2N;30;BS;080578;0;116400;m -LIGUORI Renato;2110;CM;0;NA;070467;806099;101056;m -CRESTI David;1580;3N;30;PO;;0;107582;m -LIMONGELLI Sergio;1986;CM;0;LE;220456;811971;105648;m -LIONETTI Piero;2000;CM;30;TO;010763;0;100010;m -LIPPI Agostino;1652;2N;30;TV;280728;0;121151;m -LIPPI Lorenzo;2018;CM;30;FI;001268;0;3466;m -LISI Sebastiano;1838;1N;30;SR;110565;0;105230;m -LITIGIO Sandro;1679;2N;30;CO;120861;0;104979;m -LIUBICH Fabrizio;1676;2N;30;VE;020262;0;103075;m -LIVATINO Salvatore;1580;2N;30;PA;090539;0;100422;m -LIVECCHI Dario;2155;CM;0;PA;160372;810487;104152;m -LIVIO Luigi;1900;1N;30;CO;010650;0;107499;m -LO-BOSCO Salvatore;1888;CM;30;AG;000354;0;3473;m -LO-MANTO Emiliano;2015;CM;30;PD;000470;0;3474;m -LO-NIGRO Angelo;1727;2N;30;GE;180775;0;3475;m -LO-NIGRO Filippo;1761;1N;30;GE;081046;0;3476;m -LO-NOCE Giuseppe;2000;CM;30;BR;000155;0;3477;m -LO-VERSO Fabio;2093;CM;30;PA;000867;0;3478;m -LOCATELLI Guido;1573;1N;30;NA;200136;0;107077;m -LODA' Giuseppe;1691;2N;30;RM;001240;0;3480;m -LOI Andrea;1706;2N;30;OR;150575;0;3481;m -LOI Massimo;1915;1N;30;CA;000575;0;3482;m -LOLLI Giorgio;1663;1N;30;MI;000431;0;3483;m -LO-MARTIRE Vincenzo;1868;1N;30;BR;040865;0;106237;m -LOMBARDI Ascenzo;1739;2N;30;RM;260538;0;110380;m -LOMBARDI Raffaele;1709;2N;30;MI;241167;0;100580;m -LOMBARDINI Giulio;1997;CM;0;RE;241143;815012;109868;m -LOMBARDO Emanuele;1694;2N;30;BG;001261;0;3488;m -LOMBARDO Evangelista;1718;2N;30;MI;000458;0;3489;m -LOMUSCIO Alessio;1736;2N;30;MI;000869;0;3490;m -LONGHIN Gastone;1807;1N;30;RO;201030;0;106140;m -LONGO Andrej;2135;-M;20;NA;000959;0;3492;m -LONGO Domenico;1879;1N;30;RM;060452;0;110959;m -LONGO Emilio;2130;CM;30;FI;000427;0;3494;m -LONGO Giovanni;1763;2N;30;MI;200359;0;100881;m -LONGO Luciano;1700;2N;30;CT;000356;0;3496;m -LOPERFIDO Nicola;1733;1N;30;BA;110464;0;107179;m -LORENZINI Andrea;1766;1N;30;BO;121279;0;3498;m -LORUSSO Lucio;2064;CM;0;BA;181161;813141;109377;m -CERE' Gianfranco;1700;2N;30;MI;270938;0;100060;m -LOSI Enrico;1706;2N;30;MO;000748;0;3501;m -LOSITO Fabrizio;1700;2N;30;BG;020673;0;3502;m -LOSTUZZI Manlio;2406;FM;0;TS;131060;802441;103794;m -LOVALDI Renato;1703;2N;30;MI;220542;0;108075;m -LOVALLO Franco;1933;1N;30;GE;000055;0;3505;m -LOVATI Paolo;2069;CM;0;MI;240456;807532;100127;m -LUBRANO Pietro;2011;CM;30;RM;000150;0;3507;m -LUCARONI Massimilian;2293;FM;0;LT;120669;802484;106216;m -LUCCA Guglielmo;1703;2N;30;UD;150857;0;105905;m -LUCCHESE Paolo;1998;CM;0;AL;180659;815209;106182;m -LUCCHI Vinicio;2173;CM;0;FC;161157;805459;109869;m -LUCCIONI Massimo;2000;CM;30;PR;000459;0;3512;m -LUCERNONI Paolo;2101;CM;30;TV;011256;0;107803;m -LUCERTINI Mirco;1721;2N;30;PG;001162;0;3514;m -LUCHSINGER Eric;2129;-M;0;BG;030957;810177;106389;m -LUCIANI Carlo;2236;-M;0;GO;011154;800627;100641;m -LUCIANI Valerio;2232;-M;0;VR;031273;803731;101361;m -LUCICH Gianni;1631;2N;30;VE;070947;0;117158;m -LUCIN Enzo;2160;-M;20;TN;210430;0;100853;m -LUDOVICI Roberto;1774;1N;30;RM;030355;0;108902;m -LUGLI Claudio;1745;2N;30;MO;130961;0;103214;m -LUGLI Luca;1808;1N;30;LU;040861;0;106426;m -LUIGINI Ottavio;2012;CM;30;AQ;101171;0;107468;m -LUISETTO Alessandro;1838;CM;30;PD;140964;0;106781;m -LUPERINI Alessio;1973;1N;30;GE;230983;0;3525;m -LUPI Leonardo;1900;1N;30;MI;001035;0;107498;m -LUPINI Stefano;1790;1N;30;SV;120269;0;102608;m -LUPO Alfredo;2096;CM;0;NA;030662;806129;104607;m -LUPO Francesco;1904;1N;0;PA;260665;806420;104155;m -LUPPI Sergio;1974;CM;30;MI;261042;0;109966;m -LUSSANA Marco;1996;1N;30;BG;201065;0;101666;m -MACCAFERRI Gian Mari;1873;1N;30;MI;000965;0;3532;m -MACCAGNO Giancarlo;2093;CM;0;TO;180758;802107;107503;m -MACCARI Alessandro;1739;2N;30;BZ;110860;0;3534;m -MACCARINI Luca;1703;2N;30;BG;001268;0;3535;m -MACCARRONE Fortunato;1691;2N;30;RM;000126;0;3536;m -MACCHIA Giovanni;1757;2N;30;BA;000857;0;3537;m -MACCHIATI Massimo;2086;CM;30;AP;000153;0;3538;m -MACCHIETTINI Pierang;1706;2N;30;MI;090743;0;3539;m -MACCHIETTO Flavio;2064;CM;30;MI;000364;0;3540;m -MACCHINIZZI Elio;1789;1N;30;MI;150861;0;101646;m -MADASCHI Patrizio;2000;CM;30;BG;000362;0;3542;m -MADECCIA Domenico;1667;2N;30;RM;010160;0;104361;m -MADEDDU Luigi;1700;2N;30;RM;000655;0;3544;m -NAEGELE Raimund;1817;1N;30;BZ;161162;0;101950;m -MAESANO Marco;1712;2N;30;FE;000362;0;3546;m -MAESTRI Alessandro;1598;2N;30;BZ;001052;0;3547;m -MAESTRI Roberto;1609;1N;30;VE;000846;0;105930;m -MAESTRINI Enrico;2060;CM;0;MI;170670;807044;3549;m -MAFFEI Umberto;1439;2N;30;RM;021039;0;3550;m -MAFFEZZOLI Massimo;2031;CM;30;MN;000160;0;3551;m -MAFFIZZIOLI Daniele;2000;CM;30;MN;000154;0;3552;m -MAFFUCCI Alessandro;2086;CM;0;PT;110456;808733;102900;m -MAGALOTTI Andrea;2112;-M;0;RN;010561;803723;118692;m -VIGLIELMO Bruno;1700;2N;30;RM;180934;0;3555;m -MAGAROTTO Walter;1688;2N;30;CN;290358;0;106836;m -MARAZZI Maurizio;1700;2N;30;RE;011077;0;3557;m -MAGGI Devan;1900;1N;30;MI;000968;0;3558;m -MAGGINI Vladimiro;1700;2N;30;TO;001146;0;3559;m -CHIERICI James;1613;2N;30;RE;260157;0;105115;m -MAGINI Fabio;2006;CM;30;FI;100952;0;102093;m -MAGLIO Maurizio;1820;1N;30;MI;131167;0;3562;m -MAGNANI Carlo;1703;2N;30;MI;000661;0;3563;m -MAGNANINI Silvio;1900;1N;30;MI;000041;0;3564;m -MAGNI Cristiano;1700;2N;30;MI;000468;0;3565;m -MAGNIFICO Giuseppe;2021;CM;30;TO;251147;0;102208;m -MAGON Erio;1837;1N;30;RO;250858;0;103571;m -MAGRIN Antonio;2030;-M;0;VI;100823;803243;112647;m -MAGRINI Riccardo;2181;FM;0;MI;241141;800503;103559;m -MAGUIRE Richard;1900;1N;30;FI;000063;0;3570;m -MAIETTI Giuseppe;1802;1N;30;LT;220155;0;104943;m -MAINETTI Enrico;2000;CM;30;BS;000161;0;3572;m -MAIO Gaetano;1867;1N;30;SA;000350;0;3573;m -MAIO Matteo;2072;CM;0;FC;080576;809438;111509;m -MAIO Raffaele;1852;1N;30;SA;000052;0;3575;m -MAIOLI Alessandro;1634;1N;30;FC;001263;0;3576;m -MAIONE Raffaele;1640;2N;30;NA;000955;0;3577;m -MAIR Christoph;2081;CM;0;BZ;210276;811580;101530;m -MAIRO Marco;1679;1N;30;GE;110660;0;3579;m -MAISTRI Oscar;1790;2N;30;TN;200752;0;100049;m -MALAGUTI Mario;1997;1N;30;MO;051262;0;106573;m -MALAN Domenico;1661;2N;30;RM;210151;0;3582;m -MALANO Francesco;2020;CM;0;TO;260847;805793;102185;m -MALEK Dellair;2122;CM;0;PG;030662;803634;3584;m -MALETTA Francesco;1622;2N;30;FI;001147;0;3585;m -MALFAGIA Andrea;2277;FM;0;PG;260760;801941;105462;m -MALGAROLI Luciano;2185;CM;30;TO;000657;0;3587;m -MALIZIA Massimo;1700;2N;30;RM;000774;0;3588;m -MALLONI Marcello;2276;-M;0;RM;201170;802956;106219;m -MALTEMPI Angelo;1745;1N;30;PG;201056;0;109751;m -BERTOLI Franco;1700;2N;30;MO;160254;0;100194;m -MAMBRINI Augusto;2160;CM;0;MO;130755;804568;103210;m -MAMMANA Giuseppe;1808;1N;30;CT;000463;0;3593;m -MAMMANI Giuliano;1700;2N;30;BL;000547;0;3594;m -MAMMOLA Dino;2116;CM;30;TO;120352;0;102289;m -MANCA Federico;2425;IM;0;PD;060569;800171;106783;m -MANCINI Giustino;2020;CM;0;RM;131257;806285;3597;m -MANDANICI Salvatore;1676;2N;30;PV;0;0;3598;m -MANDATO Vittorio;1759;1N;30;CE;230221;0;100401;m -MANDOSIO Franco;1705;1N;30;TO;001135;0;3600;m -MANFRE' Dante;1661;2N;30;PD;210150;0;3601;m -SANTANGELO Riccardo;1580;2N;30;MI;161278;0;109296;m -MANGANELLI Gianpaolo;2056;CM;0;RM;090760;810320;104511;m -MANGIAFICO Salvatore;1613;2N;30;SR;260563;0;106605;m -MANGUSO Mauro;2054;CM;30;NA;190362;0;102709;m -MANICARDI Andrea;1886;1N;30;MO;270871;0;101923;m -MANINI Eugenio;2000;CM;30;MI;000864;0;103507;m -MANNA Luigi;1875;1N;30;BN;000551;0;3608;m -MANNO Salvatore Dome;2069;CM;30;NA;071258;0;102075;m -MANNO Vincenzo;1631;2N;30;RM;030937;0;116354;m -MANTOVANI Adriano;1613;2N;30;VR;270655;0;3611;m -MANTOVANI Marco;1937;CM;30;PR;110978;0;108167;m -MANTOVANI Renzo;2370;IM;0;VA;020464;800198;104713;m -MANTZAVINOS Costanti;1625;2N;30;FI;000471;0;3614;m -MANUCCI Antonio;1700;2N;30;FC;001042;0;3615;m -MANUNTA Andrea;1882;1N;30;TO;000073;0;3616;m -MANUNTA Roberto;1739;2N;30;SS;221074;0;3617;m -MANZARDO Bruno;2095;-M;20;TO;060742;0;100001;m -MANZO Giuseppe;1685;2N;30;LE;000469;0;3619;m -MANZONI Alessandro;2074;CM;0;MI;280260;811076;104603;m -MANZOTTI Francesco;1700;2N;30;MI;000968;0;3621;m -MARAFIOTI Gregorio;1900;1N;30;AL;000056;0;3622;m -MARAN Fabio;1849;1N;30;UD;250968;0;105929;m -MARAN Mauro;1646;2N;30;PD;000258;0;3624;m -MAZZETTA Renato;1822;1N;0;TO;090266;817643;112264;m -MAZZINI Antonio;2106;CM;0;MI;240650;809691;106915;m -MAZZINI Gianbattista;1703;2N;30;SV;270570;0;3627;m -MAZZINI Mauro;2060;CM;30;MS;020570;0;103660;m -MAZZIOTTO Nicola;1706;2N;30;RM;040468;0;102744;m -MAZZON Roberto;1843;1N;30;VA;150851;0;104534;m -MAZZONI Guido;1838;1N;30;TE;230264;0;104684;m -MAZZOTTI Carlo;2091;CM;0;MI;110566;806153;101715;m -MAZZUCHELLI Mario;2000;CM;30;MO;000861;0;3633;m -MECALI Antonello;1700;2N;30;RM;000562;0;3634;m -MECO Romano;1900;1N;30;RM;000863;0;3635;m -MEDO Hrustic;1700;2N;30;RM;000365;0;3636;m -MEDONE Bruno;1763;2N;30;GE;010459;0;3637;m -MEGARO Carmine;1352;2N;30;BN;141037;0;111507;m -MEGLI Massimo;1711;CM;30;FI;240859;0;102101;m -MEGNA Salvatore;1670;2N;30;NA;041075;0;3640;m -MELA Riccardo;2039;CM;0;IM;060155;809373;3641;m -MELE Quirino;2057;CM;30;NA;040660;0;102076;m -MELEGA Gianluigi;1661;2N;30;RM;000135;0;3643;m -MELILLO Carmine;1819;CM;30;CE;001059;0;3644;m -MELLE Ezio;1789;1N;30;PU;191161;0;109199;m -MELLO-CERESA Emilian;1900;1N;30;VC;000850;0;3646;m -MELLONI Fabrizio;1745;2N;30;RO;161152;0;103564;m -MELONI Marco;1700;2N;30;RM;000976;0;117440;m -MELOTTI Dario;2116;CM;0;MI;280865;813680;100035;m -MENCHETTI Carlo;1865;1N;30;LU;240256;0;106060;m -MENONI Vincenzo;2241;-M;0;PR;161157;804576;105143;m -MENOZZI Claudio;1942;1N;30;MI;260465;0;117573;m -MENSURATI Stefano;2000;CM;30;RM;000759;0;3653;m -MEO Sandro;2166;-M;20;RM;000734;0;3654;m -MERAVIGLIA Alberto;1708;1N;30;MI;260759;0;100880;m -MERCATANTI Pierluigi;1587;2N;30;CT;000847;0;3657;m -MERCANDELLI Claudio;2028;CM;0;SV;051164;820709;102605;m -MERENDINO Riccardo;1879;1N;30;PA;100957;0;100427;m -MERICO Nicola;1700;2N;30;BA;301061;0;3660;m -MERLINI Lino;1903;1N;30;BG;181240;0;101709;m -MERLINI Osvaldo;1712;2N;30;MI;201065;0;101718;m -MESACCI Roberto;1900;1N;30;FC;000053;0;3663;m -MESEV Tinco;1796;2N;30;PC;070959;0;111272;m -MESSA Roberto;2305;IM;0;BS;110357;800457;101268;m -MESSINA Enrico;2159;CM;0;NA;150771;803839;107243;m -MESSINA Giuseppe;1679;2N;30;PA;220157;0;104169;m -MESSINA Guido;1676;2N;30;PA;000325;0;3668;m -MESSINA Igor;1913;1N;30;TP;040181;0;108674;m -MESSINA Ottavio;2025;CM;0;EN;270671;816477;109631;m -MESSINA Roberto;1700;2N;30;VC;220550;0;104558;m -MESSINEO Francesco;1847;1N;30;AP;000856;0;3672;m -MESSNER Alexander;1700;2N;30;BZ;200278;0;3673;m -BUSSO Giovanni;1613;2N;30;TO;210438;0;113626;m -METRANGOLO Antonio;2141;CM;0;PI;180262;810215;103475;m -MICALIZZI Giovanni;2232;-M;0;RM;280863;802360;3676;m -MICCOLI Livio;1739;2N;30;NN;000168;0;113698;m -MICHELENA Rodolfo;1907;1N;30;RM;020947;0;3678;m -MICHELI Angelo;1622;2N;30;RM;000640;0;3679;m -MICHELI Carlo;2290;FM;0;BZ;150946;800414;104476;m -MICHELOTTI Fabio;1909;1N;30;CT;000062;0;3681;m -MICHIELI Giorgio;1900;1N;30;CR;090829;0;106117;m -MICHIELON Giuseppe;1670;2N;30;MI;000269;0;3683;m -MIELE Rosario;1685;2N;30;RM;000464;0;3684;m -MIELI Marcello;2074;CM;0;MI;220174;1306863;100702;m -MIGLIARDI Giovanni;2100;CM;30;TO;001047;0;3686;m -MIGLIETTA Marco;1882;1N;30;SV;141267;0;105201;m -MIGLIETTA Renzo;1900;1N;30;AL;000067;0;3688;m -MIGNONE Marco;1900;1N;30;PG;260349;0;103882;m -MILAN Mauro;1694;2N;30;CL;000453;0;3690;m -MILANESI Bruno;1954;CM;30;NA;000318;0;109971;m -MILANESIO Pietro;1855;1N;30;CN;010556;0;109657;m -MILANI Oscar;1682;1N;30;LC;080360;0;117155;m -MILAZZO Mario;2110;CM;30;VI;000952;0;3694;m -MILESI Gianmaria;2145;CM;30;RM;001260;0;3695;m -MILETO Gabriele;2189;-M;0;VE;010159;801755;107524;m -MILITELLO Vincenzo;1858;CM;30;PA;190959;0;128698;m -MILLIN Paolo;2004;CM;30;BO;250727;0;105339;m -MILOCCO Franco;2350;FM;0;UD;250660;800155;100651;m -MILORO Giorgio;1900;1N;30;PN;130558;0;102027;m -MIMMO Giuseppe;1810;1N;30;FG;000571;0;3701;m -MINARELLI Guido;2250;-M;0;RA;220360;801003;102239;m -MINERVA Enzo;2060;CM;0;NO;160962;807885;104715;m -MINETTO Gianfranco;1871;1N;30;VE;000549;0;3705;m -MINETTO Simone;1775;2N;30;VE;140978;0;3706;m -MINGARDI Marcello;2000;CM;30;TN;040152;0;101276;m -MINGIONE Giuseppe;1622;2N;30;TO;001256;0;111375;m -MINI' Salvatore;1514;2N;30;GE;100241;0;109685;m -MINIERI Filippo;2155;CM;0;BG;230655;806390;114056;m -MINIKH Eduard;2048;CM;0;AG;240473;812315;108781;m -MINNITI Enza;1831;1N;30;BS;001157;0;3712;f -MINNUCCI Andrea;1700;2N;30;FR;001268;0;3713;m -MINUTELLO Stefano;1691;2N;30;UD;001273;0;3714;m -MIOLO Lino;1612;2N;30;VI;020126;0;104490;m -MIONE Dario;2254;FM;0;BG;280675;806625;101668;m -MIOTTO Alessandro;2072;CM;30;TV;001259;0;103942;m -MIOTTO Roberto;2044;CM;30;VE;000561;0;3718;m -MIRULLA David;1963;1N;30;FI;000069;0;3719;m -MISCIASCI Sandro;1700;2N;30;TV;260861;0;112500;m -MISERICORDIA Antonio;1864;1N;30;TR;000652;0;3721;m -MISIANO Franco;2268;-M;0;MI;150967;804746;3722;m -MISTRETTA Domenico;1694;2N;30;MI;000659;0;3723;m -MITCHELL Luciana;1610;2N;30;RM;000331;0;3724;f -CALDERARO Vito;1700;2N;30;SA;230974;0;3725;m -MOCCHI Tullio;2243;FM;0;TS;310364;806889;103797;m -MODESTINO Marco;1688;2N;30;RM;000762;0;3727;m -MOGRANZINI Roberto;2352;FM;0;PG;060183;810894;105831;m -MOHAR Antonio;1900;1N;30;BG;001043;0;3729;m -MOLA Pietro;2279;FM;0;FI;121075;804665;103477;m -MOLENA Paolo;1571;2N;30;PD;150251;0;104031;m -MOLINA Fabrizio;2276;FM;0;BO;080365;805637;105461;m -MOLINARI Mario;2175;CM;0;SV;200363;805262;105203;m -MOLLING Patrick;2000;CM;30;BZ;041265;0;112128;m -MOLINO Francesco;1858;1N;30;ME;301148;0;105386;m -MOLLERO Michele;2176;CM;0;GE;250178;806358;101323;m -MOLLO Ernesto;1847;1N;30;NA;311260;0;102784;m -MOLON Andrea;1876;1N;30;VI;270668;0;106581;m -MONICO Gianfranco;2000;CM;30;MI;190855;0;109142;m -MONACO Alfredo;1856;CM;30;NA;000856;0;3740;m -MONACO Paolo;1850;1N;30;LC;150778;0;3741;m -MONCELLI Giorgio;2147;-M;0;TO;010450;801852;102288;m -MONCHER Stefano;2157;-M;0;TN;180861;806021;101269;m -MONDINI Luigi;2040;CM;30;VE;000557;0;3745;m -MONETA Riccardo;1900;1N;30;RM;150551;0;102148;m -MONICA Vincenzo;1523;2N;30;SR;211146;0;103674;m -MONNI Alessandro;1694;2N;30;CA;180471;0;108931;m -MONNO Luigi;1481;2N;30;TO;210142;0;103009;m -MONOPOLI Riccardo;2117;CM;30;SP;000859;0;3750;m -MONTAGNA Fabrizio;2000;CM;30;VR;000156;0;3751;m -MONTANARI Carlo;1882;1N;30;VE;220445;0;106349;m -MONTANELLI Antonio;2091;CM;0;VR;121248;812331;104919;m -MONTANI Francesco;2217;-M;0;MI;260263;813397;113406;m -MONTARULI Roberto;1892;1N;30;MI;230566;0;104000;m -MONTECCHI Ugo;2085;CM;0;RM;190870;808156;113913;m -MONTELEONE Antonio;2169;CM;0;RM;260764;804363;100351;m -MONTEU Domenico;1900;1N;30;TO;000051;0;3758;m -MONTI Pietro;1903;1N;30;CO;000666;0;3759;m -MERCIAI Anna;2005;CM;0;FI;;801526;3760;f -MONTOLI Marco;2089;CM;30;MI;000253;0;3761;m -MORA Federico;2260;-M;0;VI;220170;802549;109105;m -MORA Massimo;1847;1N;30;TN;190267;0;102760;m -MORACE Vitaliano;1592;2N;30;NA;001128;0;3764;m -MORALES Alessandro;1640;2N;30;RM;000664;0;3765;m -MORANA Giorgio;1532;2N;30;SI;;0;3766;m -MORANDI Maurizio;2072;CM;0;MO;040559;804088;104529;m -MORANDO Enrico;1963;1N;30;MI;120660;0;110288;m -MORDIGLIA Riccardo;2110;CM;0;TO;050368;804703;102203;m -MORELLI Umberto;1556;2N;30;FE;250934;0;118056;m -MORGANTI Marco;1688;2N;30;FI;000560;0;3771;m -MORI Andrea;2034;CM;30;TO;210361;0;120437;m -MORINI Fabio;1819;1N;30;PG;001153;0;3773;m -MORINI Glauco;1775;2N;30;PR;000659;0;3774;m -MORISI Eugenio;1835;1N;30;RM;221051;0;3775;m -MORO Angelo;1673;2N;30;BR;000567;0;3776;m -MORODER Stefan;2027;CM;30;BZ;201280;0;3777;m -MORODER Thomas;2168;CM;0;BZ;140379;804916;3778;m -MOSCA Leonildo;2131;CM;0;VE;310356;808873;103355;m -MOSCA Stefano;2170;-M;20;VE;001159;0;3780;m -MOSCARELLI Giacomo;1661;1N;30;PA;130929;0;109582;m -MOSCATELLI Alessandr;1718;2N;30;CO;000372;0;3783;m -MOSCATIELLO Annamari;1676;2N;30;MO;000657;0;3784;f -MOSCATO Alessandro;1700;2N;30;AT;000375;0;3785;m -MOSCATO Michele;1634;2N;30;RM;000454;0;3786;m -MOSCHINI Costantino;1601;2N;30;VI;100154;0;101555;m -MOSCON Otto;1631;2N;30;BZ;000542;0;3788;m -MOSNA Alessandro;1948;CM;30;TN;210865;0;101270;m -MOSNA Stefano;2149;CM;0;TN;180668;802760;101271;m -MOTTA Agostino;1591;1N;30;AL;180423;0;106380;m -MOTTA Dario;1943;1N;30;BG;160175;0;109534;m -MOYSE Nigel John;2054;CM;0;MO;020858;802514;110046;m -MUCCI Giuseppe;1966;1N;30;BA;001063;0;3794;m -MUCCIO Giorgio;2088;CM;30;RM;001262;0;3795;m -MUGELLI Paolo;2000;CM;30;FI;000456;0;3796;m -TUDISCO Salvatore;1730;2N;30;TP;061288;0;107108;m -MULA Stefano;1900;1N;30;CA;000768;0;3798;m -MUNAFO' Pietro;2005;CM;30;ME;310564;0;101494;m -MUNARETTO Roberto;1688;2N;30;MI;180865;0;101760;m -MURARO Alberto;2045;CM;30;BO;201259;0;123461;m -MURATORI Michele;1900;1N;30;BO;001065;0;3802;m -MURERO Andrea;1900;1N;30;UD;200952;0;3803;m -MURGIA Andrea;2063;-M;0;PV;311061;800635;104911;m -MURGIA Roberto;1751;2N;30;PA;300456;0;127047;m -MURGIA Stefano;2000;CM;30;CA;000660;0;3806;m -MOUSSA Ibrahim;1840;1N;30;PV;001063;0;3807;m -MUSCO Ilia;1778;1N;30;TS;010375;0;106525;m -MUSCOLINO Attilio;2122;CM;0;BZ;290136;808032;101524;m -MIRRA Guglielmo;1879;1N;30;NA;0;0;3810;m -MUSOLINO Paolo;2000;CM;30;RC;000158;0;3811;m -MUSSAP Angelo;2082;CM;0;CR;220349;818348;107527;m -MUSSINI Giovanni;1811;1N;30;RE;081063;0;105122;m -MUSSO Benito;1649;2N;30;NN;000429;0;3814;m -MUSSO Luciano;2021;CM;30;VC;081054;0;104549;m -MUSSO Marco;1984;1N;30;TO;000863;0;3816;m -MUSSO Maurizio;2023;CM;30;TO;001262;0;3817;m -MUSSO Mauro;1894;1N;30;TO;001255;0;3818;m -MUSSO Roberto;1804;1N;30;MI;000453;0;100560;m -MUSSONI Marcello;2201;-M;0;UD;250261;807974;103727;m -MUSUMECI Maurizio;2014;CM;30;AL;000160;0;3821;m -MUSUMECI Valentino;1748;1N;30;PV;001043;0;106079;m -NADDEI Luca;1700;2N;30;TO;000670;0;3823;m -NAEGELE Norbert;1760;2N;30;BZ;240365;0;101951;m -NAGNI Marco;1673;2N;30;AN;181157;0;104743;m -TERNI Daniele;1580;3N;30;PO;0;0;107584;m -NAHUM Sembira Albert;1900;1N;30;FI;000061;0;3827;m -NANNELLI Paolo;2182;-M;0;FI;130367;804991;101395;m -NAPOLI Ferdinando;1817;1N;30;MI;000157;0;100727;m -NAPPI Eugenio;1924;CM;30;BA;210957;0;117147;m -CANNIZZARO Alessandr;1634;2N;30;RE;270884;0;105138;m -NARAIN Ram Deva;1729;1N;30;RM;000217;0;3832;m -NARDACCI Roberto;1625;2N;30;RM;000457;0;3833;m -NARDELOTTO Oscar;1637;2N;30;TV;050448;0;107820;m -NARDONE Massimo;1902;1N;0;MI;100963;818380;120333;m -NASTRELLI Roberto;1876;1N;30;GE;300868;0;117122;m -NATALE Alfredo;2155;CM;0;CE;210959;805092;100406;m -NATALUCCI Fabrizio;2203;-M;0;MI;171054;800740;100162;m -NATOLI Domenico;1933;CM;0;PA;280751;806277;112465;m -NATOLI Marco;1900;1N;30;PA;230170;0;113711;m -NATTA Luciano;2071;CM;0;IM;070158;810380;105083;m -NAVARRA Giorgio;1628;2N;30;PD;080568;0;103231;m -NAVARRO Emanuele;2172;-M;0;PD;191279;811963;107197;m -NAZZANI Alessandro;1688;2N;30;GE;220863;0;101351;m -NEGRA Massimiliano;1891;CM;30;PD;050626;0;104032;m -NEGRI Jacopo;1880;1N;30;MC;200170;0;104740;m -NEGRI Luigi;1544;2N;30;MI;190652;0;107759;m -NEGRINI Claudio;2305;FM;0;BO;110567;802590;105463;m -NEGRINI Matteo;1835;1N;30;MI;050872;0;109523;m -NEGRISOLI Aldo;1619;2N;30;MI;101264;0;107760;m -NEGRO Francesco;1706;2N;30;LE;001264;0;3851;m -NEGRO Pierguido;2055;CM;30;TO;000952;0;3852;m -NEGRO Roberto;2170;-M;20;VI;090470;0;109106;m -NELLI Luca;2206;-M;0;MS;150265;811564;103661;m -NERI Alberto;1894;1N;30;FI;021269;0;102901;m -NERI Alvaro;1652;2N;30;LU;200449;0;103637;m -NERI Angelo;1981;CM;0;MI;181030;807508;101753;m -NESI Carlo;1682;2N;30;PT;101050;0;102902;m -NESSI Silvio;2012;CM;30;MI;151158;0;100872;m -NICCOLINI Giorgio;1900;1N;30;TO;000942;0;3860;m -NICOLAI Antonio;1750;1N;0;RM;301040;817287;119335;m -NICOLETTI Bruno;1900;1N;30;VE;231068;0;115497;m -NICOLETTI Francesco;1984;1N;30;RC;171160;0;101172;m -NICOLIS Claudio;1845;1N;0;GE;080651;817295;105161;m -NICOLO' Filippo;2125;CM;0;MI;200272;808199;106919;m -NICORA Paolo;2117;CM;0;GE;061052;816086;111412;m -NIEDDU Enrico;1730;2N;30;VE;000471;0;3867;m -NIEDERSTATTER Harald;2111;CM;0;BZ;130162;805874;101533;m -NIETO Alberto;1721;2N;30;TV;001064;0;3869;m -NIEUS Thierry;2201;CM;0;SO;040273;812595;107493;m -SCIALLA Nicola;1563;3N;30;GR;290838;0;105320;m -NIKOLAJEVICH Tihiomi;1750;1N;30;SV;120448;0;109411;m -NIRO Raffaele;1936;CM;30;NA;000664;0;3873;m -NITSCH Carlo;1751;2N;30;NA;120176;0;3874;m -NITTI Francesco;2100;CM;30;BA;001154;0;109261;m -NIZZOLA Alessandro;2086;CM;30;MN;010968;0;101173;m -NOBILE Emanuele;1900;1N;30;BS;000450;0;3877;m -NOBILE Giancarlo;1904;1N;30;CT;090865;0;105727;m -NOBILE Salvatore;1499;2N;30;RM;190718;0;100267;m -NOCENTINI Renato;1834;1N;30;PG;190755;0;114660;m -NODARI Andrea;1610;2N;30;TN;210765;0;102766;m -NONNI Alessio;1924;1N;30;RM;000266;0;118285;m -NORSCINI Stefano;1700;2N;30;AP;001155;0;111443;m -NOSENGO Paolo;2235;CM;0;AT;020655;803510;105291;m -NOVARIA Ivan;1760;1N;30;TO;000858;0;3885;m -NOVELLI Cristiano;2145;CM;0;LU;020773;824097;103478;m -NTUK Effiong;1685;2N;30;TO;001163;0;3887;m -NUCCI Gilberto;1889;1N;30;PU;000263;0;109214;m -NUCCI Luciano;1931;1N;0;RM;161153;818038;121482;m -NUCERA Carmelo;1843;1N;30;RC;000854;0;3890;m -NUDO Walter;1712;2N;30;CS;000766;0;3891;m -NUNNARI Massimo;1852;1N;30;RE;000956;0;3892;m -OBERHAMMER Gunther;1814;1N;30;BZ;;0;113719;m -OBERRAUCH Martin;2185;CM;0;BZ;260979;805068;3894;m -OBERSTEINER Stefan;1646;2N;30;BZ;000772;0;3895;m -OCCARI Maurizio;2082;CM;30;FE;211259;0;102236;m -OCCHIGROSSI Fausto;2000;CM;30;RM;000556;0;3897;m -OCCHIONI Edmondo;1874;1N;30;RM;001262;0;3898;m -OCCHIPINTI Massimo;2030;CM;0;RM;241160;811467;102650;m -ODICINO Walter;2000;CM;30;AL;200554;0;106381;m -ODINE Alberto;1852;1N;30;TO;200748;0;104821;m -OLEARI Jaures;1745;2N;30;RE;000550;0;3902;m -OLGIATI Massimiliano;1903;1N;30;PN;000079;0;3903;m -OLIVETTI Pierluigi;1805;1N;30;GE;310370;0;101347;m -OLIVIERI Alessandro;1900;1N;30;PR;000047;0;116035;m -OLIVIERI Claudio;1952;1N;30;MI;251076;0;102396;m -OLIVOTTO Roberto;2155;-M;20;GO;001050;0;3907;m -ONESTO Roberto;1507;1N;30;VE;001159;0;120244;m -ONETO Giuliano;1900;1N;30;GE;290365;0;3909;m -ONGARELLI Marco;2163;CM;0;AL;030860;810479;101218;m -ONGARO Giorgio;1955;CM;30;TV;001151;0;3911;m -ONOFRI Erri;2018;CM;30;RA;050453;0;111510;m -ONORI Ermenegildo;1963;1N;30;RM;000161;0;3913;m -OPPICI Gabriele;2055;CM;0;MN;010153;806366;101174;m -ORAZI Carlo;1691;2N;30;LT;160266;0;107274;m -OREFICE Nino;1885;1N;30;NA;070559;0;102707;m -ORFEI Rolando;2059;CM;0;MO;221268;822779;115348;m -ORGERA Luciano;1741;1N;30;TO;201248;0;109346;m -ORGERA Reginaldo;1934;CM;30;TO;010437;0;112599;m -ORI Marco;2100;CM;0;RA;171164;805050;109431;m -ORLANDELLA Orlando;2027;CM;30;TR;270958;0;101899;m -ORLANDI Claudio;1723;1N;30;GE;110956;0;111900;m -ORLANDINI Enrico;1487;2N;30;AN;300129;0;104745;m -ORLANDO Luigi;1909;CM;30;MI;071259;0;107701;m -ORMELLA Daniele;1637;2N;30;VB;310765;0;110464;m -ORO Andrea;1673;2N;30;TO;000665;0;3926;m -OROFINO Fabio;1583;2N;30;NA;261065;0;106626;m -ORSI Massimiliano;2025;CM;0;MI;030866;811092;106176;m -ORSINGHER Diego;1700;2N;30;TN;001049;0;3929;m -ORSINI Ivo;1543;1N;30;RM;000220;0;3930;m -OTTANI Gianni;1900;1N;30;BO;000050;0;3931;m -OTTAVI Marco;2017;CM;0;RM;110765;809934;110170;m -OTTAVIANI Gianluca;1963;1N;30;FR;000973;0;3933;m -OTTOLINI Graziano;2084;CM;0;MI;280659;808210;102557;m -PACCHIARINI Marco;2000;CM;30;FI;030156;0;107984;m -PACCOIA Claudio;1932;CM;30;PG;000359;0;115089;m -CANTE Guido;1781;2N;30;GR;120568;0;3937;m -PACE Roberto;2061;CM;0;MI;130362;808202;100887;m -PACI Daniele;2193;CM;0;AP;040469;818801;117372;m -PACI Stefano;2106;CM;0;AP;061265;819840;113623;m -PACIFICI Gianfranco;1823;1N;30;FR;000153;0;3941;m -PACINI Dalmazio;1682;2N;30;PU;0;0;3942;m -PACOL Alfredo;1763;2N;30;MI;001266;0;3943;m -PADOLECCHIA Mauro;1700;2N;30;RM;000860;0;3944;m -PADOVAN Antonio;1616;2N;30;VI;001052;0;123998;m -PADOVANI Manrico;1703;2N;30;FI;001068;0;3946;m -PAGANELLI Roberto;2012;CM;30;PT;280754;0;3947;m -PAGANI Marco;1900;1N;30;MI;000059;0;3948;m -PAGANO Luigi;1912;1N;30;NA;000553;0;3949;m -PAGANO Nunzio;2030;CM;0;RM;280154;806501;108782;m -PAGANO Sergio M.;2221;-M;0;RM;281259;803642;3951;m -PAGANO Sergio;2033;CM;0;NA;150160;813583;100352;m -PAGGIARO Luca;2049;CM;0;VE;101162;821691;106350;m -PAGIN Giacomo;1829;1N;30;VE;130776;0;103079;m -PAGLIARINI Altivio;1568;2N;30;RM;000926;0;3955;m -PAGLIAROLI Paolo;2072;CM;30;RM;100756;0;102156;m -PAGLIARULO Filippo;1900;1N;30;BN;000262;0;3957;m -PAGLIETTI Nicola;2293;FM;0;RM;110365;800147;108154;m -PAGNONCELLI Marco;2129;-M;0;MI;290178;804924;103560;m -PAGNOTTA Giuseppe;1472;2N;30;NA;010153;0;101064;m -PAGNUTTI Lorenzo;2047;-M;0;UD;060443;818399;103725;m -PAIZIS Adamantia;2090;CM;0;MI;301172;801496;3963;f -PAJER Walter;1817;1N;30;PN;130171;0;109585;m -PALA Giorgio;2105;CM;30;LU;001153;0;3965;m -PALAMIDES Carmine;1903;1N;30;VT;040556;0;101903;m -PALETTA Giuseppe;1670;2N;30;CZ;180651;0;3967;m -PALLI Giampaolo;2000;CM;30;MO;260860;0;104195;m -PALMA Mauro;1718;2N;30;MI;090956;0;100085;m -PALMIOTTO Fiorentino;2104;-M;0;BO;090429;803146;102084;m -PALOMBI Roberto;2040;-M;0;RM;160534;806820;3971;m -PALTRINIERI Daniele;2018;CM;30;CH;000255;0;109264;m -PANCIERA Fabio;1783;1N;0;PD;090861;824860;114107;m -PANDINI Giuseppe;1625;2N;30;MI;050459;0;102397;m -PANDOLFI Emer;1661;2N;30;MI;000363;0;3975;m -MAGGIO Steve;1805;1N;30;SA;030880;0;107003;m -PANECALDO Marco;1915;1N;30;RM;230958;0;111681;m -PANELLA Sergio;1742;2N;30;FI;000161;0;3978;m -PANETTI Maurizio;1726;1N;30;RM;000453;0;3979;m -PANGOS Lucio;1779;2N;30;FI;000254;0;3980;m -PANGRAZZI Marco;2245;-M;0;TN;191259;800899;101272;m -PANICHELLI Benedetto;2014;CM;30;MC;090954;0;104580;m -PANNULLO Pierpaolo;1601;2N;30;GE;240357;0;100380;m -PANTALEONI Claudio;2222;-M;0;BO;010456;800945;101599;m -PANTALEONI Leone;1811;1N;30;PU;201145;0;101837;m -PANTALONE Marcello;2009;CM;30;TO;011056;0;102279;m -PAOLETTI Giancarlo;1796;1N;30;TS;271257;0;103799;m -PAOLI Mario;1772;1N;30;TO;060354;0;102812;m -PAOLI Paolo;1549;2N;30;BL;281240;0;103156;m -PAOLI Walter;2012;CM;30;MO;020760;0;100203;m -PAOLINI Marco;1972;1N;30;CN;000454;0;3991;m -PAOLINI Maurizio;1721;2N;30;TO;000459;0;3992;m -PAONE Maurizio;1858;1N;30;CZ;310365;0;121326;m -PAPA Giorgio;1658;2N;30;RM;311059;0;125242;m -PAPA Pasquale;1649;1N;30;LE;251165;0;103010;m -PAPA Richard;1885;1N;30;BZ;000573;0;3996;m -PAPARELLA Pasquale;1700;2N;30;RM;000554;0;3997;m -PAPETTI Francesco;1796;1N;30;RM;290360;0;107275;m -PAPI Alesssandro;1691;2N;30;RM;0;0;3999;m -PAPPALARDO Paolo;2089;CM;30;MI;221071;0;101719;m -PARADISI Giovanni;1595;2N;30;SI;000770;0;4001;m -PARAVELLA Tiziano;1897;1N;30;BG;110759;0;100903;m -PARENTE Giuseppe;1688;2N;30;FR;290767;0;103749;m -PARENTI Alessandro;2074;CM;30;FI;000645;0;4004;m -PARENTI Horacio;1945;1N;30;TN;120934;0;114403;m -PARIGI Riccardo;2024;CM;30;FI;170958;0;101404;m -PARISE Mariano;1664;2N;30;NA;301154;0;108767;m -SPETRINI Luca;1583;2N;30;SA;220968;0;102699;m -PARISI Matteo;1700;2N;30;GE;060378;0;105159;m -PARMENTOLA Sergio;1951;1N;30;TO;000957;0;4010;m -PARODI Gian Mario;1679;2N;30;GE;000560;0;4011;m -PAROLINI Ambrogio;2214;CM;0;MI;270157;812609;100170;m -PAROLINI Ivan;1685;2N;30;MI;0;0;4013;m -PARRELLA Alfredo;2137;-M;0;BN;310361;803944;101962;m -PARRINI Fabio;1900;1N;30;PG;000563;0;4015;m -PARRINO Giuseppina;1934;1N;30;RM;141169;0;104515;f -PARSI Marcello;1703;2N;30;RM;000747;0;4017;m -PASCALI Frederic;1822;1N;30;BA;140266;0;107168;m -PASCARELLI Andrea;2093;CM;0;SA;290956;808946;114421;m -PASCIUTO Alessandro;1900;1N;30;RM;000456;0;4020;m -PASOLINI Claudio;2000;CM;30;MN;010548;0;101176;m -PASQUALIN Giorgio;2130;CM;30;TV;070658;0;106488;m -PASQUALUCCI Colombo;1916;1N;0;LT;290868;812790;106222;m -PASQUI Silvio;1900;1N;30;PG;000559;0;4024;m -PASQUINI Mario;2002;CM;30;AR;310551;0;107594;m -PASQUINO Maurizio;1910;CM;30;MI;000655;0;4026;m -PASSERI Luigino;1878;CM;30;TO;000454;0;4027;m -PASSEROTTI Pierluigi;2317;FM;0;RM;090654;800309;106009;m -PASSONI Carlo;2251;-M;0;MI;101257;801143;102420;m -PASTA Pietro;1703;2N;30;CE;010252;0;100407;m -PASTORE Mauro;1718;2N;30;PD;111258;0;4031;m -PASTORE Pietro;2015;CM;30;NA;000151;0;4032;m -PASTORINI Mario;2170;-M;0;MS;070557;800759;103648;m -PASTRELLO Gabriele;1900;1N;30;BO;001041;0;4034;m -PASTRES Roberto;2104;-M;0;VE;150562;801283;103081;m -PATAVIA Antonio;2083;CM;0;LE;020962;803596;105377;m -PATELLI Alessandro;2219;-M;0;SI;061258;804657;107574;m -PATETE Enrico;1661;2N;30;RM;000563;0;4038;m -PATRUCCO Carlo;1700;2N;30;MI;000358;0;4039;m -PATTAVINA Giovanni;1784;2N;30;SR;201276;0;4040;m -PAULMICHL Martin;2091;CM;0;BZ;040968;814920;117635;m -PAULUZZI Ennio;1900;1N;30;FI;000048;0;4042;m -PAUTASSI Dario;1823;1N;30;TO;230356;0;101995;m -PAVANELLO Roberto;1837;1N;30;PD;280158;0;113491;m -PAVARIN Massimo;1628;2N;30;RO;000263;0;4045;m -PAVONE Antonio;2014;CM;30;PA;000920;0;4046;m -PAVONE Silvano;1595;2N;30;EN;220257;0;109635;m -PAVONI Flavio;1888;1N;30;CO;081259;0;104842;m -PECCI Pierluigi;2039;CM;30;BO;000756;0;4049;m -PECE Alberto;1837;1N;30;RM;280553;0;113730;m -PECORARI Marcello;1948;1N;30;AQ;081162;0;107458;m -QUERCIOLI Riccardo;1940;1N;30;TS;150756;0;106519;m -PICCITTI Stefano;1900;1N;30;PG;000063;0;4053;m -PICCO Ruggero;2096;CM;0;UD;301262;811149;103728;m -PICHLER Antonio;1712;2N;30;BZ;000957;0;4055;m -PICHLER Michael;2015;CM;30;BZ;001172;0;4056;m -PICONE Franco;1870;1N;0;LU;040659;819867;103482;m -PIEDIMONTE Stefano;1661;2N;30;NA;000180;0;4058;m -PIEMONTESE Antonio;1900;1N;30;TO;000057;0;4059;m -PIEMONTI Carlo;2058;CM;0;LC;240463;825190;107046;m -PIENABARCA Nicola;2094;CM;0;RM;250262;806641;108894;m -PIERAGOSTINI Alessan;1700;2N;30;RM;000366;0;4062;m -PIERACCINI Carlo Alb;1881;CM;30;LU;230326;0;106852;m -PIERI Filippo;2210;-M;0;FI;241262;800465;102091;m -PIERONI Marco;1814;1N;30;GE;280264;0;100378;m -PIEROPAN Giorgio;1673;2N;30;VI;070370;0;115377;m -PIERRO Giuseppe;1939;1N;30;CS;131050;0;100908;m -PIETRALUNGA Nicola;2060;CM;0;MN;010164;804312;101234;m -PIETROBELLI Domenico;1679;2N;30;VI;000365;0;4069;m -PIGNANELLI Guido;2053;CM;30;MI;001063;0;4070;m -PILATO Marcello;1813;1N;30;PA;290667;0;109718;m -PILLA Giuseppe;2014;CM;30;CB;001158;0;115831;m -PINALI Luca;1682;2N;30;VR;130181;0;4073;m -PINI Loris;2100;CM;30;PD;270451;0;114419;m -PINI Mario;1894;1N;30;FI;000952;0;4075;m -PINNA Alessio;1894;1N;30;OR;060875;0;101462;m -PINO Gianfranco;2000;CM;30;GE;000252;0;4077;m -PINO Nicola;1832;1N;30;MI;060658;0;100129;m -PINTO Gaetano;1979;1N;30;NA;000765;0;119434;m -PINTON Maurizio;2090;CM;0;PD;260253;820075;121783;m -PIOMBINI Guglielmo;2000;CM;30;BO;000968;0;4081;m -PIOTTI Andrea;2065;CM;0;VA;040259;807478;104912;m -PIOVAN Lorenzo;1664;2N;30;PD;001074;0;4083;m -PIOVAN Mauro;1601;2N;30;PD;000858;0;4084;m -PIPITONE Antonio;1993;CM;0;PR;191126;804541;105879;m -PIRAS Giampietro;1744;1N;30;BO;000349;0;4086;m -PIRCHER Karl;2016;CM;0;BZ;110260;809870;102070;m -PIRO Valerio;2114;CM;0;NA;180571;814008;102706;m -PIROLA Andrea;2119;CM;0;BG;310777;811521;106033;m -PIRPAMER Klaus;1955;1N;30;BZ;150478;0;4090;m -PIRRI Alessandro;1664;2N;30;RM;000767;0;4091;m -PISANI Leonardo;1712;2N;30;PZ;080469;0;124076;m -PISANO Cesare;1664;2N;30;AT;000743;0;4093;m -PISERI Maurizio;1900;1N;30;CR;000264;0;4094;m -PISTOLA Giuseppe;1688;2N;30;PA;000446;0;4095;m -PISTONE Mario;2040;CM;30;TO;000525;0;4096;m -PIVA Giorgio;2129;CM;0;VE;160858;803588;103357;m -PIVETTA Alberto;2000;CM;30;VE;200259;0;101480;m -PIVI Mauro;1906;CM;30;MI;001165;0;4099;m -PIVOTTO Carlo;1835;1N;30;FE;230770;0;111393;m -PIZZI Gaetano;1688;2N;30;BA;;0;106994;m -PIZZI Mario;1864;1N;30;AN;120449;0;108054;m -PIZZICARO Alfio;1900;1N;30;TV;000858;0;4103;m -PIZZUTI Ennio;1858;1N;30;RM;091158;0;109950;m -PIZZUTO Maurizio;1724;2N;30;CS;000360;0;4105;m -PIZZUTO Samuele Tull;2201;-M;0;BA;190660;807290;109378;m -PLACANICO Pietro;1571;2N;30;VC;000457;0;4107;m -PLACCHETTA Omero;1622;2N;30;RM;150138;0;102149;m -PODDA Giampaolo;2000;CM;30;CA;001059;0;4109;m -PODINI Francesco;2069;CM;0;MI;160665;806986;108165;m -POGGI Alessandro;1900;1N;30;MI;000034;0;4111;m -POGLIANO Stefano;1988;CM;30;VC;000458;0;4112;m -POJER Romeo;2159;CM;0;TN;190369;807672;100663;m -POLARA Orazio;1622;1N;30;CT;130564;0;101451;m -POLETTI Fausto;2096;CM;0;BS;011058;811122;104234;m -POLI Giuseppe;1912;1N;30;GE;300456;0;101034;m -POLITO Angelo;1900;1N;30;SA;000052;0;4117;m -POLIZZI Antonino;2012;CM;0;CL;100169;822442;121143;m -POLLONI Flavio;1718;2N;30;MI;300475;0;114134;m -POMILIO Umberto;1715;2N;30;RM;081262;0;4120;m -POMPA Alessandro;2110;CM;0;RM;220662;809926;102746;m -POMPILI Alberto;1822;1N;30;TV;190953;0;107808;m -POMPILI Ugo;1783;1N;0;PU;150750;821179;113994;m -POMPILIO Gaetano;1938;CM;0;MT;140650;818810;107930;m -PONTARA Giovanni Alb;1803;1N;30;VR;030458;0;101936;m -PONTECORVO Alberto;2045;CM;30;BA;280162;0;107165;m -PONTICIELLO Aniello;1900;1N;30;NA;001255;0;4127;m -PONTINI Enrico;1673;2N;30;VC;000753;0;102040;m -PONZETTO Giuseppe;2113;CM;30;TO;000350;0;4129;m -PONZETTO Pietro;2178;-M;20;TO;310752;0;104817;m -POPA Claudio;2193;CM;0;VR;240676;805904;102035;m -POPA Costantin;1694;2N;30;SV;000549;0;4132;m -POPA Florin;2210;-M;0;VR;100873;804282;107141;m -POPPI Enrico;1700;2N;30;MO;201136;0;117733;m -PORFIDO Domenico;1694;2N;30;VR;001153;0;4135;m -PORTALUPPI Edoardo;1784;2N;30;MI;100573;0;104775;m -PORTELLI Severino;1903;1N;30;GO;120729;0;102863;m -PORTO Dino;1685;2N;30;CS;000258;0;4138;m -POSA Nicola;1954;1N;30;TO;001169;0;4139;m -POSCENTE Davide;2090;CM;30;RM;301266;0;102751;m -POTTER Christofer;1700;2N;30;NN;001061;0;4141;m -PUTZOLU Ugo;1900;1N;30;CA;000055;0;4142;m -GIAMMANCO Sebastiano;1706;2N;30;TP;190964;0;105759;m -POVOLERI Paolo;1900;1N;30;VI;260563;0;102842;m -POZZAR Daniele;1661;2N;30;GO;200457;0;100653;m -POZZATO Alberto;1771;1N;30;UD;050664;0;103729;m -POZZI Enrico;2221;-M;0;VA;200760;800953;100885;m -POZZI Massimo;1999;CM;30;VC;001259;0;4148;m -PRAGA Fausto;1760;2N;30;VR;000156;0;4149;m -PRATA Massimo;1697;2N;30;TO;;0;4150;m -PREITI Salvatore;1625;2N;30;CZ;000850;0;4151;m -PRELATI Maurizio;2135;CM;0;RA;160454;804886;109423;m -PRENNA Giuseppe;2016;CM;30;LT;000658;0;4153;m -PRESTIGIACOMO Giovan;1846;1N;30;NN;001121;0;4154;m -PREVIATI Marco;2124;CM;30;BO;000672;0;4155;m -PREZZI Adriano;1682;2N;30;TN;270259;0;4156;m -PRIMAVERA Federico;2103;CM;30;RM;000870;0;4157;m -MONTECINOS Claudio;1546;3N;30;RE;260753;0;105107;m -PRIMAVERA Roberto;2280;-M;0;RM;200841;800643;4159;m -PRIMICERI Nunzio;2150;CM;0;RM;011262;802751;4160;m -PRIMITERRA Giancarlo;1963;1N;0;RM;121159;817651;114159;m -PRIVITERA Franco;2125;CM;0;PD;190553;818836;112645;m -PRIVITERA Giuseppe;1715;2N;30;CT;001269;0;4163;m -PROCACCI Domenico;1679;2N;30;FR;010950;0;100616;m -PROFERA Massimo;1730;2N;30;TP;290971;0;113745;m -PROFERA Nicola;1679;2N;30;TP;000367;0;4166;m -PROFERA Paola;1700;2N;30;TP;310581;0;113746;f -PROFETA Giuliano;1867;1N;30;RM;190665;0;4168;m -PROFETA Santi;1814;1N;30;PA;280363;0;112280;m -PROFUMO Alberto;2251;-M;0;GE;280356;806587;103034;m -PROIA Gaetano;1811;1N;30;RM;110569;0;124028;m -PROIA Gerardo;1707;2N;30;FR;000570;0;4172;m -PROLA Maurizio;1619;2N;30;VC;071047;0;104697;m -PROSSER Federico;2195;-M;0;BZ;200453;801011;111219;m -PROVERA Emanuele;2137;CM;0;PV;310368;811831;100271;m -PROVVEDI Paolo;1747;2N;30;RM;000045;0;4176;m -PRUDENZANO Ruggero;1820;1N;30;RM;160268;0;114066;m -PUGLIESE Fulvio;1843;1N;30;SV;011143;0;4178;m -PUGLISI Vincenzo;2046;CM;0;SA;100470;804878;102690;m -PULIATTI Carlo;2120;CM;0;RM;121062;813419;100254;m -PULVIRENTI Gianni;1970;1N;0;MI;100157;819891;109852;m -PULVIRENTI Salvatore;1906;1N;30;SR;000656;0;4182;m -CATALANO Piero;1700;2N;30;BG;120163;0;100901;m -PURICELLI Giancarlo;1508;2N;30;MI;100751;0;109665;m -QUAGLIANA Giuseppe;2069;CM;0;TO;130161;820733;104819;m -QUAGLIATO Gabriele;1900;1N;30;PD;000658;0;4186;m -QUAGLIOZZI Marco;1758;2N;30;RM;140257;0;102755;m -QUARANTA Riccardo;2085;CM;30;TO;000844;0;4188;m -BELABBAS Abdellah;1691;2N;30;AO;210365;0;106178;m -QUERCIOLI Fausto;1634;2N;30;FC;000257;0;4190;m -QUINTO Gianni;2210;-M;0;RM;040962;803936;4192;m -RABANSER Harald;1700;2N;30;BZ;160564;0;4193;m -RABBONI Luca;1832;1N;30;VE;000577;0;110702;m -RABCZEWSKI Adam;2013;CM;30;RM;000163;0;4195;m -RACCAH Ascer;1631;2N;30;RM;011246;0;117053;m -RACCANELLO Ivano;1727;2N;30;TO;001168;0;4197;m -RACCANELLO Vittorio;1951;1N;30;VE;000856;0;4198;m -RACCONE Enzo;1589;2N;30;PV;280852;0;102222;m -RACIOPPO Paolo;2178;-M;0;TO;200369;804460;102001;m -RADICE Giancarlo;1691;2N;30;CO;310163;0;102516;m -RADICE Luca;2081;CM;0;MI;210967;806854;100586;m -LETTER Giovanni;1826;1N;30;VI;200568;0;112646;m -RAFFI Paolo;1882;1N;30;PI;110756;0;101964;m -RAFFO Vittorio;2021;CM;30;GE;000547;0;4205;m -RAGAGLIA Salvatore;1580;2N;30;CS;000913;0;4206;m -RAGAZZINI Carlo;2041;CM;30;VE;150238;0;106328;m -RAGNI Paolo;2159;CM;0;AO;200758;808768;106989;m -RAGO Riccardo;2090;-M;0;AN;210565;804681;105827;m -RAGONE Eugenio;1774;1N;30;BA;260645;0;107454;m -RAGONESE Lucio Rosar;2024;CM;0;RM;131255;806935;108891;m -RAGONESI Marcello;2161;CM;0;PU;241155;808407;118022;m -RAGUSI Gianluca;1634;2N;30;TE;180465;0;103021;m -RAIANO Andrea;2230;-M;0;LI;040564;801194;111991;m -RAIMONDI Celso;1643;1N;30;CR;100948;0;101283;m -RAINERI Valerio;2145;CM;0;CO;030561;809403;107494;m -RAITERI Massimo;1900;1N;30;AO;230540;0;102911;m -RAMELLA Francesco;1730;2N;30;VC;000630;0;4218;m -RAMETTA Marcello;1780;1N;30;CS;260757;0;113750;m -RAMPONELLI Roberto;1685;2N;30;VA;000457;0;4220;m -RANDO Stefano;1810;1N;30;NA;000072;0;4221;m -RANIERI Fabrizio;2227;-M;0;TO;130474;806927;100802;m -ACCIARRI Franco;1640;2N;30;AP;060839;0;101385;m -RANZATO Paolo;1885;1N;30;VE;110151;0;103358;m -RANZATO Riccardo;1703;2N;30;PD;000769;0;4225;m -RASCHELLA Mario;1727;1N;30;MI;090347;0;103035;m -RASELLI Claudio;2034;CM;0;MI;150553;803987;122199;m -RASENTI Paola;1517;2N;30;LE;290567;0;105381;f -RATTI Ermanno;1826;1N;30;MI;000850;0;4229;m -RATTI Giulio;1682;2N;30;MI;000944;0;4230;m -RATTI Ruggero;2314;FM;0;MI;101059;800333;102418;m -RAUNICH Neri;1739;2N;30;VE;280976;0;4232;m -RAUTER Juergen;1963;1N;30;BZ;000371;0;4233;m -RAVAGNANI Fabrizio;1604;2N;30;RO;150367;0;103568;m -RAVAGNATI Walter;1900;1N;30;MI;270955;0;100687;m -RAVARINI Romolo;1900;1N;30;NO;;0;4236;m -RAVECCA Massimo;1694;2N;30;TO;000562;0;4237;m -RAVENNA Gilberto;1938;CM;0;PD;260352;815942;103232;m -RAVIOLA Giuseppe;2118;CM;0;AT;300577;811530;105292;m -RE Luciano;1660;1N;30;PV;201249;0;110844;m -REBIZZANI Gianluigi;1700;2N;30;MO;010955;0;106814;m -REDAELLI Gianfranco;1556;2N;30;LC;280753;0;107035;m -REDAELLI Matteo;1868;1N;30;MI;060670;0;104786;m -REDO Nicola;2222;-M;0;VE;200572;803081;105031;m -REDOGLIA Agostino;2128;CM;0;TO;131056;811637;102278;m -REFI Marcello;1667;2N;30;AN;090461;0;104747;m -REGA-FIORE Oscar;1790;1N;30;SA;100665;0;116683;m -REGGIANI Mauro;2221;-M;0;RE;060850;805386;105117;m -CORRADI Paolo;1568;3N;30;RE;201083;0;105139;m -REINER Hannes;2169;CM;0;BZ;110676;818488;4250;m -REITANO Marcello;1958;CM;30;CT;230872;0;103435;m -RENZATO Paolo;1900;1N;30;VE;000051;0;4252;m -RENZI Roberto;2022;CM;30;PU;220677;0;105870;m -RETTORI Carlo Albert;1900;1N;30;SI;000050;0;4255;m -REVELLO Gianni;1858;1N;30;GE;061047;0;4256;m -REZZONICO Paolo;2063;CM;0;VA;000667;823198;113768;m -REZZUTI Vincenzo;2045;CM;0;BO;200258;822477;101595;m -RIBEZZO Alessandro;1637;2N;30;CN;000871;0;4259;m -RIBOLDI Raffaele;1920;1N;0;MI;141162;822817;104571;m -RIBON Andrea;1918;1N;30;VE;050670;0;109649;m -COCCONI Nando;1580;3N;30;RE;281136;0;4262;m -RICCARDI Sandro;1723;1N;30;MI;230743;0;104016;m -RICCI Alfredo;2036;CM;0;FE;260853;808911;102223;m -RICCI Marco;2150;-M;0;MI;230364;802654;101751;m -RICCIARDI Emilio;1999;CM;30;NA;000658;0;4266;m -RICCIO Rodolfo;1900;1N;30;NA;000356;0;4268;m -RICCIONI Marco;2100;CM;30;RM;000157;0;4269;m -RICCO'-PANCIROLI Ful;1919;1N;30;RE;160555;0;105121;m -RICCOBONO Paolo;1802;1N;30;RM;231073;0;104281;m -RICEPUTI Vincenzo;1873;1N;30;MI;000562;0;4272;m -RIDOLFI Raffaele;1932;CM;0;RM;110171;814709;100949;m -RIEGLER Alessandra;2030;CM;0;MO;240561;806749;106810;f -RIGAMONTI Stefano;2116;CM;0;BG;070764;808652;106390;m -RIGATTI Giorgio;2035;CM;30;UD;241064;0;100646;m -RIGATTIERI Uber;1768;1N;30;RE;031046;0;103580;m -RIGAZIO Andrea;1637;2N;30;VC;210575;0;4278;m -RIGHETTI Gianfranco;1631;2N;30;RM;000161;0;4279;m -RIGHI Francesco;1739;2N;30;SI;001168;0;4280;m -RIGHINI Giovanni;1840;1N;30;CR;191263;0;101280;m -RIGILLO Gianni;1681;1N;30;NA;210363;0;109900;m -RIGO Gianfrancesco;2013;CM;0;VR;210550;805912;101363;m -RIGO Marco;1882;1N;0;TN;300863;819930;102762;m -RIGOBON Massimo;2095;CM;30;VE;001167;0;4285;m -RIGONI Valeriana;1583;2N;30;VA;000462;0;4286;f -RIGONI Vinicio;1802;1N;30;VI;050163;0;123996;m -RIGOTTI Gianluigi;1496;2N;30;VB;230647;0;108161;m -RIGOTTI Gianni;1700;2N;30;TN;000750;0;4289;m -RIMONDI Andrea;2000;CM;30;BO;000466;0;4290;m -RINALDI Giuseppe;1838;1N;30;BA;100161;0;107643;m -RINALDI Mario;1556;2N;30;NA;001252;0;4292;m -RINALDO Gaetano;1700;2N;30;BZ;181260;0;108939;m -RIPA Alberto;2100;CM;30;MI;000862;0;4294;m -RIPA Giorgio;2010;CM;30;MI;000862;0;4295;m -RIPAMONTI Ippolito;1899;1N;30;MI;210245;0;104787;m -RITA Giacomo;1969;1N;30;NA;001260;0;4297;m -RITANO Riccardo;1900;1N;30;CA;000063;0;4298;m -RITROVATO Sergio;1900;1N;30;GE;000045;0;4299;m -RIVA Massimo;1694;2N;30;LC;000169;0;4300;m -RIVELLO Roberto;2259;-M;0;TO;040765;801305;100003;m -RIVOLA Franco;2035;CM;0;FC;270757;813710;113116;m -RIZZARDI Roberto;1616;2N;30;BZ;120864;0;108937;m -RIZZATI Aldo;1916;CM;30;VR;301149;0;104922;m -RIZZO Arnaldo;1700;2N;30;NA;081260;0;4305;m -RIZZO Davide;1817;1N;30;EN;000880;0;4306;m -RIZZO Francesco;1900;1N;30;PA;000745;0;4307;m -RIZZO Gaetano;1847;1N;30;CT;190677;0;105217;m -RIZZO Gianluca;1900;1N;30;NA;000469;0;4309;m -RIZZO Giovanbattista;2089;CM;0;BA;150563;807133;109380;m -RIZZO Guido;1900;1N;30;NA;000838;0;4311;m -RIZZUTI Pasquale;1844;CM;30;BG;121157;0;109599;m -ROATTA Luca;2151;CM;0;AL;010859;818844;106383;m -ROBERTI Ignazio;1918;CM;0;VE;020257;813729;106352;m -ROBLEDO Renato;1634;2N;30;SS;000954;0;4315;m -ROCCA Giorgio;1900;1N;30;BS;001256;0;4316;m -ROCCASALVA Pietro;2050;CM;30;RG;000264;0;4317;m -ROCCATANI Raffaele;1721;2N;30;FR;000453;0;4318;m -ROCCHI Enrico;1772;1N;30;BI;210356;0;102260;m -ROCCO Diego;1700;2N;30;VE;000762;0;4320;m -ROCCO Franco;1837;1N;30;CN;041050;0;109889;m -ROCCO Luciano;1724;2N;30;UD;240241;0;105903;m -ROCCO Rosetto;1900;1N;30;VA;000553;0;4323;m -RODEGHIERO Andrea;1829;1N;30;VI;130576;0;101446;m -RODEGHIERO Domenico;1694;2N;30;VI;000244;0;4325;m -RODELLA Franco;2072;CM;0;GE;180454;814016;117119;m -RODIGHIERO Giuseppe;2175;-M;0;BI;240959;802832;102258;m -RODOLFO-MASERA Luca;1943;1N;30;PV;000962;0;104841;m -ROGAI Stefano;2015;CM;0;FI;091161;803073;4329;m -TEGLIO Andrea;1739;2N;30;GE;131171;0;4330;m -ROLFO Alessandro;2000;CM;30;TO;130256;0;111491;m -ROMAGNOLI Franco;2020;CM;0;CR;220860;821080;104235;m -ROMAGNOLO Paolo;2126;CM;30;TO;131155;0;104818;m -ROMANO Antonio;1755;2N;30;NA;000364;0;108263;m -ROMANO Bartolo;1700;2N;30;NA;000876;0;4335;m -ROMANO Cosimo;1607;2N;30;MI;131066;0;112411;m -ROMANO Daniela;1628;2N;30;RM;001147;0;4337;f -ROMANO Edgar;2110;CM;0;GE;130172;804800;4338;m -ROMANO Filippo;1682;2N;30;LT;180548;0;103751;m -ROMANO Marco;1700;2N;30;RM;150991;0;108292;m -ROMANO Stefano;1628;2N;30;RM;000460;0;4341;m -ROMANO Tito;1848;CM;30;TV;150538;0;114920;m -ROMANO Vittorio;1946;1N;30;SR;000466;0;110572;m -ROMANSKI Jan;1954;1N;30;CT;000961;0;4344;m -ROMBALDONI Andrea;2235;-M;0;PU;230863;800902;101843;m -ROMBOLINI Roberto;1700;2N;30;GE;000942;0;4346;m -ROMBOLINI Ruggero;1700;2N;30;RM;000840;0;4347;m -ROMITO Donato;1828;1N;30;BA;;0;4348;m -SIMONINI Manlio;1900;1N;30;RM;190946;0;112057;m -SINACORI Antonino;1622;2N;30;PA;000256;0;4350;m -SIONE Faustino;1900;1N;30;UD;000324;0;4351;m -SIRACO Maurizio;2176;CM;0;RM;050562;804762;113795;m -SIRAKOV Emil;1703;2N;30;BO;000253;0;4353;m -SIRCHER Carlo;1979;CM;30;NN;0;0;4354;m -SIRLETTI Sonia;2014;CM;0;NA;191071;814210;101738;f -SIRONI Roberto;1942;1N;30;LC;241062;0;104788;m -SIRONI Sandro;2000;CM;30;MI;000323;0;4357;m -SIVIERO Gennaro;2000;CM;30;CE;190919;0;100387;m -SIVIERO Giuseppe;1900;1N;30;CE;170454;0;104532;m -SIVIERO Tiziano;1700;2N;30;GO;270354;0;100648;m -SLAGHENAUFI Fabio;1888;1N;30;TN;070551;0;114850;m -SOAVE Sergio;1688;2N;30;VR;101038;0;110711;m -SODANO Umberto;2123;-M;20;NA;260556;0;110999;m -SODERINI Lorenzo;2093;CM;30;RM;000360;0;4364;m -SOLAROLI Riccardo;1976;CM;0;FC;130469;809810;109209;m -SOLINAS Carlo;2060;CM;0;VE;271057;805084;110297;m -SOLUSTRI Sauro;2048;CM;30;TO;280260;0;106372;m -SOMMA Luigi;2126;-M;20;RM;000340;0;4368;m -SONCIN Denis;2055;CM;0;TO;071069;809063;103250;m -SONZOGNO Adolfo;1837;1N;30;VI;111123;0;102843;m -SOPRANO Paolo;2280;CM;0;NA;080256;809179;4371;m -SORAVIA Giuseppe;1598;1N;30;BL;070922;0;105032;m -SORBELLI Massimo;1796;2N;30;RM;301259;0;114192;m -SORRENTINO Giuseppe;1691;2N;30;NA;000468;0;4374;m -SORRENTINO Maria;1604;2N;30;NA;201258;0;101065;f -SORRENTINO Pietro;2105;CM;30;RM;000949;0;4376;m -SORRENTINO Vincenzo;1727;2N;30;NA;000972;0;4377;m -SOTTANI Paolo;1944;CM;30;GR;031157;0;124046;m -SOTTROI Carlo;2008;CM;0;BL;110857;824844;105022;m -SOVERI Giuseppe;1700;2N;30;SV;001263;0;4380;m -SPADA Angelo;2109;CM;0;PE;151158;802875;101779;m -SPADARO Rosario;1900;1N;30;CT;000030;0;4382;m -SPAGNOLI Vincenzo;1496;2N;30;NA;000352;0;4383;m -SPAGONI Roberto;1700;2N;30;BO;000459;0;4384;m -SPANGHERO Nicola;1954;1N;30;UD;110965;0;103743;m -SPANO' Francesco;1742;2N;30;RE;070758;0;105113;m -SPATOLA Alberto;1670;2N;30;PA;001052;0;4387;m -SPATOLA Davide;2076;CM;0;TO;150669;821853;113801;m -SPERTI Guido;1718;2N;30;MI;140465;0;104438;m -SPESSATO Gianluca;1712;2N;30;PD;100462;0;110686;m -SPINA Santo;1915;1N;30;CT;021265;0;102471;m -SPINELLI Doriano;2155;-M;0;TO;210352;803227;104816;m -SPINETTI Paolo;2076;-M;20;TS;000926;0;4393;m -SPIROUX Emanuele;1679;2N;30;NA;000656;0;4394;m -SPLENDIANI Francesco;2000;CM;30;AQ;000744;0;105860;m -BOGNOLO Massimo;1700;2N;30;VE;070256;0;4396;m -SPORNBERGER Paul;1700;2N;30;BZ;000662;0;4397;m -SPORTELLI Francesco;1613;2N;30;AP;020848;0;108912;m -SPOSITO Paolo;1628;2N;30;RM;180846;0;103829;m -SPREA Giuseppe;2039;CM;0;VR;110462;813460;107142;m -SQUILLANTE Michele;1721;1N;30;MI;180245;0;100134;m -STALDI Cherubino;2200;-M;20;TS;000311;0;4402;m -STAMELOS Joannis;1697;2N;30;TO;001259;0;4403;m -STAMPINI Flavio;1700;2N;30;MI;000362;0;4404;m -STANTIC Severino;2051;-M;0;TS;300132;805661;103805;m -STANZANI Stefano;1694;2N;30;BO;070793;0;101608;m -STARACE Luigi;1700;2N;30;RM;000965;0;4407;m -VALERI Valerio;1603;2N;30;MC;260751;0;102118;m -STASSI Emilio;2190;-M;0;ME;130131;803340;103827;m -STAVRU Alessandro;2240;-M;0;RM;280871;800554;4410;m -STECCANELLA Massimo;1679;2N;30;TO;000659;0;4411;m -STEFANELLI Luca;2183;CM;0;LI;010263;801704;110807;m -STEINER Martin;1848;1N;0;BZ;280771;818496;4413;m -STEINFL Alessandro;2263;-M;0;RM;250863;800929;104263;m -STERLE Giulio;1942;1N;30;TS;041167;0;103185;m -STERNI Iefte;2011;CM;30;VI;260966;0;101208;m -STERNINI Cristiano;1745;2N;30;RM;010674;0;104283;m -STINCHI Stefano;2027;CM;30;NA;250764;0;100356;m -STIVALETTA Andrea;1739;2N;30;BZ;280767;0;108936;m -STOISA Ivo;2000;CM;30;TO;230757;0;102202;m -STOLL Thomas;2190;-M;0;BZ;110678;805769;4421;m -STOPPA Omar;2209;-M;0;IM;090578;810339;105088;m -STORACE Stefano;1760;2N;30;GE;090972;0;4423;m -STORAI Ivo;1816;1N;30;CN;310358;0;109658;m -STORANI Giuseppe;1721;2N;30;MC;251270;0;104574;m -STORNELLI Aldo;1729;1N;30;PG;091227;0;4426;m -STORNELLI Vincenzo;2175;-M;0;PG;290670;803057;4428;m -STRADIOTTI Alessandr;1874;1N;30;BO;000173;0;4429;m -STRADIOTTI Maurizio;1721;2N;30;CR;040451;0;106421;m -STRAZZULLO Luciano;2077;CM;0;NA;260861;815144;101203;m -STRICCHIOLA Nicola;1727;2N;30;BA;160653;0;107170;m -STROBL Heinrich;1727;2N;30;BZ;270533;0;113672;m -STROCCHI Antonino;1858;1N;30;BO;000038;0;4434;m -STRUZZIERO Domenico;1667;2N;30;FC;230952;0;109872;m -STUFLESSER Walter;2075;CM;30;BZ;000557;0;4436;m -STURMA Mauro;2083;CM;0;GO;140955;806722;100643;m -SUBISSATI Massimo;1826;1N;30;BO;001070;0;105873;m -SUPINO Domenico;2023;CM;30;NA;000647;0;4439;m -SUPPA Ercole;2119;CM;0;TE;250258;806846;104690;m -SUPRANI Alessandro;2055;CM;0;RM;000957;823031;118226;m -SUSSBERG Roberto;2014;CM;30;VE;250645;0;101482;m -SVAMPA Monaldo;1900;1N;30;AT;000065;0;4443;m -SWANNIE Douglas;1900;1N;30;MI;000052;0;4444;m -SZANTO Andrea;1900;1N;30;CH;031257;0;106941;m -TABO' Giorgio;2175;CM;30;GE;080532;0;4446;m -TACCHEO Stefano;1879;1N;30;MI;000464;0;4447;m -TACCHI Fabio;1805;1N;30;RM;010971;0;109949;m -TACCHIO Rolando;1885;1N;30;FI;201021;0;116557;m -TADDEI Mario;1952;CM;30;RM;000356;0;4450;m -TADDEI Stefano;1664;2N;30;PI;020263;0;101963;m -TAGLIANO Maurizio;1775;1N;30;SV;081065;0;102607;m -TAGLIOLI Ivo;1757;2N;30;PI;001139;0;4453;m -TAIETTI Gianpaolo;1900;1N;30;MI;000044;0;4454;m -TAIUTI Mauro;1900;1N;30;GE;000057;0;4455;m -TALENTI Dario;1897;1N;30;NN;000552;0;108083;m -TALONI Silvio;1619;2N;30;RM;150162;0;113392;m -TAMAGNINI Francesco;1721;2N;30;RM;0;0;4458;m -TAMAI Roberto;2286;FM;0;PN;140557;801798;105892;m -TAMBORINO Pasquale;2051;CM;30;TA;190772;0;105810;m -TAMBORINO Roberto;1700;2N;30;TA;000265;0;4461;m -BISSANTI Francesco;1550;2N;30;BA;300679;0;4462;m -TAMINTO Carlo;1667;2N;30;NA;191258;0;105634;m -TAMMERLE Peter;1900;1N;30;BZ;000667;0;4464;m -TANA Vincenzo;1682;2N;30;NA;000268;0;4465;m -TANAS Carlo;1834;1N;30;GE;140553;0;4466;m -TANFANI Roberto;1642;2N;30;TS;000558;0;4467;m -TARANTO Gino;1661;2N;30;RG;000157;0;4468;m -TARASCIO Giuseppe;2141;-M;20;BA;290856;0;109381;m -TAREK Youssef;1798;1N;30;MI;000863;0;4470;m -TAROZZI Massimo;1706;2N;30;GE;000372;0;4471;m -TARUFFI Daniele;2340;FM;0;BO;000958;800287;4472;m -TASSI Oliviero;2300;FM;0;LT;250861;800384;4473;m -TATAI Stefano;2361;IM;0;RM;230338;800074;100258;m -TAUFER Ivano;1900;1N;30;TN;000458;0;4475;m -TAVANI Enrico;2091;CM;30;GE;000962;0;4476;m -TAVECCHIA Mario;1724;2N;30;MI;080866;0;101649;m -TAVELLA Maurizio;1847;1N;30;GE;310862;0;117069;m -TAVERNA Silvano;1601;2N;30;AL;100846;0;101222;m -TAVERNARO Lodovico;1547;2N;30;TN;150960;0;113492;m -TEANI Lillo;2177;-M;20;MS;001133;0;4481;m -TEDESCHI Antonio;1939;1N;30;FI;000059;0;4482;m -TEDESCHI Luciano;1903;1N;30;SV;180555;0;105205;m -TEDESCHI Paolo;2148;CM;0;SV;180160;810983;105204;m -TEMI Walter;2105;CM;0;NO;090462;804983;100477;m -TENCATI Giuseppe;2176;CM;0;PC;030674;805742;102142;m -TEODONIO Fabrizio;2064;CM;0;VR;230161;815861;101561;m -TERRACCIANO Eduardo;1631;2N;30;NN;000235;0;4488;m -TERRACIANO Angelo;1631;2N;30;NA;021165;0;117419;m -TERRENI Fabio;2003;CM;30;RM;230378;0;104264;m -TERZOLO Massimo;1897;1N;30;TO;251060;0;111209;m -TESTA Armando;2210;CM;0;RM;140263;801356;4492;m -TESTA Mauro;2032;CM;30;AL;000165;0;4493;m -THALER Bernhard;1685;2N;30;BZ;000462;0;4494;m -THALER Helga;1622;2N;30;BZ;140276;0;100019;f -TIBALDESCHI Attilio;1562;2N;30;VC;060845;0;104554;m -TICOZZI Stefano;2073;CM;0;NO;301264;814610;105197;m -TIENGO Davide;2091;CM;30;RO;180170;0;101185;m -TIMAR Andras;2000;CM;30;PD;000859;0;117634;m -TIMPANI Nicola;2120;CM;0;MO;171161;805998;103550;m -TINARI Marco;1909;CM;30;RM;110165;0;113914;m -TIRABASSI Maurizio;2306;FM;0;MO;141257;800295;103205;m -TIRELLI Carlo;1697;2N;30;MO;000475;0;103215;m -TISANO Vincenzo;1661;2N;30;SR;000754;0;4504;m -TIVELLI Massimiliano;1727;2N;30;VI;220168;0;103875;m -TIZZONI Lionello;2046;CM;0;SP;270751;808598;103664;m -TOBIA Francesco Paol;1673;2N;30;TO;;0;113808;m -TOCCHIONI Doriano;2245;-M;0;FI;211063;801887;109757;m -TOCCHIONI Maurizio;1891;CM;30;FI;000261;0;120408;m -TOCCO Paolo;2141;CM;0;RM;040657;804029;105401;m -TODARO Giuseppe;1694;2N;30;CT;001251;0;4511;m -TOGNI Giampiero;1786;1N;30;RM;110460;0;109581;m -TOMASI Diego;2024;CM;0;TN;150660;806331;102730;m -TOMASINI Giovanni;2054;CM;30;VA;001053;0;4515;m -TOMASSETTI Giuseppe;1694;2N;30;RM;0;0;4516;m -TOMASSONI Leonardo;2005;CM;30;VA;001047;0;4517;m -TOMBA Fabio;1655;2N;30;VI;000975;0;4518;m -MARAN Walter;1705;1N;30;MO;120155;0;4519;m -MARANDOLA Mario;1700;2N;30;NA;001069;0;4520;m -MARCACCI Giorgio;2024;CM;30;NA;000473;0;4521;m -MARCANGELI Alessandr;1706;2N;30;LC;310546;0;112234;m -MARCHESE Giovanni;1912;1N;30;PV;050841;0;104865;m -MARCHESI Fulvio;1760;2N;30;AT;070743;0;111984;m -MARCHESIN Giuseppe;1682;2N;30;VI;270478;0;4525;m -MARCHETTO Giuseppe;1667;2N;30;RO;301056;0;103565;m -MARCHIANDO Giorgio;1874;CM;30;TO;201057;0;4527;m -MARCHIANI Stefano;1840;1N;30;FI;000156;0;4528;m -MARCHINI Andrea;1966;1N;30;MI;000166;0;104482;m -MARCHINI Massimo;2196;-M;0;FE;120859;803383;102224;m -MARCHIOLI Roberto;1906;1N;30;VE;000355;0;4531;m -MARCHIORI Diego;2110;CM;30;VE;200658;0;100097;m -MARCHIORO Luigi;1820;1N;30;MI;281058;0;104561;m -MARCHIO' Marino;2012;CM;30;MN;000859;0;4534;m -MARCIELLO Armando;2014;CM;0;MO;120155;813923;103209;m -MARCOLI Paolo;2214;-M;0;MI;031060;805530;112098;m -MARCOMINI Ottavio;1700;2N;30;PD;000959;0;4537;m -MARCONI Franco;1801;1N;30;AP;041157;0;101389;m -MARCUCCI Massimilian;1906;1N;30;GR;040366;0;110634;m -MARCUCCI Michele;1700;2N;30;GR;000265;0;4540;m -MARCUZZO Giorgio;1580;2N;30;PD;210761;0;104058;m -MARELLI Antonio;1739;2N;30;CO;000465;0;4542;m -MARELLI Massimo;1832;1N;30;MI;000859;0;4543;m -MARELLI Mauro;2256;-M;0;MI;060163;803251;100581;m -PACHERA Andrea;1616;2N;30;VR;090492;0;110754;m -MARIANI Claudio;2152;CM;30;MI;201245;0;102419;m -CARRETTA Raimondo;1682;2N;30;AQ;010151;0;102593;m -MARIANI Pietro;2132;CM;30;MI;150758;0;102424;m -MARIANI Remo;1625;2N;30;FC;221051;0;109870;m -MARIANI Stefano;1966;1N;30;PG;180860;0;105830;m -MARIANO Elia;2191;-M;0;MI;110781;806579;100793;m -MARIGO Narciso;2024;CM;0;PD;120758;815748;106782;m -MARIN Stefano;1880;1N;30;UD;160558;0;103736;m -MARINELLI Gian Marco;1989;CM;0;MO;040371;812277;103200;m -MARINELLI Sonia;1580;2N;30;RM;000869;0;4555;f -MARINELLI Tullio;2373;IM;0;RM;300467;800201;4556;m -MARINESCU Marian;2129;CM;0;LC;160868;805491;107041;m -MARINI Bruno;1784;1N;30;RM;020852;0;4558;m -MARINI Francesco;1700;2N;30;UD;000971;0;4559;m -MARINI Paolo;1829;1N;30;TE;220768;0;103992;m -MARINO Danilo;1976;CM;0;RM;060164;826928;113912;m -MARINO Fabio;1876;1N;30;FR;000864;0;100794;m -MARINO Giancarlo;1607;2N;30;PA;020777;0;110564;m -MARINO Giovanni;1897;CM;30;RM;000860;0;4564;m -MARINO Marco;1869;1N;0;MI;010159;824348;100582;m -MARINO Massimo;2051;CM;30;AN;000962;0;114156;m -MARINONE Lucio;1984;1N;0;VC;250877;826529;104552;m -MARIONI Giuliana;1601;2N;30;MI;260574;0;103604;f -MARIOTTI Dino;1634;2N;30;NO;000737;0;4569;m -MARIOTTI Pier Giovan;1760;2N;30;NA;150469;0;107613;m -MARIOTTI Riccardo;1900;1N;30;PU;000053;0;4571;m -MARIOTTI Sergio;2351;GM;0;RM;100846;800023;105826;m -MARLETTA Giuseppe;1862;1N;30;CT;130260;0;117590;m -MARLETTA Paolo;2100;CM;30;CT;000948;0;4574;m -MARMILI Giulio;2160;CM;0;PO;170576;824798;101402;m -MAROZZI Giovanni;2096;CM;0;AP;030967;821616;101383;m -MARRARA Francesco;1872;1N;30;RC;301265;0;107711;m -MARRETTI Liberato;1493;2N;30;FI;000534;0;4578;m -MARSICO Silvio;1700;2N;30;CS;000262;0;4579;m -MARSIGLIO Antonio;1700;2N;30;VI;000421;0;4580;m -MARSON Paolo Giusepp;1691;2N;30;MI;260657;0;100559;m -MARTELLA Antonio;1820;1N;30;CH;090362;0;107254;m -MARTELLI Andrea;2039;CM;0;RM;280762;811203;104514;m -MARTELLI Maurizio;2000;CM;30;NO;301160;0;104880;m -MARTINELLI Riccardo;2045;CM;30;LU;001256;0;4585;m -MARTINI Marco;1622;1N;30;MO;310868;0;110083;m -MARTINI Marco;2180;CM;0;SA;150857;806951;4587;m -MARTINI Maurizio;1718;2N;30;NN;000952;0;4588;m -MARTINO Antonio M.;2008;CM;0;LO;280558;823023;104434;m -MARTINO Ferdinando;1742;2N;30;GE;000269;0;4590;m -MARTINO Giovanni;1864;1N;30;AO;150349;0;4591;m -MARTINOIA Luigi;1564;1N;30;VA;161049;0;120304;m -MARTORELLI Antonio;2264;IM;0;SA;040954;801399;107992;m -MARTURANO Giampiero;2068;CM;30;NA;120454;0;108725;m -MARUCCHI Roberto;1697;2N;30;AL;;0;113690;m -MARVIN Elio;1723;1N;30;TO;220836;0;102814;m -MARZANO Carlo;2239;-M;0;RM;260964;802980;105398;m -MARZIALI Claudio;1696;1N;30;AR;040459;0;115366;m -BELLUCCI Romano;1700;2N;30;VE;090740;0;100923;m -MASACCI Paride;2052;CM;30;FC;001060;0;4600;m -MASCELLANI Marco;2286;-M;0;BO;240874;804819;105465;m -MASCHERONI Carlo;1619;2N;30;MI;000452;0;4602;m -MASCHERONI Maurizio;2052;CM;0;MI;030755;807990;100583;m -MASCHERPA Luca;1861;1N;30;GE;130762;0;100511;m -MASERA Umberto;2094;-M;0;TN;220629;805025;4605;m -MASETTI Franco;1685;2N;30;BO;080340;0;100312;m -MASHA Rexhep;1894;1N;30;LU;0;0;4607;m -MASI Adamo;1874;1N;30;TO;081171;0;102174;m -MASI Giovanni;1688;2N;30;TO;000847;0;4609;m -MASI Graziano;2000;CM;30;BO;111242;0;105343;m -MASI Marco;1652;2N;30;VE;280643;0;101476;m -MASI Paolo;1685;2N;30;FI;000740;0;4612;m -MASO Ugo;1712;2N;30;TV;261064;0;101513;m -MASOTINO Nicola;1763;2N;30;MI;000754;0;4614;m -MASOTTI Roberto;1859;1N;0;CR;150662;815071;101284;m -MASSA Giovanni;2109;CM;0;GE;070370;810029;101030;m -MASSARA Olav;1843;1N;30;MI;000859;0;4617;m -MASSARI Giulio;1831;1N;30;RM;000558;0;4618;m -MASSEROTTO Massimo;1700;2N;30;GO;000661;0;4619;m -MASSIMILLA Gino;1804;1N;30;RM;000162;0;4620;m -MASTRODDI Emiliano;2068;CM;0;RM;240176;808482;122316;m -MASTRODDI Fabio;2081;CM;30;RM;200676;0;4622;m -MASTROPIETRO Marco;2011;CM;30;RM;000559;0;4624;m -MASTRORILLI Davide;1688;2N;30;RM;000665;0;4625;m -MASTRORILLI Nicola;2075;CM;0;MI;220263;808318;101293;m -MASTROSTEFANO Ennio;1520;2N;30;CE;290946;0;100403;m -MATANO Arturo;1769;1N;30;CE;000858;0;4628;m -MATASSONI Livio;2050;CM;30;TN;230257;0;102723;m -MATINI Maurizio;1802;1N;30;FI;280762;0;102096;m -MATKOVICH Silvano;1550;2N;30;TS;160960;0;103181;m -MATTAVELLI Italo;1816;1N;30;TO;120658;0;102287;m -MATTEDI Mauro;1912;1N;30;TN;310552;0;100664;m -MAUGERI Domenico;1451;2N;30;SR;000647;0;121332;m -MAURI Giorgio;2039;CM;30;PO;301152;0;101406;m -MAURO Alan;2195;FM;0;FI;180754;801275;101396;m -MAURO Angelo;1601;2N;30;CT;130552;0;105782;m -MAXIA Giuseppe;2009;CM;30;PG;001157;0;111892;m -MAYNUDDIN Ahmed;1925;1N;30;MI;0;0;4639;m -MAZLUM Olinga;1721;2N;30;FI;001162;0;4640;m -MAZZA Domenico;1565;2N;30;MI;0;0;4641;m -MAZZALI Ivo;1631;2N;30;RE;280368;0;105106;m -MAZZAMUTO Nicola;2141;-M;20;PA;090959;0;120460;m -MAZZARELLA Antonio;1931;CM;30;CE;140254;0;100405;m -MAZZARONE Maurizio;1906;CM;30;SA;250564;0;103633;m -MAZZEI Alessandro;2190;CM;0;NA;040475;807346;101055;m -ROMANO' Fabio;1922;1N;30;MI;220674;0;102515;m -PEDRANI Ivano;1700;2N;30;RM;000261;0;4648;m -PEDRAZZI Giuseppe;1835;1N;30;RE;020461;0;105125;m -PEDRIELLI Imer;1843;1N;30;MO;051017;0;103217;m -PEDRINZANI Ivano;1655;2N;30;RM;000261;0;4651;m -PEDROLI Marco;1900;1N;30;MI;001143;0;4652;m -PEGORARI Pietro;2341;FM;0;CZ;250449;805670;103166;m -PEGORARO Giorgio;2094;-M;0;VI;190430;805815;105666;m -PEGORARO Nicola;2047;CM;0;TV;051058;806455;105675;m -PAVAN Alessandro;1593;3N;30;RE;060385;0;105136;m -PEINTNER Andreas;1900;1N;30;BZ;000864;0;4657;m -CARDISCIANI Federico;1622;2N;30;TE;300981;0;103981;m -PELACCHI Armando;1933;1N;30;SP;160836;0;115370;m -PELAGATTI Alessandro;2092;CM;0;PR;070369;819859;108175;m -PELLEGRINI Riccardo;2000;CM;30;BO;001161;0;4661;m -PELO Leonardo;2014;CM;30;MI;001269;0;4662;m -PELO' Pierpaolo;1643;2N;30;GE;151055;0;4663;m -PELUSO Angelo;2108;CM;30;TA;000453;0;4664;m -PENNATI Mario;1700;2N;30;MI;220929;0;4665;m -PENNATI Roberto;1652;2N;30;MI;120749;0;109853;m -PENNAZZATO Alessandr;2000;CM;30;VE;000872;0;4667;m -PENNISI Enrico;1661;2N;30;CT;000463;0;4668;m -PENNISI Giovanni;1969;CM;30;CT;160364;0;103430;m -PENZO Amleto;1732;1N;30;VE;221149;0;111902;m -PENZO Michele;1676;2N;30;VE;300873;0;103356;m -PEPE Paolo;1897;1N;30;SA;000259;0;4672;m -PERACCO Marcello;1810;1N;30;FI;001049;0;4673;m -PERCALI Gianni;1976;CM;30;LC;000166;0;4674;m -PEREZ Arcangelo;1900;1N;30;GE;021134;0;101050;m -PEREZ Giorgio;1882;1N;30;RM;000736;0;4676;m -PEREZZANI Stefano;2077;CM;30;VR;261264;0;100521;m -PERFLER Georg;1700;2N;30;BZ;000669;0;4678;m -PERICH Stefano;1998;CM;0;BS;060936;804223;102061;m -PERICO Gianvittorio;1697;2N;30;BG;280364;0;106393;m -PERINELLI Alessandro;2050;CM;30;VE;251248;0;115769;m -PERINELLI Paolo;2180;CM;30;VE;200741;0;101478;m -PERINI Gianna;1592;2N;30;AN;000230;0;4683;f -PERISSINOTTO Claudio;2119;CM;0;VE;151168;808989;103511;m -PERITO Francesco;1837;1N;30;SA;050270;0;118438;m -PERKMANN Thomas;1918;1N;30;BZ;000673;0;4686;m -PERNICI Barbara;2105;FM;0;MI;260656;801500;4687;f -PERNISCO Daniele;1900;1N;30;VA;000060;0;4688;m -PERNISCO Ermanno;2237;CM;0;VA;160152;806374;4689;m -PEROTTI Germano;1757;1N;30;RM;090262;0;100252;m -PERRETTA Maurizio;2100;CM;0;RM;030169;805327;4691;m -PERRI Marco;2177;-M;20;PG;001257;0;4692;m -PERRONE Corrado;1900;1N;30;GE;000162;0;4693;m -PERRONE Giorgio;1832;1N;30;BR;180178;0;106248;m -PERRONE Marcello;1691;2N;30;BR;030151;0;106239;m -PERROTTA Domenico;1700;2N;30;FI;001162;0;4696;m -PERSIANO Giuseppe;1565;2N;30;CT;170875;0;4697;m -PESARESI Sergio;2118;CM;0;VC;090469;809101;104551;m -PESARO Luca;1925;1N;30;PC;000071;0;4699;m -PESCIO Roberto;1661;2N;30;SV;161260;0;4700;m -PESCRILLI Antonio;1840;1N;30;MI;000963;0;4701;m -PETIT-BON Ivan;2130;CM;30;RE;000547;0;4702;m -PETRACHI Gianni;1646;2N;30;TS;050864;0;103183;m -PETRAGNANI Gian Giac;1619;2N;30;RM;240838;0;100952;m -PETRI Amedeo;2000;CM;30;UD;210853;0;4705;m -PETRICCI Carlo;1628;2N;30;CA;000565;0;103275;m -PETRILLO Agostino;2110;CM;30;GE;070457;0;4707;m -PETRINI Roberto;2050;CM;0;MI;100266;812862;110302;m -PETRIS Gabriele;1523;2N;30;BL;001025;0;4709;m -PETRONE Daniele;2260;CM;0;MI;220472;802468;4710;m -PETRUCCI Fabio;1690;2N;30;RM;000454;0;4711;m -CALAMIA Carmen;1580;3N;30;TP;200190;0;107091;f -PETRUCCI Raimondo;2018;CM;30;FR;000451;0;4713;m -PETRUCCIOLI Antonio;2083;CM;0;CB;030962;808083;104665;m -PETTI Antonio;1900;1N;30;AL;250266;0;115646;m -PEZZA Bruno;1787;2N;30;FR;000962;0;4716;m -REDO Stefano;1931;1N;30;UD;060956;0;115868;m -PEZZI Franco;1792;1N;30;RA;190739;0;4718;m -PEZZOLESI Vinicio;1625;2N;30;TE;001256;0;4719;m -PIACENTINI Carlo;1855;1N;30;AQ;050844;0;102651;m -PIANA Riccardo;1772;2N;30;SS;230470;0;106745;m -PIANCATELLI Marco;2039;CM;0;RM;181069;809446;104516;m -PIANTADOSI Angelo;1673;2N;30;AT;001162;0;4723;m -PIANTONI Pierino;1983;1N;0;MI;261162;818429;100585;m -PIANTONI Roberto;2160;-M;0;BG;021065;805203;106388;m -PIASINI Antonio;2109;CM;30;RM;190953;0;102747;m -PIAZZA Carlo;2129;CM;0;VA;040465;809683;109364;m -PIAZZA Giovanni;1957;1N;30;VC;000762;0;4728;m -PIAZZETTA Antonio;1612;2N;30;TV;000359;0;4729;m -PICARDI Angelo;2142;CM;0;RM;270565;805106;105448;m -PICCARDO Marco;2204;FM;0;GE;020563;801291;104460;m -PICCARDO Vittorio;2235;CM;0;SV;210533;808091;105199;m -PICCIONI Marco;1694;2N;30;RM;070765;0;107279;m -PICCIRILLI Fabrizio;1631;2N;30;RM;000561;0;4734;m -PICCIRILLO Lucio;2009;CM;30;RM;001058;0;4735;m -ROMOLI Maurizio;1900;1N;30;MC;000761;0;4736;m -RONCAGLIA Leonardo;1894;1N;30;VA;200352;0;111736;m -RONZANO Luca;1898;1N;30;AT;220967;0;105294;m -ROPERTO Michele;1622;2N;30;CZ;000140;0;4739;m -RORATO Renzo;2149;CM;0;VE;260554;803138;102358;m -ROSATI Paolo;1700;2N;30;BO;000659;0;4741;m -ROSATO Luciano;2215;CM;0;LT;121167;809039;103752;m -ROSELLI Leonardo;1685;2N;30;RM;210442;0;116199;m -ROSI Paolo;1900;1N;30;AL;000459;0;4744;m -ROSIN Federico;2135;CM;0;MI;300964;807540;103039;m -ROSINO Antonio;2290;FM;0;VE;030342;800376;103084;m -ROSMINI Edward;1873;1N;30;MO;000559;0;4747;m -ROSMINI Erman;1760;2N;30;NN;0;0;4748;m -ROSSATO Armando;2093;CM;0;PD;160461;809586;103233;m -ROSSATO Gino;2004;CM;30;PD;001153;0;4750;m -ROSSERO Tullio;1886;1N;30;TO;180159;0;102290;m -ROSSETTI Giovanni;1903;CM;30;BN;270960;0;100450;m -ROSSETTI Mauro;2115;CM;0;RM;120574;807125;100942;m -ROSSI Bruno;1900;1N;30;LU;000037;0;4754;m -ROSSI Carlo;2344;IM;0;PD;170360;800651;106785;m -ROSSI-DE-GASPERIS Pi;2055;CM;0;RM;200259;808806;4756;m -ROSSI Giampiero;2011;-M;0;CO;160432;804436;103512;m -ROSSI Giancarlo;1727;2N;30;UD;210264;0;4758;m -ROSSI Gianpiero;1999;CM;30;PC;000442;0;4759;m -ROSSI Luciano;1772;2N;30;BN;000151;0;4760;m -ROSSI Paolo;1775;2N;30;RM;241158;0;108947;m -ROSSI Paolo;2081;CM;30;UD;240362;0;105895;m -ROSSI Pino;1724;2N;30;RM;160776;0;4763;m -ROSSI Vincenzo;1700;2N;30;MO;000674;0;4764;m -RESTIFO Francesco;1584;3N;30;GE;040574;0;113566;m -ROSSIELLO Angelo;1739;2N;30;NA;000667;0;4766;m -ROSSIGNOLI Fabio;1804;1N;30;PT;190853;0;106016;m -ROTA Antonello;2000;CM;30;TO;000354;0;4768;m -ROTA Giacomo;1905;1N;30;CT;071274;0;105223;m -ROTA Giuseppe;1661;2N;30;CT;091076;0;106127;m -MAZZONI Angelo;1900;1N;30;SP;081155;0;4771;m -ROTA Massimiliano;2105;CM;30;BG;000172;0;4772;m -ROTONDI Paolo;1724;2N;30;RM;221048;0;100821;m -ROTONI Fabrizio;2023;CM;0;AP;190656;811807;109773;m -ROTTONDI Paolo;1523;2N;30;MI;151246;0;117699;m -ROVERATO Franco;1750;1N;30;VE;001037;0;4776;m -ROVITO Giancarlo;2180;CM;0;TO;020259;802581;102280;m -ROZZI Enzo;1685;2N;30;AR;000845;0;4778;m -RRUGEJA Beqir;1844;1N;30;BG;001052;0;4779;m -RUBILLO Vincenzo;1850;1N;30;FG;040671;0;102339;m -RUBINATO Cristian;1898;1N;30;TV;020672;0;111228;m -RUBINO Aniello;2157;CM;0;NA;060762;807826;107239;m -RUBINO Enrico;1745;2N;30;TO;040269;0;108758;m -RUBINO Francesco;1700;2N;30;RM;000164;0;113477;m -BIVI Andrea;1700;2N;30;NN;0;0;4785;m -RUFFINI Pierluigi;1903;CM;30;IM;001153;0;4786;m -RUFFOLO Raffaele;1649;2N;30;MI;000151;0;4787;m -RUGGERI Claudio;1813;1N;30;CR;170165;0;104236;m -NARDI Antonio;1649;2N;30;AR;041230;0;114670;m -RUGGERI Pietro;2123;CM;0;VE;170762;803154;100098;m -RUGGIERI Oliviero;1921;1N;30;RG;110971;0;114871;m -RUGIADINI Andrea;2100;CM;30;MI;000143;0;4792;m -RUO Alessandro;1900;1N;30;NN;000565;0;4793;m -RUPENI Franco;2240;-M;0;TS;110645;801100;103803;m -RUSSI Roberto;2038;CM;0;RM;240373;811866;100255;m -RUSSO Giuseppe;1888;1N;30;AP;000864;0;107211;m -RUSSO Roberto;1802;1N;30;RM;000463;0;111911;m -RUSSO Rocco;1652;2N;30;RC;000858;0;4798;m -RUVOLO Luigi;1703;2N;30;MI;000852;0;4799;m -RUZZA Armando;1900;1N;30;PD;000055;0;4800;m -RUZZA Claudio;2086;CM;0;MI;010765;807397;102517;m -RUZZIER Dario;1981;CM;0;TS;130252;805750;109503;m -SABA Marco;1921;1N;30;VA;000561;0;4803;m -SABATINI Carlo;2022;CM;0;MI;040151;808849;105880;m -SABATINI Domenico;1900;1N;30;CR;001210;0;4805;m -SABATINI Mario;2075;CM;0;RM;300545;803650;4806;m -SABATO Maurizio;2057;CM;30;BA;001158;0;4807;m -SACCANI Ercole;1715;2N;30;MN;061049;0;103581;m -SACCHETTI Andrea;1700;2N;30;MO;001063;0;4809;m -SACCHI Luca;2000;CM;30;MI;000365;0;4810;m -SACCHINI Michele;1927;CM;30;PE;300146;0;113519;m -SACCONA Silvano;2162;CM;0;TO;080471;805653;103251;m -SACCONE Fabio;2317;FM;0;NA;070470;801208;102777;m -SACCONE Gennaro;1846;1N;30;SV;070460;0;102606;m -SACCOZAUT Gianfranco;1700;2N;30;BL;001063;0;4815;m -SACERDOTE Paolo;2000;CM;30;MI;000167;0;4816;m -SACRIPANTI Attilio;2000;CM;30;RM;001147;0;4817;m -SADER Michael;2219;-M;20;BZ;160563;0;110710;m -SAETTA Alfredo;1976;CM;30;RM;000841;0;4819;m -SALA Claudio;1852;1N;30;AG;000151;0;4820;m -SALA Gianni;1850;1N;30;MI;050945;0;104777;m -SALA Tiziano;1718;2N;30;MI;021076;0;4822;m -SALAH Abdelmonem;2109;CM;30;CN;000549;0;4823;m -SALAMI Marco;2191;-M;0;PC;010963;803952;104237;m -SALATI Paolo;1921;1N;0;PR;120858;814822;105883;m -SALERNI Giulio;1738;1N;30;CZ;000664;0;117822;m -SALERNI Guido;1870;1N;0;FI;171159;821187;117588;m -SALERNO Francesco;1730;2N;30;SR;000256;0;4828;m -SALERNO Luciano;1676;2N;30;SA;030469;0;102698;m -SALIETTI Marco;1903;1N;30;RM;000657;0;4830;m -SALIS Francesco;2000;CM;30;CA;000855;0;4831;m -SALSANO Luigi;1717;1N;30;SA;020138;0;100623;m -SALVADORI Romano;1715;2N;30;FI;260559;0;108776;m -SALVATORI Paolo;1691;2N;30;PC;000137;0;4835;m -SALVETTI Alec;2294;FM;0;VA;051060;802271;111091;m -SALVI Gianpietro;1697;2N;30;BG;000356;0;120386;m -SAMARITANI Fabio;2281;FM;0;BO;180561;806994;102081;m -SAMMARTINO Gianluca;1694;2N;30;CN;0;0;4839;m -SAMMOVIGO Arnaldo;1900;1N;30;AL;0;0;4840;m -SAMMURI Andrea;2039;CM;30;RM;001058;0;4841;m -SANCHIRICO Alessio;2040;CM;0;PG;010777;805513;4842;m -SANFILIPPO Carlo;1564;1N;30;CA;070650;0;103856;m -SANGIORGI Salvatore;1800;1N;30;RG;000651;0;4844;m -SANGIOVANNI Stefano;1709;2N;30;MI;000664;0;4845;m -SANI Franco;2060;CM;30;TN;001136;0;4846;m -SANI Valentino;1999;CM;30;MI;000761;0;4847;m -SANMARTINO Gianluca;1700;2N;30;CN;0;0;4848;m -SANNA Gianlazzaro;2370;FM;0;CA;120460;800112;4849;m -SANNINO Raffaele;2031;CM;0;NA;070863;805831;110210;m -SANSONETTI Giorgio;2083;-M;0;LE;161152;800910;103929;m -SANSO' Francesco;2046;CM;30;MI;001155;0;4852;m -SANTO Sebastiano;1481;2N;30;VC;000632;0;102039;m -SANTOLINI Luigi;2235;-M;0;VE;271252;801151;4854;m -SANTOMASSINO Claudio;1834;1N;30;BN;000859;0;4855;m -SANTORO Luca;2070;CM;0;FR;210268;810797;109447;m -SANTORO Paolo;1661;2N;30;CT;000167;0;4857;m -SAPONARA Nicola;1679;1N;30;TV;081150;0;4858;m -SAPORITI Marco;1679;2N;30;MI;000365;0;4859;m -SARACCO Marco;1780;1N;30;TO;080847;0;102192;m -SARNO Carlo;1669;CM;30;BA;010931;0;107162;m -SARNO Spartaco;2363;IM;0;PA;271264;800120;104145;m -SAROGLIA Pierpaolo V;1855;1N;30;TO;000059;0;4863;m -SARRA Stefano;1924;1N;30;RM;001162;0;4864;m -SARRECCHIA Maurizio;2007;CM;0;FR;160461;824682;113632;m -SARTIRANA Roberto;1769;2N;30;TO;070868;0;102006;m -BALDINU Salvatore;1691;2N;30;SS;0;0;102927;m -SARTORI Antonio;1900;1N;30;VE;000861;0;4868;m -SARTORI Gianni;2052;CM;30;VI;231251;0;113643;m -SARTORI Paolo;2147;CM;30;BO;001243;0;4870;m -SARTORI Spartaco;2182;-M;0;TN;300454;800767;113661;m -SASSO Mario;1550;2N;30;RM;030314;0;109130;m -SASSO Riccardo;1721;2N;30;TV;000759;0;4873;m -SATTA Francesco;1742;2N;30;NU;010176;0;4874;m -SATTA Vladimiro;2221;-M;0;RM;290860;803006;102134;m -SAVALLA Rocco;1915;1N;30;PA;000854;0;4876;m -SAVARESE Vincenzo;1859;1N;0;MI;240554;822850;114446;m -SAVASTA Giovanni;2000;CM;30;BS;000158;0;4878;m -SBARRA Marco;2290;FM;0;SV;200371;804401;103538;m -SBRACCIA Giovanni;2145;CM;0;TE;100359;808008;104691;m -SCABINI Marino;1718;2N;30;GE;090441;0;4881;m -SCACCO Mauro;2087;CM;0;RM;060457;805076;107283;m -SCAFARELLI Francesco;2269;IM;0;PZ;221033;802867;107934;m -SCAFFIDI Francesco;1730;2N;30;ME;000769;0;4884;m -SCAGLIARINI Bruno;1956;CM;0;RM;290755;811181;108649;m -SCAGLIARINI Gennaro;1598;2N;30;VR;030548;0;107699;m -SCAGLIARINI Valentin;1865;1N;30;RM;231081;0;108650;f -SCAGLIOLA Antonio;1637;2N;30;NA;240361;0;4888;m -SCAGLIOTTI Mauro;1837;1N;30;PV;000857;0;101223;m -SCALAS Manuela;1700;2N;30;VA;131161;0;4890;f -SCALCON Fabio;1700;2N;30;VI;000969;0;4891;m -SCALELLA Luigino;1685;2N;30;AP;001262;0;4892;m -SCALFARO Sergio;1910;1N;30;RM;280871;0;105406;m -SCALIA Giuseppe;1655;2N;30;CT;001121;0;4894;m -SCALIA Mario;1904;CM;30;PA;000567;0;4895;m -SCANNI Antonio;1852;1N;30;CS;200555;0;100909;m -SCARPA Arnaldo;1616;2N;30;VE;270643;0;103086;m -SCARPA Mauro;1826;1N;30;RN;000667;0;4898;m -SCATTAREGGIA Domenic;2035;CM;30;ME;090153;0;103825;m -SCATTURICE Luis Alfo;2000;CM;30;NA;000455;0;4900;m -SCAVAZZA Giampaolo;2159;CM;0;VI;160371;813753;101207;m -SCAVINI Marco;1948;1N;30;PV;111165;0;100269;m -SCAVINI Massimo;1739;2N;30;PV;301169;0;100270;m -AMELI Gianni;1565;2N;30;AP;020159;0;4904;m -SCERBO Antonio;2109;-M;0;CZ;050655;805688;103168;m -SCHACHER Gerd;2274;-M;0;BZ;060276;803979;109693;m -SCHAERF Andrea;2090;CM;30;RM;000665;0;4907;m -SCHAERF Marco;2000;CM;30;RM;000263;0;4908;m -SCHEMBRI Antonio;1682;1N;30;GE;310741;0;117125;m -SCHEMBRI Roberto;1587;1N;30;RG;280959;0;105725;m -SCHENETTI Maurizio;1715;2N;30;MO;000354;0;110259;m -SCHIAPEL Piero;1772;2N;30;NN;0;0;4912;m -SCHIAPPACASSE Marcel;1870;1N;30;GE;081141;0;100514;m -SCHIAPPOLI Dario;1926;1N;0;NA;240449;811661;104618;m -SCHIATTI Piero;2042;CM;0;MN;010163;824143;101235;m -SCHIESARO Alberto;1721;2N;30;MI;120870;0;104187;m -SCHILIRO' Maurizio;1834;1N;30;CT;000474;0;4917;m -SCHINTU Enrico;1700;2N;30;CA;000758;0;4918;m -SEVERINO Giulio;1661;2N;30;GE;240236;0;104466;m -TASSON Giovanni;1541;2N;30;VE;250448;0;104188;m -SCHROTT Karl;1924;1N;30;BZ;000170;0;4921;m -FEZZI Mario;1727;2N;30;TP;070563;0;105758;m -SCHWENKOW Tommaso;1700;2N;30;MI;000556;0;4923;m -SCIACCA Massimo;2141;CM;0;GE;130565;805700;101039;m -SCIACCALUGA Marco;1825;1N;30;GE;210853;0;128947;m -SCIALLERO Vittorio;1900;1N;30;GE;000057;0;4926;m -SCIANNAMEA Valerio;1810;1N;30;RM;000556;0;4927;m -SCIORTINO Massimo;2204;FM;0;PT;260768;807060;106011;m -SCOLA Alfredo;2000;CM;30;VA;000760;0;4929;m -SCOLA Andrea;1924;1N;30;TO;000172;0;4930;m -SCOGNAMIGLIO Marco;1700;2N;30;RM;311079;0;112056;m -SCOTTA Piergiorgio;1613;1N;30;TO;301036;0;100515;m -SCOTTI Adriano Valte;1900;1N;30;BG;040356;0;100894;m -SCOTTI Mirko;1876;1N;30;VR;000368;0;4934;m -SCOTTI Umberto;2207;-M;0;TO;080355;803316;102281;m -SCOTTO Marco;2200;-M;0;SP;111258;802859;4936;m -SCRINZI Otto;2002;CM;30;IM;250943;0;105074;m -SEBASTI Alessandro;1529;2N;30;RM;151213;0;110947;m -SEBASTIANELLI Dario;2235;-M;0;AN;130475;807443;104733;m -SEBASTIANELLI Diego;2340;FM;0;AN;020371;802735;104730;m -SEDILE Giovanni;1813;1N;30;LE;150151;0;104764;m -SEEBACHER Reinhard;1700;2N;30;BZ;001160;0;4942;m -SEGATINI Andrea;2035;CM;0;BZ;170848;806242;105562;m -SELENI Aldo;2100;CM;30;TS;250448;0;103804;m -SELLERI Claudio;1891;1N;30;BO;060161;0;101604;m -SELMI Carlo;2000;CM;30;BO;260539;0;113789;m -SELMI Vincenzo;1793;2N;30;RM;070362;0;114155;m -SEMBENINI Marco;1691;2N;30;VR;180879;0;100937;m -SEMERIA Marco;2064;CM;0;BO;230856;807940;101603;m -SENATORE Luigi;1900;1N;30;VA;130160;0;103973;m -SENZIANI Fabio;1700;2N;30;BG;110980;0;4951;m -SEPPOLONI Marco;1637;2N;30;PG;000456;0;4952;m -SERAPIGLIA Roberto;1811;1N;30;GE;;0;4953;m -SEREGNI Angelo;2000;CM;30;MI;000935;0;4954;m -SERENA Giovanni;1640;2N;30;RM;000359;0;4955;m -SERGIO Luca;2108;CM;30;NA;130965;0;4956;m -SERICANO Carlo;1700;2N;30;AL;001267;0;4957;m -SERICANO Claudio;2260;-M;0;SP;050863;800473;103671;m -SERPI Andrea;2187;-M;20;MI;230564;0;104004;m -SERPILLI Paolo;2107;CM;30;MC;000567;0;4961;m -SERPILLO Mario;1751;2N;30;RM;000163;0;107284;m -SERRA Ruggiero;2009;CM;30;CB;151062;0;103907;m -SETTI Denis;1769;1N;30;BO;061159;0;101605;m -SETTIS Massimo;2063;CM;30;TO;;0;111207;m -SETZU Francesco;1610;2N;30;CA;271137;0;107610;m -SFORZA Franco;1667;2N;30;CA;141027;0;113435;m -SGARAVATTI Francesco;2124;CM;0;PD;180157;812820;103234;m -SGARGI Giuseppe;2050;CM;0;CR;051252;827916;104252;m -SGARGI Vincenzo;1700;2N;30;BO;000558;0;4970;m -SGARITO Carmelo;1925;1N;30;AG;300578;0;104288;m -SGHERI Carlo;1754;2N;30;PA;250958;0;113792;m -SGNAOLIN Davide;2154;CM;0;VA;030779;806137;100878;m -SGORLON Felice;2038;CM;0;TV;170747;808687;102359;m -SGRO' Antonino;1888;1N;30;CR;210359;0;101279;m -SGUAIZER Piero;2058;-M;0;AT;211056;811459;105288;m -SHABAN Abdelgawad;2144;CM;0;GE;180553;812625;105158;m -SIBILIO Mario;2393;FM;0;RM;270560;800422;109717;m -SIBILLE Ettore;1971;CM;0;AL;270155;811335;101219;m -SIEFF Massimo;1858;1N;30;TN;000961;0;4980;m -SIGILLO Carmelo;1637;2N;30;VR;021057;0;107143;m -SIGMUND Ingenuin;1754;2N;30;BZ;131261;0;4982;m -SIGNORINI Luciano;1819;1N;30;VR;000048;0;4983;m -SILINGARDI Pompeo;1744;1N;30;MI;000466;0;4984;m -SILINI Riccardo;1604;2N;30;PV;270157;0;117212;m -SILVESTRI Paolo;1907;CM;30;GE;070648;0;105162;m -SILVETTI Antonio;2077;CM;0;PE;231161;817007;107255;m -SIMEONI Matteo;2009;CM;0;RM;250761;807753;100461;m -SIMIONI Tiziano;1733;2N;30;PD;180650;0;105678;m -SIMOLI Sergio;2268;-M;0;VE;031256;808393;106331;m -CHICCO Giancarlo;1661;2N;30;CB;050859;0;104658;m -PAPA Walter;1688;2N;30;BN;120375;0;4992;m -GIELLA Francesco;1646;2N;30;FR;230565;0;100611;m -BENZONI Vittorio;1700;2N;30;TO;200968;0;4994;m -CITRIOLI Mirko;1739;2N;30;PU;240580;0;4995;m -EMOROSO Claudio;1799;1N;30;CO;210364;0;105000;m -GAMBARO Giorgio;1844;1N;30;BI;280753;0;107626;m -LORENZINI Franco;1661;2N;30;RM;300956;0;4998;m -RAMONDINO Renzo;2294;FM;0;RM;190278;810304;107222;m -ROVATTI Paolo;1966;CM;0;VB;070567;808725;104458;m -RANDAZZO Sergio;2104;CM;30;SP;100973;0;113769;m -ORIGGI Maurizio;1804;1N;30;VA;190664;0;101380;m -BERTOLETTI Diego;1715;2N;30;BG;211079;0;105530;m -SCOGLIO Luca;1712;2N;30;VA;130270;0;101376;m -MILANESI Erminio;1874;1N;0;CR;100260;826235;120319;m -DAL-BRUN Giancarlo;1802;1N;30;MI;120663;0;103003;m -COLOMBO Maurizio;1736;2N;30;MI;040360;0;104772;m -ICARDI Ivan;1628;2N;30;TO;;0;5008;m -PASINI Giorgio;2240;CM;0;MI;110263;810940;111718;m -COLANGELI Claudio;1676;2N;30;RM;210466;0;5010;m -BOSCHI Massimiliano;1836;1N;0;PI;220176;826057;101965;m -RICCI Rolando;1700;1N;30;PI;161147;0;108900;m -PROFILI Bruno;1766;2N;30;MC;260757;0;102114;m -VANNO Salvatore;1664;2N;30;LT;260144;0;116102;m -MONDELLO Gabriele;1889;1N;30;RM;300977;0;5015;m -PALOMBA Massimo;1589;2N;30;RM;171057;0;5016;m -PASSALI Giovanni;1781;2N;30;RM;;0;5017;m -DE-MAIO Amelia;1631;2N;30;NA;100882;0;102714;f -STOLL Marion;1700;2N;30;BZ;160377;0;5019;f -ERSCHBAMER Sira;1595;2N;30;BZ;020882;0;105559;f -VALLE Vincenzo;1670;2N;30;LT;210229;0;104939;m -OPACIC Alexandar;2109;CM;0;VI;120977;811998;103873;m -PRODAN Armando;1484;3N;30;TS;;0;5023;m -DE-CAROLIS Maurizio;1878;1N;0;RM;300957;814857;107700;m -COVA Riccardo;1563;3N;30;TS;211079;0;103189;m -CAPANO Gregorio;1700;2N;30;MI;0;0;5026;m -ROVEDI Mauro;2039;CM;0;PU;110666;814032;101839;m -PELO' Natalino;1700;2N;30;NN;000453;0;5028;m -MOZENIK Iztok;1584;3N;30;TS;260464;0;103182;m -CARRADORI Corrado;1903;1N;30;PO;080259;0;101407;m -D'ALFONSO Nicola;2077;CM;0;MI;211273;819620;106432;m -RUSSO Dario;1685;2N;30;TS;270461;0;106523;m -MARINARO Paolo;1607;2N;30;TV;;0;5033;m -GRASSI Diego;1769;2N;30;FI;070567;0;102099;m -MORETTI Stefano;1917;1N;0;FI;250563;822035;107218;m -PAOLINELLI Andrea;1835;1N;30;LU;210577;0;103480;m -RICCO Fulvio;1691;2N;30;RE;0;0;5037;m -MARSON Antonio;1837;1N;0;TV;300944;818330;107804;m -FAILLI Riccardo;1943;1N;30;RM;030573;0;112360;m -DELLA-PIETRA Andrea;2143;CM;0;UD;200579;810223;103735;m -BIBBIANI Piero;1763;2N;30;LU;120766;0;5041;m -SCAVO Fernando;2260;FM;0;VA;140275;805939;104719;m -FACCIOLA' Maurizio;1697;2N;30;CT;0;0;5043;m -LIBRIZZI Salvatore;1694;2N;30;CT;230461;0;114063;m -MAZZILLI Piero;2310;FM;0;PA;210582;807087;104149;m -RINALDO Simone;1582;3N;30;TV;0;0;5046;m -PRATICO' Elio;1700;2N;30;TV;120763;0;107811;m -BROLESE Davide;1580;3N;30;TV;040784;0;111316;m -BIANCHINI Luigi;1539;3N;30;PE;260258;0;101767;m -BERNABEI Alberto;2019;CM;0;LE;090652;815560;103916;m -BONADE' Giacomo;1799;2N;30;PC;021265;0;107528;m -MUSSI Massimo;1676;2N;30;MI;0;0;5052;m -BARIGELLI Enrico;1960;1N;30;AN;110462;0;102325;m -PIOVESAN Alberto;1700;2N;30;TV;0;0;101479;m -D'ANDREAMATTEO Anton;1856;1N;30;PE;260380;0;109806;m -BONTEMPI Piero;2318;FM;0;AN;031075;809250;104732;m -BERLIN Luca;1700;2N;30;VE;0;0;5057;m -DI-BIAGIO Angelo;1700;1N;30;TE;150148;0;103983;m -TRIFOGLIO Giovanni;1796;1N;30;MT;310162;0;106713;m -CHINNICI Giorgio;1724;1N;30;MI;110358;0;100707;m -DI-MIZIO Roberto;1568;2N;30;PE;220152;0;101772;m -CARBONE Marcello;1751;2N;30;BS;0;0;5062;m -VARIATO Mariano;1718;2N;30;BG;151172;0;100899;m -ALLEGRETTI Luigi;1981;1N;0;IM;131165;816850;105075;m -MANZO Roberto;1676;2N;30;LE;0;0;5065;m -MADIA Carlo;1697;2N;30;AT;080670;0;105301;m -STOLL Richard;1691;2N;30;EE;210336;0;5067;m -QUALANO Bartolomeo;1700;2N;30;TV;200465;0;105452;m -BORSATO Mirko;1646;2N;30;TV;210655;0;108538;m -PACE Antonio;2140;CM;30;SP;000637;0;5071;m -BOSCOLO Gianni;1700;2N;30;VE;0;0;5072;m -CONTINI Libero;1840;1N;30;MI;031127;0;111086;m -FRIGATO Paolo;1658;2N;30;RO;070372;0;5074;m -RASTELLI Michele;2005;CM;0;TE;060583;817309;106698;m -COSTANTINI Giancarlo;1580;3N;30;VE;030545;0;104523;m -TOMASI Giannandrea;1700;2N;30;TN;140676;0;100665;m -IMPERIALI Cesare;1700;2N;30;MI;0;0;5078;m -MORONI Giorgio;1682;2N;30;TE;220785;0;110050;m -CLERICI Giulio Rufo;1580;3N;30;MI;141078;0;5080;m -CAROSONE Roberto;1634;2N;30;AQ;200557;0;107460;m -ORZA Pierantonio;1700;2N;30;VE;190462;0;111802;m -RAINALDI Matteo;1700;2N;30;AQ;0;0;5083;m -DI-DOMENICO Marco;1548;3N;30;RM;170972;0;103638;m -D'INNOCENTE Stefano;2261;FM;0;PE;231182;811084;107249;m -ACCOSSANO Paolo;1709;2N;30;GE;181265;0;101329;m -CENTORAME Achille;1709;2N;30;PE;300867;0;103413;m -GIAMMARINO Valeriano;1700;2N;30;PE;230560;0;5088;m -PELAGATTI Plinio;1484;3N;30;PE;231231;0;107250;m -COCCIA Roberto;1580;3N;30;PE;211157;0;110101;m -VITALE Gaetano;1700;2N;30;CE;0;0;5091;m -ENEA Roberto;1682;2N;30;CE;0;0;5092;m -LAUDADIO Antonio;1700;2N;30;CE;110570;0;100400;m -SANTANGELO Michele;1769;2N;30;CE;240676;0;121200;m -BERNI Giorgio;2240;-M;0;MI;170385;811270;103592;m -SERRATORE Vincenzo;2046;CM;30;VV;260857;1311360;124198;m -D'ERRICO Francesco;1679;2N;30;CE;280862;0;100399;m -ROMEO Francesco;1694;2N;30;SA;281177;0;103777;m -DI-NUZZO Giuseppe;1643;2N;30;CE;100253;0;103958;m -MATERIA Carmelo;1712;2N;30;ME;040578;0;100176;m -STELLATO Francesco;1523;2N;30;CE;020346;0;114984;m -BORDIGNON Angelo;1808;1N;30;PD;010378;0;5102;m -MUSSO Riccardo;1691;1N;30;TV;0;0;5103;m -MUNARETTO Giovanni;1751;2N;30;VI;070352;0;104487;m -CARROZZA Gregorio;1619;2N;30;RC;230246;0;122174;m -VETTURI Pietro;1697;2N;30;BG;080152;0;110408;m -GODINA Paolo;1601;2N;30;TO;140262;0;100008;m -MARCHESI Antonio;1670;2N;30;AT;0;0;5108;m -MASSAFRA Francesco;1712;2N;30;MI;150562;0;109781;m -SALVO Guglielmo;1786;1N;30;BS;050940;0;101917;m -FESTA Fiorentino;1580;3N;30;AV;180369;0;5111;m -BERNI Fabrizio;2156;CM;0;MI;201079;811017;103591;m -FOGASSI Primo;1649;2N;30;BS;140653;0;5113;m -CONTI Ferdinando;1622;2N;30;BS;300659;0;102062;m -TONOLI Diego;1610;2N;30;BS;270963;0;106933;m -BOLSI Lucio;1685;2N;30;MI;030637;0;104789;m -BORGA Andrea;1688;2N;30;TO;201081;0;100781;m -DALIMEG Alfredo;2148;CM;0;MI;120951;808822;113957;m -DE-MARCO Walter;2042;CM;0;MI;290663;813630;100697;m -MAGGI Angelo;1700;2N;30;MI;160147;0;5120;m -MILANESI Roberto;1742;1N;30;MI;120762;0;104562;m -PAPPALARDO Antonio;1709;2N;30;MI;300464;0;5122;m -POLITI Marco Augusto;1643;2N;30;MI;010656;0;5123;m -PULITO Alberto;2215;CM;0;TO;140786;809276;103537;m -PALARCHI Paolo;1700;2N;30;SI;220566;0;5125;m -MARRA Giuseppe;1685;2N;30;VA;140644;0;102552;m -RIZZI Wolfango;1787;2N;30;EE;020672;0;105168;m -DA-FORNO Roberto;1958;1N;0;RN;120567;821144;105848;m -GUIDI Giacomo;1574;3N;30;FC;;0;5129;m -TOMBA Ivan;2227;-M;0;BO;250185;808431;101609;m -DE-GROOT Bastian;1679;2N;30;RN;0;0;5131;m -AMBROSOLI Gualtiero;1700;2N;30;CO;100559;0;102966;m -GIANATTI Felice;1700;2N;30;SO;070661;0;5133;m -NEGRI Sergio;1691;2N;30;LC;280459;0;104792;m -MAJO Eduardo;1547;2N;30;BG;020740;0;105525;m -RANFAGNI Stefano;2016;CM;0;BG;040679;819913;101671;m -BRUMAT Giorgio;2030;CM;30;TV;210352;0;106495;m -FREGONESE Giulio;2204;-M;0;VE;230661;806960;103071;m -CARRARO Antonio;1577;2N;30;PD;230837;0;108203;m -TROLESE Giovanni;1700;2N;30;PD;081276;0;5140;m -TIRRITO Luca;2108;CM;0;PA;030572;810509;104161;m -ARNETTA Marianna;2054;CM;0;PA;040282;809527;110562;f -LI-VIGNI M.;1751;2N;30;PA;0;0;5143;m -MESSINA Rosario;1619;2N;30;PA;101151;0;114968;m -PERNA Vincenzo;1592;2N;30;FG;040371;0;117519;m -RUBINO Aldo;1694;2N;30;AV;310176;0;119608;m -COLUCCI Stefano;1913;1N;0;BN;080162;824011;100448;m -ZAMPARELLI Gaetano;1700;2N;30;BN;080157;0;5148;m -BOVE Raffaele;1778;1N;30;BN;170748;0;100440;m -SPANU Claudio;1700;2N;30;FR;190761;0;5150;m -BRANDI Flaviano;2003;CM;0;RM;170172;813320;114550;m -CENNI Franco;1697;2N;30;RM;260933;0;102371;m -ESMAIL Anuar;1700;2N;30;NN;0;0;5153;m -CARLACCI Umberto;1673;2N;30;RM;100645;0;118328;m -D'AVINO Luca;1853;1N;30;NA;140770;0;116210;m -BOSSA Massimo;1685;2N;30;NA;090168;0;5156;m -RUSSIELLO Pasquale;1802;1N;30;NA;190878;0;101057;m -SANTANGELO Nicola;1844;1N;30;CE;110670;0;114983;m -PACIOCCO Renato;1808;1N;30;NA;270657;0;107073;m -AMICO Rosario;1892;1N;30;CL;041266;0;101141;m -NOBILE Stefano;1713;1N;30;SR;060764;0;109913;m -PINTAUDI Alfio;1676;2N;30;CT;0;0;117405;m -RONDELLI Stefano;1700;2N;30;PG;0;0;5163;m -LAGHETTI Gaetano;1972;1N;0;BA;140559;825107;107158;m -FICHERA Mario;1700;2N;30;MI;0;0;5165;m -BOTTINO Alexiei;2048;CM;0;CT;150678;809128;100451;m -DONGHI Fabio;1700;2N;30;CO;010856;0;104709;m -LA-MALFA Antonino;1685;2N;30;ME;290747;0;102670;m -CAMPAILLA Maurizio;1658;2N;30;RG;0;0;5169;m -LA-TERRA Orazio;1607;2N;30;RG;230247;0;105726;m -PENNISI Fabio;1655;2N;30;CL;0;0;5171;m -SALAFIA Pierangelo;1556;2N;30;CT;050578;0;106126;m -LALICATA Salvatore;1610;2N;30;SR;0;0;5173;m -RICCIO Eros;2175;CM;0;LU;011277;809225;103483;m -GROSSI Massimo;1667;2N;30;FI;0;0;5175;m -BRANCACCIO Alfonso;1880;1N;30;PI;070671;0;103462;m -PANATTONI Angelo;1691;2N;30;LU;011060;0;103479;m -GARRAPA Gianluigi;1996;CM;0;BA;060773;816043;109379;m -DELFINO Luigi;2104;CM;0;TA;300782;809993;105816;m -RIGA Raffaele;1709;2N;30;BA;180164;0;5180;m -FUMAROLA Antonio;1694;2N;30;TA;140768;0;5181;m -PAIANO Ernesto;1706;2N;30;MT;100747;0;106715;m -CULLE' Salvatore;1991;CM;0;CL;040561;812170;101450;m -TURLO Francesco;1700;2N;30;CL;050758;0;5184;m -CALAMERA Michele;1807;1N;0;CL;060970;819573;101144;m -DE-DONNO Carlo;1882;1N;30;BR;0;0;5186;m -ROLLO Sergio;2020;CM;0;LE;190580;825220;105650;m -FORTUNATO Mimmo;1700;2N;30;BR;201178;0;5188;m -MOROSI Dario;1721;2N;30;BR;060764;0;106238;m -RUGGERI Dario;1742;1N;30;CR;010460;0;101179;m -TOSATO Stefano;1700;2N;30;VR;;0;5191;m -BARBOLINI Daniele;1700;2N;30;MO;281078;0;5192;m -BENINCASA Marco;1981;CM;0;MO;061173;809721;101883;m -FRASSOLDATI Giacomo;1706;2N;30;MO;201081;0;101921;m -GALLERANI Alfredo;1808;1N;30;FE;271154;0;102232;m -MALAVASI Federico;1700;2N;30;MO;160371;0;107869;m -PALMIERI Werther;1700;2N;30;MO;071248;0;111055;m -RUBINI Gilberto;1712;2N;30;BO;040744;0;101598;m -TOMISICH Claudio;1667;2N;30;BZ;001069;0;5199;m -TOMMASELLI Angelo;1673;2N;30;VI;001168;0;5200;m -TOMMASELLI Giacomo;2054;CM;0;BA;140559;809969;107167;m -TOMMASELLI Salvatore;1700;2N;30;AG;001265;0;5202;m -TOMMASI Daniele;2204;CM;0;VR;240771;806498;100940;m -TOMMASINI Enzo;2146;-M;0;RM;151159;804789;105869;m -TONDO Aldo;1661;2N;30;SR;000655;0;5205;m -TONELLI Aldo;1805;1N;30;PD;260655;0;103235;m -TONELLI Claudio;1813;1N;30;PE;011057;0;107256;m -TONELLI Francesco;1559;2N;30;RM;000818;0;5208;m -TONELLOTTO Pietro;2000;CM;30;VI;001124;0;5209;m -TONGHINI Rosolino;2005;CM;30;CR;210459;0;104238;m -TONIATTI Josef;1819;1N;30;BZ;270141;0;105570;m -TONNA Guido;2057;CM;30;GE;031056;0;101354;m -TONON Alessandro;2186;-M;0;UD;271072;805270;105893;m -TORDI Tommaso;1900;1N;30;RM;000073;0;5214;m -TORELLI Mirco;2008;CM;30;VI;100959;0;104480;m -TORIELLI Andrea;1888;CM;30;MI;0;0;5216;m -TORNABONI Claudio;1772;2N;30;SP;140759;0;105485;m -TORRESAN Ettore;1511;2N;30;TV;000653;0;5218;m -TORRETTA Gilberto;1616;2N;30;MI;300550;0;102566;m -TORRI Graziano;1859;1N;30;BL;270756;0;105017;m -TORRIELLI Domenico;2141;CM;30;GE;000360;0;5221;m -TORTAROLO Marco;2196;-M;20;MI;290764;0;101722;m -TORTAROLO Massimilia;2280;-M;0;MI;060668;800856;101717;m -TORTORELLA Giancarlo;1838;1N;30;IM;020768;0;108829;m -TOSCANI Stefano;1838;1N;30;PR;000361;0;5225;m -TOSCANO Giuseppe;2068;CM;30;CT;110267;0;102480;m -TOSI Francesco;2004;CM;30;RM;000166;0;5227;m -TOSI Marco;2170;CM;0;MI;220961;808059;5228;m -TOSONI Augusto;2238;-M;0;RM;050172;807389;105396;m -TOSONOTTI Pierfranco;1900;1N;30;TO;000050;0;5230;m -TOTH Bela;2365;IM;0;VA;190443;800139;104721;m -TORTORELLI Procolo;1706;2N;30;NA;000167;0;5232;m -TOVAZZI Maurizio;1625;2N;30;TN;280353;0;5233;m -TOZSER Janos;1900;1N;30;BO;060133;0;105344;m -TRABATTONI Franco;2329;FM;0;MI;130556;800430;102417;m -TRADARDI Mario;2050;CM;30;TO;000562;0;5236;m -TRAINI Ido;1862;1N;30;AP;210971;0;120232;m -TRAMAGLINI Alberto;1900;1N;30;TE;280457;0;116564;m -TRAMALLONI Luca;2114;CM;0;MI;060672;809748;101001;m -TRAMPETTI Luca;1936;1N;30;PG;000770;0;5240;m -TRANI Francesco;1765;1N;30;RM;001048;0;110368;m -MAJER Andrea;1700;2N;30;VE;080665;0;111595;m -TRANZOLIN Marco;1700;2N;30;TO;0;0;5243;m -TRATTO Mimmo;1960;1N;30;TO;190957;0;102193;m -TRAVAGLINI Alberto;2208;CM;0;MO;010863;806110;103207;m -TRAVASONI Marco;2160;CM;0;MI;140957;804215;109230;m -TRAVERSA Armando;1808;1N;30;BA;010848;0;113810;m -TRAZZI Fabio;1900;1N;30;VA;000163;0;5248;m -TREBBI Alessandro;1844;1N;30;PU;000267;0;113811;m -TREBESCHI Andrea;2072;CM;0;RM;170271;808881;110374;m -TRENKWALDER Kurt;1900;1N;30;BZ;000571;0;5251;m -TRENTIN Armando;1697;2N;30;LC;0;0;5252;m -TREVISAN Luigi;2166;CM;0;PN;080872;814083;102032;m -BIVI Enea;1673;2N;30;CR;0;0;110091;m -TREZZA Bruno;2215;-M;20;RM;131137;0;5255;m -TRIANTAFILLOPULOS De;1634;2N;30;SI;000958;0;5256;m -TRIBUIANI Renato;2091;CM;0;RM;171246;804525;110045;m -TRICARICO Aldo;2029;CM;30;AN;001156;0;5258;m -TRILLI Franco;1511;2N;30;TO;251241;0;101994;m -TRINCARDI Tullio;2235;-M;0;RE;230336;801160;113812;m -TRIPODO Roberto;1862;1N;30;PA;061248;0;104886;m -TRIPODO Sergio;1861;1N;30;PA;060152;0;104887;m -TROIANI Mauro;2048;CM;0;MI;191257;811548;100869;m -TROISE Salvatore;1694;2N;30;RO;020554;0;101188;m -TROMBETTA Giorgio;1900;1N;30;SV;000230;0;5265;m -TROMBETTA Vincenzo;2000;CM;30;CZ;001059;0;5266;m -TROMBETTONI Andrea;2020;CM;0;PG;090173;809659;5267;m -TRONCOSSI Luca;2160;CM;0;RA;201269;805440;109422;m -TROVATO Alessio;1829;1N;30;AN;000672;0;5269;m -TRUFFELLI Guido;1900;1N;30;RE;170966;0;103584;m -TRUINI Stefano;1900;1N;30;FR;001162;0;5271;m -TULIC Dean;1655;2N;30;SV;0;0;5272;m -TURCHI Paolo;1939;CM;30;AN;000457;0;5273;m -TURCI Alberto;2007;CM;0;MI;280441;815411;104003;m -TURCI Stefano;2199;-M;0;RE;071062;801224;105140;m -TURCO Alfonso;2102;CM;0;RM;170559;808679;5276;m -TURCU Florin;1804;1N;30;AT;190464;0;5277;m -TURRIN Osvaldo;1996;CM;30;PN;060262;0;102033;m -TURTURICI Pellegrino;2015;CM;0;RM;010148;808253;107286;m -TUTTOBENE Sergio;2064;CM;0;CT;120951;812641;115058;m -UBEZIO Marco;2161;-M;0;BI;020454;803430;102257;m -UDARDI Alessandro;1670;2N;30;NA;170774;0;5282;m -UNGARO Olindo;2026;CM;30;PD;080458;0;110688;m -UNTERFRAUNER Albert;2140;CM;0;BZ;150263;800775;108786;m -UNTERTHURNER Hans;1963;1N;30;BZ;170353;0;101944;m -DE-BERARDINIS Stefan;1556;3N;30;TE;191271;0;110831;m -URCIUOLI Guido;1694;2N;30;RM;000855;0;5287;m -URLATI Mario;1780;1N;30;BI;000643;0;5288;m -USAI Mauro;2050;CM;30;CA;000564;0;5289;m -VACCA Alessandro;1984;1N;30;OR;000372;0;5290;m -VACCA Cesare;1900;1N;30;TO;001046;0;5291;m -VACCA Luigi;2085;CM;30;RM;000560;0;5292;m -VACCA Paolo;1850;1N;30;NA;000273;0;5293;m -VACCANI Alberto;2225;-M;0;SP;270867;808040;105486;m -VACCANI Mario;1840;1N;30;VA;101037;0;103014;m -VACCANI Virgilio;2060;CM;30;SP;000546;0;5296;m -VACCARO Maurizio;1882;1N;30;LT;000956;0;5297;m -VACCHI-LANDINI Giorg;1900;1N;30;BO;000018;0;5298;m -VACCHIANO Massimo;1688;2N;30;CR;300554;0;104239;m -VALASTRO Mario;1890;CM;30;SR;001158;0;5300;m -VALDETTARO Nicolo';2230;CM;0;MI;080358;801232;5301;m -VALEGGIA Rocco;2084;CM;30;VE;000861;0;5302;m -VALENTE Dario;2017;CM;30;TO;150574;0;101989;m -VALENTI Antonio;1894;1N;30;TE;100254;0;109139;m -VALENTI Giuseppe;2273;FM;0;MI;220956;801119;103037;m -VALENTINI Angelo;1844;1N;30;GE;151058;0;102304;m -VALENTINI Paola;1965;CM;0;VI;271066;817902;103874;f -VALENTINI Pietro;1649;2N;30;VI;000862;0;5308;m -VALENZANO Giorgio;1733;2N;30;BI;220848;0;107637;m -VALENZI Marco;2051;CM;0;NA;290141;827134;101874;m -VALGUARNERA Girolamo;2188;-M;0;PA;200463;804240;104150;m -VALLE Lorenzo;1667;2N;30;GE;111166;0;100379;m -VALLE Paolo;1900;1N;30;GE;250151;0;104465;m -VALLI Marco;1700;2N;30;RM;030777;0;5314;m -VALLIFUOCO Giacomo;2366;FM;0;NA;040557;800228;102775;m -VALLIFUOCO Giovanni;2159;-M;0;NA;101254;800783;124026;m -VALLINI Arnaldo;1607;2N;30;MI;001163;0;5317;m -VALLONE Ugo;1784;2N;30;BN;001272;0;5318;m -VALORI Vincenzo;2049;CM;0;FI;200551;809519;107978;m -VERKHOVSKI Mikhail;1700;2N;30;RM;151159;0;110961;m -VANCINI Edoardo;2250;FM;0;BO;071165;800597;105464;m -VANDELLI Davide;1688;2N;30;MO;211276;0;5322;m -VANIN Massimo;1760;2N;30;VE;000466;0;5323;m -VANZAN Fabrizio;1894;1N;30;RM;000273;0;5324;m -VARGIU Ottavio;1840;1N;30;CA;;0;5325;m -VARINELLI Sara;1694;1N;30;BG;180778;0;110435;f -VARINI Massimo;2053;CM;0;TS;061067;806080;103806;m -VASTA Gianfranco;1712;2N;30;LZ;000755;0;5328;m -VECCHI Michele;2054;CM;30;FE;000862;0;5329;m -VECCHIO Giuseppe;1604;2N;30;NA;241152;0;106628;m -VELLA Carlo;1700;2N;30;CT;190855;0;103429;m -VENA Donato;1873;1N;30;MT;171064;0;118572;m -VENDRAME Giorgio;1694;2N;30;VE;230645;0;110704;m -VENERUSO Marco;1900;1N;30;PD;000563;0;5334;m -VENEZIA Tonino;1900;1N;30;GE;000043;0;5335;m -VENNI Alberto;1715;2N;30;BO;070650;0;101611;m -VENTURA Boris;2168;CM;0;VI;291072;804827;105665;m -VENTURA Fabrizio;1954;CM;30;BO;000366;0;5338;m -VENTURA Franco;2164;-M;20;CR;010656;0;106120;m -VENTURA Giuseppe;2018;CM;0;AP;090266;803626;103881;m -VENTURA Paolo;1582;1N;30;VI;250925;0;105663;m -VENTURA Sergio;2114;-M;0;VI;200957;805823;105662;m -VENTURELLI Roberto;1825;1N;30;LU;311055;0;103487;m -VENTURI Andrea;1829;1N;30;LU;221066;0;103488;m -VENTURI Claudio;2000;CM;30;RA;000254;0;5345;m -VENTURI Roberto;1478;2N;30;RM;301056;0;108907;m -VENTURINI Enrico;1685;2N;30;BS;000974;0;5347;m -VENTURINI Fabiano;1741;1N;30;BS;210848;0;106096;m -VENTURINO Giuseppe;1574;2N;30;AT;000648;0;5349;m -VENTURINO Marco;2134;-M;0;AT;060655;807222;105289;m -VERA Cristiano;1652;2N;30;GE;140873;0;5351;m -VERARDI Gianparide;1619;2N;30;BA;040373;0;126257;m -VERDE Salvatore;1694;2N;30;CL;271255;0;101147;m -VERGNANI Marco;2000;CM;30;RE;001057;0;5354;m -VERLATO Matteo;1909;1N;30;VI;000969;0;5355;m -VERNEY Roberto;1700;2N;30;SV;160654;0;5356;m -VERONESI Carlo Alber;2000;CM;30;BO;000257;0;5357;m -VERRASCINA Nicola;2020;CM;0;RM;120760;804770;107288;m -VERRASCINA Roberto;2240;-M;0;RM;090466;802395;107289;m -VERRI Mario;2011;CM;30;MI;280343;0;103040;m -VERZETTI Augusto;1670;2N;30;NO;310367;0;109937;m -VESCO Claudio;1900;1N;30;TV;000070;0;5362;m -VESPASIANO Michele;1766;2N;30;TR;200356;0;5363;m -VESPE Francesco;2058;CM;0;MT;160260;810533;107929;m -VESPIA Gianmarco;2021;CM;30;RC;081279;0;107709;m -VETTORI Stefano;1915;1N;30;PD;000570;0;5366;m -VEZZANI Stefano;2195;CM;0;MN;010362;802727;101180;m -VEZZOSI Paolo;2356;IM;0;PR;141260;800341;105144;m -VIAGGI Giovanni;2149;CM;0;PD;260659;804967;111628;m -VIALE Claudio;1730;2N;30;TO;000365;0;5370;m -VIALE Guglielmo;1607;2N;30;AT;290539;0;105297;m -VIANELLO Enrico;2144;CM;0;VE;020778;810738;100099;m -VIANELLO Francesco;1900;1N;30;VE;000852;0;5373;m -VIANELLO Giuseppe;1634;2N;30;VE;270318;0;102360;m -VIANELLO Marco;2000;CM;30;VE;121265;0;101484;m -VICARI Luigi;2042;CM;0;BO;190257;805017;109425;m -VICOLI Giordano;2095;CM;30;RM;140259;0;107194;m -VIDALE Onorio;1825;1N;30;TO;170536;0;102813;m -VIGANO' Massimo;2165;CM;0;GE;190562;805734;100517;m -VIGNATO Giovanni;2071;CM;0;RM;050469;805777;100260;m -VILLA Claudio;1753;1N;30;BG;090258;0;114912;m -VILLA Flavio;2132;CM;0;RE;020455;810312;105104;m -VILLANOVA Luciano;1667;2N;30;VI;000266;0;5384;m -VINANTI Francesco;2036;CM;30;FI;000170;0;5385;m -VINCENTI Dante;1730;2N;30;TO;000169;0;5386;m -VINCENZI Marco;2026;CM;0;MO;220576;814679;101925;m -VINCENZI Riccardo;2006;CM;30;VE;060460;0;106338;m -VINCIGUERRA Gabriele;1960;1N;30;GE;261165;0;128481;m -VINZONI Andrea;2116;CM;0;MI;160464;807192;100589;m -VISCOMI Gualtiero;1900;1N;30;PA;000056;0;5391;m -VISENTIN Claudio;2117;-M;20;MI;;0;102511;m -VISINTIN Roberto;2024;CM;0;GO;240569;807613;100644;m -VISMARA Antonio;1529;2N;30;MI;190136;0;103022;m -VITA Fabrizio;2081;CM;0;BO;061067;807796;109851;m -VITALE Antonio;1867;1N;30;NO;180661;0;102037;m -VITALE Giacomo;2028;CM;0;MI;201264;822957;103015;m -VITE Pietro;1787;2N;30;MI;000363;0;5399;m -VITRI Sergio;2105;CM;0;TS;051169;805190;103187;m -VITTIGLIO Giuseppe;2190;CM;30;RE;000329;0;5401;m -VITTORI Francesco;1730;2N;30;GE;000664;0;5402;m -VIVO Mario;2165;-M;0;PR;261052;804584;110253;m -VOLIANI Mauro;1700;2N;30;LI;190755;0;103946;m -VOLPARI Franco;1885;1N;30;TN;080663;0;110604;m -VOLPI Davide;2053;CM;0;MI;160873;811483;105653;m -VOLTINI Roberto;1888;1N;30;CR;300164;0;104241;m -VOLTOLINI Giuseppe;2216;-M;0;BZ;081058;801917;101273;m -VOLTOLINI Mario;2215;-M;0;RN;060757;804894;105859;m -VUKOVIC Jovo;1700;2N;30;TO;000457;0;5410;m -VULPIS Domenico;1900;1N;30;BA;000864;0;104845;m -WAIBL Markus;1769;1N;30;BZ;160377;0;5412;m -WEILER Oswald;1691;2N;30;BZ;001047;0;5413;m -WEINBERG Emanuele;1967;CM;0;VR;050335;813788;102036;m -WERTH Luis;1700;2N;30;BZ;000738;0;5415;m -WERTHER Florian;2097;CM;0;BZ;051272;818500;5416;m -WERTHER Tobias;2325;FM;0;BZ;071273;802425;5417;m -WHISSTOCK David;2014;CM;30;MI;241066;0;111726;m -WIDMANN Paul;1981;1N;30;BZ;091055;0;5419;m -WIELANDER Karl;2000;CM;30;BZ;000831;0;5420;m -WILD Peter;1993;1N;30;BZ;060563;0;5421;m -WISTHALER Lukas;1730;2N;30;BZ;000973;0;5422;m -PASQUALETTO Alberto;1700;2N;30;TV;081167;0;101509;m -YEUILLAZ Corrado;2201;-M;0;AO;090661;801364;102917;m -ZADRA Claudio;1787;2N;30;TN;250366;0;102734;m -ZAGAGLIA Alessandro;1577;2N;30;AP;290769;0;113410;m -ZAGALLO Bruno;2003;CM;30;MI;000751;0;5427;m -ZALTRON Claudio;1754;2N;30;RM;000747;0;105684;m -ZAMA Domenico;2053;CM;30;RA;240354;0;109424;m -ZAMBON Antonio;2112;CM;30;VE;091050;0;113779;m -ZAMBOTTI Fabio;1855;1N;30;SV;271268;0;5431;m -ZAMMARCHI Massimo;2003;CM;0;BZ;180371;809543;101531;m -ZAMPOGNA Giuseppe;1673;2N;30;PV;0;0;5433;m -ZANATTA Aldo;1625;2N;30;TO;000440;0;5434;m -ZANELLA Giovanni;1697;2N;30;VE;000556;0;5435;m -ZANELLATO Lorenzo;2100;CM;0;MI;081265;809845;100590;m -ZANETTI Fabio;1667;2N;30;TV;140859;0;110143;m -ZANGARI Massoud;1900;1N;30;PG;000056;0;5438;m -ZANGHERATTI Daniele;1846;1N;30;RO;000167;0;5439;m -ZANGLA Marcello;1858;1N;30;ME;201148;0;102671;m -ZANINI Andrea;1700;2N;30;VI;000668;0;5441;m -ZANINI Giuseppe;2024;CM;30;VI;101060;0;109107;m -ZANINOTTO Franco;2184;-M;0;MI;030460;800406;111720;m -ZANIRATTI Sergio;1658;2N;30;GE;000149;0;5444;m -ZANNI Sandro;1850;1N;30;MI;040375;0;111721;m -ZANNIER Luciano;2020;CM;30;PN;000135;0;5446;m -ZANNONE Massimo;1927;1N;30;MO;0;0;5447;m -ZANNONI Gianni;1736;1N;30;VC;190750;0;104698;m -ZANNONI Massimo;1873;1N;30;MS;001261;0;5449;m -ZANOBINI Andrea;1766;1N;30;FI;130662;0;101848;m -ZANONI Luca;1885;CM;30;VI;260262;0;106588;m -ZANONI Sergio;1900;1N;30;VE;220724;0;103061;m -ZAPPALA' Alberto;1690;1N;30;CT;030151;0;102473;m -ZAPPAMIGLIO Massimo;1903;1N;30;BS;000367;0;5454;m -ZAPPI Adriano;1717;2N;30;BZ;280253;0;114278;m -ZARA Enrico;1897;1N;30;TO;000560;0;5456;m -ZARA Mauro;2014;CM;30;TV;001157;0;5457;m -ZARBA Calogero;1904;1N;0;CT;260275;818526;117151;m -ZAVATTA Benedetta;2050;CM;0;RN;010477;806757;5459;f -ZAYAT Renato;1900;1N;30;LT;000910;0;5460;m -ZEARO Franco;1634;2N;30;UD;190565;0;5461;m -DE-SIMONE Gaetano;1649;2N;30;SA;051276;0;110893;m -ZENTIL Giuseppe;2117;CM;30;PD;000556;0;5463;m -BALDI Giancarlo;1676;1N;0;VI;131256;820806;108102;m -ZICCHE Diego;1726;1N;30;VI;010556;0;101213;m -ZICCONI Gavino;2000;CM;30;CA;000150;0;5466;m -TERZI Massimo;1560;3N;30;BA;040169;0;117205;m -ZILBERSTEIN David;2500;IM;0;RM;121141;800317;5470;m -ZINANI Alessandro;2244;-M;0;PR;190265;803294;110247;m -ZINNO Mimmo;1541;2N;30;PI;001049;0;5472;m -ZIVIANI Claudio;1888;1N;30;VR;300952;0;101937;m -ZIZZARI Pietro;1718;2N;30;PZ;150655;0;106275;m -ZOGGIA Walter;1700;2N;30;TO;000252;0;5476;m -ZOLDAN Matteo;2127;CM;0;MI;141170;805319;103542;m -ZOLET Antonio;1739;2N;30;TN;260733;0;109201;m -ZONA Alessio;1900;1N;30;FI;000058;0;5479;m -ZONIN Antonio;2100;CM;30;VR;000563;0;5480;m -ZOPPEI Igino;1589;1N;30;MI;301040;0;100972;m -DI-PINTO Vincenzo;1499;2N;30;NU;030563;0;5482;m -ZORAT Paolo;1934;CM;0;UD;150365;818062;105897;m -ZOTTI Enrico;2058;CM;0;PD;270969;809497;106787;m -ZUCCARO Luigi;1900;1N;30;PT;000857;0;5485;m -ZUCCARO Marco;2005;CM;30;AL;181154;0;101225;m -ZUCCHELLI Massimo;2135;-M;0;TN;010466;804193;101274;m -ZUCCHERI Andrea;2046;CM;30;MI;000771;0;5488;m -ZUCCHETTA Gian Franc;1900;1N;30;VE;070627;0;101485;m -ZUCCHETTO Pierpaolo;1802;1N;30;VE;290659;0;112332;m -ZUCCOLI Maurizio;1754;2N;30;VA;260759;0;102985;m -ZUCCONI Leandro;2116;CM;0;PT;051056;805890;102908;m -ZUFFOLINI Michele;1900;1N;30;MO;000041;0;5493;m -ZULIAN Alberto;1814;1N;30;VR;000456;0;5494;m -ZULIAN Stefano;1889;1N;30;VI;150767;0;104484;m -ZUNINO Davide;1820;1N;30;TO;080173;0;100807;m -ZUPI Renato;1900;1N;30;CS;001256;0;5497;m -ZURLA Mirko;2245;-M;0;BO;231256;804673;5498;m -ZURLO Catello;1727;2N;30;NA;160665;0;105630;m -GALLENI Mario;2135;CM;0;FI;060964;803065;5500;m -SIVELLI Luca;1643;2N;30;MI;271062;0;117697;m -GUARNIERI Giuseppe;1965;CM;0;RM;220255;809004;122653;m -DONISI Pietro Maria;1655;2N;30;VE;041256;0;120497;m -SABIA Corrado;2146;CM;0;SA;020678;808903;102686;m -GIGLIO Antonio;1577;2N;30;NA;130166;0;120309;m -BARBIERI Giovanni;2067;CM;0;MO;071249;804533;100202;m -MARNONI Gianluigi;1700;2N;30;MI;060541;0;100195;m -TOMEI Francesco;1700;2N;30;MO;100350;0;106811;m -BERTAGNOLLI Alexande;2325;FM;0;BZ;160583;809551;100677;m -BERTAGNOLLI Gerhard;2041;CM;0;BZ;021076;815985;100676;m -ELLER Helmut;1619;2N;30;BZ;250577;0;5511;m -BROCCHI Stefano;1679;2N;30;TO;0;0;5512;m -PELOSIN Matteo;1798;1N;0;TV;121281;825999;106485;m -DI-LERNIA Ruggero;1799;1N;30;MI;100673;0;102392;m -GALLI Fabio;2066;CM;0;MI;280280;809772;100555;m -VALTEMARA Paolo;1850;1N;30;MI;091067;0;110442;m -MUCCI Angelo;1649;2N;30;BZ;210333;0;5517;m -ALEXIADIS Alessio;1952;1N;30;TO;031171;0;104824;m -BARBISO Tiziana;1919;CM;30;TO;041180;0;103253;f -SERIO Vitale;1700;2N;30;GR;040668;0;5520;m -PORZIO Franco;1559;2N;30;TO;151058;0;103247;m -PEPINO Enrico;2187;CM;0;TO;111072;810908;105390;m -CARNINO Luca;1787;1N;30;TO;170665;0;102206;m -GALIETTO Alberto;1955;1N;30;NA;290557;0;111422;m -SORBO Antimo;1634;2N;30;NA;140558;0;5525;m -DONADEL Silvano;1700;2N;30;TV;290554;0;104196;m -DE-SIMONE Dario;1661;2N;30;NA;120162;0;107896;m -LITRICO Paolo;1691;2N;30;VE;081275;0;103354;m -DE-VITA Leonardo;1700;2N;30;PZ;0;0;5529;m -ESPOSITO Ignazio;1529;3N;30;NA;140558;0;5530;m -CATAPANO Francesco;1763;1N;30;CS;030565;0;104128;m -BARANI Riccardo;1700;2N;30;MO;090459;0;100193;m -LEPSCHI Albert;1715;2N;30;EE;0;0;5533;m -GRAZIANO Alfonso;1575;3N;30;AV;080663;0;114909;m -SANTULLI Adriano;1443;3N;30;NA;140874;0;5535;m -PACILLI Emanuele;2142;CM;0;PE;020884;812900;101775;m -IACCHEO Massimo;2018;CM;0;TS;160267;812072;106521;m -BUSA' Michele;1595;2N;30;PD;250756;0;5538;m -GIOULIS Giorgio;1885;1N;30;TS;080534;0;103793;m -COLOMBO Stefano;1580;3N;30;MI;021072;0;113952;m -FAIFER Franco;1601;2N;30;TN;161138;0;100858;m -GURSCHLER Thomas;1760;2N;30;BZ;100676;0;101952;m -MISCERU' Giuseppe;2005;CM;30;RC;080657;0;5543;m -FERRARO-PELLE Giovan;1685;2N;30;CZ;240660;0;103165;m -BATTAGLIA Luigi;1649;2N;30;CZ;0;0;5545;m -CATALANO Vincenzo;1754;1N;30;ME;010861;0;5546;m -MERLO Tindaro;1682;2N;30;ME;310155;0;108150;m -ALAIMIA Taoufik;1745;2N;30;RC;031264;0;107710;m -BATTAGLIA Giuseppe;1631;2N;30;VA;180778;0;125554;m -BEATRICE Antonio;1619;2N;30;VA;040559;0;5550;m -LISCIO Giovanni;1985;CM;30;CO;100267;0;102980;m -DI-MICCOLI Carmine;1700;2N;30;BA;090577;0;5552;m -CORATELLA Giuseppe;2204;-M;0;BA;070481;808504;105647;m -CONTI Pietro;1709;1N;30;BA;010649;0;107150;m -FRANCIONE Aldo;1700;2N;30;BA;071049;0;5555;m -AMENDOLA Michelangel;1637;2N;30;BA;220675;0;125112;m -AMENDOLA Vincenzo;1709;2N;30;BA;0;0;107931;m -NAVACCHIA Andrea;1667;2N;30;FC;140471;0;109219;m -BENEDICT Vincent;1870;1N;30;UD;190959;0;105899;m -LAVARONI Carlo;1634;2N;30;UD;011166;0;105904;m -LA-MURA Giuseppe;1901;1N;30;UD;010361;0;105906;m -FORGIARINI Fabrizio;1754;2N;30;UD;301281;0;103737;m -CECOTTI Daniele;1781;2N;30;UD;131068;0;105912;m -CHECCHINATO Christia;1700;2N;30;PD;200275;0;5564;m -VAMPA Alfio;1772;2N;30;PU;040434;0;101838;m -FANTINO Massimo;1592;2N;30;RM;100662;0;5566;m -IPPOLITO Marco;1706;2N;30;NA;120776;0;5567;m -SEBASTIAN Arnold;1856;1N;30;CT;100572;0;102454;m -DISTEFANO Nicolo';1709;2N;30;EN;0;0;5569;m -COSTA Salvatore;1583;2N;30;CT;010134;0;101098;m -GAGLIANI Stefano;1734;2N;30;MI;230176;0;129167;m -MELOGLI Gianmario;1712;2N;30;MI;260964;0;100592;m -TORTORA Paolo;1817;1N;30;MI;010768;0;127455;m -TRENTINI Danilo;2089;CM;0;MI;250180;808709;5574;m -BONOMI Paolo;1808;1N;30;MI;140579;0;101739;m -MORLOTTI Massimilian;1754;1N;30;CO;141271;0;104977;m -MARTELLI Tommaso;1742;2N;30;MI;131080;0;117518;m -BALZARINI Franco;1700;2N;30;BZ;211262;0;5578;m -NIEDERKOFLER Andreas;1691;2N;30;BZ;201180;0;124021;m -PALLHUBER Manfred;1700;2N;30;BZ;0;0;5580;m -LAMPARELLI Gaetano;1721;2N;30;BN;0;0;5581;m -MOLINARI Carlo;1826;1N;30;SA;270578;0;5582;m -DE-LUCCIA Salvatore;1700;2N;30;SA;201150;0;100620;m -PATTON Arrigo;1664;2N;30;TN;070445;0;100674;m -BALDO Loris;1988;1N;30;TN;050774;0;100048;m -BORRELLO Roberto;1700;2N;30;VR;0;0;5586;m -TIZIANEL Elio;1700;2N;30;PN;010364;0;103841;m -DUSSIN Davide;1823;1N;30;TV;231073;0;103385;m -CONZ Flavio;1646;2N;30;TV;210727;0;101512;m -MOGNOL Giacomo;1916;1N;30;TV;260265;0;107805;m -ROLLO Carmelo;1613;2N;30;LE;210144;0;105550;m -DE-LEO Stefano;1745;2N;30;LE;261266;0;113425;m -RUGGERI Claudio;1703;2N;30;IM;040555;0;5593;m -SDRAULE Cesare;1610;2N;30;PG;160714;0;5594;m -DE-FELICI Roberto;1631;2N;30;RM;311262;0;108906;m -GERS Taddeo;1664;2N;30;RM;251060;0;5596;m -QUOMDAMSTEFANO Aless;1700;2N;30;RM;000063;0;5597;m -GUBELLINI Luciano;1640;2N;30;PD;190546;0;104030;m -NOVELLO Guido;1727;2N;30;TV;250159;0;106487;m -LEVORIN Santin;1685;2N;30;PD;021146;0;112299;m -SALATA Alessio;1673;2N;30;PD;060454;0;104063;m -BRUNELLA Jacopo;1697;2N;30;VA;170871;0;5602;m -LEVANTACI Jacopo;1691;2N;30;VA;160882;0;5603;m -COSTELOE Philip;1700;2N;30;VA;101175;0;5604;m -LAPICCIRELLA Mattia;2237;-M;0;MI;281080;807907;100125;m -FEDELI Carlo;1658;2N;30;MC;200269;0;105588;m -CARBONE Filippo;1700;2N;30;VA;0;0;116706;m -TABORELLI Achille;1802;1N;30;CO;270733;0;102983;m -ZAMPIERI Gianni;1775;2N;30;TO;0;0;5609;m -FAVA Franco;1700;2N;30;TO;120251;0;5610;m -RABAIOLI Paolo;1712;2N;30;TO;250675;0;102191;m -MANDRILE Enrico;1766;2N;30;CN;280568;0;109532;m -ROSSO Emanuele;1845;1N;0;TO;281269;819069;120872;m -BAROLO Andrea;1751;2N;30;TO;200277;0;5614;m -FERRERI Giuseppe;1625;2N;30;TO;011280;0;5615;m -PISANO Claudio;1631;2N;30;TO;230163;0;102000;m -RUPO Claudio;1631;2N;30;TO;270557;0;127486;m -FAVARO Roberto;1700;2N;30;TO;220550;0;5618;m -BALOSSETTI Davide;1712;2N;30;TO;220279;0;5619;m -BROSIO Antonino;1595;2N;30;TO;040361;0;104396;m -SARTORIO Francesco;1685;2N;30;VI;080982;0;5621;m -PATERA Francesco;1655;2N;30;MO;190275;0;5622;m -BUCELLA Erminio;1867;1N;30;TN;0;0;5623;m -BELLI Paolo;1757;2N;30;MS;0;0;5624;m -AUGUSTO Nazario;1832;1N;30;LU;040963;0;110635;m -LISANTI Marco;2190;CM;0;NN;0;806650;5626;m -PIERANTONI Mauro;1709;2N;30;AO;0;0;5627;m -MAURACHER Micha;1709;2N;30;BZ;000573;0;5628;m -DISSERTORI Martin;1457;2N;30;BZ;001162;0;130578;m -ILLMER Markus;1652;2N;30;BZ;000979;0;5630;m -APICELLA Gerardo;1772;2N;30;SA;080364;0;5631;m -DIFLORIO Giuseppe;1643;2N;30;SA;011080;0;110907;m -MEGNA Giuseppe;1718;2N;30;NA;020574;0;113921;m -PALUMBO Giuseppe;1592;2N;30;SA;200667;0;110906;m -BORRELLI Ciro;1679;2N;30;NA;080660;0;107235;m -PELUSO Clemente;1556;2N;30;NA;;0;5636;m -SANTORO Alessandro;2076;CM;0;NA;301281;809136;109980;m -SARNO Valerio;1872;1N;0;SA;040769;827045;119131;m -TOZZINI Tiziano;1691;2N;30;SA;240958;0;5639;m -BADIOLI Luca;1802;1N;30;AN;031267;0;111741;m -BIONDI Francesco;1685;2N;30;BO;260480;0;107920;m -CAPRARA Gianfranco;1655;2N;30;BO;240851;0;5642;m -MARRONI Valerio;1640;2N;30;BO;280856;0;100289;m -CARDONA Paolo;1937;1N;30;SV;220963;0;104383;m -MADEO Carlo;1688;2N;30;AT;310775;0;106828;m -MARQUEZ Marco;1700;2N;30;GE;200281;0;5646;m -TARDITO Pierluigi;1700;2N;30;SV;110165;0;114569;m -CANDIANI Andrea;1715;2N;30;GE;011168;0;113589;m -PARODI Carlo;1790;2N;30;GE;190769;0;127452;m -STRAZZERI Roberto;1538;2N;30;GE;250553;0;101053;m -ACCARDO Maurizio;1700;2N;30;GE;300672;0;114129;m -MALASPINA Marco;1700;2N;30;GE;020171;0;104815;m -CAMPO Alberto;1646;2N;30;SV;260159;0;104386;m -TREGLIA Gianfranco;1628;2N;30;CN;200968;0;102200;m -AVOLIO Guido;2041;CM;0;GE;111264;811777;101315;m -MAREMMANI Filiberto;1640;2N;30;LU;251057;0;106058;m -TESORO Davide;1664;2N;30;SP;120969;0;103639;m -BERTOLINI Marcello;1727;2N;30;SP;160161;0;103659;m -ARKEL Luca;1508;2N;30;GE;290627;0;101075;m -BELGRANO Alessandro;1631;2N;30;SV;;0;5660;m -DURDEVIC Radoslav;2092;CM;0;GE;160861;807958;101321;m -DEL-NERO Ezio;1724;2N;30;GE;240660;0;101043;m -ARNOLD Fritz;1990;1N;30;RM;070144;0;102647;m -DE-BLASIO Alessandro;2066;CM;0;RM;071172;812188;100817;m -LUNA Giovanni;1583;2N;30;RM;100639;0;100246;m -ANDREOZZI Franco;1538;2N;30;RM;231036;0;102143;m -CASELLA Carlo;1595;2N;30;RM;130348;0;105425;m -LIBURDI Renzo;1544;2N;30;RM;070764;0;5668;m -NEGRI Paolo;1622;2N;30;VB;260658;0;104451;m -ZECCHINI Franco;1685;2N;30;VC;;0;102262;m -MOREA Mauro;1700;2N;30;NO;171058;0;109407;m -AVETTA Gianmario;1736;2N;30;VC;150565;0;104700;m -SGARLATA Renato;1700;2N;30;VA;101145;0;104535;m -BACCHINI Stefano;1547;2N;30;VA;150762;0;101374;m -CURIONI Franco;1739;2N;30;CO;020659;0;116122;m -MILICI Antonio;1832;1N;30;LC;241068;0;107052;m -MAKSIMOVIC Miograd;2003;CM;30;EE;020753;0;104693;m -DIGIUSEPPE Stefano;1811;1N;30;TE;161078;0;5678;m -MONTANARI Ivano;1700;2N;30;PE;230165;0;5679;m -POSSANZINI Lorenzo;1673;2N;30;AN;190980;0;104746;m -BERTOGLI Cesare;1724;2N;30;BS;081226;0;105526;m -RIVA Carlo;1601;2N;30;MI;310358;0;112398;m -LONGO Pietro;1757;2N;30;BG;060767;0;103917;m -PEDRAZZINI Franco;1613;2N;30;LO;010136;0;104433;m -GOI Veronika;1953;1N;0;VE;301280;819735;106682;f -ISATTO Davide;1724;2N;30;VI;280382;0;120624;m -BASSETTO Silvano;1481;2N;30;VI;030359;0;120403;m -CARMEN Roberto;1625;2N;30;TV;261265;0;107818;m -DAL-ZOVO Claudio;1970;CM;0;VR;031258;817252;100522;m -PADOVAN Remo;2026;CM;0;VI;180585;821683;108104;m -SIGNORATO Mariano;1619;2N;30;VR;080166;0;106583;m -LEOPARDI Stefano;1436;2N;30;MI;240560;0;101714;m -SCARCELLI Luigi;1700;2N;30;CS;130680;0;114388;m -TARANTINO Gianfranco;1655;2N;30;CS;231170;0;5694;m -MANO Vincenzo;1895;1N;30;KR;270359;0;106476;m -CESETTI Egidio;1691;2N;30;RN;020768;0;110912;m -COSTANTINI Laura;2048;CM;0;RN;260585;812587;105846;f -GUIDI Denis;1703;2N;30;FC;281282;0;5698;m -MUCCIOLI Ivo;1700;2N;30;RN;280179;0;5699;m -MOLINA Massimo;1613;2N;30;GE;021262;0;117955;m -FERRARA Sergio;1652;2N;30;PV;300960;0;5701;m -PUGLISI Rosario;1634;2N;30;CT;121053;0;109391;m -SANTOFERRARA Ivan;1700;2N;30;MI;240775;0;5703;m -CRISOSTOMI Antonino;1700;2N;30;RM;090645;0;110673;m -QUAGLIA Gianfranco;1719;2N;30;NN;0;0;5705;m -MARTINELLO Christian;2036;CM;30;VR;290981;0;5706;m -NEGRO Raffaele;1730;1N;30;VR;221048;0;104920;m -VIGILE Matteo;2086;CM;0;LT;310777;811556;106221;m -PASCALE Lucio;1688;2N;30;RM;301158;0;5709;m -TREGLIA Vittorio;1700;2N;30;LT;130872;0;5710;m -COCCIA Vincenzo;1718;2N;30;LT;310564;0;104944;m -CACCAVALLE Giuseppe;1649;2N;30;RM;190941;0;5712;m -FERRINI Maurizio;1736;2N;30;RM;140863;0;100353;m -ANCESCHI Francesco;1650;2N;30;MO;160435;0;106813;m -GHIRARDI Gianfranco;1622;2N;30;PR;041253;0;105885;m -MANTOVANI Fabio;1658;2N;30;PR;060482;0;108168;m -TURCO Francesco;1715;2N;30;CL;0;0;5717;m -FAITA Franco;1724;2N;30;CT;000449;0;5718;m -MOTTA Daniele;1676;2N;30;CT;130771;0;105786;m -LONGO Michelangelo;1772;2N;30;CT;061080;0;105784;m -NOCERINO Paolo;1619;2N;30;CT;040356;0;112822;m -FIASCO Michele;1625;2N;30;ME;280761;0;100173;m -DAMIGELLA Leonardo;1652;2N;30;CT;240683;0;106128;m -GAGLIARDI Christian;2119;CM;0;CO;040577;810665;103505;m -BONACINA Silvano;1691;2N;30;BG;310583;0;5725;m -BRIZZI Carlo Alberto;1730;2N;30;GR;091056;0;105314;m -ARANITI Michelangelo;1766;1N;30;FI;150760;0;109268;m -MAROPULAKIS Nikolaos;1823;1N;30;SI;200468;0;107579;m -CAPUANO Francesca;1977;CM;0;BA;190580;812110;106990;f -SPERA Michele;1703;2N;30;BA;070147;0;5730;m -PASCALI Antonio;1700;2N;30;BA;250357;0;5731;m -SARACINO Vincenzo;1616;2N;30;BA;121168;0;5732;m -BONZANO Maria Angela;1599;3N;30;MI;270482;0;103606;f -LOFANO Maurizio;1700;2N;30;BA;150373;0;5734;m -POVERO Gianfranco;1637;2N;30;LE;061063;0;5735;m -PISCOPO Pierluigi;2393;IM;0;LE;250283;809152;103927;m -RICCIO Renato;1628;2N;30;LE;240261;0;5737;m -MAGGIO Francesco;1700;2N;30;LE;030551;0;5738;m -CRUDO Alberto;1721;2N;30;BR;221279;0;5739;m -LAUDISA Marilena;1700;2N;30;LE;070450;0;5740;f -LONGO Nicola;1700;2N;30;LE;060168;0;5741;m -BOVINO Alessio;1694;2N;30;LE;280957;0;102856;m -CORVAGLIA Antonio;1700;2N;30;LE;091255;0;5743;m -CESI Fabio;1865;1N;30;BR;260171;0;106235;m -GATTA Flavio;1880;1N;0;RM;290366;827894;100605;m -MACCHINI Bruno;1805;1N;30;RM;290857;0;108904;m -MARTINO Antonio;1673;2N;30;RM;010156;0;118817;m -MONTANARI Ugo;1700;2N;30;RM;180950;0;5748;m -DEL-CASTELLO Lucio;1766;2N;30;RM;010153;0;104363;m -LARSEN-BO;2156;CM;0;VA;200658;810118;104022;m -PIERBATTISTI Giorgio;1850;1N;30;PG;0;0;5751;m -ANRATHER Eva;1622;2N;30;BZ;150657;0;105556;f -LA-ROSA Francesco;1700;2N;30;PI;010557;0;106074;m -RUBINI Silvano;1550;2N;30;SP;230836;0;103666;m -TESORO Abramo;1787;2N;30;SP;120969;0;103656;m -COSTA Roberto;1691;2N;30;MI;131076;0;5756;m -STROHHECKER Massimo;1700;2N;30;MI;060171;0;5757;m -DELIA Giuseppe;1574;2N;30;MI;200558;0;5758;m -CHIAROTTO Filippo;1946;1N;30;TO;110574;0;100788;m -MALVASIO Andrea;1715;2N;30;TO;310375;0;100810;m -ROTONI Matteo;2111;CM;0;MC;171274;813745;104579;m -LAVINO Stefano;1625;2N;30;BI;130470;0;102261;m -ALBERTAN-MIN Massimo;1742;2N;30;TO;010862;0;100779;m -PLATINO Maurizio;1900;1N;30;IM;220161;0;105084;m -ARENA Piermario;1730;2N;30;PV;110155;0;100285;m -GIUBERCHIO Cesare;1973;CM;30;PV;060770;0;100275;m -MANTOVANELLI Andrea;1598;2N;30;VE;0;0;5767;m -ANNALORO Andrea;1733;2N;30;PA;301173;0;104164;m -ANDREOZZI Paolo;1694;2N;30;RM;100461;0;5769;m -TASSONE Francesco;1427;2N;30;CZ;050241;0;103169;m -SPROVIERI Guglielmo;1613;2N;30;RM;0;0;5771;m -CASTELLANI Riccardo;1547;2N;30;RM;041056;0;113564;m -LEPRI Livio;2146;CM;30;RM;040369;0;5773;m -MANGIAVACCHI Leonard;1730;2N;30;RM;020873;0;5774;m -MONTAS Roberto;1700;2N;30;RM;011060;0;5775;m -BAVAGNOLI Roberto;1709;2N;30;RM;0;0;5776;m -CIAMBELLOTTI Stefano;1700;2N;30;PO;310757;0;5777;m -PERUZZI Fabio;1679;2N;30;LI;310563;0;106976;m -PORCELLI Marco;1592;2N;30;RM;200866;0;100253;m -POMANTE Sergio;1562;2N;30;TE;060570;0;101600;m -CHESI Saverio;1694;2N;30;BO;180365;0;102088;m -SALZANO Guido;2060;CM;0;RA;200272;814180;112054;m -TREVISANI Guelfo;1655;2N;30;FE;070261;0;102242;m -BIANCHI Riccardo;2019;CM;0;SI;270365;811505;107576;m -PRATI Alessandro;1868;1N;0;PC;100965;819352;111274;m -RISITO Corrado;1703;2N;30;PR;120737;0;5786;m -MAZZONI Carlo;1814;1N;30;PR;300950;0;105120;m -LOSI Renzo;1940;1N;30;PR;190479;0;108173;m -DI-GUARDIA Giovambat;1694;2N;30;CT;0;0;5789;m -ORTO Giuseppe;1706;2N;30;ME;010569;0;5790;m -ZAISER Michael;2110;CM;30;VA;0;0;5791;m -POZZOLI Mauro;1928;1N;30;MI;131158;0;113563;m -ALFIERI Sabato;1661;2N;30;NA;220958;0;111840;m -CARDILLO Pasquale;1670;2N;30;LT;010153;0;112369;m -DE-CARO Giovanni;1694;2N;30;BN;300971;0;5795;m -BONASIO Vittorio;1739;2N;30;BG;090955;0;106092;m -CARLONI Andrea;1658;2N;30;RN;070876;0;5797;m -PANINI Luciano;1760;2N;30;MO;300950;0;103208;m -PIRAZZOLI Carlo;1610;2N;30;BO;050264;0;5799;m -STUCCHI Luigi;1718;2N;30;MI;110150;0;100028;m -PONTE Raffaele;1822;1N;30;PG;110571;0;109148;m -SCALETTI Luciano;1772;2N;30;TR;071052;0;101894;m -GANDOLFI Valerio;1763;2N;30;CT;050579;0;100454;m -SALVAGGIO Salvatore;1694;2N;30;SR;240677;0;116026;m -LOCHE Roberto;1973;1N;30;CA;171277;0;107539;m -BETTAZZI Alessandro;1700;2N;30;PO;260857;0;101399;m -ROVERSI Stefano;1857;CM;0;GE;200162;813435;101038;m -REBEGGIANI Andrea;1969;CM;0;CH;060864;810916;106942;m -FEDERICO Salvatore;1905;1N;0;CS;031179;823503;104129;m -PANARELLO Giuseppe;1956;CM;0;ME;301176;823686;100844;m -GIARDINA Piera;1402;3N;30;MC;201265;0;109867;f -GALLO Raffaele;1580;2N;30;ME;180352;0;103822;m -SABATOSANTI Edoardo;1679;2N;30;GE;290883;0;115213;m -ZALLOCCO Marco;1441;3N;30;MC;021161;0;109875;m -GARVANI Vittorio;1997;1N;0;SP;140840;823546;105483;m -CARLOZZI Giovanni;1717;1N;30;RM;190256;0;111678;m -FORTE Pieraldo;1580;3N;30;VC;301053;0;5817;m -CIOTOLI Massimo;1556;3N;30;RM;040963;0;5818;m -RASTELLI Riccardo;1694;2N;30;TE;130887;0;106700;m -ANGELICI Andrea;1440;3N;30;RM;140676;0;100464;m -MANO Dionigi;1667;2N;30;KR;180363;0;106462;m -VANNICOLA Rodolfo;1775;2N;30;AP;310168;0;105712;m -DI-MATTEO Giovanni;1901;1N;30;TE;281076;0;109136;m -PIETROBON Fabio;2104;CM;0;VE;230372;813117;101515;m -SALA Sergio;1902;1N;0;MI;170473;823902;100587;m -CECATI Gianraffaele;1736;2N;30;AP;230255;0;5826;m -CARDARELLI Angelo;2050;CM;0;BL;270584;815594;105036;m -BURATTI Ettore;1727;1N;30;AN;010458;0;102328;m -COTUGNO Michele;1733;2N;30;SV;300460;0;107641;m -CEGLIO Fulvio;2040;CM;0;NA;081264;807931;102783;m -GANCI Davide;1817;1N;30;PA;220172;0;104172;m -PULGHE' Paolo;1625;2N;30;NO;291156;0;105198;m -CAMBRIA Gilberto;1697;2N;30;VR;180752;0;5833;m -ZANZOTTERA Stefano;1580;3N;30;MI;250674;0;5834;m -SALAMI Giovanni;1508;2N;30;MI;0;0;113565;m -PADRONI Marco;1781;1N;30;RM;210770;0;105411;m -MILETI Marco;1667;2N;30;LE;020775;0;5837;m -DI-DATO Alessandro;1613;2N;30;NA;090163;0;104616;m -QUARANTA Vitaliano;1835;1N;30;LE;010383;0;105649;m -FEBBO Giovanni;1763;2N;30;LE;240850;0;105373;m -MACCARIO Mauro;2165;CM;0;SP;290360;811793;103926;m -CAROLI Donatello;1727;2N;30;FC;300740;0;104655;m -GIOVANARDI Rino;2105;CM;0;FC;100951;807710;105852;m -MANGIA Roberto;1817;1N;30;PC;220869;0;105882;m -SIMONETTI Giuseppe;1703;2N;30;AN;260550;0;108059;m -VALGIMIGLI Giovanni;1703;2N;30;RA;301160;0;109427;m -LUCA' Alessandro;1835;1N;30;RC;080363;0;107721;m -VACCARO Salvatore;1709;2N;30;ME;190361;0;5848;m -CALPONA Sebastiano;1721;1N;30;ME;010659;0;102663;m -DI-LILLO Lorenzo;1653;2N;30;BG;070789;0;108041;m -MARCUGINI Stefano;1578;3N;30;PG;301265;0;103886;m -SOLERI Giovanni;1685;2N;30;IM;161056;0;108831;m -DE-FLORIO Federico;2026;CM;0;SV;031179;817937;109910;m -BERGESE Michele;1700;2N;30;CN;090249;0;111968;m -RIZZUTO Rosario;1467;3N;30;KR;040850;0;106463;m -INVERNICI Stefano;1655;2N;30;MI;201171;0;5856;m -TONAZZO Alberto;1802;1N;30;VA;110973;0;101378;m -DUCHEMINO Vittorio;1900;1N;30;TO;061142;0;5858;m -DI-PIETRO Giuseppe;1580;3N;30;AV;080351;0;5859;m -MARSILLI Eber;1700;2N;30;NO;121049;0;104881;m -GIOVANNELLI Gianfran;1550;3N;30;SI;020751;0;107568;m -CANESTRALE Giuseppe;1575;3N;30;MI;040148;0;104597;m -BARBUTO Antonio;1580;3N;30;FG;0;0;5863;m -CHERCHI Annalisa;1563;3N;30;CN;261266;0;105095;f -ZITO Domenico;1756;1N;30;AO;200549;0;102913;m -ZACCHERONI Dario;1599;3N;30;MI;210875;0;110689;m -ANGELINO Ezio;1560;3N;30;NO;180467;0;104878;m -LA-TORRE Dino;1535;3N;30;CS;280359;0;111258;m -CRISA' Franco;1539;3N;30;KR;210646;0;106756;m -MAURENSIG Paolo;1900;1N;30;UD;260343;0;103711;m -SKVRNA Zdenek;1658;2N;30;EE;201033;0;5871;m -BONCINELLI Lodovico;1589;2N;30;CO;310846;0;102970;m -PUZZONI Christian;2083;CM;0;CA;151174;822094;103278;m -CIRINA Gianluca;1925;1N;30;CA;131172;0;110549;m -BUCHICCHIO Giampaolo;2288;FM;0;SS;071284;811491;102433;m -DI-CERBO Ciro;1751;2N;30;BN;110580;0;100445;m -IAFELICE Vincenzo;2074;CM;0;FG;120782;810541;106164;m -SALVATORE Carmine;1664;2N;30;CB;290954;0;5878;m -TADDEI Marco;1700;2N;30;RM;181273;0;5879;m -CORDANO Roberto;1727;2N;30;BG;201075;0;109297;m -SCARABELLI Maurizio;1754;2N;30;BG;210360;0;100898;m -MATTIA Ermanno;1643;2N;30;BS;061061;0;106087;m -GRIENTI Fulvio;1679;2N;30;MI;021165;0;5883;m -MONTANELLI Cesare;1700;2N;30;BG;090966;0;102931;m -GALLETTI Edo;1700;2N;30;LI;270255;0;5885;m -ALBORE Daniele;1679;2N;30;RM;020377;0;5886;m -BALDUCCI Giuseppe;1760;2N;30;PG;060660;0;114982;m -DRAGO Valentino;1745;2N;30;RM;020365;0;117824;m -FRANCHI Alessandro;1682;2N;30;RM;010946;0;5889;m -CASASCHI Paolo;1960;1N;30;AL;0;0;5890;m -GAMBA Andrea;1700;2N;30;AT;150468;0;5891;m -PERNIGOTTI Carlo;2195;-M;0;GE;250380;809209;105157;m -HYSENI Yilli;1775;1N;30;AT;301069;0;5893;m -SALVAGNIN Alberto;2049;CM;0;MI;050163;808938;105652;m -COLOMBO Ernesto;1685;2N;30;MI;080569;0;110104;m -BALLARINI Andrea;1892;1N;30;TO;241083;0;121300;m -COSTANTINI Vladimiro;1571;2N;30;VA;080864;0;5897;m -BISCIOTTI Marino;1700;2N;30;MS;271157;0;5898;m -TONELLI Giordano;1700;2N;30;MI;300478;0;5899;m -SPRIO Carlo;1559;2N;30;MI;310546;0;5900;m -PACE Pietro Dario;2228;CM;0;MI;260284;810720;103539;m -BENTIVEGNA Francesco;2269;-M;0;EN;190482;809055;109630;m -GRASSO Giuseppe;1652;2N;30;CT;010368;0;102450;m -CUSMANO Antonello;1628;2N;30;ME;210562;0;112464;m -CARELLA Vincenzo;1727;2N;30;BA;081259;0;107163;m -CIARLO Michele;1619;2N;30;BN;010270;0;100449;m -DI-CERBO Valerio;1712;2N;30;BN;090677;0;100444;m -CASTRIGNANO' Cosimo;1700;2N;30;LE;190265;0;110805;m -BIZZOCO Vito;1733;2N;30;LE;250369;0;108837;m -CRETI' Gianluca;1769;2N;30;LE;250669;0;109838;m -LUGGIN Alois;1700;2N;30;BZ;110254;0;5911;m -CHRISTANELL Anton;1700;2N;30;BZ;271151;0;101948;m -BARATIERI Francesco;1760;2N;30;TN;150464;0;100669;m -FONTANARI Maurizio;2063;CM;0;TN;050771;813281;100861;m -ROVIGLIONE Giorgio;1580;3N;30;VC;0;0;5915;m -PANNONE Alessandro;1721;2N;30;BG;211067;0;102932;m -BANDIERAMONTE Enrico;1697;2N;30;PA;011064;0;117891;m -BUITTA Daniele;1895;1N;30;PA;200777;0;104171;m -GIACALONE Ermanno;1670;2N;30;PA;270654;0;5919;m -MANTELLO Filippo;1646;2N;30;ME;080646;0;5920;m -MONFALCONE Gaetano;1700;2N;30;PA;010247;0;5921;m -RANDAZZO Vincenzo;1700;2N;30;PA;100564;0;5922;m -TORTORICI Giuseppe;1718;2N;30;TO;150772;0;115600;m -TORTORICI Tommaso;1721;2N;30;AG;0;0;5924;m -CRISTIANO Giovanni;1697;2N;30;PZ;310163;0;114955;m -MANCUSO Gekj;1631;2N;30;FG;180731;0;112363;m -GRECO Aniello;1599;3N;30;NA;161083;0;101066;m -URBANO Francesco;1664;2N;30;BA;180367;0;5928;m -NOTARSTEFANO Tommaso;1793;1N;30;FG;200258;0;106153;m -CANESTRALE Vincenzo;1667;2N;30;FG;161172;0;106173;m -SALVEMINI Corrado;1850;1N;30;FG;150759;0;115996;m -GIACOLETTO Michele;1700;2N;30;TO;030176;0;5932;m -SPINA Pierluca;1700;2N;30;TO;110362;0;5933;m -BERNARDINELLO Angelo;1583;2N;30;TO;050565;0;103239;m -MOSSINO Claudio;1688;2N;30;TO;110655;0;102002;m -DELEMONT Michele;1634;2N;30;AT;081175;0;105302;m -MANCIN Patrizio;1655;2N;30;TO;230159;0;5937;m -TONELLO Andrea;1727;2N;30;TO;010175;0;103240;m -CANTALI Giulio;1700;2N;30;NN;0;0;5939;m -ALIBRANDI Alfredo;1787;1N;30;CT;030154;0;102446;m -GIONFRIDDO Mario;1636;2N;30;CT;061146;0;101100;m -TRICOMI Massimo;1884;1N;0;CT;141077;820784;109442;m -MANTARRO Antonio;1670;2N;30;ME;250363;0;100174;m -PINTO Antonio;1976;CM;30;PI;180974;0;109997;m -CORSO Roberto;2101;CM;0;LU;260177;813362;103467;m -CARDISCIANI Danilo;1643;2N;30;TE;050680;0;103980;m -DI-CECCO Giuseppe;2015;CM;30;AQ;280174;0;107467;m -CELLETTI Luca;1631;2N;30;RM;220164;0;5948;m -DE-ROSA Gaetano;1700;2N;30;RM;040323;0;5949;m -ONISI Stefano;1700;2N;30;RM;261163;0;5950;m -SCOLOZZI Umberto;1703;2N;30;RM;031033;0;5951;m -TAMBURINI Massimilia;1622;2N;30;RM;080465;0;5952;m -VISCARDI Riccardo;1814;1N;30;RM;060464;0;105405;m -MARTINEZ Guido;1969;CM;0;RO;230463;817279;106179;m -VIVODA Sergio;1592;2N;30;GO;010662;0;100652;m -MEZZANOTTE Maurizio;1580;3N;30;PG;081154;0;110664;m -SCALIA Roberta;1539;3N;30;MC;131284;0;102117;f -DIOTALLEVI Maurizio;2156;CM;0;AN;201053;810452;104735;m -LUZIETTI Camilla;1700;2N;30;RM;231185;0;104268;f -FIORI Bruno;2189;CM;0;NN;090155;4682084;5960;m -LOTTI Fabio;2043;CM;0;SI;010546;810681;107573;m -ARTESE Fernando;1649;2N;30;PO;130655;0;5962;m -MELI Ileana;1700;2N;30;BG;040279;0;5963;f -TROISI Cesare;1709;2N;30;SA;180260;0;110243;m -MUNNO Lorenzo;1700;2N;30;CE;300469;0;5965;m -ALAGNA Mario;1868;1N;30;TP;040755;0;103045;m -FIORE Tommaso;1820;1N;30;BA;080478;0;112267;m -SANTOIEMMA Giuseppe;1604;2N;30;TA;270143;0;105819;m -BATTISTA Luciano;1559;2N;30;TA;291062;0;121753;m -GUANCIALE Orazio;2156;CM;0;RM;140964;810347;108892;m -CANFORA Fabrizio;1898;1N;30;NA;220477;0;114839;m -PAGLIAFORA Alberto;1607;2N;30;NA;300665;0;5972;m -DUMELLA-DE-ROSA Genn;1709;2N;30;NA;150683;0;123305;m -GILIBERTI Antonio;1694;2N;30;AV;281247;0;5974;m -LEON Enrico;1739;2N;30;GO;090679;0;102861;m -IPPOLITI Giuliano;1790;2N;30;UD;200380;0;111788;m -PELLIS Franco;1844;1N;30;GO;250368;0;100647;m -FRANCO Oscar;1688;2N;30;GO;300952;0;102858;m -BIANCHI Andrea;2144;CM;0;VE;201071;807370;103065;m -BARATO Giuseppe;1813;1N;30;TV;120242;0;102579;m -CESTONARO Federico;1673;2N;30;VI;020171;0;110206;m -RIZZARDI Franco;1991;1N;30;PD;030457;0;101511;m -LUCERNI Lorenzo;1607;2N;30;BO;060382;0;5983;m -RINALDI Pietro;1622;2N;30;BO;290470;0;5984;m -SCALCIONE Michelange;2267;FM;0;BO;210778;809390;105467;m -ZEDDA Salvatore;1892;1N;30;BO;011266;0;100291;m -DI-CARO Calogero;2340;FM;0;AG;290484;813214;105613;m -MODICA Salvatore;1700;2N;30;AG;191129;0;5988;m -COLUCCI Vito;1661;2N;30;BR;071164;0;5989;m -MELIA Giuseppe;1682;2N;30;PV;220951;0;105176;m -MARGARECI Massimo;1700;2N;30;MI;030163;0;5991;m -MAGNANI Corrado;1703;2N;30;MI;250961;0;5992;m -ABDERHALDEN Andrea;1793;1N;30;MI;041166;0;109538;m -CAREDDA Giuseppe;1406;2N;30;CA;300756;0;103265;m -DIANA Antonello;1637;2N;30;CA;010156;0;103116;m -PORCEDDU M.;1682;2N;30;CA;0;0;5996;m -CAMPAGNA Maurizio;1832;1N;30;CA;170966;0;115312;m -DESSI' Giuseppe;1700;2N;30;CA;100251;0;5998;m -TEOFILATTO Stefano;1613;2N;30;CA;030763;0;112093;m -FINOCCHIARO Giovanni;1604;2N;30;CT;181076;0;102448;m -BRULLO Alessandro;1598;2N;30;ME;070969;0;6001;m -GRASSO Andrea;1658;2N;30;CT;010371;0;102449;m -BARBERA Armando;1577;2N;30;CT;100641;0;6003;m -DI-SANTO Mauro;1757;2N;30;RM;260870;0;6004;m -IONTA Tiziano;1805;1N;30;VT;031063;0;101906;m -LUCIBELLO Flavio;1700;2N;30;RM;;0;113027;m -GARFAGNOLI Marco;1739;2N;30;LU;030474;0;103473;m -MIGLIORINI Luca;1700;2N;30;MO;290582;0;6008;m -CLASER Tiziana;1700;2N;30;RE;150382;0;6009;f -CASTAGNETI Marco;1859;1N;30;PR;220463;0;108172;m -ANDREONI Mario;1871;1N;30;TO;150659;0;104825;m -LONGO Maurizio;1667;2N;30;VE;0;0;6012;m -MANTOVAN Giuseppe;1793;2N;30;TO;280654;0;6013;m -GEROLA Fausto;1799;2N;30;PR;0;0;6014;m -DORATI Giuseppe;1769;2N;30;MO;070548;0;103553;m -VIOLANTE Vincenzo;1703;2N;30;MO;260569;0;105889;m -REGGI Matteo;1856;1N;30;PR;230178;0;105888;m -GUARESCHI Corrado;1700;2N;30;PR;0;0;6018;m -TOMBA Stefano;1556;2N;30;BO;230353;0;115093;m -D'ALESSANDRO Frances;1595;2N;30;GE;220443;0;101345;m -COLANGELO Gianluca;1700;2N;30;GE;191071;0;6021;m -CAMASTRA Francesco;1652;2N;30;GE;290160;0;101343;m -MARASCO Marco;1700;2N;30;GE;180482;0;6023;m -CHIAMORI Maurizio;1891;1N;0;MI;121158;819611;101823;m -COGLIANDRO Santo;2014;CM;0;GE;220458;818674;105152;m -SAVELLI Giulio;1445;2N;30;RM;270941;0;110360;m -MORRICONE Ennio;1700;2N;30;RM;101128;0;6027;m -NUNZI Giorgio;1700;2N;30;PG;051178;0;6028;m -VENTURINI Fabrizio;1700;2N;30;NN;000078;0;6029;m -STUPPINI Gianluca;1700;2N;30;BO;190976;0;6030;m -MACCA' Stefano;1700;2N;30;VI;201276;0;6031;m -PLONER Meinhard;1700;2N;30;BZ;310775;0;6032;m -VENTURI Alessandro;1700;2N;30;BO;040275;0;6033;m -STEFANUCCI Paolo;1700;2N;30;NA;300175;0;6034;m -RABBONI Marco;1700;2N;30;VE;270577;0;6035;m -DEGRASSI Sergio;1919;1N;0;TO;160254;821420;102004;m -VATTI Giuseppe;1700;2N;30;TO;061034;0;6037;m -POGGI Andrea;1631;2N;30;TO;161182;0;110485;m -ODDENINO Piergianni;1730;2N;30;TO;040344;0;102187;m -RAVIOLA Piergiorgio;1550;2N;30;AT;040148;0;105303;m -BACIGALUPO Claudio;1999;CM;0;GE;200866;809357;110387;m -PARODI Andrea;1730;2N;30;GE;020684;0;6042;m -ZUCCHI Giordano;1652;2N;30;MI;070528;0;6043;m -CICOLIN Franco;1736;2N;30;VR;171070;0;100524;m -TURETTA Roberto;1700;2N;30;PD;030480;0;6045;m -TASSAN Mauro;1700;2N;30;PD;220166;0;108202;m -SANTI Lorenzo;1712;2N;30;PD;190655;0;6047;m -DE-MEO Gianfranco;1700;2N;30;RM;270569;0;6048;m -FICORELLA Luigi;1646;2N;30;RM;080464;0;107681;m -FIORE Danilo;1568;2N;30;RM;280465;0;105418;m -DI-FEDERICO Luigi;1769;2N;30;PE;100490;0;103424;m -CORLETTO Massimo;1736;2N;30;MI;200958;0;100147;m -FATTORELLI Gaetano;1640;2N;30;MI;0;0;6053;m -VALDEZ Larendo;1700;2N;30;MI;0;0;6054;m -SERAFINI Raffaele;1649;2N;30;VI;;0;6055;m -SANTACATERINA Pietro;1610;2N;30;VI;;0;120404;m -GROTTO Gianluca;1700;2N;30;VI;;0;6057;m -HUSSAM El Kashef;1691;2N;30;PV;;0;6058;m -BORRACCINO Mauro;1664;2N;30;NO;300150;0;111519;m -AMATI Franco;1580;2N;30;MI;311063;0;6060;m -SPENNATI Matteo;1700;2N;30;TO;200482;0;6061;m -FERRARIO Davide;1676;2N;30;BI;080160;0;6062;m -GIOVARRUSCIO Gabriel;1703;2N;30;NO;270450;0;104877;m -ERCOLANO Giuseppe;1577;2N;30;SA;030166;0;110193;m -SODANO Paolo;1700;2N;30;FI;040172;0;102079;m -SCARRONE Alberto;1787;2N;30;VC;280479;0;104553;m -TRIFONE Massimo;1580;3N;30;MI;021258;0;105474;m -COLESANTI Ugo Maria;2009;CM;30;RM;010383;0;100236;m -BUZZONI Eugenio;1676;2N;30;GE;030590;0;105151;m -MACALELLO Angelo;1688;2N;30;VR;211052;0;104917;m -DALL'ORA Gianfranco;1688;2N;30;VR;060359;0;104915;m -MAISTRI Enzo;1757;2N;30;TN;100963;0;100050;m -BOTTESI Gianluca;1664;2N;30;TN;161263;0;102735;m -FERRARI Simone;1625;2N;30;FI;181072;0;110085;m -MAIETTI Luca;1811;1N;30;FE;090960;0;102228;m -ZERBETTO Andrea;1916;1N;30;BO;220972;0;107919;m -ZOPPI Piero;1649;2N;30;PR;230951;0;106078;m -CARONE Giuseppe;1613;2N;30;TE;020451;0;106696;m -MAURIZIO Marco;1529;2N;30;TE;030959;0;105690;m -CERQUITELLA Luca;2185;CM;0;PE;270785;812579;103419;m -POSAPIANO Giacomo;1739;2N;30;MI;060353;0;102562;m -CAVESTRO Adriano;1700;2N;30;VA;141162;0;104019;m -TIZZONI Virginio;1721;2N;30;MI;180953;0;102565;m -BIANCO Alessandro;1700;2N;30;VA;061075;0;6085;m -BONATO Renato;1682;2N;30;VI;300365;0;6086;m -MARCHETTI Giulio;1700;2N;30;NN;010759;0;101984;m -RIBERTO Andrea;1637;2N;30;RO;120275;0;103570;m -TROMBIN Marco;1565;2N;30;VR;230880;0;6089;m -AMIGASSI Claudio;1700;2N;30;NN;160173;0;6090;m -DAL-PEZZO Andrea;1598;2N;30;VI;170985;0;103870;m -RUSSO Martino;1670;2N;30;GE;031038;0;6092;m -TRAVERSO Massimilian;1939;1N;0;GE;110681;817970;112061;m -ABBADESSA Serafino;1670;2N;30;GE;130624;0;101080;m -RUGGIERO Nicola;1700;2N;30;GE;140857;0;6095;m -CERROTI Filippo;1700;2N;30;RM;050655;0;6096;m -MICHELINI Marco;1700;2N;30;AO;010141;0;102912;m -MASCIOLINI Giovanni;1685;2N;30;RM;060556;0;6098;m -PIETRUCCI Stefano;1610;2N;30;RM;080267;0;6099;m -COPPARI Roberto;1661;2N;30;MI;;0;6100;m -DI-PAOLA Pietro;1712;2N;30;SR;241183;0;103685;m -CAPPELLO Antonino;1631;2N;30;SR;051150;0;6102;m -LORETO Carlo;1700;2N;30;SR;190245;0;6103;m -MOLISINA Sebastiano;1607;2N;30;SR;161166;0;6104;m -SCHEMBARI Serafino;1613;2N;30;RG;010565;0;105733;m -MARRONE Vincenzo;1926;1N;0;BA;120369;823333;107646;m -BRESCIA Teodoro;1667;2N;30;BA;230368;0;6107;m -SALVEMINI Fabio;1754;2N;30;FG;240273;0;106158;m -DE-MOLA Paolo;1652;2N;30;BA;070564;0;125115;m -MASCOLO Giuseppe;1667;2N;30;BA;150754;0;109722;m -DI-GIGLIO Giacinto;1637;2N;30;BA;030765;0;107651;m -FERRARO Fabio;1709;2N;30;BA;250164;0;111301;m -PATRUNO Riccardo;1625;2N;30;BA;290761;0;6113;m -GENOVESE Gaetano;1688;2N;30;PA;200563;0;6114;m -BARTOLOTTA Salvatore;1700;2N;30;PA;230866;0;104177;m -FERRO Mario;2238;-M;0;PA;290783;810290;104154;m -MAZZOLA Mario;1700;2N;30;NN;280350;0;6117;m -D'AGOSTINO Liberato;1694;2N;30;SA;160583;0;107002;m -CONTINI Gabriele;1946;1N;0;MI;131259;816264;111716;m -CRIMI Alessandro;1790;1N;30;PV;040969;0;100274;m -LUGLI Andrea;1694;2N;30;MI;;0;6121;m -ANTONINI Alessandro;1592;2N;30;MI;180171;0;6122;m -BRUSADELLI Antonio;1697;2N;30;LC;210157;0;104790;m -CAMAIORA Daniele;1727;2N;30;MI;020976;0;102923;m -FRIGERIO Emilio;1637;2N;30;LC;100945;0;107059;m -PAVANELLO Diego;1769;1N;30;VA;120580;0;104718;m -TODDE Giovanni;1667;2N;30;LC;260862;0;107050;m -VALENTE Fortunato;1691;2N;30;MI;240161;0;100563;m -URAS Gianni;1700;2N;30;SS;080555;0;6129;m -BELLU Marco;1907;1N;30;SS;220872;0;109849;m -LO-NERO Salvatore;1637;2N;30;CT;260744;0;102466;m -BARBAGELATA Diego;1700;2N;30;GE;220977;0;6132;m -CHIRICO Giovanni;1700;2N;30;GE;200881;0;6133;m -CLIVIO Marco;1505;2N;30;GE;070562;0;101331;m -MANGILI Davide;1861;1N;0;GE;010877;817619;110394;m -STAMPALIA Piergiorgi;1604;2N;30;GE;050336;0;110166;m -GIACOMIN Giorgio;1553;2N;30;VI;;0;6137;m -FEDERICO Giancarlo;1849;1N;30;LU;060461;0;112121;m -GALLETTI Armando;1712;2N;30;LI;270255;0;106977;m -CIUFFI Fabio;1700;2N;30;MS;281070;0;110534;m -COSTANTINI Carlo;1595;2N;30;RN;061148;0;105845;m -PIERACCINI Riccardo;2116;CM;0;LU;150956;811653;106855;m -VENTURINI Giuliano;1664;2N;30;MS;180161;0;100753;m -VERNELLI Antonio;1544;2N;30;AP;290523;0;101387;m -SALOMONI Roberto;1727;2N;30;AP;100455;0;112101;m -RASTELLI Mirko;1712;2N;30;MC;130872;0;105710;m -MISTICHELLI Marco;1922;1N;30;TE;161181;0;110047;m -PETRICEVIC Pavo;1688;2N;30;RM;260933;0;102372;m -CARTA Andrea;1688;2N;30;RM;150160;0;125662;m -DENTALE Enrico;2003;CM;0;RM;200667;820679;105426;m -MORGIA Fabrizio;1712;2N;30;RM;030665;0;100951;m -TERRERI Amerigo;1655;2N;30;RM;011056;0;100259;m -MOCCI Franco;1700;2N;30;RM;270369;0;6153;m -MACOR Carlo;1901;1N;30;RM;260462;0;107221;m -COSTA Fabio;1601;2N;30;PR;210158;0;107679;m -SPAGGIARI Andrea;1736;2N;30;RE;210882;0;105137;m -NIRONI Andrea;2107;CM;0;RE;250381;809713;105126;m -SLAMNIK Naser;1880;1N;30;RE;230572;0;105124;m -CAMERINI Lorenzo;2073;CM;0;RE;161082;812960;105111;m -VILLA Cristian;1634;2N;30;RE;080776;0;128761;m -BIANCHI Mauro;1700;2N;30;BG;230273;0;105519;m -BAFFELLI Angelo;1700;2N;30;BS;131073;0;105529;m -QUIZIELVU Massimo;1667;2N;30;VI;0;0;6163;m -AMBROSI Leonardo;1678;2N;0;VR;200954;823970;101364;m -JACCARINO Luca;1700;2N;30;VE;211174;0;6165;m -RUARO Luca;1667;2N;30;VE;140368;0;106339;m -PORTA Federico;1808;1N;30;TV;120772;0;107812;m -COMANDUCCI Roberto;1679;2N;30;MO;020663;0;6168;m -SARTI Riccardo;1688;2N;30;BO;220770;0;101763;m -MAURI Marco;1694;2N;30;TO;310576;0;100795;m -AMBROGGIO Stefano;1607;2N;30;TO;111071;0;6171;m -BAROCELLI Carlo;1655;1N;30;TO;260457;0;104392;m -SALVAN Daniele;1616;2N;30;BI;181159;0;102263;m -BAKULI Dorjan;1745;2N;30;MI;100783;0;6174;m -CIANCIA Giampiero;1514;2N;30;CN;210760;0;106833;m -PRIOTTO Patrick;1649;2N;30;TO;160571;0;103248;m -INFANTINO Carmelo;1712;2N;30;CL;300379;0;101143;m -FIANDACA Domenico;1700;2N;30;VR;021288;0;106484;m -MARINI Gabriele;1679;2N;30;NN;0;0;6179;m -BENEVELLI Claudio;1694;2N;30;MI;140969;0;100160;m -MANARA Raffaello;1649;2N;30;MI;0;0;6181;m -MEGALE Massimo;2006;CM;0;FR;271168;816469;110954;m -BRUNI Luigi;1700;2N;30;FR;190976;0;110114;m -TRINCAS Sergio;1721;2N;30;CA;140664;0;113436;m -ARTIZZU Giulio;2119;CM;0;CA;150981;809756;103259;m -LENZA Leopoldo;1466;2N;30;MN;010457;0;101169;m -MASULLO Andrea;2092;CM;0;SI;061182;811386;107578;m -DORI Sergio;1679;2N;30;AR;191257;0;109235;m -NIGLIO Biagio;1640;2N;30;SA;141154;0;102624;m -MINGIONE Luigi;1625;2N;30;SA;151163;0;102625;m -PASINI Davide;1928;1N;30;PR;110778;0;114538;m -MAFFINI Franco;1700;2N;30;PC;211059;0;6192;m -SI Nello;1700;2N;30;PC;310142;0;6193;m -BOZUFFI Italo;1894;1N;0;CR;160153;820830;112396;m -ORSI Nello;1700;2N;30;PC;310142;0;106077;m -CASTILLO Juan;1781;2N;30;RM;060167;0;102652;m -CLEMENTE Gianni;1706;2N;30;RM;210379;0;6197;m -GRADARI Marco;1832;1N;30;RM;100576;0;100462;m -LA-PIANA Antonino;1700;2N;30;ME;110471;0;6199;m -VIOLINI Paolo;1962;1N;0;RM;030870;822493;120258;m -VINCI Andrea;1700;2N;30;TP;210568;0;6201;m -SAMMARTANO Giuseppe;1700;2N;30;TP;280644;0;105878;m -CERAMI Giuseppe;1796;2N;30;TP;110666;0;100216;m -TABARELLI Sergio;1700;2N;30;TN;310761;0;112480;m -CARLETTO Biagio;1685;2N;30;VE;291255;0;104184;m -GOI Massimiliano;1622;2N;30;BL;230478;0;6206;m -KAJTAZI Enver;1658;2N;30;BL;0;0;6207;m -ALBA Cristiano;1589;2N;30;VI;041172;0;109306;m -PACELLA Davide;1700;2N;30;VI;0;0;6209;m -MORANDI Daniele;1895;1N;30;MI;010864;0;100868;m -ALIERI Giuseppe;1652;2N;30;AT;191151;0;105305;m -REGINI Luca;1745;2N;30;RN;080872;0;109712;m -DE-LUCA Vincenzo;1679;2N;30;MI;130256;0;102523;m -LOCATELLI Gabriele;1700;2N;30;MI;091075;0;6214;m -PIERMATTEI Massimili;1700;2N;30;MI;121070;0;100071;m -CIRULLO Luigi;1649;2N;30;CS;160956;0;6216;m -GRIMALDI Fabio;1805;1N;30;CS;061270;0;109145;m -CHIAPPETTA Dario;1745;2N;30;CS;280662;0;107509;m -SORRENTINO Alessandr;1721;2N;30;CS;100559;0;111260;m -RENDE Pierandrea;1826;1N;30;CS;070181;0;104124;m -LORENZOTTI Fabrizio;1712;2N;30;MC;070347;0;109671;m -GRECO Carmelo;1676;2N;30;TP;240462;0;105760;m -FARDELLA Francesco;1652;2N;30;TP;150151;0;100220;m -ZARZACA Antonio;1553;2N;30;ME;090660;0;101486;m -SARDO Gabriele;2190;-M;0;SR;160381;809187;103688;m -MAZZONI Simone;1610;2N;30;TE;240968;0;104686;m -DI-GIACOMO Andrea;1700;2N;30;CH;050768;0;6227;m -GERANZANI Roberto;1625;2N;30;RM;150869;0;6228;m -DI-LUDOVICO Andrea;1661;2N;30;TE;221279;0;103996;m -COLLALTO Alessio;1739;2N;30;PE;150183;0;121539;m -CELLI Dario;2116;CM;0;AQ;060780;815420;108878;m -FERRARA Alfonso;1691;2N;30;FG;100557;0;106152;m -BUCCARDO Michele;1757;2N;30;BA;070364;0;112454;m -DIAFERIA Giuseppe;1700;2N;30;BA;120771;0;6234;m -CALEFATO Vincenzo;1589;2N;30;BA;210168;0;123079;m -RUGGIERO Giovanni;1643;2N;30;BA;040872;0;6236;m -VALENTINO Giuliano;1700;2N;30;BA;070462;0;6237;m -GERUNDINI Cataldo;1802;1N;30;BA;101152;0;107648;m -PALMIERI Sabino;1664;2N;30;BA;0;0;6239;m -SAMELE Leonardo;1819;1N;30;BA;0;0;6240;m -CALIGIURI Vincenzo;1742;1N;30;KR;090555;0;106753;m -CAPUANO Giovanni;1915;1N;30;NN;0;0;6242;m -GRASSO Giuseppe;1667;2N;30;FI;300872;0;109999;m -FRANCAVILLA Maurizio;1463;2N;30;RM;180660;0;105421;m -ANGELUCCI Marco;1739;2N;30;RM;131256;0;6245;m -ESUPERANZI Gianbatti;1646;2N;30;RM;121074;0;6246;m -INDELICATO Daniele;1700;2N;30;RM;300470;0;6247;m -IOVINO Antonino;1829;1N;30;RC;110970;0;6248;m -MACERA Bruno;1646;2N;30;LT;050746;0;6249;m -MANZANILLA Rufino;1982;CM;0;RM;070456;808784;108897;m -MORONI Emilio;1700;2N;30;RM;180169;0;6251;m -SCRIBONI Simone;1706;2N;30;AQ;100175;0;107464;m -SPELTA Andrea;1700;2N;30;MI;0;0;6253;m -BULGARINI Umberto;1700;2N;30;MI;020247;0;100685;m -SPINI Franco;1649;2N;30;PV;011161;0;112453;m -SANTORUVO Gianfranco;1646;2N;30;MI;070870;0;108158;m -PINOTTI Claudio;2077;CM;0;MI;181045;813265;100709;m -PINCELLA Giovanni;1685;2N;30;MI;051050;0;109519;m -ZICCONI Antonello;1745;2N;30;SS;250573;0;106744;m -DE-MINICIS Giovanni;1700;2N;30;UD;050746;0;6260;m -TURIO Francesco;1634;2N;30;MI;0;0;114675;m -DAMASIO Daniele;1694;2N;30;GE;040957;0;110827;m -GUGLIELMINO Ezio;1646;2N;30;GE;020167;0;6264;m -SABATOSANTI Gabriele;1700;2N;30;GE;010848;0;6265;m -STRAZZERI Marco;1901;1N;30;GE;200385;0;101040;m -SORTINO Giuseppe;1700;2N;30;AG;181028;0;6267;m -NIEDERSTATTER Rosa;1700;2N;30;BZ;020740;0;6268;f -WEGSCHEIDER Heinrich;1625;2N;30;BZ;030929;0;6269;m -FRANCESCHINI Pietro;1604;2N;30;LU;240853;0;103471;m -DIODATI Marco;1706;2N;30;CE;040270;0;116747;m -GOLLER Savino;1865;1N;30;CB;081080;0;118074;m -MONACO Pietro;1700;2N;30;BN;251163;0;6273;m -DRENICA Jeff;1777;1N;30;MI;121264;0;6274;m -BIANCHI Paolo;1619;2N;30;MI;021056;0;104006;m -CARLOTTI Enzo;1775;2N;30;VA;130248;0;6276;m -CODA Luigi;1649;2N;30;PV;190731;0;104862;m -COLOMBO Luigi;1634;2N;30;VA;310158;0;100877;m -GRANDIERI Vitodonato;1748;2N;30;MI;081254;0;102549;m -MORONI Luca;1850;1N;30;MI;121162;0;102554;m -GOBBATO Paolo;1517;2N;30;VE;100172;0;109983;m -SPAIRANI Mario;1580;3N;30;MI;271169;0;6282;m -CADELLI Luciano;2088;CM;0;FI;281137;807915;109856;m -BORSARI Mauro;1574;2N;30;MO;260953;0;106575;m -DONADELLO Petronio;1700;2N;30;RN;260360;0;6285;m -HASSANALI Aiman;1835;1N;30;MI;251272;0;6286;m -VICINI Nicola;1565;2N;30;BO;090342;0;101612;m -DESIDERI Fabio;1760;2N;30;SP;190761;0;103665;m -ONESTI Luca;1936;1N;0;LU;040671;826049;106061;m -IMPROTA Giuseppe;1700;2N;30;NA;0;0;6290;m -DELLA-CORTE Alessand;2205;CM;0;CE;290679;813540;100398;m -SCOLERI-CARDELLI Giu;1700;2N;30;LT;241235;0;112372;m -CANTILE Francesco;1676;2N;30;CE;0;0;6293;m -GUBBIOTTI David;1670;2N;30;PG;251254;0;103883;m -DI-LEGGE Dario;1643;2N;30;MO;050985;0;6295;m -FONTECCHIO Mario;1706;2N;30;PA;250558;0;6296;m -GANCI Fabrizio;2178;CM;0;PA;200683;810568;104157;m -DE-LUCA Raffaele;1724;2N;30;FG;181259;0;106154;m -CIUFFREDA Francesco;1541;3N;30;FG;231048;0;106166;m -DI-MAURO Dante;1599;3N;30;RM;181154;0;109953;m -BERNI Francesco;1679;2N;30;MI;011133;0;103595;m -MUZZIOLI Moris;1703;2N;30;MO;040634;0;103204;m -RISANI Mauro;1685;2N;30;MI;0;0;6303;m -TENTORI Bruno;1535;2N;30;LC;161062;0;107037;m -VULPETTI Attilio;1652;2N;30;RE;010467;0;105129;m -RAIMONDO Enrico;1763;2N;30;FI;230241;0;107986;m -CREMONINI Stefano;1709;2N;30;BO;030459;0;105334;m -IORFIDA Dario;1685;2N;30;CS;051276;0;109146;m -CAPPELLI Riccardo;1673;2N;30;PT;161058;0;106014;m -MASCIULLI Gianluigi;1599;3N;30;PO;090563;0;6310;m -BOSINELLI Matteo;1730;2N;30;BO;0;0;6311;m -HOFER Werner;1587;2N;30;BZ;200854;0;112478;m -QUINTETTI Osvaldo;1556;3N;30;SI;040321;0;107575;m -COLANTONI Nicola;1706;2N;30;RM;120555;0;6314;m -CARITO Riccardo;1532;2N;30;BR;251181;0;6315;m -DUCCI Roberto;1853;1N;30;MI;100456;0;100075;m -GRIMALDI Sergio;1799;2N;30;PA;120859;0;109716;m -KIARIS Giovanni;1700;2N;30;RM;310160;0;112209;m -NUNZIATA Vincenzo;1679;2N;30;VA;291273;0;120805;m -SACCHERI Fabio;1685;2N;30;CA;270574;0;6320;m -CASONI Alberto;1956;1N;0;PU;210659;823457;101840;m -VENANZI Marco;1763;2N;30;VE;180279;0;6322;m -GRAZIANI Claudio;2000;CM;30;MC;040979;0;104582;m -MUFFATO Massimo;1697;2N;30;VE;070762;0;106683;m -PEROTTI Giulio;1475;2N;30;PC;010736;0;103011;m -TAMAGNI Ernesto;1541;2N;30;MI;130450;0;103013;m -LANFRANCHI Adriano;1700;2N;30;BG;0;0;6327;m -CATTANEO Dario;1487;2N;30;BG;010165;0;105527;m -GIANFRANCESCO Alessa;1757;2N;30;MI;050481;0;103608;m -LISENA Fabrizio;1832;1N;30;BA;300663;0;109375;m -FERRI Stefano;2121;CM;0;CH;181273;808164;103898;m -CAVALLO Roberto;1670;2N;30;TA;120568;0;103237;m -SERRA Alessandro;1697;2N;30;TA;011078;0;6333;m -GRIPPA Vito;1904;1N;30;PZ;220576;0;107996;m -CAGGIANO Luigi;1622;2N;30;PZ;240864;0;107994;m -ANTEI Fabrizio;1775;1N;30;AN;180558;0;102326;m -ROTUNNO Giuseppe;1922;1N;30;CS;020282;0;104125;m -TRIDICO Giovanni;1709;2N;30;TA;140659;0;109689;m -CAGGIANO Carmine;1880;1N;30;PZ;050370;0;110439;m -MONTANARO Antonello;1928;1N;30;MT;040579;0;115221;m -ELIA Alessio;1660;2N;0;TA;300472;827770;108913;m -GUIDO Andrea;1808;1N;30;LE;300180;0;111527;m -VENTRELLA Enrico;1748;2N;30;AO;031264;0;118427;m -SARA' Marco;1548;3N;30;FI;170467;0;6344;m -SAITTA Emiliano;1700;2N;30;CT;230570;0;105781;m -PACCAGNINI Giuseppe;1580;3N;30;VA;021258;0;6346;m -SARA' Valerio;2022;CM;0;FI;170467;825352;108143;m -RICCA Roberto;2100;-M;0;TO;051259;807249;102190;m -ROMANO Andrea Enzo;1572;3N;30;AN;230278;0;109753;m -DI-MIZIO Chiara;1500;3N;30;TE;200685;0;110051;f -PANTINI Pier Luigi;1844;1N;30;RM;100362;0;105187;m -GODINO Marco;1682;2N;30;TO;300662;0;100772;m -RAMPINI Stefano;1793;2N;30;RN;260686;0;105858;m -RUBBOLI Boris;1682;2N;30;RA;110474;0;101597;m -AMATI Daniele;1700;2N;30;RN;021182;0;6355;m -CHIERICI Giovanni;1685;2N;30;RA;280771;0;101577;m -MORISI Fabio;1709;2N;30;BO;190460;0;101592;m -D'ANTRASSI Luca;1700;2N;30;RM;210563;0;6358;m -LAIN Luigi;2254;-M;0;VI;030986;813001;101442;m -VALBUSA Giuseppe;1631;2N;30;TV;150855;0;106439;m -DI-PINO Giovanni;1646;2N;30;SR;180364;0;6361;m -BASSETTO Alessandro;1772;2N;30;TV;130174;0;103378;m -NAVARRO Stefano;2224;-M;0;PD;200187;812145;104047;m -ROCCHI Riccardo;1613;2N;30;VE;300868;0;6364;m -ZAVAGLI Massimo;1820;1N;30;RO;020372;0;102230;m -PASQUALOTTO Flavio;1700;2N;30;TV;060464;0;110691;m -ODORICI Mauro;1724;2N;30;PV;211060;0;104863;m -INVERNICI Marco;1503;3N;30;MI;110737;0;102550;m -PETROZZI Davide;1823;1N;30;FR;120681;0;111288;m -DI-MEO Clemente;1691;2N;30;CB;060659;0;103899;m -DEL-VECCHIO Fabio;1700;2N;30;CB;260171;0;6371;m -MENNEA Matteo;1655;2N;30;CH;180163;0;112902;m -CASSINERA Marco;1367;2N;30;TO;190560;0;102169;m -GALASSO Daniele;1721;2N;30;LC;080972;0;107058;m -CUGNO Marco;1781;2N;30;SR;150781;0;106600;m -DISTEFANO Gianfranco;1700;2N;30;CT;270578;0;6376;m -TUMINO Andrea;1640;2N;30;RG;080578;0;105720;m -MAGNONE Paolo;1870;1N;30;MI;0;0;6378;m -SPALLA Paolo;1721;2N;30;PV;281272;0;105166;m -WAPPNER Aristide;1700;2N;30;MI;020929;0;102510;m -TOTA Elvio;1571;2N;30;MI;110160;0;100691;m -ALBERTAZZI Lorenzo;1769;2N;30;PV;020383;0;104866;m -VOLPE Antonio;1607;2N;30;PV;311268;0;112412;m -CAVALLO Rossano;1857;1N;0;MI;070565;814296;113557;m -MANNI Stefano;1832;1N;30;LE;230181;0;104766;m -MECA Francesco;1643;2N;30;BR;220380;0;111214;m -VETRO' Enrico;1616;2N;30;TA;011046;0;109594;m -BENEGIAMO Roberto;1643;2N;30;LE;230255;0;111772;m -MORTELLA Marco;1640;2N;30;LE;150151;0;101304;m -CALCATERRA Massimili;1888;1N;30;RM;0;0;107466;m -CAPALDO Guglielmo;1694;2N;30;AQ;180752;0;107471;m -D'ALFONSO Vincenzo;1658;2N;30;AQ;110560;0;107461;m -VILLANI Marco;1625;2N;30;AQ;111160;0;107462;m -PEDICINI Guido;1601;2N;30;NA;120230;0;101062;m -MASTRONARDI Marcello;1685;2N;30;NA;291160;0;106625;m -SCOTTO-DI-VETTA Anto;1700;2N;30;NA;020249;0;102786;m -DELL'ISOLA Fabio;1700;2N;30;GE;290485;0;6397;m -DI-CARO Federico;1829;1N;30;GE;050477;0;101021;m -IAPICHINO Luciano;1700;2N;30;TO;130561;0;6399;m -LITTERA Marcello;1604;2N;30;TO;201152;0;112598;m -ZANELLA Wainer;1682;2N;30;TO;091171;0;104833;m -IACOMUSSI Mario;1610;2N;30;TO;010658;0;107312;m -D'ORIA Domenico;1700;2N;30;TO;200563;0;6403;m -CARNEVALE Oscar;1730;2N;30;LT;091071;0;113169;m -TRIPOLI Enrico;1994;CM;30;RM;060679;0;112206;m -BARDINI Virgilio;1730;2N;30;RM;070960;0;107265;m -IBBA Isacco;2177;CM;0;CA;271281;812722;103268;m -MULAS Gianmarco;2130;CM;0;CA;160475;813699;112068;m -MASCIA Giovanni;1658;2N;30;CA;140759;0;103272;m -KASERER Hans-Peter;1980;1N;0;BZ;240275;826863;101946;m -CHRISTANELL Andre;1685;2N;30;BZ;110371;0;101949;m -BINI Gabriele;1601;2N;30;PI;110571;0;103460;m -CALUGI Francesco;2132;CM;0;FI;010476;812714;107983;m -D'AGOSTINI Rodolfo;1616;2N;30;RM;190749;0;102369;m -DE-LUCA Stefano;1793;1N;30;RM;010263;0;6415;m -PALERMO Stefano;2068;CM;0;RM;010179;809918;104353;m -MARCUZZI Roberto;2028;CM;0;IM;031270;816868;105073;m -ANDREIS Stefano;1754;2N;30;BS;311276;0;102344;m -AUTOBELLO Giovanni;1682;2N;30;BA;090670;0;103902;m -BRIVITELLO Giacomo;1571;2N;30;CS;261265;0;6420;m -MARCHITTO Giovanni;1718;2N;30;AV;010156;0;6421;m -CARDANOBILE Stefano;1760;2N;30;BA;210980;0;107147;m -PATUZZO Roberto;1700;2N;30;PV;270750;0;102218;m -GUIDI Dario;1709;2N;30;BG;0;0;6424;m -MUSTICA Vanni;1592;2N;30;CT;221165;0;113710;m -CARLA' Vito;1688;2N;30;LE;0;0;6426;m -BENFENATI Arrigo;1682;2N;30;BO;040339;0;100305;m -MONDUZZI Francesco;1700;2N;30;BO;080338;0;100323;m -SANTOVITO Romano;1598;2N;30;BO;110736;0;111390;m -TOMBA Patrizia;1742;2N;0;BO;120349;824208;101610;f -BARBIERI Roberto;1730;2N;30;RM;101264;0;6431;m -COCCODA Roberto;1673;2N;30;RM;101085;0;104265;m -PATARCA Piero;1544;2N;30;RM;170856;0;6433;m -DONDA Manlio;1499;2N;30;UD;270862;0;105909;m -AVOLEDO Tiziano;1697;2N;30;PN;200973;0;102022;m -MELONI Michele;1700;2N;30;UD;160557;0;105907;m -LAUBER Alberto;1715;2N;30;UD;190662;0;105908;m -CERKVENIC Sergio;1700;2N;30;TS;0;0;6438;m -FABRO Igor;1676;2N;30;UD;291262;0;6439;m -DOMINICI Alessandro;1799;1N;30;TO;190364;0;105098;m -VASSALLO Stefano;1724;2N;30;TO;260865;0;121925;m -CASALICCHIO Renato;1601;2N;30;TO;150640;0;104830;m -BASTIMENTO Fabio;1595;2N;30;TO;240862;0;108794;m -RUSCA Danilo;1769;2N;30;TO;310870;0;6444;m -GAZZOLA Oliviero;1607;2N;30;TO;200748;0;111200;m -ACCINELLI Marco;1700;2N;30;SV;050771;0;6446;m -GANDOLFI Sergio;1580;3N;30;TS;161186;0;103792;m -MONTELEONE Gianni;1652;2N;30;SV;010974;0;114572;m -ZANELLI Enrico;1655;2N;30;SV;271133;0;105211;m -PAVON Michele;1769;2N;30;VE;121050;0;103082;m -CARETTO Annalisa;1700;2N;30;VE;060380;0;101468;f -PAJER Enrico;1667;2N;30;VE;0;0;6452;m -IMPROTA Giovanni;1700;2N;30;NA;040263;0;109580;m -CONTI Salvatore;1673;2N;30;NA;261270;0;107074;m -DI-GIOVANNI Giuseppe;1820;1N;30;NA;241266;0;113110;m -MAURO Lucio;1700;2N;30;NA;160652;0;6456;m -BIANCO Raffaele;2069;CM;0;NA;260382;812749;101059;m -AMABILE Luciano;1700;2N;30;NA;210657;0;6458;m -ERBI Catello;1742;2N;30;TA;061270;0;107910;m -CHIMIENTI Angelo;1700;2N;30;TA;0;0;6460;m -TRITTO Nicola;1601;2N;30;BA;280881;0;6461;m -MONTAGNA Tatiana;1628;2N;30;VA;030681;0;104717;f -GISOLINI Michele;1634;2N;30;CO;261256;0;104992;m -CATTONI Luca;1598;2N;30;CO;300663;0;6464;m -ZUGNO Massimiliano;1700;2N;30;VA;111172;0;6465;m -POZZI Marco;1613;2N;30;CO;101264;0;105004;m -IOVINO Ettore;1676;2N;30;IS;141061;0;6467;m -IOVINO Vincenzo;1655;2N;30;IS;070122;0;115233;m -MANOCCHIO Antonio;1517;2N;30;IS;160366;0;110137;m -BUFFA Cristiano;1733;2N;30;RM;190870;0;108908;m -RAGUSA Emanuele;1691;2N;30;RM;270575;0;102749;m -TOMASSINI Davide;1730;2N;30;RM;290670;0;6472;m -PARELLO Angelo;1700;2N;30;AG;171080;0;6473;m -PARRINO Mauro;1709;2N;30;AG;070276;0;104294;m -LENTINI Salvatore;1652;2N;30;PA;230419;0;6475;m -MARCHI Alberto;1700;2N;30;VR;030553;0;6476;m -GAIBA Massimo;1598;2N;30;BO;220756;0;101587;m -LAVACCHINI Giovanni;1664;2N;30;FI;040671;0;6478;m -SGRO' Ezio;1886;1N;30;RC;151249;0;107708;m -SAVOCA Alfredo;1709;2N;30;ME;091152;0;103824;m -VISALLI Giuseppe;1784;2N;30;ME;0;0;6481;m -EIKE Stork;1891;1N;30;EE;0;0;6482;m -LOMBARDI Manfredi;1563;3N;30;SI;051148;0;107572;m -BRAGHIN Nadir;1700;2N;30;TN;151252;0;6484;m -STRINATI Stefano;1718;2N;30;PG;020256;0;103885;m -MAZZARIELLO Mario;1733;2N;30;PZ;050763;0;114956;m -MECCA Tommaso;1598;2N;30;PZ;110869;0;108008;m -SARTI Paolo;1700;2N;30;MO;080866;0;106808;m -ANSALONI Federico;1700;2N;30;MO;0;0;6489;m -CREMON Luigi;1700;2N;30;MO;0;0;6490;m -BONDI Claudio;1700;2N;30;MO;0;0;6491;m -MELINO Gianluca;1637;2N;30;PV;010865;0;124801;m -COLOMBO Fabio;1793;1N;30;MI;160473;0;101641;m -BERTOLINI Roberto;1706;2N;30;MN;251260;0;117675;m -ZENEZINI Marzio;1700;2N;30;MN;010548;0;101181;m -AMMENDOLA Monica;1640;2N;30;BR;280184;0;106226;f -NIGRI Monica;1700;2N;30;BR;090581;0;109350;f -NIGRI Ilenia;1700;2N;30;BR;300786;0;6498;f -GUCCIONE Daniele;1912;1N;0;BA;071074;816388;104367;m -AVVANTAGGIATO Carmin;1499;2N;30;TA;021266;0;107901;m -GILARDONE Adriano;2181;CM;0;CR;150978;815080;104229;m -PEDRETTI Alessio;1589;2N;30;CR;170161;0;6502;m -GALASSO Elio;1685;2N;30;BN;041076;0;100436;m -ALLARIA Luca;1622;2N;30;IM;170776;0;108830;m -ROMAGNONE Ivano;1652;2N;30;IM;190672;0;6505;m -BEVACQUA Salvatore;1631;2N;30;CT;070459;0;102447;m -RUSSO-SPENA Vincenzo;1388;2N;30;NA;040244;0;104609;m -SPANO Alfredo;1712;2N;30;NA;110373;0;105633;m -RICCIO Luca;1700;2N;30;NA;090681;0;6509;m -BAGGIO-DUCARNE Alexa;1643;2N;30;PI;300768;0;6510;m -POMPONI Claudio;1700;2N;30;RM;240669;0;6511;m -PICCIOTTI Francesco;1910;1N;30;RM;150582;0;117811;m -ROSELLINI Aldo;1577;2N;30;LU;090641;0;103484;m -GRAVAGHI Marco;1700;2N;30;PC;111159;0;106085;m -CALZA Gabriele;2029;CM;0;PC;130566;823430;102373;m -DE-TONI Franco;1604;2N;30;VI;0;0;6516;m -BROCCARDO Nicola;1619;2N;30;VI;250270;0;101216;m -ROCCATANI Ettore;1721;2N;30;FR;070483;0;6518;m -RAGAZZONI Alessandro;1580;3N;30;FR;130465;0;6519;m -PAGNONCELLI Giampiet;1700;2N;30;MI;090250;0;100686;m -D'AGOSTINO Roberto;1778;1N;30;MI;070547;0;100145;m -DE-MARTIN Ulisse;1700;2N;30;MI;230357;0;6522;m -TAMBONE Massimiliano;1599;3N;30;MI;260767;0;101421;m -HUMEL Fritz;1622;2N;30;MI;190834;0;102950;m -MARTINI Nicolo';1694;2N;30;RO;200383;0;103569;m -MANCA Luca;1709;2N;30;CA;251181;0;103855;m -PAMBIRA Alberto;1685;2N;30;CA;211073;0;6527;m -CAMPUS Fabio;1580;3N;30;SS;240974;0;6528;m -MARRAS Mario;1500;3N;30;SS;221167;0;102296;m -SCHINTU Marta;1464;3N;30;SS;130481;0;102297;f -PARROTTA Daniele;2119;CM;0;CS;160884;823090;104131;m -ORRI Emanuele;1580;3N;30;CS;0;0;6532;m -ABATE Ernesto;1580;3N;30;CS;0;0;6533;m -RIPEPI Antonino;1778;2N;30;CS;120683;0;109149;m -ARMENTANO Alessio;2087;CM;0;CS;260687;816728;104130;m -PELLICORI Fabio;1582;3N;30;CS;180481;0;109155;m -FILIPPELLI Antonio;1601;2N;30;CS;160645;0;104120;m -FERRARA Giuseppe;1586;2N;30;CS;161055;0;104122;m -SANZI Francesco;1712;2N;30;CS;190768;0;109738;m -PIRO Vincenzo;1727;2N;30;CS;241283;0;104127;m -TALARICO Angela;1595;2N;30;CS;300385;0;104140;f -TALARICO Vincenzo;1721;2N;30;CS;100181;0;104139;m -MEROLA Andrea;1744;2N;30;LE;280774;0;105375;m -ANGLANA Massimo;1658;2N;30;LE;041266;0;6544;m -MURI Massimo;1700;2N;30;BR;290862;0;6545;m -PALMA Luigi;1640;2N;30;LE;050459;0;107185;m -MUCI Francesco;1607;2N;30;LE;250158;0;6547;m -SORIA Simone;1643;2N;30;MO;240279;0;101930;m -CIONI Luca;1467;3N;30;MO;0;0;6549;m -FRANCHINI Germano;1580;3N;30;MO;071269;0;103552;m -RINAUDO Claudio;1859;1N;30;MC;180284;0;105719;m -BADIALI Giosue';1733;2N;30;AN;280560;0;102324;m -CIARROCCHI Emanuele;1682;2N;30;AP;180962;0;112102;m -D'AMBROSIO Giuseppe;1601;2N;30;AN;180159;0;6554;m -FRANCA Sandro;1582;3N;30;TR;160433;0;101888;m -ROMANI Claudio;1574;2N;30;RM;060555;0;107688;m -LUMINARIA Ivan;1402;3N;30;RM;181075;0;110953;m -LORUSSO Giuseppe;1998;CM;0;BL;180984;813893;105023;m -DELL'OLIVO Vincenzo;1808;1N;30;BL;200339;0;105020;m -HERNANDEZ Ricardo;1706;2N;30;MI;140255;0;100157;m -RETTORE Ludwig;2167;CM;0;MI;100176;810266;101740;m -PIRAS Yari;1700;2N;30;MI;0;0;6562;m -VAGLIATI Massimo;1628;2N;30;BS;241161;0;108084;m -FAVAGROSSA Tiziano;1556;3N;30;BS;110171;0;106926;m -MESSINA Massimo;1502;3N;30;BS;280861;0;106931;m -MASSETTI Euro;1721;2N;30;BS;0;0;6566;m -LUMIA Leonardo;1700;2N;30;LT;210155;0;107271;m -GUCLU Yaman;2026;CM;0;PD;021082;815365;118874;m -FLORA Vincenzo;1548;3N;30;PD;270880;0;6569;m -BERTINO Andrea;2083;CM;0;GE;170980;813605;101018;m -COMUNALE Nicola;1604;2N;30;GE;060830;0;117789;m -DRAGO Claudio;1700;2N;30;GE;130762;0;117804;m -CATENACCIO Carlo;1580;3N;30;GE;041226;0;100386;m -PIZZO Ruggero;1596;3N;30;MI;070465;0;6574;m -GALATI Luigi;1679;2N;30;BA;301169;0;105605;m -GAMBARDELLA Davide;1613;2N;30;BA;240876;0;117206;m -PASTORE Giuseppe;1524;3N;30;BA;010479;0;121939;m -SIBILLANO Vincenzo;1529;2N;30;BA;150867;0;111999;m -GISSI Gilberto;2063;CM;0;BA;300774;819263;115248;m -VALENTI Giuseppe;1700;2N;30;MI;210461;0;6580;m -ZANZOTTERA Angelo;1604;2N;30;VA;270650;0;102568;m -CALDAROLA Stefano;1739;2N;30;MI;110872;0;102540;m -CHIODINI Walter;1700;2N;30;MI;010661;0;102541;m -BALLARATI Gianni;1512;3N;30;MI;080550;0;108872;m -COGLIATI Ugo;1697;2N;30;MI;060941;0;100871;m -MEZZANOTTE Luciano;1700;2N;30;AL;190538;0;106379;m -POGGIO Luciano;1580;3N;30;AL;0;0;6587;m -AMATO Bruno;1577;3N;30;TV;260442;0;6588;m -FORATO Piero;2000;CM;0;TV;030685;810576;103376;m -GIURIATO Michele;1673;2N;30;VI;140884;0;101440;m -MENEGHETTI Paolo;1508;3N;30;VI;090579;0;105680;m -MASARO Walter;1599;3N;30;TV;150564;0;103380;m -CEDRIANO Filippo;2038;CM;0;VE;290480;815195;106314;m -CORTINA Federico;1907;1N;30;BL;050681;0;105033;m -MIDOLO Luca;1655;2N;30;VI;041082;0;101444;m -MUZZI Davide;1721;2N;30;VI;110785;0;101445;m -GARAVAGLIA Davide;1580;3N;30;MI;100176;0;6597;m -TAMORRI Ettore;1541;3N;30;NA;070650;0;109659;m -CACCAVIELLO Vincenzo;1664;2N;30;NA;290960;0;101068;m -BATTAGLIA Emanuele;1580;3N;30;NA;061038;0;6600;m -MENGATO Attilio;1741;2N;30;MI;170261;0;100148;m -CERVERO Giovanni;1568;3N;30;SA;300467;0;120361;m -QUAGLIOZZI Francesco;1604;2N;30;NA;140152;0;6603;m -GALLO Fausto;1580;3N;30;NA;250755;0;6604;m -BELLIA Fabio;1700;2N;30;TO;0;0;6605;m -BARONE Marco;1700;2N;30;TP;181183;0;6606;m -GANCITANO Fulvio;1700;2N;30;TP;070880;0;6607;m -BERTUGLIA Alessandro;1685;2N;30;TP;150784;0;6608;m -CUSUMANO Domenico;2020;CM;0;TP;210784;810517;107115;m -PROFERA Giuseppe;1697;2N;30;TP;140584;0;107116;m -COSTA Luigi;1556;3N;30;TP;0;0;6611;m -LISMA Vito;1819;1N;30;TP;220383;0;107112;m -PIOMBO Salvatore;1580;3N;30;TP;081182;0;6613;m -PROFERA Antonino;1700;2N;30;TP;291256;0;107111;m -SELLIA Enrico;1748;2N;30;RC;201161;0;107718;m -CARAMIA Antonio;1802;1N;30;TA;280269;0;107909;m -COSTANTINO Antonello;1685;2N;30;TA;090369;0;6617;m -FIORINO Massimo;1676;2N;30;TA;120778;0;6618;m -RIVA Luciano;1667;2N;30;TA;030854;0;109592;m -TROSO Luigi;1601;2N;30;TA;261260;0;105800;m -FISCHER Stefano;1745;2N;30;GE;050864;0;114767;m -MALFETTANI Fabio;1556;2N;30;GE;271271;0;100382;m -QUAGLIA Mario;1658;2N;30;GE;250140;0;6623;m -CAMPANELLA Aldo;1580;3N;30;GE;290332;0;101019;m -MEO Valerio;1524;3N;30;GE;040447;0;101079;m -GIUSTI Francesco;1574;2N;30;MI;231260;0;102548;m -GERLO Marco;1568;3N;30;MI;160878;0;102547;m -COLLI Gianmaria;1580;3N;30;MI;140365;0;102542;m -BATTISTELLA Gianmari;1706;2N;30;MI;181077;0;109183;m -BELVISO Mario;1580;3N;30;MI;290762;0;109902;m -CASTOLDI Giacomo;1572;3N;30;MI;200184;0;112579;m -GRAMPA Lorenzo;1780;2N;30;VA;301076;0;114170;m -PERICOLI Mario;1479;3N;30;MI;260746;0;104774;m -PICHIERRI Giancarlo;1556;3N;30;TO;010161;0;100800;m -SOCCI Walter;1477;3N;30;MI;060632;0;100876;m -CELLINI Francesco;1527;3N;30;TE;181161;0;103982;m -FLARA' Massimo;1702;2N;30;TE;180479;0;103991;m -ABBRUZZESE Enrico;1589;3N;30;TO;;0;6638;m -CANELLI Nicola;1700;2N;30;TO;101149;0;106006;m -DE-MARCHI Ivan;1560;3N;30;TO;0;0;6640;m -DI-CHIARA Emanuele;1492;3N;30;TO;310841;0;111761;m -LEVI Ruben;1599;3N;30;TO;0;0;6642;m -LO-CURTO Emanuele;2107;CM;0;TO;290387;810126;100005;m -PULEO Marco;1568;3N;30;TO;0;0;6644;m -SCARENZIO Renato;2168;-M;0;TO;221038;810274;100769;m -SIMONETTI Alessandro;1580;3N;30;TV;140886;0;107552;m -PAZZI Sandro;1658;2N;30;PG;291174;0;114661;m -AMBROSI Eleonora;2147;WF;0;VR;290188;812099;101365;f -BENVENUTI Andrea;1580;3N;30;VR;0;0;6649;m -BORBONI Paolo;1812;1N;0;BS;040266;819158;106097;m -BORTOLUSSO Alberto;1512;3N;30;VR;080457;0;110736;m -CAILOTTO Fabio;1584;3N;30;VR;0;0;100930;m -CRAMEROTTI Renzo;1813;1N;30;TN;091247;0;100047;m -DE-ANGELIS Massimili;1538;3N;30;RM;260452;0;106206;m -GRECO Umberto;1608;2N;30;MI;161064;0;100122;m -LIZZIERO Stefano;1705;2N;30;VR;150765;0;100527;m -PETRAGNANI Alessandr;1654;2N;30;RM;;0;110371;m -PREVIDI Enrico;1712;2N;30;VR;160284;0;101553;m -RETTER Martin;1828;1N;0;BZ;201184;812730;101954;m -SARDANO Giuseppe;1512;3N;30;BS;0;0;6660;m -SERRADURA Gianluca;1496;3N;30;VE;061168;0;109992;m -PIZZAIA Alessandro;1580;3N;30;TV;180386;0;107550;m -ZENATTO Giuliano;1549;2N;30;SI;070247;0;122359;m -ZOCCA Paolo;1572;3N;30;VR;190166;0;101554;m -ANGELINI Alessandro;1580;3N;30;VR;220974;0;6665;m -GIORGETTI Giacomo;1532;3N;30;VR;190676;0;6666;m -SCHARRER Patrick;2173;-M;0;BZ;160687;811114;105569;m -MORETTI Stefania;1580;3N;30;FC;041290;0;104639;f -NOOTENBOOM Leo;1568;3N;30;MI;061141;0;100561;m -DEFENTE Antonio;1589;3N;30;MI;250956;0;103594;m -CRISCUOLI Emilio;1572;3N;30;MI;090969;0;100552;m -CHIERICHETTI Sergio;1536;3N;30;MI;050356;0;100551;m -COMPOSTO Giuseppe;1553;3N;30;MI;300156;0;102505;m -STIPS Martin;1584;3N;30;MI;0;0;6674;m -VELTCHEVA Mina;1700;2N;30;MI;160683;0;103598;f -DEVITA Davide;1510;3N;30;CA;130162;0;106518;m -MEDDA Giancarlo;1700;2N;30;CA;140274;0;120238;m -PRUNA Marco;1589;3N;30;CA;0;0;6678;m -SEU Fabio;1515;3N;30;CA;0;0;6679;m -VIVONA Giuseppe;1558;3N;30;CA;270475;0;114766;m -FERRARI Cristiano;1424;3N;30;PR;170160;0;105890;m -SUPPA Carlo;1664;2N;30;TE;101286;0;109137;m -MANUELLI Michele;1611;2N;30;BO;291168;0;6683;m -MAZZOLA Aurelio;1436;3N;30;BO;160624;0;101591;m -CUCCHIETTI Roberto;1539;3N;30;CN;231162;0;109270;m -LOLLI Francesco;1556;3N;30;FI;301058;0;6686;m -DI-PIAZZA Patrizio;1700;2N;30;FC;110758;0;109210;m -MINUTOLI Giuseppe;1599;3N;30;BO;0;0;6688;m -ROSSI Davide;1565;3N;30;BO;0;0;109215;m -BONAZZI Germano;1771;2N;30;FE;171259;0;102253;m -CAVALLI Roberto;1562;2N;30;BO;060365;0;100307;m -ASSIRELLI Roberto;1580;3N;30;BO;311064;0;6692;m -BONORA Lanfranco;1580;3N;30;BO;260140;0;6693;m -CONTI Silvio;1697;2N;30;RN;211069;0;105844;m -GORI Michele;1599;3N;30;FE;060574;0;6695;m -BERGAMASCHI Mauro;1467;3N;30;RO;0;0;6696;m -DEL-COLLE Raffaele;1572;3N;30;VR;280660;0;101942;m -GATTI Paolo;1515;3N;30;RO;0;0;105354;m -MENIN Riccardo;1572;3N;30;VI;0;0;6699;m -PESARIN Corrado;1580;3N;30;VR;0;0;6700;m -VALENTINI Luca;1903;1N;30;RO;040986;0;106143;m -BOSCOLO Giovanni;1584;3N;30;RO;270545;0;106142;m -ZANINI Claudio;1582;3N;30;VR;031256;0;101941;m -POLO Filippo;1738;2N;30;VR;210270;0;103031;m -BISMARA Renzo;1781;2N;30;VB;0;0;100493;m -FORNARA Adriano;1787;2N;30;VB;0;0;100485;m -TRIULZI Fabrizio;1616;2N;30;VB;;0;104455;m -GIANI Angelo;1619;2N;30;VB;;0;110462;m -BIANCOTTI Federico;1599;3N;30;VB;290284;0;6709;m -CANDIDO Antonino;1469;3N;30;VB;180146;0;100495;m -CAVAGNA Pierdomenico;1571;2N;30;VB;050555;0;100490;m -SGANZERLA Sandro;1496;3N;30;VB;220759;0;100494;m -COPPOLINO Aldo;1599;3N;30;ME;240451;0;103820;m -COSTA Domenico;1560;3N;30;ME;091183;0;102669;m -ARICO' Girolamo;1703;2N;30;ME;070458;0;102665;m -CALDERONE Pino;1439;2N;30;ME;190760;0;101488;m -SCARPA Luca;1563;3N;30;PD;;0;6717;m -TESSARI Gianni;1670;2N;30;PD;190662;0;104034;m -PALMIERI Vincenzo;1601;2N;30;PD;031162;0;6719;m -MARASCIULO Francesco;1575;3N;30;BA;191057;0;104364;m -SCAGLIARINI Gianluca;1565;3N;30;BA;290678;0;6721;m -BARTOLUCCI Walter;1580;3N;30;BA;231256;0;6722;m -BATTISTA Vincenzo;1541;3N;30;BA;;0;111116;m -CHIARADIA Giuseppe;1592;2N;30;BA;230359;0;111295;m -LACERENZA Andrea;1619;2N;30;BA;290272;0;106998;m -RICCIARDIELLO Mauril;1534;3N;30;BA;110878;0;6726;m -SCACCO Antonio;1599;3N;30;BA;;0;6727;m -STRANIERO Michele;1587;3N;30;BA;300783;0;124062;m -GUARINO Pierfrancesc;1551;3N;30;BA;;0;6729;m -CRIVELLI Renzo;1527;3N;30;VA;110345;0;6730;m -BOSIA Francesco;1700;2N;30;AT;;0;6731;m -PORCELLANA Rajesh;1572;3N;30;AT;;0;6732;m -RATTO Giuliano;1804;1N;30;AT;081256;0;106827;m -GIANNETTI Adriano;1568;3N;30;LU;;0;106057;m -SECHI Guido;1599;3N;30;LU;180476;0;109996;m -TRACY Marvin;1512;3N;30;LU;100941;0;106063;m -BABBINI Walter;1599;3N;30;LU;;0;6737;m -MORELLI Gaetano;1849;1N;30;KR;040372;0;106473;m -VALLONE Claudio;1558;3N;30;KR;101164;0;6739;m -FERROGIARO Paolo;1431;3N;30;GE;070860;0;102311;m -PETRONELLI Adriano;1646;2N;30;SV;160565;0;105214;m -VENTOLA Massimo;1563;3N;30;SV;231066;0;125782;m -PALMIERO Chiara;1655;2N;30;TS;220886;0;103798;f -BELLOCCHIO Enzo;1700;2N;30;VR;101148;0;114781;m -MARIN Alessandro;1739;2N;30;VR;200257;0;122301;m -CAROZZI Tommaso;1580;3N;30;VR;160677;0;6746;m -FASOLI Davide;1580;3N;30;VR;160543;0;6747;m -LEDRO Marco;1454;2N;30;VR;191261;0;100959;m -ALAGIA Pietro;1700;2N;30;PZ;231071;0;106273;m -BIXIO Aldo;1598;3N;30;PZ;230644;0;108002;m -DE-SOMMA Gaetano;1529;3N;30;PZ;;0;6751;m -LANGONE Rocco;1625;2N;30;PZ;;0;6752;m -LORUSSO Paolo;1599;3N;30;PZ;090855;0;108004;m -STODUTO Francesco;1503;3N;30;PZ;280149;0;106274;m -GIANNATTASIO Attilio;1580;3N;30;PZ;010668;0;102701;m -ESPOSITO Francesco;1488;3N;30;PZ;040962;0;129666;m -CARBONARO Nicolo';1599;3N;30;SR;;0;6757;m -CONTI Silvano;1628;2N;30;SR;140168;0;103677;m -DE-PROPRIS Gabriele;1855;1N;30;CT;120381;0;100452;m -LAROSA Maurizio;1434;3N;30;SR;050359;0;106599;m -MANZITTO Sergio;1587;3N;30;CT;;0;6761;m -MOLLICA Antonino;1691;2N;30;RG;030265;0;105731;m -MONICA Alessandro;1599;3N;30;SR;160683;0;103679;m -ROLLO Giovanni;1691;2N;30;SR;310184;0;103682;m -SCIRE' Carmen;1541;3N;30;SR;170184;0;6765;f -SPAGNOLO Tommaso;1855;1N;30;SR;050665;0;103690;m -CALI' Massimo;1592;3N;30;CT;140966;0;6767;m -CALVO Luigi;1520;3N;30;SR;281274;0;6768;m -GAROFALO Massimo;1846;1N;30;RG;;0;6769;m -CALAMERA Angelo;1491;3N;30;CL;230264;0;101145;m -VETRI Gianluca;1529;3N;30;CL;090774;0;101146;m -MERCURIO Davide;1658;2N;30;CT;090985;0;102476;m -REINA Antonio;1721;2N;30;CT;080673;0;6773;m -SCAVO Santo;1616;2N;30;CT;180555;0;102453;m -ROCCARO Giovanni;1691;2N;30;RG;201274;0;104033;m -ALESSANDRELLO France;1652;2N;30;RG;131270;0;6776;f -ROSSI Massimo;1580;3N;30;NN;260551;0;103691;m -MARICOSU Piero;1697;2N;30;NU;280967;0;116100;m -PERRECA Roberto;1575;3N;30;NU;;0;117557;m -CERINA Antonio;1457;3N;30;NU;200878;0;107523;m -ANDREAUS Marcello;1721;2N;30;TN;090957;0;100859;m -AVI Stefano;1607;2N;30;TN;171066;0;103763;m -MERZ Mauro;1631;2N;30;TN;200449;0;101267;m -VINANTE Celestino;1676;2N;30;TN;250856;0;100667;m -LORANDI Christian;1634;2N;30;TN;300983;0;100051;m -BORRIERO Alberto;1522;3N;30;TN;100438;0;100854;m -DE-NISI Martina;1718;2N;30;TN;270982;0;101858;f -FORTUNATO Vito;1751;2N;30;TN;140158;0;103104;m -KLEIN Arnaud;1592;3N;30;TN;;0;6789;m -AMATO Lauro;1584;3N;30;MI;160553;0;6790;m -DALLA-TORRE Giorgio;1691;2N;30;TN;130351;0;103766;m -ALATI Massimo;1575;3N;30;RM;150569;0;111676;m -HILBRAT Fabio;1589;2N;30;RM;271165;0;108920;m -JONES Alessandro;1906;1N;0;RM;110771;827908;126610;m -CIGNA Marcello;1602;2N;30;CN;110868;0;105190;m -SENESE Paolo;1592;3N;30;RM;051177;0;6796;m -VITALE Nicola;1544;3N;30;RM;030965;0;105435;m -BLONNA Alessio;1582;3N;30;RM;;0;6798;m -BLONNA Michele;2023;CM;0;RM;030776;811327;100232;m -CORCIULO Daniele;1476;3N;30;RM;;0;6800;m -D'AMICO Roberto;1541;3N;30;RM;240255;0;102146;m -IMPERATRICE Vincenzo;1592;3N;30;RM;;0;6802;m -LATTANZI Domenico;1871;1N;0;RM;310172;817813;100954;m -LEONARDI Andrea;1575;3N;30;RM;;0;6804;m -MARTINES Rosario;1323;3N;30;RM;120731;0;108922;m -PICA Livia;1454;3N;30;RM;160161;0;118122;f -REALE Remo;1525;3N;30;VT;280744;0;101908;m -VITI Claudio;1438;3N;30;RM;080428;0;113782;m -ZUCCARO Vincenzo;1736;2N;30;LT;;0;106225;m -OPIZZI Eliano;1527;3N;30;PV;100156;0;105175;m -ORLANDI Alessandra;1580;3N;30;MI;190350;0;108076;f -PIERI Sergio;1596;3N;30;MI;090845;0;101006;m -VELTCHEV Ivan;1599;3N;30;MI;131156;0;103599;m -VENTRIGLIA Enrico;1700;2N;30;MI;020485;0;103602;m -ARENA Francesco;1558;3N;30;MI;;0;6815;m -BAKULI Loris;1575;3N;30;MI;;0;6816;m -CORBELLA Corrado;1587;3N;30;PV;221269;0;102065;m -GIUNTOLI Tiziana;1580;3N;30;MI;030249;0;105172;f -LAVEZZARI Angelo;1438;3N;30;MI;120126;0;100084;m -SCIARRA Giuseppe;1556;3N;30;MI;;0;6820;m -BITTI Sandro;1629;2N;30;SS;180565;0;106740;m -LANGIU Giovanni;1551;3N;30;SS;310184;0;117435;m -TALA Massimiliano;1891;1N;30;SS;;0;100805;m -BALDASSARRE Stefano;1706;2N;30;UD;221157;0;6824;m -DURATTI Giovanni;1563;3N;30;UD;260159;0;105915;m -PILLININI Giancarlo;1599;3N;30;UD;230963;0;105920;m -TONON Gabriele;1808;1N;30;UD;210780;0;105919;m -VENUTI Federico;1601;2N;30;UD;160455;0;103744;m -VISINTINI Paolo;1670;2N;30;UD;130167;0;105918;m -DE-PAOLI Guerrino;1700;2N;30;UD;260351;0;117705;m -BENATTI Ivan;1676;2N;30;UD;051079;0;108836;m -BOLDRIN Marco;1856;CM;0;TS;081270;815322;110162;m -GENTILI Marco;1541;2N;30;TS;020854;0;106531;m -REBBI Roberto;1467;3N;30;TS;030456;0;106532;m -BEVILACQUA Andrea;2054;CM;0;TS;130586;819530;103787;m -PONIZ Alessandro;1485;3N;30;TS;150962;0;115561;m -PETELIN Riccardo;1580;3N;30;GO;060686;0;6837;m -MENON Carlo;1551;3N;30;GO;291052;0;110274;m -URDINI Giorgio;1548;3N;30;GO;030942;0;102865;m -PAIANO Roberto;1685;2N;30;MT;170387;0;106721;m -STIGLIANO EgidiO;1580;3N;30;MT;170479;0;112010;m -LILLO Francesco;1646;2N;30;MT;210568;0;106725;m -MALVASI Andrea;1580;3N;30;MT;030380;0;6843;m -D'ELIA Carlo;1587;3N;30;MT;221185;0;112007;m -LAURENZA Rocco;1496;2N;30;MT;261044;0;106714;m -GRILLO Rocco;1613;2N;30;MT;021258;0;6846;m -CAFARO Antonio;1655;2N;30;MT;071267;0;112005;m -PITRELLI Antonio;1790;1N;30;MT;080383;0;106718;m -LOMBARDO Salvatore;1625;2N;30;MT;191259;0;122709;m -BIGAGLI Rodolfo;2048;CM;0;PT;170558;819549;106003;m -PAPERETTI Emiliano;1661;2N;30;PT;040451;0;102903;m -RUSSO Gabriele;1367;3N;30;PT;261026;0;106013;m -VANNINI Giuliano;1432;3N;30;PT;280347;0;117164;m -BARAZZOTTO Sergio;1599;3N;30;BI;190539;0;107621;m -BOCCHI Paolo;1814;1N;30;BI;180246;0;107619;m -BRUERA Giancarlo;1474;3N;30;BI;160252;0;102265;m -COSSAR Claudio;1775;2N;30;BI;160770;0;107623;m -RATTONE Franco;1787;1N;30;BI;110847;0;107629;m -DE-TOMA Enrico;1718;2N;30;BI;;0;6859;m -GAVA Lino;1658;2N;30;BI;250838;0;107627;m -CAPORALI Roberto;1622;2N;30;FI;050547;0;110628;m -DI-CAMILLO Adalberto;1529;3N;30;FI;270939;0;101853;m -ASCANI Luca;1730;2N;30;FI;270768;0;102103;m -FACCIN Luca;1570;3N;30;VI;060268;0;101209;m -DORO Fulvio;1673;2N;30;PN;110569;0;102024;m -CALICCHIA Armando;1609;2N;30;RM;;0;111398;m -FABRIZI Augusto;1735;2N;30;RM;;0;6867;m -MARINI Otello;1570;3N;30;RM;070424;0;107273;m -MILITI Osvaldo;1599;3N;30;LT;290366;0;104941;m -SALVATORI Roberto;1700;2N;30;RM;060376;0;113171;m -TEDESCHI Marco;1599;3N;30;LT;030362;0;113173;m -METE Antonio;1580;3N;30;LT;230560;0;6872;m -VISCARDI Domenico;1580;3N;30;RM;071060;0;6873;m -ARDUINI Luca;1599;3N;30;RM;280469;0;107264;m -CICCOLINI Eugenio;1580;3N;30;RM;171057;0;6875;m -FABRIZI Alberto;1560;3N;30;RM;120582;0;6876;m -BELLERI Giuliano;1479;3N;30;CO;140761;0;100115;m -BOFFI Luigi;1608;2N;30;MI;080253;0;102969;m -DINUZZO Rocco;1589;2N;30;VA;210155;0;109410;m -RIZZATO Dario;1560;3N;30;MI;170451;0;102519;m -ROSSI Massimiliano;1592;3N;30;VA;;0;104952;m -DALLA-LIBERA Sergio;1589;3N;30;MI;040461;0;101642;m -GUGLIELMETTI Oscar;1594;3N;30;CO;200971;0;100725;m -VASSENA Edoardo;1580;3N;30;MI;060257;0;6884;m -LO-TARTARO Domenico;1580;3N;30;MI;300863;0;6885;m -BETTINELLI Antonio;1628;2N;30;LO;100541;0;104426;m -PEVIANI Alessandro;1361;2N;30;LO;120264;0;104424;m -FRANCESCONI Fausto;1700;2N;30;RA;110551;0;109429;m -BENIGNI Roberto;1553;3N;30;RA;;0;6889;m -TITTARELLI Adriano;1748;2N;30;AN;310864;0;102330;m -TORTA Gianluca;1745;2N;30;AN;060262;0;102323;m -OMBASIC Dzemil;1730;2N;30;MO;251047;0;103201;m -ANDREUCCETTI Giusepp;1491;3N;30;LE;260351;0;105549;m -GALLO Giuseppe;1721;2N;30;LE;031163;0;101298;m -LICCHETTA Biagio;1700;2N;30;LE;;0;6895;m -MARAGLINO Vincenzo;1700;2N;30;LE;080548;0;6896;m -MARCIANO' Walter;1580;3N;30;LE;170853;0;6897;m -ZACCARIA Vincenzo;1570;3N;30;LE;060771;0;111534;m -GIANNONE Manuel;1700;2N;30;LE;120484;0;6899;m -GEUSA Pasquale;1574;2N;30;LE;060777;0;6900;m -ZAMPERLINI Arialdo;1700;2N;30;LE;060234;0;6901;m -DONNO Salvatore;1667;2N;30;LE;290357;0;6902;m -MELE Franco;1601;2N;30;LE;010452;0;104768;m -CASIMIRRI Maurizio;1589;3N;30;TE;040783;0;6904;m -ESPOSITO Salvatore;1675;2N;30;AP;031165;0;110049;m -CASTALDO Antonio;1574;2N;30;TO;270552;0;100786;m -SANTINELLI Michele;1565;3N;30;MC;180480;0;6907;m -COLOMBO Sandro;1864;1N;0;MI;240367;822612;102543;m -BELFIORE Argentina;1385;3N;30;MI;201032;0;108252;f -FORGIONE Andrea;1459;3N;30;GE;211264;0;101335;m -CONDELLO Carlo;1599;3N;30;RN;;0;6912;m -GUARDIGLI Alessandro;1697;2N;30;RN;270963;0;105854;m -LA-TORRE Armando;1553;3N;30;CT;250738;0;6914;m -LOLICATO Salvatore;1563;3N;30;NN;;0;101099;m -FINOCCHIARO Dante;1515;3N;30;CT;160250;0;102456;m -SPANO' Giuseppe;1735;2N;30;CT;140674;0;102465;m -FLACCAVENTO Orazio;1594;3N;30;NN;;0;106412;m -PENSATO Sergio;1685;2N;30;CT;020156;0;109440;m -LA-PORTA Felice;1544;3N;30;NN;;0;6920;m -MUSTICA Francesco;1529;3N;30;CT;;0;6921;m -LAROSA Nello;1553;3N;30;NN;;0;6922;m -AGUGLIARO Giacomo;1388;3N;30;CT;;0;6923;m -NICOSIA Michele;1599;3N;30;CT;051259;0;101097;m -MERLETTI Vincenzo;1581;3N;30;BG;221262;0;127617;m -FLATSCHER Tobias;1599;3N;30;BZ;;0;6926;m -SILINI Bruno;1587;3N;30;BG;;0;6927;m -ONGER Nicola;1616;2N;30;BS;170885;0;106105;m -ARCHETTI Antonio;1580;3N;30;BS;150650;0;6929;m -ONGER Mario;1580;3N;30;BS;201056;0;106104;m -BORDONI Alessandro;1505;3N;30;RM;191134;0;102363;m -TRIPICIANO Nicola;1508;3N;30;RM;300523;0;102368;m -CARTA Salvatore;1580;3N;30;RM;150937;0;6934;m -LA-CORTE Gabriele;1536;3N;30;RM;060271;0;102162;m -PORCACCHIA Alessio;1529;3N;30;RM;280772;0;6936;m -PROIETTI Danilo;1580;3N;30;RM;070769;0;6937;m -AMBROSINI Maurizio;1589;3N;30;SP;019766;0;6938;m -BINELLI Lorenzo;1813;1N;30;MS;160751;0;103647;m -CALZERANO Carmelo;1599;3N;30;PI;;0;6940;m -CAPPELLO Carlo;1551;3N;30;MI;;0;6941;m -MARTINELLI Sergio;1493;3N;30;LU;090946;0;106059;m -PECORI Franco;1700;2N;30;PI;170852;0;101973;m -DE-SANTIS Marina;1488;3N;30;BA;290860;0;117148;f -PIZZAIA Federica;1580;3N;30;TV;180386;0;107551;f -ROBIOLIO Giancarlo;1577;3N;30;BI;060955;0;102264;m -RONCELLA Marco;1570;3N;30;MS;020882;0;103663;m -TARTARELLI Franco;1592;3N;30;LU;050443;0;106856;m -TOMMASI Paolo;1846;1N;30;SP;0;0;6949;m -TRAVERSO Alfonso;1561;3N;30;SP;300152;0;6950;m -VIDOVALDI Ottorino;1534;3N;30;MS;;0;6951;m -PAOLINELLI Michele;1622;2N;30;LU;030978;0;124004;m -NAKAMURA C.J.;1580;3N;30;LU;140571;0;6953;m -MELONI Pierluigi;1580;3N;30;NN;;0;113692;m -RAVAIOLI Manuel;1691;2N;30;FC;151282;0;104653;m -FORNINO Giuliano;1685;2N;30;FC;210881;0;104652;m -BEDEI Elisa;1667;2N;30;FC;210182;0;104656;f -EVANGELISTI Fausto;1580;3N;30;FC;100666;0;6958;m -DI-GIULIO Franco;1488;3N;30;CH;220946;0;101748;m -MAGNI Eugenio;1361;3N;30;LC;251158;0;6960;m -MARINO Orazio;1412;3N;30;MI;250853;0;103536;m -GIANCOLA Andrea;1628;2N;30;MI;250275;0;119788;m -ARENA Andrea;1580;3N;30;MI;141064;0;6963;m -PERRONE Alessandro;1547;3N;30;MI;270167;0;108081;m -TOSCA Massimo;1515;3N;30;MI;280350;0;101734;m -DEL-NERO Gianluigi;1599;3N;30;LC;0;0;6966;m -MELIS Marco;1703;2N;30;LC;181176;0;104791;m -RUSCONI Vittorio;1523;3N;30;LC;120728;0;107053;m -SACCO Franco;1700;2N;30;LC;101063;0;107036;m -MALUGANI Gianangelo;1580;3N;30;LC;180960;0;107034;m -PORRO Luca;1546;3N;30;CO;0;0;6971;m -MASON Giovanni;1541;2N;30;CO;271237;0;100726;m -ROSSI Silio;1583;2N;30;CO;050439;0;103513;m -GRECO Alessandro;1700;2N;30;CO;131074;0;105001;m -CAPRIOGLIO Marco;1610;2N;30;CO;151271;0;103519;m -GRANELLA Simone;1599;3N;30;CA;260578;0;108930;m -MASCIA Giancarlo;1479;3N;30;CA;280354;0;103273;m -TAMPONI Tancredi;1596;3N;30;SS;0;0;6979;m -UNTERREITMEIR Max;1596;3N;30;CA;080942;0;107545;m -MURESU Giovanni;1661;2N;30;CA;070856;0;103274;m -MASCIA Giacinto;1572;3N;30;CA;020878;0;6982;m -CASTI Filippo;1599;3N;30;CA;030676;0;6983;m -GASSER Rene';1580;3N;30;NU;100861;0;6984;m -D'AURIA Giuseppe;1525;3N;30;LT;190451;0;116103;m -DE-LUCA Cesare;1570;3N;30;LT;090353;0;104936;m -CARDILLO Raffaele;1637;2N;30;LT;061064;0;103745;m -PASCA Maurizio;1521;3N;30;LE;301165;0;6988;m -VENZI Alan;1577;3N;30;FC;0;0;6989;m -CAPITANI Stefano;1584;3N;30;BO;060785;0;101574;m -CASOLA Giuseppe;1666;2N;30;RN;230859;0;105842;m -PALLOTTI Riccardo;1512;3N;30;BO;170476;0;122429;m -TREVISANI Emilio;1751;2N;30;BO;090687;0;101635;m -LATTA Federico;1742;2N;30;GE;161182;0;109616;m -SABBA Giorgio;1656;2N;30;GE;251170;0;102196;m -RAIMONDI Federico;1536;3N;30;TO;080575;0;109298;m -DUDLEY Bruce;1575;3N;30;MI;130559;0;6998;m -VACCA Alessandro;1614;2N;30;RM;070771;0;6999;m -CORTI Fabrizio;1599;3N;30;MI;131270;0;104795;m -MEGASSINI Stefano;1527;3N;30;MI;100271;0;109846;m -URICCHIO Francesco;1754;1N;30;LC;0;0;107055;m -BOGA Fabio;1556;3N;30;MI;230969;0;101640;m -AMIRANDA Mario;1580;3N;30;MI;090965;0;104793;m -MANIERI Celestino;1580;3N;30;MI;210268;0;102532;m -CELLUCCI Davide;1546;3N;30;CH;021262;0;103753;m -PIZZUTELLI Davide;1587;3N;30;FR;0;0;7007;m -PATRIZI Claudio;1599;3N;30;FR;140967;0;110107;m -CIOCCOLANTI Vito;1592;3N;30;FR;0;0;7009;m -GERARDI Saverio;2130;CM;0;FR;240880;811262;100607;m -AIMI Luca;1983;1N;0;CR;150867;827657;104221;m -BOLZONI Luciano;1599;3N;30;PR;271231;0;107529;m -CARLEO Antonio;1580;3N;30;PC;0;0;7013;m -FONTANELLA Valentino;1580;3N;30;PC;120240;0;106083;m -DAGRADI Marco;1536;3N;30;PC;070786;0;105335;m -BERTONCINI Mauro;1583;2N;30;PC;040867;0;106080;m -CANNADA-BARTOLI Vinc;1810;1N;30;RM;200660;0;117054;m -CLIFFORD Roby;1634;2N;30;RM;170676;0;100463;m -COLADONATO Valerio;1570;3N;30;RM;0;0;7019;m -COLLACCIANI Giuseppe;1480;3N;30;RM;0;0;108882;m -ROMITELLI Alessio;1565;3N;30;RM;060985;0;104273;m -STELLUTI Igor;1599;3N;30;RM;0;0;7022;m -VALENTE Pierluigi;1676;2N;30;RM;250675;0;112366;m -VONA Francesco;1882;1N;30;RM;180677;0;107290;m -RISSONE Giorgio;1580;3N;30;RM;120673;0;7025;m -CERRATO Pino;1587;3N;30;AV;0;0;7026;m -BORTOLOTTI Francesco;1599;3N;30;TO;121138;0;100782;m -CAPOZZI Bruno;1599;3N;30;TO;0;0;7028;m -MASIA Pietro;1544;3N;30;VC;0;0;7029;m -FRANCO Luigi;1628;2N;30;NA;210868;0;108086;m -SBERSE Luca;1492;3N;30;VC;290574;0;102042;m -TACCHINO Stefano;2085;CM;0;VC;150878;815390;110383;m -MIHALEVIC Natasha;1580;3N;30;OR;120478;0;107607;f -SANTINI Laura;1500;3N;30;CA;280377;0;103281;f -INSERRA Sergio;1568;3N;30;CT;0;0;7035;m -NICOLOSI Antonio;1614;2N;30;CT;031076;0;116022;m -CULLURA' Corrado;1599;3N;30;CT;210271;0;107353;m -GRILLO Giuseppe;1589;3N;30;SR;280885;0;103683;m -CONTARDI Laura;1544;3N;30;PV;210948;0;110840;f -MAZZARELLI Donato;1608;2N;30;MI;260169;0;100584;m -VOLPATO Livio;1522;3N;30;MI;211260;0;104976;m -DE-GAETANO Filippo;1553;3N;30;TP;0;0;7042;m -MACHI' Alessandro;1570;3N;30;PA;090272;0;7043;m -ROBINO Paolo;1580;3N;30;TP;251067;0;7044;m -PIPITONE Vito;1580;3N;30;TP;010485;0;107122;m -ACCINELLI Pietro;1512;3N;30;SV;071034;0;105216;m -MUSSO Giorgio;1570;3N;30;SV;140139;0;105213;m -GENTILE Claudio;2138;CM;0;SV;101256;811840;105212;m -GALLEA Sandro;1566;3N;30;PA;290954;0;120899;m -MERENDINO Elda;1415;3N;30;PA;221064;0;104179;f -RIZZO Antonio;1508;3N;30;PA;080659;0;104159;m -TINNIRELLO Vincenza;1556;3N;30;PA;210381;0;100431;f -QUATTROCCHI Giuseppe;1511;3N;30;PA;0;0;7053;m -LODA' Dora;1435;3N;30;RM;290633;0;122782;f -MARZIO Mario;1447;3N;0;RM;130946;827630;105427;m -PRETI Armando;1589;3N;30;RM;220772;0;113743;m -ZARFATI Daniele;1568;3N;30;RM;0;0;7057;m -MIRRI Alessandro;1711;2N;30;RM;231171;0;102659;m -NUTI Raoul;1599;3N;30;RM;020277;0;7059;m -PALER Adrian;1901;1N;0;EE;230974;821977;105416;m -POPA Marius;1963;CM;30;EE;220673;0;105403;m -CANNONE Alberto;1582;3N;30;BA;281255;0;107645;m -FORNELLI Paolo;1548;3N;30;BA;260464;0;107650;m -IURILLI Gaetano;1551;3N;30;BA;050362;0;107649;m -MORRA Giovanni;1592;3N;30;BA;230463;0;106999;m -RUGGIERO Francesco;1532;3N;30;BA;250351;0;107644;m -SCHEMBRI Davide;1599;3N;30;BA;050569;0;109371;m -TEDESCO Angelo;1596;3N;30;BA;0;0;7069;m -MAINO Felice;1575;3N;30;BA;240671;0;7070;m -CATALANO Francesco;1580;3N;30;BA;291062;0;111294;m -MUOLO Angelo;2001;CM;0;BA;051073;821667;104375;m -FICARRA Giuseppe;1852;1N;30;BA;060669;0;104366;m -MELILLO Matteo;1589;3N;30;FG;150458;0;106168;m -TEMPESTA Piergiulio;1596;3N;30;LE;210772;0;104767;m -BISETTO Ludovico;1548;3N;30;TO;050785;0;115842;m -BUCARELLI Filippo;1481;3N;30;TO;190738;0;102176;m -DE-PALMA Gianfranco;1599;3N;30;TO;310771;0;7078;m -CHINA Luigi;1570;3N;30;TO;180737;0;111196;m -DI-LELLA Giovanni;1580;3N;30;FG;0;0;7080;m -DI-NARDO Nicola;1575;3N;30;TO;0;0;7081;m -MAGGI Mauro;1610;2N;30;TO;240656;0;102163;m -MATTA Francesca;1841;1N;0;TO;150186;818780;102198;f -NIXON Alan;1553;3N;30;TO;0;0;7084;m -OZZELLO Mario;1568;3N;30;TO;120163;0;110483;m -PANARESE Dario;1670;2N;30;TO;0;0;7086;m -PETRINI Alberto;1717;2N;30;TO;030164;0;100143;m -ROBA Maurizio;1498;3N;30;AT;0;0;7088;m -ROCCA Roberto;1558;3N;30;TO;0;0;7089;m -SASSANO Pasqualino;1548;3N;30;TO;0;0;7090;m -STIVAL Stefano;1516;3N;30;TO;170567;0;104837;m -VALENTINI-MARANO Mir;1664;2N;30;TO;231176;0;113817;m -PUJIA Vito;1599;3N;30;TO;0;0;7093;m -COSTA Vincenzo;1580;3N;30;TO;0;0;7094;m -PIAZZA Giacomo;1453;3N;30;TO;280338;0;109764;m -VOGLIOBENE Luigi;1580;3N;30;TO;0;0;7096;m -MAZZONI Guido;1700;2N;30;TO;110656;0;110481;m -GOIA Francesco;1580;3N;30;TO;0;0;7098;m -SODARO Marco;1488;3N;30;TO;020871;0;110487;m -MEDELIN Biagio;1512;3N;30;TO;290428;0;104726;m -BIANCO Daniele;1774;2N;30;TO;121065;0;111191;m -BILARDELLO Alfredo;1658;2N;30;TP;260470;0;103046;m -CIULLO Girolamo;1724;2N;30;TP;041154;0;103047;m -GERARDI Giuseppe;1691;2N;30;TP;050780;0;103049;m -MESSINA Agostino;1594;3N;30;TP;261281;0;107769;m -OLIVA Salvatore;1503;3N;30;TP;220951;0;100222;m -SAMMARTANO Vincenzo;1586;2N;30;TP;090975;0;107506;m -MAIRHOFER Lino;1700;2N;30;BZ;130161;0;7108;m -FALCOLINI Francesco;1685;2N;30;CB;150361;0;103900;m -TACCIA Maurizio;1541;3N;30;AP;120566;0;101386;m -DI-LORETO Luigi;1508;3N;30;TE;140532;0;103987;m -CETTOLI Alberto;1455;3N;30;AP;250921;0;101384;m -FIORE Mauro;1563;3N;30;AQ;180156;0;107474;m -D'ORAZIO Pasquale;1524;3N;30;AN;0;0;7114;m -MELASECCHI Paolo;1723;1N;30;TE;290656;0;103993;m -FIDANZA Enzo;1544;3N;30;TE;0;0;7116;m -AGLIATI Mario;1479;3N;30;MI;020725;0;110415;m -NAPOLETANO Mauro;1544;3N;30;MI;190258;0;104569;m -PELLICCIA Vincenzo;1586;2N;30;PV;0;0;120573;m -BONARRIGO Marco;2039;CM;0;MI;020185;814113;100696;m -BULGARINI Gabriele;1563;3N;30;MI;291085;0;100716;m -PERON Davide;1724;2N;30;MN;010571;0;101178;m -FRONTERA Domenico;1632;2N;30;KR;181265;0;7123;m -MARRAZZO Bernardo;1544;3N;30;KR;231048;0;106754;m -CAMPAGNA Angelo;1679;2N;30;KR;150560;0;106481;m -CELESTINO Antonio;1448;3N;30;KR;260550;0;118591;m -LEALI Claudio;1738;2N;30;MI;261060;0;109319;m -TORCHIA Gennaro;1575;3N;30;TO;200149;0;107504;m -CUNATI Valerio;1700;2N;30;VA;090162;0;117812;m -SCAPICCHI Andrea;1534;3N;30;RM;291273;0;7130;m -ZANIN Armando;1700;2N;30;MI;270158;0;7131;m -RIGGI Marco;1670;2N;30;UD;060573;0;111397;m -CAVAZZINI Umberto;1563;3N;30;FE;0;0;7133;m -BETTINI Rodolfo;1787;2N;30;FE;160262;0;111391;m -TINNIRELLO Mario;1718;2N;30;FE;170372;0;102229;m -VOLPATI Antonio;1577;2N;30;CR;291167;0;104240;m -MICCO Monica;1551;3N;30;UD;110589;0;105991;f -ROBUSTELLI Davide;1532;3N;30;SO;050864;0;109389;m -BELTRAMO Mauro;1599;3N;30;TO;0;0;7139;m -FALCETTO Massimo;1570;3N;30;TO;0;0;7140;m -MARCUZZI Maurizio;1503;3N;30;TO;180948;0;103249;m -MORRA Andrea;1594;3N;30;TO;250687;0;7142;m -ADEZATI Luca;1599;3N;30;TO;150474;0;7143;m -VICARI Fausto;1580;3N;30;TO;100761;0;7144;m -PERINO Antonio;1584;3N;30;TO;060467;0;107615;m -POLITI Francesco;1625;2N;30;MI;0;0;7146;m -MEREGHETTI Marco;1762;2N;30;MI;150283;0;102553;m -MICIELI Vincenzo;1505;3N;30;SR;270586;0;106594;m -MONACO Biagio;1558;3N;30;SR;180682;0;106595;m -GUERRA Francesco;1580;3N;30;CH;150657;0;7150;m -LA-MORGIA Carlo;1599;3N;30;CH;301257;0;106948;m -BIONDI Alfonso;1867;1N;30;BN;201284;0;100446;m -ALBA Riccardo;1655;2N;30;VE;261049;0;109984;m -URFALINO Angelo;1599;3N;30;PG;150654;0;116008;m -DE-LUCA Augusto;1560;3N;30;ME;051184;0;110078;m -SEBASTIANI Aldo;1700;2N;30;CH;300386;0;106964;m -LAFORGIA Antonio;1697;2N;30;RM;140182;0;109672;m -LUGARESI Giorgio;1568;3N;30;RA;020551;0;109212;m -BETHAZ Giovanni;1700;2N;30;AO;010146;0;7159;m -KOFLER Melanie;1568;3N;30;BZ;280790;0;109553;f -BARBIERI Angelo;1404;3N;30;PV;050331;0;102214;m -DONATO Antonino;1404;3N;30;IM;070452;0;105081;m -GRASSO Gabriele;1783;1N;0;GE;140977;819298;105164;m -GRIFFINI Andrea;1705;2N;30;PV;060766;0;100277;m -MAUCERI Claudio;1900;1N;30;TO;230765;0;105184;m -PALPACELLI Roberto;1583;3N;30;TO;180859;0;125362;m -PERDUCA Piero;1527;3N;30;PV;150347;0;102220;m -TODESCO Ivan;1544;3N;30;CN;151166;0;7168;m -TURUNCIC Bojan;1980;CM;30;EE;170960;0;7169;m -ROMBALDONI Denis;2348;FM;0;PU;140389;813575;100303;m -LISEI Sergio;1512;3N;30;PE;291033;0;103421;m -SCALFI Agostino;1568;3N;30;AO;260942;0;109621;m -SPORNBERGER Peter;1655;2N;30;BZ;190658;0;101532;m -GARBELLI Angelo;1450;3N;30;BS;150141;0;110715;m -GIACOMINI Roberto;1598;2N;30;BS;211073;0;102343;m -MARTINI Tranquillo;1553;3N;30;BZ;060540;0;107131;m -PAOLINI Renzo;1587;3N;30;BZ;021131;0;107130;m -ABBADESSA Giovanni;1769;2N;0;VA;010956;827649;120604;m -CICCARELLI Mario;1582;3N;30;IM;170169;0;7179;m -LORIA Livio;1697;2N;30;SV;020365;0;109412;m -MAZZINI Aldo;1685;2N;30;IM;190262;0;7181;m -MILITELLO Roberto;1534;3N;30;SP;250338;0;103653;m -NOVARO Stefano;1635;2N;30;IM;291265;0;105072;m -ROBBIANO Andrea;1450;3N;30;GE;170262;0;101325;m -STANISCI Carlo;1553;3N;30;GE;141138;0;7185;m -MARENCO Dario;1580;3N;30;GE;200761;0;7186;m -TREVISAN Giuseppe;1536;3N;30;PN;200144;0;102031;m -FONTANA Alessandro;1580;3N;30;PD;100885;0;7188;m -CURTI Carlo;1697;2N;30;VI;081269;0;103869;m -TALAMINI Pieraugusto;1652;2N;30;TV;150758;0;103842;m -CORTINA Daniele;1587;3N;30;BL;310185;0;105034;m -SEDANI Elisa;1577;2N;30;TV;180784;0;103384;f -BELLAN Mauro;1658;2N;30;BI;0;0;102044;m -PIZZINALI Devis;1499;2N;30;VC;190666;0;110492;m -MANFREDOTTI Pierluig;1410;3N;30;MI;311251;0;102528;m -PAGANIN Matteo;1705;2N;30;MI;250482;0;104012;m -TAPPEINER Michael;1706;2N;30;BZ;010186;0;109697;m -PEZZOLATO Michele;1908;1N;0;PD;111271;823716;104042;m -BORDIN Marco;1774;2N;30;RM;260461;0;108890;m -LANZONE Giuseppe;1544;3N;30;NA;280574;0;109940;m -CARPINO Santo;1667;2N;30;TO;191264;0;102183;m -BACCARANI Ugo;1554;3N;30;RE;180658;0;117074;m -DELLA-MANNA Fabrizio;1900;1N;30;RM;201261;0;7203;m -FAVA Giorgio;1548;3N;30;CN;201256;0;105093;m -MANDORINO Fulvio;1580;3N;30;TA;230977;0;109821;m -MAURI Enrico;1412;3N;30;NA;130728;0;107233;m -LENTINI Cristian;1556;3N;30;TA;030780;0;7208;m -PENTO Carlo;1835;1N;30;RO;210758;0;101183;m -MIALE Claudio;1854;1N;0;NA;170372;822736;113697;m -PAOLINI Justin;1661;2N;30;PU;260384;0;105868;m -PEDINI Dario;1924;1N;30;PU;030581;0;105867;m -ESPOSITO Salvatore;1697;2N;30;RA;101054;0;109225;m -TORRESANI Diego;1691;2N;30;VR;210426;0;101940;m -BIANCHI Efrem;1551;3N;30;RN;0;0;7215;m -BRACCHI Carlo;1700;2N;30;MI;261043;0;101747;m -GUERRA Mirko;1599;3N;30;SS;280485;0;102182;m -SANNA Giovanni;1584;3N;30;SS;280283;0;106749;m -LATORRE Marco;1541;3N;30;MI;230885;0;103601;m -FERRI Claudio;1700;2N;30;SP;180354;0;103651;m -GHIGGINI Paolo;1580;3N;30;SP;230774;0;103650;m -CAVAZZONI Carlo Albe;1682;2N;30;MO;170953;0;107868;m -CALI' Paolo;1693;2N;30;CT;260861;0;102468;m -SCABOTTI Rossella;1580;3N;30;CT;080285;0;7225;f -ASTA Sebastiano;1491;3N;30;CT;080956;0;107360;m -QUESTORINO Concetto;1580;3N;30;CT;030387;0;7227;m -FASSINO Marco;1611;2N;30;TO;070568;0;114862;m -MARTINEZ Antonio;1527;3N;30;LE;060276;0;7229;m -CATINO Francesca;1688;2N;30;BR;050984;0;106233;f -PETRIGNANI Paolo;1700;2N;30;TA;210474;0;109591;m -CATINO Francesco;1469;3N;30;BR;0;0;7232;m -PEDE Antonio;1572;3N;30;LE;020155;0;7233;m -CRAPAROTTA Annamaria;1601;2N;30;TP;090685;0;107117;f -GAMBARROTA Giuseppe;1580;3N;30;BA;270586;0;107945;m -CARPANI Gianpiero;1580;3N;30;BO;260357;0;100287;m -DORONZO Giuseppe;1580;3N;30;BA;050283;0;7237;m -FERRI Stefano;1539;3N;30;LE;010179;0;109842;m -GINEVRINI Italo Vitt;1580;3N;30;TN;010136;0;100658;m -APARO Vittorio;1442;3N;30;LI;0;0;7240;m -CIONI Paola;1522;3N;30;RM;250663;0;100359;f -DRAGO Alfredo;1539;3N;30;PT;010532;0;109202;m -FUSCO Anio;1570;3N;30;FI;180859;0;110059;m -GARGINI Claudio;1599;3N;30;PO;260151;0;101405;m -GIACONI Giovanni;1568;3N;30;AR;0;0;7245;m -GIALLOMBARDO Federic;1544;3N;30;BG;100768;0;100897;m -VOCATURO Renato;1700;2N;30;RM;160657;0;112368;m -PAGANO Michele;1599;3N;30;SP;300668;0;103644;m -SILECI Filippo;1650;2N;30;CT;250160;0;106150;m -RASTELLI Davide;1936;1N;30;TE;300485;0;106699;m -D'ALESSANDRO Alessio;1575;3N;30;GE;150881;0;7251;m -GRASSO Michele;1580;3N;30;GE;140977;0;7252;m -CARLINI Francesco;1781;1N;30;FE;010185;0;100739;m -BALBONI Lamberto;1751;2N;30;FE;040358;0;102237;m -LAMONICA Giuseppe;1580;3N;30;ME;110235;0;103813;m -GOODWIN Mark;1757;2N;30;EE;151187;0;7256;m -SIENA Pierluigi;1706;2N;30;PU;220577;0;101831;m -SCIVALES Daniel;2072;CM;0;PG;210864;813079;109798;m -VINCIGUERRA Riccardo;1511;3N;30;AL;181264;0;101557;m -BUZZATI Francesco;1823;1N;30;BL;010289;0;114689;m -DE-VINCENTIIS Federi;1813;1N;30;PE;221160;0;110053;m -BALDUCCI Alessandro;1789;1N;30;PG;160655;0;103876;m -BARDI Giuliano;1872;1N;0;FI;220465;822116;107985;m -FELICI Remo;1548;3N;30;AP;0;0;7264;m -GATTARI Massimo;1735;2N;30;MC;110261;0;105709;m -MARIONI Massimo;1469;3N;30;MI;230945;0;103603;m -MASTRODDI Giuseppe;1846;1N;0;RM;090346;813931;108925;m -PACI Paolo;1608;2N;30;AP;0;0;7268;m -POLI Marco;1554;3N;30;AP;250463;0;101388;m -PORCACCHIA Giovanni;1593;3N;30;RM;250645;0;108919;m -TRANCANELLI Claudio;1747;2N;30;MC;310360;0;105711;m -VECCHIA Mario;2081;CM;0;CR;181280;816140;101278;m -VARNACCIA Luigi;1562;2N;30;SR;070763;0;104014;m -BONETTI Alberto;1482;3N;30;BS;111162;0;103531;m -SIGNORELLI Roberto;1789;2N;30;BG;140329;0;109533;m -FELICE Antonio;1939;1N;30;FI;0;0;7276;m -AGOSTINI Ariele;1582;3N;30;MI;0;0;7277;m -MAGNI Stefano;1527;3N;30;LC;100667;0;112231;m -RUSCONI Agostino;1493;3N;30;LC;100671;0;107049;m -FALCINELLI Emanuela;1581;3N;30;PG;250573;0;103888;f -PERGOLA Giulio;1726;2N;30;BA;181182;0;107156;m -LAVOLPE Vito;1601;2N;30;BA;160366;0;111305;m -GIOIA Flavio;1572;3N;30;BA;250781;0;109372;m -PETROLO Mauro;1870;1N;30;BR;100271;0;106240;m -CERONE Donato;1784;1N;30;PZ;180670;0;108010;m -MARRA Adalberto;1667;2N;30;TA;030142;0;107913;m -MIALE Renato;1443;3N;30;NA;100741;0;109824;m -CONSOLI Giovanni;1493;3N;30;RM;220866;0;102137;m -INGLESE Guglielmo;1551;3N;30;PA;200681;0;104892;m -CARUSO Salvatore San;1587;3N;30;CT;090858;0;7290;m -GIAMBRONE Salvatore;1599;3N;30;PA;130782;0;7291;m -MORRICONE Andrea;1580;3N;30;RM;0;0;7292;m -FONTECCHIO Jonathan;1544;3N;30;PA;0;0;7293;m -DE-MARIANO Angelo;1441;3N;30;ME;210663;0;101489;m -FRONTINO Antonino;1571;3N;30;ME;0;0;125363;m -BONGIORNO Mario;1661;2N;30;CT;150260;0;107362;m -VACCARO Maurizio;1577;3N;30;ME;0;0;7297;m -RANZI Lorella;1587;3N;30;RA;080160;0;109426;f -ZANDONELLA Remo;1605;2N;30;BZ;201046;0;107137;m -VINCENZI Andrea;1967;1N;0;FC;180762;821217;109874;m -ROSSI Carlo;1697;2N;30;FC;100653;0;109223;m -LIVERANI Emiliano;1580;3N;30;RA;140174;0;101589;m -SIGNORINO Antonio;1580;3N;30;FI;0;0;7303;m -MARCORELLI Davide;1570;3N;30;LE;231184;0;7304;m -D'EUSTACHIO Carlo;1548;3N;30;NA;050566;0;7305;m -RENNA Mattia;1688;2N;30;LE;270284;0;114935;m -DE-SIMONE Michele;1709;2N;30;LE;021141;0;7307;m -GRIMALDI Pasquale;1883;1N;30;FG;130160;0;103901;m -GATTI Francesco;1727;2N;30;CB;220552;0;109897;m -TAMMARO Michelangelo;1599;3N;30;CB;280476;0;104667;m -VILLAMAINA Dario;1580;3N;30;RM;040683;0;7311;m -CICCHESE Gennaro;1843;1N;30;IS;0;0;113637;m -BRUNNO Massimo;1652;2N;30;FG;140473;0;104670;m -CARIDEO Nazzareno;1512;3N;30;IS;240555;0;117076;m -SCARAMUZZO Giancarlo;1706;2N;30;BN;050555;0;100434;m -JANIGRO Michelangelo;1525;3N;30;CB;160151;0;113606;m -FASCIA Davide;1505;3N;30;FG;290954;0;104671;m -CIRIO Mauro;1580;3N;30;TO;280881;0;112064;m -DE-LUCA Michele;1488;3N;30;TO;241143;0;109304;m -CECCHETTO Marco;1522;3N;30;TO;150736;0;101559;m -CENCI Federico;1998;1N;0;AR;200278;818127;109743;m -D'ALESSANDRO Nello;1580;3N;30;PI;121071;0;7322;m -BIZZARRI Matteo;1616;2N;30;LU;280977;0;103461;m -GIULIANI Angelo;1575;3N;30;LU;230461;0;106018;m -LA-VALLE Lorenzo;1685;2N;30;PI;0;0;7326;m -PALAGI Marcello;1676;2N;30;LU;260961;0;103492;m -BARBERO Marco;1717;2N;30;MI;091074;0;108164;m -LORENZI Bruno;1700;2N;30;RM;050746;0;105433;m -MOSCONI Tiziano;2118;CM;0;RM;180677;811033;105413;m -BONAZZA Leonardo;1536;3N;30;BO;190364;0;109228;m -AGOMERI Andrea;1676;2N;30;FR;080978;0;117695;m -MAALOUF Joseph;2047;CM;0;RM;170158;812137;102640;m -GIUFFRIDA Massimo;1864;1N;30;CT;111260;0;102470;m -LA-FATA Filippo;1599;3N;30;PA;221150;0;7335;m -PAGLIA Angelo;1723;2N;30;CT;090273;0;105218;m -DI-MAURO Orazio;1496;3N;30;CT;310557;0;109390;m -CASCIANA Salvatore;1474;3N;30;CT;100949;0;7338;m -GILIBERTO Luca;1599;3N;30;CT;180385;0;113450;m -ALLEGRA Bruno;1524;3N;30;ME;0;0;7340;m -BONFISSUTO Roberto;1476;3N;30;CL;160385;0;101456;m -GATTO Giacomo;1563;3N;30;CT;190739;0;111680;m -LA-ROSA Maurizio;1491;3N;30;RG;0;0;7343;m -NUSSBERGER Paolo;1831;1N;30;TE;040833;0;101774;m -BUCCI Francesco;1700;2N;30;AQ;190674;0;107463;m -SCURTI Gino;1580;3N;30;PE;030748;0;101778;m -VALENTI Marco;1685;2N;30;AQ;071061;0;107472;m -SIMONE Lorenzo;1580;3N;30;LE;291285;0;7348;m -BIZZOCO Luca;1826;1N;30;LE;130971;0;105367;m -FAZZI Vittorio;1486;3N;30;LE;050122;0;105372;m -PANDOLFINI Luigi;1580;3N;30;LE;291172;0;105364;m -FISANOTTI Roberto;1580;3N;30;CA;010975;0;7352;m -CORONA Danilo;1705;2N;30;CA;041161;0;107535;m -MARCHIANO Nicola;1751;1N;30;SV;160655;0;102609;m -CIUCHI Davide;1580;3N;30;CR;0;0;7355;m -BONELLI Roberto;1800;1N;30;CR;270968;0;125563;m -NIRO Michele;1512;3N;30;MO;140179;0;101929;m -ARMAROLI Alberto;1595;2N;30;BO;241050;0;109224;m -DEGL'INNOCENTI Crist;1622;2N;30;GE;210272;0;110388;m -BALDACCI Silvano;1571;2N;30;RA;301061;0;109211;m -AVOLEDO Maurizio;1580;3N;30;PN;200176;0;7361;m -GRATTON Vinicio;1664;2N;30;GO;130930;0;106545;m -BURELLO Paolo;1548;3N;30;UD;0;0;7363;m -ZOI Patrick;1580;3N;30;AR;040481;0;7364;m -TOFFOLO Luca;1534;3N;30;TV;270567;0;107809;m -AVETISAN Tigran;1551;3N;30;VE;0;0;7366;m -LEO Giuseppe;1646;2N;30;VI;190663;0;101217;m -STROMBOLI Ettore;2224;-M;0;NA;231286;813761;110212;m -GALLO Thomas Renato;1862;1N;0;NA;181263;823317;107076;m -SANSONE Giuseppe;1700;2N;30;NA;230477;0;7370;m -TROTTA Antonio;1619;2N;30;NA;111282;0;117681;m -ALBARELLA Laura;1553;3N;30;NA;110967;0;106620;f -MURGIA Antonio;1652;2N;30;NA;160153;0;107240;m -ROSSETTI Roberto;1517;3N;30;NA;290663;0;114266;m -SALOMONE Raffaele;1529;3N;30;NA;0;0;7375;m -TORTORELLA Edoardo;1544;3N;30;NA;250235;0;113111;m -LOMBARDI Luca;1608;2N;30;BG;291064;0;106394;m -NAVA Gianmaria;1580;3N;30;BG;070368;0;7378;m -CEREDA Mauro;1568;3N;30;BG;260872;0;108072;m -DE-LUCA Mario;1488;3N;30;ME;120954;0;110077;m -DI-PIETRO Davide;2020;CM;30;BG;230984;0;101705;m -SAPONE Luigi;1514;3N;30;TO;270150;0;100804;m -SOLA Giuseppe;1900;1N;0;TO;190981;818453;105192;m -GIOVANNONE Enrico;1732;2N;30;TO;140678;0;7384;m -DAL-BO Irio;1599;3N;30;TO;0;0;7385;m -ANTONIAZZI Francesco;1577;3N;30;TO;0;0;7386;m -ACHILLI Michele;1574;3N;30;GR;281276;0;126032;m -FAGNANI Guido;1570;3N;30;IS;090860;0;7388;m -TARAZON Victor;1894;1N;30;TE;180169;0;107253;m -SABATINI Claudio;1608;2N;30;PE;280164;0;107252;m -FORLANI Renato;1553;3N;30;PE;241051;0;103416;m -CASIRAGHI Fabio;1587;3N;30;PE;011184;0;111661;m -FALCONE Angelo;1541;3N;30;BA;160487;0;106993;m -ABBRACCIAVENTO Giuse;1766;2N;30;TA;191086;0;105804;m -PICARELLA Gerardo;1580;3N;30;BR;0;0;7395;m -D'ERRICO Luis Angel;1589;2N;30;TA;160681;0;107911;m -COLUCCI Giuseppe;1541;3N;30;TA;0;0;117716;m -LO-SAVIO Emanuele;1546;3N;30;TA;0;0;7398;m -VALENTI Francesco;1582;3N;30;TA;0;0;7399;m -PROSSOMARITI Alessio;1580;3N;30;PV;240970;0;105179;m -LUPO' Vittorio;1599;3N;30;AL;281231;0;113413;m -PAPALINI Claudio;1592;2N;30;TO;050963;0;104394;m -SUDATI Antonio;1522;3N;30;BS;080549;0;102064;m -NALIN Vittorio;1682;2N;30;VR;010836;0;100936;m -COLADONATO Adriano;1679;2N;30;RM;200687;0;104272;m -ANDREANI Matteo;1551;3N;30;RM;0;0;7406;m -MINOTTI Nicola;1527;3N;30;RM;110757;0;100248;m -PALMUCCI Lorenzo;1762;2N;30;RM;0;0;7408;m -ALIBERTI Emilio;1847;1N;30;SA;220580;0;101248;m -DE-VIVO Michele;1536;3N;30;PZ;210673;0;108005;m -TRAMUTOLA Gianluca;1587;3N;30;PZ;140671;0;110017;m -PASCARELLI Ugo;1541;3N;30;PZ;0;0;7412;m -BUCALOSSI Romano;1586;2N;30;LI;150534;0;110067;m -PIREDDU Giovanni;1556;3N;30;MI;120578;0;104570;m -GRUGNETTI Andrea;1572;3N;30;MI;141072;0;7415;m -PERCHINUNNO Antonio;1404;3N;30;MI;270858;0;100895;m -GIGLIO Antonio;1685;2N;30;KR;090856;0;106759;m -DUSI Carlo;1700;2N;30;MN;010877;0;101161;m -DUSI Matteo;1673;2N;30;MN;010877;0;101162;m -ANDREANI Luca;1787;2N;30;MN;011271;0;101150;m -SGUAZZABIA;1553;3N;30;MN;0;0;7421;m -DE-PELLIGRIN Dino;1697;2N;30;BL;140431;0;105021;m -LIEKOCAJ Ivan;1676;2N;30;BL;130269;0;110591;m -SOPPELSA Ferrandi;1522;3N;30;BL;111066;0;105037;m -VERDI Ruben;1486;3N;30;PD;260970;0;106789;m -ZANON Leandro;1562;3N;30;BL;240974;0;127983;m -LAROUSSI Mohammed;1580;3N;30;NN;0;0;114007;m -VEDOVATO Rudi;1583;2N;30;VE;040174;0;109653;m -STUMBO Maurizio;1580;3N;30;CS;0;0;7429;m -CORTESE Lucio;1640;2N;30;CS;030361;0;100911;m -BELLI Romualdo;1580;3N;30;RM;230157;0;7431;m -CARBONE Stefano;1587;2N;30;FR;250162;0;117055;m -ROSSI Giuseppe;1534;3N;30;RM;220856;0;107683;m -MICIELI Aurelio;1584;3N;30;SR;250987;0;106593;m -GILIBERTO Adriano;1589;3N;30;CT;210686;0;113451;m -ANTOCI Giovanni;1522;3N;30;CT;0;0;105730;m -MAGGIORE Tommaso;1505;3N;30;RG;270542;0;105735;m -CARUSO Elio;1546;3N;30;CT;090379;0;106411;m -PESARESI Antonio;1599;3N;30;CT;130173;0;111538;m -BINDER Andrea;1691;2N;30;FE;120375;0;104036;m -OLIVO Paolo;1589;2N;30;KR;091258;0;108485;m -CASTELLITI Diego;1455;3N;30;KR;200382;0;106479;m -GENTILE Andrea;1715;2N;30;KR;120482;0;106480;m -BAROZZI Davide;1522;3N;30;KR;240183;0;108495;m -MADDENTE Carmine;1570;3N;30;KR;180261;0;106472;m -GRECO Antonio;1536;3N;30;TA;110759;0;107907;m -ROSTI Mario;1486;3N;30;BG;170628;0;101684;m -MARSIGLIO Antonio;1580;3N;30;BG;0;0;7448;m -FRANCO Francesco;1700;2N;30;RM;000014;0;7449;m -CALIARI Stefano;1572;3N;30;MI;0;0;107640;m -MEREGALLI Diego;1693;2N;30;MI;020870;0;102395;m -AGLIO Michele;1676;2N;30;CR;241075;0;104220;m -PAPIA Bruno;1568;3N;30;PA;240384;0;108464;m -COLLURA Giuseppe;1599;3N;30;PA;090275;0;100395;m -TODARO Pietro;1599;3N;30;NN;111138;0;117154;m -SCORSONE Daniele;1599;3N;30;NN;290985;0;7456;m -FILINGERI Salvatore;1637;2N;30;PA;050163;0;109780;m -NAPOLI Nicolo';2216;-M;0;PA;080385;813702;104178;m -CIMMINO Salvatore;1599;3N;30;CE;140350;0;100394;m -DI-MASO Antonio;1628;2N;30;NA;231256;0;107068;m -DE-POLZER Manfredi;1703;2N;30;BZ;300936;0;109694;m -BIANCHETTI Marco;1589;3N;30;BZ;270656;0;105565;m -MAHLKNECHT Hans;1515;3N;30;BZ;061232;0;105567;m -GUALINI Silvestro;1547;3N;30;AN;270255;0;104753;m -ROSSIGNOLI Cristiano;1580;3N;30;PT;270974;0;109879;m -AVANZI Gioni;1562;2N;30;PT;110156;0;102890;m -CAPUTO Francesco;1602;2N;30;NA;240466;0;101876;m -BOTTONE Giovanni;1691;2N;30;NA;0;0;7468;m -BUONOCORE Giuseppe;1558;3N;30;NA;050761;0;107989;m -DI-FRAIA Vincenzo;1539;3N;30;NA;280548;0;101880;m -FERRARINI Alessio;1730;2N;30;MN;280874;0;101564;m -CHIERICI Mauro;1700;2N;30;MN;110546;0;101988;m -BELLINI Luca;1727;2N;30;VR;100568;0;101938;m -BOCCEDA Carlo;1730;2N;30;RE;050461;0;101155;m -COLANGELI Claudio;1766;2N;30;PE;150285;0;101768;m -D'ARMI Francesco;1570;3N;30;PE;161085;0;101771;m -SCOTUCCI Pasquale;1522;3N;30;PE;170554;0;101777;m -NAPOLETANO Enrico;1527;3N;30;PE;140536;0;101773;m -RONCAGLIOLI Filippo;1534;3N;30;MI;0;0;7479;m -PARPINEL Marco;2082;CM;0;LT;020386;818410;107277;m -GIACOMELLI Francesco;1548;3N;30;LT;041073;0;7481;m -NAPOLI Guido;1486;3N;30;LT;300626;0;104940;m -CARISSIMO Armando;1577;3N;30;LT;0;0;7483;m -CESARO Michele;1565;3N;30;LT;0;0;7484;m -VITTORIA Giuseppe;1690;2N;30;TO;021041;0;111211;m -GROHROCK Roberto;1672;2N;30;TO;020472;0;102189;m -MELI Massimiliano;1580;3N;30;TO;270380;0;7487;m -MERETA Carlo;1599;3N;30;GE;040159;0;102305;m -FARINACCIO Michele;1584;3N;30;RG;270374;0;105729;m -PICKERING Andy;1715;2N;30;PC;300462;0;102375;m -LOSI Paolo;1566;3N;30;PC;031262;0;102374;m -CHIEREGHIN Franco;1708;2N;30;FE;121242;0;102234;m -FAVALE Giuseppe;1534;3N;30;PD;150558;0;110681;m -GRECO Massimiliano;1599;3N;30;SR;0;0;7494;m -MANGIAFICO Francesco;1416;3N;30;SR;040932;0;106604;m -FRASCA Giuseppe;1551;3N;30;SR;300587;0;106592;m -FANTIN Olindo;1522;3N;30;TV;200570;0;107802;m -SIRONE Gaspare;1579;3N;30;CL;260465;0;101454;m -VENASCO Maurizio;1580;3N;30;CT;140574;0;107354;m -ABBATE Giovanni;1526;3N;30;SP;280963;0;106603;m -LA-ROSA Sebastiano;1709;2N;30;CT;030768;0;103440;m -RONZINO Marcello;1580;3N;30;LE;300671;0;7502;m -D'URBANO Roberto;1508;2N;30;LE;090366;0;113420;m -FRANCO Antonello;1886;1N;30;PR;180369;0;108180;m -ZUCCARELLO Antonio;1655;2N;30;CT;040667;0;104497;m -CADDEO Corrado;1508;3N;30;CA;130186;0;103113;m -BELCREDI Massimo;1587;3N;30;NO;240262;0;104871;m -MOTTA Federico;1700;2N;30;BI;0;0;102043;m -BERTOLOTTI Simone;1587;3N;30;NO;0;0;7509;m -DI-GIORGI Giacomo;1538;2N;30;TP;311085;0;107120;m -LISSANDRELLO Luca;1655;2N;30;TP;131170;0;104310;m -MANFREDI Candido;1572;3N;30;KR;030760;0;106470;m -LONDINO Francesco;1556;3N;30;KR;280183;0;106762;m -LONDINO Eugenio;1544;3N;30;KR;220553;0;106761;m -MOSCARINO Carlo;1661;2N;30;BN;071048;0;100442;m -CAPORALE Giuseppe Gu;1844;CM;0;AV;170740;2108895;122353;m -ROMANO Emilia;1565;3N;30;BN;0;0;7517;f -CANGEMI Felice;1478;3N;30;TP;080164;0;107765;m -RAGOLIA Pasquale;1580;3N;30;TP;170866;0;7519;m -PETRALIA Emanuele;1553;3N;30;TP;080471;0;107764;m -RISTAGNO Calogero;1572;3N;30;CL;170767;0;101457;m -CRIMI Egidio;1422;3N;30;MI;150540;0;100704;m -TORO Camillo;1481;2N;30;BN;250269;0;100433;m -BARILE Antonio;1500;3N;30;CB;010156;0;104668;m -CASTAGNA Serse;1700;2N;30;VI;310757;0;106584;m -BISCEGLIA Daniele;1580;3N;30;GE;280385;0;102303;m -BOLOGNA Maurizio;1563;3N;30;PV;111161;0;7527;m -TALAMI Andrea;1619;2N;30;RE;020382;0;105118;m -LAJOLO Stefano;1599;3N;30;AT;240474;0;102170;m -DI-SARNO Franco;1846;1N;30;AT;0;0;7530;m -POGGIO Giuliano;1643;2N;30;AL;011154;0;106382;m -TRAVERSA Paolo;1529;3N;30;AL;0;0;105306;m -FIOCCONE Simona;1551;3N;30;AT;0;0;7533;f -BIASOLI Marco;1613;2N;30;VA;201082;0;104706;m -DE-ROSA Francesco;1599;3N;30;NA;131075;0;7535;m -D'ANTONIO Luigi;1608;2N;30;NA;031052;0;102708;m -DI-NUNZIO Franco;1474;3N;30;RM;190240;0;7537;m -SILVESTRI Franco;1700;2N;30;BZ;110956;0;101528;m -ECCEL Franco;1580;3N;30;BZ;020958;0;7539;m -BONSERI Sergio;1580;3N;30;BZ;010945;0;101525;m -CAPOTOSTI Piero-Albe;1867;1N;30;RM;030142;0;113572;m -COLUCCI Diego;1721;2N;30;NA;241279;0;107069;m -GASPARI Mauro;1805;1N;30;BL;240961;0;117738;m -BRUNO Alessandro;1580;3N;30;NA;160772;0;113035;m -TROTTA Antonio;1580;3N;30;VE;130941;0;107070;m -ERRICO Antonio;1535;2N;30;NA;140162;0;107079;m -MONDUCCI Mirko;1909;CM;0;RA;250983;813966;102240;m -SARTORI Pietro;1541;3N;30;RM;070760;0;100822;m -ALESSI Andrea;1635;2N;30;RM;230175;0;109739;m -CUCCUMINI Vittorio;1558;3N;30;RM;0;0;7550;m -TAURINO Fabrizio;1577;3N;30;CZ;060673;0;108573;m -MULLAY Kastriot;1700;2N;30;TN;0;0;7552;m -DABERTO Gianluca;1694;2N;30;TN;170670;0;103103;m -BALESTRA Stefano;1546;3N;30;FE;040175;0;102238;m -COLOMBO Simone;1544;3N;30;BO;280982;0;101579;m -FARNETI Rita;1580;3N;30;BO;200943;0;105336;f -MARZOLI Mauro;1599;3N;30;BO;010365;0;7557;m -PATRON Igor;1700;2N;30;BO;041062;0;101594;m -RONCHETTI Niccolo';2421;FM;0;RA;100189;813125;100317;m -SERNAGIOTTO Mirko Vi;2118;CM;0;BO;250562;819964;109601;m -MENCARELLI Ettore;1534;3N;30;TV;270454;0;110142;m -PANDOLFO Valentino;1584;3N;30;TV;;0;110140;m -ONGARO Andrea;1528;3N;30;MI;150970;0;102556;m -VELTCHEV Nicolay;1738;2N;30;MI;010985;0;103597;m -GIUSSANI Igor;1942;1N;0;NO;070278;819115;104867;m -QUILICO Alessandro;1700;2N;30;TO;061174;0;100801;m -GIACHINO Adriano;1586;2N;30;TO;041160;0;100790;m -BAZZEATO Stefano;1844;1N;30;BI;210677;0;102266;m -DI-MINERVINO Luca;1730;2N;30;MI;241086;0;110414;m -DI-NARDO Massimo;1536;3N;30;MI;220669;0;106858;m -SHYTAJ Carlo;2212;-M;0;BA;150184;812382;107149;m -SHYTAJ Luca;2433;IM;0;BA;030286;812633;107148;m -MELETI Paolo;1548;3N;30;LE;180269;0;107153;m -FRANCONE Rinaldo;1599;3N;30;BA;;0;7574;m -MARTINO Luigi;1515;3N;30;BA;0;0;7575;m -MEDICI Luca;1599;3N;30;MO;050565;0;104528;m -SPATTINI Gianni;1563;3N;30;MO;220682;0;7577;m -VERUCCHI Daniele;1700;2N;30;MO;041161;0;110261;m -BATTISTELLI Alessand;1872;1N;0;RM;250486;824747;107266;m -VIZZACCARO Luca;1742;2N;30;FR;191075;0;100612;m -BALOSSINI Eric;1527;3N;30;RM;310560;0;112507;m -SAUTTO Alessandra;1950;CM;0;FR;310878;813451;100608;f -SPINOSO Giovanni;1607;2N;30;PD;090161;0;110687;m -CATTI Patrick;1539;3N;30;PD;200259;0;104029;m -MARCELLO Stefan;1700;2N;30;BZ;150874;0;7585;m -PUINTER Walter;1580;3N;30;BZ;0;0;7586;m -MITTERHOFER Martin;1580;3N;30;BZ;080472;0;7587;m -CRESTI Silvano;1493;3N;30;GR;081132;0;105322;m -DEL-GAMBA Piero;1592;2N;30;GR;080152;0;105316;m -D'ALTRI Davide;1676;2N;30;FC;250781;0;104651;m -CIVIDINI Giovanni;1706;2N;30;VB;070565;0;104457;m -MALZONE Fabrizio;1599;3N;30;RM;280169;0;107272;m -PONTIERI Leonardo;1527;3N;30;KR;190456;0;106478;m -PETRELLI Fabrizio;1502;3N;30;RM;160170;0;112218;m -POLILLI Andrea;1766;2N;30;RM;160888;0;104270;m -BATTISTELLI Primaldo;1550;3N;30;RM;290956;0;107267;m -CICERI Andrea;1551;3N;30;BG;070475;0;110089;m -STERZA Alessandro;1587;3N;30;BS;081163;0;102063;m -CIPRIANI Mauro;1571;2N;30;BS;101058;0;100925;m -CALIGIURI Santo;1580;3N;30;KR;0;0;7600;m -GORIETTI Stefano;1823;1N;30;PG;160967;0;103884;m -SITZIA Carlo;1496;3N;30;CA;221228;0;107543;m -MANCA Antonio;1522;3N;30;CA;121042;0;103852;m -ABIS Josto;1736;2N;30;CA;240955;0;110558;m -PINNA Ferdinando;1599;3N;30;OR;0;0;7605;m -PONTI Mario;1613;2N;30;CA;190253;0;103276;m -BOI Giuseppe;1599;3N;30;CA;160165;0;110546;m -VIGNATI Massimo;1644;2N;30;RM;0;0;107223;m -SAUTTO Fabrizio;1599;3N;30;FR;140781;0;100610;m -GIANNINI Marco;1599;3N;30;RM;210372;0;108821;m -GALLO Gabriele;1484;3N;30;RM;130946;0;105436;m -PRAYER-GALLETTI Matt;1548;3N;30;RM;200661;0;108726;m -RAFAEL Ricardo;1745;2N;30;RM;061052;0;112508;m -CALAO Raoul;1702;2N;30;RM;070467;0;105430;m -CARBONE Maurizio;1676;2N;30;RM;010846;0;108924;m -GHEZZI Federico;1548;3N;30;RM;240164;0;108923;m -HAIKALY Moad;1568;3N;30;RM;0;0;7617;m -MOSCARDI Daniel;1859;1N;30;RM;231076;0;109952;m -SAVARESE Giampiero;1520;3N;30;RM;0;0;7619;m -VENIER Federico;1688;2N;30;UD;060573;0;103739;m -BASILE Salvatore;1570;3N;30;UD;221157;0;103740;m -MASTROLONARDO Fabio;1865;1N;0;GE;220972;817090;101337;m -RODRIGUEZ Alan;2169;CM;0;GE;030978;812269;101037;m -LAUREANA Raimondo;1661;2N;30;GE;240161;0;7624;m -BARONCELLI Luca;1510;3N;30;GE;130868;0;101015;m -CHIOFALO Gianfranco;1582;3N;30;KR;260269;0;106477;m -FOGLIANI Francesco;1502;3N;30;GE;180448;0;109677;m -ADINOLFI Marco;1718;2N;30;PI;130666;0;101969;m -NAZAROVA Olga;1986;CM;0;PI;170266;4183150;109905;f -LANDUCCI Luca;1488;3N;30;PI;040880;0;103193;m -DE-MARTINI Tiziano;1563;3N;30;MI;120562;0;107210;m -ROMANO Roberto;1733;2N;30;MI;110973;0;126096;m -DANELON Claudio;1500;3N;30;MI;180936;0;102545;m -ARNOLD Daniele;1732;2N;30;MI;040283;0;100155;m -BONGHI Fabrizio;1495;3N;30;MI;230165;0;108251;m -CAVENAGO Stefano;1582;3N;30;VA;0;0;104970;m -COLOMBO Roberto;1558;3N;30;MI;0;0;7637;m -LANTERI Andrea Maria;1486;1S;30;MI;111273;0;102405;m -MALLOGGI Stefano;1655;2N;30;MI;260865;0;100714;m -PETTINATO Francesco;1532;3N;30;MI;160159;0;109944;m -MELLAUNER Hartwig;1700;2N;30;BZ;070150;0;7641;m -ANCORA Fabio;1536;3N;30;MI;140773;0;108738;m -LAMI Paolo;1580;3N;30;RM;0;0;7643;m -GUERRINI Gioia;1700;2N;30;AR;090587;0;113509;f -DI-PROSSIMO Giuseppe;1721;2N;30;NO;220161;0;102041;m -GIAI-LEVRA Niccolo';1619;2N;30;TO;190583;0;105507;m -MARIANI Alberto;1832;1N;30;MI;020459;0;100695;m -FRANCESCATO Antonio;1700;2N;30;VE;200660;0;102357;m -LIPEROTI Mimmo;1694;2N;30;KR;290966;0;112789;m -ARNESE Antonio;1580;3N;30;FG;240767;0;108648;m -ROCCO Claudio;1580;3N;30;BA;010856;0;7651;m -PESCHECHERA Francesc;1599;3N;30;BA;090284;0;106995;m -DI-CARLO Pasquale;1766;1N;30;BA;291285;0;109373;m -BRASCHI Giancarlo;2194;CM;0;RM;041185;812757;112055;m -PERRONE Dario;1599;3N;30;BR;060181;0;106247;m -ADDA Franco;1505;3N;30;MI;170852;0;102529;m -CONTI Luigi;1512;3N;30;LC;110453;0;104794;m -RINALDO Luigi;1539;3N;30;MI;170951;0;100132;m -GATTI Giacomo;1572;3N;30;MI;290184;0;103596;m -BRUNO Goffredo;1580;3N;30;SS;200263;0;7660;m -DECASTELLI Juan-Albe;1580;3N;30;SV;270280;0;7661;m -CAFAGGI Stefano;1548;3N;30;MI;080270;0;102522;m -SCOTTI Dario;1580;3N;30;AL;151257;0;106376;m -SUDIRO Giuseppe;1599;3N;30;TV;190556;0;102574;m -CASALONE Angelo;1577;3N;30;VC;250550;0;113207;m -RICCIARDI Arcangelo;1637;2N;30;VC;280678;0;128012;m -COSTANTINO Luigi;1664;2N;30;CN;220866;0;106831;m -GIACOBBE Daniele;1580;3N;30;CN;030867;0;106832;m -CEROVA Sevo;1634;2N;30;CN;301262;0;123566;m -BORTOLATO Giovanni;1587;3N;30;TV;220965;0;101508;m -CORVINO Antonio;1505;2N;30;LE;241168;0;103922;m -GORNI Piero;1691;2N;30;BS;220637;0;106095;m -BONOMETTI Renato;1397;2N;30;BS;210553;0;106929;m -FARINA Agostino;1467;3N;30;BS;110639;0;110995;m -ROBBIANI Simone;1700;2N;30;CO;0;0;7675;m -TUCCI Fedele;1700;2N;30;CO;040761;0;104978;m -TURCATTI Mauro;1700;2N;30;CO;221178;0;104996;m -SPINELLI Francesco;1601;2N;30;CO;300775;0;104999;m -TANZI Marco;1580;3N;30;CO;150569;0;107935;m -ZECCA Carlo;1498;3N;30;CO;300760;0;100722;m -MAGRO Stefano;1599;3N;30;CT;0;0;7681;m -MINELLA Matteo;1580;3N;30;PC;300675;0;106084;m -RICORDA Massimiliano;1474;3N;30;PC;081267;0;106081;m -MARCHINI Gherardo;1565;3N;30;PC;020660;0;106082;m -MAGLIVERAS Dimitri;1499;3N;30;GE;090851;0;105156;m -GUZZETTI Stefano;1591;2N;30;BO;170472;0;105337;m -RUBBINI Roberto;1738;2N;30;BO;271060;0;100757;m -PEDRINI Roberto;1565;3N;30;LC;231156;0;107033;m -SEDINA Elena;2352;WG;0;CO;010668;812153;101999;f -DI-GRAZIA Stefano;1500;3N;30;MI;130475;0;100081;m -LANNI Vincenzo;1697;2N;30;BG;170566;0;102929;m -TROIANI Antonello;1580;3N;30;SS;190153;0;7692;m -PROVENZANO Demetrio;1464;3N;30;RM;030446;0;105432;m -ZIBERNA Luca;1580;3N;30;TS;071280;0;107310;m -CASER Germano;1580;3N;30;TS;170538;0;106535;m -REUSCHEL Jens;1784;2N;30;TS;091152;0;103802;m -CHERIN Diego;2304;FM;0;TS;231270;816922;106517;m -DRAGOVIC Radimiro;1620;2N;30;TS;041161;0;130219;m -BOARETTO Enrico;1596;3N;30;TS;100667;0;103788;m -AMARADDIO Angelo;1565;2N;30;TS;200763;0;106527;m -DE-DONATIIS Daniele;1742;2N;30;TV;0;0;7701;m -BIONDI Alessio;1676;2N;30;BN;080986;0;100447;m -CONFORTI Michele;1661;2N;30;SA;160481;0;7703;m -PETROSINO Alfonso-Ma;1649;2N;30;SA;061181;0;102696;m -TIRRI Valerio;1682;2N;30;NA;201270;0;106627;m -ISENI Aziz;1918;1N;30;MI;140658;0;7706;m -PAGANI Lorenzo;1580;3N;30;MI;051072;0;7707;m -COSTA Simone;1599;3N;30;MI;051180;0;101424;m -STOCCO Giuseppe;1558;3N;30;TO;230748;0;104393;m -ASPES Marco;1646;2N;30;MI;180566;0;124882;m -FRUGOLI Francesco;2143;CM;0;LU;301280;813087;103472;m -D'AMICO Andrea;1700;2N;30;FR;180774;0;7712;m -PELLEGRINI Giovanni;1688;2N;30;LU;220966;0;103481;m -TARABARALLI Luciano;1580;3N;30;LU;100549;0;103485;m -FARISELLI Umberto;1512;3N;30;RC;230934;0;107715;m -BUCCHERI Fabrizio;1712;2N;30;SA;170876;0;102691;m -DE-FEO Francesco;1583;2N;30;SA;080657;0;102700;m -SARTO Arrigo;1580;3N;30;TO;190648;0;107915;m -EVERET Giorgio;1560;3N;30;CR;051251;0;104227;m -PAULINICH Igor;1580;3N;30;CR;0;0;7720;m -CENCH Andrea;1700;2N;30;TN;190784;0;100054;m -ZOESCHG Matthias;1580;3N;30;BZ;170786;0;113311;m -AMODIO Massimo;1580;3N;30;SR;170974;0;100304;m -BORTOLOTTI Silvano;1744;2N;30;TN;120646;0;100672;m -MOTTO Alexis;1709;2N;30;AO;131174;0;110666;m -CRISA' Francesco-Mar;1628;2N;30;KR;170790;0;106763;m -MARTELLO Aniello;1580;3N;30;MT;071166;0;106724;m -RIZZI Gianni;1870;1N;30;SS;0;0;7728;m -SAUTTO Daniele;2152;CM;0;FR;060484;812617;100609;m -LORIA Luca;1568;3N;30;SV;171167;0;109413;m -FERRARO Luciano;1515;3N;30;GE;280346;0;101334;m -BOI Fausto;1622;2N;30;CA;180872;0;103263;m -TRINCAS Claudio;1730;2N;30;CA;120856;0;103854;m -DE-PALMA Silvio;1774;2N;30;LO;241147;0;104430;m -DRAGONI Gianfranco;1700;2N;30;LO;280974;0;104432;m -MONTANI Giorgio;1646;2N;30;LO;260138;0;104427;m -FERRARA Vincenzo;1691;2N;30;CS;210786;0;104136;m -CONVERSO Domenico;1532;3N;30;CS;011185;0;104133;m -MAURO Alessio;1527;3N;30;CS;;0;108980;m -ESPOSITO Danilo;1655;2N;30;CS;290784;0;104134;m -BAULEO Giovanni;1703;2N;30;CS;240644;0;104123;m -BOVA Emilio;1688;2N;30;CS;121279;0;104126;m -GAGLIARDI Lucio;1688;2N;30;CS;210885;0;104132;m -ARMENTANO Francesco;1700;2N;30;CS;230247;0;104121;m -D'ELIA Francesco;1730;2N;30;CS;041070;0;109143;m -DOMANICO Francesco;1512;3N;30;CS;270184;0;104135;m -PILIA Alessandro;1580;3N;30;NU;101083;0;104499;m -CONTI Orlando;1541;3N;30;MS;280948;0;105482;m -DE-NADAI Daniele;1610;2N;30;LI;181076;0;127643;m -ADORNI Giuseppe;1718;2N;30;MS;0;0;7750;m -BIGGI Andrea;1852;1N;30;MS;210169;0;103662;m -STORELLI Max;1685;2N;30;RM;170275;0;115836;m -BELLI Alessandro;1538;3N;30;RM;090642;0;108889;m -DI-LORETO Paolo;1589;2N;30;RM;081146;0;102366;m -LUCARELLI Christian;1580;3N;30;RM;110871;0;7755;m -NASSETTI Francesco;1652;2N;30;RM;131271;0;102752;m -GIUNTINI Pierluigi;1541;3N;30;AP;0;0;109749;m -ANTI Josif;1580;3N;30;VR;171063;0;7758;m -SILVESTRI Patrizio;1565;3N;30;SO;170452;0;106303;m -BENTIVEGNA Ferruccio;1607;2N;30;PA;121066;0;7760;m -CARINI Tiziano;1757;2N;30;CR;0;0;7761;m -CERESA Alessandro;1589;3N;30;SO;170452;0;111972;m -MEYNET Siro;1517;3N;30;AO;161251;0;106185;m -GIACCHINO Claudio;1676;2N;30;TO;201245;0;108013;m -BORGHI Angelo;1580;3N;30;MO;250350;0;100209;m -PERROTTA Leopoldo;1946;CM;0;MI;261269;823864;110301;m -CONSENZI Dario;1544;3N;30;MI;0;0;7767;m -BURRASCANO Marco;1580;3N;30;PA;110384;0;7768;m -GRECO Agostino;1580;3N;30;PA;130256;0;7769;m -CATANIA Diego;1706;2N;30;PA;080172;0;109719;m -FILANGERI Salvatore;1570;3N;30;PA;0;0;7771;m -PALOMBARO Dimitri;1712;2N;30;CH;240568;0;106946;m -D'ALLEVA Gabriele;1505;3N;30;CH;170359;0;106949;m -DEL-ROSARIO Max;1580;3N;30;CH;041170;0;7774;m -PINTI Arnaldo;1657;2N;30;CH;151228;0;106947;m -COLANGELI Roberto;1563;3N;30;PE;050645;0;101769;m -RICCI Damiano;1667;2N;30;PE;240774;0;101776;m -FRACASSI Matteo;1580;3N;30;RE;081083;0;109345;m -ALFARANO Cosimo;1661;2N;30;BR;140769;0;116831;m -RICCIO Luigi;1840;1N;30;NA;011177;0;110203;m -ZACCHIA Marco;1487;3N;30;BA;041055;0;104370;m -RUSSO Francesco;1544;3N;30;PZ;100874;0;108006;m -CIUCHI Alessandro;1580;3N;30;RM;241274;0;107220;m -SCAVELLI Nino;1580;3N;30;KR;300674;0;7784;m -MARTORELLI Mario;1631;2N;30;SA;141288;0;109766;m -MANDRILLO Alessio;1596;3N;30;TA;250670;0;7786;m -ROSA Giuseppe;1931;1N;30;PZ;130568;0;107999;m -SBRACCIA Paolo;1580;3N;30;TE;200865;0;104687;m -MAZZONI Alexandro;1580;3N;30;TE;291276;0;104688;m -COXE Marino;1565;3N;30;TO;271151;0;100768;m -GRATTAROLA Fabio;2133;CM;0;AL;040161;812447;101220;m -PONTILLO Franco;1599;3N;30;TO;040236;0;103257;m -CHINAGLIA Valterio;1580;3N;30;TO;270444;0;7793;m -BOGGIO Valerio;1580;3N;30;BI;210550;0;107620;m -SORGI Paolo;1694;2N;30;AQ;051180;0;7795;m -BANINI Ferruccio;1599;3N;30;AQ;310876;0;108879;m -CICCARELLI Mauro;1709;2N;30;PE;250252;0;102583;m -TAUFER Livio;1697;2N;30;TN;200959;0;100659;m -ZANIN Umberto;1700;2N;30;TN;011028;0;102764;m -LUTA Fatos;1789;2N;30;EE;231056;0;113149;m -DE-VITA Enrico;1586;3N;30;PZ;031173;0;110016;m -PAMER Sebastian;1599;3N;30;BZ;270648;0;7802;m -VASELLI Luciano;1770;1N;30;SP;150826;0;105487;m -PIA Luigi;1580;3N;30;TO;010144;0;113735;m -CUTELLI Massimo;1580;3N;30;TO;041058;0;7805;m -CARRIERI Gennaro;1685;2N;30;TA;161255;0;104626;m -PRESTA Michele;1536;3N;30;TA;300939;0;7807;m -MARANGON Matteo;1529;3N;30;VE;120977;0;103077;m -MUSIANI Carlo;1691;2N;30;PD;300189;0;104059;m -XHANI Bujar;1701;2N;30;RO;080447;0;112303;m -MARTORANA Clemente;1580;3N;30;CL;070747;0;101148;m -GORIN Lino;1685;2N;30;MI;0;0;7812;m -BRANCATI Giovanna;1572;3N;30;PA;151288;0;104904;f -COSTAGLIOLA Raffaele;1580;3N;30;BA;221051;0;7814;m -BOMBA Claudio;1580;3N;30;CH;051159;0;107558;m -ESPOSITO Massimo;1690;2N;30;LE;100471;0;101299;m -POZZI Rodolfo;1580;3N;30;CO;301230;0;107457;m -CASSINERA Chiara;1649;2N;30;TO;310588;0;100785;f -GERSTGRASSER Zeno;1481;3N;30;BZ;080836;0;101953;m -IEMMI Afro;1517;3N;30;BZ;210247;0;107139;m -MESZAROS Katalin;1601;2N;30;EE;0;0;7821;f -PFEIFHOFER Thomas;1599;3N;30;BZ;170374;0;109696;m -RIPARBELLI Matteo;1613;2N;30;TO;180773;0;102181;m -CARPANI Giacomo;1572;3N;30;BO;000081;0;7824;m -FACCIA Rita;1560;3N;30;VR;0;0;100932;f -BEQIRAJ Ismail;1841;1N;30;EE;181153;0;7826;m -MONOPOLI Giuseppe;1580;3N;30;BA;210167;0;7827;m -SHYTAJ Giorgio;1580;3N;30;BA;0207??;0;7828;m -BISSANTI Giuseppe;1563;3N;30;BA;0;0;7829;m -ZAPPOLO Marcello;1706;2N;30;VB;010653;0;118262;m -SIST Nicola;1580;3N;0;MI;201285;0;7831;m -BOSI Felice;1594;3N;30;LC;010538;0;109663;m -BOSI Gianfranco;1616;2N;30;LC;0;0;109915;m -BOSI Roberto;1611;2N;30;MI;151164;0;101418;m -PENZO Sandro;1599;3N;30;MI;0;0;7835;m -ROSSI Enrico;1558;3N;30;MI;140865;0;102563;m -RUGGIERO Paolino;1517;3N;30;MI;130258;0;104776;m -SOMMADOSSI Roberto;1554;3N;30;TN;140650;0;103012;m -VILLANI Luigi;1385;3N;30;MI;100348;0;109194;m -MICHELI Franco;1580;3N;30;LU;251243;0;103476;m -SGAMBATO Antonio;1619;2N;30;NA;201086;0;100408;m -TRACANNA Carlo;1637;2N;30;PE;200587;0;103427;m -USAI Simone;1517;3N;30;SS;240788;0;102298;m -SANNA Giacomo;1529;3N;30;SS;170950;0;100371;m -DI-STEFANO Marco;1582;3N;30;EN;160574;0;109634;m -SCIRE' Aurelio;1598;3N;30;EN;0;0;7846;m -SQUATRITO Paolo;1596;3N;30;EN;121031;0;109637;m -LA-ROSA Rosario;1559;3N;30;ME;010667;0;7848;m -SCAFFARO Roberto;1580;3N;30;PA;180869;0;7849;m -COSTA Dario;1572;3N;30;ME;100187;0;102668;m -FELICI Vito;1505;3N;30;EN;220758;0;114061;m -MAZZOLINI Stefano;1724;2N;30;GE;100681;0;109684;m -TEDESCO Fernando;1700;2N;30;AO;;0;102918;m -DORMIO Luca;1840;1N;30;GE;060673;0;113569;m -SCOLLO Eros;1494;3N;30;SR;180188;0;106610;m -CINQUERRUI Rosario;1565;3N;30;CL;180756;0;7856;m -BONGIORNO Christian;1828;1N;30;ME;080585;0;105751;m -RAVOTTO Luca;1826;1N;30;IM;161287;0;109882;m -ZITO Francesco;1712;2N;30;TA;060861;0;104630;m -GANGEMI Domenico;1515;3N;30;ME;310153;0;105749;m -RIZZO Antonino;1568;3N;30;PA;0;0;7861;m -SORACI Pietro;1587;3N;30;MI;0;0;7862;m -PAPAGNA Domenico;1520;3N;30;GE;071155;0;115610;m -NOSENGO Piero;1625;2N;30;GE;030370;0;115168;m -RUMI Giuseppe;1599;3N;30;MI;150265;0;102992;m -ZARCONE Cristian;1580;3N;30;PA;021274;0;104158;m -ROCCAFORTE Salvatore;1464;3N;30;TP;040864;0;108563;m -MESSINA Marco;2034;CM;0;TP;251083;817031;105766;m -ARINI Mario;1558;3N;30;TP;241054;0;100213;m -CASTURA' Ilario;1780;2N;30;AP;231166;0;109742;m -FRACASSI Davide;1572;3N;30;RE;031082;0;109344;m -RABAGLINO Lorenzo;1706;2N;30;TO;260688;0;113205;m -PFITSCHER Alexander;1580;3N;30;BZ;120388;0;109556;m -PAGAN Nicolo';1655;2N;30;VE;201288;0;106663;m -PETRELLI Antonio;1565;3N;30;AP;0;0;7875;m -MANSUETI Marco;1703;2N;30;BG;021281;0;109785;m -BIEMMI Riccardo;1558;3N;30;GR;280172;0;113556;m -NIGRONI Stefano;1539;3N;30;CR;300181;0;101291;m -DILLON Roberto;1584;3N;30;GE;0;0;7879;m -ROVIDA Roberto;1551;3N;30;MI;0;0;7880;m -ZAVATTA Turio;1750;1N;30;FC;030150;0;109876;m -GALLUCCI Vittorio;1472;3N;30;RM;210979;0;104357;m -MERANI Valerio;1670;2N;30;GE;040376;0;109640;m -RICCA Giorgio;2078;CM;0;IM;240989;817171;105085;m -KOFLER Josef;1700;2N;30;BZ;180366;0;109700;m -MARTINO Vincenzo;1538;2N;30;TA;120386;0;104627;m -CASTAGNOLI Anna;1577;3N;30;GE;190571;0;7888;f -ELSLER Helene;1492;3N;30;BZ;060646;0;105566;f -HU-ZHOU Kun;1580;3N;30;BG;060588;0;101692;m -DANIELI Riccardo;1637;2N;30;BO;050588;0;101630;m -FOSCHI Alessandro;1915;1N;30;RM;110566;0;108921;m -GIUSSANI Giovanni;1676;2N;30;CR;011270;0;101282;m -ALOISIO Salvatore;1601;2N;30;MI;0;0;100113;m -RONCAGLIOLI-VINELLI;1558;3N;30;MI;241171;0;100713;m -PASIN Alfredo;1580;3N;30;MI;130259;0;7896;m -OLIVA Marco;1580;3N;30;TO;130675;0;116085;m -VOLTERRI Stefano;1558;3N;30;TO;140183;0;102201;m -BERRA Umberto;1568;3N;30;CN;0;0;7899;m -DE-BORTOLI Claudio;1421;3N;30;TO;220457;0;101997;m -BOGOUSTKI Seghei;1580;3N;30;UD;230187;0;105974;m -BASILE Daniele;1697;2N;30;MI;121271;0;101817;m -BERNASCONI Roberto;1933;1N;0;CO;281266;812030;100720;m -DEI-GIUDICI Paolo;1685;2N;30;MI;090660;0;102530;m -PIAZZA Luigi;1436;3N;30;TO;170437;0;100799;m -PADUANO Ciro;1700;2N;30;NA;291182;0;101249;m -RICCI Giuseppe;1984;1N;0;NA;270866;821071;103155;m -BISCEGLIA Riccardo;1676;2N;30;NA;140859;0;102821;m -DE-CRISTOFANO Fabriz;1527;3N;30;NA;060983;0;102824;m -CARATUNTI Angelo;1496;3N;30;NA;251255;0;107238;m -CALISTRI Emiliano;1580;3N;30;VI;120372;0;101429;m -FORAPAN Fabio;1685;2N;30;PD;080167;0;101438;m -MESSINA Elia;2166;CM;0;CT;081188;813249;106124;m -DIBLASI Daniele;1668;2N;30;CT;080177;0;106123;m -CASCIANA Luca;1570;3N;30;CT;0;0;7915;m -AMORE Enzo;1616;2N;30;RG;150952;0;105736;m -AMATO Mario;1594;3N;30;CT;161080;0;106133;m -AGRIMI Alessio;1598;2N;30;LE;101084;0;105366;m -GRECO Valentina;1572;3N;30;LE;160585;0;109514;f -OLIVERI Michele;1823;1N;30;TP;251158;0;105769;m -MANNONE Francesco;1694;2N;30;TP;041056;0;103050;m -ANTONUCCI Davor;1580;3N;30;RM;060374;0;114546;m -D'ELIA Gaetano;1575;3N;30;RM;150945;0;106207;m -PALOCCI Claudio;1580;3N;30;RM;160469;0;7924;m -SCOCCIANTI Raffaele;1828;1N;30;RM;150463;0;102327;m -PRZYBYT Jozef;1920;CM;30;EE;0;0;7926;m -MESSANA Fabio;1599;3N;30;RM;;0;113543;m -TAFFI Andrea;1581;3N;30;PI;080166;0;110660;m -RUSTICHELLI Sandro;1595;2N;30;PI;281254;0;103195;m -FESTA Samuele;2009;CM;0;CR;240881;823406;101285;m -DORDONI Dario;1700;2N;30;CR;310584;0;104225;m -COSTARELLI Paolo;1580;3N;30;CT;080271;0;103437;m -MONACO Maria;1517;3N;30;SR;180586;0;106596;f -BELLA Davide;1544;3N;30;CT;250485;0;107361;m -MELIS Piergiorgio;1580;3N;30;CA;301156;0;103117;m -CADDEO Claudia;1563;3N;30;CA;231282;0;103112;f -BENEDETTI Bruno;1727;2N;30;GE;281182;0;109615;m -GUALDI Daniela;1757;2N;30;GE;050886;0;102310;f -OFFIDANI Andrea;1524;3N;30;AP;050575;0;105587;m -BRUGNONI Mauro;1589;3N;30;AP;081168;0;105586;m -CONFORTI Fabio;1580;3N;30;AP;270957;0;108132;m -ARIANTI Giorgio;1539;3N;30;TO;0;0;7942;m -FAZIO Francesco;1586;2N;30;BO;090552;0;111018;m -BENEDETTI Michele;1738;2N;30;BO;260671;0;100286;m -CUSSINI Giulio;1476;3N;30;BO;290326;0;100288;m -BERALDO Gianmarco;1613;2N;30;VA;211167;0;104704;m -MANDOLINI Riccardo;1850;1N;30;AN;261185;0;115338;m -NIZZARDO Mattia;1685;2N;30;PD;011087;0;104068;m -VALLARIO Michele;1652;2N;30;PZ;301266;0;108001;m -CONTE Federico;1649;2N;30;TV;070878;0;108243;m -PARENTE Giuseppe;1515;3N;30;VE;011174;0;103080;m -CHINELLO Gianmarco;2044;CM;0;PD;041187;816779;108208;m -TIOZZO-NETTI Valeria;1634;2N;30;VE;060585;0;103342;f -GOTTARDO Jacopo;1610;2N;30;UD;190682;0;114070;m -DIPARDO Giuliano;1534;3N;30;RM;141269;0;7955;m -PARMEGGIANI Cristian;1568;3N;30;LT;200688;0;107276;m -VITI Francesco;1505;3N;30;RM;270577;0;108915;m -MESSINA Giacomo;1571;3N;30;PA;070583;0;120430;m -GIURINTANO Baldassar;1573;3N;30;PA;270585;0;117025;m -LUCISANO Pierbasilio;1646;2N;30;PD;050557;0;106788;m -CECCHINELLI Paolo;1724;2N;30;SP;220976;0;103642;m -BOSCO Nicola;1583;2N;30;SP;030366;0;103645;m -VALENTE Saverio;1580;3N;30;MI;140967;0;100564;m -CRIPPA Roberto;1546;3N;30;MI;041060;0;100078;m -ALEANDRI Stefano;1700;2N;30;RM;070385;0;104276;m -VOCATURO Daniele;2410;IM;0;RM;161289;813192;104275;m -SOVENTI Maurizio;1838;1N;0;LI;060268;814199;103950;m -BONDI Luigi;1655;2N;30;MO;140258;0;100205;m -BENASSI Fabio;1649;2N;30;MO;280183;0;100204;m -TINTI Luca;1568;2N;30;MO;310887;0;110260;m -GALEAZZI Gabriele;1691;2N;30;RE;081175;0;103198;m -VALERI Mario;1580;3N;30;MO;0;0;7972;m -GHINI Gabriele;1491;3N;30;MO;290687;0;100211;m -ANGLANI Alessandro;1649;2N;30;RE;;0;7974;m -KUMURUKU Cristaq;1817;1N;30;MO;191262;0;103202;m -ALI' Alessandro;1691;2N;30;TP;100985;0;105764;m -GIASONE Piero;1712;2N;30;TP;260683;0;107123;m -OLIVERI Claudio;1700;2N;30;TP;040579;0;107121;m -PICHI Claudio;1534;3N;30;PV;140756;0;122571;m -MONRAD Jorunn;1457;3N;30;MI;190561;0;106431;f -TRANQUILLO Massimo;1580;3N;30;MI;100366;0;103032;m -DEL-MONTE Jorge Luis;2114;CM;30;BG;171166;0;101663;m -LOMBARDO Andrea;1584;3N;30;MI;020667;0;102393;m -RABBONI Davide;1599;3N;30;MI;080367;0;114074;m -LAKOVIC Igor;1724;2N;30;TS;030779;0;110458;m -MARI Fabio;1700;2N;30;TS;200168;0;7986;m -POSSA Alberto;1667;2N;30;TS;070842;0;106526;m -ROMAN Federico;1715;2N;30;VE;260576;0;106524;m -PUGLIESE Stefano;1580;3N;30;TS;191065;0;106529;m -FEZZARDI Emanuele;1976;1N;0;MN;220285;815640;101163;m -GATTERER Matthias;1941;1N;0;BZ;050686;816809;109698;m -RAFFIN Carlo;1580;3N;30;PN;210763;0;102029;m -MUNARIN Maurizio;1580;3N;30;GO;290962;0;102862;m -NARDIN Loris;1450;3N;30;UD;241063;0;105926;m -CRISCI Roberto;1700;2N;30;GO;010557;0;105923;m -CUDINI Andrea;1536;3N;30;UD;011164;0;100600;m -DAL-PONTE Michele;1546;3N;30;UD;0;0;7997;m -MINIGUTTI Volveno;1523;3N;30;UD;050134;0;105928;m -MAZZARRACCHIO Gianma;1560;3N;30;CE;311082;0;100404;m -MEDA Fabrizio;1580;3N;30;MI;300185;0;105477;m -PICCIN Roberto;1496;3N;30;AL;290674;0;102559;m -BRAMBILLA Paolo;1560;3N;30;MI;190652;0;105472;m -CAPELLO Francesco;1580;3N;30;IM;130877;0;108832;m -SANNA Simone;1835;1N;30;IM;100286;0;108833;m -SCHIEPPATI Fulvio;1423;3N;30;IM;030430;0;108827;m -EMPIREO Liberato;1656;2N;30;IM;031167;0;108826;m -COLAVITA Michele;1700;2N;30;CB;210651;0;115791;m -MURICCHIO Giuseppe;1658;2N;30;CB;040952;0;103903;m -BRUNELLI Lorenzo;1565;3N;30;AN;130958;0;104755;m -ALTOMONTE Giuseppe;1701;2N;30;RC;271276;0;107713;m -BARBERA Giuseppe;1534;3N;30;RC;041253;0;107714;m -DI-PIETRO Antonino;1510;3N;30;ME;210156;0;104321;m -TRIMARCHI Giuseppe;1656;2N;30;ME;210776;0;105750;m -GALLINA Antongiulio;1582;3N;30;CS;211284;0;104137;m -SCIGLIANO Stefano;1580;3N;30;CS;0;0;8015;m -VISCIGLIA Aldo;1700;2N;30;CS;260372;0;109152;m -VINDIGNI Fabrizio;1570;3N;30;CS;0;0;8017;m -TERNA Vincenzo;1670;2N;30;BS;230270;0;8018;m -BONVICINI Maurizio;1658;2N;30;BS;190550;0;106935;m -FRANCO Alessandro;1652;2N;30;BS;060665;0;106988;m -COUDURE Domenico;1868;1N;30;BS;060564;0;106938;m -FALCONE Giuseppe;1589;3N;30;BA;200151;0;106997;m -RUGGIERO Mauro;1805;1N;30;BA;311287;0;104365;m -ATTANASI Alessandro;1580;3N;30;TA;250381;0;8024;m -GUGLIELMI Andrea;1491;3N;30;TO;210684;0;100791;m -BURHALA Gabriele;1580;3N;30;MI;151067;0;8026;m -BARSALI Luciano;1544;2N;30;CE;271132;0;100389;m -BROCCA Lorenzo;1439;3N;30;MI;040467;0;100692;m -DOMENGHINI Roberto;1580;3N;30;MI;0;0;8029;m -PIROLA Bruno;1580;3N;30;MI;070422;0;100091;m -CALVANI Dario;1580;3N;30;MI;170784;0;103600;m -FANTASIA Andrea;1587;3N;30;MI;011074;0;109745;m -ZANGIACOMI Aldo;1646;2N;30;MI;061022;0;100161;m -COLLODI Flavio;1551;3N;30;MI;070949;0;108073;m -BORSATO Lorenzo;1623;2N;30;TV;080985;0;107968;m -CALTAROSSA Romeo;1910;1N;30;VE;270241;0;106342;m -DE-SIMON Maurizio;1574;2N;30;TV;201050;0;107801;m -DE-VITO Gianmarco;1580;3N;30;TO;230784;0;102166;m -GATTIGLIO Maurizio;1693;2N;30;TO;300660;0;100135;m -BIAFORA Giampiero;1700;2N;30;CS;020774;0;106757;m -SATTA Salvatore;1551;3N;30;SS;020370;0;100372;m -CHIERICI Marianna;1938;WF;0;RE;240490;820067;105134;f -APRILE Vito;1637;2N;30;FG;190463;0;106156;m -PAPA Bryan;1599;3N;30;FG;291185;0;106171;m -MIRAGLIA Andrea;1563;3N;30;FG;150840;0;106167;m -FAGIOLINO Rodolfo;1510;3N;30;VT;250456;0;101887;m -GIANNONI Massimo;1727;2N;30;TR;200466;0;101889;m -LANARO Marco;1700;2N;30;TR;100666;0;101890;m -LORENZONI Lorenzo;1700;2N;30;TR;010131;0;101891;m -MARCHEGIANI Paolo;1580;3N;30;TR;070163;0;101892;m -NICU Carlo;1578;3N;30;TR;100936;0;101893;m -PIAZZA Massimo;1539;3N;30;TR;240871;0;101896;m -VERGANI Piero;1580;3N;30;TR;280931;0;101895;m -MUZHAQI Halit;1587;3N;30;PD;280952;0;104038;m -CAMERO Vicente;1551;3N;30;VI;170859;0;101430;m -PUGLISI Fulvio;1580;3N;30;CT;290766;0;102482;m -DABIZLJEVIC Radee;1664;2N;30;EE;040362;0;113192;m -RENZETTI Guido;1529;3N;30;LT;210957;0;107281;m -SINGARELLA Amos;1572;3N;30;LT;030986;0;107285;m -BERTOCCHI Fulvio;1688;2N;30;MO;290148;0;103199;m -VALERIO Mario;1539;3N;30;MO;0;0;8061;m -MANTOVANI Marco;1570;3N;30;VE;231180;0;100838;m -DURA Gabriele;1700;2N;30;VE;130764;0;8063;m -DEMITA Giuseppe;1643;2N;30;TA;311255;0;105739;m -MILELLA Michele;1565;2N;30;TA;010968;0;105815;m -MONTORSI Alessio;1556;3N;30;TA;131159;0;105812;m -SARACINO Raffaele;1700;2N;30;TA;310876;0;107903;m -CHIARELLI Luigi;1733;2N;30;TA;170556;0;105738;m -SQUAITAMATTI Roberto;1580;3N;30;AL;231063;0;8069;m -LOSSO Agostino;1580;3N;30;BL;150160;0;105007;m -DE-ZORDI Fabio;1808;1N;30;BL;310372;0;111236;m -ZANNOL Roberto;1784;2N;30;BL;170179;0;103145;m -VALERIO Gianluca;1703;2N;30;BL;240973;0;103139;m -BISESTI Paolo;1700;2N;30;TN;150784;0;100055;m -ANTOLINI Tiberio;1596;3N;30;VR;200484;0;101000;m -FERRARI Diego;1715;2N;30;VR;200859;0;100933;m -CLAPPA Ilaria;1861;1N;0;TN;120587;816787;100053;f -CAROLI Silvio;1539;3N;30;VR;161158;0;100531;m -MATANOVIC Slavko;2091;CM;0;TN;060358;811025;100670;m -LORENZINI Luca;1724;2N;30;BO;070686;0;101631;m -NERI Giulio;1568;3N;30;BO;070477;0;100314;m -PIRACCINI Matteo;1700;2N;30;FC;181168;0;109220;m -SANTINI Mauro;1599;3N;30;BO;210562;0;101601;m -DEL-ROSARIO Raffaele;1667;2N;30;BO;120837;0;101583;m -FERNER Jurgen;1670;2N;30;BO;101063;0;101584;m -HAKIM Rossella;1558;3N;30;BO;061174;0;105468;f -RUIBA Gabriele;1589;3N;30;FE;231071;0;102233;m -BARCELLONA Antonino;1525;3N;30;TO;010270;0;104313;m -CAVADINI Sergio;1750;1N;30;EE;080348;0;108840;m -TONDO Stefano;1496;3N;30;TO;190979;0;102817;m -CARACCI Dario;1676;2N;30;CL;160386;0;101133;m -GUTTADAURIA Aldo;1700;2N;30;CL;230886;0;101129;m -DA-CAMPO Giuseppe;1487;2N;30;ME;250479;0;102672;m -ITALIANO Massimo;1628;2N;30;ME;190972;0;102666;m -ZARZACA Vincenzo;1940;1N;0;ME;250791;824739;101496;m -PICCOLO Francesco;1580;3N;30;ME;180946;0;102673;m -DE-BONI Stefano;1548;3N;30;VI;190366;0;101433;m -BIANCHINI Aurora;1781;2N;30;PE;051087;0;101790;f -DRACI Besnik;1703;2N;30;PE;290860;0;8099;m -CATALDI Benito;1700;2N;30;PA;050435;0;100423;m -PALOMBA Andrea;1477;3N;30;CR;111284;0;104233;m -RABONI Vladimiro;1541;3N;30;MI;031248;0;101003;m -ABDALATIEF Abdelhaki;1599;3N;30;MI;290868;0;101426;m -MAZZARIOL Oscar;2066;CM;0;MI;141161;813060;101009;m -BETORI Alessandro;1608;2N;30;RM;250272;0;105428;m -CAVATERRA Umberto;1728;2N;0;RM;011065;820962;102635;m -CIARLA Merio;1580;3N;30;RM;111073;0;8107;m -ZAMORA Jaime;1596;3N;30;RM;290158;0;102644;m -BANCI Riccardo;1307;2N;30;RM;260958;0;100229;m -CIOLI Riccardo;1599;3N;30;RM;160475;0;102658;m -JANCE Marin;1757;2N;30;LU;100272;0;113840;m -BURGALASSI Riccardo;1580;3N;30;LU;030270;0;103463;m -BARSANTI Nicola;1551;3N;30;LU;290177;0;103457;m -CHELI Emanuele;1548;3N;30;LU;170785;0;103497;m -RIZZA Rosario;1580;3N;30;PI;120678;0;101966;m -CAROSI Roberto;1700;2N;30;PI;241157;0;103196;m -MAFFE' Paolo;1580;3N;30;VR;151172;0;100532;m -GROSSULE Roberto;1592;2N;30;VR;190753;0;100530;m -STEVANELLA Gabriele;1580;3N;30;VR;121065;0;100534;m -BELLE' Loris;1568;3N;30;VR;050468;0;100535;m -MARCHIORO Michele;1565;3N;30;PD;300783;0;104057;m -FERRARA Aldo;1457;3N;30;IM;291164;0;102810;m -FERRI Stefano;1486;3N;30;SV;170371;0;104382;m -LAZZO Gaetano;1599;3N;30;BA;040770;0;107155;m -DI-COSIMO Rafael;1700;2N;30;AQ;141253;0;108881;m -MAIORANI Dario;1700;2N;30;AQ;180183;0;108880;m -LAVIANO Gerardo;1580;3N;30;NA;061132;0;8127;m -CIRILLO Giuseppe;1619;2N;30;NA;020565;0;100410;m -DE-LUISE Raffaele;1652;2N;30;NA;060226;0;103956;m -SCHININA' Salvatore;1505;3N;30;RG;290946;0;8130;m -SEMINARIO Gaetano;1464;3N;30;CS;280587;0;104142;m -CARUSO Giovanni;1580;3N;30;CS;130586;0;104143;m -GAGLIARDI Marco;1574;2N;30;CS;271189;0;104141;m -CAPA Mefail;1700;2N;30;TN;240665;0;102738;m -COCCIMIGLIO Bruno;1520;3N;30;TN;020883;0;101259;m -CALIARI Stefano;1563;3N;30;TN;110183;0;101258;m -FANARA Sergio;1572;3N;30;AG;200882;0;104296;m -CROCCHIOLO Daniele;1580;3N;30;TP;160384;0;107098;m -MARINO Alessandro;1763;2N;30;TP;180587;0;107102;m -MORA Alberto;1457;3N;30;MI;030556;0;104454;m -GORLA Pierluigi;1700;2N;30;VB;050357;0;100489;m -PRIMON Mauro;1712;2N;30;NO;180258;0;104456;m -PAVIA Massimo;1527;3N;30;RM;300460;0;107278;m -IANNAMORELLI Pierfed;1568;2N;30;RM;300863;0;107270;m -VANNINI Marco;1558;3N;30;RM;251158;0;102645;m -BOASSO Adriano;1580;3N;30;MI;020877;0;102527;m -DIANA Marco;1515;3N;30;MI;020842;0;100120;m -TESTA Valerio;1599;3N;30;MI;210862;0;102526;m -ARDUINI Alberto;1613;2N;30;RE;160675;0;105132;m -ROSSI-CASSANI Gianni;1616;2N;30;IM;260363;0;105086;m -ROMANI Ivano;1664;2N;30;GE;050554;0;101326;m -CUSATO Davide;1520;3N;30;GE;251171;0;104810;m -MACCHIA Nicola;1568;3N;30;BA;040972;0;107145;m -ZONNO Michele;1580;3N;30;BA;280879;0;109368;m -BARILLA' Antonio;1553;3N;30;CE;040774;0;106641;m -TARALLO Luigi;1637;2N;30;SA;180488;0;100633;m -LONGOBARDO Gennaro;1700;2N;30;SA;151151;0;106635;m -AMETRANO Giampaolo;1691;2N;30;SA;120563;0;102626;m -DE-MARCO Pietro;1709;2N;30;SA;290461;0;102627;m -MAZZOTTA Francesco;1700;2N;30;LE;200586;0;105383;m -TOLA Riccardo;1649;2N;30;BR;090982;0;106242;m -CALCAGNILE Alessandr;1548;3N;30;BR;030865;0;106227;f -CARREA Nicola;1691;2N;30;FC;280265;0;8164;m -SAVOIA Mirko;1580;3N;30;FC;071180;0;109221;m -ANDREOLI Gianni;1580;3N;30;FC;281072;0;109222;m -BERTOZZI Anna;1572;3N;30;FC;211185;0;104641;f -MAGIAR Samuel;1512;3N;30;MI;130959;0;100146;m -ENA Mario;1438;3N;30;SS;310755;0;100374;m -BARAVAGLIA Antonio;1512;3N;30;SS;140853;0;100367;m -MARCHESE Giuseppe;1553;3N;30;FI;050532;0;105327;m -IOZZI Marco;1522;3N;30;TE;231085;0;115425;m -COCCIA Marco;1568;3N;30;TE;240686;0;106701;m -TITONE Manfredi;1619;2N;30;ME;291064;0;114414;m -WALDNER Mirko;2059;CM;0;BZ;100785;813770;105572;m -COMPAGNONI Mauro;1580;3N;30;MC;110477;0;104583;m -GODANO Francesco;1688;2N;30;BO;190140;0;101615;m -MAIA Mario;1580;3N;30;FE;170471;0;105338;m -EL-ZAIJAT Ashraf;1580;3N;30;BG;010669;0;101706;m -PASTORE Alfonso;1637;2N;30;NA;061250;0;104619;m -IAZZETTA Raffele;1685;2N;30;NA;010558;0;101067;m -FERRARO Alessandro;1568;3N;30;RM;110574;0;102638;m -LETI Jacopo;1702;2N;30;RM;101081;0;105443;m -VITALI Francesco;1634;2N;30;RM;100946;0;102159;m -BELA' Stephen;1575;3N;30;LC;160768;0;106973;m -SCROCCO Pierluigi;1527;3N;30;MI;020154;0;100711;m -TESTA Sergio;1577;3N;30;MI;280562;0;107208;m -FELTRACCO Federico;1673;2N;30;TV;140284;0;103534;m -BORSATO Lucio;1574;3N;30;TV;140253;0;107795;m -CORBO Andrea;1580;3N;30;TV;120266;0;101514;m -SANNA Francesco;1580;3N;30;CA;110978;0;8191;m -CERIONI Armando;1685;2N;30;CA;301084;0;103290;m -CLERICI Giancarlo;1580;3N;30;PR;250942;0;101578;m -MUNARI Massimiliano;1634;2N;30;VR;190479;0;104923;m -CALABRESI Davide;1631;2N;30;VR;120278;0;102390;m -BELLACOSA Vitantonio;1496;2N;30;MT;060961;0;106720;m -LUCARELLI Rocco;1503;3N;30;PZ;030767;0;108009;m -TANCREDI Giuseppe;1799;CM;30;MT;270929;0;107928;m -INTRONA Pietro;1518;3N;30;CR;270451;0;108066;m -DE-ANGELIS Lorenzo;1583;2N;30;MI;281059;0;107678;m -ALBANI Alessandro;1805;1N;30;VC;180281;0;102269;m -BARACCHI Leonardo;1697;2N;30;VE;140884;0;103089;m -GESMUNDO Andrea;1517;3N;30;VE;240983;0;107518;m -CANTONI Enrico;1580;3N;30;BO;161087;0;101624;m -GASPARINETTI Simone;1580;3N;30;BO;130985;0;107921;m -CASTRO Simon;1544;2N;30;BO;050787;0;100298;m -CUCULO Jimmy;1700;2N;30;BO;080986;0;101629;m -CESARINI Leopoldo;1930;1N;0;PG;080273;822981;115858;m -GUIDUCCI Luca;1751;2N;30;AR;210462;0;108141;m -PINELLI Gabriele;1580;3N;30;MI;310761;0;107209;m -FILIPPINI Diego;1498;3N;30;MI;140186;0;103544;m -MIGLIAVACCA Maurizio;1584;3N;30;PV;230960;0;102216;m -DI-DOMENICO Fabio;1580;3N;30;TE;210173;0;103984;m -SOMMA Erminio;1505;2N;30;NA;260462;0;104608;m -BASSI Serena;1481;3N;30;BO;281182;0;101572;f -FEOLA Samuele;1580;3N;30;RM;270873;0;105440;m -PASATO Luigi;1685;2N;30;RM;301073;0;108914;m -TORASSO Celestino;1528;3N;30;TO;110455;0;104400;m -DE-ANGELI Claudio;1582;3N;30;TO;101146;0;104403;m -DEL-FAVERO Lorenzo;1700;2N;30;TO;0;0;108796;m -MANZONI Riccardo;1580;3N;30;TO;300875;0;104397;m -VITTIMBERGA Valeria;1586;2N;30;TO;100369;0;102177;f -CORDI' Giovanni;1685;2N;30;TO;220545;0;102046;m -BARBETTI Mauro;1664;2N;30;LI;310170;0;103953;m -FORGIARINI Fulvio;1679;2N;30;UD;060385;0;103695;m -PALIMENTO Paolo;1548;3N;30;CO;250167;0;103509;m -ZANINELLO Giuliano;1751;2N;30;TO;220357;0;106263;m -ROMANELLA Luigino;1685;2N;30;RM;080356;0;108820;m -CHIANURA Mimmo;1715;2N;30;RM;280947;0;108819;m -BERGAMINI Lorenzo;1676;2N;30;RM;050483;0;100231;m -SANTONI Daniele;1529;3N;30;RM;310771;0;108927;m -RAVASI Eraldo;1700;2N;30;MI;230440;0;102131;m -CANEVARI Giorgio;1553;3N;30;MI;190355;0;108870;m -GEMMA Stefano;1700;2N;30;MN;010150;0;109025;m -CHINI Silvio;1700;2N;30;TN;251151;0;100661;m -CASTAGNA Celestino;1679;2N;30;TN;221060;0;102737;m -DALLAPE' Andrea;1658;2N;30;TN;240957;0;100666;m -ROSA Flavio;1948;1N;0;TO;0;825913;111406;m -RAGNI Luigi;1682;2N;30;AP;060557;0;101391;m -SERRANO Pasquale;1427;3N;30;LT;160324;0;110362;m -SANTINI Romero;1524;3N;30;RM;050247;0;108916;m -DI-GENNARO Carlo;1539;3N;30;MI;300357;0;108778;m -RIZZO Giuseppe;1626;2N;30;VE;111255;0;113894;m -SUETTA Davide;1548;3N;30;GE;280373;0;109318;m -TROSO Alessandro;1595;2N;30;TA;220889;0;105824;m -CASALINO Giovanni;1622;2N;30;TA;140558;0;105811;m -CIMINO Marco;1478;2N;30;TA;261187;0;105821;m -COTTIGNOLI Mario;1580;3N;30;TA;220986;0;107906;m -MAZZA Fabbio;1520;2N;30;TA;280836;0;107905;m -D'ANDRIA Roberto;1563;3N;30;TA;050960;0;107904;m -CENTO Claudio;1676;2N;30;ME;141185;0;108107;m -ALIFEROPULOS Andrea;1980;1N;0;ME;191085;819492;108105;m -RUBBI Patrizio;1580;3N;30;ME;291062;0;110080;m -AMMENDOLEA Massimo;1949;1N;0;ME;030585;822108;108106;m -MILAZZO Giuseppe;1580;3N;30;ME;071154;0;105385;m -PICCOLO Sebastiano;1700;2N;30;ME;280787;0;102679;m -COLOMBO Samuel;1760;2N;30;MI;140275;0;100734;m -SPREAFICO Gianpiero;1565;3N;30;LC;240467;0;106034;m -SGUERA Cosimo;1682;2N;30;MI;280671;0;109521;m -LANDONI Luca;1565;2N;30;MI;290268;0;109520;m -BERNI Giulio;1599;3N;30;MI;120352;0;103610;m -MOLA Walter;1688;2N;30;TO;020357;0;106261;m -TAVASCI Alfio;1640;2N;30;CO;041062;0;102984;m -MONETTI Egidio;1670;2N;30;CO;0;0;102982;m -GESSAGA Roberto;1814;1N;30;CO;091149;0;102975;m -STROPPA Daniel;2223;FM;0;NN;150978;810975;113417;m -MINNITI Salvatore;1580;3N;30;CT;0;0;109632;m -INGRASSIA Giuseppe;1700;2N;30;CN;251260;0;106834;m -PATTI Demetrio;1715;2N;30;VC;270532;0;104556;m -KHARRAT Samir;1594;3N;30;CT;100287;0;107371;m -BROGNA Alessandro;1580;3N;30;CT;0;0;8273;m -VALERIO-LABBIA Giuse;1407;3N;30;CT;030589;0;107383;m -TOSCO Michele;1551;3N;30;TO;110264;0;104836;m -DE-LUCA Ercole;1580;3N;30;PA;041187;0;108402;m -DI-BELLA Maurizio;1658;2N;30;PA;190187;0;104903;m -BARBAGALLO Antonio;1565;3N;30;MI;140140;0;102506;m -PRENASSI Davide;1614;2N;30;UD;260679;0;102622;m -VOLPE Antonino;1580;3N;30;NA;0;0;8280;m -DI-MEGLIO Aurelio;1580;3N;30;NA;051277;0;108759;m -MARTINELLI Sergio;1580;3N;30;NA;261066;0;101877;m -QUARTA Rocco;1832;1N;30;LE;250689;0;101310;m -CAMILETTI Antonello;1712;2N;30;FG;171171;0;106162;m -CARNIMEO Andrea;1649;2N;30;BA;150165;0;109670;m -PESCE Eugenio;1491;3N;30;TO;131146;0;102197;m -BONACCORSI Jose';1520;3N;30;CT;081050;0;109603;m -CANNIZZARO Gregorio;1643;2N;30;CT;011251;0;109604;m -COSTA Salvatore;1538;2N;30;CT;271268;0;115056;m -PAGLIONE Giuseppe;1580;3N;30;PE;081251;0;103414;m -D'ANGELO Mircha;1580;3N;30;PE;220682;0;109804;m -MASIERO Riccardo;1658;2N;30;VE;270383;0;107519;m -BONO Ivo;1563;3N;30;CN;211156;0;109266;m -PETRITAI Perparim;1580;3N;30;CN;120961;0;109269;m -CATALDO Ettore-Massi;2008;CM;0;RM;090164;812455;112358;m -BUSETTO Giorgio;1807;1N;30;FC;051262;0;113531;m -CROSETTO Ezio;1691;2N;30;CN;271060;0;109662;m -MORDENTI Fabrizio;1688;2N;30;RA;010973;0;109709;m -SONCINI Stefano;1617;2N;30;RM;041172;0;111682;m -GIRARDINI Davide;1715;2N;30;VE;090585;0;109661;m -MANZINI Manlio;1469;3N;30;MO;200362;0;109708;m -GASPERONI Claudio;1700;2N;30;VT;280675;0;109192;m -RESO Amar;1727;2N;30;MI;060288;0;101726;m -SBERNINI Daniele;1596;3N;30;PR;120361;0;105533;m -ATTANASIO Arturo;1580;3N;30;LT;210560;0;113168;m -RICCI Angelo;1556;3N;30;FC;160763;0;111066;m -ALAGNA Sergio;1553;3N;30;SS;131148;0;101832;m -CELLI Ugo;1733;2N;30;GE;191168;0;109683;m -MARTINENGO Claudio;1558;3N;30;GE;090748;0;109678;m -UBALDI Fabio;1599;3N;30;PG;030274;0;103890;m -CURZIO Alfonso;1551;3N;30;NO;070156;0;104875;m -SCHEPISI Rosario;1652;2N;30;TP;090791;0;107096;m -CRISANTI Claudio;1640;2N;30;TP;231282;0;100227;m -PIPITONE Claudio;1646;2N;30;TP;180450;0;103044;m -RIZZUTI Bruno;1667;2N;30;CS;111170;0;109150;m -BROGNERI Giovanni;1676;2N;30;CS;260986;0;108954;m -DRAPPI Giuseppe;1580;3N;30;SA;290670;0;8317;m -TIRIPICCHIO Giuseppe;1541;2N;30;CS;280388;0;104084;m -BARONE-FERRARO Danie;1580;3N;30;LE;130467;0;109831;m -CANDIDO Leandro;1694;2N;30;LE;040385;0;109836;m -CHIGA Pierangelo;1580;3N;30;LE;200484;0;109837;m -PERRONE Marco;1580;3N;30;LE;200484;0;103940;m -ANCORA Luciano;1536;3N;30;BR;100541;0;109843;m -CASTRIGNANO' Angelo;1700;2N;30;LE;091274;0;109839;m -GALLI David;1580;3N;0;FR;280872;0;116651;m -DAL-SASSO Andrea;1599;3N;30;BL;131182;0;103148;m -GAMMARROTA Giuseppe;1580;3N;30;BA;0;0;8327;m -BRUNELLO Sabino;2391;FM;0;BG;270689;813613;105536;m -ROTA Daniele;1700;2N;30;BG;110788;0;102945;m -SICARI Giuseppe;1532;3N;30;IM;060260;0;109884;m -RONDELLI Matteo;1589;3N;30;IM;240884;0;109883;m -LIGUORI Aniello;1549;3N;30;CA;120165;0;115817;m -GASPERONI Claudio;1563;3N;30;FC;260373;0;117168;m -VAN-LOO Geoges;1727;2N;30;EE;0;0;8335;m -ROTELLINI Ernani;1810;1N;30;VT;050948;0;113617;m -NARO Luca;1580;3N;30;ME;220180;0;115620;m -MALIEPAARD Abraham;1706;2N;30;EE;0;0;8338;m -MALIEPAARD Cornelis;1536;3N;30;EE;0;0;8339;m -ROMBOUTS Bert;1870;1N;30;EE;180646;0;8341;m -STANCIU Traian;1634;2N;30;EE;280486;0;8343;m -LEUW Ed;1855;1N;30;EE;0;0;8344;m -ORFALI Marcelo-Rafae;2025;CM;0;EE;240168;813982;117084;m -SOZZI Stefano;1927;1N;0;PC;261263;820776;107530;m -MATOZZA Giuseppe;1558;3N;30;FG;080682;0;109893;m -MANTOVANI Enrico;1757;2N;30;PR;040659;0;109904;m -CECCHETTO Augusto;1700;2N;30;PD;140756;0;104052;m -LI-PEI-JUN;1688;2N;30;BO;070576;0;111026;m -ROSSI Pio;1493;3N;30;BO;040362;0;101596;m -NATALE Francesco;1493;3N;30;BO;230789;0;101632;m -JERACE Nicola;1592;3N;30;TO;160365;0;109908;m -MAGNONE Dino;1577;3N;30;SV;081230;0;109907;m -ANGELANTONI Cesidio;1607;2N;30;AQ;210372;0;107469;m -TONEI Andrea;1563;3N;30;VE;040775;0;103087;m -CHIEREGATO Carlo;1879;1N;30;VR;0;0;109993;m -VENTURINI Fausto;1504;3N;30;MI;140341;0;100684;m -ATZORI Mauro;1562;3N;30;MI;191066;0;102498;m -FIGLIOLIA Alessio;1580;3N;30;MI;160387;0;103547;m -PRIARO Maurizio;1655;2N;30;MI;200956;0;109959;m -D'ARPINO Guglielmo;1599;3N;30;RM;271081;0;109954;m -DI-DIO Fabio;1700;2N;30;RM;100876;0;110030;m -FILIPPONI Maurizio;1493;3N;30;RM;131246;0;109951;m -MAERO Adriano;1560;3N;30;TO;210764;0;105508;m -SCARDAMAGLIA Vincenz;1446;3N;30;CT;300668;0;109607;m -CHIOCCOLONI Mario;1520;3N;30;CT;030650;0;103439;m -MESSINA Paolo;1580;3N;30;CT;010475;0;113484;m -VERSARI Marino;1575;3N;30;VA;201261;0;102521;m -BERIUOLO Sergio;1580;3N;30;MI;060158;0;8371;m -DIMO Maurizio;1580;3N;30;MI;310361;0;100121;m -DEL-CARLO Luca;1462;3N;30;LU;090989;0;108843;m -CORTI Vittorio;1580;3N;30;LI;250670;0;103947;m -CALZAVARA Andrea;1599;3N;30;TV;171085;0;102581;m -PIRRONE Antonino;1454;3N;30;IS;150548;0;109899;m -PIRRONE Davide;1544;3N;30;IS;011084;0;109898;m -GRELLA Marco;1580;3N;30;CN;091074;0;105191;m -FELICI Davide;1700;2N;30;FR;250582;0;104216;m -MAGGI Luca;1584;3N;30;FR;181074;0;110106;m -PENNISI Angelo-Pietr;1800;1N;30;CT;080858;0;110079;m -CACCIOLA Alfredo;2075;CM;0;ME;211184;814938;110081;m -SERRA Pietro;1580;3N;30;CA;171286;0;109924;m -BENUSSI Alberto;1580;3N;30;TS;211061;0;107333;m -PERELLI Andrea;1700;2N;30;SP;130386;0;8385;m -COZZANI Federico;1541;3N;30;SP;160188;0;109452;m -BACCHINI Franco;1599;3N;30;SP;270340;0;105480;m -ALESSI Sergio;1625;2N;30;TP;291083;0;103042;m -MARINI Jacopo;1505;3N;30;MC;310173;0;107639;m -DALO' Mauro;1656;2N;30;BS;040367;0;102348;m -SALVOTTI James;1582;3N;30;BS;210670;0;109982;m -BRUNETTI Marco;1838;1N;30;TN;060957;0;102313;m -GITTARDI Alberto;1536;3N;30;BS;061056;0;104779;m -DI-CANZIO Alessio;1580;3N;30;TE;301075;0;105703;m -MAIELLARO Paolo;1598;2N;30;CB;250562;0;103896;m -BERTANI Gianpaolo;1667;2N;30;PR;140877;0;110248;m -ALTARIVA Marco;1658;2N;30;MO;120687;0;108036;m -LENDINI Roberto;1700;2N;30;MO;070772;0;8398;m -RABITTI Alberto;1871;1N;30;MO;100386;0;103557;m -BERTOLI Alberto;1700;2N;30;MO;240980;0;102926;m -MARAZZI Federico;1536;3N;30;MO;100264;0;100198;m -GERVASI Gino;1553;3N;30;RE;010270;0;103216;m -NENZI Laura;1706;2N;30;VE;101284;0;103094;f -ALBANO Stefano;1694;2N;30;TA;200882;0;109688;m -BONIFATI Niccolo';1582;3N;30;CS;200585;0;109276;m -COLONNA Vito;1700;2N;30;BA;230671;0;112266;m -BARNABA Vittorio;1553;3N;30;BA;130474;0;111293;m -FIORIDO Giuseppe;2064;CM;0;PN;271066;819700;102015;m -TARONDO Renzo;1409;3N;30;UD;160538;0;105962;m -FORNER Alberto;1599;3N;30;UD;130788;0;105967;m -BORDONI Claudio;1664;2N;30;VR;100862;0;100967;m -ACCOSSATO Pietro;1527;3N;30;TO;170847;0;114859;m -HUARCAYA-SEGOVIA Jor;1592;3N;30;TO;061264;0;109191;m -DE-BON Eugenio;1688;2N;30;TO;100346;0;105499;m -TAGLIAVINI Marino;1520;3N;30;TO;081143;0;105517;m -PAGANIN Alessandro;1580;3N;30;TO;040676;0;111525;m -MONATTI Patrizio;1472;3N;30;FI;050954;0;109998;m -GIANASSI Roberto;1583;2N;30;FI;131171;0;110057;m -BULI Vangjel;2276;-M;0;PT;070762;821322;110061;m -SETTA Sammy;1959;CM;30;FI;030370;0;8420;m -D'ALESSIO Pierluigi;1658;2N;30;GE;260271;0;110134;m -CRETTI Devid;1580;3N;30;BG;290585;0;105534;m -ROTA Luca;1580;3N;30;BG;290763;0;110026;m -PESENTI Gino;1580;3N;30;BG;231147;0;108053;m -SENZIANI Domenico;1580;3N;30;BG;211056;0;102941;m -ZORDAN Giovanni;1550;2N;30;MN;010562;0;101182;m -FIERRO Giovanni;1580;3N;30;PZ;010763;0;108000;m -ALFANO Giuseppe;1580;3N;30;ME;190186;0;104322;m -ZARZACA Paola;1599;3N;30;ME;220386;0;101500;f -CURTIS Michael;1546;3N;30;ME;070386;0;104327;m -FLORESTA Claudio;1553;3N;30;CT;310865;0;107356;m -FULCO Gabriele;1580;3N;30;ME;070388;0;104332;m -CALPONA Benedetto;1617;2N;30;ME;240462;0;102667;m -GUARNERI Andrea;1589;3N;30;RC;141063;0;110093;m -CICCIMARRA Vito;1580;3N;30;TO;090946;0;102820;m -OLIVIERO Pasquale;1448;3N;30;TO;160867;0;110482;m -FISSORE Pietro;1596;3N;30;TO;161242;0;100766;m -TAORMINA Alessandro;1511;2N;30;TO;240748;0;110488;m -PASCOLETTI Matteo-Pl;1580;3N;30;PG;070678;0;117140;m -CATANA Costel;2088;CM;0;TO;020664;813532;110473;m -CORRADO Claudio;1640;2N;30;TO;201171;0;110475;m -PETITTI Rocco;1582;3N;30;TO;090558;0;110484;m -KAINRADL Paolo;1700;2N;30;TS;160667;0;110074;m -CHIUMELLO Roberto;1751;2N;30;TV;180577;0;107799;m -BORSATO Laura;1610;2N;30;TV;100884;0;107970;f -ORTEGA Lexy;2435;GM;0;RM;080360;811416;104475;m -ZLOCHEVSKIJ Alexande;2469;GM;0;IM;250663;811424;101780;m -BRAGA Fernando;2455;IM;0;AO;090758;811408;114238;m -BARTOLINI Andrea;1541;3N;30;AN;270765;0;107638;m -BISESTI Daniele;1516;3N;30;TN;180787;0;100039;m -GOIO Alessandro;1715;2N;30;TN;080642;0;110613;m -MARTINGANO Giuseppe;1555;3N;30;SA;051153;0;102702;m -RAPICAVOLI Francesco;1511;3N;30;CT;190569;0;105788;m -IUVARA Dario;1599;3N;30;CT;050468;0;109609;m -LO-PRETE Marco;1625;2N;30;FG;310784;0;106157;m -MAIELLO Raffaele;1691;2N;30;FG;300356;0;106169;m -PITARRESI Vincenzo;1568;2N;30;TP;220146;0;103051;m -MARCHIONNA Antonio;1596;3N;30;AQ;090557;0;103408;m -DEPLANO Stefano;1596;3N;30;TO;271069;0;111760;m -LABORANTI Guido;1575;3N;30;TO;231254;0;111202;m -MACCHIA Massimiliano;1580;3N;30;PG;290566;0;103887;m -DI-MAMBRO Danilo;1694;2N;30;RM;250270;0;111685;m -GALLO-MODENA Paolo;1664;2N;30;TO;190574;0;110151;m -KRSTAN Carlo;1661;2N;30;IM;171274;0;105087;m -SPIRITO Luca;1433;2N;30;SV;191172;0;104381;m -ROSSO Pierandrea;1675;2N;0;GE;040651;820750;110390;m -DAL-PONT Simone;1580;3N;30;MI;180776;0;110167;m -KHALIL Aladino;1580;3N;30;MI;060277;0;110246;m -ORNAGHI Giovanni;1541;3N;30;BG;300987;0;101696;m -SANTAGOSTINI Bruno;1580;3N;30;MI;070869;0;110452;m -BOSI Alessandro;1593;3N;30;LC;180869;0;108245;m -MONTRASI Paolo;1520;3N;30;MI;220370;0;100074;m -MIKIC Cedomir;1631;2N;30;EE;0;0;110833;m -DE-PASQUALE Giuseppe;1900;1N;30;PR;061066;0;8478;m -TORELLI Mauro;1637;2N;30;MI;150148;0;100112;m -PELLEGRINI Domenico;1646;2N;30;VR;130789;0;100982;m -SEMPREBONI Mattia;1503;3N;30;VR;241289;0;100989;m -SPECIALE Francesco;1751;2N;30;TP;191088;0;107103;m -GENTILE Vito;1553;2N;30;TP;100389;0;107095;m -CRAPAROTTA Giovanni;1649;2N;30;TP;070489;0;107109;m -GUCCIONE Pietro;1619;2N;30;BA;300571;0;104369;m -PARTIPILO Vito;1511;2N;30;BA;140865;0;107151;m -ZACCHIA Paolo;1599;3N;30;BA;171285;0;104377;m -FOSCHI Carlo-A.;1580;3N;30;GR;170141;0;110633;m -DE-LOGU Marco;1541;3N;30;GR;010365;0;110632;m -BORSATO Federico;1802;1N;30;TV;070388;0;112491;m -DE-FABRITIIS Alessio;1493;3N;30;PE;270290;0;101796;m -DI-MIZIO Matteo;1580;3N;30;PE;290585;0;101803;m -LABRICCIOSA Laura;1682;2N;30;PE;050885;0;106890;f -LUCCI Federico;1548;3N;30;PE;010990;0;101805;m -RAGONE Aniello;1580;3N;30;SA;170588;0;111384;m -GALISE Giulio;1580;3N;30;SA;260284;0;100629;m -NAPOLETANO Marco;1700;2N;30;PE;060883;0;101785;m -COLICCHIO Gaetanino;1503;3N;30;PE;291138;0;101770;m -DI-GIANDOMENICO Ales;1575;3N;30;PE;100965;0;101781;m -POPOVICH Fabio;1718;2N;30;CR;111286;0;104258;m -CAVALLI Matteo;1700;2N;30;CR;300485;0;108067;m -VARINI Simone;1718;2N;30;CR;150277;;112251;m -VALENTI Vita;1580;3N;30;TP;070759;0;107125;m -ALTIERI Danilo M;1980;CM;0;NA;210980;818089;108765;m -RICCARDI Alessandro;1661;2N;30;NA;250177;0;104611;m -SCAVONE Nicolo';1512;3N;30;NA;250832;0;108768;m -ALTIERI Antonio;1756;1N;30;NA;030151;0;110981;m -INSALATA Ferdinando;1724;2N;30;SA;300889;0;107019;m -FACENDA Marcello;1580;3N;30;SA;010982;0;107008;m -CACCIOTTOLO Gerardo;1580;3N;30;SA;120185;0;107015;m -GLIELMI Damiano;1539;3N;30;SA;120287;0;107016;m -SIRENA Gianni;1638;2N;30;BR;051184;0;109351;m -RACCA Rodolfo;1436;3N;30;TO;020559;0;104839;m -CIMBARO Stefano;1679;2N;30;UD;110289;0;105987;m -ALBANO Antonio;1477;3N;30;TA;291056;0;109815;m -GAROFALO Raffaele;1387;3N;30;BA;020455;0;109816;m -FALBO Salvatore;1478;3N;30;CS;010191;0;109456;m -GALLINA Francesco;1634;2N;30;CS;031288;0;108949;m -PROMENZIO Michele;1700;2N;30;CS;020887;0;104088;m -BARAZZA Remo;1551;3N;30;VR;0;0;110712;m -GIACOMINI Massimilia;1565;3N;30;BS;050275;0;109939;m -SCHARRER Isabel;1595;2N;30;BZ;010290;0;105571;f -MANGANELLO Paolo;1488;3N;30;CT;090888;0;107428;m -ALINOVI Umberto;1658;2N;30;PR;311058;0;108178;m -OGGERO Alberto;1530;3N;30;TO;100168;0;111204;m -DE-CONCILIO Nicola;1580;3N;30;TO;260654;0;111758;m -BELLANI Alessandro;2081;CM;0;PC;011179;822566;111269;m -TAMELLINI Stefano;1739;2N;30;PC;280168;0;102376;m -BARBERI Gaetano;1551;3N;30;ME;060487;0;104325;m -MAZZU' Alice;1524;3N;30;ME;020488;0;104335;f -RUGGIRELLO Stefano;1643;2N;30;PA;260949;0;110565;m -PALAZZOLO Marcello;1700;2N;30;PA;020386;0;8532;m -BACCI Anastasia;1445;3N;30;BO;230788;0;101619;f -DI-BARTOLOMEO Aldo;1580;3N;30;BO;171060;0;8534;m -DI-DONATO Gabriele;1558;3N;30;TE;181275;0;100308;m -PULDA Giorgio;1924;1N;30;BO;311247;0;111039;m -MONTIBELLI Alberto;1712;2N;30;NO;210672;0;110463;m -BURAGLIA Claudio;1568;3N;30;BI;0;0;8538;m -FASCIANA Angelo;1592;2N;30;CL;090741;0;101449;m -BARCARO Luca;1575;3N;30;PE;100287;0;102598;m -BIN Zeno;1676;2N;30;PD;121045;0;103222;m -GORZA Andrea;1700;2N;30;PD;141272;0;110157;m -MOCELLIN Gianfranco;1778;1N;30;PD;160252;0;103227;m -DIONE Flavio;1694;2N;30;PD;301066;0;103224;m -FIDUCIOSO Marco;1892;1N;30;TP;190293;0;107094;m -TONINI Fabio;1700;2N;30;LU;110783;0;103486;m -CARNEMOLLA Giampaolo;1659;2N;30;SR;280761;0;111970;m -CORALLO Salvatore;1649;2N;30;RG;150853;0;111781;m -DIAMANTI Mauro;1580;3N;30;SO;150263;0;8549;m -MOSTAFA Rabie;1580;3N;30;MI;040968;0;8550;m -PICCOLO Giuseppe;1539;3N;30;RM;250258;0;105445;m -IANNUZZI-FOTI Robert;1625;2N;30;RM;020173;0;110952;m -CAPRIOLI Fabrizio;1570;3N;30;RM;210981;0;109955;m -ARCOVIO Daniele;1460;3N;30;CS;060488;0;104082;m -BENNARDO Lorena;1580;3N;30;CS;150188;0;104083;f -PARROTTA Francesco;1577;3N;30;CS;020186;0;111958;m -RIPEPI Roberta;1700;2N;30;CS;180488;0;109172;f -SCORZA Gennaro;1556;2N;30;CS;211287;0;104085;m -MILELLA Giusy;1580;3N;30;BA;280484;0;111309;f -COLONNA Andrea;1599;3N;30;BA;260681;0;111296;m -BOSCHESI Giovanni;1535;3N;30;MO;081057;0;105109;m -BERTAZZONI Giuseppe;1933;1N;30;RE;241152;0;110929;m -COLFERAI Maurizio;1541;3N;30;VA;011275;0;101379;m -BRACAGLIA Marco;1697;2N;30;RM;170757;0;102144;m -CAPUTI Pietro;1556;2N;30;RM;250539;0;102145;m -MISCHIS Corrado;1539;3N;30;UD;190548;0;105936;m -WILLIS Daniel;1691;2N;30;UD;070171;0;110809;m -MARMORALE Giovanni;1553;3N;30;UD;290464;0;105944;m -ZANTEDESCHI Edoardo;1553;3N;30;VR;210687;0;100977;m -NOBERASCO Mario;1700;2N;30;SV;100167;0;109414;m -TRINCAS Andrea;1580;3N;30;CA;090385;0;103860;m -SORCINELLI Andrea;1664;2N;30;CA;270872;0;110553;m -GIUSFREDI Marco;1580;3N;30;PT;200769;0;110972;m -NARDECCHIA Marco;1599;3N;30;RM;190183;0;107230;m -CERVATO Marco;1580;3N;30;LT;020387;0;113175;m -FRATTARELLI Italo;1580;3N;30;LT;020172;0;100823;m -IOTTI Claudio;1524;3N;30;RM;040953;0;113170;m -SAMPIETRO Stefano;1700;2N;30;CO;200273;0;110815;m -PIGNANELLI Antonio;1580;3N;30;MI;200960;0;100128;m -BERTUOLO Sergio;1511;3N;30;MI;060158;0;101639;m -GARINO Marco;1517;3N;30;BI;091164;0;102047;m -FOGATO Massimo;1607;2N;30;BI;010860;0;110491;m -ROSSI Pierluigi;1580;3N;30;BI;180944;0;110493;m -MUCCINI Maurizio;1454;2N;30;RN;310558;0;110916;m -TORRACO Simone;1580;3N;30;MT;011187;0;107932;m -FORTUNATO Francesco;1529;3N;30;MT;221158;0;106717;m -BIANCO Giuseppe;1535;3N;30;NA;221074;0;105628;m -TRIPAGLIA Demo;1604;2N;30;IM;250515;0;109887;m -SANNA Massimo;1778;1N;30;IM;240589;0;108835;m -GIAFFAGLIONE Veronic;1488;3N;30;CT;151087;0;110570;f -RAIMONDO Luca;1488;3N;30;CT;261288;0;107390;m -SCUDERI Alfio;1580;3N;30;CT;110428;0;8592;m -QUATTROCCHI Andrea;1532;3N;30;CT;100773;0;100458;m -SCATIZZI Paolo;1700;2N;30;SP;241061;0;101340;m -GIUSTINI Roberto;1640;2N;30;GE;070935;0;101026;m -LENZA Augusto;1580;3N;30;SA;030455;0;102628;m -BUONERBA Antonio;1580;3N;30;MT;180779;0;110899;m -TRONCONE Gianfranco;1580;3N;30;SA;030958;0;102633;m -AMETRANO Raffaele;1580;3N;30;SA;281085;0;111662;m -LIQUORI Alfonso;1580;3N;30;SA;050862;0;8600;m -CONCORDIA Ettore;1526;2N;30;CH;230338;0;110174;m -MARCONI Mauro;1682;2N;30;MC;270173;0;111100;m -PEZZICA Giuseppe;1984;1N;30;MS;120360;0;112118;m -DI-MICHELE Eugenio;1494;3N;30;PE;100967;0;110191;m -DI-BERARDINO Ernesto;1496;3N;30;PE;301256;0;102586;m -ARDUINI Lindo;1517;3N;30;PE;150860;0;102595;m -COVRE Enrico;1568;2N;30;SS;111234;0;111776;m -BIANCHI Simone;1580;3N;30;MI;220786;0;106925;m -FONTEBASSO Gianmaria;1700;2N;30;TV;250651;0;111620;m -PANEGHEL Mauro;1709;2N;30;TV;230560;0;106461;m -REGINATO Mauro;1823;1N;0;TV;201285;819921;103393;m -MASON Andrea;1568;3N;30;VE;010674;0;111598;m -FRIZZARIN Andrea;1580;3N;30;VE;180966;0;109988;m -AGOSTINO Alessandro;1601;2N;30;UD;301061;0;108838;m -SAMBO Pietro;1661;2N;30;GO;090736;0;102864;m -STEL Gerard;1870;1N;30;UD;021158;0;105902;m -GIULIANI Andrea;1580;3N;30;BG;090587;0;108042;m -TOFFANETTI Paolo;1546;3N;30;BG;210384;0;109790;m -BARONI Simone;1580;3N;30;BG;040879;0;108050;m -SETZU Fausto;1700;2N;30;OR;090753;0;111917;m -ATZORI Luca;1496;3N;30;OR;230870;0;8621;m -SALONINI Roberto;1655;2N;30;RM;080840;0;111996;m -GENTILI Tiberio;1700;2N;30;RM;240190;0;104280;m -DE-RITIS Andrea;1568;3N;30;RM;150761;0;110370;m -MAFFEO Roberto;1587;3N;30;RM;270468;0;112094;m -SPAGNA Salvatore;1541;3N;30;EN;071170;0;109638;m -ORMANDO Nicola;1580;3N;30;SA;231274;0;112171;m -BIANCO Esposito Anto;1560;3N;30;NA;301057;0;101074;m -INTINI Francesco;1700;2N;30;TA;060769;0;110524;m -TAFUTO Luigi;1580;3N;30;TA;180864;0;112271;m -BEISANS Luca;1486;3N;30;LE;150492;0;111927;m -PATI Antonio;1649;2N;30;LE;291268;0;111989;m -GUERCIA-SAMMARCO Eli;1808;1N;30;LE;240161;0;111526;m -SABETTA Alessandro;2019;CM;0;AQ;081076;821799;110173;m -ANTONETTI Mattia;1712;2N;30;FC;060677;0;111057;m -DELAITI Gianfranco;1700;2N;30;FE;261271;0;110790;m -GUARESCHI Giorgio;1676;2N;30;PR;090688;0;108179;m -PANIZZI Giuseppe;2122;CM;0;RE;0;814946;101175;m -MAGLIA Matteo;1700;2N;30;RM;070251;0;100247;m -CALZOLARI Giuseppe;1700;2N;30;RM;230920;0;112205;m -PELLEGRINI Claudio;1580;3N;30;RM;230551;0;100251;m -GUGLIELMINO Giorgio;1580;3N;30;AO;061142;0;110974;m -COSIO Paolo;1671;2N;30;PV;140384;0;106845;m -RUGGERI Igor;1366;3N;30;MI;020263;0;106847;m -SANNA Marcello;1580;3N;30;CA;150861;0;103850;m -COGOTTI Pierpaolo;1580;3N;30;CA;310765;0;110550;m -ANNARELLI Alessandro;1580;3N;30;LT;190690;0;104950;m -CONTARINO Salvatore;1580;3N;30;CT;300364;0;109606;m -ZINGALE Antonio;1520;3N;30;CT;211069;0;110589;m -POCCHI Giuseppe;1685;2N;30;SR;020273;0;110569;m -GASPARRONI Roberto;1551;3N;30;AP;110354;0;105589;m -FORANI Sandro;1515;3N;30;AP;200451;0;111747;m -SAVORETTI Luciano;1855;1N;30;MC;151151;0;105713;m -VITTIGLIO Luigi;1712;2N;30;PZ;281149;0;107998;m -MOROSI Ugo Maria;1700;2N;30;MI;191262;0;102130;m -CISLAGHI Luca;1556;3N;30;BG;030262;0;111701;m -ANCORA Ivano;1599;3N;30;TO;070456;0;112595;m -MATTA Domenico;1580;3N;30;TO;260253;0;113416;m -MAMMOLITI Oscar;1580;3N;30;AO;270876;0;111203;m -CANCIANI Gianpiero;1700;2N;30;TO;040860;0;111195;m -CLERICUZIO Marco;1503;3N;30;TO;270261;0;111197;m -CANCIAN Loris;1580;3N;30;PN;030866;0;110282;m -MENEGON Daniele;1580;3N;30;PN;061077;0;110289;m -ANTONINI Luigi;2036;CM;0;PN;051061;815306;102020;m -PERRICONE Michele;1606;2N;30;PN;200551;0;102028;m -MARONE Virgilio;1736;2N;30;NA;130258;0;105620;m -CELENTANO Enrico;1580;3N;30;NA;290148;0;105617;m -NAGNI Tiziano;1664;2N;30;BS;061172;0;107698;m -FAVALLI Renato;1706;2N;30;BS;100171;0;101911;m -GUIZZO Franco;1463;3N;30;BS;250457;0;106928;m -BOTTEGA Antonio;1967;1N;0;CB;050570;824461;112901;m -DE-GAETANO Luca;1616;2N;30;CB;150287;0;111751;m -PEDROTTI Roberto;1535;2N;30;TN;231065;0;100660;m -UCCIA Domenico;1536;3N;30;TN;220757;0;108671;m -MAZZA Maurizio;1700;2N;30;RM;311057;0;108926;m -ALFIERI Duccio;1670;2N;30;RM;170645;0;112356;m -PAVONCELLI Paolo;1893;1N;0;RM;170468;814253;112364;m -VALERII Danilo;1572;3N;30;RM;220968;0;112367;m -AGUS Giuseppe;1536;3N;30;NA;120675;0;105616;m -SANSOLONE Francesco;1536;3N;30;NA;130662;0;8680;m -LOMBARDI Donato;1700;2N;30;NA;301073;0;107597;m -PAPPALARDO Salvatore;1580;3N;30;CT;110159;0;109434;m -CAVALLARO Orazio;1580;3N;30;CT;291154;0;112628;m -FRESTA Salvatore;1560;3N;30;CT;120367;0;8684;m -ANASTASI Salvatore;1703;2N;30;ME;270459;0;110092;m -MAZZUCCO Marco;1622;2N;30;MI;061176;0;110278;m -GAROFALO Giorgio;1580;3N;30;MI;141075;0;104409;m -GHEZZI Massimo;1577;3N;30;MI;250660;0;110797;m -SATARIANO Antonino;1582;3N;30;PV;050563;0;110846;m -LA-LOGGIA Emanuele;1575;3N;30;MI;170474;0;110801;m -CARUSO Stefano;1652;2N;30;MI;0;0;107770;m -VENTURI Andrea;1596;3N;30;MI;150865;0;111713;m -SPITILLI Alessandro;1572;3N;30;TE;061178;0;111245;m -BALACCO Giovanni;1637;2N;30;BA;020965;0;111291;m -BONAFEDE Giorgio;1664;2N;30;PE;110969;0;109740;m -DI-GIULIO Dario;1802;1N;30;PE;011077;0;112515;m -DI-SABATINO Stefano;1551;3N;30;TE;241275;0;103990;m -ROSELLI Devid;1580;3N;30;AQ;050777;0;112143;m -CHIARELLI Roberto;1508;3N;30;TA;090989;0;104631;m -GRASSI Giacomo;1580;3N;30;TA;061284;0;112999;m -PASCULLI Giovanni;1580;3N;30;TA;231057;0;113001;m -MISEFARI Antonio;1580;3N;30;BO;241174;0;112790;m -SPECIA Vincenzo;1580;3N;30;TV;220542;0;107556;m -ZARA Adriano;1580;3N;30;TV;130942;0;107557;m -PIZZAIA Armando;1580;3N;30;TV;100550;0;107555;m -PFITSCHER Stefan;1580;3N;30;BZ;071261;0;8707;m -REDZEPI Dzeljalj;1580;3N;30;LI;200564;0;113377;m -FASANELLI Francesco;1580;3N;30;MN;290180;0;112424;m -FERTONANI Lorenzo;1631;2N;30;MN;081189;0;111738;m -RODELLA Tommaso;1652;2N;30;MN;080188;0;110446;m -SCHIAVETTI Gabriele;1580;3N;30;MN;250363;0;110447;m -TOSCHI Giacomo;1634;2N;30;MN;101155;0;112425;m -VALENTI Riccardo;1610;2N;30;MN;060986;0;112439;m -OLLARI Luca;1580;3N;30;PR;020273;0;110250;m -ZANNI Marco;1703;2N;30;VB;121064;0;110373;m -PANIGA Danilo;1815;1N;30;SO;220170;0;107485;m -COSTAMAGNA Cristiano;1580;3N;30;CN;160769;0;111975;m -BREUSA Renzo;1632;2N;30;CN;130451;0;113210;m -BERTOLETTI Sara;1580;3N;30;BG;060884;0;105535;f -VALMONTE Norman;1769;2N;30;MI;090169;0;112420;m -BANOS Carlito;1727;2N;30;MI;240864;0;100149;m -ANDREOTTI Andrea;1703;2N;30;VB;040166;0;108156;m -QUERCI Franco;1570;3N;30;PT;271146;0;110647;m -FALCO Giulio;1700;2N;30;MI;150358;0;8725;m -IEMMA Riccardo;1580;3N;30;RM;070890;0;110958;m -KOFLER Hannes;1700;2N;30;BZ;120590;0;109548;m -MARAZZI Francesco;1575;3N;30;MO;031090;0;100184;m -PALMIERI Ilario;1580;3N;30;CE;100589;0;112170;m -REDAELLI Lorenzo;1580;2N;30;MI;170789;0;102494;m -RISICATO Alfredo;1486;3N;30;CT;000090;0;109613;m -SAGLIETTI Paolo;1522;3N;30;CN;000090;0;107660;m -SOMVI Julian;1676;2N;30;BZ;110589;0;101961;m -PAGAN Andrea;1796;2N;30;VE;120386;0;106664;m -PICCOLOTTO Giovanni;1727;2N;30;TV;241086;0;103391;m -BENZONI Alberto;1757;2N;30;MI;180765;0;113517;m -FRAGASSI Alessandro;1598;2N;30;RM;101185;0;110357;m -D'ASTE Federico;1451;2N;30;MI;310161;0;102998;m -BLAMPIN Cedric;1577;3N;30;EE;0;0;8739;m -BRUNED Vianney;1524;3N;30;EE;301191;0;8740;m -CONTE Roberto;1727;2N;30;TE;060757;0;106151;m -GIANFERRARI Francesc;1599;3N;30;AP;150472;0;106364;m -ALLEY Shaun;1706;2N;30;EE;0;0;8743;f -ANTONINI Danilo;1599;3N;30;PG;270769;0;106373;m -PANADA Valter;1826;1N;30;BS;220257;0;113631;m -RINAUDO Umberto;1577;3N;30;MC;050445;0;113621;m -TRENT Stewart;1897;1N;30;EE;0;0;8747;m -GOODWIN Lydia;1876;1N;30;EE;0;0;8748;f -GISMONDI Mario;1769;2N;30;MC;061167;0;111437;m -RICCI Stefano;1497;NC;30;AN;050263;0;112260;m -TRENT Alan;1554;3N;30;EE;0;0;8751;m -CIBELLI Edoardo;1533;3N;30;NA;050775;0;111261;m -DI-GIORGIO Paolo;1713;2N;30;BA;110287;0;107000;m -SALVEMINI Ermanno;1599;3N;30;BA;300764;0;113581;m -RACCARO Andrea;1792;2N;30;UD;141268;0;105939;m -MINATI Donato;1730;2N;30;VE;060574;0;106348;m -BLAGOJEVIC Sinisa;1700;2N;30;BS;300465;0;102346;m -SIMIONI Loris;1655;2N;30;TN;240970;0;110614;m -CARPIGNANO Marino;1580;3N;30;UD;181065;0;105947;m -SEMPREBON Gerardo;1572;3N;30;VR;100189;0;100981;m -ZANTEDESCHI Giuditta;1664;2N;30;VR;210687;0;100978;f -PREVIERO Andrea;1700;2N;30;VR;120288;0;100980;m -PELLEGRINI Giandomen;1667;2N;30;VR;160452;0;100962;m -CORBIA Giovanni;1563;3N;30;SS;090864;0;120700;m -MANCINI Agostino;1661;2N;30;CA;260426;0;112067;m -ARDIZZONE Luigi;1487;3N;30;PA;130743;0;121746;m -BRAVO Marco;1599;3N;30;TO;041071;0;109300;m -FRIGATO Damiano;1599;3N;30;TO;210770;0;112597;m -PENNA Venanzio;1655;2N;30;MI;290654;0;110417;m -TAVOLO Riccardo;1622;2N;30;MI;211190;0;111090;m -BERTI Francesco;1577;2N;30;MI;010990;0;106846;m -MANCINO Roberta;1610;2N;30;RM;291172;0;102641;f -BORSATO Chiara;1553;2N;30;TV;141187;0;107971;f -BORSATO Stefano;1580;3N;30;TV;130688;0;107969;m -BINETTI Domenico;1599;3N;30;FG;140662;0;113422;m -DECATALDO Pasquale;1529;3N;30;TA;240435;0;113423;m -FERRI Marco;1544;3N;30;LE;311069;0;113424;m -SENSOLI Giovanni;1580;3N;30;UD;020658;0;112340;m -DE-LUCA Luca;1700;2N;30;UD;270770;0;112335;m -AZZOLA Armando;1700;2N;30;UD;260770;0;112333;m -FANTINO Fabio;1700;2N;30;UD;050565;0;111512;m -DE-SABBATA Enea;1607;2N;30;UD;160345;0;105932;m -MARCELLO Andrea;1649;2N;30;UD;040457;0;103731;m -BIANCARELLI Renato;1568;3N;30;PG;240359;0;109705;m -CARGINI Fabio;1515;3N;30;TE;101172;0;113409;m -BUZZANCA Fabio;1580;3N;30;ME;091087;0;115974;m -GUMINA Dario;1737;2N;30;ME;090487;0;112626;m -PAPA Salvatore;1580;3N;30;ME;010987;0;8790;m -SIRAGUSA Salvatore;1580;3N;30;TP;150980;0;111919;m -MANGERINI Giuseppe;1580;3N;30;TP;011265;0;110581;m -BALLATORE Francesco;1515;3N;30;CH;091185;0;112305;m -MALANDRA Filippo;1529;3N;30;CH;180686;0;112306;m -PERRONE Marco;1541;3N;30;BO;301288;0;101634;m -DELLA-CHIARA Eugenio;1562;3N;30;PU;291290;0;108216;m -MARTORANA Pierluca;1691;2N;30;PA;221174;0;114970;m -PAGLINO Giuseppe;1582;3N;30;TP;061034;0;113544;m -NIRENSTEIN Beniamino;1580;3N;30;RM;130282;0;113391;m -MESSINA Rosario;1580;3N;30;TP;041248;0;105775;m -BECERRA Alfredo;1496;3N;30;PA;120589;0;113240;m -PERRONE Manuel;1679;2N;30;GE;210469;0;109680;m -CASTRUCCI Giorgio;1795;1N;30;SP;020159;0;113568;m -VENEZIANI Ugo;1628;2N;30;AN;060462;0;112261;m -VENEZIANI Luca;1700;2N;30;AN;231264;0;112254;m -ESPOSTO Cristiano;1700;2N;30;AN;240873;0;112256;m -LOMBARDI Lucio;1700;2N;30;AN;220952;0;112257;m -PEANO Antonio;1580;3N;30;SS;230856;0;113552;m -DE-BARBERIS Francesc;1580;3N;30;TO;070188;0;113554;f -MCGARY R.Shane;1777;1N;30;SS;260667;0;113553;m -ROCCHI Mauro;1599;3N;30;UD;191284;0;101447;m -DIMALTA Savino;1580;3N;30;FG;280173;0;8813;m -SANNOLLA Alessandro;1580;3N;30;BA;210376;0;109822;m -UTANO Emanuele;1544;3N;30;TA;011288;0;110533;m -FERRETTI Francesco;1568;3N;30;BA;140577;0;104371;m -GAMBARROTA Ruggiero;1580;3N;30;BA;270586;0;112458;m -GIANFRATE Aldo;1580;3N;30;BA;180566;0;109817;m -SPONSALE Gabriele;1700;2N;30;TA;300665;0;109823;m -CUSUMANO Eugenio;1599;3N;30;ME;300585;0;109656;m -TUDISCO Giuseppe;1580;3N;30;CT;100677;0;113651;m -CANTONE Deneb;1580;3N;30;CT;220983;0;117099;m -FICUCCIO Dante;1577;3N;30;CT;120563;0;117103;m -MARINO' Giuseppe;1415;3N;30;TV;261067;0;113016;m -TORRIANI Piergiorgio;1685;2N;30;CR;290858;0;101281;m -GAETA Antonio-Angelo;1571;2N;30;LO;281063;0;104228;m -PAGLIARI Franco;1534;3N;30;CR;200264;0;101289;m -ZAPPACOSTA Gianluca;1551;3N;30;CH;070375;0;112903;m -RICCI Michele;1572;3N;30;IS;180986;0;110136;m -FASSI Filippo;1632;2N;30;IM;280772;0;114568;m -LEONE Silvio;1561;3N;30;SV;031175;0;108825;m -DIETMAR Seitz;1891;1N;30;EE;0;0;8832;m -BERTAGLIA Luca;2031;CM;0;VE;020367;815578;107522;m -TROST Michel;1706;2N;30;EE;0;0;8834;m -BOHM Jan;1599;3N;30;EE;0;0;8835;m -BOHM Tomas;1792;2N;30;EE;0;0;8836;m -HAZARABEDIAN Guy;1540;3N;30;EE;0;0;8837;m -JAKUS Lubomir;1596;2N;30;EE;0;0;8838;m -ONDRICH Jan;1653;2N;30;EE;0;0;8839;m -SOUKUPOVA Teresa;1626;2N;30;EE;0;0;8840;f -TODOR Cornel;1553;3N;30;EE;0;0;8841;m -VRANOVA Jarmila;1640;2N;30;EE;0;0;8842;m -CHAINAY Gerard;1548;3N;30;EE;0;0;8843;m -MONGELLI Ferdinando;1650;2N;30;IM;310860;0;123210;m -PFORR Michael;1599;3N;30;EE;0;0;8845;m -MALIEPAARD Kees;1580;3N;30;EE;0;0;8846;m -MACRI' Giuseppe;1311;NC;30;RM;220941;0;117828;m -SCOTTI Umberto;1580;3N;30;LE;090563;0;113648;m -BERTOLAZZI Andrea;1589;3N;30;BO;0;0;101621;m -RICCHI Luca;1950;1N;0;MO;000090;824640;106213;m -LEONI Giacomo;1580;3N;30;PD;051084;0;110683;m -CRETELLA Andrea;1568;3N;30;PE;150670;0;108483;m -ROSSANO Marco;1580;3N;30;PE;150357;0;103415;m -CASTIGLIEGO Marco;1518;3N;30;SS;130567;0;120703;m -SINI Barbara;1546;3N;30;SS;190384;0;109291;f -DE-GAETANO Flavio;1580;3N;30;RM;140676;0;8856;m -SANTAMBROGIO Claudio;1580;3N;30;MI;091254;0;101648;m -MANTICA Massimo;1580;3N;30;MI;310170;0;107026;m -MADONNA Roberto;1580;3N;30;MI;281187;0;107064;m -LANZETTA Alberto;1558;3N;30;VE;211074;0;106351;m -VAROTTO Adriano;1498;3N;30;PD;060351;0;106794;m -BADALOTTI Dario;1568;2N;30;MN;290488;0;111737;m -PETROVIC Dragan;1599;3N;30;VI;020771;0;112648;m -CIORLI Andrea;1580;3N;30;LU;121070;0;112481;m -GIUNTOLI Stefano;1733;2N;30;LU;211162;0;107754;m -NOCITA Umberto;1580;3N;30;CT;050686;0;8866;m -VILLA Luca;1700;2N;30;MI;030973;0;109878;m -PALLADINI Massimilia;1640;2N;30;MI;240671;0;112410;m -BERETTA Giovanni;1532;3N;30;BG;160168;0;102928;m -MOSCA Enrico;1760;2N;30;FE;270490;0;100815;m -LUNGHI Alessandro;1580;3N;30;PV;070472;0;106844;m -VITELLO Diego;1652;2N;30;MI;020951;0;111714;m -DEL-NOCE Francesco;1520;3N;30;GE;240931;0;110020;m -BONANDINI Vittorio;1580;3N;30;TO;091079;0;112451;m -COLONNELLO Paolo;1700;2N;30;BO;100667;0;101580;m -MARONI Luca;1745;2N;30;VA;140974;0;101372;m -TEMPORIN Alberto;1847;1N;30;RO;020967;0;111226;m -FRANZ Paolo;1500;3N;30;PD;130351;0;106793;m -FERRARI Carlino;1676;2N;30;RO;050246;0;106703;m -SIDDI Daniele;1580;3N;30;CA;230180;0;112624;m -WOLF Hermann;1867;1N;30;EE;0;0;8881;m -SAMARIAN Cornel;1825;1N;0;EE;0;824674;8883;m -TOSI Valerio;1594;3N;30;EE;0;0;8884;m -GUADALUPI Roberto;1652;2N;30;TA;260287;0;113224;m -SOLITO Alessandro;1691;2N;30;BA;201264;0;113842;m -MASELLI Michele;1575;3N;30;BA;020383;0;115503;m -SPAGNUOLO Alessandro;1568;3N;30;BA;200387;0;111312;m -DI-MAGGIO Giovanni;1512;3N;30;CB;040785;0;113601;m -GALUPPO Francesco;1532;3N;30;CB;0;0;111143;m -FORZIN Gianluca;1565;3N;30;VE;030271;0;111801;m -CALABRO' Sivestro;1700;2N;30;TO;121265;0;100141;m -GIAMBAVICCHIO Nicola;1517;3N;30;TO;060540;0;112452;m -BADOLATO Marco;1568;3N;30;PA;180565;0;114971;m -GRECO-LUCCHINO Marco;1520;3N;30;PA;160388;0;104907;m -ESPOSITO Andrea;1575;3N;30;RM;231176;0;112509;m -MUSI Antonio;1590;3N;30;RM;251064;0;107680;m -VETROMILE Roberto;1580;3N;30;NA;170775;0;108047;m -CAIAZZA Antonio;1742;2N;30;NA;040588;0;109465;m -FESTA Nicola;1700;2N;30;NA;250268;0;107075;m -FUSCO Ferdinando;1582;3N;30;NA;190761;0;111806;m -DE-CARLO Fabio;1864;1N;30;NA;240279;0;111262;m -DONZELLA Emanuele;1538;2N;30;NA;210774;0;112533;m -DE-FAZIO Giovanni;1673;2N;30;NA;060565;0;110397;m -MURLI Paolo;1536;3N;30;NA;110862;0;111242;m -BOCCARDO Romano;1558;3N;30;GE;170129;0;111408;m -PACHERA Efrem;1551;3N;30;VR;200255;0;114510;m -DIANA Carlo;1551;3N;30;CA;200159;0;110792;m -TONINI Andrea;1700;2N;30;FE;081287;0;100738;m -SECCHI Andrea;1580;3N;30;MO;061284;0;109122;m -PROSSIMO Salvatore;1416;3N;30;CT;211088;0;107421;m -BABIC Vladimir;1620;2N;30;MI;081251;0;109914;m -CERU Alessio;1582;3N;30;MI;061169;0;113403;m -CITERIO Fabio;1750;2N;30;BG;151248;0;108773;m -ONGARO Cristian;1580;3N;30;BG;050173;0;113721;m -GIACHE' Gianluca;1862;1N;30;AN;250772;0;104026;m -GNUVA Luca;1577;3N;30;VB;160167;0;104453;m -GUGLIELMI Dario;1655;2N;30;VB;131060;0;105746;m -LAINATI Roberto;1535;2N;30;VB;121048;0;100488;m -BURAGLIA Giuseppe;1508;3N;30;VB;040664;0;110460;m -SCHMIED Horst;1936;1N;30;EE;0;0;8921;m -SEGUNDO Garcia;2076;CM;30;EE;0;0;8922;m -CEULEMANNYS Bran;1652;2N;30;EE;0;0;8923;m -CINO Marco;1742;2N;30;MI;150564;0;100114;m -FINELLI Carmine;1685;2N;30;TO;040485;0;111945;m -LA-TESSA Domenico;1571;3N;30;TO;250953;0;114858;m -GRANO Antonio;1640;2N;30;KR;100686;0;106764;m -SANNA Gianfranco;1500;3N;30;SS;050555;0;110557;m -TRAZZI Enrico;1688;2N;30;MN;300787;0;112437;m -RUI Italo;1589;3N;30;TV;040947;0;107823;m -ANNE' Fabio;1544;3N;30;BR;061180;0;113421;m -SANTAITI Antonio;1700;2N;30;IM;070244;0;114647;m -DONZELLA Matteo;1581;3N;30;IM;150388;0;105091;m -ANFOSSO Alirio;1664;2N;30;IM;090388;0;113399;m -MURATORE Chiara;1440;3N;30;IM;221288;0;113402;f -ALBORNO Paolo;1529;3N;30;IM;100388;0;113398;m -ALBORNO Riccardo;1673;2N;30;IM;121085;0;114648;m -LO-DICO Angela;1697;2N;30;IM;210747;0;114645;f -ERMACORA Ilario;1559;2N;30;RM;120430;0;114191;m -DI-MASCOLO Maurizio;1599;3N;30;RM;201057;0;114751;m -MORARU Sebastian;1556;3N;30;AQ;240575;0;103404;m -MUROLO Umberto;1688;2N;30;AQ;310549;0;103405;m -MARINO Pietro;1655;2N;30;TP;100689;0;115866;m -GIRGENTI Giuseppe;1763;2N;30;SR;260379;0;115055;m -LONGOBARDI Giuseppe;1975;1N;30;NA;070862;0;114265;m -SCOLA Matteo;1884;1N;0;TN;160567;825891;100673;m -SALEMI Alfonso;1539;3N;30;TP;031089;0;112112;m -RUSSOMANDO Vincenzo;1534;3N;30;SA;231186;0;108595;m -SCHIAVO Roberto;1583;2N;30;SA;101087;0;108590;m -DE-SIMONE Vincenzo;1572;3N;30;NA;010465;0;100409;m -CAMMISA Ferdinando;1450;3N;30;NA;0;0;102704;m -VASTO Umberto;1703;2N;30;BR;211186;0;109353;m -TURO Luigi;1646;2N;30;BR;010186;0;106254;m -GORGONI Andrea;1560;3N;30;BR;190387;0;112601;m -GRIPPA Marco;1541;3N;30;TA;160490;0;113229;m -MIRAGLIA Cosimo;1580;3N;30;TA;140687;0;110530;m -SASSO Corrado;1514;3N;30;TA;160192;0;113226;m -SASSO Giulio;1485;3N;30;TA;280689;0;113222;m -ANASTASIA Vito;1646;2N;30;FG;260566;0;103373;m -BERARDI Pasquale;1601;2N;30;FG;010141;0;115995;m -LEONE Clarissa;1613;2N;30;BA;290590;0;112459;f -OLIVARI Alessandro;1700;2N;30;GE;280672;0;114068;m -MANIERO Andrea;2043;CM;0;PD;110380;821608;104027;m -MALOVIK Anna;2016;CM;30;EE;250276;0;116390;f -MESSINA Luigi;1572;3N;30;CT;060549;0;106125;m -SAMBIN Luigi;1546;3N;30;PN;270343;0;110345;m -DE-DEA Sergio;1500;3N;30;VI;141149;0;101435;m -CIAO Liberato;1580;3N;30;SA;190662;0;107005;m -D'AGOSTINO Vito;1580;3N;30;SA;140851;0;107006;m -ODDO Andrea;1700;2N;30;CA;020489;0;112620;m -PILURZU Stefano;1401;3N;30;CA;190788;0;103125;m -CONGIU Luca;1572;3N;30;CA;260189;0;112614;m -PERRA Luigi;1424;3N;30;CA;110190;0;103131;m -ROMANIELLO Domenico;1580;3N;30;BZ;031062;0;107133;m -ZONTA Riccardo;1527;3N;30;VR;101164;0;115414;m -CATELLANI Davide;1751;2N;30;MO;060272;0;114723;m -DENARO Pietro;1529;3N;30;TP;290652;0;112273;m -MIRABILE Matteo;1649;2N;30;BI;010587;0;110502;m -BASSAN Mattia;1596;3N;30;BI;151187;0;110500;m -NAHUM Lawrence;1867;1N;30;EE;0;0;8980;m -DE-VITO Giovanni;1652;2N;30;MT;120165;0;112006;m -ZEFI Artur;1539;3N;30;TO;261081;0;114930;m -ENEA Settimo;1700;2N;30;TO;050852;0;106258;m -ZAMBELLI Giancarlo;1511;3N;30;TO;280351;0;111212;m -ACHING Mac Lean;1589;3N;30;TO;080376;0;114053;m -ADINOLFI Matteo;1541;3N;30;TO;301164;0;114054;m -SAMBATARO Daniele;1592;3N;30;CT;061187;0;114065;m -PILLITTERI Francesco;1580;3N;30;PA;190786;0;102513;m -VITRANO Marco;1700;2N;30;PA;120989;0;110041;m -TOSCANO Emilio;1580;3N;30;CE;120480;0;114985;m -LAMPIASI Stefano;1610;2N;30;PT;020159;0;109305;m -BELLANDI Marco;1649;2N;30;PT;170772;0;114777;m -CHERUBINI Luigi;1592;2N;30;FI;051039;0;114738;m -GUARNIERI Matteo;1700;2N;30;VE;201181;0;115803;m -ORSINI Daniele;1676;2N;30;PE;100490;0;112850;m -PASTA Paride;1700;2N;30;PE;130990;0;101809;m -MIGLIORISI Emanuele;1589;3N;30;CL;111069;0;110577;m -CAPITANI Giampiero;1571;3N;30;LU;061143;0;103464;m -BONELLI Fabrizio;1580;3N;30;LU;280976;0;106425;m -SCUTIERO Francesco;1628;2N;30;SA;010677;0;110001;m -BORGIA Massimo;1718;2N;30;LE;170253;0;105361;m -CORSO Angelo;1688;2N;30;GE;030368;0;114566;m -SCALA Roberto;1514;2N;30;GE;290860;0;110135;m -BRUSCELLA Mario;1548;3N;30;RN;160965;0;114639;m -CASSETTA Alessandro;1739;2N;30;RA;211071;0;115614;m -GIORGI Sandro;1870;1N;0;RA;311270;816353;115087;m -BENEDETTI Renzo;1771;1N;30;TN;200373;0;114143;m -VADAGNINI Nicola;1580;3N;30;TN;290185;0;104421;m -CONFLITTI Alessandro;1664;2N;30;RM;130575;0;100956;m -GIULI Andrea;1580;3N;30;RM;170671;0;114547;m -PAVAN Luigi;1715;2N;30;RM;220270;0;115129;m -GOXAJ Armando;1646;2N;30;RM;120978;0;114989;m -GIOVINAZZI Luca;1562;3N;30;RM;090570;0;115128;m -PIRRONE Massimo;1572;3N;30;RM;170554;0;114992;m -DREYER Richard;1724;2N;30;EE;0;0;9016;m -PINARELLI Giuseppe;1894;1N;30;EE;083053;0;9017;m -MATAIGNE Jean-Michel;2197;-M;20;EE;0;0;9018;m -GORINI Pietro;1539;3N;30;RM;160255;0;117058;m -XIM-FUSTER Orfila;2094;CM;30;EE;0;0;9020;m -ZWANEPOL Johan;1903;1N;30;EE;160757;0;9021;m -ERDMANN Wolfgang;1599;3N;30;EE;0;0;9023;m -LUNDMARK Giorgio;1878;1N;0;EE;0;822396;9024;m -MARCHAL Patrick;1822;1N;30;EE;0;0;9025;m -MARCHAL Thomas;1676;2N;30;EE;0;0;9026;m -PHILIP Marie-Pierre;1474;3N;30;EE;;0;9027;f -FONZO Mario;1574;2N;30;BA;131286;0;111302;m -SPINA Sergio;1544;2N;30;FG;130266;0;106172;m -VECE Luigi;1694;2N;30;FG;170379;0;106170;m -RAMPINI Valerio;1700;2N;30;RN;140858;0;116832;m -SALA Marco;1754;2N;30;RN;050674;0;110918;m -LUCCHI Lorenzo;1870;1N;0;RN;180392;821160;109387;m -MUCCINI Marco;1885;1N;0;RN;210792;824593;110915;m -ALBORNO Rodolfo;1565;3N;30;IM;090252;0;114643;m -MORREALE Gioele;1430;3N;30;IM;021191;0;114651;m -MEGGETTO Giuseppe;1563;3N;30;IM;160266;0;9037;m -PARADISI Luca;1580;3N;30;IM;100387;0;114655;m -BIANCHI Angelo;1580;3N;30;VA;200752;0;109813;m -FRIGERIO Roberto;1596;3N;30;VA;170158;0;114003;m -GUERRIERI Jurka;1567;2N;30;PG;260975;0;114663;m -CALDARI Emilia;1580;3N;30;PG;160890;0;113500;f -CUCULIUC Daniel;1522;3N;30;PG;280189;0;113505;m -ROSSI Laura;1457;3N;30;PG;270887;0;113515;f -LANZI Marco;1539;3N;30;PG;021288;0;113510;m -RIZZUTO Antonio;1493;3N;30;CS;060787;0;104078;m -FALBO Francesco;1625;2N;30;CS;030686;0;110886;m -GARCEA Antonio;1518;3N;30;CS;160989;0;104105;m -SPINA Giovanni;1589;2N;30;CS;030689;0;112531;m -SPATARO Stefano;1506;3N;30;CS;031189;0;110896;m -CAPANO Domenique;1544;3N;30;CS;220788;0;109160;m -D'ALESSANDRO Flavio;1536;3N;30;CS;050647;0;111864;m -CASARANO Gabriele;1700;2N;30;SP;140584;0;111693;m -ATTI Edoardo;1706;2N;30;BI;070555;0;107617;m -CANCEDDA Antonio;1580;3N;30;BI;010564;0;102267;m -KOZLOV Yuri;1849;1N;30;EE;;0;9056;m -LAVATELLI Bruno;1712;2N;30;MI;310338;0;113924;m -GARRISI Daniele;1664;2N;30;PI;250477;0;114911;m -BERTUCCO Abramo;1700;2N;30;PI;100579;0;114398;m -GIAMBAVICCHIO France;1485;3N;30;TO;060540;0;104302;m -FAZIO Francesco;1580;3N;30;CT;250780;0;117101;m -LA-ROSA Valerio;1580;3N;30;CT;300872;0;117100;m -ISAIA Mauro;1580;3N;30;SV;150861;0;104384;m -KOCANI Leonard;1871;1N;30;SV;110571;0;114570;m -GUALAZZI Arnaldo;1622;2N;30;MI;240348;0;109782;m -PIACENTINI Riccardo;1580;3N;30;PV;110180;0;114193;m -NATALICCHIO Sebastia;1596;2N;30;PC;200969;0;115308;m -LICENZIATI Sergio;1619;2N;30;PN;210347;0;102026;m -LICANDRO Michele;1463;3N;30;PN;240452;0;102016;m -ZANETTI Matteo;1724;2N;30;PN;210480;0;112395;m -PEDRAZZI Nicola;1505;3N;30;TV;240390;0;106457;m -IVALDI Matteo;1646;2N;30;TE;060989;0;105697;m -LOMBARDI Raffaele;1587;3N;30;RM;210846;0;112211;m -BOGDAN Lucian;1599;3N;30;RM;280774;0;9074;m -BEGNI Carlo;1620;2N;30;BG;131148;0;108771;m -COLOSIO Mino;1700;2N;30;BS;030746;0;101915;m -IODICE Enzo;1628;2N;30;BS;180569;0;107753;m -FONTANA Nicola;1700;2N;30;BS;080873;0;115870;m -CAPELLI Carlo;1823;1N;30;BS;050661;0;115869;m -SUBIACO Riccardo;1553;3N;30;LT;141089;0;104960;m -CIRILLO Walter;1544;3N;30;VC;161273;0;115384;m -DEMARIE Tommaso;1754;2N;30;TO;081084;0;114451;m -TONDELLA Ermete;1503;3N;30;TO;311087;0;109178;m -BAIONI Alfio;1522;3N;30;MI;260457;0;106972;m -SALA Stefano;1580;3N;30;MI;271165;0;117280;m -LO-GIUDICE Francesco;1580;3N;30;CT;050982;0;114947;m -MILANESE Francesco;1580;3N;30;CT;190185;0;106420;m -BELLAME Nestore;1580;3N;30;NA;200465;0;114264;m -PUGLIESE Nicola;1700;2N;30;NA;080844;0;114268;m -BARONE Sergio;1559;2N;30;NA;090160;0;114835;m -BERTOLAZZI Edoardo;1580;3N;30;VR;070389;0;100984;m -BAGHINO Giglio;1364;3N;30;RM;260812;0;100228;m -GATTI Giovanni;1323;3N;30;RM;150522;0;100240;m -LIGATO Marco;1597;3N;30;RM;260788;0;113390;m -MARCHINI Umberto;1751;2N;30;AT;121048;0;114964;m -BELLINI Gilberto;1724;2N;30;TN;170749;0;110611;m -FILOSI Gianluigi;1739;2N;30;TN;080861;0;114035;m -NOE' Claudio;1540;3N;30;MI;060854;0;115259;m -BRUSCHI Luca;1589;3N;30;LO;240981;0;104467;m -CIAMPI Antonio;1556;3N;30;NO;300863;0;111520;m -ANGELUCCI Marco;1562;2N;30;RI;270673;0;103831;m -ONELLI Massimiliano;1553;3N;30;RI;230566;0;112226;m -SCIAN Corrado;1721;2N;30;PN;110280;0;110296;m -SCALAS Carlo;1700;2N;30;CA;280578;0;114977;m -MANCA Renato;1781;1N;30;MI;080552;0;100569;m -BIANCHI Massimiliano;1671;2N;30;MI;141071;0;114059;m -NICOLOSO Mauro;1519;3N;30;MI;091260;0;107207;m -RIZZI Pietro;1447;3N;30;PV;070568;0;110845;m -ANTONIETTO Eraldo;1700;2N;30;TO;060177;0;100139;m -DE-SANTIS Gabriele;1580;3N;30;TE;;0;9110;m -DINACCI Fabrizio;1589;3N;30;RM;111065;0;116459;m -RAGNONI Edoardo;1931;1N;0;RM;200256;819905;112573;m -FRANCHI Giuseppe;1808;1N;30;AP;060461;0;114853;m -OFFIDANI Marco;1599;3N;30;RM;291286;0;112792;m -RUMORI Lorenzo;1676;2N;30;RM;220371;0;114163;m -MALIS Ioan;1924;1N;30;EE;;0;9116;m -D'ALESSANDRI Federic;1520;3N;30;RM;211284;0;110354;m -BOLIGNANO Giuseppe;1535;3N;30;NA;301043;0;114085;m -MUCI Gregorio;1580;3N;30;NA;;0;115423;m -TOMARCHIO Giuseppe;1580;3N;30;FI;050642;0;114736;m -MONGE Maurizio;1817;1N;30;PI;151081;0;118732;m -GALLI Massimiliano;1525;3N;30;MN;190488;0;111739;m -GOZZI Bruno;1619;2N;30;MN;260969;0;112441;m -CACCIATORI Diego;1580;3N;30;MN;;0;9124;m -VERNACOTOLA Giulio;1700;2N;30;PE;011248;0;102585;m -PIERANDREI Cristiano;1727;2N;30;CH;200787;0;110867;m -BERGIS Didier;1700;2N;30;MO;270158;0;114375;m -CENACCHI Mauro;1757;2N;30;TO;230277;0;111524;m -ARCUDI Francesco;1544;2N;30;TO;221263;0;106257;m -IOZZI Gabriele;1511;2N;30;TE;240988;0;105695;m -PALAZZESI Giuliano;1653;2N;30;AN;241252;0;102314;m -MOTTOLA Donato;1736;2N;30;AN;240161;0;102329;m -GALEAZZI Paolo;1580;3N;30;AN;270757;0;113411;m -SORICETTI Adriana;1409;3N;30;AN;150750;0;116303;f -LANDI Andrea;1644;2N;30;PI;040174;0;113375;m -MONCERI Francesco;1655;2N;30;PI;170871;0;113378;m -RICCIARDI Giuseppe;1552;3N;30;LI;160357;0;106981;m -SCHULTZ Zoltan;1580;3N;30;TO;120411;0;115463;m -PONTONUTTI Luciana;1502;2N;30;UD;310845;0;105938;f -DASSI Enrico;1560;3N;30;UD;211172;0;117186;m -LOMBARDI Mariano;1877;1N;30;PZ;200988;0;115019;m -RUGGERI Andres;1514;3N;30;PZ;300880;0;106270;m -MILEO Pierpaolo;1676;2N;30;PZ;250187;0;111956;m -MONDINO Ivano;1558;3N;30;CN;200467;0;117019;m -KJELLBERG Bo;1523;3N;30;TO;081262;0;113213;m -FISSORE Giacomo;1915;1N;30;CN;250861;0;106835;m -ROMANO Stefano;1548;3N;30;CS;040592;0;104096;m -PROMENZIO Fabrizio;1575;3N;30;CS;100591;0;107340;m -MALTA Gaetano;1685;2N;30;CS;090389;0;112527;m -LAMPERTI Loris;1679;2N;30;MI;190355;0;116749;m -BRUNELLO Roberta;1863;1N;0;BG;180391;822205;105537;f -DI-BERARDINO Daniele;1356;3N;30;TE;210588;0;105694;m -ROMAGNOLI Lorenzo;1543;3N;30;TE;050589;0;115109;m -DE-SANTIS Leonardo;1580;3N;30;PI;010178;0;114396;m -TROPIANO Angelo;1700;2N;30;PI;270173;0;114392;m -PAVANELLO Michele;1580;3N;30;PI;070379;0;114395;m -MINNITI Vincenzo;1580;3N;30;PI;100675;0;114399;m -CICCONETTI Claudio;1580;3N;30;PI;111279;0;116743;m -DONNOLI Giorgio;1628;2N;30;MI;060372;0;110450;m -MORONI Denis;1580;3N;30;MI;220887;0;108618;m -NICOLANTI Pietro;1700;2N;30;RM;291157;0;9161;m -TORTOLINI Francesco;1830;1N;30;PG;201061;0;117143;m -FUGGIANO Roberto;1592;3N;30;TA;090691;0;113223;m -GRECO Gianluca;1874;1N;30;TA;310178;0;115547;m -TAMBURRINI Ivan;1592;3N;30;TA;210478;0;117177;m -D'ANGELO Giovanni;1512;3N;30;CH;140574;0;112516;m -TROMBETTA Gabriele;1565;3N;30;TO;;0;9167;m -LANZA Roberto;1524;3N;30;TO;;0;9168;m -LUDOVICI Giuseppe;1700;2N;30;RM;120270;0;116907;m -DI-GIANDOMENICO Alfo;1640;2N;30;PE;071075;0;119431;m -ZANELLATO Massimo;1532;3N;30;TV;150390;0;112495;m -MAUGERI Salvatore;1664;2N;30;CT;150173;0;115059;m -BIGNAMI Venanzio;1598;2N;30;LO;220754;0;114009;m -BONINSEGNA Ferdinand;1589;2N;30;LO;060671;0;112581;m -MARANGI Michele;1580;3N;30;BR;041059;0;116827;m -MIANO Donatello;1700;2N;30;BR;300331;0;116828;m -GIACHETTI Stefano;1562;3N;30;TR;240573;0;109281;m -GENNARI Dario;1661;2N;30;TR;131168;0;117027;m -GIUBILO Giancarlo;1580;3N;30;RM;010158;0;117057;m -PERFETTI Augusto;1541;3N;30;RM;120191;0;115824;m -PEVERIERI Alfredo;1532;3N;30;RM;090965;0;105446;m -GATTAFONI Nicola;1580;3N;30;MC;240255;0;111433;m -ADAMI Roberto;1649;2N;30;TV;100587;0;111615;m -CECCHETTO Andrea;1700;2N;30;PD;310887;0;104074;m -LIANG-TING Luisa;1580;3N;30;LU;290587;0;116322;f -D'INDIA Bruno;1652;2N;30;PA;;0;9187;m -GILLIAN Giorgio;1610;2N;30;NA;030689;0;110218;m -PIAZZON Riccardo;1676;2N;30;PD;140889;0;108214;m -PICHLER Norbert;1700;2N;30;BZ;221088;0;113322;m -POLETTI Diego;1700;2N;30;MO;171088;0;110082;m -ZANETTI Alex;1520;3N;30;MO;170588;0;110928;m -SOMMACAL Mandy;1718;2N;30;BL;260289;0;105063;f -FANTINI Adriano;1760;2N;30;BL;061190;0;109545;m -FERRIGO Marco;1661;2N;30;BI;210390;0;113208;m -LAMPL Gerald;1826;1N;30;VA;301190;0;114607;m -SERAFINI Lorenzo;1580;3N;30;MO;160490;0;106214;m -STEINEGGER Egon;1521;3N;30;BZ;070491;0;109551;m -ZOBOLI Andrea;1721;2N;30;MO;250590;0;106211;m -REGINATO Sabrina;1517;1N;0;TV;240491;825204;103394;f -MAIR Alexander;1548;3N;30;BZ;170293;0;114351;m -PRUGGER Giuana;1546;3N;30;BZ;130292;0;109554;f -VOCATURO Ilaria;1580;2N;30;RM;191292;0;108280;f -BRUNELLO Marina;1944;1N;0;BG;160694;822590;105538;f -DI-SALVO Alessandro;1613;2N;30;IS;290876;0;113633;m -BELTRAMI Cesare;1748;2N;30;AL;100358;0;117078;m -CANNAVALE Ignazio;1518;3N;30;NA;111261;0;117075;m -SPINELLA Giovanni;1700;2N;30;ME;201289;0;115972;m -FENOCCHIO Renato;1470;3N;30;ME;040464;0;113832;m -MASSARO Francesco;1580;3N;30;NA;301257;0;117105;m -D'AURIA Marta;1577;2N;30;SA;120392;0;100634;f -FERRARA Luca;1655;2N;30;NA;060679;0;114836;m -SAVALLA Salvatore;1700;2N;30;TP;210962;0;100225;m -RIBIZZI Marco;1661;2N;30;IM;220336;0;117046;m -VELARDI Giovanni;1706;2N;30;ME;210970;0;105752;m -LJUBISAVLJEVIC Sergi;1492;3N;30;CT;270679;0;120133;m -FERRO Ferruccio;1522;3N;30;VV;030557;0;117152;m -RINALDI Fausto;2020;CM;0;GE;220559;816566;117124;m -THOMAS Kevin;1637;2N;30;EE;;0;9221;m -CORSO Giorgio;1517;3N;30;CA;090348;0;111404;m -AZZONI Silvia;1571;3N;30;MI;121272;0;100571;f -CARDELLINA Elisa;1604;2N;30;AO;190577;0;114235;f -LANTSCHNER Alexander;1700;2N;30;BZ;150466;0;109692;m -BRUSCHI Morvan;1691;2N;30;FC;280768;0;117166;m -GIORDANO Enrico;1667;2N;30;FC;110172;0;113660;m -BASSENGHI Roberto;1700;2N;30;FC;260553;0;117165;m -LIGUORI Andrea;1580;3N;30;LE;210186;0;112939;m -MARCELLO Mario;1568;3N;30;LE;290489;0;101311;m -RESTA Valerio;1622;2N;30;BA;230984;0;116201;m -VERHAEGEN Wim;2124;CM;0;EE;;814601;9235;m -TESCHE Wolfram;1933;1N;30;EE;;0;9238;m -LEIGHTON Jan;1558;3N;30;EE;;0;9241;m -FEISTENAUER Hannes;1744;2N;30;EE;;0;9242;m -POLOCH Radim;1599;3N;30;EE;;0;9244;m -FEISTENAUER Armin;1599;3N;30;EE;;0;9245;m -REITINGER Jan;1679;2N;30;EE;;0;9246;m -MOROTE Patrick;1673;2N;30;EE;;0;9247;m -PEPE Savino;1665;2N;30;IM;171059;0;117183;m -ZANOTTI Luca;1613;2N;30;MI;140363;0;117163;m -PEPA Yezdin Dino;1730;2N;30;VA;240254;0;104463;m -CAPITANIO G.Battista;1580;3N;30;BG;291141;0;106038;m -MARCELLONI Dario;1595;3N;30;BG;210344;0;106032;m -MAGGIONI Oliviero;1550;3N;30;BG;180242;0;113108;m -SARTI Massimo;1580;3N;30;BG;010853;0;110027;m -DI-MAURO Valerio;1586;3N;30;BG;270374;0;106029;m -OLMO Angel Fernandez;1587;3N;30;SS;240572;0;117556;m -DEMONTIS Sandro;1529;3N;30;SS;190272;0;117118;m -COMANZO Crescenzo;1375;3N;30;BO;170960;0;101581;m -PANTALONE Nicola;1611;2N;30;BO;240679;0;115094;m -PANTALEONI Francesco;1580;3N;30;PU;291251;0;111471;m -ZUREL Maxim;1945;1N;0;EE;;816710;9261;m -CASAVECCHIA Stefano;1580;3N;30;PU;250487;0;113987;m -TOMASSINI Ubaldo;1906;1N;0;PU;110488;825280;111481;m -PALLADINO Andrea;1874;1N;30;CB;250985;0;117082;m -RICCI Domenico;1715;2N;30;IS;141085;0;117079;m -MUCCIO Costanzo;1700;2N;30;CB;090585;0;117703;m -BARCHIESI Marco;1718;2N;30;AN;251270;0;102316;m -DAINO Fiorenzo;1580;3N;30;AN;140935;0;114586;m -VASKOVA Jana;1541;3N;30;AN;251067;0;111108;f -GIAUSA Pierantonio;1338;3N;30;LE;070794;0;118715;m -ODDO Marco;1474;3N;30;TP;200495;0;117394;m -UNGUREANO Marcela;1520;3N;30;TO;030260;0;117235;f -D'ELIA Alessandro;1709;2N;30;VI;100682;0;115779;m -CASCIELLO Dimitri;2014;CM;0;VI;120571;818160;111229;m -BDAIR Bilal;2036;CM;0;TV;120884;815977;116398;m -FOGLIATO Denis;1632;2N;30;VI;250376;0;114021;m -BARTOLONI Mario;1548;3N;30;RM;200848;0;112357;m -BOLOG Iacint;1586;3N;30;RM;180264;0;114999;m -MANCONI Alberto;1601;2N;30;LU;090292;0;110641;m -SCALI Sandro;1580;3N;30;FI;200962;0;107981;m -VAGANOV Vladislav;1521;3N;30;LU;090591;0;117279;m -BERTANI Ruggero;1546;3N;30;LU;241155;0;110637;m -SOFIA Antonio;1461;3N;30;ME;310874;0;119167;m -SECONE Stefano;1700;2N;30;LU;060961;0;108853;m -PAOLINELLI Giacomo;2023;CM;0;LU;300191;818402;103501;m -RAPPA Carlo;1463;3N;30;BS;040467;0;102350;m -CAPPELLETTI Giorgio;1572;3N;30;TN;230373;0;114144;m -VIVALDELLI Renato;1551;3N;30;TN;010146;0;117281;m -MINEI Giovanni;1574;3N;30;VE;080166;0;103369;m -CAMUSI Roberto;1580;3N;30;VE;260759;0;9290;m -MERLIN Marco;1541;3N;30;VA;250374;0;113559;m -GIACALONE Giuseppe;1580;2N;30;TP;270378;0;110584;m -MARASS Francesco;1643;2N;30;TS;170387;0;115567;m -MATIACIC Andrea;1580;3N;30;TS;270884;0;117285;m -MILICEVIC Zoran;1535;3N;30;GO;030666;0;115046;m -OBLAK Mitja;1688;2N;30;TS;231086;0;111079;m -PLANI Andrea;1896;1N;0;TS;010971;820881;115558;m -SAMUELLI Maurizio;1940;1N;0;TS;101177;815098;110165;m -FRANCO Carlo;1560;3N;30;PA;270773;0;115822;m -PLATANIA Daniele;1608;2N;30;PA;141289;0;113273;m -FERRIGNO Vincenzo;1721;2N;30;ME;071075;0;115621;m -JU Asan;1700;2N;30;VE;240686;0;115811;m -VASCELLARI Giorgio;1466;3N;30;VE;231042;0;103059;m -CALVIELLO Francesco;1706;2N;30;TA;280264;0;117005;m -CASTELLANA Domenico;1685;2N;30;TA;100766;0;115156;m -MARINO Oscar;1551;2N;30;BA;220571;0;115989;m -QUIRICO Paolo;2014;CM;30;AL;161081;0;101227;m -PASQUA Giovanni;1637;2N;30;VC;200469;0;114769;m -ATTIANESE Aniello;2011;CM;0;SA;140984;818895;110791;m -MOLZA Giuseppe;1595;2N;30;NA;270392;0;114423;m -DELIA Lorenc;1599;3N;30;SI;020782;0;116492;m -BALDI Daniele;1723;2N;30;GR;060379;0;114394;m -LAPENNA Michelangelo;1646;2N;30;MO;150689;0;103558;m -VENTURELLI Vainer;1546;3N;30;MO;290587;0;109117;m -POLLASTRI Federico;1582;3N;30;MO;151291;0;111675;m -BALDELLI Alex;2049;CM;0;PU;020989;822167;115459;m -ROMOLI Luciano;1544;3N;30;PU;190790;0;116080;m -VENTURI Riccardo;1580;3N;30;PU;261089;0;9318;m -ZILIO Nicolo';1700;2N;30;PD;160586;0;118054;m -DE-VRIES Bernhard;1583;2N;30;BL;110141;0;111654;m -CAPURRI Giancarlo;1546;3N;30;MI;150856;0;109854;m -BRANDI Marcello;1441;3N;30;MI;200928;0;107763;m -MIRABILE Natale;1580;3N;30;ME;300757;0;9323;m -PATERNO-RADDUSA Ales;1527;3N;30;CT;280462;0;9324;m -CIRILLO Bruno;1551;3N;30;SA;160550;0;101236;m -PISCOPIA Carmela;1565;3N;30;SA;020175;0;114910;f -GAROFANO Francesco;1709;2N;30;CA;290676;0;117576;m -FLORIS Matteo;1432;3N;30;CA;251187;0;103861;m -TRUDU Antonio;1541;3N;30;CA;020887;0;109506;m -MOI Federico;1580;3N;30;CA;171186;0;109189;m -GARONZI Martino;1925;1N;0;VR;080984;822345;114725;m -PARETI Alessandro;1538;2N;30;FI;161058;0;117583;m -GIALLO Pietroguido;1676;2N;30;SI;221066;0;120510;m -ALIA Genci;1710;2N;30;SI;141172;0;115315;m -LOVACCO Fabio;1580;3N;30;FI;060768;0;107973;m -VASILE Catalin;1748;2N;30;TO;240989;0;113203;m -GILIO Emanuele;1536;3N;30;TO;031260;0;117224;m -ZANATTA Federico;1784;1N;30;TV;020881;0;118399;m -BOSCO Antonio;1604;2N;30;BO;290264;0;116219;m -CAPUZZO Alberto;1715;2N;30;PD;281077;0;115063;m -MERCURI Delia;1370;3N;30;ME;200961;0;106465;f -PAFUMI Giuseppe;1536;3N;30;ME;060487;0;107513;m -ALPINI Roberto;1541;3N;30;FI;110469;0;114735;m -AMANTIA Michele;1580;3N;30;CT;070867;0;121248;m -GALLI Fabrizio;1472;3N;30;MI;120358;0;101288;m -SCIVETTI Michele;1580;3N;30;BA;300980;0;117202;m -NITTI Nicola;1700;2N;30;BA;240771;0;115512;m -PISCINELLI Nicola;1580;3N;30;BA;221068;0;115513;m -BISCEGLIA Luca;1676;2N;30;CE;070592;0;102831;m -PISANTI Francesco;1532;3N;30;CE;010845;0;103960;m -RIGATO Leonardo;1595;2N;30;TV;300377;0;118026;m -CONTI Massimo;1558;3N;30;TV;120582;0;118027;m -DE-COL Daniele;1430;3N;30;VE;040448;0;118018;m -ALVITI Claudio;1820;1N;30;RM;120582;0;117411;m -CHRISTEN Peter Walte;1493;2N;30;IM;251247;0;119528;m -ACCATTATO Nicola;1888;1N;30;EE;;0;9357;m -GANDOLFO George;1694;2N;30;EE;;0;9358;m -PINEAU Jean;1566;3N;30;EE;;0;9359;m -CALCOPIETRO Fabio;1580;3N;30;IM;100286;0;115169;m -DI-GIOIA Leonardo;1580;3N;30;IM;201191;0;115191;m -LANZO Giulia;1429;3N;30;IM;070191;0;113401;f -DUCA Claudio;1580;3N;30;PG;110663;0;118407;m -MEYER Carl;1682;2N;30;PG;281244;0;117833;m -BUZZETTI Giampiero;1580;3N;30;PG;200367;0;118406;m -ZAFFERA Leonardo;1700;2N;30;PG;110474;0;9366;m -CANTUCCI Marco;1700;2N;30;PG;010669;0;118410;m -BUHLER Arno;1700;2N;30;PG;210860;0;118413;m -PETRO' William;1700;2N;30;TO;030169;0;114179;m -CAMOSI Roberto;1694;2N;30;VE;260759;0;117290;m -STIEVANO Rossano;1580;3N;30;VE;150453;0;9371;m -REGINATO Dario;1522;3N;30;TV;141184;0;103392;m -D'IPPOLITO Giuseppe;1397;3N;30;TA;310354;0;117173;m -NAPOLI Francesco;1661;2N;30;TA;121249;0;119095;m -FASIELLO Mauro;1670;2N;30;BA;160672;0;118104;m -GIANNOTTI Salvatore;1805;1N;30;BA;031179;0;118228;m -MAGGIULLI Luigi;1637;2N;30;BA;181068;0;118227;m -MAKRODIMITRIS Dimitr;1676;2N;30;BA;300175;0;118106;m -STRIPPOLI Michele;1890;1N;0;BA;250985;823384;116202;m -GRECO Alessandro;1679;2N;30;MN;171174;0;115152;m -BANDERA Daniele;1682;2N;30;MN;040568;0;104222;m -DE-ANGELIS Donato;1511;2N;30;MN;040164;0;117676;m -BATTISTI Emanuele;1538;3N;30;MN;010575;0;114617;m -DE-ANGELIS Helaman;1688;2N;30;MN;220492;0;115154;m -PETRITAJ Ferdinant;2141;CM;0;EE;150363;4700619;113418;m -ELLISON Mariano R.;2085;CM;0;EE;;814849;9386;m -NARDIELLO Pietro;1855;1N;30;NA;221151;0;114845;m -LEONE Cataldo;1588;3N;30;VR;230755;0;117976;m -TERNA Giovanni;1748;2N;30;BS;230270;0;106936;m -COCO Francesco;1580;3N;30;PA;280686;0;108306;m -DE-BORTOLI Francesco;1748;2N;30;BL;201083;0;115993;m -LAZZARONI Fabio;1577;2N;30;BS;110575;0;117428;m -MAZZEI Pietro;1588;2N;30;NA;160346;0;113032;m -AQUINO Ciro;1805;1N;30;NA;260654;0;118750;m -DE-MARIA Dario;1577;2N;30;NA;220647;0;114261;m -D'AURIA Pasquale;1781;1N;30;SA;010958;0;117602;m -ZONA Giuseppe;1564;3N;30;NA;210493;0;115590;m -VIOLA Mario;2065;CM;0;MO;080944;818046;102069;m -BETTELLA Michele;1646;2N;30;PD;220973;0;110676;m -CHINELLO Silvio;1655;2N;30;PD;180853;0;110784;m -DISCARDI Enrico;1580;3N;30;VE;130879;0;117409;m -AMADIO Giuseppe;1664;2N;30;AP;300642;0;110052;m -ANGELICI Fabio;1613;2N;30;AP;150959;0;117340;m -GIRI Giovanni;1631;2N;30;MC;010673;0;117144;m -COCCO Massimiliano;1496;3N;30;AQ;290692;0;112826;m -GIACCHETTI Lorenzo;1530;3N;30;AQ;210892;0;107476;m -BRUNETTI Antonio;1550;2N;30;LE;130958;0;105362;m -LEO Emanuela;1580;3N;30;LE;230561;0;111528;f -PETRUZZO Salvatore;1667;2N;30;LE;050270;0;105378;m -PALERMO Tommaso;1715;2N;30;CT;090954;0;117800;m -KVASSOV Dmitri;2106;CM;30;CS;270977;0;118370;m -FAMELI Alessandro;1580;3N;30;CS;131185;0;111944;m -SPATARO Enrico;1751;2N;30;RC;141289;0;112772;m -ANTONINI Giovanni;1534;3N;30;VA;291253;0;117317;m -OLIVARI Elena;1455;3N;30;NO;071091;0;109457;f -OLIVARI Giulio;1508;3N;30;NO;301292;0;109571;m -RAINERI Roberto;1619;2N;30;CO;070161;0;110814;m -VACCA Giovanni;1586;2N;30;NO;230348;0;117319;m -TERRANOVA Fabbio;1565;3N;30;CT;021080;0;118079;m -RONDINONE Silvano;1580;3N;30;MT;170177;0;118423;m -FROVA Martino;1830;1N;0;AO;101168;819247;114196;m -CETTA Andrea;1727;2N;30;MI;180584;0;108166;m -FORNASIR Carlo Gusta;2060;CM;0;MI;290472;818259;117354;m -BELLI Germano;1700;2N;30;BI;290487;0;116630;m -SQUARA Marco;1589;2N;30;BI;220877;0;114765;m -CULTRARO Salvatore;1655;2N;30;SR;160770;0;9427;m -PARISI Sergio;1724;2N;30;PA;260190;0;118016;m -NAPOLI-COSTA Antonel;1481;2N;30;ME;121290;0;115971;m -PIPITO' Gioacchino;1517;2N;30;ME;130862;0;117213;m -CARBONARO Davide;1584;3N;30;PR;290976;0;117981;m -DE-COLLE Camillo;1646;2N;30;BL;131043;0;115994;m -NICOTRA Francesco;1580;3N;30;RG;260177;0;9434;m -FASINO Salvatore;1652;2N;30;RG;040470;0;120148;m -DALL'ORSO Demetrio;1700;2N;30;GE;110633;0;117790;m -GUINICELLI Giovanni;1580;3N;30;RG;140977;0;9437;m -CARDONA Alberto;1712;2N;30;MC;301265;0;109977;m -VICINO Aldo;1700;2N;30;RM;140232;0;102158;m -SANSONE Dario;1598;2N;30;TO;270388;0;113204;m -PARODI Alessandro;1918;1N;0;TO;151290;822809;116371;m -GHERGUT Damian;1556;3N;30;EE;060568;0;117816;m -PAGLIERI Paolo;1580;3N;30;AL;071150;0;106829;m -TURINO Luca;1862;1N;0;TO;071177;821870;117537;m -ANDRIULO Luigi;1860;1N;0;LT;011070;816167;119078;m -D'ANDREA Jacopo;1691;2N;30;RM;240382;0;117693;m -DEGI Remus;1599;3N;30;TO;221276;0;117535;m -TOGNETTI Gianluca;1580;3N;30;RM;191184;0;117694;m -PICIERRO Giuliano;1572;3N;30;VA;201069;0;103969;m -BARCAGLIONI Edoardo;1570;3N;30;LU;290888;0;9450;m -POPA Dragos;1703;2N;30;LU;301090;0;116701;m -NEUDEL Bernd;1904;1N;0;EE;;816515;9453;m -ZAMBARBIERI Cristian;1551;3N;30;VA;140670;0;114431;m -SERAFINI Federico;1580;3N;30;VE;131060;0;113551;m -AMBROSI Lucio;1549;3N;30;RN;140749;0;105838;m -BELEMMI Marco;1772;2N;30;RN;081168;0;110911;m -CENCI Fabio;1694;2N;30;RN;270673;0;118167;m -RINALDI Giuseppe;1580;3N;30;RN;300461;0;118170;m -BENCIVENGA Antonio;1428;3N;30;VA;010238;0;100875;m -OMACINI Mario;1412;3N;30;BG;150456;0;117261;m -LUPI Ivano;1580;3N;30;BG;260957;0;110022;m -LEONI Graziano;1580;3N;30;MI;200579;0;114610;m -MILAN Raffaele;1592;3N;30;MI;260666;0;101816;m -ADDA Roberto;1607;2N;30;MI;100280;0;113588;m -RINALDI Amos;1539;3N;30;SO;300679;0;107487;m -COCINA Gianni;1565;3N;30;GE;310363;0;101332;m -DEBERNARDI Marco;1658;2N;30;AL;131279;0;114427;m -MERLO Andrea;1977;1N;0;GE;261189;824160;115734;m -GRAZIANI Stefano;1568;3N;30;LI;171088;0;114539;m -FERRO Dario;1680;2N;30;LI;220572;0;106979;m -FALCIANI Edoardo;1598;2N;30;LI;150691;0;115597;m -CRISTIANO Paolo;1706;2N;30;LI;131076;0;117447;m -BARBARULO Aniello;1634;2N;30;NA;;0;9474;m -VAN-NIEUWENHUIZEN Jo;1900;;0;EE;;0;9479;m -POCHE Denis;1828;;30;EE;190164;0;9483;m -JARABITZA Umberto;1670;2N;30;FI;050642;0;117584;m -MAROTTA Claudio;1580;3N;30;FI;220872;0;117586;m -LONGHIN Luigi;1664;2N;30;FI;160573;0;110629;m -PITIMADA Mirko;1954;1N;0;FI;060483;821721;119029;m -VERNIERI-COTUGNO Mic;1580;3N;30;IS;221074;0;117682;f -TARQUINIO Adriano;1613;2N;30;NA;240190;0;110228;m -ROMANO Andrea;1532;3N;30;SA;200864;0;114908;m -LOMBARDO Michele;1701;2N;30;NA;070194;0;110220;m -BUONO Giuseppe;1670;2N;30;SA;300374;0;106630;m -MARRARO Vincenzo;1517;3N;30;CT;060768;0;9493;m -MANGIAGLI Salvatore;1580;3N;30;CT;021255;0;117589;m -GALAVERNI Marzia;1514;3N;30;IM;080657;0;114646;f -MASELLI Baldovino;1549;3N;30;IM;091054;0;108823;m -PUNTURIERO Mattia;1401;3N;30;IM;180391;0;114649;m -CIVERRA Alessio;1610;2N;30;CB;110689;0;117089;m -PISCOPO Gaetano;1487;3N;30;IS;100641;0;117701;m -LOI Andrea;2075;CM;0;TN;110186;825522;117807;m -KIRCANSKI Piergiorgi;1491;3N;30;TN;270947;0;110618;m -PORRETTA Monica;1522;1N;30;TN;190673;0;118345;f -LOBINA Paolo;1694;2N;30;CA;190685;0;113587;m -PINNA Saverio;1580;3N;30;CA;110488;0;109187;m -SECCI Gabriele;1682;2N;30;CA;030177;0;112070;m -PES Gavino;1507;3N;30;SS;151189;0;102443;m -DAVI' Dino;1502;3N;30;SS;050789;0;114755;m -DESSI' Fabrizio Dani;1658;2N;30;SS;240986;0;117247;m -SCALISE Sandro;1625;2N;30;CZ;240564;0;117809;m -FASANO Domenico;1700;2N;30;TO;210865;0;114175;m -CASALE Anania;1626;2N;30;PV;020767;0;120242;m -PERSIA Bruno;1580;3N;30;AQ;070756;0;103409;m -RICCHIUTO Marcello;1586;3N;30;CH;191255;0;114252;m -MARZANO Vincenzo;1632;2N;30;AQ;310160;0;111251;m -BASSOLI Andrea;1550;3N;30;MI;170861;0;100547;m -CHIRIO Adriano;1580;3N;30;TO;170874;0;116175;m -PIETROBELLI Marco;1682;2N;30;BI;171252;0;102256;m -RE Guido;1580;3N;30;BI;020336;0;102255;m -DE-LA-PENA Elmer;1871;1N;0;MI;120560;821403;118111;m -VIGNOLI Matteo;1941;1N;0;MI;200484;817449;117345;m -ZIZZI Giuseppe;1534;3N;30;TA;030389;0;113003;m -BIGATTI Alessandro;1580;3N;30;MI;100565;0;114132;m -TAVELLA Gianluca;1580;3N;30;MI;200477;0;114136;m -ZIRO Giuseppe;1580;3N;30;MI;170989;0;117351;m -VAGLIO Alessandro;1637;2N;30;PD;091170;0;118057;m -ABAZI Rhui;1724;2N;30;EE;130765;0;121316;m -BOARETTO Vanni;1628;2N;30;PD;270259;0;118061;m -FERRANDI Flavio;1631;2N;30;LO;210879;0;117416;m -DE-MARCO Francesco;1890;1N;30;CS;120356;0;109968;m -MENDOLA Christian;2037;CM;30;MC;100171;0;115409;m -FRANCHITTI Luigi;1614;2N;30;TO;151037;0;117237;m -SCANDIUZZI Roberto;1434;3N;30;PD;190253;0;110159;m -BETTIN Federico;1649;2N;30;PD;270689;0;110456;m -CECCATO Alessandro;1700;2N;30;PD;060152;0;118071;m -VISENTIN Lorenzo;1953;1N;0;VE;191094;823775;110768;m -REATO Giovanni;1652;2N;30;PD;210867;0;106802;m -GRECO Marco;1582;3N;30;PA;;0;9539;m -PERROTTA Andrea;1631;2N;30;RE;060965;0;110934;m -CUCCOLINI Milo;1802;1N;30;RE;070780;0;117974;m -FOSCHINI Andrea;1937;1N;0;RM;271274;824046;118091;m -TURRIZIANI Giovanni;1954;1N;30;RM;070483;0;118129;m -BETTINI Massimo;1887;1N;0;MI;120462;818933;117532;m -DI-MARCO Ruggero;1830;1N;0;MI;231070;822620;118516;m -ASTORINA Davide;1521;3N;30;CT;291186;0;107368;m -CARDILLO Antonio;1580;3N;30;ME;090970;0;118323;m -BARTOLUCCI Emanuele;1581;3N;30;RI;310370;0;118582;m -GALLONI Andrea;2052;CM;0;RM;190974;818275;118816;m -URZI' Silvio;1864;1N;0;RM;020557;821888;117823;m -PORTEGIES-ZWART Robe;1682;2N;30;RM;040548;0;119526;m -CARPINELLI Gabriele;1582;3N;30;TR;080672;0;117026;m -RADICONCINI Alfredo;1571;2N;0;RM;020857;821748;119339;m -LUPO Andrea;1580;3N;30;VC;070878;0;119063;m -MONTI Luciano;1700;2N;30;VC;301151;0;104699;m -INVERNIZZI Luca;1700;2N;30;MI;300978;0;117358;m -SCASSIANO Gianpiero;1658;2N;30;VC;301156;0;104701;m -MARIANO Matteo;1580;3N;30;CN;120943;0;117712;m -BELLINO Osvaldo;1520;2N;30;CN;091164;0;113209;m -PALASH Sarker;1700;2N;30;EE;021078;0;9561;m -BUFALO Fabrizio;1602;2N;30;LC;160676;0;120285;m -GOBBO Francesco;1826;1N;30;UD;250979;0;108812;m -ORSATTI Marcello;1818;1N;30;UD;170768;0;118789;m -BOZZOLI Giorgio;1727;2N;30;MN;010458;0;101157;m -BELLINGERI Michele;1679;2N;30;PR;170279;0;111067;m -BONI Gianni;1661;2N;30;MN;140870;0;118237;m -GROSSI Cesare;1670;2N;30;GE;301166;0;117121;m -CAPUTI Giuliano;1945;1N;0;GE;200567;821993;118668;m -DE-REGIBUS Giuseppe;1524;3N;30;VB;210358;0;113838;m -D'ANGELO Emilio;1568;2N;30;NA;020356;0;118585;m -GRANDONE Salvatore;1814;1N;30;CE;061079;0;118276;m -IORIO Paolo;1647;2N;30;NA;060573;0;101196;m -IANDOLO Giovanni;1564;3N;30;BN;181068;0;118159;m -MARINELLI Salvatore;1596;3N;30;NA;070989;0;110431;m -LOMBARDI Ottavio;1748;2N;0;NA;080389;823600;110219;m -CHIOCCHETTI Giorgio;1569;3N;30;TN;080736;0;119361;m -CHIESSI Gianpaolo;1626;2N;30;MO;110862;0;111052;m -GHILOTTI Alberto;1733;2N;30;SO;270775;0;119100;m -FERRI Pietro;1580;3N;30;RM;260453;0;110113;m; -MELLINI Antonio;1679;2N;30;RA;140650;0;112223;m; -ROSSINI Gianluca;1616;2N;30;TR;060168;0;119120;m; -MASALA Pierluca;1547;3N;30;SS;291077;0;122573;m -RICCA Sergio;1700;2N;30;SS;081178;0;9584;m -CHOQUE-PAREDES Jose ;2051;CM;0;FI;070762;817147;119267;m -MONTAGNI Alfonso;1700;2N;30;FI;061167;0;117581;m -LELLI Andrea;1652;2N;30;PE;091290;0;112080;m -INTERNICOLA Dario;1544;2N;30;PA;130790;0;108467;m -SCALIA Giacomo;1580;3N;30;PA;131288;0;113303;m -MILIANI Francesco;1580;3N;30;LI;121285;0;114563;m -FOROSETTI Giantomaso;1582;3N;30;FI;221171;0;119490;m -MILANI Giorgio;1563;3N;30;MI;060559;0;114720;m -BASSO Marco;1515;3N;30;BO;270289;0;100331;m -DEVOLE Genci;1700;2N;30;TO;110771;0;119585;m -FIGARI Andrea;1512;3N;30;TO;210183;0;100138;m -OBOROCEANU Florin;1601;2N;30;CN;120670;0;9596;m -FLEGO Dario;1520;2N;30;TO;060266;0;116790;m -DALMASSO Danilo;1568;3N;30;CN;060388;0;117094;m -SELVINI Andrea;1575;3N;30;CN;150269;0;111998;m -MEDAGLIA Enzo;1560;3N;30;CN;191270;0;117023;m -PIRONE Giulio;1541;3N;30;VI;091170;0;105676;m -BONANNI Vincenzo;1637;2N;30;VT;210643;0;111279;m -CAMPESATO Adriano;1652;2N;30;MI;130847;0;119791;m -CATALANO Stefano;1565;3N;30;VA;130578;0;117191;m -GHIDINI Roberto;1534;3N;30;VA;121174;0;117434;m -CARMINATI Giovanni;1580;3N;30;MI;301153;0;114386;m -PELLEGATA Andrea;1587;3N;30;MI;311278;0;117508;m -RAVELLI Lorenzo;1577;3N;30;MI;120375;0;119583;m -ZUCCHI Oreste;1550;3N;30;MI;201250;0;108249;m -CATARDI Salvatore;1580;3N;30;SS;120169;0;9611;m -ORANI Luigi Giuseppe;1476;3N;30;SS;221284;0;117817;m -VERONA Carlo;1512;3N;30;SS;280260;0;117627;m -ORANI Sebastiano;1577;3N;30;SS;290883;0;117253;m -SIRCANA Carlo;1522;3N;30;SS;231292;0;119415;m -BORGNI Fiorenzo;1700;2N;30;MI;260633;0;110828;m -POLESE Marco;1598;2N;30;VE;240686;0;106665;m -DEMIRAJ Rumi;1865;1N;30;PD;160842;0;120134;m -ZANETTO Marco;1769;2N;30;VE;130378;0;118687;m -FAINI Ivano;1826;1N;0;AN;031149;819670;114813;m -PIAGGESI Franco;1556;3N;30;AN;060447;0;119860;m -FAROTTO Sergio;1700;2N;30;MI;170160;0;117927;m -GANDINI Daniele;1655;2N;30;VA;210665;0;117879;m -GUGLIELMI Gabriele;2098;CM;0;AN;121278;821551;102115;m -PAOLILLO Giampiero;1661;2N;30;MI;180358;0;119520;m -ROTUNDO Walter;1592;3N;30;MI;041072;0;118569;m -SACCHI Mario;1610;2N;30;NO;031076;0;117320;m -ZAPPA Massimiliano;1556;3N;30;MI;051267;0;117661;m -FAROTTO Dario;1580;3N;30;MI;070489;0;119522;m -DI-GIUSEPPE Giovanni;1892;1N;0;MI;060281;823490;117903;m -COLICA Matteo;1580;3N;30;AL;020773;0;115309;m -BARBA Elsa;1580;3N;30;MI;180776;0;115875;f -GIACHINO Claudio;1561;2N;30;TO;201245;0;108013;m -CATALDI Cristiano;1553;3N;30;AP;270582;0;117344;m -RUBINI Matteo;1667;2N;30;TE;050687;0;117137;m -SIMONETTI Yuri;1535;3N;30;AP;141285;0;117343;m -CHIACCHIARETTA Sabat;1559;2N;30;CH;280439;0;119888;m -SANTUS Ulisse;1700;2N;30;MI;201077;0;112888;m -BRIGHENTI Alessandro;1599;2N;0;MI;161057;824470;111715;m -BARLOTTI Gabriele;1637;2N;30;SA;230555;0;118117;m -DE-LELLIS Barbara;1401;3N;30;IM;040391;0;113400;f -GRASSO Valentina;1580;3N;30;IM;250390;0;115183;f -MIGLIORI Patrick;1457;3N;30;IM;310392;0;119534;m -BOTTINO Sebastiano;1427;3N;30;CT;081148;0;118080;m -GIOVANNINI Roberto;1515;3N;30;MI;221259;0;117625;m -FERRARI Davide;1580;3N;30;MI;051278;0;118567;m -LIISTRO Giovanni Car;1820;1N;30;CS;170456;0;119874;m -RIZZUTI Francesco;1661;2N;30;CS;180176;0;107511;m -CARELLA Leonardo;1489;3N;30;FG;300347;0;116247;m -POLITO Michele;1546;3N;30;FG;060177;0;119216;m -DRAGONE Vincenzo;1580;3N;30;KR;050464;0;115988;m -RIZZO Alfredo;1599;3N;30;BA;180873;0;117267;m -RIZZO Maria;1558;3N;30;BA;310867;0;117268;f -CHIECO Vincenzo;1582;3N;30;MT;040250;0;9654;m -GIOVANNINI Stefano;1757;2N;30;MI;230487;0;117521;m -DEL-FORNO SINICCO Mi;1601;2N;30;UD;261070;0;117185;m -BARRO Francesco;2022;CM;0;PN;030482;827932;110280;m -PIUNTI Mauro;1658;2N;30;TS;260270;0;115557;m -BURIANI Andrea;1952;1N;30;BO;250866;0;105341;m -GIACOIA Dario;1580;3N;30;PZ;310888;0;116822;m -LEO Antonello;1664;2N;30;MI;190988;0;102491;m -PIROSU Marco;1580;3N;30;CA;210784;0;117744;m -BIONDELLI Marco;1631;2N;30;CA;110157;0;113428;m -SUTERA Marco;1547;3N;30;TP;150488;0;115532;m -HAHN Karl Anton;1739;2N;30;VA;040163;0;114428;m -GAVAZZA Daniele;1700;2N;30;MI;150789;0;117700;m -NINI Mario;1613;2N;30;PU;090947;0;111470;m -NINI-DAFINU Ioan;1580;3N;30;PU;201170;0;117662;m -BOCCIA Francesco;1649;1N;30;NA;160952;0;119430;m -BERARDI Alessandro;1604;2N;30;MI;161289;0;107023;m -ROMANO Zeno;1862;1N;0;BG;120790;822833;115723;m -TAFUR Abel;1966;1N;30;EE;300766;0;122944;m -SCHIESARO Alberto;1675;2N;30;RO;230947;0;9673;m -NEPI Ezio;1817;1N;0;MI;200472;822752;110055;m -SALMOIRAGHI Angelo;2015;CM;0;MI;300783;824135;113956;m -SANTI Mattia;1580;3N;30;MN;270188;0;120126;m -HAUSBECK Dieter;1580;3N;30;EE;;0;9677;m -SIST Mattia;1700;2N;30;MI;310389;0;120141;m -CANTU' Guido;1842;1N;0;MI;300188;819581;117365;m -BIANCO Fabio;1541;3N;30;LE;131088;0;107674;m -SOLIDORO Roberto;1599;3N;30;LE;061088;0;101312;m -PARRINI Daniele;1933;1N;0;TR;210176;820717;118437;m -CORVINO Francesco;1580;3N;30;LE;011186;0;103922;m -DEMIRI Armand;1580;3N;30;BA;220984;0;118230;m -GRECO Luigi Antonio;1652;2N;30;LE;120467;0;120169;m -LEUZZI Roberto;1511;3N;30;LE;020184;0;118711;m -MAGGIO Sandro;1574;3N;30;LE;070973;0;114937;m -MATAJ Taulant;1580;3N;30;LE;190585;0;113641;m -NUTRICATO Fabio;1580;3N;30;LE;080685;0;120160;m -MARINELLI Mauro;1547;3N;30;MC;300479;0;118595;m -GIANFELICI Bruno;1508;3N;30;MC;151152;0;109797;m -PELAGALLI Marco;1625;2N;30;MC;070591;0;108237;m -CIRELLI Ivan;1628;2N;30;PZ;220893;0;112083;m -AMBROSINO Anselmo;1643;2N;30;PZ;200267;0;119178;m -DE-LUCA Alessandro;1510;3N;30;CT;260873;0;119142;m -FOTI Salvatore;1438;3N;30;CT;290883;0;118461;m -GAMBITTA Salvatore D;1580;3N;30;CT;061277;0;119144;m -AUGUGLIARO Giacomo;1336;3N;30;CT;120735;0;109602;m -JORDAN Chris;1679;2N;30;MN;010150;0;111092;m -PRENLEOLUP Sergio;1594;2N;30;FI;130748;0;120199;m -BALERCIA Giacomo;1520;3N;30;AN;230292;0;118647;m -SENIGAGLIESI Eros;1695;2N;30;MC;271186;0;112900;m -MARAZZI Dominic;1679;2N;30;PV;301088;0;118099;m -CIVILOTTI Roberto;1610;2N;30;VT;171070;0;120201;m -RAMAIOLI Nicolas;1472;3N;30;PU;050490;0;115456;m -FAINI Marco;1545;2N;30;AN;180588;0;117685;m -PALMILI Andrea;1580;3N;30;MC;160189;0;118627;m -TAGLIONE Stefano;1667;2N;30;LI;260187;0;114544;m -GROMOVS Sergejs;2314;FM;0;EE;151265;811394;121317;m -WESTERMANN Robin;1580;3N;30;EE;;0;9712;m -MELILLO Marcello;1700;2N;30;CB;060962;0;103897;m -DEFRONZO Andrea;1724;2N;30;BA;150186;0;120287;m -DEL-MASTRO Marco;1697;2N;30;BA;181170;0;120289;m -MARCARELLI Ermenegil;1562;3N;30;BN;290168;0;115542;m -VERNATA Alessandro;1620;2N;30;RM;091285;0;112802;m -LAURENTI Stefano;2030;CM;0;VC;070488;823589;117316;m -PALADINO Giovanni;1760;2N;30;NA;230488;0;116638;m -ANCORA Marco;1622;2N;30;TO;090388;0;116357;m -MARINO Davide;1583;3N;30;TP;280993;0;117668;m -VISENTIN Daniele;1638;2N;30;VE;280988;0;110767;m -STEINEGGER Verena;1532;3N;30;BZ;280187;0;109564;m -ALBERGHINI Aurora;1541;3N;30;BO;080688;0;101618;f -GUIDOTTI Giulia;1504;3N;30;LU;150887;0;113841;f -VENEZIAN Fabio;1582;3N;30;VE;240489;0;110766;m -DREZZADORE Dario;2079;CM;0;TV;300889;819662;116072;m -DVIRNYY Daniyyl;2280;-M;0;TV;211090;817570;118401;m -USSARDI Gregorio;1499;2N;30;TV;010289;0;116070;m -LONDERO Marco;1514;2N;30;BL;300190;0;105052;m -GAMPER Hannes;1700;2N;30;BZ;300390;0;113326;m -TORRE Carlo;1631;2N;30;NA;030990;0;115760;m -BUGELLI Edoardo;1586;2N;30;FE;100490;0;100744;m -COATTI Nicola;1517;3N;30;FE;030590;0;113151;m -MONTI Filippo;1559;3N;30;FE;070690;0;100749;m -D'ASCANIO Davide;1622;2N;30;TS;050590;0;113534;m -LIGAS Simone;1679;2N;30;CA;050290;0;116618;m -FRATTEGIANI Simone;1698;2N;30;PG;031190;0;117835;m -SCHENAL Giacomo;1640;2N;30;BL;040990;0;108543;m -ROSSI Luigi;1429;3N;30;PG;201090;0;116909;m -CASSON Andrea;1508;3N;30;VE;050490;0;103321;m -ROSSI Linda;1493;3N;30;AR;201090;0;119303;f -COSTANTINI Marco;1700;2N;30;PE;040591;0;101795;m -GAD Ahmad;1712;2N;30;CS;280591;0;116278;m -GALLO Davide;1580;3N;30;CS;180191;0;119689;m -SFERA Mattia;1781;2N;30;MO;310791;0;113137;m -GATTI Marco;1526;3N;30;UD;210792;0;115117;m -TRENTO Giacomo;1552;3N;30;PN;180291;0;115296;m -GUGLIELMOTTO Grazian;1426;3N;30;IM;170292;0;116536;m -PESCE Gabriele;2006;CM;0;SV;040691;824380;116018;m -MIGLIETTA Manuel;1613;2N;30;TO;010292;0;120089;m -LOBINA Massimo;1452;3N;30;CA;170691;0;116609;m -CROCI Roberto;1562;3N;30;ME;180892;0;116693;m -PALLERI Giordano;1586;2N;30;PG;100391;0;113512;m -FABIANI Lino;1700;2N;30;BS;100591;0;111636;m -POMARO Alberto;2046;CM;0;PD;270292;822450;118166;m -POMPONIO Mattia;1667;2N;30;VE;110591;0;117049;m -PASQUALI Andrea;1642;2N;30;BL;261191;0;118440;m -CIET Marco;1553;2N;30;BL;180291;0;105066;m -FORTI Riccardo;1501;3N;30;PG;031292;0;114683;m -COSTARIOL Elena;1516;2N;0;GO;300592;825000;118377;f -ALCIDE Fabio;1616;2N;30;TP;201289;0;117666;m -BADELLINO Ilaria;1556;3N;30;IM;130392;0;116527;f -DIZORZ Marco;1535;3N;30;GO;101166;0;105531;m -PALTRINIERI Nicholas;1817;1N;30;BZ;240595;0;114280;m -PESERICO Francesco;1580;3N;30;;;0;9768;m -GHIRARDINI Giorgio;1592;2N;30;PR;170293;0;108727;m -MARGUERETTAZ Davy;1700;2N;30;AO;110194;0;118424;m -FAGNANI Alessandro;1593;2N;30;BO;250195;0;116228;m -VEZZELLI Francesco;1519;3N;30;MO;230194;0;117658;m -ACCIARINI Dario;1534;3N;30;PG;070294;0;119298;m -FALCONI Massimo;1627;2N;30;VR;270893;0;114525;m -ROSOLIA Guglielmo;1370;3N;30;CT;031293;0;118368;m -SOPRALI Edoardo;1564;3N;30;VR;140793;0;114527;m -VENTURELLI Miriam;1517;3N;30;MO;201293;0;115900;f -FUSTINI Chiara;1694;2N;30;LU;030593;0;112486;f -STORCK Eike-Werner;1915;;0;EE;120767;0;9779;m -VAN DEN BOOMEN Ronny;1800;;0;EE;;0;9780;m -ELIENS Arno;2000;;0;EE;;0;9782;m -TRABUCCO-CAMPOS Andr;1922;1N;30;PI;161287;0;114391;m -KNOTTNER Klaus;1560;3N;30;BZ;210255;0;120277;m -CIOFFI Luigi;1735;1N;0;FR;050944;825786;120298;m -HENKEL Ralf;1888;1N;30;EE;;0;9788;m -ZERBO Igor;1577;3N;30;PG;010976;0;120303;m -SOKOLOVSKA Jitka;1599;3N;30;EE;;0;9791;f -KOSTALEK Otakar;1583;2N;30;EE;;0;9792;m -BERTIN Aurelio;1634;2N;30;VE;130184;0;120209;m -LANZILLOTTA Daniele;1655;2N;30;IM;240191;0;118637;m -SCHULZ Joachim;1580;3N;30;EE;;0;9795;m -FRUIANO Salvatore;1536;3N;30;SS;140982;0;120241;m -VARGIU Salvatore;1587;3N;30;OR;171273;0;119837;m -SANNA Sandro;1493;3N;30;SS;120170;0;115616;m -SAEED Ahmad;1900;1N;30;EE;;0;9802;m -ALMARZOKI Abdulla;1700;2N;30;EE;;0;9804;m -MOHAMMAD Ibraheem M.;1700;2N;30;EE;;0;9806;m -EDREES Abdulla;1700;2N;30;EE;;0;9807;m -KHALED Ahmad;1700;2N;30;EE;;0;9808;m -SALEM Omart;1700;2N;30;EE;;0;9809;m -ZAYED Ali;1700;2N;30;EE;;0;9810;m -ASHLEY Mark;1700;2N;30;EE;;0;9811;m -FIORE Antonio;1739;2N;30;PZ;140157;0;120269;m -BASILE Luca;1640;2N;30;BA;190990;0;107658;m -DAMATO Antonio;1553;3N;30;BA;250388;0;116730;m -DE-PALMA Michele;1763;2N;30;BA;060791;0;112455;m -PAULOVICH Adriano;1685;2N;30;MI;200568;0;117424;m -GERALI Paolo;1866;1N;30;BG;220561;0;120208;m -GROSSI Enrico;1565;3N;30;MN;130459;0;120234;m -MILANTA Arnaldo;1772;2N;30;VA;010144;0;103978;m -CARLETTI Adriano;1775;1N;30;AP;140761;0;118706;m -CORINALDESI Massimo;1580;3N;30;AN;150363;0;120229;m -PRUTOVOY Alexey;1580;3N;30;EE;;0;9826;m -ANTONELLINI Giada;1490;3N;30;RA;120293;0;116216;f -PULCINI Giorgio;1659;2N;30;BG;140388;0;114153;m -CONCA Mauro;1544;2N;30;CR;091064;0;117548;m -GALLUCCI Roberto;1484;3N;30;RM;240381;0;104358;m -ABBIATI Gianluigi;1437;3N;30;LO;280964;0;117984;m -DE-VENUTO Raffaele;1520;3N;30;BA;160660;0;117199;m -DI-LORETO Fabio;1580;3N;30;AQ;130175;0;114078;m -CERAMI Antonino;1335;NC;30;TP;221276;0;100226;m -PELLEGRINO Mario;1556;3N;30;TP;110487;0;114037;m -DI-GIROLAMO Domenico;1591;2N;30;TP;280678;0;117109;m -ZANABONI Alessandra;1617;2N;30;LC;220465;0;107057;f -ERMACORA Cristiano;1596;3N;30;TO;280868;0;104835;m -BELLELLI Ettore;1703;2N;30;MN;231275;0;120272;m -GHETTI Romano;1715;2N;30;FC;281169;0;120275;m -QUATTRINI Massimo;1742;2N;30;BO;141171;0;120278;m -POLI Diego;1646;2N;30;TS;300673;0;115466;m -IMBURGIA Giuseppe;1572;3N;30;TP;190689;0;119242;m -DI-LIBERTI Ivan;1689;2N;30;TP;170492;0;115865;m -CHIAPPINI Saturnino;1499;3N;30;AP;211145;0;117341;m -RAPETTI Juan-Batista;1556;3N;30;AP;150388;0;119581;m -ARMANDI Nazzareno;1607;2N;30;AP;170447;0;117327;m -LIBETTI Francesco;1502;3N;30;AP;080641;0;117330;m -MUSCARA' Ilaria;1505;3N;30;PN;030591;0;115283;f -TAMAI Marco;1541;2N;30;UD;160393;0;112351;m -FINELLI Amedeo;1613;2N;30;CE;280561;0;120315;m -MORVILLO Sabatino;1514;3N;30;NA;150182;0;111267;m -NUCCIO Walter;1607;2N;30;NA;070975;0;118754;m -VITIELLO Giovanni;1658;2N;30;SA;190756;0;120316;m -PRESTIPINO Angelo;1580;3N;30;ME;200341;0;114415;m -MELLINI Fabio;1580;3N;30;VT;191062;0;119843;m -MARTIGNAGO Guido Mar;1544;3N;30;TV;110292;0;116160;m -LAURIA Daniele;1507;3N;30;BG;160977;0;120206;m -CORSINO Giulio;1664;2N;30;PA;160492;0;118037;m -TODARO Adriano;1580;3N;30;PA;200789;0;117162;m -DE-LELLA Davide;1679;2N;30;BA;310873;0;120150;m -COLASANTI Ombretta;1525;3N;30;BA;041184;0;109383;f -ORLOVA Inna;2017;CM;0;EE;;816523;9866;f -GHELFI Giancarlo;1604;2N;30;CO;010346;0;103506;m -CAMPANINI Ambrogio;1544;3N;30;CO;100432;0;103523;m -BONGINI Mauro;1578;3N;30;CO;110267;0;103517;m -ZANCHETTA Giuseppe;1580;3N;30;PV;030954;0;105178;m -GRANOZIO Edoardo;1580;3N;30;PV;100445;0;110857;m -NYGARD Per;2100;CM;0;EE;;0;9873;m -OMARI Fatos;2135;-M;0;EE;;0;9874;m -FAINSTEIN Vladimir;2050;CM;0;EE;;816310;9875;m -FAULAND Paulina;1741;;0;EE;;0;9880;f -MUELLER Falk;2172;CM;0;EE;;816507;9882;m -ROZEWICZ Joseph;1894;;0;EE;;0;9883;m -LERAY Jean-Claude;1764;1N;0;EE;;0;9886;m -DURRIEUR Etiennette;1147;;30;EE;;0;9889;f -MAROUBY Michel;2005;;0;EE;;0;9892;m -SILARI Andrea;1728;2N;0;MI;240164;827835;120332;m -FINOCCHIARO Gianluca;1986;CM;0;TO;060490;822051;120120;m -BAGNOLI Paolo;1724;2N;30;MI;290541;0;117509;m -NOSSA Mauro;1640;2N;30;VA;161051;0;114385;m -KOKOSAR Oliviero;1481;3N;30;MI;250841;0;117950;m -PANISSIDI Gabriele;1580;3N;30;ME;170792;0;115962;m -GISMONDO Flavio;1580;3N;30;ME;240392;0;115961;m -NANIA Alberto;1722;2N;30;ME;241087;0;119311;m -SPINA Filippo;1551;3N;30;ME;120590;0;117221;m -TAGLIALATELA Massimi;2012;CM;0;NA;050777;824690;120427;m -ZIRILLI Raimondo;1592;3N;30;NA;190670;0;120362;m -SILVESTRE Antonio;1697;2N;30;NA;180169;0;118879;m -DE-MEO Enea;1443;3N;30;LT;310890;0;119460;m -MONTI Giuseppe;1684;1N;30;NA;120870;0;120426;m -PINTO Domenico;1580;3N;30;KR;071276;0;113042;m -CIOCE Enrico;1908;1N;0;RM;220182;817775;117827;m -MAZZONI Riccardo;1700;2N;30;RM;191182;0;9916;m -LELLI Adriano;1933;1N;0;RM;290488;818313;121496;m -MILITELLO Roberto;1802;1N;0;RM;220562;821055;121488;m -GUARINI Stefano;1787;2N;30;RM;220258;0;9919;m -VELARDO Valerio;1572;3N;30;RM;290585;0;9920;m -FURNARI Franco;1693;2N;30;CT;170789;0;111537;m -CHINDEMI Vincenzo;1502;3N;30;SR;170687;0;106612;m -FRAGAPANE Biagio;1544;3N;30;;;0;120471;m -OCCHIPINTI Daniele;1691;2N;30;AG;020382;0;120473;m -CASALI Fabio;1538;3N;30;RM;190366;0;118130;m -TAVANI Paolo;2002;CM;0;RM;020955;816647;120423;m -MARTUSCELLI Ivan;1556;3N;30;TO;310188;0;120390;m -DONNINI Fosco;1538;3N;30;TO;301270;0;114942;m -PIETRABISSA Angelo;1559;2N;30;MI;270468;0;120388;m -MEYTS Adolph;1589;2N;30;EE;;0;9933;m -IELAPI Gianbattista;1602;2N;30;CS;190691;0;119679;m -CHIANTERA Stefano;1571;3N;30;TA;261274;0;116342;m -BARLUZZI Luciano;1544;2N;30;PG;280492;0;118150;m -TRASCIATTI Mirko;1748;2N;30;PG;051190;0;118149;m -CARDINALE Francesco;1546;3N;30;PA;300785;0;108465;m -AGNELLO Fabio;1652;2N;30;PA;230191;0;108417;m -CASSATA Salvatore;1661;2N;30;PA;170574;0;118012;m -MONTALBANO Calogero;1574;3N;30;TP;220668;0;107113;m -APOLLO Vincenzo;1547;3N;30;TP;260491;0;117478;m -CALAFATO Roberto;1558;3N;30;TP;141189;0;117464;m -CRASTO Antonino;1580;3N;30;TP;110691;0;117479;m -GAROFALO Simone;1874;1N;0;FI;250772;826014;120415;m -BURBI Marco;1793;1N;30;FI;131159;0;117582;m -BALDI Iuri;1622;2N;30;PT;071162;0;106015;m -BECONCINI Simone;1506;3N;30;FI;040574;0;120414;m -CROCI Iacopo;1574;3N;30;LU;110382;0;120352;m -GULINELLI Euro;1586;3N;30;RA;230750;0;120198;m -LAZZARIS Paolo;1718;2N;30;SP;240763;0;119044;m -MONTERISI Ignazio;1570;2N;30;LI;280738;0;110430;m -OROFINO Massimo;1514;3N;30;LI;160676;0;103949;m -SCUDIERI Sandro;1469;3N;30;SS;031264;0;120712;m -TAMASSIA Paolo Fabio;1580;3N;30;MN;260265;0;120436;m -MARGARIUS Leonid;2121;CM;30;TN;180251;0;120469;m -SWINKELS Maurice;1572;3N;30;EE;;0;9962;m -BEN-HOUIDI Lassaad;1599;3N;30;EE;;0;9963;m -LINZ Stefan;1584;3N;30;EE;;0;9964;m -KERN Beat;1733;2N;30;EE;;0;9965;m -CATANIA Cesare Augus;1800;1N;30;EE;;0;9966;m -BURG Henk;1900;1N;30;EE;;0;9967;m -BARTIROMO Gerardo;1595;2N;30;VR;160550;0;120461;m -DE-VIGILI Carlo;1580;3N;30;TN;120249;0;120394;m -GRIBOV Evgeni;2100;CM;30;EE;;0;9970;m -DOMENICHELLI Serafin;1778;1N;30;TO;040339;0;120438;m -CAPONE Franco;1571;3N;30;IS;051049;0;120132;m -PLAUCAK Martin;1700;2N;30;EE;;0;9974;m -CALMIERI Carmine;1580;3N;30;SA;070958;0;9976;m -MESSINA Roberta;1859;1N;0;SA;170493;819018;118557;f -BRUN Dario;2040;CM;0;GE;180685;822582;121057;m -MILIC Prvoslav;1532;3N;30;TS;;0;9979;m -BUZZURRO Mario;1724;2N;30;TS;200770;0;118740;m -CASTELLI Giuliano;1580;3N;30;TS;191070;0;120445;m -LAPORNIK Robert;1580;3N;30;GO;110742;0;120454;m -URBISAGLIA Elvio;1430;3N;30;TS;230738;0;110069;m -ULE Roberto;1580;3N;30;TS;250656;0;120451;m -BURATTINI Dario;1580;3N;30;TS;110454;0;120444;m -ANTONELLI Alessandro;1760;2N;30;PE;190276;0;120492;m -DI-CENSO Angelo;1660;2N;30;PE;130790;0;112847;m -FRATICELLI Simone;1566;3N;30;PE;101090;0;112079;m -IMPARATO Davide;1694;2N;30;PE;281185;0;121540;m -BERGONZONI Carlo;1506;3N;30;MI;060658;0;116491;m -MERCALLI Enrico;1580;3N;30;NO;240574;0;120470;m -BASCIUTTI Thomas;1580;3N;30;VE;220783;0;106672;m -OLIVARI Laura;1580;3N;30;NO;040785;0;109208;f -CREOLA Aurelio;1483;3N;30;NO;140872;0;110461;m -CASELLA Vincenzo;1527;3N;30;CO;051064;0;117621;m -LANDINI Luca;1649;2N;30;PT;240566;0;117112;m -CATALDO Giancarlo;1544;3N;30;PT;241164;0;109206;m -RASTELLI Simone;1712;2N;30;PT;210466;0;109203;m -GRANDI Davide;1691;2N;30;MO;140475;0;117306;m -BARBIERI Giacomo;1550;3N;30;MO;270888;0;116658;m -CARILLO Simone;1577;3N;30;MO;250193;0;115898;m -BARBIERI Davide;1511;3N;30;MO;220989;0;116657;m -BRUNO Riccardo;1634;2N;30;BG;030471;0;104969;m -ORSUCCI Marzio;1583;3N;30;MI;020347;0;103024;m -SEU Antonio;1427;3N;30;NU;270640;0;104498;m -FOIS Ignazio;1580;3N;30;CA;080456;0;114244;m -SIDDI Stefano;1475;3N;30;CA;091262;0;112071;m -ORZELLA Paolo;1523;3N;30;CA;260868;0;114975;m -ORRU' Cristian;1580;3N;30;CA;240885;0;109188;m -CASSANESE Riccardo;1485;3N;30;RM;250569;0;118072;m -ZANCHI Sandro;1700;2N;30;SI;170956;0;116493;m -BELLI Stefano;1535;3N;30;PO;020867;0;117274;m -COLOMBO Luca;1685;2N;30;LC;290381;0;120282;m -BARASTI Lorenzo;1682;2N;30;PD;220785;0;113666;m -GARDIN Michel;1700;2N;30;TV;280680;0;120483;m -NERI Claudio;1478;2N;30;VR;261162;0;118245;m -BONINI Roberto;1862;1N;0;VR;020463;820652;120369;m -MARIOTTI Vincenzo;1546;3N;30;VR;130753;0;100963;m -ADAMI Igor;1631;2N;30;VR;080480;0;114033;m -POLATO Mirko;1724;2N;30;PD;170588;0;120144;m -VASTANO Ciro;1625;2N;30;PD;070468;0;103359;m -APUZZO Stefano;1497;3N;30;TN;120390;0;106186;m -MILI Dhimitraq;1580;3N;30;EE;300476;0;10023;m -YOU Zi Chih Stefano;2038;CM;0;VE;200689;824720;120501;m -GRECO Armando;1520;3N;30;FI;011257;0;114740;m -MARIANI Gabriele;1556;3N;30;LU;050379;0;120409;m -MANNI Arnaldo;1655;2N;30;FI;210159;0;116397;m -TAMBURRINI Pierluigi;1679;2N;30;VE;150274;0;115805;m -PEZZOTTA Gianfranco;1538;3N;30;BG;110947;0;101682;m -LOCATELLI Alberto;1502;3N;30;BG;271163;0;114672;m -CALDIERI Carmine;1545;3N;30;SA;070958;0;120486;m -D'ORIO Eugenio;1673;2N;30;NA;240288;0;118561;m -DI-GERONIMO Enrico;1700;2N;30;SA;0;0;10033;m -PAPPALARDO Dario;1610;2N;30;NA;230268;0;105623;m -CAIRO Serge;1655;2N;30;EE;0;0;10035;m -DI-VIA Saverio;1613;2N;30;TP;140790;0;118284;m -MOROSO Giuliano;1619;2N;30;VB;070846;0;120392;m -SCHIRALDI Walter;1664;2N;30;VR;281182;0;100965;m -FIORENTINI Mauro;1897;1N;30;MI;0;0;120523;m -BERTAZZOLI Giulio;1748;2N;0;MI;0;818917;120512;m -POZZATO Francesco;1570;3N;30;BL;060278;0;103146;m -CIVITAREALE Alberto;1673;2N;30;VE;021061;0;115064;m -ISPANO Alessandro;1640;2N;30;MI;081184;0;120331;m -CASTELLANO Antonio;1538;3N;30;MI;020154;0;117133;m -ZANON Michele;1580;3N;30;VE;200670;0;118688;m -FIORILI Roberto;1934;1N;0;MI;0;823520;120515;m -UGOLINI Andrea;1583;3N;30;MI;121184;0;120516;m -PETRUCCI Mario;1798;1N;30;RM;300640;0;102377;m -DE-CLEMENTE Davide;1556;3N;30;RM;0;0;10049;m -LAPIANA Massimo;1700;2N;30;RM;090450;0;102139;m -LISI Davide;1954;1N;0;RM;010693;822388;119329;m -MELISSA Raffaello;1598;2N;30;RM;270679;0;122562;m -LUONGO Antonio;1535;2N;30;BN;170663;0;115538;m -GORGOGLIONE Enrico;1673;2N;30;BA;140988;0;116717;m -CAMPESE Andrea;1742;2N;30;BA;100990;0;120267;m -DE-FAZIO Elvira;1580;3N;30;BA;271059;0;10056;f -DI-BELLO Nicol;1832;1N;30;BA;311087;0;104378;m -FORNI Davide;1556;2N;30;BA;070292;0;121943;m -GUERRA Maurizio;1703;2N;30;BA;230576;0;121938;m -MALIZIA Antonio;1619;2N;30;BA;131192;0;121944;m -PALMITESSA Irene;1643;2N;30;BA;251088;0;121945;f -GIANNONE Alessandro;1563;3N;30;TO;030579;0;120439;m -DI-BLASI Erica;1547;3N;30;TO;301183;0;117536;f -LOMAKINA Nadya;1888;1N;0;EE;200184;819760;121183;f -CAVIRANI Giuseppe;1640;2N;30;LU;191255;0;106051;m -BERNARDINI Massimili;1715;2N;30;PT;050171;0;121420;m -ATHANASIADIS Panagio;1769;2N;30;PU;081284;0;117945;m -LIPERNI Augusto;1595;2N;30;PU;281168;0;101830;m -BRENCO Marco;1892;1N;30;GE;160165;0;120636;m -CECCHI Giuseppe;1736;2N;30;GE;010146;0;117795;m -DONZELLA Daniele;1547;3N;30;UD;140775;0;120661;m -MALTESE Antonino;1556;3N;30;TP;210751;0;105777;m -FORTE Paolo;1700;2N;30;TP;081171;0;113541;m -GALLO Paolo;1580;3N;30;NA;240369;0;120360;m -ACCARDO Giovanni;1427;3N;30;NA;031084;0;120358;m -MARANO Daniele;1637;2N;30;SS;300366;0;119041;m -COCCO Corrado;1580;3N;30;SS;070579;0;120397;m -CARTA Samuele;1514;3N;30;SS;200889;0;117257;m -ARMELLINI Giuliano;1730;2N;30;UD;170472;0;114211;m -COZZARIN Davide;2062;CM;0;PN;110288;824020;115586;m -ZURINI Paolo;1544;3N;30;TS;011091;0;103783;m -DE-GIORGI Carlo;1586;3N;30;LE;080689;0;120166;m -DELISI Marco;1556;3N;30;LE;070761;0;109667;m -MONTAGNA Michele;1532;3N;30;LE;010890;0;105384;m -LAUDISA Antonio;1547;3N;30;LE;130391;0;116871;m -SANTORO Alberto;1580;3N;30;LE;221085;0;109834;m -QUARTA Cosimo;1580;3N;30;LE;030759;0;101302;m -PAGLIALUNGA Giuseppe;1580;3N;30;LE;010571;0;101303;m -MELE Rocco;1628;2N;30;LE;221088;0;112946;m -PIRELLI Fabrizio;1700;2N;30;LE;070178;0;120163;m -DAMANTI Mauro;1546;3N;30;SO;150263;0;107478;m -DIGIOVINAZZO Antonio;1580;3N;30;MI;290844;0;100080;m -CARDOLA Luca;1700;2N;30;AP;240864;0;123752;m -PIERGENTILI Roberto;1661;2N;30;AP;010668;0;120227;m -CAVAZZI Enrico;1599;3N;30;GE;060565;0;118669;m -ARMENISE Nicola;1700;2N;30;LE;030756;0;105646;m -DE-GREGORIS Piero;1646;2N;30;TV;200456;0;121140;m -CASELLATO Alberto;1580;3N;30;TV;150666;0;114657;m -PAVON Fabio;1673;2N;30;VE;070989;0;103096;m -POSCHUSTA Werner;2070;CM;0;EE;;817104;10100;m -POSTOLACHI Gregorie;2100;CM;30;EE;;0;10101;m -BASCHIROTTO Marco;1637;2N;30;VI;080372;0;122678;m -ROSSO-COLLETTI Aless;1592;3N;30;VR;230462;0;101545;m -MARTINELLI Franco;1514;3N;30;VR;170656;0;101544;m -RENGEVAL Sthephane;1580;3N;30;EE;;0;10105;m -WICKERTSHEIM Frank;1800;1N;30;EE;;0;10106;m -SENESI Glauco;1679;2N;30;RM;070763;0;105444;m -MATEI Cristian;1694;2N;30;TN;250661;0;10108;m -RUEGSEGGER Beat;2150;CM;30;EE;;0;10109;m -TESCARO Stefano;1993;1N;0;VI;200759;819433;120544;m -GASPARETTO Gianluca;1570;3N;30;TV;020790;0;106453;m -FERRARESE Eugenio;1487;3N;30;VE;030357;0;115216;m -CASSOL Michele;1673;2N;30;BL;280589;0;109544;m -SUBOTIC Nenad;1626;2N;30;EE;;0;10114;m -CECCHETTO Fabio;1886;1N;0;RM;131162;817066;121483;m -TODORO Claudio;1546;3N;30;RM;281064;0;100957;m -FARAH Alberto;1643;2N;30;LT;010185;0;123066;m -PASSACANTILLI Alessa;1556;2N;30;RM;010173;0;117091;m -DINI Andrea;1930;1N;0;RM;290990;819638;119009;m -DE-ANGELIS Roberto;1700;2N;30;RM;180766;0;10120;m -ANGELILLIS Nicola;2070;CM;0;FG;190789;823252;122683;m -DI-CANDIA Roberto;1742;2N;30;FG;241086;0;122680;m -MERENDINO Ignazio;1523;2N;30;PA;090492;0;113266;m -TARANTINO Francesco;1682;2N;30;PA;300684;0;117300;m -FELICETTI Raffaele;1700;2N;30;CZ;110193;0;121566;m -PALLONE Francesco;1700;2N;30;CZ;;0;121571;m -PICCOLI Vincenzo;1700;2N;30;CZ;;0;121573;m -CURSI Nicola;1536;3N;30;BO;070160;0;116218;m -PELAGALLI Carlo;1727;2N;30;BO;251153;0;120580;m -ZINI Marco;1679;2N;30;BO;070363;0;113855;m -MELOGRANI Francesco;1676;2N;30;TP;220186;0;120632;m -MUNAFO' Natale;1580;3N;30;ME;211166;0;119168;m -PATERNITI-ISABELLA A;1580;3N;30;ME;090355;0;117399;m -GIUFFRE' Gaetano;1580;3N;30;ME;270551;0;117397;m -FORTUNATO Emiddio;1598;2N;30;ME;160545;0;120644;m -DRAGANOV Filip;1715;2N;30;MN;131081;0;120421;m -LA-VENIA Stefano;1754;2N;30;MN;011276;0;120673;m -ANSERINI Alberto;1580;3N;30;MN;100767;0;120420;m -GENOVESE Fortunato;1541;2N;30;CT;120958;0;120762;m -FILIGNANO Fabio;1610;2N;30;CT;071176;0;117153;m -PITTELLA Massimo;1700;2N;30;MI;120658;0;117520;m -DAL-LAGO Emilio;1517;3N;30;LC;130650;0;112232;m -LO-MAN;1580;3N;30;LC;;0;10143;m -DA-SILVA Carlos;1619;2N;30;LC;060762;0;107061;m -GEROSA Giovanni;1634;2N;30;LC;090776;0;107043;m -DI-ZANNI Leonardo;1619;2N;30;LC;180967;0;120286;m -REDAMANTI Alessio;1538;3N;30;BI;281289;0;113230;m -LICCO Nunzio;1700;2N;30;BI;121239;0;117566;m -AUTINO Massimiliano;1661;2N;30;VC;100380;0;119065;m -PEPARINI Paolo;1692;2N;30;SP;160559;0;103655;m -MANZINI Raimondo;1646;2N;30;SP;100761;0;121207;m -GNETTI Pietro;1520;3N;30;SP;210950;0;114117;m -SPINETTA Gianni;1580;2N;30;SP;021253;0;117792;m -ANGELONI Alessandro;1619;2N;30;AN;051250;0;120195;m -NICOLOSI Daniele;2029;CM;0;PA;140989;824089;117893;m -DAL-POGGETTO Paolo;1751;2N;30;;;0;121217;m -SANTUCCI Daniele;1478;3N;30;LU;190893;0;117278;m -MEI Nicola;1565;2N;30;LU;070592;0;116314;m -AMANTI Francesco;1550;3N;30;LU;310391;0;120418;m -PAOLINELLI Riccardo;1541;3N;30;LU;270755;0;107245;m -SOLISIO Carlo;1712;2N;30;GE;090458;0;121059;m -GARDI Riccardo;1580;2N;30;BO;020887;0;120690;m -ANDRUCCIOLI Daniele;1688;2N;30;RN;070680;0;120988;m -PALMIERI Luigi;1601;2N;30;FG;;0;10164;m -BRINI Gianfranco;1490;3N;30;BO;080456;0;120686;m -DE-AGOSTINI Mattia;1679;2N;30;BO;040392;0;116212;m -PETRUCCI Gianluca;1676;2N;30;RM;070573;0;102157;m -BAGHIROV Anar;1985;CM;30;EE;;0;10168;m -KUEHNEL Marcus;1888;1N;30;EE;;0;10169;m -BARBOS Alexandru;1858;1N;30;EE;;0;10170;m -OGNIBENE Piero;1745;2N;30;TR;081055;0;109282;m -SCLIPPA Federica;1556;3N;30;PG;210589;0;118147;f -VITALI Roberto;1556;3N;30;PG;271069;0;116013;m -GIACHINO Claudio R.;1515;3N;30;AO;050380;0;117216;m -LAVRIC Mihail;2012;CM;0;EE;261054;817708;122707;m -CASU Antonio;1580;3N;30;SS;190159;0;117451;m -MIGONI Giansimone;1586;2N;30;SS;070670;0;121156;m -COSSU Mario;1580;3N;30;SS;081178;0;121153;m -COCCO Vittorio;1514;3N;30;SS;070959;0;120708;m -BENINTENDE Vittorio;1607;2N;30;CZ;270676;0;121579;m -MAGNOLFI Riccardo;1580;3N;30;PT;110666;0;120775;m -DEMAGISTRI Gigi;1662;2N;30;TO;290160;0;118539;m -DE-GAETANO Luca;1580;3N;30;CS;161186;0;109161;m -BIANCO Danilo;1517;3N;30;CS;151291;0;116276;m -MARINCOLO Piercarlo;1727;2N;30;CS;181090;0;116250;m -SALVO Vincenzo;1730;2N;30;CS;241089;0;119678;m -MOLTENI Andrea;1580;3N;30;MI;020385;0;120667;m -MAMMOLITI Francesco;1768;2N;0;RM;200155;822418;118583;m -TOGNOTTI Andrea;1445;3N;30;RM;120563;0;121046;m -PAGANO Daniele;1526;2N;30;RM;031068;0;121490;m -RIZZACASA Alessandro;1541;3N;30;LI;150760;0;121100;m -LEONE Valerio;1580;3N;30;LI;150879;0;114259;m -MASI Valerio;1463;3N;30;LI;210889;0;110648;m -SENESI Paolo;1649;2N;30;LI;021150;0;109761;m -VRAMI Ymer;1706;2N;30;LI;180963;0;117448;m -BORIANO Giuseppe;1601;2N;30;AT;300866;0;105310;m -LI-GRECI Giovanni;1688;2N;30;AT;201069;0;118766;m -TURCHETTA Gianluca;1584;3N;30;AT;070768;0;112592;m -MARTUSCELLI Gaetano;1580;3N;30;TO;210163;0;120389;m -DI-CHIARA Mauro;1721;2N;30;TO;050680;0;120599;m -DEMAGISTRI Edoardo;1580;3N;30;TO;160389;0;120868;m -OCCHINEGRO Andrea;1580;3N;30;BA;071270;0;10202;m -LAGRASTA Fedele;1580;3N;30;BA;050579;0;107655;m -TEDESCHI Felice Albe;1580;3N;30;BA;270458;0;10204;m -MATTIA Antonio;1580;3N;30;BA;010569;0;10205;m -CERRATO Daniele;1558;3N;30;NA;171071;0;120306;m -MASSERINI Simone;1589;3N;30;BG;010589;0;115697;m -JIRILLO Antonio;1613;2N;30;VR;240952;0;120892;m -CHIESA Roberto;1676;2N;0;VE;060665;824186;121688;m -ZOVIGHIAN Varham;1580;3N;30;VE;;0;10210;m -BREZING Thomas;2100;;30;EE;;0;10211;m -MAZZAGLIA Antonino;1523;2N;30;ME;240359;0;117777;m -GAVIOLI Fabrizio;1619;2N;30;PV;280463;0;121557;m -CALVI Giovanni;1580;3N;30;LC;310567;0;10214;m -GAMBADAURO Giovanni;1700;2N;30;ME;200890;0;119162;m -GIORDANO Alfredo;1682;2N;30;RM;000026;0;121495;m -DI-MONTE Ettore;1607;2N;30;NA;080986;0;113026;m -SANSO' Amedeo;1655;2N;30;NA;011149;0;121001;m -RADICE Mario;1811;1N;30;NA;261179;0;120307;m -SOMMA Antonio;1520;3N;30;NA;011061;0;120359;m -PRISCIANDARO Stefano;1580;3N;30;BI;070860;0;121341;m -CURINGA Mauro;1575;3N;30;BI;180951;0;102273;m -FERRETTI Alessandro;1733;2N;30;MO;240879;0;106819;m -BATTISTINI Matteo;2134;CM;0;PR;270972;823066;120685;m -CHIOVETTA Christian;1580;3N;30;CT;120775;0;115060;m -SALEMI Salvatore;1544;3N;30;SR;090287;0;111959;m -LANTE Silvio;1589;3N;30;CO;090949;0;121561;m -GRANDE Francesco;1541;3N;30;MT;230288;0;120043;m -CANNAVO' Antonino;1580;3N;30;ME;310354;0;117778;m -DI-MARCO Salvatore M;1496;3N;30;ME;020765;0;117784;m -DI-FRANCO Vincenzo;1580;3N;30;ME;270360;0;117779;m -DI-PIETRO Francesco;1580;3N;30;ME;221165;0;117782;m -RAZZANO Lorenzo;1906;1N;0;TO;130472;821764;120543;m -AMERI Vincent;1900;;0;EE;;0;10236;m -DENTI Fabio;1580;3N;30;PD;060986;0;121152;m -STAFIE Constantin;2117;CM;0;EE;;817899;10238;m -DUNAT Ivan-Andres;1700;2N;30;PD;280792;0;121078;m -CAPPELLETTI Alessand;1700;2N;30;FE;190283;0;117194;m -SINIGAGLIA Franco;1580;3N;30;PD;290561;0;117313;m -BARUZZO Fabio;1912;1N;30;PD;260160;0;106795;m -BIMBATTI Gian Carlos;2067;CM;30;TO;270265;0;121358;m -FARACI Libero;1622;2N;30;VB;011156;0;121348;m -FIZZOTTI Mario;1868;1N;0;NO;010658;825794;122567;m -LILLA Davide;1679;2N;30;VB;090684;0;116551;m -MARCHIORI Riccardo;1502;3N;30;MI;301291;0;120520;m -NASTASI Maurizio;1550;3N;30;MI;260459;0;120517;m -PISANI Gennaro;1382;3N;30;MI;190563;0;108248;m -COLAJANNI Fabio;1694;2N;30;PA;031176;0;120908;m -BRODOWSKI Leszek;1700;2N;30;BL;030653;0;121708;m -CARUSO Gaetano;1580;2N;30;BL;170841;0;105013;m -TRINCERI Calogero M.;1697;2N;30;BL;220791;0;105064;m -COLLAZZUOL Ilenia;1484;3N;30;BL;200389;0;116340;f -ARMENI Alberto;2053;CM;0;RM;140944;826626;121774;m -ZAVAGLIA Giuseppe;1886;1N;30;RC;310865;0;122175;m -INZANI Frediano;1574;3N;30;MI;281277;0;121260;m -DE-GAETANO Stefano;1546;3N;30;TP;060789;0;118529;m -DESTRO Vittorio;1706;2N;30;TO;240356;0;121831;m -CASTAGNINI Luca;1580;3N;30;TO;080584;0;114449;m -COSTABLOZ Giammarco;1595;3N;30;TO;300693;0;120538;m -MARTIN Patrik;1562;3N;30;TO;311088;0;109600;m -LAZZANO Pietro;1580;3N;30;MO;020158;0;121006;m -CARRETTONI Luciano;1700;2N;30;MI;220761;0;120681;m -CHIESA Matteo;1700;2N;30;MI;160884;0;113983;m -TESSIERI Anna Rita;1562;2N;30;LU;200489;0;120416;f -PICCINNI Flavia;1700;2N;30;LU;171286;0;120411;f -LANDUCCI Giulia;1472;3N;30;LU;310591;0;112487;f -PRINI Walter;1580;3N;30;CO;250657;0;103528;m -PRINI Roberto;1580;3N;30;CO;090349;0;103527;m -TABBONE Antonio;1580;3N;30;CO;091143;0;103515;m -FOGLI Antonio;1634;2N;30;CO;020774;0;121323;m -BUCCHI Andrea;1670;2N;30;RM;281175;0;120981;m -COLAZINGARI Claudio;1646;2N;30;RM;280670;0;120348;m -NASCA Andrea;1700;2N;30;RM;150489;0;119869;m -ALBERTINI Luca;1547;3N;30;RM;130592;0;112556;m -DI-CLAUDIO Simone;1580;3N;30;RM;270183;0;120843;m -PASTORE Cosmas;1649;2N;30;TR;241083;0;122763;m -OTTAVIANI Giovanni;1712;2N;30;VT;070774;0;121163;m -PILI Giangiuseppe;1628;2N;30;CA;201086;0;115819;m -MARONGIU Achille;1616;2N;30;CA;311062;0;121277;m -COSTI Giorgio;1676;2N;30;GE;070463;0;120864;m -FARINA Ubaldo;1600;2N;30;BR;010486;0;118956;m -DORONZO Mattia ;1461;NC;30;CN;061192;0;119644;m -TORRIONE William ;1846;1N;0;CN;130878;822906;117713;m -TEDESCO Anello ;1344;NC;30;CN;291055;0;105100;m -RUIU Nicola ;1635;2N;30;CA;080170;0;122959;m -TOLU Giancarlo ;1446;3N;30;CA;090640;0;10289;m -CHIESA Federico;1841;1N;30;BS;170181;0;122395;m -ZORZI Aristide;1766;2N;30;BS;190965;0;115871;m -COLZI Dante;1724;2N;30;BS;020166;0;122399;m -BRESCIANI Mauro;1580;3N;30;BS;210854;0;114552;m -CARINI Luca;1736;2N;30;PC;260371;0;122376;m -LEZZI Giuseppe;1625;2N;30;PC;280747;0;122365;m -SALVAGNO Aldo;1579;2N;30;SS;060345;0;120705;m -SABA Marco;1440;NC;30;SS;241070;0;120710;m -FOIS Massimiliano;1515;3N;30;SS;;0;10298;m -USAI Marco;1335;NC;30;SS;111033;0;120706;m -TESTA Adriano;1729;2N;0;RM;311094;823392;120987;m -TESTA Massimo;1365;NC;30;RM;081146;0;120983;m -CORONGIU Fabio;1563;3N;30;SS;060969;0;120709;m -PALMA Francesco;1571;3N;30;ME;130978;0;120922;m -MARINI Massimiliano;1538;3N;30;VT;050477;0;114226;m -CACCIACONTI Stefano;1526;3N;30;RM;181280;0;120774;m -LANFREDI Franco;1637;2N;30;MN;010463;0;121879;m -COSTA Gianluca;1700;2N;30;CR;290369;0;121877;m -SAVAZZI Fulvio;1535;3N;30;CR;140157;0;121875;m -ANDREASSI Luca ;1497;3N;30;RM;300470;0;122655;m -D'OTTAVI Fabrizio ;1326;NC;30;RM;260663;0;114832;m -SERMONETA Eugenio;1649;2N;30;RM;070465;0;102754;m -SPUNTARELLI Alberto ;1416;NC;30;RM;;0;10312;m -PIRAS Luca ;1404;NC;30;RM;170371;0;120425;m -PETRELLA Luciano Vit;1386;NC;30;RM;260954;0;112096;m -PALMA Marco ;1386;NC;30;RM;130363;0;121491;m -DELL'OSSO Giambattis;1476;NC;30;RM;300864;0;121775;m -PLOSCARU Stelian;1579;2N;30;EE;;0;10317;m -BLENGINO Luca;1688;2N;30;CN;270393;0;119642;m -CAMPAGNOLA Davide;1416;3N;30;TV;241192;0;116139;m -CAVERZAN Leonardo;1692;2N;30;TV;190692;0;117269;m -PERSEGONA Mattia;1473;NC;30;TV;150290;0;116150;m -ROMBALDONI Raffaello;1440;NC;30;PU;220623;0;121989;m -SCARANGELLA Luca;1509;3N;30;TV;211164;0;121319;m -FRANCO Leopoldo;1447;2N;30;VE;210648;0;101470;m -FREGOLON Gianluca;1440;NC;30;VI;120886;0;115780;m -FRANCALANCIA Giulio;1413;NC;30;PU;310853;0;117987;m -ROMBALDONI Sharon;1437;NC;30;PU;230495;0;119879;f -DE-ANGELIS Giulio;1625;2N;30;VE;230282;0;121062;m -MIHALCEA Vasile;1592;2N;30;TV;050367;0;122335;m -ACCURSO Simone;1338;NC;30;FI;300570;0;119030;m -BIANCHINI Aldo;1485;NC;30;FI;080562;0;117585;m -COCUZZI Edoardo;1689;2N;30;FI;170687;0;120505;m -DE-FILOMENO Simone;1687;2N;30;PO;180695;0;120778;m -DI-MAGGIO Nicola;1428;NC;30;FI;140167;0;115838;m -JOOSTEN Tomas;1593;2N;30;SI;270359;0;122285;m -LA-MANNA Angelo;1422;NC;30;FI;260470;0;115837;m -MANNORI Giampaolo;1473;3N;30;PT;050461;0;120776;m -SOLAZZO Carmine;1401;NC;30;PT;160751;0;122436;m -SOLAZZO Damiano;1614;2N;30;PT;050887;0;122437;m -SOLAZZO Francesco;1398;NC;30;PT;090155;0;122435;m -CARUCCI Bruno;1467;NC;30;CA;170249;0;121275;m -COSTANZA Pierpaolo;1500;3N;30;MT;131089;0;122710;m -IERONE Gioele;1605;2N;30;MT;221289;0;122711;m -LARDO Davide;1413;NC;30;MT;131289;0;122712;m -MARTELLO Alioshka;1500;3N;30;MT;241289;0;106730;m -BORRIELLO Antonio Sa;1453;1S;30;SA;280656;0;120487;m -MUNIZZI Ciro;1374;NC;30;NA;061186;0;121978;m -MUNIZZI Ciro J.;1371;NC;30;NA;030987;0;121979;m -FAMMIANO Giacomo;1677;2N;30;NA;010863;0;122716;m -LOPES Fulvio;1435;1S;30;NA;190490;0;109589;m -IACONO Marco;1509;3N;30;NA;280279;0;120635;m -CHIUMMO Sergio;1610;2N;30;NA;131072;0;121000;m -ACCARDO Pasquale;1416;NC;30;NA;261154;0;120357;m -ARENA Alessandro;1467;NC;30;AV;030965;0;120313;m -CANGIANO Antimo;1356;NC;30;CE;080237;0;111372;m -DI-MEGLIO Giovanni ;1395;3N;30;NA;040889;0;114092;m -LANDOLFI Corrado ;1368;NC;30;NA;170890;0;123009;m -NATANGELO Alessio ;1482;3N;30;NA;300687;0;112188;m -PARMA Vittorio ;1434;NC;30;NA;030190;0;110225;m -SANNINO Salvatore ;1410;NC;30;NA;090791;0;120894;m -STORNAIUOLO Antonio ;1542;3N;30;NA;010156;0;120428;m -TESONE Crescenzo ;1749;2N;30;NA;220366;0;122714;m -VINCESILAO Vito ;1329;NC;30;NA;260171;0;102077;m -BAROZZI Giorgio ;1401;NC;30;KR;190689;0;112787;m -MERCURIO Rosario ;1378;1S;30;CZ;110274;0;118483;m -BAGNOLI Luca ;1488;NC;30;PG;180775;0;124218;m -CAMPOSANO Antonio ;1371;NC;30;KR;231261;0;116030;m -CAMPOSANO Francesco ;1425;NC;30;KR;130287;0;108505;m -LE-ROSE Gennaro;1401;NC;30;KR;;0;10370;m -VARANO Francesco;1536;3N;30;RC;090490;0;112778;m -MACRI' Pasquale ;1425;NC;30;KR;310889;0;119784;m -MANCUSO Andrea ;1413;NC;30;KR;080888;0;119872;m -POLICASTRESE Domenic;1401;NC;30;KR;210887;0;116031;m -SPASARI Stefano ;1437;NC;30;CZ;191272;0;102881;m -POLICASTRESE Salvato;1440;NC;30;KR;080290;0;119785;m -MUSTO Marco ;1500;3N;30;GO;250577;0;115047;m -BASSINI Massimo ;1494;3N;30;PG;020270;0;122430;m -TENCHENI Maurizio ;1566;2N;30;VR;071150;0;115416;m -CONTI Marco ;1432;1S;30;PV;030266;0;109676;m -BERARDI Pietro ;1482;NC;30;CH;131043;0;106951;m -BRAGA Gian Carlo ;1587;3N;30;PR;150623;0;123183;m -FULGIDI Giulio ;1422;NC;30;PR;150747;0;123185;m -GALLI Gino ;1383;NC;30;AR;151174;0;114658;m -GARAFFA Graziano ;1449;3N;30;PR;200365;0;123184;m -MARINI Lucio ;1899;1N;0;AN;231162;824852;123182;m -MARTINO Gianluca ;1509;3N;30;PC;030970;0;116330;m -SCALI Fausto ;1509;3N;30;AR;110387;0;121776;m -MACCIARDI Michele ;1494;3N;30;SV;070561;0;123209;m -MANFREDI Christian ;1434;NC;30;IM;110190;0;123211;m -PESCE Leandro ;1767;2N;0;SV;160345;827720;118863;m -ZOCCALI Daniele;1413;NC;30;IM;;0;10392;m -COLOMBO Mainini Albe;1512;3N;30;MI;081261;0;117698;m -COMBI Antonio ;1314;NC;30;MI;060245;0;120607;m -D'ANGELO Massimo ;1410;NC;30;MI;290170;0;122062;m -D'APA Massimo ;1500;2N;30;MI;090896;0;117090;m -LODIGIANI Milko ;1470;NC;30;PV;210172;0;10397;m -CAZZOLA Mattia ;1556;3N;30;BO;050473;0;122651;m -ALBERGHINI Marco ;1431;NC;30;BO;211079;0;120579;m -CARRETTI Andrea ;1506;3N;30;RE;041183;0;110930;m -DONATI Marco ;1425;NC;30;BO;090695;0;118840;m -LUCCHI Sauro ;1329;NC;30;RN;010856;0;114640;m -MARZANO Giovanni ;1476;3N;30;BO;291155;0;113858;m -MUCCINI Andrea ;1443;3N;30;RN;220196;0;110914;m -PICCININI Samuele ;1644;2N;30;BO;100193;0;115108;m -SPATOCCO Alessandro ;1509;3N;30;BO;120292;0;116214;m -SPATOCCO Andrea ;1611;2N;30;BO;120292;0;116215;m -BERNARDI Giulio ;1591;3N;30;MI;190852;0;100037;m -GIORDANI Pierino ;1386;NC;30;BI;300548;0;118248;m -CAPITANI Roberto ;1353;3N;30;RM;140836;0;105441;m -SCRIVANI Carlo Giorg;1356;NC;30;MI;041158;0;123296;m -BARTOLI Fabio ;1572;3N;30;LI;090692;0;120849;m -SIMEONE Donato ;2141;CM;0;LI;040859;827860;117446;m -TOGNOCCHI Giuseppe ;1571;3N;30;LU;;0;10414;m -AZZINARO Luca ;1404;NC;30;MI;030766;0;118110;m -MARAFIOTI Giovanni ;1524;3N;30;MI;130285;0;122063;m -MONTICONE Sonia ;1623;2N;30;AT;270689;0;120090;f -TOMASETTO Mauro ;1641;2N;30;VA;060873;0;120883;m -VIGNOLI Ernesto ;1281;NC;30;MI;080738;0;121261;m -VUJIC Dragan ;1917;1N;30;MI;101272;0;121186;m -ZATTI Stefano ;1575;3N;30;MI;100676;0;122871;m -KOBYLKA Michael ;1948;;30;EE;;0;10423;m -AFFATICATO Domenico ;1440;NC;30;KR;;0;10424;m -GUALTIERI Domenico ;1440;NC;30;KR;;0;10425;m -RODIO Francesco ;1440;NC;30;KR;;0;10426;m -ABBRUZZESE Luigi ;1440;NC;30;KR;;0;10427;m -SPAGNOLO Vincenzo ;1365;NC;30;KR;060191;0;119787;m -MARTINO Salvatore ;1440;NC;30;KR;;0;10429;m -PETA Francesco ;1440;NC;30;KR;;0;10430;m -LIA Bruno ;1440;NC;30;KR;;0;10431;m -ABBRUZZESE Alfredo ;1338;NC;30;KR;;0;127158;m -OLIVO Ilaria ;1461;NC;30;KR;251090;0;119786;f -ABBRUZZESE Alberto ;1440;NC;30;KR;;0;127160;m -ABBRUZZESE Gianluca ;1440;NC;30;KR;;0;127159;m -SCARABELLO Luca ;1407;NC;30;VE;170978;0;123218;m -CHIODINI Sebastiano ;1428;NC;30;VE;211287;0;120499;m -BIAGIOLI Marco ;1467;NC;30;VE;040186;0;120495;m -CASAVECCHIA Alberto ;1515;3N;30;RM;031269;0;120782;m -GUIDUCCI Antonio ;1335;NC;30;RM;071253;0;120784;m -MILANI Patrizia ;1398;NC;30;RM;090558;0;118674;f -SPINELLI Diego ;1389;NC;30;RM;030448;0;120046;m -TACCHI Ruggero ;1539;3N;30;RM;230678;0;122657;m -TULLI Cesare ;1476;NC;30;LT;301277;0;123620;m -VIOLINI Galileo ;1431;NC;30;RM;160842;0;121492;m -TAVANO Armando ;1688;2N;30;UD;221252;0;121697;m -BISARO Andrea ;1608;2N;30;PN;190971;0;120456;m -BORTOLOSSO Mario ;1509;3N;30;UD;210192;0;112342;m -BORTOLOSSO Paolo ;1425;NC;30;UD;010594;0;112341;m -COLAK Tomislav ;1413;NC;30;UD;220573;0;100483;m -MENGHINI Flavio ;1419;NC;30;UD;130590;0;122892;m -MENGHINI Italo ;1365;NC;30;UD;040761;0;122891;m -PATINO Zuliani Nicol;1497;NC;30;PN;101186;0;121334;m -SIALINO Roberto ;1608;2N;30;UD;110680;0;110310;m -BASILICO Davide ;1452;3N;30;MI;021291;0;120581;m -CAMPI Stefano ;1455;NC;30;MI;290791;0;120585;m -CASSI Maria Silvia ;1377;NC;30;BG;010191;0;115683;f -CASSI Matteo ;1551;2N;30;BG;070989;0;101691;m -DEMARCO Mattia ;1377;NC;30;CO;121089;0;122304;m -LAURIA Marco ;1392;NC;30;MI;300193;0;120590;m -LAURIA Matteo ;1425;NC;30;MI;010895;0;120591;m -MOLAJONI Paolo ;1473;NC;30;MI;210489;0;120525;m -NASSI Giovanni ;1446;NC;30;MI;240588;0;117953;m -REGORDA Lorenzo ;1272;NC;30;MI;150293;0;118768;m -SCAPPATICCI Gabriele;1305;NC;30;BG;010396;0;118396;m -SHEPHERD Joseph ;1365;NC;30;VA;180395;0;118769;m -TROIANO Giacomo ;1425;NC;30;VA;131293;0;118771;m -TROZZI Ettore ;1449;NC;30;BG;040990;0;121474;m -WILKINSON Simon ;1425;NC;30;VA;250792;0;118772;m -CAVALIERE Stefano ;1500;3N;30;RM;020388;0;123626;m -CRESCENZI Federico ;1404;NC;30;RM;170793;0;121498;m -RONCHI Matteo ;1533;3N;30;RM;170889;0;123479;m -ROSSETTI Marcello ;1470;NC;30;RM;101063;0;121489;m -TORRISI Andrea ;1917;1N;0;AT;150988;824216;108859;m -RAVOTTI Francesco ;1512;3N;30;CN;130585;0;120119;m -MINA Andrea ;1419;NC;30;CN;200992;0;119643;m -MANERA Marco ;1440;NC;30;CN;010169;0;109303;m -GUASCO Giancarlo;1416;NC;30;CN;080663;0;113211;m -DOGLIO Francesco ;1395;NC;30;CN;030277;0;121648;m -DAVTER Mauro ;1491;3N;30;TO;290766;0;118538;m -DALMASSO Luca ;1524;3N;30;CN;260276;0;122901;m -CATALANO Fabio ;1371;NC;30;CN;230992;0;122418;m -BIANCO Matteo ;1452;NC;30;CN;171078;0;119151;m -ALESSANDRINI Daniele;1362;NC;30;TO;140164;0;123667;m -RIVELLA Stefano ;1636;2N;30;AT;220682;0;122527;m -GHISIO Paolo ;1360;1S;30;TO;080362;0;122633;m -BORELLO Paola ;1345;1S;30;CN;180646;0;105096;f -GAMBARINO Federico;1820;1N;0;TO;290284;823007;120441;m -GIUSSANI Giacomo ;1520;3N;30;MI;200489;0;104805;m -ROTA Giovanni ;1515;3N;30;LC;151293;0;122144;m -RIVA Federico ;1389;NC;30;MI;070394;0;122146;m -FERRARO Gianluca ;1583;3N;30;MI;230289;0;117607;m -CICERI Luca ;1496;3N;30;MI;140889;0;104803;m -BERETTA Carlo ;1380;NC;30;MI;240791;0;114247;m -BONACINA Cristiano ;1500;3N;30;MI;030191;0;114251;m -BUONO Stefano ;1380;NC;30;MI;020193;0;123557;m -CAPPELLER Daniele ;1425;NC;30;MI;020791;0;117618;m -CONCAVO Daniele ;1662;2N;30;CO;170689;0;117994;m -GALESSO Francesco ;1491;NC;30;MI;250592;0;122142;m -GREGORI Giovanni ;1458;NC;30;MI;140194;0;122145;m -MADONIA Dylan ;1500;3N;30;MI;121293;0;122143;m -PIEMONTI Andrea ;1473;NC;30;LC;260195;0;112245;m -ROTA Samuele ;1395;NC;30;LC;310589;0;117608;m -SOMASCHI Riccardo ;1368;NC;30;MI;011193;0;117617;m -VITALI Emanuele ;1503;3N;30;MI;100390;0;104809;m -BALLESTIN Luciana ;1373;2S;30;MI;090737;0;108080;f -GARLERA Marco ;1499;2S;30;MI;060184;0;103631;m -ALVISI Samuele ;1383;NC;30;MI;180186;0;103628;m -BELOTTI Emanuele ;1440;NC;30;MI;021087;0;123562;m -CHIARELLO Simone ;1449;NC;30;MI;051091;0;115421;m -CIMO' Alessandro ;1506;3N;30;MI;210485;0;120677;m -MUSTO Fabio ;1470;NC;30;MI;280771;0;117575;m -PALERMO Edoardo ;1506;3N;30;MI;240188;0;123563;m -PAGANELLI Ivo;1537;3N;30;NO;200456;0;109409;m -PIAZZA Francesco;1381;1S;30;VB;250264;0;118175;m -CORTESE Alessio;1580;3N;30;ME;130583;0;119169;m -MAZZAGLIA Guido;1484;3N;30;ME;291090;0;120819;m -OTERI Domenico;1559;3N;30;ME;251090;0;119364;m -TRIPODO Antonio;1589;3N;30;ME;021190;0;119312;m -PUDDU Urania ;1347;NC;30;SS;050793;0;119418;f -SOTGIU Roberto ;1593;2N;30;SS;041170;0;122188;m -FILIGHEDDU Giovanni;1380;NC;30;SS;021091;0;105493;m -DESSY Eugenio ;1488;3N;30;CA;280965;0;122958;m -FUSARO Alessandro ;1431;NC;30;SS;070993;0;119863;m -DEVILLA Michele ;1356;3N;30;SS;140361;0;120400;m -BARRACO Vincenzo ;1383;NC;30;MI;260377;0;107114;m -BIGNAMI Matteo ;1494;3N;30;MI;070180;0;118724;m -CAPITANIO Luigi ;1380;NC;30;MI;161175;0;120767;m -CASATI Ettore ;1407;NC;30;MI;310361;0;120296;m -CERVINI Gian Piero ;1809;CM;0;VA;130157;822248;121223;m -FAZIO Alfio ;1398;NC;30;MI;300366;0;120526;m -NAVA Mario ;1431;NC;30;MI;241262;0;123497;m -RAZA Giovanni ;1413;NC;30;MI;241053;0;119793;m -TONELLI Gianfranco ;1510;3N;30;BS;311265;0;123501;m -VARINELLI Pierluigi ;1558;3N;30;BG;280764;0;123500;m -VENNI Simone ;1462;1S;30;BS;230472;0;120468;m -BERTOLONI Giampiero ;1428;NC;30;BS;091256;0;122396;m -BONSI Enzo ;1350;NC;30;BS;070158;0;115872;m -MOTTINI Ruggero ;1530;3N;30;BS;151163;0;122394;m -MODICA Antonino ;1494;3N;30;MI;040456;0;105660;m -CALCAGNILE Sebastian;1431;NC;30;MI;020267;0;119211;m -ROSA Bruno ;1527;3N;30;MI;200464;0;117007;m -STAFFORINI Matteo ;1695;2N;30;PV;020473;0;121624;m -DE-TUGLIE Nicola ;1664;2N;30;LE;100548;0;123457;m -FIORENTINO Antonio ;1611;2N;30;LE;241255;0;120174;m -ARCERI Filippo ;1578;3N;30;BR;251181;0;116826;m -COMI Simone ;1383;NC;30;LE;300894;0;112924;m -CORINA Emanuele ;1467;NC;30;LE;111091;0;123455;m -DE-JACOB Dario ;1440;NC;30;LE;190791;0;123456;m -MANDORINO Alessio ;1593;2N;30;LE;300192;0;122506;m -MELE Daniele ;1440;NC;30;LE;290590;0;120179;m -MONTINARO Antonio ;1590;3N;30;LE;300188;0;118491;m -PANIZZA Francesco ;1395;NC;30;LE;160989;0;120181;m -PASSIATORE Gianmarco;1440;NC;30;LE;180594;0;112960;m -PECCARISI Marco ;1638;2N;30;LE;211081;0;105365;m -PRENCIPE Gaetano ;1494;NC;30;BA;131065;0;121940;m -SANSONETTI Pietro ;1383;NC;30;LE;080693;0;103938;m -SBOCCHI Roberto ;1431;NC;30;LE;070794;0;112968;m -TARANTINO Nico ;1344;NC;30;LE;140692;0;119821;m -VERGINE Antonio ;1569;3N;30;LE;190579;0;123460;m -ZACHEO Luca ;1410;NC;30;LE;220594;0;112989;m -AGUSTONI Alessandro ;1512;3N;30;MI;021073;0;122741;m -BERTON Venanzio ;1365;NC;30;MI;131151;0;119519;m -CAGNANI Claudio ;1464;NC;30;MI;010657;0;122743;m -COLOMBO Abner ;1170;NC;30;MI;071261;0;119517;m -DONI Flavio ;1422;NC;30;MI;280165;0;117624;m -FIORELLI Paolo ;1482;NC;30;MI;090771;0;120243;m -LAURICELLA Calogero ;1419;NC;30;MI;050249;0;122740;m -MASSARI Filippo ;1458;NC;30;MI;200482;0;122742;m -ANDREIS Giovanni ;1395;NC;30;MI;150340;0;121254;m -DE-ANGELIS Franco ;1434;NC;30;SA;200149;0;121805;m -STINGA Danilo ;1401;NC;30;SA;010792;0;121535;m -CERVERO Gianluca ;1440;NC;30;SA;171192;0;118552;m -CAVA Franco ;1416;NC;30;SA;270247;0;121511;m -ESPOSITO Vincenzo ;1440;NC;30;SA;060845;0;123434;m -MANDARA Gaetano ;1467;NC;30;SA;160143;0;121509;m -POTENZA Gabriele ;1365;NC;30;SA;160892;0;118558;m -DE-LUCIA Salvatore;1569;3N;30;SA;120992;0;118554;m -ERCOLANO Antonella ;1563;3N;30;SA;010592;0;118555;f -CASSARINO Salvatore ;1410;NC;30;VR;200865;0;122297;m -TEGANI Andrea ;1443;NC;30;VR;020275;0;122300;m -TIOZZO Marco ;1485;3N;30;VR;240772;0;117296;m -VICENTINI Emanuele ;1428;NC;30;VR;270188;0;122302;m -AGOSTINI Renzo ;1356;NC;30;AP;070460;0;122543;m -DI-MANTINO Mauro ;1482;NC;30;MC;250784;0;123325;m -MORELLI Basilio ;1539;3N;30;AP;191157;0;123323;m -TITTARELLI Edith ;1389;NC;30;AN;020396;0;117649;f -BARBIZZI Florian ;1437;NC;30;TE;050988;0;106416;m -BARBIZZI Giorgio ;1389;NC;30;TE;030791;0;106417;m -CAVATASSI Lino ;1362;NC;30;TE;210860;0;118955;m -BENCARDINO Davide ;1440;NC;30;CS;250289;0;109157;m -CARABETTA Alfredo ;1512;3N;30;RC;151089;0;112777;m -GIGLIOTTI Alessandro;1440;NC;30;CS;081288;0;109165;m -MENDICINO Bruno ;1458;NC;30;CS;020150;0;123625;m -ARCELLA Pasqualino ;1434;NC;30;TO;060155;0;121362;m -VALLONE Vincenzo;1407;NC;30;TO;110937;0;120194;m -MARCA Bruno;1407;NC;30;TO;160739;0;111763;m -RICCIO Emiliano ;1413;NC;30;PZ;310559;0;108007;m -DUTTO Davide ;1434;NC;30;CN;021288;0;119150;m -TOSELLO Giovanni ;1350;NC;30;CN;060171;0;121647;m -COSTA Fabrizio;1440;NC;30;PI;180460;0;122703;m -MARTINAZZO Luigi;1579;2N;30;TV;160892;0;116135;m -CERRITELLI Enrico;1431;NC;30;CH;210252;0;119889;m -DI-PRIMIO Eugenia;1555;3N;30;CH;111284;0;121480;f -FALCOCCHIO Camillo;1374;NC;30;CH;061236;0;119440;m -RICCIO Roberto ;1830;1N;30;VT;290773;0;114225;m -BELLACHIOMA Gianluca;1503;3N;30;PG;070363;0;117622;m -BURLA Massimo ;1545;3N;30;VT;281179;0;119841;m -OLIVI Gabriele ;1473;NC;30;GR;190274;0;105323;m -TORDI David ;1449;NC;30;TR;150978;0;123499;m -MIZYK Ivan;2000;;30;EE;;0;10617;m -NARDI Samuele;1526;3N;30;PG;080691;0;113511;m -GIUSTINO Matteo;1580;3N;30;AR;171090;0;114678;m -ZINCO Roberto;1580;3N;30;PI;030878;0;119308;m -RIGAMONTI Roberto;1573;2N;30;LC;280379;0;120283;m -NEGRI Ornella Cecili;1634;2N;30;LC;061153;0;120280;f -THAIRAJ Artur;1500;3N;30;LC;120560;0;127538;m -TERZI Simon ;1553;3N;30;MI;240777;0;112419;m -CARCAGNILE Sebastian;1440;NC;30;;;0;10626;m -NAPOLEONI Giulio ;1458;NC;30;MI;120664;0;123401;m -RUSCITTI Nunzio ;1488;3N;30;PC;180742;0;102379;m -MORELLO Alessandro;1416;NC;30;TO;260481;0;122393;m -GOTTA Stelio;1413;NC;30;TO;150972;0;118861;m -BRUNETTI Emilio;1440;NC;30;PS;140153;0;113560;m -FIESCHI Ibleto ;1612;2N;30;GE;;0;10634;m -RICCIO Rino ;1573;2N;30;GE;;0;10635;m -CASTELLOTTI Eugenio ;1446;3N;30;AL;040544;0;123734;m -JOVANOVIC Goran ;1566;3N;30;GE;170166;0;122061;m -PICASSO Filippo ;1299;NC;30;GE;070188;0;118805;m -PUGLIESE Alessandro ;1545;3N;30;GE;060890;0;119809;m -RIVARA Federico ;1452;NC;30;GE;150593;0;121053;m -RIVARA Marta ;1380;NC;30;GE;170590;0;121054;f -SCIUTO Giuseppe ;1542;3N;30;AL;;0;10643;m -PRUIJSSERS Karin ;1431;NC;30;EE;;0;10644;f -CASSANO Andrea ;1440;NC;30;BR;250273;0;123720;m -DE-PACE Orlando ;1461;NC;30;TA;160479;0;121745;m -DI-PACE Nicolo' ;1446;NC;30;TA;240491;0;113600;m -DONVITO Giuseppe ;1371;NC;30;TA;030591;0;123719;m -VASINCA Simion ;1458;NC;30;MI;100545;0;123722;m -PRATI Renato ;1422;NC;30;MI;221140;0;123721;m -BELLAVIA Domenico ;1587;3N;30;TP;220276;0;120941;m -BIFULCO Michel ;1683;2N;30;PA;010693;0;123156;m -BONUMORE Antonio ;1425;NC;30;PA;080588;0;123644;m -CAIBIS Daniele ;1374;NC;30;PA;160679;0;123643;m -CAMARDA Baldassare ;1434;NC;30;PA;120593;0;120909;m -CANGEMI Davide ;1440;NC;30;PA;211186;0;123655;m -CAPUTO Roberto ;1440;NC;30;PA;060190;0;123652;m -CASAMENTO Gino ;1476;NC;30;PA;;0;10658;m -CASTELLO Luciano ;1515;3N;30;PA;040194;0;120911;m -CONSIGLIO Gianluca ;1578;3N;30;PA;130589;0;119904;m -COSTANZA Michele ;1410;NC;30;PA;090992;0;123649;m -COTTONE Fabrizio ;1635;2N;30;PA;160888;0;127015;m -DI-MAIDA Fabrizio ;1485;NC;30;PA;310790;0;119987;m -DI-SALVO Giovanni ;1431;NC;30;PA;120789;0;123651;m -GIGANTE Giovanni ;1599;2N;30;TP;280569;0;114407;m -GIUNTINI Daniele ;1407;NC;30;PA;160793;0;120021;m -IERVOLINO Francesco ;1455;NC;30;PA;281087;0;123656;m -INDORATO Marco ;1494;NC;30;PA;140692;0;121130;m -INDOVINA Davide Igna;1500;3N;30;PA;030791;0;120914;m -INTERNICOLA Vincenzo;1554;3N;30;PA;180253;0;119513;m -JEBRIL Yssef -Giusep;1440;NC;30;PA;110288;0;119993;m -LA-FATA Andrea ;1398;NC;30;PA;260592;0;123648;m -LE-CALZE Renzo ;1461;NC;30;PA;150794;0;120022;m -LIBRERA Vincenzo Ant;1476;NC;30;PA;180191;0;123093;m -MAESTRI Salvatore ;1509;3N;30;PA;311092;0;123166;m -MARINO Vincenzo ;1452;NC;30;PA;160692;0;123653;m -MASTROPAOLO Giuseppe;1401;NC;30;PA;310191;0;123163;m -MONDELLO Simone ;1626;2N;30;PA;261091;0;120915;m -MORELLO Domenico ;1440;NC;30;PA;070589;0;123654;m -PALAZZOTTO Giuseppe ;1764;2N;30;PA;151291;0;108301;m -PALAZZOTTO Roberto ;1656;2N;30;PA;280195;0;118015;m -PANZARELLA Francesco;1425;NC;30;PA;240387;0;123646;m -JEBRIL Yssef Giusepp;1530;3N;30;PA;110288;0;123171;m -PANZARELLA Maria Gab;1395;NC;30;PA;270589;0;123647;f -PARISI Fabrizio ;1401;NC;30;PA;190897;0;123645;m -PARISI Girolamo ;1446;NC;30;PA;050260;0;123642;m -PELLERITO Gianmarco ;1404;NC;30;PA;080192;0;123167;m -PULEIO Alessandro ;1620;2N;30;PA;190492;0;119919;m -PULEO Diego ;1767;2N;30;PA;030293;0;120023;m -RENDA Salvatore ;1395;NC;30;PA;150287;0;123657;m -RUBINO Livio ;1395;NC;30;PA;261191;0;123650;m -SORRENTINO Andrea ;1389;NC;30;PA;090792;0;118014;m -SPINNATO Mirko ;1386;NC;30;PA;240890;0;123165;m -VALENZA Paola ;1245;NC;30;PA;260994;0;123162;f -VENTURELLA Luca ;1350;NC;30;PA;210991;0;123164;m -MASSARO Fernando ;1511;3N;30;TO;200637;0;105511;m -PETTARINI Renato ;1709;2N;30;TO;151148;0;105515;m -VOZZA Giuseppe ;1604;2N;30;TO;260171;0;123687;m -PARISI Gianmario ;1614;2N;30;TO;110865;0;116306;m -BRAGHIN Stefano ;1443;NC;30;TO;140782;0;111193;m -FILOGRANA Giorgio ;1317;NC;30;TO;240657;0;122632;m -GIANI Piero ;1455;NC;30;TO;120864;0;123668;m -LANFRANCO Carlo ;1407;NC;30;TO;280836;0;107616;m -LOMBARDO Davide ;1473;NC;30;TO;;0;10707;m -SALVATI Marcello ;1422;NC;30;TO;290256;0;120440;m -BOELLIS Carmine ;1416;NC;30;LE;160767;0;123334;m -RIZZO Giacomo ;1383;NC;30;LE;240191;0;119815;m -SYLOS-LABINI Andrea;1455;NC;30;BA;140477;0;115504;m -BOZAJ Fiqiri ;1677;2N;30;FG;120761;0;122682;m -CAPITANIO Giovanni ;1368;NC;30;FR;260651;0;109103;m -CARRETTA Nunzio ;1596;3N;30;FG;130671;0;123753;m -CASTALDI Nunzio ;1458;NC;30;BN;220372;0;123701;m -CENICCOLA Michele ;1458;NC;30;BN;010476;0;123702;m -DE-TULLIO Giovanni ;1512;3N;30;CB;080187;0;122893;m -RAMACCIATO Arnaldo ;1389;NC;30;CB;230761;0;117845;m -ZARRELLI Mario ;1441;1S;30;CB;120466;0;122698;m -SALA Marcello ;1675;2N;30;BG;110857;0;123755;m -FERLINI Claudio ;1389;NC;30;RO;011249;0;106712;m -GILARDI Davide ;1518;3N;30;BG;270691;0;106401;m -PAMPALUNA Enrico ;1470;NC;30;BG;050290;0;106402;m -PIANA Bruno ;1449;NC;30;BG;180271;0;113926;m -TEDOLDI Guido ;1395;NC;30;BG;231165;0;123754;m -NEMETH Henrietta ;1437;NC;30;EE;;0;10726;f -NEMETH Kinga ;1389;NC;30;EE;;0;10727;m -JOHNSEN Rune ;1545;3N;30;EE;;0;10728;m -BLUM Ulrike ;1440;NC;30;EE;;0;10729;m -IOZZIA Giuseppe;1580;3N;30;RG;290462;0;122818;m -CUCURACHI Nicola ;1470;3N;30;LE;050162;0;117263;m -CANNAZZA Gabriele ;1374;NC;30;LE;310894;0;120185;m -DE-LEO Daniela ;1332;NC;30;LE;230192;0;119822;f -FIORENTINO Francesca;1431;NC;30;LE;020794;0;120187;f -GRECO Andrea ;1383;NC;30;LE;080497;0;120189;m -LAUDISA Marco ;1434;NC;30;LE;110994;0;119816;m -NUZZOLI Giorgia ;1371;NC;30;LE;010994;0;123758;f -PALAMA' Mattia ;1437;NC;30;LE;300588;0;116892;m -SANSO' Luca ;1398;NC;30;LE;;0;10741;m -SANSONETTI Nicola ;1380;NC;30;LE;;0;10742;m -NACCIARONE Guido ;1318;1S;30;NA;070447;0;108766;m -PALMIERI Carmen ;1380;NC;30;AV;050777;0;120996;f -AJI Francesco ;1437;NC;30;NA;150793;0;121922;m -COLELLA Angelo ;1413;NC;30;NA;211050;0;122718;m -COPPOLA Mirco ;1479;NC;30;NA;230887;0;115651;m -IANNACCONE Fabrizio ;1371;NC;30;NA;170769;0;121918;m -IAZZETTA Vincenzo ;1468;1S;30;NA;171092;0;115652;m -RAIOLA Mattia ;1455;NC;30;NA;090292;0;109588;m -SCARANO Mariano ;1338;NC;30;NA;030135;0;122715;m -VANNINI Aldo ;1749;2N;30;NA;220855;0;122717;m -DORICI Alice ;1513;3N;30;MC;131091;0;108225;f -MENICHELLI Alessandr;1604;2N;30;MC;060890;0;108235;m -MENICHELLI Francesco;1523;3N;30;MC;260194;0;115598;m -AGOSTINI Marco ;1428;NC;30;AN;060990;0;120204;m -CAMPETELLA Lucia ;1377;NC;30;MC;240992;0;122723;f -DELLA-MORA David ;1530;3N;30;MC;300992;0;118606;m -GOVERNATORI Michele ;1392;NC;30;MC;100893;0;108220;m -KEQI Fatmir ;1479;NC;30;MC;210151;0;123670;m -MARIUCCI Giacomo ;1539;3N;30;MC;121287;0;109978;m -MIGLIOZZI Andrea ;1371;NC;30;MC;220793;0;118609;m -MONTEROTTI Sergio ;1410;NC;30;MC;231087;0;123636;m -ARENA Mauro;1580;3N;30;ME;160790;0;115970;m -MOLICA-NARDO Federic;1580;3N;30;ME;280492;0;115978;m -CUSIMANO Salvatore;1580;3N;30;ME;131050;0;112461;m -SIDOTI Carmelo;1580;3N;30;ME;260291;0;115470;m -ROTEGLIA Giovanni ;1589;3N;30;MO;020788;0;112553;m -ANDREONI Giuseppe ;2003;CM;0;RM;300588;820644;118680;m -BIAGIOTTI Lorenzo ;1398;NC;30;PG;060288;0;113496;m -BONCI Filippo Maria ;1413;NC;30;TR;070589;0;120069;m -CAPITANI Federico ;1446;NC;30;PC;100889;0;118499;m -DE-BERARDINIS Marco ;1494;3N;30;TE;021089;0;117135;m -DI-TRANI Sabino ;1563;3N;30;BA;050789;0;121942;m -FILON Matteo ;1428;NC;30;BL;;0;10776;m -FONI Samuele ;1383;NC;30;PG;210489;0;123525;m -GHEDIN Emanuele ;1623;2N;30;LT;090188;0;123074;m -GIORGI Emanuele ;1359;NC;30;LU;180589;0;122090;m -GRILLO Stefano ;1464;NC;30;RM;170888;0;123627;m -GUARNIERI Marco ;1443;NC;30;RC;230889;0;116387;m -PALUCCI Alessio ;1569;3N;30;PE;160389;0;119317;m -PAPINI Nicola ;1395;NC;30;LI;151089;0;117910;m -VALOCCHI Giorgio ;1464;NC;30;AQ;240888;0;116333;m -VIGNOLA Matteo ;1455;NC;30;BO;191188;0;101637;m -WALDNER Petra ;1458;NC;30;BZ;240688;0;105573;f -LUCACCIONI Angela ;1410;NC;30;PG;261289;0;120065;f -INTERNICOLA Isabella;1482;NC;30;PA;290589;0;108466;f -DEMETZ Valentine ;1440;NC;30;BZ;080388;0;109558;f -BINA Francesca ;1440;NC;30;LU;140689;0;122082;f -BERNARDESCHI Benedet;1380;NC;30;LU;260989;0;122080;f -DE-NARDI Riccardo ;1973;1N;0;TV;090591;824038;120918;m -MONTANARI Simone ;1316;2S;30;MO;021191;0;114379;m -BALOIRE Endy ;1506;3N;30;AO;261291;0;123275;m -BARCARO Paolo ;1377;NC;30;PE;261191;0;113014;m -BERTOZZI Francesco ;1524;3N;30;FO;020691;0;104642;m -BISCEGLIA Pierluigi ;1422;NC;30;CE;270991;0;112037;m -BRUNI Andrea ;1479;NC;30;GO;101190;0;114409;m -BUGGE' Federico ;1374;NC;30;TO;141190;0;116365;m -CAMELIA Matteo ;1623;2N;30;PG;140990;0;122362;m -CANATO Massimo ;1401;NC;30;VE;250891;0;117413;m -CAPRONI Giovanni ;1437;NC;30;UD;101290;0;112343;m -CARILLO Mattia ;1472;2S;30;MO;130790;0;113133;m -CASONATO Stefano ;1524;3N;30;PN;110690;0;120808;m -CATAUDELLA Pietro ;1428;NC;30;SR;200291;0;122970;m -CECCARINI Gianluca ;1392;NC;30;PG;200790;0;114686;m -DI-STASIO Danilo ;1620;2N;30;CE;190391;0;114987;m -FAMILARI Giuseppe ;1609;2N;30;RC;170190;0;119701;m -FELICIANGELI Dario ;1494;NC;30;RM;091091;0;121497;m -FENDANE Mohamed ;1374;NC;30;CE;080290;0;122104;m -FERRANTE Fabio ;1422;NC;30;PA;040990;0;120008;m -FERRARESE Piero ;1428;NC;30;VE;160290;0;117012;m -GAD Alessandro ;1419;NC;30;CS;280591;0;112722;m -GALLUCCI Alessio ;1840;1N;0;TO;070891;822990;114733;m -GAZZARRI Leonardo ;1599;3N;30;LI;290491;0;117908;m -INTERNICOLA Massimil;1395;NC;30;PA;230790;0;108468;m -LABADESSA Francesco ;1395;NC;30;RC;220891;0;122035;m -LOVREGLIO Vito ;1512;3N;30;BA;310891;0;122840;m -LUCI Alessandro ;1383;NC;30;RM;030791;0;123478;m -MANCINI Andrea ;1517;3N;30;MO;280491;0;114378;m -MARESCA Vincenzo ;1440;NC;30;SA;191090;0;118556;m -MICHELI Gherardo ;1404;NC;30;LU;200190;0;122091;m -MONTI Mattia ;1515;3N;30;LU;250790;0;120417;m -NUNNARI Sergio ;1506;3N;30;RC;170990;0;116708;m -PAGANI Ludovico ;1383;NC;30;PC;230191;0;118500;m -PALMITESSA Andrea ;1512;3N;30;BA;270991;0;116722;m -PAVEGLIO Mattia ;1566;3N;30;PN;040491;0;115287;m -PICCIRILLO Edoardo ;1788;2N;30;LT;150290;0;123072;m -POTENZA Matteo ;1380;NC;30;SA;261260;0;121752;m -PRIMERANO Ferdinando;1461;NC;30;RC;100490;0;112779;m -PROVAZZA Alessandro ;1389;NC;30;RC;300891;0;116709;m -PRUGGER Iacun ;1455;NC;30;BZ;110390;0;109550;m -PULLARA Sergio ;1410;NC;30;PA;091290;0;119976;m -RIOTTA Sergio ;1395;NC;30;PA;300790;0;119977;m -SELVAGGIO Pietro ;1523;3N;30;SR;260490;0;111962;m -VIGLIOCCO Davide ;1470;NC;30;TO;020791;0;106278;m -ZANGA Angelo E.;1362;NC;30;CE;190990;0;122108;m -BELTRAMI Chiara ;1650;2N;30;AL;180691;0;117083;f -BOSI Aurelia ;1440;NC;30;PG;020390;0;119286;f -CASOLINO Anna Maria ;1527;3N;30;BA;230891;0;120530;f -CICERO Francesca ;1374;NC;30;ME;020885;0;119189;f -CRESCENTE Annalaura ;1506;3N;30;BA;201090;0;116106;f -FIORENTINO Maria Cri;1725;2N;30;LE;240491;0;120188;f -GABASSI Cristina ;1560;3N;30;UD;251191;0;115605;f -RIENZI Valentina ;1422;NC;30;TO;091190;0;123597;f -ARMOCIDA Ilaria ;1461;NC;30;RC;100992;0;119674;f -ARENI Matteo ;1407;NC;30;PG;161293;0;119307;m -ZIBELLA Francesco ;1440;NC;30;PC;050392;0;114806;m -ABU Salem Karim ;1437;NC;30;CS;290192;0;116272;m -ACCIARINI Massimo ;1479;3N;30;PG;170292;0;119297;m -AIELLO Armando ;1386;NC;30;SA;281292;0;112011;m -ARANGIO Roberto ;1440;NC;30;SR;250992;0;116792;m -ARMOCIDA Domenico ;1401;NC;30;RC;090692;0;122002;m -BARBAFINA Gianluca ;1452;NC;30;PG;300893;0;116958;m -BELTRAMI Iacopo ;1287;NC;30;AL;130693;0;122508;m -BEVACQUA Lorenzo ;1440;NC;30;CS;240492;0;116256;m -BINCI Luca ;1431;NC;30;AN;090893;0;122205;m -BONASSI Tommaso ;1527;3N;30;BG;080693;0;108630;m -BORTIGNON Giulio ;1464;NC;30;VR;011193;0;114526;m -BOTTINI Luca ;1464;NC;30;SR;060792;0;116667;m -BUSILLO Arturo ;1431;NC;30;SA;160692;0;107011;m -BUTTIGNOL Marco ;1491;NC;30;PN;300192;0;115662;m -CANOCCHI Alberto ;1389;NC;30;SI;200693;0;122288;m -CARDINALI Luca ;1401;NC;30;TO;230693;0;116374;m -CARRASSO Daniele ;1497;3N;30;BA;220192;0;121948;m -CASERIO Federico ;1392;NC;30;TO;270892;0;114461;m -COLLURA Salvatore ;1437;NC;30;AG;041292;0;119611;m -COLOMBI Giorgio ;1449;NC;30;RM;020493;0;112795;m -COPPINI Federico ;1356;NC;30;PE;180592;0;122852;m -CRAMEROTTI Marco ;1422;NC;30;TN;120493;0;100044;m -CRIVELLA Manuel ;1419;NC;30;CS;120992;0;120078;m -CUZZUCOLI Fausto ;1308;NC;30;RC;150892;0;119709;m -DAPPIANO Andrea ;1635;2N;30;TN;070593;0;118293;m -DEDAMIANI Loris ;1467;NC;30;TO;110592;0;123591;m -DI-CASTRO Samuel ;1473;NC;30;RM;010693;0;119012;m -DI-LORENZO Marco ;1454;3N;30;ME;090193;0;119106;m -DI-PIETRO Leonardo ;1404;NC;30;MO;101092;0;115948;m -ESPOSITO Leonardo ;1429;1S;30;SA;051192;0;120374;m -FALASCHI Gianluca ;1422;NC;30;PG;300692;0;113506;m -FERRI Fabio ;1521;3N;30;PG;011093;0;119293;m -FIORE Angelo ;1536;3N;30;BA;080492;0;121947;m -GANT Francesco ;1581;3n;30;PN;160893;0;120457;m -GERGOLET Jan ;1533;3N;30;GO;120292;0;118381;m -GONELLA Riccardo ;1479;3N;30;IM;110892;0;118638;m -GOZZI Riccardo ;1422;NC;30;RE;180592;0;116521;m -LEONE Nicola ;1458;NC;30;BA;171093;0;116697;m -LO-PASSO Francesco ;1356;NC;30;SR;310893;0;116668;m -MACCI Gabriele ;1392;NC;30;LT;171193;0;123622;m -MADONIA Tommaso ;1542;3N;30;BO;070492;0;100300;m -MALTESE Alessio ;1491;NC;30;SR;260293;0;117037;m -MARANDO Francesco ;1431;NC;30;TO;020792;0;114468;m -MARANDO Mauro ;1401;NC;30;RC;230192;0;119747;m -MARINO Matteo ;1371;NC;30;GE;170992;0;120860;m -MAROTTA Andrea ;1521;3N;30;RM;110692;0;119330;m -MARTINELLI Matteo ;1413;NC;30;PG;250893;0;116954;m -MARTURANA Daniele ;1446;NC;30;AG;131092;0;121375;m -MAYER Nicola ;1473;NC;30;PN;300792;0;115667;m -MEDEOT Enrico ;1431;NC;30;GO;190792;0;118383;m -MEDURI Gabriele ;1377;NC;30;RC;300692;0;119711;m -MENGA Davide ;1419;NC;30;BA;210593;0;122582;m -MERCOLINO Giuseppe ;1431;NC;30;SA;040892;0;107021;m -MINELLI Paolo ;1431;NC;30;PG;080893;0;119294;m -MINNITI Cristiano ;1608;2N;30;SR;111192;0;114593;m -MOLINARI Alessio ;1416;NC;30;RM;060593;0;118430;m -MONTICOLO Lorenzo ;1473;NC;30;TS;041092;0;119089;m -MORTOLA Francesco ;1371;NC;30;GE;160993;0;116656;m -NAPPI Andrea ;1368;NC;30;CS;270393;0;120077;m -NINNO Angelo ;1482;NC;30;BA;300993;0;122581;m -NUNNARI Matteo ;1407;NC;30;RC;270192;0;116707;m -NUZZO Amedeo ;1434;NC;30;PA;110292;0;123144;m -OGNIBENE Andrea ;1416;NC;30;MO;260692;0;115910;m -ORLANDI Niccolo' ;1425;NC;30;MO;101192;0;115905;m -PACHERA Marco ;1545;3N;30;VR;260393;0;114528;m -PALAZZI Franco ;1413;NC;30;PE;211193;0;121213;m -PINTO Andrea ;1524;3N;30;RM;290792;0;117239;m -PISCITELLI Vito ;1617;2N;30;RM;051293;0;121699;m -PITOCCHI Jonathan ;1383;NC;30;PG;110692;0;116961;m -POLILLI Patrizio ;1446;NC;30;RM;120393;0;122910;m -REBECCHI Gabriele ;1413;NC;30;PC;161092;0;114803;m -ROSATI Riccardo ;1416;NC;30;LU;071192;0;116316;m -SCARCELLO Orlando ;1404;NC;30;CS;070192;0;118921;m -SENONER Samuel ;1464;3N;30;BZ;030592;0;109701;m -SGRO' Daniele ;1422;NC;30;RC;030892;0;119704;m -SORACE Federico ;1446;NC;30;XX;070492;0;122515;m -SORIENTE Matteo ;1554;3N;30;PG;171292;0;118352;m -STILLITTANO Assunto ;1410;NC;30;RC;080992;0;119707;m -TALPO Filippo ;1518;3N;30;AN;130993;0;118661;m -VALTUCCI Federico ;1516;3N;30;SA;190792;0;112178;m -VECCHIO Gianluca ;1416;NC;30;MI;020993;0;118205;m -VERGINE Nicolas ;1416;NC;30;RM;121093;0;123628;m -ZAMMARANO Fabio ;1395;NC;30;UD;110292;0;115121;m -CAFIERO Giuseppe ;1422;NC;30;SA;131192;0;118551;m -ASSENZA Alice ;1533;3N;30;SR;230193;0;113445;f -BATTAGLIA Domenica ;1389;NC;30;RC;161293;0;119719;f -BOSI Adele ;1446;NC;30;PG;300192;0;119285;f -CASATI Alice ;1407;NC;30;TO;290392;0;123610;f -CASOLINO Rosamaria ;1593;3N;30;BA;140793;0;120529;f -CHIASSERINI Elisa ;1446;NC;30;PG;051292;0;113504;f -CRESCENTE Elena ;1467;NC;30;BA;090193;0;116105;f -CUTUGNO Laura ;1401;NC;30;ME;181192;0;122993;f -D'AGOSTINO Roberta ;1440;NC;30;SA;120592;0;108600;f -IANCARELLI Alessia ;1449;NC;30;LT;280293;0;123621;f -JOOSTEN Martina ;1437;NC;30;SI;120393;0;122289;f -LUCCHI Angela ;1356;NC;30;RN;090893;0;116834;f -MERENDINO Simona ;1608;2N;30;PA;230193;0;108455;f -MITTICA Maria ;1482;NC;30;RC;030792;0;119742;f -NEMESI Federica ;1389;NC;30;RM;030593;0;121499;f -NEPI Sara ;1374;NC;30;RM;120793;0;123486;f -NOFRI Fulvia ;1425;NC;30;PG;220193;0;116957;f -PALMITESSA Chiara ;1569;3N;30;BA;101293;0;116729;f -PIGNATELLI Francesca;1533;3N;30;RM;240493;0;113397;f -RIZZO Alessia ;1374;NC;30;VI;061093;0;121669;f -ROMANI Elisabetta ;1398;NC;30;RM;191193;0;123492;f -RUFO Penelope ;1440;NC;30;RM;180893;0;121703;f -SCOLLO Sissi ;1495;3N;30;SR;230993;0;106611;f -SILVI Giulia ;1383;NC;30;AN;120693;0;122404;f -TAMPOIA Chiara ;1590;3N;30;GE;010192;0;120862;f -BELARDINELLI Lisa ;1413;3N;30;GO;120594;0;110262;f -BELTRAMI Alessia ;1422;NC;30;AL;020295;0;123188;f -CANNONE Giada ;1410;NC;30;RM;091294;0;121507;f -CATALDI Claudia ;1455;NC;30;BA;030894;0;116695;f -CHIARION Elisa ;1636;2N;30;MO;110995;0;119498;f -CORSARO Cecilia ;1335;NC;30;CT;020794;0;123677;f -DE-SANTIS Maria Clau;1440;NC;30;PG;061294;0;121857;f -DI-PERNA Roberta ;1434;NC;30;TO;201094;0;123579;f -DORONZO Eliana ;1524;3N;30;BA;171194;0;123512;f -ERCOLANO Giada ;1359;NC;30;SA;120396;0;121524;f -GERGOLET Brigita ;1425;NC;30;GO;280394;0;118380;f -LEANDRI Eleonora ;1410;NC;30;PG;291294;0;123539;f -LOMBARDO Sarah ;1335;NC;30;NA;220496;0;123010;f -LORUSSO Serena ;1434;NC;30;BA;260894;0;116698;f -MARINCOLO Ginevra ;1410;NC;30;CS;210396;0;123371;f -MERENDINO Roberta ;1386;NC;30;PA;211294;0;120902;f -MICIELI Giulia ;1371;NC;30;SR;121094;0;122980;f -MILANO Maria ;1323;NC;30;SA;091094;0;121528;f -MINNITI Elenamaria ;1455;NC;30;SR;191094;0;119461;f -MUTOLI Martina ;1440;NC;30;PA;150494;0;122280;f -MUTOLI Samantha ;1410;NC;30;PA;281095;0;122281;f -PRUGGER Leonora ;1386;NC;30;BZ;021195;0;123358;f -RIZZA Cristina ;1440;NC;30;SR;300594;0;122815;f -RIZZA Federica ;1440;NC;30;SR;300594;0;122816;f -ROMEO Myriam ;1482;NC;30;CS;180794;0;119731;f -VENTURELLI Ester ;1455;3N;30;MO;131294;0;117170;f -KUMANAKU Fatmira ;1440;NC;30;ME;090994;0;122986;f -ALABISO Mirco ;1418;2S;30;SR;110294;0;116809;m -DI-TRAPANI Davide ;1583;2N;30;MO;180194;0;117736;m -ALTINI Nicola ;1635;2N;30;BA;080395;0;121955;m -AMORE Ludovico ;1434;NC;30;SR;100594;0;116669;m -ARANGIO Alessandro ;1482;NC;30;SR;130194;0;116791;m -ARGENTO Pasquale ;1311;NC;30;SA;070294;0;121521;m -BERGOGLIO Luca ;1446;NC;30;TO;030494;0;123581;m -BIAGIOTTI Dario ;1440;NC;30;LU;100197;0;122081;m -BIAGIOTTI Matteo ;1410;NC;30;LU;131194;0;120038;m -BINCI Filippo ;1446;NC;30;AN;010396;0;122206;m -BISCEGLIA Andrea ;1425;NC;30;CE;140296;0;116178;m -BOCCAFOGLI Lorenzo ;1374;NC;30;BO;090494;0;117730;m -BORDIN Francesco ;1383;NC;30;TV;170694;0;118833;m -BORIERO Federico ;1395;NC;30;TO;210594;0;123595;m -BRUNELLO Marco ;1344;NC;30;TV;280796;0;122623;m -BRUNI Roberto ;1482;NC;30;GO;150295;0;115022;m -BURRONI Matteo ;1365;NC;30;SI;020796;0;122287;m -CAMPAGNOLA Giacomo ;1383;NC;30;TV;250496;0;118822;m -CAPIZZI Biagio ;1677;2N;30;UD;220994;0;115580;m -CARBONE Beniamino ;1380;NC;30;CS;270496;0;119722;m -CARTA Nicholas ;1380;NC;30;GE;021295;0;121761;m -CASTELLITI Daniel ;1422;NC;30;RM;190294;0;122909;m -CAVATASSI Alessandro;1455;NC;30;TE;151294;0;119856;m -MARCHINI Umberto ;1428;NC;30;LU;260994;0;120032;m -CIANI Lorenzo ;1470;NC;30;PI;260494;0;122789;m -CINQUE Antonio ;1494;3N;30;SA;220994;0;121520;m -CUSUMANO Federico ;1485;NC;30;AG;;0;11017;m -DE-BORTOLI Thomas ;1458;NC;30;TV;211195;0;118825;m -DE-MONTE David ;1461;NC;30;UD;180594;0;118779;m -DI-CASTRO Michelange;1383;NC;30;RM;070595;0;122907;m -DI-FEDERICO Lorenzo ;1395;NC;30;PE;030694;0;115473;m -DIPACE Federico ;1572;3N;30;BA;260294;0;123510;m -DI-PAOLO Lorenzo ;1323;NC;30;GE;190995;0;121762;m -DOGLIOTTI Simone ;1395;NC;30;IM;101194;0;118643;m -DORONZO Michele ;1476;NC;30;BA;060396;0;123511;m -DORONZO Nicolo' ;1425;NC;30;CN;291094;0;122424;m -ESPOSITO Alfonso ;1442;2S;30;SA;141197;0;120375;m -FORNI Andrea ;1485;3N;30;BA;080394;0;122833;m -FOTI Antonino ;1326;NC;30;RC;021094;0;119718;m -GIORGIUTTI Jacopo ;1413;NC;30;UD;301094;0;115118;m -GIULIANO Vincenzo ;1446;NC;30;SR;290194;0;116800;m -GIUNTA Antonio ;1446;3N;30;ME;240494;0;119107;m -GRAMACCIONI Lorenzo ;1398;NC;30;PG;260594;0;121856;m -GRASSI Andrea ;1419;NC;30;TN;140194;0;114774;m -GRASSINI Jacopo ;1398;NC;30;CE;140994;0;121205;m -GRAVINA Eugenio ;1467;NC;30;BO;050394;0;118842;m -IANNICELLA Simone ;1518;3N;30;CS;170295;0;123369;m -LAGHETTI Francesco ;1467;3N;30;BA;140395;0;117179;m -LAPENNA Davide ;1389;NC;30;MO;280494;0;121901;m -LEONE Alessandro ;1386;NC;30;CN;030194;0;122427;m -LOBINA Davide Raffae;1449;NC;30;CA;280494;0;116607;m -LOVREGLIO Gianluca ;1518;3N;30;BA;270494;0;116720;m -MALTESE Salvatore ;1431;NC;30;SR;230196;0;116772;m -MANCASSOLA Michelang;1458;NC;30;VR;010595;0;125336;m -MARSILI Riccardo ;1596;3N;30;PG;161095;0;116923;m -MENICONI Fabrizio ;1383;NC;30;PG;270894;0;121855;m -MENNUTI Alberto ;1614;2N;30;TO;100194;0;123584;m -MENOZZI Davide ;1491;NC;30;MO;140295;0;121714;m -MESSINA Salvatore ;1338;NC;30;SA;270797;0;121522;m -MICIELI Simone ;1413;NC;30;SR;190597;0;122811;m -MILITO Giuseppe ;1410;NC;30;CS;130694;0;119730;m -MILLIERY Jacopo ;1410;NC;30;AO;171194;0;123259;m -MUSETTI Flavio ;1431;NC;30;RM;171294;0;123481;m -NAGNI Danilo ;1440;NC;30;RM;030794;0;119016;m -NAPPI Davide ;1380;NC;30;CS;020495;0;123326;m -NIUTTA Matteo ;1410;NC;30;RM;230694;0;116481;m -NOFRI Giuliano ;1410;NC;30;PG;131096;0;119275;m -OFRIA Ludovico ;1512;3N;30;ME;130595;0;119166;m -PALLOTTI Ludovico ;1251;NC;30;GE;130195;0;121765;m -PUGLISI Michele ;1506;3N;30;IM;290595;0;118639;m -REBECCHI Luca ;1440;NC;30;PC;160495;0;118504;m -RIMONDI Riccardo ;1416;NC;30;FE;210794;0;120152;m -ROSSI Nicolo' ;1440;NC;30;UD;310796;0;120247;m -SECCHIAROLI Sebastia;1365;NC;30;AN;120395;0;122209;m -SPORNBERGER Maximili;1611;2N;30;BZ;280895;0;123357;m -TARDELLI Andrea ;1350;NC;30;LU;210895;0;114881;m -TIRELLI Mauro ;1551;3N;30;PC;010996;0;122367;m -TONNARELLI Amilcare ;1380;NC;30;AN;130894;0;123031;m -VALBUSA Lorenzo ;1443;NC;30;TV;030495;0;116155;m -VISENTIN Pietro ;1419;NC;30;VE;091096;0;114440;m -LEONETTI Pietro ;1488;NC;30;RM;;0;11073;m -NAVROSOV Nikolaj ;1362;NC;30;VE;;0;11074;m -SPOLAORE Luciano ;1545;3N;30;TV;240857;0;110697;m -PAULICELLI Domenico;1595;3N;30;BG;061246;0;121421;m -BOVERO Ezio ;1497;NC;30;TO;160963;0;111192;m -CAPUZZIMATI Fausto ;1515;3N;30;TO;230861;0;110472;m -MASIC Admir ;1467;NC;30;TO;;0;11079;m -GUGLIERMINA Pietro ;1491;NC;30;TO;260846;0;122631;m -IUVARI Antonio ;1398;NC;30;TO;060866;0;122635;m -MIGLIETTA Vincenzo ;1431;NC;30;TO;160259;0;122634;m -PUGLIESE Luca ;1515;3N;30;TO;021086;0;120603;m -CLAPPA Elena ;1374;NC;30;TN;190995;0;118547;f -MASI Gabriele ;1374;NC;30;MI;081090;0;123785;m -MESSINA Sebastiano ;1299;NC;30;BG;271269;0;121510;m -COSTARIOL Mario ;1539;3N;30;GO;100358;0;120356;m -CONTI Franco ;1383;NC;30;SV;140570;0;117008;m -ADABBO Giovanna ;1259;2S;30;BA;020661;0;111289;f -SIMONETTI Roberto ;1419;NC;30;LC;020269;0;123475;m -TRUZZI Andrea ;1422;NC;30;BG;290191;0;109788;m -TRUZZI Stefano ;1485;3N;30;BG;151288;0;109789;m -VISCONTI Umberto ;1524;3N;30;MI;271176;0;123795;m -ZACCARIA Sonia ;1413;NC;30;AO;040371;0;123796;f -CONTE Davide ;1392;NC;30;MI;110290;0;123786;m -FRAGOMENI Carlo ;1422;NC;30;;211071;0;11099;m -GUARDUCCI Simone ;1347;NC;30;BG;110571;0;120717;m -COSMA Giovanni ;1482;NC;30;VE;300967;0;118684;m -JOOSTEN Francesco ;1218;NC;30;SI;220596;0;123317;m -MANFRIN Giuseppe ;1350;NC;30;VI;260749;0;114269;m -FUSI Marco ;1425;NC;30;;;0;11104;m -REGINATO Lino ;1575;3N;30;TV;040258;0;103382;m -TOTH Gergo;1518;;30;EE;;0;11106;m -DE-CIANTIS David ;1569;3N;30;TR;230385;0;119119;m -FLORIS Paolo ;1374;NC;30;SS;;0;11108;m -GIRALDI Alberto ;1461;NC;30;RM;130961;0;114548;m -LIBERATI Marco ;1419;NC;30;RM;190770;0;108929;m -MALIGNO Francesco ;1374;NC;30;RM;211273;0;121486;m -MENICOCCI Mario ;1350;NC;30;TR;210860;0;120395;m -PAGANO Gianmario ;1461;NC;30;RM;;0;11113;m -RUOTOLO Claudio ;1587;2N;30;RM;200465;0;119226;m -HECHT Manfred ;2000;;30;EE;;0;11115;m -BARBETTA Fulvio ;1482;NC;30;AL;090668;0;123806;m -MARANO Giuseppe ;1652;2N;30;CT;240252;0;114946;m -ONOFRIO Marco ;1422;NC;30;UD;030596;0;123781;m -CLERICI Francesca ;1443;NC;30;BI;130290;0;116623;f -GRANELLI Marco ;1440;NC;30;BG;131093;0;115693;m -BERTARINI Filippo ;1380;NC;30;MO;230195;0;119500;m -NICODEMO Alessio ;1446;NC;30;UD;070290;0;123777;m -CHU-ORTEGA Oscar ;1440;NC;30;UD;250788;0;105976;m -DE-LUCA Beatrice ;1350;NC;30;UD;291192;0;123776;f -DE-MONTE Steven ;1431;NC;30;UD;180594;0;120245;m -ALFIER Francesco ;1386;NC;30;PD;240289;0;123779;m -MUZZOLINI Antonio ;1464;NC;30;UD;090693;0;108799;m -BELARDINELLI Luca ;1338;NC;30;GO;260296;0;115020;m -BOSCHI Giulia ;1401;NC;30;BG;031093;0;112378;f -STEFANI Adriano ;1398;NC;30;MO;120993;0;119549;m -ALFIER Cecilia ;1350;NC;30;PD;270393;0;123778;f -ONOFRIO Isabella ;1374;NC;30;UD;241094;0;123782;f -RICCIARDI Giovanni ;1350;NC;30;LE;290292;0;123780;m -BRAGAGNOLO Daniele ;1380;NC;30;PD;070294;0;123775;m -MARINO Francesco ;1655;2N;30;SA;210161;0;120631;m -LA-BELLA Alessio ;1452;NC;30;TP;270292;0;117111;m -CARBONE Leonardo ;1355;2S;30;TP;200950;0;110579;m -COLICCHIA Michele ;1496;2S;30;TP;111194;0;115529;m -PELLEGRINO Vincenzo ;1511;3N;30;TP;260992;0;117670;m -MELATO Pierpaolo ;1512;3N;30;CT;150290;0;117161;m -VIGNERA' Carmelo ;1467;3N;30;CT;260958;0;117104;m -MIRABELLI Sante;1425;NC;30;;;0;11145;m -CARDINALETTI Alfredo;1791;1N;30;AN;130364;0;122258;m -SARTINI Michele ;1464;NC;30;AN;071079;0;120197;m -FAGIOLINO Giulia ;1440;NC;30;VT;230986;0;106423;f -SAVORETTI Andrea ;1744;2N;30;MC;101286;0;111450;m -GENNARINI Giuseppe ;1365;NC;30;AN;;0;11150;m -FROWEIN Ernst ;1425;NC;30;AN;261043;0;111465;m -VENTURI Luca ;1608;2N;30;PT;170485;0;123772;m -GUERRA Renzo ;1575;3N;30;PU;041057;0;123799;m -MARISCOLI Maurizio ;1455;NC;30;AN;;0;11154;m -FIORUCCI Gianni ;1455;NC;30;PG;150962;0;122064;m -ZERBA Fabio ;1479;NC;30;RO;290373;0;117427;m -PINELLI Andrea ;1419;NC;30;AN;;0;11157;m -FABRIZI Barbara ;1428;NC;30;AN;050668;0;121243;f -SCHIAVO Pasquale ;1392;NC;30;CE;;0;11159;m -GHIZZANI Cecilia ;1335;NC;30;FI;;0;11160;f -DONATI Riccardo ;1434;NC;30;SP;;0;11162;m -FERRUCCI Michele ;1443;NC;30;AN;030389;0;122431;m -FERRUCCI Nicola ;1398;NC;30;AN;210694;0;118658;m -FRITTELLI Matteo ;1392;NC;30;AN;021094;0;108577;m -MARCONI Gabriele ;1362;NC;30;AN;060293;0;122203;m -MARCONI Luca ;1395;NC;30;AN;030296;0;122204;m -RICCI Federico ;1524;3N;30;RM;280393;0;122911;m -DOMENIGHINI Roberto ;1709;2N;30;MI;220759;0;110823;m -CASTELLETTI Silvio ;1401;NC;30;MI;;0;11172;m -LATTANZIO Armando ;1503;3N;30;BA;020887;0;109449;m -REIF Werner ;1764;;30;EE;;0;11174;m -TERRIZZI Salvatore ;1500;3N;30;ME;071167;0;118253;m -VELLA Edoardo ;1458;NC;30;CT;091188;0;103445;m -SPADARO Carmelo Anto;1494;3N;30;ME;091170;0;123005;m -TRINGALI Alessandro ;1530;3N;30;ME;230987;0;119310;m -MARRAPODI Corrado ;1440;NC;30;ME;060586;0;123750;m -FAZIO Gabriele ;1473;3N;30;ME;070587;0;120475;m -SALEMI Marco ;1332;NC;30;CT;070394;0;122094;m -SALEMI Lorenzo ;1332;NC;30;CT;080287;0;123637;m -DA-CAMPO Salvatore ;1407;NC;30;ME;100649;0;113831;m -ROMEO Francesco;1230;NC;30;RM;290456;0;117060;m -BATIC Aleksander ;1852;;30;EE;;0;11185;m -BEMBIC Corrado ;1350;NC;30;TS;090372;0;110161;m -BOERCI Roberto ;1440;NC;30;TS;110568;0;123839;m -DEANCOVICH Patrizio ;1461;NC;30;TS;040861;0;111976;m -DEBELJAK Daniele ;1419;NC;30;TS;;0;11190;m -DEL-CONT-BERNARD Ema;1299;NC;30;TS;011272;0;123841;f -DUDINE Stefano ;1395;NC;30;TS;090490;0;118745;m -FELLUGA Bruno ;1470;NC;30;TS;070690;0;111978;m -GAGGI Luciano ;1473;NC;30;TS;201022;0;123842;m -IANCOVIC Bruno ;1536;3N;30;TS;010145;0;103188;m -OBLAK Marko ;1455;NC;30;TS;040856;0;123843;m -ROZMANN Glauco ;1419;NC;30;TS;020548;0;120450;m -SOSSI Enzo ;1461;NC;30;TS;230458;0;115559;m -ACCATTATO Mario ;1440;NC;30;EE;;0;11199;m -BERTOCCI Daniel ;1626;2N;30;GE;261291;0;119074;m -BERTOCCI Jan ;1383;NC;30;GE;150493;0;119075;m -CARILLO Marcello ;1341;NC;30;GE;181190;0;123810;m -GODART Francois ;1440;NC;30;EE;;0;11203;m -GODART Michel ;1600;2N;30;EE;;0;11204;m -KAPPES Konstantin ;1800;1N;30;EE;;0;11205;m -LUPPI Dario ;1736;2N;30;CO;261163;0;123808;m -SILVESTRI Giuseppe ;1903;1N;0;GE;280981;824410;123807;m -NIEWERTH Stephan ;1800;1N;30;EE;;0;11208;m -ROENSCH Kerstin ;1500;3N;30;EE;;0;11209;m -NEUHOLD Piero ;1431;NC;30;GE;190147;0;115214;m -PFLEGER Jochen ;1440;NC;30;EE;;0;11211;m -PFLEGER Jurgen ;1440;NC;30;EE;;0;11212;m -COSENTINO Giulio ;1632;2N;30;CT;;0;11213;m -GRASSO Giuseppe ;1527;3N;30;CT;300790;0;123729;m -BARBAGALLO Franco;1425;NC;30;CT;280341;0;123055;m -MACCARIONE Franco;1542;3N;30;;;0;11217;m -GOZZO Massimo ;1422;NC;30;SR;051189;0;121329;m -OLIVIERI Lucio;1635;2N;30;SR;051186;0;122233;m -RIZZA Francesco ;1605;2N;30;CT;140890;0;123054;m -TROVATO Fabio;1455;NC;30;CT;261086;0;120761;m -ANDO' Alberto ;1398;NC;30;CT;300695;0;123727;m -BONGIOVANNI M ;1425;NC;30;SR;100790;0;116666;m -GOZZO Andrea ;1512;3N;30;SR;051189;0;121328;m -CUTRONE Raffaele ;1335;NC;30;CT;250669;0;123918;m -ARENA Valerio ;1656;2N;30;CT;151088;0;117159;m -ANDO' Alessia;1473;NC;30;CT;010791;0;123728;f -MAZUR Davide ;1410;NC;30;SR;031191;0;121330;m -ROMANO Sebastiano ;1488;NC;30;SR;191291;0;116804;m -FURNARI Carmelo ;1470;NC;30;CT;181286;0;118126;m -MILITELLO Salvatore;1461;3N;30;CT;081262;0;121618;m -D'ACHILLE Paolo ;1700;2N;30;AN;260865;0;121808;m -ALESSANDRINI Alfredo;1425;NC;30;VT;260574;0;120772;m -PAOLINI Giuseppe ;1491;NC;30;CH;100360;0;123474;m -REZANKA Frantisek ;1561;;30;EE;;0;11237;m -MAIER Maximilian ;1569;;30;EE;;0;11238;m -URBANI Maurizio ;1512;3N;30;IM;040443;0;123882;m -POCAE Denis ;1549;2N;30;EE;;0;11240;m -CERVINI Ernesto ;1449;NC;30;CR;170746;0;121304;m -POZZI Giovanni ;1455;NC;30;LO;090389;0;121162;m -RADAELLI Pietro ;1431;NC;30;BG;141170;0;111709;m -MAGRONE Gennaro ;1527;3N;30;SV;191072;0;121785;m -MONTANI Riccardo ;1506;3N;30;SV;050394;0;123760;m -FEISTENAUER Ruben ;1413;3N;30;EE;;0;11246;m -ARNOULET Vanni ;1404;NC;30;TO;090254;0;109231;m -BAIO Giuseppe ;1485;NC;30;SR;060172;0;121247;m -CEPPARONE Enrico ;1431;NC;30;IM;250593;0;123883;m -WOLBER Johannes ;1440;NC;30;EE;;0;11250;m -ELCE Dennis ;1659;2N;30;IM;110375;0;123881;m -VIOTTI Alberto ;1520;3N;30;MI;030145;0;100111;m -BATTISTELLI Gianluca;1563;3N;30;MC;131186;0;112889;m -BRANDIMARTI Giuseppe;1479;NC;30;AP;010156;0;117332;m -BRANDIMARTI Luca ;1446;NC;30;AP;181092;0;121961;m -BRUNO Edoardo ;1518;3N;30;AP;130682;0;123324;m -CAFFIERO Luca ;1392;NC;30;BA;181081;0;120532;m -COCCIARO Bruno ;1482;NC;30;PI;240261;0;120228;m -CUTRONA Giuseppe ;1533;3N;30;AN;050887;0;123024;m -EGIDI Daniele ;1332;NC;30;AP;020173;0;123830;m -GIARDINI Fabio ;1482;NC;30;AP;140563;0;109748;m -MEDORINI Massimilian;1644;2N;30;MC;250582;0;117601;m -MELLUZZO Rosanna ;1401;NC;30;VI;0;0;11264;f -MORGANTI Luciano ;1443;NC;30;AP;241038;0;123829;m -RIPA' Daniele ;1584;3N;30;AP;220282;0;123826;m -RIPANI Paolo ;1494;NC;30;AP;;0;11267;m -ROSSI Nicolo' ;1485;NC;30;AN;080694;0;123042;m -SANTAVENERE Cipriano;1440;NC;30;AP;120947;0;123825;m -SARDARO Michele ;1434;NC;30;BA;0;0;11270;m -SCATASTA Manuel ;1434;NC;30;AP;0;0;11271;m -SERAFINI Gino ;1557;3N;30;AP;150366;0;113649;m -SEVEGLIEVICH Bruna ;1341;NC;30;VI;0;0;11273;f -TERRENZIO Francesco ;1416;NC;30;AP;0;0;11274;m -VIRGILI Pasquale;1431;NC;30;PI;010445;0;120233;m -CAPIZZI Filippo;1317;NC;30;UD;010962;0;120737;m -CROZZOLI Matteo;1383;NC;30;PN;210194;0;121338;m -DAL-BO Francesco;1434;NC;30;TV;011079;0;104204;m -CHU-ORTEGA Cesar;1482;NC;30;UD;101190;0;105977;m -SCIAN Nicola;1524;3N;30;UD;080483;0;123793;m -STEFANUTTI Piero;1365;NC;30;UD;090667;0;123791;m -PIASENTIN Oscar;1362;NC;30;PN;041172;0;117644;m -VELKOSILI Milorad;1419;NC;30;EE;0;0;11285;m -ZAMBON Andrea;1380;NC;30;PN;310589;0;120458;m -SCALA Stefano ;1644;2N;30;FC;240356;0;123887;m -GIGLI Claudio ;1593;3N;30;RN;291288;0;123835;m -FORTI Gino ;1383;NC;30;RO;251131;0;109866;m -AMICUCCI Michele ;1395;NC;30;AN;190164;0;123884;m -ANFUSO Luigi ;1485;NC;30;MI;310358;0;121255;m -DOMENICALI Giuseppe ;1347;NC;30;BO;270930;0;109864;m -DRUDI Andrea ;1677;2N;30;FC;261282;0;123885;m -FERRARA Pietro ;1440;NC;30;FC;151252;0;113652;m -FORABOSCO Giovannant;1434;NC;30;RA;030848;0;109865;m -GIORGINI Giacomo ;1305;NC;30;RN;121296;0;123889;m -LADENHAUF Joshua;1395;NC;30;;;0;11297;m -LO-TAURO Giovanni ;1440;NC;30;PN;200356;0;123356;m -GALLAVOTTI Eugenio ;1705;2N;0;MI;020356;827789;123886;m -ASSMANN Norbert;2000;;30;EE;;0;11300;m -ELBERT Gerhard;2024;CM;0;EE;;821152;11301;m -LEVANG PAAL Kristian;2053;CM;0;EE;;820695;11302;m -LEON LACUESTA Daniel;1800;;30;EE;;0;11303;m -CHRIST Ren;1800;;30;EE;;0;11305;m -FROWIS Annika;1600;;30;EE;;0;11307;m -LADENHAUF Gideon ;1833;;30;EE;;0;11309;m -LADENHAUF Karl ;1660;;30;EE;;0;11311;m -ELBERT Helmut ;1527;;30;EE;;0;11312;m -FROWIS Gerhard ;1500;;30;EE;;0;11313;m -KLOCKER Samuel ;1551;;30;EE;;0;11314;m -MAIWALD Uwe ;1500;;30;EE;;0;11315;m -BRIE Cesar ;1600;2N;30;EE;;0;11316;m -JAKMIROVIC Mladen ;1386;NC;30;EE;;0;11317;m -KLOCKER Johann ;1455;NC;30;EE;;0;11318;m -WEBER Dieter ;1440;NC;30;EE;;0;11319;m -TARNAUCEANU Sorin ;2176;;30;EE;180567;0;102756;m -KNOEPFLE Andreas ;1800;;30;EE;;0;11321;m -RANDAZZO Adrian;2187;CM;0;;;114251;11322;m -MASONE Sisto;1554;3N;30;BN;250869;0;121399;m -ARBUCCI Luciano ;1332;NC;30;FR;101251;0;123858;m -CAPPUCCIO Salvatore ;1698;2N;30;NA;190259;0;123855;m -CARILLO Giulio ;1380;NC;30;NA;260492;0;123861;m -CASTALDI Luigi ;1338;NC;30;NA;040551;0;109942;m -DE-ANGELIS Edoardo;1512;3N;30;NA;120990;0;114095;m -DI-GENNARO Francesco;1386;NC;30;NA;221296;0;123863;m -DONADIO Giacinto ;1422;NC;30;NA;210552;0;120317;m -EREMITA Domenico ;1632;2N;30;NA;120172;0;123856;m -FUSCO Luigi ;1371;NC;30;NA;220880;0;120318;m -IROLLO Francesco;1476;NC;30;NA;250372;0;123857;m -ONESTO Francesco ;1326;NC;30;NA;120493;0;123859;m -SAFFIOTI Giuseppe ;1425;NC;30;NA;070873;0;103961;m -SCALA Francesco ;1302;NC;30;NA;181189;0;123862;m -SIANO Giacomo ;1398;NC;30;NA;070293;0;123860;m -VIVIANI Nazzareno ;1449;NC;30;AP;110270;0;121959;m -FRUNZIO Antonio ;1473;NC;30;NA;;0;11339;m -PAOLILLO Ciro ;1494;NC;30;NA;300751;0;120363;m -LA-MARRA Mariano ;1488;NC;30;NA;260457;0;119435;m -NICOLETTI ALTIMARI V;1473;NC;30;NA;240664;0;123966;m -PELLEGRINO Carlo ;1386;NC;30;NA;031256;0;117231;m -GRIMALDI Roberto ;1464;NC;30;NA;221190;0;123963;m -CALDIERI Pasquale ;1570;3N;30;NA;230288;0;120488;m -RICCI Alessandro ;1482;NC;30;NA;150765;0;105629;m -VAROTTI Stefano ;1452;NC;30;MN;120690;0;123993;m -DI-FEDERICO Cristian;1440;3N;30;PE;280369;0;124036;m -LEVE Ettore ;1362;NC;30;PE;290360;0;124035;m -D'AMBROSIO Francesco;1449;NC;30;GE;090637;0;101086;m -D'ANGELO Anna ;1323;NC;30;GE;190563;0;101090;f -DI-PAOLO Luciano ;1377;NC;30;GE;;0;11352;m -FORNARO Giacomo ;1470;NC;30;GE;300843;0;117593;m -PELUSO Giovanni;1407;NC;30;GE;250592;0;118266;m -VELLO Bruno ;1476;3N;30;GE;090849;0;120442;m -DESIDERI Amedeo ;1474;1S;30;RM;061145;0;100350;m -BARONE Pierluigi ;1368;NC;30;RM;141271;0;123926;m -BOTTINI Maurizio ;1428;NC;30;RM;090144;0;123932;m -BRUNO Antonino ;1449;NC;30;RM;050456;0;120741;m -CABIANCA Davide ;1407;NC;30;RM;301156;0;123927;m -CAPPELLETTI Giuseppe;1422;NC;30;RM;100472;0;123928;m -CASIELLO Francesco ;1584;3N;30;RM;190571;0;120740;m -CERINO Raffaele ;1386;NC;30;RM;240274;0;123931;m -DE-NUNZIO Giuseppe ;1401;NC;30;RM;180690;0;117561;m -RUSSONIELLO Marco ;1425;NC;30;RM;241084;0;123930;m -TIZI Federico ;1407;NC;30;RM;040890;0;117560;m -GOJANI Mentor ;2064;CM;0;EE;;821020;11367;m -BITOSSI Massimo ;1749;2N;30;RM;030872;0;123890;m -DI-STEFANO Fabio ;1429;1S;30;RM;111168;0;110348;m -IACHELLA Giorgio ;1533;3N;30;RM;301081;0;119340;m -MARA Enrico ;1344;NC;30;RM;270693;0;121704;m -PASQUINI Ivan ;1479;NC;30;VT;100184;0;123968;m -SERLUCA Rosario ;1443;NC;30;RM;;0;11373;m -GIUSPINO Alessandro ;1617;2N;30;SS;011076;0;124325;m -SOTGIU Gian Mario ;1494;NC;30;SS;010373;0;122928;m -MASU Antonello ;1395;NC;30;SS;;0;11376;m -MONTI Davide ;1476;NC;30;SS;300382;0;120711;m -CASU Ettore ;1575;3N;30;SS;060159;0;122931;m -KELIJCIA Ramiz ;1395;NC;30;SS;060458;0;123942;m -AZZENA Lucio ;1554;3N;30;SS;070260;0;122185;m -SPANU Mario ;1395;NC;30;SS;300583;0;123712;m -RAMACCIATO Emanuele ;1368;NC;30;CB;010496;0;122895;m -CRAINICEAN Cornel ;1536;3N;30;EE;271154;0;124042;m -RAVAZZINI Luca ;1569;3N;30;MO;100966;0;118271;m -CAMBI Enrico ;1512;3N;30;MO;260769;0;110924;m -ESPOSITO Antonino ;1368;NC;30;FE;241247;0;120687;m -PASSINI Stefano ;1464;NC;30;MO;131091;0;115933;m -STERMIERI Andrea ;1419;NC;30;MO;201181;0;124002;m -ZUCCARDI Simone ;1359;NC;30;MO;221094;0;121913;m -KATZ Benjamin ;2012;;30;EE;;0;11392;m -ATTRUIA Stefano ;1600;2N;30;RM;040669;0;101829;m -TINEBRA Vincenzo ;1464;NC;30;RM;010853;0;121485;m -CARBONI Sergio ;1410;NC;30;SS;130643;0;111856;m -MORVILLO Massimo ;1560;3N;30;;;0;11396;m -LUBRANO Marcello ;1377;NC;30;;;0;11397;m -PETRETTO Nicola ;1440;NC;30;SS;170976;0;120401;m -MORVILLO Salvatore ;1425;NC;30;;;0;11399;m -PIAZZA Carmelo ;1419;NC;30;;;0;11401;m -MU Giovanni ;1374;NC;30;SS;210854;0;124016;m -LUMBAU Luigi Aimone ;1353;NC;30;SS;300595;0;124017;m -NICOTRA Orazio ;1471;1S;30;SS;160432;0;111988;m -CARTA Luca ;1425;NC;30;SS;300667;0;120399;m -DEVILLA Simone ;1413;NC;30;SS;160983;0;123014;m -SOLINAS Arturo ;1413;NC;30;SS;211024;0;124015;m -GOFFI Cesare ;1590;2N;30;SS;110751;0;125851;m -CORONA Gianfranco ;1296;NC;30;SS;130792;0;120891;m -MELI Vittorio ;1559;3N;30;TP;300569;0;113483;m -RIZZO Filippo ;1574;3N;30;TP;220577;0;113573;m -MICELI Sergio ;1539;3N;30;TP;130988;0;120947;m -RAISI Michele;1456;1S;30;RO;060569;0;103574;m -MANCIN Michele ;1647;2N;30;TV;031078;0;118363;m -OMERI Silvan ;2127;CM;0;VE;220573;825557;123994;m -VIOLA David ;1464;NC;30;RO;040374;0;117305;m -POMARO Renato;1419;NC;30;PD;051158;0;121075;m -PETRUK Nykola ;1991;CM;30;TV;110674;0;121273;m -BECIC Aid ;1425;NC;30;PD;181287;0;121321;m -PROIETTI Tosca ;1464;NC;30;RM;150379;0;124029;f -ROMEO Massimiliano ;1413;NC;30;RM;170968;0;117303;m -ROSSANO Albino ;1488;NC;30;RM;180150;0;124030;m -SAYOUR Remo ;1446;NC;30;RM;011051;0;122656;m -PAPP Kata;1494;;30;EE;;0;11424;m -DI-CIERO Carlo Alber;1398;NC;30;BS;190274;0;109938;m -RAMETTA Francesco Ru;1392;NC;30;CS;261191;0;109015;m -RAMETTA Pierpaolo ;1437;NC;30;CS;290888;0;109014;m -SCHROTT Johann ;1638;2N;30;BZ;290863;0;124022;m -BARTONICEK Zdenek Jr;2082;;0;EE;;824445;11429;m -DALENO Michele ;1357;1S;30;MI;191137;0;101755;m -COSTANTINI Mauro ;1434;NC;30;MI;290950;0;123866;m -GIOVANNINI Alessandr;1440;NC;30;MI;250487;0;123891;m -SCALFI Alberto ;1497;NC;30;MI;270863;0;123935;m -CITTERIO Carlo ;1431;NC;30;MI;030266;0;123934;m -GRIMONI Alessandro ;1575;3N;30;MI;040180;0;121549;m -RAIMONDI Davide ;1678;2N;0;MI;280976;827819;123933;m -DE-GIOIA Francesco;1398;NC;30;TA;040193;0;123294;m -BEI Guido;1392;NC;30;LU;280193;0;110636;m; -SCALISE Felicia ;1335;NC;30;CZ;050795;0;121988;f -JEANRENAUD Antonia ;1404;NC;30;BA;220545;0;125612;f -MONACO Daniele ;1533;3N;30;BA;010385;0;118631;m -CORDIANO Franco;1305;NC;30;VA;070365;0;123820;m -CROCI Raffaello;1449;NC;30;VA;070285;0;123903;m -D'ALICANDRO Giuseppe;1461;NC;30;MI;120951;0;120726;m -GEROSA Ottavio;1368;NC;30;VA;080954;0;122291;m -MILESI Riccardo;1440;3N;30;VA;290665;0;120881;m -DEL-PONTE Alessandro;1485;NC;30;GE;221088;0;116544;m -PANELLA Federico ;1350;NC;30;LU;281293;0;124011;m -MONTI Marco ;1470;NC;30;LU;240887;0;120037;m -MISCHI Renato ;1350;NC;30;LU;151178;0;124008;m -BONACCHI Roberto ;1470;NC;30;LU;270886;0;124013;m -PETRONI Gianluigi ;1503;3N;30;LU;290484;0;124005;m -MOFFA Michael ;1494;3N;30;LU;070286;0;121219;m -BORRELLI Giuseppe ;1353;NC;30;LI;050422;0;110420;m -CAVALIERE Massimo ;1494;3N;30;PO;161267;0;103895;m -INNOCENTI Giovanni ;1494;NC;30;FI;221294;0;120504;m -BORSELLI Francesco ;1710;2N;30;FI;100583;0;120507;m -MANGANI Diego ;1557;3N;30;LU;140675;0;124006;m -LUPERI Luigi ;1503;3N;30;LI;150452;0;110655;m -LANDI Paolo ;1497;NC;30;LI;311053;0;117964;m -WOLF Christian ;1518;3N;30;GR;180687;0;122897;m -FARINA Vincenzo ;1419;NC;30;LU;240179;0;122546;m -GIANNINI Massimo ;1416;NC;30;PT;080361;0;122226;m -ROVELLA Niccolo';1419;NC;30;LU;291294;0;124012;m -LUPPI David ;1560;3N;30;FI;040466;0;124007;m -SODINI Damiano ;1389;NC;30;LU;210992;0;116312;m -MANCINI Sandro ;1329;NC;30;LU;301165;0;117277;m -GIOVANELLI Davide ;1455;NC;30;MS;160470;0;120765;m -GIUNTOLI Andrea ;1626;2N;30;LI;051290;0;124014;m -MANTEGAZZA Carlo ;1736;2N;30;PI;010870;0;114393;m -SURRUSCA Federico;1495;1S;30;VE;310790;0;117885;m -GARBUIO Nicol;1449;NC;30;TV;080992;0;116163;m -FELTRACCO Andrea;1413;NC;30;TV;301088;0;111319;m -COSTANTINO Daniele;1434;NC;30;TV;060690;0;121132;m -VOGT Jonatan ;1620;2N;30;VA;070592;0;123877;m -ZARNESCU Adrian ;1500;3N;30;EE;280574;0;124033;m -LEGNINI Lido ;1515;3N;30;CH;030771;0;119441;m -ADINOLFI Alfredo ;1320;NC;30;FG;150969;0;112106;m -BUCCINI Marco ;1449;NC;30;AQ;120688;0;124023;m -DONATELLI Ivano ;1503;3N;30;PE;071168;0;124034;m -FALBO Benito ;1518;3N;30;AV;080377;0;120429;m -FERRARA Ugo ;1440;NC;30;PE;090639;0;106950;m -FLORIO Adriano ;1467;NC;30;PE;180990;0;121541;m -LEKA Elis ;1678;2N;30;CH;200979;0;123815;m -PICHIERRI Gianmatteo;1569;3N;30;VE;200777;0;124074;m -ZAMBIANCHI Lino ;1422;NC;30;CB;290861;0;124025;m -MINISTRINI Ivan ;1476;3N;30;NO;020470;0;124037;m -TONAZZO Fabio ;1479;3N;30;VA;250179;0;124039;m -RABBIOSI Carlo ;1453;3N;30;CO;280767;0;123995;m -ARAMINO Andrea ;1407;NC;30;TO;171093;0;120537;m -CORDOGLIO Simone ;1440;NC;30;TO;230193;0;121289;m -LOALDI Davide ;1524;3N;30;PV;300370;0;123941;m -MARIANI Marcello ;1407;NC;30;NO;190962;0;124038;m -RIVA Riccardo ;1485;NC;30;AL;040780;0;121395;m -FINAZZI Stefano ;1432;1S;30;MI;250377;0;104450;m -GUACCI Mirko ;1432;1S;30;MI;091285;0;108873;m -MANDELLI Fabio ;1543;3N;30;MI;120664;0;104593;m -FORNARI Sergio ;1433;2S;30;MI;180547;0;121620;m -BRAMBILLA Augusto ;1374;NC;30;MI;040642;0;113673;m -ANNONI Carlo ;1395;NC;30;MI;080491;0;120478;m -GARGHENTINI Luca ;1401;NC;30;MI;020591;0;124031;m -SPANO' Pietro ;1413;NC;30;TO;270351;0;105389;m -STUCCHI Alessandro ;1386;NC;30;MI;270991;0;120479;m -VISCONTI Simone ;1419;NC;30;MI;150491;0;120480;m -VERRELLI Adriano ;1746;2N;30;MO;120875;0;110416;m -BUZZELLI Giovanni ;1341;NC;30;AQ;211137;0;111247;m -CAPOTOSTO Carlo ;1431;NC;30;AQ;250153;0;103398;m -GIANNANGELI Mario ;1392;NC;30;AQ;130382;0;124024;m -LAVORGNA Antonio ;1410;NC;30;BN;021051;0;117568;m -MIOZZI Carmenzo ;1509;3N;30;CB;280374;0;115234;m -MIRALDI Corrado ;1503;3N;30;AQ;030242;0;103403;m -MARTI Enzo ;1416;NC;30;AP;070461;0;117342;m -MARTI Paolo ;1389;NC;30;AP;280394;0;121963;m -NARDINOCCHI Emanuele;1446;NC;30;AP;090776;0;118098;m -RAPINI Fabio ;1389;NC;30;TE;;0;11516;m -VALENTI Stefano ;1434;NC;30;AP;120867;0;122475;m -LONGIARU' Simone ;1537;3N;30;VE;010486;0;112134;m -ZANLORENZI Marco ;1444;1S;30;TV;140884;0;112130;m -CATTARUZZO Nicolo' ;1547;3N;30;VE;061285;0;123740;m -FANO Gabriel ;1521;3N;30;VE;120589;0;103093;m -STEFAN Marco ;1549;3N;30;VE;131187;0;115490;m -BALLARIN Beatrice ;1416;NC;30;VE;;0;11524;f -BERNARDO Davide ;1491;NC;30;VE;111274;0;121385;m -BONAFEDE Aurelio ;1428;NC;30;TV;300757;0;106497;m -BRESSAN Marco ;1605;2N;30;VE;060687;0;115480;m -CUTRONE Paolo ;1437;NC;30;VE;;0;11528;m -FAUSONE Vincenzo ;1413;NC;30;BL;251067;0;124230;m -PICCOLO Christian ;1476;NC;30;TV;210288;0;123659;m -ROSSI Stefano ;1464;NC;30;VE;;0;11531;m -VISENTIN Martino ;1401;NC;30;VE;290888;0;122471;m -WARGLIEN Eugenio ;1413;NC;30;VE;180989;0;121693;m -GIRI Ferruccio ;1401;NC;30;MC;;0;11534;m -PASTRELLO Michele ;1386;NC;30;PD;170881;0;124032;m -STANZIONE Claudio ;1371;NC;30;PD;220238;0;119586;m -DE-PASCALE Giancarlo;1613;2N;30;VE;021257;0;117408;m -LLUPA Oltjon ;1995;CM;0;EE;;821578;11538;m -DAL-ZOTTO Lorenzo ;1656;2N;30;TO;;0;11539;m -FIORIO Secondo ;1362;NC;30;TO;;0;11540;m -BERGAMINI Giulio ;1542;3N;30;TO;141186;0;123957;m -GATTO Luigi ;1392;NC;30;TO;250457;0;125001;m -NEMESIO Aldo ;1429;3N;30;TO;200152;0;108791;m -RAMASSOTTO Fabrizio ;1480;1S;30;TO;011073;0;100771;m -CARBONE Massimo ;1482;NC;30;TO;140373;0;123944;m -DE-GIULIO Antonio ;1407;NC;30;TO;190354;0;120873;m -GIARGIA Emanuele ;1551;3N;30;AT;280592;0;118987;m -REBUFFELLO Enrico ;1497;NC;30;TO;110889;0;120871;m -SACCO Lorenzo ;1515;3N;30;TO;140281;0;123943;m -OSELLA Luciano;1456;1S;30;TO;110352;0;100770;m -ALBERTINO Alessio;1440;NC;30;VC;050676;0;118153;m -PEROTTI Giovanni;1440;NC;30;VC;260631;0;104559;m -RICCHIARI Antonio ;1515;3N;30;PT;141151;0;121097;m -BOZZI Gianluca ;1455;NC;30;PT;090171;0;122229;m -INSETTI Luigi ;1383;NC;30;PT;;0;109205;m -DA-FONTOURA Leonardo;1952;;30;EE;060984;0;124060;m -PETRUCCI Riccardo ;1560;3N;30;RM;180492;0;117238;m -DE-LISA Carmine ;1620;2N;30;SA;251072;0;124063;m -CORREALE Antonio ;1542;3N;30;RM;290792;0;113395;m -MASTROSTEFANO Dante ;1593;3N;30;CE;200872;0;100402;m -DZIUK Boguslaw ;1525;2N;30;EE;;0;11562;m -BACCI Mauro ;1428;NC;30;GR;030158;0;122896;m -BARNI Daniele ;1542;3N;30;GR;180553;0;124045;m -BENASSAI Isacco ;1443;NC;30;FI;230379;0;119268;m -BENNATI Franco ;1470;NC;30;GR;160456;0;119068;m -DONZELLI Michele ;1419;NC;30;SI;301272;0;120482;m -MATTII Massimo ;1635;2N;30;SI;140270;0;124047;m -PERRINI Lucio Antoni;1146;NC;30;CE;111053;0;124044;m -SEGNINI Mauro ;1494;3N;30;LI;211259;0;106982;m -CARTA Federico ;1467;NC;30;CA;291190;0;122965;m -PILI Pietro ;1470;3N;30;CA;120642;0;110559;m -USAI Eros ;1389;NC;30;CA;171194;0;118909;m -PES Eleonora ;1482;3N;30;CA;061194;0;118904;f -PASCALIS Valentina ;1368;NC;30;CA;190292;0;123332;f -IESU Stefano Frances;1407;NC;30;CA;190790;0;122966;m -NESPECA Carlo ;1449;NC;30;AP;180474;0;112144;m -PERDICHIZZI Roberto ;1464;NC;30;AP;261162;0;122731;m -BATTISTI Daniele ;1530;3N;30;AQ;;0;11579;m -DI-GAETANO Marco;1455;NC;30;TE;;0;11580;m -IVALDI Chiara ;1407;NC;30;TE;220692;0;115429;f -LATTANZI Francesca ;1392;NC;30;TE;060192;0;106418;f -MORGANTI Luigi ;1446;NC;30;AP;;0;11583;m -BUSELLINI Emanuele ;1410;NC;30;PA;310857;0;110563;m -CANNIZZARO Giuseppe ;1440;NC;30;PA;180886;0;108401;m -CILONA Francesco ;1482;NC;30;PA;050173;0;120907;m -MACHI' Maurizio ;1467;NC;30;PA;;0;11587;m -NOTO Salvatore ;1404;NC;30;PA;250792;0;120434;m -SARRICA Mario ;1362;NC;30;PA;201286;0;120432;m -SARRICA Vincenzo ;1344;NC;30;PA;200791;0;120433;m -COLLO Francesco ;1407;NC;30;PA;021093;0;122260;m -MORELLO Guido ;1635;2N;30;PA;220493;0;122269;m -AMATO Gianluca ;1464;NC;30;PA;120392;0;109583;m -BARBERA Gianluca ;1455;NC;30;PA;191091;0;120024;m -GIUNTINI Giulia ;1350;NC;30;PA;160793;0;123153;f -GALANTE Diego ;1377;NC;30;PA;;0;11597;m -BONOMO Renan ;1401;NC;30;PA;011292;0;127001;m -BROWN Jonathan ;1500;3N;30;EE;;0;11599;m -FERRARELLO Francesco;1485;3N;30;CT;141247;0;119247;m -SICURELLA Emanuele ;1533;3N;30;CT;010691;0;119565;m -STELLA Andrea ;2120;CM;0;CR;140893;827061;115231;m -MARINO Francesco ;1455;NC;30;VR;190770;0;123992;m -MANTOVANI Celso ;1356;NC;30;PR;161148;0;110445;m -BUCCELLA Francescant;1497;NC;30;MN;131262;0;115085;m -BARILE Giuseppe ;1449;NC;30;AQ;170379;0;124069;m -DI-PIETRO Gabriele ;1539;3N;30;TE;280883;0;124070;m -GIANCRISTOFARO Luca ;1539;3N;30;CH;221283;0;122737;m -RUSSO Luigi ;1395;NC;30;AQ;181292;0;112834;m -ROMANO Davide ;1395;NC;30;VI;270383;0;123997;m -CUSELLA Flaviano ;1473;NC;30;VI;050369;0;121141;m -MOSSINI Massimo;1449;NC;30;VR;260374;0;100935;m -DADDATO Antonio ;1494;3N;30;BA;010591;0;120549;m -DELL'AQUILA Vittorio;1350;NC;30;BA;161291;0;116713;m -DISTASO Antonio ;1512;3N;30;BA;131096;0;121608;m -DISTASO Francesco Pa;1485;NC;30;BA;110691;0;121607;m -FUMARULO Emanuele ;1488;3N;30;BA;181192;0;120548;m -FUMARULO Giuseppe ;1416;NC;30;BA;310761;0;120535;m -FUMARULO Isabella ;1413;NC;0;BA;100894;0;120551;f -GORGOGLIONE Ettore ;1425;NC;30;BA;150897;0;120955;m -GORGOGLIONE Geremia ;1566;3N;30;BA;160890;0;116718;m -GORGOGLIONE Gianluca;1440;NC;30;BA;070496;0;120954;m -LATTANZIO Savino ;1638;2N;30;BA;150194;0;124048;m -LOMBARDI Benedetto ;1503;3N;30;BA;130594;0;120547;m -MARTIRE Giovanni ;1488;NC;30;BA;060796;0;120953;m -MASCOLO Corrado ;1524;3N;30;BA;070483;0;126005;m -PISTILLO Fabrizio ;1485;NC;30;BA;060993;0;116732;m -SANTERAMO Domenico ;1389;NC;30;BA;030595;0;120952;m -SARDELLA Angela ;1500;3N;30;BA;260391;0;122844;f -SFREGOLA Walter ;1446;NC;30;BA;010696;0;121613;m -VITOBELLO Andrea ;1440;NC;30;BA;301295;0;121615;m -MELODIA Vincenzo;1521;3N;30;TP;260773;0;114821;m -GUBINELLI Armando;1458;NC;30;TP;161170;0;120857;m -INCARDONA Dario;1410;NC;30;TP;171192;0;124094;m -LO-MAGLIO Angelo;1443;NC;30;TP;180490;0;124095;m -MANCUSO Dario;1395;NC;30;TP;260691;0;124096;m -RENDA Antonino;1395;NC;30;TP;131192;0;124097;m -RENDA Davide;1428;NC;30;TP;311094;0;124098;m -GRADARI Stefano ;1425;NC;30;VE;080880;0;120613;m -DELLA-PIETA' Adriano;1449;NC;30;VE;191178;0;121389;m -D'IMPERIO Luigino ;1386;NC;30;MI;210671;0;120514;m -MARROCCO Edoardo ;1428;NC;30;MI;311283;0;124064;m -AVESANI Giancarlo;1425;NC;30;VR;070259;0;122951;m -BRUNORO Gabriele;1461;NC;30;VR;230865;0;121874;m -CALIARI Riccardo;1407;3N;30;MN;051274;0;121301;m -DONGILI Thomas;1470;NC;30;VR;160391;0;114515;m -GRIGOLI Annalisa;1464;NC;30;VR;160763;0;121303;f -MESSETTI Thomas;1485;3N;30;VR;271293;0;118795;m -SALVETTI Carlo ;1377;NC;30;MI;280368;0;102935;m -GUCCIARDO Salvatore ;1560;3N;30;BG;190884;0;122721;m -BRATTI Lorenzo ;1393;1S;30;BG;120153;0;106036;m -PRIMAVERA Enrico ;1450;1S;30;BG;031262;0;106041;m -MAFFIOLETTI Massimil;1480;1S;30;BG;110669;0;114673;m -CHENAL Massimo ;1485;NC;30;AO;150587;0;123901;m -CLUSAZ Alain ;1395;NC;30;AO;160793;0;123261;m -NARDO Matteo ;1386;NC;30;AO;150192;0;123263;m -GIORDANO Silvestra ;1431;NC;30;NA;230754;0;123902;f -ROSSI Luciano;1422;NC;30;AO;061069;0;106184;m -CALO' Luigi ;1434;NC;30;LE;240387;0;123725;m -MANCO Caterina ;1407;NC;30;LE;;0;11664;f -MANCO Lorenzo ;1371;NC;30;LE;;0;11665;m -TROIANI Claudio ;1639;2N;30;MI;;0;11666;m -CERVESATO Eugenio;1548;3N;30;PN;300956;0;105877;m -ZULIANI Nicolas;1482;3N;30;;;0;11668;m -ZAPPALA' Alfredo;1509;3N;30;PN;061274;0;124058;m -BATTISTON Edoardo;1545;3N;30;PN;131189;0;114870;m -BONAZZA Alessandro;1557;3N;30;PN;280263;0;102011;m -CERVESATO Fabio;1461;NC;30;PN;180787;0;110340;m -MORATTI Emidio;1407;NC;30;GO;050855;0;114425;m -PITTAU Damiano;1524;3N;30;PN;130792;0;118049;m -POLESE Stefano;1296;NC;30;PN;220968;0;124056;m -TARDIVIO Luca;1365;NC;30;PN;210871;0;124057;m -TRAUZZI Paolo;1407;NC;30;GO;180666;0;115045;m -TURCHETTO Luca;1509;3N;30;UD;160669;0;121013;m -VILLALTA Roberto;1599;3N;30;PN;010450;0;120370;m -DI-DIA Benedetto;1380;NC;30;TP;010992;0;122776;m -DI-GIORGI Baldassare;1320;NC;30;TP;160592;0;122778;m -FERRANTE Massimo;1407;NC;30;PA;270791;0;119997;m -MATTARELLA Pietro;1452;NC;30;TP;130489;0;112113;m -SCIORTINO Benito;1380;NC;30;PA;240991;0;119996;m -DANZE' Francesco;1460;2S;30;MI;220760;0;112415;m -ALBERIO Silvio;1573;3N;30;MI;291058;0;111740;m -BARON Mauro;1329;NC;30;CO;200949;0;108078;m -BESIO Andrea;1407;NC;30;SO;240176;0;122660;m -CESARANO Marco;1782;2N;30;MI;261282;0;120605;m -CHIERCHIA Tommaso;1407;NC;30;MI;140586;0;104018;m -COLOMBANI Camillo;1257;NC;30;MI;170864;0;110209;m -DONINI Attilio;1425;NC;30;MI;280184;0;124192;m -MUCCINI Silvano;1329;NC;30;MI;040751;0;124194;m -PALLAVICINI Andrea;1512;3N;30;PV;130371;0;124196;m -PANDIANI Enrico;1512;3N;30;MI;241280;0;124195;m -STAUNOVO Daniele;1419;NC;30;MI;290375;0;124197;m -STIPS Felix;1874;1N;0;MI;140492;825263;124190;m -CRESCINI Angelo ;1506;3N;30;AR;120738;0;123985;m -IANCO Mario ;1446;NC;30;AR;;0;11701;m -LOMBARDI Roberto ;1404;NC;30;AR;140858;0;123764;m -MADIAI Federico ;1756;2N;30;AR;251187;0;123986;m -MADIAI Filippo ;1569;3N;30;AR;040480;0;123987;m -NORCINI Sergio ;1431;NC;30;AR;010939;0;123989;m -RACHITA Claudiu ;1461;NC;30;EE;310569;0;123766;m -RACHITA Marcello ;1467;3N;30;AR;080966;0;123763;m -REGINA Giuseppe ;1332;NC;30;AR;210747;0;123765;m -RIVI Mauro ;1515;3N;30;AR;201257;0;123762;m -VIGNALI Niccolino ;1449;NC;30;AR;;0;11710;m -ROSSI Franco ;1395;NC;30;AR;150550;0;123768;m -LIPPI Luca ;1395;NC;30;AR;290264;0;123770;m -SANAVIVI Giorgio ;1395;NC;30;AR;280765;0;123988;m -SILVESTRINI Astelio ;1410;NC;30;AR;070460;0;123767;m -TELLINI Marco ;1395;NC;30;AR;290353;0;123991;m -SCARPONI Paolo ;1425;NC;30;PG;140588;0;123970;m -POLLI Lorenzo ;1383;NC;30;PG;180688;0;123971;m -MARIOTTI Giacomo ;1485;NC;30;PG;070488;0;123972;m -CAMILLI Sara ;1386;NC;30;PG;280792;0;119280;f -MARCHESE Daniele ;1458;NC;30;IM;051084;0;112576;m -ARENA Desire' ;1479;3N;30;IM;;0;11722;f -PANI Diego ;1410;NC;30;IM;;0;11723;m -MIGLIORI Dennis ;1374;NC;30;IM;080396;0;124081;m -ASCARI Alex ;1425;NC;30;IM;;0;11725;m -BENVENUTI Cristian ;1353;NC;30;IM;210995;0;127304;m -DE-VILLA Valerio ;1455;NC;30;IM;;0;11727;m -SCARFO' Simone ;1470;NC;30;IM;130790;0;119540;m -FERRARO Luca ;1404;NC;30;NA;050290;0;121981;m -LICENZIATO Marco ;1413;NC;30;NA;020192;0;120893;m -MARCARELLI Roberto D;1407;NC;30;BN;;0;11731;m -PIZZA Cristiano ;1425;NC;30;BN;;0;11732;m -CUNSOLO Gianfranco ;1608;2N;30;SP;;0;11733;m -DENILI Fabio ;1467;NC;30;SP;121277;0;124476;m -GALEAZZI Matteo ;1368;NC;30;SP;081286;0;124479;m -KRESOVICH Svetozar ;1521;3N;30;SP;;0;11736;m -MENCONI Michele ;1386;NC;30;MS;;0;11737;m -CIANNAMEA Davide ;1398;NC;30;TA;091184;0;125359;m -STRANIERO Antonio ;1413;NC;30;TA;311044;0;125360;m -VILLANI Mauro ;1491;3N;30;TA;201269;0;125361;m -LEO Francesco ;1501;3N;30;LE;290989;0;104587;m -MANCO Mattia ;1435;1S;30;LE;250483;0;111983;m -SANTORO Emanuele ;1362;NC;30;LE;130592;0;118493;m -TONDI Tommaso ;1392;NC;30;LE;201168;0;112002;m -CERRETELLI Roberto ;1578;3N;30;UD;020153;0;124149;m -GUIDA Giulia ;1428;NC;30;UD;130652;0;122070;f -ZANIN Dario;2054;CM;0;TV;221068;615919;115352;m -DEL-GIUDICE Maurizio;1510;3N;30;FI;110465;0;124052;m -BERTOLINI Luca ;1614;2N;30;FI;170675;0;124051;m -BRUNACCI Neri ;1347;NC;30;FI;010279;0;124059;m -BUONAGUIDI Damiano ;1455;NC;30;FI;270488;0;124050;m -CANGIOLI Giulia ;1356;NC;30;FI;070162;0;120506;f -GHODS Maziar ;1350;NC;30;FI;301091;0;124049;m -MENESTRINA Fabrizio ;1509;3N;30;FI;151034;0;124053;m -MONACO Simone ;1503;3N;30;PT;150670;0;124054;m -PRINCIPIA Marco ;1506;3N;30;PO;151166;0;101414;m -TOTI Gabriele ;1410;NC;30;FI;090577;0;122545;m -TRAPANI Marco ;1440;NC;30;FI;121075;0;124055;m -SANTINI Nunzio ;1509;3N;30;RG;300555;0;120146;m -PAFUMI Antonio ;1404;NC;30;CT;010990;0;114064;m -PELUSO Alfio ;1365;NC;30;CT;;0;11761;m -DI-CARLO Giovanni ;1476;NC;30;CT;091082;0;123949;m -OCCHIPINTI Giovanni ;1608;2N;30;CT;210758;0;123975;m -TRIPICIANO Gabriele ;1395;NC;30;CT;270794;0;123982;m -LAMONICA Michele ;1272;NC;30;CT;270994;0;119552;m -PITRELLA Elisabetta ;1395;NC;30;CT;140297;0;123980;f -RIZZA Giovanni ;1362;NC;30;CT;041051;0;123976;m -SPARTA' Vincenzo ;1503;3N;30;ME;091066;0;120821;m -PUSANO Gianluca ;1458;NC;30;CT;291188;0;123981;m -PAPPALARDO Santo ;1443;3N;30;CT;080456;0;112274;m -ZANARDI Massimiliano;1470;NC;30;CT;010571;0;123977;m -CORDARO Giovanni ;1482;NC;30;CT;050864;0;123974;m -TIRENNA Francesco ;1503;3N;30;CT;021264;0;120346;m -SANITA' Claudio ;1470;NC;30;CT;120488;0;121224;m -LEDDA Gaetano ;1563;3N;30;CT;081292;0;114230;m -EVANGELISTA Gaspare ;1410;NC;30;CT;120579;0;119136;m -ALBERTI Paolo ;1545;3N;30;CT;140670;0;123973;m -NICOLOSI Francesco ;1395;NC;30;CT;130289;0;11778;m -MODICA Leonardo ;1395;NC;30;CT;231197;0;123978;m -PERROTTA Alessandro ;1350;NC;30;CT;040198;0;123979;m -SCEBBA Marco ;1503;3N;30;CT;251190;0;105237;m -GANDOLFO Adriano ;1383;NC;30;CT;301291;0;105238;m -CENTORBI Claudio ;1533;3N;30;CT;100690;0;113829;m -MODICA Andrea ;1410;NC;30;CT;200391;0;113705;m -RENDA Giuseppe ;1425;NC;30;CT;280488;0;120474;m -BERTI Francesco;1506;3N;30;PT;270955;0;122228;m -PATTON Renata ;1434;NC;30;TN;;0;11787;f -KOROVESHI Thoma;2000;CM;30;FI;290458;0;102094;m -ROSSI Luciano;1591;3N;0;MI;201245;827827;122739;m -BARTOLOMEI Tommaso ;1404;NC;30;RM;;0;11790;m -DI-GIULIO Dino ;1401;NC;30;RM;;0;11791;m -FERRARI Flavio ;1428;NC;30;RM;070694;0;122908;m -OLDANI Alessandro ;1413;NC;30;RM;;0;11793;m -PETRUCCI Filippo ;1398;NC;30;RM;;0;11794;m -DEL-GAISO Massimo ;1458;NC;30;MO;220969;0;124484;m -DI-TRAPANI Luigi ;1435;1S;30;MO;310159;0;117734;m -VIOLI Alarico ;1485;NC;30;MO;051287;0;122766;m -SANTI Andrea ;1848;1N;30;BO;311062;0;124294;m -ACCIARO Giuseppe ;1356;NC;30;BO;271058;0;124289;m -GABRIELLINI Gianfran;1434;NC;30;BO;020567;0;124290;m -MALDARELLI Edoardo ;1413;NC;30;BO;210763;0;124291;m -PAPALINI Gianluca ;1614;2N;30;BO;280570;0;124292;m -PEZZI Stefano ;1395;NC;30;BO;191069;0;124293;m -DACCO' Vittorio ;1401;NC;30;MI;100751;0;122868;m -MERONI Massimo ;1401;NC;30;VA;281061;0;123303;m -ADINOLFI Alessandro ;1392;NC;30;SA;010896;0;124264;m -AMMENDOLA Domenico ;1422;NC;30;NA;300558;0;124261;m -AMMENDOLA Giuseppe ;1365;NC;30;NA;301289;0;124262;m -AVAGLIANO Massimilia;1440;NC;30;SA;;0;11809;m -CODA Alfio ;1440;NC;30;SA;040593;0;124263;m -MANNARA Carmine ;1440;NC;30;SA;040493;0;122137;m -BELCARI Nicola ;1407;NC;30;PI;280154;0;123948;m -PAPINI Fabrizio ;1362;NC;30;LI;150656;0;121101;m -REZZOLLA Leonardo ;1401;NC;30;FG;240772;0;126425;m -CARDELLICCHIO Umbert;1497;3N;30;AV;090174;0;126423;m -KOSTELETZKY Rene' ;1740;;30;EE;;0;11816;m -BUCK Klaus-Michael ;1510;;30;EE;;0;11818;m -BENGSCH Norbert ;1557;3N;30;EE;;0;11819;m -FRANCHINI Thomas ;1500;3N;30;TN;110480;0;110617;m -MATTIOLI Andrea ;1437;NC;30;TN;150979;0;120465;m -FLORA Jashua ;1341;NC;30;EE;210887;0;124193;m -REPETTO Lodovico M.;1416;NC;30;MI;041194;0;124413;m -CALABRESE Maurizio ;1489;1S;30;MI;211057;0;100165;m -GREEVENBOSCH Corneli;1872;1N;30;MI;;0;11826;m -MARCELLO Marco ;1673;;30;EE;;0;11827;m -FUSA Nicola ;1650;2N;30;VR;150760;0;124209;m -GINNASI Roberto ;1395;NC;30;VR;240557;0;124208;m -BENEDETTI Dario ;1452;NC;30;VR;;0;11830;m -DALL'OGLIO Stefano ;1410;NC;30;VR;190271;0;113935;m -DONSBACH Peter ;1566;3N;30;VR;040171;0;113936;m -MADINELLI Roberto ;1413;NC;30;VR;070690;0;114514;m -MOLINAROLI Giacomo ;1482;NC;30;VR;300985;0;124207;m -ORLANDI Franco ;1398;NC;30;VR;090959;0;101546;m -PEROLIN Massimiliano;1380;NC;30;VC;220670;0;115845;m -STELLA Luca ;1680;2N;30;CR;100796;0;121547;m -ZIMOL Enrico ;1413;NC;30;VR;171090;0;120626;m -DONAGHY David ;1828;;30;EE;050191;0;11839;m -FABRELLO Alessandro ;1557;3N;30;TV;290372;0;122336;m -BOLLADA Peter ;1440;NC;30;EE;;0;11841;m -TAKAHASHI Rieko ;1440;NC;30;EE;;0;11842;m -BALBI Amedeo ;1374;NC;30;RM;;0;11843;m -FADDA Carlo ;1377;NC;30;RM;271143;0;115833;m -FERRARO Pietro ;1515;3N;30;RM;;0;11845;m -PALMIERI Giovanni ;1707;2N;30;RM;031274;0;112846;m -ROTUNNO Luigi ;1512;3N;30;RM;;0;11847;m -AIELLO Giuseppe;1422;NC;30;TP;260191;0;119328;m -BOMMARITO Danilo;1419;NC;30;TP;170792;0;126442;m -GULINO Gaspare;1410;NC;30;TP;200974;0;107772;m -ARCHITETTO Sandro;1509;3N;30;TP;201268;0;127466;m -LARUCCIA Tommaso ;1602;2N;30;BA;160973;0;125810;m -BRUNO Gianluca ;1437;NC;30;BA;180195;0;122828;m -CARPARELLI Carlo ;1533;3N;30;BA;080878;0;119180;m -CASTELLANETA Andrea ;1650;2N;30;BA;121075;0;125114;m -DE-FANO Francesco;1434;NC;30;BA;270990;0;125117;m -DIAMANTI Roberto ;1458;NC;30;BA;191190;0;118335;m -DIMOLA Luca ;1455;NC;30;BA;230293;0;122579;m -DIROMA Vincenzo ;1452;NC;30;BA;030388;0;122590;m -QUIROGA Sergio;2190;;20;EE;;0;11863;m -PAZZINI Elia;1572;3N;30;RN;161091;0;124085;m -MIRIZIO Mario ;1347;NC;30;BA;301293;0;122583;m -MUNNO Gianvito ;1311;NC;30;BA;280491;0;123790;m -PANARO Giacomo ;1314;NC;30;BA;291092;0;122580;m -RIZZI Salvatore ;1422;NC;30;BA;;0;11869;m -SARNO Clelia ;1350;NC;30;BA;;0;11870;f -BOZZO Alberto ;1587;3N;30;GE;161071;0;123853;m -FONTANA Maurizio ;1503;3N;30;GE;141175;0;124155;m -FOTI Federico ;1401;NC;30;GE;191094;0;124169;m -FRAVEGA Davide ;1446;NC;30;GE;301090;0;116654;m -FRESCO Paolo ;1455;NC;30;GE;;0;11877;m -MARTINO Giacomo ;1368;NC;30;GE;240990;0;116655;m -PIVOLI Andrea ;1413;NC;30;GE;070972;0;120638;m -DELLA-PIETRA Antonio;1386;3N;30;NA;090565;0;124073;m -PANICO Antonio ;1515;3N;30;NA;140790;0;124041;m -COCCHIA Umberto ;1515;3N;30;NA;011081;0;124040;m -GATTA Ferdinando ;1549;3N;30;NA;010552;0;120994;m -CINESI Giuseppe ;1365;NC;30;TV;080149;0;118024;m -BOSCO Massimo ;1452;NC;30;VB;230763;0;124188;m -CAPURSO Alberto ;1458;NC;30;MI;280366;0;120142;m -CLERICI Samuele ;1431;NC;30;MI;090988;0;124513;m -FRISINGHELLI Ugo ;1428;NC;30;MI;010430;0;120898;m -FUMAGALLI Mauro ;1425;NC;30;MI;101081;0;124203;m -PANDINI Claudio ;1323;NC;30;MI;080894;0;124514;m -SECONDI Alberto ;1470;NC;30;MI;101063;0;121158;m -MONTICONE Maurizio ;1507;3N;30;;;0;11893;m -TRAVERSA Virginia ;1462;1S;30;AT;270433;0;125906;f -ALONGI Luca ;1395;NC;30;AT;241093;0;122507;m -BRIGNOLO Fabio ;1476;NC;30;AT;300993;0;118980;m -BOUANANI Denis ;1473;NC;30;AT;091293;0;125915;m -CASSULLO Matteo ;1425;NC;30;AT;;0;11898;m -CATARISANO Giovanni ;1377;NC;30;AT;;0;11899;m -DELLA-NOCE Kevin ;1392;NC;30;AT;240694;0;118981;m -GARGANO Rosario ;1473;NC;30;AT;171166;0;105309;m -GASTALDELLO Lorenzo ;1398;NC;30;AT;251193;0;121928;m -LAMANTIA Alessandro ;1428;NC;30;AT;200292;0;121929;m -MARIUZZO Andrea ;1428;NC;30;AT;240293;0;118977;m -PIZZOLATO Matteo ;1416;NC;30;AT;201193;0;122513;m -ARRIGO Stefano;1407;NC;30;ME;280593;0;119208;m -OREFICE Luca;1476;NC;30;FE;021186;0;122665;m -BONFANTI Gianluca ;1431;NC;30;LU;;0;11911;m -GALLI Angelo ;1419;NC;30;LU;140860;0;122079;m -LENZA Cosimo ;1371;NC;30;LU;080461;0;121222;m -MARSALLI Dimitri ;1389;NC;30;LU;;0;11914;m -MARTINI Michele ;1470;NC;30;LU;;0;11915;m -MEI Francesco ;1416;NC;30;LU;;0;11916;m -TORRE Francesco ;1422;NC;30;LU;;0;11917;m -BRUGNARO Luca ;1338;NC;30;PD;;0;11918;m -PEZZOLATO Giacomo ;1410;NC;30;PD;280889;0;109641;m -CALABRIA Thomas ;1386;NC;30;PA;040891;0;123159;m -CAROLLO Daniele ;1491;NC;30;PA;281087;0;114972;m -VALENZA Giorgio ;1398;NC;30;PA;;0;11923;m -DE-BERTI Maurizio ;1476;NC;30;PC;080749;0;118512;m -FIORITO Michele ;1452;3N;30;TO;;0;11925;m -PAGANI Nicolo' ;1416;NC;30;PC;220487;0;118501;m -SOLENGHI Simone ;1362;NC;30;PC;070791;0;118498;m -SPADONI Damiano ;1500;3N;30;PC;070361;0;121630;m -CARUANO Giovanni ;1425;NC;30;RG;200655;0;122685;m -LOMBARDO Giovanni ;1386;NC;30;RG;150660;0;122688;m -PORTELLI Alessandro ;1377;NC;30;RG;120974;0;124469;m -CARLINI Palmiro ;1410;NC;30;AP;231275;0;124087;m -MERCURI Paolo ;1431;NC;30;AP;070280;0;124337;m -PALLOTTA Francesco ;1428;NC;30;AN;040671;0;124338;m -SABATINI Andrea ;1440;NC;30;AP;110293;0;121965;m -STRACCI Alessio ;1410;NC;30;AP;150691;0;121968;m -FRISONI Giorgio ;1632;2N;30;RN;061078;0;124656;m -BARTOLETTI Fabrizio ;1509;3N;30;FC;160366;0;122912;m -BERARDI Gian Luca ;1419;NC;30;RN;;0;11939;m -CRICCA Andrea ;1629;2N;30;FE;250684;0;100736;m -DEVAMBEZ Andrea ;1386;NC;30;RN;060972;0;122554;m -VISHANJI Adrian ;1770;2N;30;RA;100865;0;124464;m -LOMBARDI Davide ;1428;3N;30;RN;170994;0;121974;m -TACCHI Nicola ;1458;NC;30;SS;171171;0;121155;m -ROSSI Paolo Antonio ;1488;NC;30;FR;140684;0;104219;m -ZAMPETTI Mauro ;1446;NC;30;VT;;0;11946;m -BARBETTI Marco ;1401;NC;30;LI;211160;0;117965;m -FRANCHI Andrea ;1635;2N;30;LI;110680;0;120716;m -DONELLI Sergio ;1527;3N;30;RE;211138;0;124564;m -DECANETO Erick ;1452;NC;30;PR;051193;0;114537;m -GENNARI Valerio ;1428;NC;30;PR;080270;0;120884;m -PESCI Mirko ;1410;NC;30;PR;270370;0;124563;m -GENTILE Agostino;1430;2S;30;TP;050355;0;107081;m -MANNINA Giuseppe;1443;NC;30;TP;;0;11954;m -ADUM Fernando ;1618;2N;30;PG;;0;11955;m -BARTOLINI Ivan ;1473;NC;30;PG;;0;11956;m -CAPOSSELLA Fabio ;1542;3N;30;PG;281061;0;122349;m -BOSIMINI Emanuele ;1410;NC;30;PG;;0;11958;m -CESARINI Daniele ;1485;NC;30;PG;190777;0;121104;m -LUIGETTI Marco ;1416;NC;30;PG;170566;0;116010;m -RUSSO Gianfranco ;1326;NC;30;FG;011067;0;126069;m -PELYUSHENKO Vladysla;1557;3N;30;FG;270973;0;126071;m -LONGO Alessandro ;1539;3N;30;BA;;0;11963;m -CAMPANELLI Graziano ;1425;NC;30;BA;;0;11964;m -PAPEO Francesco ;1439;2S;30;BA;080958;0;107146;m -PAPEO Federico ;1410;NC;30;BA;;0;11966;m -DEL-NERO Valerio ;1395;NC;30;GE;201090;0;116653;m -PROFACE Giulio ;1449;NC;30;GE;050589;0;124687;m -BOKAJ Norges ;1581;3N;30;EE;;0;11969;m -BRUSCHI Massimo ;1506;3N;30;FI;201145;0;124151;m -BATIGNANI Francesco ;1398;NC;30;FI;061124;0;124150;m -BRUNI Biagio ;1371;NC;30;FI;050848;0;124516;m -CARDELLI Daniele ;1398;NC;30;FI;161261;0;124515;m -FALCINELLI Fabio ;1419;NC;30;FI;070663;0;124518;m -INGRAVALLO Onofrio ;1620;2N;30;RM;031263;0;121494;m -STOYKO Maksym ;1978;1N;0;EE;201191;824429;11977;m -LANZO Lorenzo ;1425;NC;30;IM;240693;0;114650;m -MARINO Gianluca ;1483;1S;30;TP;110590;0;120393;m -CILENTI Giuseppe ;1422;NC;30;RN;030389;0;124658;m -TOMASETTI Massimo ;1467;NC;30;RN;040758;0;121179;m -MOSCONI Ariel Oscar;2076;-M;20;EE;241165;821233;124437;m -BOSCO Davide ;1584;3N;30;VB;100388;0;128478;m -BOSCO Lorenzo ;1377;NC;30;VB;170193;0;123867;m -GALIMBERTI Matteo ;1506;3N;30;VA;180172;0;120896;m -GAVIOLI Paolo ;1467;NC;30;MI;201262;0;117217;m -LAMERA Giuseppe ;1383;NC;30;MI;130948;0;103000;m -BARDULLA Bilbil ;1470;NC;30;RE;;0;11988;m -BERGAMINI Andrea ;1563;3N;30;MO;161282;0;113145;m -CAMPARINI Luca ;1431;NC;30;PR;310190;0;119425;m -CATTINI Simone ;1461;NC;30;MO;150266;0;106817;m -CAVAZZONI Elena ;1422;NC;30;RE;300590;0;116523;f -HODO Arben ;1428;NC;30;MO;100270;0;120960;m -VITIELLO Luigi ;1383;NC;30;MO;100976;0;122049;m -SERRI Cristiano ;1584;3N;30;RE;260791;0;118575;m -TERZI Stefano ;1362;NC;30;RE;130990;0;122858;m -SHETA Isa ;1593;3N;30;AN;200661;0;125364;m -SHETA Redon ;1443;NC;30;AN;;0;11998;m -ADAMI Nicola ;1425;NC;30;TN;260690;0;121166;m -BUGLISI Massimo ;1644;2N;30;TN;230474;0;124519;m -CORSINI Marco ;1374;NC;30;TN;080195;0;110621;m -DAPPIANO Luigi ;1494;NC;30;TN;;0;12002;m -MARCON Daniele ;1395;NC;30;TN;090194;0;121781;m -CANTORO Daniele ;1584;3N;30;GE;241194;0;124585;m -GNETTI Paolo ;1578;3N;30;SP;291182;0;114118;m -MORANDO Silvio ;1422;NC;30;GE;101174;0;120301;m -SAFFIOTI Cristian ;1910;1N;0;GE;020378;827851;125560;m -SAFFIOTI Massimo ;1737;2N;30;GE;180674;0;125559;m -NAZZARO Ennio ;1548;3N;30;RM;070446;0;124020;m -VALENTI Diego ;1429;1S;30;RM;020236;0;114944;m -VAGNONI Guido ;1489;1S;30;RM;010932;0;118402;m -INGUSCIO Salvatore ;1501;3N;30;LE;290530;0;105363;m -SERRA Duilio ;1578;3N;30;LE;071277;0;125503;m -CITO Beatrice ;1419;NC;30;TA;040290;0;112993;f -DEMITA Donato ;1419;NC;30;TA;151092;0;110541;m -PAVONE Davide ;1452;NC;30;TA;250492;0;118482;m -COSMA Francesco ;1407;NC;30;TA;010293;0;120407;m -VINCI Lorenzo ;1401;NC;30;TA;231294;0;115165;m -NATOLI Andrea ;1575;3N;30;RM;050676;0;118093;m -PERILLI Piero ;1422;NC;30;RM;;0;12020;m -PIRAS Giampiero ;1392;NC;30;SS;;0;12021;m -BRUNELLI Flavio ;1599;2N;30;VR;150657;0;124273;m -OTERI Aldo ;1807;1N;30;BG;160947;0;124498;m -BERNARDI Luca ;1512;3N;30;BG;190293;0;112376;m -BIFFI Andrea ;1449;NC;30;BG;260493;0;112377;m -BASLETTA Giovanni ;1377;NC;30;BG;130360;0;123909;m -PELUSO Lorenzo ;1422;NC;30;SO;090975;0;124407;m -VACARCIUC Daniel ;1392;NC;30;VE;;0;12028;m -BISERNI Federica ;1392;NC;30;VE;030380;0;125306;f -VIDAL Irene ;1491;NC;30;VE;141288;0;120500;f -ROZZONI Davide ;1714;2N;30;MI;030964;0;124659;m -BERRA Matteo ;1428;3N;30;MI;130974;0;124554;m -CHIOSO Simone ;1422;NC;30;MI;260286;0;124723;m -CORTI Lorenzo ;1491;NC;30;MI;250690;0;124205;m -NARDI Maurizio ;1425;NC;30;LU;030954;0;106424;m -MAFFIOTTO Marco ;1519;3N;30;TO;030388;0;114055;m -ARTERO Carlo ;1545;3N;30;TO;010394;0;123604;m -BERARDO Umberto ;1518;3N;30;TO;180773;0;120874;m -COMO Claudio ;1437;NC;30;TO;170887;0;124995;m -COMO Alessandro ;1461;NC;30;TO;080694;0;123603;m -GREGORIO Marco ;1665;2N;30;TO;250689;0;124997;m -LORENZET Andrea ;1398;NC;30;TO;;0;12042;m -MAURINI Alessandro ;1440;NC;30;TO;;0;12043;m -MICCONO Flavio ;1446;NC;30;TO;;0;12044;m -MORBILLO Angelo ;1293;NC;30;TO;050655;0;124993;m -MORI Lorenzo ;1617;2N;30;TO;260888;0;124996;m -MOUHSSINE Omar ;1503;3N;30;TO;;0;12047;m -VENTURINO Federico ;1600;2N;30;AT;250188;0;125917;m -COMO Luigi ;1311;NC;30;TO;151257;0;124994;m -MAGGI Luigi ;1837;1N;0;RM;230658;827703;124451;m -DELL'AQUILA Marco ;1458;NC;30;RM;070389;0;123480;m -MAGGI Fabrizio ;1803;1N;0;RM;070391;826030;124937;m -ROCCHI Federico ;1705;2N;30;RM;170471;0;124455;m -PATRIARCHI Emanuele ;1398;NC;30;CB;050888;0;125135;m -TERZANO Francesco ;1374;NC;30;CB;300589;0;125136;m -BENEDETTINI Adriano ;1450;1S;30;PT;310146;0;102891;m -BORRELLI Salvatore ;1614;2N;30;NA;050970;0;124200;m -NARDIELLO Luigi ;1638;2N;30;NA;300774;0;124544;m -ROMANO Enrico ;1269;NC;30;NA;010968;0;124545;m -CAMMARATA Antonino ;1516;3N;30;TP;200574;0;123916;m -ARCA Alberto ;1269;NC;30;PV;110660;0;122054;m -GIORGI Giorgio ;1599;3N;30;PV;290466;0;124884;m -MOI Adriano ;1494;3N;30;PV;031033;0;105180;m -RIZZUTI Giuseppe ;1419;NC;30;RM;020851;0;125186;m -ANTONIOLO Riccardo ;1395;NC;30;VI;;0;12065;m -SARTORI Francesco ;1557;3N;30;PD;071238;0;115241;m -MARELLI Vittorio ;1427;2S;30;CO;230878;0;124314;m -MAGISTRONI Imerio ;1665;2N;0;MI;090656;827800;125060;m -BROCCOLINO Filippo ;1494;NC;30;MI;080489;0;125058;m -CREMONA Andrea ;1422;NC;30;MI;120874;0;125059;m -RONDINELLI Vincenzo ;1434;NC;30;LC;;0;12071;m -CATOLLA Mario Giusep;1467;NC;30;MT;;0;12072;m -CATOLLA Michele ;1452;NC;30;MT;;0;12073;m -CISTERNA Pietro ;1413;NC;30;MT;;0;12074;m -MANCIAGLI Fabio ;1410;NC;30;CT;130384;0;111545;m -MAMMOLITI Raffaele ;1479;NC;30;CT;231267;0;124482;m -SANTANGELO Carmelo ;1560;3N;30;SR;180378;0;124904;m -CONTI Damiano ;1503;3N;30;CT;;0;12078;m -LANZA Giuseppe ;1425;NC;30;CT;190982;0;124903;m -ALBERIO Rosario ;1443;NC;30;CT;;0;12080;m -GIANRUSSO Placido ;1422;NC;30;CT;;0;12081;m -OLIVA Andrea ;1494;NC;30;CT;160887;0;125872;m -PRIVITERA Angelo ;1425;NC;30;CT;171170;0;123638;m -CHIESURA Luca;1530;3N;30;BL;010972;0;105015;m -COLLAZUOL Diego;1359;NC;30;BL;030693;0;119839;m -COSTAN-ZOVI Riccardo;1431;NC;30;BL;160593;0;111238;m -FACCIN Andrea;1404;NC;30;BL;300365;0;105008;m -FILOMENA Gianpaolo;1455;NC;30;BR;180769;0;115412;m -NIBIO Luigi;1395;NC;30;BR;;0;12089;m -RENNA Vito;1413;NC;30;BR;;0;12090;m -VITALE Mimmo;1416;NC;30;BR;;0;12091;m -LOGGIA Mario;1471;1S;30;BI;281241;0;104694;m -CAPITO' Mario;1413;NC;30;AN;070388;0;125671;m -MANDOLINI Tonino;1449;NC;30;AN;121247;0;118709;m -SANTONI Eleonora;1362;NC;30;AN;260371;0;102322;f -SEDDA Roberto;1500;3N;30;CA;100564;0;125441;m -PINTUS Alberto;1606;2N;30;CA;110361;0;125439;m -ERRIU Giampiero;1521;3N;30;CA;200260;0;125438;m -ALGIERI Luca ;1428;NC;30;CS;180178;0;124681;m -FELISIO Antonio ;1455;NC;30;CS;300986;0;124530;m -FITTANTE Enrico ;1479;NC;30;CS;160670;0;124571;m -FUOCO Michel ;1422;NC;30;CS;;0;12102;m -FURFARO Lina ;1437;NC;30;CS;151067;0;124577;f -GIGLIO Luigi ;1422;NC;30;CS;070291;0;119690;m -LISERRA Roberto ;1407;NC;30;CS;120789;0;119683;m -PELLE Enzo ;1434;NC;30;CS;150762;0;124575;m -PELLE Marco ;1422;NC;30;CS;;0;12107;m -PELLE Silvia ;1389;NC;30;CS;;0;12108;f -PIZZUTI Adam ;1422;NC;30;CS;070493;0;121414;m -QUINTIERI Pierfrance;1503;3N;30;CS;100691;0;121417;m -RIZZO Osvaldo ;1461;NC;30;CS;030291;0;123384;m -SETTIMIO Ugo;1449;NC;30;CS;011189;0;119686;m -SPINA Julian ;1461;NC;30;CS;161071;0;110363;m -TRIPICCHIO Giovanni ;1446;NC;30;CS;090891;0;119691;m -AQUILEGI Nicola ;1449;NC;30;MN;100560;0;115371;m -BIACCHI Alessandro ;1428;NC;30;MN;260867;0;117129;m -FOGATO Fabio ;1422;NC;30;MN;011255;0;120672;m -PORPORA Ivano ;1488;NC;30;MN;120376;0;124686;m -SARASSI Luca ;1380;NC;30;MN;;0;12119;m -BUGADA Marco;1515;3N;30;BI;;0;12120;m -ARGIOLAS Alberto;1560;3N;30;BI;291074;0;125735;m -BOSCHIERI Fulvio;1482;NC;30;BI;181166;0;117564;m -CORTESE Giorgio;1410;NC;30;BI;;0;12123;m -GUANO Renato;1459;1S;30;BI;270347;0;102271;m -PREVELATO Massimo;1470;NC;30;BI;190160;0;102274;m -CALCAGNILE Lucio;1653;2N;30;PI;310582;0;127724;m -IVANOV Angel ;1512;3N;30;PI;;0;12127;m -STILLI Gabriele ;1413;NC;30;PI;190773;0;114397;m -ALBORGHETTI Ernesto ;1476;NC;30;BG;200160;0;106027;m -BARONTINI Aldo ;1452;NC;30;MI;170762;0;117357;m -CALVANI Vito ;1374;NC;30;MI;100365;0;121160;m -CALVI Gianluca ;1859;1N;0;MI;060373;825760;125551;m -DASSISTI Michele ;1500;3N;30;LO;230475;0;125678;m -FERRIGNO Angelo ;1431;NC;30;MI;;0;12134;m -PANAIO Luigi ;1395;NC;30;MI;230388;0;124497;m -RICCO' Giampaolo ;1419;NC;30;MI;200262;0;123846;m -RIVA Roberto ;1416;NC;30;MI;241171;0;120880;m -RUSCITTO Mauro ;1350;NC;30;PC;150165;0;124652;m -SECONDI Daniele ;1353;NC;30;MI;110892;0;123904;m -ROSINA Graziano;1779;2N;0;PD;060566;823759;123946;m -GERARDI Giuseppe ;1437;NC;30;BA;060473;0;125119;m -NEGRO Francesco;1539;3N;30;TO;150480;0;117538;m -CALVI Luca;1542;3N;30;MI;270864;0;125677;m -AMENDOLA Massimilian;1452;NC;30;RO;071270;0;103360;m -BANO Paolo ;1443;NC;30;PD;010260;0;124816;m -FACCHIN Francesco ;1533;3N;30;UD;290780;0;121656;m -GOUVEIA Daniel ;1449;NC;30;PD;160677;0;121079;m -ZABEO Gianpaolo ;1422;NC;30;PD;180854;0;115069;m -MOGNO Francesco ;1464;NC;30;PD;260850;0;110158;m -MOGNO Stefano ;1398;NC;30;PD;210384;0;110154;m -DUMBRAVEANU Romeo Co;1476;NC;30;EE;;0;12151;m -AMARANTE Luigi ;1468;1S;30;VB;;0;12152;m -TINIVELLA Andrea ;1362;NC;30;NO;280991;0;123873;m -BUCCIONE Leonardo ;1503;3N;30;CH;280489;0;123193;m -PANICO Giuliano ;1506;3N;30;CH;090677;0;125017;m -RUSSO Yari ;1254;NC;30;CH;010790;0;119443;m -PICHLER Lukas ;1509;3N;30;BZ;310580;0;125569;m -MITTERMAJER Alois ;1521;3N;30;BZ;060254;0;125571;m -GIBITZ Othmar ;1515;3N;30;BZ;140563;0;125570;m -COSTANTINO Francesco;1554;3N;30;CN;220860;0;106830;m -FUMERO Luca ;1350;NC;30;CN;191065;0;125319;m -GIULIANO Francesco;1398;NC;30;ME;180894;0;125882;m -MAIO Salvatore;1380;NC;30;ME;061194;0;123001;m -MUNAFO' Marco;1350;NC;30;ME;190795;0;125886;m -OFRIA Antonio;1419;NC;30;ME;290697;0;119105;m -PARATORE Gabriele;1365;NC;30;ME;070994;0;125884;m -CIPRIANI Emilio ;1377;NC;30;PV;;0;12167;m -FALAMISCHIA Andrea ;1524;3N;30;AL;240480;0;127301;m -DE-CASTRO Vincenzo;1500;3N;30;CO;250644;0;125889;m -MACRI' Giuseppe;1431;3N;30;RE;080343;0;108488;m -RICCI Stefano;1480;1S;30;MI;270768;0;101822;m -CITO Federica ;1359;NC;30;NA;140194;0;126499;f -CITO Marco ;1380;NC;30;NA;020292;0;117741;m -GRANATA Pasquale ;1440;NC;30;NA;;0;12174;m -GRASSO Lorenzo ;1455;NC;30;NA;100861;0;126363;m -MIRAGLIA Marco ;1510;2N;30;NA;210484;0;105625;m -PICCOLO Michele ;1440;NC;30;NA;;0;12177;m -ROMEO Caterina ;1458;NC;30;CS;030876;0;126206;f -SQUILLANTE Donato ;1590;3N;30;SA;290490;0;122124;m -SQUILLANTE Fabrizio ;1578;3N;30;SA;290992;0;122120;m -VITULANO Gianpaolo ;1440;NC;30;NA;;0;12181;m -CIOFFI Andrea ;1410;NC;30;NA;;0;12182;m -CUSANO Daniele ;1455;NC;30;NA;070879;0;118752;m -GARGANO Antonio ;1416;NC;30;NA;180453;0;124805;m -MORINIELLO Flavio ;1437;NC;30;MI;270686;0;125924;m -ZAMBONI Luciano ;1554;3N;30;MI;281033;0;125923;m -GENTILI Andrea ;1434;NC;30;RM;250973;0;125998;m -MORUCCI Giorgio ;1404;NC;30;RM;240676;0;125999;m -NICOLAI Pietro ;1422;NC;30;RM;090464;0;126000;m -NOBILE Igor ;1434;NC;30;RM;220573;0;126001;m -SQUICCIARINI Simone ;1551;3N;30;RM;101271;0;126002;m -FELLINA Fabio ;1566;3N;30;RE;140376;0;126065;m -RIGHETTI Marco ;1440;NC;30;CR;130863;0;118950;m -SILINI Davide ;1455;NC;30;PV;160288;0;117214;m -GALBIATI Francesco ;1509;3N;30;MI;291080;0;116165;m -CESATI Cassin Giorgi;1410;NC;30;MI;190930;0;125552;m -RICCI Stefano ;1461;NC;30;RM;100980;0;124660;m -PISCITELLI Marianna ;1371;NC;30;RM;020891;0;124951;f -FIORANI Roberto ;1440;NC;30;LO;231273;0;124623;m -GARIONI Walter ;1491;NC;30;LO;260555;0;124620;m -LOMBARDI Silvana ;1452;NC;30;LO;120776;0;124621;f -LUVIE' Giuliano ;1356;NC;30;LO;080167;0;124637;m -ROVERSELLI Diego ;1386;NC;30;LO;030468;0;124622;m -TANSINI Stefano ;1449;NC;30;LO;120375;0;124624;m -TASSI Giancarlo ;1395;NC;30;LO;030866;0;124625;m -UGGERI Angelo ;1455;NC;30;LO;050646;0;124628;m -COLOMBI Gianluigi ;1395;NC;30;BS;220358;0;124491;m -BERTAGGIA Lorenzo ;1449;NC;30;BS;140659;0;124490;m -CATAUDELLA Pierfranc;1398;NC;30;SR;;0;12209;m -ADORNO Alexander ;1518;3N;30;SR;190190;0;124568;m -IACONO Andrea ;1401;NC;30;S;060991;0;122976;m -VELLOTTI Simone ;1425;NC;30;SR;;0;12212;m -VELLOTTI Andrea ;1407;NC;30;SR;;0;12213;m -SALEMI Giuseppe ;1449;NC;30;SR;230395;0;122817;m -FIGURA Antonio ;1383;NC;30;SR;290692;0;122975;m -BIZZOCA Michele ;1503;3N;30;BA;200992;0;120951;m -COLAPINTO Riccardo ;1314;NC;30;BR;111088;0;125744;m -DI-DONNA Adriano ;1392;NC;30;BA;;0;12218;m -GIONFALO Alessandro ;1449;NC;30;BR;131287;0;125745;m -GRECO Rossana ;1437;NC;30;BA;010387;0;125623;f -LILLO Luca ;1443;NC;30;BR;260787;0;125746;m -MOZAK Ivan ;1359;NC;30;FG;;0;12222;m -NAPOLETANO Benito ;1401;NC;30;BA;301191;0;122591;m -BARLETTA Davide ;1410;NC;30;BA;300193;0;122592;m -CASTALDI Erminio ;1404;NC;30;RI;151139;0;120798;m -CIANI Amleto ;1425;NC;30;RI;061257;0;125007;m -CIENO Pierino ;1464;NC;30;RI;310351;0;120796;m -CIRICIOFOLO Francesc;1413;NC;30;RI;080273;0;120801;m -D'ERAMO Giuseppe ;1395;NC;30;RI;210590;0;125934;m -D'ERAMO Raniero ;1455;NC;30;RI;131159;0;125004;m -FIORAVANTI Ivano ;1473;NC;30;RI;230261;0;125008;m -LELLI Claudio ;1455;NC;30;RI;190560;0;125933;m -MARINACI Giuseppe S.;1437;NC;30;RI;231150;0;121347;m -MAROCCO Andrea ;1383;NC;30;RI;190595;0;125939;m -MINICUCCI Telemaco ;1506;3N;30;RI;111164;0;114591;m -MUNGO Luca ;1329;NC;30;RI;050794;0;12236;m -OTTAVIANI Adriano ;1467;NC;30;RI;220261;0;125006;m -SILVESTRI Antonio ;1392;NC;30;RI;070357;0;112220;m -TASSI Edmondo;1473;NC;30;RI;150864;0;125005;m -VACCAREZZA Giovambat;1395;NC;30;RI;241292;0;125941;m -SANTARELLI Enrico ;1647;2N;30;AP;081263;0;124678;m -GIACOPONI Gianni ;1410;NC;30;AP;200157;0;124336;m -DE-LUCIA Adolfo ;1530;3N;30;NA;140178;0;125944;m -ANDREOTTI Gianluca ;1476;NC;30;VB;280592;0;114232;m -CALDI Franco ;1413;NC;30;VB;041250;0;124465;m -FRANCHETTI-PARDO Nic;1479;1S;30;VB;050758;0;120391;m -BOCCARDO Enrico ;1431;NC;30;PR;200927;0;105200;m -CASO Francesco ;1404;NC;30;EE;;0;12248;m -CASO Gabriele ;1422;NC;30;CO;;0;12249;m -CATTANEO Rosandro ;1275;NC;30;LC;170542;0;127534;m -PONCINI Nino ;1470;NC;30;PR;;0;12251;m -ROSU Neculai ;1551;3N;30;PR;;0;12252;m -TIRELLI Stefano ;1488;NC;30;PR;251158;0;122366;m -TUMBARELLO Michele ;1485;NC;30;PR;140572;0;125168;m -MAZZARELLI Sergio ;1452;NC;30;MI;250662;0;124804;m -PALERMO Matteo ;1437;NC;30;MI;300983;0;126098;m -DE-MERCURIO Daniele ;1398;NC;30;MI;130964;0;126097;m -DEL-MASTRO Paolo ;1506;3N;30;MI;170567;0;124654;m -PAPAGNI Nicola ;1464;NC;30;MI;150992;0;125026;m -MAZZA Andrea ;1437;NC;30;MI;080792;0;125025;m -CUTRUFELLO Ivan ;1500;3N;30;MI;011292;0;106922;m -ZERMIAN Federico ;1560;3N;30;MI;160891;0;118221;m -BUFANO Ivan ;1290;NC;30;MI;220792;0;121188;m -ROSSINI Luca ;1395;NC;30;MI;280795;0;125030;m -SADOFF John ;1890;1N;0;EE;;823104;12265;m -MUCCINI Davide ;1425;NC;30;GR;;0;12266;m -CABRAS Stefano ;1380;NC;30;LI;190592;0;120850;m -KAINRATH Rainer ;1500;3N;30;BZ;;0;12268;m -CECCARANELLI Mauro ;1530;3N;30;RM;;0;12269;m -BERLIER Filippo ;1383;NC;30;AO;250977;0;124641;m -FARINELLA Giovanni;1437;NC;30;PA;;0;12271;m -MILONE Marco;1461;NC;30;PA;251280;0;126591;m -FIORUCCI Giacomo ;1401;NC;30;CH;030589;0;123194;m -GRANDE Silvio ;1434;NC;30;CH;180664;0;106952;m -MACCHIAROLO Marco ;1365;NC;30;PE;150690;0;119327;m -PAGLIONE Ilario ;1431;NC;30;CH;100690;0;126743;m -PANICO Marcello ;1449;NC;30;CH;261169;0;126490;m -SOLANO-SOBRINO Crist;1398;NC;30;CH;170970;0;125221;m -SPINNATO Sting Anton;1419;NC;30;CH;120691;0;125222;m -FADIGATI Roberto ;1503;3N;30;PV;150662;0;118103;m -SEVA Camillo ;1341;NC;30;PV;200772;0;124862;m -ALESSANDRINI Matteo ;1470;NC;30;FC;030782;0;124547;m -BASSETTI Danilo ;1638;2N;30;FC;300676;0;124718;m -CAMPIDELLI Silvio ;1536;3N;30;PU;101086;0;123956;m -COLOMBO Massimiliano;1705;2N;30;RM;;0;12285;m -FRATTINI Enrico ;1602;2N;30;MI;190651;0;100027;m -MESORACA Francesco ;1368;NC;30;CZ;;0;12287;m -SOLURI Francesco ;1464;NC;30;CZ;280542;0;124327;m -BACCI Lorenzo ;1515;3N;30;PO;280481;0;126174;m -MARTIGNAGO Riccardo ;1437;NC;30;TV;060891;0;116148;m -ANTONUCCIO Salvatore;1431;NC;30;SV;010371;0;104389;m -CAMIOLO Gaetano ;1437;NC;30;SV;220765;0;111854;m -ESPOSITO Lorenzo ;1446;NC;30;SA;;0;12293;m -SCUDERI Claudio ;1635;2N;30;GE;050980;0;123921;m -BALDUZZI Giovanni ;1443;NC;30;GE;110691;0;121048;m -LAGOMARSINO Annalisa;1440;NC;30;GE;270171;0;125781;f -PANADA Dario ;1404;NC;30;GE;280694;0;124589;m -PIAGGIO Fabrizio ;1461;NC;30;GE;210987;0;125779;m -BREDA Giancarlo ;1545;3N;30;PN;060362;0;124959;m -GASPARDO Francesco ;1512;3N;30;PN;071092;0;124318;m -SOZII Gianluca ;1440;NC;30;RM;310369;0;12304;m -PRANIO Federico ;1383;NC;30;RM;260573;0;125246;m -BRAVO Davide ;1392;NC;30;TO;101292;0;114459;m -CROSA Federico ;1281;NC;30;TO;120292;0;116377;m -PERRONE Davide ;1506;3N;30;TO;190793;0;120091;m -ROMEO Edoardo ;1425;NC;30;TO;110283;0;124597;m -PAPADIA Leonardo ;1458;NC;30;CS;;0;12310;m -REX Torsten ;1931;CM;30;EE;;0;12311;m -TOLVA Giuseppe ;1581;3N;30;CN;270679;0;126427;m -NEGRO Gianpiero ;1485;3N;30;TO;;0;12313;m -SATTANINO Andrea ;1701;2N;30;CN;100685;0;125320;m -PICCINNI Cosima ;1305;NC;30;TO;171048;0;126258;f -CIRIOTTI Roberto ;1497;NC;30;AL;061273;0;126613;m -VIGLINO Antonio ;1806;1N;0;TO;200773;827193;126842;m -QUAGLIA Marco ;1440;NC;30;CN;240283;0;120336;m -DEMICHELIS Alessandr;1359;NC;30;TO;;0;12319;m -ROSSI Riccardo ;1581;3N;30;CN;141075;0;111993;m -MARONE Walter ;1437;NC;30;CN;;0;12321;m -AMBROGI Davide ;1407;NC;30;CN;;0;12322;m -GALLI Giuliano ;1412;2S;30;MI;100446;0;124390;m -MORO Vincenzo ;1437;NC;30;MT;;0;12324;m -MONTANARI Stefano ;1404;NC;30;MI;080778;0;121259;m -BELLIA Mario ;1374;3N;30;TO;240240;0;126846;m -PERANO Simone ;1524;3N;30;TO;201293;0;123588;m -OMEDEI Marco ;1440;NC;30;TO;;0;12328;m -IFRIGERIO Rosario ;1392;NC;30;TO;;0;12329;m -DAVI Alessandro ;1632;2N;30;TO;040294;0;125718;m -CAVALIERE Simone ;1467;NC;30;TO;300492;0;123590;m -CACINSCHI Alexandru ;1485;NC;30;TO;070888;0;126841;m -PETRILLO Francesco ;1470;NC;30;CN;020964;0;115546;m -RABAGLIATI Elio ;1452;NC;30;CN;130264;0;126462;m -TOMATIS Silvio ;1416;NC;30;CN;121078;0;120344;m -ISASCA Manuel ;1482;NC;30;CN;100470;0;126464;m -LUCCHINI Sandro ;1371;NC;30;BS;280261;0;122397;m -BENEDETTI Paolo ;1467;NC;30;BS;100881;0;125976;m -VILLA Giorgio ;1437;NC;30;LC;151195;0;126674;m -NURY Amer ;1425;NC;30;LC;160194;0;124694;m -PENSA Lorenzo ;1413;NC;30;LC;140395;0;126676;m -FUMAGALLI Marco ;1491;NC;30;MI;010492;0;124691;m -MADONIA Daniel ;1425;NC;30;MI;271196;0;126672;m -PANEPINTO Selvi ;1398;NC;30;MI;010392;0;124690;m -PORCHIA Mattia ;1449;NC;30;LC;240795;0;126677;m -MAURI Stefano ;1359;NC;30;MI;140996;0;126673;m -BUZZOTTA Lorenzo ;1410;NC;30;MI;190495;0;124698;m -RATTI Matteo ;1431;NC;30;CO;270696;0;124699;m -VILLA Davide ;1347;NC;30;LC;200795;0;126675;m -ROTA Francesco ;1446;NC;30;LC;241196;0;124695;m -FERRARI Mattia ;1437;NC;30;LC;170491;0;124689;m -SANTARELLI Sabatino ;1548;3N;30;MI;230755;0;124136;m -PINZI Flavio ;1410;NC;30;MI;221281;0;126685;m -VALERO Chiara ;1386;NC;30;TO;271093;0;124179;f -CACIA Vincenzo ;1434;NC;30;CO;220838;0;120494;m -BELLINVIA Giuseppe;1464;NC;30;ME;070395;0;122996;m -GRASSO Gaetano ;1734;2N;30;CT;271191;0;124560;m -OLIVA Valerio ;1446;NC;30;;;0;12358;m -RAGNO Tonino ;1407;NC;30;ME;241191;0;112473;m -BORRELLO Mass ;1494;NC;30;ME;051187;0;118082;m -LONGO Lorenzo;1395;NC;30;LE;;0;12361;m -FATTORINI Eleonora ;1446;NC;30;SS;010694;0;126578;f -FERRERI Maurizio ;1338;NC;30;SS;131071;0;114752;m -LAMPIANO Iacopo ;1341;NC;30;SS;250292;0;126155;m -MACCIOCCU Francesco ;1485;NC;30;SS;010835;0;117248;m -MINIERI Ilaria ;1380;NC;30;SS;100594;0;126581;f -ORTU Andrea ;1365;NC;30;SS;;0;12367;m -PIAZZA Clarissa ;1443;NC;30;SS;200194;0;126579;f -PITURRU Mirco ;1431;NC;30;SS;300392;0;119416;m -SALAMONE Raffaele ;1401;NC;30;SS;120796;0;125549;m -SALAMONE Silvio ;1383;NC;30;SS;270294;0;125548;m -SPANO Andrea ;1473;NC;30;SS;260194;0;126153;m -CICCHETTI Luca ;1452;NC;30;AQ;280875;0;126501;m -PETRACCA Giuseppe ;1452;NC;30;AQ;060876;0;124001;m -RESTAINO Simone ;1401;NC;30;AQ;190189;0;126686;m -GIASSI Roberto ;1449;NC;30;CR;090571;0;120320;m -BOSONI Pietro ;1350;NC;30;LO;270492;0;126904;m -ROSSI Renata ;1308;NC;30;MI;240562;0;124204;f -BORDONE Silvio ;1452;NC;30;AL;190174;0;119309;m -CORTESI Marco ;1419;NC;30;LO;080366;0;118632;m -ZOLA Giordano ;1482;NC;30;LU;120479;0;126003;m -WENDEL Liu ;1422;NC;30;BZ;200894;0;120212;m -CAMPATELLI Alessandr;1524;3N;30;FI;270184;0;107977;m -BASONI Alessandro ;1389;NC;30;LO;081170;0;126905;m -COLLA Manlio ;1362;NC;30;MI;030539;0;126907;m -ELLERI Andrea ;1410;NC;30;RE;060574;0;126908;m -PASCUCCI Marco ;1800;1N;30;PA;120590;0;125256;m -CASERINI Stefano ;1458;NC;30;LO;251065;0;126906;m -GIANDINI Natale ;1437;NC;30;LO;260953;0;126911;m -LUCIANI Aldo Marco ;1335;NC;30;MI;300572;0;126909;m -MATTEI Antonio ;1503;3N;30;VT;;0;12391;m -COTTURRI Vincenzo ;1443;NC;30;RM;160173;0;127283;m -CADARIO Mario ;1585;3N;30;TO;210438;0;100775;m -GAUDENZI Mauro ;1341;NC;30;TO;250655;0;114177;m -DE-SANTIS Franco ;1362;NC;30;TO;111255;0;124876;m -PARADISI Bruno;1416;NC;30;VT;250642;0;126508;m -CARFAGNO Massimilian;1389;NC;30;SA;260780;0;12397;m -DELLA-ROCCA Giuseppe;1431;NC;30;SA;010184;0;12398;m -DI-TUCCI Benedetto ;1488;3N;30;RM;210364;0;129641;m -FORTI Luca ;1491;NC;30;RM;161275;0;129413;m -LIVERANI Matteo ;1437;NC;30;SA;230877;0;12401;m -MARAZZI Andrea ;1326;NC;30;VT;300794;0;127265;m -MICONI Francesco ;1509;3N;30;TR;250390;0;126737;m -RUGGERI Fabio ;1467;NC;30;VT;060175;0;119855;m -ZIBELLINI Domenico ;1443;NC;30;RM;250760;0;121045;m -STOYKO Dmytro ;1650;2N;30;EE;290890;0;124947;m -HERNANDEZ PENNA Sabi;2156;WM;0;EE;111273;103888;12408;f -NONNI Nazario ;1428;NC;30;BO;100566;0;126381;m -OMICCIOLI Mirko ;1440;NC;30;RN;211069;0;110917;m -MYRTO Frenkli ;1359;NC;30;RN;150593;0;127302;m -JORGENSEN Jeppe ;1446;NC;30;EE;;0;12412;m -HOLM Jacob ;1386;NC;30;EE;;0;12413;m -ADRIANI Vieri ;1461;NC;30;FI;190263;0;127303;m -GUERRINI Massimilian;1500;3N;30;GE;241066;0;127285;m -MENICHINI Massimo ;1464;NC;30;GE;141168;0;120863;m -MODENESI Francesco ;1455;NC;30;GE;181094;0;126289;m -PIRRE' Alessandro ;1386;NC;30;GE;280292;0;111414;m -ROSSI Marco ;1473;NC;30;GE;010662;0;117594;m -LAMONICA Francesco ;1398;NC;30;CT;160374;0;103812;m -MERLINI Loli ;1356;NC;30;CT;140192;0;120472;m -MARSIANO Federica ;1356;NC;30;CT;100990;0;127280;f -MODICA Santo ;1431;NC;30;CT;210790;0;124807;m -PICONE Elio ;1506;3N;30;NA;070156;0;126384;m -CANGEMI Loris ;1443;NC;30;NA;110387;0;115650;m -ANIELLO Ciro ;1419;NC;30;NA;300788;0;126388;m -MARFE' Giuseppe;1311;NC;30;NA;100654;0;115401;m -RAIMONDO Giuseppe ;1389;NC;30;NA;221190;0;126397;m -TARQUINIO Salvatore ;1413;NC;30;NA;240256;0;116682;m -DANIELE Fabio ;1431;NC;30;RC;300148;0;127325;m -SPANI Vincenzo ;1410;NC;30;RM;240372;0;127343;m -DE-DOMINICIS Luigi ;1455;NC;30;RM;220666;0;127344;m -IAIZZO Berardino ;1431;NC;30;CB;;0;12433;m -SCALABRINO Simone ;1359;NC;30;CB;;0;12434;m -VAIA Massimiliano ;1398;NC;30;NA;;0;12435;m -VECCHI Alessio ;1344;NC;30;FE;110790;0;122501;m -BARTOLI Fabrice ;1287;NC;30;LI;101190;0;126756;m -ALINOVI Michele ;1377;NC;30;PR;141090;0;108183;m -CALVELLO Simone ;1464;NC;30;MO;280989;0;122764;m -FABBRI Alessio ;1458;NC;30;FC;030289;0;116453;m -GIOVANNARDI Mirko ;1515;3N;30;BO;140290;0;124782;m -PIGNATELLI Lorenzo ;1419;NC;30;RM;250490;0;108290;m -SIMIONATO Alex ;1434;NC;30;VE;090990;0;117884;m -WANG Rimei ;1437;NC;30;CN;011290;0;126119;f -POLCHI Katarina ;1386;NC;30;PG;140590;0;116912;f -D'AMICO Pietro ;1386;NC;30;AN;020892;0;123036;m -BORTOLAMEOTTI Darvy ;1368;NC;30;TN;181292;0;118291;m -BIAGINI Leonardo ;1401;NC;30;PT;201292;0;127123;m -BONADIA Fabiano ;1485;NC;30;SA;181192;0;125169;m -MORELLO Giovanni ;1383;NC;30;PA;270391;0;122268;m -MEREU Matteo ;1497;3N;30;CA;030991;0;123333;m -NONNIS Federico ;1461;NC;30;CA;070491;0;124683;m -CAVALLINI Antonio ;1395;NC;30;FE;080591;0;122670;m -PONTIROLI Luca ;1338;NC;30;NO;140592;0;121349;m -PELLERINO Stefano ;1392;NC;30;VC;050891;0;125497;m -CALVI Alessandro ;1612;2N;30;BG;210291;0;116758;m -ZAMENGO Bruno ;1533;3N;30;VE;081091;0;118947;m -DAL-PRA CAPUTO Stefa;1461;NC;30;VR;221091;0;124286;m -ENDRIZZI Matteo ;1446;NC;30;BL;010192;0;126169;m -BONA Massimiliano ;1284;NC;30;BL;110292;0;125467;m -FERRARI Daniele ;1374;NC;30;IM;031092;0;116533;m -PAVEI Andrea ;1386;NC;30;VR;061291;0;124266;m -ZANETTI Marco ;1431;NC;30;VR;031292;0;110762;m -GENGA Maria Chiara ;1452;NC;30;MC;240991;0;127193;f -CORTONESI Caterina ;1395;NC;30;SI;230991;0;119662;f -GANDOLFO Giovanna ;1338;NC;30;SR;130492;0;126656;f -HU Yangyang ;1476;NC;30;CN;140592;0;126118;f -MESSINA Elvira ;1449;NC;30;PA;210891;0;119998;f -ROMEO Emanuela ;1338;NC;30;PA;171091;0;120001;f -SERPOLLA Cosimo ;1413;NC;30;PG;210693;0;125353;m -COTANI Francesco ;1371;NC;30;AN;261094;0;123034;m -D'AMICO Filippo ;1386;NC;30;AN;311094;0;123035;m -SIMONGINI Giacomo ;1410;NC;30;AN;180293;0;123045;m -GIULIANI Matteo ;1323;NC;30;AN;080394;0;126471;m -PACINI Giulio ;1401;NC;30;LU;090594;0;124010;m -CIMMINO Mattia ;1374;NC;30;SA;090294;0;127153;m -PANARELLA Carlo ;1398;NC;30;NA;060893;0;125594;m -CONSALVO Gerardo ;1392;NC;30;SA;200993;0;125179;m -ALGERI Lorenzo ;1509;3N;30;ME;050594;0;124143;m -GOTTUSO Giuseppe ;1428;NC;30;PA;090493;0;122265;m -PALMAS Alessandro ;1407;NC;30;CA;301194;0;124866;m -CALVELLO Mattia ;1443;NC;30;MO;230494;0;122765;m -CASADEI Marco ;1398;NC;30;FC;010793;0;122322;m -CASTELLINI Alessandr;1419;NC;30;FC;050893;0;114273;m -DE-MICHELI Luca ;1338;NC;30;PC;270194;0;118510;m -GUIDETTI Maurizio ;1392;NC;30;RE;190794;0;126200;m -MARASTONI Mattia ;1407;NC;30;RE;241193;0;119429;m -MARAZZI Michele ;1395;NC;30;MO;020593;0;116042;m -DE-SIMONE Fabio ;1377;NC;30;CN;100493;0;126124;m -BONELLI Mattia ;1455;NC;30;TO;030493;0;123605;m -PIERGIOVANNI Frances;1491;NC;30;MI;250493;0;118201;m -GEMMATO Riccardo ;1419;NC;30;TV;040693;0;122343;m -VENTURI Enrico ;1395;NC;30;VR;290793;0;114529;m -SORBERA Enrico ;1368;NC;30;TV;241093;0;125216;m -FURLAN Davide ;1506;3N;30;VE;250194;0;115487;m -TURAZZA Andrea ;1452;NC;30;VR;210494;0;124907;m -ZILIO Marco ;1404;NC;30;VI;;0;12499;m -PASTORE Marco ;1443;NC;30;PE;281093;0;123006;m -STRADI Marcello ;1389;NC;30;MO;150293;0;114828;m -PETTENATI Alessandro;1479;NC;30;PR;280893;0;125143;m -GIUNTOLI Matteo ;1437;NC;30;LI;150593;0;126755;m -CARIDI Bruno ;1395;NC;30;RC;230994;0;122028;m -BONSI Alessia ;1293;NC;30;FE;070594;0;125776;f -PAOLINI Caterina ;1422;NC;30;MO;200594;0;119497;f -CAULA Elisa ;1296;NC;30;CN;170794;0;125323;f -PAVEI Deborah ;1395;NC;30;BL;260294;0;123639;f -PINCHI Riccardo ;1347;NC;30;PG;;0;12509;m -TREQUATTRINI Simone ;1380;NC;30;PG;;0;12510;m -SANTOCCHI Nicolas ;1431;NC;30;PG;070994;0;126068;m -LEPRI Nicola ;1281;NC;30;PG;070897;0;127164;m -BICCHERI Nicol ;1449;NC;30;PG;250595;0;127165;m -DI-TOMMASO Mark ;1449;NC;30;PU;230995;0;123254;m -KOUDOUNAS Alkis ;1362;NC;30;AN;080897;0;123028;m -CICCONI-MASSI Filipp;1395;NC;30;AN;221295;0;124753;m -MIECCHI Federico ;1377;NC;30;AN;111295;0;126757;m -BURATTINI Michele ;1365;NC;30;AN;260298;0;125665;m -DE-FILOMENO Claudio ;1308;NC;30;PO;111297;0;123258;m -LUCHI Max ;1443;NC;30;GR;060996;0;125657;m -MAZZEO Gabriele ;1326;NC;30;PT;080198;0;121092;m -DANIAC Federico ;1431;NC;30;RC;280195;0;126571;m -BRUNETTI Mirko ;1377;NC;30;CS;230496;0;127105;m -ALTINI Ruggiero ;1341;NC;30;BA;071196;0;123288;m -LOREFICE Pietro ;1425;NC;30;SR;070698;0;126646;m -RICOTTA Domenico ;1353;NC;30;PA;040996;0;123150;m -PRUGGER Janpierre ;1416;NC;30;BZ;021195;0;120222;m -SOLARI Fabio ;1407;NC;30;UD;200395;0;117492;m -VARSAICA Filippo ;1410;NC;30;TS;120196;0;120453;m -CAMPOMORI Dario ;1359;NC;30;BO;250595;0;126412;m -DIONIGI Riccardo ;1416;NC;30;MO;230595;0;122190;m -NEPI Marco ;1371;NC;30;RM;270596;0;123485;m -DI-GIORGIO Daniele;1425;NC;30;RM;060295;0;123495;m -BOCCI Simone ;1356;NC;30;RM;201095;0;126226;m -LATTANZI Stefano ;1338;NC;30;RM;141296;0;127213;m -KABIR Fabio ;1467;NC;30;RM;300895;0;123631;m -LEONE Giovanni ;1428;NC;30;CN;190895;0;126125;m -MUNARI Filippo ;1425;NC;30;TO;230396;0;126833;m -LEPRE Mario ;1431;NC;30;IM;020197;0;125650;m -TORIELLI Davide ;1398;NC;30;GE;250795;0;117599;m -LUIZAGA Lucas ;1368;NC;30;BG;170195;0;125053;m -SORBERA Giovanni ;1452;NC;30;TV;060995;0;125217;m -BIANCHIN Raffaele ;1452;NC;30;TV;161195;0;118823;m -POZZOBON Davide ;1398;NC;30;TV;160496;0;122625;m -ZAMENGO Fulvio ;1467;NC;30;VE;190198;0;118948;m -DI-VERNIERE Federico;1389;NC;30;CH;110997;0;121363;m -SALVIOLI Alessandro ;1395;NC;30;MO;010395;0;125833;m -PERRONE Samuel ;1401;NC;30;AO;130495;0;126296;m -ULACCO Luca ;1425;NC;30;NA;150796;0;127297;m -GERGOLET Sasa ;1350;NC;30;UD;271197;0;125861;m -MIGLIETTA Simone ;1422;NC;30;TO;140396;0;121724;m -PIRRA Giovanni;1455;NC;30;TO;270257;0;109302;m -PADOVANI Chiara ;1362;NC;30;AN;220597;0;123038;f -TITTARELLI Elena ;1269;NC;30;MC;090998;0;121225;f -LUCHI Diletta ;1371;NC;30;GR;040299;0;125658;f -MATUOZZO Daniela ;1464;NC;30;NA;190195;0;125593;f -DEGRANDE Ilenia ;1452;NC;30;SR;051195;0;126639;f -LOREFICE Corrada ;1428;NC;30;SR;210496;0;126645;f -DEVETAK Lara ;1383;NC;30;GO;101295;0;118390;f -PISTIS Sofia ;1383;NC;30;CA;311095;0;124865;f -GUERZONI Matilde Alb;1455;NC;30;BO;230195;0;124891;f -MERLINI Claudia ;1458;NC;30;RM;101195;0;124945;f -PEIRANO Giulia ;1353;NC;30;CN;060495;0;126128;f -GIOVENALE Noemi ;1347;NC;30;CN;080495;0;126127;f -RAVAZZOLO Gaia ;1389;NC;30;TO;290396;0;126838;f -ANSELMI Beatrice ;1461;NC;30;TV;140695;0;125207;f -CARRARO Francesca ;1467;NC;30;VE;150995;0;124355;f -DALLA-VECCHIA Valeri;1425;NC;30;VR;061296;0;121021;f -BEGHINI Giulia ;1410;NC;30;VR;020395;0;124281;f -MARCHETTI Chiara ;1467;NC;30;VE;200896;0;124361;f -SCARPELLI Giorgia ;1419;NC;30;RM;180895;0;124953;f -BURATTINI Chiara ;1407;NC;30;AN;110195;0;126760;f -DE-CARO Nicola ;1446;NC;30;MT;151173;0;127356;m -LEO Massimiliano ;1401;NC;30;BR;230891;0;121603;m -ORECCHIO Cosma Damia;1422;NC;30;BR;261092;0;116436;m -ANZA' Alessandro ;1416;NC;30;PA;290592;0;123354;m -ARNETTA Simone ;1389;NC;30;PA;130895;0;125293;m -BERENDINO Giacomo ;1470;NC;30;PA;170350;0;125255;m -CIURO Dario ;1449;NC;30;PA;060789;0;127268;m -FONTANA Giulio ;1539;3N;30;TP;080173;0;126016;m -GORGONE Filippo ;1467;NC;30;PA;200293;0;123143;m -INGRASSIA Antonio ;1482;NC;30;PA;271181;0;125253;m -IRACANI Michele ;1612;2N;30;TP;260780;0;125734;m -LO-PINTO Giovanni ;1428;NC;30;PA;030994;0;125759;m -TAGLIAVIA Alessandro;1335;NC;30;PA;020491;0;122274;m -URZI' Giovanni ;1584;3N;30;PA;060964;0;125252;m -ALMADORI Giovanni ;1374;NC;30;TR;150852;0;130692;m -RALF Werner ;1440;NC;30;EE;;0;12588;m -BERTINI Nazzareno ;1380;NC;30;AN;200658;0;129375;m -ADRIAANS Mario ;1536;3N;30;EE;;0;12590;m -RUEGSEGGER Otto ;1485;NC;30;EE;;0;12591;m -GIACOMETTI Tommaso ;1338;NC;30;AN;100197;0;122410;m -PENNACCHIONI Ivo ;1380;NC;30;AN;090799;0;126478;m -DEL-VECCHIO Leonardo;1452;NC;30;RM;;0;12594;m -BONALUMI Martino ;1437;NC;30;MI;160993;0;120326;m -BRUGLIA Orlando ;1500;3N;30;MC;200171;0;123337;m -INSERRA Elisa ;1563;3N;30;SA;010180;0;124003;f -PANIGA Fabio ;1558;1S;30;SO;100668;0;107484;m -POLENTA Giacomo ;1419;NC;30;AN;;0;12599;m -RAINERI Amedeo ;1323;NC;30;SO;300893;0;124333;m -SCANFERLA Paolo ;1542;3N;30;SO;250790;0;124332;m -TOZZI Maria Luisa ;1338;NC;30;AN;;0;12602;f -AMATO Anna ;1626;2N;30;PA;260787;0;109156;f -CANCIGLIA Martina ;1425;NC;30;PA;020492;0;122261;f -CARDINALE Benedetta ;1425;NC;30;PA;200688;0;108322;f -D'AGUANNO Emilia ;1452;NC;30;PA;070592;0;127017;f -D'AGUANNO Silvia ;1440;NC;30;PA;231293;0;127018;f -GOVERNALE Laura ;1443;NC;30;PA;020692;0;126983;f -JARALLA Sara ;1425;NC;30;PA;040892;0;127046;f -MARSIGLIA Valentina ;1395;NC;30;PA;080392;0;125284;f -SEMINARA Vittoria ;1380;NC;30;PA;060774;0;127358;f -TUMMINELLO Flavia ;1491;NC;30;PA;281092;0;123130;f -COLADANGELO Andrea ;1548;3N;30;MI;251092;0;126684;m -DONI Salvatore ;1635;2N;30;MI;010766;0;117515;m -ZAMBIANCO Marco ;1452;NC;30;TV;160292;0;116158;m -DAL-BROI Marco ;1409;2S;30;TV;200993;0;122339;m -BOTTAZZI Leonardo ;1478;2S;30;TV;230391;0;125209;m -NICOSIA Alessio ;1452;NC;30;RM;;0;12620;m -D'EVA Maurizio ;1500;3N;30;RM;100854;0;124473;m -BOSCO Rebecca ;1362;NC;30;RM;120993;0;124950;f -CAMPINI Ugo ;1545;3N;30;RM;180659;0;127384;m -CORI Claudio ;1588;2N;30;RM;250555;0;127407;m -VANDERVOORT Chantal ;1800;;30;EE;;0;12625;f -BUSI Piero ;1335;NC;30;BO;300167;0;126378;m -SOPPELSA Fabrizio ;1452;NC;30;BL;090484;0;109541;m -RONCADA Lorenzo ;1407;NC;30;BL;080988;0;118443;m -IELO Paolo ;1374;NC;30;BO;080166;0;125857;m -GIACOMINI Denis ;1407;NC;30;BL;;0;12630;m -DALLE-CASE Rossano ;1434;NC;30;BL;291273;0;103154;m -CAMONICO Andrea ;1377;NC;30;VI;090789;0;126216;m -BUZZATTI Matteo ;1473;NC;30;BL;;0;101567;m -DE-VETTOR Maiti ;1500;;30;EE;;0;12634;m -MAGIS Pierre ;1600;--;30;EE;;0;12635;m -DE-VETTOR Marc ;1700;--;30;EE;;0;12636;m -STOCKMANN Helmuth ;2200;-M;20;EE;;0;12637;m -USUELLI Michele ;1464;NC;30;LC;;0;12638;m -GALUZZI Bruno ;1497;NC;30;BG;;0;12639;m -CORBELLINI Nicola ;1530;3N;30;BG;111192;0;122806;m -JOHANSSON Alexander ;1921;1N;0;EE;020492;825093;127571;m -GRESTA Stefano ;1711;2N;30;CT;190956;0;127546;m -PATAVIA Gabriele ;1407;NC;30;LE;190994;0;111530;m -LAVECCHIA Angelo ;1425;NC;30;BA;;0;12644;m -LOSAPPIO Eleonora ;1383;NC;30;BA;130996;0;122839;f -LETTERE Gianmarco ;1428;NC;30;LE;;0;12646;m -GISSI Carmine ;1443;NC;30;BA;;0;12647;m -ABBATANTUONO Oscar ;1428;NC;30;BA;290998;0;127119;m -MAGGIOTTO Corrado ;1461;3N;30;LE;240767;0;125502;m -CRUDO Michele ;1398;NC;30;BA;230894;0;127514;m -FILANNINO Grazia ;1455;NC;30;BA;171192;0;121612;f -LOSAPPIO Vincenzo ;1443;NC;30;BA;;0;12652;m -CALABRESE Davide ;1440;NC;30;BA;;0;12653;m -PADOVANO Giuseppe ;1428;NC;30;BA;100986;0;108645;m -VITOBELLO Pasquale ;1584;3N;30;BA;051292;0;123523;m -IACOBELLIS Gaetana V;1425;NC;30;BA;101092;0;123516;f -RUSSO Cataldo ;1531;3N;30;LE;;0;12657;m -SEDILE Antonio ;1507;3N;30;LE;170477;0;104759;m -RIZZI Giovanni ;1413;NC;30;BA;;0;12659;m -FINO Rocco ;1407;NC;30;LE;041065;0;125803;m -PERRONE Francesco ;1371;NC;30;LE;271293;0;127248;m -LUDOVICI Dario ;1380;NC;30;MI;;0;12662;m -CALABRESE Ruggiero ;1410;NC;30;BA;;0;12663;m -RAIA Rosaly;1438;1S;30;TP;040196;0;119236;f -QUERCIA Luciano ;1479;3N;30;BA;010788;0;126360;m -TABBITA Giovanna;1360;1S;30;TP;190267;0;119227;f -DICUONZO Antonio ;1503;3N;30;BA;;0;12667;m -MONTALTO Nicola;1422;NC;30;TP;020492;0;108564;m -MAGNANI Dario;1359;NC;30;PG;270895;0;127171;m -SARDELLA Nicolo' ;1434;NC;30;BA;190796;0;127117;m -QUARTO Silvano ;1446;NC;30;BA;310594;0;127513;m -LOMBARDI Vincenzo ;1416;NC;30;BA;140296;0;120545;m -CIAVARRA Luigi ;1698;2N;30;BA;180777;0;127517;m -DIMASTROGIOVANNI Ant;1362;NC;30;BA;;0;12674;m -PINO Riccardo;1425;NC;30;LE;070493;0;127460;m -LA-RANA Fabio ;1488;NC;30;BA;270381;0;115375;m -CORVINO Salvatore ;1414;1S;30;LE;290457;0;118496;m -HIRNEISE Lothar ;1521;3N;30;EE;;0;12678;m -MUSICO' Guglielmo ;1506;3N;30;RC;190852;0;121782;m -NUNNARI Valentina ;1320;NC;30;RC;200595;0;122017;f -PRATICO' Paolo ;1353;NC;30;RC;;0;12681;m -PRETE Ugo ;1422;NC;30;RC;140271;0;115243;m -MARONGIU Fabio ;1344;NC;30;CA;140894;0;124868;m -QUATTRONE Gabriele ;1416;NC;30;RC;;0;12684;m -VALLONE Rosario ;1524;3N;30;RC;160563;0;127282;m -VERDUCI Giuseppe ;1386;NC;30;RC;290396;0;126566;m -DEMONTIS Dario ;1428;NC;30;SS;291162;0;127434;m -VIOLI Vincenzo ;1431;NC;30;RC;240596;0;127116;m -ZAGARI Giuseppe ;1434;NC;30;RC;;0;12689;m -ZAMPAGLIONE Davide ;1410;NC;30;RC;140397;0;122021;m -ZAMPAGLIONE Francesc;1413;NC;30;RC;140491;0;116284;m -SAFIRA Anamaria ;1689;1N;30;EE;020370;0;127298;f -MORA Ramirez Juan ;1500;3N;30;FI;060951;0;127442;m -BERARDI Anselmo ;1407;NC;30;MI;;0;12694;m -PIEMONTI Alice ;1350;NC;30;LC;;0;12695;f -FALCONE Umberto ;1422;NC;30;MI;;0;12696;m -PANIZZI Michele ;1407;NC;30;SI;270969;0;115316;m -STIPS Tobias ;1482;NC;30;MI;220881;0;127408;m -NAVA Marco ;1481;2S;30;MI;;0;12699;m -TRUSSARDI Sergio ;1434;NC;30;MI;051237;0;117134;m -GIGLIOLI Antonio ;1500;3N;30;MO;150761;0;126937;m -FIAMMETTI Gianluca ;1467;NC;30;BG;090670;0;111705;m -AZZOLIN Lorenzo ;1458;NC;30;MI;270493;0;125023;m -FOUILLET Arnaud ;1800;1N;30;EE;;0;12704;m -DELORME Didier ;1800;1N;30;EE;;0;12705;m -DUPOVAC Faruk ;1615;2N;30;EE;;0;12706;m -PAVESE Andrea ;1422;NC;30;GE;;0;12707;m -MORGANTINI Renato ;1491;3N;30;GE;;0;12708;m -GUTIERREZ Geiner ;1320;NC;30;GE;;0;12709;m -COLOMBO Asher ;1470;NC;30;BO;;0;12710;m -SELEA Marie Christin;1365;NC;30;AL;;0;12711;f -MAGGIO Dario ;1545;3N;30;LE;;0;12712;m -BENEGIAMO Alberto ;1536;3N;30;LE;060987;0;126078;m -DE-MARIA Luigi ;1437;NC;30;LE;040488;0;12714;m -FARI' Marino ;1389;NC;30;LE;011191;0;127250;m -ROMANO Piergiorgio;1380;NC;30;LE;300394;0;127231;m -SCARDINO Giovanni ;1518;3N;30;LE;090562;0;111531;m -TARTAGLIA Giuseppe ;1440;NC;30;LE;;0;12718;m -CESCHIA Matteo ;1413;NC;30;UD;230892;0;121339;m -GALLANA Carlo ;1461;NC;30;VE;250453;0;106677;m -OBLAK Tjasa ;1368;NC;30;TS;151093;0;116204;m -OBLAK Valentina ;1404;NC;30;TS;240690;0;116203;f -PIZZAMIGLIO Cristian;1425;NC;30;PN;210790;0;121337;m -PIZZAMIGLIO Matteo ;1368;NC;30;PN;;0;12724;m -CARTOLINA Carmelo;1563;3N;30;TP;250482;0;127467;m -DI-SIMONE Ela;1386;NC;30;TP;;0;12726;f -PROFERA Vincenzo;1504;3N;30;TP;201085;0;108681;m -BROLI Carlo ;1746;2N;30;TV;010963;0;125761;m -CALDARA Sisto ;1542;3N;30;BL;;0;12729;m -MASINI Michele ;1401;NC;30;BL;;0;12730;m -RORATO Roberto ;1524;3N;30;UD;;0;12731;m -ROSSI Francesco ;1497;NC;30;TS;231174;0;124732;m -SETTIMO Giulio ;1521;3N;30;TS;041189;0;124740;m -BAIOCCO Fabio ;1410;NC;30;MC;270458;0;124664;m -BELARDINI Federico ;1455;NC;30;MC;310389;0;120792;m -BELARDINI Filippo ;1410;NC;30;MC;210593;0;120793;m -BENI Edoardo ;1371;NC;30;MC;040191;0;118605;m -ERGO Stefano ;1446;NC;30;MC;130389;0;120789;m -PELAGALLI Roberto ;1347;NC;30;MC;030895;0;118618;m -MORO Antonio ;1392;NC;30;SS;050388;0;112296;m -COSSU Alessio ;1458;NC;30;NU;280868;0;120239;m -BERNARDI Andrea ;1485;NC;30;SS;131092;0;126156;m -BONDONI Bernardino ;1530;3N;30;TN;;0;12743;m -ASSELLITI Francesco ;1437;NC;30;MI;;0;12744;m -BAGATTINI Giuseppe ;1398;NC;30;TN;100595;0;119358;m -POZZERLE Diego ;1431;NC;30;TN;040989;0;104931;m -DINJENS Wouter ;1819;;30;EE;;0;12747;m -SPADA Nicola ;1485;NC;30;ME;110573;0;112469;m -LA-SPADA Francesca ;1347;NC;30;ME;;0;12749;f -BONANNO Giuseppe ;1530;3N;30;ME;150873;0;120905;m -TRAPANI Giuliana ;1347;NC;30;ME;191094;0;125477;f -SCARPACI Domenico ;1392;NC;30;ME;060292;0;125473;m -FRANCHINA Carmelo ;1500;3N;30;ME;051046;0;124142;m -GIULIANO Filippo ;1353;NC;30;ME;310588;0;125885;m -LA-ROSA Placido ;1530;3N;30;ME;101271;0;127484;m -BUFO Sara ;1419;NC;30;UD;250489;0;127444;f -CLOCCHIATTI Davide ;1371;NC;30;UD;060294;0;124703;m -DELLEDONNE Francesco;1616;2N;30;MI;030591;0;127445;m -DOLSO Vittorio ;1389;NC;30;UD;290593;0;127446;m -BARRAL Paolo;1380;NC;30;TO;221274;0;127588;m -MARCHETTO Matteo ;1443;NC;30;VI;200790;0;127447;m -TRANQUILLINI Elia ;1380;NC;30;TN;010993;0;123783;m -VIOLA Enrico ;1413;NC;30;UD;201090;0;127448;m -BORSA Andrea;1476;NC;30;MI;260173;0;121621;m -TUGNIZZA Marco ;1383;NC;30;TS;251091;0;127411;m -PRELEC Fausto ;1383;NC;30;TS;281046;0;121789;m -DE-VAL Tarcisio ;1525;3N;30;TS;090158;0;103837;m -IALUNA Giuseppe ;1536;3N;30;TS;010851;0;106538;m -BELLULOVIC Bruno ;1536;3N;30;TS;141245;0;127472;m -PLAVCAK Klavdii ;1791;1N;30;EE;;0;12770;m -PLAVCAK Martin ;1830;1N;30;EE;;0;12771;m -DJORIC Krsta ;1761;1N;30;EE;;0;12772;m -BLAGOJEVIC Vlado ;1600;2N;30;EE;;0;12773;m -DE-MARIA Giuseppe ;1491;3N;30;SA;211250;0;120693;m -CAPUANO Vincenzo ;1596;3N;30;NA;190287;0;126365;m -CATALANO Pasquale ;1464;NC;30;NA;;0;126703;m -GATTONE Vincenzo ;1374;NC;30;NA;100379;0;115376;m -SEQUINO Elio ;1386;NC;30;NA;150960;0;127346;m -MINETTI Riccardo ;1344;NC;30;AP;;0;12779;m -CAMISCIA Riccardo ;1374;NC;30;AP;290496;0;127562;m -EVANGELISTI Giacomo ;1404;NC;30;AP;;0;12781;m -SPALETRA Daniele ;1413;NC;30;AP;240696;0;127565;m -CIABATTONI Andrea ;1464;NC;30;AP;050296;0;125767;m -DE-ANGELIS Michael B;1407;NC;30;MN;;0;12784;m -BALDIN Antonio ;1422;NC;30;CR;140359;0;127437;m -MANCIN Mariano ;1753;2N;30;PV;021060;0;127438;m -VECCHIET Gianfranco ;1615;2N;30;TS;130545;0;124735;m -OMERZEL Nikola ;1700;2N;30;EE;190640;0;12788;m -CRIVELLARI Lucio ;1389;NC;30;TS;220550;0;116172;m -ZERIAL Marino ;1639;2N;30;TS;300456;0;127474;m -BATTAGLIA Gabriele ;1308;NC;30;FE;130974;0;127340;m -BONOMI Mario ;1341;NC;30;MI;050760;0;127403;m -CESENA Giuseppe ;1431;NC;30;VA;260772;0;127341;m -NICOLINI Savino ;1473;NC;30;FI;090760;0;127342;m -SOPPELSA Maurizio ;1473;3N;30;VI;241056;0;117818;m -GUIDI Giacomo G.;1533;3N;30;PN;071191;0;127203;m -KALOD Michal ;1842;1N;30;EE;;0;12797;m -OCTOVSKY Jan ;1821;1N;30;EE;;0;12798;m -TOMISEK Petr ;1824;1N;30;EE;;0;12799;m -SAUERMOSER Erwin ;1546;2N;30;EE;;0;12800;m -TOESCA Daniele ;1437;NC;30;IM;140574;0;115378;m -BRENNINGER Daniel ;1560;3N;30;BZ;;0;12802;m -CORREALE Francesco ;1392;NC;30;IM;141297;0;126035;m -FALIVENE Alessandro ;1362;NC;30;IM;220497;0;126036;m -FORMENTO Paolo ;1410;NC;30;IM;030797;0;126797;m -LANZILLOTTA Valentin;1386;NC;30;IM;010351;0;127461;m -PEDEVILLA Philipp ;1485;NC;30;TN;040989;0;114283;m -PEPE Roberto ;1440;NC;30;IM;;0;12808;m -PICHLER Hannes ;1497;NC;30;BZ;;0;12809;m -SALUSTRI Alessio ;1434;NC;30;IM;050992;0;125109;m -SALUSTRI Aurora ;1407;NC;30;IM;020197;0;126033;f -SAUERMOSER Mattheus ;1440;NC;30;BZ;310593;0;114286;m -SCHERMI Simone ;1380;NC;30;IM;260597;0;126039;m -SEMERIA Silvio ;1359;NC;30;IM;190997;0;126038;m -TAGLIERCIO Thomas ;1395;NC;30;IM;180196;0;126801;m -KANINA Adriatik ;2150;CM;0;EE;030259;825859;105855;m -BREITENFELLNER Gerha;1797;1N;30;EE;;0;12817;m -JUNGINGER Alexander ;1803;1N;30;EE;;0;12818;m -CARRARA Salvatore ;1842;1N;30;RA;;0;12819;m -MELCHERT Kai-uwe ;1788;1N;30;EE;;0;12820;m -OETTEL Lothar ;1824;1N;30;EE;;0;12821;m -FROEWIS Annika ;1621;2N;30;EE;;0;12822;f -SIEGHARDT Walter ;1546;2N;30;EE;;0;12823;m -FROEWIS Gerhard ;1464;3N;30;EE;;0;12824;m -VETTER Anton ;1404;3N;30;EE;;0;12825;m -VETTER Cornelius ;1446;3N;30;EE;;0;12826;m -VENTURELLI Fernando ;1463;2S;30;MO;250951;0;117169;m -BAROCCI Alberto ;1371;NC;30;FC;281282;0;127508;m -BERTUCA Gianluca ;1509;3N;30;AT;150176;0;127431;m -DAMICO Maurizio ;1458;NC;30;FC;;0;12830;m -GUNZ Tobias ;1470;NC;30;EE;;0;12831;m -KOENIG Torsten ;1458;NC;30;EE;;0;12832;m -MORDINI Stefano ;1587;3N;30;FI;;0;12833;m -KAUFMANN Sabine ;1359;NC;30;EE;;0;12834;f -WIESER Josef ;1452;NC;30;BZ;071293;0;123359;m -WIESER Christof ;1278;NC;30;BZ;260696;0;127405;m -VETTER Henrike ;1389;NC;30;EE;;0;12837;m -MASCIALI Vincenzo;1468;1S;30;LE;010363;0;127459;m -DICORATO Marco;1440;NC;30;BA;010294;0;107941;m -GUIDI Simone ;1326;NC;30;PN;131294;0;127427;m -CUPPONE Damiano ;1542;3N;30;PG;081091;0;127426;m -NAPPI Mariarita ;1392;NC;30;BA;;0;12842;f -ZUCCA Edoardo ;1356;NC;30;AP;270492;0;125130;m -STAFFIERI Paolo ;1467;NC;30;AP;190188;0;113624;m -PETRUCCI Alessandro ;1440;NC;30;AP;270790;0;106908;m -ANGELI Francesco ;1443;NC;30;TR;140265;0;127433;m -ANGELONI Michele ;1362;NC;30;AP;310596;0;127216;m -BASTARELLI Marco ;1428;NC;30;AP;040192;0;122482;m -BASTARELLI Stefano ;1368;NC;30;AP;240293;0;122484;m -BIONDI Federico ;1494;NC;30;RM;200489;0;105975;m -BROZZI Silvio ;1551;3N;30;RM;;0;12851;m -CENSI Annachiara ;1389;NC;30;AP;170594;0;125122;f -CENSI Ludovica ;1410;NC;30;AP;190296;0;125123;f -MACCHIATI Valentina ;1350;NC;30;AP;140493;0;125121;f -MONTERUBBIANESI ;1458;NC;30;AP;;0;12855;m -MOSCA Juri ;1359;NC;30;AP;020794;0;125120;m -NASINI Vanessa ;1416;NC;30;AP;290894;0;125124;f -PENNA Luca ;1395;NC;30;MI;211292;0;125027;m -RAMELLA Stefano ;1455;NC;30;MI;090197;0;126465;m -TINELLA Andrea ;1539;3N;30;MI;241291;0;121191;m -RANAUDO Federico ;1350;NC;30;MI;161296;0;125028;m -SALERNO Francesco;1600;2N;30;BA;310892;0;122589;m -BUSCAGLIA Andrea;1425;NC;30;SV;071286;0;127641;m -BRUNETTI Antonio;1431;NC;30;NA;230256;0;127383;m -OROFINO Paolo ;1500;3N;30;CS;180472;0;124532;m -MINUCCI Veronica ;1362;NC;30;CS;140593;0;123328;m -GUZZO Natale ;1425;NC;30;CS;030387;0;124527;m -CONTARDI Francesco ;1401;NC;30;MI;230196;0;121192;m -D'ODORICO Roberto ;1554;3N;30;MI;270962;0;120588;m -LAI Daniela ;1350;NC;30;MI;100966;0;126022;m -BRUNO Marco ;1365;NC;30;MI;;0;12872;m -PASI Virginia ;1425;NC;30;MI;031294;0;126099;m -SILVESTRI Maurizio ;1600;2N;30;RM;010851;0;120748;m -DE-NUNZIO Pasquale ;1389;NC;30;RM;130562;0;117690;m -DICORATO Michele ;1461;NC;30;RM;260170;0;125189;m -GRILLI Stefano ;1461;NC;30;RM;300865;0;100354;m -SARTI Emanuele ;1437;NC;30;RM;240461;0;127636;m -VERBO Amedeo ;1449;NC;30;RM;180870;0;127637;m -LARGHI Roberto ;1473;NC;30;VA;020692;0;114980;m -DEGRASSI Franco ;1455;NC;30;VA;070566;0;127574;m -BORDO Lualdo ;1471;1S;30;RM;020758;0;118676;m -CORFORTI Marco ;1398;NC;30;RM;311070;0;127501;m -VERRUNO Valentina ;1413;NC;30;RM;190699;0;127502;m -MORINA Antonio ;1380;NC;30;MC;290595;0;116048;m -RABBACHIN Pierpaolo ;1452;NC;30;BI;;0;12886;m -D'IZZIA Alberto ;1503;3N;30;RG;110488;0;127572;m -DISCA Salvatore ;1410;NC;30;CL;101268;0;127388;m -GAGLIANO Giuseppe ;1443;NC;30;RG;290777;0;127392;m -GIANNONE Andrea ;1422;NC;30;CT;;0;12890;m -GIANNONE Salvatore ;1428;NC;30;CT;;0;12891;m -GURZENI Emanuele ;1311;NC;30;;;0;12892;m -MAZZOLA Luca ;1365;NC;30;CT;;0;12893;m -SICURELLA Giovanni ;1410;NC;30;CT;;0;12894;m -VANELLA Carlo ;1419;NC;30;CT;241090;0;119554;m -SCROFANI Edoardo ;1428;NC;30;RG;081091;0;124471;m -MARCOTULLI Giancarlo;1600;2N;30;RM;180456;0;127230;m -GEROSA Ottavio;1476;NC;30;BG;130195;0;125051;m -CANTAMESSA Marco ;1476;NC;30;TO;100268;0;125437;m -CAROTTA Federico ;1497;3N;30;TO;051176;0;127485;m -RICCI Riccardo ;1335;NC;30;TO;021290;0;127590;m -ZANELLATO Daniele ;1512;3N;30;TO;250990;0;120869;m -CORONA Fabrizio ;1449;NC;30;PE;190468;0;127599;m -COVACI Nicolae ;1527;3N;30;PE;240270;0;127600;m -IODICE Mattia ;1359;NC;30;CH;280792;0;127598;m -MASCETRA Nicola ;1482;NC;30;CH;160572;0;121542;m -GOBBI Luca ;1434;NC;30;MN;181090;0;115146;m -CONTE Pietro ;1500;3N;30;NA;051069;0;127376;m -FOSCHINI Giuseppe ;1419;NC;30;BN;191078;0;127615;m -PISTIS Franco ;1470;NC;30;SS;010857;0;124672;m -CAPRINO Marco ;1443;NC;30;PO;110284;0;127413;m -CAPPAGLI Adriano ;1527;3N;30;PI;081077;0;127645;m -CORAGGIO Gabriele ;1425;NC;30;PT;230366;0;125726;m -FALCIANI Carlo ;1434;NC;30;LI;140549;0;117242;m -GARNERO Lorenzo ;1467;NC;30;PT;151188;0;127122;m -GIANNI Gabriele ;1542;3N;30;LU;270371;0;127646;m -LORENZETTI Giacomo ;1374;NC;30;LU;090795;0;127317;m -NICCOLAI Elisabetta ;1368;NC;30;FI;110876;0;127644;m -PESSAGNO Marco;1389;NC;30;GE;190294;0;127635;m -CULLEN Tony ;2130;CM;30;EE;;0;12920;m -BALESTRI Leonard ;1392;NC;30;FC;260479;0;127627;m -BIANCHI Costanzo ;1395;NC;30;FC;020179;0;127628;m -CATAPANO Ottorino ;1425;NC;30;FC;220257;0;127629;m -COFFARI Girolamo And;1440;NC;30;FI;311061;0;127630;m -DEMETZ Ernst ;1389;NC;30;BZ;190558;0;127634;m -KOTLAR Guerrino ;1437;NC;30;RA;110441;0;125654;m -MENDOLA Giovanni ;1428;NC;30;RA;140964;0;127632;m -MONTAGNANI Federico ;1416;NC;30;FI;;0;12928;m -ROSSETTI Matteo ;1482;NC;30;BO;090783;0;126382;m -RUZZA Giorgio ;1449;NC;30;RO;011258;0;106705;m -ACELLA Lorenzo ;1506;3N;30;MC;160190;0;127326;m -DE-BENEDITTIS Mattia;1428;NC;30;PU;161188;0;127663;m -COGNEIN Enrico ;1377;NC;30;AO;261095;0;126300;m -HARLE Bill ;1797;1N;30;EE;;0;12934;m -HOWELL Alun ;1767;1N;30;EE;;0;12935;m -VANDERVORST Pascal ;1800;1N;30;EE;;0;12936;m -PRICE Winford Hugh ;1606;2N;30;EE;;0;12937;m -MOSSIAGUINE Allan ;1497;NC;30;EE;;0;12938;m -NOCERA Alice;1407;NC;30;TP;030292;0;124462;m -PORZIO Massimo ;1642;2N;30;AL;280463;0;127670;m -TRAVERSO Luca ;1431;NC;30;AL;;0;12941;m -TARTAGLINO Fabio ;1491;3N;30;AT;;0;12942;m -VELO Fiore ;1425;NC;30;AL;030436;0;106823;m -VERBENA Bruno ;1428;NC;30;AL;250562;0;126614;m -PAGLIALONGA Michele ;1647;2N;30;VA;300578;0;109664;m -DE-ROSA Vittorio ;1464;NC;30;VA;040257;0;120398;m -ARVOLA Benjamin ;1714;2N;30;EE;;0;12947;m -BIRGER-NILSEN Joachi;1687;2N;30;EE;;0;12948;m -BIRKESTRAND Odd ;1720;2N;30;EE;;0;12949;m -EDVARDSEN Ingar ;1654;2N;30;EE;;0;12950;m -HINDENES Andreas-kri;1606;2N;30;EE;;0;12951;m -JACOBSEN Maria-pitz ;1669;2N;30;EE;;0;12952;m -LINDSOE Fredrik-auna;1669;2N;30;EE;;0;12953;m -TANDE Torkel ;1815;1N;0;EE;;827088;12954;m -PICHLER Klaus ;1596;3N;30;BZ;211276;0;108941;m -PRETTO Aldo ;1458;NC;30;TN;;0;12956;m -LORENZINI Barbara ;1161;NC;30;BO;140769;0;127688;m -GENNARI Ennio ;1663;2N;30;TN;;0;12958;m -TATAROWIKC Dieter ;1573;2N;30;EE;;0;12959;m -BIRGER-NILSEN Rune ;1492;2N;30;EE;;0;12960;m -FRANCIOSI Claudio ;1503;3N;30;AV;130860;0;127580;m -FRANCIOSI Fausto ;1533;3N;30;AV;161293;0;127151;m -DE-PAOLI Nicola ;1386;NC;30;MI;030172;0;127498;m -BIASIN Emil ;1362;NC;30;VI;100589;0;121672;m -BOCCIONI Francesco ;1594;2N;30;PD;221262;0;127665;m -CALCATERRA Alessandr;1416;NC;30;VI;310788;0;121682;m -COLPO Raffaele ;1666;2N;30;VI;210858;0;121619;m -MASTROTTO Davide ;1416;NC;30;VI;270689;0;121683;m -ZAMPIERI Alessandro ;1431;NC;30;VI;110367;0;127664;m -DE-PALMA Giuseppe M ;1491;3N;30;NA;290972;0;127543;m -SCOTTO-D'ABUSCO Dari;1491;NC;30;NA;010287;0;127545;m -CICERO Leonardo ;1305;NC;30;NA;050764;0;127542;m -ROMANO Emanuele ;1593;2N;30;CE;061182;0;127544;m -CATALANO Vincenzo;1440;NC;30;NA;050481;0;101487;m -GARA' Giovanni;1467;NC;30;MI;300764;0;124896;m -MASTRO Antongiulio ;1452;NC;30;BR;031188;0;127568;m -MAROLO Giorgio ;1479;NC;30;BR;240593;0;119409;m -IPPOLITO Sara ;1359;NC;30;BR;011294;0;126959;f -DICEGLIE Vito ;1383;NC;30;BA;141036;0;127687;m -CUPPONE Alessandro ;1467;NC;30;LE;;0;12981;m -DARGENIO Andrea ;1380;NC;30;BA;211094;0;121611;m -DARGENIO Paolo ;1347;NC;30;BA;280696;0;126009;m -GRIMALDI Antonio ;1407;NC;30;BA;170394;0;126010;m -MAZZILLI Cataldo Mar;1410;NC;30;BA;080888;0;126359;m -DE-SANTIS Giuseppe ;1449;NC;30;BA;250490;0;126361;m -DAMATO Francesco A.;1431;NC;30;BA;261094;0;127071;m -BRCKBANK Henry ;1582;2N;30;EE;;0;12988;m -COSTA Stefano ;1434;NC;30;PC;;0;12989;m -DOSI Alberto ;1515;3N;30;PC;;0;12990;m -MELLING Jonathon ;1545;3N;30;BI;;0;12991;m -POSSANZINI Luigi ;1443;NC;30;MI;;0;12992;m -CARBONE Stefano ;1455;NC;30;RC;190391;0;127127;m -TASP Roman ;1639;2N;30;TV;260557;0;127720;m -CAMILLA Giulio ;1407;NC;30;VE;280390;0;127721;m -DEL-MASCHIO Matteo ;1485;NC;30;VE;270485;0;127718;m -FONTANA Giovanni ;1392;NC;30;VE;080895;0;125332;m -NARDIN Antonio ;1467;NC;30;VE;020365;0;127719;m -COMPIANI Paolo ;1464;NC;30;SI;191243;0;125314;m -GAMMAROTA Marco ;1377;NC;30;PG;090178;0;127716;m -MACHETTI Alfredo ;1410;NC;30;SI;151145;0;127715;m -MARSALA Andrea ;1659;2N;30;FI;081244;0;127419;m -NOWELL Rob ;1389;NC;30;EE;051154;0;127717;m -FONTANA Francesco ;1413;NC;30;VR;221060;0;127702;m -MARIN-VARGAS Sergio ;1431;NC;30;VR;040766;0;114508;m -SFERLAZZO Alessandro;1405;1S;30;TP;;0;13006;m -CASCIO Fabrizio;1404;NC;30;TP;;0;13008;m -CIARAMITANO Mattia;1359;NC;30;PA;280491;0;127009;m -DE-GAETANO Sergio;1401;NC;30;TP;030990;0;118528;m -FARINELLA M. Cristin;1440;NC;30;PA;211267;0;127684;f -LAUDICINA Mariangela;1410;NC;30;TP;;0;13012;f -RAIMONDI Michelangel;1413;NC;30;TP;;0;13013;m -VOLTA Jessica;1410;NC;30;TP;071190;0;124436;f -AMATO Matteo;1419;NC;30;TP;151190;0;124093;m -AMATO Irene;1374;NC;30;TP;151190;0;124092;f -PICCOLI Emile ;1443;NC;30;AO;230592;0;119595;m -SERVODIDIO Stefano ;1407;NC;30;AO;290492;0;119601;m -PAGE Michel ;1440;NC;30;AO;060292;0;123268;m -JACCOND Luca ;1446;NC;30;AO;250392;0;123267;m -PELLEGRINI Miani Mat;1389;NC;30;UD;230291;0;126347;m -PIVIDORI Jacopo ;1431;NC;30;UD;040894;0;113160;m -CASTAGNOLA Francesca;1440;NC;30;PE;230191;0;119320;f -POLITO Gianni ;1416;NC;30;PN;031290;0;112877;m -ZARDETTO Andrea ;1431;NC;30;PN;200692;0;115672;m -MELONE Antonio ;1443;NC;30;TO;;0;13027;m -COSTEA Mihai ;1458;NC;30;TO;021192;0;123582;m -VINCENTI Massimilian;1449;3N;30;MI;151072;0;127625;m -FRISBY Kelly ;1530;3N;30;EE;121272;0;127626;m -PRIVITERA Lorenzo ;1428;NC;30;CT;161190;0;124440;m -RUSSO Alfio ;1386;NC;30;CT;211089;0;127548;m -AMBROSOLI Giancarlo ;1537;3N;30;CO;261130;0;102965;m -CAIROLI Fabio ;1386;NC;30;CO;070292;0;117998;m -CALABRESE Mattia ;1383;NC;30;CO;140789;0;121550;m -CALABRESE Salvatore ;1368;NC;30;CO;201064;0;127681;m -MOIOLI Ferruccio ;1470;NC;30;CO;140762;0;124503;m -NIKA Isak ;1554;3N;30;CO;090563;0;127682;m -CACUCCIOLO Vito ;1440;NC;30;TO;;0;13039;m -COLAMARTINO Gianfran;1440;NC;30;TO;;0;13040;m -DELLA-PENNA Vincenzo;1527;3N;30;TO;;0;13041;m -PITROLA Carlo;1503;3N;30;TO;080992;0;123589;m -PORTARO Gaetano ;1428;NC;30;TO;130858;0;125562;m -TRUSSO Cafarello Seb;1476;NC;30;TO;;0;13044;m -MESCOLI Gianni ;1431;NC;30;MO;040635;0;124486;m -TRIFONOV Borislav ;1470;NC;30;MO;260770;0;126938;m -DIANA Lorenzo ;1395;NC;30;RM;030695;0;127212;m -DIANA Remo ;1443;NC;30;RM;;0;13048;m -MOSCA Massimo ;1398;NC;30;RM;040851;0;112510;m -PERSIANI Matteo ;1368;NC;30;RM;020596;0;127209;m -PUTIGNANO Sonny ;1398;NC;30;FG;;0;13051;m -ARISCI Michela ;1359;NC;30;CA;280294;0;126165;m -CUBONI Auro ;1437;NC;30;CA;170268;0;102894;m -LAMPIS Sara ;1443;NC;30;CA;160695;0;124867;m -LAMPIS Selene ;1422;NC;30;CA;080193;0;126163;m -MONTAGNER Enzo ;1459;1S;30;MI;280844;0;104972;m -CEFALA' Lorenzo ;1365;NC;30;MI;080393;0;127691;m -MYIFTARAJ Yilli ;1479;NC;30;MI;070460;0;127567;m -ORSI Alessandro ;1440;NC;30;MI;011082;0;127697;m -PIVOVAROV Michail ;1880;1N;0;TN;200147;827738;127570;m -VIGANO' Roberto ;1368;NC;30;MI;080263;0;124432;m -VIVIANI Giorgio ;1398;NC;30;CR;310145;0;127696;m -ZULIANI Francesco ;1416;NC;30;MI;080191;0;127692;m -MENICHELLI Mario ;1332;NC;30;MC;300364;0;118599;m -MARINO Luigi;1386;NC;30;TP;;0;13065;m -DELLA-CHIAVE G. Batt;1416;NC;30;TP;211289;0;117472;m -PLACENTI Gianni;1443;NC;30;TP;;0;13067;m -BONVISSUTO Massimo ;1458;NC;30;PA;020474;0;111542;m -CAMARDA Emanuele ;1377;NC;30;PA;070696;0;127004;m -PECORARO Simone ;1467;NC;30;PA;090893;0;123152;m -PIAZZA Massimiliano ;1395;NC;30;PA;;0;13071;m -INGROIA Marco ;1467;NC;30;PA;141090;0;119515;m -BUIL Montanes Carlos;2000;;30;EE;;0;13073;m -VALLOTTO Alberto ;1494;3N;30;MI;;0;13074;m -CAZZANIGA Andrea ;1401;NC;30;MI;031160;0;102496;m -PASSARINI Pierangelo;1422;NC;30;MI;121035;0;110117;m -ORIGGI Juan Manuel ;1440;NC;30;MI;;0;13077;m -MERLIN Wayann ;1440;NC;30;;;0;13078;m -MORILLO Giovanni ;1419;NC;30;;;0;13079;m -BOLDRINI Marco ;1428;NC;30;MI;230665;0;108026;m -OSSOLI Giuseppe ;1404;NC;30;MI;210247;0;105657;m -OSKIAN Aurelio ;1473;NC;30;MI;240346;0;117360;m -DRITSAKOS Alessio ;1440;NC;30;IM;;0;13083;m -DRITSAKOS Sonia ;1419;NC;30;IM;;0;13084;f -MORREALE Valeria ;1380;NC;30;IM;091194;0;114652;f -PANTALEO Nadir ;1458;NC;30;ME;131192;0;114703;m -SALVIA Lorenzo ;1422;NC;30;ME;;0;13087;m -ARICO' Maurizio;1512;3N;30;ME;;0;13088;m -INSANA Sebastiano ;1428;NC;30;ME;220263;0;118726;m -ARICO' Philip ;1413;NC;30;ME;110593;0;112471;m -BRESSAN Andrea ;1443;NC;30;TV;;0;13091;m -DE-MARCHI Alessandro;1410;NC;30;TV;010689;0;126912;m -ZANATTA Diego ;1488;3N;30;TV;070479;0;127695;m -SADKI Badi Eddin;1401;NC;30;TV;170895;0;125215;m -CACCO Piergiorgio ;1365;NC;30;TV;030165;0;118030;m -RAVANI Giampaolo ;1419;NC;30;TV;180869;0;118028;m -ARGENZIANO Letizia ;1416;NC;30;PG;200585;0;125356;f -ATTADEMO Vincenzo ;1437;NC;30;IS;;0;13098;m -BELLI Orazio ;1452;NC;30;AQ;280459;0;103397;m -MENDITTO Vittorio ;1446;NC;30;NA;;0;13100;m -PAOLANTONIO Nicola ;1356;NC;30;IS;;0;13101;m -ROSSI Nicolino ;1425;NC;30;IS;240870;0;125373;m -VEREA Edoardo Eros ;1410;NC;30;MI;;0;13103;m -CALLONI Luigi ;1425;NC;30;MI;270795;0;124132;m -MAURIELLO Corrado ;1434;NC;30;MI;200695;0;128169;m -MORO Andrea Stefano ;1380;NC;30;MI;;0;13106;m -CATALDI Antonio ;1440;NC;30;LE;;0;13107;m -DE-GIORGI Francesca ;1401;NC;30;LE;270893;0;115249;f -DE-SANTIS Donato ;1389;NC;30;LE;;0;13109;m -DE-SANTIS Luca ;1380;NC;30;LE;;0;13110;m -MANCARELLA Maurizio ;1467;NC;30;LE;200469;0;112127;m -VERRI Antonio ;1443;NC;30;LE;;0;13112;m -LAGOMARSINO Piero ;1545;3N;30;UD;101066;0;126334;m -PAIARO Solivano ;1320;NC;30;UD;080769;0;122073;m -ROIATTI Noris ;1410;NC;30;UD;270869;0;125536;m -ZUTTIONI Federico ;1533;3N;30;UD;;0;13116;m -SIBELLA Guido ;1469;2S;30;BG;140141;0;110025;m -LAURICELLA Enrico ;1401;NC;30;BG;100473;0;124504;m -BRUNELLI Giovanni ;1464;NC;30;VR;140692;0;124288;m -MORISI Luca ;1422;NC;30;BO;;0;13120;m; -CUBELLIS Nicola ;1428;NC;30;BO;;0;13121;m; -CARBONI Roberto ;1488;NC;30;BO;;0;13122;m; -ARDIZZONE Barbara ;1377;NC;30;PA;120963;0;125254;f -LORITO Rosa ;1461;NC;30;PA;130993;0;127591;f -D'EREDITA' Elena ;1287;NC;30;PA;050896;0;120904;f -LORITO Francesco ;0;NC;0;PA;260488;0;127592;m; -DE-SIMONE Sorrentino;1434;NC;30;BO;020469;0;123879;m; -COTTA Marco ;1434;NC;30;GO;140874;0;128211;m -MACHYN Stanislav ;1455;NC;30;GO;060969;0;127507;m -BANOVI Alit;1636;2N;30;PN;;0;13131;m -SAVIANE Rodolfo;1431;NC;30;TS;101070;0;126372;m -TRAMONTANO Alfonso ;1383;NC;30;NA;111084;0;127707;m -CANGEMI Antonino ;1452;NC;30;TP;;0;13134;m -DI-PRIMA Vincenzo ;1359;NC;30;TP;;0;13135;m -FALCETTA Matteo ;1476;NC;30;TP;090264;0;107767;m -IANNAZZO Giovanna ;1389;NC;30;TP;;0;13137;f -MESSINA Gaspare ;1413;NC;30;TP;;0;13138;m -NASTASI Vincenzo ;1416;NC;30;TP;;0;13139;m -BRUNORO Andrea ;1434;NC;30;VR;061194;0;117916;m -RIZZA Angelo ;1395;NC;30;VR;051160;0;100961;m -BARBARISI Massimo ;1470;NC;30;FI;140469;0;124517;m -BARSANTI Ilja ;1521;3N;30;FI;;0;13143;m -BOCCONE Stefano ;1464;NC;30;FI;;0;13144;m -FERRARI Paolo ;1362;NC;30;FI;240356;0;127649;m -FRILLI Francesco ;1422;NC;30;FI;;0;13146;m -KARANCE Flamur ;1449;NC;30;EE;270660;0;127049;m -MORETTI Giorgio ;1425;NC;30;FI;;0;13148;m -MORONI Fabrizio ;1347;NC;30;FI;;0;13149;m -POGGIOLI Fabio ;1533;3N;30;FI;;0;13150;m -SHULLANI Andrea ;1440;NC;30;SI;;0;13151;m -TAROCCHI Isacco ;1443;NC;30;PT;;0;13152;m -PAVELIUC Alin ;1491;NC;30;EE;;0;13153;m -MATTEI Marcello ;1374;NC;30;RM;;0;13154;m -FIORAMONTI Lanfranco;1440;NC;30;RM;;0;13155;m -ESPOSITO Francesco;1380;NC;30;NA;100390;0;123008;m -FILANNINO Grazia;1389;NC;30;BA;170894;0;128013;f -TORSELLI Giampaolo ;1512;3N;30;RM;181165;0;127611;m -CARUANA Fabiano;2444;IM;0;PG;300792;2020009;127412;m -AZZOLLINI Pierluigi ;1446;3N;30;RM;140184;0;127612;m -CAVAGGIONI Francesco;1440;NC;30;VR;100593;0;117920;m -NESPOLI Francesco;1443;NC;30;BG;100893;0;112385;m -SESSA Francesco D.;1365;NC;30;AV;100662;0;119186;m -CAPPUCCIO Giulio ;1425;NC;30;NA;270159;0;127668;m -DE-GUGLIELMO Pasqual;1455;NC;30;AV;170860;0;127762;m -DELLO-RUSSO Agostino;1467;NC;30;AV;;0;13167;m -DI-GISI Umberto ;1509;3N;30;AV;080566;0;127765;m -GENZALE Antonio ;1434;NC;30;AV;290165;0;127761;m -GIANNATTASIO Silvio ;1395;NC;30;AV;;0;13170;m -IANTOSCA Carmine ;1479;NC;30;AV;;0;13171;m -NAPODANO Fabio ;1380;NC;30;AV;161276;0;127764;m -CERVINO Ferdinando ;1554;3N;30;BA;200758;0;122885;m -MONTICELLI Luigi ;1512;3N;30;BA;030252;0;125020;m -VALENTE Costantino ;1470;NC;30;BA;020489;0;125021;m -PESCINO Davide ;1389;NC;30;GE;040994;0;127557;m -BOTTONI Luca ;1392;NC;30;GE;140590;0;124161;m -CELLA Emilio ;1419;NC;30;GE;120459;0;124156;m -PANZETTA Paolo ;1371;NC;30;GE;210491;0;124166;m -SENSOLI Massimo ;1449;NC;30;GE;270962;0;127558;m -PARZIALE Gianluca ;1395;NC;30;MT;;0;13181;m -VITELLI Renato ;1419;NC;30;MT;;0;13182;m -STAMER Wolfgang ;2000;CM;30;MO;280646;0;125194;m -CORDANI Enrico ;1551;3N;30;PV;101057;0;120572;m -BORGATELLO Dario ;1380;NC;30;MI;;0;13185;m -LUISE Massimo ;1509;3N;30;PV;200765;0;100591;m -TESTA Loris ;1443;NC;30;MI;230683;0;128333;m -RISPOLI Giuseppe ;1353;NC;30;SA;210595;0;126283;m -BRAMANTI Vincenzo ;1425;NC;30;SR;;0;13189;m -BARTOLOTTA Giampaolo;1392;NC;30;SR;;0;13190;m -SCARCIA Sergio ;1395;NC;30;TA;;0;13191;m -ADINOLFI Sidney ;1392;NC;30;SA;120897;0;128003;m -APICELLA Alessandro ;1422;NC;30;SA;250397;0;128002;m -AVALLONE Daniele ;1422;NC;30;SA;240298;0;127998;m -CIMASA Marco ;1461;NC;30;SA;280393;0;125173;m -DI-SALVATORE Mattia ;1404;NC;30;SA;261098;0;128001;m -LUPORINO Alessandro ;1437;NC;30;SA;180292;0;125171;m -MONETTA Aniello ;1428;NC;30;SA;231297;0;128004;m -RUGGIERO Armando ;1413;NC;30;SA;290797;0;128005;m -SIANI Alfonso ;1380;NC;30;SA;090100;0;128000;m -VIRTUOSO Daniele ;1413;NC;30;SA;081298;0;127999;m -MANDRIOTA Guido ;1446;NC;30;BA;;0;13202;m -MASTROLONARDO France;1374;NC;30;BA;220896;0;123572;m -TODISCO Alessandra ;1461;NC;30;BA;160986;0;125619;f -LIGUORI Simone ;1401;NC;30;NA;150393;0;127079;m -ATTINA' Massimo ;1425;NC;30;TP;210595;0;125443;m -GIACALONE Sergio ;1434;NC;30;TP;171192;0;125660;m -LO-DUCA Francesco ;1467;NC;30;TP;071295;0;125447;m -MEO Antonino ;1434;NC;30;TP;171293;0;125448;m -MESSINA Pierluigi ;1392;NC;30;TP;030994;0;125450;m -MIRABELLA Eugenio ;1407;NC;30;TP;030496;0;125451;m -RAINERI Dario ;1425;NC;30;TP;141193;0;125452;m -VOUTE Alexandre ;1503;3N;30;MI;240192;0;128009;m -NICOLOSI Michail ;1416;NC;30;MI;;0;13214;m -GIACONE Pietro ;1413;NC;30;MI;080992;0;128010;m -CASETTA Edoardo ;1419;NC;30;TO;;0;13216;m -DOGLIOTTI Riccardo ;1380;NC;30;TO;;0;13217;m -BRANDONE Massimo ;1335;NC;30;TO;;0;13218;m -GIANNETTA Eugenio ;1440;NC;30;TO;;0;13219;m -LEVI Aldo ;1398;NC;30;TO;;0;13220;m -LONGHINI Guido ;1445;2S;30;PD;110459;0;109923;m -PASSIGATO Marco ;1407;NC;30;PD;;0;13222;m -MAZZELLA Riccardo ;1371;NC;30;PD;;0;13223;m -PADOAN Riccardo ;1455;NC;30;VE;100470;0;117418;m -TOPI Francesco ;1407;NC;30;FG;100656;0;127680;m -MARINARO Luigi ;1437;NC;30;FG;200856;0;13226;m -MARINARO Rosanna ;1311;NC;30;FG;280857;0;13227;f -PASSARELLO Filippo ;1404;NC;30;FG;291048;0;13228;m -SPADAFINA Pietro ;1440;NC;30;FG;140947;0;127679;m -TIZI Stefano ;1597;2N;30;FC;200164;0;13230;m -TERENZI Roberto ;1494;3N;30;PU;080759;0;13231;m -AGOSTINI Marco;1437;NC;30;RN;200256;0;13232;m -NARDI Maurizio;1603;2N;30;RN;110446;0;13233;m -DRAGOMANNI Bruno ;1392;NC;30;FC;130864;0;13234;m -GIORDANI Alessandro ;1542;3N;30;RN;301271;0;13235;m -MONTI Giovanni ;1434;NC;30;FC;250837;0;121649;m -MONTI Stefano ;1446;NC;30;FC;020566;0;122915;m -SHETA Ismail ;1467;NC;30;AN;021064;0;13238;m -PERKMANN Gottfried ;1582;;30;EE;;0;13239;m -DELEKTA Anna ;1422;NC;30;EE;;0;13240;f -DELEKTA Filip ;1395;NC;30;EE;;0;13241;m -MATEI Cristian Mihai;1500;3N;30;TN;250661;0;122202;m -MATEI Stefan Bogdan ;1536;3N;30;TN;;0;13243;m -ZANUSSI Leandro ;1512;3N;30;UD;140773;0;110313;m -PURICELLI Roberto ;1389;NC;30;MI;070365;0;127584;m -SHATROLLI Bislim ;1606;;30;EE;;0;13246;m -BOSCOLO Marcellino ;1440;NC;30;VE;;0;13247;m -CIACCIARELLI Frances;1395;NC;30;VR;170194;0;125331;m -DE-PAOLI Emilio ;1476;NC;30;VR;;0;13249;m -DI-FRANCIA Umberto ;1353;NC;30;VR;;0;13250;m -VICENTINI Giovanni ;1380;NC;30;VR;;0;13251;m -KAZAKOS Emanuel ;1854;;30;EE;;0;13252;m -TUDISCO Giacomo ;1380;NC;30;TP;220184;0;13253;m -FRIGO Paolo ;1449;NC;30;VI;030688;0;121085;m -PASINATO Loris ;1311;NC;30;VI;;0;13255;m -SIGNOR Alessandro ;1407;NC;30;TV;090694;0;125523;m -JUKIC Goran ;1576;;30;EE;;0;13257;m -CODENOTTI Marco ;1488;NC;30;PI;050297;0;127726;m -CORSINI Francesco ;1467;NC;30;PI;261077;0;127723;m -SPADARO Carmelo Ales;1473;NC;30;BO;280380;0;128021;m -FIORENTINI Davide ;1341;NC;30;MO;050296;0;125844;m -FIORENTINI Paolo ;1542;3N;30;MO;120393;0;115907;m -BOCCHESE Nicola ;1542;3N;30;VI;290562;0;128314;m -DE-MARCHI Alessandro;1570;2N;30;PD;201280;0;13264;m -MASSAROTTO Gianmarco;1401;NC;30;VE;290392;0;128316;m -LUBIN Matthew ;1428;NC;30;EE;;0;13266;m -PATUELLI Matteo ;1386;NC;30;VE;180392;0;128315;m -FERLAUTO Alberto ;1422;NC;30;AT;190194;0;122519;m -PASTORE Simone ;1386;NC;30;AT;191295;0;125920;m -LIMONE Roberto ;1407;NC;30;AT;211095;0;126304;m -MIGLIETTA Samuele ;1428;NC;30;AT;050794;0;125916;m -BARTOLI Alessandro ;1407;NC;30;AT;251095;0;125922;m -SPERETTA Luciano ;1416;NC;30;AT;270394;0;126318;m -RODINA Tiziano ;1416;NC;30;AT;101194;0;122523;m -SALVADORE Fabio ;1401;NC;30;AT;170693;0;126317;m -PANI Davide ;1519;3N;30;AT;151284;0;109639;m -TRIANI Denis ;1404;NC;30;AT;151295;0;126314;m -GJOKLAJ Shpetim ;1482;NC;30;AP;011074;0;126073;m -MARINUCCI Andrea ;1413;NC;30;AP;201294;0;121972;m -PALESTINI Arsen ;1440;NC;30;AP;;0;13280;m -PASQUALETTI Daniele ;1437;NC;30;AP;180294;0;121971;m -PIERANTOZZI Francesc;1371;NC;30;AP;201270;0;124449;m -GIUDICE Andrea ;1443;NC;30;SR;;0;13283;m -PUSTIZZI Serena ;1377;NC;30;SR;;0;13284;f -PISCULLI Giulia ;1437;NC;30;SR;;0;13285;f -BARTOLOTTA Erica ;1377;NC;30;SR;;0;13286;f -CANNATA Christian ;1458;NC;30;SR;;0;13287;m -DEBENEDICTIS Andrea ;1380;NC;30;SR;;0;13288;m -LO-PRESTI Francesco ;1431;NC;30;PA;140479;0;111543;m -LO-VERSO Antonino ;1389;NC;30;PA;110578;0;111544;m -BRUNO Yama ;1503;3N;30;PA;;0;13291;m -CAROLLO Riccardo ;1371;NC;30;PA;210493;0;127007;m -LO-CASCIO Marco ;1365;NC;30;PA;070598;0;121750;m -ATTAGUILE Michele ;1416;NC;30;CT;;0;13294;m -CAPPUCCINO Salvatore;1464;NC;30;CT;150459;0;105232;m -RIZZO Rosario ;1479;NC;30;CT;;0;13296;m -CHIODO Fabio ;1500;3N;30;CL;060686;0;101127;m -DI-MAURO Carmela ;1443;NC;30;CL;080858;0;127404;f -FEDERICO Gaetano ;1389;NC;30;CL;241097;0;128028;m -GURZENI Francesco ;1431;NC;30;CL;291063;0;128027;m -NOBILE Angelo ;1413;NC;30;AG;250292;0;127053;m -SANFILIPPO Carmelo ;1461;NC;30;AG;270892;0;121374;m -SGARITO Lino ;1464;NC;30;AG;060183;0;104297;m -CASABUONI Michele ;1614;2N;30;SS;180359;0;107665;m -ADDIS Giovanni ;1413;NC;30;SS;280452;0;122932;m -MANDARESU Salvatore ;1431;NC;30;SS;300966;0;122187;m -SANNA Emanuele ;1410;NC;30;SS;;0;13308;m -LANTERI Andrea;1529;3N;30;MI;050185;0;101716;m -DELL'ANNO Domenico;1437;NC;30;AL;260763;0;124767;m -TERRACCIANO Orlando ;1422;NC;30;NA;040184;0;116518;m -DELLI-VENERI Sandro ;1509;3N;30;BN;261078;0;127895;m -DELLI-VENERI Gianni ;1569;3N;30;BN;080469;0;127894;m -ESPOSITO Angelo ;1473;3N;30;BN;270357;0;127896;m -MICCIO Bruno ;1473;3N;30;BN;110152;0;127897;m -OCONE Raffaele ;1392;NC;30;BN;011161;0;127898;m -BOLDRINI Stefano ;1533;3N;30;VE;;0;13317;m -ARDU Luigi ;1584;3N;30;CA;120284;0;128192;m -FURCAS Pierpaolo ;1404;NC;30;CA;040969;0;128148;m -BOLETTIERI Giuseppe ;1467;NC;30;PI;180168;0;126437;m -PAZZI Maurizio ;1431;NC;30;LI;211057;0;128236;m -SALIBA Michael ;2064;CM;0;PI;;827746;13322;m -GALLO Rodolfo ;1440;NC;30;PR;231264;0;128051;m -ZUCCHERI Giuseppe ;1458;NC;30;PR;030669;0;129168;m -APRILE Massimo ;1503;3N;30;VE;130856;0;103361;m -CRUCCU Alberto ;1521;3N;30;VE;101261;0;111863;m -ANTONACCI Umberto ;1398;NC;30;BA;150388;0;127824;m -CRISTANTIELLO Emilio;1395;NC;30;BA;090192;0;125819;m -LAUR Dorin ;1476;NC;30;AT;;0;13329;m -PALAZZETTI Mattia ;1356;NC;30;MC;010797;0;127197;m -TUCHILUS Iulian ;1767;1N;30;EE;;0;13331;m -MULAS Icaro ;1798;1N;30;EE;;0;13332;m -CECCARELLI Lucio ;1521;3N;30;RM;;0;13333;m -GENTILE Antonio ;1386;NC;30;RM;;0;13334;m -GRANITTO Francesco ;1395;NC;30;RM;;0;13335;m -SCHERMI Claudio ;1467;NC;30;RM;260861;0;129421;m -MOLINELLI Luigi ;1419;NC;30;GE;050270;0;128177;m -MEALE Ezequiel ;1437;NC;30;FI;260787;0;128064;m -GAROFALO Alessio ;1422;NC;30;FI;290689;0;128065;m -ACCIAIOLI Michele ;1416;NC;30;AN;041091;0;121378;m -ALESSANDRINI Giacomo;1497;NC;30;AN;221190;0;127269;m -LESINA Lorenzo ;1419;NC;30;AN;041295;0;122412;m -NONES Giovanni ;1431;NC;30;AN;;0;13343;m -PAOLILLO Luca ;1434;NC;30;AN;;0;13344;m -PAPI Lorenzo ;1422;NC;30;AN;;0;13345;m -PENNACCHIONI Alice ;1371;NC;30;AN;021296;0;127704;f -SERAFINI Massimilian;1413;NC;30;AN;;0;13347;m -TOMASSINI Manlio ;1377;NC;30;PU;220453;0;111480;m -TINTI Gianluca ;1476;NC;30;AN;190173;0;115335;m -FRONTINI Fabio ;1657;2N;30;AN;;0;13350;m -DE-PIRO Tristam ;1806;1N;30;EE;;0;13351;m -SERAVELLI Paolo ;1509;3N;30;PG;200950;0;128218;m -BUONCRISTIANI Luca ;1440;NC;30;PG;120570;0;125512;m -CAVALLUCCI Paolo ;1413;NC;30;PG;120758;0;128220;m -CESARINI Francesco ;1413;NC;30;PG;250792;0;118351;m -HERBERT Michael ;1581;3N;30;PG;270461;0;125513;m -LESTINI Daniel ;1383;NC;30;PG;020194;0;127177;m -MARELLA Simone ;1434;NC;30;PG;270282;0;128219;m -MINELLI Francesco ;1464;NC;30;PG;140188;0;124228;m -PUIU Claudiu ;1494;NC;30;EE;;0;13360;m -CASADEI Menghi Sergi;1494;NC;30;RN;011250;0;121632;m -JOHNSON Enrico ;1458;NC;30;FC;081155;0;114271;m -VALLA Tomas ;1458;NC;30;FC;;0;13363;m -ZIMINA Olga;2398;WG;0;MO;140582;4132190;124485;f -ARCURI Antonietta ;1374;NC;30;CZ;;0;13365;f -BASTONE Andrea ;1413;NC;30;KR;180166;0;116029;m -CONDORELLI Roberto ;1515;3N;30;CT;;0;13367;m -BUFFA Pietro ;1500;3N;30;CT;;0;13368;m -GRASSO Francesco ;1395;NC;30;CT;091258;0;127926;m -LEONARDI Angelo ;1464;NC;30;CT;310790;0;120096;m -LEONARDI Giuseppe ;1455;NC;30;CT;150689;0;120097;m -MIRABILE Francesco ;1335;NC;30;CT;;0;13372;m -RANDAZZO Dario ;1425;NC;30;CT;;0;13373;m -SUMA Corrado ;1380;NC;30;CT;281173;0;124569;m -REGOLO Raffaello ;1359;NC;30;MI;;0;13375;m -DALENO Marco ;1404;NC;30;MI;280367;0;128317;m -GIANNINI Mario ;1623;2N;30;MI;031079;0;128006;m -BENEDETTI Adriano ;1429;1S;30;PT;;0;13379;m -CORNAGGIA Ranieri ;1518;3N;30;SO;180994;0;126480;m -CIARAMITARO Mattia ;1407;NC;30;PA;280491;0;127009;m -NANNI Mirko ;1497;NC;30;FI;070671;0;128299;m -PORTA Valerio ;1446;NC;30;SO;050885;0;128161;m -ABENI Sergio ;1302;NC;30;PT;290841;0;128298;m -PIEVE Alessandro ;1476;NC;30;PT;030187;0;127124;m -SALA Giorgio ;1449;NC;30;GR;261188;0;128244;m -ZOITOI Ghe ;1383;NC;30;EE;290768;0;128300;m -COSTA Mario ;1362;NC;30;RM;;0;13389;m -SPIRITO Dario ;1494;NC;30;RM;;0;13390;m -CIMATTI Stefano ;1380;NC;30;CO;160969;0;127915;m -LOTTI Riccardo ;1389;NC;30;CO;190373;0;124344;m -NASTASI Ivano ;1518;3N;30;CO;040473;0;100733;m -ZINGALE Giuseppe ;1398;NC;30;CO;070235;0;125140;m -BARRESI Giuseppe ;1569;3N;30;NA;080483;0;128292;m -ANSELMI Antonio ;1419;NC;30;CH;;0;13396;m -ARAMINO Maurizio ;1437;NC;30;CH;050268;0;123814;m -CANTARINI Aramis ;1431;NC;30;CH;140187;0;106961;m -CECAMORE Antonino ;1446;NC;30;PE;270963;0;120867;m -DI-MOIA Danilo ;1470;NC;30;CH;020173;0;125219;m -PIGATO Sergio ;1407;NC;30;CH;240847;0;123811;m -ROSATO Dario ;1467;NC;30;CH;200979;0;125220;m -TERENZI Valerio ;1371;NC;30;CH;;0;13403;m -TONELLI Piero ;1473;NC;30;CH;221087;0;128632;m -GALLUCCIO Antonio ;1479;NC;30;BO;151076;0;127972;m -PELLICONI Vanes ;1542;3N;30;BO;281259;0;126406;m -VRIONI Bersan ;1491;NC;30;VT;;0;13407;m -BAGNOLI Maurizio ;1458;NC;30;BO;310359;0;123619;m -CICCOLELLA Leonardo ;1419;NC;30;BO;;0;13409;m -CORALLI Nevio ;1470;NC;30;BO;100867;0;121643;m -DI-BELLA Pietro;1422;NC;30;CT;250788;0;107398;m -DI-GUARDO Dario ;1383;NC;30;CT;231093;0;126619;m -FRAGALA' Caterina F.;1377;NC;30;CT;;0;13413;f -FRAGALA' Giuseppe ;1410;NC;30;CT;011191;0;126621;m -RANERI Gaetano ;1410;NC;30;CT;250894;0;128104;m -TRUJILLO-TORRES Rich;1398;NC;30;LO;;0;13416;m -LEONE Antonio ;1455;NC;30;CZ;200892;0;121569;m -LEONE Dario ;1428;NC;30;CZ;070894;0;121570;m -TIRIOLO Matteo ;1413;NC;30;CZ;;0;13419;m -MERLINO Alessandro ;1464;NC;30;ME;050267;0;117404;m -CUTUGNO Salvatore ;1398;NC;30;ME;060596;0;122992;m -TATTO Raimondo ;1365;NC;30;ME;260867;0;127748;m -INNOCENTI Sandro ;1488;NC;30;TN;180169;0;128680;m -MURATOVIC Asim ;1467;NC;30;EE;;0;13424;m -MEHMEDOVIC Nijaz ;1467;NC;30;EE;;0;13425;m -MEHMEDOVIC Mehudin ;1404;NC;30;EE;;0;13426;m -MEHMEDOVIC Dzevad ;1410;NC;30;EE;;0;13427;m -BORZANI Luca ;1437;NC;30;MI;200484;0;128224;m -ARGENTINA Roberta ;1377;NC;30;BR;241296;0;126962;f -CIGLIOLA Andrea ;1407;NC;30;BR;240396;0;126963;m -MARI Riccardo ;1488;NC;30;BR;;0;13431;m -RUBINO Chiara ;1407;NC;30;BR;280197;0;126966;f -VITALE Romualdo ;1443;NC;30;BR;071095;0;119414;m -VITALE Vita ;1365;NC;30;BR;130298;0;126970;f -MELIS Giuseppe ;1467;NC;30;CA;051254;0;128654;m -SCOTTI Roberto ;1452;NC;30;PV;211267;0;105170;m -KONA Arben ;1494;NC;30;AL;210561;0;128377;m -CALOMENI Gianpaolo ;1464;NC;30;CS;190785;0;108982;m -DE-RASIS Giovanni ;1608;2N;30;CS;220663;0;120814;m -MARGSTAHLER Francesc;1566;3N;30;MI;271175;0;128318;m -AMILCARELLI Elio;1440;NC;30;RA;121272;0;125653;m -VERGANO Riccardo ;1432;1S;30;BG;220781;0;109786;m -DEL-BARBA Giuseppe ;1467;NC;30;SO;030956;0;124331;m -LLESHI Anton ;1518;3N;30;EE;220154;0;127957;m -LLESHI Erlir ;1449;NC;30;EE;180684;0;127958;m -PARDI Mario ;1404;NC;30;BG;150442;0;127959;m -PEZZETTI Alberto ;1383;NC;30;BG;141295;0;127962;m -VENTURA Salvatore ;1491;NC;30;BG;040488;0;127964;m -CELLANTE Francesco ;1491;NC;30;UD;300962;0;128368;m -COTRER Filippo ;1437;NC;30;;;0;13450;m -GENTILE Bruno ;1461;NC;30;UD;101056;0;102618;m -SAGGIN Fabio ;1482;NC;30;VI;300885;0;128016;m -SOLARI Mauro ;1464;NC;30;UD;240960;0;102614;m -BIGI Raffaele ;1446;NC;30;MN;090538;0;127121;m -PRISCO Lorenzo ;1452;NC;30;MO;041179;0;128584;m -FERRETTI Francesco M;1407;NC;30;AP;;0;13456;m -MINNUCCI Alessandro ;1404;NC;30;AP;121293;0;122485;m -ORSINI Maurizio ;1452;NC;30;AP;030461;0;127686;m -PIERONI Giacinto ;1470;NC;30;AP;220155;0;127685;m -PALLADINI Martina ;1416;NC;30;AP;010696;0;128816;m -CASSOLA Valter ;1389;NC;30;PI;270744;0;101974;m -SPAGGERO Andrea;1440;NC;30;VC;;0;13462;m -COLOMBO Andreas ;1440;NC;30;LU;;0;13463;m -MAZZONI Elisa ;1440;NC;30;LU;290995;0;127310;m -DEVINCIENTE Marco ;1440;NC;30;LU;;0;13465;m -CARIGNANI Gioele ;1440;NC;30;LU;110295;0;127319;m -DEVINCIENTE Elisa ;1440;NC;30;LU;;0;13467;m -ROMANO Pasquale ;1410;NC;30;CS;200496;0;127099;m -GORDANO Mattia ;1398;NC;30;CS;030194;0;121413;m -BELCASTRO Angelo ;1440;NC;30;CS;200592;0;116267;m -FUSARO Francesco ;1395;NC;30;CS;211196;0;127093;m -LAGANA' Danilo ;1413;NC;30;CS;040493;0;119736;m -LONGOBUCCO Carmine ;1413;NC;30;CS;020295;0;119851;m -RUGNA Marco ;1485;NC;30;CS;151092;0;123364;m -ALOE Davide ;1407;NC;30;CS;160993;0;119738;m -INTRIERI Cosimo ;1470;NC;30;CS;200993;0;127087;m -CAMPANA Luigi ;1317;NC;30;CS;081194;0;119844;m -MARINCOLO Luigi ;1470;NC;30;CS;031192;0;112674;m -FORCINITI Savatore ;1410;NC;30;CS;280793;0;119665;m -STOYKO Bohdan ;1946;CM;30;EE;;0;13480;m -FABRIS Manuel ;1401;NC;30;RE;050296;0;126192;m -MORICONI Roberto ;1449;NC;30;RM;010874;0;129105;m -TRAVAGLINI Roberto ;1527;3N;30;RM;010863;0;103207;m -TRONCA Alessandro ;1530;3N;30;RM;250975;0;115132;m -BARRITT Jordan ;1383;NC;30;MI;160796;0;126323;m -BARRITT Paul ;1509;3N;30;MI;300562;0;126329;m -DE-SIMEIS Adriano ;1521;3N;30;MI;290676;0;126325;m -ORNAGHI Lorenzo ;1410;NC;30;MI;130355;0;118568;m -PEDRONI Marco ;1530;3N;30;MI;300682;0;120834;m -BALDINOTTI Davide ;1377;NC;30;RA;230864;0;122570;m -BENDANDI Maurizio ;1476;NC;30;RA;050248;0;129002;m -CIANI Domenico ;1422;NC;30;RA;081245;0;129003;m -GRAZIANI Roberto ;1437;NC;30;RA;070955;0;129004;m -PEZZI Roberto ;1437;NC;30;RA;200567;0;129005;m -PEZZOLA Maurizio ;1404;NC;30;RA;071255;0;129006;m -TAMBURINI Alessandro;1467;NC;30;RA;030967;0;129007;m -PELLIZZARI Sergio ;1443;NC;30;CN;;0;13498;m -LACUKU Aldo ;1461;NC;30;CN;;0;13499;m -BERGESE Luca ;1422;NC;30;CN;180193;0;125321;m -GALVAGNO Michele ;1449;NC;30;CN;;0;13501;m -MINA Tiziano ;1404;NC;30;CN;;0;13502;m -PAESE Salvatore ;1404;NC;30;CS;080934;0;128696;m -DRAGOTTA Salvatore ;1335;NC;30;TO;160957;0;115380;m -BUONOCORE Stefano ;1497;NC;30;TO;010559;0;111194;m -CEA Filippo ;1470;NC;30;TO;230475;0;114172;m -ROKIC Petar ;1356;NC;30;MI;260570;0;128225;m -MONTICELLI Francesco;1431;NC;30;VA;070583;0;129166;m -JIANG Yongwei ;1575;3N;30;MI;241182;0;128908;m -FOCK Giustino ;1392;NC;30;CO;290137;0;106360;m -LORENZOTTI Fabio ;1410;NC;30;GE;021058;0;117596;m -LORENZOTTI Pietro ;1395;NC;30;GE;071192;0;117598;m -MANARA Angelo ;1428;NC;30;GE;110766;0;129290;m -BEDAGLIA Nicolo' ;1362;NC;30;PV;230494;0;129241;m -CEVA Nadia ;1299;NC;30;PV;150789;0;129240;f -MOTTA Lorenzo ;1467;NC;30;AL;290181;0;128895;m -RUFFINAZZI Marco ;1437;NC;30;PV;210992;0;128713;m -TUOR Elena ;1585;2N;30;EE;;0;13518;f -D'ANIELLO Antonio ;1452;NC;30;SA;;0;13519;m -IACCARINO Fabrizio ;1452;NC;30;SA;140373;0;128120;m -TALAMO Giuseppe ;1425;NC;30;SA;070591;0;121532;m -BUCINSCAN Rado ;1440;NC;30;EE;;0;13522;m -NORCIO Guido ;1383;NC;30;RM;160540;0;129412;m -CIMARELLI Fabrizio ;1503;3N;30;PU;080591;0;117664;m -DE-SANCTIS Marco ;1422;NC;30;PU;200875;0;111462;m -SANGUINETTI Edoardo ;1497;NC;30;PU;211089;0;120728;m -TOCCACELI Fausto ;1449;NC;30;PU;140955;0;111479;m -BERTOLO Gabriele ;1416;NC;30;NA;300191;0;126389;m -MATYNYUC Yuriy ;1392;NC;30;NA;;0;13529;m -CIACCIO Anna Brigida;1467;NC;30;NA;250892;0;121178;f -VASSALLO Vincenzo ;1467;NC;30;NA;240872;0;127968;m -SCIBONA Luca ;1359;NC;30;BO;270795;0;124893;m -KRAVCENKO Vitaliy ;1449;NC;30;BO;250891;0;124783;m -CALZAVARA Luciano ;1383;NC;30;VB;160548;0;128386;m -FIORENTINO Vincenzo ;1440;NC;30;CS;140195;0;123380;m -Rossi, Vittorio;2213;CM;0;CN;200159;3300536;129510;m -SUPERBO Leonardo ;1476;NC;30;CN;;0;13538;m -POLISI Ambrogio ;1428;NC;30;CN;;0;13539;m -DE-VECCHIS Luigi ;1401;NC;30;CN;;0;13540;m -MAZZESCHI Marco ;1567;3N;30;TO;030651;0;104408;m -FAVONI Matteo ;1600;2N;30;VC;081290;0;125495;m -GIUNTO Andrea ;1449;NC;30;TO;140293;0;124176;m -GRIMALDI Franco ;1437;NC;30;TO;090636;0;117430;m -MOMBELLI Antonio ;1615;2N;30;MI;050949;0;104563;m -SIGNORINI Alberto ;1413;NC;30;BS;280176;0;128209;m -ALESSI Renato ;1440;NC;30;PT;020231;0;122223;m -DI-LEVA Livio;1383;NC;30;PT;190933;0;125727;m -CASTIELLO Luigi ;1542;3N;30;NA;090974;0;129916;m -BENFATTO Alessio ;1488;NC;30;NA;110190;0;127714;m -CHIANESE Antonio ;1440;NC;30;NA;161288;0;127978;m -CHINO Ferdinando ;1515;3N;30;NA;161160;0;127969;m -FALCO Claudio ;1404;NC;30;NA;130284;0;109475;m -IODICE Marco ;1380;NC;30;NA;080488;0;129212;m -MONTI Riccardo ;1600;2N;30;NA;270186;0;128640;m -PENNACCHIO Mario ;1470;NC;30;NA;040966;0;127967;m -RAGUZZINO Andrea ;1542;3N;30;NA;150675;0;128226;m -ROMANO Felice ;1425;NC;30;NA;191047;0;128055;m -STELLATO Diego ;1398;NC;30;NA;180190;0;127082;m -RUBICONE Maurizio ;1419;NC;30;RM;150957;0;111994;m -SCERRA Ezio ;1392;NC;30;KR;021265;0;129715;m -CALOMENI Francesca ;1377;NC;30;CS;121278;0;129667;m -CONVENEVOLE Carlo ;1416;NC;30;RM;260790;0;129104;m -MONOSILIO Arnaldo ;1473;NC;30;RM;160637;0;100249;m -FALSETTI Paolo ;1422;NC;30;PC;;0;13565;m -DI-GREGORIO Romeo ;1431;NC;30;CH;240182;0;129863;m -PESCE Valter ;1392;NC;30;TA;280561;0;128916;m -CIMMINO Fabio ;1440;NC;30;NA;070273;0;129915;m -MARCANGELI Valerio;1581;3N;30;NA;250878;0;127838;m -GORINI Luciano ;1419;NC;30;NA;200565;0;128641;m -CRISPO Giuseppe ;1471;1S;30;NA;180763;0;128952;m -AMALFITANO Giovanni ;1473;NC;30;PZ;010542;0;128432;m -FERRARA Paolo Antoni;1401;NC;30;PZ;300161;0;128438;m -MILEO Miguelito ;1479;NC;30;PZ;190555;0;128434;m -BIANCHINI Massimo ;1467;NC;30;RI;050852;0;120795;m -BORGIA Azzurra ;1419;NC;30;RI;;0;13576;f -COLLEPICCOLO Marco ;1401;NC;30;RI;;0;13577;m -GIOVANZANTI Francesc;1434;NC;30;RI;;0;13578;m -GIOVANZANTI Mario ;1434;NC;30;RI;;0;13579;m -MURE' Dafne ;1443;NC;30;RI;240475;0;129351;f -RINALDI Silvia ;1443;NC;30;RI;080589;0;129356;m -TEDESCHI Davide ;1404;NC;30;RI;160790;0;129357;m -TSAP Roman ;1630;2N;30;VE;260457;0;128284;m -LORENZON Michael ;1413;NC;30;TV;270294;0;129941;m -FORATO Alberto ;1398;NC;30;TV;081156;0;111322;m -VANNINI Daniele ;1416;NC;30;BO;080846;0;121645;m -VIVIANI Bruno ;1528;3N;30;VE;100454;0;127814;m -BORTOLOTTO Denzio ;1461;NC;30;TV;110264;0;128668;m -DOLCI David ;1470;NC;30;PT;310379;0;127984;m -NESTI Andrea Alessan;1413;NC;30;PT;260760;0;120777;m -SGOBBA Davide ;1419;NC;30;MI;090875;0;129565;m -MINORE Antonino ;1392;NC;30;MI;080864;0;107695;m -PORTA Alberto ;1455;NC;30;MI;290959;0;105311;m -LIGAMMARI Luca ;1380;NC;30;MI;;0;13595;m -CAPALDO Salvatore ;1433;2S;30;NA;010353;0;113030;m -CASARTELLI Luciano ;1419;NC;30;CO;010152;0;128213;m -DI-LUCA Cristiano ;1416;NC;30;RM;080575;0;128365;m -FEOLA Giuliano ;1494;NC;30;LI;070788;0;114540;m -IOVANNONE Cristiano ;1503;3N;30;VT;270767;0;125881;m -NAVARRA Simone ;1380;NC;30;LI;310792;0;120851;m -USAI Patrizio ;1362;NC;30;LI;050992;0;120848;m -CARAPEZZA Fabio ;1491;NC;30;PR;000000;0;13603;m -MOSCATO Riccardo ;1428;NC;30;VR;040192;0;130165;m -PULIGNANO Antonio ;1434;NC;30;MT;150251;0;129837;m -RAGONE Carmine ;1389;NC;30;MT;300695;0;129839;m -SANTALUCIA Valerio ;1389;NC;30;MT;251195;0;129840;m -TANGORRA Giambattist;1446;NC;30;MT;130457;0;129838;m -DE-DOMINICIS Arrigo ;1453;1S;30;VA;130941;0;124135;m -CAVALERI Gabriele ;1392;NC;30;MI;000000;0;13610;m -GRIMALDI Salvatore ;1401;NC;30;MI;050593;0;124141;m -AZZONE Fabrizio ;1389;NC;30;RM;080557;0;128570;m -MANENTI Luca ;1467;NC;30;RM;010680;0;128571;m -MARTIRE Francesco ;1401;NC;30;RM;290980;0;127883;m -BACCARINI Stefano ;1446;NC;30;VE;290147;0;116569;m -BUCIUSCAN Radu ;1482;NC;30;EE;000000;0;13616;m -RENZI Stefano ;1461;NC;30;TR;210667;0;112225;m -SANTORI Andrea ;1449;NC;30;RI;030774;0;114993;m -IMPELLIZERI Marzia ;1428;NC;30;RM;000000;0;13619;m -PETRUCCIOLI Marco ;1404;NC;30;RM;050480;0;129106;m -DI-GIOIA Giuseppe ;1443;NC;30;RM;000000;0;13621;m -AMORE Francesco ;1452;NC;30;RM;000000;0;13622;m -BUZZELLI Nicholas ;1380;NC;30;RM;000000;0;13623;m -BUZZELLI Patrick ;1383;NC;30;RM;000000;0;13624;m -COCHARD Raphael ;1413;NC;30;EE;000000;0;13625;m -DE-SIMONE Felice ;1416;NC;30;RM;000000;0;13626;m -VERDUCCI Marco ;1458;NC;30;RM;030170;0;129274;m -CECCONI Adriano ;1446;NC;30;RM;000000;0;13628;m -ALBERIO Nicolo ;1524;3N;30;CT;270539;0;130337;m -BELLA Mario Alberto ;1440;NC;30;CT;100765;0;130338;m -CAPPELLO Angelo ;1422;NC;30;CT;020472;0;129727;m -SGAGGERO Andrea;1392;NC;30;VC;170491;0;126468;m -BIANCHI Pier Paolo ;1470;NC;30;AL;081165;0;128893;m -CATANIA Francesco ;1383;NC;30;PV;220992;0;130583;m -RUFFINAZZI Marco ;1434;NC;30;PV;210992;0;128713;m -FRANCHINA Antonino ;1389;NC;30;ME;170593;0;124649;m -ORIFICI Leone ;1392;NC;30;ME;260593;0;129184;m -SIRCHIA Andrea ;1431;NC;30;PA;010394;0;128775;m -PROSERPIO Marco ;1404;NC;30;LC;161195;0;130372;m -PROSERPIO Alberto ;1422;NC;30;LC;100891;0;130373;m -NEGRETTI Fabrizio ;1518;3N;30;CO;100791;0;125142;m -PANZERI Simone ;1440;NC;30;LC;090695;0;130374;m -PIANTEDOSI Paolo ;1407;NC;30;LC;010795;0;130369;m -PELLEGRINI Andrea ;1392;NC;30;LC;200795;0;130368;m -BRENNA Mattia ;1407;NC;30;LC;070495;0;130371;m -ZAMBURLINI Giorgio ;1452;NC;30;MI;191292;0;124692;m -COMUZZI Andrea ;1407;NC;30;MI;131195;0;124697;m -PENZA Lorenzo ;1437;NC;30;LC;140395;0;126676;m -SANVITO Francesco ;1407;NC;30;MI;280594;0;128143;m -LAZZARONI Mauro ;1428;NC;30;MI;;0;13650;m -BALEANI Gregorio ;1437;NC;30;VT;150196;0;125702;m -BOCCARDI Alessandro ;1497;NC;30;VT;250383;0;129486;m -ANDREOCCI Manlio ;1362;NC;30;VT;250594;0;130770;m -GIOVANNELLA Enrico ;1422;NC;30;VT;060597;0;128925;m -SICILIA Stefano ;1497;NC;30;VT;180996;0;125701;m -SPALLETTA Matteo ;1437;NC;30;VT;081193;0;125700;m -SILVERI Simone ;1422;NC;30;VT;080396;0;126885;m -CROCICCHIA Luca ;1452;NC;30;VT;040194;0;125703;m -CRISTOFARI Antonio ;1389;NC;30;VT;160648;0;124979;m -ADZIC Ranko ;1503;3N;30;BZ;200275;0;127986;m -TESSAROLLO Fabio ;1545;3N;30;BZ;010464;0;127987;m -DANTI Alessandro ;1431;NC;30;BZ;190571;0;127985;m -DELAGO Elisabhth ;1455;NC;30;BZ;170592;0;114295;f -DELAGO Hans ;1473;NC;30;BZ;200647;0;130579;m -FOX Jonas ;1422;NC;30;BZ;;0;13665;m -FRANCESCHINI Luca ;1410;NC;30;BZ;200990;0;130582;m -FRICK Mathias ;1395;NC;30;BZ;;0;13667;m -GALLMETZER Thomas ;1401;NC;30;BZ;;0;13668;m -GASPARRO Antonio ;1473;NC;30;BZ;220663;0;120464;m -NICOLODI Raoul ;1479;NC;30;BZ;150494;0;120855;m -PICHLER Christoph ;1512;3N;30;BZ;090468;0;130581;m -POLLANA Marco ;1473;NC;30;BZ;240272;0;108943;m -RAFFL Christian ;1383;NC;30;BZ;;0;13673;m -RAICH Dominik ;1431;NC;30;BZ;210995;0;120220;m -TEUTSCHER Alexander ;1461;NC;30;BZ;200895;0;126259;m -GIBELLI Angelo ;1446;NC;30;LO;101161;0;124630;m -THOUX Claudio ;1515;3N;30;TO;130472;0;105742;m -JOHANSSON Tim ;1800;;30;SWE;;0;13678;m -SHABHNAJ Lefter ;1900;;30;ALB;;0;13679;m -PFUETZNER Julian ;2100;;30;GER;;0;13680;m -JAGER DE Pieter ;2100;;30;NED;;0;13681;m -LAFEUILLE Bernard ;1900;;30;FRA;;0;13682;m -ESONBAEVA Gulruhsor ;1900;;30;UZB;;0;13683;m -JOELSON Adam ;1900;;30;ENG;;0;13684;m -YARUR Daniel ;1800;;30;CHI;;0;13685;m -KOHI Camillah ;1800;;30;AFG;;0;13686;f -BOGER Raymond ;1800;;30;NOR;;0;13687;m -GONZALO Quesada ;1800;;30;CRC;;0;13688;m -REINHARDT Joachim ;1700;--;30;GER;;0;13689;m -SERRANO Charlotte ;1700;;30;FRA;;0;13690;f -KEEVE Martin ;1700;;30;GER;;0;13691;m -CHAIM Felman ;1600;;30;ISR;;0;13692;m -BALAGNA Fabrizio ;1521;3N;30;TO;190657;0;129869;m -DOPPIONI Mauro Dante;1587;3N;30;TO;050373;0;129099;m -WELCH Hazel ;1500;;30;ENG;;0;13695;m -VANN Monica ;1500;;30;ENG;;0;13696;f -MOLINATTO Piero ;1392;NC;30;TO;290154;0;105512;m -ANTONOV Serioja ;1380;NC;30;TO;100889;0;114729;m -ARNAO Jose' ;1437;NC;30;AL;280590;0;130776;m -ARROBBIO Giuseppe ;1452;NC;30;TO;070578;0;130044;m -BARDUS Marco ;1416;NC;30;TO;101091;0;123594;m -BATTISTA Luigi ;1476;NC;30;TO;230750;0;130043;m -BUFFA Andrea ;1389;NC;30;TO;;0;13703;m -CALIGARIS Alessandro;1416;NC;30;AL;150591;0;130777;m -CAMPASSI Andrea ;1482;NC;30;TO;050769;0;130046;m -CAMPASSI Giorgio ;1467;NC;30;TO;040443;0;130045;m -CASATI Simone ;1356;NC;30;TO;050194;0;126820;m -CHITAN Costantine ;1509;3N;30;AL;130790;0;124885;m -COSTARELLI Stefano ;1410;NC;30;TO;;0;13709;m -COVA Joshua ;1404;NC;30;TO;160992;0;126822;m -CUSANNO Giada ;1392;NC;30;TO;240291;0;108278;f -DE-RENZI Giuseppe;1464;NC;30;TO;200364;0;128767;m -DI-GIACOBBE Fabrizio;1452;NC;30;TE;030165;0;129371;m -DI-GIACOBBE Matteo ;1422;NC;30;TE;260996;0;129372;m -DI-STEFANO Marco ;1503;3N;30;TO;050665;0;129589;m -DI-STEFANO Salvatore;1383;NC;30;TO;300339;0;129590;m -GIORDANO Arianna ;1389;NC;30;TO;180394;0;123578;f -LA-MESA Sergio ;1413;NC;30;TO;;0;13718;m -LAROCCA Pasqualino ;1479;NC;30;TO;;0;13719;m -LISI Carlo ;1371;NC;30;TO;210553;0;129642;m -MINELLI Mattia ;1458;NC;30;TO;070390;0;130778;m -NAGHIT Lucian ;1452;NC;30;AL;;0;13722;m -OLIVERO Massimiliano;1503;3N;30;CN;060970;0;130774;m -PFIFFNER Andrea ;1467;NC;30;TO;160174;0;130042;m -ROCCO Marta ;1446;NC;30;TO;100794;0;129591;f -SARZENTI Andrea ;1407;NC;30;TO;190770;0;100765;m -SAVELLI Jacopo ;1419;NC;30;TO;;0;13727;m -SCIUTTO Giuseppe;1461;NC;30;AL;;0;13728;m -SILVESTRI Francesco ;1332;NC;30;TO;200191;0;126840;m -STASI Enrico ;1413;NC;30;TO;120383;0;111208;m -STRAMAZZO Aljosha ;1422;NC;30;TO;241275;0;130771;m -REEM Safar ;1440;NC;30;QAT;;0;13732;m -ARAGONA Pasquale ;1425;NC;30;CS;160689;0;128693;m -GALASSO Luciano ;1473;NC;30;CS;131258;0;129669;m -GAROFALO Natale ;1425;NC;30;CS;240189;0;128692;m -SORBARA Emilio ;1446;NC;30;CZ;190662;0;121325;m -CREMASCHI Paolo ;0;2N;0;CO;160370;0;130577;m -ORLANDO Alessia ;1395;NC;30;ME;300195;0;119196;f -FRANCHINA Alessandra;1395;NC;30;ME;260295;0;124650;f -BAUZON Lorenzo ;1392;NC;30;TS;041291;0;127410;m -CANDUSIO Daniele ;1407;NC;30;TS;120793;0;129434;m -CORBATTO Roberto ;1470;NC;30;TS;270774;0;129445;m -GREGORI Giuliano ;1428;NC;30;TS;070293;0;129438;m -PECHIARI Alberto ;1407;NC;30;TS;070760;0;130220;m -PETROSINO Germano ;1440;NC;30;TS;310181;0;129443;m -TOMMASINI Lorenzo ;1455;NC;30;TS;111288;0;125784;m -TROIAN Andrea ;1473;NC;30;TS;171088;0;124742;m -CROSS Jan ;1600;2N;30;ENG;;0;13748;m -REUTIMANN Hans Peter;2000;CM;30;SUI;;0;13749;m -ANHAUSER Andreas ;1600;2N;30;GER;;0;13750;m -SCHWEIZER Marina ;1500;3N;30;GER;;0;13751;m -SCHWEIZER Regina ;1500;3N;30;GER;;0;13752;m -TORRIGIANI Daniele ;1422;NC;30;MI;;0;13753;m -POLETTI Guido ;1401;NC;30;LO;;0;13754;m -HESS Max ;1407;NC;30;EE;;0;13755;m -SOJIC Petar ;1425;NC;30;EE;;0;13756;m -ROTA Tullio ;1455;NC;30;TO;011041;0;129315;m -GARCIA-PALERMO CARLO;2445;GM;0;AP;021253;110124;120963;m -MANZO Giulio ;1434;NC;30;RM;191089;0;129790;m -TADDEI Massimo ;1458;NC;30;RM;070289;0;129791;m -MIGLIORI Giorgio ;1458;NC;30;MI;311095;0;129962;m -DI-PRIMA MATTEO ;1425;NC;30;MI;220595;0;129960;m -MONTANARI Claudio ;1428;NC;30;MI;260695;0;129963;m -LEGNAZZI Livia ;1452;NC;30;MI;180494;0;129961;m -ANDREOLI Francesca ;1392;NC;30;MI;;0;13765;m -NACLERIO Sabrina ;1365;NC;30;MI;;0;13766;m -BENA' Ermanno ;1479;NC;30;RO;150171;0;129092;m -SALA Stefano;1353;NC;30;GR;301149;0;124930;m -PISANO Simona ;1446;NC;30;CA;210884;0;130036;m -LAI Francescangelo ;1455;NC;30;CA;040246;0;127435;m -SCALAS Lucio ;1414;1S;30;CA;120222;0;107542;m -FADDA Umberto ;1365;NC;30;CA;181134;0;129346;m -MATTU Dimitri ;1413;NC;30;CA;090762;0;128227;m -OPPO Giorgio ;1440;NC;30;CA;100861;0;128228;m -UNGARO Fabio ;1410;NC;30;CA;050688;0;130038;m -MASALA Giorgio ;1425;NC;30;CA;010439;0;129347;m diff --git a/uppdev/VegaTeam5/xide.ico b/uppdev/VegaTeam5/xide.ico deleted file mode 100644 index 1ab4dc932..000000000 Binary files a/uppdev/VegaTeam5/xide.ico and /dev/null differ diff --git a/uppdev/Vera/Vera.h b/uppdev/Vera/Vera.h deleted file mode 100644 index 8355cee55..000000000 --- a/uppdev/Vera/Vera.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _Vera_Vera_h -#define _Vera_Vera_h - - -#endif - diff --git a/uppdev/Vera/Vera.upp b/uppdev/Vera/Vera.upp deleted file mode 100644 index cc9fdaaa5..000000000 --- a/uppdev/Vera/Vera.upp +++ /dev/null @@ -1,10 +0,0 @@ -uses - CtrlLib; - -file - Vera.h, - main.cpp; - -mainconfig - "" = "GUI"; - diff --git a/uppdev/Vera/main.cpp b/uppdev/Vera/main.cpp deleted file mode 100644 index 702911f82..000000000 --- a/uppdev/Vera/main.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include - -using namespace Upp; - -class Vera : public TopWindow { -public: - virtual void Paint(Draw& draw); - - typedef Vera CLASSNAME; -}; - -void DrawIt(Draw& w) -{ - w.DrawRect(0, 0, 10000, 10000, White()); - w.DrawText(10, 10, "Vera::Paint", Font().FaceName("Bitstream Vera Sans Mono").Height(13)); - w.DrawText(10, 30, "Arial", Arial(18)); - w.DrawText(10, 50, "Roman", Roman(18)); -} - -void Vera::Paint(Draw& w) -{ - DrawIt(w); - ImageDraw iw(200, 200); - DrawIt(iw); - w.DrawImage(100, 0, iw); -} - -GUI_APP_MAIN -{ - Vera().Run(); -} - diff --git a/uppdev/Visual/Visual.upp b/uppdev/Visual/Visual.upp deleted file mode 100644 index ae6ff3801..000000000 --- a/uppdev/Visual/Visual.upp +++ /dev/null @@ -1,10 +0,0 @@ -uses - CtrlLib; - -library(WIN32) uxtheme.lib; - -file - main.cpp; - -mainconfig - "" = "GUI"; diff --git a/uppdev/Visual/main.cpp b/uppdev/Visual/main.cpp deleted file mode 100644 index 035b6d32f..000000000 --- a/uppdev/Visual/main.cpp +++ /dev/null @@ -1,165 +0,0 @@ -#include - -#include -#include - -using namespace Upp; - -#define DEF(x) x, #x, - -struct { - int color; - const char *text; -} -syscolor[] = { - DEF(COLOR_3DDKSHADOW) - DEF(COLOR_3DFACE) - DEF(COLOR_BTNFACE) - DEF(COLOR_3DHILIGHT) - DEF(COLOR_3DHIGHLIGHT) - DEF(COLOR_BTNHILIGHT) - DEF(COLOR_BTNHIGHLIGHT) - DEF(COLOR_3DLIGHT) - DEF(COLOR_3DSHADOW) - DEF(COLOR_BTNSHADOW) - DEF(COLOR_ACTIVEBORDER) - DEF(COLOR_ACTIVECAPTION) - DEF(COLOR_APPWORKSPACE) - DEF(COLOR_BACKGROUND) - DEF(COLOR_BTNTEXT) - DEF(COLOR_CAPTIONTEXT) - DEF(COLOR_GRADIENTACTIVECAPTION) - DEF(COLOR_ACTIVECAPTION) - DEF(COLOR_GRADIENTINACTIVECAPTION) - DEF(COLOR_INACTIVECAPTION) - DEF(COLOR_GRAYTEXT) - DEF(COLOR_HIGHLIGHT) - DEF(COLOR_HIGHLIGHTTEXT) - DEF(COLOR_HOTLIGHT) - DEF(COLOR_INACTIVEBORDER) - DEF(COLOR_INACTIVECAPTION) - DEF(COLOR_INACTIVECAPTIONTEXT) - DEF(COLOR_INFOBK) - DEF(COLOR_INFOTEXT) - DEF(COLOR_MENU) -// DEF(COLOR_MENUHILIGHT) -// DEF(COLOR_MENUBAR) - DEF(COLOR_MENUTEXT) - DEF(COLOR_SCROLLBAR) - DEF(COLOR_WINDOW) - DEF(COLOR_WINDOWFRAME) - DEF(COLOR_WINDOWTEXT) - 0, NULL -}; - -struct Visual : public TopWindow { - virtual void Paint(Draw& w) { - Size sz = GetSize(); - w.DrawRect(sz, LtGray); -// w.DrawRect(sz, SWhite); - /* - int tcy = Draw::GetStdFontCy(); - int yc = sz.cy / tcy; - for(int i = 0; syscolor[i].text; i++) { - int x = i / yc * 128; - int y = i % yc * tcy; - w.DrawRect(x, y, 128, tcy, Color::FromCR(GetSysColor(syscolor[i].color))); - w.DrawText(x, y, syscolor[i].text, StdFont(), SWhite); - w.DrawText(x + 1, y - 1, syscolor[i].text, StdFont(), SBlack); - } - */ - // HTHEME theme = OpenThemeData(GetHWND(), WString("COMBOBOX")); - HTHEME theme = OpenThemeData(GetHWND(), WString("MENU")); - wchar h[5000]; - GetThemeSysString(theme, TMT_XMLNAME, h, 1000); - DUMP(WString(h)); - // HTHEME theme = OpenThemeData(GetHWND(), WString("PROGRESS")); - // HTHEME theme = OpenThemeData(GetHWND(), WString("EDIT")); - for(int x = 0; x < 20; x++) - for(int y = 0; y < 5; y++) { - LOGFONTW f; -// GetThemeFont(theme, NULL, x, y, 809 /*TMT_BODYFONT*/, (LOGFONT *)&f); -// DUMP(f.lfHeight); -// DUMP(f.lfFaceName); - Rect r = RectC(x * 45, y * 52, 40, 50); - HDC hdc = w.BeginGdi(); - DrawThemeBackground(theme, hdc, x, y, r, NULL); - DrawThemeBackground(theme, hdc, x, y, r.OffsetedVert(6 * 52), NULL); - w.EndGdi(); - Rect rr; - GetThemeBackgroundContentRect(theme, NULL, x, y, r.OffsetedVert(6 * 52), rr); - DUMP(rr); - DrawFrame(w, rr, LtRed); - } -/* Size csz; - GetThemePartSize(theme, hdc, BP_CHECKBOX, CBS_CHECKEDHOT, - NULL, TS_MIN, csz); - DUMP(csz); - GetThemePartSize(theme, hdc, BP_CHECKBOX, CBS_CHECKEDHOT, - NULL, TS_TRUE, csz); - DUMP(csz); - GetThemePartSize(theme, hdc, BP_CHECKBOX, CBS_CHECKEDHOT, - NULL, TS_DRAW, csz); - DUMP(csz);*/ - CloseThemeData(theme); - } -}; - -String GetThemeInfo(LPCWSTR pszPropertyName) -{ - wchar theme[512], colors[512], size[512]; - GetCurrentThemeName(theme, 512, colors, 512, size, 512); - wchar h[1024]; - GetThemeDocumentationProperty(theme, pszPropertyName, h, 1000); - return FromUnicode(h); -} - -GUI_APP_MAIN -{ - wchar theme[512], colors[512], size[512]; - GetCurrentThemeName(theme, 512, colors, 512, size, 512); - DUMP(FromUnicode(theme)); - DUMP(FromUnicode(colors)); - DUMP(FromUnicode(size)); - - DUMP(GetThemeInfo(SZ_THDOCPROP_DISPLAYNAME)); - DUMP(GetThemeInfo(SZ_THDOCPROP_TOOLTIP)); - DUMP(GetThemeInfo(SZ_THDOCPROP_AUTHOR)); - DUMP(GetThemeInfo(SZ_THDOCPROP_CANONICALNAME)); - - NONCLIENTMETRICS ncm; - ncm.cbSize = sizeof(ncm); - SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0); - DUMP(ncm.lfMenuFont.lfHeight); - DUMP(ncm.lfMenuFont.lfFaceName); - DUMP(ncm.lfStatusFont.lfHeight); - DUMP(ncm.lfStatusFont.lfFaceName); - DUMP(ncm.lfMessageFont.lfHeight); - DUMP(ncm.lfMessageFont.lfFaceName); - - HFONT hfont = ::CreateFontIndirect(&ncm.lfMenuFont); - HDC hdc = CreateIC("DISPLAY", NULL, NULL, NULL); - TEXTMETRIC tm; - hfont = (HFONT) ::SelectObject(hdc, hfont); - ::GetTextMetrics(hdc, &tm); - int h = tm.tmAscent + tm.tmDescent; - ::DeleteObject(SelectObject(hdc, hfont)); - ::DeleteDC(hdc); - - DUMP(h); - - Draw::SetStdFont(Font(Font::FindFaceNameIndex(ncm.lfMenuFont.lfFaceName), abs(ncm.lfMenuFont.lfHeight))); - -/* - HGDIOBJ hfont = GetStockObject(DEFAULT_GUI_FONT); - HDC hdc = CreateIC("DISPLAY", NULL, NULL, NULL); - hfont = SelectObject(hdc, hfont); - char h[513]; - GetTextFace(hdc, 512, h); - DUMP(h); - SelectObject(hdc, hfont); - DeleteDC(hdc); -*/ - - Visual().Zoomable().Run(); -} diff --git a/uppdev/VisualTest/VisualTest.h b/uppdev/VisualTest/VisualTest.h deleted file mode 100644 index 67265f17c..000000000 --- a/uppdev/VisualTest/VisualTest.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef _VisualTest_VisualTest_h -#define _VisualTest_VisualTest_h - -#include - -using namespace Upp; - -#define LAYOUTFILE -#include - - - -class VisualTest : public WithVisualTestLayout { -public: - void PI() { pi.Set(~slider, 0); vpi.Set(~slider, 100); } - - typedef VisualTest CLASSNAME; - VisualTest(); -}; - -#endif diff --git a/uppdev/VisualTest/VisualTest.lay b/uppdev/VisualTest/VisualTest.lay deleted file mode 100644 index faa250ece..000000000 --- a/uppdev/VisualTest/VisualTest.lay +++ /dev/null @@ -1,20 +0,0 @@ -LAYOUT(VisualTestLayout, 596, 376) - ITEM(ArrayCtrl, list, LeftPosZ(4, 304).TopPosZ(4, 212)) - ITEM(TabCtrl, tabs, LeftPosZ(316, 228).TopPosZ(8, 72)) - ITEM(DropList, droplist, LeftPosZ(316, 76).TopPosZ(88, 19)) - ITEM(EditString, text, LeftPosZ(316, 232).TopPosZ(112, 19)) - ITEM(LineEdit, edit, SetEditable(false).LeftPosZ(316, 232).TopPosZ(136, 48)) - ITEM(Button, ok, SetLabel(t_("OK")).LeftPosZ(444, 72).TopPosZ(252, 24)) - ITEM(Button, exit, SetLabel(t_("Exit")).LeftPosZ(368, 72).TopPosZ(252, 24)) - ITEM(Button, cancel, SetLabel(t_("Cancel")).LeftPosZ(520, 72).TopPosZ(252, 24)) - ITEM(EditIntSpin, dv___8, LeftPosZ(396, 48).TopPosZ(88, 19)) - ITEM(Button, disabled, SetLabel(t_("Disabled")).LeftPosZ(8, 84).TopPosZ(224, 24)) - ITEM(ProgressIndicator, pi, LeftPosZ(136, 224).TopPosZ(228, 15)) - ITEM(ProgressIndicator, vpi, LeftPosZ(112, 316).TopPosZ(284, 20)) - ITEM(SliderCtrl, slider, LeftPosZ(116, 248).TopPosZ(248, 28)) - ITEM(ButtonOption, bo, LeftPosZ(8, 20).TopPosZ(256, 19)) - ITEM(Option, opt, ThreeState(true).SetLabel(t_("Option")).LeftPosZ(320, 70).TopPosZ(196, 19)) - ITEM(Option, opt2, SetLabel(t_("Option")).LeftPosZ(476, 70).TopPosZ(196, 19)) - ITEM(Switch, dv___16, SetLabel(t_("Switch 1\nSwitch 2\nSwitch 3")).LeftPosZ(400, 70).TopPosZ(196, 48)) - ITEM(WithDropChoice, dc, LeftPosZ(16, 184).TopPosZ(324, 19)) -END_LAYOUT diff --git a/uppdev/VisualTest/VisualTest.upp b/uppdev/VisualTest/VisualTest.upp deleted file mode 100644 index ddea480ee..000000000 --- a/uppdev/VisualTest/VisualTest.upp +++ /dev/null @@ -1,12 +0,0 @@ -uses - CtrlLib; - -file - "VisualTest.h" - , main.cpp - , "VisualTest.lay" - -; - -mainconfig - "" = "GUI"; diff --git a/uppdev/VisualTest/ff.tpp/all.i b/uppdev/VisualTest/ff.tpp/all.i deleted file mode 100644 index 658778961..000000000 --- a/uppdev/VisualTest/ff.tpp/all.i +++ /dev/null @@ -1,3 +0,0 @@ -TOPIC("ff$en-us") -#include "ff$en-us.tpp" -END_TOPIC diff --git a/uppdev/VisualTest/ff.tpp/ff$en-us.tpp b/uppdev/VisualTest/ff.tpp/ff$en-us.tpp deleted file mode 100644 index d3fa805c8..000000000 --- a/uppdev/VisualTest/ff.tpp/ff$en-us.tpp +++ /dev/null @@ -1,1267 +0,0 @@ -TITLE("") -TOPIC_TEXT( -"[ $$0,0#00000000000000000000000000000000:Default][{_}%EN-US [s0; @@image:3968&3093\212\203\265\203\344\202\200\200\200\200\200\200\200\200\200\370\207\234\354\275\353\363\224\327\227\232\357\313\207\230\210\377\355\204\376\263\337\314\304\216\363\366\331\263\347\277\230\351\343\211\355\223\261\257\346\234\377\331\321\355\350\210\323\273\367\373\364\234\235\370\354\236\365\366\370\334\355\343\266\215\222\361\367\230\304\333\230\204\300\206\214\230\213\344\204\302\225\262\300\310\210\304\305\302\262\240\253\221\267\211\213\312\200\267\244\241\211\335\313\302\206\210\335\220\250\300\206\361\237\311\363\317\374\253\236\255\277\255\314\312\312\312\312\322\372\311\270\262\236\250\310\312\334\332\371\251\314\225\353\375\317\326\263\236\213\341\344\226\303\314\222\331\262\313\346\311\352\254\231\245\263\344\226\314\241\222\331\262\313\346\311\254\365\231\245\263\344\226\314\222\320\331\262\313\346\311\254\231\272\245\263\344\226\314\222\331\250\262\313\346\311\254\231\245\235\263\344\226\314\222\331\262\324\313\346\311\254\231\245\263\216\344\226\314\222\331\262\313\252\346\311\254\231\245\263\344\207\226\314\222\331\262\313\346\225\311\254\231\245\331\345\327\252\346\311\254\231\245\263\344\207\226\314\222\331\262\313\346\231\311\254\277\230\305\213\236\360\307\246\307\234\345\366\360\340\320\327\377\230\222\253\200\352\357\271\364\341\354") -TOPIC_TEXT( -"\301\376\256\217\214\231\367\240\337\236\203\372\340\300\341\201\266\276\371\274\377\227\327\223\225\225\215\265\374\371\362\352\345\371\353\345\225\327\260\375\331\262\242\345\274\340\355\205\205\327\345\254\330\201\225\374\226\226\361\226\312\371\251\200\317\311\311\311\311\354\307\212\276\261\221\305\376\275\323\343\303\343\203\303\275\367\206\273\240\223\276\243\361\377\357\364\303\373\200\362\203\347\236\317\317\277\371\230\214\350\260\342\274\340\315\372\233\352\256\266\267\325\267\273\310\320\340\257\217\207\377\221\363\345\316\236\316\367\275\361\224\360\211\365\300\237\335\264\246\223\343\267\370\223\372\241\343\367\372\344\346\247\273\372\274\351\221\272\253\265\347\271\273\315\312\376\361\374\351\312\243\245\305\351\277\236\324\227\325\306\356\367\310\245\270\322\345\352\342\266\313\336\353\367\356\216\243\266\342\223\262\337\361\212\277\372\376\201\352\204\255\320\304\372\301\261\273\376\375\364\344\376\275\261\232\374\362\247\376\372\240\262\360\241\277\311\261\331\235\202\217\237\264\323\371\350\305\361\316\355\220\273\243\203\336\376\231\216\217\301\363\256\376\275\250\337\325\231\272\322\323\334\376\377\255\252\242\374\340\327\222\337\343\223\333\332\333\232\241\371\253\376\272\365\374\230\344\266\376\275\247\217\277\242\220\330\367\307\253\266\244\363\360\201\270\202\216\230\227\263\307\253\344\340\301\234\212\247\257\343\366\221\341\201\266\351\222\255\315\215\325\225\225\370\332\367\266\356\335\262\366\325\357\373\337\256\374\315\350\275\274\337\314\277\363\217\306\273\343\377\207\217\351\375\367\347\357\337\275\377\377\356\377\340\351\255\217\277\374\360") -TOPIC_TEXT( -"\303\372\377\365\373\366\356\301\221\321\277\335\340\260\267\376\370\213\337\243\375\365\347\323\357\257\346\335\273\252\276\364\325\261\202\272\305\225\234\363\250\354\261\366\350\317\246\257\340\366\335\361\206\342\257\361\346\206\260\373\273\241\373\362\213\362\336\317\206\316\327\326\365\266\273\267\332\357\310\215\356\276\361\374\252\322\330\331\350\322\373\340\243\371\311\316\336\200\347\336\223\335\250\205\315\370\217\236\234\255\350\317\241\365\357\255\335\325\365\235\370\204\245\340\350\245\227\332\344\304\356\227\353\333\326\374\262\201\314\327\213\331\276\355\225\216\377\226\320\263\303\265\251\227\215\212\223\215\217\215\303\360\260\226\365\373\306\334\345\304\204\355\207\231\207\213\326\232\230\233\233\377\364\243\237\201\202\324\300\260\330\327\351\307\356\255\306\215\240\202\300\317\335\313\257\277\214\257\257\275\225\364\222\261\247\324\271\204\255\301\212\276\222\366\270\243\346\377\225\215\270\365\344\341\302\243\225\261\360\272\224\303\237\241\372\372\372\360\225\250\243\205\302\257\331\213\301\311\274\245\253\271\206\241\361\310\345\352\356\216\332\343\335\305\222\337\255\313\222\217\323\244\373\243\303\341\274\274\337\235\372\331\311\367\363\332\331\327\300\367\357\377\213\255\225\361\310\270\277\277\377\225\345\301\274\323\243\375\312\243\321\326\320\320\311\320\200\353\322\301\360\330\336\212\374\376\371\347\225\374\225\333\331\345\360\215\337\341\301\301\246\216\336\274\277\324\270\261\220\262\232\266\275\364\337\354\211\274\340\361\242\304\351\300\243\323\243\221\267\213\355\331\263\262\243\324\331\273\324\356\324\266\320\314\341\216\265\372\234\374") -TOPIC_TEXT( -"\242\315\232\204\345\362\245\342\364\305\374\317\367\245\361\364\214\361\214\244\207\355\271\273\233\303\326\246\306\374\300\346\202\343\254\261\344\344\326\315\351\320\221\300\247\213\334\367\226\322\352\320\245\331\311\201\311\211\211\366\276\231\361\256\367\206\236\273\355\254\202\267\370\342\363\244\337\205\251\371\262\253\373\204\234\322\361\201\307\274\222\302\276\257\230\274\207\373\202\275\340\333\264\232\334\237\352\236\354\205\316\201\344\200\321\276\240\272\320\253\224\273\252\374\341\234\301\230\214\207\370\241\255\203\363\370\253\300\215\263\357\341\361\361\201\244\202\344\362\366\327\347\233\372\245\347\275\271\271\350\264\301\355\263\340\332\241\277\374\263\260\277\244\206\313\203\250\201\271\300\350\302\301\330\350\367\363\300\333\375\275\346\365\243\351\301\234\236\352\237\350\277\302\331\260\277\317\272\243\274\211\252\250\260\324\377\243\321\352\266\276\364\341\254\307\302\206\220\254\343\316\302\360\250\217\300\266\252\273\240\325\342\246\243\257\301\256\230\263\210\306\371\272\343\261\211\231\203\322\213\234\267\262\261\312\201\305\344\255\204\344\200\260\232\227\240\226\346\220\250\225\330\227\276\243\250\212\370\255\247\213\302\350\300\376\265\356\316\220\302\317\215\227\251\341\214\266\316\301\237\264\302\377\241\226\310\345\325\233\300\211\377\241\373\352\370\314\264\305\247\313\221\306\235\217\337\375\365\210\325\374\245\322\210\200\373\251\307\343\215\226\204\231\320\227\200\224\216\225\300\225\317\371\227\226\274\306\215\365\330\363\264\372\273\376\212\360\230\241\272\326\377\255\266\232\243\274\274\254\360\360\305\363\253\246\237\367\376\364\346") -TOPIC_TEXT( -"\350\377\366\300\260\262\366\315\312\361\367\221\301\270\327\233\374\362\233\375\343\231\274\316\200\343\227\340\261\252\277\301\226\274\363\216\364\202\233\372\210\210\301\245\324\271\336\362\230\215\364\271\307\367\350\353\262\263\216\267\270\267\223\355\255\315\357\376\316\250\342\261\316\270\212\200\377\221\304\202\364\231\263\275\335\215\311\343\255\336\232\200\221\247\210\336\207\303\233\302\264\337\317\213\247\350\315\210\304\271\252\211\247\203\353\324\327\231\353\200\346\261\205\333\275\344\341\324\277\224\311\210\330\364\275\200\357\275\376\277\355\261\331\314\336\356\204\231\231\352\322\347\333\202\334\221\240\356\221\242\303\200\200\341\300\257\332\233\262\252\233\326\345\327\200\253\200\263\200\371\330\376\325\205\315\250\225\330\200\377\216\237\276\256\366\203\247\300\371\321\362\343\321\340\335\235\255\345\247\217\232\205\242\250\306\216\324\224\223\243\257\201\222\237\274\361\370\214\244\251\255\345\310\360\264\300\304\321\321\203\303\205\226\224\327\256\335\205\277\276\347\320\333\226\250\236\357\334\211\261\255\364\325\354\310\243\255\203\225\333\267\356\275\372\231\371\222\356\235\234\361\362\363\302\254\362\304\307\362\363\314\241\354\351\351\352\367\271\276\255\350\214\330\203\327\336\332\213\305\325\214\340\236\342\222\357\342\257\314\337\373\317\335\325\244\243\361\301\306\300\362\263\332\237\320\364\306\355\311\271\240\344\252\371\361\212\234\357\213\277\361\255\230\321\331\361\330\325\361\241\232\340\304\277\342\213\357\342\331\212\263\202\277\334\326\323\346\357\244\337\215\217\337\372\351\245\361\342\253\365\372\206\305\253\343\313\227\257\267\254") -TOPIC_TEXT( -"\224\225\216\337\211\246\370\251\277\277\274\237\253\330\370\362\313\257\220\213\236\327\267\366\231\321\364\244\206\337\202\266\301\272\220\366\274\376\264\363\204\277\207\311\224\272\341\351\232\321\344\222\247\342\201\247\255\205\216\252\345\264\340\261\210\255\220\356\325\304\345\326\246\262\325\274\313\340\370\214\376\204\256\355\265\357\371\276\214\347\226\217\355\373\267\202\261\276\264\305\200\314\230\347\212\216\300\326\344\342\362\212\222\325\351\301\316\275\210\314\334\277\346\267\306\363\362\345\344\326\360\315\374\342\235\217\257\365\375\372\326\343\351\231\320\225\304\363\230\233\323\237\273\375\357\360\236\252\236\365\234\367\272\224\301\373\355\257\221\217\232\312\330\201\265\267\264\326\222\327\235\302\303\315\326\216\270\315\234\332\370\341\241\376\377\374\251\316\366\326\226\346\370\206\373\213\351\336\330\272\344\277\216\214\323\346\273\206\340\265\253\261\370\311\343\337\322\377\221\204\274\314\247\270\366\340\343\216\237\240\304\205\306\226\265\201\242\217\303\200\207\235\330\316\365\236\304\233\305\351\257\214\276\271\241\361\247\255\216\240\200\301\305\220\212\202\315\213\315\247\314\376\323\253\277\206\264\225\342\340\340\344\210\376\302\341\374\204\343\275\360\251\266\217\303\256\235\346\333\350\247\320\370\222\215\275\304\227\350\256\270\265\300\225\202\240\322\240\234\250\340\270\231\305\261\204\373\342\374\210\270\316\206\365\353\321\327\262\311\224\215\232\315\265\275\265\244\254\242\315\344\327\223\274\236\204\305\216\344\247\337\306\206\320\307\341\356\253\225\363\334\356\362\263\255\244\261\315\365\351\361\321\336\335\345\273\261\364\200\241") -TOPIC_TEXT( -"\363\370\212\335\235\355\274\214\316\201\277\237\257\255\363\242\320\220\274\265\254\365\317\356\202\233\326\210\310\307\265\330\241\331\327\216\312\270\271\350\320\200\203\304\374\211\324\217\362\326\302\225\313\336\304\200\236\242\352\331\351\304\222\320\350\375\325\320\304\303\343\340\256\215\204\253\300\247\324\213\203\320\244\337\375\365\325\354\301\366\227\302\260\240\251\200\307\212\223\213\266\231\370\234\233\265\373\234\300\306\356\250\302\266\315\340\261\225\314\270\246\250\215\233\364\215\302\362\212\260\360\271\355\266\350\277\261\360\214\370\214\350\365\322\217\375\370\217\314\362\203\306\343\251\241\361\241\355\236\363\354\366\376\317\242\212\227\362\223\307\364\316\237\376\337\340\341\247\217\343\257\251\204\214\266\363\307\324\260\331\307\220\270\243\226\250\202\324\226\354\354\345\376\231\247\267\360\276\243\255\306\300\243\204\326\221\355\240\332\367\253\203\264\352\236\365\307\371\251\220\360\357\247\372\267\246\210\325\331\240\207\222\265\333\354\374\251\351\241\250\334\343\243\203\341\276\256\374\260\301\301\345\377\206\307\374\302\234\225\247\376\257\306\340\372\325\225\225\351\372\373\276\362\345\374\316\237\352\303\335\257\321\201\300\215\263\223\221\272\364\315\374\202\350\225\262\267\206\307\251\220\325\216\275\247\226\250\345\321\303\320\350\210\210\244\333\322\271\261\222\311\246\201\203\247\263\320\227\303\356\216\215\342\273\207\335\310\201\336\355\222\236\234\270\334\266\334\230\367\362\232\312\270\202\304\201\303\264\221\200\352\233\323\250\202\253\264\254\201\340\317\350\377\264\363\342\313\354\250\237\312\262\261\245\215\306\270\326\331\325") -TOPIC_TEXT( -"\336\302\374\341\374\205\250\314\334\325\367\321\202\246\206\275\266\371\270\352\214\326\334\372\243\377\352\305\261\312\305\340\214\212\321\212\362\234\334\273\236\301\354\343\300\251\246\272\206\200\342\230\305\360\327\235\311\212\220\267\312\334\221\363\214\320\222\250\207\236\252\273\216\217\245\365\307\242\232\327\325\336\264\242\356\243\315\310\304\256\354\336\210\231\220\214\350\205\225\240\245\247\252\333\321\246\224\307\377\207\337\245\200\212\371\203\374\256\326\267\225\237\202\217\251\343\245\367\321\225\363\310\270\302\371\270\330\236\344\261\277\366\256\245\347\333\352\334\330\214\360\231\227\337\267\264\245\246\365\200\207\375\362\264\363\244\326\231\276\341\316\311\224\311\257\350\234\233\252\372\310\255\244\337\232\322\316\340\243\313\276\330\324\243\362\345\236\256\225\342\205\304\244\350\324\357\333\202\327\236\247\243\373\260\265\216\235\211\304\251\333\320\366\345\347\257\327\352\254\375\265\360\230\357\274\246\276\257\327\276\216\255\315\340\264\307\362\361\225\354\356\364\261\241\251\241\232\307\265\273\243\357\341\370\214\361\264\364\315\315\205\361\357\230\214\214\373\235\307\317\227\236\234\367\367\264\242\223\242\206\257\243\207\332\266\365\213\264\224\337\350\275\305\377\340\227\321\240\362\337\317\247\277\303\340\343\310\313\363\350\367\366\375\267\370\242\326\346\245\247\321\347\344\227\246\314\203\252\254\331\244\252\277\203\205\205\222\324\313\347\214\217\323\244\312\370\353\255\247\274\207\303\232\343\251\214\366\275\320\275\301\260\213\320\331\233\334\253\322\373\211\371\206\210\224\255\306\212\307\343\311\336\355\222\322\370\214\253\311\250") -TOPIC_TEXT( -"\342\203\245\320\310\266\350\325\250\220\220\256\271\370\220\353\322\200\315\203\361\372\331\341\273\260\221\352\306\307\273\210\227\240\224\307\365\256\335\204\362\275\250\336\200\371\230\373\311\235\263\300\213\200\236\336\260\376\364\275\255\212\333\337\375\271\300\357\244\226\327\273\322\361\373\276\275\373\320\277\307\272\262\230\342\261\272\202\261\250\271\376\211\236\203\322\305\346\226\230\210\253\232\220\330\203\363\245\370\354\274\330\333\362\323\331\306\354\332\377\202\365\246\243\226\223\343\371\331\211\333\315\354\215\374\231\233\265\217\254\220\216\211\372\354\227\207\261\357\345\256\200\351\274\270\326\274\304\264\344\350\270\367\200\276\370\323\342\202\347\332\250\373\367\275\211\247\262\303\277\264\252\277\277\237\347\260\202\362\370\374\304\274\266\262\210\353\266\236\264\252\322\375\376\341\312\211\332\216\226\301\356\301\340\255\204\253\370\357\212\215\325\215\375\241\316\272\241\220\244\210\324\276\213\274\376\342\371\323\327\272\320\276\222\354\212\365\216\201\261\315\356\373\240\352\272\217\210\313\355\370\225\334\253\205\324\233\302\262\242\247\300\212\360\217\367\311\223\307\302\372\274\204\213\312\342\240\362\366\334\245\225\212\341\200\343\234\216\211\307\241\206\363\337\360\307\266\212\377\210\234\320\361\237\225\311\205\240\244\215\275\374\277\334\311\270\363\370\250\357\265\373\316\325\247\363\260\202\261\307\343\364\226\366\366\201\210\233\223\352\352\257\335\270\231\213\206\315\224\226\264\236\235\210\325\330\373\333\232\321\343\234\241\316\236\263\217\251\361\266\233\236\211\331\273\263\252\344\260\242\226\376\224\255\315\233\267\201\363\205") -TOPIC_TEXT( -"\331\303\220\375\335\251\272\257\351\203\355\260\346\345\263\207\277\303\337\271\360\271\264\354\253\250\321\372\363\321\230\246\321\350\227\306\216\221\332\242\356\257\370\231\311\310\320\370\304\232\230\204\367\354\227\246\246\356\313\323\210\227\264\251\273\216\200\214\365\361\202\202\222\325\352\312\317\321\267\325\314\331\357\221\312\273\244\242\376\217\270\310\373\313\243\252\367\203\361\372\262\340\202\221\230\226\357\303\264\251\300\272\355\215\324\261\206\307\317\232\271\261\275\243\316\230\210\353\321\336\234\302\225\356\205\366\204\215\202\276\360\265\371\277\273\261\266\252\246\253\335\316\227\273\302\201\267\335\235\255\361\375\364\257\350\226\266\246\334\242\333\211\261\241\224\307\336\252\371\223\270\340\262\264\264\224\217\312\336\310\354\310\252\276\302\236\343\232\230\276\202\204\347\214\377\310\207\241\206\307\265\322\364\213\323\236\332\253\276\271\306\257\320\204\312\330\213\357\204\254\202\335\366\224\314\325\355\334\236\333\364\340\302\220\356\277\321\371\362\364\230\367\366\302\356\351\374\237\357\277\356\334\261\215\377\245\333\251\243\227\334\253\336\300\337\203\310\304\303\373\367\305\344\250\221\353\346\364\227\251\240\321\274\334\342\206\372\350\276\360\276\370\271\373\266\205\302\335\322\202\232\364\324\366\223\212\206\226\213\260\363\241\276\257\311\364\245\232\234\364\276\277\373\326\202\320\312\217\254\303\327\257\216\271\302\241\241\330\330\253\217\334\227\337\203\301\317\256\347\247\343\363\216\311\224\220\275\330\235\247\324\277\311\221\222\333\343\207\333\316\250\323\233\210\334\226\205\370\262\330\377\363\342\324\366\327\321\340\205\264") -TOPIC_TEXT( -"\337\250\227\241\301\336\330\312\322\264\303\225\264\201\203\333\376\362\263\311\307\352\333\241\252\216\307\334\357\271\367\215\311\260\264\242\276\343\350\246\266\377\267\236\305\206\213\234\377\355\336\361\221\264\330\251\220\200\327\334\255\233\357\362\364\207\227\366\277\271\324\354\253\234\232\273\257\305\342\356\207\244\314\340\275\304\350\346\341\342\267\201\240\267\342\267\345\342\232\332\357\317\264\316\361\221\377\212\323\224\326\254\372\327\304\375\257\331\221\355\232\243\277\303\211\302\331\214\250\266\310\266\210\354\306\247\244\241\263\330\203\350\214\355\232\336\224\237\370\351\335\320\364\264\211\327\337\223\243\342\206\311\312\323\315\244\370\323\336\316\200\256\232\225\213\313\343\324\217\256\315\247\323\360\242\342\235\361\274\335\356\374\335\371\301\200\376\366\342\276\241\256\220\366\365\327\353\304\222\217\332\375\201\367\324\324\204\273\237\250\206\307\364\313\223\277\231\216\350\317\327\351\262\303\330\361\307\361\312\253\274\262\240\212\355\251\356\357\304\362\312\271\264\273\345\271\306\242\227\210\253\372\240\205\372\267\265\261\320\361\230\310\252\316\335\205\203\226\366\344\354\225\365\377\353\267\317\316\335\375\316\201\376\202\314\366\275\372\337\376\301\363\347\317\344\367\206\347\317\236\276\375\272\343\264\330\366\247\257\360\242\222\326\324\272\257\245\265\213\376\333\340\306\334\223\220\201\366\317\351\276\226\324\256\213\203\353\307\221\350\270\241\367\236\372\350\231\222\215\304\313\202\213\362\325\325\247\207\355\372\356\313\260\261\326\270\313\244\250\230\332\225\254\323\320\204\214\301\206\303\335\340\340\351\203\254\266\357\333\245") -TOPIC_TEXT( -"\263\334\257\224\366\266\353\361\377\335\326\232\361\370\370\311\341\352\250\371\266\377\266\321\242\331\265\342\337\330\315\351\202\225\374\364\267\327\316\276\316\323\222\335\257\375\375\201\360\256\340\351\361\264\275\215\326\273\253\337\267\334\272\360\226\317\206\220\243\233\330\326\303\301\313\312\324\250\273\255\254\350\305\316\200\264\301\235\231\375\247\243\274\244\214\210\274\210\332\345\276\271\261\252\275\216\273\257\260\265\203\277\215\217\334\201\350\301\300\250\274\216\365\366\230\211\337\214\203\275\212\331\200\276\277\230\304\313\204\304\265\300\255\370\214\315\331\207\231\306\314\262\245\346\370\250\211\365\200\321\211\257\232\336\276\364\362\304\261\306\374\260\226\253\343\210\345\327\321\314\342\301\276\210\341\323\244\374\202\355\311\320\212\342\301\306\344\203\340\203\342\361\354\236\271\266\204\350\371\321\376\227\370\303\343\341\241\376\334\217\277\374\220\276\354\200\340\303\334\266\225\251\374\325\365\254\230\321\341\221\335\357\347\206\322\326\370\331\234\362\362\300\236\373\367\355\246\212\267\203\346\307\302\332\252\323\221\236\335\350\216\355\242\342\263\204\234\220\236\327\265\366\376\223\211\363\363\363\361\327\301\350\365\265\275\275\235\215\252\326\264\205\362\374\372\355\307\256\210\340\247\300\262\312\275\314\274\236\346\356\237\377\201\376\271\366\257\255\255\345\322\273\300\360\207\307\336\304\215\205\250\242\341\361\302\244\311\263\324\226\374\331\223\272\251\242\312\335\342\361\272\257\210\252\245\213\377\351\262\370\221\234\320\243\311\237\270\373\352\303\241\252\220\223\272\325\370\303\303\303\346\365\357\332\277\331\333\245\333\375") -TOPIC_TEXT( -"\332\255\316\253\200\270\356\355\202\336\204\342\361\320\203\252\247\272\326\324\367\350\257\231\212\241\310\337\236\332\327\317\276\371\347\270\265\331\244\374\264\333\362\350\227\322\375\336\252\312\335\212\303\373\376\215\255\374\227\323\361\327\342\371\310\256\274\266\361\264\254\300\330\255\351\355\227\226\261\342\212\312\234\230\255\325\243\233\310\264\300\311\215\352\276\272\262\303\261\312\323\243\223\240\242\325\235\216\304\365\300\262\227\201\232\311\325\271\317\355\225\255\366\300\352\246\327\365\314\314\310\243\201\252\356\253\245\323\312\253\246\221\362\360\257\235\323\327\200\261\246\345\332\321\250\365\226\262\335\214\317\305\266\320\247\256\200\215\244\332\230\233\203\264\256\240\217\257\310\243\225\203\303\230\370\215\314\346\222\252\251\341\375\350\230\252\310\317\276\342\247\346\303\246\210\304\223\260\361\301\354\210\250\311\353\231\350\277\301\211\266\204\300\345\232\273\213\256\374\215\250\270\250\305\252\261\336\243\214\264\343\266\370\307\324\240\373\300\343\226\365\346\220\336\320\261\361\333\357\223\233\323\254\270\323\331\322\237\261\375\240\206\335\370\373\246\343\363\373\326\255\324\325\317\337\276\360\356\310\321\334\241\234\207\363\225\366\247\344\274\315\274\230\241\323\254\340\267\241\223\213\316\254\277\267\374\362\313\214\220\313\274\272\202\206\265\202\236\353\375\275\237\317\353\375\361\263\353\321\370\273\347\332\277\265\242\347\301\304\226\257\337\256\356\234\256\370\354\275\213\337\302\331\313\217\212\217\261\362\240\263\352\372\217\223\217\363\253\354\232\275\342\261\341\315\233\222\244\244\235\262\365\255\321\322\265\262\231\206\347") -TOPIC_TEXT( -"\366\217\235\252\300\366\201\307\237\377\235\234\345\307\343\232\346\335\251\231\263\264\330\233\267\331\232\330\275\372\265\335\301\317\367\304\335\304\342\337\251\372\245\240\372\261\304\305\360\330\320\224\232\350\362\321\301\244\357\372\274\340\267\355\237\255\276\220\363\343\335\333\337\302\237\227\224\256\233\340\335\234\303\247\324\227\311\202\276\272\301\210\302\226\340\364\223\211\254\302\221\203\363\260\260\274\376\227\364\203\363\272\302\350\307\306\357\247\243\340\335\373\270\366\331\377\374\350\241\332\274\300\373\235\265\222\213\204\301\222\265\331\310\217\315\206\203\227\324\224\205\304\251\354\374\247\244\373\306\343\361\221\242\301\266\214\221\213\214\351\260\271\214\214\203\203\251\261\270\245\230\364\302\260\350\205\315\265\216\237\217\237\277\202\305\360\253\243\271\361\374\304\327\340\231\206\225\323\211\277\267\316\266\374\323\243\214\367\200\347\236\315\231\322\321\344\204\307\365\314\265\276\266\314\244\277\273\232\317\244\343\347\236\207\234\306\356\242\250\346\314\262\213\357\267\350\260\334\276\235\356\353\362\341\236\354\213\306\355\271\262\312\265\274\226\366\327\242\350\256\267\352\374\274\267\332\356\322\322\233\266\301\363\252\252\312\271\227\317\375\353\335\311\266\256\333\260\313\374\327\257\221\220\251\233\367\357\307\264\227\327\202\326\363\341\237\322\237\314\204\210\346\215\341\265\261\377\206\344\241\303\254\246\305\224\306\307\334\275\317\332\262\370\274\345\324\227\301\343\206\202\373\216\201\342\361\351\353\335\236\247\361\230\257\211\372\275\304\324\373\272\320\210\273\241\323\251\317\345\350\256\311\211\365\325\253\235\267\223\217") -TOPIC_TEXT( -"\377\367\361\273\267\265\274\306\240\333\200\261\230\243\335\252\334\304\316\306\364\337\235\331\211\274\221\324\376\355\357\273\236\353\217\250\336\324\321\333\326\223\370\263\306\304\252\205\235\240\267\252\320\320\242\255\341\356\201\243\375\266\325\344\301\307\314\260\303\303\310\300\242\220\257\323\207\377\327\302\330\203\324\244\255\216\323\352\351\277\333\252\210\265\334\340\223\344\315\350\206\327\231\322\350\277\356\377\317\364\200\300\357\266\352\374\371\362\364\345\314\202\341\204\256\314\242\330\222\202\212\344\222\324\370\331\272\304\366\311\330\304\202\214\267\251\372\226\340\353\313\376\224\240\333\305\351\332\256\317\274\236\322\316\373\275\317\243\320\235\370\276\261\232\216\232\231\365\201\240\371\371\360\357\334\205\312\346\324\201\357\246\333\366\203\360\302\344\255\211\307\214\346\340\246\261\261\326\304\336\207\270\344\340\301\264\240\374\310\352\370\336\234\307\260\254\371\374\202\277\372\321\217\370\273\210\265\305\315\253\305\205\310\343\242\316\251\363\301\217\252\200\220\226\273\235\331\250\337\353\323\323\323\270\222\337\352\324\374\254\353\227\241\367\312\376\301\254\317\370\323\320\267\326\371\363\213\356\352\354\237\363\347\274\214\367\245\352\252\346\360\236\323\311\367\364\311\265\323\234\313\353\303\362\345\250\247\370\226\272\345\355\323\335\265\233\317\204\261\364\314\360\250\261\345\363\364\312\305\263\313\254\274\372\224\364\236\315\354\326\275\233\330\220\244\375\231\267\326\375\257\321\210\245\336\375\365\325\274\372\306\352\225\331\257\343\243\356\251\306\313\257\275\344\226\370\271\326\355\312\214\376\232\225\346\254\203\307\313\372") -TOPIC_TEXT( -"\371\201\227\343\361\276\323\365\230\357\242\372\304\343\371\315\202\262\314\257\364\274\325\342\246\255\370\355\247\236\277\366\332\257\344\233\233\256\350\215\202\343\275\301\207\303\335\356\315\302\252\371\331\211\332\327\334\235\334\371\357\365\352\325\352\276\226\244\231\314\362\234\276\203\310\233\373\361\231\214\334\320\257\323\345\345\354\222\221\274\336\235\331\331\253\272\273\232\271\350\315\217\261\354\337\322\351\242\246\305\337\364\355\334\277\277\363\244\235\265\277\336\236\222\346\307\213\326\257\217\307\275\374\311\343\253\271\272\310\271\333\331\306\213\313\235\206\262\363\373\351\323\307\304\262\266\306\212\330\310\260\254\200\206\347\373\272\253\223\223\205\276\262\257\272\373\300\374\220\345\310\371\366\221\374\245\227\261\275\324\332\226\305\343\211\316\263\232\274\224\340\237\351\212\316\226\307\341\367\312\256\243\340\247\300\234\367\354\244\372\313\325\202\304\225\330\340\203\371\251\277\333\300\203\271\307\342\262\276\207\252\355\343\366\343\307\217\201\311\362\237\365\331\263\247\232\227\263\200\232\256\257\203\333\320\256\342\210\231\251\271\244\233\263\342\232\371\234\277\321\207\254\364\206\261\216\330\366\256\362\307\340\360\200\370\231\330\301\227\210\211\315\273\237\235\236\212\242\207\310\304\343\216\371\302\344\260\343\257\346\330\243\270\241\276\372\216\271\264\202\261\240\334\237\226\305\214\277\247\206\246\246\340\377\236\373\201\302\221\307\201\222\247\344\210\265\347\227\325\220\245\262\226\330\201\327\366\356\321\276\236\376\344\270\213\232\222\213\263\202\236\305\366\301\213\303\264\365\361\350\312\315\345\213\223\347\324\271\312\357") -TOPIC_TEXT( -"\314\233\200\353\346\323\342\304\320\274\225\232\330\340\337\310\203\245\314\222\263\215\232\221\235\371\344\312\275\221\316\231\215\200\305\371\314\237\317\350\370\314\301\324\351\330\330\317\202\304\236\343\241\202\251\251\251\374\216\215\207\303\261\270\341\341\327\226\344\361\330\365\210\213\316\333\322\313\257\256\253\276\232\227\301\343\346\365\310\236\327\217\355\273\247\244\243\215\356\333\300\367\345\271\342\261\322\351\226\260\265\352\221\217\201\345\265\301\327\233\310\267\272\227\353\336\251\237\262\220\257\217\327\256\371\377\216\234\242\276\244\236\244\226\251\316\320\316\214\273\346\216\323\345\201\223\317\276\346\340\264\240\227\312\267\305\305\366\202\355\364\255\315\232\216\231\311\356\276\203\371\373\376\344\353\275\240\371\221\313\373\314\303\343\226\334\377\372\317\327\261\306\261\253\275\324\310\260\247\276\360\322\322\254\361\366\226\212\346\367\236\335\323\246\231\264\310\342\201\212\306\232\374\202\326\230\335\264\264\324\212\272\367\217\335\356\311\305\351\200\242\341\204\341\322\220\336\345\364\262\214\336\350\342\256\326\204\203\222\212\244\317\223\273\244\273\243\252\360\346\242\245\343\362\217\326\300\273\202\241\200\244\373\212\344\330\215\300\312\225\315\244\320\245\262\337\360\304\326\333\234\247\272\324\245\362\250\240\236\260\326\305\322\246\351\373\310\304\222\266\352\374\372\344\326\324\233\217\347\300\314\237\276\232\206\200\315\223\241\275\375\375\330\247\302\237\261\360\373\367\307\353\207\304\330\220\340\277\376\242\300\222\203\235\257\335\270\313\316\360\224\341\336\316\354\304\266\247\355\215\231\251\330\261\325\305\263\237\227\315") -TOPIC_TEXT( -"\304\231\206\223\226\303\242\252\217\271\213\234\241\235\251\274\307\226\217\226\301\216\275\230\307\303\235\250\310\264\336\261\227\200\264\333\372\267\250\246\242\370\367\373\326\255\221\313\220\214\215\372\360\272\263\245\244\332\310\242\274\237\261\375\214\305\304\220\345\332\332\324\303\224\277\236\256\366\241\301\336\273\227\303\263\351\331\371\364\270\242\307\200\367\231\253\270\354\350\364\231\306\324\262\277\277\215\267\327\234\362\360\261\262\227\340\352\352\217\227\336\350\325\271\330\337\306\257\231\252\325\246\343\365\337\261\224\310\273\366\364\207\261\274\374\324\350\261\254\260\346\364\222\372\345\346\262\207\232\347\232\370\226\204\355\257\266\361\230\217\204\332\265\326\342\305\312\221\360\236\267\265\265\341\353\345\307\313\227\227\264\236\353\345\374\275\202\260\373\257\336\311\337\323\373\262\230\361\270\300\203\275\214\230\370\314\323\267\251\217\370\254\257\311\362\356\372\232\224\330\225\304\361\211\376\223\217\367\357\375\345\307\202\237\377\331\353\223\342\235\347\237\256\312\256\362\240\260\333\200\241\203\206\302\372\204\240\267\221\255\222\262\356\330\324\232\323\346\301\362\362\314\344\220\242\300\343\206\336\301\214\247\260\225\352\246\325\215\315\305\250\254\252\251\313\362\275\302\324\206\342\235\267\260\372\226\263\311\212\335\270\302\346\313\244\202\205\220\334\275\331\351\373\262\272\221\307\226\276\222\345\366\203\310\204\341\322\251\367\270\377\212\305\336\300\345\354\334\356\255\304\265\271\270\370\214\300\246\206\220\250\337\235\213\244\232\217\311\207\252\350\265\371\360\234\323\343\340\223\372\313\202\274\330\371\215\340\254\257\251") -TOPIC_TEXT( -"\232\305\303\244\226\205\260\360\260\242\244\366\240\206\345\204\242\252\327\212\271\357\274\337\303\325\227\245\321\333\265\363\212\361\300\347\304\333\313\372\324\263\235\257\362\341\305\330\227\321\233\361\311\202\350\272\265\260\270\240\337\361\212\372\320\325\251\372\374\201\217\305\321\212\216\302\246\237\235\252\306\224\203\217\361\250\371\237\350\260\302\243\332\343\352\221\271\263\244\240\370\254\275\315\307\342\316\254\300\377\245\225\260\272\250\232\343\321\261\344\356\320\221\263\274\203\243\251\350\275\230\337\325\371\365\362\245\377\363\221\202\264\223\273\270\301\302\237\354\342\370\263\304\261\272\333\357\353\213\332\227\341\240\364\303\346\366\377\350\330\257\306\307\234\225\274\216\212\324\344\311\300\241\342\245\316\222\233\352\266\207\316\344\332\245\246\217\346\220\200\255\204\355\263\225\307\302\343\352\322\257\231\343\230\363\213\274\271\330\334\217\234\217\337\370\343\347\215\242\242\242\374\375\352\207\253\257\260\256\370\274\262\312\262\262\371\363\346\251\323\253\331\331\251\273\200\247\377\267\372\323\237\376\364\321\307\305\201\334\206\372\275\251\302\334\343\215\373\335\277\232\261\255\251\251\356\216\336\226\205\245\303\343\373\277\322\377\305\277\254\237\324\355\366\215\211\352\255\216\370\314\266\307\273\254\361\305\352\360\270\356\272\313\361\370\334\325\257\327\257\364\376\313\265\275\213\345\314\260\262\261\266\224\327\276\202\377\355\360\332\265\253\350\340\266\346\217\360\306\321\274\241\232\300\343\351\261\254\220\221\224\274\226\355\261\332\261\232\226\321\250\223\372\200\300\246\334\212\214\360\324\227\256\234\222\325\203\327\254\211") -TOPIC_TEXT( -"\314\226\266\366\327\274\340\357\211\277\276\221\323\361\320\325\367\213\367\366\347\251\227\226\212\234\333\327\264\224\305\373\253\226\371\306\306\324\347\303\236\221\375\246\224\334\310\264\241\354\360\242\321\336\364\203\322\376\327\320\350\202\370\314\202\264\242\330\326\232\250\372\262\233\214\326\347\312\363\206\222\237\344\314\320\237\227\306\362\244\342\326\223\227\254\254\247\301\302\247\235\215\243\321\274\306\241\257\342\330\342\330\356\305\243\366\246\325\343\236\273\351\325\256\307\227\303\301\343\271\322\244\334\256\231\241\350\346\217\334\274\253\216\366\216\366\210\213\207\376\225\340\334\340\304\343\261\242\360\221\243\212\241\307\270\254\207\307\304\241\215\321\236\223\231\371\303\234\341\361\270\326\261\243\212\307\361\366\202\232\236\213\371\204\213\232\271\303\275\310\232\316\276\307\254\340\300\246\261\356\366\264\355\210\275\367\264\213\246\350\215\271\357\274\366\350\343\210\222\237\335\214\233\321\321\276\214\247\265\253\376\336\242\264\326\201\236\307\253\217\252\367\206\357\333\373\245\330\206\346\317\366\334\233\361\315\214\254\210\352\254\211\370\360\356\264\210\342\226\327\255\205\375\263\305\206\342\262\207\257\203\270\266\307\263\317\266\356\237\317\345\356\325\226\323\203\216\212\340\223\273\363\204\235\354\254\236\203\215\301\277\370\240\312\316\226\250\202\375\222\217\211\301\311\330\202\236\326\316\367\241\252\231\334\235\324\300\222\254\236\273\356\367\327\216\226\272\374\352\361\307\257\374\313\372\361\330\361\217\270\313\377\315\200\361\330\322\277\254\371\367\315\343\353\222\242\323\355\261\366\377\264\305\360\277\370\344\361\337\311") -TOPIC_TEXT( -"\264\276\261\330\270\226\236\367\365\364\375\312\324\224\213\233\336\236\211\334\234\232\361\272\306\370\207\243\250\366\225\340\343\373\227\240\214\205\224\301\343\332\211\256\362\366\376\346\333\350\372\201\202\263\250\251\245\227\204\212\236\333\355\316\226\203\226\236\227\237\274\306\244\334\252\205\373\315\303\343\346\272\346\317\335\351\350\331\301\336\226\215\353\242\276\245\302\354\347\205\265\360\255\303\247\306\310\276\321\334\321\311\273\302\352\362\234\362\245\346\211\335\274\267\213\240\274\314\305\363\346\307\234\221\275\246\317\362\343\364\351\314\320\377\207\272\341\334\331\203\310\353\301\211\221\210\226\366\274\326\200\306\304\202\262\340\327\260\217\377\234\202\247\227\331\354\310\200\352\330\336\201\225\333\262\234\365\234\223\275\264\206\202\307\220\362\330\232\354\363\212\265\232\363\356\254\313\364\205\337\352\235\355\234\210\237\330\216\312\337\253\225\313\360\336\333\205\360\320\277\227\213\204\243\273\212\307\274\246\214\200\310\354\353\270\273\241\214\210\344\300\346\342\213\353\221\325\367\320\332\261\365\264\304\335\264\232\202\304\343\227\314\235\214\372\360\261\357\357\236\253\227\366\257\201\207\311\305\303\203\213\275\216\211\254\275\302\262\236\243\336\213\211\205\357\274\215\366\356\210\302\207\324\355\262\263\332\337\266\337\257\215\375\353\254\311\232\200\205\325\352\200\265\313\253\217\367\357\254\307\234\255\376\234\257\266\326\274\250\347\257\213\313\310\365\370\265\324\271\247\312\346\271\302\360\226\356\213\204\331\304\236\236\263\331\267\331\201\275\340\202\307\343\246\246\246\276\374\322\360\230\353\202\212\315\330\370\342\304\211") -TOPIC_TEXT( -"\360\262\271\252\310\324\301\211\314\234\363\324\222\244\236\313\345\271\376\220\335\242\302\343\232\326\376\201\374\315\276\341\311\344\357\361\330\276\250\227\346\361\377\317\306\335\230\350\242\341\216\261\235\362\370\316\371\217\273\354\306\345\372\341\275\300\301\272\271\377\370\274\272\364\353\346\366\355\253\230\253\301\210\261\346\205\205\306\334\255\301\315\215\223\343\303\352\234\340\267\354\237\214\367\217\215\326\214\262\315\304\273\204\274\236\344\364\340\325\253\327\273\354\266\240\252\305\232\332\344\210\205\210\333\341\222\367\302\233\360\230\376\205\202\330\252\334\201\246\237\266\300\321\264\321\330\356\313\202\217\315\303\270\316\253\204\367\350\355\356\330\232\332\254\206\250\356\321\207\220\373\246\243\374\357\317\231\312\355\365\324\360\353\374\224\371\235\347\363\325\360\204\316\334\320\357\243\223\267\242\262\356\354\361\333\211\271\303\305\315\274\322\222\351\205\230\272\332\202\356\206\242\301\223\272\335\267\212\306\374\264\203\370\214\350\326\360\230\220\317\302\303\211\361\210\321\323\360\246\306\345\226\345\321\363\222\331\225\336\350\377\354\256\202\353\307\270\236\252\352\251\243\256\223\355\261\243\271\267\221\347\333\200\201\272\275\325\262\202\245\241\371\275\303\261\267\315\225\321\222\250\275\271\250\213\221\361\216\307\301\204\277\325\231\210\260\227\343\350\210\310\343\253\336\225\326\340\250\263\273\323\245\363\307\245\213\306\347\321\240\305\246\326\205\277\256\232\231\213\361\202\260\310\252\235\304\365\267\324\205\221\232\344\364\201\340\264\374\243\272\240\262\332\373\200\261\273\232\361\304\243\272\341\272\243\215\304\215\321\214") -TOPIC_TEXT( -"\305\204\311\305\356\364\304\351\216\336\210\317\326\313\326\267\231\327\252\352\365\201\203\301\307\336\300\311\256\322\313\245\303\357\336\230\357\204\214\237\320\200\373\335\342\235\363\216\366\263\322\347\304\226\374\345\226\256\240\300\320\206\215\210\252\231\261\210\332\275\213\326\353\332\235\273\257\326\267\235\274\361\354\354\250\374\236\231\345\343\377\331\265\300\361\230\312\341\227\257\276\372\312\326\371\327\357\211\312\330\256\356\324\320\314\253\311\256\263\337\317\200\251\221\253\264\300\363\344\306\217\303\306\226\366\337\335\326\317\342\322\270\343\302\350\354\254\230\230\313\257\260\237\365\367\311\371\266\200\377\251\343\341\325\256\222\274\326\225\256\352\236\361\230\275\222\336\213\313\240\330\270\222\204\236\337\344\235\261\271\202\255\252\213\246\345\205\246\256\210\367\365\217\341\325\226\346\321\265\313\306\306\213\315\210\357\350\237\306\245\246\245\310\377\337\317\243\364\364\264\272\270\351\372\233\252\353\273\320\373\343\213\230\245\261\335\372\324\250\240\364\204\373\341\210\367\357\215\315\201\343\355\301\212\244\223\223\305\310\320\227\320\216\337\357\315\304\265\267\356\242\247\260\320\243\327\300\210\307\227\237\317\257\374\266\360\233\215\223\217\261\313\320\217\311\225\276\240\361\322\302\343\305\243\357\223\343\267\344\331\343\326\273\321\342\375\303\372\365\213\266\361\366\251\321\355\345\305\371\335\243\250\262\263\203\320\304\272\227\333\331\222\337\301\253\267\242\201\306\247\255\257\201\370\253\277\241\250\257\307\232\220\231\275\313\324\250\377\261\232\376\260\231\370\337\261\237\242\346\273\206\305\365\304\340\367\273\236\233\266") -TOPIC_TEXT( -"\200\301\200\373\247\370\254\232\316\376\352\256\213\352\217\231\356\225\272\326\326\252\267\260\200\306\226\257\246\367\337\274\213\226\354\274\266\242\246\246\242\345\224\266\342\233\363\273\233\260\331\310\342\244\216\307\256\306\267\256\261\226\327\224\360\356\357\221\341\336\347\317\356\331\376\213\210\263\247\230\351\252\303\313\375\373\367\335\202\262\200\235\250\254\340\243\314\201\312\247\237\351\375\266\364\245\247\206\301\201\343\221\262\252\271\344\344\310\200\211\271\351\366\333\233\250\241\212\341\212\361\307\322\271\331\273\260\310\273\310\216\205\264\372\200\255\260\256\370\314\225\256\326\217\221\342\216\260\277\210\227\267\256\275\342\261\273\201\206\252\300\264\373\366\324\323\303\366\335\344\227\255\376\370\277\370\364\250\203\307\343\254\374\364\321\247\277\335\266\337\374\302\335\210\301\302\332\306\305\245\326\275\326\312\373\304\277\307\235\263\244\304\311\211\256\366\243\223\203\237\210\236\253\236\222\355\251\310\252\355\305\374\213\340\361\327\273\314\274\246\326\332\200\220\253\225\370\277\221\232\340\210\274\344\224\210\356\210\300\254\331\332\224\227\361\235\220\303\320\240\262\372\214\223\306\320\352\265\220\241\321\324\320\277\334\274\353\306\277\250\370\342\202\276\214\214\335\254\222\362\324\304\355\307\370\314\226\222\214\202\332\343\327\356\216\326\265\253\327\213\366\367\336\316\235\333\264\222\264\240\344\240\365\340\206\204\264\231\274\366\255\214\241\261\256\372\273\233\212\262\216\353\230\300\205\351\277\260\330\202\211\270\325\265\300\330\217\360\206\350\234\244\320\237\316\243\302\204\311\312\220\313\373\254\254\202\214\307\263\306") -TOPIC_TEXT( -"\224\322\362\270\301\315\215\371\262\250\253\366\230\233\355\352\275\345\306\321\355\261\306\257\361\257\302\326\305\343\360\265\256\211\247\366\333\257\304\275\236\324\254\363\356\225\254\234\355\234\371\214\250\375\251\226\341\374\320\213\236\343\212\315\215\216\374\236\314\342\263\245\271\341\203\344\211\343\300\301\320\350\243\345\221\325\350\317\314\250\336\223\355\257\343\323\334\351\204\352\264\242\272\344\320\261\357\343\263\231\237\326\201\331\243\317\250\331\216\357\232\341\265\215\262\316\325\237\227\361\251\231\371\341\256\306\332\262\207\237\202\246\330\270\231\307\313\306\321\332\232\303\366\357\240\302\227\201\247\323\374\371\301\363\351\327\345\244\356\210\354\342\250\266\361\331\212\321\344\276\353\221\324\274\231\271\367\240\261\212\332\315\324\372\224\340\370\300\343\210\375\320\344\240\261\220\305\234\335\364\312\222\305\343\311\210\340\367\366\204\244\354\250\252\332\274\242\351\363\367\347\326\246\202\373\217\251\272\306\247\272\221\201\314\274\262\262\242\221\255\357\344\327\242\242\242\352\226\356\227\263\355\261\243\320\272\220\323\356\302\324\354\233\240\374\227\222\217\355\353\211\336\246\201\307\343\373\334\264\377\205\252\232\320\256\266\274\366\376\334\210\307\277\375\327\337\230\334\357\370\223\215\247\211\367\271\374\344\261\264\366\354\376\256\315\211\316\251\321\201\343\376\233\346\340\207\233\363\300\202\336\352\354\364\374\345\206\277\371\344\343\353\312\310\203\317\240\307\274\346\227\354\302\330\252\247\372\206\361\213\365\264\351\324\206\343\363\361\277\243\207\324\236\231\227\224\271\325\222\223\252\361\211\255\263\324\333\310\253\212") -TOPIC_TEXT( -"\243\341\337\227\307\217\246\321\375\260\307\253\372\376\341\204\333\246\364\237\314\341\210\252\200\231\314\361\220\374\204\266\237\307\310\237\214\367\343\210\275\335\251\225\326\354\366\353\240\254\334\236\212\307\221\324\203\251\347\260\262\220\336\254\203\307\201\211\212\206\301\367\307\207\347\200\307\305\207\213\304\360\215\230\316\372\213\327\304\203\340\214\260\336\314\351\357\360\341\262\230\321\303\350\361\260\207\263\343\261\235\340\264\274\203\306\213\214\330\245\335\213\337\341\320\224\202\321\211\354\324\370\354\247\227\367\313\305\216\310\366\236\245\370\227\355\210\266\321\326\314\233\264\363\240\356\261\362\260\342\330\271\242\230\212\241\304\326\324\262\235\234\211\233\274\207\345\346\263\212\347\375\373\367\340\255\307\336\376\301\333\356\251\236\205\333\337\227\306\270\326\360\204\266\222\262\254\276\354\351\356\270\237\202\266\345\303\372\271\365\350\344\254\361\343\226\364\356\301\233\374\244\244\330\200\307\245\211\217\216\372\261\323\275\210\363\325\211\233\242\351\360\246\344\315\267\332\227\242\332\304\262\370\336\374\311\334\346\212\304\376\337\356\336\301\357\342\373\254\370\254\236\312\304\332\235\320\314\240\222\235\307\343\225\220\355\326\234\265\242\303\376\370\323\216\324\261\340\261\201\230\237\352\306\267\206\247\300\362\342\304\211\362\215\217\331\376\363\346\315\305\201\334\206\372\275\251\262\364\275\326\257\337\333\242\356\343\245\226\367\331\361\331\321\203\313\222\336\274\266\354\326\332\261\356\254\355\343\217\312\233\242\375\323\325\200\366\211\237\341\361\256\234\235\337\376\333\361\271\261\263\316\244\344\234\247\271\220\355\237") -TOPIC_TEXT( -"\347\315\352\317\233\266\223\364\275\271\202\362\271\246\273\273\373\317\224\356\216\232\227\215\275\334\213\342\274\311\204\267\373\206\314\275\236\234\276\260\306\324\300\276\323\213\202\220\367\321\206\224\316\352\314\345\252\226\315\320\265\243\204\205\236\343\356\227\375\224\244\243\311\340\360\361\302\262\274\324\317\234\245\266\333\267\356\221\303\343\361\361\313\332\230\221\374\225\336\257\200\210\277\241\314\345\225\223\261\324\317\303\206\260\327\202\307\302\236\257\304\223\262\240\260\200\371\230\276\376\302\370\307\325\356\371\245\206\246\363\242\373\365\266\327\337\225\353\354\357\310\364\225\376\301\372\344\246\241\223\210\217\377\272\375\226\346\220\226\342\210\271\246\225\317\247\344\252\307\212\265\324\236\352\300\266\303\362\262\223\221\253\252\210\310\217\333\232\274\205\314\273\305\314\260\225\214\364\234\231\320\214\307\246\346\275\302\320\226\270\343\255\311\346\345\201\350\306\352\266\272\336\356\225\246\271\253\370\374\242\321\347\230\347\244\341\264\257\245\237\226\264\254\230\376\366\216\313\300\302\237\213\236\353\263\302\330\242\230\227\200\234\335\214\305\220\375\340\361\363\264\240\231\223\335\301\255\241\324\232\203\263\346\245\203\313\336\216\220\236\240\264\256\332\245\360\310\274\366\337\322\370\233\265\362\377\252\216\266\323\213\307\312\303\236\227\224\277\367\356\277\334\350\350\250\375\362\324\212\245\217\254\246\202\331\321\262\371\201\317\342\275\354\265\330\265\227\230\341\215\231\364\253\324\237\206\303\346\344\363\213\325\273\237\235\251\265\310\201\322\365\362\216\227\233\305\346\327\300\216\233\333\204\253\214\345\213\373\353\352") -TOPIC_TEXT( -"\253\374\336\226\267\274\364\322\313\204\241\355\374\253\210\255\266\360\270\356\316\226\376\212\203\263\200\206\327\376\264\251\225\212\225\343\253\355\302\351\242\255\323\247\303\237\317\205\217\232\315\204\334\310\340\361\302\242\260\316\333\210\211\240\307\337\237\340\313\220\320\312\314\273\243\276\244\321\331\315\325\201\252\270\364\210\223\230\336\202\376\243\275\224\364\270\340\274\205\352\325\205\373\273\257\337\376\270\307\365\341\301\336\320\327\225\232\343\245\207\213\366\205\356\235\272\265\300\245\274\241\215\215\320\346\240\334\327\360\337\367\205\234\330\326\322\365\204\255\335\335\235\330\202\333\225\273\323\346\334\223\236\212\221\247\376\250\220\376\360\246\357\234\346\220\262\315\264\372\353\370\355\255\273\353\366\222\207\372\357\336\272\360\226\241\243\376\260\233\225\305\303\352\377\370\347\337\251\236\201\205\323\270\202\313\300\266\315\354\270\351\342\350\350\214\355\216\230\277\243\231\222\307\343\215\264\255\246\231\307\305\271\376\303\272\355\334\261\255\362\235\310\354\340\315\344\211\231\315\240\250\366\311\224\374\245\207\206\331\321\214\203\377\215\376\347\247\227\331\325\313\227\336\300\244\274\355\223\223\303\300\270\224\326\236\304\246\304\224\364\204\302\351\276\310\364\333\340\246\231\355\243\330\335\311\325\232\214\220\331\336\214\237\366\361\211\343\340\342\302\325\235\303\234\347\344\366\254\265\320\233\216\276\346\232\310\234\260\245\315\314\330\361\210\253\240\331\211\327\336\233\207\217\303\376\360\270\271\232\334\262\256\226\202\271\203\307\257\267\300\262\220\370\234\336\373\376\250\377\264\254\246\255\370\346\354\363\276\323\363") -TOPIC_TEXT( -"\256\257\366\351\304\343\304\227\337\377\267\376\367\237\374\362\211\275\200\270\244\332\241\232\231\232\265\321\210\377\324\317\242\267\216\324\317\250\345\230\325\205\216\315\261\243\203\336\313\363\315\203\341\251\246\345\216\227\370\261\371\214\205\311\345\324\255\204\333\256\260\314\276\225\214\262\335\333\262\254\232\263\253\226\212\205\325\320\215\333\240\270\373\313\303\304\211\300\377\213\237\260\235\323\276\364\323\346\240\221\243\233\342\261\356\327\344\351\320\202\323\270\322\342\374\316\237\223\315\333\304\331\310\317\356\220\315\321\243\245\211\272\343\353\307\343\200\275\277\357\306\354\262\262\374\274\240\325\251\262\262\242\202\340\377\254\211\224\237\334\362\320\303\343\240\212\335\232\304\375\344\250\213\265\344\211\222\362\262\370\205\222\314\264\200\217\301\352\262\325\337\302\217\261\200\345\216\246\352\306\240\221\305\334\227\231\371\315\374\374\217\265\343\240\200\354\257\313\237\264\264\301\343\243\335\203\314\356\314\224\366\314\233\312\201\225\346\351\340\216\356\350\340\337\327\373\362\260\336\221\353\343\321\374\216\370\345\211\241\213\301\312\366\307\225\344\243\356\237\250\225\357\276\253\220\222\212\342\320\373\367\277\360\244\250\216\227\317\215\316\236\220\315\335\244\230\367\373\330\355\236\360\360\304\260\310\230\333\200\377\250\365\263\222\306\210\240\312\311\273\241\340\250\356\313\336\316\256\352\374\362\236\342\334\333\267\303\255\242\232\271\371\302\216\240\245\200\310\332\337\340\323\234\210\223\247\226\266\216\303\202\332\361\253\234\233\231\364\240\214\273\254\217\213\275\214\365\347\234\271\320\261\317\212\372\221\353\202\250\340") -TOPIC_TEXT( -"\325\257\262\252\306\364\247\200\331\376\303\375\242\242\206\255\273\322\200\276\306\201\304\331\255\327\201\210\357\274\246\241\257\332\274\274\316\351\222\301\343\227\222\354\341\277\345\306\267\264\236\202\250\325\222\336\242\335\364\370\274\330\377\263\346\342\371\331\323\345\245\220\212\362\223\343\225\347\316\235\273\367\301\356\265\353\271\347\255\262\235\276\355\333\266\227\337\376\212\231\237\377\365\327\377\325\200\330\330\350\217\216\211\344\260\345\224\323\222\246\304\345\254\262\314\217\351\271\272\363\323\261\257\360\361\320\233\233\216\260\347\327\304\203\310\363\274\205\262\224\201\217\370\251\253\253\346\223\216\333\270\316\344\200\226\267\372\265\246\223\300\221\325\312\313\364\331\246\227\331\242\261\245\341\331\224\243\346\257\330\301\334\371\253\376\317\367\370\321\303\330\376\320\375\346\327\245\263\370\263\205\211\367\247\306\335\222\277\222\311\322\261\215\217\237\304\320\246\344\257\263\260\355\222\271\204\274\265\212\313\246\246\202\260\300\270\340\351\227\361\354\205\305\277\206\256\222\326\224\251\230\205\335\272\360\366\260\241\257\303\242\242\250\371\372\225\245\276\340\327\261\341\242\336\240\213\230\246\355\367\234\254\342\351\333\373\372\272\214\231\360\206\321\353\243\326\331\264\306\210\266\253\331\303\223\370\253\343\236\261\205\220\270\262\217\225\305\247\216\237\362\203\367\302\300\305\343\312\271\365\340\273\204\211\236\301\312\375\335\235\255\240\341\246\203\204\263\213\232\347\352\334\364\241\330\301\363\241\337\201\350\227\201\272\242\322\201\353\241\202\322\224\263\363\207\313\300\300\266\221\334\252\304\233\237\261\302\250\334\245") -TOPIC_TEXT( -"\225\222\216\251\330\237\307\326\205\255\357\360\325\313\227\270\232\300\275\375\341\330\212\212\212\362\361\320\251\375\303\300\317\270\253\222\226\346\235\244\223\227\254\261\324\306\375\347\317\250\214\376\226\366\231\262\265\222\207\276\210\274\315\333\266\357\335\262\366\334\322\322\333\203\223\307\315\321\217\252\204\325\233\342\216\302\270\265\233\310\274\217\215\366\332\263\346\341\323\213\343\301\360\361\202\253\336\227\353\235\243\217\262\361\311\264\352\342\221\214\236\313\241\356\231\274\266\254\304\372\213\361\226\237\324\277\325\333\202\203\274\312\334\317\227\236\246\317\214\336\202\241\367\366\357\335\240\204\373\356\216\216\317\216\256\264\226\321\353\221\376\365\340\350\337\377\375\337\363\343\363\247\277\371\311\314\303\214\311\365\332\370\245\325\371\271\330\213\255\243\346\223\300\365\317\263\255\216\372\331\257\331\253\314\326\254\272\275\205\334\353\332\327\320\377\253\237\341\244\214\244\361\330\334\370\263\244\245\201\212\307\214\275\346\252\273\320\230\255\272\357\272\250\236\357\274\270\204\212\211\342\256\356\370\274\261\270\232\266\254\374\246\322\333\377\202\301\322\330\222\327\240\270\376\312\242\335\272\253\265\367\305\337\254\340\227\201\276\302\214\240\342\330\343\223\216\320\227\270\321\310\205\263\265\203\312\244\334\356\324\205\244\340\354\257\311\213\355\332\220\207\343\372\325\243\254\335\231\327\216\306\334\306\335\203\302\274\355\330\277\376\356\210\351\302\316\211\216\267\241\377\374\345\344\205\350\262\261\322\217\301\247\377\367\354\220\342\352\373\361\224\254\344\332\350\211\214\341\317\322\245\325\206\376\315\270\367\312\200\344") -TOPIC_TEXT( -"\322\261\212\330\255\350\331\255\323\244\326\232\341\200\374\200\360\252\331\242\230\233\301\311\314\353\327\214\302\240\342\374\372\274\233\344\260\250\220\325\375\235\256\317\221\250\211\354\304\322\240\224\327\325\326\200\347\320\225\251\300\263\220\337\310\314\352\261\221\370\355\252\274\373\274\200\327\360\266\273\302\226\341\365\204\203\253\211\255\303\326\200\343\366\344\356\256\202\302\223\311\313\321\327\333\315\324\260\356\300\343\334\242\324\314\322\234\277\346\374\245\256\334\207\345\320\354\264\266\317\316\272\353\245\324\356\237\250\325\234\345\245\375\247\217\270\350\227\273\250\363\276\334\356\357\301\337\241\233\241\244\344\220\304\241\236\275\376\205\252\226\206\252\301\370\354\221\234\303\361\330\261\316\251\336\325\377\201\376\233\222\331\204\342\350\362\231\200\340\375\247\352\311\251\245\366\314\213\320\323\262\374\323\324\262\327\206\202\335\301\343\310\351\213\261\361\341\370\205\336\376\350\377\364\301\213\357\303\331\233\337\360\306\377\252\275\307\324\246\247\302\213\217\265\201\213\351\210\212\250\353\364\207\361\211\216\275\351\205\217\321\234\266\264\333\273\265\203\342\240\367\361\351\374\312\255\203\236\370\220\332\246\307\222\220\307\310\332\243\270\202\236\303\264\215\330\374\266\237\217\261\361\345\227\274\337\326\275\377\260\216\255\216\264\256\300\212\226\252\323\234\216\256\256\372\356\370\214\354\322\372\376\374\231\225\360\206\270\346\263\347\317\351\257\214\307\303\216\254\350\226\324\273\303\311\242\250\247\373\242\274\233\377\334\253\351\351\351\207\206\270\347\311\235\227\227\307\245\264\343\342\277\243\256\204\315\235\343\254\255") -TOPIC_TEXT( -"\321\315\346\207\253\243\271\350\320\305\224\263\226\237\367\305\340\240\343\202\256\226\247\245\364\242\250\216\370\301\227\264\336\272\250\202\260\205\203\213\210\335\271\223\246\362\243\265\321\307\322\316\264\304\205\270\213\350\353\245\242\230\300\203\204\203\233\340\253\224\350\356\350\225\275\333\211\200\245\344\260\363\205\231\330\327\244\326\254\367\355\273\340\254\212\246\313\364\305\263\333\273\252\371\252\346\242\221\200\366\300\301\300\347\352\353\323\225\252\303\343\324\310\250\333\326\312\304\205\350\202\253\323\366\373\362\363\312\330\216\225\361\224\201\273\246\314\226\203\377\343\357\322\235\340\213\352\275\371\354\245\335\211\371\272\300\301\330\306\250\305\227\216\203\361\367\201\375\253\202\204\257\327\334\340\273\216\356\314\254\343\361\320\231\371\212\213\213\335\307\302\304\232\343\367\374\254\303\312\362\311\253\270\327\242\230\244\343\367\310\332\200\213\277\202\237\253\363\312\302\327\302\241\300\301\360\230\322\324\231\323\207\317\254\312\346\274\222\371\210\224\362\357\261\205\333\363\312\300\353\367\224\325\371\271\310\212\322\224\223\265\235\352\367\257\206\301\243\352\253\241\272\342\212\241\361\226\373\244\326\355\366\266\373\373\362\256\356\251\372\367\327\232\275\236\267\251\347\350\350\325\307\241\277\244\357\211\340\257\354\336\227\376\332\267\335\204\344\324\335\310\245\324\332\374\367\255\324\247\255\213\334\236\236\342\310\324\260\220\261\373\266\202\217\231\233\272\372\223\301\343\237\305\210\276\330\377\363\342\364\243\226\277\375\305\373\354\343\211\337\313\227\317\271\206\376\353\264\323\213\232\337\274\263\321\252\202\231\315\212") -TOPIC_TEXT( -"\221\245\320\337\311\345\253\200\252\256\244\371\202\212\336\334\363\300\355\274\364\265\263\353\217\251\253\205\226\305\242\206\261\374\343\326\374\334\200\274\270\270\265\346\321\221\373\377\336\330\376\314\325\361\210\331\377\202\247\237\215\371\241\270\304\226\377\332\216\307\232\245\267\361\317\364\214\331\235\335\271\307\355\302\324\343\253\351\210\345\223\200\274\327\214\210\304\345\306\265\325\376\352\311\332\230\347\210\335\370\262\253\367\256\314\341\305\317\343\366\206\255\256\332\212\266\315\352\272\306\303\310\221\303\305\314\205\216\331\221\305\305\331\321\273\226\231\351\357\254\307\245\324\210\271\232\235\211\205\255\331\332\274\270\212\232\361\264\337\303\260\325\342\205\346\244\364\365\215\267\207\253\356\306\213\240\214\374\213\362\241\265\254\350\370\207\274\254\264\303\254\307\325\242\250\306\343\305\373\201\336\225\246\362\271\223\370\226\250\306\367\274\326\202\262\335\252\374\357\327\311\253\212\311\341\305\270\246\370\336\315\334\234\301\335\250\373\365\273\232\361\264\247\244\205\373\363\350\257\364\201\227\342\370\311\341\236\310\304\322\322\363\205\321\206\205\227\207\206\201\357\220\303\225\272\240\253\360\265\300\315\325\245\333\210\357\321\323\341\222\376\367\346\345\371\311\300\343\361\367\231\235\216\343\375\271\343\264\202\301\257\271\253\343\263\353\250\274\250\233\201\346\260\252\366\374\376\212\345\361\330\346\363\343\311\260\270\351\353\221\212\213\307\224\263\300\203\230\244\243\243\227\365\313\215\320\262\241\342\233\217\323\241\372\206\320\240\370\274\334\325\343\231\262\362\312\265\266\357\331\242\341\217\240\314\367\307\336\343\363") -TOPIC_TEXT( -"\374\201\313\361\230\351\273\245\236\340\321\323\247\263\306\324\311\312\375\260\234\205\306\357\364\215\210\216\365\361\252\364\342\264\356\314\351\352\271\371\255\271\273\205\353\354\215\361\354\240\331\350\303\313\316\317\206\235\303\316\257\350\204\373\237\250\221\272\356\277\251\331\270\353\373\243\317\353\306\356\330\367\353\335\367\303\333\217\246\366\325\346\354\370\262\264\273\257\257\243\255\253\227\354\234\320\256\357\310\251\220\300\304\361\367\332\256\370\354\263\206\307\366\367\357\332\322\250\273\342\344\361\334\264\326\227\224\257\251\271\370\366\320\352\320\374\233\354\373\257\377\362\257\364\276\204\366\261\357\267\337\226\347\201\220\335\337\363\261\257\320\300\333\335\362\250\310\266\304\343\234\247\236\215\335\230\201\252\224\305\245\247\207\312\211\374\250\355\261\347\222\211\250\360\301\247\256\355\231\371\344\274\235\253\263\302\227\307\210\207\247\201\234\325\213\215\343\276\274\252\230\257\213\246\330\302\320\255\275\315\340\313\252\263\357\305\306\315\233\223\241\272\207\262\251\200\217\243\207\217\206\243\200\232\327\263\262\322\264\266\205\260\314\262\327\214\241\225\270\223\355\311\340\364\200\203\242\361\273\335\274\310\346\251\210\246\355\324\225\255\367\272\273\257\307\237\341\212\271\237\315\227\271\324\326\305\223\300\363\327\334\360\234\210\277\356\342\303\243\254\301\245\302\265\362\327\347\233\305\243\273\277\343\232\240\357\230\262\276\262\250\331\277\260\213\356\204\250\212\271\313\216\227\340\341\257\202\314\371\271\257\273\260\202\237\244\241\317\376\365\325\251\336\316\306\331\274\267\256\301\340\212\216\376\240\325\365\327\353\230") -TOPIC_TEXT( -"\220\255\342\373\325\237\222\210\310\346\273\212\304\353\327\256\302\201\302\361\330\330\272\330\352\206\247\343\346\337\224\345\227\277\342\201\231\263\344\220\250\211\233\211\244\243\226\352\330\356\303\240\210\231\266\374\270\214\356\213\306\225\317\242\250\305\373\256\331\233\326\304\345\317\300\304\205\250\316\227\332\366\204\205\361\217\217\304\257\257\252\273\201\253\211\336\330\272\316\374\305\277\270\354\305\321\245\217\233\267\331\270\326\335\215\201\234\261\306\243\211\331\223\225\210\301\262\220\230\207\233\207\250\212\267\243\377\211\312\321\361\373\361\312\322\204\267\214\335\275\362\310\361\253\226\271\245\265\353\327\357\261\314\247\237\357\315\222\262\247\362\203\260\221\277\245\224\304\255\322\245\304\343\327\224\240\237\355\206\345\304\344\235\343\233\354\221\371\206\306\243\235\344\203\343\352\327\225\222\301\335\264\340\343\215\271\376\256\364\326\324\304\200\327\344\325\353\305\250\376\356\272\336\316\345\233\355\275\275\267\310\377\241\211\366\377\352\340\303\344\261\304\261\354\370\304\232\352\237\321\360\370\365\327\337\267\260\354\313\240\370\314\340\354\323\247\312\312\373\273\356\270\277\354\353\270\275\263\263\363\274\331\264\260\333\367\217\347\322\374\234\267\377\357\327\347\207\252\253\334\337\363\240\261\325\355\253\200\261\200\231\365\367\247\321\221\333\240\334\351\301\351\351\263\250\320\337\377\263\364\203\311\374\245\203\233\322\330\216\376\363\304\310\303\354\232\217\316\246\205\261\254\310\366\243\326\204\207\356\261\313\362\200\274\274\377\277\202\323\232\300\365\234\212\253\263\262\277\335\233\323\277\312\306\354\234\207\273\343\371") -TOPIC_TEXT( -"\341\340\343\341\336\356\300\251\203\270\277\356\333\273\247\245\341\317\205\246\306\367\331\367\367\307\344\253\232\352\330\275\221\226\223\303\232\227\317\203\212\265\212\264\207\235\217\265\313\357\337\343\371\264\331\254\331\212\264\337\352\263\245\302\206\341\335\303\343\325\334\305\221\217\230\371\204\211\247\277\314\261\213\344\306\366\264\241\204\357\265\217\231\301\226\225\250\370\275\214\236\226\223\310\350\300\372\351\312\310\213\315\311\361\242\333\264\371\320\365\266\200\244\255\216\242\247\306\302\326\226\234\266\260\250\361\374\240\304\253\236\272\345\213\272\253\201\360\264\203\352\371\340\343\374\336\333\332\357\241\243\250\351\301\300\304\222\264\256\240\235\273\234\247\310\351\227\206\222\266\376\372\317\236\272\255\264\216\376\306\366\272\340\261\261\376\230\330\305\334\257\264\212\320\304\315\366\267\257\300\272\275\206\226\220\355\342\373\215\277\312\306\317\316\325\224\367\243\275\212\233\220\215\325\222\246\356\214\202\252\345\302\376\346\306\232\324\234\257\224\222\214\222\340\365\334\322\321\253\302\273\214\326\332\232\303\366\370\203\260\243\255\221\251\226\376\304\215\212\320\232\331\235\365\301\306\211\352\233\302\206\222\335\302\256\370\377\217\354\224\226\210\377\240\256\247\303\270\260\220\242\265\263\256\372\341\274\232\232\330\207\361\230\371\334\221\203\344\330\362\221\372\342\310\345\335\304\351\370\271\201\274\216\312\272\255\317\273\360\324\370\204\251\250\334\203\377\372\217\325\257\244\314\216\331\360\230\201\204\214\302\350\220\366\366\366\262\315\252\252\336\303\242\330\246\253\330\220\336\330\231\207\345\267\330\250\316\311\352\334") -TOPIC_TEXT( -"\353\344\221\341\243\271\243\300\270\321\350\266\206\211\377\371\213\251\260\256\206\225\207\370\337\331\263\237\361\211\360\252\274\372\246\303\373\365\362\363\373\234\241\237\214\365\245\324\253\361\305\300\300\214\253\360\220\227\231\227\256\311\343\212\304\261\270\265\231\274\376\256\362\364\343\270\357\346\323\373\217\217\301\363\236\273\332\234\227\217\350\257\337\270\307\200\310\232\341\203\236\232\344\263\335\363\253\374\210\237\246\314\215\222\360\262\351\214\314\315\266\231\305\274\257\366\263\225\207\347\316\304\245\272\352\324\336\316\304\256\325\320\307\307\254\315\303\222\314\203\342\245\364\345\350\334\314\274\236\337\375\230\275\341\372\205\262\250\367\337\211\323\236\353\211\364\315\232\373\267\254\315\250\335\245\212\216\330\265\312\340\336\256\370\323\314\243\231\321\313\215\264\226\233\274\200\345\321\320\244\267\264\315\226\320\322\214\205\373\272\204\304\263\254\330\223\273\233\303\311\344\202\375\237\305\340\321\202\253\254\345\343\274\254\372\341\253\342\337\264\265\253\365\244\255\204\222\344\347\274\223\301\245\204\236\245\210\306\201\321\334\243\316\320\342\223\310\300\377\236\331\370\330\316\332\215\217\335\305\365\357\261\355\356\274\376\243\325\304\314\207\346\230\317\240\226\340\200\364\245\300\361\304\212\224\327\234\272\322\203\227\312\332\224\305\364\244\242\313\235\276\250\212\361\365\330\341\357\377\361\370\324\273\324\333\331\226\230\356\276\316\267\307\325\301\374\205\236\307\323\203\326\270\212\252\240\233\370\331\201\332\274\266\374\261\207\306\236\332\236\263\255\243\216\221\370\270\231\303\303\375\211\261\265\233\222\324\233\337\261") -TOPIC_TEXT( -"\254\253\216\270\317\216\227\202\374\233\305\211\306\306\343\360\274\347\266\306\354\326\315\236\367\310\314\311\361\366\206\265\202\261\356\247\217\231\200\235\227\371\200\275\212\256\306\362\333\313\225\372\236\334\267\255\233\305\334\225\302\365\300\277\200\351\377\261\327\350\357\331\237\363\257\345\316\202\275\373\325\367\270\277\256\236\227\325\314\245\330\350\256\276\333\354\257\307\323\237\273\350\221\222\265\331\372\377\312\264\264\340\325\342\300\353\321\345\342\370\234\313\242\273\317\335\320\233\361\204\256\357\365\375\311\356\212\214\344\310\376\221\270\331\360\230\367\236\370\354\366\355\216\374\236\331\321\205\321\261\344\352\321\225\335\247\313\322\303\237\312\306\233\222\241\313\272\337\363\352\306\276\237\227\267\265\316\240\364\247\265\246\230\247\333\302\272\330\253\207\302\310\305\200\322\254\213\216\245\244\250\272\206\230\253\243\312\244\305\305\375\312\246\225\370\354\261\270\275\256\236\333\301\314\212\226\342\261\366\355\350\352\267\302\315\361\361\336\334\335\254\273\233\352\335\354\217\251\304\350\230\251\300\306\373\213\352\376\212\233\321\235\363\311\217\202\314\365\233\260\265\272\355\363\370\232\266\226\317\236\304\275\365\247\270\315\317\230\333\220\360\210\264\315\303\263\276\254\235\273\344\234\342\324\213\343\261\243\207\334\216\262\300\317\237\270\345\246\330\341\230\273\250\266\322\216\317\341\325\231\255\221\256\223\311\211\327\306\330\260\250\227\316\210\356\264\317\226\302\222\223\231\266\361\347\350\274\210\243\345\200\331\371\376\371\366\374\225\250\263\217\261\303\346\252\334\223\274\370\313\224\217\325\303\210\331\231\366\335\235") -TOPIC_TEXT( -"\371\257\272\353\315\232\320\224\243\336\260\221\233\365\310\276\335\223\267\313\207\216\266\344\362\253\335\265\374\261\220\314\302\342\221\316\304\225\375\213\326\373\204\374\253\334\211\252\356\357\317\273\336\322\334\360\273\334\210\316\274\316\364\240\340\260\264\306\241\246\302\230\246\224\371\252\321\261\266\314\332\216\362\332\212\342\202\363\315\266\223\220\243\356\363\276\364\246\304\344\323\241\205\344\273\371\367\376\362\240\224\305\364\263\310\243\264\262\250\257\230\311\311\343\325\351\303\250\252\303\361\243\361\252\374\216\361\355\370\370\314\272\222\200\306\270\257\341\270\355\370\211\367\271\253\356\356\250\303\214\324\304\200\323\200\255\360\253\220\377\251\275\330\321\335\230\371\215\315\315\270\256\226\317\355\373\365\226\255\354\257\310\306\233\207\262\263\253\252\253\312\216\274\225\201\357\345\365\227\234\333\320\261\304\353\353\301\310\201\336\275\264\223\222\220\376\224\254\310\240\251\262\277\274\354\366\211\357\346\256\371\371\355\371\230\324\310\310\204\272\330\367\274\320\363\261\236\277\221\222\212\322\315\213\210\236\343\213\357\274\277\343\341\261\267\370\357\240\377\244\235\241\265\347\366\245\244\235\206\324\374\347\245\366\222\325\227\206\374\326\375\344\365\252\204\204\357\201\307\376\314\260\342\212\343\243\321\302\323\307\357\215\225\356\276\265\337\363\276\245\207\252\206\370\216\304\212\253\252\233\335\307\243\236\361\230\220\265\226\215\270\336\375\265\233\354\244\243\216\306\342\327\352\257\332\343\361\307\323\266\350\213\236\337\255\357\210\265\336\357\254\263\363\274\357\375\307\376\327\233\266\346\313\253\374\225\253\212\305\265") -TOPIC_TEXT( -"\313\227\376\310\233\314\240\207\236\227\214\244\363\256\356\272\203\375\244\244\243\261\302\351\305\225\317\231\342\264\343\261\304\234\237\254\343\342\261\330\236\323\301\230\243\333\202\337\360\221\263\201\252\221\273\221\256\341\303\275\222\234\210\277\371\362\207\230\306\325\234\221\223\364\221\245\260\303\363\274\352\255\244\222\254\356\225\245\317\257\323\263\242\260\350\236\221\315\314\202\214\300\346\256\264\352\362\260\226\240\236\253\366\261\234\370\361\350\224\207\317\276\240\240\227\345\257\241\231\325\222\205\237\232\260\253\370\354\347\305\305\235\325\332\262\244\201\366\374\347\217\350\266\304\245\235\202\344\240\234\354\305\224\340\366\257\365\216\307\333\212\214\242\335\247\227\274\226\251\233\341\246\266\343\372\211\366\252\212\245\214\300\214\301\370\250\350\331\201\257\364\271\261\323\216\265\337\245\357\377\302\330\241\206\344\253\330\371\366\372\350\275\337\334\375\303\210\277\205\302\305\373\362\363\374\360\344\214\302\222\271\311\356\316\316\233\301\320\261\310\267\226\315\233\350\220\300\263\207\342\316\307\322\232\273\212\307\247\303\312\317\236\223\303\200\206\374\342\275\371\323\344\254\265\354\305\316\235\333\272\311\333\333\241\350\262\200\272\266\350\246\370\322\243\255\303\260\207\241\350\367\274\376\233\251\374\235\200\263\343\267\262\271\354\352\230\357\330\343\343\226\343\242\220\214\372\305\247\351\345\262\273\340\356\253\231\320\327\346\206\374\313\365\312\372\275\355\256\307\253\375\363\227\311\216\242\252\232\242\213\364\241\343\260\323\260\377\203\322\227\311\224\331\305\343\252\206\377\331\341\352\370\254\323\331\261\342\331\301\240") -TOPIC_TEXT( -"\330\364\270\330\267\342\203\264\340\361\241\345\367\303\336\274\351\200\271\306\324\227\247\324\355\356\353\337\251\372\367\212\314\231\226\240\357\263\354\342\325\232\277\224\200\322\343\316\324\370\347\304\343\236\367\377\306\346\276\367\303\332\267\250\227\300\361\247\237\313\203\354\270\270\325\340\361\334\365\301\343\274\343\277\221\370\306\235\332\257\355\263\211\251\253\376\371\335\375\351\267\263\263\315\300\362\336\214\346\251\275\343\350\375\375\302\375\246\343\244\314\254\232\311\356\206\206\211\316\362\245\316\253\231\240\310\250\310\335\246\201\352\304\355\244\361\341\230\252\307\221\206\323\223\254\305\362\205\304\331\236\317\377\230\346\307\321\205\261\213\312\343\225\225\217\277\272\337\211\305\271\360\354\250\360\346\277\346\334\344\272\274\205\224\224\255\362\357\247\237\374\314\374\253\273\364\335\234\210\217\254\313\320\352\340\232\334\373\304\367\354\320\305\353\247\254\231\253\252\255\251\353\343\270\340\326\346\250\366\274\213\335\200\252\300\243\242\246\215\311\372\305\216\362\237\367\326\226\216\354\302\216\307\342\235\301\365\301\272\243\242\210\242\230\366\361\211\371\222\321\262\202\225\277\302\264\375\325\227\315\324\225\325\271\252\303\336\264\321\366\374\317\335\256\337\365\275\263\273\371\376\362\326\367\362\377\236\274\222\323\317\256\337\270\260\260\346\374\274\274\237\264\217\302\360\270\275\332\230\304\373\314\352\341\333\332\277\233\256\230\235\373\314\373\237\367\306\327\320\347\261\241\246\266\276\243\250\215\320\364\231\343\320\354\264\251\376\314\210\246\373\210\206\255\364\223\305\220\230\214\366\240\324\331\314\230\347\334\367\315") -TOPIC_TEXT( -"\216\206\302\271\215\365\327\342\201\244\315\273\202\331\245\207\257\253\202\351\363\350\214\223\321\346\245\256\353\232\357\272\366\326\334\236\335\231\200\273\211\341\227\261\307\300\356\261\204\230\220\314\323\344\361\326\343\337\266\246\246\310\313\235\223\325\220\274\256\255\255\225\200\323\222\202\275\264\277\306\366\215\252\372\251\344\346\314\253\341\311\303\343\265\337\256\371\273\315\246\365\300\345\262\300\305\241\242\261\216\312\335\214\252\277\207\312\206\241\234\200\253\310\326\320\351\233\272\372\343\371\362\322\302\241\365\265\334\307\350\201\210\227\273\377\217\332\370\254\265\313\240\345\210\276\206\242\356\324\352\256\275\344\366\247\355\271\274\256\251\323\263\357\353\337\324\202\202\363\307\243\303\357\316\316\301\226\345\233\221\344\320\232\217\227\364\337\274\366\371\322\345\314\345\205\326\305\307\233\375\217\227\204\342\244\305\334\323\210\373\317\334\237\342\257\342\321\241\310\322\232\230\244\361\372\330\376\243\335\265\306\357\265\364\261\213\256\204\331\272\355\264\364\272\366\304\272\243\306\243\267\362\366\376\346\236\277\356\351\231\236\356\213\370\360\333\371\300\271\216\244\372\262\345\354\270\206\265\240\276\327\331\260\354\317\324\323\230\330\207\377\260\311\203\277\210\264\314\200\263\347\263\367\332\266\233\345\244\313\213\215\243\257\363\203\224\242\245\244\361\256\270\252\223\227\200\252\224\352\323\207\234\205\336\365\251\325\315\367\254\263\355\245\210\271\304\202\263\216\246\305\256\236\201\226\343\341\261\276\306\375\343\345\244\361\336\332\265\231\232\366\274\246\273\334\367\370\307\253\326\230\256\216\251\343\353\244\200\200\330") -TOPIC_TEXT( -"\214\215\262\211\314\222\356\327\373\203\376\262\225\360\303\275\274\267\325\246\321\367\360\257\266\374\340\224\221\277\273\211\310\226\257\214\371\304\335\277\374\223\215\216\320\260\362\365\234\215\216\265\252\252\262\202\377\266\345\326\323\303\325\351\226\352\351\336\237\337\340\310\214\373\210\334\327\333\215\225\276\227\215\200\250\336\213\333\375\377\207\302\277\340\366\377\370\234\343\261\230\226\310\254\246\310\315\300\332\264\341\230\262\224\225\237\274\226\350\344\267\255\377\252\233\230\330\251\202\326\323\214\326\227\340\373\255\233\236\267\355\335\265\233\301\252\374\342\211\252\250\343\271\250\327\357\225\376\232\230\361\243\351\273\217\233\353\332\273\205\320\271\231\364\242\356\345\203\246\306\324\256\237\373\315\363\273\223\341\335\362\206\307\371\236\345\211\341\361\376\323\201\367\260\312\226\257\366\344\354\311\370\314\365\326\343\212\230\241\315\371\245\370\361\226\264\324\241\223\217\345\356\225\275\216\241\335\224\304\215\207\335\336\244\370\366\363\317\277\317\361\217\256\304\227\316\245\312\222\314\253\234\301\312\360\252\257\226\206\210\217\346\236\270\234\306\370\313\265\242\226\377\303\264\316\324\227\343\245\300\351\377\225\253\340\303\340\342\270\335\357\374\242\266\343\372\317\317\235\241\361\210\204\203\257\205\374\212\230\311\317\361\343\300\230\200\357\331\314\232\261\241\225\346\236\371\303\343\377\212\246\351\215\265\270\340\351\261\343\311\373\366\342\361\323\221\243\245\366\343\212\217\361\347\275\331\272\213\307\362\363\352\241\215\304\373\231\365\343\321\273\271\233\377\263\365\371\323\267\320\323\320\226\322\330\204\256\253\232\310") -TOPIC_TEXT( -"\211\257\210\247\332\327\264\316\301\231\373\203\261\327\365\301\311\275\353\235\215\267\333\302\202\307\210\352\202\257\357\370\374\247\307\252\212\244\373\313\254\245\217\242\273\340\246\311\374\376\343\336\237\330\245\311\310\262\355\274\340\331\242\335\244\253\221\263\315\325\235\363\366\225\357\354\377\300\207\341\344\324\267\370\220\235\347\310\311\252\351\364\342\213\300\330\264\307\243\264\240\300\231\252\220\335\261\216\317\207\300\226\367\320\274\247\273\255\232\323\231\306\335\263\344\363\277\217\215\232\235\221\302\243\246\324\340\255\302\210\363\312\323\255\214\364\352\202\372\262\213\207\347\265\313\351\363\245\226\225\364\376\243\262\347\262\213\266\225\241\202\300\353\310\311\361\320\376\374\366\275\357\376\354\344\373\265\313\301\327\350\235\300\354\211\250\313\352\254\206\353\242\274\240\234\313\274\334\212\377\337\322\317\221\205\354\302\274\227\327\224\311\270\216\271\204\271\363\340\340\354\335\307\323\212\244\334\355\346\325\257\256\260\254\344\352\274\343\331\265\215\206\254\330\276\345\313\325\252\305\271\217\336\326\257\234\304\367\203\230\215\252\226\263\307\341\241\260\225\261\354\355\277\334\214\241\227\247\206\336\343\200\246\320\374\347\313\313\300\316\350\264\250\203\336\260\270\261\203\356\200\215\261\261\310\226\275\312\364\354\325\300\273\256\305\347\233\325\316\332\204\315\314\200\335\314\235\365\274\355\310\310\263\260\262\261\370\356\237\204\264\226\274\322\252\224\273\231\263\307\314\270\263\372\227\271\347\275\270\222\274\224\356\201\204\377\364\237\341\253\325\323\344\274\301\257\355\363\266\203\234\323\212\257\377\251\226\352\306\276") -TOPIC_TEXT( -"\270\210\371\245\255\317\237\314\330\203\303\271\271\254\340\343\307\277\337\274\215\271\241\225\237\372\346\217\362\346\256\251\262\220\223\327\204\241\221\342\336\214\222\310\270\357\370\322\376\333\324\244\306\264\210\337\273\307\243\234\222\224\306\255\340\222\270\224\236\233\336\264\307\207\357\276\311\367\255\275\336\373\252\315\221\373\324\213\307\375\306\371\336\327\336\373\255\357\357\253\337\253\203\323\310\365\327\232\337\214\326\376\365\244\341\372\277\301\206\316\375\370\263\300\216\337\221\222\305\330\323\364\333\303\237\340\253\360\211\330\276\222\267\313\327\337\320\277\343\313\322\260\213\266\277\230\201\340\372\303\366\211\374\262\263\214\247\245\372\363\267\310\311\325\325\247\212\217\226\226\240\323\347\330\212\252\235\304\370\250\204\360\330\223\226\237\223\346\325\225\225\342\214\252\306\355\212\313\341\325\332\241\274\200\257\322\242\221\330\360\337\227\363\300\312\256\302\231\323\251\257\253\253\245\265\231\360\223\227\307\371\364\225\340\223\353\252\307\323\304\333\323\364\372\355\221\370\371\221\211\253\201\250\342\365\260\242\335\242\254\305\261\363\273\201\213\236\230\200\314\227\274\205\274\265\264\250\226\303\320\231\311\204\235\240\320\343\313\312\202\262\245\351\347\367\367\312\217\377\204\250\256\330\371\370\272\200\233\214\207\266\310\274\313\360\206\371\211\236\365\201\301\200\207\317\263\272\275\354\261\213\317\211\346\202\246\361\236\274\321\347\317\272\332\354\352\332\260\360\306\225\234\350\250\244\236\243\205\333\224\373\235\275\363\307\266\202\375\270\371\230\320\324\234\257\204\370\310\373\270\240\303\263\303\205\315\207\262\202\337") -TOPIC_TEXT( -"\245\266\362\262\225\241\350\262\230\375\202\244\356\220\225\227\240\332\232\350\300\266\352\225\360\340\362\343\335\225\374\375\374\363\375\317\371\360\257\217\347\240\300\360\334\372\324\225\210\350\347\353\201\301\352\367\217\316\203\232\235\213\356\210\353\246\230\336\261\365\367\323\227\315\370\365\256\213\333\263\340\331\245\305\236\306\215\373\261\203\275\262\307\326\312\265\354\267\315\320\303\251\321\263\250\342\363\254\347\256\276\242\272\271\213\310\213\352\212\274\265\345\357\316\207\336\350\233\356\277\246\275\332\336\277\302\333\203\216\364\216\246\272\354\264\314\374\203\305\312\335\273\243\370\376\264\203\341\337\272\211\362\337\220\210\325\215\206\272\207\264\240\265\255\203\247\257\365\372\361\375\300\325\365\303\207\242\273\252\257\215\201\214\265\276\265\351\326\202\271\225\300\252\214\214\321\205\240\250\277\273\325\365\235\304\313\344\335\345\261\274\212\307\337\274\353\214\275\367\214\250\305\212\370\265\217\211\327\214\213\220\361\215\307\304\245\334\261\340\202\267\311\350\370\270\247\244\345\250\346\234\253\242\261\246\257\220\225\315\331\202\304\343\307\273\312\325\261\365\327\277\374\267\373\355\267\261\314\367\341\312\373\354\221\217\235\355\217\341\217\235\255\276\350\371\206\253\343\325\223\365\202\301\330\300\225\302\262\232\322\272\350\376\341\364\212\306\326\335\366\220\230\255\217\340\230\306\270\212\366\241\317\237\210\233\306\260\374\262\345\241\217\351\361\357\202\273\245\241\326\264\307\341\252\306\242\231\274\366\221\225\327\230\315\270\356\211\375\252\341\342\252\220\377\310\262\234\271\261\214\356\236\335\255\211\307\331\351\277\244") -TOPIC_TEXT( -"\367\341\275\330\267\215\207\345\327\373\312\367\207\227\203\205\262\325\215\302\334\251\250\250\277\362\257\250\210\311\354\244\270\204\347\205\266\254\204\346\254\340\252\375\301\333\243\246\200\216\224\326\300\255\370\276\324\224\303\323\317\256\231\305\261\210\320\332\325\224\373\327\374\252\304\202\310\236\237\373\355\336\244\260\334\334\277\275\212\231\270\274\360\354\220\340\235\320\305\356\305\202\256\276\253\312\257\216\342\301\341\231\341\301\234\340\305\265\205\240\223\234\304\244\364\365\375\354\204\334\215\242\325\331\262\371\223\330\227\324\345\310\256\341\301\360\277\307\320\305\230\351\266\217\336\375\300\226\212\215\225\216\217\217\203\343\256\312\300\217\201\273\350\341\253\324\224\204\362\236\227\234\252\312\331\361\304\231\325\307\300\372\257\312\342\325\306\205\345\267\241\202\262\253\271\224\277\241\375\354\340\353\351\222\223\345\252\216\244\325\201\246\226\325\316\301\256\262\370\304\335\361\317\261\317\214\233\252\254\326\305\216\363\203\376\310\323\323\341\214\364\222\203\231\311\250\355\342\204\275\345\236\307\201\206\377\265\272\351\253\346\212\314\264\321\342\264\305\336\212\261\337\324\360\343\325\373\333\371\323\210\241\341\264\204\211\262\304\256\212\316\324\227\324\233\366\206\323\327\232\235\220\261\353\213\243\251\226\316\271\272\357\274\243\340\230\352\342\240\302\337\264\241\332\330\225\373\251\221\210\275\350\227\234\267\326\243\245\325\204\243\205\303\262\320\323\341\270\331\303\212\245\344\205\316\226\230\240\216\213\301\273\376\276\225\370\354\247\370\323\215\323\317\375\337\377\337\333\350\277\375\304\356\267\302\254\373\352\326\226") -TOPIC_TEXT( -"\334\274\367\343\261\375\247\325\250\203\365\272\235\252\227\256\327\374\377\306\216\307\224\321\312\277\276\256\337\363\263\356\266\225\204\324\240\240\241\205\241\203\326\350\325\221\273\236\235\332\330\223\302\357\242\263\214\250\330\335\335\375\375\244\345\254\322\304\242\311\242\334\205\235\224\273\315\216\201\311\350\302\214\271\255\216\326\265\231\274\256\366\324\300\304\225\334\303\246\261\317\273\370\376\245\367\373\223\332\237\224\240\262\341\221\365\344\243\257\321\323\227\267\263\320\263\314\276\252\311\323\250\323\245\366\355\256\203\234\316\220\211\231\256\216\233\211\201\333\330\241\345\205\323\236\313\230\372\344\212\362\265\204\342\200\326\345\320\211\240\342\201\264\200\350\315\263\306\314\257\367\232\271\365\222\367\333\344\302\203\255\273\332\243\330\206\344\303\263\346\233\211\367\201\323\200\352\323\317\316\314\322\224\203\337\374\273\227\317\251\302\220\332\324\227\213\276\335\212\217\220\305\216\341\236\314\342\272\357\365\366\266\310\226\227\226\266\266\335\301\346\223\341\330\204\370\214\247\241\206\347\347\206\256\316\336\247\245\316\345\351\302\373\267\360\300\362\313\303\255\343\301\331\343\326\316\346\340\266\275\372\240\263\327\241\231\222\251\276\303\254\230\351\366\262\315\351\343\344\224\320\306\367\330\350\250\211\307\360\344\355\226\212\225\324\355\266\336\267\347\255\361\212\366\356\365\267\272\243\246\215\204\247\223\353\332\245\273\363\243\221\337\321\375\267\240\376\330\311\330\276\305\357\205\344\362\363\363\220\234\350\273\277\333\264\335\324\274\305\322\256\242\365\336\267\272\201\373\324\315\262\316\207\200\377\306\251\261\202\263") -TOPIC_TEXT( -"\333\365\237\311\276\243\272\271\213\315\321\221\345\350\303\337\215\223\337\220\277\314\333\234\327\262\244\260\314\233\272\251\252\352\332\230\354\357\327\352\263\230\316\331\335\210\257\254\371\256\367\316\331\242\330\265\227\300\335\272\350\211\203\215\307\341\241\335\263\264\300\301\255\366\267\234\351\210\245\264\356\346\255\250\253\254\214\315\231\326\371\235\314\347\206\225\311\311\262\311\260\256\325\312\334\242\277\346\337\374\311\210\306\211\220\301\231\211\362\233\220\236\267\243\335\266\267\376\261\260\335\325\361\273\212\307\256\232\322\347\365\323\226\342\361\361\223\341\303\276\322\212\350\266\271\317\224\323\325\363\351\233\253\261\360\330\344\361\357\317\203\321\256\262\253\250\236\331\310\323\373\217\236\232\225\302\337\370\304\327\221\333\375\263\323\271\302\275\253\326\244\372\312\261\272\255\324\275\352\222\375\321\363\305\355\263\252\253\326\316\261\213\341\224\252\351\227\233\222\303\343\267\240\343\270\256\242\226\310\206\225\302\216\245\220\256\374\205\223\311\246\315\213\216\376\311\214\240\305\274\240\307\202\213\343\257\330\261\212\261\271\227\226\305\265\240\254\374\244\270\313\214\376\367\370\365\304\321\222\272\333\332\213\221\213\253\271\325\343\342\370\334\260\332\331\275\373\375\255\343\205\277\355\270\351\364\313\212\352\360\334\344\261\277\224\302\227\375\354\212\232\326\276\376\361\275\337\245\342\223\220\315\325\224\343\230\211\270\266\264\316\213\363\357\261\335\355\260\324\211\345\362\316\230\361\340\276\327\342\251\215\367\271\212\221\210\225\200\333\346\235\273\266\251\371\323\222\260\212\304\373\242\252\214\306\205\212\230\266\332") -TOPIC_TEXT( -"\273\254\220\373\272\277\315\272\272\332\302\270\212\261\223\247\335\235\364\273\213\350\213\254\213\312\211\200\337\211\311\352\230\371\304\334\217\306\251\232\215\342\257\262\305\262\302\214\210\235\357\233\212\257\205\314\236\204\332\334\274\222\222\310\225\341\217\301\301\321\221\241\321\227\221\373\220\234\326\215\224\301\361\307\275\227\310\226\274\322\373\261\304\321\267\243\301\311\347\321\277\314\332\301\343\324\334\232\241\343\247\224\260\344\371\361\253\273\212\252\376\364\206\237\253\231\270\306\265\305\242\336\267\365\327\312\331\365\356\341\344\370\205\371\356\264\201\275\275\267\264\340\356\354\264\355\365\334\361\363\276\271\255\215\261\326\263\266\232\276\244\367\237\255\313\325\224\266\361\325\244\376\341\204\223\365\204\211\335\244\232\233\204\253\201\271\321\333\213\256\300\342\347\346\336\225\330\237\313\227\230\257\247\247\343\223\301\277\365\350\232\311\225\311\324\340\316\235\217\231\313\211\275\302\223\206\265\357\261\232\320\254\304\215\360\254\245\256\236\273\244\240\256\361\270\377\357\327\253\355\255\361\342\236\307\272\247\257\206\307\221\213\360\332\203\216\374\335\334\302\236\276\201\363\267\200\351\306\370\223\355\241\351\220\326\342\307\215\201\230\204\220\325\243\217\310\305\247\303\303\214\263\315\225\231\353\364\247\225\306\221\353\244\332\271\242\340\366\222\370\244\354\206\305\315\374\322\334\211\342\373\220\377\360\263\227\311\370\245\332\374\202\244\326\210\242\204\346\304\335\230\356\232\302\276\342\235\334\253\226\203\305\334\316\243\212\232\313\200\340\227\200\263\315\254\356\375\264\266\216\315\217\347\346\324\370\226\264\376\340") -TOPIC_TEXT( -"\341\214\320\374\265\201\260\273\230\300\235\250\201\331\320\372\245\223\355\220\355\372\235\377\304\356\274\324\224\343\200\232\242\370\220\341\234\336\250\263\246\264\267\266\201\271\271\344\267\362\210\254\362\214\356\262\350\362\374\351\330\302\335\327\301\306\200\340\310\274\304\274\246\274\324\254\352\222\353\316\327\342\206\221\250\226\225\370\315\200\321\245\240\317\354\307\212\336\324\227\300\221\212\261\230\274\366\224\354\317\213\325\316\245\332\204\365\267\216\303\303\304\342\230\204\306\227\342\234\214\316\223\231\312\344\215\353\360\237\222\272\207\255\270\334\363\362\241\232\326\365\335\226\315\201\233\342\305\362\203\217\237\321\257\266\263\265\253\244\211\376\241\236\243\272\330\237\200\203\272\325\370\221\372\272\327\355\373\237\217\221\327\272\370\304\354\363\254\335\360\300\265\276\244\300\370\233\323\346\312\236\336\331\334\377\242\326\271\230\365\214\251\246\310\322\231\373\260\202\207\364\351\246\255\242\313\332\224\231\302\253\211\306\225\217\271\202\310\256\257\263\352\310\332\323\377\347\255\221\246\316\370\353\301\234\214\244\343\345\325\307\363\206\223\324\300\342\254\357\370\322\267\321\257\210\326\320\265\226\254\306\271\212\370\215\356\354\307\234\343\356\221\205\311\207\245\241\301\312\351\351\251\201\231\235\237\214\262\307\334\344\314\366\331\310\237\222\302\343\271\327\326\273\243\205\315\210\232\252\364\315\376\330\243\246\246\363\203\307\353\377\365\337\337\342\376\373\355\364\250\201\340\231\261\231\255\363\243\367\257\202\225\376\343\334\302\236\270\225\365\343\334\267\331\221\234\252\353\357\213\342\232\361\332\216\373\315\231\377\351") -TOPIC_TEXT( -"\331\224\272\351\241\341\352\220\235\210\217\271\245\241\366\374\325\345\333\361\301\202\264\261\324\213\310\201\350\331\362\346\333\310\326\373\326\274\330\222\350\272\326\363\212\340\337\206\200\355\227\202\327\204\363\307\264\337\306\317\373\365\254\211\241\353\240\322\321\214\252\346\272\272\352\265\330\232\363\273\323\311\213\216\366\225\307\216\377\313\215\347\251\254\264\264\267\364\366\365\266\305\275\213\206\307\233\262\216\225\315\220\336\202\263\262\321\374\242\311\200\354\251\330\227\307\300\361\350\243\256\346\237\326\247\254\214\335\202\237\205\356\372\334\227\345\252\262\232\262\265\351\262\202\203\372\305\314\353\345\307\353\307\306\240\300\303\344\220\351\213\210\245\264\346\243\303\343\221\265\247\267\207\303\352\365\231\322\234\244\214\333\253\226\212\224\200\352\360\263\340\230\215\317\302\346\247\350\266\314\254\310\306\201\204\324\307\366\356\201\246\342\346\357\335\272\250\205\207\304\233\311\364\342\364\312\221\264\351\302\355\366\361\260\225\200\370\376\312\344\257\321\216\206\270\307\377\262\226\347\257\233\352\321\214\233\307\334\323\355\271\232\244\273\236\273\372\335\350\356\323\331\310\205\370\314\305\265\223\210\236\264\247\300\360\330\256\222\310\225\331\365\253\267\203\222\343\254\337\342\232\241\227\326\260\254\305\323\344\310\336\323\350\363\371\241\305\224\371\273\226\253\246\251\255\210\267\353\306\343\350\235\367\314\371\367\302\375\363\223\333\362\255\253\316\211\360\360\312\217\227\372\306\322\275\304\245\210\304\264\212\221\231\367\251\351\235\260\276\224\235\360\330\324\303\307\310\263\317\300\274\214\234\275\302\342\305\212\311\325") -TOPIC_TEXT( -"\246\350\357\310\234\277\244\345\303\312\354\343\310\275\261\244\352\365\317\207\307\252\360\334\303\236\300\227\273\236\367\372\336\354\372\366\313\211\235\327\216\307\372\221\213\341\314\276\357\243\216\367\313\367\374\314\302\330\334\270\312\316\306\337\200\247\273\251\373\365\232\221\214\237\334\315\324\363\362\326\224\266\225\214\336\202\317\307\300\226\331\350\221\230\246\225\221\253\263\300\311\222\302\277\356\352\377\215\252\356\360\207\307\376\361\354\253\360\303\320\277\260\230\363\301\307\226\201\300\325\340\216\224\226\254\241\247\274\221\264\310\367\307\253\304\337\232\241\367\202\250\300\321\332\220\300\211\246\232\246\345\205\231\320\213\315\326\341\243\247\223\315\234\367\326\250\212\215\276\230\332\333\342\247\212\263\347\321\350\323\267\200\303\307\340\212\377\213\322\305\223\210\320\225\222\262\326\320\240\240\340\331\210\260\240\333\353\273\274\277\277\371\376\362\354\325\346\377\240\242\270\356\344\204\233\205\324\236\233\316\213\312\312\303\304\310\200\332\231\367\354\254\266\366\340\225\314\300\226\202\241\341\267\236\262\236\304\323\305\331\321\274\276\334\306\201\211\231\306\242\205\366\251\200\271\235\343\324\204\352\257\317\341\321\250\363\353\350\262\352\360\266\355\331\274\251\340\250\223\240\214\317\360\236\213\202\212\271\314\357\355\376\272\237\227\247\350\216\355\370\364\330\322\265\320\345\276\316\227\333\314\346\216\365\220\257\321\265\346\307\361\274\372\341\351\300\330\275\265\346\336\340\271\236\270\317\233\266\216\373\325\213\334\264\371\247\257\352\235\247\316\235\354\370\262\357\364\323\366\266\214\227\304\352\330\206\217\205\204\234") -TOPIC_TEXT( -"\353\371\216\271\306\322\220\257\316\251\241\252\352\220\266\236\354\357\271\307\347\311\365\354\243\201\336\203\203\204\277\370\266\364\365\347\255\346\272\360\230\333\355\267\226\230\234\234\224\317\301\235\367\361\213\221\234\234\313\330\307\356\336\305\365\315\215\243\266\230\211\367\351\270\227\301\330\321\314\340\253\370\200\314\346\346\364\213\352\345\242\321\200\216\375\201\342\361\357\242\213\212\307\213\271\257\234\243\236\253\215\244\273\244\326\203\217\321\324\272\344\276\252\223\302\364\214\264\253\345\335\241\365\324\326\242\333\244\202\221\262\275\202\255\216\250\354\254\201\212\270\366\371\322\321\245\213\347\231\263\324\233\276\215\364\201\307\376\242\237\360\323\204\202\241\305\337\254\342\210\220\203\315\303\224\261\261\370\311\355\226\247\214\216\313\207\301\335\350\311\241\213\236\277\236\333\202\211\226\200\354\226\214\214\261\236\365\300\341\264\261\236\237\231\244\223\350\235\213\263\364\204\313\310\235\276\267\272\373\320\241\202\363\230\207\254\307\274\221\341\351\201\360\337\227\204\232\306\230\327\257\327\202\212\312\333\302\337\220\260\275\250\305\207\340\214\362\216\244\240\233\226\243\271\303\313\300\266\312\302\235\342\361\362\242\351\212\356\347\266\205\212\213\213\361\310\233\310\306\230\351\340\253\266\254\342\334\240\341\215\332\215\255\334\366\367\330\224\330\221\362\260\254\305\351\303\327\344\235\323\306\317\273\341\235\255\250\374\333\325\233\347\325\257\247\257\274\354\204\255\245\331\333\246\261\376\377\336\335\273\375\231\277\272\252\306\301\216\266\342\341\305\216\311\200\215\326\273\322\330\323\217\371\271\260\277\256\201\204\304") -TOPIC_TEXT( -"\342\342\332\201\304\356\212\214\347\264\376\363\373\306\365\333\363\300\304\357\221\317\201\362\227\217\376\234\277\320\370\335\225\346\343\275\247\302\205\347\346\250\316\276\347\250\251\261\316\373\315\265\351\202\321\307\312\233\253\221\204\234\361\234\245\343\205\300\314\335\213\214\326\203\307\273\321\377\256\277\277\377\230\245\353\321\265\307\340\351\373\254\323\213\217\264\274\314\323\362\313\343\252\226\300\360\366\370\260\377\346\315\305\263\212\240\317\330\362\355\361\341\317\376\336\257\262\267\374\272\377\352\203\225\257\377\366\267\317\277\376\365\257\277\333\376\357\363\374\267\377\347\317\273\374\277\353\374\335\377\325\364\372\257\377\273\210\327\273\240\217\374\344\277\377\203\372\237\326\374\272\354\373\360\377\374\356\344\355\257\376\273\344\265\336\337\377\362\265\327\336\373\201\303\273\253\360\201\207\213\335\277\356\275\356\326\232\250\371\220\274\360\352\307\363\360\213\370\342\377\241\371\355\214\252\317\355\316\332\271\230\256\273\341\212\351\304\330\355\236\220\260\336\264\211\210\247\355\307\255\351\356\347\315\344\250\361\220\314\374\345\330\212\373\353\367\306\272\333\333\247\247\241\247\237\277\372\210\301\327\206\225\217\231\202\325\275\221\376\212\260\244\213\217\271\313\203\314\251\246\217\242\223\317\301\236\274\266\343\203\276\236\335\216\314\215\362\246\305\215\235\361\374\206\366\305\261\237\317\336\277\213\353\324\267\322\334\374\205\367\323\273\332\333\305\361\270\351\222\211\215\215\223\306\334\275\256\364\217\312\200\300\315\200\340\340\260\340\350\230\310\214\350\265\325\277\342\312\202\233\260\225\360\230\224\310\314\313\212\224") -TOPIC_TEXT( -"\207\255\205\253\211\357\242\326\377\355\220\277\370\313\363\203\367\274\360\226\201\232\261\270\301\356\331\355\357\275\270\366\267\217\356\367\374\355\263\277\376\203\370\357\252\366\317\334\341\365\363\222\226\224\236\243\365\350\237\355\234\265\242\254\271\357\234\216\347\360\274\250\261\346\217\360\220\226\206\332\240\356\213\301\376\271\363\321\264\224\364\324\232\203\376\275\214\337\237\371\200\320\312\211\225\204\310\216\250\227\200\246\250\311\377\341\247\270\320\252\302\220\347\225\331\331\233\300\316\363\216\354\241\237\236\301\205\306\337\207\213\261\325\251\323\247\213\201\307\351\244\342\315\256\352\336\231\207\311\332\252\221\237\210\223\202\316\243\326\220\361\305\334\210\271\311\244\322\317\336\205\246\310\352\335\302\337\312\327\371\253\327\355\335\306\205\316\364\230\204\354\221\253\313\346\375\241\277\255\315\245\377\345\330\245\305\355\222\365\206\354\201\274\270\374\212\357\306\241\361\210\206\256\317\251\237\277\373\372\364\306\235\362\356\301\263\250\346\202\276\223\276\361\370\342\364\226\210\217\271\267\353\206\307\351\357\346\355\250\275\324\375\274\364\356\210\372\216\317\276\333\364\275\316\273\357\344\375\356\337\354\250\365\377\376\377\216\376\305\333\317\334\205\324\274\363\375\366\253\350\206\360\211\365\303\270\345\241\270\254\204\307\326\207\223\257\336\371\256\272\263\255\234\257\367\226\237\274\246\226\253\347\302\343\213\337\363\263\263\327\201\222\205\215\325\237\317\277\255\332\321\273\255\361\203\225\234\211\305\221\254\365\351\205\324\200\313\346\360\252\264\263\323\255\211\257\221\350\350\300\205\366\307\203\316\332\306\205\211\305") -TOPIC_TEXT( -"\326\301\321\376\274\271\213\360\322\212\264\275\373\366\264\306\305\244\275\220\344\226\341\262\271\374\344\277\235\341\306\325\201\234\235\220\241\301\364\203\311\265\307\360\240\226\323\217\367\225\272\276\214\346\232\277\321\201\326\367\267\307\307\337\277\220\257\343\230\331\261\323\360\226\310\247\244\222\326\203\225\311\267\273\332\360\205\223\363\325\243\225\342\234\207\344\222\244\237\316\314\370\314\355\200\340\236\214\372\304\262\202\341\215\251\354\221\247\274\244\357\350\326\357\273\356\221\217\231\220\326\315\374\354\200\264\311\372\237\331\371\310\334\341\242\213\354\351\373\234\274\314\214\204\375\351\360\207\247\306\260\306\232\221\313\324\306\214\312\335\354\366\224\222\275\341\215\252\223\361\243\227\236\266\247\272\343\311\265\247\267\307\216\203\356\243\310\270\206\261\352\261\327\222\250\357\203\252\201\203\353\373\241\307\220\243\343\205\223\225\234\224\370\205\325\233\362\351\220\330\343\375\376\210\321\245\222\207\230\247\235\206\310\335\240\331\345\325\265\335\257\236\335\366\300\313\272\352\201\221\330\252\276\260\371\312\302\235\364\264\201\214\353\351\321\247\313\217\377\374\321\326\207\307\200\347\275\373\213\351\222\353\261\364\345\335\366\323\301\322\376\231\366\361\311\375\241\340\333\374\233\233\307\222\360\311\252\275\266\365\360\376\237\375\210\251\304\233\232\205\233\253\210\332\217\211\277\200\276\211\263\353\226\242\217\332\356\304\376\304\264\240\263\345\244\275\247\225\326\243\210\206\334\250\350\240\320\312\271\206\267\305\360\335\341\271\253\367\230\240\274\205\335\306\231\365\256\337\363\221\241\246\371\303\366\353\221\370\214\324") -TOPIC_TEXT( -"\216\216\216\214\365\252\336\250\352\270\276\320\322\254\227\246\336\305\372\341\313\330\312\366\355\240\200\213\243\352\321\303\363\221\375\254\360\356\240\247\373\242\337\361\364\214\361\254\233\277\201\242\202\263\201\226\320\223\237\217\336\260\322\262\263\320\220\211\252\211\265\311\300\315\374\224\340\216\236\351\207\367\214\320\215\250\210\326\253\222\232\363\312\310\265\201\200\301\276\311\263\234\236\300\200\213\273\307\307\331\320\313\200\264\337\314\374\260\317\272\307\206\331\256\344\357\330\340\305\231\363\203\372\351\330\356\242\371\347\371\371\270\274\332\324\343\221\230\246\241\317\215\322\217\373\214\236\327\202\265\336\277\332\267\316\253\234\247\242\216\354\376\245\267\363\357\262\362\255\247\321\223\214\252\315\272\313\323\332\354\362\322\332\256\216\341\341\305\336\276\200\364\236\261\246\243\242\230\216\367\321\340\212\346\223\216\304\201\200\231\314\345\332\221\307\255\232\253\370\323\254\200\354\256\350\262\266\262\233\350\314\305\202\240\347\372\323\335\351\351\254\251\255\212\351\347\227\344\314\300\266\372\331\311\300\266\230\200\315\350\226\220\202\371\312\362\374\226\235\245\245\254\372\261\236\346\311\241\242\233\366\355\241\235\273\266\345\356\257\236\227\225\243\340\277\333\210\234\343\367\251\271\337\251\301\323\344\346\232\265\253\372\241\204\330\353\340\205\277\222\221\222\343\345\251\242\323\271\320\371\330\302\344\234\274\266\304\322\215\365\206\274\326\255\351\243\371\344\300\263\316\210\253\276\200\341\347\261\210\323\352\355\222\227\247\234\257\236\327\207\254\305\347\233\235\341\326\266\321\270\204\216\206\242\250\251\212\375\354\242") -TOPIC_TEXT( -"\350\257\212\260\354\322\323\317\343\375\247\347\366\215\246\236\247\233\216\243\275\310\336\323\261\377\253\332\360\345\252\302\264\245\224\257\301\231\330\230\261\362\300\273\372\203\347\343\325\202\250\352\302\275\342\361\254\250\276\311\276\305\207\375\260\350\245\217\203\247\345\211\305\357\252\367\234\321\343\263\210\366\264\324\202\354\353\252\327\330\301\241\247\222\242\344\263\241\202\336\373\234\365\223\263\260\230\224\202\314\376\350\307\277\270\342\364\276\332\231\323\310\230\306\333\200\261\252\326\326\223\360\330\375\201\232\352\323\214\214\317\237\316\270\316\272\202\254\233\237\266\304\313\275\240\263\275\275\255\210\344\242\360\204\332\206\321\301\345\275\374\342\255\332\321\210\367\216\352\213\307\375\332\306\373\337\242\204\333\207\333\351\275\210\242\340\211\225\206\335\352\217\232\247\232\207\310\201\346\222\274\342\263\314\364\301\242\250\201\216\330\210\315\263\343\332\304\326\200\250\230\210\267\371\301\266\345\362\342\370\260\334\217\335\331\336\252\355\217\266\372\363\207\341\371\331\241\271\364\220\277\273\224\205\373\216\347\325\266\247\245\304\277\273\315\360\331\343\223\251\332\360\266\344\301\261\214\335\246\362\210\246\240\223\344\331\334\330\241\310\231\253\211\356\351\335\357\302\335\327\355\226\302\232\251\340\254\370\351\360\242\217\201\225\205\215\273\365\257\230\277\264\342\327\357\316\254\304\214\261\325\367\350\250\270\221\241\312\343\257\300\276\336\350\376\214\254\366\356\332\215\212\265\312\272\234\366\372\365\242\204\314\243\342\316\221\276\324\201\202\366\302\276\375\261\215\317\250\266\243\250\212\365\254\247\364\360\307\366\323") -TOPIC_TEXT( -"\344\300\235\216\217\202\375\356\312\363\274\321\325\203\272\261\344\374\317\333\211\332\216\203\325\316\220\371\272\342\211\312\343\257\270\210\323\277\343\363\316\360\206\230\267\221\233\361\314\373\330\341\355\343\362\327\220\224\243\340\262\343\325\214\217\225\256\211\215\333\276\323\365\251\242\365\242\314\350\316\304\335\352\274\342\261\332\204\364\200\257\354\310\324\374\323\276\345\354\331\242\301\331\214\213\312\377\336\370\377\226\347\277\375\242\277\251\333\216\334\275\254\274\332\345\315\233\206\361\231\201\344\205\344\214\371\227\315\241\221\231\362\255\336\202\217\300\224\360\261\351\300\265\303\270\243\326\211\271\257\247\223\240\367\200\340\314\317\314\351\274\353\321\201\220\206\345\330\265\304\223\223\333\300\237\330\330\341\261\356\221\304\261\215\203\215\215\204\354\355\257\232\277\261\263\214\241\230\254\343\355\205\233\361\225\236\240\222\354\372\206\333\231\361\206\307\320\301\247\236\267\315\264\361\232\330\255\203\202\372\375\375\332\375\242\317\346\301\231\264\336\220\237\374\211\261\215\215\360\350\260\303\251\311\277\311\302\202\370\304\341\374\375\364\217\375\203\240\336\224\257\242\247\306\330\234\353\330\310\323\342\257\244\350\255\200\276\242\300\361\240\217\263\355\207\225\327\311\214\311\246\212\342\206\376\342\303\272\312\303\314\372\333\221\374\245\215\215\214\342\262\265\341\272\347\336\361\226\336\207\222\271\303\356\347\227\315\352\254\352\216\370\374\243\247\273\317\245\357\312\213\360\346\366\200\353\346\304\235\302\247\302\226\206\332\373\350\266\322\372\341\335\357\252\303\273\226\307\207\342\310\374\374\242\360\216\201\374\212\366") -TOPIC_TEXT( -"\347\211\273\345\203\300\354\305\363\253\365\325\240\311\366\301\225\250\312\227\343\310\302\314\351\255\225\261\261\206\277\250\324\355\330\255\315\245\207\212\314\261\363\314\252\321\373\335\263\201\344\254\266\271\370\245\216\367\360\234\210\231\270\221\220\266\375\215\325\261\362\352\215\364\326\306\212\310\251\255\335\363\241\311\206\261\312\267\242\321\255\221\315\353\213\244\242\242\256\203\214\317\325\335\227\244\362\235\275\275\267\300\311\325\375\215\375\221\207\217\244\267\333\302\272\213\301\252\202\224\313\225\275\236\315\274\201\326\351\342\323\343\233\320\347\220\303\275\260\354\324\305\215\347\273\213\302\351\271\355\366\326\310\250\274\270\350\236\241\220\310\202\260\310\336\205\257\256\253\234\276\234\244\265\243\367\361\355\261\373\300\323\362\352\245\370\261\357\370\314\237\251\206\221\331\236\220\236\263\270\313\333\201\357\362\253\317\227\247\317\315\216\331\341\227\322\312\301\313\304\345\215\353\337\313\242\255\262\360\370\374\340\266\315\276\200\263\203\277\270\242\326\370\333\354\367\261\260\274\364\317\201\347\316\306\322\373\337\230\315\217\265\256\263\373\275\325\320\364\300\246\275\213\361\301\202\271\271\200\335\374\340\260\303\222\360\256\202\356\230\271\205\241\316\310\220\245\352\226\224\204\303\202\351\241\261\302\227\316\243\232\334\267\206\307\341\317\366\343\230\242\226\323\262\314\212\312\220\240\331\331\230\333\244\253\243\327\363\372\271\210\361\230\230\357\315\304\350\342\300\312\377\357\202\303\252\311\353\260\216\356\263\322\363\224\253\206\305\233\306\274\200\352\237\215\245\205\337\242\306\221\322\214\247\352\212\360\345\211\253") -TOPIC_TEXT( -"\250\234\347\354\301\201\204\236\263\260\334\255\305\241\273\234\250\212\311\251\277\344\266\232\212\232\322\213\206\254\226\313\212\332\304\217\263\227\307\252\256\251\217\247\253\275\362\364\331\320\302\226\305\306\300\376\366\376\241\304\321\313\334\374\266\371\203\221\230\245\323\317\242\354\345\214\365\214\375\252\312\216\346\202\217\265\374\237\364\302\210\203\260\353\267\256\356\266\267\352\211\221\376\273\241\332\277\270\373\372\226\315\233\360\227\300\223\307\326\342\254\200\300\241\276\232\206\347\323\317\375\353\256\240\345\326\346\367\354\371\204\264\355\354\344\361\252\251\361\261\260\235\307\204\221\306\313\356\273\264\247\264\377\256\316\313\331\205\277\211\313\332\236\366\356\315\310\215\333\354\321\274\270\364\302\213\334\213\252\243\372\341\327\211\200\216\201\266\316\246\230\327\302\320\262\376\373\236\236\212\332\272\272\251\330\377\201\260\322\371\326\224\271\221\303\235\215\252\351\202\224\324\267\336\304\353\356\231\327\233\307\303\223\206\315\224\220\224\213\302\236\326\225\275\324\353\322\304\335\273\313\240\315\267\226\303\261\342\352\376\345\237\205\225\336\364\235\330\310\343\260\327\267\233\272\221\207\311\257\350\225\344\331\350\375\306\375\273\342\206\306\370\306\252\245\203\240\222\246\275\367\377\262\276\344\314\227\230\321\275\325\202\302\306\322\314\363\266\361\333\220\364\331\212\242\362\325\302\203\266\307\350\211\351\351\246\241\232\344\367\321\375\246\344\305\241\302\317\207\236\353\301\325\331\206\372\357\212\357\305\203\327\371\205\223\243\346\235\342\266\256\337\264\246\206\237\232\277\271\267\335\362\306\240\321\234\214\351\271\362") -TOPIC_TEXT( -"\367\240\242\342\276\372\317\247\377\325\234\262\210\340\274\261\246\330\204\343\221\262\227\266\226\351\202\352\357\341\333\324\331\331\320\341\250\370\214\360\250\330\307\237\247\336\237\320\245\230\233\220\232\336\254\253\206\225\266\214\210\255\355\251\266\226\206\321\330\222\357\321\200\253\301\264\363\200\333\322\207\253\362\235\307\320\324\276\314\303\271\210\342\250\314\275\260\273\357\313\340\362\334\375\364\304\253\210\202\327\316\330\334\350\310\377\350\350\201\317\255\276\260\212\257\322\326\324\377\250\254\377\344\331\374\364\344\234\222\205\340\304\213\303\214\224\341\260\231\325\325\332\202\211\301\245\256\342\217\274\354\205\230\323\243\247\250\212\342\210\203\277\242\345\220\340\206\276\204\351\260\214\306\243\311\323\367\212\311\211\341\265\335\223\225\314\235\253\327\257\316\276\366\363\307\263\277\376\303\343\374\235\377\373\340\332\337\354\303\336\376\326\240\376\366\376\247\304\336\373\200\313\200\256\202\351\257\206\224\372\331\262\345\234\210\215\215\360\377\301\361\300\271\273\276\273\325\367\360\247\325\351\354\346\203\256\312\250\267\207\272\304\233\350\361\250\237\226\341\342\217\273\275\243\203\322\212\232\211\312\353\255\365\320\355\271\264\272\307\250\220\250\354\362\344\211\334\340\214\262\305\370\224\247\342\226\241\346\230\253\330\216\270\337\315\217\227\365\353\361\335\301\364\320\226\227\224\215\360\211\255\256\230\214\221\307\302\224\302\254\271\324\304\215\236\320\301\336\275\250\357\313\312\213\217\205\222\223\212\302\233\246\242\262\203\216\256\200\217\336\370\221\322\232\340\260\332\236\231\346\212\274\353\307\262\227\356\231\303\366") -TOPIC_TEXT( -"\236\262\212\323\327\301\216\337\260\277\201\251\256\356\355\357\353\354\356\355\305\272\254\340\343\367\215\323\246\224\332\315\201\325\342\275\260\335\247\214\326\315\204\325\222\272\311\206\212\236\230\312\324\322\234\345\324\227\353\351\362\314\362\231\217\250\267\371\221\271\350\354\204\323\206\273\252\232\375\310\331\315\276\233\307\340\356\206\301\314\221\266\230\236\234\364\262\340\254\307\231\324\245\205\250\211\343\270\252\333\203\363\246\255\211\201\304\307\367\356\334\301\334\327\364\372\321\210\246\231\213\375\235\314\261\351\242\276\216\323\262\310\224\367\254\274\302\366\334\316\274\276\376\344\207\340\315\216\246\272\344\261\201\260\230\326\236\304\246\240\206\254\306\203\317\332\213\350\317\371\333\225\277\251\273\364\334\321\320\272\345\231\255\377\306\365\372\340\377\206\365\253\227\371\266\252\217\377\222\275\264\251\270\331\216\311\366\240\355\311\211\261\261\310\270\257\245\353\344\351\321\303\311\217\201\316\277\350\330\251\221\201\237\212\245\245\245\344\322\360\366\246\356\222\243\326\272\343\262\261\267\220\312\253\243\213\232\341\325\205\217\371\253\312\236\322\337\313\205\217\240\262\322\341\352\344\334\264\355\206\232\205\306\342\324\341\370\215\360\324\251\313\333\241\255\304\251\305\343\251\277\340\330\240\227\211\266\321\270\243\312\254\241\330\371\203\227\373\244\210\307\340\220\252\250\206\252\260\362\235\210\304\225\305\370\312\201\264\265\252\260\363\262\272\315\340\353\353\353\302\337\217\214\323\207\230\271\203\304\215\274\252\326\337\353\364\216\356\374\264\274\246\265\336\202\345\273\256\212\253\270\371\264\255\327\307\312\316\235\333") -TOPIC_TEXT( -"\360\257\330\316\236\333\331\332\274\347\203\340\306\374\237\370\205\334\356\302\216\304\263\300\233\335\331\221\241\256\325\334\245\350\301\365\342\205\305\347\260\212\302\323\247\316\203\375\251\250\202\244\270\302\210\326\320\357\206\343\331\212\343\220\244\256\321\330\370\371\201\317\221\313\365\212\336\330\362\357\256\335\341\334\202\316\316\273\350\372\325\226\353\241\364\243\354\312\364\204\244\374\321\326\307\252\324\251\262\306\304\324\241\307\261\332\305\325\221\253\353\344\314\343\346\262\303\247\240\371\327\376\375\210\221\303\224\220\327\231\210\321\265\263\307\326\352\314\373\300\255\314\350\206\373\362\350\245\331\243\261\343\357\323\360\230\372\344\351\362\301\370\325\240\331\263\270\224\200\253\341\261\236\201\247\312\255\376\266\212\325\356\334\210\361\322\230\256\371\234\314\342\265\320\276\325\241\251\321\302\246\366\367\314\353\322\342\246\352\262\366\242\336\203\273\241\365\343\343\253\310\375\217\230\320\333\340\240\317\227\336\273\363\210\211\251\341\206\246\255\356\370\232\317\237\277\363\201\215\307\347\317\236\235\235\235\377\225\215\232\343\230\360\222\376\272\370\342\202\252\213\366\360\255\300\313\214\242\262\326\201\237\352\356\375\266\274\316\212\240\204\232\205\301\337\361\247\333\321\260\277\373\366\324\356\334\363\210\307\324\366\362\223\217\223\263\205\217\275\232\240\327\350\370\254\345\230\273\367\306\305\270\302\275\341\314\323\314\210\202\264\256\340\316\252\232\343\311\216\373\226\220\214\274\273\224\347\261\371\352\350\336\225\326\250\306\226\351\271\247\330\370\314\222\274\214\375\216\232\322\216\307\342\224\223\267\324\323\354\343") -TOPIC_TEXT( -"\265\207\361\342\302\244\335\235\214\216\201\245\214\336\371\206\256\226\314\340\306\371\270\306\265\311\300\310\347\373\353\325\345\205\236\250\212\223\364\263\203\316\313\213\237\235\252\320\366\366\370\252\346\206\341\273\234\336\211\307\347\267\344\333\244\346\264\225\221\253\321\222\352\201\240\200\326\343\323\230\321\244\351\321\324\232\273\234\304\322\276\236\307\361\305\363\241\311\333\240\210\355\244\332\202\233\341\214\235\273\270\244\352\225\340\270\222\376\373\350\366\345\244\205\313\223\252\257\327\334\273\340\354\211\352\374\322\262\276\274\266\313\202\345\271\333\366\370\261\233\242\203\220\315\344\360\226\205\245\346\201\343\270\327\314\321\312\203\201\325\370\274\206\211\367\366\334\200\350\210\244\203\214\331\206\332\222\343\273\251\240\347\275\265\214\203\277\325\264\357\350\274\300\322\375\351\326\373\254\335\224\264\276\261\213\373\251\325\300\251\304\265\227\272\301\332\232\223\322\372\260\321\332\264\275\203\303\356\213\223\362\334\262\250\206\236\263\362\360\321\301\222\267\320\302\346\371\211\212\251\341\261\346\211\215\362\376\322\367\320\277\370\326\214\277\203\367\247\265\246\275\207\213\206\314\262\323\264\261\232\337\366\335\200\250\222\320\334\310\343\264\216\234\274\325\335\375\364\230\316\324\321\334\302\335\321\203\213\320\342\203\217\333\317\235\273\207\312\240\340\361\304\241\225\361\221\225\212\267\225\220\251\317\372\254\305\302\212\240\374\333\313\223\200\376\215\335\353\206\365\353\251\370\364\312\236\225\237\277\377\277\337\200\312\221\213\377\205\205\275\352\226\345\210\247\241\223\236\264\314\371\234\256\314\372\310\230\245\201\221") -TOPIC_TEXT( -"\257\260\240\356\330\203\317\265\260\233\227\207\215\330\310\317\270\354\341\341\373\344\370\360\315\263\337\343\261\241\270\346\345\315\236\367\372\373\221\265\220\375\320\265\274\266\224\327\274\334\322\366\363\326\277\237\306\323\304\264\276\360\346\326\354\337\234\264\332\335\340\372\351\304\251\301\306\306\332\234\266\217\304\374\352\270\200\266\307\366\202\225\316\363\311\362\234\261\203\306\220\253\307\261\360\370\347\334\373\354\236\324\331\243\225\314\363\312\333\263\346\342\276\344\311\304\346\302\233\253\215\372\336\246\355\200\214\320\374\225\254\371\235\231\313\203\351\226\225\222\253\315\222\243\263\211\250\361\252\202\222\340\377\375\354\206\376\360\317\264\356\250\306\321\320\224\210\237\244\235\330\210\201\256\266\356\251\335\222\267\357\363\252\305\373\264\307\330\321\354\220\321\375\335\340\243\310\302\307\262\303\240\375\314\244\352\346\257\316\246\373\300\330\220\360\302\351\320\355\361\223\215\331\223\226\245\261\221\264\273\266\263\377\225\222\317\336\255\256\265\206\333\356\211\222\304\250\316\305\334\354\324\256\261\274\306\240\300\211\325\202\335\255\240\250\245\252\211\377\262\352\274\274\320\271\355\210\233\214\254\224\374\220\266\205\226\335\273\331\276\250\275\374\261\324\313\322\207\223\233\231\316\342\317\351\336\302\325\223\214\356\205\321\324\264\334\227\233\212\256\346\200\217\371\223\326\260\205\207\232\344\247\317\346\323\313\326\350\246\200\306\324\275\234\334\366\227\206\315\264\217\310\212\252\306\225\234\346\265\254\371\313\212\251\311\355\322\377\322\322\313\244\337\321\211\222\304\366\264\203\303\321\204\261\354\213\226\263\303\344") -TOPIC_TEXT( -"\356\233\355\352\360\207\227\250\256\262\342\267\356\344\226\336\303\224\357\246\371\336\274\257\364\321\364\272\263\303\340\326\306\320\244\337\256\231\355\270\372\361\305\367\321\260\217\311\210\217\220\245\346\227\265\311\214\344\350\312\260\326\315\255\320\275\235\262\327\325\360\230\356\334\221\250\203\262\372\262\257\256\320\370\334\326\326\266\362\345\332\312\324\256\272\206\261\277\320\266\253\217\203\235\361\314\235\205\202\250\303\324\352\312\342\201\303\212\224\246\377\232\346\246\213\354\220\205\225\223\364\324\251\253\221\225\321\311\200\226\237\254\210\335\271\247\317\315\276\277\326\236\267\323\241\214\243\324\377\215\267\224\364\370\357\277\263\341\301\301\377\270\217\317\367\302\326\200\235\353\202\336\361\227\247\271\322\354\232\366\354\322\265\352\351\252\274\376\364\320\337\357\207\311\343\270\271\356\222\335\363\324\207\356\227\332\360\337\257\211\235\250\305\335\360\314\303\331\241\303\316\234\255\241\246\323\336\311\343\346\246\274\344\234\226\342\343\314\264\360\345\202\367\226\236\363\222\337\301\231\332\262\251\300\266\306\230\260\315\224\305\334\236\310\230\314\266\307\221\200\354\201\252\346\356\320\343\267\246\250\300\240\333\320\302\274\306\347\250\302\230\256\253\351\343\226\215\364\270\232\335\205\213\360\260\273\276\323\312\313\350\372\360\300\213\373\367\355\306\230\220\210\217\310\265\365\344\354\225\212\275\271\271\222\244\272\303\356\360\320\315\214\252\222\316\374\327\246\306\364\222\347\262\276\367\351\326\246\200\227\235\310\307\225\343\306\346\313\226\357\214\377\333\260\367\257\265\352\277\252\275\306\203\351\363\347\333\214\236\307") -TOPIC_TEXT( -"\221\322\341\232\365\333\367\341\230\246\255\345\215\331\266\365\233\231\367\316\242\264\206\322\330\332\204\252\252\342\323\265\315\202\203\306\235\267\347\355\252\350\256\326\361\335\225\346\232\237\260\233\261\314\201\251\311\201\202\343\340\247\225\334\215\305\327\343\244\342\261\371\304\235\365\353\364\307\343\261\212\324\210\214\216\205\217\325\313\310\211\303\257\236\203\340\357\364\343\317\275\240\354\303\342\252\230\374\313\257\264\200\275\320\206\330\233\352\342\314\343\264\210\331\251\375\312\271\307\303\221\253\276\212\355\314\265\327\256\322\352\224\221\314\326\274\246\364\251\350\264\345\326\325\340\240\331\214\260\204\217\271\372\260\370\200\237\273\212\301\276\361\327\211\307\333\266\355\220\203\236\353\226\247\322\314\326\263\256\260\227\210\225\304\247\200\352\251\375\373\367\310\262\336\222\200\321\231\221\263\230\245\314\334\242\302\344\212\220\221\313\357\217\330\356\357\275\271\366\377\336\230\251\264\242\376\326\355\274\275\203\336\327\351\330\221\303\350\323\230\341\362\203\250\270\365\377\341\217\320\310\330\255\341\263\247\265\235\344\364\340\232\217\307\325\337\277\220\365\374\252\311\202\276\360\225\245\361\204\236\227\207\333\261\302\373\207\272\217\353\361\323\260\214\332\230\304\363\370\356\350\217\246\231\304\333\204\362\240\262\361\262\275\364\350\345\311\267\331\250\342\341\305\275\372\203\363\222\371\340\320\270\235\244\314\303\272\201\271\305\375\325\276\222\201\231\232\345\311\354\301\311\272\354\301\272\305\374\203\312\262\261\307\323\317\216\337\322\327\203\257\372\263\343\227\373\375\311\360\367\365\365\237\256\302\223\247\274\265\333") -TOPIC_TEXT( -"\356\352\371\336\334\377\202\241\226\330\224\203\313\272\272\306\333\323\320\255\305\315\222\260\334\360\222\210\314\234\216\247\250\267\231\220\210\206\255\362\246\206\211\242\250\346\346\216\315\321\343\274\370\305\323\213\243\307\223\251\274\372\203\264\234\267\370\372\222\312\262\317\362\236\304\254\270\256\377\215\223\211\370\262\277\235\226\257\217\347\225\230\311\210\346\326\311\250\367\255\202\375\237\240\211\303\204\253\340\272\327\330\212\333\311\274\227\236\377\251\240\331\215\232\345\353\344\230\263\371\224\274\326\207\217\314\315\237\263\227\272\261\220\223\204\243\241\222\205\236\325\335\214\253\347\200\307\264\262\342\330\212\353\305\237\223\344\207\215\307\303\226\354\251\254\301\273\254\363\206\263\210\335\336\274\346\251\223\215\373\366\226\326\336\377\233\227\312\274\265\275\355\272\334\335\365\325\320\202\372\256\343\352\220\261\322\323\360\307\235\226\215\366\323\300\332\306\313\320\252\260\226\236\213\315\355\261\276\322\220\302\235\251\204\225\354\346\234\267\230\302\327\250\370\354\267\270\344\231\276\274\224\317\316\371\344\220\237\267\212\234\253\265\265\255\362\236\271\357\210\242\206\251\227\362\370\316\335\260\245\321\245\324\314\365\261\275\245\227\240\227\230\362\276\245\231\246\274\246\336\311\264\311\304\353\342\343\245\207\271\375\212\204\255\214\317\353\327\210\353\336\370\254\226\261\257\230\363\237\265\307\201\343\261\252\350\214\222\325\227\237\200\321\231\264\207\224\353\213\357\335\264\360\356\243\232\352\352\220\371\233\362\266\264\324\212\227\211\375\361\370\316\365\357\326\315\223\273\243\203\230\273\261\250\363\234\307\256\322\361") -TOPIC_TEXT( -"\221\231\370\267\205\211\302\344\335\223\236\301\253\341\232\262\231\375\320\220\256\200\214\277\373\373\336\333\274\274\356\266\225\213\200\260\355\234\310\370\352\374\376\310\233\325\365\201\307\242\201\233\202\230\310\304\326\263\366\371\323\216\355\352\221\323\231\373\347\351\276\256\356\201\272\222\213\351\204\244\253\343\347\200\342\310\374\340\306\257\243\352\276\301\205\250\266\213\366\306\216\352\313\327\372\356\277\317\223\361\263\303\356\247\251\337\337\256\231\273\322\356\356\251\341\347\206\244\235\362\320\311\210\331\200\330\321\355\245\314\262\261\316\247\341\240\302\320\267\235\303\207\343\243\267\222\354\303\324\322\336\235\360\233\304\223\224\210\325\237\225\357\333\247\366\367\370\311\323\343\262\272\252\211\244\225\206\206\352\253\225\346\354\344\257\260\263\275\225\226\365\240\367\344\362\262\223\370\265\261\205\356\312\332\251\267\371\274\355\336\367\252\236\366\241\232\233\244\235\354\203\222\235\305\214\325\230\315\251\363\234\227\271\252\252\260\300\251\275\370\207\266\255\361\362\303\335\215\345\320\327\325\225\203\222\257\352\265\267\310\270\343\361\321\347\303\312\375\373\343\206\223\254\251\240\223\330\262\234\251\205\365\376\232\351\237\343\312\312\230\212\301\240\330\345\260\352\244\267\313\222\257\222\263\262\224\226\360\360\232\301\241\227\367\225\314\205\334\353\350\266\274\222\350\255\302\210\333\300\353\223\324\346\250\276\333\303\354\262\257\376\205\217\243\274\274\336\267\352\372\216\205\237\210\200\275\341\313\331\365\327\261\272\321\261\305\360\200\371\222\214\236\243\367\224\331\210\325\302\262\272\324\372\261\216\320\223\214\273\247") -TOPIC_TEXT( -"\364\312\375\305\243\247\324\361\320\355\247\314\254\272\326\351\277\222\201\217\217\235\272\244\370\314\345\333\211\324\226\332\260\333\323\361\330\336\240\241\220\270\343\243\303\341\332\337\250\206\373\312\311\363\262\240\262\364\367\335\216\341\235\210\304\264\305\363\344\313\334\335\365\212\205\357\254\370\323\364\235\232\376\236\253\220\314\206\316\313\375\300\212\335\207\205\213\235\277\346\216\363\375\301\247\237\266\314\212\265\203\225\303\256\261\307\241\256\222\217\237\317\243\277\315\240\370\264\344\313\300\351\205\316\324\246\306\372\340\361\377\306\357\367\333\357\374\233\266\216\335\356\241\351\223\243\373\301\204\260\321\311\315\326\377\272\216\376\275\314\352\246\200\255\213\207\217\351\304\256\307\213\342\311\327\207\344\317\255\251\207\275\354\250\270\250\246\260\243\312\245\250\334\300\261\305\236\317\256\231\331\200\354\367\377\360\317\241\255\367\376\301\314\235\300\354\353\337\223\265\213\304\310\264\341\201\234\312\330\321\214\226\364\321\365\321\266\252\323\251\303\352\272\274\235\211\246\354\375\230\361\203\226\306\233\262\265\263\353\316\327\252\356\357\372\351\277\365\221\371\264\317\316\267\335\275\274\204\343\204\263\240\376\350\215\262\274\210\236\257\200\341\261\246\275\366\204\234\226\245\235\353\203\224\230\220\262\315\221\305\216\371\212\350\260\233\354\201\310\276\343\220\237\317\203\343\240\262\230\240\261\365\305\252\246\331\212\304\242\343\311\342\267\216\341\264\257\235\203\343\325\215\264\375\361\213\245\277\214\315\330\275\314\264\372\261\206\226\274\366\345\232\307\343\244\216\263\214\267\237\264\355\212\327\262\376\350\326\246\325") -TOPIC_TEXT( -"\316\227\207\311\340\261\335\350\331\241\241\232\344\232\327\360\260\243\334\364\352\367\327\223\305\314\276\260\264\355\342\232\267\343\221\307\216\211\357\202\301\223\301\207\324\234\352\321\335\214\324\337\271\324\342\304\263\265\266\300\270\267\273\334\347\365\201\326\357\336\373\353\331\337\221\240\225\355\271\362\367\346\316\354\267\203\377\371\346\313\234\377\215\320\372\202\221\326\210\325\373\310\320\213\265\370\322\234\200\200\335\344\225\216\233\213\307\342\355\214\236\266\222\267\236\211\275\265\275\221\301\352\376\255\265\262\250\321\222\335\371\223\313\321\312\337\207\233\342\203\205\342\334\201\276\310\336\277\353\315\305\226\243\303\201\343\201\373\322\201\312\315\334\217\202\277\373\263\252\255\264\363\307\266\360\260\357\247\360\310\306\205\373\363\330\222\272\316\340\302\350\264\242\224\306\325\303\337\240\362\272\357\304\262\324\301\272\250\215\212\271\252\325\302\215\260\374\377\356\340\227\247\371\331\335\235\334\277\312\370\342\205\204\251\376\315\247\346\263\367\345\254\331\203\273\377\266\262\250\214\243\312\374\353\214\356\373\334\307\270\367\357\215\251\217\271\212\264\214\305\256\245\320\235\355\365\330\306\375\360\213\230\330\335\262\270\266\305\302\265\204\203\303\225\345\265\360\246\202\355\321\226\225\335\350\303\205\343\360\260\266\230\372\332\326\347\327\332\256\237\360\305\343\330\362\250\250\267\335\263\321\255\352\213\201\217\357\321\350\251\267\216\215\225\210\273\236\343\360\256\311\321\365\361\242\333\347\273\304\246\275\250\340\357\336\264\303\355\265\260\370\354\270\275\230\242\265\324\341\332\213\357\361\357\265\325\254\314\361\245") -TOPIC_TEXT( -"\370\354\340\363\331\315\233\300\224\271\346\263\346\345\334\256\255\371\232\250\353\343\261\262\300\225\351\225\370\273\265\227\317\322\325\311\302\242\325\210\361\205\237\270\354\251\322\325\363\223\201\265\353\364\374\234\310\206\261\314\306\201\374\366\337\236\202\235\270\343\356\301\243\300\270\231\233\265\203\271\205\272\225\207\252\277\233\332\332\340\340\336\303\371\325\207\326\253\264\257\215\341\212\261\235\337\201\261\302\301\341\334\255\367\254\271\375\255\213\345\360\225\365\353\254\200\337\271\216\215\251\370\367\254\211\342\352\336\201\336\237\204\223\272\263\360\323\261\210\332\223\250\303\306\220\277\312\321\315\360\242\233\242\363\315\340\224\200\343\365\211\333\365\365\261\252\213\220\340\212\276\300\274\306\307\204\257\272\247\272\351\275\260\202\204\206\362\241\245\206\376\305\324\277\362\377\376\304\337\344\260\212\206\366\373\366\354\251\214\231\333\226\270\256\335\370\231\342\350\234\222\321\344\236\270\250\254\250\337\363\263\310\201\365\377\222\241\247\277\377\333\377\277\205\202\312\314\322\200\307\243\311\320\204\203\347\202\311\334\274\300\235\355\345\202\275\342\261\255\200\307\307\340\356\225\326\266\372\217\230\321\312\350\233\256\335\234\315\267\371\250\240\326\267\213\251\226\257\210\221\276\340\324\240\335\343\212\335\363\203\254\260\236\330\351\272\334\362\221\270\203\332\231\350\262\272\234\276\362\361\264\304\315\324\205\277\305\214\316\366\310\311\261\216\276\217\261\330\254\237\272\350\375\331\213\353\201\344\361\231\313\367\274\354\236\361\350\366\217\231\367\226\211\233\346\363\373\340\326\337\343\257\214\325\301\206\201\213\376\302") -TOPIC_TEXT( -"\265\303\367\366\261\221\241\240\335\344\251\304\260\266\272\330\316\244\220\251\365\327\353\364\374\366\276\300\342\256\306\271\367\363\322\342\330\243\244\253\201\331\226\276\371\344\343\274\240\230\354\327\312\214\202\233\255\215\250\302\202\255\315\215\216\227\257\203\277\351\330\304\330\347\231\227\234\313\316\314\274\322\300\241\331\255\223\324\206\363\212\205\300\343\325\234\327\264\247\325\270\223\370\306\232\333\355\323\320\330\214\365\306\246\321\211\306\270\350\216\324\245\275\261\310\340\325\333\237\350\365\312\360\324\215\273\355\261\223\214\361\321\255\345\255\276\300\371\354\245\336\212\251\203\213\277\311\210\317\221\353\356\251\324\314\304\222\356\270\215\212\226\217\235\357\336\252\350\244\247\356\256\344\315\230\233\223\316\260\222\336\304\245\344\220\323\377\270\265\252\305\371\216\265\224\234\313\373\212\313\342\212\366\377\240\226\310\364\275\345\201\331\322\335\370\302\216\325\205\235\204\241\240\344\332\355\213\370\360\341\247\206\271\200\343\254\270\222\352\306\372\215\260\333\333\333\212\252\242\232\336\371\347\266\264\202\274\310\217\230\367\305\267\351\275\243\315\221\232\346\233\200\272\241\274\240\352\344\224\346\340\323\201\332\200\274\307\265\334\275\316\235\200\207\361\307\362\300\310\361\313\332\247\275\332\202\227\340\265\307\363\367\354\274\212\311\350\231\301\303\255\323\217\357\311\226\263\353\255\256\250\367\221\265\357\364\373\305\311\333\203\375\350\203\364\260\306\213\330\351\252\305\255\207\253\242\270\364\321\255\374\213\225\240\263\275\225\236\347\225\250\256\326\367\231\224\227\273\272\331\367\254\375\313\277\305\343\324\241\362") -TOPIC_TEXT( -"\332\325\335\357\357\331\264\211\232\274\213\275\273\366\313\354\270\332\334\365\225\217\321\236\327\224\344\235\365\307\274\222\362\271\253\272\353\236\377\246\372\270\344\364\250\261\376\325\225\256\376\342\214\241\346\300\332\223\251\233\323\367\351\255\351\333\376\361\251\213\312\370\323\236\263\253\305\321\324\254\325\204\244\377\207\250\240\241\255\200\276\222\370\217\346\314\202\323\267\355\302\351\260\256\231\230\232\211\313\371\315\316\372\274\343\260\371\240\211\221\203\352\217\301\210\213\240\342\354\324\302\203\254\261\320\233\225\305\224\330\321\223\264\321\201\323\332\375\321\202\314\301\255\371\341\354\350\276\261\257\237\335\304\227\253\236\277\261\255\333\336\245\250\376\354\351\311\310\364\321\375\262\351\201\314\365\203\250\234\334\357\346\250\306\367\371\362\262\223\354\356\373\230\372\272\315\274\217\246\251\243\306\355\235\214\367\367\364\355\265\303\360\372\203\373\251\315\332\325\201\226\301\205\351\351\347\242\213\215\211\321\206\214\304\254\342\205\340\307\373\264\311\226\343\335\242\306\330\231\312\260\305\243\375\364\211\370\211\315\240\320\354\247\250\223\345\347\224\217\336\342\355\230\273\352\321\316\227\273\261\355\304\323\275\231\330\267\361\277\257\321\310\204\273\257\203\353\211\211\226\250\305\252\363\200\351\332\346\311\334\204\215\377\276\332\373\343\317\252\343\244\375\306\233\341\223\207\361\366\256\376\235\250\311\361\367\236\325\233\234\306\272\253\222\367\361\333\324\321\244\336\262\233\242\276\241\224\352\323\324\277\327\316\321\205\343\335\313\242\205\360\310\342\345\306\272\241\313\365\322\216\323\275\314\243\255\257\341\231\317") -TOPIC_TEXT( -"\316\206\206\240\255\357\340\312\345\307\250\345\262\376\245\337\266\341\224\315\237\213\307\233\341\231\326\266\260\214\231\317\255\332\254\343\276\230\334\250\377\224\371\355\203\236\353\201\374\374\323\256\336\272\300\262\235\217\365\305\262\231\324\254\256\340\212\247\320\262\243\245\313\232\274\221\251\217\355\315\365\355\272\377\336\342\232\313\272\250\310\277\227\330\324\246\305\265\376\272\326\354\270\300\306\270\205\253\213\223\203\332\344\353\371\201\351\307\201\333\225\320\200\336\213\220\215\276\305\370\220\314\301\363\312\347\367\261\313\267\300\247\343\244\247\237\342\324\332\335\300\356\341\276\307\256\266\226\246\351\231\320\211\223\246\371\257\350\337\221\217\213\220\205\223\203\301\345\355\354\276\335\362\306\331\241\367\217\200\312\346\354\213\350\301\334\267\260\314\336\366\254\376\310\354\270\270\204\354\335\261\210\235\275\210\343\222\351\244\252\342\361\204\327\205\256\337\347\362\365\330\221\303\307\224\212\377\373\364\362\337\241\371\335\355\253\320\343\270\344\355\316\313\213\200\316\355\206\325\307\336\364\340\370\243\200\330\275\301\210\364\252\346\332\273\334\354\325\370\313\300\351\332\307\233\223\325\355\321\370\267\315\367\225\263\365\206\374\241\305\272\352\205\355\206\245\331\277\263\270\207\366\225\264\243\254\340\204\304\336\316\256\334\332\326\320\307\204\251\271\233\351\345\241\335\212\364\256\271\252\216\371\316\242\300\312\202\325\251\232\230\350\206\211\340\200\305\242\245\200\243\374\233\344\261\270\371\354\246\314\245\227\204\272\373\263\356\242\342\343\201\362\273\227\362\263\277\367\345\361\243\207\374\367\255\352\242\271\313\331") -TOPIC_TEXT( -"\200\327\376\316\240\245\331\225\306\275\203\206\222\354\210\253\263\263\317\217\264\222\214\225\351\330\204\362\222\275\342\313\305\244\323\247\213\253\222\304\230\375\360\327\323\307\357\352\364\306\372\262\210\320\265\251\250\325\234\307\312\212\327\256\335\245\215\356\351\254\333\230\372\223\201\214\321\333\372\273\315\301\262\335\342\240\335\334\204\227\240\247\236\307\254\205\262\364\351\372\214\237\307\261\251\225\302\270\300\374\223\351\370\203\302\221\201\344\203\351\355\326\204\263\335\342\355\252\256\254\265\304\337\306\373\304\360\356\203\251\313\245\375\255\224\252\304\277\237\332\377\252\364\364\306\257\241\213\327\322\210\311\276\270\270\320\205\343\255\313\376\205\374\250\301\315\214\371\267\371\227\361\323\351\205\226\370\321\227\233\226\213\231\241\333\270\336\353\311\232\325\345\334\263\350\231\276\377\334\304\247\371\210\237\203\367\306\331\226\254\247\264\226\325\333\322\252\242\362\357\202\215\360\242\377\203\220\201\307\220\206\272\262\232\255\276\267\266\266\226\253\234\251\347\326\351\310\367\266\327\232\305\246\231\204\314\350\235\262\215\230\305\223\214\224\317\346\243\346\311\363\365\235\327\203\277\231\376\304\215\344\370\230\261\334\222\204\226\242\325\363\335\232\344\342\263\247\325\221\331\264\331\267\275\273\341\241\304\252\235\362\250\312\251\305\343\306\311\326\315\354\255\270\333\213\255\304\343\212\241\317\313\242\370\314\301\367\375\227\226\241\371\271\277\307\252\312\212\203\273\376\345\313\216\307\366\225\362\320\206\205\312\370\353\201\236\352\230\270\242\357\370\354\207\220\243\332\363\206\226\212\237\313\264\324\363\361\221\275\271") -TOPIC_TEXT( -"\271\325\365\207\377\311\344\202\356\211\353\363\322\250\340\377\227\234\313\266\216\204\213\307\317\203\316\314\325\232\242\340\377\236\365\246\306\263\274\373\302\304\266\217\307\324\340\311\330\347\310\262\243\203\372\353\265\277\277\263\232\250\216\356\234\234\336\376\322\262\202\272\345\254\362\363\205\344\210\330\243\267\227\265\332\255\310\347\342\330\225\246\312\240\273\225\200\265\216\232\224\257\340\317\234\323\377\245\320\336\376\336\223\353\316\327\271\371\261\376\341\272\244\370\313\322\303\256\342\240\350\300\364\347\334\362\303\246\367\271\325\276\312\260\243\331\306\334\215\321\324\301\254\251\226\236\201\375\262\203\340\213\370\236\353\300\213\222\342\305\324\240\207\324\312\312\335\322\360\322\216\311\231\373\351\334\274\305\325\335\240\237\242\345\200\216\352\221\356\243\315\364\211\206\206\373\251\314\236\231\316\236\300\257\370\244\313\313\207\216\264\266\345\230\212\227\361\237\276\231\222\252\266\270\225\227\256\230\326\304\300\304\243\325\314\230\210\201\234\200\376\231\206\273\257\343\206\240\250\211\305\305\302\327\346\247\367\242\321\327\242\307\343\210\312\225\270\225\344\357\216\363\372\255\243\257\274\357\352\314\326\227\336\315\203\205\205\214\206\266\303\341\200\336\347\355\216\202\250\255\245\211\310\234\267\211\346\222\356\254\273\222\236\370\314\212\372\206\320\325\366\315\250\250\322\357\372\217\212\327\207\200\314\257\252\236\337\343\225\301\213\223\225\315\347\206\314\205\223\311\362\336\217\251\201\247\330\246\344\251\373\231\232\371\330\261\251\207\300\306\264\261\207\277\245\252\265\225\341\215\317\231\215\235\376\245\315\355\363\265") -TOPIC_TEXT( -"\307\250\337\311\240\342\261\221\301\256\327\250\332\343\353\315\255\340\307\341\242\252\206\206\374\243\310\340\235\333\314\307\363\241\231\221\230\274\330\337\316\260\260\346\240\270\311\272\307\225\336\236\212\264\274\300\244\354\302\250\366\301\267\336\220\265\356\231\241\200\212\351\226\234\355\352\234\320\314\366\347\356\262\366\347\256\251\215\347\246\261\222\322\274\326\205\220\254\366\361\222\227\245\276\370\300\210\343\214\222\203\322\235\307\245\242\201\344\307\253\377\332\241\303\340\354\351\271\362\367\355\227\212\377\261\374\317\317\307\354\202\237\320\240\371\225\220\262\241\231\227\220\270\236\371\317\221\262\304\373\224\204\314\345\222\320\251\216\253\314\310\274\232\312\270\340\315\320\243\237\242\343\245\233\317\214\315\376\202\353\213\255\354\205\370\310\264\253\201\303\277\320\346\334\272\272\272\332\324\344\231\271\367\307\314\350\317\333\231\267\356\361\277\363\340\354\205\247\233\225\300\342\361\200\333\255\344\352\247\315\260\260\243\204\210\202\206\226\253\343\221\220\260\313\322\215\314\340\240\326\203\323\360\367\256\260\231\200\247\223\205\317\252\354\310\225\274\336\261\342\205\272\342\255\301\346\364\306\354\305\210\204\232\245\360\246\273\270\321\201\303\235\323\273\232\335\242\352\362\227\253\324\316\264\265\316\235\226\366\206\371\237\353\331\323\311\360\242\206\337\312\347\342\362\355\253\363\271\260\262\264\215\351\231\332\335\244\246\377\344\361\230\205\311\334\222\313\251\320\253\352\217\245\231\346\235\361\307\371\351\260\330\306\224\332\267\316\304\201\256\332\316\242\303\311\216\207\253\235\216\366\337\356\317\220\371\276\236\313\235") -TOPIC_TEXT( -"\354\357\371\323\315\237\275\217\260\330\371\353\261\313\210\274\354\202\305\307\230\320\311\306\244\324\366\352\325\232\202\353\333\267\243\255\302\237\264\321\320\332\271\304\254\323\264\307\370\204\232\252\233\336\303\335\363\327\343\350\236\367\243\335\322\324\237\321\213\347\210\327\320\233\232\213\343\317\341\375\225\266\210\346\242\351\206\273\226\301\243\303\325\354\305\274\216\330\354\370\234\270\341\261\300\270\231\374\374\250\257\314\215\200\263\200\315\250\223\254\305\205\255\300\333\216\357\370\323\322\241\301\302\232\236\263\227\253\327\363\261\362\305\223\374\315\265\370\344\326\214\301\343\254\300\253\253\234\333\247\251\237\220\353\205\245\263\242\211\333\200\345\206\252\313\211\213\274\334\272\276\276\247\260\344\335\321\326\335\353\276\331\240\332\244\343\206\257\200\225\217\331\242\216\357\314\365\224\261\334\322\266\356\330\266\303\200\343\300\323\265\315\352\352\351\252\241\213\245\230\262\212\354\275\340\225\202\302\363\213\313\220\355\226\205\211\357\304\225\314\314\220\346\246\306\256\213\314\313\303\232\270\316\311\201\206\356\265\247\274\334\350\264\267\251\324\335\211\355\250\336\375\366\277\364\347\255\376\355\261\312\261\352\331\230\266\344\301\371\360\270\342\251\277\314\360\232\270\226\246\371\273\323\345\327\347\317\236\201\361\356\335\317\224\275\361\323\317\327\377\373\361\217\337\355\332\211\257\341\252\224\237\276\374\240\270\306\330\276\326\334\274\273\230\234\270\356\221\220\203\362\233\245\261\273\350\321\266\254\375\210\353\317\356\216\351\332\260\374\337\212\366\347\355\334\261\304\255\353\315\232\224\270\260\211\343\327\300\350\333") -TOPIC_TEXT( -"\245\377\221\223\214\252\203\222\361\201\202\336\360\230\250\273\271\376\242\213\210\313\267\261\334\201\271\324\377\222\262\367\221\227\265\373\353\364\257\222\346\325\305\246\350\355\322\321\366\264\273\370\233\225\304\343\353\265\325\277\331\204\301\217\265\231\274\232\237\262\253\221\205\340\300\261\232\252\277\371\314\235\312\367\306\212\276\322\245\356\304\262\314\360\207\266\332\200\240\342\260\255\361\327\334\263\250\321\300\222\356\260\277\263\225\303\227\243\355\247\345\205\200\367\354\357\351\224\337\274\204\325\230\233\310\302\364\202\341\344\244\267\267\227\306\231\240\247\363\232\326\336\324\322\376\353\221\270\342\222\260\222\350\253\214\221\303\303\251\230\230\352\266\231\336\361\270\352\275\207\254\204\314\264\255\270\261\273\320\272\331\327\376\225\350\327\302\306\305\226\354\245\325\205\272\257\326\322\321\251\274\214\314\220\266\343\261\221\266\315\252\316\314\221\217\237\270\275\224\275\263\214\320\361\332\341\214\225\251\305\324\327\375\262\337\311\277\213\353\355\310\250\357\242\247\270\205\217\351\273\272\235\242\313\271\327\256\242\274\340\370\211\244\252\204\225\230\357\276\260\217\364\363\327\332\364\205\357\246\331\240\220\345\345\345\347\233\361\351\214\303\327\337\327\375\357\356\270\350\333\260\376\275\243\235\317\235\244\256\266\332\222\372\253\243\236\232\236\302\212\230\262\366\261\304\254\360\224\340\320\201\240\231\362\256\241\207\255\251\275\207\367\203\324\265\277\345\363\246\225\215\317\254\236\333\211\226\312\265\201\300\203\273\221\246\261\220\210\234\330\370\214\225\205\204\343\202\325\276\271\235\244\236\327\363\325\314\236\226\275") -TOPIC_TEXT( -"\200\343\310\235\313\305\234\256\215\217\263\361\312\360\330\215\266\210\310\253\234\224\313\300\333\362\303\352\362\225\263\207\353\321\373\250\373\362\204\334\250\352\213\230\351\271\370\253\271\331\320\336\311\340\260\252\264\352\220\271\206\375\322\325\243\223\313\253\250\253\306\277\355\250\221\253\241\236\323\267\200\252\326\206\372\212\335\204\240\356\377\235\371\206\307\220\357\256\235\230\201\201\355\276\373\224\301\355\210\200\351\242\264\225\223\317\351\222\255\304\261\205\372\274\240\356\277\321\335\227\232\353\271\272\246\316\257\257\267\347\250\251\261\266\207\257\200\316\324\226\240\346\205\345\232\241\361\230\355\214\330\240\330\337\274\333\225\267\353\327\365\361\243\207\367\357\334\331\315\333\365\243\363\306\223\326\267\367\355\336\375\255\366\242\247\244\250\240\200\233\257\266\204\264\300\260\302\201\233\317\207\214\372\311\356\226\340\232\201\356\330\216\372\300\326\373\360\320\257\325\324\245\215\240\227\362\370\341\237\373\213\223\232\307\313\344\340\261\375\376\200\377\326\373\231\243\230\276\220\211\271\267\306\300\267\372\252\206\241\237\251\351\276\331\362\371\365\206\204\353\340\256\316\271\323\331\241\256\227\303\220\335\214\220\300\305\342\331\307\241\272\201\257\346\321\223\353\333\312\375\243\227\277\270\335\340\215\205\315\301\310\316\365\227\273\305\371\307\213\251\203\311\274\247\222\257\342\236\225\303\202\250\266\303\314\346\327\247\206\247\200\234\300\304\261\262\202\257\224\343\263\371\373\371\233\263\217\247\331\305\305\220\346\361\311\305\315\226\275\262\230\212\336\206\336\261\316\324\332\310\374\246\213\260\266\247\312\212\246\367") -TOPIC_TEXT( -"\321\260\273\225\320\233\327\270\202\347\363\347\222\345\271\350\261\243\200\344\260\374\271\262\320\334\226\224\332\332\327\376\205\336\226\260\371\334\235\217\345\206\210\326\315\315\245\256\274\257\265\273\343\274\213\261\314\260\323\202\302\343\325\273\353\251\303\216\303\276\206\331\346\320\310\230\253\375\271\322\233\315\264\231\237\323\264\275\262\202\203\355\203\231\260\244\373\225\306\240\260\265\371\236\222\213\216\340\320\227\275\341\215\207\312\375\364\334\323\332\222\234\305\202\331\225\243\326\272\305\257\210\202\361\213\234\217\325\323\301\255\276\363\341\252\330\356\330\354\215\251\267\326\330\266\230\235\205\370\254\230\226\350\246\326\350\315\300\360\270\323\272\326\264\255\366\216\306\272\242\373\317\231\202\335\203\231\271\206\367\300\360\236\373\223\315\273\350\370\214\367\226\276\357\215\274\310\352\333\344\363\330\262\372\361\242\212\371\202\257\260\227\337\253\364\336\247\366\360\260\354\204\346\266\246\276\353\266\327\365\303\312\352\260\275\353\307\227\364\332\361\350\354\357\345\360\212\343\255\325\241\340\261\312\302\252\276\236\213\341\204\250\221\201\213\275\370\337\340\344\373\371\221\321\244\323\365\254\206\325\275\306\251\222\274\223\250\206\211\270\324\274\304\353\241\363\377\335\373\216\325\365\316\346\222\317\252\315\262\272\373\332\214\326\204\353\227\207\222\336\313\267\335\241\333\335\262\362\216\302\342\261\336\336\331\223\226\234\252\343\236\332\242\356\317\241\353\275\226\202\351\221\277\210\243\203\336\300\251\237\212\347\255\331\243\316\270\352\353\242\316\277\252\351\254\267\372\376\372\206\320\272\353\370\243\337\372\323\251\263") -TOPIC_TEXT( -"\314\205\366\272\301\336\316\363\216\231\227\326\211\263\301\256\272\343\316\251\314\231\243\226\365\354\352\334\335\365\323\352\261\257\364\237\214\314\255\271\226\305\312\273\204\231\224\344\273\326\362\335\214\365\251\370\357\270\272\203\200\311\372\345\255\335\217\273\350\234\362\334\204\375\370\242\241\231\210\342\350\202\337\207\206\327\221\366\231\230\337\302\234\300\215\306\226\213\234\315\265\363\356\206\230\316\372\304\254\227\201\311\354\250\364\250\226\233\341\246\244\244\370\345\205\225\305\370\225\261\372\223\265\375\275\374\307\347\373\317\237\321\365\252\252\213\257\321\373\304\302\343\262\256\316\330\221\250\251\226\300\327\230\326\235\335\354\230\352\266\330\231\266\274\226\200\354\250\367\256\223\326\302\306\346\221\315\251\205\342\221\215\245\253\331\346\362\353\221\206\310\373\323\312\214\321\264\207\240\364\340\312\246\240\336\263\365\303\240\254\271\227\237\243\272\257\332\225\316\334\230\273\212\307\361\301\306\336\203\315\252\325\332\356\235\331\215\344\266\252\352\251\207\336\211\246\207\325\342\316\347\236\214\331\235\361\374\304\303\247\326\226\270\332\245\343\330\246\301\234\211\343\253\240\212\227\260\340\377\207\360\300\337\307\244\376\377\331\326\373\323\337\270\316\254\315\356\367\376\203\373\247\364\347\370\352\334\364\241\252\272\201\210\236\340\320\376\320\237\232\346\350\240\312\350\314\367\265\274\261\300\301\323\355\272\215\267\337\301\270\345\313\262\324\333\343\226\305\331\324\336\332\304\255\323\242\311\312\224\265\333\322\242\304\311\244\304\213\245\242\305\211\224\245\356\273\240\305\246\327\321\244\305\305\327\233\225\222\350\355") -TOPIC_TEXT( -"\371\237\275\210\247\363\360\360\215\245\244\243\267\222\322\325\342\240\300\221\231\231\221\231\231\313\227\373\376\336\223\347\274\207\340\327\265\350\231\360\210\305\246\260\350\323\301\320\304\343\354\375\275\203\231\345\354\306\275\252\317\256\217\220\322\250\363\311\222\211\303\253\213\263\304\243\345\324\360\204\270\340\352\265\232\251\214\202\200\221\374\355\315\365\326\340\242\240\261\200\367\234\240\312\212\353\243\252\254\310\227\225\203\355\327\276\257\265\202\217\265\364\326\326\265\236\251\272\362\264\243\260\372\364\356\371\275\253\324\225\340\371\224\361\330\204\351\335\226\221\217\243\261\207\376\304\274\335\374\361\230\221\266\230\270\233\364\363\202\321\230\347\360\274\306\211\306\313\274\216\252\346\215\200\217\207\210\217\374\376\300\216\274\216\371\333\262\254\330\362\261\252\264\326\203\211\351\214\224\240\214\236\233\301\306\222\350\201\344\206\346\214\261\227\230\262\341\203\264\270\341\370\222\247\317\354\204\276\244\217\243\300\225\230\247\361\352\243\265\361\341\376\312\202\376\376\257\207\236\205\202\307\214\254\240\305\234\213\214\244\305\262\266\333\211\226\336\335\273\277\207\274\342\216\333\236\263\311\334\343\204\223\341\220\200\211\231\223\265\231\313\342\316\305\274\222\373\364\366\357\377\375\305\312\372\362\257\276\313\253\357\350\355\352\350\336\266\345\313\246\246\315\233\262\326\257\357\352\375\375\354\266\353\203\311\363\250\211\307\337\220\272\216\234\260\256\302\267\227\213\252\215\363\371\367\326\230\200\223\204\306\211\303\200\344\243\246\231\305\375\243\250\370\364\354\214\343\213\331\356\344\317\374\303\250\377\257\276\264\314") -TOPIC_TEXT( -"\374\321\204\306\254\337\353\341\270\364\223\235\355\315\331\216\224\274\373\374\227\240\250\217\325\355\261\324\252\253\241\310\240\345\207\247\353\230\332\223\272\346\317\270\252\342\254\256\324\307\214\272\367\362\370\317\302\257\240\364\256\336\360\343\211\360\221\372\341\264\355\352\344\267\304\320\356\304\216\260\340\364\206\205\237\201\212\352\212\236\234\223\216\361\316\350\337\247\271\246\352\274\276\367\361\277\275\324\376\362\356\256\225\237\220\342\244\210\346\253\250\277\324\205\370\303\321\342\366\360\242\303\272\360\217\367\211\333\243\223\230\336\371\261\233\317\214\377\344\217\211\325\244\344\211\232\253\352\267\266\267\310\247\237\366\203\307\277\215\317\232\316\337\377\360\220\377\323\244\357\315\307\335\343\232\301\227\324\354\202\331\343\225\324\201\314\243\311\346\266\312\216\212\231\305\341\371\363\257\336\262\274\363\277\251\206\372\250\226\247\310\275\272\366\230\243\313\353\237\346\303\240\363\252\244\363\314\331\325\356\371\221\377\363\371\325\354\243\373\274\255\344\360\204\265\242\267\321\225\352\216\327\263\276\202\226\275\342\364\354\331\275\363\344\372\311\261\221\322\243\215\325\206\325\232\257\336\302\233\245\303\205\225\345\330\347\270\231\245\343\226\247\333\334\273\322\254\363\361\323\306\265\224\344\257\347\241\330\265\363\225\353\226\233\205\221\262\216\311\323\271\203\325\302\272\370\360\341\353\334\230\364\332\244\232\227\267\307\230\341\303\337\233\275\242\273\346\370\351\323\234\351\354\271\364\254\371\353\330\321\265\306\375\307\377\250\303\342\205\340\341\303\311\210\306\312\220\245\232\331\322\363\226\213\235\217\361\233\274\245") -TOPIC_TEXT( -"\252\257\303\313\250\326\262\363\345\244\253\314\305\204\200\365\363\242\262\370\314\370\260\336\351\234\213\370\313\252\203\303\203\377\255\264\337\230\271\367\367\327\236\260\311\331\341\310\210\363\334\360\261\343\226\337\337\336\244\340\270\201\245\376\230\352\372\225\304\335\320\257\270\205\201\351\215\246\244\263\224\331\351\207\237\223\230\211\322\316\343\216\362\322\323\347\321\371\361\304\242\330\260\266\322\303\324\250\314\343\232\200\245\264\317\221\360\374\307\325\264\221\370\330\207\217\344\306\362\335\263\374\313\311\207\261\355\305\243\226\346\363\306\305\355\226\343\246\335\330\334\274\226\200\220\311\314\200\230\370\314\231\205\300\374\307\316\251\275\370\207\240\210\361\230\364\331\254\244\221\203\202\202\345\235\370\206\374\345\360\357\200\200\336\267\364\350\263\301\334\244\207\227\363\362\321\325\205\355\250\356\222\227\362\315\363\211\205\350\336\210\244\243\273\363\252\314\355\347\230\263\366\230\375\206\335\206\206\233\370\217\370\205\214\221\250\217\241\227\225\303\346\213\347\206\335\217\345\371\216\251\220\227\306\340\226\311\214\232\243\215\365\212\236\323\227\240\361\220\263\275\322\353\243\244\210\214\235\350\343\213\365\211\231\246\353\316\242\354\253\330\333\216\336\273\324\253\215\221\225\202\363\244\345\216\314\223\220\371\302\357\305\304\277\260\343\200\231\332\234\304\345\247\305\340\311\256\303\352\206\201\241\312\222\275\354\251\304\324\313\243\370\305\373\251\233\326\375\274\341\375\272\350\334\230\306\241\355\230\263\375\342\206\366\320\251\355\237\207\320\213\316\347\306\263\312\327\350\262\274\336\276\374\301\266\353\233\377\275\310") -TOPIC_TEXT( -"\213\244\322\254\273\227\275\230\277\316\244\230\265\211\334\337\370\271\271\206\252\321\206\227\232\222\276\372\274\257\243\233\264\244\322\251\361\330\373\217\251\353\204\252\257\247\376\235\337\330\272\227\207\232\267\236\341\256\204\236\212\255\250\273\355\251\232\220\342\324\242\201\302\273\206\203\342\215\355\274\224\327\320\340\231\227\244\343\374\330\232\276\313\210\316\222\377\321\346\343\300\245\234\337\201\313\342\317\356\353\206\312\341\243\364\377\265\317\373\267\307\320\223\316\243\221\343\344\222\356\240\306\237\325\267\362\254\320\314\353\343\263\345\256\246\325\235\314\365\350\345\365\245\265\253\327\374\305\333\204\217\341\276\327\333\252\347\274\312\365\203\226\253\331\270\231\223\311\313\213\277\341\337\226\227\217\342\243\266\303\230\330\213\217\242\302\305\350\264\260\315\271\202\306\304\205\232\231\331\330\207\222\357\330\325\305\342\270\215\215\357\261\214\244\315\220\333\217\235\222\356\340\341\375\325\354\200\315\273\332\253\260\224\261\370\325\350\235\264\211\251\213\333\330\204\251\364\202\242\323\261\242\240\323\261\234\240\275\256\240\216\344\303\344\264\213\324\303\250\251\216\257\236\220\201\253\210\356\342\275\201\362\242\255\247\364\226\334\241\303\251\305\311\222\347\335\376\274\314\251\234\353\255\373\275\243\205\357\202\324\365\370\342\343\360\270\363\225\265\264\340\221\233\250\355\221\246\242\216\316\314\223\274\260\307\243\213\240\355\257\310\203\214\273\270\211\231\344\353\212\216\336\303\221\300\264\246\341\261\232\301\224\302\204\203\375\335\350\225\305\360\263\203\222\347\252\220\377\206\313\210\222\363\266\300\307\353\325\343\243") -TOPIC_TEXT( -"\276\332\264\221\336\275\274\250\300\331\360\276\303\210\371\372\326\210\332\353\314\355\326\232\265\354\257\227\361\216\351\237\357\314\367\314\351\254\256\355\247\256\330\341\273\213\217\362\224\214\266\264\246\266\325\322\252\364\366\270\203\332\251\207\213\231\311\202\222\274\313\224\347\303\332\311\247\307\216\321\221\350\364\377\245\330\330\257\213\205\205\323\322\334\331\243\226\311\337\217\300\354\372\262\362\345\235\306\207\334\277\273\273\271\323\257\332\335\344\236\330\261\365\274\360\203\324\224\237\352\225\356\260\325\304\305\360\355\312\200\363\330\301\307\252\373\311\200\274\261\315\271\370\217\360\353\322\211\210\357\254\233\255\231\345\347\260\213\267\203\350\312\261\310\301\342\254\367\206\241\306\337\365\265\264\364\210\262\241\313\342\247\214\221\224\343\335\223\310\377\213\316\270\233\277\267\357\332\260\241\275\231\320\312\342\255\206\277\371\307\231\265\361\364\211\225\213\205\204\316\337\370\206\315\211\257\376\244\306\203\230\227\336\334\253\253\261\236\251\277\346\354\214\274\270\357\275\277\306\234\354\351\352\307\243\200\344\241\263\276\362\351\227\306\367\373\203\324\237\301\325\213\204\313\224\227\245\241\331\234\271\310\372\327\227\254\367\230\341\377\235\303\206\321\256\263\201\236\207\355\334\323\325\331\320\221\304\303\206\367\246\307\307\247\256\331\371\300\315\352\330\225\213\206\203\212\211\306\277\363\254\274\276\350\312\321\210\220\357\325\353\231\377\366\343\365\302\343\261\300\262\374\267\326\261\312\244\305\337\226\226\213\217\371\370\205\327\257\277\223\357\242\335\215\255\354\311\314\207\325\262\200\207\271\313\306\302\243\366\253") -TOPIC_TEXT( -"\342\307\310\236\333\321\227\217\236\351\302\225\345\333\256\274\363\347\371\216\361\347\235\277\322\242\321\243\353\340\350\344\333\233\203\352\204\365\231\324\254\230\201\314\342\237\364\240\313\314\306\205\227\324\225\303\340\240\342\334\316\241\316\343\272\256\243\265\323\231\331\241\356\350\210\355\330\214\246\225\305\214\220\266\366\375\330\220\204\236\233\273\212\326\261\216\236\313\264\310\263\262\242\225\274\274\214\320\361\300\202\367\357\230\374\236\307\222\255\250\205\236\371\202\316\241\274\243\357\360\300\331\222\230\300\257\261\237\256\270\323\333\206\366\211\261\335\231\313\212\220\273\272\232\357\267\257\377\300\325\277\242\377\253\365\252\363\246\360\357\366\273\244\314\231\253\236\211\204\252\227\230\215\355\273\376\237\350\346\271\277\241\374\334\270\300\310\376\265\342\327\330\256\362\340\314\257\300\327\331\373\253\227\263\350\302\371\273\353\221\230\374\253\376\261\370\217\227\345\371\234\231\345\207\321\212\211\232\210\201\261\311\274\341\333\267\341\316\324\210\216\346\322\203\324\334\377\211\302\375\220\304\326\224\225\346\253\353\212\230\213\362\216\230\365\352\220\244\223\304\331\324\350\201\225\345\247\277\335\270\276\341\203\256\237\225\250\221\226\367\251\267\246\256\340\221\207\235\240\341\333\206\316\260\323\262\202\345\273\350\261\316\211\320\201\221\212\233\233\235\374\344\275\273\262\262\262\326\253\246\322\310\305\201\323\244\367\207\316\361\325\264\306\207\376\374\365\325\262\211\217\377\225\261\354\303\252\360\206\354\330\342\354\230\210\310\253\307\311\337\202\276\335\210\356\340\264\325\255\277\234\261\343\376\326\263\344\330\244\342") -TOPIC_TEXT( -"\262\305\345\333\250\311\352\230\227\341\252\342\342\272\246\247\331\253\223\253\202\211\372\332\373\254\210\370\254\251\377\370\247\255\202\273\263\213\335\337\330\236\223\327\233\226\352\243\335\352\371\355\211\242\363\210\253\224\254\225\274\215\247\370\304\343\211\266\203\336\332\356\322\257\327\306\230\257\313\314\310\321\341\231\240\207\337\277\352\362\256\257\274\302\366\323\263\261\271\320\210\367\372\371\232\206\272\373\200\237\302\376\307\235\221\271\313\315\366\214\213\312\244\313\313\213\212\212\232\232\377\352\350\301\213\333\203\347\323\237\277\310\260\366\241\336\363\204\360\230\366\242\346\202\311\216\314\206\215\247\204\311\333\262\333\213\211\307\307\252\336\272\303\217\237\360\322\234\355\270\223\326\225\276\232\272\370\207\217\324\264\201\237\271\262\200\336\261\315\234\216\242\207\307\203\350\223\234\312\325\374\360\213\334\354\366\242\346\344\223\247\372\270\337\352\203\274\360\202\333\301\217\356\277\341\327\242\267\335\345\303\365\344\313\315\235\275\355\327\376\233\370\307\277\312\365\300\274\247\236\212\305\313\270\331\365\340\252\326\240\317\342\217\265\231\337\330\334\315\342\275\206\244\335\353\267\263\275\317\322\336\272\304\311\325\262\375\240\266\373\341\271\346\272\205\271\215\310\342\376\235\276\367\327\216\233\347\334\310\330\336\227\340\300\214\350\270\210\306\375\304\316\274\306\373\356\254\262\241\202\321\226\201\215\247\200\233\266\353\350\364\343\302\226\231\316\316\357\223\356\345\201\343\361\270\272\326\364\325\250\235\242\225\335\216\243\375\343\315\253\230\216\271\250\271\276\357\263\342\367\202\325\222\222\234\330\213\212\270\222") -TOPIC_TEXT( -"\234\304\253\320\225\365\301\226\327\360\345\227\271\361\270\347\363\373\251\256\312\353\316\252\256\342\365\300\241\376\235\272\312\321\205\213\311\201\274\232\310\206\305\210\253\316\352\302\362\220\231\260\344\302\362\235\223\377\200\303\310\276\331\322\354\204\301\320\352\274\346\322\360\326\272\374\251\366\360\206\201\234\307\362\322\205\241\236\276\270\224\323\374\264\310\360\262\367\251\337\312\371\230\216\212\306\236\207\204\373\256\275\367\210\311\255\223\356\303\205\320\363\247\236\236\274\271\264\320\273\252\230\352\224\327\275\372\356\270\257\236\203\324\241\221\344\260\226\236\243\222\301\215\211\264\245\225\352\323\306\330\211\267\346\362\260\260\207\370\376\232\371\365\262\262\202\345\273\214\254\261\325\371\212\354\330\260\330\243\364\372\215\217\244\307\342\324\263\213\346\272\317\261\216\217\251\230\202\202\363\274\235\227\214\323\216\307\304\253\315\341\233\303\270\351\364\366\312\207\347\307\306\372\224\240\210\217\356\222\235\341\372\354\201\313\340\204\256\322\341\372\212\300\361\323\215\371\314\342\305\307\236\213\236\277\375\317\366\333\214\264\344\360\213\315\340\261\275\312\224\203\301\252\342\242\201\202\351\312\344\251\341\333\326\371\211\365\366\373\263\322\207\300\230\264\314\215\273\303\302\237\230\357\374\217\357\366\230\234\240\246\320\261\207\343\325\351\364\256\342\217\354\371\342\371\263\351\223\233\320\324\233\251\210\272\272\352\245\332\273\374\270\303\277\257\243\327\222\306\244\256\207\375\306\370\340\345\323\241\334\313\274\321\357\210\233\323\300\322\215\363\361\212\252\333\372\365\320\226\315\371\321\355\242\300\241\326\301\237\207") -TOPIC_TEXT( -"\255\363\321\321\236\216\202\356\345\334\335\324\322\315\374\373\332\357\377\276\273\274\276\260\372\364\333\321\306\375\302\272\201\361\365\370\304\353\267\262\360\351\345\366\203\255\355\215\256\313\356\340\313\204\250\250\204\227\254\247\240\217\274\250\301\225\315\337\335\355\363\302\213\240\333\262\263\324\264\306\271\237\232\270\330\365\273\254\200\327\256\314\254\311\336\310\237\360\352\321\341\312\334\232\342\377\304\204\236\223\206\251\331\306\350\363\255\370\214\325\366\356\257\376\212\305\357\232\332\272\312\246\306\206\255\240\250\373\224\266\221\303\327\350\220\373\206\206\242\271\244\222\232\341\333\260\261\270\212\245\254\210\361\250\242\353\324\206\341\347\210\270\261\260\324\277\265\271\250\312\317\202\226\204\367\232\345\231\367\256\206\252\306\211\351\306\373\222\372\247\264\362\201\272\236\242\261\317\267\253\202\365\342\240\313\344\205\321\277\331\307\266\356\267\220\230\360\223\337\354\353\376\350\243\315\250\375\266\326\272\235\230\211\240\203\231\347\205\237\205\321\233\263\341\313\252\254\210\323\227\233\202\215\224\356\262\215\360\221\255\237\260\225\276\353\262\351\223\265\325\353\301\307\256\335\240\245\321\226\244\277\241\256\346\230\235\332\357\306\200\344\242\330\302\370\354\315\364\337\361\221\272\237\336\346\261\326\232\341\225\256\277\203\305\234\353\303\357\271\370\305\356\236\226\204\324\333\220\226\354\327\335\363\355\353\364\232\212\260\321\325\250\272\326\262\217\202\365\242\214\212\346\261\234\256\253\253\223\372\202\302\366\204\311\324\202\202\267\264\236\365\344\330\263\217\251\207\261\230\326\367\350\232\215\354\375\231\270\202\255") -TOPIC_TEXT( -"\211\340\333\261\356\204\365\302\324\250\315\220\330\315\356\216\253\240\232\242\210\230\235\363\264\261\224\242\310\307\316\340\252\245\312\230\363\304\343\333\226\263\203\343\267\334\213\223\206\357\327\244\335\360\237\233\232\352\264\250\247\270\353\345\207\345\336\253\336\233\370\370\237\223\354\303\342\311\263\253\372\364\325\337\361\212\361\350\360\254\231\234\317\245\234\317\315\330\323\375\215\366\357\306\252\375\366\226\320\253\237\327\350\222\207\305\273\227\226\267\376\235\203\375\235\321\233\275\241\203\261\312\262\370\270\210\204\316\320\332\344\366\270\304\360\365\360\236\313\346\245\303\274\337\344\322\302\262\221\273\260\204\307\231\222\314\220\344\372\240\205\210\351\210\313\237\340\214\370\263\274\340\226\320\315\314\334\315\243\244\212\204\254\312\227\201\242\355\306\233\375\264\371\257\242\214\367\204\274\212\264\221\212\263\230\330\302\360\210\207\330\345\233\261\260\262\372\252\227\207\350\242\202\342\372\322\323\274\366\221\302\335\265\324\233\344\373\304\216\204\354\363\372\222\331\340\352\374\306\304\247\200\233\316\226\216\223\203\353\345\343\344\312\260\204\363\234\343\331\206\304\321\327\277\302\307\367\247\275\306\272\211\341\361\220\345\371\225\255\247\353\353\347\252\356\231\221\331\333\313\260\270\302\347\302\201\363\225\215\263\356\351\214\203\277\313\357\342\202\237\270\265\263\237\251\352\324\213\325\310\234\272\256\363\216\227\376\260\347\356\321\375\315\330\300\340\330\325\374\203\212\206\364\343\332\246\314\227\303\300\240\220\255\263\305\335\260\203\317\370\330\330\321\205\344\225\227\240\216\210\235\333\277\225\230\213\275\222\222\301") -TOPIC_TEXT( -"\204\232\316\223\211\240\340\202\330\261\327\340\334\234\200\262\323\362\213\202\256\343\336\353\304\350\362\272\250\361\263\312\317\341\213\276\300\356\320\335\314\266\247\346\331\344\234\231\365\340\263\202\301\274\211\351\271\231\370\306\206\306\233\211\203\311\224\320\344\262\361\256\222\306\263\366\271\200\200\306\240\337\344\260\260\303\247\300\277\244\350\342\202\263\336\327\255\236\210\203\346\230\346\340\261\254\377\314\305\322\233\251\347\252\203\344\234\366\213\236\334\321\323\255\312\346\231\265\337\215\326\222\253\302\327\374\350\224\265\337\302\203\226\266\361\270\227\356\357\352\227\226\277\333\256\326\332\327\323\306\314\330\205\334\330\213\253\265\227\301\351\302\316\274\316\332\275\334\326\325\333\315\220\365\212\333\323\324\304\300\353\372\217\321\326\201\371\223\222\203\343\367\232\357\377\375\270\366\227\311\330\300\262\275\311\343\245\277\361\304\226\266\356\330\300\274\270\271\366\300\354\260\234\212\224\271\230\206\323\275\252\253\200\326\217\202\227\200\313\305\247\340\204\262\374\230\246\251\314\216\346\235\350\330\236\320\365\372\255\333\231\245\314\373\320\221\267\240\232\250\373\267\237\307\320\274\320\231\274\260\356\362\203\234\354\374\326\223\331\264\315\317\336\324\205\304\202\335\361\330\343\222\272\320\227\226\323\345\356\243\247\215\210\236\320\301\351\327\255\320\201\314\213\322\273\376\361\302\346\245\325\224\241\223\214\270\266\330\230\353\223\324\212\316\200\234\227\214\270\226\264\213\245\246\205\331\246\315\305\303\311\313\377\207\256\206\335\343\270\312\200\351\313\305\343\352\363\244\337\264\262\260\227\341\363\312\221\344\223\252") -TOPIC_TEXT( -"\265\260\313\374\215\276\343\311\357\234\342\245\347\226\313\325\322\270\334\356\205\217\231\274\237\261\266\223\366\265\364\263\340\361\312\326\254\254\270\250\321\343\361\316\245\263\343\263\350\246\365\321\225\342\266\361\366\352\353\317\313\251\350\356\257\347\306\265\314\200\237\235\235\304\271\364\300\312\341\221\300\261\314\301\207\210\363\371\223\323\206\244\201\312\364\246\263\217\253\213\252\205\242\305\240\367\273\236\222\372\372\371\324\317\321\263\341\266\323\221\330\322\317\226\340\261\274\244\370\217\234\354\254\243\365\331\207\321\345\221\212\347\243\241\333\201\222\354\246\321\230\203\350\272\333\317\305\247\303\217\326\304\370\305\373\313\341\231\232\334\220\263\256\212\354\256\354\234\366\227\217\361\355\334\345\271\227\314\211\326\357\364\314\300\301\224\240\223\350\271\356\326\257\336\242\343\261\274\251\264\355\316\340\370\361\223\211\301\317\300\253\357\346\355\340\360\207\304\235\260\336\200\324\354\377\314\331\273\373\253\211\361\273\363\221\327\321\340\212\247\313\317\236\313\325\351\276\320\311\301\331\346\362\235\235\305\231\230\350\355\252\273\332\373\360\221\267\202\240\226\324\372\237\323\223\247\354\351\230\333\240\310\337\261\257\362\354\244\276\237\331\334\236\231\220\220\214\213\354\252\350\374\213\303\317\216\205\212\215\364\274\371\352\312\344\257\344\335\266\314\325\373\227\373\240\371\367\316\323\330\365\343\325\255\270\305\333\214\254\310\205\215\363\347\206\347\347\321\363\245\325\340\235\330\221\343\335\265\256\214\376\311\330\211\276\256\206\205\231\361\255\370\230\261\226\331\227\233\243\253\200\236\261\223\316\240\275\361\353\264") -TOPIC_TEXT( -"\270\226\256\271\366\311\264\205\307\343\311\301\244\347\355\327\251\261\200\252\302\317\364\263\322\301\215\324\250\277\305\247\350\211\357\341\361\304\304\204\226\377\366\364\371\307\205\373\366\221\364\303\364\254\305\272\322\227\337\202\233\253\364\361\314\345\213\317\274\322\363\334\237\245\223\243\323\241\276\341\237\225\264\237\255\212\333\327\357\354\265\331\351\342\334\365\211\367\237\214\304\300\340\220\274\373\317\364\377\306\236\357\337\377\266\201\330\211\217\304\235\202\225\222\262\375\326\254\324\356\341\326\374\305\334\256\303\371\346\363\205\322\342\336\232\322\366\263\247\333\373\207\300\300\207\323\267\242\217\355\301\257\331\261\356\350\256\252\262\365\321\342\362\355\321\345\324\316\366\205\216\333\300\250\307\331\244\213\270\361\330\376\232\201\230\225\324\371\362\222\277\225\205\223\304\321\360\254\366\202\321\247\314\342\247\350\311\246\247\340\225\250\322\320\276\230\323\327\247\361\331\272\226\263\242\313\243\201\334\317\226\224\340\333\345\240\326\375\374\355\363\247\357\367\257\377\247\244\235\221\370\366\243\337\264\377\321\362\257\300\353\206\317\340\241\332\313\245\230\273\275\306\316\367\256\353\303\265\335\312\224\255\351\247\261\205\246\226\245\361\217\342\266\361\365\236\200\307\342\312\326\332\354\271\267\342\206\307\254\316\313\206\243\231\367\254\372\344\213\207\377\374\330\330\205\226\231\216\337\347\274\236\231\351\251\256\337\351\210\215\312\322\270\260\310\257\340\315\264\310\254\366\376\203\304\313\232\346\272\322\244\231\241\237\273\357\324\264\344\267\212\227\307\354\234\340\375\220\334\360\230\357\234\317\325\305\360\213\351\221") -TOPIC_TEXT( -"\212\262\274\261\305\201\234\206\341\217\241\266\260\225\373\312\216\277\313\353\274\354\254\207\322\366\351\350\200\275\216\220\262\325\251\373\234\277\206\243\223\323\316\372\325\350\265\201\260\301\217\361\270\265\255\201\263\351\323\247\333\217\230\313\233\251\240\374\330\230\363\260\377\314\201\313\241\347\363\327\325\267\324\257\303\320\247\326\342\341\253\361\330\210\256\260\236\324\215\322\373\306\363\256\217\243\353\344\261\202\373\235\203\245\265\235\363\214\247\233\235\303\252\323\304\247\234\342\321\264\304\346\222\234\241\250\201\320\226\205\307\362\321\210\250\343\364\340\255\314\374\361\374\231\257\224\217\217\330\217\276\271\217\364\273\375\343\343\220\270\317\330\233\342\212\222\254\204\235\233\202\277\216\355\343\255\204\206\235\341\235\333\206\327\266\333\222\214\217\303\262\274\367\277\245\236\363\304\216\246\243\226\310\352\356\274\327\366\302\240\343\332\202\222\263\220\250\246\305\260\316\365\223\276\201\226\260\343\326\203\211\373\340\304\326\200\345\201\264\313\246\327\314\305\321\260\270\242\225\240\201\222\301\305\334\213\350\223\337\354\263\334\320\330\202\232\336\323\361\251\257\300\326\335\351\273\367\306\222\302\370\343\351\214\215\332\257\364\272\206\360\252\322\327\277\244\207\234\352\362\333\324\220\315\372\202\217\267\256\317\336\262\256\376\203\326\265\300\243\315\365\377\206\332\264\273\360\361\202\302\210\213\331\376\271\267\337\327\361\323\341\337\356\332\273\264\312\265\270\302\351\306\341\323\341\225\340\255\340\361\206\360\250\315\360\262\263\216\300\320\276\202\373\230\206\200\215\366\377\333\326\255\300\361\277\354\306\221\335\357") -TOPIC_TEXT( -"\262\312\246\335\270\366\227\303\313\377\324\227\260\326\202\220\214\300\276\346\326\336\243\207\341\310\340\322\370\254\245\225\242\375\353\227\335\237\341\210\350\344\330\304\206\335\313\263\357\347\270\211\202\305\347\246\340\306\342\346\305\360\327\263\360\230\236\201\250\222\255\303\243\271\360\224\262\225\252\234\241\277\255\224\243\246\364\204\325\305\212\300\302\322\250\316\364\247\242\304\240\330\236\300\247\313\267\223\315\337\356\336\350\347\215\236\235\256\207\335\253\277\257\254\375\344\335\324\302\247\375\254\274\273\230\243\330\222\276\347\251\271\230\321\332\256\252\200\321\240\312\211\321\313\357\305\216\351\325\324\214\221\222\221\306\337\254\351\262\363\370\353\320\327\216\363\327\212\241\361\262\206\230\347\364\374\265\341\336\360\311\324\305\237\317\261\213\225\207\334\343\217\314\243\266\221\322\341\233\361\271\305\343\246\361\241\341\305\303\217\317\373\366\374\362\232\275\370\227\334\320\250\202\266\243\311\204\370\347\313\313\233\335\304\250\230\302\260\207\276\311\330\257\340\276\210\355\361\340\305\202\261\352\300\310\213\225\276\227\256\305\326\265\212\351\227\343\201\374\353\314\341\216\277\252\216\325\250\264\274\264\263\365\227\253\265\200\233\201\232\243\377\201\267\226\277\203\342\300\201\375\223\353\317\234\373\255\214\273\236\307\200\367\314\314\373\335\367\327\364\371\334\202\342\203\343\261\323\276\343\354\203\307\262\260\253\316\236\323\215\254\343\255\316\370\336\366\247\344\205\307\343\341\334\330\270\204\241\220\227\342\253\247\371\206\331\356\207\260\247\335\236\306\210\222\271\373\251\225\337\271\316\241\277\307\216\202\355\222\354") -TOPIC_TEXT( -"\377\357\215\336\214\377\216\304\213\343\214\204\364\241\276\343\252\226\214\210\301\243\320\204\300\261\226\342\217\277\270\360\204\211\232\323\233\335\346\360\305\301\354\346\235\211\301\327\233\375\363\212\330\317\272\210\276\324\227\323\320\211\274\376\257\256\304\257\241\254\375\267\357\237\257\277\342\210\253\311\255\254\207\265\253\260\333\365\313\337\244\356\314\263\202\315\237\366\270\235\203\334\201\262\300\332\225\240\354\326\346\213\346\341\216\211\201\261\253\321\222\331\367\274\320\330\346\322\233\312\340\350\333\275\266\225\302\210\360\265\211\274\366\255\375\212\200\351\264\320\364\227\233\370\336\354\224\337\212\330\317\372\247\274\360\330\365\276\361\370\263\303\272\257\353\253\253\300\354\240\345\245\247\346\246\307\370\231\357\306\347\206\344\202\217\241\353\311\350\243\335\313\311\364\270\253\213\322\222\206\277\275\270\377\207\346\206\225\304\373\366\357\364\366\264\316\327\355\320\367\230\266\335\337\345\325\325\347\260\315\256\236\376\236\357\307\215\371\343\235\350\211\321\376\240\203\266\251\327\241\216\322\220\372\247\260\256\212\270\232\221\327\340\275\334\200\222\263\256\202\360\262\366\344\355\361\226\326\207\235\274\216\341\361\363\270\342\261\301\275\330\330\206\247\275\332\206\210\330\276\232\254\351\324\245\304\300\217\357\277\373\236\243\325\256\343\355\230\252\343\322\340\353\252\273\343\343\300\316\266\251\375\352\352\306\224\373\213\345\344\356\353\322\331\326\272\254\205\347\310\232\263\340\320\335\270\226\273\201\323\221\304\376\220\263\265\217\231\372\363\234\202\305\231\313\252\332\363\332\202\344\331\345\332\363\350\244\215\322\372") -TOPIC_TEXT( -"\307\225\344\332\311\302\366\314\205\213\210\320\306\222\251\377\214\263\227\316\364\277\246\311\373\375\222\253\301\241\336\336\343\276\353\203\243\243\302\207\217\351\231\213\240\310\213\367\270\241\236\266\306\300\226\201\204\314\372\227\245\370\205\354\247\201\263\307\206\224\263\307\324\222\273\327\301\340\211\260\235\213\223\254\333\220\352\323\231\305\222\347\230\340\330\355\250\334\373\376\226\252\330\255\361\230\244\333\343\227\344\355\364\345\205\243\226\251\200\255\353\347\221\270\235\211\277\252\223\217\316\361\322\215\200\234\300\224\310\317\330\243\332\201\216\223\335\231\270\200\275\315\257\253\336\207\210\212\310\200\217\361\354\346\232\217\235\356\344\302\254\363\256\205\366\204\217\335\335\377\346\334\314\254\324\214\370\361\221\274\241\234\256\216\316\225\312\214\314\257\332\304\321\336\247\222\373\254\220\261\217\321\224\227\275\363\216\256\304\263\303\222\275\342\277\255\277\300\320\233\245\242\305\232\332\273\272\204\217\251\321\314\235\230\344\314\241\257\330\356\220\256\322\256\353\366\305\342\350\217\307\304\201\331\304\231\204\251\240\303\253\331\366\236\347\253\210\214\263\327\347\222\303\362\342\337\373\253\326\346\335\217\234\205\217\370\271\321\221\202\346\236\237\214\301\227\366\347\252\255\232\326\330\333\364\240\322\311\316\363\362\265\221\262\376\264\316\272\204\354\321\213\261\250\302\252\373\340\216\275\215\301\303\337\375\353\365\261\267\300\373\343\327\321\243\215\373\304\353\370\231\327\247\245\354\324\215\354\314\274\335\331\244\360\270\332\321\373\347\225\347\224\327\227\331\211\221\343\251\266\331\377\345\376\213\371\255\310\262\370") -TOPIC_TEXT( -"\334\334\220\334\274\274\274\244\213\212\267\374\364\364\231\235\311\370\304\207\250\322\357\211\350\214\334\276\204\264\263\244\337\275\366\372\211\366\331\322\320\254\253\320\216\340\352\231\256\366\215\344\360\221\221\242\247\265\266\301\350\220\264\334\247\206\302\236\243\321\205\367\261\254\340\242\354\263\230\366\333\277\215\237\242\360\343\367\353\257\272\333\221\225\305\207\226\231\307\265\371\326\347\347\263\320\240\216\337\325\325\326\234\255\246\273\215\363\222\204\222\231\307\220\374\374\376\375\244\366\212\200\224\217\217\330\215\315\347\322\344\245\236\204\346\363\246\346\217\304\252\312\274\345\224\227\270\263\276\333\225\274\221\261\233\271\337\357\261\312\325\212\340\377\261\207\317\275\372\375\352\334\223\220\203\360\342\211\266\266\262\224\362\217\353\257\243\335\357\356\223\335\225\300\225\262\366\355\252\246\260\270\313\300\305\250\267\333\300\347\233\311\201\307\335\334\202\331\264\317\231\273\341\325\237\253\311\313\207\351\312\366\275\341\205\211\360\301\210\200\233\303\300\364\345\331\341\335\255\251\347\347\225\347\347\365\333\262\230\220\227\312\377\221\204\200\206\257\263\256\222\220\274\336\261\300\256\342\333\202\256\302\211\216\221\227\254\376\234\275\341\314\213\220\215\324\263\213\266\236\277\316\304\355\217\242\345\345\245\266\223\366\245\204\264\373\330\305\371\251\243\352\261\260\241\202\357\306\322\346\204\204\327\350\207\334\257\224\233\246\277\227\315\202\321\353\222\306\342\311\246\341\225\230\324\216\366\307\305\274\340\236\321\325\273\212\227\373\301\343\361\344\376\251\341\262\336\261\333\341\351\211\201\375\360\330\301\233\206\362") -TOPIC_TEXT( -"\270\375\251\365\307\316\340\306\340\303\274\215\334\204\224\262\224\353\317\203\255\201\244\321\263\324\305\212\205\365\360\357\366\330\363\205\241\223\212\256\360\301\370\343\343\371\331\362\371\356\236\357\375\333\275\226\326\313\310\206\301\303\262\204\244\203\241\226\265\340\270\275\212\213\323\217\307\362\206\351\264\226\332\302\226\334\214\205\277\350\252\341\246\237\306\271\207\340\367\311\265\344\361\311\303\207\207\341\342\213\235\306\250\205\227\313\333\361\375\312\216\217\244\226\340\346\220\217\333\244\226\335\363\207\230\360\257\327\337\235\314\327\305\353\311\263\220\222\273\312\377\270\244\341\351\315\205\237\252\355\362\256\214\221\274\226\332\377\221\225\231\340\261\260\324\317\300\345\326\240\361\305\372\253\372\265\355\200\375\242\207\235\307\301\275\325\213\201\313\233\337\322\335\331\303\333\366\242\271\357\300\256\211\266\223\206\252\326\377\361\311\370\255\204\244\341\311\274\252\345\247\350\367\357\305\214\311\244\323\360\274\326\236\345\263\214\332\257\374\250\322\246\260\244\374\305\253\307\242\250\277\225\311\226\217\255\257\267\355\315\233\354\374\245\231\364\350\364\330\242\257\260\322\263\332\253\226\352\305\253\270\276\275\261\364\360\301\235\366\242\261\216\363\323\271\201\331\311\364\355\223\243\331\253\333\227\317\324\376\314\325\361\325\230\356\311\213\347\255\325\340\337\257\337\226\366\222\325\342\237\210\322\245\307\217\366\331\367\264\207\350\260\302\214\305\254\200\327\201\346\214\277\371\250\324\363\356\356\260\274\372\377\334\317\201\344\370\244\251\324\331\253\307\231\347\221\274\255\306\334\353\301\250\273\362\266\373\370\302\374") -TOPIC_TEXT( -"\261\370\334\335\211\245\340\363\356\373\234\341\361\314\205\353\235\216\220\212\330\342\250\262\277\241\252\333\214\232\353\205\320\347\225\241\215\204\311\210\205\246\362\270\207\266\341\327\370\303\276\221\316\313\315\221\200\212\240\276\362\345\270\242\257\231\202\272\202\244\366\242\277\347\312\336\215\310\214\345\330\341\233\216\337\222\247\255\222\332\340\231\216\244\226\233\350\353\271\322\371\366\315\237\374\313\200\252\371\366\364\224\357\332\305\365\261\256\250\234\204\377\374\274\273\303\250\342\213\266\363\224\310\312\374\345\307\204\313\376\221\221\334\253\347\234\244\342\350\242\247\234\247\221\271\233\236\325\332\332\212\371\305\254\240\253\321\334\365\301\307\365\334\360\227\226\246\330\202\330\217\231\345\246\340\214\344\367\215\316\257\354\317\356\261\235\342\331\353\326\260\252\256\256\332\223\307\217\232\200\272\376\326\310\326\252\372\261\322\250\323\275\335\355\263\323\300\326\344\243\356\311\334\360\235\341\207\226\307\254\211\343\207\276\233\267\335\313\316\207\210\264\334\362\270\213\344\210\276\357\270\216\303\261\324\274\270\362\202\263\214\344\321\241\341\333\371\276\327\262\360\230\264\356\360\351\273\260\226\274\254\215\267\360\330\331\270\234\220\353\361\354\256\212\366\336\262\370\214\366\370\333\326\255\330\354\327\245\232\313\313\333\270\304\207\343\263\225\246\336\242\272\256\311\234\306\241\307\217\211\352\301\220\231\267\276\371\233\361\241\344\242\202\202\337\222\343\307\360\217\202\342\214\261\246\260\230\326\271\276\217\321\372\215\366\211\363\243\204\336\370\354\364\254\373\301\310\262\340\330\252\332\237\253\250\354\366\225\243\263") -TOPIC_TEXT( -"\300\351\346\361\361\230\217\216\364\260\224\250\222\313\263\305\327\322\216\212\323\230\303\334\247\331\373\213\275\374\347\320\224\263\214\234\236\263\347\304\346\215\207\323\242\311\266\261\266\230\353\211\271\371\311\214\362\344\224\245\222\253\356\237\225\373\314\311\354\241\340\212\326\341\255\212\331\261\204\323\276\244\361\371\264\222\363\211\213\213\356\311\360\230\267\222\203\256\301\261\200\257\370\334\357\270\262\270\251\372\361\256\256\335\323\377\227\263\265\201\234\310\257\340\336\362\272\236\327\347\202\204\324\272\346\250\205\325\325\335\264\262\322\230\202\357\371\253\326\333\340\232\271\353\200\301\314\350\274\321\224\367\271\215\230\311\305\300\306\347\314\273\217\313\215\226\234\217\335\371\202\235\372\327\376\225\214\224\343\276\234\213\343\213\357\341\244\360\370\357\377\366\276\357\201\307\221\330\243\264\262\243\206\315\304\344\274\266\273\310\347\243\270\200\261\330\330\362\305\200\321\213\235\331\377\375\256\223\215\317\346\375\202\216\335\231\205\225\335\211\304\326\277\352\225\275\347\346\334\372\204\351\255\272\332\257\214\312\344\205\263\356\265\376\342\313\264\234\261\241\301\242\337\214\263\345\303\367\270\217\343\327\273\276\200\244\343\375\377\312\341\337\200\363\213\217\314\226\315\332\365\235\250\370\265\217\211\326\372\300\273\324\272\223\303\264\253\225\215\214\367\205\244\226\275\361\330\274\327\336\354\260\212\341\374\377\207\247\336\274\317\375\210\331\374\310\370\344\306\260\276\344\323\256\324\334\204\351\231\327\322\236\256\264\364\224\353\327\277\256\302\216\361\370\324\336\351\266\202\252\260\244\376\240\241\304\316\360\324\245") -TOPIC_TEXT( -"\276\337\376\376\344\267\214\235\320\265\316\364\243\315\213\235\264\236\245\336\233\323\260\212\262\261\353\317\256\354\305\373\251\344\315\331\201\247\231\347\347\305\365\253\377\275\247\270\243\230\244\306\336\365\221\267\223\272\322\227\376\311\355\370\212\360\211\346\304\337\256\256\233\311\361\210\324\365\256\236\276\327\261\246\342\361\312\376\253\207\333\214\356\310\335\260\247\316\320\362\370\300\270\240\257\256\217\317\262\323\237\342\354\273\362\224\232\347\322\274\300\325\326\260\326\303\375\267\345\353\213\266\306\346\313\267\330\375\225\325\372\247\231\317\315\222\302\265\264\247\230\267\261\330\206\236\227\275\344\300\233\306\351\326\205\241\220\242\210\304\212\221\233\223\350\233\221\261\342\317\301\343\264\232\242\363\226\311\312\305\202\242\222\351\322\274\242\262\212\227\323\255\274\316\266\313\305\364\363\254\320\366\207\230\257\240\251\226\203\346\227\322\271\341\207\236\242\223\233\261\223\227\244\245\210\352\367\373\314\252\221\262\356\337\317\315\365\242\227\217\357\232\220\331\214\334\253\253\233\351\230\337\332\303\231\254\276\201\323\342\306\376\216\342\254\237\274\216\253\221\347\225\362\356\341\264\260\222\276\257\204\227\221\217\361\346\331\224\203\236\227\201\307\333\214\270\353\217\304\312\341\370\315\221\301\300\206\360\262\257\211\340\275\261\303\275\320\212\234\361\232\226\263\353\354\350\342\204\200\262\257\351\202\255\321\326\243\374\201\206\236\347\331\232\224\227\232\217\243\261\374\234\266\203\217\263\342\232\207\221\235\333\263\254\241\205\233\344\333\304\265\224\305\226\345\254\207\364\300\336\350\242\241\370\242\330\227\254\201\252") -TOPIC_TEXT( -"\373\237\376\347\234\323\322\232\256\352\351\226\276\347\213\215\236\364\340\211\257\207\233\203\211\205\262\321\271\235\237\351\351\264\276\232\365\337\226\257\260\246\237\202\373\220\323\353\300\266\241\330\270\270\236\313\255\325\320\313\365\377\376\355\327\274\312\233\225\330\311\321\260\252\335\304\313\271\256\271\255\314\211\307\343\237\255\343\256\300\336\274\376\353\277\376\353\342\300\261\357\201\336\305\316\221\230\336\246\364\360\302\346\324\222\217\307\350\272\237\272\370\371\201\222\355\226\366\327\231\220\337\271\205\253\262\326\257\334\347\317\307\370\207\357\217\361\257\264\302\246\244\233\226\255\260\212\212\314\207\304\343\266\354\215\232\225\330\262\221\310\331\301\303\217\300\235\206\245\342\303\313\214\377\340\300\264\337\227\210\210\220\234\320\326\300\362\246\315\253\316\237\230\274\356\300\276\253\273\316\221\364\264\330\220\304\265\354\375\325\326\256\230\333\216\277\216\217\231\204\354\205\255\206\300\236\263\235\203\223\277\234\302\257\253\250\277\245\363\304\310\231\265\261\336\304\357\333\315\223\307\247\206\206\255\261\300\265\234\237\372\251\303\275\234\375\343\243\203\330\224\276\373\342\262\374\376\374\351\263\314\347\317\242\333\357\351\354\275\352\350\235\232\274\305\253\244\366\342\314\252\271\201\205\230\340\326\216\262\243\204\330\247\272\214\202\354\272\317\256\234\225\307\261\316\263\203\351\202\247\232\347\307\364\214\250\251\371\253\306\367\257\225\245\334\344\365\226\226\363\247\347\235\244\261\325\211\235\363\327\231\254\367\271\236\360\302\205\352\233\307\366\322\214\220\266\307\312\375\254\331\243\203\267\341\340\266\261\352\325") -TOPIC_TEXT( -"\270\310\237\316\376\362\344\361\343\276\302\320\344\344\203\377\303\213\254\304\342\267\252\247\333\317\346\306\230\200\346\324\312\323\374\346\224\370\240\350\275\263\327\373\320\305\322\321\243\304\323\365\237\270\337\272\364\210\321\377\213\304\241\225\235\320\306\336\315\334\232\344\300\227\242\241\351\314\346\246\361\206\343\217\303\261\334\325\364\253\371\243\311\341\211\314\242\202\304\202\220\262\217\236\207\217\365\243\340\230\361\272\360\230\225\236\344\227\352\327\261\203\306\307\341\356\343\230\311\206\256\322\363\202\340\361\304\206\304\335\306\355\312\204\202\203\324\226\230\367\253\251\371\306\260\234\241\314\235\273\213\263\265\353\372\235\233\245\361\210\277\306\321\253\342\356\255\310\376\254\306\203\362\203\222\205\260\207\366\225\202\217\330\204\322\242\301\225\262\223\370\214\225\257\364\370\220\365\325\242\233\261\244\332\235\326\307\274\371\346\306\344\276\340\361\355\225\231\211\220\274\357\342\200\233\274\366\236\373\204\237\203\340\350\361\266\253\233\256\273\312\266\247\350\361\334\365\333\226\350\273\216\306\345\251\230\312\320\341\214\311\340\253\215\354\221\345\346\200\231\373\300\267\230\344\340\271\200\351\362\260\240\263\227\317\337\225\307\372\233\367\205\304\343\264\367\370\227\311\370\217\377\371\237\361\377\271\257\257\217\227\220\271\334\326\357\271\211\364\326\345\307\262\240\245\237\320\231\326\317\235\250\203\331\313\353\247\370\310\356\367\301\222\323\303\266\217\227\324\311\207\362\267\332\265\253\270\223\306\226\341\230\361\353\222\326\201\376\346\210\355\352\360\250\276\237\346\347\333\326\255\314\307\306\224\346\335\203\261\360") -TOPIC_TEXT( -"\333\344\336\324\360\271\253\212\221\250\300\225\354\237\274\353\357\274\267\344\227\370\337\350\276\343\244\264\236\362\342\332\374\234\304\207\205\260\335\273\327\201\303\306\261\244\213\357\331\221\236\225\223\303\370\357\316\227\371\237\217\241\263\376\273\327\234\345\257\342\306\245\347\316\260\307\354\327\225\237\257\275\362\376\320\344\275\200\266\303\247\340\203\347\213\247\367\302\362\317\235\336\302\306\331\321\334\371\366\335\313\377\251\215\224\371\366\311\211\262\371\251\221\247\255\315\263\340\247\210\214\236\257\214\254\261\256\376\366\347\340\253\304\373\210\306\376\202\275\301\206\367\270\271\224\341\205\340\231\206\301\261\232\206\236\260\334\376\230\267\204\355\330\277\216\203\250\253\257\207\324\227\210\360\336\223\321\302\343\320\261\325\262\351\232\221\245\367\224\261\352\276\226\242\363\300\335\372\275\254\322\206\266\235\216\342\233\231\267\233\357\266\226\227\231\375\262\364\237\225\327\305\273\242\312\223\262\314\264\222\337\314\304\247\303\303\307\214\244\207\320\206\353\243\257\316\307\236\323\255\303\273\276\242\361\300\231\222\306\322\263\234\210\272\375\360\351\234\231\350\210\214\205\217\321\364\234\372\271\370\224\374\310\310\245\337\235\346\237\307\352\254\232\227\350\314\231\262\261\337\203\267\353\301\253\275\270\246\272\226\213\345\313\202\304\370\247\230\262\272\362\354\322\254\276\262\330\264\354\323\235\302\251\202\241\347\342\310\211\352\354\307\374\264\324\263\367\356\270\257\360\240\303\246\226\251\346\215\350\231\236\346\262\336\313\227\257\230\204\246\241\354\275\262\231\325\256\334\241\237\215\210\241\343\205\217\345\257\310\232") -TOPIC_TEXT( -"\364\273\320\223\266\244\214\203\310\257\344\243\300\370\254\273\313\226\267\260\223\257\330\365\222\340\313\203\277\240\216\356\260\274\307\310\323\261\226\211\210\271\265\300\315\352\215\364\353\325\252\362\213\251\360\301\330\230\241\357\371\247\272\375\232\307\226\352\316\263\200\237\217\357\224\247\347\233\363\243\272\362\304\201\375\310\351\361\240\367\313\217\267\232\217\365\360\377\261\346\325\334\376\215\360\370\307\363\346\315\240\344\276\274\244\223\274\366\322\241\223\264\374\330\255\243\221\245\362\251\233\321\330\246\264\303\271\337\275\357\261\324\206\225\326\361\323\264\373\253\252\314\247\246\342\262\371\213\237\331\250\224\306\205\362\264\332\305\300\277\300\261\273\323\320\267\303\213\333\301\311\236\236\237\313\214\235\276\300\207\313\360\343\327\200\303\217\222\260\240\331\224\331\222\261\242\330\263\373\247\274\217\342\341\347\330\313\263\205\252\244\354\310\257\242\244\306\273\367\331\331\252\305\214\374\251\203\256\204\334\331\336\236\204\344\313\316\376\222\273\314\346\365\216\366\330\311\362\246\232\250\371\223\321\317\352\351\351\204\340\304\227\375\314\200\322\357\227\227\214\233\341\242\376\205\345\304\224\350\255\243\365\342\366\250\205\200\327\217\264\370\343\263\247\251\336\227\377\314\263\203\347\344\242\301\317\216\333\316\250\374\302\312\371\374\227\253\242\306\322\374\346\227\233\213\336\206\224\222\246\360\371\326\236\350\210\262\307\322\346\334\371\335\235\350\366\205\303\333\351\254\275\321\301\350\253\200\275\272\360\226\230\206\326\203\303\336\330\333\351\231\263\270\301\341\362\260\264\247\256\210\341\206\365\345\255\317\244\355\372") -TOPIC_TEXT( -"\274\237\271\331\201\244\306\212\362\323\370\240\275\216\336\251\317\340\352\325\304\363\321\215\367\216\257\226\240\221\302\237\374\326\215\376\340\334\355\244\261\200\276\264\302\324\317\224\234\230\207\354\353\346\270\242\234\253\244\232\362\360\314\216\206\277\336\201\361\330\250\361\241\206\257\371\202\307\200\341\335\367\332\373\255\222\327\316\336\366\323\213\262\330\200\253\354\270\302\316\232\215\277\376\362\244\327\252\223\204\234\261\275\311\367\271\266\370\333\337\315\333\255\262\200\276\345\262\254\225\277\202\371\370\266\264\246\313\233\317\351\234\232\242\344\234\336\241\326\352\326\237\274\255\200\356\233\261\312\277\213\203\227\263\214\235\256\372\314\332\323\226\345\251\277\310\347\323\317\204\355\342\213\235\240\325\253\210\212\243\322\311\202\306\245\260\204\273\217\374\313\255\324\220\324\330\215\275\265\377\233\305\270\240\361\220\363\246\257\245\233\331\305\340\230\311\224\307\267\366\215\273\212\236\363\306\307\363\365\355\202\364\203\370\350\244\344\237\265\340\263\377\260\231\306\377\256\332\324\235\255\336\221\274\371\304\243\222\351\365\246\263\346\231\277\224\216\367\200\253\244\330\232\272\241\343\344\212\361\327\337\222\215\261\345\327\210\217\377\213\213\213\377\376\357\377\263\236\344\223\227\217\215\205\216\374\362\251\203\230\340\343\363\343\332\217\335\243\216\331\206\254\333\261\355\241\364\311\300\240\330\211\266\250\276\264\213\214\276\334\221\203\212\313\355\320\332\274\316\353\316\253\231\243\242\253\320\205\371\255\271\346\232\376\354\332\263\340\203\227\202\204\244\213\244\323\240\241\231\353\271\267\213\271\216\353\327\256\222\372") -TOPIC_TEXT( -"\371\230\274\301\340\246\316\305\363\267\321\212\332\200\346\356\314\215\360\230\260\343\220\262\350\230\234\331\332\315\273\337\345\315\340\226\253\344\272\226\307\310\200\353\300\224\376\244\274\314\234\264\325\344\241\225\250\352\356\312\304\232\244\310\310\223\354\205\216\360\231\250\301\374\334\240\206\305\321\261\220\211\333\225\266\311\302\360\307\316\217\226\235\246\243\270\255\371\276\366\340\352\344\362\354\334\357\366\315\216\205\330\364\242\260\230\311\233\256\244\200\334\251\264\340\246\227\272\356\367\274\220\257\306\271\265\227\277\376\345\212\350\234\272\340\334\270\263\232\367\223\252\265\342\323\203\241\316\251\236\216\240\205\325\212\207\350\336\360\327\271\372\354\215\304\316\320\202\260\261\212\225\342\314\216\321\220\274\363\242\304\337\370\351\251\232\217\233\313\261\367\321\371\317\223\313\356\371\210\276\302\301\320\352\365\365\264\267\356\265\325\323\367\236\266\265\205\211\260\312\200\241\313\327\377\253\247\245\363\305\373\351\221\366\203\254\213\342\236\260\321\334\372\306\334\304\242\351\227\206\231\254\241\222\234\236\343\327\326\257\262\236\247\321\247\230\311\305\320\325\231\371\337\270\262\255\274\256\307\304\301\215\215\223\215\267\355\204\272\317\274\223\233\231\240\247\333\257\237\346\303\370\212\233\376\225\374\226\227\326\207\321\257\305\376\244\300\307\212\257\370\303\200\212\215\300\231\232\272\266\375\337\212\316\267\200\313\225\235\307\306\251\367\306\231\244\217\237\210\305\261\244\351\216\346\355\266\202\200\275\366\264\261\275\254\355\204\374\337\305\266\350\371\305\304\220\277\345\215\370\371\204\254\266\236\324\356\305\306\257") -TOPIC_TEXT( -"\235\236\217\377\333\277\375\233\203\370\275\204\376\343\212\364\212\250\341\250\327\276\365\220\363\322\250\363\203\263\213\347\225\217\332\322\321\217\362\311\251\243\262\254\320\241\332\301\256\366\240\330\205\272\235\246\274\270\303\225\337\374\354\375\366\266\360\377\344\205\215\235\257\310\367\273\305\305\244\320\376\376\263\202\274\304\203\222\255\332\333\201\363\303\213\361\303\316\305\274\274\237\330\320\217\265\222\201\227\342\325\341\330\315\237\237\315\273\366\341\367\361\373\234\261\203\316\300\357\227\362\277\215\261\301\203\205\255\202\245\210\313\362\242\364\332\235\264\261\236\322\361\271\262\343\306\227\200\263\272\231\245\270\370\223\225\253\214\322\266\264\201\215\270\342\344\331\205\326\254\340\342\352\316\274\273\277\324\353\331\275\216\356\342\370\327\203\241\373\304\355\240\353\307\311\364\251\353\303\304\322\373\214\266\301\210\316\234\361\306\350\245\360\333\306\323\235\256\211\215\217\206\264\241\306\317\217\367\263\370\211\300\241\303\360\202\335\316\235\343\230\330\327\315\217\330\275\230\270\215\255\200\316\261\250\215\271\232\246\246\337\201\223\261\255\315\321\374\222\265\334\307\330\276\354\234\216\205\371\373\317\207\235\323\222\216\237\222\351\250\365\375\344\331\243\212\324\207\223\355\274\316\270\300\214\230\335\355\376\303\271\306\343\347\313\271\242\325\201\306\313\201\252\227\332\254\355\234\277\371\241\310\260\344\250\330\260\333\313\353\232\352\257\255\374\205\333\267\313\262\255\373\224\315\302\206\225\234\353\226\322\227\253\266\243\352\330\317\220\247\241\307\307\262\343\343\371\314\306\207\365\215\337\264\375\364\336\360\355\271") -TOPIC_TEXT( -"\272\366\323\222\313\275\365\335\267\233\204\303\223\325\355\243\200\310\217\372\261\371\361\300\305\233\233\277\302\273\246\217\324\365\300\342\246\277\342\255\374\254\357\253\237\342\302\316\303\267\361\337\267\216\340\342\306\255\352\231\264\316\374\351\203\215\327\247\346\327\264\341\276\347\307\332\365\246\335\343\233\260\236\357\340\341\272\216\376\214\340\226\374\202\252\362\355\230\362\212\202\261\265\326\300\306\233\371\337\245\203\232\270\326\253\370\255\264\236\337\354\211\251\366\252\370\216\336\242\310\364\317\363\262\261\254\240\262\374\322\266\273\324\360\330\365\300\245\370\334\321\321\241\205\232\362\344\331\271\277\310\257\256\237\210\370\344\323\307\265\362\313\317\255\253\313\251\347\226\366\345\360\357\350\257\225\302\223\377\325\321\341\276\333\364\360\364\202\330\267\344\370\332\261\206\325\240\375\274\230\311\227\237\234\217\245\352\242\377\273\303\275\340\210\330\351\337\223\307\371\304\326\253\374\230\270\354\277\200\326\354\200\327\326\265\374\260\201\203\222\245\273\316\376\327\340\252\366\356\243\203\207\345\261\261\344\237\345\261\212\331\355\333\303\371\316\276\232\267\377\235\251\316\221\346\313\330\231\264\261\204\232\347\343\363\217\307\330\276\206\216\352\276\333\327\377\205\340\312\305\342\317\306\366\275\361\224\363\261\224\300\355\340\362\370\254\363\270\332\222\334\310\266\226\361\305\226\360\334\223\332\273\333\337\364\236\310\235\350\266\305\274\273\234\335\243\324\362\354\374\333\266\326\267\200\215\301\305\222\325\345\303\202\232\226\303\316\334\311\304\245\307\263\307\355\241\213\251\244\252\206\244\347\262\326\316\304\275\251\243") -TOPIC_TEXT( -"\310\266\370\211\350\234\262\326\254\221\250\342\306\336\206\373\204\301\263\263\300\343\300\362\324\374\217\277\250\250\210\353\310\343\266\364\204\253\376\262\261\272\201\301\330\312\305\213\247\203\203\363\226\354\330\305\334\266\237\246\361\214\307\335\332\252\207\321\365\270\345\300\240\270\200\205\270\372\270\350\275\335\311\355\355\315\365\205\373\367\333\211\343\235\363\351\214\311\303\317\331\213\324\206\222\213\253\221\234\313\276\273\214\213\332\200\206\361\212\225\216\251\360\240\226\263\271\247\265\255\245\201\241\307\370\267\226\311\243\332\316\336\336\374\270\315\243\243\211\366\256\246\266\227\201\315\201\325\311\365\233\370\377\322\253\322\334\231\232\266\254\313\315\235\214\267\326\210\341\312\332\241\323\261\307\262\275\276\361\332\272\273\261\212\372\214\353\342\313\230\240\344\234\205\215\374\354\372\303\340\310\370\311\264\303\236\356\374\315\332\217\371\260\331\327\265\246\215\212\321\351\274\306\314\351\256\322\374\261\243\351\350\272\337\354\217\343\215\365\256\357\371\324\304\361\267\240\346\367\241\272\242\357\316\325\245\217\353\264\202\220\223\252\304\377\222\350\236\273\262\361\376\335\252\212\275\315\327\213\217\235\251\334\221\226\227\250\327\243\304\355\213\200\271\256\372\314\356\271\233\337\267\252\226\207\212\263\210\321\226\254\302\340\201\336\305\373\230\216\205\266\325\364\367\264\373\304\310\220\230\246\352\230\316\352\240\216\316\220\226\362\371\240\250\363\347\277\340\360\246\263\254\272\263\376\302\300\254\275\327\370\253\376\375\347\304\337\340\260\320\330\212\236\266\307\222\275\243\203\272\254\275\202\272\212\214\315\212\303\361") -TOPIC_TEXT( -"\247\343\200\344\364\245\315\215\365\200\214\357\354\231\341\223\230\372\323\270\226\246\264\354\321\343\314\257\243\261\220\343\235\204\231\234\350\360\205\306\343\256\263\254\353\235\344\305\352\264\272\205\301\343\346\331\321\321\325\234\372\236\335\363\247\377\360\242\371\366\230\214\244\356\354\250\366\332\302\250\233\245\257\327\210\273\224\246\360\301\330\301\327\333\260\235\344\224\266\221\213\230\263\360\211\304\341\307\323\271\271\276\344\257\216\305\254\335\340\200\376\361\364\240\273\303\206\214\362\221\245\240\345\327\350\377\275\272\256\220\216\362\222\254\217\316\251\335\357\362\362\202\210\226\350\246\347\201\331\270\240\245\253\345\262\357\357\233\226\350\252\344\253\340\320\231\213\373\341\213\212\212\304\224\235\236\370\344\316\223\244\231\221\215\340\367\226\333\241\302\363\331\327\342\301\274\374\260\264\313\337\216\200\264\321\370\363\203\262\260\374\323\253\302\371\257\264\370\274\337\264\327\355\272\254\352\201\325\247\377\264\246\233\344\343\227\333\242\316\346\222\377\320\202\313\353\274\270\250\312\306\230\336\346\206\253\264\213\217\313\314\222\263\353\225\242\334\256\235\323\253\277\217\215\275\315\332\354\221\251\263\305\323\334\271\271\350\374\313\213\204\234\343\344\335\274\314\336\252\271\204\327\233\347\244\275\346\222\337\314\332\355\313\213\303\242\305\270\330\264\312\216\233\312\356\306\220\324\236\274\332\270\357\300\217\345\334\351\274\305\253\327\205\345\310\344\214\223\202\217\370\233\301\207\334\212\326\226\326\237\216\266\266\271\270\370\274\221\207\370\205\345\217\225\225\216\231\364\337\347\276\263\244\270\215\213\200\257\245\335") -TOPIC_TEXT( -"\271\337\301\244\227\306\237\202\246\244\341\234\204\227\206\233\243\265\314\341\203\305\230\261\237\263\305\202\212\354\340\327\355\200\302\267\203\302\215\224\204\257\316\356\332\264\221\361\221\323\322\223\365\341\333\255\242\241\261\260\212\260\366\326\232\265\256\214\322\300\204\377\270\262\324\365\263\330\367\254\335\273\231\312\240\325\333\255\235\363\243\325\332\365\223\230\353\233\332\365\347\316\216\242\361\306\210\332\361\203\222\365\264\262\221\272\370\211\274\366\312\211\262\364\225\233\225\353\355\352\235\304\310\201\222\321\230\353\275\370\273\212\275\214\202\225\324\377\345\277\264\320\346\305\341\352\365\262\265\317\312\203\344\272\323\363\214\274\256\236\304\337\200\224\351\224\334\205\265\265\217\234\370\234\241\274\210\273\354\255\365\274\273\327\245\243\304\217\263\223\377\365\252\261\237\200\236\305\307\343\311\226\320\207\205\366\367\324\322\341\214\334\324\270\322\244\271\333\300\367\232\350\260\244\310\230\230\250\353\232\213\241\347\243\361\261\230\256\302\221\204\301\372\226\314\231\231\264\206\353\327\352\352\300\345\260\245\340\226\332\272\254\340\225\202\337\201\235\343\266\331\357\227\227\225\361\255\365\356\226\247\375\234\372\333\372\331\270\267\234\232\353\330\233\250\371\302\313\207\213\302\240\244\243\206\347\241\354\233\216\270\314\243\274\364\306\211\302\226\245\346\262\346\310\332\260\352\207\212\220\233\313\216\237\343\371\221\276\277\347\274\226\252\222\224\200\247\257\345\350\314\206\225\205\202\217\251\250\253\316\226\346\362\263\341\340\322\300\247\362\271\272\366\362\262\221\227\236\301\264\276\243\206\237\235\347\263\316\301\330") -TOPIC_TEXT( -"\275\300\373\235\374\212\230\223\352\301\361\340\267\372\372\301\242\344\346\344\257\235\277\371\251\251\213\270\351\240\323\260\373\306\234\233\206\206\233\316\367\377\262\333\326\320\243\242\205\323\236\312\336\215\352\304\211\235\376\300\272\334\361\216\335\240\311\226\232\214\333\311\256\353\247\304\351\206\275\322\237\207\344\310\276\360\375\343\352\347\250\232\307\262\355\301\310\270\341\244\316\266\276\374\355\200\276\363\203\213\202\307\240\246\352\237\255\343\257\327\341\376\322\357\256\367\373\212\370\330\253\275\322\215\257\322\263\340\252\313\264\255\325\325\347\244\317\320\216\245\250\261\332\367\254\257\377\326\324\320\267\375\245\375\207\256\311\371\256\245\272\260\304\243\324\337\323\214\251\346\254\252\314\347\347\210\224\216\214\356\264\246\311\271\367\274\332\313\256\225\370\234\267\206\276\330\253\374\330\225\316\247\260\253\314\336\217\333\233\216\334\350\221\202\200\201\311\311\324\376\303\341\351\272\271\362\241\273\254\356\216\225\364\200\271\327\203\370\343\235\360\211\326\261\243\231\353\312\263\310\214\250\366\352\201\204\315\267\307\215\277\344\374\205\231\274\306\307\206\364\307\211\223\267\240\230\362\334\313\275\337\340\213\261\307\316\274\273\365\324\205\331\322\311\263\243\266\330\231\324\257\340\273\340\325\260\224\203\316\275\244\364\257\242\333\222\305\343\334\307\355\344\322\334\274\230\256\362\375\371\221\255\354\364\247\270\222\324\274\302\342\320\244\352\322\347\262\216\267\242\341\216\305\212\300\236\327\265\233\243\310\247\320\223\270\213\200\246\266\345\212\215\277\316\352\266\214\364\327\362\221\231\271\331\375\324\246\227\254\245") -TOPIC_TEXT( -"\235\215\367\303\351\303\343\261\246\356\312\301\303\245\305\260\343\272\260\377\365\344\205\325\244\351\201\254\222\205\343\352\244\371\306\230\347\310\200\346\372\233\226\371\312\260\260\313\225\341\220\314\344\271\371\354\362\244\277\301\255\372\352\342\363\355\301\212\306\274\346\370\352\242\261\353\202\315\277\375\343\234\247\232\272\272\360\213\316\265\277\203\223\265\367\230\201\226\332\222\371\240\234\214\211\355\220\267\246\360\342\373\222\216\264\255\261\261\350\204\253\333\231\372\216\327\266\371\207\203\345\213\201\327\215\231\336\263\215\315\227\354\233\272\312\270\212\272\234\243\340\266\345\247\242\365\355\217\230\343\217\331\300\310\275\321\363\215\321\220\217\353\377\333\352\326\216\212\317\222\316\335\303\331\316\250\331\232\236\376\310\247\367\323\206\205\243\215\335\365\215\213\210\331\370\274\246\310\351\367\204\333\335\371\367\245\240\336\324\355\205\337\374\375\315\316\373\216\274\375\273\267\354\370\263\312\370\212\366\266\254\364\375\250\277\216\363\337\352\236\361\334\236\331\216\207\332\350\311\271\205\204\242\253\301\243\264\204\274\266\332\230\232\313\216\354\243\244\203\260\372\212\374\257\275\267\254\325\313\235\220\276\275\235\321\217\337\341\316\273\326\325\372\331\334\335\374\211\377\334\265\372\331\372\334\313\361\227\227\360\343\274\356\233\341\307\206\347\333\311\247\311\362\204\232\277\264\347\315\367\316\200\253\277\244\323\373\215\374\364\370\267\354\263\316\252\313\376\303\271\330\320\357\326\325\321\214\205\360\217\326\360\334\366\357\377\375\300\271\330\211\257\303\272\340\352\305\360\271\207\236\317\236\235\277\212\274\264\364\251") -TOPIC_TEXT( -"\252\252\224\253\360\220\357\333\345\366\354\337\274\267\252\217\320\337\272\313\321\370\252\361\200\303\202\376\232\215\277\373\272\353\266\227\370\270\263\373\350\276\317\313\357\206\355\262\207\206\234\275\373\366\204\245\300\270\307\201\265\360\276\374\343\370\373\344\361\343\351\312\263\253\233\375\344\335\346\331\341\374\271\221\350\275\273\270\366\206\320\204\225\353\343\365\226\236\312\210\236\265\313\201\373\333\257\324\377\307\365\254\247\325\351\373\333\334\261\263\275\306\261\344\334\214\263\265\254\261\237\256\322\242\302\225\276\354\330\254\246\373\353\224\275\304\256\200\263\267\247\263\346\300\237\266\302\222\365\267\324\230\305\343\204\347\270\357\371\354\240\230\353\304\262\366\202\225\267\361\300\311\374\342\277\300\202\247\321\326\271\316\310\363\367\336\225\215\237\205\357\362\225\321\341\322\373\222\211\331\370\357\220\362\321\225\243\363\310\302\231\217\231\212\357\244\341\345\343\261\355\344\272\232\323\205\242\271\215\204\346\270\250\262\331\332\242\257\244\374\350\241\272\251\364\334\370\352\322\354\371\367\206\375\322\335\325\302\207\217\353\353\227\216\360\343\263\345\347\352\327\355\255\262\240\331\325\217\354\264\237\240\346\205\372\216\263\265\226\355\316\202\232\340\330\212\375\232\375\261\315\254\327\206\237\355\237\372\301\212\207\226\214\255\270\203\226\261\237\333\243\326\233\202\365\343\307\364\222\244\200\263\240\326\200\305\264\272\357\335\367\373\342\345\322\255\350\207\274\326\267\265\233\256\235\207\376\304\217\205\320\271\224\344\343\374\345\354\247\247\236\237\334\330\205\217\334\233\333\316\330\362\372\375\212\223\254\336\215\367") -TOPIC_TEXT( -"\246\266\304\206\274\327\270\243\234\316\351\244\245\315\317\265\246\302\236\310\307\323\266\360\370\314\237\317\317\315\241\256\320\317\374\313\373\363\225\356\216\306\273\353\335\355\264\316\266\353\205\255\215\325\370\357\356\351\363\252\271\366\315\346\323\300\337\306\267\247\342\264\351\376\274\234\250\276\227\216\226\306\345\272\315\270\226\225\215\320\267\340\240\375\301\367\241\333\265\346\375\273\334\364\334\300\226\367\256\316\322\376\265\364\272\303\240\361\330\301\274\374\245\253\301\273\263\310\335\263\255\273\236\264\273\363\333\351\264\366\354\306\252\256\270\276\364\273\273\340\252\314\343\303\254\252\306\250\203\221\344\220\367\327\256\324\334\304\217\372\375\307\332\220\220\303\265\277\324\370\361\377\217\247\217\377\203\277\370\305\303\305\201\310\323\314\334\264\311\262\363\306\201\250\244\344\203\347\376\305\212\252\316\332\263\206\204\202\241\214\227\215\275\221\227\303\312\317\272\366\355\252\234\352\277\246\253\325\324\336\321\362\253\361\350\317\371\207\371\370\337\332\253\234\204\246\251\252\270\340\345\242\317\216\216\342\340\334\343\315\215\365\351\312\235\263\313\257\211\324\233\246\207\350\205\216\333\340\272\363\320\206\242\362\355\235\336\274\274\370\346\214\210\261\260\374\344\213\302\326\337\205\321\373\257\242\341\214\343\202\206\205\344\277\265\270\324\260\372\306\264\230\320\213\324\340\232\344\261\221\240\303\316\315\313\250\237\274\340\324\337\340\374\361\200\240\317\317\214\360\276\330\212\227\215\214\313\214\361\302\307\327\200\226\201\273\232\245\307\342\303\207\257\327\325\362\311\361\231\237\372\257\350\214\203\361\217\263\306\315") -TOPIC_TEXT( -"\275\374\325\364\337\305\313\337\230\243\372\244\331\310\242\325\235\304\374\262\324\365\246\256\243\337\213\251\341\346\314\361\202\363\301\220\271\244\347\352\254\263\340\340\237\272\254\253\204\243\343\262\202\352\357\264\221\200\326\373\223\361\270\260\235\253\220\352\365\306\304\300\230\312\244\201\340\346\342\214\303\330\317\275\316\362\375\362\216\250\336\225\323\302\220\364\247\343\213\356\243\313\331\265\227\317\204\247\206\212\325\266\334\267\257\256\220\352\226\276\275\200\354\370\325\377\256\341\305\265\352\227\344\232\350\232\352\322\271\375\370\307\357\334\203\260\336\336\314\370\255\270\207\204\242\265\351\340\372\344\221\334\242\330\205\217\233\237\254\251\206\266\330\330\351\214\270\241\366\263\307\335\355\226\234\246\205\227\273\310\371\367\236\366\277\330\324\314\260\353\336\272\266\303\216\305\262\215\307\326\237\321\264\371\305\210\235\217\244\306\303\222\345\314\347\211\234\243\324\333\373\206\223\275\302\345\370\255\237\305\243\375\273\213\267\247\207\251\360\251\361\275\211\372\212\216\307\265\246\243\305\252\363\321\373\213\302\247\247\331\361\205\356\317\233\276\331\315\243\213\304\243\334\326\374\264\210\321\375\240\266\326\366\222\364\354\330\251\262\362\361\201\225\354\307\247\317\263\271\373\334\213\311\273\304\232\366\330\265\321\256\360\223\221\231\263\364\307\326\364\352\361\274\330\213\347\333\376\303\216\356\334\214\231\200\311\312\300\372\277\306\336\271\233\255\337\347\222\235\323\364\243\342\241\303\226\254\331\271\265\354\237\226\354\335\367\262\244\340\230\227\255\253\354\216\335\331\350\205\370\203\220\365\365\304\261\366\243\270\364") -TOPIC_TEXT( -"\305\205\374\253\367\356\330\321\333\323\335\311\353\370\331\323\331\335\247\266\360\331\364\334\211\346\361\234\273\334\241\350\243\323\331\225\347\207\264\316\350\236\342\335\212\246\274\234\244\250\201\334\202\303\262\300\250\342\232\307\225\313\264\225\344\331\376\202\264\356\316\214\202\204\354\261\261\373\350\276\265\375\202\245\244\234\343\242\276\213\270\200\253\222\217\201\276\214\253\357\301\325\312\221\212\326\232\254\304\264\346\200\351\331\245\253\216\313\370\311\301\230\201\206\221\231\206\356\322\304\304\322\344\215\361\225\205\367\222\332\263\375\360\326\264\241\373\350\342\372\206\361\342\344\234\262\374\332\216\221\270\256\314\324\316\340\235\255\217\215\236\303\362\222\343\307\230\305\215\206\367\243\225\333\230\373\273\376\374\251\307\252\222\266\262\253\204\314\327\260\265\330\313\314\267\214\273\275\275\206\237\333\244\344\273\303\326\321\275\274\330\241\245\322\322\322\302\374\305\315\261\326\212\323\310\334\336\274\311\301\234\313\275\231\213\271\277\324\332\363\343\276\373\333\347\205\256\242\314\237\256\241\313\276\327\337\266\252\334\213\316\331\253\364\201\210\217\302\263\340\203\347\367\220\341\342\326\251\276\302\316\374\327\355\234\351\271\344\224\332\334\357\315\302\343\206\255\320\272\347\323\313\211\211\242\327\205\267\200\263\276\222\244\217\260\240\327\273\201\351\372\324\234\200\270\362\243\353\267\257\340\327\301\233\222\214\264\350\230\310\234\277\256\353\343\272\261\365\365\365\234\372\247\270\301\217\337\273\316\223\301\332\263\260\274\266\265\347\310\336\233\230\232\353\322\250\265\243\222\327\245\313\322\370\250\332\212\217\314\211") -TOPIC_TEXT( -"\252\317\347\242\254\206\217\233\373\320\367\246\253\361\344\305\215\276\235\300\251\300\321\226\263\222\363\327\234\376\373\334\230\356\256\244\357\275\221\205\360\236\365\353\272\236\341\345\262\233\203\270\321\243\266\271\276\260\220\375\353\330\272\276\320\357\367\307\344\370\360\337\340\320\207\275\333\267\350\361\377\305\323\227\315\242\203\363\367\231\225\336\356\270\355\207\303\355\225\325\325\347\200\311\350\336\277\320\233\320\221\302\234\342\303\211\265\200\336\332\370\354\273\346\303\304\227\352\261\203\313\321\355\343\343\321\257\364\365\235\301\302\333\371\361\325\213\230\211\275\361\317\327\227\276\252\243\353\330\222\241\330\271\263\246\270\323\212\372\261\371\272\222\203\340\235\317\240\361\343\216\242\360\246\320\317\276\322\327\302\337\215\234\242\332\200\273\236\344\352\223\357\347\354\337\376\373\321\367\225\341\250\203\326\214\351\357\265\321\306\334\270\307\340\314\354\327\341\256\235\326\301\205\311\373\201\222\302\275\230\211\257\322\266\254\337\207\340\221\201\200\331\341\217\346\321\231\203\327\207\321\301\316\214\307\320\247\351\340\310\347\242\317\356\265\211\270\212\271\366\244\267\306\330\334\302\311\354\347\301\203\312\210\210\236\313\214\271\315\350\327\353\357\231\257\301\242\343\375\202\315\215\204\372\325\260\205\200\253\257\226\334\351\236\230\314\341\366\263\302\331\250\352\256\342\235\261\303\264\362\255\305\215\215\300\260\317\247\362\373\362\355\333\267\370\230\201\225\370\230\227\233\326\223\313\250\215\371\324\361\332\263\314\313\231\231\227\252\322\270\220\365\200\206\263\270\350\242\354\217\371\361\377\342\302\256\256\250\277\245") -TOPIC_TEXT( -"\264\305\343\224\344\205\226\267\246\347\214\237\360\213\363\305\235\230\360\271\361\322\336\341\325\253\211\227\260\375\262\346\347\347\255\243\323\257\356\316\214\267\316\231\247\322\231\312\200\330\263\326\305\232\360\256\275\240\230\271\363\205\323\321\251\203\224\266\340\230\350\350\355\276\334\321\363\241\244\346\232\246\225\345\236\301\264\370\201\337\276\341\372\207\326\346\242\253\350\307\255\370\276\362\364\273\215\372\272\256\210\211\306\350\214\340\276\226\204\361\231\243\224\340\203\357\262\336\341\354\216\206\336\257\242\333\353\275\226\243\345\247\317\267\237\360\322\215\264\310\273\246\256\260\341\201\335\231\236\300\272\323\300\337\201\221\331\311\212\320\244\325\360\316\335\321\234\365\351\231\271\255\352\355\227\232\224\272\215\365\211\275\361\352\230\342\344\355\216\226\274\226\377\232\325\323\332\316\325\265\370\263\320\231\333\224\332\257\364\350\343\375\235\274\330\224\221\361\367\254\253\257\257\356\374\272\370\246\345\370\331\346\212\213\200\322\371\227\340\211\321\335\342\207\211\356\205\317\255\263\250\236\374\234\376\224\364\246\222\365\362\370\260\261\276\241\214\226\220\341\340\370\231\251\360\320\203\216\370\237\260\274\216\331\327\335\355\237\300\357\215\222\201\342\330\332\321\361\330\324\306\251\335\217\343\246\236\201\217\270\233\364\270\222\213\306\202\212\307\307\313\272\305\304\352\355\370\330\217\342\344\246\206\253\235\275\327\327\357\316\314\320\236\334\327\233\362\371\321\373\247\346\257\261\261\353\243\314\314\264\220\323\340\246\206\260\256\343\234\255\216\346\345\363\351\243\354\343\255\212\217\226\271\352\265\271\341\246\353\234") -TOPIC_TEXT( -"\255\205\307\333\203\235\260\340\230\326\363\305\246\242\257\316\263\257\332\204\244\371\325\203\366\265\317\365\331\331\222\344\367\372\267\344\361\340\253\352\360\343\364\343\247\215\240\314\200\204\220\314\334\204\253\372\307\243\300\307\203\255\322\303\342\272\311\240\361\370\263\326\257\307\302\221\300\377\341\241\335\241\332\205\353\311\304\344\260\316\372\240\330\230\227\256\356\343\353\350\361\303\217\211\222\321\311\371\320\242\254\321\366\372\310\323\340\217\316\202\320\301\221\311\271\300\227\234\364\374\325\205\205\322\325\317\316\347\365\331\231\345\324\226\202\245\375\221\351\251\234\314\244\277\237\314\355\260\201\307\257\336\246\330\261\345\322\263\321\307\227\220\204\305\334\300\343\364\210\265\203\216\235\327\210\214\364\263\261\250\364\375\212\211\212\365\370\335\234\312\230\220\304\332\214\303\267\334\327\337\234\236\337\331\335\261\302\337\246\357\230\311\273\227\303\363\230\221\250\316\321\370\244\356\376\344\260\267\267\247\323\252\206\270\251\232\270\247\236\323\363\237\215\256\345\212\363\260\315\352\207\223\362\226\330\331\325\330\271\264\221\201\372\234\221\254\235\273\366\210\277\231\355\247\214\363\271\230\277\302\265\213\247\224\325\237\344\243\377\227\241\274\271\254\216\257\261\270\272\265\236\275\252\333\314\346\216\217\303\211\206\374\375\263\374\203\356\307\303\266\217\233\261\272\245\317\374\372\205\370\210\330\203\247\233\236\212\346\360\260\317\343\363\375\224\335\376\316\336\234\345\211\226\277\226\305\316\264\376\343\314\204\332\264\264\256\216\323\353\246\321\334\361\370\377\271\320\226\351\377\260\221\353\213\246\233\273\366\353\245") -TOPIC_TEXT( -"\325\355\253\362\374\321\207\336\340\243\270\326\221\317\262\301\336\340\222\313\260\261\210\231\352\217\232\336\373\366\254\252\325\264\377\342\350\246\326\241\260\334\210\261\257\243\376\231\325\316\255\304\260\330\271\370\275\364\274\216\335\306\373\365\225\346\205\304\354\270\232\340\330\373\346\337\301\231\337\354\263\240\223\224\261\363\201\257\330\327\273\331\207\343\363\213\315\245\224\355\270\211\336\245\314\330\306\202\206\212\245\201\343\316\314\363\343\365\246\335\263\362\303\260\303\361\243\300\322\301\264\343\226\200\200\256\210\343\345\304\265\306\325\373\347\320\211\274\313\270\234\277\236\227\234\236\274\330\332\326\222\220\373\217\303\266\372\306\362\313\323\334\331\330\257\251\331\232\301\204\354\205\332\234\277\246\354\343\255\316\226\377\347\214\237\225\235\251\374\231\323\266\210\315\266\373\363\306\277\303\237\232\261\221\310\363\234\272\256\260\313\217\257\306\223\236\307\274\212\264\224\221\340\324\272\361\360\225\247\224\372\261\210\272\353\335\262\244\340\304\233\207\217\335\256\252\214\230\272\350\221\334\354\304\276\335\204\237\376\265\375\307\336\356\267\316\305\312\362\243\216\230\355\220\270\226\201\225\342\203\232\200\234\262\326\324\263\230\364\317\204\326\254\221\272\343\244\253\305\223\331\214\207\205\333\363\231\207\307\210\337\243\305\236\235\260\266\351\244\326\254\371\366\206\307\373\251\231\225\216\336\212\365\352\215\243\206\236\223\223\263\224\361\341\370\240\226\277\352\352\231\256\376\362\326\230\311\202\340\340\274\347\226\326\214\274\232\225\243\210\305\250\322\343\255\221\227\307\216\241\226\256\226\361\332\243\343\336\306\362") -TOPIC_TEXT( -"\230\352\331\342\253\261\347\212\330\200\234\245\277\356\315\334\314\373\225\205\276\372\201\352\332\273\307\215\324\274\363\347\316\263\201\341\342\360\205\310\230\363\254\300\315\254\324\231\266\233\340\264\243\254\371\241\215\336\200\343\216\341\360\366\360\322\207\210\270\221\330\311\367\272\311\226\261\223\323\224\260\247\251\374\270\246\320\370\362\224\210\343\201\374\304\202\234\220\347\261\277\300\273\226\340\352\221\221\330\335\370\234\367\326\232\323\215\370\350\223\347\224\243\217\323\345\240\347\356\247\374\333\271\272\235\315\230\215\221\202\202\220\262\345\311\361\244\376\305\363\215\310\254\203\374\274\364\240\305\233\204\307\312\364\347\362\246\226\336\240\236\223\262\261\243\353\302\375\214\207\340\225\271\365\323\261\214\367\261\276\342\307\221\261\223\246\247\327\257\203\225\223\314\312\207\313\265\223\200\215\244\330\216\321\374\223\370\304\307\253\353\277\221\272\370\235\217\241\310\340\306\263\255\326\365\224\205\350\324\266\257\231\240\266\356\352\236\310\330\220\245\372\340\345\301\266\327\354\253\275\203\334\226\300\364\214\333\261\261\230\213\203\273\313\265\235\320\344\215\377\202\252\311\315\201\215\374\377\355\340\210\374\362\273\234\212\236\233\207\202\374\370\350\207\363\206\375\315\276\363\302\343\241\241\234\241\314\357\332\363\365\347\320\333\343\360\274\246\331\254\350\236\240\205\306\311\310\224\313\225\350\352\275\332\374\264\353\210\261\226\226\330\261\203\321\345\200\362\336\232\302\354\226\372\230\374\202\306\343\217\254\253\316\244\200\306\255\343\232\364\304\224\254\210\333\327\365\313\260\200\245\265\210\321\233\365\353\210\220\304") -TOPIC_TEXT( -"\243\253\374\234\343\234\361\376\200\201\214\226\301\334\310\272\366\342\307\317\356\235\270\304\270\362\375\303\241\367\301\276\253\201\245\231\361\331\373\251\201\263\367\223\316\212\231\336\264\252\227\354\364\247\274\236\306\360\317\362\256\235\253\262\321\317\234\356\201\362\354\246\247\357\200\216\215\330\256\304\364\366\320\223\211\312\362\261\261\314\250\264\236\244\247\221\344\357\205\376\370\354\325\214\321\373\226\254\347\302\255\354\233\344\233\303\372\365\324\345\263\224\233\330\350\306\306\245\316\205\270\302\334\247\306\365\343\352\347\274\250\260\251\334\317\372\365\221\307\332\215\367\362\330\253\350\240\361\204\301\302\214\222\247\246\312\330\330\376\204\362\306\217\342\270\306\306\376\272\212\226\231\265\331\307\217\250\370\212\200\275\300\331\345\213\313\226\311\345\235\271\361\333\306\371\242\342\362\243\227\240\201\200\343\305\251\375\243\326\370\314\217\234\373\360\373\270\330\205\237\201\315\230\217\354\262\367\356\317\353\201\307\362\264\215\300\350\361\362\317\314\337\344\270\205\246\344\346\235\230\203\222\265\220\205\370\240\330\303\262\246\244\320\242\267\215\244\272\250\366\331\332\353\313\200\366\364\377\346\306\302\200\222\303\376\264\361\271\272\266\254\316\331\362\305\304\200\337\342\260\276\262\243\317\231\360\325\370\230\325\300\364\330\227\323\327\333\215\271\340\310\344\347\344\262\341\205\347\213\242\351\260\206\341\335\241\206\264\236\301\240\241\220\314\275\326\363\321\254\263\243\254\310\360\252\245\304\302\337\306\355\214\271\364\331\246\245\360\272\304\220\231\357\370\211\223\310\247\222\223\272\364\215\253\235\210\233\242\220\234") -TOPIC_TEXT( -"\261\367\203\317\370\227\306\322\341\300\266\253\250\254\264\342\363\361\300\237\205\331\261\225\274\366\247\251\315\224\212\236\323\373\301\234\234\236\207\267\237\325\352\202\264\263\350\234\373\256\237\274\343\344\272\374\275\377\247\362\362\300\320\320\224\301\314\375\303\203\265\222\271\234\333\220\373\227\224\316\314\355\357\332\313\237\372\327\221\366\306\262\311\316\303\317\255\317\337\364\231\366\236\272\265\327\376\337\312\313\315\331\270\366\261\303\244\210\371\246\362\347\257\214\235\300\352\270\274\300\242\342\340\307\302\207\307\260\317\234\301\366\276\341\352\332\240\370\366\256\375\335\254\341\320\267\257\270\371\352\377\317\233\366\256\374\272\373\327\257\243\377\317\377\313\216\211\227\277\246\236\235\227\261\306\215\345\360\230\220\234\220\217\231\306\306\307\346\264\365\321\254\254\240\277\227\366\355\372\207\254\327\244\204\307\326\306\334\226\326\226\234\262\334\246\271\242\337\357\341\256\236\336\261\367\255\343\366\261\316\302\302\221\270\253\231\327\214\313\310\342\373\217\361\321\341\374\205\307\253\213\203\243\240\350\360\312\230\343\324\314\370\234\317\240\234\212\340\260\225\300\250\201\340\306\241\213\376\305\375\271\335\304\377\345\366\255\241\223\253\204\320\260\315\215\237\373\243\326\204\340\266\255\255\241\315\270\315\276\370\314\222\320\274\374\305\342\201\223\224\344\352\364\342\261\327\307\267\307\357\275\367\236\267\256\303\220\250\343\347\336\257\322\270\243\306\336\322\306\206\203\243\256\241\344\375\207\362\212\212\243\255\304\314\360\262\256\333\316\243\314\230\220\374\354\276\211\234\305\246\220\365\241\315\311\360\370\373\221\331") -TOPIC_TEXT( -"\231\204\341\216\307\200\260\303\364\301\347\306\364\350\202\364\311\306\375\271\366\215\274\341\241\353\346\254\215\247\273\224\243\212\375\264\374\304\302\347\352\332\237\351\213\306\272\242\216\207\316\252\246\354\233\327\217\245\314\313\332\273\272\303\375\314\376\265\304\342\300\367\215\314\325\324\273\335\376\240\347\264\242\201\343\301\375\355\370\354\354\237\310\311\260\204\331\354\222\327\337\332\207\360\354\325\244\320\274\276\373\347\314\265\303\265\355\320\335\321\246\330\302\330\237\315\275\207\347\234\250\221\257\333\367\247\346\303\237\316\253\270\254\263\342\203\323\256\225\222\236\307\313\374\327\217\213\307\306\341\217\376\336\234\275\307\372\325\367\275\304\343\346\312\324\272\312\335\375\274\210\271\253\365\352\356\316\255\253\234\200\327\375\342\246\235\321\202\363\232\373\246\235\372\360\320\245\262\263\305\217\257\232\220\367\370\375\366\254\266\327\264\340\266\221\222\354\373\264\320\246\324\262\323\203\341\307\251\216\344\244\332\370\233\275\254\205\243\201\205\327\317\266\375\335\220\300\213\357\256\223\377\365\354\336\357\206\244\244\201\241\207\251\336\264\271\264\252\220\240\247\340\345\331\240\327\336\217\277\305\274\360\213\374\372\256\225\237\225\326\376\362\356\322\310\234\321\321\371\366\353\326\340\230\335\200\201\321\342\204\317\374\306\270\363\360\341\330\356\317\351\227\257\337\314\276\272\357\243\332\261\262\327\332\317\314\221\213\250\326\334\273\363\373\377\262\272\245\317\371\353\251\211\230\353\352\236\274\303\217\340\236\334\261\273\273\373\315\315\376\302\247\207\237\363\300\303\311\256\247\324\262\300\243\251\222\254\252\366\230") -TOPIC_TEXT( -"\203\257\242\334\322\213\237\333\216\243\260\354\220\262\200\330\351\242\344\206\233\213\217\271\321\310\356\212\235\255\200\206\344\336\361\355\261\235\307\227\220\375\354\264\233\346\271\343\274\204\240\360\254\317\234\276\342\204\217\361\354\310\371\345\305\370\207\274\343\304\361\204\244\205\241\342\265\230\233\370\214\367\270\354\237\353\321\363\354\372\373\221\277\306\256\343\260\375\361\320\334\344\225\365\374\242\350\237\256\235\213\325\350\363\356\312\301\323\220\214\266\301\270\373\313\353\363\367\265\213\363\307\261\301\214\374\203\277\215\306\340\271\200\346\325\352\262\256\275\312\314\362\362\245\214\202\315\301\267\240\333\327\255\271\343\220\255\221\231\354\230\250\233\317\251\302\371\200\206\351\203\234\351\276\340\274\220\225\213\274\316\321\362\316\355\271\344\242\225\265\324\320\225\215\334\322\370\222\227\203\360\216\340\335\307\277\201\307\266\322\233\217\205\254\235\305\376\206\203\307\327\201\215\317\220\366\236\366\347\343\214\337\312\236\370\323\316\374\306\326\251\205\311\264\372\205\204\374\361\244\276\217\226\234\347\223\231\300\343\221\347\327\325\260\331\222\260\351\331\370\262\274\263\307\306\327\355\315\327\262\212\301\310\216\275\213\213\205\212\255\205\201\267\322\356\335\337\255\237\261\244\210\353\221\352\251\300\222\331\230\234\274\212\347\367\316\306\200\247\244\234\275\361\261\262\234\353\265\312\267\254\310\316\365\274\245\347\322\372\260\251\251\275\224\317\334\246\232\353\257\201\321\366\311\241\350\347\361\261\370\216\350\321\301\274\374\234\201\366\260\247\345\311\353\372\300\367\337\215\274\361\355\207\300\336\211\240\205\346\207") -TOPIC_TEXT( -"\340\332\347\324\201\214\233\244\214\345\277\332\317\260\242\245\342\324\302\275\273\357\277\375\277\225\210\372\366\221\225\347\307\205\202\214\211\370\261\224\213\227\355\306\236\205\357\262\301\237\256\217\221\311\204\221\273\334\360\240\200\206\260\300\247\311\364\217\237\334\236\237\234\246\223\346\225\274\337\306\314\272\370\335\311\216\317\236\316\272\324\352\352\245\227\233\331\305\206\257\365\200\344\327\341\267\342\371\324\236\274\265\357\321\337\303\360\302\237\265\314\230\214\241\375\311\374\342\220\262\323\213\257\261\351\213\365\215\324\375\206\365\336\346\365\223\274\232\365\341\203\332\217\263\261\274\350\361\212\336\262\337\322\270\217\274\315\244\337\274\220\370\252\245\345\217\327\270\217\277\242\317\231\320\315\200\257\346\371\225\367\310\314\265\360\315\302\206\370\357\330\261\233\203\333\371\335\361\330\306\365\375\222\212\314\373\256\276\335\316\340\225\252\326\263\256\354\312\356\316\252\371\371\345\375\231\305\232\204\214\317\376\201\374\343\203\262\344\300\350\254\235\337\241\257\363\206\333\344\260\236\343\334\335\273\363\264\306\340\231\351\257\216\211\224\337\351\327\361\322\206\274\247\246\253\234\237\301\203\364\267\237\302\362\312\352\301\373\307\350\370\212\257\366\360\276\231\260\242\370\370\323\277\306\366\313\343\311\314\361\273\322\363\200\235\201\203\300\374\330\340\270\343\376\343\355\314\327\355\323\363\370\324\200\204\234\375\220\203\331\262\362\372\204\311\264\265\222\305\343\255\316\357\377\362\345\213\324\330\246\333\257\253\241\240\367\370\327\333\316\255\227\316\227\317\334\314\214\252\351\237\350\307\240\313\203\250\307\206\302") -TOPIC_TEXT( -"\331\253\275\227\273\225\312\200\202\334\213\236\335\220\311\223\310\254\207\231\340\322\207\321\235\216\336\354\306\200\306\342\303\313\335\264\360\361\335\231\321\230\307\253\216\204\246\333\243\352\264\230\373\310\225\275\326\225\373\323\342\225\330\215\273\323\265\243\361\213\337\210\351\320\310\207\214\223\360\317\253\312\250\317\325\327\235\343\320\210\321\376\254\265\275\370\267\231\246\373\210\303\202\214\366\341\322\313\200\245\216\205\366\312\341\245\236\210\255\246\212\331\277\260\253\215\315\353\267\354\272\337\273\341\333\352\254\257\372\323\257\347\367\362\377\374\374\267\320\261\316\263\223\202\262\345\312\226\264\375\237\306\301\351\252\362\202\230\203\357\336\374\326\374\364\351\223\321\307\305\322\362\326\374\331\225\303\346\236\275\361\216\305\371\240\362\352\352\341\213\256\301\245\233\311\233\300\262\237\216\304\247\301\313\276\345\301\300\301\371\361\233\261\331\230\250\243\266\360\347\255\303\246\235\241\310\350\366\260\354\307\210\250\235\203\330\266\321\230\303\231\277\361\222\346\325\350\244\317\255\302\201\323\347\334\226\204\270\227\270\214\334\317\223\337\226\244\270\261\236\223\360\240\224\233\257\347\220\321\353\317\212\307\341\230\214\243\247\324\313\353\272\316\324\334\350\204\236\356\357\231\355\360\215\226\260\366\261\303\337\257\234\303\202\306\265\276\300\317\250\212\254\262\266\340\337\302\256\246\304\247\201\376\211\303\362\361\221\353\367\261\205\221\235\216\267\202\217\353\270\335\354\230\254\246\330\313\352\230\342\374\242\303\301\371\272\246\211\250\276\246\272\201\321\354\322\244\323\347\220\232\311\256\354\362\374\264\361\337\300") -TOPIC_TEXT( -"\330\335\202\264\232\326\365\346\345\360\302\335\274\273\303\226\220\217\376\347\246\307\301\215\254\306\224\233\321\217\270\361\261\354\210\273\247\361\250\305\376\237\300\255\241\250\216\237\341\254\273\356\212\271\224\374\325\222\303\375\375\275\315\265\227\317\374\236\276\230\273\357\353\355\334\260\203\217\277\310\336\267\346\257\347\253\203\205\271\260\322\223\305\307\262\344\275\236\205\273\214\354\342\245\370\277\266\362\270\350\354\336\357\334\276\335\307\262\360\235\351\261\367\246\340\221\225\231\371\202\272\271\203\375\335\350\241\200\233\245\340\314\327\262\367\254\316\330\300\227\341\373\207\210\312\352\301\212\375\225\216\246\357\263\315\367\272\267\301\325\334\200\362\272\240\213\212\363\373\301\322\301\224\226\247\354\345\220\222\346\247\216\207\332\277\260\363\345\245\247\360\207\375\363\363\366\242\253\325\336\260\362\326\353\252\330\273\317\262\252\326\331\301\230\276\240\354\212\302\306\325\242\361\234\356\351\211\254\210\236\231\351\354\233\214\237\240\334\355\225\273\303\277\201\323\246\222\347\304\207\252\266\252\345\317\375\256\357\311\322\242\242\256\325\300\275\355\376\242\252\255\365\237\260\314\204\214\210\310\227\271\234\334\214\357\275\367\236\215\335\353\206\362\225\226\343\236\260\247\310\377\212\204\226\255\357\265\247\246\226\205\202\241\350\366\203\260\347\216\244\237\223\223\225\223\347\326\322\314\332\372\366\361\203\376\205\253\235\277\367\267\253\362\362\377\360\371\375\372\346\306\275\221\326\201\371\271\210\271\247\376\313\212\331\346\214\317\334\360\367\215\301\371\255\355\372\253\340\210\276\222\354\210\270\204\340\347\221\243\335") -TOPIC_TEXT( -"\237\244\234\241\363\275\332\245\324\337\317\322\366\370\341\275\352\233\343\340\222\353\355\353\330\264\312\351\243\265\226\377\361\336\273\326\300\334\327\335\271\227\225\367\262\316\262\231\226\327\262\273\246\341\234\251\311\307\320\354\204\275\221\247\341\270\254\206\340\230\300\314\234\342\316\316\310\222\316\375\370\275\223\360\330\230\310\342\364\263\376\253\223\217\314\230\276\324\373\320\333\234\334\215\334\330\353\274\240\324\223\211\243\344\321\332\307\237\331\323\200\244\223\340\245\242\374\354\314\315\240\333\343\307\227\271\371\302\242\375\207\204\332\200\236\335\217\353\356\271\206\333\360\376\302\372\331\270\305\343\322\236\360\263\302\343\340\250\337\360\200\257\271\355\354\252\344\224\305\270\311\273\310\305\302\206\201\253\335\202\310\330\204\234\201\204\214\324\316\242\331\257\345\240\205\304\343\343\216\216\250\200\244\244\307\235\335\343\374\201\343\231\331\307\341\241\270\320\333\373\323\345\372\253\360\227\340\206\236\257\333\274\277\355\362\305\312\216\326\206\276\330\337\365\216\351\314\227\316\323\260\244\341\246\307\361\355\277\356\236\373\233\203\215\326\247\317\377\222\363\231\274\201\327\334\337\307\371\344\352\363\212\202\241\201\306\230\240\345\272\216\363\342\216\346\345\317\243\235\337\266\365\213\275\313\301\273\366\256\202\360\242\257\307\211\304\352\306\201\314\274\336\274\267\212\341\322\241\330\274\265\226\332\270\341\203\375\225\240\377\334\312\263\300\245\302\202\306\234\350\220\366\267\320\247\360\235\353\202\373\247\361\225\263\227\203\345\312\350\351\351\352\273\371\345\345\255\341\327\250\226\226\373\350\337\371\235\310\374\370") -TOPIC_TEXT( -"\257\354\320\344\261\215\266\266\362\301\214\332\232\361\357\250\333\347\244\211\354\266\264\222\376\351\340\200\373\377\305\213\360\363\271\332\325\253\316\226\235\316\200\327\344\205\265\306\250\323\275\234\342\370\204\316\263\363\276\325\272\350\356\260\244\214\241\360\333\362\336\224\237\257\346\350\232\217\221\377\253\253\311\364\262\372\223\221\227\362\243\334\231\351\312\377\365\327\236\377\305\347\316\314\365\372\267\373\355\267\371\257\271\352\220\352\361\201\346\375\347\256\230\270\271\234\230\220\265\236\323\214\215\216\216\204\372\272\200\272\332\215\237\246\306\336\326\353\327\256\342\336\245\303\247\231\230\240\272\261\372\211\377\316\332\370\250\245\204\366\340\372\301\321\360\353\357\263\370\356\317\340\260\226\247\300\346\273\357\334\350\361\242\304\350\215\343\330\264\260\322\274\255\240\233\245\344\370\212\373\303\313\254\322\230\316\231\330\314\330\327\337\306\320\324\347\264\313\346\310\336\227\274\274\237\361\332\325\206\312\307\356\335\231\301\343\372\371\213\303\304\222\214\271\255\237\267\362\320\233\320\265\317\343\261\225\305\320\262\364\303\204\335\220\327\363\245\246\316\230\210\301\330\341\232\315\212\241\216\207\341\231\361\265\256\226\336\300\313\220\224\213\326\342\361\207\226\253\333\350\264\363\361\240\302\317\315\214\257\251\266\246\364\341\310\250\303\254\301\306\201\214\244\211\330\354\272\321\346\213\210\307\222\217\306\236\377\227\342\223\377\227\375\222\315\257\230\343\207\227\246\310\377\201\350\235\261\274\314\211\363\314\217\203\374\376\374\371\223\375\273\323\343\303\335\264\376\203\217\277\334\262\263\263\317\255\361\316\314\270") -TOPIC_TEXT( -"\255\355\305\312\225\256\326\325\331\341\364\332\212\344\354\336\357\366\216\227\344\261\257\201\272\262\377\376\226\202\242\350\211\250\304\265\252\361\376\200\310\366\300\251\306\254\261\251\227\307\362\204\207\316\216\332\274\327\223\253\350\263\342\320\257\226\310\266\306\223\222\373\342\324\220\202\203\243\231\220\314\266\364\200\255\340\264\205\243\362\333\324\243\254\327\242\275\311\325\330\317\364\326\300\370\326\335\242\245\375\352\374\235\326\351\253\245\260\323\267\316\231\250\374\342\213\236\227\335\327\234\360\210\370\304\277\364\210\317\335\310\224\275\312\216\211\350\365\275\273\374\226\266\226\250\312\275\273\312\224\357\332\330\351\305\307\213\336\262\354\267\310\341\242\215\353\327\331\306\243\232\371\225\242\250\323\264\347\225\373\326\220\234\272\240\260\244\344\206\236\317\276\201\272\257\301\221\242\205\220\373\211\305\316\310\245\302\353\330\315\353\202\270\246\265\311\250\202\340\343\246\315\211\357\230\266\223\306\251\344\240\313\362\212\331\312\227\337\333\323\352\251\337\202\250\360\276\244\274\334\235\356\270\212\362\323\340\322\276\222\247\267\267\360\253\330\222\225\240\316\335\300\210\312\230\257\243\271\342\314\332\305\330\216\364\302\215\313\264\241\374\212\306\275\364\240\360\217\341\203\332\250\267\333\333\225\215\257\234\377\224\355\215\311\202\310\277\254\344\231\221\364\244\214\324\334\261\362\242\205\254\353\324\261\250\354\267\377\301\330\363\235\367\332\305\331\360\335\360\240\273\345\335\216\233\233\233\337\230\335\354\343\253\330\340\314\275\204\330\234\344\210\215\336\214\303\273\330\201\341\272\332\201\374\213\241\276\243\356\203") -TOPIC_TEXT( -"\320\347\217\231\271\303\327\216\374\363\275\256\356\321\377\221\326\200\243\261\222\264\317\331\344\257\235\372\376\351\265\200\370\254\311\276\342\366\251\364\264\351\320\374\360\314\360\216\274\272\347\245\333\212\337\361\216\221\210\305\236\212\205\236\275\372\244\270\262\320\316\263\360\370\301\347\327\373\272\332\233\246\306\357\335\240\255\214\236\243\321\211\366\255\205\262\373\313\314\252\346\245\321\263\314\263\331\202\250\342\305\247\200\215\214\364\243\207\355\224\362\221\315\235\330\237\235\255\242\306\255\217\236\206\251\365\317\367\305\241\232\251\222\245\217\307\343\371\225\321\264\312\343\261\270\321\234\212\204\354\304\343\363\230\256\340\302\266\267\237\211\220\216\263\250\230\377\201\261\335\350\363\375\235\374\213\352\314\343\257\340\333\246\363\321\340\235\343\201\247\203\212\275\261\226\350\343\350\246\226\240\227\253\376\267\356\351\220\216\260\355\266\255\333\222\222\325\345\340\324\207\200\207\333\307\307\352\330\376\252\301\305\257\335\313\377\251\354\305\373\351\233\326\375\274\272\353\313\202\357\366\227\372\251\313\343\264\276\376\321\320\304\225\360\240\213\240\272\300\272\365\347\207\315\211\232\204\327\220\337\215\371\342\202\236\217\236\347\221\251\327\220\274\226\315\275\223\371\351\321\306\377\316\334\314\326\341\304\262\340\200\341\341\212\306\207\262\237\367\310\312\271\302\204\313\323\332\217\346\340\354\231\254\204\203\361\372\224\206\277\326\303\232\205\273\365\366\257\214\265\367\215\331\263\252\204\336\231\204\221\303\306\242\370\323\343\241\243\234\204\311\322\206\223\245\354\372\254\241\331\224\367\361\251\223\331\235\336\333\202") -TOPIC_TEXT( -"\370\214\212\216\251\215\225\267\217\325\311\273\226\334\320\216\341\226\203\242\246\335\237\234\341\250\252\262\316\276\365\255\233\357\310\334\365\335\213\356\344\340\330\361\355\375\363\233\241\354\201\366\227\213\350\337\375\233\220\255\233\215\310\326\221\210\237\214\254\360\367\360\230\327\376\343\206\304\215\223\263\342\341\213\235\244\344\320\361\352\342\365\321\262\261\211\247\351\276\205\260\244\361\330\251\246\232\212\350\205\313\321\277\254\332\311\304\334\206\234\354\254\270\325\331\331\371\370\361\343\220\237\274\356\357\255\227\274\353\376\361\356\246\344\366\305\361\320\356\357\337\377\201\253\205\353\230\275\255\200\230\274\222\231\266\311\230\220\214\343\264\264\202\325\252\302\266\327\257\231\312\242\204\317\340\323\356\365\325\271\323\247\217\323\350\311\342\371\267\354\260\241\334\243\335\322\261\263\324\225\354\250\346\342\203\374\260\214\215\263\350\224\306\343\347\361\362\250\315\365\222\366\220\273\262\357\245\310\306\260\266\254\372\240\237\230\337\333\325\206\240\275\227\351\213\374\244\356\246\263\376\221\304\326\320\374\325\262\373\366\227\344\231\217\242\307\251\374\225\244\320\202\216\307\306\337\215\354\205\321\274\237\255\302\370\202\341\223\375\251\240\361\275\217\377\241\363\371\223\377\251\372\364\337\300\251\323\334\325\331\361\265\237\261\231\222\343\207\253\255\347\205\314\361\321\306\230\230\214\225\355\232\353\257\271\241\376\371\366\201\345\354\302\320\343\343\273\323\245\213\323\247\314\353\373\371\362\205\257\225\221\254\330\271\335\216\317\251\307\204\205\257\370\325\270\361\245\230\221\313\234\363\361\336\207\363\322\324\332\260") -TOPIC_TEXT( -"\274\346\331\225\275\275\207\271\373\362\214\356\374\253\361\370\354\364\360\220\207\237\347\263\366\362\364\334\214\374\347\377\371\371\307\331\312\213\326\222\307\341\217\261\242\302\271\253\223\367\222\237\303\343\226\261\264\306\253\346\354\354\371\367\274\311\372\261\222\305\273\224\306\322\244\370\314\320\313\327\200\275\274\366\214\227\326\347\237\377\203\256\357\246\264\240\271\337\315\357\331\260\373\350\311\341\346\261\300\330\325\313\326\307\241\350\306\346\360\205\336\237\252\276\270\315\251\231\334\257\264\365\235\375\243\267\272\301\203\332\316\334\252\361\243\343\236\231\330\221\252\316\305\247\201\234\264\232\365\233\226\375\376\267\226\246\341\340\260\232\273\206\314\301\307\247\363\212\224\215\274\276\373\307\362\273\222\364\214\334\331\262\354\254\227\377\202\204\214\362\347\265\312\275\375\237\323\345\211\341\317\261\370\201\235\370\214\220\336\343\227\315\316\227\332\356\327\202\307\256\222\375\277\374\371\360\303\300\345\212\356\366\227\206\311\361\301\206\207\344\375\256\234\225\227\236\333\306\241\265\237\202\262\231\332\227\205\266\335\254\214\263\306\317\226\304\274\304\327\300\313\340\305\247\274\320\244\347\202\256\362\300\310\321\275\212\227\215\263\374\327\244\333\221\375\364\274\262\211\275\353\316\242\321\307\206\367\330\250\216\205\264\303\353\355\352\204\317\202\333\231\344\301\363\331\351\317\317\225\226\224\323\225\214\335\262\236\244\351\350\361\346\343\331\251\206\223\323\272\271\370\221\222\263\370\304\236\222\342\346\274\334\302\266\362\365\354\230\222\321\300\247\246\250\216\315\260\307\361\336\356\216\204\317\345\244\302\305\223\237") -TOPIC_TEXT( -"\377\243\211\256\347\207\336\266\372\341\270\364\261\315\335\203\344\344\271\274\323\342\350\336\355\261\200\243\330\305\240\331\227\240\244\206\244\323\255\331\371\375\271\371\302\366\251\314\356\204\231\315\342\214\305\350\342\251\263\265\200\313\302\317\221\252\234\214\242\226\305\260\344\256\236\226\361\326\324\302\374\216\335\342\376\232\315\270\206\232\310\246\341\314\270\326\211\307\237\271\243\310\360\316\235\273\330\360\275\343\316\315\233\375\214\335\235\255\326\345\226\233\365\235\261\274\207\367\243\304\351\341\354\330\277\216\337\352\324\240\231\234\276\234\304\334\211\346\357\300\254\205\356\325\221\266\266\242\317\301\206\212\344\307\300\264\345\334\215\227\220\367\300\201\212\326\360\317\245\313\216\343\227\361\231\355\243\332\270\306\316\207\356\240\325\234\235\257\242\244\231\262\350\305\217\301\367\242\330\340\254\326\364\345\350\217\255\326\265\235\342\334\254\256\375\265\232\350\271\347\264\301\330\213\362\234\256\365\302\276\273\332\337\267\350\204\223\264\261\366\265\230\265\221\363\313\346\246\371\376\342\316\303\221\241\213\352\325\346\364\364\352\221\347\261\220\326\262\367\315\305\333\341\202\354\314\243\241\203\377\276\201\306\370\233\213\350\275\375\246\260\273\370\235\234\301\326\225\230\303\256\325\207\217\357\215\340\212\204\364\217\257\223\326\234\237\235\264\202\346\257\274\236\364\341\254\247\302\213\316\350\261\263\326\257\367\315\262\261\200\231\211\356\342\340\353\245\230\263\322\227\264\213\311\212\324\342\306\246\366\345\302\200\253\240\253\364\346\354\326\220\302\253\331\372\367\271\344\261\267\350\227\371\320\320\336\370\354\224\215") -TOPIC_TEXT( -"\262\274\221\307\306\361\250\326\320\256\342\276\264\254\332\230\316\266\267\256\326\317\260\237\256\340\323\366\236\244\371\356\374\311\251\361\343\306\260\361\330\366\370\243\247\364\334\214\247\333\364\364\207\201\300\320\353\305\316\215\264\210\260\372\310\355\356\257\372\256\274\323\270\367\244\377\201\225\323\307\342\310\256\314\246\230\216\342\320\324\353\220\200\306\341\344\212\220\360\337\237\234\341\300\366\364\317\304\200\206\344\355\333\267\343\344\356\333\251\221\327\342\251\226\344\201\342\205\353\341\335\245\304\257\274\320\321\352\304\302\241\351\372\371\325\326\203\263\222\330\357\215\332\342\323\203\323\267\340\231\210\300\214\356\352\250\303\245\344\325\231\375\256\334\211\361\227\313\263\324\201\357\261\376\302\201\227\347\250\212\202\206\204\255\332\374\304\320\324\210\324\307\362\320\213\301\262\372\254\321\323\363\217\213\343\341\275\377\264\351\264\264\274\224\227\344\377\354\223\316\313\363\211\254\313\220\353\271\210\344\267\245\340\365\356\317\246\326\265\334\261\313\256\327\325\352\221\273\361\207\263\213\371\327\204\227\344\200\233\207\235\376\271\344\375\354\350\343\276\357\352\353\376\304\240\306\210\236\232\270\252\223\256\356\351\353\350\355\277\376\241\257\264\242\347\270\231\200\207\223\241\336\356\266\300\221\334\346\374\362\232\204\300\214\223\317\362\351\315\227\217\376\270\224\215\274\254\324\317\354\254\235\367\227\343\315\340\350\234\231\326\341\326\221\210\225\223\343\203\323\261\341\370\272\255\343\356\252\341\226\314\320\221\215\205\267\364\331\265\207\253\333\200\306\231\360\252\235\347\206\306\343\260\234\273\363\351\204\217\215") -TOPIC_TEXT( -"\324\274\213\221\345\347\321\317\327\274\333\216\314\317\315\273\373\367\234\356\300\357\361\237\266\375\260\331\326\372\354\240\267\371\227\312\326\343\365\266\271\200\312\343\314\317\345\241\240\272\370\313\327\275\267\234\315\357\301\323\313\254\260\314\375\321\321\260\235\304\301\277\215\330\250\330\274\266\314\231\247\357\223\207\301\214\335\255\327\261\372\263\242\262\236\370\302\264\312\316\230\342\245\247\276\373\315\306\327\316\242\321\232\217\347\235\305\241\256\326\226\317\326\341\333\363\234\212\222\277\377\270\377\207\351\211\372\260\342\315\354\224\372\272\230\227\210\337\326\372\312\212\260\356\234\357\231\273\321\213\275\314\240\275\235\206\333\200\234\310\325\307\307\257\265\210\221\303\330\212\340\314\212\254\233\320\374\254\301\266\335\277\202\341\277\224\355\337\376\373\244\275\277\204\256\234\254\225\350\360\237\234\351\226\324\352\226\270\231\362\200\260\352\277\255\314\360\247\353\311\246\306\304\254\214\260\375\275\273\215\247\224\376\275\340\324\344\255\211\261\277\341\336\236\316\321\221\241\250\255\365\305\261\254\374\227\311\312\255\362\232\251\327\230\311\246\212\212\347\363\342\256\336\334\210\233\201\207\235\301\262\260\241\350\201\342\324\312\202\252\263\210\270\256\351\234\356\317\214\271\364\330\317\313\227\350\204\304\260\220\376\321\325\340\234\332\374\226\370\363\210\272\353\321\317\377\326\226\335\326\332\230\363\225\211\343\252\235\215\333\233\354\214\346\231\301\365\261\234\221\373\263\210\267\361\330\324\330\257\224\227\267\251\244\324\205\225\331\353\221\216\232\331\270\316\272\323\211\300\204\316\331\202\263\300\361\370\351\304\326") -TOPIC_TEXT( -"\314\315\376\214\247\216\307\264\236\321\351\206\310\314\240\306\343\261\367\377\313\271\314\337\315\333\373\341\307\363\242\350\240\353\244\245\216\311\204\343\260\237\203\235\242\357\252\236\323\221\212\272\241\322\324\264\306\323\272\374\261\255\312\306\372\253\264\364\352\214\241\214\225\265\370\211\211\241\327\206\312\235\237\243\260\305\325\251\210\342\330\270\304\254\214\222\353\327\206\303\301\240\240\305\235\354\312\355\311\211\273\231\257\243\335\246\300\300\327\303\360\350\376\360\321\373\377\372\257\377\317\317\373\377\372\277\267\256\255\313\262\274\307\377\374\374\367\355\236\335\377\312\315\331\250\201\273\362\360\233\361\236\224\273\343\341\250\310\200\313\235\332\373\354\245\347\266\360\225\346\327\300\274\300\260\372\264\237\347\302\213\346\243\373\317\242\354\303\266\255\333\276\231\332\356\275\371\245\320\260\326\365\226\302\366\264\344\311\305\361\343\243\343\343\221\245\344\317\353\261\353\314\331\303\235\250\222\305\266\216\356\201\231\243\350\224\237\225\373\225\371\207\242\217\303\236\337\267\376\370\370\331\330\277\300\236\372\216\377\366\266\353\203\355\223\333\267\341\237\320\303\331\247\341\307\225\225\332\344\207\310\267\310\332\272\277\340\241\204\366\215\261\207\204\244\333\222\216\341\215\233\374\203\255\364\322\261\260\267\220\330\250\215\341\362\345\360\357\360\242\242\322\374\307\270\345\325\255\314\375\350\240\320\272\331\365\311\221\303\275\332\255\371\372\307\344\361\254\265\353\256\234\235\377\324\363\233\210\244\257\337\374\263\373\333\323\343\323\301\223\267\307\307\206\350\270\241\352\340\256\335\363\340\364\362\310\240\224\343\231") -TOPIC_TEXT( -"\304\364\302\315\347\245\225\310\203\214\370\271\377\232\307\204\245\275\244\361\275\234\255\273\215\273\355\216\305\234\301\310\370\210\277\363\205\343\206\257\350\223\266\266\204\365\360\220\351\275\362\266\346\363\340\342\363\200\326\336\353\264\270\317\232\266\317\266\360\236\377\364\231\207\261\341\374\320\305\277\261\250\201\342\352\343\211\241\273\247\357\361\206\214\362\230\242\346\266\317\310\354\303\323\342\272\227\306\371\305\271\222\273\345\376\321\374\306\264\245\200\307\224\260\347\344\303\212\370\354\300\350\231\211\200\323\205\324\275\220\303\347\267\222\271\300\351\315\363\243\327\233\204\274\367\350\330\343\343\202\307\244\360\342\220\240\223\320\226\202\365\205\343\325\333\234\245\220\320\223\262\320\237\257\226\243\350\340\334\300\243\303\225\221\374\225\262\263\264\246\213\256\262\343\232\310\267\353\312\262\331\257\227\233\313\261\342\204\373\344\346\334\227\332\331\251\250\330\300\274\326\352\374\342\322\317\237\274\376\366\364\366\203\361\303\373\350\351\347\237\224\277\220\255\376\275\214\230\231\222\212\316\335\275\275\305\257\205\371\225\225\225\230\343\312\205\342\276\317\371\276\273\227\374\341\275\345\343\267\276\234\270\323\372\357\253\326\375\256\340\340\361\226\355\333\252\330\253\312\233\352\252\340\355\316\315\227\205\215\231\337\201\214\337\344\203\257\237\377\333\256\256\254\311\341\244\352\272\277\241\255\336\277\375\367\316\377\327\361\221\335\357\242\347\361\345\363\314\226\214\243\353\253\230\321\224\305\307\213\230\352\350\261\355\353\226\364\271\331\337\236\337\271\372\277\377\270\363\375\366\366\236\335\273\311\363\362\363\272\332") -TOPIC_TEXT( -"\277\243\330\227\367\372\242\376\332\315\277\245\271\243\211\377\216\356\271\302\216\305\226\227\245\343\244\274\277\220\314\313\332\206\344\372\275\317\231\232\254\265\326\352\227\334\335\205\211\262\254\261\215\310\201\335\305\377\334\354\352\250\243\337\330\333\365\365\356\227\350\212\270\275\243\247\323\200\277\332\310\302\213\334\310\270\200\326\206\337\201\312\241\223\206\225\263\374\376\202\355\371\311\275\377\335\250\270\353\315\307\377\215\221\206\301\272\372\262\360\262\232\254\272\300\362\374\244\276\276\336\312\300\241\243\227\307\374\237\264\332\313\326\263\373\374\323\265\324\202\334\335\334\276\331\211\231\250\213\356\331\327\311\232\221\336\271\236\366\234\224\360\263\316\224\216\214\230\200\211\320\332\324\350\305\307\245\340\250\201\316\261\215\203\223\310\360\211\247\375\322\367\333\202\205\213\311\317\330\213\277\253\340\322\302\205\215\271\224\322\356\306\351\316\202\264\230\270\353\350\205\260\221\211\260\207\242\340\257\244\347\277\356\215\327\244\222\356\323\222\316\356\272\210\236\234\201\264\333\226\364\233\260\362\221\307\324\276\366\263\231\365\241\343\256\333\216\200\242\255\252\375\377\226\243\216\210\224\307\316\254\316\266\336\264\361\315\342\245\215\307\226\210\236\207\235\355\262\200\351\362\236\223\223\250\215\305\232\221\303\347\323\304\310\321\255\201\260\323\363\354\274\342\247\212\233\271\336\203\213\316\274\276\246\370\254\363\212\307\231\372\266\236\250\347\241\233\220\323\334\327\321\347\237\342\326\370\273\343\242\226\215\276\212\324\221\206\250\357\322\225\312\272\362\330\261\353\216\336\276\355\256\320\265\214\316\206\206\233\336") -TOPIC_TEXT( -"\337\266\307\246\261\360\242\306\311\270\262\222\322\322\246\206\226\350\350\321\351\261\251\272\312\226\243\326\325\363\353\224\206\353\203\256\277\304\255\202\226\337\362\230\356\337\276\373\340\343\371\307\277\306\315\300\343\315\321\333\367\267\334\271\240\272\202\226\223\267\365\311\337\323\206\341\300\260\304\233\253\257\334\275\267\364\313\350\374\317\255\226\377\307\336\207\204\314\344\311\267\306\236\317\331\251\206\344\372\241\241\372\201\364\251\273\340\324\355\324\264\374\246\337\203\265\374\224\216\203\356\262\327\373\263\326\324\213\277\363\340\347\202\275\373\340\265\330\246\235\376\315\365\365\205\226\306\323\340\347\317\327\360\273\366\200\335\341\331\362\317\362\236\316\253\330\262\272\306\226\300\233\223\257\233\237\321\376\364\207\350\215\275\304\346\317\213\323\330\333\337\225\256\367\312\217\257\306\353\327\362\271\337\365\254\246\363\365\243\302\321\356\264\264\345\235\211\346\355\230\270\202\270\352\316\204\345\322\254\232\215\266\301\366\262\372\311\212\320\244\353\210\304\233\327\376\230\265\360\346\215\306\237\314\263\253\213\252\254\360\342\261\214\247\256\256\275\221\245\270\302\350\315\356\204\222\345\221\206\330\235\217\205\373\234\322\226\233\357\326\257\243\233\364\321\373\324\342\332\352\370\354\357\335\314\235\365\270\301\257\326\226\351\343\337\263\231\216\267\225\336\340\260\316\337\214\353\270\205\241\300\305\330\221\233\261\330\222\252\361\300\255\333\262\341\354\264\254\356\334\220\227\315\227\233\273\312\334\313\271\226\342\351\371\337\342\331\373\250\350\377\360\233\353\351\266\253\346\345\261\216\253\254\312\267\252\211\351\346\331") -TOPIC_TEXT( -"\365\202\224\300\263\356\265\330\311\335\203\356\330\340\343\313\271\374\343\343\232\205\220\267\366\262\207\245\203\307\351\361\240\207\273\307\343\345\313\226\321\255\347\254\361\230\237\231\302\347\347\314\365\326\265\374\227\232\253\345\224\336\245\324\305\322\332\223\254\250\276\330\241\247\240\270\365\274\306\367\303\253\206\266\310\246\362\316\305\253\302\315\353\350\212\236\237\303\200\351\274\345\307\326\350\274\214\366\216\326\366\327\325\254\333\372\301\314\324\320\265\347\257\235\350\374\350\243\353\321\372\302\272\256\214\244\361\330\370\340\324\300\262\323\337\310\330\307\373\316\353\357\351\256\234\250\277\225\375\305\227\337\275\357\331\321\323\261\334\225\207\217\327\254\331\323\337\333\360\251\370\374\353\324\245\260\253\243\253\205\311\272\321\346\317\321\235\207\236\233\260\354\304\344\311\261\226\363\340\224\375\305\360\310\322\251\340\263\352\332\252\231\240\373\325\217\325\332\305\373\253\232\331\377\360\274\307\202\263\236\337\257\206\367\215\237\204\324\203\342\347\363\367\374\211\304\361\325\371\366\235\260\364\327\230\203\332\255\340\253\323\261\346\373\233\212\261\203\227\253\252\311\275\354\305\205\371\370\305\327\237\263\377\361\342\376\237\340\341\234\260\240\231\233\334\264\254\351\343\311\361\343\327\352\200\256\331\342\320\261\332\236\336\235\211\352\367\342\214\316\227\367\306\317\213\335\367\277\356\364\333\267\241\207\324\222\342\216\354\207\345\232\337\342\276\230\342\267\350\372\303\356\306\274\333\366\367\311\270\212\232\261\252\342\252\243\334\357\347\350\372\261\203\271\233\337\336\367\236\273\375\333\377\237\244\211\217\225\300\262") -TOPIC_TEXT( -"\232\301\374\335\376\313\332\215\257\367\327\340\237\352\277\216\323\306\322\200\327\245\202\311\262\236\370\315\213\206\343\376\305\345\211\207\233\204\234\251\212\244\236\326\361\304\343\226\353\227\267\267\203\253\267\330\307\244\225\363\216\207\221\227\312\356\337\341\261\241\201\336\224\377\327\262\377\210\200\250\351\375\327\320\276\225\262\274\335\342\224\331\373\300\340\206\362\311\315\331\350\247\350\342\373\337\325\260\317\261\225\257\206\331\205\313\334\343\344\202\232\323\373\222\245\311\304\261\315\312\200\374\321\274\237\333\272\354\202\234\266\245\202\262\227\334\263\241\321\327\304\362\231\223\353\344\304\343\257\334\357\327\262\332\332\342\221\215\347\227\217\243\324\264\214\257\252\233\345\256\363\203\340\277\237\305\254\230\312\361\305\266\253\300\243\306\352\365\321\302\306\216\374\260\375\246\273\267\307\250\303\213\255\277\272\307\352\257\264\243\233\323\360\224\320\265\233\203\215\301\310\272\312\340\243\322\226\234\236\313\277\263\337\277\275\235\227\361\221\327\370\333\365\343\240\343\373\362\360\323\337\344\345\355\371\352\363\223\356\366\223\217\377\365\246\377\376\323\227\331\237\327\252\335\250\230\356\357\203\201\253\217\347\273\220\275\315\212\375\275\310\344\231\240\227\236\213\333\356\255\253\252\253\253\215\200\344\242\355\200\226\205\202\225\320\343\203\244\250\273\205\375\251\261\220\275\273\276\303\262\232\233\372\204\346\326\371\343\343\327\353\325\202\275\303\373\270\214\220\227\304\212\361\336\241\232\244\374\342\274\213\265\315\273\203\321\327\360\210\200\376\210\337\335\305\252\307\356\351\274\312\252\206\222\227\225\225\236\352\274") -TOPIC_TEXT( -"\366\205\345\373\363\363\306\277\320\272\247\263\356\375\273\267\377\227\277\330\230\253\200\220\265\263\356\331\373\345\260\343\245\245\235\245\340\343\236\256\366\236\364\256\233\237\314\267\274\227\270\207\211\277\207\325\243\261\230\244\252\237\220\241\205\344\362\346\356\200\370\370\310\356\244\367\361\254\204\235\271\313\333\341\332\337\200\223\337\255\323\370\265\227\222\303\330\317\315\216\242\322\262\277\254\264\312\315\303\320\310\362\224\317\205\217\275\326\372\243\224\205\372\215\377\270\223\306\256\215\263\220\234\353\277\320\321\375\230\356\323\303\235\201\333\202\351\311\313\241\300\325\236\255\352\353\303\336\341\302\335\260\230\376\235\214\240\213\351\300\360\257\213\210\316\331\361\272\312\330\300\207\203\361\355\343\331\264\206\311\240\233\373\222\200\342\307\221\343\335\352\320\245\340\272\241\326\266\303\247\336\260\224\350\355\351\354\352\340\236\214\330\320\257\256\371\240\274\351\342\220\210\376\240\376\370\300\231\265\267\350\347\253\313\325\330\310\236\367\373\274\363\375\235\227\200\233\263\361\304\302\333\302\243\244\244\354\265\311\230\214\240\343\243\263\240\205\277\376\234\341\215\222\313\363\222\316\211\353\314\200\254\265\326\337\322\370\214\270\363\306\373\246\210\307\277\347\364\225\336\373\374\233\350\330\273\262\262\302\352\277\364\256\236\267\265\265\201\222\265\270\230\233\370\354\314\365\336\305\342\370\234\323\372\265\327\316\366\231\212\263\224\270\264\326\224\312\347\245\227\314\347\304\345\222\255\261\360\343\324\224\353\231\260\261\253\376\340\210\202\207\341\335\256\213\216\332\247\306\206\265\247\253\324\371\337\243\332\307\230") -TOPIC_TEXT( -"\266\223\343\362\254\351\314\230\327\341\277\353\313\306\264\352\226\276\230\306\375\343\230\220\272\241\326\247\201\307\366\224\332\364\305\251\345\330\216\357\323\217\327\347\242\204\354\263\361\234\306\220\210\211\233\275\201\225\262\253\316\375\367\342\306\300\200\373\302\376\217\334\233\326\204\236\375\274\200\332\237\275\246\267\264\347\340\310\252\231\307\303\316\235\271\215\324\236\201\262\213\362\351\211\334\364\322\201\370\250\345\340\260\321\300\334\377\311\212\336\340\372\253\253\355\273\310\217\315\215\226\253\370\210\231\370\204\222\277\300\226\321\315\201\275\373\317\273\332\260\315\250\247\307\322\320\231\260\234\265\227\347\270\301\254\330\276\272\352\234\253\336\261\327\240\342\340\261\304\370\233\234\274\262\224\242\325\246\234\345\371\361\255\300\227\276\372\304\273\240\320\202\375\352\340\317\262\312\262\377\254\260\234\274\300\332\300\311\206\366\366\227\300\376\364\333\354\340\247\327\372\361\256\361\360\225\330\222\203\207\271\353\364\203\373\370\362\220\223\263\307\263\263\370\307\330\200\300\354\263\371\376\227\363\207\264\371\366\227\232\332\351\315\306\200\316\352\275\267\330\331\331\202\231\232\361\354\204\255\266\204\266\342\324\215\201\217\273\374\257\316\213\246\216\377\332\224\325\362\204\231\221\221\273\374\365\264\275\204\314\336\226\244\311\223\270\231\365\317\353\207\340\226\270\306\227\275\213\272\314\343\261\251\230\243\271\346\334\223\330\325\334\223\330\240\311\276\204\251\252\264\206\342\320\370\326\202\375\223\303\244\340\372\203\261\262\302\377\321\207\341\353\232\203\341\200\344\250\243\342\227\324\214\366\320\255\335\354\354\265") -TOPIC_TEXT( -"\316\266\373\374\202\277\373\341\372\307\317\316\340\254\311\203\240\352\303\365\241\205\330\322\201\311\201\327\352\256\321\333\222\367\204\375\376\316\336\243\246\312\237\354\372\340\210\377\201\364\264\235\250\245\221\217\255\306\270\265\253\313\206\303\270\200\366\202\262\261\263\305\373\371\333\363\247\340\335\340\277\215\313\221\376\317\263\363\212\207\310\332\375\205\307\204\333\343\344\266\337\274\370\226\261\363\224\273\226\361\354\246\236\376\250\314\274\346\262\266\376\224\277\346\214\334\352\216\304\322\355\274\251\265\312\274\356\267\305\337\376\233\200\314\236\226\374\367\331\335\231\353\275\224\331\361\230\354\374\321\307\326\200\204\265\357\231\355\213\226\366\312\213\303\360\251\231\214\276\366\343\346\350\261\274\262\310\354\364\344\300\371\257\203\277\204\333\272\273\361\256\353\341\202\230\227\341\341\365\351\206\305\377\277\351\261\214\220\277\230\260\311\320\353\244\255\330\211\274\226\217\261\350\254\303\315\217\261\216\231\217\350\233\275\314\313\367\230\370\354\316\374\225\365\371\377\336\255\215\251\314\210\220\345\247\375\252\240\331\307\317\215\215\211\321\353\345\320\337\224\322\306\216\260\364\233\232\204\200\302\201\304\346\257\253\271\376\314\354\277\344\204\201\314\300\314\231\200\204\226\252\206\321\377\310\230\220\256\222\361\254\300\270\207\362\206\226\227\333\260\256\314\234\276\336\355\305\277\236\367\264\267\260\372\263\246\252\356\307\352\221\350\370\331\227\237\235\335\331\367\276\331\330\224\277\364\372\344\361\364\274\320\214\366\320\234\214\256\237\214\276\262\222\243\307\253\321\312\317\271\367\336\250\302\357\213\216\217\371\350") -TOPIC_TEXT( -"\226\337\271\333\316\377\266\262\241\337\341\315\306\354\341\272\266\253\334\300\367\226\364\305\341\244\224\364\206\330\230\323\226\256\336\276\267\274\315\200\220\374\316\361\264\303\330\224\353\221\252\260\250\222\234\237\261\363\253\250\361\372\366\364\326\312\233\267\267\335\304\262\263\217\264\237\330\276\221\255\363\311\277\267\311\363\373\365\217\232\330\377\311\217\271\234\301\340\337\267\336\253\331\307\217\320\316\327\262\253\235\363\251\307\325\274\325\256\263\345\253\366\253\335\363\276\306\214\203\372\217\252\300\261\244\210\315\360\334\213\340\240\317\273\300\362\371\242\300\227\240\210\351\204\246\233\326\257\223\252\366\307\213\334\270\230\214\255\210\324\235\343\302\302\277\303\320\221\236\214\214\377\216\253\356\377\276\301\236\306\340\270\200\204\347\200\321\207\261\255\366\340\345\336\244\256\341\216\341\215\240\314\275\347\212\241\257\355\302\335\242\232\377\207\263\227\352\302\254\205\332\207\272\213\276\331\273\307\277\374\207\323\217\302\302\260\200\315\364\222\224\370\354\224\212\302\261\214\340\330\260\232\267\327\304\226\344\377\267\356\356\260\263\345\322\207\266\357\300\355\220\326\340\267\251\225\213\261\201\276\225\211\311\315\364\201\342\272\200\252\321\230\343\357\212\265\215\310\204\346\373\353\230\346\301\316\322\217\277\356\236\252\241\226\256\222\340\374\314\256\260\241\315\207\362\352\257\245\257\256\355\306\312\240\271\366\254\262\232\325\217\201\207\357\250\344\361\220\364\257\225\215\367\327\215\340\212\374\331\325\305\353\254\223\211\212\235\203\262\206\375\357\355\315\306\206\244\236\237\254\251\336\364\277\205\233\256\303\325\201") -TOPIC_TEXT( -"\266\346\210\251\275\303\332\256\241\313\306\202\217\305\327\254\317\336\377\375\205\236\274\254\257\253\376\241\240\367\370\233\275\377\345\260\277\357\377\374\361\305\370\307\373\366\357\224\350\323\357\340\346\323\222\373\351\271\360\345\347\377\211\376\244\344\373\376\350\360\210\212\301\240\276\213\314\347\243\363\342\303\253\313\350\215\303\256\371\227\266\307\206\201\206\321\317\212\324\357\330\342\222\241\350\230\327\345\246\215\233\261\205\322\234\262\231\230\341\205\260\276\364\310\345\250\241\213\222\240\217\213\304\300\320\220\347\243\244\321\233\241\254\371\271\271\273\304\343\327\263\377\201\375\331\346\260\341\240\257\213\200\337\215\337\312\337\363\247\312\304\210\210\344\340\347\300\324\354\254\335\247\315\226\263\275\253\201\361\205\360\206\234\300\321\335\255\353\305\333\335\214\302\323\303\332\260\221\325\326\337\304\365\365\362\247\261\227\201\231\257\337\270\347\272\303\333\351\260\330\330\206\377\342\241\261\316\305\341\322\266\336\207\370\325\363\207\317\306\366\344\275\376\320\224\367\257\320\302\335\272\212\222\232\263\361\371\353\340\365\375\255\263\226\234\234\206\370\316\200\344\334\360\335\230\374\321\332\302\200\206\344\352\277\255\360\234\346\227\345\367\345\314\211\365\225\347\210\360\367\217\353\337\262\241\306\340\243\244\203\367\346\224\367\307\235\261\244\212\350\356\324\322\313\364\301\230\253\351\213\261\271\354\232\202\205\243\223\202\323\243\371\246\314\376\242\300\225\346\243\217\221\230\321\203\214\343\336\247\222\342\263\344\230\355\302\334\332\370\275\254\272\354\277\214\335\352\350\373\274\340\213\335\273\206\275\226\204\324\246") -TOPIC_TEXT( -"\332\211\302\335\312\260\370\256\236\361\313\230\205\235\245\360\222\233\242\227\335\320\274\377\376\224\344\303\335\347\315\352\334\305\247\206\203\305\350\215\234\222\347\301\256\367\365\306\355\356\337\235\261\324\303\217\301\310\247\300\354\346\233\327\365\243\356\362\316\244\341\253\214\225\341\250\374\276\276\271\215\341\270\347\363\350\202\206\333\215\325\206\211\314\204\200\361\202\250\337\255\345\327\261\315\212\225\256\270\263\364\313\325\344\261\332\270\250\220\365\266\334\363\333\221\216\266\256\353\350\321\367\307\221\355\272\302\315\335\222\255\215\227\264\341\260\247\200\203\203\341\224\216\325\321\322\233\311\202\217\355\207\215\314\215\260\261\274\371\217\243\350\213\260\354\250\324\332\334\333\375\356\310\301\357\276\227\331\273\353\300\301\276\203\263\217\337\375\207\257\337\356\216\334\377\273\343\307\376\373\273\366\314\377\357\277\376\357\276\277\205\227\321\237\223\220\366\244\273\226\221\241\371\353\363\271\201\313\311\236\354\233\274\230\201\213\237\246\367\265\317\256\323\330\300\343\340\211\367\240\210\301\247\350\210\361\270\255\320\231\340\272\277\240\345\217\202\305\240\363\366\206\305\230\340\360\263\372\253\260\232\261\246\335\225\331\214\274\336\206\253\354\333\365\241\373\314\367\340\214\376\212\233\257\201\256\272\307\371\253\215\313\254\330\222\314\277\355\353\226\314\211\224\241\341\337\203\266\372\251\316\240\361\231\202\307\374\242\204\244\253\376\355\330\321\261\303\224\265\245\233\222\341\362\377\364\220\361\232\336\212\335\274\250\313\311\345\241\240\326\305\351\353\353\243\334\346\247\267\303\362\225\221\371\335\374\254\335\234\261") -TOPIC_TEXT( -"\360\304\330\366\262\323\271\210\373\245\315\305\277\305\245\234\321\322\243\240\334\347\312\314\263\310\257\372\234\246\264\343\373\316\362\367\223\204\244\243\243\321\227\217\266\305\247\351\224\311\224\336\260\375\267\200\272\376\342\210\310\347\334\370\324\246\275\306\356\254\311\336\270\376\321\313\366\340\241\376\243\256\214\226\254\311\200\212\251\321\331\307\242\257\337\354\257\314\320\255\274\246\230\354\365\265\344\247\241\226\213\266\216\353\275\360\314\213\335\233\271\211\224\363\322\237\221\243\256\221\320\262\274\345\242\376\346\234\340\254\372\254\223\372\372\237\215\204\261\321\200\341\225\300\236\345\216\331\343\232\377\204\256\362\364\302\360\226\350\313\262\316\266\202\355\227\250\273\353\262\224\341\360\341\205\340\353\261\264\230\270\325\251\253\236\240\215\206\334\217\354\344\201\360\321\332\225\212\257\340\352\216\325\375\245\267\341\303\200\246\356\204\215\213\343\353\343\337\262\337\314\333\323\215\352\225\300\273\323\327\240\266\257\363\335\337\246\316\310\361\275\355\350\343\276\312\366\237\254\232\372\233\223\323\320\375\250\335\314\236\243\377\261\255\365\325\307\352\313\326\300\300\232\322\363\342\365\272\350\210\251\201\370\307\217\325\265\216\376\214\365\213\232\261\277\351\203\250\343\245\336\232\257\271\275\303\341\371\350\243\224\334\343\307\271\251\250\327\210\241\375\257\311\202\215\247\354\330\360\343\220\362\373\323\345\206\347\272\252\306\353\227\215\324\311\274\375\271\273\217\225\346\266\376\221\265\346\325\252\217\266\252\312\377\277\260\261\306\217\213\340\220\354\243\344\341\375\305\226\272\351\271\241\265\273\244\246\361\264\315") -TOPIC_TEXT( -"\267\222\252\341\242\277\204\376\223\376\314\340\330\326\232\265\201\377\367\351\372\354\354\372\234\351\317\244\305\212\330\210\272\337\217\332\313\237\352\264\256\306\210\354\342\276\226\271\333\266\345\257\223\274\275\275\326\325\213\321\354\252\313\206\263\352\363\204\321\300\265\334\254\201\257\307\222\346\206\211\374\315\204\226\312\320\212\327\240\344\367\372\303\361\316\212\326\325\326\373\231\335\357\211\327\333\214\375\220\201\226\344\253\321\366\355\224\227\307\327\206\371\276\277\377\371\317\311\234\357\333\277\375\266\231\223\251\322\350\322\332\321\313\362\242\223\341\302\374\254\243\212\234\354\311\313\242\366\201\343\203\217\335\261\361\254\202\205\331\261\224\321\257\214\211\374\212\266\323\213\255\341\216\373\331\376\375\212\374\344\305\306\235\344\375\267\370\351\232\351\214\331\336\363\335\376\223\237\236\271\204\336\321\267\246\247\312\353\307\272\366\237\353\261\340\217\377\220\354\252\377\206\203\211\342\363\235\321\310\206\327\211\302\303\217\217\213\250\232\214\217\353\277\242\342\354\335\353\331\247\321\354\227\312\351\214\346\220\306\264\376\262\316\252\341\202\356\336\307\326\315\263\320\212\314\247\252\226\213\220\240\333\230\266\366\265\234\312\233\355\212\374\376\374\251\241\301\231\221\262\270\273\222\214\324\304\267\262\224\332\243\316\263\361\345\365\275\244\305\230\240\326\241\201\225\367\246\203\303\351\272\207\361\240\343\244\217\340\345\331\240\262\314\302\375\373\351\244\343\201\223\215\206\306\314\337\214\274\346\370\300\260\357\366\351\215\250\317\212\253\215\214\320\227\367\256\247\307\255\370\312\257\300\233\213\231\367\257\356\353") -TOPIC_TEXT( -"\251\310\367\312\373\372\275\373\205\326\335\306\350\254\370\240\352\301\350\354\352\346\270\371\250\372\243\342\365\322\347\261\337\214\341\331\233\306\301\240\341\255\207\373\243\323\222\373\214\242\246\332\276\342\215\241\344\243\326\325\235\337\335\355\253\271\302\354\215\353\266\376\355\371\234\302\317\234\350\243\357\237\254\377\234\250\274\257\277\217\301\306\310\230\201\343\314\350\245\374\273\232\316\351\237\236\217\357\227\241\331\353\247\361\236\234\334\326\355\212\336\206\216\271\247\222\224\372\313\235\307\217\223\326\323\205\375\335\312\230\350\220\351\266\203\217\366\213\362\367\322\367\270\356\377\362\371\235\333\267\356\333\256\353\312\352\202\264\320\202\327\203\345\374\241\331\313\232\264\214\300\262\361\355\207\316\315\327\361\365\211\367\212\366\275\356\223\327\361\345\252\312\355\303\313\314\300\332\266\377\226\201\235\330\371\271\271\334\306\205\357\300\321\252\203\340\202\235\233\202\211\263\244\330\203\227\320\305\227\323\374\350\274\231\263\271\244\276\230\227\266\233\303\360\337\234\361\255\214\230\276\360\210\341\277\215\233\207\260\301\313\350\371\211\351\311\222\315\215\235\306\356\226\355\332\264\321\373\274\371\257\300\243\321\313\261\357\361\355\304\316\356\300\313\360\330\333\310\211\306\227\204\357\205\350\310\245\264\202\235\223\254\334\305\204\325\364\213\271\354\213\365\270\242\253\247\363\201\217\211\272\301\267\364\226\231\312\213\313\306\370\303\272\304\352\302\372\315\362\260\245\362\311\351\317\346\305\363\272\212\303\331\311\312\235\360\343\373\233\317\236\275\361\271\243\200\234\373\240\344\362\272\236\243\232\303\312\325\377\215") -TOPIC_TEXT( -"\322\211\261\270\206\254\205\225\371\232\331\277\351\261\375\260\233\277\204\205\260\306\337\273\331\322\355\234\212\220\343\217\306\312\363\243\204\230\373\223\312\246\340\214\270\337\310\203\326\362\217\354\323\205\310\353\206\340\324\246\241\251\203\241\236\334\343\206\247\317\236\347\222\354\363\223\221\335\254\322\207\257\256\230\343\312\247\217\300\252\357\206\305\352\200\330\306\312\265\316\371\230\235\341\353\363\376\321\257\256\341\356\266\361\305\321\225\332\242\314\260\340\211\312\253\243\317\351\301\234\351\310\341\333\316\221\255\207\372\324\342\226\227\262\277\250\261\243\341\214\324\323\351\370\203\270\236\223\272\227\206\236\266\263\215\216\267\257\314\364\324\355\344\344\253\216\352\215\251\342\227\222\247\301\314\266\315\202\253\214\306\212\223\213\304\365\251\302\306\356\365\367\275\214\266\324\206\312\201\256\343\251\353\332\370\331\321\225\307\243\371\347\257\256\272\272\373\244\305\310\302\332\241\252\270\211\271\305\317\341\242\233\270\260\330\230\254\362\302\204\263\376\335\317\317\236\362\243\265\313\232\326\365\337\224\205\226\354\257\205\247\201\230\325\213\306\320\336\311\205\326\320\256\331\271\350\377\264\243\306\261\235\267\330\222\305\246\323\227\307\343\340\371\320\316\274\270\226\266\366\301\343\274\234\335\255\373\374\303\371\262\220\376\344\356\276\225\332\377\246\246\275\311\342\224\265\314\253\237\273\244\252\262\302\265\251\362\217\314\254\261\300\254\331\272\212\323\230\214\276\222\244\342\351\355\314\260\274\326\325\226\303\360\216\236\226\302\360\362\224\213\240\252\343\337\261\370\363\221\357\225\344\315\225\307\225\236\362\341\343") -TOPIC_TEXT( -"\230\366\261\323\331\240\214\210\313\315\363\371\357\247\376\275\271\276\242\216\347\202\203\215\211\200\247\311\337\363\247\335\333\227\226\223\206\243\333\343\261\200\300\325\236\331\272\373\234\212\272\205\201\242\310\231\230\311\325\347\260\277\362\202\253\327\270\242\255\263\356\202\363\361\225\203\273\203\253\370\362\256\314\234\227\217\271\277\254\352\332\235\261\375\310\364\222\323\270\237\356\364\307\316\355\333\214\276\306\337\236\216\340\314\371\205\237\247\373\211\376\233\346\261\334\223\212\361\340\212\246\364\345\356\231\354\214\213\260\217\233\317\213\201\243\265\360\206\241\247\321\241\322\330\365\310\242\262\261\354\325\253\243\227\270\210\331\267\201\220\277\305\363\256\375\311\256\221\227\362\362\322\327\243\353\250\317\273\363\205\305\360\261\313\232\346\235\261\360\370\312\202\306\266\316\235\271\315\335\232\344\353\265\227\260\324\307\235\365\316\250\213\240\306\342\266\205\211\236\223\273\323\243\364\354\251\247\224\227\347\244\343\211\341\212\317\364\262\363\206\366\327\340\205\263\242\207\253\274\336\370\214\233\227\312\214\262\270\217\372\201\336\316\374\241\351\247\334\313\223\217\215\303\233\232\231\206\260\347\310\337\275\274\350\320\222\256\333\251\234\353\305\231\322\322\215\343\357\230\226\302\346\354\301\333\242\357\341\322\326\234\232\273\210\304\206\340\341\307\317\362\310\313\222\315\204\217\267\226\377\234\313\302\235\375\364\314\237\367\256\316\344\227\303\345\374\310\314\205\244\201\205\315\327\206\316\343\262\270\360\236\303\331\242\377\315\314\233\311\250\230\327\302\347\353\223\206\371\240\220\242\236\207\221\232\360\363\262\272\216") -TOPIC_TEXT( -"\251\353\370\214\263\342\217\211\307\362\314\255\365\217\321\301\270\213\221\224\305\342\372\376\200\302\220\247\244\373\275\352\205\271\246\270\345\216\261\207\230\312\376\261\267\336\256\266\374\234\253\275\230\206\334\352\357\353\300\222\370\274\345\207\203\353\332\207\265\204\316\342\303\313\267\300\311\330\240\266\217\357\236\211\317\224\226\225\277\310\357\215\251\354\354\257\255\342\200\375\236\370\374\373\372\314\353\327\213\264\366\223\277\202\336\337\367\337\275\261\233\275\354\235\255\215\370\225\343\300\222\232\306\260\351\354\236\303\327\365\344\224\325\333\232\233\335\354\372\350\250\321\361\203\256\277\377\371\317\261\223\271\370\364\240\322\246\333\260\220\361\223\227\236\263\372\202\367\321\276\227\236\343\216\344\273\354\233\213\313\257\320\321\210\234\210\244\261\315\221\330\330\274\243\347\362\247\371\255\253\244\236\273\267\237\227\217\351\335\355\375\303\270\305\334\325\354\230\334\365\337\242\261\302\263\213\270\230\222\222\200\363\236\206\301\336\274\321\217\222\374\256\252\234\307\306\270\346\233\375\266\263\337\207\231\267\317\252\266\272\245\257\225\270\341\305\341\331\364\251\332\310\213\374\344\315\220\230\257\233\204\326\322\340\343\367\376\305\245\337\262\203\324\345\202\327\376\243\227\254\216\305\322\357\265\260\337\214\365\347\272\222\253\337\236\225\213\376\217\270\276\302\364\253\347\207\273\203\205\230\251\371\310\205\233\326\301\312\213\230\326\341\334\201\372\276\337\202\236\235\206\221\356\235\332\314\231\333\203\301\234\237\212\340\272\222\253\255\261\241\364\274\355\202\307\214\277\276\252\216\311\221\361\200\373\352\240\251\243\221") -TOPIC_TEXT( -"\341\335\251\312\307\324\262\212\357\323\254\266\273\234\257\207\343\362\335\203\233\215\225\245\200\271\335\250\227\244\277\215\315\205\375\254\354\273\241\352\324\335\203\313\213\216\255\351\264\255\321\351\306\245\207\372\211\267\304\227\245\343\260\334\242\206\234\277\302\347\260\364\367\206\316\236\313\313\310\302\345\200\260\220\225\252\200\306\222\327\273\316\213\337\343\361\237\203\346\233\347\226\305\313\245\350\205\247\214\301\255\225\274\266\320\352\306\247\352\301\365\217\361\333\232\257\323\367\230\341\276\360\362\220\332\210\344\344\216\315\212\242\302\374\245\245\222\221\362\352\352\260\205\347\337\340\361\331\274\337\355\333\207\262\205\376\231\364\306\214\271\371\263\204\201\223\303\343\356\230\256\317\354\215\233\350\322\200\327\361\224\364\231\322\205\313\207\370\344\355\270\226\373\275\225\277\310\344\240\355\243\333\267\271\213\303\207\372\307\273\321\221\271\377\256\340\254\376\202\214\257\367\267\341\327\263\254\345\261\317\305\254\343\200\215\201\200\254\272\207\346\277\362\360\341\270\242\304\246\263\331\343\220\255\300\230\342\357\333\257\301\213\351\335\254\310\205\364\360\344\305\322\275\352\304\373\202\313\320\221\327\204\371\350\207\351\221\342\242\374\301\343\212\365\242\243\205\243\367\213\336\270\343\341\205\374\212\346\340\237\230\262\212\221\211\351\201\342\246\203\315\241\243\261\230\220\316\363\222\307\263\342\312\241\364\224\313\353\335\263\266\237\220\217\235\303\366\322\331\376\363\255\272\322\374\310\233\350\277\201\302\255\364\245\241\264\233\204\205\220\301\260\374\214\255\355\313\343\310\320\210\242\376\362\206\254\200\327\300\334") -TOPIC_TEXT( -"\266\366\224\365\376\372\307\325\202\361\315\223\250\341\221\366\361\343\277\244\315\272\212\354\360\370\202\206\251\312\336\247\303\330\206\245\344\225\375\220\351\226\334\363\270\301\207\370\357\331\304\257\331\262\272\226\313\217\204\315\231\236\311\235\343\237\226\361\204\350\347\315\217\367\215\307\202\314\310\343\250\205\360\232\242\251\316\224\350\241\371\326\216\344\206\216\227\327\351\365\224\337\354\250\255\351\321\302\304\335\307\277\341\230\247\311\257\370\255\343\351\363\241\355\242\334\274\345\334\246\310\301\272\274\277\272\236\323\313\361\222\223\367\246\236\263\373\255\340\253\213\272\221\261\371\346\205\363\310\300\322\310\267\340\256\344\301\303\321\346\335\233\243\367\273\204\354\311\205\235\233\261\207\257\330\306\236\242\301\260\260\321\330\255\211\256\222\362\242\266\265\263\245\334\277\336\212\332\376\263\363\307\343\334\273\312\324\247\312\246\310\322\253\275\235\327\202\266\347\332\270\327\371\341\316\242\342\215\307\262\310\227\232\347\270\372\270\215\376\347\336\372\274\377\305\363\347\221\275\371\331\352\202\307\255\203\247\255\213\376\267\227\306\360\374\341\320\337\343\263\265\326\314\364\302\220\234\212\236\337\305\273\275\226\212\236\373\351\274\236\263\270\302\370\352\352\367\315\371\361\233\363\212\314\305\242\221\326\222\314\272\335\321\211\256\331\300\262\317\376\221\265\253\236\327\237\370\207\200\335\222\227\200\244\327\327\315\235\363\356\266\204\222\243\216\243\360\212\350\360\232\306\314\363\214\225\277\330\331\216\216\255\200\207\213\217\255\223\371\372\205\244\323\213\250\267\274\311\310\326\241\252\214\244\314\361\302\262\323\365") -TOPIC_TEXT( -"\354\245\371\363\234\277\346\217\307\330\232\237\240\265\376\246\210\323\215\314\203\343\347\271\200\252\364\326\264\303\356\340\346\302\257\222\362\213\322\355\361\316\274\344\236\215\363\365\374\376\343\275\226\364\303\347\344\265\276\344\334\327\354\243\373\230\323\216\311\307\214\212\371\232\243\300\207\201\237\352\313\313\374\227\216\210\330\201\304\211\347\356\214\374\372\220\303\361\275\241\366\245\353\267\200\344\364\313\301\245\240\317\256\264\212\270\247\312\215\361\212\220\361\327\277\302\330\376\273\244\215\355\363\367\372\372\212\371\300\206\331\345\206\303\233\206\273\313\272\204\276\306\264\232\347\234\252\263\354\351\371\240\316\377\236\344\254\362\262\343\372\253\302\222\240\353\372\340\376\210\336\333\373\206\361\216\304\271\336\216\345\374\205\350\230\332\212\354\314\321\226\337\212\222\271\252\336\343\236\322\262\306\335\304\342\255\223\364\320\306\374\236\221\231\237\306\253\223\245\342\351\243\216\207\355\367\214\341\220\261\243\361\363\255\370\263\245\334\275\251\217\241\216\242\353\370\217\236\212\320\341\264\234\221\322\261\200\256\302\220\257\277\206\331\232\221\347\310\327\306\205\244\303\343\334\341\365\214\355\244\321\373\250\274\323\263\351\343\210\232\231\323\343\202\276\331\236\322\234\372\351\220\227\335\376\341\354\345\365\353\277\330\213\205\341\230\326\245\203\336\213\377\227\377\220\314\304\345\352\345\276\226\306\373\215\367\230\321\222\370\374\246\346\343\267\211\261\204\234\247\301\305\357\260\327\310\223\214\236\337\326\365\324\364\236\227\336\356\377\323\355\214\214\246\345\251\231\253\236\356\343\226\341\367\301\231\265\277\313\335") -TOPIC_TEXT( -"\232\250\277\346\320\304\242\377\315\205\300\266\334\217\234\367\204\257\303\256\230\342\360\205\316\301\377\335\351\321\344\204\335\274\276\364\217\211\307\372\265\355\217\313\272\262\322\343\267\307\262\372\235\273\360\271\252\362\304\375\366\266\310\260\351\227\275\254\325\367\271\364\224\327\376\230\247\227\367\230\232\242\243\314\210\261\366\230\274\215\207\316\334\266\365\213\371\225\341\364\242\242\217\361\255\261\311\243\313\377\304\366\362\313\261\366\344\347\377\251\271\224\342\350\204\215\232\253\262\306\361\207\236\205\310\270\265\360\311\352\300\337\227\316\323\305\302\307\314\224\215\272\327\214\265\307\262\350\377\235\232\343\335\324\300\316\337\363\247\326\340\212\254\271\372\224\275\263\306\325\210\304\256\301\242\326\213\323\325\216\376\301\277\273\340\362\343\230\237\201\377\230\311\266\276\216\205\260\235\352\323\357\301\356\307\213\364\324\377\376\202\234\326\325\372\331\311\246\315\233\261\242\326\301\235\222\263\323\343\200\253\212\370\362\202\375\201\254\326\304\255\343\207\226\331\244\314\236\222\323\336\271\204\300\374\320\253\231\245\320\252\273\262\237\372\347\270\272\337\361\277\372\373\256\274\263\333\273\362\311\321\310\256\232\253\206\330\203\353\235\311\333\222\302\305\237\263\306\204\325\335\361\356\255\355\371\255\261\273\263\243\330\232\223\275\373\362\236\350\267\335\212\336\314\207\220\351\344\262\344\214\375\364\216\244\377\301\356\277\373\374\276\320\246\222\373\215\301\240\221\327\367\377\345\346\235\235\235\355\355\257\351\224\217\300\351\374\205\372\235\370\312\377\260\201\307\260\314\302\224\357\252\360\203\336\363\331\274\250\303") -TOPIC_TEXT( -"\362\276\365\331\307\206\321\257\354\301\256\201\303\230\340\273\311\271\264\321\351\213\214\231\270\253\260\345\330\221\321\231\233\374\225\304\257\217\271\244\365\262\326\246\202\340\261\216\244\237\257\340\343\207\260\345\236\243\224\257\274\226\255\340\332\215\355\333\225\202\362\363\366\242\365\225\313\372\357\262\330\212\311\240\324\222\206\273\235\247\312\317\307\351\340\244\202\233\364\363\312\257\342\237\265\262\223\307\306\215\233\202\250\346\273\370\234\221\336\225\322\254\302\274\270\267\351\347\325\204\353\356\337\231\307\255\311\333\200\277\222\373\230\244\356\341\356\336\231\260\207\217\303\223\243\267\243\233\301\313\202\325\235\242\215\313\243\373\341\373\270\310\250\333\346\215\214\271\254\334\240\323\352\374\351\265\230\335\342\230\323\256\200\374\377\242\365\233\236\321\206\356\227\341\366\221\333\335\364\262\245\353\230\346\243\277\274\321\320\222\226\264\320\245\221\207\312\254\205\302\300\305\313\241\277\344\264\377\316\263\272\207\366\277\202\347\215\357\261\306\262\343\335\334\310\230\275\356\254\317\242\266\326\323\304\273\226\215\347\317\220\217\351\364\260\243\207\334\270\365\324\274\364\332\222\234\254\272\307\271\300\271\273\340\206\236\357\335\371\262\361\337\316\356\302\375\353\337\300\312\276\275\332\322\360\324\267\263\365\323\371\273\300\314\311\253\276\332\344\250\241\370\306\342\202\326\273\366\332\332\365\213\200\235\371\271\234\271\254\340\305\234\221\257\335\357\261\372\243\260\315\335\225\324\272\306\332\240\323\272\272\321\361\223\300\324\342\303\341\313\204\246\201\260\256\305\355\346\334\275\307\206\364\306\224\236\362\355\331\277") -TOPIC_TEXT( -"\345\273\314\241\231\273\352\225\244\314\211\334\275\215\311\222\356\255\371\220\314\302\266\242\210\355\301\217\200\255\256\354\210\273\352\221\236\313\216\237\373\374\277\363\317\365\260\202\216\367\233\314\334\337\220\207\341\205\365\345\325\261\361\364\316\330\226\333\377\334\300\303\252\253\210\253\362\266\277\357\234\333\354\234\355\354\222\326\333\360\257\272\226\374\223\275\343\326\301\235\200\236\273\377\235\266\326\377\373\357\305\225\353\336\202\245\344\335\367\230\314\356\212\344\237\245\215\366\301\210\320\271\234\323\200\340\345\214\233\323\207\243\346\265\244\272\277\364\310\374\300\225\210\235\250\204\302\347\232\241\324\354\272\204\276\306\346\353\301\222\213\370\305\211\317\370\203\302\231\243\263\212\227\233\302\263\213\313\220\332\331\224\233\341\206\377\277\272\235\205\224\312\230\316\323\267\355\306\203\310\301\277\256\225\364\231\273\301\362\276\205\201\222\222\254\347\353\203\307\274\252\334\305\300\326\343\306\273\262\240\235\277\207\202\223\202\245\245\254\326\252\307\275\272\361\230\314\246\275\325\300\232\353\353\202\213\260\326\270\255\356\231\351\244\354\214\214\214\206\313\313\271\242\343\377\361\371\203\233\331\307\341\213\361\233\234\226\245\267\302\314\321\253\347\356\255\204\220\262\225\203\365\264\321\326\344\276\327\267\211\324\304\227\327\324\244\207\307\301\366\221\262\261\310\230\207\335\312\227\255\361\301\201\307\270\270\320\304\343\323\241\243\212\333\360\233\343\214\264\345\264\353\351\223\364\254\340\237\211\221\273\220\341\260\362\346\202\245\365\275\221\354\244\200\315\250\241\200\214\332\346\352\336\333\275\363\323\321\377\202") -TOPIC_TEXT( -"\307\311\322\233\206\313\270\324\270\260\255\301\353\205\244\213\217\365\214\273\226\220\223\307\207\273\246\303\335\215\355\315\227\233\365\256\334\200\231\261\307\373\376\362\276\372\341\302\271\216\341\326\206\330\337\317\373\264\344\307\236\264\244\206\366\367\302\264\237\276\371\274\353\315\304\232\347\272\223\237\325\353\364\262\207\254\373\353\304\343\327\256\326\317\330\222\343\333\305\226\255\200\325\254\257\265\324\260\334\315\213\217\307\206\242\302\215\235\335\300\342\313\222\315\235\264\203\217\365\323\224\326\366\276\212\374\331\324\355\230\237\227\264\211\311\340\224\363\251\317\241\220\214\246\257\274\336\335\206\345\254\202\351\315\236\370\214\203\216\371\277\350\304\263\263\277\324\305\300\242\344\273\200\343\354\207\313\253\343\270\224\234\275\312\251\304\371\314\247\227\217\361\324\374\334\317\246\372\276\230\343\377\305\223\204\320\255\304\247\371\312\237\231\273\320\364\347\374\327\256\342\323\316\320\246\224\303\254\264\245\373\307\305\251\341\210\221\231\276\202\373\364\254\272\305\211\224\300\314\240\241\307\255\215\367\344\346\360\221\210\200\340\334\344\372\265\216\260\205\260\356\327\205\313\215\353\224\352\266\202\240\337\215\275\330\276\302\306\370\363\312\302\226\304\306\210\260\243\212\327\264\242\261\200\357\235\242\334\246\216\323\325\255\225\377\235\347\367\312\316\210\230\331\334\264\220\243\350\250\311\226\230\265\360\205\321\311\361\321\362\345\204\372\215\370\211\312\336\270\306\322\323\243\303\231\225\213\350\227\337\315\341\300\303\210\372\365\206\215\273\343\314\202\301\372\252\254\341\225\332\200\306\351\275\224\364\347\313\316\243") -TOPIC_TEXT( -"\215\221\200\307\204\332\217\243\235\357\354\364\354\214\201\264\270\340\357\205\231\361\216\351\314\301\232\374\237\210\234\270\246\376\376\340\303\353\373\347\203\307\275\240\337\351\304\363\317\337\312\254\254\276\215\367\232\246\203\201\301\357\252\200\247\341\226\333\367\317\225\241\206\240\267\201\220\323\245\214\254\207\234\375\350\333\223\330\202\330\220\235\273\303\332\303\376\202\253\341\344\253\301\343\321\372\200\222\225\227\372\305\230\357\225\354\272\334\346\223\236\361\326\344\251\377\271\343\261\375\207\306\254\301\235\260\323\257\361\355\370\254\226\227\223\375\363\205\335\216\224\344\266\267\355\326\317\337\272\301\373\361\357\256\213\367\303\251\271\214\212\355\372\300\262\216\321\206\242\272\206\353\377\341\372\230\317\357\256\212\274\270\217\226\216\266\362\244\260\260\215\230\326\251\317\276\311\236\272\270\246\242\324\337\303\252\216\333\213\271\306\230\354\327\266\334\311\207\341\335\202\264\246\214\370\340\214\355\370\203\350\214\251\244\252\264\341\226\304\213\323\254\322\241\220\237\377\376\246\271\276\302\377\341\300\206\327\366\223\371\367\332\205\255\204\201\333\207\226\343\273\324\251\264\203\354\303\312\216\237\334\313\210\217\321\343\237\331\203\375\256\253\236\343\240\200\206\202\307\265\301\251\327\375\276\266\203\204\262\373\324\300\235\324\366\262\244\330\251\313\373\302\202\257\306\222\301\343\261\347\201\365\316\221\226\304\262\253\304\261\323\317\277\223\361\307\241\222\265\266\242\302\325\225\336\211\316\246\220\326\377\363\234\310\253\271\342\327\265\206\320\263\263\360\225\253\232\212\323\342\203\314\361\346\255\351\204\331\216\221") -TOPIC_TEXT( -"\205\353\224\370\307\253\343\312\236\372\322\317\234\245\205\347\237\355\214\320\222\245\212\263\345\277\215\316\230\256\310\310\314\361\326\267\305\227\377\214\375\220\256\210\374\241\201\336\214\317\313\323\365\317\301\313\361\237\370\334\204\267\334\302\254\216\341\224\320\232\351\270\303\314\230\234\216\254\365\374\346\230\224\323\246\377\342\332\216\324\315\264\201\374\250\370\226\261\217\365\201\353\272\357\342\276\331\203\316\201\306\364\233\357\264\272\352\221\222\335\211\311\377\377\226\276\241\356\334\236\242\314\356\364\340\317\270\313\265\324\237\323\331\204\304\343\216\346\262\363\205\351\231\307\270\363\324\256\331\342\306\360\272\233\303\306\364\225\200\344\220\243\313\335\306\337\274\254\204\377\356\206\263\316\245\300\302\234\355\240\317\220\262\207\371\307\342\277\336\231\260\264\200\264\235\276\272\257\341\267\303\215\307\323\223\243\264\340\263\361\203\373\323\306\226\355\300\342\361\207\357\302\262\213\373\323\261\252\234\223\226\235\373\317\337\337\334\377\203\370\302\303\232\233\326\310\354\306\303\236\335\273\341\326\235\261\253\362\357\300\222\214\246\205\232\371\356\257\310\323\354\274\266\262\344\251\361\207\277\257\234\205\353\246\354\330\343\341\233\343\236\316\227\232\235\343\244\267\372\351\366\366\335\346\252\327\353\325\251\347\307\316\207\212\341\326\300\342\300\262\336\275\300\254\232\207\277\216\306\275\357\355\352\264\204\361\236\214\317\263\301\267\300\345\373\330\350\360\350\334\231\323\250\347\312\316\314\243\347\200\301\206\375\360\352\312\203\217\270\361\307\343\203\334\246\321\265\340\200\310\224\327\213\233\247\334\361\350\225\337") -TOPIC_TEXT( -"\261\375\375\375\207\272\312\255\263\226\226\312\242\226\320\351\204\232\310\372\360\264\244\276\217\273\330\347\246\307\245\342\241\316\252\227\306\224\256\222\262\222\262\334\301\314\256\276\350\330\300\360\212\265\273\203\337\253\224\343\257\206\333\314\276\376\305\300\266\326\210\271\266\242\374\360\323\304\343\377\237\275\276\267\375\255\343\314\322\274\275\363\277\310\217\323\230\356\217\300\203\354\351\202\352\276\205\244\247\273\206\230\224\260\210\250\343\320\300\374\350\240\214\263\261\223\230\361\342\232\376\265\356\236\254\234\316\251\315\202\313\225\266\345\371\262\310\355\321\355\245\244\332\251\231\335\262\245\232\324\306\323\340\222\251\321\222\345\221\242\320\305\263\311\255\244\304\212\213\373\276\257\227\224\367\322\352\242\257\304\232\332\354\230\346\247\342\341\275\374\371\306\226\362\343\356\327\322\215\234\306\334\304\215\233\221\267\366\327\370\275\347\275\347\271\254\232\275\221\362\256\260\237\311\220\211\375\327\303\323\271\361\260\243\224\366\345\231\265\351\353\320\270\223\357\245\255\252\215\262\342\355\311\345\274\220\310\360\365\261\240\235\253\301\341\374\262\203\226\324\303\335\327\203\226\257\336\242\336\345\377\247\311\211\221\376\336\256\213\231\351\251\320\346\304\225\202\300\374\330\331\335\367\334\251\252\223\216\366\365\342\304\200\313\272\236\223\277\343\331\250\341\330\346\306\346\373\364\364\213\273\212\250\276\252\226\201\361\217\353\206\266\246\230\202\323\245\323\342\222\260\261\237\327\212\265\240\253\326\212\303\355\201\305\245\320\271\212\265\277\323\357\246\325\231\237\265\326\330\250\302\302\214\265\274\361\346\354\305\305") -TOPIC_TEXT( -"\213\346\276\241\274\232\326\215\347\360\256\304\303\343\307\301\276\314\220\237\255\274\360\313\310\345\217\241\275\327\315\330\257\246\332\351\251\371\252\315\316\215\211\302\274\346\320\270\371\362\311\254\373\342\244\323\314\303\213\343\323\247\277\354\357\351\242\330\230\373\300\363\364\236\377\273\341\261\212\221\325\225\340\345\300\345\240\242\353\323\214\321\257\202\356\323\273\276\335\205\262\310\314\262\235\340\337\306\212\262\313\242\370\314\337\266\230\375\340\274\370\376\231\214\316\354\240\254\207\233\213\313\262\230\301\327\200\274\271\331\330\323\215\323\214\301\264\232\222\241\301\337\262\200\211\363\300\367\223\207\244\213\370\236\343\337\324\302\320\222\213\334\247\373\214\267\333\340\314\364\360\375\254\255\316\365\366\364\265\306\213\217\207\372\357\272\230\353\307\224\310\215\326\353\303\237\310\240\377\270\217\302\356\333\343\253\352\213\331\377\326\375\225\333\353\251\354\304\344\363\323\243\321\205\210\242\323\265\313\343\206\264\213\273\244\241\203\223\212\302\354\366\214\261\240\363\200\361\363\261\214\363\240\334\326\330\277\204\232\355\201\257\252\236\271\254\221\362\231\312\252\270\267\260\352\256\232\205\253\252\244\310\223\217\331\203\321\210\370\251\200\233\226\343\302\371\365\366\337\234\312\237\260\212\333\250\215\305\345\324\322\365\252\350\274\320\264\234\367\232\316\232\241\261\254\334\204\334\215\320\376\264\337\243\261\232\271\223\245\343\335\375\351\200\365\256\306\271\270\357\334\332\333\352\326\374\213\321\234\231\312\231\355\312\214\327\266\364\311\270\261\363\334\343\310\322\225\331\360\210\322\316\233\351\320\345\322\307\203\317") -TOPIC_TEXT( -"\250\272\242\333\231\326\340\330\316\322\375\320\346\337\370\374\350\364\214\243\230\276\202\302\341\230\322\331\237\322\277\223\367\261\302\303\246\314\256\204\273\206\216\347\300\220\352\224\374\342\232\245\362\367\352\305\226\321\222\323\345\217\273\326\221\235\341\264\246\365\314\350\330\206\255\265\347\317\211\212\370\307\305\374\235\376\324\340\243\270\253\262\206\375\204\221\236\261\216\262\267\260\300\206\273\223\264\272\260\216\347\354\310\360\307\217\274\244\206\307\232\233\363\307\357\274\334\331\220\205\271\301\212\331\226\372\365\264\376\264\221\350\242\307\301\307\301\270\244\357\272\332\234\361\250\370\372\342\204\341\245\240\254\253\255\270\224\265\221\345\360\242\271\371\362\254\307\247\320\362\305\337\317\273\333\354\251\361\372\210\207\217\307\243\372\371\222\321\276\373\367\355\252\365\364\256\342\271\217\227\244\234\305\341\364\277\341\334\243\300\260\251\337\311\316\273\346\226\364\300\343\331\226\363\213\307\242\227\315\370\346\206\270\343\340\204\360\334\330\320\236\347\207\344\334\343\237\262\244\262\220\357\257\265\316\204\264\357\360\200\261\366\321\273\217\333\256\273\263\315\205\277\242\300\251\367\325\353\237\370\335\274\363\347\247\371\271\307\237\232\352\353\360\336\207\244\376\353\247\322\317\356\373\357\375\227\267\343\250\213\376\306\364\236\337\261\347\367\356\215\253\375\232\233\247\354\205\334\364\313\314\377\361\354\354\260\310\333\304\345\305\324\333\230\237\237\306\343\324\243\243\230\210\307\333\272\257\371\222\361\263\261\251\376\357\332\352\223\303\363\311\211\344\345\207\234\247\252\352\254\211\265\333\203\360\337\325\275\330\260") -TOPIC_TEXT( -"\261\324\221\360\325\207\246\254\351\321\301\270\222\322\253\376\351\256\301\212\202\350\346\305\346\227\265\235\262\313\317\247\207\346\220\305\254\226\352\222\357\274\265\337\360\262\370\257\341\206\351\364\326\232\361\266\326\305\255\303\210\253\201\254\314\316\341\260\336\336\234\215\215\262\352\230\243\363\325\272\214\223\323\201\367\361\231\304\322\235\334\274\322\323\230\331\236\355\231\211\251\311\333\230\364\260\256\234\212\224\363\306\372\230\300\370\322\334\201\374\214\262\306\273\314\221\352\260\263\347\361\227\201\334\212\376\364\236\275\202\201\214\315\277\223\316\302\300\226\377\212\353\352\340\347\204\270\262\245\204\232\361\264\236\324\253\340\222\257\341\220\351\235\363\243\263\302\232\213\340\230\302\270\205\241\343\210\204\233\200\272\220\277\241\222\273\251\247\247\314\246\274\363\213\350\265\215\327\374\271\215\357\212\361\230\376\214\354\250\277\327\202\362\317\371\251\362\313\241\261\227\322\273\370\324\370\374\203\253\372\373\273\213\204\221\200\303\200\346\360\352\243\340\312\240\313\346\304\371\213\262\242\335\343\326\246\206\373\216\312\225\342\300\235\363\377\220\331\374\316\201\337\305\246\357\374\333\300\243\260\372\215\237\243\375\255\216\210\265\233\225\252\274\313\341\315\360\353\260\241\241\370\370\301\333\364\254\324\250\301\210\332\250\361\330\212\237\242\332\251\314\371\322\337\255\206\341\364\360\247\363\316\360\316\323\265\236\225\230\231\230\366\340\300\205\276\342\277\344\316\374\342\304\334\363\230\263\320\231\234\312\214\334\362\224\257\226\304\212\342\365\275\300\241\251\313\316\316\212\243\341\274\352\207\300\367\376\266\202\302") -TOPIC_TEXT( -"\366\303\260\343\326\241\214\214\230\350\336\341\217\253\364\223\242\347\303\377\305\321\325\331\361\362\253\300\337\271\306\327\370\254\273\351\205\306\234\305\317\343\343\252\321\371\230\251\253\333\301\255\347\350\224\317\327\217\210\364\376\354\277\324\333\260\256\302\265\310\355\245\241\257\241\225\224\353\367\253\256\250\260\357\241\350\255\360\325\204\253\332\245\271\271\364\275\207\317\372\245\361\240\366\374\357\327\250\325\220\325\243\274\327\223\354\344\340\374\331\240\245\336\246\301\352\202\372\326\373\350\264\372\274\306\303\222\201\366\314\254\213\307\265\212\370\315\206\325\210\201\255\343\211\203\257\340\265\251\217\226\264\313\311\343\325\375\274\343\321\344\331\246\374\330\265\222\344\333\217\254\222\250\352\243\213\236\243\324\376\305\257\242\346\272\356\204\334\315\230\210\266\226\276\227\262\317\341\313\237\340\323\244\323\303\374\310\364\372\362\204\315\312\243\342\234\221\252\247\206\266\223\300\350\305\231\347\317\227\315\245\267\231\272\215\305\217\210\373\324\324\223\252\366\252\203\235\332\310\301\213\214\267\333\377\252\317\333\244\302\215\220\236\253\336\303\307\360\314\353\211\311\243\224\260\240\233\373\304\332\355\304\227\217\351\300\266\273\320\242\325\346\216\214\216\302\360\200\340\367\356\327\370\364\270\236\237\271\274\377\333\233\206\345\223\343\336\364\224\266\361\320\302\254\260\324\221\265\336\375\373\370\365\237\352\340\265\324\327\373\266\370\355\352\321\311\305\273\233\253\370\254\215\352\350\261\267\332\356\300\316\255\344\211\227\250\247\262\366\260\226\272\254\223\331\325\304\233\331\256\363\355\212\347\220\344\247\270\210\304") -TOPIC_TEXT( -"\343\317\337\245\334\236\210\221\356\250\220\300\347\345\351\351\263\270\330\213\356\374\353\250\254\201\305\211\261\342\261\236\312\345\354\345\337\263\373\230\207\332\241\376\227\236\232\353\304\343\363\360\252\317\217\344\370\330\376\300\326\307\357\331\361\370\373\322\261\337\305\342\342\243\253\321\311\234\343\312\330\315\251\354\261\203\320\227\247\322\371\255\343\370\255\324\224\226\210\225\246\201\347\343\206\314\370\337\373\362\271\271\376\317\337\303\203\275\353\301\247\233\243\205\240\275\202\337\251\207\355\253\256\242\231\250\304\342\375\223\334\315\313\370\227\277\261\374\245\335\264\370\211\301\315\266\233\253\332\354\314\307\331\233\311\247\301\212\330\314\274\322\235\354\307\276\310\365\333\210\313\311\352\357\304\207\333\213\224\317\244\244\244\265\254\342\222\267\375\321\343\261\320\366\215\274\254\375\320\340\277\344\330\357\243\214\305\342\300\351\236\334\201\364\304\363\366\337\312\312\244\301\372\306\240\315\237\251\236\315\200\311\314\346\242\253\257\327\252\355\311\360\375\312\330\240\366\262\303\276\214\210\304\350\323\230\267\307\301\227\257\213\253\232\203\221\310\276\320\250\203\260\251\314\350\212\311\204\224\221\216\314\327\212\372\261\374\332\231\315\201\341\347\235\221\252\215\215\247\372\234\242\307\251\265\310\301\211\310\351\324\326\316\373\272\245\314\275\213\337\332\343\234\217\360\327\320\302\214\242\267\244\357\227\326\203\202\271\216\370\234\321\370\252\363\254\376\336\355\351\225\222\332\257\216\236\331\273\267\373\371\363\243\216\272\307\271\307\274\276\227\335\343\260\336\343\367\377\222\313\205\247\363\355\365\360\206\303\273\356") -TOPIC_TEXT( -"\334\231\250\263\265\325\327\245\336\270\210\254\236\233\241\204\245\336\251\253\230\377\313\252\315\240\211\375\273\364\262\341\212\356\252\261\366\356\363\242\307\210\367\246\250\301\321\314\201\222\353\213\334\364\230\333\301\242\302\334\226\363\362\206\200\211\351\367\216\336\273\321\365\321\370\307\237\261\276\332\354\227\332\217\325\220\324\210\216\357\212\367\267\323\343\230\314\270\200\273\265\232\243\236\237\270\333\260\337\233\217\203\326\272\272\334\330\323\271\264\340\313\256\303\325\214\212\364\222\367\331\213\261\300\324\247\311\355\206\335\273\261\314\306\331\335\312\367\256\225\300\206\342\221\300\342\363\230\347\355\337\206\262\326\226\327\326\343\222\323\363\343\306\231\236\203\211\330\220\213\374\312\347\201\331\343\217\335\254\215\350\332\305\275\360\366\373\222\334\324\302\357\335\375\224\341\225\374\307\237\344\347\255\315\215\373\241\365\252\232\340\352\347\331\300\251\253\360\331\261\241\231\360\330\202\212\344\321\357\274\361\226\333\235\266\203\345\270\305\361\362\206\315\264\307\215\304\214\336\245\331\230\347\233\362\330\236\360\263\232\346\276\344\356\254\236\343\217\371\256\246\350\270\217\245\372\344\255\312\267\336\262\260\231\232\344\233\262\206\277\326\257\364\341\351\323\240\344\301\325\227\335\342\253\247\302\332\307\377\334\227\331\343\246\334\256\270\331\203\264\334\355\237\353\235\373\254\226\312\307\305\310\322\202\321\231\306\260\200\215\227\312\347\330\216\233\221\276\325\232\330\312\332\317\362\301\350\254\343\355\210\365\311\274\241\262\247\217\311\202\341\271\250\323\376\235\302\244\337\330\351\272\267\244\212\345\341\226\204\234") -TOPIC_TEXT( -"\307\274\313\246\227\230\237\276\263\271\376\332\232\357\203\220\277\255\257\374\246\274\374\353\230\315\377\367\370\310\255\352\312\216\237\326\373\260\276\236\366\357\272\266\306\213\313\333\353\250\312\235\367\300\210\275\273\336\371\265\323\323\360\316\317\262\233\263\263\235\375\306\236\370\201\214\213\325\332\371\314\367\231\342\364\334\215\274\276\345\311\204\227\271\227\345\324\206\343\332\225\303\341\201\351\255\341\306\352\371\233\342\242\250\306\354\311\365\214\246\211\213\343\307\314\225\342\207\250\224\241\314\323\213\352\274\234\233\335\247\322\331\374\354\204\336\322\375\343\343\203\214\230\357\213\357\355\242\276\272\332\334\213\360\230\322\256\327\313\256\232\372\234\320\326\217\360\276\336\221\276\335\266\227\312\212\374\257\235\373\225\243\274\233\226\243\265\222\313\355\246\231\235\364\276\215\332\373\376\214\361\204\234\266\332\222\361\360\334\300\257\255\344\215\252\306\211\202\221\264\202\370\374\360\206\346\325\263\234\367\250\225\336\377\262\207\276\261\352\274\315\365\336\215\310\212\307\303\215\331\221\201\361\250\226\267\353\353\277\333\201\306\201\221\311\376\263\371\371\230\347\364\322\321\202\254\272\357\261\356\316\334\321\342\366\320\323\311\202\330\362\255\223\376\254\246\200\311\355\262\310\271\236\202\264\247\336\240\370\237\262\220\312\363\215\322\252\322\206\373\276\224\372\262\350\370\342\210\271\221\222\314\273\357\244\303\261\277\274\246\202\211\325\354\346\273\332\347\227\234\224\226\244\235\345\345\316\325\254\273\203\326\204\201\250\326\317\214\341\346\226\352\245\273\251\333\301\226\225\222\340\347\262\210\350\340\203\201\303\210") -TOPIC_TEXT( -"\305\257\210\202\327\250\362\306\227\234\304\216\332\312\317\334\212\215\364\321\226\244\345\315\215\237\220\233\327\274\346\340\261\251\261\313\217\304\265\336\277\367\321\277\201\366\227\326\370\277\275\316\256\354\326\336\322\240\343\272\307\366\325\267\325\334\235\325\353\373\265\374\251\323\356\372\327\246\210\233\264\352\235\345\225\234\316\367\340\316\271\301\343\265\352\203\255\271\354\271\320\270\330\370\225\342\333\202\344\245\255\206\336\360\231\376\262\302\345\321\345\251\367\316\303\306\235\327\206\325\210\312\361\201\306\346\344\331\341\305\227\370\275\377\377\375\376\213\267\215\354\352\355\256\302\354\350\201\377\312\336\236\275\272\323\246\322\302\302\244\261\365\226\210\255\221\326\257\215\213\221\217\217\236\271\324\262\374\256\200\200\300\304\374\276\312\306\251\353\337\344\361\214\235\235\303\356\310\360\265\233\314\203\305\351\217\325\215\306\223\357\336\357\362\314\300\302\204\306\310\261\257\307\213\347\261\302\227\377\343\367\250\375\237\364\373\252\312\212\335\333\273\376\250\210\242\232\330\202\230\360\254\265\345\370\316\232\201\306\274\305\221\252\263\323\307\335\360\357\242\241\226\354\306\332\307\361\266\334\233\326\350\207\342\254\250\331\237\254\276\315\352\342\205\255\206\340\343\357\347\253\350\331\243\364\375\232\273\305\221\232\207\377\333\231\301\325\214\201\317\303\336\263\275\272\247\371\306\270\222\341\350\271\247\234\261\247\322\304\214\320\362\204\312\360\257\344\310\355\272\340\261\375\274\347\245\342\206\307\224\325\232\320\211\272\340\261\275\325\301\340\252\377\376\347\323\235\304\255\214\351\304\346\311\207\276\323\240\313\323") -TOPIC_TEXT( -"\365\363\252\264\252\325\220\256\204\261\241\270\213\242\253\344\330\252\275\332\223\214\245\200\210\260\271\266\244\252\212\367\230\301\200\243\202\247\251\277\361\251\204\264\351\340\260\224\331\353\211\260\244\302\367\330\215\266\206\216\207\307\367\351\370\301\302\350\336\343\277\345\301\304\302\234\303\361\347\247\207\265\212\270\325\252\247\352\356\314\257\312\313\371\342\250\336\323\225\221\372\217\345\220\250\210\344\326\231\303\270\347\363\217\211\307\306\250\276\302\242\253\320\214\245\340\343\213\265\310\241\234\356\354\334\330\331\272\362\261\326\333\372\251\210\335\323\361\305\337\355\361\226\216\270\343\275\270\326\252\363\203\242\260\254\327\242\366\347\376\377\363\255\273\365\224\321\300\311\210\330\316\276\263\236\357\365\335\367\360\314\341\305\252\351\212\362\372\314\312\257\226\272\343\203\341\302\264\335\375\301\275\304\342\261\334\230\230\230\210\203\255\343\315\236\321\276\355\334\361\261\201\354\355\355\277\367\314\316\313\237\224\374\242\234\272\334\315\325\227\261\334\214\314\302\361\352\353\375\245\333\273\332\327\353\324\250\340\274\353\373\366\255\226\216\371\250\257\244\377\376\352\200\330\365\246\347\254\221\246\322\212\212\221\205\355\320\277\356\305\352\342\341\353\242\303\214\252\350\221\342\261\236\240\205\222\242\212\317\334\376\276\242\253\200\344\254\271\206\346\344\376\272\307\327\244\323\202\254\253\353\354\245\225\235\207\364\226\206\305\253\225\240\310\271\240\202\272\201\231\316\303\304\375\370\222\247\203\364\265\232\251\214\344\240\352\224\223\303\364\214\360\201\211\322\230\302\217\237\252\356\351\361\310\216\236\366\315\375\301") -TOPIC_TEXT( -"\243\224\351\352\254\375\312\224\325\344\377\276\320\371\246\341\261\224\217\322\243\217\216\314\242\361\207\310\202\307\314\335\224\345\273\316\327\231\217\301\306\270\242\235\370\304\353\345\317\227\303\246\251\325\213\363\223\203\311\307\300\337\340\207\323\360\240\200\302\356\370\314\327\361\340\303\375\335\323\343\375\324\241\304\320\224\345\301\304\244\300\332\225\340\240\316\263\215\341\367\230\276\267\370\365\257\323\354\274\324\326\364\261\220\310\222\354\354\327\363\363\305\371\343\237\226\215\357\207\360\320\352\203\330\232\241\366\245\240\244\202\210\236\263\316\307\303\233\210\353\333\365\216\253\276\260\314\226\235\244\251\222\215\214\271\316\340\212\217\274\217\276\331\330\301\352\375\371\331\271\271\314\315\313\275\376\255\241\225\217\352\260\263\250\242\252\213\357\226\210\252\371\312\350\333\372\207\341\262\256\241\372\327\203\223\223\364\374\247\266\365\215\200\331\265\254\366\277\237\301\225\234\271\247\204\353\335\334\325\202\252\360\342\266\245\307\276\306\257\243\223\331\337\355\273\335\350\242\261\245\217\236\203\214\361\366\343\363\226\301\326\215\220\214\360\353\225\244\306\253\374\246\347\314\361\242\205\230\277\302\306\216\333\364\261\321\365\273\334\363\353\353\245\222\342\377\270\213\316\317\214\240\205\370\300\246\257\377\341\366\202\343\213\224\255\310\302\206\307\244\264\375\354\346\376\356\331\256\253\311\241\205\247\277\214\350\224\237\263\226\234\303\223\230\377\247\365\312\355\316\327\234\331\223\331\307\203\364\250\335\343\273\342\273\245\275\252\365\251\343\214\305\342\322\264\254\345\264\251\222\323\257\325\221\340\260\361\360\260\210") -TOPIC_TEXT( -"\372\375\237\370\217\353\377\373\331\356\245\323\377\331\357\232\277\342\337\204\361\306\352\266\201\275\333\260\210\375\272\233\221\365\214\345\263\230\364\201\206\340\200\351\274\211\227\221\362\240\376\206\223\250\251\271\201\237\322\324\225\316\376\225\371\262\306\302\305\356\337\347\274\316\205\265\344\220\361\236\231\334\214\201\310\306\271\323\333\264\356\311\250\232\347\226\212\334\365\322\374\337\321\271\202\336\235\343\315\272\307\335\355\356\277\272\307\301\315\201\307\364\344\227\273\202\201\236\354\216\350\231\371\375\265\357\357\337\227\267\267\370\334\201\233\311\256\272\343\361\213\233\214\266\341\304\317\306\250\231\226\251\233\257\270\270\351\362\265\302\212\341\306\322\226\327\304\350\200\345\346\341\346\301\345\214\223\202\304\254\363\246\266\335\216\275\360\270\262\341\335\214\347\374\350\221\303\214\206\334\315\261\343\333\265\233\325\244\322\337\374\332\330\331\312\265\354\344\322\261\275\236\337\334\357\324\220\245\311\220\300\210\325\243\311\346\227\240\216\253\331\242\257\227\343\300\362\234\220\320\346\207\370\343\361\325\366\345\205\340\261\253\365\331\372\265\254\302\272\320\375\261\207\307\315\246\277\236\207\303\313\321\203\276\335\372\217\347\216\247\324\312\332\322\327\275\346\364\202\326\317\345\324\232\235\314\231\213\310\242\326\365\310\203\214\203\217\361\257\340\366\323\252\201\244\301\374\307\362\236\317\315\207\366\354\336\370\255\232\270\330\301\344\344\301\264\346\254\226\343\374\332\353\327\365\365\371\267\252\363\244\252\356\245\234\277\222\354\262\235\303\263\366\200\351\233\273\237\227\262\323\352\240\211\230\340\202\301\227\226") -TOPIC_TEXT( -"\266\211\272\311\201\321\355\361\314\334\314\241\335\216\374\323\352\262\342\271\306\313\210\214\373\254\260\342\254\246\351\206\334\316\241\274\344\235\367\241\366\201\237\373\230\362\263\226\332\343\314\255\357\232\366\323\222\360\315\330\255\326\342\307\256\272\313\307\304\343\355\247\217\345\250\212\211\274\366\320\216\262\232\213\241\376\374\236\303\306\202\336\315\377\333\321\366\231\313\314\346\201\306\252\236\263\371\341\351\356\223\202\307\224\224\342\343\257\215\233\373\230\200\204\361\245\340\376\343\331\205\245\314\203\364\203\361\245\343\254\357\240\215\336\251\271\250\240\315\327\376\304\367\357\214\327\357\367\304\330\257\267\304\217\243\240\337\340\252\320\217\367\277\354\374\243\235\276\265\330\274\217\272\327\321\231\344\233\240\370\227\341\343\240\275\225\336\244\236\331\223\247\337\362\334\360\270\366\366\265\325\340\261\306\235\365\335\245\337\362\302\303\271\361\327\336\324\373\314\273\362\273\223\346\316\347\316\305\331\261\265\234\340\330\275\276\352\204\276\232\357\206\231\261\304\331\324\252\374\356\242\340\206\333\341\334\321\231\263\254\210\222\204\363\320\237\334\201\230\276\326\272\262\236\353\216\310\306\223\252\377\223\216\367\262\330\314\334\204\310\365\317\225\226\346\255\301\250\275\207\273\335\323\372\255\252\202\363\327\367\373\306\305\247\237\221\343\201\373\300\324\310\226\271\343\345\273\251\356\220\367\315\375\301\226\234\352\233\237\331\240\352\345\343\351\345\371\315\342\222\215\307\341\263\325\235\365\335\343\230\226\215\363\347\332\211\362\252\264\362\343\234\225\367\302\356\223\225\304\236\373\207\231\373\336\230\353\342\301\260") -TOPIC_TEXT( -"\213\224\274\326\256\271\325\315\355\377\240\222\334\334\335\331\306\210\207\336\302\217\226\236\340\257\254\236\276\234\303\310\333\370\254\335\367\240\241\345\260\205\331\213\360\331\315\260\316\256\207\226\373\310\202\374\251\277\363\203\251\265\306\203\253\215\304\227\311\242\314\202\236\273\236\325\224\210\227\356\261\351\316\352\366\301\200\207\312\231\366\365\342\234\262\362\200\221\376\340\343\336\316\326\331\311\246\341\217\310\212\372\347\266\334\235\224\353\225\261\377\337\306\336\376\265\333\325\205\307\226\272\324\270\237\265\371\360\234\341\353\353\307\335\212\220\374\365\334\347\213\347\317\200\335\301\204\343\353\337\324\344\331\237\271\213\302\277\365\267\267\336\324\235\230\350\356\354\371\271\313\255\334\341\376\365\271\315\363\263\254\201\301\230\374\263\326\334\262\220\266\247\233\365\343\240\327\265\217\210\364\233\203\311\202\243\203\332\261\371\205\206\203\206\265\303\374\215\340\316\313\315\321\360\361\230\347\207\253\201\251\201\243\342\212\200\362\277\200\260\344\272\310\306\326\235\330\365\372\273\373\311\317\336\366\373\316\344\226\372\362\343\214\261\203\210\245\344\303\360\363\267\271\212\331\262\351\225\250\322\205\227\210\243\312\311\331\335\372\367\354\271\230\321\251\272\251\261\256\336\320\322\253\340\240\330\205\320\271\271\301\225\272\276\361\230\330\317\240\221\255\346\376\356\330\221\245\346\202\335\306\322\350\203\217\332\202\256\266\374\311\310\226\273\242\367\377\270\270\271\345\314\360\222\257\343\300\205\261\271\270\272\200\206\302\255\363\242\241\315\375\356\307\214\357\265\203\373\374\352\331\347\320\345\345\356\265\277\376\340") -TOPIC_TEXT( -"\255\247\200\276\336\246\317\255\340\303\240\353\327\227\354\344\270\207\312\357\360\373\203\267\370\212\202\337\311\306\320\302\215\215\252\231\266\342\350\303\246\234\250\337\356\322\360\270\350\322\264\321\302\325\275\206\331\365\267\217\217\347\234\361\243\373\211\314\270\325\217\224\244\340\371\230\243\246\231\316\344\205\357\241\366\346\373\245\347\316\221\341\245\205\344\362\256\313\354\201\324\303\252\314\277\361\375\363\234\372\213\324\224\250\323\300\304\204\333\243\354\315\331\261\222\272\273\271\251\201\207\305\211\213\363\201\361\364\330\363\346\221\235\303\317\234\322\247\270\331\216\213\323\260\252\266\376\212\220\236\350\356\234\252\270\235\237\265\375\373\331\361\327\333\276\275\341\226\321\215\206\222\323\334\230\250\346\314\237\217\246\333\341\310\233\306\214\300\206\211\273\272\261\214\213\375\366\254\255\357\270\204\373\232\264\210\316\315\256\211\371\243\217\276\262\273\327\352\201\307\247\216\235\307\252\361\206\335\277\332\212\317\360\220\302\307\333\343\346\264\205\312\376\236\307\323\333\303\224\321\277\216\256\277\214\247\203\313\261\360\336\364\202\334\201\211\266\200\333\341\345\353\266\304\271\207\216\367\302\346\267\311\350\214\217\331\321\360\213\351\306\313\237\244\322\325\344\267\334\371\304\342\366\233\244\244\263\254\242\230\352\371\340\217\273\333\343\303\235\324\352\264\307\247\310\277\223\216\357\367\322\331\304\314\377\215\301\256\213\232\233\213\241\347\317\226\325\247\234\311\342\267\224\323\225\246\256\231\332\307\277\200\237\230\202\351\370\225\330\264\313\267\262\270\374\201\277\323\370\372\374\371\323\347\200\317\327\331\243\351") -TOPIC_TEXT( -"\365\345\247\371\331\263\265\316\351\231\306\265\361\370\354\325\307\307\201\360\214\346\203\230\363\376\366\243\324\273\275\277\264\322\215\324\277\211\351\260\326\347\234\246\323\201\246\366\374\341\204\376\356\373\370\243\246\271\226\221\366\315\275\363\345\315\255\371\251\211\246\253\251\351\234\355\237\255\345\311\275\331\276\325\221\362\363\362\362\232\232\275\311\350\324\260\334\310\332\222\360\230\347\321\261\276\272\302\325\275\256\374\246\254\262\272\335\343\242\250\267\300\371\231\331\350\314\346\314\204\225\235\275\362\353\340\231\305\201\306\304\341\214\253\364\253\202\313\327\324\377\323\274\252\245\340\322\315\267\233\226\255\204\243\262\200\356\377\357\327\356\317\227\203\222\306\361\271\271\202\235\273\266\201\212\265\350\241\334\300\362\307\326\300\250\360\301\217\331\212\325\357\307\354\310\314\356\333\345\252\337\250\215\232\262\303\370\317\317\336\271\337\354\230\325\216\222\246\274\343\343\204\241\215\373\254\200\300\345\212\246\372\214\272\373\274\267\312\364\313\302\213\223\270\227\321\313\346\311\236\255\254\260\367\231\200\371\333\217\234\330\237\362\227\263\227\243\225\327\267\373\221\252\371\363\260\253\375\327\257\377\222\321\261\227\366\313\230\361\267\345\345\345\341\326\363\307\257\352\206\253\277\277\347\200\230\305\252\360\257\244\255\367\246\202\346\307\373\305\214\216\303\313\312\222\364\274\274\230\325\360\237\245\374\270\347\360\254\242\203\233\333\375\306\315\252\225\324\236\313\271\212\265\304\356\240\323\303\312\265\323\243\222\203\207\214\313\236\211\235\272\200\230\325\277\260\364\207\320\261\266\205\245\367\313\354\203\226\360\251") -TOPIC_TEXT( -"\203\370\275\231\370\314\214\274\250\303\374\251\374\332\340\360\200\343\317\213\273\264\355\224\316\353\207\231\333\305\251\277\251\257\217\257\361\334\341\274\312\203\200\247\211\370\314\275\344\300\275\227\232\241\372\243\310\207\236\220\362\302\354\203\307\213\246\323\252\204\205\323\223\274\254\260\200\210\350\250\346\206\362\340\306\233\255\347\213\243\307\355\315\367\227\346\247\360\303\236\222\302\225\356\252\312\362\222\267\240\321\307\252\321\320\207\233\257\266\226\203\245\244\316\237\350\356\262\263\210\373\277\332\242\216\235\246\206\204\217\300\354\352\325\265\371\231\257\341\213\355\341\242\204\364\340\357\222\367\203\347\321\255\261\221\265\344\226\366\367\200\374\354\340\356\272\340\246\235\213\315\215\312\311\255\251\346\272\357\230\202\351\272\224\231\247\203\300\202\336\316\323\357\252\342\334\231\263\216\307\242\271\216\271\345\270\277\366\204\247\266\200\271\355\213\376\341\201\336\316\336\357\216\305\333\201\314\350\212\207\363\343\210\350\345\344\224\253\222\355\363\270\236\331\377\307\277\252\302\233\236\266\340\343\230\236\312\266\254\206\222\314\213\353\332\272\306\236\241\361\250\245\276\230\357\334\332\232\251\200\237\362\322\331\342\302\204\341\203\311\303\356\364\335\310\271\313\215\304\356\304\343\325\232\253\330\260\204\320\244\304\202\261\323\377\354\215\252\232\261\327\223\334\337\372\353\255\251\263\243\247\315\371\364\350\221\271\265\257\250\362\246\342\261\253\263\201\330\217\317\346\317\222\332\370\356\355\253\363\230\207\344\235\376\262\366\212\374\352\371\275\256\345\247\345\345\225\265\277\354\260\273\200\362\242\256\233\335\200\224") -TOPIC_TEXT( -"\337\313\350\264\236\203\201\200\306\300\360\247\376\245\252\333\363\362\265\302\216\230\377\240\257\343\202\354\270\357\366\272\200\302\232\326\327\277\343\351\275\366\324\363\235\203\252\253\252\312\215\231\271\316\250\277\371\333\376\201\266\335\320\361\350\221\270\303\222\352\250\325\236\366\230\344\316\334\311\214\336\340\246\371\213\210\210\371\260\357\320\343\376\306\323\340\335\314\251\302\220\200\343\353\245\333\366\201\234\230\210\376\317\313\313\315\241\234\256\324\375\355\372\352\377\200\233\352\200\270\265\376\262\365\230\306\254\316\223\231\236\230\351\353\235\326\276\217\254\366\252\225\370\231\367\374\257\335\347\313\274\274\241\240\225\362\234\230\351\347\363\332\276\343\250\313\302\314\324\250\210\331\315\263\202\340\357\207\245\374\304\332\230\232\314\324\316\242\307\247\217\374\264\335\272\367\224\227\325\365\253\307\350\300\316\330\322\314\266\324\335\320\276\365\243\370\210\246\202\356\254\206\202\203\270\255\247\363\203\335\360\330\206\342\324\317\226\226\334\250\323\332\250\200\202\360\310\267\366\250\375\214\371\333\314\334\250\310\330\266\206\201\250\212\376\253\303\347\227\245\271\201\302\313\215\320\351\274\272\215\376\245\253\235\330\214\211\217\225\254\301\352\254\203\351\251\321\265\252\316\346\307\251\230\307\237\344\214\265\323\255\212\261\304\302\317\265\263\351\331\271\343\200\243\222\375\227\320\304\273\371\275\371\362\342\310\343\376\306\234\234\351\314\204\266\234\307\305\276\277\260\336\306\351\372\360\271\363\204\234\207\234\234\330\343\261\263\340\274\346\272\200\317\210\360\370\370\362\362\222\363\337\271\371\344\355\353\323\275\220") -TOPIC_TEXT( -"\362\302\367\354\206\203\361\371\341\364\203\354\203\201\267\274\366\363\356\235\203\337\204\236\233\352\346\357\262\216\333\311\321\371\352\231\233\300\226\346\325\225\322\345\305\337\355\341\213\261\335\364\322\221\372\223\312\277\215\240\342\251\370\246\223\235\212\335\262\356\376\333\351\241\215\342\237\263\266\357\347\264\306\205\235\306\370\355\201\316\247\201\304\252\363\230\374\334\302\374\256\200\273\205\346\306\333\257\230\237\373\245\221\273\335\377\215\340\314\262\215\263\343\223\203\242\325\301\233\232\331\236\344\204\262\230\344\347\266\375\362\311\247\343\327\377\240\352\217\274\206\277\220\212\211\202\326\352\222\324\371\363\312\264\234\202\206\325\220\206\200\305\200\371\376\352\330\216\376\221\316\273\207\217\264\252\343\262\302\336\321\232\226\365\375\361\373\351\374\306\307\201\203\315\365\327\245\244\343\251\230\267\334\343\214\363\207\322\211\372\351\363\261\256\236\306\250\330\215\204\267\203\277\246\231\316\236\257\317\257\274\376\275\370\244\270\310\257\216\370\316\354\305\247\365\363\367\360\311\350\240\233\263\236\375\272\362\211\274\344\254\254\271\305\304\233\353\326\264\334\363\345\214\366\347\312\201\244\306\343\263\354\261\341\371\214\267\354\257\331\362\346\233\357\376\310\355\321\272\246\212\224\253\310\246\321\354\227\314\313\351\343\370\251\322\340\237\242\302\211\337\224\231\226\211\370\257\226\361\325\340\231\257\303\212\257\276\310\302\316\326\266\272\260\261\211\245\321\362\272\246\264\247\345\247\343\325\262\346\324\374\246\231\217\305\242\300\343\362\353\245\245\240\344\201\276\300\216\255\216\371\351\341\322\256\255\270\302\315\365") -TOPIC_TEXT( -"\234\377\221\364\317\265\325\327\325\327\203\255\346\212\366\263\211\277\307\326\360\230\271\356\263\236\321\321\213\341\275\267\202\325\305\262\270\266\212\257\251\211\363\227\300\273\213\377\233\235\255\275\315\253\222\346\337\310\277\320\262\306\303\221\306\376\321\200\274\303\276\344\376\260\341\261\206\354\232\233\243\311\344\303\266\306\313\377\317\216\230\367\235\375\266\240\367\320\352\201\203\255\253\252\312\303\312\235\360\315\307\212\324\314\356\277\222\351\203\375\235\370\273\273\241\376\263\201\340\330\277\263\370\300\201\375\215\305\342\377\363\222\205\236\213\325\245\265\217\370\224\371\313\330\336\352\315\247\252\233\324\307\322\343\310\261\203\357\223\275\360\355\300\342\265\256\362\373\345\357\337\254\276\371\344\210\343\307\214\317\353\355\254\227\314\364\274\366\216\305\244\343\343\234\261\364\260\366\262\277\350\276\370\334\327\265\256\241\244\202\235\305\322\324\216\345\330\205\270\260\276\202\263\274\363\361\306\233\277\376\361\217\370\231\270\341\237\342\201\307\243\214\304\340\211\203\251\331\233\320\324\277\231\350\275\275\336\371\275\371\301\270\303\324\232\261\317\370\341\275\323\251\354\277\227\257\244\305\204\307\212\313\213\323\361\212\350\324\305\257\300\217\370\343\225\217\375\317\226\236\376\363\267\327\342\373\273\333\275\312\204\250\373\346\341\272\316\371\342\250\234\367\221\220\210\360\230\330\366\333\331\320\303\230\364\360\317\320\272\305\364\212\274\333\357\371\371\350\221\303\214\246\301\200\265\265\374\200\324\336\371\265\363\247\321\327\217\221\267\267\361\247\340\343\210\334\331\307\260\236\303\361\261\263\266\344\236\366\326\265") -TOPIC_TEXT( -"\373\266\337\201\307\314\276\274\362\345\353\312\331\243\277\366\364\331\363\336\277\327\373\356\314\231\334\263\371\371\224\255\210\214\271\364\373\370\351\355\264\234\371\334\250\227\262\201\307\260\275\336\356\223\220\265\364\275\275\263\302\342\307\357\331\267\327\343\322\261\337\245\377\331\277\257\205\371\351\342\352\366\242\315\344\315\363\203\306\350\233\332\332\260\202\257\224\310\260\211\357\313\363\230\231\311\217\337\257\271\211\354\205\356\222\314\357\200\335\340\361\376\265\316\261\200\261\303\212\360\211\361\247\364\303\360\302\331\313\362\200\205\211\244\376\362\367\301\364\254\371\342\226\346\272\370\306\351\270\255\260\341\377\230\255\253\343\230\361\354\353\217\260\353\245\333\261\240\367\314\200\371\345\265\231\363\247\236\236\246\212\235\277\276\306\370\314\332\231\222\235\301\234\301\352\333\251\323\307\307\320\307\231\243\241\367\202\213\231\350\271\316\371\221\322\200\274\227\320\255\342\261\272\316\345\251\221\226\204\274\376\346\216\336\247\335\347\246\341\225\363\257\222\322\337\312\355\363\264\213\346\354\261\265\373\242\341\302\343\321\230\266\273\274\371\347\343\322\351\324\274\307\277\223\356\203\340\361\231\323\354\337\306\204\307\356\256\343\274\275\273\336\215\216\215\235\361\361\230\210\372\263\261\303\275\237\350\260\311\300\216\363\263\252\221\214\342\325\225\345\377\374\257\311\300\373\331\331\227\333\200\312\370\311\262\202\300\244\242\323\303\265\230\210\265\342\237\217\201\306\330\273\251\361\225\263\246\302\242\254\201\346\347\247\230\314\256\222\364\226\371\271\271\366\274\274\273\301\253\377\225\235\275\207\241\374\200\266\216\332") -TOPIC_TEXT( -"\331\311\271\300\343\313\271\302\263\314\247\341\354\230\225\312\261\336\276\346\232\345\374\324\235\322\205\263\227\265\350\344\267\311\325\267\203\273\376\367\322\310\247\267\342\260\227\326\256\367\225\273\273\272\201\243\336\263\315\226\325\265\270\201\321\352\347\312\275\340\347\351\356\351\303\332\212\332\347\212\213\246\315\374\300\245\326\216\234\330\341\217\373\363\365\271\274\252\260\233\365\332\230\304\305\352\210\240\211\265\236\342\251\274\270\304\317\327\330\347\274\214\327\253\253\233\324\334\361\322\376\361\352\345\262\301\327\357\322\326\203\251\277\370\231\243\213\371\367\230\277\372\370\314\255\321\343\226\246\245\375\202\313\203\337\371\347\235\272\212\203\301\261\364\210\343\204\263\325\220\362\337\370\343\215\214\273\260\270\255\235\314\366\251\343\214\323\340\310\206\326\300\341\374\273\222\213\346\300\257\231\370\311\255\203\233\350\274\247\246\353\330\316\210\345\235\355\205\231\265\212\304\230\224\252\210\217\210\217\305\241\367\246\246\234\226\332\330\213\242\377\270\342\364\211\234\252\312\252\262\237\370\354\247\352\270\360\256\370\234\351\320\202\335\217\303\354\266\206\335\273\367\365\322\267\205\377\364\216\324\365\365\266\234\251\240\246\326\211\234\331\332\234\322\351\323\354\214\304\272\264\260\311\231\372\201\303\340\343\240\345\317\334\204\225\343\253\346\267\226\214\304\313\261\235\273\277\205\372\214\333\203\217\201\315\230\331\237\370\274\324\327\205\316\276\207\320\372\341\363\240\225\360\274\343\311\261\230\325\342\321\324\253\320\234\310\303\375\274\235\332\247\206\233\244\233\361\236\351\251\377\235\371\264\237\232\346\276\272\366") -TOPIC_TEXT( -"\201\267\360\267\240\375\372\233\274\270\336\266\247\356\272\257\257\344\221\372\213\332\212\237\334\234\257\353\341\332\304\311\302\367\332\207\265\300\327\227\212\255\257\220\366\354\331\232\337\276\337\206\345\237\341\313\210\260\353\255\376\251\232\313\263\323\253\343\264\307\213\216\335\314\211\223\223\243\216\365\222\337\270\322\203\225\373\221\255\220\216\201\267\336\316\326\266\214\320\223\372\220\360\336\215\305\372\225\306\201\257\376\326\326\332\326\234\276\271\204\370\306\324\371\231\340\354\342\312\340\264\325\301\347\230\347\304\200\252\302\340\305\202\317\214\343\230\206\336\203\270\226\322\376\311\374\337\333\363\231\340\374\363\312\343\261\254\270\262\306\227\313\230\352\223\252\310\205\262\237\233\354\244\212\324\233\331\356\202\226\242\305\354\274\303\260\355\323\214\253\205\217\374\211\372\222\353\307\273\211\257\370\315\231\261\362\376\327\267\242\361\330\261\352\230\302\215\307\347\353\363\336\215\211\377\353\264\262\234\313\353\345\306\216\375\343\261\250\305\203\361\256\330\356\360\342\261\207\341\323\330\233\260\377\341\351\345\343\225\327\312\374\342\261\336\237\327\361\354\344\240\213\241\213\371\310\325\370\340\261\257\220\357\316\375\346\237\376\222\343\315\230\312\301\250\345\301\307\265\310\216\240\336\276\257\340\344\250\331\370\306\335\213\365\316\221\217\345\346\240\210\361\345\303\217\272\277\225\207\217\305\354\265\301\274\202\223\217\361\244\201\220\223\214\217\230\240\207\275\216\214\365\330\370\324\252\324\266\226\304\210\276\267\235\230\263\365\313\202\236\230\331\373\217\206\324\377\371\273\211\300\246\253\321\266\254\200\353\244\351") -TOPIC_TEXT( -"\366\222\376\251\270\342\370\237\274\336\253\354\346\206\324\274\300\344\336\327\371\272\366\335\223\325\357\327\207\257\346\272\227\346\346\260\216\347\277\303\346\260\230\266\252\224\361\215\300\330\204\322\207\325\321\254\203\357\222\333\301\343\231\236\276\335\377\263\267\225\330\255\200\353\361\234\373\204\266\306\224\270\261\223\241\203\305\264\206\300\302\304\346\230\333\222\266\232\230\345\374\354\200\252\356\335\201\355\237\370\310\205\312\335\254\274\336\366\330\375\206\330\216\244\356\312\301\346\233\312\255\314\244\253\325\363\220\376\254\347\271\225\370\344\276\277\343\323\360\261\203\260\203\347\302\227\327\206\233\345\222\311\224\311\370\346\265\203\213\254\253\241\327\377\306\274\314\333\277\323\370\265\302\343\222\333\301\335\244\344\365\330\373\366\247\374\353\273\375\254\347\241\264\203\346\323\264\215\355\312\233\310\230\202\326\325\326\350\302\337\277\266\244\264\265\317\356\255\352\230\372\244\231\260\335\212\204\331\276\223\346\210\311\205\317\274\266\203\344\214\214\225\207\242\320\275\206\236\251\227\337\255\356\352\277\237\376\226\217\275\243\216\347\247\265\206\301\206\332\275\335\310\345\361\230\324\212\374\215\305\312\221\355\341\235\255\367\263\321\266\357\347\306\236\326\233\264\257\322\363\350\305\204\324\206\240\372\325\274\270\321\324\303\323\244\252\350\352\306\236\323\275\324\213\240\301\321\361\356\270\353\343\367\300\316\300\227\351\246\372\272\226\337\261\256\273\232\213\316\227\237\253\346\360\213\243\326\343\211\347\270\347\247\234\353\217\330\247\322\342\312\320\377\207\333\221\340\304\320\372\343\303\302\373\313\265\343\350\203\343") -TOPIC_TEXT( -"\201\303\301\305\215\350\330\316\217\340\316\212\330\206\336\274\374\362\351\253\270\300\350\214\344\257\253\337\255\206\351\272\336\342\252\215\262\266\372\300\214\220\240\236\343\346\372\210\371\227\214\340\244\374\212\251\364\271\345\342\223\267\241\241\212\203\327\372\353\213\227\317\272\333\326\333\354\247\211\330\234\264\262\264\315\260\276\330\337\235\211\337\303\244\336\365\356\300\236\224\204\214\266\203\234\215\366\361\203\223\260\327\337\230\204\354\334\330\314\325\365\363\345\314\342\273\325\325\331\333\375\331\252\221\306\327\257\226\344\246\241\254\242\350\303\343\315\325\247\217\344\220\271\342\316\261\277\342\262\241\214\203\356\376\231\357\317\271\231\213\217\244\316\211\351\354\234\245\315\363\336\310\230\330\364\321\276\224\232\265\217\326\326\264\304\247\303\216\254\211\366\252\325\242\225\200\212\364\345\235\254\273\251\220\227\353\301\263\260\360\227\246\265\246\317\326\320\365\340\206\314\301\242\234\231\315\276\205\206\371\261\205\233\323\361\253\253\357\361\206\211\231\231\377\307\265\247\332\373\266\342\336\273\203\367\214\351\327\300\246\254\242\241\226\323\365\231\337\274\266\207\254\247\306\210\307\363\263\343\335\255\355\315\337\336\250\273\364\211\341\334\341\301\311\230\236\375\277\267\255\341\374\371\363\376\230\377\307\377\367\357\367\223\357\335\371\242\357\363\332\343\301\251\343\245\305\247\277\275\275\376\271\267\253\331\336\220\301\357\374\354\340\322\311\336\261\320\367\243\217\276\342\226\373\301\315\365\354\250\264\213\272\374\360\332\247\355\202\313\347\244\262\210\343\361\220\303\330\215\312\356\324\327\276\350\363\353\353\314\204") -TOPIC_TEXT( -"\356\232\262\204\304\300\205\226\267\306\336\343\341\341\374\204\304\360\223\326\265\217\350\332\224\264\243\311\321\363\254\247\275\363\203\347\247\366\311\267\206\236\241\263\256\214\235\350\240\205\210\360\302\376\316\261\325\274\254\304\263\221\252\210\272\324\362\244\367\260\320\272\243\244\376\233\353\222\244\374\355\346\335\337\274\334\200\204\226\206\201\300\221\343\264\337\237\265\270\274\261\205\263\321\327\307\254\216\224\266\321\206\302\217\246\327\202\201\337\245\250\317\250\264\305\261\235\377\312\301\345\375\225\363\217\217\366\332\224\317\207\332\254\223\223\243\224\240\347\230\343\304\305\254\247\366\354\251\231\245\313\275\242\265\254\236\377\265\351\314\205\263\340\310\247\314\307\261\354\247\202\252\245\365\360\354\263\331\332\372\244\211\265\332\204\340\277\332\213\356\356\322\243\264\302\250\221\374\255\364\210\353\325\345\205\375\206\346\321\341\321\326\235\234\314\331\205\212\244\230\204\327\320\365\243\212\203\204\321\210\364\352\264\370\314\225\252\316\300\226\221\220\233\310\347\360\270\325\203\266\270\260\221\373\330\205\344\355\364\252\213\217\371\224\374\223\310\306\274\255\270\272\200\375\366\362\320\373\271\216\361\216\264\336\354\371\362\225\335\251\214\236\316\346\223\217\247\355\347\210\370\214\260\344\244\361\207\314\340\367\311\372\377\330\302\354\203\376\236\266\310\373\365\265\337\376\363\255\313\374\332\345\230\331\227\317\340\232\232\233\233\261\276\355\315\203\255\371\307\217\337\272\344\320\300\273\326\372\276\362\257\372\245\273\267\357\214\214\356\366\253\272\307\301\213\215\377\201\254\245\205\277\355\253\276\375\373\351\310\317") -TOPIC_TEXT( -"\361\331\362\363\361\355\267\327\261\343\375\306\320\332\310\247\355\337\373\267\227\342\247\223\201\367\210\343\214\373\320\214\257\334\275\254\260\367\370\207\364\233\355\257\313\217\372\323\234\363\227\260\245\205\311\307\252\233\224\326\305\225\376\373\251\203\376\203\253\325\361\304\324\330\334\343\273\262\226\227\375\355\233\350\263\255\317\373\205\370\240\225\263\204\306\315\207\260\346\270\201\342\225\254\221\340\241\346\275\326\233\337\216\225\351\311\275\214\224\356\217\254\324\350\254\372\233\237\365\315\233\322\307\274\334\200\244\234\346\352\324\203\351\311\266\342\304\212\246\314\360\301\322\264\260\341\371\301\325\266\301\247\220\273\345\244\331\333\210\305\251\234\342\275\370\312\357\264\221\377\232\377\304\326\222\354\305\226\301\375\265\260\272\354\210\361\336\244\312\242\356\346\353\205\213\340\233\375\246\236\311\251\307\317\215\316\261\234\204\342\313\214\360\370\234\326\231\325\315\252\247\263\202\310\320\302\203\252\264\303\266\243\220\315\244\271\307\364\211\263\300\371\237\207\212\277\341\212\210\235\372\361\361\340\236\331\302\312\303\343\336\310\330\226\327\253\302\301\314\371\215\362\306\332\231\237\332\370\221\341\260\361\331\335\367\312\361\243\262\343\336\306\247\225\326\367\215\317\246\322\251\277\337\313\337\371\346\275\362\346\223\217\275\245\234\203\230\305\303\343\375\232\276\355\214\245\215\300\201\200\336\374\372\324\267\373\241\264\260\265\265\261\342\250\321\343\266\274\274\254\315\377\337\246\254\344\336\235\233\355\225\315\367\372\272\357\353\325\207\363\202\326\373\212\354\214\370\260\226\213\336\371\231\243\313\353\330\315\233\264") -TOPIC_TEXT( -"\354\232\315\230\352\201\241\216\311\311\201\211\343\360\305\365\345\231\254\340\330\312\336\275\234\375\366\277\366\244\274\365\244\330\233\367\332\254\321\342\224\372\253\241\205\234\323\200\306\352\213\254\205\275\320\264\257\267\373\307\236\215\307\303\216\267\360\352\317\327\253\376\216\376\263\264\253\245\227\231\251\224\242\230\351\257\276\327\300\210\347\344\221\376\326\365\203\245\265\264\264\332\276\376\301\370\244\362\342\304\354\253\271\224\337\313\253\374\246\314\377\363\314\255\235\314\303\215\310\357\246\261\223\247\376\224\252\366\245\212\361\320\262\301\221\356\210\336\216\214\267\240\236\343\346\325\222\234\345\250\275\355\365\342\275\266\373\211\355\263\230\351\370\254\277\316\314\317\376\371\234\235\331\351\360\265\370\216\243\262\206\213\360\200\331\250\315\203\361\224\262\274\343\204\203\264\212\344\234\221\352\244\214\316\311\212\345\251\250\361\206\306\244\370\343\261\354\232\375\354\342\301\333\334\240\336\350\306\272\312\202\326\310\265\220\334\366\325\225\345\232\311\273\362\320\222\262\302\205\265\222\264\214\243\366\267\235\340\330\211\370\225\372\245\210\340\316\306\313\340\376\211\305\302\221\207\263\213\250\360\240\270\277\335\333\311\371\215\211\362\332\231\200\266\336\354\216\214\233\230\351\377\265\342\251\217\337\341\253\351\336\310\337\300\221\356\373\356\300\303\227\371\214\320\361\262\254\352\223\357\261\317\363\323\377\333\364\376\270\203\327\355\323\247\236\317\277\373\356\273\325\353\343\320\360\370\325\231\314\227\343\365\267\337\217\364\337\237\356\230\351\232\237\231\303\262\303\352\252\352\357\327\237\331\241\273\355\223\236\307") -TOPIC_TEXT( -"\342\272\350\216\372\326\221\366\264\254\353\355\333\327\227\315\202\215\337\227\367\270\251\376\246\330\336\330\212\342\201\212\331\276\257\312\254\353\272\375\273\307\373\376\232\377\263\357\365\322\313\302\244\235\217\207\307\307\355\334\252\317\322\373\314\366\241\254\370\364\233\233\352\200\211\306\207\216\354\267\303\227\314\354\276\333\316\313\377\315\235\310\212\272\216\301\214\204\337\206\222\242\363\214\362\301\246\247\306\251\366\205\206\307\316\273\205\342\201\354\330\341\243\342\221\342\374\376\330\270\224\350\325\376\362\224\364\203\312\263\323\323\315\374\314\301\201\357\264\267\357\267\240\351\362\307\310\226\200\203\231\305\255\327\207\214\301\327\360\214\336\341\357\361\362\274\221\212\367\312\340\332\230\325\254\272\325\205\251\370\311\307\362\334\371\361\370\276\234\373\224\332\376\375\376\225\325\231\220\310\305\350\221\302\233\237\240\222\272\356\206\301\324\231\350\354\302\347\374\200\343\302\244\373\312\214\307\307\315\323\343\366\311\231\221\256\212\300\304\217\204\235\325\335\330\207\244\350\223\205\331\313\265\220\344\336\342\271\242\322\242\203\200\226\306\245\306\354\203\243\314\374\366\217\246\246\337\264\211\220\276\231\213\332\342\210\307\330\234\333\206\217\323\331\316\334\266\357\232\237\333\357\253\325\312\373\267\313\333\316\345\302\222\252\222\346\276\361\270\206\232\260\353\207\206\315\317\215\274\203\313\330\305\277\264\270\275\305\221\220\222\243\367\370\324\344\304\367\252\377\251\373\351\323\353\327\316\217\366\256\336\367\304\333\303\236\257\225\342\224\343\315\315\237\262\243\375\353\230\264\351\221\226\305\245\370\220\377\206\240") -TOPIC_TEXT( -"\354\352\350\337\367\234\371\257\322\341\224\341\307\217\234\242\247\212\221\237\330\347\305\331\345\251\336\210\362\355\215\255\205\247\367\363\325\231\315\241\266\271\235\200\346\252\342\231\317\274\377\346\271\320\246\324\265\273\354\226\334\246\367\230\360\254\270\206\236\203\214\257\225\356\203\305\321\360\214\350\271\373\223\344\327\246\211\267\265\353\206\301\277\224\276\246\252\327\276\325\224\237\311\313\307\341\213\224\276\206\234\337\334\255\215\370\227\307\214\274\307\233\316\236\354\345\262\247\317\344\374\271\226\313\333\275\353\217\375\366\343\302\322\325\370\337\303\264\245\345\217\267\240\365\213\205\304\215\310\230\340\321\245\255\227\265\242\376\245\306\306\261\243\227\345\355\254\245\323\312\265\361\245\224\263\302\313\255\204\231\260\206\372\247\265\271\266\372\222\271\316\323\207\312\240\376\312\355\212\267\373\363\330\315\211\321\232\261\304\372\272\374\220\262\351\237\211\210\313\320\327\224\312\271\214\340\212\246\223\362\371\200\365\351\276\365\216\257\345\252\307\274\361\230\335\310\350\300\311\252\365\230\247\247\306\330\313\326\303\247\277\246\271\254\370\302\273\304\200\344\265\357\245\236\374\267\232\344\270\265\264\356\336\354\327\335\255\312\263\343\305\215\232\306\231\273\367\271\362\370\241\347\304\247\320\230\256\277\316\301\372\260\316\206\216\307\253\266\315\306\206\242\262\201\207\255\231\274\224\376\375\214\362\257\370\303\317\261\223\227\317\306\346\344\352\345\302\252\222\346\211\307\236\343\223\220\355\360\206\302\231\236\376\260\322\330\320\373\327\261\270\360\344\376\261\230\307\206\307\273\367\376\362\344\350\340\366\356\316\301") -TOPIC_TEXT( -"\330\331\214\263\337\336\275\375\243\260\343\324\356\201\373\346\241\264\351\254\254\267\327\261\250\311\344\303\321\312\362\333\215\321\354\250\232\346\275\307\245\227\361\212\230\376\334\374\325\226\220\330\344\245\350\252\232\306\357\326\366\355\344\355\226\223\210\336\335\336\217\300\226\261\356\272\220\260\343\271\372\376\275\373\227\336\233\355\347\211\310\274\265\275\351\230\365\254\321\316\200\310\236\352\333\217\331\254\200\274\320\313\215\263\311\267\312\200\245\300\210\264\276\312\230\237\205\267\260\330\223\273\245\202\307\235\253\374\230\222\247\312\316\235\203\266\265\203\245\360\223\366\327\377\300\314\305\357\367\207\363\276\220\360\215\270\272\261\361\201\302\340\345\341\317\204\353\246\366\304\344\300\314\202\331\335\357\200\317\236\256\272\252\256\203\311\240\271\203\325\311\207\276\325\250\201\203\367\252\242\370\232\360\242\242\303\343\340\245\346\246\252\307\320\226\230\266\320\315\260\360\235\212\344\320\331\326\316\342\226\322\337\323\312\260\202\316\336\374\363\202\315\265\211\300\315\206\214\323\364\300\373\347\237\371\340\272\261\256\264\252\272\331\305\321\217\373\273\333\363\363\216\255\321\365\214\253\272\311\316\310\343\357\353\353\235\206\314\375\263\245\316\314\337\364\257\363\261\236\261\332\274\222\362\372\340\245\355\247\260\302\224\305\263\307\306\274\314\253\216\261\200\227\223\353\344\231\302\377\307\251\336\266\327\307\222\303\202\307\216\234\222\264\273\353\316\247\300\310\355\215\267\306\232\352\252\340\332\360\305\313\347\207\276\273\321\336\302\335\237\260\217\312\306\356\260\357\207\367\224\243\340\305\201\212\335\277\363\213\272") -TOPIC_TEXT( -"\366\263\246\366\361\207\205\332\274\337\313\212\317\225\304\370\264\216\360\236\271\304\337\264\246\341\200\206\210\347\352\274\336\347\232\222\344\314\247\231\232\324\265\231\225\252\226\201\315\206\334\274\363\313\315\360\357\305\343\267\374\360\376\302\315\334\273\247\377\307\315\361\247\363\271\351\346\343\207\232\332\357\271\232\322\233\342\301\364\254\356\370\343\361\362\202\363\362\335\272\372\273\201\276\205\247\367\363\261\205\277\254\376\223\202\343\253\204\257\337\217\336\212\342\245\335\306\241\207\255\204\327\233\306\331\370\272\260\221\322\257\220\236\326\357\254\224\201\274\330\236\267\342\371\215\215\367\357\370\277\243\261\336\326\204\214\273\341\364\340\305\310\267\365\317\276\376\274\225\356\206\304\371\241\253\317\276\276\351\375\203\311\211\336\327\367\373\331\313\354\255\315\315\211\323\321\274\222\302\253\235\302\304\231\256\272\220\345\353\315\342\313\324\376\305\266\321\315\314\317\271\312\326\210\345\321\305\351\355\302\310\324\234\255\261\203\325\255\254\206\207\307\231\231\333\247\236\343\301\303\362\224\353\222\344\357\272\330\203\274\307\244\234\226\212\203\225\343\301\343\217\325\203\267\353\327\313\331\207\204\270\327\362\262\343\215\375\230\330\236\224\374\244\254\267\306\227\263\262\354\321\323\231\313\236\303\213\213\230\233\230\310\356\273\230\301\343\264\266\236\257\241\321\366\336\276\230\205\357\311\375\224\237\342\373\350\350\304\345\345\312\267\357\365\275\261\324\341\261\331\201\276\300\265\272\267\235\230\237\356\210\236\235\354\203\351\370\374\363\374\213\203\215\265\337\362\256\247\330\364\370\246\365\277\353\263\323\341\263\232") -TOPIC_TEXT( -"\203\351\366\275\376\370\275\307\360\327\322\275\273\367\307\361\304\362\262\366\306\312\366\336\376\375\200\373\343\271\224\240\355\252\247\305\331\313\377\204\206\272\247\354\352\307\252\236\277\345\200\215\331\312\261\265\216\257\267\236\207\217\244\264\373\214\327\237\256\255\314\316\356\250\251\246\277\373\272\352\367\264\363\272\254\353\261\270\270\315\222\216\245\235\365\277\271\374\276\350\333\316\235\237\236\274\221\221\207\340\360\304\343\240\302\204\332\227\327\313\256\212\351\340\236\306\350\311\306\257\252\341\331\330\343\330\357\342\364\371\276\317\210\225\356\322\257\320\312\352\272\235\263\246\274\323\356\201\321\301\260\347\246\352\260\277\273\354\354\361\302\360\223\217\331\362\376\373\227\331\247\243\352\375\311\344\334\205\361\367\331\263\265\306\256\241\263\336\253\300\357\333\333\312\300\222\201\214\252\241\207\223\331\236\375\246\213\262\317\266\204\237\216\222\215\265\343\267\253\213\316\273\250\272\365\365\366\266\262\254\202\325\234\300\340\230\222\362\223\304\326\203\322\343\321\303\204\207\224\365\325\234\210\235\206\231\342\313\211\261\233\253\203\307\327\257\211\341\241\317\376\314\301\240\225\347\210\302\306\303\327\237\211\231\337\325\225\244\202\374\363\336\253\313\211\236\357\323\246\306\373\347\247\306\230\346\246\307\306\206\272\325\360\274\346\360\205\360\270\376\256\316\245\340\361\324\240\307\244\333\334\213\227\255\277\326\216\372\366\310\257\235\245\213\335\360\256\213\342\241\344\227\300\372\326\215\324\314\360\305\374\333\246\226\324\271\274\334\362\234\366\365\272\226\377\300\204\224\272\251\244\307\317\215\307\256\220\334\250\216") -TOPIC_TEXT( -"\314\300\366\327\213\306\312\376\276\204\361\211\312\355\342\251\225\246\253\246\352\233\233\323\373\345\375\235\334\211\324\231\265\257\317\352\207\347\313\372\360\305\207\235\237\211\204\207\220\202\317\357\345\354\354\275\330\204\275\261\226\202\307\374\212\317\200\300\205\330\202\323\260\202\375\264\330\230\235\240\300\205\274\207\361\331\273\255\263\334\257\212\345\261\250\331\270\363\341\321\217\266\313\267\277\261\324\352\323\323\346\351\322\267\373\304\311\224\332\344\304\210\300\232\271\203\203\214\373\304\345\207\373\233\307\242\300\342\337\354\306\276\253\355\273\320\342\262\201\271\221\203\332\211\343\366\215\364\324\365\223\272\370\370\230\307\373\216\325\361\227\322\247\210\366\316\227\307\332\245\254\202\233\355\330\312\220\244\343\351\350\361\365\235\303\303\260\302\274\306\322\316\374\236\231\263\333\311\353\315\321\223\223\246\370\230\362\254\365\213\323\364\222\264\367\366\331\225\367\224\236\273\377\374\363\313\353\365\251\337\302\327\317\312\222\217\307\350\231\231\300\234\262\267\276\267\235\260\371\360\370\364\372\301\360\304\206\350\237\335\373\214\274\236\224\231\350\245\201\217\265\207\363\262\352\275\346\340\261\275\234\246\205\246\230\310\224\325\334\261\210\342\261\231\243\346\363\244\332\321\374\256\200\357\235\307\330\302\217\251\221\307\334\221\214\320\257\343\274\222\325\265\207\310\344\216\236\333\203\225\306\346\274\356\355\355\230\345\276\276\223\217\214\245\342\377\237\231\311\314\341\377\211\345\257\377\311\234\256\365\354\236\311\325\327\322\373\251\336\361\312\312\362\314\357\362\352\330\325\352\347\246\321\343\331\247\243\277\227\342") -TOPIC_TEXT( -"\251\264\303\256\366\217\256\224\375\210\333\375\305\236\225\227\375\355\216\300\274\315\367\261\275\277\337\347\330\365\253\245\254\302\350\373\246\257\337\203\217\265\256\376\341\301\276\316\267\342\220\371\354\237\371\237\213\277\373\361\256\251\267\232\346\276\243\302\312\326\373\265\303\264\340\264\300\262\370\330\325\307\221\326\212\377\373\230\233\241\233\253\265\224\301\303\352\260\224\311\260\224\334\266\236\207\213\262\262\354\217\203\371\222\264\334\344\364\210\253\207\270\212\306\214\310\204\211\215\277\210\271\312\264\210\354\205\332\365\307\370\274\264\325\327\241\236\251\207\353\226\276\342\206\326\327\244\374\224\250\306\327\202\261\357\304\274\317\336\272\336\215\360\327\334\252\373\256\235\304\221\217\233\206\353\262\266\370\234\236\326\333\272\216\272\310\301\220\201\200\215\201\343\314\347\263\231\371\251\260\303\244\341\261\203\252\324\246\350\375\270\277\345\323\367\270\237\365\376\255\261\301\266\355\265\205\352\376\224\370\307\261\237\350\264\264\360\267\245\305\263\347\243\373\242\341\342\264\305\325\266\254\362\362\326\326\216\336\340\321\302\203\354\277\261\377\335\215\277\326\224\245\303\374\330\300\367\323\305\331\252\345\251\260\342\221\303\354\263\317\321\263\375\310\263\201\262\215\217\245\237\237\332\202\245\206\323\225\253\243\344\234\362\206\375\322\205\313\236\252\317\357\221\332\257\306\343\332\306\327\245\305\327\234\277\374\274\256\366\215\352\315\252\341\372\257\360\366\306\241\373\344\271\223\317\316\236\310\303\312\226\324\342\275\366\345\362\325\240\345\205\276\331\376\367\352\235\311\305\325\333\354\235\331\334\321\376\255\324\261") -TOPIC_TEXT( -"\330\236\200\231\362\263\235\210\333\230\304\321\305\257\364\260\260\260\200\335\305\204\223\317\336\357\341\366\320\227\311\237\233\235\366\236\247\320\261\250\230\347\337\313\277\356\261\345\266\261\307\237\243\376\230\253\365\306\371\321\216\234\330\257\251\272\357\201\215\321\262\233\352\353\336\212\214\364\227\234\273\227\215\362\255\324\354\354\341\201\311\225\360\340\207\217\345\302\260\252\336\276\203\323\306\221\271\217\263\245\363\322\320\212\350\253\333\347\247\306\361\240\323\303\333\252\244\346\346\326\331\355\352\237\255\315\344\344\313\245\304\374\342\261\316\334\253\304\230\303\355\357\377\346\316\377\265\251\372\313\252\252\312\261\270\302\373\311\325\256\276\240\265\252\253\332\263\373\311\267\275\251\317\214\272\265\275\320\250\272\307\221\233\374\233\201\304\244\213\343\267\242\325\365\343\360\255\250\230\240\326\373\241\350\303\276\341\261\307\222\354\354\215\355\212\273\213\201\234\311\321\200\313\246\373\273\215\216\367\333\361\230\370\376\335\214\324\376\262\343\214\261\345\273\350\215\366\304\346\350\357\324\376\225\217\355\275\253\262\236\347\250\361\214\223\331\331\373\300\277\273\367\242\376\212\367\261\266\233\221\217\217\252\341\270\375\373\303\322\217\272\300\263\207\262\310\367\222\370\357\230\264\354\230\323\352\205\243\343\227\364\303\276\224\346\346\373\221\266\316\334\237\371\267\266\276\221\334\212\361\216\230\334\263\264\212\336\302\226\362\205\351\357\323\372\241\265\267\237\363\343\276\253\323\372\353\360\265\335\374\203\373\222\372\300\267\254\205\310\330\330\246\217\243\251\337\316\302\315\204\347\247\203\357\336\307\227\213\221\261") -TOPIC_TEXT( -"\224\332\201\304\314\277\230\251\336\370\373\234\251\250\235\236\206\307\254\276\343\374\202\241\314\340\360\242\214\316\375\376\215\352\305\224\357\336\353\350\276\361\245\270\377\300\314\213\212\205\343\217\231\331\203\312\341\331\264\217\306\245\373\314\202\216\314\232\233\203\251\362\276\373\363\215\335\355\330\236\367\213\203\263\205\205\361\377\322\311\367\317\257\252\376\354\247\364\331\363\300\367\323\321\243\207\236\260\263\224\306\343\233\226\373\250\354\235\236\241\345\350\243\231\205\214\354\370\314\222\234\217\254\235\246\311\333\211\235\323\322\317\226\245\242\234\331\361\330\313\355\247\346\254\204\332\247\302\343\325\252\236\205\237\275\362\353\254\316\250\204\252\257\373\232\207\212\270\223\201\346\200\217\227\346\270\254\202\214\272\300\354\230\231\246\274\234\237\363\214\214\301\331\345\267\267\327\261\226\322\370\271\276\266\200\246\220\375\352\232\270\364\354\327\345\327\354\312\255\327\261\336\336\321\322\356\216\265\204\223\354\340\345\336\253\267\273\361\257\315\343\317\272\202\260\346\200\245\374\374\323\375\333\354\364\270\203\317\310\212\273\233\323\270\376\275\345\273\240\232\250\272\261\341\372\246\236\213\200\233\233\203\347\201\311\351\223\362\274\314\243\317\263\243\352\322\314\311\361\312\267\247\343\376\330\215\354\234\337\330\343\340\364\361\306\364\270\335\254\270\211\272\375\303\373\335\371\206\310\202\370\372\206\306\323\276\356\371\257\247\371\217\256\270\353\331\330\201\213\232\217\321\204\232\342\203\310\212\234\323\277\367\270\344\302\271\323\247\321\277\274\376\334\327\275\336\271\267\367\317\356\261\317\317\363\344\345\374\371\374") -TOPIC_TEXT( -"\360\271\237\257\362\353\353\252\246\203\331\316\372\356\216\256\343\366\265\252\273\312\226\251\202\346\224\321\310\334\313\317\357\305\305\331\345\252\244\335\253\335\254\332\372\251\310\343\337\227\255\347\202\275\235\346\221\205\300\254\242\261\206\314\330\333\351\265\363\247\360\276\354\321\364\323\363\364\276\371\344\223\343\376\336\256\242\261\263\344\310\250\325\301\217\256\220\227\320\351\367\332\232\276\341\345\363\331\261\254\254\213\360\332\313\347\321\322\373\215\253\377\201\216\337\371\366\274\326\245\266\370\254\312\235\213\341\253\316\326\225\235\275\207\334\201\334\235\247\352\333\203\256\250\210\364\321\374\256\340\341\366\357\342\372\325\322\223\307\216\343\233\242\226\316\370\334\331\201\336\224\230\235\204\367\321\313\361\330\255\272\246\373\333\225\357\207\373\272\375\227\215\232\317\255\203\271\261\353\210\357\257\255\301\261\200\313\265\321\273\341\241\363\364\336\212\306\220\213\210\354\263\233\367\307\213\270\242\343\311\364\325\360\360\245\214\217\366\202\300\273\223\223\331\251\251\272\261\231\360\270\350\325\305\343\330\306\305\272\261\261\356\201\321\322\247\307\243\253\272\324\345\317\214\245\312\342\333\220\344\346\374\246\242\364\332\332\340\343\260\203\322\226\375\211\205\373\225\255\251\337\274\327\323\217\374\343\361\304\330\257\316\370\323\364\340\254\345\332\320\375\375\313\335\343\316\216\326\253\372\372\373\315\315\365\332\215\354\261\330\370\326\365\345\302\307\353\375\330\337\317\373\373\334\214\363\357\252\233\353\317\330\255\212\264\343\331\204\337\325\225\345\210\236\327\334\207\235\201\356\246\251\215\240\247\272\304\235\255\367") -TOPIC_TEXT( -"\363\362\312\363\360\225\300\234\230\352\310\200\217\257\314\317\357\376\265\277\325\202\361\301\351\374\300\277\276\347\261\265\307\257\217\244\350\274\254\217\354\214\265\220\370\366\364\325\373\244\370\306\332\267\326\260\242\213\245\337\374\363\315\326\354\345\355\356\236\207\325\325\207\377\203\222\324\274\234\371\234\201\336\267\257\357\275\333\267\317\200\226\226\370\207\335\214\217\361\335\211\276\212\354\337\267\342\227\260\321\331\331\341\255\306\230\306\232\240\247\317\344\214\271\312\272\261\237\371\376\256\352\330\271\331\342\365\345\371\330\237\307\311\267\300\304\210\204\336\330\300\343\240\261\225\266\312\322\302\335\242\374\367\312\352\272\361\363\262\300\243\367\253\341\232\233\263\351\333\200\326\212\316\235\367\225\237\226\351\315\245\372\246\223\213\217\246\325\225\225\354\227\222\203\217\257\225\235\347\335\320\274\330\232\272\215\351\302\227\363\232\324\306\306\336\212\274\333\334\230\270\330\362\345\212\234\361\270\230\321\365\313\316\263\303\363\334\311\310\326\344\214\302\316\244\321\246\320\376\374\342\361\323\265\225\357\352\326\203\365\355\203\243\303\255\341\273\251\305\345\372\370\220\371\236\257\372\272\364\236\347\316\215\313\205\300\201\246\377\321\261\221\221\321\341\331\275\251\261\232\206\307\247\316\367\344\266\267\264\310\257\313\354\217\347\354\317\215\220\247\337\233\353\370\310\336\355\216\337\256\343\347\317\237\232\241\301\260\204\214\207\217\236\244\255\257\365\365\311\243\265\344\320\306\360\363\205\215\340\310\367\347\314\242\214\254\363\210\360\235\204\207\202\347\202\213\225\333\316\235\272\305\202\234\332\340\362\273\267\266") -TOPIC_TEXT( -"\202\230\267\363\217\376\211\277\226\225\210\375\354\330\276\326\221\306\355\303\327\323\363\271\324\341\244\335\371\304\356\332\216\336\330\357\347\253\365\254\304\200\304\216\254\301\264\374\354\252\203\275\320\303\360\351\316\315\267\366\227\262\221\270\373\360\376\204\244\362\254\244\366\313\245\201\342\365\341\272\215\261\376\247\220\254\273\263\255\253\317\267\273\275\371\376\323\375\316\315\354\273\361\274\307\225\355\255\270\260\353\367\316\302\262\224\233\255\354\320\205\250\340\335\340\266\267\310\306\325\226\310\357\261\333\261\274\306\323\327\270\305\326\320\327\214\220\307\220\256\310\271\270\223\204\321\262\217\335\225\233\232\304\210\312\261\225\234\363\334\362\326\225\215\275\270\230\355\236\332\202\252\330\257\352\270\222\213\270\371\337\256\220\213\336\217\323\330\330\347\251\350\367\357\355\302\205\320\331\336\211\242\335\225\211\246\344\321\350\365\253\270\375\241\356\367\231\253\245\227\301\306\325\225\343\345\314\247\315\303\313\340\363\361\313\356\361\314\313\313\235\210\236\247\241\265\366\365\370\271\372\357\202\231\332\337\344\251\265\237\370\254\343\317\273\236\256\366\367\365\342\355\376\256\306\342\340\232\201\323\276\270\377\213\347\317\324\236\367\317\271\351\200\336\370\323\370\223\243\370\277\317\317\214\266\213\375\252\370\314\340\212\361\340\361\333\313\275\374\272\220\344\321\320\333\337\210\330\274\202\304\207\221\233\215\235\262\271\371\205\356\256\343\223\203\307\216\273\276\347\310\375\334\330\277\361\370\235\367\336\266\371\363\315\267\215\315\345\316\262\276\377\376\205\347\223\315\257\254\321\305\201\277\251\251\277\232\277\330\334") -TOPIC_TEXT( -"\251\257\224\356\230\337\217\251\223\244\364\352\327\202\231\344\340\200\273\250\375\223\262\232\243\247\235\376\352\255\275\251\205\346\261\207\265\234\306\307\351\270\342\301\352\336\343\200\277\251\272\220\262\363\347\247\203\327\371\377\312\273\362\230\202\351\346\341\331\330\236\364\221\235\335\275\215\310\341\250\364\201\311\346\206\376\305\352\313\212\327\316\253\231\372\263\323\353\365\365\273\260\222\307\313\340\317\344\201\277\303\317\236\315\234\220\255\224\302\364\325\246\341\300\373\254\376\373\263\300\340\204\210\371\351\316\253\311\321\362\340\372\226\367\210\314\244\361\243\335\202\206\230\334\273\223\206\262\310\232\341\241\324\237\266\346\301\213\267\366\200\216\361\341\371\221\325\262\210\316\263\277\365\307\342\261\370\321\365\303\243\254\246\352\354\272\232\252\254\200\222\362\312\303\355\346\246\232\314\351\231\326\214\236\277\324\226\257\257\365\343\214\350\361\272\331\366\355\253\331\265\337\325\333\264\215\213\214\216\206\234\244\232\231\327\361\352\315\247\236\225\203\247\337\370\343\215\272\220\277\237\205\237\203\362\201\225\300\317\327\326\360\211\302\303\236\233\375\300\317\246\235\375\314\317\202\213\206\245\304\326\213\362\301\210\246\200\252\377\201\224\342\226\344\370\234\333\205\307\263\223\243\264\315\374\373\374\350\363\317\201\307\215\362\253\360\370\306\375\267\263\323\371\207\307\307\360\211\267\256\373\303\377\376\304\316\222\350\260\275\273\336\365\373\370\205\210\236\313\336\311\270\214\326\262\203\302\345\322\345\201\203\251\357\242\353\226\321\210\375\215\215\217\331\353\303\216\234\327\336\365\307\324\363\247\254\243\247\331\304") -TOPIC_TEXT( -"\217\334\231\334\375\270\230\216\277\201\307\206\247\246\247\361\376\351\372\330\326\350\244\262\262\302\334\321\344\230\351\220\232\256\237\324\336\256\366\320\347\213\346\271\223\313\300\235\373\367\231\356\205\357\230\356\350\333\355\320\205\366\372\302\321\207\220\273\366\354\303\273\200\207\310\337\225\207\270\324\322\354\340\230\331\201\372\361\324\254\346\326\232\347\211\347\313\225\321\307\217\371\257\360\302\242\307\367\236\227\223\246\262\306\212\233\207\327\255\200\276\303\306\225\304\271\200\257\214\340\345\245\304\313\207\255\222\304\260\224\366\355\334\271\335\331\207\323\334\247\325\211\267\273\314\270\254\357\364\306\345\360\367\224\232\251\273\341\211\307\330\352\374\213\332\316\260\217\376\334\274\341\301\336\316\366\207\226\311\315\201\225\311\216\231\256\220\274\336\263\373\267\375\303\252\300\306\327\257\226\201\246\333\211\351\261\361\367\332\323\325\355\260\357\225\351\304\364\370\335\254\256\276\344\351\201\207\255\231\324\257\364\217\261\223\327\233\255\261\267\337\347\216\263\214\353\270\265\223\346\337\373\214\272\343\355\327\210\260\363\363\320\352\272\273\331\207\347\317\236\372\324\307\256\350\353\356\353\350\353\275\321\252\352\272\225\311\203\356\251\375\351\300\241\314\354\225\350\330\263\373\217\261\230\324\326\336\233\332\347\202\350\253\202\346\200\277\236\264\206\357\376\212\211\370\251\322\372\320\232\252\236\313\255\215\306\220\255\230\326\334\207\377\207\357\262\275\216\236\343\217\214\212\317\363\316\357\322\217\340\344\377\357\227\212\241\246\312\322\304\336\257\234\323\241\305\301\301\213\244\206\230\227\237\250\253\200\266\200\237") -TOPIC_TEXT( -"\302\222\220\262\346\240\346\234\270\366\374\274\373\317\236\262\242\217\322\325\211\217\261\312\246\343\207\350\201\212\231\277\203\312\241\261\307\326\264\226\375\215\206\266\322\373\340\246\307\307\213\367\207\237\276\227\215\220\305\366\304\360\232\340\253\311\364\376\337\250\265\301\355\365\353\301\331\254\265\257\245\271\205\372\271\340\352\317\246\244\200\277\332\370\340\267\357\357\277\260\342\333\357\367\223\227\374\211\274\366\276\212\320\216\322\313\350\276\276\234\233\247\260\212\204\356\300\266\301\361\245\305\262\254\342\241\301\336\213\353\250\315\305\343\221\352\203\316\330\313\347\263\363\243\223\261\343\261\326\222\321\365\350\313\237\353\354\232\222\330\267\277\305\271\315\304\222\361\226\235\247\334\374\342\261\263\225\277\316\235\272\305\232\220\243\254\321\206\246\244\357\231\223\226\246\201\353\253\221\240\313\211\227\234\307\364\254\205\313\237\350\303\303\210\226\304\344\304\267\335\343\372\217\265\257\237\366\235\272\272\371\340\250\203\346\250\344\345\207\242\204\263\233\313\362\235\317\315\304\317\262\366\303\253\261\246\331\341\261\266\203\331\347\306\201\346\272\227\314\306\243\247\204\233\226\356\342\272\276\265\251\347\360\304\365\265\354\241\330\226\334\212\264\343\237\217\214\347\266\347\350\271\226\223\226\211\233\315\304\303\241\212\207\203\307\212\343\271\260\272\335\250\362\254\343\301\307\303\277\204\262\314\264\252\312\212\216\354\336\231\274\374\300\357\332\376\316\261\214\224\224\235\341\367\200\233\320\264\345\216\254\261\362\265\344\242\226\345\207\320\305\235\333\216\301\227\366\242\233\214\377\314\336\366\376\373\307\310\212\212") -TOPIC_TEXT( -"\262\313\321\336\307\262\271\211\370\244\272\331\252\374\360\274\313\375\334\304\274\306\345\207\313\213\256\225\300\245\273\301\253\217\213\256\365\315\250\375\231\214\360\353\267\302\241\356\332\342\377\300\346\344\275\276\335\275\331\364\313\213\223\240\337\346\210\302\332\336\361\376\236\377\353\316\200\251\376\303\276\303\322\222\362\304\340\210\221\351\244\361\267\354\305\323\375\315\236\264\273\314\213\360\371\216\353\246\364\366\266\202\217\223\316\366\204\243\263\214\236\277\342\262\326\276\332\273\360\240\207\245\264\355\324\364\354\374\353\261\345\313\254\204\257\305\253\224\203\307\306\362\255\272\362\240\322\367\354\327\347\311\243\270\216\323\356\276\361\230\241\355\232\243\224\244\200\221\304\372\326\215\320\265\212\303\235\222\210\343\273\236\216\325\337\274\361\351\230\305\210\213\304\315\340\204\276\264\212\210\334\201\254\277\370\342\213\237\316\325\363\376\257\367\277\276\276\374\345\312\344\370\206\364\263\352\311\223\371\216\336\313\215\321\272\306\273\230\227\236\330\200\217\327\240\212\371\366\271\340\212\242\253\275\316\205\223\266\226\324\314\341\262\362\210\276\366\234\363\304\327\337\370\243\336\370\254\345\350\271\225\310\337\204\327\213\205\233\262\373\227\247\326\275\307\363\205\323\201\301\217\234\341\307\365\277\275\210\324\344\216\305\314\250\365\325\336\374\237\304\244\333\373\273\232\200\354\326\301\351\203\224\275\275\261\302\235\256\352\231\210\303\205\232\367\371\344\223\317\212\277\332\247\342\230\301\327\360\372\303\321\267\342\371\203\335\315\336\304\307\262\254\342\330\334\214\375\261\306\224\310\223\213\204\233\354\312\213\200\367") -TOPIC_TEXT( -"\216\333\333\216\204\336\351\271\360\354\273\233\300\304\351\313\300\247\314\256\302\374\312\306\234\306\323\355\213\307\252\314\222\265\253\341\216\323\315\273\262\245\267\204\307\375\321\224\374\360\210\244\344\320\361\340\377\267\201\307\261\303\242\366\220\233\312\254\345\262\327\306\217\363\330\332\315\333\247\261\230\236\315\226\362\357\274\254\370\374\260\322\324\316\317\225\225\367\376\224\306\222\227\227\341\256\250\264\261\325\314\255\343\272\264\316\303\213\216\217\351\267\211\306\200\372\344\224\251\230\253\201\267\274\201\331\202\253\265\344\247\225\214\361\323\237\377\376\360\207\236\236\236\313\233\227\212\317\237\374\222\346\351\327\275\276\236\363\344\213\333\234\234\367\377\363\347\247\323\317\234\351\355\272\247\332\306\356\235\355\315\373\366\274\374\353\247\242\271\312\277\314\256\277\372\247\300\310\277\252\237\257\215\307\254\352\306\226\204\274\246\273\222\271\230\205\237\252\326\271\240\367\233\337\214\311\265\214\246\260\254\247\277\271\270\235\375\327\327\320\275\301\330\255\265\201\277\260\237\254\320\323\210\360\370\346\216\363\216\336\376\375\373\335\214\346\213\323\313\234\326\270\350\227\307\314\225\216\353\356\374\354\243\257\232\202\322\327\230\377\352\277\370\200\330\373\252\204\205\212\275\325\225\225\224\245\305\347\201\311\272\302\266\333\225\362\204\244\257\335\235\271\354\217\273\300\341\274\344\360\340\277\335\266\371\333\274\233\333\355\305\362\260\261\353\356\207\345\223\245\247\344\276\204\263\363\330\263\300\213\250\300\355\237\251\227\217\350\345\252\350\267\233\347\220\276\374\211\351\234\262\203\203\351\337\245\370\344\225\254") -TOPIC_TEXT( -"\255\276\377\366\335\223\224\274\304\265\275\240\372\334\214\230\202\373\215\323\314\326\233\233\307\203\226\366\371\341\364\324\272\241\362\302\302\264\374\345\364\371\357\331\211\300\350\340\202\274\317\307\330\376\322\313\305\364\273\304\266\265\236\316\317\271\323\226\266\352\225\252\311\260\321\264\377\274\346\352\301\252\240\266\230\354\320\330\331\372\215\362\372\363\253\244\335\230\366\257\213\245\312\310\235\376\342\262\254\201\207\266\345\340\221\221\261\264\322\344\211\351\365\257\310\225\351\302\244\203\200\305\227\334\241\370\331\223\260\252\341\354\347\340\260\370\272\214\232\372\370\360\341\300\300\377\327\373\313\203\314\303\213\343\343\271\237\377\325\374\355\371\340\301\265\273\265\265\212\375\335\355\263\312\355\350\214\267\261\267\263\307\376\355\250\205\233\354\250\370\261\246\234\343\260\224\346\217\317\352\323\366\276\225\232\260\273\314\216\237\264\327\271\340\235\272\204\206\332\200\346\231\251\301\254\377\370\244\365\265\350\371\203\346\247\221\362\244\342\325\271\353\352\351\353\325\325\243\350\260\255\307\317\261\212\300\315\333\251\327\326\267\222\366\237\325\203\367\243\352\300\206\371\345\202\323\263\263\367\330\257\363\340\350\267\367\224\273\242\226\301\253\254\376\375\352\276\251\210\202\245\361\204\373\342\361\312\260\302\274\246\271\327\271\227\333\255\331\344\326\365\252\356\254\375\227\257\373\273\354\354\355\366\215\271\364\241\354\327\347\213\235\302\316\377\354\226\204\354\274\236\241\217\321\307\217\203\306\250\200\261\211\303\364\370\254\366\301\233\250\267\230\335\305\354\355\221\245\241\236\247\242\234\241\236\200\270\267\273\203") -TOPIC_TEXT( -"\327\305\270\317\327\353\324\265\343\243\332\262\354\313\301\351\374\206\376\266\341\246\343\345\332\333\277\331\232\222\303\353\337\204\327\217\361\311\232\353\236\206\365\207\244\361\211\237\311\337\270\324\255\353\254\254\256\273\311\345\307\257\335\354\364\252\240\253\352\274\356\232\256\211\334\346\324\335\322\303\360\251\220\357\370\351\266\353\315\345\342\334\307\351\342\221\245\346\354\311\314\205\250\330\320\217\375\352\223\217\265\340\212\374\377\374\374\225\225\225\301\221\367\261\352\373\235\247\312\352\364\265\274\376\377\266\355\271\224\320\326\245\211\273\205\255\361\221\242\307\225\257\301\253\340\377\345\317\325\323\257\272\363\205\371\351\260\341\342\243\352\245\373\216\206\255\231\241\347\311\276\205\275\342\376\207\366\247\301\305\310\331\230\346\337\235\243\347\246\227\253\346\327\246\347\246\232\360\330\365\302\240\341\340\236\275\362\310\346\261\254\202\352\241\316\352\237\304\315\367\317\235\271\303\340\302\346\375\261\374\202\223\300\261\221\340\354\322\361\321\200\371\200\263\260\343\341\366\326\342\250\257\213\374\374\342\251\330\361\357\345\344\240\357\272\351\341\357\237\216\374\234\371\346\330\254\357\300\256\337\216\265\325\337\364\363\230\347\224\247\207\325\235\244\212\331\367\274\244\217\361\311\341\375\213\316\236\213\303\352\245\311\324\300\276\317\276\257\371\336\366\326\314\327\343\224\205\334\336\301\354\210\261\367\315\310\217\235\305\333\220\341\277\352\251\263\316\335\334\324\275\316\275\372\313\334\312\271\353\317\320\234\236\207\303\204\274\324\347\337\341\247\275\230\273\341\223\252\300\335\206\274\334\233\226\275\214\373\356\307") -TOPIC_TEXT( -"\216\323\266\331\235\312\225\261\254\326\377\327\304\216\367\374\301\315\342\370\354\330\254\351\343\254\215\315\317\253\256\305\274\260\350\223\372\310\355\326\323\334\267\247\275\241\322\350\304\316\316\317\213\245\210\336\367\240\352\241\203\336\351\340\270\316\360\203\223\223\303\303\203\252\210\223\317\254\343\272\316\223\235\213\310\330\215\216\326\343\334\363\352\236\233\367\230\257\314\351\272\231\345\247\316\224\357\324\274\325\325\325\300\352\275\265\333\315\365\255\335\303\355\303\303\366\262\240\232\260\277\333\362\303\231\271\351\200\316\336\372\366\236\375\230\230\313\331\356\304\265\363\216\246\243\340\345\262\271\273\217\247\372\277\336\205\217\227\347\231\310\261\204\250\242\266\235\313\240\347\340\266\314\347\326\277\207\256\336\331\207\203\340\247\270\374\345\301\220\252\212\362\347\240\240\251\357\354\331\354\212\344\275\271\362\274\347\370\371\350\316\343\203\311\201\230\216\307\346\307\342\334\263\355\304\361\256\300\251\301\333\357\336\363\244\246\346\350\225\234\201\316\327\376\212\323\330\201\237\373\356\363\305\247\222\362\347\225\213\230\233\335\307\330\334\230\327\240\265\342\245\250\350\215\233\230\331\210\371\300\372\270\360\230\306\214\274\240\352\325\226\227\363\200\217\275\240\345\256\324\274\366\224\364\354\303\373\301\377\341\344\271\335\326\252\353\261\324\243\210\360\253\322\235\351\261\236\241\247\321\302\312\326\374\362\253\301\373\337\304\251\305\360\227\222\367\323\257\377\371\313\312\302\360\213\333\230\277\261\200\375\307\360\352\233\300\314\214\227\371\221\373\321\356\304\355\366\361\264\354\322\242\360\246\264\206\236\307\227\217") -TOPIC_TEXT( -"\227\226\300\246\347\254\201\303\251\357\247\356\263\307\244\306\303\243\303\242\361\356\215\332\366\270\313\323\343\225\304\253\212\352\267\353\232\330\261\317\217\363\355\315\371\360\311\326\377\323\345\265\225\377\370\234\334\374\344\352\256\256\356\317\334\361\256\364\264\306\256\241\355\215\363\365\352\225\317\217\335\242\371\216\275\236\235\352\312\250\317\272\245\334\320\202\345\250\360\247\336\261\335\275\335\232\201\356\245\313\276\345\254\235\246\254\212\262\240\322\362\243\251\242\301\236\327\233\253\372\377\366\364\341\302\314\302\334\306\203\232\346\275\276\375\362\367\313\366\226\206\371\225\336\206\343\267\214\274\352\246\350\217\305\321\354\272\204\370\373\263\312\257\214\310\216\224\310\370\203\303\235\340\300\334\343\230\237\322\313\201\371\361\322\315\345\355\307\216\355\276\235\211\226\361\261\267\234\275\357\257\275\262\233\215\235\232\304\373\236\267\261\261\261\263\275\365\311\261\344\230\206\211\252\277\236\233\233\325\336\256\206\217\367\236\311\313\247\217\323\375\270\230\343\254\303\313\272\344\343\200\346\333\325\225\230\237\307\224\203\253\254\200\327\363\223\256\265\347\262\212\307\211\216\202\232\233\233\213\341\340\255\314\241\310\223\225\247\227\206\375\207\341\320\351\214\326\323\323\213\250\200\254\203\204\372\257\340\352\237\235\235\356\205\312\252\216\345\237\303\317\213\347\317\236\275\333\223\231\257\350\362\252\275\233\321\254\224\314\217\324\360\261\311\236\254\261\246\347\346\361\247\301\306\342\274\337\301\253\375\375\326\376\262\354\256\230\270\322\230\256\314\334\300\245\347\273\316\341\352\364\311\231\376\245\314\320\364\306\370") -TOPIC_TEXT( -"\246\304\355\274\332\255\332\251\302\327\313\352\374\352\314\214\347\220\225\212\263\242\360\302\221\264\353\243\226\227\266\233\317\376\223\210\326\264\263\227\275\314\272\323\375\312\246\363\226\371\332\242\332\233\312\243\241\317\253\322\352\265\315\375\330\310\246\254\233\376\245\362\342\345\227\355\243\265\321\343\361\306\315\325\255\345\206\266\340\320\347\362\324\205\336\275\233\334\330\331\231\335\221\364\261\377\272\305\245\301\305\342\256\331\263\234\333\250\213\202\227\224\374\306\300\277\213\217\226\360\223\230\302\270\214\317\264\316\262\224\343\363\336\312\202\374\251\267\232\374\270\260\345\323\217\271\242\257\247\375\366\272\355\200\207\373\201\335\277\263\371\343\220\254\377\350\237\250\314\301\352\271\202\203\356\205\301\272\264\217\341\341\345\253\275\377\232\331\264\274\334\234\305\221\310\272\363\353\253\307\366\301\247\327\312\267\356\332\343\271\323\305\304\242\201\346\254\330\307\317\303\331\207\347\332\243\366\272\242\254\360\234\240\312\323\306\257\253\313\261\267\336\233\221\214\336\212\355\210\264\240\356\225\225\375\201\236\266\256\254\254\240\230\362\352\376\316\261\360\260\307\251\203\347\306\250\213\362\262\246\277\322\275\254\341\361\225\253\216\327\212\277\332\302\274\366\372\224\320\200\311\204\205\336\356\310\315\247\314\205\263\212\305\304\351\254\232\200\306\212\212\372\203\344\314\362\271\226\211\331\262\226\235\332\250\306\301\250\205\252\335\225\301\313\312\245\210\361\366\307\204\225\345\276\211\362\241\266\354\361\361\362\202\326\213\300\346\311\320\345\261\227\223\267\242\351\207\202\217\316\374\236\275\277\233\232\306\376\214\256") -TOPIC_TEXT( -"\343\242\313\267\233\262\206\317\341\303\265\210\214\327\344\343\335\232\322\334\256\225\345\227\361\273\266\365\266\374\201\343\323\261\361\227\240\261\266\207\210\263\302\344\214\266\350\265\226\325\254\214\216\374\204\305\264\360\230\257\373\370\233\332\372\202\366\260\207\335\252\325\205\233\340\234\274\216\314\314\340\322\220\365\374\303\341\272\375\233\340\234\301\232\226\321\303\377\327\345\265\250\253\350\201\217\366\263\364\225\332\303\365\314\217\223\250\266\356\205\327\360\303\251\247\374\213\263\246\346\276\223\217\375\274\373\200\336\370\254\260\375\263\261\303\255\362\226\233\352\356\272\307\364\270\236\353\277\355\310\312\272\223\274\353\277\270\262\361\371\331\336\257\316\236\310\213\373\220\367\326\343\355\323\346\367\321\365\366\273\272\220\247\306\352\372\261\213\330\227\314\200\242\361\365\247\240\250\273\251\340\305\347\214\354\374\370\320\323\266\317\216\237\277\363\277\362\331\233\271\211\246\345\350\345\321\353\352\206\362\354\265\213\361\357\343\241\303\346\364\276\354\344\300\201\375\216\316\272\373\246\303\342\340\207\345\216\343\325\320\220\341\275\350\260\260\260\340\370\250\257\313\212\312\340\335\277\332\372\246\236\257\277\275\371\276\354\303\320\357\347\253\265\223\201\317\370\222\361\201\272\306\316\202\377\215\237\334\377\267\216\222\214\356\363\323\201\250\222\236\345\275\255\254\333\222\207\253\277\246\271\357\312\355\316\210\241\210\342\351\356\323\201\362\307\253\223\205\314\233\251\336\276\343\363\260\313\370\367\344\310\366\306\213\254\372\230\257\340\306\320\234\366\215\344\317\341\332\377\321\233\332\276\262\236\332\255\265\273\351") -TOPIC_TEXT( -"\317\247\244\207\343\321\244\341\274\215\253\215\321\265\354\370\302\365\327\270\262\334\310\275\224\266\311\343\342\274\200\232\236\363\304\342\220\246\225\305\353\214\370\234\274\370\220\272\361\234\241\237\323\230\373\343\204\364\365\260\271\363\273\357\274\363\361\306\233\357\260\300\206\201\254\355\224\326\226\231\374\364\252\250\320\261\233\353\371\346\251\223\360\241\331\303\216\265\266\243\367\342\361\204\313\333\253\266\315\343\316\327\333\356\224\364\335\210\232\217\263\361\253\255\251\265\325\363\262\241\261\261\225\372\345\207\275\221\252\262\226\314\213\235\217\205\376\233\200\224\340\311\376\201\362\356\237\217\250\320\221\317\335\252\371\277\370\305\257\366\362\375\364\277\315\226\377\304\301\261\347\277\273\373\233\253\305\247\371\233\232\331\241\306\240\220\213\225\353\301\305\350\253\337\341\223\306\270\204\334\207\253\305\207\221\374\205\206\227\213\307\230\375\254\273\366\372\354\253\250\273\214\237\304\303\373\201\221\232\227\221\322\335\206\305\352\254\366\343\325\205\225\345\340\363\356\222\211\231\331\261\214\240\255\357\204\305\233\224\221\320\222\301\332\342\315\345\330\342\332\300\242\372\350\374\342\327\250\374\346\242\341\230\201\347\312\242\371\271\247\247\306\264\254\377\363\256\347\316\334\273\375\363\352\375\311\305\214\334\252\252\304\340\225\202\203\263\343\316\246\251\372\272\272\223\331\211\357\327\327\316\235\375\265\357\333\217\361\270\261\350\357\244\267\346\277\306\320\356\225\360\302\306\206\265\342\330\225\327\267\203\263\327\254\322\373\222\334\307\244\347\220\275\254\301\247\233\246\234\317\243\363\241\351\372\235\342\270\357\312") -TOPIC_TEXT( -"\277\367\203\333\221\236\370\351\317\345\330\205\244\307\377\217\363\343\306\370\340\360\222\212\367\224\347\372\275\213\331\373\230\343\304\212\307\372\333\361\257\254\212\275\271\314\265\355\346\231\225\304\350\216\370\254\345\342\236\322\346\372\312\225\253\324\377\321\254\261\252\227\262\354\224\246\365\204\330\331\223\323\251\250\305\311\265\366\246\360\342\342\240\222\240\346\246\210\350\245\313\267\312\206\250\216\324\342\265\322\330\274\330\311\340\211\277\366\363\235\253\206\356\315\305\306\370\371\251\275\247\362\341\312\223\263\375\227\326\333\276\214\216\217\323\216\376\234\257\263\235\274\336\254\277\272\247\244\377\213\341\347\310\332\342\354\306\322\356\221\241\342\261\336\317\352\237\246\325\310\301\372\261\333\372\207\276\201\204\376\373\356\247\237\231\214\264\266\324\226\334\270\333\347\241\373\374\376\373\377\225\374\377\376\237\377\256\377\365\373\337\264\376\365\306\334\235\215\377\355\330\223\336\376\375\315\327\325\252\315\257\362\330\215\243\217\213\201\346\355\350\316\340\260\277\211\314\367\324\352\201\303\322\301\215\234\373\234\265\375\273\325\217\257\375\257\223\363\223\207\311\330\315\304\354\371\213\334\247\204\323\346\374\366\377\265\237\313\327\313\315\271\320\364\241\267\254\212\243\366\360\302\260\361\350\356\244\376\343\340\210\215\337\231\216\347\350\264\267\245\326\302\262\262\206\373\272\325\375\245\200\311\336\204\354\235\237\351\266\221\221\327\374\337\233\212\356\201\217\305\315\267\263\324\327\205\302\316\317\271\321\206\335\276\376\330\301\373\207\372\322\261\337\335\252\251\247\346\314\361\360\240\207\257\354\332\221\215\323\270") -TOPIC_TEXT( -"\354\265\367\352\324\224\363\263\305\331\346\261\334\206\362\373\342\212\312\312\232\234\226\225\355\325\271\217\207\202\376\227\317\201\241\334\345\214\373\300\333\204\372\234\313\212\332\254\247\211\277\233\232\312\314\206\225\257\333\306\330\222\272\224\327\237\312\274\302\327\360\241\243\262\210\260\305\376\305\210\343\305\324\340\262\305\364\260\257\315\263\255\256\254\263\224\213\321\226\250\214\327\345\320\227\232\210\232\346\335\222\207\203\222\305\315\305\227\251\346\330\377\351\213\347\353\322\244\321\266\340\204\363\342\266\314\344\232\301\271\210\354\376\366\222\327\372\247\361\230\355\320\246\372\303\233\261\237\300\277\370\254\237\352\370\275\245\324\225\202\245\367\322\312\317\352\200\322\262\202\305\236\334\241\255\220\212\243\262\201\252\247\326\363\334\353\210\262\342\332\316\264\367\376\260\267\303\230\346\223\335\215\363\225\324\247\327\330\312\300\310\315\303\265\267\272\220\256\304\324\301\357\316\377\316\331\312\221\343\365\266\274\270\325\361\253\251\252\252\370\262\372\343\311\245\375\357\251\217\337\302\214\251\226\221\236\356\313\212\315\342\354\200\236\224\242\265\244\320\253\242\221\365\326\236\316\317\201\220\373\262\372\332\273\332\357\303\264\330\274\276\372\344\300\373\357\235\375\376\357\307\377\333\343\237\301\277\351\273\370\223\307\214\266\256\317\373\305\330\231\306\317\261\250\275\362\264\274\224\215\201\303\214\250\200\241\364\237\276\264\215\204\246\311\271\251\305\352\202\304\216\210\303\235\253\320\264\347\220\212\234\206\376\253\353\301\346\224\367\234\316\307\246\321\247\215\244\367\267\330\322\366\234\354\302\234\251\306\223\356") -TOPIC_TEXT( -"\344\267\327\342\321\301\320\361\356\273\364\203\315\255\275\335\335\331\314\206\332\326\200\231\263\250\325\363\367\266\267\235\274\221\356\207\236\247\377\237\364\253\370\311\336\200\217\313\313\276\200\346\360\205\343\260\356\325\366\325\336\273\375\263\244\350\327\274\243\244\333\316\347\277\357\301\276\313\277\370\364\277\361\207\205\343\274\270\302\206\365\260\262\322\270\356\336\252\341\210\266\233\233\351\335\217\323\353\250\314\227\204\343\360\334\363\242\314\243\275\303\261\342\216\212\362\260\214\340\340\323\301\203\364\340\206\375\346\304\370\217\300\310\255\242\327\366\276\200\314\265\307\365\213\326\227\317\302\256\345\275\230\263\213\207\344\253\342\222\357\264\350\354\216\245\346\240\326\347\201\361\300\343\303\321\315\350\226\225\372\326\233\362\217\277\307\352\273\200\212\307\362\231\345\350\257\353\350\372\306\344\374\232\237\321\361\264\344\216\313\322\245\320\226\227\246\266\306\247\272\300\313\336\354\226\374\261\345\313\274\311\322\275\216\234\257\255\241\231\251\277\247\314\261\371\346\247\217\254\245\343\311\264\310\360\370\250\323\376\245\306\343\224\321\333\232\237\231\237\233\216\210\357\262\261\206\307\370\245\236\277\330\363\277\314\336\370\213\365\332\362\265\353\317\276\377\300\377\224\247\333\304\206\370\252\254\275\324\264\343\307\266\340\306\235\317\206\314\231\210\367\352\312\262\330\300\330\277\310\201\257\325\204\326\251\232\370\347\320\220\372\263\303\307\307\213\277\332\302\372\267\375\303\272\243\343\260\211\216\211\277\350\324\200\372\230\216\267\276\370\365\257\334\322\361\234\277\235\366\344\333\376\336\256\306\226\302\220\201\317") -TOPIC_TEXT( -"\203\201\347\336\371\220\253\370\260\257\374\223\307\262\257\366\355\232\235\213\357\357\331\275\233\323\203\360\247\332\221\220\320\261\225\307\301\305\300\342\363\347\355\316\200\225\351\314\306\202\330\366\350\207\267\320\205\335\303\333\335\261\273\355\336\237\361\226\200\357\344\307\334\214\274\334\215\247\347\306\344\240\200\260\303\242\242\231\374\336\247\250\246\336\340\250\302\226\262\233\374\360\376\202\233\315\206\350\217\373\326\305\352\306\206\310\352\231\340\311\330\325\345\343\351\351\322\206\263\211\206\376\335\226\255\333\304\256\327\362\307\326\300\225\206\326\265\337\321\247\230\226\314\235\222\346\226\251\330\204\372\367\253\324\215\364\234\307\246\320\310\246\332\326\256\355\211\303\316\367\271\345\234\377\343\235\265\337\217\241\221\212\226\362\374\334\304\344\210\307\214\205\356\220\276\245\222\211\306\311\217\275\252\314\265\243\236\323\362\362\223\305\274\245\204\275\302\341\253\232\303\341\355\314\216\340\212\302\205\266\300\373\242\235\250\215\275\373\272\334\323\342\302\372\231\233\224\307\361\367\232\270\237\204\214\325\303\322\322\320\274\371\342\246\365\377\306\327\205\261\352\236\332\253\340\333\330\314\334\364\210\340\317\302\306\247\326\276\303\360\240\205\243\330\255\335\313\313\370\213\254\271\325\376\234\311\206\236\245\234\366\322\276\353\336\316\303\214\340\336\262\232\232\377\274\366\226\213\277\213\302\200\307\302\306\252\374\236\323\271\342\243\377\364\376\277\266\235\375\211\340\361\216\322\265\203\337\230\230\226\265\331\277\206\242\341\375\333\276\347\313\335\375\373\366\202\256\273\351\230\355\352\377\240\310\273\373\333\362\225") -TOPIC_TEXT( -"\252\274\337\215\374\334\335\331\206\310\222\244\303\337\250\372\260\247\363\277\200\240\255\347\232\201\267\326\260\260\245\363\360\353\251\330\364\274\307\205\321\332\332\201\317\323\265\214\341\223\340\207\217\236\244\216\231\325\212\206\307\306\360\253\233\331\317\217\227\347\257\377\323\321\377\324\360\301\323\221\237\203\203\347\363\362\363\326\236\277\231\304\317\222\244\255\232\360\351\227\223\251\373\366\375\252\202\305\346\367\376\346\357\261\356\351\225\373\350\306\266\342\362\352\374\306\375\373\271\316\207\311\237\232\364\333\274\357\332\215\345\302\265\243\262\350\300\375\376\352\370\356\352\310\247\303\271\215\355\313\271\203\323\315\330\234\271\200\263\256\224\272\357\251\342\307\212\301\234\364\351\342\256\247\366\207\337\246\200\364\360\223\332\342\230\204\223\261\205\330\314\361\210\263\355\212\353\226\341\204\272\323\370\260\261\317\243\315\244\221\372\264\357\211\247\320\227\340\235\205\262\327\237\320\275\337\217\241\201\234\237\363\274\254\256\305\362\214\220\346\205\265\214\370\312\245\223\326\264\334\222\231\353\226\351\344\264\215\361\201\377\321\315\346\221\273\300\255\200\212\371\244\317\211\217\302\332\322\241\364\327\351\332\212\354\200\206\300\326\332\244\261\275\215\253\241\221\211\357\211\375\323\245\247\207\307\320\277\371\350\227\203\274\345\201\267\321\255\226\230\257\354\366\253\237\240\226\304\314\230\235\247\361\355\201\275\374\334\226\366\306\311\270\216\253\323\320\374\343\361\230\312\320\223\321\230\335\307\322\370\372\303\363\236\237\332\376\257\233\200\307\263\337\374\205\215\366\370\274\356\300\276\363\263\227\343\207\337\205\236") -TOPIC_TEXT( -"\305\321\214\306\326\372\240\375\332\323\315\375\315\300\260\250\324\244\256\312\275\315\247\275\234\233\351\357\354\357\302\206\323\305\210\315\377\354\320\212\344\205\334\356\365\367\365\202\316\353\361\332\207\340\355\275\303\364\356\255\257\217\217\205\370\311\240\251\230\271\333\330\340\230\267\272\340\307\351\317\370\311\356\311\237\247\323\317\352\302\203\330\207\237\336\274\216\373\312\205\252\252\301\240\322\263\225\260\357\375\315\307\300\364\332\200\200\226\355\214\266\324\233\243\305\351\206\247\372\237\220\300\277\362\207\214\264\316\316\364\364\202\252\210\241\261\232\223\330\376\240\273\317\301\200\206\202\374\212\243\260\227\230\346\306\215\255\260\365\310\203\225\227\203\341\225\327\210\224\256\217\326\267\221\247\200\355\256\231\202\253\300\251\252\320\321\246\211\353\332\224\325\361\255\312\316\216\273\224\374\207\213\333\226\230\226\374\342\264\242\375\310\346\340\364\217\255\253\350\323\341\212\214\335\355\266\202\346\247\204\247\324\270\306\344\212\236\367\314\341\244\327\250\322\250\264\273\273\260\321\365\240\273\346\321\247\247\250\331\205\353\265\321\257\230\273\252\256\372\277\251\360\350\250\222\367\233\317\314\364\372\373\307\302\224\266\235\272\305\323\337\326\235\350\230\235\367\352\302\314\361\371\323\327\200\231\320\343\261\234\267\361\240\250\305\321\366\220\357\213\217\357\376\213\270\207\227\345\364\254\256\346\223\217\343\356\330\272\216\332\261\307\276\225\252\253\372\256\376\344\366\233\232\263\366\370\265\323\254\226\261\214\367\323\364\377\350\307\335\207\312\254\272\262\354\307\325\216\355\324\314\303\247\260\212\263\366\340\343\204") -TOPIC_TEXT( -"\333\277\274\240\260\347\213\243\344\371\222\354\360\340\337\247\237\254\320\224\270\204\305\343\304\207\316\315\307\363\320\211\371\274\320\274\357\330\302\276\357\276\303\371\246\334\277\344\217\216\362\360\340\274\254\240\314\356\266\354\214\223\336\244\347\275\300\253\264\310\265\306\231\357\353\352\355\356\254\365\310\313\227\313\372\370\275\307\362\373\273\275\335\235\217\254\262\262\240\242\213\346\267\277\345\244\222\222\355\264\326\215\261\241\246\341\213\203\373\230\330\246\250\245\236\263\360\274\263\367\205\201\352\222\276\206\260\346\372\233\207\247\235\323\211\301\205\270\324\264\220\331\225\342\253\243\303\343\267\371\354\370\233\354\275\245\224\203\340\247\260\210\303\235\260\361\333\233\324\333\375\246\203\207\265\334\202\257\314\220\224\263\323\221\312\327\226\271\376\364\355\305\260\210\225\325\224\230\307\321\254\265\305\255\255\344\306\247\223\301\305\320\332\342\202\247\320\206\225\241\224\246\264\342\361\372\357\355\276\315\372\236\212\307\217\234\322\257\263\247\234\250\345\305\333\240\273\211\301\200\233\223\361\213\334\271\243\335\231\234\325\336\217\344\222\303\360\360\343\327\220\366\247\234\216\326\204\371\313\231\254\320\221\205\364\204\226\242\350\263\307\207\314\251\347\215\373\227\324\324\270\215\242\252\316\335\330\344\224\230\335\307\206\375\343\363\374\336\341\244\247\345\307\352\325\262\237\370\324\234\367\327\361\320\335\367\353\230\301\225\332\317\255\347\323\377\273\277\377\373\373\326\233\217\210\305\215\337\247\352\341\226\336\252\202\336\222\215\241\233\232\276\360\323\250\310\244\267\203\337\202\356\251\342\302\361\255\364\253\216") -TOPIC_TEXT( -"\327\244\223\362\271\346\206\242\313\365\272\274\263\330\263\305\237\236\217\207\227\205\275\324\210\321\256\207\274\342\337\371\347\235\300\260\206\340\203\357\374\214\277\260\277\230\247\230\342\324\336\277\376\361\217\211\204\234\374\215\337\351\276\343\202\322\361\375\355\217\274\246\244\233\365\233\342\306\340\377\272\230\212\203\232\310\366\362\222\376\310\332\377\332\342\322\222\354\277\321\302\203\250\245\311\350\243\252\323\243\351\246\221\241\316\254\257\311\324\274\265\336\303\230\201\220\354\300\321\246\311\314\217\236\253\301\221\214\303\273\260\207\327\350\370\354\332\247\270\242\354\226\260\222\276\301\305\343\334\343\361\321\302\365\363\343\244\344\231\300\347\306\242\376\227\214\351\204\375\210\354\210\243\201\344\245\203\222\221\343\241\354\307\242\303\225\313\306\323\376\323\307\202\223\324\310\314\332\257\263\240\240\231\373\247\373\201\335\225\266\207\223\244\342\376\237\352\370\320\222\235\352\261\335\221\312\273\212\311\332\340\346\245\206\256\217\316\365\271\205\304\327\344\252\225\307\355\270\332\307\320\342\302\305\300\351\267\211\210\226\215\333\213\227\357\273\353\230\217\257\372\235\331\316\326\365\244\374\360\275\252\262\346\223\217\223\361\230\263\364\257\373\374\344\203\377\307\361\355\321\377\265\363\357\341\377\256\276\327\360\342\330\205\361\373\267\375\311\252\255\231\316\206\230\242\351\326\335\303\313\321\202\303\235\371\271\242\271\242\202\301\266\356\354\217\271\213\365\304\313\307\267\304\361\206\240\232\237\233\220\303\370\212\335\273\367\306\264\371\370\300\367\223\271\263\356\347\325\361\316\224\336\364\356\216\332\265\343\261\372") -TOPIC_TEXT( -"\362\245\222\361\336\210\371\203\231\345\314\352\354\316\326\247\312\341\232\323\242\262\310\325\331\326\275\346\276\327\274\332\371\273\330\207\311\267\317\342\375\303\207\203\275\364\241\207\355\321\233\350\336\225\361\360\274\204\232\214\324\264\367\275\364\352\374\321\370\230\253\351\322\311\314\261\351\221\341\376\261\254\305\230\363\234\273\221\366\343\272\211\305\304\346\320\361\202\227\360\211\307\330\311\233\357\257\274\341\226\232\347\307\343\235\373\274\206\222\232\247\231\230\355\236\333\302\324\302\374\315\305\317\262\361\370\270\260\310\306\347\362\214\252\363\342\336\234\216\324\302\342\261\256\264\352\273\221\262\265\223\327\231\276\314\344\262\233\260\344\303\202\212\270\247\277\307\211\254\336\353\273\344\354\202\264\235\237\301\260\361\302\343\267\317\253\356\271\202\377\311\371\225\201\375\225\314\365\200\307\367\264\240\367\233\323\361\356\237\213\324\214\220\254\215\306\247\276\276\273\251\240\352\324\310\305\353\315\353\350\323\377\336\244\354\233\373\203\262\275\201\344\326\267\247\342\376\232\233\346\224\221\316\200\361\374\273\202\267\271\235\353\301\247\212\347\360\330\371\253\343\251\333\304\343\260\272\307\333\376\273\253\343\237\375\213\323\331\325\377\265\254\244\373\337\212\275\356\261\340\355\364\261\377\303\330\263\373\367\325\345\205\200\307\204\354\224\372\205\263\201\241\304\274\325\303\270\273\300\373\317\307\333\243\235\214\266\221\251\321\246\337\330\221\363\277\374\360\272\347\213\243\231\240\372\252\274\225\336\252\353\362\271\270\332\205\330\367\257\332\302\277\365\316\307\263\256\203\225\335\357\367\342\261\210\320\204\304\244\336") -TOPIC_TEXT( -"\302\232\260\236\237\274\370\220\231\304\274\340\225\336\324\232\366\224\303\363\244\204\351\260\221\213\271\260\203\375\275\362\227\215\257\217\263\267\375\236\277\372\251\253\256\313\224\305\320\226\333\210\356\326\365\230\345\270\216\267\221\300\322\234\366\263\313\306\352\357\352\221\343\215\225\351\204\255\201\333\357\372\360\202\223\337\335\232\246\251\261\213\257\255\316\331\243\341\245\265\302\201\376\206\255\277\224\242\352\211\266\366\304\360\344\334\360\327\355\360\216\343\345\375\341\325\221\262\323\326\233\302\342\361\320\311\377\205\364\326\354\354\232\322\210\221\240\315\255\252\332\244\264\334\346\310\232\204\342\246\210\377\266\341\211\306\343\211\304\320\350\241\271\243\253\233\213\251\224\332\300\321\255\345\350\361\244\271\251\206\213\236\203\335\337\265\247\327\374\322\212\230\352\326\202\261\324\341\355\331\352\363\231\207\254\353\237\256\330\316\201\266\273\255\274\345\314\347\252\216\226\302\274\236\341\237\231\237\237\235\350\353\220\356\353\357\351\200\351\370\336\374\374\377\373\227\377\316\335\371\357\332\317\375\204\326\222\367\361\337\263\366\330\215\335\202\205\260\341\222\220\311\360\334\261\211\375\214\324\250\364\354\314\260\344\251\350\243\260\307\216\265\266\324\365\364\255\265\222\217\343\336\247\270\257\336\326\317\316\326\354\210\313\353\350\275\234\265\243\220\356\207\272\233\374\254\236\227\345\233\223\266\272\236\217\360\227\340\350\230\307\242\201\253\202\301\200\275\230\216\201\206\336\346\232\236\241\340\261\373\271\254\251\305\345\210\307\254\361\370\245\327\240\306\331\307\211\215\317\346\337\353\370\274\306\327\371\227\273\367") -TOPIC_TEXT( -"\376\352\247\247\244\265\233\241\317\315\346\355\310\272\342\317\321\370\237\302\251\327\235\306\313\363\207\324\362\345\200\302\263\263\377\316\242\275\376\261\254\312\214\370\332\316\224\237\333\335\362\331\226\265\340\344\361\362\375\274\266\203\200\250\251\345\241\225\254\302\336\332\230\264\345\213\207\205\204\267\350\231\322\347\225\215\230\233\225\370\343\304\221\344\245\216\226\355\353\240\341\253\253\343\260\374\243\307\263\347\353\222\261\314\322\274\226\202\237\330\235\256\266\223\237\200\360\334\233\334\201\277\324\206\341\201\353\226\212\223\341\274\274\262\361\251\315\342\232\343\247\341\261\260\317\333\226\260\362\210\306\260\357\266\311\211\221\247\217\203\303\306\367\303\353\317\256\343\207\261\240\326\275\317\363\303\367\253\226\311\210\223\201\367\224\275\324\342\375\276\257\300\363\310\274\235\222\335\223\222\232\216\204\234\257\300\244\373\350\356\335\362\360\330\203\344\312\370\311\326\340\232\200\203\367\371\354\304\227\237\244\367\266\354\342\242\324\315\317\337\342\340\375\311\213\247\240\342\210\323\304\327\246\367\360\316\307\274\312\344\231\316\370\214\224\221\243\224\207\304\216\334\361\312\201\221\367\231\211\214\272\341\213\265\250\372\231\230\222\231\235\336\327\332\344\225\324\247\314\244\307\353\307\241\351\322\316\334\211\375\345\223\276\213\301\344\234\213\344\330\366\352\361\330\303\330\355\323\302\367\377\373\217\341\267\201\307\242\362\274\337\344\375\374\362\336\316\227\307\245\273\323\211\255\272\236\370\207\357\355\302\267\361\212\373\242\236\300\270\373\275\354\265\257\223\370\353\314\267\360\252\231\330\227\311\341\215\316\227\221") -TOPIC_TEXT( -"\276\301\225\275\341\347\257\275\324\364\356\340\227\356\217\325\323\361\323\264\352\370\236\271\206\214\200\270\345\361\333\352\325\341\223\204\371\367\224\252\262\302\251\332\323\230\344\376\224\356\206\361\316\243\312\335\261\375\321\217\376\346\262\322\217\317\201\227\265\325\267\200\274\260\371\300\217\236\223\220\271\251\322\326\321\267\235\217\251\370\244\334\332\370\333\234\220\277\234\235\270\264\261\343\313\363\340\304\265\354\236\363\265\270\270\323\244\344\315\205\253\375\210\375\222\334\304\327\225\337\225\261\224\217\203\326\243\251\221\207\330\277\226\301\354\356\345\313\362\265\264\314\227\343\333\314\207\233\201\220\225\345\252\270\217\221\222\345\300\210\364\220\261\216\316\357\260\346\366\370\231\205\325\223\266\233\241\354\205\373\215\324\310\217\217\335\313\375\270\253\227\346\320\306\325\205\274\265\346\207\355\234\345\214\360\232\303\321\225\346\365\210\241\354\201\301\330\363\233\366\265\344\242\256\236\204\326\221\307\323\246\256\305\262\225\311\261\354\255\305\366\236\271\345\356\263\261\362\214\243\276\303\212\233\244\256\215\352\330\263\224\223\362\334\372\252\241\310\265\216\322\266\336\323\335\201\206\240\325\305\302\243\231\370\314\302\216\306\316\311\266\242\251\377\322\300\354\240\254\364\202\335\305\367\341\350\201\316\204\271\307\301\205\373\257\260\261\334\377\315\304\353\262\342\306\242\305\331\271\260\275\254\361\362\347\273\331\342\261\220\227\312\277\324\344\370\344\336\207\337\240\300\324\332\311\366\241\337\362\272\251\254\204\247\313\210\325\233\357\342\333\231\361\351\234\237\343\361\220\356\253\317\302\211\366\310\232\245\220\217") -TOPIC_TEXT( -"\335\204\377\335\210\307\377\376\337\377\213\257\327\363\376\207\207\341\374\267\267\367\346\256\337\355\357\331\275\273\366\366\265\275\354\250\263\336\225\242\207\345\360\330\273\317\345\343\246\206\254\217\366\356\374\324\325\207\341\343\212\245\373\253\345\350\253\353\307\206\272\315\205\267\247\326\277\306\310\323\375\315\317\217\231\261\373\373\366\274\311\353\326\235\317\261\235\257\243\255\327\313\321\301\313\247\310\262\330\356\314\351\274\212\364\201\354\374\364\344\347\332\372\366\346\374\366\233\362\262\365\257\375\342\261\343\220\271\215\251\233\345\230\303\311\360\273\345\327\312\301\306\370\213\234\330\337\355\333\270\260\250\304\323\300\277\261\236\251\224\320\262\340\274\255\213\254\250\376\373\364\354\331\332\246\257\364\317\327\325\276\372\347\317\341\237\222\364\261\217\203\253\247\251\231\300\365\232\233\273\323\364\265\345\235\217\233\267\334\304\340\217\263\251\363\326\257\330\212\262\341\327\263\256\244\363\242\301\306\332\221\230\271\201\305\301\305\252\211\217\236\334\363\325\263\223\350\223\310\211\257\314\232\301\320\266\264\374\306\311\232\300\355\257\342\242\201\270\323\352\232\233\377\267\231\272\334\313\215\270\317\233\356\334\332\252\325\313\234\337\212\363\211\307\342\376\275\240\264\241\352\307\221\356\340\314\302\255\366\225\273\213\314\255\337\252\244\212\310\326\231\246\244\215\217\343\362\300\360\210\316\374\330\365\215\317\254\273\272\207\351\336\346\317\234\374\204\221\262\316\326\365\373\210\227\330\235\237\310\255\361\252\225\311\357\221\374\205\355\226\265\211\257\334\212\232\377\344\301\225\265\334\220\247\363\272\344\326\352\264") -TOPIC_TEXT( -"\235\355\245\346\235\234\223\257\327\361\251\256\213\236\343\314\321\371\250\242\317\376\220\255\235\321\225\324\305\307\210\216\233\251\370\267\254\236\213\326\272\314\247\343\266\362\327\251\276\242\205\205\370\374\360\376\352\341\307\356\201\230\226\334\361\370\365\340\276\263\341\362\347\367\375\227\332\376\323\302\267\377\353\306\321\373\254\331\347\245\221\277\266\243\256\266\357\257\340\276\327\240\221\205\366\254\222\253\255\342\257\210\332\343\304\343\265\204\365\374\354\200\251\357\334\371\305\257\316\206\247\360\306\307\313\271\315\263\261\365\312\257\225\261\210\236\242\336\213\236\271\372\235\255\260\367\315\211\270\367\352\370\303\327\256\334\366\374\355\271\245\305\327\330\243\313\231\322\360\344\347\346\263\234\300\312\356\274\242\255\256\254\213\244\313\225\256\366\365\364\303\367\327\270\346\242\363\261\274\377\330\354\254\372\310\301\320\216\361\236\334\244\346\236\376\351\313\363\307\217\277\313\274\246\345\341\240\340\242\221\240\225\217\232\310\342\266\225\247\260\276\261\225\317\215\254\220\310\230\235\345\226\360\225\341\241\361\334\353\343\263\270\252\265\314\236\270\263\254\312\335\226\251\256\340\214\364\335\343\253\312\235\354\374\210\361\316\376\314\251\333\364\364\313\313\361\305\210\254\245\312\313\302\335\307\310\364\353\202\337\223\367\316\227\322\316\365\243\204\255\373\334\252\321\352\267\237\311\275\313\377\376\250\236\335\261\321\361\322\365\313\216\305\204\377\307\270\251\343\362\352\217\317\243\341\217\342\305\221\321\234\331\254\204\234\204\254\274\221\237\370\234\257\331\212\201\240\247\343\363\324\252\306\353\367\232\373\314\366\323") -TOPIC_TEXT( -"\312\232\344\314\224\226\246\375\331\347\331\347\272\211\272\222\377\255\327\342\261\272\210\326\254\356\234\342\231\344\351\307\370\200\315\231\263\345\231\342\341\233\341\220\361\214\205\267\234\360\311\270\343\370\206\257\205\306\231\222\261\204\202\363\310\277\246\254\217\274\237\274\346\214\351\363\313\253\364\274\313\253\217\312\276\362\260\375\212\257\213\221\245\226\217\375\252\327\306\234\312\376\217\377\276\371\366\277\207\305\343\332\370\365\235\237\262\342\242\340\364\276\216\241\331\366\277\223\232\234\320\212\233\347\347\357\321\205\330\363\331\363\315\303\242\225\274\315\313\262\201\212\371\346\270\204\247\273\346\350\371\314\331\307\363\374\215\336\354\354\211\260\317\347\217\277\251\316\333\272\365\201\275\230\316\227\313\246\310\235\363\334\257\316\356\205\200\246\370\334\317\214\200\213\305\205\260\370\240\350\257\365\255\253\353\264\227\371\317\236\263\332\371\273\263\366\330\270\224\337\201\355\267\303\224\301\243\304\343\263\337\240\304\260\304\220\373\270\267\216\216\275\302\213\230\302\317\347\300\213\213\360\325\210\236\227\202\226\376\226\304\344\250\300\277\373\354\351\252\352\241\205\244\263\337\261\206\336\303\224\204\300\220\221\272\376\345\315\370\267\276\355\202\226\367\230\216\221\332\254\365\300\344\265\232\302\336\340\312\355\262\204\314\305\335\226\342\343\274\206\253\214\365\342\220\266\347\344\214\347\231\346\304\364\312\275\215\340\253\267\231\212\214\324\210\213\371\313\352\364\244\214\262\351\330\202\325\375\272\211\270\370\372\314\314\204\223\234\332\361\274\317\243\220\360\237\365\236\230\301\245\261\366\344\212\262\323\335\223\251") -TOPIC_TEXT( -"\333\221\277\273\355\331\275\233\275\310\322\370\276\341\257\274\347\366\332\337\362\200\310\232\264\315\277\300\224\373\220\243\256\311\201\335\235\350\310\271\233\223\223\217\243\250\346\341\350\252\256\236\363\261\254\306\232\231\372\312\213\336\272\264\324\274\244\332\276\273\344\376\212\212\270\212\236\273\246\312\262\335\274\257\212\371\234\202\365\340\340\245\254\352\251\353\323\346\230\314\241\241\207\255\203\222\312\307\327\361\356\346\274\256\245\353\232\247\377\236\355\210\201\306\274\260\341\307\302\226\332\325\334\345\216\236\235\217\257\371\262\263\343\261\316\276\351\247\233\241\225\316\373\312\240\263\370\234\227\363\323\275\360\246\236\353\277\355\310\312\367\332\371\361\277\270\201\234\200\307\330\262\240\371\364\330\350\327\320\347\227\272\341\220\361\271\370\366\266\366\243\256\243\234\346\216\344\326\375\343\347\216\336\216\235\216\265\260\307\275\323\361\360\360\346\247\370\334\263\213\200\307\352\373\230\221\220\253\335\326\304\262\242\225\217\231\244\240\325\215\255\360\311\261\331\227\317\267\223\334\302\332\324\200\266\354\317\340\261\314\377\374\371\265\227\367\303\240\313\261\274\277\347\326\331\336\262\277\353\360\326\220\233\233\216\340\360\251\201\361\225\240\242\343\363\215\352\270\325\311\316\355\223\302\230\352\222\326\315\247\264\276\315\371\322\220\242\354\214\317\231\226\343\305\224\225\230\354\202\276\221\330\315\330\333\326\210\365\205\263\333\321\336\275\242\374\304\261\316\303\255\377\311\241\256\302\271\351\302\373\331\263\347\353\211\343\231\336\220\337\350\364\244\356\257\250\216\243\343\247\230\313\320\257\360\207\223\331\275\205") -TOPIC_TEXT( -"\232\252\271\353\225\345\227\277\276\334\221\202\366\231\303\225\244\366\306\375\371\341\264\266\240\241\265\273\231\273\375\364\321\307\237\224\255\360\343\367\326\325\203\216\303\332\262\265\203\323\312\313\310\341\313\272\270\332\331\304\314\377\362\343\250\334\311\360\270\336\276\312\225\217\304\331\322\207\315\365\276\216\347\244\311\317\307\226\237\330\261\362\254\242\301\251\363\263\352\240\331\203\217\245\250\225\353\312\212\374\242\342\212\270\245\232\261\316\344\261\314\251\314\341\357\234\223\221\227\351\346\371\301\304\327\305\304\330\352\314\266\262\250\223\331\365\373\311\257\370\327\310\301\304\224\361\323\361\330\352\371\341\355\334\233\217\335\326\236\301\367\343\270\230\377\335\343\303\363\207\366\375\373\243\354\336\261\335\333\247\317\344\201\370\337\301\275\216\201\262\236\220\276\374\266\260\240\252\262\302\217\322\254\360\272\244\233\323\331\303\355\262\360\376\247\237\256\374\242\311\202\215\365\365\350\205\306\207\275\241\331\243\244\212\333\232\230\200\230\271\360\372\367\356\355\305\376\252\316\325\377\360\322\367\313\307\357\353\274\364\327\331\333\267\234\217\364\207\361\222\355\270\367\220\227\346\210\300\354\367\266\207\321\251\370\314\260\212\306\366\304\310\305\245\221\263\312\332\247\277\305\256\230\267\317\240\346\235\251\236\351\211\320\256\260\327\276\362\363\234\363\337\334\253\365\345\267\232\353\356\336\357\362\303\305\230\360\215\263\227\327\267\243\375\213\356\326\307\214\315\202\230\376\343\345\300\241\332\333\325\265\301\320\264\260\237\352\234\214\250\314\307\307\265\335\231\251\362\274\221\275\216\372\365\342\251\342\241\217\231") -TOPIC_TEXT( -"\346\345\260\311\201\301\216\232\366\235\361\361\330\333\326\215\307\220\306\347\224\340\361\315\350\240\325\367\330\305\343\342\264\377\311\221\213\262\306\243\221\266\235\221\212\347\257\376\365\364\212\306\201\232\237\377\341\305\230\342\354\270\220\375\203\255\347\326\217\273\200\367\312\245\237\242\363\364\301\346\374\361\333\364\317\267\256\315\330\241\236\243\262\316\371\251\341\252\245\333\244\242\374\322\214\226\360\221\236\307\252\215\233\264\366\220\213\240\313\371\222\344\222\330\244\271\372\213\213\223\246\367\372\313\322\316\305\342\261\325\275\327\234\353\203\307\300\341\252\236\313\311\235\303\365\212\264\343\247\363\266\370\320\204\343\313\334\236\305\252\334\230\221\327\240\341\261\326\244\246\231\331\374\273\260\254\234\224\227\221\242\352\330\326\256\274\311\362\300\224\301\374\326\243\244\264\340\244\210\325\370\274\336\253\264\370\272\216\340\363\303\370\314\300\225\201\215\231\364\324\232\370\253\244\270\272\241\341\303\324\220\377\217\313\312\271\303\317\242\235\350\317\315\370\272\353\274\361\305\330\355\345\251\217\353\211\317\243\245\241\356\261\323\363\233\376\376\277\376\307\277\375\237\266\373\303\367\336\273\374\244\360\237\346\351\355\272\267\274\267\343\276\324\306\307\206\343\300\272\270\331\347\217\374\251\332\255\342\326\221\222\317\212\237\373\207\240\216\226\264\234\245\216\232\357\203\225\301\337\214\253\313\246\206\233\246\263\273\271\237\231\241\352\346\250\356\252\231\351\343\340\341\325\200\256\243\307\360\376\304\266\270\336\365\263\241\352\370\337\216\255\214\361\353\277\305\362\317\235\255\367\361\322\367\266\316\252\302\355\336") -TOPIC_TEXT( -"\326\273\217\214\317\325\225\345\303\211\206\214\340\235\242\254\307\307\311\253\274\244\277\333\215\312\315\245\345\357\364\347\203\226\235\341\204\254\254\207\221\226\333\321\343\272\325\350\202\314\313\337\327\375\372\317\373\367\353\226\325\365\313\203\247\260\221\262\225\206\200\206\341\301\253\216\300\270\235\263\340\325\301\353\221\276\215\353\354\250\323\333\263\373\267\376\205\255\300\252\316\341\352\236\275\303\317\222\253\313\220\340\276\256\361\245\267\312\236\343\334\221\365\267\254\205\347\361\264\310\246\221\340\276\340\275\334\375\261\202\267\216\240\311\237\350\335\255\255\353\201\307\322\344\306\202\377\316\236\317\225\217\311\345\305\306\237\300\302\361\366\330\344\301\223\264\376\350\356\314\355\350\361\337\252\333\237\272\301\373\301\303\275\335\271\255\354\307\357\336\365\307\336\277\367\335\354\203\201\237\303\236\355\304\333\304\370\314\344\204\250\334\240\276\335\310\207\270\351\222\331\253\247\336\251\322\344\352\325\354\206\324\327\341\201\340\326\235\241\212\276\274\304\362\216\302\224\243\215\261\352\335\201\206\373\301\353\300\350\314\305\343\372\212\232\251\352\245\212\235\222\307\230\341\377\306\361\271\304\277\273\260\240\327\256\202\307\242\272\356\317\266\276\241\364\251\302\233\233\335\201\262\321\360\327\230\261\257\234\344\311\233\224\222\274\306\325\352\375\371\253\304\275\253\304\210\365\302\361\252\203\217\213\247\323\373\260\304\317\224\317\204\232\240\215\303\363\301\240\356\211\320\265\341\201\227\352\247\230\241\377\270\262\206\263\317\223\310\367\203\357\270\362\234\315\344\302\237\363\204\331\352\343\217\322\301\310\375\275\355") -TOPIC_TEXT( -"\235\255\375\367\341\232\367\370\300\376\317\317\366\356\332\365\370\337\267\276\372\272\333\230\207\354\260\254\266\267\235\300\243\236\256\200\223\363\331\357\374\307\374\334\204\357\374\254\257\366\307\355\232\213\346\367\271\323\221\326\340\257\236\375\375\351\251\341\357\325\357\261\220\222\232\324\354\247\304\302\321\207\376\243\335\254\272\262\354\360\261\241\365\225\213\274\337\363\235\217\377\210\246\201\333\365\254\274\200\363\201\335\277\243\252\302\253\206\242\360\254\335\343\213\227\243\336\237\213\217\237\226\214\315\262\306\236\370\257\254\225\212\320\272\375\325\246\327\203\214\310\334\201\275\351\272\200\243\242\244\300\370\207\341\272\366\201\230\336\207\362\260\371\212\343\315\257\250\237\337\346\217\227\347\231\260\342\314\301\272\354\260\331\330\370\210\325\271\311\262\304\234\341\261\275\370\326\340\233\245\353\305\315\355\346\336\360\261\227\263\362\370\241\217\211\331\343\232\277\312\236\237\227\345\213\312\265\345\325\214\276\236\210\207\361\301\343\247\365\301\350\365\272\227\221\337\345\244\322\244\210\341\330\221\247\241\240\371\371\321\357\325\310\242\263\213\257\320\325\335\216\236\236\271\344\363\276\363\231\227\211\235\320\343\230\220\237\364\346\346\225\371\320\333\317\303\214\362\255\237\260\377\327\355\234\262\213\227\343\346\365\323\354\247\203\250\343\376\227\233\306\235\210\342\270\247\230\330\324\343\353\361\223\310\331\365\215\354\305\301\306\351\222\357\357\254\332\314\334\310\274\334\225\225\332\354\261\237\321\370\377\302\320\315\353\201\307\322\315\306\347\250\252\243\236\333\231\203\253\242\302\343\232\345\253\340\343\264\371\370") -TOPIC_TEXT( -"\214\213\252\214\257\241\357\222\253\361\226\257\233\356\330\346\203\303\237\307\360\314\374\322\372\306\327\374\350\364\243\311\352\244\206\267\206\207\210\357\226\234\260\272\323\267\363\372\321\267\361\367\207\271\277\346\344\314\273\370\224\265\324\264\216\312\330\251\220\314\304\270\375\345\255\254\230\222\344\343\236\270\266\313\255\356\261\265\335\264\245\335\343\342\361\336\356\227\272\271\207\217\327\335\252\256\311\275\370\201\277\256\277\234\370\361\334\311\355\355\352\234\376\257\216\356\331\361\256\377\301\210\213\302\262\353\306\377\203\260\372\317\222\342\212\302\344\356\354\250\203\230\363\355\235\206\227\242\237\360\343\325\316\355\325\217\231\305\223\346\316\247\200\232\217\226\236\340\220\363\376\372\244\322\265\304\376\341\245\227\212\360\226\274\304\363\353\275\370\326\323\303\204\207\236\351\370\347\213\213\256\274\352\252\230\275\332\266\217\227\362\343\307\301\243\234\334\236\353\245\364\330\304\265\306\367\372\313\263\320\233\321\211\360\330\236\222\243\343\243\211\232\246\363\342\314\222\214\366\345\300\256\311\304\265\343\241\340\230\315\355\352\273\255\263\315\331\245\276\264\214\277\341\377\212\370\321\350\345\231\320\345\257\222\363\224\370\361\331\250\345\326\322\301\264\301\307\363\210\242\240\212\316\347\216\323\325\355\333\233\333\361\356\367\370\274\351\222\232\231\273\350\323\272\333\233\320\234\225\346\335\357\263\251\220\257\305\367\310\275\333\300\257\357\261\362\207\361\264\215\220\301\342\232\342\212\366\264\326\370\243\343\314\340\346\277\255\343\367\314\323\330\265\204\231\243\330\210\271\206\210\246\311\274\201\261\330\371\307\341") -TOPIC_TEXT( -"\260\316\235\252\356\271\233\361\330\324\343\353\215\320\317\231\246\250\362\301\255\352\376\204\372\350\215\256\321\322\276\362\355\370\341\314\277\372\260\355\312\373\270\310\221\371\265\216\252\243\336\236\253\345\346\305\367\221\234\374\274\266\353\234\350\375\277\224\361\312\221\214\345\214\311\262\367\322\202\327\371\334\216\336\245\240\210\370\331\312\211\203\253\306\247\246\306\246\343\307\207\351\332\360\305\316\264\235\331\305\347\277\222\337\355\227\226\247\335\210\331\274\233\344\372\272\315\210\213\253\254\254\371\374\372\317\375\220\337\362\263\211\377\235\221\271\254\214\261\205\235\276\366\217\367\270\247\250\362\354\337\367\364\225\351\365\352\307\342\305\323\230\230\350\310\356\354\271\276\373\364\310\241\303\207\314\315\231\216\354\273\333\272\336\365\201\203\373\347\247\274\367\317\310\301\363\306\350\201\251\364\355\307\217\350\215\222\310\374\246\205\313\370\234\314\262\326\202\245\320\340\265\367\372\326\307\212\307\311\363\334\255\337\333\322\334\352\223\307\224\365\233\223\325\334\352\321\341\274\240\360\372\312\343\207\234\304\267\225\355\254\255\216\355\330\327\331\233\326\260\276\347\253\312\362\372\321\220\253\230\357\334\372\262\226\360\207\272\320\254\215\277\361\212\314\247\272\262\236\254\310\245\370\337\235\366\305\320\226\241\300\307\251\202\216\221\203\253\322\215\327\217\265\360\343\267\232\342\325\216\246\252\356\327\312\267\237\372\254\322\216\333\271\235\337\342\220\243\300\343\340\264\236\321\276\321\345\257\305\341\271\270\364\301\343\270\206\375\337\336\373\244\375\330\225\214\303\375\230\224\201\311\237\273\241\323\337\226\307\244") -TOPIC_TEXT( -"\323\322\333\363\230\231\307\201\324\314\311\234\213\206\265\262\354\230\250\217\360\276\377\271\347\233\237\326\340\215\307\324\314\346\364\200\263\343\245\304\273\242\341\342\261\303\265\332\255\201\242\233\303\377\341\371\270\244\272\353\360\272\226\220\326\332\203\216\361\212\220\322\315\352\271\265\350\345\235\305\331\233\334\334\331\223\332\202\245\267\225\272\245\216\302\202\330\272\215\206\347\374\374\221\326\350\211\206\237\247\245\210\313\272\204\330\212\361\370\361\356\362\236\341\356\301\374\354\204\315\255\363\236\377\323\277\376\343\374\373\313\203\374\352\215\307\337\264\361\261\201\362\353\245\310\331\326\330\262\317\310\316\213\371\354\267\242\321\320\363\367\361\355\234\257\216\252\357\337\270\305\331\360\211\247\221\317\326\321\263\327\254\220\243\352\263\231\301\222\211\242\345\233\274\334\234\357\352\370\270\337\206\336\371\206\316\221\225\220\313\363\214\274\300\223\314\352\352\341\311\267\276\220\214\370\332\215\370\234\262\370\235\372\332\311\302\353\364\227\250\224\200\355\204\353\263\307\227\254\244\324\201\341\325\265\365\233\205\322\270\255\315\336\223\240\360\351\341\262\242\376\214\302\332\261\253\352\315\300\307\216\222\330\234\307\377\255\217\303\315\250\361\235\221\236\337\217\252\252\254\252\250\207\236\327\213\252\233\367\205\235\261\373\204\246\245\372\267\350\360\266\270\352\316\337\274\372\343\351\211\337\312\234\305\255\314\342\226\251\255\256\314\244\233\351\367\370\364\252\253\322\214\220\313\217\243\236\253\321\220\300\265\312\215\312\362\227\375\234\236\262\203\224\274\324\347\276\346\352\261\212\307\234\202\237\300\223\377\222\230") -TOPIC_TEXT( -"\201\211\347\226\220\257\306\310\233\227\234\311\237\222\251\247\356\314\345\362\251\216\241\374\352\365\365\200\226\234\372\355\371\327\366\225\217\310\300\277\366\320\212\337\226\254\304\201\341\242\311\214\372\264\360\323\335\327\340\270\216\240\214\207\331\247\377\217\235\312\322\353\321\310\205\257\320\355\217\217\313\303\371\335\343\372\217\325\241\257\251\247\375\366\332\357\212\264\347\303\222\375\303\362\347\245\223\277\246\203\231\237\332\340\355\241\207\312\252\226\221\372\303\261\377\212\342\361\247\344\313\352\312\262\267\364\274\330\305\236\235\357\336\252\251\226\211\274\252\307\363\350\257\200\217\200\335\272\370\211\316\314\321\337\323\207\340\263\232\204\356\234\335\200\325\246\347\305\321\367\252\231\323\247\343\227\212\235\300\311\327\352\202\306\227\307\256\254\234\255\215\346\245\303\307\201\344\365\236\315\243\242\315\313\363\317\327\326\222\360\355\341\313\260\210\267\375\303\316\327\226\236\206\334\213\247\375\276\361\365\372\342\357\244\251\276\356\322\321\371\367\265\321\303\240\314\202\323\323\371\245\227\257\314\330\275\324\313\236\267\347\372\370\316\227\243\303\343\230\337\251\350\312\374\245\374\307\323\350\351\263\243\347\306\203\261\307\321\304\306\214\315\352\262\260\220\223\254\261\353\310\242\317\237\266\314\233\235\216\346\251\337\332\331\223\231\360\225\220\313\255\257\362\377\312\322\370\225\203\240\205\326\225\237\243\330\216\320\353\271\300\232\244\232\364\226\240\207\377\224\225\237\237\255\352\370\346\376\240\327\353\213\211\332\234\355\362\303\332\252\250\363\310\256\215\271\262\230\264\347\354\274\364\303\346\264\303\221\301\203") -TOPIC_TEXT( -"\201\361\260\252\242\347\307\327\361\333\243\241\202\367\274\334\200\347\303\230\204\207\323\241\231\246\202\315\207\341\376\240\264\246\300\342\275\270\307\260\303\221\371\237\342\244\206\254\220\363\226\244\371\200\247\301\336\226\231\335\343\321\256\360\351\202\303\311\366\242\353\236\201\311\264\252\236\373\377\307\251\336\304\251\357\213\250\337\311\253\341\356\227\227\266\366\323\372\276\370\361\350\357\207\373\277\260\270\374\350\233\216\200\224\222\234\324\254\374\276\377\250\342\260\200\266\271\273\377\370\304\361\320\215\245\340\351\274\255\365\256\376\345\371\226\243\203\324\342\204\244\230\300\235\260\351\357\353\356\252\277\351\222\212\317\332\346\326\204\331\373\334\206\221\360\374\234\357\324\366\323\306\324\303\233\263\303\270\272\275\226\307\237\333\210\273\322\205\200\256\235\340\330\252\256\203\315\315\353\367\217\372\256\273\210\303\337\305\251\351\316\313\273\346\376\240\303\227\225\371\306\307\307\361\212\262\345\272\361\311\244\226\221\347\222\307\360\331\360\206\320\362\262\205\250\326\257\343\357\351\221\210\302\236\356\335\341\276\331\325\331\301\321\343\315\217\276\372\210\253\321\327\375\200\361\326\316\226\234\202\272\230\213\350\307\321\360\214\363\244\256\243\267\336\347\315\316\222\230\230\210\310\200\331\374\356\251\337\361\324\332\215\251\256\213\251\247\342\261\340\264\342\272\364\265\243\257\322\350\243\207\262\252\364\375\223\204\343\261\247\266\205\244\226\253\343\365\226\213\311\235\353\236\202\236\224\311\226\350\204\270\261\365\266\273\211\227\230\214\217\325\366\241\350\354\234\320\367\275\267\365\303\214\253\246\237\226\361\247\274") -TOPIC_TEXT( -"\354\324\375\231\340\332\235\244\332\311\305\200\226\204\343\302\237\253\320\370\353\277\311\202\336\226\236\324\225\262\255\360\225\313\267\312\243\275\224\272\307\307\356\216\357\377\366\306\331\344\372\370\304\276\231\301\276\316\240\365\302\216\325\330\363\366\356\243\357\332\271\323\224\201\335\375\367\217\372\227\367\363\217\217\334\221\306\354\370\333\202\305\331\345\217\266\376\272\245\362\363\276\300\231\214\355\305\312\372\234\253\320\225\222\261\327\235\356\221\276\364\251\365\373\226\227\313\345\300\201\357\375\366\215\257\255\374\333\321\260\305\362\263\346\341\300\323\343\250\235\375\200\317\303\304\342\343\306\204\262\225\232\234\356\212\325\237\214\361\265\360\203\221\337\301\271\322\313\353\200\257\214\261\246\372\276\325\245\324\225\225\321\274\255\332\313\302\261\275\335\320\204\232\330\337\322\264\265\271\274\220\335\333\341\354\277\251\324\274\230\371\314\303\255\252\312\233\273\252\333\232\227\202\221\237\323\360\330\377\202\261\352\312\317\245\374\307\323\353\351\317\203\307\330\222\340\310\257\230\257\361\306\276\345\215\250\233\331\331\344\255\334\320\274\210\206\265\253\314\371\254\217\236\263\265\331\327\345\366\255\265\237\252\341\263\322\277\246\201\315\306\215\346\204\313\201\346\274\354\210\312\375\352\366\325\210\233\334\261\244\331\213\340\325\343\366\347\374\357\251\304\260\367\234\225\337\301\211\330\321\234\366\354\210\341\351\212\277\253\262\324\224\250\346\201\251\273\365\242\305\312\345\304\272\235\362\374\210\323\320\373\230\361\252\314\265\224\362\244\237\254\200\305\302\343\274\365\311\217\366\316\264\245\211\247\356\361\236\277\376") -TOPIC_TEXT( -"\252\205\356\327\354\333\273\247\367\330\227\347\370\351\344\376\361\325\341\367\270\322\223\302\356\253\264\375\273\254\204\334\331\243\231\277\206\231\316\204\223\345\235\262\373\303\324\370\212\260\313\360\342\334\300\261\345\317\230\377\262\373\354\221\225\334\361\303\300\367\223\343\215\335\345\330\230\307\304\225\265\200\365\255\256\277\377\241\350\303\257\254\355\333\253\253\313\242\240\360\235\273\331\334\262\365\273\306\307\206\300\366\216\247\363\313\217\320\325\306\334\214\214\211\273\321\205\330\310\262\233\246\350\270\341\261\254\350\246\252\245\303\231\223\310\344\252\314\311\253\247\270\236\224\374\366\221\317\260\212\276\222\333\230\251\325\255\225\371\270\252\316\216\313\341\247\246\205\256\311\310\272\314\220\265\314\317\307\362\303\351\313\305\347\224\361\205\332\325\335\336\212\312\302\216\224\217\361\261\240\201\321\224\243\315\271\246\250\263\275\362\266\261\323\337\235\316\350\300\310\350\324\327\372\250\204\327\220\217\223\307\217\205\300\241\341\306\343\363\276\317\265\206\307\254\267\241\364\206\305\326\342\223\343\376\351\206\305\240\224\301\224\366\307\205\264\375\300\372\324\247\247\315\276\306\241\275\300\277\266\277\344\271\310\266\311\366\203\363\274\351\311\266\224\312\255\262\322\270\271\267\304\347\275\346\303\243\202\204\234\231\232\223\236\304\304\360\262\314\347\374\310\277\235\325\202\221\336\362\337\375\233\266\311\260\364\210\303\230\351\314\243\243\316\262\206\326\201\201\375\326\330\206\325\267\244\310\253\245\304\354\250\333\315\354\370\311\246\255\244\316\210\226\307\257\352\256\312\363\364\311\212\337\372\335\345\312\346\345\246") -TOPIC_TEXT( -"\272\366\376\230\204\374\365\345\222\372\375\272\333\207\367\355\323\360\370\230\354\374\253\272\262\275\377\245\276\241\256\252\275\245\300\356\346\262\372\277\244\336\370\356\247\317\344\341\355\360\330\360\366\335\311\315\215\217\265\347\252\377\362\317\216\367\370\353\357\327\317\270\304\331\266\352\301\226\277\374\360\275\200\343\337\245\220\202\340\254\347\277\202\242\265\344\365\223\335\353\227\214\207\353\230\333\210\263\267\235\270\332\362\261\320\273\373\333\371\336\257\334\215\366\227\314\214\231\232\233\325\352\362\276\270\232\373\374\344\303\200\200\300\262\306\251\315\220\254\245\250\331\232\354\207\341\374\204\377\227\234\325\365\367\343\274\316\300\300\216\213\225\257\361\246\360\346\223\344\361\345\276\276\326\323\334\200\227\335\351\340\215\350\331\322\230\221\203\325\254\251\351\305\214\207\251\324\376\341\265\250\224\212\264\261\260\342\372\206\362\345\323\325\355\355\254\216\356\302\231\245\212\214\347\235\346\274\370\211\305\204\251\230\247\245\262\252\230\316\277\362\306\226\325\375\240\306\252\372\251\303\365\252\231\203\376\310\215\315\335\264\256\305\325\300\215\217\253\265\310\243\345\265\247\257\254\305\212\307\361\343\351\377\215\333\226\341\325\277\263\305\205\211\322\266\323\331\300\321\376\246\217\201\217\250\361\316\223\307\217\354\363\217\227\266\252\340\261\357\272\323\246\211\211\236\213\237\322\371\260\224\247\230\246\315\257\231\240\257\266\231\325\244\276\204\365\360\234\342\250\345\254\235\330\374\216\224\220\305\264\347\203\252\373\234\330\265\304\314\216\302\366\316\251\373\214\241\201\214\257\336\274\303\246\251\251\275\345\224\375") -TOPIC_TEXT( -"\220\231\242\300\260\236\337\273\206\347\222\242\202\344\206\267\320\330\305\217\353\300\343\323\352\274\333\362\301\250\207\216\332\307\324\306\210\217\245\261\321\324\361\366\330\207\326\346\307\262\227\322\352\221\243\300\270\267\243\216\263\312\365\224\307\277\375\315\255\345\272\307\367\357\307\336\311\317\271\326\372\361\221\202\226\334\361\352\304\356\374\373\313\303\203\261\376\321\315\301\266\330\364\370\257\336\216\307\214\361\213\264\251\236\256\366\251\244\370\332\351\326\261\251\236\345\262\260\213\247\241\231\241\226\214\247\320\342\334\224\245\271\214\255\313\271\242\245\277\333\215\206\255\267\222\251\214\222\215\274\362\360\341\203\254\255\316\201\230\305\357\324\364\374\240\323\312\377\313\372\303\366\263\306\353\244\206\266\320\335\324\360\272\277\210\354\362\242\332\202\331\237\217\277\307\212\311\301\313\301\236\372\317\356\335\305\337\355\300\341\201\221\321\310\366\211\277\265\360\225\373\337\326\267\320\222\373\232\273\232\266\366\375\223\205\260\307\326\246\344\206\325\370\212\331\361\365\373\322\224\232\327\232\320\352\271\370\365\374\321\342\201\211\227\374\240\205\227\310\311\374\211\353\376\207\254\245\376\237\254\316\315\342\251\260\240\363\322\360\265\235\277\221\367\243\343\324\332\352\257\350\301\225\252\240\204\267\347\320\303\235\375\347\332\275\333\267\353\252\256\203\243\345\270\274\324\311\325\212\267\320\246\236\211\350\244\231\316\316\216\246\203\356\333\276\330\303\275\323\325\376\201\350\243\303\374\336\257\261\253\210\234\244\315\341\255\375\254\231\255\312\310\253\326\264\334\305\223\270\241\335\206\324\320\246\217\314\233\321\270") -TOPIC_TEXT( -"\352\307\352\312\315\350\301\343\251\365\352\354\204\234\233\352\215\247\366\255\326\300\232\251\274\205\310\271\320\205\316\361\212\243\372\202\262\302\225\370\360\304\373\220\304\264\237\246\326\263\310\226\311\215\326\323\266\224\225\304\212\265\310\223\221\342\302\362\201\371\372\320\331\271\251\211\335\343\322\323\246\365\340\376\211\274\310\263\301\361\272\253\237\335\364\275\373\267\256\246\350\211\236\236\275\223\330\334\255\237\266\366\330\326\305\232\320\205\350\266\363\324\343\323\247\215\366\274\246\307\261\203\315\211\331\341\253\324\210\262\257\267\325\370\274\273\356\265\326\325\326\364\376\314\207\231\312\353\345\366\274\356\222\353\251\237\233\354\240\236\330\317\205\372\354\301\203\226\370\277\263\220\226\323\306\307\312\206\300\370\254\203\202\366\367\373\344\223\317\312\313\276\377\316\316\336\343\350\223\204\325\345\374\366\233\306\225\340\236\275\270\261\236\220\366\231\235\373\221\330\223\213\313\321\200\256\373\365\320\233\326\376\264\206\220\202\212\311\376\363\205\375\264\303\346\237\275\362\345\310\317\221\224\340\363\201\202\335\277\223\266\226\203\200\340\344\347\357\303\213\202\207\303\213\261\226\200\203\255\326\302\302\305\343\234\245\354\360\307\322\302\244\275\270\271\366\300\227\245\232\320\346\312\221\214\355\337\260\203\322\254\257\363\205\366\322\260\222\267\341\345\355\371\362\372\363\244\312\200\327\222\334\241\257\202\276\311\220\331\203\221\312\375\342\312\235\242\353\210\275\372\342\271\362\225\227\220\212\307\265\327\233\343\212\275\360\330\234\336\233\274\321\242\300\343\273\303\372\234\366\215\317\317\214\306\264\336\275\363\246") -TOPIC_TEXT( -"\257\277\223\257\373\264\356\204\213\305\362\237\236\273\363\346\245\210\271\251\220\263\331\336\352\222\327\302\247\377\300\375\230\337\202\251\225\215\275\311\223\322\210\313\207\313\303\322\240\252\370\236\247\256\353\215\334\313\375\236\367\336\244\322\363\356\323\210\307\265\241\225\373\202\257\261\334\255\324\202\345\232\217\360\223\204\313\232\241\362\214\226\372\324\246\210\212\362\274\245\344\357\210\372\367\205\377\217\263\254\232\247\206\345\200\210\225\350\244\341\312\247\270\224\267\330\272\303\204\225\225\351\212\340\354\322\351\305\275\235\272\255\363\213\330\300\365\277\256\311\331\373\252\365\346\371\331\323\203\275\254\344\362\326\267\221\312\320\223\244\256\274\252\261\251\330\253\275\212\340\345\314\311\361\260\224\252\267\262\266\310\372\270\376\222\276\377\353\302\201\231\306\246\206\217\343\347\254\231\367\377\361\334\331\316\326\246\231\311\311\321\255\270\202\370\334\261\334\360\347\344\240\225\206\332\274\236\236\357\365\240\303\234\315\250\273\331\316\226\226\350\310\217\243\336\361\370\332\257\336\326\334\330\320\347\306\327\310\265\205\377\273\377\337\207\336\231\315\242\354\364\235\243\263\205\253\307\206\343\354\310\327\312\263\215\340\254\237\336\331\241\241\306\252\250\244\252\376\325\332\246\352\221\337\203\217\242\365\316\273\236\230\253\354\353\254\275\324\264\353\325\347\316\237\245\266\315\211\232\343\305\357\254\331\320\337\306\327\301\351\374\300\262\375\376\316\264\311\300\373\252\256\377\205\311\303\241\203\243\350\246\244\367\317\315\215\251\207\360\255\242\274\346\277\200\306\341\330\270\315\247\217\374\235\334\375\227\300\366\370") -TOPIC_TEXT( -"\251\265\355\257\305\263\342\341\232\225\376\316\216\316\256\334\356\214\254\324\206\231\251\371\364\214\241\363\211\311\317\202\357\205\271\334\227\214\220\220\267\211\317\276\362\235\310\322\202\370\374\344\346\207\341\204\307\230\312\302\255\266\316\314\267\262\302\370\220\260\256\205\350\344\366\206\324\360\330\202\242\231\360\370\342\330\221\316\233\316\351\335\246\331\230\376\267\307\336\210\356\205\212\212\362\312\300\326\330\367\304\235\233\346\360\257\213\244\307\201\307\201\357\211\211\270\274\331\312\352\353\272\223\323\211\243\205\266\305\270\260\321\235\350\310\267\371\200\212\215\217\343\250\352\377\246\231\275\300\264\326\233\207\243\341\261\341\201\255\356\336\347\272\221\325\306\254\235\354\316\262\302\265\261\363\227\225\317\204\306\260\250\323\214\377\227\222\323\321\341\261\240\344\273\277\305\373\314\270\225\344\340\203\361\236\263\204\214\374\241\231\362\327\362\330\301\235\210\272\277\261\271\365\357\335\204\304\236\335\276\306\267\352\257\271\326\254\213\237\311\315\334\274\303\212\366\210\256\221\254\261\273\303\232\222\364\244\326\230\356\370\314\316\327\223\317\202\360\216\367\310\226\300\264\302\331\247\231\274\216\267\257\271\351\236\333\225\253\306\332\357\337\232\233\354\363\255\246\304\267\200\330\325\365\275\214\367\304\316\235\237\202\267\253\200\307\302\310\216\274\274\211\372\324\312\303\271\271\247\270\264\373\324\232\305\265\350\326\310\244\343\374\330\310\303\325\276\352\255\323\254\313\226\277\262\312\373\371\345\343\306\240\356\311\223\371\221\224\206\213\264\340\237\257\372\267\374\266\216\206\340\274\251\376\232\246\332\210\271\307") -TOPIC_TEXT( -"\277\324\204\343\255\250\353\201\224\327\205\313\355\253\345\304\300\216\226\252\337\336\354\354\210\377\266\231\314\215\203\252\305\341\353\256\201\207\332\262\366\330\300\351\263\254\244\253\253\265\210\357\306\311\275\374\251\342\376\320\275\215\335\257\221\326\244\237\344\274\261\341\365\255\304\313\335\223\275\251\340\332\274\337\332\203\324\234\245\332\224\246\375\313\306\310\301\244\346\337\251\340\347\330\254\213\232\251\246\264\234\265\376\316\340\244\324\313\235\231\316\303\232\267\254\274\314\215\320\361\332\231\376\265\267\204\323\350\374\320\372\361\342\231\266\361\266\356\372\336\350\240\251\275\272\202\367\356\337\304\235\242\365\252\356\326\325\272\316\322\373\316\365\361\322\314\242\300\203\343\370\272\233\317\336\357\316\206\236\305\275\320\210\221\265\217\225\245\323\350\251\256\341\357\250\314\271\200\207\305\347\343\304\311\326\304\201\307\374\374\254\320\271\252\342\261\246\232\351\312\273\335\255\242\361\315\220\337\365\212\366\332\316\265\342\201\307\314\347\240\302\266\232\354\255\247\362\277\332\324\357\261\263\371\376\344\377\243\322\253\272\251\211\306\220\343\352\235\263\340\201\317\246\316\206\232\360\237\261\243\333\230\310\206\310\217\302\205\337\244\335\360\230\214\255\325\302\217\245\244\242\333\212\342\211\345\320\347\340\372\374\326\201\337\373\331\254\325\370\214\317\210\322\242\337\265\274\326\312\376\272\373\373\306\340\250\304\335\375\221\351\202\221\200\210\264\315\314\225\206\372\224\321\327\261\340\217\327\214\331\251\230\326\336\366\365\316\347\335\277\361\214\257\320\244\364\364\265\274\346\365\305\353\315\202\360\301\343\243\324") -TOPIC_TEXT( -"\366\323\335\210\332\375\252\265\314\215\247\220\203\313\317\336\336\300\350\367\323\304\356\342\241\312\365\223\207\376\356\317\356\335\355\203\375\256\331\330\332\277\241\343\337\230\353\241\204\214\204\332\256\376\352\213\326\242\361\307\307\215\205\321\224\353\205\374\370\217\331\245\320\226\317\327\274\307\370\243\273\366\242\343\227\361\332\323\365\316\306\334\277\200\227\246\345\263\274\361\221\232\375\362\351\321\350\250\255\272\253\354\350\211\336\242\243\352\331\323\325\365\244\276\205\331\352\323\354\203\304\310\325\375\312\315\211\265\376\344\314\206\312\304\322\234\324\252\212\347\266\340\317\335\273\352\321\360\370\376\373\227\273\216\305\312\350\374\327\244\362\342\314\344\201\253\271\307\300\326\317\325\305\271\325\335\242\360\331\263\366\227\360\214\247\264\306\202\351\362\272\275\371\212\214\206\255\333\207\315\247\333\246\206\217\374\336\262\247\211\240\251\230\225\266\265\363\263\347\217\342\375\270\200\336\331\263\214\351\300\230\301\264\327\230\256\352\354\221\346\241\230\271\256\351\221\243\323\370\335\251\207\340\377\237\275\376\367\373\215\343\274\322\275\257\203\301\334\347\217\230\213\262\337\347\346\262\203\271\212\262\260\330\236\340\200\301\334\206\314\342\213\275\263\273\230\210\240\210\346\202\357\357\347\254\377\260\202\211\365\232\354\246\247\324\216\343\311\216\243\205\372\220\233\262\315\331\222\262\231\211\221\355\312\242\254\322\321\214\350\332\264\216\264\226\316\224\250\226\317\347\265\252\251\222\342\363\240\262\245\325\321\272\327\376\272\236\366\377\322\313\367\255\252\256\256\345\256\276\221\325\370\320\250\377\256\256\256\256\256") -TOPIC_TEXT( -"\256\256\277\372\325\252\265\236\225\221\265\217\203\367\300\314\250\333\306\263\263\226\235\351\324\355\356\221\274\361\230\327\312\274\376\223\244\336\353\221\206\321\254\270\225\362\232\332\356\220\321\311\340\316\221\233\232\225\343\234\263\262\371\323\361\230\314\311\216\352\335\250\246\211\317\341\254\315\244\221\271\263\201\313\355\262\357\274\266\357\214\376\261\252\314\370\254\336\272\265\237\352\367\274\262\265\203\254\223\316\371\225\312\207\240\275\314\324\253\250\271\342\277\334\200\314\350\260\322\316\322\227\274\217\250\201\372\254\364\333\305\332\361\210\326\307\204\262\321\336\333\341\247\316\363\323\246\217\323\370\213\257\270\233\225\205\217\211\232\213\270\213\213\276\243\307\277\373\327\363\365\343\307\377\270\334\313\377\274\335\205\346\220\201\262\363\234\230\312\340\364\252\320\347\256\240\234\350\316\254\230\230\336\377\375\327\252\233\216\323\277\374\345\257\315\200\266\353\256\371\301\363\361\246\346\363\235\265\344\313\371\203\327\313\312\223\376\371\247\322\375\256\366\265\247\332\225\251\375\225\316\217\364\350\351\334\376\371\361\253\206\372\272\335\373\277\373\255\263\213\335\274\315\332\234\205\371\323\301\346\255\343\315\336\255\201\326\376\217\372\340\355\264\265\234\266\313\243\346\353\201\251\270\341\251\216\215\366\251\353\250\246\334\233\214\217\337\314\230\220\260\324\241\323\335\310\302\354\230\234\234\202\214\307\267\265\257\277\313\241\367\376\350\221\315\375\256\230\264\210\344\200\277\212\321\322\321\364\314\324\241\260\276\372\240\317\266\364\374\311\331\270\330\220\206\377\264\243\203\302\262\235\275\335\207\360\224\230\312\247") -TOPIC_TEXT( -"\267\310\265\245\326\351\227\243\221\236\260\347\346\237\231\265\247\214\267\307\371\241\370\272\372\331\261\351\356\262\370\327\352\214\277\266\257\262\243\260\203\321\334\352\256\223\275\377\217\312\372\335\214\343\215\237\212\253\264\333\211\232\354\313\345\203\347\273\261\230\263\354\333\266\356\315\352\221\265\203\232\233\301\362\224\354\324\211\231\207\330\205\277\350\352\266\267\206\322\225\337\206\267\252\215\316\333\202\251\344\213\362\204\217\301\363\207\217\264\215\346\244\213\221\320\253\345\340\356\370\274\254\271\253\352\331\223\347\372\306\274\235\217\274\265\312\257\350\323\213\312\300\263\205\230\365\212\357\310\312\307\363\313\231\301\312\363\370\317\212\370\334\252\206\222\262\206\204\326\330\234\270\331\265\347\245\361\357\325\311\351\241\370\302\355\231\243\332\315\257\271\253\210\245\227\224\216\317\231\256\312\323\373\353\373\227\203\310\326\374\273\352\375\201\357\252\234\366\225\374\323\345\341\365\221\316\303\355\267\344\325\314\202\207\226\343\236\351\320\310\334\233\215\210\231\314\374\213\246\272\256\276\267\377\373\333\321\341\325\224\274\346\321\375\206\227\277\370\305\355\355\355\340\363\363\363\335\335\335\341\237\303\207\265\334\343\267\367\347\376\372\375\367\377\267\367\367\243\367\367\376\364\301\341\201\372\203\327\256\376\265\275\230\271\244\367\360\327\230\304\224\274\316\335\271\265\224\317\246\362\234\332\350\266\210\263\246\332\347\245\315\356\241\343\363\252\262\362\367\367\221\357\262\345\304\343\311\266\224\213\230\311\336\210\313\275\230\232\344\203\262\247\335\356\326\310\256\305\261\265\366\232\331\262\231\256\314\205\217\265") -TOPIC_TEXT( -"\346\371\347\335\327\276\356\271\361\331\317\373\357\275\203\263\335\345\360\233\257\347\313\305\211\326\345\357\220\214\217\235\254\363\376\343\203\246\360\352\240\335\341\325\256\256\331\234\200\344\235\356\353\277\220\326\365\274\235\347\202\222\233\216\234\326\210\327\330\226\345\235\272\336\232\332\230\336\234\233\324\303\235\307\214\303\342\302\307\246\356\342\311\216\256\364\251\326\347\330\245\321\254\317\375\261\276\374\272\366\225\254\360\373\310\201\230\302\277\217\336\372\223\302\361\204\273\236\226\306\347\356\274\330\201\266\256\255\335\331\373\365\342\227\245\213\257\307\226\342\305\312\207\311\246\261\303\241\311\216\216\233\207\366\321\357\267\335\327\217\302\334\350\270\253\361\346\315\331\266\335\325\276\317\270\304\313\357\214\366\202\344\340\307\273\227\302\215\207\346\236\240\356\335\312\204\334\372\375\313\217\274\376\232\214\272\262\300\363\212\307\361\373\260\234\214\343\335\344\226\352\373\272\234\202\226\363\353\265\367\262\217\362\227\250\216\274\275\252\203\206\224\305\313\202\203\264\356\350\223\304\254\300\240\300\311\212\301\272\357\273\275\335\377\346\315\350\312\316\305\304\343\366\277\373\263\277\373\376\367\355\277\377\353\326\255\360\360\201\211\223\247\264\274\206\271\202\337\271\362\345\370\370\210\324\317\261\317\267\337\374\203\365\227\300\302\270\252\313\212\336\351\231\300\202\307\262\244\271\376\301\266\310\365\304\266\217\355\332\265\323\344\343\350\323\337\307\265\246\203\271\336\365\276\347\262\245\376\211\314\206\373\324\352\355\337\314\327\233\277\362\232\223\375\350\344\224\240\313\253\317\265\253\323\246\253\215\307\270\315") -TOPIC_TEXT( -"\307\307\202\356\234\356\275\321\367\340\235\357\233\257\277\316\300\261\337\326\307\333\211\302\224\230\323\377\320\373\277\304\252\371\310\204\343\221\221\317\242\360\215\244\205\325\330\366\365\370\321\266\342\275\271\265\270\373\306\252\355\221\273\257\376\265\323\232\213\273\275\312\270\252\331\340\261\233\245\261\221\260\214\374\212\360\230\341\272\233\210\313\322\255\371\324\303\351\243\374\320\330\210\316\356\346\225\352\210\276\227\256\350\302\212\247\215\200\262\257\245\334\247\253\272\312\321\314\346\254\361\372\352\224\330\334\325\315\373\336\227\303\275\235\215\365\247\365\327\256\234\345\326\275\210\320\331\315\271\257\205\331\260\312\210\316\322\270\265\301\341\313\346\321\363\321\360\217\346\263\263\321\212\363\336\311\205\230\366\305\226\343\247\272\306\372\301\311\352\366\361\350\300\276\214\201\354\333\314\225\270\254\241\337\352\317\373\317\231\211\243\206\203\207\352\353\302\217\313\206\274\232\257\264\266\336\352\223\251\354\273\341\363\245\223\335\271\362\371\327\336\203\314\323\260\354\320\244\222\343\263\343\363\300\262\357\357\214\336\226\217\346\253\270\346\240\353\337\265\216\214\357\307\350\231\340\210\236\261\316\362\221\254\230\337\302\243\350\246\317\227\207\271\305\235\276\240\361\373\236\247\254\336\312\246\313\314\317\203\274\360\347\250\334\334\314\310\222\270\356\255\373\333\272\370\256\372\203\265\233\317\271\216\353\314\275\341\270\374\325\304\274\376\363\376\277\377\363\277\373\273\277\361\273\357\217\357\275\365\226\277\206\307\377\372\257\377\372\353\374\370\361\274\364\352\324\277\251\206\206\206\312\312\312\371\315\313\320\202\264") -TOPIC_TEXT( -"\373\323\337\203\340\361\232\246\335\240\376\270\273\352\374\362\205\363\371\216\370\374\244\261\301\304\264\343\260\230\343\260\310\274\346\201\341\273\350\247\240\300\303\303\225\313\235\330\231\240\322\346\305\353\277\337\327\371\246\243\377\325\366\332\270\230\234\310\331\371\306\313\273\367\201\354\350\353\355\211\220\345\212\345\320\330\236\222\225\254\226\245\327\250\302\261\374\204\244\241\343\363\366\337\373\305\340\315\365\225\370\336\354\221\350\227\223\223\303\267\343\361\261\311\311\362\265\257\364\261\263\236\224\354\311\273\272\215\246\254\275\274\270\303\327\334\363\261\362\220\303\351\332\375\334\365\311\273\347\365\312\367\243\313\322\226\274\225\330\277\207\361\271\243\337\364\241\345\201\326\366\371\367\332\254\213\246\205\253\321\333\267\302\357\370\312\377\362\376\240\323\361\250\376\234\317\330\223\344\370\323\323\346\222\354\321\350\255\221\305\343\236\327\245\334\321\211\354\245\261\202\277\254\256\331\330\371\210\325\274\330\265\365\377\221\323\372\363\227\260\256\312\371\211\331\202\253\344\374\376\336\265\205\345\252\241\273\311\247\355\313\374\334\214\237\250\236\331\313\346\325\344\264\351\222\362\327\327\242\210\204\344\241\204\253\254\234\261\302\206\207\372\361\226\310\245\246\205\336\214\343\312\376\274\340\303\242\225\306\205\306\343\265\370\330\312\216\202\207\345\333\340\361\353\257\275\206\364\354\205\203\377\325\337\375\225\325\226\373\274\351\323\246\314\203\200\227\260\217\336\275\375\353\372\264\264\322\342\376\374\245\317\376\366\263\311\364\345\276\222\257\220\233\332\264\213\310\213\354\271\361\231\303\301\303\203\375\275\252\230") -TOPIC_TEXT( -"\367\307\262\272\307\307\207\233\217\267\337\371\307\343\224\226\222\222\200\203\251\267\250\271\245\253\313\245\262\242\227\222\330\215\203\326\326\226\210\353\310\244\301\316\252\367\302\225\330\232\310\371\224\330\224\326\327\230\275\213\204\217\333\225\206\216\265\317\275\237\361\365\361\354\341\265\232\213\317\373\273\257\300\353\273\217\303\325\264\300\321\321\242\327\270\214\260\316\270\314\303\351\314\303\332\204\272\274\262\324\366\331\343\345\277\350\371\262\236\216\254\371\270\312\267\274\227\242\244\374\307\313\321\372\340\235\204\220\375\201\212\301\372\350\225\273\321\324\253\337\334\307\255\316\350\315\252\273\361\312\365\207\354\333\202\377\247\360\240\300\241\336\256\235\266\303\224\243\350\236\353\345\302\225\266\231\221\252\264\376\265\275\330\371\315\321\252\342\231\235\250\230\246\277\307\203\352\377\227\340\316\332\240\270\341\364\254\367\275\216\376\216\362\203\307\330\216\341\355\222\301\374\327\357\245\374\322\321\371\330\223\372\321\211\221\251\317\302\277\205\253\367\236\372\372\373\345\254\335\300\352\216\242\257\333\244\340\334\324\340\274\276\326\370\312\251\204\275\207\370\374\361\233\342\305\237\375\350\307\375\230\375\375\277\370\301\217\264\326\274\376\247\377\372\247\314\376\360\341\302\205\327\354\341\277\351\323\247\225\225\225\322\213\313\306\271\325\304\337\313\321\251\233\355\327\232\366\341\237\351\361\343\307\231\335\200\364\230\326\361\230\264\234\264\230\233\341\344\207\307\271\213\261\347\331\374\250\226\277\355\247\333\266\252\267\377\222\213\260\222\277\317\205\251\374\221\377\276\362\221\306\206\320\373\352\254\263\360\311\332") -TOPIC_TEXT( -"\333\243\221\301\322\262\333\264\340\224\306\263\312\370\223\260\370\305\363\236\277\314\263\223\346\241\253\234\331\274\313\363\220\332\254\211\251\225\325\322\327\344\375\312\363\243\203\302\312\366\341\337\233\264\210\371\320\354\351\215\322\336\242\255\300\272\322\367\254\265\245\241\327\356\334\327\314\365\221\302\355\374\303\263\260\345\326\323\221\226\256\222\322\373\322\321\254\226\370\344\376\257\373\247\334\261\266\207\372\313\371\344\375\346\210\253\277\370\254\236\236\337\370\324\372\261\310\234\252\343\375\272\210\207\350\366\253\331\221\231\312\345\245\357\275\220\351\273\337\241\271\256\343\365\365\240\333\257\355\263\262\257\255\244\342\310\237\336\373\250\353\257\327\270\221\250\354\256\240\254\351\237\234\312\341\261\334\320\271\271\366\336\307\244\214\262\325\201\361\370\376\366\323\262\266\346\257\216\266\226\375\235\373\354\323\271\342\347\276\277\377\371\312\312\212\234\357\352\275\361\330\354\332\225\325\230\315\205\250\301\255\340\235\322\342\341\361\360\300\367\351\233\235\242\306\232\262\302\303\316\254\207\214\234\256\256\347\254\334\235\277\247\207\245\337\371\251\305\304\204\311\260\211\354\223\304\357\232\354\352\335\351\212\201\211\214\203\213\260\353\272\373\364\342\221\365\221\210\230\341\374\330\312\233\215\322\222\233\361\222\357\201\313\253\373\236\257\361\370\247\331\200\257\375\313\356\270\314\230\345\362\312\236\276\370\306\230\271\266\267\234\233\236\255\217\326\372\204\245\253\275\243\227\200\201\215\326\243\247\354\334\251\376\370\254\303\325\367\376\371\313\207\217\234\343\360\377\242\341\227\356\230\367\233\373\255\314\377\245\345") -TOPIC_TEXT( -"\342\242\254\343\345\203\307\205\270\251\346\374\242\243\327\374\330\200\301\342\370\204\352\342\312\303\265\351\330\341\317\202\336\370\243\214\325\363\333\253\307\214\323\352\323\375\307\213\216\306\240\224\330\275\212\340\346\333\367\330\302\311\325\307\247\301\327\251\311\221\330\377\200\367\267\231\242\257\330\244\334\325\340\340\274\356\353\351\356\274\263\330\241\305\271\264\243\272\376\363\217\265\227\206\206\206\372\316\235\272\365\342\332\256\262\333\216\370\334\261\266\351\325\227\345\307\325\222\366\213\334\330\255\353\230\205\266\216\312\375\331\302\301\343\223\211\314\203\324\330\231\232\276\366\270\267\330\224\263\213\363\221\322\256\366\270\221\323\305\207\330\306\272\257\246\273\344\212\362\227\245\264\213\326\316\277\366\262\302\304\211\316\303\231\354\261\321\212\362\350\374\210\216\245\223\267\371\306\311\270\267\307\374\252\243\245\245\240\374\307\201\276\276\243\354\352\326\302\347\326\222\305\332\245\255\260\224\240\217\336\271\313\374\216\312\262\367\322\202\365\227\305\264\367\224\357\342\310\362\341\276\234\355\244\255\252\216\274\265\326\226\277\260\253\333\211\235\336\275\363\376\263\362\225\327\304\355\322\215\305\270\352\256\272\252\231\252\234\340\277\325\257\326\223\217\363\200\232\267\256\301\371\270\376\302\203\332\275\210\223\227\222\311\346\333\226\346\247\313\244\316\335\310\320\255\353\305\337\213\266\353\336\314\302\207\236\267\323\324\224\315\205\260\307\264\225\375\305\242\345\256\302\367\342\361\310\300\317\261\306\332\317\345\314\364\267\377\373\375\267\276\243\307\377\376\357\357\377\336\321\321\361\376\374\354\371\322\223\243\315") -TOPIC_TEXT( -"\204\225\310\266\233\264\233\366\221\217\253\361\351\332\342\261\327\212\270\243\346\347\220\211\223\377\304\331\221\250\257\233\340\365\357\374\331\323\207\216\326\201\224\335\203\233\316\270\241\361\356\252\203\302\216\225\203\212\302\303\314\256\216\360\242\226\352\230\257\244\264\210\257\252\300\370\254\204\253\370\314\256\227\346\300\205\260\311\323\234\271\201\270\256\336\217\370\205\245\361\226\274\335\263\234\327\204\277\272\367\250\334\340\351\254\256\374\353\246\306\217\265\330\320\201\354\220\313\327\202\365\307\225\351\276\357\334\333\330\337\314\267\366\342\364\262\246\245\371\223\317\371\314\321\305\237\352\345\217\370\225\213\274\342\265\253\226\367\233\343\232\352\220\345\207\270\325\313\224\234\274\325\216\217\264\323\355\345\241\221\377\227\315\213\307\325\264\206\346\372\303\321\365\317\315\205\221\350\327\321\261\375\230\233\241\343\375\361\206\267\233\227\222\241\344\326\215\332\306\312\253\272\342\303\225\330\377\230\334\301\337\277\367\332\354\353\306\205\304\343\203\306\372\372\260\252\306\222\273\263\267\322\221\223\273\367\277\373\372\372\232\233\233\217\363\333\203\226\275\376\375\357\354\377\377\340\300\201\276\204\276\371\206\206\206\350\355\226\214\340\330\271\277\274\267\273\217\251\205\216\307\307\327\373\324\306\273\342\261\264\355\333\247\266\214\337\350\370\240\233\320\357\207\217\263\227\270\205\354\353\351\323\211\234\323\211\367\211\350\253\311\305\257\375\232\234\260\215\344\306\207\225\304\246\326\354\370\242\326\271\377\367\331\263\247\364\353\360\305\216\236\233\370\254\263\343\342\234\315\200\232\273\274\260\321\200\310\376\262\242") -TOPIC_TEXT( -"\257\201\353\234\263\341\244\204\361\330\303\255\305\341\326\265\372\222\355\247\232\340\325\374\210\336\365\271\270\365\267\234\216\231\213\257\252\275\227\265\371\367\200\360\253\361\211\236\203\232\372\231\351\245\342\276\350\324\320\226\323\366\370\271\266\324\365\236\352\345\217\346\225\243\326\307\336\257\377\251\336\210\216\356\303\213\351\216\334\254\272\355\326\336\325\352\362\324\360\351\347\212\346\244\257\277\204\342\374\307\353\300\334\236\235\372\311\363\340\215\365\307\376\225\235\220\233\256\357\217\304\270\255\337\342\332\216\256\255\244\372\207\307\372\372\327\271\357\301\304\371\336\353\306\376\205\300\343\231\311\261\372\217\332\332\266\226\346\210\317\370\343\327\257\267\265\266\244\304\354\237\356\256\245\222\323\311\243\243\203\375\375\275\275\360\275\335\232\236\357\255\251\373\356\350\270\213\227\240\261\217\321\241\205\271\231\232\276\215\360\224\254\271\300\340\351\235\322\260\253\361\360\237\323\304\356\343\266\332\333\333\260\345\353\352\206\225\224\363\347\307\223\331\340\361\342\246\216\270\265\207\206\263\252\216\375\352\272\360\336\362\360\367\221\305\357\205\360\341\363\304\342\266\303\357\375\360\347\366\327\227\362\207\304\264\354\315\314\353\217\314\315\217\202\344\374\317\264\307\265\326\226\201\245\250\246\256\245\254\364\233\354\226\255\367\330\221\217\231\344\263\343\314\342\374\201\363\273\244\273\236\262\361\222\243\336\244\374\325\232\242\261\324\326\277\232\321\343\344\252\205\305\271\300\232\275\200\250\332\267\362\231\333\301\213\345\321\362\367\216\303\352\346\317\247\360\321\351\252\361\245\357\277\270\276\265\243\317\343\266") -TOPIC_TEXT( -"\303\344\313\354\340\326\342\322\263\276\303\210\224\342\316\356\271\341\265\261\307\323\237\263\374\241\240\317\370\254\215\212\327\234\302\211\323\256\272\322\230\313\224\264\263\376\331\330\342\333\245\232\217\272\255\231\207\315\341\365\264\201\216\224\257\211\250\365\226\330\306\327\223\266\375\323\314\201\316\252\250\312\243\243\357\236\210\231\214\332\370\254\274\276\325\363\311\372\323\273\226\251\265\231\245\314\355\330\237\212\276\326\221\302\354\322\341\242\307\240\344\275\270\325\373\200\311\375\335\335\367\215\365\365\314\372\235\273\274\275\201\340\234\235\276\311\352\351\311\225\373\277\256\216\312\335\273\244\257\256\257\336\353\366\363\301\303\203\335\322\276\305\372\334\231\315\300\313\202\255\247\302\213\235\247\375\231\343\261\326\265\262\362\267\314\310\230\370\232\373\325\235\320\252\272\225\223\211\253\354\310\256\236\371\215\222\353\315\302\254\310\362\236\241\301\312\222\262\372\363\245\323\336\330\254\332\272\245\314\346\255\365\264\336\225\317\325\315\271\242\223\325\202\344\341\332\322\374\243\217\345\325\253\235\205\203\262\351\220\256\254\305\326\325\325\246\224\327\200\331\345\223\366\346\256\321\203\245\260\310\332\313\362\324\371\275\310\373\230\362\231\250\233\221\375\325\362\324\303\347\351\221\266\272\222\314\333\321\301\215\263\363\256\206\237\337\302\364\237\246\341\353\342\241\352\204\373\356\261\362\274\256\255\265\217\346\341\263\236\365\217\321\346\237\364\223\313\207\302\306\300\263\327\225\212\307\314\351\341\202\362\256\201\226\317\231\331\313\361\302\207\374\315\271\257\301\220\237\310\375\352\226\277\220\257\217\315\274\337\307") -TOPIC_TEXT( -"\217\236\203\344\357\233\235\351\354\230\364\235\271\247\236\311\311\306\256\276\337\256\206\317\325\244\302\333\246\336\304\265\337\224\374\367\377\223\311\333\203\237\372\336\373\310\245\326\330\370\310\371\355\312\236\364\356\360\366\304\204\307\371\225\343\275\311\203\374\233\206\307\252\244\236\212\203\307\251\210\361\313\306\263\303\310\220\323\254\200\315\307\302\277\216\370\374\375\241\332\305\371\365\351\301\327\334\235\275\330\362\213\323\233\367\211\307\340\344\240\257\346\314\326\301\315\315\276\367\335\256\204\213\232\245\371\304\343\272\206\212\367\356\330\301\330\235\261\343\203\343\300\202\343\223\263\302\216\247\323\375\237\377\327\264\265\266\200\355\363\206\367\256\244\234\301\216\312\334\314\273\324\230\250\362\213\332\215\262\243\236\354\252\217\252\236\256\370\355\311\212\311\340\262\341\317\326\200\320\245\373\317\374\364\344\361\235\213\341\256\313\312\377\350\216\361\233\267\374\355\330\271\231\275\257\260\240\335\306\345\234\326\260\242\373\370\344\370\235\236\307\271\352\227\265\375\217\260\343\235\325\260\257\266\202\332\331\326\220\317\351\265\253\333\340\212\317\263\376\205\240\232\333\225\266\212\341\372\220\355\243\324\225\261\315\233\260\246\305\322\226\307\364\321\260\357\275\376\227\321\252\332\317\236\303\316\365\347\376\205\307\230\242\216\304\230\254\215\204\255\333\233\237\245\335\367\347\366\211\240\276\265\313\237\230\317\273\226\304\340\217\274\337\220\335\205\343\327\350\340\246\353\251\321\357\356\216\236\270\374\215\371\322\266\237\205\214\226\260\302\266\355\314\242\342\243\214\212\270\344\275\231\325\302\226\276\325\363\211\246") -TOPIC_TEXT( -"\224\246\370\372\214\216\217\356\362\347\354\325\346\361\362\272\273\261\202\222\251\260\370\214\244\206\346\233\317\317\316\262\200\314\314\254\213\206\216\357\317\215\220\323\332\362\205\361\330\336\344\205\236\373\211\240\343\264\365\276\270\233\342\343\251\370\363\253\300\332\376\212\211\307\370\375\275\335\343\243\203\354\376\250\207\223\310\300\371\377\322\341\342\253\246\212\236\216\200\375\237\212\245\312\214\244\345\256\372\363\247\344\357\346\235\343\315\205\254\260\363\343\342\343\237\376\213\356\231\245\231\240\334\225\226\260\234\363\316\227\352\351\357\355\271\361\345\231\375\262\376\265\325\346\235\373\361\325\273\357\354\275\241\335\372\342\265\323\327\316\300\277\366\230\236\327\245\317\371\375\265\333\346\341\252\347\327\362\205\363\334\207\324\320\362\262\355\275\333\260\255\227\204\321\213\263\361\217\266\346\220\333\201\351\337\313\360\253\316\333\215\313\327\225\352\242\252\317\202\304\321\205\217\231\320\313\227\324\346\230\327\236\242\262\214\257\321\350\315\354\220\241\343\317\212\323\317\306\261\326\355\315\233\312\264\271\225\260\254\331\312\367\345\243\245\373\331\306\215\205\361\366\357\340\252\226\310\225\215\246\300\214\327\366\371\230\274\362\320\376\303\321\232\217\337\305\200\343\260\237\236\320\261\335\242\254\314\230\351\224\231\224\205\341\317\355\350\341\241\222\262\302\356\234\355\277\235\230\210\253\214\236\343\303\243\274\357\316\253\264\326\266\370\263\246\304\241\343\365\246\237\370\206\254\231\272\201\244\274\234\275\273\372\371\302\331\257\344\357\372\342\334\264\317\347\212\257\201\336\353\263\276\232\243\231\237\277\373\272\341") -TOPIC_TEXT( -"\217\277\336\343\350\370\223\303\333\216\360\264\266\270\366\221\356\355\373\276\256\232\273\355\373\270\375\306\221\217\211\304\252\202\216\321\261\370\260\261\312\334\210\340\244\326\345\326\307\306\260\205\336\254\357\312\263\362\217\337\262\341\307\322\262\237\261\230\230\200\314\252\332\333\250\327\323\335\325\375\355\227\253\374\201\326\226\337\255\273\235\260\227\304\233\230\236\241\320\340\313\246\206\357\312\263\336\353\236\364\222\306\206\274\366\362\251\243\250\333\315\247\313\354\253\217\257\320\274\353\266\375\324\215\246\351\323\352\273\354\227\351\330\330\230\214\320\271\332\351\274\306\323\332\223\342\261\204\322\354\221\336\312\370\341\205\346\351\363\272\216\352\344\245\232\255\274\375\313\372\304\373\375\231\275\246\224\245\265\336\250\346\244\346\344\233\312\374\245\211\303\364\315\265\346\272\270\307\337\266\262\227\323\375\255\271\252\326\377\361\274\370\274\264\224\370\204\346\245\231\352\347\371\377\314\231\243\203\375\275\323\223\244\343\217\356\375\206\235\274\247\326\204\303\205\337\305\365\212\315\306\226\231\322\207\241\332\213\344\333\360\350\247\357\334\267\254\345\216\307\324\337\247\310\270\211\377\321\364\330\351\304\274\223\331\254\216\333\363\220\204\274\364\353\332\370\370\364\317\201\330\270\351\372\243\376\244\321\334\331\202\252\253\221\275\210\327\372\331\246\332\213\231\345\313\321\205\343\363\372\223\317\274\366\357\346\240\272\267\273\271\262\320\263\262\276\232\252\315\212\217\215\343\316\317\316\236\353\374\224\323\275\244\231\303\226\271\335\236\374\217\211\307\332\313\335\311\235\227\222\267\247\262\236\330\216\372\342\233\210") -TOPIC_TEXT( -"\336\333\351\267\357\205\212\273\342\261\337\304\223\311\374\200\325\314\275\354\213\217\323\250\226\321\252\332\205\335\341\375\330\234\377\345\210\307\230\270\230\230\241\200\202\257\326\310\217\351\227\231\374\311\204\374\204\372\263\237\337\347\377\266\222\252\361\234\374\272\242\277\357\223\217\307\217\254\265\251\204\370\370\227\341\273\271\260\225\201\341\367\340\276\373\205\326\355\377\311\301\331\251\341\214\211\311\334\311\203\217\201\324\222\267\267\320\256\264\357\226\312\213\261\366\364\363\364\262\247\342\343\263\342\227\346\245\233\372\276\220\324\335\252\311\274\300\327\311\376\240\220\254\221\203\230\254\353\231\276\214\352\235\343\211\272\360\265\373\266\313\236\220\231\230\357\340\225\322\300\272\370\306\341\340\225\375\274\223\307\301\244\363\322\346\246\266\244\257\273\341\347\367\300\221\220\337\341\320\301\255\272\220\227\254\225\356\305\273\242\203\201\357\255\273\355\236\264\200\361\355\304\230\210\241\271\200\370\374\356\360\304\305\262\234\360\370\372\346\252\254\314\303\334\332\205\243\333\242\337\305\310\345\255\377\370\370\274\267\263\346\207\220\245\260\224\216\300\370\246\255\225\376\347\231\332\232\275\251\226\314\234\366\372\261\272\247\230\235\331\347\364\370\275\367\367\374\377\361\352\304\324\204\327\350\215\254\374\234\224\345\341\220\364\200\324\366\314\272\326\313\213\362\304\251\252\274\247\237\344\212\246\203\377\237\364\276\340\317\377\376\360\335\327\367\336\373\355\326\260\256\233\376\267\305\360\261\277\221\304\371\211\360\375\330\226\346\247\252\222\323\243\340\256\237\226\324\223\336\213\262\332\330\320\321\311\274\307\211\351") -TOPIC_TEXT( -"\201\352\373\304\234\315\300\217\316\253\215\226\361\303\335\262\362\203\364\336\364\351\322\275\322\375\216\362\312\340\256\234\220\205\250\327\231\376\330\270\251\244\246\327\250\356\207\225\351\236\344\223\352\243\207\225\217\261\200\315\270\321\314\211\330\304\355\306\320\255\264\334\221\366\375\202\331\341\261\245\244\332\241\252\357\264\375\230\264\245\307\373\307\343\222\261\233\361\223\243\275\325\373\356\257\337\357\301\301\344\213\323\233\233\201\217\267\225\375\375\202\210\241\207\265\236\217\303\377\212\216\314\272\310\352\326\262\346\362\336\307\355\366\361\355\330\276\300\304\303\352\215\312\212\357\217\353\316\327\207\303\343\357\336\370\245\262\350\334\326\210\360\272\326\216\324\351\266\232\225\215\302\307\353\322\276\323\361\230\367\203\351\243\304\327\302\237\207\217\356\343\344\333\321\303\225\236\351\326\356\232\257\343\251\224\362\200\314\270\347\257\300\215\365\365\227\301\316\376\305\310\346\305\236\260\250\276\276\370\351\353\263\351\237\234\276\270\357\357\207\273\220\226\373\274\373\255\335\314\237\326\375\236\257\341\236\253\214\321\343\340\223\250\330\372\255\312\313\205\257\307\207\302\251\201\366\307\336\365\304\342\343\200\256\220\227\247\225\372\253\227\272\260\264\341\201\232\356\340\256\320\227\316\356\232\370\204\200\314\253\216\357\367\225\273\231\313\214\231\263\210\305\342\217\267\330\266\364\234\336\310\304\251\331\333\303\353\340\344\334\332\226\353\356\344\212\306\212\354\200\251\201\342\320\351\355\247\240\244\326\247\354\253\376\357\230\347\315\276\374\336\210\367\230\323\372\354\272\362\350\275\237\346\257\204\353\366\261\304\273") -TOPIC_TEXT( -"\273\206\305\212\231\236\345\260\326\355\336\213\251\272\346\202\376\311\311\256\370\344\352\205\337\305\370\323\362\265\203\275\274\350\315\260\214\263\205\324\315\245\363\347\372\340\206\316\314\365\265\301\362\370\306\323\207\301\321\303\343\331\261\316\340\372\222\263\224\235\236\343\362\236\312\207\256\207\367\276\343\232\266\326\231\356\373\371\303\343\357\321\360\315\270\317\350\245\204\205\226\316\216\345\232\255\251\364\251\217\237\267\352\366\346\342\314\277\363\305\365\211\203\213\301\210\371\341\376\262\374\262\275\316\237\264\242\274\213\262\270\222\211\224\300\276\223\361\330\373\206\255\276\235\247\347\331\304\314\234\220\214\224\326\344\233\274\320\351\303\304\375\235\306\343\327\257\313\362\316\205\371\246\306\207\372\256\373\272\272\256\336\204\264\330\274\206\233\267\265\266\363\242\245\314\263\273\223\367\250\365\315\203\221\356\337\276\225\320\367\222\373\342\233\366\377\227\356\267\346\274\204\366\274\252\202\233\227\347\246\307\307\372\207\205\343\335\360\330\314\363\210\300\272\343\342\215\353\306\327\272\257\375\215\215\365\202\366\246\370\365\346\254\330\332\356\266\346\373\240\225\365\224\257\257\316\350\345\302\364\334\211\216\334\266\330\261\271\246\242\227\264\212\312\305\343\310\220\235\235\261\264\274\256\214\320\232\202\260\267\201\376\374\342\206\207\245\236\313\234\330\323\232\317\343\252\244\341\236\243\371\274\274\264\362\357\376\265\250\316\250\254\324\345\336\361\233\320\372\200\323\244\275\375\231\347\344\206\345\306\345\346\233\271\245\231\346\225\227\247\232\331\302\306\302\260\343\261\351\343\372\206\363\215\364\271\305\363\341\220") -TOPIC_TEXT( -"\340\260\263\326\227\315\346\320\374\231\307\264\276\226\230\251\345\207\213\267\244\375\274\202\317\222\313\217\253\277\334\322\212\231\332\321\331\212\377\227\202\340\376\261\225\221\220\325\230\352\237\372\306\343\203\255\335\332\377\305\226\251\214\351\307\365\321\227\277\204\230\313\262\361\246\324\233\341\300\373\223\207\264\266\267\337\270\230\214\372\213\267\345\323\332\317\334\242\226\231\324\221\302\227\317\274\257\306\231\216\347\276\300\217\365\303\375\230\202\302\221\354\236\304\274\312\346\277\274\277\304\276\371\362\210\224\372\342\365\350\347\344\341\200\361\371\373\263\247\301\247\203\375\253\322\351\311\311\367\347\212\325\367\330\315\247\363\205\352\347\243\206\323\331\333\353\213\271\340\317\374\374\330\313\264\220\350\350\366\345\345\356\263\311\211\235\243\236\233\202\336\202\211\217\355\307\210\324\334\227\216\317\375\364\203\310\252\264\250\302\373\201\242\210\266\233\256\210\231\246\262\213\263\361\262\253\355\245\253\216\262\264\336\303\233\277\235\212\321\320\362\321\226\304\255\326\262\314\351\352\364\264\274\345\343\313\361\320\211\331\313\243\245\317\207\225\211\307\225\312\377\261\212\313\211\300\266\253\375\373\231\265\271\245\352\210\237\250\274\377\247\367\302\310\361\202\236\352\345\376\262\366\337\203\253\304\262\304\316\373\300\325\257\225\346\267\246\335\242\352\232\213\361\351\247\246\326\210\251\312\233\263\256\314\266\303\375\306\242\301\342\212\346\223\307\320\203\361\367\361\274\331\353\361\306\357\306\307\372\213\225\276\326\331\212\307\256\234\376\211\345\220\350\223\360\373\302\306\306\273\342\303\270\335\344\203\342\335\272\246") -TOPIC_TEXT( -"\273\275\256\221\220\354\226\356\241\232\322\337\254\357\274\256\316\347\334\241\373\253\265\353\253\217\215\204\212\225\215\323\272\361\234\321\245\344\275\247\316\363\261\272\233\241\223\217\331\227\374\276\322\350\222\242\274\330\207\370\371\323\375\307\257\367\224\226\377\225\242\345\311\276\201\361\330\302\325\230\201\233\271\203\355\370\337\226\361\275\215\300\233\330\230\206\205\322\234\375\203\372\265\313\333\322\312\271\306\215\365\365\252\227\301\342\330\275\361\363\350\346\377\326\370\364\344\330\324\304\372\250\245\305\217\367\355\375\373\260\363\362\207\274\352\201\367\307\370\240\212\305\317\355\243\215\327\337\327\355\215\305\357\202\307\222\223\254\263\245\246\222\225\215\316\237\315\265\302\277\360\231\362\201\336\202\376\327\225\206\302\276\342\234\240\300\232\311\244\340\342\256\275\261\320\263\226\225\334\316\346\211\331\321\261\330\353\266\333\246\276\305\226\240\231\336\345\332\230\357\350\333\341\220\203\217\355\337\232\236\263\341\330\300\334\216\314\230\260\215\306\341\263\212\236\273\336\357\347\224\221\270\373\270\306\374\215\361\323\322\326\300\365\263\277\240\277\201\352\223\300\327\231\305\200\241\305\272\313\211\312\371\312\267\322\260\301\226\361\203\307\261\333\360\277\252\243\352\372\310\337\217\361\341\315\350\234\234\272\265\263\253\351\272\261\340\242\334\254\361\306\223\331\376\303\333\347\265\275\257\345\351\327\345\235\351\356\353\275\362\365\271\336\215\267\252\374\355\333\252\337\316\261\271\250\200\236\233\361\306\222\220\257\330\221\372\224\335\351\316\324\316\336\367\362\252\243\272\220\365\357\376\225\221\321\217\231\354\207\345") -TOPIC_TEXT( -"\272\263\343\261\343\342\355\302\206\204\245\215\345\242\243\241\337\316\331\244\322\331\212\276\251\326\203\245\244\323\236\333\242\376\236\364\262\243\350\253\224\251\366\317\362\237\334\241\362\217\331\240\254\313\351\301\260\300\266\274\272\342\213\346\341\224\203\303\320\361\333\313\363\352\364\374\355\344\366\260\277\347\210\326\374\204\220\234\237\237\357\244\364\246\322\237\355\271\216\362\361\234\274\372\347\376\265\332\215\217\201\261\237\234\201\336\242\376\356\356\314\213\221\212\236\237\235\244\365\206\204\321\231\217\374\251\227\274\334\336\336\234\311\326\300\230\267\262\326\266\321\220\252\250\304\311\237\345\275\361\225\217\325\351\256\353\330\332\246\335\215\350\370\221\342\350\370\353\333\227\370\271\340\261\317\236\316\367\223\206\307\244\336\374\337\202\216\271\307\322\316\332\372\377\356\261\316\255\371\353\300\241\330\230\261\245\246\224\216\314\357\342\212\205\331\332\364\331\212\376\202\274\362\312\354\245\253\276\244\364\254\361\227\323\341\201\356\261\304\333\257\232\237\242\301\313\321\327\377\314\277\262\305\343\370\344\365\244\307\221\324\303\351\230\225\331\277\327\333\322\242\301\344\373\343\321\317\371\371\226\252\307\324\235\207\262\265\227\207\341\201\366\246\337\354\354\227\253\246\345\214\244\317\367\260\241\344\272\327\250\237\225\360\251\224\311\227\230\336\370\234\245\354\347\332\263\215\305\212\337\245\310\371\323\200\274\373\266\224\273\343\234\250\325\367\332\223\312\300\305\365\265\303\265\235\227\273\352\353\366\371\232\216\222\300\343\271\333\326\223\216\316\225\304\343\377\323\276\307\222\272\306\243\306\305\375\244\251\256\255") -TOPIC_TEXT( -"\314\343\332\374\201\365\340\323\334\360\260\330\355\206\301\371\364\256\370\340\245\224\315\262\304\236\237\313\262\353\233\270\311\331\310\332\245\370\234\312\270\261\352\371\230\304\215\221\261\275\205\345\354\344\314\232\355\325\344\270\231\336\272\266\313\313\231\321\215\243\251\370\236\313\272\376\210\345\347\301\266\253\257\276\307\226\321\316\332\262\305\234\253\324\271\253\224\347\316\212\314\220\343\232\346\241\376\354\272\215\250\255\226\275\357\225\276\271\220\323\224\276\304\224\304\377\242\307\200\300\356\377\312\347\236\337\372\302\246\241\213\256\356\275\261\315\357\357\277\367\216\332\312\312\377\377\313\302\354\315\242\257\217\244\267\316\237\275\255\301\215\203\335\273\266\372\337\340\337\372\354\366\245\245\334\342\237\351\360\315\270\326\213\322\261\233\301\373\313\337\310\370\231\321\317\371\371\226\233\236\314\273\366\342\226\204\211\240\242\362\300\317\364\242\344\317\305\257\375\264\260\277\231\345\313\304\206\256\361\363\353\276\320\361\260\212\235\257\373\205\237\202\307\214\370\261\310\307\212\312\201\230\252\205\241\377\357\274\347\303\346\223\237\233\274\370\234\212\357\261\332\212\315\344\370\323\346\303\207\353\254\350\325\341\230\337\241\212\371\353\226\312\364\230\201\301\372\354\373\353\250\235\346\332\247\323\246\262\222\275\246\317\260\227\266\251\241\323\217\331\275\226\271\203\265\326\321\313\355\232\326\210\245\333\260\372\320\276\207\255\245\324\226\317\211\370\352\346\353\341\314\327\244\323\276\350\377\242\257\342\370\327\371\276\347\235\213\317\252\236\257\346\344\276\375\346\321\262\366\377\335\201\212\243\221\226\222\332\241\244") -TOPIC_TEXT( -"\367\255\260\233\257\212\270\340\353\370\230\257\334\254\365\312\253\202\365\351\250\242\324\266\367\334\205\313\313\300\343\361\365\353\270\272\362\370\215\331\213\335\324\337\320\372\370\214\343\227\365\224\343\244\312\217\335\347\375\304\231\337\317\231\302\214\242\236\313\233\233\316\307\374\211\356\217\245\236\370\214\374\235\305\232\346\230\376\341\246\236\327\340\242\322\243\372\221\343\204\274\246\345\242\200\234\276\210\371\334\340\211\310\355\244\254\334\211\341\205\213\253\217\243\320\361\272\327\250\370\244\354\251\245\371\254\234\317\221\271\310\255\245\330\305\232\203\217\235\227\273\264\274\316\236\301\254\213\357\261\231\275\233\366\360\275\336\271\343\207\314\273\303\231\255\300\300\340\206\340\340\304\314\274\243\252\352\207\306\343\323\213\302\255\332\343\232\246\302\225\224\362\311\253\333\225\327\227\264\260\340\345\220\270\254\274\346\332\337\202\212\301\363\341\303\232\340\226\364\315\277\325\343\253\236\270\275\336\232\231\325\203\313\263\254\237\304\317\326\371\363\306\313\354\236\275\332\232\370\260\275\376\376\340\337\347\243\322\355\253\253\221\327\361\261\211\247\327\374\226\335\243\352\273\251\270\357\361\205\231\364\272\313\226\346\304\233\331\205\340\356\356\374\224\263\333\345\326\307\372\201\360\310\255\250\273\330\321\344\341\215\230\330\300\270\256\251\256\356\322\225\372\274\213\204\252\354\273\227\236\347\241\303\272\317\274\331\366\231\267\326\220\217\274\332\207\364\322\213\277\200\226\222\231\263\257\312\277\330\214\377\337\202\341\356\276\221\361\270\334\240\331\373\326\205\310\371\267\366\242\344\353\375\243\356\305\337\244\353\306") -TOPIC_TEXT( -"\252\231\367\333\251\236\317\242\320\361\250\306\320\250\306\356\346\220\220\237\313\321\242\310\207\340\311\314\275\252\325\231\304\301\362\343\273\264\357\354\312\245\357\363\215\237\324\237\330\367\336\221\244\341\361\357\376\273\335\263\372\317\357\371\222\346\212\361\214\236\237\277\373\332\363\362\353\360\256\250\251\256\224\362\354\223\207\315\316\373\351\331\321\206\306\343\263\330\221\315\347\376\251\273\302\260\246\243\202\235\240\330\235\307\355\246\345\216\204\270\342\222\274\362\351\230\306\326\275\326\316\272\353\233\363\363\211\202\213\307\331\232\336\226\306\352\267\365\272\372\213\202\215\223\223\255\337\361\354\266\262\225\242\317\335\227\236\236\310\320\257\352\302\274\320\334\262\304\361\370\363\260\235\205\265\201\316\230\341\225\205\231\211\267\241\224\332\310\311\210\221\241\250\225\363\366\342\264\254\241\255\367\220\237\306\246\245\254\311\326\360\345\264\370\255\200\334\264\353\304\324\345\314\226\243\220\274\270\267\311\247\307\276\274\342\317\333\364\351\247\376\373\253\366\324\326\354\355\263\274\274\207\307\225\272\203\336\333\316\264\265\232\370\354\301\365\267\337\373\263\245\363\350\272\344\273\277\277\271\341\350\261\376\273\336\363\307\243\241\377\276\235\252\236\263\267\356\372\265\235\207\351\316\346\241\226\353\321\240\312\314\331\347\302\371\274\204\210\326\264\302\302\275\370\254\330\263\224\303\232\226\263\232\241\267\337\334\270\330\364\355\271\276\244\343\376\240\214\235\237\274\260\343\277\350\353\225\251\337\362\267\211\307\274\233\316\206\240\346\234\301\231\310\246\256\334\247\273\303\266\240\270\244\300\347\215\207\377\210\230") -TOPIC_TEXT( -"\226\320\363\261\354\327\363\263\223\203\235\375\275\364\216\260\317\314\375\323\240\344\201\276\330\215\217\256\313\220\226\334\201\266\214\276\363\272\225\257\341\236\353\307\314\212\351\242\315\374\232\272\267\256\322\374\304\217\374\254\211\214\307\266\237\233\336\326\346\346\367\256\253\303\301\225\340\260\266\323\200\356\376\222\264\332\323\355\203\337\312\376\373\355\320\227\313\366\203\360\370\343\373\220\257\334\377\232\315\262\223\232\265\266\375\337\331\266\206\267\205\221\360\231\334\202\233\357\334\376\261\212\233\233\277\232\374\227\372\332\221\354\337\276\265\275\377\355\344\354\255\241\304\364\224\210\266\257\231\270\323\312\320\216\207\271\317\266\266\324\264\346\365\241\204\366\305\371\343\217\233\335\346\340\256\265\367\340\261\232\307\315\230\263\307\333\336\222\343\241\344\211\211\210\256\336\305\335\207\206\313\360\345\207\342\217\301\302\326\324\343\374\234\227\210\263\273\304\371\261\202\227\330\360\373\207\215\251\311\275\261\253\223\227\257\374\375\316\372\334\333\205\335\357\367\357\376\213\206\361\351\313\243\312\255\271\313\315\341\332\354\332\313\305\301\347\272\350\267\240\324\321\275\376\332\346\347\304\334\375\311\241\361\314\343\355\265\374\221\203\324\337\304\340\353\200\215\344\203\367\202\225\241\277\361\325\336\232\244\347\302\231\226\305\221\312\302\201\327\336\203\222\256\213\331\237\347\222\274\362\324\235\227\273\264\342\270\344\346\235\357\377\362\370\261\321\327\254\322\276\345\223\371\217\375\236\223\373\273\273\340\350\231\232\237\233\354\274\313\330\341\350\210\204\362\356\227\353\351\302\243\360\370\241\334\261\245\322\242\307") -TOPIC_TEXT( -"\207\366\310\375\204\260\226\327\315\333\206\212\255\213\264\316\201\356\366\354\354\321\257\217\302\271\273\325\354\226\355\307\367\330\346\352\366\237\373\210\247\301\351\314\316\320\364\204\241\245\231\204\351\252\353\323\346\226\332\340\340\230\325\344\313\332\336\202\303\272\351\354\323\330\376\202\361\361\341\336\356\353\242\332\377\356\255\372\314\226\347\204\246\335\264\365\376\340\307\337\313\205\217\211\331\275\277\307\255\305\356\314\340\336\207\266\315\262\231\275\346\317\220\223\332\374\313\375\240\213\226\236\351\305\341\331\336\363\321\344\344\336\375\210\231\235\260\332\246\251\320\244\211\205\226\372\340\374\302\376\234\371\224\222\353\364\234\357\210\224\356\306\264\214\346\266\247\325\355\266\330\240\250\276\207\232\237\347\241\307\200\253\310\334\351\373\277\377\376\354\345\301\367\275\317\246\347\246\334\346\351\307\237\320\373\233\362\306\335\201\366\251\205\247\376\376\377\324\202\307\352\232\347\222\320\356\241\370\314\363\215\365\202\245\237\211\225\271\212\320\212\201\316\354\277\272\320\306\324\340\314\231\373\265\367\362\257\260\243\344\336\312\201\327\277\276\356\313\257\324\256\374\273\330\376\305\337\236\345\256\212\265\260\303\303\212\266\264\366\254\372\212\305\312\267\302\337\305\343\244\355\211\224\273\364\372\231\217\373\253\366\200\303\226\335\346\203\304\271\342\317\361\330\330\230\317\274\306\364\261\337\355\242\335\332\332\374\342\242\261\332\336\232\226\326\356\246\330\336\312\347\327\264\274\315\274\241\353\210\347\224\276\357\243\203\314\350\316\246\253\356\265\270\247\322\247\255\226\246\261\246\326\321\313\214\354\357\357\335\221") -TOPIC_TEXT( -"\347\332\265\236\317\203\231\336\346\256\244\354\341\336\235\220\251\321\276\334\365\244\223\221\215\311\356\227\362\373\256\254\277\372\201\356\273\333\333\316\374\346\320\232\356\350\245\207\224\235\212\370\375\313\332\363\260\375\203\205\246\363\222\275\346\303\341\234\324\375\350\327\327\333\266\357\277\315\216\313\200\261\336\253\235\335\355\263\351\262\256\224\350\345\356\226\222\321\344\352\374\322\355\267\360\357\323\274\341\250\306\325\264\223\247\267\202\211\375\317\344\372\367\204\204\351\350\215\310\337\311\205\327\261\370\265\345\304\205\262\343\376\374\252\213\341\207\362\271\352\244\303\267\305\366\314\227\356\274\252\277\242\214\366\363\201\377\301\355\317\203\220\275\310\326\306\333\245\232\225\217\331\226\313\213\264\210\326\360\204\333\276\236\370\232\234\365\323\363\226\333\222\357\265\243\365\204\252\232\272\346\324\257\315\323\255\374\372\306\267\236\275\300\302\276\325\353\363\311\306\260\212\311\253\203\264\254\373\372\235\307\305\370\371\233\304\341\342\361\310\264\300\217\273\310\223\220\317\224\236\353\362\244\344\265\370\352\274\320\227\223\332\274\337\351\375\366\347\343\247\365\230\247\342\206\307\231\303\307\222\265\275\204\263\341\346\276\236\217\327\325\300\253\240\341\223\343\322\374\264\262\336\230\275\300\351\272\327\204\213\340\226\341\257\300\375\214\227\233\227\260\247\352\200\331\360\330\217\200\233\217\217\364\303\246\241\245\327\235\330\273\371\263\237\220\342\230\226\230\254\266\344\324\261\343\370\276\305\216\206\347\322\373\330\322\254\251\351\366\237\202\351\354\205\303\234\356\360\320\313\217\377\374\343\232\354\361\270\271\232") -TOPIC_TEXT( -"\207\262\301\230\357\203\264\263\334\371\343\364\351\223\334\306\251\363\376\344\345\274\341\246\203\255\340\335\252\211\224\322\374\216\373\274\246\376\362\344\221\372\321\225\265\353\304\316\306\210\245\305\224\216\340\236\376\374\227\222\330\217\307\336\276\240\357\265\252\366\211\314\370\347\353\234\214\321\313\222\264\233\360\213\314\344\262\361\330\254\305\234\345\203\321\361\337\344\371\374\330\267\336\206\220\256\312\272\201\203\310\273\367\354\343\240\335\345\317\354\323\276\215\217\353\324\227\374\332\325\230\354\330\371\364\365\360\363\201\207\356\270\235\203\230\263\301\267\220\357\327\375\274\212\271\362\225\310\310\343\323\275\350\321\362\305\216\322\323\204\374\244\364\274\257\255\245\350\304\253\226\251\200\212\227\217\217\201\304\354\324\334\337\333\245\353\226\255\325\205\350\225\300\245\356\317\364\365\336\370\327\254\361\217\207\366\375\204\256\307\326\342\251\263\250\357\374\274\364\260\356\334\231\325\311\302\223\320\223\351\234\347\275\377\274\322\326\332\322\334\351\363\203\215\322\222\255\337\357\301\351\311\347\222\226\346\201\247\200\351\232\247\347\233\271\300\254\307\261\323\212\307\256\302\213\232\362\375\275\377\252\224\347\216\374\360\225\357\215\274\354\246\262\320\340\346\371\265\226\217\313\307\205\217\257\330\267\222\220\331\200\211\322\232\307\354\243\203\267\250\257\370\310\215\351\370\377\363\360\274\316\314\344\205\240\274\301\253\316\373\275\220\213\371\355\204\200\314\356\376\355\266\321\357\264\331\213\363\200\242\221\324\326\246\332\231\244\306\355\334\302\262\251\222\260\374\217\207\216\255\264\367\264\207\305\211\333\246\210\271") -TOPIC_TEXT( -"\355\222\361\300\253\202\361\336\320\343\273\314\366\354\362\324\214\263\304\363\376\306\241\265\357\333\365\302\310\305\343\214\363\353\306\360\320\254\221\345\266\366\226\352\344\210\232\374\327\351\271\226\267\210\360\353\233\263\341\250\206\262\204\351\313\270\373\271\200\255\271\220\210\373\351\304\343\276\325\372\251\267\331\247\355\236\211\337\352\327\327\313\254\264\355\333\266\251\302\331\326\352\250\242\273\334\277\214\362\330\245\265\324\224\357\300\260\367\376\337\254\334\207\222\257\256\345\321\372\231\315\311\321\232\205\265\303\307\254\321\346\305\306\321\210\370\350\214\236\346\350\230\204\334\233\326\322\234\340\220\216\236\374\236\235\352\355\353\351\302\201\243\343\255\236\265\361\363\256\350\373\366\255\354\371\272\336\272\270\351\365\327\377\355\326\277\315\330\324\325\207\357\255\237\277\370\367\232\247\365\202\237\371\336\260\313\261\255\243\200\274\216\354\212\234\377\257\251\231\270\226\307\341\246\354\211\240\307\256\336\376\277\363\257\377\346\337\345\217\334\222\352\361\264\266\226\217\362\310\243\344\323\340\344\225\222\253\261\375\223\323\243\246\234\345\276\321\332\275\200\250\303\251\210\242\220\205\367\317\201\350\313\374\252\261\345\316\303\241\277\206\247\352\345\222\317\331\236\274\252\356\257\343\245\301\223\362\211\335\330\261\272\277\235\230\371\352\246\363\206\276\320\363\341\203\373\352\323\345\255\375\271\352\226\201\247\272\270\203\344\354\242\233\217\354\311\362\205\254\277\233\354\372\330\206\265\242\312\242\332\257\210\206\307\204\336\246\317\211\230\263\270\372\253\352\267\210\227\260\305\303\343\216\252\304\327\373\340\261\367") -TOPIC_TEXT( -"\266\246\235\367\360\376\300\201\375\217\312\274\216\242\212\231\245\335\304\237\234\325\267\262\216\362\223\354\210\215\371\264\304\221\274\341\236\314\211\371\313\256\204\207\273\222\372\227\240\266\202\376\236\354\234\345\326\354\376\234\205\202\307\340\341\372\241\332\332\346\235\247\225\230\336\362\236\264\357\343\232\361\246\254\252\376\360\213\316\246\353\201\331\230\364\325\361\332\231\317\315\324\363\331\223\304\375\223\244\227\212\221\302\272\265\351\243\246\211\277\257\237\326\266\206\256\334\352\310\271\275\267\325\356\336\271\375\225\375\323\236\304\233\215\251\370\277\310\215\335\277\373\255\312\211\310\215\377\370\231\210\231\200\313\366\211\331\337\203\247\324\273\346\274\370\364\355\271\335\227\334\320\312\270\200\201\275\354\200\230\325\200\205\224\236\270\345\333\224\265\266\334\240\351\251\341\355\255\267\326\305\362\351\265\224\334\206\237\326\245\354\314\327\345\251\273\325\226\313\376\255\360\270\333\277\216\303\271\213\351\342\330\374\207\206\374\231\377\300\334\272\343\315\232\321\362\304\343\324\336\207\361\255\355\366\367\366\317\313\206\333\316\240\336\364\227\360\304\343\363\346\202\301\340\261\221\335\206\254\231\264\311\224\362\306\311\325\321\366\303\375\314\354\247\233\215\271\225\207\274\236\237\233\251\355\372\311\247\304\245\356\307\327\341\252\364\355\237\243\251\324\322\257\221\226\346\247\245\235\340\261\312\254\330\270\212\360\253\372\214\336\252\255\331\200\213\310\356\353\351\346\214\215\331\333\337\312\376\230\235\347\352\235\273\275\211\202\222\217\254\343\321\301\315\273\367\277\354\230\233\235\354\216\365\204\212\235\371\351\252") -TOPIC_TEXT( -"\255\202\331\271\235\372\357\207\246\255\246\325\276\361\362\306\273\335\374\323\346\227\220\365\232\204\350\234\237\237\316\210\306\315\230\247\276\377\377\275\367\360\263\365\201\255\354\306\347\265\220\266\316\345\243\273\354\360\314\334\345\334\270\376\345\327\373\256\235\302\310\354\327\200\374\251\356\204\334\327\323\225\310\255\236\323\314\272\340\301\326\243\253\242\330\377\250\225\233\222\317\347\270\277\254\257\355\335\335\236\223\262\311\242\315\377\264\311\265\370\314\302\246\327\243\243\352\356\255\240\250\237\331\216\257\366\331\203\322\373\304\223\216\345\335\354\342\376\316\240\255\340\222\241\310\316\254\344\370\346\334\363\334\276\252\214\370\325\200\355\255\204\311\206\356\255\303\232\241\221\337\323\256\223\324\221\325\316\246\327\216\344\341\242\244\262\347\340\375\201\332\244\204\362\323\210\375\242\347\260\310\357\256\254\316\315\332\312\240\355\210\216\326\272\376\254\344\313\346\356\261\263\215\255\363\264\221\240\270\231\237\305\367\204\215\300\370\214\277\322\247\273\357\254\236\244\353\216\306\354\301\337\304\336\252\214\324\355\305\371\212\327\372\371\233\330\223\263\226\365\305\252\374\251\351\256\225\235\243\355\240\342\206\222\365\203\331\270\374\212\213\217\317\264\265\306\335\256\336\236\237\235\354\254\217\257\207\360\324\373\376\211\343\343\370\234\260\377\363\361\245\243\240\344\303\207\353\244\204\364\374\274\351\363\333\353\302\313\322\366\324\226\302\316\231\252\254\353\337\307\265\246\355\271\315\234\374\313\377\211\277\307\252\244\365\303\272\317\262\302\366\310\271\306\351\236\256\333\365\365\327\377\215\313\210\214\354\333\267\324") -TOPIC_TEXT( -"\212\255\262\356\354\341\222\222\230\236\252\201\356\342\311\265\325\325\211\240\342\246\325\370\223\362\367\200\350\361\372\222\212\307\276\314\215\360\316\255\225\224\262\202\202\231\301\216\361\317\333\214\340\255\354\226\302\374\212\323\323\266\370\257\336\331\216\331\301\331\244\210\246\357\370\313\211\255\274\377\364\351\350\223\246\335\370\234\344\213\232\333\366\365\204\351\202\247\233\344\314\313\203\214\213\374\203\362\370\221\366\327\277\237\273\355\363\200\210\313\256\200\364\333\206\377\246\351\227\204\346\221\365\317\205\316\213\222\354\253\274\224\217\366\220\323\360\263\323\221\233\227\227\324\251\333\341\352\350\270\352\206\243\262\241\224\212\236\263\203\222\310\322\316\277\346\310\374\346\354\320\373\255\201\360\370\207\300\276\217\256\336\270\203\371\224\242\240\261\213\264\244\260\322\254\255\314\373\351\237\265\255\212\357\365\313\254\270\307\322\330\340\377\271\363\323\337\243\263\267\206\346\346\306\313\350\347\226\270\321\310\211\202\213\233\267\276\276\274\262\347\320\343\230\365\374\341\354\316\327\215\207\377\210\336\335\343\271\375\225\354\300\267\342\264\273\267\237\212\257\315\273\240\263\306\274\246\241\313\371\233\237\327\307\216\204\234\237\203\211\360\370\315\362\205\303\315\251\356\271\265\332\212\256\221\232\230\300\244\246\375\231\205\263\227\230\247\240\271\203\235\226\315\340\364\217\322\323\205\365\212\246\265\201\377\345\225\212\346\215\210\316\224\207\372\305\366\266\262\322\251\343\213\317\236\275\345\373\323\275\322\301\256\337\315\315\377\357\243\263\307\367\256\332\351\216\366\273\222\303\214\372\275\273\246\274\307\306\264\230") -TOPIC_TEXT( -"\301\261\206\207\242\321\242\236\241\366\375\250\341\337\220\273\313\363\353\346\247\303\204\360\211\355\205\263\321\210\366\357\302\326\372\265\330\266\361\300\343\244\211\235\215\373\245\347\244\252\363\320\363\220\350\366\350\331\360\356\246\230\343\337\366\223\356\343\354\241\310\335\255\274\233\204\353\307\365\347\323\303\275\307\207\332\233\212\276\372\225\221\212\246\320\360\230\350\241\304\216\240\355\255\315\314\236\277\316\250\254\360\370\352\372\352\212\370\374\273\267\336\267\224\320\361\247\207\267\204\370\310\217\326\325\326\332\222\254\373\346\205\221\357\254\353\225\335\324\347\201\217\235\323\221\213\333\333\333\252\276\370\361\237\311\224\236\331\305\216\361\227\241\273\367\354\310\270\201\251\361\375\241\370\314\302\316\376\367\235\255\222\303\356\357\274\224\252\315\204\247\371\223\314\254\360\256\315\333\337\370\242\236\213\304\322\303\201\222\251\262\332\356\255\243\236\330\263\261\300\334\203\211\325\327\264\203\300\364\332\276\340\253\221\350\350\245\233\325\201\312\247\212\322\243\227\314\342\214\364\355\331\235\364\370\335\231\337\330\337\317\232\342\246\224\356\341\337\326\217\302\340\260\343\307\227\301\265\326\200\325\373\352\352\262\331\266\261\355\301\325\263\343\307\253\215\370\373\202\203\260\267\260\346\374\365\207\266\210\261\217\343\310\337\254\342\266\354\245\314\376\234\200\226\213\276\362\221\265\374\313\375\375\325\320\261\272\324\323\362\246\350\253\227\225\251\340\312\221\217\273\257\326\366\304\307\206\331\274\232\301\231\225\276\217\227\201\360\371\370\367\357\355\374\257\377\245\372\251\271\350\361\366\325\307\234\270\263\312\263") -TOPIC_TEXT( -"\316\332\374\345\251\352\323\312\312\335\323\216\231\225\340\266\254\226\345\351\371\306\334\267\241\343\337\244\235\301\242\245\226\203\354\324\377\371\313\337\356\253\223\374\221\367\352\261\251\320\377\364\316\355\257\354\373\270\313\306\317\257\270\270\267\331\347\337\335\245\376\364\335\201\341\275\232\241\343\265\204\220\274\243\274\266\354\260\247\244\365\276\312\277\362\313\310\255\222\345\370\324\265\345\340\256\340\201\323\352\261\263\213\357\216\210\314\322\320\234\357\347\257\212\254\364\302\310\332\367\247\220\253\225\346\341\245\257\254\311\235\227\326\233\265\265\222\373\217\265\376\332\371\371\204\217\366\252\363\347\266\237\234\272\330\307\275\205\221\343\263\307\335\211\244\274\274\270\311\203\313\340\314\240\227\302\371\234\371\261\341\342\275\263\323\224\310\261\270\234\321\315\273\307\233\244\214\220\352\371\211\344\264\317\324\234\244\227\366\265\234\216\365\304\206\274\240\215\256\324\225\375\205\243\247\371\224\226\335\243\206\225\307\320\241\213\265\305\337\275\212\310\205\324\216\370\274\262\201\320\203\244\206\236\343\304\242\342\310\376\224\200\217\337\366\371\345\377\277\362\351\313\217\271\204\216\325\226\206\223\202\267\207\300\350\271\346\326\307\330\241\343\301\217\230\233\335\233\231\343\255\330\365\240\203\231\311\261\246\321\310\352\232\261\266\325\306\324\342\223\217\214\253\336\374\211\256\300\200\262\366\244\224\341\203\216\250\217\364\353\271\223\247\333\314\317\354\337\276\365\252\356\356\300\310\335\261\353\252\275\325\333\206\304\343\307\316\312\304\217\237\334\367\353\304\356\230\275\350\313\323\322\375\237\214\275\334\221\317\205") -TOPIC_TEXT( -"\260\224\221\245\306\257\224\341\210\366\315\362\330\352\220\262\272\322\334\312\274\376\362\324\361\357\250\233\303\254\274\265\335\351\230\360\301\327\334\202\334\277\316\370\314\313\231\310\271\312\234\347\333\234\242\257\347\244\263\237\322\356\215\210\327\261\277\364\207\216\272\242\257\336\331\244\302\252\367\344\212\260\326\361\354\352\345\234\331\366\376\326\355\351\274\330\341\347\372\330\221\214\204\307\377\362\230\257\257\215\365\375\317\234\341\360\201\305\201\302\307\232\303\300\300\346\267\220\210\314\375\354\277\263\302\261\243\264\371\246\354\273\270\225\246\260\255\265\361\316\315\266\265\330\347\215\311\247\322\251\266\277\320\202\260\276\377\366\364\266\351\237\276\371\263\377\260\277\342\307\252\257\301\262\330\260\304\232\241\323\201\333\232\304\200\370\223\362\201\372\363\224\302\321\322\344\334\222\337\245\254\221\271\343\226\346\313\362\344\314\331\271\367\307\272\226\246\363\234\246\234\370\243\274\241\245\347\235\236\271\247\351\324\341\327\234\232\275\260\324\243\326\322\314\273\312\366\342\256\376\367\235\255\275\261\216\321\267\333\302\352\225\201\306\210\361\234\250\251\275\212\207\300\267\366\315\332\331\376\325\213\243\312\270\252\227\213\305\214\376\322\356\331\354\272\322\221\211\313\313\217\223\266\371\256\321\342\361\306\324\216\370\217\334\337\335\305\354\275\220\247\362\231\266\326\271\305\344\270\324\200\274\376\277\333\377\204\260\261\366\277\331\354\302\207\303\212\200\332\312\274\372\375\270\222\237\234\234\235\272\355\230\274\367\327\217\307\276\367\377\370\316\305\321\370\370\227\270\324\370\340\204\355\221\206\234\355\225\262\346") -TOPIC_TEXT( -"\235\263\236\235\261\350\347\312\234\205\227\232\335\367\361\215\237\377\274\266\323\211\326\357\340\255\324\325\357\376\204\347\350\234\337\262\273\272\272\202\231\212\340\262\304\217\310\246\372\342\307\372\205\233\327\243\344\214\331\340\251\375\260\275\377\224\303\222\202\231\307\255\257\316\336\254\314\306\313\316\267\233\271\276\341\305\251\321\313\305\264\322\323\214\313\260\305\331\351\233\252\377\365\253\267\373\340\301\374\213\376\235\363\245\270\222\251\264\250\372\340\375\320\302\276\236\275\332\233\341\226\302\246\350\247\240\362\227\250\256\261\374\336\256\211\372\210\371\227\300\237\377\275\200\272\265\236\311\225\235\356\357\223\351\342\323\252\343\373\333\222\257\365\351\277\245\232\272\373\206\352\316\237\361\271\250\362\310\353\303\271\342\361\261\361\306\317\351\322\341\263\213\245\264\310\305\343\217\257\343\232\225\217\233\352\377\211\370\226\314\257\343\334\316\235\352\316\351\214\365\344\224\313\324\277\325\341\331\263\247\234\323\221\275\231\355\206\312\226\346\344\357\346\304\343\271\231\226\257\235\200\240\207\216\326\201\244\353\203\244\226\263\211\202\244\270\215\250\316\331\347\251\277\341\342\353\375\316\365\312\303\336\222\250\275\315\263\324\267\354\342\236\330\307\256\335\210\333\373\342\233\324\302\356\326\276\336\344\225\317\327\222\276\302\357\314\337\232\277\275\322\336\202\224\312\372\252\307\307\375\247\341\364\254\237\356\340\330\371\222\216\337\274\264\257\347\235\257\226\223\237\261\216\327\247\246\272\312\366\230\343\265\276\300\356\206\245\314\242\352\246\307\241\355\327\312\341\365\215\257\266\244\373\301\335\343\250\236\231\243") -TOPIC_TEXT( -"\200\306\266\240\336\214\327\202\230\341\311\370\346\274\362\211\251\200\354\206\246\346\344\374\335\321\236\263\361\340\321\343\265\301\377\266\371\244\333\357\210\377\201\202\331\356\271\371\373\320\212\345\343\317\257\375\244\213\250\364\333\324\244\365\246\334\231\360\370\344\240\207\235\300\334\360\376\311\266\213\364\200\275\350\261\361\270\372\303\255\266\201\356\316\277\227\335\276\340\370\374\374\234\213\304\343\237\263\307\313\326\323\221\253\330\355\303\252\366\260\317\236\342\274\372\346\245\351\255\365\263\217\245\236\276\270\277\372\226\263\332\276\347\215\221\314\203\341\351\362\241\221\207\305\273\343\251\314\301\307\361\335\246\340\362\373\367\227\223\366\336\301\320\363\210\364\322\202\263\367\273\345\212\315\235\240\226\371\327\352\355\361\302\351\203\342\346\320\333\353\213\256\370\300\362\314\242\250\254\334\347\215\345\230\211\260\201\357\353\274\203\343\261\275\231\204\235\254\225\337\201\220\253\376\351\365\253\240\215\220\362\273\351\357\354\275\335\372\302\317\332\205\213\215\336\245\230\341\263\247\373\201\240\271\350\353\273\222\255\330\363\225\243\227\202\326\301\264\277\273\211\266\265\336\333\265\207\217\343\243\317\375\334\213\352\216\354\301\336\323\336\263\230\235\232\306\213\257\200\307\240\257\376\224\215\242\257\256\247\244\326\354\370\344\330\215\202\231\351\371\206\326\254\313\256\277\370\234\237\225\346\345\250\214\276\255\371\363\363\263\255\227\372\212\263\276\236\233\304\207\332\356\316\330\351\256\240\254\250\346\315\351\333\265\240\324\203\277\311\215\347\372\361\224\340\214\205\353\227\236\363\323\247\350\341\273\312\227\243\270") -TOPIC_TEXT( -"\217\307\353\306\317\267\337\270\370\345\235\300\321\352\352\304\271\331\344\240\306\360\361\305\377\312\307\221\362\255\340\370\314\267\277\212\306\372\372\376\356\324\340\363\231\300\362\326\241\343\360\344\320\274\276\377\325\377\201\312\261\364\314\303\247\272\207\273\222\204\271\350\370\234\204\340\370\362\330\357\300\354\340\326\310\205\353\333\234\277\200\212\367\221\270\226\227\235\223\342\317\266\374\354\357\202\230\244\321\324\276\361\262\376\345\235\243\215\215\236\311\333\225\327\207\306\202\227\356\245\275\246\307\210\307\246\255\261\232\256\320\376\371\313\337\212\352\241\257\254\247\210\271\356\275\300\336\275\220\312\366\231\311\220\205\342\234\346\334\371\367\336\274\331\312\372\313\224\210\351\335\247\250\300\353\273\312\325\312\342\351\204\236\261\315\303\340\317\241\253\316\322\302\266\245\341\322\261\360\327\350\203\364\261\203\331\237\313\347\300\262\253\371\305\236\205\337\365\247\257\313\271\263\233\275\335\212\215\243\314\212\334\263\224\261\204\225\320\205\371\267\252\355\340\344\321\327\366\362\243\250\363\360\312\262\235\276\371\330\333\210\247\316\212\376\345\340\224\271\245\373\355\256\335\343\311\373\217\344\224\231\254\225\254\313\323\373\217\231\226\255\343\210\360\370\303\334\251\360\364\230\204\214\341\277\314\342\247\213\264\246\340\212\370\274\353\347\317\363\212\372\235\247\233\321\276\360\302\266\213\362\310\301\360\230\215\205\305\260\360\257\246\355\344\267\351\376\312\326\260\214\247\363\263\361\253\246\312\314\270\212\350\305\313\230\307\375\273\321\337\305\243\331\276\313\226\347\303\217\306\224\376\342\317\363\354\301\374\227\376") -TOPIC_TEXT( -"\260\371\371\213\241\337\271\324\261\357\233\343\232\355\333\266\205\310\244\255\316\332\375\275\366\325\275\376\210\333\355\320\301\272\315\265\367\255\243\200\222\270\361\214\232\236\217\210\243\300\214\343\334\216\365\366\337\267\312\343\302\243\203\267\360\324\343\332\265\353\247\253\222\274\222\210\331\216\203\222\366\230\254\217\254\301\314\212\271\345\202\337\246\370\214\362\200\225\255\224\313\215\236\344\210\365\232\337\373\205\366\234\257\316\366\355\316\326\225\307\303\335\331\261\250\211\311\370\273\363\326\337\340\366\335\206\357\306\340\243\354\213\254\354\272\214\360\265\224\375\243\343\330\377\304\261\333\224\326\321\230\201\336\370\331\357\236\217\274\267\314\212\233\343\304\252\255\346\357\345\264\213\351\364\274\304\223\271\203\317\255\273\205\222\234\306\260\263\234\257\351\235\214\317\252\216\360\370\303\251\214\260\236\263\213\264\306\350\321\354\306\317\244\377\212\200\335\307\273\337\370\376\233\277\374\371\275\227\263\306\375\273\257\213\202\265\226\355\372\252\365\377\227\301\343\376\277\330\244\310\227\377\224\311\256\340\215\273\261\313\276\276\325\331\224\232\263\323\244\226\313\346\215\243\204\372\304\362\236\376\202\226\275\347\261\340\271\370\233\304\273\370\221\313\246\213\375\370\270\376\251\315\317\302\247\200\221\224\273\353\250\247\257\320\341\201\356\243\215\215\346\330\275\252\267\377\342\247\317\365\263\246\341\343\377\303\267\324\342\252\217\336\307\205\301\213\237\227\221\320\250\320\364\224\212\226\376\234\264\361\360\270\276\362\343\362\246\203\214\245\205\360\230\275\312\300\333\310\237\234\336\342\315\310\355\253\367\300\355\256") -TOPIC_TEXT( -"\207\305\346\355\371\275\260\373\223\302\236\327\243\370\224\231\225\320\326\211\242\273\317\261\220\251\325\364\353\364\360\275\306\267\222\366\354\274\254\312\323\373\212\361\372\221\357\301\260\342\200\254\277\334\361\213\220\262\305\342\361\324\327\272\227\201\214\370\375\356\330\321\206\313\312\341\324\370\246\327\275\263\315\213\245\273\340\261\316\251\220\364\353\247\203\263\307\274\267\246\260\341\221\317\373\370\255\212\361\234\216\261\202\251\314\274\227\323\376\235\230\200\216\271\231\271\301\245\304\205\270\372\233\301\301\360\230\335\367\244\361\270\332\361\275\224\316\310\314\336\222\204\236\246\341\356\370\237\267\202\340\361\347\277\375\333\313\337\234\312\362\256\303\331\223\213\362\270\345\303\263\277\302\232\357\232\201\311\225\354\245\246\370\254\272\253\214\251\332\314\204\336\270\371\325\302\320\226\335\300\244\201\263\343\251\306\370\252\263\246\263\331\203\336\302\353\350\322\331\207\371\313\252\237\215\305\251\216\326\231\201\304\212\252\316\275\265\230\313\350\214\353\355\311\212\242\244\305\260\223\370\234\254\277\202\235\314\373\235\325\337\373\303\272\265\370\351\204\334\375\341\226\234\227\302\326\313\364\212\257\335\307\256\344\252\312\261\367\220\330\204\206\253\375\276\372\246\362\231\257\366\203\311\352\304\211\254\321\225\277\355\373\243\251\226\353\321\320\247\224\276\334\253\202\360\275\361\270\270\276\271\231\245\305\346\242\271\237\273\366\324\232\260\260\340\342\321\236\333\227\361\374\357\313\260\222\226\334\241\236\265\315\205\233\371\312\326\346\207\220\263\260\364\224\345\270\246\253\302\343\215\245\237\370\323\314\234\204\326\234") -TOPIC_TEXT( -"\245\323\200\266\356\362\362\361\354\267\361\340\315\364\201\360\370\247\236\257\377\257\276\236\234\222\272\232\227\222\202\262\352\305\374\245\357\257\344\202\307\362\342\252\363\256\230\261\226\371\225\261\374\346\340\340\362\325\226\355\365\213\301\215\316\333\242\371\303\343\300\254\240\221\354\247\375\241\342\340\251\305\265\364\347\303\362\374\373\302\375\213\244\231\226\301\264\353\344\203\301\342\351\376\360\330\350\244\344\266\221\371\377\275\236\367\314\214\345\242\347\257\260\370\374\243\265\213\265\314\232\343\310\214\235\225\354\237\377\275\266\226\346\223\307\232\316\370\231\217\377\210\353\331\316\366\355\332\312\372\212\377\263\232\275\265\344\346\264\233\265\351\226\205\243\344\356\330\230\247\256\211\271\347\343\304\207\353\277\203\237\205\350\327\267\364\363\316\272\220\317\353\315\374\250\307\273\200\372\360\235\350\261\357\303\252\347\366\357\206\205\335\360\330\316\302\376\262\233\345\211\307\332\242\364\242\274\336\210\362\211\307\371\304\274\274\306\307\207\227\256\226\246\317\237\275\315\332\332\274\234\334\230\261\240\227\270\340\234\260\363\323\247\317\355\356\256\317\341\325\346\315\373\252\261\345\210\373\336\224\345\357\201\363\327\327\375\376\236\372\327\245\300\211\374\364\311\242\340\216\222\374\265\214\231\363\366\314\260\344\212\215\247\217\331\256\227\357\227\371\336\260\302\217\303\247\360\263\260\310\252\205\303\312\371\310\215\256\310\314\304\361\316\354\236\276\336\264\357\343\232\240\232\361\312\335\255\362\307\201\346\342\305\232\277\333\306\324\354\342\267\231\265\313\301\262\340\322\325\247\275\260\366\342\205\334\244\246\260\250") -TOPIC_TEXT( -"\275\235\243\357\327\210\231\274\254\221\337\362\356\337\375\326\244\344\211\342\372\360\251\351\225\236\337\250\354\330\232\255\254\324\314\376\365\300\277\261\354\341\246\365\341\354\327\254\240\340\213\350\270\247\266\211\273\311\246\352\257\310\206\345\331\324\277\332\234\216\375\223\273\275\250\376\331\334\343\224\354\306\211\200\267\236\263\336\254\322\273\356\312\370\215\217\335\276\370\312\274\256\200\332\273\306\334\371\252\347\271\222\203\306\346\245\330\313\370\262\317\302\232\274\335\263\327\202\347\341\354\246\233\313\215\340\234\216\206\261\235\331\224\221\236\357\206\360\371\304\343\225\205\271\304\274\373\366\364\372\346\252\367\255\245\231\370\314\310\247\377\212\307\352\314\246\207\203\377\207\327\261\333\320\320\320\200\260\266\272\264\276\272\210\253\315\315\346\335\335\202\201\316\360\356\374\317\236\257\257\226\364\277\214\307\346\232\331\333\356\245\371\202\307\352\271\304\234\263\377\315\274\326\213\315\354\270\305\243\264\217\377\346\337\231\302\367\341\261\216\235\245\371\230\222\261\264\357\376\370\240\273\255\265\345\320\377\301\272\312\312\335\333\266\352\355\253\372\363\247\340\341\305\363\207\377\276\200\222\373\245\361\347\313\212\236\314\224\240\202\334\344\205\260\376\322\365\361\330\354\246\356\314\337\231\342\224\220\262\332\370\232\367\252\251\256\372\367\235\255\262\254\341\367\243\344\302\220\245\213\317\251\253\206\246\332\223\233\310\332\206\255\314\314\331\201\220\312\271\217\236\335\331\332\241\226\345\325\235\330\314\302\277\300\260\322\356\354\341\336\256\267\213\374\207\302\356\203\217\243\316\224\331\212\377\246\270\346\364\206") -TOPIC_TEXT( -"\323\261\341\214\277\304\374\362\262\350\333\353\277\221\304\314\212\234\242\317\231\357\314\332\306\270\362\211\231\203\316\254\314\270\357\340\371\224\257\262\234\305\302\323\260\324\241\341\212\323\332\257\271\264\274\221\243\373\311\225\201\317\331\371\244\322\243\372\226\317\274\346\272\254\376\257\243\324\222\317\370\330\224\210\340\325\362\261\304\323\370\313\276\261\377\333\366\300\313\213\265\367\337\375\227\343\376\240\336\237\376\364\247\377\217\374\317\377\214\251\234\377\327\377\375\367\261\202\307\214\252\363\231\370\272\351\323\246\373\314\263\365\353\326\241\241\320\241\320\356\357\367\365\300\311\317\340\377\217\377\267\271\362\253\227\272\200\363\317\327\241\354\361\225\240\220\217\231\373\277\273\214\362\225\371\367\203\361\377\306\365\260\257\223\312\254\373\377\315\221\306\230\371\315\231\234\215\335\300\303\267\347\317\236\276\322\330\320\277\365\301\373\340\341\312\267\214\336\276\364\336\217\203\244\240\316\350\311\224\330\202\237\244\377\266\377\362\254\352\317\210\271\230\347\357\337\241\244\245\254\202\214\314\204\367\352\370\370\354\222\362\361\246\315\250\232\241\227\222\333\274\345\243\307\330\207\230\317\226\257\234\350\377\273\301\262\246\344\205\232\244\224\340\200\371\344\253\240\207\356\355\275\261\216\274\332\204\277\365\333\337\226\261\275\332\263\367\341\260\240\211\367\315\366\355\332\323\346\344\230\325\344\345\253\260\261\371\343\265\305\353\245\276\214\374\277\204\366\371\242\257\377\270\306\320\307\317\204\234\253\267\201\312\325\353\373\203\350\367\303\303\307\217\246\357\334\334\364\374\351\336\203\345\267\323\227\264\241\371\377") -TOPIC_TEXT( -"\301\321\225\277\365\244\202\310\247\236\311\363\256\277\370\320\253\371\341\274\373\267\211\330\265\326\262\306\217\371\371\305\233\235\342\352\266\255\353\302\331\222\377\343\255\267\336\372\362\313\266\257\377\363\277\377\363\237\323\376\341\237\200\300\377\361\374\227\377\201\307\377\370\217\307\377\300\333\247\246\246\360\257\210\361\377\264\207\214\363\315\236\377\374\307\377\374\355\307\265\327\260\344\200\271\341\231\307\347\203\353\304\314\234\250\213\231\270\377\277\330\266\341\332\372\362\252\371\356\257\330\323\300\370\356\257\347\247\302\256\342\232\337\332\376\250\356\202\224\262\251\264\303\316\375\370\272\370\312\370\216\374\336\226\230\362\350\341\212\223\327\261\331\327\203\343\367\227\243\347\330\223\204\357\304\243\263\246\253\215\276\264\266\240\375\230\201\217\226\235\363\377\204\335\373\220\304\350\351\346\345\315\345\362\333\260\205\270\371\371\370\323\312\235\270\242\326\342\347\366\327\230\262\321\312\375\344\373\201\371\270\230\372\277\233\377\331\367\227\235\234\223\206\256\367\217\346\353\306\353\260\264\260\215\334\324\260\356\344\213\236\367\365\364\341\231\370\354\222\362\347\245\334\315\302\310\251\276\255\305\205\206\231\355\213\302\200\343\374\300\262\277\246\331\271\270\357\270\265\204\301\364\242\243\272\227\230\321\364\325\320\364\201\362\330\223\217\240\214\235\220\203\251\363\264\215\254\221\235\341\220\361\305\251\325\373\360\303\334\270\353\257\262\353\234\367\244\237\302\225\235\216\322\323\246\211\236\246\344\374\242\241\242\315\335\260\265\367\361\215\367\216\316\201\223\367\233\267\244\362\207\360\210\270\226\341\233\255\373\311") -TOPIC_TEXT( -"\205\246\244\371\256\314\317\336\235\270\377\367\351\265\217\376\330\371\356\301\363\215\203\230\357\215\360\337\272\267\370\342\313\201\305\243\230\201\260\221\257\215\362\317\367\340\234\257\342\351\323\205\341\323\234\307\210\226\352\257\212\334\335\266\210\262\306\315\256\320\312\276\261\305\222\314\256\240\236\213\301\204\373\247\233\311\357\226\221\330\237\323\325\325\305\274\205\274\211\252\246\252\214\302\343\242\372\263\210\200\264\300\236\356\336\330\247\317\304\321\324\326\361\301\373\277\364\304\302\252\204\267\377\202\327\263\254\341\300\251\301\302\346\252\262\357\353\316\200\335\325\344\321\345\375\305\231\265\372\314\247\363\356\200\376\271\254\352\304\227\215\345\366\260\224\252\274\320\361\275\233\217\347\353\303\346\262\246\361\347\343\353\347\334\271\222\250\314\211\341\225\363\246\276\355\364\370\340\207\267\260\355\233\256\244\342\343\243\244\372\346\205\252\260\277\306\315\310\273\336\370\315\317\254\243\243\304\333\266\343\367\366\223\334\200\345\227\336\244\340\267\224\216\311\333\354\352\345\313\332\266\247\355\324\204\354\364\230\220\376\342\341\356\377\243\305\222\267\236\247\243\366\245\322\331\252\243\266\344\210\351\272\231\377\210\250\361\270\370\330\322\257\306\227\346\247\276\322\206\231\363\223\244\337\210\357\265\335\337\217\340\266\277\247\377\241\243\256\350\337\344\252\322\341\225\200\217\325\271\222\317\225\217\265\304\200\245\240\257\275\232\314\213\206\334\267\274\266\354\234\371\311\213\212\347\304\272\212\237\275\224\372\324\372\361\340\274\213\211\346\201\337\371\274\337\234\340\351\354\200\325\272\302\241\221\337\236\374\313\211") -TOPIC_TEXT( -"\307\217\226\327\210\262\317\237\276\241\333\301\252\274\314\312\251\351\307\346\340\337\230\201\364\307\222\230\262\345\367\262\236\237\240\235\344\212\261\313\352\244\321\205\270\254\236\226\257\256\271\246\226\347\345\317\346\337\334\354\267\346\206\307\213\263\376\267\375\334\240\364\226\272\213\351\272\343\327\274\210\231\347\373\317\256\335\333\247\342\255\317\211\271\342\327\277\342\366\263\210\322\224\266\236\233\271\355\333\271\272\275\201\261\376\362\377\271\303\322\205\263\316\337\325\326\354\345\267\220\343\201\336\203\264\300\313\326\323\317\255\344\225\341\361\350\256\262\213\354\374\230\273\305\372\325\220\305\221\331\320\320\340\247\233\303\340\343\206\227\340\265\235\350\357\252\372\367\261\212\324\370\345\213\307\332\277\311\247\211\307\337\254\244\324\237\276\270\357\331\251\265\241\322\375\203\357\361\304\343\317\351\354\214\227\230\363\246\224\207\232\337\250\205\376\370\301\312\317\224\274\206\306\372\214\274\331\200\375\322\211\370\340\316\225\352\300\304\267\216\375\253\376\244\246\302\322\365\212\324\254\375\237\233\243\344\334\312\226\305\352\231\251\304\323\340\341\334\322\210\235\205\206\255\200\305\262\326\214\252\264\216\253\265\270\243\334\202\355\310\340\277\334\371\311\262\366\303\372\334\363\342\343\243\356\202\303\203\375\275\243\303\335\375\202\314\375\275\267\360\276\224\333\271\356\300\336\324\337\302\271\255\316\313\373\360\220\306\206\214\361\221\342\332\343\254\360\251\337\252\300\206\273\242\354\342\256\270\207\237\370\262\336\252\330\312\204\253\267\206\323\261\200\365\230\371\260\322\343\375\375\354\352\345\256\220\362\342\254\303") -TOPIC_TEXT( -"\216\356\360\331\213\307\222\232\324\341\264\342\220\377\364\231\216\253\300\224\250\212\351\206\220\366\204\333\226\231\302\327\372\306\305\370\264\343\217\221\331\272\220\225\305\346\241\260\317\266\340\206\230\337\230\276\345\370\306\322\204\307\233\323\276\361\231\230\360\213\234\320\312\276\260\237\277\376\250\255\350\310\246\251\251\206\240\313\211\347\323\317\236\202\350\305\207\330\222\322\272\263\223\206\271\302\314\217\264\306\231\271\205\263\263\341\251\332\253\312\204\347\301\232\362\363\211\270\264\371\263\367\343\272\364\260\316\261\240\364\214\334\204\250\346\362\332\316\304\272\250\371\225\240\272\345\325\332\301\255\362\313\256\334\327\362\221\302\254\252\203\321\372\235\254\223\313\316\275\371\225\277\366\363\235\273\234\366\260\203\242\300\230\340\237\272\272\211\206\307\357\206\360\356\260\315\331\212\265\310\373\355\231\351\202\361\303\207\374\217\244\244\214\211\274\307\235\341\266\200\234\325\372\311\313\315\301\333\236\342\244\364\277\306\205\252\230\234\343\221\330\354\377\336\235\267\366\317\366\247\311\343\237\307\247\302\253\371\334\225\375\272\302\255\314\245\324\323\305\274\375\307\257\370\344\244\237\372\377\202\234\210\340\314\242\274\353\327\371\216\202\243\273\257\375\242\317\246\272\252\350\353\225\226\356\204\217\361\210\361\231\356\203\377\244\220\231\243\353\202\344\222\207\370\241\234\223\226\372\243\345\333\332\225\313\370\322\364\217\237\266\206\342\343\371\347\235\303\307\320\276\266\353\226\242\377\257\310\205\227\202\377\337\343\363\330\331\331\253\301\211\225\347\342\231\202\353\322\340\276\271\362\357\216\302\343\257\220\365\200") -TOPIC_TEXT( -"\332\253\267\363\340\275\362\257\334\373\200\360\364\362\360\224\320\220\300\344\350\346\246\340\312\345\250\233\257\347\316\272\366\247\376\206\215\201\312\232\211\231\334\324\376\201\207\361\331\342\276\302\234\247\224\211\244\355\332\323\214\245\203\267\301\335\264\340\357\234\234\301\341\327\340\256\365\224\267\262\206\315\371\202\353\207\340\237\221\215\372\274\230\343\372\261\245\340\240\261\260\370\262\276\302\254\352\361\325\334\305\312\347\256\335\323\262\305\262\357\312\310\276\224\276\221\363\363\212\317\351\265\330\341\307\360\231\323\227\377\216\347\337\330\262\356\313\216\307\332\207\342\274\325\254\356\306\310\377\205\377\243\301\374\223\237\374\363\317\376\344\243\366\336\362\272\332\274\255\224\370\364\350\201\377\361\274\332\377\237\224\354\213\331\257\355\217\231\247\275\201\201\255\314\242\356\212\224\323\252\254\260\302\214\254\273\260\316\343\212\362\250\267\274\366\210\372\233\253\274\314\264\201\210\251\220\325\205\366\335\301\245\214\341\304\310\205\224\366\362\345\355\247\350\234\355\367\303\305\306\227\206\317\371\204\231\263\367\236\272\335\364\257\226\277\251\360\362\211\307\300\335\261\234\374\201\332\367\222\213\314\270\326\214\217\216\342\212\277\370\252\335\277\273\310\252\315\321\265\366\274\313\211\340\264\204\246\342\221\357\342\214\202\370\327\267\253\311\316\334\306\263\317\275\273\370\212\200\200\234\235\271\347\275\271\205\276\265\324\327\341\330\302\274\360\212\274\302\370\232\362\312\232\330\236\337\234\363\353\372\333\234\342\303\247\320\361\212\224\241\277\256\211\353\374\204\364\224\311\335\220\267\351\205\247\301\322\356\353\337") -TOPIC_TEXT( -"\237\356\226\275\201\257\220\212\213\361\265\306\254\342\303\357\375\220\257\264\237\372\240\217\336\277\343\322\330\320\364\236\366\220\353\232\221\202\341\267\315\305\253\362\313\332\333\330\220\315\361\303\265\363\225\246\262\343\336\221\323\231\325\203\307\316\352\300\313\353\366\241\225\331\372\324\213\225\336\373\340\234\332\330\224\334\375\205\245\307\374\362\316\325\241\202\344\214\212\307\307\375\336\322\362\313\333\350\210\302\370\267\354\363\357\223\371\333\343\213\211\324\216\356\311\360\270\334\254\360\370\204\377\275\206\232\245\255\265\217\214\226\217\237\355\340\211\302\357\335\364\232\275\234\375\265\232\353\353\223\266\237\377\333\312\362\253\213\263\251\353\242\274\242\256\317\350\302\310\265\270\363\354\373\342\233\323\324\243\234\267\276\366\374\217\307\224\341\233\361\265\233\377\231\221\322\276\221\361\210\235\353\304\255\227\372\242\302\364\256\213\231\361\376\311\333\241\203\356\261\341\221\300\270\324\266\376\336\343\206\210\217\312\267\246\374\342\361\322\271\332\243\311\306\322\241\237\325\233\317\237\275\375\356\273\333\201\245\362\212\340\351\226\330\350\345\325\332\336\235\353\334\373\271\375\225\307\264\212\320\344\323\215\351\262\361\374\350\342\347\222\262\301\227\342\320\334\323\246\300\303\300\354\246\212\314\244\362\225\253\367\237\334\272\330\327\326\332\322\230\212\304\342\320\244\272\241\257\307\314\336\314\245\237\325\303\366\343\362\241\346\256\242\372\221\237\210\236\363\307\346\343\340\304\360\257\200\230\363\340\302\251\213\311\275\352\310\303\201\335\224\332\322\261\260\230\326\233\207\376\365\234\241\225\362\364\341\376\261\350") -TOPIC_TEXT( -"\370\365\346\235\255\263\345\266\263\204\355\226\203\247\347\233\217\223\204\366\200\331\317\331\323\276\357\324\337\335\205\343\327\311\320\343\315\274\374\261\323\336\252\227\247\266\347\322\200\320\213\202\302\341\201\307\321\374\327\265\346\343\315\352\313\370\275\257\341\373\343\261\341\364\332\214\310\307\352\303\343\265\342\335\320\364\375\340\314\204\314\300\314\214\350\316\364\242\341\243\267\200\247\307\355\363\214\212\246\307\263\311\306\302\346\236\237\356\361\264\254\210\315\360\370\203\313\277\236\213\320\315\350\375\355\355\374\366\262\315\353\262\352\347\216\235\365\274\247\310\312\231\326\326\356\226\215\215\373\372\272\262\272\335\240\243\235\246\300\365\211\355\331\243\230\234\323\246\220\302\364\335\223\230\227\236\271\226\224\342\254\277\326\253\347\266\274\264\264\277\265\230\231\230\200\204\342\304\221\226\336\236\313\240\231\253\370\340\376\261\241\227\335\224\270\234\255\214\216\204\341\356\207\265\376\325\234\331\267\267\366\306\204\343\265\303\204\337\220\227\350\213\364\331\344\367\321\362\354\306\212\206\307\311\273\242\210\277\343\303\336\374\210\307\222\255\200\361\355\315\336\234\367\301\300\311\254\312\333\276\341\275\300\305\371\222\253\317\252\353\202\367\322\223\217\235\345\205\277\240\243\230\213\242\327\370\247\252\340\331\301\323\260\263\323\305\337\363\215\240\305\363\354\302\373\325\236\204\356\374\252\347\223\344\246\362\325\275\210\217\267\246\374\342\252\261\330\230\247\225\234\337\262\300\310\230\217\375\220\376\323\376\354\351\351\204\372\356\327\314\346\252\217\336\317\314\335\304\361\332\212\217\217\217\331\217\216\216\366\367") -TOPIC_TEXT( -"\200\217\345\263\272\213\201\334\301\223\323\216\321\327\357\203\323\226\351\316\271\212\347\232\226\324\355\201\321\363\232\262\241\245\210\220\213\217\257\217\337\326\256\325\241\224\346\311\337\231\312\322\237\346\256\202\312\224\263\300\251\243\236\263\316\224\300\363\222\240\325\274\346\374\307\231\235\307\261\303\252\305\236\267\324\257\257\246\341\207\233\376\372\346\360\334\262\262\254\314\260\316\255\244\375\375\247\264\274\221\212\345\260\354\232\273\232\274\376\350\312\237\332\275\225\230\335\230\334\365\366\225\361\245\364\245\241\371\314\222\357\201\341\270\366\375\351\312\201\226\345\341\367\310\251\337\267\225\251\351\341\262\333\210\303\371\270\312\226\217\225\375\210\204\234\305\277\251\347\263\274\264\357\344\234\336\347\310\336\333\260\312\347\316\305\267\376\377\311\347\363\333\211\232\362\370\346\344\302\311\364\367\302\306\364\274\352\235\274\375\221\341\361\306\224\317\372\274\276\360\366\253\306\372\367\372\372\332\332\210\347\227\256\220\217\347\354\352\307\374\353\271\225\345\347\370\316\342\317\334\244\377\360\232\227\350\357\350\215\306\234\204\217\201\340\361\340\307\201\331\311\303\277\241\273\256\221\207\265\224\207\342\302\273\314\224\336\271\274\306\221\255\264\325\211\214\336\335\366\240\232\253\330\351\355\236\265\342\233\255\364\213\214\251\354\310\302\226\266\340\334\310\372\263\210\305\212\306\267\351\232\302\305\255\251\350\210\213\303\322\224\267\267\235\265\244\304\321\203\217\265\214\224\223\263\271\302\273\306\250\350\244\236\247\323\375\364\314\366\322\334\247\317\237\244\254\222\357\224\271\325\260\364\334\375\253\324\212\365\354") -TOPIC_TEXT( -"\315\305\257\304\304\352\361\301\251\264\350\264\353\214\245\250\217\235\243\362\336\375\347\353\210\275\210\242\275\244\201\375\231\230\351\264\317\221\262\215\363\362\327\255\331\341\313\335\210\346\242\323\217\337\347\370\240\333\346\322\324\352\216\354\311\307\277\267\333\340\230\307\342\257\374\360\227\256\362\256\364\214\217\250\346\306\330\262\236\301\310\370\320\364\321\327\376\335\362\313\303\343\206\223\245\330\325\301\244\344\363\203\247\370\356\322\204\307\221\314\371\217\276\236\363\264\302\373\222\320\337\210\307\333\346\343\315\237\362\234\336\242\221\217\334\375\213\371\261\300\267\266\371\245\200\242\311\241\246\217\313\212\204\361\331\247\314\344\253\234\315\273\362\254\322\322\275\331\365\334\206\240\210\320\327\262\377\333\202\263\353\242\317\201\311\205\376\262\244\330\253\355\305\237\226\226\244\215\233\200\316\227\340\355\226\313\356\211\314\345\344\230\224\232\236\363\352\336\263\345\327\211\312\347\203\262\306\220\360\213\304\244\314\245\342\203\253\231\243\370\350\305\344\372\322\206\305\224\211\205\335\242\316\212\304\336\276\342\250\225\206\326\332\254\367\221\331\231\211\232\325\214\231\217\216\332\217\253\360\275\325\276\353\347\316\241\315\315\340\242\257\334\351\331\361\270\327\376\222\373\221\352\216\246\370\336\257\340\337\306\345\230\323\314\300\356\304\352\323\226\304\263\353\302\201\304\356\303\370\341\244\237\307\223\215\214\223\307\200\341\320\256\307\240\373\275\341\364\314\203\220\243\354\306\241\371\226\232\333\307\274\217\221\237\234\324\322\255\275\272\307\273\333\373\233\316\261\365\374\302\316\276\235\310\375\305\347\360\350\215") -TOPIC_TEXT( -"\307\373\331\277\274\336\364\257\226\251\357\360\362\211\307\354\300\332\337\337\335\305\352\274\220\305\324\310\257\363\200\335\302\307\306\331\311\243\217\310\221\245\341\246\220\357\330\236\326\224\270\373\202\252\340\207\216\250\271\242\357\326\222\367\222\213\273\253\356\250\266\273\240\370\226\353\343\221\236\310\370\227\262\336\242\345\212\346\244\253\274\213\376\213\321\221\326\207\255\367\276\243\352\216\354\275\372\377\366\264\346\344\242\264\231\220\346\330\242\337\235\236\262\375\271\223\233\262\234\362\366\313\310\275\332\206\211\211\265\307\332\336\310\201\361\270\366\351\327\350\361\375\231\323\230\242\221\376\262\237\234\374\242\210\204\225\306\271\241\366\302\345\224\262\225\311\263\263\345\372\265\371\305\324\260\224\332\341\305\236\314\303\335\352\334\236\301\330\220\254\206\366\200\271\310\266\273\267\276\257\326\215\254\264\211\241\274\345\211\253\342\213\317\274\231\214\357\334\223\315\335\262\302\343\305\242\213\333\207\324\206\212\374\266\267\335\225\236\221\242\233\257\336\372\325\316\217\272\213\337\255\317\215\310\362\270\305\316\257\355\327\207\230\201\315\301\343\353\245\276\311\241\274\207\305\343\267\220\340\314\354\306\357\344\250\255\310\306\221\224\317\274\346\270\230\354\310\214\302\216\367\340\373\244\313\261\341\370\323\352\213\324\310\317\216\357\311\275\331\316\271\255\217\310\341\245\246\220\221\253\245\365\345\232\302\234\371\256\237\227\315\372\362\275\211\316\340\340\315\333\373\351\214\341\332\374\250\325\215\217\242\364\203\303\272\257\255\226\205\207\316\305\323\327\352\245\262\356\207\353\271\345\226\220\263\203\265\214\223\366") -TOPIC_TEXT( -"\326\201\352\374\266\253\375\375\324\274\337\221\375\312\340\310\335\241\310\353\376\356\306\332\233\375\342\326\307\331\327\310\200\264\341\214\372\303\201\313\256\260\211\340\342\352\311\313\211\215\273\217\261\217\250\234\211\271\245\305\215\217\213\234\267\207\244\226\252\262\241\321\350\331\361\301\232\236\263\321\235\211\212\300\222\223\316\317\227\223\342\302\256\252\257\363\330\201\260\224\317\261\263\236\342\245\370\356\250\263\333\347\312\245\273\216\272\203\371\305\343\250\216\211\331\247\300\343\314\313\372\206\244\341\204\221\314\242\263\257\325\372\325\305\233\251\332\302\226\255\217\303\213\360\321\370\340\353\227\266\271\275\220\331\234\205\316\306\217\364\272\355\370\332\204\307\221\314\333\371\304\343\311\254\210\367\300\310\273\361\363\210\220\262\273\262\234\272\230\323\200\264\220\307\364\314\301\216\323\237\223\220\302\310\313\231\330\377\342\251\304\241\202\355\341\372\214\213\253\376\333\354\364\270\232\377\333\241\260\223\254\303\366\302\366\223\333\202\341\311\221\343\307\376\346\223\241\364\340\373\347\267\331\306\364\230\313\324\212\361\360\341\373\332\365\211\332\300\322\233\336\236\226\366\250\346\364\365\253\210\304\236\257\316\315\276\371\362\331\210\301\362\316\211\317\341\356\323\316\311\312\304\276\212\301\201\237\224\372\343\224\301\364\343\216\370\270\306\311\271\236\276\314\377\341\325\215\336\240\222\312\357\327\332\336\260\334\311\336\266\225\333\372\342\266\202\374\213\323\253\321\206\336\234\202\362\361\253\305\275\353\222\203\211\227\225\321\246\317\313\237\336\254\316\311\235\362\362\364\354\267\350\327\347\211\333\277\272\331\201") -TOPIC_TEXT( -"\206\276\232\364\261\246\302\343\310\242\211\237\370\234\273\372\331\374\235\217\303\324\241\203\365\362\200\260\217\245\364\214\242\205\355\240\346\213\265\217\307\276\267\277\322\375\362\362\334\337\353\347\222\262\261\353\327\256\237\232\352\252\306\303\377\334\272\315\231\310\227\317\233\225\353\367\216\331\216\356\335\201\353\275\277\357\326\305\375\271\341\211\201\220\226\202\347\250\203\302\341\361\326\353\325\326\335\204\354\346\226\254\266\337\257\271\277\314\264\220\210\375\230\330\360\305\300\204\336\346\343\222\340\361\341\266\216\331\255\244\373\210\372\352\301\366\234\247\215\217\351\260\347\251\231\211\207\332\246\264\266\335\223\350\221\301\327\246\330\343\271\220\334\221\274\204\257\346\233\255\215\313\213\263\207\371\245\230\334\315\370\262\220\225\351\257\342\351\241\333\224\230\315\311\225\202\361\264\225\304\360\300\244\346\234\373\273\337\217\375\256\204\372\325\274\326\334\223\351\212\205\307\321\206\350\300\340\305\376\370\245\257\313\232\226\263\265\347\233\352\234\257\377\250\342\361\237\272\227\352\212\276\342\221\212\257\213\377\311\225\265\265\373\233\223\353\353\303\314\256\320\303\357\307\243\203\233\366\356\330\335\221\343\350\330\255\217\210\365\207\300\305\317\277\231\224\356\357\372\370\316\305\240\262\320\233\211\367\237\371\236\363\356\245\304\205\270\242\355\272\343\326\333\375\335\226\302\332\376\242\365\236\276\232\311\251\330\265\202\366\234\350\326\255\323\217\305\362\316\351\216\354\310\270\333\201\224\243\241\227\214\246\233\257\256\333\331\221\330\362\306\255\314\336\224\373\317\270\304\264\336\322\252\231\352\356\211\256\376\362") -TOPIC_TEXT( -"\354\326\240\327\230\331\306\351\241\243\224\206\347\304\343\316\240\324\337\334\256\364\202\341\340\342\244\261\340\230\236\367\214\327\321\263\243\214\220\224\245\215\312\326\330\206\327\252\236\343\346\277\216\247\217\237\334\347\334\352\260\232\315\244\221\341\310\374\360\273\246\263\207\203\257\371\306\264\343\343\242\270\274\223\343\212\205\307\363\363\254\263\352\227\275\310\221\212\241\251\303\355\267\276\377\372\202\240\304\204\370\254\215\352\226\274\263\232\262\204\221\316\307\371\270\265\325\270\331\305\363\343\375\255\335\234\241\350\331\233\242\322\276\345\223\217\311\347\347\247\353\353\353\343\232\343\203\241\366\313\203\330\337\312\221\274\372\303\255\271\310\223\210\200\333\261\364\214\377\211\214\361\356\253\374\221\326\352\324\326\362\342\263\313\227\216\314\250\211\215\253\253\360\253\230\347\250\370\375\367\327\336\241\333\233\237\302\251\216\256\325\266\373\261\370\330\251\255\320\246\320\312\352\246\231\357\372\363\261\226\322\361\301\217\307\353\355\243\340\272\232\266\251\223\265\376\216\370\314\257\303\304\370\224\242\267\361\326\235\330\346\313\307\251\235\320\303\271\364\203\256\356\246\333\341\214\332\347\204\254\312\200\214\221\357\231\250\267\227\344\223\320\345\255\255\255\370\204\204\262\347\201\211\270\345\344\341\376\251\210\226\332\340\364\223\372\345\320\243\262\271\214\247\263\211\202\301\352\207\376\353\277\355\217\314\332\347\306\333\371\352\336\361\230\216\353\373\350\321\203\365\242\266\223\211\245\356\224\300\214\331\372\345\260\231\234\254\257\332\262\334\255\257\232\271\322\325\207\216\326\361\277\335\234\274\375\225\307\303\374") -TOPIC_TEXT( -"\375\366\312\321\201\336\244\202\213\273\263\334\324\374\322\376\343\217\350\236\275\356\357\332\343\225\373\367\332\357\364\267\200\245\241\307\347\322\377\234\274\221\300\330\353\256\323\335\340\347\321\340\224\244\317\361\222\347\270\201\247\267\234\373\202\371\240\232\330\210\276\327\233\241\275\322\372\225\377\344\212\360\267\315\334\272\343\235\273\366\213\255\372\363\216\216\356\372\343\375\365\337\373\264\317\365\306\243\320\213\307\237\220\306\334\370\261\217\364\370\340\274\323\227\305\257\274\355\342\304\376\254\234\307\270\346\266\344\262\350\257\304\274\306\211\314\330\362\232\261\340\274\357\336\236\316\265\234\314\270\234\247\317\232\325\372\226\323\367\340\202\342\341\361\262\350\220\270\212\227\256\256\334\327\333\337\337\204\314\310\260\207\277\306\253\334\364\350\216\255\374\202\261\310\332\333\332\210\277\241\365\251\317\314\306\304\261\201\331\377\243\355\272\352\320\255\363\226\252\331\351\310\224\301\344\322\270\223\237\341\331\256\243\327\362\366\262\352\205\355\373\271\306\231\302\375\246\252\310\311\240\256\212\271\221\227\243\275\332\275\240\255\231\334\354\373\325\263\211\366\374\313\357\343\372\235\275\307\361\210\247\361\374\375\366\321\201\336\231\244\302\312\270\224\225\204\322\322\215\213\302\226\360\356\312\257\266\367\326\374\372\203\251\343\214\210\363\255\214\243\247\375\351\362\260\243\303\340\354\346\331\254\225\256\332\305\374\243\346\206\370\224\327\310\354\222\311\256\266\311\273\243\362\347\242\357\374\265\240\230\254\263\350\221\347\310\353\314\313\331\372\236\207\245\234\272\265\205\275\252\277\334\202\375\304\276\366\375\352\374") -TOPIC_TEXT( -"\374\370\261\316\302\220\360\362\356\203\271\342\310\265\337\254\244\256\270\233\245\236\305\223\257\200\366\252\377\203\270\311\256\376\266\207\327\272\255\231\366\312\223\202\307\300\342\236\336\371\351\356\226\274\346\222\370\237\262\222\304\325\335\233\304\322\364\300\226\313\225\323\232\377\377\232\335\201\213\210\307\311\330\300\331\226\245\234\331\261\304\346\275\327\221\241\347\264\324\326\346\321\242\224\352\261\317\221\333\205\252\377\271\226\210\226\276\372\364\300\263\341\246\363\274\234\364\234\370\255\332\262\316\266\233\230\325\237\230\352\224\352\345\243\270\361\222\251\261\352\266\230\346\343\316\221\363\275\361\252\323\276\265\345\251\315\303\356\337\335\274\324\337\345\241\306\303\351\241\260\340\370\234\325\231\305\236\252\244\200\246\226\375\311\351\213\263\254\357\215\361\326\373\217\304\362\255\324\235\337\303\307\226\261\270\236\275\246\367\346\223\204\344\316\200\323\225\264\334\211\343\204\347\330\304\365\376\365\323\254\205\217\244\345\310\336\377\220\245\333\311\254\277\345\345\373\234\226\343\324\320\361\317\354\323\256\314\335\273\301\306\324\367\354\320\332\200\310\366\353\203\322\202\375\344\373\356\367\230\205\306\350\271\237\263\225\320\376\354\240\254\220\307\343\205\223\313\333\222\346\257\204\264\225\311\245\261\200\305\277\262\377\260\367\334\240\357\365\312\375\230\344\246\234\252\256\315\346\306\231\276\344\333\326\250\315\356\377\315\356\300\371\252\265\373\367\251\200\254\233\273\335\356\361\341\276\235\301\310\330\316\357\313\221\220\323\315\345\211\346\313\256\241\305\255\255\256\234\271\225\200\326\253\202\341\323\346\243\326\272") -TOPIC_TEXT( -"\274\314\326\253\323\224\311\265\275\375\223\336\362\274\323\364\331\346\237\250\222\347\235\371\333\370\305\225\366\326\330\332\342\346\301\326\340\377\217\336\312\335\340\255\372\362\212\372\367\335\270\335\223\267\207\210\235\220\227\323\226\304\204\233\223\213\352\326\234\230\272\212\206\307\250\236\346\331\221\242\205\256\335\246\275\310\371\332\312\367\212\274\345\241\202\321\246\306\223\220\230\366\245\301\250\206\325\224\230\351\342\272\243\255\362\254\231\232\341\245\363\273\267\304\372\206\206\230\304\343\262\363\311\234\204\217\325\260\204\232\220\332\261\377\243\322\331\371\252\253\337\343\220\217\373\341\202\234\340\215\266\326\342\226\301\343\352\364\270\337\333\377\322\360\262\253\370\355\323\347\216\375\300\334\302\307\214\311\203\217\331\315\300\206\357\376\277\370\257\261\335\226\300\314\373\245\365\351\370\227\270\345\347\326\250\210\313\260\344\265\331\227\370\354\226\245\374\313\310\231\351\221\322\376\277\214\253\304\267\230\311\225\276\345\207\307\216\206\371\245\333\253\304\314\274\262\362\267\333\354\256\253\313\251\316\304\305\345\310\310\245\256\332\302\304\352\311\351\352\334\227\343\263\376\227\266\263\231\272\204\267\233\237\235\354\254\257\237\276\231\350\301\370\361\317\277\320\244\264\326\327\357\251\372\357\227\315\237\266\355\333\306\236\235\365\334\231\315\307\232\346\233\362\361\221\235\261\241\363\310\201\241\322\201\305\350\224\261\300\224\271\220\304\334\332\253\355\332\303\363\265\317\255\214\274\333\362\264\215\327\300\231\320\342\265\253\317\276\330\342\227\331\235\306\343\336\303\212\275\343\217\274\307\253\230\341\261\363\311\234") -TOPIC_TEXT( -"\301\213\325\243\341\206\257\257\306\246\272\256\353\312\376\243\307\341\324\221\262\320\302\372\272\201\242\272\300\236\232\233\367\366\262\337\317\252\372\354\326\207\377\344\312\341\377\206\205\273\305\275\313\222\253\244\345\302\333\262\257\234\371\207\372\321\337\356\247\200\277\241\240\253\253\352\266\344\332\253\251\370\321\314\377\220\255\252\204\217\265\361\366\251\222\362\306\343\222\215\214\313\234\217\203\244\202\327\224\227\236\247\335\210\350\271\367\223\302\310\232\332\233\257\246\212\322\327\314\364\365\317\311\360\326\347\305\216\277\266\226\346\223\307\232\330\272\312\334\235\353\344\317\327\324\367\240\204\222\340\322\226\353\340\361\227\247\266\347\276\377\213\316\317\315\250\327\277\310\370\232\325\344\305\252\212\204\206\246\346\370\236\344\215\204\273\316\257\352\236\243\311\263\225\205\277\222\362\302\224\217\265\200\227\206\260\270\351\257\322\246\306\262\323\213\205\341\217\261\305\372\214\311\271\225\325\355\311\262\203\232\306\277\303\323\276\361\224\251\313\357\353\245\276\250\373\370\372\361\220\317\274\316\332\241\230\344\320\216\340\273\367\354\340\315\355\277\267\320\361\377\357\272\215\377\313\243\231\233\343\210\237\220\314\367\350\232\305\330\223\211\306\206\371\247\302\306\236\316\220\257\223\244\330\233\220\367\305\333\253\337\363\314\333\262\355\225\324\274\306\276\354\314\232\260\224\212\373\227\311\270\300\364\376\237\265\361\327\246\267\274\326\232\377\361\226\232\236\247\263\267\241\254\250\314\277\274\360\345\310\363\310\270\256\253\372\212\255\276\247\201\276\366\235\274\372\247\245\307\301\375\256\353\305\335\315\316\326\326\354") -TOPIC_TEXT( -"\275\326\215\370\251\306\207\207\373\367\307\355\374\225\264\236\252\372\227\327\314\253\302\301\343\366\274\234\273\321\321\213\237\303\232\332\364\342\242\377\246\213\305\221\242\205\253\332\314\250\332\331\304\352\214\227\344\353\302\355\377\310\333\365\276\345\317\251\363\363\257\207\204\217\244\361\356\225\374\305\237\313\232\266\303\350\235\203\323\334\272\333\374\367\310\311\321\375\207\226\262\226\377\274\216\305\336\356\241\343\321\341\376\234\271\305\270\276\330\337\343\377\341\201\356\375\300\322\326\304\255\231\322\357\230\357\314\310\360\257\366\357\242\261\225\356\343\300\313\353\317\342\255\351\247\266\244\331\253\221\217\245\362\233\212\367\352\344\357\214\376\361\376\203\344\232\224\213\254\325\335\233\314\262\374\227\271\323\255\217\324\346\277\346\232\367\340\227\327\272\305\225\350\336\201\360\267\334\252\363\246\324\221\220\277\271\274\245\246\242\344\374\211\324\206\223\242\312\216\327\317\263\223\343\317\215\365\365\235\227\273\360\342\230\273\372\331\376\265\343\306\315\371\312\267\250\221\321\226\311\236\373\247\276\354\333\300\353\313\326\357\207\200\343\361\332\304\343\340\234\345\343\307\223\223\370\305\242\266\216\234\324\304\321\237\215\347\341\277\306\240\276\373\335\357\262\201\256\245\301\255\357\274\246\311\312\262\252\225\256\373\237\327\267\224\332\275\246\330\250\212\357\364\336\262\226\306\323\321\361\330\204\302\216\356\270\333\224\257\374\342\261\224\321\244\274\376\374\220\244\306\361\207\214\340\351\267\253\311\360\254\346\352\372\303\225\251\363\361\341\313\251\333\316\265\275\361\341\244\364\214\272\300\221\234\234\273\233\204\213") -TOPIC_TEXT( -"\347\347\354\246\330\232\267\260\347\367\245\344\370\345\322\307\345\233\252\257\233\354\234\350\375\316\304\252\233\331\307\253\347\325\266\360\311\262\235\373\265\251\237\346\240\325\271\323\262\202\224\337\271\343\346\314\375\260\272\313\354\345\310\366\356\363\247\270\302\211\265\253\244\251\220\307\274\316\306\204\334\220\331\341\354\362\242\243\267\333\326\367\315\317\316\262\343\321\301\310\300\317\375\355\255\363\361\215\261\345\357\325\236\327\246\337\377\365\324\374\365\336\373\325\272\351\357\356\250\356\242\330\247\204\237\260\342\361\245\357\314\337\372\366\247\217\311\267\310\227\300\270\212\202\324\305\252\256\230\351\205\213\305\212\353\223\344\305\262\272\255\305\330\223\245\204\251\230\263\370\325\202\312\230\231\371\214\224\326\272\340\310\202\323\237\314\254\260\224\376\205\376\317\226\254\206\321\314\274\216\276\324\326\362\211\307\376\221\240\316\263\353\202\360\212\207\260\321\333\353\313\335\201\255\316\362\357\257\272\372\217\343\203\306\222\351\274\276\272\270\341\227\315\212\207\340\273\373\343\310\367\314\274\276\364\336\336\217\375\207\211\260\372\317\231\363\233\355\230\227\353\201\247\231\256\271\255\271\332\253\262\311\361\273\307\360\250\256\324\326\246\312\373\331\305\232\342\357\221\272\372\251\303\327\365\272\203\313\347\311\333\271\250\312\262\333\321\317\315\331\261\341\361\250\355\251\213\242\343\223\220\261\236\221\262\233\355\226\226\246\263\365\314\300\331\216\204\230\313\366\202\212\372\375\213\256\234\375\252\261\203\276\236\365\371\340\343\326\350\314\324\375\360\276\213\362\350\274\252\221\312\316\330\260\342\367\346\357\351\223") -TOPIC_TEXT( -"\203\341\322\361\224\265\221\251\254\324\265\336\265\256\231\254\315\255\347\335\327\246\344\265\340\334\343\352\350\255\231\370\320\332\261\224\304\252\367\371\307\343\264\334\267\321\354\220\345\354\331\270\334\372\341\205\227\350\372\305\206\251\337\372\326\267\376\244\243\200\345\245\230\302\274\313\252\226\234\323\232\370\242\361\366\325\211\235\343\334\310\266\231\217\236\347\210\330\313\366\350\203\222\343\377\352\212\310\331\252\333\316\237\345\235\224\376\314\216\207\242\374\207\323\267\337\376\333\210\231\245\212\210\331\315\213\263\361\265\267\346\326\236\352\210\215\354\235\354\315\272\371\375\311\370\343\315\373\253\366\220\215\233\311\311\340\346\363\347\317\364\313\346\305\372\252\246\234\371\233\231\263\215\254\203\341\242\361\324\241\272\322\271\350\314\377\313\327\237\256\217\263\211\275\235\375\206\217\376\221\341\273\262\360\213\317\325\376\360\367\203\223\363\234\355\306\325\350\355\231\210\220\326\237\244\332\366\364\330\355\265\203\374\320\371\360\315\275\256\301\214\311\256\277\361\314\357\307\211\317\204\306\370\310\341\334\374\335\201\231\210\307\210\215\353\327\237\374\342\261\213\302\300\330\312\246\267\270\330\255\245\306\266\254\364\203\246\263\204\203\346\303\243\363\362\370\243\223\342\336\362\301\316\323\224\222\272\316\252\307\330\223\356\341\333\315\314\255\333\244\241\273\310\251\255\245\210\377\367\205\371\270\362\311\257\320\242\234\377\344\200\375\345\304\255\310\313\211\207\217\356\277\236\373\366\364\351\323\247\356\214\255\236\326\201\346\357\215\323\245\232\331\317\217\346\365\376\256\326\350\371\367\307\246\245\201\233\220\270\366") -TOPIC_TEXT( -"\365\262\252\306\332\332\232\241\226\222\301\343\307\271\367\346\363\266\271\311\206\245\256\345\305\231\264\354\330\263\207\342\225\313\344\235\201\360\270\312\234\210\212\324\356\272\324\366\343\356\330\251\325\311\304\244\342\340\304\261\233\336\201\345\255\245\251\213\207\210\326\312\333\315\212\330\351\273\335\374\212\342\317\301\323\273\313\363\367\356\333\314\217\315\246\252\351\244\334\345\236\233\342\341\243\264\335\216\373\221\326\275\374\342\241\261\352\251\346\251\266\211\260\340\340\361\236\243\265\357\337\273\335\336\202\331\301\222\274\203\217\306\320\262\216\361\324\244\217\326\240\217\272\322\211\330\360\344\317\377\367\264\244\363\363\353\203\222\311\315\345\300\263\255\337\255\233\363\201\372\224\376\334\246\305\347\365\365\256\340\361\351\267\226\236\316\246\375\261\351\247\257\215\203\345\347\234\237\275\372\367\244\363\362\201\353\321\377\272\311\351\361\325\361\317\277\377\304\316\257\306\231\301\300\201\214\274\313\206\276\266\265\315\236\342\342\243\307\217\254\342\364\267\323\354\267\316\266\241\316\270\371\351\341\232\255\355\252\203\264\341\343\215\236\325\367\236\322\371\261\203\217\237\361\261\301\372\332\332\246\312\236\317\314\216\341\234\204\322\254\363\324\326\356\346\342\273\361\266\355\333\212\276\301\305\302\222\300\370\356\346\314\361\314\332\351\276\336\364\305\367\251\315\304\343\237\337\227\366\366\323\221\242\225\251\366\365\267\364\261\352\217\203\320\265\210\272\310\301\233\275\305\230\330\352\247\315\345\337\372\321\351\245\361\302\226\301\313\375\331\320\237\202\275\243\366\220\237\233\304\276\361\230\230\357\354\210\307\352\216") -TOPIC_TEXT( -"\251\326\202\373\212\255\260\201\200\243\372\222\326\340\350\270\277\367\277\306\354\314\304\370\350\240\211\224\255\247\263\217\310\200\332\263\267\310\246\200\344\354\327\341\313\213\350\351\220\304\352\302\313\265\260\347\223\360\226\252\354\245\303\315\370\273\324\377\375\276\213\323\311\200\264\276\317\315\305\377\372\231\332\245\226\375\274\372\323\367\317\374\325\341\331\312\312\231\234\206\260\260\231\347\346\236\351\314\261\317\301\202\370\371\371\326\342\342\302\306\343\200\237\315\350\217\236\355\226\327\360\261\307\335\270\373\325\261\231\306\317\201\303\354\367\257\250\305\371\247\217\265\261\264\270\257\261\223\247\223\303\372\340\312\274\206\233\363\253\232\214\227\235\331\342\361\374\362\254\262\252\253\217\324\326\242\260\233\313\204\330\216\250\214\226\350\360\254\344\342\261\220\262\305\272\310\263\224\327\356\356\364\301\343\234\264\307\220\263\217\340\270\276\264\350\337\310\274\322\201\224\325\362\205\304\237\274\246\255\260\256\315\361\230\334\301\273\262\352\352\222\352\306\360\244\353\330\265\340\272\206\241\347\365\202\330\345\367\361\215\343\237\220\266\357\375\377\230\327\276\252\353\332\322\214\233\263\363\246\235\366\352\360\363\351\227\322\332\202\300\234\326\207\223\232\261\261\317\267\253\311\357\217\256\207\213\356\322\332\367\305\365\326\320\217\300\370\225\317\271\242\265\344\360\255\243\226\375\205\253\305\355\352\312\273\315\241\276\305\275\254\343\323\351\370\376\257\345\252\371\333\343\277\251\314\212\231\200\277\262\353\340\315\273\200\374\246\255\243\225\345\370\311\273\222\254\300\305\371\242\311\266\210\245\304\307\306\211\350\351") -TOPIC_TEXT( -"\341\232\334\251\253\330\274\332\313\331\251\342\361\324\221\227\256\316\346\364\364\342\362\243\272\342\372\250\230\216\265\335\260\322\336\335\241\331\271\200\264\202\202\221\320\257\233\220\260\227\222\324\303\343\222\262\234\370\230\371\370\267\273\340\341\351\327\230\310\346\240\364\314\346\226\207\341\245\250\313\342\243\311\310\377\351\236\317\274\266\363\224\322\274\272\372\256\254\345\254\260\375\317\265\254\320\370\264\273\263\341\363\354\300\234\276\240\271\230\271\305\222\301\261\267\212\275\244\265\352\333\263\234\332\314\263\343\221\243\265\266\231\275\206\271\200\202\347\227\223\201\302\357\313\205\215\262\215\236\313\313\246\245\355\210\214\355\250\275\340\245\270\221\360\222\307\330\276\352\306\353\352\212\355\310\274\316\375\363\260\274\276\202\310\255\263\323\303\240\270\340\334\265\340\245\320\332\337\234\276\230\277\273\371\254\361\323\246\246\230\203\212\261\376\362\330\307\223\331\267\310\360\221\220\250\214\324\256\372\206\311\335\273\327\373\307\257\364\214\214\216\217\366\336\236\234\264\267\327\354\241\203\365\354\334\263\207\262\354\253\201\212\256\300\343\242\366\336\341\311\275\323\275\201\213\377\242\257\317\306\206\220\335\336\204\274\360\210\313\225\216\332\234\250\335\241\274\315\274\306\301\226\255\300\354\360\234\226\350\307\373\332\310\256\370\352\313\332\236\377\363\325\226\242\305\377\372\221\377\362\255\320\215\335\314\341\215\370\347\237\342\360\255\335\335\253\372\273\257\233\370\214\226\203\276\317\223\204\307\237\343\220\310\275\240\333\261\356\301\314\241\341\300\271\246\250\341\207\227\336\242\351\315\350\226\201\207\322\357\210") -TOPIC_TEXT( -"\307\217\236\320\342\267\277\375\355\314\376\377\372\364\211\307\247\227\252\327\364\330\303\343\267\243\311\260\234\324\345\316\237\357\341\247\330\316\335\315\345\360\345\253\235\226\263\206\336\313\240\302\201\274\253\264\261\306\204\317\256\243\342\327\257\303\333\361\261\301\366\373\310\246\323\213\362\352\353\366\262\277\324\302\223\216\225\254\367\330\367\276\275\354\235\217\201\262\351\330\216\343\243\375\330\252\310\370\204\244\233\361\365\371\205\276\370\364\371\237\215\213\266\271\321\321\333\364\323\320\377\271\313\274\322\307\301\215\233\221\344\250\230\234\277\371\327\340\261\244\367\272\305\217\216\231\371\221\206\240\214\323\344\350\335\360\324\274\306\253\232\352\276\350\204\307\233\301\372\276\361\370\345\376\362\343\275\307\217\331\351\203\315\301\215\330\220\204\355\277\236\275\266\334\221\211\253\367\356\310\374\333\220\354\231\357\274\363\237\266\264\220\256\376\360\313\240\333\353\313\374\374\230\310\315\334\235\273\206\361\274\372\233\357\224\367\376\354\351\307\216\263\267\211\223\377\331\221\343\231\271\345\257\223\217\277\351\225\236\254\227\226\363\322\301\313\317\355\306\257\263\250\275\307\223\276\327\343\323\361\341\306\257\375\203\344\267\344\332\212\267\243\260\272\221\264\366\221\263\253\251\247\233\207\311\345\324\277\235\342\377\361\362\234\265\264\277\225\312\217\366\315\370\275\253\344\246\216\255\330\320\303\351\230\307\351\250\356\214\221\206\331\224\307\254\340\276\323\326\352\276\227\230\233\231\227\346\270\252\257\211\353\362\335\202\261\341\370\360\361\356\222\370\314\344\212\237\353\375\243\332\337\247\200\374\236\247\243\352\274") -TOPIC_TEXT( -"\234\225\241\361\262\277\212\246\347\311\211\215\347\372\255\364\317\333\267\336\270\344\221\365\205\227\376\336\300\341\224\351\235\322\364\244\332\303\343\274\212\331\355\350\275\313\303\373\205\321\264\205\317\265\235\340\234\370\325\344\255\302\210\217\267\202\333\362\332\324\272\371\370\223\301\364\201\271\367\346\263\217\337\330\304\343\376\336\233\354\270\200\302\274\306\304\214\313\212\203\375\372\364\201\331\267\327\271\205\205\224\361\230\207\326\227\374\375\265\366\363\304\236\343\202\234\331\214\276\230\364\236\247\313\241\200\254\341\251\261\330\345\272\235\201\275\207\360\330\354\352\252\333\317\304\273\254\257\203\274\316\332\204\305\344\271\257\204\330\370\267\260\265\213\367\256\351\346\360\214\244\206\247\323\303\315\320\261\350\314\315\334\234\332\331\265\253\325\227\327\223\333\337\264\357\343\232\242\357\215\204\200\202\270\352\200\274\267\220\263\206\266\316\256\232\312\376\217\216\215\366\365\215\214\200\313\230\271\230\236\303\247\344\272\372\243\230\362\266\302\250\325\233\266\276\237\377\366\355\314\326\364\265\335\257\242\205\335\261\357\343\312\373\273\345\366\350\340\224\313\351\202\213\327\321\263\241\276\345\253\364\275\253\335\216\317\354\202\206\247\331\244\270\270\263\366\257\301\343\366\203\307\217\243\277\363\212\215\240\374\341\261\314\316\317\333\267\357\325\373\241\200\214\217\364\247\323\370\310\254\356\225\340\344\274\235\313\231\322\255\356\315\201\200\343\201\301\246\233\203\230\201\305\315\321\350\270\333\255\315\376\317\335\231\277\365\364\351\260\223\372\326\263\260\311\246\262\257\340\267\215\217\231\306\260\316\376\353\267\232") -TOPIC_TEXT( -"\321\213\304\234\262\323\200\363\376\373\217\333\337\306\321\246\325\345\303\346\271\216\327\372\362\272\321\371\336\200\221\217\371\374\267\344\327\221\326\244\216\307\276\340\365\240\252\215\264\233\364\335\315\271\204\363\260\274\222\276\360\270\254\221\256\316\350\236\353\342\262\261\333\341\377\261\353\207\307\273\316\237\212\275\315\353\363\362\354\210\270\202\260\266\357\327\323\250\250\317\214\253\360\224\264\214\206\310\216\365\217\340\223\341\353\312\266\355\333\230\213\310\253\366\212\200\237\225\345\200\370\344\245\334\262\371\367\245\226\354\275\324\327\364\225\336\305\257\272\324\366\243\371\377\274\301\306\206\301\200\331\330\307\312\227\355\260\260\261\247\352\232\273\341\234\316\310\221\277\326\275\202\341\361\302\354\334\346\226\255\372\340\375\251\217\310\373\344\360\226\271\303\233\315\316\314\370\317\264\226\372\371\367\201\301\251\260\350\232\347\264\262\222\355\215\265\244\310\317\332\273\363\267\254\217\373\352\230\221\341\246\331\323\321\326\306\332\314\263\273\312\330\345\267\255\231\275\301\322\217\257\342\376\222\236\241\372\261\243\223\362\365\201\261\260\222\367\277\336\271\277\254\302\377\204\307\217\327\270\221\357\314\234\277\241\224\272\204\307\227\202\230\346\274\262\320\366\323\273\277\316\222\215\217\200\265\376\212\274\206\252\373\363\277\267\234\233\202\340\277\364\200\322\325\202\222\270\206\264\315\314\217\220\206\315\334\242\356\276\372\353\342\350\302\335\254\337\360\370\213\323\233\271\217\264\266\370\374\320\210\223\336\374\210\333\251\243\266\267\204\313\220\200\206\355\346\234\344\376\337\311\253\330\332\323\324\220\245\254\265") -TOPIC_TEXT( -"\367\215\350\313\343\273\214\203\203\331\373\311\356\317\227\207\245\267\352\235\275\246\344\251\233\337\332\341\266\324\257\352\357\356\356\375\263\222\234\315\314\252\362\335\360\344\351\325\266\273\250\262\277\202\217\321\334\370\203\343\310\247\236\257\246\246\375\300\324\254\225\266\373\231\326\346\300\343\253\227\272\336\370\375\347\253\217\325\243\203\335\233\362\217\356\342\344\347\232\350\346\366\345\360\377\333\216\267\216\246\205\224\335\205\356\250\374\254\232\327\233\372\241\224\255\277\202\214\217\237\222\277\314\350\320\206\223\315\303\351\347\327\200\326\371\374\236\324\277\316\335\345\271\314\347\301\364\225\373\367\356\337\270\335\344\316\376\275\344\202\306\247\306\256\337\275\376\374\377\270\365\344\224\365\370\217\222\370\234\237\357\306\323\374\264\331\256\207\263\343\215\230\216\337\271\267\204\253\224\254\342\215\342\347\305\354\254\352\334\314\333\353\336\252\275\364\272\261\226\344\343\244\235\350\317\341\375\306\362\352\210\202\210\375\303\313\305\227\343\212\217\345\257\352\340\326\301\201\321\222\227\346\357\252\370\354\264\247\340\216\217\215\330\270\311\243\232\316\307\362\254\221\217\320\262\273\261\300\336\201\372\305\306\372\245\240\366\253\376\203\374\231\242\356\352\221\346\264\371\304\343\236\234\251\211\214\255\342\231\244\254\225\346\371\340\344\234\335\225\242\324\276\240\241\313\330\230\302\241\211\225\323\300\353\304\266\307\272\212\251\314\210\362\343\364\313\252\327\211\351\331\214\272\367\207\243\302\207\376\233\203\300\225\276\236\207\223\256\277\350\260\347\323\263\205\267\310\320\200\354\332\305\242\250\376\306\302\370\251\222") -TOPIC_TEXT( -"\253\251\365\341\320\362\365\327\215\230\204\340\374\362\330\223\240\231\377\343\265\373\367\371\254\341\341\305\366\246\253\346\233\205\214\333\370\201\224\300\337\332\326\300\222\367\367\346\357\217\275\333\271\306\253\273\207\367\267\235\243\364\300\361\223\317\275\202\217\215\242\227\325\266\357\251\262\366\323\355\206\214\211\255\233\375\212\333\233\227\334\243\362\270\303\217\336\364\265\257\237\351\304\307\363\233\267\331\321\337\241\222\246\354\271\360\370\265\202\221\361\214\206\376\244\261\201\260\240\361\266\214\237\247\247\366\330\362\360\374\211\313\350\333\377\217\264\321\237\220\220\245\236\366\267\211\307\305\322\351\347\327\204\204\226\376\210\252\241\367\246\336\332\244\222\262\275\235\377\236\263\361\255\241\210\215\205\223\366\210\270\351\247\321\233\264\265\264\213\233\261\215\244\253\216\266\366\271\332\240\313\233\302\245\263\264\204\361\241\237\346\320\340\271\246\322\242\320\274\304\335\310\304\241\320\366\327\341\305\236\266\217\233\332\257\334\276\262\367\276\244\211\276\321\261\342\214\355\212\373\364\354\367\306\243\204\311\226\374\372\370\277\263\251\302\273\234\235\373\362\222\307\300\272\210\237\232\225\302\226\271\202\244\356\234\214\334\305\304\242\271\311\247\236\247\246\312\307\322\250\225\241\307\202\360\225\371\342\364\274\363\365\247\377\362\343\270\352\237\202\262\322\250\360\347\376\226\371\237\246\213\372\200\204\253\354\347\344\271\351\321\205\217\213\242\331\325\210\274\330\257\201\323\344\244\335\240\346\310\310\264\240\341\332\363\211\314\275\317\277\274\264\264\260\235\312\301\216\204\252\346\213\274\246\346\317\220\223\241\314") -TOPIC_TEXT( -"\371\352\223\302\265\352\247\217\331\323\215\322\220\244\356\300\251\266\234\204\341\345\235\333\325\241\275\255\321\324\341\351\323\247\213\332\355\230\231\307\372\254\257\256\342\361\343\252\353\331\363\252\232\340\371\371\216\266\334\330\374\334\225\236\221\307\326\310\251\374\201\361\347\334\364\320\367\374\325\372\305\270\350\366\373\235\327\213\271\377\225\326\214\324\307\355\327\312\340\315\342\227\311\305\245\251\265\221\314\371\257\315\263\317\354\377\231\302\214\270\357\343\301\354\257\225\371\270\267\371\262\311\201\323\253\305\300\214\322\332\371\311\211\366\201\301\346\366\310\230\341\322\312\262\276\213\336\237\203\331\322\374\214\346\357\242\274\312\355\270\267\265\376\344\310\310\223\267\317\373\325\237\300\354\220\354\314\327\313\211\325\250\342\330\251\253\215\236\303\342\231\221\275\355\307\330\251\274\377\224\244\334\317\301\274\256\337\334\237\363\221\201\236\275\325\373\253\310\306\263\223\343\240\342\215\320\362\322\216\252\303\270\333\213\201\341\324\345\270\252\314\344\233\202\304\247\247\201\276\341\336\271\254\226\335\312\221\246\242\275\310\251\254\377\364\216\306\214\255\245\205\345\200\267\253\311\314\234\237\233\213\250\256\376\227\307\354\366\272\256\300\354\334\310\346\272\333\310\361\337\355\272\302\201\361\242\267\210\252\340\273\233\260\233\337\210\231\257\372\261\322\355\363\326\344\351\326\312\243\222\237\211\277\364\321\327\300\246\322\211\252\334\343\267\344\375\237\327\234\357\332\254\346\326\344\371\371\227\275\356\352\305\352\311\266\264\373\200\202\200\340\363\354\207\326\334\223\311\275\200\346\313\224\375\314\375\312\337\336\255") -TOPIC_TEXT( -"\307\231\373\204\234\362\360\276\366\265\320\334\222\206\331\354\322\342\233\321\303\225\371\223\276\373\341\366\264\304\273\270\325\232\201\303\217\373\263\327\347\366\267\312\325\275\334\215\210\262\315\203\335\236\246\312\270\323\367\263\305\256\336\256\257\255\251\245\365\233\307\331\224\247\335\232\315\314\252\313\361\373\235\270\355\333\266\225\332\303\226\220\377\246\207\226\355\205\264\303\363\354\212\273\373\255\354\375\224\265\372\331\351\321\241\243\215\346\223\314\274\321\367\353\303\210\265\301\237\216\334\326\214\216\353\260\221\242\227\235\216\211\272\330\262\240\370\344\334\240\344\336\261\210\214\275\237\213\376\265\243\271\240\252\352\202\236\251\243\302\307\304\343\356\330\247\375\370\356\245\377\315\347\355\315\265\363\264\266\246\225\266\324\372\271\200\254\257\316\360\266\370\374\331\307\217\325\224\327\271\263\231\342\247\266\230\355\217\233\326\237\310\310\264\201\247\314\241\327\374\352\327\244\344\300\240\271\211\313\211\272\212\210\364\365\365\251\201\306\222\357\243\232\225\312\361\211\323\330\312\270\321\202\267\352\376\264\252\343\321\367\227\347\310\263\263\244\254\300\370\363\240\310\344\272\330\255\205\376\231\210\245\213\261\250\253\301\316\343\231\301\312\307\304\351\206\372\215\361\251\215\265\271\374\267\356\330\265\343\215\237\262\375\331\370\260\277\347\344\261\377\246\304\314\255\325\345\244\362\277\227\327\204\373\367\357\247\307\333\237\276\375\242\376\257\220\254\325\360\340\257\355\263\233\263\373\370\340\343\322\314\350\264\357\235\312\341\312\224\304\337\351\257\203\257\256\220\233\315\355\341\311\375\340\251\334\236\350\317\310") -TOPIC_TEXT( -"\373\361\232\314\344\266\267\262\361\213\223\364\237\342\321\326\224\235\314\342\336\261\243\242\247\204\347\222\225\226\331\221\371\267\210\304\362\324\210\370\334\331\353\271\273\247\266\251\333\320\226\361\322\216\236\333\201\344\352\341\266\325\377\242\267\320\214\361\321\372\200\350\211\211\364\251\302\266\215\356\212\236\257\231\220\255\330\334\340\371\332\271\374\334\361\271\224\344\347\260\276\363\253\250\354\317\273\333\267\357\245\333\330\332\364\302\236\314\266\361\230\224\272\210\370\341\214\361\307\277\307\376\261\364\341\321\343\214\216\200\310\214\377\356\216\217\322\237\334\327\343\321\232\225\372\361\320\226\316\345\343\215\207\332\273\324\217\315\231\337\253\333\354\352\331\270\207\205\376\342\235\371\222\254\274\366\310\221\240\374\315\313\320\373\314\320\253\215\307\356\237\212\300\341\345\345\305\335\340\261\214\376\361\307\356\236\231\345\353\255\305\343\214\313\353\366\231\227\336\372\211\201\345\366\352\263\227\226\226\354\211\313\213\326\272\277\266\207\362\262\300\246\236\275\372\224\357\307\334\364\354\242\244\375\337\363\305\223\263\200\371\230\304\205\344\274\230\230\346\364\336\346\362\217\245\251\215\220\362\241\307\250\376\256\344\265\261\361\322\274\272\225\205\371\243\271\330\251\254\274\306\251\337\352\265\246\327\226\337\335\265\353\322\353\266\376\353\251\372\261\222\264\202\262\266\353\226\272\200\256\374\237\220\273\273\372\351\300\303\345\224\353\241\247\353\262\224\300\364\270\271\336\373\323\217\305\356\204\234\332\243\205\374\273\327\260\372\312\305\354\221\332\344\246\252\246\254\263\346\310\226\256\314\320\333\305\300\210\263\214") -TOPIC_TEXT( -"\220\267\315\210\325\202\232\374\252\355\347\377\210\307\332\220\222\255\216\225\345\343\254\364\330\230\213\323\205\332\325\240\247\373\277\251\360\215\337\375\356\367\300\201\370\374\227\306\376\366\373\263\237\221\217\325\370\247\224\200\260\236\342\272\374\251\221\365\243\234\277\210\337\334\266\226\302\227\270\256\245\226\214\224\300\200\306\200\340\314\302\331\351\313\211\216\354\340\270\356\231\315\336\325\350\261\255\276\265\266\247\320\264\307\305\207\367\315\317\314\265\266\376\362\323\365\201\261\276\221\256\361\314\251\346\244\253\325\271\377\324\231\205\340\200\303\312\205\270\335\205\343\332\321\341\277\351\244\323\377\272\320\246\315\306\240\323\342\364\263\340\305\362\323\250\370\314\226\264\366\362\322\277\336\264\271\361\300\275\315\273\252\371\374\357\246\377\231\266\326\217\320\244\361\341\316\361\242\325\206\307\255\334\361\270\351\333\212\243\341\310\260\377\373\334\266\210\317\230\254\256\363\205\345\215\236\355\327\253\274\210\371\240\366\352\230\327\253\370\321\236\262\336\222\260\224\200\243\375\370\323\215\257\202\221\216\235\332\203\351\210\261\307\274\340\345\212\253\307\230\302\305\210\214\200\324\211\256\312\330\224\222\263\250\374\245\205\241\246\261\216\345\360\266\222\266\363\227\217\305\341\204\200\255\274\206\271\261\204\273\313\363\247\262\302\214\360\342\340\342\333\211\361\352\374\323\312\207\342\311\261\314\374\220\347\327\206\276\202\274\347\306\323\271\322\233\233\364\343\335\260\216\201\227\244\360\332\200\371\370\337\265\371\227\345\222\327\354\327\210\307\334\372\274\202\322\352\272\274\273\342\361\322\360\276\367\365\237\365\201") -TOPIC_TEXT( -"\357\205\334\206\346\240\330\361\372\366\232\312\317\310\321\317\350\231\325\225\373\233\217\237\252\213\223\255\261\201\365\352\342\217\374\255\344\357\314\337\302\221\253\266\254\223\204\242\345\325\343\241\340\261\340\330\255\310\370\213\320\264\267\366\216\377\244\240\240\241\364\302\307\311\234\273\372\254\266\231\263\225\241\334\371\240\244\345\353\263\234\300\255\314\336\344\365\364\214\306\253\200\254\224\240\364\235\266\301\242\307\224\207\241\343\373\364\300\326\211\352\301\216\267\367\324\302\267\206\327\366\301\222\240\243\260\223\314\353\206\211\262\302\220\256\206\352\317\202\325\362\226\316\340\334\266\233\370\363\307\277\376\251\261\212\362\230\323\330\325\325\345\264\354\335\262\330\206\351\235\231\234\226\231\264\370\313\247\272\204\216\273\376\204\254\333\264\225\263\361\242\240\222\372\276\377\323\202\361\250\247\334\245\376\204\200\373\307\371\217\236\300\226\335\311\235\313\233\213\215\334\345\213\260\340\360\217\257\351\370\314\357\323\316\213\213\246\336\360\371\311\332\315\377\307\224\334\371\255\377\346\213\372\245\236\345\233\201\325\253\230\215\344\231\353\205\323\267\232\322\201\210\261\351\321\234\343\243\346\254\245\221\274\224\273\236\263\242\376\317\252\362\263\355\221\207\260\335\224\227\361\364\200\315\347\335\357\260\323\341\261\204\211\322\211\235\313\372\372\220\340\362\221\263\370\327\356\335\240\321\223\257\301\312\376\301\370\267\261\275\262\220\210\313\216\373\303\312\322\214\360\333\372\371\343\304\217\251\214\204\335\354\355\242\310\344\212\360\223\217\374\366\214\256\332\366\203\364\230\351\211\244\311\201\200\255\363\244\307\274") -TOPIC_TEXT( -"\326\261\221\325\277\236\343\265\245\271\272\326\215\236\253\361\317\320\243\360\270\275\275\260\223\244\270\377\277\245\333\336\205\230\357\220\264\354\353\205\376\232\341\253\351\241\313\211\374\342\225\314\253\346\245\206\272\217\200\247\342\207\320\377\337\354\256\314\314\360\222\275\340\245\375\213\371\340\366\362\265\250\307\346\301\326\256\200\263\215\206\265\200\216\222\314\203\311\305\342\337\311\320\263\246\342\226\202\326\317\367\324\232\250\353\227\246\212\360\207\307\345\306\322\321\277\346\244\267\361\300\324\276\377\373\274\362\336\377\213\344\241\334\361\270\352\323\203\367\361\362\347\331\376\225\334\231\277\275\362\250\262\342\247\250\370\341\266\256\206\237\313\334\274\216\213\222\272\252\316\246\231\236\375\375\234\355\305\332\302\302\353\345\376\331\262\345\347\207\252\311\230\215\354\224\300\242\376\301\345\265\355\251\255\200\360\215\370\257\343\233\311\234\317\236\274\354\312\375\221\245\204\330\214\255\337\350\325\262\300\261\216\372\320\355\216\324\220\265\372\332\322\352\264\232\366\300\360\201\371\305\374\366\303\333\317\206\272\323\326\352\222\362\317\377\354\222\237\367\262\214\216\327\360\303\214\334\346\225\220\252\214\231\251\341\207\217\261\212\316\314\346\314\331\362\233\210\300\334\202\306\332\220\322\331\303\343\311\201\226\317\324\247\202\234\226\355\314\241\376\360\256\323\254\324\254\325\342\243\237\352\222\234\277\202\340\311\354\230\315\345\241\213\353\357\214\255\201\267\340\373\254\215\232\200\347\341\227\204\230\343\347\236\312\341\312\275\332\331\225\377\220\376\351\346\211\273\242\377\241\345\236\227\266\332\222\311\245\252\351") -TOPIC_TEXT( -"\347\375\360\313\237\271\202\247\205\373\340\327\224\272\256\331\341\212\246\317\316\332\245\376\263\243\304\322\361\225\243\236\337\271\321\324\341\373\250\255\326\344\321\341\364\277\274\220\305\247\302\241\307\326\243\356\355\362\350\212\231\272\306\332\341\322\230\262\261\275\342\235\323\321\212\334\353\340\222\255\230\200\210\260\300\324\300\210\203\312\371\352\231\226\343\352\315\367\233\324\355\332\303\243\300\202\204\361\262\317\267\253\311\331\351\210\351\331\240\215\246\241\351\201\372\336\316\210\311\363\354\363\263\353\270\361\236\233\377\260\347\264\265\266\350\204\254\334\321\341\347\237\204\315\355\312\360\342\333\357\277\215\371\337\316\242\204\226\235\363\313\300\264\336\354\211\335\366\245\300\335\302\234\341\356\261\226\201\233\357\345\264\226\223\340\231\361\375\261\335\371\245\350\206\241\231\346\325\227\303\357\270\245\300\255\226\344\304\340\265\327\362\355\304\224\231\336\225\352\242\264\370\247\227\301\300\217\245\200\353\237\301\263\257\346\226\315\345\270\254\251\323\332\353\255\234\212\230\370\350\215\235\214\345\307\245\266\265\264\356\270\275\224\200\234\244\343\372\312\275\273\262\326\217\306\361\327\305\310\363\215\361\246\353\311\251\350\364\317\370\300\320\360\200\246\342\273\252\204\257\251\267\223\362\207\214\356\262\255\213\236\317\332\364\364\366\304\206\200\201\363\216\250\311\273\213\222\315\257\352\314\253\321\272\256\216\264\242\247\204\322\326\271\353\274\375\254\364\210\354\216\243\340\371\253\227\274\316\314\304\367\301\253\354\316\305\264\212\204\320\302\273\305\217\235\257\365\315\317\371\300\342\342\327\247\345\341\334\347\251") -TOPIC_TEXT( -"\241\266\212\362\205\204\320\200\206\225\321\266\213\201\321\247\375\255\206\251\201\346\225\300\274\346\364\354\320\234\215\254\265\345\333\377\214\322\362\251\254\207\240\237\315\316\343\204\257\275\262\355\312\252\237\227\261\260\330\212\347\253\377\365\301\353\256\306\274\362\322\210\271\247\255\266\351\327\316\337\371\241\204\344\260\217\366\325\202\210\355\324\254\321\274\207\325\267\327\355\321\243\207\376\335\340\327\324\201\261\337\354\200\330\253\243\230\271\254\216\322\215\266\271\253\205\313\330\231\225\252\366\336\237\341\260\200\222\265\325\347\340\363\305\201\271\216\307\371\357\356\321\340\355\337\333\266\215\273\320\227\247\252\266\273\371\302\343\265\303\254\307\326\357\214\213\274\212\241\204\256\212\256\372\304\357\215\363\372\257\252\344\257\212\330\242\321\203\303\251\203\357\350\342\342\342\203\364\207\214\314\224\330\271\340\261\216\302\345\237\234\336\222\254\255\302\222\315\245\220\272\276\263\377\200\253\253\274\256\326\335\236\312\333\217\311\340\327\365\240\262\345\241\323\373\332\205\300\225\314\201\310\233\246\327\200\252\227\302\233\364\225\266\241\337\200\300\211\224\377\327\330\211\226\205\370\252\245\371\332\370\351\363\203\336\342\347\355\232\362\315\203\301\243\245\301\267\373\325\201\222\204\215\202\214\310\234\366\372\373\357\200\367\211\205\220\261\342\223\220\206\323\341\304\373\367\230\305\221\224\210\241\203\214\214\233\311\212\344\266\216\220\326\371\272\243\202\236\237\277\327\376\254\225\313\270\273\274\307\245\377\250\343\314\245\221\300\246\220\230\224\363\257\302\357\315\204\253\271\314\254\301\316\331\364\325\265\332\271\330") -TOPIC_TEXT( -"\337\223\377\230\271\205\221\321\341\376\343\211\361\261\276\362\235\271\370\217\263\336\315\235\212\273\253\231\366\221\217\236\256\340\360\346\254\223\237\224\230\237\306\207\355\314\246\322\377\207\357\331\333\323\307\277\377\220\350\327\231\267\256\337\327\326\374\241\307\201\212\301\306\245\353\271\257\316\334\234\222\226\330\314\270\246\273\205\221\362\316\361\307\337\347\232\342\323\221\271\361\262\246\322\340\271\234\304\334\241\255\261\333\370\264\220\204\313\322\312\320\273\345\203\314\317\314\305\241\343\270\322\226\376\235\301\321\321\200\234\365\357\316\316\224\375\254\345\242\225\270\202\343\261\236\216\310\333\267\257\366\201\230\343\332\205\246\344\376\370\270\361\213\235\357\253\374\321\267\201\263\216\323\311\306\363\201\223\363\263\343\354\241\255\334\362\314\267\300\304\324\213\303\220\302\346\240\353\370\314\320\202\250\231\310\277\364\232\266\345\330\255\242\355\205\353\221\271\370\205\340\234\316\337\333\202\276\352\371\277\331\272\240\345\271\325\357\325\244\207\236\353\255\273\202\343\327\340\366\254\256\220\233\255\244\264\241\274\270\303\327\275\300\360\340\300\302\216\244\265\273\306\200\377\263\265\323\200\346\255\224\254\254\365\337\246\306\206\372\372\250\343\215\237\342\351\203\314\344\330\375\355\255\373\337\344\251\322\372\214\340\371\245\336\237\301\232\250\226\366\257\266\265\266\320\302\307\203\272\221\263\225\226\217\275\264\305\337\235\326\362\324\367\254\264\323\354\347\261\342\350\271\307\237\217\224\340\200\355\266\371\253\252\226\312\314\320\320\364\266\254\360\262\224\350\253\205\244\317\270\241\267\241\266\260\237\341\344\374\205") -TOPIC_TEXT( -"\310\312\215\267\344\205\237\346\342\342\300\364\356\372\264\312\216\217\355\224\321\201\361\370\337\307\354\265\337\234\332\254\361\212\210\320\332\274\203\207\234\303\251\307\223\247\377\222\270\325\311\364\363\220\205\377\326\211\260\344\331\310\362\205\244\272\374\330\366\310\227\350\313\304\222\313\340\256\201\225\315\223\256\300\313\314\333\364\364\212\302\340\211\237\215\362\255\243\227\374\337\204\336\332\243\204\315\306\343\200\307\306\263\254\221\360\220\211\331\252\334\311\207\310\371\272\244\334\312\310\354\360\270\367\245\261\346\314\366\360\256\307\354\361\261\301\277\306\372\372\332\232\275\200\240\343\274\205\244\203\225\235\251\347\374\236\273\316\307\376\245\275\277\202\341\311\214\234\240\351\354\270\367\346\263\207\310\242\346\253\300\333\331\264\376\273\367\203\307\371\270\225\327\234\217\377\357\356\231\241\244\200\354\365\227\364\234\207\360\273\314\336\263\220\243\274\241\326\222\224\216\224\274\347\313\207\307\250\310\237\251\243\373\202\341\261\315\334\324\376\307\321\241\264\370\276\364\260\207\256\271\346\207\246\236\237\236\372\357\207\241\340\367\250\262\252\235\254\213\226\346\261\206\262\314\274\337\241\333\326\332\346\261\362\377\305\364\357\270\200\274\345\211\223\351\225\242\240\321\343\326\274\211\345\215\201\332\376\257\302\257\363\336\301\345\355\252\271\201\263\260\254\264\217\204\307\266\345\353\270\220\257\315\333\325\305\300\222\210\231\333\314\245\344\237\355\333\303\311\347\257\221\345\235\274\326\204\201\222\333\376\332\232\317\264\265\206\265\266\330\232\227\202\204\252\276\266\370\237\245\220\333\266\355\265\313\375\261\371\305") -TOPIC_TEXT( -"\247\360\335\345\207\217\363\301\203\371\317\250\250\315\335\222\315\213\246\351\233\356\204\205\350\214\302\222\365\204\251\265\341\377\343\237\232\206\233\217\316\336\242\232\212\256\336\242\371\321\344\260\274\316\307\305\336\304\257\315\241\212\327\376\236\350\313\375\216\343\350\270\224\374\301\316\335\332\307\346\315\336\262\336\265\356\332\230\215\343\363\261\376\233\212\253\342\235\232\350\232\334\251\236\203\354\246\234\206\201\235\242\254\364\274\327\210\311\336\324\274\202\340\230\322\246\340\313\275\277\202\326\376\257\276\203\326\272\314\227\324\336\316\344\321\314\311\314\376\352\326\332\217\204\316\347\317\236\232\301\277\326\305\266\227\375\207\255\265\255\234\343\302\356\274\330\201\266\317\346\310\336\252\275\241\342\332\361\322\216\215\266\336\352\244\213\221\217\313\274\233\302\205\223\344\225\300\356\371\356\357\371\270\233\314\224\337\320\311\245\265\256\311\326\332\247\236\354\360\266\366\335\261\303\233\276\361\270\307\257\220\251\230\364\341\237\230\233\231\343\244\224\253\372\365\242\371\321\220\200\274\356\276\336\324\367\322\340\213\330\321\205\322\221\215\227\254\223\320\361\342\372\267\204\377\257\273\363\267\200\231\303\354\201\254\340\361\220\307\206\307\322\244\267\243\300\364\222\264\227\266\260\250\351\303\333\246\215\376\214\324\335\356\226\362\364\351\223\363\355\357\337\372\326\267\200\344\264\327\230\223\364\346\371\254\363\340\216\276\317\330\321\350\330\260\321\232\241\257\316\206\366\220\205\332\304\261\263\342\376\234\366\222\302\310\310\300\217\321\360\230\223\303\333\350\266\372\337\331\333\225\357\204\202\235\307\340\247\362\332") -TOPIC_TEXT( -"\271\361\363\204\224\324\267\307\357\236\306\247\267\261\274\225\216\344\205\236\376\254\245\225\273\266\262\307\303\274\371\262\346\313\205\346\247\225\245\322\256\232\270\232\333\275\317\316\315\316\360\225\375\345\242\225\205\262\235\305\343\234\273\267\357\337\273\355\221\227\300\350\330\315\202\356\241\343\314\311\315\257\323\215\320\361\262\235\331\241\311\346\230\213\334\302\340\346\342\200\313\344\347\347\237\335\221\204\235\245\206\247\251\220\315\265\275\254\304\250\300\246\332\313\366\346\312\246\240\235\206\372\312\316\235\324\352\315\324\222\361\216\343\204\337\363\343\356\362\274\323\300\305\262\330\240\265\347\372\355\220\333\305\335\262\214\254\361\346\240\231\265\370\240\230\236\332\270\351\245\306\354\354\255\215\220\201\371\307\253\323\302\206\206\204\213\222\343\351\333\313\363\253\347\305\254\272\352\372\227\335\230\352\373\216\335\271\342\334\261\366\316\322\364\355\363\311\226\267\236\267\337\235\310\243\307\271\243\300\335\236\237\305\205\365\343\333\356\316\341\337\327\364\350\376\220\247\223\232\267\336\235\243\242\330\345\347\321\205\203\203\303\307\221\331\335\361\244\377\312\226\217\330\253\253\367\263\370\205\252\206\273\260\345\310\343\303\330\263\207\367\243\373\376\273\231\374\272\356\256\371\301\241\203\330\365\305\271\343\230\202\270\261\342\257\266\272\324\215\377\201\331\344\374\244\276\276\274\264\273\263\301\370\362\344\330\352\267\246\317\337\232\275\263\367\220\365\211\325\305\343\325\277\313\333\351\321\245\371\374\225\205\265\274\277\332\310\227\231\311\364\341\262\224\320\373\351\216\330\353\373\363\231\302\367\311\242\220\251\235") -TOPIC_TEXT( -"\205\331\357\214\371\220\351\345\361\356\270\273\333\313\347\277\340\337\213\375\335\335\265\265\373\301\205\305\234\247\355\305\276\204\314\210\214\214\307\240\250\360\276\314\371\232\250\270\341\361\273\337\310\370\376\302\230\371\307\312\254\300\217\221\312\240\313\233\351\261\323\263\323\336\267\235\321\362\204\371\252\312\237\277\215\340\372\326\237\316\212\335\223\250\326\342\342\242\315\272\332\211\344\323\331\341\350\361\333\353\213\224\200\204\216\330\221\207\205\324\324\324\266\314\234\374\313\307\320\361\200\250\376\361\341\351\341\356\374\252\366\375\252\252\333\223\207\203\370\323\201\346\344\212\345\230\271\253\345\272\366\252\302\256\214\307\234\276\205\237\331\316\254\221\233\363\207\265\263\325\360\231\217\277\227\334\243\320\334\367\235\205\200\251\256\260\201\314\336\232\202\212\253\357\271\227\212\310\310\275\353\261\347\261\344\362\314\262\264\230\231\350\351\254\257\207\372\225\237\274\326\344\350\344\366\226\226\200\325\301\360\230\364\354\334\364\215\225\213\366\254\375\334\303\375\204\227\321\247\225\225\273\271\261\307\206\274\371\231\245\375\227\257\217\341\214\201\274\302\251\326\313\205\335\230\355\340\353\227\326\304\217\327\342\231\311\273\257\302\327\353\376\326\240\322\276\327\365\345\345\236\246\304\342\354\334\260\227\230\256\372\372\230\304\252\227\371\307\343\340\357\352\316\327\377\313\214\216\326\367\355\332\232\202\365\322\376\322\342\376\335\305\256\253\332\327\276\270\265\363\376\327\337\277\335\275\360\242\303\350\273\330\236\307\357\257\232\311\274\354\341\220\261\235\261\237\234\201\367\325\230\360\340\377\357\217\212\307\223\343") -TOPIC_TEXT( -"\335\370\237\323\365\367\336\220\251\363\270\331\202\200\340\315\214\236\237\347\357\210\355\271\246\372\244\260\271\333\245\370\320\257\306\210\244\300\326\200\352\367\217\303\331\251\341\342\265\267\355\314\305\345\236\345\301\264\272\212\346\230\203\215\241\220\233\363\215\315\275\375\301\215\205\267\225\256\243\374\246\375\305\225\365\320\330\244\265\211\232\370\224\342\220\334\255\240\250\274\344\332\272\211\215\203\246\315\301\267\271\372\276\225\323\314\371\241\377\277\376\324\242\242\244\304\264\274\262\232\204\267\256\344\376\225\351\235\231\310\277\236\343\250\253\351\326\225\307\233\266\207\360\237\300\367\251\341\226\371\275\271\375\333\373\357\312\367\211\307\206\225\257\375\374\262\276\242\237\363\244\356\332\373\333\262\271\373\345\360\310\226\253\325\322\315\201\375\343\327\300\274\270\370\234\235\356\217\217\217\262\303\230\250\244\214\351\202\215\303\230\301\332\346\233\272\310\366\354\340\315\277\362\341\323\245\371\362\204\340\311\217\260\363\315\276\274\240\274\245\241\335\217\231\203\217\346\215\214\322\364\231\204\334\306\261\337\344\223\307\232\230\351\214\327\307\266\226\346\260\361\354\367\352\345\374\375\334\321\243\304\307\262\266\205\341\366\261\357\250\354\322\214\235\345\210\303\307\311\374\266\270\266\377\265\351\346\206\363\303\351\330\314\256\327\304\205\271\203\346\233\357\232\275\252\316\253\205\202\375\366\325\314\215\272\371\272\347\332\304\212\244\312\247\372\236\343\334\203\223\262\244\236\325\204\342\264\306\256\357\367\322\216\215\376\271\230\362\353\354\361\262\330\370\354\314\371\377\276\372\364\350\312\275\322\273\234\307\232\303") -TOPIC_TEXT( -"\301\274\377\203\317\370\260\243\244\327\340\255\236\237\275\372\300\211\204\222\311\366\231\330\206\217\230\353\371\224\202\304\344\346\327\250\277\367\306\266\274\254\316\311\255\354\223\377\361\261\300\300\356\351\341\332\215\267\366\346\233\270\233\307\365\201\215\373\315\352\302\273\345\261\262\254\217\257\322\224\215\231\377\242\312\216\220\373\273\273\333\200\301\220\235\334\300\305\204\371\315\253\320\267\224\217\252\323\330\326\373\276\256\331\361\235\350\343\260\243\304\353\304\240\320\354\250\267\274\316\202\237\241\351\377\347\334\345\321\354\273\371\225\354\341\332\311\307\205\366\207\250\214\311\323\344\303\336\222\273\331\376\360\256\314\242\345\245\336\201\367\376\304\364\210\315\246\260\340\253\226\375\375\242\225\221\372\374\342\261\316\316\252\321\263\361\225\313\241\324\236\223\205\217\351\220\313\274\346\317\250\267\363\205\244\241\205\214\336\376\254\311\264\267\330\266\377\243\202\332\240\366\361\343\375\207\356\220\354\306\306\246\246\206\373\235\273\377\371\224\372\253\373\324\347\212\320\217\363\325\376\305\274\266\255\352\253\202\334\201\367\316\340\254\212\374\223\205\366\267\214\346\230\306\335\352\302\325\350\345\211\345\356\251\277\262\211\371\264\356\266\345\305\246\246\241\222\341\337\336\375\352\336\251\255\231\247\201\204\201\306\373\353\253\366\200\214\325\333\212\374\202\210\377\372\305\331\324\233\366\301\310\311\265\254\317\257\347\211\211\274\363\365\375\350\212\277\264\256\205\254\307\254\325\320\347\345\275\252\215\226\346\376\272\233\233\321\367\213\260\207\331\364\204\312\214\246\234\237\317\353\362\210\250\316\237\215\377\242\220") -TOPIC_TEXT( -"\345\211\213\210\241\343\271\233\233\345\344\326\304\312\312\276\361\370\207\223\303\253\225\371\270\301\200\313\330\246\307\211\236\213\301\307\312\217\342\366\300\306\316\364\232\350\312\274\307\217\234\236\345\220\231\315\257\252\235\224\301\332\272\251\317\271\374\217\203\324\230\202\247\354\217\233\214\247\264\240\363\314\311\330\200\351\370\344\343\250\203\267\373\372\256\233\341\366\350\352\370\315\350\370\246\320\230\231\210\353\276\270\355\375\243\223\352\253\264\265\274\270\255\227\365\254\317\233\217\213\254\214\252\313\213\263\254\264\220\214\346\306\335\202\242\241\235\313\277\221\204\314\234\247\377\354\261\263\267\247\325\353\216\276\376\271\344\332\262\307\342\302\376\346\245\311\277\353\252\307\217\236\340\221\343\231\361\271\216\370\374\246\255\225\310\305\371\227\316\376\325\230\346\315\224\212\341\376\274\232\350\376\334\367\300\265\277\242\324\270\362\312\245\263\334\372\217\255\373\227\372\303\363\330\271\272\263\257\257\346\243\225\356\310\365\332\276\233\330\346\236\370\352\310\306\373\316\336\357\315\261\346\261\260\271\273\233\241\347\375\345\311\311\357\260\235\353\377\313\327\347\337\232\217\210\216\265\335\210\345\357\261\261\241\233\213\211\347\213\307\377\250\335\245\322\326\307\362\211\307\264\272\336\234\334\375\365\347\353\377\365\243\365\247\267\224\343\210\211\307\334\230\371\351\245\227\260\362\331\355\357\377\373\250\275\260\244\347\261\347\201\260\343\325\234\366\366\223\356\306\354\230\255\307\236\307\332\323\276\227\321\217\370\243\226\205\345\342\236\251\337\213\331\330\207\231\374\323\234\327\355\377\261\367\352\366\317\321\234\373") -TOPIC_TEXT( -"\232\240\313\357\366\356\371\207\246\302\241\327\235\233\261\304\354\334\243\365\305\266\227\373\261\363\377\323\353\213\211\350\330\350\375\210\211\367\356\364\305\354\331\314\364\220\321\346\353\342\325\234\343\210\276\321\300\237\300\356\260\276\341\343\353\300\303\200\324\330\207\354\361\300\234\207\343\331\262\326\230\354\201\331\226\210\213\241\341\244\352\244\364\255\212\322\351\263\320\300\302\310\300\356\323\371\365\250\376\274\372\337\254\254\357\254\254\314\312\254\351\315\362\370\242\242\263\353\315\254\313\254\374\374\336\337\276\277\275\347\247\362\211\270\351\361\205\262\345\251\265\310\250\273\354\273\371\277\322\255\361\217\236\221\325\354\275\266\270\324\332\320\265\202\236\237\376\311\277\361\324\304\360\300\275\276\317\340\301\340\275\262\207\310\241\213\241\267\267\266\342\364\322\375\374\270\257\235\301\307\347\255\336\302\311\212\226\226\365\227\226\265\310\262\304\226\204\305\350\244\306\265\213\355\361\334\320\247\255\265\331\257\357\224\202\214\370\374\266\262\355\304\206\236\357\337\206\372\265\373\350\340\366\257\267\233\275\233\207\222\234\231\250\305\261\277\217\274\307\352\335\307\202\350\255\223\211\314\255\231\307\373\354\354\353\370\237\205\363\342\301\372\265\251\304\237\246\271\311\362\275\270\312\330\304\225\277\261\302\256\225\237\376\363\205\252\254\350\350\271\344\217\222\353\311\274\252\367\246\203\251\215\245\232\266\277\273\332\372\240\326\311\255\242\335\200\233\257\254\256\351\254\356\243\267\260\324\362\315\333\315\201\215\355\357\274\370\204\262\305\362\313\253\245\332\374\270\371\343\220\337\312\332\370\245\225\245\376\317\255") -TOPIC_TEXT( -"\352\213\306\201\351\261\230\235\337\271\204\374\251\252\273\311\346\352\235\224\317\360\327\212\203\350\376\255\303\305\274\325\357\334\201\271\223\263\261\307\250\264\340\237\256\350\306\226\355\270\345\361\344\360\336\276\270\265\256\311\241\307\374\212\363\331\243\331\215\241\350\314\202\266\202\343\276\347\234\354\376\266\252\203\322\202\272\202\366\333\324\313\372\234\354\264\323\214\341\335\362\217\237\204\317\313\244\203\261\306\251\201\370\274\356\215\203\323\343\240\257\236\230\375\264\203\330\354\334\346\227\270\230\360\270\220\316\277\347\267\331\334\224\316\255\301\363\201\273\343\243\203\232\214\217\247\254\355\211\247\303\356\316\350\370\200\364\230\347\273\324\334\232\270\360\320\207\344\221\353\230\365\200\263\345\261\264\227\365\320\202\233\252\206\225\211\203\326\303\342\255\227\345\224\214\246\310\211\334\230\240\352\212\332\325\340\274\266\207\364\230\347\230\330\261\335\251\316\256\337\332\235\225\261\216\373\365\320\350\261\216\223\221\357\310\276\307\201\225\260\207\325\231\245\304\345\274\272\272\302\217\251\264\216\357\225\307\277\372\277\374\244\220\221\360\274\251\352\323\304\201\305\346\301\242\252\330\344\243\307\222\225\341\317\277\364\273\336\250\331\310\240\300\340\302\240\355\300\350\320\240\304\230\247\304\346\212\367\272\336\273\340\267\311\234\257\206\234\271\302\360\371\323\254\353\303\252\330\334\330\245\325\262\376\240\223\330\226\333\212\301\351\261\243\366\261\274\374\243\271\357\235\312\277\367\207\307\313\327\354\251\270\324\226\334\225\317\367\336\274\213\345\252\301\234\326\250\345\203\355\346\303\237\204\222\300\252\230\353\223") -TOPIC_TEXT( -"\232\275\321\346\223\204\317\245\267\337\222\374\223\252\216\376\356\331\344\353\213\220\231\260\371\221\274\207\203\232\245\233\346\334\364\221\216\240\363\305\262\324\343\240\246\203\311\331\272\345\200\267\370\350\214\224\230\346\377\345\304\322\347\261\202\347\252\365\220\267\230\332\205\221\267\362\201\345\247\363\236\355\346\314\315\200\330\325\220\347\256\343\337\246\220\236\343\364\341\362\371\267\321\266\200\234\256\257\301\220\207\307\207\371\231\266\213\237\306\365\242\327\273\212\246\326\222\207\221\350\203\220\360\250\301\203\274\307\364\244\215\226\337\361\311\302\265\267\255\270\360\330\231\325\343\373\252\354\240\221\313\274\357\233\210\307\320\361\317\255\202\233\254\206\222\253\304\330\362\250\375\257\364\341\231\240\241\207\275\323\345\365\351\250\373\241\210\253\260\267\321\307\257\347\256\323\344\336\214\214\256\340\300\341\220\360\275\372\305\354\310\203\371\210\370\214\220\370\267\223\372\234\337\332\257\211\373\251\241\366\204\275\271\353\265\223\340\347\221\244\347\344\326\214\241\263\237\356\375\324\227\267\252\311\327\363\222\257\322\347\341\202\354\366\251\277\327\226\222\304\225\261\215\242\305\230\315\376\272\350\324\263\311\362\310\246\360\341\336\260\214\306\325\362\266\250\237\306\223\321\270\243\357\334\325\346\340\345\340\332\276\223\276\350\234\370\216\262\250\261\237\202\323\343\303\207\337\345\375\344\325\377\326\354\373\353\305\337\224\322\311\224\372\374\357\374\361\335\325\314\313\213\251\247\223\274\363\251\226\320\341\351\261\206\334\262\230\217\370\363\236\347\273\372\210\321\275\236\270\352\345\243\321\343\260\222\354\274\304\360") -TOPIC_TEXT( -"\270\217\242\310\217\265\344\263\343\343\346\243\203\203\203\367\301\226\347\253\344\306\252\346\263\243\276\300\202\342\212\305\271\214\321\350\345\374\322\204\240\251\216\371\362\304\227\216\221\231\200\202\337\275\263\342\254\224\330\202\243\317\227\363\371\325\301\212\344\341\372\376\266\203\330\375\210\372\217\377\302\325\273\231\352\363\242\275\277\326\314\247\353\226\277\326\266\353\372\223\347\325\331\332\213\343\233\243\367\377\367\273\377\322\260\231\262\316\236\236\355\302\231\264\360\271\210\230\337\323\326\253\211\270\210\227\222\347\277\360\301\204\275\212\226\344\214\342\334\234\224\230\273\234\241\223\270\234\362\311\252\353\235\340\365\264\274\264\210\342\270\314\203\267\272\267\325\306\324\323\241\227\214\351\261\356\356\321\340\306\264\347\357\352\306\374\325\243\317\203\360\276\311\221\241\343\257\312\216\262\376\246\367\302\300\203\345\243\216\264\303\261\300\244\256\215\222\254\302\360\201\332\210\311\266\306\233\270\323\220\324\353\313\231\236\225\245\332\306\345\250\327\323\373\325\250\250\362\207\350\307\234\255\333\334\221\365\204\236\357\267\262\220\330\342\355\337\337\314\235\222\276\270\241\276\275\373\351\354\233\216\262\274\254\362\347\211\232\323\250\275\376\365\375\374\320\333\224\232\334\377\365\356\253\343\231\331\332\210\310\217\277\377\373\356\274\232\221\307\227\277\351\325\334\356\360\330\232\303\276\366\337\234\327\265\307\312\363\225\366\307\223\203\355\235\216\233\370\342\363\232\367\354\376\274\251\331\206\247\350\352\233\356\300\335\205\346\357\344\320\206\314\324\247\371\255\200\372\335\360\221\336\367\370\320\274\261\326\226\202") -TOPIC_TEXT( -"\236\307\247\204\271\351\361\260\272\315\201\340\302\326\212\301\202\262\347\302\334\344\205\264\230\200\372\343\274\323\226\233\247\343\360\245\203\250\265\223\203\217\275\347\211\365\264\261\356\204\313\360\336\240\262\366\364\276\213\312\256\312\213\241\273\257\275\206\234\367\211\200\223\234\341\247\267\257\226\265\327\265\255\224\332\311\354\305\362\333\341\216\340\325\362\235\251\342\360\212\365\215\354\260\362\364\361\311\314\366\202\364\370\344\351\361\217\300\214\377\274\376\374\255\276\343\330\207\263\331\272\261\332\264\345\335\367\205\247\254\212\210\356\235\350\261\344\372\215\330\252\326\342\276\300\374\351\267\356\262\201\213\353\203\324\206\324\211\343\316\357\303\263\232\203\246\367\222\263\375\311\367\341\376\307\316\325\256\202\366\331\344\230\305\206\235\275\324\212\261\343\222\374\344\222\234\320\344\311\230\357\203\371\325\313\225\342\263\217\340\320\376\227\232\214\217\260\327\265\233\353\260\256\356\336\225\301\244\307\322\267\344\330\335\310\264\223\322\267\224\302\267\313\346\277\235\244\226\361\321\343\346\241\251\257\314\271\264\336\277\327\377\216\273\323\360\222\264\247\325\337\257\311\301\373\231\213\324\241\270\313\357\261\326\334\231\267\201\271\320\267\275\254\355\370\277\367\375\247\307\277\356\220\237\362\370\361\364\202\334\270\367\237\302\237\343\314\244\353\361\223\315\206\310\252\353\325\217\251\206\355\253\265\232\256\243\263\334\354\233\252\333\245\362\264\266\276\364\235\205\266\261\366\350\300\247\277\333\260\307\305\344\250\301\344\255\262\300\250\361\264\266\337\337\363\236\272\270\342\216\352\233\353\252\330\355\204\374\220\313") -TOPIC_TEXT( -"\316\360\265\245\303\220\374\317\251\340\322\301\327\215\214\271\310\217\256\235\367\256\316\236\245\232\224\275\266\325\312\216\257\275\221\246\206\211\203\367\314\220\212\372\234\367\225\225\337\374\320\366\251\263\261\314\222\322\216\340\310\321\332\235\323\202\205\224\373\370\340\366\372\354\200\266\273\312\223\302\212\351\330\360\307\272\376\376\373\364\257\276\373\356\332\356\354\231\361\260\224\352\312\323\200\345\305\245\305\307\375\300\353\222\334\343\315\356\245\221\336\377\364\343\327\212\236\327\340\301\207\241\336\374\331\335\205\327\260\367\251\332\336\215\275\233\303\301\307\215\376\210\344\373\277\227\241\221\230\304\275\224\317\200\251\261\337\220\252\213\243\230\334\302\266\261\204\236\331\233\331\310\332\313\337\225\206\302\227\272\221\365\215\314\201\211\250\202\253\341\306\277\314\337\267\233\275\376\331\277\365\226\330\241\315\326\362\312\321\262\310\217\202\322\343\325\364\254\310\275\253\206\273\327\303\341\311\205\246\214\276\274\247\324\375\327\253\243\357\202\210\254\247\215\316\314\257\246\354\274\312\360\264\375\272\234\233\307\247\340\351\361\234\307\273\264\371\345\201\265\311\212\217\227\237\314\253\353\310\311\341\350\370\253\200\317\317\262\335\317\232\355\241\317\227\315\274\316\261\230\240\276\200\306\343\233\235\273\367\262\271\222\240\242\333\263\262\300\323\222\215\314\257\365\376\232\254\305\210\373\363\235\274\262\343\305\300\210\230\264\226\301\373\360\312\265\277\342\310\212\275\306\313\336\300\277\245\274\311\236\332\202\252\332\211\257\332\344\353\221\204\221\356\231\264\241\313\270\202\215\244\333\341\322\230\343\365\215\330\341") -TOPIC_TEXT( -"\316\321\215\350\362\255\275\315\325\326\310\304\336\212\344\311\376\366\377\331\312\222\334\232\236\257\373\255\342\222\236\315\216\241\217\337\321\372\371\237\251\271\367\236\313\276\365\370\320\333\217\367\356\336\301\356\237\377\302\264\263\376\330\353\356\376\327\254\201\232\371\276\231\271\200\332\234\360\206\352\362\257\321\223\236\373\252\315\234\267\325\227\307\246\255\314\331\216\336\221\243\270\261\306\260\315\257\233\277\317\317\351\321\346\352\237\200\203\243\237\315\232\347\324\236\302\214\252\204\343\305\320\332\250\234\336\325\247\344\324\372\240\223\377\246\327\316\235\314\350\261\214\241\350\307\361\330\303\351\222\343\265\273\206\202\254\256\365\372\255\306\275\266\360\301\300\372\314\342\347\237\371\253\303\247\276\342\322\225\305\357\317\327\241\234\203\377\307\262\321\252\300\261\230\323\245\224\264\210\234\346\345\237\222\316\261\236\311\256\201\204\201\241\340\271\273\345\361\346\310\273\241\371\260\273\343\212\354\371\322\271\324\256\344\240\324\373\353\307\370\370\363\335\310\367\213\341\217\200\207\214\232\223\343\243\225\360\213\354\276\276\333\304\324\320\274\371\257\317\312\252\317\214\210\315\255\344\224\223\341\351\324\254\327\206\261\331\305\211\220\305\260\207\262\274\316\232\362\315\302\214\271\206\264\305\300\376\343\333\230\326\307\204\203\261\216\303\331\201\356\274\314\355\214\370\237\363\240\211\202\241\323\202\265\265\376\265\224\225\245\377\352\370\216\356\263\331\230\241\332\364\213\310\251\337\317\352\355\221\351\257\361\216\215\203\304\370\305\273\356\245\276\326\271\237\275\271\225\346\354\200\375\240\376\305\305\317\374\353\206") -TOPIC_TEXT( -"\332\351\374\310\234\323\203\303\314\264\254\255\305\217\317\377\323\223\214\260\364\254\311\263\264\355\212\203\330\262\326\223\323\354\342\326\263\350\226\317\274\340\317\304\236\260\236\225\241\240\257\321\343\334\302\322\377\370\356\216\237\316\306\356\273\244\377\245\250\364\330\354\247\243\356\243\374\342\305\363\351\351\234\263\232\300\305\315\336\277\312\363\371\305\310\344\316\252\377\277\276\262\272\226\370\276\323\262\250\245\202\322\343\377\360\347\312\305\341\344\343\357\377\277\367\375\331\377\335\244\271\307\222\272\266\330\254\210\262\310\217\325\361\205\360\204\275\223\236\313\355\213\267\262\337\237\310\200\317\373\353\355\253\315\265\323\302\207\273\232\273\200\356\206\347\306\300\354\265\256\342\201\215\350\267\332\326\226\244\354\240\217\222\276\376\371\344\276\242\355\241\352\375\375\242\203\217\226\333\241\367\273\310\322\342\276\250\254\305\300\310\327\317\235\300\344\256\373\222\233\301\327\245\244\213\347\354\237\261\344\211\267\325\206\345\350\345\360\274\235\252\326\237\255\327\276\230\314\261\341\361\324\203\376\262\351\277\363\362\352\337\361\304\253\361\355\251\321\275\264\354\274\313\207\231\251\320\327\317\206\220\314\242\315\346\213\273\200\366\201\352\253\245\276\231\351\356\354\302\300\261\354\334\251\262\371\362\342\213\277\205\277\220\242\254\335\255\200\322\226\340\266\243\257\234\310\217\245\325\337\307\327\265\316\344\267\340\235\203\365\361\352\337\320\243\263\237\216\206\273\233\235\341\343\315\200\267\264\266\341\271\233\307\256\245\365\372\345\377\375\274\351\225\232\344\257\225\337\371\360\250\361\375\345\270\321\313\204\244\307") -TOPIC_TEXT( -"\345\237\213\320\301\230\262\215\235\357\210\345\324\244\256\200\201\330\264\335\335\241\303\257\232\311\311\241\312\352\251\242\340\264\273\315\214\214\250\257\306\374\365\336\337\253\357\256\235\250\201\351\361\266\263\336\221\267\366\206\202\257\274\227\235\230\364\230\233\342\317\364\366\374\346\374\267\367\266\272\230\316\215\332\237\234\347\337\201\335\202\267\316\340\362\341\376\346\317\351\361\234\252\326\202\223\215\304\337\346\203\303\236\223\321\214\303\362\307\221\342\211\206\214\211\226\240\334\203\276\237\271\222\271\334\304\374\356\215\222\353\306\267\214\227\377\303\326\362\251\331\361\234\236\234\225\317\362\263\216\222\254\265\222\307\244\270\245\357\327\301\254\316\316\227\207\264\220\370\367\220\374\273\312\243\214\377\363\252\326\347\377\302\264\251\247\252\314\223\373\311\314\205\316\321\205\341\352\203\261\376\335\301\370\315\316\216\271\253\231\302\221\307\347\301\334\355\310\345\376\240\371\261\212\246\253\344\245\241\330\256\377\214\355\273\372\244\371\306\375\246\331\320\231\357\241\315\357\366\301\211\371\330\251\201\232\224\327\216\223\251\237\216\230\367\372\216\257\210\313\246\307\333\307\355\367\344\212\326\323\301\337\300\307\275\211\211\332\321\230\345\304\234\327\376\355\263\356\360\303\272\366\253\222\310\254\216\243\231\371\306\244\275\325\271\352\244\366\255\266\224\271\265\223\277\335\352\263\272\256\267\226\242\242\307\201\332\263\365\312\205\216\277\376\257\375\377\265\225\303\307\352\246\255\214\220\246\343\305\362\352\332\332\272\271\252\325\326\277\314\374\266\242\215\224\305\205\314\365\226\305\220\372\254\256\257\227\327\365\274") -TOPIC_TEXT( -"\256\333\273\254\320\271\212\215\245\215\231\375\311\244\332\251\305\206\370\324\215\363\251\367\327\246\305\352\240\332\243\273\277\233\241\251\310\331\261\360\257\257\277\370\232\357\335\275\243\255\217\336\320\320\320\364\346\217\340\353\334\322\346\360\364\350\262\221\255\362\234\350\226\326\350\351\302\313\206\215\242\324\315\225\202\213\217\246\206\350\250\274\214\276\334\370\342\244\235\210\261\320\334\330\230\271\326\275\326\212\354\202\207\312\206\206\363\355\247\225\227\273\241\212\276\233\374\337\300\244\264\364\346\350\360\216\250\307\206\322\222\223\333\275\360\323\374\375\260\260\213\326\364\377\212\374\364\230\256\262\332\311\267\304\367\324\200\343\345\317\236\327\357\361\313\255\255\305\345\200\331\317\256\356\237\272\373\206\242\201\235\311\322\203\337\247\346\331\214\274\352\360\255\247\237\372\273\206\246\200\343\255\234\264\246\273\372\306\366\261\237\345\271\244\215\314\303\307\314\257\357\214\342\344\372\352\367\210\351\353\324\324\201\272\221\272\256\360\366\255\335\321\322\352\200\260\261\346\357\360\207\360\311\365\262\201\334\271\251\277\236\370\256\262\275\250\275\242\242\307\371\200\266\346\310\245\302\307\343\337\331\374\333\274\327\322\323\376\207\265\306\360\374\311\332\260\264\231\213\276\222\245\342\200\257\223\313\324\332\231\352\333\272\335\362\347\365\333\200\244\354\301\253\306\201\373\216\266\231\316\240\250\373\254\321\337\247\342\313\206\351\364\316\363\273\360\254\204\307\301\307\210\203\305\374\312\255\357\221\241\200\346\363\323\223\343\303\346\272\331\231\352\350\261\247\377\370\362\266\263\376\361\331\246\256\367\217\355\365\347") -TOPIC_TEXT( -"\310\352\300\264\330\272\320\214\313\322\340\246\372\361\256\263\227\233\237\230\315\216\225\262\322\321\215\353\274\262\215\250\253\376\303\274\376\255\306\276\353\371\230\224\363\242\334\207\232\275\273\356\353\275\277\274\274\376\366\342\233\351\354\242\306\221\325\257\310\230\305\240\336\321\372\371\233\362\250\364\370\300\205\301\243\261\276\257\230\212\321\226\310\310\215\352\337\200\232\274\203\241\307\375\253\364\222\270\321\370\270\272\230\201\252\217\201\317\351\300\213\232\254\303\263\253\261\205\276\255\236\302\243\226\364\330\247\364\276\374\345\362\245\304\237\262\206\311\301\331\330\213\343\377\207\321\204\234\214\331\352\253\272\263\261\310\257\266\354\206\323\215\351\231\305\331\255\237\363\373\216\342\367\346\270\341\210\265\322\202\260\334\251\356\276\253\257\321\315\300\262\332\317\315\231\223\352\212\301\242\227\310\226\271\316\256\241\310\222\254\272\254\275\306\346\370\312\273\212\210\235\363\223\254\333\344\375\262\307\237\256\347\372\351\213\247\357\251\261\301\201\362\356\272\337\374\207\355\266\232\241\344\215\217\224\232\220\304\224\263\323\243\276\274\266\271\210\343\261\221\313\316\376\350\321\343\273\275\267\251\214\333\216\304\220\313\203\273\244\323\214\323\230\237\236\376\334\270\244\305\351\330\300\245\243\307\271\314\241\320\254\372\270\326\304\313\214\363\256\301\211\307\217\235\327\235\327\265\332\301\325\264\207\375\305\357\355\276\240\364\230\331\231\364\257\213\260\364\270\322\200\230\316\337\275\325\257\246\342\327\204\314\316\200\247\313\374\271\305\206\204\323\200\325\372\254\366\245\353\371\243\356\315\263\230\210\216\255\303\305") -TOPIC_TEXT( -"\236\232\257\213\320\210\220\236\347\375\216\253\243\331\320\361\251\270\250\233\353\341\320\305\201\317\236\360\211\232\232\271\321\240\255\250\332\262\217\346\214\243\202\354\226\253\341\226\233\227\302\364\212\242\336\365\361\254\253\215\302\324\371\305\360\363\240\265\354\353\346\271\231\276\244\274\276\225\265\350\331\224\326\342\377\224\252\344\207\316\233\306\332\220\365\210\354\346\303\334\224\306\200\223\343\225\355\355\242\220\355\207\203\367\355\350\232\247\226\270\257\206\242\241\317\346\307\325\366\313\311\250\205\353\346\362\223\332\321\267\213\263\323\342\331\201\211\221\210\367\324\340\377\257\327\376\313\276\375\373\212\346\210\365\257\347\231\274\310\211\302\261\255\310\350\336\315\337\266\376\311\323\264\351\261\224\363\252\303\247\273\206\233\206\314\236\343\347\360\250\377\375\357\325\356\303\357\267\361\306\353\356\257\207\256\224\236\306\261\305\265\243\236\240\345\221\244\322\361\354\231\317\345\211\304\345\236\322\246\270\267\266\333\241\343\324\301\254\331\223\351\370\246\331\324\251\242\245\327\307\371\242\305\274\271\337\353\206\216\313\301\344\236\362\270\360\267\223\216\324\364\242\333\247\230\355\304\307\275\251\301\265\324\203\224\372\314\325\276\201\265\227\302\234\351\247\305\354\354\314\327\322\377\321\323\234\274\332\254\306\241\333\357\263\277\350\277\232\244\262\312\206\236\276\341\252\255\272\272\345\321\306\265\267\374\254\337\227\226\370\261\253\206\363\277\263\231\261\221\301\221\207\354\203\203\367\372\200\214\203\242\263\207\336\225\310\262\326\274\314\204\254\262\341\303\327\350\272\344\326\312\210\302\220\303\301\204\315\372\334") -TOPIC_TEXT( -"\340\310\247\223\367\321\245\261\277\235\231\271\377\373\250\277\317\274\256\253\256\265\267\305\262\377\356\212\305\203\336\377\357\360\263\341\275\340\375\353\377\342\265\355\224\317\267\372\321\311\242\336\236\323\314\255\224\271\311\242\244\347\365\300\346\265\254\363\251\236\264\253\253\353\220\370\356\326\337\315\255\215\352\260\351\261\370\344\264\364\310\330\250\207\366\230\256\344\304\232\327\205\343\350\267\222\312\237\305\356\341\223\212\237\326\355\235\277\370\356\245\323\232\325\243\254\324\365\333\221\276\362\262\320\350\261\255\340\370\350\221\232\221\323\343\274\376\327\232\336\315\316\216\243\317\377\370\237\343\213\235\207\350\310\223\213\204\342\276\233\203\226\365\226\255\234\243\372\327\314\230\230\317\302\221\335\315\267\244\317\210\365\266\367\271\273\205\267\257\272\345\265\300\325\367\337\261\253\340\204\277\315\331\350\353\245\346\253\344\261\264\207\325\261\324\246\260\315\336\255\326\323\330\337\263\254\370\251\325\275\312\326\307\326\270\331\267\344\232\245\230\206\201\330\261\222\205\326\265\210\341\346\262\303\205\362\234\351\323\203\352\353\376\213\306\223\340\314\215\215\237\250\316\261\344\313\227\202\261\344\357\205\331\207\245\230\262\211\377\341\201\356\226\346\346\306\344\223\247\245\330\336\225\312\270\212\354\236\372\313\207\216\374\236\204\267\357\352\334\305\342\255\307\337\250\360\277\303\362\373\245\237\247\303\263\225\364\245\237\213\263\317\371\270\306\234\346\346\362\340\301\301\224\255\371\323\214\225\236\377\261\360\321\223\356\277\340\376\213\321\322\343\261\240\216\235\232\261\346\326\205\346\252\330\361\266\372\313\341\312") -TOPIC_TEXT( -"\230\265\322\243\256\355\322\270\262\213\232\302\211\371\227\263\214\271\316\301\330\350\261\305\324\210\315\203\236\347\335\222\351\322\266\201\307\363\216\204\212\345\301\362\242\217\235\257\277\231\342\327\205\207\370\320\252\272\377\331\252\240\344\273\311\312\250\275\333\346\246\306\307\306\276\206\361\231\315\214\207\260\205\255\325\351\261\350\247\306\247\250\254\360\321\324\242\231\323\355\313\244\376\253\332\246\356\323\237\251\322\343\272\334\244\360\251\247\350\376\356\230\325\371\312\262\210\210\261\351\323\267\347\244\235\322\344\253\351\374\253\353\340\314\300\303\204\242\364\201\305\200\264\370\317\203\322\365\341\203\313\214\255\203\240\227\235\360\275\254\311\302\260\344\364\301\202\322\374\343\200\207\243\271\261\261\373\353\247\216\360\344\223\307\312\277\300\310\270\342\371\252\241\216\342\352\354\375\203\261\315\202\311\314\304\327\350\220\354\327\222\322\327\315\347\334\252\345\231\332\310\271\222\365\350\270\273\275\266\270\227\221\261\224\303\255\233\221\256\213\233\233\200\241\253\364\330\356\207\247\321\326\204\241\275\216\325\247\360\300\346\320\227\242\260\232\221\202\243\272\241\227\354\207\207\366\274\205\341\356\373\244\366\243\302\251\277\362\257\305\240\272\274\235\303\370\245\342\317\366\255\213\261\325\214\241\354\364\330\242\264\342\223\242\307\204\353\352\265\264\254\264\334\370\340\277\304\221\350\272\346\312\232\330\335\222\232\272\322\332\201\201\337\276\330\275\231\333\326\240\345\267\242\351\311\350\200\236\265\316\352\261\337\315\315\372\223\306\247\262\332\221\207\203\242\243\202\335\234\373\324\351\234\333\276\343\302\214\375\372") -TOPIC_TEXT( -"\323\343\336\265\217\317\244\307\327\213\345\345\345\205\236\263\267\356\357\342\305\213\214\263\263\230\345\202\343\344\253\205\244\307\215\216\322\356\326\251\335\331\376\203\217\214\253\267\372\201\372\252\351\207\370\260\312\215\345\253\331\325\326\303\321\355\270\355\203\303\356\352\334\325\335\226\241\253\373\274\254\356\377\337\355\242\262\242\347\326\367\215\366\326\253\240\307\225\242\206\220\275\364\224\356\366\374\266\374\270\347\320\301\203\211\240\374\261\345\246\354\202\377\206\334\333\323\205\275\304\276\275\206\221\257\277\371\226\216\334\224\312\201\210\237\223\367\241\351\261\224\206\256\336\304\202\216\334\265\234\277\367\302\271\276\352\304\272\334\334\301\330\223\266\235\254\331\310\367\201\210\265\262\216\305\246\326\307\254\364\270\357\276\370\360\274\345\225\254\223\327\336\271\326\232\372\315\240\240\344\316\356\257\277\376\272\303\240\260\322\241\302\265\354\362\251\217\370\265\266\366\314\265\217\211\307\244\250\261\226\261\246\221\347\224\372\254\203\351\265\346\266\223\313\341\365\352\332\302\202\222\344\347\243\223\226\242\222\226\276\211\307\334\252\360\364\212\250\362\320\202\311\254\246\275\306\257\360\237\340\253\205\342\236\354\230\371\312\344\214\213\343\227\251\272\320\264\246\313\321\343\317\312\232\205\350\226\341\231\221\316\354\375\254\341\346\321\210\352\220\300\340\221\220\223\343\303\222\215\361\367\352\243\223\246\303\364\346\260\326\223\263\331\261\217\340\364\230\224\230\313\325\317\252\254\360\327\321\224\262\326\225\342\367\302\257\367\206\207\254\321\343\343\347\333\343\224\372\322\320\366\246\242\213\326\342\326\365\200\260") -TOPIC_TEXT( -"\324\365\334\301\274\332\254\205\220\215\206\370\312\272\330\235\317\355\242\326\315\233\256\215\211\277\353\326\267\270\344\300\324\300\202\261\333\342\223\243\326\372\357\214\347\357\376\337\377\375\225\370\227\377\266\216\262\371\203\214\356\312\275\265\222\313\261\265\222\204\211\244\260\334\357\346\265\231\331\355\214\273\211\252\236\350\314\356\243\245\273\326\350\261\225\267\370\326\342\304\274\354\303\271\204\304\343\261\231\253\327\312\214\241\365\301\321\352\334\220\314\363\206\327\234\322\211\307\322\333\316\363\277\342\343\252\263\271\346\266\255\276\206\243\355\254\267\202\201\355\204\275\247\240\202\331\315\327\322\377\321\255\273\246\306\311\265\232\206\350\313\241\235\222\225\265\230\352\223\211\352\361\323\277\216\225\340\311\341\352\342\330\363\304\345\270\370\361\202\270\247\210\220\226\300\307\361\310\274\231\206\362\321\330\255\250\275\346\316\221\220\231\354\304\360\317\220\212\237\235\205\266\212\337\367\215\217\326\256\357\262\256\314\231\362\315\350\361\303\221\276\300\342\322\216\317\356\230\216\353\306\257\224\332\377\270\235\266\343\336\210\264\250\264\334\250\367\270\314\210\322\250\255\201\235\264\205\217\344\300\345\330\260\276\305\265\210\217\202\236\343\201\327\312\362\274\253\335\366\347\207\216\374\235\336\356\354\325\334\202\330\231\344\302\202\252\352\234\230\341\254\326\246\251\355\257\326\227\351\246\200\300\313\356\303\300\305\254\264\265\354\261\211\360\315\266\355\333\366\357\234\260\210\206\326\357\327\326\213\216\230\311\243\210\316\227\337\367\313\202\225\340\323\352\341\370\323\224\261\210\267\254\207\261\254\267\312\251\351\241") -TOPIC_TEXT( -"\254\325\232\317\323\322\234\302\355\211\224\253\353\204\326\361\331\304\362\202\323\332\371\344\301\300\207\367\327\277\271\360\340\243\274\303\376\373\355\336\237\377\317\230\313\275\222\212\327\224\363\227\207\225\342\361\226\346\257\346\274\253\254\210\342\331\334\241\272\212\357\256\371\350\246\250\332\333\332\223\361\370\335\254\337\206\214\375\331\260\261\274\363\367\243\366\352\373\215\237\336\213\351\311\201\216\340\251\273\247\332\341\263\372\352\223\314\330\211\366\375\236\231\252\211\306\241\361\253\254\244\364\222\355\301\201\331\316\237\374\311\276\225\241\235\345\332\213\213\360\210\211\236\343\214\231\367\364\350\221\317\247\204\267\346\344\335\350\271\337\271\345\255\310\243\307\254\366\205\301\301\223\231\270\305\231\317\200\343\225\335\306\276\314\223\232\305\332\313\215\236\273\323\305\240\264\230\265\352\335\207\340\270\242\205\372\315\260\321\360\313\271\256\346\207\311\202\223\324\353\341\254\314\313\250\311\213\263\341\210\343\254\222\376\301\232\226\222\355\244\300\263\331\202\303\253\376\241\365\375\220\213\345\360\267\264\214\374\245\251\240\301\322\255\233\223\262\332\374\220\332\337\347\243\360\323\306\345\215\320\202\226\307\226\221\202\374\330\347\245\307\264\304\256\305\220\370\253\212\227\253\364\270\271\375\261\221\370\361\372\267\376\302\345\362\324\235\305\337\217\307\207\216\342\346\347\307\262\243\273\253\316\231\262\366\252\335\366\241\367\347\276\375\373\211\342\373\322\230\234\262\216\310\317\200\365\377\307\245\237\205\366\344\277\330\271\255\216\243\342\270\323\331\247\344\204\231\201\256\217\217\202\225\236\334\333\324\211\230\350") -TOPIC_TEXT( -"\261\236\376\367\340\300\236\334\370\346\267\271\277\300\323\262\372\230\233\221\210\253\324\362\226\340\357\255\335\335\335\301\350\261\211\220\336\206\223\261\320\230\215\340\303\217\251\242\200\201\205\246\240\301\334\255\376\335\346\264\272\373\267\327\341\332\261\212\236\215\370\364\324\227\373\307\250\215\346\246\307\325\230\270\355\215\220\231\232\345\375\334\330\235\351\311\220\333\275\333\332\307\206\356\204\340\255\310\255\315\315\303\375\375\313\240\307\247\217\377\200\236\372\374\257\327\257\303\333\333\357\323\365\361\331\246\374\342\316\247\347\366\314\345\223\326\246\321\370\243\236\231\262\306\255\217\331\363\342\366\377\360\355\264\211\373\236\236\321\321\335\322\217\374\204\306\324\253\330\337\277\366\202\344\206\232\364\233\237\337\321\306\232\255\260\341\302\322\220\235\214\225\250\236\333\324\211\270\350\261\234\236\371\307\377\351\277\371\376\362\343\301\317\376\335\241\263\337\376\367\220\321\352\357\274\315\314\315\303\252\266\355\225\333\306\251\260\330\251\275\270\231\260\311\372\272\277\350\265\360\333\212\236\263\245\350\343\206\235\342\365\271\346\307\351\355\267\206\272\201\343\207\312\274\351\261\311\263\263\332\361\266\254\275\306\347\275\216\371\330\305\374\230\315\216\315\374\346\307\305\206\316\265\247\300\233\250\325\201\260\246\344\375\262\223\340\306\363\263\372\371\217\352\214\371\301\300\256\241\246\263\373\260\347\237\273\267\274\367\373\343\270\204\333\232\277\377\343\357\317\277\204\224\261\275\316\227\225\225\263\375\331\211\325\322\255\220\226\312\373\364\310\332\364\224\376\335\250\273\206\254\321\343\316\227\254\350\345\276\210") -TOPIC_TEXT( -"\234\213\233\306\231\357\242\261\237\330\257\261\256\324\257\307\373\260\323\242\360\330\335\277\252\342\221\305\226\342\273\261\275\301\377\224\275\311\366\320\255\357\246\361\202\220\374\360\353\370\360\354\321\245\242\247\307\264\313\252\230\356\373\263\317\311\242\261\276\342\266\372\245\345\351\211\274\301\275\261\225\303\337\240\246\344\256\334\346\252\374\246\344\216\244\354\231\331\302\355\214\211\313\262\232\276\374\345\220\230\232\344\323\312\201\300\212\334\324\345\260\311\340\315\333\255\231\262\226\225\251\322\365\333\215\236\377\262\210\264\222\355\222\313\275\342\366\341\366\241\332\312\344\221\340\333\357\256\273\265\210\317\262\232\323\343\237\374\320\361\277\275\351\314\311\271\334\361\336\347\315\305\352\257\334\212\370\365\204\363\246\306\217\202\325\320\336\276\324\220\275\220\360\255\337\350\271\217\313\366\203\376\335\256\323\334\341\372\310\326\320\307\201\213\320\325\202\321\314\345\213\272\212\260\325\360\264\350\250\374\301\206\326\234\241\315\327\254\270\365\205\321\211\232\376\340\217\263\255\331\231\267\326\240\222\313\225\260\342\374\307\355\352\345\214\271\271\242\354\317\227\314\260\273\343\370\244\321\357\242\274\357\304\217\325\330\262\377\260\340\231\224\272\341\203\342\232\245\257\211\201\366\246\371\355\253\357\261\210\202\321\322\204\343\274\370\312\331\325\200\353\340\306\237\237\355\222\263\324\267\222\327\257\255\260\326\323\313\227\257\326\236\276\361\360\261\363\253\273\274\366\332\260\353\324\221\313\355\214\352\333\206\350\213\371\245\233\221\306\247\271\324\243\374\314\203\264\323\342\301\301\335\276\276\303\274\234\374\265\336") -TOPIC_TEXT( -"\240\314\347\353\362\340\207\203\273\300\260\354\231\336\256\210\207\233\334\276\350\375\374\217\340\305\354\324\326\250\236\225\364\243\241\320\364\224\330\274\205\272\204\212\377\324\221\303\306\367\254\203\373\230\373\231\343\371\246\267\342\312\364\263\317\250\252\253\370\203\330\243\243\223\335\270\203\203\210\242\313\373\342\371\307\335\322\312\316\301\201\337\247\317\206\243\345\340\371\331\363\327\304\372\362\332\306\214\375\311\346\223\240\366\375\314\361\300\266\321\276\230\331\333\231\311\340\245\232\330\301\232\240\211\302\316\324\315\307\265\317\302\242\204\242\244\261\307\370\270\236\372\355\377\336\237\374\354\337\225\312\307\340\223\356\314\304\302\217\363\210\356\371\216\311\345\343\376\236\331\336\255\246\307\271\240\247\250\362\255\367\366\233\273\367\216\231\214\305\323\312\214\252\262\211\202\277\375\234\377\201\224\371\310\214\215\216\360\300\344\362\342\334\346\316\214\332\215\341\256\255\256\326\222\313\324\266\332\350\270\357\351\365\261\213\237\264\267\205\231\246\350\316\371\252\301\213\222\320\325\265\244\275\301\365\213\261\277\227\267\212\361\344\202\310\311\276\302\226\253\301\340\253\256\316\335\227\257\355\376\331\367\330\241\260\334\370\372\214\224\316\362\236\333\267\316\334\375\364\302\323\217\202\315\256\322\253\243\360\307\275\260\342\344\223\236\323\325\353\311\300\335\245\326\314\333\362\355\372\333\220\314\237\260\247\371\250\326\250\221\373\262\317\243\234\302\276\237\370\261\240\222\222\377\246\357\345\310\331\352\312\255\335\254\252\307\324\364\307\230\225\243\313\331\325\264\377\237\376\367\236\205\272\322\200\363\317\253\340\341") -TOPIC_TEXT( -"\332\363\276\266\303\344\330\350\240\346\375\220\305\334\355\275\235\231\222\232\305\322\241\252\310\357\226\342\244\237\316\304\204\251\253\241\210\221\251\343\342\205\210\257\357\207\267\356\343\255\310\273\323\274\317\337\373\355\264\265\321\324\357\333\266\315\202\264\371\356\244\331\371\251\361\363\362\362\375\362\345\254\217\263\366\207\302\247\233\250\305\321\346\260\353\317\277\212\252\252\315\233\223\305\312\231\204\262\203\277\246\275\246\300\275\217\325\256\313\242\314\371\232\267\350\232\216\326\342\355\270\352\300\243\301\350\234\352\322\261\227\302\244\376\314\337\233\312\220\323\324\246\306\332\312\324\217\310\350\261\355\334\313\300\201\275\271\261\270\363\377\376\215\305\243\231\254\224\362\367\203\230\321\305\220\243\226\202\275\324\330\210\271\357\335\224\327\350\355\371\371\340\376\336\337\330\310\240\231\356\330\324\337\330\234\313\254\314\212\276\214\374\265\333\263\372\320\354\352\225\336\274\370\216\277\335\353\311\220\365\305\225\346\277\352\200\365\344\252\207\365\320\343\331\340\325\354\205\246\363\264\302\272\352\325\310\376\231\247\215\341\372\344\213\240\241\332\322\264\374\270\347\313\337\276\375\207\216\236\274\215\320\362\336\247\260\337\335\362\240\315\214\231\364\370\342\325\365\336\354\347\352\330\320\254\275\271\365\321\211\255\215\346\250\261\244\203\340\274\312\234\344\245\226\226\246\265\315\337\262\217\255\324\336\347\254\231\344\265\301\320\251\257\237\225\233\252\336\342\253\241\222\206\372\214\333\362\251\233\267\360\332\325\350\317\311\351\207\362\233\222\254\222\277\247\371\240\203\314\230\244\231\304\230\275\330\264\261\342\371") -TOPIC_TEXT( -"\231\311\315\226\351\216\326\352\254\265\313\217\255\330\241\351\225\336\352\371\347\235\246\371\342\253\343\331\351\261\301\366\362\376\327\314\243\221\247\213\263\342\254\251\215\320\237\320\312\262\254\256\277\231\327\242\311\361\322\204\226\315\372\274\363\347\322\316\251\364\303\336\313\347\217\226\355\333\267\263\213\325\327\244\370\370\344\211\363\251\363\267\210\311\252\221\234\265\344\323\242\303\200\317\376\356\345\332\356\212\253\322\236\213\271\347\217\346\272\245\220\241\316\263\202\212\236\210\367\370\355\327\337\355\276\362\371\222\303\271\361\214\301\304\242\210\302\345\336\323\232\352\336\340\355\210\244\276\377\275\241\325\207\343\263\250\245\244\371\263\316\215\247\250\305\246\300\365\233\364\370\302\313\371\322\266\362\356\323\355\377\266\377\327\320\377\357\276\234\263\323\203\251\352\315\276\315\357\312\204\253\271\354\204\325\224\233\200\337\240\304\236\357\375\347\263\211\325\212\304\267\262\275\226\261\255\202\355\317\374\257\251\270\255\373\324\350\261\332\340\203\345\351\223\211\254\343\222\265\314\271\362\215\246\314\236\374\333\213\212\313\302\350\244\267\307\242\275\207\317\347\234\344\360\376\362\344\374\262\344\272\215\346\363\263\351\375\322\227\330\312\347\337\251\302\345\302\311\315\203\311\306\217\272\327\356\344\307\202\372\244\244\257\323\222\305\223\236\203\217\345\203\252\304\341\354\365\313\345\320\310\342\311\317\246\377\256\333\262\300\363\213\373\204\315\267\276\306\363\223\377\246\350\357\331\310\250\255\361\267\344\233\226\233\203\325\322\343\351\262\266\356\355\355\255\332\312\242\356\313\347\215\212\314\205\364\207\220\267\237") -TOPIC_TEXT( -"\360\210\244\274\337\375\347\247\357\327\277\343\256\260\305\351\261\334\204\262\234\247\261\240\210\263\247\230\247\250\224\230\244\205\277\355\244\373\337\325\215\203\206\310\251\270\202\312\263\211\250\307\207\251\302\330\321\206\343\313\357\352\333\256\366\340\232\262\207\356\336\216\233\306\254\226\242\275\243\270\220\271\336\377\375\365\327\207\217\357\204\355\272\263\207\324\315\314\217\225\211\313\227\366\237\272\312\370\260\376\265\226\270\261\261\305\263\252\325\320\350\261\265\250\332\254\214\215\236\357\204\211\276\260\222\267\355\223\254\340\327\243\307\344\371\360\266\312\240\276\320\260\306\372\346\226\221\240\232\372\334\333\317\323\265\377\327\377\237\334\373\252\202\330\234\313\250\342\301\212\374\364\226\226\226\301\346\241\364\330\365\241\323\251\244\262\346\206\323\246\343\371\215\261\205\217\246\231\275\346\324\261\232\212\223\300\370\245\366\372\243\312\277\251\354\325\267\252\317\320\355\373\215\267\331\336\240\245\346\342\222\236\324\335\375\266\234\355\206\313\342\265\216\271\214\350\227\212\224\236\363\246\224\334\341\313\345\222\366\260\345\362\351\225\365\247\317\306\307\357\337\354\227\354\270\320\362\236\205\301\231\244\342\205\305\261\207\216\215\354\265\373\313\365\201\352\350\312\323\225\264\204\260\267\347\261\223\245\203\362\356\342\353\225\270\263\222\222\247\307\341\242\257\315\226\201\315\245\250\255\352\206\351\267\331\332\201\322\226\321\241\264\275\236\237\354\357\305\323\274\224\267\367\276\360\301\377\300\363\321\257\363\306\222\313\214\317\346\262\267\250\224\300\250\352\302\212\337\261\351\200\236\212\251\202\261\216\205\247\361") -TOPIC_TEXT( -"\304\264\200\273\262\376\225\202\332\345\313\330\255\200\323\210\202\264\352\226\324\321\315\367\323\350\225\261\317\355\362\307\325\262\211\260\272\271\313\257\342\340\213\373\250\362\367\324\372\254\331\353\324\347\232\332\343\307\347\255\244\203\357\245\262\315\345\277\311\355\261\267\373\351\324\362\336\375\225\334\242\216\377\277\377\336\273\307\366\252\363\265\244\233\276\334\203\231\275\365\250\264\370\274\343\356\235\332\336\216\364\366\364\341\344\377\362\337\226\366\354\271\362\257\253\371\226\200\357\371\200\213\247\230\277\317\334\336\333\233\370\356\267\334\270\205\255\220\367\320\326\367\332\242\256\252\204\243\307\370\272\235\334\272\370\260\224\215\233\346\206\373\332\270\221\340\342\232\352\275\346\215\207\366\235\226\232\247\327\214\340\300\332\221\277\267\271\351\361\354\324\240\253\351\261\226\341\217\216\224\204\246\261\305\215\263\230\313\372\361\202\311\217\273\273\273\333\203\320\343\266\307\247\203\333\311\242\377\210\226\236\363\231\267\244\242\255\316\364\266\364\272\327\274\370\361\374\371\301\332\252\211\277\276\261\316\326\320\263\352\334\201\271\342\376\272\256\242\275\255\365\300\213\201\275\342\373\206\374\362\224\356\217\356\217\365\322\242\204\304\360\273\377\230\214\271\273\361\315\320\241\321\343\343\234\347\333\203\334\363\313\325\214\214\201\345\363\217\276\337\307\275\325\317\367\303\211\232\273\312\372\244\345\261\224\211\237\376\235\340\342\365\336\225\347\234\211\376\273\343\340\341\361\336\363\341\251\313\215\323\276\206\365\235\202\225\273\330\232\304\205\220\364\230\266\356\374\327\316\374\237\236\334\270\367\367\302\237\227\242") -TOPIC_TEXT( -"\312\276\304\242\303\320\260\260\344\215\341\233\311\211\247\240\361\347\333\316\246\207\263\363\274\277\257\232\237\231\314\345\206\347\242\236\205\271\212\374\364\244\343\376\357\352\214\315\312\313\215\320\253\230\260\312\367\245\371\236\314\342\374\372\353\257\324\343\246\346\350\342\212\225\236\236\217\214\214\340\333\374\263\262\320\371\244\364\230\276\306\230\253\253\253\362\365\213\376\255\306\302\374\214\314\314\330\276\372\250\343\317\326\226\270\360\262\254\314\276\232\263\367\237\233\304\234\226\321\341\255\200\215\363\321\305\363\315\320\223\353\237\223\337\335\333\275\215\271\365\345\212\214\223\213\233\316\346\351\301\210\372\310\314\242\221\372\205\264\343\371\347\211\206\220\245\367\215\307\277\200\273\215\236\226\214\273\250\204\326\225\320\226\244\304\270\325\266\351\337\251\204\243\244\315\332\343\275\213\210\212\221\220\236\343\331\246\351\265\321\237\237\355\362\261\361\306\253\250\221\313\360\343\341\357\303\340\306\222\210\246\221\240\344\371\222\221\266\230\234\364\223\300\200\313\321\343\320\271\300\275\252\235\331\375\361\233\203\364\330\362\324\300\345\352\251\334\275\355\216\274\210\210\360\205\321\320\253\341\344\246\264\243\307\205\263\370\344\267\340\267\224\264\240\375\233\271\356\300\323\265\225\247\317\303\252\337\316\365\250\224\232\212\364\277\322\271\256\251\261\376\270\360\354\364\330\364\303\346\241\321\333\340\334\235\323\203\373\363\217\277\365\374\207\314\366\375\345\363\277\215\365\377\367\371\377\364\370\350\375\360\303\207\217\336\276\364\252\217\246\336\324\330\333\207\216\327\354\275\320\362\276\336\204\200\226\264\323\315\374") -TOPIC_TEXT( -"\263\324\316\374\375\315\267\315\347\326\377\351\361\273\307\366\376\353\315\345\353\254\252\214\334\275\321\325\217\246\354\222\306\314\243\301\267\254\274\235\242\276\224\210\257\360\204\351\261\253\252\307\307\241\261\206\363\217\237\362\270\261\301\311\224\302\315\216\316\342\266\252\226\233\274\211\201\351\361\223\233\377\372\371\364\237\377\363\367\327\211\277\201\311\306\310\251\233\311\267\303\207\376\216\355\314\356\333\312\302\354\303\276\270\220\347\301\220\327\373\232\310\353\340\312\370\362\226\314\366\275\212\225\334\377\350\233\304\251\270\316\234\251\255\250\272\224\246\326\237\255\373\334\276\200\257\336\274\227\377\266\231\374\336\373\355\265\221\221\221\213\371\371\371\361\223\256\273\346\324\231\227\207\236\353\270\370\351\364\344\340\252\262\202\257\333\217\257\336\371\347\235\255\314\247\267\307\346\223\211\255\213\351\263\360\344\316\201\236\275\376\361\372\267\371\327\300\276\261\265\261\314\263\347\200\202\312\224\201\204\215\306\237\317\372\360\341\275\342\352\252\201\252\314\241\305\275\260\322\344\334\260\323\325\341\307\365\335\330\222\237\367\355\333\360\347\266\200\311\366\274\355\321\203\230\373\326\235\256\213\373\304\305\225\262\375\270\341\367\304\221\204\305\205\271\317\227\255\314\212\253\322\206\325\275\362\324\352\204\267\260\210\277\201\200\364\370\331\360\337\236\376\371\351\377\203\207\231\276\210\260\217\215\233\351\313\207\317\264\257\322\266\342\322\372\276\317\237\254\375\264\371\260\310\262\253\221\277\342\225\241\225\374\333\315\373\326\204\212\211\255\256\366\304\372\214\375\227\222\300\302\364\323\345\222\274\213\255\312\311") -TOPIC_TEXT( -"\305\234\372\213\216\227\216\210\322\200\235\302\206\206\221\305\240\342\306\355\355\231\254\253\213\262\312\304\265\332\303\261\234\226\235\227\226\205\237\213\212\332\261\350\261\325\223\230\277\355\201\333\266\226\207\301\203\272\240\357\274\337\333\325\357\203\205\330\206\374\227\361\354\336\254\331\331\231\316\314\252\221\362\351\376\213\377\257\346\233\315\235\235\232\320\202\204\257\341\254\234\253\245\270\333\326\375\235\252\355\320\251\263\347\267\375\351\261\347\250\223\251\372\370\370\257\225\262\334\224\267\244\346\361\257\334\356\237\341\216\265\211\213\214\274\324\312\223\307\206\220\323\205\365\207\225\245\255\245\355\221\241\246\252\242\307\241\354\334\244\233\325\313\304\245\336\210\224\232\247\203\252\247\352\211\225\202\216\240\215\352\341\210\323\207\272\251\326\251\216\322\264\237\255\242\366\350\263\370\352\372\332\252\301\332\222\372\323\223\213\205\351\315\344\320\320\210\224\373\245\265\305\202\206\323\215\305\277\331\350\261\363\267\351\236\255\254\341\304\363\227\224\242\322\234\304\347\343\264\344\344\204\337\321\353\330\233\346\210\225\263\343\352\310\344\244\301\317\354\340\236\215\346\340\302\350\350\337\276\364\217\312\363\355\301\300\375\370\213\276\201\227\245\312\276\324\341\226\236\373\222\310\246\340\371\361\306\332\321\303\202\272\371\345\264\204\350\260\375\214\213\361\306\235\310\325\225\227\316\314\375\263\334\270\355\220\206\336\214\255\245\355\221\255\373\202\323\343\240\367\302\237\244\327\344\343\246\242\212\222\270\230\210\335\321\230\312\344\211\226\314\315\374\241\325\251\213\226\227\226\311\330\324\336\217\361\362\345\213\202") -TOPIC_TEXT( -"\307\362\320\337\314\277\336\314\351\336\342\202\214\306\362\361\276\271\317\226\367\327\374\352\303\373\305\325\225\241\333\330\225\203\313\220\322\322\233\214\236\235\231\366\307\300\345\236\205\261\214\267\275\276\374\344\201\273\200\277\334\212\344\360\274\377\362\336\210\200\357\337\276\375\315\215\267\336\240\225\233\251\317\257\270\272\221\277\337\274\230\370\221\337\341\204\224\232\276\314\242\313\220\362\233\357\343\276\211\221\365\216\326\306\273\312\200\342\357\206\371\330\323\211\331\200\233\240\355\322\335\374\354\246\267\347\347\334\212\261\336\275\366\312\350\261\371\227\255\244\227\245\334\321\304\242\355\336\356\237\374\324\377\364\335\265\335\224\251\340\262\220\230\215\274\363\310\300\226\251\351\202\205\246\327\321\252\200\231\357\261\323\302\217\325\345\300\204\323\211\324\204\217\363\337\364\340\337\333\315\264\305\212\241\346\313\332\332\205\322\226\321\242\270\275\376\247\374\343\216\312\355\334\312\340\224\257\376\325\373\242\372\274\230\246\350\261\230\302\245\203\376\264\212\202\260\242\362\343\343\327\337\377\235\254\203\257\266\261\314\303\242\223\321\212\207\325\253\214\224\332\253\376\306\354\323\376\331\312\222\332\232\245\264\345\257\262\240\242\331\365\244\231\207\302\332\311\216\324\204\267\374\344\341\206\302\250\246\314\341\331\270\242\305\337\214\236\353\234\351\324\232\275\346\211\311\346\340\245\264\240\267\270\241\251\317\345\306\331\252\226\207\241\363\203\206\330\240\313\351\351\306\253\211\261\270\315\272\244\201\311\263\216\261\242\356\217\270\257\361\335\336\333\275\267\357\300\201\227\257\336\270\374\350\216\355\323\321\302\263") -TOPIC_TEXT( -"\377\241\270\215\200\245\213\327\333\255\310\373\273\277\321\232\234\350\376\320\214\337\371\233\265\334\337\233\370\374\344\334\236\263\234\301\307\307\371\213\337\264\256\351\270\335\325\322\370\241\270\267\234\232\234\362\241\245\224\343\221\251\342\211\327\357\215\365\263\301\360\354\333\367\266\305\274\235\313\321\355\255\244\361\251\265\305\350\250\252\200\361\353\252\342\221\255\202\227\322\343\345\273\377\333\305\310\266\356\370\342\347\247\357\201\373\250\253\230\275\216\327\353\232\315\223\214\244\247\277\216\276\365\323\345\274\366\251\361\211\261\367\257\330\205\274\365\313\326\315\346\205\303\360\217\315\270\274\340\346\366\225\356\206\276\277\226\221\247\350\226\255\246\276\212\247\263\255\313\332\260\201\307\351\251\306\263\330\265\350\337\253\377\353\300\333\266\265\257\264\370\201\213\324\200\236\313\211\306\351\325\261\312\217\251\313\201\263\232\225\261\204\313\221\360\216\220\211\263\206\271\265\324\215\235\206\343\364\340\324\206\322\275\231\332\335\236\251\211\341\340\362\343\202\215\376\373\333\204\377\320\205\226\323\343\357\320\235\276\334\360\264\310\374\307\350\230\300\231\236\357\325\341\266\373\207\275\357\263\321\220\203\277\324\341\206\235\273\331\277\351\263\316\302\337\340\204\253\365\336\374\202\222\244\344\266\226\221\336\232\324\324\216\226\341\240\276\276\316\325\343\307\315\342\223\240\250\357\342\361\345\266\356\370\350\253\331\256\320\201\345\307\363\271\353\211\320\225\215\211\334\300\250\231\317\316\374\341\352\211\261\262\221\341\216\252\241\226\224\351\211\203\370\344\230\352\274\201\342\272\351\202\261\260\307\213\212\226\337\254") -TOPIC_TEXT( -"\272\314\252\232\304\354\277\363\347\316\216\351\211\231\370\312\333\241\332\346\322\325\214\272\216\376\373\242\306\341\302\301\322\343\344\312\261\363\350\244\361\350\227\261\234\220\274\205\324\346\333\273\337\255\220\355\224\243\353\307\234\243\301\341\214\240\324\227\246\321\343\361\371\366\315\217\236\337\273\373\307\245\277\307\300\315\316\216\367\376\370\377\314\255\256\267\274\370\306\326\323\231\264\212\255\300\305\243\374\312\322\304\200\227\336\236\257\345\336\214\225\244\263\307\245\264\211\236\311\315\223\242\270\316\233\223\224\373\252\272\360\344\276\300\304\226\273\322\324\216\237\236\322\353\306\263\211\330\363\327\340\265\305\350\221\244\304\311\342\341\200\211\325\331\341\353\311\333\376\304\216\320\364\330\307\306\364\315\260\233\235\363\247\307\202\322\270\355\341\346\212\244\220\341\356\372\374\335\271\252\244\233\301\362\235\337\367\323\357\242\234\370\203\325\240\321\370\343\252\277\265\310\233\204\303\373\314\212\353\254\274\301\204\357\317\237\276\255\243\254\266\233\241\265\364\212\341\350\204\312\317\325\206\374\357\316\241\311\250\371\321\265\336\210\227\362\224\251\227\211\313\312\262\300\365\321\300\377\226\360\377\240\300\246\224\366\270\340\240\357\274\263\311\362\213\263\231\201\257\265\320\200\305\314\310\360\342\310\331\350\374\213\260\363\311\323\243\243\215\326\342\332\332\337\373\274\233\233\237\322\270\261\340\324\307\247\244\216\237\336\253\261\344\364\264\212\255\370\210\216\361\247\334\334\372\254\356\204\270\200\267\237\350\370\352\237\371\254\212\200\325\344\335\322\372\213\331\223\336\202\352\375\263\315\273\357\257\301\226\264") -TOPIC_TEXT( -"\373\217\372\246\265\215\366\254\351\211\262\247\205\351\201\315\226\370\313\202\320\204\317\332\242\244\370\220\352\300\306\326\222\266\375\210\234\225\322\343\245\356\351\277\206\260\342\351\343\246\371\201\206\342\376\372\212\334\371\303\207\205\206\340\346\350\302\311\300\271\273\265\230\341\312\303\207\231\307\251\241\311\302\242\256\220\205\205\206\326\226\375\250\224\236\233\243\332\222\313\320\233\332\207\351\261\332\303\376\242\266\201\213\362\366\307\203\370\343\370\203\371\337\222\211\357\341\272\303\344\320\256\242\252\264\347\212\315\215\367\370\371\311\202\256\267\234\374\272\212\357\261\372\346\356\322\201\203\223\323\262\366\211\330\314\365\256\320\313\313\272\273\206\363\205\352\355\266\234\261\266\344\311\215\357\366\226\366\374\346\267\277\371\260\363\260\213\256\226\252\320\342\327\300\201\275\345\357\263\265\266\204\356\231\261\236\344\206\334\275\236\271\377\267\327\277\371\376\253\374\372\314\351\276\351\371\237\201\237\311\265\261\300\217\275\356\360\231\262\337\242\320\233\226\366\240\212\351\367\346\306\204\247\373\275\335\314\277\254\205\244\275\367\273\265\247\227\207\224\241\306\272\332\303\324\317\261\250\201\324\242\347\272\275\306\226\221\243\370\240\275\376\376\370\356\312\213\310\273\257\327\226\271\347\262\251\377\210\317\303\262\367\312\373\211\206\253\320\205\311\363\263\331\321\320\342\331\354\303\230\250\251\230\317\303\233\274\210\345\311\204\220\344\344\356\243\234\314\204\342\260\216\214\262\340\211\263\311\264\330\264\336\352\233\205\210\301\275\233\374\351\261\326\214\266\330\231\204\254\205\304\230\212\322\325\223\277\323\347\200") -TOPIC_TEXT( -"\301\277\262\310\350\361\376\213\273\237\335\247\225\232\213\240\272\314\216\316\257\277\337\301\233\265\244\371\223\347\214\226\324\374\245\217\235\327\211\331\365\275\354\336\371\372\244\242\337\343\377\301\201\273\236\364\370\343\235\263\315\237\234\333\303\356\335\274\357\337\276\206\217\367\301\250\302\213\314\236\377\377\227\275\224\224\216\241\351\360\326\334\353\337\310\217\317\237\371\374\277\360\311\357\370\213\266\377\203\313\226\343\236\363\337\366\377\346\317\267\355\373\351\237\336\377\375\377\336\371\202\367\377\253\247\261\216\340\272\204\223\357\376\307\377\205\375\343\350\300\311\262\364\270\211\241\350\251\254\356\325\375\270\351\214\252\355\274\330\262\230\237\365\212\364\340\300\260\215\250\314\263\226\356\226\361\270\240\240\275\226\207\246\232\204\270\252\373\272\376\341\346\306\252\367\360\201\200\232\274\356\270\227\301\231\214\322\313\374\302\241\271\314\360\314\243\246\221\314\211\325\370\351\211\273\341\311\311\305\223\251\267\202\206\247\205\207\206\315\245\333\203\345\236\346\253\355\231\251\243\226\240\226\322\305\322\302\361\330\234\341\250\330\212\206\315\200\375\362\301\220\357\262\351\300\237\242\243\306\206\201\340\350\262\332\230\211\275\336\316\225\355\225\205\212\325\202\217\220\300\317\215\327\237\201\256\304\366\305\357\366\366\376\334\376\323\207\316\332\361\273\256\316\335\357\375\376\230\240\351\263\256\322\226\222\346\365\245\274\265\352\336\305\363\222\377\300\322\303\375\375\327\326\276\377\323\206\207\300\327\377\234\320\363\346\340\311\215\266\377\350\270\376\340\300\336\375\320\340\340\360\341\275\330\205\214\253\227\257\341") -TOPIC_TEXT( -"\316\337\331\217\336\272\244\267\247\371\223\232\316\214\252\342\216\246\324\325\365\242\214\376\357\244\327\307\240\301\244\275\340\302\364\234\261\347\334\374\364\215\325\253\337\377\225\330\257\276\205\302\244\230\260\246\261\223\362\243\230\254\250\306\277\376\266\253\200\223\301\242\307\332\253\364\240\206\266\351\325\200\236\234\211\344\226\336\353\222\302\275\306\261\212\356\322\215\337\277\214\226\254\301\255\242\345\345\264\330\273\333\370\340\232\352\327\275\211\263\331\313\222\267\213\270\220\220\236\263\307\215\235\211\340\374\345\357\224\324\327\345\226\217\335\262\357\344\310\243\304\225\201\336\263\370\265\267\317\326\312\220\265\277\374\371\342\345\351\223\346\377\323\266\312\207\255\366\205\204\272\230\216\362\230\242\324\261\300\306\355\252\236\235\365\250\255\362\312\205\342\246\254\263\373\332\333\332\313\346\370\215\210\275\376\254\345\323\326\240\353\317\346\306\275\351\347\361\321\243\307\350\336\213\214\337\277\365\321\211\266\346\233\351\220\317\316\355\201\347\204\326\313\207\370\210\255\312\353\324\260\256\213\360\276\337\262\224\345\322\266\306\327\336\277\370\214\254\217\277\221\236\215\203\200\203\337\262\262\314\333\201\204\271\207\362\211\260\314\337\206\223\205\217\227\336\236\223\271\223\240\312\200\247\331\205\236\217\376\264\337\330\331\240\232\273\325\370\344\232\210\251\242\216\304\257\303\243\373\346\253\300\334\322\325\367\367\354\325\344\213\247\371\357\320\333\214\214\215\211\303\254\317\265\346\263\210\203\201\351\212\261\353\355\361\305\274\206\220\311\373\217\375\347\361\315\270\337\207\302\324\316\213\203\367\270\307\322\224\256") -TOPIC_TEXT( -"\226\322\204\331\274\235\331\350\370\371\304\351\321\252\370\254\277\231\231\347\234\274\265\345\333\231\200\347\325\337\326\231\346\313\230\365\304\205\331\202\264\326\260\313\236\227\376\316\215\245\203\252\363\243\211\235\363\317\366\332\377\212\272\205\320\343\365\206\217\367\364\375\324\241\277\372\223\277\252\343\343\346\214\221\262\345\266\322\372\274\375\362\340\300\344\306\340\341\217\314\310\233\313\226\212\333\311\250\212\212\214\377\374\266\210\311\255\235\242\213\255\226\263\246\325\356\246\373\230\201\205\377\354\245\325\251\205\214\324\313\256\316\345\350\272\302\345\375\223\331\321\260\264\307\233\240\276\340\302\256\300\342\372\333\251\271\363\323\377\225\324\222\213\223\236\203\263\223\334\316\353\364\230\306\356\254\324\303\312\206\211\252\351\276\203\372\321\236\226\251\221\241\353\370\224\373\306\275\334\334\353\310\320\342\230\272\222\224\244\354\265\240\347\247\276\330\311\270\251\245\276\275\226\233\304\222\201\351\261\323\357\350\247\324\304\241\312\372\214\323\236\232\217\225\202\306\370\246\312\335\301\306\232\335\244\276\272\231\365\213\253\257\250\323\227\234\372\350\204\365\214\340\233\244\275\277\377\240\332\257\255\362\305\217\252\242\310\316\207\336\257\224\236\313\265\220\214\255\364\314\262\240\315\347\315\366\370\246\340\375\377\375\302\233\255\364\310\321\350\361\224\263\337\202\260\247\325\224\334\337\344\310\353\361\344\267\215\327\231\264\312\344\261\212\305\255\256\370\312\242\322\374\322\226\367\207\274\232\271\263\211\250\266\231\320\366\316\370\276\354\244\307\240\265\214\211\372\213\335\265\347\354\370\213\324\377\203\302\254\223") -TOPIC_TEXT( -"\240\311\324\214\227\223\255\243\261\276\330\342\370\331\243\307\352\246\203\377\347\235\367\315\216\351\371\312\252\222\217\321\201\372\306\336\275\325\317\373\215\272\350\311\360\322\335\354\317\245\246\302\344\233\330\247\204\264\267\243\275\263\327\372\357\367\216\207\255\262\302\242\226\204\327\247\307\264\354\302\247\245\235\260\325\322\343\274\233\300\247\216\273\242\356\270\210\270\242\231\217\214\253\225\250\224\241\330\351\251\261\211\261\210\372\216\364\322\367\355\333\267\312\236\305\375\373\355\371\364\244\370\352\237\372\356\335\270\362\371\374\203\200\304\270\245\357\271\271\361\304\311\214\214\354\215\217\370\254\277\227\235\241\360\211\235\277\230\330\365\227\350\340\301\322\313\372\212\256\255\372\372\272\234\267\362\210\237\337\351\321\350\216\367\323\247\227\257\337\250\271\206\303\301\253\314\352\345\245\325\360\204\303\265\306\275\262\272\261\326\273\264\241\253\305\210\211\266\260\262\263\235\257\361\250\205\210\360\301\253\317\325\212\232\233\363\230\374\207\340\215\204\215\324\324\274\314\262\316\361\217\244\332\307\373\354\357\351\371\240\206\317\301\215\341\323\220\275\206\245\306\355\376\305\325\232\236\377\246\207\370\226\223\240\314\230\357\271\221\221\241\352\235\342\251\340\271\315\220\322\213\356\276\276\347\336\240\246\237\216\245\337\246\320\305\242\316\221\220\236\244\263\373\213\225\250\350\302\221\346\224\203\265\233\233\224\213\323\322\224\310\226\315\216\342\210\353\337\321\337\230\233\376\236\357\372\251\243\341\303\225\202\367\304\367\327\366\267\305\235\271\271\356\262\263\351\365\367\242\200\301\343\200\321\370\343\317\345\205\204") -TOPIC_TEXT( -"\216\361\377\323\376\376\306\246\320\302\366\371\271\314\216\273\244\265\266\312\222\251\270\324\361\266\226\225\274\312\244\306\351\344\265\347\230\366\364\332\244\326\217\310\222\365\301\243\210\240\334\247\347\354\246\276\262\223\211\230\200\306\300\275\300\270\257\301\223\323\303\225\305\375\275\256\242\340\217\204\210\365\277\340\236\237\370\377\265\260\200\261\261\372\317\312\244\330\254\313\352\213\230\320\221\363\231\205\272\324\223\227\327\337\332\340\272\212\356\256\263\271\244\314\307\317\375\253\275\250\242\213\354\245\333\237\244\256\254\200\306\227\313\214\343\251\206\363\241\345\274\253\273\377\222\362\356\325\336\236\277\275\370\356\356\354\314\273\364\270\313\275\365\312\331\237\262\213\261\345\205\214\235\253\330\240\305\264\320\374\214\237\257\316\373\251\261\337\326\224\304\300\325\340\360\360\252\223\254\240\365\203\311\232\250\322\317\231\244\277\241\223\374\361\246\225\365\262\374\376\374\265\340\306\377\363\360\301\364\303\241\252\303\322\364\222\252\213\202\202\370\241\227\254\345\273\340\303\366\232\231\364\244\212\264\271\312\223\357\210\246\357\244\376\262\320\363\201\266\322\324\343\233\370\300\346\347\245\220\255\276\327\273\345\365\326\344\344\233\252\317\267\213\272\306\300\220\372\274\262\262\362\370\261\351\367\244\277\313\314\256\352\366\253\254\325\221\310\212\345\206\341\201\373\277\210\263\340\214\245\204\245\200\375\245\212\352\344\234\266\245\354\276\312\277\303\337\224\240\266\226\205\241\233\222\342\302\376\344\337\236\376\307\300\354\201\203\373\307\357\337\355\222\327\267\237\334\345\311\217\357\365\366\377\252\370\375\333\377\337") -TOPIC_TEXT( -"\361\254\237\226\367\333\337\376\203\253\363\200\224\215\235\253\240\320\227\242\351\314\236\225\236\377\217\375\365\327\323\263\263\362\265\277\342\270\230\274\227\266\227\340\301\253\314\232\365\371\321\244\215\313\201\322\257\321\216\334\320\211\242\246\373\201\261\265\252\252\275\370\323\376\376\334\244\270\211\211\234\230\240\367\263\315\321\360\263\357\223\210\272\205\264\306\327\346\277\314\226\227\271\232\324\334\320\227\226\333\301\362\243\242\310\225\327\340\327\261\216\237\365\370\377\337\204\350\370\371\257\216\320\343\224\367\307\254\331\352\232\301\253\346\245\375\240\234\317\204\224\241\343\231\307\341\311\204\377\231\232\271\326\372\253\337\206\223\275\201\363\335\322\277\262\251\232\313\335\275\374\371\202\246\231\201\257\260\321\224\300\361\313\237\200\353\215\244\340\230\320\203\324\217\312\254\271\332\305\345\355\327\321\277\310\316\336\347\326\323\206\302\343\360\325\360\234\344\371\364\370\320\343\211\300\232\337\353\357\203\303\366\365\377\225\263\330\336\305\213\206\227\250\345\210\236\272\326\276\361\241\345\374\362\362\262\217\213\332\310\321\344\365\310\312\322\331\367\336\371\207\304\217\230\332\211\340\325\246\375\241\350\261\325\231\322\301\247\300\326\372\334\203\364\365\356\205\302\355\215\367\260\360\266\227\241\213\245\344\234\374\367\235\246\375\253\245\274\341\274\357\361\334\275\340\200\365\365\373\257\362\351\356\212\320\352\256\353\352\245\363\266\335\257\266\242\210\262\202\260\352\227\367\213\370\260\345\351\361\355\317\376\341\262\231\367\301\250\342\257\371\263\326\345\343\311\314\233\320\244\257\374\245\375\217\252\304\260\353\342") -TOPIC_TEXT( -"\247\321\246\337\306\226\211\265\302\314\374\336\255\205\266\251\360\244\337\236\207\261\337\345\247\363\241\244\261\244\247\252\321\325\215\315\207\362\212\361\201\317\372\346\256\352\335\262\340\331\357\362\253\306\212\361\201\266\377\266\315\375\256\204\316\275\346\302\217\245\240\310\251\274\377\274\314\304\360\217\327\277\334\205\267\356\372\251\203\223\276\255\315\315\230\343\377\223\302\346\261\274\265\364\234\256\340\346\264\373\317\314\205\240\306\346\230\372\207\362\327\234\212\354\230\231\204\236\353\325\320\246\305\370\314\325\204\335\274\254\311\271\351\375\356\331\245\310\222\247\372\264\207\243\210\373\273\277\321\332\226\263\274\243\327\360\371\311\271\275\245\343\367\376\346\255\367\246\314\276\261\316\257\356\367\265\266\334\374\242\311\320\321\361\265\236\243\237\377\365\257\330\272\212\300\234\214\237\273\370\317\245\301\345\267\240\354\222\320\322\321\312\276\321\320\364\370\303\206\201\346\314\213\327\234\373\201\271\335\325\273\305\337\361\314\225\320\230\260\365\374\247\241\342\311\232\226\303\303\232\305\325\211\325\331\221\355\235\232\264\352\227\213\370\267\260\311\350\261\223\232\211\326\246\323\211\226\202\363\344\262\376\316\373\273\355\216\275\366\327\205\257\252\315\305\343\306\242\244\312\333\334\374\373\344\364\271\217\263\347\347\316\207\235\333\267\357\227\343\201\221\320\211\325\243\252\371\205\342\270\214\203\257\314\203\216\361\222\327\343\221\326\305\306\204\210\351\260\346\304\240\374\211\306\361\353\235\274\333\331\376\322\327\271\272\272\242\375\217\204\264\227\245\312\355\214\200\376\310\335\233\246\267\361\377\250\271\267\247\213") -TOPIC_TEXT( -"\261\334\267\257\277\332\375\361\342\205\263\206\224\313\231\222\317\344\314\247\300\214\233\233\233\211\233\223\307\277\300\244\217\303\277\236\237\315\370\207\216\307\222\236\370\331\336\224\202\272\320\326\270\272\314\221\203\327\277\225\232\222\216\233\243\307\214\355\260\316\234\356\367\210\204\330\345\222\231\374\334\211\267\346\260\254\244\363\373\330\321\374\335\332\352\205\254\365\370\327\233\261\203\235\372\343\207\357\277\307\256\206\276\261\327\216\231\240\336\214\360\202\353\305\211\236\230\265\340\344\306\366\244\322\211\206\373\321\314\246\337\272\266\262\337\220\305\361\227\371\242\333\212\325\363\321\340\356\363\324\363\325\232\230\262\311\370\333\272\377\263\251\224\233\323\214\255\235\350\273\253\206\250\222\337\336\277\274\243\276\336\262\335\215\327\213\370\260\351\350\261\365\367\256\376\361\336\264\241\371\241\217\332\234\212\367\260\322\321\225\254\202\326\270\340\245\312\354\231\204\257\370\270\371\347\240\363\316\200\226\337\262\351\276\360\254\273\240\257\236\252\235\227\252\223\351\210\321\304\255\203\271\240\244\374\257\374\255\346\332\214\364\252\324\252\327\345\255\364\226\220\240\350\260\326\253\226\205\216\341\342\332\240\272\214\340\330\341\352\216\374\271\263\261\346\263\346\250\244\272\266\265\364\275\246\331\345\312\252\275\276\362\361\371\222\353\336\370\247\230\344\311\336\336\347\255\237\202\364\236\343\244\324\313\251\211\275\341\322\241\343\202\301\362\274\225\365\242\321\215\322\373\274\330\257\206\234\227\223\345\224\357\350\376\203\272\302\332\231\305\311\315\223\363\364\345\377\303\267\354\323\325\376\250\207\251\364\370\237\377") -TOPIC_TEXT( -"\367\324\266\356\351\324\313\310\244\326\320\210\217\267\245\221\300\200\317\337\202\302\221\271\213\315\377\240\267\260\214\243\201\254\326\301\242\307\202\334\274\353\204\310\320\341\203\355\257\261\301\337\204\377\255\364\360\222\224\362\224\317\203\267\345\203\275\236\237\267\337\371\323\217\305\375\255\327\252\273\341\324\201\245\260\276\260\324\250\360\231\317\256\374\350\202\240\330\214\241\360\272\325\332\336\330\257\370\241\336\351\261\311\255\334\311\357\220\366\270\345\231\304\275\372\314\344\354\331\343\221\303\201\253\334\260\374\317\210\366\352\220\244\342\256\267\332\241\351\316\231\251\321\254\350\326\375\375\271\365\300\350\374\261\370\346\353\257\277\256\375\346\264\201\210\362\305\264\360\370\202\260\306\307\267\330\327\244\251\214\236\263\245\276\275\302\312\304\274\213\236\203\234\330\233\276\242\325\200\306\271\350\305\300\306\253\271\226\262\360\276\270\214\274\351\216\326\240\275\222\357\245\266\246\374\361\201\343\204\244\304\232\342\375\301\346\365\353\271\331\277\331\241\322\343\262\355\347\301\262\223\264\363\203\261\366\277\314\313\233\237\315\214\274\210\230\230\234\270\273\266\262\357\330\333\363\263\347\350\270\333\257\247\220\363\254\366\343\336\227\246\227\237\314\257\314\271\317\374\377\375\233\256\233\366\347\326\315\231\326\376\340\276\274\377\352\362\345\313\367\242\356\337\376\325\254\262\334\255\225\311\326\221\204\330\211\200\342\232\262\316\343\365\322\351\352\313\226\212\366\315\314\276\244\233\244\214\323\222\306\353\320\337\335\333\375\360\335\263\223\352\335\235\234\226\265\345\243\231\360\204\325\223\270\210\201\353\352\320\213") -TOPIC_TEXT( -"\213\355\272\310\341\300\330\320\222\265\217\246\251\310\305\242\200\343\257\321\242\243\300\347\342\217\215\254\270\300\370\371\251\324\211\312\346\315\323\217\223\333\302\255\206\214\362\273\265\223\334\227\306\261\262\272\366\265\203\273\214\240\207\314\370\244\276\263\257\362\220\376\361\234\276\226\344\370\352\263\247\340\327\310\367\207\267\254\204\214\256\267\267\260\204\357\357\274\326\370\344\263\346\331\222\254\241\315\262\344\213\237\324\227\264\275\346\251\216\336\300\311\217\211\243\225\373\262\350\240\271\343\201\351\255\274\353\321\224\320\250\244\245\231\315\242\303\272\330\272\274\331\222\353\240\350\243\200\322\212\346\251\245\321\343\220\317\320\320\302\230\325\334\245\302\214\271\214\305\333\312\301\337\220\324\346\300\333\341\331\376\205\236\313\243\250\262\360\354\255\227\312\304\363\255\340\233\360\241\330\303\322\236\374\330\353\254\337\376\342\363\310\330\265\374\254\216\252\353\340\244\226\352\271\225\351\240\341\334\361\272\206\374\267\266\343\306\340\306\246\257\215\233\247\352\230\264\274\253\252\277\340\226\216\231\232\236\373\353\360\341\275\227\332\217\316\307\261\307\300\232\223\367\317\311\245\334\234\235\232\373\303\357\267\225\275\325\323\207\204\215\313\352\336\223\224\202\340\220\321\313\373\360\343\367\206\224\205\275\326\273\306\241\330\223\276\341\336\242\242\336\372\354\371\302\221\265\376\361\350\201\242\375\215\304\377\302\370\315\200\212\312\332\253\227\345\241\200\241\343\253\206\204\362\233\212\321\342\202\364\347\232\213\310\233\306\216\360\333\346\314\340\313\342\334\246\360\377\344\322\226\371\362\306\261\240\274\361\212\213") -TOPIC_TEXT( -"\264\366\230\343\245\334\263\374\212\241\360\367\376\356\303\210\200\266\321\305\226\301\235\321\343\220\215\314\232\324\233\340\270\272\334\370\351\351\371\231\311\223\310\236\317\277\364\326\345\220\344\362\223\233\333\367\301\327\231\323\302\257\205\232\262\246\262\314\261\204\271\247\320\343\322\341\247\334\326\304\230\316\341\306\334\252\251\353\316\350\325\261\306\217\265\327\202\336\333\223\301\365\265\334\253\211\236\236\253\215\265\265\331\372\374\334\212\376\364\330\364\251\357\210\312\260\302\237\323\231\202\261\220\341\320\342\251\235\206\202\252\334\364\346\217\350\273\363\370\350\304\205\316\301\210\362\222\254\236\316\272\327\260\251\275\356\250\326\376\320\225\265\223\246\237\205\212\226\275\244\323\357\204\233\314\373\261\301\277\356\314\230\342\352\350\364\242\230\231\321\235\361\227\324\336\207\206\215\340\343\261\361\255\225\275\356\350\233\306\367\274\362\320\244\224\354\253\270\201\334\223\370\310\235\252\230\237\322\342\207\343\364\343\217\361\234\324\311\236\254\315\331\334\271\320\343\231\362\314\313\253\344\322\226\226\202\356\272\242\307\351\211\275\316\234\346\307\347\246\307\345\274\370\270\275\326\301\234\301\364\373\374\251\350\261\272\272\302\225\333\232\215\205\300\321\231\342\201\306\270\357\356\270\211\307\225\242\307\334\366\377\261\264\306\203\325\216\270\251\272\211\256\343\200\253\266\340\216\341\351\256\215\354\367\272\203\302\343\270\226\310\201\210\252\350\246\264\372\254\265\326\350\211\261\351\337\200\215\313\374\367\307\306\201\350\351\361\330\315\310\340\220\320\361\360\257\233\343\212\360\263\263\203\207\233\361\273\353\273\245") -TOPIC_TEXT( -"\212\206\311\306\261\247\302\310\365\336\212\365\375\312\260\264\244\356\342\235\350\213\234\270\260\227\276\377\360\362\245\335\377\362\257\262\245\241\350\262\341\203\322\354\266\326\342\254\354\272\276\231\326\251\375\372\346\220\204\233\223\314\256\254\213\246\221\255\360\337\341\207\350\302\312\276\360\344\364\232\312\275\261\307\264\225\251\270\347\323\321\316\247\253\344\364\276\361\351\275\221\223\272\206\246\234\240\320\371\250\214\353\210\335\220\271\237\212\374\337\247\352\350\275\266\266\263\313\264\272\231\226\332\336\211\320\343\255\357\273\344\343\366\273\211\357\276\256\213\364\240\216\350\361\365\300\304\271\232\340\321\304\220\200\270\260\363\227\250\274\224\216\301\217\211\276\367\203\240\222\377\327\233\255\230\336\241\307\200\257\357\331\322\333\345\307\315\217\216\200\274\351\273\311\255\322\362\357\260\254\262\323\256\370\343\244\275\200\260\357\337\350\251\213\263\201\340\226\247\371\346\203\315\265\310\200\367\277\266\327\371\257\335\334\357\265\306\262\201\342\306\354\240\331\227\254\277\231\325\257\376\317\254\314\276\364\260\264\314\313\220\307\337\377\343\257\257\347\227\353\202\200\242\367\371\267\356\357\275\362\363\362\370\207\300\343\211\223\356\264\257\320\212\312\227\242\357\307\261\206\216\325\214\217\305\336\347\351\220\315\350\201\315\277\331\366\337\205\204\337\351\222\247\365\274\360\257\220\364\354\312\366\265\216\237\373\350\222\263\343\252\272\241\375\367\272\231\240\247\250\307\262\220\227\265\210\320\250\335\222\312\352\271\201\331\327\224\261\336\354\342\312\310\214\236\207\215\310\303\301\375\331\244\371\322\234\230\362\302\325") -TOPIC_TEXT( -"\234\347\227\274\366\332\353\224\333\350\301\331\245\332\335\313\255\257\261\204\217\202\263\273\244\377\236\274\227\370\356\262\310\217\373\352\205\236\263\273\235\370\312\346\344\267\252\251\330\220\213\327\204\377\271\261\317\320\337\237\254\272\317\325\273\226\361\227\226\265\343\201\347\317\300\327\315\263\267\355\370\361\275\342\371\336\315\204\322\274\337\334\260\340\263\225\245\237\202\205\321\300\363\230\260\233\335\224\273\323\375\206\310\314\265\273\226\347\262\331\251\301\227\265\367\224\206\252\254\236\356\210\373\366\355\213\270\210\356\304\217\315\324\274\323\345\345\270\346\241\343\225\232\320\341\202\242\204\274\207\253\361\315\312\220\260\222\362\322\307\257\313\244\307\327\377\370\261\223\362\240\356\333\347\257\343\364\223\223\232\206\314\307\373\330\227\273\204\355\265\357\323\336\317\230\271\331\361\235\254\256\350\253\357\325\243\300\271\304\371\213\255\264\217\305\304\340\225\324\307\334\365\253\303\331\363\235\237\375\306\235\245\224\300\217\347\350\357\207\235\317\243\342\217\232\327\342\312\273\347\246\346\362\211\357\256\273\213\364\240\375\364\230\345\330\240\246\263\353\212\273\265\333\220\204\240\270\343\326\220\221\245\274\313\305\210\367\223\303\250\257\247\245\326\261\233\344\235\215\375\377\331\354\265\244\376\315\341\262\223\303\343\221\303\305\247\333\327\330\200\351\307\316\322\376\261\347\351\326\362\236\236\200\342\233\200\342\361\361\223\320\217\212\230\374\211\224\302\266\356\376\307\321\267\334\220\363\344\333\256\375\201\215\300\311\325\225\243\277\215\264\347\306\274\262\262\224\330\332\324\232\313\242\262\203\242\331\227\324\211") -TOPIC_TEXT( -"\260\341\263\272\232\210\275\306\234\307\354\223\203\230\271\260\223\344\347\261\216\226\236\217\334\353\330\313\260\364\254\202\302\213\373\256\316\335\302\220\361\353\244\207\216\354\215\327\210\304\306\205\265\243\311\235\257\223\250\236\237\273\333\232\355\363\226\301\253\210\307\370\263\275\260\326\227\225\276\314\232\243\355\324\266\247\337\233\231\361\223\333\310\303\223\226\233\267\262\224\235\242\302\344\241\350\315\364\230\264\226\316\304\324\367\324\371\323\340\377\202\230\341\226\236\333\204\301\312\351\323\261\230\230\270\212\243\256\225\347\220\244\352\203\346\347\267\352\270\261\312\315\232\311\215\332\350\301\306\302\341\254\347\227\200\211\357\333\264\364\260\330\365\316\246\230\372\321\350\337\311\374\367\372\273\371\363\266\375\332\373\333\374\314\321\344\334\356\202\273\242\301\346\244\246\364\200\204\230\232\333\234\202\207\340\344\375\354\334\231\341\313\205\372\364\211\261\322\343\274\270\346\262\357\376\201\301\211\253\217\261\233\223\346\344\206\344\246\306\353\370\234\272\226\214\217\336\327\336\230\362\362\242\253\306\250\324\332\350\321\320\314\364\253\224\275\212\276\275\235\235\315\376\347\326\351\361\273\307\366\264\236\277\367\345\203\313\310\265\301\305\325\227\367\325\300\322\254\221\205\276\306\356\364\230\377\220\275\355\347\235\367\315\325\345\353\305\221\216\233\376\235\355\221\332\304\212\342\223\340\240\277\333\210\274\224\333\225\276\272\305\370\260\307\343\245\240\374\251\232\254\325\217\265\364\244\307\346\366\211\254\266\265\361\335\345\221\236\273\244\234\236\223\254\212\326\335\237\257\334\251\317\367\212\307\265\317\366\207\256") -TOPIC_TEXT( -"\220\354\326\224\245\370\234\270\222\360\347\336\307\213\271\206\245\361\265\351\230\272\375\221\244\256\364\257\255\242\215\243\307\323\214\217\213\346\344\204\211\217\264\306\244\260\274\233\365\373\212\356\202\232\311\270\270\222\357\325\313\271\314\260\346\343\241\323\344\312\365\244\272\340\357\256\326\330\360\300\343\211\355\223\255\315\315\240\311\370\232\353\226\236\343\230\232\251\335\234\203\302\226\253\371\327\214\220\211\244\242\364\360\243\227\342\223\307\213\367\204\234\332\353\223\236\233\241\343\234\362\211\342\365\374\364\350\221\336\232\377\273\301\376\336\320\247\376\313\227\336\245\353\321\316\350\201\231\325\270\332\370\334\270\225\304\376\217\306\307\246\244\233\222\261\377\260\323\331\206\352\231\255\255\310\310\225\352\223\336\264\351\242\356\230\304\346\263\206\232\325\267\272\206\331\263\324\214\325\321\254\266\337\264\325\316\343\223\233\204\327\221\350\245\226\242\304\217\205\317\337\260\352\246\263\201\200\200\360\344\351\362\374\336\312\262\252\374\231\313\324\312\366\211\326\327\322\313\364\253\251\225\335\362\345\215\213\301\304\367\227\305\372\320\342\227\364\230\275\304\221\342\243\363\215\214\257\212\355\265\351\212\214\346\201\340\206\210\322\371\225\341\361\322\343\254\307\204\327\210\246\363\325\375\314\344\250\343\327\314\340\236\275\257\355\320\270\252\213\277\220\333\331\322\253\216\261\374\325\252\206\234\213\245\303\212\365\256\227\205\206\323\343\240\305\307\202\365\253\215\342\236\335\314\361\251\364\232\236\320\275\320\200\304\351\213\317\256\356\341\244\263\343\373\376\345\224\255\316\217\227\347\262\270\264\237\210\234\217\332") -TOPIC_TEXT( -"\213\206\206\364\254\314\227\207\265\306\367\334\364\370\267\277\371\315\276\334\366\255\332\207\216\205\247\323\231\261\323\237\235\370\343\367\330\336\356\206\321\325\252\331\220\371\200\274\207\333\306\347\202\336\356\246\275\346\355\374\322\205\241\375\300\200\212\363\251\357\315\364\217\317\360\307\262\346\251\242\261\320\304\362\241\231\365\227\276\215\354\274\201\334\212\253\200\253\215\335\243\232\273\332\356\341\277\311\323\314\255\354\300\207\352\345\210\205\313\216\376\305\264\304\254\266\240\352\205\236\340\313\247\221\374\225\234\326\327\244\307\376\205\202\251\215\324\360\224\352\353\216\313\214\356\332\336\277\260\352\233\320\212\343\315\204\346\364\361\360\235\224\270\263\343\262\345\220\367\241\334\303\207\224\225\212\315\265\205\257\353\252\323\261\322\310\214\211\320\345\330\223\210\312\252\305\327\317\235\275\205\267\356\264\264\267\343\234\366\243\355\255\327\370\307\323\307\266\235\311\202\275\240\211\334\233\227\352\242\346\222\336\316\263\343\243\367\351\221\326\223\327\263\213\234\262\354\373\300\234\345\272\327\200\270\326\257\324\322\210\332\274\233\231\332\257\245\272\306\372\353\246\302\272\366\304\373\333\253\376\220\251\275\272\210\214\237\276\271\364\366\270\306\316\242\362\327\211\374\221\322\364\270\357\237\306\264\325\333\273\226\306\333\306\267\264\311\301\355\204\371\336\364\252\247\325\340\231\212\373\310\262\240\332\313\260\362\300\254\326\246\301\226\205\342\327\327\235\275\216\342\204\374\334\221\370\342\217\267\353\366\272\212\242\307\216\323\255\325\335\337\336\230\354\232\230\242\202\244\332\307\307\337\270\302\246\371\311\340\334") -TOPIC_TEXT( -"\355\246\303\216\214\345\362\374\327\213\237\373\347\300\350\224\254\202\355\356\215\250\313\342\244\345\335\332\335\256\226\305\301\264\212\225\312\244\276\345\373\353\251\351\346\341\242\336\350\261\374\315\332\234\242\201\355\216\342\342\221\210\307\251\361\340\364\323\240\330\361\305\311\216\230\221\275\246\241\225\354\326\244\256\242\302\244\314\322\264\203\306\323\204\306\334\350\300\363\310\271\240\246\311\330\335\323\224\253\376\226\205\347\300\320\260\246\361\251\253\337\315\277\317\317\250\311\203\311\202\341\224\251\263\261\274\223\235\270\200\361\342\327\340\376\360\301\320\232\253\333\201\264\257\350\310\217\275\226\244\257\200\262\225\245\211\352\217\305\200\204\331\340\322\343\321\235\237\262\276\274\267\222\327\210\352\316\260\330\337\213\253\224\377\206\324\302\310\323\343\205\273\301\273\220\214\271\301\357\267\335\231\334\346\343\263\315\364\340\366\336\336\374\213\377\210\255\363\325\216\332\320\364\344\245\320\246\311\357\211\260\265\370\237\231\206\370\263\371\323\335\301\313\310\361\335\326\245\212\225\231\223\207\347\316\342\350\324\310\377\212\342\232\361\243\355\315\273\222\350\362\371\341\345\341\341\221\225\352\205\216\236\323\360\226\342\244\317\322\372\354\337\240\330\361\225\211\303\232\275\226\342\223\244\207\272\344\275\352\306\200\343\227\310\245\262\334\325\274\202\220\256\310\245\225\346\274\336\351\314\321\316\234\367\325\305\236\276\222\211\252\260\260\255\263\265\233\271\224\312\272\245\226\315\222\273\376\352\200\260\313\362\305\347\227\236\214\336\362\253\350\207\262\343\351\361\201\254\316\226\232\267\346\244\260\244\331\361\305\264") -TOPIC_TEXT( -"\364\370\344\352\342\330\263\364\334\325\202\331\201\362\243\326\314\347\213\306\300\255\325\260\362\270\273\206\314\212\313\211\374\205\201\260\254\261\233\321\245\261\351\362\236\237\324\227\274\227\351\220\333\275\276\345\221\350\255\200\260\225\325\276\241\340\257\272\300\251\353\307\217\230\272\274\263\236\225\267\261\226\326\374\331\312\201\344\252\341\227\322\343\201\302\326\317\366\233\254\242\263\331\302\242\234\333\352\205\236\223\216\322\314\210\320\252\372\354\323\240\230\234\243\264\301\320\222\341\345\243\315\324\230\343\200\315\216\302\301\217\231\306\346\244\231\341\364\230\254\250\336\332\263\304\260\315\233\337\311\266\344\232\317\347\226\226\360\340\232\313\237\234\224\347\272\272\343\373\321\246\314\235\224\200\263\340\374\225\211\262\223\303\257\211\364\225\355\255\203\375\267\376\247\306\206\266\270\374\230\212\320\315\253\264\242\262\211\374\272\327\334\354\354\210\220\234\236\353\246\307\251\212\235\322\357\330\316\267\214\254\216\366\226\313\213\205\377\207\212\332\214\337\230\230\215\257\322\217\350\267\361\243\343\246\275\223\226\320\261\230\251\247\251\303\365\227\231\353\260\203\343\210\332\350\332\205\210\222\324\310\237\263\334\362\365\232\342\340\213\330\312\257\234\330\253\245\262\210\201\233\275\275\342\217\211\231\370\306\330\354\205\231\324\221\275\336\271\363\247\253\213\346\370\322\343\377\202\201\301\252\275\226\205\205\250\346\261\335\310\301\356\231\243\273\307\232\276\236\364\330\264\311\201\221\372\314\252\354\370\334\212\243\374\321\247\313\213\352\361\207\204\371\367\360\213\241\330\252\354\266\376\227\321\372\361\247\330\224\231") -TOPIC_TEXT( -"\203\226\342\365\250\215\257\337\276\220\244\264\306\264\214\342\216\227\216\204\315\215\215\240\316\254\367\257\366\305\347\227\306\206\326\207\254\270\202\347\303\356\365\341\203\317\232\213\222\243\232\267\363\350\244\366\274\331\261\255\250\235\274\202\352\311\201\217\347\363\323\251\217\235\341\253\200\303\276\372\364\210\223\306\220\277\276\333\224\374\360\215\215\211\371\273\231\364\334\270\210\351\272\335\277\354\372\323\360\316\203\326\237\365\222\264\254\350\360\231\244\271\335\260\270\271\211\365\261\245\223\313\365\230\254\215\325\263\377\343\323\313\260\360\307\360\361\203\337\360\213\305\215\324\360\352\324\254\352\203\200\364\206\330\322\301\352\234\255\241\270\275\246\331\245\276\302\321\212\352\376\212\211\365\202\224\202\210\246\233\214\246\367\224\322\207\261\363\201\263\345\272\326\237\351\245\254\302\325\225\242\262\201\221\227\232\371\365\260\251\355\234\225\317\364\301\264\241\201\260\350\352\310\355\270\340\245\315\216\263\203\240\241\206\233\234\227\262\317\260\265\273\347\276\341\365\365\257\337\300\212\351\352\326\363\353\331\206\244\355\325\206\305\244\261\241\202\335\331\314\317\314\367\372\220\344\365\223\300\354\377\230\374\227\270\377\224\320\327\343\313\227\366\203\237\356\242\323\206\303\207\217\202\372\272\211\320\222\374\231\342\231\276\234\337\231\354\204\320\343\220\356\360\346\352\264\256\302\317\307\202\351\314\230\230\262\372\370\276\325\312\220\231\222\276\326\373\315\306\325\204\303\242\303\371\264\223\252\301\305\345\261\261\376\266\342\371\322\352\254\327\204\205\231\342\215\231\303\274\276\255\215\230\243\243\223\362\311\214\331") -TOPIC_TEXT( -"\270\272\233\275\346\322\253\257\200\215\233\306\246\312\270\233\365\314\337\360\257\343\313\270\324\313\221\246\330\324\212\271\303\372\243\332\247\330\330\304\216\312\327\243\307\314\205\253\331\314\342\244\223\253\331\207\244\322\366\201\304\317\263\224\272\372\266\354\271\232\362\303\317\326\323\226\264\352\243\313\313\213\203\241\377\257\270\306\256\263\247\354\312\253\306\265\320\231\210\314\332\272\206\320\304\206\257\306\267\231\226\250\346\236\363\244\304\324\334\323\230\335\262\263\337\220\373\243\312\303\312\306\337\343\262\246\260\344\262\353\355\355\374\200\306\375\275\252\320\272\240\356\242\332\354\300\363\330\256\304\370\315\241\374\315\232\350\373\226\342\351\304\301\367\375\317\326\363\270\272\371\232\344\245\252\343\250\304\377\301\365\300\320\200\340\202\206\376\253\300\263\246\300\263\373\300\240\377\367\350\370\220\355\253\360\211\256\320\247\217\327\277\375\264\371\200\355\333\366\357\356\235\341\306\300\277\364\334\207\253\316\312\231\353\270\270\310\220\277\271\251\267\307\345\310\240\234\301\347\212\206\200\261\372\346\257\265\305\215\334\376\351\305\307\202\311\314\207\237\265\321\270\325\341\317\275\330\216\263\370\371\243\301\213\242\212\332\223\306\264\222\261\350\376\305\235\363\211\260\312\241\201\344\317\231\251\215\240\213\235\216\275\206\245\342\276\307\341\327\324\311\344\307\355\241\301\356\214\240\266\202\357\321\233\204\220\326\327\340\256\302\222\234\267\361\357\256\376\242\363\350\341\254\372\321\340\245\305\251\216\203\254\226\200\216\336\240\270\223\357\226\244\326\277\375\325\370\254\370\341\232\213\343\223\302\365\204\345\325\352") -TOPIC_TEXT( -"\371\342\365\365\222\303\313\213\214\225\236\361\331\354\344\375\202\253\245\313\315\262\376\361\336\215\202\217\206\370\305\316\342\334\375\256\236\337\200\264\327\350\200\261\306\336\363\207\317\341\251\211\326\332\310\251\246\223\207\232\202\352\302\362\337\224\275\307\316\365\257\310\273\311\306\275\261\236\252\371\305\275\372\220\367\217\275\302\302\264\353\331\261\212\236\235\211\255\264\205\261\226\205\231\316\351\374\202\255\237\257\255\342\207\374\360\366\251\375\273\250\216\332\224\250\240\223\324\300\264\267\276\273\266\333\345\303\305\242\373\207\337\271\353\307\213\245\300\310\221\303\256\316\234\356\364\326\376\320\365\343\314\227\333\277\371\215\216\365\337\232\317\347\237\317\237\323\303\351\307\327\276\377\223\313\272\310\325\244\351\366\201\213\367\204\304\250\222\227\350\214\231\351\300\370\220\217\273\272\242\365\305\376\232\231\320\350\361\347\341\367\233\370\263\367\247\365\307\340\200\225\331\254\251\364\261\220\225\327\203\207\343\350\253\251\304\222\367\351\245\210\364\223\230\301\346\214\226\325\337\352\371\372\251\202\255\330\274\352\366\324\352\324\211\255\235\236\254\277\334\233\232\225\254\273\267\300\213\272\305\354\300\372\314\302\355\270\231\343\240\343\246\301\203\320\343\330\330\231\362\232\355\216\300\355\220\315\356\252\315\202\377\315\314\315\217\227\225\241\243\233\201\224\324\303\265\337\250\321\237\267\275\336\242\364\365\357\253\350\250\243\224\326\224\322\341\207\327\375\371\304\350\373\261\352\337\321\323\333\247\276\225\231\215\365\270\260\344\320\363\215\376\313\254\202\245\374\216\243\367\355\363\347\253\231\371\342\212\244\332") -TOPIC_TEXT( -"\330\213\372\257\203\233\243\215\343\312\330\335\360\250\301\201\251\272\377\300\306\243\267\205\317\231\370\307\243\274\320\363\356\300\312\243\316\337\344\217\325\257\251\204\201\304\305\212\306\365\377\241\345\274\252\246\340\237\245\302\265\276\376\372\275\334\370\206\237\206\227\316\317\356\304\225\246\211\345\233\276\334\276\363\354\350\321\366\266\326\203\341\306\337\375\361\205\363\332\304\322\334\275\262\302\255\362\246\217\256\352\344\207\322\311\223\241\343\216\377\214\231\266\322\336\332\327\347\301\257\377\232\364\370\352\255\376\250\236\264\231\340\215\232\373\303\320\251\377\266\306\222\301\211\225\361\350\300\263\202\314\330\250\304\227\365\361\222\274\266\332\214\331\362\343\352\241\211\207\314\251\355\360\331\354\262\230\324\224\275\306\235\304\243\232\271\214\244\307\364\210\310\301\252\346\353\220\230\265\202\213\313\307\373\375\327\325\310\331\313\322\324\246\236\357\333\356\201\241\307\264\364\223\242\335\234\327\335\232\233\340\313\350\224\225\313\331\224\252\265\345\205\236\213\263\263\325\327\236\346\276\341\352\352\312\244\341\373\247\263\261\254\372\212\213\366\326\253\227\256\377\371\357\345\372\317\265\341\310\350\213\225\220\330\306\215\362\266\343\261\365\343\366\244\335\271\236\245\314\373\362\345\213\315\223\275\203\311\315\215\243\375\304\226\376\373\354\345\311\273\352\200\245\201\217\343\264\364\221\230\252\326\300\354\363\325\205\320\216\221\225\366\260\362\317\347\366\355\367\376\377\354\234\332\373\333\362\343\314\376\231\242\365\275\252\274\366\374\337\260\377\243\206\206\206\254\246\201\244\332\365\237\277\360\265\344\367\277\203\227") -TOPIC_TEXT( -"\306\327\202\237\237\355\372\260\370\257\263\277\321\262\305\300\277\320\371\246\234\374\321\300\220\375\302\210\354\333\251\201\237\355\266\201\305\306\327\312\220\223\343\251\235\267\276\372\237\302\234\225\356\344\277\234\354\241\365\233\325\215\243\252\201\347\341\215\267\340\311\276\265\254\222\306\372\271\341\344\305\300\322\324\240\367\320\326\334\332\340\242\270\304\362\346\351\261\310\305\355\320\275\363\205\356\337\245\222\270\307\332\300\221\201\334\333\322\225\272\206\361\271\305\325\211\322\305\312\367\256\336\241\335\202\373\355\334\342\356\202\342\321\264\230\315\353\216\345\262\303\224\213\226\222\335\271\231\341\306\314\377\204\231\255\270\201\311\227\270\271\303\233\357\274\261\303\255\301\220\255\351\372\322\262\233\200\321\307\211\221\343\222\214\277\231\305\350\311\223\265\374\267\303\351\231\231\354\371\310\244\202\342\215\247\316\202\307\200\265\267\266\342\204\244\271\214\263\265\212\207\370\215\230\267\262\333\335\230\250\201\205\213\204\320\343\356\311\365\234\303\373\231\265\234\371\304\264\270\311\236\265\361\342\243\343\235\241\204\237\235\215\305\230\231\245\372\243\346\260\276\316\337\264\364\330\277\242\264\231\336\274\225\352\262\361\245\207\253\227\257\334\270\371\342\325\376\272\230\345\340\325\316\202\267\332\217\340\320\220\312\307\272\347\364\255\265\247\227\227\325\203\262\344\304\364\225\270\371\232\350\211\302\340\374\361\374\363\337\342\256\213\213\313\263\237\276\206\344\316\245\222\261\323\202\212\276\325\262\232\271\351\317\303\213\365\330\331\330\326\234\255\244\322\326\342\244\333\342\261\305\220\234\236\202\207\247\314\252\341") -TOPIC_TEXT( -"\216\315\371\264\330\275\271\306\317\235\332\322\300\245\351\357\266\240\272\226\376\200\327\255\215\275\267\327\223\374\254\255\217\325\350\366\201\272\341\343\346\266\321\243\330\250\320\212\211\252\316\203\226\345\232\331\335\313\305\247\230\264\232\211\264\345\245\240\343\303\203\344\305\277\342\336\377\366\246\273\321\322\345\334\254\235\235\221\347\304\214\247\245\315\257\313\337\342\372\317\323\263\243\307\240\221\215\302\370\367\273\365\236\231\231\234\347\347\204\223\316\261\353\252\217\311\360\336\372\215\255\320\267\233\301\377\255\210\301\243\324\357\264\315\213\253\232\317\320\233\354\357\345\234\373\262\253\363\227\351\330\200\236\343\344\270\374\234\333\313\261\377\226\307\251\247\256\212\316\313\314\352\352\316\351\313\256\224\226\200\307\260\342\216\226\276\345\340\345\235\342\277\341\356\354\254\201\357\276\357\343\360\354\357\206\207\366\203\363\312\220\257\337\332\355\317\361\220\301\202\353\374\236\353\277\377\273\336\241\322\343\377\371\275\374\315\356\347\340\300\266\325\246\302\371\336\261\253\275\262\334\340\305\216\313\274\337\375\321\343\213\327\373\343\327\323\306\330\214\262\350\301\206\307\355\344\344\235\250\366\320\254\266\207\202\322\343\334\276\303\302\305\375\300\262\324\351\271\362\305\360\377\350\324\227\336\305\313\364\223\240\352\245\363\252\277\224\244\227\360\367\371\311\274\304\322\230\300\327\270\274\264\210\206\243\331\227\205\216\353\331\307\320\263\355\371\225\210\364\372\276\241\200\344\251\356\204\245\256\270\273\210\352\303\204\253\322\350\237\271\346\327\301\244\274\374\230\362\204\353\220\257\360\276\277\314\317\317\310\262") -TOPIC_TEXT( -"\376\322\236\322\346\243\231\353\257\213\372\212\277\343\335\363\236\364\203\230\244\316\223\373\263\334\313\217\257\244\230\317\352\207\303\303\201\271\262\211\226\312\212\260\262\326\204\321\223\327\354\304\310\217\375\313\346\321\206\213\221\334\230\243\242\364\344\227\276\317\232\272\244\375\315\330\362\263\272\372\251\313\246\224\264\241\345\212\345\275\216\276\345\340\261\377\250\331\360\201\271\307\313\332\225\253\306\245\340\235\342\224\235\275\214\241\336\217\350\231\325\251\322\276\327\230\262\372\216\207\360\216\236\304\327\302\263\361\255\325\333\375\361\331\201\371\306\302\243\307\327\273\356\250\223\242\337\352\222\227\312\231\300\361\324\324\233\332\364\313\260\225\231\345\244\205\370\334\227\216\255\215\333\264\240\275\254\236\230\262\235\216\213\232\270\241\240\275\256\362\235\270\340\250\226\320\351\277\275\224\377\250\217\316\261\311\222\322\202\372\204\246\352\245\267\216\301\270\254\365\364\274\215\370\275\302\335\302\206\342\231\314\260\376\316\321\350\317\255\233\363\335\267\356\342\374\307\353\241\337\366\366\374\277\231\251\305\320\370\364\350\230\261\246\356\337\237\247\224\324\225\236\363\222\207\263\261\255\220\357\324\326\224\246\206\331\340\374\302\326\334\261\374\323\334\341\211\223\213\211\202\207\322\247\241\341\342\317\372\254\273\324\342\253\302\230\237\275\376\376\351\372\267\324\333\336\276\264\327\273\275\255\325\373\326\274\261\265\331\367\306\310\277\246\322\362\300\374\356\217\311\354\377\203\344\204\372\227\203\327\371\262\307\271\251\226\200\227\237\375\240\276\337\311\316\215\272\326\331\375\306\336\320\230\214\262\376\313\223\241") -TOPIC_TEXT( -"\263\241\223\256\226\211\372\237\334\356\336\223\215\364\341\303\373\377\207\307\305\357\232\334\325\203\262\363\245\313\321\262\263\355\257\335\240\202\376\222\213\322\215\377\302\243\334\345\331\237\214\375\255\352\302\341\240\326\353\351\270\345\310\221\302\232\364\236\333\324\230\265\254\232\332\307\343\213\237\230\260\316\264\374\264\300\247\337\354\373\211\266\204\267\346\345\322\227\204\265\240\322\206\211\246\227\335\250\354\205\313\202\233\343\307\350\340\320\310\251\303\341\220\362\240\310\316\211\212\375\325\217\237\347\313\235\327\246\303\224\324\363\215\346\263\272\225\234\245\276\263\205\236\213\317\233\245\256\333\361\203\255\307\230\224\272\255\242\345\221\247\340\252\304\305\325\266\254\322\252\205\235\233\213\260\306\356\307\217\325\222\371\232\277\273\204\270\352\220\375\356\367\352\213\356\350\321\354\307\215\374\255\263\375\323\361\252\256\372\236\204\236\373\227\203\367\243\244\307\352\211\370\331\217\317\224\375\253\351\200\352\377\266\210\343\225\366\250\321\367\270\270\360\340\357\324\330\272\356\303\356\353\331\365\370\320\213\333\330\313\246\256\210\354\376\320\342\256\332\267\234\324\331\223\215\203\200\372\245\317\334\367\272\247\316\236\227\253\335\352\375\373\366\361\316\216\226\215\300\345\311\323\211\237\245\325\253\333\370\376\345\223\334\203\327\343\300\214\321\227\220\222\316\340\276\276\215\336\351\236\257\361\250\257\266\342\301\200\325\240\307\205\336\327\312\365\361\312\302\342\363\240\245\366\305\245\237\346\246\264\265\327\240\302\307\351\252\302\224\254\243\202\344\275\331\304\274\216\274\370\226\227\227\325\347\346\243\216\337\325") -TOPIC_TEXT( -"\252\365\220\311\206\231\311\221\343\324\257\350\363\224\222\262\226\310\223\235\252\330\352\200\364\341\224\276\303\213\224\254\306\302\252\216\253\204\351\261\331\254\276\207\311\205\244\210\205\362\242\202\376\251\206\324\367\227\326\223\367\304\362\304\321\312\224\257\312\251\307\255\210\243\230\247\331\265\222\352\361\266\255\253\336\271\355\303\217\351\310\226\301\315\210\234\350\215\243\317\223\274\313\226\236\311\351\354\313\331\246\350\244\327\311\247\234\274\325\227\274\372\236\354\240\225\200\227\263\301\236\272\316\212\321\342\200\205\222\266\350\312\343\204\263\253\301\272\357\350\214\371\352\374\337\350\360\350\260\354\215\364\307\346\330\315\344\200\231\267\266\257\315\200\316\235\224\301\322\224\376\276\320\365\313\346\312\371\356\311\217\311\372\345\221\326\332\252\362\313\202\242\311\236\261\344\237\354\350\341\216\370\344\306\236\224\205\277\225\255\346\213\244\376\350\213\204\202\265\221\260\216\330\256\260\227\241\370\335\327\305\253\376\211\213\315\201\332\323\343\310\374\261\216\251\315\206\274\254\315\311\355\214\332\327\307\215\263\250\302\214\236\263\376\210\370\365\343\265\276\320\227\301\206\322\251\311\265\253\364\301\221\246\351\322\322\321\245\326\322\255\252\246\246\361\345\331\262\370\234\376\267\225\201\205\231\353\332\320\360\362\333\364\335\321\347\350\351\223\224\376\322\227\275\350\324\366\245\365\346\327\377\227\216\277\377\314\236\353\202\200\204\352\331\200\347\324\326\360\327\343\374\245\340\336\237\323\314\257\223\212\276\317\370\262\364\215\234\247\203\330\357\250\341\231\242\267\205\332\235\200\345\340\351\351\256\242\215\264\222") -TOPIC_TEXT( -"\360\330\265\231\242\271\257\272\221\217\327\270\205\271\213\205\246\335\363\220\362\253\303\362\351\207\366\303\225\276\365\272\331\331\236\361\370\320\333\356\336\272\270\302\353\216\236\234\322\353\205\240\245\335\317\367\307\201\361\322\332\321\215\311\244\310\326\346\330\263\303\327\303\365\255\265\333\267\310\256\376\213\353\314\344\271\303\277\210\306\367\232\207\266\332\350\220\364\327\370\342\365\336\334\302\203\253\273\272\371\266\254\225\212\355\255\362\274\317\273\356\222\313\207\223\346\343\367\201\255\321\276\206\272\213\365\342\275\305\305\312\334\325\336\304\330\372\217\350\276\230\317\257\200\260\326\370\226\301\360\321\227\342\335\274\376\255\275\266\250\214\231\222\241\307\371\327\307\303\301\234\257\376\206\337\220\365\251\267\270\322\300\223\361\223\370\253\246\305\335\242\234\350\264\372\214\256\302\366\253\333\305\375\234\367\275\271\311\236\214\371\355\216\215\245\310\246\244\212\250\312\311\245\231\251\210\220\363\301\324\245\256\361\326\203\376\305\377\207\250\336\254\232\253\201\224\345\224\203\352\215\244\271\242\342\341\335\200\367\203\246\305\365\367\255\225\311\251\366\250\345\240\277\321\230\343\353\371\222\312\244\311\307\265\250\344\344\265\226\301\264\257\324\222\277\266\332\262\370\331\313\247\276\216\204\250\345\207\235\245\254\323\353\264\276\303\245\203\270\261\324\232\302\227\272\335\262\207\220\265\367\334\331\362\200\313\367\256\204\330\313\203\375\275\260\270\263\361\320\270\375\274\242\321\361\331\312\323\304\320\256\277\266\215\364\330\316\360\252\272\223\353\376\370\322\327\230\342\373\365\267\253\257\350\260\234\305\323\364\352") -TOPIC_TEXT( -"\243\223\366\335\235\273\330\365\373\327\353\373\377\241\304\355\337\363\211\215\377\251\242\310\207\206\330\260\311\311\320\363\344\203\272\304\335\361\302\352\305\225\355\354\213\230\322\224\326\332\273\266\210\204\337\336\274\343\233\351\261\305\215\221\224\275\201\256\222\213\263\323\352\211\340\346\334\265\254\266\247\265\240\311\374\273\267\245\204\236\245\253\374\300\374\255\356\224\341\255\230\310\211\374\350\261\330\252\245\255\325\214\354\231\223\241\305\350\213\374\355\345\207\370\320\343\327\234\376\351\332\221\334\370\250\277\217\204\337\374\316\355\333\217\227\347\263\326\371\274\311\373\223\371\207\314\247\377\211\272\213\302\215\354\261\307\337\262\305\312\263\275\227\255\207\257\366\301\235\330\345\220\376\202\346\372\330\214\262\334\352\245\222\210\356\261\373\324\341\366\324\324\200\304\301\323\241\205\367\270\225\210\333\270\246\373\341\233\313\234\237\302\217\305\345\304\356\361\325\327\316\251\206\227\325\205\266\363\322\302\244\317\322\363\315\264\233\377\332\216\206\232\335\252\315\272\212\236\226\333\221\327\204\341\223\307\343\345\333\275\361\252\363\241\323\224\351\267\363\323\320\245\271\276\302\253\267\255\256\212\301\343\326\370\234\211\276\372\371\242\353\342\364\236\245\307\370\226\265\306\235\322\343\374\201\306\304\365\201\250\261\310\255\262\244\351\204\330\255\233\274\356\232\233\315\216\222\376\354\347\247\357\323\245\203\357\340\352\275\251\267\335\202\325\275\332\250\254\262\232\370\256\331\212\211\302\217\311\351\351\373\353\345\331\255\217\326\276\226\214\262\231\225\372\310\225\300\264\251\351\251\372\314\365\310\205\327\356\351\361") -TOPIC_TEXT( -"\324\360\351\257\211\262\223\255\234\303\212\240\306\254\200\250\243\252\234\360\305\340\322\360\327\254\204\324\343\231\222\241\360\225\352\347\247\206\303\255\253\273\225\224\274\377\312\376\216\273\356\356\252\354\207\203\376\265\364\231\275\246\266\373\252\342\222\353\307\360\272\257\224\376\262\245\276\366\362\376\357\327\316\274\264\261\367\264\372\254\300\231\235\323\376\234\302\365\211\352\257\263\320\314\230\300\353\374\360\303\340\252\274\365\371\375\262\264\302\361\304\237\230\350\241\320\312\316\256\210\277\264\235\217\335\302\335\350\340\275\253\242\204\303\307\266\353\242\264\305\215\321\277\364\346\270\277\356\364\272\246\206\357\221\305\326\211\354\266\322\306\225\272\371\273\203\246\353\267\326\327\357\362\346\274\233\220\237\260\213\355\253\217\224\304\240\325\365\315\242\201\351\243\261\210\316\245\201\315\261\313\252\365\271\312\333\365\307\207\250\320\347\251\245\325\325\201\251\244\233\332\342\232\327\362\342\351\361\244\360\247\307\265\367\372\273\333\232\233\201\320\220\343\314\262\206\234\356\227\207\252\261\314\361\204\256\361\325\220\227\370\350\350\261\226\316\217\327\316\251\245\202\336\265\331\317\312\352\232\313\225\371\351\364\370\277\333\366\326\234\215\265\276\240\374\245\243\275\202\241\275\266\335\277\250\264\372\254\361\264\360\261\331\260\265\366\314\301\327\313\237\336\374\265\330\246\377\220\300\365\223\233\352\325\303\217\312\267\361\356\211\226\255\327\317\356\376\351\207\376\301\331\274\266\237\267\337\221\371\267\220\372\372\245\237\277\324\300\366\236\355\261\224\326\220\370\226\277\265\330\264\250\353\372\301\254\276\253\363\217") -TOPIC_TEXT( -"\237\340\227\332\231\313\315\204\326\243\304\227\242\306\217\237\230\366\230\320\245\230\362\324\340\305\276\316\316\302\223\311\250\303\321\227\331\311\203\350\351\240\314\215\240\253\252\210\323\313\330\320\373\216\276\260\261\204\302\330\375\320\340\240\311\357\345\212\372\207\277\275\316\273\347\365\213\233\233\233\201\256\255\237\272\314\320\361\202\210\263\327\377\215\215\261\271\223\344\227\273\247\330\223\320\224\353\375\214\277\232\341\352\261\352\251\256\240\373\265\335\352\350\270\350\202\376\322\364\270\302\240\204\336\334\367\343\306\353\217\222\260\200\233\337\356\324\237\276\377\315\217\354\263\347\377\235\237\236\224\240\323\235\370\344\246\236\217\363\305\325\220\225\326\257\252\371\323\333\207\275\347\243\304\345\321\330\265\260\345\336\300\261\323\237\277\215\260\350\276\373\367\261\205\236\363\216\276\312\255\300\224\236\250\367\236\274\342\346\344\251\325\332\330\204\306\217\346\240\307\321\242\210\275\340\236\233\235\234\231\251\266\350\256\211\356\255\244\314\371\342\342\250\331\246\323\215\242\270\252\325\240\357\312\245\332\314\237\305\241\205\354\262\267\244\362\237\225\260\263\217\306\215\230\320\206\275\267\276\271\211\331\277\322\240\267\264\223\375\300\374\276\240\317\344\346\232\200\254\307\204\257\332\342\251\232\374\352\272\323\213\312\350\261\276\372\237\225\245\373\274\372\366\235\372\350\204\347\244\233\306\214\263\223\303\247\375\217\377\200\361\261\341\201\335\304\267\233\240\374\211\250\353\231\377\271\255\274\300\204\225\311\357\361\311\307\271\323\267\366\263\360\370\251\301\245\204\335\302\217\305\335\257\266\344\254\302\217\331\223") -TOPIC_TEXT( -"\220\225\303\307\351\352\310\201\206\232\314\361\355\232\207\266\272\236\237\354\324\260\326\341\207\237\306\265\251\367\363\251\362\341\255\257\201\246\340\326\356\266\226\344\310\232\201\205\206\255\216\234\215\365\263\324\320\360\323\273\214\364\302\355\320\204\354\303\210\231\367\326\303\324\352\314\336\321\312\236\211\220\304\236\324\366\364\353\267\243\263\276\322\306\276\373\307\363\305\214\247\337\237\334\377\354\342\256\316\275\342\354\231\327\324\216\327\202\311\264\364\212\355\216\261\371\245\225\266\221\342\310\262\215\254\333\204\203\327\245\307\371\342\360\271\210\235\254\202\350\351\355\303\347\206\366\370\301\275\265\301\276\224\302\274\314\314\221\252\247\331\276\333\242\201\341\306\373\370\212\267\373\372\276\373\371\320\227\374\312\360\240\320\312\342\341\366\241\236\267\233\346\233\357\247\234\376\321\343\221\276\233\367\334\272\321\336\372\366\205\223\367\372\273\223\335\224\340\334\252\254\343\256\347\336\321\315\374\317\351\334\201\225\347\257\265\300\242\221\362\221\334\234\275\325\366\263\274\352\272\214\235\373\376\303\311\257\301\201\273\316\306\373\273\205\272\366\250\212\242\325\265\261\304\271\324\250\311\332\264\202\217\355\347\253\313\252\275\332\276\374\376\223\274\356\246\364\371\202\256\235\214\334\356\212\237\276\370\275\227\337\371\211\322\327\264\320\336\340\311\312\214\331\263\355\316\325\322\300\352\346\350\365\324\201\304\350\223\241\212\202\343\327\241\332\337\200\205\261\207\361\263\303\252\367\216\302\215\300\352\373\253\232\235\261\257\267\262\267\272\246\221\215\355\215\211\342\207\327\340\374\301\263\210\342\371\245\364\252\216") -TOPIC_TEXT( -"\244\307\245\352\234\374\256\377\232\203\265\231\363\342\373\303\242\336\252\340\351\361\321\253\265\214\217\300\207\301\342\224\242\227\341\322\244\252\240\230\333\251\245\217\340\262\257\374\350\261\233\201\216\211\206\316\273\203\376\370\342\340\223\304\270\255\215\363\227\313\220\353\200\377\226\372\374\305\347\227\304\365\237\234\231\210\267\270\330\300\343\270\351\206\205\372\314\214\236\203\214\327\324\332\361\341\272\332\273\267\202\273\262\312\377\316\206\341\305\215\345\305\377\267\276\273\266\273\257\367\207\274\377\255\325\323\234\275\336\377\276\352\357\236\327\320\331\333\257\314\253\364\230\234\250\231\233\306\356\312\326\372\375\263\357\210\327\216\330\313\363\203\316\371\206\223\261\224\222\332\231\324\264\314\232\303\310\226\356\214\262\315\261\206\335\266\333\352\316\255\302\340\235\371\367\312\302\372\321\324\246\212\241\307\362\246\213\322\307\210\265\242\244\277\305\243\357\307\252\251\213\352\341\302\235\342\304\342\230\204\346\230\334\241\275\346\370\376\342\235\220\251\307\261\252\307\232\300\235\310\317\267\332\303\347\221\332\210\226\236\227\345\357\204\356\312\214\231\235\327\233\315\367\243\342\242\376\223\373\350\310\204\222\310\316\275\371\377\225\341\344\201\247\263\274\356\324\303\365\232\300\213\240\300\260\323\343\256\333\260\317\275\206\364\360\240\272\237\344\370\274\246\273\321\334\330\230\367\336\343\310\340\311\211\357\252\226\206\367\262\235\250\361\345\357\371\354\324\240\350\201\362\235\256\256\250\365\363\277\342\305\327\335\276\374\271\277\321\206\332\260\263\240\326\377\305\215\372\332\300\332\237\270\223\356\215\276\277\376\215") -TOPIC_TEXT( -"\236\324\350\223\343\303\342\331\227\367\354\312\332\244\232\310\234\264\274\265\217\355\301\376\336\367\377\217\355\345\312\233\316\354\367\271\331\331\301\331\303\305\237\353\275\332\326\322\367\327\233\362\316\300\222\301\373\231\261\363\324\237\201\234\243\211\266\350\325\254\212\266\247\326\275\331\363\267\340\207\352\324\240\340\220\274\371\244\357\366\272\267\260\203\353\364\237\246\232\213\215\236\203\304\262\307\255\225\225\243\350\337\264\337\267\251\263\311\317\315\324\305\375\252\315\321\302\205\345\250\375\350\377\310\252\364\252\221\306\276\375\221\244\347\326\212\374\325\271\212\244\331\302\302\272\237\226\236\263\340\354\334\344\356\202\364\314\336\361\233\316\302\213\236\336\276\263\354\246\331\263\344\240\206\223\253\320\312\206\314\217\324\327\341\266\301\220\313\214\263\362\370\224\303\271\263\251\213\252\321\237\312\367\370\263\226\317\233\372\317\234\344\320\270\275\365\206\312\342\232\212\223\276\226\307\307\361\301\273\215\341\350\277\316\205\226\363\373\337\376\372\233\373\220\304\365\362\245\327\335\330\245\322\207\332\305\351\362\342\241\336\373\340\300\367\336\217\317\266\215\217\206\215\354\337\367\366\364\265\374\273\270\207\253\304\310\277\336\273\276\306\273\271\224\223\246\272\360\341\210\343\225\234\273\341\334\306\202\306\372\265\236\306\351\331\327\330\365\252\261\227\250\350\366\342\211\361\350\204\210\275\346\200\376\313\361\335\221\324\203\242\276\310\243\207\307\232\251\213\245\306\214\254\202\273\212\270\302\313\335\203\225\270\264\233\273\305\243\342\361\360\360\326\361\355\350\250\233\317\374\207\330\324\205\370\254\275\226\200\225") -TOPIC_TEXT( -"\201\310\223\211\263\261\306\204\244\353\351\241\343\225\323\217\207\264\364\362\244\261\302\202\311\365\370\222\331\365\275\362\312\360\330\341\366\317\260\377\213\336\246\243\323\343\352\310\220\376\261\252\370\260\341\244\336\365\354\246\251\204\320\343\263\250\365\364\227\237\335\272\326\336\267\326\322\334\374\362\370\207\310\335\277\365\320\203\371\213\273\243\354\373\220\357\257\377\237\363\307\363\347\260\327\201\373\262\345\317\316\355\351\352\235\334\265\227\215\214\244\353\257\364\370\330\331\326\365\376\315\236\367\231\252\226\237\306\306\244\265\262\201\275\226\320\357\262\322\204\265\272\245\216\212\225\335\322\254\303\305\350\343\230\342\212\216\244\306\314\366\332\245\222\337\243\307\252\357\251\213\343\312\244\320\236\316\365\246\312\322\343\266\240\240\257\250\226\344\212\200\343\261\255\255\254\202\303\322\343\366\237\260\322\226\223\310\314\274\307\241\270\364\374\314\244\244\371\335\350\362\203\241\241\213\342\344\264\363\344\364\261\371\244\372\313\356\341\203\342\261\370\200\306\204\330\215\301\312\326\205\377\312\332\340\252\234\332\262\374\206\315\276\204\323\325\261\365\225\257\334\276\352\204\252\306\242\205\336\245\270\376\305\345\305\275\336\356\375\360\344\320\343\320\216\307\376\365\207\262\224\251\360\276\315\311\265\220\304\325\357\336\206\226\324\223\212\267\330\220\331\346\323\237\235\300\343\272\253\351\314\236\366\304\252\244\315\311\276\364\230\272\212\246\245\346\325\371\334\260\245\232\243\376\250\323\271\356\360\277\240\350\253\304\327\203\225\236\367\257\254\256\341\362\316\203\244\307\316\261\214\245\250\257\222\265\306\232\275\326") -TOPIC_TEXT( -"\314\335\311\244\236\275\365\230\201\351\310\261\263\201\271\222\313\217\334\255\252\202\245\307\276\300\246\223\220\241\343\326\264\224\265\344\335\351\343\254\251\371\307\301\201\247\271\230\243\221\303\370\306\350\240\325\200\235\305\310\316\336\347\212\225\251\234\305\265\353\304\337\244\317\332\216\335\257\300\261\223\322\266\236\223\375\310\275\240\224\340\275\206\253\356\357\275\202\245\221\353\355\355\275\267\356\344\370\256\373\370\261\307\212\343\317\353\216\373\213\323\234\201\244\256\267\222\354\330\377\243\255\340\323\261\331\303\354\256\366\324\244\307\352\203\206\207\205\200\201\247\237\272\370\366\220\373\271\312\222\334\336\315\326\372\371\322\356\256\216\276\205\377\307\305\357\344\346\256\256\312\253\352\213\357\326\374\372\263\241\205\262\272\206\325\272\250\376\233\374\236\202\324\375\333\247\335\200\264\200\307\364\230\354\364\244\263\257\331\316\344\364\367\315\267\337\264\344\374\230\355\304\263\305\260\265\365\201\303\346\244\230\317\203\263\346\224\370\244\262\371\316\224\277\311\275\231\254\202\247\252\214\252\272\254\275\221\266\210\210\313\217\313\342\230\341\272\273\355\212\231\206\224\264\345\305\200\277\335\377\376\366\273\215\365\347\370\306\204\357\303\343\311\376\266\270\245\337\310\263\276\271\362\270\376\255\376\343\315\276\241\266\345\316\337\200\312\237\345\240\317\350\254\267\310\272\262\211\363\357\234\204\361\263\263\203\305\241\310\220\264\320\345\231\234\257\372\343\346\306\306\317\314\331\205\253\310\361\370\371\341\362\205\316\321\374\312\234\227\352\317\374\374\261\270\243\271\327\337\313\206\314\353\250\322\310\313\302\200\371") -TOPIC_TEXT( -"\325\302\245\202\316\217\231\357\324\226\363\251\236\244\313\217\206\212\205\361\206\245\240\210\210\252\214\310\251\256\210\252\345\200\357\241\253\310\221\355\262\314\364\364\335\330\331\224\255\204\212\242\250\323\365\310\312\300\260\337\342\216\327\273\327\215\315\264\333\256\335\345\351\217\316\240\303\363\265\325\365\322\222\364\204\213\276\310\206\330\216\330\370\303\322\343\217\254\256\314\253\205\341\336\274\370\361\376\370\361\306\236\203\205\236\370\343\302\264\220\201\274\323\304\237\277\337\277\362\327\377\237\343\312\267\370\312\347\326\327\236\255\254\241\245\326\260\257\345\265\324\260\246\200\367\207\212\370\206\365\311\351\263\344\311\361\300\342\311\333\203\344\377\306\210\371\323\257\201\364\370\354\370\240\263\261\310\314\345\205\306\313\325\312\257\343\311\311\370\214\257\221\237\247\350\302\344\270\205\215\333\325\236\235\273\212\262\311\351\257\344\325\257\246\213\235\212\312\302\361\343\305\334\377\303\241\320\314\215\367\313\360\361\214\255\323\332\257\256\244\317\241\304\353\373\352\310\262\302\306\217\351\315\246\334\224\376\324\331\274\317\323\303\255\330\254\355\276\333\326\235\234\316\261\232\240\267\203\266\246\214\336\202\255\301\265\244\301\371\212\364\333\224\302\351\326\277\356\216\276\361\256\201\251\303\223\232\376\371\343\220\363\225\361\255\330\262\333\220\350\325\371\361\373\235\316\301\233\253\201\241\241\334\275\306\262\210\271\316\342\205\334\320\232\274\203\262\211\245\344\333\277\303\375\320\257\263\275\267\300\313\302\242\224\266\224\275\306\273\335\233\346\370\224\354\372\311\213\214\227\246\311\367\273\233\273\273\251\354\347") -TOPIC_TEXT( -"\313\237\261\360\201\212\252\360\311\202\210\201\314\231\340\256\302\343\352\276\307\351\307\304\252\300\370\327\274\317\227\363\353\201\323\345\215\317\377\326\334\246\345\243\243\350\204\231\202\332\217\200\233\261\316\267\326\327\206\302\274\271\346\231\353\202\255\217\255\334\341\271\276\251\332\351\244\274\232\361\374\267\340\311\374\201\341\226\316\353\375\271\365\243\245\271\271\361\313\304\311\237\257\377\373\255\257\275\255\353\247\216\317\205\355\245\236\334\266\355\333\344\312\306\261\375\373\366\263\373\232\306\215\252\253\223\230\301\341\367\320\354\376\261\251\265\332\314\220\236\263\362\373\300\263\306\232\202\331\346\323\273\215\302\347\301\262\244\331\313\241\226\244\264\372\254\345\274\210\210\334\202\236\246\222\324\323\214\370\304\364\375\313\346\243\371\357\253\334\361\246\337\240\334\335\200\264\276\370\277\335\305\237\364\211\314\343\276\207\315\335\213\217\254\207\331\267\217\347\230\305\375\242\336\371\350\261\356\335\241\303\241\257\245\352\320\211\213\204\352\306\333\304\270\261\330\261\253\337\307\276\371\346\233\322\313\350\325\373\374\223\274\363\311\361\216\206\264\343\304\343\236\335\305\347\271\224\312\212\314\277\247\277\343\225\314\253\215\210\332\341\240\307\255\245\320\243\345\316\324\271\363\342\307\364\266\362\320\224\316\226\336\244\213\210\263\262\210\210\261\370\200\342\214\222\334\334\330\361\210\361\363\251\241\307\240\363\304\354\206\322\365\307\363\340\331\362\355\304\264\370\216\370\273\340\304\274\375\331\353\366\324\255\376\235\267\313\211\214\305\260\207\254\270\251\372\365\234\257\352\204\202\300\265\301\270\251\372\367\253") -TOPIC_TEXT( -"\251\272\207\270\276\202\204\247\375\310\340\262\366\313\373\333\253\326\252\236\275\230\364\345\320\346\356\352\354\255\243\307\217\250\247\245\361\370\363\346\364\330\302\310\240\317\210\264\334\346\314\202\376\253\256\271\241\203\305\355\225\375\345\263\260\216\343\225\200\266\263\226\221\370\346\277\332\254\340\361\303\304\322\267\303\342\313\241\336\350\242\261\201\333\220\363\320\230\214\213\345\250\244\324\263\262\367\300\200\244\332\250\262\312\236\365\371\367\325\207\265\237\363\345\344\203\322\227\207\245\313\257\304\345\321\361\303\307\361\264\330\364\266\326\375\321\277\236\376\370\244\265\243\204\203\242\311\207\324\272\241\265\377\350\231\253\313\365\200\234\302\304\265\313\267\245\303\316\366\227\203\311\264\205\273\331\354\267\344\375\223\313\201\364\345\230\334\213\363\332\232\233\261\245\254\210\276\307\206\207\307\314\245\204\236\263\261\334\362\361\363\342\360\212\212\237\322\277\317\330\232\226\342\300\272\205\205\263\237\265\256\370\352\356\203\327\313\232\304\352\217\237\366\244\364\270\305\233\222\346\337\304\373\302\207\204\360\356\232\201\273\343\252\333\227\233\232\351\231\220\236\223\262\244\311\315\347\366\250\226\350\360\270\250\357\236\323\303\237\310\342\305\207\317\377\276\346\372\214\367\300\200\264\215\234\267\303\223\277\211\245\362\342\251\376\226\316\320\201\375\317\223\370\363\253\372\324\244\204\247\341\271\242\201\353\363\247\227\372\326\242\302\340\316\342\356\315\303\254\352\214\372\263\242\307\246\310\203\371\334\300\220\255\301\265\341\303\247\235\230\222\353\270\232\207\265\303\344\313\307\274\206\265\344\377\373\374\371\352\223") -TOPIC_TEXT( -"\374\254\201\343\332\262\312\212\255\263\374\352\235\243\356\217\366\364\336\207\315\246\265\243\370\324\315\210\257\215\320\211\261\272\225\341\372\370\256\273\320\333\342\266\242\235\310\232\271\211\275\325\210\224\266\342\254\240\354\325\216\310\223\351\313\200\370\345\353\334\227\255\366\320\326\252\203\200\230\203\236\347\276\335\225\305\265\366\266\322\330\313\211\275\306\271\312\242\265\313\317\211\236\263\220\253\354\316\327\225\345\272\312\353\302\222\366\207\265\323\246\271\342\220\260\224\215\321\223\242\243\307\371\200\216\357\204\252\304\277\326\351\261\356\315\225\267\332\243\201\244\343\357\377\220\362\356\203\311\306\244\372\346\256\302\220\325\372\254\226\310\202\247\317\363\224\236\313\204\237\261\335\244\302\353\252\263\362\365\334\313\332\334\211\356\301\376\257\326\235\340\353\222\376\201\245\357\261\202\327\323\223\355\375\330\324\230\365\356\316\217\345\326\224\225\244\306\326\245\307\370\250\313\372\231\274\323\214\355\362\215\262\356\203\310\253\253\253\314\252\315\243\316\230\202\212\206\237\345\205\214\250\365\377\264\247\213\277\320\203\223\236\353\364\360\302\330\204\377\342\305\213\227\347\321\356\300\334\374\266\271\237\224\341\371\311\274\310\200\333\235\267\375\214\207\313\323\364\311\276\347\213\352\313\231\360\344\361\246\226\345\337\344\352\217\215\236\367\375\324\326\301\275\361\227\237\335\362\301\214\233\223\252\275\246\217\372\325\317\347\364\376\204\334\242\262\214\334\251\275\326\256\345\204\304\350\361\276\260\304\330\302\312\210\251\364\230\347\304\330\305\322\326\202\264\370\213\312\345\313\330\211\242\260\201\326\230\362\251\372") -TOPIC_TEXT( -"\314\370\373\346\304\311\227\320\244\307\217\241\257\372\315\221\272\226\232\204\354\212\321\274\216\364\342\332\353\345\343\267\326\265\355\310\244\375\310\357\242\356\345\230\305\275\340\363\320\343\360\210\301\361\205\330\254\374\204\375\226\334\241\265\325\303\203\276\230\243\313\275\335\256\204\330\270\356\324\206\241\203\332\352\335\237\355\351\357\322\332\343\232\300\372\320\343\361\356\274\217\374\217\323\335\235\267\370\376\217\212\244\270\242\201\202\345\260\237\207\227\214\303\371\361\342\256\273\335\210\315\263\261\230\274\260\277\243\341\245\275\312\362\245\316\204\355\347\353\253\257\270\217\233\346\334\251\332\257\260\302\234\324\257\306\233\265\243\206\246\370\344\312\313\265\275\346\336\371\220\240\256\264\234\377\356\366\332\201\211\265\235\331\323\237\336\326\332\322\334\314\326\235\334\370\342\244\317\322\252\266\275\346\313\221\312\214\371\277\242\322\252\224\327\221\306\315\217\261\247\333\235\370\211\363\261\333\250\332\375\264\321\204\343\346\362\206\351\331\260\213\367\236\232\314\275\374\240\224\363\374\234\253\312\202\314\323\370\324\307\247\336\275\266\250\367\371\361\235\241\343\230\372\341\317\214\366\367\372\320\236\343\234\322\240\307\246\207\363\226\236\240\325\312\270\322\255\251\273\252\246\307\274\351\240\302\371\254\251\230\360\337\313\223\241\351\334\230\347\210\243\345\306\361\237\243\354\347\334\265\205\325\302\242\206\260\221\364\330\203\323\363\350\244\203\216\247\263\270\222\365\216\346\374\364\343\271\316\201\245\211\316\321\227\246\235\267\273\241\351\365\367\340\354\331\261\357\352\376\370\320\343\372\242\363\263\262\317\242\364") -TOPIC_TEXT( -"\230\220\263\254\275\372\267\270\240\261\377\310\366\355\333\251\203\335\205\341\216\316\306\243\205\263\352\331\222\351\217\252\367\303\226\210\255\374\264\257\277\365\350\251\365\275\332\327\236\203\257\352\336\200\216\325\262\273\222\312\234\220\300\217\277\353\257\371\364\344\361\217\232\233\356\233\277\370\354\222\340\263\364\224\367\221\270\360\263\364\335\225\323\364\363\347\211\214\342\323\232\262\373\346\355\361\324\257\343\234\227\227\244\364\356\361\222\227\230\270\305\211\201\275\277\227\314\360\257\205\251\277\212\226\347\262\363\263\201\223\262\331\215\275\246\276\366\276\333\244\262\344\256\316\324\335\270\223\301\211\325\347\236\212\265\275\310\314\264\242\242\201\362\206\266\213\216\241\352\242\344\252\341\251\341\250\320\323\204\267\371\246\311\210\303\231\254\321\227\205\320\352\320\232\274\357\223\337\214\213\351\255\206\313\217\265\260\300\274\201\223\352\361\210\227\207\311\267\323\214\355\262\227\211\260\217\367\365\301\322\247\267\251\335\301\350\222\326\367\307\226\373\372\263\275\251\205\306\247\244\262\217\312\247\324\252\340\302\302\310\212\206\313\361\241\357\212\272\376\320\313\335\312\367\322\213\252\342\324\225\353\270\354\303\312\342\261\253\257\311\350\314\264\307\215\236\232\277\232\230\340\333\201\266\331\223\204\314\216\263\215\277\322\322\363\253\261\210\253\340\350\376\345\320\335\233\370\213\303\265\267\345\320\241\325\330\264\276\271\267\207\304\370\332\302\373\333\314\366\202\274\271\377\245\271\231\356\307\236\300\366\266\227\275\357\230\203\332\251\305\360\334\335\376\300\205\306\243\254\304\327\251\302\237\277\371\325\323\343\274") -TOPIC_TEXT( -"\333\371\370\271\374\370\357\324\330\253\362\344\275\203\207\366\226\242\217\307\204\274\203\206\355\343\354\324\263\332\267\302\262\332\224\264\203\204\252\340\306\206\324\224\236\373\240\375\373\243\323\336\301\302\263\211\357\206\335\305\326\203\245\307\246\236\335\344\347\265\270\242\332\373\220\303\206\315\200\254\212\326\256\235\267\220\207\332\327\243\271\332\201\264\243\366\273\305\300\370\362\335\320\345\306\217\357\321\351\330\276\375\273\230\261\215\270\356\237\207\357\205\370\230\325\366\214\264\307\205\231\307\313\303\223\205\367\201\222\302\217\347\236\215\270\256\202\201\246\222\300\333\220\353\211\226\274\262\346\335\312\346\336\245\232\321\300\204\263\271\316\261\340\306\232\335\303\344\316\312\362\212\240\326\206\371\323\335\241\303\303\375\375\371\202\362\312\212\202\214\231\347\320\270\272\216\234\301\247\306\336\271\302\223\237\223\202\212\240\311\300\364\271\251\242\224\246\266\243\332\304\332\232\213\206\246\205\340\226\226\232\242\303\241\307\371\267\337\217\224\324\330\345\310\375\335\377\357\302\311\217\347\362\231\261\206\212\345\276\255\315\370\243\314\251\274\315\377\244\324\222\215\333\261\377\301\222\313\272\345\241\206\256\221\250\310\374\257\214\357\372\340\200\356\232\261\231\217\305\235\301\322\343\357\320\254\314\257\277\231\327\237\245\343\371\205\217\360\276\231\235\321\322\237\357\234\243\317\326\377\254\315\374\372\343\246\366\374\253\362\201\355\333\365\333\311\245\305\331\200\332\326\227\330\365\204\304\225\323\353\321\230\246\242\207\322\327\252\364\326\230\313\345\244\227\272\252\213\307\253\355\321\213\236\251\377\364\367\324\261") -TOPIC_TEXT( -"\322\247\207\235\215\212\227\320\337\312\214\270\324\251\255\250\354\235\320\267\344\255\356\201\265\223\365\312\204\201\312\217\351\355\370\266\266\274\340\257\254\330\310\352\210\367\222\307\305\217\336\213\253\352\357\305\371\325\367\325\371\312\230\331\244\307\200\352\375\220\272\231\262\315\326\257\332\320\361\312\243\245\201\342\356\247\320\323\210\275\233\305\253\325\336\301\266\331\211\212\342\272\221\257\246\305\224\332\330\324\222\226\236\333\332\324\211\252\235\364\342\202\301\243\250\330\324\256\312\205\322\214\323\255\315\226\313\262\363\252\321\343\216\376\364\230\321\366\345\230\300\260\315\351\224\270\371\262\304\260\323\313\365\217\351\351\366\255\275\255\237\347\326\215\304\217\340\372\340\320\321\221\275\301\204\364\212\270\357\262\344\303\207\217\225\202\241\277\370\362\337\201\375\215\236\253\334\370\352\255\262\376\225\313\304\353\331\230\370\332\365\314\273\230\270\253\373\236\241\257\200\377\313\277\361\217\235\242\305\356\360\273\262\274\202\322\263\210\205\274\330\242\270\256\366\245\377\314\230\340\336\336\312\373\345\226\205\233\222\226\236\333\324\217\213\326\351\216\307\242\342\202\216\205\344\333\266\355\343\270\235\227\251\226\314\216\204\261\301\226\254\310\377\372\254\244\335\227\305\303\331\236\371\224\237\352\202\230\224\322\230\240\311\336\232\275\306\357\355\337\331\276\335\224\313\216\341\327\200\320\233\245\371\251\374\377\353\375\233\317\316\225\350\361\325\345\313\273\261\216\271\254\206\206\222\370\221\314\225\302\277\234\333\321\322\343\274\353\374\347\361\364\350\221\333\337\237\374\365\363\231\277\241\275\346\276\366\317\273\371") -TOPIC_TEXT( -"\310\264\253\322\322\252\242\375\277\323\210\251\233\204\253\201\227\245\356\221\365\331\310\310\300\302\260\352\371\257\207\260\352\225\324\224\321\355\220\213\312\301\267\372\247\211\357\206\305\226\307\204\245\307\333\226\254\266\332\225\371\352\245\204\367\262\255\306\227\244\270\240\237\314\316\376\244\336\230\363\350\225\251\300\254\310\307\253\355\321\340\354\231\366\224\207\266\244\306\374\202\354\332\335\220\223\336\354\314\360\262\226\331\211\305\311\235\312\300\333\263\325\267\256\241\372\252\341\325\300\336\365\256\370\342\263\313\340\243\306\215\247\316\322\201\354\343\241\242\322\221\362\344\364\326\270\357\366\345\316\374\360\322\337\326\362\357\222\236\217\247\337\371\233\203\357\357\236\236\237\275\317\220\251\251\214\304\206\235\215\366\203\374\312\326\322\233\270\370\275\327\335\200\343\361\233\363\311\307\200\304\243\352\260\261\276\356\234\373\267\325\300\342\307\315\276\310\241\253\274\266\310\204\226\350\236\357\345\304\235\357\305\335\312\223\254\307\307\342\337\303\352\240\226\371\251\265\254\234\276\333\256\310\226\341\350\200\362\372\345\365\255\370\373\226\363\223\222\325\222\337\350\220\271\317\372\374\371\317\237\347\346\335\262\240\240\311\355\361\255\327\262\223\233\263\332\204\370\265\250\250\222\213\246\372\331\275\253\202\206\351\314\376\230\370\260\320\343\325\251\357\277\372\262\345\357\217\277\305\377\236\370\203\376\316\243\307\307\240\243\361\334\375\242\306\352\366\201\331\270\243\246\254\250\253\243\323\240\300\222\356\272\316\273\267\265\221\227\227\250\363\343\300\372\363\225\201\353\235\270\363\354\301\220\251\213\304\340\351\361") -TOPIC_TEXT( -"\312\241\356\336\246\361\255\277\326\355\233\217\203\376\253\254\336\252\365\211\373\266\374\274\230\223\344\374\306\261\312\340\252\243\242\377\332\243\247\265\377\204\314\346\320\342\253\327\231\227\346\313\213\330\230\260\223\361\344\307\263\275\303\223\300\334\252\334\316\263\263\322\300\255\206\221\273\206\330\367\376\220\372\310\231\211\276\246\377\254\311\345\323\313\214\375\220\374\270\372\201\361\252\264\250\364\360\220\234\275\372\344\376\315\375\377\333\350\361\263\341\277\200\204\341\206\355\346\212\200\345\210\204\271\253\306\342\273\206\357\360\234\267\343\372\224\202\230\323\346\331\333\244\362\275\325\261\310\277\317\261\340\346\231\273\230\272\210\261\376\200\257\213\215\366\247\333\244\214\205\313\217\323\211\262\300\276\346\232\324\340\207\342\333\312\377\264\253\347\213\356\317\266\375\242\272\264\327\362\310\365\251\373\222\225\253\371\232\246\273\265\236\236\232\204\236\306\227\336\321\347\247\374\274\215\216\255\362\356\321\216\250\263\261\300\271\220\242\250\364\264\331\334\271\374\351\253\313\273\377\257\306\217\277\275\371\256\207\247\375\325\333\375\344\207\247\261\312\211\204\224\332\237\200\202\202\275\340\227\371\255\302\373\336\262\252\222\344\250\204\301\220\362\337\233\327\356\327\226\271\305\212\252\203\245\354\316\266\310\204\226\236\375\247\220\214\210\326\354\347\365\202\277\361\303\377\235\352\254\327\322\221\337\262\251\362\203\202\272\216\234\276\220\225\332\274\304\201\263\314\326\252\325\260\377\377\376\267\256\333\365\257\260\336\363\353\306\265\247\366\266\304\267\251\345\210\267\250\253\347\353\367\310\377\337\275\267\247\353\330") -TOPIC_TEXT( -"\277\357\360\244\275\376\276\377\267\343\336\367\376\346\350\321\243\254\302\220\215\323\216\335\263\223\376\233\263\342\271\212\212\313\217\254\270\345\324\315\203\352\365\331\217\274\345\225\352\316\252\307\373\362\274\266\344\277\350\240\242\347\376\226\346\261\274\256\253\346\261\260\210\203\325\226\236\247\220\321\332\225\214\206\301\251\220\354\324\253\345\257\362\361\360\353\210\233\325\366\207\334\206\320\343\220\254\226\320\227\304\267\306\223\367\357\375\376\230\210\326\342\265\314\301\332\235\333\244\274\344\223\246\261\254\373\205\242\261\331\344\246\233\207\270\242\243\357\366\350\346\247\377\233\306\231\362\227\255\377\373\345\316\362\301\244\232\201\325\363\226\252\326\312\225\311\320\301\247\261\225\205\351\251\223\324\223\220\312\233\215\344\275\327\211\251\373\310\204\311\371\351\331\353\354\332\337\343\330\201\244\376\337\336\226\336\261\310\252\210\226\236\247\220\241\211\254\341\265\210\325\353\202\222\257\216\212\326\317\305\252\327\336\312\244\204\224\222\247\203\354\257\335\275\325\337\373\356\320\317\251\224\322\275\216\354\300\245\275\206\267\276\371\374\367\203\366\326\253\340\311\211\320\357\330\372\340\246\363\276\342\370\361\374\356\256\267\341\265\314\334\230\376\266\262\204\326\216\211\257\330\256\321\206\323\225\247\317\242\337\244\360\204\341\372\361\201\217\206\366\371\201\255\217\366\367\322\321\361\327\354\314\233\226\323\247\216\317\253\225\315\235\267\205\233\225\225\212\245\245\232\344\344\346\257\200\215\310\260\351\300\360\310\336\215\320\266\217\247\317\371\371\231\300\215\310\334\363\251\231\214\212\300\212\324\367\361\252\220\332") -TOPIC_TEXT( -"\210\332\344\242\210\370\226\265\361\315\347\260\330\232\210\310\217\303\367\274\217\263\210\213\244\204\220\201\265\260\256\346\337\223\345\352\253\343\352\206\242\270\274\250\307\365\243\251\222\201\271\203\255\320\242\334\321\363\344\277\301\371\207\361\263\263\331\203\265\301\234\265\277\334\363\353\355\206\267\306\247\245\311\307\252\234\327\214\320\210\376\245\375\253\301\204\263\323\242\331\240\300\257\227\246\311\347\211\321\214\267\314\216\240\322\245\213\260\306\276\311\350\261\324\234\272\370\260\257\347\223\275\210\336\327\347\256\314\244\342\246\272\335\346\317\313\352\314\274\331\330\321\350\261\262\214\370\257\317\227\363\232\261\253\347\257\300\235\364\334\210\320\333\204\224\333\335\212\340\275\213\274\265\360\222\207\234\376\274\321\230\242\241\375\330\301\343\201\376\235\375\365\224\237\237\250\275\266\265\301\340\254\222\301\300\372\314\221\246\212\336\307\331\324\201\360\331\321\305\211\376\254\233\205\226\225\345\202\276\375\232\256\253\242\371\247\304\252\264\310\232\212\251\342\310\262\311\224\350\335\340\244\251\220\267\270\257\272\345\263\267\355\261\274\370\317\270\356\340\364\365\327\300\337\247\277\224\223\354\215\204\275\272\305\262\261\322\224\350\246\276\372\234\367\213\350\244\235\270\260\367\256\273\336\370\335\232\207\361\370\373\357\255\345\335\301\263\366\361\372\263\226\200\364\334\263\356\367\211\336\371\207\377\310\330\275\207\213\255\263\257\340\266\220\214\372\374\361\342\305\366\223\257\350\376\315\262\273\322\214\234\263\231\251\246\247\267\230\366\262\316\355\360\364\206\377\270\245\361\207\365\262\240\313\236\306\342\217\362\315") -TOPIC_TEXT( -"\212\272\205\300\244\276\231\226\333\220\312\201\351\261\357\365\361\274\346\250\264\320\220\256\204\253\310\252\214\337\276\374\201\336\323\253\306\366\274\373\265\352\326\242\332\221\315\341\313\314\233\352\221\302\206\234\367\273\264\243\364\254\355\353\374\205\334\317\201\240\226\333\371\364\365\350\221\332\326\344\347\307\262\354\261\274\317\250\214\327\260\233\247\217\244\355\304\270\321\350\261\253\252\202\313\237\356\366\207\370\350\261\320\336\377\326\372\356\261\275\244\307\337\254\352\362\361\331\246\334\314\275\264\211\205\231\275\346\346\206\263\212\215\356\354\333\211\266\355\203\247\345\227\200\315\237\357\274\361\206\371\276\357\326\200\313\202\260\263\302\234\216\276\311\226\321\230\263\215\331\214\223\234\257\353\363\207\334\202\351\241\210\344\352\237\303\305\236\260\305\301\342\242\205\337\240\330\330\324\230\202\201\351\361\367\367\367\251\261\226\345\221\255\302\261\243\214\321\230\362\345\257\303\333\270\374\374\273\212\316\360\325\200\244\371\341\232\263\235\245\243\306\305\310\262\243\317\352\254\256\222\346\210\204\321\307\260\341\330\227\310\326\316\242\246\240\230\312\327\203\222\274\354\266\274\360\353\337\375\312\320\245\327\307\260\376\331\313\257\247\211\377\367\224\302\261\317\242\307\274\304\260\316\242\244\310\236\210\273\244\210\242\352\306\300\225\267\357\337\316\346\322\211\302\217\343\302\361\337\367\337\373\356\332\356\322\377\343\345\305\267\300\226\301\301\231\351\341\241\355\312\321\256\343\255\226\272\204\207\261\303\316\257\374\232\340\204\377\320\221\377\337\355\306\212\351\302\240\322\214\257\343\222\273\206\202\363\371\362\252") -TOPIC_TEXT( -"\340\305\306\351\212\363\323\236\256\366\232\204\335\271\316\266\365\313\246\305\222\212\340\343\244\276\242\210\267\313\255\254\252\304\330\360\361\305\262\245\357\267\256\216\252\241\307\370\220\261\213\206\303\201\217\260\371\370\377\311\260\266\366\214\215\325\316\347\237\332\300\374\353\254\272\215\236\212\303\304\367\333\336\300\210\324\271\324\376\236\353\237\231\334\230\311\336\357\247\202\361\344\352\370\302\334\356\356\302\377\217\374\365\305\320\225\346\370\315\215\237\275\317\326\336\326\365\323\307\342\244\307\247\205\360\266\322\343\264\360\302\360\314\365\302\221\367\336\250\211\253\342\246\307\207\343\243\367\217\237\372\333\311\364\225\200\306\217\234\330\206\273\330\337\213\372\254\257\265\200\312\211\253\302\321\343\350\260\336\314\202\200\263\212\337\272\331\214\373\207\273\201\324\253\324\203\252\245\234\336\243\370\336\244\275\251\253\241\351\200\313\325\214\312\270\363\305\321\235\240\251\264\276\301\317\371\375\343\347\330\234\315\207\320\306\222\344\223\266\372\362\354\221\210\202\322\343\302\222\253\302\304\313\337\356\235\223\340\321\226\242\302\251\217\224\301\306\256\260\216\317\274\257\302\370\360\322\204\201\316\206\261\333\210\317\261\371\273\222\254\221\245\374\313\300\264\363\236\206\201\225\206\211\357\221\267\220\340\372\240\326\311\312\244\227\231\316\316\215\316\272\315\217\247\316\223\351\305\360\300\375\362\210\271\313\243\225\211\201\374\221\237\206\242\332\274\236\231\271\322\370\342\370\344\363\343\343\217\327\277\256\315\374\240\244\215\316\306\272\301\205\220\302\340\364\270\255\246\330\350\307\347\233\370\345\370\310\214\245\315") -TOPIC_TEXT( -"\357\350\205\321\243\370\226\347\216\357\240\243\232\275\206\331\245\227\336\207\203\336\270\220\231\365\337\305\345\314\315\306\377\341\302\237\321\232\310\332\237\356\322\252\230\211\232\354\311\217\316\311\236\321\236\235\212\307\216\370\347\210\313\315\213\243\257\327\227\216\302\207\245\372\373\334\270\370\375\323\367\230\211\200\306\243\312\352\262\231\250\267\253\354\345\356\213\304\250\220\274\372\274\305\225\225\345\305\204\267\327\342\203\370\314\377\264\304\363\302\236\202\220\374\376\341\234\237\222\210\325\322\204\201\370\272\341\204\330\241\240\274\373\310\373\325\222\267\305\230\260\237\257\311\221\345\225\352\331\205\341\335\211\203\365\215\360\240\203\275\314\376\264\321\257\341\256\227\221\244\250\227\333\205\207\204\310\370\362\360\377\344\220\373\253\354\344\375\220\374\237\266\244\242\274\236\376\270\324\370\255\372\224\346\330\362\322\246\335\310\370\321\353\344\365\201\327\253\200\227\200\265\212\274\345\350\250\267\250\305\217\343\236\210\212\216\217\336\277\360\212\340\257\333\317\345\275\350\274\274\265\246\213\220\351\231\351\313\273\203\256\364\364\227\212\337\276\374\221\257\246\235\322\340\362\215\367\220\256\263\330\244\236\362\373\265\206\242\233\246\346\314\214\363\276\243\224\235\207\376\204\377\276\366\260\216\366\224\367\213\347\275\302\223\247\264\270\241\310\343\320\346\312\363\260\303\232\370\274\367\301\242\301\224\213\323\200\225\343\375\260\314\340\237\303\332\335\342\321\373\204\247\371\307\333\261\200\254\370\341\253\313\200\271\313\313\213\361\261\337\346\253\375\244\252\261\204\242\274\312\235\327\331\241\321\217\354\315\220\250") -TOPIC_TEXT( -"\306\303\246\250\230\324\302\341\322\200\341\317\273\220\340\247\260\302\204\360\223\240\320\361\357\344\204\360\342\364\236\330\261\276\365\207\237\374\362\357\356\235\345\201\373\375\351\370\216\253\212\365\253\275\317\220\220\335\272\306\274\301\362\375\271\261\245\260\357\337\276\212\217\373\362\356\335\350\357\275\222\370\241\277\313\247\370\225\354\250\240\216\240\376\374\273\203\313\376\200\343\230\303\363\237\204\252\231\223\244\220\273\335\201\370\255\327\326\327\342\250\362\247\246\206\216\233\276\334\363\213\352\243\223\357\236\333\347\241\313\224\241\377\377\375\233\257\226\261\303\315\312\356\335\377\253\317\226\271\370\263\225\336\245\355\266\306\244\302\214\316\260\371\256\354\303\241\370\207\340\243\274\312\377\242\300\206\210\310\335\273\370\302\242\255\232\331\372\347\203\354\234\315\253\271\261\250\275\202\322\272\343\306\311\266\232\374\330\277\374\360\345\305\242\210\215\367\226\237\314\263\260\254\336\305\374\265\233\375\355\362\203\251\353\332\271\224\252\317\332\270\212\252\275\246\366\217\217\372\273\211\236\253\202\300\340\265\364\330\326\320\221\302\360\210\223\340\360\340\256\200\356\343\314\350\261\350\247\375\212\213\323\223\264\304\214\276\255\221\217\351\266\273\366\350\342\310\340\256\267\201\317\340\346\357\321\310\302\354\303\317\305\374\373\373\272\304\361\270\275\343\255\365\336\357\367\342\377\376\250\235\360\224\342\257\256\323\256\250\235\347\264\261\373\265\321\234\206\246\247\361\360\225\217\366\223\360\354\216\237\304\336\247\303\217\206\212\246\221\307\371\327\252\323\364\346\211\217\246\302\246\267\232\230\362\262\356\217\317\227") -TOPIC_TEXT( -"\363\352\261\315\207\267\256\314\301\374\346\334\271\330\370\341\373\370\371\344\255\216\363\331\200\367\356\261\214\314\316\257\200\362\353\341\223\353\303\247\201\365\335\313\317\340\306\250\376\273\261\311\356\213\345\201\373\266\264\251\261\256\315\353\366\226\276\241\254\276\302\242\366\210\232\310\217\361\333\344\275\263\303\361\373\317\255\301\372\314\336\367\216\222\230\303\350\252\341\372\264\334\333\373\206\247\251\203\274\306\361\225\372\221\257\352\344\352\263\345\265\375\213\241\227\221\200\244\327\244\275\261\320\351\361\305\213\227\263\251\235\360\224\235\244\252\272\210\304\210\203\300\222\356\343\257\275\251\256\313\217\313\224\252\214\353\232\213\363\231\250\323\337\241\337\262\255\317\253\353\274\320\233\301\310\370\236\234\333\246\272\210\200\264\252\317\276\370\275\300\204\360\365\302\214\217\226\204\323\332\333\226\347\262\303\363\263\223\255\352\312\306\206\207\232\233\344\233\213\246\207\353\307\235\360\227\267\232\317\234\264\226\302\356\245\200\232\251\274\220\225\304\357\275\307\274\260\315\204\316\330\350\251\253\354\223\345\223\244\220\354\314\313\257\330\350\373\325\307\337\377\257\375\253\363\227\204\216\277\277\317\376\215\314\277\374\351\267\240\332\315\357\272\263\346\331\330\312\317\203\376\210\372\203\336\252\365\202\254\256\323\347\341\342\206\356\210\267\373\206\204\222\377\240\357\326\330\372\200\354\321\373\324\324\226\244\344\276\217\317\364\302\350\361\212\376\245\334\224\220\305\306\207\225\251\257\363\224\227\375\205\366\243\264\311\260\311\316\343\362\315\354\220\207\351\212\334\236\306\252\302\220\244\226\205\277\313\226\353\212") -TOPIC_TEXT( -"\202\301\254\356\305\250\214\305\264\267\345\305\314\353\223\276\354\204\364\325\230\326\251\334\350\353\250\253\372\211\302\271\233\235\217\325\302\260\240\275\270\300\331\254\331\320\252\256\207\305\357\314\222\375\247\376\206\333\242\260\325\362\304\206\236\313\301\364\317\346\252\337\333\347\374\257\203\367\372\263\223\367\317\271\375\263\323\343\264\361\364\303\313\376\213\220\341\306\343\323\247\326\326\326\344\324\343\265\364\270\302\350\326\345\247\247\276\270\225\341\366\231\216\303\307\302\201\231\272\246\250\330\315\317\230\263\272\277\202\307\217\236\231\230\232\212\357\364\353\302\366\301\214\275\352\272\357\274\333\223\337\267\221\351\204\205\225\326\377\254\200\276\330\372\354\321\373\204\273\244\307\214\206\324\221\377\314\327\244\360\214\236\323\323\370\373\325\361\321\227\270\353\226\273\356\300\206\332\244\263\245\335\260\220\335\207\261\372\237\250\250\260\262\252\260\314\312\344\330\344\347\206\350\344\357\374\314\344\342\334\231\375\327\317\242\330\241\326\317\236\330\334\351\320\221\236\203\373\343\225\201\306\242\205\206\254\254\310\375\346\346\362\275\303\252\223\324\335\340\337\360\200\301\261\345\241\337\257\267\361\214\244\277\373\325\227\327\234\355\367\264\246\250\206\223\323\311\231\311\256\356\343\363\255\226\212\204\314\372\213\226\202\323\365\335\201\213\276\304\265\320\346\265\364\214\236\214\266\213\274\341\367\373\373\217\237\214\372\333\322\364\276\271\327\362\310\323\203\275\256\222\331\216\322\364\236\370\336\315\255\351\270\377\274\325\224\326\224\211\254\372\340\307\332\372\354\370\321\373\204\244\307\211\337\364\377\222\201\306\217") -TOPIC_TEXT( -"\351\204\240\257\306\347\342\223\252\231\274\234\335\335\350\272\257\332\343\245\321\351\315\322\310\313\253\242\242\200\362\253\371\337\234\261\212\264\376\266\367\351\243\221\322\301\325\220\310\271\203\352\373\342\371\323\254\357\261\223\261\356\225\206\261\302\212\314\230\203\266\247\275\346\350\365\266\306\376\251\222\321\266\364\260\346\245\254\275\201\263\361\231\357\256\276\372\354\207\371\371\363\325\365\216\376\350\316\376\221\355\267\337\321\246\347\314\277\232\305\204\232\262\300\306\372\360\247\215\304\225\231\300\303\212\361\360\343\250\241\351\215\337\337\377\306\317\224\311\222\246\347\226\233\321\256\210\326\326\341\217\317\375\212\247\364\326\343\321\267\365\250\206\350\335\332\310\274\232\305\355\341\351\261\217\264\334\361\205\375\320\250\336\250\355\224\236\323\341\301\264\276\340\316\260\225\367\314\372\325\247\271\334\204\246\306\215\203\272\374\335\237\260\361\342\334\302\246\361\342\234\211\242\340\215\233\353\241\307\362\355\312\372\316\245\246\365\331\257\370\234\324\343\240\353\202\352\360\245\315\340\262\372\232\227\332\331\234\363\350\202\215\223\230\364\355\350\204\253\231\252\233\203\354\335\201\201\356\223\242\341\302\257\320\257\336\260\323\354\323\337\334\252\336\234\320\273\336\326\252\352\342\206\217\277\367\334\354\364\256\344\362\227\241\345\374\372\336\345\261\356\315\257\357\336\335\265\224\374\336\305\300\311\231\236\214\207\324\324\202\276\241\371\305\276\322\305\371\267\373\207\223\246\377\312\327\273\370\371\244\341\276\231\226\333\215\265\247\241\307\205\242\324\242\233\276\334\355\260\265\307\324\324\220\306\255\210\213\276\275") -TOPIC_TEXT( -"\242\310\323\234\305\211\315\233\204\245\206\201\221\240\221\361\360\372\352\234\323\213\315\302\272\326\251\303\207\345\225\203\325\243\221\340\273\331\220\343\307\223\210\203\205\323\262\272\271\261\256\342\202\210\223\313\261\221\221\215\236\263\265\222\322\360\216\315\352\243\372\324\323\330\367\216\201\236\343\234\217\366\241\230\257\306\245\276\213\273\275\305\202\312\230\334\276\375\364\273\345\355\342\213\315\253\204\300\234\303\266\237\212\306\344\377\212\333\211\216\315\236\305\221\365\323\302\363\324\342\277\370\373\357\365\365\354\242\217\351\305\316\367\357\251\304\234\372\352\254\320\370\306\317\266\357\245\335\355\376\205\315\242\351\277\326\263\340\237\333\320\352\327\215\370\325\244\276\340\231\226\333\220\265\246\307\235\240\344\331\251\301\372\341\336\301\244\307\364\303\367\212\347\357\235\367\227\313\305\355\226\257\272\350\263\200\246\256\225\372\322\264\316\235\344\261\344\326\311\205\213\310\217\253\321\211\236\323\275\353\261\277\341\300\305\213\371\333\265\211\251\326\206\344\370\263\217\306\351\350\305\226\242\200\307\346\234\213\355\211\367\205\226\376\244\227\372\314\201\234\225\231\265\224\276\357\262\324\222\347\205\216\242\314\240\237\326\345\235\314\276\213\253\276\377\342\372\335\302\206\301\265\364\365\212\216\261\245\251\350\221\365\237\222\362\324\213\327\373\261\342\222\202\363\316\347\306\212\262\326\325\205\345\305\307\347\313\233\374\233\233\351\372\301\234\253\362\342\304\303\306\332\270\315\305\244\220\354\335\322\242\265\265\255\374\300\351\376\213\342\233\341\261\205\321\313\360\372\314\356\314\247\251\304\210\357\331\301\360\370") -TOPIC_TEXT( -"\261\247\364\273\201\334\230\223\236\356\235\246\205\353\266\325\225\365\317\216\251\325\324\226\211\350\224\201\222\202\236\203\222\343\307\367\312\256\266\353\303\270\216\304\264\274\327\323\324\210\335\376\227\260\251\353\245\352\317\312\325\263\210\344\307\325\270\213\300\321\310\223\361\370\242\265\305\225\234\374\370\255\233\331\254\312\217\257\226\207\265\211\236\227\335\334\322\343\322\201\251\316\305\207\317\235\270\344\261\273\261\306\255\250\222\351\356\346\347\207\270\233\314\343\304\374\334\210\263\346\266\260\330\337\253\225\365\244\232\315\257\354\370\232\357\374\202\354\304\270\216\330\235\362\310\210\330\365\212\305\322\250\204\245\275\316\275\374\240\346\236\331\263\331\321\304\357\326\200\301\240\251\354\324\327\312\205\332\232\346\263\275\315\374\333\220\344\253\246\363\353\223\313\222\324\326\221\207\310\245\213\254\317\265\354\235\320\315\371\311\304\301\201\247\347\364\371\303\241\260\347\354\344\375\317\232\205\216\363\225\246\365\201\270\325\255\360\356\354\332\211\256\333\215\360\354\335\336\210\336\226\306\212\276\227\310\256\251\313\237\231\322\237\322\257\364\230\206\330\240\306\357\267\274\361\206\304\225\313\256\213\256\332\342\263\260\234\265\322\233\242\265\302\367\260\361\241\375\323\313\204\367\225\201\373\373\365\354\311\352\207\362\377\332\375\342\365\336\253\267\257\372\301\234\331\233\362\334\372\225\310\355\301\252\332\345\337\272\340\275\323\231\215\315\234\360\365\233\213\200\302\313\334\265\275\312\225\261\222\374\200\220\376\202\233\240\357\250\233\370\311\221\353\336\226\253\324\354\240\264\242\240\267\347\303\231\366\350\341\321") -TOPIC_TEXT( -"\203\324\255\214\236\203\236\351\325\212\374\360\277\257\201\374\265\256\370\321\251\275\236\237\231\324\344\214\373\345\253\220\343\215\205\373\377\240\266\214\271\240\220\275\306\367\211\347\203\370\333\273\347\323\336\202\340\364\321\230\324\226\324\231\257\372\333\305\355\315\225\372\370\372\322\324\203\206\343\234\206\327\224\224\210\211\360\310\377\361\303\252\227\251\226\242\317\246\302\357\266\324\330\346\351\214\344\255\205\354\374\200\375\334\311\262\206\367\376\327\261\350\252\250\230\252\210\261\210\223\212\263\364\331\347\305\344\230\312\303\223\205\313\276\360\354\350\303\207\217\316\345\327\355\223\216\217\236\275\202\273\252\256\272\222\270\212\361\311\340\320\304\256\234\332\360\341\303\232\250\351\277\337\334\244\261\276\347\360\344\303\207\367\336\367\355\270\301\315\222\226\211\207\357\314\315\201\236\304\234\222\270\237\243\356\311\336\360\223\240\377\350\355\361\254\222\366\304\315\350\261\370\217\312\203\315\204\241\247\376\317\313\214\263\252\215\344\340\377\352\230\375\220\220\316\231\307\243\244\233\367\376\272\302\250\374\334\253\205\323\232\312\266\323\233\252\324\245\276\333\323\213\276\326\367\340\260\274\264\310\357\367\260\311\214\367\341\343\260\210\207\322\353\307\255\316\273\316\302\261\352\260\325\352\275\315\223\340\226\354\230\360\370\250\325\351\216\300\205\200\201\203\205\242\312\225\326\301\203\213\342\325\372\303\335\241\270\330\261\240\223\343\217\346\355\244\232\310\327\337\355\276\232\362\371\222\350\261\324\376\371\341\315\225\227\371\362\223\330\205\331\204\324\227\215\216\353\374\313\277\213\210\231\325\237\364\276\374\341\216") -TOPIC_TEXT( -"\332\342\355\206\305\261\377\377\366\336\224\365\273\212\253\313\226\276\212\357\300\243\370\221\370\204\312\277\301\267\352\211\372\324\355\371\361\316\237\276\347\264\372\377\224\215\214\256\256\202\332\323\325\255\350\356\262\306\230\365\260\330\205\314\305\226\324\252\203\242\205\305\305\215\335\254\306\226\214\314\315\262\222\220\222\254\211\335\220\302\224\222\312\335\223\220\201\203\317\361\315\214\251\334\332\332\310\221\231\231\231\231\231\221\362\251\355\230\363\344\210\214\211\334\231\231\261\243\262\342\351\356\225\363\315\225\260\375\334\226\371\201\343\253\323\360\276\260\306\361\312\324\213\220\262\327\200\237\266\264\366\246\225\316\223\342\207\306\221\326\344\326\341\221\254\342\243\307\244\362\245\317\230\224\270\341\302\215\373\230\275\257\202\242\324\220\253\213\317\335\256\335\230\214\202\233\265\336\202\200\243\302\274\260\267\301\211\257\246\336\351\363\206\304\236\262\230\231\336\331\241\211\375\214\275\246\363\325\212\325\224\370\356\331\353\345\270\265\257\254\320\354\310\375\300\230\331\324\315\230\276\325\340\313\350\260\353\262\260\321\362\203\207\276\347\255\265\305\371\373\303\371\207\345\257\240\317\217\237\274\237\240\324\307\365\273\336\376\220\262\271\261\264\370\360\356\377\346\361\374\263\331\305\205\252\347\370\272\305\233\314\263\350\345\356\251\331\224\310\341\245\226\212\313\273\215\253\251\314\246\224\320\276\303\214\356\266\250\265\332\250\236\342\252\317\254\244\226\312\374\352\236\242\337\241\327\236\272\334\233\355\274\365\262\216\371\364\262\264\306\277\363\255\205\337\327\253\376\366\345\246\210\370\257\271\307\276\277\262\367") -TOPIC_TEXT( -"\277\272\237\273\270\332\245\324\224\257\311\252\253\213\323\356\371\304\365\237\235\367\331\200\223\261\252\223\371\271\225\251\370\270\374\265\272\334\377\345\227\237\357\215\217\236\336\310\353\273\272\367\374\342\323\271\265\227\371\233\255\327\334\351\355\333\344\267\372\343\255\212\202\227\203\304\202\241\233\355\360\275\246\257\350\356\254\371\315\273\266\260\247\257\377\274\337\272\350\376\330\244\213\370\350\261\354\346\356\314\313\203\251\313\234\250\340\253\304\302\242\251\205\344\212\275\232\232\343\364\306\351\326\371\241\277\267\246\301\342\202\224\224\337\361\323\231\367\306\334\335\305\210\303\263\315\321\356\377\241\306\364\221\214\362\353\315\210\305\221\241\320\265\251\370\360\335\277\362\340\346\220\323\214\232\241\266\311\277\234\334\234\237\356\224\274\363\346\366\347\367\235\272\355\255\213\363\323\375\375\332\277\366\275\350\321\230\354\340\377\260\263\275\301\206\254\246\243\215\266\330\236\306\205\233\216\253\274\331\275\373\267\222\205\333\224\343\353\244\334\331\337\264\336\235\325\250\323\206\257\277\274\246\311\346\203\327\272\352\361\243\314\374\360\335\301\207\373\267\226\356\241\270\204\275\340\322\311\233\270\330\374\272\250\355\274\337\322\240\255\305\322\316\206\256\267\206\236\373\230\370\277\327\221\306\374\271\234\221\237\250\210\244\236\343\205\222\377\336\351\344\305\261\256\367\275\270\360\251\343\337\222\337\214\213\235\355\216\370\350\261\316\312\243\265\257\302\342\327\263\252\200\240\310\216\213\306\230\331\275\311\276\342\211\362\333\374\304\200\204\267\257\360\224\260\252\301\311\265\244\201\341\256\302\260\262\242\230\241\243") -TOPIC_TEXT( -"\307\372\361\253\230\222\317\274\347\267\200\201\370\357\225\377\277\272\327\231\324\326\236\347\363\366\274\253\377\373\262\251\261\221\204\350\353\271\266\262\264\340\334\220\343\215\321\221\301\220\376\267\220\245\376\261\351\261\231\247\251\372\341\322\355\251\245\274\321\330\266\203\225\211\205\232\325\212\341\243\336\231\274\317\346\224\370\324\251\323\302\314\215\344\313\220\351\320\210\335\254\204\227\346\375\226\313\212\300\351\375\301\372\314\243\352\234\334\255\346\260\346\215\222\330\357\232\305\272\256\364\265\334\264\277\211\256\352\243\242\267\201\213\331\357\336\226\302\323\330\244\332\342\233\274\277\341\303\310\341\341\253\343\201\360\272\335\227\224\232\267\327\336\223\321\232\341\257\211\226\270\317\210\223\247\332\276\272\300\215\377\332\375\305\231\342\333\342\261\303\221\217\230\275\206\237\246\237\330\365\221\331\326\324\210\274\214\204\327\234\307\223\352\267\231\231\332\317\273\334\327\253\303\216\250\371\324\222\322\236\212\236\330\364\270\275\260\315\256\355\326\237\241\374\203\373\210\272\325\356\253\264\260\236\312\363\265\255\340\207\276\356\367\300\320\277\372\300\247\343\374\230\370\232\373\310\247\257\345\371\317\337\374\361\217\377\330\234\271\237\346\200\271\257\347\336\350\200\275\206\306\307\207\270\330\236\220\343\334\356\345\315\227\230\351\352\373\264\203\375\301\300\230\275\206\265\205\261\250\204\375\245\305\245\203\225\270\303\351\306\211\231\300\310\252\212\212\317\301\274\301\376\304\251\326\321\205\331\234\327\236\210\335\311\206\227\331\373\320\205\223\205\255\230\202\326\207\254\253\272\260\356\354\324\362\365\301\274\333\342") -TOPIC_TEXT( -"\247\331\271\236\325\335\300\201\321\222\325\257\330\216\266\262\236\371\262\211\214\202\222\357\352\352\330\301\300\222\231\376\247\342\275\377\222\376\356\314\247\357\353\370\323\245\316\223\342\303\231\325\273\347\357\234\200\267\247\266\364\330\242\361\304\351\241\354\246\321\315\313\217\243\204\201\323\327\263\242\344\267\206\260\350\355\330\352\247\304\340\323\221\263\275\346\350\303\252\227\313\213\323\222\251\266\376\350\374\312\302\323\267\277\352\354\272\306\277\376\365\322\272\340\310\272\245\210\266\373\361\336\263\266\327\352\323\216\365\202\327\231\363\355\312\245\347\363\337\354\341\356\327\247\353\377\366\357\267\273\277\303\272\302\274\336\273\372\267\340\260\372\214\254\255\344\364\271\237\231\235\233\301\261\206\366\332\316\205\265\311\221\204\267\250\204\311\206\371\244\351\245\204\303\206\325\204\323\245\265\251\225\210\263\226\260\222\314\325\346\211\352\313\335\262\313\235\315\343\311\323\271\315\372\205\214\245\214\214\343\306\314\225\371\362\255\331\333\326\213\376\275\346\346\201\356\262\252\366\213\255\371\310\266\275\266\313\325\262\252\343\247\366\232\364\337\337\211\220\206\314\240\376\361\353\335\237\350\225\247\265\377\224\370\327\206\274\265\344\343\245\374\312\301\214\272\271\322\300\253\217\360\355\233\302\356\237\242\267\206\316\264\214\364\244\276\375\226\273\231\303\211\370\236\327\313\331\220\366\352\201\214\273\214\216\315\236\244\356\251\364\366\270\223\310\241\231\324\344\274\305\316\341\214\217\313\326\246\311\274\217\301\215\261\265\344\216\374\233\356\314\333\366\273\367\357\377\327\226\237\211\203\226\370\201\230\271\356\255\343") -TOPIC_TEXT( -"\371\253\216\223\277\225\311\263\362\355\351\253\263\217\210\301\225\263\260\271\307\333\262\217\324\302\266\361\253\336\350\237\364\261\211\215\204\272\265\263\265\267\273\205\316\331\236\317\270\373\304\235\270\260\367\364\344\260\277\361\314\231\271\351\314\261\317\302\314\375\273\335\300\256\226\260\362\314\364\250\277\254\334\376\216\307\235\207\376\373\315\225\262\324\320\216\373\234\336\364\214\227\314\326\340\236\364\362\362\362\333\240\240\214\205\350\312\302\243\353\364\362\314\211\270\255\324\201\217\271\200\346\337\372\254\265\334\230\366\234\306\204\225\346\242\307\327\336\237\330\271\325\336\242\370\202\316\376\352\204\317\335\371\354\203\263\364\252\313\360\221\277\210\311\227\261\252\376\337\245\252\275\340\320\233\341\357\351\361\231\316\363\302\215\243\201\272\233\267\223\337\376\267\213\235\214\330\351\261\333\347\223\202\305\251\222\277\216\210\355\247\344\364\211\256\207\213\326\321\343\326\201\311\347\212\305\247\231\362\231\327\251\267\220\251\351\351\255\270\223\216\376\216\343\256\265\241\332\204\205\315\343\326\362\343\252\236\241\367\273\205\217\331\264\221\331\353\334\246\321\255\251\304\244\247\364\230\237\321\220\201\251\247\243\317\212\253\264\366\262\316\214\337\311\230\225\370\325\277\311\326\364\270\255\311\265\305\302\307\347\233\352\216\327\226\346\356\364\375\377\203\375\362\245\374\204\326\374\261\346\304\235\311\262\227\233\320\217\215\276\254\364\367\301\220\201\360\363\357\357\231\256\204\264\267\263\332\300\377\266\345\260\312\260\334\220\313\346\217\346\346\335\273\367\263\270\211\214\231\322\326\340\372\314\365\353\351\220\325\311") -TOPIC_TEXT( -"\274\323\247\364\330\311\326\340\321\337\363\314\265\346\335\325\305\227\236\236\343\337\304\377\221\365\236\240\271\350\261\367\247\254\250\275\256\216\274\200\362\216\234\213\376\210\377\202\216\240\263\207\224\237\363\200\271\223\233\204\307\214\266\367\215\215\210\353\356\214\234\354\353\311\342\374\333\254\366\262\342\244\371\307\226\345\305\362\302\264\221\257\374\242\333\212\256\276\262\301\213\221\263\241\224\202\201\344\374\341\366\234\234\330\224\314\266\214\357\275\310\347\266\362\352\245\300\233\343\322\216\345\271\217\363\311\264\363\373\232\234\354\340\356\325\317\352\257\274\365\226\245\230\306\310\224\244\306\336\310\274\260\204\222\276\266\346\313\311\315\361\302\222\311\367\222\370\363\257\233\327\353\211\237\323\322\362\340\270\202\236\373\342\350\227\370\310\307\254\270\266\265\354\261\262\330\377\200\324\267\227\251\261\361\366\347\367\370\204\205\267\356\350\353\255\245\252\364\354\213\320\343\320\203\263\360\344\355\326\213\215\324\355\226\325\271\311\343\345\244\203\222\252\253\274\305\245\345\351\217\321\331\234\346\314\266\300\243\307\305\343\271\241\271\370\316\264\246\225\245\262\302\262\321\245\333\362\255\331\321\244\325\335\204\332\363\271\324\262\365\341\307\242\322\340\317\304\310\313\374\220\346\364\311\234\230\256\267\364\270\224\350\351\273\211\355\362\226\306\206\367\242\365\356\317\322\276\252\323\243\307\341\240\367\213\203\372\236\237\356\277\224\370\266\202\331\354\344\330\372\354\221\362\271\362\232\326\200\306\203\200\252\233\213\215\267\200\235\333\335\245\236\222\311\307\373\337\225\311\325\372\213\225\337\351\350\261\323\245\270") -TOPIC_TEXT( -"\203\211\341\344\231\237\261\265\211\265\212\255\300\231\330\200\324\201\332\263\314\310\342\257\310\266\250\324\325\347\371\231\221\333\377\241\307\373\366\355\303\333\303\321\221\301\260\344\220\343\235\272\343\307\347\246\247\300\237\230\317\234\250\363\362\343\241\264\251\375\313\346\347\346\355\356\217\214\201\244\353\264\335\276\352\307\372\313\265\343\317\221\304\333\267\357\374\315\261\334\302\316\270\331\212\253\243\357\262\277\333\212\234\377\313\223\242\267\300\273\325\373\310\210\261\236\260\266\267\347\243\265\246\310\252\241\362\326\362\253\271\230\341\242\307\262\263\236\252\226\236\207\201\364\347\313\243\247\277\232\364\370\256\314\347\271\304\267\317\342\326\247\303\322\343\252\341\301\343\326\226\323\317\300\333\254\271\351\334\336\200\341\340\366\316\220\300\201\303\327\203\321\312\260\350\261\203\351\262\221\327\276\212\347\225\210\204\323\221\352\265\275\246\321\225\233\302\201\246\315\341\241\276\245\354\343\225\251\265\244\362\353\322\307\314\374\353\210\271\253\213\332\330\212\307\310\313\334\204\216\237\376\364\346\252\243\226\274\306\256\361\311\320\377\347\357\330\360\300\333\313\265\363\276\236\373\370\333\321\326\266\372\343\372\265\315\215\307\331\206\206\226\346\243\344\263\361\213\213\363\240\355\314\343\241\333\216\274\371\265\205\201\322\232\316\303\340\343\324\311\325\326\355\341\253\201\371\335\371\214\263\334\262\264\262\372\237\344\331\342\363\347\351\251\302\243\242\277\205\360\262\247\221\247\263\345\334\326\226\353\215\256\334\271\202\245\343\317\246\323\251\305\305\332\355\201\232\240\344\254\371\315\330\264\277\237\255\240\331\332") -TOPIC_TEXT( -"\332\312\277\327\300\223\356\221\231\364\270\372\265\323\366\345\345\232\316\253\305\260\236\213\377\342\377\361\344\370\255\316\233\316\274\257\377\315\340\355\215\353\310\327\256\341\211\354\374\306\217\367\270\372\365\305\345\202\225\350\253\317\344\361\363\203\311\217\275\367\263\217\357\215\247\226\272\364\233\343\310\371\247\335\217\331\214\377\336\355\364\237\267\306\216\212\354\244\226\357\362\226\301\217\233\356\201\237\312\374\213\255\366\262\320\254\275\316\357\265\221\316\234\224\253\331\252\321\245\341\337\266\245\334\274\240\247\263\317\221\204\205\313\335\300\261\245\277\200\320\254\213\267\370\201\255\234\206\231\346\266\275\357\237\371\312\343\343\261\234\222\262\304\225\272\200\306\317\300\200\374\335\354\340\245\203\314\311\322\226\266\261\275\346\252\201\222\343\261\357\337\276\271\326\224\276\366\305\321\255\367\307\313\365\366\243\311\333\301\231\323\247\307\307\206\247\334\246\307\247\247\306\326\226\311\312\270\316\334\356\274\271\377\344\303\244\217\224\340\311\361\343\307\322\310\272\373\356\331\307\347\233\352\271\234\377\336\270\376\365\322\236\240\266\345\256\215\215\206\247\257\367\213\200\260\205\364\260\206\315\331\337\367\374\302\237\230\350\267\313\324\233\316\315\331\312\205\246\301\300\341\212\326\307\240\310\312\235\316\362\314\233\257\225\246\371\221\250\223\375\337\201\203\273\355\211\361\255\217\313\215\365\275\343\341\356\277\302\240\307\326\333\315\242\220\331\330\372\314\260\250\206\311\275\265\364\346\240\343\313\305\370\350\361\331\261\221\321\325\235\200\334\257\364\325\256\253\270\320\361\332\215\235\271\215\256\260\222\271\365") -TOPIC_TEXT( -"\324\301\372\310\256\220\210\361\312\312\320\212\313\233\207\320\343\307\305\215\277\223\340\343\241\276\341\302\364\376\257\275\236\234\305\234\344\245\263\351\240\262\204\347\331\303\266\250\217\307\326\242\212\327\334\364\230\350\377\276\323\325\321\326\312\231\311\313\315\227\232\232\233\247\274\246\342\252\314\302\315\353\207\356\354\247\257\334\300\313\244\355\260\222\326\346\327\271\231\277\322\355\365\221\251\301\306\351\275\373\223\270\225\303\215\376\227\233\316\375\373\343\343\203\273\376\376\344\357\375\231\273\335\306\327\361\241\216\320\346\244\270\354\304\373\361\240\221\310\210\230\332\256\234\256\311\372\231\200\230\363\327\231\360\363\240\314\211\367\305\345\305\242\214\256\302\252\335\230\231\321\342\235\235\227\220\202\300\306\360\346\247\360\343\365\214\224\274\246\220\337\217\354\334\265\350\261\265\257\260\204\310\220\226\236\353\320\223\353\233\361\303\313\206\220\305\315\214\216\364\330\232\356\344\237\202\304\262\322\341\212\311\237\263\362\232\334\334\345\271\313\365\306\344\252\314\265\342\321\303\342\246\264\321\271\226\300\331\305\206\275\246\347\246\256\364\223\215\235\354\302\221\231\251\265\330\267\244\270\311\210\352\222\323\220\244\317\337\260\236\322\263\245\212\326\360\234\325\204\361\276\363\376\264\307\330\377\200\361\310\220\241\215\223\337\235\360\266\350\274\354\363\346\250\277\227\334\270\317\356\330\361\276\207\275\361\312\357\274\274\255\206\277\364\277\372\302\351\262\310\324\206\375\310\333\377\364\261\325\224\365\304\324\253\253\277\214\204\300\226\327\346\260\344\232\361\267\341\250\315\314\375\346\340\254\315\315\256\257\320") -TOPIC_TEXT( -"\373\232\346\260\270\240\376\225\204\304\361\327\355\357\364\270\377\300\347\201\275\370\211\262\344\372\241\323\373\244\314\335\256\375\214\374\266\231\232\235\333\336\207\250\262\247\206\332\246\221\224\214\306\211\215\331\260\216\303\220\350\354\271\252\314\374\243\356\237\210\260\374\360\275\212\327\227\226\247\257\275\270\306\345\263\363\254\252\207\226\374\236\373\201\353\366\374\314\373\350\306\374\352\211\366\346\303\325\365\254\254\264\360\203\361\306\205\237\244\331\240\307\335\270\243\363\336\315\206\362\210\252\215\350\202\244\227\314\246\251\270\300\211\244\307\330\325\302\311\236\240\353\317\261\355\320\353\327\226\353\242\215\370\225\250\261\343\325\306\247\202\340\332\325\224\272\226\273\212\350\351\264\351\237\302\236\335\323\367\337\315\320\343\252\237\307\345\300\241\363\233\233\202\263\304\370\354\370\200\270\202\363\252\336\236\220\247\202\215\236\222\340\311\222\322\366\261\262\266\243\370\305\336\201\215\342\272\342\270\301\376\211\324\224\363\214\300\241\216\315\371\312\234\267\205\323\327\357\212\272\361\203\227\213\270\250\341\330\362\260\325\322\326\363\327\337\354\271\366\345\322\360\254\327\270\276\310\325\301\220\212\335\312\260\262\341\262\306\277\334\352\274\371\371\221\314\304\271\305\374\226\336\261\217\274\245\345\332\265\325\245\331\224\325\276\265\352\204\234\270\212\242\276\345\243\363\201\207\231\302\233\204\326\376\225\300\265\342\367\377\304\220\253\334\261\224\267\364\354\263\363\254\217\222\205\245\307\206\262\305\275\350\334\237\336\205\271\211\240\317\214\371\244\323\354\270\246\256\367\340\362\300\327\337\344\216\313\377\334\256") -TOPIC_TEXT( -"\261\262\255\262\230\246\320\203\243\242\322\204\203\332\241\313\303\310\254\227\301\207\346\323\363\314\376\216\222\207\305\222\262\264\271\271\334\355\236\261\220\217\225\232\263\371\320\331\231\311\237\222\222\334\250\267\357\263\213\205\371\350\207\305\371\263\233\336\312\327\300\246\222\277\340\322\205\240\233\251\245\367\300\235\315\271\266\306\220\212\276\207\272\342\212\337\316\274\326\271\334\334\374\221\337\304\361\321\371\272\267\277\274\274\375\320\375\247\213\262\212\324\225\334\323\234\225\327\257\337\357\372\257\316\256\312\250\353\333\301\247\214\270\237\272\331\351\232\227\214\354\273\356\243\230\201\361\214\326\343\202\343\210\204\304\372\254\307\275\372\356\274\205\366\231\204\264\244\232\367\323\227\307\276\270\312\275\315\203\313\270\334\357\215\325\353\276\215\236\313\325\226\216\205\313\301\220\351\263\353\274\374\364\261\351\234\260\361\270\262\344\214\243\312\241\303\203\226\347\361\325\324\276\265\261\240\340\364\301\320\364\230\314\207\250\361\273\377\242\310\237\365\230\343\306\300\371\257\250\275\276\373\347\304\342\233\262\354\261\343\341\351\261\201\322\335\326\255\303\222\347\307\247\327\226\347\360\231\227\370\246\362\365\302\333\377\331\233\254\346\264\221\304\303\352\334\302\221\260\210\201\222\350\230\314\350\345\352\200\244\375\200\311\212\203\243\245\237\375\364\277\321\356\335\273\351\361\305\316\315\265\221\261\265\264\370\206\320\277\345\200\301\310\243\354\366\337\332\277\372\365\252\377\243\255\365\301\220\351\274\325\227\240\234\354\264\337\362\242\256\351\236\254\306\276\234\362\227\210\371\265\247\366\354\222\344\370\335\233\355") -TOPIC_TEXT( -"\253\260\271\214\354\244\345\201\251\322\340\351\354\324\250\216\300\324\253\364\264\357\272\237\276\316\265\262\367\356\346\237\327\231\373\233\205\343\310\220\277\275\311\361\211\372\351\354\303\375\361\350\360\377\324\373\265\262\271\370\324\327\311\364\272\273\204\326\240\362\232\315\224\204\350\216\336\212\252\245\267\315\307\320\334\351\377\272\371\235\274\253\266\262\363\256\336\311\202\374\233\255\366\246\254\275\341\366\342\365\351\226\227\361\233\245\371\251\326\233\333\316\370\275\331\336\230\226\224\275\334\314\371\213\271\211\340\211\234\205\265\314\225\346\221\347\245\324\337\336\214\263\276\330\332\341\230\321\307\223\245\316\343\354\250\250\234\227\306\340\250\206\234\317\265\265\332\347\271\201\336\326\265\277\261\341\217\210\347\250\202\221\206\217\251\244\240\301\216\273\323\225\271\215\242\251\372\323\313\315\346\227\306\206\207\222\337\301\352\364\226\236\263\200\307\212\210\273\321\264\276\277\333\355\303\231\373\242\305\261\350\334\376\247\247\272\366\273\366\266\200\227\235\373\272\353\332\250\302\250\367\260\255\227\202\222\235\362\344\333\302\254\307\304\353\376\306\362\354\246\263\314\342\364\206\324\352\356\352\360\265\341\317\257\334\332\370\335\224\340\371\376\267\337\367\374\276\202\242\216\345\221\310\255\213\244\202\347\306\243\350\346\365\264\252\204\352\224\207\205\340\254\365\347\221\206\336\207\362\227\204\357\200\371\253\326\313\326\304\267\330\342\347\302\323\322\343\200\344\204\226\331\231\240\261\225\310\272\276\362\235\300\227\331\270\322\362\317\351\214\212\232\240\220\364\205\211\320\361\324\264\201\335\264\376\242\253\342\371\240") -TOPIC_TEXT( -"\233\225\241\225\322\226\355\377\261\203\203\301\350\261\330\256\353\360\257\213\355\263\227\207\322\224\253\232\325\317\344\323\243\310\341\212\264\236\231\232\356\276\375\323\325\342\266\321\202\254\223\364\307\201\302\217\231\204\300\346\305\271\271\255\351\375\335\207\235\241\206\334\260\350\336\263\374\256\275\355\327\322\246\257\244\202\303\373\317\260\201\346\205\370\213\202\311\267\265\211\270\331\362\336\244\274\217\212\221\320\267\241\265\260\211\276\362\213\352\351\317\336\325\357\221\376\314\206\334\373\355\345\236\376\272\340\240\357\327\343\372\323\373\260\325\340\221\355\317\236\227\251\313\207\376\231\326\241\343\252\340\306\304\232\273\301\320\242\266\370\301\232\215\256\255\316\333\371\275\261\305\345\300\322\343\200\360\210\275\266\256\354\301\222\214\271\327\236\221\351\326\351\264\252\345\257\207\232\314\263\324\362\250\201\304\220\245\322\250\217\306\235\265\245\232\264\312\203\205\256\323\366\262\344\201\225\370\367\325\213\304\314\321\313\262\250\234\365\310\364\212\330\363\300\274\212\377\346\302\302\342\376\325\361\333\273\202\300\363\234\350\352\354\334\321\364\253\213\202\242\225\306\301\254\330\373\342\353\357\223\322\242\340\250\273\276\337\273\252\223\317\330\211\236\223\263\352\363\313\363\321\343\256\301\201\333\376\375\375\275\357\260\234\326\324\320\364\326\250\353\253\371\277\333\235\267\303\247\365\345\361\364\221\346\377\302\333\241\212\367\277\260\273\265\203\312\255\227\350\353\355\301\207\217\341\247\331\346\321\207\217\223\277\275\221\211\246\237\343\373\342\250\266\322\207\331\375\363\366\340\332\362\234\304\326\226\210\252\363\222") -TOPIC_TEXT( -"\307\357\354\245\376\277\336\266\300\270\265\314\367\260\351\345\307\226\251\225\203\313\217\203\300\307\365\201\313\363\323\336\240\307\237\302\354\370\302\334\204\370\236\262\201\205\270\332\323\315\313\261\370\354\222\371\374\211\322\357\277\201\357\364\330\202\234\351\374\372\254\215\377\261\240\203\236\305\225\253\333\313\335\265\345\251\354\234\307\267\340\334\254\254\267\256\342\260\362\212\271\225\332\350\345\201\206\270\224\230\227\267\351\260\232\314\220\347\314\203\263\373\231\351\261\326\333\327\363\317\276\230\362\334\364\306\343\222\240\222\305\276\361\246\264\217\371\206\310\344\261\320\270\375\206\205\233\217\205\303\223\370\320\312\254\344\267\251\311\346\275\333\260\364\330\333\276\210\324\321\375\306\331\242\347\270\253\271\263\237\254\262\362\234\340\306\243\251\257\314\264\226\360\207\245\327\306\236\200\202\222\344\357\362\326\251\200\317\355\226\245\251\271\251\220\344\351\203\265\265\237\237\331\333\312\375\367\343\232\332\210\260\367\244\366\313\275\377\264\377\230\217\247\233\316\365\215\215\323\323\216\306\307\335\201\254\326\215\375\203\327\236\206\272\341\364\322\345\336\236\363\302\256\306\217\243\205\276\337\210\263\337\350\261\360\242\245\243\337\361\255\265\330\201\250\224\204\236\373\275\325\215\275\252\264\250\242\210\242\260\272\264\213\233\370\205\255\304\340\337\375\266\336\322\207\305\277\302\376\357\371\306\247\314\354\253\313\300\254\223\203\236\263\231\367\213\354\227\374\230\256\277\353\216\212\252\223\316\370\322\304\214\347\253\350\263\302\204\267\367\273\260\200\336\274\371\231\305\243\205\336\313\264\264\210\234\326\246\246\231") -TOPIC_TEXT( -"\274\220\201\203\235\360\346\234\361\326\351\331\206\371\306\274\315\237\302\365\221\224\254\307\343\254\360\226\253\247\303\276\335\371\324\235\336\371\363\240\322\336\241\260\217\217\331\336\371\201\232\203\230\302\255\303\237\345\242\307\271\325\323\331\341\344\332\323\360\234\267\322\242\213\266\252\362\264\224\351\365\251\322\265\351\265\230\355\313\311\254\271\205\341\304\335\376\352\201\327\340\324\352\371\357\322\340\336\301\337\227\223\305\200\256\215\366\375\224\266\274\336\357\306\322\337\327\375\266\241\314\236\254\375\374\267\373\304\246\233\231\300\333\254\304\307\373\276\351\373\251\331\261\321\235\261\341\232\334\272\346\356\266\243\317\266\274\200\253\232\210\313\267\202\347\352\303\353\204\357\301\336\356\226\371\341\371\374\353\374\275\335\254\373\321\261\305\322\250\210\236\257\335\277\330\221\205\244\306\332\262\214\201\366\330\222\233\334\367\201\374\260\210\344\246\301\300\371\261\322\351\203\204\337\310\202\363\344\277\314\345\302\304\304\336\221\254\275\316\347\351\340\340\226\276\340\372\244\274\214\363\244\344\237\227\207\346\262\362\317\245\344\217\332\257\327\216\315\360\225\276\205\274\245\236\352\357\305\372\261\310\303\313\344\352\335\375\323\242\352\212\253\243\316\222\234\372\306\250\340\210\341\243\235\373\336\274\336\317\365\273\342\351\332\315\201\203\204\306\275\312\255\321\200\334\222\250\361\371\331\307\360\245\274\220\220\305\202\372\276\203\220\374\352\260\373\220\363\261\344\264\233\332\314\276\366\345\222\204\223\360\265\311\336\337\333\222\276\340\307\257\270\261\267\236\237\336\231\305\374\302\334\304\325\274\231\326\344\352\330") -TOPIC_TEXT( -"\304\357\303\331\333\211\322\341\260\355\263\206\216\357\214\234\357\236\370\357\207\311\306\253\306\275\264\307\335\211\357\252\305\216\374\304\301\364\230\374\212\211\357\360\357\337\277\373\276\266\250\300\377\376\251\262\206\273\267\365\332\362\263\326\230\333\254\312\315\321\372\200\315\230\242\363\326\310\347\203\321\306\272\225\324\312\203\241\227\253\250\224\225\345\354\251\364\330\303\334\256\230\316\244\315\342\321\223\367\222\340\212\250\230\301\256\245\242\317\266\363\334\340\350\244\325\231\345\365\214\270\245\247\311\274\323\252\202\325\353\257\327\214\313\337\374\332\231\215\245\306\344\355\257\213\337\276\376\365\362\361\376\277\272\251\261\261\243\255\225\275\257\356\255\220\223\367\373\302\237\202\236\210\355\226\314\300\315\317\314\274\256\251\371\233\216\304\273\240\201\230\337\231\323\354\304\317\274\310\257\203\321\332\332\233\334\347\254\333\254\263\215\264\337\265\277\213\250\333\347\316\341\365\211\210\342\335\233\222\341\360\310\225\337\370\270\226\220\230\324\237\231\205\241\231\345\327\334\274\266\337\336\244\274\202\220\206\340\357\346\273\202\215\340\275\310\204\350\372\311\257\316\244\234\270\260\227\234\336\310\271\337\233\237\371\370\374\267\356\373\366\355\333\367\266\241\377\376\273\377\372\317\211\361\241\237\370\215\354\352\357\235\324\230\232\324\361\203\312\263\273\364\311\213\216\222\320\343\376\273\326\215\255\254\340\377\305\345\352\327\240\345\271\342\267\231\257\317\317\333\363\226\223\361\243\240\372\314\234\371\346\321\250\212\321\230\311\222\360\314\341\302\275\372\356\234\227\261\234\255\324\222\354\210\223\217\313\227\300\216") -TOPIC_TEXT( -"\241\321\354\305\304\252\234\376\365\253\326\337\211\313\201\353\257\343\266\270\322\324\213\234\231\305\335\234\245\314\310\200\244\343\237\223\254\365\314\361\321\331\264\267\270\227\255\225\205\217\240\326\323\302\210\267\214\374\371\263\205\323\370\372\360\301\273\203\356\373\247\235\267\267\327\272\357\267\316\216\347\224\223\237\342\353\307\255\224\336\272\215\233\273\260\342\272\343\203\307\351\337\261\265\261\202\345\236\314\200\241\347\202\311\243\331\254\275\320\350\274\255\325\361\260\221\241\307\374\254\200\311\364\371\307\226\276\334\231\350\232\362\235\242\334\263\352\356\372\300\310\274\276\321\217\341\376\317\217\354\250\253\345\256\334\372\244\357\245\274\245\202\366\323\210\246\223\241\316\373\303\313\330\324\320\221\206\200\206\234\366\225\240\227\307\233\316\341\352\320\377\332\222\314\337\333\337\313\350\302\360\350\363\321\377\272\256\377\375\307\237\276\273\377\260\241\363\265\267\372\263\362\244\314\341\267\305\322\200\371\266\364\221\330\242\376\224\246\275\336\250\315\271\331\303\250\371\224\213\363\362\360\226\261\306\322\234\254\346\315\210\373\201\243\203\223\222\315\243\313\270\237\321\360\374\263\331\350\222\250\201\205\302\356\204\330\311\352\240\366\214\340\254\232\257\332\306\372\267\266\274\307\347\214\270\362\277\363\364\255\316\214\321\316\354\304\216\251\345\315\242\273\272\251\323\336\236\227\233\254\226\353\325\310\245\202\352\334\213\317\355\353\277\334\327\323\337\327\235\346\253\215\336\347\316\200\367\202\217\367\277\365\334\343\222\271\351\211\357\322\343\266\226\353\227\233\262\256\234\271\321\207\267\370\275\305\333\260\350\373") -TOPIC_TEXT( -"\275\217\307\231\301\207\327\374\332\304\222\306\306\340\332\302\274\262\300\211\221\307\345\300\221\340\267\223\214\205\241\305\311\270\360\306\342\273\374\350\320\336\302\210\353\361\220\214\246\353\346\236\366\355\201\341\310\301\377\241\357\324\334\324\255\316\361\233\207\353\352\260\251\337\330\367\374\342\244\357\351\233\343\213\277\264\377\377\275\353\224\201\256\200\225\365\264\255\370\214\254\267\266\260\330\261\270\250\264\265\217\334\211\306\306\207\216\253\346\244\325\246\206\377\224\266\265\340\205\330\272\276\301\247\251\306\247\330\255\302\207\372\373\335\363\325\330\261\303\300\203\212\255\315\323\260\370\354\222\204\226\257\232\233\265\302\302\311\255\360\202\257\220\265\350\263\374\315\337\236\351\374\246\205\371\345\315\315\330\311\206\223\205\222\230\342\351\224\310\300\253\333\376\262\357\222\215\261\220\315\233\244\326\363\234\340\323\357\226\276\342\344\255\336\232\334\370\224\204\221\265\206\247\307\377\304\342\374\364\365\313\227\234\300\367\251\251\250\273\346\327\372\330\200\236\343\243\341\305\314\240\325\324\345\224\267\207\235\242\362\215\257\313\340\203\272\231\370\246\260\210\254\251\331\377\362\346\360\265\345\240\235\347\361\313\374\267\234\240\354\263\257\303\206\223\344\214\260\226\334\262\364\345\305\275\316\203\232\265\271\340\366\253\372\332\331\220\241\203\231\301\206\231\276\260\375\357\337\335\276\375\347\277\331\303\317\350\215\215\252\223\377\377\307\363\203\337\264\337\253\272\204\306\202\272\336\331\330\330\354\270\300\224\312\217\231\235\247\372\206\373\370\245\360\330\311\313\232\342\312\341\327\311\357\265\242\376\325\361\215") -TOPIC_TEXT( -"\244\260\210\317\262\354\230\257\271\225\342\331\332\265\227\334\305\305\350\310\260\275\226\270\211\221\373\226\222\327\217\221\370\336\230\325\213\370\227\267\274\271\370\244\216\237\376\224\324\353\237\300\201\275\314\237\252\210\362\343\303\203\340\277\240\276\356\240\303\340\300\340\277\224\200\330\200\330\350\264\346\274\256\231\313\273\357\364\211\257\343\234\241\330\216\211\243\214\355\235\227\302\270\252\347\371\254\202\271\271\227\212\202\353\211\201\360\352\366\356\204\357\371\301\260\231\203\355\276\373\230\261\210\347\271\267\323\217\346\242\274\311\372\214\234\322\314\372\242\314\332\230\314\306\250\351\206\262\354\245\311\330\301\202\361\231\356\226\317\237\252\326\223\326\352\352\327\340\243\342\367\350\213\213\213\304\376\320\204\357\361\373\367\357\231\350\215\205\272\213\327\312\300\251\250\336\355\356\356\376\367\350\243\217\374\315\301\320\341\214\376\323\372\341\225\322\227\343\264\247\320\210\257\334\376\343\344\302\244\313\325\233\223\323\235\240\250\255\374\260\340\274\241\314\303\262\222\310\206\300\200\252\213\333\305\213\304\320\227\260\342\246\374\201\365\300\224\275\236\220\341\353\221\227\257\315\315\214\340\206\347\364\230\206\357\365\307\216\205\223\263\203\222\343\311\337\265\317\275\264\311\273\224\230\314\357\301\222\261\234\313\212\347\243\307\325\213\337\206\354\305\215\362\323\242\230\370\370\273\340\201\330\272\235\377\346\240\317\333\353\313\274\333\311\335\325\267\215\213\215\215\366\324\255\232\222\227\375\375\335\203\307\276\270\312\257\270\303\317\231\374\355\215\317\376\377\217\307\203\221\213\306\242\207\265\207\332\330\375\353") -TOPIC_TEXT( -"\344\346\202\341\261\343\321\204\275\376\323\375\352\245\226\322\241\212\205\201\342\262\334\346\354\361\203\271\227\236\313\221\212\316\261\272\202\205\271\263\366\322\261\256\374\370\334\356\243\301\251\325\225\332\255\250\320\326\243\327\227\214\263\210\311\317\244\253\247\314\230\233\244\220\236\233\370\311\305\246\363\305\303\257\307\233\204\206\317\246\261\216\202\237\341\276\373\316\356\227\370\260\216\233\247\263\211\326\360\240\311\322\333\344\345\207\240\274\304\204\347\344\345\371\253\255\322\254\257\366\301\313\275\370\213\322\232\347\261\351\312\357\272\257\232\202\205\333\360\362\372\317\363\347\270\377\301\333\362\344\361\243\270\226\226\201\347\327\205\305\304\260\217\206\274\271\331\241\230\317\374\360\274\332\373\262\306\366\315\354\207\333\251\317\315\302\342\307\242\210\372\374\344\374\355\301\321\245\250\330\342\206\227\273\372\235\200\353\351\322\373\337\212\360\321\245\341\377\303\265\261\375\217\246\371\254\342\212\227\370\205\261\332\240\244\346\307\312\301\217\202\253\315\252\371\333\202\267\323\276\262\226\205\256\300\234\213\374\352\204\355\352\277\277\313\262\267\240\341\361\336\200\301\361\316\315\354\321\204\201\366\233\353\270\261\346\361\332\311\327\363\217\274\232\313\214\343\306\333\236\242\216\311\313\261\223\245\367\222\330\267\357\212\337\332\345\327\270\321\231\206\333\246\355\325\221\316\361\231\205\356\255\310\241\327\243\310\215\342\314\367\200\337\303\231\344\340\260\230\214\223\317\207\252\212\340\324\204\355\256\222\302\341\323\356\350\304\274\227\314\260\333\223\277\307\333\270\330\330\244\202\342\212\312\265\323\242\214\223\346") -TOPIC_TEXT( -"\327\337\363\256\345\335\311\300\364\356\247\335\333\352\212\235\247\263\365\345\302\362\350\217\213\302\346\210\223\365\254\342\300\216\254\322\334\200\215\254\317\347\336\314\267\366\357\337\337\356\253\337\322\204\230\305\367\330\212\325\204\237\201\241\313\324\324\371\307\201\246\311\322\203\263\333\353\205\247\265\244\363\224\271\236\323\375\227\342\214\356\332\306\321\222\256\332\201\376\236\303\247\200\367\337\201\323\237\303\255\203\277\233\362\245\217\303\301\206\337\333\332\350\333\216\234\330\344\310\347\373\277\331\363\370\360\247\345\366\346\310\253\313\263\313\251\366\247\213\317\246\201\274\215\203\321\267\326\312\341\341\341\204\241\250\216\236\353\313\325\265\232\230\210\357\277\366\306\350\200\355\206\264\325\202\366\232\314\340\307\254\265\327\335\377\220\312\200\221\243\352\214\203\217\252\232\264\311\310\347\227\263\374\250\205\335\376\332\366\345\220\220\375\373\366\261\260\360\203\270\330\314\277\316\370\307\213\361\207\353\276\323\277\365\355\267\337\222\351\245\215\336\263\311\202\231\374\322\342\336\204\303\230\346\261\205\201\257\245\255\221\346\220\332\222\251\254\320\372\220\231\377\304\201\337\273\346\254\201\207\317\314\233\257\207\377\226\266\315\307\270\304\267\272\357\202\306\241\213\312\202\214\271\252\341\263\221\227\344\267\321\343\266\261\261\272\270\263\266\274\204\207\312\254\243\217\371\327\251\202\215\316\374\366\274\363\227\200\336\346\305\300\232\232\270\333\324\254\212\244\307\273\240\233\324\326\344\263\357\312\370\217\243\347\252\207\270\256\336\361\217\253\256\236\324\265\211\203\302\213\343\336\257\345\266\224\230\262\224\362") -TOPIC_TEXT( -"\341\370\377\305\242\277\257\273\366\313\236\210\204\307\305\201\242\344\213\200\242\213\316\340\341\307\332\333\253\216\245\356\250\255\265\213\227\222\273\311\303\364\303\256\251\311\354\245\212\352\300\231\251\364\202\362\253\305\207\373\212\263\367\206\373\201\273\207\361\365\264\240\344\200\303\237\372\376\213\334\275\327\231\330\207\214\371\363\243\333\200\230\362\244\206\235\341\262\373\240\227\227\362\367\200\301\277\220\261\233\326\364\270\314\361\320\202\236\241\311\224\270\201\333\242\240\226\225\202\313\305\217\213\205\224\212\221\235\374\360\351\225\365\206\255\240\203\242\362\301\226\307\242\315\363\276\301\230\335\245\220\272\317\325\224\256\330\356\330\210\337\267\265\266\260\330\204\330\372\210\370\311\370\325\322\365\334\332\227\202\317\325\246\214\240\351\271\251\261\300\333\267\314\243\315\217\305\337\252\245\344\277\343\207\214\341\230\227\232\367\377\356\227\356\231\371\205\250\321\204\365\263\315\335\272\300\374\330\267\227\214\267\256\374\350\236\322\210\357\257\204\342\245\265\356\271\263\275\342\354\344\360\262\370\205\340\323\303\232\241\343\276\364\206\202\234\346\361\336\230\375\305\276\332\225\325\256\315\372\365\274\340\236\273\231\370\235\372\231\233\201\335\252\373\234\377\356\374\234\234\306\351\206\267\357\337\334\376\346\314\347\271\317\323\355\227\276\352\355\255\371\273\361\263\361\315\266\330\356\321\260\364\270\320\320\263\317\302\270\330\272\276\357\276\232\341\344\221\337\232\240\333\310\205\225\273\375\251\363\225\203\202\274\205\274\201\240\333\331\226\320\363\254\346\230\253\374\251\335\242\235\323\333\267\264\357\304\317\257\242") -TOPIC_TEXT( -"\326\303\323\207\366\276\371\374\310\276\307\365\372\325\313\374\261\227\357\362\377\325\317\257\274\227\354\202\254\314\325\246\330\230\350\361\352\342\204\325\366\372\306\372\356\321\221\256\327\227\307\372\372\241\355\373\230\365\211\362\266\217\223\357\347\346\272\345\314\362\312\205\357\261\374\221\260\203\215\350\214\277\211\200\263\226\277\305\233\272\265\357\362\226\216\301\257\363\260\364\223\362\263\300\207\345\324\254\200\236\214\206\374\362\271\253\223\305\350\220\365\266\257\347\245\307\270\216\207\334\332\255\367\202\273\246\367\307\265\326\207\211\234\362\224\201\347\247\226\227\233\203\217\236\317\376\370\327\356\257\264\276\223\356\252\317\374\263\255\366\240\216\254\275\256\202\313\213\301\323\336\225\204\226\232\304\221\230\342\211\267\332\234\244\237\300\260\321\343\355\204\261\302\341\246\212\264\314\251\341\350\222\201\336\352\344\213\362\222\360\242\323\242\250\257\270\202\260\250\357\355\355\255\370\230\310\372\351\357\231\323\247\374\245\224\314\362\227\254\327\376\203\236\314\370\263\346\311\316\314\277\335\257\246\266\316\342\260\344\354\343\351\343\270\322\365\341\231\311\326\233\226\226\371\353\346\246\214\215\217\373\214\217\216\335\352\274\371\214\374\355\241\373\316\327\256\214\372\314\220\376\245\376\250\321\343\204\230\243\255\305\212\266\313\237\344\251\307\330\262\334\337\213\375\256\350\261\370\356\360\304\333\214\215\214\321\364\237\231\262\257\267\311\273\377\277\347\277\331\243\375\220\377\377\361\267\277\253\371\274\207\356\233\346\353\307\257\364\234\230\267\251\206\326\336\354\340\230\255\265\344\314\212\267\343\332\250\271\314\261") -TOPIC_TEXT( -"\323\202\361\244\353\374\302\304\375\302\370\356\246\376\247\336\256\220\375\310\274\330\262\356\377\205\363\271\211\213\277\376\305\240\347\307\247\333\257\245\276\301\210\226\273\207\226\236\307\205\360\334\373\245\314\261\262\370\354\324\337\212\267\246\211\330\262\364\274\235\204\334\276\361\260\253\257\353\270\224\364\230\307\234\352\303\217\277\244\217\223\335\275\373\267\315\225\267\257\243\312\357\327\263\360\314\200\342\316\256\223\230\257\311\242\262\251\257\232\360\235\330\342\241\313\337\372\243\325\306\302\312\320\200\324\331\267\303\375\333\367\357\336\312\333\371\325\324\274\250\362\336\376\333\210\321\341\344\251\351\230\325\333\372\244\344\374\311\314\310\244\257\322\215\317\272\352\375\265\330\255\245\366\250\243\240\253\207\304\375\244\210\303\267\273\354\246\346\310\313\363\231\301\303\267\254\271\364\350\357\273\301\232\232\360\347\373\367\215\273\244\244\314\302\277\340\324\320\340\343\340\313\240\344\235\200\336\333\302\354\370\336\366\372\214\313\362\370\315\303\237\271\307\375\302\376\332\205\264\362\274\320\347\351\323\247\237\217\274\364\330\352\253\254\217\342\204\245\307\221\342\271\241\365\204\327\351\357\214\302\315\230\363\256\324\274\260\344\365\202\256\335\226\325\205\262\345\252\352\205\236\263\212\353\364\344\275\311\261\263\262\262\253\362\331\347\237\311\340\227\377\313\233\233\233\261\204\341\216\345\274\222\375\272\356\230\376\331\302\316\240\262\351\325\353\224\320\343\271\216\210\317\361\271\356\254\355\214\337\362\331\276\305\373\274\305\206\220\267\204\207\331\265\360\261\235\356\322\303\205\326\242\300\367\232\235\345\312\237\224") -TOPIC_TEXT( -"\304\277\367\276\346\355\330\264\241\345\256\362\256\226\262\222\352\365\262\213\265\242\201\365\245\216\206\331\334\336\264\325\306\277\375\324\376\271\347\300\201\275\324\230\270\240\303\264\331\267\345\360\344\375\350\246\214\374\343\270\240\353\254\213\202\330\302\234\261\270\341\224\347\274\274\261\360\336\240\307\211\357\277\241\305\216\202\245\307\261\314\240\314\356\236\255\247\275\276\275\220\221\323\370\251\345\244\212\375\344\235\222\213\213\314\363\317\347\346\215\372\214\306\231\226\263\344\274\231\214\246\364\327\256\335\240\250\214\316\254\203\342\342\323\360\327\343\336\336\336\260\333\274\305\362\214\227\313\255\313\365\227\360\353\206\275\206\313\375\340\331\203\217\372\335\311\350\314\352\266\306\357\341\247\344\255\215\343\226\331\304\333\374\213\264\253\241\307\216\277\217\361\232\353\271\343\307\350\360\277\246\330\242\230\271\224\224\276\200\331\264\230\212\246\333\216\217\210\322\323\211\242\357\321\250\351\264\200\223\254\342\260\277\265\265\266\340\304\300\336\374\323\236\357\305\370\310\307\247\337\336\310\320\345\214\240\321\216\375\361\224\355\331\223\250\372\371\371\241\353\340\311\376\373\367\220\220\344\225\205\377\351\245\324\224\241\262\300\316\222\301\332\362\263\321\373\264\204\303\327\207\261\210\215\235\206\224\315\340\306\347\272\215\317\245\276\205\226\273\212\245\226\236\227\233\356\350\270\363\277\371\333\352\326\347\351\330\244\370\365\370\214\222\213\373\244\200\343\207\321\315\362\261\302\364\266\303\323\337\344\335\225\217\210\243\372\321\332\246\221\200\226\210\275\376\357\345\331\211\364\225\244\326\361\300\224\366\227\212\215") -TOPIC_TEXT( -"\356\314\222\212\357\354\240\302\214\226\271\262\364\334\201\261\320\343\204\316\340\271\224\354\370\233\204\363\245\306\357\311\215\315\350\320\345\306\217\301\225\361\316\255\254\207\205\262\213\252\366\204\264\275\375\222\301\207\250\305\346\200\236\314\372\227\272\247\362\206\223\321\371\224\324\236\207\264\201\237\204\212\217\370\365\324\334\224\310\257\341\250\257\210\260\366\377\312\215\245\317\274\361\344\202\224\362\232\237\236\272\264\267\363\203\207\333\362\373\232\371\274\336\203\222\274\372\374\245\337\345\276\373\367\326\312\232\276\306\376\365\322\373\273\373\377\257\376\335\352\322\354\260\216\236\231\275\221\370\255\371\207\222\302\333\331\314\316\216\330\373\341\261\305\262\260\364\330\227\300\363\265\205\235\322\244\231\226\331\341\254\253\374\221\257\276\206\210\361\305\227\353\322\345\226\343\246\361\356\261\231\310\205\232\375\201\233\257\241\314\315\360\234\224\360\240\345\200\322\344\222\377\221\211\332\324\302\325\274\342\212\231\202\362\321\343\321\337\210\275\342\206\327\355\367\247\362\352\352\247\317\226\311\267\274\342\240\344\357\343\337\372\214\231\275\360\341\264\374\340\203\217\354\330\361\236\337\242\265\306\337\247\251\271\202\325\304\333\202\265\214\254\371\371\322\316\244\272\376\320\263\244\240\201\316\316\335\326\273\277\205\234\243\275\314\337\263\222\254\212\330\305\377\337\367\265\253\227\374\216\237\376\364\300\201\275\367\365\247\367\374\337\221\203\222\252\273\203\256\236\310\213\337\251\314\370\302\311\352\207\206\260\263\376\342\365\251\265\216\205\222\354\270\317\275\260\326\306\323\257\330\310\364\351\254\314\201\221\254\271") -TOPIC_TEXT( -"\247\227\345\301\225\364\260\220\330\311\345\371\372\330\375\352\316\321\376\313\321\206\331\245\377\275\313\364\330\212\217\255\342\206\203\245\307\232\344\232\222\344\344\200\245\326\231\306\301\326\212\325\271\220\336\225\331\337\241\253\327\227\347\230\207\204\206\267\266\265\302\252\231\364\252\254\331\374\233\372\202\245\254\201\246\253\240\231\341\255\273\260\274\337\364\232\320\232\217\364\370\355\333\267\357\336\313\257\343\225\363\324\262\200\204\310\260\253\256\227\275\206\212\347\300\333\221\207\273\333\227\243\307\374\257\340\355\352\326\361\321\267\261\333\230\277\352\305\375\206\226\323\211\201\267\257\200\272\320\241\301\357\332\225\367\357\302\276\357\277\370\374\275\364\210\324\313\213\377\277\254\241\200\351\220\301\336\355\350\307\222\353\323\232\374\241\307\342\326\222\232\233\355\272\377\267\353\342\323\271\231\203\265\265\244\312\230\301\323\260\227\262\370\327\257\247\223\234\223\265\340\301\271\246\264\372\370\231\370\356\361\365\274\253\275\316\252\332\346\246\344\374\265\311\201\305\364\300\272\211\351\345\227\370\355\273\306\251\260\262\271\347\242\244\355\307\247\257\367\310\377\367\256\315\336\262\302\343\213\344\206\341\351\261\206\375\334\317\267\271\223\343\276\247\343\333\363\303\272\352\263\222\254\312\332\261\360\341\261\267\201\226\201\200\262\351\211\234\240\336\206\226\251\331\261\371\253\327\212\351\360\341\327\255\371\244\326\240\270\261\275\340\233\250\224\317\374\253\212\202\233\264\245\336\262\264\361\211\363\210\305\216\251\216\273\336\375\251\304\362\301\245\231\360\257\306\306\355\310\353\244\240\375\250\354\317\332\236\207\334") -TOPIC_TEXT( -"\330\333\325\333\313\221\203\243\352\322\256\206\313\251\224\220\201\204\231\250\254\346\360\226\332\210\276\374\235\364\230\237\276\371\237\363\212\277\305\205\306\343\241\266\261\376\213\324\204\253\203\327\204\234\313\244\261\320\372\216\264\330\370\212\211\264\266\224\370\366\345\302\333\254\261\200\214\222\250\302\343\253\201\227\276\351\353\355\311\360\226\343\320\267\371\365\277\340\261\277\201\241\342\262\246\350\341\225\260\317\236\277\272\325\242\371\363\354\303\275\316\245\205\252\257\306\307\317\273\312\216\243\304\363\215\252\367\243\360\211\264\257\275\316\345\371\363\306\324\274\257\310\215\323\373\356\263\214\275\234\265\336\351\360\247\205\202\243\317\333\342\200\270\234\361\237\361\347\323\215\260\346\212\326\251\375\216\357\320\343\263\367\316\244\243\276\327\226\273\215\226\236\252\353\220\236\343\302\312\253\356\255\247\335\273\367\373\372\324\337\371\353\246\350\320\263\250\357\203\275\275\376\365\322\236\313\343\336\376\362\306\266\221\203\246\305\241\313\274\325\216\257\310\265\330\357\240\365\201\322\373\241\355\215\252\204\260\254\223\343\254\304\335\366\354\351\376\212\314\271\227\326\201\202\244\260\357\254\264\327\211\331\262\201\306\342\362\226\330\345\314\247\262\313\375\205\335\227\341\246\365\227\353\370\274\272\206\203\306\222\264\273\301\372\343\334\272\370\262\332\306\370\275\340\260\311\211\225\244\334\265\273\331\351\202\245\352\327\320\327\322\340\233\211\275\220\217\326\324\320\322\255\204\314\301\220\230\220\306\241\266\317\333\341\334\237\322\326\204\242\332\253\226\214\271\327\272\226\237\202\243\303\375\230\374\301\234\375\363\221") -TOPIC_TEXT( -"\365\365\354\365\276\252\340\230\215\232\366\237\307\223\204\252\351\261\224\274\264\301\337\306\374\362\325\347\311\247\345\355\354\272\230\272\263\346\316\362\371\330\375\302\263\220\352\202\332\254\327\320\202\361\344\371\356\342\306\367\366\262\202\347\210\366\202\332\330\254\223\263\313\337\242\255\272\227\243\227\206\232\204\214\361\205\255\210\342\221\210\277\254\275\326\220\372\254\335\311\315\214\263\211\365\225\221\216\313\270\331\207\253\334\330\365\251\354\313\333\200\257\377\224\200\362\231\240\343\352\276\263\351\221\205\357\202\305\277\350\300\362\266\367\262\340\203\377\360\221\274\231\224\357\322\347\216\233\202\225\310\362\232\346\204\331\205\227\267\252\314\320\344\223\320\305\261\256\250\213\253\363\241\267\252\357\210\224\337\266\212\331\224\212\331\334\330\363\211\303\335\205\252\314\220\364\234\322\344\334\304\372\316\334\363\301\302\302\301\320\214\354\277\316\335\300\276\320\310\343\355\317\353\351\362\254\347\276\376\373\355\267\253\316\333\233\313\213\307\260\247\203\205\353\257\326\370\251\222\276\302\274\346\360\326\277\337\370\340\247\302\215\205\322\366\230\253\225\266\372\267\364\202\317\243\261\326\265\271\276\301\362\344\362\202\313\306\206\266\206\236\257\225\374\214\200\333\304\203\274\231\330\266\372\250\212\260\275\251\237\327\375\310\267\311\345\205\206\316\271\261\274\202\211\360\305\200\266\251\340\316\344\310\321\231\327\322\373\245\350\270\315\310\206\274\231\220\246\255\212\343\311\270\202\215\303\217\347\237\226\234\266\244\241\314\211\267\320\265\243\223\360\221\275\240\301\250\235\201\272\343\355\277\340\373\362\350\330\346\271") -TOPIC_TEXT( -"\347\323\316\247\217\332\273\267\214\314\321\245\303\312\201\372\212\253\371\305\320\250\355\241\307\326\303\266\302\242\376\330\372\254\306\241\364\230\365\220\260\217\360\327\334\324\311\217\215\270\250\204\343\227\270\224\263\342\356\202\263\365\203\233\360\371\264\262\233\340\342\216\253\267\251\276\242\337\304\317\200\236\205\313\305\233\327\211\257\300\201\272\360\215\221\324\357\325\272\221\362\341\364\255\214\246\226\374\363\313\270\201\277\373\253\203\220\330\202\303\306\202\274\360\201\223\376\242\261\222\232\371\213\231\220\267\350\367\343\220\262\344\371\356\233\213\346\247\203\373\371\313\225\205\275\241\250\205\302\277\272\364\341\231\261\267\275\361\271\351\336\302\335\261\343\215\347\316\222\334\277\374\211\257\375\275\317\367\260\260\350\225\262\252\373\314\300\262\313\250\305\263\302\243\221\243\265\267\245\252\317\343\365\265\337\234\270\220\221\200\347\305\256\260\270\310\236\360\233\346\316\376\334\361\314\346\232\243\221\241\227\247\245\264\267\300\301\250\256\365\245\256\253\305\210\237\256\271\270\356\370\341\367\356\335\374\345\345\237\331\310\202\365\245\247\307\367\357\366\335\273\362\347\251\377\307\237\266\314\337\321\346\213\370\236\301\302\201\313\265\256\222\200\303\327\366\207\325\325\256\301\372\367\360\363\340\240\367\231\237\242\361\222\366\262\320\346\277\215\214\214\215\266\265\367\366\364\217\234\340\377\261\203\230\257\361\304\240\360\273\357\310\256\230\314\206\275\266\266\225\226\361\363\303\322\343\215\241\307\270\253\220\362\372\313\327\211\236\352\373\343\222\354\242\372\307\321\346\355\240\311\375\222\364\350\340\260\231\277\302") -TOPIC_TEXT( -"\243\332\225\364\346\234\344\304\267\243\326\317\254\303\262\322\326\277\223\332\326\325\204\356\276\306\322\212\372\211\251\351\261\306\342\216\230\301\237\316\272\223\222\344\334\260\210\357\344\205\347\341\234\227\356\344\254\336\233\311\226\271\226\366\306\324\271\237\241\353\256\334\250\336\357\341\215\224\226\202\334\315\364\245\260\305\310\262\334\210\207\365\201\343\375\337\253\250\307\302\220\223\242\200\312\360\323\355\215\317\300\306\352\277\227\334\243\353\254\304\200\220\277\343\241\376\336\261\341\201\237\320\343\333\235\337\341\246\347\222\325\222\252\313\375\356\267\352\242\312\227\233\316\335\307\271\364\211\324\325\276\333\246\320\237\370\246\351\344\362\240\331\221\361\213\232\200\241\233\347\352\363\315\220\243\257\367\200\270\272\264\273\262\370\203\224\352\254\334\275\360\335\221\345\303\250\336\275\365\222\241\250\257\275\336\336\274\301\247\203\270\203\265\265\347\232\367\353\303\377\227\260\263\330\306\243\226\336\246\245\346\301\312\353\355\244\343\213\374\272\332\355\350\361\375\215\236\336\201\244\372\207\206\306\236\215\334\342\346\372\361\320\327\327\377\273\361\212\371\211\361\237\271\256\367\275\270\327\327\217\217\362\214\231\256\237\237\376\352\367\377\341\310\265\217\216\374\345\326\373\375\310\325\276\231\311\333\370\265\266\225\226\307\311\302\322\343\215\315\217\276\231\202\320\366\260\276\361\212\211\315\376\363\266\220\372\344\314\236\310\224\247\206\227\237\345\251\337\374\314\250\375\204\273\261\303\350\211\200\266\330\205\222\305\307\373\355\243\354\311\366\262\211\263\373\263\264\345\254\330\255\340\306\214\213\277\323\342\227\301") -TOPIC_TEXT( -"\370\366\367\243\224\234\300\327\241\337\341\320\214\357\245\334\217\345\301\271\274\370\215\271\242\243\327\372\270\207\232\305\254\264\222\366\267\364\254\314\315\350\300\273\353\234\320\236\323\303\303\346\232\222\345\234\334\262\351\221\262\361\343\364\242\364\375\370\362\323\205\305\371\351\273\251\211\221\314\224\351\247\364\264\325\326\332\345\312\304\347\223\307\217\216\234\330\273\303\276\266\321\244\216\247\241\324\224\320\256\234\240\217\333\336\373\206\215\236\324\357\231\235\231\225\360\365\362\261\344\322\200\203\331\247\233\250\312\247\361\265\343\311\202\245\272\362\316\277\346\232\275\275\301\326\321\311\314\324\246\274\337\275\347\307\366\242\377\215\262\367\326\276\273\203\226\213\263\346\213\254\230\236\367\341\365\355\325\221\346\257\245\216\246\211\366\336\303\350\202\246\214\332\216\354\225\300\200\252\343\310\225\244\271\314\352\335\326\201\235\371\256\340\230\326\354\371\330\326\334\275\223\370\216\342\333\354\264\330\372\254\241\265\351\261\331\227\343\215\322\224\227\314\307\245\230\253\315\204\372\246\354\267\357\203\315\265\217\251\341\240\337\223\362\352\214\334\222\272\237\370\327\237\327\233\213\370\231\373\322\366\360\224\303\230\237\220\352\305\350\261\225\247\322\363\255\217\331\235\310\242\331\212\231\353\223\260\350\261\307\360\245\263\307\301\321\375\335\322\251\313\244\232\233\261\264\277\305\265\244\241\357\307\340\300\262\207\226\241\320\302\203\337\341\212\302\220\244\367\321\341\333\337\276\324\263\266\326\226\206\210\253\343\253\315\246\270\363\225\242\216\257\343\303\203\235\372\355\255\261\374\234\244\365\365\321\207\243\202\251") -TOPIC_TEXT( -"\362\261\376\257\216\202\230\221\244\325\357\237\336\203\221\313\342\233\205\344\213\332\235\207\364\240\203\313\323\204\374\335\230\362\261\364\207\342\265\245\265\322\316\231\235\225\312\247\215\230\344\266\215\342\324\231\353\356\365\273\237\343\300\354\333\267\263\357\344\327\247\360\357\200\320\317\246\237\226\341\204\372\313\241\350\335\330\316\265\370\240\300\367\231\272\246\373\245\302\201\226\371\215\254\307\263\213\257\256\207\255\315\206\216\260\324\326\274\372\372\243\277\210\275\316\372\257\255\366\240\304\254\275\326\240\275\346\234\243\201\224\311\333\327\265\373\213\314\251\300\272\230\376\244\327\313\312\333\300\326\314\213\346\255\332\303\322\350\301\260\337\206\320\343\264\373\270\236\224\226\226\214\244\323\242\214\300\344\254\331\301\205\315\347\366\362\351\242\213\202\246\307\265\350\226\326\345\223\350\261\245\273\310\214\371\377\355\316\245\354\325\216\265\270\261\272\360\300\256\372\254\232\360\200\275\250\376\211\364\230\261\337\361\214\345\300\367\265\314\230\261\217\200\360\204\271\320\365\321\352\263\357\237\242\233\237\202\377\372\250\206\215\371\377\370\337\267\223\301\276\275\361\302\311\234\374\354\361\376\232\336\301\343\333\235\337\201\261\341\375\256\321\212\325\326\246\360\363\221\332\261\334\277\333\246\365\350\320\336\251\232\374\313\260\246\246\346\276\251\354\223\360\271\214\271\240\301\360\244\301\275\203\241\307\273\355\333\317\327\226\230\224\252\262\256\250\346\231\362\243\371\324\326\203\235\217\216\317\325\236\230\357\375\255\303\223\261\376\370\274\360\340\357\277\374\333\335\341\357\232\257\365\215\371\260\233\252\226\204\354") -TOPIC_TEXT( -"\273\270\300\335\324\273\244\320\374\257\237\257\277\353\307\207\370\245\346\341\366\342\362\347\357\300\231\320\240\201\236\354\335\225\311\313\254\322\262\262\271\221\277\371\212\327\356\330\332\326\320\330\244\205\313\217\265\370\305\264\256\344\304\375\262\350\242\231\251\335\221\215\274\323\347\264\332\327\362\300\330\240\245\327\212\251\320\270\212\236\376\273\331\262\310\244\257\224\336\374\313\260\202\372\212\221\334\250\263\252\317\250\273\225\335\311\334\211\264\307\253\226\317\347\212\352\353\237\265\212\372\331\274\377\377\256\320\275\215\320\236\252\224\314\344\306\322\220\256\214\306\206\266\252\306\362\342\206\350\334\302\307\254\204\245\345\345\236\370\244\356\302\217\347\246\247\306\206\352\207\332\332\256\341\276\243\311\255\265\252\325\361\361\320\220\346\361\202\306\354\201\372\262\216\210\274\303\373\316\311\202\203\243\344\341\221\340\306\377\236\230\271\201\247\201\260\262\245\330\247\241\221\227\200\340\207\374\327\230\262\203\261\223\345\336\324\276\216\261\244\366\314\346\356\214\367\263\346\222\210\306\251\240\303\314\331\357\365\326\260\256\277\275\207\247\272\213\322\323\331\267\315\260\231\221\220\335\315\201\251\272\263\366\362\343\351\307\303\344\355\367\373\265\325\366\256\247\212\331\307\270\245\360\251\265\233\231\222\343\233\227\347\301\221\240\254\275\266\200\202\332\312\323\252\316\340\325\254\235\253\350\237\305\267\364\366\321\245\270\226\244\215\261\341\303\327\257\336\206\267\370\363\324\372\275\263\346\327\227\213\275\206\332\234\311\345\240\325\306\351\220\373\316\244\214\331\242\321\365\251\270\311\306\242\270\253\312\260\366\316") -TOPIC_TEXT( -"\217\276\254\362\247\316\343\333\322\300\335\250\265\336\212\204\333\202\235\366\214\327\373\312\221\345\326\325\272\230\205\216\340\241\222\373\341\255\261\340\233\250\354\226\301\205\377\312\334\304\277\275\364\326\224\275\310\301\323\275\253\304\254\343\221\273\333\322\255\202\270\334\364\341\373\314\211\272\360\344\251\211\271\221\230\376\267\254\240\241\300\303\221\244\231\375\376\370\253\360\247\324\200\203\337\367\300\374\322\241\346\356\341\220\261\253\320\313\272\353\316\235\275\360\335\315\220\313\355\334\251\355\216\266\267\274\235\211\222\200\376\224\355\255\255\322\337\306\272\373\356\307\224\204\211\353\370\262\216\227\276\215\352\311\222\203\374\230\267\207\302\202\231\251\370\202\337\325\360\261\351\263\240\363\336\365\302\310\215\274\364\227\303\307\373\300\245\207\247\274\364\370\310\344\333\313\342\373\355\261\304\203\341\351\361\361\370\221\220\336\342\315\275\231\214\346\213\225\267\301\325\301\356\272\351\202\200\307\337\260\320\375\330\223\276\356\357\255\366\261\350\277\333\221\200\362\345\220\335\353\361\334\321\212\376\233\204\251\307\222\265\322\216\217\345\320\343\252\315\324\210\330\354\237\201\366\252\324\321\240\205\201\364\251\331\376\261\242\207\200\214\201\200\320\376\374\243\261\351\234\227\352\327\350\371\272\226\307\213\333\235\337\256\215\365\367\202\225\203\236\256\343\276\257\347\336\344\277\271\221\210\212\215\205\216\216\237\367\203\206\241\347\245\257\217\354\320\301\337\247\336\207\321\244\240\370\263\365\204\340\266\376\301\302\225\255\262\250\304\253\303\226\221\353\301\202\242\245\214\334\356\365\336\274\267\371\325\211\375\373") -TOPIC_TEXT( -"\366\371\226\371\262\220\344\374\353\362\201\215\253\331\317\320\234\252\240\350\352\241\246\357\333\303\264\334\241\266\225\317\262\311\266\371\276\241\343\206\213\251\256\310\366\345\306\204\272\213\206\347\202\260\350\220\357\337\277\341\361\211\226\216\304\367\271\334\342\207\302\322\343\322\231\340\323\314\241\300\206\325\252\204\212\351\267\344\226\255\203\315\346\215\240\207\224\267\274\221\345\240\224\377\340\333\350\251\266\241\257\272\336\236\271\336\332\362\342\375\373\367\300\253\253\253\214\246\313\231\210\343\376\252\221\371\271\212\212\332\202\350\254\252\222\332\267\210\336\310\224\313\233\235\253\327\342\212\245\264\316\311\216\211\334\260\374\306\264\236\242\333\253\207\216\240\355\221\336\322\326\376\276\356\303\207\362\262\206\211\342\264\313\362\225\323\372\322\202\370\310\360\303\271\351\202\265\225\315\215\347\215\321\256\271\361\260\336\300\367\230\275\263\372\236\343\222\270\216\315\310\267\276\277\225\262\267\346\204\311\222\201\374\246\203\262\227\313\203\202\211\256\216\371\273\253\332\277\214\344\203\314\223\315\347\257\234\326\370\325\325\336\303\302\244\370\262\376\240\230\313\350\264\375\262\216\232\226\340\270\200\372\353\377\343\337\202\334\336\377\253\302\367\370\354\333\267\303\277\375\260\334\324\261\202\230\320\306\324\220\222\226\331\316\225\215\240\301\205\310\346\363\360\217\262\243\217\350\304\236\357\267\371\371\226\225\204\203\313\217\255\302\342\355\210\371\316\337\375\334\221\362\263\306\201\271\240\206\214\266\345\221\244\361\205\340\375\345\223\232\316\336\207\261\334\377\203\261\232\370\337\221\333\325\314\226\301\322\342\215") -TOPIC_TEXT( -"\372\274\212\264\313\250\272\230\265\263\234\333\260\243\210\316\226\215\375\324\324\331\250\367\227\363\306\355\266\332\240\241\366\273\203\243\303\337\265\267\337\344\322\272\252\324\365\304\253\372\347\220\361\344\242\342\351\276\340\240\253\206\303\256\237\253\306\333\262\270\277\260\226\234\221\275\205\266\205\256\245\304\233\213\334\330\242\367\325\201\270\216\204\270\377\323\330\344\312\256\361\300\336\254\266\315\303\220\303\224\325\217\211\374\245\271\244\221\231\263\206\214\266\214\264\271\270\236\214\203\276\367\260\246\246\366\313\255\364\244\231\363\330\202\345\332\356\235\261\365\356\317\211\337\227\315\213\306\377\336\233\315\373\277\334\254\256\364\352\315\342\257\335\243\263\200\337\316\376\254\246\245\345\302\352\306\201\303\273\334\242\306\236\215\317\346\242\307\275\203\203\374\241\310\253\271\206\211\347\357\241\341\327\360\306\351\203\246\236\337\341\261\245\307\226\311\373\301\322\343\213\360\360\352\220\253\210\357\214\231\206\227\244\261\325\364\333\315\211\320\200\374\345\351\256\240\237\247\362\206\340\306\314\347\352\255\303\301\366\274\272\355\374\353\262\331\266\220\230\270\361\207\354\237\374\360\353\337\377\232\245\316\365\224\311\323\312\256\237\361\344\237\327\323\222\341\330\206\371\376\375\352\345\300\272\333\243\320\340\372\372\372\257\246\272\364\373\255\302\222\320\335\272\301\257\317\250\202\304\312\246\311\364\365\233\352\217\357\215\337\266\242\222\274\312\371\374\250\257\315\364\200\256\213\356\331\206\372\220\341\340\371\322\217\362\205\252\354\310\215\277\352\320\250\330\362\274\201\253\301\230\316\260\367\275\363\345\310\340\306") -TOPIC_TEXT( -"\301\236\312\227\204\346\310\201\352\215\267\202\340\221\266\371\273\342\206\322\302\204\341\273\256\315\320\331\354\230\263\362\361\230\223\357\312\357\365\336\204\231\226\276\377\315\236\355\210\267\317\320\367\361\241\303\373\217\234\375\361\364\273\373\217\361\277\364\253\327\272\255\275\367\251\222\377\366\272\337\262\336\312\222\227\260\257\234\263\340\255\317\350\371\267\237\206\235\263\267\254\222\233\374\347\217\230\217\215\235\262\200\311\371\247\370\324\373\363\344\335\330\374\255\326\376\346\365\317\306\342\227\373\246\357\335\370\361\202\257\226\236\333\324\202\254\242\275\266\250\210\340\310\340\300\361\333\265\203\276\234\230\270\206\227\245\212\223\213\203\355\330\351\332\325\237\342\327\356\305\332\301\272\252\362\310\200\325\207\362\263\255\243\215\352\361\343\276\213\256\302\257\225\340\227\203\357\273\206\300\340\372\235\267\255\321\252\376\271\341\216\242\311\211\254\211\330\250\205\204\245\336\237\365\216\244\271\336\362\306\306\237\352\357\361\233\224\206\230\304\245\272\320\323\343\235\273\376\375\363\372\275\350\256\230\232\326\230\221\240\261\270\361\367\343\235\302\254\232\230\356\216\372\252\210\255\320\272\356\321\201\341\376\320\337\200\374\365\262\350\360\241\360\343\372\265\202\200\264\347\337\366\202\213\363\252\375\362\217\347\261\374\252\342\323\271\360\245\257\346\233\330\313\230\231\210\207\332\376\245\334\270\373\356\307\350\231\330\302\353\262\220\252\247\316\310\222\251\251\260\242\303\331\330\337\357\254\230\352\322\355\274\253\324\231\372\301\276\211\312\241\341\320\343\360\340\241\343\262\225\206\201\327\253\342\234\312\353\327\256") -TOPIC_TEXT( -"\341\330\324\375\373\343\223\255\311\376\361\276\243\243\310\256\371\274\263\256\356\312\325\326\255\220\377\306\313\312\255\314\343\330\321\265\353\227\331\261\266\371\376\371\365\346\227\231\305\264\371\223\365\245\305\314\323\324\323\312\333\337\262\303\366\274\350\346\212\332\271\375\316\213\224\230\307\326\230\211\217\277\264\331\200\375\346\314\231\353\302\340\350\330\274\316\345\244\301\317\207\377\330\311\313\337\304\331\313\217\255\252\201\226\320\236\333\224\201\243\352\211\356\327\343\227\251\220\227\361\345\362\315\240\220\230\235\323\374\244\370\233\336\254\323\275\234\305\270\315\306\356\335\365\316\244\221\355\364\302\327\245\322\361\266\246\241\342\326\202\325\373\227\313\270\222\274\263\331\220\256\246\232\340\371\337\205\352\352\200\254\334\316\213\310\350\322\342\326\341\341\305\272\261\203\236\263\210\241\224\264\231\364\334\207\251\350\250\364\364\351\241\235\325\321\326\247\332\324\330\330\367\354\270\314\336\233\317\234\351\353\271\226\266\324\337\233\262\253\364\331\320\273\303\321\243\240\311\366\240\303\253\253\213\262\332\337\332\332\332\317\217\344\250\272\257\200\333\271\276\350\341\221\320\347\270\230\210\315\261\214\230\321\375\351\275\254\311\266\374\362\253\223\340\325\330\342\255\327\217\232\251\326\276\336\330\210\236\224\332\237\300\315\225\313\237\200\255\313\343\215\202\267\376\361\324\242\325\335\263\245\223\316\313\373\261\212\275\306\246\341\355\300\235\240\275\215\303\345\321\372\366\243\312\277\233\327\200\214\377\250\215\261\330\256\310\262\326\216\300\345\315\244\200\311\276\201\333\320\217\276\254\232\362\314\221\244\377\343\357") -TOPIC_TEXT( -"\377\367\253\247\272\246\334\322\333\373\261\206\361\232\324\205\330\230\347\230\234\333\230\235\313\300\275\331\361\303\310\370\357\213\300\275\346\345\253\211\251\353\371\211\237\361\210\375\346\365\335\317\244\272\275\356\344\264\353\314\265\206\307\245\347\362\360\251\326\362\343\340\274\346\355\306\347\357\234\310\274\227\240\254\366\246\254\275\266\250\212\216\256\227\331\246\303\206\240\243\335\316\275\201\251\240\302\317\336\224\225\224\256\371\214\253\365\303\226\346\245\360\236\304\241\205\367\266\310\212\215\235\340\210\333\227\206\275\221\326\311\363\364\256\343\354\263\207\204\326\212\232\260\361\347\256\267\302\370\311\252\301\351\207\331\241\205\226\320\342\356\224\255\351\261\321\333\221\240\333\302\261\347\221\276\363\235\335\367\272\250\251\200\303\367\356\353\271\227\306\266\202\225\216\242\270\335\352\200\370\321\306\327\244\353\262\301\252\225\254\205\325\302\236\215\201\206\266\346\347\346\236\337\354\350\272\207\336\272\357\337\276\261\317\277\277\204\376\306\335\257\313\364\316\273\373\316\257\365\307\334\234\344\327\311\224\365\371\224\313\267\211\361\247\367\356\333\337\346\260\361\225\206\343\351\245\214\315\202\337\366\272\372\347\243\240\312\314\265\263\343\361\213\314\203\304\303\211\233\256\230\224\230\370\355\261\257\216\226\350\246\207\307\215\217\260\272\311\230\200\367\304\322\234\266\355\206\213\355\275\215\274\305\276\272\372\232\236\311\327\362\256\274\302\224\257\213\371\367\313\222\231\372\243\343\277\216\313\202\210\356\250\262\346\355\233\224\230\247\217\226\302\327\243\305\200\302\207\207\222\203\253\261\257\214\226\301\362\277\237") -TOPIC_TEXT( -"\276\242\337\303\237\252\260\252\240\233\340\245\231\336\330\375\371\267\262\237\206\231\242\246\321\245\344\257\224\230\360\315\300\205\301\202\224\332\256\213\370\213\271\321\267\276\302\253\260\353\324\334\336\320\236\243\357\314\245\210\353\375\356\367\242\346\366\314\217\307\271\303\365\263\355\244\251\226\364\274\371\336\215\326\204\261\250\204\330\372\220\354\321\264\374\375\231\310\326\312\311\234\223\254\377\315\371\240\220\267\300\360\334\320\216\222\304\370\331\373\200\304\242\334\241\243\271\264\315\246\240\261\246\363\343\344\246\270\334\372\254\354\227\301\344\241\367\202\301\364\230\244\224\214\342\242\227\357\363\200\300\215\200\351\333\301\205\362\336\260\326\271\221\367\345\232\335\343\217\276\311\233\265\226\340\233\313\256\211\336\305\265\270\266\255\216\277\217\217\375\237\241\313\303\331\311\372\307\317\373\273\325\224\335\357\323\364\364\323\213\363\376\251\373\366\335\345\320\354\313\333\360\200\332\205\332\332\222\344\234\276\360\234\247\311\346\302\314\346\242\223\336\326\264\311\242\240\333\324\233\320\312\334\336\221\233\373\310\376\312\351\347\244\216\313\353\346\242\275\206\303\306\363\266\345\265\371\323\215\243\377\252\251\307\313\221\266\312\271\341\323\244\337\230\260\260\334\344\352\261\212\351\231\267\255\372\336\375\351\255\202\344\376\214\227\350\220\314\232\324\217\225\237\257\347\250\205\305\305\367\310\246\360\311\323\307\273\340\253\267\277\310\305\204\370\377\303\206\207\305\205\236\340\377\220\214\332\305\203\301\245\272\327\272\302\223\257\343\247\374\227\311\203\257\362\344\306\315\217\361\305\351\257\353\322\267\352\312\267\334") -TOPIC_TEXT( -"\276\225\250\370\257\331\354\314\354\234\366\372\314\374\232\215\242\237\230\362\332\220\264\374\215\376\336\366\231\310\206\211\220\221\256\271\354\262\221\231\203\342\264\327\217\234\370\327\371\202\264\264\311\356\265\270\321\320\324\213\301\261\204\357\273\342\276\350\341\270\365\376\370\220\213\223\221\237\357\333\335\215\377\320\240\307\274\265\341\225\334\325\321\234\255\364\330\353\204\267\310\324\245\232\337\304\231\327\335\356\272\300\272\240\310\336\327\267\343\257\371\355\261\312\245\340\361\341\231\354\277\277\334\243\245\214\213\226\312\305\363\366\214\311\224\324\371\206\200\333\342\317\362\250\361\227\243\205\254\347\215\333\244\350\240\334\230\277\247\365\367\332\362\273\242\344\226\243\227\300\276\225\215\230\371\362\227\270\366\313\275\240\314\242\343\314\310\244\360\235\374\375\327\206\201\333\352\312\310\223\223\224\251\320\252\353\325\265\262\360\375\230\243\350\237\340\263\310\275\350\230\352\342\200\245\372\352\220\333\252\212\303\221\376\312\324\265\365\270\212\316\216\257\377\221\321\363\321\262\231\304\224\244\343\370\352\310\301\262\235\222\361\326\340\360\243\221\244\327\254\320\302\217\361\320\343\263\355\217\265\374\275\226\372\312\213\211\374\312\315\364\307\216\347\230\316\343\357\352\247\323\334\310\247\210\340\372\241\345\231\224\364\226\361\375\323\253\343\326\334\310\341\321\211\250\366\372\354\233\275\275\222\307\276\270\312\243\360\241\252\246\214\352\251\260\262\224\234\272\264\227\237\271\241\215\332\236\374\352\204\205\277\373\377\356\227\327\230\334\317\331\261\322\301\207\312\375\345\253\353\240\341\315\226\303\302\315\345\371\341") -TOPIC_TEXT( -"\272\343\267\367\233\311\207\237\312\232\245\276\355\260\323\220\252\362\205\327\312\366\302\277\274\345\352\214\331\250\342\334\261\240\313\336\230\234\225\365\200\311\361\273\234\327\227\241\275\235\307\245\336\237\204\360\374\337\212\262\356\252\331\264\322\261\342\220\313\365\373\346\312\360\374\325\374\244\371\254\363\355\245\333\267\362\324\272\370\320\377\222\356\342\357\243\377\211\350\307\216\237\306\307\203\375\234\217\216\326\324\350\374\267\210\311\371\223\200\324\200\270\335\235\234\211\356\276\377\352\325\274\233\223\213\221\241\212\227\306\304\300\262\227\273\236\270\201\266\277\305\304\265\311\235\314\234\215\271\304\350\240\373\364\230\325\313\231\251\344\271\270\201\374\254\223\202\314\334\221\362\263\254\271\354\300\300\206\325\370\367\317\213\225\245\261\273\330\353\231\206\323\340\255\243\254\302\307\252\337\221\274\371\245\341\344\215\375\276\310\326\312\317\373\277\346\200\203\212\255\364\224\232\253\254\361\334\306\356\344\205\242\325\216\233\371\257\356\324\244\242\265\261\336\222\234\335\265\364\230\262\213\367\207\374\255\350\310\230\262\351\356\370\347\240\301\356\202\305\330\325\361\205\360\351\217\373\207\316\346\333\255\265\330\236\317\210\222\325\377\351\377\237\216\375\363\325\237\254\260\330\231\214\331\363\311\346\265\344\316\234\271\217\225\332\254\263\204\256\227\266\244\256\232\203\353\277\311\256\244\364\230\303\371\251\360\233\312\366\313\317\237\331\361\351\205\305\245\240\202\351\261\353\344\222\353\306\373\261\351\271\234\260\336\374\225\344\216\227\353\275\275\222\270\322\221\223\332\257\262\227\320\206\255\252\207\372\276\346\367") -TOPIC_TEXT( -"\353\317\366\357\254\220\277\201\237\343\311\357\342\233\260\245\355\255\226\255\334\266\270\373\244\200\276\224\254\352\351\375\373\367\332\345\252\317\375\313\257\257\261\345\247\202\322\245\304\264\216\211\204\212\232\325\267\315\314\257\226\223\267\254\310\347\222\300\327\253\244\355\256\274\251\214\332\376\350\352\251\321\354\256\223\211\220\314\306\247\323\306\333\322\246\334\242\233\210\232\233\375\215\232\210\254\263\307\247\347\233\352\301\203\274\311\367\361\367\321\377\304\276\267\211\351\323\265\305\232\355\376\237\363\376\231\311\207\372\267\350\261\346\337\336\220\341\215\261\324\237\362\203\226\307\230\271\241\260\341\370\231\241\267\335\212\324\244\204\256\341\321\343\357\203\243\322\316\311\325\212\355\366\252\325\370\313\213\233\233\234\215\241\242\234\237\360\321\350\352\373\244\350\201\330\315\217\251\321\324\356\364\202\223\304\376\275\216\316\374\357\336\275\265\214\375\304\374\343\321\262\226\250\205\236\236\203\257\266\367\214\233\342\313\362\246\206\232\214\232\324\311\352\341\377\261\304\206\312\334\220\376\230\320\217\277\256\312\315\222\300\235\201\216\211\311\332\353\201\223\236\313\252\260\266\272\322\320\241\345\257\221\231\232\247\237\326\270\321\331\300\261\263\346\362\321\336\343\376\351\344\251\215\237\356\336\341\337\304\202\246\216\362\313\260\305\334\241\225\311\315\232\236\353\363\337\306\251\214\206\275\266\316\225\226\311\200\241\266\372\254\217\322\301\302\257\275\261\336\334\330\204\351\361\312\256\271\346\274\337\360\367\354\262\336\337\214\362\271\362\201\277\307\337\305\266\324\340\313\256\334\372\304\223\366\347\306\304\200\356") -TOPIC_TEXT( -"\221\220\267\347\330\224\233\244\254\362\276\333\227\347\274\270\223\232\265\271\313\342\347\305\374\246\236\235\217\332\362\326\243\334\317\224\350\264\223\345\224\216\370\333\333\255\244\357\226\330\241\365\327\316\222\334\205\303\351\352\206\346\206\271\331\356\220\265\252\260\312\315\301\236\232\270\343\255\276\225\251\227\261\370\362\215\267\375\315\362\305\204\353\213\322\261\220\315\226\270\277\266\274\207\266\274\324\253\346\246\247\256\334\271\277\202\223\334\371\345\257\231\366\336\372\313\311\234\374\340\357\267\347\277\331\363\340\300\330\336\276\344\341\203\230\234\226\351\240\304\330\202\371\326\257\340\325\254\240\244\270\212\372\341\334\355\265\371\252\330\226\361\370\322\343\271\361\233\227\364\230\311\276\270\353\343\241\271\301\353\245\372\354\355\365\340\313\217\305\247\315\350\320\361\256\372\314\277\213\212\343\215\321\277\274\360\233\226\331\310\312\334\241\277\313\215\207\207\370\315\232\302\216\337\322\307\276\334\215\310\311\330\306\271\245\320\343\357\251\300\325\220\251\201\350\246\353\347\352\341\337\215\232\235\200\250\374\324\226\341\241\213\211\200\256\252\227\376\234\213\327\377\236\364\276\266\362\243\240\231\342\243\307\377\276\374\374\350\253\205\212\253\216\314\323\343\236\332\334\360\264\301\251\244\232\366\353\201\364\230\334\227\300\377\314\276\314\241\253\346\344\337\225\363\314\231\340\240\221\225\304\232\313\250\306\346\356\313\376\227\371\333\373\263\230\356\362\334\377\353\327\257\260\257\275\270\345\351\261\305\341\342\250\253\275\346\325\241\235\223\337\235\300\371\257\217\270\322\301\257\213\213\361\226\310\204\331\263\240\343") -TOPIC_TEXT( -"\331\200\230\360\357\334\304\364\346\224\274\367\377\307\267\364\257\210\344\371\226\345\306\256\376\234\240\253\234\327\250\310\217\245\323\300\305\313\326\336\343\312\357\351\335\273\267\332\254\210\251\267\272\364\351\233\267\224\246\372\254\233\205\207\253\263\230\245\302\266\222\370\222\260\303\262\250\242\340\310\225\325\224\331\241\310\233\264\267\214\360\343\237\215\366\327\237\256\270\343\271\335\203\364\342\317\246\272\320\267\261\270\305\362\315\214\226\303\375\355\377\353\307\274\371\224\217\350\344\214\332\311\340\247\364\323\237\376\266\337\316\237\277\357\270\312\240\222\212\230\260\341\206\267\350\353\303\224\355\345\247\206\370\200\233\213\371\200\230\374\266\326\364\333\330\271\320\351\225\335\300\270\261\245\232\314\262\214\344\352\251\245\300\362\336\255\344\246\204\233\353\340\252\257\202\234\362\371\223\321\224\255\372\323\222\331\235\373\334\272\333\211\207\250\304\260\216\302\257\220\303\320\372\374\214\230\350\331\347\235\213\224\277\221\240\207\255\365\372\310\275\204\367\226\230\235\233\261\316\222\372\342\327\241\227\362\366\207\231\322\271\305\245\257\333\220\202\344\374\203\262\303\330\314\225\343\301\333\377\374\343\355\357\216\375\321\377\227\233\346\357\223\277\357\353\260\233\200\214\263\207\241\335\321\314\344\371\257\366\262\252\224\264\320\263\225\305\322\336\321\215\303\267\235\246\247\222\375\207\374\241\366\347\335\257\344\326\374\307\306\274\231\235\227\324\236\233\336\356\265\327\253\235\322\323\332\242\332\321\246\364\372\374\377\356\227\324\254\301\227\333\352\244\241\334\343\336\216\353\275\275\212\373\277\300\300\253\241\201\321") -TOPIC_TEXT( -"\356\340\356\226\246\203\330\222\301\226\243\360\265\274\235\216\373\334\200\270\204\377\226\312\340\250\365\237\305\274\241\342\347\220\214\314\311\350\261\234\257\371\361\272\252\341\250\271\304\311\305\365\355\277\252\260\241\327\206\256\276\345\323\346\335\273\303\211\331\317\374\366\246\245\377\207\215\254\250\340\273\260\363\270\300\305\222\242\361\205\377\204\270\203\233\225\251\322\304\204\341\344\376\232\247\236\230\276\247\215\215\220\350\361\307\361\227\331\327\341\223\376\314\216\230\364\345\235\274\342\366\357\316\261\241\332\353\257\226\343\307\321\263\270\232\230\202\247\271\236\252\232\322\377\223\216\310\360\366\341\316\255\224\222\350\336\371\265\250\332\332\364\324\244\215\216\307\200\246\315\265\366\376\327\326\250\241\311\367\330\242\271\362\306\245\203\323\331\211\357\261\222\216\255\363\346\357\232\302\356\352\247\233\356\217\317\271\376\331\365\227\253\271\316\215\355\372\335\346\370\350\261\346\371\356\344\266\271\204\234\301\226\312\375\216\247\304\327\304\322\275\237\216\377\352\345\341\327\366\202\226\353\345\310\341\275\244\254\300\217\343\340\310\230\226\230\212\367\216\325\337\321\366\215\336\321\327\340\300\377\235\362\357\207\361\217\226\363\200\277\247\253\310\206\311\276\332\374\372\362\342\267\376\301\377\251\226\336\207\343\317\214\227\233\376\314\342\232\216\357\235\216\333\316\303\333\340\341\343\365\245\264\340\373\236\245\327\370\343\360\337\303\360\261\250\276\225\331\344\310\363\355\230\326\225\261\246\347\353\213\365\206\371\305\327\255\255\211\347\367\222\305\216\304\264\364\214\370\364\270\377\354\303\275\325\376\213\270\313\202") -TOPIC_TEXT( -"\325\346\346\345\305\302\370\305\367\253\257\245\277\232\361\342\235\307\311\216\374\306\340\247\360\223\304\245\244\215\256\302\261\260\363\210\237\371\223\307\317\361\253\316\316\255\221\260\270\246\265\317\241\302\350\237\212\335\231\352\326\277\325\337\310\340\243\355\333\233\207\211\203\277\343\357\313\322\350\337\375\206\340\267\372\254\227\245\306\337\343\214\233\257\343\353\355\252\204\302\204\303\323\374\242\246\317\237\356\317\346\320\260\230\315\306\240\236\366\267\260\262\255\242\336\375\374\242\270\327\321\245\240\365\271\212\276\323\226\215\214\223\357\225\267\255\371\332\364\202\265\323\272\214\313\232\301\357\265\200\336\237\334\222\262\351\301\232\274\233\201\360\276\253\311\304\243\324\252\216\340\366\317\241\352\276\274\367\300\312\261\247\226\225\376\365\264\265\322\325\255\356\370\330\241\303\354\325\224\361\315\314\202\307\316\250\224\222\224\367\252\250\361\300\312\364\350\361\226\343\223\304\212\317\244\251\323\200\273\360\277\244\272\371\315\211\244\307\301\302\225\216\340\313\276\247\344\372\205\234\253\322\333\350\305\222\370\257\303\216\357\366\206\216\320\252\353\214\231\243\365\261\265\255\330\230\235\217\266\350\336\246\367\275\241\265\227\267\261\327\243\215\255\277\377\343\345\346\372\256\357\220\370\357\370\343\210\371\240\346\323\212\344\222\244\237\355\373\330\336\202\273\331\275\262\203\264\365\214\214\362\341\337\376\230\206\323\300\237\353\335\303\267\314\305\363\225\220\357\341\236\257\363\230\227\362\370\377\315\235\205\204\247\223\225\343\211\356\314\231\234\317\202\225\257\245\317\246\350\207\223\251\266\344\273\316\313\214\217\213") -TOPIC_TEXT( -"\326\327\255\234\356\277\224\370\377\330\325\354\300\224\316\217\231\206\257\225\334\234\357\273\314\300\266\223\345\213\336\325\301\276\212\225\343\225\327\210\200\353\362\223\306\353\330\270\373\326\216\367\210\374\342\231\214\221\340\321\363\353\231\226\363\372\330\343\210\273\312\244\246\251\307\364\242\315\211\213\265\331\333\360\266\371\277\224\241\325\244\356\207\222\302\233\372\215\237\206\351\306\307\307\235\305\225\217\361\375\201\217\215\320\342\310\322\267\354\377\326\314\264\312\276\305\327\304\364\200\361\264\331\354\366\264\340\363\377\303\255\356\270\216\312\212\200\212\323\372\230\367\245\234\316\315\267\370\332\343\331\202\310\243\330\372\320\206\334\205\333\273\314\335\240\270\332\300\250\302\351\253\356\244\261\364\377\354\302\215\353\327\232\233\372\257\312\323\203\332\332\332\321\243\377\276\242\317\216\264\352\212\310\253\200\257\345\201\313\302\366\200\353\243\363\210\337\232\313\343\205\256\356\213\207\363\323\254\253\335\220\304\212\262\275\231\222\335\315\341\372\234\304\245\242\265\306\274\203\350\264\215\201\266\233\323\263\203\375\342\355\221\265\235\225\361\221\277\256\252\354\376\311\335\213\254\347\230\212\215\334\267\376\342\305\212\354\225\301\270\314\350\301\370\230\342\227\324\325\367\250\200\236\373\305\205\234\374\310\253\275\332\354\363\333\366\225\310\217\301\254\305\363\321\340\242\312\366\347\260\244\210\320\342\220\336\276\242\374\220\313\301\220\361\271\331\341\205\344\310\265\336\212\230\376\334\355\232\244\267\236\226\374\251\256\351\237\377\325\373\273\334\221\274\216\311\311\225\251\310\366\202\273\205\347\363\266\275\347\270") -TOPIC_TEXT( -"\300\311\250\331\233\246\313\264\374\344\325\301\330\202\266\217\247\307\371\363\226\264\324\245\245\317\212\364\236\313\274\207\254\366\374\240\212\242\307\342\332\304\324\260\232\237\216\203\316\340\333\217\357\345\305\274\202\324\247\237\336\203\346\344\277\305\300\353\356\365\365\266\315\214\324\253\320\310\252\344\331\224\336\233\330\367\231\247\317\234\311\255\305\207\250\333\230\234\333\272\233\241\317\231\340\362\235\247\314\330\227\207\320\233\263\342\256\314\242\374\247\371\257\210\212\316\364\367\247\334\224\341\245\352\222\235\354\252\304\220\245\235\206\275\246\335\373\345\343\343\303\226\307\227\312\236\313\317\207\367\330\315\262\310\221\347\306\301\220\365\314\200\247\240\275\366\262\221\356\336\325\261\334\233\377\331\355\342\344\237\305\313\336\264\362\367\342\346\373\265\323\231\266\341\310\273\373\233\345\236\301\360\366\353\370\277\252\310\224\343\202\257\306\250\332\240\216\243\202\201\276\214\267\216\235\310\277\235\233\236\230\233\340\236\350\274\363\206\363\230\225\271\376\371\322\262\377\314\331\234\365\222\255\222\245\361\310\333\216\222\316\326\345\210\206\261\257\205\234\374\272\303\372\205\210\341\350\227\313\262\275\217\337\227\345\341\235\236\244\301\304\303\233\315\204\207\365\310\355\321\214\231\245\231\272\343\323\241\227\202\340\242\246\240\307\232\377\270\364\305\337\375\357\376\360\333\334\202\250\344\264\310\234\214\344\202\337\216\202\261\247\227\332\332\363\353\216\377\371\342\304\351\367\332\213\235\306\313\356\221\230\231\212\263\372\306\266\302\245\350\377\373\341\230\363\334\233\210\343\370\252\245\267\257\204\267\206\256\275\354") -TOPIC_TEXT( -"\220\372\335\334\370\357\313\304\273\301\340\342\207\242\244\275\326\317\275\216\245\214\226\353\351\260\310\350\200\323\335\301\335\300\360\347\312\367\217\226\347\362\215\242\223\213\374\361\330\331\272\341\350\237\230\325\353\333\321\200\336\330\256\356\361\233\241\371\216\357\357\204\305\252\347\263\364\230\217\344\231\263\302\343\330\330\311\274\331\304\310\225\370\313\331\244\266\203\346\357\245\334\260\263\373\366\252\347\313\215\353\374\250\200\242\372\374\370\342\314\313\214\350\244\241\261\227\210\374\322\275\305\357\210\332\332\343\242\212\314\365\225\345\352\247\223\356\303\261\260\221\323\271\330\217\311\315\303\276\360\317\235\202\317\315\210\246\317\361\207\330\311\233\214\305\265\321\337\364\241\227\305\265\242\307\271\225\262\276\275\342\370\375\312\212\344\356\325\341\326\213\360\372\330\257\334\312\334\337\261\231\263\224\225\347\302\320\377\314\357\333\313\265\263\247\352\252\200\220\344\340\366\347\367\213\213\363\311\376\355\371\231\316\251\207\266\247\320\350\235\247\217\236\367\212\271\344\337\261\354\344\313\201\346\275\334\361\353\211\253\317\273\274\227\334\210\250\267\307\260\366\231\213\366\267\350\206\274\273\267\360\323\255\214\231\233\227\367\364\356\373\364\302\307\201\232\276\317\275\202\344\372\323\231\313\207\344\277\325\265\245\316\350\207\374\361\356\346\237\261\337\263\365\247\353\360\337\236\375\232\230\301\377\272\265\353\231\201\221\255\317\273\266\375\202\267\237\376\274\204\202\374\307\351\301\251\200\372\354\315\200\253\254\222\301\310\372\234\230\246\270\206\266\200\333\247\247\376\373\240\201\355\255\255\276\221\346\340\353\344") -TOPIC_TEXT( -"\342\212\343\271\301\225\204\357\366\234\351\204\344\251\337\345\336\256\355\243\236\214\262\231\223\340\237\226\227\227\275\342\347\334\216\321\371\364\237\345\224\276\375\314\316\336\260\222\343\311\210\310\342\316\261\344\260\311\224\372\221\267\301\202\327\222\262\325\306\222\206\254\250\336\351\220\222\222\262\257\356\235\340\370\254\240\322\352\310\313\342\265\260\234\250\311\224\373\316\376\235\304\330\361\223\224\301\310\370\215\365\264\233\320\306\223\200\366\205\332\361\355\343\255\357\260\276\366\337\233\362\345\266\357\353\312\247\227\265\342\232\251\371\211\237\370\211\221\203\273\205\356\211\303\265\217\201\334\275\251\251\200\256\261\226\322\322\211\202\226\213\334\225\360\365\220\221\310\344\352\241\225\341\375\317\323\302\364\333\313\253\241\207\375\213\314\345\337\354\325\372\260\354\227\325\234\372\214\251\211\366\326\200\204\301\370\324\271\203\342\240\345\233\205\261\344\322\264\216\247\323\257\304\200\217\365\205\274\347\236\351\350\264\201\231\366\212\222\261\244\350\346\301\262\216\202\253\267\331\344\355\251\307\216\317\205\213\352\216\235\347\320\227\263\277\203\275\267\277\273\377\260\277\374\217\242\261\301\204\207\227\247\356\216\316\334\267\226\360\376\277\362\325\323\343\277\312\334\357\312\234\254\331\354\330\264\224\315\217\361\367\356\263\276\373\261\263\351\310\242\353\300\212\361\307\214\343\367\347\253\253\274\355\232\363\362\350\323\325\250\212\213\275\225\367\213\347\237\276\322\372\325\253\312\207\301\217\231\260\225\255\211\257\263\344\310\211\215\311\373\326\341\321\372\355\324\226\357\210\314\240\225\262\363\357\212\365\364\342\345") -TOPIC_TEXT( -"\236\204\274\246\334\367\364\333\365\365\330\263\274\245\271\306\314\345\317\313\271\242\362\210\222\362\377\216\310\326\237\377\325\311\301\346\241\262\262\317\255\264\354\327\235\315\316\264\242\337\333\224\224\370\203\341\257\236\213\247\267\253\305\255\205\270\273\353\316\377\223\241\307\370\336\265\274\313\274\300\355\264\223\243\255\225\263\327\257\337\252\312\234\233\247\335\305\351\200\205\326\316\204\313\204\313\243\351\352\373\344\200\244\305\275\376\333\351\227\257\274\215\211\202\241\221\343\260\300\373\344\355\353\214\313\353\241\365\202\265\302\200\314\314\376\345\365\373\261\344\302\213\342\211\350\240\271\236\207\344\366\233\266\241\377\220\252\207\355\275\345\303\341\276\216\364\337\351\250\202\245\206\332\332\256\341\337\314\313\371\213\327\356\206\323\337\222\373\375\375\341\304\342\225\226\236\333\244\216\220\203\364\230\272\311\372\312\310\346\230\215\212\342\346\322\205\333\277\214\370\253\274\355\320\221\253\337\336\353\333\374\316\376\357\336\274\312\365\367\251\221\242\352\350\302\217\271\311\316\202\257\223\365\330\203\265\303\243\377\303\230\372\354\302\224\255\200\241\323\212\364\330\330\251\223\276\332\332\340\375\333\345\232\224\230\310\344\227\343\337\355\232\232\374\210\267\224\253\253\213\335\267\300\347\204\332\306\206\206\306\307\206\325\373\236\364\274\231\372\354\346\344\265\216\324\277\342\355\277\362\362\362\267\331\351\354\260\303\275\316\200\314\264\334\301\375\217\357\314\330\207\204\275\203\355\301\304\373\316\327\227\224\253\235\314\214\360\256\256\316\302\321\361\314\242\223\326\355\347\371\244\232\266\260\202\336\306\333\220\275") -TOPIC_TEXT( -"\216\257\213\245\336\321\310\234\356\327\332\274\211\343\221\367\337\317\225\240\361\332\315\320\313\326\270\326\321\212\326\226\347\360\325\251\251\237\312\331\333\273\324\331\340\244\201\206\204\376\361\324\341\250\261\230\322\325\225\256\301\316\343\357\330\261\343\234\225\256\351\367\206\231\331\310\367\366\323\377\271\233\303\305\266\355\230\262\366\247\262\320\206\314\301\262\257\303\237\362\357\376\360\333\210\205\365\311\322\231\205\275\247\227\224\213\275\306\314\360\232\360\235\244\266\316\256\371\351\214\322\365\233\232\233\361\212\234\374\275\365\252\263\255\345\207\365\333\367\303\357\314\364\343\235\241\260\364\330\250\214\362\377\341\366\325\304\311\222\305\360\316\303\310\372\314\207\310\200\364\321\253\321\313\354\324\342\371\343\304\222\310\346\334\205\256\246\274\335\312\355\252\330\253\260\217\340\352\215\244\245\263\236\266\272\265\333\250\230\206\327\241\360\212\253\270\335\321\366\265\271\271\231\324\204\316\347\235\313\313\220\351\276\366\302\374\334\223\220\330\247\210\224\207\230\342\310\367\207\357\336\342\366\346\310\210\344\374\275\320\214\271\261\256\361\212\250\272\366\341\272\373\305\263\345\273\375\225\213\332\343\273\317\370\266\201\332\340\203\250\370\260\247\226\266\215\337\246\307\206\342\332\333\337\216\201\343\262\342\372\314\312\312\223\352\363\262\374\316\313\342\261\243\240\372\334\244\253\336\333\205\201\222\214\347\323\254\243\240\311\313\213\323\213\237\263\343\251\331\261\210\215\332\363\302\227\225\213\234\302\331\216\262\317\350\236\276\222\221\372\361\331\340\227\237\307\344\276\256\320\214\231\343\202\314\363\267\373\266\215") -TOPIC_TEXT( -"\303\316\203\225\232\207\356\231\360\213\354\276\372\241\343\337\376\325\272\307\220\374\376\233\310\204\351\311\332\325\256\365\302\262\367\334\240\315\336\240\333\365\363\236\212\221\315\363\271\277\241\342\324\231\230\212\332\301\247\215\326\256\207\341\270\261\270\340\324\206\371\272\253\276\232\361\262\344\261\323\220\333\374\321\351\201\246\307\314\226\314\222\372\314\211\234\306\347\213\244\274\371\375\263\330\307\271\256\374\226\307\257\372\333\266\221\265\242\242\201\257\255\257\222\246\307\330\310\274\345\205\212\215\305\200\264\361\262\255\350\261\353\335\263\341\216\372\313\372\236\364\204\304\310\272\320\304\317\261\265\253\325\337\204\253\215\244\356\266\355\247\216\245\242\256\266\222\247\276\206\231\260\241\216\346\340\261\204\305\237\234\217\342\272\264\374\375\207\200\350\321\204\235\317\300\261\306\305\361\217\315\210\201\322\226\271\357\375\355\301\315\254\246\370\302\343\344\333\361\216\207\303\322\343\377\251\211\221\241\376\336\246\227\306\306\242\335\335\252\207\342\342\304\352\240\222\235\206\302\321\202\271\346\230\365\242\253\335\324\305\323\243\250\234\316\311\320\333\222\241\343\333\303\364\215\225\233\251\222\227\351\264\313\312\233\273\373\301\201\237\363\211\375\363\271\244\230\307\242\310\326\271\365\272\270\320\254\261\341\274\321\343\266\300\234\375\260\346\345\277\374\232\263\205\322\343\333\367\310\377\214\311\217\215\361\205\213\245\307\226\361\243\376\372\303\254\305\225\242\236\360\262\204\311\250\254\225\313\372\214\374\232\243\314\307\311\332\221\342\351\303\336\320\232\243\201\230\266\237\250\350\211\344\244\315\300\305\336\367\272") -TOPIC_TEXT( -"\317\216\356\304\222\306\260\244\303\236\305\254\241\213\311\270\233\333\257\220\252\355\317\226\363\372\203\373\366\315\230\342\274\276\300\272\264\265\271\232\355\364\263\270\302\201\346\250\207\310\227\351\255\365\301\302\317\306\316\221\212\274\365\235\362\301\362\361\325\232\234\326\341\240\202\313\371\340\246\313\342\314\262\244\201\345\255\260\347\277\357\202\266\314\330\222\206\232\360\215\375\276\271\260\204\246\274\361\226\361\374\331\330\332\312\327\261\237\303\211\237\236\234\236\323\227\210\333\250\336\247\317\234\250\353\353\271\266\214\267\235\275\234\265\206\344\362\375\327\307\334\236\274\311\224\236\313\327\236\200\320\245\314\230\272\306\257\343\254\257\253\365\300\351\227\241\247\275\246\365\306\313\241\343\323\214\262\231\274\353\233\350\220\301\304\375\201\364\247\267\254\327\225\356\204\307\351\313\244\310\314\306\367\351\355\301\357\313\244\307\334\202\263\241\357\312\326\242\241\307\223\343\277\205\227\341\306\243\223\367\265\267\223\266\336\356\226\211\240\376\332\372\234\366\357\362\214\237\374\352\372\314\330\235\304\215\270\231\333\206\257\220\264\265\300\372\213\340\222\373\207\252\216\314\245\372\233\341\276\220\231\246\320\305\204\300\225\246\357\227\243\276\266\343\222\360\270\340\370\242\267\264\264\230\221\206\236\317\317\215\255\255\364\324\334\346\321\271\341\325\332\347\262\230\204\267\346\204\204\336\256\274\324\212\272\224\356\332\337\301\377\300\273\254\333\225\205\233\310\220\235\225\335\333\250\223\361\354\303\316\362\377\375\214\245\314\344\225\253\353\340\227\313\312\222\213\374\222\327\320\364\270\257\347\200\236\325\226\325\252") -TOPIC_TEXT( -"\277\336\232\335\232\225\215\201\270\365\315\227\310\217\251\267\256\242\231\320\306\271\200\315\200\331\311\345\253\200\252\343\206\220\302\335\316\234\271\264\303\336\232\376\231\372\276\300\216\206\210\213\255\352\313\246\310\306\300\367\311\357\353\262\254\367\265\254\340\347\215\211\360\343\373\344\333\375\247\253\251\261\236\261\355\322\343\363\215\337\245\217\214\334\217\311\217\361\275\210\303\206\216\275\332\343\303\233\235\347\221\277\222\241\363\307\351\354\214\331\240\307\200\322\376\302\246\307\331\220\347\320\311\226\265\253\265\257\225\257\230\366\246\230\335\225\253\300\215\263\310\246\307\231\337\217\316\305\337\311\310\235\316\373\276\266\370\354\356\226\375\230\371\372\244\277\357\307\377\220\312\212\311\361\221\304\240\357\201\273\231\340\343\362\372\302\362\324\244\252\231\363\326\234\372\361\244\317\353\313\375\354\344\375\375\350\373\327\351\356\226\312\303\214\336\212\354\361\237\235\264\345\315\374\206\242\243\350\345\302\370\372\235\254\335\335\300\220\223\277\342\264\245\203\274\371\213\270\267\242\300\232\304\344\237\340\211\305\370\255\264\300\363\354\331\300\300\340\372\361\220\330\321\216\353\257\260\302\232\227\373\345\373\271\251\262\235\336\250\201\214\231\233\232\336\237\275\270\314\202\344\256\276\307\365\354\341\314\360\211\364\236\272\254\361\302\217\343\256\337\365\276\304\267\212\374\257\333\302\332\256\361\376\352\254\224\255\261\333\310\320\261\321\267\216\371\313\240\307\326\337\341\254\221\263\252\210\236\203\346\355\200\313\260\364\333\273\247\274\252\334\202\364\230\217\251\234\243\334\341\322\302\314\370\331\261\361\331\205\307") -TOPIC_TEXT( -"\226\205\247\342\375\373\367\374\220\301\201\205\217\316\321\322\345\335\216\365\205\362\241\200\333\346\234\375\232\343\225\247\275\237\253\243\220\310\343\325\376\210\235\262\304\236\263\204\225\260\276\227\216\360\364\270\322\334\275\335\312\307\352\342\314\263\221\327\266\271\344\266\232\370\237\210\216\312\226\325\325\270\210\252\230\205\230\334\345\305\302\371\375\263\367\210\303\306\217\260\250\210\273\363\271\204\311\311\214\243\263\242\341\255\307\266\244\310\232\214\232\355\275\261\320\357\310\342\374\264\347\243\307\370\323\343\246\371\351\334\337\273\333\332\302\320\302\343\243\232\310\230\230\225\330\301\254\275\266\210\231\225\266\314\217\351\365\366\221\273\331\221\247\260\316\346\313\217\200\243\264\237\210\371\361\226\233\213\244\362\334\370\254\275\221\256\322\260\273\217\372\362\301\307\225\332\320\252\317\355\322\220\225\277\344\271\201\266\211\314\206\275\346\333\226\272\201\304\367\271\316\364\324\221\310\231\343\240\211\277\327\231\361\366\256\274\275\276\335\371\216\235\356\236\351\252\367\365\222\263\220\267\235\317\260\325\344\313\374\203\213\205\230\277\225\326\324\254\256\315\226\232\300\244\257\202\234\307\360\236\230\214\271\344\264\241\252\230\206\262\366\305\220\324\340\207\322\305\375\233\246\236\234\271\342\240\231\375\245\314\330\350\220\355\303\345\241\207\306\303\355\304\225\340\306\231\251\360\204\360\377\336\237\215\351\367\245\254\201\326\355\204\220\223\341\347\313\226\273\212\311\322\216\343\246\236\361\327\344\336\306\362\364\260\204\264\303\274\202\205\350\274\240\211\353\322\210\317\312\252\270\305\342\276\370\220\206\261\334\370") -TOPIC_TEXT( -"\212\243\225\307\300\271\267\314\242\230\335\314\226\304\251\270\373\367\216\356\276\312\350\217\247\260\300\211\260\355\311\202\374\347\270\370\326\233\364\230\377\205\236\266\330\257\212\310\324\232\276\275\236\233\236\340\203\327\240\352\252\212\362\365\323\211\335\211\225\350\320\350\213\262\236\273\302\360\202\250\272\254\220\257\314\307\353\315\221\222\210\306\214\231\244\261\344\317\200\326\276\303\266\252\356\360\212\243\231\224\211\355\206\227\277\305\306\347\255\270\247\205\215\311\302\222\213\226\244\263\220\342\254\326\233\255\367\377\242\212\330\340\337\372\314\277\367\265\320\343\260\332\343\202\225\224\225\271\202\310\326\376\270\354\221\247\222\242\307\272\202\261\315\267\323\311\317\264\316\303\313\273\235\372\252\332\350\374\240\214\312\315\217\213\310\226\327\200\363\363\345\311\323\243\261\210\217\372\340\354\237\332\265\213\224\230\247\244\311\253\327\273\356\260\220\264\352\271\200\236\203\321\323\376\241\302\333\243\206\337\244\343\247\263\246\307\254\221\356\250\204\241\307\246\200\361\371\366\260\255\214\275\336\234\237\206\320\275\356\274\363\346\362\323\346\205\274\236\271\321\207\231\262\260\372\212\357\301\240\202\327\234\356\342\205\350\215\205\244\223\300\265\323\342\202\321\312\342\251\211\362\354\272\356\220\254\206\262\306\316\357\263\253\206\234\366\363\220\301\302\241\365\236\341\353\345\263\303\342\226\244\226\301\362\367\335\205\222\204\311\342\342\254\313\345\364\235\315\260\371\243\271\372\212\223\311\245\272\242\244\256\225\204\244\307\270\232\305\364\360\343\240\373\274\335\322\216\343\213\244\220\224\275\316\360\347\235\206\262\267") -TOPIC_TEXT( -"\362\325\237\224\314\263\240\233\206\233\207\350\366\372\323\261\256\340\273\270\251\364\363\201\220\227\307\344\262\256\237\224\327\350\375\356\340\377\203\202\350\361\215\364\324\205\336\240\366\216\213\304\215\231\254\225\304\227\206\234\217\202\344\226\377\241\223\263\225\307\236\316\326\333\316\346\346\234\222\211\363\271\201\260\350\262\352\220\340\261\346\263\304\274\220\343\314\320\324\303\273\330\340\271\304\204\354\227\327\320\266\202\254\370\343\372\345\313\364\277\316\273\212\362\243\340\220\270\264\346\360\236\203\355\365\256\303\214\300\221\336\216\376\233\211\300\261\337\304\265\321\261\271\365\277\305\201\232\212\324\354\230\224\310\362\266\270\310\310\271\243\252\346\205\243\323\304\263\256\353\211\266\375\230\262\206\353\245\310\340\305\270\221\362\220\226\364\266\220\211\240\231\246\234\330\220\231\353\217\301\273\314\343\323\236\360\354\330\340\234\213\254\304\277\367\365\371\334\203\253\246\366\270\255\235\345\332\313\325\377\230\231\343\270\237\327\334\321\204\262\343\202\230\376\274\344\345\307\300\226\311\241\301\372\334\245\351\300\305\243\206\254\233\245\237\205\231\225\245\215\337\231\260\231\232\210\303\214\247\246\354\307\355\350\270\242\260\265\334\266\272\375\345\214\352\351\345\205\316\206\263\363\256\251\377\334\341\326\360\364\230\352\322\304\336\314\303\256\334\252\333\347\220\236\203\374\323\232\333\242\237\256\241\215\376\220\203\344\255\207\224\355\371\240\212\276\364\247\266\231\245\266\243\260\234\372\242\361\343\254\244\271\231\211\301\370\354\305\355\211\214\231\204\263\361\376\246\214\336\301\332\345\225\226\325\246\244\207\227\271") -TOPIC_TEXT( -"\204\311\320\207\216\344\204\311\305\230\321\277\231\251\370\271\260\324\343\337\313\347\303\370\275\334\316\364\341\354\251\323\370\305\277\331\362\335\375\234\331\371\306\305\207\216\211\335\276\317\311\272\237\333\304\211\313\217\354\213\305\374\317\322\301\223\327\303\304\220\301\217\223\357\320\234\213\302\254\373\266\311\342\352\366\221\211\336\371\230\367\303\327\226\231\257\306\363\304\221\331\211\230\265\233\337\221\305\362\276\363\311\264\253\206\363\351\352\343\337\234\235\272\237\311\274\330\335\267\357\354\337\300\263\342\334\335\274\243\265\327\345\336\273\327\371\221\337\312\275\240\343\355\361\227\345\201\230\365\273\223\250\361\261\227\322\220\244\334\206\272\225\301\220\206\214\376\207\344\355\223\321\305\260\310\220\250\301\273\361\370\252\226\241\303\263\360\264\266\222\333\210\347\255\245\321\337\361\367\356\222\200\207\344\260\347\302\205\345\311\241\351\361\372\353\277\243\273\373\316\227\317\230\373\330\375\271\203\310\341\253\345\357\371\342\366\350\215\233\235\202\347\221\210\254\275\256\224\361\211\310\215\227\346\247\363\201\272\237\333\372\354\321\356\227\204\244\307\343\303\203\214\274\232\227\344\352\346\215\236\360\323\312\355\270\327\321\353\322\303\327\203\342\375\240\252\203\273\213\253\217\324\356\243\375\232\352\201\320\343\371\247\205\217\226\237\315\352\375\205\333\336\206\364\264\213\204\302\327\220\361\312\332\314\341\276\271\245\231\362\202\325\272\375\320\241\232\343\322\367\200\237\357\341\202\220\313\241\271\376\274\364\341\202\344\360\364\330\247\252\346\341\277\276\330\373\261\233\247\314\300\364\330\333\222\350\246\240\230\376") -TOPIC_TEXT( -"\225\326\200\376\354\221\233\254\275\256\276\224\361\320\343\225\245\271\221\243\274\364\336\206\354\325\205\307\226\345\306\336\372\314\325\333\212\334\275\333\332\256\262\255\316\317\227\344\352\346\321\320\343\360\335\311\322\324\355\326\234\240\307\240\300\373\350\325\361\371\322\340\264\304\357\222\360\376\347\244\303\345\374\260\245\226\332\337\341\277\346\302\263\216\362\207\377\363\270\356\247\210\360\322\374\324\300\352\366\354\371\341\332\252\224\351\343\206\376\310\361\356\230\333\332\261\344\264\313\246\246\215\203\205\334\220\206\274\300\273\267\323\241\272\344\234\330\340\364\362\303\253\244\301\362\225\241\272\216\300\221\206\356\226\220\341\332\257\367\200\330\230\353\301\362\347\307\366\261\206\227\244\207\204\334\357\242\365\336\274\330\323\203\377\254\275\206\244\230\257\210\236\220\317\277\236\252\205\236\277\371\333\332\301\357\302\355\253\213\211\263\246\213\235\202\313\221\217\213\305\274\317\333\307\211\206\206\300\206\305\376\314\205\200\241\347\322\331\370\233\270\333\330\304\216\274\364\230\216\344\270\257\347\336\323\343\362\243\200\373\350\335\261\343\254\370\235\352\357\215\263\362\247\257\270\202\356\236\276\205\304\264\361\233\206\371\206\205\274\216\317\217\305\201\255\374\307\246\304\353\257\326\214\245\302\364\230\214\301\321\323\277\206\377\377\256\374\214\231\264\355\230\305\317\361\363\206\224\225\335\327\241\255\221\344\301\264\214\247\230\201\315\220\237\340\214\317\324\235\303\346\226\363\324\272\336\352\342\220\306\274\202\234\345\270\233\227\250\346\310\366\365\360\203\372\373\325\272\301\263\311\274\207\372\266\276\376\367\377\375") -TOPIC_TEXT( -"\277\230\221\374\342\271\336\205\236\317\237\214\377\344\353\277\321\304\250\265\220\257\276\237\271\352\373\263\363\254\342\207\245\307\370\205\241\236\253\377\361\321\276\241\222\336\241\301\207\206\277\351\235\231\236\260\312\212\203\213\244\220\322\334\201\312\360\274\267\275\241\321\343\220\254\201\344\241\307\264\270\353\214\356\356\336\265\353\227\235\223\316\265\363\235\305\225\254\343\222\302\372\300\374\313\272\267\204\336\362\300\253\317\337\210\262\312\334\356\277\257\235\226\313\244\366\267\213\234\355\354\260\336\345\274\241\336\316\252\344\316\264\312\346\221\361\313\307\255\370\270\221\311\316\360\232\364\230\256\320\332\265\262\303\333\304\373\241\333\310\311\272\250\376\210\327\365\316\216\360\334\341\253\277\331\333\221\236\333\316\275\311\232\331\332\344\344\226\211\234\362\325\237\313\220\261\331\330\206\354\247\260\367\331\304\324\312\212\246\257\300\201\353\276\257\253\266\316\220\234\253\362\363\325\374\355\255\255\344\350\225\321\326\371\363\217\240\306\343\303\270\203\230\202\337\352\274\271\360\262\360\337\370\354\300\320\325\240\301\222\333\273\236\224\232\316\217\207\247\356\332\375\275\205\305\374\260\364\270\240\201\224\333\331\201\262\274\272\374\262\350\204\205\247\247\306\207\346\347\236\220\222\275\206\203\205\236\234\237\301\343\232\216\326\330\320\261\305\214\210\336\311\217\317\234\250\313\273\350\232\305\306\231\302\202\364\337\370\303\354\364\253\337\375\254\212\204\230\227\240\355\334\375\347\344\255\236\321\200\372\252\212\251\207\304\317\313\327\300\236\350\365\351\366\351\376\320\261\230\243\336\227\227\266\364\334\212\300\332\311") -TOPIC_TEXT( -"\215\301\341\311\331\236\221\263\364\356\247\323\241\332\334\236\357\272\277\350\235\253\245\341\332\221\245\306\213\305\350\243\277\242\202\201\371\200\372\254\240\317\210\316\260\331\257\312\231\262\251\266\323\234\206\215\204\264\200\272\256\232\307\257\364\234\333\250\311\210\222\371\357\325\202\216\311\201\244\271\327\257\336\235\375\363\221\321\273\377\327\347\355\342\377\237\374\364\256\277\336\257\377\203\350\261\357\206\275\364\257\270\337\360\346\265\255\217\265\306\207\373\210\331\215\220\273\337\334\265\330\220\257\256\374\370\227\253\227\257\260\210\231\226\236\227\311\204\362\207\240\302\372\270\361\201\263\257\255\354\254\234\342\372\213\312\300\301\364\230\344\236\320\341\327\216\222\346\247\275\370\200\220\352\242\210\205\276\347\360\306\303\247\340\267\274\215\266\274\220\241\267\353\230\237\231\225\354\265\237\317\327\323\216\353\304\315\302\203\351\270\324\331\373\326\353\365\253\215\316\263\274\214\231\245\317\276\373\314\354\256\231\244\206\227\333\215\266\223\330\247\264\343\222\377\376\235\215\257\366\253\211\226\235\372\255\355\327\240\363\330\274\326\224\325\341\200\204\353\316\313\217\350\253\201\340\305\222\232\300\217\374\325\256\301\260\362\361\370\262\344\320\265\370\375\220\275\261\371\270\275\372\246\207\237\212\342\242\334\360\225\244\274\213\311\376\347\303\307\215\270\315\262\310\273\357\276\234\337\254\251\351\275\377\367\257\202\247\376\277\200\263\270\347\263\370\277\206\311\326\241\343\322\203\255\335\217\232\273\213\265\264\273\366\302\333\273\331\362\375\205\305\274\260\364\270\202\240\304\331\220\244\227\246\231\307\307\354\254\330") -TOPIC_TEXT( -"\242\221\317\204\244\307\254\211\322\220\351\351\361\206\253\251\303\324\310\316\224\205\206\363\235\337\361\316\255\254\277\235\313\374\340\245\301\224\365\275\240\362\371\225\207\342\371\214\255\330\356\250\237\301\222\377\344\234\253\244\345\362\375\264\234\267\240\234\327\300\202\202\314\222\246\260\240\254\254\276\316\242\212\262\254\305\316\232\261\334\304\241\253\211\343\215\350\217\245\345\330\211\336\225\205\250\357\364\210\246\244\304\277\245\221\271\207\326\250\372\223\254\260\347\203\212\321\202\263\227\334\253\212\340\267\232\241\213\230\357\360\260\222\252\230\302\362\363\343\334\362\205\362\211\206\253\274\360\225\244\323\356\366\361\350\320\336\360\347\232\307\317\353\204\247\373\275\364\276\306\207\373\321\214\334\230\206\270\360\373\317\230\272\316\233\273\364\270\200\320\376\367\355\377\341\321\325\300\274\320\263\345\363\254\275\266\210\207\225\226\236\207\207\256\365\261\315\330\326\200\375\206\360\343\223\231\351\320\226\240\226\226\301\345\300\310\372\334\367\354\267\370\342\374\364\367\235\256\225\334\300\257\337\276\264\227\301\335\311\253\216\354\311\225\236\362\316\326\316\330\202\260\252\344\203\236\277\374\276\254\221\327\317\357\352\241\256\224\337\316\366\214\350\222\206\263\211\275\256\265\216\231\220\335\352\206\237\231\362\205\313\305\242\222\211\247\323\356\355\375\230\253\266\240\344\347\336\361\234\305\225\321\343\264\353\201\212\241\307\235\347\300\363\347\262\377\241\214\271\244\205\362\341\351\200\373\357\350\315\231\363\221\312\352\364\261\335\345\265\265\303\262\246\311\224\223\354\343\341\355\227\373\360\217\373\316\350\261\276\250") -TOPIC_TEXT( -"\277\325\276\371\363\311\343\315\240\367\346\333\313\265\313\215\377\223\273\334\370\316\313\337\235\355\241\250\207\267\216\303\217\243\352\311\312\223\214\316\334\267\361\305\301\254\342\206\245\307\215\341\221\233\245\333\300\221\304\220\311\301\253\321\357\354\262\255\313\333\242\274\231\301\352\261\273\324\225\203\301\275\210\344\374\252\211\324\233\273\241\356\346\343\225\352\360\325\273\341\310\313\217\351\211\372\201\346\304\335\323\343\243\356\273\254\215\347\316\204\367\275\375\366\205\370\217\360\341\244\236\250\261\206\244\252\355\321\220\331\274\375\244\342\212\321\306\320\220\323\262\304\234\236\334\236\263\272\313\311\350\300\320\332\247\254\270\316\202\345\335\216\333\235\234\201\345\256\261\320\370\253\371\216\230\230\222\333\256\352\372\234\366\231\211\262\230\254\340\374\200\303\240\216\363\326\210\303\306\314\230\214\261\344\206\216\353\363\314\373\301\264\367\214\337\355\276\262\263\330\312\215\243\227\316\272\376\371\360\361\306\222\261\265\246\331\233\301\201\252\267\327\237\336\363\350\320\336\211\234\236\307\377\374\204\377\343\341\203\265\265\340\305\244\357\307\247\217\377\275\306\274\205\254\206\222\366\253\343\372\211\377\213\223\343\277\341\334\205\220\231\214\214\307\226\272\256\246\264\374\330\346\347\331\231\304\200\313\217\303\243\236\227\333\212\264\353\340\226\354\264\356\314\377\212\260\350\242\306\224\310\240\363\306\331\336\215\322\363\227\364\212\345\252\371\253\313\325\271\221\267\227\374\364\370\220\245\353\364\216\335\203\222\353\254\250\255\306\242\331\253\251\226\276\306\272\305\305\350\253\332\272\252\214\217\261\333\324\304\310") -TOPIC_TEXT( -"\307\333\216\253\213\345\341\206\332\304\301\350\370\366\356\306\234\330\242\252\201\222\353\254\315\277\353\366\275\367\247\346\307\310\254\316\367\355\332\305\301\260\245\270\261\213\342\233\316\233\255\232\236\263\224\211\211\264\224\335\270\360\365\274\342\275\330\214\216\233\364\230\366\320\304\324\315\210\230\303\210\271\261\361\226\223\213\246\260\275\352\326\273\215\350\361\332\345\201\272\302\361\331\326\257\227\264\213\265\276\325\272\312\202\276\277\327\325\367\310\373\363\212\217\206\247\260\231\304\360\274\330\230\224\270\365\356\317\304\254\364\302\212\372\261\343\322\330\363\217\377\252\353\372\343\247\375\377\200\207\376\276\345\343\223\232\321\370\261\276\363\226\361\360\353\375\333\377\210\206\304\331\201\377\275\335\265\315\301\217\261\354\255\273\354\366\374\260\367\266\346\247\325\306\236\312\237\241\314\334\373\370\331\326\371\261\245\307\274\226\261\300\322\343\202\256\377\313\361\375\326\344\250\227\372\233\203\217\247\225\267\333\307\320\340\303\302\327\213\326\342\307\332\246\211\276\233\374\304\255\233\355\314\357\365\224\302\342\360\363\313\330\270\273\350\266\266\343\316\276\235\251\207\364\253\360\306\235\311\226\357\233\251\304\217\346\211\275\217\304\207\351\334\331\220\335\206\371\313\306\314\237\343\326\207\224\343\246\276\311\211\206\244\322\342\303\337\213\334\333\354\272\263\361\335\217\300\341\367\303\237\362\376\232\267\250\377\364\365\313\227\322\205\310\317\217\361\347\252\330\312\254\361\341\365\203\226\320\242\215\335\312\336\355\263\341\370\234\340\267\244\345\217\357\321\230\325\302\211\362\344\234\362\277\270\362\247\306\200\261") -TOPIC_TEXT( -"\220\263\332\274\265\360\266\360\323\266\231\307\307\237\252\211\274\334\271\246\336\367\342\306\320\203\351\204\337\227\263\350\341\355\370\270\247\223\357\330\202\260\311\270\260\207\232\252\345\365\224\300\312\303\260\336\322\230\222\262\276\302\332\313\372\374\352\340\271\327\273\206\301\212\230\201\220\302\240\275\347\230\235\313\265\244\356\214\224\344\335\304\274\277\233\370\375\277\275\326\315\334\253\371\274\216\376\274\371\300\201\275\347\277\371\331\223\300\225\201\367\353\273\377\360\366\361\277\203\252\257\377\333\301\203\340\305\355\376\255\327\360\277\306\314\377\232\273\374\331\375\351\275\270\261\275\331\335\332\212\203\214\224\214\215\202\263\227\336\220\346\304\303\272\237\333\304\214\276\212\247\307\232\247\205\221\252\203\370\272\205\306\205\270\357\357\332\254\232\347\350\220\233\373\373\376\324\266\357\213\247\241\353\221\211\310\333\230\312\372\342\255\233\201\256\303\222\234\300\270\201\214\245\370\333\373\363\372\332\210\230\363\273\206\313\327\241\307\372\253\346\240\220\362\253\374\233\324\200\311\225\311\257\361\242\211\337\341\356\360\355\256\335\273\341\344\323\374\313\227\271\320\332\223\227\373\355\274\234\332\354\210\324\352\360\201\254\230\304\217\341\217\375\361\264\270\326\345\343\231\263\264\276\306\244\314\256\337\343\335\267\256\231\236\352\273\245\303\257\273\204\357\223\353\257\326\203\316\312\373\363\300\277\371\225\306\225\234\255\252\251\327\346\270\213\256\331\362\342\235\333\204\250\300\315\245\220\313\271\302\304\336\251\262\260\344\262\325\215\274\277\201\366\222\231\266\221\236\236\342\215\370\305\254\262\257\242\372\265\205") -TOPIC_TEXT( -"\323\304\275\342\234\340\350\205\216\277\375\325\265\375\363\341\343\277\333\377\343\301\374\301\353\277\211\314\320\345\220\341\320\342\234\257\311\276\323\362\367\207\314\353\352\250\230\202\275\246\325\356\202\257\307\377\374\344\353\231\353\326\301\365\336\270\241\345\312\201\325\324\271\364\223\350\332\371\266\200\354\221\324\203\252\231\236\353\207\326\335\372\242\237\213\367\372\333\316\307\313\301\342\217\352\345\240\325\331\224\204\306\267\244\312\344\304\311\354\341\251\222\237\374\354\263\317\304\217\312\274\273\312\221\361\322\204\312\334\342\342\272\201\227\236\373\224\376\305\333\314\201\343\247\310\362\336\305\330\313\354\203\207\221\202\320\343\320\342\351\223\371\321\307\237\221\206\313\351\251\210\206\361\260\317\234\230\251\232\355\351\224\253\366\372\346\305\306\363\302\323\343\343\276\236\373\264\275\306\314\267\365\313\227\300\222\247\246\340\306\250\244\246\237\216\274\371\224\363\354\360\315\316\303\277\302\324\354\330\322\374\343\217\214\320\351\277\241\276\233\276\351\345\274\261\345\323\225\317\323\254\203\203\372\361\355\260\300\233\332\360\360\353\354\235\300\231\303\342\303\227\350\233\203\225\354\374\234\253\215\347\222\225\313\212\267\267\244\304\272\301\241\205\317\244\234\212\332\347\356\366\261\375\217\370\213\363\351\341\362\306\220\303\271\234\261\336\352\241\312\326\244\253\303\346\203\340\323\322\242\270\362\200\252\214\236\304\254\372\343\337\226\376\255\331\251\262\231\362\360\340\346\336\271\346\345\323\377\250\272\324\213\334\273\300\206\307\207\326\267\330\376\367\367\237\362\206\276\205\226\321\211\255\214\250\372\354\203\310\226") -TOPIC_TEXT( -"\345\306\204\330\372\234\304\270\313\236\356\330\213\356\216\304\202\332\204\316\206\212\267\267\354\265\232\305\337\324\375\210\237\334\246\272\240\346\324\301\210\315\360\370\254\200\201\316\225\243\320\267\262\324\314\272\223\207\330\217\242\273\324\336\323\314\201\350\241\303\223\307\251\311\301\245\347\352\217\230\235\217\224\205\233\260\310\231\316\246\330\222\372\254\257\273\366\355\245\242\276\201\302\312\303\346\330\212\307\247\376\223\252\332\346\336\342\204\266\302\217\251\274\216\365\334\307\342\354\264\365\356\270\251\257\277\216\365\304\260\347\212\306\333\264\354\357\322\235\211\257\324\246\312\320\242\274\275\316\273\201\344\301\356\273\335\370\275\363\242\353\356\373\273\335\261\324\255\275\213\207\314\316\233\237\231\206\335\230\233\200\237\336\331\354\374\252\356\307\226\361\303\214\220\332\264\367\214\263\337\312\217\347\233\346\301\356\275\240\217\246\374\231\262\345\223\343\214\350\322\340\234\303\360\237\215\366\310\225\206\243\215\230\255\207\376\377\211\320\337\253\341\311\344\310\340\313\253\367\251\377\225\236\252\321\237\375\236\276\376\367\270\304\235\211\256\277\327\233\215\235\223\214\277\215\364\342\265\222\372\236\354\324\316\263\376\225\226\321\345\306\310\372\254\313\235\345\306\206\241\234\264\333\247\221\235\221\363\333\364\303\311\324\241\247\234\310\314\310\217\361\365\336\230\265\247\310\234\220\303\356\311\274\226\356\232\370\253\313\363\271\342\306\336\342\312\323\241\341\220\277\365\324\227\253\272\233\305\325\225\241\362\200\243\247\310\313\200\375\304\362\212\307\205\234\320\255\227\236\353\344\372\307\343\202\263\205\245\361\366") -TOPIC_TEXT( -"\351\271\240\372\211\237\321\213\241\375\337\275\250\304\340\253\304\217\334\271\314\300\267\360\365\307\322\243\256\260\272\323\261\262\271\371\252\206\341\351\361\320\304\377\257\210\261\245\226\342\332\204\265\275\260\272\264\233\341\370\266\330\230\200\241\225\320\313\264\346\230\365\205\371\374\204\300\200\301\223\215\241\225\231\346\310\344\321\241\315\334\260\242\337\354\304\271\200\340\257\216\375\321\377\350\320\242\336\211\241\223\240\306\344\341\310\206\363\226\234\371\367\213\217\376\324\327\264\266\274\342\260\375\370\310\220\231\304\350\342\366\324\323\343\253\257\321\260\250\267\302\322\343\315\310\252\243\254\322\232\214\303\236\312\324\331\252\325\344\244\210\323\276\342\305\250\241\346\210\222\303\356\317\335\363\252\313\257\265\202\237\205\263\217\236\276\346\313\246\324\207\201\360\231\236\231\232\350\357\373\207\321\353\355\326\250\304\266\221\300\241\206\247\366\206\231\232\254\265\220\206\341\352\200\324\275\206\323\343\334\330\222\355\342\375\351\261\374\305\260\203\231\252\314\372\334\320\257\206\311\312\277\276\327\231\207\231\326\236\205\240\323\334\250\213\354\327\313\217\365\347\326\370\251\275\226\307\211\356\376\227\237\300\207\347\246\307\311\217\217\323\256\205\305\256\205\263\262\205\305\244\320\236\357\374\351\327\231\334\320\332\313\375\340\260\256\344\254\265\247\376\375\217\311\242\301\220\261\354\274\344\241\352\350\201\377\376\313\234\356\307\205\342\342\273\265\233\337\325\326\342\257\316\377\372\370\337\213\317\226\342\200\262\257\275\306\263\272\232\343\307\313\341\300\324\250\225\255\256\316\254\314\315\274\365\233\236\341\353\366") -TOPIC_TEXT( -"\323\221\303\333\243\267\264\275\276\335\364\361\261\361\336\262\330\306\354\210\311\217\215\322\247\221\316\347\275\371\302\267\372\314\302\247\327\374\336\257\317\253\365\261\325\264\260\302\247\273\356\366\355\322\364\254\270\346\230\324\260\211\301\365\263\251\370\371\244\323\363\344\255\256\357\246\207\371\242\327\213\321\276\215\373\212\214\227\361\314\261\222\333\306\273\367\253\372\202\204\230\347\341\334\364\254\275\225\222\214\202\262\245\370\266\322\341\225\215\362\322\343\225\303\346\252\262\351\361\301\333\275\344\313\217\251\236\241\241\314\330\272\223\357\261\206\373\256\323\313\217\215\316\254\244\226\372\314\242\235\244\245\302\217\207\306\306\236\215\312\264\355\356\361\331\206\250\350\240\205\262\347\254\254\312\207\243\252\216\305\315\301\335\205\326\270\260\260\342\212\256\244\310\275\232\320\372\233\333\271\200\220\343\353\223\247\200\201\302\340\274\275\265\267\365\253\362\363\203\247\343\242\273\305\243\373\365\377\220\312\334\373\273\377\357\216\374\376\223\313\342\215\377\223\263\307\376\375\217\243\226\253\377\321\250\245\256\336\232\237\362\276\221\331\260\316\275\201\317\316\314\254\272\314\353\200\262\366\257\270\332\373\347\304\342\275\344\261\245\215\221\222\236\233\245\316\254\263\217\224\313\377\365\260\361\350\261\250\212\251\205\223\212\257\266\351\220\264\247\367\377\315\251\340\354\260\212\222\230\312\316\315\216\216\214\215\376\314\216\217\224\262\222\365\306\227\231\321\215\370\232\313\204\212\310\306\231\231\232\331\375\234\376\334\377\241\353\376\331\304\376\343\247\261\226\255\211\343\212\206\270\222\236\224\322\346\242\371\337\345") -TOPIC_TEXT( -"\370\261\357\215\266\231\252\330\267\325\353\360\275\344\320\343\261\341\337\372\320\365\244\225\235\227\325\221\232\376\301\354\317\256\376\307\214\266\214\316\214\307\304\262\272\330\223\206\234\203\301\316\222\340\216\262\243\364\200\230\273\262\262\266\266\272\263\376\210\316\367\251\231\321\200\243\204\244\362\334\211\240\301\263\304\310\307\333\353\342\263\307\327\342\373\203\347\252\344\370\262\251\262\303\307\314\341\332\263\332\342\371\353\335\307\237\230\205\227\277\303\306\340\257\246\316\200\202\340\355\373\220\213\315\347\276\357\370\335\204\201\344\324\243\213\351\377\245\275\223\217\376\307\241\234\303\373\301\237\317\267\374\375\375\257\377\372\351\351\372\274\363\371\311\360\374\323\307\237\340\275\300\302\334\204\343\215\305\371\245\373\342\266\276\222\277\223\371\362\332\267\371\370\313\230\362\335\215\233\211\206\367\224\305\366\305\310\372\272\354\224\272\215\207\330\230\251\342\212\276\332\226\326\321\340\220\275\346\263\357\315\251\244\340\353\213\352\261\233\252\372\210\353\257\327\214\343\213\207\301\216\327\340\312\353\332\302\234\217\205\231\213\333\344\330\275\363\202\246\267\357\337\322\324\254\375\331\370\336\222\226\361\242\267\375\321\223\376\203\245\334\317\347\360\342\373\366\253\271\340\367\237\316\315\346\263\345\337\353\276\274\262\361\370\224\267\251\241\307\364\356\361\222\274\305\367\357\336\362\346\375\234\306\226\346\247\342\300\230\361\374\235\327\202\274\203\237\221\355\263\232\336\245\211\305\364\254\254\266\300\367\271\265\373\376\312\223\231\316\242\344\256\276\307\270\275\364\361\207\341\327\346\236\315\212\336\355\232\304\377") -TOPIC_TEXT( -"\215\313\301\232\272\206\361\267\354\357\206\231\216\363\361\241\376\275\340\361\202\220\200\354\236\261\313\301\335\367\272\276\277\262\270\367\303\337\361\363\277\362\247\211\324\316\273\371\275\347\236\342\374\247\274\364\370\365\277\261\340\273\352\352\322\354\216\246\302\254\276\250\245\302\265\316\364\236\313\274\243\254\225\266\253\302\307\217\305\265\211\352\244\304\217\235\325\366\343\212\361\344\376\312\231\261\372\324\233\212\240\307\373\267\373\326\234\362\362\321\343\212\231\212\236\307\210\347\353\213\275\342\231\265\341\220\220\265\201\230\222\303\343\206\302\301\210\354\230\312\225\320\260\210\265\241\374\205\253\301\253\230\374\306\371\201\257\213\223\325\363\246\253\325\334\362\365\362\361\365\222\337\265\303\337\264\333\341\312\366\213\354\270\375\327\270\304\214\353\263\317\262\375\376\332\342\342\245\335\300\232\312\204\221\373\375\351\354\342\322\346\201\247\253\327\227\311\221\243\207\236\254\315\262\205\245\300\311\352\252\363\373\260\312\315\201\340\305\270\263\255\316\314\375\346\342\323\271\271\360\341\247\353\370\207\231\271\264\331\336\230\306\267\250\305\336\366\262\225\317\326\334\376\251\265\220\352\353\271\327\256\372\355\372\312\322\362\307\201\326\342\273\240\353\325\244\365\203\273\363\342\276\232\222\357\361\354\312\332\363\234\363\237\336\341\255\366\202\206\267\201\306\215\221\234\217\254\272\243\236\300\310\245\213\217\211\371\357\340\201\327\212\365\265\360\214\275\336\311\375\257\321\241\341\376\254\351\353\271\206\375\234\357\370\372\342\265\233\350\341\364\224\221\364\335\364\235\263\221\253\257\260\250\267\332\302\322\343\243\324") -TOPIC_TEXT( -"\351\234\301\364\330\370\232\257\356\224\347\255\262\332\224\223\232\270\205\221\374\336\315\202\354\274\271\342\367\362\324\234\312\313\213\217\267\345\364\270\257\364\306\240\224\321\321\375\223\251\352\314\303\261\213\302\341\270\234\317\204\344\251\220\324\300\301\326\224\202\307\337\373\302\216\344\211\310\222\376\347\274\352\326\220\311\254\277\214\307\334\220\316\274\351\275\226\333\222\223\253\251\276\236\220\237\204\362\216\356\370\275\347\360\263\230\343\372\211\351\260\201\255\305\365\362\314\321\316\325\357\236\355\364\205\273\325\322\356\213\364\215\315\371\353\204\242\356\221\241\205\207\256\303\225\200\205\370\222\347\200\201\371\360\326\274\371\252\266\266\347\373\356\307\214\240\243\333\336\227\347\247\273\357\364\325\360\235\273\216\356\374\335\375\260\274\216\225\213\263\343\221\355\236\203\222\246\367\242\245\276\243\361\216\262\330\226\210\366\311\217\215\322\247\361\224\300\274\263\370\232\257\367\336\370\211\367\333\357\223\342\220\302\323\260\245\376\245\227\267\234\255\367\317\353\350\250\250\241\261\324\245\310\374\333\254\326\242\201\343\341\266\322\340\335\257\375\253\331\213\370\302\365\210\331\242\266\215\221\225\225\260\231\211\212\346\277\364\357\247\375\256\211\237\365\352\307\211\244\367\332\310\265\363\223\314\333\222\230\235\224\244\211\345\265\341\313\352\343\207\353\343\306\270\227\270\276\303\212\211\306\200\216\304\321\344\215\342\271\351\270\351\246\316\373\266\272\267\351\261\344\317\364\312\312\213\314\257\336\374\232\342\334\342\264\234\214\357\243\215\300\365\361\225\216\300\221\217\223\247\200\301\270\371\377\275\307\330\346\214") -TOPIC_TEXT( -"\314\370\335\233\275\244\307\265\337\356\214\201\333\276\334\364\341\352\234\342\204\327\204\237\206\372\346\203\351\361\310\221\262\212\340\200\254\255\316\337\370\361\236\257\326\277\302\242\374\250\317\324\330\315\211\253\257\217\264\260\370\232\224\215\332\374\322\230\235\215\303\311\307\336\345\322\321\271\352\316\305\307\203\215\263\367\245\375\377\261\267\377\354\363\323\251\331\261\360\226\232\330\316\205\362\246\223\310\273\316\213\213\334\260\305\350\261\235\311\234\317\265\210\227\320\331\326\366\221\317\252\230\303\264\206\253\221\346\251\244\237\374\270\243\353\341\213\221\301\304\322\373\367\262\216\360\335\323\317\375\250\202\213\347\274\376\374\247\302\361\272\260\300\334\253\302\365\326\217\276\213\306\272\326\216\327\224\233\363\351\275\374\242\205\324\365\322\216\323\222\336\261\342\234\363\270\217\231\311\221\234\361\234\230\274\243\236\352\245\350\371\276\232\337\244\205\307\215\254\326\321\203\300\276\340\265\212\350\226\261\350\250\242\360\355\261\341\244\350\275\336\371\374\350\300\201\215\371\377\361\350\235\375\377\357\360\202\347\264\264\237\233\236\270\307\337\360\265\330\234\257\314\373\216\343\256\206\333\331\374\307\314\350\206\327\333\231\334\377\302\273\307\333\255\276\302\321\242\374\210\311\217\365\251\211\323\270\257\203\211\242\262\376\345\205\222\300\311\224\271\270\275\355\245\264\270\206\354\236\276\204\232\313\237\303\355\356\204\314\343\361\272\260\330\250\266\240\201\370\357\331\311\350\352\333\377\350\327\355\205\313\347\230\326\365\273\333\263\262\342\275\246\376\206\270\302\364\213\271\342\314\357\335\261\210\340\365\233\251\346") -TOPIC_TEXT( -"\256\234\222\317\304\206\240\317\234\331\216\213\367\303\353\346\370\371\333\353\305\304\242\265\214\267\232\212\275\364\262\332\362\346\323\332\306\326\272\312\321\203\230\273\243\347\226\303\264\314\225\362\264\204\355\226\322\323\237\316\326\350\261\324\377\347\366\313\343\213\354\320\356\272\367\200\362\221\207\243\315\364\352\340\364\226\320\254\342\211\324\352\373\317\260\305\225\264\243\316\250\314\264\367\366\233\237\233\215\336\240\275\233\336\316\217\326\324\200\225\217\365\201\367\342\271\370\362\347\333\200\213\357\341\241\243\274\245\270\342\351\361\232\225\246\317\313\266\265\244\336\321\226\333\304\217\341\213\312\247\375\265\221\217\237\321\305\217\371\203\245\362\352\336\262\267\224\354\260\204\230\367\226\232\237\347\276\206\332\251\251\265\345\271\344\235\231\326\217\261\245\224\377\266\223\315\212\222\334\250\201\230\203\270\226\325\215\247\225\207\354\370\303\277\352\257\227\221\320\343\304\322\373\367\366\254\336\274\371\345\270\245\366\233\351\361\316\255\213\246\245\307\372\322\261\325\231\262\245\301\344\222\344\367\200\317\231\301\214\205\352\372\300\373\253\265\345\305\213\215\302\303\317\237\275\340\245\272\326\300\301\353\241\230\254\266\317\244\247\200\213\317\246\301\330\234\234\217\275\346\225\223\273\342\364\374\321\372\304\236\247\360\357\347\300\223\271\332\243\200\214\246\272\274\210\235\231\375\236\274\325\320\332\213\373\215\304\330\350\342\344\240\227\214\266\355\276\330\364\356\333\233\252\233\366\356\207\216\355\205\272\253\246\371\343\342\374\264\326\346\246\306\236\216\216\367\371\307\326\331\222\225\246\277\333\356\252\317\274\227") -TOPIC_TEXT( -"\254\266\314\237\302\322\343\370\206\203\254\225\202\246\366\307\265\266\374\251\322\354\325\274\351\240\327\307\213\364\222\325\361\271\275\246\267\257\327\215\210\261\207\257\330\226\236\333\224\201\320\315\260\262\332\312\267\257\246\310\250\214\202\245\362\210\327\233\241\346\366\267\232\340\240\376\345\232\243\247\241\264\210\343\201\361\203\236\353\357\205\231\270\323\373\367\254\370\343\255\320\221\324\315\217\251\312\203\307\201\232\364\247\222\200\347\236\246\255\260\340\304\301\224\271\240\214\301\313\331\200\232\247\273\334\222\355\371\315\351\342\203\360\240\335\347\257\231\306\211\372\237\307\215\270\202\343\233\304\302\310\361\234\353\217\341\376\345\225\327\253\310\371\257\321\343\375\305\240\351\351\214\200\311\217\203\340\212\350\226\212\276\246\254\311\344\234\275\343\356\210\366\352\253\366\356\255\377\373\337\210\337\377\363\341\310\303\313\234\347\333\313\324\304\310\323\272\343\343\327\265\265\327\257\206\337\212\355\274\227\205\362\353\355\325\273\211\367\224\305\320\266\303\310\372\314\247\376\216\371\355\273\267\201\376\232\357\233\214\326\260\302\350\261\272\327\363\346\334\214\234\354\303\220\231\242\267\247\253\234\211\343\222\266\360\346\305\331\300\372\354\321\204\234\345\326\265\267\221\353\363\203\204\306\261\201\222\307\371\302\220\206\312\230\246\261\262\222\266\223\200\222\252\274\271\361\346\322\346\354\214\205\306\372\357\370\203\250\231\224\357\221\241\344\313\260\263\373\367\356\375\205\207\341\305\207\241\345\234\221\220\216\352\250\224\347\220\306\230\213\214\310\371\270\252\372\377\316\313\350\206\254\222\222\200\362\276\356\250\335") -TOPIC_TEXT( -"\354\320\247\300\336\271\342\217\236\316\265\355\356\322\250\267\234\333\321\245\307\363\316\266\264\247\322\334\207\231\212\346\300\217\231\373\242\245\357\365\227\215\350\372\314\266\316\341\205\210\365\352\235\277\202\232\305\201\345\266\362\225\211\357\260\350\234\340\315\315\362\374\357\350\305\201\376\240\246\323\215\244\353\356\330\361\260\342\220\344\337\226\253\377\221\232\235\303\230\370\244\266\266\300\272\372\240\326\337\341\221\271\302\306\337\217\335\302\216\254\331\263\322\255\301\253\200\210\361\344\334\356\225\336\350\261\350\336\317\214\233\221\334\342\360\321\211\226\253\266\365\376\374\376\203\267\337\257\253\312\277\344\322\314\274\233\255\252\205\276\304\346\375\353\257\326\214\235\300\274\351\200\371\221\317\302\310\260\223\323\275\202\246\320\343\233\313\315\227\354\211\220\246\230\216\257\350\200\230\262\236\251\364\230\376\226\314\355\341\323\203\366\255\260\300\311\373\300\240\353\273\233\271\311\250\346\374\212\340\370\304\225\303\221\210\215\302\202\333\305\321\241\234\207\337\370\321\211\374\351\363\311\376\254\303\247\323\263\225\236\343\357\276\314\226\316\364\300\367\262\361\365\207\343\213\214\214\273\376\203\324\300\376\313\250\240\271\263\355\230\356\356\354\257\256\364\216\336\353\335\237\222\347\202\273\276\300\236\235\274\336\363\325\356\346\237\341\200\374\266\375\241\336\312\347\375\373\277\267\376\337\273\335\267\232\232\266\233\251\257\270\337\360\365\227\231\234\334\362\201\201\344\303\233\240\347\221\271\302\322\347\343\325\245\331\360\343\342\227\306\203\370\347\221\366\312\230\311\202\251\313\305\352\205\256\261\374\203\202\267") -TOPIC_TEXT( -"\217\345\361\225\360\345\253\207\321\261\304\257\275\226\244\353\337\265\310\233\243\230\216\372\266\312\274\333\322\260\354\323\322\343\367\213\360\310\351\326\247\252\303\275\360\201\275\317\335\211\353\372\256\277\377\253\320\326\357\332\262\262\360\264\355\232\271\223\363\245\314\336\225\222\216\252\264\213\321\305\322\244\247\275\367\333\353\327\322\356\351\252\273\356\251\240\311\335\272\367\272\222\357\215\355\207\213\315\353\270\361\332\241\227\324\231\346\231\341\240\255\325\200\341\234\277\345\202\225\337\336\214\264\352\310\263\301\217\330\243\224\233\204\204\266\323\273\340\204\337\364\216\313\260\254\314\340\373\271\347\263\371\345\357\364\341\247\357\266\365\337\312\332\363\206\326\336\334\372\322\361\232\276\260\310\375\343\201\261\312\256\216\322\336\346\263\314\260\266\370\262\336\312\243\374\347\353\317\357\330\365\273\341\346\326\347\315\333\313\235\337\361\264\333\367\354\230\270\253\204\205\251\226\235\366\225\350\201\374\352\277\256\322\244\336\343\226\333\211\341\366\323\363\212\270\325\311\212\233\203\313\364\222\227\246\305\327\222\371\353\345\375\211\257\361\270\302\210\355\200\332\315\313\240\307\237\372\225\201\264\217\364\330\242\254\200\203\371\373\373\313\226\276\261\274\330\371\211\233\342\367\335\217\353\226\317\327\271\265\260\236\227\217\261\332\266\226\353\235\355\323\255\254\261\355\271\361\231\223\300\340\252\303\276\242\277\340\220\246\314\267\206\307\315\323\335\323\327\236\257\262\201\344\321\350\211\230\273\356\240\223\236\242\337\315\217\243\227\352\233\204\202\206\362\252\356\244\244\227\212\227\250\227\343\207\260\206\333\220\270") -TOPIC_TEXT( -"\236\330\217\350\323\271\371\255\205\275\330\365\235\317\267\264\245\337\377\246\237\247\373\306\346\360\313\252\275\300\321\255\330\330\234\275\262\203\327\314\200\260\234\307\201\315\321\307\323\222\314\212\206\245\314\373\337\253\252\344\311\361\255\313\217\361\204\377\344\362\240\272\320\230\270\362\352\356\212\365\345\371\376\265\370\252\266\266\263\255\223\205\364\230\327\206\364\321\242\354\241\224\274\372\372\243\255\350\361\343\275\257\255\202\271\331\242\302\224\311\271\202\374\327\211\374\225\302\327\257\364\347\210\227\321\334\330\376\362\323\370\255\214\336\313\375\306\253\301\232\267\375\263\342\351\203\277\375\213\261\350\261\270\357\326\324\205\323\343\302\211\313\207\204\333\270\227\346\205\362\234\322\351\252\306\303\377\252\252\303\263\351\221\225\243\205\247\274\374\247\277\272\253\301\202\331\237\237\331\373\241\253\263\323\300\366\376\351\377\301\372\341\271\351\211\353\345\227\257\325\235\273\216\233\232\251\346\233\317\234\311\374\222\237\267\245\330\356\220\324\231\226\232\200\212\262\234\325\336\277\224\313\265\274\326\204\215\342\332\231\300\317\267\212\225\312\347\363\267\361\326\256\222\273\242\255\267\304\206\225\331\222\372\211\202\312\273\235\327\327\240\314\213\361\333\300\371\315\213\254\327\253\271\305\344\362\220\332\363\267\373\360\234\232\360\253\342\235\245\314\200\260\231\255\253\271\372\314\214\342\334\353\232\327\340\206\300\375\242\333\216\312\274\320\273\227\271\232\254\257\375\206\314\247\214\213\203\340\371\363\257\271\277\206\364\246\215\220\233\223\263\203\254\240\347\203\201\310\226\221\242\302\372\254\372\212\212\322\344\273") -TOPIC_TEXT( -"\242\301\223\230\234\371\266\362\370\346\320\345\345\261\332\336\302\266\234\306\274\231\211\303\374\246\256\300\363\346\275\231\361\301\334\266\363\243\234\254\250\316\275\311\326\326\366\315\212\262\222\223\254\252\211\272\244\361\377\336\343\210\306\372\221\245\311\327\232\332\214\273\302\231\234\274\253\273\351\240\273\365\241\310\346\273\225\353\313\363\372\313\363\323\240\301\270\345\376\235\254\251\231\231\312\334\356\215\367\355\333\247\362\302\210\302\253\341\201\225\203\355\366\255\327\372\372\356\245\335\240\310\262\347\254\242\207\256\201\336\221\260\371\365\202\262\331\351\312\242\216\253\321\247\204\224\271\314\324\211\345\337\330\310\276\301\352\332\373\206\343\213\270\253\275\230\236\300\234\367\375\223\265\361\221\310\275\262\257\205\326\300\247\322\311\373\203\263\276\317\252\205\311\300\327\224\320\357\340\365\347\334\340\332\354\366\236\346\367\371\370\347\312\371\274\257\332\317\325\340\300\333\375\247\210\213\200\317\306\345\341\345\225\361\351\234\207\372\331\352\377\202\364\270\341\366\251\304\213\273\316\342\333\240\252\372\221\214\377\315\324\302\335\361\343\252\327\323\300\305\247\360\205\320\354\215\323\214\261\303\201\337\233\212\356\272\272\267\331\212\223\243\314\216\313\233\330\245\275\274\374\224\324\201\265\327\200\210\370\325\331\372\233\273\244\373\263\336\340\211\356\366\321\312\243\335\254\241\374\327\323\322\330\311\252\265\243\235\354\330\300\302\323\354\245\243\353\326\320\263\311\360\217\275\343\372\346\231\215\270\374\304\262\232\351\363\301\206\215\224\265\346\246\247\330\255\234\353\374\344\343\243\377\276\332\302\302\334\264\276") -TOPIC_TEXT( -"\302\342\245\306\266\200\334\326\340\377\210\241\342\203\376\205\304\253\221\276\241\252\370\261\242\222\244\205\221\212\353\345\202\327\277\243\256\353\223\242\275\350\225\313\375\305\206\311\202\364\327\216\222\200\322\304\373\340\225\325\340\211\254\341\201\350\205\232\315\331\306\363\347\377\303\260\330\230\237\311\260\231\362\364\335\350\334\201\345\363\206\264\223\307\300\300\306\201\245\330\337\316\340\367\244\374\263\336\267\267\276\251\253\275\276\376\273\363\273\246\306\306\307\360\344\363\215\337\257\316\256\307\234\341\236\227\254\217\346\202\374\345\372\327\342\275\302\347\261\275\220\211\275\216\255\220\233\247\263\314\211\216\342\346\234\250\373\203\277\322\234\265\262\214\347\354\244\310\235\301\215\230\270\261\337\225\334\222\375\363\346\225\357\335\375\215\350\251\346\352\322\254\332\301\206\231\377\304\275\305\274\353\224\240\223\243\365\215\201\210\311\317\322\312\333\356\222\333\376\211\326\225\201\355\213\276\272\221\233\335\315\351\303\367\346\214\347\366\217\220\376\324\211\375\350\243\217\366\307\273\326\320\274\300\306\277\267\265\253\362\223\336\361\205\356\227\242\243\244\327\265\344\241\233\223\376\335\267\360\266\301\303\232\364\234\233\357\245\202\360\371\316\306\377\337\367\243\355\227\373\370\253\274\366\357\345\322\312\342\323\322\343\223\242\335\354\272\332\332\245\253\200\334\375\247\213\367\326\226\320\345\304\367\323\342\273\210\201\334\224\274\264\302\205\200\235\356\363\214\251\203\272\225\225\233\234\231\274\221\254\302\227\277\225\360\253\264\224\301\311\330\203\225\232\370\255\313\250\302\371\206\220\205\333\306\214\376\317\371\231") -TOPIC_TEXT( -"\210\200\362\236\363\361\222\313\347\235\372\355\250\317\273\377\345\301\233\336\333\313\363\221\325\215\350\210\217\346\347\201\247\333\254\257\245\336\201\226\333\203\227\245\323\343\350\271\361\272\252\313\217\277\314\226\267\205\260\337\342\372\365\256\315\373\303\375\352\245\225\361\372\322\301\374\347\356\341\371\345\355\357\271\274\225\252\336\336\365\375\370\262\267\322\201\313\205\315\343\327\344\316\267\344\352\241\335\200\335\276\257\275\365\360\240\240\357\253\263\330\267\231\227\236\363\204\302\354\240\371\356\257\215\240\234\255\324\334\327\247\335\353\306\242\222\373\344\371\240\235\331\334\334\223\274\337\255\333\300\341\205\372\235\237\344\204\305\226\373\260\325\351\335\351\300\270\261\210\317\263\256\321\215\330\314\235\326\361\203\317\211\367\346\206\361\210\252\374\225\250\261\334\313\345\325\237\336\363\377\204\356\246\237\216\347\365\251\231\217\320\227\347\247\351\206\362\205\236\334\367\354\270\225\270\330\330\304\213\237\306\246\262\301\341\310\350\313\261\376\324\337\312\214\237\305\302\352\314\256\362\205\254\251\340\326\225\301\344\266\344\254\273\361\320\312\200\230\333\216\215\223\345\240\261\230\274\266\230\373\257\256\313\347\201\230\343\323\357\374\243\247\306\236\306\254\241\254\240\330\276\217\260\216\310\357\226\321\241\304\372\214\305\277\311\344\346\350\302\217\355\205\256\352\212\316\254\312\207\224\267\240\306\300\203\315\313\217\367\373\352\356\370\231\334\333\251\310\344\376\347\275\303\206\332\275\325\274\362\205\246\314\365\344\215\273\347\272\300\314\350\331\351\261\344\203\276\236\263\374\226\366\325\347\246\277\213\213\251\353") -TOPIC_TEXT( -"\340\312\321\341\255\357\343\366\241\251\344\254\277\345\274\263\217\304\346\362\212\362\354\346\353\363\306\234\340\327\365\356\243\331\317\262\270\271\262\201\377\235\244\333\202\312\315\361\270\323\264\231\302\312\302\261\272\270\334\303\211\304\302\334\304\351\314\244\331\362\362\216\235\332\224\273\272\234\277\313\251\257\342\300\217\351\336\361\273\363\207\273\353\227\257\331\372\354\260\221\255\250\214\226\260\347\207\371\200\233\240\230\262\225\321\316\302\254\261\203\245\340\221\300\201\274\231\313\305\326\220\241\231\374\240\363\330\310\271\362\234\277\360\273\336\340\230\273\266\311\307\223\245\370\377\216\277\255\320\343\376\276\356\314\372\336\331\323\247\370\276\304\251\320\224\204\322\241\225\331\371\266\304\210\305\324\312\250\232\236\213\335\360\344\203\347\271\267\372\314\303\373\372\332\323\313\241\333\340\202\252\232\336\206\302\377\264\251\271\204\321\367\303\227\271\225\325\277\257\253\251\222\333\246\225\204\263\247\333\323\343\247\262\367\310\324\327\307\343\327\201\270\222\206\263\317\345\247\244\347\353\340\264\324\316\332\215\214\260\350\261\361\344\245\272\361\236\335\301\211\303\223\355\364\277\273\302\350\314\356\302\242\335\365\334\333\252\251\213\321\306\357\351\262\330\302\247\203\345\353\314\354\364\355\321\300\255\301\267\362\204\340\210\320\345\377\234\256\325\321\260\203\267\251\311\240\243\310\275\270\224\267\245\303\207\277\267\345\203\324\375\373\366\305\321\262\371\355\255\327\300\214\206\233\317\234\201\317\346\244\232\271\361\236\263\330\316\200\245\311\344\242\367\354\277\310\365\233\320\262\307\241\304\244\301\273\272\312\354\300") -TOPIC_TEXT( -"\207\223\340\353\335\341\203\357\254\211\336\204\223\261\251\336\255\304\351\366\340\313\344\255\366\250\335\326\315\326\323\364\230\313\341\247\246\306\350\333\221\311\217\330\215\350\241\325\370\350\210\372\354\235\336\254\242\301\246\361\364\270\304\373\212\340\244\230\244\212\341\325\260\240\225\315\244\363\226\324\210\331\222\361\303\333\367\303\340\356\373\245\304\343\311\372\310\312\230\300\342\301\336\264\217\233\255\210\267\310\263\357\310\364\363\277\247\272\236\266\223\204\370\331\234\255\310\342\274\201\203\323\212\212\240\353\372\254\354\223\303\273\334\257\356\262\233\250\315\305\333\340\250\327\222\325\335\330\372\217\275\303\365\377\325\306\370\321\303\342\273\370\341\345\277\342\252\307\326\272\235\213\236\267\347\275\311\362\244\330\315\221\312\325\267\321\343\305\347\223\232\233\310\347\261\322\364\363\317\332\347\234\216\217\374\374\354\213\301\243\221\356\247\230\262\240\300\347\254\254\312\207\335\310\250\342\210\235\347\202\230\260\360\265\211\242\321\316\253\273\323\320\301\344\264\243\262\231\343\266\303\361\322\202\357\200\313\202\336\232\362\226\333\305\307\267\240\307\335\267\266\334\351\217\207\372\257\366\337\351\211\352\354\353\301\365\346\371\236\241\356\274\274\364\326\372\264\354\225\310\226\221\240\320\374\372\314\327\265\262\236\347\370\336\361\205\331\213\246\307\370\371\213\352\204\254\270\341\323\255\273\341\260\267\322\330\263\246\261\243\244\267\262\227\271\353\257\326\245\207\275\241\251\323\366\317\371\217\203\264\372\312\347\230\201\323\212\262\340\367\223\372\254\324\223\206\333\253\334\315\274\262\224\254\315\330\307\340\250\321") -TOPIC_TEXT( -"\217\314\376\261\221\343\226\353\322\215\225\245\253\250\310\347\307\374\347\304\200\201\206\253\347\222\212\274\243\261\226\260\210\314\314\327\275\274\345\220\303\330\223\265\324\315\260\350\261\237\312\317\340\225\347\217\373\265\237\272\350\261\344\315\371\201\345\332\334\304\212\307\207\373\314\217\235\332\313\222\200\314\273\301\211\212\213\363\323\222\216\300\346\214\255\264\355\321\312\272\250\207\210\263\364\234\352\213\224\336\200\230\343\225\240\261\245\212\367\363\361\344\332\303\231\314\305\205\346\316\262\377\373\341\330\320\324\221\373\261\345\205\326\231\331\310\243\255\217\240\351\375\254\267\301\225\332\213\235\275\376\320\375\335\364\271\351\302\371\206\217\257\277\252\255\315\304\373\316\354\320\343\306\373\337\236\252\350\351\200\352\356\334\314\301\234\345\331\324\251\302\322\224\343\251\333\221\303\371\256\325\254\322\230\252\270\237\347\344\265\313\314\333\320\303\333\363\200\371\326\201\364\330\313\373\334\312\307\217\337\274\376\303\331\311\235\262\215\311\217\217\275\201\323\212\252\216\302\316\372\374\241\232\250\202\341\347\326\222\221\322\220\302\226\362\214\203\263\266\316\341\211\365\321\330\364\247\230\241\312\365\302\361\237\224\374\312\235\237\370\274\200\237\342\255\326\252\242\331\366\354\250\261\204\325\221\206\214\222\313\321\220\253\365\243\313\271\316\376\304\362\305\365\352\336\210\353\232\266\227\251\331\342\262\370\215\353\333\212\350\267\326\342\306\274\355\255\327\316\234\250\343\307\216\217\205\305\251\200\253\200\214\323\207\244\316\260\224\257\254\335\341\204\247\323\222\301\331\320\252\352\312\314\233\376\213\360\344\325\347") -TOPIC_TEXT( -"\246\227\333\365\253\267\277\210\233\206\374\257\316\265\364\366\215\315\235\241\331\372\345\253\334\364\265\232\355\364\352\265\355\274\353\351\261\216\305\323\203\261\210\305\334\261\377\200\357\207\204\373\357\307\337\223\304\360\335\355\341\203\301\220\355\225\262\220\213\322\320\246\252\371\377\245\200\254\222\244\210\223\227\256\202\301\315\312\333\320\260\243\327\203\251\352\244\337\370\235\325\367\303\313\334\212\321\336\221\206\305\205\362\223\225\370\355\322\343\327\355\243\272\327\310\364\377\326\352\370\352\350\203\355\243\302\303\340\375\317\306\340\264\242\210\334\237\233\327\353\301\247\226\372\262\370\303\224\342\253\341\233\247\247\327\257\336\206\244\242\336\362\222\314\307\202\246\214\344\262\300\252\231\336\226\344\361\315\334\323\365\345\345\255\236\256\316\344\342\306\304\221\207\353\364\332\326\304\210\212\201\217\257\267\335\200\261\346\264\200\271\361\276\264\250\366\225\200\317\226\317\376\327\272\221\230\263\210\260\342\244\274\247\231\365\370\364\230\312\320\300\246\273\331\223\236\316\222\377\215\202\257\203\372\202\345\273\352\330\262\361\344\331\242\343\277\205\327\360\340\254\312\304\210\273\343\333\364\366\222\226\265\363\222\310\333\371\226\266\225\305\267\300\211\377\377\323\366\336\255\270\252\273\317\243\363\364\343\277\314\264\373\306\236\346\255\343\274\217\275\364\221\235\261\273\201\367\362\252\260\273\321\333\364\314\316\331\315\326\324\304\206\237\266\374\235\235\365\320\343\351\356\263\231\215\235\307\273\253\346\205\215\215\321\325\323\362\327\244\365\233\273\256\206\273\261\350\266\206\254\240\300\230\213\234\215\230\201\214\300") -TOPIC_TEXT( -"\222\310\341\310\302\310\302\222\222\220\320\222\364\317\364\311\324\246\370\244\222\241\204\270\234\375\273\346\371\346\376\370\353\377\204\256\371\362\376\262\365\316\334\374\243\343\344\311\363\313\276\363\371\237\317\371\375\377\254\227\251\252\205\275\304\347\236\307\333\325\336\356\275\317\262\236\276\217\201\217\277\274\220\371\254\236\315\225\220\322\325\313\357\311\263\224\223\213\210\227\235\243\311\253\304\301\272\216\344\300\371\310\207\370\211\254\206\352\331\216\326\242\377\252\311\257\240\206\355\360\353\234\334\362\226\331\221\215\337\245\356\304\266\251\226\271\274\363\261\231\252\325\361\350\316\277\247\265\223\263\210\363\374\333\215\247\305\306\343\354\217\302\273\226\242\322\342\300\353\204\243\252\245\204\264\246\314\222\277\245\252\225\274\270\225\227\212\212\264\263\303\363\200\212\376\315\225\243\330\336\202\324\253\217\310\212\350\365\354\331\365\213\311\374\321\351\261\302\207\254\245\306\267\244\331\276\256\231\351\260\301\265\332\350\202\354\253\342\322\272\237\315\317\216\271\260\361\356\246\351\212\217\234\276\324\372\306\245\211\307\373\276\375\233\222\241\352\205\224\300\230\324\232\314\243\361\340\201\234\250\322\377\261\244\364\331\367\303\355\213\200\306\240\337\361\273\321\240\237\205\315\337\220\210\210\224\377\204\277\202\307\351\264\314\266\322\361\350\344\330\313\264\374\264\230\344\234\264\350\200\220\214\211\207\253\340\240\344\260\300\327\350\332\260\265\373\261\255\271\224\324\307\225\255\355\236\371\365\361\251\311\343\317\236\257\351\277\241\236\241\225\305\371\265\230\207\244\323\352\347\205\225\364\202\270\225\304\276\304\343") -TOPIC_TEXT( -"\204\311\315\310\252\336\250\325\260\350\203\355\240\326\367\222\204\325\206\373\317\325\222\316\251\300\202\332\277\316\252\361\277\261\376\237\217\333\324\335\260\220\342\333\216\377\344\371\321\311\263\376\211\355\255\306\356\332\346\213\277\256\254\257\271\324\221\302\320\207\333\303\351\362\263\317\213\363\322\226\342\263\267\220\351\327\232\232\237\231\342\335\210\316\341\274\267\242\316\351\345\224\305\314\355\255\334\336\335\321\302\331\361\306\211\343\320\356\311\253\366\377\271\274\353\264\264\245\200\351\270\253\324\315\216\205\360\211\232\302\236\215\217\211\207\362\271\331\217\343\240\312\225\346\213\200\255\210\201\376\241\372\354\260\322\275\303\343\234\310\345\230\276\320\262\320\331\372\304\270\240\367\312\252\370\211\361\362\340\336\312\372\214\341\226\223\263\221\370\325\314\307\305\253\353\217\353\233\372\300\237\311\214\302\220\330\360\306\257\251\313\323\247\306\311\230\331\317\361\272\244\211\221\233\236\335\231\356\331\226\344\206\202\356\245\310\261\262\322\273\224\257\231\235\367\345\313\233\241\346\211\262\332\204\362\254\322\377\342\361\326\322\352\317\262\341\334\273\242\226\242\225\367\265\263\240\222\362\301\226\200\222\255\205\332\206\374\306\364\347\306\222\205\353\343\263\324\322\235\317\320\274\312\326\206\236\255\250\325\342\355\215\227\247\305\373\243\334\333\315\334\345\251\220\224\277\252\327\376\270\354\256\205\371\260\213\275\351\270\347\220\231\202\347\236\365\263\252\257\373\272\215\261\310\230\211\214\310\201\362\317\326\314\354\264\355\366\262\214\312\221\223\321\311\265\201\213\332\223\241\216\350\370\314\325\277\273\303\222\256") -TOPIC_TEXT( -"\322\263\236\276\221\273\204\250\333\263\334\235\375\375\335\260\225\271\220\345\350\326\262\246\362\376\245\246\302\355\261\207\256\220\246\273\300\334\320\332\266\245\265\346\326\345\364\303\364\255\210\344\366\323\314\200\340\376\223\372\364\311\261\216\336\353\313\250\236\354\334\267\376\365\344\322\327\257\306\273\237\235\350\357\213\362\276\205\362\256\343\254\360\330\363\245\362\221\255\224\256\370\254\366\317\251\304\341\373\311\204\244\206\322\261\200\274\315\260\246\335\257\227\244\316\240\332\222\213\333\271\352\272\333\315\317\214\332\337\211\253\364\351\337\203\271\307\310\305\263\242\362\267\367\370\244\327\305\312\352\246\211\364\206\344\216\200\225\317\237\260\251\360\214\340\240\215\240\210\326\203\251\373\356\224\334\272\214\334\263\322\311\227\270\270\200\265\351\327\265\342\261\356\351\226\231\374\215\305\271\362\302\313\364\364\357\336\242\373\206\307\230\341\312\233\327\314\347\374\332\274\276\347\246\376\341\232\210\301\300\334\256\230\323\270\271\310\231\201\265\224\264\337\323\363\203\363\226\255\343\250\335\276\373\203\370\260\274\276\263\240\201\215\224\337\330\370\310\265\275\301\316\355\267\300\336\345\235\217\245\252\313\332\357\265\247\362\321\263\331\361\330\323\322\201\341\340\275\360\352\336\245\245\227\222\364\307\227\252\316\253\320\227\361\344\342\331\221\333\312\262\267\252\264\370\334\327\375\214\235\310\314\374\225\347\316\215\236\250\373\301\214\324\361\357\232\231\235\366\333\302\212\333\302\312\360\260\364\212\235\277\322\314\353\204\265\326\314\220\307\364\274\206\350\222\342\315\265\225\272\340\261\263\366\213\213\323\305\306\354") -TOPIC_TEXT( -"\313\352\344\372\317\272\333\224\343\370\314\310\372\267\360\334\310\212\353\252\354\355\270\362\260\345\340\330\320\264\244\320\266\362\243\210\307\340\263\243\355\320\266\344\230\361\337\376\265\244\234\347\243\277\341\261\217\225\271\235\231\201\261\203\333\355\254\375\331\313\276\373\201\304\373\356\236\225\371\330\371\211\347\307\323\223\357\376\360\301\336\357\213\264\363\261\310\270\377\275\345\362\276\335\237\320\231\263\302\254\311\201\202\371\304\327\343\307\255\361\313\250\376\312\251\244\372\364\351\223\323\265\265\325\311\236\311\367\236\343\211\332\263\305\332\353\245\246\243\340\261\323\272\261\336\370\207\271\345\231\325\276\273\247\247\307\315\230\252\331\221\241\337\263\207\201\204\353\211\266\245\215\217\245\227\275\314\266\315\367\343\202\236\226\247\301\311\216\213\203\307\317\203\334\370\314\274\253\272\207\370\306\310\270\200\344\336\261\264\366\255\243\305\220\360\255\251\220\227\371\304\343\216\210\276\236\313\220\225\243\257\217\321\325\273\234\274\202\263\210\324\230\234\217\314\304\243\223\244\201\236\373\331\356\236\225\204\271\245\254\220\225\265\264\211\217\202\214\367\365\337\237\223\352\357\221\217\344\240\201\306\362\240\254\364\347\342\262\210\322\222\326\344\254\303\211\200\305\341\364\233\223\275\351\337\231\336\255\211\334\311\277\277\266\231\216\356\337\233\347\361\360\216\246\222\233\361\223\246\332\302\225\323\350\362\325\324\375\260\264\354\366\352\266\210\245\265\213\253\370\331\210\345\201\233\371\225\332\212\307\257\302\267\357\336\350\277\363\362\201\237\211\245\237\333\351\255\336\332\214\317\305\223\231\203\244\305\364\314\317") -TOPIC_TEXT( -"\233\200\346\363\220\324\242\320\266\362\377\210\307\274\327\210\307\326\241\240\324\337\225\262\316\312\372\314\325\336\366\335\360\255\317\334\223\350\346\211\335\201\350\212\253\247\317\212\234\246\311\334\222\326\210\324\274\216\375\316\226\327\261\363\314\311\330\223\352\256\213\262\237\325\236\300\305\220\324\231\342\244\311\232\252\316\271\265\262\236\346\355\342\342\323\255\375\325\260\355\272\316\270\204\242\344\364\314\257\357\262\320\272\265\323\234\210\353\371\220\200\314\311\217\326\237\270\247\363\313\340\371\310\345\324\336\377\327\364\332\303\365\335\243\315\343\362\263\366\305\263\211\304\230\224\307\314\304\220\306\261\277\245\247\200\200\345\346\361\272\261\356\234\230\321\327\257\222\347\362\301\226\343\345\247\257\304\300\276\227\307\274\346\330\350\251\373\314\254\301\251\276\214\252\305\221\203\230\227\334\377\366\335\360\241\324\362\304\237\240\254\371\331\261\370\344\340\242\266\267\256\323\226\342\314\263\345\337\311\300\211\323\314\353\235\247\243\230\354\234\346\320\312\202\224\243\357\261\307\246\221\341\201\272\236\323\273\200\214\317\250\354\207\267\231\220\367\211\372\222\362\265\331\372\225\206\316\270\236\346\312\352\320\352\311\271\211\353\316\354\356\256\376\320\210\247\274\320\224\311\331\256\345\307\265\322\222\305\263\375\273\355\321\246\243\234\347\300\344\337\245\310\354\342\376\202\263\211\241\276\342\374\352\256\206\343\253\373\365\367\303\335\241\351\275\210\205\262\241\236\236\236\347\334\233\323\323\327\215\247\363\327\237\274\374\377\313\223\243\307\270\211\274\265\230\232\353\350\371\366\315\334\364\262\242\217\266\377\315\254") -TOPIC_TEXT( -"\300\227\336\206\216\203\223\303\363\311\230\367\344\332\211\265\362\370\343\232\360\253\347\316\230\335\337\301\307\232\372\310\266\326\205\256\204\254\331\335\360\357\207\303\225\262\203\330\240\277\277\313\273\365\370\265\327\336\314\223\274\326\202\322\253\253\357\254\230\255\252\262\330\271\300\240\202\222\303\232\206\213\245\243\305\331\367\257\220\210\202\230\254\345\227\251\210\233\354\247\312\213\307\211\323\200\354\214\310\306\223\367\337\356\242\317\256\334\352\214\322\240\356\327\220\264\274\344\371\213\272\270\235\361\266\372\266\301\241\217\240\235\310\223\216\233\216\213\363\341\323\372\214\361\242\252\361\223\340\270\371\240\217\210\316\200\215\205\236\366\220\236\356\350\352\254\207\230\330\263\260\341\377\236\275\262\265\224\367\263\311\337\370\325\213\300\260\346\332\245\247\203\345\214\335\250\230\202\356\322\241\277\242\341\336\247\247\332\365\372\345\337\200\311\326\377\226\222\217\205\325\322\216\214\257\310\201\334\345\221\217\325\272\260\266\372\335\347\343\307\221\344\223\331\313\336\207\362\265\327\342\354\256\363\350\202\325\225\227\346\203\200\311\212\354\325\323\313\233\377\217\265\350\332\342\363\343\300\345\202\235\260\261\324\331\321\206\260\211\306\303\220\220\214\324\256\241\366\337\200\222\203\214\351\240\272\216\322\330\204\242\213\251\234\213\362\343\327\240\335\337\331\367\263\342\304\203\353\362\204\306\324\343\307\255\313\211\235\267\245\330\204\315\275\313\336\200\350\241\275\360\350\206\330\327\265\266\264\213\320\237\353\225\267\336\375\360\237\204\200\325\212\345\373\374\305\200\362\207\340\227\260\226\267\211\214\333\243\343\322") -TOPIC_TEXT( -"\364\233\373\342\337\361\332\234\244\266\213\200\216\334\333\333\366\200\302\213\344\347\205\370\254\312\213\301\333\355\203\213\315\245\247\213\350\345\334\357\242\352\377\264\262\274\250\372\351\341\337\216\310\272\340\310\322\364\267\321\352\203\347\317\236\262\346\240\335\360\323\271\277\376\317\276\256\222\341\261\236\270\210\200\343\232\220\223\351\313\266\362\331\217\300\240\262\213\213\215\263\323\242\241\333\323\340\341\240\367\365\216\214\270\215\203\361\302\344\347\300\302\310\370\342\310\360\230\257\335\267\211\264\301\371\357\336\203\262\311\317\212\223\217\321\262\207\274\367\361\241\253\340\374\366\376\276\233\205\262\205\234\263\205\237\305\343\243\267\300\367\255\320\340\344\307\351\336\247\332\337\265\235\272\321\336\256\377\246\353\353\357\372\316\374\343\234\252\273\376\251\370\344\321\340\236\370\254\365\230\312\346\241\355\331\226\310\336\350\313\252\252\325\250\275\357\244\302\323\331\231\254\220\357\265\345\221\217\231\210\252\376\261\362\247\362\262\236\346\345\373\277\331\213\242\200\220\263\245\222\204\356\355\360\353\261\343\203\307\227\227\227\325\262\317\252\251\364\340\313\321\261\266\247\323\266\314\211\205\231\342\243\374\312\244\326\353\272\332\232\311\212\343\213\376\260\220\310\307\347\247\337\371\347\244\253\236\202\203\375\305\315\200\375\254\222\217\344\231\211\340\224\210\324\346\355\242\301\360\332\301\370\365\266\207\221\317\260\232\361\235\202\207\266\277\261\255\327\251\250\320\277\202\375\260\243\221\356\240\236\227\343\365\371\267\373\316\226\374\212\313\232\273\207\205\242\226\223\346\233\221\306\261\321\207\246\203\204\245\267") -TOPIC_TEXT( -"\205\240\376\237\323\275\373\363\200\256\212\245\276\217\354\335\366\206\362\213\344\333\345\225\330\315\256\351\250\350\334\356\326\206\300\241\260\304\370\327\344\372\202\316\241\234\334\253\324\200\346\327\262\361\313\257\275\304\273\344\237\230\341\373\243\232\344\214\356\215\201\377\264\372\274\300\312\355\310\300\356\230\377\333\314\377\230\271\214\220\235\274\355\333\266\225\373\357\374\256\304\336\334\376\356\273\247\245\331\242\346\300\206\202\262\247\344\300\211\323\313\224\255\255\264\304\320\277\320\321\315\331\367\251\262\204\266\366\211\370\302\321\337\266\270\266\220\372\213\370\234\235\231\321\375\247\317\216\205\240\244\263\364\361\232\217\277\334\271\365\213\302\325\356\200\253\326\256\321\340\332\354\341\367\362\253\214\334\240\271\340\202\203\362\210\240\227\371\304\343\353\324\365\254\232\224\332\366\373\275\223\260\352\234\230\341\313\253\242\303\260\203\340\366\221\351\240\300\216\301\233\266\205\205\231\356\202\303\311\212\317\324\252\226\270\345\345\251\311\226\322\316\333\262\276\305\312\314\241\257\264\270\343\266\226\336\303\305\332\330\256\326\254\322\351\371\247\213\315\323\237\357\337\337\333\325\261\205\346\242\261\253\255\315\245\330\342\354\242\370\354\344\335\335\302\314\342\341\301\272\372\301\236\267\246\300\224\230\212\203\323\361\241\266\202\317\372\317\361\201\261\326\205\230\203\217\351\323\336\241\352\272\326\206\373\363\333\320\201\375\211\370\326\342\237\361\337\375\364\277\351\247\302\210\217\316\274\311\361\202\206\200\261\342\337\241\351\245\334\362\226\336\206\350\304\221\245\347\303\371\364\357\255\220\322\362\376\373\225\250") -TOPIC_TEXT( -"\252\345\257\275\250\364\206\222\357\356\207\210\367\340\344\270\234\270\240\335\270\351\241\272\225\354\224\277\347\307\266\246\215\231\346\357\210\206\322\323\365\321\305\352\203\271\361\260\205\224\221\213\317\326\372\245\361\370\223\307\216\235\340\335\227\337\222\374\321\260\353\274\262\241\373\314\246\315\233\360\331\323\277\323\303\322\253\230\216\251\322\314\365\317\370\346\372\214\211\342\324\342\365\242\240\261\203\335\217\307\303\333\312\346\222\300\246\223\262\204\347\361\327\340\201\234\365\241\322\323\233\261\247\362\223\322\273\211\300\355\262\333\343\272\211\224\200\375\377\252\310\270\342\331\301\371\351\213\236\333\323\334\233\267\267\334\306\355\311\266\313\236\236\374\363\310\355\255\311\367\375\310\372\354\364\334\355\362\216\245\230\223\363\273\361\207\347\346\253\325\200\334\220\371\353\270\347\202\252\227\321\266\205\303\351\206\200\217\376\275\336\324\331\346\355\334\300\270\262\211\271\351\303\216\343\315\215\357\264\263\262\206\325\307\254\277\256\266\342\333\373\322\256\230\200\307\343\343\313\343\230\310\263\263\306\204\307\237\325\371\227\227\227\231\314\340\234\363\263\234\325\326\314\221\377\205\323\207\237\374\206\366\240\257\364\206\344\274\322\377\353\216\236\204\222\246\240\245\371\243\373\240\343\232\320\343\335\263\216\311\304\232\240\231\241\371\251\252\213\324\326\307\350\264\310\332\336\361\364\315\215\344\321\200\314\254\375\216\230\346\237\232\270\315\234\200\223\315\372\201\366\351\273\240\247\336\342\362\276\274\374\371\254\207\375\221\376\331\311\334\262\343\347\251\311\362\225\326\376\347\302\311\234\302\264\312\346\325\214\206") -TOPIC_TEXT( -"\322\214\276\276\304\343\334\342\225\230\350\206\325\220\300\340\220\210\263\230\227\203\255\305\246\351\330\347\320\255\311\230\330\366\334\235\253\266\304\271\302\255\367\267\376\312\253\257\364\364\257\364\270\340\261\344\200\341\361\265\235\214\364\267\320\360\273\230\205\342\371\225\253\252\375\243\261\260\277\257\353\275\367\367\266\212\201\271\330\345\371\363\330\273\217\351\335\324\353\221\215\246\326\304\303\345\311\201\313\305\334\362\310\274\256\354\320\210\312\332\324\247\260\257\313\336\332\206\371\326\364\245\315\237\355\210\250\332\337\242\312\257\266\222\371\312\203\362\246\266\263\273\315\223\374\242\232\336\372\266\301\262\323\237\235\212\222\236\326\331\374\236\261\200\353\340\360\220\236\355\374\365\256\217\366\306\322\357\237\240\236\243\331\270\200\263\334\371\346\374\265\306\221\357\334\373\245\371\327\204\316\370\354\237\301\327\370\254\236\345\320\302\270\307\326\332\232\265\353\225\260\314\237\337\326\365\203\242\373\324\342\354\312\356\344\256\255\215\241\226\352\216\251\372\217\213\206\346\222\201\206\337\374\361\305\220\240\262\335\251\266\355\332\344\257\230\276\304\244\334\272\223\310\233\226\274\306\304\206\361\317\341\223\336\305\232\236\343\342\223\323\301\304\257\275\364\306\322\331\361\270\341\326\227\255\246\207\362\361\257\336\256\214\301\202\344\204\351\267\226\260\203\262\307\266\224\230\224\203\205\336\265\277\266\207\326\300\254\265\262\205\376\362\220\364\227\264\227\271\201\337\352\252\304\325\314\355\264\310\274\226\330\260\304\227\244\230\225\227\233\273\207\203\323\361\326\236\272\325\322\237\255\261\207\306\307\270\255\257\345") -TOPIC_TEXT( -"\275\216\333\315\255\213\202\303\365\305\261\202\240\370\331\306\213\333\343\331\377\335\356\212\317\205\276\310\310\255\375\327\313\216\261\275\201\236\327\342\340\237\324\274\246\342\312\274\222\355\264\365\350\253\301\310\252\345\213\330\326\274\302\316\360\254\372\202\330\300\253\236\234\250\247\370\346\251\376\375\353\214\276\243\336\374\367\304\246\221\242\250\221\254\224\262\241\226\336\356\303\327\352\206\344\372\220\233\223\367\201\264\340\230\226\334\242\274\367\350\270\241\210\323\244\344\217\211\222\261\200\221\243\342\231\266\314\253\306\264\276\342\222\205\343\343\320\247\362\262\246\342\201\304\307\253\275\274\370\254\206\344\237\205\310\233\330\347\342\233\355\220\251\325\200\374\376\314\314\351\300\362\306\311\341\301\264\364\377\342\371\316\313\314\215\362\352\252\211\204\351\336\243\306\200\221\334\327\274\340\212\204\217\261\321\245\304\324\215\213\200\345\314\262\350\337\210\345\206\354\202\327\365\321\362\223\252\260\214\204\376\306\275\322\333\207\211\201\351\270\302\253\261\214\364\216\213\342\310\270\313\313\316\251\243\303\254\203\222\211\300\267\345\243\356\247\317\225\375\217\346\246\357\305\330\335\361\360\337\351\357\336\332\256\321\346\265\350\233\236\317\225\340\261\377\206\243\377\340\261\237\226\233\266\214\355\342\310\322\346\363\260\331\326\333\274\254\326\217\320\366\313\302\342\243\252\372\346\217\251\313\252\206\221\366\353\301\312\317\217\327\222\256\373\262\226\230\262\304\363\263\343\270\352\351\343\333\310\216\252\355\223\372\251\360\352\301\365\255\346\344\323\263\235\324\353\241\317\345\250\357\202\344\304\365\231\214\310\247\353") -TOPIC_TEXT( -"\352\350\371\212\374\360\357\276\215\303\331\306\220\323\377\261\317\341\203\311\223\265\265\223\240\232\364\300\264\203\222\266\211\201\255\206\345\372\264\223\217\261\366\205\263\341\305\214\261\237\241\222\337\305\213\221\325\242\344\300\201\275\334\241\226\302\216\242\326\257\334\220\333\340\367\203\276\320\205\375\327\240\216\337\302\260\223\203\352\343\327\307\255\300\234\341\335\371\311\304\260\202\217\361\203\252\373\356\307\335\327\332\366\355\377\376\244\245\351\227\304\343\215\335\237\375\372\342\323\353\223\331\377\343\342\275\323\320\351\306\366\322\365\206\234\234\360\236\204\241\217\215\216\224\361\235\373\203\274\256\270\301\304\277\370\254\276\254\270\210\206\271\216\315\265\363\341\231\332\226\363\210\223\321\231\226\234\220\252\361\315\303\354\264\273\255\210\341\204\253\245\207\240\251\355\262\306\246\333\335\310\356\271\230\253\314\313\361\222\231\361\300\336\230\217\257\332\304\247\310\313\361\310\225\261\277\276\254\247\342\317\323\252\235\246\243\247\326\226\227\374\271\205\315\265\374\232\324\211\362\222\247\342\323\226\371\236\276\217\271\224\214\360\242\223\344\207\254\204\245\267\240\315\343\361\314\304\356\200\343\237\215\346\201\254\266\370\230\240\347\243\246\315\237\333\256\214\232\365\255\305\314\271\217\212\377\345\210\373\246\214\313\223\210\250\265\202\324\260\273\276\270\324\344\333\362\265\204\334\325\323\335\303\262\200\306\237\300\343\262\237\232\212\322\351\266\221\371\252\372\207\307\267\232\273\207\265\367\343\335\302\237\355\234\215\355\341\316\266\212\214\373\201\217\255\271\323\344\335\235\257\345\271\305\375\242\247\341\331\341") -TOPIC_TEXT( -"\276\361\343\253\225\342\300\216\360\330\272\277\203\377\360\230\326\343\246\264\362\233\266\355\242\325\265\204\373\210\246\235\206\224\351\247\214\332\362\344\321\360\204\330\213\236\342\361\207\254\272\305\247\320\254\237\346\224\347\261\223\270\273\255\323\342\326\301\243\207\307\343\306\365\376\345\300\210\315\215\317\205\216\303\232\271\330\364\310\216\221\225\276\322\257\250\366\335\316\214\225\330\200\214\274\246\225\343\261\360\370\243\371\240\225\213\363\205\244\312\306\233\276\305\317\366\254\360\230\201\301\236\314\236\350\330\374\340\375\255\221\240\265\265\265\330\313\212\370\210\251\337\313\200\331\307\211\245\263\261\325\201\351\351\270\253\341\221\223\347\271\333\304\375\333\340\344\330\332\310\315\376\214\213\344\345\352\336\322\364\214\366\340\310\351\341\303\364\200\251\357\337\362\264\326\273\205\211\343\345\315\375\373\363\326\300\376\372\276\317\342\357\304\243\223\220\220\236\317\370\266\365\314\336\321\275\371\373\202\360\371\362\317\312\340\327\337\275\317\365\233\346\376\265\300\343\215\276\335\370\207\217\245\267\232\215\346\274\221\230\314\353\244\313\276\253\320\357\302\260\230\307\203\260\240\227\274\326\223\352\201\361\271\242\233\242\346\373\252\257\237\255\316\362\266\335\313\204\314\346\323\271\260\202\377\237\252\251\354\310\275\205\324\331\206\345\351\323\227\242\230\323\200\346\333\237\212\253\301\323\246\220\302\363\227\235\314\231\261\267\230\214\222\324\227\346\231\237\235\213\307\246\305\312\376\254\252\327\345\361\210\300\356\357\271\214\361\344\265\343\230\220\231\232\307\274\247\330\247\314\201\243\364\275\240\226\317\211\264\331") -TOPIC_TEXT( -"\214\211\304\225\352\345\273\276\337\366\221\211\212\354\247\351\340\354\201\330\345\320\321\243\300\351\334\226\220\343\203\366\225\263\255\241\261\244\307\205\246\347\211\325\252\372\227\223\356\341\227\272\367\252\226\201\222\246\307\334\346\371\266\301\363\275\343\231\272\263\345\300\336\266\306\355\233\244\364\273\377\346\276\264\232\375\262\367\234\232\251\351\210\326\351\256\341\355\355\242\372\254\321\312\346\356\373\303\226\370\260\312\221\325\323\265\307\267\307\347\334\276\251\266\215\314\371\215\217\313\255\237\226\270\352\207\227\313\332\305\216\371\331\357\361\271\242\205\320\312\313\344\212\264\271\357\370\374\260\205\227\236\346\300\255\375\267\314\303\257\357\372\225\203\340\261\327\240\365\341\261\237\213\265\346\220\213\217\235\204\315\213\332\217\217\311\356\330\326\367\333\353\357\257\300\311\325\301\310\213\213\261\273\332\371\321\221\336\227\325\351\204\334\274\260\275\335\254\271\215\304\252\302\374\340\351\251\266\255\263\200\237\302\203\303\362\276\222\203\362\253\331\323\271\246\274\315\326\213\263\263\343\207\216\244\235\357\217\241\272\203\207\207\372\304\373\310\313\325\257\346\250\220\300\223\304\353\200\270\277\357\240\215\242\263\204\247\250\330\215\243\213\312\250\221\235\206\354\337\350\271\354\330\302\262\304\265\210\320\342\264\214\355\332\327\303\364\344\343\374\376\344\346\225\345\305\202\377\224\353\247\242\203\354\325\307\350\323\331\232\321\210\223\377\206\372\360\314\312\347\370\213\277\335\354\355\224\270\274\303\372\207\222\251\320\343\221\311\263\262\327\256\264\326\367\353\263\250\217\362\265\354\324\330\261\357\277\251\316\225") -TOPIC_TEXT( -"\204\201\333\316\317\214\212\274\323\234\333\276\262\267\247\271\347\334\374\357\370\254\345\365\262\372\311\234\370\231\274\247\204\223\215\233\261\253\273\262\262\273\337\245\256\341\371\315\376\343\364\257\223\315\377\224\270\375\337\221\367\265\305\347\323\313\262\256\306\355\226\221\262\356\322\256\275\233\353\265\265\306\276\317\376\364\311\366\327\222\225\263\343\332\237\251\254\274\341\306\373\237\203\303\330\231\223\310\330\223\336\355\314\216\375\300\247\210\341\212\307\222\212\351\226\376\305\374\344\360\202\301\332\317\370\213\310\271\322\263\336\270\205\351\306\304\372\345\340\364\336\313\376\366\224\335\220\221\302\235\376\312\271\207\302\224\322\313\202\231\342\313\230\365\244\311\277\251\305\264\362\353\344\356\267\264\314\256\324\320\354\315\253\373\253\341\252\334\335\231\356\377\367\347\235\255\253\367\336\204\274\260\322\244\254\247\361\330\275\270\353\264\371\302\300\361\330\246\337\272\324\360\261\220\300\370\344\370\200\370\374\262\335\256\356\243\324\230\336\212\235\252\271\334\370\360\362\261\231\202\351\321\242\305\236\230\351\370\334\360\331\372\235\321\205\266\320\376\263\322\241\252\210\354\325\301\254\252\274\261\275\324\362\251\341\314\311\223\203\307\277\370\333\262\236\217\267\366\264\243\271\365\356\317\320\330\244\231\226\353\261\271\231\327\232\366\252\372\317\332\362\275\205\310\210\354\257\261\305\375\312\322\346\207\312\342\337\301\252\337\360\230\217\304\353\251\271\230\232\210\372\223\370\200\364\327\332\353\215\206\341\332\357\276\277\360\343\372\330\367\214\346\221\360\226\314\347\314\221\344\354\214\204\311\355\346\355\327\235\343") -TOPIC_TEXT( -"\255\277\344\352\323\364\353\346\340\357\337\200\307\213\203\377\320\250\224\327\340\256\237\357\356\356\206\336\254\263\343\340\343\220\370\262\270\331\373\251\262\360\373\230\210\213\210\245\331\204\337\376\306\234\362\212\271\340\243\216\240\211\305\263\217\260\247\223\200\221\216\260\341\300\257\242\306\252\324\205\305\260\323\302\267\305\356\210\223\215\306\242\327\237\202\241\223\222\273\253\330\274\222\364\262\260\340\211\366\376\366\214\324\232\221\247\245\231\367\264\300\202\240\220\202\240\341\315\232\341\330\325\354\356\274\272\223\315\241\225\306\307\216\237\272\370\341\341\255\274\242\333\257\274\207\265\373\343\335\205\337\377\223\337\370\325\311\332\317\201\317\217\367\355\376\204\317\347\267\241\376\236\215\225\336\255\220\341\372\313\312\264\346\352\201\342\322\324\236\347\370\216\237\252\301\233\362\225\312\306\223\200\246\343\274\325\200\322\224\256\256\317\312\211\200\365\306\227\226\302\312\270\377\361\307\362\250\330\332\373\202\323\330\361\326\352\354\270\325\300\371\330\226\326\202\276\332\322\256\364\350\300\276\273\327\352\237\210\307\277\332\276\235\370\216\314\247\213\362\332\370\264\214\274\346\357\211\341\251\274\221\252\365\220\333\361\330\214\230\353\304\213\247\257\342\366\321\363\233\236\247\322\265\313\277\324\203\323\365\341\273\257\327\375\376\357\355\372\227\377\336\214\237\330\363\360\304\201\350\223\311\271\275\231\331\342\221\361\374\244\254\226\336\375\233\206\241\367\201\307\243\227\374\377\324\250\353\226\353\317\235\370\316\375\240\247\211\370\335\374\370\307\353\211\312\266\344\236\247\322\271\346\325\301\236\313\367\301\332\243") -TOPIC_TEXT( -"\225\372\221\361\345\265\330\355\263\205\350\317\341\344\225\324\325\254\322\246\237\344\325\252\213\204\241\370\332\200\353\363\360\366\201\340\253\217\343\260\261\342\260\372\276\247\327\313\200\213\314\315\350\300\347\347\306\223\336\265\257\275\345\262\216\344\207\256\350\354\244\236\272\213\373\221\224\221\251\277\257\253\250\320\353\236\237\231\220\372\373\257\242\243\327\366\326\326\247\355\206\304\203\371\203\270\360\327\354\314\331\233\276\300\356\364\234\225\230\361\242\200\322\253\304\231\201\230\315\216\341\205\244\355\205\276\377\351\331\203\235\335\327\332\230\265\241\347\207\274\326\363\255\220\306\345\265\260\323\247\274\306\256\370\325\340\261\246\300\260\234\336\215\232\377\354\345\220\364\240\324\363\357\376\325\237\207\374\367\377\335\222\304\243\261\275\345\271\323\221\331\251\264\334\313\344\344\375\327\360\276\303\322\271\242\345\345\304\341\254\200\236\301\242\325\277\207\310\226\251\236\235\375\237\254\307\206\237\374\252\264\337\204\361\370\234\260\355\243\342\217\367\240\207\214\330\313\324\242\203\210\352\236\341\242\255\200\376\335\347\211\311\367\261\267\210\355\205\326\232\224\341\264\344\251\312\225\312\247\244\275\354\252\215\312\356\320\325\232\244\201\343\343\221\211\211\277\235\213\315\215\317\317\346\251\367\317\311\271\317\237\276\352\341\226\327\366\374\341\345\354\345\361\376\256\313\266\341\340\354\363\331\207\362\327\245\261\306\206\372\241\262\314\364\201\376\253\204\230\337\230\270\317\256\201\261\246\303\207\366\377\315\206\307\350\201\274\241\242\214\310\233\312\326\353\361\314\320\207\304\243\330\263\245\212\230\257\222\207\233") -TOPIC_TEXT( -"\373\206\261\206\206\245\256\257\253\343\300\213\356\306\361\340\343\266\305\352\362\375\353\222\254\363\270\373\263\234\211\321\364\332\357\330\251\255\377\244\276\212\205\377\244\243\320\231\366\344\263\373\225\236\232\364\352\334\204\335\373\354\377\274\276\367\227\366\253\315\377\370\207\344\244\343\212\377\264\305\241\263\210\327\263\236\330\374\354\364\203\352\262\342\261\346\361\237\304\333\327\341\244\225\343\307\217\240\321\332\374\257\211\372\214\265\263\362\313\375\217\237\351\357\370\235\207\345\245\371\222\230\367\223\242\303\327\242\320\236\357\250\325\207\317\262\307\255\350\215\314\337\213\315\300\231\370\241\272\205\346\306\333\257\230\210\220\206\226\346\267\303\374\304\322\214\362\203\204\241\233\246\333\270\235\343\322\244\362\302\312\206\265\247\302\207\374\244\261\312\306\226\213\271\254\203\271\213\324\314\210\323\222\270\371\352\313\323\333\316\353\211\317\205\262\202\203\261\270\330\334\352\310\326\223\351\242\201\231\250\274\271\341\246\247\247\211\324\351\322\223\360\270\367\370\254\332\355\372\205\205\325\347\300\310\251\353\226\376\242\245\331\303\232\304\257\266\265\262\353\215\324\347\370\365\337\374\371\362\230\375\340\361\242\254\265\261\330\277\260\213\347\244\304\215\266\264\333\212\217\352\376\223\364\264\324\226\377\311\206\265\342\353\220\324\325\266\337\371\270\211\271\271\272\347\333\274\226\342\223\250\275\236\367\276\232\337\244\320\266\357\331\237\317\214\310\357\322\220\273\361\242\270\351\344\236\370\273\344\310\275\336\247\210\260\232\341\212\231\301\366\201\355\256\370\214\266\366\215\317\317\253\301\375\232\256\302\226\275\344") -TOPIC_TEXT( -"\275\330\232\275\265\313\254\307\330\277\245\351\235\313\206\370\354\363\255\341\362\252\356\244\237\240\232\341\361\212\226\264\357\322\321\317\210\323\264\317\341\251\262\330\375\360\245\301\327\371\372\366\223\261\241\237\221\216\347\236\220\222\341\314\367\307\263\344\256\350\241\263\315\345\202\235\310\335\322\336\266\347\222\203\362\334\364\254\265\324\365\357\205\214\305\373\367\355\370\246\225\237\334\273\257\356\277\340\301\221\341\201\262\237\235\207\300\205\225\366\304\253\252\340\210\331\265\212\217\211\336\234\245\242\372\237\340\375\226\347\277\271\370\350\300\252\200\256\217\267\276\275\253\324\374\274\256\327\323\312\266\323\252\320\213\351\265\216\356\311\343\336\356\255\277\324\277\316\272\257\255\363\354\234\216\245\270\352\233\372\374\211\307\352\316\260\232\325\271\202\217\276\261\344\317\340\343\200\250\346\266\300\216\215\244\372\336\310\245\231\360\323\332\350\377\237\224\242\367\267\255\305\363\351\232\346\327\245\246\310\250\356\363\372\306\337\226\360\302\360\377\222\271\205\276\307\317\266\261\376\260\236\336\347\206\221\227\340\261\377\325\335\346\223\351\323\254\274\271\224\237\241\317\257\305\374\314\250\353\210\234\270\205\326\231\301\367\241\207\264\306\206\351\231\220\206\204\346\357\227\341\327\223\301\242\362\367\261\330\243\347\334\333\326\201\354\365\301\207\277\337\315\307\200\354\321\350\254\332\231\220\317\326\325\301\227\356\232\316\321\222\234\250\312\355\244\332\231\230\222\263\354\373\273\344\347\201\212\301\256\304\305\305\323\330\244\374\344\277\344\271\332\332\332\266\213\266\251\347\212\367\336\331\252\323\365\246\343\363\251") -TOPIC_TEXT( -"\336\316\302\362\235\251\255\234\325\342\332\306\305\333\322\335\377\222\363\236\226\370\214\341\311\202\231\351\320\353\350\334\267\375\221\247\317\334\236\350\212\315\324\303\247\257\214\202\313\217\206\334\272\331\266\260\245\337\227\313\245\214\370\254\261\341\300\373\353\262\350\321\217\315\361\233\270\221\231\374\337\342\363\221\264\345\270\322\233\264\342\225\323\370\213\365\276\232\207\324\300\337\341\242\270\361\276\372\342\225\351\211\357\247\275\277\332\354\272\326\253\316\253\222\255\321\267\306\306\355\357\334\214\255\232\270\221\332\373\264\253\323\264\352\225\241\302\355\310\326\236\337\230\231\305\274\242\332\366\276\365\265\247\233\257\347\201\236\373\337\230\325\357\300\246\222\336\223\203\231\362\316\310\322\345\206\234\332\262\353\210\204\252\333\324\313\236\250\370\314\336\266\246\302\345\262\216\244\222\252\316\241\323\223\271\324\211\211\273\307\302\332\206\212\214\354\255\274\377\337\356\375\273\277\234\341\342\267\272\203\207\267\256\312\206\267\215\244\261\375\241\341\271\225\370\235\273\237\222\250\200\361\301\222\233\347\322\224\360\270\231\227\267\374\276\263\334\354\211\370\326\217\336\376\365\353\341\301\336\351\323\324\343\274\340\241\212\215\336\250\327\362\202\336\231\353\264\304\353\323\276\340\307\262\315\323\231\361\330\226\230\232\223\377\354\345\310\235\342\302\215\357\253\361\350\271\300\362\243\254\373\377\372\216\306\226\206\300\275\267\260\206\310\336\256\352\375\343\324\274\340\344\373\347\350\271\272\357\312\270\303\247\343\257\356\225\330\263\261\363\352\263\316\261\312\235\267\217\271\253\220\335\217\327\260\317\245\323\260\221") -TOPIC_TEXT( -"\272\261\236\261\300\343\212\320\206\261\353\236\304\243\223\254\330\241\310\246\250\346\221\273\210\323\271\223\221\371\346\234\354\312\346\223\213\261\341\246\367\263\370\306\317\330\361\270\340\271\211\254\203\245\362\256\263\375\333\373\356\215\215\201\201\314\366\335\243\315\240\347\323\275\353\265\356\236\310\375\335\327\360\203\203\362\265\211\275\261\353\202\307\370\272\355\220\326\332\257\207\203\205\203\323\262\334\344\367\340\336\353\375\375\237\277\375\315\257\360\226\314\274\347\252\240\362\344\310\315\272\215\217\223\225\374\264\332\375\212\315\253\326\230\213\375\271\307\332\303\365\315\335\345\240\256\241\335\250\274\246\363\321\205\272\245\264\332\312\263\333\260\251\327\222\276\215\341\202\206\267\303\264\361\242\361\261\355\207\251\302\266\270\300\241\320\304\254\341\367\331\325\350\214\261\323\272\225\326\255\277\202\362\330\371\256\371\327\205\340\200\316\316\317\204\370\214\334\221\252\334\206\247\253\351\201\376\231\240\247\315\224\317\364\331\251\272\377\357\236\213\270\313\324\325\217\327\222\211\364\303\346\232\367\251\231\322\306\227\343\232\212\215\245\201\254\330\251\363\331\357\220\271\345\337\346\272\375\316\205\302\215\214\271\375\374\346\300\207\312\306\337\216\376\275\270\205\331\241\225\301\202\203\362\212\225\210\245\223\230\351\256\274\223\203\323\261\223\360\304\261\310\271\204\257\267\374\222\205\240\304\334\345\352\271\351\377\211\313\323\360\270\242\303\273\311\315\350\227\320\330\344\373\317\251\233\373\331\332\204\264\347\306\216\265\365\225\235\257\211\275\343\261\255\216\246\356\253\203\374\344\317\237\326\233\274\252\315\277\267") -TOPIC_TEXT( -"\260\226\353\217\234\330\214\335\317\342\342\250\315\334\315\221\262\342\257\267\314\213\312\266\321\361\240\226\370\214\276\367\230\301\352\313\202\221\237\317\342\253\232\227\347\212\340\261\227\243\342\263\326\317\203\362\374\213\265\235\342\375\216\360\270\322\202\324\321\355\316\216\322\355\345\305\326\251\241\225\321\231\344\221\320\264\374\375\341\205\316\227\306\307\307\331\235\211\207\341\306\356\303\211\362\331\344\357\204\345\351\300\246\241\360\330\205\343\221\235\223\361\274\353\353\250\376\366\335\233\276\262\303\310\360\300\371\263\205\311\215\365\365\337\277\363\251\362\304\220\243\327\211\242\226\217\343\331\352\373\214\355\233\354\270\325\305\226\201\206\205\362\313\275\271\234\201\257\317\265\347\370\312\200\330\315\305\315\350\214\205\363\373\343\271\300\322\335\327\332\324\362\275\322\315\215\365\202\307\352\335\326\372\376\221\262\237\336\207\234\225\314\273\232\213\313\344\314\204\232\235\372\260\224\337\235\212\275\340\261\223\216\212\262\265\257\235\207\212\240\233\263\274\335\322\222\354\332\231\233\335\256\305\214\327\351\215\212\335\211\334\255\257\273\310\371\251\333\363\244\203\217\250\325\227\216\247\215\321\372\316\254\304\353\262\277\374\203\324\310\326\227\316\257\260\300\271\343\312\221\356\320\212\356\310\363\212\253\265\314\330\262\201\330\307\354\232\243\353\353\341\253\306\272\357\217\355\303\215\206\331\364\226\365\266\245\277\376\242\274\271\254\253\325\255\371\233\220\235\224\236\213\272\301\266\277\201\212\333\333\264\256\203\214\217\356\335\227\331\260\361\345\211\266\342\227\305\247\225\320\221\370\334\366\265\375\254\270\310\305") -TOPIC_TEXT( -"\271\341\272\277\226\202\246\346\363\240\253\300\342\271\244\201\301\226\314\361\256\300\303\322\316\372\343\303\235\333\331\257\317\212\373\307\211\352\351\356\224\214\344\272\363\321\344\336\301\262\272\323\261\307\353\261\255\350\354\232\375\320\223\373\356\315\330\365\222\327\341\346\277\212\257\215\237\313\341\364\333\330\222\364\231\311\343\264\326\313\203\332\266\260\377\271\236\275\253\207\206\242\371\224\230\270\313\221\214\215\354\374\265\321\357\367\306\342\340\277\260\270\276\311\322\206\214\211\246\251\335\333\232\270\247\372\236\263\361\265\361\264\246\317\216\321\227\377\344\376\370\352\206\211\317\360\270\202\344\344\343\331\241\340\372\356\344\336\212\352\274\245\224\301\306\214\266\330\211\210\372\312\223\230\250\237\251\345\351\300\316\326\340\341\343\202\361\354\370\354\250\277\252\247\360\300\256\246\321\336\250\327\315\241\311\350\272\325\354\333\361\266\302\322\315\335\267\303\371\347\355\243\307\362\331\266\313\335\356\274\371\376\323\314\351\303\207\366\311\332\335\212\355\333\266\251\356\272\324\254\376\252\356\245\212\214\332\271\361\330\230\345\273\301\311\311\254\232\350\223\345\205\203\307\313\303\235\264\235\277\367\333\372\303\304\226\345\267\221\334\224\233\311\272\212\203\336\350\207\236\347\363\324\371\203\304\235\325\264\306\315\376\232\205\342\252\251\230\227\343\253\327\243\263\277\311\273\306\327\277\222\374\325\262\352\250\315\302\304\232\262\273\337\305\316\226\201\304\262\346\340\366\243\354\364\304\326\327\373\332\362\355\215\332\276\257\262\360\263\330\253\237\313\365\312\313\333\216\353\215\256\345\304\234\345\206\342\214\310\341") -TOPIC_TEXT( -"\276\205\373\371\212\357\253\375\257\342\232\231\220\355\325\327\375\235\354\340\374\346\344\211\332\215\230\345\244\320\245\253\367\370\301\254\344\221\347\245\220\251\351\330\226\227\361\237\321\244\205\343\211\256\246\374\240\310\323\263\210\266\263\266\301\215\376\235\267\312\370\262\200\323\326\361\253\257\303\312\311\343\346\206\377\247\217\366\250\326\272\343\353\242\225\233\302\302\306\325\337\370\325\261\240\343\372\224\224\235\214\263\305\343\243\225\346\343\322\215\204\325\351\341\212\251\246\342\273\375\377\221\355\257\356\227\253\275\232\211\227\206\344\316\327\347\374\246\377\304\200\301\310\364\246\257\342\321\363\251\317\344\265\302\263\230\234\250\214\251\366\220\371\234\232\262\317\272\303\237\321\253\365\276\222\226\327\235\301\253\304\352\275\302\361\374\332\331\370\234\250\226\242\336\233\374\224\220\262\367\376\255\305\246\223\245\367\234\342\375\230\203\225\326\237\357\273\337\333\372\345\255\222\231\305\220\223\246\215\231\340\254\245\216\204\252\350\325\215\317\374\205\221\327\345\201\305\360\350\272\346\365\306\303\274\271\302\373\230\244\314\253\261\332\203\371\234\375\260\212\253\360\342\216\316\210\230\230\357\274\372\253\367\322\345\244\367\355\307\371\344\316\360\377\252\277\253\320\364\235\333\205\253\240\370\336\306\302\203\301\311\376\277\361\257\360\212\307\263\343\314\240\275\360\336\332\355\315\354\312\373\275\323\377\314\256\320\362\307\332\313\361\201\260\230\253\210\266\211\257\366\263\215\260\256\263\313\232\354\210\262\231\274\315\223\361\265\237\366\340\265\367\226\322\266\356\275\330\310\322\225\342\366\307\313\361\371\351\361\300") -TOPIC_TEXT( -"\316\205\303\361\312\242\216\341\375\332\200\353\351\306\366\342\202\344\301\276\312\324\234\236\353\241\211\315\233\323\201\237\362\240\330\377\352\352\342\366\273\357\342\354\305\263\364\241\362\346\332\373\333\377\216\257\245\330\361\250\352\300\346\236\267\230\235\227\254\364\201\374\247\274\367\274\300\207\225\375\372\217\253\226\231\330\353\236\257\204\272\206\316\271\274\256\304\202\221\250\217\214\215\206\206\272\376\377\375\376\337\333\246\255\335\220\364\364\326\277\331\351\305\204\254\376\225\227\206\216\367\343\314\226\235\214\263\302\362\343\272\212\274\336\361\272\235\227\377\232\355\245\270\273\273\365\327\340\343\350\314\357\244\362\336\247\232\333\367\334\246\216\205\363\244\311\205\265\350\333\305\354\374\334\212\220\377\355\354\330\354\240\361\270\222\343\313\303\235\304\343\346\273\371\310\215\217\311\250\354\230\204\362\366\246\312\331\201\242\236\363\240\324\372\313\223\335\310\357\342\343\214\335\272\370\320\356\267\332\221\303\207\247\360\364\344\263\224\343\245\235\330\355\332\215\351\350\221\253\304\350\325\264\300\214\376\307\260\227\346\240\276\220\275\274\370\224\344\223\223\255\254\333\302\336\306\356\336\326\323\356\326\250\345\244\331\311\324\202\351\331\252\360\302\226\203\326\262\306\313\216\306\331\340\325\261\245\320\254\243\274\325\231\266\263\225\217\234\200\233\223\317\317\346\266\234\306\243\303\323\222\211\331\337\311\332\314\317\370\335\257\364\244\266\310\253\216\242\263\341\277\345\277\331\224\272\335\350\267\214\373\331\345\355\266\346\306\261\243\336\244\270\312\374\233\240\250\230\303\230\251\270\353\361\256\242\327\264\215\325") -TOPIC_TEXT( -"\251\215\340\322\320\257\320\211\304\340\326\364\276\360\246\322\206\256\314\234\212\232\213\201\231\302\210\310\211\214\310\200\343\320\276\361\335\301\203\314\360\226\205\340\361\205\212\227\236\256\347\271\262\357\306\326\242\237\246\260\250\330\313\273\234\347\372\316\266\362\375\301\306\266\304\344\351\274\257\317\236\343\224\353\257\313\311\207\206\272\342\355\223\236\273\235\242\262\257\377\221\234\325\265\332\254\212\370\354\223\367\343\257\370\332\314\257\343\232\216\371\275\236\311\303\236\347\345\367\357\370\341\354\372\342\225\331\251\315\277\366\237\215\264\233\231\223\235\222\252\277\230\302\202\303\347\247\352\207\346\236\343\301\344\242\246\236\257\216\376\361\203\355\316\343\256\207\254\257\213\371\327\335\364\364\317\230\356\371\331\315\306\354\335\370\326\225\267\361\240\247\211\344\351\275\250\344\334\236\371\253\272\267\274\324\321\211\370\222\354\373\317\267\254\360\250\350\202\263\362\240\274\205\347\225\227\255\231\200\217\363\370\317\232\227\330\200\214\244\356\203\272\326\206\274\316\204\236\255\310\225\253\212\363\253\340\313\347\251\367\353\204\332\351\240\343\315\375\225\207\212\350\242\201\332\273\357\264\324\377\347\205\373\213\371\351\360\332\270\333\323\323\243\246\255\360\303\307\343\304\245\273\241\317\316\305\307\310\306\227\206\216\310\247\252\212\217\327\317\355\200\362\312\364\334\250\274\366\260\251\246\342\353\210\326\356\264\226\265\257\343\252\306\307\215\244\327\214\300\232\236\263\354\361\261\301\230\267\221\344\274\377\373\236\256\215\216\231\213\351\334\227\356\333\207\203\241\343\215\302\334\251\236\355\223\375\341\332\355\215") -TOPIC_TEXT( -"\346\351\201\367\241\236\373\351\360\252\273\256\221\251\266\320\376\204\345\257\214\201\362\223\236\200\362\256\301\320\214\314\311\252\247\327\273\364\206\344\350\322\317\303\271\276\356\344\363\355\313\305\200\254\276\341\224\263\314\207\300\370\247\222\236\305\336\214\261\230\202\343\223\364\311\321\224\333\225\322\274\232\260\361\237\331\265\266\225\350\250\264\226\341\317\243\323\367\374\206\373\332\367\355\371\204\364\351\253\246\247\337\334\277\310\347\317\307\333\325\205\217\232\263\234\270\375\314\256\305\372\237\334\337\200\354\347\327\336\376\265\314\234\372\332\222\342\374\365\352\350\336\242\242\221\234\253\236\266\324\262\250\345\257\230\207\345\341\376\262\375\231\362\355\225\354\312\355\233\245\303\200\325\346\264\274\272\361\207\244\234\374\244\347\333\205\342\370\254\335\262\230\273\307\255\251\216\215\244\362\242\337\230\331\254\264\217\216\307\334\263\313\303\235\253\355\231\365\270\246\364\235\220\260\332\316\276\304\314\332\264\362\212\276\304\343\217\255\317\300\323\203\326\203\322\271\257\351\215\225\250\361\324\205\334\261\255\374\334\274\361\313\277\263\300\352\254\300\326\213\342\317\320\275\372\320\344\225\262\345\217\334\331\323\254\240\320\262\316\217\344\331\360\230\215\310\364\234\351\357\233\372\256\255\342\305\210\327\362\344\341\253\374\270\327\343\364\251\220\354\256\364\226\371\372\220\240\362\337\361\344\376\202\346\207\261\335\203\270\207\314\363\225\347\206\351\254\211\271\253\240\251\372\247\335\372\345\255\343\207\272\377\247\332\217\265\232\240\221\266\207\241\265\276\224\335\362\373\264\242\350\361\354\331\237\323\325\207\313\353") -TOPIC_TEXT( -"\346\336\271\212\312\305\324\307\217\237\261\351\337\227\243\222\331\236\371\323\313\300\310\341\271\320\327\205\201\343\315\267\316\361\340\232\250\273\230\373\307\343\350\207\275\315\266\325\244\335\307\345\375\362\206\230\203\217\314\243\367\267\311\224\322\256\377\223\233\261\255\263\204\224\231\207\316\265\252\204\333\207\301\357\210\221\237\330\332\302\303\215\324\265\226\356\310\271\222\330\230\307\200\334\313\275\237\336\361\272\212\304\224\246\201\256\264\237\323\223\252\362\312\204\373\303\227\351\237\342\227\261\307\226\244\300\343\333\314\205\346\344\302\312\273\230\353\232\325\321\275\275\245\323\236\307\235\207\360\311\234\315\263\305\260\235\221\336\260\376\254\241\275\261\202\212\261\343\345\204\223\231\271\312\345\303\344\344\272\323\354\336\251\254\332\241\300\316\212\316\316\326\323\324\324\254\304\222\206\344\277\367\336\333\332\337\327\325\203\214\263\243\345\371\271\336\263\367\305\327\375\335\327\343\277\221\360\311\272\272\203\373\347\367\265\267\334\256\370\346\302\204\225\363\216\335\214\244\346\211\207\364\330\323\237\337\222\216\346\334\364\254\265\324\366\237\217\205\371\233\347\260\336\373\225\225\236\302\311\270\331\324\265\274\326\322\326\320\346\372\254\225\205\321\245\262\343\361\223\247\353\240\212\236\301\236\236\264\216\273\366\354\210\330\334\334\304\327\222\262\332\355\302\253\313\311\251\315\357\346\200\221\225\207\367\324\237\257\367\357\315\343\363\374\236\374\274\266\266\226\213\352\267\226\344\345\304\334\321\250\333\235\267\360\313\227\235\214\243\275\343\261\304\240\364\330\352\251\217\325\233\301\206\336\344\217\210\370\361\372") -TOPIC_TEXT( -"\342\373\316\313\361\314\261\236\322\323\342\331\223\270\310\340\273\261\351\221\343\256\256\221\352\216\253\241\301\307\243\241\267\225\231\301\233\300\233\374\272\273\355\266\364\352\337\276\372\350\242\377\326\310\330\214\305\300\233\342\207\215\265\313\303\235\213\262\270\274\342\361\335\351\332\227\255\217\361\330\243\335\224\205\231\336\334\216\214\256\266\236\217\321\242\201\212\255\373\215\231\311\263\354\315\227\200\276\375\316\224\352\325\245\340\325\203\324\254\327\331\333\352\351\273\252\245\227\352\277\244\344\325\254\301\214\310\335\330\235\333\276\337\277\267\237\341\355\262\331\226\355\365\240\210\323\366\325\343\323\275\320\260\270\224\323\223\267\353\216\260\236\204\233\337\271\324\310\214\313\362\361\304\310\306\250\267\350\262\311\331\311\260\257\245\363\354\372\212\240\303\363\232\241\200\361\335\365\317\377\335\327\366\350\273\341\234\337\245\260\252\335\350\314\241\215\330\241\236\217\366\264\377\270\204\363\253\361\230\267\365\323\276\343\275\212\307\222\375\370\224\376\366\314\332\237\324\236\233\350\264\233\203\212\337\372\355\351\245\340\361\353\257\275\327\366\342\213\257\202\311\236\300\275\373\252\246\342\216\204\231\347\244\236\233\264\334\343\230\216\230\201\372\252\370\254\370\203\226\377\264\372\340\351\235\323\247\362\365\341\312\242\257\333\223\356\362\253\335\343\375\312\316\305\331\342\361\332\334\247\333\300\204\240\301\357\337\307\301\326\306\353\244\323\311\305\242\331\274\243\236\321\205\303\275\304\337\302\205\343\323\265\244\335\302\261\263\247\210\306\254\265\370\354\367\314\376\306\244\321\220\365\340\237\252\262\317\263\365\344") -TOPIC_TEXT( -"\373\353\327\217\216\276\317\353\261\336\234\221\226\372\333\265\353\333\272\333\217\232\353\307\211\276\325\304\343\325\341\333\335\201\375\231\264\343\221\304\263\233\303\362\325\203\250\377\225\326\257\375\354\376\275\371\254\355\374\271\221\317\341\327\214\362\330\356\361\365\221\260\256\317\221\243\352\265\255\245\200\263\207\307\232\372\274\336\313\342\274\300\346\250\273\352\201\314\343\334\225\267\202\215\376\205\356\370\311\237\304\340\316\343\307\362\227\351\323\201\266\246\206\207\262\270\242\227\325\374\312\225\305\236\322\246\337\244\306\276\202\252\224\316\245\256\307\245\374\253\244\227\326\337\363\364\235\206\225\203\215\351\304\361\372\272\367\235\332\304\310\343\341\367\216\312\324\213\313\321\230\312\226\350\261\323\362\326\270\344\365\263\312\272\246\222\216\200\332\301\266\300\234\342\232\215\211\312\204\335\372\314\307\270\232\213\236\236\332\236\362\260\315\305\350\341\257\235\360\230\237\230\304\212\305\215\317\256\204\277\231\246\257\345\331\343\337\234\237\231\324\270\361\343\263\247\263\213\336\233\374\363\363\335\252\235\207\342\272\365\277\236\257\217\212\365\220\225\275\247\366\333\257\247\231\253\311\300\271\314\317\263\305\243\347\242\367\267\273\201\220\331\302\303\326\312\310\254\223\323\361\367\212\342\320\312\204\337\362\212\231\224\314\227\217\217\250\213\352\353\242\311\244\375\252\242\263\323\214\342\232\342\332\244\255\233\277\355\303\370\327\364\350\320\324\327\242\217\217\365\311\232\244\320\274\242\271\321\356\334\342\237\342\361\242\233\377\212\264\252\350\202\312\243\252\361\271\272\330\375\270\254\232\232\355\326\236\255\270\300") -TOPIC_TEXT( -"\362\303\317\225\304\323\247\317\260\277\210\323\323\211\350\225\347\266\241\303\264\273\350\363\262\301\377\346\240\273\311\255\227\254\261\207\256\363\262\275\322\255\312\310\252\230\246\307\344\315\323\370\277\360\357\326\375\361\331\225\370\240\357\370\370\257\367\304\273\221\376\205\207\325\256\344\313\202\312\271\354\236\226\210\231\236\225\370\224\327\253\344\222\211\367\227\200\237\306\377\220\264\234\370\251\273\244\210\347\371\360\343\217\377\200\356\215\371\276\312\226\257\223\321\340\344\207\347\201\252\341\343\253\270\352\256\352\330\300\345\323\235\306\343\221\256\207\347\313\235\267\333\256\265\311\234\271\371\202\267\262\364\307\341\316\255\366\370\234\232\245\237\231\215\307\246\255\376\227\310\322\275\342\230\356\222\261\233\267\357\346\273\255\266\365\343\340\346\323\346\360\302\204\213\257\250\355\373\274\272\252\351\305\343\256\204\237\334\334\212\277\275\362\312\253\230\213\216\211\230\307\224\222\270\310\332\376\257\377\221\324\214\252\363\312\263\333\364\353\224\206\244\234\214\273\232\347\323\370\303\323\366\313\226\227\220\272\263\342\261\340\220\236\225\376\271\206\346\201\215\315\342\277\316\366\245\237\225\273\246\311\221\362\302\376\376\354\316\223\261\261\325\327\242\272\241\274\277\317\346\266\230\366\231\363\276\366\203\374\345\315\230\267\261\342\236\230\375\356\335\372\274\312\277\213\327\201\225\265\366\372\220\263\250\233\277\271\321\371\203\237\202\326\334\327\234\353\307\247\256\360\234\230\345\366\215\360\316\325\233\354\355\377\342\261\367\220\253\352\216\344\253\331\321\255\364\275\347\265\273\347\304\324\300\240\253\201\303\266\350") -TOPIC_TEXT( -"\343\245\357\227\322\266\374\350\365\201\302\341\232\224\260\274\371\262\316\246\323\237\257\260\235\367\211\301\266\326\254\220\244\344\211\316\214\244\306\224\232\253\263\320\336\362\253\370\344\232\237\350\352\306\211\334\261\332\334\277\324\220\256\232\347\245\202\252\264\255\364\335\206\204\263\252\367\240\246\342\301\241\376\236\316\255\335\203\333\266\340\355\343\221\275\234\341\350\240\354\251\216\305\373\313\345\234\372\235\227\306\200\354\253\346\366\334\210\253\310\245\244\344\345\250\215\360\250\274\367\232\301\224\306\317\375\230\343\216\341\302\222\210\206\344\240\361\223\314\351\215\331\327\347\363\305\333\237\316\267\257\376\306\327\236\302\277\232\233\275\244\225\232\350\274\376\370\367\344\255\315\277\244\236\357\372\206\350\347\251\343\307\325\266\342\336\230\367\374\212\253\227\307\275\212\307\350\241\325\273\364\204\315\301\277\376\361\217\243\201\307\354\302\237\256\244\254\342\363\343\356\370\314\325\206\341\376\227\336\372\211\243\307\202\326\374\225\243\231\377\310\240\316\267\337\372\250\261\272\241\263\213\300\312\245\350\351\331\222\276\310\337\341\216\265\307\314\351\306\357\202\234\210\317\375\272\203\304\350\350\232\240\341\234\257\207\326\256\257\231\312\330\364\300\366\322\234\242\304\365\262\320\376\312\232\326\276\263\361\330\375\301\234\365\212\364\260\241\326\202\265\356\260\262\274\324\261\356\207\235\226\335\326\363\276\263\360\354\207\215\221\336\323\265\257\303\373\371\371\356\234\350\356\264\340\376\304\343\357\217\273\222\312\375\350\260\234\220\353\221\265\344\324\332\271\207\242\213\222\260\215\264\206\277\240\266\207\332\217\260") -TOPIC_TEXT( -"\221\221\204\237\234\304\203\315\353\252\311\325\231\326\226\227\223\246\330\355\231\337\261\236\315\233\342\266\211\257\234\210\331\352\300\213\347\335\211\300\335\335\266\220\307\261\254\346\244\267\201\235\360\370\305\237\363\367\342\311\356\216\246\303\203\254\303\276\320\307\216\237\342\272\371\324\303\207\336\276\332\342\370\251\310\244\337\275\212\204\341\353\216\236\224\203\362\231\361\223\247\212\236\243\227\255\345\350\261\302\303\344\365\301\310\340\271\214\376\352\375\343\335\250\276\371\315\331\330\323\345\340\344\207\346\300\326\200\312\231\322\272\342\351\346\254\270\276\257\364\326\313\323\352\207\202\340\205\327\263\235\273\365\345\275\326\362\335\320\271\325\202\250\313\201\255\267\232\366\337\303\264\236\357\330\261\312\203\240\213\304\345\313\233\362\332\363\372\274\346\240\341\253\261\221\206\343\354\361\330\364\212\306\213\356\337\275\221\322\260\233\265\247\343\260\357\304\315\277\343\261\223\326\244\257\354\306\316\325\214\335\216\256\213\330\265\363\325\300\352\230\222\331\235\346\241\323\304\351\312\266\273\375\213\340\261\353\232\341\255\243\203\263\325\340\203\271\274\361\247\225\361\374\270\346\343\213\250\331\237\345\223\243\263\343\352\365\347\264\373\227\217\352\213\330\326\362\277\241\323\242\307\231\207\254\334\363\233\241\350\344\361\246\271\316\332\261\257\361\335\217\231\325\323\241\272\236\245\243\252\353\313\321\325\271\336\330\226\353\353\253\270\232\321\365\272\212\251\342\204\255\253\350\341\232\370\305\343\215\346\204\345\272\266\341\376\360\257\343\246\320\263\315\314\304\313\251\211\270\255\303\252\372\342\242\355\264\335\350\263") -TOPIC_TEXT( -"\313\274\307\370\224\255\350\233\265\322\340\326\350\314\244\343\323\224\252\335\305\370\354\305\375\375\304\335\214\352\231\215\355\331\207\376\356\273\245\263\240\337\200\352\270\207\260\316\346\370\260\253\267\233\353\242\323\265\222\220\221\346\366\346\330\226\331\262\342\320\266\232\376\271\325\312\350\231\321\250\345\337\304\215\367\251\226\305\333\261\204\310\204\305\356\224\277\203\212\377\316\347\352\372\337\252\326\355\305\241\203\373\306\207\236\377\206\273\230\335\300\236\371\361\330\263\373\260\357\357\230\225\363\300\233\211\366\322\361\354\233\240\333\264\231\230\324\250\370\274\230\273\213\241\211\225\246\236\243\215\357\326\330\206\333\274\346\243\201\353\253\221\210\277\367\277\330\232\265\252\327\317\351\373\235\213\210\211\327\266\306\364\236\226\262\277\343\261\213\300\331\326\240\203\361\227\257\340\300\347\345\322\342\314\250\271\263\262\217\263\346\226\220\310\333\356\353\237\233\341\347\216\332\346\233\257\260\365\314\260\201\335\305\231\376\355\207\316\325\241\236\265\341\337\321\255\232\340\233\274\322\336\257\256\323\365\364\236\366\262\272\222\265\344\302\254\323\326\314\235\356\354\352\341\264\265\332\250\214\373\362\223\217\223\233\325\277\242\276\264\204\314\236\337\212\353\373\317\331\231\307\226\360\311\265\223\265\265\357\216\356\347\354\264\254\263\375\344\303\213\325\221\315\233\266\201\362\321\300\332\342\204\323\260\256\316\322\357\264\236\223\241\201\306\276\354\250\311\306\332\314\354\317\215\361\225\255\264\376\345\352\327\331\250\240\332\276\342\302\323\272\202\223\233\236\217\240\241\320\261\213\212\234\275\245\375\326\236\251\254") -TOPIC_TEXT( -"\274\350\360\362\254\204\260\336\267\373\327\223\241\376\236\261\244\227\225\375\240\344\240\246\212\244\342\375\241\261\227\247\215\212\362\366\221\342\262\226\262\357\373\206\273\356\337\275\341\216\257\307\320\370\314\300\265\232\301\215\251\334\357\323\223\267\266\211\300\273\276\332\311\333\272\230\237\230\367\210\307\332\355\323\367\377\336\274\220\225\315\226\207\264\250\350\247\245\323\311\345\224\264\233\342\240\315\340\242\364\246\300\223\275\300\331\231\260\203\347\223\333\371\210\370\331\220\275\271\332\362\307\253\217\334\376\235\306\343\306\347\356\236\316\270\262\276\261\304\277\343\207\302\371\360\256\370\314\227\334\334\354\321\306\324\222\214\350\373\334\213\362\262\204\312\311\206\266\263\355\344\202\361\231\277\202\277\237\234\356\356\256\254\311\217\242\366\222\346\350\372\364\311\230\314\356\335\245\210\333\324\332\236\352\220\243\361\262\304\336\366\372\357\332\341\206\376\316\305\370\264\266\226\354\247\270\347\221\204\203\343\272\323\327\374\253\200\314\364\272\345\310\226\217\313\326\260\306\362\273\364\326\331\206\267\354\325\342\215\323\225\205\250\361\373\211\365\242\247\347\254\307\354\323\334\312\322\305\224\212\255\307\230\247\355\327\232\307\225\332\234\330\215\247\232\226\271\370\223\241\226\277\312\232\360\244\301\275\275\337\200\276\375\340\336\264\261\326\231\305\222\330\201\371\260\221\255\271\361\232\364\341\357\256\207\266\250\345\314\344\250\210\223\213\376\325\353\323\323\273\372\373\311\272\330\304\217\361\275\227\364\232\263\333\207\362\321\310\221\360\200\244\236\310\262\322\325\351\342\226\214\272\341\240\253\365\256\320\303\262") -TOPIC_TEXT( -"\376\205\235\236\273\376\337\355\213\203\315\307\335\330\370\364\357\355\272\327\337\335\256\216\364\224\247\266\222\234\225\224\336\360\303\231\202\246\237\274\316\230\255\301\232\232\337\232\332\341\255\325\265\216\203\304\325\261\311\321\361\216\203\226\237\255\224\311\373\375\221\227\343\333\324\377\343\212\336\307\270\335\254\345\347\343\214\370\234\325\264\246\267\353\205\234\312\357\330\306\203\362\347\253\264\347\354\272\335\347\200\333\263\306\366\364\312\367\270\305\306\261\235\221\244\345\232\325\275\354\271\253\313\277\237\255\357\215\273\326\217\316\342\367\304\211\215\272\237\343\253\365\251\334\372\313\342\323\375\264\346\325\200\207\275\315\352\326\212\353\365\347\273\323\234\331\372\373\314\321\254\243\206\317\333\377\302\212\222\363\326\370\334\312\331\202\265\233\320\277\302\304\307\267\233\314\363\252\225\205\310\344\300\323\343\275\205\231\214\265\267\262\323\251\206\211\201\263\221\333\333\333\325\375\330\356\313\323\272\210\222\347\212\212\301\321\232\371\215\357\354\370\314\223\257\344\230\307\356\277\345\237\225\271\325\305\353\265\231\205\217\201\303\234\245\310\375\240\205\203\273\244\251\246\346\372\323\311\370\311\315\242\300\211\335\252\335\347\203\316\236\346\342\250\274\344\253\201\312\367\206\363\312\265\247\224\215\304\356\334\321\206\214\344\227\211\327\267\355\235\205\364\352\256\210\340\346\371\326\205\277\245\364\323\244\325\233\204\255\272\323\365\365\265\367\245\247\260\225\376\340\344\244\330\210\350\233\232\350\354\263\271\324\200\274\246\343\361\246\327\307\226\303\207\366\351\354\370\234\235\261\357\342\354\202\217\321\322\364\345") -TOPIC_TEXT( -"\371\221\270\355\243\244\217\252\225\207\357\367\360\365\341\312\202\323\250\325\273\217\306\271\321\326\214\330\225\227\302\232\260\247\277\307\335\237\200\326\350\313\236\226\214\306\336\272\220\251\363\377\213\317\252\203\270\340\312\361\266\345\362\222\316\350\272\233\351\315\326\236\243\277\354\260\306\322\270\353\273\340\247\314\344\217\242\367\267\211\243\323\246\212\374\264\377\321\206\254\264\337\352\366\316\210\366\236\337\376\250\265\362\241\374\367\241\314\234\332\342\250\247\216\367\200\341\211\301\373\362\364\364\375\247\333\270\265\201\351\363\367\245\365\341\343\213\367\343\354\305\343\372\201\220\311\306\356\334\207\356\345\343\323\363\326\326\206\341\252\217\314\360\226\321\252\256\341\375\274\265\351\201\247\206\310\371\252\331\367\265\257\222\347\323\201\216\226\323\323\263\374\303\252\236\342\264\270\334\212\223\247\236\277\231\351\334\220\305\352\354\245\271\240\214\315\327\243\315\226\331\200\260\302\361\376\265\232\365\311\261\330\220\253\253\236\263\337\246\263\336\313\320\264\233\264\236\233\263\274\315\356\276\314\303\225\304\262\311\205\266\263\327\202\271\255\360\363\364\304\240\267\216\205\277\362\370\343\204\307\360\206\223\325\274\256\356\307\315\250\367\355\376\370\227\243\354\373\206\372\266\374\360\301\334\357\313\340\204\254\232\220\251\257\334\352\204\306\206\263\224\227\370\252\304\321\215\203\204\257\342\264\255\213\260\323\275\215\235\267\374\306\314\314\257\354\346\261\232\371\271\344\270\265\240\203\253\252\333\350\220\314\261\377\243\321\227\370\276\374\251\341\334\257\266\357\324\247\236\267\264\375\362\377\315\236\275\230\230\273") -TOPIC_TEXT( -"\236\227\376\333\332\213\217\244\266\266\371\346\360\323\205\223\236\221\217\246\374\200\307\271\370\235\244\273\212\204\214\252\246\313\274\260\271\326\201\220\247\247\355\276\257\325\245\323\350\333\255\367\206\215\317\346\247\366\212\314\346\327\213\210\244\375\275\217\351\243\246\256\375\340\262\361\360\237\260\222\374\314\345\257\212\363\350\306\343\204\365\222\260\312\366\267\265\334\371\305\316\220\305\274\353\271\274\235\347\355\230\213\225\322\340\205\217\216\271\324\250\361\322\242\374\251\334\220\322\272\364\267\343\375\257\277\265\377\260\205\274\216\316\347\227\370\234\254\375\375\354\326\227\367\250\254\231\200\201\332\242\340\311\325\353\327\373\352\373\212\314\271\310\370\260\200\347\211\245\361\230\242\205\233\333\245\217\202\262\262\222\341\222\273\215\330\325\246\250\356\351\264\271\352\342\212\200\226\236\351\345\222\373\215\207\220\313\362\234\230\222\255\271\224\266\263\242\335\335\260\247\255\303\274\262\216\262\240\266\315\367\205\342\256\302\214\305\306\200\307\223\353\305\252\241\364\340\274\207\376\305\333\307\216\237\252\331\301\306\317\326\325\315\216\315\205\200\306\373\366\377\322\256\365\255\255\354\207\241\344\240\242\260\323\344\346\277\221\232\235\243\343\312\276\233\256\326\322\223\271\201\214\267\202\203\321\230\202\233\217\216\217\346\211\375\252\265\301\360\206\216\373\376\314\351\370\344\362\300\376\366\214\324\254\305\245\266\355\327\343\317\263\325\334\362\364\314\232\345\211\367\265\375\214\320\212\327\317\262\203\360\361\306\274\316\314\216\211\370\321\253\341\227\357\324\335\260\356\306\311\366\342\347\311\205\211\211\311\226\302") -TOPIC_TEXT( -"\246\367\344\315\317\274\262\273\365\327\314\314\272\361\334\334\374\373\355\243\347\217\357\361\307\230\320\374\325\255\242\360\350\365\230\301\264\342\262\315\350\355\316\222\302\201\323\330\363\333\253\367\222\333\231\270\301\375\215\270\277\336\317\310\303\211\232\266\304\251\220\232\262\306\346\272\272\307\326\362\341\331\327\336\260\264\212\346\374\234\201\265\343\316\246\201\351\200\372\233\304\215\236\356\227\264\354\250\226\317\214\354\275\343\371\324\352\202\302\314\325\335\322\352\341\354\332\371\337\360\226\330\222\336\210\331\352\305\303\210\264\362\302\306\272\345\310\202\377\265\326\347\340\220\227\225\250\331\233\260\240\201\302\222\263\261\227\204\303\217\236\313\214\307\270\213\265\307\253\265\247\317\237\350\205\302\237\324\301\352\325\306\241\331\202\314\304\334\241\366\336\333\236\226\213\320\252\354\276\350\323\311\337\354\367\200\307\246\377\272\257\314\254\324\331\321\303\366\336\373\311\247\344\350\273\303\235\333\213\235\347\255\304\226\211\343\321\376\360\357\234\276\332\217\253\303\203\271\224\267\261\303\347\331\367\303\200\223\236\300\276\217\233\341\277\342\257\323\275\265\207\233\204\373\374\356\215\322\250\311\220\241\351\333\274\306\310\377\376\337\227\367\265\371\263\365\252\323\235\253\272\306\233\261\317\305\232\374\326\252\367\363\305\262\317\360\330\373\310\311\307\270\226\357\224\277\351\225\236\331\222\221\214\353\241\231\301\204\311\274\336\347\220\276\203\361\227\262\203\221\272\231\320\264\227\275\247\225\301\346\300\243\341\372\331\260\270\210\336\201\362\206\211\210\264\304\374\201\241\210\270\367\357\305\223\310\215\340\370\214") -TOPIC_TEXT( -"\247\323\275\303\365\276\212\365\223\354\316\327\332\353\327\352\353\236\234\354\377\355\331\326\237\276\371\350\351\242\306\203\250\371\354\314\247\363\340\257\270\304\214\300\261\240\217\206\306\246\252\213\362\362\226\363\300\343\210\346\326\341\357\263\355\361\370\314\221\300\353\231\221\251\301\240\330\321\245\267\340\265\266\232\220\325\377\252\266\266\214\326\274\226\372\301\332\221\202\242\346\322\340\271\241\243\261\235\247\207\337\351\307\353\226\315\373\200\363\252\345\357\251\240\371\326\362\266\250\257\272\312\245\277\365\254\326\301\337\307\263\324\304\245\250\275\321\327\260\305\374\325\370\327\233\244\246\277\270\307\314\356\352\266\236\351\212\257\234\274\313\345\251\263\213\337\234\326\370\254\353\313\336\217\312\312\351\315\233\274\265\335\361\205\267\323\256\317\300\320\227\247\251\217\235\272\220\374\324\316\276\317\276\371\336\366\237\227\215\325\211\231\316\225\365\207\276\217\316\206\223\235\370\247\313\353\352\270\262\261\305\347\267\344\262\357\206\205\307\226\245\353\247\226\375\317\334\265\374\227\235\373\352\273\313\330\342\317\237\343\374\201\325\334\260\275\274\260\264\250\342\361\304\323\343\275\332\262\257\333\202\373\226\326\254\337\235\300\341\325\355\346\374\346\300\335\337\353\270\342\360\230\356\226\331\204\322\255\337\251\326\206\344\333\263\243\345\370\224\263\223\260\235\322\312\217\241\365\231\251\254\352\246\373\361\302\211\311\334\301\237\314\346\235\230\261\314\203\262\221\256\333\237\240\356\263\306\355\230\326\240\236\276\344\311\257\247\231\356\204\217\325\301\226\357\361\376\207\363\361\207\361\210\307\266\352\350\223\330\217") -TOPIC_TEXT( -"\351\373\302\311\342\332\333\333\255\327\253\245\276\361\360\330\376\246\212\337\213\204\217\337\310\217\222\314\274\340\330\212\220\311\237\247\277\226\305\227\216\203\331\266\361\355\326\354\215\232\364\363\305\263\322\377\310\343\255\236\263\364\336\327\355\344\361\236\342\227\266\376\224\224\366\305\226\256\215\252\312\376\254\357\301\364\301\207\277\355\313\275\362\226\303\374\312\340\327\204\334\327\375\375\322\303\360\271\365\344\343\212\236\223\256\345\317\243\202\333\246\363\206\340\204\271\306\375\376\353\257\260\272\237\317\235\244\213\300\253\346\266\343\251\220\221\210\326\223\244\267\265\313\201\367\337\262\377\307\250\375\316\344\205\225\217\275\206\334\261\273\364\260\237\344\216\307\370\256\336\263\306\212\323\276\323\300\247\263\232\210\266\232\261\211\271\245\323\216\212\351\274\363\266\235\241\272\363\233\351\265\211\327\264\273\232\226\336\302\206\362\360\217\337\373\355\320\265\272\300\352\225\205\310\301\363\265\312\221\201\232\356\347\304\335\261\306\231\370\223\377\341\212\367\330\245\306\216\374\333\371\372\212\347\206\307\205\264\236\363\315\304\216\354\311\271\256\365\301\343\232\322\355\313\376\353\225\306\370\247\327\321\350\234\341\251\250\304\325\301\332\204\210\267\200\256\366\314\232\213\275\342\261\226\241\275\241\237\274\346\334\320\357\225\271\301\220\376\313\276\374\233\225\247\251\211\333\270\213\220\246\247\337\344\251\275\214\274\374\213\275\305\261\240\244\363\204\234\334\375\211\254\251\274\310\342\213\230\257\327\241\372\273\221\315\264\303\206\232\375\336\210\320\270\335\345\326\225\242\275\210\240\250\245\372\300\250\323\307\216") -TOPIC_TEXT( -"\356\337\311\263\307\352\202\354\377\367\243\335\234\327\316\233\262\237\336\216\251\232\330\255\357\374\255\252\307\247\342\212\302\343\310\376\365\312\350\244\345\270\220\265\263\232\213\251\330\223\366\227\247\260\252\322\233\212\233\241\263\213\320\263\255\216\340\242\365\351\245\332\207\250\250\354\333\331\200\375\323\254\316\242\200\201\370\241\301\367\360\304\216\246\337\305\342\374\215\217\326\274\227\253\255\333\312\277\212\374\360\330\342\366\340\231\222\305\366\262\322\246\276\313\303\264\207\227\353\322\370\327\333\332\237\274\234\226\372\306\232\363\305\275\345\207\255\313\217\226\331\223\241\225\252\241\302\331\343\253\233\334\340\362\374\353\243\255\333\246\322\375\260\346\357\310\215\217\366\201\220\232\205\325\237\361\264\232\331\211\216\360\211\215\222\366\275\225\320\252\223\262\336\306\360\265\250\233\223\273\334\261\276\367\355\376\204\237\244\233\223\217\251\336\275\374\323\326\343\241\342\233\271\277\250\310\202\230\203\271\313\376\226\204\334\305\352\263\276\207\251\370\242\311\252\310\213\302\342\203\235\322\223\204\257\264\254\230\357\271\224\373\336\362\357\237\364\246\305\343\341\256\361\321\346\326\206\301\210\227\210\302\370\254\251\326\366\260\210\256\210\236\313\274\326\263\262\332\206\303\347\251\334\241\257\217\362\305\330\365\340\361\230\274\362\342\335\374\346\256\232\254\241\361\306\324\233\351\304\227\213\265\357\332\366\225\333\335\334\265\351\204\203\214\353\270\347\276\323\273\224\326\350\346\256\345\305\373\276\330\362\226\373\270\353\307\234\256\201\247\352\324\276\367\333\234\336\320\201\307\314\272\331\372\250\313\335\355\307\374") -TOPIC_TEXT( -"\362\362\200\332\232\311\305\241\366\300\234\254\247\342\370\373\240\344\355\303\322\204\210\214\254\246\246\334\220\323\347\270\247\375\373\320\262\267\360\346\242\347\250\222\307\270\233\355\336\222\365\234\205\272\234\330\236\216\305\312\375\364\260\245\365\306\365\244\261\201\262\352\313\223\217\307\350\320\210\347\256\256\377\313\251\211\342\272\305\236\323\254\253\273\363\362\204\300\304\330\254\311\233\334\322\340\257\340\363\363\335\220\236\251\247\305\366\273\200\230\373\260\240\274\320\225\356\347\226\246\216\254\373\236\224\305\352\225\304\351\325\270\275\331\223\244\315\253\343\313\376\275\373\362\371\331\204\353\246\227\375\237\341\212\256\214\234\217\317\205\370\262\272\327\360\265\256\354\262\324\234\255\236\273\344\273\265\345\274\326\332\336\326\303\311\304\314\224\251\307\236\253\203\351\265\375\317\376\375\336\340\332\372\376\366\372\342\225\323\310\364\257\264\343\263\343\311\334\351\253\346\247\331\302\217\266\262\200\241\270\321\310\304\231\361\342\207\231\333\222\304\211\270\341\375\341\263\357\212\371\317\334\341\276\260\225\202\200\232\227\302\362\261\230\216\325\315\230\247\312\343\255\340\374\345\332\274\211\263\342\311\202\245\256\361\326\202\251\336\225\205\244\314\220\265\267\341\203\266\340\316\255\240\325\276\251\355\203\266\224\323\317\372\332\372\301\372\230\271\267\305\201\256\221\232\264\355\371\313\304\310\340\335\267\355\257\376\252\227\363\313\256\350\354\211\344\207\237\374\226\217\334\370\274\366\333\257\274\205\361\201\342\355\213\340\314\274\316\300\354\370\217\344\325\374\342\240\263\276\216\367\234\223\244\306\227\311\274\300\377") -TOPIC_TEXT( -"\343\337\345\332\256\260\343\254\336\355\305\303\346\247\344\202\204\206\202\247\206\264\266\216\215\364\207\276\367\336\326\272\236\267\372\376\375\267\347\317\234\316\254\377\303\376\351\364\273\375\201\367\306\242\323\326\267\234\352\226\251\301\354\223\271\343\325\261\260\260\313\276\323\316\365\343\324\313\273\301\234\303\367\341\221\325\323\273\236\326\333\274\372\370\307\353\353\265\272\265\370\314\226\344\240\377\343\205\345\310\342\376\323\375\263\370\373\262\245\225\200\342\310\371\321\266\304\270\265\303\307\264\372\332\326\226\260\322\226\370\314\200\276\354\277\255\305\311\364\306\220\277\344\303\262\231\357\313\363\234\265\343\312\256\365\350\264\322\265\362\213\251\222\247\203\257\212\353\350\314\326\263\346\351\275\371\366\272\242\334\317\310\234\217\300\237\277\322\227\254\345\211\303\267\322\310\362\270\350\214\321\252\225\241\312\276\232\334\226\317\314\316\257\340\332\342\203\312\205\324\366\205\346\376\224\360\310\373\240\331\233\370\306\236\231\336\201\213\362\346\215\344\331\270\237\210\315\314\241\323\312\314\247\212\357\305\221\273\244\213\207\256\226\311\373\320\247\342\263\204\274\225\261\375\240\247\314\346\267\245\375\341\200\217\363\321\235\341\237\376\367\266\377\274\204\316\221\310\264\227\203\217\331\226\344\204\243\201\201\271\221\216\324\336\351\356\236\226\251\270\355\343\212\356\374\300\223\254\355\237\203\361\370\352\260\301\271\357\345\234\204\313\235\267\377\255\246\343\206\372\257\324\301\264\225\331\345\365\363\222\275\337\216\265\213\365\230\335\330\211\336\362\344\372\207\217\364\205\376\274\230\276\324\341\237\321\243\325\331\351") -TOPIC_TEXT( -"\324\375\217\360\225\366\372\347\333\377\337\310\234\303\232\236\355\371\356\223\226\347\320\214\305\363\347\263\237\250\370\254\367\373\223\323\247\317\230\342\304\312\377\247\251\315\266\262\200\241\217\364\206\223\250\331\323\200\300\277\355\326\206\376\265\354\263\360\276\254\370\234\333\325\300\307\343\262\320\271\377\310\200\341\216\275\326\264\373\356\210\251\265\255\250\367\347\243\261\252\311\331\362\353\361\355\243\202\347\302\302\240\245\222\320\234\251\361\335\226\354\251\312\264\247\230\234\325\373\265\377\223\371\272\202\304\350\305\311\214\266\234\272\220\260\331\226\262\245\366\210\320\361\242\321\377\260\344\264\222\314\365\245\340\276\233\373\335\310\222\334\234\261\354\241\355\221\363\345\217\215\244\362\365\265\245\316\211\317\334\322\270\241\203\211\215\351\300\306\310\340\300\310\366\222\356\311\302\325\331\314\243\376\373\231\274\211\306\227\276\352\356\257\222\262\276\273\274\360\212\243\231\216\303\226\203\235\203\275\355\370\351\374\345\334\336\223\207\357\357\373\333\363\311\376\235\260\345\267\212\240\357\233\277\332\265\255\332\314\205\347\302\332\377\257\267\245\243\316\333\251\267\376\307\237\324\222\366\202\307\375\222\326\364\334\331\257\332\256\333\233\255\206\257\265\214\231\267\346\306\213\317\317\203\213\217\361\211\372\245\211\277\203\336\361\272\270\231\337\237\322\266\324\262\221\261\260\363\363\323\232\327\327\232\217\251\234\317\306\342\261\365\331\311\362\370\343\200\342\307\372\275\204\324\226\310\341\310\274\330\301\255\240\274\226\211\247\347\224\374\337\360\210\213\205\276\264\341\346\325\323\313\275\201\275\203\311\266\234\370") -TOPIC_TEXT( -"\302\213\262\257\320\350\357\244\275\326\250\266\333\252\301\271\275\333\372\331\247\343\235\266\333\252\224\320\331\235\204\344\264\221\351\206\325\222\226\207\245\330\210\370\313\357\321\255\227\241\307\343\317\272\327\354\257\375\214\256\325\237\216\234\276\304\203\363\324\350\350\213\336\343\247\213\232\347\315\214\310\365\200\207\217\366\335\353\213\240\261\331\326\374\357\315\323\213\251\227\265\333\375\311\236\374\223\301\337\240\340\254\275\250\245\361\364\263\226\362\302\231\334\327\315\307\321\231\221\346\220\234\370\276\274\275\356\274\316\333\341\350\223\247\353\371\304\220\362\351\235\354\200\303\336\254\357\302\352\207\364\250\226\220\341\251\347\213\306\207\276\333\216\215\317\244\362\260\305\370\247\343\361\306\274\216\315\314\316\201\212\201\274\233\263\376\305\277\373\351\367\377\372\217\330\223\236\270\343\375\230\330\305\243\323\313\303\235\334\344\340\300\260\315\274\263\246\343\364\270\220\310\306\327\346\254\362\336\373\306\221\364\377\317\377\371\253\211\373\211\203\251\271\330\327\350\232\243\204\300\301\216\267\367\217\303\210\230\201\330\342\223\252\370\311\354\344\351\360\330\204\316\271\241\343\352\266\367\210\225\363\217\305\304\317\313\360\342\341\342\242\375\247\204\217\205\335\207\367\354\330\301\332\300\321\206\245\321\336\263\331\372\207\215\356\353\332\235\300\353\314\242\276\353\266\312\374\233\230\227\320\264\212\252\245\210\351\255\226\236\227\372\326\245\345\227\323\224\337\321\217\217\201\373\214\201\236\227\304\364\374\302\236\350\333\302\222\265\225\273\277\336\325\274\355\215\363\365\367\260\300\357\340\336\204\375\230\231\234\213") -TOPIC_TEXT( -"\225\357\214\333\325\240\234\375\255\360\343\267\342\321\345\373\203\344\334\231\206\222\347\342\314\331\327\201\247\352\306\271\371\227\237\242\264\366\360\341\245\351\204\346\331\330\310\372\313\371\206\300\342\321\311\250\266\267\205\316\347\253\274\207\245\351\302\255\253\301\361\361\211\360\211\201\330\224\311\313\377\353\221\351\237\250\375\343\327\245\355\207\333\373\235\213\361\330\317\363\363\316\362\201\370\211\351\263\345\343\246\304\346\234\305\205\215\370\252\252\236\217\361\204\206\336\374\361\305\346\254\277\373\231\370\332\363\357\305\376\225\310\307\275\240\356\217\217\321\205\376\366\333\266\347\346\211\243\267\305\312\251\307\270\371\230\300\262\204\216\215\375\367\377\356\342\261\204\256\274\226\252\301\350\221\312\215\231\277\244\304\370\254\222\374\327\325\217\367\213\206\307\201\364\250\346\335\222\246\256\252\243\342\312\341\302\340\361\211\215\331\247\316\310\347\263\230\243\236\353\211\362\260\217\245\243\251\255\365\200\265\304\266\374\266\333\252\361\235\336\316\312\371\255\316\221\367\251\376\264\204\354\305\377\304\267\357\375\305\225\250\273\303\375\277\357\274\263\225\321\361\373\354\276\375\373\334\331\347\360\266\237\345\231\316\251\317\345\244\325\326\202\202\233\327\235\270\274\210\260\356\353\276\276\334\233\236\303\270\372\353\306\231\336\347\365\345\230\371\251\217\346\257\273\243\310\202\314\214\346\373\251\243\325\207\316\262\330\371\323\253\376\236\314\266\322\352\235\362\227\242\353\375\217\326\324\247\222\227\305\276\361\232\330\215\313\231\311\243\373\276\215\217\254\206\244\321\361\254\236\363\314\206\300\275\324\330\352\211\260") -TOPIC_TEXT( -"\355\305\301\225\247\246\335\275\311\313\270\230\347\302\327\214\203\323\210\377\353\251\237\251\240\341\233\251\216\367\272\267\326\330\222\327\204\253\201\357\205\316\300\354\254\370\254\271\336\374\370\243\227\274\276\361\323\377\213\270\371\217\377\300\365\225\372\206\352\350\377\332\376\210\271\231\346\341\262\361\343\235\351\257\373\274\310\253\355\365\207\217\216\276\217\316\246\236\327\367\376\315\377\201\372\336\277\336\326\375\333\217\257\265\277\366\264\267\336\202\332\332\332\307\257\237\273\210\251\230\375\316\231\250\356\277\337\336\372\361\340\237\333\217\375\370\257\334\331\372\223\337\337\372\264\377\377\373\237\377\361\217\336\376\367\243\377\300\337\337\257\376\376\377\275\371\363\337\234\210\236\267\365\335\256\375\272\342\275\362\341\261\210\205\300\243\250\264\337\316\315\261\367\206\307\254\327\310\273\230\321\210\313\327\212\264\206\202\357\307\270\251\321\232\340\246\316\246\326\212\365\330\315\224\237\247\326\324\320\352\200\352\253\211\370\354\267\325\262\273\347\275\304\362\233\230\213\212\355\335\231\352\335\257\316\267\363\207\250\302\365\251\261\341\267\303\235\311\200\371\225\373\244\357\202\225\355\243\200\300\202\273\362\250\347\206\370\265\331\360\326\233\254\375\273\261\224\310\230\272\362\251\221\370\337\214\257\347\317\234\226\353\325\261\313\344\257\245\276\353\370\271\274\371\274\246\305\303\352\326\245\360\235\347\225\316\234\202\367\350\261\246\276\247\355\377\303\351\274\343\323\312\304\356\372\332\241\371\260\355\214\337\360\322\331\370\330\255\376\313\372\376\270\270\365\275\351\206\253\224\303\251\215\237\336\370\262\200\205\334") -TOPIC_TEXT( -"\267\224\376\332\260\334\307\274\200\322\347\236\233\206\222\203\345\336\302\333\312\232\322\322\221\330\306\310\307\357\340\361\232\235\325\214\364\200\317\215\331\305\373\314\272\206\243\254\375\255\247\267\357\336\270\361\343\263\264\322\356\327\350\263\355\274\367\274\266\327\331\217\353\257\322\235\272\332\247\326\346\316\257\346\261\344\264\237\260\215\217\323\233\377\354\345\233\274\241\356\374\265\261\361\342\301\300\317\223\200\230\312\206\326\225\315\276\267\314\342\356\325\352\315\301\353\265\265\326\312\324\240\326\361\236\227\273\235\374\370\214\342\355\371\333\377\324\267\205\311\277\371\311\327\212\257\377\243\244\242\261\246\273\202\223\301\313\355\315\303\256\355\255\327\233\232\267\264\372\337\372\305\375\331\236\257\277\276\352\336\362\313\323\277\271\374\237\377\240\316\374\257\347\377\345\377\316\274\366\333\206\361\326\216\371\351\256\351\261\366\350\213\252\253\264\354\327\275\315\215\364\334\242\356\246\301\361\235\310\272\234\277\314\374\350\244\363\376\260\335\247\237\232\361\317\313\224\247\224\370\354\255\203\250\345\232\313\261\335\326\311\356\366\365\241\216\346\326\220\210\255\375\246\261\334\200\375\336\266\243\306\317\263\255\204\233\352\326\212\255\217\301\213\362\226\202\364\274\256\270\276\337\277\367\367\354\351\267\334\234\220\331\312\210\340\236\224\256\244\211\317\303\305\375\313\336\340\371\262\264\314\227\330\315\324\214\213\376\211\306\356\336\355\351\361\302\304\300\362\313\267\227\250\270\203\255\223\222\371\313\357\342\222\247\371\342\354\256\331\312\346\222\347\233\364\343\330\334\336\314\202\231\342\323\323\326\210\313\335\225") -TOPIC_TEXT( -"\233\222\311\271\306\212\227\327\316\304\360\353\273\347\375\333\240\355\271\234\270\326\314\346\304\222\220\332\254\212\340\254\267\335\370\352\346\314\361\222\225\270\326\354\353\342\352\302\311\214\360\343\376\255\205\245\232\353\311\325\345\303\217\326\237\310\223\202\370\332\265\246\217\332\325\217\361\350\360\304\324\262\253\365\322\333\272\351\323\246\264\311\263\213\201\323\231\303\362\300\202\372\330\274\230\305\274\232\354\327\240\365\267\246\251\363\246\225\377\257\307\343\272\341\251\231\315\264\306\256\300\263\313\235\311\350\357\303\277\225\303\355\265\302\306\315\371\267\316\361\236\312\302\343\267\305\377\372\377\352\316\225\352\377\370\207\367\217\376\333\304\347\333\376\304\317\300\261\227\365\207\217\367\274\216\311\237\264\335\223\355\257\261\245\325\205\367\311\343\224\370\334\376\376\372\375\366\337\275\332\332\361\340\237\273\267\377\240\237\202\356\215\237\325\364\376\302\372\370\332\375\307\373\333\270\270\245\354\374\335\325\241\244\374\275\333\260\234\340\361\205\266\342\220\210\264\265\227\255\343\215\210\233\316\222\305\342\263\241\207\356\272\326\362\260\263\314\344\225\353\261\341\235\276\251\363\246\226\306\322\242\313\224\247\370\354\255\203\222\350\315\323\355\335\326\251\316\217\205\255\333\266\246\252\362\371\231\212\362\300\375\314\317\306\362\257\263\335\304\274\305\254\345\212\370\337\247\234\224\343\225\235\224\260\361\261\274\204\236\336\376\356\273\256\246\316\310\354\263\222\213\226\371\357\364\276\216\211\304\315\205\351\372\350\232\221\201\370\232\360\267\352\371\300\327\327\273\365\350\351\325\315\222\203\372\360\213\305\304\214") -TOPIC_TEXT( -"\365\225\253\236\260\376\311\240\352\264\256\200\271\265\376\345\353\256\205\251\310\346\222\251\334\366\374\332\243\367\272\317\203\206\313\310\305\321\331\330\317\252\363\222\202\325\322\233\222\334\320\370\236\331\373\210\336\262\200\370\301\340\342\250\246\312\277\345\342\354\350\347\270\352\307\242\224\363\250\246\315\261\305\202\346\334\220\276\351\331\337\346\202\326\370\265\312\224\336\370\244\360\377\262\246\257\342\330\217\335\372\313\237\237\200\254\263\242\217\337\261\233\300\257\376\271\221\322\376\202\216\323\374\320\337\212\230\276\265\335\333\313\220\274\276\361\273\275\366\261\205\326\236\246\244\246\334\322\252\233\327\335\225\377\324\330\330\265\271\373\207\251\251\347\223\354\313\316\337\377\311\237\202\215\337\372\373\375\337\313\205\346\375\341\234\237\200\230\205\207\237\235\314\375\377\365\324\256\240\261\273\206\312\200\343\225\346\343\207\374\277\321\310\366\317\267\270\202\303\212\217\217\374\207\351\340\361\373\363\367\355\255\211\267\350\272\206\332\233\257\313\246\221\370\224\243\300\342\373\346\213\277\205\310\306\304\335\343\377\374\247\313\316\316\230\225\376\273\316\332\261\257\301\373\355\316\203\202\255\267\350\234\260\316\307\211\265\226\217\237\340\361\346\364\355\361\320\264\210\352\353\254\245\312\331\223\244\373\206\245\216\240\307\226\210\317\366\333\245\370\237\343\270\227\335\223\376\260\271\313\364\301\200\315\347\366\302\343\365\257\373\247\344\346\224\317\366\372\337\271\345\231\201\332\250\361\275\245\327\306\310\247\344\242\256\312\312\254\255\220\356\213\307\332\367\261\361\357\345\366\236\361\256\247\216\301\230\361\271\342") -TOPIC_TEXT( -"\371\226\207\276\342\263\376\345\371\311\225\360\330\220\314\306\345\221\373\276\263\353\210\245\255\312\325\212\344\306\372\226\363\211\344\224\256\273\231\231\350\213\246\366\306\351\327\246\202\360\274\331\234\220\317\334\376\254\334\360\257\307\207\246\305\276\202\372\360\230\262\274\204\223\351\311\324\354\371\355\215\300\265\206\335\370\211\327\217\265\261\320\260\242\326\320\214\233\361\342\363\301\212\327\252\351\370\303\253\327\352\323\220\203\236\370\247\270\367\226\352\370\317\314\232\271\374\311\216\265\266\326\274\330\217\375\255\342\362\267\266\372\232\263\343\225\301\371\330\350\252\221\266\336\302\367\241\311\343\343\225\217\307\375\226\325\255\243\236\323\344\315\202\220\214\275\376\345\365\377\212\255\236\373\351\312\377\325\243\211\330\272\373\367\235\376\370\377\203\236\246\210\340\243\262\261\276\277\355\305\251\263\302\223\226\312\341\261\277\330\370\350\377\323\332\262\240\312\263\362\312\327\272\205\355\217\311\310\255\327\352\233\322\232\337\350\353\275\376\361\235\322\235\376\324\320\230\372\254\357\357\327\226\337\236\206\274\241\357\376\327\377\376\377\207\371\343\377\203\354\214\340\336\216\360\330\213\360\256\237\220\361\277\261\314\314\304\227\227\357\335\367\262\247\272\370\205\254\234\247\215\305\265\257\210\310\351\225\217\234\310\210\257\314\323\361\240\254\341\346\243\364\272\347\221\231\357\273\266\240\241\254\316\302\257\270\240\364\305\362\276\251\375\321\335\332\270\322\234\220\201\314\343\352\257\222\352\244\335\265\330\304\345\225\214\371\351\355\236\276\346\223\235\265\315\267\205\233\245\231\210\310\330\333\211\262\273\262\275\254") -TOPIC_TEXT( -"\347\223\337\216\302\202\321\231\221\303\200\342\275\246\340\353\310\300\206\362\220\356\346\355\325\326\232\244\323\330\256\306\271\322\325\270\254\256\334\252\360\307\334\235\356\354\261\275\303\321\312\330\341\247\227\267\353\265\323\276\247\330\224\305\372\314\264\203\302\267\267\365\325\206\272\307\300\260\215\360\306\372\266\274\306\310\213\346\300\243\223\257\231\250\231\224\315\207\220\214\236\363\256\230\361\303\202\232\354\231\366\205\366\253\252\316\214\314\304\277\342\365\367\310\213\237\257\222\356\275\357\245\332\373\210\346\272\267\350\275\342\345\357\357\235\213\343\216\321\364\274\270\331\241\372\336\267\214\311\334\337\330\226\370\252\343\371\346\212\361\336\271\256\375\366\254\206\306\224\232\236\373\255\253\333\306\204\274\336\373\344\313\344\366\374\252\311\271\340\341\226\227\235\223\305\356\256\375\240\236\332\236\221\273\324\273\233\241\360\252\367\354\376\216\307\232\327\216\375\230\200\234\344\346\301\264\347\305\313\363\235\360\337\370\324\271\241\263\215\303\244\200\343\301\343\212\220\214\264\361\274\300\343\217\222\342\324\355\352\361\276\216\310\232\227\353\204\331\326\363\253\320\310\371\374\372\256\377\244\214\347\317\331\371\205\326\202\323\241\362\340\277\257\271\227\256\336\244\247\376\224\254\220\227\257\336\204\324\247\323\267\325\256\214\345\234\373\256\221\306\337\315\234\231\260\304\370\254\303\271\227\247\274\227\212\221\314\203\345\235\310\212\246\370\205\251\370\376\217\201\236\227\266\333\342\204\274\320\267\345\217\373\273\357\256\363\302\336\313\212\252\310\203\207\275\241\257\310\212\307\206\363\367\261\361\231\323\205\200\262") -TOPIC_TEXT( -"\226\355\370\323\236\243\361\350\244\261\206\236\217\261\316\366\313\331\203\361\230\235\314\264\216\273\346\241\207\212\344\252\313\311\322\226\255\273\217\316\251\373\324\371\341\360\270\323\205\253\265\255\323\306\242\362\214\374\226\324\273\352\204\256\370\244\320\371\344\264\252\343\214\264\234\377\212\222\311\300\343\353\224\265\321\362\324\212\261\337\342\326\230\361\303\325\211\307\252\274\362\374\363\342\257\353\366\326\275\245\374\205\301\321\321\340\210\256\302\362\266\276\375\252\207\220\313\226\253\277\362\225\304\213\236\226\314\306\202\375\343\327\351\250\206\222\276\237\371\366\332\347\227\232\274\216\335\255\253\273\376\251\215\310\231\374\234\260\211\301\345\330\330\222\324\330\305\231\214\223\225\210\307\317\353\336\320\375\376\374\346\256\246\332\313\276\227\244\344\360\203\247\360\310\362\266\227\300\310\301\377\200\234\302\343\257\336\321\277\361\370\353\217\204\212\265\316\274\376\315\376\244\200\357\274\272\364\343\350\351\201\317\317\217\364\220\207\261\361\347\251\201\356\301\345\200\217\313\264\240\226\263\240\214\211\325\231\226\275\254\374\212\317\265\226\203\260\250\344\316\206\364\217\242\200\362\347\272\266\216\271\271\235\245\333\377\313\225\263\342\350\361\217\275\210\345\255\365\354\377\216\224\335\363\357\372\247\336\363\257\251\244\263\312\363\333\354\257\340\240\242\250\257\204\202\217\343\351\340\276\232\312\272\241\203\223\220\265\247\344\276\240\351\345\373\345\247\341\207\307\356\335\317\307\271\341\261\352\317\323\331\326\251\275\316\330\237\372\357\273\252\336\230\326\213\234\326\240\231\312\362\262\305\353\351\316\263\323\207\237") -TOPIC_TEXT( -"\204\353\363\277\271\373\230\314\200\233\233\224\267\352\306\324\226\364\226\232\247\361\334\362\233\220\210\367\311\350\244\337\247\274\361\246\201\331\360\216\264\306\255\370\257\253\211\222\323\261\272\217\247\310\267\202\227\215\351\361\215\305\372\243\222\231\352\226\312\375\250\213\242\225\236\207\367\264\276\321\247\317\365\326\362\350\255\305\300\374\271\306\271\254\310\241\340\266\210\245\220\354\327\350\263\263\276\324\340\363\312\255\213\327\366\372\373\216\267\337\330\337\335\330\370\340\312\227\307\256\245\355\225\326\205\274\323\356\373\214\253\267\305\306\365\327\221\324\300\274\315\355\367\256\241\310\326\354\223\243\373\231\321\217\245\255\333\212\362\373\243\336\240\201\331\363\256\310\366\344\312\201\234\231\235\362\354\376\256\326\371\236\253\246\223\343\326\333\302\305\342\300\202\326\361\230\340\254\354\214\231\235\272\267\304\351\201\236\205\373\315\270\367\354\241\331\210\250\332\304\234\246\261\222\224\235\363\243\246\222\347\301\251\352\356\333\377\310\266\313\376\331\213\203\320\300\233\317\313\276\361\220\361\345\304\306\334\263\256\305\214\224\231\355\261\264\222\330\327\262\242\241\376\301\272\343\322\250\277\257\373\353\235\367\222\305\246\255\252\316\310\253\313\311\303\254\217\315\206\264\254\232\366\370\202\354\355\276\206\337\221\276\200\351\306\343\242\205\265\320\275\227\313\251\263\321\324\226\271\233\233\267\322\321\273\304\320\331\354\335\254\322\264\224\246\221\272\350\254\341\244\363\315\255\353\253\262\305\262\225\255\345\204\217\255\273\357\237\330\274\226\261\304\311\343\273\354\247\361\224\344\330\246\334\201\224\223\307\207\362") -TOPIC_TEXT( -"\234\242\250\211\222\261\322\236\263\370\326\233\222\204\376\354\254\330\341\234\216\274\261\314\253\262\212\346\242\344\274\211\341\330\370\346\220\353\247\313\206\350\305\237\314\367\233\374\375\264\227\372\240\354\307\270\340\332\277\212\252\335\240\234\322\267\322\262\313\234\367\204\336\216\217\317\206\223\375\202\270\326\344\317\236\276\357\274\275\236\224\210\267\340\330\251\263\244\256\314\213\364\363\216\334\364\376\341\342\214\375\255\367\356\220\225\270\355\205\300\330\212\265\341\335\274\371\341\314\367\365\327\352\277\275\373\273\266\274\303\232\350\236\356\255\225\330\267\211\334\256\342\357\354\203\302\306\340\351\365\303\345\353\207\341\354\361\370\355\223\336\255\353\216\225\342\342\221\264\264\246\257\277\214\371\277\277\321\342\363\323\232\357\361\213\322\206\334\377\331\262\300\301\317\342\267\246\241\337\371\276\366\347\331\206\237\322\312\233\274\367\350\337\256\303\267\263\204\207\217\234\277\251\376\306\215\360\270\212\244\251\351\206\210\223\364\220\360\377\360\257\320\202\232\233\223\205\227\315\345\360\331\213\351\324\234\264\264\212\265\357\304\365\354\211\335\222\210\347\231\217\373\362\251\275\235\202\317\212\222\201\311\245\223\262\323\231\354\376\266\363\330\260\215\222\276\262\335\371\264\254\335\307\330\271\204\221\306\252\245\227\335\227\355\222\350\206\313\362\266\356\331\371\332\243\225\206\346\217\341\247\315\351\201\263\310\311\370\277\373\355\211\335\200\250\261\256\333\223\366\215\326\344\327\345\213\344\252\313\271\264\304\212\373\220\217\263\323\247\272\236\251\272\330\247\330\212\207\232\234\227\223\361\275\347\361\310\332\343\200") -TOPIC_TEXT( -"\236\373\225\262\332\266\220\357\303\366\340\245\313\252\320\364\341\223\276\252\322\242\216\266\253\307\320\352\353\377\327\373\256\356\244\273\246\220\271\376\370\367\241\374\351\261\366\267\237\255\366\226\260\323\315\255\367\201\251\221\313\335\275\207\232\317\223\333\202\256\376\345\242\370\346\322\324\267\215\212\366\270\351\370\324\330\363\244\333\226\222\216\361\263\236\257\264\237\223\323\275\243\300\310\340\343\334\220\262\324\367\206\212\311\274\326\316\310\355\241\377\234\307\217\323\201\370\212\222\217\374\334\351\276\255\342\361\345\372\313\357\377\323\260\375\350\275\351\201\220\360\331\206\341\313\225\207\301\313\262\236\340\372\361\265\312\200\231\271\327\261\304\360\312\370\306\224\342\313\367\321\263\270\257\333\234\344\343\240\203\377\354\244\336\302\335\221\213\245\361\271\263\270\275\270\225\221\331\243\352\233\344\224\211\231\331\214\270\314\274\373\366\324\243\205\211\302\265\230\266\336\332\350\231\275\312\325\254\320\332\200\265\212\257\305\347\300\206\317\236\371\257\331\377\325\200\315\272\330\354\356\335\330\266\213\202\223\322\313\376\272\362\227\250\250\327\342\267\244\274\207\265\320\230\344\345\371\321\266\304\332\203\213\343\342\324\334\254\263\261\343\226\373\227\260\222\340\255\244\204\323\322\343\313\267\213\262\210\204\252\270\354\230\310\226\364\251\234\330\265\304\202\253\316\307\361\341\207\373\254\204\374\350\300\276\326\270\253\357\221\217\301\311\327\232\333\232\270\375\336\302\336\204\315\337\241\214\213\222\377\357\207\317\301\311\216\264\311\303\237\235\357\363\262\202\323\261\241\302\315\322\261\307\271\364\226\317\244\345\275") -TOPIC_TEXT( -"\300\305\370\326\366\236\366\216\307\317\243\266\376\260\261\353\367\210\274\203\241\323\313\202\352\374\273\225\220\354\355\314\265\365\346\274\216\317\247\361\305\361\371\361\227\233\221\274\307\222\261\275\315\225\247\246\322\326\353\264\214\222\217\301\305\237\262\236\351\201\236\253\336\224\315\352\370\200\307\325\257\325\370\333\265\343\276\205\202\213\262\235\240\320\306\256\363\233\206\230\213\334\223\306\225\326\333\255\241\372\266\220\222\373\352\234\236\213\211\261\301\207\216\207\247\272\245\345\302\206\272\255\313\317\322\245\313\356\200\337\255\350\327\245\237\374\320\276\332\375\340\244\255\275\352\342\332\265\322\316\310\230\200\310\323\260\220\224\263\343\250\355\334\271\371\252\271\233\344\263\243\220\364\261\263\322\301\207\312\367\242\374\375\316\340\346\346\351\217\331\225\354\365\244\255\222\341\242\254\312\304\232\251\234\314\230\333\325\315\306\314\217\302\215\210\256\332\253\201\355\241\272\305\357\257\361\205\371\260\225\217\247\214\307\356\342\246\340\346\305\306\374\376\323\207\273\272\332\353\256\232\277\271\225\327\360\256\370\356\362\337\363\340\256\306\303\360\320\320\223\375\361\222\350\263\272\324\310\214\370\271\352\351\360\213\257\356\354\326\254\305\362\304\330\304\331\302\371\330\273\236\277\354\250\201\225\275\327\301\367\276\342\245\202\307\244\267\261\360\367\320\251\337\213\374\316\334\315\304\226\310\354\353\204\214\275\260\313\274\356\270\327\253\346\255\250\320\307\223\256\307\327\303\356\250\370\314\222\276\371\345\365\255\361\275\326\203\362\204\202\274\336\210\252\366\235\224\344\257\242\253\257\223\241\275\373\226\214\251\202") -TOPIC_TEXT( -"\204\253\352\372\221\270\263\311\307\234\322\364\341\361\206\337\236\242\366\252\226\232\211\371\303\235\340\333\257\265\266\344\273\206\377\361\221\333\241\241\201\350\230\374\324\355\323\236\276\375\257\242\331\234\357\273\373\306\266\256\305\246\265\212\210\307\242\246\312\376\344\266\224\330\321\271\217\315\301\320\375\223\377\277\200\210\322\242\342\332\272\336\210\316\305\346\306\243\301\323\367\360\341\267\265\326\344\237\272\360\266\315\307\215\346\337\377\215\370\326\340\365\336\260\317\215\346\337\370\216\345\317\214\320\356\214\364\225\301\211\307\257\337\321\233\355\320\223\267\276\353\277\363\201\266\275\200\254\231\255\261\361\200\362\221\327\266\226\377\214\344\321\345\345\275\326\367\234\320\246\337\325\200\346\324\302\274\267\332\222\333\276\347\364\217\264\263\273\321\332\336\246\230\236\353\274\334\334\274\342\241\265\244\343\342\323\343\233\312\327\232\353\351\323\361\266\250\341\330\303\342\200\217\267\363\210\350\342\321\366\335\240\303\254\276\226\276\207\343\212\374\331\307\212\275\225\301\311\200\216\367\373\302\356\205\304\306\202\345\257\363\347\317\357\373\371\364\355\232\263\336\333\237\376\363\251\211\333\331\255\270\276\262\274\320\327\333\215\374\215\215\336\234\236\236\302\340\311\234\235\235\235\352\357\250\201\263\257\306\243\370\374\337\270\222\350\272\326\206\271\341\254\344\376\366\314\305\343\267\310\335\333\240\212\262\237\233\231\252\227\263\334\330\323\275\311\205\312\347\220\272\224\316\300\334\365\321\316\366\326\316\300\357\275\267\265\264\320\212\231\217\314\342\345\220\210\343\235\347\366\363\376\312\200\204\365\301\274\204\343") -TOPIC_TEXT( -"\255\356\312\216\340\252\246\343\314\357\334\232\355\226\264\306\326\223\323\257\224\364\364\307\343\315\241\361\270\321\335\370\274\316\236\346\302\267\330\370\271\257\317\327\214\333\257\330\303\363\206\237\245\234\253\254\260\354\311\345\344\240\364\267\215\333\215\233\232\267\264\266\336\344\230\331\220\361\250\320\274\253\250\202\274\256\227\210\256\256\375\222\262\304\362\325\373\312\351\361\210\346\256\206\227\245\343\226\342\263\350\363\362\214\242\367\310\326\322\275\204\241\241\204\376\210\264\303\203\246\316\355\232\323\301\254\354\341\336\354\253\372\306\257\346\264\366\247\370\374\245\242\272\265\373\373\343\335\364\207\354\352\260\310\272\241\203\230\265\362\352\241\266\332\230\217\217\215\261\336\202\211\223\217\255\212\306\317\216\324\235\274\230\213\345\204\347\303\343\247\353\352\340\334\326\205\302\320\361\270\247\304\267\355\206\224\332\347\234\340\211\301\270\354\273\323\264\315\362\312\304\324\336\362\251\371\352\313\323\273\357\354\350\245\233\203\222\377\373\233\312\337\341\322\307\363\252\237\237\315\241\365\326\334\233\276\236\277\337\215\323\352\245\261\354\221\364\373\356\215\366\342\236\321\370\312\351\354\217\275\213\334\330\343\373\207\261\335\365\343\234\365\211\222\225\343\316\361\302\364\316\325\335\227\365\375\240\217\370\234\341\215\353\262\363\325\346\303\226\331\200\362\310\367\274\237\211\373\231\301\343\240\361\225\253\243\236\202\311\337\265\366\266\337\375\372\305\322\206\334\364\311\316\267\215\337\210\317\305\340\270\334\321\366\345\234\356\300\224\305\345\227\242\305\231\363\276\326\200\212\331\223\245\332\323\242\226\342\233\310") -TOPIC_TEXT( -"\262\311\212\304\356\315\267\316\261\345\246\345\373\235\213\350\224\264\217\251\363\313\213\377\261\244\307\376\306\356\370\334\342\323\243\261\232\313\220\377\237\243\322\370\254\320\350\256\331\240\242\201\315\376\216\201\230\225\337\247\251\211\333\342\222\331\347\337\365\306\267\247\376\352\357\275\367\266\342\351\356\276\350\324\364\366\322\211\214\241\373\320\320\200\250\370\312\245\377\306\276\356\353\230\371\314\311\311\223\240\204\313\215\216\351\266\224\225\217\267\324\335\300\332\342\261\355\316\375\333\302\340\360\302\332\214\271\231\211\216\361\257\340\226\350\351\235\372\245\361\370\370\227\357\254\267\265\326\343\322\317\347\250\333\240\325\202\245\221\330\226\244\370\201\306\214\255\330\223\306\207\346\302\211\366\307\262\373\370\274\277\233\331\214\345\252\215\243\306\270\230\242\265\276\216\314\305\307\262\362\320\274\316\324\332\346\212\365\264\360\245\334\211\231\376\225\202\303\357\352\307\336\335\244\203\345\214\341\331\266\276\277\344\275\273\235\362\260\363\202\241\307\326\375\367\365\350\312\310\363\355\323\343\226\300\362\357\331\206\237\356\270\372\325\263\336\243\375\207\216\337\214\317\360\270\214\242\315\270\377\325\365\310\246\262\256\320\265\300\305\347\334\226\260\354\215\364\227\346\370\303\236\321\301\315\345\272\236\364\377\320\363\242\302\243\221\346\373\305\232\307\367\314\332\261\271\376\247\242\357\374\252\340\230\300\311\224\260\366\207\322\261\252\227\366\225\217\325\275\301\370\267\251\203\337\367\215\266\253\202\347\311\343\374\316\317\347\333\337\275\350\375\220\242\301\366\264\362\241\361\242\344\221\247\374\302\327\261\373\307") -TOPIC_TEXT( -"\347\373\311\367\336\353\370\213\274\270\377\237\255\374\355\243\261\377\240\213\202\241\367\366\270\371\200\304\300\316\354\274\264\370\375\223\346\261\311\261\320\311\371\272\272\320\361\301\275\373\366\260\202\257\316\253\212\316\264\274\317\204\325\366\243\321\267\225\242\245\321\365\214\215\204\324\360\271\370\326\354\377\317\367\335\351\311\324\320\336\373\256\217\366\342\246\310\271\371\243\304\222\251\341\323\366\261\345\235\215\227\315\277\326\234\246\271\326\324\247\222\357\374\276\305\353\254\327\322\370\271\314\300\326\216\307\211\312\353\253\232\347\335\377\307\352\326\236\341\206\324\200\336\244\356\267\257\213\312\334\217\212\311\307\255\327\356\260\212\317\312\335\255\255\243\227\257\335\352\351\275\322\337\374\361\247\323\200\344\357\232\266\267\234\215\353\215\360\270\334\252\336\247\255\341\254\326\353\206\214\377\333\342\361\260\346\320\270\206\224\233\366\347\220\220\303\275\310\363\271\344\352\223\325\210\276\335\322\262\353\361\226\306\214\262\350\235\236\253\210\325\201\224\274\215\334\245\237\374\323\232\245\237\356\255\265\200\335\360\340\350\220\363\332\223\373\335\212\256\276\312\344\231\265\210\336\251\346\347\306\356\241\232\335\230\305\260\372\224\234\265\267\355\333\206\244\276\376\262\370\237\360\370\376\372\234\375\213\214\203\226\325\244\334\226\266\202\206\273\220\360\362\377\337\327\335\301\203\246\200\343\256\353\355\261\310\232\230\343\256\253\302\355\213\346\302\236\237\235\213\274\216\344\213\256\276\222\326\367\373\335\235\317\344\204\307\367\206\327\373\361\276\311\323\361\353\223\225\267\216\235\330\227\232\303\350\314\255\212\225") -TOPIC_TEXT( -"\347\363\237\363\363\335\220\227\367\374\233\314\243\332\203\263\225\330\347\232\225\243\217\264\237\246\232\352\277\275\213\317\303\327\217\353\256\337\266\371\367\366\355\307\343\253\343\361\242\362\241\361\270\276\277\355\265\200\337\247\246\334\370\313\324\271\250\220\207\302\306\354\266\364\367\275\356\371\342\301\343\254\350\204\310\276\333\260\374\325\231\231\317\301\310\255\327\256\242\352\376\225\201\236\227\306\351\366\211\311\312\241\360\214\356\355\302\311\371\364\272\302\363\245\370\314\262\224\370\356\366\355\253\243\243\226\305\327\374\262\232\231\255\341\300\354\363\342\247\313\263\245\226\237\345\246\231\331\352\245\330\333\262\360\305\213\244\367\215\247\334\363\263\322\323\254\240\373\350\257\241\236\336\273\327\320\223\242\262\276\251\226\365\367\357\223\316\363\300\372\364\307\273\323\264\220\235\322\256\223\301\302\306\265\361\262\270\366\375\323\217\337\240\321\370\331\311\352\317\240\214\374\363\342\223\257\276\274\371\314\375\301\347\246\255\270\265\274\324\331\357\333\257\251\365\332\327\231\271\226\236\334\242\247\317\335\254\342\334\336\371\263\247\317\340\267\376\247\266\253\351\370\270\320\373\303\254\242\301\363\306\243\270\270\224\303\374\321\230\216\322\322\224\354\350\273\325\275\375\343\326\272\370\341\324\255\211\312\233\354\351\317\210\255\347\205\316\243\331\267\343\333\333\301\253\315\313\327\356\245\221\365\246\223\247\364\271\366\273\227\274\263\256\273\246\236\207\347\354\272\217\344\372\207\312\316\305\271\341\261\321\233\342\243\214\320\313\264\261\274\234\233\271\226\343\365\211\225\237\236\247\223\243\337\220\247\236\267\264\206") -TOPIC_TEXT( -"\202\274\372\256\245\330\270\271\260\315\304\257\363\237\246\213\364\346\243\224\217\224\200\234\217\316\305\252\342\327\255\210\331\355\225\303\225\223\262\310\207\277\354\211\260\203\256\227\347\357\211\246\366\340\375\256\225\265\321\247\275\332\244\271\362\320\370\300\345\233\256\210\263\260\233\216\223\335\253\336\353\315\312\334\241\236\240\231\275\215\313\325\231\201\303\354\373\211\327\307\202\353\236\217\225\366\217\331\243\335\233\216\222\331\327\374\221\245\250\317\276\264\344\260\237\306\225\342\343\276\305\276\224\275\273\233\351\355\260\233\243\247\227\357\252\250\371\215\350\275\206\346\307\377\346\263\236\340\317\226\377\323\200\273\277\377\213\264\313\366\266\325\237\244\231\305\350\244\345\340\261\325\263\260\300\270\377\274\241\376\236\213\347\316\321\306\243\223\224\323\235\253\261\342\215\350\233\305\317\244\232\260\362\326\342\223\267\361\317\237\213\367\310\206\202\343\351\364\355\333\256\235\240\355\373\302\366\247\361\355\237\236\274\374\363\373\273\357\252\217\213\240\254\266\301\274\217\305\236\365\207\323\344\224\364\310\263\315\377\246\362\301\343\223\234\267\276\263\316\217\233\371\377\217\351\300\354\253\350\274\233\202\340\361\352\276\323\213\305\352\365\276\232\217\347\237\201\301\257\357\274\356\355\231\202\355\275\322\217\274\206\244\204\267\267\217\204\370\334\232\201\211\313\360\341\327\213\204\263\225\262\326\317\236\254\345\212\313\310\352\315\257\365\200\340\244\273\271\335\350\302\223\336\332\262\266\262\332\254\232\334\334\331\317\243\325\207\336\326\367\346\341\312\202\325\272\241\264\202\325\326\201\363\370\337\315\240\241\310\307") -TOPIC_TEXT( -"\320\266\376\256\262\270\376\232\307\372\373\236\214\344\317\377\334\335\345\276\373\303\243\236\203\204\365\351\372\241\262\274\223\367\335\205\372\311\221\301\370\210\221\370\322\300\203\243\255\265\255\321\260\236\335\245\272\224\351\265\326\325\303\365\270\356\205\315\310\231\207\327\210\275\335\375\362\250\247\200\367\256\333\265\265\325\256\204\305\342\347\262\272\272\212\245\354\377\375\257\277\330\371\315\211\277\336\232\276\372\347\237\376\370\250\206\275\244\367\374\372\366\343\306\350\274\247\315\207\307\310\324\307\213\361\272\276\270\314\367\337\346\273\357\366\222\374\326\270\221\346\265\305\243\313\315\312\356\271\265\276\371\317\347\321\362\277\334\254\231\276\325\250\245\350\332\243\225\221\271\333\361\357\342\251\320\307\372\335\260\255\302\372\251\217\341\334\221\332\332\311\367\356\374\374\213\267\233\352\277\275\312\231\217\211\221\245\371\226\275\224\276\274\333\276\301\340\333\307\342\227\274\266\305\204\351\237\326\204\251\224\236\223\257\323\350\355\252\326\310\217\333\367\230\352\215\217\246\322\312\235\315\363\322\310\315\213\240\340\261\363\236\263\335\346\233\363\271\341\234\237\234\231\216\317\265\303\233\272\376\317\345\333\235\315\227\377\312\220\371\202\274\256\266\230\264\356\327\244\233\224\215\335\216\250\235\273\316\235\272\205\221\225\200\245\310\304\254\371\254\303\247\225\260\251\332\246\212\311\251\231\223\211\231\254\335\345\245\376\256\254\257\321\222\342\234\271\373\233\222\303\262\347\372\225\355\225\266\201\371\257\261\365\346\346\346\214\340\213\315\240\227\256\347\361\361\311\221\323\350\243\220\253\367\326\272\303\262\351\304") -TOPIC_TEXT( -"\340\201\246\327\314\274\350\216\344\374\262\227\343\206\373\227\216\265\223\365\345\377\324\265\342\306\202\207\232\317\373\361\206\363\275\251\354\222\225\334\243\202\237\351\223\254\266\267\342\272\326\366\351\200\313\244\237\367\332\256\326\260\232\210\331\366\360\313\272\220\363\350\327\340\201\253\220\316\375\315\372\340\321\255\344\274\363\345\214\256\320\254\257\362\236\271\302\240\275\305\370\362\335\244\265\357\330\254\272\237\325\256\314\355\226\242\341\245\253\214\275\276\356\276\316\246\200\243\274\214\302\335\214\340\370\206\351\341\307\215\364\367\366\272\364\232\316\360\347\312\261\242\344\342\342\250\205\306\306\276\337\277\276\367\367\307\273\360\311\264\267\310\243\241\255\333\266\355\255\333\375\352\273\275\351\200\254\366\332\206\275\334\237\343\203\243\267\324\274\356\274\367\267\276\275\345\362\302\314\337\366\201\344\226\302\272\252\260\214\310\353\367\240\355\260\221\215\205\235\320\330\303\375\271\207\362\236\273\373\341\276\234\243\231\276\323\361\321\272\331\225\311\275\373\356\265\351\251\235\312\266\277\247\247\207\367\320\253\236\234\354\245\311\310\273\352\243\301\255\306\350\264\336\321\353\265\314\252\223\323\246\226\217\241\303\207\366\311\373\272\343\337\277\377\367\364\272\272\316\201\217\305\204\322\231\232\203\373\356\346\341\262\243\255\255\201\231\355\216\365\310\221\227\274\266\215\255\311\206\261\304\306\377\370\254\317\216\231\227\302\320\251\263\362\337\313\313\266\311\220\235\333\362\325\240\365\232\217\213\241\242\200\217\213\245\322\261\313\213\342\265\202\310\344\206\360\317\302\346\315\233\267\355\332\234\344\373\304\300\317") -TOPIC_TEXT( -"\354\217\310\335\206\242\361\213\257\274\276\240\237\352\240\225\364\322\215\247\247\314\334\227\230\207\260\224\341\237\214\323\262\347\315\230\254\364\322\313\257\271\271\257\204\363\262\300\256\272\244\340\245\204\250\231\360\207\251\223\365\354\225\377\215\306\351\225\354\334\300\203\253\276\211\230\377\376\251\241\243\236\332\263\364\254\377\355\346\364\261\257\320\205\266\326\360\330\320\353\305\361\300\360\307\200\246\360\331\326\256\361\272\312\303\331\345\301\276\324\235\336\206\360\360\351\313\314\274\346\264\301\344\342\261\256\303\237\277\377\370\307\266\327\230\224\302\320\226\263\353\373\335\271\373\314\203\353\203\227\231\355\277\332\264\353\204\322\352\217\275\272\277\200\344\317\342\311\310\304\227\337\253\275\326\323\267\373\277\372\265\237\346\337\275\237\372\363\347\277\334\376\241\361\332\237\227\327\323\275\333\271\307\371\205\206\206\204\355\215\333\276\275\364\362\370\207\321\272\203\207\251\220\362\202\337\367\365\225\217\372\206\336\206\316\264\244\250\230\233\217\300\206\230\212\312\316\237\277\315\305\334\272\255\223\274\325\313\333\270\360\362\342\354\301\356\302\364\352\251\276\223\366\214\264\234\235\253\372\304\346\361\331\272\346\325\264\304\247\234\202\366\231\367\320\353\337\257\275\366\342\213\257\342\336\211\202\333\307\366\376\264\326\355\374\265\271\361\225\253\210\325\247\246\273\365\262\301\212\262\256\333\253\363\305\364\354\366\222\257\231\253\367\222\230\354\274\272\374\263\375\373\354\276\341\316\212\324\336\321\275\351\273\336\377\251\344\300\236\253\315\201\305\353\266\332\373\225\246\333\247\342\261\260\253\325\350\341\353\373") -TOPIC_TEXT( -"\314\305\265\254\362\352\226\364\225\317\254\305\301\360\330\355\242\302\247\310\200\336\370\370\204\225\316\234\324\371\371\365\335\323\360\352\372\257\203\217\301\261\276\305\222\337\216\263\307\343\275\356\207\321\302\217\363\325\333\232\366\366\345\301\275\242\202\202\350\224\314\302\203\262\327\247\320\240\247\246\266\314\235\200\246\261\247\247\207\243\271\230\310\223\237\261\336\342\373\254\342\261\346\301\374\230\241\216\305\214\223\313\260\210\304\347\223\263\203\327\236\217\222\316\256\275\372\210\221\266\241\263\334\255\332\335\314\340\227\230\326\340\235\346\300\233\304\205\326\302\235\223\206\306\200\242\342\362\244\324\343\331\226\314\324\266\242\346\301\234\262\336\260\331\341\331\230\322\247\235\231\367\266\334\311\210\344\324\205\261\270\345\364\257\262\320\245\371\307\237\273\371\363\230\311\264\222\212\271\330\241\335\334\251\371\334\235\342\267\273\262\312\337\204\346\232\322\207\315\330\217\253\302\260\331\332\245\244\363\340\252\345\322\231\347\245\321\243\214\274\216\230\324\257\274\346\344\234\271\327\206\237\353\233\315\201\303\333\342\205\246\263\330\335\352\362\244\230\267\246\365\236\355\245\331\225\206\364\326\320\225\361\370\372\260\347\347\337\306\374\363\336\373\333\231\243\337\367\305\201\327\325\312\323\210\350\204\332\273\207\217\335\274\310\275\324\234\262\204\351\374\370\374\265\245\211\356\307\246\200\343\226\313\215\302\206\217\327\373\372\271\252\374\202\205\302\303\267\207\335\322\335\220\311\262\253\227\307\313\362\270\262\235\335\344\271\303\330\351\335\370\344\202\201\271\376\320\314\326\323\250\341\204\341\340\322\257\301\235\314") -TOPIC_TEXT( -"\377\210\275\346\224\264\325\274\373\214\216\223\225\331\374\332\357\330\333\271\243\371\243\361\316\344\302\323\206\217\221\276\326\270\214\252\355\361\214\216\233\314\332\223\241\315\304\305\377\374\333\213\224\347\305\241\203\251\266\364\307\252\243\237\367\377\340\252\375\253\245\273\266\264\262\233\333\366\210\332\342\361\373\302\241\254\210\255\251\231\200\306\241\237\252\243\236\273\342\365\235\333\323\330\330\244\300\307\346\276\344\302\362\270\343\301\251\326\310\352\301\320\206\376\346\276\210\317\344\376\375\215\322\267\202\335\223\257\256\213\363\227\247\247\276\237\367\217\234\340\327\255\216\214\336\217\217\263\377\361\330\250\247\270\304\221\235\364\305\204\366\260\240\201\302\243\364\312\306\253\257\360\250\201\361\351\212\356\201\346\220\215\235\376\213\302\327\315\233\266\221\252\260\210\260\232\222\253\237\330\353\360\224\271\360\253\255\202\207\370\212\255\340\363\304\334\303\256\204\375\355\230\201\237\255\263\305\305\316\220\225\261\327\302\245\260\263\234\231\237\220\240\234\342\360\217\271\340\304\206\374\305\304\222\216\276\214\342\346\316\240\356\305\232\364\333\336\256\305\312\322\217\205\325\312\243\352\245\344\341\252\321\231\271\377\250\263\370\262\254\234\233\236\263\275\225\267\302\311\270\247\326\212\321\246\336\204\327\220\311\225\257\211\302\327\314\347\214\337\377\306\267\254\341\261\257\266\333\226\313\210\357\273\370\225\347\212\226\237\334\204\217\337\334\354\200\270\365\270\340\264\257\303\230\215\327\262\257\362\214\315\313\205\303\327\250\332\255\322\371\251\343\206\366\350\250\330\362\362\337\341\257\264\266\357\347\354\242\303\303") -TOPIC_TEXT( -"\372\263\361\232\337\260\306\257\277\353\211\215\335\237\355\344\371\235\327\211\236\203\206\206\206\305\251\344\353\365\313\321\361\230\304\232\237\271\215\274\346\371\227\274\272\203\207\261\270\310\353\230\227\245\336\307\300\333\303\341\211\241\201\206\367\307\336\340\356\236\227\320\244\332\333\223\261\357\323\323\323\351\353\300\333\320\376\365\312\374\312\254\234\372\274\301\354\264\305\270\305\365\205\326\263\371\240\352\267\254\356\264\202\256\325\237\235\274\341\245\345\306\357\300\371\235\356\367\306\241\215\270\213\327\263\266\205\267\362\270\373\342\326\356\275\271\276\355\333\266\311\221\233\271\323\343\261\264\342\245\274\274\272\316\241\371\266\304\233\360\255\300\343\333\216\255\325\372\275\343\253\271\340\261\364\352\271\331\372\323\270\324\305\333\335\327\302\216\326\246\352\352\301\231\365\303\354\346\220\231\327\246\343\305\273\373\243\263\330\323\271\224\335\343\272\347\220\347\277\201\236\337\333\310\374\275\317\301\366\362\260\363\205\347\361\366\255\236\213\225\225\227\345\353\364\372\345\263\232\305\366\220\373\255\270\310\322\360\212\370\254\220\266\275\205\340\261\215\203\240\336\374\211\245\241\327\370\207\337\211\214\271\344\357\207\253\211\274\304\314\271\235\216\225\330\220\344\215\246\333\322\256\313\325\323\312\236\340\206\332\242\210\350\267\300\235\341\347\316\240\360\355\205\257\202\211\364\343\351\376\324\313\346\232\276\371\367\234\323\347\230\251\244\263\307\260\215\255\250\310\314\364\363\267\203\337\347\305\306\247\224\373\353\331\376\322\215\240\324\343\277\205\225\214\211\275\224\352\274\227\206\300\336\252\350\271\342\236\254\307") -TOPIC_TEXT( -"\360\370\243\205\364\240\317\325\247\313\351\210\357\275\230\315\336\346\224\204\356\255\337\261\254\227\317\224\207\262\346\334\241\227\201\272\334\271\352\302\217\366\246\337\202\220\333\303\365\352\374\346\351\214\363\260\344\371\367\236\305\226\363\307\307\311\360\252\241\311\203\362\312\337\257\342\231\336\371\335\263\355\276\230\335\330\350\255\363\355\205\275\373\322\326\367\331\311\234\377\337\227\212\307\323\223\343\267\333\333\256\263\275\333\333\245\206\363\247\317\335\342\210\331\203\340\253\340\354\315\211\264\350\253\271\345\262\266\224\323\213\363\341\260\261\256\340\214\300\343\350\344\204\305\276\264\253\322\361\230\367\270\357\256\371\262\357\311\351\245\357\342\361\352\303\345\372\302\242\361\320\356\330\264\277\230\327\247\255\303\260\215\236\204\324\341\374\245\205\203\253\221\300\346\337\333\274\231\375\220\364\351\347\366\250\206\216\221\217\341\201\341\301\336\251\244\237\335\325\261\345\320\201\275\366\264\265\354\370\354\245\222\211\227\255\241\333\276\276\222\224\216\370\334\263\326\242\251\216\353\304\265\211\331\270\374\270\250\227\274\246\335\230\236\370\353\364\264\215\317\247\376\327\216\332\303\356\333\264\351\240\200\214\260\316\347\264\310\301\372\335\330\217\246\347\270\337\366\203\314\216\315\346\371\316\351\365\253\354\200\226\211\322\314\377\342\346\362\307\352\375\262\314\235\355\333\343\354\354\267\274\306\301\254\275\241\315\330\252\306\262\201\254\371\206\336\317\267\370\333\346\360\241\302\343\264\342\256\326\343\214\272\343\340\253\204\336\311\262\343\310\356\265\316\371\350\360\365\345\256\234\342\316\320\372\326\314\317\266\303") -TOPIC_TEXT( -"\264\365\214\311\330\226\272\247\234\350\332\314\306\300\246\342\214\326\273\255\240\231\227\366\241\204\334\205\336\255\204\214\306\317\200\272\233\240\247\377\203\262\362\360\316\213\236\377\256\355\256\220\215\306\361\330\230\371\201\211\263\236\207\264\312\252\226\230\203\345\212\236\324\220\252\315\207\341\347\211\354\364\222\211\261\237\201\227\207\236\357\243\352\343\225\347\337\372\233\225\313\312\367\256\227\274\272\276\272\276\343\207\372\354\213\242\243\205\336\257\256\336\321\353\253\210\235\221\365\277\214\274\371\354\233\223\377\205\352\266\306\343\235\265\246\255\354\317\366\321\300\320\312\335\217\202\310\212\206\332\253\221\330\262\235\236\223\262\240\263\377\341\261\317\367\357\375\354\255\213\357\316\236\275\267\376\256\275\241\371\331\261\217\305\363\304\344\232\360\267\223\323\373\255\202\366\357\316\276\201\313\223\315\275\370\204\236\343\330\353\265\245\257\340\315\261\307\321\214\306\242\272\327\250\225\201\241\274\231\255\267\254\250\347\303\213\214\246\332\260\350\215\232\354\253\351\320\260\315\332\330\264\305\261\245\343\243\316\354\321\262\222\367\365\236\337\337\367\311\247\322\310\327\372\303\235\333\255\301\251\217\222\215\337\213\204\351\362\250\273\320\350\330\245\364\300\201\332\314\331\247\255\214\316\270\266\204\353\223\356\344\316\346\354\333\324\267\217\250\311\344\272\322\345\353\375\225\353\301\330\243\236\247\224\220\305\344\261\344\230\263\276\345\271\360\311\362\346\360\207\355\303\334\324\257\371\301\214\226\370\205\234\270\261\356\236\200\263\360\377\212\247\375\333\320\204\231\362\247\247\377\215\350\244\252\371\373\223\344\270") -TOPIC_TEXT( -"\235\304\375\207\317\340\361\364\304\367\362\271\247\340\236\366\260\354\223\204\354\347\274\226\343\325\300\366\252\226\261\350\302\365\303\370\225\366\317\343\206\272\272\256\360\253\247\260\347\332\237\214\272\266\237\244\221\215\217\217\271\254\221\266\230\232\301\351\316\264\346\247\240\374\377\320\332\300\375\341\356\211\257\343\207\206\307\214\350\223\375\257\266\231\301\272\225\370\371\342\222\257\222\242\232\216\274\325\351\204\354\224\350\240\244\377\203\362\334\364\314\213\206\236\237\273\371\270\264\262\211\302\334\355\356\350\307\200\363\220\333\231\243\336\203\217\225\262\255\333\252\241\371\274\362\375\363\313\217\222\320\376\326\340\325\351\222\302\300\223\252\224\256\207\236\372\234\350\357\361\204\327\276\232\246\343\314\220\236\337\234\237\227\222\302\225\217\351\325\226\377\236\372\307\217\327\325\224\241\344\234\341\371\265\301\327\357\207\355\277\276\323\322\243\356\246\206\352\376\377\234\374\320\371\366\301\356\376\370\327\360\325\360\277\207\236\313\215\351\235\257\277\376\261\346\266\251\211\262\374\316\323\363\275\257\337\357\303\343\245\370\214\232\232\205\272\257\276\202\260\300\207\363\367\356\273\363\362\204\364\336\262\317\317\214\346\200\253\342\352\377\240\263\263\343\217\240\333\221\221\347\337\335\311\345\354\233\216\325\353\367\340\322\364\270\232\354\310\233\331\320\350\254\342\350\336\253\346\331\320\354\306\224\320\251\302\272\372\303\232\246\271\203\267\230\240\333\346\214\360\221\343\357\213\307\326\305\263\236\216\213\303\215\275\352\224\251\244\333\235\210\357\375\340\327\277\277\256\273\376\251\332\372\245\224\255\203\331\370\302") -TOPIC_TEXT( -"\213\317\303\346\360\252\344\265\230\362\263\262\261\262\252\323\324\330\322\223\214\333\343\256\355\253\374\270\371\300\343\224\203\223\336\317\272\370\263\305\343\365\354\364\363\304\345\364\270\267\341\300\330\360\241\374\373\271\321\243\205\370\230\343\224\353\223\211\210\356\377\244\272\365\332\360\213\256\251\341\350\345\274\346\374\372\314\344\217\242\262\367\267\331\261\257\354\266\354\344\237\342\261\244\334\363\250\217\225\323\342\331\301\227\327\377\265\265\325\372\241\343\253\253\332\360\341\253\320\224\315\255\226\215\314\342\336\246\234\231\231\315\235\270\264\350\311\237\204\335\302\214\203\372\344\204\332\350\210\241\313\212\241\217\231\360\235\233\302\304\376\206\345\221\336\351\264\206\233\201\366\300\256\315\260\235\242\260\270\302\356\210\353\344\204\347\272\277\342\236\355\253\213\263\363\213\274\310\312\340\260\272\226\311\272\213\275\215\310\327\334\262\244\271\231\220\237\255\345\226\230\354\313\306\210\344\316\264\376\256\340\374\277\272\267\226\200\207\375\361\322\261\377\352\324\274\307\311\300\257\341\273\277\330\310\253\254\264\201\364\312\266\263\250\315\361\330\316\346\362\242\216\222\223\264\374\277\341\364\211\377\341\361\312\353\201\375\260\263\230\276\331\231\370\272\244\316\203\275\323\345\312\260\314\300\227\256\254\253\227\271\346\313\347\233\227\335\243\261\303\313\355\273\267\324\376\314\346\317\304\223\257\355\367\256\340\222\331\306\267\205\234\202\353\206\363\207\207\335\326\227\230\305\303\230\217\234\276\364\341\341\364\377\341\375\220\342\361\207\265\206\277\360\261\240\213\362\374\312\306\333\257\245\374\362\253\272\372\357\362") -TOPIC_TEXT( -"\275\354\375\263\257\276\331\267\373\223\361\363\347\316\317\216\205\350\237\201\234\321\323\330\335\256\247\236\347\270\316\330\374\213\367\377\335\254\373\270\256\214\274\246\235\247\317\267\365\316\340\317\317\325\256\244\343\356\363\360\342\341\322\365\302\203\357\343\331\263\247\364\343\307\270\235\244\267\216\365\206\265\321\224\374\304\306\332\245\203\316\261\327\274\357\244\301\215\341\355\243\243\243\236\343\214\273\250\231\325\372\373\272\276\337\334\231\362\254\270\370\341\273\255\335\237\255\303\343\324\221\307\331\266\370\234\363\357\316\243\271\335\332\262\244\326\270\273\200\343\312\327\337\215\341\213\316\336\311\306\302\252\355\311\344\264\240\340\333\350\227\274\206\301\257\276\235\276\350\305\375\375\363\220\347\354\353\277\323\352\315\345\247\356\343\214\272\305\210\243\234\342\324\253\354\313\201\325\230\316\333\223\371\246\275\375\321\312\336\326\354\240\305\301\377\360\275\262\271\272\312\320\202\315\366\274\306\343\303\215\313\263\221\316\337\306\302\366\241\236\201\373\331\352\324\205\232\275\226\202\263\355\300\220\260\314\365\243\201\331\265\267\341\311\271\343\265\353\236\237\265\307\332\253\334\237\265\302\210\366\242\315\212\270\370\237\234\262\251\310\341\230\232\310\266\217\245\245\317\335\257\320\341\342\234\364\242\227\252\215\260\250\351\261\377\244\354\356\260\345\266\322\354\347\365\362\257\240\324\230\263\376\316\315\312\241\216\346\261\216\316\307\265\252\301\306\327\354\235\313\255\305\247\246\235\262\362\255\305\347\243\354\313\314\344\331\266\325\277\275\352\236\207\305\245\363\221\253\226\366\360\271\274\270\260\304\222\367\317\334") -TOPIC_TEXT( -"\370\214\342\342\276\350\371\274\311\336\255\262\277\224\311\317\204\214\277\351\246\302\226\231\326\241\267\227\242\341\270\340\217\326\346\237\340\225\220\372\270\222\354\340\202\267\335\237\357\272\362\363\363\365\274\326\347\307\303\377\363\227\207\336\237\276\273\372\347\231\255\307\252\267\267\262\326\344\236\272\320\375\337\245\355\332\311\343\307\277\264\355\270\313\204\310\227\232\327\316\321\237\231\357\257\371\216\334\314\232\373\242\215\337\273\220\272\203\370\357\232\215\365\231\212\335\236\304\256\202\321\223\303\243\243\225\205\311\236\314\342\341\377\252\237\363\375\321\261\334\354\200\250\326\334\320\375\361\352\305\247\326\306\327\222\342\240\365\366\234\341\206\234\356\347\353\220\254\362\246\315\271\201\357\230\255\372\327\236\227\222\376\364\314\207\257\265\306\220\207\247\253\210\274\306\203\313\313\272\333\245\377\267\247\227\311\266\222\336\202\250\326\277\234\370\260\236\252\310\232\324\372\272\323\202\326\377\212\353\315\256\300\333\362\251\233\373\265\333\217\312\263\313\352\247\343\211\231\321\277\253\264\215\311\327\374\301\344\237\354\323\321\255\253\210\300\271\257\221\257\311\305\312\372\223\251\221\247\316\244\247\250\370\306\337\246\307\343\234\243\364\234\360\270\241\355\316\212\343\362\264\230\374\325\246\220\215\317\362\371\271\204\346\370\234\225\300\246\270\277\310\240\311\372\206\221\316\201\334\326\236\334\203\230\330\230\374\226\266\276\332\263\341\302\305\223\335\346\324\265\273\277\317\200\333\255\271\347\234\302\206\310\333\300\224\357\300\212\261\217\230\372\377\261\300\207\366\326\222\314\264\253\344\267\365\304\226\271\236\246") -TOPIC_TEXT( -"\263\300\356\343\364\376\275\230\247\240\206\315\346\257\330\344\345\371\226\261\276\270\204\204\303\343\267\202\266\210\233\302\303\232\361\217\351\356\227\237\334\264\320\374\262\371\354\351\217\262\204\330\222\260\357\256\326\210\241\311\240\361\367\266\242\322\272\234\236\273\356\225\265\301\343\274\255\375\343\374\372\204\301\347\302\337\337\353\323\325\221\332\275\350\315\255\340\333\241\350\220\307\211\214\200\375\304\330\371\370\320\236\317\311\250\232\256\346\246\320\341\231\235\320\262\306\223\371\354\315\330\303\261\375\333\324\272\305\344\331\371\367\351\327\235\324\321\240\321\257\206\355\312\223\247\231\235\256\300\212\327\206\345\376\221\346\301\273\271\270\237\270\230\274\236\227\227\223\203\346\223\275\365\371\257\257\320\362\245\254\250\303\213\314\375\311\251\205\373\303\362\315\217\302\306\326\302\231\224\216\372\270\316\265\346\321\233\350\307\245\250\365\365\357\365\355\242\261\235\253\306\303\311\360\237\373\235\277\371\377\216\235\337\330\267\353\243\235\336\330\366\330\263\320\302\327\373\372\301\361\251\223\247\307\356\212\356\207\362\311\272\272\306\312\353\345\231\312\202\201\211\370\332\367\332\377\307\221\221\213\376\231\306\255\325\344\205\347\236\331\216\244\253\377\326\264\203\222\311\217\347\251\352\333\376\274\242\224\242\321\330\347\266\351\215\361\366\254\365\237\244\225\375\243\313\321\336\301\321\274\361\270\321\273\341\345\244\326\345\262\304\376\325\356\266\333\254\204\323\370\270\321\362\347\320\332\203\253\264\304\365\230\265\351\302\322\270\225\343\376\333\257\376\352\275\221\253\263\305\343\226\340\336\343\300\372\223\345\365\360") -TOPIC_TEXT( -"\334\252\263\355\310\353\265\241\224\276\353\201\342\250\310\206\341\310\273\245\233\220\370\271\266\241\267\271\236\332\357\317\322\304\227\374\365\315\303\251\332\370\355\346\375\201\343\243\365\263\205\344\263\274\270\272\270\371\214\255\236\235\224\233\260\266\366\267\216\231\227\342\317\361\221\330\310\347\303\305\247\266\202\207\361\253\235\332\324\313\210\262\367\303\276\342\377\324\231\233\363\251\361\330\326\256\235\314\314\213\256\247\256\373\271\263\216\310\322\271\302\266\354\336\317\221\224\255\226\325\230\332\375\271\346\302\377\213\263\251\323\351\316\321\374\207\204\260\303\351\253\230\206\370\210\334\214\351\245\267\300\315\316\316\300\246\366\235\340\204\366\216\212\264\333\252\326\266\307\360\344\363\307\247\236\331\326\346\200\355\244\303\354\211\350\341\340\260\311\352\205\211\247\213\261\273\220\377\302\246\210\200\373\316\355\217\273\371\217\325\274\273\322\327\325\306\215\347\226\365\260\270\261\225\355\305\264\324\342\312\315\366\317\212\365\343\244\311\314\254\367\267\375\322\347\333\260\326\225\200\313\263\204\337\304\370\225\312\210\341\313\367\237\230\375\226\364\301\206\231\212\237\355\256\216\222\327\232\313\242\347\245\305\202\270\227\213\363\202\367\361\265\272\375\207\200\270\214\244\306\253\213\237\226\345\242\276\355\256\327\323\367\306\371\367\356\346\321\274\255\241\250\253\375\255\370\341\211\232\233\273\273\240\312\231\327\323\337\310\370\237\321\253\376\261\205\227\336\370\361\305\227\277\331\271\214\307\323\205\357\360\232\226\342\255\306\323\221\343\321\321\321\271\353\264\317\303\343\223\247\235\243\253\313\350\313\330\211\370\201") -TOPIC_TEXT( -"\343\234\371\316\251\270\271\354\375\241\244\222\346\251\235\314\304\317\333\323\323\323\323\341\261\234\337\326\320\320\300\375\373\213\315\230\202\341\232\331\373\264\301\202\347\253\276\263\302\210\256\367\311\301\301\377\307\245\313\224\321\263\204\236\227\370\343\313\366\275\224\366\325\306\233\223\216\330\245\202\344\232\331\215\213\325\335\262\310\272\356\375\367\206\265\206\261\274\375\320\325\261\370\232\306\361\334\313\215\347\316\237\271\255\376\226\222\266\232\216\211\307\311\331\306\306\310\363\244\253\352\353\300\213\253\220\217\351\222\355\302\306\230\315\202\343\212\230\321\240\310\205\277\274\342\265\317\300\214\216\221\304\367\335\331\245\311\355\246\220\207\274\227\332\364\264\216\317\250\236\277\267\332\317\307\222\345\300\335\342\261\235\274\245\374\243\330\212\274\250\213\253\233\273\241\375\305\252\212\210\275\311\231\361\330\366\340\373\261\261\247\313\250\237\343\274\322\222\221\267\332\253\255\310\356\345\211\331\342\276\241\256\351\226\216\260\332\212\231\266\241\302\313\251\267\306\307\207\310\370\334\205\302\263\264\365\255\216\357\232\340\354\245\301\377\240\365\362\300\365\300\326\232\206\263\215\217\214\350\216\271\212\252\255\343\341\256\317\301\277\373\273\262\273\345\333\204\253\241\236\332\345\277\312\312\326\241\265\306\277\202\311\336\260\211\231\272\317\326\377\332\250\272\231\200\215\331\331\247\244\306\314\305\306\202\322\341\273\246\355\275\204\254\231\232\237\200\226\354\304\327\227\355\244\221\200\235\353\222\361\212\214\233\320\303\263\215\205\305\217\355\207\344\245\361\245\323\325\305\246\212\210\330\205\374\222\213\302\322\354") -TOPIC_TEXT( -"\303\320\216\346\357\313\212\317\305\370\220\256\264\227\235\303\247\226\333\307\252\204\377\274\364\266\203\312\355\300\263\262\317\356\240\317\317\217\216\265\337\372\217\230\243\333\372\320\323\207\221\365\270\227\357\260\326\302\341\311\331\252\241\203\313\275\332\270\207\334\274\326\367\262\345\271\207\237\270\240\352\252\227\254\325\306\371\334\360\257\261\360\275\321\375\357\343\270\325\311\331\336\234\325\367\311\242\354\377\210\356\330\367\267\333\331\262\213\260\347\324\260\201\306\251\211\330\265\311\315\260\323\260\233\236\333\277\347\377\317\350\360\317\210\307\357\353\274\263\325\363\272\246\356\271\214\365\346\213\307\342\213\203\341\342\256\345\325\326\370\367\334\234\256\357\245\206\374\253\250\346\221\353\327\336\224\345\322\304\253\370\334\263\276\273\236\227\326\212\205\276\223\202\306\372\245\335\222\343\262\216\234\243\306\256\350\327\355\324\372\260\326\327\340\202\264\303\323\270\335\354\274\366\302\234\340\255\265\232\373\311\364\261\364\306\346\262\267\316\327\302\345\212\326\331\257\333\321\241\271\242\341\276\364\324\234\273\247\342\375\307\235\341\347\305\211\335\221\203\274\256\227\326\360\336\345\304\273\233\353\345\244\317\241\367\350\224\275\351\275\231\225\235\231\231\230\211\232\324\255\306\311\247\212\315\263\320\227\237\215\273\314\224\363\305\367\203\206\304\351\231\261\357\314\373\303\333\246\307\241\344\331\223\344\342\240\255\242\355\223\250\266\203\314\310\314\255\255\255\332\244\316\240\330\337\343\356\365\355\261\366\260\217\326\343\265\366\267\227\244\373\220\345\271\241\365\334\253\256\255\256\227\204\376\221\245\227\257\230\232") -TOPIC_TEXT( -"\216\334\314\362\250\271\213\306\343\234\230\246\201\277\357\266\350\264\213\200\362\316\324\277\222\266\377\322\311\272\215\364\373\216\264\234\347\236\350\232\224\271\251\205\311\271\324\353\200\211\275\353\260\217\244\255\303\223\355\215\351\275\255\201\211\314\337\324\241\316\314\374\332\230\263\302\250\250\332\260\271\225\373\372\371\227\352\260\253\204\334\274\374\347\216\355\333\260\241\255\347\262\216\254\356\210\350\341\236\353\265\361\311\201\365\240\215\352\213\243\366\362\372\250\366\347\247\212\341\266\324\342\310\254\357\333\226\200\325\261\323\251\232\227\230\256\240\252\223\337\327\271\256\225\217\222\336\365\321\316\333\274\244\356\215\325\353\316\241\336\210\244\246\276\357\215\310\326\312\370\254\332\217\351\214\251\364\261\263\254\266\247\353\247\230\310\241\244\336\313\262\335\213\313\302\252\237\352\275\257\311\255\224\213\246\210\236\263\361\255\330\264\207\271\305\254\232\305\273\266\247\353\360\351\226\225\270\222\253\351\231\257\314\266\236\203\215\363\250\317\277\241\211\234\200\323\307\252\335\344\251\372\215\215\244\235\303\215\351\365\234\376\336\250\246\264\207\330\333\265\245\206\211\361\370\346\346\216\266\344\300\353\303\326\347\256\361\230\316\336\200\307\245\224\313\226\262\353\256\216\336\336\262\301\213\203\274\260\360\264\264\235\372\255\334\236\240\361\310\204\335\232\263\220\376\261\345\377\333\357\356\332\212\317\260\253\331\203\346\200\247\243\310\302\322\374\233\340\314\226\372\365\247\222\240\204\362\325\237\226\251\333\246\321\232\301\346\225\320\341\215\270\353\221\270\255\215\306\234\240\235\353\226\274\242\346\252\245\232\215") -TOPIC_TEXT( -"\230\361\352\332\354\230\334\212\311\204\340\243\264\270\330\333\335\262\214\237\363\253\370\242\206\324\311\343\327\334\231\374\237\261\231\312\332\243\233\200\247\356\304\271\271\260\361\242\375\217\305\260\264\263\346\254\342\360\333\243\234\337\251\203\243\221\215\376\270\233\344\344\311\233\254\253\345\326\325\254\213\254\325\310\253\265\202\261\222\346\344\263\374\376\210\263\317\221\263\241\324\242\344\367\204\344\236\307\344\312\275\243\343\326\353\377\232\215\302\364\330\323\244\333\260\356\232\272\377\260\275\332\221\343\206\245\234\342\373\215\342\346\311\203\243\326\364\215\227\263\274\313\320\263\213\354\246\373\305\360\315\350\207\232\260\347\376\266\232\203\337\360\334\331\370\250\303\212\275\365\252\223\232\237\363\352\346\313\223\346\331\341\213\307\334\307\235\312\311\271\313\202\332\307\244\245\311\250\234\360\307\230\225\271\370\325\353\311\264\313\331\350\323\314\271\362\336\227\250\255\264\366\351\244\313\363\265\352\245\330\214\323\305\265\330\226\345\212\221\326\267\365\226\325\352\345\264\266\321\257\257\371\320\243\324\340\241\302\337\250\266\236\313\251\243\310\371\335\225\364\315\274\303\311\352\232\306\302\203\211\344\353\277\320\222\240\323\241\253\302\373\313\220\255\267\257\353\306\256\203\217\201\311\211\377\264\327\261\372\253\312\336\301\245\257\266\335\244\274\226\274\372\336\336\347\317\355\324\362\326\212\350\322\263\276\373\330\370\207\327\325\260\366\265\352\347\330\256\220\247\351\335\230\272\261\265\311\347\254\346\337\316\247\313\243\304\362\261\343\212\343\317\351\307\222\325\322\370\361\207\265\202\352\355\336\233\223\213\326\251") -TOPIC_TEXT( -"\311\224\270\346\320\346\320\212\304\231\331\226\232\363\211\264\223\254\266\334\325\342\204\353\264\225\201\254\337\306\354\213\340\231\253\246\307\305\331\217\273\246\304\264\315\274\304\361\370\255\273\315\224\332\340\317\335\342\210\240\325\301\275\277\237\265\357\341\322\325\336\375\344\371\350\250\203\317\223\274\225\230\323\317\320\310\227\344\325\217\253\271\234\312\265\347\326\260\336\221\221\331\310\371\223\353\263\277\323\250\355\254\347\314\303\332\215\345\236\303\251\271\310\336\300\311\217\222\276\361\213\226\341\224\254\247\336\325\347\352\262\314\246\355\254\267\300\236\313\271\305\255\253\273\300\346\355\353\316\327\253\366\370\322\261\334\225\317\215\306\301\224\265\235\356\301\240\260\351\262\304\313\240\374\375\355\264\357\376\245\226\222\266\345\306\343\246\243\361\312\276\357\374\256\361\261\360\370\200\313\216\212\217\233\323\265\336\351\321\320\260\254\370\314\337\321\216\304\263\367\304\243\236\363\300\245\332\251\226\314\347\306\204\214\316\301\215\242\366\225\235\325\372\254\226\323\322\367\206\306\253\300\325\262\274\316\213\230\215\371\316\346\344\233\201\342\345\270\236\210\371\246\210\331\240\265\203\377\362\266\336\332\230\277\314\304\356\222\204\252\331\375\325\312\244\313\335\324\347\245\340\261\272\217\320\272\335\345\335\277\361\257\301\323\276\347\253\311\310\305\350\202\220\256\251\356\361\223\334\355\330\234\367\262\221\352\361\245\242\257\320\311\374\272\316\303\243\363\263\343\370\206\264\202\240\223\335\371\212\321\313\332\377\251\225\264\271\341\316\361\344\256\333\237\221\347\256\212\325\357\227\211\237\335\261\360\330\210\301\360") -TOPIC_TEXT( -"\270\271\260\275\310\356\322\265\306\234\236\243\266\214\365\316\225\234\316\334\266\242\215\330\333\335\342\234\334\273\313\240\361\344\237\301\265\244\346\303\224\317\254\260\265\233\264\225\222\261\254\305\322\231\341\222\315\207\267\234\264\223\273\277\364\340\332\365\355\261\213\230\230\246\223\233\204\344\374\325\336\374\341\244\304\216\243\367\210\202\337\322\357\331\254\270\243\252\322\345\265\351\232\222\253\301\237\260\340\261\374\304\247\335\332\261\360\270\241\274\331\360\242\224\204\234\242\216\314\316\342\242\335\340\353\365\256\220\301\202\257\256\265\275\353\354\235\352\315\250\307\312\351\277\242\375\356\351\254\362\317\360\206\376\324\271\376\304\265\211\220\367\245\237\267\261\310\370\346\354\364\226\332\310\372\335\213\217\376\236\207\210\307\200\311\357\210\202\306\254\225\232\231\317\226\351\245\361\330\322\260\252\207\274\266\224\256\234\255\265\373\210\246\335\276\216\221\323\275\330\272\230\344\376\334\227\274\336\274\276\224\213\255\261\236\217\215\364\235\257\217\365\336\321\312\351\355\326\272\374\366\266\257\257\300\325\374\342\274\226\361\310\354\224\236\367\307\343\370\374\264\215\257\310\353\246\233\256\307\367\233\256\325\260\302\256\320\357\213\304\367\226\306\346\246\377\344\264\275\361\212\306\254\225\227\251\331\310\244\326\277\326\204\252\210\217\351\314\363\352\260\302\223\226\274\346\327\227\373\224\301\366\266\342\311\313\236\276\273\210\261\223\316\216\360\260\352\302\327\262\204\360\375\252\344\245\320\362\234\344\306\240\255\213\301\343\357\233\311\354\330\225\242\373\213\263\344\346\375\204\365\214\340\236\314\365\326\215\336\302") -TOPIC_TEXT( -"\223\244\263\366\225\273\265\211\206\205\243\217\265\242\361\265\353\353\265\314\221\204\230\257\307\265\244\274\373\366\224\337\231\261\201\303\273\236\333\333\335\377\341\342\361\342\375\236\376\214\367\302\345\207\213\222\300\254\277\306\201\252\216\216\271\311\252\275\271\352\201\222\236\315\270\236\317\272\311\310\241\246\224\263\313\351\204\326\224\343\216\300\237\206\307\332\235\355\365\303\374\302\362\315\352\363\206\316\360\230\206\242\316\314\302\345\317\250\216\236\247\314\361\247\203\236\300\352\253\256\247\355\313\243\265\371\205\326\256\316\321\366\262\344\234\343\345\316\370\314\210\364\377\247\375\247\320\225\221\215\325\232\233\217\325\252\301\324\263\247\276\317\354\337\263\347\370\227\226\251\317\212\275\237\246\275\300\253\350\274\347\255\321\242\232\362\376\333\224\256\250\257\233\276\251\256\211\335\264\274\200\346\201\224\346\327\263\314\361\263\203\275\242\350\300\300\371\216\271\326\247\335\254\224\263\276\342\327\266\354\206\335\260\315\256\331\363\363\372\322\230\254\306\232\217\245\246\213\303\361\333\320\212\263\351\345\353\264\244\304\213\341\251\300\302\325\250\262\242\236\223\273\211\345\354\275\266\271\345\246\216\236\317\365\374\275\310\273\377\333\265\271\354\306\354\324\346\337\203\215\227\343\327\371\372\265\365\206\227\256\273\307\245\353\247\341\320\265\246\252\361\361\330\210\331\235\301\317\370\370\254\216\303\271\225\230\210\244\230\227\366\321\342\333\217\216\234\365\332\312\363\230\335\213\247\332\312\300\203\261\225\271\361\223\212\222\236\243\276\256\321\323\222\373\213\355\345\224\264\200\316\315\242\326\214\214\262\352\312\332") -TOPIC_TEXT( -"\244\316\202\352\314\231\212\236\363\215\244\353\353\253\211\313\351\272\360\351\274\345\253\332\210\265\343\325\365\255\236\247\314\246\332\211\204\246\316\336\322\305\234\325\336\361\370\253\223\260\256\227\312\250\310\352\274\270\260\257\352\342\267\236\315\332\351\263\262\257\247\210\321\341\350\254\340\334\236\315\374\211\260\331\315\264\274\246\251\307\220\206\374\325\303\363\370\245\337\250\234\251\206\346\361\375\340\245\270\375\222\361\200\373\272\332\263\241\333\366\252\210\304\236\313\227\256\213\367\262\365\321\343\254\250\315\340\232\225\265\315\305\343\255\342\270\235\263\314\323\267\234\275\345\212\352\276\246\377\253\274\227\307\312\210\307\233\241\355\205\216\352\305\375\355\357\376\245\363\205\244\361\231\264\337\271\207\300\351\364\302\311\245\212\232\256\204\350\361\363\222\334\337\343\324\230\250\302\372\204\352\311\372\306\222\235\251\266\233\270\222\370\260\252\346\324\357\303\270\232\347\255\207\341\227\310\245\233\271\254\341\272\363\226\230\337\332\227\337\265\220\320\361\371\336\360\330\353\375\201\275\232\216\255\366\333\353\204\300\355\332\372\234\317\207\365\240\355\325\274\362\242\241\351\326\221\275\347\335\207\235\272\264\243\301\201\222\312\313\271\231\352\302\343\253\364\336\332\315\305\276\305\343\227\322\364\301\304\205\346\241\341\377\331\234\230\232\264\306\216\260\211\230\257\304\247\360\270\324\253\340\266\333\326\251\300\315\326\335\272\271\253\324\370\236\353\361\310\344\302\374\330\241\375\272\277\263\352\355\312\344\226\221\242\344\370\366\354\322\251\200\266\343\271\267\333\355\301\366\251\225\207\367\324\330\315\260\330\311\245") -TOPIC_TEXT( -"\340\342\277\377\337\336\271\304\306\361\254\345\347\230\213\200\311\242\255\210\346\223\335\200\312\342\271\222\315\226\231\325\314\240\346\261\342\331\270\210\262\230\200\331\244\336\370\223\341\260\205\273\200\363\300\242\313\204\345\202\300\363\210\244\317\303\275\226\306\321\310\342\214\344\204\275\306\222\255\333\261\245\253\353\301\310\246\311\213\222\220\305\323\244\245\321\244\315\333\361\315\346\263\331\354\222\343\315\246\332\222\305\275\334\273\371\253\376\366\341\351\333\233\217\256\356\366\213\322\335\344\234\264\252\356\327\335\256\251\276\325\365\357\367\317\275\317\367\234\200\251\206\375\273\220\225\252\234\271\312\312\275\216\374\226\330\334\375\351\316\273\373\331\343\302\375\315\233\234\320\214\203\246\342\236\200\360\347\332\331\331\211\305\246\373\234\345\327\246\206\245\217\257\320\236\317\235\206\371\224\316\231\262\275\234\315\262\232\341\240\352\353\307\266\372\260\375\241\355\323\321\212\215\210\345\341\323\263\213\350\353\270\217\250\274\352\317\333\221\242\340\206\203\276\242\374\370\274\234\212\373\212\325\355\273\375\246\357\274\261\352\331\321\376\303\251\376\320\303\303\357\217\237\245\273\243\352\370\335\273\245\322\334\251\314\315\250\300\200\346\354\350\377\211\270\343\325\205\307\261\373\310\232\271\265\323\303\332\307\327\357\260\206\370\326\351\253\203\214\356\241\365\377\267\306\232\354\340\244\234\222\353\212\360\373\316\374\363\323\333\310\305\276\330\313\215\317\246\232\343\363\243\253\367\356\245\261\315\231\337\313\214\322\337\272\270\313\277\376\261\336\202\374\236\251\253\325\275\323\267\321\202\204\373\205\340\217\241\374\343") -TOPIC_TEXT( -"\203\277\353\255\303\351\255\206\363\352\353\237\342\225\362\260\354\322\230\377\362\205\360\230\264\353\337\250\343\274\364\267\336\371\312\256\247\367\275\212\274\236\327\272\271\307\270\222\306\310\232\301\274\226\247\263\312\351\370\271\362\266\372\303\370\324\333\367\235\217\252\330\233\243\206\303\241\262\305\207\345\370\216\276\360\330\225\370\267\204\314\236\273\255\205\231\251\203\327\252\263\264\235\203\203\304\321\233\314\314\332\221\270\324\221\274\247\250\216\371\300\345\222\313\303\266\341\271\334\200\207\346\311\372\232\234\331\222\302\302\266\343\314\330\313\363\234\374\312\303\313\216\253\301\270\237\252\327\270\316\310\337\330\265\256\222\307\315\342\327\330\354\220\204\306\250\302\316\241\232\217\352\225\347\312\231\312\203\216\236\252\245\260\342\232\332\201\251\213\323\362\366\202\355\221\220\327\272\362\242\327\217\221\203\345\303\210\200\216\325\313\252\343\332\223\243\211\250\264\203\276\314\314\314\267\214\215\215\345\236\215\346\277\236\335\340\347\307\227\217\243\214\215\366\241\223\200\367\257\354\310\301\263\347\317\214\336\215\366\317\315\317\261\320\302\244\243\373\260\304\210\215\263\311\265\274\376\274\302\370\235\227\326\340\217\307\253\335\362\235\327\347\347\246\261\215\213\323\371\324\340\232\244\254\306\310\205\357\235\327\271\241\333\203\320\315\215\353\374\212\273\353\220\215\243\211\340\243\264\205\343\244\331\311\220\242\206\345\222\274\370\214\232\234\333\236\276\331\365\353\254\253\311\200\247\345\334\352\204\222\200\206\255\263\337\257\340\254\365\341\370\201\212\344\274\243\326\346\261\304\250\207\234\274\355\324\342\334\361\265") -TOPIC_TEXT( -"\273\232\345\236\206\303\346\311\276\372\326\303\373\261\312\222\330\251\227\360\230\365\211\274\224\212\350\225\327\357\370\264\324\310\243\211\370\324\362\276\230\342\307\315\366\347\266\263\263\242\372\357\231\306\342\340\363\343\332\232\217\241\222\317\241\222\224\304\227\245\237\376\206\225\252\266\261\366\352\371\235\370\267\354\205\273\265\216\307\306\264\364\357\372\224\305\223\206\300\220\305\377\304\236\216\350\233\225\324\353\261\371\272\211\226\271\231\210\230\336\252\230\375\233\330\312\367\272\302\202\346\342\203\206\222\312\215\313\214\334\274\362\326\333\357\236\346\273\262\215\321\361\265\214\334\215\355\355\356\334\372\356\363\314\353\215\207\266\375\344\376\247\333\353\353\353\367\355\217\335\363\277\247\317\305\306\242\277\367\372\261\215\332\274\356\373\372\203\321\273\375\334\303\250\372\277\315\347\235\311\270\376\276\250\357\265\247\263\312\201\347\310\215\374\253\241\331\347\271\306\263\242\207\332\302\271\200\377\231\217\222\373\330\345\254\331\203\236\325\212\350\220\327\274\246\317\206\336\361\211\353\305\270\365\335\210\331\242\227\202\354\310\206\222\365\216\305\376\343\327\316\235\343\314\354\236\353\265\252\250\350\324\265\303\356\215\342\335\311\261\374\201\321\316\374\362\277\231\327\340\350\343\276\323\271\317\245\236\273\212\241\253\357\306\255\221\270\302\302\317\354\351\327\320\215\266\255\272\267\255\340\267\263\327\254\234\341\210\307\320\351\327\344\326\236\223\334\374\211\304\364\375\316\354\362\273\242\322\226\364\207\222\210\344\272\266\304\315\233\325\363\372\360\270\256\267\224\231\337\271\356\324\202\236\353\213\245\337\203\232") -TOPIC_TEXT( -"\302\200\310\252\203\306\342\210\250\376\336\353\315\274\204\312\352\234\257\313\260\321\206\254\314\316\306\320\245\354\255\303\342\256\370\220\312\250\317\207\200\220\372\257\234\273\203\356\376\215\356\267\266\203\204\277\276\364\204\372\377\357\326\232\325\352\202\331\276\353\201\263\300\232\217\220\354\365\202\230\357\307\247\255\341\261\314\322\323\237\254\262\336\366\252\337\322\306\270\221\272\344\320\362\202\240\243\261\210\330\326\364\264\375\323\332\334\364\301\273\273\306\356\256\253\310\351\227\272\204\333\366\330\334\314\236\327\273\356\250\332\302\222\213\270\313\375\313\373\311\255\341\226\347\272\230\217\313\266\342\211\370\300\314\302\356\377\351\365\233\272\362\363\373\351\341\275\272\200\312\210\344\256\221\223\224\332\367\275\206\306\277\313\304\370\376\206\274\306\335\301\350\214\211\217\211\370\234\300\303\210\307\227\207\325\262\271\256\354\253\236\327\262\270\257\231\373\255\207\326\340\353\241\256\326\253\216\256\307\346\346\254\234\201\227\255\221\203\243\253\273\300\330\311\274\264\345\300\260\241\313\213\261\300\263\227\326\230\343\253\222\232\275\207\326\322\313\302\310\301\242\245\244\255\266\270\272\261\347\232\341\312\277\273\277\362\247\257\373\253\263\235\250\374\316\241\377\337\277\365\326\233\365\365\217\365\277\331\263\235\230\340\340\200\263\250\372\370\240\333\343\225\215\353\334\373\234\316\355\316\274\242\327\210\207\272\321\241\204\227\306\347\241\242\267\364\366\334\270\370\366\201\360\235\310\372\352\322\302\346\301\201\310\347\331\375\301\323\234\272\250\310\262\361\262\351\250\213\201\340\275\223\327\334\227\377\343\340\330\207") -TOPIC_TEXT( -"\356\212\300\246\246\357\275\317\370\354\365\372\274\244\375\261\331\335\260\261\205\203\311\213\264\375\221\335\262\305\346\224\220\267\226\324\316\273\222\212\207\260\266\336\336\357\256\266\343\237\321\211\303\321\212\327\355\325\360\354\275\327\213\217\215\376\342\235\222\367\205\323\220\276\276\330\212\325\327\334\336\277\341\345\334\371\347\254\263\365\237\362\314\217\374\344\334\344\344\341\366\242\360\302\266\314\314\241\310\335\376\316\375\265\326\200\200\215\362\214\203\334\311\360\270\204\343\227\313\370\270\370\233\351\275\213\310\362\222\227\307\205\251\315\330\314\317\367\345\227\317\252\357\277\226\252\300\274\353\347\316\340\263\300\362\335\313\207\214\215\212\327\373\212\247\235\357\215\245\342\361\332\366\276\200\206\337\252\273\357\213\232\372\251\200\261\350\262\307\344\313\363\255\245\235\235\205\322\264\320\356\213\307\355\271\370\204\357\300\202\203\311\237\352\350\210\250\307\255\344\365\212\233\322\261\302\320\251\215\201\243\347\226\202\234\202\370\261\250\310\335\300\332\262\360\320\264\263\361\351\351\230\231\357\222\246\336\200\264\274\321\361\270\270\214\377\343\327\312\367\247\347\301\360\260\203\311\303\346\256\255\255\235\223\270\355\205\213\307\351\375\201\273\252\203\252\354\251\270\306\315\214\203\361\235\362\332\372\216\341\251\265\373\360\270\306\244\246\360\330\235\265\377\317\370\372\320\212\231\322\227\233\305\312\265\263\321\211\253\302\327\207\324\256\334\332\331\200\261\234\216\360\314\256\332\223\274\270\327\200\364\213\301\343\312\374\277\235\315\237\231\253\251\276\264\224\276\212\310\312\303\373\231\354\311\260\340\246\306\324") -TOPIC_TEXT( -"\245\323\303\346\250\377\235\200\303\310\252\361\356\362\255\226\335\304\311\263\264\231\261\352\256\222\220\261\254\262\263\266\363\274\364\206\257\246\213\273\274\201\353\211\313\247\373\377\273\257\347\273\323\212\216\366\356\314\207\353\307\216\234\364\375\215\375\265\323\224\310\370\320\311\211\243\307\217\356\377\333\213\343\227\366\327\335\344\366\271\232\366\234\310\360\221\263\222\340\232\341\356\330\253\373\252\372\375\205\257\262\320\253\214\301\354\266\267\335\220\367\307\253\307\216\330\226\225\304\343\237\327\210\333\303\323\267\313\304\230\252\345\324\313\357\300\235\370\240\224\222\207\217\306\215\317\376\251\377\375\257\302\273\356\272\363\371\271\301\343\364\326\340\321\236\217\265\254\362\252\201\245\336\236\377\361\312\276\250\314\301\327\270\306\367\370\211\310\353\211\351\372\204\364\366\354\337\353\322\323\276\370\354\354\337\351\234\223\202\375\364\352\377\355\257\332\273\327\312\212\327\276\230\337\344\341\274\302\320\205\203\223\343\211\214\362\321\253\327\314\243\302\247\346\227\360\330\364\354\274\301\256\326\275\276\355\260\325\354\222\260\254\301\230\314\302\206\340\217\276\375\362\247\230\231\242\311\216\250\330\343\246\225\305\360\201\356\242\352\237\307\245\245\226\246\235\275\372\256\355\247\302\307\313\374\360\250\317\261\360\365\241\274\367\345\272\360\332\274\371\330\263\236\321\340\212\220\313\311\263\347\317\265\367\202\344\310\353\237\350\316\335\356\320\272\331\256\270\224\316\270\371\215\300\303\261\342\357\315\202\371\260\326\227\217\257\265\265\314\264\234\330\306\325\310\250\326\220\257\245\371\316\325\253\203\265\251\275\316\347") -TOPIC_TEXT( -"\315\254\307\336\271\330\323\243\236\316\257\251\235\320\315\265\307\320\350\222\371\360\371\376\312\230\236\215\314\231\351\263\233\363\343\237\321\326\250\305\313\302\304\374\334\226\270\321\366\357\201\336\275\266\344\215\225\227\316\223\326\353\300\314\257\313\243\212\322\336\214\372\341\240\203\356\335\304\312\236\301\230\347\357\213\227\375\205\244\251\355\367\204\233\202\350\244\357\233\371\300\343\375\242\351\324\247\326\333\362\232\246\347\343\273\316\305\364\363\211\250\365\337\360\302\350\252\352\230\350\226\233\374\216\223\225\207\367\335\246\206\376\333\322\236\337\243\374\336\232\244\203\236\351\355\253\354\353\223\355\363\343\356\327\226\222\375\325\211\372\350\321\261\274\336\300\251\222\267\327\254\321\272\357\224\356\246\250\241\254\307\204\217\245\303\350\252\354\263\232\240\372\334\307\242\256\261\313\320\332\226\214\215\241\367\211\272\300\354\334\206\316\310\344\325\310\366\222\302\233\201\327\344\310\264\314\266\244\224\275\354\326\226\222\217\235\357\323\334\274\241\202\213\243\217\200\222\333\242\256\237\217\276\320\255\331\260\274\316\253\217\261\265\220\265\267\316\242\311\222\215\261\320\242\343\260\221\301\343\237\336\244\203\257\214\333\350\253\356\342\236\245\237\327\241\267\276\352\331\325\356\216\257\336\356\371\375\304\361\343\314\327\256\336\316\312\261\256\217\302\371\335\340\301\247\224\326\235\273\327\310\344\304\313\276\202\335\322\370\363\220\264\206\222\276\371\362\306\201\252\343\331\350\221\370\214\320\365\372\212\267\307\373\245\327\216\350\343\376\270\341\356\331\222\320\352\267\270\353\325\242\232\232\234\332\347\310\200\346\336") -TOPIC_TEXT( -"\237\254\267\222\266\266\341\376\354\237\270\347\207\337\232\217\277\335\271\365\252\255\250\236\215\272\316\367\375\373\231\254\352\206\315\311\265\361\261\364\335\334\362\227\256\275\217\245\344\342\301\324\236\343\273\345\247\306\230\345\346\230\301\214\235\331\273\230\273\214\251\306\360\220\234\310\214\246\314\370\221\270\266\200\207\341\334\206\242\243\225\360\260\244\232\316\242\255\312\243\237\260\214\243\263\331\300\370\355\214\362\307\262\227\337\250\334\345\376\357\372\336\303\304\212\316\276\237\275\375\367\376\273\234\312\356\356\334\267\372\346\257\377\351\277\234\325\300\250\355\312\363\345\342\267\361\321\337\237\254\372\355\332\365\212\204\315\344\202\226\252\252\332\332\350\340\353\314\367\274\357\222\304\253\314\330\250\374\372\267\223\357\264\325\247\201\307\346\271\226\340\245\336\267\342\321\361\223\307\217\230\236\273\362\360\343\313\353\307\356\216\373\372\255\330\365\224\322\235\227\234\217\245\272\310\360\360\251\255\375\205\315\244\246\335\307\202\235\203\227\220\247\246\357\271\361\230\322\260\365\274\253\202\217\323\266\231\230\321\201\242\337\265\340\357\360\275\273\363\334\204\225\352\312\306\263\331\351\367\214\371\255\217\301\216\346\347\325\207\251\234\245\251\353\211\236\362\344\346\232\325\315\202\273\253\306\256\241\206\313\344\265\320\331\230\335\265\300\300\231\326\232\225\273\336\255\372\225\271\206\370\334\341\304\332\363\220\323\240\217\275\337\301\272\246\302\251\212\230\370\214\204\317\232\225\360\331\374\232\371\260\330\262\226\263\303\242\351\307\274\241\306\317\366\305\371\202\334\227\265\306\222\235\262\252\213\224\243\251\263") -TOPIC_TEXT( -"\324\241\235\233\253\211\307\213\363\323\337\206\257\357\336\236\233\262\350\242\217\260\320\365\275\325\307\337\322\311\370\237\273\332\260\276\245\236\237\334\237\347\324\245\370\265\204\275\217\300\226\330\226\371\237\277\374\213\364\270\321\252\330\336\301\305\341\300\343\274\203\374\344\304\205\320\202\317\200\307\317\264\306\305\323\273\371\307\333\241\375\351\362\321\302\220\257\262\347\273\220\210\332\256\216\223\331\333\351\350\364\313\335\273\257\230\357\212\213\245\307\343\300\332\312\260\272\360\360\221\210\261\340\311\204\361\311\332\231\276\350\364\262\261\356\207\371\264\361\205\344\340\245\226\351\252\223\332\301\370\234\270\201\315\246\232\257\227\337\303\226\306\317\314\270\346\350\364\327\277\300\204\203\226\237\334\323\365\211\311\212\306\376\374\314\350\331\317\373\330\355\273\343\333\312\353\237\355\363\232\354\326\371\346\232\225\245\272\331\365\353\367\257\374\325\325\363\253\264\374\370\234\267\204\304\227\255\351\352\311\333\321\366\341\326\246\361\321\225\207\323\213\346\302\251\207\270\215\322\253\330\274\272\361\270\225\212\312\201\317\200\245\324\227\325\257\237\217\205\206\253\214\223\307\266\307\227\227\240\270\347\373\366\356\341\350\260\217\234\257\371\256\310\313\331\244\373\233\353\252\255\366\361\230\275\202\336\206\261\354\245\275\204\357\354\353\253\361\334\357\260\337\221\274\346\342\260\313\220\277\252\310\370\306\344\333\363\357\346\235\355\241\263\256\300\372\215\357\320\201\233\353\336\271\205\356\317\332\377\263\376\347\325\262\242\255\345\347\221\207\232\232\242\343\303\336\211\252\343\310\367\330\353\211\312\257\206\236\272\214") -TOPIC_TEXT( -"\303\350\321\274\302\367\360\245\222\352\377\322\235\336\217\301\303\272\372\235\350\233\271\272\341\361\353\270\365\353\231\334\364\325\315\333\334\330\305\326\332\362\224\215\333\273\314\326\306\216\331\343\334\331\325\305\234\261\207\315\243\365\235\216\330\347\367\363\216\377\262\322\365\253\257\331\301\227\316\367\325\342\356\325\327\340\322\274\335\277\252\263\325\345\347\366\271\276\311\310\350\327\215\317\264\277\244\362\360\306\326\301\350\342\315\267\354\331\302\317\351\215\356\365\237\356\312\222\372\230\233\306\306\306\234\313\225\317\364\316\244\340\263\226\311\305\351\343\373\367\347\223\323\303\313\311\304\344\250\261\216\245\205\254\242\317\271\236\302\276\331\377\370\227\260\215\347\225\300\346\222\324\251\220\277\320\205\262\241\207\317\251\265\376\246\310\374\226\272\275\232\344\376\360\232\233\207\241\205\344\321\253\301\243\212\347\213\202\232\314\322\221\300\273\262\370\366\354\353\215\315\326\355\355\301\271\301\263\313\256\301\362\352\211\226\247\262\260\273\212\337\224\265\354\271\302\307\310\247\311\262\372\233\233\225\261\200\313\366\232\327\260\311\223\333\275\305\316\222\257\367\363\373\216\266\312\325\255\274\200\376\342\260\350\211\343\307\350\265\277\305\334\235\273\206\202\202\251\207\313\267\210\327\335\240\225\261\352\253\255\352\374\314\372\363\300\241\244\377\317\374\350\207\264\347\212\215\216\201\307\332\373\314\243\212\332\327\323\311\254\215\337\273\247\311\351\235\217\323\266\362\206\270\261\236\367\221\370\302\372\357\315\362\210\217\345\257\266\355\210\316\374\332\372\316\306\354\246\337\351\270\375\252\352\377\265\272\261\360\370") -TOPIC_TEXT( -"\301\275\274\305\266\277\270\233\270\227\307\270\217\270\273\342\324\223\312\361\303\343\222\200\276\321\243\327\363\326\232\370\214\362\376\330\232\264\306\234\211\346\206\201\234\362\223\274\266\270\344\201\205\222\376\311\340\256\274\370\254\263\204\322\324\277\310\334\316\327\276\371\214\345\210\205\224\276\347\264\271\346\237\342\343\232\261\207\365\264\353\272\340\370\237\263\332\310\357\341\213\300\227\205\211\337\223\312\256\330\337\310\233\241\200\323\365\324\243\310\276\362\367\310\333\370\211\234\210\367\255\210\271\244\345\362\277\202\274\313\213\261\324\302\264\270\300\357\201\214\320\365\374\354\257\310\266\246\363\237\346\345\276\343\347\352\274\215\242\275\226\366\312\310\344\204\264\362\247\252\245\267\202\266\311\232\317\217\277\374\362\231\366\351\224\227\305\214\236\321\324\352\257\225\224\261\353\277\332\252\216\325\267\262\261\244\357\310\241\205\240\245\230\316\206\321\271\303\364\367\334\337\273\225\364\355\302\332\255\212\364\232\357\243\263\233\277\253\341\337\335\341\312\322\202\334\326\210\211\224\266\260\304\273\227\373\231\234\312\362\347\312\240\375\353\300\341\317\316\325\235\320\212\212\306\343\207\361\205\232\332\344\276\337\256\232\300\247\242\276\320\353\222\320\364\247\365\324\247\243\355\307\361\310\205\264\226\367\225\362\333\301\207\313\372\277\340\254\217\274\277\236\272\271\247\222\265\227\256\274\271\326\263\331\347\356\300\377\263\323\236\274\346\307\355\312\272\247\353\266\354\342\341\376\312\357\256\256\332\330\373\377\352\317\222\200\356\353\212\321\246\256\226\367\337\367\257\356\354\323\205\245\244\234\274\247\247\340\251\340") -TOPIC_TEXT( -"\221\344\246\340\375\323\362\325\242\355\203\223\246\276\334\340\222\312\354\345\344\371\301\335\347\313\307\373\354\331\323\343\241\263\374\341\332\346\277\253\315\314\331\364\366\301\251\302\376\272\276\366\355\334\271\230\260\340\367\240\276\276\276\210\352\230\355\242\313\330\270\370\234\266\334\373\237\252\221\301\203\345\200\246\344\276\332\354\310\237\200\277\336\311\347\333\354\266\315\206\372\244\246\227\345\274\315\234\265\206\224\234\351\220\264\245\307\272\200\311\221\237\332\365\346\350\361\377\266\270\334\224\327\202\363\254\302\313\255\311\331\357\357\375\272\317\211\261\240\322\272\273\336\310\364\304\243\343\303\272\346\337\374\377\357\333\265\266\226\350\275\354\332\246\240\240\344\334\224\235\272\357\325\223\336\365\366\333\227\233\244\237\301\320\344\233\354\277\352\371\353\301\316\270\200\273\340\374\354\224\326\204\212\266\357\317\221\342\275\261\263\354\327\271\333\307\335\245\316\216\264\236\251\325\204\317\207\337\335\247\236\277\224\354\272\234\361\330\225\273\223\271\267\210\274\226\203\266\232\355\332\304\323\213\272\373\270\332\277\343\343\237\317\364\223\225\241\300\226\337\273\224\220\274\241\337\214\376\353\374\233\352\373\225\363\355\226\204\352\372\245\276\203\234\343\372\365\257\263\336\370\354\372\262\361\344\355\253\364\377\376\370\241\321\262\263\335\275\317\207\344\314\254\304\225\233\202\234\271\253\367\375\354\325\235\311\341\343\361\225\343\242\204\362\221\242\211\236\266\216\207\251\273\313\367\323\314\277\237\316\306\342\367\341\362\332\374\314\215\362\200\306\376\300\246\367\211\271\370\231\273\270\362\365\254\367\351\216\333\374") -TOPIC_TEXT( -"\214\321\246\240\267\345\230\354\363\307\210\331\270\263\265\324\270\372\275\232\270\260\352\357\335\372\357\350\340\376\340\301\341\227\306\226\326\264\366\233\232\217\304\251\334\370\337\356\217\311\327\272\221\344\223\202\347\300\331\265\275\364\356\352\314\327\310\234\224\356\260\331\272\267\212\207\361\347\321\365\222\362\235\321\370\354\344\311\302\213\213\351\352\237\325\245\224\372\226\371\347\333\207\270\310\263\266\236\265\240\364\337\336\275\334\342\331\201\335\271\370\304\355\240\342\371\224\234\327\232\315\314\333\267\316\314\332\305\204\323\365\354\337\217\276\277\210\321\252\274\376\342\364\342\232\370\372\246\301\230\262\220\357\351\234\217\217\233\355\300\201\325\257\276\252\255\236\273\367\351\267\254\370\234\371\361\261\267\263\266\236\213\225\251\302\320\226\353\335\335\247\312\213\235\246\367\372\260\327\274\277\256\263\307\263\310\327\370\226\314\361\201\344\231\226\261\344\246\205\320\306\335\350\334\270\261\223\371\255\265\347\316\202\315\341\361\254\226\253\237\314\236\227\327\346\310\327\253\375\227\303\256\365\305\266\223\314\371\354\364\215\306\277\272\222\376\247\373\250\226\314\255\264\231\375\261\364\375\332\321\245\211\224\313\215\374\256\365\271\372\313\363\253\231\367\323\345\302\211\202\215\353\234\220\264\373\231\232\303\220\211\203\265\350\265\205\201\365\244\332\260\302\266\216\245\224\322\212\354\375\223\351\267\333\313\205\234\363\347\316\235\261\254\253\361\336\377\357\333\363\345\246\311\264\355\372\221\314\314\242\206\237\244\363\267\357\302\236\301\302\261\334\240\220\220\217\307\351\376\250\346\343\330\210\344\353\254\215\333\245") -TOPIC_TEXT( -"\226\334\225\321\223\205\315\264\210\332\312\302\331\340\342\266\216\223\201\321\226\366\321\216\276\345\305\264\345\365\224\313\363\376\205\220\346\210\217\255\207\321\257\204\312\256\361\303\256\372\332\236\237\353\360\302\343\243\262\234\371\225\347\311\221\350\213\324\270\230\343\364\347\321\340\372\327\374\304\260\347\315\362\337\377\322\216\370\237\267\340\366\353\222\256\232\217\203\367\324\277\374\250\255\216\375\257\353\323\377\317\322\257\250\313\231\302\271\316\234\237\301\313\353\220\334\210\352\274\356\200\236\353\225\345\262\233\201\320\354\364\214\336\344\261\370\214\274\366\355\244\326\270\353\231\240\265\362\274\276\362\275\351\322\353\267\370\217\345\305\365\343\333\267\356\311\304\215\323\330\324\371\315\224\233\246\220\367\342\243\307\227\262\372\336\276\235\234\214\323\271\207\314\256\323\347\301\333\214\256\225\222\260\376\216\360\270\266\377\371\312\314\314\310\213\200\267\307\362\220\343\274\200\341\374\254\304\346\370\234\215\203\204\376\227\202\264\301\262\365\211\330\220\270\214\373\205\244\371\265\260\255\375\254\317\250\302\241\224\320\302\251\332\200\313\243\332\320\304\362\303\224\376\325\217\213\354\377\355\276\227\376\336\255\364\356\272\265\362\271\354\325\224\315\225\223\334\211\253\272\245\326\260\217\275\215\366\365\366\334\270\370\375\366\214\361\370\344\321\243\224\336\245\350\331\255\212\353\217\310\203\213\364\304\205\265\307\225\354\302\360\212\332\332\373\363\355\203\355\275\303\330\352\255\332\316\303\225\256\374\373\351\310\277\307\253\263\360\241\352\276\202\226\253\273\306\327\337\224\267\374\257\277\342\316\337\216\301\267\306") -TOPIC_TEXT( -"\241\250\204\355\320\245\361\261\336\227\372\354\234\250\353\362\260\333\355\375\331\273\325\223\331\252\270\343\372\361\361\307\343\263\261\267\217\227\321\363\256\327\370\242\217\336\220\372\364\371\210\226\233\230\337\231\324\254\365\237\272\307\337\250\304\326\272\370\214\355\333\365\315\252\302\230\363\323\216\220\256\325\255\370\352\300\255\217\367\232\266\347\345\305\343\347\271\276\336\277\344\203\307\367\246\372\321\234\301\366\262\366\242\254\233\200\326\361\262\224\317\226\332\333\371\247\247\207\231\303\306\300\310\371\255\357\307\203\205\255\272\206\264\367\266\202\305\217\227\347\277\375\301\360\321\330\365\330\347\274\251\316\321\266\250\357\223\204\272\227\274\340\272\265\303\306\351\220\231\217\303\211\245\314\202\266\226\346\363\316\265\324\222\313\341\202\361\321\327\203\244\332\323\253\220\262\317\366\257\337\320\373\227\207\320\303\254\252\337\346\234\210\306\252\330\354\275\336\335\214\333\323\254\303\377\321\311\301\256\216\353\227\200\257\334\204\241\337\353\353\303\271\322\374\271\226\235\317\210\321\326\347\343\240\313\274\233\345\214\355\210\265\226\250\223\271\332\225\345\210\220\262\253\250\311\377\331\227\272\255\302\322\261\217\340\230\236\303\223\202\210\353\213\357\205\302\234\336\347\371\237\350\372\372\356\220\266\314\233\323\227\233\376\212\372\263\256\235\235\317\354\325\231\273\300\343\252\221\303\203\234\256\211\244\251\346\332\264\330\275\324\320\320\227\341\305\343\354\234\270\373\253\272\272\207\345\205\336\270\272\316\364\276\210\232\267\262\331\313\321\273\336\260\353\375\372\220\277\214\365\266\363\267\250\250\335\361\335\226\253") -TOPIC_TEXT( -"\364\366\310\220\311\273\360\330\213\361\324\330\374\273\341\233\361\245\217\235\240\353\243\272\256\232\227\217\235\305\232\227\227\220\343\217\347\223\321\316\202\337\346\237\354\314\264\235\206\254\352\264\356\373\272\353\313\303\227\246\303\234\250\267\244\367\373\242\234\223\356\326\324\374\331\322\324\246\273\344\312\326\372\330\201\376\371\255\323\232\211\216\245\230\323\347\316\260\356\366\346\210\233\235\313\360\230\370\364\242\231\370\200\370\210\274\274\375\263\252\370\334\337\347\341\232\270\344\370\214\363\307\330\350\335\215\247\227\327\307\213\373\372\327\367\301\327\253\345\301\331\342\247\274\223\246\330\270\235\342\361\250\253\241\224\331\250\222\221\366\232\233\237\364\332\254\325\245\221\313\217\237\302\362\266\350\274\231\373\231\341\243\225\207\361\372\334\361\361\343\225\304\372\255\203\316\316\246\325\212\231\206\334\343\220\214\346\331\377\267\234\350\217\244\303\242\305\226\222\231\272\204\203\266\355\321\371\265\367\216\203\265\367\320\352\342\223\333\332\273\307\362\251\226\336\344\206\364\251\261\340\200\236\263\323\371\332\344\332\233\311\362\322\245\366\263\247\270\342\235\371\316\213\302\365\277\362\272\367\275\204\377\204\225\337\347\233\247\323\370\234\356\374\205\233\227\273\266\375\223\216\336\351\247\310\236\277\375\370\213\336\347\246\377\375\354\277\335\221\330\360\357\217\304\272\327\203\307\306\262\267\213\355\274\244\316\322\265\206\336\247\372\260\263\243\234\350\203\225\206\377\230\316\224\355\203\307\300\262\355\330\234\222\271\342\333\215\333\271\307\273\216\373\200\256\277\215\367\226\201\307\371\317\214\377\202\307\370\217\211") -TOPIC_TEXT( -"\370\324\236\352\335\306\307\227\333\317\366\275\331\375\357\226\305\305\367\217\277\375\354\307\253\330\274\315\245\343\311\371\265\267\337\227\273\213\321\341\213\347\370\276\354\275\363\235\364\330\310\341\335\240\243\321\207\367\306\222\251\333\204\231\307\363\204\364\374\205\234\374\362\227\333\204\214\266\204\206\267\263\205\321\237\316\304\336\263\274\270\332\324\214\217\235\315\270\274\367\313\210\307\370\263\306\365\220\364\354\336\271\335\213\320\357\273\306\256\265\376\336\257\206\355\343\227\357\325\345\365\247\305\320\240\243\242\202\351\340\261\252\215\215\270\224\250\334\353\354\234\216\361\270\245\224\320\312\251\350\242\263\251\312\225\230\223\230\313\261\240\314\233\275\274\347\354\345\376\251\215\215\215\330\305\361\265\251\324\212\233\231\254\277\236\242\355\337\236\341\321\366\245\330\221\264\331\246\375\306\335\242\204\361\207\337\352\207\304\271\356\315\372\342\357\315\277\215\203\314\327\274\204\376\273\362\313\244\232\220\275\204\336\207\264\366\334\361\211\275\223\207\246\230\275\232\336\340\331\216\306\236\344\214\323\374\370\273\320\257\374\363\341\333\375\342\240\315\365\333\202\212\230\225\302\213\310\204\336\227\323\340\244\273\347\371\371\353\337\201\307\260\243\344\320\305\275\270\274\347\301\264\254\200\342\236\237\276\371\322\253\216\361\257\336\371\375\347\336\237\337\272\262\261\336\245\323\213\374\242\352\236\231\362\214\325\371\331\252\337\347\351\376\305\262\372\325\330\332\341\261\360\341\257\217\260\373\311\332\201\275\307\327\207\316\263\357\226\357\355\261\306\343\367\355\270\315\322\233\313\270\242\236\233\362\314\333\254\212\356") -TOPIC_TEXT( -"\305\306\376\334\302\342\325\345\216\363\230\340\343\215\311\310\311\377\377\260\227\231\335\377\376\317\367\233\377\354\317\376\346\317\245\377\224\237\257\377\365\253\236\243\203\315\253\213\202\354\367\323\265\202\274\250\353\203\304\335\317\224\314\361\347\261\227\224\354\217\315\276\262\237\342\377\233\363\204\325\301\343\353\214\333\312\341\222\342\261\245\376\365\344\334\233\350\340\265\204\232\375\232\322\256\211\332\357\220\376\324\371\222\351\306\367\201\312\212\214\302\305\231\306\330\213\330\270\262\236\225\357\213\222\220\217\303\211\241\245\374\302\367\341\342\327\347\374\321\312\203\351\235\350\307\215\223\324\252\376\364\271\354\352\233\371\342\206\237\301\233\265\361\326\222\207\371\244\357\327\236\210\237\374\361\220\213\377\243\237\375\210\233\334\243\262\315\300\302\322\202\263\370\216\362\246\260\237\374\352\360\212\372\314\303\203\241\301\350\230\315\356\360\366\225\263\325\204\316\336\306\213\215\300\372\246\310\231\247\324\251\344\341\314\361\346\272\317\364\311\352\361\375\241\377\314\257\234\363\264\267\321\304\220\232\251\272\363\243\326\237\362\275\312\244\266\216\226\234\332\341\222\361\230\335\313\226\313\212\266\217\346\246\263\247\277\350\353\367\371\271\256\344\303\207\233\360\353\346\221\265\217\353\301\267\255\257\313\366\353\214\312\224\343\234\354\332\237\274\314\360\317\347\270\353\206\237\262\214\334\321\303\260\224\225\204\241\212\270\360\200\347\352\370\306\250\316\245\371\206\236\377\315\356\342\273\227\361\305\220\265\245\371\256\370\334\220\353\322\270\341\377\356\241\313\363\352\310\305\242\330\305\335\362\350\223\324\254\220\254") -TOPIC_TEXT( -"\262\370\335\343\377\330\364\307\377\324\271\372\257\337\347\356\216\357\337\375\305\267\276\371\215\255\266\336\306\211\372\267\344\302\241\313\212\300\362\351\343\244\376\226\212\307\232\220\353\326\323\215\307\370\334\365\261\370\357\321\217\256\337\311\335\275\377\207\355\331\305\210\361\352\221\351\321\252\236\316\217\273\303\232\365\363\316\340\346\323\337\355\363\250\343\200\312\306\250\313\255\310\356\256\306\265\274\236\313\252\372\205\205\222\273\212\217\354\224\370\346\206\224\236\257\337\317\351\345\246\216\200\327\335\273\367\203\331\253\351\277\310\207\354\223\215\340\306\222\264\274\224\201\207\262\351\311\314\317\236\306\201\222\272\350\217\343\235\370\205\334\372\333\247\237\374\312\212\326\323\375\273\236\317\357\350\306\205\250\312\360\325\315\343\257\207\270\262\217\346\264\325\233\377\357\201\305\225\327\353\231\352\327\320\237\264\261\266\310\306\264\342\317\260\372\247\337\377\364\311\223\330\370\372\241\360\227\214\237\311\313\212\256\377\271\324\377\376\241\327\327\202\237\323\376\272\360\307\276\213\352\243\365\271\270\370\277\214\271\360\247\274\214\366\307\326\343\370\313\333\372\350\375\220\250\240\221\331\271\361\270\344\242\242\335\367\310\370\357\227\256\223\332\214\234\347\360\357\334\241\262\237\210\202\214\354\211\314\242\317\266\240\354\231\340\374\362\327\277\242\361\201\231\317\346\252\253\331\367\300\354\264\315\332\301\237\374\212\347\246\327\351\211\351\327\372\231\310\353\274\302\374\243\265\323\327\206\300\222\242\252\247\232\277\257\330\355\345\220\362\275\314\206\307\343\331\305\317\302\257\312\363\363\263\274\350\217\345\217\264") -TOPIC_TEXT( -"\367\317\242\315\305\346\370\260\347\267\363\361\324\265\215\274\367\311\235\235\306\257\310\225\370\223\242\375\236\366\352\241\270\342\314\332\273\276\250\345\361\215\354\257\220\312\206\223\256\325\223\222\325\333\374\340\353\363\253\325\325\272\305\332\217\266\214\263\326\365\313\210\370\323\232\262\266\361\205\216\320\314\310\243\207\352\217\351\265\301\330\346\315\240\326\330\360\342\322\261\343\311\261\337\371\200\300\353\314\314\327\274\366\365\325\223\337\313\302\207\302\353\206\217\320\246\205\375\242\215\301\225\201\271\336\352\352\340\346\223\255\232\353\315\321\241\273\265\251\225\373\305\365\327\210\270\347\332\331\321\362\366\300\240\355\307\203\271\371\364\360\350\344\374\250\235\212\320\367\262\242\277\367\353\376\275\355\277\212\202\307\340\305\340\252\227\200\237\325\303\255\302\244\247\366\211\303\336\317\211\374\321\331\333\257\352\205\371\323\301\205\203\264\234\353\254\346\364\333\210\222\234\217\311\245\242\206\221\352\245\260\300\361\262\253\236\363\343\361\333\344\333\237\334\352\251\356\311\236\364\315\227\353\321\255\317\326\354\362\225\304\354\347\370\350\212\355\302\367\320\314\371\331\247\342\213\351\303\315\245\325\214\230\342\217\275\350\341\342\213\305\343\356\350\215\315\353\312\343\247\256\245\263\373\317\220\364\350\311\312\337\354\247\206\353\313\210\362\356\230\205\271\244\223\364\304\342\237\203\313\267\332\226\355\334\321\353\365\213\211\245\350\321\213\343\263\236\274\371\304\245\245\206\274\374\317\231\241\247\223\271\221\344\342\262\352\227\221\322\320\236\275\373\232\312\245\314\230\251\225\246\224\214\365\354\316\207\370\272\331") -TOPIC_TEXT( -"\363\301\304\343\272\300\357\354\354\344\314\251\214\304\211\302\330\254\237\366\220\357\212\307\336\361\377\220\353\274\375\344\277\310\367\202\306\234\221\334\320\266\240\273\303\342\225\352\321\221\307\212\277\240\247\275\361\372\330\302\274\272\336\334\364\241\243\373\263\366\253\263\332\304\360\274\276\366\344\333\201\263\243\371\361\230\262\261\323\237\263\360\316\352\322\305\375\255\263\242\343\366\265\236\364\302\212\345\260\223\236\226\354\360\325\305\250\240\267\210\255\275\361\227\342\355\240\322\311\377\236\373\341\363\343\314\331\312\233\316\314\306\207\250\275\356\261\274\371\310\252\204\316\253\360\352\315\202\352\217\363\312\352\312\343\276\247\361\305\337\363\377\365\337\376\271\375\237\253\204\226\327\275\336\304\313\324\223\335\310\260\325\350\372\334\303\303\353\231\357\254\316\342\377\372\371\377\237\232\337\213\371\245\207\231\334\335\204\265\233\323\344\267\330\366\211\222\220\240\262\225\263\324\254\250\313\246\366\215\314\343\370\224\321\307\273\256\315\263\322\361\246\220\274\346\370\225\214\257\362\252\304\265\255\322\325\232\315\330\311\302\254\344\354\234\325\217\363\261\335\263\365\303\325\353\375\204\241\327\275\354\341\331\277\320\365\352\334\236\314\331\334\357\207\322\221\360\221\357\335\374\206\351\331\372\300\226\342\321\211\215\350\211\223\305\214\257\337\272\342\253\205\341\314\314\277\244\305\301\231\204\303\365\322\212\272\326\230\256\242\302\216\265\327\221\266\260\335\302\355\261\372\322\242\352\244\251\304\236\235\211\303\351\240\321\333\232\337\371\345\255\377\371\276\325\340\311\240\275\341\250\342\331\227\243\227\261\355\247\210") -TOPIC_TEXT( -"\272\344\300\327\211\272\357\354\220\244\205\251\261\226\305\374\254\312\207\226\357\261\220\241\355\243\300\344\374\246\233\350\225\371\350\272\260\375\321\376\362\327\374\231\330\304\230\327\250\312\311\323\225\334\264\372\331\330\250\206\233\345\214\332\362\242\344\211\350\363\372\307\347\311\201\243\307\351\326\261\265\271\354\314\207\340\313\367\255\350\201\352\247\357\234\250\211\236\351\343\216\352\254\255\372\366\211\241\255\252\224\211\231\215\251\220\236\324\270\246\224\323\367\314\256\230\355\370\315\240\266\221\210\264\263\370\233\342\316\331\201\335\344\302\224\262\300\260\273\301\205\327\264\322\224\247\225\202\372\253\272\214\316\227\201\307\342\240\242\257\337\200\204\301\306\262\264\357\307\245\277\373\333\274\271\251\200\344\374\261\272\214\370\226\266\316\306\306\362\353\251\302\307\357\262\253\301\205\263\257\325\265\375\262\371\363\346\376\377\350\267\276\371\215\346\326\266\317\257\364\214\262\377\305\251\333\253\370\274\351\323\246\224\331\207\355\314\351\207\253\324\201\263\215\332\362\277\200\310\251\270\236\343\242\367\330\256\353\303\271\324\305\257\314\304\301\246\372\224\352\335\266\201\330\211\335\217\235\312\243\234\237\265\200\374\373\253\367\314\375\336\311\252\267\254\353\231\224\344\342\222\257\325\242\214\266\322\365\213\211\345\275\302\242\257\247\236\340\276\374\207\234\273\327\216\223\334\223\276\316\324\353\305\260\373\360\264\271\355\270\341\327\273\200\317\357\312\304\222\240\222\247\200\355\263\277\343\352\222\271\256\230\326\341\351\255\316\202\213\331\200\336\243\265\306\346\340\301\266\321\301\354\250\234\303\321\341\237\277\332") -TOPIC_TEXT( -"\216\350\245\353\276\243\254\242\344\236\360\271\217\200\277\243\275\302\342\315\247\231\363\361\311\351\236\247\337\345\277\334\317\231\252\356\345\212\305\332\271\376\235\316\353\350\231\216\232\364\367\235\341\372\344\212\263\270\253\343\227\357\271\216\221\226\353\347\243\233\305\274\276\272\343\202\267\217\365\230\217\216\212\203\217\257\236\275\203\301\201\377\213\260\206\236\367\367\336\356\335\271\367\247\301\330\360\270\257\236\233\366\220\340\367\322\242\355\363\264\237\300\215\202\204\327\200\247\307\246\206\243\350\213\233\217\217\375\216\217\262\211\323\354\254\256\310\366\241\232\217\271\336\270\370\272\364\236\333\227\372\337\311\357\236\353\225\376\234\322\271\324\373\302\352\244\352\260\210\334\204\236\373\213\200\325\357\300\365\351\256\255\240\337\262\207\267\332\256\234\373\220\301\310\352\234\211\310\366\272\351\206\213\322\376\374\302\245\346\261\227\233\202\202\267\326\346\276\347\256\207\314\253\376\316\327\376\221\314\200\232\336\343\201\304\312\301\264\267\332\327\305\220\323\311\221\326\344\203\262\366\342\201\322\300\274\254\216\323\230\302\224\246\260\301\205\251\314\341\212\323\325\312\323\210\352\225\311\371\361\340\270\314\341\212\323\230\302\212\224\246\260\205\251\314\341\254\212\323\230\302\224\246\260\301\205\251\314\341\212\323\230\225\302\224\246\260\205\251\314\330\341\212\323\230\302\224\246\242\260\205\251\314\314\377\217\215\331\305\303\362&][s0; " -"&][s0; &][s0; @@image:62&125\200\203\212\200\224\200\200\200\200\200\200\200\200\200") -TOPIC_TEXT( -"\200\370\335\234\373\375\352\366\353\272\277\243\377\377\377\217\312\216\221\270\254\220\275\272\367\226\212\217\272\366\351\220\236\364\303\372\370\216\274\210\200\235\201\337\225\362&][s0; " -"&][s0; &][s0; &][s0; &][s0; &][s0; &][s0; &][s0; &][s0; &][s0; ]") diff --git a/uppdev/VisualTest/main.cpp b/uppdev/VisualTest/main.cpp deleted file mode 100644 index 28a833166..000000000 --- a/uppdev/VisualTest/main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -#include "VisualTest.h" - -void Test() -{ - PromptOK("Test"); -} - - -VisualTest::VisualTest() -{ - CtrlLayoutOKCancel(*this, "Window title"); - list.HeaderObject().Absolute(); - for(int i = 0; i < 5; i++) - list.AddColumn(AsString(i), 100).HeaderTab().WhenAction = callback(Test); - for(int i = 0; i < 100; i++) { - list.Add(i); - droplist.Add(i); - } - tabs.Add().Text("A"); - tabs.Add().Text("B"); -// tabs.Add().Text("BVB"); -// tabs.Add().Text("Baas"); -// tabs.Add().Text("Basdasd"); -// tabs.Add().Text("Basdasdasd"); -// tabs.Add().Text("Basdasdasdasdasd"); - Sizeable().Zoomable(); - disabled.Disable(); - pi.Set(44, 0); - slider.Range(100); - slider <<= THISBACK(PI); - bo.SetImage(CtrlImg::cut()); - exit.Exit(); - bo.Disable(); - SetTimeCallback(-50, THISBACK(PI)); - dc.AddList("Test"); -} - -GUI_APP_MAIN -{ -// Ctrl::SetSkin(ChStdSkin); - VisualTest().Run(); - FileSel fs; -// fs.ExecuteOpen(); -} diff --git a/uppdev/Vtbl/Vtbl.upp b/uppdev/Vtbl/Vtbl.upp deleted file mode 100644 index 469aeafbd..000000000 --- a/uppdev/Vtbl/Vtbl.upp +++ /dev/null @@ -1,5 +0,0 @@ -file - vtbl.cpp; - -mainconfig - "Normal" = normal "CONSOLE ST"; diff --git a/uppdev/Vtbl/vtbl.cpp b/uppdev/Vtbl/vtbl.cpp deleted file mode 100644 index e1eb06484..000000000 --- a/uppdev/Vtbl/vtbl.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include - -struct A -{ - virtual void afn() { puts("A::afn"); } - // A must have vtbl to make this crash -}; - -struct B -{ - virtual void bfn() { puts("B::bfn"); } -}; - -struct C : A, B -{ - virtual void bfn() { puts("C::B::bfn"); } -}; - -void Bcall(B& b) -{ - b.bfn(); -} - -int main() -{ - C c; - puts("calling C::B::bfn crashes..."); - Bcall(c); - return 0; -} diff --git a/uppdev/WRichEdit/WRichEdit.h b/uppdev/WRichEdit/WRichEdit.h deleted file mode 100644 index 13d63a280..000000000 --- a/uppdev/WRichEdit/WRichEdit.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef _WRichEdit_WRichEdit_h -#define _WRichEdit_WRichEdit_h - -#include - -#define LAYOUTFILE -#include - -class WRichEdit : public TopWindow { -public: - RichEditWithToolBar editor; - - typedef WRichEdit CLASSNAME; - WRichEdit(); -}; - -#endif diff --git a/uppdev/WRichEdit/WRichEdit.lay b/uppdev/WRichEdit/WRichEdit.lay deleted file mode 100644 index 6c445016d..000000000 --- a/uppdev/WRichEdit/WRichEdit.lay +++ /dev/null @@ -1,6 +0,0 @@ -#ifdef LAYOUTFILE - -LAYOUT(WRichEditLayout, 200, 100) -END_LAYOUT - -#endif diff --git a/uppdev/WRichEdit/WRichEdit.upp b/uppdev/WRichEdit/WRichEdit.upp deleted file mode 100644 index 08ecd25d6..000000000 --- a/uppdev/WRichEdit/WRichEdit.upp +++ /dev/null @@ -1,11 +0,0 @@ -uses - CtrlLib, - RichEdit; - -file - WRichEdit.h, - main.cpp, - WRichEdit.lay; - -mainconfig - "" = "GUI ST"; diff --git a/uppdev/WRichEdit/main.cpp b/uppdev/WRichEdit/main.cpp deleted file mode 100644 index a4371d8a1..000000000 --- a/uppdev/WRichEdit/main.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "WRichEdit.h" - -WRichEdit::WRichEdit() -{ - Add(editor.SizePos()); -} - -GUI_APP_MAIN -{ - Ctrl::SetXPStyle(); - - WRichEdit q; -// q.editor.SetQTF(LoadFile("e:/wedit.qtf")); - q.Run(); -// SaveFile("e:/wedit.qtf", q.editor.GetQTF()); -} diff --git a/uppdev/WSpeed/WSpeed.upp b/uppdev/WSpeed/WSpeed.upp deleted file mode 100644 index e69de29bb..000000000 diff --git a/uppdev/WString/WString.cpp b/uppdev/WString/WString.cpp deleted file mode 100644 index c8eb6cfc4..000000000 --- a/uppdev/WString/WString.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include - -CONSOLE_APP_MAIN -{ - String q = "Ahoj kamarade"; - WString w; - { - TimeStop s; - for(int i = 0; i < 10000000; i++) - w = ToUnicode(q, CHARSET_WIN1250); - RLOG("normal: " << s); - } - { - TimeStop s; - for(int i = 0; i < 10000000; i++) - w = ToUnicode(q, CHARSET_UTF8); - RLOG("utf8: " << s); - } - -} diff --git a/uppdev/WString/WString.upp b/uppdev/WString/WString.upp deleted file mode 100644 index 5ba05e67b..000000000 --- a/uppdev/WString/WString.upp +++ /dev/null @@ -1,7 +0,0 @@ -uses Core; - -file - "WString.cpp"; - -mainconfig - "" = "CONSOLE ST"; diff --git a/uppdev/WebSockets/WebSockets.cpp b/uppdev/WebSockets/WebSockets.cpp deleted file mode 100644 index 5e265dd1f..000000000 --- a/uppdev/WebSockets/WebSockets.cpp +++ /dev/null @@ -1,2 +0,0 @@ -#include "WebSockets.h" - diff --git a/uppdev/WebSockets/WebSockets.h b/uppdev/WebSockets/WebSockets.h deleted file mode 100644 index 520b6072d..000000000 --- a/uppdev/WebSockets/WebSockets.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef _WebSockets_WebSockets_h_ -#define _WebSockets_WebSockets_h_ - -#include - -using namespace Upp; - -class WebSocket : public TcpSocket { - int64 ReadLen(int n); - - int opcode; - String data; - int64 maxlen; - - bool Handshake(); - -public: - enum { - ERROR_NOHEADER = TcpSocket::ERROR_LAST, ERROR_NOKEY, ERROR_DATA, ERROR_SEND, ERROR_LEN_LIMIT - }; - enum { - FIN = 0x80, - CONTINUE = 0x0, - TEXT = 0x1, - BINARY = 0x2, - CLOSE = 0x8, - PING = 0x9, - PONG = 0xa, - }; - - bool WebAccept(TcpSocket& server); - - bool RecieveRaw(); - String Recieve(); - - bool IsFin() { return opcode & FIN; } - int GetOpCode() const { return opcode & 15; } - bool IsText() const { return GetOpCode() == TEXT; } - bool IsBinary() const { return GetOpCode() == BINARY; } - bool IsClosed() const { return GetOpCode() == CLOSE; } - String GetData() const { return data; } - - bool SendRaw(int hdr, const void *data, int64 len); - - bool SendText(const void *data, int64 len, bool fin = true) { return SendRaw((fin ? 0x80 : 0)|TEXT, data, len); } - bool SendText(const String& data, bool fin = true) { return SendText(~data, data.GetCount(), fin); } - - bool SendBinary(const void *data, int64 len, bool fin = true) { return SendRaw((fin ? 0x80 : 0)|BINARY, data, len); } - bool SendBinary(const String& data, bool fin = true) { return SendBinary(~data, data.GetCount(), fin); } - - void Reset(); - - WebSocket& MaxLen(int64 maxlen_) { maxlen = maxlen_; return *this; } - - WebSocket() { Reset(); } -}; - -#endif diff --git a/uppdev/WebSockets/WebSockets.upp b/uppdev/WebSockets/WebSockets.upp deleted file mode 100644 index 86df93486..000000000 --- a/uppdev/WebSockets/WebSockets.upp +++ /dev/null @@ -1,13 +0,0 @@ -uses - Core; - -file - WebSockets.h, - WebSockets.cpp, - main.cpp, - test.html, - h.java; - -mainconfig - "" = ""; - diff --git a/uppdev/WebSockets/h.java b/uppdev/WebSockets/h.java deleted file mode 100644 index e8fa03939..000000000 --- a/uppdev/WebSockets/h.java +++ /dev/null @@ -1,180 +0,0 @@ -#include "WebSockets.h" - -import java.io.*; -import java.net.*; -import java.security.*; -import javax.xml.bind.*; - -public class WebSocket { - - private ServerSocket server; - private Socket sock; - private InputStream in; - private OutputStream out; - - public WebSocket() { - } - - public void listen(int port) throws IOException { - - server = new ServerSocket(port); - sock = server.accept(); - server.close(); - - in = sock.getInputStream(); - out = sock.getOutputStream(); - } - - private void handshake() throws Exception { - - BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF8")); - PrintWriter pw = new PrintWriter(new OutputStreamWriter(out, "UTF8")); - - - // the first line of HTTP headers - String line = br.readLine(); - - if(!line.startsWith("GET")) - throw new IOException("Wrong header: " + line); - - // we read header fields - String key = null; - - // read line by line until we get empty line - while( !(line=br.readLine()).isEmpty() ) { - - if(line.toLowerCase().contains("sec-websocket-key")) { - key = line.substring(line.indexOf(":")+1).trim(); - } - } - - if(key==null) - throw new IOException("No Websocket key specified"); - - System.out.println(key); - - // add key and magic value - String accept = key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; - - // sha1 - byte[] digest = MessageDigest.getInstance("SHA-1") - .digest(accept.getBytes("UTF8")); - // and base64 - accept = DatatypeConverter.printBase64Binary(digest); - - // send http headers - pw.println("HTTP/1.1 101 Switching Protocols"); - pw.println("Upgrade: websocket"); - pw.println("Connection: Upgrade"); - pw.println("Sec-WebSocket-Accept: " + accept); - pw.println(); - pw.flush(); - - } - - private void readFully(byte[] b) throws IOException { - - int readen = 0; - while(readen= 128); - - if(encoded) - len -= 128; - - if(len == 127) { - len = (in.read() << 16) | (in.read() << 8) | in.read(); - } - else if(len == 126) { - len = (in.read() << 8) | in.read(); - } - - byte[] key = null; - - if(encoded) { - key = new byte[4]; - readFully(key); - } - - byte[] frame = new byte[len]; - - readFully(frame); - - if(encoded) { - for(int i=0; i 65535) { - out.write(127); - out.write(utf.length >> 16); - out.write(utf.length >> 8); - out.write(utf.length); - } - else if(utf.length>125) { - out.write(126); - out.write(utf.length >> 8); - out.write(utf.length); - } - else { - out.write(utf.length); - } - - out.write(utf); - } - - private void close() { - try { - sock.close(); - } catch (IOException e) { - System.err.println(e); - } - } - - /** throws Exception, because we don't really care much in this example */ - public static void main(String[] args) throws Exception { - WebSocket ws = new WebSocket(); - - System.out.println("Listening..."); - ws.listen(9998); - - System.out.println("Handshake"); - ws.handshake(); - - System.out.println("Handshake complete!"); - - String message = ws.read(); - System.out.println("Message: " + message); - - ws.send("I got your message! It's length was: " + message.length()); - - ws.close(); - } -} diff --git a/uppdev/WebSockets/init b/uppdev/WebSockets/init deleted file mode 100644 index 68f7cc57d..000000000 --- a/uppdev/WebSockets/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _WebSockets_icpp_init_stub -#define _WebSockets_icpp_init_stub -#include "Core/init" -#endif diff --git a/uppdev/WebSockets/main.cpp b/uppdev/WebSockets/main.cpp deleted file mode 100644 index 43a245fe3..000000000 --- a/uppdev/WebSockets/main.cpp +++ /dev/null @@ -1,24 +0,0 @@ -#include "WebSockets.h" - -CONSOLE_APP_MAIN -{ - StdLogSetup(LOG_COUT|LOG_FILE); - - TcpSocket server; - if(!server.Listen(9998)) { - LOG("Failed to listen.."); - return; - } - - for(;;) { - WebSocket ws; - if(ws.WebAccept(server)) { - LOG("Accepted, trying to handshake"); - LOG("Handshake successfull, trying to recieve"); - LOG(ws.Recieve()); - ws.SendText("This is some text..."); - } - if(ws.IsError()) - LOG("ERROR: " << ws.GetErrorDesc()); - } -} diff --git a/uppdev/WebSockets/test.html b/uppdev/WebSockets/test.html deleted file mode 100644 index ed6ce114f..000000000 --- a/uppdev/WebSockets/test.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/uppdev/Win32Admin/Win32Admin.upp b/uppdev/Win32Admin/Win32Admin.upp deleted file mode 100644 index 5872304d3..000000000 --- a/uppdev/Win32Admin/Win32Admin.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - CtrlLib; - -file - main.cpp; - -mainconfig - "" = "GUI"; - diff --git a/uppdev/Win32Admin/main.cpp b/uppdev/Win32Admin/main.cpp deleted file mode 100644 index 9ee23b588..000000000 --- a/uppdev/Win32Admin/main.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include - -#include - -using namespace Upp; - -bool IsAdmin() -{ - SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY; - PSID AdministratorsGroup; - // Initialize SID. - if( !AllocateAndInitializeSid( &NtAuthority, - 2, - SECURITY_BUILTIN_DOMAIN_RID, - DOMAIN_ALIAS_RID_ADMINS, - 0, 0, 0, 0, 0, 0, - &AdministratorsGroup)) - { - // Initializing SID Failed. - return false; - } - // Check whether the token is present in admin group. - BOOL IsInAdminGroup = FALSE; - if( !CheckTokenMembership( NULL, - AdministratorsGroup, - &IsInAdminGroup )) - { - // Error occurred. - IsInAdminGroup = FALSE; - } - // Free SID and return. - FreeSid(AdministratorsGroup); - - return IsInAdminGroup; -} - -GUI_APP_MAIN -{ - if(IsAdmin()) { - RLOG("Now I am admin, everything is fine."); - PromptOK("I am an admin!"); - } - else { - RLOG("Not an admin, starting as admin"); - PromptOK("Not an admin, running as admin"); - ShellExecute(NULL, "runas", GetExeFilePath(), 0, 0, SW_SHOWNORMAL); - return; - } - - RLOG("Doing admin stuff..."); - getchar(); -} diff --git a/uppdev/WinTest/WinTest.upp b/uppdev/WinTest/WinTest.upp deleted file mode 100644 index 61fa029d4..000000000 --- a/uppdev/WinTest/WinTest.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - CtrlLib; - -file - - "main.cpp"; - -mainconfig - "" = "GUI"; diff --git a/uppdev/WinTest/main.cpp b/uppdev/WinTest/main.cpp deleted file mode 100644 index 66e71f1bb..000000000 --- a/uppdev/WinTest/main.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include - -GUI_APP_MAIN -{ - TopWindow a, b, c1; - a.Open((TopWindow *)NULL); - b.Open((TopWindow *)NULL); - c.Open((TopWindow *)NULL); - c.Run(); -} diff --git a/uppdev/WindowBackupRestore/WindowBackupRestore.h b/uppdev/WindowBackupRestore/WindowBackupRestore.h deleted file mode 100644 index fc2bb901a..000000000 --- a/uppdev/WindowBackupRestore/WindowBackupRestore.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef _WindowBackupRestore_WindowBackupRestore_h -#define _WindowBackupRestore_WindowBackupRestore_h - -#include - -using namespace Upp; - -#define LAYOUTFILE -#include - - - -class MainWindow : public WithMainWindowLayout { -public: - typedef MainWindow CLASSNAME; - MainWindow(); -protected: - WithTestDialogLayout dlg; - void OnShowDialog(); -}; - -#endif - diff --git a/uppdev/WindowBackupRestore/WindowBackupRestore.lay b/uppdev/WindowBackupRestore/WindowBackupRestore.lay deleted file mode 100644 index d06b1e5e6..000000000 --- a/uppdev/WindowBackupRestore/WindowBackupRestore.lay +++ /dev/null @@ -1,13 +0,0 @@ -LAYOUT(MainWindowLayout, 236, 108) - ITEM(Button, show_dialog, SetLabel(t_("Dialog...")).LeftPosZ(68, 92).TopPosZ(44, 24)) -END_LAYOUT - -LAYOUT(TestDialogLayout, 328, 224) - ITEM(Button, ok, SetLabel(t_("Ok")).LeftPosZ(184, 68).TopPosZ(196, 20)) - ITEM(Button, cancel, SetLabel(t_("Cancel")).LeftPosZ(256, 64).TopPosZ(196, 20)) - ITEM(EditString, first, LeftPosZ(8, 168).TopPosZ(28, 19)) - ITEM(Label, dv___3, SetLabel(t_("Second value")).LeftPosZ(8, 172).TopPosZ(60, 19)) - ITEM(EditIntSpin, second, LeftPosZ(8, 92).TopPosZ(76, 19)) - ITEM(Label, dv___5, SetLabel(t_("First value")).LeftPosZ(8, 168).TopPosZ(8, 19)) -END_LAYOUT - diff --git a/uppdev/WindowBackupRestore/WindowBackupRestore.upp b/uppdev/WindowBackupRestore/WindowBackupRestore.upp deleted file mode 100644 index 7f989752e..000000000 --- a/uppdev/WindowBackupRestore/WindowBackupRestore.upp +++ /dev/null @@ -1,11 +0,0 @@ -uses - CtrlLib; - -file - WindowBackupRestore.h, - main.cpp, - WindowBackupRestore.lay; - -mainconfig - "" = "GUI"; - diff --git a/uppdev/WindowBackupRestore/main.cpp b/uppdev/WindowBackupRestore/main.cpp deleted file mode 100644 index 417ac8c76..000000000 --- a/uppdev/WindowBackupRestore/main.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include "WindowBackupRestore.h" - - - -MainWindow::MainWindow() -{ - CtrlLayout(*this, "Backup/Restore test"); - show_dialog <<= THISBACK(OnShowDialog); - - CtrlLayoutOKCancel(dlg, t_("Test Dialog")); -} - -void MainWindow::OnShowDialog() -{ - dlg.Backup(); - if(dlg.Execute()!=IDOK) -// dlg.Restore(); - ; -} - - -GUI_APP_MAIN -{ - MainWindow().Run(); -} - diff --git a/uppdev/WithDropChoice/WithDropChoice.upp b/uppdev/WithDropChoice/WithDropChoice.upp deleted file mode 100644 index 5872304d3..000000000 --- a/uppdev/WithDropChoice/WithDropChoice.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - CtrlLib; - -file - main.cpp; - -mainconfig - "" = "GUI"; - diff --git a/uppdev/WithDropChoice/main.cpp b/uppdev/WithDropChoice/main.cpp deleted file mode 100644 index a98852e3e..000000000 --- a/uppdev/WithDropChoice/main.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include - -using namespace Upp; - -GUI_APP_MAIN -{ - WithDropChoice x; - EditString y; - TopWindow w; - w.Add(x.LeftPos(10, 100).TopPos(10, 19)); - w.Add(y.LeftPos(110, 100).TopPos(10, 19)); - - w.Run(); -} - diff --git a/uppdev/WordCount/WordCount.upp b/uppdev/WordCount/WordCount.upp deleted file mode 100644 index e69de29bb..000000000 diff --git a/uppdev/X11MinMax/X11MinMax.upp b/uppdev/X11MinMax/X11MinMax.upp deleted file mode 100644 index 5872304d3..000000000 --- a/uppdev/X11MinMax/X11MinMax.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - CtrlLib; - -file - main.cpp; - -mainconfig - "" = "GUI"; - diff --git a/uppdev/X11MinMax/main.cpp b/uppdev/X11MinMax/main.cpp deleted file mode 100644 index 76e342076..000000000 --- a/uppdev/X11MinMax/main.cpp +++ /dev/null @@ -1,65 +0,0 @@ -#include - -using namespace Upp; - -struct MyApp : public TopWindow -{ - TimeCallback cb; - void Back() { - LOG("Back"); - Overlap(); - } - - virtual bool Key(dword key, int) { - if(key == K_CTRL_M) - Maximize(); - if(key == K_CTRL_N) { - Minimize(); - cb.Set(2000, THISBACK(Back)); - } - if(key == K_CTRL_B) - Overlap(); - if(key == K_CTRL_F) - FullScreen(!IsFullScreen()); - return false; - } - virtual void Paint(Draw& w) { - w.DrawRect(GetSize(), White()); - if(IsMaximized()) - w.DrawText(0, 0, "Maximized!"); - else - if(IsMinimized()) - w.DrawText(0, 0, "Minimized!"); - } - - void Sync() { - if(IsMaximized()) - Title("Maximized!"); - else - if(IsMinimized()) - Title("Minimized!"); - else - Title("Normal"); - } - - typedef MyApp CLASSNAME; - - void Serialize(Stream& s) - { - SerializePlacement(s, true); - } - - MyApp() { - Sizeable().Zoomable(); - SetTimeCallback(-100, THISBACK(Sync)); - } -}; - -GUI_APP_MAIN -{ - MyApp app; - LoadFromFile(app); - app.Run(); - StoreToFile(app); -} - diff --git a/uppdev/X11dev/X11dev.h b/uppdev/X11dev/X11dev.h deleted file mode 100644 index 2d78b838c..000000000 --- a/uppdev/X11dev/X11dev.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef _X11dev_X11dev_h -#define _X11dev_X11dev_h - -#include - -#define LAYOUTFILE -#include - - - -class X11dev : public WithX11devLayout { -public: - virtual void Paint(Draw& w); - - typedef X11dev CLASSNAME; - X11dev(); -}; - -#endif diff --git a/uppdev/X11dev/X11dev.lay b/uppdev/X11dev/X11dev.lay deleted file mode 100644 index b9dbc03d6..000000000 --- a/uppdev/X11dev/X11dev.lay +++ /dev/null @@ -1,4 +0,0 @@ - -LAYOUT(X11devLayout, 200, 100) - -END_LAYOUT diff --git a/uppdev/X11dev/X11dev.upp b/uppdev/X11dev/X11dev.upp deleted file mode 100644 index 7e3b3f75d..000000000 --- a/uppdev/X11dev/X11dev.upp +++ /dev/null @@ -1,11 +0,0 @@ -uses - CtrlLib; - -file - X11dev.h, - main.cpp, - X11dev.lay; - -mainconfig - "" = "GUI"; - diff --git a/uppdev/X11dev/init b/uppdev/X11dev/init deleted file mode 100644 index e414cedf2..000000000 --- a/uppdev/X11dev/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _X11dev_icpp_init_stub -#define _X11dev_icpp_init_stub -#include "CtrlLib/init" -#endif diff --git a/uppdev/X11dev/main.cpp b/uppdev/X11dev/main.cpp deleted file mode 100644 index e8df7abb7..000000000 --- a/uppdev/X11dev/main.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include - -using namespace Upp; - -GUI_APP_MAIN { - __BREAK__; - new int; -} diff --git a/uppdev/XLS/XLS.h b/uppdev/XLS/XLS.h deleted file mode 100644 index 793300327..000000000 --- a/uppdev/XLS/XLS.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _XLS_XLS_h -#define _XLS_XLS_h - -#include -#include - -using namespace Upp; - -#endif diff --git a/uppdev/XLS/XLS.upp b/uppdev/XLS/XLS.upp deleted file mode 100644 index 993b78f24..000000000 --- a/uppdev/XLS/XLS.upp +++ /dev/null @@ -1,40 +0,0 @@ -description "U++ wrapper for XlsLib 1.2.0 (library for XLS spreadsheets, by David Hoerl)\377"; - -uses - Core; - -file - binfile.cpp, - blank.cpp, - cbridge.cpp, - cell.cpp, - colinfo.cpp, - continue.cpp, - crc.cpp, - datast.cpp, - docsumminfo.cpp, - extformat.cpp, - font.cpp, - format.cpp, - globalrec.cpp, - index.cpp, - label.cpp, - merged.cpp, - number.cpp, - oledoc.cpp, - olefs.cpp, - oleprop.cpp, - overnew.cpp, - range.cpp, - recdef.cpp, - record.cpp, - row.cpp, - sheetrec.cpp, - summinfo.cpp, - unit.cpp, - workbook.cpp, - XLS.h; - -mainconfig - "" = ""; - diff --git a/uppdev/XLS/biffsection.h b/uppdev/XLS/biffsection.h deleted file mode 100644 index 0ea5bc1d5..000000000 --- a/uppdev/XLS/biffsection.h +++ /dev/null @@ -1,68 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/biffsection.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:53 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef BIFFSECTION_H -#define BIFFSECTION_H - -#include -#include - - -/* -****************************** -CBiffSection class declaration -****************************** -*/ - - -class CBiffSection -{ - protected: - - public: - CBiffSection() {}; - ~CBiffSection() {}; -}; - -#endif //BIFFSECTION_H - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: biffsection.h,v $ - * Revision 1.2 2008/10/25 18:39:53 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:43 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ diff --git a/uppdev/XLS/binfile.cpp b/uppdev/XLS/binfile.cpp deleted file mode 100644 index 2b5a4491e..000000000 --- a/uppdev/XLS/binfile.cpp +++ /dev/null @@ -1,278 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/oledoc/binfile.cpp,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:53 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#include - -using namespace std; -using namespace xlslib_core; - -/* -****************************** -CBinFile class Implementation -****************************** -*/ - -CBinFile::CBinFile() -// : is_stroke(false) -{ - -} - -CBinFile::CBinFile(const string& name) -// : is_stroke(false) -{ - Open(name); - -} - -CBinFile::~CBinFile () -{ - Close(); - -} - -/* -****************************** -****************************** -*/ -int CBinFile::Open(const string& file_name) -{ - Close(); - m_File.open(file_name.c_str(),ios_base::binary|ios_base::out); - - return m_File.good()? NO_ERRORS: FILE_ERROR; -} - -/* -****************************** -****************************** -*/ -int CBinFile::Close ( ) -{ - if(m_File.is_open()) - m_File.close(); - - return NO_ERRORS; -} -/* -****************************** -****************************** -*/ - -unsigned32_t CBinFile::Position ( ) -{ - unsigned32_t pt = 0; - if(m_File.is_open()) { - pt = (unsigned32_t)m_File.tellp(); - } - - return pt; -} - -/* -****************************** -****************************** -*/ -int CBinFile::Write ( unsigned8_t * data, unsigned32_t size ) -{ - int errcode = NO_ERRORS; - - write_service((const char*)data, size); - return errcode; -} - - -/* -****************************** -****************************** -*/ -int CBinFile::Write ( CUnit& data_unit ) -{ - - int errcode = NO_ERRORS; - write_service((const char*)data_unit.GetBuffer(), data_unit.GetDataSize()); - return errcode; -} - -/* -****************************** -****************************** -*/ -int CBinFile::WriteByte(unsigned8_t byte) -{ - - int errcode = NO_ERRORS; - write_service((const char*)&byte, 1); - return errcode; -} - -/* -****************************** -****************************** -*/ -int CBinFile::WriteUnsigned16(unsigned16_t data) -{ - int errcode = NO_ERRORS; - - WriteByte(BYTE_0(data)); - WriteByte(BYTE_1(data)); - - return errcode; -} - -/* -****************************** -****************************** -*/ -int CBinFile::WriteUnsigned32(unsigned32_t data) -{ - int errcode = NO_ERRORS; - - WriteByte(BYTE_0(data)); - WriteByte(BYTE_1(data)); - WriteByte(BYTE_2(data)); - WriteByte(BYTE_3(data)); - - return errcode; -} - -/* -****************************** -****************************** -*/ -int CBinFile::WriteSigned16(signed16_t data) -{ - int errcode = NO_ERRORS; - - WriteByte(BYTE_0(data)); - WriteByte(BYTE_1(data)); - - return errcode; -} - -/* -****************************** -****************************** -*/ -int CBinFile::WriteSigned32(signed32_t data) -{ - int errcode = NO_ERRORS; - WriteByte(BYTE_0(data)); - WriteByte(BYTE_1(data)); - WriteByte(BYTE_2(data)); - WriteByte(BYTE_3(data)); - - return errcode; -} - -int CBinFile::WriteByteArray(const unsigned8_t *data, size_t size) -{ - int errcode = NO_ERRORS; - write_service((const char*)data, size); - return errcode; -} - -/* -****************************** -****************************** -*/ - -int CBinFile::SerializeFixedArray(const unsigned8_t data, unsigned32_t size) -{ - int errcode = NO_ERRORS; - - for (unsigned32_t i = 0; i 1) - m_File.write((const char*)buffer, size); - else if(size == 1) - m_File.put(*buffer); - } - } -#ifdef XLS_PHP - int sent = 0; - else { - if (write_fptr != NULL) - { - do - { - if(size >= STROKE_CHUNK_SIZE) - { - sent = write_fptr(buffer, STROKE_CHUNK_SIZE); - size -= sent; - buffer += sent; - } else { - sent = write_fptr(buffer, size); - size -= sent; - buffer += sent; - } - } while(size != 0); - } - } -#endif - return 0; -} - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: binfile.cpp,v $ - * Revision 1.2 2008/10/25 18:39:53 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:43 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/blank.cpp b/uppdev/XLS/blank.cpp deleted file mode 100644 index e53df8efb..000000000 --- a/uppdev/XLS/blank.cpp +++ /dev/null @@ -1,104 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/blank.cpp,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:53 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -#include - -using namespace std; -using namespace xlslib_core; - -CBlank::CBlank(unsigned16_t row, - unsigned16_t col, - xf_t* pxfval) -{ - - SetRecordType(RECTYPE_BLANK); - AddValue16(row); - AddValue16(col); - - unsigned16_t xfindex; - pxfval != NULL? - xfindex = pxfval->GetIndex() - :xfindex = 0x000f; - AddValue16(xfindex); - SetRecordLength(GetDataSize()-4); - -} - -CBlank::CBlank(blank_t& blankdef) -{ - SetRecordType(RECTYPE_BLANK); // DFH - was RECTYPE_LABEL, typo ??? (just like the number class) - AddValue16(blankdef.GetRow()); - AddValue16(blankdef.GetCol()); - AddValue16(blankdef.GetXFIndex()); - - SetRecordLength(GetDataSize()-4); -} - -CBlank::~CBlank() -{ -} - -/* -********************************* -blank_t class implementation -********************************* -*/ -blank_t::blank_t(unsigned16_t rowval, - unsigned16_t colval, - xf_t* pxfval) -{ - row = rowval; - col = colval; - - if(pxfval != NULL) - pxfval->MarkUsed(); - pxf = pxfval; -} - -CUnit* blank_t::GetData() { - CUnit* datablank = - (CUnit*)( new CBlank(row,col,pxf)); - return datablank; // NOTE: this pointer HAS to be deleted elsewhere. -} - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: blank.cpp,v $ - * Revision 1.2 2008/10/25 18:39:53 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:54 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/blank.h b/uppdev/XLS/blank.h deleted file mode 100644 index 2307bc2e2..000000000 --- a/uppdev/XLS/blank.h +++ /dev/null @@ -1,92 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/blank.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:53 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -#ifndef BLANK_H -#define BLANK_H - -#include -#include - -#include -#include -#include - -namespace xlslib_core -{ - - class blank_t; - class CBlank: public CRecord - { - private: - - public: - CBlank(unsigned16_t row, - unsigned16_t col, - xf_t* pxfval = NULL); - - CBlank(blank_t& blankdef); - ~CBlank(); - }; - - - class blank_t: public cell_t - { - - private: - - public: - blank_t(unsigned16_t rowval, - unsigned16_t colval, - xf_t* pxfval = NULL); - - ~blank_t(){}; - unsigned16_t GetSize() {return 10;}; - CUnit* GetData(); - - }; - -} - -#endif //BLANK_H - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: blank.h,v $ - * Revision 1.2 2008/10/25 18:39:53 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:49 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/cbridge.cpp b/uppdev/XLS/cbridge.cpp deleted file mode 100644 index 1e1ecd129..000000000 --- a/uppdev/XLS/cbridge.cpp +++ /dev/null @@ -1,228 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/cbridge.cpp,v $ - * $Revision: 1.1 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:44:32 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#include -#include - -#include - -using namespace std; -//using namespace xlslib_core; - -#if 0 -EXTERN_TYPE worksheet *newWorksheet(CGlobalRecords *pglobalrec); -EXTERN_TYPE void deleteWorksheet(worksheet *w); - worksheet *newWorksheet(CGlobalRecords *pglobalrec) { return new worksheet(pglobalrec); } - void deleteWorksheet(worksheet *w) { delete w; } -#endif - -extern "C" { - // Workbook - workbook *newWorkbook(void) { return new workbook; } - //workbook *newWorkbook_w_fptr(write_fptr_t w_fptr) { return new workbook(w_fptr); } - void deleteWorkbook(workbook *w) { delete w; } - worksheet *callWorkbookSheet(workbook *w, char *sheetname) { - std::string str = sheetname; - return w->sheet(str); - } -#if VERSION_BIFF == VERSION_BIFF8 - worksheet *callWorkbookSheetW(workbook *w, uchar_t *sheetname) { - std::ustring str = sheetname; - return w->sheet(str); - } -#endif - worksheet *callWorkbookGetSheet(workbook *w, unsigned16_t sheetnum) { return w->GetSheet(sheetnum); } - - font_t *callWorkbookFont(workbook *w, char *name) { - std::string str = name; - return w->font(str); - } - xf_t *callWorkbookxFormat(workbook *w) { return w->xformat(); } - xf_t *callWorkbookxFormatFont(workbook *w, font_t *font) { return w->xformat(font); } - int callWorkbookDump(workbook *w, char *filename) { - std::string str = filename; - return w->Dump(str); - } -#ifdef XLS_PHP - void callWorkbookDisposition(workbook *w, Stroke_Disposition_t disp) { return w->Disposition(disp); } - void callWorkbookStroke(workbook *w, char *filename) { - std::string str = filename; - return w->Stroke(str); - } -#endif - // Worksheet - cell_t *callWorksheetFindCell(worksheet *w, unsigned16_t row, unsigned16_t col) { return w->FindCell(row, col); } - // Cell operations - void callWorksheetMerge(worksheet *w, unsigned16_t first_row, unsigned16_t first_col, unsigned16_t last_row, unsigned16_t last_col) - { return w->merge(first_row, first_col, last_row, last_col); } - void callWorksheetColwidth(worksheet *w, unsigned16_t col, unsigned16_t width) - { return w->colwidth(col, width); } - void callWorksheetRowheight(worksheet *w, unsigned16_t row, unsigned16_t height) - { return w->rowheight(row, height); } - // Ranges - range *callWorksheetRangegroup(worksheet *w, unsigned16_t row1, unsigned16_t col1, unsigned16_t row2, unsigned16_t col2) - { return w->rangegroup(row1, col1, row2, col2); } - // Cells - cell_t *callWorksheetLabel(worksheet *w, unsigned16_t row, unsigned16_t col, char *strlabel, xf_t *pxformat) - { - std:string str = strlabel; - return w->label(row, col, strlabel, pxformat); - } -#if VERSION_BIFF == VERSION_BIFF8 - cell_t *callWorksheetLabelW(worksheet *w, unsigned16_t row, unsigned16_t col, uchar_t *strlabel, xf_t *pxformat) - { - std:ustring str = strlabel; - return w->label(row, col, strlabel, pxformat); - } -#endif - cell_t *callWorksheetBlank(worksheet *w, unsigned16_t row, unsigned16_t col, xf_t *pxformat) - { return w->blank(row, col, pxformat); } - - cell_t *callWorksheetNumber(worksheet *w, unsigned16_t row, unsigned16_t col, double numval, format_number_t fmtval, xf_t *pxformat) - { return w->number(row, col, numval, fmtval, pxformat); } - - // Cells - // xf_i interface - void callCellFont(cell_t *c, font_t *fontidx) { return c->font(fontidx); } - void callCellFormat(cell_t *c, format_number_t formatidx) { return c->format(formatidx); } - void callCellHalign(cell_t *c, halign_option_t ha_option) { return c->halign(ha_option); } - void callCellValign(cell_t *c, valign_option_t va_option) { return c->valign(va_option); } - void callCellOrientation(cell_t *c, txtori_option_t ori_option) { return c->orientation(ori_option); } - void callCellFillfgcolor(cell_t *c, color_name_t color) { return c->fillfgcolor(color); } - void callCellFillbgcolor(cell_t *c, color_name_t color) { return c->fillbgcolor(color); } - void callCellFillstyle(cell_t *c, fill_option_t fill) { return c->fillstyle(fill); } - void callCellLocked(cell_t *c, bool locked_opt) { return c->locked(locked_opt); } - void callCellHidden(cell_t *c, bool hidden_opt) { return c->hidden(hidden_opt); } - void callCellWrap(cell_t *c, bool wrap_opt) { return c->wrap(wrap_opt); } - void callCellBorderstyle(cell_t *c, border_side_t side, border_style_t style, color_name_t color) - { return c->borderstyle(side, style, color); } - //font_i interface - void callCellFontname(cell_t *c, char *fntname) { - std::string str = fntname; - return c->fontname(str); - } - void callCellFontheight(cell_t *c, unsigned16_t fntheight) { return c->fontheight(fntheight); } - void callCellFontbold(cell_t *c, boldness_option_t fntboldness) { return c->fontbold(fntboldness); } - void callCellFontunderline(cell_t *c, underline_option_t fntunderline) { return c->fontunderline(fntunderline); } - void callCellFontscript(cell_t *c, script_option_t fntscript) { return c->fontscript(fntscript); } - void callCellFontcolor(cell_t *c, color_name_t fntcolor) { return c->fontcolor(fntcolor); } - void callCellFontattr(cell_t *c, unsigned16_t attr) { return c->fontattr(attr); } - void callCellFontitalic(cell_t *c, bool italic) { return c->fontitalic(italic); } - void callCellFontstrikeout(cell_t *c, bool so) { return c->fontstrikeout(so); } - void callCellFontoutline(cell_t *c, bool ol) { return c->fontoutline(ol); } - void callCellFontshadow(cell_t *c, bool sh) { return c->fontshadow(sh); } - - unsigned16_t callCellGetRow(cell_t *c) { return c->GetRow(); } - unsigned16_t callCellGetCol(cell_t *c) { return c->GetCol(); } - unsigned16_t callCellGetXFIndex(cell_t *c) { return c->GetXFIndex(); } - void callCellSetXF(cell_t *c, xf_t *pxfval) { return c->SetXF(pxfval); } - - // range - void callRangeCellcolor(range *r, color_name_t color) { return r->cellcolor(color); } - - // xformat - void callXformatSetFont(xf_t *x, font_t* fontidx) { return x->SetFont(fontidx); } - unsigned16_t callXformatGetFontIndex(xf_t *x) { return x->GetFontIndex(); } - font_t* callXformatGetFont(xf_t *x) { return x->GetFont(); } - /* Format Index wrappers*/ - void callXformatSetFormat(xf_t *x, format_number_t formatidx) { return x->SetFormat(formatidx); } - unsigned16_t callXformatGetFormatIndex(xf_t *x) { return x->GetFormatIndex(); } - format_number_t callXformatGetFormat(xf_t *x) { return x->GetFormat(); } - /* Horizontal Align option wrappers*/ - void callXformatSetHAlign(xf_t *x, halign_option_t ha_option) { return x->SetHAlign(ha_option); } - unsigned8_t callXformatGetHAlign(xf_t *x) { return x->GetHAlign(); } - /* Vertical Align option wrappers*/ - void callXformatSetVAlign(xf_t *x, valign_option_t va_option) { return x->SetVAlign(va_option); } - unsigned8_t callXformatGetVAlign(xf_t *x) { return x->GetVAlign(); } - /* Text orientation option wrappers*/ - void callXformatSetTxtOrientation(xf_t *x, txtori_option_t ori_option) { return x->SetTxtOrientation(ori_option); } - unsigned8_t callXformatGetTxtOrientation(xf_t *x) { return x->GetTxtOrientation(); } - /* Fill Foreground color option wrappers*/ - void callXformatSetFillFGColor(xf_t *x, color_name_t color) { return x->SetFillFGColor(color); } - unsigned8_t callXformatGetFillFGColor(xf_t *x) { return x->GetFillFGColor(); } - /* Fill Background color option wrappers*/ - void callXformatSetFillBGColor(xf_t *x, color_name_t color) { return x->SetFillBGColor(color); } - unsigned8_t callXformatGetFillBGColor(xf_t *x) { return x->GetFillBGColor(); } - /* Fill Style option wrappers*/ - void callXformatSetFillStyle(xf_t *x, fill_option_t fill) { return x->SetFillStyle(fill); } - unsigned8_t callXformatGetFillStyle(xf_t *x) { return x->GetFillStyle(); } - /* Locked option wrappers*/ - void callXformatSetLocked(xf_t *x, bool locked_opt) { return x->SetLocked(locked_opt); } - bool callXformatIsLocked(xf_t *x) { return x->IsLocked(); } - /* Hidden option wrappers*/ - void callXformatSetHidden(xf_t *x, bool hidden_opt) { return x->SetHidden(hidden_opt); } - bool callXformatIsHidden(xf_t *x) { return x->IsHidden(); } - /* Wrap option wrappers*/ - void callXformatSetWrap(xf_t *x, bool wrap_opt) { return x->SetWrap(wrap_opt); } - bool callXformatIsWrap(xf_t *x) { return x->IsWrap(); } - /* Cell option wrappers*/ - void callXformatSetCellMode(xf_t *x, bool cellmode) { return x->SetCellMode(cellmode); } - bool callXformatIsCell(xf_t *x) { return x->IsCell(); } - /* Cell option wrappers*/ - void callXformatSetBorderStyle(xf_t *x, border_side_t side, border_style_t style, color_name_t color) - { return x->SetBorderStyle(side, style, color); } - unsigned8_t callXformatGetBorderStyle(xf_t *x, border_side_t side) { return x->GetBorderStyle(side); } - unsigned8_t callXformatGetBorderColor(xf_t *x, border_side_t side) { return x->GetBorderColor(side); } - unsigned32_t callXformatGetSignature(xf_t *x) { return x->GetSignature(); } - - // Font - void callFontSetName(font_t *f, char *fntname) { - std::string str = fntname; - f->SetName(str); - return; - } - char *callFontGetName(font_t *f, char *fntname) { return strcpy(fntname, (f->GetName()).c_str() ); } - /* FONT height wrappers*/ - void callFontSetHeight(font_t *f, unsigned16_t fntheight) { return f->SetHeight(fntheight); } - unsigned16_t callFontGetHeight(font_t *f) { return f->GetHeight(); } - /* FONT boldstyle wrappers*/ - void callFontSetBoldStyle(font_t *f, boldness_option_t fntboldness) { return f->SetBoldStyle(fntboldness); } - unsigned16_t callFontGetBoldStyle(font_t *f) { return f->GetBoldStyle(); } - /* FONT underline wrappers*/ - void callFontSetUnderlineStyle(font_t *f, underline_option_t fntunderline) { return f->SetUnderlineStyle(fntunderline); } - unsigned8_t callFontGetUnderlineStyle(font_t *f) { return f->GetUnderlineStyle(); } - /* FONT script wrappers*/ - void callFontSetScriptStyle(font_t *f, script_option_t fntscript) { return f->SetScriptStyle(fntscript); } - unsigned16_t callFontGetScriptStyle(font_t *f) { return f->GetScriptStyle(); } - /* FONT script wrappers*/ - void callFontSetColor(font_t *f, color_name_t fntcolor) { return f->SetColor(fntcolor); } - unsigned16_t callFontGetColor(font_t *f) { return f->GetColor(); } - void callFontSetItalic(font_t *f, bool italic) { return f->SetItalic(italic); } - void callFontSetStrikeout(font_t *f, bool so) { return f->SetStrikeout(so); } - /* FONT attributes wrappers */ - void callFontSetAttributes(font_t *f, unsigned16_t attr) { return f->SetAttributes(attr); } - unsigned16_t callFontGetAttributes(font_t *f) { return f->GetAttributes(); } - // Macintosh only - void callFontSetOutline(font_t *f, bool ol) { return f->SetOutline(ol); } - void callFontSetShadow(font_t *f, bool sh) { return f->SetShadow(sh); } -} diff --git a/uppdev/XLS/cbridge.h b/uppdev/XLS/cbridge.h deleted file mode 100644 index 79b555cd1..000000000 --- a/uppdev/XLS/cbridge.h +++ /dev/null @@ -1,33 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/cbridge.h,v $ - * $Revision: 1.1 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:44:32 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/cell.cpp b/uppdev/XLS/cell.cpp deleted file mode 100644 index 61d0cde66..000000000 --- a/uppdev/XLS/cell.cpp +++ /dev/null @@ -1,557 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/cell.cpp,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:53 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -#include - -using namespace std; -using namespace xlslib_core; - -cell_t::cell_t() - :m_pGlobalRecs(NULL) -{ - -} - -cell_t::~cell_t() -{ - -} - -unsigned16_t cell_t::GetXFIndex() -{ - unsigned16_t xfindex; -#if 0 - pxf != NULL? - xfindex = pxf->GetIndex() - :xfindex = 0x000f; -#endif - if(pxf != NULL) - xfindex = pxf->GetIndex(); - else - xfindex = 0x000f; - - return xfindex; -} - - -bool cell_t::operator==(const cell_t& right) const -{ - return (row == right.row ? true : false); -} - -bool cell_t::operator!=(const cell_t& right) const -{ - return (row != right.row ? true : false); -} - -/* - bool cell_t::operator<(const cell_t& right) const - { - return (row < right.row); - } - - bool cell_t::operator>(const cell_t& right) const - { - return (row > right.row); - } - - - bool cell_t::operator%(const cell_t& right) const - { - return (row == right.row && col == right.col); - } -*/ - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - Implementation of the XF record interface (xf_i pure virtual interface) - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#define SET_XF_CELL_FUNCTION(function,value) \ - { \ - xf_t* currentxf = pxf; \ - if(pxf == NULL) \ - currentxf = m_pGlobalRecs->GetDefaultXF(); \ - \ - xf_t* xfbackup = new xf_t; \ - (*xfbackup) = (*currentxf); \ - \ - if(currentxf->Usage() > 1) \ - { \ - xf_t* newxf = new xf_t(); \ - (*newxf) = (*currentxf); \ - newxf->function(value); \ - newxf = m_pGlobalRecs->AddXFormat(newxf); \ - pxf = newxf; \ - pxf->MarkUsed(); \ - \ - } \ - else \ - { \ - xf_t* xfnew = new xf_t; \ - (*xfnew) = (*currentxf); \ - xfnew->function(value); \ - xfnew->MarkUsed(); \ - xfnew = m_pGlobalRecs->ReplaceXFormat(xfbackup, xfnew); \ - pxf = xfnew; \ - pxf->MarkUsed(); \ - \ - } \ - delete xfbackup; \ - } - -void cell_t::borderstyle(border_side_t side, - border_style_t style, - color_name_t color) -{ - - xf_t* currentxf = pxf; - if(pxf == NULL) - currentxf = m_pGlobalRecs->GetDefaultXF(); - - xf_t* xfbackup = new xf_t; - (*xfbackup) = (*currentxf); - - if(currentxf->Usage() > 1) - { - xf_t* newxf = new xf_t(); - (*newxf) = (*currentxf); - newxf->SetBorderStyle(side, style, color); - newxf = m_pGlobalRecs->AddXFormat(newxf); - pxf = newxf; - pxf->MarkUsed(); - - } - else - { - xf_t* xfnew = new xf_t; - (*xfnew) = (*currentxf); - xfnew->SetBorderStyle(side, style, color); - xfnew->MarkUsed(); - xfnew = m_pGlobalRecs->ReplaceXFormat(xfbackup, xfnew); - pxf = xfnew; - pxf->MarkUsed(); - - - } - delete xfbackup; -} - -void cell_t::font(font_t* fontidx) -{ - - SET_XF_CELL_FUNCTION(SetFont, fontidx); -/* - xf_t* currentxf = pxf; - if(pxf == NULL) - currentxf = m_pGlobalRecs->GetDefaultXF(); - - xf_t* xfbackup = new xf_t; - (*xfbackup) = (*currentxf); - - if(currentxf->Usage() > 1) - { - xf_t* newxf = new xf_t(); - (*newxf) = (*currentxf); - newxf->SetFont(fontidx); - newxf = m_pGlobalRecs->AddXFormat(newxf); - pxf = newxf; - pxf->MarkUsed(); - - } - else - { - xf_t* xfnew = new xf_t; - (*xfnew) = (*currentxf); - xfnew->SetFont(fontidx); - xfnew->MarkUsed(); - xfnew = m_pGlobalRecs->ReplaceXFormat(xfbackup, xfnew); - pxf = xfnew; - } - - delete xfbackup; -*/ -} - -void cell_t::format(format_number_t formatidx) -{ - SET_XF_CELL_FUNCTION(SetFormat,formatidx); -} - -void cell_t::halign(halign_option_t ha_option) -{ - - SET_XF_CELL_FUNCTION(SetHAlign,ha_option); - -} - -void cell_t::valign(valign_option_t va_option) -{ - SET_XF_CELL_FUNCTION(SetVAlign,va_option); -} - -void cell_t::indent(indent_option_t indent_option) -{ - SET_XF_CELL_FUNCTION(SetIndent,indent_option); -} - -void cell_t::orientation(txtori_option_t ori_option) -{ - SET_XF_CELL_FUNCTION(SetTxtOrientation,ori_option); -} - -void cell_t::fillfgcolor(color_name_t color) -{ - SET_XF_CELL_FUNCTION(SetFillFGColor,color); -/* - xf_t* currentxf = pxf; - if(pxf == NULL) - currentxf = m_pGlobalRecs->GetDefaultXF(); - - xf_t* xfbackup = new xf_t; - (*xfbackup) = (*currentxf); - - if(currentxf->Usage() > 1) - { - xf_t* newxf = new xf_t(); - (*newxf) = (*currentxf); - newxf->SetFillFGColor(color); - newxf = m_pGlobalRecs->AddXFormat(newxf); - pxf = newxf; - pxf->MarkUsed(); - - } - else - { - xf_t* xfnew = new xf_t; - (*xfnew) = (*currentxf); - xfnew->SetFillFGColor(color); - xfnew->MarkUsed(); - xfnew = m_pGlobalRecs->ReplaceXFormat(xfbackup, xfnew); - pxf = xfnew; - pxf->MarkUsed(); - } - delete xfbackup; -*/ -} - -void cell_t::fillbgcolor(color_name_t color) -{ - SET_XF_CELL_FUNCTION(SetFillBGColor,color); -} - -void cell_t::fillstyle(fill_option_t fill) -{ - SET_XF_CELL_FUNCTION(SetFillStyle,fill); -/* - xf_t* currentxf = pxf; - if(pxf == NULL) - currentxf = m_pGlobalRecs->GetDefaultXF(); - - xf_t* xfbackup = new xf_t; - (*xfbackup) = (*currentxf); - - if(currentxf->Usage() > 1) - { - xf_t* newxf = new xf_t(); - (*newxf) = (*currentxf); - newxf->SetFillStyle(fill); - newxf = m_pGlobalRecs->AddXFormat(newxf); - pxf = newxf; - pxf->MarkUsed(); - - } - else - { - xf_t* xfnew = new xf_t; - (*xfnew) = (*currentxf); - xfnew->SetFillStyle(fill); - xfnew = m_pGlobalRecs->ReplaceXFormat(xfbackup, xfnew); - pxf = xfnew; - pxf->MarkUsed(); - - } - delete xfbackup; -*/ -} - -void cell_t::locked(bool locked_opt) -{ - SET_XF_CELL_FUNCTION(SetLocked,locked_opt); -} - -void cell_t::hidden(bool hidden_opt) -{ - SET_XF_CELL_FUNCTION(SetHidden,hidden_opt); -} - -void cell_t::wrap(bool wrap_opt) -{ - SET_XF_CELL_FUNCTION(SetWrap,wrap_opt); -} - - - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - Implementation of the FONT record interface (font_i pure virtual interface) - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#define SET_CELL_FONT_FUNCTION(function,value) \ - { \ - bool samexf = true; \ - \ - xf_t* currentxf = pxf; \ - if(pxf == NULL) \ - currentxf = m_pGlobalRecs->GetDefaultXF(); \ - \ - xf_t* xfbackup = new xf_t; \ - (*xfbackup) = (*currentxf); \ - \ - xf_t* newxf = currentxf; \ - if(currentxf->Usage() > 1) \ - samexf = false; \ - \ - newxf = new xf_t(); \ - (*newxf) = (*currentxf); \ - \ - font_t* currentfont = newxf->GetFont(); \ - if(currentfont == NULL) \ - currentfont = m_pGlobalRecs->GetDefaultFont(); \ - if(currentfont->Usage() > 1) \ - { \ - font_t* newfont = new font_t(); \ - (*newfont) = (*currentfont); \ - newfont->function(value); \ - newfont = m_pGlobalRecs->AddFont(newfont); \ - newxf->SetFont(newfont); \ - } \ - else \ - { \ - font_t* fntnew = new font_t; \ - (*fntnew) = (*currentfont); \ - fntnew->function(value); \ - fntnew = m_pGlobalRecs->ReplaceFont(currentfont, fntnew); \ - newxf->SetFont(fntnew) ; \ - } \ - if(samexf) \ - { \ - newxf = m_pGlobalRecs->ReplaceXFormat(xfbackup, newxf); \ - pxf = newxf; \ - pxf->MarkUsed(); \ - } \ - else \ - { \ - newxf = m_pGlobalRecs->AddXFormat(newxf); \ - pxf = newxf; \ - pxf->MarkUsed(); \ - } \ - delete xfbackup; \ - } - -void cell_t::fontname(string fntname) -{ - - - SET_CELL_FONT_FUNCTION(SetName, fntname); -/* - bool samexf = true; - - xf_t* currentxf = pxf; - if(pxf == NULL) - currentxf = m_pGlobalRecs->GetDefaultXF(); - - xf_t* xfbackup = new xf_t; - (*xfbackup) = (*currentxf); - - xf_t* newxf = currentxf; - if(currentxf->Usage() > 1) - samexf = false; - - newxf = new xf_t(); - (*newxf) = (*currentxf); - - font_t* currentfont = newxf->GetFont(); - if(currentfont == NULL) - currentfont = m_pGlobalRecs->GetDefaultFont(); - if(currentfont->Usage() > 1) - { - font_t* newfont = new font_t(); - (*newfont) = (*currentfont); - newfont->SetName(fntname); - newfont = m_pGlobalRecs->AddFont(newfont); - newxf->SetFont(newfont); - } - else - { - font_t* fntnew = new font_t; - (*fntnew) = (*currentfont); - fntnew->SetName(fntname); - fntnew = m_pGlobalRecs->ReplaceFont(currentfont, fntnew); - newxf->SetFont(fntnew) ; - } - if(samexf) - { - newxf = m_pGlobalRecs->ReplaceXFormat(xfbackup, newxf); - pxf = newxf; - pxf->MarkUsed(); - } - else - { - newxf = m_pGlobalRecs->AddXFormat(newxf); - pxf = newxf; - pxf->MarkUsed(); - } - delete xfbackup; -*/ -} - - - - -void cell_t::fontheight(unsigned16_t fntheight) -{ - SET_CELL_FONT_FUNCTION(SetHeight,fntheight); -} - -void cell_t::fontbold(boldness_option_t fntboldness) -{ -/* - bool samexf = true; - - xf_t* currentxf = pxf; - if(pxf == NULL) - currentxf = m_pGlobalRecs->GetDefaultXF(); - - xf_t* xfbackup = new xf_t; - (*xfbackup) = (*currentxf); - - - xf_t* newxf = currentxf; - if(currentxf->Usage() > 1) - samexf = false; - - newxf = new xf_t(); - (*newxf) = (*currentxf); - - font_t* currentfont = newxf->GetFont(); - if(currentfont == NULL) - currentfont = m_pGlobalRecs->GetDefaultFont(); - if(currentfont->Usage() > 1) - { - font_t* newfont = new font_t(); - (*newfont) = (*currentfont); - newfont->SetBoldStyle(fntboldness); - newfont = m_pGlobalRecs->AddFont(newfont); - newxf->SetFont(newfont); - - } - else - { - font_t* fntnew = new font_t; - (*fntnew) = (*currentfont); - fntnew->SetBoldStyle(fntboldness); - fntnew = m_pGlobalRecs->ReplaceFont(currentfont, fntnew); - newxf->SetFont(fntnew) ; - } - - if(samexf) - { - newxf = m_pGlobalRecs->ReplaceXFormat(xfbackup, newxf); - pxf = newxf; - } - else - { - newxf = m_pGlobalRecs->AddXFormat(newxf); - pxf = newxf; - pxf->MarkUsed(); - } - - - delete xfbackup; -*/ - SET_CELL_FONT_FUNCTION(SetBoldStyle,fntboldness); -} - -void cell_t::fontunderline(underline_option_t fntunderline) -{ - SET_CELL_FONT_FUNCTION(SetUnderlineStyle,fntunderline); -} - -void cell_t::fontscript(script_option_t fntscript) -{ - SET_CELL_FONT_FUNCTION(SetScriptStyle,fntscript); -} - -void cell_t::fontcolor(color_name_t fntcolor) -{ - SET_CELL_FONT_FUNCTION(SetColor,fntcolor); -} - -void cell_t::fontattr(unsigned16_t attr) -{ - SET_CELL_FONT_FUNCTION(SetAttributes,attr); -} - -void cell_t::fontitalic(bool italic) -{ - SET_CELL_FONT_FUNCTION(SetItalic,italic); -} - -void cell_t::fontstrikeout(bool so) -{ - SET_CELL_FONT_FUNCTION(SetStrikeout,so); -} - -void cell_t::fontoutline(bool ol) -{ - SET_CELL_FONT_FUNCTION(SetOutline,ol); -} - -void cell_t::fontshadow(bool sh) -{ - SET_CELL_FONT_FUNCTION(SetShadow,sh); -} - - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: cell.cpp,v $ - * Revision 1.2 2008/10/25 18:39:53 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:54 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/cell.h b/uppdev/XLS/cell.h deleted file mode 100644 index 6c4b5707e..000000000 --- a/uppdev/XLS/cell.h +++ /dev/null @@ -1,174 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/cell.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:53 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -#ifndef CELL_H -#define CELL_H - -#include -#include - -#include -#include -#include - -namespace xlslib_core -{ - - class cell_t - : public xf_i , public font_i - { - public: - cell_t(); - virtual ~cell_t(); - unsigned16_t GetXFIndex(void); - unsigned16_t GetRow(void){return row;}; - unsigned16_t GetCol(void){return col;}; - - void SetXF(xf_t* pxfval){pxf = pxfval;}; - xf_t* GetXF(void){return pxf;}; - - virtual unsigned16_t GetSize() = 0; - virtual CUnit* GetData() = 0; - /* - bool operator<(const cell_t& right) const; - bool operator>(const cell_t& right) const; - bool operator%(const cell_t& right) const; - */ - bool operator==(const cell_t& right) const; - bool operator!=(const cell_t& right) const; - - void SetGlobalRecs(CGlobalRecords* pglobalr) {m_pGlobalRecs = pglobalr;}; - private: - CGlobalRecords *m_pGlobalRecs; - - protected: - unsigned16_t row; - unsigned16_t col; - - xf_t* pxf; - public: // xf_i interface - void font(font_t* fontidx); - void format(format_number_t formatidx); - void halign(halign_option_t ha_option); - void valign(valign_option_t va_option); - void indent(indent_option_t indent_option); - void orientation(txtori_option_t ori_option); - void fillfgcolor(color_name_t color); - void fillbgcolor(color_name_t color); - void fillstyle(fill_option_t fill); - void locked(bool locked_opt); - void hidden(bool hidden_opt); - void wrap(bool wrap_opt); - void borderstyle(border_side_t side, - border_style_t style, - color_name_t color); - public: //font_i interface - void fontname(std::string fntname); - void fontheight(unsigned16_t fntheight); - void fontbold(boldness_option_t fntboldness); - void fontunderline(underline_option_t fntunderline); - void fontscript(script_option_t fntscript); - void fontcolor(color_name_t fntcolor); - void fontattr(unsigned16_t attr); - void fontitalic(bool italic); - void fontstrikeout(bool so); - void fontoutline(bool ol); - void fontshadow(bool sh); - }; - - // #ifdef WIN32 - // A bug in the compiler doesn't allow to use the functor direcly - // with the list::sort() function - // template<> - // struct std::greater : public binary_function - // { - // public: - // bool operator()(cell_t* &a, cell_t* &b) - // { - // return (a->GetRow() < b->GetRow()); - // }; - // }; - // - // - // - // struct rowsort: public greater - // { - // public: - // bool operator()(cell_t* &a, cell_t* &b) const - // { - // return (a->GetRow() < b->GetRow()); - // }; - // }; - // #endif - - struct rowsort - { - public: -bool operator()(cell_t* &a, cell_t* &b) const - { - return (a->GetRow() < b->GetRow() ? true : false); - }; - }; - - class insertsort - { - public: - bool operator()(cell_t* a, cell_t* b) const - { - unsigned32_t aval = 100000*(a->GetRow()) + a->GetCol(); - unsigned32_t bval = 100000*(b->GetRow()) + b->GetCol(); - - return (aval < bval ? true : false); - }; - }; - - - typedef std::set Cell_List_t; - typedef Cell_List_t::iterator Cell_List_Itor_t; - - -} - -#endif // CELL_H - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: cell.h,v $ - * Revision 1.2 2008/10/25 18:39:53 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:47 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - diff --git a/uppdev/XLS/colinfo.cpp b/uppdev/XLS/colinfo.cpp deleted file mode 100644 index e78401cf1..000000000 --- a/uppdev/XLS/colinfo.cpp +++ /dev/null @@ -1,74 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/colinfo.cpp,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#include - -using namespace std; -using namespace xlslib_core; - - -CColInfo::CColInfo(colinfo_t* newci) -{ - SetRecordType(RECTYPE_COLINFO); - - AddValue16(newci->colfirst); - AddValue16(newci->collast); - AddValue16(newci->width); - - // TODO: Mark the XFormat as used - if(newci->xformat != NULL) - AddValue16(newci->xformat->GetIndex()); - else - AddValue16(0x0000); - - AddValue16(newci->flags); - - SetRecordLength(GetDataSize()-4); -} - -CColInfo::~CColInfo() -{ - -} - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: colinfo.cpp,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:49 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/colinfo.h b/uppdev/XLS/colinfo.h deleted file mode 100644 index 6979bc230..000000000 --- a/uppdev/XLS/colinfo.h +++ /dev/null @@ -1,87 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/colinfo.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef COLINFO_H -#define COLINFO_H - -#include -#include -#include -#include - -namespace xlslib_core -{ - - typedef struct - { - unsigned16_t colfirst; - unsigned16_t collast; - unsigned16_t width; - xf_t* xformat; - unsigned16_t flags; - } colinfo_t; - - struct colinfosort - { - public: -bool operator()(colinfo_t* const &a, colinfo_t* const &b) const - { - return (a->colfirst < b->colfirst); - }; - }; - - - typedef std::set Colinfo_List_t; - typedef Colinfo_List_t::iterator Colinfo_List_Itor_t; - - class CColInfo: public CRecord - { - public: - CColInfo(colinfo_t* newci); - ~CColInfo(); - }; - -} - -#endif //COLINFO_H -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: colinfo.h,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:43 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/colors.h b/uppdev/XLS/colors.h deleted file mode 100644 index c8d4af373..000000000 --- a/uppdev/XLS/colors.h +++ /dev/null @@ -1,143 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/colors.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#include - -#ifndef COLORS_H -#define COLORS_H - -namespace xlslib_core -{ - - -#define COLOR_CODE_BLACK (0x08) -#define COLOR_CODE_DARK_RED (0x10) -#define COLOR_CODE_RED (0x0a) -#define COLOR_CODE_FUCSIA (0x0e) -#define COLOR_CODE_COMBINED01 (0x2d) -#define COLOR_CODE_COMBINED02 (0x3c) -#define COLOR_CODE_COMBINED03 (0x35) -#define COLOR_CODE_COMBINED04 (0x34) -#define COLOR_CODE_COMBINED05 (0x33) -#define COLOR_CODE_COMBINED06 (0x2f) -#define COLOR_CODE_OLIVE (0x3b) -#define COLOR_CODE_DARK_YELLOW (0x13) -#define COLOR_CODE_COMBINED07 (0x32) -#define COLOR_CODE_YELLOW (0x0d) -#define COLOR_CODE_LIGHT_YELLOW (0x2b) -#define COLOR_CODE_DARK_GREEN (0x3a) -#define COLOR_CODE_GREEN (0x11) -#define COLOR_CODE_COMBINED08 (0x39) -#define COLOR_CODE_LIVING_GREEN (0x0b) -#define COLOR_CODE_LIGHT_GREEN (0x2a) -#define COLOR_CODE_COMBINED09 (0x38) -#define COLOR_CODE_BLUE_GREEN (0x15) -#define COLOR_CODE_AQUAMARINA (0x31) -#define COLOR_CODE_TURQOISE (0x0f) -#define COLOR_CODE_COMBINED10 (0x29) -#define COLOR_CODE_DARK_BLUE (0x12) -#define COLOR_CODE_BLUE (0x0c) -#define COLOR_CODE_LIGHT_BLUE (0x30) -#define COLOR_CODE_SKY_BLUE (0x28) -#define COLOR_CODE_COMBINED11 (0x2c) -#define COLOR_CODE_INDIGO (0x3e) -#define COLOR_CODE_BLUE_GRAY (0x36) -#define COLOR_CODE_VIOLET (0x14) -#define COLOR_CODE_PLUM (0x3d) -#define COLOR_CODE_LAVANDER (0x2e) -#define COLOR_CODE_COMBINED12 (0x3f) -#define COLOR_CODE_GRAY50 (0x17) -#define COLOR_CODE_GRAY40 (0x37) -#define COLOR_CODE_GRAY25 (0x16) -#define COLOR_CODE_WHITE (0x09) - - typedef enum - { - COLOR_BLACK, - COLOR_DARK_RED, - COLOR_RED, - COLOR_FUCSIA, - COLOR_COMBINED01, - COLOR_COMBINED02, - COLOR_COMBINED03, - COLOR_COMBINED04, - COLOR_COMBINED05, - COLOR_COMBINED06, - COLOR_OLIVE, - COLOR_DARK_YELLOW, - COLOR_COMBINED07, - COLOR_YELLOW, - COLOR_LIGHT_YELLOW, - COLOR_DARK_GREEN, - COLOR_GREEN, - COLOR_COMBINED08, - COLOR_LIVING_GREEN, - COLOR_LIGHT_GREEN, - COLOR_COMBINED09, - COLOR_BLUE_GREEN, - COLOR_AQUAMARINA, - COLOR_TURQOISE, - COLOR_COMBINED10, - COLOR_DARK_BLUE, - COLOR_BLUE, - COLOR_LIGHT_BLUE, - COLOR_SKY_BLUE, - COLOR_COMBINED11, - COLOR_INDIGO, - COLOR_BLUE_GRAY, - COLOR_VIOLET, - COLOR_PLUM, - COLOR_LAVANDER, - COLOR_COMBINED12, - COLOR_GRAY50, - COLOR_GRAY40, - COLOR_GRAY25, - COLOR_WHITE - }color_name_t; - -} - -#endif //COLORS_H - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: colors.h,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:44 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/common.h b/uppdev/XLS/common.h deleted file mode 100644 index 6601014b7..000000000 --- a/uppdev/XLS/common.h +++ /dev/null @@ -1,91 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/common.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef COMMON_H -#define COMMON_H - -#include -#include -#include -#include - -#include - -#ifdef HAVE_ICONV -#include -#endif - -namespace xlslib_core -{ - - // Some typedefs used only by xlslib core - typedef struct - { - unsigned16_t first_row; - unsigned16_t last_row; - - unsigned16_t first_col; - unsigned16_t last_col; - - } range_t; - - -#if defined(_MSC_VER) && defined(WIN32) - typedef std::list Range_List_t; - typedef Range_List_t::iterator Range_List_Itor_t; - - class range; - typedef std::list RangeObj_List_t; - typedef RangeObj_List_t::iterator RangeObj_List_Itor_t; - -#else - typedef std::list Range_List_t; - typedef Range_List_t::iterator Range_List_Itor_t; - - class range; - typedef std::list RangeObj_List_t; - typedef RangeObj_List_t::iterator RangeObj_List_Itor_t; -#endif -} -#endif //COMMON_H -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: common.h,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:57 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/config.h b/uppdev/XLS/config.h deleted file mode 100644 index 1eeffacbc..000000000 --- a/uppdev/XLS/config.h +++ /dev/null @@ -1,98 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/common/config.h,v $ - * $Revision: 1.3 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:53 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#ifndef CONFIG_H -#define CONFIG_H - -#ifdef HAVE_CONFIG_H -#include - -#define CFG_TRUE 1 -#define CFG_FALSE 0 - -#define ALLOCATOR_STL 0 -#define ALLOCATOR_BTI 1 - - -#if defined(USE_BTI_ALLOC) -# define ALLOCATOR_DFLT ALLOCATOR_BTI -#elif defined(ALLOC_BTI) -# define ALLOCATOR_DFLT ALLOCATOR_STL -#else -# define ALLOCATOR_DFLT ALLOCATOR_STL -#endif - - -#else // HAVE_CONFIG_H - -#if defined(_MSC_VER) && defined(WIN32) -// Fakes the inclusion of crtdbg.h to avoid duplicated symbols -// of (inlined) new() and delete() operators -#define _INC_CRTDBG -#else -#endif - -#define CFG_TRUE 1 -#define CFG_FALSE 0 - -#define ALLOCATOR_STL 0 -#define ALLOCATOR_BTI 1 - - -#if defined(ALLOC_STL) -# define ALLOCATOR_DFLT ALLOCATOR_STL -#elif defined(ALLOC_BTI) -# define ALLOCATOR_DFLT ALLOCATOR_BTI -#else -# define ALLOCATOR_DFLT ALLOCATOR_STL -#endif - - -#endif // HAVE_CONFIG_H - -#endif //CONFIG_H -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: config.h,v $ - * Revision 1.3 2008/10/25 18:39:53 dhoerl - * 2008 - * - * Revision 1.2 2004/09/01 00:47:04 darioglz - * + Modified to gain independence of target - * - * Revision 1.1.1.1 2004/08/27 16:32:05 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/continue.cpp b/uppdev/XLS/continue.cpp deleted file mode 100644 index 164b9f266..000000000 --- a/uppdev/XLS/continue.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/continue.cpp,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#include - -/* -****************************** -CContinue class implementation -****************************** -*/ - -using namespace std; -using namespace xlslib_core; - - -CContinue::CContinue(unsigned8_t* data, unsigned32_t size) -{ - SetRecordType(RECTYPE_CONTINUE ); - AddDataArray(data,size); - - SetRecordLength(GetDataSize()-4); -} - -CContinue::~CContinue() -{} - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: continue.cpp,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:53 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/continue.h b/uppdev/XLS/continue.h deleted file mode 100644 index f90bc7846..000000000 --- a/uppdev/XLS/continue.h +++ /dev/null @@ -1,72 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/continue.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#ifndef CONTINUE_H -#define CONTINUE_H - -#include -#include -#include - -namespace xlslib_core -{ - - - class CContinue: public CRecord - { - protected: - - public: - - CContinue(unsigned8_t* data, unsigned32_t size); - ~CContinue(); - - - - }; -} - -#endif //CONTINUE_H - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: continue.h,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:49 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/crc.cpp b/uppdev/XLS/crc.cpp deleted file mode 100644 index 77a5c109c..000000000 --- a/uppdev/XLS/crc.cpp +++ /dev/null @@ -1,254 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/crc.cpp,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - - -#include - -using namespace std; -using namespace xlslib_core; - -/* - * Derive parameters from the standard-specific parameters in crc.h. - */ -#define WIDTH (8 * sizeof(crc32_t)) -#define TOPBIT (1 << (WIDTH - 1)) - -#if REFLECT_DATA == TRUE -#undef REFLECT_DATA -#define REFLECT_DATA(X) ((unsigned char) reflect((X), 8)) -#else -#undef REFLECT_DATA -#define REFLECT_DATA(X) (X) -#endif - -#if REFLECT_REMAINDER == TRUE -#undef REFLECT_REMAINDER -#define REFLECT_REMAINDER(X) ((crc32_t) reflect((X), WIDTH)) -#else -#undef REFLECT_REMAINDER -#define REFLECT_REMAINDER(X) (X) -#endif - -/* - const crc32_t crc::CRC_CCITT_TABLE[256] = - { - 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, - 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, - 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, - 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, - 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, - 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, - 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, - 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, - 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, - 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, - 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, - 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, - 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, - 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, - 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, - 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0, - }; - - - const crc32_t crc::CRC_16_TABLE[256] = - { - 0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011, 0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022, - 0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072, 0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041, - 0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2, 0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1, - 0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1, 0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082, - 0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192, 0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1, - 0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1, 0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2, - 0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151, 0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162, - 0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132, 0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101, - 0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312, 0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321, - 0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371, 0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342, - 0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1, 0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2, - 0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2, 0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381, - 0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291, 0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2, - 0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2, 0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1, - 0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252, 0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261, - 0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231, 0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202, - }; -*/ - -const crc32_t crc::CRC_32_TABLE[256] = -{ - 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, - 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd, - 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, - 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, - 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, - 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, - 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, - 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a, - 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, - 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, - 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3, - 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, - 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, - 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, - 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, - 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 -}; - - -crc::~crc() -{ - -} - -/********************************************************************* - * - * Function: reflect() - * - * Description: Reorder the bits of a binary sequence, by reflecting - * them about the middle position. - * - * Notes: No checking is done that nBits <= 32. - * - * Returns: The reflection of the original data. - * - *********************************************************************/ -unsigned32_t -crc::reflect(unsigned32_t data, unsigned char nBits) -{ - unsigned32_t reflection = 0x00000000; - unsigned char bit; - - /* - * Reflect the data about the center bit. - */ - for (bit = 0; bit < nBits; ++bit) - { - /* - * If the LSB bit is set, set the reflection of it. - */ - if (data & 0x01) - { - reflection |= (1 << ((nBits - 1) - bit)); - } - - data = (data >> 1); - } - - return (reflection); - -} /* reflect() */ - - - - - - - -/********************************************************************* - * - * Function: crcInit() - * - * Description: Populate the partial CRC lookup table. - * - * Notes: This function must be rerun any time the CRC standard - * is changed. If desired, it can be run "offline" and - * the table results stored in an embedded system's ROM. - * - * Returns: None defined. - * - *********************************************************************/ -crc::crc() -{ - -} /* crcInit() */ - - -/********************************************************************* - * - * Function: crcFast() - * - * Description: Compute the CRC of a given message. - * - * Notes: crcInit() must be called first. - * - * Returns: The CRC of the message. - * - *********************************************************************/ -crc32_t -crc::get(string& message) -{ - - unsigned char data; - size_t byte; - - crc32_t remainder = INITIAL_REMAINDER; - /* - * Divide the message by the polynomial, a byte at a time. - */ - size_t nBytes = message.size(); - for (byte = 0; byte < nBytes; ++byte) - { - data = (unsigned char)(REFLECT_DATA(message[byte]) ^ (remainder >> (WIDTH - 8))); - remainder = crc::CRC_32_TABLE[data] ^ (remainder << 8); - } - - /* - * The final remainder is the CRC. - */ - return (REFLECT_REMAINDER(remainder) ^ FINAL_XOR_VALUE); - -} /* crcFast() */ - - -crc32_t -crc::get() -{ - return get(m_data); -} - - -string& crc::getdata() -{ - return m_data; -} - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: crc.cpp,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:53 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/crc.h b/uppdev/XLS/crc.h deleted file mode 100644 index 54840e2dd..000000000 --- a/uppdev/XLS/crc.h +++ /dev/null @@ -1,104 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/crc.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#ifndef _crc_h -#define _crc_h - -#include - -#include -#include -#include - -#define FALSE 0 -#define TRUE !FALSE - -/* - * Select the CRC standard from the list that follows. - */ -#define CRC32 - -#define CRC_NAME "CRC-32" - -#define POLYNOMIAL 0x04C11DB7 -#define INITIAL_REMAINDER 0xFFFFFFFF -#define FINAL_XOR_VALUE 0xFFFFFFFF -#define REFLECT_DATA TRUE -#define REFLECT_REMAINDER TRUE -#define CHECK_VALUE 0xCBF43926 - -namespace xlslib_core -{ - - typedef unsigned32_t crc32_t; - - class crc - { - public: - crc(); - ~crc(); - - crc32_t get(std::string& message); - crc32_t get(); - - void operator<<(std::string newstr) { m_data += newstr; } - void operator<<(unsigned32_t newdata) { m_data += str_stream(newdata); } - void operator<<(unsigned64_t newdata) { m_data += str_stream(newdata); } - void operator<<(unsigned char newdata) { m_data += str_stream(newdata); } - void operator<<(unsigned short newdata) { m_data += str_stream(newdata); } - void operator<<(bool newdata) { m_data += str_stream(newdata); } - void operator<<(double newdata) { m_data += str_stream(newdata); } - - std::string& getdata(); - private: - std::string m_data; - static const crc32_t CRC_32_TABLE[256]; - unsigned32_t reflect(unsigned32_t data, unsigned char nBits); - }; - -} - -#endif /* _crc_h */ - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: crc.h,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:46 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/data/data3.h b/uppdev/XLS/data/data3.h deleted file mode 100644 index f3e84f815..000000000 --- a/uppdev/XLS/data/data3.h +++ /dev/null @@ -1,314 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/data/data3.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:53 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#ifndef DATA3_H -#define DATA3_H - -// 4096 of the first bytes - -const unsigned8_t xlslib_core::CSummaryInfo::summ_info_data[] = { - 0xfe, 0xff, 0x00, 0x00, 0x05, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xe0, 0x85, 0x9f, 0xf2, - 0xf9, 0x4f, 0x68, 0x10, 0xab, 0x91, 0x08, 0x00, 0x2b, 0x27, 0xb3, 0xd9, 0x30, 0x00, 0x00, 0x00, - 0xfc, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, - 0x12, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, - 0x0d, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0xe4, 0x04, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, - 0x58, 0x4c, 0x53, 0x4c, 0x49, 0x42, 0x20, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x00, 0x73, 0x00, - 0x1e, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x58, 0x4c, 0x53, 0x4c, 0x69, 0x62, 0x20, 0x76, - 0x58, 0x2e, 0x58, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x59, 0x65, 0x69, 0x63, - 0x6f, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0d, 0x0a, 0x77, 0x77, 0x77, 0x2e, - 0x79, 0x65, 0x69, 0x63, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x0d, 0x0a, 0x00, 0x1e, 0x00, 0x00, 0x00, - 0x0f, 0x00, 0x00, 0x00, 0x44, 0x61, 0x72, 0x69, 0x6f, 0x20, 0x47, 0x6f, 0x6e, 0x7a, 0x61, 0x6c, - 0x65, 0x7a, 0x00, 0x0a, 0x1e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x4d, 0x69, 0x63, 0x72, - 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x45, 0x78, 0x63, 0x65, 0x6c, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x80, 0x7f, 0x5b, 0x0d, 0xb9, 0xa0, 0xc3, 0x01, 0x40, 0x00, 0x00, 0x00, 0x80, 0xd2, 0xc0, 0xa4, - 0xb9, 0xa0, 0xc3, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - - // Master blocks - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -#endif //DATA3_H - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: data3.h,v $ - * Revision 1.2 2008/10/25 18:39:53 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:59 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/data/data4.h b/uppdev/XLS/data/data4.h deleted file mode 100644 index 65db5f181..000000000 --- a/uppdev/XLS/data/data4.h +++ /dev/null @@ -1,315 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/data/data4.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:53 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef DATA4_H -#define DATA4_H - - -//////////////////////////////////////////////////////////////////////// - -const unsigned8_t xlslib_core::CDocSummaryInfo::doc_summ_info_data[] = { - 0xfe, 0xff, 0x00, 0x00, 0x05, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0xd5, 0xcd, 0xd5, - 0x9c, 0x2e, 0x1b, 0x10, 0x93, 0x97, 0x08, 0x00, 0x2b, 0x2c, 0xf9, 0xae, 0x30, 0x00, 0x00, 0x00, - 0x98, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, - 0x0f, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xe4, 0x04, 0x00, 0x00, - 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x69, 0x63, 0x72, 0x0b, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x10, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x48, 0x6f, 0x6a, 0x61, 0x31, 0x00, 0x0c, 0x10, - 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x48, 0x6f, - 0x6a, 0x61, 0x73, 0x20, 0x64, 0x65, 0x20, 0x63, 0xe1, 0x6c, 0x63, 0x75, 0x6c, 0x6f, 0x00, 0x03, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - - -#endif //DATA4_H - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - - * $Log: data4.h,v $ - * Revision 1.2 2008/10/25 18:39:53 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:59 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - diff --git a/uppdev/XLS/datast.cpp b/uppdev/XLS/datast.cpp deleted file mode 100644 index c6d0f8592..000000000 --- a/uppdev/XLS/datast.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/datast.cpp,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#include - -namespace xlslib_core -{ - -/* -*********************************** -CDataStorage class Implementation -*********************************** -*/ - - CDataStorage::CDataStorage() - :m_DataSize(0) - { - - } - - CDataStorage::~CDataStorage() - { - // Delete all the data. (Only if it exists) - if(!empty()) - { - do - { - delete front(); - pop_front(); - - }while(!empty()); - } - } - - - void CDataStorage::operator+=(CUnit* from) - { - push_back(from); - m_DataSize += from->GetDataSize(); - - } - - unsigned32_t CDataStorage::GetDataSize() - { - return m_DataSize; - } -} - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: datast.cpp,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:46 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/datast.h b/uppdev/XLS/datast.h deleted file mode 100644 index 3e7a4e883..000000000 --- a/uppdev/XLS/datast.h +++ /dev/null @@ -1,84 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/datast.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - - -#ifndef DATAST_H -#define DATAST_H - -#include -#include -#include - -/* -****************************** -COleFile class declaration -****************************** -*/ - -namespace xlslib_core -{ - - typedef std::list DataList_t; - typedef DataList_t::iterator DataList_Itor_t; - - class CDataStorage: public DataList_t - { - private: - unsigned32_t m_DataSize; - - protected: - - - public: - CDataStorage ( ); - ~CDataStorage ( ); - - void operator+=(CUnit* from); - unsigned32_t GetDataSize(); - - }; -} -#endif //DATAST_H - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: datast.h,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:54 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/docsumminfo.cpp b/uppdev/XLS/docsumminfo.cpp deleted file mode 100644 index 542b3dbc2..000000000 --- a/uppdev/XLS/docsumminfo.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/docsumminfo.cpp,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#include -#include // Temporarilly used to add data for summary info - -using namespace std; -using namespace xlslib_core; - -/* -********************************************************************** -CDocSummaryInfo class implementation -********************************************************************** -*/ - -CDocSummaryInfo::CDocSummaryInfo() -{ - XTRACE("WRITE_DOC_SUMMARY"); - - CUnit* ptraildata = new CUnit; - ptraildata->AddDataArray(CDocSummaryInfo::doc_summ_info_data, sizeof(CDocSummaryInfo::doc_summ_info_data)); - (*this) += ptraildata; -} - -CDocSummaryInfo::~CDocSummaryInfo() -{ - - -} - - -/* -*********************************** -*********************************** -*/ - -CUnit* CDocSummaryInfo::DumpData(void) -{ - - XTRACE("CDocSummaryInfo::DumpData"); - return (CUnit*)this; -} - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: docsumminfo.cpp,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:43 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/docsumminfo.h b/uppdev/XLS/docsumminfo.h deleted file mode 100644 index 63ef32d03..000000000 --- a/uppdev/XLS/docsumminfo.h +++ /dev/null @@ -1,78 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright (C) Yeico S. A. de C. V. - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/docsumminfo.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#ifndef DOCSUMMARYINFO_H -#define DOCSUMMARYINFO_H - -#include -#include -#include - - -namespace xlslib_core -{ - - /* -******************************** -CDocSummaryInfo class declaration -******************************** -*/ - - - class CDocSummaryInfo: public CDataStorage - { - private: - static const unsigned8_t doc_summ_info_data[]; - - protected: - - public: - CDocSummaryInfo(); - ~CDocSummaryInfo(); - - CUnit* DumpData(); - - }; - -} -#endif //DOCSUMMARYINFO_H - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: docsumminfo.h,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:54 darioglz - * Initial Import. - * - * Revision 1.6 2004/04/06 22:35:43 dgonzalez - * + Added namespace xlslib_core to isolate the core xlslib library names. - * - * Revision 1.5 2004/01/29 03:18:55 dgonzalez - * + Using the config.h file - * - * Revision 1.4 2003/12/05 00:30:06 dgonzalez - * + Common include files were placed in common.h (and this file was - * included instead. - * - * Revision 1.3 2003/11/26 16:49:26 dgonzalez - * + Indented and untabified - * - * Revision 1.2 2003/10/24 23:24:32 dgonzalez - * + Added CVS-Keyword substitution. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ diff --git a/uppdev/XLS/extformat.cpp b/uppdev/XLS/extformat.cpp deleted file mode 100644 index a7be2f254..000000000 --- a/uppdev/XLS/extformat.cpp +++ /dev/null @@ -1,1363 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/extformat.cpp,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#include -#include - -/* -********************************** -CExtFormat class implementation -********************************** -*/ - -using namespace std; -using namespace xlslib_core; - - -CExtFormat::CExtFormat(bool is_cell) -{ - SetRecordType(RECTYPE_XF); - InitDummy(is_cell); - SetRecordLength(GetDataSize()-4); -} - -CExtFormat::CExtFormat(xf_t* xfdef) -{ - SetRecordType(RECTYPE_XF); - InitDummy(xfdef->IsCell()); - SetRecordLength(GetDataSize()-4); - -// Here initialize the record with the values from the input structure - - SetFontIndex(xfdef->GetFontIndex()); - SetFormatIndex(xfdef->GetFormatIndex()); - SetHorizAlign(xfdef->GetHAlign()); - SetVertAlign(xfdef->GetVAlign()); - SetIndent(xfdef->GetIndent()); - SetTxtOrientation(xfdef->GetTxtOrientation()); - - SetFGColorIndex(xfdef->GetFillFGColor()); - SetBGColorIndex(xfdef->GetFillBGColor()); - SetFillPattern(xfdef->GetFillStyle()); - - if(xfdef->IsLocked()) SetLocked(); - if(xfdef->IsHidden()) SetHidden(); - if(xfdef->IsWrap()) SetWrap(); - - SetBorder(BORDER_BOTTOM, xfdef->GetBorderStyle(BORDER_BOTTOM), - xfdef->GetBorderColor(BORDER_BOTTOM)); - SetBorder(BORDER_TOP, xfdef->GetBorderStyle(BORDER_TOP), - xfdef->GetBorderColor(BORDER_TOP)); - SetBorder(BORDER_LEFT, xfdef->GetBorderStyle(BORDER_LEFT), - xfdef->GetBorderColor(BORDER_LEFT)); - SetBorder(BORDER_RIGHT, xfdef->GetBorderStyle(BORDER_RIGHT), - xfdef->GetBorderColor(BORDER_RIGHT)); -} - -CExtFormat::~CExtFormat() -{ -} - - -/* -********************************** -********************************** -*/ -void CExtFormat::InitDummy(bool is_cell) -{ - - // An style-XF record is set by default. - // Each field has to be modified individually before use it - - //The default style is a dummy. The flags that indicate what the style affects (byte 11) - // are disabled (set to 1). - unsigned8_t xfdefault[] = { - -#if VERSION_BIFF == VERSION_BIFF5 -/* - Open Office offsets - 0 2 4 6 8 10 12 14 16 18 20 - 0x00,0x00,0x00,0x00,0xf4,0xff,0x20,0xf0,0xc0,0x00,0x01,0x00,0x00,0x00,0x00,0x00 <- ORIGINAL -*/ - 0x00,0x00,0x00,0x00,0xf4,0xff,0x20,0xf0,0xc0,0x20,0x01,0x00,0x00,0x00,0x00,0x00, - // STYLE_XF | INDEX=0xFFF -> Style - // HALIGN -> General, VALIGN -> BOTTOM - // IGNORE TOP 4 bits (style issue) - // 0x40 Pattern Color, then lowest bit of 0x41 (next) - // 0x41 Pattern background color right shifted one bit - // Fill Pattern -> 1 Black (well, fully colored, not a pattern) - -#else - 0x00,0x00,0x00,0x00,0xf4,0xff,0x20,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xc0,0x20 - // STYLE_XF | INDEX=0xFFF -> Style - // HALIGN -> General, VALIGN -> BOTTOM - // IGNORE TOP 4 bits (style issue) - // Fill Pattern -> 1 Black, left shifted 2 bits - // 0x40 Pattern Color, then lowest bit of 0x41 (next) - // 0x41 Pattern background color right shifted one bit -#endif - - }; - - AddDataArray(xfdefault, sizeof(xfdefault)); - - if(is_cell) - { - unsigned16_t value; - - // Get the field where options are set - GetValue16From((signed16_t*)&value, XF_OFFSET_PROP); - // Set the cell's style parent to Normal - value &= (~XF_PROP_XFPARENT); - // Set the style = cell. - value &= (~XF_PROP_STYLE); - - SetValueAt((signed16_t)value, XF_OFFSET_PROP); - - // The cell doesn't heritage anything from its parent style - GetValue16From((signed16_t*)&value, XF_OFFSET_ALIGN); - - value &= (~(XF_ALIGN_ATRFONT|XF_ALIGN_ATRALC|XF_ALIGN_ATRBDR|XF_ALIGN_ATRPAT|XF_ALIGN_ATRPROT)); - SetValueAt((signed16_t)value, XF_OFFSET_ALIGN); - } -} - -/* -********************************** -********************************** -*/ -bool CExtFormat::IsCell() -{ - unsigned16_t val; - GetValue16From((signed16_t*)&val, XF_OFFSET_PROP); - - - return(val&XF_PROP_STYLE?true:false); - -} - -/* -********************************** -********************************** -*/ -void CExtFormat::SetFlag(unsigned16_t flag) -{ - - unsigned16_t value; - GetValue16From((signed16_t*)&value, XF_OFFSET_ALIGN); - - if(IsCell()) - { - // Cells indicate that a characteristic is not equal - // from its parent with the flag set. - value |= flag; - } - else - { - // Styles indicate that a characteristic is - // being implemented with the flag cleared. - value &= (~flag); - } - SetValueAt((signed16_t)value, XF_OFFSET_ALIGN); - -} - -/* -********************************** -********************************** -*/ -void CExtFormat::ClearFlag(unsigned16_t flag) -{ - - unsigned16_t value; - GetValue16From((signed16_t*)&value, XF_OFFSET_ALIGN); - - if(!IsCell()) - { - // Cells indicate that a characteristic is not equal - // from its parent with the flag set. - value |= flag; - } - else - { - // Styles indicate that a characteristic is - // being implemented with the flag cleared. - value &= (~flag); - } - SetValueAt((signed16_t)value, XF_OFFSET_ALIGN); - -} -/* -********************************** -********************************** -*/ -int CExtFormat::SetFontIndex(unsigned16_t fontindex) -{ - // Set the index value - int errcode = SetValueAt((signed16_t)fontindex, XF_OFFSET_FONT); - - // Set the related flag. - SetFlag(XF_ALIGN_ATRFONT); - - return errcode; -} - -/* -********************************** -********************************** -*/ -unsigned16_t CExtFormat::GetFontIndex(void) -{ - unsigned16_t fontval; - GetValue16From((signed16_t*)&fontval, XF_OFFSET_FONT); - - return(fontval); -} - -/* -********************************** -********************************** -*/ -int CExtFormat::SetFormatIndex(unsigned16_t formatindex) -{ - // Set the index value - int errcode = SetValueAt((signed16_t)formatindex, XF_OFFSET_FORMAT); - - // Set the related flag. - SetFlag(XF_ALIGN_ATRNUM); - - return errcode; -} - -/* -********************************** -********************************** -*/ -unsigned16_t CExtFormat::GetFormatIndex(void) -{ - unsigned16_t formatval; - GetValue16From((signed16_t*)&formatval, XF_OFFSET_FORMAT); - - return(formatval); -} - -/* -********************************** -********************************** -*/ -void CExtFormat::SetLocked() -{ - unsigned16_t value; - GetValue16From((signed16_t*)&value, XF_OFFSET_PROP); - - value |= XF_PROP_LOCKED; - - SetValueAt((signed16_t)value, XF_OFFSET_PROP); - - SetFlag(XF_ALIGN_ATRPROT); -} - -/* -********************************** -********************************** -*/ -void CExtFormat::SetHidden() -{ - unsigned16_t value; - GetValue16From((signed16_t*)&value, XF_OFFSET_PROP); - - value |= XF_PROP_HIDDEN; - - SetValueAt((signed16_t)value, XF_OFFSET_PROP); - - SetFlag(XF_ALIGN_ATRPROT); -} - - -/* -********************************** -********************************** -*/ -void CExtFormat::SetHorizAlign(unsigned8_t alignval) -{ - unsigned16_t value; - GetValue16From((signed16_t*)&value, XF_OFFSET_ALIGN); - value = (value&(~XF_ALIGN_HORIZONTAL))|(alignval & XF_ALIGN_HORIZONTAL); - SetValueAt((signed16_t)value, XF_OFFSET_ALIGN); - - SetFlag(XF_ALIGN_ATRALC); -} - -/* -********************************** -********************************** -*/ -void CExtFormat::SetWrap() -{ - unsigned16_t value; - GetValue16From((signed16_t*)&value, XF_OFFSET_ALIGN); - - value |= XF_ALIGN_WRAP; - - SetValueAt((signed16_t)value, XF_OFFSET_ALIGN); - - SetFlag(XF_ALIGN_ATRALC); -} -#if VERSION_BIFF == VERSION_BIFF8 -/* -********************************** -********************************** -*/ - -void CExtFormat::SetIndent(unsigned8_t indentval) -{ - unsigned32_t value, mask; - - - if(indentval & XF_INDENT_LVL) { - mask = XF_INDENT_LVL; - } else - if(indentval & XF_INDENT_SHRINK2FIT) { - mask = XF_INDENT_SHRINK2FIT; - } else - if(indentval & (XF_INDENT_CONTEXT|XF_INDENT_L2R|XF_INDENT_R2L)) { - mask = XF_INDENT_DIR; - } else { - mask = XF_INDENT_LVL | XF_INDENT_SHRINK2FIT | XF_INDENT_DIR; - } - - mask <<= XF_INDENT_SHIFTPOS; - - GetValue32From((signed32_t*)&value, XF_OFFSET_ALIGN); - - unsigned32_t indentval32 = (unsigned32_t)indentval << XF_INDENT_SHIFTPOS; // Place the option at the right bit position - value = (value&(~mask))|(indentval32 & mask); - - SetValueAt((signed32_t)value, XF_OFFSET_ALIGN); -} -#endif -/* -********************************** -********************************** -*/ -void CExtFormat::SetVertAlign(unsigned8_t alignval) -{ - unsigned16_t value; - GetValue16From((signed16_t*)&value, XF_OFFSET_ALIGN); - unsigned16_t alignval16 = alignval << XF_ALIGN_SHIFTPOS_VALIGN; // Place the option at the right bit position - value = (value&(~XF_ALIGN_VERTICAL))|(alignval16 & XF_ALIGN_VERTICAL); - SetValueAt((signed16_t)value, XF_OFFSET_ALIGN); - - SetFlag(XF_ALIGN_ATRALC); -} - -/* -********************************** -********************************** -*/ -void CExtFormat::SetTxtOrientation(unsigned8_t alignval) -{ - unsigned16_t value; - GetValue16From((signed16_t*)&value, XF_OFFSET_ALIGN); - unsigned16_t alignval16 = alignval << XF_ORI_SHIFTPOS; // Place the option at the right bit position - - value = (value&(~XF_ALIGN_ORIENTATION))|(alignval16 & XF_ALIGN_ORIENTATION); - SetValueAt((signed16_t)value, XF_OFFSET_ALIGN); -} - - -/* -********************************** -********************************** -*/ -void CExtFormat::SetFGColorIndex(unsigned8_t color) -{ - unsigned16_t value; - GetValue16From((signed16_t*)&value, XF_OFFSET_COLOR); - - - // value = (value&(~XF_COLOR_FOREGROUND))|(color & XF_COLOR_FOREGROUND); - // Clear the field for Foreground color - value &= (~XF_COLOR_FOREGROUND); - // Set the new color - value |= (color & XF_COLOR_FOREGROUND); - - SetValueAt((signed16_t)value, XF_OFFSET_COLOR); - - SetFlag(XF_ALIGN_ATRPAT); - -} - -/* -********************************** -********************************** -*/ -void CExtFormat::SetBGColorIndex(unsigned8_t color) -{ - unsigned16_t value; - GetValue16From((signed16_t*)&value, XF_OFFSET_COLOR); - unsigned16_t color16 = color << XF_COLOR_SHIFTPOS_BG; - -// value = (value&(~XF_COLOR_FOREGROUND))|(color16 & XF_COLOR_FOREGROUND); - // Clear the field for Foreground color - value &= (~XF_COLOR_BACKGROUND); - // Set the new color - value |= (color16 & XF_COLOR_BACKGROUND); - - - SetValueAt((signed16_t)value, XF_OFFSET_COLOR); - - SetFlag(XF_ALIGN_ATRPAT); -} - -/* -********************************** -********************************** -*/ -void CExtFormat::SetFillPattern(unsigned8_t pattern) -{ -#if VERSION_BIFF == VERSION_BIFF5 - unsigned16_t value; - GetValue16From((signed16_t*)&value, XF_OFFSET_BORDER0); - - value = (value&(~XF_BORDER_FILLPATTERN))|(pattern & XF_BORDER_FILLPATTERN); - SetValueAt((signed16_t)value, XF_OFFSET_BORDER0); - - SetFlag(XF_ALIGN_ATRPAT); -#else - unsigned32_t value, pattern32 = pattern; - GetValue32From((signed32_t*)&value, XF_OFFSET_BORDERB); - - value &= ~XF_BORDER_FILLPATTERN; - - pattern32 <<= XF_SHIFTPOS_FILLPATTERN; - value |= (pattern32 & XF_BORDER_FILLPATTERN); - SetValueAt((signed16_t)value, XF_OFFSET_BORDERB); - - SetFlag(XF_ALIGN_ATRPAT); -#endif -} - - -/* -********************************** -********************************** -*/ -void CExtFormat::SetBorder(border_side_t border, unsigned16_t style, unsigned16_t color) -{ - - switch(border) - { - - case BORDER_BOTTOM: - { -#if VERSION_BIFF == VERSION_BIFF5 - unsigned16_t value, color16 = color; - - GetValue16From((signed16_t*)&value, XF_OFFSET_BORDER0); - value = (value&(~XF_BORDER_BOTTOMSTYLE))| - ((style<= sizeof(unsigned64_t)) { -// xfcrc<<(unsigned64_t)font; -// } else { - xfcrc<<(unsigned64_t)font; -// } - xfcrc<<(unsigned32_t)format; - xfcrc<MarkUsed(); - -} - -/* -********************************** -********************************** -*/ -bool xf_t::IsUsed(void) -{ - return(m_usage_counter != 0); -} - -/* -********************************** -********************************** -*/ -void xf_t::SetFont(font_t* fontidx) -{ - if(fontidx != NULL) - fontidx->MarkUsed(); - font = fontidx; - - m_sigchanged = true; - -} - -font_t* xf_t::GetFont(void) -{ - return font; -} - -unsigned16_t xf_t::GetFontIndex(void) -{ - if(font != NULL) - return font->GetIndex(); - else - return 0x0000; -} - -/* -********************************** -********************************** -*/ - -void xf_t::SetFormat(format_number_t formatidx){ - - format = formatidx; - m_sigchanged = true; -}; - -unsigned16_t xf_t::GetFormatIndex(void) -{ - return xf_t::FORMAT_NUM_OPTIONS_TABLE[format]; -}; - -format_number_t xf_t::GetFormat(void) -{ - return format; -} -/* -********************************** -********************************** -*/ - -/* Cell option wrappers*/ -void xf_t::SetBorderStyle(border_side_t side, - border_style_t style, - color_name_t color) -{ - switch (side) - { - case BORDER_BOTTOM: - bottom_border_style = BORDERSTYLE_OPTIONS_TABLE[style]; - bottom_border_color = COLOR_OPTIONS_TABLE[color]; - - break; - - case BORDER_TOP: - top_border_style = BORDERSTYLE_OPTIONS_TABLE[style]; - top_border_color = COLOR_OPTIONS_TABLE[color]; - - break; - - case BORDER_LEFT: - left_border_style = BORDERSTYLE_OPTIONS_TABLE[style]; - left_border_color = COLOR_OPTIONS_TABLE[color]; - - break; - - case BORDER_RIGHT: - right_border_style = BORDERSTYLE_OPTIONS_TABLE[style]; - right_border_color = COLOR_OPTIONS_TABLE[color]; - - break; - - default: - // It cannot get here - break; - - } - - m_sigchanged = true; - -} - -/* -********************************** -********************************** -*/ -unsigned8_t xf_t::GetBorderStyle(border_side_t side) -{ - unsigned8_t ret_style = XF_BRDOPTION_NONE; - - switch (side) - { - - case BORDER_BOTTOM: - ret_style = bottom_border_style; - break; - - case BORDER_TOP: - ret_style = top_border_style; - break; - - case BORDER_LEFT: - ret_style = left_border_style; - break; - - case BORDER_RIGHT: - ret_style = right_border_style; - break; - - default: - // It cannot get here - break; - - } - - return ret_style; -} - -/* -********************************** -********************************** -*/ -unsigned8_t xf_t::GetBorderColor(border_side_t side) -{ - unsigned8_t ret_color = XF_COLOR_CODE_BLACK; - - switch (side) - { - - case BORDER_BOTTOM: - ret_color = bottom_border_color; - break; - - case BORDER_TOP: - ret_color = top_border_color; - break; - - case BORDER_LEFT: - ret_color = left_border_color; - break; - - case BORDER_RIGHT: - ret_color = right_border_color; - break; - - default: - // It cannot get here - break; - - } - return ret_color; - -} - -void xf_t::operator=(xf_t& right) -{ - index = 0x0000; - font = right.font; - format = right.format; - halign = right.halign; - valign = right.valign; - indent = right.indent; - - txtorientation = right.txtorientation; - fill_fgcolor = right.fill_fgcolor; - fill_bgcolor = right.fill_bgcolor; - fillstyle = right.fillstyle; - - locked = right.locked; - hidden = right.hidden; - wrap = right.wrap; - is_cell = right.is_cell; - - top_border_style = right.top_border_style; - top_border_color = right.top_border_color; - - bottom_border_style = right.bottom_border_style; - bottom_border_color = right.bottom_border_color; - - left_border_style = right.left_border_style; - left_border_color = right.left_border_color; - - right_border_style = right.right_border_style; - right_border_color = right.right_border_color; - - m_sigchanged = true; - -} - -/* Horizontal Align option wrappers*/ -void xf_t::SetHAlign(halign_option_t ha_option) -{ - halign = xf_t::HALIGN_OPTIONS_TABLE[ha_option]; - m_sigchanged = true; -} - -unsigned8_t xf_t::GetHAlign(void) -{ - return halign; -} - -/* Vertical Align option wrappers*/ -void xf_t::SetVAlign(valign_option_t va_option) -{ - valign = xf_t::VALIGN_OPTIONS_TABLE[va_option]; - m_sigchanged = true; -} - -unsigned8_t xf_t::GetVAlign(void) -{ - return valign; -} - -void xf_t::SetIndent(indent_option_t indent_option) -{ - - indent = xf_t::INDENT_OPTIONS_TABLE[indent_option]; - - m_sigchanged = true; -} -unsigned8_t xf_t::GetIndent(void) -{ - return indent; -} - -/* Text orientation option wrappers*/ -void xf_t::SetTxtOrientation(txtori_option_t ori_option) -{ - txtorientation = xf_t::TXTORI_OPTIONS_TABLE[ori_option]; - m_sigchanged = true; -} - -unsigned8_t xf_t::GetTxtOrientation(void) -{ - return txtorientation; -} - -/* Fill Foreground color option wrappers*/ -void xf_t::SetFillFGColor(color_name_t color) -{ - fill_fgcolor = xf_t::COLOR_OPTIONS_TABLE[color]; - m_sigchanged = true; -} - -unsigned8_t xf_t::GetFillFGColor(void) -{ - return fill_fgcolor; -} - - -/* Fill Background color option wrappers*/ -void xf_t::SetFillBGColor(color_name_t color) -{ - fill_bgcolor = xf_t::COLOR_OPTIONS_TABLE[color]; - m_sigchanged = true; -} - -unsigned8_t xf_t::GetFillBGColor(void) -{ - return fill_bgcolor; -} - -/* Fill Style option wrappers*/ -void xf_t::SetFillStyle(fill_option_t fill) -{ - fillstyle = xf_t::FILL_OPTIONS_TABLE[fill]; - m_sigchanged = true; -} - -unsigned8_t xf_t::GetFillStyle(void) -{ - return fillstyle; -} - -/* Locked option wrappers*/ -void xf_t::SetLocked(bool locked_opt) -{ - locked = locked_opt; - m_sigchanged = true; -} - -bool xf_t::IsLocked(void) -{ - return locked; -} - -/* Hidden option wrappers*/ -void xf_t::SetHidden(bool hidden_opt) -{ - hidden = hidden_opt; - m_sigchanged = true; -} -bool xf_t::IsHidden(void) -{ - return hidden; -} - -/* Wrap option wrappers*/ -void xf_t::SetWrap(bool wrap_opt) -{ - wrap = wrap_opt; - m_sigchanged = true; -}; - -bool xf_t::IsWrap(void) -{ - return wrap; -}; - -/* Cell option wrappers*/ -void xf_t::SetCellMode(bool cellmode) -{ - is_cell = cellmode; - m_sigchanged = true; -} - -bool xf_t::IsCell(void) -{ - return is_cell; -} - - - - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: extformat.cpp,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:48 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/extformat.h b/uppdev/XLS/extformat.h deleted file mode 100644 index 854ab8237..000000000 --- a/uppdev/XLS/extformat.h +++ /dev/null @@ -1,696 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/extformat.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#ifndef EXTFORMAT_H -#define EXTFORMAT_H - -#include -#include -#include -#include -#include -#include -#include - -namespace xlslib_core -{ - -// COMMON - - // The Cell Properties bit or-masks: -#define XF_PROP_SHIFTPOS_PARENT (4) - -#define XF_PROP_LOCKED ((unsigned16_t)0x0001) -#define XF_PROP_HIDDEN ((unsigned16_t)0x0002) -#define XF_PROP_STYLE ((unsigned16_t)0x0004) -#define XF_PROP_123PREFIX ((unsigned16_t)0x0008) -#define XF_PROP_XFPARENT ((unsigned16_t)0xFFF0) - - // The Alignment field bit or-masks: -#define XF_ALIGN_HORIZONTAL ((unsigned16_t)0x0007) -#define XF_ALIGN_WRAP ((unsigned16_t)0x0008) -#define XF_ALIGN_VERTICAL ((unsigned16_t)0x0070) -#define XF_ALIGN_JUSTLAST ((unsigned32_t)0x0080) /* BIFF8: Used only in far-east versions of excel */ -#define XF_ALIGN_ORIENTATION ((unsigned16_t)0x0300) - - // Geometric Align options -#define XF_ALIGN_SHIFTPOS_HALIGN (0) -#define XF_ALIGN_SHIFTPOS_VALIGN (4) - - // XF_USED_ATTRIB -#define XF_ALIGN_ATRNUM ((unsigned16_t)0x0400) -#define XF_ALIGN_ATRFONT ((unsigned16_t)0x0800) -#define XF_ALIGN_ATRALC ((unsigned16_t)0x1000) -#define XF_ALIGN_ATRBDR ((unsigned16_t)0x2000) -#define XF_ALIGN_ATRPAT ((unsigned16_t)0x4000) -#define XF_ALIGN_ATRPROT ((unsigned16_t)0x8000) - - // Style options -#define XF_FILL_NONE ((unsigned8_t)0x00) -#define XF_FILL_SOLID ((unsigned8_t)0x01) -#define XF_FILL_ATEN75 ((unsigned8_t)0x03) -#define XF_FILL_ATEN50 ((unsigned8_t)0x02) -#define XF_FILL_ATEN25 ((unsigned8_t)0x04) -#define XF_FILL_ATEN12 ((unsigned8_t)0x11) -#define XF_FILL_ATEN06 ((unsigned8_t)0x12) -#define XF_FILL_HORIZ_LIN ((unsigned8_t)0x05) -#define XF_FILL_VERTICAL_LIN ((unsigned8_t)0x06) -#define XF_FILL_DIAG ((unsigned8_t)0x07) -#define XF_FILL_INV_DIAG ((unsigned8_t)0x08) -#define XF_FILL_INTER_DIAG ((unsigned8_t)0x09) -#define XF_FILL_DIAG_THICK_INTER ((unsigned8_t)0x0a) -#define XF_FILL_HORIZ_LINES_THIN ((unsigned8_t)0x0b) -#define XF_FILL_VERTICAL_LINES_THIN ((unsigned8_t)0x0c) -#define XF_FILL_DIAG_THIN ((unsigned8_t)0x0d) -#define XF_FILL_INV_DIAG_THIN ((unsigned8_t)0x0e) -#define XF_FILL_HORIZ_INT_THIN ((unsigned8_t)0x0f) -#define XF_FILL_HORIZ_INTER_THICK ((unsigned8_t)0x10) - typedef enum - { - FILL_NONE = 0, - FILL_SOLID, - FILL_ATEN75, - FILL_ATEN50, - FILL_ATEN25, - FILL_ATEN12, - FILL_ATEN06, - FILL_HORIZ_LIN, - FILL_VERTICAL_LIN, - FILL_DIAG, - FILL_INV_DIAG, - FILL_INTER_DIAG, - FILL_DIAG_THICK_INTER, - FILL_HORIZ_LINES_THIN, - FILL_VERTICAL_LINES_THIN, - FILL_DIAG_THIN, - FILL_INV_DIAG_THIN, - FILL_HORIZ_INT_THIN, - FILL_HORIZ_INTER_THICK - } fill_option_t; - - // Border Options -#define XF_BRDOPTION_NONE ((unsigned8_t)0x00) -#define XF_BRDOPTION_THIN ((unsigned8_t)0x01) -#define XF_BRDOPTION_MEDIUM ((unsigned8_t)0x02) -#define XF_BRDOPTION_DASHED ((unsigned8_t)0x03) -#define XF_BRDOPTION_DOTTED ((unsigned8_t)0x04) -#define XF_BRDOPTION_THICK ((unsigned8_t)0x05) -#define XF_BRDOPTION_DOUBLE ((unsigned8_t)0x06) -#define XF_BRDOPTION_HAIR ((unsigned8_t)0x07) - typedef enum - { - BORDER_NONE = 0, - BORDER_THIN, - BORDER_MEDIUM, - BORDER_DASHED, - BORDER_DOTTED, - BORDER_THICK, - BORDER_DOUBLE, - BORDER_HAIR - } border_style_t; - - // Border options -#define XF_BORDER_BOTTOM ((unsigned8_t)0) -#define XF_BORDER_TOP ((unsigned8_t)1) -#define XF_BORDER_LEFT ((unsigned8_t)2) -#define XF_BORDER_RIGHT ((unsigned8_t)3) - typedef enum - { - BORDER_BOTTOM = 0, - BORDER_TOP, - BORDER_LEFT, - BORDER_RIGHT, - DIAGONALS // BIFF8 - } border_side_t; - - // Horizontal Align options -#define XF_HALIGN_GENERAL ((unsigned8_t)0) -#define XF_HALIGN_LEFT ((unsigned8_t)1) -#define XF_HALIGN_CENTER ((unsigned8_t)2) -#define XF_HALIGN_RIGHT ((unsigned8_t)3) -#define XF_HALIGN_FILL ((unsigned8_t)4) -#define XF_HALIGN_JUSTIFY ((unsigned8_t)5) -#define XF_HALIGN_CENTERACCROSS ((unsigned8_t)6) - typedef enum - { - HALIGN_GENERAL = 0, - HALIGN_LEFT, - HALIGN_CENTER, - HALIGN_RIGHT, - HALIGN_FILL, - HALIGN_JUSTIFY, - HALIGN_CENTERACCROSS - } halign_option_t; - - // Vertical Align options -#define XF_VALIGN_TOP ((unsigned8_t)0) -#define XF_VALIGN_CENTER ((unsigned8_t)1) -#define XF_VALIGN_BOTTOM ((unsigned8_t)2) -#define XF_VALIGN_JUSTIFY ((unsigned8_t)3) - typedef enum - { - VALIGN_TOP = 0, - VALIGN_CENTER, - VALIGN_BOTTOM, - VALIGN_JUSTIFY - } valign_option_t; - - -#define XF_COLOR_CODE_BLACK ((unsigned8_t)(COLOR_CODE_BLACK)) -#define XF_COLOR_CODE_DARK_RED ((unsigned8_t)(COLOR_CODE_DARK_RED)) -#define XF_COLOR_CODE_RED ((unsigned8_t)(COLOR_CODE_RED)) -#define XF_COLOR_CODE_FUCSIA ((unsigned8_t)(COLOR_CODE_FUCSIA)) -#define XF_COLOR_CODE_COMBINED01 ((unsigned8_t)(COLOR_CODE_COMBINED01)) -#define XF_COLOR_CODE_COMBINED02 ((unsigned8_t)(COLOR_CODE_COMBINED02)) -#define XF_COLOR_CODE_COMBINED03 ((unsigned8_t)(COLOR_CODE_COMBINED03)) -#define XF_COLOR_CODE_COMBINED04 ((unsigned8_t)(COLOR_CODE_COMBINED04)) -#define XF_COLOR_CODE_COMBINED05 ((unsigned8_t)(COLOR_CODE_COMBINED05)) -#define XF_COLOR_CODE_COMBINED06 ((unsigned8_t)(COLOR_CODE_COMBINED06)) -#define XF_COLOR_CODE_OLIVE ((unsigned8_t)(COLOR_CODE_OLIVE)) -#define XF_COLOR_CODE_DARK_YELLOW ((unsigned8_t)(COLOR_CODE_DARK_YELLOW)) -#define XF_COLOR_CODE_COMBINED07 ((unsigned8_t)(COLOR_CODE_COMBINED07)) -#define XF_COLOR_CODE_YELLOW ((unsigned8_t)(COLOR_CODE_YELLOW)) -#define XF_COLOR_CODE_LIGHT_YELLOW ((unsigned8_t)(COLOR_CODE_LIGHT_YELLOW)) -#define XF_COLOR_CODE_DARK_GREEN ((unsigned8_t)(COLOR_CODE_DARK_GREEN)) -#define XF_COLOR_CODE_GREEN ((unsigned8_t)(COLOR_CODE_GREEN)) -#define XF_COLOR_CODE_COMBINED08 ((unsigned8_t)(COLOR_CODE_COMBINED08)) -#define XF_COLOR_CODE_LIVING_GREEN ((unsigned8_t)(COLOR_CODE_LIVING_GREEN)) -#define XF_COLOR_CODE_LIGHT_GREEN ((unsigned8_t)(COLOR_CODE_LIGHT_GREEN)) -#define XF_COLOR_CODE_COMBINED09 ((unsigned8_t)(COLOR_CODE_COMBINED09)) -#define XF_COLOR_CODE_BLUE_GREEN ((unsigned8_t)(COLOR_CODE_BLUE_GREEN)) -#define XF_COLOR_CODE_AQUAMARINA ((unsigned8_t)(COLOR_CODE_AQUAMARINA)) -#define XF_COLOR_CODE_TURQOISE ((unsigned8_t)(COLOR_CODE_TURQOISE)) -#define XF_COLOR_CODE_COMBINED10 ((unsigned8_t)(COLOR_CODE_COMBINED10)) -#define XF_COLOR_CODE_DARK_BLUE ((unsigned8_t)(COLOR_CODE_DARK_BLUE)) -#define XF_COLOR_CODE_BLUE ((unsigned8_t)(COLOR_CODE_BLUE)) -#define XF_COLOR_CODE_LIGHT_BLUE ((unsigned8_t)(COLOR_CODE_LIGHT_BLUE)) -#define XF_COLOR_CODE_SKY_BLUE ((unsigned8_t)(COLOR_CODE_SKY_BLUE)) -#define XF_COLOR_CODE_COMBINED11 ((unsigned8_t)(COLOR_CODE_COMBINED11)) -#define XF_COLOR_CODE_INDIGO ((unsigned8_t)(COLOR_CODE_INDIGO)) -#define XF_COLOR_CODE_BLUE_GRAY ((unsigned8_t)(COLOR_CODE_BLUE_GRAY)) -#define XF_COLOR_CODE_VIOLET ((unsigned8_t)(COLOR_CODE_VIOLET)) -#define XF_COLOR_CODE_PLUM ((unsigned8_t)(COLOR_CODE_PLUM)) -#define XF_COLOR_CODE_LAVANDER ((unsigned8_t)(COLOR_CODE_LAVANDER)) -#define XF_COLOR_CODE_COMBINED12 ((unsigned8_t)(COLOR_CODE_COMBINED12)) -#define XF_COLOR_CODE_GRAY50 ((unsigned8_t)(COLOR_CODE_GRAY50)) -#define XF_COLOR_CODE_GRAY40 ((unsigned8_t)(COLOR_CODE_GRAY40)) -#define XF_COLOR_CODE_GRAY25 ((unsigned8_t)(COLOR_CODE_GRAY25)) -#define XF_COLOR_CODE_WHITE ((unsigned8_t)(COLOR_CODE_WHITE)) - -#define XF_LOCKED true -#define XF_NO_LOCKED false - -#define XF_HIDDEN true -#define XF_NO_HIDDEN false - -#define XF_WRAPPED true -#define XF_NO_WRAPPED false - -#define XF_IS_CELL true -#define XF_IS_STYLE false - - - - - - - - // The XF-record field offsets: -#if VERSION_BIFF == VERSION_BIFF5 - -#define XF_OFFSET_FONT ((unsigned32_t) 4) -#define XF_OFFSET_FORMAT ((unsigned32_t) 6) -#define XF_OFFSET_PROP ((unsigned32_t) 8) -#define XF_OFFSET_ALIGN ((unsigned32_t)10) // 2 bytes -#define XF_OFFSET_COLOR ((unsigned32_t)12) -#define XF_OFFSET_BORDER0 ((unsigned32_t)14) -#define XF_OFFSET_BORDER1 ((unsigned32_t)16) -#define XF_OFFSET_BORDER2 ((unsigned32_t)18) - - // Text Orientation Options -#define XF_ORI_SHIFTPOS (8) -#define XF_ORI_NONE ((unsigned8_t)0) -#define XF_ORI_TOPBOTTOMTXT ((unsigned8_t)1) -#define XF_ORI_90NOCLOCKTXT ((unsigned8_t)2) -#define XF_ORI_90CLOCKTXT ((unsigned8_t)3) - typedef enum - { - ORI_NONE = 0, - ORI_TOPBOTTOMTXT, - ORI_90NOCLOCKTXT, - ORI_90CLOCKTXT - } txtori_option_t; - - // XF_USED_ATTRIB -#define XF_ATTRIB_SHIFTPOS (0) - - // The Color field bit or-masks: -#define XF_COLOR_FOREGROUND ((unsigned16_t)0x007f) -#define XF_COLOR_BACKGROUND ((unsigned16_t)0x1f80) - -#define XF_COLOR_SHIFTPOS_FG (0) -#define XF_COLOR_SHIFTPOS_BG (7) - - // The Border0 field bit or-masks: - -#define XF_STYLE_SHIFTPOS_BOTTOM (6) -#define XF_COLOR_SHIFTPOS_BOTTOM (9) - -#define XF_BORDER_FILLPATTERN ((unsigned16_t)0x003f) -#define XF_BORDER_BOTTOMSTYLE ((unsigned16_t)0x01c0) -#define XF_BORDER_BOTTOMCOLOR ((unsigned16_t)0xfe00) - - // The Border1 field bit or-masks: -#define XF_STYLE_SHIFTPOS_TOP (0) -#define XF_STYLE_SHIFTPOS_LEFT (3) -#define XF_STYLE_SHIFTPOS_RIGHT (6) -#define XF_COLOR_SHIFTPOS_TOP (9) - -#define XF_BORDER_TOPSTYLE ((unsigned16_t)0x0007) -#define XF_BORDER_LEFTSTYLE ((unsigned16_t)0x0038) -#define XF_BORDER_RIGHTSTYLE ((unsigned16_t)0x01c0) -#define XF_BORDER_TOPCOLOR ((unsigned16_t)0xfe00) - - // The Border2 field bit or-masks: -#define XF_COLOR_SHIFTPOS_LEFT (0) -#define XF_COLOR_SHIFTPOS_RIGHT (7) - -#define XF_BORDER_LEFTCOLOR ((unsigned16_t)0x007f) -#define XF_BORDER_RIGHTCOLOR ((unsigned16_t)0x3f80) -//#define XF_BORDER2_RESERVED ((unsigned16_t)0xc000) - - - - -#else // VERSION_BIFF == VERSION_BIFF8 - - - - -#define XF_OFFSET_FONT ((unsigned32_t) 4) -#define XF_OFFSET_FORMAT ((unsigned32_t) 6) -#define XF_OFFSET_PROP ((unsigned32_t) 8) -#define XF_OFFSET_ALIGN ((unsigned32_t)10) // 4 bytes -#define XF_OFFSET_BORDERA ((unsigned32_t)14) // 4 bytes -#define XF_OFFSET_BORDERB ((unsigned32_t)18) // 4 bytes -#define XF_OFFSET_COLOR ((unsigned32_t)22) - - // Text Orientation Options -#define XF_ORI_SHIFTPOS (8) -#define XF_ORI_NONE ((unsigned8_t)0) -#define XF_ORI_90NOCLOCKTXT ((unsigned8_t)90) -#define XF_ORI_90CLOCKTXT ((unsigned8_t)180) -#define XF_ORI_TOPBOTTOMTXT ((unsigned8_t)255) - typedef enum - { - ORI_NONE = 0, - ORI_TOPBOTTOMTXT, - ORI_90NOCLOCKTXT, - ORI_90CLOCKTXT - } txtori_option_t; - - // Indent field -#define XF_INDENT_SHIFTPOS (16) -#define XF_INDENT_LVL ((unsigned8_t)0x0F) -#define XF_INDENT_NONE ((unsigned8_t)0x00) -#define XF_INDENT_1 ((unsigned8_t)0x01) -#define XF_INDENT_2 ((unsigned8_t)0x02) -#define XF_INDENT_3 ((unsigned8_t)0x03) -#define XF_INDENT_4 ((unsigned8_t)0x04) -#define XF_INDENT_SHRINK2FIT ((unsigned8_t)0x10) -#define XF_INDENT_DIR ((unsigned8_t)0xC0) -#define XF_INDENT_CONTEXT ((unsigned8_t)0x00) -#define XF_INDENT_L2R ((unsigned8_t)0x40) -#define XF_INDENT_R2L ((unsigned8_t)0x80) - typedef enum - { - INDENT_NONE = 0, - INDENT_1, - INDENT_2, - INDENT_3, - INDENT_4, - INDENT_SHRINK2FIT, - INDENT_L2R, - INDENT_R2L - } indent_option_t; - - // XF_USED_ATTRIB -#define XF_ATTRIB_SHIFTPOS (16) // bits shifted by 8 already - - // The Border A field bit or-masks: - -#define XF_STYLE_SHIFTPOS_LEFT (0) -#define XF_STYLE_SHIFTPOS_RIGHT (4) -#define XF_STYLE_SHIFTPOS_TOP (8) -#define XF_STYLE_SHIFTPOS_BOTTOM (12) - - // The BorderA field bit or-masks: -#define XF_COLOR_SHIFTPOS_LEFT (16) -#define XF_COLOR_SHIFTPOS_RIGHT (23) - -#define XF_BORDER_LEFTSTYLE ((unsigned32_t)0x0000000F) -#define XF_BORDER_RIGHTSTYLE ((unsigned32_t)0x000000F0) -#define XF_BORDER_TOPSTYLE ((unsigned32_t)0x00000F00) -#define XF_BORDER_BOTTOMSTYLE ((unsigned32_t)0x0000F000) - -#define XF_BORDER_LEFTCOLOR ((unsigned32_t)0x007f0000) -#define XF_BORDER_RIGHTCOLOR ((unsigned32_t)0x3f800000) -#define XF_DIAG_TL2BR ((unsigned32_t)0x40000000) -#define XF_DIAG_BL2TR ((unsigned32_t)0x80000000) - - // BORDER B - -#define XF_COLOR_SHIFTPOS_TOP (0) -#define XF_COLOR_SHIFTPOS_BOTTOM (7) -#define XF_COLOR_SHIFTPOS_DIAG (14) -#define XF_STYLE_SHIFTPOS_DIAG (21) -#define XF_SHIFTPOS_FILLPATTERN (26) - -#define XF_BORDER_TOPCOLOR ((unsigned16_t)0x0000007f) -#define XF_BORDER_BOTTOMCOLOR ((unsigned16_t)0x00003f80) -#define XF_BORDER_DIAGCOLOR ((unsigned16_t)0x001fc000) -#define XF_BORDER_DIAGSTYLE ((unsigned16_t)0x01e00000) -#define XF_BORDER_FILLPATTERN ((unsigned32_t)0xFC000000) - -//#define XF_STYLE_SHIFTPOS_LEFT (3) -//#define XF_STYLE_SHIFTPOS_RIGHT (6) -//#define XF_COLOR_SHIFTPOS_TOP (9) -//#define XF_BORDER1_TOPSTYLE ((unsigned16_t)0x0007) -//#define XF_BORDER1_LEFTSTYLE ((unsigned16_t)0x0038) -//#define XF_BORDER1_RIGHTSTYLE ((unsigned16_t)0x01c0) - - // The Color field bit or-masks: -#define XF_COLOR_SHIFTPOS_FG (0) -#define XF_COLOR_SHIFTPOS_BG (7) -#define XF_COLOR_FOREGROUND ((unsigned16_t)0x007f) -#define XF_COLOR_BACKGROUND ((unsigned16_t)0x3f80) -#define XF_COLOR_DIAG ((unsigned16_t)0xc000) - - -#endif - /* -****************************** -CExtFormat class declaration -****************************** -*/ - - typedef struct - { - unsigned16_t index; - - font_t* font; - format_number_t format; - - halign_option_t halign; - valign_option_t valign; - indent_option_t indent; - txtori_option_t txtorientation; - - color_name_t fill_fgcolor; - color_name_t fill_bgcolor; - fill_option_t fillstyle; - - bool locked; - bool hidden; - bool wrap; - bool is_cell; - - border_style_t top_border_style; - color_name_t top_border_color; - - border_style_t bottom_border_style; - color_name_t bottom_border_color; - - border_style_t left_border_style; - color_name_t left_border_color; - - border_style_t right_border_style; - color_name_t right_border_color; - - } xf_init_t; - - struct xf_i - { - virtual void font(font_t* fontidx) = 0; - virtual void format(format_number_t format) = 0; - virtual void halign(halign_option_t ha_option) = 0; - virtual void valign(valign_option_t va_option) = 0; - virtual void indent(indent_option_t indent_opt) = 0; - virtual void orientation(txtori_option_t ori_option) = 0; - virtual void fillfgcolor(color_name_t color) = 0; - virtual void fillbgcolor(color_name_t color) = 0; - virtual void fillstyle(fill_option_t fill) = 0; - virtual void locked(bool locked_opt) = 0; - virtual void hidden(bool hidden_opt) = 0; - virtual void wrap(bool wrap_opt) = 0; - virtual void borderstyle(border_side_t side, - border_style_t style, - color_name_t color) = 0; - }; - - - class xf_t - { - - public: - xf_t(); - xf_t(const xf_init_t& xfinit); - xf_t(unsigned16_t index, font_t* font, format_number_t format, halign_option_t halign, - valign_option_t valign, indent_option_t indent, txtori_option_t txtorientation, color_name_t fill_fgcolor, - color_name_t fill_bgcolor, fill_option_t fillstyle, bool locked, bool hidden, - bool wrap, bool is_cell, border_style_t top_border_style, color_name_t top_border_color, - border_style_t bottom_border_style, color_name_t bottom_border_color, border_style_t left_border_style, - color_name_t left_border_color, border_style_t right_border_style, color_name_t right_border_color); - virtual ~xf_t(); - - void MarkUsed(void); - bool IsUsed(void); - unsigned16_t Usage(){return m_usage_counter;}; - - - /* XF Index wrappers*/ - void SetIndex(unsigned16_t xfidx){index = xfidx;}; - unsigned16_t GetIndex(void){return index;}; - - /* Font Index wrappers*/ - void SetFont(font_t* fontidx); - unsigned16_t GetFontIndex(void); - font_t* GetFont(void); - - /* Format Index wrappers*/ - void SetFormat(format_number_t formatidx); - unsigned16_t GetFormatIndex(void); - format_number_t GetFormat(void); - - - /* Horizontal Align option wrappers*/ - void SetHAlign(halign_option_t ha_option); - unsigned8_t GetHAlign(void); - - /* Vertical Align option wrappers*/ - void SetVAlign(valign_option_t va_option); - unsigned8_t GetVAlign(void); - - /* Vertical Align option wrappers*/ - void SetIndent(indent_option_t indent_option); - unsigned8_t GetIndent(void); - - /* Text orientation option wrappers*/ - void SetTxtOrientation(txtori_option_t ori_option); - unsigned8_t GetTxtOrientation(void); - - - /* Fill Foreground color option wrappers*/ - void SetFillFGColor(color_name_t color); - unsigned8_t GetFillFGColor(void); - - - /* Fill Background color option wrappers*/ - void SetFillBGColor(color_name_t color); - unsigned8_t GetFillBGColor(void); - - - /* Fill Style option wrappers*/ - void SetFillStyle(fill_option_t fill); - unsigned8_t GetFillStyle(void); - - /* Locked option wrappers*/ - void SetLocked(bool locked_opt); - bool IsLocked(void); - - - /* Hidden option wrappers*/ - void SetHidden(bool hidden_opt); - bool IsHidden(void); - - /* Wrap option wrappers*/ - void SetWrap(bool wrap_opt); - bool IsWrap(void); - - - /* Cell option wrappers*/ - void SetCellMode(bool cellmode); - bool IsCell(void); - - /* Cell option wrappers*/ - void SetBorderStyle(border_side_t side, - border_style_t style, - color_name_t color); - unsigned8_t GetBorderStyle(border_side_t side); - unsigned8_t GetBorderColor(border_side_t side); - unsigned32_t GetSignature(); - - void operator=(xf_t& right) ; - - private: - // Lookup tables for options - static const unsigned8_t HALIGN_OPTIONS_TABLE[]; - static const unsigned8_t VALIGN_OPTIONS_TABLE[]; - static const unsigned8_t INDENT_OPTIONS_TABLE[]; - static const unsigned8_t TXTORI_OPTIONS_TABLE[]; - static const unsigned8_t COLOR_OPTIONS_TABLE[]; - static const unsigned8_t FILL_OPTIONS_TABLE[]; - static const unsigned8_t BORDERSTYLE_OPTIONS_TABLE[]; - static const unsigned16_t FORMAT_NUM_OPTIONS_TABLE[]; - void UpdateSignature(); - private: - unsigned16_t m_usage_counter; - - unsigned16_t index; - - font_t* font; - format_number_t format; - - unsigned8_t halign; - unsigned8_t valign; - unsigned8_t indent; - unsigned8_t txtorientation; - - unsigned8_t fill_fgcolor; - unsigned8_t fill_bgcolor; - unsigned8_t fillstyle; - - bool locked; - bool hidden; - bool wrap; - bool is_cell; - - unsigned8_t top_border_style; - unsigned8_t top_border_color; - - unsigned8_t bottom_border_style; - unsigned8_t bottom_border_color; - - unsigned8_t left_border_style; - unsigned8_t left_border_color; - - unsigned8_t right_border_style; - unsigned8_t right_border_color; - - unsigned32_t m_signature; - bool m_sigchanged; - - }; - - class xfbysig - { - public: - bool operator()(xf_t* a, xf_t* b) const - { - return (a->GetSignature() < b->GetSignature() ? true : false ); // DFH - }; - }; - - typedef std::set XF_Set_t; - typedef XF_Set_t::iterator XF_Set_Itor_t; - - typedef std::list XF_List_t; - typedef XF_List_t::iterator XF_List_Itor_t; - - - - class CExtFormat: public CRecord - { - private: - - void SetFlag(unsigned16_t flag); - void ClearFlag(unsigned16_t flag); - - void InitDummy(bool is_cell); - - public: - - CExtFormat(bool is_cell = false); - CExtFormat(xf_t* xfdef); - ~CExtFormat(); - - bool IsCell(); - - int SetFontIndex(unsigned16_t fontindex); - unsigned16_t GetFontIndex(void); - - int SetFormatIndex(unsigned16_t formatindex); - unsigned16_t GetFormatIndex(void); - - void SetLocked(); - void SetHidden(); - void SetHorizAlign(unsigned8_t alignval); - void SetWrap(); -#if VERSION_BIFF == VERSION_BIFF8 - void SetIndent(unsigned8_t indentval); -#endif - void SetVertAlign(unsigned8_t alignval); - void SetTxtOrientation(unsigned8_t alignval); - void SetFGColorIndex(unsigned8_t color); - void SetBGColorIndex(unsigned8_t color); - void SetFillPattern(unsigned8_t color); - void SetBorder(border_side_t border, unsigned16_t style, unsigned16_t color); - void SetXFParent(unsigned16_t parent); - }; - -} -#endif //EXTFORMAT_H - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: extformat.h,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:46 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - diff --git a/uppdev/XLS/font.cpp b/uppdev/XLS/font.cpp deleted file mode 100644 index 4247f4388..000000000 --- a/uppdev/XLS/font.cpp +++ /dev/null @@ -1,667 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/font.cpp,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - - -#include -#include - -using namespace std; -using namespace xlslib_core; - - -/* -********************************** -CFont class implementation -********************************** -*/ -CFont::CFont(string name, - unsigned16_t height, - unsigned16_t boldstyle, - unsigned8_t underline, - unsigned16_t script, - unsigned16_t color, - unsigned16_t attributes, - unsigned8_t family, - unsigned8_t charset) -{ - SetRecordType(RECTYPE_FONT); - - AddValue16(height); - AddValue16(attributes); - AddValue16(color); - AddValue16(boldstyle); - AddValue16(script); - AddValue8(underline); - AddValue8(family); - AddValue8(charset); - AddValue8(FONT_RESERVED); - -#if VERSION_BIFF == VERSION_BIFF5 - AddValue8((unsigned8_t)name.size()); - AddDataArray((const unsigned8_t*)name.c_str(), name.size()); -#else - AddUnicodeStrlen((unsigned8_t)name.size()); - AddUnicodeString((const unsigned8_t*)name.c_str(), name.size()); -#endif - - SetRecordLength(GetDataSize()-4); -} - -CFont::CFont(font_t* fontdef) -{ - SetRecordType(RECTYPE_FONT); - - AddValue16(fontdef->GetHeight()); - AddValue16(fontdef->GetAttributes()); - AddValue16(fontdef->GetColor()); - AddValue16(fontdef->GetBoldStyle()); - AddValue16(fontdef->GetScriptStyle()); - AddValue8(fontdef->GetUnderlineStyle()); - AddValue8(fontdef->GetFamily()); - AddValue8(fontdef->GetCharset()); - AddValue8(FONT_RESERVED); - -#if VERSION_BIFF == VERSION_BIFF5 - AddValue8((unsigned8_t)((fontdef->GetName()).size())); - AddDataArray((const unsigned8_t*)((fontdef->GetName()).c_str()), - (fontdef->GetName()).size()); -#else - AddUnicodeStrlen((unsigned8_t)((fontdef->GetName()).size())); - AddUnicodeString((const unsigned8_t*)((fontdef->GetName()).c_str()), - (fontdef->GetName()).size()); -#endif - - SetRecordLength(GetDataSize()-4); -} - -CFont::~CFont() -{ -} - -/* -********************************** -********************************** -*/ - - -int CFont::SetName(string& name) -{ - int errcode = NO_ERRORS; - - name = name; - /* - NOTE: Unimplemented. - Temporarilly this function won't set the name - */ - - return errcode; -} - -/* -********************************** -********************************** -*/ -int CFont::GetName(string& name) -{ - int errcode = NO_ERRORS; - - signed16_t namesize; - GetValue16From(&namesize, FONT_OFFSET_NAMELENGTH); - - name = ""; - for(int i=0; i. - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/font.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef FONT_H -#define FONT_H - -#include -#include -#include -#include -#include - -namespace xlslib_core -{ - // Bold style most used values - // (it can be a number of some range. See Documentation for details): -#define FONT_BOLDNESS_BOLD ((unsigned16_t)0x02bc) -#define FONT_BOLDNESS_HALF ((unsigned16_t)0x0226) -#define FONT_BOLDNESS_NORMAL ((unsigned16_t)0x0190) -#define FONT_BOLDNESS_DOUBLE ((unsigned16_t)0x0320) - - typedef enum - { - BOLDNESS_BOLD = 0, - BOLDNESS_HALF, - BOLDNESS_NORMAL, - BOLDNESS_DOUBLE - } boldness_option_t; - - - // Super/subscript field option values -#define FONT_SCRIPT_NONE ((unsigned16_t)0x0000) -#define FONT_SCRIPT_SUPER ((unsigned16_t)0x0001) -#define FONT_SCRIPT_SUB ((unsigned16_t)0x0002) - - typedef enum - { - SCRIPT_NONE = 0, - SCRIPT_SUPER, - SCRIPT_SUB - } script_option_t; - - // Underline field option values: -#define FONT_UNDERLINE_NONE ((unsigned8_t)0x00) -#define FONT_UNDERLINE_SINGLE ((unsigned8_t)0x01) -#define FONT_UNDERLINE_DOUBLE ((unsigned8_t)0x02) -#define FONT_UNDERLINE_SINGLEACC ((unsigned8_t)0x21) -#define FONT_UNDERLINE_DOUBLEACC ((unsigned8_t)0x22) - - typedef enum - { - UNDERLINE_NONE = 0, - UNDERLINE_SINGLE, - UNDERLINE_DOUBLE, - UNDERLINE_SINGLEACC, - UNDERLINE_DOUBLEACC - } underline_option_t; - - - - // The following are default values used when the font's - // constructor is called without args: -#define FONT_DFLT_FAMILY ((unsigned8_t)0x00) -#define FONT_DFLT_CHARSET ((unsigned8_t)0x00) -#define FONT_DFLT_HEIGHT ((unsigned16_t)0x00c8) -#define FONT_DFLT_ATTRIBUTES ((unsigned16_t)0x0000) -#define FONT_DFLT_PALETTE ((unsigned16_t)0x7fff) -#define FONT_DFLT_FONTNAME ((std::string)"Arial") - -#define FONT_RESERVED ((unsigned8_t)0x00) - - // The font-record field offsets: -#define FONT_OFFSET_HEIGHT ((unsigned32_t) 4) -#define FONT_OFFSET_ATTRIBUTES ((unsigned32_t) 6) -#define FONT_OFFSET_PALETTE ((unsigned32_t) 8) -#define FONT_OFFSET_BOLDSTYLE ((unsigned32_t)10) -#define FONT_OFFSET_SCRIPT ((unsigned32_t)12) -#define FONT_OFFSET_UNDERLINE ((unsigned32_t)14) -#define FONT_OFFSET_FAMILY ((unsigned32_t)15) -#define FONT_OFFSET_CHARSET ((unsigned32_t)16) -#define FONT_OFFSET_NAMELENGTH ((unsigned32_t)18) -#define FONT_OFFSET_NAME ((unsigned32_t)19) - - - // The attribute bit or-masks: -#define FONT_ATTR_RESERVED0 ((unsigned16_t)0x0001) -#define FONT_ATTR_ITALIC ((unsigned16_t)0x0002) -#define FONT_ATTR_RESERVED1 ((unsigned16_t)0x0004) -#define FONT_ATTR_STRIKEOUT ((unsigned16_t)0x0008) -#define FONT_ATTR_OUTLINEMACH ((unsigned16_t)0x0010) -#define FONT_ATTR_SHADOWMACH ((unsigned16_t)0x0020) -#define FONT_ATTR_RESERVED2 ((unsigned16_t)0x00c0) -#define FONT_ATTR_UNUSED ((unsigned16_t)0xff00) - - // Font colors -#define FONT_COLOR_CODE_BLACK ((unsigned16_t)(COLOR_CODE_BLACK)) -#define FONT_COLOR_CODE_DARK_RED ((unsigned16_t)(COLOR_CODE_DARK_RED)) -#define FONT_COLOR_CODE_RED ((unsigned16_t)(COLOR_CODE_RED)) -#define FONT_COLOR_CODE_FUCSIA ((unsigned16_t)(COLOR_CODE_FUCSIA)) -#define FONT_COLOR_CODE_COMBINED01 ((unsigned16_t)(COLOR_CODE_COMBINED01)) -#define FONT_COLOR_CODE_COMBINED02 ((unsigned16_t)(COLOR_CODE_COMBINED02)) -#define FONT_COLOR_CODE_COMBINED03 ((unsigned16_t)(COLOR_CODE_COMBINED03)) -#define FONT_COLOR_CODE_COMBINED04 ((unsigned16_t)(COLOR_CODE_COMBINED04)) -#define FONT_COLOR_CODE_COMBINED05 ((unsigned16_t)(COLOR_CODE_COMBINED05)) -#define FONT_COLOR_CODE_COMBINED06 ((unsigned16_t)(COLOR_CODE_COMBINED06)) -#define FONT_COLOR_CODE_OLIVE ((unsigned16_t)(COLOR_CODE_OLIVE)) -#define FONT_COLOR_CODE_DARK_YELLOW ((unsigned16_t)(COLOR_CODE_DARK_YELLOW)) -#define FONT_COLOR_CODE_COMBINED07 ((unsigned16_t)(COLOR_CODE_COMBINED07)) -#define FONT_COLOR_CODE_YELLOW ((unsigned16_t)(COLOR_CODE_YELLOW)) -#define FONT_COLOR_CODE_LIGHT_YELLOW ((unsigned16_t)(COLOR_CODE_LIGHT_YELLOW)) -#define FONT_COLOR_CODE_DARK_GREEN ((unsigned16_t)(COLOR_CODE_DARK_GREEN)) -#define FONT_COLOR_CODE_GREEN ((unsigned16_t)(COLOR_CODE_GREEN)) -#define FONT_COLOR_CODE_COMBINED08 ((unsigned16_t)(COLOR_CODE_COMBINED08)) -#define FONT_COLOR_CODE_LIVING_GREEN ((unsigned16_t)(COLOR_CODE_LIVING_GREEN)) -#define FONT_COLOR_CODE_LIGHT_GREEN ((unsigned16_t)(COLOR_CODE_LIGHT_GREEN)) -#define FONT_COLOR_CODE_COMBINED09 ((unsigned16_t)(COLOR_CODE_COMBINED09)) -#define FONT_COLOR_CODE_BLUE_GREEN ((unsigned16_t)(COLOR_CODE_BLUE_GREEN)) -#define FONT_COLOR_CODE_AQUAMARINA ((unsigned16_t)(COLOR_CODE_AQUAMARINA)) -#define FONT_COLOR_CODE_TURQOISE ((unsigned16_t)(COLOR_CODE_TURQOISE)) -#define FONT_COLOR_CODE_COMBINED10 ((unsigned16_t)(COLOR_CODE_COMBINED10)) -#define FONT_COLOR_CODE_DARK_BLUE ((unsigned16_t)(COLOR_CODE_DARK_BLUE)) -#define FONT_COLOR_CODE_BLUE ((unsigned16_t)(COLOR_CODE_BLUE)) -#define FONT_COLOR_CODE_LIGHT_BLUE ((unsigned16_t)(COLOR_CODE_LIGHT_BLUE)) -#define FONT_COLOR_CODE_SKY_BLUE ((unsigned16_t)(COLOR_CODE_SKY_BLUE)) -#define FONT_COLOR_CODE_COMBINED11 ((unsigned16_t)(COLOR_CODE_COMBINED11)) -#define FONT_COLOR_CODE_INDIGO ((unsigned16_t)(COLOR_CODE_INDIGO)) -#define FONT_COLOR_CODE_BLUE_GRAY ((unsigned16_t)(COLOR_CODE_BLUE_GRAY)) -#define FONT_COLOR_CODE_VIOLET ((unsigned16_t)(COLOR_CODE_VIOLET)) -#define FONT_COLOR_CODE_PLUM ((unsigned16_t)(COLOR_CODE_PLUM)) -#define FONT_COLOR_CODE_LAVANDER ((unsigned16_t)(COLOR_CODE_LAVANDER)) -#define FONT_COLOR_CODE_COMBINED12 ((unsigned16_t)(COLOR_CODE_COMBINED12)) -#define FONT_COLOR_CODE_GRAY50 ((unsigned16_t)(COLOR_CODE_GRAY50)) -#define FONT_COLOR_CODE_GRAY40 ((unsigned16_t)(COLOR_CODE_GRAY40)) -#define FONT_COLOR_CODE_GRAY25 ((unsigned16_t)(COLOR_CODE_GRAY25)) -#define FONT_COLOR_CODE_WHITE ((unsigned16_t)(COLOR_CODE_WHITE)) - - /* -****************************** -CFont class declaration -****************************** -*/ - - typedef struct - { - unsigned16_t index; - std::string name; - unsigned16_t height; - boldness_option_t boldstyle; - underline_option_t underline; - script_option_t script; - color_name_t color; - unsigned16_t attributes; - unsigned8_t family; - unsigned8_t charset; - - } font_init_t; - - struct font_i - { - virtual void fontname(std::string fntname) = 0; - virtual void fontheight(unsigned16_t fntheight) = 0; - virtual void fontbold(boldness_option_t fntboldness) = 0; - virtual void fontunderline(underline_option_t fntunderline) = 0; - virtual void fontscript(script_option_t fntscript) = 0; - virtual void fontcolor(color_name_t fntcolor) = 0; - virtual void fontattr(unsigned16_t attr) = 0; - virtual void fontitalic(bool italic) = 0; - virtual void fontstrikeout(bool so) = 0; - virtual void fontoutline(bool ol) = 0; - virtual void fontshadow(bool sh) = 0; - }; - - - class font_t - { - public: - font_t(); - font_t(unsigned16_t index, std::string name, - unsigned16_t height, boldness_option_t boldstyle, - underline_option_t underline, script_option_t script, - color_name_t color, unsigned16_t attributes, - unsigned8_t family, unsigned8_t charset); - font_t(const font_init_t& fontinit); - - virtual ~font_t() {}; - - - void MarkUsed(); - bool IsUsed(); - unsigned16_t Usage(){return m_usage_counter;}; - - - /* FONT Index wrappers*/ - void SetIndex(unsigned16_t fntidx); - unsigned16_t GetIndex(void); - - - /* FONT Index wrappers*/ - void SetName(std::string fntname); - std::string GetName(void); - - /* FONT height wrappers*/ - void SetHeight(unsigned16_t fntheight); - unsigned16_t GetHeight(void); - - /* FONT boldstyle wrappers*/ - void SetBoldStyle(boldness_option_t fntboldness); - unsigned16_t GetBoldStyle(void); - - /* FONT underline wrappers*/ - void SetUnderlineStyle(underline_option_t fntunderline); - unsigned8_t GetUnderlineStyle(void); - - /* FONT script wrappers*/ - void SetScriptStyle(script_option_t fntscript); - unsigned16_t GetScriptStyle(void); - - /* FONT script wrappers*/ - void SetColor(color_name_t fntcolor); - unsigned16_t GetColor(void); - - - void SetItalic(bool italic); - void SetStrikeout(bool so); - - - /* FONT attributes wrappers */ - void SetAttributes(unsigned16_t attr); - unsigned16_t GetAttributes(void); - - - // OSX only - void SetOutline(bool ol); - void SetShadow(bool sh); - - - // Miscellaneous; - void SetFamily(unsigned8_t fam); - unsigned8_t GetFamily(void); - - void SetCharset(unsigned8_t chrset); - unsigned8_t GetCharset(void); - unsigned32_t GetSignature(); - - void operator=(font_t& right); - - private: - unsigned16_t index; - std::string name; - unsigned16_t height; - unsigned16_t boldstyle; - unsigned8_t underline; - unsigned16_t script; - unsigned16_t color; - unsigned16_t attributes; - unsigned8_t family; - unsigned8_t charset; - - unsigned16_t m_usage_counter; - void UpdateSignature(); - unsigned32_t m_signature; - bool m_sigchanged; - - static const unsigned16_t BOLD_OPTION_TABLE[]; - static const unsigned16_t SCRIPT_OPTION_TABLE[]; - static const unsigned8_t UNDERLINE_OPTION_TABLE[]; - static const unsigned16_t COLOR_OPTION_TABLE[]; - - }; - - class fontbysig - { - public: - bool operator()(font_t* a, font_t* b) const - { - return (a->GetSignature() < b->GetSignature() ? true : false ); - }; - }; - - typedef std::set Font_Set_t; - typedef Font_Set_t::iterator Font_Set_Itor_t; - - typedef std::list Font_List_t; - typedef Font_List_t::iterator Font_List_Itor_t; - - - class CFont: public CRecord - { - protected: - - public: - - CFont(std::string name = FONT_DFLT_FONTNAME, - unsigned16_t height = FONT_DFLT_HEIGHT, - unsigned16_t boldstyle = FONT_BOLDNESS_NORMAL, - unsigned8_t underline = FONT_UNDERLINE_NONE, - unsigned16_t script = FONT_SCRIPT_NONE, - unsigned16_t color = FONT_DFLT_PALETTE, - unsigned16_t attributes = FONT_DFLT_ATTRIBUTES, - unsigned8_t family = FONT_DFLT_FAMILY, - unsigned8_t charset = FONT_DFLT_CHARSET ); - - CFont(font_t* fontdef); - ~CFont(); - - - int SetName(std::string& name); - int GetName(std::string& name); - - int SetBoldValue(unsigned16_t boldstyle); - unsigned16_t GetBoldValue(void); - - int SetUnderlineStyle(unsigned8_t ul); - unsigned8_t GetUnderlineStyle(void); - - int SetScriptStyle(unsigned16_t script); - unsigned16_t GetScriptStyle(void); - - int SetColorIndex(unsigned16_t color); - unsigned16_t GetColorIndex(void); - - int SetAttributes(unsigned16_t attr); - unsigned16_t GetAttributes(void); - - int SetFamily(unsigned8_t family); - unsigned8_t GetFamily(void); - - int SetCharSet(unsigned8_t charset); - unsigned8_t GetCharSet(void); - - }; - -} - -#endif //FONT_H - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: font.h,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:46 darioglz - * Initial Import. - * - * Revision 1.17 2004/04/06 22:35:43 dgonzalez - * + Added namespace xlslib_core to isolate the core xlslib library names. - * - * Revision 1.16 2004/04/06 15:10:24 dgonzalez - * + Added keys to generate distributable headers - * - * Revision 1.15 2004/01/29 03:18:55 dgonzalez - * + Using the config.h file - * - * Revision 1.14 2004/01/15 17:17:31 dgonzalez - * + The memory allocator used by STL-containers is defined #conditionally. - * - * Revision 1.13 2003/12/09 19:04:21 dgonzalez - * + Not a real difference - * - * Revision 1.12 2003/12/05 01:18:27 dgonzalez - * + Common include files were placed in common.h (and this file was - * included instead. - * + The font_interface was redefined to something lighter. Due name - * clashing with xf_i when these interfaces were defined as parent of - * cell_t. - * + Signature was implemented to font_t. Any interface function that modi - * fies any data member of the class set a flag for later signature - * update. The signature is CRC based and is used to uniquify font_t - * instances inside an stl-set-container. - * + The fontbysig functor was added for being used in the set container - * as a sorting criteria. It is based on the signature. - * + The stl-set-container of pointers to font_t* typedef was defined here. - * - * Revision 1.11 2003/11/29 17:53:49 dgonzalez - * + The larger functions were uninlined. - * + The virtual pure interface font_i was defined - * - * Revision 1.10 2003/11/28 01:31:30 dgonzalez - * + The MarkUsed functionality was added (similar to xf_t) - * - * Revision 1.9 2003/11/26 16:49:26 dgonzalez - * + Indented and untabified - * - * Revision 1.8 2003/11/04 17:07:58 dgonzalez - * + Changed the initialization of CGlobalRecord's defaults for compatibility with - * MSVC++. The original code was left commented out for future use. - * - * Revision 1.7 2003/11/04 01:04:42 dgonzalez - * + All the list containers changed to manage pointers. - * + Valgrind utility reports 960 posible memory leaks. TODO: Verify it - * - * Revision 1.6 2003/11/03 16:58:56 dgonzalez - * + The following typedefed enums were added to improve typechecking in the font - * definition: - * - boldness_option_t - * - script_option_t - * - underline_option_t - * + Font colors were defined based in the color codes defined in the module colors.h. - * + font_t is now implemented as a class. A full set of wrapper functions were implemented - * inline for Get/Set font properties. - * + font_init_t struct was added for storing initialization values of default font of a - * document. - * + The following lookup tables were added to retrieve the field's options used for setting - * the font's values. - * - * Revision 1.5 2003/10/24 23:24:32 dgonzalez - * + Added CVS-Keyword substitution. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/format.cpp b/uppdev/XLS/format.cpp deleted file mode 100644 index 262bbaf6b..000000000 --- a/uppdev/XLS/format.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/format.cpp,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#include - -using namespace std; -using namespace xlslib_core; - -/* -********************************** -CFormat class implementation -********************************** -*/ -CFormat::CFormat(string& formatstr, - unsigned16_t index) -{ - SetRecordType(RECTYPE_FORMAT); - - AddValue16(index); - -#if VERSION_BIFF == VERSION_BIFF5 - AddValue8((unsigned8_t)formatstr.size()); - AddDataArray((unsigned8_t*)formatstr.c_str(), formatstr.size()); -#else - AddUnicodeStrlen((unsigned16_t)formatstr.size()); - AddUnicodeString((unsigned8_t*)formatstr.c_str(), formatstr.size()); -#endif - - SetRecordLength(GetDataSize()-4); -} - -CFormat::CFormat(format_t* formatdef) -{ - SetRecordType(RECTYPE_FORMAT); - - AddValue16(formatdef->GetIndex()); -#if VERSION_BIFF == VERSION_BIFF5 - AddValue8((unsigned8_t)((formatdef->GetFormatStr()).size())); - AddDataArray((unsigned8_t*)((formatdef->GetFormatStr()).c_str()), - (formatdef->GetFormatStr()).size()); -#else - AddUnicodeStrlen((unsigned16_t)((formatdef->GetFormatStr()).size())); - AddUnicodeString((unsigned8_t*)((formatdef->GetFormatStr()).c_str()), - (formatdef->GetFormatStr()).size()); -#endif - - SetRecordLength(GetDataSize()-4); -} - - -CFormat::~CFormat() -{ -} - -/* -********************************** -********************************** -*/ - -/* -********************************** -********************************** -*/ -int CFormat::GetFormatStr(string& formatstr) -{ - int errcode = NO_ERRORS; - - signed16_t formatsize; - GetValue16From(&formatsize, FORMAT_OFFSET_NAMELENGTH); - - formatstr = ""; - for(int i=0; i. - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/format.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#ifndef FORMAT_H -#define FORMAT_H - -#include -#include -#include -#include - -namespace xlslib_core -{ - - // The font-record field offsets: -#define FORMAT_OFFSET_INDEX ((unsigned32_t) 4) -#define FORMAT_OFFSET_NAMELENGTH ((unsigned32_t) 6) -#define FORMAT_OFFSET_NAME ((unsigned32_t) 7) - -#define FMTCODE_GENERAL ((unsigned16_t)0x0000) -#define FMTCODE_NUMBER1 ((unsigned16_t)0x0001) -#define FMTCODE_NUMBER2 ((unsigned16_t)0x0002) -#define FMTCODE_NUMBER3 ((unsigned16_t)0x0003) -#define FMTCODE_NUMBER4 ((unsigned16_t)0x0004) -#define FMTCODE_CURRENCY1 ((unsigned16_t)0x0005) -#define FMTCODE_CURRENCY2 ((unsigned16_t)0x0006) -#define FMTCODE_CURRENCY3 ((unsigned16_t)0x0007) -#define FMTCODE_CURRENCY4 ((unsigned16_t)0x0008) -#define FMTCODE_PERCENT1 ((unsigned16_t)0x0009) -#define FMTCODE_PERCENT2 ((unsigned16_t)0x000a) -#define FMTCODE_SCIENTIFIC1 ((unsigned16_t)0x000b) -#define FMTCODE_FRACTION1 ((unsigned16_t)0x000c) -#define FMTCODE_FRACTION2 ((unsigned16_t)0x000d) -#define FMTCODE_DATE1 ((unsigned16_t)0x000e) -#define FMTCODE_DATE2 ((unsigned16_t)0x000f) -#define FMTCODE_DATE3 ((unsigned16_t)0x0010) -#define FMTCODE_DATE4 ((unsigned16_t)0x0011) -#define FMTCODE_HOUR1 ((unsigned16_t)0x0012) -#define FMTCODE_HOUR2 ((unsigned16_t)0x0013) -#define FMTCODE_HOUR3 ((unsigned16_t)0x0014) -#define FMTCODE_HOUR4 ((unsigned16_t)0x0015) -#define FMTCODE_HOURDATE ((unsigned16_t)0x0016) -#define FMTCODE_NUMBER5 ((unsigned16_t)0x0025) -#define FMTCODE_NUMBER6 ((unsigned16_t)0x0026) -#define FMTCODE_NUMBER7 ((unsigned16_t)0x0027) -#define FMTCODE_NUMBER8 ((unsigned16_t)0x0028) -#define FMTCODE_ACCOUNTING1 ((unsigned16_t)0x0029) -#define FMTCODE_ACCOUNTING2 ((unsigned16_t)0x002a) -#define FMTCODE_ACCOUNTING3 ((unsigned16_t)0x002b) -#define FMTCODE_ACCOUNTING4 ((unsigned16_t)0x002c) -#define FMTCODE_HOUR5 ((unsigned16_t)0x002d) -#define FMTCODE_HOUR6 ((unsigned16_t)0x002e) -#define FMTCODE_HOUR7 ((unsigned16_t)0x002f) -#define FMTCODE_SCIENTIFIC2 ((unsigned16_t)0x0030) -#define FMTCODE_TEXT ((unsigned16_t)0x0031) - - typedef enum - { - FMT_GENERAL = 0, - FMT_NUMBER1, - FMT_NUMBER2, - FMT_NUMBER3, - FMT_NUMBER4, - FMT_CURRENCY1, - FMT_CURRENCY2, - FMT_CURRENCY3, - FMT_CURRENCY4, - FMT_PERCENT1, - FMT_PERCENT2, - FMT_SCIENTIFIC1, - FMT_FRACTION1, - FMT_FRACTION2, - FMT_DATE1, - FMT_DATE2, - FMT_DATE3, - FMT_DATE4, - FMT_HOUR1, - FMT_HOUR2, - FMT_HOUR3, - FMT_HOUR4, - FMT_HOURDATE, - FMT_NUMBER5, - FMT_NUMBER6, - FMT_NUMBER7, - FMT_NUMBER8, - FMT_ACCOUNTING1, - FMT_ACCOUNTING2, - FMT_ACCOUNTING3, - FMT_ACCOUNTING4, - FMT_HOUR5, - FMT_HOUR6, - FMT_HOUR7, - FMT_SCIENTIFIC2, - FMT_TEXT - } format_number_t; - - /* -****************************** -CFormat class declaration -****************************** -*/ - - class format_t - { - public: - format_t(unsigned16_t idx, std::string fmtstr) - : index(idx), formatstr(fmtstr), m_usage_counter(0) - {}; - ~format_t(){}; - - unsigned16_t GetIndex(){return index;}; - void SetIndex(unsigned16_t idx){index = idx;}; - - std::string& GetFormatStr(void) {return formatstr;}; - void SetFormatStr(std::string& fmtstr) {formatstr = fmtstr;}; - - void MarkUsed() {m_usage_counter++;}; - bool IsUsed() {return(m_usage_counter != 0);}; - - private: - - - unsigned16_t index; - std::string formatstr; - - unsigned16_t m_usage_counter; - }; - typedef std::list Format_List_t; - typedef Format_List_t::iterator Format_List_Itor_t; - - - - - class CFormat: public CRecord - { - protected: - - public: - - CFormat(std::string& formatstr, unsigned16_t index); - CFormat(format_t* formatdef); - ~CFormat(); - - - int SetFormatStr(std::string& formatstr); - int GetFormatStr(std::string& formatstr); - - int SetIndex(unsigned16_t index); - unsigned16_t GetIndex(void); - - // int SetName(std::string& formatstr); - - }; - -} - -#endif //FORMAT_H - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: format.h,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:57 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - diff --git a/uppdev/XLS/formtags.h b/uppdev/XLS/formtags.h deleted file mode 100644 index 6d74e2d8e..000000000 --- a/uppdev/XLS/formtags.h +++ /dev/null @@ -1,240 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/formtags.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#include -/* - sed -e 's/^\([A-Za-z0-9]*\)$/#define FT_\1 \\/' biff_formula_tags_norm.txt | sed -e 's/^ \([A-F0-9]*\)\h$/ ((unsigned char)0x\1)/' | sed -e "s/^ \([oc].*\)//" > formtags.h -*/ - -#define FT_ptgExp \ - ((unsigned char)0x01) -#define FT_ptgTbl \ - ((unsigned char)0x02) -#define FT_ptgAdd \ - ((unsigned char)0x03) -#define FT_ptgSub \ - ((unsigned char)0x04) -#define FT_ptgMul \ - ((unsigned char)0x05) -#define FT_ptgDiv \ - ((unsigned char)0x06) -#define FT_ptgPower \ - ((unsigned char)0x07) -#define FT_ptgConcat \ - ((unsigned char)0x08) -#define FT_ptgLT \ - ((unsigned char)0x09) -#define FT_ptgLE \ - ((unsigned char)0x0A) -#define FT_ptgEQ \ - ((unsigned char)0x0B) -#define FT_ptgGE \ - ((unsigned char)0x0C) -#define FT_ptgGT \ - ((unsigned char)0x0D) -#define FT_ptgNE \ - ((unsigned char)0x0E) -#define FT_ptgIsect \ - ((unsigned char)0x0F) -#define FT_ptgUnion \ - ((unsigned char)0x10) -#define FT_ptgRange \ - ((unsigned char)0x11) -#define FT_ptgUplus \ - ((unsigned char)0x12) -#define FT_ptgUminus \ - ((unsigned char)0x13) -#define FT_ptgPercent \ - ((unsigned char)0x14) -#define FT_ptgParen \ - ((unsigned char)0x15) -#define FT_ptgMissArg \ - ((unsigned char)0x16) -#define FT_ptgStr \ - ((unsigned char)0x17) -#define FT_ptgAttr \ - ((unsigned char)0x19) -#define FT_ptgSheet \ - ((unsigned char)0x1A) -#define FT_ptgEndSheet \ - ((unsigned char)0x1B) -#define FT_ptgErr \ - ((unsigned char)0x1C) -#define FT_ptgBool \ - ((unsigned char)0x1D) -#define FT_ptgInt \ - ((unsigned char)0x1E) -#define FT_ptgNum \ - ((unsigned char)0x1F) -#define FT_ptgArray \ - ((unsigned char)0x20) -#define FT_ptgFunc \ - ((unsigned char)0x21) -#define FT_ptgFuncVar \ - ((unsigned char)0x22) -#define FT_ptgName \ - ((unsigned char)0x23) -#define FT_ptgRef \ - ((unsigned char)0x24) -#define FT_ptgArea \ - ((unsigned char)0x25) -#define FT_ptgMemArea \ - ((unsigned char)0x26) -#define FT_ptgMemErr \ - ((unsigned char)0x27) -#define FT_ptgMemNoMem \ - ((unsigned char)0x28) -#define FT_ptgMemFunc \ - ((unsigned char)0x29) -#define FT_ptgRefErr \ - ((unsigned char)0x2A) -#define FT_ptgAreaErr \ - ((unsigned char)0x2B) -#define FT_ptgRefN \ - ((unsigned char)0x2C) -#define FT_ptgAreaN \ - ((unsigned char)0x2D) -#define FT_ptgMemAreaN \ - ((unsigned char)0x2E) -#define FT_ptgMemNoMemN \ - ((unsigned char)0x2F) -#define FT_ptgNameX \ - ((unsigned char)0x39) -#define FT_ptgRef3d \ - ((unsigned char)0x3A) -#define FT_ptgArea3d \ - ((unsigned char)0x3B) -#define FT_ptgRefErr3d \ - ((unsigned char)0x3C) -#define FT_ptgAreaErr3d \ - ((unsigned char)0x3D) -#define FT_ptgArrayV \ - ((unsigned char)0x40) -#define FT_ptgFuncV \ - ((unsigned char)0x41) -#define FT_ptgFuncVarV \ - ((unsigned char)0x42) -#define FT_ptgNameV \ - ((unsigned char)0x43) -#define FT_ptgRefV \ - ((unsigned char)0x44) -#define FT_ptgAreaV \ - ((unsigned char)0x45) -#define FT_ptgMemAreaV \ - ((unsigned char)0x46) -#define FT_ptgMemErrV \ - ((unsigned char)0x47) -#define FT_ptgMemNoMemV \ - ((unsigned char)0x48) -#define FT_ptgMemFuncV \ - ((unsigned char)0x49) -#define FT_ptgRefErrV \ - ((unsigned char)0x4A) -#define FT_ptgAreaErrV \ - ((unsigned char)0x4B) -#define FT_ptgRefNV \ - ((unsigned char)0x4C) -#define FT_ptgAreaNV \ - ((unsigned char)0x4D) -#define FT_ptgMemAreaNV \ - ((unsigned char)0x4E) -#define FT_ptgMemNoMemNV \ - ((unsigned char)0x4F) -#define FT_ptgFuncCEV \ - ((unsigned char)0x58) -#define FT_ptgNameXV \ - ((unsigned char)0x59) -#define FT_ptgRef3dV \ - ((unsigned char)0x5A) -#define FT_ptgArea3dV \ - ((unsigned char)0x5B) -#define FT_ptgRefErr3dV \ - ((unsigned char)0x5C) -#define FT_ptgAreaErr3dV \ - ((unsigned char)0x5D) -#define FT_ptgArrayA \ - ((unsigned char)0x60) -#define FT_ptgFuncA \ - ((unsigned char)0x61) -#define FT_ptgFuncVarA \ - ((unsigned char)0x62) -#define FT_ptgNameA \ - ((unsigned char)0x63) -#define FT_ptgRefA \ - ((unsigned char)0x64) -#define FT_ptgAreaA \ - ((unsigned char)0x65) -#define FT_ptgMemAreaA \ - ((unsigned char)0x66) -#define FT_ptgMemErrA \ - ((unsigned char)0x67) -#define FT_ptgMemNoMemA \ - ((unsigned char)0x68) -#define FT_ptgMemFuncA \ - ((unsigned char)0x69) -#define FT_ptgRefErrA \ - ((unsigned char)0x6A) -#define FT_ptgAreaErrA \ - ((unsigned char)0x6B) -#define FT_ptgRefNA \ - ((unsigned char)0x6C) -#define FT_ptgAreaNA \ - ((unsigned char)0x6D) -#define FT_ptgMemAreaNA \ - ((unsigned char)0x6E) -#define FT_ptgMemNoMemNA \ - ((unsigned char)0x6F) -#define FT_ptgFuncCEA \ - ((unsigned char)0x78) -#define FT_ptgNameXA \ - ((unsigned char)0x79) -#define FT_ptgRef3dA \ - ((unsigned char)0x7A) -#define FT_ptgArea3dA \ - ((unsigned char)0x7B) -#define FT_ptgRefErr3dA \ - ((unsigned char)0x7C) -#define FT_ptgAreaErr3dA \ - ((unsigned char)0x7D) - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: formtags.h,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:46 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/globalrec.cpp b/uppdev/XLS/globalrec.cpp deleted file mode 100644 index de35b40b2..000000000 --- a/uppdev/XLS/globalrec.cpp +++ /dev/null @@ -1,1046 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/globalrec.cpp,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#include - -using namespace std; -using namespace xlslib_core; - - -/* -********************************************************************** -CGlobalRecords class implementation -********************************************************************** -*/ - -/* - -const font_init_t CGlobalRecords::m_Default_Fonts [GLOBAL_NUM_DEFAULT_FONT ] = -{ -{0x0000, "Arial", 0x00c8, BOLDNESS_NORMAL, UNDERLINE_NONE, SCRIPT_NONE, COLOR_BLACK, FONT_DFLT_ATTRIBUTES, FONT_DFLT_FAMILY, FONT_DFLT_CHARSET}, -{0x0001, "Arial", 0x00c8, BOLDNESS_NORMAL, UNDERLINE_NONE, SCRIPT_NONE, COLOR_BLACK, FONT_DFLT_ATTRIBUTES, FONT_DFLT_FAMILY, FONT_DFLT_CHARSET}, -{0x0002, "Arial", 0x00c8, BOLDNESS_NORMAL, UNDERLINE_NONE, SCRIPT_NONE, COLOR_BLACK, FONT_DFLT_ATTRIBUTES, FONT_DFLT_FAMILY, FONT_DFLT_CHARSET}, -{0x0003, "Arial", 0x00c8, BOLDNESS_NORMAL, UNDERLINE_NONE, SCRIPT_NONE, COLOR_BLACK, FONT_DFLT_ATTRIBUTES, FONT_DFLT_FAMILY, FONT_DFLT_CHARSET}, -{0x0005, "Arial", 0x00c8, BOLDNESS_NORMAL, UNDERLINE_NONE, SCRIPT_NONE, COLOR_BLACK, FONT_ATTR_RESERVED0, 0x02, FONT_DFLT_CHARSET} -}; - -const format_t CGlobalRecords::m_Default_Formats[GLOBAL_NUM_DEFAULT_FORMATS ] = -{ - { 0x05, "\"$\"#,##0;\\-\"$\"#,##0" }, - { 0x06, "\"$\"#,##0;[Red]\\-\"$\"#,##0" }, - { 0x07, "\"$\"#,##0.00;\\-\"$\"#,##0.00" }, - { 0x08, "\"$\"#,##0.00;[Red]\\-\"$\"#,##0.00" }, - { 0x2a, "_-\"$\"* #,##0_-;\\-\"$\"* #,##0_-;_-\"$\"* \"-\"_-;_-@_-" }, - { 0x29, "_-* #,##0_-;\\-* #,##0_-;_-* \"-\"_-;_-@_-" }, - { 0x2c, "_-\"$\"* #,##0.00_-;\\-\"$\"* #,##0.00_-;_-\"$\"* \"-\"??_-;_-@_-" }, - { 0x2b, "_-* #,##0.00_-;\\-* #,##0.00_-;_-* \"-\"??_-;_-@_-" } -}; - -const xf_init_t CGlobalRecords::m_Default_XFs[GLOBAL_NUM_DEFAULT_XFS] = -{ - {0x0000, 0x0000, 0x0000, HALIGN_GENERAL, VALIGN_BOTTOM, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_STYLE, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK}, - {0x0001, 0x0001, 0x0000, HALIGN_GENERAL, VALIGN_BOTTOM, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_STYLE, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK}, - {0x0002, 0x0001, 0x0000, HALIGN_GENERAL, VALIGN_BOTTOM, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_STYLE, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK}, - {0x0003, 0x0002, 0x0000, HALIGN_GENERAL, VALIGN_BOTTOM, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_STYLE, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK}, - {0x0004, 0x0002, 0x0000, HALIGN_GENERAL, VALIGN_BOTTOM, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_STYLE, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK}, - {0x0005, 0x0000, 0x0000, HALIGN_GENERAL, VALIGN_BOTTOM, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_STYLE, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK}, - {0x0006, 0x0000, 0x0000, HALIGN_GENERAL, VALIGN_BOTTOM, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_STYLE, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK}, - {0x0007, 0x0000, 0x0000, HALIGN_GENERAL, VALIGN_BOTTOM, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_STYLE, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK}, - {0x0008, 0x0000, 0x0000, HALIGN_GENERAL, VALIGN_BOTTOM, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_STYLE, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK}, - {0x0009, 0x0000, 0x0000, HALIGN_GENERAL, VALIGN_BOTTOM, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_STYLE, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK}, - {0x000a, 0x0000, 0x0000, HALIGN_GENERAL, VALIGN_BOTTOM, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_STYLE, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK}, - {0x000b, 0x0000, 0x0000, HALIGN_GENERAL, VALIGN_BOTTOM, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_STYLE, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK}, - {0x000c, 0x0000, 0x0000, HALIGN_GENERAL, VALIGN_BOTTOM, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_STYLE, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK}, - {0x000d, 0x0000, 0x0000, HALIGN_GENERAL, VALIGN_BOTTOM, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_STYLE, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK}, - {0x000e, 0x0000, 0x0000, HALIGN_GENERAL, VALIGN_BOTTOM, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_STYLE, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK}, - {0x000f, 0x0000, 0x0000, HALIGN_GENERAL, VALIGN_BOTTOM, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_CELL , BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK} -}; -const style_t CGlobalRecords::m_Default_Styles [GLOBAL_NUM_DEFAULT_STYLES ] = -{ - {0x0010, 0x03 }, - {0x0011, 0x06 }, - {0x0012, 0x00 }, - {0x0013, 0x07 }, - {0x0000, 0x04 }, - {0x0014, 0x05 } -}; - -*/ - -/* -**************************************** -**************************************** -*/ - -CGlobalRecords::CGlobalRecords() - : m_DumpState(GLOBAL_INIT), - m_pCurrentData(NULL) -{ - - - // Initialize default fonts - font_t* newfont; - - newfont = new font_t(0x0000, "Arial", 0x00c8, BOLDNESS_NORMAL, UNDERLINE_NONE, SCRIPT_NONE, COLOR_BLACK, FONT_DFLT_ATTRIBUTES, FONT_DFLT_FAMILY, FONT_DFLT_CHARSET); - newfont->MarkUsed(); - newfont->MarkUsed(); - m_DefaultFonts.push_back(newfont); - - newfont = new font_t(0x0001, "Arial", 0x00c8, BOLDNESS_NORMAL, UNDERLINE_NONE, SCRIPT_NONE, COLOR_BLACK, FONT_DFLT_ATTRIBUTES, FONT_DFLT_FAMILY, FONT_DFLT_CHARSET); - newfont->MarkUsed(); - newfont->MarkUsed(); - m_DefaultFonts.push_back(newfont); - - newfont = new font_t(0x0002, "Arial", 0x00c8, BOLDNESS_NORMAL, UNDERLINE_NONE, SCRIPT_NONE, COLOR_BLACK, FONT_DFLT_ATTRIBUTES, FONT_DFLT_FAMILY, FONT_DFLT_CHARSET); - newfont->MarkUsed(); - newfont->MarkUsed(); - m_DefaultFonts.push_back(newfont); - - newfont = new font_t(0x0003, "Arial", 0x00c8, BOLDNESS_NORMAL, UNDERLINE_NONE, SCRIPT_NONE, COLOR_BLACK, FONT_DFLT_ATTRIBUTES, FONT_DFLT_FAMILY, FONT_DFLT_CHARSET); - newfont->MarkUsed(); - newfont->MarkUsed(); - m_DefaultFonts.push_back(newfont); - - newfont = new font_t(0x0004, "Arial", 0x00c8, BOLDNESS_NORMAL, UNDERLINE_NONE, SCRIPT_NONE, COLOR_BLACK, FONT_ATTR_RESERVED0, 0x02, FONT_DFLT_CHARSET); - newfont->MarkUsed(); - newfont->MarkUsed(); - m_DefaultFonts.push_back(newfont); - - // Initialize default formats -/* - format_t* newformat; - newformat = new format_t(0x05,"\"$\"#,##0;\\-\"$\"#,##0"); - newformat->MarkUsed(); - m_Formats.push_back(newformat); - - newformat = new format_t(0x06,"\"$\"#,##0;[Red]\\-\"$\"#,##0"); - newformat->MarkUsed(); - m_Formats.push_back(newformat); - - newformat = new format_t(0x07,"\"$\"#,##0.00;\\-\"$\"#,##0.00"); - newformat->MarkUsed(); - m_Formats.push_back(newformat); - - newformat = new format_t(0x08,"\"$\"#,##0.00;[Red]\\-\"$\"#,##0.00"); - newformat->MarkUsed(); - m_Formats.push_back(newformat); - - newformat = new format_t(0x27,"_-\"$\"* #,##0_-;\\-\"$\"* #,##0_-;_-\"$\"* \"-\"_-;_-@_-"); - newformat->MarkUsed(); - m_Formats.push_back(newformat); - - newformat = new format_t(0x29,"_-* #,##0_-;\\-* #,##0_-;_-* \"-\"_-;_-@_-"); - newformat->MarkUsed(); - m_Formats.push_back(newformat); - - newformat = new format_t(0x2c,"_-\"$\"* #,##0.00_-;\\-\"$\"* #,##0.00_-;_-\"$\"* \"-\"??_-;_-@_-"); - newformat->MarkUsed(); - m_Formats.push_back(newformat); - - newformat = new format_t(0x2b,"_-* #,##0.00_-;\\-* #,##0.00_-;_-* \"-\"??_-;_-@_-"); - newformat->MarkUsed(); - m_Formats.push_back(newformat); - -*/ - - // Initialize default XF records - xf_t* newxf; - newxf = new xf_t(0x0000, NULL, FMT_GENERAL, HALIGN_GENERAL, VALIGN_BOTTOM, INDENT_NONE, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_STYLE, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK); - newxf->MarkUsed(); - newxf->MarkUsed(); - m_DefaultXFs.push_back(newxf); - - newxf = new xf_t(0x0001, NULL/*0x0001*/, FMT_GENERAL, HALIGN_GENERAL, VALIGN_BOTTOM, INDENT_NONE, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_STYLE, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK); - newxf->MarkUsed(); - newxf->MarkUsed(); - m_DefaultXFs.push_back(newxf); - - newxf = new xf_t(0x0002, NULL/*0x0001*/, FMT_GENERAL, HALIGN_GENERAL, VALIGN_BOTTOM, INDENT_NONE, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_STYLE, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK); - newxf->MarkUsed(); - newxf->MarkUsed(); - m_DefaultXFs.push_back(newxf); - - newxf = new xf_t(0x0003, NULL/*0x0002*/, FMT_GENERAL, HALIGN_GENERAL, VALIGN_BOTTOM, INDENT_NONE, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_STYLE, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK); - newxf->MarkUsed(); - newxf->MarkUsed(); - m_DefaultXFs.push_back(newxf); - - newxf = new xf_t(0x0004, NULL/*0x0002*/, FMT_GENERAL, HALIGN_GENERAL, VALIGN_BOTTOM, INDENT_NONE, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_STYLE, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK); - newxf->MarkUsed(); - newxf->MarkUsed(); - m_DefaultXFs.push_back(newxf); - - newxf = new xf_t(0x0005, NULL, FMT_GENERAL, HALIGN_GENERAL, VALIGN_BOTTOM, INDENT_NONE, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_STYLE, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK); - newxf->MarkUsed(); - newxf->MarkUsed(); - m_DefaultXFs.push_back(newxf); - - newxf = new xf_t(0x0006, NULL, FMT_GENERAL, HALIGN_GENERAL, VALIGN_BOTTOM, INDENT_NONE, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_STYLE, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK); - newxf->MarkUsed(); - newxf->MarkUsed(); - m_DefaultXFs.push_back(newxf); - - newxf = new xf_t(0x0007, NULL, FMT_GENERAL, HALIGN_GENERAL, VALIGN_BOTTOM, INDENT_NONE, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_STYLE, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK); - newxf->MarkUsed(); - newxf->MarkUsed(); - m_DefaultXFs.push_back(newxf); - - newxf = new xf_t(0x0008, NULL, FMT_GENERAL, HALIGN_GENERAL, VALIGN_BOTTOM, INDENT_NONE, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_STYLE, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK); - newxf->MarkUsed(); - newxf->MarkUsed(); - m_DefaultXFs.push_back(newxf); - - newxf = new xf_t(0x0009, NULL, FMT_GENERAL, HALIGN_GENERAL, VALIGN_BOTTOM, INDENT_NONE, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_STYLE, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK); - newxf->MarkUsed(); - newxf->MarkUsed(); - m_DefaultXFs.push_back(newxf); - - newxf = new xf_t(0x000a, NULL, FMT_GENERAL, HALIGN_GENERAL, VALIGN_BOTTOM, INDENT_NONE, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_STYLE, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK); - newxf->MarkUsed(); - newxf->MarkUsed(); - m_DefaultXFs.push_back(newxf); - - newxf = new xf_t(0x000b, NULL, FMT_GENERAL, HALIGN_GENERAL, VALIGN_BOTTOM, INDENT_NONE, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_STYLE, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK); - newxf->MarkUsed(); - newxf->MarkUsed(); - m_DefaultXFs.push_back(newxf); - - newxf = new xf_t(0x000c, NULL, FMT_GENERAL, HALIGN_GENERAL, VALIGN_BOTTOM, INDENT_NONE, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_STYLE, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK); - newxf->MarkUsed(); - newxf->MarkUsed(); - m_DefaultXFs.push_back(newxf); - - newxf = new xf_t(0x000d, NULL, FMT_GENERAL, HALIGN_GENERAL, VALIGN_BOTTOM, INDENT_NONE, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_STYLE, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK); - newxf->MarkUsed(); - newxf->MarkUsed(); - m_DefaultXFs.push_back(newxf); - - newxf = new xf_t(0x000e, NULL, FMT_GENERAL, HALIGN_GENERAL, VALIGN_BOTTOM, INDENT_NONE, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_STYLE, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK); - newxf->MarkUsed(); - newxf->MarkUsed(); - m_DefaultXFs.push_back(newxf); - - newxf = new xf_t(0x000f, NULL, FMT_GENERAL, HALIGN_GENERAL, VALIGN_BOTTOM, INDENT_NONE, ORI_NONE, COLOR_BLACK, COLOR_WHITE, FILL_NONE, XF_LOCKED, XF_NO_HIDDEN, XF_NO_WRAPPED, XF_IS_CELL , BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK, BORDER_NONE, COLOR_BLACK); - newxf->MarkUsed(); - newxf->MarkUsed(); - m_DefaultXFs.push_back(newxf); - - - style_t* newstyle; - newstyle = new style_t; - newstyle->xfindex = 0x0010; - newstyle->builtintype = 0x03; - m_Styles.push_back(newstyle); - - newstyle = new style_t; - newstyle->xfindex = 0x0011; - newstyle->builtintype = 0x06; - m_Styles.push_back(newstyle); - - newstyle = new style_t; - newstyle->xfindex = 0x0012; - newstyle->builtintype = 0x00; - m_Styles.push_back(newstyle); - - newstyle = new style_t; - newstyle->xfindex = 0x0013; - newstyle->builtintype = 0x07; - m_Styles.push_back(newstyle); - - newstyle = new style_t; - newstyle->xfindex = 0x0000; - newstyle->builtintype = 0x04; - m_Styles.push_back(newstyle); - - newstyle = new style_t; - newstyle->xfindex = 0x0014; - newstyle->builtintype = 0x05; - m_Styles.push_back(newstyle); - - - -/* -// Initialize lists with de default values: -int i; - -for(i = 0; iSetIndex(next_fontindex); - next_fontindex++; - m_pCurrentData = (CUnit*)(new CFont(*font_dflt)); - - if(font_dflt != (--m_DefaultFonts.end())) - {// if it was'nt the last font from the list, increment to get the next one - font_dflt++; - } - else - {// if it was the last from the list, change the DumpState - m_DumpState = GLOBAL_FONTS; - font_dflt = m_DefaultFonts.begin(); - } - - break; - } - case GLOBAL_FONTS:// ********** STATE 3B ************* - XTRACE("\tFONTS"); - { - - repeat = false; - - if(!m_Fonts.empty()) - {// First check if the list of fonts is not empty... - - - if((*font)->IsUsed()) - { - // According documentation, for backwards - // compatibility, there is no index 4. - if(next_fontindex==4) next_fontindex++; - (*font)->SetIndex(next_fontindex); - next_fontindex++; - m_pCurrentData = (CUnit*)(new CFont(*font)); - } - else - { - repeat = true; - } - - - if(font != (--m_Fonts.end())) - {// if it was'nt the last font from the list, increment to get the next one - font++; - } - else - {// if it was the last from the list, change the DumpState - m_DumpState = GLOBAL_FORMATS; - font = m_Fonts.begin(); - } - } - else - {// if the list is empty, change the dump state. - m_DumpState = GLOBAL_FORMATS; - //font = m_Fonts.begin(); - repeat = true; - } - - break; - } - - case GLOBAL_FORMATS: // ********** STATE 4 ************* - { - - repeat = false; - - XTRACE("\tFORMATS"); - if(!m_Formats.empty()) - {// First check if the list of fonts is not empty... - - - if(/*(*format)->IsUsed()*/true) - { - if((*format)->GetIndex()!=0) - next_formatindex = (*format)->GetIndex(); - - (*format)->SetIndex(next_formatindex); - next_formatindex++; - m_pCurrentData = (CUnit*)(new CFormat(*format)); - } - else - { - repeat = true; - } - - if(format != (--m_Formats.end())) - {// if it was'nt the last font from the list, increment to get the next one - format++; - } - else - {// if it was the last from the list, change the DumpState - m_DumpState = GLOBAL_DEFAULTXFS; - format = m_Formats.begin(); - } - } - else - {// if the list is empty, change the dump state. - m_DumpState = GLOBAL_DEFAULTXFS; - // format = m_Formats.begin(); - repeat = true; - } - - break; - } - - case GLOBAL_DEFAULTXFS: // ********** STATE 5a ************* - { - - repeat = false; - - XTRACE("\tXDEFAULTFS"); - - (*xf_dflt)->SetIndex(next_xfindex); - next_xfindex++; - - m_pCurrentData = (CUnit*)(new CExtFormat(*xf_dflt)); - - - if(xf_dflt != (--m_DefaultXFs.end())) - {// if it was'nt the last font from the list, increment to get the next one - xf_dflt++; - } - else - {// if it was the last from the list, change the DumpState - m_DumpState = GLOBAL_XFS; - xf_dflt = m_DefaultXFs.begin(); - } - - break; - } - - case GLOBAL_XFS: // ********** STATE 5b ************* - { - - repeat = false; - - XTRACE("\tXFS"); - if(!m_XFs.empty()) - {// First check if the list of fonts is not empty... - - if((*xf)->IsUsed()) - { - (*xf)->SetIndex(next_xfindex); - next_xfindex++; - - m_pCurrentData = (CUnit*)(new CExtFormat(*xf)); - } - else - { - repeat = true; - } - - if(xf != (--m_XFs.end())) - {// if it was'nt the last font from the list, increment to get the next one - xf++; - } - else - {// if it was the last from the list, change the DumpState - m_DumpState = GLOBAL_STYLES; - xf = m_XFs.begin(); - } - } - else - {// if the list is empty, change the dump state. - m_DumpState = GLOBAL_STYLES; - //xf = m_XFs.begin(); - repeat = true; - } - - break; - } - - case GLOBAL_STYLES: // ********** STATE 6 ************* - { - XTRACE("\tSTYLES"); - repeat = false; - - if(!m_Styles.empty()) - {// First check if the list of fonts is not empty... - - //Delete_Pointer(m_pCurrentData); - m_pCurrentData = (CUnit*)(new CStyle(*style)); - - if(style != (--m_Styles.end())) - {// if it was'nt the last font from the list, increment to get the next one - style++; - } - else - {// if it was the last from the list, change the DumpState - m_DumpState = GLOBAL_BOUNDSHEETS; - style = m_Styles.begin(); - } - } - else - {// if the list is empty, change the dump state. - m_DumpState = GLOBAL_BOUNDSHEETS; - //style = m_Styles.begin(); - repeat = true; - } - - break; - } - - - case GLOBAL_BOUNDSHEETS: // ********** STATE 7 ************* - { - repeat = false; - - XTRACE("\tBOUNDSHEETS"); - if(!m_BoundSheets.empty()) - {// First check if the list of fonts is not empty... - - //Delete_Pointer(m_pCurrentData); - m_pCurrentData = (CUnit*)(new CBSheet(*bsheet)); - - if(bsheet != (--m_BoundSheets.end())) - {// if it was'nt the last font from the list, increment to get the next one - bsheet++; - } - else - {// if it was the last from the list, change the DumpState - m_DumpState = GLOBAL_EOF; - bsheet = m_BoundSheets.begin(); - } - } - else - {// if the list is empty, change the dump state. - - m_DumpState = GLOBAL_EOF; - bsheet = m_BoundSheets.begin(); - repeat = true; - } - - break; - } - - case GLOBAL_EOF:// ********** STATE 8 ************* - XTRACE("\tEOF"); - - repeat = false; - //Delete_Pointer(m_pCurrentData); - m_pCurrentData = (CUnit*)(new CEof()); - m_DumpState = GLOBAL_FINISH; - - break; - - case GLOBAL_FINISH: // ********** STATE 9 ************* - - XTRACE("\tFINISH"); - //Delete_Pointer(m_pCurrentData); - m_pCurrentData = NULL; - m_DumpState = GLOBAL_INIT; - - break; - - default: - /* It shouldn't get here */ - XTRACE("\tDEFAULT"); - break; - - - } - } while(repeat); - - return m_pCurrentData; - -} - - -/* -**************************************** -**************************************** -*/ -void CGlobalRecords::AddBoundingSheet(unsigned32_t streampos, - unsigned16_t attributes, - string& sheetname) -{ - - boundsheet_t* bsheetdef = new boundsheet_t; - - bsheetdef->worksheet = (bool)((attributes & BSHEET_ATTR_WORKSHEET ) == BSHEET_ATTR_WORKSHEET ); - bsheetdef->ex4macro = (bool)((attributes & BSHEET_ATTR_EX4MACRO ) == BSHEET_ATTR_EX4MACRO ); - bsheetdef->chart = (bool)((attributes & BSHEET_ATTR_CHART ) == BSHEET_ATTR_CHART ); - bsheetdef->vbmodule = (bool)((attributes & BSHEET_ATTR_VBMODULE ) == BSHEET_ATTR_VBMODULE ); - bsheetdef->visible = (bool)((attributes & BSHEET_ATTR_VISIBLE ) == BSHEET_ATTR_VISIBLE ); - bsheetdef->hidden = (bool)((attributes & BSHEET_ATTR_HIDDEN ) == BSHEET_ATTR_HIDDEN ); - bsheetdef->veryhidden = (bool)((attributes & BSHEET_ATTR_VERYHIDDEN ) == BSHEET_ATTR_VERYHIDDEN); - - bsheetdef->asheetname = sheetname; - bsheetdef->streampos = streampos; - - m_BoundSheets.push_back(bsheetdef); - -} -#if VERSION_BIFF == VERSION_BIFF8 -void CGlobalRecords::AddBoundingSheet(unsigned32_t streampos, - unsigned16_t attributes, - ustring& sheetname -#ifdef HAVE_ICONV - , string& iconv_code -#endif - ) -{ - boundsheet_t* bsheetdef = new boundsheet_t; - - bsheetdef->worksheet = (bool)((attributes & BSHEET_ATTR_WORKSHEET ) == BSHEET_ATTR_WORKSHEET ); - bsheetdef->ex4macro = (bool)((attributes & BSHEET_ATTR_EX4MACRO ) == BSHEET_ATTR_EX4MACRO ); - bsheetdef->chart = (bool)((attributes & BSHEET_ATTR_CHART ) == BSHEET_ATTR_CHART ); - bsheetdef->vbmodule = (bool)((attributes & BSHEET_ATTR_VBMODULE ) == BSHEET_ATTR_VBMODULE ); - bsheetdef->visible = (bool)((attributes & BSHEET_ATTR_VISIBLE ) == BSHEET_ATTR_VISIBLE ); - bsheetdef->hidden = (bool)((attributes & BSHEET_ATTR_HIDDEN ) == BSHEET_ATTR_HIDDEN ); - bsheetdef->veryhidden = (bool)((attributes & BSHEET_ATTR_VERYHIDDEN ) == BSHEET_ATTR_VERYHIDDEN); - - bsheetdef->usheetname = sheetname; -#ifdef HAVE_ICONV - bsheetdef->iconv_code = iconv_code; -#endif - bsheetdef->streampos = streampos; - - m_BoundSheets.push_back(bsheetdef); - -} -#endif - -/* -**************************************** -**************************************** -*/ -void CGlobalRecords::AddBoundingSheet(boundsheet_t* bsheetdef) -{ - m_BoundSheets.push_back(bsheetdef); -} - - -/* -**************************************** -It returns pointers to BoundingSheets one by one until -all are spanned, in which case the returned pointer is NULL -**************************************** -*/ -void CGlobalRecords::GetBoundingSheets(Boundsheet_List_Itor_t& bs) -{ - if(bs != m_BoundSheets.end()) - bs++; - else - bs = m_BoundSheets.begin(); -} - - -Boundsheet_List_Itor_t CGlobalRecords::GetFirstBoundSheet() -{ - return m_BoundSheets.begin(); -} - -Boundsheet_List_Itor_t CGlobalRecords::GetEndBoundSheet() -{ - return m_BoundSheets.end(); -} - -/* -**************************************** -**************************************** -*/ - -font_t* CGlobalRecords::AddFont(font_t* newfont ) -{ - - newfont->SetIndex(0x0000); - pair itorpair = m_Fonts.insert(newfont); - - if(newfont != *itorpair.first) - delete newfont; - - return(*itorpair.first); - -} - -/* -**************************************** -**************************************** -*/ - -format_t* CGlobalRecords::AddFormat(format_t* newformat ) -{ - - newformat->SetIndex(0x0000); - m_Formats.push_back(newformat); - return(m_Formats.back()); - -} - - -/* -**************************************** -**************************************** -*/ - -xf_t* CGlobalRecords::AddXFormat(xf_t* xf) -{ - xf->SetIndex(0x0000); - pair itorpair = m_XFs.insert(xf); - - if(xf != *itorpair.first) - delete xf; - - return(*itorpair.first); -} - -xf_t* CGlobalRecords::ReplaceXFormat(xf_t* xf, xf_t* xfnew) -{ - XF_Set_Itor_t existing_xf; - existing_xf = m_XFs.find(xf); - - xf_t* inserted = NULL; - if(existing_xf != m_XFs.end()) - { - xf_t* todiexf = *existing_xf; - m_XFs.erase(existing_xf); - delete todiexf; - pair itorpair = m_XFs.insert(xfnew); - - inserted = *itorpair.first; - if(inserted != xfnew) - delete xfnew; - } - else - { - // This should never happen - // since the previous pointer is taken - // from the container itself... but anyway - pair itorpair = m_XFs.insert(xfnew); - - inserted = *itorpair.first; - if(inserted != xfnew) - delete xfnew; - } - return inserted; -} - -font_t* CGlobalRecords::ReplaceFont(font_t* fnt, font_t* fntnew) -{ - Font_Set_Itor_t existing_font; - existing_font = m_Fonts.find(fnt); - - font_t *inserted = NULL; - if(existing_font != m_Fonts.end()) - { - font_t* todiefont = *existing_font; - m_Fonts.erase(existing_font); - delete todiefont; - - pair itorpair = m_Fonts.insert(fntnew); - - inserted = *itorpair.first; - if(inserted != fntnew) - delete fntnew; - - } - else - { - // This should never happen - // since the previous pointer is taken - // from the container itself... but anyway - pair itorpair = m_Fonts.insert(fntnew); - - inserted = *itorpair.first; - if(inserted != fntnew) - delete fntnew; - - } - return inserted; - -} - - -font_t* CGlobalRecords::GetDefaultFont(void) -{ - return *m_DefaultFonts.begin(); - -} - -xf_t* CGlobalRecords::GetDefaultXF(void) -{ - return m_DefaultXFs.back(); - -} - -/* -**************************************** -Maybe the implementation of this procedure -can be optimized. -**************************************** -*/ - -unsigned32_t CGlobalRecords::GetSize(void) -{ - - CUnit* pdata = NULL; - unsigned32_t total_datasize = 0; - bool keep = true; - do - { - - pdata = DumpData(); - if(pdata != NULL) - { - total_datasize += pdata->GetDataSize(); - delete pdata; - } - else - { - keep = false; - } - - }while(keep); - - return total_datasize; - - -} - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: globalrec.cpp,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:56 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/globalrec.h b/uppdev/XLS/globalrec.h deleted file mode 100644 index 78a9fb258..000000000 --- a/uppdev/XLS/globalrec.h +++ /dev/null @@ -1,179 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/globalrec.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#ifndef GLOBALREC_H -#define GLOBALREC_H - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace xlslib_core -{ - - /* -*********************************** -CGlobalRecords class declaration -*********************************** -*/ - - -#define GLOBAL_NUM_DEFAULT_FONT (5) -#define GLOBAL_NUM_DEFAULT_FORMATS (8) -#define GLOBAL_NUM_DEFAULT_XFS (16) -#define GLOBAL_NUM_DEFAULT_STYLES (6) - - - - typedef enum - { - GLOBAL_INIT, - GLOBAL_BOF, - GLOBAL_CODEPAGE, - GLOBAL_WINDOW1, - GLOBAL_DATEMODE, - GLOBAL_DEFAULTFONTS, - GLOBAL_FONTS, - GLOBAL_FORMATS, - GLOBAL_DEFAULTXFS, - GLOBAL_XFS, - GLOBAL_STYLES, - GLOBAL_BOUNDSHEETS, - GLOBAL_EOF, - GLOBAL_FINISH - } GlobalRecordDumpState_t; - - - - class CGlobalRecords: public CBiffSection - { - private: - Font_Set_t m_Fonts; - Font_List_t m_DefaultFonts; - Format_List_t m_Formats; - XF_Set_t m_XFs; - XF_List_t m_DefaultXFs; - Style_List_t m_Styles; - Boundsheet_List_t m_BoundSheets; - - /* - static const font_init_t m_Default_Fonts [GLOBAL_NUM_DEFAULT_FONT ]; - static const format_t m_Default_Formats[GLOBAL_NUM_DEFAULT_FORMATS ]; - static const xf_init_t m_Default_XFs [GLOBAL_NUM_DEFAULT_XFS ]; - static const style_t m_Default_Styles [GLOBAL_NUM_DEFAULT_STYLES ]; - */ - - // State Machine variables - - GlobalRecordDumpState_t m_DumpState; - CUnit* m_pCurrentData; - - public: - CGlobalRecords(); - ~CGlobalRecords(); - - void AddBoundingSheet(unsigned32_t streampos, - unsigned16_t attributes, - std::string& sheetname); -#if VERSION_BIFF == VERSION_BIFF8 - void AddBoundingSheet(unsigned32_t streampos, - unsigned16_t attributes, - std::ustring& sheetname -#ifdef HAVE_ICONV - , std::string& iconv_code -#endif - ); -#endif - void AddBoundingSheet(boundsheet_t* bsheetdef); - - - // TODO: Check if the font already exists (using CRC or raw comparison) - font_t* AddFont(font_t* newfont ); - format_t* AddFormat(format_t*); - - xf_t* AddXFormat(xf_t* xf); - xf_t* ReplaceXFormat(xf_t* xf, xf_t* xfnew); - font_t* ReplaceFont(font_t* fnt, font_t* fntnew); - - void GetBoundingSheets(Boundsheet_List_Itor_t &bs); - - // A Kind of state machine that will return - // a non-null pointer to the data unit until all data has been retrieved. - CUnit* DumpData(bool reset = false); - - Boundsheet_List_Itor_t GetFirstBoundSheet(); - Boundsheet_List_Itor_t GetEndBoundSheet(); - unsigned32_t GetSize(void); - font_t* GetDefaultFont(void); - xf_t* GetDefaultXF(void); - - private: - // Former static variiables - // ======================== - - // From DumpData - Font_Set_Itor_t font; - Font_List_Itor_t font_dflt; - Format_List_Itor_t format; - - XF_Set_Itor_t xf; - XF_List_Itor_t xf_dflt; - - unsigned16_t next_fontindex; - unsigned16_t next_xfindex; - unsigned16_t next_formatindex; - Style_List_Itor_t style; - Boundsheet_List_Itor_t bsheet; - }; - -} -#endif // GLOBALREC_H - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: globalrec.h,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:49 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/index.cpp b/uppdev/XLS/index.cpp deleted file mode 100644 index 951b55428..000000000 --- a/uppdev/XLS/index.cpp +++ /dev/null @@ -1,158 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/index.cpp,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#include - -using namespace std; -using namespace xlslib_core; - - -/* -****************************** -CIndex class implementation -****************************** -*/ -CIndex::CIndex(unsigned32_t firstrow, - unsigned32_t lastrow) -{ - SetRecordType((signed32_t)RECTYPE_INDEX); - - AddValue32(INDEX_DFLT_RESERVED); - -#if VERSION_BIFF == VERSION_BIFF5 - AddValue16(firstrow); - AddValue16(lastrow+1); -#else - AddValue32(firstrow); - AddValue32(lastrow+1); -#endif - - AddValue32(INDEX_DFLT_RESERVED); -// NOTE: This record is created with an empty array. It should work if the rest -// of the record is not completed later, since the record's size reflects the -// lack of such array - SetRecordLength(GetDataSize()-4); -} - -CIndex::~CIndex() -{ -} - - -/* -********************************** -********************************** -*/ -void CIndex::AddDBCellOffset(unsigned32_t dboffset) -{ - AddValue32(dboffset); - - SetRecordLength(GetDataSize()-4); // Update record's length -} - -/* -********************************** -********************************** -*/ -void CIndex::SetRows(unsigned32_t firstrow, - unsigned32_t lastrow) -{ - -#if VERSION_BIFF == VERSION_BIFF5 - SetValueAt((signed16_t)firstrow, INDEX_OFFSET_B7FIRSTROW); - SetValueAt((signed16_t)lastrow, INDEX_OFFSET_B7LASTROW); -#else - SetValueAt((signed32_t)firstrow, INDEX_OFFSET_B7FIRSTROW); - SetValueAt((signed32_t)lastrow, INDEX_OFFSET_B7LASTROW); -#endif - -} - -/* -********************************** -********************************** -*/ - -unsigned32_t CIndex::GetFirstRow(void) -{ - - unsigned32_t retval; - -#if VERSION_BIFF == VERSION_BIFF5 - signed16_t firstrow; - GetValue16From(&firstrow, INDEX_OFFSET_B7FIRSTROW); - retval = firstrow; -#else - signed32_t firstrow; - GetValue32From(&firstrow, INDEX_OFFSET_B7FIRSTROW); - retval = firstrow; -#endif - - return retval; -} - -/* -********************************** -********************************** -*/ - -unsigned32_t CIndex::GetLastRow(void) -{ - - unsigned32_t retval; - -#if VERSION_BIFF == VERSION_BIFF5 - signed16_t lastrow; - GetValue16From(&lastrow, INDEX_OFFSET_B7LASTROW); - retval = lastrow; -#else - signed32_t lastrow; - GetValue32From(&lastrow, INDEX_OFFSET_B7LASTROW); - retval = lastrow; -#endif - - return retval; -} - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: index.cpp,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:53 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/index.h b/uppdev/XLS/index.h deleted file mode 100644 index b4c228f61..000000000 --- a/uppdev/XLS/index.h +++ /dev/null @@ -1,86 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/index.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#ifndef INDEX_H -#define INDEX_H - -#include -#include -#include - -namespace xlslib_core -{ - - /* -****************************** -CIndex class declaration -****************************** -*/ -#define INDEX_DFLT_RESERVED ((unsigned32_t)0x00000000) - -#define INDEX_OFFSET_B7FIRSTROW ((unsigned32_t)8) -#define INDEX_OFFSET_B7LASTROW ((unsigned32_t)10) -#define INDEX_OFFSET_B8FIRSTROW ((unsigned32_t)8) -#define INDEX_OFFSET_B8LASTROW ((unsigned32_t)12) - - class CIndex: public CRecord - { - private: - - public: - - CIndex(unsigned32_t firstrow, - unsigned32_t lastrow); - ~CIndex(); - void AddDBCellOffset(unsigned32_t dbcoffset); - void SetRows(unsigned32_t firstrow, unsigned32_t lastrow); - unsigned32_t GetFirstRow(void); - unsigned32_t GetLastRow(void); - - }; - -} -#endif //INDEX_H - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: index.h,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:46 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/init b/uppdev/XLS/init deleted file mode 100644 index 91bcbc0e2..000000000 --- a/uppdev/XLS/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _XLS_icpp_init_stub -#define _XLS_icpp_init_stub -#include "Core/init" -#endif diff --git a/uppdev/XLS/label.cpp b/uppdev/XLS/label.cpp deleted file mode 100644 index cc08791ff..000000000 --- a/uppdev/XLS/label.cpp +++ /dev/null @@ -1,262 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/label.cpp,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#include - -using namespace std; -using namespace xlslib_core; - -/* -****************************** -CLabel class implementation -****************************** -*/ -CLabel::CLabel(unsigned16_t row, - unsigned16_t col, - string& strlabel, - xf_t* pxfval) -{ - SetRecordType(RECTYPE_LABEL); - AddValue16(row); - AddValue16(col); - - unsigned16_t xfindex; - if(pxfval != NULL) - xfindex = pxfval->GetIndex(); - else - xfindex = 0x000f; - - - AddValue16(xfindex); - - signed16_t labelsize = strlabel.size(); -#if VERSION_BIFF == VERSION_BIFF5 - AddValue16((unsigned16_t)labelsize); - AddDataArray((unsigned8_t*)strlabel.c_str(), strlabel.size()); -#else - AddUnicodeStrlen((unsigned16_t)labelsize); - AddUnicodeString((unsigned8_t*)strlabel.c_str(), strlabel.size()); -#endif - - SetRecordLength(GetDataSize()-4); -} - -#if VERSION_BIFF == VERSION_BIFF8 - -CLabel::CLabel(unsigned16_t row, - unsigned16_t col, - ustring& ustrlabel -#ifdef HAVE_ICONV - , string& iconv_code -#endif - , xf_t* pxfval) -{ - unsigned16_t xfindex; - - SetRecordType(RECTYPE_LABEL); - AddValue16(row); - AddValue16(col); - - if(pxfval != NULL) - xfindex = pxfval->GetIndex(); - else - xfindex = 0x000f; - - AddValue16(xfindex); - -#ifdef HAVE_ICONV - u16string u16sheetname; - - Conv32to16(iconv_code, ustrlabel, u16sheetname); -// size_t outSize, resultSize; -// size_t iconv (iconv_t cd, char **restrict inbuf, size_t *restrict inbytesleft, char **restrict outbuf, size_t *restrict outbytesleft); - AddUnicodeStrlen((unsigned16_t)u16sheetname.size()); - AddUnicodeString((unsigned16_t* )u16sheetname.c_str(), u16sheetname.size()); -#else - AddUnicodeStrlen((unsigned16_t)ustrlabel.size()); - AddUnicodeString((unsigned16_t*)ustrlabel.c_str(), ustrlabel.size()); -#endif - - SetRecordLength(GetDataSize()-4); -} -#endif - -CLabel::CLabel(label_t& labeldef) - -{ - SetRecordType(RECTYPE_LABEL); - AddValue16(labeldef.GetRow()); - AddValue16(labeldef.GetCol()); - AddValue16(labeldef.GetXFIndex()); - - signed16_t labelsize = labeldef.GetStrLabelSize() ; - -#if VERSION_BIFF == VERSION_BIFF5 - AddValue16((unsigned16_t)labelsize); - AddDataArray(labeldef.GetStrLabelBuffer(), labelsize); -#else - if(labeldef.GetStrLabelSize()) { - AddUnicodeStrlen((unsigned16_t)labelsize); - AddUnicodeString(labeldef.GetStrLabelBuffer(), labelsize); - } else { -#ifdef HAVE_ICONV - u16string u16sheetname; - string iconvStr; - ustring label; - - iconvStr = *labeldef.GetIconvCode(); - label = *labeldef.GetUstrLabel(); - - Conv32to16(iconvStr, label, u16sheetname); - // size_t outSize, resultSize; - // size_t iconv (iconv_t cd, char **restrict inbuf, size_t *restrict inbytesleft, char **restrict outbuf, size_t *restrict outbytesleft); - AddUnicodeStrlen((unsigned16_t)u16sheetname.size()); - AddUnicodeString((unsigned16_t* )u16sheetname.c_str(), u16sheetname.size()); -#else - labelsize = labeldef.GetWStrLabelSize() ; - AddUnicodeStrlen((unsigned16_t)labelsize); - AddUnicodeString((unsigned16_t*)labeldef.GetWStrLabelBuffer(), labelsize); -#endif - } -#endif - - SetRecordLength(GetDataSize()-4); -} - -CLabel::~CLabel() -{ -} - -/* -****************************** -label_t class implementation -****************************** -*/ -xlslib_core::label_t::label_t(unsigned16_t rowval, unsigned16_t colval, - string& labelstrval, xf_t* pxfval) -{ - row = rowval; - col = colval; - if(pxfval != NULL) - pxfval->MarkUsed(); - pxf = pxfval; - -#if VERSION_BIFF == VERSION_BIFF5 - if(labelstrval.size() > 255) - { - - labelstrval.resize(255); - labelstrval[252] = '.'; - labelstrval[253] = '.'; - labelstrval[254] = '.'; - - } -#endif - - aStrlabel = labelstrval; -} - -#if VERSION_BIFF == VERSION_BIFF8 -xlslib_core::label_t::label_t(unsigned16_t rowval, unsigned16_t colval, - ustring& labelstrval -#ifdef HAVE_ICONV - , string& code -#endif - , xf_t* pxfval) -{ - row = rowval; - col = colval; - if(pxfval != NULL) - pxfval->MarkUsed(); - pxf = pxfval; - - uStrlabel = labelstrval; -#ifdef HAVE_ICONV - iconv_code = code; -#endif -} -#endif - -/* -****************************** -****************************** -*/ - -unsigned16_t xlslib_core::label_t::GetSize() -{ - unsigned16_t size = 0; - - size += 12; // Minimal label's size - size += aStrlabel.size(); - - - return size; -} -/* -****************************** -****************************** -*/ - -CUnit* xlslib_core::label_t::GetData() -{ - CUnit* datalabel; - -#if VERSION_BIFF == VERSION_BIFF5 - datalabel = (CUnit*)( new CLabel(row,col,aStrlabel,pxf)); -#else - if(aStrlabel.length() > 0) { - datalabel = (CUnit*)( new CLabel(row,col,aStrlabel,pxf)); - } else { -#ifdef HAVE_ICONV - datalabel = (CUnit*)( new CLabel(row,col,uStrlabel,iconv_code, pxf)); -#else - datalabel = (CUnit*)( new CLabel(row,col,uStrlabel, pxf)); -#endif - } -#endif - - return datalabel; // NOTE: this pointer HAS to be deleted elsewhere. -} - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: label.cpp,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:53 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/label.h b/uppdev/XLS/label.h deleted file mode 100644 index deba781d9..000000000 --- a/uppdev/XLS/label.h +++ /dev/null @@ -1,131 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/label.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#ifndef LABEL_H -#define LABEL_H - -#include -#include -#include -#include -#include -#include - -namespace xlslib_core -{ - -#define LABEL_DFLT_XFINDEX ((unsigned16_t)0x000f) -#define LABEL_OFFSET_FIRSTCOL ((unsigned8_t)6) -#define LABEL_OFFSET_LASTCOL ((unsigned8_t)8) - - class label_t; - class CLabel: public CRecord - { - private: - - public: - CLabel(unsigned16_t row, - unsigned16_t col, - std::string& strlabel, - xf_t* pxfval = NULL); -#if VERSION_BIFF == VERSION_BIFF8 - CLabel(unsigned16_t row, - unsigned16_t col, - std::ustring& strlabel -#ifdef HAVE_ICONV - , std::string& iconv_code -#endif - , xf_t* pxfval = NULL); -#endif - CLabel(label_t& labeldef); - ~CLabel(); - }; - - class label_t: public cell_t - { - - private: - std::string aStrlabel; -#if VERSION_BIFF == VERSION_BIFF8 - std::ustring uStrlabel; -#ifdef HAVE_ICONV - std::string iconv_code; -#endif -#endif - public: - label_t(unsigned16_t rowval, - unsigned16_t colval, - std::string& labelstrval, - xf_t* pxfval = NULL); - -#if VERSION_BIFF == VERSION_BIFF8 - label_t(unsigned16_t rowval, - unsigned16_t colval, - std::ustring& labelstrval -#ifdef HAVE_ICONV - , std::string& code -#endif - , xf_t* pxfval = NULL); -#endif - ~label_t(){}; - - unsigned16_t GetStrLabelSize() {return aStrlabel.size();}; - const unsigned8_t* GetStrLabelBuffer(){return (unsigned8_t*)aStrlabel.c_str();}; -#if VERSION_BIFF == VERSION_BIFF8 - unsigned16_t GetWStrLabelSize() {return uStrlabel.size();}; - const uchar_t *GetWStrLabelBuffer(){return (uchar_t*)uStrlabel.c_str();}; - std::ustring *GetUstrLabel() { return &uStrlabel; }; -#ifdef HAVE_ICONV - std::string *GetIconvCode() { return &iconv_code; }; -#endif -#endif - unsigned16_t GetSize(); - CUnit* GetData(); - - }; - -} -#endif //LABEL_H - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: label.h,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:46 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/merged.cpp b/uppdev/XLS/merged.cpp deleted file mode 100644 index 33a1270d1..000000000 --- a/uppdev/XLS/merged.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/merged.cpp,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#include - -using namespace std; -using namespace xlslib_core; - -/* -****************************** -CMergedCells class implementation -****************************** -*/ -CMergedCells::CMergedCells() -{ - SetRecordType(RECTYPE_MERGEDCELLS); - - // By default the record is empty - AddValue16(0x00); - - SetRecordLength(GetDataSize()-4); -} - -CMergedCells::~CMergedCells() -{ -} - -/* -****************************** -****************************** -*/ - -void CMergedCells::AddRange(range_t* rng) -{ - AddValue16(rng->first_row); - AddValue16(rng->last_row); - AddValue16(rng->first_col); - AddValue16(rng->last_col); - - SetRecordLength(GetDataSize()-4); -} - -/* -****************************** -****************************** -*/ -void CMergedCells::SetNumRanges(unsigned16_t numranges) -{ - - SetValueAt((signed16_t)numranges, 0x04); - -} - - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: merged.cpp,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:51 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - diff --git a/uppdev/XLS/merged.h b/uppdev/XLS/merged.h deleted file mode 100644 index c49e86282..000000000 --- a/uppdev/XLS/merged.h +++ /dev/null @@ -1,82 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/merged.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - - - - -#ifndef MERGED_H -#define MERGED_H - -#include -#include -#include -#include - -namespace xlslib_core -{ - - /* -****************************** -CMergedCells class declaration -****************************** -*/ - class CMergedCells: public CRecord - { - protected: - - public: - - CMergedCells(); - ~CMergedCells(); - - void AddRange(range_t* rng); - void SetNumRanges(unsigned16_t numranges); - - - }; -} - -#endif //MERGED_H - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: merged.h,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:44 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/number.cpp b/uppdev/XLS/number.cpp deleted file mode 100644 index dcf4474da..000000000 --- a/uppdev/XLS/number.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/number.cpp,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#include - -using namespace std; -using namespace xlslib_core; - -CNumber::CNumber(unsigned16_t row, - unsigned16_t col, - double num, - xf_t* pxfval) -{ - - SetRecordType(RECTYPE_NUMBER); - AddValue16(row); - AddValue16(col); - - unsigned16_t xfindex; - pxfval != NULL? - xfindex = pxfval->GetIndex() - :xfindex = 0x000f; - AddValue16(xfindex); - - void* pnumieee = (void*) # - unsigned64_t numieee = *((unsigned64_t*)(pnumieee)); - AddValue64(numieee); - - SetRecordLength(GetDataSize()-4); - -} - -CNumber::CNumber(number_t& numdef) -{ - SetRecordType(RECTYPE_NUMBER); // DFH was RECTYPE_LABEL, must have been a type ???? - AddValue16(numdef.GetRow()); - AddValue16(numdef.GetCol()); - AddValue16(numdef.GetXFIndex()); - - double num = numdef.GetNumber(); - void* pnumieee = (void*) # - unsigned64_t numieee = *((unsigned64_t*)(pnumieee)); - - AddValue64(numieee); - - SetRecordLength(GetDataSize()-4); -} - -CNumber::~CNumber() -{ -} - -/* -********************************* -number_t class implementation -********************************* -*/ -number_t::number_t(unsigned16_t rowval, - unsigned16_t colval, - double numval, - xf_t* pxfval) -{ - row = rowval; - col = colval; - number = numval; - - if(pxfval != NULL) - pxfval->MarkUsed(); - pxf = pxfval; - -} - -CUnit* number_t::GetData() { - CUnit* datanum = - (CUnit*)( new CNumber(row,col,number, pxf)); - return datanum; // NOTE: this pointer HAS to be deleted elsewhere. -} - - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: number.cpp,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:55 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/number.h b/uppdev/XLS/number.h deleted file mode 100644 index 50dff7f1f..000000000 --- a/uppdev/XLS/number.h +++ /dev/null @@ -1,101 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/number.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef NUMBER_H -#define NUMBER_H - -#include -#include -#include -#include -#include - - -namespace xlslib_core -{ - - class number_t; - class CNumber: public CRecord - { - private: - - - public: - CNumber(unsigned16_t row, - unsigned16_t col, - double num, - xf_t* pxfval = NULL); - - CNumber(number_t& blankdef); - ~CNumber(); - - - }; - - - class number_t: public cell_t - { - - private: - double number; - public: - number_t(unsigned16_t rowval, - unsigned16_t colval, - double numval, - xf_t* pxfval = NULL); - - ~number_t(){}; - - unsigned16_t GetSize(){return 18;}; - double GetNumber() {return number;}; - CUnit* GetData(); - - }; - - -} - -#endif //NUMBER_H - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: number.h,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:49 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/ole/binfile.h b/uppdev/XLS/ole/binfile.h deleted file mode 100644 index 095e6b531..000000000 --- a/uppdev/XLS/ole/binfile.h +++ /dev/null @@ -1,116 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/oledoc/binfile.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:53 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#ifndef BINFILE_H -#define BINFILE_H - -#include -#include - -#include -#include -#include - -namespace xlslib_core -{ - - /* -****************************** -CBinFile class declaration -****************************** -*/ - -#ifdef XLS_PHP - typedef int (*write_fptr_t)(const char *str, unsigned int str_length); -#endif - - class CBinFile - { - private: - int write_service(const char *buffer, size_t size); - static const int STROKE_CHUNK_SIZE; - public: - CBinFile(); - CBinFile(const std::string& name); - ~CBinFile(); - - - int Open(const std::string& name); - int Close(void); - int Write ( unsigned8_t * data, unsigned32_t size ); - int Write (CUnit& data_unit ); - - int WriteByte(unsigned8_t byte); - int WriteUnsigned16(unsigned16_t data); - int WriteUnsigned32(unsigned32_t data); - int WriteSigned16(signed16_t data); - int WriteSigned32(signed32_t data); - int WriteByteArray(const unsigned8_t *data, size_t size); - int SerializeFixedArray(const unsigned8_t data, unsigned32_t size); - - unsigned32_t Position(); // debugging, position of stream - -#ifdef XLS_PHP - void SetStroke(){ - is_stroke= true; - } - void UnSetStroke(){ - is_stroke= false; - } -#endif - - protected: - std::ofstream m_File; -#ifdef XLS_PHP - write_fptr_t write_fptr; - bool is_stroke; -#endif - - }; - -} - -#endif //BINFILE_H - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: binfile.h,v $ - * Revision 1.2 2008/10/25 18:39:53 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:43 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/ole/oledoc.h b/uppdev/XLS/ole/oledoc.h deleted file mode 100644 index 289bb44cd..000000000 --- a/uppdev/XLS/ole/oledoc.h +++ /dev/null @@ -1,172 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/oledoc/oledoc.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:53 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef OLEDOC_H -#define OLEDOC_H - -#include -#include - -#include -#include -#include - -namespace xlslib_core -{ - -#define HEADPOS_ID ((unsigned16_t)(0x00)) -#define HEADPOS_UK1 ((unsigned16_t)(0x08)) -#define HEADPOS_UK2 ((unsigned16_t)(0x0c)) -#define HEADPOS_UK2b ((unsigned16_t)(0x10)) /* According to the Excel sample... but undocummented */ -#define HEADPOS_UK3 ((unsigned16_t)(0x14)) -#define HEADPOS_UK4 ((unsigned16_t)(0x18)) -#define HEADPOS_UK5 ((unsigned16_t)(0x1a)) -#define HEADPOS_UK6 ((unsigned16_t)(0x1c)) -#define HEADPOS_LOG2_BIGBLOCK ((unsigned16_t)(0x1e)) -#define HEADPOS_LOG2_SMALLBLOCK ((unsigned16_t)(0x20)) -#define HEADPOS_UK7 ((unsigned16_t)(0x24)) -#define HEADPOS_UK8 ((unsigned16_t)(0x28)) -#define HEADPOS_BAT_COUNT ((unsigned16_t)(0x2c)) -#define HEADPOS_PROPERTIES_SB ((unsigned16_t)(0x30)) -#define HEADPOS_UK9 ((unsigned16_t)(0x34)) -#define HEADPOS_UK10 ((unsigned16_t)(0x38)) -#define HEADPOS_SBAT_COUNT ((unsigned16_t)(0x40)) -#define HEADPOS_SBAT_START ((unsigned16_t)(0x3c)) -#define HEADPOS_XBAT_START ((unsigned16_t)(0x44)) -#define HEADPOS_XBAT_COUNT ((unsigned16_t)(0x48)) -#define HEADPOS_BAT_ARRAY ((unsigned16_t)(0x4c)) - - -#define HEADVAL_DFLT_NOTUSED ((unsigned8_t) (0xff) ) -#define HEADVAL_DFLT_UK1 ((signed32_t) (0x00) ) -#define HEADVAL_DFLT_UK2 ((signed32_t) (0x00) ) -#define HEADVAL_DFLT_UK2b ((signed32_t) (0x00) )/* According to the Excel sample... but undocummented */ -#define HEADVAL_DFLT_UK3 ((signed32_t) (0x00) ) -#define HEADVAL_DFLT_UK4 ((signed16_t) (0x3e) )/*POIFS documentations says 0x3b... let's stick with the Excel sample ...*/ -#define HEADVAL_DFLT_UK5 ((signed16_t) (0x03) ) -#define HEADVAL_DFLT_UK6 ((signed16_t) (-2) ) -#define HEADVAL_DFLT_UK7 ((signed32_t) (0x00) ) -#define HEADVAL_DFLT_UK8 ((signed32_t) (0x00) ) -#define HEADVAL_DFLT_UK9 ((signed32_t) (0x00) ) -#define HEADVAL_DFLT_UK10 ((signed32_t) (0x1000)) - - -#define HEADVAL_DFLT_LOG2_BIGBLOCK ((signed16_t)(9)) -#define HEADVAL_DFLT_LOG2_SMALLBLOCK ((signed32_t)(6)) -#define HEADVAL_DFLT_BATCOUNT ((signed32_t)(0) ) -#define HEADVAL_DFLT_PROPERTIES_SB ((signed32_t)(-2) ) -#define HEADVAL_DFLT_SBAT_START ((signed32_t)(-2) ) -#define HEADVAL_DFLT_SBAT_COUNT ((signed32_t)(0) ) //POIFS says it should be 1 ... let's stick to M$ -#define HEADVAL_DFLT_XBAT_START ((signed32_t)(-2) ) -#define HEADVAL_DFLT_XBAT_COUNT ((signed32_t)(0) ) -// #define HEADVAL_DFLT_BAT_ARRAY /* Cannot have a default value */ - -#define HEAD_SIZE BIG_BLOCK_SIZE -#define HEAD_ID_SZ (0x08) - -#define BAT_NOT_USED_BYTE ((unsigned8_t)(0xff)) // could be char is not signed -#define BAT_NOT_USED ((signed32_t)(-1)) -#define BAT_END_CHAIN ((signed32_t)(-2)) -#define BAT_SELF_PLACE ((signed32_t)(-3)) -#define BAT_MSAT_PLACE ((signed32_t)(-4)) - -#define BAT_ENTRIES_PER_BLOCK (BIG_BLOCK_SIZE/4) // BAT blocks are filled - no pointers -#define BAT_BLOCKS_PER_MSAT_BLOCK (BAT_ENTRIES_PER_BLOCK - 1) // pointer to next, or final terminator -#define HEADER_SAT_SIZE 109 - - /* -****************************** -COleFile class declaration -****************************** -*/ - // Block allocation strategy. Within the OLE header are 109 slots for BAT Sectors. - // But, when the file gets big, you run out (127 sectors in each BAT Sector). So, - // the 110th BAT has to go into a special block dedicated to hold these. One additional - // block gets you 127 more BAT entries, and so forth. - // - typedef struct { - unsigned32_t bat_entries; // total number of entries - unsigned32_t _bat_entries; // debug - count'm - unsigned32_t bat_count; // total number of sectors used for real data - unsigned32_t _bat_count; // debug - count'm - unsigned32_t msat_count; // total number of additional Master Sector Allocations Blocks (each hold 127) - unsigned32_t header_bat_count; // first 109 used - unsigned32_t extra_bat_count; // in addition to first 109 - unsigned32_t header_fill; // padding in main header only! - unsigned32_t extra_fill; // padding in last MSAT! - } blocks, *blocksP; - - class COleDoc: public CBinFile, public COleFileSystem - { - private: - int DumpHeader(blocks bks, unsigned32_t total_data_size); - int DumpData(void); - int DumpDepots(blocks bks); - int DumpFileSystem(void); - - signed16_t GetUnicodeName(const char* name, char** ppname_unicode); - int DumpNode(COleProp& node); - - blocks GetBATCount(); - - - static const unsigned8_t OLE_FILETYPE[]; - - - protected: - - - - public: - COleDoc(); - //COleDoc(const string& file_name); - ~COleDoc(); - - int DumpOleFile(); - }; - -} - -#endif //OLEDOC_H - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: oledoc.h,v $ - * Revision 1.2 2008/10/25 18:39:53 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:43 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/ole/olefs.h b/uppdev/XLS/ole/olefs.h deleted file mode 100644 index 09646776e..000000000 --- a/uppdev/XLS/ole/olefs.h +++ /dev/null @@ -1,104 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/oledoc/olefs.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:53 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#ifndef OLEFS_H -#define OLEFS_H - -#include -#include - -#include -#include - -namespace xlslib_core -{ - -#define FS_NO_ERRORS ((int)0) -#define FS_INVALID_PATH ((int)-1) -#define FS_NODE_ALREADY_EXISTS ((int)-2) -#define FS_NODE_NOT_A_DIRECTORY ((int)-3) - - - /* -*********************************** -COleFileSystem class declaration -*********************************** -*/ - class COleFileSystem - { - private: - - public: - COleProp m_RootEntry; /// temporally public (for debugging) - - int GetNode(std::string const &path, Tree_Level_Itor_t& node); - - int AddDirectory(std::string const &dir_path); - int AddFile(std::string const &dir_path, CDataStorage* pdata); - - int AddNode(COleProp* base_node, StringList_t& path_list); - int SearchNode(COleProp* base_node, StringList_t& path_list, Tree_Level_Itor_t& node_level); - - - void GetAllNodesList(NodeList_t& node_list, COleProp* base_node); - void GetAllNodes(NodeList_t& node_list); - void SortList(NodeList_t& node_list); - - - signed32_t m_nProperty_Count; - - COleProp& GetRootEntry(); - unsigned32_t GetTotalDataSize(); - unsigned32_t GetNumDataFiles(); - - public: - COleFileSystem(); - ~COleFileSystem(); - - }; - -} -#endif //OLEFS_H - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: olefs.h,v $ - * Revision 1.2 2008/10/25 18:39:53 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:43 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/ole/oleprop.h b/uppdev/XLS/ole/oleprop.h deleted file mode 100644 index 53ae6519a..000000000 --- a/uppdev/XLS/ole/oleprop.h +++ /dev/null @@ -1,165 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/oledoc/oleprop.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:53 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef OLEPROP_H -#define OLEPROP_H - -#include -#include - -#include -#include -#include - -namespace xlslib_core -{ - - class COleProp; - - typedef std::list Tree_Level_List_t; - typedef Tree_Level_List_t::iterator Tree_Level_Itor_t; - - - typedef std::list NodeList_t; - typedef NodeList_t::iterator NodeList_Itor_t; - - - /* -****************************** -COleProp class declaration -****************************** -*/ - class COleProp - { - protected: - std::string m_sName; - unsigned16_t m_nNameSize; - unsigned8_t m_nPropType; - unsigned8_t m_nNodeColor; - - signed32_t m_nPrevPropIndex; - signed32_t m_nNextPropIndex; - signed32_t m_nChildPropIndex; - - signed32_t m_nTSCreatedSeconds; - signed32_t m_nTSCreatedDays; - signed32_t m_nTSModifiedSeconds; - signed32_t m_nTSModifiedDays; - - signed32_t m_nStartBlock; - signed32_t m_nSize; - - // The following set of attributes are not part of the definition of - // an OleDoc's property: - - CDataStorage* m_pData; - signed32_t m_nIndex; - - public: - Tree_Level_List_t m_Child_List; - - COleProp(); - COleProp(signed32_t node_index, - std::string name, - CDataStorage* data = NULL); - ~COleProp(); - - - - - int Init(signed32_t node_index, - std::string name, - CDataStorage* data = NULL); - - - int SetName(std::string name); - std::string GetName(void); - - int SetIndex(signed32_t newindex); - signed32_t GetIndex(void); - - int SetSize(signed32_t size); - signed32_t GetSize(void); - - int SetType(unsigned8_t newtype); - unsigned8_t GetType(void); - - int SetColor(unsigned8_t newcolor); - unsigned8_t GetColor(void); - - int SetPreviousIndex(signed32_t prev); - signed32_t GetPreviousIndex(void); - - int SetNextIndex(signed32_t next); - signed32_t GetNextIndex(void); - - int SetChildIndex(signed32_t child); - signed32_t GetChildIndex(void); - - int SetStartBlock(signed32_t sb); - signed32_t GetStartBlock(void); - - - void SetDataPointer(CDataStorage* pdata); - CDataStorage* GetDataPointer(void); - - - void SetCreatedSecs(signed32_t sec1); - signed32_t GetCreatedSecs(void); - void SetCreatedDays(signed32_t day1); - signed32_t GetCreatedDays(void); - - void SetModifiedSecs(signed32_t sec2); - signed32_t GetModifiedSecs(void); - void SetModifiedDays(signed32_t day2); - signed32_t GetModifiedDays(void); - - - }; - -} - - -#endif //OLEPROP_H - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: oleprop.h,v $ - * Revision 1.2 2008/10/25 18:39:53 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:43 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/oledoc.cpp b/uppdev/XLS/oledoc.cpp deleted file mode 100644 index 8f31e0dd2..000000000 --- a/uppdev/XLS/oledoc.cpp +++ /dev/null @@ -1,547 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/oledoc/oledoc.cpp,v $ - * $Revision: 1.3 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:53 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#include -#include - -using namespace std; -using namespace xlslib_core; - -/* -*********************************** -COleDoc class implementation -*********************************** -*/ -const unsigned8_t COleDoc::OLE_FILETYPE[] = -{ 0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1}; - - -COleDoc::COleDoc() -{ - -} -/* - COleDoc::COleDoc(const string& file_name) - { - Open(file_name); - - } -*/ - -COleDoc::~COleDoc() -{ - -} - -/* -*********************************** -*********************************** -*/ - -int COleDoc::DumpHeader(blocks bks, unsigned32_t total_data_size) -{ - unsigned32_t i, total_data_blocks, sectorID, msatID; - int errcode = NO_ERRORS; - - total_data_blocks = total_data_size/BIG_BLOCK_SIZE; - -#if OLE_DEBUG - fprintf(stderr, "dataBlocks=%u\n", total_data_blocks), fflush(stderr); -#endif - // [00]FILETYPE - WriteByteArray(COleDoc::OLE_FILETYPE, /*(unsigned32_t)*/sizeof(COleDoc::OLE_FILETYPE)); - // [08]UK1 - WriteSigned32(HEADVAL_DFLT_UK1); - // [0c]UK2 - WriteSigned32(HEADVAL_DFLT_UK2); - // [10]UK2b - WriteSigned32(HEADVAL_DFLT_UK2b); - // [14]UK3 - WriteSigned32(HEADVAL_DFLT_UK3); - // [18]UK4 - WriteSigned16(HEADVAL_DFLT_UK4); - // [1a]UK5 - WriteSigned16(HEADVAL_DFLT_UK5); - // [1c]UK6 - WriteSigned16(HEADVAL_DFLT_UK6); - // [1e]LOG_2_BIG_BLOCK - WriteSigned16(HEADVAL_DFLT_LOG2_BIGBLOCK); - // [20]LOG_2_SMALL_BLOCK - WriteSigned32(HEADVAL_DFLT_LOG2_SMALLBLOCK); - // [24]UK7 - WriteSigned32(HEADVAL_DFLT_UK7); - // [28]UK8 - WriteSigned32(HEADVAL_DFLT_UK8); - - // [2c] BAT_COUNT (BBDEPOT NUM BLOCKS) - WriteUnsigned32(bks.bat_count); - - //[30] PROPERTIES_START_BLOCK - // Since the big block depot will go immediately after the data, I need - // to know the size of the data and the size of the BAT in blocks (prev) - WriteUnsigned32(bks.msat_count+total_data_blocks+bks.bat_count); -#if OLE_DEBUG - fprintf(stderr, "HEADER says directory at %d\n", bks.msat_count+total_data_blocks+bks.bat_count); -#endif - // [34] UK9 - WriteSigned32(HEADVAL_DFLT_UK9); - // [38] UK10 - WriteSigned32(HEADVAL_DFLT_UK10); - - // [3c] SBAT_START - // No small blocks will be used, so this is set to the default empty value - WriteSigned32(HEADVAL_DFLT_SBAT_START); - - // [40] SBAT_BLOCKCOUNT_NUMBER - // Use the default value - WriteSigned32(HEADVAL_DFLT_SBAT_COUNT); - - // [44] XBAT_START - // we will use first and possibly additional blocks for large files - WriteSigned32(bks.msat_count ? 0 : HEADVAL_DFLT_XBAT_START); -#if OLE_DEBUG - fprintf(stderr, "xbatStart=%d\n", bks.msat_count ? 0 : HEADVAL_DFLT_XBAT_START), fflush(stderr); -#endif - - // [48] XBAT_COUNT - WriteUnsigned32(bks.msat_count); // was HEADVAL_DFLT_XBAT_COUNT (0) -#if OLE_DEBUG - fprintf(stderr, "msat_count=%d\n", bks.msat_count), fflush(stderr); -#endif - - // [4C] BAT_ARRAY - // The BAT_ARRAY shall be calculated from the number of BAT blocks and their position - - // The additional blocks, if needed, are directly below the header block, so we can write - // them out contiguously. The special conditions are: - // * for each MSAT block, the last entry needs to be a pointer to the next block - // * the fill is -1 for all unused entries - // * if there are MSAT blocks, the very last entry in the last block is a special marker - // first sector ID - sectorID = bks.msat_count + total_data_blocks; - for(i=0; iGetType() == PTYPE_FILE) - { - for(DataList_Itor_t j = (*i)->GetDataPointer()->begin(); - j != (*i)->GetDataPointer()->end(); j++) - { - WriteByteArray((*j)->GetBuffer(), (*j)->GetDataSize()); - } - } - } - - return errcode; -} - -/* -*********************************** -*********************************** -*/ -int COleDoc::DumpDepots(blocks bks) -{ - int errcode = NO_ERRORS; - - NodeList_t node_list; - GetAllNodes(node_list); - unsigned32_t bat_index; - - bat_index = 0; - - // tells Excel that these are used by the MSAT - for(unsigned32_t i=0; iSetStartBlock(bat_index); - // Write the chain for this node element - data_size = (*node)->GetDataPointer()->GetDataSize(); - chain_len = data_size/BIG_BLOCK_SIZE - 1; -#if OLE_DEBUG - fprintf(stderr, "NODE[%d]: start_block=%d data=%d Sectors= %d\n", foo, bat_index, chain_len + 1 /* directory_terminator */); -#endif - for(unsigned32_t i = 0; i < chain_len; i++) - { - WriteSigned32(++bat_index); - ++bks._bat_entries; - } - - // Set the terminator number - WriteSigned32(BAT_END_CHAIN); - ++bat_index; - ++bks._bat_entries; - } - -#if OLE_DEBUG - fprintf(stderr, "BAT_SELF_PLACE=%d -> %d TOTAL=%d\n", bat_index+1, bat_index+1+bks.bat_count+1, bks.bat_count); -#endif - // Write the -3 number for every index in the BAT that references to some BAT block (uh!?) - for(unsigned32_t i=0; i bat_block_capacity || bat_num_blocks != bat_blocks_needed) { - bat_num_blocks = bat_blocks_needed; - if(bat_num_blocks > HEADER_SAT_SIZE) { - msat_bats = bat_num_blocks - HEADER_SAT_SIZE; - msat_blocks = msat_bats/BAT_BLOCKS_PER_MSAT_BLOCK; - if(msat_bats % BAT_BLOCKS_PER_MSAT_BLOCK) ++msat_blocks; - } - - bat_num_entries = msat_blocks + data_bat_entries + bat_num_blocks + dir_bat_entries; // bat_bat_entries - - // based on what we know now, this is what we need - bat_blocks_needed = bat_num_entries/BAT_ENTRIES_PER_BLOCK; - if(bat_num_entries % BAT_ENTRIES_PER_BLOCK) ++bat_blocks_needed; - - // number of slots available - bat_block_capacity = HEADER_SAT_SIZE + BAT_BLOCKS_PER_MSAT_BLOCK*msat_blocks; -#if OLE_DEBUG - fprintf(stderr, "bat_blocks=%d capacity=%d needed=%d\n", bat_num_blocks, bat_block_capacity, bat_blocks_needed); -#endif - } - - if(bat_num_blocks > HEADER_SAT_SIZE) { - extra_bats = bat_num_blocks - HEADER_SAT_SIZE; - - bks.msat_count = msat_blocks; - bks.header_bat_count = HEADER_SAT_SIZE; - bks.extra_bat_count = extra_bats; - - last_block_extras = extra_bats % BAT_BLOCKS_PER_MSAT_BLOCK; - if(last_block_extras) { - bks.extra_fill = BAT_BLOCKS_PER_MSAT_BLOCK - last_block_extras; - } - } else { - bks.header_bat_count = bat_num_blocks; - bks.header_fill = HEADER_SAT_SIZE - bat_num_blocks; - } - bks.bat_entries = bat_num_entries; - bks.bat_count = bat_num_blocks; - -#if OLE_DEBUG - fprintf(stderr, "entries=%u bats=%d msats=%d headerBats=%d extraBats=%d headFill=%d extraFill=%d\n", bks.bat_entries, - bks.bat_count, bks.msat_count, bks.header_bat_count, bks.extra_bat_count, bks.header_fill, bks.extra_fill); -#endif - - return bks; -} - - -/* -*********************************** -*********************************** -*/ -// NOTE: name_unicode has to be deleted after this function finishes. -// Ideally, this function should be implemented as part of a std::string -// derived class, so the array would be deleted automatically - - -signed16_t COleDoc::GetUnicodeName(const char* name, char** ppname_unicode) -{ - unsigned16_t name_size = strlen(name); - if(name_size > PROPERTY_MAX_NAME_LENGTH) - name_size = PROPERTY_MAX_NAME_LENGTH; - - unsigned8_t size_unicode = (name_size+1)*2; - - if(*ppname_unicode != NULL) delete[] *ppname_unicode; - *ppname_unicode = (char*)new unsigned8_t[size_unicode]; - memset(*ppname_unicode, 0x00, size_unicode); - - for(int i=0; i<(size_unicode/2-1); i++) - (*ppname_unicode)[2*i] = name[i]; - - return size_unicode; -} - - - -/* -*********************************** -*********************************** -*/ -int COleDoc::DumpNode(COleProp& node) -{ - - int errcode = NO_ERRORS; - char* name_unicode = NULL; - - // Get the unicode name and its size - signed16_t size_name = GetUnicodeName(node.GetName().c_str(), &name_unicode); - - // [00] PROPERTY_NAME - WriteByteArray((const unsigned8_t*)name_unicode, size_name); - - // Fill the rest of the name field with 0x00 - SerializeFixedArray(PROPERTY_DFLT_NOTUSED, PPTPOS_NAMELENGTH - size_name); - - // [40] NAME_SIZE - WriteSigned16(size_name); - - // [42] PROPERTY_TYPE - WriteByte(node.GetType()); - - // [43] NODE_COLOR - WriteByte(node.GetColor()); - - // [44] PREVIOUS_PROP - WriteSigned32(node.GetPreviousIndex()); - // [48] NEXT_PROP - WriteSigned32(node.GetNextIndex()); - // [4c] CHILD_PROP - WriteSigned32(node.GetChildIndex()); - - // Fill empty block - SerializeFixedArray(PROPERTY_DFLT_NOTUSED, (PPTPOS_SECS1 - PPTPOS_UNUSED_EMPTY0)); - - //[64]...[70] - // SECONDS_1, DAYS_2, SECONDS_2, DAYS_2 - WriteSigned32(node.GetCreatedSecs()); - WriteSigned32(node.GetCreatedDays()); - WriteSigned32(node.GetModifiedDays()); - WriteSigned32(node.GetModifiedSecs()); - - // [74] START_BLOCK -#if OLE_DEBUG - fprintf(stderr, "START_BLOCK_1=%d\n", node.GetStartBlock() ); -#endif - WriteSigned32(node.GetStartBlock()); - - // [78] SIZE - if(node.GetType() == PTYPE_FILE) - WriteSigned32(node.GetSize()); - else - WriteSigned32(0); - - // A unused space: - WriteSigned32(PROPERTY_DFLT_NOTUSED); - - delete[] name_unicode; - name_unicode = NULL; - - return errcode; - -} - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: oledoc.cpp,v $ - * Revision 1.3 2008/10/25 18:39:53 dhoerl - * 2008 - * - * Revision 1.2 2004/09/01 00:47:04 darioglz - * + Modified to gain independence of target - * - * Revision 1.1.1.1 2004/08/27 16:31:43 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/olefs.cpp b/uppdev/XLS/olefs.cpp deleted file mode 100644 index 1594c96aa..000000000 --- a/uppdev/XLS/olefs.cpp +++ /dev/null @@ -1,523 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/oledoc/olefs.cpp,v $ - * $Revision: 1.3 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:53 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#include -#include -#include - -using namespace std; -using namespace xlslib_core; - -/* -*********************************** -COleFileSystem class Implementation -*********************************** -*/ - - - -COleFileSystem::COleFileSystem() - :m_RootEntry((signed32_t)0,string("Root Entry")), - m_nProperty_Count(0) -{ - - m_RootEntry.SetType(PTYPE_ROOT); - m_RootEntry.SetSize(0); - m_RootEntry.SetPreviousIndex( PLINK_EMPTY); - m_RootEntry.SetNextIndex( PLINK_EMPTY); - m_RootEntry.SetChildIndex( PLINK_EMPTY); - m_RootEntry.SetStartBlock( PBLOCK_END); - m_RootEntry.SetColor(PROPERTY_COLOR_NODE_BLACK); - m_RootEntry.SetDataPointer(NULL); - - - m_RootEntry.SetCreatedSecs(PPT_DFLT_SECS1); - m_RootEntry.SetCreatedDays(PPT_DFLT_DAYS1); - m_RootEntry.SetModifiedSecs(PPT_DFLT_SECS2); - m_RootEntry.SetModifiedDays(PPT_DFLT_DAYS2); - - - -} - -COleFileSystem::~COleFileSystem() -{ - -} - -/* -*********************************** -*********************************** -*/ - -int COleFileSystem::GetNode(string const &path, Tree_Level_Itor_t& node) -{ - - StringList_t path_list; - stringtok(path_list, path, "/"); - - int retval = SearchNode(&m_RootEntry, path_list, node); - - // Delete dinamically created strings of path_list - // anyway the list is deleted iside SearchNode... - for (StringListItor_t pl = path_list.begin(); pl != path_list.end(); pl++) - delete *pl; - - return retval; -} - -/* -*********************************** -*********************************** -*/ - -int COleFileSystem::SearchNode(COleProp* base_node, StringList_t& path_list, Tree_Level_Itor_t& node_level) -{ - int errcode = FS_INVALID_PATH; - - if(!((base_node->m_Child_List).empty())) - { - for (StringListItor_t node_name = path_list.begin(); node_name != path_list.end(); ++node_name) - for(node_level = (base_node->m_Child_List).begin(); node_level != (base_node->m_Child_List).end(); node_level++) - { - if (**node_name == (*node_level)->GetName()) - { - - delete path_list.front(); - path_list.pop_front(); // Remove the found element from path - if(path_list.empty()) // If it was the last element return it - { - - return FS_NO_ERRORS; - } - else - { // Recursively continue the search - return SearchNode(*node_level, path_list, node_level); - } - } - } - } - - return errcode; - - - -} - - -/* -*********************************** -*********************************** -*/ - -int COleFileSystem::AddDirectory(string const &dir_path) -{ - int errcode = NO_ERRORS; - StringList_t path_list; - - stringtok(path_list, dir_path, "/"); - errcode = AddNode(&m_RootEntry, path_list); - - // Delete dinamically created strings of path_list - for (StringListItor_t pl = path_list.begin(); pl != path_list.end(); pl++) - delete *pl; - - if(errcode == FS_NO_ERRORS) - { - Tree_Level_Itor_t newnode; - GetNode(dir_path, newnode); - (*newnode)->SetChildIndex(PLINK_EMPTY); - (*newnode)->SetType(PTYPE_DIRECTORY); - (*newnode)->SetSize(0); - (*newnode)->SetColor(PROPERTY_COLOR_NODE_BLACK); - (*newnode)->SetDataPointer(NULL); - - (*newnode)->SetCreatedSecs(PPT_DFLT_SECS1); - (*newnode)->SetCreatedDays(PPT_DFLT_DAYS1); - (*newnode)->SetModifiedSecs(PPT_DFLT_SECS2); - (*newnode)->SetModifiedDays(PPT_DFLT_DAYS2); - - } - - - - return errcode; -} - - -/* -*********************************** -*********************************** -*/ -#define MIN_DATA_SIZE (0x1000) - -// TODO: Change the DataStorage pass-argument - -int COleFileSystem::AddFile(string const &dir_path, CDataStorage* pdata) -{ - int errcode = NO_ERRORS; - StringList_t path_list; - - - // NOTE: Token analysis can be done inside of AddNode: - stringtok(path_list, dir_path, "/"); - errcode = AddNode(&m_RootEntry, path_list); - - // Delete dinamically created strings of path_list - for (StringListItor_t pl = path_list.begin(); pl != path_list.end(); pl++) - delete *pl; - - - if(errcode == FS_NO_ERRORS) - { - Tree_Level_Itor_t newnode; - GetNode(dir_path, newnode); - (*newnode)->SetType(PTYPE_FILE); - (*newnode)->SetChildIndex(PLINK_EMPTY); - - - // Calculate the trail data size needed to complete a BIG_BLOCK - unsigned32_t trail_size = (pdata->GetDataSize() % BIG_BLOCK_SIZE)? - (BIG_BLOCK_SIZE - (pdata->GetDataSize() % BIG_BLOCK_SIZE)):0; - - // This library won't use Small Blocks, so all data elements shall be >0x1000 - if ((trail_size + pdata->GetDataSize()) < MIN_DATA_SIZE) - { - trail_size = MIN_DATA_SIZE - pdata->GetDataSize(); - (*newnode)->SetSize(MIN_DATA_SIZE); - } - else - { - // The size stored in the node is the actual size of the data (not the filled-to-bigblock one) - (*newnode)->SetSize(pdata->GetDataSize() + trail_size); - } - - // create the trail data unit. - CUnit* ptraildata = new CUnit; - ptraildata->AddFixedDataArray(0x00, trail_size); - (*pdata) += ptraildata; - - (*newnode)->SetDataPointer(pdata); - - (*newnode)->SetColor(PROPERTY_COLOR_NODE_BLACK); - (*newnode)->SetCreatedSecs(PPT_DFLT_SECS1); - (*newnode)->SetCreatedDays(PPT_DFLT_DAYS1); - (*newnode)->SetModifiedSecs(PPT_DFLT_SECS2); - (*newnode)->SetModifiedDays(PPT_DFLT_DAYS2); - - - } - - - - return errcode; -} - -/* -*********************************** -*********************************** -*/ - -/* - -Some special adding-node cases: - -- The path to reach the node doesn't exist -- The the node already exists - -*/ - -int COleFileSystem::AddNode(COleProp* base_node, StringList_t& path_list) -{ - - int errcode; - - if(!(base_node->m_Child_List).empty()) - { - for(Tree_Level_Itor_t node_child = (base_node->m_Child_List).begin(); - node_child != (base_node->m_Child_List).end(); node_child++) - { - if((*node_child)->GetName() == **path_list.begin()) - { - delete path_list.front(); - path_list.pop_front(); // Remove the found element from path - return AddNode(*node_child, path_list); - } - } - } - //if the path element wasn't found, the program gets here - //... and we have two possible reasons: - // 1. The path isn't correct, so no node is created and an error msg have to be returned - // (one of the intermediate nodes is empty or doesn't exist: there are more than one path elements left) - // 2. The node is the new one we want to create. - - - // if the size of the path is 0, the node already existed - if(path_list.size() != 1) - { - if (path_list.size() == 0) - errcode = FS_NODE_ALREADY_EXISTS; - else - errcode = FS_INVALID_PATH; - } - else - { - unsigned8_t base_node_type = base_node->GetType(); - if(base_node_type == PTYPE_DIRECTORY || base_node_type == PTYPE_ROOT) - { - -#if 0 - COleProp newnode(++m_nProperty_Count, *path_list.begin()); - - bool was_firstborn = false; - - if((base_node->m_Child_List).empty()) //if this is the first child of the node... - { - base_node->SetChildIndex(m_nProperty_Count); // the new one is the child - newnode.SetPreviousIndex(PLINK_EMPTY); // there is no previous - was_firstborn = true;// mark for later - } - - // The next-index of the new node shall to point to nowhere - newnode.SetNextIndex(PLINK_EMPTY); - (base_node->m_Child_List).push_back(newnode); - - // Get the just added node - Tree_Level_Itor_t nodeadded = (base_node->m_Child_List).end(); - nodeadded--; - - // Get the previous to the just added node - Tree_Level_Itor_t prev_to_nodeadded = (base_node->m_Child_List).end(); - prev_to_nodeadded--;prev_to_nodeadded--; - - - if(!was_firstborn) - nodeadded->SetPreviousIndex(prev_to_nodeadded->GetIndex()); - - // Set the next-index of the previous node to point to the newone - prev_to_nodeadded->SetNextIndex(nodeadded->GetIndex()); - -#else -//////////// - COleProp* newnode = new COleProp(++m_nProperty_Count, **path_list.begin()); - size_t childnum = (base_node->m_Child_List).size(); - - if(!(base_node->m_Child_List).empty()) //if this is the first child of the node... - { - Tree_Level_Itor_t lastnode = (base_node->m_Child_List).end(); - lastnode--; - - if(1 == childnum) - { - base_node->SetChildIndex(newnode->GetIndex()); // The 2nd child is the entry always - newnode->SetPreviousIndex((*lastnode)->GetIndex()); // The previous is the only element of the list - } - else - { - (*lastnode)->SetNextIndex(newnode->GetIndex()); - newnode->SetPreviousIndex(PLINK_EMPTY); // there is no previous - } - newnode->SetNextIndex(PLINK_EMPTY); // there is no next - newnode->SetChildIndex(PLINK_EMPTY); // there is no child - - } - else - { - base_node->SetChildIndex(m_nProperty_Count); // the new one is the child - newnode->SetPreviousIndex(PLINK_EMPTY); // there is no previous - newnode->SetNextIndex(PLINK_EMPTY); // there is no next - newnode->SetChildIndex(PLINK_EMPTY); // there is no child - } - - - (base_node->m_Child_List).push_back(newnode); - -#endif - errcode = FS_NO_ERRORS; - } - else - { - errcode = FS_NODE_NOT_A_DIRECTORY; - } - } - - return errcode; - -} - -/* -*********************************** -*********************************** -*/ - -void COleFileSystem::GetAllNodes(NodeList_t& node_list) -{ - - GetAllNodesList(node_list, &m_RootEntry); - SortList(node_list); - -} -/* -*********************************** -*********************************** -*/ - - -void COleFileSystem::GetAllNodesList(NodeList_t& node_list, COleProp* base_node) -{ - - if(!(base_node->m_Child_List).empty()) - { - for(Tree_Level_Itor_t child_node = (base_node->m_Child_List).begin(); - child_node != (base_node->m_Child_List).end(); child_node++ ) - { - GetAllNodesList(node_list, (*child_node)); - node_list.push_back((*child_node)); - } - - } - else - { - return; - } -} - - -/* -*********************************** -An horribly inefficient sorting routine.... -... until I find the way of using the list::sort() function so -I can specify the sorting criteria (for this case, a member variable -of the elements of the list. -*********************************** -*/ - -void COleFileSystem::SortList(NodeList_t& node_list) -{ - NodeList_t node_list_shadow = node_list; - - node_list.erase(node_list.begin(), node_list.end()); - - NodeList_Itor_t i; - int index = 1; - - - do{ - for(i = node_list_shadow.begin(); i != node_list_shadow.end(); i++) - { - if((*i)->GetIndex() == index) - { - node_list.push_back(*i); - node_list_shadow.erase(i); - index++; - break; - } - } - - }while(!node_list_shadow.empty()); -} - - -/* -*********************************** -*********************************** -*/ - -unsigned32_t COleFileSystem::GetTotalDataSize() -{ - - NodeList_t node_list; - GetAllNodes(node_list); - unsigned32_t total_size = 0; - - for(NodeList_Itor_t i = node_list.begin(); i != node_list.end(); i++) - { - if((*i)->GetType() == PTYPE_FILE) - total_size += (*i)->GetDataPointer()->GetDataSize(); - - } - - return total_size; - -} - - -/* -*********************************** -*********************************** -*/ - -unsigned32_t COleFileSystem::GetNumDataFiles() -{ - NodeList_t node_list; - GetAllNodes(node_list); - unsigned32_t total_files = 0; - - for(NodeList_Itor_t i = node_list.begin(); i != node_list.end(); i++) - { - if((*i)->GetType() == PTYPE_FILE) - total_files ++; - - } - - return total_files; - - - -} - -/* -*********************************** -*********************************** -*/ - -COleProp& COleFileSystem::GetRootEntry() -{ - return m_RootEntry; -} - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: olefs.cpp,v $ - * Revision 1.3 2008/10/25 18:39:53 dhoerl - * 2008 - * - * Revision 1.2 2004/09/01 00:47:04 darioglz - * + Modified to gain independence of target - * - * Revision 1.1.1.1 2004/08/27 16:31:43 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/oleprop.cpp b/uppdev/XLS/oleprop.cpp deleted file mode 100644 index c4d882738..000000000 --- a/uppdev/XLS/oleprop.cpp +++ /dev/null @@ -1,412 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/oledoc/oleprop.cpp,v $ - * $Revision: 1.3 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:53 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#include - -/* -*********************************** -COleProp class Implementation -*********************************** -*/ - -using namespace std; -using namespace xlslib_core; - - - -COleProp::COleProp() - : m_pData(NULL) -{ - -} - -/* -*********************************** -*********************************** -*/ - -COleProp::COleProp(signed32_t node_index, - string name, - CDataStorage* data) - : m_sName(name), m_pData(data), m_nIndex(node_index) -{ - -} - -COleProp::~COleProp() -{ - - for(Tree_Level_Itor_t chld = m_Child_List.begin(); chld != m_Child_List.end(); chld++) - delete *chld; - - -} - - - -/* -*********************************** -*********************************** -*/ - -int COleProp::Init(signed32_t node_index, - string name, - CDataStorage* data) -{ - int errcode = NO_ERRORS; - - SetName(name); - m_pData = data; - m_nIndex = node_index; - - return errcode; - -} - -/* -*********************************** -*********************************** -*/ - -int COleProp::SetName(string name) -{ - int errcode = NO_ERRORS; - - m_nNameSize = name.size() + 1; - m_sName = name; - - return errcode; -} - -/* -*********************************** -*********************************** -*/ - -string COleProp::GetName(void) -{ - return m_sName; -} - -/* -*********************************** -*********************************** -*/ -int COleProp::SetIndex(signed32_t newindex) -{ - int errcode = NO_ERRORS; - - m_nIndex = newindex; - - return errcode; - -} - -/* -*********************************** -*********************************** -*/ - -signed32_t COleProp::GetIndex(void) -{ - return m_nIndex; -} - -/* -*********************************** -*********************************** -*/ -int COleProp::SetType(unsigned8_t newtype) -{ - int errcode = NO_ERRORS; - - m_nPropType = newtype; - - return errcode; -} - -/* -*********************************** -*********************************** -*/ -unsigned8_t COleProp::GetType(void) -{ - return m_nPropType; -} - -/* -*********************************** -*********************************** -*/ -int COleProp::SetColor(unsigned8_t newcolor) -{ - int errcode = NO_ERRORS; - - m_nNodeColor = newcolor; - - return errcode; - -} - -/* -*********************************** -*********************************** -*/ -unsigned8_t COleProp::GetColor(void) -{ - return m_nNodeColor; -} - -/* -*********************************** -*********************************** -*/ -int COleProp::SetPreviousIndex(signed32_t prev) -{ - int errcode = NO_ERRORS; - - m_nPrevPropIndex = prev; - - return errcode; - -} - -/* -*********************************** -*********************************** -*/ -signed32_t COleProp::GetPreviousIndex(void) -{ - return m_nPrevPropIndex; -} - -/* -*********************************** -*********************************** -*/ -int COleProp::SetNextIndex(signed32_t next) -{ - int errcode = NO_ERRORS; - - m_nNextPropIndex = next; - - return errcode; - -} - -/* -*********************************** -*********************************** -*/ -signed32_t COleProp::GetNextIndex(void) -{ - return m_nNextPropIndex; -} - -/* -*********************************** -*********************************** -*/ -int COleProp::SetChildIndex(signed32_t child) -{ - int errcode = NO_ERRORS; - - m_nChildPropIndex = child; - - return errcode; - -} - -/* -*********************************** -*********************************** -*/ -signed32_t COleProp::GetChildIndex(void) -{ - return m_nChildPropIndex; -} - -int COleProp::SetStartBlock(signed32_t sb) -{ - int errcode = NO_ERRORS; - - m_nStartBlock = sb; - - return errcode; - -} -signed32_t COleProp::GetStartBlock(void) -{ - return m_nStartBlock; -} - -/* -*********************************** -*********************************** -*/ -int COleProp::SetSize(signed32_t size) -{ - int errcode = NO_ERRORS; - - m_nSize = size; - - return errcode; - -} - -/* -*********************************** -*********************************** -*/ - -signed32_t COleProp::GetSize(void) -{ - return m_nSize; -} - -/* -*********************************** -*********************************** -*/ - - -void COleProp::SetDataPointer(CDataStorage* pdata) -{ - - m_pData = pdata; -} - -/* -*********************************** -*********************************** -*/ - -CDataStorage* COleProp::GetDataPointer(void) -{ - return m_pData; -} - - - - -/* -*********************************** -*********************************** -*/ -void COleProp::SetCreatedSecs(signed32_t secs1) -{ - m_nTSCreatedSeconds = secs1; -} -/* -*********************************** -*********************************** -*/ -signed32_t COleProp::GetCreatedSecs(void) -{ - return m_nTSCreatedSeconds; -} - - -/* -*********************************** -*********************************** -*/ -void COleProp::SetCreatedDays(signed32_t days1) -{ - m_nTSCreatedDays = days1; -} - -/* -*********************************** -*********************************** -*/ -signed32_t COleProp::GetCreatedDays(void) -{ - return m_nTSCreatedDays; -} - - -/* -*********************************** -*********************************** -*/ -void COleProp::SetModifiedSecs(signed32_t secs2) -{ - m_nTSModifiedSeconds = secs2; -} - -/* -*********************************** -*********************************** -*/ -signed32_t COleProp::GetModifiedSecs(void) -{ - return m_nTSModifiedSeconds; -} - -/* -*********************************** -*********************************** -*/ - -void COleProp::SetModifiedDays(signed32_t days2) -{ - m_nTSModifiedDays = days2; -} - -/* -*********************************** -*********************************** -*/ -signed32_t COleProp::GetModifiedDays(void) -{ - - return m_nTSModifiedDays; -} - - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: oleprop.cpp,v $ - * Revision 1.3 2008/10/25 18:39:53 dhoerl - * 2008 - * - * Revision 1.2 2004/09/01 00:47:04 darioglz - * + Modified to gain independence of target - * - * Revision 1.1.1.1 2004/08/27 16:31:43 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/overnew.cpp b/uppdev/XLS/overnew.cpp deleted file mode 100644 index 2b4baa584..000000000 --- a/uppdev/XLS/overnew.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/common/overnew.cpp,v $ - * $Revision: 1.3 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:53 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#include - -/******************************************************************** - The new() operator is overloaded only for the PHP_EXTENSION version -********************************************************************/ -#if 0 - - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -#ifdef __cplusplus -} -#endif - -void* operator new(size_t sz) throw (std::bad_alloc) -{ - void* m = emalloc(sz); - if(!m) throw std::bad_alloc(); - return m; -} - -void operator delete(void* m) -{ - efree(m); -} - -void* operator new[](size_t sz) throw (std::bad_alloc) -{ - void* m = emalloc(sz); - if(!m) throw std::bad_alloc(); - return m; -} - -void operator delete[](void* m) -{ - efree(m); -} - -#endif - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: overnew.cpp,v $ - * Revision 1.3 2008/10/25 18:39:53 dhoerl - * 2008 - * - * Revision 1.2 2004/09/01 00:47:04 darioglz - * + Modified to gain independence of target - * - * Revision 1.1.1.1 2004/08/27 16:32:05 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/overnew.h b/uppdev/XLS/overnew.h deleted file mode 100644 index 051584084..000000000 --- a/uppdev/XLS/overnew.h +++ /dev/null @@ -1,71 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/common/overnew.h,v $ - * $Revision: 1.3 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:53 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef OVERNEW_H -#define OVERNEW_H - -#include -#include - -/******************************************************************** - The new() operator is overloaded only for the PHP_EXTENSION version -********************************************************************/ -#if 0 - -#include -#include - -using namespace std; -void* operator new(size_t sz) throw (std::bad_alloc); -void operator delete(void* m); -void* operator new[](size_t sz) throw (std::bad_alloc); -void operator delete[](void* m); - - -#endif -#endif //OVERNEW_H - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: overnew.h,v $ - * Revision 1.3 2008/10/25 18:39:53 dhoerl - * 2008 - * - * Revision 1.2 2004/09/01 00:47:04 darioglz - * + Modified to gain independence of target - * - * Revision 1.1.1.1 2004/08/27 16:32:05 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/range.cpp b/uppdev/XLS/range.cpp deleted file mode 100644 index 1aa3c536d..000000000 --- a/uppdev/XLS/range.cpp +++ /dev/null @@ -1,257 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/range.cpp,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#include - -using namespace std; -using namespace xlslib_core; - - -range::range(unsigned16_t row1, - unsigned16_t col1, - unsigned16_t row2, - unsigned16_t col2, - worksheet* pws, - bool atomic) - : m_Atomic(atomic), m_pWorkSheet(pws) -{ - first_row = row1; - last_row = row2; - first_col = col1; - last_col = col2; -} - - -range::~range() -{ -} - -void range::cellcolor(color_name_t color) -{ - unsigned16_t r,c; - for(r = first_row; r <= last_row; r++) - for(c = first_col; c <= last_col; c++) - { - cell_t* cell = m_pWorkSheet->FindCell(r,c); - cell->fillfgcolor(color); - cell->fillstyle(FILL_SOLID); - - } -} -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - xf_i interface implementation for range class - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#define SET_RANGE_FUNCTION(function, value) \ - { \ - uint16_t r,c; \ - for(r = first_row; r <= last_row; r++) \ - for(c = first_col; c <= last_col; c++) \ - { \ - cell_t* cell = m_pWorkSheet->FindCell(r,c); \ - cell->function(value); \ - } \ - } - -void range::font(font_t* fontidx) -{ - SET_RANGE_FUNCTION(font, fontidx); -/* - int r,c; - for(r = first_row; r <= last_row; r++) - for(c = first_col; c <= last_col; c++) - { - cell_t* cell = m_pWorkSheet->FindCell(r,c); - cell->font(fontidx); - } -*/ -} - -void range::borderstyle(border_side_t side, - border_style_t style, - color_name_t color) -{ - unsigned16_t r,c; - for(r = first_row; r <= last_row; r++) - for(c = first_col; c <= last_col; c++) - { - cell_t* cell = m_pWorkSheet->FindCell(r,c); - cell->borderstyle(side, style, color); - } - -} - -void range::format(format_number_t formatidx) -{ - SET_RANGE_FUNCTION(format,formatidx); -} - -void range::halign(halign_option_t ha_option) -{ - SET_RANGE_FUNCTION(halign,ha_option); -} - -void range::valign(valign_option_t va_option) -{ - SET_RANGE_FUNCTION(valign,va_option); -} -void range::indent(indent_option_t indent_option) -{ - SET_RANGE_FUNCTION(indent,indent_option); -} -void range::orientation(txtori_option_t ori_option) -{ - SET_RANGE_FUNCTION(orientation,ori_option); -} - -void range::fillfgcolor(color_name_t color) -{ - SET_RANGE_FUNCTION(fillfgcolor,color); -} - -void range::fillbgcolor(color_name_t color) -{ - SET_RANGE_FUNCTION(fillbgcolor,color); -} - -void range::fillstyle(fill_option_t fill) -{ - SET_RANGE_FUNCTION(fillstyle,fill); -} - -void range::locked(bool locked_opt) -{ - SET_RANGE_FUNCTION(locked,locked_opt); -} - -void range::hidden(bool hidden_opt) -{ - SET_RANGE_FUNCTION(hidden,hidden_opt); -} - -void range::wrap(bool wrap_opt) -{ - SET_RANGE_FUNCTION(wrap,wrap_opt); -} - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - font_i interface implementation for range class - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -void range::fontname(string fntname) -{ - SET_RANGE_FUNCTION(fontname,fntname); -} - -void range::fontheight(unsigned16_t fntheight) -{ - SET_RANGE_FUNCTION(fontheight,fntheight); -} - -void range::fontbold(boldness_option_t fntboldness) -{ -/* - int r,c; - for(r = first_row; r <= last_row; r++) - for(c = first_col; c <= last_col; c++) - { - cell_t* cell = m_pWorkSheet->FindCell(r,c); - cell->fontbold(fntboldness); - } -*/ - SET_RANGE_FUNCTION(fontbold,fntboldness); -} - -void range::fontunderline(underline_option_t fntunderline) -{ - SET_RANGE_FUNCTION(fontunderline,fntunderline); -} - -void range::fontscript(script_option_t fntscript) -{ - SET_RANGE_FUNCTION(fontscript,fntscript); -} - -void range::fontcolor(color_name_t fntcolor) -{ - SET_RANGE_FUNCTION(fontcolor,fntcolor); -} - -void range::fontattr(unsigned16_t attr) -{ - SET_RANGE_FUNCTION(fontattr,attr); -} - -void range::fontitalic(bool italic) -{ - SET_RANGE_FUNCTION(fontitalic,italic); -} - -void range::fontstrikeout(bool so) -{ - SET_RANGE_FUNCTION(fontstrikeout,so); -} - -void range::fontoutline(bool ol) -{ - SET_RANGE_FUNCTION(fontoutline,ol); -} - -void range::fontshadow(bool sh) -{ - SET_RANGE_FUNCTION(fontshadow,sh); -/* - { - int r,c; - for(r = first_row; r <= last_row; r++) - for(c = first_col; c <= last_col; c++) - { - cell_t* cell = m_pWorkSheet->FindCell(r,c); - cell->fontshadow(sh); - } - } -*/ -} - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: range.cpp,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:56 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/range.h b/uppdev/XLS/range.h deleted file mode 100644 index fcd0def60..000000000 --- a/uppdev/XLS/range.h +++ /dev/null @@ -1,112 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/range.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef RANGE_H -#define RANGE_H - -#include -#include - -#include -#include -#include -#include - -namespace xlslib_core -{ - class worksheet; - class range - : public xf_i, - public font_i, - private range_t - - { - public: - range(unsigned16_t row1, unsigned16_t col1, - unsigned16_t row2, unsigned16_t col2, - worksheet* pws, - bool atomic = false); - virtual ~range(); - - void cellcolor(color_name_t color); - - private: - bool m_Atomic; - worksheet* m_pWorkSheet; - - public: // xf_i interface declaration - void font(font_t* fontidx); - void format(format_number_t formatidx); - void halign(halign_option_t ha_option); - void valign(valign_option_t va_option); - void indent(indent_option_t indent_option); - void orientation(txtori_option_t ori_option); - void fillfgcolor(color_name_t color); - void fillbgcolor(color_name_t color); - void fillstyle(fill_option_t fill); - void locked(bool locked_opt); - void hidden(bool hidden_opt); - void wrap(bool wrap_opt); - void borderstyle(border_side_t side, - border_style_t style, - color_name_t color); - - public: // font_i interface declaration - void fontname(std::string fntname); - void fontheight(unsigned16_t fntheight); - void fontbold(boldness_option_t fntboldness); - void fontunderline(underline_option_t fntunderline); - void fontscript(script_option_t fntscript); - void fontcolor(color_name_t fntcolor); - void fontattr(unsigned16_t attr); - void fontitalic(bool italic); - void fontstrikeout(bool so); - void fontoutline(bool ol); - void fontshadow(bool sh); - }; -} - -#endif //RANGE_H - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: range.h,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:49 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - \ No newline at end of file diff --git a/uppdev/XLS/recdef.cpp b/uppdev/XLS/recdef.cpp deleted file mode 100644 index 81a9f74ab..000000000 --- a/uppdev/XLS/recdef.cpp +++ /dev/null @@ -1,485 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/recdef.cpp,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#include - -using namespace std; -using namespace xlslib_core; - -/* -****************************** -CBof class implementation -****************************** -*/ - -CBof::CBof(unsigned16_t boftype) -{ - SetRecordType(RECTYPE_BOF ); - - AddValue16(VERSION_BIFF); - AddValue16(boftype); - AddValue16(BOF_BUILD_DFLT); - AddValue16(BOF_YEAR_DFLT); - -#if VERSION_BIFF == VERSION_BIFF8 - AddValue32(0); //The file hystory flags are all set to zero - AddValue32(VERSION_BIFF); // The lowest BIFF version -#endif - - SetRecordLength(GetDataSize()-4); -} - -CBof::~CBof() -{} - -/* -****************************** -CEof class implementation -****************************** -*/ -CEof::CEof() -{ - SetRecordType(RECTYPE_EOF ); - SetRecordLength(GetDataSize()-4); -} - -CEof::~CEof() -{ -} - -/* -********************************** -CCodePage class implementation -********************************** -*/ - -CCodePage::CCodePage(unsigned16_t boftype) -{ - SetRecordType(RECTYPE_CODENAME); - - AddValue16(boftype); - - SetRecordLength(GetDataSize()-4); -} - -CCodePage::~CCodePage() -{} - -/* -********************************** -CWindow1 class implementation -********************************** -*/ -CWindow1::CWindow1() -{ - SetRecordType(RECTYPE_WINDOW1); - - // The data of this record is hardcoded, since for file creation - // this value takes a default (window dimensions and position). - - // NOTE: Doublecheck the previous statement!! - unsigned8_t recwin1[] = {0x40,0x02,0xfc,0x00,0xe0,0x37,0xe0,0x25, - 0x38,0x00,0x00,0x00,0x00,0x00,0x01,0x00, 0x58,0x02}; - - AddDataArray(recwin1, sizeof(recwin1)); - - SetRecordLength(GetDataSize()-4); -} - -CWindow1::~CWindow1() -{ -} - -/* -********************************** -CDateMode class implementation -********************************** -*/ - -CDateMode::CDateMode() -{ - SetRecordType(RECTYPE_R1904); - -#ifdef __APPLE__ - AddValue16(1); // 1904 -#else - AddValue16(0); // 1900 -#endif - SetRecordLength(GetDataSize()-4); -} - -CDateMode::~CDateMode() -{} - -/* -********************************** -CWindow2 class implementation -********************************** -*/ -CWindow2::CWindow2() -{ - SetRecordType(RECTYPE_WINDOW2); - - AddValue16(W2_DFLT_GRBIT); - AddValue16(W2_DFLT_TOPROW); - AddValue16(W2_DFLT_LEFTCOL); - -#if VERSION_BIFF == VERSION_BIFF5 - AddValue32(W2_DFLT_COLOR); -#else - AddValue16(0); // 0 == BLACK - AddValue16(0); - AddValue16(0); // zoom, default == 0 (W2_DFLT_ZOOMPBPREV ???) - AddValue16(0); // xoom, default == 0 (W2_DFLT_ZOOMNORMAL ???) - AddValue32(W2_DFLT_RESERVED); -#endif - - SetRecordLength(GetDataSize()-4); -} - -CWindow2::~CWindow2() -{ -} - -/* -********************************** -CDimension class implementation -********************************** -*/ -CDimension::CDimension(unsigned32_t minRow, unsigned32_t maxRow, unsigned32_t minCol, unsigned32_t maxCol) -{ - SetRecordType(RECTYPE_DIMENSIONS); - -#if VERSION_BIFF == VERSION_BIFF5 - AddValue16((unsigned26_t)minRow); - AddValue16((unsigned26_t)(maxRow+1)); -#else - AddValue32(minRow); - AddValue32(maxRow+1); -#endif - AddValue16(minCol); - AddValue16(maxCol+1); // zoom, default == 0 (W2_DFLT_ZOOMPBPREV ???) - AddValue16(W2_DFLT_RESERVED); - - SetRecordLength(GetDataSize()-4); -} - -CDimension::~CDimension() -{ -} - -/* -********************************** -********************************** -*/ -void CWindow2::SetSelected() -{ - unsigned16_t grbitval; - GetValue16From((signed16_t*)&grbitval, W2_OFFSET_GRBIT); - - grbitval |= W2_GRBITMASK_SELECTED; - - SetValueAt((signed16_t)grbitval, W2_OFFSET_GRBIT); - -} - -/* -********************************** -********************************** -*/ -void CWindow2::SetPaged() -{ - unsigned16_t grbitval; - GetValue16From((signed16_t*)&grbitval, W2_OFFSET_GRBIT); - - grbitval |= W2_GRBITMASK_PAGED; - - SetValueAt((signed16_t)grbitval, W2_OFFSET_GRBIT); - -} - -/* -********************************** -********************************** -*/ -void CWindow2::ClearSelected() -{ - unsigned16_t grbitval; - GetValue16From((signed16_t*)&grbitval, W2_OFFSET_GRBIT); - - grbitval &= (~W2_GRBITMASK_SELECTED); - - SetValueAt((signed16_t)grbitval, W2_OFFSET_GRBIT); - -} - -/* -********************************** -********************************** -*/ -void CWindow2::ClearPaged() -{ - unsigned16_t grbitval; - GetValue16From((signed16_t*)&grbitval, W2_OFFSET_GRBIT); - - grbitval &= (~W2_GRBITMASK_PAGED); - - SetValueAt((signed16_t)grbitval, W2_OFFSET_GRBIT); - -} - - -/* -********************************** -CPalette class implementation -********************************** -*/ -/* - CPalette::CPalette() - { - SetRecordType(RECTYPE_PALETTE); - - // The data of this record is hardcoded, since for file creation - // this value takes a default (Documentation says that if the BIFF - // file doesn't have a PALETTE record, it uses a default palette, but - // somehow if this record is removed Excel displays an error). - unsigned8_t palette[] = - { - 0x38,0x00,0x00,0x00, 0x00,0x00,0xff,0xff,0xff,0x00,0xff,0x00,0x00,0x00, - 0x00,0xff,0x00,0x00,0x00,0x00,0xff,0x00, 0xff,0xff,0x00,0x00,0xff,0x00,0xff,0x00, - 0x00,0xff,0xff,0x00,0x80,0x00,0x00,0x00, 0x00,0x80,0x00,0x00,0x00,0x00,0x80,0x00, - 0x80,0x80,0x00,0x00,0x80,0x00,0x80,0x00, 0x00,0x80,0x80,0x00,0xc0,0xc0,0xc0,0x00, - 0x80,0x80,0x80,0x00,0x99,0x99,0xff,0x00, 0x99,0x33,0x66,0x00,0xff,0xff,0xcc,0x00, - 0xcc,0xff,0xff,0x00,0x66,0x00,0x66,0x00, 0xff,0x80,0x80,0x00,0x00,0x66,0xcc,0x00, - 0xcc,0xcc,0xff,0x00,0x00,0x00,0x80,0x00, 0xff,0x00,0xff,0x00,0xff,0xff,0x00,0x00, - 0x00,0xff,0xff,0x00,0x80,0x00,0x80,0x00, 0x80,0x00,0x00,0x00,0x00,0x80,0x80,0x00, - 0x00,0x00,0xff,0x00,0x00,0xcc,0xff,0x00, 0xcc,0xff,0xff,0x00,0xcc,0xff,0xcc,0x00, - 0xff,0xff,0x99,0x00,0x99,0xcc,0xff,0x00, 0xff,0x99,0xcc,0x00,0xcc,0x99,0xff,0x00, - 0xe3,0xe3,0xe3,0x00,0x33,0x66,0xff,0x00, 0x33,0xcc,0xcc,0x00,0x99,0xcc,0x00,0x00, - 0xff,0xcc,0x00,0x00,0xff,0x99,0x00,0x00, 0xff,0x66,0x00,0x00,0x66,0x66,0x99,0x00, - 0x96,0x96,0x96,0x00,0x00,0x33,0x66,0x00, 0x33,0x99,0x66,0x00,0x00,0x33,0x00,0x00, - 0x33,0x33,0x00,0x00,0x99,0x33,0x00,0x00, 0x99,0x33,0x66,0x00,0x33,0x33,0x99,0x00, - 0x33,0x33,0x33,0x00 - }; - - - AddDataArray(palette, sizeof(palette)); - - SetRecordLength(GetDataSize()-4); - } - - CPalette::~CPalette() - { - } - -*/ -/* -****************************** -CStyle class implementation -****************************** -*/ -#define STYLE_BUILTIN_NORMAL ((unsigned8_t)0x00) -#define STYLE_BUILTIN_ROWLEVELN ((unsigned8_t)0x01) -#define STYLE_BUILTIN_COLLEVELN ((unsigned8_t)0x02) -#define STYLE_BUILTIN_COMMA ((unsigned8_t)0x03) -#define STYLE_BUILTIN_CURRENCY ((unsigned8_t)0x04) -#define STYLE_BUILTIN_PERCENT ((unsigned8_t)0x05) -#define STYLE_BUILTIN_COMMAT ((unsigned8_t)0x06) -#define STYLE_BUILTIN_CURRENCYT ((unsigned8_t)0x07) - -#define STYLE_BUILTIN_BIT ((unsigned16_t)0x8000) - - - -#define STYLE_LEVEL_DUMMY ((unsigned8_t)0x00) - -CStyle::CStyle(style_t* styledef) -{ - - // TODO: Implement user-defined styles. So far only built-in are used. - SetRecordType(RECTYPE_STYLE); - - AddValue16(styledef->xfindex|STYLE_BUILTIN_BIT); - AddValue8(styledef->builtintype); - AddValue8(STYLE_LEVEL_DUMMY); - - - SetRecordLength(GetDataSize()-4); -} - -CStyle::CStyle(unsigned16_t xfindex, unsigned8_t builtintype) -{ - // TODO: Implement user-defined styles. So far only built-in are used. - SetRecordType(RECTYPE_STYLE); - - AddValue16(xfindex|STYLE_BUILTIN_BIT); - AddValue8(builtintype); - AddValue8(STYLE_LEVEL_DUMMY); - - - SetRecordLength(GetDataSize()-4); - - -} - - -CStyle::~CStyle() -{ -} - - - -/* -****************************** -CBSheet class implementation -****************************** -*/ -CBSheet::CBSheet(unsigned32_t streampos, - unsigned16_t attributes, - string& sheetname) -{ - SetRecordType(RECTYPE_BOUNDSHEET); - AddValue32(streampos); - AddValue16(attributes); - -#if VERSION_BIFF == VERSION_BIFF5 - AddValue8((unsigned8_t)sheetname.size()); - AddDataArray((unsigned8_t*)sheetname.c_str(), sheetname.size()); -#endif -#if VERSION_BIFF == VERSION_BIFF8 - AddUnicodeStrlen((unsigned8_t)sheetname.size()); - AddUnicodeString((unsigned8_t* )sheetname.c_str(), sheetname.size()); -#endif - - SetRecordLength(GetDataSize()-4); -} -#if VERSION_BIFF == VERSION_BIFF8 -CBSheet::CBSheet(unsigned32_t streampos, - unsigned16_t attributes, - ustring& sheetname -#ifdef HAVE_ICONV - , string& iconv_code -#endif -) { - - SetRecordType(RECTYPE_BOUNDSHEET); - AddValue32(streampos); - AddValue16(attributes); - -#ifdef HAVE_ICONV - u16string u16sheetname; - - Conv32to16(iconv_code, sheetname, u16sheetname); -// size_t outSize, resultSize; -// size_t iconv (iconv_t cd, char **restrict inbuf, size_t *restrict inbytesleft, char **restrict outbuf, size_t *restrict outbytesleft); - AddUnicodeStrlen((unsigned8_t)u16sheetname.size()); - AddUnicodeString((unsigned16_t* )u16sheetname.c_str(), u16sheetname.size()); -#else - AddUnicodeStrlen((unsigned8_t)sheetname.size()); - AddUnicodeString((unsigned16_t* )sheetname.c_str(), sheetname.size()); -#endif - - SetRecordLength(GetDataSize()-4); -} -#endif - -CBSheet::CBSheet(boundsheet_t* bsheetdef) -{ - SetRecordType(RECTYPE_BOUNDSHEET); - AddValue32(bsheetdef->streampos); - - // Set the flags in the attribute variables - unsigned16_t attrflags = 0; - attrflags |= bsheetdef->worksheet? BSHEET_ATTR_WORKSHEET:0; - attrflags |= bsheetdef->ex4macro? BSHEET_ATTR_EX4MACRO:0; - attrflags |= bsheetdef->chart? BSHEET_ATTR_CHART:0; - attrflags |= bsheetdef->vbmodule? BSHEET_ATTR_VBMODULE:0; - attrflags |= bsheetdef->visible? BSHEET_ATTR_VISIBLE:0; - attrflags |= bsheetdef->hidden? BSHEET_ATTR_HIDDEN:0; - attrflags |= bsheetdef->veryhidden? BSHEET_ATTR_VERYHIDDEN:0; - - AddValue16(attrflags); - -#if VERSION_BIFF == VERSION_BIFF5 - AddValue8((unsigned8_t)bsheetdef->sheetname.size()); - AddDataArray((unsigned8_t*)((bsheetdef->sheetname).c_str()), (bsheetdef->sheetname).size()); -#endif -#if VERSION_BIFF == VERSION_BIFF8 - if(bsheetdef->asheetname.size()) { - AddUnicodeStrlen((unsigned8_t)bsheetdef->asheetname.size()); - AddUnicodeString((unsigned8_t*)((bsheetdef->asheetname).c_str()), (bsheetdef->asheetname).size()); - } else { -#ifdef HAVE_ICONV - u16string u16sheetname; - - Conv32to16(bsheetdef->iconv_code, bsheetdef->usheetname, u16sheetname); - - AddUnicodeStrlen((unsigned8_t)u16sheetname.size()); - AddUnicodeString((unsigned16_t* )u16sheetname.c_str(), u16sheetname.size()); -#else - AddUnicodeStrlen((unsigned8_t)bsheetdef->usheetname.size()); - AddUnicodeString((unsigned16_t*)(bsheetdef->usheetname.c_str()), (bsheetdef->usheetname).size()); -#endif - } -#endif - - SetRecordLength(GetDataSize()-4); -} - -CBSheet::~CBSheet() -{ -} - -/* -********************************** -********************************** -*/ - -void CBSheet::SetStreamPosition(unsigned32_t pos) -{ - SetValueAt((signed32_t)pos, BSHEET_OFFSET_POSITION); -} - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: recdef.cpp,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:48 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/recdef.h b/uppdev/XLS/recdef.h deleted file mode 100644 index ddc568ab6..000000000 --- a/uppdev/XLS/recdef.h +++ /dev/null @@ -1,325 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/recdef.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#ifndef RECDEF_H -#define RECDEF_H - -#include -#include -#include -#include - -namespace xlslib_core -{ - -/* -****************************** -CBof class declaration -****************************** -*/ -#define BOF_TYPE_WBGLOBALS ((unsigned16_t)0x0005) -#define BOF_TYPE_VBMODULE ((unsigned16_t)0x0006) -#define BOF_TYPE_WORKSHEET ((unsigned16_t)0x0010) -#define BOF_TYPE_CHART ((unsigned16_t)0x0020) -#define BOF_TYPE_EXCEL4_MACROSH ((unsigned16_t)0x0040) -#define BOF_TYPE_WSFILE ((unsigned16_t)0x0100) - -#define BOF_BUILD_DFLT ((unsigned16_t)0x1d5f) -#define BOF_YEAR_DFLT ((unsigned16_t)0x07cd) - -#define CODEPAGE_IBMPC ((unsigned16_t)0x01b5) -#define CODEPAGE_APPLE ((unsigned16_t)0x8000) -#define CODEPAGE_ANSI ((unsigned16_t)0x04e4) - -#define BOF_RECORD_SIZE (12) - - class CBof: public CRecord - { - protected: - - public: - - CBof(unsigned16_t boftype); - ~CBof(); - }; - -/* -****************************** -CEof class declaration -****************************** -*/ - class CEof: public CRecord - { - protected: - - public: - - CEof(); - ~CEof(); - }; - -/* -****************************** -CCodePage class declaration -****************************** -*/ - class CCodePage: public CRecord - { - protected: - - public: - - CCodePage(unsigned16_t boftype); - ~CCodePage(); - }; - - /* -****************************** -CWindow1 class declaration -****************************** -*/ - - class CWindow1: public CRecord - { - protected: - - public: - - CWindow1(); - ~CWindow1(); - }; - -/* -****************************** -CDateMode class declaration -****************************** -*/ - class CDateMode: public CRecord - { - protected: - - public: - - CDateMode(); - ~CDateMode(); - }; - - - -/* -****************************** -CWindow2 class declaration -****************************** -*/ - -#define W2_OFFSET_GRBIT ((unsigned32_t)4) -#define W2_OFFSET_TOPROW ((unsigned32_t)6) -#define W2_OFFSET_LEFTCOL ((unsigned32_t)8) -#define W2_OFFSET_COLOR ((unsigned32_t)10) -#define W2_OFFSET_ZOOMPREVIEW ((unsigned32_t)14) -#define W2_OFFSET_ZOOMNORMAL ((unsigned32_t)16) -#define W2_OFFSET_RESERVED ((unsigned32_t)18) - - -#define W2_DFLT_TOPROW ((unsigned16_t)0x0000) -#define W2_DFLT_LEFTCOL ((unsigned16_t)0x0000) -#define W2_DFLT_COLOR ((unsigned32_t)0x00000000) - // NOTE: Check a BIFF8 example to verify the units of the two following values -#define W2_DFLT_ZOOMPBPREV ((unsigned16_t)0x0100) -#define W2_DFLT_ZOOMNORMAL ((unsigned16_t)0x0100) -#define W2_DFLT_RESERVED ((unsigned32_t)0x00000000) - - // GRBIT mask-flags: -#define W2_GRBITMASK_FMLA ((unsigned16_t)0x0001) -#define W2_GRBITMASK_GRIDS ((unsigned16_t)0x0002) -#define W2_GRBITMASK_HROWCOL ((unsigned16_t)0x0004) -#define W2_GRBITMASK_FROZEN ((unsigned16_t)0x0008) -#define W2_GRBITMASK_ZEROS ((unsigned16_t)0x0010) -#define W2_GRBITMASK_DFLTHDRCOLOR ((unsigned16_t)0x0020) -#define W2_GRBITMASK_ARABIC ((unsigned16_t)0x0040) -#define W2_GRBITMASK_GUTS ((unsigned16_t)0x0080) -#define W2_GRBITMASK_FRZNOSPLIT ((unsigned16_t)0x0100) -#define W2_GRBITMASK_SELECTED ((unsigned16_t)0x0200) -#define W2_GRBITMASK_PAGED ((unsigned16_t)0x0400) -#define W2_GRBITMASK_SLV ((unsigned16_t)0x0800) -#define W2_GRBITMASK_RESERVED ((unsigned16_t)0xf000) - - // NOTE: Hardcoded from an excel example -#define W2_DFLT_GRBIT ((unsigned16_t)0x06b6) - /* - #define W2_DFLT_GRBIT ((unsigned16_t) \ - (W2_GRBITMASK_GRIDS|W2_GRBITMASK_HROWCOL|W2_GRBITMASK_DFLTHDRCOLOR)) - */ - class CWindow2: public CRecord - { - private: - - public: - - // TODO: Create a constructor that gets user-defined arguments that specify the appearence - // The following constructor stablishes default values. - CWindow2(); - ~CWindow2(); - - void SetSelected(); - void SetPaged(); - void ClearSelected(); - void ClearPaged(); - }; - -/* -****************************** -CDimension class declaration -****************************** -*/ - class CDimension: public CRecord - { - protected: - - public: - - CDimension(unsigned32_t minRow, unsigned32_t maxRow, unsigned32_t minCol, unsigned32_t maxCol); - ~CDimension(); - }; - - /* -****************************** -CStyle class declaration -****************************** -*/ - - typedef struct - { - unsigned16_t xfindex; - unsigned8_t builtintype; - - } style_t; - typedef std::list Style_List_t; - typedef Style_List_t::iterator Style_List_Itor_t; - - class CStyle: public CRecord - { - protected: - - public: - - CStyle(unsigned16_t xfindex, unsigned8_t builtintype); - CStyle(style_t* styledef); - ~CStyle(); - }; - - - /* -****************************** -CBSheet class declaration -****************************** -*/ - -#define BSHEET_OFFSET_POSITION ((unsigned32_t)4) -#define BSHEET_OFFSET_FLAGS ((unsigned32_t)8) -#define BSHEET_OFFSET_NAMELENGHT ((unsigned32_t)10) -#define BSHEET_OFFSET_B7NAME ((unsigned32_t)11) -#define BSHEET_OFFSET_B8NAME ((unsigned32_t)12) - -#define BSHEET_ATTR_WORKSHEET ((unsigned16_t)0x0000) -#define BSHEET_ATTR_EX4MACRO ((unsigned16_t)0x0001) -#define BSHEET_ATTR_CHART ((unsigned16_t)0x0002) -#define BSHEET_ATTR_VBMODULE ((unsigned16_t)0x0006) - -#define BSHEET_ATTR_VISIBLE ((unsigned16_t)0x0000) -#define BSHEET_ATTR_HIDDEN ((unsigned16_t)0x0100) -#define BSHEET_ATTR_VERYHIDDEN ((unsigned16_t)0x0200) - -// TODO - DFH - are strings leaked???? - typedef struct - { - unsigned32_t streampos; - std::string asheetname; -#if VERSION_BIFF == VERSION_BIFF8 - std::ustring usheetname; -#ifdef HAVE_ICONV - std::string iconv_code; -#endif -#endif - bool _free :1; - bool worksheet:1; - bool ex4macro:1; - bool chart:1; - bool vbmodule:1; - bool visible:1; - bool hidden:1; - bool veryhidden:1; - } boundsheet_t; - typedef std::list Boundsheet_List_t; - typedef Boundsheet_List_t::iterator Boundsheet_List_Itor_t; - - class CBSheet: public CRecord - { - private: - - public: - - CBSheet(unsigned32_t streampos, - unsigned16_t attributes, - std::string& sheetname); -#if VERSION_BIFF == VERSION_BIFF8 - CBSheet(unsigned32_t streampos, - unsigned16_t attributes, - std::ustring& sheetname -#ifdef HAVE_ICONV - , std::string& iconv_code -#endif - ); -#endif - CBSheet(boundsheet_t* bsheetdef); - - ~CBSheet(); - - void SetStreamPosition(unsigned32_t pos); - }; -} -#endif //RECDEF_H - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: recdef.h,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:57 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/record.cpp b/uppdev/XLS/record.cpp deleted file mode 100644 index ab52538a8..000000000 --- a/uppdev/XLS/record.cpp +++ /dev/null @@ -1,150 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/record.cpp,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#include - -using namespace std; -using namespace xlslib_core; - -/* -****************************** -CRecord class implementation -****************************** -*/ - - -CRecord::CRecord() - :m_Num(RECTYPE_NULL) - -{ - - // Initialize (and create) the space for record type - // and record length - const unsigned8_t array[] = {0,0,0,0} ; - AddDataArray(array, 4); - - - -} - -CRecord::~CRecord() -{ -} - -/* -****************************** -****************************** -*/ -void CRecord::SetRecordType(unsigned16_t rtype) -{ - SetValueAt((signed16_t)rtype, 0); - -} - - -/* -****************************** -****************************** -*/ - -unsigned16_t CRecord::GetRecordType() -{ - unsigned16_t value; - GetValue16From((signed16_t*)&value, 0); - - return value; -} - -/* -****************************** -****************************** -*/ -void CRecord::SetRecordLength(unsigned16_t rlength) -{ - SetValueAt((signed16_t)rlength, 2); - -} - - -/* -****************************** -****************************** -*/ - -unsigned16_t CRecord::GetRecordLength() -{ - unsigned16_t value; - GetValue16From((signed16_t*)&value, 2); - - return value; -} - - -/* -****************************** -****************************** -*/ - -unsigned8_t* CRecord::GetRecordDataBuffer() -{ - return GetBuffer() + 4; - -} - - -/* -****************************** -****************************** -*/ -unsigned32_t CRecord::GetRecordDataSize() -{ - return GetDataSize() - 4; -} - -/* -****************************** -****************************** -*/ - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: record.cpp,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:46 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/record.h b/uppdev/XLS/record.h deleted file mode 100644 index fd83e70dd..000000000 --- a/uppdev/XLS/record.h +++ /dev/null @@ -1,91 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/record.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#ifndef RECORD_H -#define RECORD_H - -#include -#include -#include -#include - -namespace xlslib_core -{ - -#define VERSION_BIFF5 0x0500 -#define VERSION_BIFF8 0x0600 -#define VERSION_BIFF VERSION_BIFF8 - - /* -****************************** -CRecord class declaration -****************************** -*/ - class CRecord: public CUnit - { - protected: - - unsigned16_t m_Num; - - public: - - CRecord(); - ~CRecord(); - - void SetRecordType(unsigned16_t rtype); - unsigned16_t GetRecordType(); - - void SetRecordLength(unsigned16_t); - unsigned16_t GetRecordLength(); - - unsigned8_t* GetRecordDataBuffer(); - unsigned32_t GetRecordDataSize(); - - - - }; -} -#endif //RECORD_H - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: record.h,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:54 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/rectypes.h b/uppdev/XLS/rectypes.h deleted file mode 100644 index 9e11fea28..000000000 --- a/uppdev/XLS/rectypes.h +++ /dev/null @@ -1,758 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/rectypes.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef RECTYPES_H -#define RECTYPES_H - -/* - sed -e 's/\(^\([A-Z0-9]*\)\:.*$\)/\/\* \1 \*\/\n#define RECTYPE_\2 \\/' biff_records_alpha.txt | sed -e 's/^ \([A-F0-9]*\)\h$/ ((unsigned16_t)0x\1)/' >recordtypes.h -*/ - -#include -#include - -//#define MAX_RECORD_SIZE_BIFF57 (2000) -#define MAX_RECORD_SIZE_BIFF8 (8000) -#define MAX_RECORD_SIZE MAX_RECORD_SIZE_BIFF8 - -/* 1904: 1904 Date System */ -#define RECTYPE_NULL \ - ((unsigned16_t)0x00) - -/* 1904: 1904 Date System */ -#define RECTYPE_R1904 \ - ((unsigned16_t)0x22) - -/* ADDIN: Workbook Is an Add-in Macro */ -#define RECTYPE_ADDIN \ - ((unsigned16_t)0x87) - -/* ADDMENU: Menu Addition */ -#define RECTYPE_ADDMENU \ - ((unsigned16_t)0xC2) - -/* ARRAY: Array-Entered Formula */ -#define RECTYPE_ARRAY \ - ((unsigned16_t)0x221) - -/* AUTOFILTER: AutoFilter Data */ -#define RECTYPE_AUTOFILTER \ - ((unsigned16_t)0x9E) - -/* AUTOFILTERINFO: Drop-Down Arrow Count */ -#define RECTYPE_AUTOFILTERINFO \ - ((unsigned16_t)0x9D) - -/* BACKUP: Save Backup Version of the File */ -#define RECTYPE_BACKUP \ - ((unsigned16_t)0x40) - -/* BLANK: Cell Value, Blank Cell */ -#define RECTYPE_BLANK \ - ((unsigned16_t)0x201) - -/* BOF: Beginning of File */ -#define RECTYPE_BOF \ - ((unsigned16_t)0x809) - -/* BOOKBOOL: Workbook Option Flag */ -#define RECTYPE_BOOKBOOL \ - ((unsigned16_t)0xDA) - -/* BOOLERR: Cell Value, Boolean or Error */ -#define RECTYPE_BOOLERR \ - ((unsigned16_t)0x205) - -/* BOTTOMMARGIN: Bottom Margin Measurement */ -#define RECTYPE_BOTTOMMARGIN \ - ((unsigned16_t)0x29) - -/* BOUNDSHEET: Sheet Information */ -#define RECTYPE_BOUNDSHEET \ - ((unsigned16_t)0x85) - -/* CALCCOUNT: Iteration Count */ -#define RECTYPE_CALCCOUNT \ - ((unsigned16_t)0x0C) - -/* CALCMODE: Calculation Mode */ -#define RECTYPE_CALCMODE \ - ((unsigned16_t)0x0D) - -/* CF - : Conditional Formatting Conditions */ -#define RECTYPE_CF \ - ((unsigned16_t)0x1B1) - -/* CONDFMT: Conditional Formatting Range Information */ -#define RECTYPE_CONDFMT \ - ((unsigned16_t)0x1B0) - -/* CODENAME: VBE Object Name */ -#define RECTYPE_CODENAME \ - ((unsigned16_t)0x42) - -/* CODEPAGE: Default Code Page */ -#define RECTYPE_CODEPAGE \ - ((unsigned16_t)0x42) - -/* COLINFO: Column Formatting Information */ -#define RECTYPE_COLINFO \ - ((unsigned16_t)0x7D) - -/* CONTINUE: Continues Long Records */ -#define RECTYPE_CONTINUE \ - ((unsigned16_t)0x3C) - -/* COORDLIST: Polygon Object Vertex Coordinates */ -#define RECTYPE_COORDLIST \ - ((unsigned16_t)0xA9) - -/* COUNTRY: Default Country and WIN.INI Country */ -#define RECTYPE_COUNTRY \ - ((unsigned16_t)0x8C) - -/* CRN: Nonresident Operands */ -#define RECTYPE_CRN \ - ((unsigned16_t)0x5A) - -/* DBCELL: Stream Offsets */ -#define RECTYPE_DBCELL \ - ((unsigned16_t)0xD7) - -/* DCON: Data Consolidation Information */ -#define RECTYPE_DCON \ - ((unsigned16_t)0x50) - -/* DCONBIN: Data Consolidation Information */ -#define RECTYPE_DCONBIN \ - ((unsigned16_t)0x1B5) - -/* DCONNAME: Data Consolidation Named References */ -#define RECTYPE_DCONNAME \ - ((unsigned16_t)0x52) - -/* DCONREF: Data Consolidation References */ -#define RECTYPE_DCONREF \ - ((unsigned16_t)0x51) - -/* DEFAULTROWHEIGHT: Default Row Height */ -#define RECTYPE_DEFAULTROWHEIGHT \ - ((unsigned16_t)0x225) - -/* DEFCOLWIDTH: Default Width for Columns */ -#define RECTYPE_DEFCOLWIDTH \ - ((unsigned16_t)0x55) - -/* DELMENU: Menu Deletion */ -#define RECTYPE_DELMENU \ - ((unsigned16_t)0xC3) - -/* DELTA: Iteration Increment */ -#define RECTYPE_DELTA \ - ((unsigned16_t)0x10) - -/* DIMENSIONS: Cell Table Size */ -#define RECTYPE_DIMENSIONS \ - ((unsigned16_t)0x200) - -/* DOCROUTE: Routing Slip Information */ -#define RECTYPE_DOCROUTE \ - ((unsigned16_t)0xB8) - -/* DSF: Double Stream File */ -#define RECTYPE_DSF \ - ((unsigned16_t)0x161) - -/* DV: Data Validation Criteria */ -#define RECTYPE_DV \ - ((unsigned16_t)0x1BE) - -/* DVAL: Data Validation Information */ -#define RECTYPE_DVAL \ - ((unsigned16_t)0x1B2) - -/* EDG: Edition Globals */ -#define RECTYPE_EDG \ - ((unsigned16_t)0x88) - -/* EOF: End of File */ -#define RECTYPE_EOF \ - ((unsigned16_t)0x0A) - -/* EXTERNCOUNT: Number of External References */ -#define RECTYPE_EXTERNCOUNT \ - ((unsigned16_t)0x16) - -/* EXTERNNAME: Externally Referenced Name */ -#define RECTYPE_EXTERNNAME \ - ((unsigned16_t)0x223) - -/* EXTERNSHEET: External Reference */ -#define RECTYPE_EXTERNSHEET \ - ((unsigned16_t)0x17) - -/* EXTSST: Extended Shared String Table */ -#define RECTYPE_EXTSST \ - ((unsigned16_t)0xFF) - -/* FILEPASS: File Is Password-Protected */ -#define RECTYPE_FILEPASS \ - ((unsigned16_t)0x2F) - -/* FILESHARING: File-Sharing Information */ -#define RECTYPE_FILESHARING \ - ((unsigned16_t)0x5B) - -/* FILESHARING2: File-Sharing Information for Shared Lists */ -#define RECTYPE_FILESHARING2 \ - ((unsigned16_t)0x1A5) - -/* FILTERMODE: Sheet Contains Filtered List */ -#define RECTYPE_FILTERMODE \ - ((unsigned16_t)0x9B) - -/* FNGROUPCOUNT: Built-in Function Group Count */ -#define RECTYPE_FNGROUPCOUNT \ - ((unsigned16_t)0x9C) - -/* FNGROUPNAME: Function Group Name */ -#define RECTYPE_FNGROUPNAME \ - ((unsigned16_t)0x9A) - -/* FONT: Font Description */ -// NOTE: Changed temporarilly to 31h (the manual says is 231h) -#define RECTYPE_FONT \ - ((unsigned16_t)0x31) - -/* FOOTER: Print Footer on Each Page */ -#define RECTYPE_FOOTER \ - ((unsigned16_t)0x15) - -/* FORMAT: Number Format */ -#define RECTYPE_FORMAT \ - ((unsigned16_t)0x41E) - -/* FORMULA: Cell Formula */ -#define RECTYPE_FORMULA \ - ((unsigned16_t)0x406) - -/* GCW: Global Column-Width Flags */ -#define RECTYPE_GCW \ - ((unsigned16_t)0xAB) - -/* GRIDSET: State Change of Gridlines Option */ -#define RECTYPE_GRIDSET \ - ((unsigned16_t)0x82) - -/* GUTS: Size of Row and Column Gutters */ -#define RECTYPE_GUTS \ - ((unsigned16_t)0x80) - -/* HCENTER: Center Between Horizontal Margins */ -#define RECTYPE_HCENTER \ - ((unsigned16_t)0x83) - -/* HEADER: Print Header on Each Page */ -#define RECTYPE_HEADER \ - ((unsigned16_t)0x14) - -/* HIDEOBJ: Object Display Options */ -#define RECTYPE_HIDEOBJ \ - ((unsigned16_t)0x8D) - -/* HLINK: Hyperlink */ -#define RECTYPE_HLINK \ - ((unsigned16_t)0x1B8) - -/* HORIZONTALPAGEBREAKS: Explicit Row Page Breaks */ -#define RECTYPE_HORIZONTALPAGEBREAKS \ - ((unsigned16_t)0x1B) - -/* IMDATA: Image Data */ -#define RECTYPE_IMDATA \ - ((unsigned16_t)0x7F) - -/* INDEX: Index Record */ -#define RECTYPE_INDEX \ - ((unsigned16_t)0x20B) - -/* INTERFACEEND: End of User Interface Records */ -#define RECTYPE_INTERFACEEND \ - ((unsigned16_t)0xE2) - -/* INTERFACEHDR: Beginning of User Interface Records */ -#define RECTYPE_INTERFACEHDR \ - ((unsigned16_t)0xE1) - -/* ITERATION: Iteration Mode */ -#define RECTYPE_ITERATION \ - ((unsigned16_t)0x11) - -/* LABEL: Cell Value, String Constant */ -#define RECTYPE_LABEL \ - ((unsigned16_t)0x204) - -/* LABELSST: Cell Value, String Constant/SST */ -#define RECTYPE_LABELSST \ - ((unsigned16_t)0xFD) - -/* LEFTMARGIN: Left Margin Measurement */ -#define RECTYPE_LEFTMARGIN \ - ((unsigned16_t)0x26) - -/* LHNGRAPH: Named Graph Information */ -#define RECTYPE_LHNGRAPH \ - ((unsigned16_t)0x95) - -/* LHRECORD: .WK? File Conversion Information */ -#define RECTYPE_LHRECORD \ - ((unsigned16_t)0x94) - -/* LPR: Sheet Was Printed Using LINE.PRINT( */ -#define RECTYPE_LPR \ - ((unsigned16_t)0x98) - -/* MMS: ADDMENU/DELMENU Record Group Count */ -#define RECTYPE_MMS \ - ((unsigned16_t)0xC1) - -/* MSODRAWING: Microsoft Office Drawing */ -#define RECTYPE_MSODRAWING \ - ((unsigned16_t)0xEC) - -/* MSODRAWINGGROUP: Microsoft Office Drawing Group */ -#define RECTYPE_MSODRAWINGGROUP \ - ((unsigned16_t)0xEB) - -/* MSODRAWINGSELECTION: Microsoft Office Drawing Selection */ -#define RECTYPE_MSODRAWINGSELECTION \ - ((unsigned16_t)0xED) - -/* MULBLANK: Multiple Blank Cells */ -#define RECTYPE_MULBLANK \ - ((unsigned16_t)0xBE) - -/* MULRK: Multiple RK Cells */ -#define RECTYPE_MULRK \ - ((unsigned16_t)0xBD) - -/* NAME: Defined Name */ -#define RECTYPE_NAME \ - ((unsigned16_t)0x218) - -/* NOTE: Comment Associated with a Cell */ -#define RECTYPE_NOTE \ - ((unsigned16_t)0x1C) - -/* NUMBER: Cell Value, Floating-Point Number */ -#define RECTYPE_NUMBER \ - ((unsigned16_t)0x203) - -/* OBJ: Describes a Graphic Object */ -#define RECTYPE_OBJ \ - ((unsigned16_t)0x5D) - -/* OBJPROTECT: Objects Are Protected */ -#define RECTYPE_OBJPROTECT \ - ((unsigned16_t)0x63) - -/* OBPROJ: Visual Basic Project */ -#define RECTYPE_OBPROJ \ - ((unsigned16_t)0xD3) - -/* OLESIZE: Size of OLE Object */ -#define RECTYPE_OLESIZE \ - ((unsigned16_t)0xDE) - -/* PALETTE: Color Palette Definition */ -#define RECTYPE_PALETTE \ - ((unsigned16_t)0x92) - -/* PANE: Number of Panes and Their Position */ -#define RECTYPE_PANE \ - ((unsigned16_t)0x41) - -/* PARAMQRY: Query Parameters */ -#define RECTYPE_PARAMQRY \ - ((unsigned16_t)0xDC) - -/* PASSWORD: Protection Password */ -#define RECTYPE_PASSWORD \ - ((unsigned16_t)0x13) - -/* PLS: Environment-Specific Print Record */ -#define RECTYPE_PLS \ - ((unsigned16_t)0x4D) - -/* PRECISION: Precision */ -#define RECTYPE_PRECISION \ - ((unsigned16_t)0x0E) - -/* PRINTGRIDLINES: Print Gridlines Flag */ -#define RECTYPE_PRINTGRIDLINES \ - ((unsigned16_t)0x2B) - -/* PRINTHEADERS: Print Row/Column Labels */ -#define RECTYPE_PRINTHEADERS \ - ((unsigned16_t)0x2A) - -/* PROTECT: Protection Flag */ -#define RECTYPE_PROTECT \ - ((unsigned16_t)0x12) - -/* PROT4REV: Shared Workbook Protection Flag */ -#define RECTYPE_PROT4REV \ - ((unsigned16_t)0x1AF) - -/* QSI: External Data Range */ -#define RECTYPE_QSI \ - ((unsigned16_t)0x1AD) - -/* RECIPNAME: Recipient Name */ -#define RECTYPE_RECIPNAME \ - ((unsigned16_t)0xB9) - -/* REFMODE: Reference Mode */ -#define RECTYPE_REFMODE \ - ((unsigned16_t)0x0F) - -/* REFRESHALL: Refresh Flag */ -#define RECTYPE_REFRESHALL \ - ((unsigned16_t)0x1B7) - -/* RIGHTMARGIN: Right Margin Measurement */ -#define RECTYPE_RIGHTMARGIN \ - ((unsigned16_t)0x27) - -/* RK: Cell Value, RK Number */ -#define RECTYPE_RK \ - ((unsigned16_t)0x7E) - -/* ROW: Describes a Row */ -#define RECTYPE_ROW \ - ((unsigned16_t)0x208) - -/* RSTRING: Cell with Character Formatting */ -#define RECTYPE_RSTRING \ - ((unsigned16_t)0xD6) - -/* SAVERECALC: Recalculate Before Save */ -#define RECTYPE_SAVERECALC \ - ((unsigned16_t)0x5F) - -/* SCENARIO: Scenario Data */ -#define RECTYPE_SCENARIO \ - ((unsigned16_t)0xAF) - -/* SCENMAN: Scenario Output Data */ -#define RECTYPE_SCENMAN \ - ((unsigned16_t)0xAE) - -/* SCENPROTECT: Scenario Protection */ -#define RECTYPE_SCENPROTECT \ - ((unsigned16_t)0xDD) - -/* SCL: Window Zoom Magnification */ -#define RECTYPE_SCL \ - ((unsigned16_t)0xA0) - -/* SELECTION: Current Selection */ -#define RECTYPE_SELECTION \ - ((unsigned16_t)0x1D) - -/* SETUP: Page Setup */ -#define RECTYPE_SETUP \ - ((unsigned16_t)0xA1) - -/* SHRFMLA: Shared Formula */ -#define RECTYPE_SHRFMLA \ - ((unsigned16_t)0xBC) - -/* SORT: Sorting Options */ -#define RECTYPE_SORT \ - ((unsigned16_t)0x90) - -/* SOUND: Sound Note */ -#define RECTYPE_SOUND \ - ((unsigned16_t)0x96) - -/* SST: Shared String Table */ -#define RECTYPE_SST \ - ((unsigned16_t)0xFC) - -/* STANDARDWIDTH: Standard Column Width */ -#define RECTYPE_STANDARDWIDTH \ - ((unsigned16_t)0x99) - -/* STRING: String Value of a Formula */ -#define RECTYPE_STRING \ - ((unsigned16_t)0x207) - -/* STYLE: Style Information */ -#define RECTYPE_STYLE \ - ((unsigned16_t)0x293) - -/* SUB: Subscriber */ -#define RECTYPE_SUB \ - ((unsigned16_t)0x91) - -/* SUPBOOK: Supporting Workbook */ -#define RECTYPE_SUPBOOK \ - ((unsigned16_t)0x1AE) - -/* SXDB: PivotTable Cache Data */ -#define RECTYPE_SXDB \ - ((unsigned16_t)0xC6) - -/* SXDBEX: PivotTable Cache Data */ -#define RECTYPE_SXDBEX \ - ((unsigned16_t)0x122) - -/* SXDI: Data Item */ -#define RECTYPE_SXDI \ - ((unsigned16_t)0xC5) - -/* SXEX: PivotTable View Extended Information */ -#define RECTYPE_SXEX \ - ((unsigned16_t)0xF1) - -/* SXEXT: External Source Information */ -#define RECTYPE_SXEXT \ - ((unsigned16_t)0xDC) - -/* SXFDBTYPE: SQL Datatype Identifier */ -#define RECTYPE_SXFDBTYPE \ - ((unsigned16_t)0x1BB) - -/* SXFILT: PivotTable Rule Filter */ -#define RECTYPE_SXFILT \ - ((unsigned16_t)0xF2) - -/* SXFORMAT: PivotTable Format Record */ -#define RECTYPE_SXFORMAT \ - ((unsigned16_t)0xFB) - -/* SXFORMULA: PivotTable Formula Record */ -#define RECTYPE_SXFORMULA \ - ((unsigned16_t)0x103) - -/* SXFMLA: PivotTable Parsed Expression */ -#define RECTYPE_SXFMLA \ - ((unsigned16_t)0xF9) - -/* SXIDSTM: Stream ID */ -#define RECTYPE_SXIDSTM \ - ((unsigned16_t)0xD5) - -/* SXIVD: Row/Column Field IDs */ -#define RECTYPE_SXIVD \ - ((unsigned16_t)0xB4) - -/* SXLI: Line Item Array */ -#define RECTYPE_SXLI \ - ((unsigned16_t)0xB5) - -/* SXNAME: PivotTable Name */ -#define RECTYPE_SXNAME \ - ((unsigned16_t)0xF6) - -/* SXPAIR: PivotTable Name Pair */ -#define RECTYPE_SXPAIR \ - ((unsigned16_t)0xF8) - -/* SXPI: Page Item */ -#define RECTYPE_SXPI \ - ((unsigned16_t)0xB6) - -/* SXRULE: PivotTable Rule Data */ -#define RECTYPE_SXRULE \ - ((unsigned16_t)0xF0) - -/* SXSTRING: String */ -#define RECTYPE_SXSTRING \ - ((unsigned16_t)0xCD) - -/* SXSELECT: PivotTable Selection Information */ -#define RECTYPE_SXSELECT \ - ((unsigned16_t)0xF7) - -/* SXTBL: Multiple Consolidation Source Info */ -#define RECTYPE_SXTBL \ - ((unsigned16_t)0xD0) - -/* SXTBPG: Page Item Indexes */ -#define RECTYPE_SXTBPG \ - ((unsigned16_t)0xD2) - -/* SXTBRGIITM: Page Item Name Count */ -#define RECTYPE_SXTBRGIITM \ - ((unsigned16_t)0xD1) - -/* SXVD: View Fields */ -#define RECTYPE_SXVD \ - ((unsigned16_t)0xB1) - -/* SXVDEX: Extended PivotTable View Fields */ -#define RECTYPE_SXVDEX \ - ((unsigned16_t)0x100) - -/* SXVI: View Item */ -#define RECTYPE_SXVI \ - ((unsigned16_t)0xB2) - -/* SXVIEW: View Definition */ -#define RECTYPE_SXVIEW \ - ((unsigned16_t)0xB0) - -/* SXVS: View Source */ -#define RECTYPE_SXVS \ - ((unsigned16_t)0xE3) - -/* TABID: Sheet Tab Index Array */ -#define RECTYPE_TABID \ - ((unsigned16_t)0x13D) - -/* TABIDCONF: Sheet Tab ID of Conflict History */ -#define RECTYPE_TABIDCONF \ - ((unsigned16_t)0xEA) - -/* TABLE: Data Table */ -#define RECTYPE_TABLE \ - ((unsigned16_t)0x236) - -/* TEMPLATE: Workbook Is a Template */ -#define RECTYPE_TEMPLATE \ - ((unsigned16_t)0x60) - -/* TOPMARGIN: Top Margin Measurement */ -#define RECTYPE_TOPMARGIN \ - ((unsigned16_t)0x28) - -/* TXO: Text Object */ -#define RECTYPE_TXO \ - ((unsigned16_t)0x1B6) - -/* UDDESC: Description String for Chart Autoformat */ -#define RECTYPE_UDDESC \ - ((unsigned16_t)0xDF) - -/* UNCALCED: Recalculation Status */ -#define RECTYPE_UNCALCED \ - ((unsigned16_t)0x5E) - -/* USERBVIEW: Workbook Custom View Settings */ -#define RECTYPE_USERBVIEW \ - ((unsigned16_t)0x1A9) - -/* USERSVIEWBEGIN: Custom View Settings */ -#define RECTYPE_USERSVIEWBEGIN \ - ((unsigned16_t)0x1AA) - -/* USERSVIEWEND: End of Custom View Records */ -#define RECTYPE_USERSVIEWEND \ - ((unsigned16_t)0x1AB) - -/* USESELFS: Natural Language Formulas Flag */ -#define RECTYPE_USESELFS \ - ((unsigned16_t)0x160) - -/* VCENTER: Center Between Vertical Margins */ -#define RECTYPE_VCENTER \ - ((unsigned16_t)0x84) - -/* VERTICALPAGEBREAKS: Explicit Column Page Breaks */ -#define RECTYPE_VERTICALPAGEBREAKS \ - ((unsigned16_t)0x1A) - -/* WINDOW1: Window Information */ -#define RECTYPE_WINDOW1 \ - ((unsigned16_t)0x3D) - -/* WINDOW2: Sheet Window Information */ -#define RECTYPE_WINDOW2 \ - ((unsigned16_t)0x23E) - -/* WINDOWPROTECT: Windows Are Protected */ -#define RECTYPE_WINDOWPROTECT \ - ((unsigned16_t)0x19) - -/* WRITEACCESS: Write Access User Name */ -#define RECTYPE_WRITEACCESS \ - ((unsigned16_t)0x5C) - -/* WRITEPROT: Workbook Is Write-Protected */ -#define RECTYPE_WRITEPROT \ - ((unsigned16_t)0x86) - -/* WSBOOL: Additional Workspace Information */ -#define RECTYPE_WSBOOL \ - ((unsigned16_t)0x81) - -/* XCT: CRN Record Count */ -#define RECTYPE_XCT \ - ((unsigned16_t)0x59) - -/* XF: Extended Format */ -#define RECTYPE_XF \ - ((unsigned16_t)0xE0) - -/* XL5MODIFY: Flag for DSF */ -#define RECTYPE_XL5MODIFY \ - ((unsigned16_t)0x162) - -/* TOOLBARHDR: Not documented */ -#define RECTYPE_TOOLBARHDR \ - ((unsigned16_t)0xbf) - -/* TOOLBAREND: Not documented */ -#define RECTYPE_TOOLBAREND \ - ((unsigned16_t)0xc0) - -/* TOOLBAREND: Not documented */ -#define RECTYPE_MERGEDCELLS \ - ((unsigned16_t)0xe5) - -#endif //RECTYPES_H - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: rectypes.h,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:51 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/reference/xlslibRefGuide.pdf b/uppdev/XLS/reference/xlslibRefGuide.pdf deleted file mode 100644 index 7f74c5b49..000000000 Binary files a/uppdev/XLS/reference/xlslibRefGuide.pdf and /dev/null differ diff --git a/uppdev/XLS/reference/xlslibRefManual.xls b/uppdev/XLS/reference/xlslibRefManual.xls deleted file mode 100644 index 5a6d369ae..000000000 Binary files a/uppdev/XLS/reference/xlslibRefManual.xls and /dev/null differ diff --git a/uppdev/XLS/row.cpp b/uppdev/XLS/row.cpp deleted file mode 100644 index b3c90d1ba..000000000 --- a/uppdev/XLS/row.cpp +++ /dev/null @@ -1,201 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/row.cpp,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#include - -using namespace std; -using namespace xlslib_core; - -/* -****************************** -CRow class implementation -****************************** -*/ - - - -CRow::CRow(unsigned16_t rownum, - unsigned16_t firstcol, - unsigned16_t lastcol, - unsigned16_t rowheight) -{ - SetRecordType(RECTYPE_ROW); - AddValue16(rownum); - AddValue16(firstcol); - AddValue16((lastcol+1)); - AddValue16(rowheight); - - // A field used by MS for "optimizing" (?) the loading of a file. - // Doc says it shall be set to 0 if I'm creating a BIFF... - AddValue16(0); - // A reserved value: - AddValue16(0); - - // TODO: The following flag-word can be used for outline cells. Later. - // As a defaule the GhostDirty flag is is set, so the row has a default - // format (set by the index of byte 18). - if(rowheight == ROW_DFLT_HEIGHT) - { - AddValue16((unsigned16_t)(ROW_DFLT_GRBIT)); - } - else - { - AddValue16((unsigned16_t)(ROW_DFLT_GRBIT|ROW_GRBIT_UNSYNC)); - } - AddValue16((unsigned16_t)ROW_DFLT_IXFE); - - - SetRecordLength(GetDataSize()-4); -} - -// NOTE: row_t has not a height field -CRow::CRow(row_t& rowdef) -{ - SetRecordType(RECTYPE_ROW); - AddValue16(rowdef.rownum); - AddValue16(rowdef.firstcol); - AddValue16((rowdef.lastcol+1)); - AddValue16(ROW_DFLT_HEIGHT); - - // A field used by MS for "optimizing" (?) the loading of a file. - // Doc says it shall be set to 0 if I'm creating a BIFF... - AddValue16((unsigned16_t)0); - // A reserved value: - AddValue16((unsigned16_t)0); - - // TODO: The following flag-word can be used for outline cells. Later. - // As a defaule the GhostDirty flag is is set, so the row has a default - // format (set by the index of byte 18). - AddValue16((unsigned16_t)(ROW_DFLT_GRBIT|ROW_GRBIT_UNSYNC)); - AddValue16((unsigned16_t)ROW_DFLT_IXFE); - - - SetRecordLength(GetDataSize()-4); -} - - -CRow::~CRow() -{ -} - - -/* -****************************** -****************************** -*/ -void CRow::SetFirstCol(unsigned16_t firstcol) -{ - SetValueAt((signed16_t)firstcol, ROW_OFFSET_FIRSTCOL); -} - -/* -****************************** -****************************** -*/ -void CRow::SetLastCol(unsigned16_t lastcol) -{ - SetValueAt((signed16_t)lastcol, ROW_OFFSET_LASTCOL); -} - -/* -****************************** -****************************** -*/ -unsigned16_t CRow::GetFirstCol(void) -{ - - signed16_t firstcol; - GetValue16From(&firstcol,ROW_OFFSET_FIRSTCOL); - return (unsigned16_t)firstcol; - -} - -/* -****************************** -****************************** -*/ -unsigned16_t CRow::GetLastCol(void) -{ - signed16_t lastcol; - GetValue16From(&lastcol,ROW_OFFSET_LASTCOL); - return (unsigned16_t)lastcol; -} - - - - - -/* -****************************** -CDBCell class implementation -****************************** -*/ - -CDBCell::CDBCell(unsigned32_t startblock) -{ - - // The new initializated DBCell record points to nowhere and has no - // extra rows (the array of stream offsets is empty); - SetRecordType(RECTYPE_DBCELL); - AddValue32((unsigned32_t) startblock); - - - - SetRecordLength(GetDataSize()-4); -} - -CDBCell::~CDBCell() -{ -} - - -void CDBCell::AddRowOffset(unsigned16_t rowoffset) -{ - - AddValue16((unsigned16_t) rowoffset); - SetRecordLength(GetDataSize()-4); - -} - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: row.cpp,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:53 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/row.h b/uppdev/XLS/row.h deleted file mode 100644 index cfddc3671..000000000 --- a/uppdev/XLS/row.h +++ /dev/null @@ -1,179 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/row.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#ifndef ROW_H -#define ROW_H - -#include -#include -#include - -/* -****************************** -CRow class declaration -****************************** -*/ - -namespace xlslib_core -{ - -#define ROW_DFLT_HEIGHT ((unsigned16_t)0x0108) -#define ROW_DFLT_GRBIT ((unsigned16_t)0x0080) -#define ROW_GRBIT_UNSYNC ((unsigned16_t)0x0040) -#define ROW_DFLT_IXFE ((unsigned16_t)0x000f) -#define ROW_OFFSET_FIRSTCOL ((unsigned32_t)6) -#define ROW_OFFSET_LASTCOL ((unsigned32_t)8) -#define ROW_MASK_STDHEIGHT ((unsigned16_t)0x0108) -#define ROW_RECORD_SIZE (20) - - class rowheight_t - { - public: - rowheight_t() {}; - rowheight_t(unsigned16_t rownum, unsigned16_t rowheight) - : num(rownum), height(rowheight) {} - ~rowheight_t() {}; - - unsigned16_t GetRowNum() {return num;}; - void SetRowNum(unsigned16_t rownum) {num = rownum;}; - - unsigned16_t GetRowHeight() {return height;}; - void SetRowHeight(unsigned16_t rowheight) {height = rowheight;}; - - bool operator<(const rowheight_t& right) const{ - return (num < right.num); - }; - - bool operator>(const rowheight_t& right) const{ - return (num > right.num); - }; - - bool operator==(const rowheight_t& right) const{ - return (num == right.num); - }; - - bool operator!=(const rowheight_t& right) const{ - return (num != right.num); - }; - - - private: - unsigned16_t num; - unsigned16_t height; - }; - - struct rowheightsort - { - public: -bool operator()(rowheight_t* const &a, rowheight_t* const &b) const - { - return (a->GetRowNum() < b->GetRowNum()); - }; - }; - - typedef std::set RowHeight_List_t; - typedef RowHeight_List_t::iterator RowHeight_List_Itor_t; - - - - // NOTE: row_t has not a height field - typedef struct - { - unsigned16_t rownum; - unsigned16_t firstcol; - unsigned16_t lastcol; - }row_t; - typedef std::list Row_List_t; - typedef Row_List_t::iterator Row_List_Itor_t; - - - class CRow: public CRecord - { - private: - - public: - CRow(unsigned16_t rownum, - unsigned16_t firstcol, - unsigned16_t lastcol, - unsigned16_t rowheight = ROW_DFLT_HEIGHT); - CRow(row_t& rowdef); - - ~CRow(); - - void SetFirstCol(unsigned16_t firstrow); - void SetLastCol(unsigned16_t lastrow); - unsigned16_t GetFirstCol(void); - unsigned16_t GetLastCol(void); - - - - }; - - - /* -****************************** -CDBCell class declaration -****************************** -*/ - -#define DBC_DFLT_STARTBLOCK ((unsigned32_t)(0x00000000)) - - class CDBCell: public CRecord - { - private: - - public: - CDBCell(unsigned32_t startblock = DBC_DFLT_STARTBLOCK); - ~CDBCell(); - - void AddRowOffset(unsigned16_t rowoffset ); - - }; - - -} - -#endif //ROW_H - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: row.h,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:46 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/sheetrec.cpp b/uppdev/XLS/sheetrec.cpp deleted file mode 100644 index 26b39ec6a..000000000 --- a/uppdev/XLS/sheetrec.cpp +++ /dev/null @@ -1,1176 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/sheetrec.cpp,v $ - * $Revision: 1.3 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#include - -using namespace std; -using namespace xlslib_core; - - -/* - * LOCAL MODULE MACROS - */ - - -#if STORAGE_CELL==LIST_CONTAINER - -#define MARK_CELLS_UNSORTED() { \ - m_CellsSorted = false; \ - m_SizesCalculated = false; \ - m_RBSizes.clear(); \ -} - - -#elif STORAGE_CELL==SET_CONTAINER - -#define MARK_CELLS_UNSORTED() { \ - m_CellsSorted = false; \ - m_SizesCalculated = false; \ - m_RBSizes.clear(); \ -} - - -#endif - -#define MAX_ROWBLOCK_SIZE (32) - -#define RB_DBCELL_MINSIZE (unsigned8_t(8)) -#define RB_DBCELL_CELLSIZEOFFSET (unsigned8_t(2)) - - -using namespace std; - -/* -********************************************************************** -worksheet class implementation -********************************************************************** -*/ - - -worksheet::worksheet(CGlobalRecords* pglobalrec) - : m_DumpState(SHEET_INIT), m_pCurrentData(NULL), - m_Size(0), - m_CellsSorted(false), - m_SizesCalculated(false), - m_DumpRBState(RB_INIT), - m_DBCellOffset(0), - m_CurrentRowBlock(0) -{ - m_pGlobalRecords = pglobalrec; - - minRow = minCol = 0xFFFF; // UINT16_MAX - maxRow = maxCol = 0; -} -#ifdef HAVE_ICONV -worksheet::worksheet(CGlobalRecords* pglobalrec, string& code) - : m_DumpState(SHEET_INIT), m_pCurrentData(NULL), - m_Size(0), - m_CellsSorted(false), - m_SizesCalculated(false), - m_DumpRBState(RB_INIT), - m_DBCellOffset(0), - m_CurrentRowBlock(0) -{ - m_pGlobalRecords = pglobalrec; - - minRow = minCol = 0xFFFF; // UINT16_MAX - maxRow = maxCol = 0; - iconv_code = code; -} -#endif - - -worksheet::~worksheet() -{ - if(!m_RBSizes.empty()) - for(RBSize_List_Itor_t rbs = m_RBSizes.begin(); rbs != m_RBSizes.end(); rbs++) - delete *rbs; - - // Delete the dinamically created cell objects (pointers) - - if(!m_Cells.empty()) - { -// cout<<"worksheet::~worksheet(), this = "<AddDBCellOffset(dbcelloffset); - - // Update the offset for the next DBCELL's offset - rb_size_acc += dbcell_size; - } - - m_DumpState = SHEET_DIMENSION; // Change to the next state - - break; - } - - case SHEET_DIMENSION: - XTRACE("\tDIMENSION"); - - repeat = false; - - //Delete_Pointer(m_pCurrentData); - m_pCurrentData = (CUnit*)(new CDimension(minRow, maxRow, minCol, maxCol)); - m_DumpState = SHEET_ROWBLOCKS; - break; - - case SHEET_ROWBLOCKS: - XTRACE("\tROWBLOCKS"); - if(GetNumRowBlocks()) - {// First check if the list of RBs is not empty... - - m_pCurrentData = RowBlocksDump(); - - if(m_pCurrentData == NULL) - { - - repeat = true; - m_DumpState = SHEET_MERGED; - - } - - } - else - {// if the list is empty, change the dump state. - repeat = true; - m_DumpState = SHEET_MERGED; - - } - - break; - case SHEET_MERGED: - - repeat = false; - XTRACE("\tMERGED"); - - if(!m_MergedRanges.empty()) - { - m_pCurrentData = (CUnit*)(new CMergedCells()); - ((CMergedCells*)m_pCurrentData)->SetNumRanges(m_MergedRanges.size()); - for(Range_List_Itor_t mr = m_MergedRanges.begin(); mr != m_MergedRanges.end(); mr++) - { - ((CMergedCells*)m_pCurrentData)->AddRange(*mr); - } - - } - else - { - repeat = true; - } - - m_DumpState = SHEET_COLINFO; - break; - - case SHEET_COLINFO: - repeat = false; - XTRACE("\tCOLINFO"); - - if(!m_Colinfos.empty()) - {// First check if the list of fonts is not empty... - - //Delete_Pointer(m_pCurrentData); - m_pCurrentData = (CUnit*)(new CColInfo(*m_Current_Colinfo)); - - if(m_Current_Colinfo != (--m_Colinfos.end())) - {// if it was'nt the last font from the list, increment to get the next one - m_Current_Colinfo++; - } - else - {// if it was the last from the list, change the DumpState - m_DumpState = SHEET_WINDOW2; - m_Current_Colinfo = m_Colinfos.begin(); - } - } - else - {// if the list is empty, change the dump state. - m_DumpState = SHEET_WINDOW2; - //font = m_Fonts.begin(); - repeat = true; - } - break; - - case SHEET_WINDOW2: - XTRACE("\tWINDOW2"); - repeat = false; - //Delete_Pointer(m_pCurrentData); - m_pCurrentData = (CUnit*)(new CWindow2()); - m_DumpState = SHEET_EOF; - - break; - - case SHEET_EOF: - XTRACE("\tEOF"); - //Delete_Pointer(m_pCurrentData); - m_pCurrentData = (CUnit*)(new CEof()); - m_DumpState = SHEET_FINISH; - break; - - case SHEET_FINISH: - XTRACE("\tFINISH"); - //Delete_Pointer(m_pCurrentData); - m_pCurrentData = NULL; - m_DumpState = SHEET_INIT; - - break; - - - - } - - }while(repeat); - - return m_pCurrentData; -} - - -CUnit* worksheet::RowBlocksDump() -{ - bool repeat = false; - CUnit* rb_record = NULL; - - do - { - switch(m_DumpRBState) - { - case RB_INIT: - m_DumpRBState = RB_ROWS; - m_CurrentRowBlock = 0; - m_RowCounter = 0; - m_CurrentCell = m_Cells.begin(); - - // Initialize the row widths - - m_Current_RowHeight = m_RowHeights.begin(); - m_DumpRBState = RB_FIRST_ROW; - repeat = true; - - break; - case RB_FIRST_ROW: - repeat = true; - - if( m_Cells.empty() || m_CurrentCell != m_Cells.end()) - { - m_Starting_RBCell = m_CurrentCell; - m_CellCounter = 0; - m_DBCellOffset = 0; - m_CellOffsets.clear(); - - m_DumpRBState = RB_ROWS; - - } - else - { - m_DumpRBState = RB_FINISH; - - } - break; - - case RB_ROWS: - { - repeat = false; - - // Initialize first/last cols to impossible values - // that are appropriate for the following detection algorithm - unsigned16_t first_col = (unsigned16_t)(-1); - unsigned16_t last_col = 0; - unsigned16_t row_num = 0; - - // Get the row number for the current row - row_num = (*m_CurrentCell)->GetRow(); - - Cell_List_Itor_t this_cell, next_cell; - do - { - - // Determine the first/last column of the current row - if((*m_CurrentCell)->GetCol() > last_col) - last_col = (*m_CurrentCell)->GetCol(); - - if((*m_CurrentCell)->GetCol() < first_col) - first_col = (*m_CurrentCell)->GetCol(); - - - // To avoid dereference an empty iterator check if this is the only one cell - // in m_Cells list. - if(m_Cells.size() > 1) - { - m_CellCounter++; - - this_cell = m_CurrentCell; - next_cell = ++m_CurrentCell; - - // Break the while if there are no more cells - if(next_cell == m_Cells.end()) - break; - } - else - { - // Break the loop if this was the only cell. - - - if(!m_Cells.empty()) - - { - - m_CellCounter++; - - ++m_CurrentCell; - - } - - break; - } - - - - // The order in the following and-statement is important - }while( m_CurrentCell != (m_Cells.end()) && *(*this_cell) == *(*next_cell )); - - // Check if the current row is in the list of height-set - // rows. - if(m_Current_RowHeight != m_RowHeights.end()) - { - - if((*m_Current_RowHeight)->GetRowNum() == row_num) - { - - rb_record = (CUnit*) (new CRow(row_num, first_col, - last_col, - (*m_Current_RowHeight)->GetRowHeight()) ); - - m_Current_RowHeight++; - } - else - { - rb_record = (CUnit*) (new CRow(row_num, first_col, last_col) ); - } - } - else - { - rb_record = (CUnit*) (new CRow(row_num, first_col, last_col) ); - } - - - - m_DBCellOffset += ROW_RECORD_SIZE; - - // If the current row-block is full OR there are no more cells - if(++m_RowCounter >= MAX_ROWBLOCK_SIZE || m_CurrentCell == m_Cells.end()) - { - if (m_CurrentCell == (--m_Cells.end())) - m_CellCounter++; - m_RowCounter = 0; - m_DumpRBState = RB_FIRSTCELL; - } - - - break; - } - - case RB_FIRSTCELL: - rb_record = (*m_Starting_RBCell)->GetData(); - - // Update the offset to be used in the DBCell Record - m_DBCellOffset += rb_record->GetDataSize(); - - // The first cell of the rowblock has an offset that includes (among others) - // the rows size (without counting the first row) - m_CellOffsets.push_back(m_DBCellOffset -ROW_RECORD_SIZE); - - // Update the pointer (iterator) to the next cell - if(--m_CellCounter == 0) - {// The RowBlock's cells are done - m_DumpRBState = RB_DBCELL; - } - else - { - - m_Starting_RBCell++; - m_DumpRBState = RB_CELLS; - } - - - break; - - case RB_CELLS: - repeat = false; - - if(m_CellCounter == 0) - {// The RowBlock's cells are done - - - - m_DumpRBState = RB_DBCELL; - - repeat = true; - } - else - { - - - rb_record = (*m_Starting_RBCell)->GetData(); - - m_DBCellOffset += rb_record->GetDataSize(); - - m_CellOffsets.push_back(rb_record->GetDataSize()); - - - - m_CellCounter--; - - - - m_Starting_RBCell++; - } - - - - break; - - case RB_DBCELL: - { - - repeat = false; - - - rb_record = (CUnit*)(new CDBCell(m_DBCellOffset)); - - CellOffsets_List_Itor_t celloffset; - for(celloffset = m_CellOffsets.begin(); celloffset != m_CellOffsets.end(); celloffset++) - ((CDBCell*)rb_record)->AddRowOffset(*celloffset); - - if(m_CurrentCell == (--m_Cells.end()) ) - m_DumpRBState = RB_FINISH; - else - m_DumpRBState = RB_FIRST_ROW; - - break; - } - case RB_FINISH: - repeat = false; - rb_record = NULL; - m_DumpRBState = RB_INIT; - - - break; - - default: - break; - - } - - - }while(repeat); - - return rb_record; - -} -/* -*********************************** -*********************************** -*/ - -cell_t* worksheet::label(unsigned16_t row, unsigned16_t col, - string strlabel, xf_t* pxformat) -{ - label_t* label = new label_t(row, col, strlabel, pxformat); - AddCell((cell_t*)label); - - return (cell_t*)label; - - -} - -#if VERSION_BIFF == VERSION_BIFF8 -cell_t* worksheet::label(unsigned16_t row, unsigned16_t col, - ustring strlabel, xf_t* pxformat) -{ - label_t* label = new label_t(row, col, strlabel -#ifdef HAVE_ICONV - , iconv_code -#endif - , pxformat); - AddCell((cell_t*)label); - - return (cell_t*)label; - -} -#endif - - -cell_t* worksheet::number(unsigned16_t row, unsigned16_t col, - double numval, format_number_t fmtval, - xf_t* pxformat) -{ - number_t* number = new number_t(row, col, numval, pxformat); - AddCell((cell_t*)number); - number->format(fmtval); - return (cell_t*)number; - -} - -/* -*********************************** -*********************************** -*/ - -cell_t* worksheet::blank(unsigned16_t row, unsigned16_t col, xf_t* pxformat) -{ - blank_t* blank = new blank_t(row, col, pxformat); - AddCell((cell_t*)blank); - - return (cell_t*)blank; -} - - - -/* -*********************************** -*********************************** -*/ - -void worksheet::AddCell(cell_t* pcell) -{ - - Cell_List_Itor_t existing_cell; - - unsigned32_t row, col; - - row = pcell->GetRow(); - col = pcell->GetCol(); - - if(row < minRow) minRow = row; - if(row > maxRow) maxRow = row; - if(col < minCol) minCol = col; - if(col > maxCol) maxCol = col; - - // Pass a pointer to m_GlobalRecords, so the global records - // can be modified from the cell as needed - pcell->SetGlobalRecs(m_pGlobalRecords); - - SortCells(); - // lookup the cell - existing_cell = m_Cells.find(pcell); - - if(existing_cell != m_Cells.end()) - { - //Always overwrite - delete (*existing_cell); - m_Cells.erase(existing_cell); - m_Cells.insert(pcell); - MARK_CELLS_UNSORTED(); - } - else - { - m_Cells.insert(pcell); - MARK_CELLS_UNSORTED(); - } - -} - -cell_t* worksheet::FindCell(unsigned16_t row, unsigned16_t col) -{ - Cell_List_Itor_t existing_cell; - - cell_t* cell = new blank_t(row, col); - existing_cell = m_Cells.find(cell); - delete cell; - - // The find operation returns the end() itor - // if the cell wasn't found - if(existing_cell != m_Cells.end()) - return *existing_cell; - else - { - - return blank(row,col); - } -} -/* - void worksheet::AddCell(cell_t* pcell, bool overwrite) - { - - #if STORAGE_CELL == LIST_CONTAINER - m_Cells.push_back(pcell); - - #elif STORAGE_CELL == SET_CONTAINER - m_Cells.insert(pcell); - #endif - MARK_CELLS_UNSORTED(); - } -*/ -/* -*********************************** -*********************************** -*/ - - -unsigned32_t worksheet::GetSize() -{ - m_CurrentSizeCell = m_Cells.begin(); - unsigned32_t numrb = GetNumRowBlocks(); - unsigned16_t merged_size; - unsigned16_t colinfo_size; - - - // The size of the merged cells record (if any) has to be taken in count - if(!m_MergedRanges.empty()) - { - // [HEADER] + [NUMRANGESFIELD] + [RANGES] - merged_size = 4 + 2 + m_MergedRanges.size()*8; - } - else - { - merged_size = 0; - } - - // The size of the Colinfo records (if any) has to be taken in count - if(!m_Colinfos.empty()) - { - colinfo_size = m_Colinfos.size()*14; - } - else - { - colinfo_size = 0; - } - - - unsigned32_t size = BOF_SIZE + - RB_INDEX_MINSIZE + - 4*numrb + - merged_size + - colinfo_size + - WINDOW2_SIZE + - EOF_SIZE; - - for(unsigned32_t rb = 0; rb < numrb; rb++) - { - // Get sizes of next RowBlock - unsigned32_t rowandcell_size, dbcell_size; - GetRowBlockSizes( &rowandcell_size, &dbcell_size); - - // Update the offset accumulator and cerate the next DBCELL's offset - size += rowandcell_size; - size += dbcell_size; - } - - m_CurrentSizeCell = m_Cells.begin(); - - return size; -} - -/* -*********************************** -*********************************** -*/ - -bool worksheet::GetRowBlockSizes(unsigned32_t* rowandcell_size, - unsigned32_t* dbcell_size, - unsigned32_t* num_rows) -{ - - SortCells(); - - unsigned32_t row_counter = 0; - unsigned32_t cell_counter = 0; - - Cell_List_Itor_t beginning_cell = m_CurrentSizeCell; - - // Initialize the size values (since they work as accumulators) - *rowandcell_size = 0; - *dbcell_size = 0; - - - if(!m_SizesCalculated) - { - - // Check if there are no cells - if(!m_Cells.empty()) - { - // The first cell is inside a row that has to be counted - // row_counter = 1; - - do - { - cell_counter++; // There's at least one cell on each loop.. that's for sure! - - // Since the list of cells is sorted by rows, continuouslly equal cells (compared by row) - // conform one row... if the next one is different, increment the row counter - Cell_List_Itor_t this_cell = m_CurrentSizeCell; - Cell_List_Itor_t next_cell = ++ m_CurrentSizeCell; - - // To avoid dereferencing an empty iterator check if this is the only - // one cell in m_Cells list. - if( m_Cells.size()>1) - { - if( *(*this_cell) != *(*(next_cell)) ) - row_counter++; - } - else - { - // Break the loop if this was the only one cell in the list - // .. also set the only one row - cell_counter--; - m_CurrentSizeCell = (--m_Cells.end()); - break; - - } - - }while(row_counter < MAX_ROWBLOCK_SIZE && - m_CurrentSizeCell != (--m_Cells.end())); // Check also if the currentcell isn't the last one - - // If the cells run out before the row counter changes, the last row (and last cell) isn't counted - // in the previous control structre. - if(m_CurrentSizeCell == (--m_Cells.end())) - { - row_counter++; - cell_counter++; - } - - - if(num_rows != NULL) - *num_rows += row_counter; - // Get the size of the rows - *rowandcell_size += ROW_RECORD_SIZE*row_counter; - - // Get the size of the cells using the saved iterator pointing to the beginning of this block - for(unsigned32_t count_blockcells = 0; count_blockcells GetSize(); - beginning_cell++; - } - - // Now get the size of the DBCELL - *dbcell_size += RB_DBCELL_MINSIZE; - *dbcell_size += RB_DBCELL_CELLSIZEOFFSET*cell_counter; - - - // Check the size of the data int the DBCELL record (without the header) - // to take in count the overhead of the CONTINUE record (4bytes/CONTrec) - if((*dbcell_size-4) > MAX_RECORD_SIZE) - { - unsigned32_t cont_overhead = (*dbcell_size / MAX_RECORD_SIZE); - if(*dbcell_size % MAX_RECORD_SIZE) - cont_overhead++; - - *dbcell_size += (cont_overhead-1)*4; - - } - - - rowblocksize_t* rbsize = new rowblocksize_t; - - rbsize->rowandcell_size = *rowandcell_size; - rbsize->dbcell_size = *dbcell_size; - rbsize->rows_sofar = row_counter; - m_RBSizes.push_back(rbsize); - - // If it was the last block, reset the current-label pointer - if(m_CurrentSizeCell == (--m_Cells.end())) - { - m_CurrentSizeCell = m_Cells.begin(); - m_Current_RBSize = m_RBSizes.begin(); - m_SizesCalculated = true; - - return false; - } - - - } - - // If there are no cells in the sheet, return sizes = 0. - if(m_Cells.empty()) - return false; - - else - - return true; - - } - else - { - *rowandcell_size = (*m_Current_RBSize)->rowandcell_size; - *dbcell_size = (*m_Current_RBSize)->dbcell_size; - if(num_rows != NULL) - *num_rows += (*m_Current_RBSize)->rows_sofar; - - m_Current_RBSize++; - - // Resett the current RBSize - if(m_Current_RBSize == m_RBSizes.end()) - { - m_Current_RBSize = m_RBSizes.begin(); - return false; - } - } - return true; -} - - -/* -*********************************** -*********************************** -*/ - -void worksheet::GetFirstLastRows(unsigned32_t* first_row, unsigned32_t* last_row) -{ - - // First check that the m_Cells list is not empty, so we won't dereference - // empty anr iterator. - if(!m_Cells.empty()) - { - SortCells(); - - cell_t* pcell; - pcell = *(m_Cells.begin()); - *first_row = pcell->GetRow(); - - pcell = *(--m_Cells.end()); - *last_row = pcell->GetRow(); - - - } - else - { - // If there is no cells in the list the first/last rows - // are defaulted to zero. - *first_row = 0; - *last_row = 0; - } - -} - -/* -*********************************** -*********************************** -*/ - - -unsigned32_t worksheet::GetNumRowBlocks() -{ - - unsigned32_t numrb; - - // First check that the m_Cells list is not empty, so we won't dereference - // empty anr iterator. - - bool cont = false; - unsigned32_t num_rows = 0; - do - { - unsigned32_t dummy1, dummy2; - cont = GetRowBlockSizes(&dummy1, &dummy2, &num_rows); - }while(cont); -/* - Cell_List_t temp_cell_list = m_Cells; - temp_cell_list.sort(); - temp_cell_list.unique(); -*/ - - if(!m_Cells.empty()) - { - - numrb = num_rows/MAX_ROWBLOCK_SIZE; - if(num_rows%MAX_ROWBLOCK_SIZE) - numrb++; - } - else - { - // If the m_Cell list is empty, there are no rowblocks in the sheet. - numrb = 0; - } - - return numrb; -} - -/* -*********************************** -*********************************** -*/ - -void worksheet::merge(unsigned16_t first_row, unsigned16_t first_col, - unsigned16_t last_row, unsigned16_t last_col) -{ - range_t* newrange = new range_t; - - newrange->first_row = first_row; - newrange->last_row = last_row; - newrange->first_col = first_col; - newrange->last_col = last_col; - - m_MergedRanges.push_back(newrange); - - -} - -/* -*********************************** -*********************************** -*/ - -void worksheet::colwidth(unsigned16_t col, unsigned16_t width) -{ - colinfo_t* newci = new colinfo_t; - Colinfo_List_Itor_t existing_ci; - - newci->colfirst = col; - newci->collast = col; - newci->flags = 0x00; - newci->xformat = NULL; - newci->width = width*256; //sets column widths to 1/256 x width of "0" - - // m_Colinfos.push_back(newci); - existing_ci = m_Colinfos.find(newci); - - if(existing_ci != m_Colinfos.end()) - { - //Always overwrite - delete (*existing_ci); - m_Colinfos.erase(existing_ci); - m_Colinfos.insert(newci); - } - else - { - m_Colinfos.insert(newci); - } -} - - -/* -*********************************** -*********************************** -*/ - -void worksheet::rowheight(unsigned16_t row, unsigned16_t height) -{ - rowheight_t* newrh = new rowheight_t(row,height*20); - RowHeight_List_Itor_t existing_rh; - - //m_RowHeights.insert(newrh); - - existing_rh = m_RowHeights.find(newrh); - - if(existing_rh != m_RowHeights.end()) - { - //Always overwrite - delete (*existing_rh); - m_RowHeights.erase(existing_rh); - m_RowHeights.insert(newrh); - } - else - { - m_RowHeights.insert(newrh); - } - - - -} - - -range* worksheet::rangegroup(unsigned16_t row1, unsigned16_t col1, - unsigned16_t row2, unsigned16_t col2) -{ - - range* newrange = new range(row1, col1, row2, col2, this); - m_Ranges.push_back(newrange); - - return newrange; - -} - - - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: sheetrec.cpp,v $ - * Revision 1.3 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.2 2004/09/01 00:47:04 darioglz - * + Modified to gain independence of target - * - * Revision 1.1.1.1 2004/08/27 16:31:51 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/sheetrec.h b/uppdev/XLS/sheetrec.h deleted file mode 100644 index c4cca6ab7..000000000 --- a/uppdev/XLS/sheetrec.h +++ /dev/null @@ -1,233 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/sheetrec.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#ifndef SHEETREC_H -#define SHEETREC_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace xlslib_core -{ - - /* -*********************************** -worksheet class declaration -*********************************** -*/ - - typedef enum - { - SHEET_INIT, - SHEET_BOF, - SHEET_INDEX, - SHEET_DIMENSION, - SHEET_ROWBLOCKS, - SHEET_MERGED, - SHEET_COLINFO, - SHEET_WINDOW2, - SHEET_EOF, - SHEET_FINISH - } SheetRecordDumpState_t; - - -#define BOF_SIZE ((unsigned8_t)12) -#define EOF_SIZE ((unsigned8_t)4) -#define WINDOW2_SIZE ((unsigned8_t)14) - - typedef struct - { - unsigned32_t rowandcell_size; - unsigned32_t dbcell_size; - unsigned32_t rows_sofar; - - } rowblocksize_t; - - typedef std::list RBSize_List_t; - typedef RBSize_List_t::iterator RBSize_List_Itor_t; - - typedef enum - { - RB_INIT, - RB_FIRST_ROW, - RB_ROWS, - RB_FIRSTCELL, - RB_CELLS, - RB_DBCELL, - RB_FINISH - - } DumpRowBlocksState_t; - - typedef std::list CellOffsets_List_t; - typedef CellOffsets_List_t::iterator CellOffsets_List_Itor_t; - - //class range; - class worksheet - - : public CBiffSection - - { - - private: - CGlobalRecords* m_pGlobalRecords; -#ifdef HAVE_ICONV - std::string iconv_code; -#endif - SheetRecordDumpState_t m_DumpState; - CUnit* m_pCurrentData; - // std::string m_Name; 10-1-08 not sure why here - - bool m_SizeCalculated; - size_t m_Size; - - Range_List_t m_MergedRanges; - - Colinfo_List_t m_Colinfos; - Colinfo_List_Itor_t m_Current_Colinfo; - - RowHeight_List_t m_RowHeights; - RowHeight_List_Itor_t m_Current_RowHeight; - - unsigned16_t minRow, minCol, maxRow, maxCol; - // Label related additions - - /* void AddLabel(unsigned16_t row, unsigned16_t col, - std::string& strlabel, unsigned16_t& xformat); - */ - - private: - Cell_List_t m_Cells; - Cell_List_Itor_t m_CurrentCell; // Init this one in the INIT state - Cell_List_Itor_t m_CurrentSizeCell; // Init this one in the INIT state - bool m_CellsSorted; - - RangeObj_List_t m_Ranges; - - RBSize_List_t m_RBSizes; - RBSize_List_Itor_t m_Current_RBSize; - bool m_SizesCalculated; - - DumpRowBlocksState_t m_DumpRBState; - unsigned8_t m_RowCounter; - unsigned32_t m_CellCounter; - unsigned32_t m_DBCellOffset; - CellOffsets_List_t m_CellOffsets; - - unsigned32_t m_CurrentRowBlock; - Cell_List_Itor_t m_Starting_RBCell; - - void GetFirstLastRows(unsigned32_t* first_row, unsigned32_t* last_row); - unsigned32_t GetNumRowBlocks(); - bool GetRowBlockSizes(unsigned32_t* rowandcell_size, - unsigned32_t* dbcell_size, - unsigned32_t* num_rows = NULL); - CUnit* RowBlocksDump(); - - void AddCell(cell_t* pcell); - - void SortCells(); - - public: - - worksheet(CGlobalRecords* pglobalrec); -#if HAVE_ICONV - worksheet(CGlobalRecords* pglobalrec, std::string& code); -#endif - ~worksheet(); - - // The offset defines the amount - // of data form the beginning of the BIFF records to the first - - CUnit* DumpData(unsigned32_t offset); - unsigned32_t GetSize(); - cell_t* FindCell(unsigned16_t row, unsigned16_t col); - - // Cell operations - void merge(unsigned16_t first_row, unsigned16_t first_col, - unsigned16_t last_row, unsigned16_t last_col); - void colwidth(unsigned16_t col, unsigned16_t width); - void rowheight(unsigned16_t row, unsigned16_t height); - // Ranges - range* rangegroup(unsigned16_t row1, unsigned16_t col1, - unsigned16_t row2, unsigned16_t col2); - - // Cells - cell_t* label(unsigned16_t row, unsigned16_t col, - std::string strlabel, xf_t* pxformat = NULL); - -#if VERSION_BIFF == VERSION_BIFF8 - cell_t* label(unsigned16_t row, unsigned16_t col, - std::ustring strlabel, xf_t* pxformat = NULL); -#endif - cell_t* blank(unsigned16_t row, unsigned16_t col, - xf_t* pxformat = NULL); - - cell_t* number(unsigned16_t row, unsigned16_t col, - double numval, format_number_t fmtval, - xf_t* pxformat = NULL); - }; - - typedef std::vector Sheets_Vector_t; - typedef Sheets_Vector_t::iterator Sheets_Vector_Itor_t; - -} - -#endif // SHEETREC_H - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: sheetrec.h,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:44 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - - diff --git a/uppdev/XLS/stringtok.h b/uppdev/XLS/stringtok.h deleted file mode 100644 index b94ec7217..000000000 --- a/uppdev/XLS/stringtok.h +++ /dev/null @@ -1,148 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/common/stringtok.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:53 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* - * stringtok.h -- Breaks a string into tokens. This is an example for lib3. - * - * Template function looks like this: - * - * template - * void stringtok (Container &l, - * string const &s, - * char const * const ws = " \t\n"); - * - * A nondestructive version of strtok() that handles its own memory and can - * be broken up by any character(s). Does all the work at once rather than - * in an invocation loop like strtok() requires. - * - * Container is any type that supports push_back(a_string), although using - * list and deque are indicated due to their O(1) push_back. - * (I prefer deque<> because op[]/at() is available as well.) The first - * parameter references an existing Container. - * - * s is the string to be tokenized. From the parameter declaration, it can - * be seen that s is not affected. Since references-to-const may refer to - * temporaries, you could use stringtok(some_container, readline("")) when - * using the GNU readline library. - * - * The final parameter is an array of characters that serve as whitespace. - * Whitespace characters default to one or more of tab, space, and newline, - * in any combination. - * - * 'l' need not be empty on entry. On return, 'l' will have the token - * strings appended. - * - * - * [Example: - * list ls; - * stringtok (ls, " this \t is\t\n a test "); - * for (list::const_iterator i = ls.begin(); - * i != ls.end(); ++i) - * { - * cerr << ':' << (*i) << ":\n"; - * } - * - * would print - * :this: - * :is: - * :a: - * :test: - * -end example] - * - * pedwards@jaj.com May 1999 - */ - -#include -#include // for strchr - -#include -#include - -/***************************************************************** - * This is the only part of the implementation that I don't like. - * It can probably be improved upon by the reader... - */ -namespace { - inline bool - isws (char c, char const * const wstr) - { - return (strchr(wstr,c) != NULL); - } -} - -/***************************************************************** - * Simplistic and quite Standard, but a bit slow. This should be - * templatized on basic_string instead, or on a more generic StringT - * that just happens to support ::size_type, .substr(), and so on. - * I had hoped that "whitespace" would be a trait, but it isn't, so - * the user must supply it. Enh, this lets them break up strings on - * different things easier than traits would anyhow. - */ -template -void -stringtok (Container &l, std::string const &s, char const * const ws = " \t\n") -{ - const std::string::size_type S = s.size(); - std::string::size_type i = 0; - - while (i < S) { - // eat leading whitespace - while ((i < S) && (isws(s[i],ws))) ++i; - if (i == S) return; // nothing left but WS - - // find end of word - std::string::size_type j = i+1; - while ((j < S) && (!isws(s[j],ws))) ++j; - - // add word - std::string* substr = new std::string; - *substr = s.substr(i,j-i); - l.push_back(substr); - - // set up for next loop - i = j+1; - } -} - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: stringtok.h,v $ - * Revision 1.2 2008/10/25 18:39:53 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:32:05 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/summinfo.cpp b/uppdev/XLS/summinfo.cpp deleted file mode 100644 index 086a56a00..000000000 --- a/uppdev/XLS/summinfo.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/summinfo.cpp,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#include - -#include // Temporarilly used to add data for summary info - -using namespace std; -using namespace xlslib_core; - -/* -********************************************************************** -CSummaryInfo class implementation -********************************************************************** -*/ - - -CSummaryInfo::CSummaryInfo() -{ - XTRACE("WRITE_SUMMARY"); - - CUnit* ptraildata = new CUnit; - ptraildata->AddDataArray(CSummaryInfo::summ_info_data, sizeof(CSummaryInfo::summ_info_data)); - (*this) += ptraildata; -} - -CSummaryInfo::~CSummaryInfo() -{ - - -} - - -/* -*********************************** -*********************************** -*/ - -CUnit* CSummaryInfo::DumpData(void) -{ - XTRACE("\tCSummaryInfo::DumpData"); - return (CUnit*)this; - -} - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: summinfo.cpp,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:57 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/summinfo.h b/uppdev/XLS/summinfo.h deleted file mode 100644 index 29027650f..000000000 --- a/uppdev/XLS/summinfo.h +++ /dev/null @@ -1,82 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/summinfo.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - - -#ifndef SUMMARYINFO_H -#define SUMMARYINFO_H - -#include -#include -#include - - -namespace xlslib_core -{ - - /* -******************************** -CSummaryInfo class declaration -******************************** -*/ - - - class CSummaryInfo: public CDataStorage - { - private: - static const unsigned8_t summ_info_data[]; - - protected: - - public: - CSummaryInfo(); - ~CSummaryInfo(); - - CUnit* DumpData(); - - }; - -} -#endif //SUMMARYINFO_H - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: summinfo.h,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:49 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/systype.h b/uppdev/XLS/systype.h deleted file mode 100644 index 9ece447a6..000000000 --- a/uppdev/XLS/systype.h +++ /dev/null @@ -1,282 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/common/systype.h,v $ - * $Revision: 1.3 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:53 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef SYSTYPE_H -#define SYSTYPE_H - -#if defined(_MSC_VER) && defined(WIN32) -#pragma warning(disable: 4786) // Long debug information related to STL -#pragma warning(disable: 4290) // C++ Exception Specification ignored -#endif - -//# define PHPEXT_TSRMLS_C tsrm_ls -//# define PHPEXT_TSRMLS_D void ***tsrm_ls - -// Global includes -#include -#include -#include -#include -#include // DFH 10-2-08 -#include -#include -#include -#include - -#define INLINE inline - -//#define NULL ((void*)(0)) - -#define NO_ERRORS 0 -#define FILE_ERROR -1 -#define GENERAL_ERROR ((signed8_t)-100) - -#define PTYPE_DIRECTORY ((unsigned8_t)(0x01)) -#define PTYPE_FILE ((unsigned8_t)(0x02)) -#define PTYPE_ROOT ((unsigned8_t)(0x05)) - -#define PCOLOR_BLACK ((unsigned8_t)(0x01)) -#define PCOLOR_RED ((unsigned8_t)(0x00)) - -#define PLINK_EMPTY ((signed32_t)(-1)) -#define PBLOCK_END ((signed32_t)(-2)) - - -#if USE_ALLOCATOR==ALLOCATOR_STL -#define XLSLIB_DFLT_ALLOCATOR - -#elif USE_ALLOCATOR==ALLOCATOR_BTI -#include "bti_thread_alloc.h" -#define XLSLIB_DFLT_ALLOCATOR ,bti::thr_alloc - -#else -# error ERROR: Invalid allocator option -#endif - -#ifdef uint32_t // if we have this one we will have all the others too - -typedef unsigned char unsigned8_t; -typedef unsigned short int unsigned16_t; -typedef unsigned int unsigned32_t; - -typedef char signed8_t; -typedef short int signed16_t; -typedef int signed32_t; - -#else - -typedef uint8_t unsigned8_t; -typedef uint16_t unsigned16_t; -typedef uint32_t unsigned32_t; - -typedef int8_t signed8_t; -typedef int16_t signed16_t; -typedef int32_t signed32_t; - -#endif - -#if defined(_MSC_VER) && defined(WIN32) - -typedef wchar_t uchar_t; -#define ustring wstring -//typedef wstring ustring; - -#elif defined(__FRAMEWORK__) // For Mac-OSX - -#undef HAVE_ICONV - -#if ! defined(unichar) -typedef uint16_t unichar; -#endif - -typedef unichar uchar_t; -//typedef std::basic_string ustring; -#define ustring basic_string - - -#else - -typedef wchar_t uchar_t; -#define ustring wstring -typedef std::basic_string u16string; - -#endif - - -#if defined(_MSC_VER) && defined(WIN32) - -typedef __int64 unsigned64_t; - -#else // not windows - -#ifdef _UINT64_T - -typedef uint64_t unsigned64_t; - -#else - -typedef unsigned long long unsigned64_t; - -#endif - -#endif - -typedef std::list StringList_t; -typedef StringList_t::const_iterator StringListItor_t; - -// Macros -# define MASK_BYTE0 0x00000000000000ff -# define MASK_BYTE1 0x000000000000ff00 -# define MASK_BYTE2 0x0000000000ff0000 -# define MASK_BYTE3 0x00000000ff000000 - -#if defined(_MSC_VER) && defined(WIN32) - -# define MASK_BYTE4 0x000000ff00000000 -# define MASK_BYTE5 0x0000ff0000000000 -# define MASK_BYTE6 0x00ff000000000000 -# define MASK_BYTE7 0xff00000000000000 - -#else - -# define MASK_BYTE4 (unsigned64_t)0x000000ff00000000LL -# define MASK_BYTE5 (unsigned64_t)0x0000ff0000000000LL -# define MASK_BYTE6 (unsigned64_t)0x00ff000000000000LL -# define MASK_BYTE7 (unsigned64_t)0xff00000000000000LL - -#endif - -#define BYTE_0(num) (unsigned8_t) (num & MASK_BYTE0) -#define BYTE_1(num) (unsigned8_t)((num & MASK_BYTE1)>>0x08) -#define BYTE_2(num) (unsigned8_t)((num & MASK_BYTE2)>>0x10) -#define BYTE_3(num) (unsigned8_t)((num & MASK_BYTE3)>>0x18) - -#define BYTE_4(num) (unsigned8_t)((num & MASK_BYTE4)>>0x20) -#define BYTE_5(num) (unsigned8_t)((num & MASK_BYTE5)>>0x28) -#define BYTE_6(num) (unsigned8_t)((num & MASK_BYTE6)>>0x30) -#define BYTE_7(num) (unsigned8_t)((num & MASK_BYTE7)>>0x38) - - - -#define PROPERTY_DFLT_NOTUSED ((unsigned8_t)(0x00)) -#define PROPERTY_MAX_NAME_LENGTH ((unsigned8_t)(32)) - -#define PROPERTY_TYPE_DIR ((unsigned8_t)(0x01)) -#define PROPERTY_TYPE_FILE ((unsigned8_t)(0x02)) -#define PROPERTY_TYPE_ROOT ((unsigned8_t)(0x05)) - -#define PROPERTY_COLOR_NODE_RED ((unsigned8_t)(0x00)) -#define PROPERTY_COLOR_NODE_BLACK ((unsigned8_t)(0x01)) -#define PROPERTY_LINK_EMPTY ((signed32_t)(-1)) - -#define PPTPOS_NAME ((unsigned8_t)(0x00)) -#define PPTPOS_NAMELENGTH ((unsigned8_t)(0x40)) -#define PPTPOS_TYPE ((unsigned8_t)(0x42)) -#define PPTPOS_NODECOLOR ((unsigned8_t)(0x43)) -#define PPTPOS_PREVIOUS ((unsigned8_t)(0x44)) -#define PPTPOS_NEXT ((unsigned8_t)(0x48)) -#define PPTPOS_CHILD ((unsigned8_t)(0x4C)) -#define PPTPOS_UNUSED_EMPTY0 ((unsigned8_t)(0x50)) - - -#define PPTPOS_SECS1 ((unsigned32_t)(0x64)) -#define PPTPOS_SECS2 ((unsigned32_t)(0x68)) -#define PPTPOS_DAYS1 ((unsigned32_t)(0x6c)) -#define PPTPOS_DAYS2 ((unsigned32_t)(0x70)) - -#define PPTPOS_STARTBLOCK ((unsigned8_t)(0x74)) -#define PPTPOS_SIZE ((unsigned8_t)(0x78)) - - -#define PPT_DFLT_SECS1 ((signed32_t)(0)) -#define PPT_DFLT_SECS2 ((signed32_t)(0)) -#define PPT_DFLT_DAYS1 ((signed32_t)(0)) -#define PPT_DFLT_DAYS2 ((signed32_t)(0)) - - -// More macros - -/* -**************************************** -**************************************** -*/ -#define Delete_Pointer(pt) { \ - if(pt != NULL) \ - { \ - delete pt; \ - pt = NULL; \ - } \ -} - - -/* -**************************************** -**************************************** -*/ -#ifdef __DEBUG__ -#define XTRACE(str) { \ - cout<<"DEBUG: "<. - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/common/timespan.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:53 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef TIMESPAN_H -#define TIMESPAN_H - -#include -#include - -#include -#include - -class CCpuClockTimespan -{ - enum - { INVALID_VALUE = -1, }; - - public: - CCpuClockTimespan() - : m_clockStart( INVALID_VALUE), - m_nUsedClockTicks( INVALID_VALUE) - {} - ~CCpuClockTimespan() - {} - - void StartClock() - { - // the clock is already started !!! - // stop it first !!! - assert( m_clockStart == (clock_t)INVALID_VALUE); - m_nUsedClockTicks = (clock_t)INVALID_VALUE; - m_clockStart = clock(); - } - - void StopClock() - { - const clock_t clockStop = clock(); - - // start the clock first !!! - assert( m_clockStart != (clock_t)INVALID_VALUE); - m_nUsedClockTicks = clockStop - m_clockStart; - - // after this, we can start it again !!! - m_clockStart = INVALID_VALUE; - } - - unsigned long GetUsedMilliseconds() const - { - const int MILLISECONDS_PER_SECOND = 1000; - - // the clock was never started, - // or it's started, but it has not been stopped yet - assert( m_nUsedClockTicks != (clock_t)INVALID_VALUE); - - double nSeconds = ( ( double)m_nUsedClockTicks) / CLOCKS_PER_SEC; - - const unsigned long nMilliseconds = (unsigned long)(nSeconds * MILLISECONDS_PER_SECOND); - - return nMilliseconds; - } - - private: - - // when did we Start to measure - // clock time? - clock_t m_clockStart; - - // the used clock ticks, from Start to Stop - clock_t m_nUsedClockTicks; -}; - -#endif //TIMESPAN_H - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: timespan.h,v $ - * Revision 1.2 2008/10/25 18:39:53 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:32:05 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/tostr.h b/uppdev/XLS/tostr.h deleted file mode 100644 index af52967bd..000000000 --- a/uppdev/XLS/tostr.h +++ /dev/null @@ -1,171 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/tostr.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 19:08:52 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -#ifndef TOSTR_H -#define TOSTR_H - -#include -#include -#include - -#include - -// forward declaration -struct str_stream; - -// ... helper - allow explicit conversion to string -class as_string {}; -inline std::ostream & operator<< ( std::ostream & streamOut, const as_string &) -{ - return streamOut; -} - -namespace Private -{ - // what should we return when calling write_to_stream ? - template< class type> - struct return_from_write_to_stream - { - typedef const str_stream & return_type; - }; - - template<> - struct return_from_write_to_stream< as_string> - { - typedef std::string return_type; - }; - - // forward declaration - template< class type> - inline typename return_from_write_to_stream< type>::return_type - write_to_stream ( const str_stream & streamOut, const type & value); -} - - -// forward declaration -template< class type> -inline typename Private::return_from_write_to_stream< type>::return_type operator<< ( const str_stream & streamOut, const type & value); - -// str_stream - allow stream usage, and then conversion to string -struct str_stream -{ - // default construction - str_stream(){} - - // allow to_string like usage - template< class type> - str_stream( const type & value) - { - *this << value; - } - - std::stringstream & underlying_stream() const - { return m_streamOut; } - - operator std::string() const - { - return m_streamOut.str(); - } - - private: - mutable std::stringstream m_streamOut; - -#ifndef NDEBUG - public: - void recalculate_string() const - { m_string = m_streamOut.str(); } - private: - mutable std::string m_string; -#endif - -}; - -namespace Private -{ - template< class type> - inline typename return_from_write_to_stream< type>::return_type - write_to_stream ( const str_stream & streamOut, const type & value) - { - streamOut.underlying_stream() << value; -#ifndef NDEBUG - streamOut.recalculate_string(); -#endif - return streamOut; - } -} - -template< class type> -inline typename Private::return_from_write_to_stream< type>::return_type operator<< ( const str_stream & streamOut, const type & value) -{ - return Private::write_to_stream( streamOut, value) ; -} - - -// allow function IO manipulators -inline const str_stream & operator<< ( const str_stream & streamOut, std::ios_base & (*func)( std::ios_base&) ) -{ - func( streamOut.underlying_stream()); - return streamOut; -} - -inline const str_stream & operator<< ( const str_stream & streamOut, std::basic_ios< char> & (*func)( std::basic_ios< char> &) ) -{ - func( streamOut.underlying_stream()); - return streamOut; -} - -inline const str_stream & operator<< ( const str_stream & streamOut, std::ostream & (*func)( std::ostream &) ) -{ - func( streamOut.underlying_stream()); - return streamOut; -} - - - -#endif //TOSTR_H -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: tostr.h,v $ - * Revision 1.2 2008/10/25 19:08:52 dhoerl - * Updated header - * - * Revision 1.1.1.1 2004/08/27 16:31:54 darioglz - * Initial Import. - * - * Revision 1.2 2004/01/29 03:18:55 dgonzalez - * + Using the config.h file - * - * Revision 1.1 2003/12/02 18:15:06 dgonzalez - * + Initial version. Added to handle signatures of objects - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/unit.cpp b/uppdev/XLS/unit.cpp deleted file mode 100644 index 6b73777f7..000000000 --- a/uppdev/XLS/unit.cpp +++ /dev/null @@ -1,662 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/unit.cpp,v $ - * $Revision: 1.3 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#include -#include - -using namespace std; -using namespace xlslib_core; - -/* -********************************************************************************* -********************************************************************************* -CUnit class implementation -********************************************************************************* -********************************************************************************* -*/ - -// Default constructor -CUnit::CUnit() : m_nSize(0), m_pData(0), m_nDataSize(0) - //, m_ShadowUnit(false) -{ - -} - -// Default destructor -CUnit::~CUnit ( ) -{ - if(m_pData /*&& !m_ShadowUnit*/) - { - delete[] m_pData; - } - -} -/************************************************ - ************************************************/ - -const unsigned8_t CUnit::DefaultInflateSize = 10; - -/************************************************ - ************************************************/ - -signed8_t CUnit::SetAt(unsigned8_t newval, unsigned32_t index) -{ - signed8_t errcode = NO_ERRORS; - - if(m_pData != NULL) - { - if (index < m_nDataSize) - m_pData[index] = newval; - else - errcode = ERR_INVALID_INDEX; - } else { - errcode = ERR_DATASTORAGE_EMPTY; - } - - return errcode; -} - -/************************************************ - ************************************************/ - -signed8_t CUnit::AddValue16(unsigned16_t newval) -{ - signed8_t errcode = NO_ERRORS; - - if(AddValue8(BYTE_0(newval))) errcode = GENERAL_ERROR; - if(AddValue8(BYTE_1(newval))) errcode = GENERAL_ERROR; - - return errcode; - -} - -/************************************************ - ************************************************/ - -signed8_t CUnit::AddValue32(unsigned32_t newval) -{ - signed8_t errcode = NO_ERRORS; - - if(AddValue8(BYTE_0(newval))) errcode = GENERAL_ERROR; - if(AddValue8(BYTE_1(newval))) errcode = GENERAL_ERROR; - if(AddValue8(BYTE_2(newval))) errcode = GENERAL_ERROR; - if(AddValue8(BYTE_3(newval))) errcode = GENERAL_ERROR; - - return errcode; - -} - -/************************************************ - ************************************************/ - -signed8_t CUnit::AddValue64(unsigned64_t newval) -{ - signed8_t errcode = NO_ERRORS; - - if(AddValue8(BYTE_0(newval))) errcode = GENERAL_ERROR; - if(AddValue8(BYTE_1(newval))) errcode = GENERAL_ERROR; - if(AddValue8(BYTE_2(newval))) errcode = GENERAL_ERROR; - if(AddValue8(BYTE_3(newval))) errcode = GENERAL_ERROR; - - if(AddValue8(BYTE_4(newval))) errcode = GENERAL_ERROR; - if(AddValue8(BYTE_5(newval))) errcode = GENERAL_ERROR; - if(AddValue8(BYTE_6(newval))) errcode = GENERAL_ERROR; - if(AddValue8(BYTE_7(newval))) errcode = GENERAL_ERROR; - - return errcode; - -} - - -/************************************************ - ************************************************/ - -signed8_t CUnit::SetValueAt(signed16_t newval, unsigned32_t index) -{ - signed8_t errcode = NO_ERRORS; - - if(SetAt(BYTE_0(newval), index )) errcode = GENERAL_ERROR; - if(SetAt(BYTE_1(newval), index+1)) errcode = GENERAL_ERROR; - - return errcode; -} - -/************************************************ - ************************************************/ - -signed8_t CUnit::SetValueAt(signed32_t newval, unsigned32_t index) -{ - signed8_t errcode = NO_ERRORS; - - if(SetAt(BYTE_0(newval), index )) errcode = GENERAL_ERROR; - if(SetAt(BYTE_1(newval), index+1)) errcode = GENERAL_ERROR; - if(SetAt(BYTE_2(newval), index+2)) errcode = GENERAL_ERROR; - if(SetAt(BYTE_3(newval), index+3)) errcode = GENERAL_ERROR; - - return errcode; -} - - -/************************************************ - ************************************************/ - -signed8_t CUnit::GetValue16From(signed16_t* val, unsigned32_t index) -{ - signed8_t errcode = NO_ERRORS; - - *val = (signed16_t)(operator[](index) + - operator[](index+1)*0x0100); - - return errcode; -} - -/************************************************ - ************************************************/ - -signed8_t CUnit::GetValue32From(signed32_t* val, unsigned32_t index) -{ - signed8_t errcode = NO_ERRORS; - - *val = (signed16_t)(operator[](index) *0x0000001 + - operator[](index+1)*0x0000100 + - operator[](index+2)*0x0010000 + - operator[](index+2)*0x1000000 ); - return errcode; -} - -/************************************************ - ************************************************/ - -signed8_t CUnit::GetAt(signed8_t* data, unsigned32_t index) -{ - signed8_t errcode = NO_ERRORS; - - if(m_pData != NULL) - { - if (index < m_nDataSize) - { - *data = m_pData[index]; - } else { - errcode = ERR_INVALID_INDEX; - } - } else { - errcode = ERR_DATASTORAGE_EMPTY; - } - - return errcode; - -} -/************************************************ - ************************************************/ -/* - signed8_t CUnit::GetData(unsigned8_t** ppdata, unsigned32_t from, unsigned32_t to ) - { - signed8_t errcode = NO_ERRORS; - - // Simply make the external pointer point to the local storage data - *ppdata = m_pData; - - return errcode; - } -*/ -/************************************************ - ************************************************/ -signed8_t CUnit::AddDataArray (const unsigned8_t* newdata, size_t size) -{ - - signed8_t errcode = NO_ERRORS; - size_t spaceleft = m_nSize - m_nDataSize; - - if(spaceleft < size) // allocate more space if new tobeadded array won't fit - { - Inflate(size-spaceleft+1); - } - - if(newdata != NULL) - { - for(unsigned32_t i=0; i m_nDataSize) m_nDataSize = index+1; - else if(index==m_nDataSize) m_nDataSize++; - m_pData[index++] = newdata[i]; - */ - // The following code truncates the array if it exceeds DataSize - if(index==m_nDataSize) break; - - m_pData[index++] = newdata[i]; - } - } else { - //No data to add. Do nothing - } - - return errcode; -} - -/************************************************ - ************************************************/ - -signed8_t CUnit::AddValue8(unsigned8_t newdata) -{ - - if(m_nDataSize >= m_nSize) - { - Inflate(); - } - - m_pData[m_nDataSize++] = newdata; - - return NO_ERRORS; - -} - -#if VERSION_BIFF == VERSION_BIFF8 -#ifdef HAVE_ICONV -void CUnit::Conv32to16(string& iconv_code, ustring& str1, u16string& str2) -{ - size_t resultSize, inbytesleft, outbytesleft; - const wchar_t *inbuf; - iconv_t cd; - unsigned16_t *outbuf, *origOutbuf; - static unsigned16_t convFail[] = { 'i', 'c', 'o', 'n', 'v', ' ', 'f', 'a', 'i', 'l', 'e', 'd', '!' }; - - cd = iconv_open("UCS-2-INTERNAL", "wchar_t"); - // no need to test return code as we ALREADY did this when setting iconv_code in workbook - - inbytesleft = str1.size() * sizeof(uchar_t); - outbytesleft = inbytesleft * 4 * sizeof(unsigned16_t); // Unicode expansion 4 to 2 ??? - - inbuf = str1.c_str(); - origOutbuf = (unsigned16_t *)calloc(outbytesleft, 1); - outbuf = origOutbuf; - - resultSize = iconv(cd, (char **)&inbuf, &inbytesleft, (char **)&outbuf, &outbytesleft); - iconv_close(cd); - - if(resultSize == (size_t)-1) { - str2 = convFail; - } else { - str2.assign(origOutbuf, outbuf - origOutbuf); - } - return; -} -#endif - -// for cases where we save a single byte -signed8_t CUnit::AddUnicodeStrlen(unsigned8_t newdata) -{ - return AddValue8(newdata); -} -// for cases where we save a single byte -signed8_t CUnit::AddUnicodeStrlen(unsigned16_t newdata) -{ - return AddValue16(newdata); -} -signed8_t CUnit::AddUnicodeString (const unsigned8_t* newdata, unsigned16_t size) -{ - unsigned16_t strSize = 1 + size; - - signed8_t errcode = NO_ERRORS; - size_t spaceleft = m_nSize - m_nDataSize; - - if(spaceleft < strSize) // allocate more space if new tobeadded array won't fit - { - Inflate((size_t)(strSize-spaceleft+1)); - } - - m_pData[m_nDataSize++] = 0x00; // character compression - - if(newdata != NULL) - { - for(unsigned16_t i=0; i> 8) & 0xFF; - } - } else { - //No data to add. Do nothing - } - - return errcode; -} -#endif - -/************************************************ - ************************************************/ - -signed8_t CUnit::Inflate(size_t increase) -{ - signed8_t errcode = NO_ERRORS; - - if (increase == 0) - increase = CUnit::DefaultInflateSize; - - // Create the new storage with increased size - // and initialize it to 0. - unsigned8_t* temp_storage = new unsigned8_t[m_nSize + increase]; - - if(temp_storage != NULL) - { - - memset(temp_storage, 0, (m_nSize+increase)*(sizeof(unsigned8_t))); - // Copy data to the new storage - memcpy(temp_storage, m_pData, m_nSize*sizeof(unsigned8_t)); - - // Update the size - m_nSize += increase; - - if (m_pData != NULL) - delete []m_pData; - - m_pData = temp_storage; - - errcode = ERR_UNNABLE_TOALLOCATE_MEMORY; - } else { - // No errors... errcode already clean - } - - return errcode; -} - -/************************************************ - ************************************************/ - -unsigned8_t& CUnit::operator[] ( const unsigned32_t index ) -{ - if(index >= m_nDataSize) - return m_pData[m_nDataSize]; - return m_pData[index]; - -} -/************************************************ - ************************************************/ - -CUnit& CUnit::operator= (CUnit& newvalue ) -{ - if(&newvalue != this) - Init(newvalue.GetBuffer(), newvalue.GetSize(), newvalue.GetDataSize()); - - return *this; - -} - -/************************************************ - ************************************************/ - -CUnit& CUnit::operator+= ( CUnit& from ) -{ - - if(&from != this) - Append(from); - else - { - CUnit shadow; - shadow = from; - Append(shadow); - } - return *this; -} - -/************************************************ - ************************************************/ - -CUnit& CUnit::operator+= ( unsigned8_t from ) -{ - - AddValue8(from); - - return *this; -} - - -/************************************************ - ************************************************/ - -signed8_t CUnit::Init (unsigned8_t* data, const size_t size, const unsigned32_t datasz) -{ - - m_nSize = size; - m_nDataSize = datasz; - - m_pData = new unsigned8_t[m_nSize]; - - if(data) - { - memset(m_pData, 0, m_nSize*sizeof(unsigned8_t)); - // Copy data to the new storage - memcpy(m_pData, data, m_nSize*sizeof(unsigned8_t)); - } - - return NO_ERRORS; -} - - -/************************************************ - ************************************************/ - -signed8_t CUnit::Append (CUnit& newunit) -{ - - if(AddDataArray(newunit.GetBuffer(), newunit.GetDataSize()) == NO_ERRORS) - return NO_ERRORS; - else - return GENERAL_ERROR; -} - -/************************************************ - ************************************************/ -signed8_t CUnit::InitFill (unsigned8_t data, unsigned32_t size) -{ - if(m_pData) - delete[] m_pData; - - m_pData = new unsigned8_t[size]; - - if(m_pData) - { - memset(m_pData, data, size*sizeof(unsigned8_t)); - m_nSize = m_nDataSize = size; - - return NO_ERRORS; - } else { - return GENERAL_ERROR; - } - -} - -/************************************************ - ************************************************/ - -size_t CUnit::GetSize (void) -{ - return m_nSize; -} - -/************************************************ - ************************************************/ - -unsigned32_t CUnit::GetDataSize (void) -{ - return m_nDataSize; -} - -/************************************************ - ************************************************/ - -unsigned8_t* CUnit::GetBuffer (void) -{ - return m_pData; -} - - -/************************************************ - ************************************************/ -/* - void CUnit::SetShadow(bool shadowval) - { - m_ShadowUnit = shadowval; - - - } -*/ - -/************************************************ - ************************************************/ -/* - void CUnit::CopyShadowUnit(unsigned8_t* data, unsigned32_t size) - { - m_Size = m_DataSize = size; - m_pData = data; - - SetShadow(true); - - - - } -*/ - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: unit.cpp,v $ - * Revision 1.3 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.2 2004/09/01 00:47:21 darioglz - * + Modified to gain independence of target - * - * Revision 1.1.1.1 2004/08/27 16:31:53 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/unit.h b/uppdev/XLS/unit.h deleted file mode 100644 index 7a67b2d52..000000000 --- a/uppdev/XLS/unit.h +++ /dev/null @@ -1,140 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/unit.h,v $ - * $Revision: 1.2 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef UNIT_H -#define UNIT_H - -#include -#include - -namespace xlslib_core -{ - - -#define UNIT_MAX_SIZE (0xFFFF) - - // Error codes -#define ERR_DATASTORAGE_EMPTY (-2) -#define ERR_INVALID_INDEX (-3) -#define ERR_UNNABLE_TOALLOCATE_MEMORY (-3) - - //Block definitions -#define BIG_BLOCK_SIZE (0x200) -#define SMALL_BLOCK_SIZE (0x040) -#define PROP_BLOCK_SIZE (0x080) - - class CUnit { - // Attributes - protected: - size_t m_nSize; // Size of data stored - unsigned8_t* m_pData; // Data storage - unsigned32_t m_nDataSize; // Next empty space - // bool m_ShadowUnit; - - // Static attributes - static const unsigned8_t DefaultInflateSize; - - // Operations - public: - CUnit(); - virtual ~CUnit(); - - virtual unsigned8_t& operator[](const unsigned32_t index); - virtual CUnit& operator=(CUnit& newvalue); - virtual CUnit& operator+=(CUnit& from); - virtual CUnit& operator+= ( unsigned8_t from ); - - virtual size_t GetSize (void); - virtual unsigned32_t GetDataSize (void); - unsigned8_t* GetBuffer (void); - signed8_t Init (unsigned8_t* data, - const size_t size, - const unsigned32_t datasz); - - signed8_t AddDataArray (const unsigned8_t* newdata, size_t size); - signed8_t AddFixedDataArray (const unsigned8_t value, size_t size); - -#if VERSION_BIFF == VERSION_BIFF8 -#ifdef HAVE_ICONV - void Conv32to16(std::string& iconv_code, std::ustring& str1, u16string& str2); -#endif - // DFH - to convert ascii string to unicode strings for BIFF8 - signed8_t AddUnicodeStrlen(unsigned8_t newdata); - signed8_t AddUnicodeStrlen(unsigned16_t newdata); - signed8_t AddUnicodeString (const unsigned8_t* newdata, unsigned16_t size); - signed8_t AddUnicodeString (const unsigned16_t* newdata, unsigned16_t size); -#endif - /* - void SetShadow(bool shadowval); - void CopyShadowUnit(unsigned8_t* data, unsigned32_t size); - */ - protected: - - signed8_t Append (CUnit& newunit); - signed8_t SetAt(unsigned8_t newval, unsigned32_t index);// Modify specific position - - signed8_t AddValue16(unsigned16_t newval); - signed8_t AddValue32(unsigned32_t newval); - signed8_t AddValue64(unsigned64_t newval); - - signed8_t SetValueAt(signed16_t newval, unsigned32_t index); - signed8_t SetValueAt(signed32_t newval, unsigned32_t index); - - signed8_t GetValue16From(signed16_t* val, unsigned32_t index); - signed8_t GetValue32From(signed32_t* val, unsigned32_t index); - - signed8_t SetArrayAt (const unsigned8_t* newdata, size_t size, unsigned32_t index); - signed8_t GetAt(signed8_t* data, unsigned32_t index);// Get specific data from storage - // signed8_t GetData(unsigned8_t** data, unsigned32_t from, unsigned32_t to ); - - signed8_t RemoveTrailData (unsigned32_t remove_size); - signed8_t AddValue8(unsigned8_t newdata); - signed8_t InitFill (unsigned8_t data, unsigned32_t size); - signed8_t Inflate(size_t increase = 0); - - }; - -} -#endif // UNIT_H - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: unit.h,v $ - * Revision 1.2 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.1.1.1 2004/08/27 16:31:46 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - diff --git a/uppdev/XLS/workbook.cpp b/uppdev/XLS/workbook.cpp deleted file mode 100644 index dfa41fbb0..000000000 --- a/uppdev/XLS/workbook.cpp +++ /dev/null @@ -1,560 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2004 Yeico S. A. de C. V. - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/workbook.cpp,v $ - * $Revision: 1.3 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#include - -#ifdef HAVE_ICONV -#include -#endif - -using namespace std; -using namespace xlslib_core; - -#define CHANGE_DUMPSTATE(state) { \ - m_PreviousDumpState = m_DumpState; \ - m_DumpState = state; \ -} - -/* -********************************************************************** -workbook class implementation -********************************************************************** -*/ - -workbook::workbook() - : m_DumpState(WB_INIT), - m_PreviousDumpState(WB_FINISH), - m_pCurrentData(NULL), - m_pContinueRecord(NULL), - dump_not_started(true), - globalrec_size(0), - current_sheet(0), - offset(0) -{ -#ifdef XLS_PHP - write_fptr = NULL; - m_Disposition = STK_ATTACHMENT; -#endif -#ifdef HAVE_ICONV - iconv_code = "wchar_t"; -#endif -} - -#ifdef XLS_PHP -workbook::workbook(write_fptr_t w_fptr) - : m_DumpState(WB_INIT), - m_PreviousDumpState(WB_FINISH), - m_pCurrentData(NULL), - m_pContinueRecord(NULL), - dump_not_started(true), - globalrec_size(0), - current_sheet(0), - offset(0) -{ - write_fptr = w_fptr; - m_Disposition = STK_ATTACHMENT; -} -#endif - -workbook::~workbook() -{ - if(!m_Sheets.empty()) - { - for(unsigned32_t i = 0; iSetName(name); - - return(m_GlobalRecords.AddFont(newfont)); -} - -/* -*********************************** -*********************************** -*/ -format_t* workbook::format(string formatstr) -{ - format_t* newformat = new format_t(0x0000, formatstr); - - return(m_GlobalRecords.AddFormat(newformat)); -} - -xf_t* workbook::xformat(void) -{ - xf_t* newxf = new xf_t; - newxf->MarkUsed(); - - return(m_GlobalRecords.AddXFormat(newxf)); -} - -xf_t* workbook::xformat(font_t* font) -{ - xf_t* newxf = new xf_t; - newxf->MarkUsed(); - newxf->SetFont(font); - - return(m_GlobalRecords.AddXFormat(newxf)); -} - -/* -*********************************** -*********************************** -*/ -#define SETWORKBOOK5() \ - CDataStorage biffdata; \ - CUnit* precorddata; \ - bool keep = true; \ - do { \ - precorddata = DumpData(); \ - \ - if(precorddata != NULL) \ - biffdata += precorddata; \ - else \ - keep = false; \ - }while(keep); \ - \ - AddFile("/Book",&biffdata); \ - string name; \ - name = (char)0x05; \ - name += "SummaryInformation"; \ - AddFile(name, &m_SummaryInfo); \ - name = (char)0x05; \ - name += "DocumentSummaryInformation"; \ - AddFile(name, &m_DocSummaryInfo); - -#define SETWORKBOOK8() \ - CDataStorage biffdata; \ - CUnit* precorddata; \ - bool keep = true; \ - do { \ - precorddata = DumpData(); \ - \ - if(precorddata != NULL) \ - biffdata += precorddata; \ - else \ - keep = false; \ - } while(keep); \ - \ - AddFile("/Workbook",&biffdata); \ - string name; \ - name = (char)0x05; \ - name += "SummaryInformation"; \ - AddFile(name, &m_SummaryInfo); \ - name = (char)0x05; \ - name += "DocumentSummaryInformation"; \ - AddFile(name, &m_DocSummaryInfo); - -#ifdef XLS_PHP -/****************************** - * This function has to be called before any output to the php-string - * (this includes any non-php-script text in the source file or - * zend_printf call) because it makes use of headers() php-function, - * which has to be called before any of those kind of output. - * If this restraint isn't followed, the html-header won't be modified - * and the binary data will be displayed in the browser (in the best of - * cases). - * This can also be avoided using buffering in the PHP environment - * See chapter LXXVIII. "Output Control Functions" of the PHP manual. - ******************************/ -void workbook::Stroke(string filename) -{ - SetStroke(); - -#if VERSION_BIFF == VERSION_BIFF5 - SETWORKBOOK5(); -#else // VERSION_BIFF8 - SETWORKBOOK8(); -#endif - DumpOleFile(); -} - -void workbook::Disposition(Stroke_Disposition_t disp) -{ - m_Disposition = disp; -} -#endif - - -int workbook::Dump(string filename) -{ - int errors; - - if(m_Sheets.empty()) { - return GENERAL_ERROR; - } - -#ifdef XLS_PHP - UnSetStroke(); -#endif - - errors = Open(filename); - if(errors == NO_ERRORS) { -#if VERSION_BIFF == VERSION_BIFF5 - SETWORKBOOK5(); -#else // VERSION_BIFF8 - SETWORKBOOK8(); -#endif - errors = DumpOleFile(); - Close(); - } - return errors; -} - -/* -*********************************** -*********************************** -*/ - -CUnit* workbook::DumpData(void) -{ - - bool repeat = false; - XTRACE("\nworkbook::DumpData"); - - do - { - switch(m_DumpState) - { - case WB_INIT: - - dump_not_started = true; - globalrec_size = 0; - current_sheet = 0; - offset = 0; - - CHANGE_DUMPSTATE(WB_GLOBALRECORDS); - - repeat = true; - break; - - case WB_GLOBALRECORDS: - - XTRACE("\tGLOBALRECORDS"); - - repeat = false; - - if(dump_not_started) - { // the following code is executed only if this is the first pas to the first dump-state - // Basically, streampositions of BoundingSheet records are initialized. - dump_not_started = false; - - globalrec_size = m_GlobalRecords.GetSize(); - offset = globalrec_size; - - unsigned32_t offset_from_globalrecs = 0; - - if(!m_Sheets.empty()) - { - - Boundsheet_List_Itor_t bs = m_GlobalRecords.GetFirstBoundSheet(); - - for(unsigned16_t i = 0; i < m_Sheets.size(); i++) - { - - (*bs) -> streampos = globalrec_size + offset_from_globalrecs; - m_GlobalRecords.GetBoundingSheets(bs); - offset_from_globalrecs += m_Sheets[i]->GetSize(); - } - } - else - { - //Nothing else to do. - } - - - //TODO: Add other EOF/BOF blocks here - } - - m_pCurrentData = m_GlobalRecords.DumpData(); - if(m_pCurrentData == NULL) - { - if(!m_Sheets.empty()) - { - // get in advance the first record of the first sheet - //m_pCurrentData = m_Sheets[0].DumpData(globalrec_size); - repeat = true; - CHANGE_DUMPSTATE(WB_SHEETS); - } - else - { - // Nothing else to do. Branch to the FINISH state - m_pCurrentData = NULL; - - CHANGE_DUMPSTATE(WB_FINISH); - } - } - else - { - // Do nothing. Continue in this state. - } - - break; - - case WB_SHEETS: - { - - XTRACE("\tSHEETS"); - - repeat = false; - // If I got here, there's at least one sheet which has already - // sent the first record block of data. - //m_GlobalRecords.GetSize(); - - m_pCurrentData = m_Sheets[current_sheet]->DumpData(offset); - - if(m_pCurrentData == NULL) - { - if((unsigned16_t)(current_sheet+1) < m_Sheets.size()) - { - // Update the offset for the next sheet - offset += m_Sheets[current_sheet]->GetSize(); - current_sheet++; - - // ... and get the first record of the next sheet. - // m_pCurrentData = m_Sheets[current_sheet].DumpData(offset); - repeat = true; - } - else - { - // I'm done with all the sheets - // Nothing else to do. Branch to the FINISH state - CHANGE_DUMPSTATE(WB_FINISH); - - repeat = true; - } - } - - - break; - } - case WB_FINISH: - XTRACE("\tFINISH"); - - repeat = false; - m_pCurrentData = NULL; - - CHANGE_DUMPSTATE(WB_INIT); - - break; - - case WB_CONTINUE_REC: - XTRACE("\tCONTINUE-REC"); - - repeat = false; - - if(m_ContinueIndex == 0) - { - //Create a new data unit containing the max data size - m_pContinueRecord = (CUnit*)(new CRecord()); - - // The real size of the record is the size of the buffer minus the - // size of the header record - - ((CUnit*)(m_pContinueRecord))->AddDataArray(((CRecord*)m_pCurrentData)->GetRecordDataBuffer(),MAX_RECORD_SIZE); - ((CRecord*)(m_pContinueRecord))->SetRecordType(((CRecord*)m_pCurrentData)->GetRecordType()); - ((CRecord*)(m_pContinueRecord))->SetRecordLength(MAX_RECORD_SIZE); - -// m_pContinueRecord->SetValueAt(MAX_RECORD_SIZE-4,2); - m_ContinueIndex++; - - return m_pContinueRecord; - } - else - { - //Delete_Pointer(m_pContinueRecord); - - // Get a pointer to the next chunk of data - unsigned8_t* pdata = (((CRecord*)m_pCurrentData)->GetRecordDataBuffer()) + m_ContinueIndex*MAX_RECORD_SIZE; - - // Get the size of the chunk of data (that is the MAX_REC_SIZE except by the last one) - unsigned32_t csize = 0; - if(( ((CRecord*)m_pCurrentData)->GetRecordDataSize()/MAX_RECORD_SIZE) > (m_ContinueIndex)) - { - csize = MAX_RECORD_SIZE; - m_ContinueIndex++; - - m_pContinueRecord =(CUnit*) ( new CContinue(pdata, csize)); - - return m_pContinueRecord; - } - else - { - unsigned32_t data_size = ((CRecord*)m_pCurrentData)->GetRecordDataSize(); - - csize = (data_size - (m_ContinueIndex) * MAX_RECORD_SIZE); - - // Restore the previous state (*Don't use the macro*) - m_DumpState = m_PreviousDumpState; - m_PreviousDumpState = WB_CONTINUE_REC; - - m_ContinueIndex = 0; - - if(csize) - { - m_pContinueRecord = (CUnit*) new CContinue(pdata, csize); - Delete_Pointer(m_pCurrentData); - return m_pContinueRecord; - } - else - { - Delete_Pointer(m_pCurrentData); - repeat = true; - } - } - } - - break; - - default: - XTRACE("\tDEFAULT"); - break; - } - - if(m_pCurrentData != NULL) - if(((CRecord*)m_pCurrentData)->GetRecordDataSize() >= MAX_RECORD_SIZE && m_DumpState != WB_CONTINUE_REC) - { - - // Save the current dump satate and change to the CONTINUE Record state - CHANGE_DUMPSTATE(WB_CONTINUE_REC); - - m_ContinueIndex = 0; - - repeat = true; - } - } while(repeat); - - return m_pCurrentData; -} - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: workbook.cpp,v $ - * Revision 1.3 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.2 2004/09/01 00:47:21 darioglz - * + Modified to gain independence of target - * - * Revision 1.1.1.1 2004/08/27 16:31:49 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ diff --git a/uppdev/XLS/workbook.h b/uppdev/XLS/workbook.h deleted file mode 100644 index 510ceb355..000000000 --- a/uppdev/XLS/workbook.h +++ /dev/null @@ -1,148 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * $Source: /cvsroot/xlslib/xlslib/src/xlslib/workbook.h,v $ - * $Revision: 1.3 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:39:54 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef WORKBOOK_H -#define WORKBOOK_H - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace xlslib_core -{ - - typedef enum - { - WB_INIT, - WB_GLOBALRECORDS, - WB_SHEETS, - WB_CONTINUE_REC, - WB_FINISH - } WorkbookDumpState_t; - - -#ifdef XLS_PHP - typedef enum - { - STK_INLINE=0, - STK_ATTACHMENT - } Stroke_Disposition_t; -#endif - class workbook - :public COleDoc - { - - private: - CSummaryInfo m_SummaryInfo; - CDocSummaryInfo m_DocSummaryInfo; - - CGlobalRecords m_GlobalRecords; - Sheets_Vector_t m_Sheets; - WorkbookDumpState_t m_DumpState; - WorkbookDumpState_t m_PreviousDumpState; - - CUnit* m_pCurrentData; - - // Continue record variables: - CUnit* m_pContinueRecord; - unsigned16_t m_ContinueIndex; - -#ifdef HAVE_ICONV - std::string iconv_code; -#endif - protected: - - public: - workbook(); -#ifdef XLS_PHP - workbook(write_fptr_t w_fptr); -#endif - ~workbook(); - - worksheet* sheet(std::string sheetname); -#if VERSION_BIFF == VERSION_BIFF8 - worksheet* sheet(std::ustring sheetname); -#endif - worksheet* GetSheet(unsigned16_t sheetnum); - - font_t* font(std::string name); - format_t* format(std::string formatstr); - - xf_t* xformat(void); - xf_t* xformat(font_t* font); - -#ifdef HAVE_ICONV - int iconvInType(const char *inType); -#endif - - CUnit* DumpData(void); // oledoc use - - int Dump(std::string filename); - -#ifdef XLS_PHP - void Disposition(Stroke_Disposition_t disp); - void Stroke(std::string filename); - Stroke_Disposition_t m_Disposition; -#endif - - private: - bool dump_not_started; - unsigned32_t globalrec_size; - unsigned16_t current_sheet; - unsigned32_t offset; - }; - -} -#endif //WORKBOOK_H - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * $Log: workbook.h,v $ - * Revision 1.3 2008/10/25 18:39:54 dhoerl - * 2008 - * - * Revision 1.2 2004/09/01 00:47:21 darioglz - * + Modified to gain independence of target - * - * Revision 1.1.1.1 2004/08/27 16:31:44 darioglz - * Initial Import. - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - diff --git a/uppdev/XLS/xlslib.h b/uppdev/XLS/xlslib.h deleted file mode 100644 index 95c112059..000000000 --- a/uppdev/XLS/xlslib.h +++ /dev/null @@ -1,392 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * This file is part of xlslib -- A multiplatform, C/C++ library - * for dynamic generation of Excel(TM) files. - * - * xlslib is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * xlslib is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with xlslib. If not, see . - * - * Copyright 2008 David Hoerl - * - * $Source: /cvsroot/xlslib/xlslib/src/common/xlslib.h,v $ - * $Revision: 1.1 $ - * $Author: dhoerl $ - * $Date: 2008/10/25 18:44:32 $ - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * File description: - * - * all include file for users - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - - -#ifdef __cplusplus - -#include - -#define EXTERN_TYPE extern "C" - -using namespace xlslib_core; - -#else // "C" - -#define EXTERN_TYPE extern - - -typedef uintptr_t write_fptr_t; - -typedef unsigned char unsigned8_t; -typedef unsigned short int unsigned16_t; -typedef unsigned uint32_t unsigned32_t; - -#if defined(_MSC_VER) && defined(WIN32) -typedef __int64 unsigned64_t; -#else -//typedef long long unsigned int unsigned64_t; -typedef uint64_t unsigned64_t; -#endif -typedef char signed8_t; -typedef short int signed16_t; -typedef int32_t signed32_t; - -typedef enum -{ - FMT_GENERAL = 0, - FMT_NUMBER1, - FMT_NUMBER2, - FMT_NUMBER3, - FMT_NUMBER4, - FMT_CURRENCY1, - FMT_CURRENCY2, - FMT_CURRENCY3, - FMT_CURRENCY4, - FMT_PERCENT1, - FMT_PERCENT2, - FMT_SCIENTIFIC1, - FMT_FRACTION1, - FMT_FRACTION2, - FMT_DATE1, - FMT_DATE2, - FMT_DATE3, - FMT_DATE4, - FMT_HOUR1, - FMT_HOUR2, - FMT_HOUR3, - FMT_HOUR4, - FMT_HOURDATE, - FMT_NUMBER5, - FMT_NUMBER6, - FMT_NUMBER7, - FMT_NUMBER8, - FMT_ACCOUNTING1, - FMT_ACCOUNTING2, - FMT_ACCOUNTING3, - FMT_ACCOUNTING4, - FMT_HOUR5, - FMT_HOUR6, - FMT_HOUR7, - FMT_SCIENTIFIC2, - FMT_TEXT -} format_number_t; - -typedef enum -{ - HALIGN_GENERAL = 0, - HALIGN_LEFT, - HALIGN_CENTER, - HALIGN_RIGHT, - HALIGN_FILL, - HALIGN_JUSTIFY, - HALIGN_CENTERACCROSS -} halign_option_t; - -typedef enum -{ - VALIGN_TOP = 0, - VALIGN_CENTER, - VALIGN_BOTTOM, - VALIGN_JUSTIFY -} valign_option_t; - -typedef enum -{ - ORI_NONE = 0, - ORI_TOPBOTTOMTXT, - ORI_90NOCLOCKTXT, - ORI_90CLOCKTXT -} txtori_option_t; - -typedef enum -{ - COLOR_BLACK, - COLOR_DARK_RED, - COLOR_RED, - COLOR_FUCSIA, - COLOR_COMBINED01, - COLOR_COMBINED02, - COLOR_COMBINED03, - COLOR_COMBINED04, - COLOR_COMBINED05, - COLOR_COMBINED06, - COLOR_OLIVE, - COLOR_DARK_YELLOW, - COLOR_COMBINED07, - COLOR_YELLOW, - COLOR_LIGHT_YELLOW, - COLOR_DARK_GREEN, - COLOR_GREEN, - COLOR_COMBINED08, - COLOR_LIVING_GREEN, - COLOR_LIGHT_GREEN, - COLOR_COMBINED09, - COLOR_BLUE_GREEN, - COLOR_AQUAMARINA, - COLOR_TURQOISE, - COLOR_COMBINED10, - COLOR_DARK_BLUE, - COLOR_BLUE, - COLOR_LIGHT_BLUE, - COLOR_SKY_BLUE, - COLOR_COMBINED11, - COLOR_INDIGO, - COLOR_BLUE_GRAY, - COLOR_VIOLET, - COLOR_PLUM, - COLOR_LAVANDER, - COLOR_COMBINED12, - COLOR_GRAY50, - COLOR_GRAY40, - COLOR_GRAY25, - COLOR_WHITE -} color_name_t; - -typedef enum -{ - FILL_NONE = 0, - FILL_SOLID, - FILL_ATEN75, - FILL_ATEN50, - FILL_ATEN25, - FILL_ATEN12, - FILL_ATEN06, - FILL_HORIZ_LIN, - FILL_VERTICAL_LIN, - FILL_DIAG, - FILL_INV_DIAG, - FILL_INTER_DIAG, - FILL_DIAG_THICK_INTER, - FILL_HORIZ_LINES_THIN, - FILL_VERTICAL_LINES_THIN, - FILL_DIAG_THIN, - FILL_INV_DIAG_THIN, - FILL_HORIZ_INT_THIN, - FILL_HORIZ_INTER_THICK -} fill_option_t; - -typedef enum -{ - BORDER_NONE = 0, - BORDER_THIN, - BORDER_MEDIUM, - BORDER_DASHED, - BORDER_DOTTED, - BORDER_THICK, - BORDER_DOUBLE, - BORDER_HAIR -} border_style_t; - -typedef enum -{ - BORDER_BOTTOM = 0, - BORDER_TOP, - BORDER_LEFT, - BORDER_RIGHT -} border_side_t; - -typedef enum -{ - BOLDNESS_BOLD = 0, - BOLDNESS_HALF, - BOLDNESS_NORMAL, - BOLDNESS_DOUBLE -} boldness_option_t; - -typedef enum -{ - SCRIPT_NONE = 0, - SCRIPT_SUPER, - SCRIPT_SUB - -} script_option_t; - -typedef enum -{ - - UNDERLINE_NONE = 0, - UNDERLINE_SINGLE, - UNDERLINE_DOUBLE, - UNDERLINE_SINGLEACC, - UNDERLINE_DOUBLEACC - -} underline_option_t; - -typedef enum -{ - BOLDNESS_BOLD = 0, - BOLDNESS_HALF, - BOLDNESS_NORMAL, - BOLDNESS_DOUBLE -} boldness_option_t; -typedef enum -{ - SCRIPT_NONE = 0, - SCRIPT_SUPER, - SCRIPT_SUB -} script_option_t; -typedef enum -{ - UNDERLINE_NONE = 0, - UNDERLINE_SINGLE, - UNDERLINE_DOUBLE, - UNDERLINE_SINGLEACC, - UNDERLINE_DOUBLEACC -} underline_option_t; - -typedef struct _workbook workbook; -typedef struct _worksheet worksheet; -typedef struct _font_t font_t; -typedef struct _format_t format_t; -typedef struct _cell_t cell_t; -typedef struct _xf_t xf_t; -typedef struct _range range; - -#ifndef bool -typedef int bool; -#endif - -#endif - -// Workbook -EXTERN_TYPE workbook *newWorkbook(void); -#ifdef XLS_PHP -EXTERN_TYPE workbook *newWorkbook_w_fptr(write_fptr_t w_fptr); -#endif -EXTERN_TYPE void deleteWorkbook(workbook *w); -EXTERN_TYPE worksheet *callWorkbookSheet(workbook *w, char *sheetname); -#if VERSION_BIFF == VERSION_BIFF8 -EXTERN_TYPE worksheet *callWorkbookSheetW(workbook *w, uchar_t *sheetname); -#endif -EXTERN_TYPE worksheet *callWorkbookGetSheet(workbook *w, unsigned16_t sheetnum); -EXTERN_TYPE font_t *callWorkbookFont(workbook *w, char *name); -EXTERN_TYPE xf_t *callWorkbookxFormat(workbook *w); -EXTERN_TYPE xf_t *callWorkbookxFormatFont(workbook *w, font_t *font); -EXTERN_TYPE int callWorkbookDump(workbook *w, char *filename); -#ifdef XLS_PHP -EXTERN_TYPE void callWorkbookDisposition(workbook *w, Stroke_Disposition_t disp); -EXTERN_TYPE void callWorkbookStroke(workbook *w, char *filename); -#endif -// Worksheet -EXTERN_TYPE cell_t *callWorksheetFindCell(worksheet *w, unsigned16_t row, unsigned16_t col); -EXTERN_TYPE void callWorksheetMerge(worksheet *w, unsigned16_t first_row, unsigned16_t first_col, unsigned16_t last_row, unsigned16_t last_col); -EXTERN_TYPE void callWorksheetColwidth(worksheet *w, unsigned16_t col, unsigned16_t width); -EXTERN_TYPE void callWorksheetRowheight(worksheet *w, unsigned16_t row, unsigned16_t height); -EXTERN_TYPE range *callWorksheetRangegroup(worksheet *w, unsigned16_t row1, unsigned16_t col1, unsigned16_t row2, unsigned16_t col2); -EXTERN_TYPE cell_t *callWorksheetLabel(worksheet *w, unsigned16_t row, unsigned16_t col, char *strlabel, xf_t *pxformat); -#if VERSION_BIFF == VERSION_BIFF8 -EXTERN_TYPE cell_t *callWorksheetLabelW(worksheet *w, unsigned16_t row, unsigned16_t col, uchar_t *strlabel, xf_t *pxformat); -#endif -EXTERN_TYPE cell_t *callWorksheetBlank(worksheet *w, unsigned16_t row, unsigned16_t col, xf_t *pxformat); -EXTERN_TYPE cell_t *callWorksheetNumber(worksheet *w, unsigned16_t row, unsigned16_t col, double numval, format_number_t fmtval, xf_t *pxformat); -// cell: xfi -EXTERN_TYPE void callCellFont(cell_t *c, font_t *fontidx); -EXTERN_TYPE void callCellFormat(cell_t *c, format_number_t formatidx); -EXTERN_TYPE void callCellHalign(cell_t *c, halign_option_t ha_option); -EXTERN_TYPE void callCellValign(cell_t *c, valign_option_t va_option); -EXTERN_TYPE void callCellOrientation(cell_t *c, txtori_option_t ori_option); -EXTERN_TYPE void callCellFillfgcolor(cell_t *c, color_name_t color); -EXTERN_TYPE void callCellFillbgcolor(cell_t *c, color_name_t color); -EXTERN_TYPE void callCellFillstyle(cell_t *c, fill_option_t fill); -EXTERN_TYPE void callCellLocked(cell_t *c, bool locked_opt); -EXTERN_TYPE void callCellHidden(cell_t *c, bool hidden_opt); -EXTERN_TYPE void callCellWrap(cell_t *c, bool wrap_opt); -EXTERN_TYPE void callCellBorderstyle(cell_t *c, border_side_t side, border_style_t style, color_name_t color); -EXTERN_TYPE void callCellFontname(cell_t *c, char *fntname); -// cell: font -EXTERN_TYPE void callCellFontheight(cell_t *c, unsigned16_t fntheight); -EXTERN_TYPE void callCellFontbold(cell_t *c, boldness_option_t fntboldness); -EXTERN_TYPE void callCellFontunderline(cell_t *c, underline_option_t fntunderline); -EXTERN_TYPE void callCellFontscript(cell_t *c, script_option_t fntscript); -EXTERN_TYPE void callCellFontcolor(cell_t *c, color_name_t fntcolor); -EXTERN_TYPE void callCellFontattr(cell_t *c, unsigned16_t attr); -EXTERN_TYPE void callCellFontitalic(cell_t *c, bool italic); -EXTERN_TYPE void callCellFontstrikeout(cell_t *c, bool so); -EXTERN_TYPE void callCellFontoutline(cell_t *c, bool ol); -EXTERN_TYPE void callCellFontshadow(cell_t *c, bool sh); -EXTERN_TYPE unsigned16_t callCellGetRow(cell_t *c); -EXTERN_TYPE unsigned16_t callCellGetCol(cell_t *c); -EXTERN_TYPE unsigned16_t callCellGetXFIndex(cell_t *c); -EXTERN_TYPE void callCellSetXF(cell_t *c, xf_t *pxfval); -// range -EXTERN_TYPE void callRangeCellcolor(range *r, color_name_t color); -// xformat -EXTERN_TYPE void callXformatSetFont(xf_t *x, font_t* fontidx); -EXTERN_TYPE unsigned16_t callXformatGetFontIndex(xf_t *x); -EXTERN_TYPE font_t* callXformatGetFont(xf_t *x); -EXTERN_TYPE void callXformatSetFormat(xf_t *x, format_number_t formatidx); -EXTERN_TYPE unsigned16_t callXformatGetFormatIndex(xf_t *x); -EXTERN_TYPE format_number_t callXformatGetFormat(xf_t *x); -EXTERN_TYPE void callXformatSetHAlign(xf_t *x, halign_option_t ha_option); -EXTERN_TYPE unsigned8_t callXformatGetHAlign(xf_t *x); -EXTERN_TYPE void callXformatSetVAlign(xf_t *x, valign_option_t va_option); -EXTERN_TYPE unsigned8_t callXformatGetVAlign(xf_t *x); -EXTERN_TYPE void callXformatSetTxtOrientation(xf_t *x, txtori_option_t ori_option); -EXTERN_TYPE unsigned8_t callXformatGetTxtOrientation(xf_t *x); -EXTERN_TYPE void callXformatSetFillFGColor(xf_t *x, color_name_t color); -EXTERN_TYPE unsigned8_t callXformatGetFillFGColor(xf_t *x); -EXTERN_TYPE void callXformatSetFillBGColor(xf_t *x, color_name_t color); -EXTERN_TYPE unsigned8_t callXformatGetFillBGColor(xf_t *x); -EXTERN_TYPE void callXformatSetFillStyle(xf_t *x, fill_option_t fill); -EXTERN_TYPE unsigned8_t callXformatGetFillStyle(xf_t *x); -EXTERN_TYPE void callXformatSetLocked(xf_t *x, bool locked_opt); -EXTERN_TYPE bool callXformatIsLocked(xf_t *x); -EXTERN_TYPE void callXformatSetHidden(xf_t *x, bool hidden_opt); -EXTERN_TYPE bool callXformatIsHidden(xf_t *x); -EXTERN_TYPE void callXformatSetWrap(xf_t *x, bool wrap_opt); -EXTERN_TYPE bool callXformatIsWrap(xf_t *x); -EXTERN_TYPE void callXformatSetCellMode(xf_t *x, bool cellmode); -EXTERN_TYPE bool callXformatIsCell(xf_t *x); -EXTERN_TYPE void callXformatSetBorderStyle(xf_t *x, border_side_t side, border_style_t style, color_name_t color); -EXTERN_TYPE unsigned8_t callXformatGetBorderStyle(xf_t *x, border_side_t side); -EXTERN_TYPE unsigned8_t callXformatGetBorderColor(xf_t *x, border_side_t side); -EXTERN_TYPE unsigned32_t callXformatGetSignature(xf_t *x); -// Font -EXTERN_TYPE void callFontSetName(font_t *f, char *name); -EXTERN_TYPE char *callFontGetName(font_t *f, char *name); -EXTERN_TYPE void callFontSetHeight(font_t *f, unsigned16_t fntheight); -EXTERN_TYPE unsigned16_t callFontGetHeight(font_t *f); -EXTERN_TYPE void callFontSetBoldStyle(font_t *f, boldness_option_t fntboldness); -EXTERN_TYPE unsigned16_t callFontGetBoldStyle(font_t *f); -EXTERN_TYPE void callFontSetUnderlineStyle(font_t *f, underline_option_t fntunderline); -EXTERN_TYPE unsigned8_t callFontGetUnderlineStyle(font_t *f); -EXTERN_TYPE void callFontSetScriptStyle(font_t *f, script_option_t fntscript); -EXTERN_TYPE unsigned16_t callFontGetScriptStyle(font_t *f); -EXTERN_TYPE void callFontSetColor(font_t *f, color_name_t fntcolor); -EXTERN_TYPE unsigned16_t callFontGetColor(font_t *f); -EXTERN_TYPE void callFontSetItalic(font_t *f, bool italic); -EXTERN_TYPE void callFontSetStrikeout(font_t *f, bool so); -EXTERN_TYPE void callFontSetAttributes(font_t *f, unsigned16_t attr); -EXTERN_TYPE unsigned16_t callFontGetAttributes(font_t *f); -EXTERN_TYPE void callFontSetOutline(font_t *f, bool ol); -EXTERN_TYPE void callFontSetShadow(font_t *f, bool sh); diff --git a/uppdev/XMLAttrCount/XMLAttrCount.upp b/uppdev/XMLAttrCount/XMLAttrCount.upp deleted file mode 100644 index 263a6fc09..000000000 --- a/uppdev/XMLAttrCount/XMLAttrCount.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - CtrlLib, - ide\Common; - -file - main.cpp; - -mainconfig - "" = "GUI"; diff --git a/uppdev/XMLAttrCount/main.cpp b/uppdev/XMLAttrCount/main.cpp deleted file mode 100644 index c1ac1a406..000000000 --- a/uppdev/XMLAttrCount/main.cpp +++ /dev/null @@ -1,49 +0,0 @@ -#include - -void write_out( FileOut& out, const XmlNode& xml, int ident ) -{ - switch( xml.GetType() ) - { - case XML_TEXT: - out << String(' ', ident) << "Text: " << xml.GetText() << "\n"; - break; - case XML_TAG: - out << String(' ', ident) << "Tag: " << xml.GetTag() << "\n"; - for ( int i = 0, total = xml.GetAttrCount(); i < total; i++ ) - { - out << String( ' ', ident ) << "+> " << xml.AttrId(i) << ": " << xml.Attr(i) << "\n"; - } - ident += 2; - break; - case XML_DOC: - out << String(' ', ident) << "Doc:\n"; - break; - default: - out << String(' ', ident) << "**UNDEFINED TAG**\n"; - break; - } - - for ( int i = 0, total = xml.GetCount(); i < total; i++ ) - { - write_out(out, xml[i], ident + 2); - } -} - -GUI_APP_MAIN -{ - Package p; - - String filename("D:\\uppsrc\\ide\\Common\\Common.upp"); - - p.Load(filename); - - XmlNode xml; - - XmlNode& makefile = xml.Add("makefile"); - - XmlNode& lib = makefile.Add("lib"); - lib.SetAttr("id", GetFileName(filename)); - - FileOut out("e:\\tst.dat"); - write_out(out, xml, 2); -} \ No newline at end of file diff --git a/uppdev/XmlBug/XmlBug.cpp b/uppdev/XmlBug/XmlBug.cpp deleted file mode 100644 index 26ffdb488..000000000 --- a/uppdev/XmlBug/XmlBug.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include - -using namespace Upp; - -CONSOLE_APP_MAIN -{ - try { - XmlNode xn = ParseXML(LoadFile(GetDataFile("XmlBug.xml"))); - LOG(xn["Settings"]["Cycle"].Attr("Time")); - LOG(xn["Settings"]["Cycle"].Attr("test1")); - LOG(xn["Settings"]["Cycle"].Attr("test2")); - LOG(xn["Settings"]["Cycle"].Attr("test3")); - LOG(xn["Settings"]["OrderList"].Attr("Url")); - } - catch(XmlError e) - { - LOG("Error " << e); - } -} - diff --git a/uppdev/XmlBug/XmlBug.upp b/uppdev/XmlBug/XmlBug.upp deleted file mode 100644 index cd86494cb..000000000 --- a/uppdev/XmlBug/XmlBug.upp +++ /dev/null @@ -1,10 +0,0 @@ -uses - Core; - -file - XmlBug.xml, - XmlBug.cpp; - -mainconfig - "" = ""; - diff --git a/uppdev/XmlBug/XmlBug.xml b/uppdev/XmlBug/XmlBug.xml deleted file mode 100644 index 7e3feb327..000000000 --- a/uppdev/XmlBug/XmlBug.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/uppdev/XmlBug/init b/uppdev/XmlBug/init deleted file mode 100644 index 582bed8a3..000000000 --- a/uppdev/XmlBug/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _XmlBug_icpp_init_stub -#define _XmlBug_icpp_init_stub -#include "Core/init" -#endif diff --git a/uppdev/XmlNodeFilter/XmlNodeFilter.cpp b/uppdev/XmlNodeFilter/XmlNodeFilter.cpp deleted file mode 100644 index 03ee31c04..000000000 --- a/uppdev/XmlNodeFilter/XmlNodeFilter.cpp +++ /dev/null @@ -1,154 +0,0 @@ -#include - -using namespace Upp; - -Tuple2 mm[] = { - {XML_DOC, "XML_DOC"}, - {XML_TAG, "XML_TAG"}, - {XML_END, "XML_END"}, - {XML_TEXT, "XML_TEXT"}, - {XML_DECL, "XML_DECL"}, - {XML_PI, "XML_PI"}, - {XML_COMMENT, "XML_COMMENT"}, - {XML_EOF, "XML_EOF"}, -}; - -VectorMap count; - -void MakeMap(VectorMap& map, const XmlNode& n, const String& path, int& tag_count, int& other_count) -{ - if(map.GetCount() > 1000) - return; - for(int i = 0; i < n.GetCount(); i++) { - const Tuple2 *m = FindTuple(mm, __countof(mm), n[i].GetType()); - if(m) { - count.GetAdd(m->b, 0)++; - count.GetAdd(String(m->b) + ".len", 0) += n[i].GetText().GetCount(); - } - if(n[i].IsTag()) { - String np = path + "/" + n[i].GetTag(); - map.GetAdd(np, 0)++; - MakeMap(map, n[i], np, tag_count, other_count); - count.GetAdd("attr", 0) += n[i].GetAttrCount(); - } - else - map.GetAdd(path + ':' + (m ? m->b : "?"), 0)++; - } -} - -void DumpMap(const XmlNode& n) -{ - VectorMap map; - int tag_count = 0; - int other_count = 0; - MakeMap(map, n, String(), tag_count, other_count); - SortByKey(map); - RDUMPM(map); - RDUMPM(count); -} - -//const char *xmlfile = "/home/cxl/20131117_ST_ZZSZ.xml"; - -namespace Upp { -void *SysAllocRaw(size_t size, size_t reqsize); -}; - -CONSOLE_APP_MAIN -{ - StdLogSetup(LOG_COUT|LOG_FILE); - - String xmlfile = GetHomeDirFile("ruian_file/20131201_ST_ZZSZ.xml"); - RLOG(MemoryProfile()); - { - RTIMING("Parse with ignore and stream!"); - IgnoreXmlPaths ignore( - "/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:Geometrie;" - "/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:GlobalniIdNavrhuZmeny;" - "/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:IdTransakce;" - "/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:PlatiOd;" - "/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:VOKod;" - "/vf:VymennyFormat/vf:Data/vf:Parcely;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:Geometrie;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:IdentifikacniParcela;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:ZpusobyOchrany;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DetailniTEA;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DruhKonstrukceKod;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:GlobalniIdNavrhuZmeny;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:IdTransakce;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:PlatiOd;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:PocetBytu;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:PocetPodlazi;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:PodlahovaPlocha;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:PripojeniKanalizaceKod;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:PripojeniPlynKod;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:PripojeniVodovodKod;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:VybaveniVytahemKod;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:ZastavenaPlocha;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:ZpusobVytapeniKod;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:ZpusobVyuzitiKod;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:ObestavenyProstor;" - ); - RLOG("-----------"); - RLOG("With ignore and stream!"); - XmlNode n = ParseXMLFile(xmlfile, ignore); - RLOG(MemoryUsedKb() << " KB used -------"); - RLOG(MemoryProfile()); - DumpMap(n); - } - { - RTIMING("Parse with ignore!"); - IgnoreXmlPaths ignore( - "/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:Geometrie;" - "/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:GlobalniIdNavrhuZmeny;" - "/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:IdTransakce;" - "/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:PlatiOd;" - "/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:VOKod;" - "/vf:VymennyFormat/vf:Data/vf:Parcely;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:Geometrie;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:IdentifikacniParcela;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:ZpusobyOchrany;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DetailniTEA;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DruhKonstrukceKod;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:GlobalniIdNavrhuZmeny;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:IdTransakce;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:PlatiOd;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:PocetBytu;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:PocetPodlazi;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:PodlahovaPlocha;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:PripojeniKanalizaceKod;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:PripojeniPlynKod;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:PripojeniVodovodKod;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:VybaveniVytahemKod;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:ZastavenaPlocha;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:ZpusobVytapeniKod;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:ZpusobVyuzitiKod;" - "/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:ObestavenyProstor;" - ); - XmlNode n = ParseXML(LoadFile(xmlfile), ignore); - RLOG("-----------"); - RLOG("With ignore"); - RLOG(MemoryUsedKb() << " KB used -------"); - RLOG(MemoryProfile()); - DumpMap(n); - } - { - RTIMING("Parse all!"); - XmlNode n = ParseXML(LoadFile(xmlfile)); - RLOG("-----------"); - RLOG("ALL"); - RLOG(MemoryUsedKb() << " KB used -------"); - RLOG(MemoryProfile()); - DumpMap(n); - } - RLOG("-----------"); - RLOG(MemoryUsedKb() << " KB used -------"); - RLOG(MemoryProfile()); - RLOG("Press a key to continue"); - getchar(); - RLOG("----------- Shrink"); - MemoryShrink(); - RLOG(MemoryUsedKb() << " KB used -------"); - RLOG(MemoryProfile()); - RLOG("Press a key to continue"); - getchar(); -} diff --git a/uppdev/XmlNodeFilter/XmlNodeFilter.upp b/uppdev/XmlNodeFilter/XmlNodeFilter.upp deleted file mode 100644 index db5bae3ac..000000000 --- a/uppdev/XmlNodeFilter/XmlNodeFilter.upp +++ /dev/null @@ -1,10 +0,0 @@ -uses - Core; - -file - XmlNodeFilter.cpp, - info.txt; - -mainconfig - "" = ""; - diff --git a/uppdev/XmlNodeFilter/info.txt b/uppdev/XmlNodeFilter/info.txt deleted file mode 100644 index c02423601..000000000 --- a/uppdev/XmlNodeFilter/info.txt +++ /dev/null @@ -1,535 +0,0 @@ -POSIX - -======================= ------------ -40484 KB used ------- -TIMING Parse! : 152.00 ms - 152.00 ms (152.00 ms / 1 ), min: 152.00 ms, max: 152.00 ms, nesting: 1 - 1 - -======================= -* C:\upp\out\uppdev\MSC9.Sse2\XmlNodeFilter.exe 10.12.2013 09:27:10, user: CXL - - 16 B, 16 allocated ( 0 KB), 238 fragmented ( 3 KB) - 32 B, 9 allocated ( 0 KB), 118 fragmented ( 3 KB) - 48 B, 76 allocated ( 3 KB), 8 fragmented ( 0 KB) - 64 B, 9 allocated ( 0 KB), 54 fragmented ( 3 KB) - 80 B, 9 allocated ( 0 KB), 41 fragmented ( 3 KB) - 96 B, 2 allocated ( 0 KB), 40 fragmented ( 3 KB) - 112 B, 2 allocated ( 0 KB), 34 fragmented ( 3 KB) - 128 B, 8 allocated ( 1 KB), 23 fragmented ( 2 KB) - 144 B, 1 allocated ( 0 KB), 27 fragmented ( 3 KB) - 160 B, 4 allocated ( 0 KB), 21 fragmented ( 3 KB) - 192 B, 66 allocated ( 12 KB), 18 fragmented ( 3 KB) - 208 B, 1 allocated ( 0 KB), 18 fragmented ( 3 KB) - 224 B, 1 allocated ( 0 KB), 17 fragmented ( 3 KB) - 288 B, 7 allocated ( 1 KB), 7 fragmented ( 1 KB) - 368 B, 1 allocated ( 0 KB), 10 fragmented ( 3 KB) - 448 B, 3 allocated ( 1 KB), 6 fragmented ( 2 KB) - 576 B, 2 allocated ( 1 KB), 5 fragmented ( 2 KB) - TOTAL, 217 allocated ( 25 KB), 685 fragmented ( 53 KB) -Free pages 0 (0 KB) -Large block count 9, total size 16 KB -Large fragments count 4, total size 47 KB - ------------ -With ignore -147632 KB used ------- - 16 B, 1624821 allocated (25387 KB), 17 fragmented ( 0 KB) - 32 B, 770807 allocated (24087 KB), 83 fragmented ( 2 KB) - 48 B, 1821277 allocated (85372 KB), 11 fragmented ( 0 KB) - 64 B, 151791 allocated ( 9486 KB), 39 fragmented ( 2 KB) - 80 B, 11 allocated ( 0 KB), 39 fragmented ( 3 KB) - 96 B, 25 allocated ( 2 KB), 17 fragmented ( 1 KB) - 112 B, 6 allocated ( 0 KB), 30 fragmented ( 3 KB) - 128 B, 12 allocated ( 1 KB), 19 fragmented ( 2 KB) - 144 B, 2 allocated ( 0 KB), 26 fragmented ( 3 KB) - 160 B, 4 allocated ( 0 KB), 21 fragmented ( 3 KB) - 176 B, 1 allocated ( 0 KB), 22 fragmented ( 3 KB) - 192 B, 67 allocated ( 12 KB), 17 fragmented ( 3 KB) - 208 B, 2 allocated ( 0 KB), 17 fragmented ( 3 KB) - 224 B, 1 allocated ( 0 KB), 17 fragmented ( 3 KB) - 288 B, 12 allocated ( 3 KB), 2 fragmented ( 0 KB) - 368 B, 3 allocated ( 1 KB), 8 fragmented ( 2 KB) - 448 B, 3 allocated ( 1 KB), 6 fragmented ( 2 KB) - 576 B, 6 allocated ( 3 KB), 1 fragmented ( 0 KB) - TOTAL, 4368851 allocated (144363 KB), 392 fragmented ( 43 KB) -Free pages 0 (0 KB) -Large block count 13, total size 20 KB -Large fragments count 5, total size 43 KB - -map: - [0] = (/vf:VymennyFormat) 1 - [1] = (/vf:VymennyFormat/vf:Data) 1 - [2] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista) 1 - [3] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto) 121959 - [4] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:CisloDomovni) 121959 - [5] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:CisloDomovni:XML_TEXT) 121959 - [6] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:CisloOrientacni) 15323 - [7] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:CisloOrientacni:XML_TEXT) 15323 - [8] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:CisloOrientacniPismeno) 637 - [9] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:CisloOrientacniPismeno:XML_TEXT) 637 - [10] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:Kod) 121959 - [11] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:Kod:XML_TEXT) 121959 - [12] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:Psc) 121959 - [13] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:Psc:XML_TEXT) 121959 - [14] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:StavebniObjekt) 121959 - [15] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:StavebniObjekt/soi:Kod) 121959 - [16] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:StavebniObjekt/soi:Kod:XML_TEXT) 121959 - [17] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:Ulice) 59981 - [18] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:Ulice/uli:Kod) 59981 - [19] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:Ulice/uli:Kod:XML_TEXT) 59981 - [20] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi) 1 - [21] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi) 137 - [22] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:ExistujeDigitalniMapa) 137 - [23] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:ExistujeDigitalniMapa:XML_TEXT) 137 - [24] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:Geometrie) 137 - [25] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:Geometrie/kui:DefinicniBod) 137 - [26] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:Geometrie/kui:DefinicniBod/gml:MultiPoint) 137 - [27] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:Geometrie/kui:DefinicniBod/gml:MultiPoint/gml:pointMembers) 137 - [28] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:Geometrie/kui:DefinicniBod/gml:MultiPoint/gml:pointMembers/gml:Point) 137 - [29] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:Geometrie/kui:DefinicniBod/gml:MultiPoint/gml:pointMembers/gml:Point/gml:pos) 137 - [30] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:Geometrie/kui:DefinicniBod/gml:MultiPoint/gml:pointMembers/gml:Point/gml:pos:XML_TEXT) 137 - [31] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:GlobalniIdNavrhuZmeny) 137 - [32] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:GlobalniIdNavrhuZmeny:XML_TEXT) 137 - [33] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:IdTransakce) 137 - [34] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:IdTransakce:XML_TEXT) 137 - [35] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:Kod) 137 - [36] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:Kod:XML_TEXT) 137 - [37] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:MluvnickeCharakteristiky) 2 - [38] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:MluvnickeCharakteristiky/com:Pad2) 2 - [39] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:MluvnickeCharakteristiky/com:Pad2:XML_TEXT) 2 - [40] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:MluvnickeCharakteristiky/com:Pad3) 2 - [41] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:MluvnickeCharakteristiky/com:Pad3:XML_TEXT) 2 - [42] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:MluvnickeCharakteristiky/com:Pad4) 2 - [43] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:MluvnickeCharakteristiky/com:Pad4:XML_TEXT) 2 - [44] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:MluvnickeCharakteristiky/com:Pad5) 2 - [45] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:MluvnickeCharakteristiky/com:Pad5:XML_TEXT) 2 - [46] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:MluvnickeCharakteristiky/com:Pad6) 2 - [47] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:MluvnickeCharakteristiky/com:Pad6:XML_TEXT) 2 - [48] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:MluvnickeCharakteristiky/com:Pad7) 2 - [49] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:MluvnickeCharakteristiky/com:Pad7:XML_TEXT) 2 - [50] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:Nazev) 137 - [51] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:Nazev:XML_TEXT) 137 - [52] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:Obec) 137 - [53] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:Obec/obi:Kod) 137 - [54] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:Obec/obi:Kod:XML_TEXT) 137 - [55] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:PlatiOd) 137 - [56] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:PlatiOd:XML_TEXT) 137 - [57] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:RizeniId) 137 - [58] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:RizeniId:XML_TEXT) 137 - [59] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty) 1 - [60] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt) 29390 - [61] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:CastObce) 28496 - [62] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:CastObce/coi:Kod) 28496 - [63] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:CastObce/coi:Kod:XML_TEXT) 28496 - [64] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:CislaDomovni) 28496 - [65] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:CislaDomovni/com:CisloDomovni) 28592 - [66] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:CislaDomovni/com:CisloDomovni:XML_TEXT) 28592 - [67] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:Dokonceni) 1960 - [68] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:Dokonceni:XML_TEXT) 1960 - [69] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:IsknBudovaId) 28951 - [70] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:IsknBudovaId:XML_TEXT) 28951 - [71] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:Kod) 29390 - [72] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:Kod:XML_TEXT) 29390 - [73] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:Momc) 36 - [74] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:Momc/mci:Kod) 36 - [75] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:Momc/mci:Kod:XML_TEXT) 36 - [76] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:Nespravny) 1 - [77] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:Nespravny:XML_TEXT) 1 - [78] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:TypStavebnihoObjektuKod) 29390 - [79] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:TypStavebnihoObjektuKod:XML_TEXT) 29390 - [80] = (/vf:VymennyFormat/vf:Data/vf:Ulice) 1 - [81] = (/vf:VymennyFormat/vf:Data/vf:Ulice/vf:Ulice) 1 - [82] = (/vf:VymennyFormat/vf:Data/vf:Ulice/vf:Ulice/uli:GlobalniIdNavrhuZmeny) 1 - [83] = (/vf:VymennyFormat/vf:Data/vf:Ulice/vf:Ulice/uli:GlobalniIdNavrhuZmeny:XML_TEXT) 1 - [84] = (/vf:VymennyFormat/vf:Data/vf:Ulice/vf:Ulice/uli:IdTransakce) 1 - [85] = (/vf:VymennyFormat/vf:Data/vf:Ulice/vf:Ulice/uli:IdTransakce:XML_TEXT) 1 - [86] = (/vf:VymennyFormat/vf:Data/vf:Ulice/vf:Ulice/uli:Kod) 1 - [87] = (/vf:VymennyFormat/vf:Data/vf:Ulice/vf:Ulice/uli:Kod:XML_TEXT) 1 - [88] = (/vf:VymennyFormat/vf:Data/vf:Ulice/vf:Ulice/uli:Nazev) 1 - [89] = (/vf:VymennyFormat/vf:Data/vf:Ulice/vf:Ulice/uli:Nazev:XML_TEXT) 1 - [90] = (/vf:VymennyFormat/vf:Data/vf:Ulice/vf:Ulice/uli:Obec) 1 - [91] = (/vf:VymennyFormat/vf:Data/vf:Ulice/vf:Ulice/uli:Obec/obi:Kod) 1 - [92] = (/vf:VymennyFormat/vf:Data/vf:Ulice/vf:Ulice/uli:Obec/obi:Kod:XML_TEXT) 1 - [93] = (/vf:VymennyFormat/vf:Data/vf:Ulice/vf:Ulice/uli:PlatiOd) 1 - [94] = (/vf:VymennyFormat/vf:Data/vf:Ulice/vf:Ulice/uli:PlatiOd:XML_TEXT) 1 - [95] = (/vf:VymennyFormat/vf:Data/vf:ZaniklePrvky) 1 - [96] = (/vf:VymennyFormat/vf:Data/vf:ZaniklePrvky/vf:ZaniklyPrvek) 825 - [97] = (/vf:VymennyFormat/vf:Data/vf:ZaniklePrvky/vf:ZaniklyPrvek/vf:IdTransakce) 825 - [98] = (/vf:VymennyFormat/vf:Data/vf:ZaniklePrvky/vf:ZaniklyPrvek/vf:IdTransakce:XML_TEXT) 825 - [99] = (/vf:VymennyFormat/vf:Data/vf:ZaniklePrvky/vf:ZaniklyPrvek/vf:PrvekId) 825 - [100] = (/vf:VymennyFormat/vf:Data/vf:ZaniklePrvky/vf:ZaniklyPrvek/vf:PrvekId:XML_TEXT) 825 - [101] = (/vf:VymennyFormat/vf:Data/vf:ZaniklePrvky/vf:ZaniklyPrvek/vf:TypPrvkuKod) 825 - [102] = (/vf:VymennyFormat/vf:Data/vf:ZaniklePrvky/vf:ZaniklyPrvek/vf:TypPrvkuKod:XML_TEXT) 825 - [103] = (/vf:VymennyFormat/vf:Hlavicka) 1 - [104] = (/vf:VymennyFormat/vf:Hlavicka/vf:Datum) 1 - [105] = (/vf:VymennyFormat/vf:Hlavicka/vf:Datum:XML_TEXT) 1 - [106] = (/vf:VymennyFormat/vf:Hlavicka/vf:Metadata) 1 - [107] = (/vf:VymennyFormat/vf:Hlavicka/vf:PlatnostDatK) 1 - [108] = (/vf:VymennyFormat/vf:Hlavicka/vf:PlatnostDatK/com:ISKN) 1 - [109] = (/vf:VymennyFormat/vf:Hlavicka/vf:PlatnostDatK/com:ISKN:XML_TEXT) 1 - [110] = (/vf:VymennyFormat/vf:Hlavicka/vf:PlatnostDatK/com:ISUI) 1 - [111] = (/vf:VymennyFormat/vf:Hlavicka/vf:PlatnostDatK/com:ISUI:XML_TEXT) 1 - [112] = (/vf:VymennyFormat/vf:Hlavicka/vf:PredchoziSoubor) 1 - [113] = (/vf:VymennyFormat/vf:Hlavicka/vf:PredchoziSoubor:XML_TEXT) 1 - [114] = (/vf:VymennyFormat/vf:Hlavicka/vf:TransakceDo) 1 - [115] = (/vf:VymennyFormat/vf:Hlavicka/vf:TransakceDo/com:Id) 1 - [116] = (/vf:VymennyFormat/vf:Hlavicka/vf:TransakceDo/com:Id:XML_TEXT) 1 - [117] = (/vf:VymennyFormat/vf:Hlavicka/vf:TransakceDo/com:Zapsano) 1 - [118] = (/vf:VymennyFormat/vf:Hlavicka/vf:TransakceDo/com:Zapsano:XML_TEXT) 1 - [119] = (/vf:VymennyFormat/vf:Hlavicka/vf:TrasakceOd) 1 - [120] = (/vf:VymennyFormat/vf:Hlavicka/vf:TrasakceOd/com:Id) 1 - [121] = (/vf:VymennyFormat/vf:Hlavicka/vf:TrasakceOd/com:Id:XML_TEXT) 1 - [122] = (/vf:VymennyFormat/vf:Hlavicka/vf:TrasakceOd/com:Zapsano) 1 - [123] = (/vf:VymennyFormat/vf:Hlavicka/vf:TrasakceOd/com:Zapsano:XML_TEXT) 1 - [124] = (/vf:VymennyFormat/vf:Hlavicka/vf:TypDavky) 1 - [125] = (/vf:VymennyFormat/vf:Hlavicka/vf:TypDavky:XML_TEXT) 1 - [126] = (/vf:VymennyFormat/vf:Hlavicka/vf:TypSouboru) 1 - [127] = (/vf:VymennyFormat/vf:Hlavicka/vf:TypSouboru:XML_TEXT) 1 - [128] = (/vf:VymennyFormat/vf:Hlavicka/vf:TypZaznamu) 1 - [129] = (/vf:VymennyFormat/vf:Hlavicka/vf:TypZaznamu:XML_TEXT) 1 - [130] = (/vf:VymennyFormat/vf:Hlavicka/vf:VerzeVFR) 1 - [131] = (/vf:VymennyFormat/vf:Hlavicka/vf:VerzeVFR:XML_TEXT) 1 -count: - [0] = (XML_TAG) 1106448 - [1] = (XML_TAG.len) 13320930 - [2] = (XML_TEXT) 714331 - [3] = (XML_TEXT.len) 3989925 - [4] = (attr) 152063 - -vf:VymennyFormat ------------ -ALL -452392 KB used ------- - 16 B, 4197462 allocated (65585 KB), 142 fragmented ( 2 KB) - 32 B, 2451008 allocated (76594 KB), 92 fragmented ( 2 KB) - 48 B, 5934289 allocated (278169 KB), 59 fragmented ( 2 KB) - 64 B, 355718 allocated (22232 KB), 43 fragmented ( 2 KB) - 80 B, 31375 allocated ( 2451 KB), 25 fragmented ( 1 KB) - 96 B, 28 allocated ( 2 KB), 14 fragmented ( 1 KB) - 112 B, 25 allocated ( 2 KB), 11 fragmented ( 1 KB) - 128 B, 1568 allocated ( 196 KB), 13 fragmented ( 1 KB) - 144 B, 24 allocated ( 3 KB), 4 fragmented ( 0 KB) - 160 B, 13 allocated ( 2 KB), 12 fragmented ( 1 KB) - 176 B, 17 allocated ( 2 KB), 6 fragmented ( 1 KB) - 192 B, 72 allocated ( 13 KB), 12 fragmented ( 2 KB) - 208 B, 13 allocated ( 2 KB), 6 fragmented ( 1 KB) - 224 B, 8 allocated ( 1 KB), 10 fragmented ( 2 KB) - 288 B, 18 allocated ( 5 KB), 10 fragmented ( 2 KB) - 368 B, 4 allocated ( 1 KB), 7 fragmented ( 2 KB) - 448 B, 3 allocated ( 1 KB), 6 fragmented ( 2 KB) - 576 B, 7 allocated ( 3 KB), 0 fragmented ( 0 KB) - TOTAL, 12971652 allocated (445272 KB), 472 fragmented ( 33 KB) -Free pages 0 (0 KB) -Large block count 14, total size 20 KB -Large fragments count 5, total size 43 KB - -map: - [0] = (/vf:VymennyFormat) 1 - [1] = (/vf:VymennyFormat/vf:Data) 1 - [2] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista) 1 - [3] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto) 121959 - [4] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:CisloDomovni) 121959 - [5] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:CisloDomovni:XML_TEXT) 121959 - [6] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:CisloOrientacni) 15323 - [7] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:CisloOrientacni:XML_TEXT) 15323 - [8] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:CisloOrientacniPismeno) 637 - [9] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:CisloOrientacniPismeno:XML_TEXT) 637 - [10] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:Geometrie) 121959 - [11] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:Geometrie/ami:DefinicniBod) 121959 - [12] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:Geometrie/ami:DefinicniBod/ami:AdresniBod) 121959 - [13] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:Geometrie/ami:DefinicniBod/ami:AdresniBod/gml:Point) 121959 - [14] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:Geometrie/ami:DefinicniBod/ami:AdresniBod/gml:Point/gml:pos) 121959 - [15] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:Geometrie/ami:DefinicniBod/ami:AdresniBod/gml:Point/gml:pos:XML_TEXT) 121959 - [16] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:Geometrie/ami:DefinicniBod/ami:Hasici) 742 - [17] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:Geometrie/ami:DefinicniBod/ami:Hasici/gml:Point) 742 - [18] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:Geometrie/ami:DefinicniBod/ami:Hasici/gml:Point/gml:pos) 742 - [19] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:Geometrie/ami:DefinicniBod/ami:Hasici/gml:Point/gml:pos:XML_TEXT) 742 - [20] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:Geometrie/ami:DefinicniBod/ami:Zachranka) 682 - [21] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:Geometrie/ami:DefinicniBod/ami:Zachranka/gml:Point) 682 - [22] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:Geometrie/ami:DefinicniBod/ami:Zachranka/gml:Point/gml:pos) 682 - [23] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:Geometrie/ami:DefinicniBod/ami:Zachranka/gml:Point/gml:pos:XML_TEXT) 682 - [24] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:GlobalniIdNavrhuZmeny) 121959 - [25] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:GlobalniIdNavrhuZmeny:XML_TEXT) 121959 - [26] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:IdTransakce) 121959 - [27] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:IdTransakce:XML_TEXT) 121959 - [28] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:Kod) 121959 - [29] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:Kod:XML_TEXT) 121959 - [30] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:PlatiOd) 121959 - [31] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:PlatiOd:XML_TEXT) 121959 - [32] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:Psc) 121959 - [33] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:Psc:XML_TEXT) 121959 - [34] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:StavebniObjekt) 121959 - [35] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:StavebniObjekt/soi:Kod) 121959 - [36] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:StavebniObjekt/soi:Kod:XML_TEXT) 121959 - [37] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:Ulice) 59981 - [38] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:Ulice/uli:Kod) 59981 - [39] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:Ulice/uli:Kod:XML_TEXT) 59981 - [40] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:VOKod) 121833 - [41] = (/vf:VymennyFormat/vf:Data/vf:AdresniMista/vf:AdresniMisto/ami:VOKod:XML_TEXT) 121833 - [42] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi) 1 - [43] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi) 137 - [44] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:ExistujeDigitalniMapa) 137 - [45] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:ExistujeDigitalniMapa:XML_TEXT) 137 - [46] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:Geometrie) 137 - [47] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:Geometrie/kui:DefinicniBod) 137 - [48] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:Geometrie/kui:DefinicniBod/gml:MultiPoint) 137 - [49] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:Geometrie/kui:DefinicniBod/gml:MultiPoint/gml:pointMembers) 137 - [50] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:Geometrie/kui:DefinicniBod/gml:MultiPoint/gml:pointMembers/gml:Point) 137 - [51] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:Geometrie/kui:DefinicniBod/gml:MultiPoint/gml:pointMembers/gml:Point/gml:pos) 137 - [52] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:Geometrie/kui:DefinicniBod/gml:MultiPoint/gml:pointMembers/gml:Point/gml:pos:XML_TEXT) 137 - [53] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:GlobalniIdNavrhuZmeny) 137 - [54] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:GlobalniIdNavrhuZmeny:XML_TEXT) 137 - [55] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:IdTransakce) 137 - [56] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:IdTransakce:XML_TEXT) 137 - [57] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:Kod) 137 - [58] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:Kod:XML_TEXT) 137 - [59] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:MluvnickeCharakteristiky) 2 - [60] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:MluvnickeCharakteristiky/com:Pad2) 2 - [61] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:MluvnickeCharakteristiky/com:Pad2:XML_TEXT) 2 - [62] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:MluvnickeCharakteristiky/com:Pad3) 2 - [63] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:MluvnickeCharakteristiky/com:Pad3:XML_TEXT) 2 - [64] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:MluvnickeCharakteristiky/com:Pad4) 2 - [65] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:MluvnickeCharakteristiky/com:Pad4:XML_TEXT) 2 - [66] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:MluvnickeCharakteristiky/com:Pad5) 2 - [67] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:MluvnickeCharakteristiky/com:Pad5:XML_TEXT) 2 - [68] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:MluvnickeCharakteristiky/com:Pad6) 2 - [69] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:MluvnickeCharakteristiky/com:Pad6:XML_TEXT) 2 - [70] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:MluvnickeCharakteristiky/com:Pad7) 2 - [71] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:MluvnickeCharakteristiky/com:Pad7:XML_TEXT) 2 - [72] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:Nazev) 137 - [73] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:Nazev:XML_TEXT) 137 - [74] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:Obec) 137 - [75] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:Obec/obi:Kod) 137 - [76] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:Obec/obi:Kod:XML_TEXT) 137 - [77] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:PlatiOd) 137 - [78] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:PlatiOd:XML_TEXT) 137 - [79] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:RizeniId) 137 - [80] = (/vf:VymennyFormat/vf:Data/vf:KatastralniUzemi/vf:KatastralniUzemi/kui:RizeniId:XML_TEXT) 137 - [81] = (/vf:VymennyFormat/vf:Data/vf:Parcely) 1 - [82] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela) 25627 - [83] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:BonitovaneDily) 5366 - [84] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:BonitovaneDily/com:BonitovanyDil) 7377 - [85] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:BonitovaneDily/com:BonitovanyDil/com:BonitovanaJednotkaKod) 7377 - [86] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:BonitovaneDily/com:BonitovanyDil/com:BonitovanaJednotkaKod:XML_TEXT) 7377 - [87] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:BonitovaneDily/com:BonitovanyDil/com:IdTranskace) 7377 - [88] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:BonitovaneDily/com:BonitovanyDil/com:IdTranskace:XML_TEXT) 7377 - [89] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:BonitovaneDily/com:BonitovanyDil/com:RizeniId) 7377 - [90] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:BonitovaneDily/com:BonitovanyDil/com:RizeniId:XML_TEXT) 7377 - [91] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:BonitovaneDily/com:BonitovanyDil/com:Vymera) 7377 - [92] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:BonitovaneDily/com:BonitovanyDil/com:Vymera:XML_TEXT) 7377 - [93] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:DruhCislovaniKod) 25627 - [94] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:DruhCislovaniKod:XML_TEXT) 25627 - [95] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:DruhPozemkuKod) 25627 - [96] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:DruhPozemkuKod:XML_TEXT) 25627 - [97] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:Geometrie) 25608 - [98] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:Geometrie/pai:DefinicniBod) 25608 - [99] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:Geometrie/pai:DefinicniBod/gml:Point) 25608 - [100] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:Geometrie/pai:DefinicniBod/gml:Point/gml:pos) 25608 - [101] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:Geometrie/pai:DefinicniBod/gml:Point/gml:pos:XML_TEXT) 25608 - [102] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:Id) 25627 - [103] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:Id:XML_TEXT) 25627 - [104] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:IdTransakce) 25627 - [105] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:IdTransakce:XML_TEXT) 25627 - [106] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:KatastralniUzemi) 25627 - [107] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:KatastralniUzemi/kui:Kod) 25627 - [108] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:KatastralniUzemi/kui:Kod:XML_TEXT) 25627 - [109] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:KmenoveCislo) 25627 - [110] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:KmenoveCislo:XML_TEXT) 25627 - [111] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:PlatiOd) 25627 - [112] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:PlatiOd:XML_TEXT) 25627 - [113] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:PododdeleniCisla) 17038 - [114] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:PododdeleniCisla:XML_TEXT) 17038 - [115] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:RizeniId) 25627 - [116] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:RizeniId:XML_TEXT) 25627 - [117] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:VymeraParcely) 25627 - [118] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:VymeraParcely:XML_TEXT) 25627 - [119] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:ZpusobyOchranyPozemku) 16824 - [120] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:ZpusobyOchranyPozemku/com:ZpusobOchrany) 20752 - [121] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:ZpusobyOchranyPozemku/com:ZpusobOchrany/com:IdTransakce) 20752 - [122] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:ZpusobyOchranyPozemku/com:ZpusobOchrany/com:IdTransakce:XML_TEXT) 20752 - [123] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:ZpusobyOchranyPozemku/com:ZpusobOchrany/com:Kod) 20752 - [124] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:ZpusobyOchranyPozemku/com:ZpusobOchrany/com:Kod:XML_TEXT) 20752 - [125] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:ZpusobyOchranyPozemku/com:ZpusobOchrany/com:RizeniId) 20752 - [126] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:ZpusobyOchranyPozemku/com:ZpusobOchrany/com:RizeniId:XML_TEXT) 20752 - [127] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:ZpusobyOchranyPozemku/com:ZpusobOchrany/com:TypOchranyKod) 20752 - [128] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:ZpusobyOchranyPozemku/com:ZpusobOchrany/com:TypOchranyKod:XML_TEXT) 20752 - [129] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:ZpusobyVyuzitiPozemku) 7220 - [130] = (/vf:VymennyFormat/vf:Data/vf:Parcely/vf:Parcela/pai:ZpusobyVyuzitiPozemku:XML_TEXT) 7220 - [131] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty) 1 - [132] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt) 29390 - [133] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:CastObce) 28496 - [134] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:CastObce/coi:Kod) 28496 - [135] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:CastObce/coi:Kod:XML_TEXT) 28496 - [136] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:CislaDomovni) 28496 - [137] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:CislaDomovni/com:CisloDomovni) 28592 - [138] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:CislaDomovni/com:CisloDomovni:XML_TEXT) 28592 - [139] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DetailniTEA) 67 - [140] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DetailniTEA/soi:DetailniTEA) 154 - [141] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DetailniTEA/soi:DetailniTEA/soi:AdresniMistoKod) 154 - [142] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DetailniTEA/soi:DetailniTEA/soi:AdresniMistoKod/base:Kod) 154 - [143] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DetailniTEA/soi:DetailniTEA/soi:AdresniMistoKod/base:Kod:XML_TEXT) 154 - [144] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DetailniTEA/soi:DetailniTEA/soi:DruhKonstrukceKod) 70 - [145] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DetailniTEA/soi:DetailniTEA/soi:DruhKonstrukceKod:XML_TEXT) 70 - [146] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DetailniTEA/soi:DetailniTEA/soi:GlobalniIdNavrhuZmeny) 154 - [147] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DetailniTEA/soi:DetailniTEA/soi:GlobalniIdNavrhuZmeny:XML_TEXT) 154 - [148] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DetailniTEA/soi:DetailniTEA/soi:Kod) 154 - [149] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DetailniTEA/soi:DetailniTEA/soi:Kod:XML_TEXT) 154 - [150] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DetailniTEA/soi:DetailniTEA/soi:PlatiOd) 154 - [151] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DetailniTEA/soi:DetailniTEA/soi:PlatiOd:XML_TEXT) 154 - [152] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DetailniTEA/soi:DetailniTEA/soi:PocetBytu) 154 - [153] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DetailniTEA/soi:DetailniTEA/soi:PocetBytu:XML_TEXT) 154 - [154] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DetailniTEA/soi:DetailniTEA/soi:PocetPodlazi) 131 - [155] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DetailniTEA/soi:DetailniTEA/soi:PocetPodlazi:XML_TEXT) 131 - [156] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DetailniTEA/soi:DetailniTEA/soi:PripojeniKanalizaceKod) 84 - [157] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DetailniTEA/soi:DetailniTEA/soi:PripojeniKanalizaceKod:XML_TEXT) 84 - [158] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DetailniTEA/soi:DetailniTEA/soi:PripojeniPlynKod) 84 - [159] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DetailniTEA/soi:DetailniTEA/soi:PripojeniPlynKod:XML_TEXT) 84 - [160] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DetailniTEA/soi:DetailniTEA/soi:PripojeniVodovodKod) 84 - [161] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DetailniTEA/soi:DetailniTEA/soi:PripojeniVodovodKod:XML_TEXT) 84 - [162] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DetailniTEA/soi:DetailniTEA/soi:ZpusobVytapeniKod) 84 - [163] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DetailniTEA/soi:DetailniTEA/soi:ZpusobVytapeniKod:XML_TEXT) 84 - [164] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:Dokonceni) 1960 - [165] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:Dokonceni:XML_TEXT) 1960 - [166] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DruhKonstrukceKod) 25740 - [167] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:DruhKonstrukceKod:XML_TEXT) 25740 - [168] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:Geometrie) 29310 - [169] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:Geometrie/soi:DefinicniBod) 29310 - [170] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:Geometrie/soi:DefinicniBod/gml:Point) 29310 - [171] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:Geometrie/soi:DefinicniBod/gml:Point/gml:pos) 29310 - [172] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:Geometrie/soi:DefinicniBod/gml:Point/gml:pos:XML_TEXT) 29310 - [173] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:GlobalniIdNavrhuZmeny) 29390 - [174] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:GlobalniIdNavrhuZmeny:XML_TEXT) 29390 - [175] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:IdTransakce) 29390 - [176] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:IdTransakce:XML_TEXT) 29390 - [177] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:IdentifikacniParcela) 29390 - [178] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:IdentifikacniParcela/pai:Id) 29390 - [179] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:IdentifikacniParcela/pai:Id:XML_TEXT) 29390 - [180] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:IsknBudovaId) 28951 - [181] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:IsknBudovaId:XML_TEXT) 28951 - [182] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:Kod) 29390 - [183] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:Kod:XML_TEXT) 29390 - [184] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:Momc) 36 - [185] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:Momc/mci:Kod) 36 - [186] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:Momc/mci:Kod:XML_TEXT) 36 - [187] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:Nespravny) 1 - [188] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:Nespravny:XML_TEXT) 1 - [189] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:ObestavenyProstor) 1696 - [190] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:ObestavenyProstor:XML_TEXT) 1696 - [191] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:PlatiOd) 29390 - [192] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:PlatiOd:XML_TEXT) 29390 - [193] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:PocetBytu) 28433 - [194] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:PocetBytu:XML_TEXT) 28433 - [195] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:PocetPodlazi) 23977 - [196] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:PocetPodlazi:XML_TEXT) 23977 - [197] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:PodlahovaPlocha) 1234 - [198] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:PodlahovaPlocha:XML_TEXT) 1234 - [199] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:PripojeniKanalizaceKod) 26880 - [200] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:PripojeniKanalizaceKod:XML_TEXT) 26880 - [201] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:PripojeniPlynKod) 26756 - [202] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:PripojeniPlynKod:XML_TEXT) 26756 - [203] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:PripojeniVodovodKod) 26874 - [204] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:PripojeniVodovodKod:XML_TEXT) 26874 - [205] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:TypStavebnihoObjektuKod) 29390 - [206] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:TypStavebnihoObjektuKod:XML_TEXT) 29390 - [207] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:VybaveniVytahemKod) 26943 - [208] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:VybaveniVytahemKod:XML_TEXT) 26943 - [209] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:ZastavenaPlocha) 1778 - [210] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:ZastavenaPlocha:XML_TEXT) 1778 - [211] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:ZpusobVytapeniKod) 26757 - [212] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:ZpusobVytapeniKod:XML_TEXT) 26757 - [213] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:ZpusobVyuzitiKod) 29156 - [214] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:ZpusobVyuzitiKod:XML_TEXT) 29156 - [215] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:ZpusobyOchrany) 2797 - [216] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:ZpusobyOchrany/com:ZpusobOchrany) 2869 - [217] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:ZpusobyOchrany/com:ZpusobOchrany/com:IdTransakce) 2869 - [218] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:ZpusobyOchrany/com:ZpusobOchrany/com:IdTransakce:XML_TEXT) 2869 - [219] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:ZpusobyOchrany/com:ZpusobOchrany/com:Kod) 2869 - [220] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:ZpusobyOchrany/com:ZpusobOchrany/com:Kod:XML_TEXT) 2869 - [221] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:ZpusobyOchrany/com:ZpusobOchrany/com:RizeniId) 2869 - [222] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:ZpusobyOchrany/com:ZpusobOchrany/com:RizeniId:XML_TEXT) 2869 - [223] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:ZpusobyOchrany/com:ZpusobOchrany/com:TypOchranyKod) 2869 - [224] = (/vf:VymennyFormat/vf:Data/vf:StavebniObjekty/vf:StavebniObjekt/soi:ZpusobyOchrany/com:ZpusobOchrany/com:TypOchranyKod:XML_TEXT) 2869 - [225] = (/vf:VymennyFormat/vf:Data/vf:Ulice) 1 - [226] = (/vf:VymennyFormat/vf:Data/vf:Ulice/vf:Ulice) 1 - [227] = (/vf:VymennyFormat/vf:Data/vf:Ulice/vf:Ulice/uli:GlobalniIdNavrhuZmeny) 1 - [228] = (/vf:VymennyFormat/vf:Data/vf:Ulice/vf:Ulice/uli:GlobalniIdNavrhuZmeny:XML_TEXT) 1 - [229] = (/vf:VymennyFormat/vf:Data/vf:Ulice/vf:Ulice/uli:IdTransakce) 1 - [230] = (/vf:VymennyFormat/vf:Data/vf:Ulice/vf:Ulice/uli:IdTransakce:XML_TEXT) 1 - [231] = (/vf:VymennyFormat/vf:Data/vf:Ulice/vf:Ulice/uli:Kod) 1 - [232] = (/vf:VymennyFormat/vf:Data/vf:Ulice/vf:Ulice/uli:Kod:XML_TEXT) 1 - [233] = (/vf:VymennyFormat/vf:Data/vf:Ulice/vf:Ulice/uli:Nazev) 1 - [234] = (/vf:VymennyFormat/vf:Data/vf:Ulice/vf:Ulice/uli:Nazev:XML_TEXT) 1 - [235] = (/vf:VymennyFormat/vf:Data/vf:Ulice/vf:Ulice/uli:Obec) 1 - [236] = (/vf:VymennyFormat/vf:Data/vf:Ulice/vf:Ulice/uli:Obec/obi:Kod) 1 - [237] = (/vf:VymennyFormat/vf:Data/vf:Ulice/vf:Ulice/uli:Obec/obi:Kod:XML_TEXT) 1 - [238] = (/vf:VymennyFormat/vf:Data/vf:Ulice/vf:Ulice/uli:PlatiOd) 1 - [239] = (/vf:VymennyFormat/vf:Data/vf:Ulice/vf:Ulice/uli:PlatiOd:XML_TEXT) 1 - [240] = (/vf:VymennyFormat/vf:Data/vf:ZaniklePrvky) 1 - [241] = (/vf:VymennyFormat/vf:Data/vf:ZaniklePrvky/vf:ZaniklyPrvek) 825 - [242] = (/vf:VymennyFormat/vf:Data/vf:ZaniklePrvky/vf:ZaniklyPrvek/vf:IdTransakce) 825 - [243] = (/vf:VymennyFormat/vf:Data/vf:ZaniklePrvky/vf:ZaniklyPrvek/vf:IdTransakce:XML_TEXT) 825 - [244] = (/vf:VymennyFormat/vf:Data/vf:ZaniklePrvky/vf:ZaniklyPrvek/vf:PrvekId) 825 - [245] = (/vf:VymennyFormat/vf:Data/vf:ZaniklePrvky/vf:ZaniklyPrvek/vf:PrvekId:XML_TEXT) 825 - [246] = (/vf:VymennyFormat/vf:Data/vf:ZaniklePrvky/vf:ZaniklyPrvek/vf:TypPrvkuKod) 825 - [247] = (/vf:VymennyFormat/vf:Data/vf:ZaniklePrvky/vf:ZaniklyPrvek/vf:TypPrvkuKod:XML_TEXT) 825 - [248] = (/vf:VymennyFormat/vf:Hlavicka) 1 - [249] = (/vf:VymennyFormat/vf:Hlavicka/vf:Datum) 1 - [250] = (/vf:VymennyFormat/vf:Hlavicka/vf:Datum:XML_TEXT) 1 - [251] = (/vf:VymennyFormat/vf:Hlavicka/vf:Metadata) 1 - [252] = (/vf:VymennyFormat/vf:Hlavicka/vf:PlatnostDatK) 1 - [253] = (/vf:VymennyFormat/vf:Hlavicka/vf:PlatnostDatK/com:ISKN) 1 - [254] = (/vf:VymennyFormat/vf:Hlavicka/vf:PlatnostDatK/com:ISKN:XML_TEXT) 1 - [255] = (/vf:VymennyFormat/vf:Hlavicka/vf:PlatnostDatK/com:ISUI) 1 - [256] = (/vf:VymennyFormat/vf:Hlavicka/vf:PlatnostDatK/com:ISUI:XML_TEXT) 1 - [257] = (/vf:VymennyFormat/vf:Hlavicka/vf:PredchoziSoubor) 1 - [258] = (/vf:VymennyFormat/vf:Hlavicka/vf:PredchoziSoubor:XML_TEXT) 1 - [259] = (/vf:VymennyFormat/vf:Hlavicka/vf:TransakceDo) 1 - [260] = (/vf:VymennyFormat/vf:Hlavicka/vf:TransakceDo/com:Id) 1 - [261] = (/vf:VymennyFormat/vf:Hlavicka/vf:TransakceDo/com:Id:XML_TEXT) 1 - [262] = (/vf:VymennyFormat/vf:Hlavicka/vf:TransakceDo/com:Zapsano) 1 - [263] = (/vf:VymennyFormat/vf:Hlavicka/vf:TransakceDo/com:Zapsano:XML_TEXT) 1 - [264] = (/vf:VymennyFormat/vf:Hlavicka/vf:TrasakceOd) 1 - [265] = (/vf:VymennyFormat/vf:Hlavicka/vf:TrasakceOd/com:Id) 1 - [266] = (/vf:VymennyFormat/vf:Hlavicka/vf:TrasakceOd/com:Id:XML_TEXT) 1 - [267] = (/vf:VymennyFormat/vf:Hlavicka/vf:TrasakceOd/com:Zapsano) 1 - [268] = (/vf:VymennyFormat/vf:Hlavicka/vf:TrasakceOd/com:Zapsano:XML_TEXT) 1 - [269] = (/vf:VymennyFormat/vf:Hlavicka/vf:TypDavky) 1 - [270] = (/vf:VymennyFormat/vf:Hlavicka/vf:TypDavky:XML_TEXT) 1 - [271] = (/vf:VymennyFormat/vf:Hlavicka/vf:TypSouboru) 1 - [272] = (/vf:VymennyFormat/vf:Hlavicka/vf:TypSouboru:XML_TEXT) 1 - [273] = (/vf:VymennyFormat/vf:Hlavicka/vf:TypZaznamu) 1 - [274] = (/vf:VymennyFormat/vf:Hlavicka/vf:TypZaznamu:XML_TEXT) 1 - [275] = (/vf:VymennyFormat/vf:Hlavicka/vf:VerzeVFR) 1 - [276] = (/vf:VymennyFormat/vf:Hlavicka/vf:VerzeVFR:XML_TEXT) 1 -count: - [0] = (XML_TAG) 4415334 - [1] = (XML_TAG.len) 58221669 - [2] = (XML_TEXT) 2838657 - [3] = (XML_TEXT.len) 19642287 - [4] = (attr) 864656 ------------ - 16 B, 230 allocated ( 3 KB), 532 fragmented ( 8 KB) - 32 B, 116 allocated ( 3 KB), 900 fragmented ( 28 KB) - 48 B, 146 allocated ( 6 KB), 190 fragmented ( 8 KB) - 64 B, 63 allocated ( 3 KB), 63 fragmented ( 3 KB) - 80 B, 50 allocated ( 3 KB), 50 fragmented ( 3 KB) - 96 B, 28 allocated ( 2 KB), 14 fragmented ( 1 KB) - 112 B, 33 allocated ( 3 KB), 39 fragmented ( 4 KB) - 128 B, 33 allocated ( 4 KB), 60 fragmented ( 7 KB) - 144 B, 24 allocated ( 3 KB), 32 fragmented ( 4 KB) - 160 B, 22 allocated ( 3 KB), 3 fragmented ( 0 KB) - 176 B, 19 allocated ( 3 KB), 27 fragmented ( 4 KB) - 192 B, 84 allocated ( 15 KB), 21 fragmented ( 3 KB) - 208 B, 16 allocated ( 3 KB), 22 fragmented ( 4 KB) - 224 B, 15 allocated ( 3 KB), 21 fragmented ( 4 KB) - 288 B, 18 allocated ( 5 KB), 24 fragmented ( 6 KB) - 368 B, 4 allocated ( 1 KB), 7 fragmented ( 2 KB) - 448 B, 3 allocated ( 1 KB), 6 fragmented ( 2 KB) - 576 B, 7 allocated ( 3 KB), 0 fragmented ( 0 KB) - TOTAL, 911 allocated ( 76 KB), 2011 fragmented ( 100 KB) -Free pages 112778 (451112 KB) -Large block count 9, total size 16 KB -Large fragments count 4, total size 47 KB - -TIMING Parse all! : 8.45 s - 8.45 s ( 8.45 s / 1 ), min: 8.45 s , max: 8.45 s , nesting: 1 - 1 -TIMING Parse with ignore!: 5.45 s - 5.45 s ( 5.45 s / 1 ), min: 5.45 s , max: 5.45 s , nesting: 1 - 1 diff --git a/uppdev/XmlNodeFilter/init b/uppdev/XmlNodeFilter/init deleted file mode 100644 index 0eca3a652..000000000 --- a/uppdev/XmlNodeFilter/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _XmlNodeFilter_icpp_init_stub -#define _XmlNodeFilter_icpp_init_stub -#include "Core/init" -#endif diff --git a/uppdev/XmlRpc/ValueXmlConvert.cpp b/uppdev/XmlRpc/ValueXmlConvert.cpp deleted file mode 100644 index 1a6627716..000000000 --- a/uppdev/XmlRpc/ValueXmlConvert.cpp +++ /dev/null @@ -1,71 +0,0 @@ -#include "XmlRpc.h" - -/** -* Conversion of Primitives to Xml. This converts primitives such as String, Boolean, Integer, -* Double, Date, Time and Base64 to their corresponding Xml representation. -* @param xml the XmlNode that will hold the xml after conversion -* @param v the Primitive-Value that is to be converted -* @return nothing -*/ -void ValueXmlConvert::PrimitiveToXml(XmlNode& xml,const Value& v) const { - if(v.GetType() == DOUBLE_V) - xml("double").Add().CreateText(v.ToString()); - if(v.GetType() == INT_V) - xml("int").Add().CreateText(v.ToString()); - if(v.GetType() == STRING_V || v.GetType() == WSTRING_V ) - xml("string").Add().CreateText(v.ToString()); - //if(v.GetType() == BOOL_V) - // xml("boolean").Add().CreateText(v.ToString()); - if(v.GetType() == DATE_V || v.GetType() == TIME_V) { - String text; - Time t=v; - text << t.year << (t.month<10?"0":"") << (int)t.month << (t.day<10?"0":"") << (int)t.day <<'T'<<(t.hour<10?"0":"") << (int)t.hour; - text << ':' << (t.minute<10?"0":""); - text << (int)t.minute << ":"<<(t.second<10?"0":"") << (int)t.second; - xml("dateTime.iso8601").Add().CreateText(text); - } -} - -/** -* Conversion of all Values to Xml. This converts Values to their xml representation. Primitives -* such as String, Boolean, Integer, Double, Date, Time and Base64 are passed to PrimitiveToXml(). -* Unknown Types are converted to Base64. -* @param xml the XmlNode that will hold the xml after conversion -* @param v the Value that is to be converted -* @return nothing -*/ -void ValueXmlConvert::ValueToXml(XmlNode& xml, Value& v) const { - ValueArray va; - ValueMap vm; - switch(v.GetType()) { - case DOUBLE_V: - case INT_V: - case STRING_V: - case WSTRING_V: - case DATE_V: - case TIME_V: - //case BOOL_V: - PrimitiveToXml(xml,v); - break; - case VALUEARRAY_V: - va=v; - for(int j=0;j -#include -#include -#include -/** -* Base class that converts Values to XML. This base class is used for XmlRpcCall and XmlRpcServer to -* convert their Values to the corresponding XML string to send to the other side. -*/ -class ValueXmlConvert { - public: - typedef ValueXmlConvert CLASSNAME; - void PrimitiveToXml(XmlNode& xml,const Value& v) const; - void ValueToXml(XmlNode& xml, Value& v) const; -}; - -/** -* Class to create calls to a Xml Server. This class is used by XmlRpcClient to generate calls and send them -* to the server. A XmlRpcCall is passed to XmlRpcClient::Execute() to be sent to the server. -*/ -class XmlRpcCall : ValueXmlConvert { - private: - String method; - ValueArray va; - VectorMap NumberToValue; - - public: - typedef XmlRpcCall CLASSNAME; - XmlRpcCall(); - XmlRpcCall(String _method); - XmlRpcCall(const char *_method); - XmlRpcCall& operator() (const Value& v); - void Clear(); - String ToXml() const; -}; - -/** -* Class that parses the Xml answers. XmlRpcParser is used by XmlRpcClient and XmlRpcServer to parse the -* incomming traffic and convert it to a Value that can be used to respond (at the server side) or -* returned to the user (client side). -*/ -class XmlRpcParser { - protected: - Value ParsePrimitive(XmlParser& p); - Value ParseStruct(XmlParser& p); - Value ParseArray(XmlParser& p); - Value Parse(XmlParser& p); - - public: - typedef XmlRpcParser CLASSNAME; - XmlRpcParser(); - - Value ParseMethodCall(String s); - Value ParseMethodResponse(String s); -}; - -/** -* Client class used to connect to a server. This base class is used for XmlRpcClient and XmlRpcServer to -* convert their Values to the corresponding XML string to send to the other side. -*/ -class XmlRpcClient { - private: - HttpClient http; - String rawReply; - XmlRpcParser xmlReply; - SSLContext sslcontext; - bool usessl; - - public: - typedef XmlRpcClient CLASSNAME; - XmlRpcClient(); - XmlRpcClient(String host, String path, int Port); - /** - * enable the use of ssl encryption. enable the use of ssl encryption, - * the default setting is off - * @param ssl set the use on if true - * @warning if no ssl context is set it sets the method to TLS - * and does NOT verify the peer - */ - void UseSSl(bool ssl=true) {usessl=ssl;} - XmlRpcClient& Host(String h); - XmlRpcClient& Path(String p); - XmlRpcClient& Port(int p); - /** - * get the ssl context. get the ssl context - */ - SSLContext& GetSSLContext() {return sslcontext;} - //HttpClient& Get(); - /* - * returns the raw reply. returns the raw(= non parsed) reply of the server - */ - const String& GetRawReply() const {return rawReply;} - Value Execute(const XmlRpcCall& call); - -}; - -/** -* Server Methods-Class. This is the base class of Methods that are used by the server to response -* to questions of any clients. -*/ -class XmlRpcMethod { - protected: - String name; - public: - typedef XmlRpcMethod CLASSNAME; - /** - * constructs a method without a name. constructs a method without a name, should not be used! - */ - XmlRpcMethod() {name.Clear();} - /** - * create a named method. create a method with name \p s. it will be called - * if the call includes \p s as method name and the signature of the call - * and the method are the same. - * @param s the name of the method - * @see Execute(), Signature() - */ - XmlRpcMethod(String s) {name = s;} - /** - * called if executed. this has to be implemented by any method that should be used. - * it is called if one of the signatures of the method and the name match - * @param result a reference to a Value in which after execution the result has to be - * @param params a ValueArray containing only the parameters, not the methodname. - * @param ipadd the ip address of the calling client - * @see Signature() - */ - virtual void Execute(Value& result, ValueArray params, dword ipadd) {} - /** - * return help of the message. this method just has to set the String \p help - * to availeable help. no xml tags are allowed within this help. - * @param help string to store the help for the message in - */ - virtual void Help(String& help) {} - /** - * setting the signature. this method has to set the signature(s) of the methodcall: - * each Value in the ValueArray \p sig is a signature, which also is a ValueArray, so - * for each signature one has to add a ValueArray to \p sig. - * if for example a functions looks like this int something(int x,double y) or - * like int something(double x, string y, int z), the result would be: - * @code - * ValueArray first, second; - * first.Add(1); //1 is an int, return value - * first.Add(1); //1 is an int, x - * first.Add(1.1); //1.1 is a double, y - * - * second.Add(1); - * second.Add(1.1); - * second.Add("abc"); - * second.Add(1); - * - * sig.Add(first); - * sig.Add(second); - * @endcode - */ - virtual void Signature(ValueArray& sig) {} - String GetName() {return name;} -}; - - -/** -* Server class used to run a Xml-Rpc Server. This class implements a complete Server with extendeable functionality. -* a new Method is Added by creating a new class derived from XmlRpcMethod and add it by using the Add() function. -*/ -class XmlRpcServer : ValueXmlConvert { - public: - /** - * base class of server system methods. Internal Methods of the server should be derived from this class. - * it is pretty the same as the XmlRpcMethod (actually it is derived from it) with two exceptions: - * a "system." is added to the method name, the pointer to the method array is passed to this methods. - * they can only be loaded within the server, not from external, like user methods. - * @see loadSysMethods(), XmlRpcMethod - */ - class XmlRpcSysMethod : public XmlRpcMethod { - protected: - Vector *methods; - public: - XmlRpcSysMethod() {} - XmlRpcSysMethod(String s, Vector* _methods) : XmlRpcMethod("system."+s) {methods=_methods;} - }; - - /** - * connection information. connection informations are stored in this struct - * @param ipadd ip address of the client - * @param timeout max time to wait [ms] - */ - struct XmlRpcConnectionInfo { - dword ipadd; - int timeout; - }; - - protected: - Vector methods; - int server_port,listen; - bool use_ssl,sysMethodsLoaded,sysMethods; - SSLContext sslcontext; - Socket socket; - - void CheckHttpHeader(String& s); - void CheckSignatureAndRun(Socket& s, XmlRpcMethod* m, ValueArray params, dword ipadd); - String Response(Value& v); - void SendResponse(Socket &s, String s); - /* - * send http response. call SendResponse() avter calling Response() for value \p v. - * @param s socket the connection is on - * @param v value to be sent (non error) - */ - void SendResponse(Socket &s, Value& v) {SendResponse(s,Response(v));} - void Error(Socket& s, int code, String desc); - void loadSysMethods(bool load=true); - - public: - typedef XmlRpcServer CLASSNAME; - XmlRpcServer(); - XmlRpcServer& Add(XmlRpcMethod* m); - void Clear(); - /** - * get the ssl context. get the ssl context - */ - SSLContext& GetSSLContext() {return sslcontext;} - bool Open(int port, int listen_count = 5, bool ssl=false); - bool Reopen(); - void Close(); - void RunOnce(int msec); - void Run(); - void SysMethods(bool on=true); - /** - * return wether the system methods are loaded.return wether the system methods are loaded - */ - bool IsSysMethodsLoaded() {return sysMethodsLoaded;} - - void HandleRequest(Socket &s, Value &v); - /** - * return wether socket is open.return wether socket is open - */ - bool IsOpen() const { return socket.IsOpen(); } - /** - * return wether socket had an error.return wether socket had an error - */ - bool IsError() const { return socket.IsError(); } - /** - * return the port listening on.return the port listening on - */ - int GetPort() const { return server_port; } - /** - * get the server socket. get the server socket - */ - Socket& GetSocket() { return socket; } -}; - -/** -* @mainpage XML Remote Procedure Call implementation -* @version R23 -* -* this is a XML rpc implementation for Ultimate++, the implementation follows the specification -* found at http://www.xmlrpc.com/spec -* @section Server -* a server can be created by using the XmlRpcServer class and its methods: -* @code -* //small server (NOT WORKING because XmlRpcMethod needs to be implemented) -* CONSOLE_APP_MAIN { -* XmlRpcMethod m("hello"); //create the hello method (in this case with NO FUNCTIONALITY and wrong signature -* XmlRpcServer server; //create the server -* server.SysMethods(); //switch on sys methods -* server.Add(&m); //add the method "hello" -* server.Open(8080); //listen on port 8080 -* server.Run(); //and run -* } -* @endcode -* @see XmlRpcServer, XmlRpcMethod -* -* @section Client -* a client can be implemented by using the XmlRpcClient class. -* @code -* //function checking for methods on the server side -* void CheckForMethods(Value &v) { -* XmlRpcClient xmlClient; //client -* XmlRpcCall call("system.listMethods"); //call with sys method "listMethods" -* -* xmlClient.Host("www.ultimatepp.org"); //set Host -* xmlClient.Path("/server/index.php"); //set path -* xmlClient.Port(80); //and port to connect to -* v = xmlClient.Execute(call); //run the call -* } -* @endcode -* @see XmlRpcClient, XmlRpcCall -*/ -#endif diff --git a/uppdev/XmlRpc/XmlRpc.upp b/uppdev/XmlRpc/XmlRpc.upp deleted file mode 100644 index a690b40fd..000000000 --- a/uppdev/XmlRpc/XmlRpc.upp +++ /dev/null @@ -1,15 +0,0 @@ -uses - Core, - Web, - ValueMap, - Web/SSL; - -file - ValueXmlConvert.cpp, - XmlRpc.h, - XmlRpcCall.cpp, - XmlRpcClient.cpp, - XmlRpcParser.cpp, - XmlRpcSysMethods.cpp, - XmlRpcSysMethods.h, - XmlRpcServer.cpp; diff --git a/uppdev/XmlRpc/XmlRpcCall.cpp b/uppdev/XmlRpc/XmlRpcCall.cpp deleted file mode 100644 index f430fdd1b..000000000 --- a/uppdev/XmlRpc/XmlRpcCall.cpp +++ /dev/null @@ -1,66 +0,0 @@ -#include "XmlRpc.h" - -/** -* constructor. constructs a new Call without setting the method-name that is to be called. -*/ -XmlRpcCall::XmlRpcCall() {}; - -/** -* constructs a call to _method. constructs a new Call and setting the method-name of the method -* that should be called to \p _method. -* @param _method the name of the method to be called -*/ -XmlRpcCall::XmlRpcCall(String _method) { - method = _method; -}; - -/** -* constructs a call to _method. constructs a new Call and setting the method-name of the method -* that should be called to \p _method. -* @param _method the name of the method to be called -*/ -XmlRpcCall::XmlRpcCall(const char *_method) { - method = String(_method); -}; - -/** -* clear the method-name and the parametes. clears the list of all parameter that are added to -* the call and its method name -*/ -void XmlRpcCall::Clear() { - method.Clear(); - va.Clear(); - NumberToValue.Clear(); -} - -/** -* set the method name or add a parameter. if no method-name is set yet and \p v is a string it -* is set as method name else it is added as parameter to the call. -* @param v either the method name or a paramter to be added -*/ -XmlRpcCall& XmlRpcCall::operator()(const Value& v) { - if(IsString(v) && method.IsEmpty()) { - method = v; - return *this; - } - va.Add(v); - return *this; -}; -/** -* create the xml to send. This function creates a string, that contains the xml data representing -* the method call, which was created by using XmlRpcCall() and/or operator()(const Value& v) . -* @return a string containing the xml-methodCall -*/ -String XmlRpcCall::ToXml() const { - XmlNode xml; - - xml("methodCall")("methodName").Add().CreateText(method); - XmlNode& params=xml.At(xml.FindTag("methodCall"))("params"); - - for(int i=0;iGetName().Left(7) == "system.") - delete methods[i]; - methods.Remove(i); - i--; - } - sysMethodsLoaded=false; - } -} -/** -* set wether SysMethods should be provided. if called with \p on = true the Sysmethods will be -* loaded and even reloaded after clearing the non system messages with Clear(). The systme messages that -* are provided at the moment are: system.listMethods, system.methodHelp, system.methodSignature. -* @param on if set SystemMethods will be provided by the server -*/ -void XmlRpcServer::SysMethods(bool on) { - sysMethods=on; - loadSysMethods(on); -} -/** -* add a usermethod to the server. one can add own methods to the server by calling this method. -* The provided Method will be called if the name and one of the signatures of an incoming request -* match. -* Only methods with non empty names that don't start with "system." are allowed! -* @param m a pointer to a XmlRpcMethod derived object -* @returns reference to the current server -* @see XmlRpcMethod -*/ -XmlRpcServer& XmlRpcServer::Add(XmlRpcMethod* m) { - if(m->GetName().IsEmpty()) - return *this; - if(m->GetName().Left(7)=="system.") - return *this; - methods.Add(m); - return *this; -} -/** -* open a socket. open a socket, bind to it and listen. -* @param port port to listen at -* @param listen_count number of clients in count -* @param ssl use ssl encryption, default is no ssl encryption. If ssl should be used but the ssl -* context is not set XmlRpcServer trys to load the ConfigFile("cacert.pem") and ConfigFile("pkey.pem") -* if this fails the server wont start. -* @warning if ssl context is not set the peer won't be veryfied -* @returns true if succesfull, false else -*/ -bool XmlRpcServer::Open(int port, int listen_count , bool ssl) { - server_port=port; - listen=listen_count; - use_ssl=ssl; - if(ssl) { - if(sslcontext.IsEmpty()) { - SSL_METHOD *meth = TLSv1_server_method(); - sslcontext.Create(meth); - sslcontext.VerifyPeer(false); - String certfile(ConfigFile("cacert.pem")), keyfile(ConfigFile("pkey.pem")); - if(!FileExists(certfile) || !FileExists(keyfile)) { - String debug; - debug << "unable to find: "; - if(!FileExists(certfile)) - debug << certfile << " "; - if(!FileExists(keyfile)) - debug << keyfile; - debug <<"\n"; - LOG(debug); - return false; - } - String cert(LoadFile(certfile)); - String pkey(LoadFile(keyfile)); - sslcontext.UseCertificate(cert,pkey); - } - return SSLServerSocket(socket, sslcontext, server_port, false, listen, true); - } - else - return ServerSocket(socket, server_port, false, listen, true); -} -/** -* close the socket. close the socket -*/ -void XmlRpcServer::Close() { - socket.Close(); -} -/** -* close and reopen the socket. close and reopen the socket by calling Close() and Open(). -*/ -bool XmlRpcServer::Reopen() { - Close(); - return Open(server_port,listen,use_ssl); -} -/** -* wait for connections. wait for one incomming connection return after max \p msec milliseconds -* of waiting or after accepting a connection or after an error. -* @param msec time to wait for one connection before returning -*/ -void XmlRpcServer::RunOnce(int msec) { - if(!socket.IsOpen()) - return; - Socket s; - if(socket.Peek(msec)) { - XmlRpcConnectionInfo ci; - - if(socket.Accept(s,&ci.ipadd,true,0)) { - ci.timeout=10000; - Thread().Run(THISBACK2(HandleRequest,s,RawToValue(ci))); - } else { - RLOG(NFormat("accept error: %d %s",socket.GetErrorCode(),socket.GetErrorText())); - } - - } - if(socket.IsError()) - RLOG(NFormat("socket error: %d %s",socket.GetErrorCode(),socket.GetErrorText())); -} -/** -* wait for connections. wait for incomming connections, accept them and pass them to -* HandleRequest() and wait again in an infinite loop. -* @see RunOnce() -*/ -void XmlRpcServer::Run() { - if(!socket.IsOpen()) - return; - - while(true) { - RunOnce(1000); - } -} -/* -* handle incomming requests. parse and response to incomming method calls. -* @param s the socket the connection is on -* @param ipadd the ip address of the calling client -* @param value a Value containing ConnectionInfo -*/ -void XmlRpcServer::HandleRequest(Socket &s, Value &value) { - XmlRpcConnectionInfo ci = ValueTo(value); - - String data, response; - LOG("\n\ngot a Request"); - data = s.Read(ci.timeout); - if(data.IsEmpty()) { - Error(s,ETIMEOUT,"Request Timeout"); - return; - } - XmlRpcParser p; - XmlNode n; - Value v; - v=p.ParseMethodCall(data); - if(v.IsError()) { - Error(s,EBADREQUEST,"Bad Request: unable to understand xml method call"); - return; - } - - ValueArray params(v); - if(params.GetCount()<1 || params[0].GetType() != STRING_V) { - Error(s,EBADREQUEST,"Bad Request: unable to understand xml method call"); - return; - } - for(int i=0;iGetName()==params[0]) { - CheckSignatureAndRun(s,methods[i],params, ci.ipadd); - return; - } - } - if(response.IsEmpty()) - Error(s,ENOTFOUND,"Not Found: the requested method was not found"); - -} -/** -* check for a signature and run the method. check wether the XmlRpcMethod object has a signature -* equal to the one of the call and if so run the method and send the response -* @param s socket the connection is on -* @param m method that should be run -* @param params the methodname and the parameter received within the method call -* @param ipadd the ip address of the calling client -*/ -void XmlRpcServer::CheckSignatureAndRun(Socket& s, XmlRpcMethod* m, ValueArray params, dword ipadd) { - ValueArray va; - m->Signature(va); - LOG(NFormat("function: %s",m->GetName())); - LOG(NFormat("Signature of function: %s",Value(va).ToString())); - LOG(NFormat("Signature of call: %s",Value(params).ToString())); - - if(va.IsEmpty()) { - Error(s,EINTERNAL,"internal server error"); - return; - } - - for(int i=0; iExecute(result,params, ipadd); - LOG(NFormat("Result: %s",result.ToString())); - if(!result.IsError()) { - SendResponse(s,result); - return; - } - Error(s,EMETHOD,NFormat("Method Error: %s",GetErrorText(result))); - return; - } - } - } - Error(s,EBADREQUEST,"Bad Request: wrong method signature"); -} -/** -* create xml response. create xml response. -* @param v the value to be send -* @return returns the string containing the xml representation of v -*/ -String XmlRpcServer::Response(Value& v) { - XmlNode n; - XmlNode&xml = n("methodResponse")("params")("param").Add("value"); - ValueToXml(xml,v); - return AsXML(n,XML_HEADER); -} -/** -* create an error response. create an error response with \p num as error number and \p desc as -* description of the error -* @param s socket the connection is on -* @param num the error number -* @param desc the description of the error -*/ -void XmlRpcServer::Error(Socket& s, int num, String desc) { - XmlNode n; - LOG(NFormat("ERROR: %s (%d)",desc,num)); - Value errorcode(num); - XmlNode& code=n("methodResponse")("fault")("value")("struct").Add("member"); - code.Add("name").Add().CreateText("faultCode"); - code.Add("value").Add("int").Add().CreateText(errorcode.ToString()); - XmlNode& text=n("methodResponse")("fault")("value")("struct").Add("member"); - text.Add("name").Add().CreateText("faultString"); - text.Add("value").Add("string").Add().CreateText(desc); - SendResponse(s,AsXML(n,XML_HEADER)); -} -/** -* send http response. send a response with a http header and the data in \p response. -* @param s socket the connection is on -* @param response a string sent as body (should be an xml document) -*/ -void XmlRpcServer::SendResponse(Socket& s, String response) { - String out; - out <<"HTTP/1.0 200 OK\r\n"; - out <<"Server: Ultimate++ XmlRPC Server/any OS\r\n"; - out <<"Connection: close\r\n"; - out <<"Content-Length: "<GetCount();i++) { - String name; - name = methods->At(i)->GetName(); - va.Add(name); - } - result=Value(va); -} -/** -* returns signature. returns signature -*/ -void XmlRpcSysListMethods::Signature(ValueArray& sig) { - ValueArray va; - va.Add(ValueArray()); - - sig.Add(va); -}; -/** -* executing methodSignature. executing system.methodSignature -*/ -void XmlRpcSysMethodSignature::Execute(Value& result, ValueArray params, dword ipadd) { - result = ErrorValue("internal error"); - ASSERT(params.GetCount()==1); - ValueArray sig,temp; - - if(params[0].GetType()!=STRING_V) - return; - for(int i=0;iGetCount();i++) { - if(methods->At(i)->GetName() == (params[0].ToString())) { - methods->At(i)->Signature(temp); - } - } - if(temp.GetCount()<1) - return; - for(int i=0;iGetCount();i++) { - if(methods->At(i)->GetName() == (params[0].ToString())) { - String help; - methods->At(i)->Help(help); - result=help; - return; - } - } -} -/** -* returns signature. returns signature -*/ -void XmlRpcSysMethodHelp::Signature(ValueArray& sig) { - ValueArray va; - va.Add(String()); - va.Add(String()); - - sig.Add(va); -}; diff --git a/uppdev/XmlRpc/XmlRpcSysMethods.h b/uppdev/XmlRpc/XmlRpcSysMethods.h deleted file mode 100644 index 7fb57c345..000000000 --- a/uppdev/XmlRpc/XmlRpcSysMethods.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef _XmlRpc_XmlRpcSysMethods_h_ -#define _XmlRpc_XmlRpcSysMethods_h_ -#include "XmlRpc.h" - -/** -* system method listing all methods. this system method lists all methods the server knows -*/ -class XmlRpcSysListMethods : public XmlRpcServer::XmlRpcSysMethod { - public: - XmlRpcSysListMethods(String s,Vector* _methods) : XmlRpcSysMethod(s,_methods) {} - virtual void Execute(Value& result, ValueArray params, dword ipadd); - /* - * returning help for the method.returning help for the method - */ - virtual void Help(String& help) {help="lists all known methods";} - virtual void Signature(ValueArray& sig); -}; -/** -* system method returning signature of a method. this system method returns all signatures of a -* methods using the Signature() function -*/ -class XmlRpcSysMethodSignature : public XmlRpcServer::XmlRpcSysMethod { - public: - XmlRpcSysMethodSignature(String s,Vector* _methods) : XmlRpcSysMethod(s,_methods) {} - virtual void Execute(Value& result, ValueArray params, dword ipadd); - /* - * returning help for the method.returning help for the method - */ - virtual void Help(String& help) {help="returns the signature of a given method";} - virtual void Signature(ValueArray& sig); -}; -/** -* system method returning the help for a method. this system method returns the help a method -* provides using the Help() function -*/ -class XmlRpcSysMethodHelp : public XmlRpcServer::XmlRpcSysMethod { - public: - XmlRpcSysMethodHelp(String s,Vector* _methods) : XmlRpcSysMethod(s,_methods) {} - virtual void Execute(Value& result, ValueArray params, dword ipadd); - /* - * returning help for the method.returning help for the method - */ - virtual void Help(String& help) {help="returns the help of a given method";} - virtual void Signature(ValueArray& sig); -}; -#endif diff --git a/uppdev/XmlRpcShorted/XmlRpcShorted.cpp b/uppdev/XmlRpcShorted/XmlRpcShorted.cpp deleted file mode 100644 index 5144f4031..000000000 --- a/uppdev/XmlRpcShorted/XmlRpcShorted.cpp +++ /dev/null @@ -1,59 +0,0 @@ -#include - -using namespace Upp; - -XMLRPC_METHOD(compute) -{ - double a, b; - String op; - rpc >> a >> op >> b; - Cout() << "Request: " << a << op << b << '\n'; - if(op.GetCount() == 1) - switch(*op) { - case '+': - rpc << a + b; - return; - case '-': - rpc << a - b; - return; - case '/': - if(b == 0) - rpc << ErrorValue("division by zero"); - else - rpc << a / b; - return; - case '*': - rpc << a * b; - return; - } - rpc << ErrorValue("unknown operator"); -} - -XMLRPC_METHOD(ping) -{ - rpc << GetSysTime(); -} - -void Compute(double a, String op, double b) -{ - double result; - Cout() << a << op << b << '='; - XmlRpcCall call(NULL); - if(call("compute", a, op, b) >> result) - Cout() << result; - else - Cout() << " error: " << call.GetError(); - Cout() << '\n'; -} - -CONSOLE_APP_MAIN -{ - Time tm; - XmlRpcCall(NULL)("ping") >> tm; - Cout() << tm << '\n'; - - Compute(12, "+", 12); - Compute(12, "*", 12); - Compute(12, "+56", 12); - Compute(12, "/", 0); -} diff --git a/uppdev/XmlRpcShorted/XmlRpcShorted.upp b/uppdev/XmlRpcShorted/XmlRpcShorted.upp deleted file mode 100644 index 0d10995b7..000000000 --- a/uppdev/XmlRpcShorted/XmlRpcShorted.upp +++ /dev/null @@ -1,10 +0,0 @@ -uses - Core, - XmlRpc; - -file - XmlRpcShorted.cpp; - -mainconfig - "" = ""; - diff --git a/uppdev/XmlRpcShorted/init b/uppdev/XmlRpcShorted/init deleted file mode 100644 index 312e4013d..000000000 --- a/uppdev/XmlRpcShorted/init +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef _XmlRpcShorted_icpp_init_stub -#define _XmlRpcShorted_icpp_init_stub -#include "Core/init" -#include "XmlRpc/init" -#endif diff --git a/uppdev/XmlRpcTest/XmlRpcTest.upp b/uppdev/XmlRpcTest/XmlRpcTest.upp deleted file mode 100644 index 5c1813b1e..000000000 --- a/uppdev/XmlRpcTest/XmlRpcTest.upp +++ /dev/null @@ -1,6 +0,0 @@ -uses - Core; - -file - main.cpp; - diff --git a/uppdev/XmlRpcTest/init b/uppdev/XmlRpcTest/init deleted file mode 100644 index c2b3da2de..000000000 --- a/uppdev/XmlRpcTest/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _XmlRpcTest_icpp_init_stub -#define _XmlRpcTest_icpp_init_stub -#include "Core/init" -#endif diff --git a/uppdev/XmlRpcTest/main.cpp b/uppdev/XmlRpcTest/main.cpp deleted file mode 100644 index 3521c6607..000000000 --- a/uppdev/XmlRpcTest/main.cpp +++ /dev/null @@ -1,8 +0,0 @@ - - -struct Data { - String s; - int q; - - -}; \ No newline at end of file diff --git a/uppdev/XmlizeTest/XmlizeTest.cpp b/uppdev/XmlizeTest/XmlizeTest.cpp deleted file mode 100644 index 20df0a083..000000000 --- a/uppdev/XmlizeTest/XmlizeTest.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include -using namespace Upp; - -struct A -{ - void Xmlize(XmlIO &xml) { xml ("v",v); } //<-- exception on 2nd call - - Value v; -}; - -CONSOLE_APP_MAIN -{ - A a; - a.v = "test\ntest"; - StoreAsXMLFile(a, "XmlizeTest", "xmlizeTtest"); - DDUMP(a.v); - a.v = 0; - LoadFromXMLFile(a, "xmlizeTtest"); - DDUMP(a.v); -} diff --git a/uppdev/XmlizeTest/XmlizeTest.upp b/uppdev/XmlizeTest/XmlizeTest.upp deleted file mode 100644 index d73b7659f..000000000 --- a/uppdev/XmlizeTest/XmlizeTest.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - Core; - -file - XmlizeTest.cpp; - -mainconfig - "" = ""; - diff --git a/uppdev/YPuzzle/TinyXML/tinystr.cpp b/uppdev/YPuzzle/TinyXML/tinystr.cpp deleted file mode 100644 index 9fa0d1322..000000000 --- a/uppdev/YPuzzle/TinyXML/tinystr.cpp +++ /dev/null @@ -1,318 +0,0 @@ -/* -www.sourceforge.net/projects/tinyxml -Original file by Yves Berquin. - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. -*/ - -#include "tinyxml.h" - -#ifndef TIXML_USE_STL - - -#include -#include -#include - -#include "tinystr.h" - -// TiXmlString constructor, based on a C string -TiXmlString::TiXmlString (const char* instring) -{ - size_t newlen; - char * newstring; - - if (!instring) - { - allocated = 0; - cstring = NULL; - current_length = 0; - return; - } - newlen = strlen (instring) + 1; - newstring = new char [newlen]; - memcpy (newstring, instring, newlen); - // strcpy (newstring, instring); - allocated = newlen; - cstring = newstring; - current_length = newlen - 1; -} - -// TiXmlString copy constructor -TiXmlString::TiXmlString (const TiXmlString& copy) -{ - size_t newlen; - char * newstring; - - // Prevent copy to self! - if ( © == this ) - return; - - if (! copy . allocated) - { - allocated = 0; - cstring = NULL; - current_length = 0; - return; - } - newlen = copy . length () + 1; - newstring = new char [newlen]; - // strcpy (newstring, copy . cstring); - memcpy (newstring, copy . cstring, newlen); - allocated = newlen; - cstring = newstring; - current_length = newlen - 1; -} - -// TiXmlString = operator. Safe when assign own content -void TiXmlString ::operator = (const char * content) -{ - size_t newlen; - char * newstring; - - if (! content) - { - empty_it (); - return; - } - newlen = strlen (content) + 1; - newstring = new char [newlen]; - // strcpy (newstring, content); - memcpy (newstring, content, newlen); - empty_it (); - allocated = newlen; - cstring = newstring; - current_length = newlen - 1; -} - -// = operator. Safe when assign own content -void TiXmlString ::operator = (const TiXmlString & copy) -{ - size_t newlen; - char * newstring; - - if (! copy . length ()) - { - empty_it (); - return; - } - newlen = copy . length () + 1; - newstring = new char [newlen]; - // strcpy (newstring, copy . c_str ()); - memcpy (newstring, copy . c_str (), newlen); - empty_it (); - allocated = newlen; - cstring = newstring; - current_length = newlen - 1; -} - - -// append a const char * to an existing TiXmlString -void TiXmlString::append( const char* str, size_t len ) -{ - char * new_string; - size_t new_alloc, new_size, size_suffix; - - // don't use strlen - it can overrun the len passed in! - const char* p = str; - size_suffix = 0; - - while ( *p && size_suffix < (unsigned)len ) - { - ++p; - ++size_suffix; - } - if ( !size_suffix) - return; - - new_size = length () + size_suffix + 1; - // check if we need to expand - if (new_size > allocated) - { - // compute new size - new_alloc = assign_new_size (new_size); - - // allocate new buffer - new_string = new char [new_alloc]; - new_string [0] = 0; - - // copy the previous allocated buffer into this one - if (allocated && cstring) - // strcpy (new_string, cstring); - memcpy (new_string, cstring, length ()); - - // append the suffix. It does exist, otherwize we wouldn't be expanding - // strncat (new_string, str, len); - memcpy (new_string + length (), - str, - size_suffix); - - // return previsously allocated buffer if any - if (allocated && cstring) - delete [] cstring; - - // update member variables - cstring = new_string; - allocated = new_alloc; - } - else - { - // we know we can safely append the new string - // strncat (cstring, str, len); - memcpy (cstring + length (), - str, - size_suffix); - } - current_length = new_size - 1; - cstring [current_length] = 0; -} - - -// append a const char * to an existing TiXmlString -void TiXmlString::append( const char * suffix ) -{ - char * new_string; - size_t new_alloc, new_size; - - new_size = length () + strlen (suffix) + 1; - // check if we need to expand - if (new_size > allocated) - { - // compute new size - new_alloc = assign_new_size (new_size); - - // allocate new buffer - new_string = new char [new_alloc]; - new_string [0] = 0; - - // copy the previous allocated buffer into this one - if (allocated && cstring) - memcpy (new_string, cstring, 1 + length ()); - // strcpy (new_string, cstring); - - // append the suffix. It does exist, otherwize we wouldn't be expanding - // strcat (new_string, suffix); - memcpy (new_string + length (), - suffix, - strlen (suffix) + 1); - - // return previsously allocated buffer if any - if (allocated && cstring) - delete [] cstring; - - // update member variables - cstring = new_string; - allocated = new_alloc; - } - else - { - // we know we can safely append the new string - // strcat (cstring, suffix); - memcpy (cstring + length (), - suffix, - strlen (suffix) + 1); - } - current_length = new_size - 1; -} - -// Check for TiXmlString equuivalence -//bool TiXmlString::operator == (const TiXmlString & compare) const -//{ -// return (! strcmp (c_str (), compare . c_str ())); -//} - -//unsigned TiXmlString::length () const -//{ -// if (allocated) -// // return strlen (cstring); -// return current_length; -// return 0; -//} - - -unsigned TiXmlString::find (char tofind, unsigned offset) const -{ - char * lookup; - - if (offset >= length ()) - return (unsigned) notfound; - for (lookup = cstring + offset; * lookup; lookup++) - if (* lookup == tofind) - return (unsigned)(lookup - cstring); - return (unsigned) notfound; -} - - -bool TiXmlString::operator == (const TiXmlString & compare) const -{ - if ( allocated && compare.allocated ) - { - assert( cstring ); - assert( compare.cstring ); - return ( strcmp( cstring, compare.cstring ) == 0 ); - } - else if ( length() == 0 && compare.length() == 0 ) - { - return true; - } - return false; -} - - -bool TiXmlString::operator == (const char* compare) const -{ - if ( allocated && compare && *compare ) - { - assert( cstring ); - return ( strcmp( cstring, compare ) == 0 ); - } - else if ( length() == 0 && (!compare || !*compare ) ) // this is a little dubious, but try to duplicate behavior in other operator== - { - return true; - } - return false; -} - - -bool TiXmlString::operator < (const TiXmlString & compare) const -{ - if ( allocated && compare.allocated ) - { - assert( cstring ); - assert( compare.cstring ); - return ( strcmp( cstring, compare.cstring ) > 0 ); - } - return false; -} - - -bool TiXmlString::operator > (const TiXmlString & compare) const -{ - if ( allocated && compare.allocated ) - { - assert( cstring ); - assert( compare.cstring ); - return ( strcmp( cstring, compare.cstring ) < 0 ); - } - return false; -} - - -#endif // TIXML_USE_STL diff --git a/uppdev/YPuzzle/TinyXML/tinystr.h b/uppdev/YPuzzle/TinyXML/tinystr.h deleted file mode 100644 index fc85f72d0..000000000 --- a/uppdev/YPuzzle/TinyXML/tinystr.h +++ /dev/null @@ -1,250 +0,0 @@ -/* -www.sourceforge.net/projects/tinyxml -Original file by Yves Berquin. - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. -*/ - -#include "tinyxml.h" - - -#ifndef TIXML_USE_STL - -#ifndef TIXML_STRING_INCLUDED -#define TIXML_STRING_INCLUDED - -#ifdef _MSC_VER -#pragma warning( disable : 4530 ) -#pragma warning( disable : 4786 ) -#endif - -#include - -/* - TiXmlString is an emulation of the std::string template. - Its purpose is to allow compiling TinyXML on compilers with no or poor STL support. - Only the member functions relevant to the TinyXML project have been implemented. - The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase - a string and there's no more room, we allocate a buffer twice as big as we need. -*/ -class TiXmlString -{ - public : - // TiXmlString constructor, based on a string, mark explicit to force - // us to find unnecessary casting. - explicit TiXmlString (const char * instring); - - // TiXmlString empty constructor - TiXmlString () - { - allocated = 0; - cstring = NULL; - current_length = 0; - } - - // TiXmlString copy constructor - explicit TiXmlString (const TiXmlString& copy); - - // TiXmlString destructor - ~ TiXmlString () - { - empty_it (); - } - - // Convert a TiXmlString into a classical char * - const char * c_str () const - { - if (allocated) - return cstring; - return ""; - } - - // Return the length of a TiXmlString - size_t length () const - { - return ( allocated ) ? current_length : 0; - } - - // TiXmlString = operator - void operator = (const char * content); - - // = operator - void operator = (const TiXmlString & copy); - - // += operator. Maps to append - TiXmlString& operator += (const char * suffix) - { - append (suffix); - return *this; - } - - // += operator. Maps to append - TiXmlString& operator += (char single) - { - append (single); - return *this; - } - - // += operator. Maps to append - TiXmlString& operator += (TiXmlString & suffix) - { - append (suffix); - return *this; - } - bool operator == (const TiXmlString & compare) const; - bool operator == (const char* compare) const; - bool operator < (const TiXmlString & compare) const; - bool operator > (const TiXmlString & compare) const; - - // Checks if a TiXmlString is empty - bool empty () const - { - return length () ? false : true; - } - - // single char extraction - const char& at (unsigned index) const - { - assert( index < length ()); - return cstring [index]; - } - - // find a char in a string. Return TiXmlString::notfound if not found - unsigned find (char lookup) const - { - return find (lookup, 0); - } - - // find a char in a string from an offset. Return TiXmlString::notfound if not found - unsigned find (char tofind, unsigned offset) const; - - /* Function to reserve a big amount of data when we know we'll need it. Be aware that this - function clears the content of the TiXmlString if any exists. - */ - void reserve (unsigned size) - { - empty_it (); - if (size) - { - allocated = size; - cstring = new char [size]; - cstring [0] = 0; - current_length = 0; - } - } - - // [] operator - char& operator [] (unsigned index) const - { - assert( index < length ()); - return cstring [index]; - } - - // Error value for find primitive - enum { notfound = 0xffffffff, - npos = notfound }; - - void append (const char *str, size_t len ); - - protected : - - // The base string - char * cstring; - // Number of chars allocated - size_t allocated; - // Current string size - size_t current_length; - - // New size computation. It is simplistic right now : it returns twice the amount - // we need - size_t assign_new_size (size_t minimum_to_allocate) - { - return minimum_to_allocate * 2; - } - - // Internal function that clears the content of a TiXmlString - void empty_it () - { - if (cstring) - delete [] cstring; - cstring = NULL; - allocated = 0; - current_length = 0; - } - - void append (const char *suffix ); - - // append function for another TiXmlString - void append (const TiXmlString & suffix) - { - append (suffix . c_str ()); - } - - // append for a single char. - void append (char single) - { - if ( cstring && current_length < (allocated-1) ) - { - cstring[ current_length ] = single; - ++current_length; - cstring[ current_length ] = 0; - } - else - { - char smallstr [2]; - smallstr [0] = single; - smallstr [1] = 0; - append (smallstr); - } - } - -} ; - -/* - TiXmlOutStream is an emulation of std::ostream. It is based on TiXmlString. - Only the operators that we need for TinyXML have been developped. -*/ -class TiXmlOutStream : public TiXmlString -{ -public : - TiXmlOutStream () : TiXmlString () {} - - // TiXmlOutStream << operator. Maps to TiXmlString::append - TiXmlOutStream & operator << (const char * in) - { - append (in); - return (* this); - } - - // TiXmlOutStream << operator. Maps to TiXmlString::append - TiXmlOutStream & operator << (const TiXmlString & in) - { - append (in . c_str ()); - return (* this); - } -} ; - -#ifdef _MSC_VER -#pragma warning( default : 4530 ) -#pragma warning( default : 4786 ) -#endif - -#endif // TIXML_STRING_INCLUDED -#endif // TIXML_USE_STL diff --git a/uppdev/YPuzzle/TinyXML/tinyxml.cpp b/uppdev/YPuzzle/TinyXML/tinyxml.cpp deleted file mode 100644 index 310f7b48b..000000000 --- a/uppdev/YPuzzle/TinyXML/tinyxml.cpp +++ /dev/null @@ -1,1645 +0,0 @@ -/* -www.sourceforge.net/projects/tinyxml -Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com) - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. -*/ - -#include - -#ifdef PLATFORM_WIN32 -#include -#endif - -#include "tinyxml.h" - -#ifdef TIXML_USE_STL -#include -#endif - - -bool TiXmlBase::condenseWhiteSpace = true; - -void TiXmlBase::PutString( const TIXML_STRING& str, TIXML_OSTREAM* stream ) -{ - TIXML_STRING buffer; - PutString( str, &buffer ); - (*stream) << buffer; -} - -void TiXmlBase::PutString( const TIXML_STRING& str, TIXML_STRING* outString ) -{ - int i=0; - - while( i<(int)str.length() ) - { - unsigned char c = (unsigned char) str[i]; - - if ( c == '&' - && i < ( (int)str.length() - 2 ) - && str[i+1] == '#' - && str[i+2] == 'x' ) - { - // Hexadecimal character reference. - // Pass through unchanged. - // © -- copyright symbol, for example. - // - // The -1 is a bug fix from Rob Laveaux. It keeps - // an overflow from happening if there is no ';'. - // There are actually 2 ways to exit this loop - - // while fails (error case) and break (semicolon found). - // However, there is no mechanism (currently) for - // this function to return an error. - while ( i<(int)str.length()-1 ) - { - outString->append( str.c_str() + i, 1 ); - ++i; - if ( str[i] == ';' ) - break; - } - } - else if ( c == '&' ) - { - outString->append( entity[0].str, entity[0].strLength ); - ++i; - } - else if ( c == '<' ) - { - outString->append( entity[1].str, entity[1].strLength ); - ++i; - } - else if ( c == '>' ) - { - outString->append( entity[2].str, entity[2].strLength ); - ++i; - } - else if ( c == '\"' ) - { - outString->append( entity[3].str, entity[3].strLength ); - ++i; - } - else if ( c == '\'' ) - { - outString->append( entity[4].str, entity[4].strLength ); - ++i; - } - else if ( c < 32 ) - { - // Easy pass at non-alpha/numeric/symbol - // Below 32 is symbolic. - char buf[ 32 ]; - sprintf( buf, "&#x%02X;", (unsigned) ( c & 0xff ) ); - //*ME: warning C4267: convert 'size_t' to 'int' - //*ME: Int-Cast to make compiler happy ... - outString->append( buf, (int)strlen( buf ) ); - ++i; - } - else - { - //char realc = (char) c; - //outString->append( &realc, 1 ); - *outString += (char) c; // somewhat more efficient function call. - ++i; - } - } -} - - -// <-- Strange class for a bug fix. Search for STL_STRING_BUG -TiXmlBase::StringToBuffer::StringToBuffer( const TIXML_STRING& str ) -{ - buffer = new char[ str.length()+1 ]; - if ( buffer ) - { - strcpy( buffer, str.c_str() ); - } -} - - -TiXmlBase::StringToBuffer::~StringToBuffer() -{ - delete [] buffer; -} -// End strange bug fix. --> - - -TiXmlNode::TiXmlNode( NodeType _type ) : TiXmlBase() -{ - parent = 0; - type = _type; - firstChild = 0; - lastChild = 0; - prev = 0; - next = 0; -} - - -TiXmlNode::~TiXmlNode() -{ - TiXmlNode* node = firstChild; - TiXmlNode* temp = 0; - - while ( node ) - { - temp = node; - node = node->next; - delete temp; - } -} - - -void TiXmlNode::CopyTo( TiXmlNode* target ) const -{ - target->SetValue (value.c_str() ); - target->userData = userData; -} - - -void TiXmlNode::Clear() -{ - TiXmlNode* node = firstChild; - TiXmlNode* temp = 0; - - while ( node ) - { - temp = node; - node = node->next; - delete temp; - } - - firstChild = 0; - lastChild = 0; -} - - -TiXmlNode* TiXmlNode::LinkEndChild( TiXmlNode* node ) -{ - node->parent = this; - - node->prev = lastChild; - node->next = 0; - - if ( lastChild ) - lastChild->next = node; - else - firstChild = node; // it was an empty list. - - lastChild = node; - return node; -} - - -TiXmlNode* TiXmlNode::InsertEndChild( const TiXmlNode& addThis ) -{ - TiXmlNode* node = addThis.Clone(); - if ( !node ) - return 0; - - return LinkEndChild( node ); -} - - -TiXmlNode* TiXmlNode::InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ) -{ - if ( !beforeThis || beforeThis->parent != this ) - return 0; - - TiXmlNode* node = addThis.Clone(); - if ( !node ) - return 0; - node->parent = this; - - node->next = beforeThis; - node->prev = beforeThis->prev; - if ( beforeThis->prev ) - { - beforeThis->prev->next = node; - } - else - { - assert( firstChild == beforeThis ); - firstChild = node; - } - beforeThis->prev = node; - return node; -} - - -TiXmlNode* TiXmlNode::InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ) -{ - if ( !afterThis || afterThis->parent != this ) - return 0; - - TiXmlNode* node = addThis.Clone(); - if ( !node ) - return 0; - node->parent = this; - - node->prev = afterThis; - node->next = afterThis->next; - if ( afterThis->next ) - { - afterThis->next->prev = node; - } - else - { - assert( lastChild == afterThis ); - lastChild = node; - } - afterThis->next = node; - return node; -} - - -TiXmlNode* TiXmlNode::ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ) -{ - if ( replaceThis->parent != this ) - return 0; - - TiXmlNode* node = withThis.Clone(); - if ( !node ) - return 0; - - node->next = replaceThis->next; - node->prev = replaceThis->prev; - - if ( replaceThis->next ) - replaceThis->next->prev = node; - else - lastChild = node; - - if ( replaceThis->prev ) - replaceThis->prev->next = node; - else - firstChild = node; - - delete replaceThis; - node->parent = this; - return node; -} - - -bool TiXmlNode::RemoveChild( TiXmlNode* removeThis ) -{ - if ( removeThis->parent != this ) - { - assert( 0 ); - return false; - } - - if ( removeThis->next ) - removeThis->next->prev = removeThis->prev; - else - lastChild = removeThis->prev; - - if ( removeThis->prev ) - removeThis->prev->next = removeThis->next; - else - firstChild = removeThis->next; - - delete removeThis; - return true; -} - -const TiXmlNode* TiXmlNode::FirstChild( const char * _value ) const -{ - const TiXmlNode* node; - for ( node = firstChild; node; node = node->next ) - { - if ( node->SValue() == _value ) - return node; - } - return 0; -} - - -TiXmlNode* TiXmlNode::FirstChild( const char * _value ) -{ - TiXmlNode* node; - for ( node = firstChild; node; node = node->next ) - { - if ( node->SValue() == _value ) - return node; - } - return 0; -} - - -const TiXmlNode* TiXmlNode::LastChild( const char * _value ) const -{ - const TiXmlNode* node; - for ( node = lastChild; node; node = node->prev ) - { - if ( node->SValue() == _value ) - return node; - } - return 0; -} - -TiXmlNode* TiXmlNode::LastChild( const char * _value ) -{ - TiXmlNode* node; - for ( node = lastChild; node; node = node->prev ) - { - if ( node->SValue() == _value ) - return node; - } - return 0; -} - -TiXmlNode *TiXmlNode::NodeFromPath(const char *sPath, char chSeparator) const -{ - if(!firstChild || !sPath) - return NULL; - - const char *l_psStartPos = sPath; - -#ifdef PLATFORM_WIN32 - const char *l_psEndPos = _tcschr(l_psStartPos, chSeparator); -#else - const char *l_psEndPos = strchr(l_psStartPos, chSeparator); -#endif - - char *l_psSubString = NULL; - int l_iLength = 0; - const TiXmlNode *l_pNode = NULL; - - while(l_psEndPos) - { - l_iLength = l_psEndPos - l_psStartPos; - l_psSubString = new char[l_iLength + 1]; - -#ifdef PLATFORM_WIN32 - _tcsncpy(l_psSubString, l_psStartPos, l_iLength); -#else - strncpy(l_psSubString, l_psStartPos, l_iLength); -#endif - l_psSubString[l_iLength] = 0; - - l_pNode = (l_pNode) ? l_pNode->FirstChild(l_psSubString) : FirstChild(l_psSubString); - - delete[] l_psSubString; - - if(!l_pNode) - return NULL; - - l_psStartPos = l_psEndPos + 1; - -#ifdef PLATFORM_WIN32 - l_psEndPos = _tcschr(l_psStartPos, chSeparator); -#else - l_psEndPos = strchr(l_psStartPos, chSeparator); -#endif - } - - return const_cast((l_pNode) ? l_pNode->FirstChild(l_psStartPos) : FirstChild(l_psStartPos)); -} - -const TiXmlNode* TiXmlNode::IterateChildren( const TiXmlNode* previous ) const -{ - if ( !previous ) - { - return FirstChild(); - } - else - { - assert( previous->parent == this ); - return previous->NextSibling(); - } -} - -TiXmlNode* TiXmlNode::IterateChildren( TiXmlNode* previous ) -{ - if ( !previous ) - { - return FirstChild(); - } - else - { - assert( previous->parent == this ); - return previous->NextSibling(); - } -} - -const TiXmlNode* TiXmlNode::IterateChildren( const char * val, const TiXmlNode* previous ) const -{ - if ( !previous ) - { - return FirstChild( val ); - } - else - { - assert( previous->parent == this ); - return previous->NextSibling( val ); - } -} - -TiXmlNode* TiXmlNode::IterateChildren( const char * val, TiXmlNode* previous ) -{ - if ( !previous ) - { - return FirstChild( val ); - } - else - { - assert( previous->parent == this ); - return previous->NextSibling( val ); - } -} - -const TiXmlNode* TiXmlNode::NextSibling( const char * _value ) const -{ - const TiXmlNode* node; - for ( node = next; node; node = node->next ) - { - if ( node->SValue() == _value ) - return node; - } - return 0; -} - -TiXmlNode* TiXmlNode::NextSibling( const char * _value ) -{ - TiXmlNode* node; - for ( node = next; node; node = node->next ) - { - if ( node->SValue() == _value ) - return node; - } - return 0; -} - -const TiXmlNode* TiXmlNode::PreviousSibling( const char * _value ) const -{ - const TiXmlNode* node; - for ( node = prev; node; node = node->prev ) - { - if ( node->SValue() == _value ) - return node; - } - return 0; -} - -TiXmlNode* TiXmlNode::PreviousSibling( const char * _value ) -{ - TiXmlNode* node; - for ( node = prev; node; node = node->prev ) - { - if ( node->SValue() == _value ) - return node; - } - return 0; -} - -void TiXmlElement::RemoveAttribute( const char * name ) -{ - TiXmlAttribute* node = attributeSet.Find( name ); - if ( node ) - { - attributeSet.Remove( node ); - delete node; - } -} - -const TiXmlElement* TiXmlNode::FirstChildElement() const -{ - const TiXmlNode* node; - - for ( node = FirstChild(); - node; - node = node->NextSibling() ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - -TiXmlElement* TiXmlNode::FirstChildElement() -{ - TiXmlNode* node; - - for ( node = FirstChild(); - node; - node = node->NextSibling() ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - -const TiXmlElement* TiXmlNode::FirstChildElement( const char * _value ) const -{ - const TiXmlNode* node; - - for ( node = FirstChild( _value ); - node; - node = node->NextSibling( _value ) ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - -TiXmlElement* TiXmlNode::FirstChildElement( const char * _value ) -{ - TiXmlNode* node; - - for ( node = FirstChild( _value ); - node; - node = node->NextSibling( _value ) ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - -const TiXmlElement* TiXmlNode::NextSiblingElement() const -{ - const TiXmlNode* node; - - for ( node = NextSibling(); - node; - node = node->NextSibling() ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - -TiXmlElement* TiXmlNode::NextSiblingElement() -{ - TiXmlNode* node; - - for ( node = NextSibling(); - node; - node = node->NextSibling() ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - -const TiXmlElement* TiXmlNode::NextSiblingElement( const char * _value ) const -{ - const TiXmlNode* node; - - for ( node = NextSibling( _value ); - node; - node = node->NextSibling( _value ) ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - -TiXmlElement* TiXmlNode::NextSiblingElement( const char * _value ) -{ - TiXmlNode* node; - - for ( node = NextSibling( _value ); - node; - node = node->NextSibling( _value ) ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - - -const TiXmlDocument* TiXmlNode::GetDocument() const -{ - const TiXmlNode* node; - - for( node = this; node; node = node->parent ) - { - if ( node->ToDocument() ) - return node->ToDocument(); - } - return 0; -} - -TiXmlDocument* TiXmlNode::GetDocument() -{ - TiXmlNode* node; - - for( node = this; node; node = node->parent ) - { - if ( node->ToDocument() ) - return node->ToDocument(); - } - return 0; -} - -TiXmlElement::TiXmlElement (const char * _value) - : TiXmlNode( TiXmlNode::ELEMENT ) -{ - firstChild = lastChild = 0; - value = _value; -} - - -#ifdef TIXML_USE_STL -TiXmlElement::TiXmlElement( const std::string& _value ) - : TiXmlNode( TiXmlNode::ELEMENT ) -{ - firstChild = lastChild = 0; - value = _value; -} -#endif - - -TiXmlElement::TiXmlElement( const TiXmlElement& copy) - : TiXmlNode( TiXmlNode::ELEMENT ) -{ - firstChild = lastChild = 0; - copy.CopyTo( this ); -} - - -void TiXmlElement::operator=( const TiXmlElement& base ) -{ - ClearThis(); - base.CopyTo( this ); -} - - -TiXmlElement::~TiXmlElement() -{ - ClearThis(); -} - - -void TiXmlElement::ClearThis() -{ - Clear(); - while( attributeSet.First() ) - { - TiXmlAttribute* node = attributeSet.First(); - attributeSet.Remove( node ); - delete node; - } -} - - -const char * TiXmlElement::Attribute( const char * name ) const -{ - const TiXmlAttribute* node = attributeSet.Find( name ); - - if ( node ) - return node->Value(); - - return 0; -} - - -const char * TiXmlElement::Attribute( const char * name, int* i ) const -{ - const char * s = Attribute( name ); - if ( i ) - { - if ( s ) - *i = atoi( s ); - else - *i = 0; - } - return s; -} - - -const char * TiXmlElement::Attribute( const char * name, double* d ) const -{ - const char * s = Attribute( name ); - if ( d ) - { - if ( s ) - *d = atof( s ); - else - *d = 0; - } - return s; -} - - -int TiXmlElement::QueryIntAttribute( const char* name, int* ival ) const -{ - const TiXmlAttribute* node = attributeSet.Find( name ); - if ( !node ) - return TIXML_NO_ATTRIBUTE; - - return node->QueryIntValue( ival ); -} - - -int TiXmlElement::QueryDoubleAttribute( const char* name, double* dval ) const -{ - const TiXmlAttribute* node = attributeSet.Find( name ); - if ( !node ) - return TIXML_NO_ATTRIBUTE; - - return node->QueryDoubleValue( dval ); -} - - -void TiXmlElement::SetAttribute( const char * name, int val ) -{ - char buf[64]; - sprintf( buf, "%d", val ); - SetAttribute( name, buf ); -} - - -void TiXmlElement::SetDoubleAttribute( const char * name, double val ) -{ - char buf[256]; - sprintf( buf, "%f", val ); - SetAttribute( name, buf ); -} - - -void TiXmlElement::SetAttribute( const char * name, const char * _value ) -{ - TiXmlAttribute* node = attributeSet.Find( name ); - if ( node ) - { - node->SetValue( _value ); - return; - } - - TiXmlAttribute* attrib = new TiXmlAttribute( name, _value ); - if ( attrib ) - { - attributeSet.Add( attrib ); - } - else - { - TiXmlDocument* document = GetDocument(); - if ( document ) document->SetError( TIXML_ERROR_OUT_OF_MEMORY, 0, 0, TIXML_ENCODING_UNKNOWN ); - } -} - -void TiXmlElement::Print( FILE* cfile, int depth ) const -{ - int i; - for ( i=0; iNext() ) - { - fprintf( cfile, " " ); - attrib->Print( cfile, depth ); - } - - // There are 3 different formatting approaches: - // 1) An element without children is printed as a node - // 2) An element with only a text child is printed as text - // 3) An element with children is printed on multiple lines. - TiXmlNode* node; - if ( !firstChild ) - { - fprintf( cfile, " />" ); - } - else if ( firstChild == lastChild && firstChild->ToText() ) - { - fprintf( cfile, ">" ); - firstChild->Print( cfile, depth + 1 ); - fprintf( cfile, "", value.c_str() ); - } - else - { - fprintf( cfile, ">" ); - - for ( node = firstChild; node; node=node->NextSibling() ) - { - if ( !node->ToText() ) - { - fprintf( cfile, "\n" ); - } - node->Print( cfile, depth+1 ); - } - fprintf( cfile, "\n" ); - for( i=0; i", value.c_str() ); - } -} - -void TiXmlElement::StreamOut( TIXML_OSTREAM * stream ) const -{ - (*stream) << "<" << value; - - const TiXmlAttribute* attrib; - for ( attrib = attributeSet.First(); attrib; attrib = attrib->Next() ) - { - (*stream) << " "; - attrib->StreamOut( stream ); - } - - // If this node has children, give it a closing tag. Else - // make it an empty tag. - TiXmlNode* node; - if ( firstChild ) - { - (*stream) << ">"; - - for ( node = firstChild; node; node=node->NextSibling() ) - { - node->StreamOut( stream ); - } - (*stream) << ""; - } - else - { - (*stream) << " />"; - } -} - - -void TiXmlElement::CopyTo( TiXmlElement* target ) const -{ - // superclass: - TiXmlNode::CopyTo( target ); - - // Element class: - // Clone the attributes, then clone the children. - const TiXmlAttribute* attribute = 0; - for( attribute = attributeSet.First(); - attribute; - attribute = attribute->Next() ) - { - target->SetAttribute( attribute->Name(), attribute->Value() ); - } - - TiXmlNode* node = 0; - for ( node = firstChild; node; node = node->NextSibling() ) - { - target->LinkEndChild( node->Clone() ); - } -} - - -TiXmlNode* TiXmlElement::Clone() const -{ - TiXmlElement* clone = new TiXmlElement( Value() ); - if ( !clone ) - return 0; - - CopyTo( clone ); - return clone; -} - - -TiXmlDocument::TiXmlDocument() : TiXmlNode( TiXmlNode::DOCUMENT ) -{ - tabsize = 4; - ClearError(); -} - -TiXmlDocument::TiXmlDocument( const char * documentName ) : TiXmlNode( TiXmlNode::DOCUMENT ) -{ - tabsize = 4; - value = documentName; - ClearError(); -} - - -#ifdef TIXML_USE_STL -TiXmlDocument::TiXmlDocument( const std::string& documentName ) : TiXmlNode( TiXmlNode::DOCUMENT ) -{ - tabsize = 4; - value = documentName; - ClearError(); -} -#endif - - -TiXmlDocument::TiXmlDocument( const TiXmlDocument& copy ) : TiXmlNode( TiXmlNode::DOCUMENT ) -{ - copy.CopyTo( this ); -} - - -void TiXmlDocument::operator=( const TiXmlDocument& copy ) -{ - Clear(); - copy.CopyTo( this ); -} - - -bool TiXmlDocument::LoadFile( TiXmlEncoding encoding ) -{ - // See STL_STRING_BUG below. - StringToBuffer buf( value ); - - if ( buf.buffer && LoadFile( buf.buffer, encoding ) ) - return true; - - return false; -} - - -bool TiXmlDocument::SaveFile() const -{ - // See STL_STRING_BUG below. - StringToBuffer buf( value ); - - if ( buf.buffer && SaveFile( buf.buffer ) ) - return true; - - return false; -} - -bool TiXmlDocument::LoadFile( const char* filename, TiXmlEncoding encoding ) -{ - // Delete the existing data: - Clear(); - location.Clear(); - - // There was a really terrifying little bug here. The code: - // value = filename - // in the STL case, cause the assignment method of the std::string to - // be called. What is strange, is that the std::string had the same - // address as it's c_str() method, and so bad things happen. Looks - // like a bug in the Microsoft STL implementation. - // See STL_STRING_BUG above. - // Fixed with the StringToBuffer class. - value = filename; - - FILE* file = fopen( value.c_str (), "r" ); - - if ( file ) - { - // Get the file size, so we can pre-allocate the string. HUGE speed impact. - long length = 0; - fseek( file, 0, SEEK_END ); - length = ftell( file ); - fseek( file, 0, SEEK_SET ); - - // Strange case, but good to handle up front. - if ( length == 0 ) - { - fclose( file ); - return false; - } - - // If we have a file, assume it is all one big XML file, and read it in. - // The document parser may decide the document ends sooner than the entire file, however. - TIXML_STRING data; - data.reserve( length ); - - const int BUF_SIZE = 2048; - char buf[BUF_SIZE]; - - while( fgets( buf, BUF_SIZE, file ) ) - { - data += buf; - } - fclose( file ); - - Parse( data.c_str(), 0, encoding ); - - if ( Error() ) - return false; - else - return true; - } - SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); - return false; -} - -bool TiXmlDocument::SaveFile( const char * filename ) const -{ - // The old c stuff lives on... - FILE* fp = fopen( filename, "w" ); - if ( fp ) - { - Print( fp, 0 ); - fclose( fp ); - return true; - } - return false; -} - - -void TiXmlDocument::CopyTo( TiXmlDocument* target ) const -{ - TiXmlNode::CopyTo( target ); - - target->error = error; - target->errorDesc = errorDesc.c_str (); - - TiXmlNode* node = 0; - for ( node = firstChild; node; node = node->NextSibling() ) - { - target->LinkEndChild( node->Clone() ); - } -} - - -TiXmlNode* TiXmlDocument::Clone() const -{ - TiXmlDocument* clone = new TiXmlDocument(); - if ( !clone ) - return 0; - - CopyTo( clone ); - return clone; -} - -void TiXmlDocument::Print( FILE* cfile, int depth ) const -{ - const TiXmlNode* node; - for ( node=FirstChild(); node; node=node->NextSibling() ) - { - node->Print( cfile, depth ); - fprintf( cfile, "\n" ); - } -} - -void TiXmlDocument::StreamOut( TIXML_OSTREAM * out ) const -{ - const TiXmlNode* node; - for ( node=FirstChild(); node; node=node->NextSibling() ) - { - node->StreamOut( out ); - - // Special rule for streams: stop after the root element. - // The stream in code will only read one element, so don't - // write more than one. - if ( node->ToElement() ) - break; - } -} - - -const TiXmlAttribute* TiXmlAttribute::Next() const -{ - // We are using knowledge of the sentinel. The sentinel - // have a value or name. - if ( next->value.empty() && next->name.empty() ) - return 0; - return next; -} - -TiXmlAttribute* TiXmlAttribute::Next() -{ - // We are using knowledge of the sentinel. The sentinel - // have a value or name. - if ( next->value.empty() && next->name.empty() ) - return 0; - return next; -} - -const TiXmlAttribute* TiXmlAttribute::Previous() const -{ - // We are using knowledge of the sentinel. The sentinel - // have a value or name. - if ( prev->value.empty() && prev->name.empty() ) - return 0; - return prev; -} - -TiXmlAttribute* TiXmlAttribute::Previous() -{ - // We are using knowledge of the sentinel. The sentinel - // have a value or name. - if ( prev->value.empty() && prev->name.empty() ) - return 0; - return prev; -} - -void TiXmlAttribute::Print( FILE* cfile, int /*depth*/ ) const -{ - TIXML_STRING n, v; - - PutString( name, &n ); - PutString( value, &v ); - - if (value.find ('\"') == TIXML_STRING::npos) - fprintf (cfile, "%s=\"%s\"", n.c_str(), v.c_str() ); - else - fprintf (cfile, "%s='%s'", n.c_str(), v.c_str() ); -} - - -void TiXmlAttribute::StreamOut( TIXML_OSTREAM * stream ) const -{ - if (value.find( '\"' ) != TIXML_STRING::npos) - { - PutString( name, stream ); - (*stream) << "=" << "'"; - PutString( value, stream ); - (*stream) << "'"; - } - else - { - PutString( name, stream ); - (*stream) << "=" << "\""; - PutString( value, stream ); - (*stream) << "\""; - } -} - -int TiXmlAttribute::QueryIntValue( int* ival ) const -{ - if ( sscanf( value.c_str(), "%d", ival ) == 1 ) - return TIXML_SUCCESS; - return TIXML_WRONG_TYPE; -} - -int TiXmlAttribute::QueryDoubleValue( double* dval ) const -{ - if ( sscanf( value.c_str(), "%lf", dval ) == 1 ) - return TIXML_SUCCESS; - return TIXML_WRONG_TYPE; -} - -void TiXmlAttribute::SetIntValue( int _value ) -{ - char buf [64]; - sprintf (buf, "%d", _value); - SetValue (buf); -} - -void TiXmlAttribute::SetDoubleValue( double _value ) -{ - char buf [256]; - sprintf (buf, "%lf", _value); - SetValue (buf); -} - -const int TiXmlAttribute::IntValue() const -{ - return atoi (value.c_str ()); -} - -const double TiXmlAttribute::DoubleValue() const -{ - return atof (value.c_str ()); -} - - -TiXmlComment::TiXmlComment( const TiXmlComment& copy ) : TiXmlNode( TiXmlNode::COMMENT ) -{ - copy.CopyTo( this ); -} - - -void TiXmlComment::operator=( const TiXmlComment& base ) -{ - Clear(); - base.CopyTo( this ); -} - - -void TiXmlComment::Print( FILE* cfile, int depth ) const -{ - for ( int i=0; i", value.c_str() ); -} - -void TiXmlComment::StreamOut( TIXML_OSTREAM * stream ) const -{ - (*stream) << ""; -} - - -void TiXmlComment::CopyTo( TiXmlComment* target ) const -{ - TiXmlNode::CopyTo( target ); -} - - -TiXmlNode* TiXmlComment::Clone() const -{ - TiXmlComment* clone = new TiXmlComment(); - - if ( !clone ) - return 0; - - CopyTo( clone ); - return clone; -} - - -void TiXmlText::Print( FILE* cfile, int /*depth*/ ) const -{ - TIXML_STRING buffer; - PutString( value, &buffer ); - fprintf( cfile, "%s", buffer.c_str() ); -} - - -void TiXmlText::StreamOut( TIXML_OSTREAM * stream ) const -{ - PutString( value, stream ); -} - - -void TiXmlText::CopyTo( TiXmlText* target ) const -{ - TiXmlNode::CopyTo( target ); -} - - -TiXmlNode* TiXmlText::Clone() const -{ - TiXmlText* clone = 0; - clone = new TiXmlText( "" ); - - if ( !clone ) - return 0; - - CopyTo( clone ); - return clone; -} - - -TiXmlDeclaration::TiXmlDeclaration( const char * _version, - const char * _encoding, - const char * _standalone ) - : TiXmlNode( TiXmlNode::DECLARATION ) -{ - version = _version; - encoding = _encoding; - standalone = _standalone; -} - - -#ifdef TIXML_USE_STL -TiXmlDeclaration::TiXmlDeclaration( const std::string& _version, - const std::string& _encoding, - const std::string& _standalone ) - : TiXmlNode( TiXmlNode::DECLARATION ) -{ - version = _version; - encoding = _encoding; - standalone = _standalone; -} -#endif - - -TiXmlDeclaration::TiXmlDeclaration( const TiXmlDeclaration& copy ) - : TiXmlNode( TiXmlNode::DECLARATION ) -{ - copy.CopyTo( this ); -} - - -void TiXmlDeclaration::operator=( const TiXmlDeclaration& copy ) -{ - Clear(); - copy.CopyTo( this ); -} - - -void TiXmlDeclaration::Print( FILE* cfile, int /*depth*/ ) const -{ - fprintf (cfile, ""); -} - -void TiXmlDeclaration::StreamOut( TIXML_OSTREAM * stream ) const -{ - (*stream) << ""; -} - - -void TiXmlDeclaration::CopyTo( TiXmlDeclaration* target ) const -{ - TiXmlNode::CopyTo( target ); - - target->version = version; - target->encoding = encoding; - target->standalone = standalone; -} - - -TiXmlNode* TiXmlDeclaration::Clone() const -{ - TiXmlDeclaration* clone = new TiXmlDeclaration(); - - if ( !clone ) - return 0; - - CopyTo( clone ); - return clone; -} - - -void TiXmlUnknown::Print( FILE* cfile, int depth ) const -{ - for ( int i=0; i", value.c_str() ); -} - - -void TiXmlUnknown::StreamOut( TIXML_OSTREAM * stream ) const -{ - (*stream) << "<" << value << ">"; // Don't use entities here! It is unknown. -} - - -void TiXmlUnknown::CopyTo( TiXmlUnknown* target ) const -{ - TiXmlNode::CopyTo( target ); -} - - -TiXmlNode* TiXmlUnknown::Clone() const -{ - TiXmlUnknown* clone = new TiXmlUnknown(); - - if ( !clone ) - return 0; - - CopyTo( clone ); - return clone; -} - - -TiXmlAttributeSet::TiXmlAttributeSet() -{ - sentinel.next = &sentinel; - sentinel.prev = &sentinel; -} - - -TiXmlAttributeSet::~TiXmlAttributeSet() -{ - assert( sentinel.next == &sentinel ); - assert( sentinel.prev == &sentinel ); -} - - -void TiXmlAttributeSet::Add( TiXmlAttribute* addMe ) -{ - assert( !Find( addMe->Name() ) ); // Shouldn't be multiply adding to the set. - - addMe->next = &sentinel; - addMe->prev = sentinel.prev; - - sentinel.prev->next = addMe; - sentinel.prev = addMe; -} - -void TiXmlAttributeSet::Remove( TiXmlAttribute* removeMe ) -{ - TiXmlAttribute* node; - - for( node = sentinel.next; node != &sentinel; node = node->next ) - { - if ( node == removeMe ) - { - node->prev->next = node->next; - node->next->prev = node->prev; - node->next = 0; - node->prev = 0; - return; - } - } - assert( 0 ); // we tried to remove a non-linked attribute. -} - -const TiXmlAttribute* TiXmlAttributeSet::Find( const char * name ) const -{ - const TiXmlAttribute* node; - - for( node = sentinel.next; node != &sentinel; node = node->next ) - { - if ( node->name == name ) - return node; - } - return 0; -} - -TiXmlAttribute* TiXmlAttributeSet::Find( const char * name ) -{ - TiXmlAttribute* node; - - for( node = sentinel.next; node != &sentinel; node = node->next ) - { - if ( node->name == name ) - return node; - } - return 0; -} - -#ifdef TIXML_USE_STL -TIXML_ISTREAM & operator >> (TIXML_ISTREAM & in, TiXmlNode & base) -{ - TIXML_STRING tag; - tag.reserve( 8 * 1000 ); - base.StreamIn( &in, &tag ); - - base.Parse( tag.c_str(), 0, TIXML_DEFAULT_ENCODING ); - return in; -} -#endif - - -TIXML_OSTREAM & operator<< (TIXML_OSTREAM & out, const TiXmlNode & base) -{ - base.StreamOut (& out); - return out; -} - - -#ifdef TIXML_USE_STL -std::string & operator<< (std::string& out, const TiXmlNode& base ) -{ - std::ostringstream os_stream( std::ostringstream::out ); - base.StreamOut( &os_stream ); - - out.append( os_stream.str() ); - return out; -} -#endif - - -TiXmlHandle TiXmlHandle::FirstChild() const -{ - if ( node ) - { - TiXmlNode* child = node->FirstChild(); - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::FirstChild( const char * value ) const -{ - if ( node ) - { - TiXmlNode* child = node->FirstChild( value ); - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::FirstChildElement() const -{ - if ( node ) - { - TiXmlElement* child = node->FirstChildElement(); - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::FirstChildElement( const char * value ) const -{ - if ( node ) - { - TiXmlElement* child = node->FirstChildElement( value ); - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - -TiXmlHandle TiXmlHandle::Child( int count ) const -{ - if ( node ) - { - int i; - TiXmlNode* child = node->FirstChild(); - for ( i=0; - child && iNextSibling(), ++i ) - { - // nothing - } - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::Child( const char* value, int count ) const -{ - if ( node ) - { - int i; - TiXmlNode* child = node->FirstChild( value ); - for ( i=0; - child && iNextSibling( value ), ++i ) - { - // nothing - } - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::ChildElement( int count ) const -{ - if ( node ) - { - int i; - TiXmlElement* child = node->FirstChildElement(); - for ( i=0; - child && iNextSiblingElement(), ++i ) - { - // nothing - } - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::ChildElement( const char* value, int count ) const -{ - if ( node ) - { - int i; - TiXmlElement* child = node->FirstChildElement( value ); - for ( i=0; - child && iNextSiblingElement( value ), ++i ) - { - // nothing - } - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} diff --git a/uppdev/YPuzzle/TinyXML/tinyxml.h b/uppdev/YPuzzle/TinyXML/tinyxml.h deleted file mode 100644 index 0024ae903..000000000 --- a/uppdev/YPuzzle/TinyXML/tinyxml.h +++ /dev/null @@ -1,1441 +0,0 @@ -/* -www.sourceforge.net/projects/tinyxml -Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com) - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. -*/ - - -#ifndef TINYXML_INCLUDED -#define TINYXML_INCLUDED - -#ifdef _MSC_VER -#pragma warning( disable : 4530 ) -#pragma warning( disable : 4786 ) -#endif - -#include -#include -#include -#include -#include - -// Help out windows: -#if defined( _DEBUG ) && !defined( DEBUG ) -#define DEBUG -#endif - -#if defined( DEBUG ) && defined( _MSC_VER ) -#include -#define TIXML_LOG OutputDebugString -#else -#define TIXML_LOG printf -#endif - -#ifdef TIXML_USE_STL - #include - #include - #define TIXML_STRING std::string - #define TIXML_ISTREAM std::istream - #define TIXML_OSTREAM std::ostream -#else - #include "tinystr.h" - #define TIXML_STRING TiXmlString - #define TIXML_OSTREAM TiXmlOutStream -#endif - -class TiXmlDocument; -class TiXmlElement; -class TiXmlComment; -class TiXmlUnknown; -class TiXmlAttribute; -class TiXmlText; -class TiXmlDeclaration; -class TiXmlParsingData; - -const int TIXML_MAJOR_VERSION = 2; -const int TIXML_MINOR_VERSION = 3; -const int TIXML_PATCH_VERSION = 4; - -/* Internal structure for tracking location of items - in the XML file. -*/ -struct TiXmlCursor -{ - TiXmlCursor() { Clear(); } - void Clear() { row = col = -1; } - - int row; // 0 based. - int col; // 0 based. -}; - - -// Only used by Attribute::Query functions -enum -{ - TIXML_SUCCESS, - TIXML_NO_ATTRIBUTE, - TIXML_WRONG_TYPE -}; - - -// Used by the parsing routines. -enum TiXmlEncoding -{ - TIXML_ENCODING_UNKNOWN, - TIXML_ENCODING_UTF8, - TIXML_ENCODING_LEGACY -}; - -const TiXmlEncoding TIXML_DEFAULT_ENCODING = TIXML_ENCODING_UNKNOWN; - -/** TiXmlBase is a base class for every class in TinyXml. - It does little except to establish that TinyXml classes - can be printed and provide some utility functions. - - In XML, the document and elements can contain - other elements and other types of nodes. - - @verbatim - A Document can contain: Element (container or leaf) - Comment (leaf) - Unknown (leaf) - Declaration( leaf ) - - An Element can contain: Element (container or leaf) - Text (leaf) - Attributes (not on tree) - Comment (leaf) - Unknown (leaf) - - A Decleration contains: Attributes (not on tree) - @endverbatim -*/ -class TiXmlBase -{ - friend class TiXmlNode; - friend class TiXmlElement; - friend class TiXmlDocument; - -public: - TiXmlBase() : userData(0) {} - virtual ~TiXmlBase() {} - - /** All TinyXml classes can print themselves to a filestream. - This is a formatted print, and will insert tabs and newlines. - - (For an unformatted stream, use the << operator.) - */ - virtual void Print( FILE* cfile, int depth ) const = 0; - - /** The world does not agree on whether white space should be kept or - not. In order to make everyone happy, these global, static functions - are provided to set whether or not TinyXml will condense all white space - into a single space or not. The default is to condense. Note changing this - values is not thread safe. - */ - static void SetCondenseWhiteSpace( bool condense ) { condenseWhiteSpace = condense; } - - /// Return the current white space setting. - static bool IsWhiteSpaceCondensed() { return condenseWhiteSpace; } - - /** Return the position, in the original source file, of this node or attribute. - The row and column are 1-based. (That is the first row and first column is - 1,1). If the returns values are 0 or less, then the parser does not have - a row and column value. - - Generally, the row and column value will be set when the TiXmlDocument::Load(), - TiXmlDocument::LoadFile(), or any TiXmlNode::Parse() is called. It will NOT be set - when the DOM was created from operator>>. - - The values reflect the initial load. Once the DOM is modified programmatically - (by adding or changing nodes and attributes) the new values will NOT update to - reflect changes in the document. - - There is a minor performance cost to computing the row and column. Computation - can be disabled if TiXmlDocument::SetTabSize() is called with 0 as the value. - - @sa TiXmlDocument::SetTabSize() - */ - int Row() const { return location.row + 1; } - int Column() const { return location.col + 1; } ///< See Row() - - void SetUserData( void* user ) { userData = user; } - void* GetUserData() { return userData; } - - // Table that returs, for a given lead byte, the total number of bytes - // in the UTF-8 sequence. - static const int utf8ByteTable[256]; - - virtual const char* Parse( const char* p, - TiXmlParsingData* data, - TiXmlEncoding encoding /*= TIXML_ENCODING_UNKNOWN */ ) = 0; - - enum - { - TIXML_NO_ERROR = 0, - TIXML_ERROR, - TIXML_ERROR_OPENING_FILE, - TIXML_ERROR_OUT_OF_MEMORY, - TIXML_ERROR_PARSING_ELEMENT, - TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME, - TIXML_ERROR_READING_ELEMENT_VALUE, - TIXML_ERROR_READING_ATTRIBUTES, - TIXML_ERROR_PARSING_EMPTY, - TIXML_ERROR_READING_END_TAG, - TIXML_ERROR_PARSING_UNKNOWN, - TIXML_ERROR_PARSING_COMMENT, - TIXML_ERROR_PARSING_DECLARATION, - TIXML_ERROR_DOCUMENT_EMPTY, - TIXML_ERROR_EMBEDDED_NULL, - - TIXML_ERROR_STRING_COUNT - }; - -protected: - - // See STL_STRING_BUG - // Utility class to overcome a bug. - class StringToBuffer - { - public: - StringToBuffer( const TIXML_STRING& str ); - ~StringToBuffer(); - char* buffer; - }; - - static const char* SkipWhiteSpace( const char*, TiXmlEncoding encoding ); - inline static bool IsWhiteSpace( char c ) - { - return ( isspace( (unsigned char) c ) || c == '\n' || c == '\r' ); - } - - virtual void StreamOut (TIXML_OSTREAM *) const = 0; - - #ifdef TIXML_USE_STL - static bool StreamWhiteSpace( TIXML_ISTREAM * in, TIXML_STRING * tag ); - static bool StreamTo( TIXML_ISTREAM * in, int character, TIXML_STRING * tag ); - #endif - - /* Reads an XML name into the string provided. Returns - a pointer just past the last character of the name, - or 0 if the function has an error. - */ - static const char* ReadName( const char* p, TIXML_STRING* name, TiXmlEncoding encoding ); - - /* Reads text. Returns a pointer past the given end tag. - Wickedly complex options, but it keeps the (sensitive) code in one place. - */ - static const char* ReadText( const char* in, // where to start - TIXML_STRING* text, // the string read - bool ignoreWhiteSpace, // whether to keep the white space - const char* endTag, // what ends this text - bool ignoreCase, // whether to ignore case in the end tag - TiXmlEncoding encoding ); // the current encoding - - // If an entity has been found, transform it into a character. - static const char* GetEntity( const char* in, char* value, int* length, TiXmlEncoding encoding ); - - // Get a character, while interpreting entities. - // The length can be from 0 to 4 bytes. - inline static const char* GetChar( const char* p, char* _value, int* length, TiXmlEncoding encoding ) - { - assert( p ); - if ( encoding == TIXML_ENCODING_UTF8 ) - { - *length = utf8ByteTable[ *((unsigned char*)p) ]; - assert( *length >= 0 && *length < 5 ); - } - else - { - *length = 1; - } - - if ( *length == 1 ) - { - if ( *p == '&' ) - return GetEntity( p, _value, length, encoding ); - *_value = *p; - return p+1; - } - else if ( *length ) - { - strncpy( _value, p, *length ); - return p + (*length); - } - else - { - // Not valid text. - return 0; - } - } - - // Puts a string to a stream, expanding entities as it goes. - // Note this should not contian the '<', '>', etc, or they will be transformed into entities! - static void PutString( const TIXML_STRING& str, TIXML_OSTREAM* out ); - - static void PutString( const TIXML_STRING& str, TIXML_STRING* out ); - - // Return true if the next characters in the stream are any of the endTag sequences. - // Ignore case only works for english, and should only be relied on when comparing - // to Engilish words: StringEqual( p, "version", true ) is fine. - static bool StringEqual( const char* p, - const char* endTag, - bool ignoreCase, - TiXmlEncoding encoding ); - - static const char* errorString[ TIXML_ERROR_STRING_COUNT ]; - - TiXmlCursor location; - - /// Field containing a generic user pointer - void* userData; - - // None of these methods are reliable for any language except English. - // Good for approximation, not great for accuracy. - static int IsAlpha( unsigned char anyByte, TiXmlEncoding encoding ); - static int IsAlphaNum( unsigned char anyByte, TiXmlEncoding encoding ); - inline static int ToLower( int v, TiXmlEncoding encoding ) - { - if ( encoding == TIXML_ENCODING_UTF8 ) - { - if ( v < 128 ) return tolower( v ); - return v; - } - else - { - return tolower( v ); - } - } - static void ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ); - -private: - TiXmlBase( const TiXmlBase& ); // not implemented. - void operator=( const TiXmlBase& base ); // not allowed. - - struct Entity - { - const char* str; - unsigned int strLength; - char chr; - }; - enum - { - NUM_ENTITY = 5, - MAX_ENTITY_LENGTH = 6 - - }; - static Entity entity[ NUM_ENTITY ]; - static bool condenseWhiteSpace; -}; - - -/** The parent class for everything in the Document Object Model. - (Except for attributes). - Nodes have siblings, a parent, and children. A node can be - in a document, or stand on its own. The type of a TiXmlNode - can be queried, and it can be cast to its more defined type. -*/ -class TiXmlNode : public TiXmlBase -{ - friend class TiXmlDocument; - friend class TiXmlElement; - -public: - #ifdef TIXML_USE_STL - - /** An input stream operator, for every class. Tolerant of newlines and - formatting, but doesn't expect them. - */ - friend std::istream& operator >> (std::istream& in, TiXmlNode& base); - - /** An output stream operator, for every class. Note that this outputs - without any newlines or formatting, as opposed to Print(), which - includes tabs and new lines. - - The operator<< and operator>> are not completely symmetric. Writing - a node to a stream is very well defined. You'll get a nice stream - of output, without any extra whitespace or newlines. - - But reading is not as well defined. (As it always is.) If you create - a TiXmlElement (for example) and read that from an input stream, - the text needs to define an element or junk will result. This is - true of all input streams, but it's worth keeping in mind. - - A TiXmlDocument will read nodes until it reads a root element, and - all the children of that root element. - */ - friend std::ostream& operator<< (std::ostream& out, const TiXmlNode& base); - - /// Appends the XML node or attribute to a std::string. - friend std::string& operator<< (std::string& out, const TiXmlNode& base ); - - #else - // Used internally, not part of the public API. - friend TIXML_OSTREAM& operator<< (TIXML_OSTREAM& out, const TiXmlNode& base); - #endif - - /** The types of XML nodes supported by TinyXml. (All the - unsupported types are picked up by UNKNOWN.) - */ - enum NodeType - { - DOCUMENT, - ELEMENT, - COMMENT, - UNKNOWN, - TEXT, - DECLARATION, - TYPECOUNT - }; - - virtual ~TiXmlNode(); - - /** The meaning of 'value' changes for the specific type of - TiXmlNode. - @verbatim - Document: filename of the xml file - Element: name of the element - Comment: the comment text - Unknown: the tag contents - Text: the text string - @endverbatim - - The subclasses will wrap this function. - */ - const char * Value() const { return value.c_str (); } - - /** Changes the value of the node. Defined as: - @verbatim - Document: filename of the xml file - Element: name of the element - Comment: the comment text - Unknown: the tag contents - Text: the text string - @endverbatim - */ - void SetValue(const char * _value) { value = _value;} - - #ifdef TIXML_USE_STL - /// STL std::string form. - void SetValue( const std::string& _value ) - { - StringToBuffer buf( _value ); - SetValue( buf.buffer ? buf.buffer : "" ); - } - #endif - - /// Delete all the children of this node. Does not affect 'this'. - void Clear(); - - /// One step up the DOM. - TiXmlNode* Parent() { return parent; } - const TiXmlNode* Parent() const { return parent; } - - const TiXmlNode* FirstChild() const { return firstChild; } ///< The first child of this node. Will be null if there are no children. - TiXmlNode* FirstChild() { return firstChild; } - const TiXmlNode* FirstChild( const char * value ) const; ///< The first child of this node with the matching 'value'. Will be null if none found. - TiXmlNode* FirstChild( const char * value ); ///< The first child of this node with the matching 'value'. Will be null if none found. - - ///Arlen Albert Keshabian addons: gets the element a path points to - virtual TiXmlNode *NodeFromPath(const char *sPath, char chSeparator = '.') const; - virtual TiXmlElement *ElementFromPath(const char *sPath, char chSeparator = '.') const - { - TiXmlNode *l_pNode = NodeFromPath(sPath, chSeparator); - - return (l_pNode) ? l_pNode->ToElement() : NULL; - } - -#ifdef TIXML_USE_STL - virtual TiXmlNode *NodeFromPath( const std::string& sPath, char chSeparator = '.') const {return NodeFromPath(sPath.c_str(), chSeparator);} - virtual TiXmlElement *ElementFromPath( const std::string& sPath, char chSeparator = '.') const {return ElementFromPath(sPath.c_str(), chSeparator);} -#endif - ////////////////////////////////////////////////////////////////////////// - - const TiXmlNode* LastChild() const { return lastChild; } /// The last child of this node. Will be null if there are no children. - TiXmlNode* LastChild() { return lastChild; } - const TiXmlNode* LastChild( const char * value ) const; /// The last child of this node matching 'value'. Will be null if there are no children. - TiXmlNode* LastChild( const char * value ); - - #ifdef TIXML_USE_STL - const TiXmlNode* FirstChild( const std::string& _value ) const { return FirstChild (_value.c_str ()); } ///< STL std::string form. - TiXmlNode* FirstChild( const std::string& _value ) { return FirstChild (_value.c_str ()); } ///< STL std::string form. - const TiXmlNode* LastChild( const std::string& _value ) const { return LastChild (_value.c_str ()); } ///< STL std::string form. - TiXmlNode* LastChild( const std::string& _value ) { return LastChild (_value.c_str ()); } ///< STL std::string form. - #endif - - /** An alternate way to walk the children of a node. - One way to iterate over nodes is: - @verbatim - for( child = parent->FirstChild(); child; child = child->NextSibling() ) - @endverbatim - - IterateChildren does the same thing with the syntax: - @verbatim - child = 0; - while( child = parent->IterateChildren( child ) ) - @endverbatim - - IterateChildren takes the previous child as input and finds - the next one. If the previous child is null, it returns the - first. IterateChildren will return null when done. - */ - const TiXmlNode* IterateChildren( const TiXmlNode* previous ) const; - TiXmlNode* IterateChildren( TiXmlNode* previous ); - - /// This flavor of IterateChildren searches for children with a particular 'value' - const TiXmlNode* IterateChildren( const char * value, const TiXmlNode* previous ) const; - TiXmlNode* IterateChildren( const char * value, TiXmlNode* previous ); - - #ifdef TIXML_USE_STL - const TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) const { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. - TiXmlNode* IterateChildren( const std::string& _value, TiXmlNode* previous ) { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. - #endif - - /** Add a new node related to this. Adds a child past the LastChild. - Returns a pointer to the new object or NULL if an error occured. - */ - TiXmlNode* InsertEndChild( const TiXmlNode& addThis ); - - - /** Add a new node related to this. Adds a child past the LastChild. - - NOTE: the node to be added is passed by pointer, and will be - henceforth owned (and deleted) by tinyXml. This method is efficient - and avoids an extra copy, but should be used with care as it - uses a different memory model than the other insert functions. - - @sa InsertEndChild - */ - TiXmlNode* LinkEndChild( TiXmlNode* addThis ); - - /** Add a new node related to this. Adds a child before the specified child. - Returns a pointer to the new object or NULL if an error occured. - */ - TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ); - - /** Add a new node related to this. Adds a child after the specified child. - Returns a pointer to the new object or NULL if an error occured. - */ - TiXmlNode* InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ); - - /** Replace a child of this node. - Returns a pointer to the new object or NULL if an error occured. - */ - TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ); - - /// Delete a child of this node. - bool RemoveChild( TiXmlNode* removeThis ); - - /// Navigate to a sibling node. - const TiXmlNode* PreviousSibling() const { return prev; } - TiXmlNode* PreviousSibling() { return prev; } - - /// Navigate to a sibling node. - const TiXmlNode* PreviousSibling( const char * ) const; - TiXmlNode* PreviousSibling( const char * ); - - #ifdef TIXML_USE_STL - const TiXmlNode* PreviousSibling( const std::string& _value ) const { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. - TiXmlNode* PreviousSibling( const std::string& _value ) { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. - const TiXmlNode* NextSibling( const std::string& _value) const { return NextSibling (_value.c_str ()); } ///< STL std::string form. - TiXmlNode* NextSibling( const std::string& _value) { return NextSibling (_value.c_str ()); } ///< STL std::string form. - #endif - - /// Navigate to a sibling node. - const TiXmlNode* NextSibling() const { return next; } - TiXmlNode* NextSibling() { return next; } - - /// Navigate to a sibling node with the given 'value'. - const TiXmlNode* NextSibling( const char * ) const; - TiXmlNode* NextSibling( const char * ); - - /** Convenience function to get through elements. - Calls NextSibling and ToElement. Will skip all non-Element - nodes. Returns 0 if there is not another element. - */ - const TiXmlElement* NextSiblingElement() const; - TiXmlElement* NextSiblingElement(); - - /** Convenience function to get through elements. - Calls NextSibling and ToElement. Will skip all non-Element - nodes. Returns 0 if there is not another element. - */ - const TiXmlElement* NextSiblingElement( const char * ) const; - TiXmlElement* NextSiblingElement( const char * ); - - #ifdef TIXML_USE_STL - const TiXmlElement* NextSiblingElement( const std::string& _value) const { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. - TiXmlElement* NextSiblingElement( const std::string& _value) { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. - #endif - - /// Convenience function to get through elements. - const TiXmlElement* FirstChildElement() const; - TiXmlElement* FirstChildElement(); - - /// Convenience function to get through elements. - const TiXmlElement* FirstChildElement( const char * value ) const; - TiXmlElement* FirstChildElement( const char * value ); - - #ifdef TIXML_USE_STL - const TiXmlElement* FirstChildElement( const std::string& _value ) const { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. - TiXmlElement* FirstChildElement( const std::string& _value ) { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. - #endif - - /** Query the type (as an enumerated value, above) of this node. - The possible types are: DOCUMENT, ELEMENT, COMMENT, - UNKNOWN, TEXT, and DECLARATION. - */ - virtual int Type() const { return type; } - - /** Return a pointer to the Document this node lives in. - Returns null if not in a document. - */ - const TiXmlDocument* GetDocument() const; - TiXmlDocument* GetDocument(); - - /// Returns true if this node has no children. - bool NoChildren() const { return !firstChild; } - - const TiXmlDocument* ToDocument() const { return ( this && type == DOCUMENT ) ? (const TiXmlDocument*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - const TiXmlElement* ToElement() const { return ( this && type == ELEMENT ) ? (const TiXmlElement*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - const TiXmlComment* ToComment() const { return ( this && type == COMMENT ) ? (const TiXmlComment*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - const TiXmlUnknown* ToUnknown() const { return ( this && type == UNKNOWN ) ? (const TiXmlUnknown*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - const TiXmlText* ToText() const { return ( this && type == TEXT ) ? (const TiXmlText*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - const TiXmlDeclaration* ToDeclaration() const { return ( this && type == DECLARATION ) ? (const TiXmlDeclaration*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - - TiXmlDocument* ToDocument() { return ( this && type == DOCUMENT ) ? (TiXmlDocument*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - TiXmlElement* ToElement() { return ( this && type == ELEMENT ) ? (TiXmlElement*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - TiXmlComment* ToComment() { return ( this && type == COMMENT ) ? (TiXmlComment*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - TiXmlUnknown* ToUnknown() { return ( this && type == UNKNOWN ) ? (TiXmlUnknown*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - TiXmlText* ToText() { return ( this && type == TEXT ) ? (TiXmlText*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - TiXmlDeclaration* ToDeclaration() { return ( this && type == DECLARATION ) ? (TiXmlDeclaration*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - - /** Create an exact duplicate of this node and return it. The memory must be deleted - by the caller. - */ - virtual TiXmlNode* Clone() const = 0; - -protected: - TiXmlNode( NodeType _type ); - - // Copy to the allocated object. Shared functionality between Clone, Copy constructor, - // and the assignment operator. - void CopyTo( TiXmlNode* target ) const; - - #ifdef TIXML_USE_STL - // The real work of the input operator. - virtual void StreamIn( TIXML_ISTREAM* in, TIXML_STRING* tag ) = 0; - #endif - - // Figure out what is at *p, and parse it. Returns null if it is not an xml node. - TiXmlNode* Identify( const char* start, TiXmlEncoding encoding ); - - // Internal Value function returning a TIXML_STRING - const TIXML_STRING& SValue() const { return value ; } - - TiXmlNode* parent; - NodeType type; - - TiXmlNode* firstChild; - TiXmlNode* lastChild; - - TIXML_STRING value; - - TiXmlNode* prev; - TiXmlNode* next; - -private: - TiXmlNode( const TiXmlNode& ); // not implemented. - void operator=( const TiXmlNode& base ); // not allowed. -}; - - -/** An attribute is a name-value pair. Elements have an arbitrary - number of attributes, each with a unique name. - - @note The attributes are not TiXmlNodes, since they are not - part of the tinyXML document object model. There are other - suggested ways to look at this problem. -*/ -class TiXmlAttribute : public TiXmlBase -{ - friend class TiXmlAttributeSet; - -public: - /// Construct an empty attribute. - TiXmlAttribute() : TiXmlBase() - { - document = 0; - prev = next = 0; - } - - #ifdef TIXML_USE_STL - /// std::string constructor. - TiXmlAttribute( const std::string& _name, const std::string& _value ) - { - name = _name; - value = _value; - document = 0; - prev = next = 0; - } - #endif - - /// Construct an attribute with a name and value. - TiXmlAttribute( const char * _name, const char * _value ) - { - name = _name; - value = _value; - document = 0; - prev = next = 0; - } - - const char* Name() const { return name.c_str (); } ///< Return the name of this attribute. - const char* Value() const { return value.c_str (); } ///< Return the value of this attribute. - const int IntValue() const; ///< Return the value of this attribute, converted to an integer. - const double DoubleValue() const; ///< Return the value of this attribute, converted to a double. - - /** QueryIntValue examines the value string. It is an alternative to the - IntValue() method with richer error checking. - If the value is an integer, it is stored in 'value' and - the call returns TIXML_SUCCESS. If it is not - an integer, it returns TIXML_WRONG_TYPE. - - A specialized but useful call. Note that for success it returns 0, - which is the opposite of almost all other TinyXml calls. - */ - int QueryIntValue( int* value ) const; - /// QueryDoubleValue examines the value string. See QueryIntValue(). - int QueryDoubleValue( double* value ) const; - - void SetName( const char* _name ) { name = _name; } ///< Set the name of this attribute. - void SetValue( const char* _value ) { value = _value; } ///< Set the value. - - void SetIntValue( int value ); ///< Set the value from an integer. - void SetDoubleValue( double value ); ///< Set the value from a double. - - #ifdef TIXML_USE_STL - /// STL std::string form. - void SetName( const std::string& _name ) - { - StringToBuffer buf( _name ); - SetName ( buf.buffer ? buf.buffer : "error" ); - } - /// STL std::string form. - void SetValue( const std::string& _value ) - { - StringToBuffer buf( _value ); - SetValue( buf.buffer ? buf.buffer : "error" ); - } - #endif - - /// Get the next sibling attribute in the DOM. Returns null at end. - const TiXmlAttribute* Next() const; - TiXmlAttribute* Next(); - /// Get the previous sibling attribute in the DOM. Returns null at beginning. - const TiXmlAttribute* Previous() const; - TiXmlAttribute* Previous(); - - bool operator==( const TiXmlAttribute& rhs ) const { return rhs.name == name; } - bool operator<( const TiXmlAttribute& rhs ) const { return name < rhs.name; } - bool operator>( const TiXmlAttribute& rhs ) const { return name > rhs.name; } - - /* Attribute parsing starts: first letter of the name - returns: the next char after the value end quote - */ - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - - // Prints this Attribute to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - virtual void StreamOut( TIXML_OSTREAM * out ) const; - // [internal use] - // Set the document pointer so the attribute can report errors. - void SetDocument( TiXmlDocument* doc ) { document = doc; } - -private: - TiXmlAttribute( const TiXmlAttribute& ); // not implemented. - void operator=( const TiXmlAttribute& base ); // not allowed. - - TiXmlDocument* document; // A pointer back to a document, for error reporting. - TIXML_STRING name; - TIXML_STRING value; - TiXmlAttribute* prev; - TiXmlAttribute* next; -}; - - -/* A class used to manage a group of attributes. - It is only used internally, both by the ELEMENT and the DECLARATION. - - The set can be changed transparent to the Element and Declaration - classes that use it, but NOT transparent to the Attribute - which has to implement a next() and previous() method. Which makes - it a bit problematic and prevents the use of STL. - - This version is implemented with circular lists because: - - I like circular lists - - it demonstrates some independence from the (typical) doubly linked list. -*/ -class TiXmlAttributeSet -{ -public: - TiXmlAttributeSet(); - ~TiXmlAttributeSet(); - - void Add( TiXmlAttribute* attribute ); - void Remove( TiXmlAttribute* attribute ); - - const TiXmlAttribute* First() const { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } - TiXmlAttribute* First() { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } - const TiXmlAttribute* Last() const { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } - TiXmlAttribute* Last() { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } - - const TiXmlAttribute* Find( const char * name ) const; - TiXmlAttribute* Find( const char * name ); - -private: - //*ME: Because of hidden/disabled copy-construktor in TiXmlAttribute (sentinel-element), - //*ME: this class must be also use a hidden/disabled copy-constructor !!! - TiXmlAttributeSet( const TiXmlAttributeSet& ); // not allowed - void operator=( const TiXmlAttributeSet& ); // not allowed (as TiXmlAttribute) - - TiXmlAttribute sentinel; -}; - - -/** The element is a container class. It has a value, the element name, - and can contain other elements, text, comments, and unknowns. - Elements also contain an arbitrary number of attributes. -*/ -class TiXmlElement : public TiXmlNode -{ -public: - /// Construct an element. - TiXmlElement (const char * in_value); - - #ifdef TIXML_USE_STL - /// std::string constructor. - TiXmlElement( const std::string& _value ); - #endif - - TiXmlElement( const TiXmlElement& ); - - void operator=( const TiXmlElement& base ); - - virtual ~TiXmlElement(); - - /** Given an attribute name, Attribute() returns the value - for the attribute of that name, or null if none exists. - */ - const char* Attribute( const char* name ) const; - - /** Given an attribute name, Attribute() returns the value - for the attribute of that name, or null if none exists. - If the attribute exists and can be converted to an integer, - the integer value will be put in the return 'i', if 'i' - is non-null. - */ - const char* Attribute( const char* name, int* i ) const; - - /** Given an attribute name, Attribute() returns the value - for the attribute of that name, or null if none exists. - If the attribute exists and can be converted to an double, - the double value will be put in the return 'd', if 'd' - is non-null. - */ - const char* Attribute( const char* name, double* d ) const; - - /** QueryIntAttribute examines the attribute - it is an alternative to the - Attribute() method with richer error checking. - If the attribute is an integer, it is stored in 'value' and - the call returns TIXML_SUCCESS. If it is not - an integer, it returns TIXML_WRONG_TYPE. If the attribute - does not exist, then TIXML_NO_ATTRIBUTE is returned. - */ - - int QueryIntAttribute( const char* name, int* value ) const; - /// QueryDoubleAttribute examines the attribute - see QueryIntAttribute(). - int QueryDoubleAttribute( const char* name, double* value ) const; - /// QueryFloatAttribute examines the attribute - see QueryIntAttribute(). - int QueryDoubleAttribute( const char* name, float* value ) const { - double d; - int result = QueryDoubleAttribute( name, &d ); - *value = (float)d; - return result; - } - - /** Sets an attribute of name to a given value. The attribute - will be created if it does not exist, or changed if it does. - */ - void SetAttribute( const char* name, const char * value ); - - #ifdef TIXML_USE_STL - const char* Attribute( const std::string& name ) const { return Attribute( name.c_str() ); } - const char* Attribute( const std::string& name, int* i ) const { return Attribute( name.c_str(), i ); } - const char* Attribute( const std::string& name, double* d ) const { return Attribute( name.c_str(), d ); } - int QueryIntAttribute( const std::string& name, int* value ) const { return QueryIntAttribute( name.c_str(), value ); } - int QueryDoubleAttribute( const std::string& name, double* value ) const { return QueryDoubleAttribute( name.c_str(), value ); } - - /// STL std::string form. - void SetAttribute( const std::string& name, const std::string& _value ) - { - StringToBuffer n( name ); - StringToBuffer v( _value ); - if ( n.buffer && v.buffer ) - SetAttribute (n.buffer, v.buffer ); - } - ///< STL std::string form. - void SetAttribute( const std::string& name, int _value ) - { - StringToBuffer n( name ); - if ( n.buffer ) - SetAttribute (n.buffer, _value); - } - #endif - - /** Sets an attribute of name to a given value. The attribute - will be created if it does not exist, or changed if it does. - */ - void SetAttribute( const char * name, int value ); - - /** Sets an attribute of name to a given value. The attribute - will be created if it does not exist, or changed if it does. - */ - void SetDoubleAttribute( const char * name, double value ); - - /** Deletes an attribute with the given name. - */ - void RemoveAttribute( const char * name ); - #ifdef TIXML_USE_STL - void RemoveAttribute( const std::string& name ) { RemoveAttribute (name.c_str ()); } ///< STL std::string form. - #endif - - const TiXmlAttribute* FirstAttribute() const { return attributeSet.First(); } ///< Access the first attribute in this element. - TiXmlAttribute* FirstAttribute() { return attributeSet.First(); } - const TiXmlAttribute* LastAttribute() const { return attributeSet.Last(); } ///< Access the last attribute in this element. - TiXmlAttribute* LastAttribute() { return attributeSet.Last(); } - - /// Creates a new Element and returns it - the returned element is a copy. - virtual TiXmlNode* Clone() const; - // Print the Element to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - /* Attribtue parsing starts: next char past '<' - returns: next char past '>' - */ - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - -protected: - - void CopyTo( TiXmlElement* target ) const; - void ClearThis(); // like clear, but initializes 'this' object as well - - // Used to be public [internal use] - #ifdef TIXML_USE_STL - virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); - #endif - virtual void StreamOut( TIXML_OSTREAM * out ) const; - - /* [internal use] - Reads the "value" of the element -- another element, or text. - This should terminate with the current end tag. - */ - const char* ReadValue( const char* in, TiXmlParsingData* prevData, TiXmlEncoding encoding ); - -private: - - TiXmlAttributeSet attributeSet; -}; - - -/** An XML comment. -*/ -class TiXmlComment : public TiXmlNode -{ -public: - /// Constructs an empty comment. - TiXmlComment() : TiXmlNode( TiXmlNode::COMMENT ) {} - TiXmlComment( const TiXmlComment& ); - void operator=( const TiXmlComment& base ); - - virtual ~TiXmlComment() {} - - /// Returns a copy of this Comment. - virtual TiXmlNode* Clone() const; - /// Write this Comment to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - /* Attribtue parsing starts: at the ! of the !-- - returns: next char past '>' - */ - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - -protected: - void CopyTo( TiXmlComment* target ) const; - - // used to be public - #ifdef TIXML_USE_STL - virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); - #endif - virtual void StreamOut( TIXML_OSTREAM * out ) const; - -private: - -}; - - -/** XML text. Contained in an element. -*/ -class TiXmlText : public TiXmlNode -{ - friend class TiXmlElement; -public: - /// Constructor. - TiXmlText (const char * initValue) : TiXmlNode (TiXmlNode::TEXT) - { - SetValue( initValue ); - } - virtual ~TiXmlText() {} - - #ifdef TIXML_USE_STL - /// Constructor. - TiXmlText( const std::string& initValue ) : TiXmlNode (TiXmlNode::TEXT) - { - SetValue( initValue ); - } - #endif - - TiXmlText( const TiXmlText& copy ) : TiXmlNode( TiXmlNode::TEXT ) { copy.CopyTo( this ); } - void operator=( const TiXmlText& base ) { base.CopyTo( this ); } - - /// Write this text object to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - -protected : - /// [internal use] Creates a new Element and returns it. - virtual TiXmlNode* Clone() const; - void CopyTo( TiXmlText* target ) const; - - virtual void StreamOut ( TIXML_OSTREAM * out ) const; - bool Blank() const; // returns true if all white space and new lines - // [internal use] - #ifdef TIXML_USE_STL - virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); - #endif - -private: -}; - - -/** In correct XML the declaration is the first entry in the file. - @verbatim - - @endverbatim - - TinyXml will happily read or write files without a declaration, - however. There are 3 possible attributes to the declaration: - version, encoding, and standalone. - - Note: In this version of the code, the attributes are - handled as special cases, not generic attributes, simply - because there can only be at most 3 and they are always the same. -*/ -class TiXmlDeclaration : public TiXmlNode -{ -public: - /// Construct an empty declaration. - TiXmlDeclaration() : TiXmlNode( TiXmlNode::DECLARATION ) {} - -#ifdef TIXML_USE_STL - /// Constructor. - TiXmlDeclaration( const std::string& _version, - const std::string& _encoding, - const std::string& _standalone ); -#endif - - /// Construct. - TiXmlDeclaration( const char* _version, - const char* _encoding, - const char* _standalone ); - - TiXmlDeclaration( const TiXmlDeclaration& copy ); - void operator=( const TiXmlDeclaration& copy ); - - virtual ~TiXmlDeclaration() {} - - /// Version. Will return an empty string if none was found. - const char *Version() const { return version.c_str (); } - /// Encoding. Will return an empty string if none was found. - const char *Encoding() const { return encoding.c_str (); } - /// Is this a standalone document? - const char *Standalone() const { return standalone.c_str (); } - - /// Creates a copy of this Declaration and returns it. - virtual TiXmlNode* Clone() const; - /// Print this declaration to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - -protected: - void CopyTo( TiXmlDeclaration* target ) const; - // used to be public - #ifdef TIXML_USE_STL - virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); - #endif - virtual void StreamOut ( TIXML_OSTREAM * out) const; - -private: - - TIXML_STRING version; - TIXML_STRING encoding; - TIXML_STRING standalone; -}; - - -/** Any tag that tinyXml doesn't recognize is saved as an - unknown. It is a tag of text, but should not be modified. - It will be written back to the XML, unchanged, when the file - is saved. - - DTD tags get thrown into TiXmlUnknowns. -*/ -class TiXmlUnknown : public TiXmlNode -{ -public: - TiXmlUnknown() : TiXmlNode( TiXmlNode::UNKNOWN ) {} - virtual ~TiXmlUnknown() {} - - TiXmlUnknown( const TiXmlUnknown& copy ) : TiXmlNode( TiXmlNode::UNKNOWN ) { copy.CopyTo( this ); } - void operator=( const TiXmlUnknown& copy ) { copy.CopyTo( this ); } - - /// Creates a copy of this Unknown and returns it. - virtual TiXmlNode* Clone() const; - /// Print this Unknown to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - -protected: - void CopyTo( TiXmlUnknown* target ) const; - - #ifdef TIXML_USE_STL - virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); - #endif - virtual void StreamOut ( TIXML_OSTREAM * out ) const; - -private: - -}; - - -/** Always the top level node. A document binds together all the - XML pieces. It can be saved, loaded, and printed to the screen. - The 'value' of a document node is the xml file name. -*/ -class TiXmlDocument : public TiXmlNode -{ -public: - /// Create an empty document, that has no name. - TiXmlDocument(); - /// Create a document with a name. The name of the document is also the filename of the xml. - TiXmlDocument( const char * documentName ); - - #ifdef TIXML_USE_STL - /// Constructor. - TiXmlDocument( const std::string& documentName ); - #endif - - TiXmlDocument( const TiXmlDocument& copy ); - void operator=( const TiXmlDocument& copy ); - - virtual ~TiXmlDocument() {} - - /** Load a file using the current document value. - Returns true if successful. Will delete any existing - document data before loading. - */ - bool LoadFile( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); - /// Save a file using the current document value. Returns true if successful. - bool SaveFile() const; - /// Load a file using the given filename. Returns true if successful. - bool LoadFile( const char * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); - /// Save a file using the given filename. Returns true if successful. - bool SaveFile( const char * filename ) const; - - #ifdef TIXML_USE_STL - bool LoadFile( const std::string& filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ) ///< STL std::string version. - { - StringToBuffer f( filename ); - return ( f.buffer && LoadFile( f.buffer, encoding )); - } - bool SaveFile( const std::string& filename ) const ///< STL std::string version. - { - StringToBuffer f( filename ); - return ( f.buffer && SaveFile( f.buffer )); - } - #endif - - /** Parse the given null terminated block of xml data. Passing in an encoding to this - method (either TIXML_ENCODING_LEGACY or TIXML_ENCODING_UTF8 will force TinyXml - to use that encoding, regardless of what TinyXml might otherwise try to detect. - */ - virtual const char* Parse( const char* p, TiXmlParsingData* data = 0, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); - - /** Get the root element -- the only top level element -- of the document. - In well formed XML, there should only be one. TinyXml is tolerant of - multiple elements at the document level. - */ - const TiXmlElement* RootElement() const { return FirstChildElement(); } - TiXmlElement* RootElement() { return FirstChildElement(); } - - /** If an error occurs, Error will be set to true. Also, - - The ErrorId() will contain the integer identifier of the error (not generally useful) - - The ErrorDesc() method will return the name of the error. (very useful) - - The ErrorRow() and ErrorCol() will return the location of the error (if known) - */ - bool Error() const { return error; } - - /// Contains a textual (english) description of the error if one occurs. - const char * ErrorDesc() const { return errorDesc.c_str (); } - - /** Generally, you probably want the error string ( ErrorDesc() ). But if you - prefer the ErrorId, this function will fetch it. - */ - const int ErrorId() const { return errorId; } - - /** Returns the location (if known) of the error. The first column is column 1, - and the first row is row 1. A value of 0 means the row and column wasn't applicable - (memory errors, for example, have no row/column) or the parser lost the error. (An - error in the error reporting, in that case.) - - @sa SetTabSize, Row, Column - */ - int ErrorRow() { return errorLocation.row+1; } - int ErrorCol() { return errorLocation.col+1; } ///< The column where the error occured. See ErrorRow() - - /** By calling this method, with a tab size - greater than 0, the row and column of each node and attribute is stored - when the file is loaded. Very useful for tracking the DOM back in to - the source file. - - The tab size is required for calculating the location of nodes. If not - set, the default of 4 is used. The tabsize is set per document. Setting - the tabsize to 0 disables row/column tracking. - - Note that row and column tracking is not supported when using operator>>. - - The tab size needs to be enabled before the parse or load. Correct usage: - @verbatim - TiXmlDocument doc; - doc.SetTabSize( 8 ); - doc.Load( "myfile.xml" ); - @endverbatim - - @sa Row, Column - */ - void SetTabSize( int _tabsize ) { tabsize = _tabsize; } - - int TabSize() const { return tabsize; } - - /** If you have handled the error, it can be reset with this call. The error - state is automatically cleared if you Parse a new XML block. - */ - void ClearError() { error = false; - errorId = 0; - errorDesc = ""; - errorLocation.row = errorLocation.col = 0; - //errorLocation.last = 0; - } - - /** Dump the document to standard out. */ - void Print() const { Print( stdout, 0 ); } - - /// Print this Document to a FILE stream. - virtual void Print( FILE* cfile, int depth = 0 ) const; - // [internal use] - void SetError( int err, const char* errorLocation, TiXmlParsingData* prevData, TiXmlEncoding encoding ); - -protected : - virtual void StreamOut ( TIXML_OSTREAM * out) const; - // [internal use] - virtual TiXmlNode* Clone() const; - #ifdef TIXML_USE_STL - virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); - #endif - -private: - void CopyTo( TiXmlDocument* target ) const; - - bool error; - int errorId; - TIXML_STRING errorDesc; - int tabsize; - TiXmlCursor errorLocation; -}; - - -/** - A TiXmlHandle is a class that wraps a node pointer with null checks; this is - an incredibly useful thing. Note that TiXmlHandle is not part of the TinyXml - DOM structure. It is a separate utility class. - - Take an example: - @verbatim - - - - - - - @endverbatim - - Assuming you want the value of "attributeB" in the 2nd "Child" element, it's very - easy to write a *lot* of code that looks like: - - @verbatim - TiXmlElement* root = document.FirstChildElement( "Document" ); - if ( root ) - { - TiXmlElement* element = root->FirstChildElement( "Element" ); - if ( element ) - { - TiXmlElement* child = element->FirstChildElement( "Child" ); - if ( child ) - { - TiXmlElement* child2 = child->NextSiblingElement( "Child" ); - if ( child2 ) - { - // Finally do something useful. - @endverbatim - - And that doesn't even cover "else" cases. TiXmlHandle addresses the verbosity - of such code. A TiXmlHandle checks for null pointers so it is perfectly safe - and correct to use: - - @verbatim - TiXmlHandle docHandle( &document ); - TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).Element(); - if ( child2 ) - { - // do something useful - @endverbatim - - Which is MUCH more concise and useful. - - It is also safe to copy handles - internally they are nothing more than node pointers. - @verbatim - TiXmlHandle handleCopy = handle; - @endverbatim - - What they should not be used for is iteration: - - @verbatim - int i=0; - while ( true ) - { - TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", i ).Element(); - if ( !child ) - break; - // do something - ++i; - } - @endverbatim - - It seems reasonable, but it is in fact two embedded while loops. The Child method is - a linear walk to find the element, so this code would iterate much more than it needs - to. Instead, prefer: - - @verbatim - TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).FirstChild( "Child" ).Element(); - - for( child; child; child=child->NextSiblingElement() ) - { - // do something - } - @endverbatim -*/ -class TiXmlHandle -{ -public: - /// Create a handle from any node (at any depth of the tree.) This can be a null pointer. - TiXmlHandle( TiXmlNode* node ) { this->node = node; } - /// Copy constructor - TiXmlHandle( const TiXmlHandle& ref ) { this->node = ref.node; } - TiXmlHandle operator=( const TiXmlHandle& ref ) { this->node = ref.node; return *this; } - - /// Return a handle to the first child node. - TiXmlHandle FirstChild() const; - /// Return a handle to the first child node with the given name. - TiXmlHandle FirstChild( const char * value ) const; - /// Return a handle to the first child element. - TiXmlHandle FirstChildElement() const; - /// Return a handle to the first child element with the given name. - TiXmlHandle FirstChildElement( const char * value ) const; - - /** Return a handle to the "index" child with the given name. - The first child is 0, the second 1, etc. - */ - TiXmlHandle Child( const char* value, int index ) const; - /** Return a handle to the "index" child. - The first child is 0, the second 1, etc. - */ - TiXmlHandle Child( int index ) const; - /** Return a handle to the "index" child element with the given name. - The first child element is 0, the second 1, etc. Note that only TiXmlElements - are indexed: other types are not counted. - */ - TiXmlHandle ChildElement( const char* value, int index ) const; - /** Return a handle to the "index" child element. - The first child element is 0, the second 1, etc. Note that only TiXmlElements - are indexed: other types are not counted. - */ - TiXmlHandle ChildElement( int index ) const; - - #ifdef TIXML_USE_STL - TiXmlHandle FirstChild( const std::string& _value ) const { return FirstChild( _value.c_str() ); } - TiXmlHandle FirstChildElement( const std::string& _value ) const { return FirstChildElement( _value.c_str() ); } - - TiXmlHandle Child( const std::string& _value, int index ) const { return Child( _value.c_str(), index ); } - TiXmlHandle ChildElement( const std::string& _value, int index ) const { return ChildElement( _value.c_str(), index ); } - #endif - - /// Return the handle as a TiXmlNode. This may return null. - TiXmlNode* Node() const { return node; } - /// Return the handle as a TiXmlElement. This may return null. - TiXmlElement* Element() const { return ( ( node && node->ToElement() ) ? node->ToElement() : 0 ); } - /// Return the handle as a TiXmlText. This may return null. - TiXmlText* Text() const { return ( ( node && node->ToText() ) ? node->ToText() : 0 ); } - /// Return the handle as a TiXmlUnknown. This may return null; - TiXmlUnknown* Unknown() const { return ( ( node && node->ToUnknown() ) ? node->ToUnknown() : 0 ); } - -private: - TiXmlNode* node; -}; - -#ifdef _MSC_VER -#pragma warning( default : 4530 ) -#pragma warning( default : 4786 ) -#endif - -#endif diff --git a/uppdev/YPuzzle/TinyXML/tinyxmlerror.cpp b/uppdev/YPuzzle/TinyXML/tinyxmlerror.cpp deleted file mode 100644 index 845c45c3b..000000000 --- a/uppdev/YPuzzle/TinyXML/tinyxmlerror.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/* -www.sourceforge.net/projects/tinyxml -Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com) - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. -*/ - -#include "tinyxml.h" - -// The goal of the seperate error file is to make the first -// step towards localization. tinyxml (currently) only supports -// latin-1, but at least the error messages could now be translated. -// -// It also cleans up the code a bit. -// - -const char* TiXmlBase::errorString[ TIXML_ERROR_STRING_COUNT ] = -{ - "No error", - "Error", - "Failed to open file", - "Memory allocation failed.", - "Error parsing Element.", - "Failed to read Element name", - "Error reading Element value.", - "Error reading Attributes.", - "Error: empty tag.", - "Error reading end tag.", - "Error parsing Unknown.", - "Error parsing Comment.", - "Error parsing Declaration.", - "Error document empty.", - "Error null (0) or unexpected EOF found in input stream.", -}; diff --git a/uppdev/YPuzzle/TinyXML/tinyxmlparser.cpp b/uppdev/YPuzzle/TinyXML/tinyxmlparser.cpp deleted file mode 100644 index c1a144fc9..000000000 --- a/uppdev/YPuzzle/TinyXML/tinyxmlparser.cpp +++ /dev/null @@ -1,1507 +0,0 @@ -/* -www.sourceforge.net/projects/tinyxml -Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com) - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. -*/ - -#include "tinyxml.h" -#include -#include - -//#define DEBUG_PARSER - -// Note tha "PutString" hardcodes the same list. This -// is less flexible than it appears. Changing the entries -// or order will break putstring. -TiXmlBase::Entity TiXmlBase::entity[ NUM_ENTITY ] = -{ - { "&", 5, '&' }, - { "<", 4, '<' }, - { ">", 4, '>' }, - { """, 6, '\"' }, - { "'", 6, '\'' } -}; - -// Bunch of unicode info at: -// http://www.unicode.org/faq/utf_bom.html -// Including the basic of this table, which determines the #bytes in the -// sequence from the lead byte. 1 placed for invalid sequences -- -// although the result will be junk, pass it through as much as possible. -// Beware of the non-characters in UTF-8: -// ef bb bf (Microsoft "lead bytes") -// ef bf be -// ef bf bf - -const unsigned char TIXML_UTF_LEAD_0 = 0xefU; -const unsigned char TIXML_UTF_LEAD_1 = 0xbbU; -const unsigned char TIXML_UTF_LEAD_2 = 0xbfU; - -const int TiXmlBase::utf8ByteTable[256] = -{ - // 0 1 2 3 4 5 6 7 8 9 a b c d e f - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x00 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x10 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x20 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x30 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x40 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x50 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x60 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x70 End of ASCII range - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x80 0x80 to 0xc1 invalid - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x90 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xa0 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xb0 - 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xc0 0xc2 to 0xdf 2 byte - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xd0 - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 0xe0 0xe0 to 0xef 3 byte - 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // 0xf0 0xf0 to 0xf4 4 byte, 0xf5 and higher invalid -}; - - -void TiXmlBase::ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ) -{ - const unsigned long BYTE_MASK = 0xBF; - const unsigned long BYTE_MARK = 0x80; - const unsigned long FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; - - if (input < 0x80) - *length = 1; - else if ( input < 0x800 ) - *length = 2; - else if ( input < 0x10000 ) - *length = 3; - else if ( input < 0x200000 ) - *length = 4; - else - { *length = 0; return; } // This code won't covert this correctly anyway. - - output += *length; - - // Scary scary fall throughs. - switch (*length) - { - case 4: - --output; - *output = (char)((input | BYTE_MARK) & BYTE_MASK); - input >>= 6; - case 3: - --output; - *output = (char)((input | BYTE_MARK) & BYTE_MASK); - input >>= 6; - case 2: - --output; - *output = (char)((input | BYTE_MARK) & BYTE_MASK); - input >>= 6; - case 1: - --output; - *output = (char)(input | FIRST_BYTE_MARK[*length]); - } -} - - -/*static*/ int TiXmlBase::IsAlpha( unsigned char anyByte, TiXmlEncoding /*encoding*/ ) -{ - // This will only work for low-ascii, everything else is assumed to be a valid - // letter. I'm not sure this is the best approach, but it is quite tricky trying - // to figure out alhabetical vs. not across encoding. So take a very - // conservative approach. - -// if ( encoding == TIXML_ENCODING_UTF8 ) -// { - if ( anyByte < 127 ) - return isalpha( anyByte ); - else - return 1; // What else to do? The unicode set is huge...get the english ones right. -// } -// else -// { -// return isalpha( anyByte ); -// } -} - - -/*static*/ int TiXmlBase::IsAlphaNum( unsigned char anyByte, TiXmlEncoding /*encoding*/ ) -{ - // This will only work for low-ascii, everything else is assumed to be a valid - // letter. I'm not sure this is the best approach, but it is quite tricky trying - // to figure out alhabetical vs. not across encoding. So take a very - // conservative approach. - -// if ( encoding == TIXML_ENCODING_UTF8 ) -// { - if ( anyByte < 127 ) - return isalnum( anyByte ); - else - return 1; // What else to do? The unicode set is huge...get the english ones right. -// } -// else -// { -// return isalnum( anyByte ); -// } -} - - -class TiXmlParsingData -{ - friend class TiXmlDocument; - public: - void Stamp( const char* now, TiXmlEncoding encoding ); - - const TiXmlCursor& Cursor() { return cursor; } - - private: - // Only used by the document! - TiXmlParsingData( const char* start, int _tabsize, int row, int col ) - { - assert( start ); - stamp = start; - tabsize = _tabsize; - cursor.row = row; - cursor.col = col; - } - - TiXmlCursor cursor; - const char* stamp; - int tabsize; -}; - - -void TiXmlParsingData::Stamp( const char* now, TiXmlEncoding encoding ) -{ - assert( now ); - - // Do nothing if the tabsize is 0. - if ( tabsize < 1 ) - { - return; - } - - // Get the current row, column. - int row = cursor.row; - int col = cursor.col; - const char* p = stamp; - assert( p ); - - while ( p < now ) - { - // Treat p as unsigned, so we have a happy compiler. - const unsigned char* pU = (const unsigned char*)p; - - // Code contributed by Fletcher Dunn: (modified by lee) - switch (*pU) { - case 0: - // We *should* never get here, but in case we do, don't - // advance past the terminating null character, ever - return; - - case '\r': - // bump down to the next line - ++row; - col = 0; - // Eat the character - ++p; - - // Check for \r\n sequence, and treat this as a single character - if (*p == '\n') { - ++p; - } - break; - - case '\n': - // bump down to the next line - ++row; - col = 0; - - // Eat the character - ++p; - - // Check for \n\r sequence, and treat this as a single - // character. (Yes, this bizarre thing does occur still - // on some arcane platforms...) - if (*p == '\r') { - ++p; - } - break; - - case '\t': - // Eat the character - ++p; - - // Skip to next tab stop - col = (col / tabsize + 1) * tabsize; - break; - - case TIXML_UTF_LEAD_0: - if ( encoding == TIXML_ENCODING_UTF8 ) - { - if ( *(p+1) && *(p+2) ) - { - // In these cases, don't advance the column. These are - // 0-width spaces. - if ( *(pU+1)==TIXML_UTF_LEAD_1 && *(pU+2)==TIXML_UTF_LEAD_2 ) - p += 3; - else if ( *(pU+1)==0xbfU && *(pU+2)==0xbeU ) - p += 3; - else if ( *(pU+1)==0xbfU && *(pU+2)==0xbfU ) - p += 3; - else - { p +=3; ++col; } // A normal character. - } - } - else - { - ++p; - ++col; - } - break; - - default: - if ( encoding == TIXML_ENCODING_UTF8 ) - { - // Eat the 1 to 4 byte utf8 character. - int step = TiXmlBase::utf8ByteTable[*((unsigned char*)p)]; - if ( step == 0 ) - step = 1; // Error case from bad encoding, but handle gracefully. - p += step; - - // Just advance one column, of course. - ++col; - } - else - { - ++p; - ++col; - } - break; - } - } - cursor.row = row; - cursor.col = col; - assert( cursor.row >= -1 ); - assert( cursor.col >= -1 ); - stamp = p; - assert( stamp ); -} - - -const char* TiXmlBase::SkipWhiteSpace( const char* p, TiXmlEncoding encoding ) -{ - if ( !p || !*p ) - { - return 0; - } - if ( encoding == TIXML_ENCODING_UTF8 ) - { - while ( *p ) - { - const unsigned char* pU = (const unsigned char*)p; - - // Skip the stupid Microsoft UTF-8 Byte order marks - if ( *(pU+0)==TIXML_UTF_LEAD_0 - && *(pU+1)==TIXML_UTF_LEAD_1 - && *(pU+2)==TIXML_UTF_LEAD_2 ) - { - p += 3; - continue; - } - else if(*(pU+0)==TIXML_UTF_LEAD_0 - && *(pU+1)==0xbfU - && *(pU+2)==0xbeU ) - { - p += 3; - continue; - } - else if(*(pU+0)==TIXML_UTF_LEAD_0 - && *(pU+1)==0xbfU - && *(pU+2)==0xbfU ) - { - p += 3; - continue; - } - - if ( IsWhiteSpace( *p ) || *p == '\n' || *p =='\r' ) // Still using old rules for white space. - ++p; - else - break; - } - } - else - { - while ( *p && IsWhiteSpace( *p ) || *p == '\n' || *p =='\r' ) - ++p; - } - - return p; -} - -#ifdef TIXML_USE_STL -/*static*/ bool TiXmlBase::StreamWhiteSpace( TIXML_ISTREAM * in, TIXML_STRING * tag ) -{ - for( ;; ) - { - if ( !in->good() ) return false; - - int c = in->peek(); - // At this scope, we can't get to a document. So fail silently. - if ( !IsWhiteSpace( c ) || c <= 0 ) - return true; - - *tag += (char) in->get(); - } -} - -/*static*/ bool TiXmlBase::StreamTo( TIXML_ISTREAM * in, int character, TIXML_STRING * tag ) -{ - //assert( character > 0 && character < 128 ); // else it won't work in utf-8 - while ( in->good() ) - { - int c = in->peek(); - if ( c == character ) - return true; - if ( c <= 0 ) // Silent failure: can't get document at this scope - return false; - - in->get(); - *tag += (char) c; - } - return false; -} -#endif - -const char* TiXmlBase::ReadName( const char* p, TIXML_STRING * name, TiXmlEncoding encoding ) -{ - *name = ""; - assert( p ); - - // Names start with letters or underscores. - // Of course, in unicode, tinyxml has no idea what a letter *is*. The - // algorithm is generous. - // - // After that, they can be letters, underscores, numbers, - // hyphens, or colons. (Colons are valid ony for namespaces, - // but tinyxml can't tell namespaces from names.) - if ( p && *p - && ( IsAlpha( (unsigned char) *p, encoding ) || *p == '_' ) ) - { - while( p && *p - && ( IsAlphaNum( (unsigned char ) *p, encoding ) - || *p == '_' - || *p == '-' - || *p == '.' - || *p == ':' ) ) - { - (*name) += *p; - ++p; - } - return p; - } - return 0; -} - -const char* TiXmlBase::GetEntity( const char* p, char* value, int* length, TiXmlEncoding encoding ) -{ - // Presume an entity, and pull it out. - TIXML_STRING ent; - int i; - *length = 0; - - if ( *(p+1) && *(p+1) == '#' && *(p+2) ) - { - unsigned long ucs = 0; - ptrdiff_t delta = 0; - unsigned mult = 1; - - if ( *(p+2) == 'x' ) - { - // Hexadecimal. - if ( !*(p+3) ) return 0; - - const char* q = p+3; - q = strchr( q, ';' ); - - if ( !q || !*q ) return 0; - - delta = q-p; - --q; - - while ( *q != 'x' ) - { - if ( *q >= '0' && *q <= '9' ) - ucs += mult * (*q - '0'); - else if ( *q >= 'a' && *q <= 'f' ) - ucs += mult * (*q - 'a' + 10); - else if ( *q >= 'A' && *q <= 'F' ) - ucs += mult * (*q - 'A' + 10 ); - else - return 0; - mult *= 16; - --q; - } - } - else - { - // Decimal. - if ( !*(p+2) ) return 0; - - const char* q = p+2; - q = strchr( q, ';' ); - - if ( !q || !*q ) return 0; - - delta = q-p; - --q; - - while ( *q != '#' ) - { - if ( *q >= '0' && *q <= '9' ) - ucs += mult * (*q - '0'); - else - return 0; - mult *= 10; - --q; - } - } - if ( encoding == TIXML_ENCODING_UTF8 ) - { - // convert the UCS to UTF-8 - ConvertUTF32ToUTF8( ucs, value, length ); - } - else - { - *value = (char)ucs; - *length = 1; - } - return p + delta + 1; - } - - // Now try to match it. - for( i=0; iappend( cArr, len ); - } - } - else - { - bool whitespace = false; - - // Remove leading white space: - p = SkipWhiteSpace( p, encoding ); - while ( p && *p - && !StringEqual( p, endTag, caseInsensitive, encoding ) ) - { - if ( *p == '\r' || *p == '\n' ) - { - whitespace = true; - ++p; - } - else if ( IsWhiteSpace( *p ) ) - { - whitespace = true; - ++p; - } - else - { - // If we've found whitespace, add it before the - // new character. Any whitespace just becomes a space. - if ( whitespace ) - { - (*text) += ' '; - whitespace = false; - } - int len; - char cArr[4] = { 0, 0, 0, 0 }; - p = GetChar( p, cArr, &len, encoding ); - if ( len == 1 ) - (*text) += cArr[0]; // more efficient - else - text->append( cArr, len ); - } - } - } - return p + strlen( endTag ); -} - -#ifdef TIXML_USE_STL - -void TiXmlDocument::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ) -{ - // The basic issue with a document is that we don't know what we're - // streaming. Read something presumed to be a tag (and hope), then - // identify it, and call the appropriate stream method on the tag. - // - // This "pre-streaming" will never read the closing ">" so the - // sub-tag can orient itself. - - if ( !StreamTo( in, '<', tag ) ) - { - SetError( TIXML_ERROR_PARSING_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); - return; - } - - while ( in->good() ) - { - int tagIndex = (int) tag->length(); - while ( in->good() && in->peek() != '>' ) - { - int c = in->get(); - if ( c <= 0 ) - { - SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); - break; - } - (*tag) += (char) c; - } - - if ( in->good() ) - { - // We now have something we presume to be a node of - // some sort. Identify it, and call the node to - // continue streaming. - TiXmlNode* node = Identify( tag->c_str() + tagIndex, TIXML_DEFAULT_ENCODING ); - - if ( node ) - { - node->StreamIn( in, tag ); - bool isElement = node->ToElement() != 0; - delete node; - node = 0; - - // If this is the root element, we're done. Parsing will be - // done by the >> operator. - if ( isElement ) - { - return; - } - } - else - { - SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN ); - return; - } - } - } - // We should have returned sooner. - SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN ); -} - -#endif - -const char* TiXmlDocument::Parse( const char* p, TiXmlParsingData* prevData, TiXmlEncoding encoding ) -{ - ClearError(); - - // Parse away, at the document level. Since a document - // contains nothing but other tags, most of what happens - // here is skipping white space. - if ( !p || !*p ) - { - SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); - return 0; - } - - // Note that, for a document, this needs to come - // before the while space skip, so that parsing - // starts from the pointer we are given. - location.Clear(); - if ( prevData ) - { - location.row = prevData->cursor.row; - location.col = prevData->cursor.col; - } - else - { - location.row = 0; - location.col = 0; - } - TiXmlParsingData data( p, TabSize(), location.row, location.col ); - location = data.Cursor(); - - if ( encoding == TIXML_ENCODING_UNKNOWN ) - { - // Check for the Microsoft UTF-8 lead bytes. - const unsigned char* pU = (const unsigned char*)p; - if ( *(pU+0) && *(pU+0) == TIXML_UTF_LEAD_0 - && *(pU+1) && *(pU+1) == TIXML_UTF_LEAD_1 - && *(pU+2) && *(pU+2) == TIXML_UTF_LEAD_2 ) - { - encoding = TIXML_ENCODING_UTF8; - } - } - - p = SkipWhiteSpace( p, encoding ); - if ( !p ) - { - SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); - return 0; - } - - while ( p && *p ) - { - TiXmlNode* node = Identify( p, encoding ); - if ( node ) - { - p = node->Parse( p, &data, encoding ); - LinkEndChild( node ); - } - else - { - break; - } - - // Did we get encoding info? - if ( encoding == TIXML_ENCODING_UNKNOWN - && node->ToDeclaration() ) - { - TiXmlDeclaration* dec = node->ToDeclaration(); - const char* enc = dec->Encoding(); - assert( enc ); - - if ( *enc == 0 ) - encoding = TIXML_ENCODING_UTF8; - else if ( StringEqual( enc, "UTF-8", true, TIXML_ENCODING_UNKNOWN ) ) - encoding = TIXML_ENCODING_UTF8; - else if ( StringEqual( enc, "UTF8", true, TIXML_ENCODING_UNKNOWN ) ) - encoding = TIXML_ENCODING_UTF8; // incorrect, but be nice - else - encoding = TIXML_ENCODING_LEGACY; - } - - p = SkipWhiteSpace( p, encoding ); - } - - // Was this empty? - if ( !firstChild ) { - SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, encoding ); - return 0; - } - - // All is well. - return p; -} - -void TiXmlDocument::SetError( int err, const char* pError, TiXmlParsingData* data, TiXmlEncoding encoding ) -{ - // The first error in a chain is more accurate - don't set again! - if ( error ) - return; - - assert( err > 0 && err < TIXML_ERROR_STRING_COUNT ); - error = true; - errorId = err; - errorDesc = errorString[ errorId ]; - - errorLocation.Clear(); - if ( pError && data ) - { - //TiXmlParsingData data( pError, prevData ); - data->Stamp( pError, encoding ); - errorLocation = data->Cursor(); - } -} - - -TiXmlNode* TiXmlNode::Identify( const char* p, TiXmlEncoding encoding ) -{ - TiXmlNode* returnNode = 0; - - p = SkipWhiteSpace( p, encoding ); - if( !p || !*p || *p != '<' ) - { - return 0; - } - - TiXmlDocument* doc = GetDocument(); - p = SkipWhiteSpace( p, encoding ); - - if ( !p || !*p ) - { - return 0; - } - - // What is this thing? - // - Elements start with a letter or underscore, but xml is reserved. - // - Comments: "; - - if ( !StringEqual( p, startTag, false, encoding ) ) - { - document->SetError( TIXML_ERROR_PARSING_COMMENT, p, data, encoding ); - return 0; - } - p += strlen( startTag ); - p = ReadText( p, &value, false, endTag, false, encoding ); - return p; -} - - -const char* TiXmlAttribute::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ) -{ - p = SkipWhiteSpace( p, encoding ); - if ( !p || !*p ) return 0; - - int tabsize = 4; - if ( document ) - tabsize = document->TabSize(); - -// TiXmlParsingData data( p, prevData ); - if ( data ) - { - data->Stamp( p, encoding ); - location = data->Cursor(); - } - // Read the name, the '=' and the value. - const char* pErr = p; - p = ReadName( p, &name, encoding ); - if ( !p || !*p ) - { - if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, pErr, data, encoding ); - return 0; - } - p = SkipWhiteSpace( p, encoding ); - if ( !p || !*p || *p != '=' ) - { - if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); - return 0; - } - - ++p; // skip '=' - p = SkipWhiteSpace( p, encoding ); - if ( !p || !*p ) - { - if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); - return 0; - } - - const char* end; - - if ( *p == '\'' ) - { - ++p; - end = "\'"; - p = ReadText( p, &value, false, end, false, encoding ); - } - else if ( *p == '"' ) - { - ++p; - end = "\""; - p = ReadText( p, &value, false, end, false, encoding ); - } - else - { - // All attribute values should be in single or double quotes. - // But this is such a common error that the parser will try - // its best, even without them. - value = ""; - while ( p && *p // existence - && !IsWhiteSpace( *p ) && *p != '\n' && *p != '\r' // whitespace - && *p != '/' && *p != '>' ) // tag end - { - value += *p; - ++p; - } - } - return p; -} - -#ifdef TIXML_USE_STL -void TiXmlText::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ) -{ - while ( in->good() ) - { - int c = in->peek(); - if ( c == '<' ) - return; - if ( c <= 0 ) - { - TiXmlDocument* document = GetDocument(); - if ( document ) - document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); - return; - } - - (*tag) += (char) c; - in->get(); - } -} -#endif - -const char* TiXmlText::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ) -{ - value = ""; -// TiXmlParsingData data( p, prevData ); - if ( data ) - { - data->Stamp( p, encoding ); - location = data->Cursor(); - } - bool ignoreWhite = true; - - const char* end = "<"; - p = ReadText( p, &value, ignoreWhite, end, false, encoding ); - if ( p ) - return p-1; // don't truncate the '<' - return 0; -} - -#ifdef TIXML_USE_STL -void TiXmlDeclaration::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ) -{ - while ( in->good() ) - { - int c = in->get(); - if ( c <= 0 ) - { - TiXmlDocument* document = GetDocument(); - if ( document ) - document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); - return; - } - (*tag) += (char) c; - - if ( c == '>' ) - { - // All is well. - return; - } - } -} -#endif - -const char* TiXmlDeclaration::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding _encoding ) -{ - p = SkipWhiteSpace( p, _encoding ); - // Find the beginning, find the end, and look for - // the stuff in-between. - TiXmlDocument* document = GetDocument(); - if ( !p || !*p || !StringEqual( p, "SetError( TIXML_ERROR_PARSING_DECLARATION, 0, 0, _encoding ); - return 0; - } -// TiXmlParsingData data( p, prevData ); - if ( data ) - { - data->Stamp( p, _encoding ); - location = data->Cursor(); - } - p += 5; - - version = ""; - encoding = ""; - standalone = ""; - - while ( p && *p ) - { - if ( *p == '>' ) - { - ++p; - return p; - } - - p = SkipWhiteSpace( p, _encoding ); - if ( StringEqual( p, "version", true, _encoding ) ) - { - TiXmlAttribute attrib; - p = attrib.Parse( p, data, _encoding ); - version = attrib.Value(); - } - else if ( StringEqual( p, "encoding", true, _encoding ) ) - { - TiXmlAttribute attrib; - p = attrib.Parse( p, data, _encoding ); - encoding = attrib.Value(); - } - else if ( StringEqual( p, "standalone", true, _encoding ) ) - { - TiXmlAttribute attrib; - p = attrib.Parse( p, data, _encoding ); - standalone = attrib.Value(); - } - else - { - // Read over whatever it is. - while( p && *p && *p != '>' && !IsWhiteSpace( *p ) ) - ++p; - } - } - return 0; -} - -bool TiXmlText::Blank() const -{ - for ( unsigned i=0; i - -#define LAYOUTFILE -#include - -#include -#include - -using namespace std; - -class YPuzzle; - -#define IMAGEFILE -#include - -class CYPuzzleCell : public Label -{ -public: - int m_iID; - int m_iCurID; - - YPuzzle *m_pParent; - - CYPuzzleCell(int, YPuzzle*); - void Paint(Draw&); - void LeftDown(Point, dword); -}; - -class YPuzzle : public TopWindow { -public: - - typedef YPuzzle CLASSNAME; - YPuzzle(); - ~YPuzzle(); - - void Paint(Draw&); - bool Key(dword key, int count); - - void Process(int iIndex); - void ShuffleVector(); - void ArrangeButtons(vector &viShuffle); - void BuildMatrix(int, int, int); - void CheckAndFixParity(vector &viShuffledVector); - void OnOptions(); - -protected: - Label m_StatusBar; - - int m_iCellSize; - int m_iNumberOfCellsX, m_iNumberOfCellsY; - int m_iMaxNumberOfCells; - vector m_Cells; - vector m_viShuffle; - int m_iCurEmptyID; - int m_iNumberOfMoves, m_iBestNumberOfMoves; - int m_iLanguage; - String m_sConfigFilePath; - map m_msiScores; - - Button m_Options; -}; - -#endif diff --git a/uppdev/YPuzzle/YPuzzle.ico b/uppdev/YPuzzle/YPuzzle.ico deleted file mode 100644 index b594c016b..000000000 Binary files a/uppdev/YPuzzle/YPuzzle.ico and /dev/null differ diff --git a/uppdev/YPuzzle/YPuzzle.iml b/uppdev/YPuzzle/YPuzzle.iml deleted file mode 100644 index 9c3ddb6ef..000000000 --- a/uppdev/YPuzzle/YPuzzle.iml +++ /dev/null @@ -1,84 +0,0 @@ -IMAGE_BEGIN(backimage) - IMAGE_SCAN("\3~kpt|\4ÕėƛȟˣΨˣȟ\4ƛėÕ|\2tp") - IMAGE_SCAN("\2pt|\2Õƛ\1ȟˣ\1ΨϪѯϪ\1Ψˣ\1ȟƛ\2Õ|\1t") - IMAGE_SCAN("\1t|\4ėƛȟˣ\2ΨϪѯ\1үԳ\1үѯ\2ϪΨˣ\4ȟƛė|") - IMAGE_SCAN("|\12ėƛȟˣΨϪѯүԳֶ\13ԳүѯϪΨˣȟƛė|") - IMAGE_SCAN("\12|ÕƛȟˣΨϪѯԳֶ\2غٽۿ\2ٽغֶ\11ԳѯϪΨˣȟƛÕ") - IMAGE_SCAN("\10ÕƛȟˣΨϪүֶ\1ٽۿ\1úŽ\1úۿ\1ٽֶ\7үϪΨˣȟƛÕ") - IMAGE_SCAN("\7ėƛˣΨϪүֶ\2ٽۿŽńŽ\2ۿٽֶ\6үϪΨˣƛė") - IMAGE_SCAN("\6ÕƛȟˣϪѯֶ\2ٽۿŽ\1Ň\1łŽ\2ۿٽֶ\5ѯϪˣȟƛ") - IMAGE_SCAN("\11ėȟˣΨѯԳֶٽۿŽ\2ȇ\2łŽ\10ۿٽֶԳѯΨˣȟ") - IMAGE_SCAN("\10ƛȟˣϪүֶٽۿŽ\1Ȃ\2׃\2Ԃ\1ȂŽ\7ۿٽֶүϪˣȟ") - IMAGE_SCAN("\7ƛˣΨѯԳֶۿŽ\1ł\2؅\2Ԃ\1łŽ\6ۿֶԳѯΨˣ") - IMAGE_SCAN("\17ȟˣϪүֶغۿŽ\16ŽۿغֶѯϪˣ") - IMAGE_SCAN(" ȟˣϪүֶٽúŽŽúٽֶүϪˣ") - IMAGE_SCAN("\6ȟΨϪԳֶۿŽ\6\1\6ȂŽ\5ۿֶԳϪΨ") - IMAGE_SCAN("\17ɡΨѯԳֶۿŽ\16ŽۿֶԳѯΨ") - IMAGE_SCAN(" ɡΨѯԳֶۿŽ\377\377\377ŽۿֶԳѯΨ") - IMAGE_SCAN("\17ɡΨѯԳֶۿŽ\16ŽۿֶԳѯΨ") - IMAGE_SCAN("\6ȟΨϪԳֶۿŽ\6\1\6ȂŽ\5ۿֶԳϪΨ") - IMAGE_SCAN(" ȟˣϪүֶٽúŽŽúٽֶүϪˣ") - IMAGE_SCAN("\17ȟˣϪүֶغۿŽ\16ŽۿغֶѯϪˣ") - IMAGE_SCAN("\7ƛˣΨѯԳֶۿŽ\1ł\2؅\2Ԃ\1łŽ\6ۿֶԳѯΨˣ") - IMAGE_SCAN("\10ƛȟˣϪүֶٽۿŽ\1Ȃ\2׃\2Ԃ\1ȂŽ\7ۿٽֶүϪˣȟ") - IMAGE_SCAN("\11ėȟˣΨѯԳֶٽۿŽ\2ȇ\2łŽ\10ۿٽֶԳѯΨˣȟ") - IMAGE_SCAN("\6ÕƛȟˣϪүֶ\2ٽۿŽ\1Ň\1łŽ\2ۿٽֶ\5ѯϪˣȟƛ") - IMAGE_SCAN("\7ėƛˣΨϪүֶ\2ٽۿŽńŽ\2ۿٽֶ\6үϪΨˣƛė") - IMAGE_SCAN("\10ÕƛȟˣΨϪүֶ\1ٽۿ\1úŽ\1úۿ\1ٽֶ\7үϪΨˣȟƛÕ") - IMAGE_SCAN("\12|ÕƛȟˣΨϪүԳֶ\2غٽۿ\2ٽغֶ\11ԳѯϪΨˣȟƛÕ") - IMAGE_SCAN("|\12ėƛȟˣΨϪѯүԳֶ\13ԳүѯϪΨˣȟƛė|") - IMAGE_SCAN("\1t|\4ėƛȟˣ\3ΨϪѯүԳү\3ѯϪΨˣ\4ȟƛė|") - IMAGE_SCAN("\2pt|\2Õƛ\1ȟˣ\1ΨϪѯϪ\1Ψˣ\1ȟƛ\2Õ|\1t") - IMAGE_SCAN("\3~kpt|\4ÕėƛȟˣΨˣȟ\4ƛėÕ|\2tp") - IMAGE_SCAN("\4yf~kpt|\2Õėƛȟɡȟƛ\2ėÕ|\3tp~k") -IMAGE_PACKED(backimage, "\2 \0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(smallicon) - IMAGE_SCAN("\7~kt|ÕƛȟˣΨ\6ˣȟƛÕ|t") - IMAGE_SCAN("\7t|ėȟˣϪүԳ\6үϪˣȟė|") - IMAGE_SCAN("\7|ÕȟΨүֶغۿ\6غֶѯΨȟÕ") - IMAGE_SCAN("\6ƛΨүֶۿŽ\1łŽ\5ۿֶүΨƛ") - IMAGE_SCAN("\7ėˣѯֶۿŽȃ\6Žۿֶѯˣ") - IMAGE_SCAN("\5ƛΨԳۿŽ\0\0\0\1݃\0\0\0\4ŽۿԳΨ") - IMAGE_SCAN("\4ȟϪֶú\0\0\0\3úֶϪ") - IMAGE_SCAN("\20ɡѯֶŽ\0\0\0\0\0\0\0\0\0Žֶѯ") - IMAGE_SCAN("\20ɡѯֶŽ\0\0\0\0\0\0\0\0\0Žֶѯ") - IMAGE_SCAN("\20ȟϪֶú\0\0\0\0\0\0\0\0\0úֶϪ") - IMAGE_SCAN("\4ƛΨԳۿ\0\0\0\3ۿԳΨ") - IMAGE_SCAN("\5ėˣѯֶۿ\0\0\0\1σ\0\0\0\4ۿֶѯˣ") - IMAGE_SCAN("\6ƛΨүֶۿŽ\1łŽ\5ۿֶүΨƛ") - IMAGE_SCAN("\7|ÕȟΨѯֶغۿ\6غֶѯΨȟÕ") - IMAGE_SCAN("\7t|ėȟˣϪѯԳ\6ѯϪˣȟė|") - IMAGE_SCAN("\7~kt|ÕƛȟˣΨ\6ˣȟƛÕ|t") -IMAGE_PACKED(smallicon, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(handcursor) - IMAGE_SCAN("") - IMAGE_SCAN("\1\34\34\34") - IMAGE_SCAN("\3\35\35\35\27\27\27") - IMAGE_SCAN("\4\34\34\34\377\377\377,,,\0\0\0") - IMAGE_SCAN("\4\32\32\32\377\377\377KKK\0\0\0") - IMAGE_SCAN("\4\31\31\31\377\377\377ggg\0\0\0") - IMAGE_SCAN("\4\27\27\27\377\377\377\0\0\0") - IMAGE_SCAN("\4\27\27\27\3\3\3") - IMAGE_SCAN("\4\32\32\32\16\16\16") - IMAGE_SCAN("\4\33\33\33\24\24\24") - IMAGE_SCAN("\4\32\32\32\26\26\26") - IMAGE_SCAN("\7\32\32\32\3\3\3\25\25\25 \11\11\11") - IMAGE_SCAN("\11\26\26\26\377\377\377\14\14\14\377\377\377DDD\'\'\'\20\20\20") - IMAGE_SCAN("\12\10\10\10\377\377\377 \377\377\377ggg&&&") - IMAGE_SCAN("\15\32\32\32ggg\377\377\377AAA\377\377\377\377\377\377|||\4\4\4\16\16\16") - IMAGE_SCAN("\17\0\0\0lllttt\377\377\377ooo\377\377\377~~~\377\377\377&&&\20\20\20") - IMAGE_SCAN("\17\14\14\14www\377\377\377\377\377\377ݍ,,,000") - IMAGE_SCAN("\4\30\30\30|||\377\377\377\10uuu\1\1\1") - IMAGE_SCAN("\4\31\31\31ր\377\377\377\11ﭭ\20\20\20") - IMAGE_SCAN("\20\31\31\31׻\377\377\377뷷\21\21\21") - IMAGE_SCAN("\20\24\24\24\377\377\377Ҭ\10\10\10") - IMAGE_SCAN("\20\2\2\2½\0\0\0") - IMAGE_SCAN("\17***VVV\0\0\0") - IMAGE_SCAN("\16\21\21\21\30\30\30") - IMAGE_SCAN("\15JJJ\16\16\16") - IMAGE_SCAN("\15\34\34\34Փ\0\0\0") - IMAGE_SCAN("\15\3\3\3XXX\0\0\0") - IMAGE_SCAN("\013000%%%") - IMAGE_SCAN("\3///҂\5\24\24\24") - IMAGE_SCAN("\3\0\0\0\1\1\1\14\14\14\13\13\13\1\12\12\12") -IMAGE_PACKED(handcursor, "\2 \0\0\0 \0\0\0\12\0\0\0\2\0\0\0\0\0\0\0") diff --git a/uppdev/YPuzzle/YPuzzle.lay b/uppdev/YPuzzle/YPuzzle.lay deleted file mode 100644 index 9c4608ea2..000000000 --- a/uppdev/YPuzzle/YPuzzle.lay +++ /dev/null @@ -1,18 +0,0 @@ -#ifdef LAYOUTFILE - -LAYOUT(YPuzzleDimensionLayout, 152, 216) - ITEM(EditIntSpin, Xdim, Min(3).Max(15).NotNull(true).SetFrame(ThinInsetFrame()).LeftPosZ(16, 56).TopPosZ(36, 19)) - ITEM(EditIntSpin, Ydim, Min(3).Max(15).NotNull(true).SetFrame(ThinInsetFrame()).LeftPosZ(80, 56).TopPosZ(36, 19)) - ITEM(Button, ok, SetLabel(t_("OK")).HSizePosZ(80, 8).TopPosZ(188, 20)) - ITEM(Button, cancel, SetLabel(t_("Cancel")).HSizePosZ(8, 80).TopPosZ(188, 20)) - ITEM(Label, dv___4, SetLabel(t_("Height:")).SetAlign(ALIGN_CENTER).LeftPosZ(80, 48).TopPosZ(20, 13)) - ITEM(Label, dv___5, SetLabel(t_("Width:")).SetAlign(ALIGN_CENTER).LeftPosZ(16, 48).TopPosZ(20, 13)) - ITEM(LNGCtrl, applang, LeftPosZ(32, 88).TopPosZ(108, 20)) - ITEM(LabelBox, dv___7, SetLabel(t_("Dimension:")).LeftPosZ(8, 136).TopPosZ(4, 84)) - ITEM(LabelBox, dv___8, SetLabel(t_("Language:")).LeftPosZ(8, 136).TopPosZ(88, 52)) - ITEM(EditIntSpin, CellSize, Min(32).Max(64).NotNull(true).SetFrame(ThinInsetFrame()).LeftPosZ(80, 56).TopPosZ(60, 19)) - ITEM(Label, dv___10, SetLabel(t_("Cell size:")).SetAlign(ALIGN_RIGHT).LeftPosZ(16, 60).TopPosZ(60, 13)) - ITEM(Label, dv___11, SetLabel(t_("Use 'SPACE' bar to shuffle\n cells at any time.")).SetAlign(ALIGN_CENTER).LeftPosZ(12, 132).TopPosZ(144, 40)) -END_LAYOUT - -#endif diff --git a/uppdev/YPuzzle/YPuzzle.rc b/uppdev/YPuzzle/YPuzzle.rc deleted file mode 100644 index 8b92f98c8..000000000 --- a/uppdev/YPuzzle/YPuzzle.rc +++ /dev/null @@ -1 +0,0 @@ -5555 ICON DISCARDABLE "YPuzzle.ico" diff --git a/uppdev/YPuzzle/YPuzzle.t b/uppdev/YPuzzle/YPuzzle.t deleted file mode 100644 index 4be8c1560..000000000 --- a/uppdev/YPuzzle/YPuzzle.t +++ /dev/null @@ -1,41 +0,0 @@ - -// YPuzzle.lay - -T_("OK") -ruRU("OK") - -T_("Cancel") -ruRU("Отмена") - -T_("Height:") -ruRU("Высота:") - -T_("Width:") -ruRU("Ширина") - -T_("Dimension:") -ruRU("Разрешение:") - -T_("Language:") -ruRU("Язык:") - -T_("Cell size:") -ruRU("Ячейка:") - -T_("Use 'SPACE' bar to shuffle\n cells at any time.") -ruRU("Используйте клавишу\n 'ПРОБЕЛ', чтобы\n перемешать ячейки.") - - -// main.cpp - -T_("game") -ruRU("игра") - -T_("Options") -ruRU("Настройки") - -T_(" Moves: ") -ruRU(" Ходов: ") - -T_("You win!") -ruRU("Вы выиграли!") diff --git a/uppdev/YPuzzle/YPuzzle.upp b/uppdev/YPuzzle/YPuzzle.upp deleted file mode 100644 index 93bc87aef..000000000 --- a/uppdev/YPuzzle/YPuzzle.upp +++ /dev/null @@ -1,24 +0,0 @@ -charset "utf8"; - -uses - CtrlLib; - -options "-D TIXML_USE_STL"; - -file - YPuzzle.iml, - YPuzzle.h charset "utf8", - YPuzzle.lay, - YPuzzle.t charset "utf8", - YPuzzle.rc, - main.cpp charset "utf8", - TinyXML readonly separator, - TinyXML\tinystr.cpp, - TinyXML\tinystr.h, - TinyXML\tinyxml.cpp, - TinyXML\tinyxml.h, - TinyXML\tinyxmlerror.cpp, - TinyXML\tinyxmlparser.cpp; - -mainconfig - "" = "GUI ST"; diff --git a/uppdev/YPuzzle/main.cpp b/uppdev/YPuzzle/main.cpp deleted file mode 100644 index 0e43d227f..000000000 --- a/uppdev/YPuzzle/main.cpp +++ /dev/null @@ -1,522 +0,0 @@ -/* -YPuzzle copyright (c)2005 Arlen Albert Keshabian - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, excluding commercial applications. To use, alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. -*/ - -#include "YPuzzle.h" - -#define TFILE -#include - -#define IMAGEFILE -#include - -#include "TinyXML/tinyxml.h" - -template void YSwap(T &A, T &B) -{ - A ^= B ^= A ^= B; -} - -CYPuzzleCell::CYPuzzleCell(int iID, YPuzzle *pParent) -{ - m_iID = iID; - m_iCurID = m_iID; - - m_pParent = pParent; - - NoIgnoreMouse(); - NoTransparent(); - - SetInk(Color(0, 0, 203)); - -#ifdef PLATFORM_WIN32 - SetFont(Tahoma(18).Bold()); -#else - SetFont(Arial(18).Bold()); -#endif - - SetLabel(FormatInt(m_iID + 1)); - SetAlign(ALIGN_CENTER); - SetVAlign(ALIGN_CENTER); -} - -void CYPuzzleCell::LeftDown(Point p, dword keyflags) -{ - m_pParent->Process(m_iID); -} - -void CYPuzzleCell::Paint(Draw &draw) -{ - Size l_Size = GetSize(); - draw.DrawImage(0, 0, l_Size.cx, l_Size.cy, backimage); - PaintLabel(draw, 0, 0, l_Size.cx, l_Size.cy, !IsShowEnabled(), false, false, VisibleAccessKeys()); - - //UltimateCPP lacks 'DrawRoundedRect' function. - //So, the next lines of code roughly emulate it. - - int l_iOffset = 4; - int l_iLineWidth = 2; - Color l_Color(0, 0, 203); - - Rect l_Rect = Rect(GetSize()); - - draw.DrawLine(l_Rect.left + l_iOffset, l_Rect.top, l_Rect.right - l_iOffset, l_Rect.top, l_iLineWidth, l_Color); - draw.DrawLine(l_Rect.right - l_iOffset, l_Rect.top, l_Rect.right, l_Rect.top + l_iOffset, l_iLineWidth, l_Color); - draw.DrawLine(l_Rect.right, l_Rect.top + l_iOffset, l_Rect.right, l_Rect.bottom - l_iOffset, l_iLineWidth, l_Color); - draw.DrawLine(l_Rect.right, l_Rect.bottom - l_iOffset, l_Rect.right - l_iOffset, l_Rect.bottom, l_iLineWidth, l_Color); - draw.DrawLine(l_Rect.right - l_iOffset, l_Rect.bottom, l_Rect.left + l_iOffset, l_Rect.bottom, l_iLineWidth, l_Color); - draw.DrawLine(l_Rect.left + l_iOffset, l_Rect.bottom, l_Rect.left, l_Rect.bottom - l_iOffset, l_iLineWidth, l_Color); - draw.DrawLine(l_Rect.left, l_Rect.bottom - l_iOffset, l_Rect.left, l_Rect.top + l_iOffset, l_iLineWidth, l_Color); - draw.DrawLine(l_Rect.left, l_Rect.top + l_iOffset, l_Rect.left + l_iOffset, l_Rect.top, l_iLineWidth, l_Color); -} - -YPuzzle::YPuzzle() -{ - m_iLanguage = LNG_ENGLISH; - m_sConfigFilePath = "YPuzzle.config.xml"; - - int l_iX = 4, l_iY = 4, l_iCellSize = 64; - - TiXmlDocument l_XMLDoc(m_sConfigFilePath); - if(l_XMLDoc.LoadFile()) - { - TiXmlElement *l_pXMLRoot = l_XMLDoc.FirstChildElement("Configuration"); - if(l_pXMLRoot) - { - TiXmlElement *l_pXMLLanguage = l_pXMLRoot->FirstChildElement("Language"); - if(l_pXMLLanguage) - { - string l_sLanguage(l_pXMLLanguage->Attribute("id")); - if(l_sLanguage.length() == 5 && l_sLanguage[2] == '-') - m_iLanguage = LNG_(l_sLanguage[0], l_sLanguage[1], l_sLanguage[3], l_sLanguage[4]); - } - - TiXmlElement *l_pXMLDimension = l_pXMLRoot->FirstChildElement("Dimension"); - if(l_pXMLDimension) - { - l_pXMLDimension->Attribute("x", &l_iX); - l_pXMLDimension->Attribute("y", &l_iY); - l_pXMLDimension->Attribute("cell", &l_iCellSize); - - if(l_iX < 3) - l_iX = 3; - if(l_iX > 15) - l_iX = 15; - - if(l_iY < 3) - l_iY = 3; - if(l_iY > 15) - l_iY = 15; - - if(l_iCellSize < 32) - l_iCellSize = 32; - if(l_iCellSize > 64) - l_iCellSize = 64; - } - - TiXmlElement *l_pXMLScores = l_pXMLRoot->FirstChildElement("Scores"); - if(l_pXMLScores) - { - TiXmlElement *l_XMLPlane = l_pXMLScores->FirstChildElement("Plane"); - while(l_XMLPlane) - { - String l_sDimension = l_XMLPlane->Attribute("dimension"); - map::iterator l_It = m_msiScores.find(l_sDimension); - - int l_iBestNumberOfMoves = -1; - l_XMLPlane->Attribute("best", &l_iBestNumberOfMoves); - - if(l_iBestNumberOfMoves < -1) - l_iBestNumberOfMoves = -1; - - if(l_It != m_msiScores.end()) - (*l_It).second = l_iBestNumberOfMoves; - else - m_msiScores.insert(make_pair(l_sDimension, l_iBestNumberOfMoves)); - - l_XMLPlane = l_XMLPlane->NextSibling("Plane")->ToElement(); - } - } - } - } - - SetLanguage(m_iLanguage); - - String l_sTitle("YPuzzle "); - l_sTitle += t_("game"); - Title(l_sTitle); - Icon(smallicon); - MinimizeBox(true); - - srand(GetTickCount()); - - m_iCellSize = 0; - m_iNumberOfCellsX = 0; - m_iNumberOfCellsY = 0; - m_iMaxNumberOfCells = m_iNumberOfCellsX * m_iNumberOfCellsY; - m_iCurEmptyID = m_iMaxNumberOfCells - 1; - - String l_sScore = FormatInt(l_iX) + 'x' + FormatInt(l_iY); - - map::iterator l_It = m_msiScores.find(l_sScore); - if(l_It != m_msiScores.end()) - m_iBestNumberOfMoves = (*l_It).second; - else - m_iBestNumberOfMoves = -1; - - m_iNumberOfMoves = 0; - - AddChild(&m_StatusBar); - m_StatusBar.NoTransparent(); - - AddChild(&m_Options); - m_Options.SetLabel("Y"); - m_Options.NoWantFocus(); - m_Options <<= THISBACK(OnOptions); - - BuildMatrix(l_iX, l_iY, l_iCellSize); -} - -bool YPuzzle::Key(dword key, int count) -{ - bool l_bRes = TopWindow::Key(key, count); - - if(key == K_SPACE) - { - ShuffleVector(); - ArrangeButtons(m_viShuffle); - return true; - } - - return l_bRes; -} - -void YPuzzle::OnOptions() -{ - WithYPuzzleDimensionLayout l_OptionsDlg; - - l_OptionsDlg.ok.Ok(); - l_OptionsDlg.cancel.Cancel(); - CtrlLayoutOKCancel(l_OptionsDlg, t_("Options")); - - l_OptionsDlg.applang.SetData(m_iLanguage); - l_OptionsDlg.Xdim <<= m_iNumberOfCellsX; - l_OptionsDlg.Ydim <<= m_iNumberOfCellsY; - l_OptionsDlg.CellSize <<= m_iCellSize; - - int l_iRet = l_OptionsDlg.Run(); - if(l_iRet == IDCANCEL) - return; - - int l_iNumberOfCellsX = l_OptionsDlg.Xdim.GetData(); - int l_iNumberOfCellsY = l_OptionsDlg.Ydim.GetData(); - int l_iLanguage = l_OptionsDlg.applang.GetData(); - int l_iCellSize = l_OptionsDlg.CellSize.GetData(); - - String l_sScore = FormatInt(m_iNumberOfCellsX) + 'x' + FormatInt(m_iNumberOfCellsY); - map::iterator l_It = m_msiScores.find(l_sScore); - if(l_It != m_msiScores.end()) - (*l_It).second = m_iBestNumberOfMoves; - else - m_msiScores.insert(make_pair(l_sScore, m_iBestNumberOfMoves)); - - l_sScore = FormatInt(l_iNumberOfCellsX) + 'x' + FormatInt(l_iNumberOfCellsY); - l_It = m_msiScores.find(l_sScore); - if(l_It != m_msiScores.end()) - m_iBestNumberOfMoves = (*l_It).second; - else - m_iBestNumberOfMoves = -1; - - if(m_iLanguage != l_iLanguage) - { - - m_iLanguage = l_iLanguage; - SetLanguage(l_iLanguage); - - String l_sTitle("YPuzzle "); - l_sTitle += t_("game"); - Title(l_sTitle); - - if(l_iNumberOfCellsX == m_iNumberOfCellsX && l_iNumberOfCellsY == m_iNumberOfCellsY) - { - String l_sFormat = t_(" Moves: "); - l_sFormat += "%d"; - String l_sStr(Format(l_sFormat, m_iNumberOfMoves)); - if(m_iBestNumberOfMoves != -1) - { - String l_sStr2(Format(" (%d)", m_iBestNumberOfMoves)); - l_sStr += l_sStr2; - } - - m_StatusBar.SetLabel(l_sStr); - } - } - - BuildMatrix(l_iNumberOfCellsX, l_iNumberOfCellsY, l_iCellSize); -} - -void YPuzzle::Paint(Draw &draw) -{ - Rect l_Rect = Rect(GetSize()); - draw.DrawRect(l_Rect, Color(0, 0, 0)); -} - -YPuzzle::~YPuzzle() -{ - vector::iterator Idx = m_Cells.begin(); - for(; Idx != m_Cells.end(); Idx++) - delete *Idx; - - String l_sScore = FormatInt(m_iNumberOfCellsX) + 'x' + FormatInt(m_iNumberOfCellsY); - map::iterator l_It = m_msiScores.find(l_sScore); - if(l_It != m_msiScores.end()) - (*l_It).second = m_iBestNumberOfMoves; - else - m_msiScores.insert(make_pair(l_sScore, m_iBestNumberOfMoves)); - - TiXmlDeclaration l_XMLDeclaration("1.0", "UTF-8", "yes"); - TiXmlDocument l_XMLDoc(m_sConfigFilePath); - l_XMLDoc.InsertEndChild(l_XMLDeclaration); - - TiXmlElement l_XMLConfig("Configuration"); - TiXmlElement l_XMLLanguage("Language"); - l_XMLLanguage.SetAttribute("id", LNGAsText(m_iLanguage)); - TiXmlElement l_XMLDimension("Dimension"); - l_XMLDimension.SetAttribute("x", m_iNumberOfCellsX); - l_XMLDimension.SetAttribute("y", m_iNumberOfCellsY); - l_XMLDimension.SetAttribute("cell", m_iCellSize); - TiXmlElement l_XMLScores("Scores"); - - TiXmlElement l_XMLScore("Plane"); - l_It = m_msiScores.begin(); - for(; l_It != m_msiScores.end(); l_It++) - { - l_XMLScore.SetAttribute("dimension", (*l_It).first); - l_XMLScore.SetAttribute("best", (*l_It).second); - l_XMLScores.InsertEndChild(l_XMLScore); - } - - l_XMLConfig.InsertEndChild(l_XMLLanguage); - l_XMLConfig.InsertEndChild(l_XMLDimension); - l_XMLConfig.InsertEndChild(l_XMLScores); - l_XMLDoc.InsertEndChild(l_XMLConfig); - - l_XMLDoc.SaveFile(); -} - -GUI_APP_MAIN -{ - YPuzzle().Run(); -} - -void YPuzzle::ShuffleVector() -{ - m_viShuffle.erase(m_viShuffle.begin(), m_viShuffle.end()); - for(int iIndex = 0; iIndex < m_iMaxNumberOfCells - 1; iIndex++) - m_viShuffle.push_back(iIndex); - - random_shuffle(m_viShuffle.begin(), m_viShuffle.end()); - - m_iCurEmptyID = m_iMaxNumberOfCells - 1; - - CheckAndFixParity(m_viShuffle); -} - -void YPuzzle::CheckAndFixParity(vector &viShuffledVector) -{ - int l_iParity = 0; - - for(vector::iterator Idx = viShuffledVector.begin(); Idx != viShuffledVector.end(); Idx++) - { - for(vector::iterator Idx1 = Idx + 1; Idx1 != viShuffledVector.end(); Idx1++) - if((*Idx) > (*Idx1)) - l_iParity++; - } - - if(l_iParity & 1) - YSwap(viShuffledVector[0], viShuffledVector[1]); -} - -void YPuzzle::BuildMatrix(int CX, int CY, int iCellSize) -{ - if(CX == m_iNumberOfCellsX && - CY == m_iNumberOfCellsY && - iCellSize == m_iCellSize && - m_Cells.size()) - return; - - m_iNumberOfCellsX = CX; - m_iNumberOfCellsY = CY; - m_iCellSize = iCellSize; - m_iMaxNumberOfCells = m_iNumberOfCellsX * m_iNumberOfCellsY; - m_iCurEmptyID = m_iMaxNumberOfCells - 1; - - int l_iStatusBarHeight = 16; - Rect l_WindowRect(0, 0, m_iCellSize * m_iNumberOfCellsX, m_iCellSize * m_iNumberOfCellsY + l_iStatusBarHeight); - - Hide(); - - Rect l_Desktop = Ctrl::GetWorkArea(); - Rect l_CenteredRect = l_Desktop.CenterRect(min(l_Desktop.Size(), l_WindowRect.Size())); - SetRect(l_CenteredRect); - - Rect l_ClientRect(l_CenteredRect); - l_ClientRect.Offset(-l_CenteredRect.left, -l_CenteredRect.top); - - int l_iStatusTop = l_ClientRect.bottom - l_iStatusBarHeight; - m_StatusBar.SetRect(Rect(0, l_iStatusTop, l_ClientRect.right - l_iStatusBarHeight * 2, l_ClientRect.bottom)); - m_Options.SetRect(Rect(l_ClientRect.right - l_iStatusBarHeight * 2, l_iStatusTop, l_ClientRect.right, l_ClientRect.bottom)); - - Show(); - - int Idx = 0; - - Rect l_CellRect(0, 0, m_iCellSize, m_iCellSize); - CYPuzzleCell *l_pCell = NULL; - - if((int)m_Cells.size() < m_iMaxNumberOfCells - 1) - { - for(int Idx = (int)m_Cells.size(); Idx < m_iMaxNumberOfCells - 1; Idx++) - { - l_pCell = new CYPuzzleCell(Idx, this); - - AddChild(l_pCell); - - m_Cells.push_back(l_pCell); - } - } - else - { - for(vector::iterator Idx = m_Cells.begin() + m_iMaxNumberOfCells - 1; Idx != m_Cells.end(); Idx++) - delete *Idx; - - m_Cells.erase(m_Cells.begin() + m_iMaxNumberOfCells - 1, m_Cells.end()); - } - - ShuffleVector(); - ArrangeButtons(m_viShuffle); -} - -void YPuzzle::Process(int iIndex) -{ - int l_iCurDivY = m_Cells[iIndex]->m_iCurID / m_iNumberOfCellsX; - int l_iCurDivX = m_Cells[iIndex]->m_iCurID % m_iNumberOfCellsX; - - int l_iEmptyDivY = m_iCurEmptyID / m_iNumberOfCellsX; - int l_iEmptyDivX = m_iCurEmptyID % m_iNumberOfCellsX; - - int l_iDirection = 0; - - if(l_iCurDivX == l_iEmptyDivX) - { - if(l_iCurDivY + 1 == l_iEmptyDivY) - l_iDirection = 3; - else - if(l_iCurDivY - 1 == l_iEmptyDivY) - l_iDirection = 1; - } - else - { - if(l_iCurDivY == l_iEmptyDivY) - { - if(l_iCurDivX + 1 == l_iEmptyDivX) - l_iDirection = 2; - else - if(l_iCurDivX - 1 == l_iEmptyDivX) - l_iDirection = 4; - } - } - - if(l_iDirection) - { - Rect l_MoveRect = m_Cells[iIndex]->GetRect(); - if(l_iDirection & 1) - l_MoveRect.OffsetVert((l_iDirection == 1) ? -m_iCellSize : m_iCellSize); - else - l_MoveRect.OffsetHorz((l_iDirection == 2) ? m_iCellSize : -m_iCellSize); - - m_Cells[iIndex]->SetRect(l_MoveRect); - - m_iNumberOfMoves += 1; - - String l_sFormat = t_(" Moves: "); - l_sFormat += "%d"; - String l_sStr(Format(l_sFormat, m_iNumberOfMoves)); - if(m_iBestNumberOfMoves != -1) - { - String l_sStr2(Format(" (%d)", m_iBestNumberOfMoves)); - l_sStr += l_sStr2; - } - - m_StatusBar.SetLabel(l_sStr); - - YSwap(m_Cells[iIndex]->m_iCurID, m_iCurEmptyID); - - if(m_iCurEmptyID == m_iMaxNumberOfCells - 1) - { - vector::iterator Idx = m_Cells.begin(); - for(; Idx != m_Cells.end(); Idx++) - if((*Idx)->m_iID != (*Idx)->m_iCurID) - break; - - if(Idx == m_Cells.end()) - { - if(m_iBestNumberOfMoves == -1 || m_iBestNumberOfMoves > m_iNumberOfMoves) - m_iBestNumberOfMoves = m_iNumberOfMoves; - - PromptOK(t_("You win!")); - ShuffleVector(); - ArrangeButtons(m_viShuffle); - } - } - } -} - -void YPuzzle::ArrangeButtons(vector &viShuffle) -{ - Rect l_CellRect; - CYPuzzleCell *l_pCell = NULL; - int l_iDivY = 0, l_iDivX = 0, l_iX = 0, l_iY = 0; - String l_sStr; - for(int Idx = 0; Idx < m_iMaxNumberOfCells - 1; Idx++) - { - l_iDivY = viShuffle[Idx] / m_iNumberOfCellsX; - l_iDivX = viShuffle[Idx] % m_iNumberOfCellsX; - l_iX = l_iDivX * m_iCellSize; - l_iY = l_iDivY * m_iCellSize; - l_CellRect.Set(l_iX, l_iY, l_iX + m_iCellSize, l_iY + m_iCellSize); - - m_Cells[Idx]->SetRect(l_CellRect); - m_Cells[Idx]->m_iCurID = viShuffle[Idx]; - } - - m_iNumberOfMoves = 0; - l_sStr = t_(" Moves: "); - l_sStr += '0'; - if(m_iBestNumberOfMoves != -1) - { - String l_sStr2(Format(" (%d)", m_iBestNumberOfMoves)); - l_sStr += l_sStr2; - } - - m_StatusBar.SetLabel(l_sStr); -} diff --git a/uppdev/YPuzzle/tinystr.cpp b/uppdev/YPuzzle/tinystr.cpp deleted file mode 100644 index 9fa0d1322..000000000 --- a/uppdev/YPuzzle/tinystr.cpp +++ /dev/null @@ -1,318 +0,0 @@ -/* -www.sourceforge.net/projects/tinyxml -Original file by Yves Berquin. - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. -*/ - -#include "tinyxml.h" - -#ifndef TIXML_USE_STL - - -#include -#include -#include - -#include "tinystr.h" - -// TiXmlString constructor, based on a C string -TiXmlString::TiXmlString (const char* instring) -{ - size_t newlen; - char * newstring; - - if (!instring) - { - allocated = 0; - cstring = NULL; - current_length = 0; - return; - } - newlen = strlen (instring) + 1; - newstring = new char [newlen]; - memcpy (newstring, instring, newlen); - // strcpy (newstring, instring); - allocated = newlen; - cstring = newstring; - current_length = newlen - 1; -} - -// TiXmlString copy constructor -TiXmlString::TiXmlString (const TiXmlString& copy) -{ - size_t newlen; - char * newstring; - - // Prevent copy to self! - if ( © == this ) - return; - - if (! copy . allocated) - { - allocated = 0; - cstring = NULL; - current_length = 0; - return; - } - newlen = copy . length () + 1; - newstring = new char [newlen]; - // strcpy (newstring, copy . cstring); - memcpy (newstring, copy . cstring, newlen); - allocated = newlen; - cstring = newstring; - current_length = newlen - 1; -} - -// TiXmlString = operator. Safe when assign own content -void TiXmlString ::operator = (const char * content) -{ - size_t newlen; - char * newstring; - - if (! content) - { - empty_it (); - return; - } - newlen = strlen (content) + 1; - newstring = new char [newlen]; - // strcpy (newstring, content); - memcpy (newstring, content, newlen); - empty_it (); - allocated = newlen; - cstring = newstring; - current_length = newlen - 1; -} - -// = operator. Safe when assign own content -void TiXmlString ::operator = (const TiXmlString & copy) -{ - size_t newlen; - char * newstring; - - if (! copy . length ()) - { - empty_it (); - return; - } - newlen = copy . length () + 1; - newstring = new char [newlen]; - // strcpy (newstring, copy . c_str ()); - memcpy (newstring, copy . c_str (), newlen); - empty_it (); - allocated = newlen; - cstring = newstring; - current_length = newlen - 1; -} - - -// append a const char * to an existing TiXmlString -void TiXmlString::append( const char* str, size_t len ) -{ - char * new_string; - size_t new_alloc, new_size, size_suffix; - - // don't use strlen - it can overrun the len passed in! - const char* p = str; - size_suffix = 0; - - while ( *p && size_suffix < (unsigned)len ) - { - ++p; - ++size_suffix; - } - if ( !size_suffix) - return; - - new_size = length () + size_suffix + 1; - // check if we need to expand - if (new_size > allocated) - { - // compute new size - new_alloc = assign_new_size (new_size); - - // allocate new buffer - new_string = new char [new_alloc]; - new_string [0] = 0; - - // copy the previous allocated buffer into this one - if (allocated && cstring) - // strcpy (new_string, cstring); - memcpy (new_string, cstring, length ()); - - // append the suffix. It does exist, otherwize we wouldn't be expanding - // strncat (new_string, str, len); - memcpy (new_string + length (), - str, - size_suffix); - - // return previsously allocated buffer if any - if (allocated && cstring) - delete [] cstring; - - // update member variables - cstring = new_string; - allocated = new_alloc; - } - else - { - // we know we can safely append the new string - // strncat (cstring, str, len); - memcpy (cstring + length (), - str, - size_suffix); - } - current_length = new_size - 1; - cstring [current_length] = 0; -} - - -// append a const char * to an existing TiXmlString -void TiXmlString::append( const char * suffix ) -{ - char * new_string; - size_t new_alloc, new_size; - - new_size = length () + strlen (suffix) + 1; - // check if we need to expand - if (new_size > allocated) - { - // compute new size - new_alloc = assign_new_size (new_size); - - // allocate new buffer - new_string = new char [new_alloc]; - new_string [0] = 0; - - // copy the previous allocated buffer into this one - if (allocated && cstring) - memcpy (new_string, cstring, 1 + length ()); - // strcpy (new_string, cstring); - - // append the suffix. It does exist, otherwize we wouldn't be expanding - // strcat (new_string, suffix); - memcpy (new_string + length (), - suffix, - strlen (suffix) + 1); - - // return previsously allocated buffer if any - if (allocated && cstring) - delete [] cstring; - - // update member variables - cstring = new_string; - allocated = new_alloc; - } - else - { - // we know we can safely append the new string - // strcat (cstring, suffix); - memcpy (cstring + length (), - suffix, - strlen (suffix) + 1); - } - current_length = new_size - 1; -} - -// Check for TiXmlString equuivalence -//bool TiXmlString::operator == (const TiXmlString & compare) const -//{ -// return (! strcmp (c_str (), compare . c_str ())); -//} - -//unsigned TiXmlString::length () const -//{ -// if (allocated) -// // return strlen (cstring); -// return current_length; -// return 0; -//} - - -unsigned TiXmlString::find (char tofind, unsigned offset) const -{ - char * lookup; - - if (offset >= length ()) - return (unsigned) notfound; - for (lookup = cstring + offset; * lookup; lookup++) - if (* lookup == tofind) - return (unsigned)(lookup - cstring); - return (unsigned) notfound; -} - - -bool TiXmlString::operator == (const TiXmlString & compare) const -{ - if ( allocated && compare.allocated ) - { - assert( cstring ); - assert( compare.cstring ); - return ( strcmp( cstring, compare.cstring ) == 0 ); - } - else if ( length() == 0 && compare.length() == 0 ) - { - return true; - } - return false; -} - - -bool TiXmlString::operator == (const char* compare) const -{ - if ( allocated && compare && *compare ) - { - assert( cstring ); - return ( strcmp( cstring, compare ) == 0 ); - } - else if ( length() == 0 && (!compare || !*compare ) ) // this is a little dubious, but try to duplicate behavior in other operator== - { - return true; - } - return false; -} - - -bool TiXmlString::operator < (const TiXmlString & compare) const -{ - if ( allocated && compare.allocated ) - { - assert( cstring ); - assert( compare.cstring ); - return ( strcmp( cstring, compare.cstring ) > 0 ); - } - return false; -} - - -bool TiXmlString::operator > (const TiXmlString & compare) const -{ - if ( allocated && compare.allocated ) - { - assert( cstring ); - assert( compare.cstring ); - return ( strcmp( cstring, compare.cstring ) < 0 ); - } - return false; -} - - -#endif // TIXML_USE_STL diff --git a/uppdev/YPuzzle/tinystr.h b/uppdev/YPuzzle/tinystr.h deleted file mode 100644 index fc85f72d0..000000000 --- a/uppdev/YPuzzle/tinystr.h +++ /dev/null @@ -1,250 +0,0 @@ -/* -www.sourceforge.net/projects/tinyxml -Original file by Yves Berquin. - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. -*/ - -#include "tinyxml.h" - - -#ifndef TIXML_USE_STL - -#ifndef TIXML_STRING_INCLUDED -#define TIXML_STRING_INCLUDED - -#ifdef _MSC_VER -#pragma warning( disable : 4530 ) -#pragma warning( disable : 4786 ) -#endif - -#include - -/* - TiXmlString is an emulation of the std::string template. - Its purpose is to allow compiling TinyXML on compilers with no or poor STL support. - Only the member functions relevant to the TinyXML project have been implemented. - The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase - a string and there's no more room, we allocate a buffer twice as big as we need. -*/ -class TiXmlString -{ - public : - // TiXmlString constructor, based on a string, mark explicit to force - // us to find unnecessary casting. - explicit TiXmlString (const char * instring); - - // TiXmlString empty constructor - TiXmlString () - { - allocated = 0; - cstring = NULL; - current_length = 0; - } - - // TiXmlString copy constructor - explicit TiXmlString (const TiXmlString& copy); - - // TiXmlString destructor - ~ TiXmlString () - { - empty_it (); - } - - // Convert a TiXmlString into a classical char * - const char * c_str () const - { - if (allocated) - return cstring; - return ""; - } - - // Return the length of a TiXmlString - size_t length () const - { - return ( allocated ) ? current_length : 0; - } - - // TiXmlString = operator - void operator = (const char * content); - - // = operator - void operator = (const TiXmlString & copy); - - // += operator. Maps to append - TiXmlString& operator += (const char * suffix) - { - append (suffix); - return *this; - } - - // += operator. Maps to append - TiXmlString& operator += (char single) - { - append (single); - return *this; - } - - // += operator. Maps to append - TiXmlString& operator += (TiXmlString & suffix) - { - append (suffix); - return *this; - } - bool operator == (const TiXmlString & compare) const; - bool operator == (const char* compare) const; - bool operator < (const TiXmlString & compare) const; - bool operator > (const TiXmlString & compare) const; - - // Checks if a TiXmlString is empty - bool empty () const - { - return length () ? false : true; - } - - // single char extraction - const char& at (unsigned index) const - { - assert( index < length ()); - return cstring [index]; - } - - // find a char in a string. Return TiXmlString::notfound if not found - unsigned find (char lookup) const - { - return find (lookup, 0); - } - - // find a char in a string from an offset. Return TiXmlString::notfound if not found - unsigned find (char tofind, unsigned offset) const; - - /* Function to reserve a big amount of data when we know we'll need it. Be aware that this - function clears the content of the TiXmlString if any exists. - */ - void reserve (unsigned size) - { - empty_it (); - if (size) - { - allocated = size; - cstring = new char [size]; - cstring [0] = 0; - current_length = 0; - } - } - - // [] operator - char& operator [] (unsigned index) const - { - assert( index < length ()); - return cstring [index]; - } - - // Error value for find primitive - enum { notfound = 0xffffffff, - npos = notfound }; - - void append (const char *str, size_t len ); - - protected : - - // The base string - char * cstring; - // Number of chars allocated - size_t allocated; - // Current string size - size_t current_length; - - // New size computation. It is simplistic right now : it returns twice the amount - // we need - size_t assign_new_size (size_t minimum_to_allocate) - { - return minimum_to_allocate * 2; - } - - // Internal function that clears the content of a TiXmlString - void empty_it () - { - if (cstring) - delete [] cstring; - cstring = NULL; - allocated = 0; - current_length = 0; - } - - void append (const char *suffix ); - - // append function for another TiXmlString - void append (const TiXmlString & suffix) - { - append (suffix . c_str ()); - } - - // append for a single char. - void append (char single) - { - if ( cstring && current_length < (allocated-1) ) - { - cstring[ current_length ] = single; - ++current_length; - cstring[ current_length ] = 0; - } - else - { - char smallstr [2]; - smallstr [0] = single; - smallstr [1] = 0; - append (smallstr); - } - } - -} ; - -/* - TiXmlOutStream is an emulation of std::ostream. It is based on TiXmlString. - Only the operators that we need for TinyXML have been developped. -*/ -class TiXmlOutStream : public TiXmlString -{ -public : - TiXmlOutStream () : TiXmlString () {} - - // TiXmlOutStream << operator. Maps to TiXmlString::append - TiXmlOutStream & operator << (const char * in) - { - append (in); - return (* this); - } - - // TiXmlOutStream << operator. Maps to TiXmlString::append - TiXmlOutStream & operator << (const TiXmlString & in) - { - append (in . c_str ()); - return (* this); - } -} ; - -#ifdef _MSC_VER -#pragma warning( default : 4530 ) -#pragma warning( default : 4786 ) -#endif - -#endif // TIXML_STRING_INCLUDED -#endif // TIXML_USE_STL diff --git a/uppdev/YPuzzle/tinyxml.cpp b/uppdev/YPuzzle/tinyxml.cpp deleted file mode 100644 index 310f7b48b..000000000 --- a/uppdev/YPuzzle/tinyxml.cpp +++ /dev/null @@ -1,1645 +0,0 @@ -/* -www.sourceforge.net/projects/tinyxml -Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com) - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. -*/ - -#include - -#ifdef PLATFORM_WIN32 -#include -#endif - -#include "tinyxml.h" - -#ifdef TIXML_USE_STL -#include -#endif - - -bool TiXmlBase::condenseWhiteSpace = true; - -void TiXmlBase::PutString( const TIXML_STRING& str, TIXML_OSTREAM* stream ) -{ - TIXML_STRING buffer; - PutString( str, &buffer ); - (*stream) << buffer; -} - -void TiXmlBase::PutString( const TIXML_STRING& str, TIXML_STRING* outString ) -{ - int i=0; - - while( i<(int)str.length() ) - { - unsigned char c = (unsigned char) str[i]; - - if ( c == '&' - && i < ( (int)str.length() - 2 ) - && str[i+1] == '#' - && str[i+2] == 'x' ) - { - // Hexadecimal character reference. - // Pass through unchanged. - // © -- copyright symbol, for example. - // - // The -1 is a bug fix from Rob Laveaux. It keeps - // an overflow from happening if there is no ';'. - // There are actually 2 ways to exit this loop - - // while fails (error case) and break (semicolon found). - // However, there is no mechanism (currently) for - // this function to return an error. - while ( i<(int)str.length()-1 ) - { - outString->append( str.c_str() + i, 1 ); - ++i; - if ( str[i] == ';' ) - break; - } - } - else if ( c == '&' ) - { - outString->append( entity[0].str, entity[0].strLength ); - ++i; - } - else if ( c == '<' ) - { - outString->append( entity[1].str, entity[1].strLength ); - ++i; - } - else if ( c == '>' ) - { - outString->append( entity[2].str, entity[2].strLength ); - ++i; - } - else if ( c == '\"' ) - { - outString->append( entity[3].str, entity[3].strLength ); - ++i; - } - else if ( c == '\'' ) - { - outString->append( entity[4].str, entity[4].strLength ); - ++i; - } - else if ( c < 32 ) - { - // Easy pass at non-alpha/numeric/symbol - // Below 32 is symbolic. - char buf[ 32 ]; - sprintf( buf, "&#x%02X;", (unsigned) ( c & 0xff ) ); - //*ME: warning C4267: convert 'size_t' to 'int' - //*ME: Int-Cast to make compiler happy ... - outString->append( buf, (int)strlen( buf ) ); - ++i; - } - else - { - //char realc = (char) c; - //outString->append( &realc, 1 ); - *outString += (char) c; // somewhat more efficient function call. - ++i; - } - } -} - - -// <-- Strange class for a bug fix. Search for STL_STRING_BUG -TiXmlBase::StringToBuffer::StringToBuffer( const TIXML_STRING& str ) -{ - buffer = new char[ str.length()+1 ]; - if ( buffer ) - { - strcpy( buffer, str.c_str() ); - } -} - - -TiXmlBase::StringToBuffer::~StringToBuffer() -{ - delete [] buffer; -} -// End strange bug fix. --> - - -TiXmlNode::TiXmlNode( NodeType _type ) : TiXmlBase() -{ - parent = 0; - type = _type; - firstChild = 0; - lastChild = 0; - prev = 0; - next = 0; -} - - -TiXmlNode::~TiXmlNode() -{ - TiXmlNode* node = firstChild; - TiXmlNode* temp = 0; - - while ( node ) - { - temp = node; - node = node->next; - delete temp; - } -} - - -void TiXmlNode::CopyTo( TiXmlNode* target ) const -{ - target->SetValue (value.c_str() ); - target->userData = userData; -} - - -void TiXmlNode::Clear() -{ - TiXmlNode* node = firstChild; - TiXmlNode* temp = 0; - - while ( node ) - { - temp = node; - node = node->next; - delete temp; - } - - firstChild = 0; - lastChild = 0; -} - - -TiXmlNode* TiXmlNode::LinkEndChild( TiXmlNode* node ) -{ - node->parent = this; - - node->prev = lastChild; - node->next = 0; - - if ( lastChild ) - lastChild->next = node; - else - firstChild = node; // it was an empty list. - - lastChild = node; - return node; -} - - -TiXmlNode* TiXmlNode::InsertEndChild( const TiXmlNode& addThis ) -{ - TiXmlNode* node = addThis.Clone(); - if ( !node ) - return 0; - - return LinkEndChild( node ); -} - - -TiXmlNode* TiXmlNode::InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ) -{ - if ( !beforeThis || beforeThis->parent != this ) - return 0; - - TiXmlNode* node = addThis.Clone(); - if ( !node ) - return 0; - node->parent = this; - - node->next = beforeThis; - node->prev = beforeThis->prev; - if ( beforeThis->prev ) - { - beforeThis->prev->next = node; - } - else - { - assert( firstChild == beforeThis ); - firstChild = node; - } - beforeThis->prev = node; - return node; -} - - -TiXmlNode* TiXmlNode::InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ) -{ - if ( !afterThis || afterThis->parent != this ) - return 0; - - TiXmlNode* node = addThis.Clone(); - if ( !node ) - return 0; - node->parent = this; - - node->prev = afterThis; - node->next = afterThis->next; - if ( afterThis->next ) - { - afterThis->next->prev = node; - } - else - { - assert( lastChild == afterThis ); - lastChild = node; - } - afterThis->next = node; - return node; -} - - -TiXmlNode* TiXmlNode::ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ) -{ - if ( replaceThis->parent != this ) - return 0; - - TiXmlNode* node = withThis.Clone(); - if ( !node ) - return 0; - - node->next = replaceThis->next; - node->prev = replaceThis->prev; - - if ( replaceThis->next ) - replaceThis->next->prev = node; - else - lastChild = node; - - if ( replaceThis->prev ) - replaceThis->prev->next = node; - else - firstChild = node; - - delete replaceThis; - node->parent = this; - return node; -} - - -bool TiXmlNode::RemoveChild( TiXmlNode* removeThis ) -{ - if ( removeThis->parent != this ) - { - assert( 0 ); - return false; - } - - if ( removeThis->next ) - removeThis->next->prev = removeThis->prev; - else - lastChild = removeThis->prev; - - if ( removeThis->prev ) - removeThis->prev->next = removeThis->next; - else - firstChild = removeThis->next; - - delete removeThis; - return true; -} - -const TiXmlNode* TiXmlNode::FirstChild( const char * _value ) const -{ - const TiXmlNode* node; - for ( node = firstChild; node; node = node->next ) - { - if ( node->SValue() == _value ) - return node; - } - return 0; -} - - -TiXmlNode* TiXmlNode::FirstChild( const char * _value ) -{ - TiXmlNode* node; - for ( node = firstChild; node; node = node->next ) - { - if ( node->SValue() == _value ) - return node; - } - return 0; -} - - -const TiXmlNode* TiXmlNode::LastChild( const char * _value ) const -{ - const TiXmlNode* node; - for ( node = lastChild; node; node = node->prev ) - { - if ( node->SValue() == _value ) - return node; - } - return 0; -} - -TiXmlNode* TiXmlNode::LastChild( const char * _value ) -{ - TiXmlNode* node; - for ( node = lastChild; node; node = node->prev ) - { - if ( node->SValue() == _value ) - return node; - } - return 0; -} - -TiXmlNode *TiXmlNode::NodeFromPath(const char *sPath, char chSeparator) const -{ - if(!firstChild || !sPath) - return NULL; - - const char *l_psStartPos = sPath; - -#ifdef PLATFORM_WIN32 - const char *l_psEndPos = _tcschr(l_psStartPos, chSeparator); -#else - const char *l_psEndPos = strchr(l_psStartPos, chSeparator); -#endif - - char *l_psSubString = NULL; - int l_iLength = 0; - const TiXmlNode *l_pNode = NULL; - - while(l_psEndPos) - { - l_iLength = l_psEndPos - l_psStartPos; - l_psSubString = new char[l_iLength + 1]; - -#ifdef PLATFORM_WIN32 - _tcsncpy(l_psSubString, l_psStartPos, l_iLength); -#else - strncpy(l_psSubString, l_psStartPos, l_iLength); -#endif - l_psSubString[l_iLength] = 0; - - l_pNode = (l_pNode) ? l_pNode->FirstChild(l_psSubString) : FirstChild(l_psSubString); - - delete[] l_psSubString; - - if(!l_pNode) - return NULL; - - l_psStartPos = l_psEndPos + 1; - -#ifdef PLATFORM_WIN32 - l_psEndPos = _tcschr(l_psStartPos, chSeparator); -#else - l_psEndPos = strchr(l_psStartPos, chSeparator); -#endif - } - - return const_cast((l_pNode) ? l_pNode->FirstChild(l_psStartPos) : FirstChild(l_psStartPos)); -} - -const TiXmlNode* TiXmlNode::IterateChildren( const TiXmlNode* previous ) const -{ - if ( !previous ) - { - return FirstChild(); - } - else - { - assert( previous->parent == this ); - return previous->NextSibling(); - } -} - -TiXmlNode* TiXmlNode::IterateChildren( TiXmlNode* previous ) -{ - if ( !previous ) - { - return FirstChild(); - } - else - { - assert( previous->parent == this ); - return previous->NextSibling(); - } -} - -const TiXmlNode* TiXmlNode::IterateChildren( const char * val, const TiXmlNode* previous ) const -{ - if ( !previous ) - { - return FirstChild( val ); - } - else - { - assert( previous->parent == this ); - return previous->NextSibling( val ); - } -} - -TiXmlNode* TiXmlNode::IterateChildren( const char * val, TiXmlNode* previous ) -{ - if ( !previous ) - { - return FirstChild( val ); - } - else - { - assert( previous->parent == this ); - return previous->NextSibling( val ); - } -} - -const TiXmlNode* TiXmlNode::NextSibling( const char * _value ) const -{ - const TiXmlNode* node; - for ( node = next; node; node = node->next ) - { - if ( node->SValue() == _value ) - return node; - } - return 0; -} - -TiXmlNode* TiXmlNode::NextSibling( const char * _value ) -{ - TiXmlNode* node; - for ( node = next; node; node = node->next ) - { - if ( node->SValue() == _value ) - return node; - } - return 0; -} - -const TiXmlNode* TiXmlNode::PreviousSibling( const char * _value ) const -{ - const TiXmlNode* node; - for ( node = prev; node; node = node->prev ) - { - if ( node->SValue() == _value ) - return node; - } - return 0; -} - -TiXmlNode* TiXmlNode::PreviousSibling( const char * _value ) -{ - TiXmlNode* node; - for ( node = prev; node; node = node->prev ) - { - if ( node->SValue() == _value ) - return node; - } - return 0; -} - -void TiXmlElement::RemoveAttribute( const char * name ) -{ - TiXmlAttribute* node = attributeSet.Find( name ); - if ( node ) - { - attributeSet.Remove( node ); - delete node; - } -} - -const TiXmlElement* TiXmlNode::FirstChildElement() const -{ - const TiXmlNode* node; - - for ( node = FirstChild(); - node; - node = node->NextSibling() ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - -TiXmlElement* TiXmlNode::FirstChildElement() -{ - TiXmlNode* node; - - for ( node = FirstChild(); - node; - node = node->NextSibling() ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - -const TiXmlElement* TiXmlNode::FirstChildElement( const char * _value ) const -{ - const TiXmlNode* node; - - for ( node = FirstChild( _value ); - node; - node = node->NextSibling( _value ) ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - -TiXmlElement* TiXmlNode::FirstChildElement( const char * _value ) -{ - TiXmlNode* node; - - for ( node = FirstChild( _value ); - node; - node = node->NextSibling( _value ) ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - -const TiXmlElement* TiXmlNode::NextSiblingElement() const -{ - const TiXmlNode* node; - - for ( node = NextSibling(); - node; - node = node->NextSibling() ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - -TiXmlElement* TiXmlNode::NextSiblingElement() -{ - TiXmlNode* node; - - for ( node = NextSibling(); - node; - node = node->NextSibling() ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - -const TiXmlElement* TiXmlNode::NextSiblingElement( const char * _value ) const -{ - const TiXmlNode* node; - - for ( node = NextSibling( _value ); - node; - node = node->NextSibling( _value ) ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - -TiXmlElement* TiXmlNode::NextSiblingElement( const char * _value ) -{ - TiXmlNode* node; - - for ( node = NextSibling( _value ); - node; - node = node->NextSibling( _value ) ) - { - if ( node->ToElement() ) - return node->ToElement(); - } - return 0; -} - - -const TiXmlDocument* TiXmlNode::GetDocument() const -{ - const TiXmlNode* node; - - for( node = this; node; node = node->parent ) - { - if ( node->ToDocument() ) - return node->ToDocument(); - } - return 0; -} - -TiXmlDocument* TiXmlNode::GetDocument() -{ - TiXmlNode* node; - - for( node = this; node; node = node->parent ) - { - if ( node->ToDocument() ) - return node->ToDocument(); - } - return 0; -} - -TiXmlElement::TiXmlElement (const char * _value) - : TiXmlNode( TiXmlNode::ELEMENT ) -{ - firstChild = lastChild = 0; - value = _value; -} - - -#ifdef TIXML_USE_STL -TiXmlElement::TiXmlElement( const std::string& _value ) - : TiXmlNode( TiXmlNode::ELEMENT ) -{ - firstChild = lastChild = 0; - value = _value; -} -#endif - - -TiXmlElement::TiXmlElement( const TiXmlElement& copy) - : TiXmlNode( TiXmlNode::ELEMENT ) -{ - firstChild = lastChild = 0; - copy.CopyTo( this ); -} - - -void TiXmlElement::operator=( const TiXmlElement& base ) -{ - ClearThis(); - base.CopyTo( this ); -} - - -TiXmlElement::~TiXmlElement() -{ - ClearThis(); -} - - -void TiXmlElement::ClearThis() -{ - Clear(); - while( attributeSet.First() ) - { - TiXmlAttribute* node = attributeSet.First(); - attributeSet.Remove( node ); - delete node; - } -} - - -const char * TiXmlElement::Attribute( const char * name ) const -{ - const TiXmlAttribute* node = attributeSet.Find( name ); - - if ( node ) - return node->Value(); - - return 0; -} - - -const char * TiXmlElement::Attribute( const char * name, int* i ) const -{ - const char * s = Attribute( name ); - if ( i ) - { - if ( s ) - *i = atoi( s ); - else - *i = 0; - } - return s; -} - - -const char * TiXmlElement::Attribute( const char * name, double* d ) const -{ - const char * s = Attribute( name ); - if ( d ) - { - if ( s ) - *d = atof( s ); - else - *d = 0; - } - return s; -} - - -int TiXmlElement::QueryIntAttribute( const char* name, int* ival ) const -{ - const TiXmlAttribute* node = attributeSet.Find( name ); - if ( !node ) - return TIXML_NO_ATTRIBUTE; - - return node->QueryIntValue( ival ); -} - - -int TiXmlElement::QueryDoubleAttribute( const char* name, double* dval ) const -{ - const TiXmlAttribute* node = attributeSet.Find( name ); - if ( !node ) - return TIXML_NO_ATTRIBUTE; - - return node->QueryDoubleValue( dval ); -} - - -void TiXmlElement::SetAttribute( const char * name, int val ) -{ - char buf[64]; - sprintf( buf, "%d", val ); - SetAttribute( name, buf ); -} - - -void TiXmlElement::SetDoubleAttribute( const char * name, double val ) -{ - char buf[256]; - sprintf( buf, "%f", val ); - SetAttribute( name, buf ); -} - - -void TiXmlElement::SetAttribute( const char * name, const char * _value ) -{ - TiXmlAttribute* node = attributeSet.Find( name ); - if ( node ) - { - node->SetValue( _value ); - return; - } - - TiXmlAttribute* attrib = new TiXmlAttribute( name, _value ); - if ( attrib ) - { - attributeSet.Add( attrib ); - } - else - { - TiXmlDocument* document = GetDocument(); - if ( document ) document->SetError( TIXML_ERROR_OUT_OF_MEMORY, 0, 0, TIXML_ENCODING_UNKNOWN ); - } -} - -void TiXmlElement::Print( FILE* cfile, int depth ) const -{ - int i; - for ( i=0; iNext() ) - { - fprintf( cfile, " " ); - attrib->Print( cfile, depth ); - } - - // There are 3 different formatting approaches: - // 1) An element without children is printed as a node - // 2) An element with only a text child is printed as text - // 3) An element with children is printed on multiple lines. - TiXmlNode* node; - if ( !firstChild ) - { - fprintf( cfile, " />" ); - } - else if ( firstChild == lastChild && firstChild->ToText() ) - { - fprintf( cfile, ">" ); - firstChild->Print( cfile, depth + 1 ); - fprintf( cfile, "", value.c_str() ); - } - else - { - fprintf( cfile, ">" ); - - for ( node = firstChild; node; node=node->NextSibling() ) - { - if ( !node->ToText() ) - { - fprintf( cfile, "\n" ); - } - node->Print( cfile, depth+1 ); - } - fprintf( cfile, "\n" ); - for( i=0; i", value.c_str() ); - } -} - -void TiXmlElement::StreamOut( TIXML_OSTREAM * stream ) const -{ - (*stream) << "<" << value; - - const TiXmlAttribute* attrib; - for ( attrib = attributeSet.First(); attrib; attrib = attrib->Next() ) - { - (*stream) << " "; - attrib->StreamOut( stream ); - } - - // If this node has children, give it a closing tag. Else - // make it an empty tag. - TiXmlNode* node; - if ( firstChild ) - { - (*stream) << ">"; - - for ( node = firstChild; node; node=node->NextSibling() ) - { - node->StreamOut( stream ); - } - (*stream) << ""; - } - else - { - (*stream) << " />"; - } -} - - -void TiXmlElement::CopyTo( TiXmlElement* target ) const -{ - // superclass: - TiXmlNode::CopyTo( target ); - - // Element class: - // Clone the attributes, then clone the children. - const TiXmlAttribute* attribute = 0; - for( attribute = attributeSet.First(); - attribute; - attribute = attribute->Next() ) - { - target->SetAttribute( attribute->Name(), attribute->Value() ); - } - - TiXmlNode* node = 0; - for ( node = firstChild; node; node = node->NextSibling() ) - { - target->LinkEndChild( node->Clone() ); - } -} - - -TiXmlNode* TiXmlElement::Clone() const -{ - TiXmlElement* clone = new TiXmlElement( Value() ); - if ( !clone ) - return 0; - - CopyTo( clone ); - return clone; -} - - -TiXmlDocument::TiXmlDocument() : TiXmlNode( TiXmlNode::DOCUMENT ) -{ - tabsize = 4; - ClearError(); -} - -TiXmlDocument::TiXmlDocument( const char * documentName ) : TiXmlNode( TiXmlNode::DOCUMENT ) -{ - tabsize = 4; - value = documentName; - ClearError(); -} - - -#ifdef TIXML_USE_STL -TiXmlDocument::TiXmlDocument( const std::string& documentName ) : TiXmlNode( TiXmlNode::DOCUMENT ) -{ - tabsize = 4; - value = documentName; - ClearError(); -} -#endif - - -TiXmlDocument::TiXmlDocument( const TiXmlDocument& copy ) : TiXmlNode( TiXmlNode::DOCUMENT ) -{ - copy.CopyTo( this ); -} - - -void TiXmlDocument::operator=( const TiXmlDocument& copy ) -{ - Clear(); - copy.CopyTo( this ); -} - - -bool TiXmlDocument::LoadFile( TiXmlEncoding encoding ) -{ - // See STL_STRING_BUG below. - StringToBuffer buf( value ); - - if ( buf.buffer && LoadFile( buf.buffer, encoding ) ) - return true; - - return false; -} - - -bool TiXmlDocument::SaveFile() const -{ - // See STL_STRING_BUG below. - StringToBuffer buf( value ); - - if ( buf.buffer && SaveFile( buf.buffer ) ) - return true; - - return false; -} - -bool TiXmlDocument::LoadFile( const char* filename, TiXmlEncoding encoding ) -{ - // Delete the existing data: - Clear(); - location.Clear(); - - // There was a really terrifying little bug here. The code: - // value = filename - // in the STL case, cause the assignment method of the std::string to - // be called. What is strange, is that the std::string had the same - // address as it's c_str() method, and so bad things happen. Looks - // like a bug in the Microsoft STL implementation. - // See STL_STRING_BUG above. - // Fixed with the StringToBuffer class. - value = filename; - - FILE* file = fopen( value.c_str (), "r" ); - - if ( file ) - { - // Get the file size, so we can pre-allocate the string. HUGE speed impact. - long length = 0; - fseek( file, 0, SEEK_END ); - length = ftell( file ); - fseek( file, 0, SEEK_SET ); - - // Strange case, but good to handle up front. - if ( length == 0 ) - { - fclose( file ); - return false; - } - - // If we have a file, assume it is all one big XML file, and read it in. - // The document parser may decide the document ends sooner than the entire file, however. - TIXML_STRING data; - data.reserve( length ); - - const int BUF_SIZE = 2048; - char buf[BUF_SIZE]; - - while( fgets( buf, BUF_SIZE, file ) ) - { - data += buf; - } - fclose( file ); - - Parse( data.c_str(), 0, encoding ); - - if ( Error() ) - return false; - else - return true; - } - SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); - return false; -} - -bool TiXmlDocument::SaveFile( const char * filename ) const -{ - // The old c stuff lives on... - FILE* fp = fopen( filename, "w" ); - if ( fp ) - { - Print( fp, 0 ); - fclose( fp ); - return true; - } - return false; -} - - -void TiXmlDocument::CopyTo( TiXmlDocument* target ) const -{ - TiXmlNode::CopyTo( target ); - - target->error = error; - target->errorDesc = errorDesc.c_str (); - - TiXmlNode* node = 0; - for ( node = firstChild; node; node = node->NextSibling() ) - { - target->LinkEndChild( node->Clone() ); - } -} - - -TiXmlNode* TiXmlDocument::Clone() const -{ - TiXmlDocument* clone = new TiXmlDocument(); - if ( !clone ) - return 0; - - CopyTo( clone ); - return clone; -} - -void TiXmlDocument::Print( FILE* cfile, int depth ) const -{ - const TiXmlNode* node; - for ( node=FirstChild(); node; node=node->NextSibling() ) - { - node->Print( cfile, depth ); - fprintf( cfile, "\n" ); - } -} - -void TiXmlDocument::StreamOut( TIXML_OSTREAM * out ) const -{ - const TiXmlNode* node; - for ( node=FirstChild(); node; node=node->NextSibling() ) - { - node->StreamOut( out ); - - // Special rule for streams: stop after the root element. - // The stream in code will only read one element, so don't - // write more than one. - if ( node->ToElement() ) - break; - } -} - - -const TiXmlAttribute* TiXmlAttribute::Next() const -{ - // We are using knowledge of the sentinel. The sentinel - // have a value or name. - if ( next->value.empty() && next->name.empty() ) - return 0; - return next; -} - -TiXmlAttribute* TiXmlAttribute::Next() -{ - // We are using knowledge of the sentinel. The sentinel - // have a value or name. - if ( next->value.empty() && next->name.empty() ) - return 0; - return next; -} - -const TiXmlAttribute* TiXmlAttribute::Previous() const -{ - // We are using knowledge of the sentinel. The sentinel - // have a value or name. - if ( prev->value.empty() && prev->name.empty() ) - return 0; - return prev; -} - -TiXmlAttribute* TiXmlAttribute::Previous() -{ - // We are using knowledge of the sentinel. The sentinel - // have a value or name. - if ( prev->value.empty() && prev->name.empty() ) - return 0; - return prev; -} - -void TiXmlAttribute::Print( FILE* cfile, int /*depth*/ ) const -{ - TIXML_STRING n, v; - - PutString( name, &n ); - PutString( value, &v ); - - if (value.find ('\"') == TIXML_STRING::npos) - fprintf (cfile, "%s=\"%s\"", n.c_str(), v.c_str() ); - else - fprintf (cfile, "%s='%s'", n.c_str(), v.c_str() ); -} - - -void TiXmlAttribute::StreamOut( TIXML_OSTREAM * stream ) const -{ - if (value.find( '\"' ) != TIXML_STRING::npos) - { - PutString( name, stream ); - (*stream) << "=" << "'"; - PutString( value, stream ); - (*stream) << "'"; - } - else - { - PutString( name, stream ); - (*stream) << "=" << "\""; - PutString( value, stream ); - (*stream) << "\""; - } -} - -int TiXmlAttribute::QueryIntValue( int* ival ) const -{ - if ( sscanf( value.c_str(), "%d", ival ) == 1 ) - return TIXML_SUCCESS; - return TIXML_WRONG_TYPE; -} - -int TiXmlAttribute::QueryDoubleValue( double* dval ) const -{ - if ( sscanf( value.c_str(), "%lf", dval ) == 1 ) - return TIXML_SUCCESS; - return TIXML_WRONG_TYPE; -} - -void TiXmlAttribute::SetIntValue( int _value ) -{ - char buf [64]; - sprintf (buf, "%d", _value); - SetValue (buf); -} - -void TiXmlAttribute::SetDoubleValue( double _value ) -{ - char buf [256]; - sprintf (buf, "%lf", _value); - SetValue (buf); -} - -const int TiXmlAttribute::IntValue() const -{ - return atoi (value.c_str ()); -} - -const double TiXmlAttribute::DoubleValue() const -{ - return atof (value.c_str ()); -} - - -TiXmlComment::TiXmlComment( const TiXmlComment& copy ) : TiXmlNode( TiXmlNode::COMMENT ) -{ - copy.CopyTo( this ); -} - - -void TiXmlComment::operator=( const TiXmlComment& base ) -{ - Clear(); - base.CopyTo( this ); -} - - -void TiXmlComment::Print( FILE* cfile, int depth ) const -{ - for ( int i=0; i", value.c_str() ); -} - -void TiXmlComment::StreamOut( TIXML_OSTREAM * stream ) const -{ - (*stream) << ""; -} - - -void TiXmlComment::CopyTo( TiXmlComment* target ) const -{ - TiXmlNode::CopyTo( target ); -} - - -TiXmlNode* TiXmlComment::Clone() const -{ - TiXmlComment* clone = new TiXmlComment(); - - if ( !clone ) - return 0; - - CopyTo( clone ); - return clone; -} - - -void TiXmlText::Print( FILE* cfile, int /*depth*/ ) const -{ - TIXML_STRING buffer; - PutString( value, &buffer ); - fprintf( cfile, "%s", buffer.c_str() ); -} - - -void TiXmlText::StreamOut( TIXML_OSTREAM * stream ) const -{ - PutString( value, stream ); -} - - -void TiXmlText::CopyTo( TiXmlText* target ) const -{ - TiXmlNode::CopyTo( target ); -} - - -TiXmlNode* TiXmlText::Clone() const -{ - TiXmlText* clone = 0; - clone = new TiXmlText( "" ); - - if ( !clone ) - return 0; - - CopyTo( clone ); - return clone; -} - - -TiXmlDeclaration::TiXmlDeclaration( const char * _version, - const char * _encoding, - const char * _standalone ) - : TiXmlNode( TiXmlNode::DECLARATION ) -{ - version = _version; - encoding = _encoding; - standalone = _standalone; -} - - -#ifdef TIXML_USE_STL -TiXmlDeclaration::TiXmlDeclaration( const std::string& _version, - const std::string& _encoding, - const std::string& _standalone ) - : TiXmlNode( TiXmlNode::DECLARATION ) -{ - version = _version; - encoding = _encoding; - standalone = _standalone; -} -#endif - - -TiXmlDeclaration::TiXmlDeclaration( const TiXmlDeclaration& copy ) - : TiXmlNode( TiXmlNode::DECLARATION ) -{ - copy.CopyTo( this ); -} - - -void TiXmlDeclaration::operator=( const TiXmlDeclaration& copy ) -{ - Clear(); - copy.CopyTo( this ); -} - - -void TiXmlDeclaration::Print( FILE* cfile, int /*depth*/ ) const -{ - fprintf (cfile, ""); -} - -void TiXmlDeclaration::StreamOut( TIXML_OSTREAM * stream ) const -{ - (*stream) << ""; -} - - -void TiXmlDeclaration::CopyTo( TiXmlDeclaration* target ) const -{ - TiXmlNode::CopyTo( target ); - - target->version = version; - target->encoding = encoding; - target->standalone = standalone; -} - - -TiXmlNode* TiXmlDeclaration::Clone() const -{ - TiXmlDeclaration* clone = new TiXmlDeclaration(); - - if ( !clone ) - return 0; - - CopyTo( clone ); - return clone; -} - - -void TiXmlUnknown::Print( FILE* cfile, int depth ) const -{ - for ( int i=0; i", value.c_str() ); -} - - -void TiXmlUnknown::StreamOut( TIXML_OSTREAM * stream ) const -{ - (*stream) << "<" << value << ">"; // Don't use entities here! It is unknown. -} - - -void TiXmlUnknown::CopyTo( TiXmlUnknown* target ) const -{ - TiXmlNode::CopyTo( target ); -} - - -TiXmlNode* TiXmlUnknown::Clone() const -{ - TiXmlUnknown* clone = new TiXmlUnknown(); - - if ( !clone ) - return 0; - - CopyTo( clone ); - return clone; -} - - -TiXmlAttributeSet::TiXmlAttributeSet() -{ - sentinel.next = &sentinel; - sentinel.prev = &sentinel; -} - - -TiXmlAttributeSet::~TiXmlAttributeSet() -{ - assert( sentinel.next == &sentinel ); - assert( sentinel.prev == &sentinel ); -} - - -void TiXmlAttributeSet::Add( TiXmlAttribute* addMe ) -{ - assert( !Find( addMe->Name() ) ); // Shouldn't be multiply adding to the set. - - addMe->next = &sentinel; - addMe->prev = sentinel.prev; - - sentinel.prev->next = addMe; - sentinel.prev = addMe; -} - -void TiXmlAttributeSet::Remove( TiXmlAttribute* removeMe ) -{ - TiXmlAttribute* node; - - for( node = sentinel.next; node != &sentinel; node = node->next ) - { - if ( node == removeMe ) - { - node->prev->next = node->next; - node->next->prev = node->prev; - node->next = 0; - node->prev = 0; - return; - } - } - assert( 0 ); // we tried to remove a non-linked attribute. -} - -const TiXmlAttribute* TiXmlAttributeSet::Find( const char * name ) const -{ - const TiXmlAttribute* node; - - for( node = sentinel.next; node != &sentinel; node = node->next ) - { - if ( node->name == name ) - return node; - } - return 0; -} - -TiXmlAttribute* TiXmlAttributeSet::Find( const char * name ) -{ - TiXmlAttribute* node; - - for( node = sentinel.next; node != &sentinel; node = node->next ) - { - if ( node->name == name ) - return node; - } - return 0; -} - -#ifdef TIXML_USE_STL -TIXML_ISTREAM & operator >> (TIXML_ISTREAM & in, TiXmlNode & base) -{ - TIXML_STRING tag; - tag.reserve( 8 * 1000 ); - base.StreamIn( &in, &tag ); - - base.Parse( tag.c_str(), 0, TIXML_DEFAULT_ENCODING ); - return in; -} -#endif - - -TIXML_OSTREAM & operator<< (TIXML_OSTREAM & out, const TiXmlNode & base) -{ - base.StreamOut (& out); - return out; -} - - -#ifdef TIXML_USE_STL -std::string & operator<< (std::string& out, const TiXmlNode& base ) -{ - std::ostringstream os_stream( std::ostringstream::out ); - base.StreamOut( &os_stream ); - - out.append( os_stream.str() ); - return out; -} -#endif - - -TiXmlHandle TiXmlHandle::FirstChild() const -{ - if ( node ) - { - TiXmlNode* child = node->FirstChild(); - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::FirstChild( const char * value ) const -{ - if ( node ) - { - TiXmlNode* child = node->FirstChild( value ); - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::FirstChildElement() const -{ - if ( node ) - { - TiXmlElement* child = node->FirstChildElement(); - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::FirstChildElement( const char * value ) const -{ - if ( node ) - { - TiXmlElement* child = node->FirstChildElement( value ); - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - -TiXmlHandle TiXmlHandle::Child( int count ) const -{ - if ( node ) - { - int i; - TiXmlNode* child = node->FirstChild(); - for ( i=0; - child && iNextSibling(), ++i ) - { - // nothing - } - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::Child( const char* value, int count ) const -{ - if ( node ) - { - int i; - TiXmlNode* child = node->FirstChild( value ); - for ( i=0; - child && iNextSibling( value ), ++i ) - { - // nothing - } - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::ChildElement( int count ) const -{ - if ( node ) - { - int i; - TiXmlElement* child = node->FirstChildElement(); - for ( i=0; - child && iNextSiblingElement(), ++i ) - { - // nothing - } - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} - - -TiXmlHandle TiXmlHandle::ChildElement( const char* value, int count ) const -{ - if ( node ) - { - int i; - TiXmlElement* child = node->FirstChildElement( value ); - for ( i=0; - child && iNextSiblingElement( value ), ++i ) - { - // nothing - } - if ( child ) - return TiXmlHandle( child ); - } - return TiXmlHandle( 0 ); -} diff --git a/uppdev/YPuzzle/tinyxml.h b/uppdev/YPuzzle/tinyxml.h deleted file mode 100644 index 0024ae903..000000000 --- a/uppdev/YPuzzle/tinyxml.h +++ /dev/null @@ -1,1441 +0,0 @@ -/* -www.sourceforge.net/projects/tinyxml -Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com) - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. -*/ - - -#ifndef TINYXML_INCLUDED -#define TINYXML_INCLUDED - -#ifdef _MSC_VER -#pragma warning( disable : 4530 ) -#pragma warning( disable : 4786 ) -#endif - -#include -#include -#include -#include -#include - -// Help out windows: -#if defined( _DEBUG ) && !defined( DEBUG ) -#define DEBUG -#endif - -#if defined( DEBUG ) && defined( _MSC_VER ) -#include -#define TIXML_LOG OutputDebugString -#else -#define TIXML_LOG printf -#endif - -#ifdef TIXML_USE_STL - #include - #include - #define TIXML_STRING std::string - #define TIXML_ISTREAM std::istream - #define TIXML_OSTREAM std::ostream -#else - #include "tinystr.h" - #define TIXML_STRING TiXmlString - #define TIXML_OSTREAM TiXmlOutStream -#endif - -class TiXmlDocument; -class TiXmlElement; -class TiXmlComment; -class TiXmlUnknown; -class TiXmlAttribute; -class TiXmlText; -class TiXmlDeclaration; -class TiXmlParsingData; - -const int TIXML_MAJOR_VERSION = 2; -const int TIXML_MINOR_VERSION = 3; -const int TIXML_PATCH_VERSION = 4; - -/* Internal structure for tracking location of items - in the XML file. -*/ -struct TiXmlCursor -{ - TiXmlCursor() { Clear(); } - void Clear() { row = col = -1; } - - int row; // 0 based. - int col; // 0 based. -}; - - -// Only used by Attribute::Query functions -enum -{ - TIXML_SUCCESS, - TIXML_NO_ATTRIBUTE, - TIXML_WRONG_TYPE -}; - - -// Used by the parsing routines. -enum TiXmlEncoding -{ - TIXML_ENCODING_UNKNOWN, - TIXML_ENCODING_UTF8, - TIXML_ENCODING_LEGACY -}; - -const TiXmlEncoding TIXML_DEFAULT_ENCODING = TIXML_ENCODING_UNKNOWN; - -/** TiXmlBase is a base class for every class in TinyXml. - It does little except to establish that TinyXml classes - can be printed and provide some utility functions. - - In XML, the document and elements can contain - other elements and other types of nodes. - - @verbatim - A Document can contain: Element (container or leaf) - Comment (leaf) - Unknown (leaf) - Declaration( leaf ) - - An Element can contain: Element (container or leaf) - Text (leaf) - Attributes (not on tree) - Comment (leaf) - Unknown (leaf) - - A Decleration contains: Attributes (not on tree) - @endverbatim -*/ -class TiXmlBase -{ - friend class TiXmlNode; - friend class TiXmlElement; - friend class TiXmlDocument; - -public: - TiXmlBase() : userData(0) {} - virtual ~TiXmlBase() {} - - /** All TinyXml classes can print themselves to a filestream. - This is a formatted print, and will insert tabs and newlines. - - (For an unformatted stream, use the << operator.) - */ - virtual void Print( FILE* cfile, int depth ) const = 0; - - /** The world does not agree on whether white space should be kept or - not. In order to make everyone happy, these global, static functions - are provided to set whether or not TinyXml will condense all white space - into a single space or not. The default is to condense. Note changing this - values is not thread safe. - */ - static void SetCondenseWhiteSpace( bool condense ) { condenseWhiteSpace = condense; } - - /// Return the current white space setting. - static bool IsWhiteSpaceCondensed() { return condenseWhiteSpace; } - - /** Return the position, in the original source file, of this node or attribute. - The row and column are 1-based. (That is the first row and first column is - 1,1). If the returns values are 0 or less, then the parser does not have - a row and column value. - - Generally, the row and column value will be set when the TiXmlDocument::Load(), - TiXmlDocument::LoadFile(), or any TiXmlNode::Parse() is called. It will NOT be set - when the DOM was created from operator>>. - - The values reflect the initial load. Once the DOM is modified programmatically - (by adding or changing nodes and attributes) the new values will NOT update to - reflect changes in the document. - - There is a minor performance cost to computing the row and column. Computation - can be disabled if TiXmlDocument::SetTabSize() is called with 0 as the value. - - @sa TiXmlDocument::SetTabSize() - */ - int Row() const { return location.row + 1; } - int Column() const { return location.col + 1; } ///< See Row() - - void SetUserData( void* user ) { userData = user; } - void* GetUserData() { return userData; } - - // Table that returs, for a given lead byte, the total number of bytes - // in the UTF-8 sequence. - static const int utf8ByteTable[256]; - - virtual const char* Parse( const char* p, - TiXmlParsingData* data, - TiXmlEncoding encoding /*= TIXML_ENCODING_UNKNOWN */ ) = 0; - - enum - { - TIXML_NO_ERROR = 0, - TIXML_ERROR, - TIXML_ERROR_OPENING_FILE, - TIXML_ERROR_OUT_OF_MEMORY, - TIXML_ERROR_PARSING_ELEMENT, - TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME, - TIXML_ERROR_READING_ELEMENT_VALUE, - TIXML_ERROR_READING_ATTRIBUTES, - TIXML_ERROR_PARSING_EMPTY, - TIXML_ERROR_READING_END_TAG, - TIXML_ERROR_PARSING_UNKNOWN, - TIXML_ERROR_PARSING_COMMENT, - TIXML_ERROR_PARSING_DECLARATION, - TIXML_ERROR_DOCUMENT_EMPTY, - TIXML_ERROR_EMBEDDED_NULL, - - TIXML_ERROR_STRING_COUNT - }; - -protected: - - // See STL_STRING_BUG - // Utility class to overcome a bug. - class StringToBuffer - { - public: - StringToBuffer( const TIXML_STRING& str ); - ~StringToBuffer(); - char* buffer; - }; - - static const char* SkipWhiteSpace( const char*, TiXmlEncoding encoding ); - inline static bool IsWhiteSpace( char c ) - { - return ( isspace( (unsigned char) c ) || c == '\n' || c == '\r' ); - } - - virtual void StreamOut (TIXML_OSTREAM *) const = 0; - - #ifdef TIXML_USE_STL - static bool StreamWhiteSpace( TIXML_ISTREAM * in, TIXML_STRING * tag ); - static bool StreamTo( TIXML_ISTREAM * in, int character, TIXML_STRING * tag ); - #endif - - /* Reads an XML name into the string provided. Returns - a pointer just past the last character of the name, - or 0 if the function has an error. - */ - static const char* ReadName( const char* p, TIXML_STRING* name, TiXmlEncoding encoding ); - - /* Reads text. Returns a pointer past the given end tag. - Wickedly complex options, but it keeps the (sensitive) code in one place. - */ - static const char* ReadText( const char* in, // where to start - TIXML_STRING* text, // the string read - bool ignoreWhiteSpace, // whether to keep the white space - const char* endTag, // what ends this text - bool ignoreCase, // whether to ignore case in the end tag - TiXmlEncoding encoding ); // the current encoding - - // If an entity has been found, transform it into a character. - static const char* GetEntity( const char* in, char* value, int* length, TiXmlEncoding encoding ); - - // Get a character, while interpreting entities. - // The length can be from 0 to 4 bytes. - inline static const char* GetChar( const char* p, char* _value, int* length, TiXmlEncoding encoding ) - { - assert( p ); - if ( encoding == TIXML_ENCODING_UTF8 ) - { - *length = utf8ByteTable[ *((unsigned char*)p) ]; - assert( *length >= 0 && *length < 5 ); - } - else - { - *length = 1; - } - - if ( *length == 1 ) - { - if ( *p == '&' ) - return GetEntity( p, _value, length, encoding ); - *_value = *p; - return p+1; - } - else if ( *length ) - { - strncpy( _value, p, *length ); - return p + (*length); - } - else - { - // Not valid text. - return 0; - } - } - - // Puts a string to a stream, expanding entities as it goes. - // Note this should not contian the '<', '>', etc, or they will be transformed into entities! - static void PutString( const TIXML_STRING& str, TIXML_OSTREAM* out ); - - static void PutString( const TIXML_STRING& str, TIXML_STRING* out ); - - // Return true if the next characters in the stream are any of the endTag sequences. - // Ignore case only works for english, and should only be relied on when comparing - // to Engilish words: StringEqual( p, "version", true ) is fine. - static bool StringEqual( const char* p, - const char* endTag, - bool ignoreCase, - TiXmlEncoding encoding ); - - static const char* errorString[ TIXML_ERROR_STRING_COUNT ]; - - TiXmlCursor location; - - /// Field containing a generic user pointer - void* userData; - - // None of these methods are reliable for any language except English. - // Good for approximation, not great for accuracy. - static int IsAlpha( unsigned char anyByte, TiXmlEncoding encoding ); - static int IsAlphaNum( unsigned char anyByte, TiXmlEncoding encoding ); - inline static int ToLower( int v, TiXmlEncoding encoding ) - { - if ( encoding == TIXML_ENCODING_UTF8 ) - { - if ( v < 128 ) return tolower( v ); - return v; - } - else - { - return tolower( v ); - } - } - static void ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ); - -private: - TiXmlBase( const TiXmlBase& ); // not implemented. - void operator=( const TiXmlBase& base ); // not allowed. - - struct Entity - { - const char* str; - unsigned int strLength; - char chr; - }; - enum - { - NUM_ENTITY = 5, - MAX_ENTITY_LENGTH = 6 - - }; - static Entity entity[ NUM_ENTITY ]; - static bool condenseWhiteSpace; -}; - - -/** The parent class for everything in the Document Object Model. - (Except for attributes). - Nodes have siblings, a parent, and children. A node can be - in a document, or stand on its own. The type of a TiXmlNode - can be queried, and it can be cast to its more defined type. -*/ -class TiXmlNode : public TiXmlBase -{ - friend class TiXmlDocument; - friend class TiXmlElement; - -public: - #ifdef TIXML_USE_STL - - /** An input stream operator, for every class. Tolerant of newlines and - formatting, but doesn't expect them. - */ - friend std::istream& operator >> (std::istream& in, TiXmlNode& base); - - /** An output stream operator, for every class. Note that this outputs - without any newlines or formatting, as opposed to Print(), which - includes tabs and new lines. - - The operator<< and operator>> are not completely symmetric. Writing - a node to a stream is very well defined. You'll get a nice stream - of output, without any extra whitespace or newlines. - - But reading is not as well defined. (As it always is.) If you create - a TiXmlElement (for example) and read that from an input stream, - the text needs to define an element or junk will result. This is - true of all input streams, but it's worth keeping in mind. - - A TiXmlDocument will read nodes until it reads a root element, and - all the children of that root element. - */ - friend std::ostream& operator<< (std::ostream& out, const TiXmlNode& base); - - /// Appends the XML node or attribute to a std::string. - friend std::string& operator<< (std::string& out, const TiXmlNode& base ); - - #else - // Used internally, not part of the public API. - friend TIXML_OSTREAM& operator<< (TIXML_OSTREAM& out, const TiXmlNode& base); - #endif - - /** The types of XML nodes supported by TinyXml. (All the - unsupported types are picked up by UNKNOWN.) - */ - enum NodeType - { - DOCUMENT, - ELEMENT, - COMMENT, - UNKNOWN, - TEXT, - DECLARATION, - TYPECOUNT - }; - - virtual ~TiXmlNode(); - - /** The meaning of 'value' changes for the specific type of - TiXmlNode. - @verbatim - Document: filename of the xml file - Element: name of the element - Comment: the comment text - Unknown: the tag contents - Text: the text string - @endverbatim - - The subclasses will wrap this function. - */ - const char * Value() const { return value.c_str (); } - - /** Changes the value of the node. Defined as: - @verbatim - Document: filename of the xml file - Element: name of the element - Comment: the comment text - Unknown: the tag contents - Text: the text string - @endverbatim - */ - void SetValue(const char * _value) { value = _value;} - - #ifdef TIXML_USE_STL - /// STL std::string form. - void SetValue( const std::string& _value ) - { - StringToBuffer buf( _value ); - SetValue( buf.buffer ? buf.buffer : "" ); - } - #endif - - /// Delete all the children of this node. Does not affect 'this'. - void Clear(); - - /// One step up the DOM. - TiXmlNode* Parent() { return parent; } - const TiXmlNode* Parent() const { return parent; } - - const TiXmlNode* FirstChild() const { return firstChild; } ///< The first child of this node. Will be null if there are no children. - TiXmlNode* FirstChild() { return firstChild; } - const TiXmlNode* FirstChild( const char * value ) const; ///< The first child of this node with the matching 'value'. Will be null if none found. - TiXmlNode* FirstChild( const char * value ); ///< The first child of this node with the matching 'value'. Will be null if none found. - - ///Arlen Albert Keshabian addons: gets the element a path points to - virtual TiXmlNode *NodeFromPath(const char *sPath, char chSeparator = '.') const; - virtual TiXmlElement *ElementFromPath(const char *sPath, char chSeparator = '.') const - { - TiXmlNode *l_pNode = NodeFromPath(sPath, chSeparator); - - return (l_pNode) ? l_pNode->ToElement() : NULL; - } - -#ifdef TIXML_USE_STL - virtual TiXmlNode *NodeFromPath( const std::string& sPath, char chSeparator = '.') const {return NodeFromPath(sPath.c_str(), chSeparator);} - virtual TiXmlElement *ElementFromPath( const std::string& sPath, char chSeparator = '.') const {return ElementFromPath(sPath.c_str(), chSeparator);} -#endif - ////////////////////////////////////////////////////////////////////////// - - const TiXmlNode* LastChild() const { return lastChild; } /// The last child of this node. Will be null if there are no children. - TiXmlNode* LastChild() { return lastChild; } - const TiXmlNode* LastChild( const char * value ) const; /// The last child of this node matching 'value'. Will be null if there are no children. - TiXmlNode* LastChild( const char * value ); - - #ifdef TIXML_USE_STL - const TiXmlNode* FirstChild( const std::string& _value ) const { return FirstChild (_value.c_str ()); } ///< STL std::string form. - TiXmlNode* FirstChild( const std::string& _value ) { return FirstChild (_value.c_str ()); } ///< STL std::string form. - const TiXmlNode* LastChild( const std::string& _value ) const { return LastChild (_value.c_str ()); } ///< STL std::string form. - TiXmlNode* LastChild( const std::string& _value ) { return LastChild (_value.c_str ()); } ///< STL std::string form. - #endif - - /** An alternate way to walk the children of a node. - One way to iterate over nodes is: - @verbatim - for( child = parent->FirstChild(); child; child = child->NextSibling() ) - @endverbatim - - IterateChildren does the same thing with the syntax: - @verbatim - child = 0; - while( child = parent->IterateChildren( child ) ) - @endverbatim - - IterateChildren takes the previous child as input and finds - the next one. If the previous child is null, it returns the - first. IterateChildren will return null when done. - */ - const TiXmlNode* IterateChildren( const TiXmlNode* previous ) const; - TiXmlNode* IterateChildren( TiXmlNode* previous ); - - /// This flavor of IterateChildren searches for children with a particular 'value' - const TiXmlNode* IterateChildren( const char * value, const TiXmlNode* previous ) const; - TiXmlNode* IterateChildren( const char * value, TiXmlNode* previous ); - - #ifdef TIXML_USE_STL - const TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) const { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. - TiXmlNode* IterateChildren( const std::string& _value, TiXmlNode* previous ) { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. - #endif - - /** Add a new node related to this. Adds a child past the LastChild. - Returns a pointer to the new object or NULL if an error occured. - */ - TiXmlNode* InsertEndChild( const TiXmlNode& addThis ); - - - /** Add a new node related to this. Adds a child past the LastChild. - - NOTE: the node to be added is passed by pointer, and will be - henceforth owned (and deleted) by tinyXml. This method is efficient - and avoids an extra copy, but should be used with care as it - uses a different memory model than the other insert functions. - - @sa InsertEndChild - */ - TiXmlNode* LinkEndChild( TiXmlNode* addThis ); - - /** Add a new node related to this. Adds a child before the specified child. - Returns a pointer to the new object or NULL if an error occured. - */ - TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ); - - /** Add a new node related to this. Adds a child after the specified child. - Returns a pointer to the new object or NULL if an error occured. - */ - TiXmlNode* InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ); - - /** Replace a child of this node. - Returns a pointer to the new object or NULL if an error occured. - */ - TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ); - - /// Delete a child of this node. - bool RemoveChild( TiXmlNode* removeThis ); - - /// Navigate to a sibling node. - const TiXmlNode* PreviousSibling() const { return prev; } - TiXmlNode* PreviousSibling() { return prev; } - - /// Navigate to a sibling node. - const TiXmlNode* PreviousSibling( const char * ) const; - TiXmlNode* PreviousSibling( const char * ); - - #ifdef TIXML_USE_STL - const TiXmlNode* PreviousSibling( const std::string& _value ) const { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. - TiXmlNode* PreviousSibling( const std::string& _value ) { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. - const TiXmlNode* NextSibling( const std::string& _value) const { return NextSibling (_value.c_str ()); } ///< STL std::string form. - TiXmlNode* NextSibling( const std::string& _value) { return NextSibling (_value.c_str ()); } ///< STL std::string form. - #endif - - /// Navigate to a sibling node. - const TiXmlNode* NextSibling() const { return next; } - TiXmlNode* NextSibling() { return next; } - - /// Navigate to a sibling node with the given 'value'. - const TiXmlNode* NextSibling( const char * ) const; - TiXmlNode* NextSibling( const char * ); - - /** Convenience function to get through elements. - Calls NextSibling and ToElement. Will skip all non-Element - nodes. Returns 0 if there is not another element. - */ - const TiXmlElement* NextSiblingElement() const; - TiXmlElement* NextSiblingElement(); - - /** Convenience function to get through elements. - Calls NextSibling and ToElement. Will skip all non-Element - nodes. Returns 0 if there is not another element. - */ - const TiXmlElement* NextSiblingElement( const char * ) const; - TiXmlElement* NextSiblingElement( const char * ); - - #ifdef TIXML_USE_STL - const TiXmlElement* NextSiblingElement( const std::string& _value) const { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. - TiXmlElement* NextSiblingElement( const std::string& _value) { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. - #endif - - /// Convenience function to get through elements. - const TiXmlElement* FirstChildElement() const; - TiXmlElement* FirstChildElement(); - - /// Convenience function to get through elements. - const TiXmlElement* FirstChildElement( const char * value ) const; - TiXmlElement* FirstChildElement( const char * value ); - - #ifdef TIXML_USE_STL - const TiXmlElement* FirstChildElement( const std::string& _value ) const { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. - TiXmlElement* FirstChildElement( const std::string& _value ) { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. - #endif - - /** Query the type (as an enumerated value, above) of this node. - The possible types are: DOCUMENT, ELEMENT, COMMENT, - UNKNOWN, TEXT, and DECLARATION. - */ - virtual int Type() const { return type; } - - /** Return a pointer to the Document this node lives in. - Returns null if not in a document. - */ - const TiXmlDocument* GetDocument() const; - TiXmlDocument* GetDocument(); - - /// Returns true if this node has no children. - bool NoChildren() const { return !firstChild; } - - const TiXmlDocument* ToDocument() const { return ( this && type == DOCUMENT ) ? (const TiXmlDocument*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - const TiXmlElement* ToElement() const { return ( this && type == ELEMENT ) ? (const TiXmlElement*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - const TiXmlComment* ToComment() const { return ( this && type == COMMENT ) ? (const TiXmlComment*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - const TiXmlUnknown* ToUnknown() const { return ( this && type == UNKNOWN ) ? (const TiXmlUnknown*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - const TiXmlText* ToText() const { return ( this && type == TEXT ) ? (const TiXmlText*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - const TiXmlDeclaration* ToDeclaration() const { return ( this && type == DECLARATION ) ? (const TiXmlDeclaration*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - - TiXmlDocument* ToDocument() { return ( this && type == DOCUMENT ) ? (TiXmlDocument*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - TiXmlElement* ToElement() { return ( this && type == ELEMENT ) ? (TiXmlElement*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - TiXmlComment* ToComment() { return ( this && type == COMMENT ) ? (TiXmlComment*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - TiXmlUnknown* ToUnknown() { return ( this && type == UNKNOWN ) ? (TiXmlUnknown*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - TiXmlText* ToText() { return ( this && type == TEXT ) ? (TiXmlText*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - TiXmlDeclaration* ToDeclaration() { return ( this && type == DECLARATION ) ? (TiXmlDeclaration*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. - - /** Create an exact duplicate of this node and return it. The memory must be deleted - by the caller. - */ - virtual TiXmlNode* Clone() const = 0; - -protected: - TiXmlNode( NodeType _type ); - - // Copy to the allocated object. Shared functionality between Clone, Copy constructor, - // and the assignment operator. - void CopyTo( TiXmlNode* target ) const; - - #ifdef TIXML_USE_STL - // The real work of the input operator. - virtual void StreamIn( TIXML_ISTREAM* in, TIXML_STRING* tag ) = 0; - #endif - - // Figure out what is at *p, and parse it. Returns null if it is not an xml node. - TiXmlNode* Identify( const char* start, TiXmlEncoding encoding ); - - // Internal Value function returning a TIXML_STRING - const TIXML_STRING& SValue() const { return value ; } - - TiXmlNode* parent; - NodeType type; - - TiXmlNode* firstChild; - TiXmlNode* lastChild; - - TIXML_STRING value; - - TiXmlNode* prev; - TiXmlNode* next; - -private: - TiXmlNode( const TiXmlNode& ); // not implemented. - void operator=( const TiXmlNode& base ); // not allowed. -}; - - -/** An attribute is a name-value pair. Elements have an arbitrary - number of attributes, each with a unique name. - - @note The attributes are not TiXmlNodes, since they are not - part of the tinyXML document object model. There are other - suggested ways to look at this problem. -*/ -class TiXmlAttribute : public TiXmlBase -{ - friend class TiXmlAttributeSet; - -public: - /// Construct an empty attribute. - TiXmlAttribute() : TiXmlBase() - { - document = 0; - prev = next = 0; - } - - #ifdef TIXML_USE_STL - /// std::string constructor. - TiXmlAttribute( const std::string& _name, const std::string& _value ) - { - name = _name; - value = _value; - document = 0; - prev = next = 0; - } - #endif - - /// Construct an attribute with a name and value. - TiXmlAttribute( const char * _name, const char * _value ) - { - name = _name; - value = _value; - document = 0; - prev = next = 0; - } - - const char* Name() const { return name.c_str (); } ///< Return the name of this attribute. - const char* Value() const { return value.c_str (); } ///< Return the value of this attribute. - const int IntValue() const; ///< Return the value of this attribute, converted to an integer. - const double DoubleValue() const; ///< Return the value of this attribute, converted to a double. - - /** QueryIntValue examines the value string. It is an alternative to the - IntValue() method with richer error checking. - If the value is an integer, it is stored in 'value' and - the call returns TIXML_SUCCESS. If it is not - an integer, it returns TIXML_WRONG_TYPE. - - A specialized but useful call. Note that for success it returns 0, - which is the opposite of almost all other TinyXml calls. - */ - int QueryIntValue( int* value ) const; - /// QueryDoubleValue examines the value string. See QueryIntValue(). - int QueryDoubleValue( double* value ) const; - - void SetName( const char* _name ) { name = _name; } ///< Set the name of this attribute. - void SetValue( const char* _value ) { value = _value; } ///< Set the value. - - void SetIntValue( int value ); ///< Set the value from an integer. - void SetDoubleValue( double value ); ///< Set the value from a double. - - #ifdef TIXML_USE_STL - /// STL std::string form. - void SetName( const std::string& _name ) - { - StringToBuffer buf( _name ); - SetName ( buf.buffer ? buf.buffer : "error" ); - } - /// STL std::string form. - void SetValue( const std::string& _value ) - { - StringToBuffer buf( _value ); - SetValue( buf.buffer ? buf.buffer : "error" ); - } - #endif - - /// Get the next sibling attribute in the DOM. Returns null at end. - const TiXmlAttribute* Next() const; - TiXmlAttribute* Next(); - /// Get the previous sibling attribute in the DOM. Returns null at beginning. - const TiXmlAttribute* Previous() const; - TiXmlAttribute* Previous(); - - bool operator==( const TiXmlAttribute& rhs ) const { return rhs.name == name; } - bool operator<( const TiXmlAttribute& rhs ) const { return name < rhs.name; } - bool operator>( const TiXmlAttribute& rhs ) const { return name > rhs.name; } - - /* Attribute parsing starts: first letter of the name - returns: the next char after the value end quote - */ - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - - // Prints this Attribute to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - virtual void StreamOut( TIXML_OSTREAM * out ) const; - // [internal use] - // Set the document pointer so the attribute can report errors. - void SetDocument( TiXmlDocument* doc ) { document = doc; } - -private: - TiXmlAttribute( const TiXmlAttribute& ); // not implemented. - void operator=( const TiXmlAttribute& base ); // not allowed. - - TiXmlDocument* document; // A pointer back to a document, for error reporting. - TIXML_STRING name; - TIXML_STRING value; - TiXmlAttribute* prev; - TiXmlAttribute* next; -}; - - -/* A class used to manage a group of attributes. - It is only used internally, both by the ELEMENT and the DECLARATION. - - The set can be changed transparent to the Element and Declaration - classes that use it, but NOT transparent to the Attribute - which has to implement a next() and previous() method. Which makes - it a bit problematic and prevents the use of STL. - - This version is implemented with circular lists because: - - I like circular lists - - it demonstrates some independence from the (typical) doubly linked list. -*/ -class TiXmlAttributeSet -{ -public: - TiXmlAttributeSet(); - ~TiXmlAttributeSet(); - - void Add( TiXmlAttribute* attribute ); - void Remove( TiXmlAttribute* attribute ); - - const TiXmlAttribute* First() const { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } - TiXmlAttribute* First() { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } - const TiXmlAttribute* Last() const { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } - TiXmlAttribute* Last() { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } - - const TiXmlAttribute* Find( const char * name ) const; - TiXmlAttribute* Find( const char * name ); - -private: - //*ME: Because of hidden/disabled copy-construktor in TiXmlAttribute (sentinel-element), - //*ME: this class must be also use a hidden/disabled copy-constructor !!! - TiXmlAttributeSet( const TiXmlAttributeSet& ); // not allowed - void operator=( const TiXmlAttributeSet& ); // not allowed (as TiXmlAttribute) - - TiXmlAttribute sentinel; -}; - - -/** The element is a container class. It has a value, the element name, - and can contain other elements, text, comments, and unknowns. - Elements also contain an arbitrary number of attributes. -*/ -class TiXmlElement : public TiXmlNode -{ -public: - /// Construct an element. - TiXmlElement (const char * in_value); - - #ifdef TIXML_USE_STL - /// std::string constructor. - TiXmlElement( const std::string& _value ); - #endif - - TiXmlElement( const TiXmlElement& ); - - void operator=( const TiXmlElement& base ); - - virtual ~TiXmlElement(); - - /** Given an attribute name, Attribute() returns the value - for the attribute of that name, or null if none exists. - */ - const char* Attribute( const char* name ) const; - - /** Given an attribute name, Attribute() returns the value - for the attribute of that name, or null if none exists. - If the attribute exists and can be converted to an integer, - the integer value will be put in the return 'i', if 'i' - is non-null. - */ - const char* Attribute( const char* name, int* i ) const; - - /** Given an attribute name, Attribute() returns the value - for the attribute of that name, or null if none exists. - If the attribute exists and can be converted to an double, - the double value will be put in the return 'd', if 'd' - is non-null. - */ - const char* Attribute( const char* name, double* d ) const; - - /** QueryIntAttribute examines the attribute - it is an alternative to the - Attribute() method with richer error checking. - If the attribute is an integer, it is stored in 'value' and - the call returns TIXML_SUCCESS. If it is not - an integer, it returns TIXML_WRONG_TYPE. If the attribute - does not exist, then TIXML_NO_ATTRIBUTE is returned. - */ - - int QueryIntAttribute( const char* name, int* value ) const; - /// QueryDoubleAttribute examines the attribute - see QueryIntAttribute(). - int QueryDoubleAttribute( const char* name, double* value ) const; - /// QueryFloatAttribute examines the attribute - see QueryIntAttribute(). - int QueryDoubleAttribute( const char* name, float* value ) const { - double d; - int result = QueryDoubleAttribute( name, &d ); - *value = (float)d; - return result; - } - - /** Sets an attribute of name to a given value. The attribute - will be created if it does not exist, or changed if it does. - */ - void SetAttribute( const char* name, const char * value ); - - #ifdef TIXML_USE_STL - const char* Attribute( const std::string& name ) const { return Attribute( name.c_str() ); } - const char* Attribute( const std::string& name, int* i ) const { return Attribute( name.c_str(), i ); } - const char* Attribute( const std::string& name, double* d ) const { return Attribute( name.c_str(), d ); } - int QueryIntAttribute( const std::string& name, int* value ) const { return QueryIntAttribute( name.c_str(), value ); } - int QueryDoubleAttribute( const std::string& name, double* value ) const { return QueryDoubleAttribute( name.c_str(), value ); } - - /// STL std::string form. - void SetAttribute( const std::string& name, const std::string& _value ) - { - StringToBuffer n( name ); - StringToBuffer v( _value ); - if ( n.buffer && v.buffer ) - SetAttribute (n.buffer, v.buffer ); - } - ///< STL std::string form. - void SetAttribute( const std::string& name, int _value ) - { - StringToBuffer n( name ); - if ( n.buffer ) - SetAttribute (n.buffer, _value); - } - #endif - - /** Sets an attribute of name to a given value. The attribute - will be created if it does not exist, or changed if it does. - */ - void SetAttribute( const char * name, int value ); - - /** Sets an attribute of name to a given value. The attribute - will be created if it does not exist, or changed if it does. - */ - void SetDoubleAttribute( const char * name, double value ); - - /** Deletes an attribute with the given name. - */ - void RemoveAttribute( const char * name ); - #ifdef TIXML_USE_STL - void RemoveAttribute( const std::string& name ) { RemoveAttribute (name.c_str ()); } ///< STL std::string form. - #endif - - const TiXmlAttribute* FirstAttribute() const { return attributeSet.First(); } ///< Access the first attribute in this element. - TiXmlAttribute* FirstAttribute() { return attributeSet.First(); } - const TiXmlAttribute* LastAttribute() const { return attributeSet.Last(); } ///< Access the last attribute in this element. - TiXmlAttribute* LastAttribute() { return attributeSet.Last(); } - - /// Creates a new Element and returns it - the returned element is a copy. - virtual TiXmlNode* Clone() const; - // Print the Element to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - /* Attribtue parsing starts: next char past '<' - returns: next char past '>' - */ - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - -protected: - - void CopyTo( TiXmlElement* target ) const; - void ClearThis(); // like clear, but initializes 'this' object as well - - // Used to be public [internal use] - #ifdef TIXML_USE_STL - virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); - #endif - virtual void StreamOut( TIXML_OSTREAM * out ) const; - - /* [internal use] - Reads the "value" of the element -- another element, or text. - This should terminate with the current end tag. - */ - const char* ReadValue( const char* in, TiXmlParsingData* prevData, TiXmlEncoding encoding ); - -private: - - TiXmlAttributeSet attributeSet; -}; - - -/** An XML comment. -*/ -class TiXmlComment : public TiXmlNode -{ -public: - /// Constructs an empty comment. - TiXmlComment() : TiXmlNode( TiXmlNode::COMMENT ) {} - TiXmlComment( const TiXmlComment& ); - void operator=( const TiXmlComment& base ); - - virtual ~TiXmlComment() {} - - /// Returns a copy of this Comment. - virtual TiXmlNode* Clone() const; - /// Write this Comment to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - /* Attribtue parsing starts: at the ! of the !-- - returns: next char past '>' - */ - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - -protected: - void CopyTo( TiXmlComment* target ) const; - - // used to be public - #ifdef TIXML_USE_STL - virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); - #endif - virtual void StreamOut( TIXML_OSTREAM * out ) const; - -private: - -}; - - -/** XML text. Contained in an element. -*/ -class TiXmlText : public TiXmlNode -{ - friend class TiXmlElement; -public: - /// Constructor. - TiXmlText (const char * initValue) : TiXmlNode (TiXmlNode::TEXT) - { - SetValue( initValue ); - } - virtual ~TiXmlText() {} - - #ifdef TIXML_USE_STL - /// Constructor. - TiXmlText( const std::string& initValue ) : TiXmlNode (TiXmlNode::TEXT) - { - SetValue( initValue ); - } - #endif - - TiXmlText( const TiXmlText& copy ) : TiXmlNode( TiXmlNode::TEXT ) { copy.CopyTo( this ); } - void operator=( const TiXmlText& base ) { base.CopyTo( this ); } - - /// Write this text object to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - -protected : - /// [internal use] Creates a new Element and returns it. - virtual TiXmlNode* Clone() const; - void CopyTo( TiXmlText* target ) const; - - virtual void StreamOut ( TIXML_OSTREAM * out ) const; - bool Blank() const; // returns true if all white space and new lines - // [internal use] - #ifdef TIXML_USE_STL - virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); - #endif - -private: -}; - - -/** In correct XML the declaration is the first entry in the file. - @verbatim - - @endverbatim - - TinyXml will happily read or write files without a declaration, - however. There are 3 possible attributes to the declaration: - version, encoding, and standalone. - - Note: In this version of the code, the attributes are - handled as special cases, not generic attributes, simply - because there can only be at most 3 and they are always the same. -*/ -class TiXmlDeclaration : public TiXmlNode -{ -public: - /// Construct an empty declaration. - TiXmlDeclaration() : TiXmlNode( TiXmlNode::DECLARATION ) {} - -#ifdef TIXML_USE_STL - /// Constructor. - TiXmlDeclaration( const std::string& _version, - const std::string& _encoding, - const std::string& _standalone ); -#endif - - /// Construct. - TiXmlDeclaration( const char* _version, - const char* _encoding, - const char* _standalone ); - - TiXmlDeclaration( const TiXmlDeclaration& copy ); - void operator=( const TiXmlDeclaration& copy ); - - virtual ~TiXmlDeclaration() {} - - /// Version. Will return an empty string if none was found. - const char *Version() const { return version.c_str (); } - /// Encoding. Will return an empty string if none was found. - const char *Encoding() const { return encoding.c_str (); } - /// Is this a standalone document? - const char *Standalone() const { return standalone.c_str (); } - - /// Creates a copy of this Declaration and returns it. - virtual TiXmlNode* Clone() const; - /// Print this declaration to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - -protected: - void CopyTo( TiXmlDeclaration* target ) const; - // used to be public - #ifdef TIXML_USE_STL - virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); - #endif - virtual void StreamOut ( TIXML_OSTREAM * out) const; - -private: - - TIXML_STRING version; - TIXML_STRING encoding; - TIXML_STRING standalone; -}; - - -/** Any tag that tinyXml doesn't recognize is saved as an - unknown. It is a tag of text, but should not be modified. - It will be written back to the XML, unchanged, when the file - is saved. - - DTD tags get thrown into TiXmlUnknowns. -*/ -class TiXmlUnknown : public TiXmlNode -{ -public: - TiXmlUnknown() : TiXmlNode( TiXmlNode::UNKNOWN ) {} - virtual ~TiXmlUnknown() {} - - TiXmlUnknown( const TiXmlUnknown& copy ) : TiXmlNode( TiXmlNode::UNKNOWN ) { copy.CopyTo( this ); } - void operator=( const TiXmlUnknown& copy ) { copy.CopyTo( this ); } - - /// Creates a copy of this Unknown and returns it. - virtual TiXmlNode* Clone() const; - /// Print this Unknown to a FILE stream. - virtual void Print( FILE* cfile, int depth ) const; - - virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); - -protected: - void CopyTo( TiXmlUnknown* target ) const; - - #ifdef TIXML_USE_STL - virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); - #endif - virtual void StreamOut ( TIXML_OSTREAM * out ) const; - -private: - -}; - - -/** Always the top level node. A document binds together all the - XML pieces. It can be saved, loaded, and printed to the screen. - The 'value' of a document node is the xml file name. -*/ -class TiXmlDocument : public TiXmlNode -{ -public: - /// Create an empty document, that has no name. - TiXmlDocument(); - /// Create a document with a name. The name of the document is also the filename of the xml. - TiXmlDocument( const char * documentName ); - - #ifdef TIXML_USE_STL - /// Constructor. - TiXmlDocument( const std::string& documentName ); - #endif - - TiXmlDocument( const TiXmlDocument& copy ); - void operator=( const TiXmlDocument& copy ); - - virtual ~TiXmlDocument() {} - - /** Load a file using the current document value. - Returns true if successful. Will delete any existing - document data before loading. - */ - bool LoadFile( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); - /// Save a file using the current document value. Returns true if successful. - bool SaveFile() const; - /// Load a file using the given filename. Returns true if successful. - bool LoadFile( const char * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); - /// Save a file using the given filename. Returns true if successful. - bool SaveFile( const char * filename ) const; - - #ifdef TIXML_USE_STL - bool LoadFile( const std::string& filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ) ///< STL std::string version. - { - StringToBuffer f( filename ); - return ( f.buffer && LoadFile( f.buffer, encoding )); - } - bool SaveFile( const std::string& filename ) const ///< STL std::string version. - { - StringToBuffer f( filename ); - return ( f.buffer && SaveFile( f.buffer )); - } - #endif - - /** Parse the given null terminated block of xml data. Passing in an encoding to this - method (either TIXML_ENCODING_LEGACY or TIXML_ENCODING_UTF8 will force TinyXml - to use that encoding, regardless of what TinyXml might otherwise try to detect. - */ - virtual const char* Parse( const char* p, TiXmlParsingData* data = 0, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); - - /** Get the root element -- the only top level element -- of the document. - In well formed XML, there should only be one. TinyXml is tolerant of - multiple elements at the document level. - */ - const TiXmlElement* RootElement() const { return FirstChildElement(); } - TiXmlElement* RootElement() { return FirstChildElement(); } - - /** If an error occurs, Error will be set to true. Also, - - The ErrorId() will contain the integer identifier of the error (not generally useful) - - The ErrorDesc() method will return the name of the error. (very useful) - - The ErrorRow() and ErrorCol() will return the location of the error (if known) - */ - bool Error() const { return error; } - - /// Contains a textual (english) description of the error if one occurs. - const char * ErrorDesc() const { return errorDesc.c_str (); } - - /** Generally, you probably want the error string ( ErrorDesc() ). But if you - prefer the ErrorId, this function will fetch it. - */ - const int ErrorId() const { return errorId; } - - /** Returns the location (if known) of the error. The first column is column 1, - and the first row is row 1. A value of 0 means the row and column wasn't applicable - (memory errors, for example, have no row/column) or the parser lost the error. (An - error in the error reporting, in that case.) - - @sa SetTabSize, Row, Column - */ - int ErrorRow() { return errorLocation.row+1; } - int ErrorCol() { return errorLocation.col+1; } ///< The column where the error occured. See ErrorRow() - - /** By calling this method, with a tab size - greater than 0, the row and column of each node and attribute is stored - when the file is loaded. Very useful for tracking the DOM back in to - the source file. - - The tab size is required for calculating the location of nodes. If not - set, the default of 4 is used. The tabsize is set per document. Setting - the tabsize to 0 disables row/column tracking. - - Note that row and column tracking is not supported when using operator>>. - - The tab size needs to be enabled before the parse or load. Correct usage: - @verbatim - TiXmlDocument doc; - doc.SetTabSize( 8 ); - doc.Load( "myfile.xml" ); - @endverbatim - - @sa Row, Column - */ - void SetTabSize( int _tabsize ) { tabsize = _tabsize; } - - int TabSize() const { return tabsize; } - - /** If you have handled the error, it can be reset with this call. The error - state is automatically cleared if you Parse a new XML block. - */ - void ClearError() { error = false; - errorId = 0; - errorDesc = ""; - errorLocation.row = errorLocation.col = 0; - //errorLocation.last = 0; - } - - /** Dump the document to standard out. */ - void Print() const { Print( stdout, 0 ); } - - /// Print this Document to a FILE stream. - virtual void Print( FILE* cfile, int depth = 0 ) const; - // [internal use] - void SetError( int err, const char* errorLocation, TiXmlParsingData* prevData, TiXmlEncoding encoding ); - -protected : - virtual void StreamOut ( TIXML_OSTREAM * out) const; - // [internal use] - virtual TiXmlNode* Clone() const; - #ifdef TIXML_USE_STL - virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); - #endif - -private: - void CopyTo( TiXmlDocument* target ) const; - - bool error; - int errorId; - TIXML_STRING errorDesc; - int tabsize; - TiXmlCursor errorLocation; -}; - - -/** - A TiXmlHandle is a class that wraps a node pointer with null checks; this is - an incredibly useful thing. Note that TiXmlHandle is not part of the TinyXml - DOM structure. It is a separate utility class. - - Take an example: - @verbatim - - - - - - - @endverbatim - - Assuming you want the value of "attributeB" in the 2nd "Child" element, it's very - easy to write a *lot* of code that looks like: - - @verbatim - TiXmlElement* root = document.FirstChildElement( "Document" ); - if ( root ) - { - TiXmlElement* element = root->FirstChildElement( "Element" ); - if ( element ) - { - TiXmlElement* child = element->FirstChildElement( "Child" ); - if ( child ) - { - TiXmlElement* child2 = child->NextSiblingElement( "Child" ); - if ( child2 ) - { - // Finally do something useful. - @endverbatim - - And that doesn't even cover "else" cases. TiXmlHandle addresses the verbosity - of such code. A TiXmlHandle checks for null pointers so it is perfectly safe - and correct to use: - - @verbatim - TiXmlHandle docHandle( &document ); - TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).Element(); - if ( child2 ) - { - // do something useful - @endverbatim - - Which is MUCH more concise and useful. - - It is also safe to copy handles - internally they are nothing more than node pointers. - @verbatim - TiXmlHandle handleCopy = handle; - @endverbatim - - What they should not be used for is iteration: - - @verbatim - int i=0; - while ( true ) - { - TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", i ).Element(); - if ( !child ) - break; - // do something - ++i; - } - @endverbatim - - It seems reasonable, but it is in fact two embedded while loops. The Child method is - a linear walk to find the element, so this code would iterate much more than it needs - to. Instead, prefer: - - @verbatim - TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).FirstChild( "Child" ).Element(); - - for( child; child; child=child->NextSiblingElement() ) - { - // do something - } - @endverbatim -*/ -class TiXmlHandle -{ -public: - /// Create a handle from any node (at any depth of the tree.) This can be a null pointer. - TiXmlHandle( TiXmlNode* node ) { this->node = node; } - /// Copy constructor - TiXmlHandle( const TiXmlHandle& ref ) { this->node = ref.node; } - TiXmlHandle operator=( const TiXmlHandle& ref ) { this->node = ref.node; return *this; } - - /// Return a handle to the first child node. - TiXmlHandle FirstChild() const; - /// Return a handle to the first child node with the given name. - TiXmlHandle FirstChild( const char * value ) const; - /// Return a handle to the first child element. - TiXmlHandle FirstChildElement() const; - /// Return a handle to the first child element with the given name. - TiXmlHandle FirstChildElement( const char * value ) const; - - /** Return a handle to the "index" child with the given name. - The first child is 0, the second 1, etc. - */ - TiXmlHandle Child( const char* value, int index ) const; - /** Return a handle to the "index" child. - The first child is 0, the second 1, etc. - */ - TiXmlHandle Child( int index ) const; - /** Return a handle to the "index" child element with the given name. - The first child element is 0, the second 1, etc. Note that only TiXmlElements - are indexed: other types are not counted. - */ - TiXmlHandle ChildElement( const char* value, int index ) const; - /** Return a handle to the "index" child element. - The first child element is 0, the second 1, etc. Note that only TiXmlElements - are indexed: other types are not counted. - */ - TiXmlHandle ChildElement( int index ) const; - - #ifdef TIXML_USE_STL - TiXmlHandle FirstChild( const std::string& _value ) const { return FirstChild( _value.c_str() ); } - TiXmlHandle FirstChildElement( const std::string& _value ) const { return FirstChildElement( _value.c_str() ); } - - TiXmlHandle Child( const std::string& _value, int index ) const { return Child( _value.c_str(), index ); } - TiXmlHandle ChildElement( const std::string& _value, int index ) const { return ChildElement( _value.c_str(), index ); } - #endif - - /// Return the handle as a TiXmlNode. This may return null. - TiXmlNode* Node() const { return node; } - /// Return the handle as a TiXmlElement. This may return null. - TiXmlElement* Element() const { return ( ( node && node->ToElement() ) ? node->ToElement() : 0 ); } - /// Return the handle as a TiXmlText. This may return null. - TiXmlText* Text() const { return ( ( node && node->ToText() ) ? node->ToText() : 0 ); } - /// Return the handle as a TiXmlUnknown. This may return null; - TiXmlUnknown* Unknown() const { return ( ( node && node->ToUnknown() ) ? node->ToUnknown() : 0 ); } - -private: - TiXmlNode* node; -}; - -#ifdef _MSC_VER -#pragma warning( default : 4530 ) -#pragma warning( default : 4786 ) -#endif - -#endif diff --git a/uppdev/YPuzzle/tinyxmlerror.cpp b/uppdev/YPuzzle/tinyxmlerror.cpp deleted file mode 100644 index 845c45c3b..000000000 --- a/uppdev/YPuzzle/tinyxmlerror.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/* -www.sourceforge.net/projects/tinyxml -Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com) - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. -*/ - -#include "tinyxml.h" - -// The goal of the seperate error file is to make the first -// step towards localization. tinyxml (currently) only supports -// latin-1, but at least the error messages could now be translated. -// -// It also cleans up the code a bit. -// - -const char* TiXmlBase::errorString[ TIXML_ERROR_STRING_COUNT ] = -{ - "No error", - "Error", - "Failed to open file", - "Memory allocation failed.", - "Error parsing Element.", - "Failed to read Element name", - "Error reading Element value.", - "Error reading Attributes.", - "Error: empty tag.", - "Error reading end tag.", - "Error parsing Unknown.", - "Error parsing Comment.", - "Error parsing Declaration.", - "Error document empty.", - "Error null (0) or unexpected EOF found in input stream.", -}; diff --git a/uppdev/YPuzzle/tinyxmlparser.cpp b/uppdev/YPuzzle/tinyxmlparser.cpp deleted file mode 100644 index c1a144fc9..000000000 --- a/uppdev/YPuzzle/tinyxmlparser.cpp +++ /dev/null @@ -1,1507 +0,0 @@ -/* -www.sourceforge.net/projects/tinyxml -Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com) - -This software is provided 'as-is', without any express or implied -warranty. In no event will the authors be held liable for any -damages arising from the use of this software. - -Permission is granted to anyone to use this software for any -purpose, including commercial applications, and to alter it and -redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must -not claim that you wrote the original software. If you use this -software in a product, an acknowledgment in the product documentation -would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and -must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source -distribution. -*/ - -#include "tinyxml.h" -#include -#include - -//#define DEBUG_PARSER - -// Note tha "PutString" hardcodes the same list. This -// is less flexible than it appears. Changing the entries -// or order will break putstring. -TiXmlBase::Entity TiXmlBase::entity[ NUM_ENTITY ] = -{ - { "&", 5, '&' }, - { "<", 4, '<' }, - { ">", 4, '>' }, - { """, 6, '\"' }, - { "'", 6, '\'' } -}; - -// Bunch of unicode info at: -// http://www.unicode.org/faq/utf_bom.html -// Including the basic of this table, which determines the #bytes in the -// sequence from the lead byte. 1 placed for invalid sequences -- -// although the result will be junk, pass it through as much as possible. -// Beware of the non-characters in UTF-8: -// ef bb bf (Microsoft "lead bytes") -// ef bf be -// ef bf bf - -const unsigned char TIXML_UTF_LEAD_0 = 0xefU; -const unsigned char TIXML_UTF_LEAD_1 = 0xbbU; -const unsigned char TIXML_UTF_LEAD_2 = 0xbfU; - -const int TiXmlBase::utf8ByteTable[256] = -{ - // 0 1 2 3 4 5 6 7 8 9 a b c d e f - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x00 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x10 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x20 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x30 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x40 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x50 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x60 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x70 End of ASCII range - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x80 0x80 to 0xc1 invalid - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x90 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xa0 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xb0 - 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xc0 0xc2 to 0xdf 2 byte - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xd0 - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 0xe0 0xe0 to 0xef 3 byte - 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // 0xf0 0xf0 to 0xf4 4 byte, 0xf5 and higher invalid -}; - - -void TiXmlBase::ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ) -{ - const unsigned long BYTE_MASK = 0xBF; - const unsigned long BYTE_MARK = 0x80; - const unsigned long FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; - - if (input < 0x80) - *length = 1; - else if ( input < 0x800 ) - *length = 2; - else if ( input < 0x10000 ) - *length = 3; - else if ( input < 0x200000 ) - *length = 4; - else - { *length = 0; return; } // This code won't covert this correctly anyway. - - output += *length; - - // Scary scary fall throughs. - switch (*length) - { - case 4: - --output; - *output = (char)((input | BYTE_MARK) & BYTE_MASK); - input >>= 6; - case 3: - --output; - *output = (char)((input | BYTE_MARK) & BYTE_MASK); - input >>= 6; - case 2: - --output; - *output = (char)((input | BYTE_MARK) & BYTE_MASK); - input >>= 6; - case 1: - --output; - *output = (char)(input | FIRST_BYTE_MARK[*length]); - } -} - - -/*static*/ int TiXmlBase::IsAlpha( unsigned char anyByte, TiXmlEncoding /*encoding*/ ) -{ - // This will only work for low-ascii, everything else is assumed to be a valid - // letter. I'm not sure this is the best approach, but it is quite tricky trying - // to figure out alhabetical vs. not across encoding. So take a very - // conservative approach. - -// if ( encoding == TIXML_ENCODING_UTF8 ) -// { - if ( anyByte < 127 ) - return isalpha( anyByte ); - else - return 1; // What else to do? The unicode set is huge...get the english ones right. -// } -// else -// { -// return isalpha( anyByte ); -// } -} - - -/*static*/ int TiXmlBase::IsAlphaNum( unsigned char anyByte, TiXmlEncoding /*encoding*/ ) -{ - // This will only work for low-ascii, everything else is assumed to be a valid - // letter. I'm not sure this is the best approach, but it is quite tricky trying - // to figure out alhabetical vs. not across encoding. So take a very - // conservative approach. - -// if ( encoding == TIXML_ENCODING_UTF8 ) -// { - if ( anyByte < 127 ) - return isalnum( anyByte ); - else - return 1; // What else to do? The unicode set is huge...get the english ones right. -// } -// else -// { -// return isalnum( anyByte ); -// } -} - - -class TiXmlParsingData -{ - friend class TiXmlDocument; - public: - void Stamp( const char* now, TiXmlEncoding encoding ); - - const TiXmlCursor& Cursor() { return cursor; } - - private: - // Only used by the document! - TiXmlParsingData( const char* start, int _tabsize, int row, int col ) - { - assert( start ); - stamp = start; - tabsize = _tabsize; - cursor.row = row; - cursor.col = col; - } - - TiXmlCursor cursor; - const char* stamp; - int tabsize; -}; - - -void TiXmlParsingData::Stamp( const char* now, TiXmlEncoding encoding ) -{ - assert( now ); - - // Do nothing if the tabsize is 0. - if ( tabsize < 1 ) - { - return; - } - - // Get the current row, column. - int row = cursor.row; - int col = cursor.col; - const char* p = stamp; - assert( p ); - - while ( p < now ) - { - // Treat p as unsigned, so we have a happy compiler. - const unsigned char* pU = (const unsigned char*)p; - - // Code contributed by Fletcher Dunn: (modified by lee) - switch (*pU) { - case 0: - // We *should* never get here, but in case we do, don't - // advance past the terminating null character, ever - return; - - case '\r': - // bump down to the next line - ++row; - col = 0; - // Eat the character - ++p; - - // Check for \r\n sequence, and treat this as a single character - if (*p == '\n') { - ++p; - } - break; - - case '\n': - // bump down to the next line - ++row; - col = 0; - - // Eat the character - ++p; - - // Check for \n\r sequence, and treat this as a single - // character. (Yes, this bizarre thing does occur still - // on some arcane platforms...) - if (*p == '\r') { - ++p; - } - break; - - case '\t': - // Eat the character - ++p; - - // Skip to next tab stop - col = (col / tabsize + 1) * tabsize; - break; - - case TIXML_UTF_LEAD_0: - if ( encoding == TIXML_ENCODING_UTF8 ) - { - if ( *(p+1) && *(p+2) ) - { - // In these cases, don't advance the column. These are - // 0-width spaces. - if ( *(pU+1)==TIXML_UTF_LEAD_1 && *(pU+2)==TIXML_UTF_LEAD_2 ) - p += 3; - else if ( *(pU+1)==0xbfU && *(pU+2)==0xbeU ) - p += 3; - else if ( *(pU+1)==0xbfU && *(pU+2)==0xbfU ) - p += 3; - else - { p +=3; ++col; } // A normal character. - } - } - else - { - ++p; - ++col; - } - break; - - default: - if ( encoding == TIXML_ENCODING_UTF8 ) - { - // Eat the 1 to 4 byte utf8 character. - int step = TiXmlBase::utf8ByteTable[*((unsigned char*)p)]; - if ( step == 0 ) - step = 1; // Error case from bad encoding, but handle gracefully. - p += step; - - // Just advance one column, of course. - ++col; - } - else - { - ++p; - ++col; - } - break; - } - } - cursor.row = row; - cursor.col = col; - assert( cursor.row >= -1 ); - assert( cursor.col >= -1 ); - stamp = p; - assert( stamp ); -} - - -const char* TiXmlBase::SkipWhiteSpace( const char* p, TiXmlEncoding encoding ) -{ - if ( !p || !*p ) - { - return 0; - } - if ( encoding == TIXML_ENCODING_UTF8 ) - { - while ( *p ) - { - const unsigned char* pU = (const unsigned char*)p; - - // Skip the stupid Microsoft UTF-8 Byte order marks - if ( *(pU+0)==TIXML_UTF_LEAD_0 - && *(pU+1)==TIXML_UTF_LEAD_1 - && *(pU+2)==TIXML_UTF_LEAD_2 ) - { - p += 3; - continue; - } - else if(*(pU+0)==TIXML_UTF_LEAD_0 - && *(pU+1)==0xbfU - && *(pU+2)==0xbeU ) - { - p += 3; - continue; - } - else if(*(pU+0)==TIXML_UTF_LEAD_0 - && *(pU+1)==0xbfU - && *(pU+2)==0xbfU ) - { - p += 3; - continue; - } - - if ( IsWhiteSpace( *p ) || *p == '\n' || *p =='\r' ) // Still using old rules for white space. - ++p; - else - break; - } - } - else - { - while ( *p && IsWhiteSpace( *p ) || *p == '\n' || *p =='\r' ) - ++p; - } - - return p; -} - -#ifdef TIXML_USE_STL -/*static*/ bool TiXmlBase::StreamWhiteSpace( TIXML_ISTREAM * in, TIXML_STRING * tag ) -{ - for( ;; ) - { - if ( !in->good() ) return false; - - int c = in->peek(); - // At this scope, we can't get to a document. So fail silently. - if ( !IsWhiteSpace( c ) || c <= 0 ) - return true; - - *tag += (char) in->get(); - } -} - -/*static*/ bool TiXmlBase::StreamTo( TIXML_ISTREAM * in, int character, TIXML_STRING * tag ) -{ - //assert( character > 0 && character < 128 ); // else it won't work in utf-8 - while ( in->good() ) - { - int c = in->peek(); - if ( c == character ) - return true; - if ( c <= 0 ) // Silent failure: can't get document at this scope - return false; - - in->get(); - *tag += (char) c; - } - return false; -} -#endif - -const char* TiXmlBase::ReadName( const char* p, TIXML_STRING * name, TiXmlEncoding encoding ) -{ - *name = ""; - assert( p ); - - // Names start with letters or underscores. - // Of course, in unicode, tinyxml has no idea what a letter *is*. The - // algorithm is generous. - // - // After that, they can be letters, underscores, numbers, - // hyphens, or colons. (Colons are valid ony for namespaces, - // but tinyxml can't tell namespaces from names.) - if ( p && *p - && ( IsAlpha( (unsigned char) *p, encoding ) || *p == '_' ) ) - { - while( p && *p - && ( IsAlphaNum( (unsigned char ) *p, encoding ) - || *p == '_' - || *p == '-' - || *p == '.' - || *p == ':' ) ) - { - (*name) += *p; - ++p; - } - return p; - } - return 0; -} - -const char* TiXmlBase::GetEntity( const char* p, char* value, int* length, TiXmlEncoding encoding ) -{ - // Presume an entity, and pull it out. - TIXML_STRING ent; - int i; - *length = 0; - - if ( *(p+1) && *(p+1) == '#' && *(p+2) ) - { - unsigned long ucs = 0; - ptrdiff_t delta = 0; - unsigned mult = 1; - - if ( *(p+2) == 'x' ) - { - // Hexadecimal. - if ( !*(p+3) ) return 0; - - const char* q = p+3; - q = strchr( q, ';' ); - - if ( !q || !*q ) return 0; - - delta = q-p; - --q; - - while ( *q != 'x' ) - { - if ( *q >= '0' && *q <= '9' ) - ucs += mult * (*q - '0'); - else if ( *q >= 'a' && *q <= 'f' ) - ucs += mult * (*q - 'a' + 10); - else if ( *q >= 'A' && *q <= 'F' ) - ucs += mult * (*q - 'A' + 10 ); - else - return 0; - mult *= 16; - --q; - } - } - else - { - // Decimal. - if ( !*(p+2) ) return 0; - - const char* q = p+2; - q = strchr( q, ';' ); - - if ( !q || !*q ) return 0; - - delta = q-p; - --q; - - while ( *q != '#' ) - { - if ( *q >= '0' && *q <= '9' ) - ucs += mult * (*q - '0'); - else - return 0; - mult *= 10; - --q; - } - } - if ( encoding == TIXML_ENCODING_UTF8 ) - { - // convert the UCS to UTF-8 - ConvertUTF32ToUTF8( ucs, value, length ); - } - else - { - *value = (char)ucs; - *length = 1; - } - return p + delta + 1; - } - - // Now try to match it. - for( i=0; iappend( cArr, len ); - } - } - else - { - bool whitespace = false; - - // Remove leading white space: - p = SkipWhiteSpace( p, encoding ); - while ( p && *p - && !StringEqual( p, endTag, caseInsensitive, encoding ) ) - { - if ( *p == '\r' || *p == '\n' ) - { - whitespace = true; - ++p; - } - else if ( IsWhiteSpace( *p ) ) - { - whitespace = true; - ++p; - } - else - { - // If we've found whitespace, add it before the - // new character. Any whitespace just becomes a space. - if ( whitespace ) - { - (*text) += ' '; - whitespace = false; - } - int len; - char cArr[4] = { 0, 0, 0, 0 }; - p = GetChar( p, cArr, &len, encoding ); - if ( len == 1 ) - (*text) += cArr[0]; // more efficient - else - text->append( cArr, len ); - } - } - } - return p + strlen( endTag ); -} - -#ifdef TIXML_USE_STL - -void TiXmlDocument::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ) -{ - // The basic issue with a document is that we don't know what we're - // streaming. Read something presumed to be a tag (and hope), then - // identify it, and call the appropriate stream method on the tag. - // - // This "pre-streaming" will never read the closing ">" so the - // sub-tag can orient itself. - - if ( !StreamTo( in, '<', tag ) ) - { - SetError( TIXML_ERROR_PARSING_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); - return; - } - - while ( in->good() ) - { - int tagIndex = (int) tag->length(); - while ( in->good() && in->peek() != '>' ) - { - int c = in->get(); - if ( c <= 0 ) - { - SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); - break; - } - (*tag) += (char) c; - } - - if ( in->good() ) - { - // We now have something we presume to be a node of - // some sort. Identify it, and call the node to - // continue streaming. - TiXmlNode* node = Identify( tag->c_str() + tagIndex, TIXML_DEFAULT_ENCODING ); - - if ( node ) - { - node->StreamIn( in, tag ); - bool isElement = node->ToElement() != 0; - delete node; - node = 0; - - // If this is the root element, we're done. Parsing will be - // done by the >> operator. - if ( isElement ) - { - return; - } - } - else - { - SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN ); - return; - } - } - } - // We should have returned sooner. - SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN ); -} - -#endif - -const char* TiXmlDocument::Parse( const char* p, TiXmlParsingData* prevData, TiXmlEncoding encoding ) -{ - ClearError(); - - // Parse away, at the document level. Since a document - // contains nothing but other tags, most of what happens - // here is skipping white space. - if ( !p || !*p ) - { - SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); - return 0; - } - - // Note that, for a document, this needs to come - // before the while space skip, so that parsing - // starts from the pointer we are given. - location.Clear(); - if ( prevData ) - { - location.row = prevData->cursor.row; - location.col = prevData->cursor.col; - } - else - { - location.row = 0; - location.col = 0; - } - TiXmlParsingData data( p, TabSize(), location.row, location.col ); - location = data.Cursor(); - - if ( encoding == TIXML_ENCODING_UNKNOWN ) - { - // Check for the Microsoft UTF-8 lead bytes. - const unsigned char* pU = (const unsigned char*)p; - if ( *(pU+0) && *(pU+0) == TIXML_UTF_LEAD_0 - && *(pU+1) && *(pU+1) == TIXML_UTF_LEAD_1 - && *(pU+2) && *(pU+2) == TIXML_UTF_LEAD_2 ) - { - encoding = TIXML_ENCODING_UTF8; - } - } - - p = SkipWhiteSpace( p, encoding ); - if ( !p ) - { - SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); - return 0; - } - - while ( p && *p ) - { - TiXmlNode* node = Identify( p, encoding ); - if ( node ) - { - p = node->Parse( p, &data, encoding ); - LinkEndChild( node ); - } - else - { - break; - } - - // Did we get encoding info? - if ( encoding == TIXML_ENCODING_UNKNOWN - && node->ToDeclaration() ) - { - TiXmlDeclaration* dec = node->ToDeclaration(); - const char* enc = dec->Encoding(); - assert( enc ); - - if ( *enc == 0 ) - encoding = TIXML_ENCODING_UTF8; - else if ( StringEqual( enc, "UTF-8", true, TIXML_ENCODING_UNKNOWN ) ) - encoding = TIXML_ENCODING_UTF8; - else if ( StringEqual( enc, "UTF8", true, TIXML_ENCODING_UNKNOWN ) ) - encoding = TIXML_ENCODING_UTF8; // incorrect, but be nice - else - encoding = TIXML_ENCODING_LEGACY; - } - - p = SkipWhiteSpace( p, encoding ); - } - - // Was this empty? - if ( !firstChild ) { - SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, encoding ); - return 0; - } - - // All is well. - return p; -} - -void TiXmlDocument::SetError( int err, const char* pError, TiXmlParsingData* data, TiXmlEncoding encoding ) -{ - // The first error in a chain is more accurate - don't set again! - if ( error ) - return; - - assert( err > 0 && err < TIXML_ERROR_STRING_COUNT ); - error = true; - errorId = err; - errorDesc = errorString[ errorId ]; - - errorLocation.Clear(); - if ( pError && data ) - { - //TiXmlParsingData data( pError, prevData ); - data->Stamp( pError, encoding ); - errorLocation = data->Cursor(); - } -} - - -TiXmlNode* TiXmlNode::Identify( const char* p, TiXmlEncoding encoding ) -{ - TiXmlNode* returnNode = 0; - - p = SkipWhiteSpace( p, encoding ); - if( !p || !*p || *p != '<' ) - { - return 0; - } - - TiXmlDocument* doc = GetDocument(); - p = SkipWhiteSpace( p, encoding ); - - if ( !p || !*p ) - { - return 0; - } - - // What is this thing? - // - Elements start with a letter or underscore, but xml is reserved. - // - Comments: "; - - if ( !StringEqual( p, startTag, false, encoding ) ) - { - document->SetError( TIXML_ERROR_PARSING_COMMENT, p, data, encoding ); - return 0; - } - p += strlen( startTag ); - p = ReadText( p, &value, false, endTag, false, encoding ); - return p; -} - - -const char* TiXmlAttribute::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ) -{ - p = SkipWhiteSpace( p, encoding ); - if ( !p || !*p ) return 0; - - int tabsize = 4; - if ( document ) - tabsize = document->TabSize(); - -// TiXmlParsingData data( p, prevData ); - if ( data ) - { - data->Stamp( p, encoding ); - location = data->Cursor(); - } - // Read the name, the '=' and the value. - const char* pErr = p; - p = ReadName( p, &name, encoding ); - if ( !p || !*p ) - { - if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, pErr, data, encoding ); - return 0; - } - p = SkipWhiteSpace( p, encoding ); - if ( !p || !*p || *p != '=' ) - { - if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); - return 0; - } - - ++p; // skip '=' - p = SkipWhiteSpace( p, encoding ); - if ( !p || !*p ) - { - if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); - return 0; - } - - const char* end; - - if ( *p == '\'' ) - { - ++p; - end = "\'"; - p = ReadText( p, &value, false, end, false, encoding ); - } - else if ( *p == '"' ) - { - ++p; - end = "\""; - p = ReadText( p, &value, false, end, false, encoding ); - } - else - { - // All attribute values should be in single or double quotes. - // But this is such a common error that the parser will try - // its best, even without them. - value = ""; - while ( p && *p // existence - && !IsWhiteSpace( *p ) && *p != '\n' && *p != '\r' // whitespace - && *p != '/' && *p != '>' ) // tag end - { - value += *p; - ++p; - } - } - return p; -} - -#ifdef TIXML_USE_STL -void TiXmlText::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ) -{ - while ( in->good() ) - { - int c = in->peek(); - if ( c == '<' ) - return; - if ( c <= 0 ) - { - TiXmlDocument* document = GetDocument(); - if ( document ) - document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); - return; - } - - (*tag) += (char) c; - in->get(); - } -} -#endif - -const char* TiXmlText::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ) -{ - value = ""; -// TiXmlParsingData data( p, prevData ); - if ( data ) - { - data->Stamp( p, encoding ); - location = data->Cursor(); - } - bool ignoreWhite = true; - - const char* end = "<"; - p = ReadText( p, &value, ignoreWhite, end, false, encoding ); - if ( p ) - return p-1; // don't truncate the '<' - return 0; -} - -#ifdef TIXML_USE_STL -void TiXmlDeclaration::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ) -{ - while ( in->good() ) - { - int c = in->get(); - if ( c <= 0 ) - { - TiXmlDocument* document = GetDocument(); - if ( document ) - document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); - return; - } - (*tag) += (char) c; - - if ( c == '>' ) - { - // All is well. - return; - } - } -} -#endif - -const char* TiXmlDeclaration::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding _encoding ) -{ - p = SkipWhiteSpace( p, _encoding ); - // Find the beginning, find the end, and look for - // the stuff in-between. - TiXmlDocument* document = GetDocument(); - if ( !p || !*p || !StringEqual( p, "SetError( TIXML_ERROR_PARSING_DECLARATION, 0, 0, _encoding ); - return 0; - } -// TiXmlParsingData data( p, prevData ); - if ( data ) - { - data->Stamp( p, _encoding ); - location = data->Cursor(); - } - p += 5; - - version = ""; - encoding = ""; - standalone = ""; - - while ( p && *p ) - { - if ( *p == '>' ) - { - ++p; - return p; - } - - p = SkipWhiteSpace( p, _encoding ); - if ( StringEqual( p, "version", true, _encoding ) ) - { - TiXmlAttribute attrib; - p = attrib.Parse( p, data, _encoding ); - version = attrib.Value(); - } - else if ( StringEqual( p, "encoding", true, _encoding ) ) - { - TiXmlAttribute attrib; - p = attrib.Parse( p, data, _encoding ); - encoding = attrib.Value(); - } - else if ( StringEqual( p, "standalone", true, _encoding ) ) - { - TiXmlAttribute attrib; - p = attrib.Parse( p, data, _encoding ); - standalone = attrib.Value(); - } - else - { - // Read over whatever it is. - while( p && *p && *p != '>' && !IsWhiteSpace( *p ) ) - ++p; - } - } - return 0; -} - -bool TiXmlText::Blank() const -{ - for ( unsigned i=0; i - -using namespace Upp; - -bool ZLoad(Callback1 serialize, Stream& stream, int version = Null) -{ - String h = stream.GetLine(); - if(h != "COMPRESSED") - return false; - int64 sz = stream.Get64(); - Zlib zlib; - InFilterStream in(stream, zlib); - zlib.Decompress(); - in.SetSize(sz); - return Load(serialize, in, version); -} - -bool ZStore(Callback1 serialize, Stream& stream, int version = Null) -{ - stream.Put("COMPRESSED\n"); - int sz_pos = stream.GetPos(); - stream.Put64(0); - Zlib zlib; - OutFilterStream out(stream, zlib); - zlib.Compress(); - if(!Store(serialize, out, version)) - return false; - out.Close(); - int64 sz = out.GetPos(); - stream.Seek(sz_pos); - stream.Put64(sz); - return !stream.IsError(); -} - -template -bool ZLoad(T& x, Stream& s, int version = Null) { - return ZLoad(SerializeCb(x), s, version); -} - -template -bool ZStore(T& x, Stream& s, int version = Null) { - return ZStore(SerializeCb(x), s, version); -} - -/* -template -bool ZLoadFromFile(T& x, const char *name = NULL, int version = Null) { - return LoadFromFile(SerializeCb(x), name, version); -} - -template -bool StoreToFile(T& x, const char *name = NULL, int version = Null) { - return StoreToFile(SerializeCb(x), name, version); -} -*/ -template -String ZStoreAsString(T& x) { - StringStream ss; - ZStore(x, ss); - return ss; -} - -template -bool ZLoadFromString(T& x, const String& s) { - StringStream ss(s); - return ZLoad(x, ss); -} - -CONSOLE_APP_MAIN -{ - String data; - for(int i = 0; i < 10000; i++) - data << AsString(i) << ": " << AsString(Uuid::Create()) << '\n'; - - -// --------------------------------------------------------------- - String path = GetHomeDirFile("test.z"); - { - FileOut fout(path); - DDUMP(data.GetLength()); - int64 sz_pos = fout.GetPos(); - fout.Put64(0); - Zlib zlib; - OutFilterStream out(fout, zlib); - zlib.Compress(); - out % data; - int64 sz = out.GetPos(); - out.Close(); - fout.Seek(sz_pos); - fout.Put64(sz); - } - - String data2; - { - FileIn fin(path); - int64 sz = fin.Get64(); - Zlib zlib; - InFilterStream in(fin, zlib); - zlib.Decompress(); - in.SetSize(sz); - in % data2; - } - - ASSERT(data == data2); - - DLOG("========================"); - data = LoadFile(GetDataFile("FilterStream.cpp")); - String h = ZStoreAsString(data); - DDUMP(data.GetCount()); - DDUMP(ZCompress(data).GetCount()); - DDUMP(h.GetCount()); - ZLoadFromString(data2, h); - - - - ASSERT(data == data2); -} diff --git a/uppdev/ZSerialize/ZSerialize.upp b/uppdev/ZSerialize/ZSerialize.upp deleted file mode 100644 index 7503b16c7..000000000 --- a/uppdev/ZSerialize/ZSerialize.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - Core; - -file - ZSerialize.cpp; - -mainconfig - "" = ""; - diff --git a/uppdev/ZSerialize/init b/uppdev/ZSerialize/init deleted file mode 100644 index d6ebef1cd..000000000 --- a/uppdev/ZSerialize/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _ZSerialize_icpp_init_stub -#define _ZSerialize_icpp_init_stub -#include "Core/init" -#endif diff --git a/uppdev/_thread/_thread.cpp b/uppdev/_thread/_thread.cpp deleted file mode 100644 index 5f0383bde..000000000 --- a/uppdev/_thread/_thread.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include - -__thread int test; - -CONSOLE_APP_MAIN -{ - test++; -} diff --git a/uppdev/_thread/_thread.upp b/uppdev/_thread/_thread.upp deleted file mode 100644 index 3b6692637..000000000 --- a/uppdev/_thread/_thread.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - Core; - -file - _thread.cpp; - -mainconfig - "" = "MT"; - diff --git a/uppdev/agg24/agg24.h b/uppdev/agg24/agg24.h deleted file mode 100644 index 993e5ea3c..000000000 --- a/uppdev/agg24/agg24.h +++ /dev/null @@ -1,155 +0,0 @@ -#ifndef AGG24_H_INCLUDED -#define AGG24_H_INCLUDED - -// dolik.rce: -// this file includes almost all headers from agg 2.4, it's meant for the lazy poeple like me, -// who don't want to include each file separately and who don't care about including lots -// of unnecessary code :-) - -#include // to get PLATFORM_XXX macros... - -#include "agg_alpha_mask_u8.h" -#include "agg_arc.h" -#include "agg_array.h" -#include "agg_arrowhead.h" -#include "agg_basics.h" -#include "agg_bezier_arc.h" -#include "agg_bezier_ctrl.h" -#include "agg_bitset_iterator.h" -#include "agg_blur.h" -#include "agg_bounding_rect.h" -#include "agg_bspline.h" -#include "agg_cbox_ctrl.h" -#include "agg_clip_liang_barsky.h" -#include "agg_color_conv.h" -#include "agg_color_conv_rgb16.h" -#include "agg_color_conv_rgb8.h" -#include "agg_color_gray.h" -#include "agg_color_rgba.h" -#include "agg_config.h" -#include "agg_conv_adaptor_vcgen.h" -#include "agg_conv_adaptor_vpgen.h" -#include "agg_conv_bspline.h" -#include "agg_conv_clip_polygon.h" -#include "agg_conv_clip_polyline.h" -#include "agg_conv_close_polygon.h" -#include "agg_conv_concat.h" -#include "agg_conv_contour.h" -#include "agg_conv_curve.h" -#include "agg_conv_dash.h" -#include "agg_conv_gpc.h" -#include "agg_conv_marker_adaptor.h" -#include "agg_conv_marker.h" -#include "agg_conv_segmentator.h" -#include "agg_conv_shorten_path.h" -#include "agg_conv_smooth_poly1.h" -#include "agg_conv_stroke.h" -#include "agg_conv_transform.h" -#include "agg_conv_unclose_polygon.h" -#include "agg_ctrl.h" -#include "agg_curves.h" -#include "agg_dda_line.h" -#include "agg_ellipse_bresenham.h" -#include "agg_ellipse.h" -#include "agg_embedded_raster_fonts.h" -#include "agg_font_cache_manager.h" -#include "agg_font_freetype.h" -#include "agg_gamma_ctrl.h" -#include "agg_gamma_functions.h" -#include "agg_gamma_lut.h" -#include "agg_gamma_spline.h" -#include "agg_glyph_raster_bin.h" -#include "agg_gradient_lut.h" -#include "agg_gsv_text.h" -#include "agg_image_accessors.h" -#include "agg_image_filters.h" -#include "agg_line_aa_basics.h" -#include "agg_math.h" -#include "agg_math_stroke.h" -#include "agg_path_length.h" -#include "agg_path_storage.h" -#include "agg_path_storage_integer.h" -#include "agg_pattern_filters_rgba.h" -#include "agg_pixfmt_amask_adaptor.h" -#include "agg_pixfmt_gray.h" -#include "agg_pixfmt_rgba.h" -#include "agg_pixfmt_rgb.h" -#include "agg_pixfmt_rgb_packed.h" -#include "agg_pixfmt_transposer.h" -#include "agg_polygon_ctrl.h" -#include "agg_rasterizer_cells_aa.h" -#include "agg_rasterizer_compound_aa.h" -#include "agg_rasterizer_outline_aa.h" -#include "agg_rasterizer_outline.h" -#include "agg_rasterizer_scanline_aa.h" -#include "agg_rasterizer_sl_clip.h" -#include "agg_rbox_ctrl.h" -#include "agg_renderer_base.h" -#include "agg_renderer_markers.h" -#include "agg_renderer_mclip.h" -#include "agg_renderer_outline_aa.h" -#include "agg_renderer_outline_image.h" -#include "agg_renderer_primitives.h" -#include "agg_renderer_raster_text.h" -#include "agg_renderer_scanline.h" -#include "agg_rendering_buffer_dynarow.h" -#include "agg_rendering_buffer.h" -#include "agg_rounded_rect.h" -#include "agg_scale_ctrl.h" -#include "agg_scanline_bin.h" -#include "agg_scanline_boolean_algebra.h" -#include "agg_scanline_p.h" -#include "agg_scanline_storage_aa.h" -#include "agg_scanline_storage_bin.h" -#include "agg_scanline_u.h" -#include "agg_shorten_path.h" -#include "agg_simul_eq.h" -#include "agg_slider_ctrl.h" -#include "agg_span_allocator.h" -#include "agg_span_converter.h" -#include "agg_span_gouraud_gray.h" -#include "agg_span_gouraud.h" -#include "agg_span_gouraud_rgba.h" -#include "agg_span_gradient_alpha.h" -#include "agg_span_gradient.h" -#include "agg_span_image_filter_gray.h" -#include "agg_span_image_filter.h" -#include "agg_span_image_filter_rgba.h" -#include "agg_span_image_filter_rgb.h" -#include "agg_span_interpolator_adaptor.h" -#include "agg_span_interpolator_linear.h" -#include "agg_span_interpolator_persp.h" -#include "agg_span_interpolator_trans.h" -#include "agg_span_pattern_gray.h" -#include "agg_span_pattern_rgba.h" -#include "agg_span_pattern_rgb.h" -#include "agg_span_solid.h" -#include "agg_span_subdiv_adaptor.h" -#include "agg_spline_ctrl.h" -#include "agg_trans_affine.h" -#include "agg_trans_bilinear.h" -#include "agg_trans_double_path.h" -#include "agg_trans_perspective.h" -#include "agg_trans_single_path.h" -#include "agg_trans_viewport.h" -#include "agg_trans_warp_magnifier.h" -#include "agg_vcgen_bspline.h" -#include "agg_vcgen_contour.h" -#include "agg_vcgen_dash.h" -#include "agg_vcgen_markers_term.h" -#include "agg_vcgen_smooth_poly1.h" -#include "agg_vcgen_stroke.h" -#include "agg_vcgen_vertex_sequence.h" -#include "agg_vertex_sequence.h" -#include "agg_vpgen_clip_polygon.h" -#include "agg_vpgen_clip_polyline.h" -#include "agg_vpgen_segmentator.h" -#include "gpc.h" -#ifdef PLATFORM_WIN32 - #include "agg_font_win32_tt.h" - #include "agg_win32_bmp.h" -#endif -#ifdef PLATFORM_OSX11 - #include "agg_mac_pmap.h" -#endif -#endif diff --git a/uppdev/agg24/agg24.upp b/uppdev/agg24/agg24.upp deleted file mode 100644 index 41d88cdc4..000000000 --- a/uppdev/agg24/agg24.upp +++ /dev/null @@ -1,198 +0,0 @@ -optimize_speed; - -uses - Core; - -library(LINUX) X11; - -library(LINUX) dl; - -file - agg24.h, - agg_platform_support.h, - agg_platform_support.cpp, - agg_alpha_mask_u8.h, - agg_font_freetype.cpp, - agg_font_freetype.h, - agg_font_win32_tt.cpp, - agg_font_win32_tt.h, - gpc.h, - gpc.c, - agg_arc.cpp, - agg_arc.h, - agg_array.h, - agg_arrowhead.cpp, - agg_arrowhead.h, - agg_basics.h, - agg_bezier_arc.cpp, - agg_bezier_arc.h, - agg_bitset_iterator.h, - agg_blur.h, - agg_bounding_rect.h, - agg_bspline.cpp, - agg_bspline.h, - agg_clip_liang_barsky.h, - agg_color_gray.h, - agg_color_rgba.h, - agg_config.h, - agg_conv_adaptor_vcgen.h, - agg_conv_adaptor_vpgen.h, - agg_conv_bspline.h, - agg_conv_clip_polygon.h, - agg_conv_clip_polyline.h, - agg_conv_close_polygon.h, - agg_conv_concat.h, - agg_conv_contour.h, - agg_conv_curve.h, - agg_conv_dash.h, - agg_conv_gpc.h, - agg_conv_marker_adaptor.h, - agg_conv_marker.h, - agg_conv_segmentator.h, - agg_conv_shorten_path.h, - agg_conv_smooth_poly1.h, - agg_conv_stroke.h, - agg_conv_transform.h, - agg_conv_unclose_polygon.h, - agg_curves.cpp, - agg_curves.h, - agg_dda_line.h, - agg_ellipse_bresenham.h, - agg_ellipse.h, - agg_embedded_raster_fonts.cpp, - agg_embedded_raster_fonts.h, - agg_font_cache_manager.h, - agg_gamma_functions.h, - agg_gamma_lut.h, - agg_glyph_raster_bin.h, - agg_gradient_lut.h, - agg_gsv_text.cpp, - agg_gsv_text.h, - agg_image_accessors.h, - agg_image_filters.cpp, - agg_image_filters.h, - agg_line_aa_basics.cpp, - agg_line_aa_basics.h, - agg_line_profile_aa.cpp, - agg_math.h, - agg_math_stroke.h, - agg_path_length.h, - agg_path_storage.h, - agg_path_storage_integer.h, - agg_pattern_filters_rgba.h, - agg_pixfmt_amask_adaptor.h, - agg_pixfmt_gray.h, - agg_pixfmt_rgba.h, - agg_pixfmt_rgb.h, - agg_pixfmt_rgb_packed.h, - agg_pixfmt_transposer.h, - agg_rasterizer_cells_aa.h, - agg_rasterizer_compound_aa.h, - agg_rasterizer_outline_aa.h, - agg_rasterizer_outline.h, - agg_rasterizer_scanline_aa.h, - agg_rasterizer_sl_clip.h, - agg_renderer_base.h, - agg_renderer_markers.h, - agg_renderer_mclip.h, - agg_renderer_outline_aa.h, - agg_renderer_outline_image.h, - agg_renderer_primitives.h, - agg_renderer_raster_text.h, - agg_renderer_scanline.h, - agg_rendering_buffer_dynarow.h, - agg_rendering_buffer.h, - agg_rounded_rect.cpp, - agg_rounded_rect.h, - agg_scanline_bin.h, - agg_scanline_boolean_algebra.h, - agg_scanline_p.h, - agg_scanline_storage_aa.h, - agg_scanline_storage_bin.h, - agg_scanline_u.h, - agg_shorten_path.h, - agg_simul_eq.h, - agg_span_allocator.h, - agg_span_converter.h, - agg_span_gouraud_gray.h, - agg_span_gouraud.h, - agg_span_gouraud_rgba.h, - agg_span_gradient_alpha.h, - agg_span_gradient.h, - agg_span_image_filter_gray.h, - agg_span_image_filter.h, - agg_span_image_filter_rgba.h, - agg_span_image_filter_rgb.h, - agg_span_interpolator_adaptor.h, - agg_span_interpolator_linear.h, - agg_span_interpolator_persp.h, - agg_span_interpolator_trans.h, - agg_span_pattern_gray.h, - agg_span_pattern_rgba.h, - agg_span_pattern_rgb.h, - agg_span_solid.h, - agg_span_subdiv_adaptor.h, - agg_sqrt_tables.cpp, - agg_trans_affine.cpp, - agg_trans_affine.h, - agg_trans_bilinear.h, - agg_trans_double_path.cpp, - agg_trans_double_path.h, - agg_trans_perspective.h, - agg_trans_single_path.cpp, - agg_trans_single_path.h, - agg_trans_viewport.h, - agg_trans_warp_magnifier.cpp, - agg_trans_warp_magnifier.h, - agg_vcgen_bspline.cpp, - agg_vcgen_bspline.h, - agg_vcgen_contour.cpp, - agg_vcgen_contour.h, - agg_vcgen_dash.cpp, - agg_vcgen_dash.h, - agg_vcgen_markers_term.cpp, - agg_vcgen_markers_term.h, - agg_vcgen_smooth_poly1.cpp, - agg_vcgen_smooth_poly1.h, - agg_vcgen_stroke.cpp, - agg_vcgen_stroke.h, - agg_vcgen_vertex_sequence.h, - agg_vertex_sequence.h, - agg_vpgen_clip_polygon.cpp, - agg_vpgen_clip_polygon.h, - agg_vpgen_clip_polyline.cpp, - agg_vpgen_clip_polyline.h, - agg_vpgen_segmentator.cpp, - agg_vpgen_segmentator.h, - agg_bezier_ctrl.cpp, - agg_bezier_ctrl.h, - agg_cbox_ctrl.cpp, - agg_cbox_ctrl.h, - agg_ctrl.h, - agg_gamma_ctrl.cpp, - agg_gamma_ctrl.h, - agg_gamma_spline.cpp, - agg_gamma_spline.h, - agg_polygon_ctrl.cpp, - agg_polygon_ctrl.h, - agg_rbox_ctrl.cpp, - agg_rbox_ctrl.h, - agg_scale_ctrl.cpp, - agg_scale_ctrl.h, - agg_slider_ctrl.cpp, - agg_slider_ctrl.h, - agg_spline_ctrl.cpp, - agg_spline_ctrl.h, - agg_mac_pmap.cpp, - agg_mac_pmap.h, - agg_win32_bmp.cpp, - agg_win32_bmp.h, - agg_color_conv.h, - agg_color_conv_rgb16.h, - agg_color_conv_rgb8.h, - authors, - copying; - -mainconfig - "" = "GUI"; - diff --git a/uppdev/agg24/agg_alpha_mask_u8.h b/uppdev/agg24/agg_alpha_mask_u8.h deleted file mode 100644 index e301c1008..000000000 --- a/uppdev/agg24/agg_alpha_mask_u8.h +++ /dev/null @@ -1,499 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// scanline_u8 class -// -//---------------------------------------------------------------------------- -#ifndef AGG_ALPHA_MASK_U8_INCLUDED -#define AGG_ALPHA_MASK_U8_INCLUDED - -#include -#include "agg_basics.h" -#include "agg_rendering_buffer.h" - -namespace agg -{ - //===================================================one_component_mask_u8 - struct one_component_mask_u8 - { - static unsigned calculate(const int8u* p) { return *p; } - }; - - - //=====================================================rgb_to_gray_mask_u8 - template - struct rgb_to_gray_mask_u8 - { - static unsigned calculate(const int8u* p) - { - return (p[R]*77 + p[G]*150 + p[B]*29) >> 8; - } - }; - - //==========================================================alpha_mask_u8 - template - class alpha_mask_u8 - { - public: - typedef int8u cover_type; - typedef alpha_mask_u8 self_type; - enum cover_scale_e - { - cover_shift = 8, - cover_none = 0, - cover_full = 255 - }; - - alpha_mask_u8() : m_rbuf(0) {} - explicit alpha_mask_u8(rendering_buffer& rbuf) : m_rbuf(&rbuf) {} - - void attach(rendering_buffer& rbuf) { m_rbuf = &rbuf; } - - MaskF& mask_function() { return m_mask_function; } - const MaskF& mask_function() const { return m_mask_function; } - - - //-------------------------------------------------------------------- - cover_type pixel(int x, int y) const - { - if(x >= 0 && y >= 0 && - x < (int)m_rbuf->width() && - y < (int)m_rbuf->height()) - { - return (cover_type)m_mask_function.calculate( - m_rbuf->row_ptr(y) + x * Step + Offset); - } - return 0; - } - - //-------------------------------------------------------------------- - cover_type combine_pixel(int x, int y, cover_type val) const - { - if(x >= 0 && y >= 0 && - x < (int)m_rbuf->width() && - y < (int)m_rbuf->height()) - { - return (cover_type)((cover_full + val * - m_mask_function.calculate( - m_rbuf->row_ptr(y) + x * Step + Offset)) >> - cover_shift); - } - return 0; - } - - - //-------------------------------------------------------------------- - void fill_hspan(int x, int y, cover_type* dst, int num_pix) const - { - int xmax = m_rbuf->width() - 1; - int ymax = m_rbuf->height() - 1; - - int count = num_pix; - cover_type* covers = dst; - - if(y < 0 || y > ymax) - { - memset(dst, 0, num_pix * sizeof(cover_type)); - return; - } - - if(x < 0) - { - count += x; - if(count <= 0) - { - memset(dst, 0, num_pix * sizeof(cover_type)); - return; - } - memset(covers, 0, -x * sizeof(cover_type)); - covers -= x; - x = 0; - } - - if(x + count > xmax) - { - int rest = x + count - xmax - 1; - count -= rest; - if(count <= 0) - { - memset(dst, 0, num_pix * sizeof(cover_type)); - return; - } - memset(covers + count, 0, rest * sizeof(cover_type)); - } - - const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset; - do - { - *covers++ = (cover_type)m_mask_function.calculate(mask); - mask += Step; - } - while(--count); - } - - - //-------------------------------------------------------------------- - void combine_hspan(int x, int y, cover_type* dst, int num_pix) const - { - int xmax = m_rbuf->width() - 1; - int ymax = m_rbuf->height() - 1; - - int count = num_pix; - cover_type* covers = dst; - - if(y < 0 || y > ymax) - { - memset(dst, 0, num_pix * sizeof(cover_type)); - return; - } - - if(x < 0) - { - count += x; - if(count <= 0) - { - memset(dst, 0, num_pix * sizeof(cover_type)); - return; - } - memset(covers, 0, -x * sizeof(cover_type)); - covers -= x; - x = 0; - } - - if(x + count > xmax) - { - int rest = x + count - xmax - 1; - count -= rest; - if(count <= 0) - { - memset(dst, 0, num_pix * sizeof(cover_type)); - return; - } - memset(covers + count, 0, rest * sizeof(cover_type)); - } - - const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset; - do - { - *covers = (cover_type)((cover_full + (*covers) * - m_mask_function.calculate(mask)) >> - cover_shift); - ++covers; - mask += Step; - } - while(--count); - } - - //-------------------------------------------------------------------- - void fill_vspan(int x, int y, cover_type* dst, int num_pix) const - { - int xmax = m_rbuf->width() - 1; - int ymax = m_rbuf->height() - 1; - - int count = num_pix; - cover_type* covers = dst; - - if(x < 0 || x > xmax) - { - memset(dst, 0, num_pix * sizeof(cover_type)); - return; - } - - if(y < 0) - { - count += y; - if(count <= 0) - { - memset(dst, 0, num_pix * sizeof(cover_type)); - return; - } - memset(covers, 0, -y * sizeof(cover_type)); - covers -= y; - y = 0; - } - - if(y + count > ymax) - { - int rest = y + count - ymax - 1; - count -= rest; - if(count <= 0) - { - memset(dst, 0, num_pix * sizeof(cover_type)); - return; - } - memset(covers + count, 0, rest * sizeof(cover_type)); - } - - const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset; - do - { - *covers++ = (cover_type)m_mask_function.calculate(mask); - mask += m_rbuf->stride(); - } - while(--count); - } - - //-------------------------------------------------------------------- - void combine_vspan(int x, int y, cover_type* dst, int num_pix) const - { - int xmax = m_rbuf->width() - 1; - int ymax = m_rbuf->height() - 1; - - int count = num_pix; - cover_type* covers = dst; - - if(x < 0 || x > xmax) - { - memset(dst, 0, num_pix * sizeof(cover_type)); - return; - } - - if(y < 0) - { - count += y; - if(count <= 0) - { - memset(dst, 0, num_pix * sizeof(cover_type)); - return; - } - memset(covers, 0, -y * sizeof(cover_type)); - covers -= y; - y = 0; - } - - if(y + count > ymax) - { - int rest = y + count - ymax - 1; - count -= rest; - if(count <= 0) - { - memset(dst, 0, num_pix * sizeof(cover_type)); - return; - } - memset(covers + count, 0, rest * sizeof(cover_type)); - } - - const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset; - do - { - *covers = (cover_type)((cover_full + (*covers) * - m_mask_function.calculate(mask)) >> - cover_shift); - ++covers; - mask += m_rbuf->stride(); - } - while(--count); - } - - - private: - alpha_mask_u8(const self_type&); - const self_type& operator = (const self_type&); - - rendering_buffer* m_rbuf; - MaskF m_mask_function; - }; - - - typedef alpha_mask_u8<1, 0> alpha_mask_gray8; //----alpha_mask_gray8 - - typedef alpha_mask_u8<3, 0> alpha_mask_rgb24r; //----alpha_mask_rgb24r - typedef alpha_mask_u8<3, 1> alpha_mask_rgb24g; //----alpha_mask_rgb24g - typedef alpha_mask_u8<3, 2> alpha_mask_rgb24b; //----alpha_mask_rgb24b - - typedef alpha_mask_u8<3, 2> alpha_mask_bgr24r; //----alpha_mask_bgr24r - typedef alpha_mask_u8<3, 1> alpha_mask_bgr24g; //----alpha_mask_bgr24g - typedef alpha_mask_u8<3, 0> alpha_mask_bgr24b; //----alpha_mask_bgr24b - - typedef alpha_mask_u8<4, 0> alpha_mask_rgba32r; //----alpha_mask_rgba32r - typedef alpha_mask_u8<4, 1> alpha_mask_rgba32g; //----alpha_mask_rgba32g - typedef alpha_mask_u8<4, 2> alpha_mask_rgba32b; //----alpha_mask_rgba32b - typedef alpha_mask_u8<4, 3> alpha_mask_rgba32a; //----alpha_mask_rgba32a - - typedef alpha_mask_u8<4, 1> alpha_mask_argb32r; //----alpha_mask_argb32r - typedef alpha_mask_u8<4, 2> alpha_mask_argb32g; //----alpha_mask_argb32g - typedef alpha_mask_u8<4, 3> alpha_mask_argb32b; //----alpha_mask_argb32b - typedef alpha_mask_u8<4, 0> alpha_mask_argb32a; //----alpha_mask_argb32a - - typedef alpha_mask_u8<4, 2> alpha_mask_bgra32r; //----alpha_mask_bgra32r - typedef alpha_mask_u8<4, 1> alpha_mask_bgra32g; //----alpha_mask_bgra32g - typedef alpha_mask_u8<4, 0> alpha_mask_bgra32b; //----alpha_mask_bgra32b - typedef alpha_mask_u8<4, 3> alpha_mask_bgra32a; //----alpha_mask_bgra32a - - typedef alpha_mask_u8<4, 3> alpha_mask_abgr32r; //----alpha_mask_abgr32r - typedef alpha_mask_u8<4, 2> alpha_mask_abgr32g; //----alpha_mask_abgr32g - typedef alpha_mask_u8<4, 1> alpha_mask_abgr32b; //----alpha_mask_abgr32b - typedef alpha_mask_u8<4, 0> alpha_mask_abgr32a; //----alpha_mask_abgr32a - - typedef alpha_mask_u8<3, 0, rgb_to_gray_mask_u8<0, 1, 2> > alpha_mask_rgb24gray; //----alpha_mask_rgb24gray - typedef alpha_mask_u8<3, 0, rgb_to_gray_mask_u8<2, 1, 0> > alpha_mask_bgr24gray; //----alpha_mask_bgr24gray - typedef alpha_mask_u8<4, 0, rgb_to_gray_mask_u8<0, 1, 2> > alpha_mask_rgba32gray; //----alpha_mask_rgba32gray - typedef alpha_mask_u8<4, 1, rgb_to_gray_mask_u8<0, 1, 2> > alpha_mask_argb32gray; //----alpha_mask_argb32gray - typedef alpha_mask_u8<4, 0, rgb_to_gray_mask_u8<2, 1, 0> > alpha_mask_bgra32gray; //----alpha_mask_bgra32gray - typedef alpha_mask_u8<4, 1, rgb_to_gray_mask_u8<2, 1, 0> > alpha_mask_abgr32gray; //----alpha_mask_abgr32gray - - - - //==========================================================amask_no_clip_u8 - template - class amask_no_clip_u8 - { - public: - typedef int8u cover_type; - typedef amask_no_clip_u8 self_type; - enum cover_scale_e - { - cover_shift = 8, - cover_none = 0, - cover_full = 255 - }; - - amask_no_clip_u8() : m_rbuf(0) {} - explicit amask_no_clip_u8(rendering_buffer& rbuf) : m_rbuf(&rbuf) {} - - void attach(rendering_buffer& rbuf) { m_rbuf = &rbuf; } - - MaskF& mask_function() { return m_mask_function; } - const MaskF& mask_function() const { return m_mask_function; } - - - //-------------------------------------------------------------------- - cover_type pixel(int x, int y) const - { - return (cover_type)m_mask_function.calculate( - m_rbuf->row_ptr(y) + x * Step + Offset); - } - - - //-------------------------------------------------------------------- - cover_type combine_pixel(int x, int y, cover_type val) const - { - return (cover_type)((cover_full + val * - m_mask_function.calculate( - m_rbuf->row_ptr(y) + x * Step + Offset)) >> - cover_shift); - } - - - //-------------------------------------------------------------------- - void fill_hspan(int x, int y, cover_type* dst, int num_pix) const - { - const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset; - do - { - *dst++ = (cover_type)m_mask_function.calculate(mask); - mask += Step; - } - while(--num_pix); - } - - - - //-------------------------------------------------------------------- - void combine_hspan(int x, int y, cover_type* dst, int num_pix) const - { - const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset; - do - { - *dst = (cover_type)((cover_full + (*dst) * - m_mask_function.calculate(mask)) >> - cover_shift); - ++dst; - mask += Step; - } - while(--num_pix); - } - - - //-------------------------------------------------------------------- - void fill_vspan(int x, int y, cover_type* dst, int num_pix) const - { - const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset; - do - { - *dst++ = (cover_type)m_mask_function.calculate(mask); - mask += m_rbuf->stride(); - } - while(--num_pix); - } - - - //-------------------------------------------------------------------- - void combine_vspan(int x, int y, cover_type* dst, int num_pix) const - { - const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset; - do - { - *dst = (cover_type)((cover_full + (*dst) * - m_mask_function.calculate(mask)) >> - cover_shift); - ++dst; - mask += m_rbuf->stride(); - } - while(--num_pix); - } - - private: - amask_no_clip_u8(const self_type&); - const self_type& operator = (const self_type&); - - rendering_buffer* m_rbuf; - MaskF m_mask_function; - }; - - - typedef amask_no_clip_u8<1, 0> amask_no_clip_gray8; //----amask_no_clip_gray8 - - typedef amask_no_clip_u8<3, 0> amask_no_clip_rgb24r; //----amask_no_clip_rgb24r - typedef amask_no_clip_u8<3, 1> amask_no_clip_rgb24g; //----amask_no_clip_rgb24g - typedef amask_no_clip_u8<3, 2> amask_no_clip_rgb24b; //----amask_no_clip_rgb24b - - typedef amask_no_clip_u8<3, 2> amask_no_clip_bgr24r; //----amask_no_clip_bgr24r - typedef amask_no_clip_u8<3, 1> amask_no_clip_bgr24g; //----amask_no_clip_bgr24g - typedef amask_no_clip_u8<3, 0> amask_no_clip_bgr24b; //----amask_no_clip_bgr24b - - typedef amask_no_clip_u8<4, 0> amask_no_clip_rgba32r; //----amask_no_clip_rgba32r - typedef amask_no_clip_u8<4, 1> amask_no_clip_rgba32g; //----amask_no_clip_rgba32g - typedef amask_no_clip_u8<4, 2> amask_no_clip_rgba32b; //----amask_no_clip_rgba32b - typedef amask_no_clip_u8<4, 3> amask_no_clip_rgba32a; //----amask_no_clip_rgba32a - - typedef amask_no_clip_u8<4, 1> amask_no_clip_argb32r; //----amask_no_clip_argb32r - typedef amask_no_clip_u8<4, 2> amask_no_clip_argb32g; //----amask_no_clip_argb32g - typedef amask_no_clip_u8<4, 3> amask_no_clip_argb32b; //----amask_no_clip_argb32b - typedef amask_no_clip_u8<4, 0> amask_no_clip_argb32a; //----amask_no_clip_argb32a - - typedef amask_no_clip_u8<4, 2> amask_no_clip_bgra32r; //----amask_no_clip_bgra32r - typedef amask_no_clip_u8<4, 1> amask_no_clip_bgra32g; //----amask_no_clip_bgra32g - typedef amask_no_clip_u8<4, 0> amask_no_clip_bgra32b; //----amask_no_clip_bgra32b - typedef amask_no_clip_u8<4, 3> amask_no_clip_bgra32a; //----amask_no_clip_bgra32a - - typedef amask_no_clip_u8<4, 3> amask_no_clip_abgr32r; //----amask_no_clip_abgr32r - typedef amask_no_clip_u8<4, 2> amask_no_clip_abgr32g; //----amask_no_clip_abgr32g - typedef amask_no_clip_u8<4, 1> amask_no_clip_abgr32b; //----amask_no_clip_abgr32b - typedef amask_no_clip_u8<4, 0> amask_no_clip_abgr32a; //----amask_no_clip_abgr32a - - typedef amask_no_clip_u8<3, 0, rgb_to_gray_mask_u8<0, 1, 2> > amask_no_clip_rgb24gray; //----amask_no_clip_rgb24gray - typedef amask_no_clip_u8<3, 0, rgb_to_gray_mask_u8<2, 1, 0> > amask_no_clip_bgr24gray; //----amask_no_clip_bgr24gray - typedef amask_no_clip_u8<4, 0, rgb_to_gray_mask_u8<0, 1, 2> > amask_no_clip_rgba32gray; //----amask_no_clip_rgba32gray - typedef amask_no_clip_u8<4, 1, rgb_to_gray_mask_u8<0, 1, 2> > amask_no_clip_argb32gray; //----amask_no_clip_argb32gray - typedef amask_no_clip_u8<4, 0, rgb_to_gray_mask_u8<2, 1, 0> > amask_no_clip_bgra32gray; //----amask_no_clip_bgra32gray - typedef amask_no_clip_u8<4, 1, rgb_to_gray_mask_u8<2, 1, 0> > amask_no_clip_abgr32gray; //----amask_no_clip_abgr32gray - - -} - - - -#endif diff --git a/uppdev/agg24/agg_arc.cpp b/uppdev/agg24/agg_arc.cpp deleted file mode 100644 index df2c43a55..000000000 --- a/uppdev/agg24/agg_arc.cpp +++ /dev/null @@ -1,106 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Arc vertex generator -// -//---------------------------------------------------------------------------- - -#include -#include "agg_arc.h" - - -namespace agg -{ - //------------------------------------------------------------------------ - arc::arc(double x, double y, - double rx, double ry, - double a1, double a2, - bool ccw) : - m_x(x), m_y(y), m_rx(rx), m_ry(ry), m_scale(1.0) - { - normalize(a1, a2, ccw); - } - - //------------------------------------------------------------------------ - void arc::init(double x, double y, - double rx, double ry, - double a1, double a2, - bool ccw) - { - m_x = x; m_y = y; - m_rx = rx; m_ry = ry; - normalize(a1, a2, ccw); - } - - //------------------------------------------------------------------------ - void arc::approximation_scale(double s) - { - m_scale = s; - if(m_initialized) - { - normalize(m_start, m_end, m_ccw); - } - } - - //------------------------------------------------------------------------ - void arc::rewind(unsigned) - { - m_path_cmd = path_cmd_move_to; - m_angle = m_start; - } - - //------------------------------------------------------------------------ - unsigned arc::vertex(double* x, double* y) - { - if(is_stop(m_path_cmd)) return path_cmd_stop; - if((m_angle < m_end - m_da/4) != m_ccw) - { - *x = m_x + cos(m_end) * m_rx; - *y = m_y + sin(m_end) * m_ry; - m_path_cmd = path_cmd_stop; - return path_cmd_line_to; - } - - *x = m_x + cos(m_angle) * m_rx; - *y = m_y + sin(m_angle) * m_ry; - - m_angle += m_da; - - unsigned pf = m_path_cmd; - m_path_cmd = path_cmd_line_to; - return pf; - } - - //------------------------------------------------------------------------ - void arc::normalize(double a1, double a2, bool ccw) - { - double ra = (fabs(m_rx) + fabs(m_ry)) / 2; - m_da = acos(ra / (ra + 0.125 / m_scale)) * 2; - if(ccw) - { - while(a2 < a1) a2 += pi * 2.0; - } - else - { - while(a1 < a2) a1 += pi * 2.0; - m_da = -m_da; - } - m_ccw = ccw; - m_start = a1; - m_end = a2; - m_initialized = true; - } - -} diff --git a/uppdev/agg24/agg_arc.h b/uppdev/agg24/agg_arc.h deleted file mode 100644 index 17e1d4347..000000000 --- a/uppdev/agg24/agg_arc.h +++ /dev/null @@ -1,74 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Arc vertex generator -// -//---------------------------------------------------------------------------- - -#ifndef AGG_ARC_INCLUDED -#define AGG_ARC_INCLUDED - -#include -#include "agg_basics.h" - -namespace agg -{ - - //=====================================================================arc - // - // See Implementation agg_arc.cpp - // - class arc - { - public: - arc() : m_scale(1.0), m_initialized(false) {} - arc(double x, double y, - double rx, double ry, - double a1, double a2, - bool ccw=true); - - void init(double x, double y, - double rx, double ry, - double a1, double a2, - bool ccw=true); - - void approximation_scale(double s); - double approximation_scale() const { return m_scale; } - - void rewind(unsigned); - unsigned vertex(double* x, double* y); - - private: - void normalize(double a1, double a2, bool ccw); - - double m_x; - double m_y; - double m_rx; - double m_ry; - double m_angle; - double m_start; - double m_end; - double m_scale; - double m_da; - bool m_ccw; - bool m_initialized; - unsigned m_path_cmd; - }; - - -} - - -#endif diff --git a/uppdev/agg24/agg_array.h b/uppdev/agg24/agg_array.h deleted file mode 100644 index 8d5668384..000000000 --- a/uppdev/agg24/agg_array.h +++ /dev/null @@ -1,1119 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -#ifndef AGG_ARRAY_INCLUDED -#define AGG_ARRAY_INCLUDED - -#include -#include -#include "agg_basics.h" - -namespace agg -{ - - //-------------------------------------------------------pod_array_adaptor - template class pod_array_adaptor - { - public: - typedef T value_type; - pod_array_adaptor(T* array, unsigned size) : - m_array(array), m_size(size) {} - - unsigned size() const { return m_size; } - const T& operator [] (unsigned i) const { return m_array[i]; } - T& operator [] (unsigned i) { return m_array[i]; } - const T& at(unsigned i) const { return m_array[i]; } - T& at(unsigned i) { return m_array[i]; } - T value_at(unsigned i) const { return m_array[i]; } - - private: - T* m_array; - unsigned m_size; - }; - - - //---------------------------------------------------------pod_auto_array - template class pod_auto_array - { - public: - typedef T value_type; - typedef pod_auto_array self_type; - - pod_auto_array() {} - explicit pod_auto_array(const T* c) - { - memcpy(m_array, c, sizeof(T) * Size); - } - - const self_type& operator = (const T* c) - { - memcpy(m_array, c, sizeof(T) * Size); - return *this; - } - - static unsigned size() { return Size; } - const T& operator [] (unsigned i) const { return m_array[i]; } - T& operator [] (unsigned i) { return m_array[i]; } - const T& at(unsigned i) const { return m_array[i]; } - T& at(unsigned i) { return m_array[i]; } - T value_at(unsigned i) const { return m_array[i]; } - - private: - T m_array[Size]; - }; - - - //--------------------------------------------------------pod_auto_vector - template class pod_auto_vector - { - public: - typedef T value_type; - typedef pod_auto_vector self_type; - - pod_auto_vector() : m_size(0) {} - - void remove_all() { m_size = 0; } - void clear() { m_size = 0; } - void add(const T& v) { m_array[m_size++] = v; } - void push_back(const T& v) { m_array[m_size++] = v; } - void inc_size(unsigned size) { m_size += size; } - - unsigned size() const { return m_size; } - const T& operator [] (unsigned i) const { return m_array[i]; } - T& operator [] (unsigned i) { return m_array[i]; } - const T& at(unsigned i) const { return m_array[i]; } - T& at(unsigned i) { return m_array[i]; } - T value_at(unsigned i) const { return m_array[i]; } - - private: - T m_array[Size]; - unsigned m_size; - }; - - - //---------------------------------------------------------------pod_array - template class pod_array - { - public: - typedef T value_type; - typedef pod_array self_type; - - ~pod_array() { pod_allocator::deallocate(m_array, m_size); } - pod_array() : m_array(0), m_size(0) {} - - pod_array(unsigned size) : - m_array(pod_allocator::allocate(size)), - m_size(size) - {} - - pod_array(const self_type& v) : - m_array(pod_allocator::allocate(v.m_size)), - m_size(v.m_size) - { - memcpy(m_array, v.m_array, sizeof(T) * m_size); - } - - void resize(unsigned size) - { - if(size != m_size) - { - pod_allocator::deallocate(m_array, m_size); - m_array = pod_allocator::allocate(m_size = size); - } - } - const self_type& operator = (const self_type& v) - { - resize(v.size()); - memcpy(m_array, v.m_array, sizeof(T) * m_size); - return *this; - } - - unsigned size() const { return m_size; } - const T& operator [] (unsigned i) const { return m_array[i]; } - T& operator [] (unsigned i) { return m_array[i]; } - const T& at(unsigned i) const { return m_array[i]; } - T& at(unsigned i) { return m_array[i]; } - T value_at(unsigned i) const { return m_array[i]; } - - const T* data() const { return m_array; } - T* data() { return m_array; } - private: - T* m_array; - unsigned m_size; - }; - - - - //--------------------------------------------------------------pod_vector - // A simple class template to store Plain Old Data, a vector - // of a fixed size. The data is continous in memory - //------------------------------------------------------------------------ - template class pod_vector - { - public: - typedef T value_type; - - ~pod_vector() { pod_allocator::deallocate(m_array, m_capacity); } - pod_vector() : m_size(0), m_capacity(0), m_array(0) {} - pod_vector(unsigned cap, unsigned extra_tail=0); - - // Copying - pod_vector(const pod_vector&); - const pod_vector& operator = (const pod_vector&); - - // Set new capacity. All data is lost, size is set to zero. - void capacity(unsigned cap, unsigned extra_tail=0); - unsigned capacity() const { return m_capacity; } - - // Allocate n elements. All data is lost, - // but elements can be accessed in range 0...size-1. - void allocate(unsigned size, unsigned extra_tail=0); - - // Resize keeping the content. - void resize(unsigned new_size); - - void zero() - { - memset(m_array, 0, sizeof(T) * m_size); - } - - void add(const T& v) { m_array[m_size++] = v; } - void push_back(const T& v) { m_array[m_size++] = v; } - void insert_at(unsigned pos, const T& val); - void inc_size(unsigned size) { m_size += size; } - unsigned size() const { return m_size; } - unsigned byte_size() const { return m_size * sizeof(T); } - void serialize(int8u* ptr) const; - void deserialize(const int8u* data, unsigned byte_size); - const T& operator [] (unsigned i) const { return m_array[i]; } - T& operator [] (unsigned i) { return m_array[i]; } - const T& at(unsigned i) const { return m_array[i]; } - T& at(unsigned i) { return m_array[i]; } - T value_at(unsigned i) const { return m_array[i]; } - - const T* data() const { return m_array; } - T* data() { return m_array; } - - void remove_all() { m_size = 0; } - void clear() { m_size = 0; } - void cut_at(unsigned num) { if(num < m_size) m_size = num; } - - private: - unsigned m_size; - unsigned m_capacity; - T* m_array; - }; - - //------------------------------------------------------------------------ - template - void pod_vector::capacity(unsigned cap, unsigned extra_tail) - { - m_size = 0; - if(cap > m_capacity) - { - pod_allocator::deallocate(m_array, m_capacity); - m_capacity = cap + extra_tail; - m_array = m_capacity ? pod_allocator::allocate(m_capacity) : 0; - } - } - - //------------------------------------------------------------------------ - template - void pod_vector::allocate(unsigned size, unsigned extra_tail) - { - capacity(size, extra_tail); - m_size = size; - } - - - //------------------------------------------------------------------------ - template - void pod_vector::resize(unsigned new_size) - { - if(new_size > m_size) - { - if(new_size > m_capacity) - { - T* data = pod_allocator::allocate(new_size); - memcpy(data, m_array, m_size * sizeof(T)); - pod_allocator::deallocate(m_array, m_capacity); - m_array = data; - } - } - else - { - m_size = new_size; - } - } - - //------------------------------------------------------------------------ - template pod_vector::pod_vector(unsigned cap, unsigned extra_tail) : - m_size(0), - m_capacity(cap + extra_tail), - m_array(pod_allocator::allocate(m_capacity)) {} - - //------------------------------------------------------------------------ - template pod_vector::pod_vector(const pod_vector& v) : - m_size(v.m_size), - m_capacity(v.m_capacity), - m_array(v.m_capacity ? pod_allocator::allocate(v.m_capacity) : 0) - { - memcpy(m_array, v.m_array, sizeof(T) * v.m_size); - } - - //------------------------------------------------------------------------ - template const pod_vector& - pod_vector::operator = (const pod_vector&v) - { - allocate(v.m_size); - if(v.m_size) memcpy(m_array, v.m_array, sizeof(T) * v.m_size); - return *this; - } - - //------------------------------------------------------------------------ - template void pod_vector::serialize(int8u* ptr) const - { - if(m_size) memcpy(ptr, m_array, m_size * sizeof(T)); - } - - //------------------------------------------------------------------------ - template - void pod_vector::deserialize(const int8u* data, unsigned byte_size) - { - byte_size /= sizeof(T); - allocate(byte_size); - if(byte_size) memcpy(m_array, data, byte_size * sizeof(T)); - } - - //------------------------------------------------------------------------ - template - void pod_vector::insert_at(unsigned pos, const T& val) - { - if(pos >= m_size) - { - m_array[m_size] = val; - } - else - { - memmove(m_array + pos + 1, m_array + pos, (m_size - pos) * sizeof(T)); - m_array[pos] = val; - } - ++m_size; - } - - //---------------------------------------------------------------pod_bvector - // A simple class template to store Plain Old Data, similar to std::deque - // It doesn't reallocate memory but instead, uses blocks of data of size - // of (1 << S), that is, power of two. The data is NOT contiguous in memory, - // so the only valid access method is operator [] or curr(), prev(), next() - // - // There reallocs occure only when the pool of pointers to blocks needs - // to be extended (it happens very rarely). You can control the value - // of increment to reallocate the pointer buffer. See the second constructor. - // By default, the incremeent value equals (1 << S), i.e., the block size. - //------------------------------------------------------------------------ - template class pod_bvector - { - public: - enum block_scale_e - { - block_shift = S, - block_size = 1 << block_shift, - block_mask = block_size - 1 - }; - - typedef T value_type; - - ~pod_bvector(); - pod_bvector(); - pod_bvector(unsigned block_ptr_inc); - - // Copying - pod_bvector(const pod_bvector& v); - const pod_bvector& operator = (const pod_bvector& v); - - void remove_all() { m_size = 0; } - void clear() { m_size = 0; } - void free_all() { free_tail(0); } - void free_tail(unsigned size); - void add(const T& val); - void push_back(const T& val) { add(val); } - void modify_last(const T& val); - void remove_last(); - - int allocate_continuous_block(unsigned num_elements); - - void add_array(const T* ptr, unsigned num_elem) - { - while(num_elem--) - { - add(*ptr++); - } - } - - template void add_data(DataAccessor& data) - { - while(data.size()) - { - add(*data); - ++data; - } - } - - void cut_at(unsigned size) - { - if(size < m_size) m_size = size; - } - - unsigned size() const { return m_size; } - - const T& operator [] (unsigned i) const - { - return m_blocks[i >> block_shift][i & block_mask]; - } - - T& operator [] (unsigned i) - { - return m_blocks[i >> block_shift][i & block_mask]; - } - - const T& at(unsigned i) const - { - return m_blocks[i >> block_shift][i & block_mask]; - } - - T& at(unsigned i) - { - return m_blocks[i >> block_shift][i & block_mask]; - } - - T value_at(unsigned i) const - { - return m_blocks[i >> block_shift][i & block_mask]; - } - - const T& curr(unsigned idx) const - { - return (*this)[idx]; - } - - T& curr(unsigned idx) - { - return (*this)[idx]; - } - - const T& prev(unsigned idx) const - { - return (*this)[(idx + m_size - 1) % m_size]; - } - - T& prev(unsigned idx) - { - return (*this)[(idx + m_size - 1) % m_size]; - } - - const T& next(unsigned idx) const - { - return (*this)[(idx + 1) % m_size]; - } - - T& next(unsigned idx) - { - return (*this)[(idx + 1) % m_size]; - } - - const T& last() const - { - return (*this)[m_size - 1]; - } - - T& last() - { - return (*this)[m_size - 1]; - } - - unsigned byte_size() const; - void serialize(int8u* ptr) const; - void deserialize(const int8u* data, unsigned byte_size); - void deserialize(unsigned start, const T& empty_val, - const int8u* data, unsigned byte_size); - - template - void deserialize(ByteAccessor data) - { - remove_all(); - unsigned elem_size = data.size() / sizeof(T); - - for(unsigned i = 0; i < elem_size; ++i) - { - int8u* ptr = (int8u*)data_ptr(); - for(unsigned j = 0; j < sizeof(T); ++j) - { - *ptr++ = *data; - ++data; - } - ++m_size; - } - } - - template - void deserialize(unsigned start, const T& empty_val, ByteAccessor data) - { - while(m_size < start) - { - add(empty_val); - } - - unsigned elem_size = data.size() / sizeof(T); - for(unsigned i = 0; i < elem_size; ++i) - { - int8u* ptr; - if(start + i < m_size) - { - ptr = (int8u*)(&((*this)[start + i])); - } - else - { - ptr = (int8u*)data_ptr(); - ++m_size; - } - for(unsigned j = 0; j < sizeof(T); ++j) - { - *ptr++ = *data; - ++data; - } - } - } - - const T* block(unsigned nb) const { return m_blocks[nb]; } - - private: - void allocate_block(unsigned nb); - T* data_ptr(); - - unsigned m_size; - unsigned m_num_blocks; - unsigned m_max_blocks; - T** m_blocks; - unsigned m_block_ptr_inc; - }; - - - //------------------------------------------------------------------------ - template pod_bvector::~pod_bvector() - { - if(m_num_blocks) - { - T** blk = m_blocks + m_num_blocks - 1; - while(m_num_blocks--) - { - pod_allocator::deallocate(*blk, block_size); - --blk; - } - } - pod_allocator::deallocate(m_blocks, m_max_blocks); - } - - - //------------------------------------------------------------------------ - template - void pod_bvector::free_tail(unsigned size) - { - if(size < m_size) - { - unsigned nb = (size + block_mask) >> block_shift; - while(m_num_blocks > nb) - { - pod_allocator::deallocate(m_blocks[--m_num_blocks], block_size); - } - if(m_num_blocks == 0) - { - pod_allocator::deallocate(m_blocks, m_max_blocks); - m_blocks = 0; - m_max_blocks = 0; - } - m_size = size; - } - } - - - //------------------------------------------------------------------------ - template pod_bvector::pod_bvector() : - m_size(0), - m_num_blocks(0), - m_max_blocks(0), - m_blocks(0), - m_block_ptr_inc(block_size) - { - } - - - //------------------------------------------------------------------------ - template - pod_bvector::pod_bvector(unsigned block_ptr_inc) : - m_size(0), - m_num_blocks(0), - m_max_blocks(0), - m_blocks(0), - m_block_ptr_inc(block_ptr_inc) - { - } - - - //------------------------------------------------------------------------ - template - pod_bvector::pod_bvector(const pod_bvector& v) : - m_size(v.m_size), - m_num_blocks(v.m_num_blocks), - m_max_blocks(v.m_max_blocks), - m_blocks(v.m_max_blocks ? - pod_allocator::allocate(v.m_max_blocks) : - 0), - m_block_ptr_inc(v.m_block_ptr_inc) - { - unsigned i; - for(i = 0; i < v.m_num_blocks; ++i) - { - m_blocks[i] = pod_allocator::allocate(block_size); - memcpy(m_blocks[i], v.m_blocks[i], block_size * sizeof(T)); - } - } - - - //------------------------------------------------------------------------ - template - const pod_bvector& - pod_bvector::operator = (const pod_bvector& v) - { - unsigned i; - for(i = m_num_blocks; i < v.m_num_blocks; ++i) - { - allocate_block(i); - } - for(i = 0; i < v.m_num_blocks; ++i) - { - memcpy(m_blocks[i], v.m_blocks[i], block_size * sizeof(T)); - } - m_size = v.m_size; - return *this; - } - - - //------------------------------------------------------------------------ - template - void pod_bvector::allocate_block(unsigned nb) - { - if(nb >= m_max_blocks) - { - T** new_blocks = pod_allocator::allocate(m_max_blocks + m_block_ptr_inc); - - if(m_blocks) - { - memcpy(new_blocks, - m_blocks, - m_num_blocks * sizeof(T*)); - - pod_allocator::deallocate(m_blocks, m_max_blocks); - } - m_blocks = new_blocks; - m_max_blocks += m_block_ptr_inc; - } - m_blocks[nb] = pod_allocator::allocate(block_size); - m_num_blocks++; - } - - - - //------------------------------------------------------------------------ - template - inline T* pod_bvector::data_ptr() - { - unsigned nb = m_size >> block_shift; - if(nb >= m_num_blocks) - { - allocate_block(nb); - } - return m_blocks[nb] + (m_size & block_mask); - } - - - - //------------------------------------------------------------------------ - template - inline void pod_bvector::add(const T& val) - { - *data_ptr() = val; - ++m_size; - } - - - //------------------------------------------------------------------------ - template - inline void pod_bvector::remove_last() - { - if(m_size) --m_size; - } - - - //------------------------------------------------------------------------ - template - void pod_bvector::modify_last(const T& val) - { - remove_last(); - add(val); - } - - - //------------------------------------------------------------------------ - template - int pod_bvector::allocate_continuous_block(unsigned num_elements) - { - if(num_elements < block_size) - { - data_ptr(); // Allocate initial block if necessary - unsigned rest = block_size - (m_size & block_mask); - unsigned index; - if(num_elements <= rest) - { - // The rest of the block is good, we can use it - //----------------- - index = m_size; - m_size += num_elements; - return index; - } - - // New block - //--------------- - m_size += rest; - data_ptr(); - index = m_size; - m_size += num_elements; - return index; - } - return -1; // Impossible to allocate - } - - - //------------------------------------------------------------------------ - template - unsigned pod_bvector::byte_size() const - { - return m_size * sizeof(T); - } - - - //------------------------------------------------------------------------ - template - void pod_bvector::serialize(int8u* ptr) const - { - unsigned i; - for(i = 0; i < m_size; i++) - { - memcpy(ptr, &(*this)[i], sizeof(T)); - ptr += sizeof(T); - } - } - - //------------------------------------------------------------------------ - template - void pod_bvector::deserialize(const int8u* data, unsigned byte_size) - { - remove_all(); - byte_size /= sizeof(T); - for(unsigned i = 0; i < byte_size; ++i) - { - T* ptr = data_ptr(); - memcpy(ptr, data, sizeof(T)); - ++m_size; - data += sizeof(T); - } - } - - - // Replace or add a number of elements starting from "start" position - //------------------------------------------------------------------------ - template - void pod_bvector::deserialize(unsigned start, const T& empty_val, - const int8u* data, unsigned byte_size) - { - while(m_size < start) - { - add(empty_val); - } - - byte_size /= sizeof(T); - for(unsigned i = 0; i < byte_size; ++i) - { - if(start + i < m_size) - { - memcpy(&((*this)[start + i]), data, sizeof(T)); - } - else - { - T* ptr = data_ptr(); - memcpy(ptr, data, sizeof(T)); - ++m_size; - } - data += sizeof(T); - } - } - - - //---------------------------------------------------------block_allocator - // Allocator for arbitrary POD data. Most usable in different cache - // systems for efficient memory allocations. - // Memory is allocated with blocks of fixed size ("block_size" in - // the constructor). If required size exceeds the block size the allocator - // creates a new block of the required size. However, the most efficient - // use is when the average reqired size is much less than the block size. - //------------------------------------------------------------------------ - class block_allocator - { - struct block_type - { - int8u* data; - unsigned size; - }; - - public: - void remove_all() - { - if(m_num_blocks) - { - block_type* blk = m_blocks + m_num_blocks - 1; - while(m_num_blocks--) - { - pod_allocator::deallocate(blk->data, blk->size); - --blk; - } - pod_allocator::deallocate(m_blocks, m_max_blocks); - } - m_num_blocks = 0; - m_max_blocks = 0; - m_blocks = 0; - m_buf_ptr = 0; - m_rest = 0; - } - - ~block_allocator() - { - remove_all(); - } - - block_allocator(unsigned block_size, unsigned block_ptr_inc=256-8) : - m_block_size(block_size), - m_block_ptr_inc(block_ptr_inc), - m_num_blocks(0), - m_max_blocks(0), - m_blocks(0), - m_buf_ptr(0), - m_rest(0) - { - } - - - int8u* allocate(unsigned size, unsigned alignment=1) - { - if(size == 0) return 0; - if(size <= m_rest) - { - int8u* ptr = m_buf_ptr; - if(alignment > 1) - { - unsigned align = - (alignment - unsigned((size_t)ptr) % alignment) % alignment; - - size += align; - ptr += align; - if(size <= m_rest) - { - m_rest -= size; - m_buf_ptr += size; - return ptr; - } - allocate_block(size); - return allocate(size - align, alignment); - } - m_rest -= size; - m_buf_ptr += size; - return ptr; - } - allocate_block(size + alignment - 1); - return allocate(size, alignment); - } - - - private: - void allocate_block(unsigned size) - { - if(size < m_block_size) size = m_block_size; - if(m_num_blocks >= m_max_blocks) - { - block_type* new_blocks = - pod_allocator::allocate(m_max_blocks + m_block_ptr_inc); - - if(m_blocks) - { - memcpy(new_blocks, - m_blocks, - m_num_blocks * sizeof(block_type)); - pod_allocator::deallocate(m_blocks, m_max_blocks); - } - m_blocks = new_blocks; - m_max_blocks += m_block_ptr_inc; - } - - m_blocks[m_num_blocks].size = size; - m_blocks[m_num_blocks].data = - m_buf_ptr = - pod_allocator::allocate(size); - - m_num_blocks++; - m_rest = size; - } - - unsigned m_block_size; - unsigned m_block_ptr_inc; - unsigned m_num_blocks; - unsigned m_max_blocks; - block_type* m_blocks; - int8u* m_buf_ptr; - unsigned m_rest; - }; - - - - - - - - - //------------------------------------------------------------------------ - enum quick_sort_threshold_e - { - quick_sort_threshold = 9 - }; - - - //-----------------------------------------------------------swap_elements - template inline void swap_elements(T& a, T& b) - { - T temp = a; - a = b; - b = temp; - } - - - //--------------------------------------------------------------quick_sort - template - void quick_sort(Array& arr, Less less) - { - if(arr.size() < 2) return; - - typename Array::value_type* e1; - typename Array::value_type* e2; - - int stack[80]; - int* top = stack; - int limit = arr.size(); - int base = 0; - - for(;;) - { - int len = limit - base; - - int i; - int j; - int pivot; - - if(len > quick_sort_threshold) - { - // we use base + len/2 as the pivot - pivot = base + len / 2; - swap_elements(arr[base], arr[pivot]); - - i = base + 1; - j = limit - 1; - - // now ensure that *i <= *base <= *j - e1 = &(arr[j]); - e2 = &(arr[i]); - if(less(*e1, *e2)) swap_elements(*e1, *e2); - - e1 = &(arr[base]); - e2 = &(arr[i]); - if(less(*e1, *e2)) swap_elements(*e1, *e2); - - e1 = &(arr[j]); - e2 = &(arr[base]); - if(less(*e1, *e2)) swap_elements(*e1, *e2); - - for(;;) - { - do i++; while( less(arr[i], arr[base]) ); - do j--; while( less(arr[base], arr[j]) ); - - if( i > j ) - { - break; - } - - swap_elements(arr[i], arr[j]); - } - - swap_elements(arr[base], arr[j]); - - // now, push the largest sub-array - if(j - base > limit - i) - { - top[0] = base; - top[1] = j; - base = i; - } - else - { - top[0] = i; - top[1] = limit; - limit = j; - } - top += 2; - } - else - { - // the sub-array is small, perform insertion sort - j = base; - i = j + 1; - - for(; i < limit; j = i, i++) - { - for(; less(*(e1 = &(arr[j + 1])), *(e2 = &(arr[j]))); j--) - { - swap_elements(*e1, *e2); - if(j == base) - { - break; - } - } - } - if(top > stack) - { - top -= 2; - base = top[0]; - limit = top[1]; - } - else - { - break; - } - } - } - } - - - - - //------------------------------------------------------remove_duplicates - // Remove duplicates from a sorted array. It doesn't cut the - // tail of the array, it just returns the number of remaining elements. - //----------------------------------------------------------------------- - template - unsigned remove_duplicates(Array& arr, Equal equal) - { - if(arr.size() < 2) return arr.size(); - - unsigned i, j; - for(i = 1, j = 1; i < arr.size(); i++) - { - typename Array::value_type& e = arr[i]; - if(!equal(e, arr[i - 1])) - { - arr[j++] = e; - } - } - return j; - } - - //--------------------------------------------------------invert_container - template void invert_container(Array& arr) - { - int i = 0; - int j = arr.size() - 1; - while(i < j) - { - swap_elements(arr[i++], arr[j--]); - } - } - - //------------------------------------------------------binary_search_pos - template - unsigned binary_search_pos(const Array& arr, const Value& val, Less less) - { - if(arr.size() == 0) return 0; - - unsigned beg = 0; - unsigned end = arr.size() - 1; - - if(less(val, arr[0])) return 0; - if(less(arr[end], val)) return end + 1; - - while(end - beg > 1) - { - unsigned mid = (end + beg) >> 1; - if(less(val, arr[mid])) end = mid; - else beg = mid; - } - - //if(beg <= 0 && less(val, arr[0])) return 0; - //if(end >= arr.size() - 1 && less(arr[end], val)) ++end; - - return end; - } - - //----------------------------------------------------------range_adaptor - template class range_adaptor - { - public: - typedef typename Array::value_type value_type; - - range_adaptor(Array& array, unsigned start, unsigned size) : - m_array(array), m_start(start), m_size(size) - {} - - unsigned size() const { return m_size; } - const value_type& operator [] (unsigned i) const { return m_array[m_start + i]; } - value_type& operator [] (unsigned i) { return m_array[m_start + i]; } - const value_type& at(unsigned i) const { return m_array[m_start + i]; } - value_type& at(unsigned i) { return m_array[m_start + i]; } - value_type value_at(unsigned i) const { return m_array[m_start + i]; } - - private: - Array& m_array; - unsigned m_start; - unsigned m_size; - }; - - //---------------------------------------------------------------int_less - inline bool int_less(int a, int b) { return a < b; } - - //------------------------------------------------------------int_greater - inline bool int_greater(int a, int b) { return a > b; } - - //----------------------------------------------------------unsigned_less - inline bool unsigned_less(unsigned a, unsigned b) { return a < b; } - - //-------------------------------------------------------unsigned_greater - inline bool unsigned_greater(unsigned a, unsigned b) { return a > b; } -} - -#endif diff --git a/uppdev/agg24/agg_arrowhead.cpp b/uppdev/agg24/agg_arrowhead.cpp deleted file mode 100644 index 1a6f8b410..000000000 --- a/uppdev/agg24/agg_arrowhead.cpp +++ /dev/null @@ -1,110 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Simple arrowhead/arrowtail generator -// -//---------------------------------------------------------------------------- - -#include "agg_arrowhead.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - arrowhead::arrowhead() : - m_head_d1(1.0), - m_head_d2(1.0), - m_head_d3(1.0), - m_head_d4(0.0), - m_tail_d1(1.0), - m_tail_d2(1.0), - m_tail_d3(1.0), - m_tail_d4(0.0), - m_head_flag(false), - m_tail_flag(false), - m_curr_id(0), - m_curr_coord(0) - { - } - - - - //------------------------------------------------------------------------ - void arrowhead::rewind(unsigned path_id) - { - m_curr_id = path_id; - m_curr_coord = 0; - if(path_id == 0) - { - if(!m_tail_flag) - { - m_cmd[0] = path_cmd_stop; - return; - } - m_coord[0] = m_tail_d1; m_coord[1] = 0.0; - m_coord[2] = m_tail_d1 - m_tail_d4; m_coord[3] = m_tail_d3; - m_coord[4] = -m_tail_d2 - m_tail_d4; m_coord[5] = m_tail_d3; - m_coord[6] = -m_tail_d2; m_coord[7] = 0.0; - m_coord[8] = -m_tail_d2 - m_tail_d4; m_coord[9] = -m_tail_d3; - m_coord[10] = m_tail_d1 - m_tail_d4; m_coord[11] = -m_tail_d3; - - m_cmd[0] = path_cmd_move_to; - m_cmd[1] = path_cmd_line_to; - m_cmd[2] = path_cmd_line_to; - m_cmd[3] = path_cmd_line_to; - m_cmd[4] = path_cmd_line_to; - m_cmd[5] = path_cmd_line_to; - m_cmd[7] = path_cmd_end_poly | path_flags_close | path_flags_ccw; - m_cmd[6] = path_cmd_stop; - return; - } - - if(path_id == 1) - { - if(!m_head_flag) - { - m_cmd[0] = path_cmd_stop; - return; - } - m_coord[0] = -m_head_d1; m_coord[1] = 0.0; - m_coord[2] = m_head_d2 + m_head_d4; m_coord[3] = -m_head_d3; - m_coord[4] = m_head_d2; m_coord[5] = 0.0; - m_coord[6] = m_head_d2 + m_head_d4; m_coord[7] = m_head_d3; - - m_cmd[0] = path_cmd_move_to; - m_cmd[1] = path_cmd_line_to; - m_cmd[2] = path_cmd_line_to; - m_cmd[3] = path_cmd_line_to; - m_cmd[4] = path_cmd_end_poly | path_flags_close | path_flags_ccw; - m_cmd[5] = path_cmd_stop; - return; - } - } - - - //------------------------------------------------------------------------ - unsigned arrowhead::vertex(double* x, double* y) - { - if(m_curr_id < 2) - { - unsigned curr_idx = m_curr_coord * 2; - *x = m_coord[curr_idx]; - *y = m_coord[curr_idx + 1]; - return m_cmd[m_curr_coord++]; - } - return path_cmd_stop; - } - -} diff --git a/uppdev/agg24/agg_arrowhead.h b/uppdev/agg24/agg_arrowhead.h deleted file mode 100644 index 5e029ddee..000000000 --- a/uppdev/agg24/agg_arrowhead.h +++ /dev/null @@ -1,82 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Simple arrowhead/arrowtail generator -// -//---------------------------------------------------------------------------- -#ifndef AGG_ARROWHEAD_INCLUDED -#define AGG_ARROWHEAD_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - - //===============================================================arrowhead - // - // See implementation agg_arrowhead.cpp - // - class arrowhead - { - public: - arrowhead(); - - void head(double d1, double d2, double d3, double d4) - { - m_head_d1 = d1; - m_head_d2 = d2; - m_head_d3 = d3; - m_head_d4 = d4; - m_head_flag = true; - } - - void head() { m_head_flag = true; } - void no_head() { m_head_flag = false; } - - void tail(double d1, double d2, double d3, double d4) - { - m_tail_d1 = d1; - m_tail_d2 = d2; - m_tail_d3 = d3; - m_tail_d4 = d4; - m_tail_flag = true; - } - - void tail() { m_tail_flag = true; } - void no_tail() { m_tail_flag = false; } - - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - double m_head_d1; - double m_head_d2; - double m_head_d3; - double m_head_d4; - double m_tail_d1; - double m_tail_d2; - double m_tail_d3; - double m_tail_d4; - bool m_head_flag; - bool m_tail_flag; - double m_coord[16]; - unsigned m_cmd[8]; - unsigned m_curr_id; - unsigned m_curr_coord; - }; - -} - -#endif diff --git a/uppdev/agg24/agg_basics.h b/uppdev/agg24/agg_basics.h deleted file mode 100644 index cb9583815..000000000 --- a/uppdev/agg24/agg_basics.h +++ /dev/null @@ -1,530 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_BASICS_INCLUDED -#define AGG_BASICS_INCLUDED - -#include -#include "agg_config.h" - -//---------------------------------------------------------AGG_CUSTOM_ALLOCATOR -#ifdef AGG_CUSTOM_ALLOCATOR -#include "agg_allocator.h" -#else -namespace agg -{ - // The policy of all AGG containers and memory allocation strategy - // in general is that no allocated data requires explicit construction. - // It means that the allocator can be really simple; you can even - // replace new/delete to malloc/free. The constructors and destructors - // won't be called in this case, however everything will remain working. - // The second argument of deallocate() is the size of the allocated - // block. You can use this information if you wish. - //------------------------------------------------------------pod_allocator - template struct pod_allocator - { - static T* allocate(unsigned num) { return new T [num]; } - static void deallocate(T* ptr, unsigned) { delete [] ptr; } - }; - - // Single object allocator. It's also can be replaced with your custom - // allocator. The difference is that it can only allocate a single - // object and the constructor and destructor must be called. - // In AGG there is no need to allocate an array of objects with - // calling their constructors (only single ones). So that, if you - // replace these new/delete to malloc/free make sure that the in-place - // new is called and take care of calling the destructor too. - //------------------------------------------------------------obj_allocator - template struct obj_allocator - { - static T* allocate() { return new T; } - static void deallocate(T* ptr) { delete ptr; } - }; -} -#endif - - -//-------------------------------------------------------- Default basic types -// -// If the compiler has different capacity of the basic types you can redefine -// them via the compiler command line or by generating agg_config.h that is -// empty by default. -// -#ifndef AGG_INT8 -#define AGG_INT8 signed char -#endif - -#ifndef AGG_INT8U -#define AGG_INT8U unsigned char -#endif - -#ifndef AGG_INT16 -#define AGG_INT16 short -#endif - -#ifndef AGG_INT16U -#define AGG_INT16U unsigned short -#endif - -#ifndef AGG_INT32 -#define AGG_INT32 int -#endif - -#ifndef AGG_INT32U -#define AGG_INT32U unsigned -#endif - -#ifndef AGG_INT64 -#if defined(_MSC_VER) || defined(__BORLANDC__) -#define AGG_INT64 signed __int64 -#else -#define AGG_INT64 signed long long -#endif -#endif - -#ifndef AGG_INT64U -#if defined(_MSC_VER) || defined(__BORLANDC__) -#define AGG_INT64U unsigned __int64 -#else -#define AGG_INT64U unsigned long long -#endif -#endif - -//------------------------------------------------ Some fixes for MS Visual C++ -#if defined(_MSC_VER) -#pragma warning(disable:4786) // Identifier was truncated... -#endif - -#if defined(_MSC_VER) -#define AGG_INLINE __forceinline -#else -#define AGG_INLINE inline -#endif - -namespace agg -{ - //------------------------------------------------------------------------- - typedef AGG_INT8 int8; //----int8 - typedef AGG_INT8U int8u; //----int8u - typedef AGG_INT16 int16; //----int16 - typedef AGG_INT16U int16u; //----int16u - typedef AGG_INT32 int32; //----int32 - typedef AGG_INT32U int32u; //----int32u - typedef AGG_INT64 int64; //----int64 - typedef AGG_INT64U int64u; //----int64u - -#if defined(AGG_FISTP) -#pragma warning(push) -#pragma warning(disable : 4035) //Disable warning "no return value" - AGG_INLINE int iround(double v) //-------iround - { - int t; - __asm fld qword ptr [v] - __asm fistp dword ptr [t] - __asm mov eax, dword ptr [t] - } - AGG_INLINE unsigned uround(double v) //-------uround - { - unsigned t; - __asm fld qword ptr [v] - __asm fistp dword ptr [t] - __asm mov eax, dword ptr [t] - } -#pragma warning(pop) - AGG_INLINE unsigned ufloor(double v) //-------ufloor - { - return unsigned(floor(v)); - } - AGG_INLINE unsigned uceil(double v) //--------uceil - { - return unsigned(ceil(v)); - } -#elif defined(AGG_QIFIST) - AGG_INLINE int iround(double v) - { - return int(v); - } - AGG_INLINE int uround(double v) - { - return unsigned(v); - } - AGG_INLINE unsigned ufloor(double v) - { - return unsigned(floor(v)); - } - AGG_INLINE unsigned uceil(double v) - { - return unsigned(ceil(v)); - } -#else - AGG_INLINE int iround(double v) - { - return int((v < 0.0) ? v - 0.5 : v + 0.5); - } - AGG_INLINE int uround(double v) - { - return unsigned(v + 0.5); - } - AGG_INLINE unsigned ufloor(double v) - { - return unsigned(v); - } - AGG_INLINE unsigned uceil(double v) - { - return unsigned(ceil(v)); - } -#endif - - //---------------------------------------------------------------saturation - template struct saturation - { - AGG_INLINE static int iround(double v) - { - if(v < double(-Limit)) return -Limit; - if(v > double( Limit)) return Limit; - return agg::iround(v); - } - }; - - //------------------------------------------------------------------mul_one - template struct mul_one - { - AGG_INLINE static unsigned mul(unsigned a, unsigned b) - { - register unsigned q = a * b + (1 << (Shift-1)); - return (q + (q >> Shift)) >> Shift; - } - }; - - //------------------------------------------------------------------------- - typedef unsigned char cover_type; //----cover_type - enum cover_scale_e - { - cover_shift = 8, //----cover_shift - cover_size = 1 << cover_shift, //----cover_size - cover_mask = cover_size - 1, //----cover_mask - cover_none = 0, //----cover_none - cover_full = cover_mask //----cover_full - }; - - //----------------------------------------------------poly_subpixel_scale_e - // These constants determine the subpixel accuracy, to be more precise, - // the number of bits of the fractional part of the coordinates. - // The possible coordinate capacity in bits can be calculated by formula: - // sizeof(int) * 8 - poly_subpixel_shift, i.e, for 32-bit integers and - // 8-bits fractional part the capacity is 24 bits. - enum poly_subpixel_scale_e - { - poly_subpixel_shift = 8, //----poly_subpixel_shift - poly_subpixel_scale = 1< struct rect_base - { - typedef T value_type; - typedef rect_base self_type; - T x1, y1, x2, y2; - - rect_base() {} - rect_base(T x1_, T y1_, T x2_, T y2_) : - x1(x1_), y1(y1_), x2(x2_), y2(y2_) {} - - void init(T x1_, T y1_, T x2_, T y2_) - { - x1 = x1_; y1 = y1_; x2 = x2_; y2 = y2_; - } - - const self_type& normalize() - { - T t; - if(x1 > x2) { t = x1; x1 = x2; x2 = t; } - if(y1 > y2) { t = y1; y1 = y2; y2 = t; } - return *this; - } - - bool clip(const self_type& r) - { - if(x2 > r.x2) x2 = r.x2; - if(y2 > r.y2) y2 = r.y2; - if(x1 < r.x1) x1 = r.x1; - if(y1 < r.y1) y1 = r.y1; - return x1 <= x2 && y1 <= y2; - } - - bool is_valid() const - { - return x1 <= x2 && y1 <= y2; - } - - bool hit_test(T x, T y) const - { - return (x >= x1 && x <= x2 && y >= y1 && y <= y2); - } - }; - - //-----------------------------------------------------intersect_rectangles - template - inline Rect intersect_rectangles(const Rect& r1, const Rect& r2) - { - Rect r = r1; - - // First process x2,y2 because the other order - // results in Internal Compiler Error under - // Microsoft Visual C++ .NET 2003 69462-335-0000007-18038 in - // case of "Maximize Speed" optimization option. - //----------------- - if(r.x2 > r2.x2) r.x2 = r2.x2; - if(r.y2 > r2.y2) r.y2 = r2.y2; - if(r.x1 < r2.x1) r.x1 = r2.x1; - if(r.y1 < r2.y1) r.y1 = r2.y1; - return r; - } - - - //---------------------------------------------------------unite_rectangles - template - inline Rect unite_rectangles(const Rect& r1, const Rect& r2) - { - Rect r = r1; - if(r.x2 < r2.x2) r.x2 = r2.x2; - if(r.y2 < r2.y2) r.y2 = r2.y2; - if(r.x1 > r2.x1) r.x1 = r2.x1; - if(r.y1 > r2.y1) r.y1 = r2.y1; - return r; - } - - typedef rect_base rect_i; //----rect_i - typedef rect_base rect_f; //----rect_f - typedef rect_base rect_d; //----rect_d - - //---------------------------------------------------------path_commands_e - enum path_commands_e - { - path_cmd_stop = 0, //----path_cmd_stop - path_cmd_move_to = 1, //----path_cmd_move_to - path_cmd_line_to = 2, //----path_cmd_line_to - path_cmd_curve3 = 3, //----path_cmd_curve3 - path_cmd_curve4 = 4, //----path_cmd_curve4 - path_cmd_curveN = 5, //----path_cmd_curveN - path_cmd_catrom = 6, //----path_cmd_catrom - path_cmd_ubspline = 7, //----path_cmd_ubspline - path_cmd_end_poly = 0x0F, //----path_cmd_end_poly - path_cmd_mask = 0x0F //----path_cmd_mask - }; - - //------------------------------------------------------------path_flags_e - enum path_flags_e - { - path_flags_none = 0, //----path_flags_none - path_flags_ccw = 0x10, //----path_flags_ccw - path_flags_cw = 0x20, //----path_flags_cw - path_flags_close = 0x40, //----path_flags_close - path_flags_mask = 0xF0 //----path_flags_mask - }; - - //---------------------------------------------------------------is_vertex - inline bool is_vertex(unsigned c) - { - return c >= path_cmd_move_to && c < path_cmd_end_poly; - } - - //--------------------------------------------------------------is_drawing - inline bool is_drawing(unsigned c) - { - return c >= path_cmd_line_to && c < path_cmd_end_poly; - } - - //-----------------------------------------------------------------is_stop - inline bool is_stop(unsigned c) - { - return c == path_cmd_stop; - } - - //--------------------------------------------------------------is_move_to - inline bool is_move_to(unsigned c) - { - return c == path_cmd_move_to; - } - - //--------------------------------------------------------------is_line_to - inline bool is_line_to(unsigned c) - { - return c == path_cmd_line_to; - } - - //----------------------------------------------------------------is_curve - inline bool is_curve(unsigned c) - { - return c == path_cmd_curve3 || c == path_cmd_curve4; - } - - //---------------------------------------------------------------is_curve3 - inline bool is_curve3(unsigned c) - { - return c == path_cmd_curve3; - } - - //---------------------------------------------------------------is_curve4 - inline bool is_curve4(unsigned c) - { - return c == path_cmd_curve4; - } - - //-------------------------------------------------------------is_end_poly - inline bool is_end_poly(unsigned c) - { - return (c & path_cmd_mask) == path_cmd_end_poly; - } - - //----------------------------------------------------------------is_close - inline bool is_close(unsigned c) - { - return (c & ~(path_flags_cw | path_flags_ccw)) == - (path_cmd_end_poly | path_flags_close); - } - - //------------------------------------------------------------is_next_poly - inline bool is_next_poly(unsigned c) - { - return is_stop(c) || is_move_to(c) || is_end_poly(c); - } - - //-------------------------------------------------------------------is_cw - inline bool is_cw(unsigned c) - { - return (c & path_flags_cw) != 0; - } - - //------------------------------------------------------------------is_ccw - inline bool is_ccw(unsigned c) - { - return (c & path_flags_ccw) != 0; - } - - //-------------------------------------------------------------is_oriented - inline bool is_oriented(unsigned c) - { - return (c & (path_flags_cw | path_flags_ccw)) != 0; - } - - //---------------------------------------------------------------is_closed - inline bool is_closed(unsigned c) - { - return (c & path_flags_close) != 0; - } - - //----------------------------------------------------------get_close_flag - inline unsigned get_close_flag(unsigned c) - { - return c & path_flags_close; - } - - //-------------------------------------------------------clear_orientation - inline unsigned clear_orientation(unsigned c) - { - return c & ~(path_flags_cw | path_flags_ccw); - } - - //---------------------------------------------------------get_orientation - inline unsigned get_orientation(unsigned c) - { - return c & (path_flags_cw | path_flags_ccw); - } - - //---------------------------------------------------------set_orientation - inline unsigned set_orientation(unsigned c, unsigned o) - { - return clear_orientation(c) | o; - } - - //--------------------------------------------------------------point_base - template struct point_base - { - typedef T value_type; - T x,y; - point_base() {} - point_base(T x_, T y_) : x(x_), y(y_) {} - }; - typedef point_base point_i; //-----point_i - typedef point_base point_f; //-----point_f - typedef point_base point_d; //-----point_d - - //-------------------------------------------------------------vertex_base - template struct vertex_base - { - typedef T value_type; - T x,y; - unsigned cmd; - vertex_base() {} - vertex_base(T x_, T y_, unsigned cmd_) : x(x_), y(y_), cmd(cmd_) {} - }; - typedef vertex_base vertex_i; //-----vertex_i - typedef vertex_base vertex_f; //-----vertex_f - typedef vertex_base vertex_d; //-----vertex_d - - //----------------------------------------------------------------row_info - template struct row_info - { - int x1, x2; - T* ptr; - row_info() {} - row_info(int x1_, int x2_, T* ptr_) : x1(x1_), x2(x2_), ptr(ptr_) {} - }; - - //----------------------------------------------------------const_row_info - template struct const_row_info - { - int x1, x2; - const T* ptr; - const_row_info() {} - const_row_info(int x1_, int x2_, const T* ptr_) : - x1(x1_), x2(x2_), ptr(ptr_) {} - }; - - //------------------------------------------------------------is_equal_eps - template inline bool is_equal_eps(T v1, T v2, T epsilon) - { - return fabs(v1 - v2) <= double(epsilon); - } - -} - - -#endif - diff --git a/uppdev/agg24/agg_bezier_arc.cpp b/uppdev/agg24/agg_bezier_arc.cpp deleted file mode 100644 index 844d300c0..000000000 --- a/uppdev/agg24/agg_bezier_arc.cpp +++ /dev/null @@ -1,258 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Arc generator. Produces at most 4 consecutive cubic bezier curves, i.e., -// 4, 7, 10, or 13 vertices. -// -//---------------------------------------------------------------------------- - - -#include -#include "agg_bezier_arc.h" - - -namespace agg -{ - - // This epsilon is used to prevent us from adding degenerate curves - // (converging to a single point). - // The value isn't very critical. Function arc_to_bezier() has a limit - // of the sweep_angle. If fabs(sweep_angle) exceeds pi/2 the curve - // becomes inaccurate. But slight exceeding is quite appropriate. - //-------------------------------------------------bezier_arc_angle_epsilon - const double bezier_arc_angle_epsilon = 0.01; - - //------------------------------------------------------------arc_to_bezier - void arc_to_bezier(double cx, double cy, double rx, double ry, - double start_angle, double sweep_angle, - double* curve) - { - double x0 = cos(sweep_angle / 2.0); - double y0 = sin(sweep_angle / 2.0); - double tx = (1.0 - x0) * 4.0 / 3.0; - double ty = y0 - tx * x0 / y0; - double px[4]; - double py[4]; - px[0] = x0; - py[0] = -y0; - px[1] = x0 + tx; - py[1] = -ty; - px[2] = x0 + tx; - py[2] = ty; - px[3] = x0; - py[3] = y0; - - double sn = sin(start_angle + sweep_angle / 2.0); - double cs = cos(start_angle + sweep_angle / 2.0); - - unsigned i; - for(i = 0; i < 4; i++) - { - curve[i * 2] = cx + rx * (px[i] * cs - py[i] * sn); - curve[i * 2 + 1] = cy + ry * (px[i] * sn + py[i] * cs); - } - } - - - - //------------------------------------------------------------------------ - void bezier_arc::init(double x, double y, - double rx, double ry, - double start_angle, - double sweep_angle) - { - start_angle = fmod(start_angle, 2.0 * pi); - if(sweep_angle >= 2.0 * pi) sweep_angle = 2.0 * pi; - if(sweep_angle <= -2.0 * pi) sweep_angle = -2.0 * pi; - - if(fabs(sweep_angle) < 1e-10) - { - m_num_vertices = 4; - m_cmd = path_cmd_line_to; - m_vertices[0] = x + rx * cos(start_angle); - m_vertices[1] = y + ry * sin(start_angle); - m_vertices[2] = x + rx * cos(start_angle + sweep_angle); - m_vertices[3] = y + ry * sin(start_angle + sweep_angle); - return; - } - - double total_sweep = 0.0; - double local_sweep = 0.0; - double prev_sweep; - m_num_vertices = 2; - m_cmd = path_cmd_curve4; - bool done = false; - do - { - if(sweep_angle < 0.0) - { - prev_sweep = total_sweep; - local_sweep = -pi * 0.5; - total_sweep -= pi * 0.5; - if(total_sweep <= sweep_angle + bezier_arc_angle_epsilon) - { - local_sweep = sweep_angle - prev_sweep; - done = true; - } - } - else - { - prev_sweep = total_sweep; - local_sweep = pi * 0.5; - total_sweep += pi * 0.5; - if(total_sweep >= sweep_angle - bezier_arc_angle_epsilon) - { - local_sweep = sweep_angle - prev_sweep; - done = true; - } - } - - arc_to_bezier(x, y, rx, ry, - start_angle, - local_sweep, - m_vertices + m_num_vertices - 2); - - m_num_vertices += 6; - start_angle += local_sweep; - } - while(!done && m_num_vertices < 26); - } - - - - - //-------------------------------------------------------------------- - void bezier_arc_svg::init(double x0, double y0, - double rx, double ry, - double angle, - bool large_arc_flag, - bool sweep_flag, - double x2, double y2) - { - m_radii_ok = true; - - if(rx < 0.0) rx = -rx; - if(ry < 0.0) ry = -rx; - - // Calculate the middle point between - // the current and the final points - //------------------------ - double dx2 = (x0 - x2) / 2.0; - double dy2 = (y0 - y2) / 2.0; - - double cos_a = cos(angle); - double sin_a = sin(angle); - - // Calculate (x1, y1) - //------------------------ - double x1 = cos_a * dx2 + sin_a * dy2; - double y1 = -sin_a * dx2 + cos_a * dy2; - - // Ensure radii are large enough - //------------------------ - double prx = rx * rx; - double pry = ry * ry; - double px1 = x1 * x1; - double py1 = y1 * y1; - - // Check that radii are large enough - //------------------------ - double radii_check = px1/prx + py1/pry; - if(radii_check > 1.0) - { - rx = sqrt(radii_check) * rx; - ry = sqrt(radii_check) * ry; - prx = rx * rx; - pry = ry * ry; - if(radii_check > 10.0) m_radii_ok = false; - } - - // Calculate (cx1, cy1) - //------------------------ - double sign = (large_arc_flag == sweep_flag) ? -1.0 : 1.0; - double sq = (prx*pry - prx*py1 - pry*px1) / (prx*py1 + pry*px1); - double coef = sign * sqrt((sq < 0) ? 0 : sq); - double cx1 = coef * ((rx * y1) / ry); - double cy1 = coef * -((ry * x1) / rx); - - // - // Calculate (cx, cy) from (cx1, cy1) - //------------------------ - double sx2 = (x0 + x2) / 2.0; - double sy2 = (y0 + y2) / 2.0; - double cx = sx2 + (cos_a * cx1 - sin_a * cy1); - double cy = sy2 + (sin_a * cx1 + cos_a * cy1); - - // Calculate the start_angle (angle1) and the sweep_angle (dangle) - //------------------------ - double ux = (x1 - cx1) / rx; - double uy = (y1 - cy1) / ry; - double vx = (-x1 - cx1) / rx; - double vy = (-y1 - cy1) / ry; - double p, n; - - // Calculate the angle start - //------------------------ - n = sqrt(ux*ux + uy*uy); - p = ux; // (1 * ux) + (0 * uy) - sign = (uy < 0) ? -1.0 : 1.0; - double v = p / n; - if(v < -1.0) v = -1.0; - if(v > 1.0) v = 1.0; - double start_angle = sign * acos(v); - - // Calculate the sweep angle - //------------------------ - n = sqrt((ux*ux + uy*uy) * (vx*vx + vy*vy)); - p = ux * vx + uy * vy; - sign = (ux * vy - uy * vx < 0) ? -1.0 : 1.0; - v = p / n; - if(v < -1.0) v = -1.0; - if(v > 1.0) v = 1.0; - double sweep_angle = sign * acos(v); - if(!sweep_flag && sweep_angle > 0) - { - sweep_angle -= pi * 2.0; - } - else - if (sweep_flag && sweep_angle < 0) - { - sweep_angle += pi * 2.0; - } - - // We can now build and transform the resulting arc - //------------------------ - m_arc.init(0.0, 0.0, rx, ry, start_angle, sweep_angle); - trans_affine mtx = trans_affine_rotation(angle); - mtx *= trans_affine_translation(cx, cy); - - for(unsigned i = 2; i < m_arc.num_vertices()-2; i += 2) - { - mtx.transform(m_arc.vertices() + i, m_arc.vertices() + i + 1); - } - - // We must make sure that the starting and ending points - // exactly coincide with the initial (x0,y0) and (x2,y2) - m_arc.vertices()[0] = x0; - m_arc.vertices()[1] = y0; - if(m_arc.num_vertices() > 2) - { - m_arc.vertices()[m_arc.num_vertices() - 2] = x2; - m_arc.vertices()[m_arc.num_vertices() - 1] = y2; - } - } - - -} diff --git a/uppdev/agg24/agg_bezier_arc.h b/uppdev/agg24/agg_bezier_arc.h deleted file mode 100644 index 6d98d1a9f..000000000 --- a/uppdev/agg24/agg_bezier_arc.h +++ /dev/null @@ -1,159 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Arc generator. Produces at most 4 consecutive cubic bezier curves, i.e., -// 4, 7, 10, or 13 vertices. -// -//---------------------------------------------------------------------------- - -#ifndef AGG_BEZIER_ARC_INCLUDED -#define AGG_BEZIER_ARC_INCLUDED - -#include "agg_conv_transform.h" - -namespace agg -{ - - //----------------------------------------------------------------------- - void arc_to_bezier(double cx, double cy, double rx, double ry, - double start_angle, double sweep_angle, - double* curve); - - - //==============================================================bezier_arc - // - // See implemantaion agg_bezier_arc.cpp - // - class bezier_arc - { - public: - //-------------------------------------------------------------------- - bezier_arc() : m_vertex(26), m_num_vertices(0), m_cmd(path_cmd_line_to) {} - bezier_arc(double x, double y, - double rx, double ry, - double start_angle, - double sweep_angle) - { - init(x, y, rx, ry, start_angle, sweep_angle); - } - - //-------------------------------------------------------------------- - void init(double x, double y, - double rx, double ry, - double start_angle, - double sweep_angle); - - //-------------------------------------------------------------------- - void rewind(unsigned) - { - m_vertex = 0; - } - - //-------------------------------------------------------------------- - unsigned vertex(double* x, double* y) - { - if(m_vertex >= m_num_vertices) return path_cmd_stop; - *x = m_vertices[m_vertex]; - *y = m_vertices[m_vertex + 1]; - m_vertex += 2; - return (m_vertex == 2) ? path_cmd_move_to : m_cmd; - } - - // Supplemantary functions. num_vertices() actually returns doubled - // number of vertices. That is, for 1 vertex it returns 2. - //-------------------------------------------------------------------- - unsigned num_vertices() const { return m_num_vertices; } - const double* vertices() const { return m_vertices; } - double* vertices() { return m_vertices; } - - private: - unsigned m_vertex; - unsigned m_num_vertices; - double m_vertices[26]; - unsigned m_cmd; - }; - - - - //==========================================================bezier_arc_svg - // Compute an SVG-style bezier arc. - // - // Computes an elliptical arc from (x1, y1) to (x2, y2). The size and - // orientation of the ellipse are defined by two radii (rx, ry) - // and an x-axis-rotation, which indicates how the ellipse as a whole - // is rotated relative to the current coordinate system. The center - // (cx, cy) of the ellipse is calculated automatically to satisfy the - // constraints imposed by the other parameters. - // large-arc-flag and sweep-flag contribute to the automatic calculations - // and help determine how the arc is drawn. - class bezier_arc_svg - { - public: - //-------------------------------------------------------------------- - bezier_arc_svg() : m_arc(), m_radii_ok(false) {} - - bezier_arc_svg(double x1, double y1, - double rx, double ry, - double angle, - bool large_arc_flag, - bool sweep_flag, - double x2, double y2) : - m_arc(), m_radii_ok(false) - { - init(x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2); - } - - //-------------------------------------------------------------------- - void init(double x1, double y1, - double rx, double ry, - double angle, - bool large_arc_flag, - bool sweep_flag, - double x2, double y2); - - //-------------------------------------------------------------------- - bool radii_ok() const { return m_radii_ok; } - - //-------------------------------------------------------------------- - void rewind(unsigned) - { - m_arc.rewind(0); - } - - //-------------------------------------------------------------------- - unsigned vertex(double* x, double* y) - { - return m_arc.vertex(x, y); - } - - // Supplemantary functions. num_vertices() actually returns doubled - // number of vertices. That is, for 1 vertex it returns 2. - //-------------------------------------------------------------------- - unsigned num_vertices() const { return m_arc.num_vertices(); } - const double* vertices() const { return m_arc.vertices(); } - double* vertices() { return m_arc.vertices(); } - - private: - bezier_arc m_arc; - bool m_radii_ok; - }; - - - - -} - - -#endif diff --git a/uppdev/agg24/agg_bezier_ctrl.cpp b/uppdev/agg24/agg_bezier_ctrl.cpp deleted file mode 100644 index f89dd20f0..000000000 --- a/uppdev/agg24/agg_bezier_ctrl.cpp +++ /dev/null @@ -1,370 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// classes bezier_ctrl_impl, bezier_ctrl -// -//---------------------------------------------------------------------------- - -#include -#include -#include "agg_bezier_ctrl.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - bezier_ctrl_impl::bezier_ctrl_impl() : - ctrl(0,0,1,1,false), - m_stroke(m_curve), - m_poly(4, 5.0), - m_idx(0) - { - m_poly.in_polygon_check(false); - m_poly.xn(0) = 100.0; - m_poly.yn(0) = 0.0; - m_poly.xn(1) = 100.0; - m_poly.yn(1) = 50.0; - m_poly.xn(2) = 50.0; - m_poly.yn(2) = 100.0; - m_poly.xn(3) = 0.0; - m_poly.yn(3) = 100.0; - } - - - //------------------------------------------------------------------------ - void bezier_ctrl_impl::curve(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4) - { - m_poly.xn(0) = x1; - m_poly.yn(0) = y1; - m_poly.xn(1) = x2; - m_poly.yn(1) = y2; - m_poly.xn(2) = x3; - m_poly.yn(2) = y3; - m_poly.xn(3) = x4; - m_poly.yn(3) = y4; - curve(); - } - - //------------------------------------------------------------------------ - curve4& bezier_ctrl_impl::curve() - { - m_curve.init(m_poly.xn(0), m_poly.yn(0), - m_poly.xn(1), m_poly.yn(1), - m_poly.xn(2), m_poly.yn(2), - m_poly.xn(3), m_poly.yn(3)); - return m_curve; - } - - //------------------------------------------------------------------------ - void bezier_ctrl_impl::rewind(unsigned idx) - { - m_idx = idx; - - m_curve.approximation_scale(scale()); - switch(idx) - { - default: - case 0: // Control line 1 - m_curve.init(m_poly.xn(0), m_poly.yn(0), - (m_poly.xn(0) + m_poly.xn(1)) * 0.5, - (m_poly.yn(0) + m_poly.yn(1)) * 0.5, - (m_poly.xn(0) + m_poly.xn(1)) * 0.5, - (m_poly.yn(0) + m_poly.yn(1)) * 0.5, - m_poly.xn(1), m_poly.yn(1)); - m_stroke.rewind(0); - break; - - case 1: // Control line 2 - m_curve.init(m_poly.xn(2), m_poly.yn(2), - (m_poly.xn(2) + m_poly.xn(3)) * 0.5, - (m_poly.yn(2) + m_poly.yn(3)) * 0.5, - (m_poly.xn(2) + m_poly.xn(3)) * 0.5, - (m_poly.yn(2) + m_poly.yn(3)) * 0.5, - m_poly.xn(3), m_poly.yn(3)); - m_stroke.rewind(0); - break; - - case 2: // Curve itself - m_curve.init(m_poly.xn(0), m_poly.yn(0), - m_poly.xn(1), m_poly.yn(1), - m_poly.xn(2), m_poly.yn(2), - m_poly.xn(3), m_poly.yn(3)); - m_stroke.rewind(0); - break; - - case 3: // Point 1 - m_ellipse.init(m_poly.xn(0), m_poly.yn(0), point_radius(), point_radius(), 20); - m_ellipse.rewind(0); - break; - - case 4: // Point 2 - m_ellipse.init(m_poly.xn(1), m_poly.yn(1), point_radius(), point_radius(), 20); - m_ellipse.rewind(0); - break; - - case 5: // Point 3 - m_ellipse.init(m_poly.xn(2), m_poly.yn(2), point_radius(), point_radius(), 20); - m_ellipse.rewind(0); - break; - - case 6: // Point 4 - m_ellipse.init(m_poly.xn(3), m_poly.yn(3), point_radius(), point_radius(), 20); - m_ellipse.rewind(0); - break; - } - } - - - //------------------------------------------------------------------------ - unsigned bezier_ctrl_impl::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_stop; - switch(m_idx) - { - case 0: - case 1: - case 2: - cmd = m_stroke.vertex(x, y); - break; - - case 3: - case 4: - case 5: - case 6: - case 7: - cmd = m_ellipse.vertex(x, y); - break; - } - - if(!is_stop(cmd)) - { - transform_xy(x, y); - } - return cmd; - } - - - - //------------------------------------------------------------------------ - bool bezier_ctrl_impl::in_rect(double x, double y) const - { - return false; - } - - - //------------------------------------------------------------------------ - bool bezier_ctrl_impl::on_mouse_button_down(double x, double y) - { - inverse_transform_xy(&x, &y); - return m_poly.on_mouse_button_down(x, y); - } - - - //------------------------------------------------------------------------ - bool bezier_ctrl_impl::on_mouse_move(double x, double y, bool button_flag) - { - inverse_transform_xy(&x, &y); - return m_poly.on_mouse_move(x, y, button_flag); - } - - - //------------------------------------------------------------------------ - bool bezier_ctrl_impl::on_mouse_button_up(double x, double y) - { - return m_poly.on_mouse_button_up(x, y); - } - - - //------------------------------------------------------------------------ - bool bezier_ctrl_impl::on_arrow_keys(bool left, bool right, bool down, bool up) - { - return m_poly.on_arrow_keys(left, right, down, up); - } - - - - - - - //------------------------------------------------------------------------ - curve3_ctrl_impl::curve3_ctrl_impl() : - ctrl(0,0,1,1,false), - m_stroke(m_curve), - m_poly(3, 5.0), - m_idx(0) - { - m_poly.in_polygon_check(false); - m_poly.xn(0) = 100.0; - m_poly.yn(0) = 0.0; - m_poly.xn(1) = 100.0; - m_poly.yn(1) = 50.0; - m_poly.xn(2) = 50.0; - m_poly.yn(2) = 100.0; - } - - - //------------------------------------------------------------------------ - void curve3_ctrl_impl::curve(double x1, double y1, - double x2, double y2, - double x3, double y3) - { - m_poly.xn(0) = x1; - m_poly.yn(0) = y1; - m_poly.xn(1) = x2; - m_poly.yn(1) = y2; - m_poly.xn(2) = x3; - m_poly.yn(2) = y3; - curve(); - } - - //------------------------------------------------------------------------ - curve3& curve3_ctrl_impl::curve() - { - m_curve.init(m_poly.xn(0), m_poly.yn(0), - m_poly.xn(1), m_poly.yn(1), - m_poly.xn(2), m_poly.yn(2)); - return m_curve; - } - - //------------------------------------------------------------------------ - void curve3_ctrl_impl::rewind(unsigned idx) - { - m_idx = idx; - - switch(idx) - { - default: - case 0: // Control line - m_curve.init(m_poly.xn(0), m_poly.yn(0), - (m_poly.xn(0) + m_poly.xn(1)) * 0.5, - (m_poly.yn(0) + m_poly.yn(1)) * 0.5, - m_poly.xn(1), m_poly.yn(1)); - m_stroke.rewind(0); - break; - - case 1: // Control line 2 - m_curve.init(m_poly.xn(1), m_poly.yn(1), - (m_poly.xn(1) + m_poly.xn(2)) * 0.5, - (m_poly.yn(1) + m_poly.yn(2)) * 0.5, - m_poly.xn(2), m_poly.yn(2)); - m_stroke.rewind(0); - break; - - case 2: // Curve itself - m_curve.init(m_poly.xn(0), m_poly.yn(0), - m_poly.xn(1), m_poly.yn(1), - m_poly.xn(2), m_poly.yn(2)); - m_stroke.rewind(0); - break; - - case 3: // Point 1 - m_ellipse.init(m_poly.xn(0), m_poly.yn(0), point_radius(), point_radius(), 20); - m_ellipse.rewind(0); - break; - - case 4: // Point 2 - m_ellipse.init(m_poly.xn(1), m_poly.yn(1), point_radius(), point_radius(), 20); - m_ellipse.rewind(0); - break; - - case 5: // Point 3 - m_ellipse.init(m_poly.xn(2), m_poly.yn(2), point_radius(), point_radius(), 20); - m_ellipse.rewind(0); - break; - } - } - - - //------------------------------------------------------------------------ - unsigned curve3_ctrl_impl::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_stop; - switch(m_idx) - { - case 0: - case 1: - case 2: - cmd = m_stroke.vertex(x, y); - break; - - case 3: - case 4: - case 5: - case 6: - cmd = m_ellipse.vertex(x, y); - break; - } - - if(!is_stop(cmd)) - { - transform_xy(x, y); - } - return cmd; - } - - - - //------------------------------------------------------------------------ - bool curve3_ctrl_impl::in_rect(double x, double y) const - { - return false; - } - - - //------------------------------------------------------------------------ - bool curve3_ctrl_impl::on_mouse_button_down(double x, double y) - { - inverse_transform_xy(&x, &y); - return m_poly.on_mouse_button_down(x, y); - } - - - //------------------------------------------------------------------------ - bool curve3_ctrl_impl::on_mouse_move(double x, double y, bool button_flag) - { - inverse_transform_xy(&x, &y); - return m_poly.on_mouse_move(x, y, button_flag); - } - - - //------------------------------------------------------------------------ - bool curve3_ctrl_impl::on_mouse_button_up(double x, double y) - { - return m_poly.on_mouse_button_up(x, y); - } - - - //------------------------------------------------------------------------ - bool curve3_ctrl_impl::on_arrow_keys(bool left, bool right, bool down, bool up) - { - return m_poly.on_arrow_keys(left, right, down, up); - } - - - - - - - - - - - - -} - diff --git a/uppdev/agg24/agg_bezier_ctrl.h b/uppdev/agg24/agg_bezier_ctrl.h deleted file mode 100644 index 01851eb3e..000000000 --- a/uppdev/agg24/agg_bezier_ctrl.h +++ /dev/null @@ -1,196 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// classes bezier_ctrl_impl, bezier_ctrl -// -//---------------------------------------------------------------------------- - -#ifndef AGG_BEZIER_CTRL_INCLUDED -#define AGG_BEZIER_CTRL_INCLUDED - -#include "agg_math.h" -#include "agg_ellipse.h" -#include "agg_trans_affine.h" -#include "agg_color_rgba.h" -#include "agg_conv_stroke.h" -#include "agg_conv_curve.h" -#include "agg_polygon_ctrl.h" - - -namespace agg -{ - - //--------------------------------------------------------bezier_ctrl_impl - class bezier_ctrl_impl : public ctrl - { - public: - bezier_ctrl_impl(); - - void curve(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4); - curve4& curve(); - - double x1() const { return m_poly.xn(0); } - double y1() const { return m_poly.yn(0); } - double x2() const { return m_poly.xn(1); } - double y2() const { return m_poly.yn(1); } - double x3() const { return m_poly.xn(2); } - double y3() const { return m_poly.yn(2); } - double x4() const { return m_poly.xn(3); } - double y4() const { return m_poly.yn(3); } - - void x1(double x) { m_poly.xn(0) = x; } - void y1(double y) { m_poly.yn(0) = y; } - void x2(double x) { m_poly.xn(1) = x; } - void y2(double y) { m_poly.yn(1) = y; } - void x3(double x) { m_poly.xn(2) = x; } - void y3(double y) { m_poly.yn(2) = y; } - void x4(double x) { m_poly.xn(3) = x; } - void y4(double y) { m_poly.yn(3) = y; } - - void line_width(double w) { m_stroke.width(w); } - double line_width() const { return m_stroke.width(); } - - void point_radius(double r) { m_poly.point_radius(r); } - double point_radius() const { return m_poly.point_radius(); } - - virtual bool in_rect(double x, double y) const; - virtual bool on_mouse_button_down(double x, double y); - virtual bool on_mouse_button_up(double x, double y); - virtual bool on_mouse_move(double x, double y, bool button_flag); - virtual bool on_arrow_keys(bool left, bool right, bool down, bool up); - - // Vertex source interface - unsigned num_paths() { return 7; }; - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - - private: - curve4 m_curve; - ellipse m_ellipse; - conv_stroke m_stroke; - polygon_ctrl_impl m_poly; - unsigned m_idx; - }; - - - - //----------------------------------------------------------bezier_ctrl - template class bezier_ctrl : public bezier_ctrl_impl - { - public: - bezier_ctrl() : - m_color(rgba(0.0, 0.0, 0.0)) - { - } - - void line_color(const ColorT& c) { m_color = c; } - const ColorT& color(unsigned i) const { return m_color; } - - private: - bezier_ctrl(const bezier_ctrl&); - const bezier_ctrl& operator = (const bezier_ctrl&); - - ColorT m_color; - }; - - - - - - //--------------------------------------------------------curve3_ctrl_impl - class curve3_ctrl_impl : public ctrl - { - public: - curve3_ctrl_impl(); - - void curve(double x1, double y1, - double x2, double y2, - double x3, double y3); - curve3& curve(); - - double x1() const { return m_poly.xn(0); } - double y1() const { return m_poly.yn(0); } - double x2() const { return m_poly.xn(1); } - double y2() const { return m_poly.yn(1); } - double x3() const { return m_poly.xn(2); } - double y3() const { return m_poly.yn(2); } - - void x1(double x) { m_poly.xn(0) = x; } - void y1(double y) { m_poly.yn(0) = y; } - void x2(double x) { m_poly.xn(1) = x; } - void y2(double y) { m_poly.yn(1) = y; } - void x3(double x) { m_poly.xn(2) = x; } - void y3(double y) { m_poly.yn(2) = y; } - - void line_width(double w) { m_stroke.width(w); } - double line_width() const { return m_stroke.width(); } - - void point_radius(double r) { m_poly.point_radius(r); } - double point_radius() const { return m_poly.point_radius(); } - - virtual bool in_rect(double x, double y) const; - virtual bool on_mouse_button_down(double x, double y); - virtual bool on_mouse_button_up(double x, double y); - virtual bool on_mouse_move(double x, double y, bool button_flag); - virtual bool on_arrow_keys(bool left, bool right, bool down, bool up); - - // Vertex source interface - unsigned num_paths() { return 6; }; - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - - private: - curve3 m_curve; - ellipse m_ellipse; - conv_stroke m_stroke; - polygon_ctrl_impl m_poly; - unsigned m_idx; - }; - - - - //----------------------------------------------------------curve3_ctrl - template class curve3_ctrl : public curve3_ctrl_impl - { - public: - curve3_ctrl() : - m_color(rgba(0.0, 0.0, 0.0)) - { - } - - void line_color(const ColorT& c) { m_color = c; } - const ColorT& color(unsigned i) const { return m_color; } - - private: - curve3_ctrl(const curve3_ctrl&); - const curve3_ctrl& operator = (const curve3_ctrl&); - - ColorT m_color; - }; - - - - -} - - - -#endif - diff --git a/uppdev/agg24/agg_bitset_iterator.h b/uppdev/agg24/agg_bitset_iterator.h deleted file mode 100644 index 7382d5c33..000000000 --- a/uppdev/agg24/agg_bitset_iterator.h +++ /dev/null @@ -1,54 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_BITSET_ITERATOR_INCLUDED -#define AGG_BITSET_ITERATOR_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - - class bitset_iterator - { - public: - bitset_iterator(const int8u* bits, unsigned offset = 0) : - m_bits(bits + (offset >> 3)), - m_mask(0x80 >> (offset & 7)) - {} - - void operator ++ () - { - m_mask >>= 1; - if(m_mask == 0) - { - ++m_bits; - m_mask = 0x80; - } - } - - unsigned bit() const - { - return (*m_bits) & m_mask; - } - - private: - const int8u* m_bits; - int8u m_mask; - }; - -} - -#endif diff --git a/uppdev/agg24/agg_blur.h b/uppdev/agg24/agg_blur.h deleted file mode 100644 index 0860f52e1..000000000 --- a/uppdev/agg24/agg_blur.h +++ /dev/null @@ -1,1294 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// The Stack Blur Algorithm was invented by Mario Klingemann, -// mario@quasimondo.com and described here: -// http://incubator.quasimondo.com/processing/fast_blur_deluxe.php -// (search phrase "Stackblur: Fast But Goodlooking"). -// The major improvement is that there's no more division table -// that was very expensive to create for large blur radii. Insted, -// for 8-bit per channel and radius not exceeding 254 the division is -// replaced by multiplication and shift. -// -//---------------------------------------------------------------------------- - -#ifndef AGG_BLUR_INCLUDED -#define AGG_BLUR_INCLUDED - -#include "agg_array.h" -#include "agg_pixfmt_transposer.h" - -namespace agg -{ - - template struct stack_blur_tables - { - static int16u const g_stack_blur8_mul[255]; - static int8u const g_stack_blur8_shr[255]; - }; - - //------------------------------------------------------------------------ - template - int16u const stack_blur_tables::g_stack_blur8_mul[255] = - { - 512,512,456,512,328,456,335,512,405,328,271,456,388,335,292,512, - 454,405,364,328,298,271,496,456,420,388,360,335,312,292,273,512, - 482,454,428,405,383,364,345,328,312,298,284,271,259,496,475,456, - 437,420,404,388,374,360,347,335,323,312,302,292,282,273,265,512, - 497,482,468,454,441,428,417,405,394,383,373,364,354,345,337,328, - 320,312,305,298,291,284,278,271,265,259,507,496,485,475,465,456, - 446,437,428,420,412,404,396,388,381,374,367,360,354,347,341,335, - 329,323,318,312,307,302,297,292,287,282,278,273,269,265,261,512, - 505,497,489,482,475,468,461,454,447,441,435,428,422,417,411,405, - 399,394,389,383,378,373,368,364,359,354,350,345,341,337,332,328, - 324,320,316,312,309,305,301,298,294,291,287,284,281,278,274,271, - 268,265,262,259,257,507,501,496,491,485,480,475,470,465,460,456, - 451,446,442,437,433,428,424,420,416,412,408,404,400,396,392,388, - 385,381,377,374,370,367,363,360,357,354,350,347,344,341,338,335, - 332,329,326,323,320,318,315,312,310,307,304,302,299,297,294,292, - 289,287,285,282,280,278,275,273,271,269,267,265,263,261,259 - }; - - //------------------------------------------------------------------------ - template - int8u const stack_blur_tables::g_stack_blur8_shr[255] = - { - 9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, - 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24 - }; - - - - //==============================================================stack_blur - template class stack_blur - { - public: - typedef ColorT color_type; - typedef CalculatorT calculator_type; - - //-------------------------------------------------------------------- - template void blur_x(Img& img, unsigned radius) - { - if(radius < 1) return; - - unsigned x, y, xp, i; - unsigned stack_ptr; - unsigned stack_start; - - color_type pix; - color_type* stack_pix; - calculator_type sum; - calculator_type sum_in; - calculator_type sum_out; - - unsigned w = img.width(); - unsigned h = img.height(); - unsigned wm = w - 1; - unsigned div = radius * 2 + 1; - - unsigned div_sum = (radius + 1) * (radius + 1); - unsigned mul_sum = 0; - unsigned shr_sum = 0; - unsigned max_val = color_type::base_mask; - - if(max_val <= 255 && radius < 255) - { - mul_sum = stack_blur_tables::g_stack_blur8_mul[radius]; - shr_sum = stack_blur_tables::g_stack_blur8_shr[radius]; - } - - m_buf.allocate(w, 128); - m_stack.allocate(div, 32); - - for(y = 0; y < h; y++) - { - sum.clear(); - sum_in.clear(); - sum_out.clear(); - - pix = img.pixel(0, y); - for(i = 0; i <= radius; i++) - { - m_stack[i] = pix; - sum.add(pix, i + 1); - sum_out.add(pix); - } - for(i = 1; i <= radius; i++) - { - pix = img.pixel((i > wm) ? wm : i, y); - m_stack[i + radius] = pix; - sum.add(pix, radius + 1 - i); - sum_in.add(pix); - } - - stack_ptr = radius; - for(x = 0; x < w; x++) - { - if(mul_sum) sum.calc_pix(m_buf[x], mul_sum, shr_sum); - else sum.calc_pix(m_buf[x], div_sum); - - sum.sub(sum_out); - - stack_start = stack_ptr + div - radius; - if(stack_start >= div) stack_start -= div; - stack_pix = &m_stack[stack_start]; - - sum_out.sub(*stack_pix); - - xp = x + radius + 1; - if(xp > wm) xp = wm; - pix = img.pixel(xp, y); - - *stack_pix = pix; - - sum_in.add(pix); - sum.add(sum_in); - - ++stack_ptr; - if(stack_ptr >= div) stack_ptr = 0; - stack_pix = &m_stack[stack_ptr]; - - sum_out.add(*stack_pix); - sum_in.sub(*stack_pix); - } - img.copy_color_hspan(0, y, w, &m_buf[0]); - } - } - - //-------------------------------------------------------------------- - template void blur_y(Img& img, unsigned radius) - { - pixfmt_transposer img2(img); - blur_x(img2, radius); - } - - //-------------------------------------------------------------------- - template void blur(Img& img, unsigned radius) - { - blur_x(img, radius); - pixfmt_transposer img2(img); - blur_x(img2, radius); - } - - private: - pod_vector m_buf; - pod_vector m_stack; - }; - - //====================================================stack_blur_calc_rgba - template struct stack_blur_calc_rgba - { - typedef T value_type; - value_type r,g,b,a; - - AGG_INLINE void clear() - { - r = g = b = a = 0; - } - - template AGG_INLINE void add(const ArgT& v) - { - r += v.r; - g += v.g; - b += v.b; - a += v.a; - } - - template AGG_INLINE void add(const ArgT& v, unsigned k) - { - r += v.r * k; - g += v.g * k; - b += v.b * k; - a += v.a * k; - } - - template AGG_INLINE void sub(const ArgT& v) - { - r -= v.r; - g -= v.g; - b -= v.b; - a -= v.a; - } - - template AGG_INLINE void calc_pix(ArgT& v, unsigned div) - { - typedef typename ArgT::value_type value_type; - v.r = value_type(r / div); - v.g = value_type(g / div); - v.b = value_type(b / div); - v.a = value_type(a / div); - } - - template - AGG_INLINE void calc_pix(ArgT& v, unsigned mul, unsigned shr) - { - typedef typename ArgT::value_type value_type; - v.r = value_type((r * mul) >> shr); - v.g = value_type((g * mul) >> shr); - v.b = value_type((b * mul) >> shr); - v.a = value_type((a * mul) >> shr); - } - }; - - - //=====================================================stack_blur_calc_rgb - template struct stack_blur_calc_rgb - { - typedef T value_type; - value_type r,g,b; - - AGG_INLINE void clear() - { - r = g = b = 0; - } - - template AGG_INLINE void add(const ArgT& v) - { - r += v.r; - g += v.g; - b += v.b; - } - - template AGG_INLINE void add(const ArgT& v, unsigned k) - { - r += v.r * k; - g += v.g * k; - b += v.b * k; - } - - template AGG_INLINE void sub(const ArgT& v) - { - r -= v.r; - g -= v.g; - b -= v.b; - } - - template AGG_INLINE void calc_pix(ArgT& v, unsigned div) - { - typedef typename ArgT::value_type value_type; - v.r = value_type(r / div); - v.g = value_type(g / div); - v.b = value_type(b / div); - } - - template - AGG_INLINE void calc_pix(ArgT& v, unsigned mul, unsigned shr) - { - typedef typename ArgT::value_type value_type; - v.r = value_type((r * mul) >> shr); - v.g = value_type((g * mul) >> shr); - v.b = value_type((b * mul) >> shr); - } - }; - - - //====================================================stack_blur_calc_gray - template struct stack_blur_calc_gray - { - typedef T value_type; - value_type v; - - AGG_INLINE void clear() - { - v = 0; - } - - template AGG_INLINE void add(const ArgT& a) - { - v += a.v; - } - - template AGG_INLINE void add(const ArgT& a, unsigned k) - { - v += a.v * k; - } - - template AGG_INLINE void sub(const ArgT& a) - { - v -= a.v; - } - - template AGG_INLINE void calc_pix(ArgT& a, unsigned div) - { - typedef typename ArgT::value_type value_type; - a.v = value_type(v / div); - } - - template - AGG_INLINE void calc_pix(ArgT& a, unsigned mul, unsigned shr) - { - typedef typename ArgT::value_type value_type; - a.v = value_type((v * mul) >> shr); - } - }; - - - - //========================================================stack_blur_gray8 - template - void stack_blur_gray8(Img& img, unsigned rx, unsigned ry) - { - unsigned x, y, xp, yp, i; - unsigned stack_ptr; - unsigned stack_start; - - const int8u* src_pix_ptr; - int8u* dst_pix_ptr; - unsigned pix; - unsigned stack_pix; - unsigned sum; - unsigned sum_in; - unsigned sum_out; - - unsigned w = img.width(); - unsigned h = img.height(); - unsigned wm = w - 1; - unsigned hm = h - 1; - - unsigned div; - unsigned mul_sum; - unsigned shr_sum; - - pod_vector stack; - - if(rx > 0) - { - if(rx > 254) rx = 254; - div = rx * 2 + 1; - mul_sum = stack_blur_tables::g_stack_blur8_mul[rx]; - shr_sum = stack_blur_tables::g_stack_blur8_shr[rx]; - stack.allocate(div); - - for(y = 0; y < h; y++) - { - sum = sum_in = sum_out = 0; - - src_pix_ptr = img.pix_ptr(0, y); - pix = *src_pix_ptr; - for(i = 0; i <= rx; i++) - { - stack[i] = pix; - sum += pix * (i + 1); - sum_out += pix; - } - for(i = 1; i <= rx; i++) - { - if(i <= wm) src_pix_ptr += Img::pix_step; - pix = *src_pix_ptr; - stack[i + rx] = pix; - sum += pix * (rx + 1 - i); - sum_in += pix; - } - - stack_ptr = rx; - xp = rx; - if(xp > wm) xp = wm; - src_pix_ptr = img.pix_ptr(xp, y); - dst_pix_ptr = img.pix_ptr(0, y); - for(x = 0; x < w; x++) - { - *dst_pix_ptr = (sum * mul_sum) >> shr_sum; - dst_pix_ptr += Img::pix_step; - - sum -= sum_out; - - stack_start = stack_ptr + div - rx; - if(stack_start >= div) stack_start -= div; - sum_out -= stack[stack_start]; - - if(xp < wm) - { - src_pix_ptr += Img::pix_step; - pix = *src_pix_ptr; - ++xp; - } - - stack[stack_start] = pix; - - sum_in += pix; - sum += sum_in; - - ++stack_ptr; - if(stack_ptr >= div) stack_ptr = 0; - stack_pix = stack[stack_ptr]; - - sum_out += stack_pix; - sum_in -= stack_pix; - } - } - } - - if(ry > 0) - { - if(ry > 254) ry = 254; - div = ry * 2 + 1; - mul_sum = stack_blur_tables::g_stack_blur8_mul[ry]; - shr_sum = stack_blur_tables::g_stack_blur8_shr[ry]; - stack.allocate(div); - - int stride = img.stride(); - for(x = 0; x < w; x++) - { - sum = sum_in = sum_out = 0; - - src_pix_ptr = img.pix_ptr(x, 0); - pix = *src_pix_ptr; - for(i = 0; i <= ry; i++) - { - stack[i] = pix; - sum += pix * (i + 1); - sum_out += pix; - } - for(i = 1; i <= ry; i++) - { - if(i <= hm) src_pix_ptr += stride; - pix = *src_pix_ptr; - stack[i + ry] = pix; - sum += pix * (ry + 1 - i); - sum_in += pix; - } - - stack_ptr = ry; - yp = ry; - if(yp > hm) yp = hm; - src_pix_ptr = img.pix_ptr(x, yp); - dst_pix_ptr = img.pix_ptr(x, 0); - for(y = 0; y < h; y++) - { - *dst_pix_ptr = (sum * mul_sum) >> shr_sum; - dst_pix_ptr += stride; - - sum -= sum_out; - - stack_start = stack_ptr + div - ry; - if(stack_start >= div) stack_start -= div; - sum_out -= stack[stack_start]; - - if(yp < hm) - { - src_pix_ptr += stride; - pix = *src_pix_ptr; - ++yp; - } - - stack[stack_start] = pix; - - sum_in += pix; - sum += sum_in; - - ++stack_ptr; - if(stack_ptr >= div) stack_ptr = 0; - stack_pix = stack[stack_ptr]; - - sum_out += stack_pix; - sum_in -= stack_pix; - } - } - } - } - - - - //========================================================stack_blur_rgb24 - template - void stack_blur_rgb24(Img& img, unsigned rx, unsigned ry) - { - typedef typename Img::color_type color_type; - typedef typename Img::order_type order_type; - enum order_e - { - R = order_type::R, - G = order_type::G, - B = order_type::B - }; - - unsigned x, y, xp, yp, i; - unsigned stack_ptr; - unsigned stack_start; - - const int8u* src_pix_ptr; - int8u* dst_pix_ptr; - color_type* stack_pix_ptr; - - unsigned sum_r; - unsigned sum_g; - unsigned sum_b; - unsigned sum_in_r; - unsigned sum_in_g; - unsigned sum_in_b; - unsigned sum_out_r; - unsigned sum_out_g; - unsigned sum_out_b; - - unsigned w = img.width(); - unsigned h = img.height(); - unsigned wm = w - 1; - unsigned hm = h - 1; - - unsigned div; - unsigned mul_sum; - unsigned shr_sum; - - pod_vector stack; - - if(rx > 0) - { - if(rx > 254) rx = 254; - div = rx * 2 + 1; - mul_sum = stack_blur_tables::g_stack_blur8_mul[rx]; - shr_sum = stack_blur_tables::g_stack_blur8_shr[rx]; - stack.allocate(div); - - for(y = 0; y < h; y++) - { - sum_r = - sum_g = - sum_b = - sum_in_r = - sum_in_g = - sum_in_b = - sum_out_r = - sum_out_g = - sum_out_b = 0; - - src_pix_ptr = img.pix_ptr(0, y); - for(i = 0; i <= rx; i++) - { - stack_pix_ptr = &stack[i]; - stack_pix_ptr->r = src_pix_ptr[R]; - stack_pix_ptr->g = src_pix_ptr[G]; - stack_pix_ptr->b = src_pix_ptr[B]; - sum_r += src_pix_ptr[R] * (i + 1); - sum_g += src_pix_ptr[G] * (i + 1); - sum_b += src_pix_ptr[B] * (i + 1); - sum_out_r += src_pix_ptr[R]; - sum_out_g += src_pix_ptr[G]; - sum_out_b += src_pix_ptr[B]; - } - for(i = 1; i <= rx; i++) - { - if(i <= wm) src_pix_ptr += Img::pix_width; - stack_pix_ptr = &stack[i + rx]; - stack_pix_ptr->r = src_pix_ptr[R]; - stack_pix_ptr->g = src_pix_ptr[G]; - stack_pix_ptr->b = src_pix_ptr[B]; - sum_r += src_pix_ptr[R] * (rx + 1 - i); - sum_g += src_pix_ptr[G] * (rx + 1 - i); - sum_b += src_pix_ptr[B] * (rx + 1 - i); - sum_in_r += src_pix_ptr[R]; - sum_in_g += src_pix_ptr[G]; - sum_in_b += src_pix_ptr[B]; - } - - stack_ptr = rx; - xp = rx; - if(xp > wm) xp = wm; - src_pix_ptr = img.pix_ptr(xp, y); - dst_pix_ptr = img.pix_ptr(0, y); - for(x = 0; x < w; x++) - { - dst_pix_ptr[R] = (sum_r * mul_sum) >> shr_sum; - dst_pix_ptr[G] = (sum_g * mul_sum) >> shr_sum; - dst_pix_ptr[B] = (sum_b * mul_sum) >> shr_sum; - dst_pix_ptr += Img::pix_width; - - sum_r -= sum_out_r; - sum_g -= sum_out_g; - sum_b -= sum_out_b; - - stack_start = stack_ptr + div - rx; - if(stack_start >= div) stack_start -= div; - stack_pix_ptr = &stack[stack_start]; - - sum_out_r -= stack_pix_ptr->r; - sum_out_g -= stack_pix_ptr->g; - sum_out_b -= stack_pix_ptr->b; - - if(xp < wm) - { - src_pix_ptr += Img::pix_width; - ++xp; - } - - stack_pix_ptr->r = src_pix_ptr[R]; - stack_pix_ptr->g = src_pix_ptr[G]; - stack_pix_ptr->b = src_pix_ptr[B]; - - sum_in_r += src_pix_ptr[R]; - sum_in_g += src_pix_ptr[G]; - sum_in_b += src_pix_ptr[B]; - sum_r += sum_in_r; - sum_g += sum_in_g; - sum_b += sum_in_b; - - ++stack_ptr; - if(stack_ptr >= div) stack_ptr = 0; - stack_pix_ptr = &stack[stack_ptr]; - - sum_out_r += stack_pix_ptr->r; - sum_out_g += stack_pix_ptr->g; - sum_out_b += stack_pix_ptr->b; - sum_in_r -= stack_pix_ptr->r; - sum_in_g -= stack_pix_ptr->g; - sum_in_b -= stack_pix_ptr->b; - } - } - } - - if(ry > 0) - { - if(ry > 254) ry = 254; - div = ry * 2 + 1; - mul_sum = stack_blur_tables::g_stack_blur8_mul[ry]; - shr_sum = stack_blur_tables::g_stack_blur8_shr[ry]; - stack.allocate(div); - - int stride = img.stride(); - for(x = 0; x < w; x++) - { - sum_r = - sum_g = - sum_b = - sum_in_r = - sum_in_g = - sum_in_b = - sum_out_r = - sum_out_g = - sum_out_b = 0; - - src_pix_ptr = img.pix_ptr(x, 0); - for(i = 0; i <= ry; i++) - { - stack_pix_ptr = &stack[i]; - stack_pix_ptr->r = src_pix_ptr[R]; - stack_pix_ptr->g = src_pix_ptr[G]; - stack_pix_ptr->b = src_pix_ptr[B]; - sum_r += src_pix_ptr[R] * (i + 1); - sum_g += src_pix_ptr[G] * (i + 1); - sum_b += src_pix_ptr[B] * (i + 1); - sum_out_r += src_pix_ptr[R]; - sum_out_g += src_pix_ptr[G]; - sum_out_b += src_pix_ptr[B]; - } - for(i = 1; i <= ry; i++) - { - if(i <= hm) src_pix_ptr += stride; - stack_pix_ptr = &stack[i + ry]; - stack_pix_ptr->r = src_pix_ptr[R]; - stack_pix_ptr->g = src_pix_ptr[G]; - stack_pix_ptr->b = src_pix_ptr[B]; - sum_r += src_pix_ptr[R] * (ry + 1 - i); - sum_g += src_pix_ptr[G] * (ry + 1 - i); - sum_b += src_pix_ptr[B] * (ry + 1 - i); - sum_in_r += src_pix_ptr[R]; - sum_in_g += src_pix_ptr[G]; - sum_in_b += src_pix_ptr[B]; - } - - stack_ptr = ry; - yp = ry; - if(yp > hm) yp = hm; - src_pix_ptr = img.pix_ptr(x, yp); - dst_pix_ptr = img.pix_ptr(x, 0); - for(y = 0; y < h; y++) - { - dst_pix_ptr[R] = (sum_r * mul_sum) >> shr_sum; - dst_pix_ptr[G] = (sum_g * mul_sum) >> shr_sum; - dst_pix_ptr[B] = (sum_b * mul_sum) >> shr_sum; - dst_pix_ptr += stride; - - sum_r -= sum_out_r; - sum_g -= sum_out_g; - sum_b -= sum_out_b; - - stack_start = stack_ptr + div - ry; - if(stack_start >= div) stack_start -= div; - - stack_pix_ptr = &stack[stack_start]; - sum_out_r -= stack_pix_ptr->r; - sum_out_g -= stack_pix_ptr->g; - sum_out_b -= stack_pix_ptr->b; - - if(yp < hm) - { - src_pix_ptr += stride; - ++yp; - } - - stack_pix_ptr->r = src_pix_ptr[R]; - stack_pix_ptr->g = src_pix_ptr[G]; - stack_pix_ptr->b = src_pix_ptr[B]; - - sum_in_r += src_pix_ptr[R]; - sum_in_g += src_pix_ptr[G]; - sum_in_b += src_pix_ptr[B]; - sum_r += sum_in_r; - sum_g += sum_in_g; - sum_b += sum_in_b; - - ++stack_ptr; - if(stack_ptr >= div) stack_ptr = 0; - stack_pix_ptr = &stack[stack_ptr]; - - sum_out_r += stack_pix_ptr->r; - sum_out_g += stack_pix_ptr->g; - sum_out_b += stack_pix_ptr->b; - sum_in_r -= stack_pix_ptr->r; - sum_in_g -= stack_pix_ptr->g; - sum_in_b -= stack_pix_ptr->b; - } - } - } - } - - - - //=======================================================stack_blur_rgba32 - template - void stack_blur_rgba32(Img& img, unsigned rx, unsigned ry) - { - typedef typename Img::color_type color_type; - typedef typename Img::order_type order_type; - enum order_e - { - R = order_type::R, - G = order_type::G, - B = order_type::B, - A = order_type::A - }; - - unsigned x, y, xp, yp, i; - unsigned stack_ptr; - unsigned stack_start; - - const int8u* src_pix_ptr; - int8u* dst_pix_ptr; - color_type* stack_pix_ptr; - - unsigned sum_r; - unsigned sum_g; - unsigned sum_b; - unsigned sum_a; - unsigned sum_in_r; - unsigned sum_in_g; - unsigned sum_in_b; - unsigned sum_in_a; - unsigned sum_out_r; - unsigned sum_out_g; - unsigned sum_out_b; - unsigned sum_out_a; - - unsigned w = img.width(); - unsigned h = img.height(); - unsigned wm = w - 1; - unsigned hm = h - 1; - - unsigned div; - unsigned mul_sum; - unsigned shr_sum; - - pod_vector stack; - - if(rx > 0) - { - if(rx > 254) rx = 254; - div = rx * 2 + 1; - mul_sum = stack_blur_tables::g_stack_blur8_mul[rx]; - shr_sum = stack_blur_tables::g_stack_blur8_shr[rx]; - stack.allocate(div); - - for(y = 0; y < h; y++) - { - sum_r = - sum_g = - sum_b = - sum_a = - sum_in_r = - sum_in_g = - sum_in_b = - sum_in_a = - sum_out_r = - sum_out_g = - sum_out_b = - sum_out_a = 0; - - src_pix_ptr = img.pix_ptr(0, y); - for(i = 0; i <= rx; i++) - { - stack_pix_ptr = &stack[i]; - stack_pix_ptr->r = src_pix_ptr[R]; - stack_pix_ptr->g = src_pix_ptr[G]; - stack_pix_ptr->b = src_pix_ptr[B]; - stack_pix_ptr->a = src_pix_ptr[A]; - sum_r += src_pix_ptr[R] * (i + 1); - sum_g += src_pix_ptr[G] * (i + 1); - sum_b += src_pix_ptr[B] * (i + 1); - sum_a += src_pix_ptr[A] * (i + 1); - sum_out_r += src_pix_ptr[R]; - sum_out_g += src_pix_ptr[G]; - sum_out_b += src_pix_ptr[B]; - sum_out_a += src_pix_ptr[A]; - } - for(i = 1; i <= rx; i++) - { - if(i <= wm) src_pix_ptr += Img::pix_width; - stack_pix_ptr = &stack[i + rx]; - stack_pix_ptr->r = src_pix_ptr[R]; - stack_pix_ptr->g = src_pix_ptr[G]; - stack_pix_ptr->b = src_pix_ptr[B]; - stack_pix_ptr->a = src_pix_ptr[A]; - sum_r += src_pix_ptr[R] * (rx + 1 - i); - sum_g += src_pix_ptr[G] * (rx + 1 - i); - sum_b += src_pix_ptr[B] * (rx + 1 - i); - sum_a += src_pix_ptr[A] * (rx + 1 - i); - sum_in_r += src_pix_ptr[R]; - sum_in_g += src_pix_ptr[G]; - sum_in_b += src_pix_ptr[B]; - sum_in_a += src_pix_ptr[A]; - } - - stack_ptr = rx; - xp = rx; - if(xp > wm) xp = wm; - src_pix_ptr = img.pix_ptr(xp, y); - dst_pix_ptr = img.pix_ptr(0, y); - for(x = 0; x < w; x++) - { - dst_pix_ptr[R] = (sum_r * mul_sum) >> shr_sum; - dst_pix_ptr[G] = (sum_g * mul_sum) >> shr_sum; - dst_pix_ptr[B] = (sum_b * mul_sum) >> shr_sum; - dst_pix_ptr[A] = (sum_a * mul_sum) >> shr_sum; - dst_pix_ptr += Img::pix_width; - - sum_r -= sum_out_r; - sum_g -= sum_out_g; - sum_b -= sum_out_b; - sum_a -= sum_out_a; - - stack_start = stack_ptr + div - rx; - if(stack_start >= div) stack_start -= div; - stack_pix_ptr = &stack[stack_start]; - - sum_out_r -= stack_pix_ptr->r; - sum_out_g -= stack_pix_ptr->g; - sum_out_b -= stack_pix_ptr->b; - sum_out_a -= stack_pix_ptr->a; - - if(xp < wm) - { - src_pix_ptr += Img::pix_width; - ++xp; - } - - stack_pix_ptr->r = src_pix_ptr[R]; - stack_pix_ptr->g = src_pix_ptr[G]; - stack_pix_ptr->b = src_pix_ptr[B]; - stack_pix_ptr->a = src_pix_ptr[A]; - - sum_in_r += src_pix_ptr[R]; - sum_in_g += src_pix_ptr[G]; - sum_in_b += src_pix_ptr[B]; - sum_in_a += src_pix_ptr[A]; - sum_r += sum_in_r; - sum_g += sum_in_g; - sum_b += sum_in_b; - sum_a += sum_in_a; - - ++stack_ptr; - if(stack_ptr >= div) stack_ptr = 0; - stack_pix_ptr = &stack[stack_ptr]; - - sum_out_r += stack_pix_ptr->r; - sum_out_g += stack_pix_ptr->g; - sum_out_b += stack_pix_ptr->b; - sum_out_a += stack_pix_ptr->a; - sum_in_r -= stack_pix_ptr->r; - sum_in_g -= stack_pix_ptr->g; - sum_in_b -= stack_pix_ptr->b; - sum_in_a -= stack_pix_ptr->a; - } - } - } - - if(ry > 0) - { - if(ry > 254) ry = 254; - div = ry * 2 + 1; - mul_sum = stack_blur_tables::g_stack_blur8_mul[ry]; - shr_sum = stack_blur_tables::g_stack_blur8_shr[ry]; - stack.allocate(div); - - int stride = img.stride(); - for(x = 0; x < w; x++) - { - sum_r = - sum_g = - sum_b = - sum_a = - sum_in_r = - sum_in_g = - sum_in_b = - sum_in_a = - sum_out_r = - sum_out_g = - sum_out_b = - sum_out_a = 0; - - src_pix_ptr = img.pix_ptr(x, 0); - for(i = 0; i <= ry; i++) - { - stack_pix_ptr = &stack[i]; - stack_pix_ptr->r = src_pix_ptr[R]; - stack_pix_ptr->g = src_pix_ptr[G]; - stack_pix_ptr->b = src_pix_ptr[B]; - stack_pix_ptr->a = src_pix_ptr[A]; - sum_r += src_pix_ptr[R] * (i + 1); - sum_g += src_pix_ptr[G] * (i + 1); - sum_b += src_pix_ptr[B] * (i + 1); - sum_a += src_pix_ptr[A] * (i + 1); - sum_out_r += src_pix_ptr[R]; - sum_out_g += src_pix_ptr[G]; - sum_out_b += src_pix_ptr[B]; - sum_out_a += src_pix_ptr[A]; - } - for(i = 1; i <= ry; i++) - { - if(i <= hm) src_pix_ptr += stride; - stack_pix_ptr = &stack[i + ry]; - stack_pix_ptr->r = src_pix_ptr[R]; - stack_pix_ptr->g = src_pix_ptr[G]; - stack_pix_ptr->b = src_pix_ptr[B]; - stack_pix_ptr->a = src_pix_ptr[A]; - sum_r += src_pix_ptr[R] * (ry + 1 - i); - sum_g += src_pix_ptr[G] * (ry + 1 - i); - sum_b += src_pix_ptr[B] * (ry + 1 - i); - sum_a += src_pix_ptr[A] * (ry + 1 - i); - sum_in_r += src_pix_ptr[R]; - sum_in_g += src_pix_ptr[G]; - sum_in_b += src_pix_ptr[B]; - sum_in_a += src_pix_ptr[A]; - } - - stack_ptr = ry; - yp = ry; - if(yp > hm) yp = hm; - src_pix_ptr = img.pix_ptr(x, yp); - dst_pix_ptr = img.pix_ptr(x, 0); - for(y = 0; y < h; y++) - { - dst_pix_ptr[R] = (sum_r * mul_sum) >> shr_sum; - dst_pix_ptr[G] = (sum_g * mul_sum) >> shr_sum; - dst_pix_ptr[B] = (sum_b * mul_sum) >> shr_sum; - dst_pix_ptr[A] = (sum_a * mul_sum) >> shr_sum; - dst_pix_ptr += stride; - - sum_r -= sum_out_r; - sum_g -= sum_out_g; - sum_b -= sum_out_b; - sum_a -= sum_out_a; - - stack_start = stack_ptr + div - ry; - if(stack_start >= div) stack_start -= div; - - stack_pix_ptr = &stack[stack_start]; - sum_out_r -= stack_pix_ptr->r; - sum_out_g -= stack_pix_ptr->g; - sum_out_b -= stack_pix_ptr->b; - sum_out_a -= stack_pix_ptr->a; - - if(yp < hm) - { - src_pix_ptr += stride; - ++yp; - } - - stack_pix_ptr->r = src_pix_ptr[R]; - stack_pix_ptr->g = src_pix_ptr[G]; - stack_pix_ptr->b = src_pix_ptr[B]; - stack_pix_ptr->a = src_pix_ptr[A]; - - sum_in_r += src_pix_ptr[R]; - sum_in_g += src_pix_ptr[G]; - sum_in_b += src_pix_ptr[B]; - sum_in_a += src_pix_ptr[A]; - sum_r += sum_in_r; - sum_g += sum_in_g; - sum_b += sum_in_b; - sum_a += sum_in_a; - - ++stack_ptr; - if(stack_ptr >= div) stack_ptr = 0; - stack_pix_ptr = &stack[stack_ptr]; - - sum_out_r += stack_pix_ptr->r; - sum_out_g += stack_pix_ptr->g; - sum_out_b += stack_pix_ptr->b; - sum_out_a += stack_pix_ptr->a; - sum_in_r -= stack_pix_ptr->r; - sum_in_g -= stack_pix_ptr->g; - sum_in_b -= stack_pix_ptr->b; - sum_in_a -= stack_pix_ptr->a; - } - } - } - } - - - - //===========================================================recursive_blur - template class recursive_blur - { - public: - typedef ColorT color_type; - typedef CalculatorT calculator_type; - typedef typename color_type::value_type value_type; - typedef typename calculator_type::value_type calc_type; - - //-------------------------------------------------------------------- - template void blur_x(Img& img, double radius) - { - if(radius < 0.62) return; - if(img.width() < 3) return; - - calc_type s = calc_type(radius * 0.5); - calc_type q = calc_type((s < 2.5) ? - 3.97156 - 4.14554 * sqrt(1 - 0.26891 * s) : - 0.98711 * s - 0.96330); - - calc_type q2 = calc_type(q * q); - calc_type q3 = calc_type(q2 * q); - - calc_type b0 = calc_type(1.0 / (1.578250 + - 2.444130 * q + - 1.428100 * q2 + - 0.422205 * q3)); - - calc_type b1 = calc_type( 2.44413 * q + - 2.85619 * q2 + - 1.26661 * q3); - - calc_type b2 = calc_type(-1.42810 * q2 + - -1.26661 * q3); - - calc_type b3 = calc_type(0.422205 * q3); - - calc_type b = calc_type(1 - (b1 + b2 + b3) * b0); - - b1 *= b0; - b2 *= b0; - b3 *= b0; - - int w = img.width(); - int h = img.height(); - int wm = w-1; - int x, y; - - m_sum1.allocate(w); - m_sum2.allocate(w); - m_buf.allocate(w); - - for(y = 0; y < h; y++) - { - calculator_type c; - c.from_pix(img.pixel(0, y)); - m_sum1[0].calc(b, b1, b2, b3, c, c, c, c); - c.from_pix(img.pixel(1, y)); - m_sum1[1].calc(b, b1, b2, b3, c, m_sum1[0], m_sum1[0], m_sum1[0]); - c.from_pix(img.pixel(2, y)); - m_sum1[2].calc(b, b1, b2, b3, c, m_sum1[1], m_sum1[0], m_sum1[0]); - - for(x = 3; x < w; ++x) - { - c.from_pix(img.pixel(x, y)); - m_sum1[x].calc(b, b1, b2, b3, c, m_sum1[x-1], m_sum1[x-2], m_sum1[x-3]); - } - - m_sum2[wm ].calc(b, b1, b2, b3, m_sum1[wm ], m_sum1[wm ], m_sum1[wm], m_sum1[wm]); - m_sum2[wm-1].calc(b, b1, b2, b3, m_sum1[wm-1], m_sum2[wm ], m_sum2[wm], m_sum2[wm]); - m_sum2[wm-2].calc(b, b1, b2, b3, m_sum1[wm-2], m_sum2[wm-1], m_sum2[wm], m_sum2[wm]); - m_sum2[wm ].to_pix(m_buf[wm ]); - m_sum2[wm-1].to_pix(m_buf[wm-1]); - m_sum2[wm-2].to_pix(m_buf[wm-2]); - - for(x = wm-3; x >= 0; --x) - { - m_sum2[x].calc(b, b1, b2, b3, m_sum1[x], m_sum2[x+1], m_sum2[x+2], m_sum2[x+3]); - m_sum2[x].to_pix(m_buf[x]); - } - img.copy_color_hspan(0, y, w, &m_buf[0]); - } - } - - //-------------------------------------------------------------------- - template void blur_y(Img& img, double radius) - { - pixfmt_transposer img2(img); - blur_x(img2, radius); - } - - //-------------------------------------------------------------------- - template void blur(Img& img, double radius) - { - blur_x(img, radius); - pixfmt_transposer img2(img); - blur_x(img2, radius); - } - - private: - agg::pod_vector m_sum1; - agg::pod_vector m_sum2; - agg::pod_vector m_buf; - }; - - - //=================================================recursive_blur_calc_rgba - template struct recursive_blur_calc_rgba - { - typedef T value_type; - typedef recursive_blur_calc_rgba self_type; - - value_type r,g,b,a; - - template - AGG_INLINE void from_pix(const ColorT& c) - { - r = c.r; - g = c.g; - b = c.b; - a = c.a; - } - - AGG_INLINE void calc(value_type b1, - value_type b2, - value_type b3, - value_type b4, - const self_type& c1, - const self_type& c2, - const self_type& c3, - const self_type& c4) - { - r = b1*c1.r + b2*c2.r + b3*c3.r + b4*c4.r; - g = b1*c1.g + b2*c2.g + b3*c3.g + b4*c4.g; - b = b1*c1.b + b2*c2.b + b3*c3.b + b4*c4.b; - a = b1*c1.a + b2*c2.a + b3*c3.a + b4*c4.a; - } - - template - AGG_INLINE void to_pix(ColorT& c) const - { - typedef typename ColorT::value_type cv_type; - c.r = (cv_type)uround(r); - c.g = (cv_type)uround(g); - c.b = (cv_type)uround(b); - c.a = (cv_type)uround(a); - } - }; - - - //=================================================recursive_blur_calc_rgb - template struct recursive_blur_calc_rgb - { - typedef T value_type; - typedef recursive_blur_calc_rgb self_type; - - value_type r,g,b; - - template - AGG_INLINE void from_pix(const ColorT& c) - { - r = c.r; - g = c.g; - b = c.b; - } - - AGG_INLINE void calc(value_type b1, - value_type b2, - value_type b3, - value_type b4, - const self_type& c1, - const self_type& c2, - const self_type& c3, - const self_type& c4) - { - r = b1*c1.r + b2*c2.r + b3*c3.r + b4*c4.r; - g = b1*c1.g + b2*c2.g + b3*c3.g + b4*c4.g; - b = b1*c1.b + b2*c2.b + b3*c3.b + b4*c4.b; - } - - template - AGG_INLINE void to_pix(ColorT& c) const - { - typedef typename ColorT::value_type cv_type; - c.r = (cv_type)uround(r); - c.g = (cv_type)uround(g); - c.b = (cv_type)uround(b); - } - }; - - - //================================================recursive_blur_calc_gray - template struct recursive_blur_calc_gray - { - typedef T value_type; - typedef recursive_blur_calc_gray self_type; - - value_type v; - - template - AGG_INLINE void from_pix(const ColorT& c) - { - v = c.v; - } - - AGG_INLINE void calc(value_type b1, - value_type b2, - value_type b3, - value_type b4, - const self_type& c1, - const self_type& c2, - const self_type& c3, - const self_type& c4) - { - v = b1*c1.v + b2*c2.v + b3*c3.v + b4*c4.v; - } - - template - AGG_INLINE void to_pix(ColorT& c) const - { - typedef typename ColorT::value_type cv_type; - c.v = (cv_type)uround(v); - } - }; - -} - - - - -#endif diff --git a/uppdev/agg24/agg_bounding_rect.h b/uppdev/agg24/agg_bounding_rect.h deleted file mode 100644 index f13b863f0..000000000 --- a/uppdev/agg24/agg_bounding_rect.h +++ /dev/null @@ -1,116 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// bounding_rect function template -// -//---------------------------------------------------------------------------- -#ifndef AGG_BOUNDING_RECT_INCLUDED -#define AGG_BOUNDING_RECT_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - - //-----------------------------------------------------------bounding_rect - template - bool bounding_rect(VertexSource& vs, GetId& gi, - unsigned start, unsigned num, - CoordT* x1, CoordT* y1, CoordT* x2, CoordT* y2) - { - unsigned i; - double x; - double y; - bool first = true; - - *x1 = CoordT(1); - *y1 = CoordT(1); - *x2 = CoordT(0); - *y2 = CoordT(0); - - for(i = 0; i < num; i++) - { - vs.rewind(gi[start + i]); - unsigned cmd; - while(!is_stop(cmd = vs.vertex(&x, &y))) - { - if(is_vertex(cmd)) - { - if(first) - { - *x1 = CoordT(x); - *y1 = CoordT(y); - *x2 = CoordT(x); - *y2 = CoordT(y); - first = false; - } - else - { - if(CoordT(x) < *x1) *x1 = CoordT(x); - if(CoordT(y) < *y1) *y1 = CoordT(y); - if(CoordT(x) > *x2) *x2 = CoordT(x); - if(CoordT(y) > *y2) *y2 = CoordT(y); - } - } - } - } - return *x1 <= *x2 && *y1 <= *y2; - } - - - //-----------------------------------------------------bounding_rect_single - template - bool bounding_rect_single(VertexSource& vs, unsigned path_id, - CoordT* x1, CoordT* y1, CoordT* x2, CoordT* y2) - { - double x; - double y; - bool first = true; - - *x1 = CoordT(1); - *y1 = CoordT(1); - *x2 = CoordT(0); - *y2 = CoordT(0); - - vs.rewind(path_id); - unsigned cmd; - while(!is_stop(cmd = vs.vertex(&x, &y))) - { - if(is_vertex(cmd)) - { - if(first) - { - *x1 = CoordT(x); - *y1 = CoordT(y); - *x2 = CoordT(x); - *y2 = CoordT(y); - first = false; - } - else - { - if(CoordT(x) < *x1) *x1 = CoordT(x); - if(CoordT(y) < *y1) *y1 = CoordT(y); - if(CoordT(x) > *x2) *x2 = CoordT(x); - if(CoordT(y) > *y2) *y2 = CoordT(y); - } - } - } - return *x1 <= *x2 && *y1 <= *y2; - } - - -} - -#endif diff --git a/uppdev/agg24/agg_bspline.cpp b/uppdev/agg24/agg_bspline.cpp deleted file mode 100644 index e1fda9f51..000000000 --- a/uppdev/agg24/agg_bspline.cpp +++ /dev/null @@ -1,284 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// class bspline -// -//---------------------------------------------------------------------------- - -#include "agg_bspline.h" - -namespace agg -{ - //------------------------------------------------------------------------ - bspline::bspline() : - m_max(0), - m_num(0), - m_x(0), - m_y(0), - m_last_idx(-1) - { - } - - //------------------------------------------------------------------------ - bspline::bspline(int num) : - m_max(0), - m_num(0), - m_x(0), - m_y(0), - m_last_idx(-1) - { - init(num); - } - - //------------------------------------------------------------------------ - bspline::bspline(int num, const double* x, const double* y) : - m_max(0), - m_num(0), - m_x(0), - m_y(0), - m_last_idx(-1) - { - init(num, x, y); - } - - - //------------------------------------------------------------------------ - void bspline::init(int max) - { - if(max > 2 && max > m_max) - { - m_am.resize(max * 3); - m_max = max; - m_x = &m_am[m_max]; - m_y = &m_am[m_max * 2]; - } - m_num = 0; - m_last_idx = -1; - } - - - //------------------------------------------------------------------------ - void bspline::add_point(double x, double y) - { - if(m_num < m_max) - { - m_x[m_num] = x; - m_y[m_num] = y; - ++m_num; - } - } - - - //------------------------------------------------------------------------ - void bspline::prepare() - { - if(m_num > 2) - { - int i, k, n1; - double* temp; - double* r; - double* s; - double h, p, d, f, e; - - for(k = 0; k < m_num; k++) - { - m_am[k] = 0.0; - } - - n1 = 3 * m_num; - - pod_array al(n1); - temp = &al[0]; - - for(k = 0; k < n1; k++) - { - temp[k] = 0.0; - } - - r = temp + m_num; - s = temp + m_num * 2; - - n1 = m_num - 1; - d = m_x[1] - m_x[0]; - e = (m_y[1] - m_y[0]) / d; - - for(k = 1; k < n1; k++) - { - h = d; - d = m_x[k + 1] - m_x[k]; - f = e; - e = (m_y[k + 1] - m_y[k]) / d; - al[k] = d / (d + h); - r[k] = 1.0 - al[k]; - s[k] = 6.0 * (e - f) / (h + d); - } - - for(k = 1; k < n1; k++) - { - p = 1.0 / (r[k] * al[k - 1] + 2.0); - al[k] *= -p; - s[k] = (s[k] - r[k] * s[k - 1]) * p; - } - - m_am[n1] = 0.0; - al[n1 - 1] = s[n1 - 1]; - m_am[n1 - 1] = al[n1 - 1]; - - for(k = n1 - 2, i = 0; i < m_num - 2; i++, k--) - { - al[k] = al[k] * al[k + 1] + s[k]; - m_am[k] = al[k]; - } - } - m_last_idx = -1; - } - - - - //------------------------------------------------------------------------ - void bspline::init(int num, const double* x, const double* y) - { - if(num > 2) - { - init(num); - int i; - for(i = 0; i < num; i++) - { - add_point(*x++, *y++); - } - prepare(); - } - m_last_idx = -1; - } - - - //------------------------------------------------------------------------ - void bspline::bsearch(int n, const double *x, double x0, int *i) - { - int j = n - 1; - int k; - - for(*i = 0; (j - *i) > 1; ) - { - if(x0 < x[k = (*i + j) >> 1]) j = k; - else *i = k; - } - } - - - - //------------------------------------------------------------------------ - double bspline::interpolation(double x, int i) const - { - int j = i + 1; - double d = m_x[i] - m_x[j]; - double h = x - m_x[j]; - double r = m_x[i] - x; - double p = d * d / 6.0; - return (m_am[j] * r * r * r + m_am[i] * h * h * h) / 6.0 / d + - ((m_y[j] - m_am[j] * p) * r + (m_y[i] - m_am[i] * p) * h) / d; - } - - - //------------------------------------------------------------------------ - double bspline::extrapolation_left(double x) const - { - double d = m_x[1] - m_x[0]; - return (-d * m_am[1] / 6 + (m_y[1] - m_y[0]) / d) * - (x - m_x[0]) + - m_y[0]; - } - - //------------------------------------------------------------------------ - double bspline::extrapolation_right(double x) const - { - double d = m_x[m_num - 1] - m_x[m_num - 2]; - return (d * m_am[m_num - 2] / 6 + (m_y[m_num - 1] - m_y[m_num - 2]) / d) * - (x - m_x[m_num - 1]) + - m_y[m_num - 1]; - } - - //------------------------------------------------------------------------ - double bspline::get(double x) const - { - if(m_num > 2) - { - int i; - - // Extrapolation on the left - if(x < m_x[0]) return extrapolation_left(x); - - // Extrapolation on the right - if(x >= m_x[m_num - 1]) return extrapolation_right(x); - - // Interpolation - bsearch(m_num, m_x, x, &i); - return interpolation(x, i); - } - return 0.0; - } - - - //------------------------------------------------------------------------ - double bspline::get_stateful(double x) const - { - if(m_num > 2) - { - // Extrapolation on the left - if(x < m_x[0]) return extrapolation_left(x); - - // Extrapolation on the right - if(x >= m_x[m_num - 1]) return extrapolation_right(x); - - if(m_last_idx >= 0) - { - // Check if x is not in current range - if(x < m_x[m_last_idx] || x > m_x[m_last_idx + 1]) - { - // Check if x between next points (most probably) - if(m_last_idx < m_num - 2 && - x >= m_x[m_last_idx + 1] && - x <= m_x[m_last_idx + 2]) - { - ++m_last_idx; - } - else - if(m_last_idx > 0 && - x >= m_x[m_last_idx - 1] && - x <= m_x[m_last_idx]) - { - // x is between pevious points - --m_last_idx; - } - else - { - // Else perform full search - bsearch(m_num, m_x, x, &m_last_idx); - } - } - return interpolation(x, m_last_idx); - } - else - { - // Interpolation - bsearch(m_num, m_x, x, &m_last_idx); - return interpolation(x, m_last_idx); - } - } - return 0.0; - } - -} - diff --git a/uppdev/agg24/agg_bspline.h b/uppdev/agg24/agg_bspline.h deleted file mode 100644 index 2c1ed9a38..000000000 --- a/uppdev/agg24/agg_bspline.h +++ /dev/null @@ -1,76 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// class bspline -// -//---------------------------------------------------------------------------- - -#ifndef AGG_BSPLINE_INCLUDED -#define AGG_BSPLINE_INCLUDED - -#include "agg_array.h" - -namespace agg -{ - //----------------------------------------------------------------bspline - // A very simple class of Bi-cubic Spline interpolation. - // First call init(num, x[], y[]) where num - number of source points, - // x, y - arrays of X and Y values respectively. Here Y must be a function - // of X. It means that all the X-coordinates must be arranged in the ascending - // order. - // Then call get(x) that calculates a value Y for the respective X. - // The class supports extrapolation, i.e. you can call get(x) where x is - // outside the given with init() X-range. Extrapolation is a simple linear - // function. - // - // See Implementation agg_bspline.cpp - //------------------------------------------------------------------------ - class bspline - { - public: - bspline(); - bspline(int num); - bspline(int num, const double* x, const double* y); - - void init(int num); - void add_point(double x, double y); - void prepare(); - - void init(int num, const double* x, const double* y); - - double get(double x) const; - double get_stateful(double x) const; - - private: - bspline(const bspline&); - const bspline& operator = (const bspline&); - - static void bsearch(int n, const double *x, double x0, int *i); - double extrapolation_left(double x) const; - double extrapolation_right(double x) const; - double interpolation(double x, int i) const; - - int m_max; - int m_num; - double* m_x; - double* m_y; - pod_array m_am; - mutable int m_last_idx; - }; - - -} - -#endif diff --git a/uppdev/agg24/agg_cbox_ctrl.cpp b/uppdev/agg24/agg_cbox_ctrl.cpp deleted file mode 100644 index 6383a0f5c..000000000 --- a/uppdev/agg24/agg_cbox_ctrl.cpp +++ /dev/null @@ -1,214 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// classes rbox_ctrl_impl, rbox_ctrl -// -//---------------------------------------------------------------------------- - -#include -#include "agg_cbox_ctrl.h" - - -namespace agg -{ - - //------------------------------------------------------------------------ - cbox_ctrl_impl::cbox_ctrl_impl(double x, double y, - const char* l, - bool flip_y) : - ctrl(x, y, x + 9.0 * 1.5, y + 9.0 * 1.5, flip_y), - m_text_thickness(1.5), - m_text_height(9.0), - m_text_width(0.0), - m_status(false), - m_text_poly(m_text) - { - label(l); - } - - - //------------------------------------------------------------------------ - void cbox_ctrl_impl::text_size(double h, double w) - { - m_text_width = w; - m_text_height = h; - } - - //------------------------------------------------------------------------ - void cbox_ctrl_impl::label(const char* l) - { - unsigned len = strlen(l); - if(len > 127) len = 127; - memcpy(m_label, l, len); - m_label[len] = 0; - } - - - //------------------------------------------------------------------------ - bool cbox_ctrl_impl::on_mouse_button_down(double x, double y) - { - inverse_transform_xy(&x, &y); - if(x >= m_x1 && y >= m_y1 && x <= m_x2 && y <= m_y2) - { - m_status = !m_status; - return true; - } - return false; - } - - - //------------------------------------------------------------------------ - bool cbox_ctrl_impl::on_mouse_move(double, double, bool) - { - return false; - } - - //------------------------------------------------------------------------ - bool cbox_ctrl_impl::in_rect(double x, double y) const - { - inverse_transform_xy(&x, &y); - return x >= m_x1 && y >= m_y1 && x <= m_x2 && y <= m_y2; - } - - //------------------------------------------------------------------------ - bool cbox_ctrl_impl::on_mouse_button_up(double, double) - { - return false; - } - - //------------------------------------------------------------------------ - bool cbox_ctrl_impl::on_arrow_keys(bool, bool, bool, bool) - { - return false; - } - - - //------------------------------------------------------------------------ - void cbox_ctrl_impl::rewind(unsigned idx) - { - m_idx = idx; - - double d2; - double t; - - switch(idx) - { - default: - case 0: // Border - m_vertex = 0; - m_vx[0] = m_x1; - m_vy[0] = m_y1; - m_vx[1] = m_x2; - m_vy[1] = m_y1; - m_vx[2] = m_x2; - m_vy[2] = m_y2; - m_vx[3] = m_x1; - m_vy[3] = m_y2; - m_vx[4] = m_x1 + m_text_thickness; - m_vy[4] = m_y1 + m_text_thickness; - m_vx[5] = m_x1 + m_text_thickness; - m_vy[5] = m_y2 - m_text_thickness; - m_vx[6] = m_x2 - m_text_thickness; - m_vy[6] = m_y2 - m_text_thickness; - m_vx[7] = m_x2 - m_text_thickness; - m_vy[7] = m_y1 + m_text_thickness; - break; - - case 1: // Text - m_text.text(m_label); - m_text.start_point(m_x1 + m_text_height * 2.0, m_y1 + m_text_height / 5.0); - m_text.size(m_text_height, m_text_width); - m_text_poly.width(m_text_thickness); - m_text_poly.line_join(round_join); - m_text_poly.line_cap(round_cap); - m_text_poly.rewind(0); - break; - - case 2: // Active item - m_vertex = 0; - d2 = (m_y2 - m_y1) / 2.0; - t = m_text_thickness * 1.5; - m_vx[0] = m_x1 + m_text_thickness; - m_vy[0] = m_y1 + m_text_thickness; - m_vx[1] = m_x1 + d2; - m_vy[1] = m_y1 + d2 - t; - m_vx[2] = m_x2 - m_text_thickness; - m_vy[2] = m_y1 + m_text_thickness; - m_vx[3] = m_x1 + d2 + t; - m_vy[3] = m_y1 + d2; - m_vx[4] = m_x2 - m_text_thickness; - m_vy[4] = m_y2 - m_text_thickness; - m_vx[5] = m_x1 + d2; - m_vy[5] = m_y1 + d2 + t; - m_vx[6] = m_x1 + m_text_thickness; - m_vy[6] = m_y2 - m_text_thickness; - m_vx[7] = m_x1 + d2 - t; - m_vy[7] = m_y1 + d2; - break; - - } - } - - - - - //------------------------------------------------------------------------ - unsigned cbox_ctrl_impl::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_line_to; - switch(m_idx) - { - case 0: - if(m_vertex == 0 || m_vertex == 4) cmd = path_cmd_move_to; - if(m_vertex >= 8) cmd = path_cmd_stop; - *x = m_vx[m_vertex]; - *y = m_vy[m_vertex]; - m_vertex++; - break; - - case 1: - cmd = m_text_poly.vertex(x, y); - break; - - case 2: - if(m_status) - { - if(m_vertex == 0) cmd = path_cmd_move_to; - if(m_vertex >= 8) cmd = path_cmd_stop; - *x = m_vx[m_vertex]; - *y = m_vy[m_vertex]; - m_vertex++; - } - else - { - cmd = path_cmd_stop; - } - break; - - default: - cmd = path_cmd_stop; - break; - } - - if(!is_stop(cmd)) - { - transform_xy(x, y); - } - return cmd; - } -} - - - diff --git a/uppdev/agg24/agg_cbox_ctrl.h b/uppdev/agg24/agg_cbox_ctrl.h deleted file mode 100644 index 7ecbce27f..000000000 --- a/uppdev/agg24/agg_cbox_ctrl.h +++ /dev/null @@ -1,112 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// classes cbox_ctrl_impl, cbox_ctrl -// -//---------------------------------------------------------------------------- - -#ifndef AGG_CBOX_CTRL_INCLUDED -#define AGG_CBOX_CTRL_INCLUDED - -#include "agg_basics.h" -#include "agg_conv_stroke.h" -#include "agg_gsv_text.h" -#include "agg_trans_affine.h" -#include "agg_color_rgba.h" -#include "agg_ctrl.h" - - - -namespace agg -{ - - //----------------------------------------------------------cbox_ctrl_impl - class cbox_ctrl_impl : public ctrl - { - public: - cbox_ctrl_impl(double x, double y, const char* label, bool flip_y=false); - - void text_thickness(double t) { m_text_thickness = t; } - void text_size(double h, double w=0.0); - - const char* label() { return m_label; } - void label(const char* l); - - bool status() const { return m_status; } - void status(bool st) { m_status = st; } - - virtual bool in_rect(double x, double y) const; - virtual bool on_mouse_button_down(double x, double y); - virtual bool on_mouse_button_up(double x, double y); - virtual bool on_mouse_move(double x, double y, bool button_flag); - virtual bool on_arrow_keys(bool left, bool right, bool down, bool up); - - // Vertex soutce interface - unsigned num_paths() { return 3; }; - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - double m_text_thickness; - double m_text_height; - double m_text_width; - char m_label[128]; - bool m_status; - double m_vx[32]; - double m_vy[32]; - - gsv_text m_text; - conv_stroke m_text_poly; - - unsigned m_idx; - unsigned m_vertex; - }; - - - //----------------------------------------------------------cbox_ctrl_impl - template class cbox_ctrl : public cbox_ctrl_impl - { - public: - cbox_ctrl(double x, double y, const char* label, bool flip_y=false) : - cbox_ctrl_impl(x, y, label, flip_y), - m_text_color(rgba(0.0, 0.0, 0.0)), - m_inactive_color(rgba(0.0, 0.0, 0.0)), - m_active_color(rgba(0.4, 0.0, 0.0)) - { - m_colors[0] = &m_inactive_color; - m_colors[1] = &m_text_color; - m_colors[2] = &m_active_color; - } - - void text_color(const ColorT& c) { m_text_color = c; } - void inactive_color(const ColorT& c) { m_inactive_color = c; } - void active_color(const ColorT& c) { m_active_color = c; } - - const ColorT& color(unsigned i) const { return *m_colors[i]; } - - private: - cbox_ctrl(const cbox_ctrl&); - const cbox_ctrl& operator = (const cbox_ctrl&); - - ColorT m_text_color; - ColorT m_inactive_color; - ColorT m_active_color; - ColorT* m_colors[3]; - }; - - -} - -#endif diff --git a/uppdev/agg24/agg_clip_liang_barsky.h b/uppdev/agg24/agg_clip_liang_barsky.h deleted file mode 100644 index 4b5fedbab..000000000 --- a/uppdev/agg24/agg_clip_liang_barsky.h +++ /dev/null @@ -1,333 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Liang-Barsky clipping -// -//---------------------------------------------------------------------------- -#ifndef AGG_CLIP_LIANG_BARSKY_INCLUDED -#define AGG_CLIP_LIANG_BARSKY_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - enum clipping_flags_e - { - clipping_flags_x1_clipped = 4, - clipping_flags_x2_clipped = 1, - clipping_flags_y1_clipped = 8, - clipping_flags_y2_clipped = 2, - clipping_flags_x_clipped = clipping_flags_x1_clipped | clipping_flags_x2_clipped, - clipping_flags_y_clipped = clipping_flags_y1_clipped | clipping_flags_y2_clipped - }; - - //----------------------------------------------------------clipping_flags - // Determine the clipping code of the vertex according to the - // Cyrus-Beck line clipping algorithm - // - // | | - // 0110 | 0010 | 0011 - // | | - // -------+--------+-------- clip_box.y2 - // | | - // 0100 | 0000 | 0001 - // | | - // -------+--------+-------- clip_box.y1 - // | | - // 1100 | 1000 | 1001 - // | | - // clip_box.x1 clip_box.x2 - // - // - template - inline unsigned clipping_flags(T x, T y, const rect_base& clip_box) - { - return (x > clip_box.x2) | - ((y > clip_box.y2) << 1) | - ((x < clip_box.x1) << 2) | - ((y < clip_box.y1) << 3); - } - - //--------------------------------------------------------clipping_flags_x - template - inline unsigned clipping_flags_x(T x, const rect_base& clip_box) - { - return (x > clip_box.x2) | ((x < clip_box.x1) << 2); - } - - - //--------------------------------------------------------clipping_flags_y - template - inline unsigned clipping_flags_y(T y, const rect_base& clip_box) - { - return ((y > clip_box.y2) << 1) | ((y < clip_box.y1) << 3); - } - - - //-------------------------------------------------------clip_liang_barsky - template - inline unsigned clip_liang_barsky(T x1, T y1, T x2, T y2, - const rect_base& clip_box, - T* x, T* y) - { - const double nearzero = 1e-30; - - double deltax = x2 - x1; - double deltay = y2 - y1; - double xin; - double xout; - double yin; - double yout; - double tinx; - double tiny; - double toutx; - double touty; - double tin1; - double tin2; - double tout1; - unsigned np = 0; - - if(deltax == 0.0) - { - // bump off of the vertical - deltax = (x1 > clip_box.x1) ? -nearzero : nearzero; - } - - if(deltay == 0.0) - { - // bump off of the horizontal - deltay = (y1 > clip_box.y1) ? -nearzero : nearzero; - } - - if(deltax > 0.0) - { - // points to right - xin = clip_box.x1; - xout = clip_box.x2; - } - else - { - xin = clip_box.x2; - xout = clip_box.x1; - } - - if(deltay > 0.0) - { - // points up - yin = clip_box.y1; - yout = clip_box.y2; - } - else - { - yin = clip_box.y2; - yout = clip_box.y1; - } - - tinx = (xin - x1) / deltax; - tiny = (yin - y1) / deltay; - - if (tinx < tiny) - { - // hits x first - tin1 = tinx; - tin2 = tiny; - } - else - { - // hits y first - tin1 = tiny; - tin2 = tinx; - } - - if(tin1 <= 1.0) - { - if(0.0 < tin1) - { - *x++ = (T)xin; - *y++ = (T)yin; - ++np; - } - - if(tin2 <= 1.0) - { - toutx = (xout - x1) / deltax; - touty = (yout - y1) / deltay; - - tout1 = (toutx < touty) ? toutx : touty; - - if(tin2 > 0.0 || tout1 > 0.0) - { - if(tin2 <= tout1) - { - if(tin2 > 0.0) - { - if(tinx > tiny) - { - *x++ = (T)xin; - *y++ = (T)(y1 + tinx * deltay); - } - else - { - *x++ = (T)(x1 + tiny * deltax); - *y++ = (T)yin; - } - ++np; - } - - if(tout1 < 1.0) - { - if(toutx < touty) - { - *x++ = (T)xout; - *y++ = (T)(y1 + toutx * deltay); - } - else - { - *x++ = (T)(x1 + touty * deltax); - *y++ = (T)yout; - } - } - else - { - *x++ = x2; - *y++ = y2; - } - ++np; - } - else - { - if(tinx > tiny) - { - *x++ = (T)xin; - *y++ = (T)yout; - } - else - { - *x++ = (T)xout; - *y++ = (T)yin; - } - ++np; - } - } - } - } - return np; - } - - - //---------------------------------------------------------------------------- - template - bool clip_move_point(T x1, T y1, T x2, T y2, - const rect_base& clip_box, - T* x, T* y, unsigned flags) - { - T bound; - - if(flags & clipping_flags_x_clipped) - { - if(x1 == x2) - { - return false; - } - bound = (flags & clipping_flags_x1_clipped) ? clip_box.x1 : clip_box.x2; - *y = (T)(double(bound - x1) * (y2 - y1) / (x2 - x1) + y1); - *x = bound; - } - - flags = clipping_flags_y(*y, clip_box); - if(flags & clipping_flags_y_clipped) - { - if(y1 == y2) - { - return false; - } - bound = (flags & clipping_flags_y1_clipped) ? clip_box.y1 : clip_box.y2; - *x = (T)(double(bound - y1) * (x2 - x1) / (y2 - y1) + x1); - *y = bound; - } - return true; - } - - //-------------------------------------------------------clip_line_segment - // Returns: ret >= 4 - Fully clipped - // (ret & 1) != 0 - First point has been moved - // (ret & 2) != 0 - Second point has been moved - // - template - unsigned clip_line_segment(T* x1, T* y1, T* x2, T* y2, - const rect_base& clip_box) - { - unsigned f1 = clipping_flags(*x1, *y1, clip_box); - unsigned f2 = clipping_flags(*x2, *y2, clip_box); - unsigned ret = 0; - - if((f2 | f1) == 0) - { - // Fully visible - return 0; - } - - if((f1 & clipping_flags_x_clipped) != 0 && - (f1 & clipping_flags_x_clipped) == (f2 & clipping_flags_x_clipped)) - { - // Fully clipped - return 4; - } - - if((f1 & clipping_flags_y_clipped) != 0 && - (f1 & clipping_flags_y_clipped) == (f2 & clipping_flags_y_clipped)) - { - // Fully clipped - return 4; - } - - T tx1 = *x1; - T ty1 = *y1; - T tx2 = *x2; - T ty2 = *y2; - if(f1) - { - if(!clip_move_point(tx1, ty1, tx2, ty2, clip_box, x1, y1, f1)) - { - return 4; - } - if(*x1 == *x2 && *y1 == *y2) - { - return 4; - } - ret |= 1; - } - if(f2) - { - if(!clip_move_point(tx1, ty1, tx2, ty2, clip_box, x2, y2, f2)) - { - return 4; - } - if(*x1 == *x2 && *y1 == *y2) - { - return 4; - } - ret |= 2; - } - return ret; - } - - -} - - -#endif diff --git a/uppdev/agg24/agg_color_conv.h b/uppdev/agg24/agg_color_conv.h deleted file mode 100644 index 6e27690e1..000000000 --- a/uppdev/agg24/agg_color_conv.h +++ /dev/null @@ -1,84 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Conversion from one colorspace/pixel format to another -// -//---------------------------------------------------------------------------- - -#ifndef AGG_COLOR_CONV_INCLUDED -#define AGG_COLOR_CONV_INCLUDED - -#include -#include "agg_basics.h" -#include "agg_rendering_buffer.h" - - - - -namespace agg -{ - - //--------------------------------------------------------------color_conv - template - void color_conv(RenBuf* dst, const RenBuf* src, CopyRow copy_row_functor) - { - unsigned width = src->width(); - unsigned height = src->height(); - - if(dst->width() < width) width = dst->width(); - if(dst->height() < height) height = dst->height(); - - if(width) - { - unsigned y; - for(y = 0; y < height; y++) - { - copy_row_functor(dst->row_ptr(0, y, width), - src->row_ptr(y), - width); - } - } - } - - - //---------------------------------------------------------color_conv_row - template - void color_conv_row(int8u* dst, - const int8u* src, - unsigned width, - CopyRow copy_row_functor) - { - copy_row_functor(dst, src, width); - } - - - //---------------------------------------------------------color_conv_same - template class color_conv_same - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - memmove(dst, src, width*BPP); - } - }; - - -} - - - -#endif diff --git a/uppdev/agg24/agg_color_conv_rgb16.h b/uppdev/agg24/agg_color_conv_rgb16.h deleted file mode 100644 index aaa41322c..000000000 --- a/uppdev/agg24/agg_color_conv_rgb16.h +++ /dev/null @@ -1,285 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// This part of the library has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- -// -// A set of functors used with color_conv(). See file agg_color_conv.h -// These functors can convert images with up to 8 bits per component. -// Use convertors in the following way: -// -// agg::color_conv(dst, src, agg::color_conv_XXXX_to_YYYY()); -//---------------------------------------------------------------------------- - -#ifndef AGG_COLOR_CONV_RGB16_INCLUDED -#define AGG_COLOR_CONV_RGB16_INCLUDED - -#include "agg_basics.h" -#include "agg_color_conv.h" - -namespace agg -{ - - //-------------------------------------------------color_conv_gray16_to_gray8 - class color_conv_gray16_to_gray8 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - int16u* s = (int16u*)src; - do - { - *dst++ = *s++ >> 8; - } - while(--width); - } - }; - - - //-----------------------------------------------------color_conv_rgb24_rgb48 - template class color_conv_rgb24_rgb48 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - int16u* d = (int16u*)dst; - do - { - *d++ = (src[I1] << 8) | src[I1]; - *d++ = (src[1] << 8) | src[1] ; - *d++ = (src[I3] << 8) | src[I3]; - src += 3; - } - while(--width); - } - }; - - typedef color_conv_rgb24_rgb48<0,2> color_conv_rgb24_to_rgb48; - typedef color_conv_rgb24_rgb48<0,2> color_conv_bgr24_to_bgr48; - typedef color_conv_rgb24_rgb48<2,0> color_conv_rgb24_to_bgr48; - typedef color_conv_rgb24_rgb48<2,0> color_conv_bgr24_to_rgb48; - - - //-----------------------------------------------------color_conv_rgb24_rgb48 - template class color_conv_rgb48_rgb24 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - const int16u* s = (const int16u*)src; - do - { - *dst++ = s[I1] >> 8; - *dst++ = s[1] >> 8; - *dst++ = s[I3] >> 8; - s += 3; - } - while(--width); - } - }; - - typedef color_conv_rgb48_rgb24<0,2> color_conv_rgb48_to_rgb24; - typedef color_conv_rgb48_rgb24<0,2> color_conv_bgr48_to_bgr24; - typedef color_conv_rgb48_rgb24<2,0> color_conv_rgb48_to_bgr24; - typedef color_conv_rgb48_rgb24<2,0> color_conv_bgr48_to_rgb24; - - - //----------------------------------------------color_conv_rgbAAA_rgb24 - template class color_conv_rgbAAA_rgb24 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - int32u rgb = *(int32u*)src; - dst[R] = int8u(rgb >> 22); - dst[1] = int8u(rgb >> 12); - dst[B] = int8u(rgb >> 2); - src += 4; - dst += 3; - } - while(--width); - } - }; - - typedef color_conv_rgbAAA_rgb24<0,2> color_conv_rgbAAA_to_rgb24; - typedef color_conv_rgbAAA_rgb24<2,0> color_conv_rgbAAA_to_bgr24; - typedef color_conv_rgbAAA_rgb24<2,0> color_conv_bgrAAA_to_rgb24; - typedef color_conv_rgbAAA_rgb24<0,2> color_conv_bgrAAA_to_bgr24; - - - //----------------------------------------------color_conv_rgbBBA_rgb24 - template class color_conv_rgbBBA_rgb24 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - int32u rgb = *(int32u*)src; - dst[R] = int8u(rgb >> 24); - dst[1] = int8u(rgb >> 13); - dst[B] = int8u(rgb >> 2); - src += 4; - dst += 3; - } - while(--width); - } - }; - - typedef color_conv_rgbBBA_rgb24<0,2> color_conv_rgbBBA_to_rgb24; - typedef color_conv_rgbBBA_rgb24<2,0> color_conv_rgbBBA_to_bgr24; - - - //----------------------------------------------color_conv_bgrABB_rgb24 - template class color_conv_bgrABB_rgb24 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - int32u bgr = *(int32u*)src; - dst[R] = int8u(bgr >> 3); - dst[1] = int8u(bgr >> 14); - dst[B] = int8u(bgr >> 24); - src += 4; - dst += 3; - } - while(--width); - } - }; - - typedef color_conv_bgrABB_rgb24<2,0> color_conv_bgrABB_to_rgb24; - typedef color_conv_bgrABB_rgb24<0,2> color_conv_bgrABB_to_bgr24; - - - //-------------------------------------------------color_conv_rgba64_rgba32 - template class color_conv_rgba64_rgba32 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - *dst++ = int8u(((int16u*)src)[I1] >> 8); - *dst++ = int8u(((int16u*)src)[I2] >> 8); - *dst++ = int8u(((int16u*)src)[I3] >> 8); - *dst++ = int8u(((int16u*)src)[I4] >> 8); - src += 8; - } - while(--width); - } - }; - - //------------------------------------------------------------------------ - typedef color_conv_rgba64_rgba32<0,1,2,3> color_conv_rgba64_to_rgba32; //----color_conv_rgba64_to_rgba32 - typedef color_conv_rgba64_rgba32<0,1,2,3> color_conv_argb64_to_argb32; //----color_conv_argb64_to_argb32 - typedef color_conv_rgba64_rgba32<0,1,2,3> color_conv_bgra64_to_bgra32; //----color_conv_bgra64_to_bgra32 - typedef color_conv_rgba64_rgba32<0,1,2,3> color_conv_abgr64_to_abgr32; //----color_conv_abgr64_to_abgr32 - typedef color_conv_rgba64_rgba32<0,3,2,1> color_conv_argb64_to_abgr32; //----color_conv_argb64_to_abgr32 - typedef color_conv_rgba64_rgba32<3,2,1,0> color_conv_argb64_to_bgra32; //----color_conv_argb64_to_bgra32 - typedef color_conv_rgba64_rgba32<1,2,3,0> color_conv_argb64_to_rgba32; //----color_conv_argb64_to_rgba32 - typedef color_conv_rgba64_rgba32<3,0,1,2> color_conv_bgra64_to_abgr32; //----color_conv_bgra64_to_abgr32 - typedef color_conv_rgba64_rgba32<3,2,1,0> color_conv_bgra64_to_argb32; //----color_conv_bgra64_to_argb32 - typedef color_conv_rgba64_rgba32<2,1,0,3> color_conv_bgra64_to_rgba32; //----color_conv_bgra64_to_rgba32 - typedef color_conv_rgba64_rgba32<3,2,1,0> color_conv_rgba64_to_abgr32; //----color_conv_rgba64_to_abgr32 - typedef color_conv_rgba64_rgba32<3,0,1,2> color_conv_rgba64_to_argb32; //----color_conv_rgba64_to_argb32 - typedef color_conv_rgba64_rgba32<2,1,0,3> color_conv_rgba64_to_bgra32; //----color_conv_rgba64_to_bgra32 - typedef color_conv_rgba64_rgba32<0,3,2,1> color_conv_abgr64_to_argb32; //----color_conv_abgr64_to_argb32 - typedef color_conv_rgba64_rgba32<1,2,3,0> color_conv_abgr64_to_bgra32; //----color_conv_abgr64_to_bgra32 - typedef color_conv_rgba64_rgba32<3,2,1,0> color_conv_abgr64_to_rgba32; //----color_conv_abgr64_to_rgba32 - - - - //--------------------------------------------color_conv_rgb24_rgba64 - template class color_conv_rgb24_rgba64 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - int16u* d = (int16u*)dst; - do - { - d[I1] = (src[0] << 8) | src[0]; - d[I2] = (src[1] << 8) | src[1]; - d[I3] = (src[2] << 8) | src[2]; - d[A] = 65535; - d += 4; - src += 3; - } - while(--width); - } - }; - - - //------------------------------------------------------------------------ - typedef color_conv_rgb24_rgba64<1,2,3,0> color_conv_rgb24_to_argb64; //----color_conv_rgb24_to_argb64 - typedef color_conv_rgb24_rgba64<3,2,1,0> color_conv_rgb24_to_abgr64; //----color_conv_rgb24_to_abgr64 - typedef color_conv_rgb24_rgba64<2,1,0,3> color_conv_rgb24_to_bgra64; //----color_conv_rgb24_to_bgra64 - typedef color_conv_rgb24_rgba64<0,1,2,3> color_conv_rgb24_to_rgba64; //----color_conv_rgb24_to_rgba64 - typedef color_conv_rgb24_rgba64<3,2,1,0> color_conv_bgr24_to_argb64; //----color_conv_bgr24_to_argb64 - typedef color_conv_rgb24_rgba64<1,2,3,0> color_conv_bgr24_to_abgr64; //----color_conv_bgr24_to_abgr64 - typedef color_conv_rgb24_rgba64<0,1,2,3> color_conv_bgr24_to_bgra64; //----color_conv_bgr24_to_bgra64 - typedef color_conv_rgb24_rgba64<2,1,0,3> color_conv_bgr24_to_rgba64; //----color_conv_bgr24_to_rgba64 - - - template class color_conv_rgb24_gray16 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - int16u* d = (int16u*)dst; - do - { - *d++ = src[R]*77 + src[1]*150 + src[B]*29; - src += 3; - } - while(--width); - } - }; - - typedef color_conv_rgb24_gray16<0,2> color_conv_rgb24_to_gray16; - typedef color_conv_rgb24_gray16<2,0> color_conv_bgr24_to_gray16; - - -} - - -#endif diff --git a/uppdev/agg24/agg_color_conv_rgb8.h b/uppdev/agg24/agg_color_conv_rgb8.h deleted file mode 100644 index 4268b5a72..000000000 --- a/uppdev/agg24/agg_color_conv_rgb8.h +++ /dev/null @@ -1,469 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// A set of functors used with color_conv(). See file agg_color_conv.h -// These functors can convert images with up to 8 bits per component. -// Use convertors in the following way: -// -// agg::color_conv(dst, src, agg::color_conv_XXXX_to_YYYY()); -// whare XXXX and YYYY can be any of: -// rgb24 -// bgr24 -// rgba32 -// abgr32 -// argb32 -// bgra32 -// rgb555 -// rgb565 -//---------------------------------------------------------------------------- - -#ifndef AGG_COLOR_CONV_RGB8_INCLUDED -#define AGG_COLOR_CONV_RGB8_INCLUDED - -#include "agg_basics.h" -#include "agg_color_conv.h" - -namespace agg -{ - - //-----------------------------------------------------color_conv_rgb24 - class color_conv_rgb24 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - *dst++ = src[2]; - *dst++ = src[1]; - *dst++ = src[0]; - src += 3; - } - while(--width); - } - }; - - typedef color_conv_rgb24 color_conv_rgb24_to_bgr24; - typedef color_conv_rgb24 color_conv_bgr24_to_rgb24; - - typedef color_conv_same<3> color_conv_bgr24_to_bgr24; - typedef color_conv_same<3> color_conv_rgb24_to_rgb24; - - - - //------------------------------------------------------color_conv_rgba32 - template class color_conv_rgba32 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - *dst++ = src[I1]; - *dst++ = src[I2]; - *dst++ = src[I3]; - *dst++ = src[I4]; - src += 4; - } - while(--width); - } - }; - - - //------------------------------------------------------------------------ - typedef color_conv_rgba32<0,3,2,1> color_conv_argb32_to_abgr32; //----color_conv_argb32_to_abgr32 - typedef color_conv_rgba32<3,2,1,0> color_conv_argb32_to_bgra32; //----color_conv_argb32_to_bgra32 - typedef color_conv_rgba32<1,2,3,0> color_conv_argb32_to_rgba32; //----color_conv_argb32_to_rgba32 - typedef color_conv_rgba32<3,0,1,2> color_conv_bgra32_to_abgr32; //----color_conv_bgra32_to_abgr32 - typedef color_conv_rgba32<3,2,1,0> color_conv_bgra32_to_argb32; //----color_conv_bgra32_to_argb32 - typedef color_conv_rgba32<2,1,0,3> color_conv_bgra32_to_rgba32; //----color_conv_bgra32_to_rgba32 - typedef color_conv_rgba32<3,2,1,0> color_conv_rgba32_to_abgr32; //----color_conv_rgba32_to_abgr32 - typedef color_conv_rgba32<3,0,1,2> color_conv_rgba32_to_argb32; //----color_conv_rgba32_to_argb32 - typedef color_conv_rgba32<2,1,0,3> color_conv_rgba32_to_bgra32; //----color_conv_rgba32_to_bgra32 - typedef color_conv_rgba32<0,3,2,1> color_conv_abgr32_to_argb32; //----color_conv_abgr32_to_argb32 - typedef color_conv_rgba32<1,2,3,0> color_conv_abgr32_to_bgra32; //----color_conv_abgr32_to_bgra32 - typedef color_conv_rgba32<3,2,1,0> color_conv_abgr32_to_rgba32; //----color_conv_abgr32_to_rgba32 - - //------------------------------------------------------------------------ - typedef color_conv_same<4> color_conv_rgba32_to_rgba32; //----color_conv_rgba32_to_rgba32 - typedef color_conv_same<4> color_conv_argb32_to_argb32; //----color_conv_argb32_to_argb32 - typedef color_conv_same<4> color_conv_bgra32_to_bgra32; //----color_conv_bgra32_to_bgra32 - typedef color_conv_same<4> color_conv_abgr32_to_abgr32; //----color_conv_abgr32_to_abgr32 - - - //--------------------------------------------color_conv_rgb24_rgba32 - template class color_conv_rgb24_rgba32 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - dst[I1] = *src++; - dst[I2] = *src++; - dst[I3] = *src++; - dst[A] = 255; - dst += 4; - } - while(--width); - } - }; - - - //------------------------------------------------------------------------ - typedef color_conv_rgb24_rgba32<1,2,3,0> color_conv_rgb24_to_argb32; //----color_conv_rgb24_to_argb32 - typedef color_conv_rgb24_rgba32<3,2,1,0> color_conv_rgb24_to_abgr32; //----color_conv_rgb24_to_abgr32 - typedef color_conv_rgb24_rgba32<2,1,0,3> color_conv_rgb24_to_bgra32; //----color_conv_rgb24_to_bgra32 - typedef color_conv_rgb24_rgba32<0,1,2,3> color_conv_rgb24_to_rgba32; //----color_conv_rgb24_to_rgba32 - typedef color_conv_rgb24_rgba32<3,2,1,0> color_conv_bgr24_to_argb32; //----color_conv_bgr24_to_argb32 - typedef color_conv_rgb24_rgba32<1,2,3,0> color_conv_bgr24_to_abgr32; //----color_conv_bgr24_to_abgr32 - typedef color_conv_rgb24_rgba32<0,1,2,3> color_conv_bgr24_to_bgra32; //----color_conv_bgr24_to_bgra32 - typedef color_conv_rgb24_rgba32<2,1,0,3> color_conv_bgr24_to_rgba32; //----color_conv_bgr24_to_rgba32 - - - - //-------------------------------------------------color_conv_rgba32_rgb24 - template class color_conv_rgba32_rgb24 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - *dst++ = src[I1]; - *dst++ = src[I2]; - *dst++ = src[I3]; - src += 4; - } - while(--width); - } - }; - - - - //------------------------------------------------------------------------ - typedef color_conv_rgba32_rgb24<1,2,3> color_conv_argb32_to_rgb24; //----color_conv_argb32_to_rgb24 - typedef color_conv_rgba32_rgb24<3,2,1> color_conv_abgr32_to_rgb24; //----color_conv_abgr32_to_rgb24 - typedef color_conv_rgba32_rgb24<2,1,0> color_conv_bgra32_to_rgb24; //----color_conv_bgra32_to_rgb24 - typedef color_conv_rgba32_rgb24<0,1,2> color_conv_rgba32_to_rgb24; //----color_conv_rgba32_to_rgb24 - typedef color_conv_rgba32_rgb24<3,2,1> color_conv_argb32_to_bgr24; //----color_conv_argb32_to_bgr24 - typedef color_conv_rgba32_rgb24<1,2,3> color_conv_abgr32_to_bgr24; //----color_conv_abgr32_to_bgr24 - typedef color_conv_rgba32_rgb24<0,1,2> color_conv_bgra32_to_bgr24; //----color_conv_bgra32_to_bgr24 - typedef color_conv_rgba32_rgb24<2,1,0> color_conv_rgba32_to_bgr24; //----color_conv_rgba32_to_bgr24 - - - //------------------------------------------------color_conv_rgb555_rgb24 - template class color_conv_rgb555_rgb24 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - unsigned rgb = *(int16u*)src; - dst[R] = (int8u)((rgb >> 7) & 0xF8); - dst[1] = (int8u)((rgb >> 2) & 0xF8); - dst[B] = (int8u)((rgb << 3) & 0xF8); - src += 2; - dst += 3; - } - while(--width); - } - }; - - - //------------------------------------------------------------------------ - typedef color_conv_rgb555_rgb24<2,0> color_conv_rgb555_to_bgr24; //----color_conv_rgb555_to_bgr24 - typedef color_conv_rgb555_rgb24<0,2> color_conv_rgb555_to_rgb24; //----color_conv_rgb555_to_rgb24 - - - //-------------------------------------------------color_conv_rgb24_rgb555 - template class color_conv_rgb24_rgb555 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - *(int16u*)dst = (int16u)(((unsigned(src[R]) << 7) & 0x7C00) | - ((unsigned(src[1]) << 2) & 0x3E0) | - ((unsigned(src[B]) >> 3))); - src += 3; - dst += 2; - } - while(--width); - } - }; - - - //------------------------------------------------------------------------ - typedef color_conv_rgb24_rgb555<2,0> color_conv_bgr24_to_rgb555; //----color_conv_bgr24_to_rgb555 - typedef color_conv_rgb24_rgb555<0,2> color_conv_rgb24_to_rgb555; //----color_conv_rgb24_to_rgb555 - - - //-------------------------------------------------color_conv_rgb565_rgb24 - template class color_conv_rgb565_rgb24 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - unsigned rgb = *(int16u*)src; - dst[R] = (rgb >> 8) & 0xF8; - dst[1] = (rgb >> 3) & 0xFC; - dst[B] = (rgb << 3) & 0xF8; - src += 2; - dst += 3; - } - while(--width); - } - }; - - - //------------------------------------------------------------------------ - typedef color_conv_rgb565_rgb24<2,0> color_conv_rgb565_to_bgr24; //----color_conv_rgb565_to_bgr24 - typedef color_conv_rgb565_rgb24<0,2> color_conv_rgb565_to_rgb24; //----color_conv_rgb565_to_rgb24 - - - //-------------------------------------------------color_conv_rgb24_rgb565 - template class color_conv_rgb24_rgb565 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - *(int16u*)dst = (int16u)(((unsigned(src[R]) << 8) & 0xF800) | - ((unsigned(src[1]) << 3) & 0x7E0) | - ((unsigned(src[B]) >> 3))); - src += 3; - dst += 2; - } - while(--width); - } - }; - - - //------------------------------------------------------------------------ - typedef color_conv_rgb24_rgb565<2,0> color_conv_bgr24_to_rgb565; //----color_conv_bgr24_to_rgb565 - typedef color_conv_rgb24_rgb565<0,2> color_conv_rgb24_to_rgb565; //----color_conv_rgb24_to_rgb565 - - - - //-------------------------------------------------color_conv_rgb555_rgba32 - template class color_conv_rgb555_rgba32 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - int rgb = *(int16*)src; - dst[R] = (int8u)((rgb >> 7) & 0xF8); - dst[G] = (int8u)((rgb >> 2) & 0xF8); - dst[B] = (int8u)((rgb << 3) & 0xF8); - dst[A] = (int8u)(rgb >> 15); - src += 2; - dst += 4; - } - while(--width); - } - }; - - - //------------------------------------------------------------------------ - typedef color_conv_rgb555_rgba32<1,2,3,0> color_conv_rgb555_to_argb32; //----color_conv_rgb555_to_argb32 - typedef color_conv_rgb555_rgba32<3,2,1,0> color_conv_rgb555_to_abgr32; //----color_conv_rgb555_to_abgr32 - typedef color_conv_rgb555_rgba32<2,1,0,3> color_conv_rgb555_to_bgra32; //----color_conv_rgb555_to_bgra32 - typedef color_conv_rgb555_rgba32<0,1,2,3> color_conv_rgb555_to_rgba32; //----color_conv_rgb555_to_rgba32 - - - //------------------------------------------------color_conv_rgba32_rgb555 - template class color_conv_rgba32_rgb555 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - *(int16u*)dst = (int16u)(((unsigned(src[R]) << 7) & 0x7C00) | - ((unsigned(src[G]) << 2) & 0x3E0) | - ((unsigned(src[B]) >> 3)) | - ((unsigned(src[A]) << 8) & 0x8000)); - src += 4; - dst += 2; - } - while(--width); - } - }; - - - //------------------------------------------------------------------------ - typedef color_conv_rgba32_rgb555<1,2,3,0> color_conv_argb32_to_rgb555; //----color_conv_argb32_to_rgb555 - typedef color_conv_rgba32_rgb555<3,2,1,0> color_conv_abgr32_to_rgb555; //----color_conv_abgr32_to_rgb555 - typedef color_conv_rgba32_rgb555<2,1,0,3> color_conv_bgra32_to_rgb555; //----color_conv_bgra32_to_rgb555 - typedef color_conv_rgba32_rgb555<0,1,2,3> color_conv_rgba32_to_rgb555; //----color_conv_rgba32_to_rgb555 - - - - //------------------------------------------------color_conv_rgb565_rgba32 - template class color_conv_rgb565_rgba32 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - int rgb = *(int16*)src; - dst[R] = (rgb >> 8) & 0xF8; - dst[G] = (rgb >> 3) & 0xFC; - dst[B] = (rgb << 3) & 0xF8; - dst[A] = 255; - src += 2; - dst += 4; - } - while(--width); - } - }; - - - //------------------------------------------------------------------------ - typedef color_conv_rgb565_rgba32<1,2,3,0> color_conv_rgb565_to_argb32; //----color_conv_rgb565_to_argb32 - typedef color_conv_rgb565_rgba32<3,2,1,0> color_conv_rgb565_to_abgr32; //----color_conv_rgb565_to_abgr32 - typedef color_conv_rgb565_rgba32<2,1,0,3> color_conv_rgb565_to_bgra32; //----color_conv_rgb565_to_bgra32 - typedef color_conv_rgb565_rgba32<0,1,2,3> color_conv_rgb565_to_rgba32; //----color_conv_rgb565_to_rgba32 - - - //------------------------------------------------color_conv_rgba32_rgb565 - template class color_conv_rgba32_rgb565 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - *(int16u*)dst = (int16u)(((unsigned(src[R]) << 8) & 0xF800) | - ((unsigned(src[G]) << 3) & 0x7E0) | - ((unsigned(src[B]) >> 3))); - src += 4; - dst += 2; - } - while(--width); - } - }; - - - //------------------------------------------------------------------------ - typedef color_conv_rgba32_rgb565<1,2,3> color_conv_argb32_to_rgb565; //----color_conv_argb32_to_rgb565 - typedef color_conv_rgba32_rgb565<3,2,1> color_conv_abgr32_to_rgb565; //----color_conv_abgr32_to_rgb565 - typedef color_conv_rgba32_rgb565<2,1,0> color_conv_bgra32_to_rgb565; //----color_conv_bgra32_to_rgb565 - typedef color_conv_rgba32_rgb565<0,1,2> color_conv_rgba32_to_rgb565; //----color_conv_rgba32_to_rgb565 - - - //---------------------------------------------color_conv_rgb555_to_rgb565 - class color_conv_rgb555_to_rgb565 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - unsigned rgb = *(int16u*)src; - *(int16u*)dst = (int16u)(((rgb << 1) & 0xFFC0) | (rgb & 0x1F)); - src += 2; - dst += 2; - } - while(--width); - } - }; - - - //----------------------------------------------color_conv_rgb565_to_rgb555 - class color_conv_rgb565_to_rgb555 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - unsigned rgb = *(int16u*)src; - *(int16u*)dst = (int16u)(((rgb >> 1) & 0x7FE0) | (rgb & 0x1F)); - src += 2; - dst += 2; - } - while(--width); - } - }; - - - //------------------------------------------------------------------------ - typedef color_conv_same<2> color_conv_rgb555_to_rgb555; //----color_conv_rgb555_to_rgb555 - typedef color_conv_same<2> color_conv_rgb565_to_rgb565; //----color_conv_rgb565_to_rgb565 - - - template class color_conv_rgb24_gray8 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - *dst++ = (src[R]*77 + src[1]*150 + src[B]*29) >> 8; - src += 3; - } - while(--width); - } - }; - - typedef color_conv_rgb24_gray8<0,2> color_conv_rgb24_to_gray8; //----color_conv_rgb24_to_gray8 - typedef color_conv_rgb24_gray8<2,0> color_conv_bgr24_to_gray8; //----color_conv_bgr24_to_gray8 - - -} - - - -#endif diff --git a/uppdev/agg24/agg_color_gray.h b/uppdev/agg24/agg_color_gray.h deleted file mode 100644 index 8e782ef2c..000000000 --- a/uppdev/agg24/agg_color_gray.h +++ /dev/null @@ -1,414 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Adaptation for high precision colors has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- -// -// color types gray8, gray16 -// -//---------------------------------------------------------------------------- - -#ifndef AGG_COLOR_GRAY_INCLUDED -#define AGG_COLOR_GRAY_INCLUDED - -#include "agg_basics.h" -#include "agg_color_rgba.h" - -namespace agg -{ - - //===================================================================gray8 - struct gray8 - { - typedef int8u value_type; - typedef int32u calc_type; - typedef int32 long_type; - enum base_scale_e - { - base_shift = 8, - base_scale = 1 << base_shift, - base_mask = base_scale - 1 - }; - typedef gray8 self_type; - - value_type v; - value_type a; - - //-------------------------------------------------------------------- - gray8() {} - - //-------------------------------------------------------------------- - gray8(unsigned v_, unsigned a_=base_mask) : - v(int8u(v_)), a(int8u(a_)) {} - - //-------------------------------------------------------------------- - gray8(const self_type& c, unsigned a_) : - v(c.v), a(value_type(a_)) {} - - //-------------------------------------------------------------------- - gray8(const rgba& c) : - v((value_type)uround((0.299*c.r + 0.587*c.g + 0.114*c.b) * double(base_mask))), - a((value_type)uround(c.a * double(base_mask))) {} - - //-------------------------------------------------------------------- - gray8(const rgba& c, double a_) : - v((value_type)uround((0.299*c.r + 0.587*c.g + 0.114*c.b) * double(base_mask))), - a((value_type)uround(a_ * double(base_mask))) {} - - //-------------------------------------------------------------------- - gray8(const rgba8& c) : - v((c.r*77 + c.g*150 + c.b*29) >> 8), - a(c.a) {} - - //-------------------------------------------------------------------- - gray8(const rgba8& c, unsigned a_) : - v((c.r*77 + c.g*150 + c.b*29) >> 8), - a(a_) {} - - //-------------------------------------------------------------------- - void clear() - { - v = a = 0; - } - - //-------------------------------------------------------------------- - const self_type& transparent() - { - a = 0; - return *this; - } - - //-------------------------------------------------------------------- - void opacity(double a_) - { - if(a_ < 0.0) a_ = 0.0; - if(a_ > 1.0) a_ = 1.0; - a = (value_type)uround(a_ * double(base_mask)); - } - - //-------------------------------------------------------------------- - double opacity() const - { - return double(a) / double(base_mask); - } - - - //-------------------------------------------------------------------- - const self_type& premultiply() - { - if(a == base_mask) return *this; - if(a == 0) - { - v = 0; - return *this; - } - v = value_type((calc_type(v) * a) >> base_shift); - return *this; - } - - //-------------------------------------------------------------------- - const self_type& premultiply(unsigned a_) - { - if(a == base_mask && a_ >= base_mask) return *this; - if(a == 0 || a_ == 0) - { - v = a = 0; - return *this; - } - calc_type v_ = (calc_type(v) * a_) / a; - v = value_type((v_ > a_) ? a_ : v_); - a = value_type(a_); - return *this; - } - - //-------------------------------------------------------------------- - const self_type& demultiply() - { - if(a == base_mask) return *this; - if(a == 0) - { - v = 0; - return *this; - } - calc_type v_ = (calc_type(v) * base_mask) / a; - v = value_type((v_ > base_mask) ? (value_type)base_mask : v_); - return *this; - } - - //-------------------------------------------------------------------- - self_type gradient(self_type c, double k) const - { - self_type ret; - calc_type ik = uround(k * base_scale); - ret.v = value_type(calc_type(v) + (((calc_type(c.v) - v) * ik) >> base_shift)); - ret.a = value_type(calc_type(a) + (((calc_type(c.a) - a) * ik) >> base_shift)); - return ret; - } - - //-------------------------------------------------------------------- - AGG_INLINE void add(const self_type& c, unsigned cover) - { - calc_type cv, ca; - if(cover == cover_mask) - { - if(c.a == base_mask) - { - *this = c; - } - else - { - cv = v + c.v; v = (cv > calc_type(base_mask)) ? calc_type(base_mask) : cv; - ca = a + c.a; a = (ca > calc_type(base_mask)) ? calc_type(base_mask) : ca; - } - } - else - { - cv = v + ((c.v * cover + cover_mask/2) >> cover_shift); - ca = a + ((c.a * cover + cover_mask/2) >> cover_shift); - v = (cv > calc_type(base_mask)) ? calc_type(base_mask) : cv; - a = (ca > calc_type(base_mask)) ? calc_type(base_mask) : ca; - } - } - - //-------------------------------------------------------------------- - static self_type no_color() { return self_type(0,0); } - }; - - - //-------------------------------------------------------------gray8_pre - inline gray8 gray8_pre(unsigned v, unsigned a = gray8::base_mask) - { - return gray8(v,a).premultiply(); - } - inline gray8 gray8_pre(const gray8& c, unsigned a) - { - return gray8(c,a).premultiply(); - } - inline gray8 gray8_pre(const rgba& c) - { - return gray8(c).premultiply(); - } - inline gray8 gray8_pre(const rgba& c, double a) - { - return gray8(c,a).premultiply(); - } - inline gray8 gray8_pre(const rgba8& c) - { - return gray8(c).premultiply(); - } - inline gray8 gray8_pre(const rgba8& c, unsigned a) - { - return gray8(c,a).premultiply(); - } - - - - - //==================================================================gray16 - struct gray16 - { - typedef int16u value_type; - typedef int32u calc_type; - typedef int64 long_type; - enum base_scale_e - { - base_shift = 16, - base_scale = 1 << base_shift, - base_mask = base_scale - 1 - }; - typedef gray16 self_type; - - value_type v; - value_type a; - - //-------------------------------------------------------------------- - gray16() {} - - //-------------------------------------------------------------------- - gray16(unsigned v_, unsigned a_=base_mask) : - v(int16u(v_)), a(int16u(a_)) {} - - //-------------------------------------------------------------------- - gray16(const self_type& c, unsigned a_) : - v(c.v), a(value_type(a_)) {} - - //-------------------------------------------------------------------- - gray16(const rgba& c) : - v((value_type)uround((0.299*c.r + 0.587*c.g + 0.114*c.b) * double(base_mask))), - a((value_type)uround(c.a * double(base_mask))) {} - - //-------------------------------------------------------------------- - gray16(const rgba& c, double a_) : - v((value_type)uround((0.299*c.r + 0.587*c.g + 0.114*c.b) * double(base_mask))), - a((value_type)uround(a_ * double(base_mask))) {} - - //-------------------------------------------------------------------- - gray16(const rgba8& c) : - v(c.r*77 + c.g*150 + c.b*29), - a((value_type(c.a) << 8) | c.a) {} - - //-------------------------------------------------------------------- - gray16(const rgba8& c, unsigned a_) : - v(c.r*77 + c.g*150 + c.b*29), - a((value_type(a_) << 8) | c.a) {} - - //-------------------------------------------------------------------- - void clear() - { - v = a = 0; - } - - //-------------------------------------------------------------------- - const self_type& transparent() - { - a = 0; - return *this; - } - - //-------------------------------------------------------------------- - void opacity(double a_) - { - if(a_ < 0.0) a_ = 0.0; - if(a_ > 1.0) a_ = 1.0; - a = (value_type)uround(a_ * double(base_mask)); - } - - //-------------------------------------------------------------------- - double opacity() const - { - return double(a) / double(base_mask); - } - - - //-------------------------------------------------------------------- - const self_type& premultiply() - { - if(a == base_mask) return *this; - if(a == 0) - { - v = 0; - return *this; - } - v = value_type((calc_type(v) * a) >> base_shift); - return *this; - } - - //-------------------------------------------------------------------- - const self_type& premultiply(unsigned a_) - { - if(a == base_mask && a_ >= base_mask) return *this; - if(a == 0 || a_ == 0) - { - v = a = 0; - return *this; - } - calc_type v_ = (calc_type(v) * a_) / a; - v = value_type((v_ > a_) ? a_ : v_); - a = value_type(a_); - return *this; - } - - //-------------------------------------------------------------------- - const self_type& demultiply() - { - if(a == base_mask) return *this; - if(a == 0) - { - v = 0; - return *this; - } - calc_type v_ = (calc_type(v) * base_mask) / a; - v = value_type((v_ > base_mask) ? base_mask : v_); - return *this; - } - - //-------------------------------------------------------------------- - self_type gradient(self_type c, double k) const - { - self_type ret; - calc_type ik = uround(k * base_scale); - ret.v = value_type(calc_type(v) + (((calc_type(c.v) - v) * ik) >> base_shift)); - ret.a = value_type(calc_type(a) + (((calc_type(c.a) - a) * ik) >> base_shift)); - return ret; - } - - //-------------------------------------------------------------------- - AGG_INLINE void add(const self_type& c, unsigned cover) - { - calc_type cv, ca; - if(cover == cover_mask) - { - if(c.a == base_mask) - { - *this = c; - } - else - { - cv = v + c.v; v = (cv > calc_type(base_mask)) ? calc_type(base_mask) : cv; - ca = a + c.a; a = (ca > calc_type(base_mask)) ? calc_type(base_mask) : ca; - } - } - else - { - cv = v + ((c.v * cover + cover_mask/2) >> cover_shift); - ca = a + ((c.a * cover + cover_mask/2) >> cover_shift); - v = (cv > calc_type(base_mask)) ? calc_type(base_mask) : cv; - a = (ca > calc_type(base_mask)) ? calc_type(base_mask) : ca; - } - } - - //-------------------------------------------------------------------- - static self_type no_color() { return self_type(0,0); } - }; - - - //------------------------------------------------------------gray16_pre - inline gray16 gray16_pre(unsigned v, unsigned a = gray16::base_mask) - { - return gray16(v,a).premultiply(); - } - inline gray16 gray16_pre(const gray16& c, unsigned a) - { - return gray16(c,a).premultiply(); - } - inline gray16 gray16_pre(const rgba& c) - { - return gray16(c).premultiply(); - } - inline gray16 gray16_pre(const rgba& c, double a) - { - return gray16(c,a).premultiply(); - } - inline gray16 gray16_pre(const rgba8& c) - { - return gray16(c).premultiply(); - } - inline gray16 gray16_pre(const rgba8& c, unsigned a) - { - return gray16(c,a).premultiply(); - } - - -} - - - - -#endif diff --git a/uppdev/agg24/agg_color_rgba.h b/uppdev/agg24/agg_color_rgba.h deleted file mode 100644 index 8490cdec6..000000000 --- a/uppdev/agg24/agg_color_rgba.h +++ /dev/null @@ -1,743 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// -// Adaptation for high precision colors has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_COLOR_RGBA_INCLUDED -#define AGG_COLOR_RGBA_INCLUDED - -//#include -#include "agg_basics.h" - -namespace agg -{ - // Supported byte orders for RGB and RGBA pixel formats - //======================================================================= - struct order_rgb { enum rgb_e { R=0, G=1, B=2, rgb_tag }; }; //----order_rgb - struct order_bgr { enum bgr_e { B=0, G=1, R=2, rgb_tag }; }; //----order_bgr - struct order_rgba { enum rgba_e { R=0, G=1, B=2, A=3, rgba_tag }; }; //----order_rgba - struct order_argb { enum argb_e { A=0, R=1, G=2, B=3, rgba_tag }; }; //----order_argb - struct order_abgr { enum abgr_e { A=0, B=1, G=2, R=3, rgba_tag }; }; //----order_abgr - struct order_bgra { enum bgra_e { B=0, G=1, R=2, A=3, rgba_tag }; }; //----order_bgra - - //====================================================================rgba - struct rgba - { - typedef double value_type; - - double r; - double g; - double b; - double a; - - //-------------------------------------------------------------------- - rgba() {} - - //-------------------------------------------------------------------- - rgba(double r_, double g_, double b_, double a_=1.0) : - r(r_), g(g_), b(b_), a(a_) {} - - //-------------------------------------------------------------------- - rgba(const rgba& c, double a_) : r(c.r), g(c.g), b(c.b), a(a_) {} - - //-------------------------------------------------------------------- - void clear() - { - r = g = b = a = 0; - } - - //-------------------------------------------------------------------- - const rgba& transparent() - { - a = 0.0; - return *this; - } - - //-------------------------------------------------------------------- - const rgba& opacity(double a_) - { - if(a_ < 0.0) a_ = 0.0; - if(a_ > 1.0) a_ = 1.0; - a = a_; - return *this; - } - - //-------------------------------------------------------------------- - double opacity() const - { - return a; - } - - //-------------------------------------------------------------------- - const rgba& premultiply() - { - r *= a; - g *= a; - b *= a; - return *this; - } - - //-------------------------------------------------------------------- - const rgba& premultiply(double a_) - { - if(a <= 0.0 || a_ <= 0.0) - { - r = g = b = a = 0.0; - return *this; - } - a_ /= a; - r *= a_; - g *= a_; - b *= a_; - a = a_; - return *this; - } - - //-------------------------------------------------------------------- - const rgba& demultiply() - { - if(a == 0) - { - r = g = b = 0; - return *this; - } - double a_ = 1.0 / a; - r *= a_; - g *= a_; - b *= a_; - return *this; - } - - - //-------------------------------------------------------------------- - rgba gradient(rgba c, double k) const - { - rgba ret; - ret.r = r + (c.r - r) * k; - ret.g = g + (c.g - g) * k; - ret.b = b + (c.b - b) * k; - ret.a = a + (c.a - a) * k; - return ret; - } - - //-------------------------------------------------------------------- - static rgba no_color() { return rgba(0,0,0,0); } - - //-------------------------------------------------------------------- - static rgba from_wavelength(double wl, double gamma = 1.0); - - //-------------------------------------------------------------------- - explicit rgba(double wavelen, double gamma=1.0) - { - *this = from_wavelength(wavelen, gamma); - } - - }; - - //----------------------------------------------------------------rgba_pre - inline rgba rgba_pre(double r, double g, double b, double a=1.0) - { - return rgba(r, g, b, a).premultiply(); - } - inline rgba rgba_pre(const rgba& c) - { - return rgba(c).premultiply(); - } - inline rgba rgba_pre(const rgba& c, double a) - { - return rgba(c, a).premultiply(); - } - - //------------------------------------------------------------------------ - inline rgba rgba::from_wavelength(double wl, double gamma) - { - rgba t(0.0, 0.0, 0.0); - - if(wl >= 380.0 && wl <= 440.0) - { - t.r = -1.0 * (wl - 440.0) / (440.0 - 380.0); - t.b = 1.0; - } - else - if(wl >= 440.0 && wl <= 490.0) - { - t.g = (wl - 440.0) / (490.0 - 440.0); - t.b = 1.0; - } - else - if(wl >= 490.0 && wl <= 510.0) - { - t.g = 1.0; - t.b = -1.0 * (wl - 510.0) / (510.0 - 490.0); - } - else - if(wl >= 510.0 && wl <= 580.0) - { - t.r = (wl - 510.0) / (580.0 - 510.0); - t.g = 1.0; - } - else - if(wl >= 580.0 && wl <= 645.0) - { - t.r = 1.0; - t.g = -1.0 * (wl - 645.0) / (645.0 - 580.0); - } - else - if(wl >= 645.0 && wl <= 780.0) - { - t.r = 1.0; - } - - double s = 1.0; - if(wl > 700.0) s = 0.3 + 0.7 * (780.0 - wl) / (780.0 - 700.0); - else if(wl < 420.0) s = 0.3 + 0.7 * (wl - 380.0) / (420.0 - 380.0); - - t.r = pow(t.r * s, gamma); - t.g = pow(t.g * s, gamma); - t.b = pow(t.b * s, gamma); - return t; - } - - - - - //===================================================================rgba8 - struct rgba8 - { - typedef int8u value_type; - typedef int32u calc_type; - typedef int32 long_type; - enum base_scale_e - { - base_shift = 8, - base_scale = 1 << base_shift, - base_mask = base_scale - 1 - }; - typedef rgba8 self_type; - - - value_type r; - value_type g; - value_type b; - value_type a; - - //-------------------------------------------------------------------- - rgba8() {} - - //-------------------------------------------------------------------- - rgba8(unsigned r_, unsigned g_, unsigned b_, unsigned a_=base_mask) : - r(value_type(r_)), - g(value_type(g_)), - b(value_type(b_)), - a(value_type(a_)) {} - - //-------------------------------------------------------------------- - rgba8(const rgba& c, double a_) : - r((value_type)uround(c.r * double(base_mask))), - g((value_type)uround(c.g * double(base_mask))), - b((value_type)uround(c.b * double(base_mask))), - a((value_type)uround(a_ * double(base_mask))) {} - - //-------------------------------------------------------------------- - rgba8(const self_type& c, unsigned a_) : - r(c.r), g(c.g), b(c.b), a(value_type(a_)) {} - - //-------------------------------------------------------------------- - rgba8(const rgba& c) : - r((value_type)uround(c.r * double(base_mask))), - g((value_type)uround(c.g * double(base_mask))), - b((value_type)uround(c.b * double(base_mask))), - a((value_type)uround(c.a * double(base_mask))) {} - - //-------------------------------------------------------------------- - void clear() - { - r = g = b = a = 0; - } - - //-------------------------------------------------------------------- - const self_type& transparent() - { - a = 0; - return *this; - } - - //-------------------------------------------------------------------- - const self_type& opacity(double a_) - { - if(a_ < 0.0) a_ = 0.0; - if(a_ > 1.0) a_ = 1.0; - a = (value_type)uround(a_ * double(base_mask)); - return *this; - } - - //-------------------------------------------------------------------- - double opacity() const - { - return double(a) / double(base_mask); - } - - //-------------------------------------------------------------------- - AGG_INLINE const self_type& premultiply() - { - if(a == base_mask) return *this; - if(a == 0) - { - r = g = b = 0; - return *this; - } - r = value_type((calc_type(r) * a) >> base_shift); - g = value_type((calc_type(g) * a) >> base_shift); - b = value_type((calc_type(b) * a) >> base_shift); - return *this; - } - - //-------------------------------------------------------------------- - AGG_INLINE const self_type& premultiply(unsigned a_) - { - if(a == base_mask && a_ >= base_mask) return *this; - if(a == 0 || a_ == 0) - { - r = g = b = a = 0; - return *this; - } - calc_type r_ = (calc_type(r) * a_) / a; - calc_type g_ = (calc_type(g) * a_) / a; - calc_type b_ = (calc_type(b) * a_) / a; - r = value_type((r_ > a_) ? a_ : r_); - g = value_type((g_ > a_) ? a_ : g_); - b = value_type((b_ > a_) ? a_ : b_); - a = value_type(a_); - return *this; - } - - //-------------------------------------------------------------------- - AGG_INLINE const self_type& demultiply() - { - if(a == base_mask) return *this; - if(a == 0) - { - r = g = b = 0; - return *this; - } - calc_type r_ = (calc_type(r) * base_mask) / a; - calc_type g_ = (calc_type(g) * base_mask) / a; - calc_type b_ = (calc_type(b) * base_mask) / a; - r = value_type((r_ > calc_type(base_mask)) ? calc_type(base_mask) : r_); - g = value_type((g_ > calc_type(base_mask)) ? calc_type(base_mask) : g_); - b = value_type((b_ > calc_type(base_mask)) ? calc_type(base_mask) : b_); - return *this; - } - - //-------------------------------------------------------------------- - AGG_INLINE self_type gradient(const self_type& c, double k) const - { - self_type ret; - calc_type ik = uround(k * base_scale); - ret.r = value_type(calc_type(r) + (((calc_type(c.r) - r) * ik) >> base_shift)); - ret.g = value_type(calc_type(g) + (((calc_type(c.g) - g) * ik) >> base_shift)); - ret.b = value_type(calc_type(b) + (((calc_type(c.b) - b) * ik) >> base_shift)); - ret.a = value_type(calc_type(a) + (((calc_type(c.a) - a) * ik) >> base_shift)); - return ret; - } - - //-------------------------------------------------------------------- - AGG_INLINE void add(const self_type& c, unsigned cover) - { - calc_type cr, cg, cb, ca; - if(cover == cover_mask) - { - if(c.a == base_mask) - { - *this = c; - } - else - { - cr = r + c.r; r = (cr > calc_type(base_mask)) ? calc_type(base_mask) : cr; - cg = g + c.g; g = (cg > calc_type(base_mask)) ? calc_type(base_mask) : cg; - cb = b + c.b; b = (cb > calc_type(base_mask)) ? calc_type(base_mask) : cb; - ca = a + c.a; a = (ca > calc_type(base_mask)) ? calc_type(base_mask) : ca; - } - } - else - { - cr = r + ((c.r * cover + cover_mask/2) >> cover_shift); - cg = g + ((c.g * cover + cover_mask/2) >> cover_shift); - cb = b + ((c.b * cover + cover_mask/2) >> cover_shift); - ca = a + ((c.a * cover + cover_mask/2) >> cover_shift); - r = (cr > calc_type(base_mask)) ? calc_type(base_mask) : cr; - g = (cg > calc_type(base_mask)) ? calc_type(base_mask) : cg; - b = (cb > calc_type(base_mask)) ? calc_type(base_mask) : cb; - a = (ca > calc_type(base_mask)) ? calc_type(base_mask) : ca; - } - } - - //-------------------------------------------------------------------- - template - AGG_INLINE void apply_gamma_dir(const GammaLUT& gamma) - { - r = gamma.dir(r); - g = gamma.dir(g); - b = gamma.dir(b); - } - - //-------------------------------------------------------------------- - template - AGG_INLINE void apply_gamma_inv(const GammaLUT& gamma) - { - r = gamma.inv(r); - g = gamma.inv(g); - b = gamma.inv(b); - } - - //-------------------------------------------------------------------- - static self_type no_color() { return self_type(0,0,0,0); } - - //-------------------------------------------------------------------- - static self_type from_wavelength(double wl, double gamma = 1.0) - { - return self_type(rgba::from_wavelength(wl, gamma)); - } - }; - - - //-------------------------------------------------------------rgba8_pre - inline rgba8 rgba8_pre(unsigned r, unsigned g, unsigned b, - unsigned a = rgba8::base_mask) - { - return rgba8(r,g,b,a).premultiply(); - } - inline rgba8 rgba8_pre(const rgba8& c) - { - return rgba8(c).premultiply(); - } - inline rgba8 rgba8_pre(const rgba8& c, unsigned a) - { - return rgba8(c,a).premultiply(); - } - inline rgba8 rgba8_pre(const rgba& c) - { - return rgba8(c).premultiply(); - } - inline rgba8 rgba8_pre(const rgba& c, double a) - { - return rgba8(c,a).premultiply(); - } - - - //-------------------------------------------------------------rgb8_packed - inline rgba8 rgb8_packed(unsigned v) - { - return rgba8((v >> 16) & 0xFF, (v >> 8) & 0xFF, v & 0xFF); - } - - //-------------------------------------------------------------bgr8_packed - inline rgba8 bgr8_packed(unsigned v) - { - return rgba8(v & 0xFF, (v >> 8) & 0xFF, (v >> 16) & 0xFF); - } - - //------------------------------------------------------------argb8_packed - inline rgba8 argb8_packed(unsigned v) - { - return rgba8((v >> 16) & 0xFF, (v >> 8) & 0xFF, v & 0xFF, v >> 24); - } - - //---------------------------------------------------------rgba8_gamma_dir - template - rgba8 rgba8_gamma_dir(rgba8 c, const GammaLUT& gamma) - { - return rgba8(gamma.dir(c.r), gamma.dir(c.g), gamma.dir(c.b), c.a); - } - - //---------------------------------------------------------rgba8_gamma_inv - template - rgba8 rgba8_gamma_inv(rgba8 c, const GammaLUT& gamma) - { - return rgba8(gamma.inv(c.r), gamma.inv(c.g), gamma.inv(c.b), c.a); - } - - - - - - //==================================================================rgba16 - struct rgba16 - { - typedef int16u value_type; - typedef int32u calc_type; - typedef int64 long_type; - enum base_scale_e - { - base_shift = 16, - base_scale = 1 << base_shift, - base_mask = base_scale - 1 - }; - typedef rgba16 self_type; - - value_type r; - value_type g; - value_type b; - value_type a; - - //-------------------------------------------------------------------- - rgba16() {} - - //-------------------------------------------------------------------- - rgba16(unsigned r_, unsigned g_, unsigned b_, unsigned a_=base_mask) : - r(value_type(r_)), - g(value_type(g_)), - b(value_type(b_)), - a(value_type(a_)) {} - - //-------------------------------------------------------------------- - rgba16(const self_type& c, unsigned a_) : - r(c.r), g(c.g), b(c.b), a(value_type(a_)) {} - - //-------------------------------------------------------------------- - rgba16(const rgba& c) : - r((value_type)uround(c.r * double(base_mask))), - g((value_type)uround(c.g * double(base_mask))), - b((value_type)uround(c.b * double(base_mask))), - a((value_type)uround(c.a * double(base_mask))) {} - - //-------------------------------------------------------------------- - rgba16(const rgba& c, double a_) : - r((value_type)uround(c.r * double(base_mask))), - g((value_type)uround(c.g * double(base_mask))), - b((value_type)uround(c.b * double(base_mask))), - a((value_type)uround(a_ * double(base_mask))) {} - - //-------------------------------------------------------------------- - rgba16(const rgba8& c) : - r(value_type((value_type(c.r) << 8) | c.r)), - g(value_type((value_type(c.g) << 8) | c.g)), - b(value_type((value_type(c.b) << 8) | c.b)), - a(value_type((value_type(c.a) << 8) | c.a)) {} - - //-------------------------------------------------------------------- - rgba16(const rgba8& c, unsigned a_) : - r(value_type((value_type(c.r) << 8) | c.r)), - g(value_type((value_type(c.g) << 8) | c.g)), - b(value_type((value_type(c.b) << 8) | c.b)), - a(value_type(( a_ << 8) | c.a)) {} - - //-------------------------------------------------------------------- - void clear() - { - r = g = b = a = 0; - } - - //-------------------------------------------------------------------- - const self_type& transparent() - { - a = 0; - return *this; - } - - //-------------------------------------------------------------------- - AGG_INLINE const self_type& opacity(double a_) - { - if(a_ < 0.0) a_ = 0.0; - if(a_ > 1.0) a_ = 1.0; - a = (value_type)uround(a_ * double(base_mask)); - return *this; - } - - //-------------------------------------------------------------------- - double opacity() const - { - return double(a) / double(base_mask); - } - - //-------------------------------------------------------------------- - AGG_INLINE const self_type& premultiply() - { - if(a == base_mask) return *this; - if(a == 0) - { - r = g = b = 0; - return *this; - } - r = value_type((calc_type(r) * a) >> base_shift); - g = value_type((calc_type(g) * a) >> base_shift); - b = value_type((calc_type(b) * a) >> base_shift); - return *this; - } - - //-------------------------------------------------------------------- - AGG_INLINE const self_type& premultiply(unsigned a_) - { - if(a == base_mask && a_ >= base_mask) return *this; - if(a == 0 || a_ == 0) - { - r = g = b = a = 0; - return *this; - } - calc_type r_ = (calc_type(r) * a_) / a; - calc_type g_ = (calc_type(g) * a_) / a; - calc_type b_ = (calc_type(b) * a_) / a; - r = value_type((r_ > a_) ? a_ : r_); - g = value_type((g_ > a_) ? a_ : g_); - b = value_type((b_ > a_) ? a_ : b_); - a = value_type(a_); - return *this; - } - - //-------------------------------------------------------------------- - AGG_INLINE const self_type& demultiply() - { - if(a == base_mask) return *this; - if(a == 0) - { - r = g = b = 0; - return *this; - } - calc_type r_ = (calc_type(r) * base_mask) / a; - calc_type g_ = (calc_type(g) * base_mask) / a; - calc_type b_ = (calc_type(b) * base_mask) / a; - r = value_type((r_ > calc_type(base_mask)) ? calc_type(base_mask) : r_); - g = value_type((g_ > calc_type(base_mask)) ? calc_type(base_mask) : g_); - b = value_type((b_ > calc_type(base_mask)) ? calc_type(base_mask) : b_); - return *this; - } - - //-------------------------------------------------------------------- - AGG_INLINE self_type gradient(const self_type& c, double k) const - { - self_type ret; - calc_type ik = uround(k * base_scale); - ret.r = value_type(calc_type(r) + (((calc_type(c.r) - r) * ik) >> base_shift)); - ret.g = value_type(calc_type(g) + (((calc_type(c.g) - g) * ik) >> base_shift)); - ret.b = value_type(calc_type(b) + (((calc_type(c.b) - b) * ik) >> base_shift)); - ret.a = value_type(calc_type(a) + (((calc_type(c.a) - a) * ik) >> base_shift)); - return ret; - } - - //-------------------------------------------------------------------- - AGG_INLINE void add(const self_type& c, unsigned cover) - { - calc_type cr, cg, cb, ca; - if(cover == cover_mask) - { - if(c.a == base_mask) - { - *this = c; - } - else - { - cr = r + c.r; r = (cr > calc_type(base_mask)) ? calc_type(base_mask) : cr; - cg = g + c.g; g = (cg > calc_type(base_mask)) ? calc_type(base_mask) : cg; - cb = b + c.b; b = (cb > calc_type(base_mask)) ? calc_type(base_mask) : cb; - ca = a + c.a; a = (ca > calc_type(base_mask)) ? calc_type(base_mask) : ca; - } - } - else - { - cr = r + ((c.r * cover + cover_mask) >> cover_shift); - cg = g + ((c.g * cover + cover_mask) >> cover_shift); - cb = b + ((c.b * cover + cover_mask) >> cover_shift); - ca = a + ((c.a * cover + cover_mask) >> cover_shift); - r = (cr > calc_type(base_mask)) ? calc_type(base_mask) : cr; - g = (cg > calc_type(base_mask)) ? calc_type(base_mask) : cg; - b = (cb > calc_type(base_mask)) ? calc_type(base_mask) : cb; - a = (ca > calc_type(base_mask)) ? calc_type(base_mask) : ca; - } - } - - //-------------------------------------------------------------------- - template - AGG_INLINE void apply_gamma_dir(const GammaLUT& gamma) - { - r = gamma.dir(r); - g = gamma.dir(g); - b = gamma.dir(b); - } - - //-------------------------------------------------------------------- - template - AGG_INLINE void apply_gamma_inv(const GammaLUT& gamma) - { - r = gamma.inv(r); - g = gamma.inv(g); - b = gamma.inv(b); - } - - //-------------------------------------------------------------------- - static self_type no_color() { return self_type(0,0,0,0); } - - //-------------------------------------------------------------------- - static self_type from_wavelength(double wl, double gamma = 1.0) - { - return self_type(rgba::from_wavelength(wl, gamma)); - } - }; - - - - //--------------------------------------------------------------rgba16_pre - inline rgba16 rgba16_pre(unsigned r, unsigned g, unsigned b, - unsigned a = rgba16::base_mask) - { - return rgba16(r,g,b,a).premultiply(); - } - inline rgba16 rgba16_pre(const rgba16& c, unsigned a) - { - return rgba16(c,a).premultiply(); - } - inline rgba16 rgba16_pre(const rgba& c) - { - return rgba16(c).premultiply(); - } - inline rgba16 rgba16_pre(const rgba& c, double a) - { - return rgba16(c,a).premultiply(); - } - inline rgba16 rgba16_pre(const rgba8& c) - { - return rgba16(c).premultiply(); - } - inline rgba16 rgba16_pre(const rgba8& c, unsigned a) - { - return rgba16(c,a).premultiply(); - } - - - //------------------------------------------------------rgba16_gamma_dir - template - rgba16 rgba16_gamma_dir(rgba16 c, const GammaLUT& gamma) - { - return rgba16(gamma.dir(c.r), gamma.dir(c.g), gamma.dir(c.b), c.a); - } - - //------------------------------------------------------rgba16_gamma_inv - template - rgba16 rgba16_gamma_inv(rgba16 c, const GammaLUT& gamma) - { - return rgba16(gamma.inv(c.r), gamma.inv(c.g), gamma.inv(c.b), c.a); - } - - -} - - - -#endif diff --git a/uppdev/agg24/agg_config.h b/uppdev/agg24/agg_config.h deleted file mode 100644 index 81c75f124..000000000 --- a/uppdev/agg24/agg_config.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef AGG_CONFIG_INCLUDED -#define AGG_CONFIG_INCLUDED - -// This file can be used to redefine certain data types. - -//--------------------------------------- -// 1. Default basic types such as: -// -// AGG_INT8 -// AGG_INT8U -// AGG_INT16 -// AGG_INT16U -// AGG_INT32 -// AGG_INT32U -// AGG_INT64 -// AGG_INT64U -// -// Just replace this file with new defines if necessary. -// For example, if your compiler doesn't have a 64 bit integer type -// you can still use AGG if you define the follows: -// -// #define AGG_INT64 int -// #define AGG_INT64U unsigned -// -// It will result in overflow in 16 bit-per-component image/pattern resampling -// but it won't result any crash and the rest of the library will remain -// fully functional. - - -//--------------------------------------- -// 2. Default rendering_buffer type. Can be: -// -// Provides faster access for massive pixel operations, -// such as blur, image filtering: -// #define AGG_RENDERING_BUFFER row_ptr_cache -// -// Provides cheaper creation and destruction (no mem allocs): -// #define AGG_RENDERING_BUFFER row_accessor -// -// You can still use both of them simultaneouslyin your applications -// This #define is used only for default rendering_buffer type, -// in short hand typedefs like pixfmt_rgba32. - -#endif diff --git a/uppdev/agg24/agg_conv_adaptor_vcgen.h b/uppdev/agg24/agg_conv_adaptor_vcgen.h deleted file mode 100644 index a79f2208c..000000000 --- a/uppdev/agg24/agg_conv_adaptor_vcgen.h +++ /dev/null @@ -1,157 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_CONV_ADAPTOR_VCGEN_INCLUDED -#define AGG_CONV_ADAPTOR_VCGEN_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - //------------------------------------------------------------null_markers - struct null_markers - { - void remove_all() {} - void add_vertex(double, double, unsigned) {} - void prepare_src() {} - - void rewind(unsigned) {} - unsigned vertex(double*, double*) { return path_cmd_stop; } - }; - - - //------------------------------------------------------conv_adaptor_vcgen - template class conv_adaptor_vcgen - { - enum status - { - initial, - accumulate, - generate - }; - - public: - explicit conv_adaptor_vcgen(VertexSource& source) : - m_source(&source), - m_status(initial) - {} - void attach(VertexSource& source) { m_source = &source; } - - Generator& generator() { return m_generator; } - const Generator& generator() const { return m_generator; } - - Markers& markers() { return m_markers; } - const Markers& markers() const { return m_markers; } - - void rewind(unsigned path_id) - { - m_source->rewind(path_id); - m_status = initial; - } - - unsigned vertex(double* x, double* y); - - private: - // Prohibit copying - conv_adaptor_vcgen(const conv_adaptor_vcgen&); - const conv_adaptor_vcgen& - operator = (const conv_adaptor_vcgen&); - - VertexSource* m_source; - Generator m_generator; - Markers m_markers; - status m_status; - unsigned m_last_cmd; - double m_start_x; - double m_start_y; - }; - - - - - - //------------------------------------------------------------------------ - template - unsigned conv_adaptor_vcgen::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_stop; - bool done = false; - while(!done) - { - switch(m_status) - { - case initial: - m_markers.remove_all(); - m_last_cmd = m_source->vertex(&m_start_x, &m_start_y); - m_status = accumulate; - - case accumulate: - if(is_stop(m_last_cmd)) return path_cmd_stop; - - m_generator.remove_all(); - m_generator.add_vertex(m_start_x, m_start_y, path_cmd_move_to); - m_markers.add_vertex(m_start_x, m_start_y, path_cmd_move_to); - - for(;;) - { - cmd = m_source->vertex(x, y); - if(is_vertex(cmd)) - { - m_last_cmd = cmd; - if(is_move_to(cmd)) - { - m_start_x = *x; - m_start_y = *y; - break; - } - m_generator.add_vertex(*x, *y, cmd); - m_markers.add_vertex(*x, *y, path_cmd_line_to); - } - else - { - if(is_stop(cmd)) - { - m_last_cmd = path_cmd_stop; - break; - } - if(is_end_poly(cmd)) - { - m_generator.add_vertex(*x, *y, cmd); - break; - } - } - } - m_generator.rewind(0); - m_status = generate; - - case generate: - cmd = m_generator.vertex(x, y); - if(is_stop(cmd)) - { - m_status = accumulate; - break; - } - done = true; - break; - } - } - return cmd; - } - -} - -#endif diff --git a/uppdev/agg24/agg_conv_adaptor_vpgen.h b/uppdev/agg24/agg_conv_adaptor_vpgen.h deleted file mode 100644 index d6b545ef1..000000000 --- a/uppdev/agg24/agg_conv_adaptor_vpgen.h +++ /dev/null @@ -1,159 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_CONV_ADAPTOR_VPGEN_INCLUDED -#define AGG_CONV_ADAPTOR_VPGEN_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - - //======================================================conv_adaptor_vpgen - template class conv_adaptor_vpgen - { - public: - explicit conv_adaptor_vpgen(VertexSource& source) : m_source(&source) {} - void attach(VertexSource& source) { m_source = &source; } - - VPGen& vpgen() { return m_vpgen; } - const VPGen& vpgen() const { return m_vpgen; } - - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - conv_adaptor_vpgen(const conv_adaptor_vpgen&); - const conv_adaptor_vpgen& - operator = (const conv_adaptor_vpgen&); - - VertexSource* m_source; - VPGen m_vpgen; - double m_start_x; - double m_start_y; - unsigned m_poly_flags; - int m_vertices; - }; - - - - //------------------------------------------------------------------------ - template - void conv_adaptor_vpgen::rewind(unsigned path_id) - { - m_source->rewind(path_id); - m_vpgen.reset(); - m_start_x = 0; - m_start_y = 0; - m_poly_flags = 0; - m_vertices = 0; - } - - - //------------------------------------------------------------------------ - template - unsigned conv_adaptor_vpgen::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_stop; - for(;;) - { - cmd = m_vpgen.vertex(x, y); - if(!is_stop(cmd)) break; - - if(m_poly_flags && !m_vpgen.auto_unclose()) - { - *x = 0.0; - *y = 0.0; - cmd = m_poly_flags; - m_poly_flags = 0; - break; - } - - if(m_vertices < 0) - { - if(m_vertices < -1) - { - m_vertices = 0; - return path_cmd_stop; - } - m_vpgen.move_to(m_start_x, m_start_y); - m_vertices = 1; - continue; - } - - double tx, ty; - cmd = m_source->vertex(&tx, &ty); - if(is_vertex(cmd)) - { - if(is_move_to(cmd)) - { - if(m_vpgen.auto_close() && m_vertices > 2) - { - m_vpgen.line_to(m_start_x, m_start_y); - m_poly_flags = path_cmd_end_poly | path_flags_close; - m_start_x = tx; - m_start_y = ty; - m_vertices = -1; - continue; - } - m_vpgen.move_to(tx, ty); - m_start_x = tx; - m_start_y = ty; - m_vertices = 1; - } - else - { - m_vpgen.line_to(tx, ty); - ++m_vertices; - } - } - else - { - if(is_end_poly(cmd)) - { - m_poly_flags = cmd; - if(is_closed(cmd) || m_vpgen.auto_close()) - { - if(m_vpgen.auto_close()) m_poly_flags |= path_flags_close; - if(m_vertices > 2) - { - m_vpgen.line_to(m_start_x, m_start_y); - } - m_vertices = 0; - } - } - else - { - // path_cmd_stop - if(m_vpgen.auto_close() && m_vertices > 2) - { - m_vpgen.line_to(m_start_x, m_start_y); - m_poly_flags = path_cmd_end_poly | path_flags_close; - m_vertices = -2; - continue; - } - break; - } - } - } - return cmd; - } - - -} - - -#endif - diff --git a/uppdev/agg24/agg_conv_bspline.h b/uppdev/agg24/agg_conv_bspline.h deleted file mode 100644 index 13d22d929..000000000 --- a/uppdev/agg24/agg_conv_bspline.h +++ /dev/null @@ -1,48 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -#ifndef AGG_CONV_BSPLINE_INCLUDED -#define AGG_CONV_BSPLINE_INCLUDED - -#include "agg_basics.h" -#include "agg_vcgen_bspline.h" -#include "agg_conv_adaptor_vcgen.h" - - -namespace agg -{ - - //---------------------------------------------------------conv_bspline - template - struct conv_bspline : public conv_adaptor_vcgen - { - typedef conv_adaptor_vcgen base_type; - - conv_bspline(VertexSource& vs) : - conv_adaptor_vcgen(vs) {} - - void interpolation_step(double v) { base_type::generator().interpolation_step(v); } - double interpolation_step() const { return base_type::generator().interpolation_step(); } - - private: - conv_bspline(const conv_bspline&); - const conv_bspline& - operator = (const conv_bspline&); - }; - -} - - -#endif - diff --git a/uppdev/agg24/agg_conv_clip_polygon.h b/uppdev/agg24/agg_conv_clip_polygon.h deleted file mode 100644 index 87537638d..000000000 --- a/uppdev/agg24/agg_conv_clip_polygon.h +++ /dev/null @@ -1,63 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Polygon clipping converter -// There an optimized Liang-Basky algorithm is used. -// The algorithm doesn't optimize the degenerate edges, i.e. it will never -// break a closed polygon into two or more ones, instead, there will be -// degenerate edges coinciding with the respective clipping boundaries. -// This is a sub-optimal solution, because that optimization would require -// extra, rather expensive math while the rasterizer tolerates it quite well, -// without any considerable overhead. -// -//---------------------------------------------------------------------------- -#ifndef AGG_CONV_CLIP_POLYGON_INCLUDED -#define AGG_CONV_CLIP_POLYGON_INCLUDED - -#include "agg_basics.h" -#include "agg_conv_adaptor_vpgen.h" -#include "agg_vpgen_clip_polygon.h" - -namespace agg -{ - - //=======================================================conv_clip_polygon - template - struct conv_clip_polygon : public conv_adaptor_vpgen - { - typedef conv_adaptor_vpgen base_type; - - conv_clip_polygon(VertexSource& vs) : - conv_adaptor_vpgen(vs) {} - - void clip_box(double x1, double y1, double x2, double y2) - { - base_type::vpgen().clip_box(x1, y1, x2, y2); - } - - double x1() const { return base_type::vpgen().x1(); } - double y1() const { return base_type::vpgen().y1(); } - double x2() const { return base_type::vpgen().x2(); } - double y2() const { return base_type::vpgen().y2(); } - - private: - conv_clip_polygon(const conv_clip_polygon&); - const conv_clip_polygon& - operator = (const conv_clip_polygon&); - }; - -} - -#endif diff --git a/uppdev/agg24/agg_conv_clip_polyline.h b/uppdev/agg24/agg_conv_clip_polyline.h deleted file mode 100644 index f3fc2888c..000000000 --- a/uppdev/agg24/agg_conv_clip_polyline.h +++ /dev/null @@ -1,63 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// polyline clipping converter -// There an optimized Liang-Basky algorithm is used. -// The algorithm doesn't optimize the degenerate edges, i.e. it will never -// break a closed polyline into two or more ones, instead, there will be -// degenerate edges coinciding with the respective clipping boundaries. -// This is a sub-optimal solution, because that optimization would require -// extra, rather expensive math while the rasterizer tolerates it quite well, -// without any considerable overhead. -// -//---------------------------------------------------------------------------- -#ifndef AGG_CONV_CLIP_polyline_INCLUDED -#define AGG_CONV_CLIP_polyline_INCLUDED - -#include "agg_basics.h" -#include "agg_conv_adaptor_vpgen.h" -#include "agg_vpgen_clip_polyline.h" - -namespace agg -{ - - //=======================================================conv_clip_polyline - template - struct conv_clip_polyline : public conv_adaptor_vpgen - { - typedef conv_adaptor_vpgen base_type; - - conv_clip_polyline(VertexSource& vs) : - conv_adaptor_vpgen(vs) {} - - void clip_box(double x1, double y1, double x2, double y2) - { - base_type::vpgen().clip_box(x1, y1, x2, y2); - } - - double x1() const { return base_type::vpgen().x1(); } - double y1() const { return base_type::vpgen().y1(); } - double x2() const { return base_type::vpgen().x2(); } - double y2() const { return base_type::vpgen().y2(); } - - private: - conv_clip_polyline(const conv_clip_polyline&); - const conv_clip_polyline& - operator = (const conv_clip_polyline&); - }; - -} - -#endif diff --git a/uppdev/agg24/agg_conv_close_polygon.h b/uppdev/agg24/agg_conv_close_polygon.h deleted file mode 100644 index c46594fdf..000000000 --- a/uppdev/agg24/agg_conv_close_polygon.h +++ /dev/null @@ -1,125 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_CONV_CLOSE_POLYGON_INCLUDED -#define AGG_CONV_CLOSE_POLYGON_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - - //======================================================conv_close_polygon - template class conv_close_polygon - { - public: - explicit conv_close_polygon(VertexSource& vs) : m_source(&vs) {} - void attach(VertexSource& source) { m_source = &source; } - - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - conv_close_polygon(const conv_close_polygon&); - const conv_close_polygon& - operator = (const conv_close_polygon&); - - VertexSource* m_source; - unsigned m_cmd[2]; - double m_x[2]; - double m_y[2]; - unsigned m_vertex; - bool m_line_to; - }; - - - - //------------------------------------------------------------------------ - template - void conv_close_polygon::rewind(unsigned path_id) - { - m_source->rewind(path_id); - m_vertex = 2; - m_line_to = false; - } - - - - //------------------------------------------------------------------------ - template - unsigned conv_close_polygon::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_stop; - for(;;) - { - if(m_vertex < 2) - { - *x = m_x[m_vertex]; - *y = m_y[m_vertex]; - cmd = m_cmd[m_vertex]; - ++m_vertex; - break; - } - - cmd = m_source->vertex(x, y); - - if(is_end_poly(cmd)) - { - cmd |= path_flags_close; - break; - } - - if(is_stop(cmd)) - { - if(m_line_to) - { - m_cmd[0] = path_cmd_end_poly | path_flags_close; - m_cmd[1] = path_cmd_stop; - m_vertex = 0; - m_line_to = false; - continue; - } - break; - } - - if(is_move_to(cmd)) - { - if(m_line_to) - { - m_x[0] = 0.0; - m_y[0] = 0.0; - m_cmd[0] = path_cmd_end_poly | path_flags_close; - m_x[1] = *x; - m_y[1] = *y; - m_cmd[1] = cmd; - m_vertex = 0; - m_line_to = false; - continue; - } - break; - } - - if(is_vertex(cmd)) - { - m_line_to = true; - break; - } - } - return cmd; - } - -} - -#endif diff --git a/uppdev/agg24/agg_conv_concat.h b/uppdev/agg24/agg_conv_concat.h deleted file mode 100644 index 745d349c6..000000000 --- a/uppdev/agg24/agg_conv_concat.h +++ /dev/null @@ -1,73 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_CONV_CONCAT_INCLUDED -#define AGG_CONV_CONCAT_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - //=============================================================conv_concat - // Concatenation of two paths. Usually used to combine lines or curves - // with markers such as arrowheads - template class conv_concat - { - public: - conv_concat(VS1& source1, VS2& source2) : - m_source1(&source1), m_source2(&source2), m_status(2) {} - void attach1(VS1& source) { m_source1 = &source; } - void attach2(VS2& source) { m_source2 = &source; } - - - void rewind(unsigned path_id) - { - m_source1->rewind(path_id); - m_source2->rewind(0); - m_status = 0; - } - - unsigned vertex(double* x, double* y) - { - unsigned cmd; - if(m_status == 0) - { - cmd = m_source1->vertex(x, y); - if(!is_stop(cmd)) return cmd; - m_status = 1; - } - if(m_status == 1) - { - cmd = m_source2->vertex(x, y); - if(!is_stop(cmd)) return cmd; - m_status = 2; - } - return path_cmd_stop; - } - - private: - conv_concat(const conv_concat&); - const conv_concat& - operator = (const conv_concat&); - - VS1* m_source1; - VS2* m_source2; - int m_status; - - }; -} - - -#endif diff --git a/uppdev/agg24/agg_conv_contour.h b/uppdev/agg24/agg_conv_contour.h deleted file mode 100644 index b4b5a9047..000000000 --- a/uppdev/agg24/agg_conv_contour.h +++ /dev/null @@ -1,65 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// conv_stroke -// -//---------------------------------------------------------------------------- -#ifndef AGG_CONV_CONTOUR_INCLUDED -#define AGG_CONV_CONTOUR_INCLUDED - -#include "agg_basics.h" -#include "agg_vcgen_contour.h" -#include "agg_conv_adaptor_vcgen.h" - -namespace agg -{ - - //-----------------------------------------------------------conv_contour - template - struct conv_contour : public conv_adaptor_vcgen - { - typedef conv_adaptor_vcgen base_type; - - conv_contour(VertexSource& vs) : - conv_adaptor_vcgen(vs) - { - } - - void line_join(line_join_e lj) { base_type::generator().line_join(lj); } - void inner_join(inner_join_e ij) { base_type::generator().inner_join(ij); } - void width(double w) { base_type::generator().width(w); } - void miter_limit(double ml) { base_type::generator().miter_limit(ml); } - void miter_limit_theta(double t) { base_type::generator().miter_limit_theta(t); } - void inner_miter_limit(double ml) { base_type::generator().inner_miter_limit(ml); } - void approximation_scale(double as) { base_type::generator().approximation_scale(as); } - void auto_detect_orientation(bool v) { base_type::generator().auto_detect_orientation(v); } - - line_join_e line_join() const { return base_type::generator().line_join(); } - inner_join_e inner_join() const { return base_type::generator().inner_join(); } - double width() const { return base_type::generator().width(); } - double miter_limit() const { return base_type::generator().miter_limit(); } - double inner_miter_limit() const { return base_type::generator().inner_miter_limit(); } - double approximation_scale() const { return base_type::generator().approximation_scale(); } - bool auto_detect_orientation() const { return base_type::generator().auto_detect_orientation(); } - - private: - conv_contour(const conv_contour&); - const conv_contour& - operator = (const conv_contour&); - }; - -} - -#endif diff --git a/uppdev/agg24/agg_conv_curve.h b/uppdev/agg24/agg_conv_curve.h deleted file mode 100644 index d5b475de7..000000000 --- a/uppdev/agg24/agg_conv_curve.h +++ /dev/null @@ -1,201 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// classes conv_curve -// -//---------------------------------------------------------------------------- - -#ifndef AGG_CONV_CURVE_INCLUDED -#define AGG_CONV_CURVE_INCLUDED - -#include "agg_basics.h" -#include "agg_curves.h" - -namespace agg -{ - - - //---------------------------------------------------------------conv_curve - // Curve converter class. Any path storage can have Bezier curves defined - // by their control points. There're two types of curves supported: curve3 - // and curve4. Curve3 is a conic Bezier curve with 2 endpoints and 1 control - // point. Curve4 has 2 control points (4 points in total) and can be used - // to interpolate more complicated curves. Curve4, unlike curve3 can be used - // to approximate arcs, both circular and elliptical. Curves are approximated - // with straight lines and one of the approaches is just to store the whole - // sequence of vertices that approximate our curve. It takes additional - // memory, and at the same time the consecutive vertices can be calculated - // on demand. - // - // Initially, path storages are not suppose to keep all the vertices of the - // curves (although, nothing prevents us from doing so). Instead, path_storage - // keeps only vertices, needed to calculate a curve on demand. Those vertices - // are marked with special commands. So, if the path_storage contains curves - // (which are not real curves yet), and we render this storage directly, - // all we will see is only 2 or 3 straight line segments (for curve3 and - // curve4 respectively). If we need to see real curves drawn we need to - // include this class into the conversion pipeline. - // - // Class conv_curve recognizes commands path_cmd_curve3 and path_cmd_curve4 - // and converts these vertices into a move_to/line_to sequence. - //----------------------------------------------------------------------- - template class conv_curve - { - public: - typedef Curve3 curve3_type; - typedef Curve4 curve4_type; - typedef conv_curve self_type; - - explicit conv_curve(VertexSource& source) : - m_source(&source), m_last_x(0.0), m_last_y(0.0) {} - void attach(VertexSource& source) { m_source = &source; } - - void approximation_method(curve_approximation_method_e v) - { - m_curve3.approximation_method(v); - m_curve4.approximation_method(v); - } - - curve_approximation_method_e approximation_method() const - { - return m_curve4.approximation_method(); - } - - void approximation_scale(double s) - { - m_curve3.approximation_scale(s); - m_curve4.approximation_scale(s); - } - - double approximation_scale() const - { - return m_curve4.approximation_scale(); - } - - void angle_tolerance(double v) - { - m_curve3.angle_tolerance(v); - m_curve4.angle_tolerance(v); - } - - double angle_tolerance() const - { - return m_curve4.angle_tolerance(); - } - - void cusp_limit(double v) - { - m_curve3.cusp_limit(v); - m_curve4.cusp_limit(v); - } - - double cusp_limit() const - { - return m_curve4.cusp_limit(); - } - - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - conv_curve(const self_type&); - const self_type& operator = (const self_type&); - - VertexSource* m_source; - double m_last_x; - double m_last_y; - curve3_type m_curve3; - curve4_type m_curve4; - }; - - - - //------------------------------------------------------------------------ - template - void conv_curve::rewind(unsigned path_id) - { - m_source->rewind(path_id); - m_last_x = 0.0; - m_last_y = 0.0; - m_curve3.reset(); - m_curve4.reset(); - } - - - //------------------------------------------------------------------------ - template - unsigned conv_curve::vertex(double* x, double* y) - { - if(!is_stop(m_curve3.vertex(x, y))) - { - m_last_x = *x; - m_last_y = *y; - return path_cmd_line_to; - } - - if(!is_stop(m_curve4.vertex(x, y))) - { - m_last_x = *x; - m_last_y = *y; - return path_cmd_line_to; - } - - double ct2_x; - double ct2_y; - double end_x; - double end_y; - - unsigned cmd = m_source->vertex(x, y); - switch(cmd) - { - case path_cmd_curve3: - m_source->vertex(&end_x, &end_y); - - m_curve3.init(m_last_x, m_last_y, - *x, *y, - end_x, end_y); - - m_curve3.vertex(x, y); // First call returns path_cmd_move_to - m_curve3.vertex(x, y); // This is the first vertex of the curve - cmd = path_cmd_line_to; - break; - - case path_cmd_curve4: - m_source->vertex(&ct2_x, &ct2_y); - m_source->vertex(&end_x, &end_y); - - m_curve4.init(m_last_x, m_last_y, - *x, *y, - ct2_x, ct2_y, - end_x, end_y); - - m_curve4.vertex(x, y); // First call returns path_cmd_move_to - m_curve4.vertex(x, y); // This is the first vertex of the curve - cmd = path_cmd_line_to; - break; - } - m_last_x = *x; - m_last_y = *y; - return cmd; - } - - -} - - - -#endif diff --git a/uppdev/agg24/agg_conv_dash.h b/uppdev/agg24/agg_conv_dash.h deleted file mode 100644 index 23c13ad0a..000000000 --- a/uppdev/agg24/agg_conv_dash.h +++ /dev/null @@ -1,68 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// conv_dash -// -//---------------------------------------------------------------------------- -#ifndef AGG_CONV_DASH_INCLUDED -#define AGG_CONV_DASH_INCLUDED - -#include "agg_basics.h" -#include "agg_vcgen_dash.h" -#include "agg_conv_adaptor_vcgen.h" - -namespace agg -{ - - //---------------------------------------------------------------conv_dash - template - struct conv_dash : public conv_adaptor_vcgen - { - typedef Markers marker_type; - typedef conv_adaptor_vcgen base_type; - - conv_dash(VertexSource& vs) : - conv_adaptor_vcgen(vs) - { - } - - void remove_all_dashes() - { - base_type::generator().remove_all_dashes(); - } - - void add_dash(double dash_len, double gap_len) - { - base_type::generator().add_dash(dash_len, gap_len); - } - - void dash_start(double ds) - { - base_type::generator().dash_start(ds); - } - - void shorten(double s) { base_type::generator().shorten(s); } - double shorten() const { return base_type::generator().shorten(); } - - private: - conv_dash(const conv_dash&); - const conv_dash& - operator = (const conv_dash&); - }; - - -} - -#endif diff --git a/uppdev/agg24/agg_conv_gpc.h b/uppdev/agg24/agg_conv_gpc.h deleted file mode 100644 index 2acada342..000000000 --- a/uppdev/agg24/agg_conv_gpc.h +++ /dev/null @@ -1,432 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// General Polygon Clipper based on the GPC library by Alan Murta -// Union, Intersection, XOR, A-B, B-A -// Contact the author if you intend to use it in commercial applications! -// http://www.cs.man.ac.uk/aig/staff/alan/software/ -// Alan Murta (email: gpc@cs.man.ac.uk) -// -//---------------------------------------------------------------------------- - -#ifndef AGG_CONV_GPC_INCLUDED -#define AGG_CONV_GPC_INCLUDED - -#include -#include "agg_basics.h" -#include "agg_array.h" - -extern "C" -{ -#include "gpc.h" -} - -namespace agg -{ - enum gpc_op_e - { - gpc_or, - gpc_and, - gpc_xor, - gpc_a_minus_b, - gpc_b_minus_a - }; - - - //================================================================conv_gpc - template class conv_gpc - { - enum status - { - status_move_to, - status_line_to, - status_stop - }; - - struct contour_header_type - { - int num_vertices; - int hole_flag; - gpc_vertex* vertices; - }; - - typedef pod_bvector vertex_array_type; - typedef pod_bvector contour_header_array_type; - - - public: - typedef VSA source_a_type; - typedef VSB source_b_type; - typedef conv_gpc self_type; - - ~conv_gpc() - { - free_gpc_data(); - } - - conv_gpc(source_a_type& a, source_b_type& b, gpc_op_e op = gpc_or) : - m_src_a(&a), - m_src_b(&b), - m_status(status_move_to), - m_vertex(-1), - m_contour(-1), - m_operation(op) - { - memset(&m_poly_a, 0, sizeof(m_poly_a)); - memset(&m_poly_b, 0, sizeof(m_poly_b)); - memset(&m_result, 0, sizeof(m_result)); - } - - void attach1(VSA& source) { m_src_a = &source; } - void attach2(VSB& source) { m_src_b = &source; } - - void operation(gpc_op_e v) { m_operation = v; } - - // Vertex Source Interface - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - conv_gpc(const conv_gpc&); - const conv_gpc& operator = (const conv_gpc&); - - //-------------------------------------------------------------------- - void free_polygon(gpc_polygon& p); - void free_result(); - void free_gpc_data(); - void start_contour(); - void add_vertex(double x, double y); - void end_contour(unsigned orientation); - void make_polygon(gpc_polygon& p); - void start_extracting(); - bool next_contour(); - bool next_vertex(double* x, double* y); - - - //-------------------------------------------------------------------- - template void add(VS& src, gpc_polygon& p) - { - unsigned cmd; - double x, y; - double start_x = 0.0; - double start_y = 0.0; - bool line_to = false; - unsigned orientation = 0; - - m_contour_accumulator.remove_all(); - - while(!is_stop(cmd = src.vertex(&x, &y))) - { - if(is_vertex(cmd)) - { - if(is_move_to(cmd)) - { - if(line_to) - { - end_contour(orientation); - orientation = 0; - } - start_contour(); - start_x = x; - start_y = y; - } - add_vertex(x, y); - line_to = true; - } - else - { - if(is_end_poly(cmd)) - { - orientation = get_orientation(cmd); - if(line_to && is_closed(cmd)) - { - add_vertex(start_x, start_y); - } - } - } - } - if(line_to) - { - end_contour(orientation); - } - make_polygon(p); - } - - - private: - //-------------------------------------------------------------------- - source_a_type* m_src_a; - source_b_type* m_src_b; - status m_status; - int m_vertex; - int m_contour; - gpc_op_e m_operation; - vertex_array_type m_vertex_accumulator; - contour_header_array_type m_contour_accumulator; - gpc_polygon m_poly_a; - gpc_polygon m_poly_b; - gpc_polygon m_result; - }; - - - - - - //------------------------------------------------------------------------ - template - void conv_gpc::free_polygon(gpc_polygon& p) - { - int i; - for(i = 0; i < p.num_contours; i++) - { - pod_allocator::deallocate(p.contour[i].vertex, - p.contour[i].num_vertices); - } - pod_allocator::deallocate(p.contour, p.num_contours); - memset(&p, 0, sizeof(gpc_polygon)); - } - - - //------------------------------------------------------------------------ - template - void conv_gpc::free_result() - { - if(m_result.contour) - { - gpc_free_polygon(&m_result); - } - memset(&m_result, 0, sizeof(m_result)); - } - - - //------------------------------------------------------------------------ - template - void conv_gpc::free_gpc_data() - { - free_polygon(m_poly_a); - free_polygon(m_poly_b); - free_result(); - } - - - //------------------------------------------------------------------------ - template - void conv_gpc::start_contour() - { - contour_header_type h; - memset(&h, 0, sizeof(h)); - m_contour_accumulator.add(h); - m_vertex_accumulator.remove_all(); - } - - - //------------------------------------------------------------------------ - template - inline void conv_gpc::add_vertex(double x, double y) - { - gpc_vertex v; - v.x = x; - v.y = y; - m_vertex_accumulator.add(v); - } - - - //------------------------------------------------------------------------ - template - void conv_gpc::end_contour(unsigned orientation) - { - if(m_contour_accumulator.size()) - { - if(m_vertex_accumulator.size() > 2) - { - contour_header_type& h = - m_contour_accumulator[m_contour_accumulator.size() - 1]; - - h.num_vertices = m_vertex_accumulator.size(); - h.hole_flag = 0; - - // TO DO: Clarify the "holes" - //if(is_cw(orientation)) h.hole_flag = 1; - - h.vertices = pod_allocator::allocate(h.num_vertices); - gpc_vertex* d = h.vertices; - int i; - for(i = 0; i < h.num_vertices; i++) - { - const gpc_vertex& s = m_vertex_accumulator[i]; - d->x = s.x; - d->y = s.y; - ++d; - } - } - else - { - m_vertex_accumulator.remove_last(); - } - } - } - - - //------------------------------------------------------------------------ - template - void conv_gpc::make_polygon(gpc_polygon& p) - { - free_polygon(p); - if(m_contour_accumulator.size()) - { - p.num_contours = m_contour_accumulator.size(); - - p.hole = 0; - p.contour = pod_allocator::allocate(p.num_contours); - - int i; - gpc_vertex_list* pv = p.contour; - for(i = 0; i < p.num_contours; i++) - { - const contour_header_type& h = m_contour_accumulator[i]; - pv->num_vertices = h.num_vertices; - pv->vertex = h.vertices; - ++pv; - } - } - } - - - //------------------------------------------------------------------------ - template - void conv_gpc::start_extracting() - { - m_status = status_move_to; - m_contour = -1; - m_vertex = -1; - } - - - //------------------------------------------------------------------------ - template - bool conv_gpc::next_contour() - { - if(++m_contour < m_result.num_contours) - { - m_vertex = -1; - return true; - } - return false; - } - - - //------------------------------------------------------------------------ - template - inline bool conv_gpc::next_vertex(double* x, double* y) - { - const gpc_vertex_list& vlist = m_result.contour[m_contour]; - if(++m_vertex < vlist.num_vertices) - { - const gpc_vertex& v = vlist.vertex[m_vertex]; - *x = v.x; - *y = v.y; - return true; - } - return false; - } - - - //------------------------------------------------------------------------ - template - void conv_gpc::rewind(unsigned path_id) - { - free_result(); - m_src_a->rewind(path_id); - m_src_b->rewind(path_id); - add(*m_src_a, m_poly_a); - add(*m_src_b, m_poly_b); - switch(m_operation) - { - case gpc_or: - gpc_polygon_clip(GPC_UNION, - &m_poly_a, - &m_poly_b, - &m_result); - break; - - case gpc_and: - gpc_polygon_clip(GPC_INT, - &m_poly_a, - &m_poly_b, - &m_result); - break; - - case gpc_xor: - gpc_polygon_clip(GPC_XOR, - &m_poly_a, - &m_poly_b, - &m_result); - break; - - case gpc_a_minus_b: - gpc_polygon_clip(GPC_DIFF, - &m_poly_a, - &m_poly_b, - &m_result); - break; - - case gpc_b_minus_a: - gpc_polygon_clip(GPC_DIFF, - &m_poly_b, - &m_poly_a, - &m_result); - break; - } - start_extracting(); - } - - - //------------------------------------------------------------------------ - template - unsigned conv_gpc::vertex(double* x, double* y) - { - if(m_status == status_move_to) - { - if(next_contour()) - { - if(next_vertex(x, y)) - { - m_status = status_line_to; - return path_cmd_move_to; - } - m_status = status_stop; - return path_cmd_end_poly | path_flags_close; - } - } - else - { - if(next_vertex(x, y)) - { - return path_cmd_line_to; - } - else - { - m_status = status_move_to; - } - return path_cmd_end_poly | path_flags_close; - } - return path_cmd_stop; - } - - -} - - -#endif diff --git a/uppdev/agg24/agg_conv_marker.h b/uppdev/agg24/agg_conv_marker.h deleted file mode 100644 index 2cd3cb403..000000000 --- a/uppdev/agg24/agg_conv_marker.h +++ /dev/null @@ -1,148 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// conv_marker -// -//---------------------------------------------------------------------------- -#ifndef AGG_CONV_MARKER_INCLUDED -#define AGG_CONV_MARKER_INCLUDED - -#include "agg_basics.h" -#include "agg_trans_affine.h" - -namespace agg -{ - //-------------------------------------------------------------conv_marker - template - class conv_marker - { - public: - conv_marker(MarkerLocator& ml, MarkerShapes& ms); - - trans_affine& transform() { return m_transform; } - const trans_affine& transform() const { return m_transform; } - - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - conv_marker(const conv_marker&); - const conv_marker& - operator = (const conv_marker&); - - enum status_e - { - initial, - markers, - polygon, - stop - }; - - MarkerLocator* m_marker_locator; - MarkerShapes* m_marker_shapes; - trans_affine m_transform; - trans_affine m_mtx; - status_e m_status; - unsigned m_marker; - unsigned m_num_markers; - }; - - - //------------------------------------------------------------------------ - template - conv_marker::conv_marker(MarkerLocator& ml, MarkerShapes& ms) : - m_marker_locator(&ml), - m_marker_shapes(&ms), - m_status(initial), - m_marker(0), - m_num_markers(1) - { - } - - - //------------------------------------------------------------------------ - template - void conv_marker::rewind(unsigned) - { - m_status = initial; - m_marker = 0; - m_num_markers = 1; - } - - - //------------------------------------------------------------------------ - template - unsigned conv_marker::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_move_to; - double x1, y1, x2, y2; - - while(!is_stop(cmd)) - { - switch(m_status) - { - case initial: - if(m_num_markers == 0) - { - cmd = path_cmd_stop; - break; - } - m_marker_locator->rewind(m_marker); - ++m_marker; - m_num_markers = 0; - m_status = markers; - - case markers: - if(is_stop(m_marker_locator->vertex(&x1, &y1))) - { - m_status = initial; - break; - } - if(is_stop(m_marker_locator->vertex(&x2, &y2))) - { - m_status = initial; - break; - } - ++m_num_markers; - m_mtx = m_transform; - m_mtx *= trans_affine_rotation(atan2(y2 - y1, x2 - x1)); - m_mtx *= trans_affine_translation(x1, y1); - m_marker_shapes->rewind(m_marker - 1); - m_status = polygon; - - case polygon: - cmd = m_marker_shapes->vertex(x, y); - if(is_stop(cmd)) - { - cmd = path_cmd_move_to; - m_status = markers; - break; - } - m_mtx.transform(x, y); - return cmd; - - case stop: - cmd = path_cmd_stop; - break; - } - } - return cmd; - } - -} - - -#endif - diff --git a/uppdev/agg24/agg_conv_marker_adaptor.h b/uppdev/agg24/agg_conv_marker_adaptor.h deleted file mode 100644 index 4486d6ace..000000000 --- a/uppdev/agg24/agg_conv_marker_adaptor.h +++ /dev/null @@ -1,51 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_CONV_MARKER_ADAPTOR_INCLUDED -#define AGG_CONV_MARKER_ADAPTOR_INCLUDED - -#include "agg_basics.h" -#include "agg_conv_adaptor_vcgen.h" -#include "agg_vcgen_vertex_sequence.h" - -namespace agg -{ - - //=====================================================conv_marker_adaptor - template - struct conv_marker_adaptor : - public conv_adaptor_vcgen - { - typedef Markers marker_type; - typedef conv_adaptor_vcgen base_type; - - conv_marker_adaptor(VertexSource& vs) : - conv_adaptor_vcgen(vs) - { - } - - void shorten(double s) { base_type::generator().shorten(s); } - double shorten() const { return base_type::generator().shorten(); } - - private: - conv_marker_adaptor(const conv_marker_adaptor&); - const conv_marker_adaptor& - operator = (const conv_marker_adaptor&); - }; - - -} - -#endif diff --git a/uppdev/agg24/agg_conv_segmentator.h b/uppdev/agg24/agg_conv_segmentator.h deleted file mode 100644 index e69a9e7d7..000000000 --- a/uppdev/agg24/agg_conv_segmentator.h +++ /dev/null @@ -1,48 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_CONV_SEGMENTATOR_INCLUDED -#define AGG_CONV_SEGMENTATOR_INCLUDED - -#include "agg_basics.h" -#include "agg_conv_adaptor_vpgen.h" -#include "agg_vpgen_segmentator.h" - -namespace agg -{ - - //========================================================conv_segmentator - template - struct conv_segmentator : public conv_adaptor_vpgen - { - typedef conv_adaptor_vpgen base_type; - - conv_segmentator(VertexSource& vs) : - conv_adaptor_vpgen(vs) {} - - void approximation_scale(double s) { base_type::vpgen().approximation_scale(s); } - double approximation_scale() const { return base_type::vpgen().approximation_scale(); } - - private: - conv_segmentator(const conv_segmentator&); - const conv_segmentator& - operator = (const conv_segmentator&); - }; - - -} - -#endif - diff --git a/uppdev/agg24/agg_conv_shorten_path.h b/uppdev/agg24/agg_conv_shorten_path.h deleted file mode 100644 index 5617e51d1..000000000 --- a/uppdev/agg24/agg_conv_shorten_path.h +++ /dev/null @@ -1,50 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_CONV_SHORTEN_PATH_INCLUDED -#define AGG_CONV_SHORTEN_PATH_INCLUDED - -#include "agg_basics.h" -#include "agg_conv_adaptor_vcgen.h" -#include "agg_vcgen_vertex_sequence.h" - -namespace agg -{ - - //=======================================================conv_shorten_path - template class conv_shorten_path : - public conv_adaptor_vcgen - { - public: - typedef conv_adaptor_vcgen base_type; - - conv_shorten_path(VertexSource& vs) : - conv_adaptor_vcgen(vs) - { - } - - void shorten(double s) { base_type::generator().shorten(s); } - double shorten() const { return base_type::generator().shorten(); } - - private: - conv_shorten_path(const conv_shorten_path&); - const conv_shorten_path& - operator = (const conv_shorten_path&); - }; - - -} - -#endif diff --git a/uppdev/agg24/agg_conv_smooth_poly1.h b/uppdev/agg24/agg_conv_smooth_poly1.h deleted file mode 100644 index 4ac4e3d6e..000000000 --- a/uppdev/agg24/agg_conv_smooth_poly1.h +++ /dev/null @@ -1,80 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Smooth polygon generator -// -//---------------------------------------------------------------------------- -#ifndef AGG_CONV_SMOOTH_POLY1_INCLUDED -#define AGG_CONV_SMOOTH_POLY1_INCLUDED - -#include "agg_basics.h" -#include "agg_vcgen_smooth_poly1.h" -#include "agg_conv_adaptor_vcgen.h" -#include "agg_conv_curve.h" - - -namespace agg -{ - - //-------------------------------------------------------conv_smooth_poly1 - template - struct conv_smooth_poly1 : - public conv_adaptor_vcgen - { - typedef conv_adaptor_vcgen base_type; - - conv_smooth_poly1(VertexSource& vs) : - conv_adaptor_vcgen(vs) - { - } - - void smooth_value(double v) { base_type::generator().smooth_value(v); } - double smooth_value() const { return base_type::generator().smooth_value(); } - - private: - conv_smooth_poly1(const conv_smooth_poly1&); - const conv_smooth_poly1& - operator = (const conv_smooth_poly1&); - }; - - - - //-------------------------------------------------conv_smooth_poly1_curve - template - struct conv_smooth_poly1_curve : - public conv_curve > - { - conv_smooth_poly1_curve(VertexSource& vs) : - conv_curve >(m_smooth), - m_smooth(vs) - { - } - - void smooth_value(double v) { m_smooth.generator().smooth_value(v); } - double smooth_value() const { return m_smooth.generator().smooth_value(); } - - private: - conv_smooth_poly1_curve(const conv_smooth_poly1_curve&); - const conv_smooth_poly1_curve& - operator = (const conv_smooth_poly1_curve&); - - conv_smooth_poly1 m_smooth; - }; - -} - - -#endif - diff --git a/uppdev/agg24/agg_conv_stroke.h b/uppdev/agg24/agg_conv_stroke.h deleted file mode 100644 index e19a6b61f..000000000 --- a/uppdev/agg24/agg_conv_stroke.h +++ /dev/null @@ -1,73 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// conv_stroke -// -//---------------------------------------------------------------------------- -#ifndef AGG_CONV_STROKE_INCLUDED -#define AGG_CONV_STROKE_INCLUDED - -#include "agg_basics.h" -#include "agg_vcgen_stroke.h" -#include "agg_conv_adaptor_vcgen.h" - -namespace agg -{ - - //-------------------------------------------------------------conv_stroke - template - struct conv_stroke : - public conv_adaptor_vcgen - { - typedef Markers marker_type; - typedef conv_adaptor_vcgen base_type; - - conv_stroke(VertexSource& vs) : - conv_adaptor_vcgen(vs) - { - } - - void line_cap(line_cap_e lc) { base_type::generator().line_cap(lc); } - void line_join(line_join_e lj) { base_type::generator().line_join(lj); } - void inner_join(inner_join_e ij) { base_type::generator().inner_join(ij); } - - line_cap_e line_cap() const { return base_type::generator().line_cap(); } - line_join_e line_join() const { return base_type::generator().line_join(); } - inner_join_e inner_join() const { return base_type::generator().inner_join(); } - - void width(double w) { base_type::generator().width(w); } - void miter_limit(double ml) { base_type::generator().miter_limit(ml); } - void miter_limit_theta(double t) { base_type::generator().miter_limit_theta(t); } - void inner_miter_limit(double ml) { base_type::generator().inner_miter_limit(ml); } - void approximation_scale(double as) { base_type::generator().approximation_scale(as); } - - double width() const { return base_type::generator().width(); } - double miter_limit() const { return base_type::generator().miter_limit(); } - double inner_miter_limit() const { return base_type::generator().inner_miter_limit(); } - double approximation_scale() const { return base_type::generator().approximation_scale(); } - - void shorten(double s) { base_type::generator().shorten(s); } - double shorten() const { return base_type::generator().shorten(); } - - private: - conv_stroke(const conv_stroke&); - const conv_stroke& - operator = (const conv_stroke&); - - }; - -} - -#endif diff --git a/uppdev/agg24/agg_conv_transform.h b/uppdev/agg24/agg_conv_transform.h deleted file mode 100644 index 171087748..000000000 --- a/uppdev/agg24/agg_conv_transform.h +++ /dev/null @@ -1,68 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// class conv_transform -// -//---------------------------------------------------------------------------- -#ifndef AGG_CONV_TRANSFORM_INCLUDED -#define AGG_CONV_TRANSFORM_INCLUDED - -#include "agg_basics.h" -#include "agg_trans_affine.h" - -namespace agg -{ - - //----------------------------------------------------------conv_transform - template class conv_transform - { - public: - conv_transform(VertexSource& source, const Transformer& tr) : - m_source(&source), m_trans(&tr) {} - void attach(VertexSource& source) { m_source = &source; } - - void rewind(unsigned path_id) - { - m_source->rewind(path_id); - } - - unsigned vertex(double* x, double* y) - { - unsigned cmd = m_source->vertex(x, y); - if(is_vertex(cmd)) - { - m_trans->transform(x, y); - } - return cmd; - } - - void transformer(const Transformer& tr) - { - m_trans = &tr; - } - - private: - conv_transform(const conv_transform&); - const conv_transform& - operator = (const conv_transform&); - - VertexSource* m_source; - const Transformer* m_trans; - }; - - -} - -#endif diff --git a/uppdev/agg24/agg_conv_unclose_polygon.h b/uppdev/agg24/agg_conv_unclose_polygon.h deleted file mode 100644 index fe5c26381..000000000 --- a/uppdev/agg24/agg_conv_unclose_polygon.h +++ /dev/null @@ -1,52 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_CONV_UNCLOSE_POLYGON_INCLUDED -#define AGG_CONV_UNCLOSE_POLYGON_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - //====================================================conv_unclose_polygon - template class conv_unclose_polygon - { - public: - explicit conv_unclose_polygon(VertexSource& vs) : m_source(&vs) {} - void attach(VertexSource& source) { m_source = &source; } - - void rewind(unsigned path_id) - { - m_source->rewind(path_id); - } - - unsigned vertex(double* x, double* y) - { - unsigned cmd = m_source->vertex(x, y); - if(is_end_poly(cmd)) cmd &= ~path_flags_close; - return cmd; - } - - private: - conv_unclose_polygon(const conv_unclose_polygon&); - const conv_unclose_polygon& - operator = (const conv_unclose_polygon&); - - VertexSource* m_source; - }; - -} - -#endif diff --git a/uppdev/agg24/agg_ctrl.h b/uppdev/agg24/agg_ctrl.h deleted file mode 100644 index 7e811c63e..000000000 --- a/uppdev/agg24/agg_ctrl.h +++ /dev/null @@ -1,118 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Function render_ctrl -// -//---------------------------------------------------------------------------- - -#ifndef AGG_CTRL_INCLUDED -#define AGG_CTRL_INCLUDED - -#include "agg_trans_affine.h" -#include "agg_renderer_scanline.h" - -namespace agg -{ - - //--------------------------------------------------------------------ctrl - class ctrl - { - public: - //-------------------------------------------------------------------- - virtual ~ctrl() {} - ctrl(double x1, double y1, double x2, double y2, bool flip_y) : - m_x1(x1), m_y1(y1), m_x2(x2), m_y2(y2), - m_flip_y(flip_y), - m_mtx(0) - { - } - - //-------------------------------------------------------------------- - virtual bool in_rect(double x, double y) const = 0; - virtual bool on_mouse_button_down(double x, double y) = 0; - virtual bool on_mouse_button_up(double x, double y) = 0; - virtual bool on_mouse_move(double x, double y, bool button_flag) = 0; - virtual bool on_arrow_keys(bool left, bool right, bool down, bool up) = 0; - - //-------------------------------------------------------------------- - void transform(const trans_affine& mtx) { m_mtx = &mtx; } - void no_transform() { m_mtx = 0; } - - //-------------------------------------------------------------------- - void transform_xy(double* x, double* y) const - { - if(m_flip_y) *y = m_y1 + m_y2 - *y; - if(m_mtx) m_mtx->transform(x, y); - } - - //-------------------------------------------------------------------- - void inverse_transform_xy(double* x, double* y) const - { - if(m_mtx) m_mtx->inverse_transform(x, y); - if(m_flip_y) *y = m_y1 + m_y2 - *y; - } - - //-------------------------------------------------------------------- - double scale() const { return m_mtx ? m_mtx->scale() : 1.0; } - - private: - ctrl(const ctrl&); - const ctrl& operator = (const ctrl&); - - protected: - double m_x1; - double m_y1; - double m_x2; - double m_y2; - - private: - bool m_flip_y; - const trans_affine* m_mtx; - }; - - - //-------------------------------------------------------------------- - template - void render_ctrl(Rasterizer& ras, Scanline& sl, Renderer& r, Ctrl& c) - { - unsigned i; - for(i = 0; i < c.num_paths(); i++) - { - ras.reset(); - ras.add_path(c, i); - render_scanlines_aa_solid(ras, sl, r, c.color(i)); - } - } - - - //-------------------------------------------------------------------- - template - void render_ctrl_rs(Rasterizer& ras, Scanline& sl, Renderer& r, Ctrl& c) - { - unsigned i; - for(i = 0; i < c.num_paths(); i++) - { - ras.reset(); - ras.add_path(c, i); - r.color(c.color(i)); - render_scanlines(ras, sl, r); - } - } - - -} - - -#endif diff --git a/uppdev/agg24/agg_curves.cpp b/uppdev/agg24/agg_curves.cpp deleted file mode 100644 index cb7a8d7ae..000000000 --- a/uppdev/agg24/agg_curves.cpp +++ /dev/null @@ -1,611 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#include -#include "agg_curves.h" -#include "agg_math.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - const double curve_distance_epsilon = 1e-30; - const double curve_collinearity_epsilon = 1e-30; - const double curve_angle_tolerance_epsilon = 0.01; - enum curve_recursion_limit_e { curve_recursion_limit = 32 }; - - - - //------------------------------------------------------------------------ - void curve3_inc::approximation_scale(double s) - { - m_scale = s; - } - - //------------------------------------------------------------------------ - double curve3_inc::approximation_scale() const - { - return m_scale; - } - - //------------------------------------------------------------------------ - void curve3_inc::init(double x1, double y1, - double x2, double y2, - double x3, double y3) - { - m_start_x = x1; - m_start_y = y1; - m_end_x = x3; - m_end_y = y3; - - double dx1 = x2 - x1; - double dy1 = y2 - y1; - double dx2 = x3 - x2; - double dy2 = y3 - y2; - - double len = sqrt(dx1 * dx1 + dy1 * dy1) + sqrt(dx2 * dx2 + dy2 * dy2); - - m_num_steps = uround(len * 0.25 * m_scale); - - if(m_num_steps < 4) - { - m_num_steps = 4; - } - - double subdivide_step = 1.0 / m_num_steps; - double subdivide_step2 = subdivide_step * subdivide_step; - - double tmpx = (x1 - x2 * 2.0 + x3) * subdivide_step2; - double tmpy = (y1 - y2 * 2.0 + y3) * subdivide_step2; - - m_saved_fx = m_fx = x1; - m_saved_fy = m_fy = y1; - - m_saved_dfx = m_dfx = tmpx + (x2 - x1) * (2.0 * subdivide_step); - m_saved_dfy = m_dfy = tmpy + (y2 - y1) * (2.0 * subdivide_step); - - m_ddfx = tmpx * 2.0; - m_ddfy = tmpy * 2.0; - - m_step = m_num_steps; - } - - //------------------------------------------------------------------------ - void curve3_inc::rewind(unsigned) - { - if(m_num_steps == 0) - { - m_step = -1; - return; - } - m_step = m_num_steps; - m_fx = m_saved_fx; - m_fy = m_saved_fy; - m_dfx = m_saved_dfx; - m_dfy = m_saved_dfy; - } - - //------------------------------------------------------------------------ - unsigned curve3_inc::vertex(double* x, double* y) - { - if(m_step < 0) return path_cmd_stop; - if(m_step == m_num_steps) - { - *x = m_start_x; - *y = m_start_y; - --m_step; - return path_cmd_move_to; - } - if(m_step == 0) - { - *x = m_end_x; - *y = m_end_y; - --m_step; - return path_cmd_line_to; - } - m_fx += m_dfx; - m_fy += m_dfy; - m_dfx += m_ddfx; - m_dfy += m_ddfy; - *x = m_fx; - *y = m_fy; - --m_step; - return path_cmd_line_to; - } - - //------------------------------------------------------------------------ - void curve3_div::init(double x1, double y1, - double x2, double y2, - double x3, double y3) - { - m_points.remove_all(); - m_distance_tolerance_square = 0.5 / m_approximation_scale; - m_distance_tolerance_square *= m_distance_tolerance_square; - bezier(x1, y1, x2, y2, x3, y3); - m_count = 0; - } - - //------------------------------------------------------------------------ - void curve3_div::recursive_bezier(double x1, double y1, - double x2, double y2, - double x3, double y3, - unsigned level) - { - if(level > curve_recursion_limit) - { - return; - } - - // Calculate all the mid-points of the line segments - //---------------------- - double x12 = (x1 + x2) / 2; - double y12 = (y1 + y2) / 2; - double x23 = (x2 + x3) / 2; - double y23 = (y2 + y3) / 2; - double x123 = (x12 + x23) / 2; - double y123 = (y12 + y23) / 2; - - double dx = x3-x1; - double dy = y3-y1; - double d = fabs(((x2 - x3) * dy - (y2 - y3) * dx)); - double da; - - if(d > curve_collinearity_epsilon) - { - // Regular case - //----------------- - if(d * d <= m_distance_tolerance_square * (dx*dx + dy*dy)) - { - // If the curvature doesn't exceed the distance_tolerance value - // we tend to finish subdivisions. - //---------------------- - if(m_angle_tolerance < curve_angle_tolerance_epsilon) - { - m_points.add(point_d(x123, y123)); - return; - } - - // Angle & Cusp Condition - //---------------------- - da = fabs(atan2(y3 - y2, x3 - x2) - atan2(y2 - y1, x2 - x1)); - if(da >= pi) da = 2*pi - da; - - if(da < m_angle_tolerance) - { - // Finally we can stop the recursion - //---------------------- - m_points.add(point_d(x123, y123)); - return; - } - } - } - else - { - // Collinear case - //------------------ - da = dx*dx + dy*dy; - if(da == 0) - { - d = calc_sq_distance(x1, y1, x2, y2); - } - else - { - d = ((x2 - x1)*dx + (y2 - y1)*dy) / da; - if(d > 0 && d < 1) - { - // Simple collinear case, 1---2---3 - // We can leave just two endpoints - return; - } - if(d <= 0) d = calc_sq_distance(x2, y2, x1, y1); - else if(d >= 1) d = calc_sq_distance(x2, y2, x3, y3); - else d = calc_sq_distance(x2, y2, x1 + d*dx, y1 + d*dy); - } - if(d < m_distance_tolerance_square) - { - m_points.add(point_d(x2, y2)); - return; - } - } - - // Continue subdivision - //---------------------- - recursive_bezier(x1, y1, x12, y12, x123, y123, level + 1); - recursive_bezier(x123, y123, x23, y23, x3, y3, level + 1); - } - - //------------------------------------------------------------------------ - void curve3_div::bezier(double x1, double y1, - double x2, double y2, - double x3, double y3) - { - m_points.add(point_d(x1, y1)); - recursive_bezier(x1, y1, x2, y2, x3, y3, 0); - m_points.add(point_d(x3, y3)); - } - - - - - - //------------------------------------------------------------------------ - void curve4_inc::approximation_scale(double s) - { - m_scale = s; - } - - //------------------------------------------------------------------------ - double curve4_inc::approximation_scale() const - { - return m_scale; - } - - //------------------------------------------------------------------------ - static double MSC60_fix_ICE(double v) { return v; } - - //------------------------------------------------------------------------ - void curve4_inc::init(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4) - { - m_start_x = x1; - m_start_y = y1; - m_end_x = x4; - m_end_y = y4; - - double dx1 = x2 - x1; - double dy1 = y2 - y1; - double dx2 = x3 - x2; - double dy2 = y3 - y2; - double dx3 = x4 - x3; - double dy3 = y4 - y3; - - double len = (sqrt(dx1 * dx1 + dy1 * dy1) + - sqrt(dx2 * dx2 + dy2 * dy2) + - sqrt(dx3 * dx3 + dy3 * dy3)) * 0.25 * m_scale; - -#if defined(_MSC_VER) && _MSC_VER <= 1200 - m_num_steps = uround(MSC60_fix_ICE(len)); -#else - m_num_steps = uround(len); -#endif - - if(m_num_steps < 4) - { - m_num_steps = 4; - } - - double subdivide_step = 1.0 / m_num_steps; - double subdivide_step2 = subdivide_step * subdivide_step; - double subdivide_step3 = subdivide_step * subdivide_step * subdivide_step; - - double pre1 = 3.0 * subdivide_step; - double pre2 = 3.0 * subdivide_step2; - double pre4 = 6.0 * subdivide_step2; - double pre5 = 6.0 * subdivide_step3; - - double tmp1x = x1 - x2 * 2.0 + x3; - double tmp1y = y1 - y2 * 2.0 + y3; - - double tmp2x = (x2 - x3) * 3.0 - x1 + x4; - double tmp2y = (y2 - y3) * 3.0 - y1 + y4; - - m_saved_fx = m_fx = x1; - m_saved_fy = m_fy = y1; - - m_saved_dfx = m_dfx = (x2 - x1) * pre1 + tmp1x * pre2 + tmp2x * subdivide_step3; - m_saved_dfy = m_dfy = (y2 - y1) * pre1 + tmp1y * pre2 + tmp2y * subdivide_step3; - - m_saved_ddfx = m_ddfx = tmp1x * pre4 + tmp2x * pre5; - m_saved_ddfy = m_ddfy = tmp1y * pre4 + tmp2y * pre5; - - m_dddfx = tmp2x * pre5; - m_dddfy = tmp2y * pre5; - - m_step = m_num_steps; - } - - //------------------------------------------------------------------------ - void curve4_inc::rewind(unsigned) - { - if(m_num_steps == 0) - { - m_step = -1; - return; - } - m_step = m_num_steps; - m_fx = m_saved_fx; - m_fy = m_saved_fy; - m_dfx = m_saved_dfx; - m_dfy = m_saved_dfy; - m_ddfx = m_saved_ddfx; - m_ddfy = m_saved_ddfy; - } - - //------------------------------------------------------------------------ - unsigned curve4_inc::vertex(double* x, double* y) - { - if(m_step < 0) return path_cmd_stop; - if(m_step == m_num_steps) - { - *x = m_start_x; - *y = m_start_y; - --m_step; - return path_cmd_move_to; - } - - if(m_step == 0) - { - *x = m_end_x; - *y = m_end_y; - --m_step; - return path_cmd_line_to; - } - - m_fx += m_dfx; - m_fy += m_dfy; - m_dfx += m_ddfx; - m_dfy += m_ddfy; - m_ddfx += m_dddfx; - m_ddfy += m_dddfy; - - *x = m_fx; - *y = m_fy; - --m_step; - return path_cmd_line_to; - } - - - - - //------------------------------------------------------------------------ - void curve4_div::init(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4) - { - m_points.remove_all(); - m_distance_tolerance_square = 0.5 / m_approximation_scale; - m_distance_tolerance_square *= m_distance_tolerance_square; - bezier(x1, y1, x2, y2, x3, y3, x4, y4); - m_count = 0; - } - - //------------------------------------------------------------------------ - void curve4_div::recursive_bezier(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4, - unsigned level) - { - if(level > curve_recursion_limit) - { - return; - } - - // Calculate all the mid-points of the line segments - //---------------------- - double x12 = (x1 + x2) / 2; - double y12 = (y1 + y2) / 2; - double x23 = (x2 + x3) / 2; - double y23 = (y2 + y3) / 2; - double x34 = (x3 + x4) / 2; - double y34 = (y3 + y4) / 2; - double x123 = (x12 + x23) / 2; - double y123 = (y12 + y23) / 2; - double x234 = (x23 + x34) / 2; - double y234 = (y23 + y34) / 2; - double x1234 = (x123 + x234) / 2; - double y1234 = (y123 + y234) / 2; - - - // Try to approximate the full cubic curve by a single straight line - //------------------ - double dx = x4-x1; - double dy = y4-y1; - - double d2 = fabs(((x2 - x4) * dy - (y2 - y4) * dx)); - double d3 = fabs(((x3 - x4) * dy - (y3 - y4) * dx)); - double da1, da2, k; - - switch((int(d2 > curve_collinearity_epsilon) << 1) + - int(d3 > curve_collinearity_epsilon)) - { - case 0: - // All collinear OR p1==p4 - //---------------------- - k = dx*dx + dy*dy; - if(k == 0) - { - d2 = calc_sq_distance(x1, y1, x2, y2); - d3 = calc_sq_distance(x4, y4, x3, y3); - } - else - { - k = 1 / k; - da1 = x2 - x1; - da2 = y2 - y1; - d2 = k * (da1*dx + da2*dy); - da1 = x3 - x1; - da2 = y3 - y1; - d3 = k * (da1*dx + da2*dy); - if(d2 > 0 && d2 < 1 && d3 > 0 && d3 < 1) - { - // Simple collinear case, 1---2---3---4 - // We can leave just two endpoints - return; - } - if(d2 <= 0) d2 = calc_sq_distance(x2, y2, x1, y1); - else if(d2 >= 1) d2 = calc_sq_distance(x2, y2, x4, y4); - else d2 = calc_sq_distance(x2, y2, x1 + d2*dx, y1 + d2*dy); - - if(d3 <= 0) d3 = calc_sq_distance(x3, y3, x1, y1); - else if(d3 >= 1) d3 = calc_sq_distance(x3, y3, x4, y4); - else d3 = calc_sq_distance(x3, y3, x1 + d3*dx, y1 + d3*dy); - } - if(d2 > d3) - { - if(d2 < m_distance_tolerance_square) - { - m_points.add(point_d(x2, y2)); - return; - } - } - else - { - if(d3 < m_distance_tolerance_square) - { - m_points.add(point_d(x3, y3)); - return; - } - } - break; - - case 1: - // p1,p2,p4 are collinear, p3 is significant - //---------------------- - if(d3 * d3 <= m_distance_tolerance_square * (dx*dx + dy*dy)) - { - if(m_angle_tolerance < curve_angle_tolerance_epsilon) - { - m_points.add(point_d(x23, y23)); - return; - } - - // Angle Condition - //---------------------- - da1 = fabs(atan2(y4 - y3, x4 - x3) - atan2(y3 - y2, x3 - x2)); - if(da1 >= pi) da1 = 2*pi - da1; - - if(da1 < m_angle_tolerance) - { - m_points.add(point_d(x2, y2)); - m_points.add(point_d(x3, y3)); - return; - } - - if(m_cusp_limit != 0.0) - { - if(da1 > m_cusp_limit) - { - m_points.add(point_d(x3, y3)); - return; - } - } - } - break; - - case 2: - // p1,p3,p4 are collinear, p2 is significant - //---------------------- - if(d2 * d2 <= m_distance_tolerance_square * (dx*dx + dy*dy)) - { - if(m_angle_tolerance < curve_angle_tolerance_epsilon) - { - m_points.add(point_d(x23, y23)); - return; - } - - // Angle Condition - //---------------------- - da1 = fabs(atan2(y3 - y2, x3 - x2) - atan2(y2 - y1, x2 - x1)); - if(da1 >= pi) da1 = 2*pi - da1; - - if(da1 < m_angle_tolerance) - { - m_points.add(point_d(x2, y2)); - m_points.add(point_d(x3, y3)); - return; - } - - if(m_cusp_limit != 0.0) - { - if(da1 > m_cusp_limit) - { - m_points.add(point_d(x2, y2)); - return; - } - } - } - break; - - case 3: - // Regular case - //----------------- - if((d2 + d3)*(d2 + d3) <= m_distance_tolerance_square * (dx*dx + dy*dy)) - { - // If the curvature doesn't exceed the distance_tolerance value - // we tend to finish subdivisions. - //---------------------- - if(m_angle_tolerance < curve_angle_tolerance_epsilon) - { - m_points.add(point_d(x23, y23)); - return; - } - - // Angle & Cusp Condition - //---------------------- - k = atan2(y3 - y2, x3 - x2); - da1 = fabs(k - atan2(y2 - y1, x2 - x1)); - da2 = fabs(atan2(y4 - y3, x4 - x3) - k); - if(da1 >= pi) da1 = 2*pi - da1; - if(da2 >= pi) da2 = 2*pi - da2; - - if(da1 + da2 < m_angle_tolerance) - { - // Finally we can stop the recursion - //---------------------- - m_points.add(point_d(x23, y23)); - return; - } - - if(m_cusp_limit != 0.0) - { - if(da1 > m_cusp_limit) - { - m_points.add(point_d(x2, y2)); - return; - } - - if(da2 > m_cusp_limit) - { - m_points.add(point_d(x3, y3)); - return; - } - } - } - break; - } - - // Continue subdivision - //---------------------- - recursive_bezier(x1, y1, x12, y12, x123, y123, x1234, y1234, level + 1); - recursive_bezier(x1234, y1234, x234, y234, x34, y34, x4, y4, level + 1); - } - - //------------------------------------------------------------------------ - void curve4_div::bezier(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4) - { - m_points.add(point_d(x1, y1)); - recursive_bezier(x1, y1, x2, y2, x3, y3, x4, y4, 0); - m_points.add(point_d(x4, y4)); - } - -} - diff --git a/uppdev/agg24/agg_curves.h b/uppdev/agg24/agg_curves.h deleted file mode 100644 index 1ef02e878..000000000 --- a/uppdev/agg24/agg_curves.h +++ /dev/null @@ -1,693 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// Copyright (C) 2005 Tony Juricic (tonygeek@yahoo.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_CURVES_INCLUDED -#define AGG_CURVES_INCLUDED - -#include "agg_array.h" - -namespace agg -{ - - // See Implementation agg_curves.cpp - - //--------------------------------------------curve_approximation_method_e - enum curve_approximation_method_e - { - curve_inc, - curve_div - }; - - //--------------------------------------------------------------curve3_inc - class curve3_inc - { - public: - curve3_inc() : - m_num_steps(0), m_step(0), m_scale(1.0) { } - - curve3_inc(double x1, double y1, - double x2, double y2, - double x3, double y3) : - m_num_steps(0), m_step(0), m_scale(1.0) - { - init(x1, y1, x2, y2, x3, y3); - } - - void reset() { m_num_steps = 0; m_step = -1; } - void init(double x1, double y1, - double x2, double y2, - double x3, double y3); - - void approximation_method(curve_approximation_method_e) {} - curve_approximation_method_e approximation_method() const { return curve_inc; } - - void approximation_scale(double s); - double approximation_scale() const; - - void angle_tolerance(double) {} - double angle_tolerance() const { return 0.0; } - - void cusp_limit(double) {} - double cusp_limit() const { return 0.0; } - - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - int m_num_steps; - int m_step; - double m_scale; - double m_start_x; - double m_start_y; - double m_end_x; - double m_end_y; - double m_fx; - double m_fy; - double m_dfx; - double m_dfy; - double m_ddfx; - double m_ddfy; - double m_saved_fx; - double m_saved_fy; - double m_saved_dfx; - double m_saved_dfy; - }; - - - - - - //-------------------------------------------------------------curve3_div - class curve3_div - { - public: - curve3_div() : - m_approximation_scale(1.0), - m_angle_tolerance(0.0), - m_count(0) - {} - - curve3_div(double x1, double y1, - double x2, double y2, - double x3, double y3) : - m_approximation_scale(1.0), - m_angle_tolerance(0.0), - m_count(0) - { - init(x1, y1, x2, y2, x3, y3); - } - - void reset() { m_points.remove_all(); m_count = 0; } - void init(double x1, double y1, - double x2, double y2, - double x3, double y3); - - void approximation_method(curve_approximation_method_e) {} - curve_approximation_method_e approximation_method() const { return curve_div; } - - void approximation_scale(double s) { m_approximation_scale = s; } - double approximation_scale() const { return m_approximation_scale; } - - void angle_tolerance(double a) { m_angle_tolerance = a; } - double angle_tolerance() const { return m_angle_tolerance; } - - void cusp_limit(double) {} - double cusp_limit() const { return 0.0; } - - void rewind(unsigned) - { - m_count = 0; - } - - unsigned vertex(double* x, double* y) - { - if(m_count >= m_points.size()) return path_cmd_stop; - const point_d& p = m_points[m_count++]; - *x = p.x; - *y = p.y; - return (m_count == 1) ? path_cmd_move_to : path_cmd_line_to; - } - - private: - void bezier(double x1, double y1, - double x2, double y2, - double x3, double y3); - void recursive_bezier(double x1, double y1, - double x2, double y2, - double x3, double y3, - unsigned level); - - double m_approximation_scale; - double m_distance_tolerance_square; - double m_angle_tolerance; - unsigned m_count; - pod_bvector m_points; - }; - - - - - - - - //-------------------------------------------------------------curve4_points - struct curve4_points - { - double cp[8]; - curve4_points() {} - curve4_points(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4) - { - cp[0] = x1; cp[1] = y1; cp[2] = x2; cp[3] = y2; - cp[4] = x3; cp[5] = y3; cp[6] = x4; cp[7] = y4; - } - void init(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4) - { - cp[0] = x1; cp[1] = y1; cp[2] = x2; cp[3] = y2; - cp[4] = x3; cp[5] = y3; cp[6] = x4; cp[7] = y4; - } - double operator [] (unsigned i) const { return cp[i]; } - double& operator [] (unsigned i) { return cp[i]; } - }; - - - - //-------------------------------------------------------------curve4_inc - class curve4_inc - { - public: - curve4_inc() : - m_num_steps(0), m_step(0), m_scale(1.0) { } - - curve4_inc(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4) : - m_num_steps(0), m_step(0), m_scale(1.0) - { - init(x1, y1, x2, y2, x3, y3, x4, y4); - } - - curve4_inc(const curve4_points& cp) : - m_num_steps(0), m_step(0), m_scale(1.0) - { - init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); - } - - void reset() { m_num_steps = 0; m_step = -1; } - void init(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4); - - void init(const curve4_points& cp) - { - init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); - } - - void approximation_method(curve_approximation_method_e) {} - curve_approximation_method_e approximation_method() const { return curve_inc; } - - void approximation_scale(double s); - double approximation_scale() const; - - void angle_tolerance(double) {} - double angle_tolerance() const { return 0.0; } - - void cusp_limit(double) {} - double cusp_limit() const { return 0.0; } - - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - int m_num_steps; - int m_step; - double m_scale; - double m_start_x; - double m_start_y; - double m_end_x; - double m_end_y; - double m_fx; - double m_fy; - double m_dfx; - double m_dfy; - double m_ddfx; - double m_ddfy; - double m_dddfx; - double m_dddfy; - double m_saved_fx; - double m_saved_fy; - double m_saved_dfx; - double m_saved_dfy; - double m_saved_ddfx; - double m_saved_ddfy; - }; - - - - //-------------------------------------------------------catrom_to_bezier - inline curve4_points catrom_to_bezier(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4) - { - // Trans. matrix Catmull-Rom to Bezier - // - // 0 1 0 0 - // -1/6 1 1/6 0 - // 0 1/6 1 -1/6 - // 0 0 1 0 - // - return curve4_points( - x2, - y2, - (-x1 + 6*x2 + x3) / 6, - (-y1 + 6*y2 + y3) / 6, - ( x2 + 6*x3 - x4) / 6, - ( y2 + 6*y3 - y4) / 6, - x3, - y3); - } - - - //----------------------------------------------------------------------- - inline curve4_points - catrom_to_bezier(const curve4_points& cp) - { - return catrom_to_bezier(cp[0], cp[1], cp[2], cp[3], - cp[4], cp[5], cp[6], cp[7]); - } - - - - //-----------------------------------------------------ubspline_to_bezier - inline curve4_points ubspline_to_bezier(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4) - { - // Trans. matrix Uniform BSpline to Bezier - // - // 1/6 4/6 1/6 0 - // 0 4/6 2/6 0 - // 0 2/6 4/6 0 - // 0 1/6 4/6 1/6 - // - return curve4_points( - (x1 + 4*x2 + x3) / 6, - (y1 + 4*y2 + y3) / 6, - (4*x2 + 2*x3) / 6, - (4*y2 + 2*y3) / 6, - (2*x2 + 4*x3) / 6, - (2*y2 + 4*y3) / 6, - (x2 + 4*x3 + x4) / 6, - (y2 + 4*y3 + y4) / 6); - } - - - //----------------------------------------------------------------------- - inline curve4_points - ubspline_to_bezier(const curve4_points& cp) - { - return ubspline_to_bezier(cp[0], cp[1], cp[2], cp[3], - cp[4], cp[5], cp[6], cp[7]); - } - - - - - //------------------------------------------------------hermite_to_bezier - inline curve4_points hermite_to_bezier(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4) - { - // Trans. matrix Hermite to Bezier - // - // 1 0 0 0 - // 1 0 1/3 0 - // 0 1 0 -1/3 - // 0 1 0 0 - // - return curve4_points( - x1, - y1, - (3*x1 + x3) / 3, - (3*y1 + y3) / 3, - (3*x2 - x4) / 3, - (3*y2 - y4) / 3, - x2, - y2); - } - - - - //----------------------------------------------------------------------- - inline curve4_points - hermite_to_bezier(const curve4_points& cp) - { - return hermite_to_bezier(cp[0], cp[1], cp[2], cp[3], - cp[4], cp[5], cp[6], cp[7]); - } - - - //-------------------------------------------------------------curve4_div - class curve4_div - { - public: - curve4_div() : - m_approximation_scale(1.0), - m_angle_tolerance(0.0), - m_cusp_limit(0.0), - m_count(0) - {} - - curve4_div(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4) : - m_approximation_scale(1.0), - m_angle_tolerance(0.0), - m_cusp_limit(0.0), - m_count(0) - { - init(x1, y1, x2, y2, x3, y3, x4, y4); - } - - curve4_div(const curve4_points& cp) : - m_approximation_scale(1.0), - m_angle_tolerance(0.0), - m_count(0) - { - init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); - } - - void reset() { m_points.remove_all(); m_count = 0; } - void init(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4); - - void init(const curve4_points& cp) - { - init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); - } - - void approximation_method(curve_approximation_method_e) {} - - curve_approximation_method_e approximation_method() const - { - return curve_div; - } - - void approximation_scale(double s) { m_approximation_scale = s; } - double approximation_scale() const { return m_approximation_scale; } - - void angle_tolerance(double a) { m_angle_tolerance = a; } - double angle_tolerance() const { return m_angle_tolerance; } - - void cusp_limit(double v) - { - m_cusp_limit = (v == 0.0) ? 0.0 : pi - v; - } - - double cusp_limit() const - { - return (m_cusp_limit == 0.0) ? 0.0 : pi - m_cusp_limit; - } - - void rewind(unsigned) - { - m_count = 0; - } - - unsigned vertex(double* x, double* y) - { - if(m_count >= m_points.size()) return path_cmd_stop; - const point_d& p = m_points[m_count++]; - *x = p.x; - *y = p.y; - return (m_count == 1) ? path_cmd_move_to : path_cmd_line_to; - } - - private: - void bezier(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4); - - void recursive_bezier(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4, - unsigned level); - - double m_approximation_scale; - double m_distance_tolerance_square; - double m_angle_tolerance; - double m_cusp_limit; - unsigned m_count; - pod_bvector m_points; - }; - - - //-----------------------------------------------------------------curve3 - class curve3 - { - public: - curve3() : m_approximation_method(curve_div) {} - curve3(double x1, double y1, - double x2, double y2, - double x3, double y3) : - m_approximation_method(curve_div) - { - init(x1, y1, x2, y2, x3, y3); - } - - void reset() - { - m_curve_inc.reset(); - m_curve_div.reset(); - } - - void init(double x1, double y1, - double x2, double y2, - double x3, double y3) - { - if(m_approximation_method == curve_inc) - { - m_curve_inc.init(x1, y1, x2, y2, x3, y3); - } - else - { - m_curve_div.init(x1, y1, x2, y2, x3, y3); - } - } - - void approximation_method(curve_approximation_method_e v) - { - m_approximation_method = v; - } - - curve_approximation_method_e approximation_method() const - { - return m_approximation_method; - } - - void approximation_scale(double s) - { - m_curve_inc.approximation_scale(s); - m_curve_div.approximation_scale(s); - } - - double approximation_scale() const - { - return m_curve_inc.approximation_scale(); - } - - void angle_tolerance(double a) - { - m_curve_div.angle_tolerance(a); - } - - double angle_tolerance() const - { - return m_curve_div.angle_tolerance(); - } - - void cusp_limit(double v) - { - m_curve_div.cusp_limit(v); - } - - double cusp_limit() const - { - return m_curve_div.cusp_limit(); - } - - void rewind(unsigned path_id) - { - if(m_approximation_method == curve_inc) - { - m_curve_inc.rewind(path_id); - } - else - { - m_curve_div.rewind(path_id); - } - } - - unsigned vertex(double* x, double* y) - { - if(m_approximation_method == curve_inc) - { - return m_curve_inc.vertex(x, y); - } - return m_curve_div.vertex(x, y); - } - - private: - curve3_inc m_curve_inc; - curve3_div m_curve_div; - curve_approximation_method_e m_approximation_method; - }; - - - - - - //-----------------------------------------------------------------curve4 - class curve4 - { - public: - curve4() : m_approximation_method(curve_div) {} - curve4(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4) : - m_approximation_method(curve_div) - { - init(x1, y1, x2, y2, x3, y3, x4, y4); - } - - curve4(const curve4_points& cp) : - m_approximation_method(curve_div) - { - init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); - } - - void reset() - { - m_curve_inc.reset(); - m_curve_div.reset(); - } - - void init(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4) - { - if(m_approximation_method == curve_inc) - { - m_curve_inc.init(x1, y1, x2, y2, x3, y3, x4, y4); - } - else - { - m_curve_div.init(x1, y1, x2, y2, x3, y3, x4, y4); - } - } - - void init(const curve4_points& cp) - { - init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); - } - - void approximation_method(curve_approximation_method_e v) - { - m_approximation_method = v; - } - - curve_approximation_method_e approximation_method() const - { - return m_approximation_method; - } - - void approximation_scale(double s) - { - m_curve_inc.approximation_scale(s); - m_curve_div.approximation_scale(s); - } - double approximation_scale() const { return m_curve_inc.approximation_scale(); } - - void angle_tolerance(double v) - { - m_curve_div.angle_tolerance(v); - } - - double angle_tolerance() const - { - return m_curve_div.angle_tolerance(); - } - - void cusp_limit(double v) - { - m_curve_div.cusp_limit(v); - } - - double cusp_limit() const - { - return m_curve_div.cusp_limit(); - } - - void rewind(unsigned path_id) - { - if(m_approximation_method == curve_inc) - { - m_curve_inc.rewind(path_id); - } - else - { - m_curve_div.rewind(path_id); - } - } - - unsigned vertex(double* x, double* y) - { - if(m_approximation_method == curve_inc) - { - return m_curve_inc.vertex(x, y); - } - return m_curve_div.vertex(x, y); - } - - private: - curve4_inc m_curve_inc; - curve4_div m_curve_div; - curve_approximation_method_e m_approximation_method; - }; - - - - -} - -#endif diff --git a/uppdev/agg24/agg_dda_line.h b/uppdev/agg24/agg_dda_line.h deleted file mode 100644 index f589e76b8..000000000 --- a/uppdev/agg24/agg_dda_line.h +++ /dev/null @@ -1,290 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// classes dda_line_interpolator, dda2_line_interpolator -// -//---------------------------------------------------------------------------- - -#ifndef AGG_DDA_LINE_INCLUDED -#define AGG_DDA_LINE_INCLUDED - -#include -#include "agg_basics.h" - -namespace agg -{ - - //===================================================dda_line_interpolator - template class dda_line_interpolator - { - public: - //-------------------------------------------------------------------- - dda_line_interpolator() {} - - //-------------------------------------------------------------------- - dda_line_interpolator(int y1, int y2, unsigned count) : - m_y(y1), - m_inc(((y2 - y1) << FractionShift) / int(count)), - m_dy(0) - { - } - - //-------------------------------------------------------------------- - void operator ++ () - { - m_dy += m_inc; - } - - //-------------------------------------------------------------------- - void operator -- () - { - m_dy -= m_inc; - } - - //-------------------------------------------------------------------- - void operator += (unsigned n) - { - m_dy += m_inc * n; - } - - //-------------------------------------------------------------------- - void operator -= (unsigned n) - { - m_dy -= m_inc * n; - } - - - //-------------------------------------------------------------------- - int y() const { return m_y + (m_dy >> (FractionShift-YShift)); } - int dy() const { return m_dy; } - - - private: - int m_y; - int m_inc; - int m_dy; - }; - - - - - - //=================================================dda2_line_interpolator - class dda2_line_interpolator - { - public: - typedef int save_data_type; - enum save_size_e { save_size = 2 }; - - //-------------------------------------------------------------------- - dda2_line_interpolator() {} - - //-------------------------------------------- Forward-adjusted line - dda2_line_interpolator(int y1, int y2, int count) : - m_cnt(count <= 0 ? 1 : count), - m_lft((y2 - y1) / m_cnt), - m_rem((y2 - y1) % m_cnt), - m_mod(m_rem), - m_y(y1) - { - if(m_mod <= 0) - { - m_mod += count; - m_rem += count; - m_lft--; - } - m_mod -= count; - } - - //-------------------------------------------- Backward-adjusted line - dda2_line_interpolator(int y1, int y2, int count, int) : - m_cnt(count <= 0 ? 1 : count), - m_lft((y2 - y1) / m_cnt), - m_rem((y2 - y1) % m_cnt), - m_mod(m_rem), - m_y(y1) - { - if(m_mod <= 0) - { - m_mod += count; - m_rem += count; - m_lft--; - } - } - - //-------------------------------------------- Backward-adjusted line - dda2_line_interpolator(int y, int count) : - m_cnt(count <= 0 ? 1 : count), - m_lft(y / m_cnt), - m_rem(y % m_cnt), - m_mod(m_rem), - m_y(0) - { - if(m_mod <= 0) - { - m_mod += count; - m_rem += count; - m_lft--; - } - } - - - //-------------------------------------------------------------------- - void save(save_data_type* data) const - { - data[0] = m_mod; - data[1] = m_y; - } - - //-------------------------------------------------------------------- - void load(const save_data_type* data) - { - m_mod = data[0]; - m_y = data[1]; - } - - //-------------------------------------------------------------------- - void operator++() - { - m_mod += m_rem; - m_y += m_lft; - if(m_mod > 0) - { - m_mod -= m_cnt; - m_y++; - } - } - - //-------------------------------------------------------------------- - void operator--() - { - if(m_mod <= m_rem) - { - m_mod += m_cnt; - m_y--; - } - m_mod -= m_rem; - m_y -= m_lft; - } - - //-------------------------------------------------------------------- - void adjust_forward() - { - m_mod -= m_cnt; - } - - //-------------------------------------------------------------------- - void adjust_backward() - { - m_mod += m_cnt; - } - - //-------------------------------------------------------------------- - int mod() const { return m_mod; } - int rem() const { return m_rem; } - int lft() const { return m_lft; } - - //-------------------------------------------------------------------- - int y() const { return m_y; } - - private: - int m_cnt; - int m_lft; - int m_rem; - int m_mod; - int m_y; - }; - - - - - - - - //---------------------------------------------line_bresenham_interpolator - class line_bresenham_interpolator - { - public: - enum subpixel_scale_e - { - subpixel_shift = 8, - subpixel_scale = 1 << subpixel_shift, - subpixel_mask = subpixel_scale - 1 - }; - - //-------------------------------------------------------------------- - static int line_lr(int v) { return v >> subpixel_shift; } - - //-------------------------------------------------------------------- - line_bresenham_interpolator(int x1, int y1, int x2, int y2) : - m_x1_lr(line_lr(x1)), - m_y1_lr(line_lr(y1)), - m_x2_lr(line_lr(x2)), - m_y2_lr(line_lr(y2)), - m_ver(abs(m_x2_lr - m_x1_lr) < abs(m_y2_lr - m_y1_lr)), - m_len(m_ver ? abs(m_y2_lr - m_y1_lr) : - abs(m_x2_lr - m_x1_lr)), - m_inc(m_ver ? ((y2 > y1) ? 1 : -1) : ((x2 > x1) ? 1 : -1)), - m_interpolator(m_ver ? x1 : y1, - m_ver ? x2 : y2, - m_len) - { - } - - //-------------------------------------------------------------------- - bool is_ver() const { return m_ver; } - unsigned len() const { return m_len; } - int inc() const { return m_inc; } - - //-------------------------------------------------------------------- - void hstep() - { - ++m_interpolator; - m_x1_lr += m_inc; - } - - //-------------------------------------------------------------------- - void vstep() - { - ++m_interpolator; - m_y1_lr += m_inc; - } - - //-------------------------------------------------------------------- - int x1() const { return m_x1_lr; } - int y1() const { return m_y1_lr; } - int x2() const { return line_lr(m_interpolator.y()); } - int y2() const { return line_lr(m_interpolator.y()); } - int x2_hr() const { return m_interpolator.y(); } - int y2_hr() const { return m_interpolator.y(); } - - private: - int m_x1_lr; - int m_y1_lr; - int m_x2_lr; - int m_y2_lr; - bool m_ver; - unsigned m_len; - int m_inc; - dda2_line_interpolator m_interpolator; - - }; - - -} - - - -#endif diff --git a/uppdev/agg24/agg_ellipse.h b/uppdev/agg24/agg_ellipse.h deleted file mode 100644 index e78ce27dd..000000000 --- a/uppdev/agg24/agg_ellipse.h +++ /dev/null @@ -1,123 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// class ellipse -// -//---------------------------------------------------------------------------- - -#ifndef AGG_ELLIPSE_INCLUDED -#define AGG_ELLIPSE_INCLUDED - -#include "agg_basics.h" -#include - -namespace agg -{ - - //----------------------------------------------------------------ellipse - class ellipse - { - public: - ellipse() : - m_x(0.0), m_y(0.0), m_rx(1.0), m_ry(1.0), m_scale(1.0), - m_num(4), m_step(0), m_cw(false) {} - - ellipse(double x, double y, double rx, double ry, - unsigned num_steps=0, bool cw=false) : - m_x(x), m_y(y), m_rx(rx), m_ry(ry), m_scale(1.0), - m_num(num_steps), m_step(0), m_cw(cw) - { - if(m_num == 0) calc_num_steps(); - } - - void init(double x, double y, double rx, double ry, - unsigned num_steps=0, bool cw=false); - - void approximation_scale(double scale); - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - void calc_num_steps(); - - double m_x; - double m_y; - double m_rx; - double m_ry; - double m_scale; - unsigned m_num; - unsigned m_step; - bool m_cw; - }; - - //------------------------------------------------------------------------ - inline void ellipse::init(double x, double y, double rx, double ry, - unsigned num_steps, bool cw) - { - m_x = x; - m_y = y; - m_rx = rx; - m_ry = ry; - m_num = num_steps; - m_step = 0; - m_cw = cw; - if(m_num == 0) calc_num_steps(); - } - - //------------------------------------------------------------------------ - inline void ellipse::approximation_scale(double scale) - { - m_scale = scale; - calc_num_steps(); - } - - //------------------------------------------------------------------------ - inline void ellipse::calc_num_steps() - { - double ra = (fabs(m_rx) + fabs(m_ry)) / 2; - double da = acos(ra / (ra + 0.125 / m_scale)) * 2; - m_num = uround(2*pi / da); - } - - //------------------------------------------------------------------------ - inline void ellipse::rewind(unsigned) - { - m_step = 0; - } - - //------------------------------------------------------------------------ - inline unsigned ellipse::vertex(double* x, double* y) - { - if(m_step == m_num) - { - ++m_step; - return path_cmd_end_poly | path_flags_close | path_flags_ccw; - } - if(m_step > m_num) return path_cmd_stop; - double angle = double(m_step) / double(m_num) * 2.0 * pi; - if(m_cw) angle = 2.0 * pi - angle; - *x = m_x + cos(angle) * m_rx; - *y = m_y + sin(angle) * m_ry; - m_step++; - return ((m_step == 1) ? path_cmd_move_to : path_cmd_line_to); - } - -} - - - -#endif - - diff --git a/uppdev/agg24/agg_ellipse_bresenham.h b/uppdev/agg24/agg_ellipse_bresenham.h deleted file mode 100644 index ee3b9c463..000000000 --- a/uppdev/agg24/agg_ellipse_bresenham.h +++ /dev/null @@ -1,113 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Simple Bresenham interpolator for ellipsees -// -//---------------------------------------------------------------------------- - -#ifndef AGG_ELLIPSE_BRESENHAM_INCLUDED -#define AGG_ELLIPSE_BRESENHAM_INCLUDED - - -#include "agg_basics.h" - - -namespace agg -{ - - //------------------------------------------ellipse_bresenham_interpolator - class ellipse_bresenham_interpolator - { - public: - ellipse_bresenham_interpolator(int rx, int ry) : - m_rx2(rx * rx), - m_ry2(ry * ry), - m_two_rx2(m_rx2 << 1), - m_two_ry2(m_ry2 << 1), - m_dx(0), - m_dy(0), - m_inc_x(0), - m_inc_y(-ry * m_two_rx2), - m_cur_f(0) - {} - - int dx() const { return m_dx; } - int dy() const { return m_dy; } - - void operator++ () - { - int mx, my, mxy, min_m; - int fx, fy, fxy; - - mx = fx = m_cur_f + m_inc_x + m_ry2; - if(mx < 0) mx = -mx; - - my = fy = m_cur_f + m_inc_y + m_rx2; - if(my < 0) my = -my; - - mxy = fxy = m_cur_f + m_inc_x + m_ry2 + m_inc_y + m_rx2; - if(mxy < 0) mxy = -mxy; - - min_m = mx; - bool flag = true; - - if(min_m > my) - { - min_m = my; - flag = false; - } - - m_dx = m_dy = 0; - - if(min_m > mxy) - { - m_inc_x += m_two_ry2; - m_inc_y += m_two_rx2; - m_cur_f = fxy; - m_dx = 1; - m_dy = 1; - return; - } - - if(flag) - { - m_inc_x += m_two_ry2; - m_cur_f = fx; - m_dx = 1; - return; - } - - m_inc_y += m_two_rx2; - m_cur_f = fy; - m_dy = 1; - } - - private: - int m_rx2; - int m_ry2; - int m_two_rx2; - int m_two_ry2; - int m_dx; - int m_dy; - int m_inc_x; - int m_inc_y; - int m_cur_f; - - }; - -} - -#endif - diff --git a/uppdev/agg24/agg_embedded_raster_fonts.cpp b/uppdev/agg24/agg_embedded_raster_fonts.cpp deleted file mode 100644 index ee4dc65ee..000000000 --- a/uppdev/agg24/agg_embedded_raster_fonts.cpp +++ /dev/null @@ -1,10426 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#include "agg_embedded_raster_fonts.h" - -namespace agg -{ - - const int8u gse4x6[] = - { - 6, 0, 32, 128-32, - - 0x00,0x00,0x07,0x00,0x0e,0x00,0x15,0x00,0x1c,0x00,0x23,0x00,0x2a,0x00,0x31,0x00,0x38,0x00, - 0x3f,0x00,0x46,0x00,0x4d,0x00,0x54,0x00,0x5b,0x00,0x62,0x00,0x69,0x00,0x70,0x00,0x77,0x00, - 0x7e,0x00,0x85,0x00,0x8c,0x00,0x93,0x00,0x9a,0x00,0xa1,0x00,0xa8,0x00,0xaf,0x00,0xb6,0x00, - 0xbd,0x00,0xc4,0x00,0xcb,0x00,0xd2,0x00,0xd9,0x00,0xe0,0x00,0xe7,0x00,0xee,0x00,0xf5,0x00, - 0xfc,0x00,0x03,0x01,0x0a,0x01,0x11,0x01,0x18,0x01,0x1f,0x01,0x26,0x01,0x2d,0x01,0x34,0x01, - 0x3b,0x01,0x42,0x01,0x49,0x01,0x50,0x01,0x57,0x01,0x5e,0x01,0x65,0x01,0x6c,0x01,0x73,0x01, - 0x7a,0x01,0x81,0x01,0x88,0x01,0x8f,0x01,0x96,0x01,0x9d,0x01,0xa4,0x01,0xab,0x01,0xb2,0x01, - 0xb9,0x01,0xc0,0x01,0xc7,0x01,0xce,0x01,0xd5,0x01,0xdc,0x01,0xe3,0x01,0xea,0x01,0xf1,0x01, - 0xf8,0x01,0xff,0x01,0x06,0x02,0x0d,0x02,0x14,0x02,0x1b,0x02,0x22,0x02,0x29,0x02,0x30,0x02, - 0x37,0x02,0x3e,0x02,0x45,0x02,0x4c,0x02,0x53,0x02,0x5a,0x02,0x61,0x02,0x68,0x02,0x6f,0x02, - 0x76,0x02,0x7d,0x02,0x84,0x02,0x8b,0x02,0x92,0x02,0x99,0x02, - - 4, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x21 '!' - 0x40,0x40,0x40,0x00,0x40,0x00, - - 4, // 0x22 '"' - 0xa0,0xa0,0x00,0x00,0x00,0x00, - - 4, // 0x23 '#' - 0x60,0xf0,0x60,0xf0,0x60,0x00, - - 4, // 0x24 '$' - 0x40,0x60,0xc0,0x60,0xc0,0x40, - - 4, // 0x25 '%' - 0xa0,0x20,0x40,0x80,0xa0,0x00, - - 4, // 0x26 '&' - 0xe0,0xa0,0x50,0xa0,0xd0,0x00, - - 4, // 0x27 ''' - 0x40,0x40,0x00,0x00,0x00,0x00, - - 4, // 0x28 '(' - 0x20,0x40,0x40,0x40,0x20,0x00, - - 4, // 0x29 ')' - 0x40,0x20,0x20,0x20,0x40,0x00, - - 4, // 0x2a '*' - 0xa0,0x40,0xe0,0x40,0xa0,0x00, - - 4, // 0x2b '+' - 0x40,0x40,0xe0,0x40,0x40,0x00, - - 4, // 0x2c ',' - 0x00,0x00,0x00,0x40,0x40,0x80, - - 4, // 0x2d '-' - 0x00,0x00,0xe0,0x00,0x00,0x00, - - 4, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x40,0x00, - - 4, // 0x2f '/' - 0x10,0x20,0x20,0x40,0x40,0x80, - - 4, // 0x30 '0' - 0xe0,0xa0,0xa0,0xa0,0xe0,0x00, - - 4, // 0x31 '1' - 0x40,0xc0,0x40,0x40,0xe0,0x00, - - 4, // 0x32 '2' - 0xe0,0xa0,0x20,0x40,0xe0,0x00, - - 4, // 0x33 '3' - 0xe0,0x20,0x40,0x20,0xe0,0x00, - - 4, // 0x34 '4' - 0xa0,0xa0,0xe0,0x20,0x20,0x00, - - 4, // 0x35 '5' - 0xe0,0x80,0xc0,0x20,0xc0,0x00, - - 4, // 0x36 '6' - 0x40,0x80,0xe0,0xa0,0xe0,0x00, - - 4, // 0x37 '7' - 0xe0,0xa0,0x20,0x40,0x40,0x00, - - 4, // 0x38 '8' - 0xe0,0xa0,0x40,0xa0,0xe0,0x00, - - 4, // 0x39 '9' - 0xe0,0xa0,0xe0,0x20,0xc0,0x00, - - 4, // 0x3a ':' - 0x00,0x40,0x00,0x40,0x00,0x00, - - 4, // 0x3b ';' - 0x00,0x40,0x00,0x40,0x40,0x80, - - 4, // 0x3c '<' - 0x20,0x40,0x80,0x40,0x20,0x00, - - 4, // 0x3d '=' - 0x00,0xe0,0x00,0xe0,0x00,0x00, - - 4, // 0x3e '>' - 0x80,0x40,0x20,0x40,0x80,0x00, - - 4, // 0x3f '?' - 0xc0,0x20,0x40,0x00,0x40,0x00, - - 4, // 0x40 '@' - 0x40,0xa0,0xe0,0xe0,0x80,0x60, - - 4, // 0x41 'A' - 0x40,0xa0,0xe0,0xa0,0xa0,0x00, - - 4, // 0x42 'B' - 0xc0,0xa0,0xc0,0xa0,0xc0,0x00, - - 4, // 0x43 'C' - 0x60,0x80,0x80,0x80,0x60,0x00, - - 4, // 0x44 'D' - 0xc0,0xa0,0xa0,0xa0,0xc0,0x00, - - 4, // 0x45 'E' - 0xe0,0x80,0xc0,0x80,0xe0,0x00, - - 4, // 0x46 'F' - 0xe0,0x80,0xc0,0x80,0x80,0x00, - - 4, // 0x47 'G' - 0x60,0x80,0xa0,0xa0,0x40,0x00, - - 4, // 0x48 'H' - 0xa0,0xa0,0xe0,0xa0,0xa0,0x00, - - 4, // 0x49 'I' - 0xe0,0x40,0x40,0x40,0xe0,0x00, - - 4, // 0x4a 'J' - 0x20,0x20,0x20,0x20,0xa0,0x40, - - 4, // 0x4b 'K' - 0xa0,0xa0,0xc0,0xc0,0xa0,0x00, - - 4, // 0x4c 'L' - 0x80,0x80,0x80,0x80,0xe0,0x00, - - 4, // 0x4d 'M' - 0xa0,0xe0,0xa0,0xa0,0xa0,0x00, - - 4, // 0x4e 'N' - 0x90,0xd0,0xb0,0x90,0x90,0x00, - - 4, // 0x4f 'O' - 0x40,0xa0,0xa0,0xa0,0x40,0x00, - - 4, // 0x50 'P' - 0xc0,0xa0,0xa0,0xc0,0x80,0x00, - - 4, // 0x51 'Q' - 0x40,0xa0,0xa0,0xa0,0x60,0x00, - - 4, // 0x52 'R' - 0xc0,0xa0,0xa0,0xc0,0xa0,0x00, - - 4, // 0x53 'S' - 0x60,0x80,0x40,0x20,0xc0,0x00, - - 4, // 0x54 'T' - 0xe0,0x40,0x40,0x40,0x40,0x00, - - 4, // 0x55 'U' - 0xa0,0xa0,0xa0,0xa0,0xe0,0x00, - - 4, // 0x56 'V' - 0xa0,0xa0,0xa0,0xa0,0x40,0x00, - - 4, // 0x57 'W' - 0xa0,0xa0,0xa0,0xe0,0xa0,0x00, - - 4, // 0x58 'X' - 0xa0,0xa0,0x40,0xa0,0xa0,0x00, - - 4, // 0x59 'Y' - 0xa0,0xa0,0x40,0x40,0x40,0x00, - - 4, // 0x5a 'Z' - 0xe0,0x20,0x40,0x80,0xe0,0x00, - - 4, // 0x5b '[' - 0xc0,0x80,0x80,0x80,0xc0,0x00, - - 4, // 0x5c '\' - 0x80,0x40,0x40,0x20,0x20,0x10, - - 4, // 0x5d ']' - 0xc0,0x40,0x40,0x40,0xc0,0x00, - - 4, // 0x5e '^' - 0x40,0xa0,0x00,0x00,0x00,0x00, - - 4, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0xf0, - - 4, // 0x60 '`' - 0x40,0x20,0x00,0x00,0x00,0x00, - - 4, // 0x61 'a' - 0x00,0x60,0xa0,0xa0,0x70,0x00, - - 4, // 0x62 'b' - 0x80,0x80,0xc0,0xa0,0xc0,0x00, - - 4, // 0x63 'c' - 0x00,0x60,0x80,0x80,0x60,0x00, - - 4, // 0x64 'd' - 0x20,0x20,0x60,0xa0,0x60,0x00, - - 4, // 0x65 'e' - 0x00,0x40,0xe0,0x80,0x60,0x00, - - 4, // 0x66 'f' - 0x20,0x40,0xe0,0x40,0x40,0x00, - - 4, // 0x67 'g' - 0x00,0x60,0xa0,0x60,0x20,0xc0, - - 4, // 0x68 'h' - 0x80,0x80,0xc0,0xa0,0xa0,0x00, - - 4, // 0x69 'i' - 0x40,0x00,0xc0,0x40,0xe0,0x00, - - 4, // 0x6a 'j' - 0x40,0x00,0xc0,0x40,0x40,0x80, - - 4, // 0x6b 'k' - 0x80,0x80,0xa0,0xc0,0xa0,0x00, - - 4, // 0x6c 'l' - 0xc0,0x40,0x40,0x40,0xe0,0x00, - - 4, // 0x6d 'm' - 0x00,0xa0,0xf0,0xf0,0x90,0x00, - - 4, // 0x6e 'n' - 0x00,0xc0,0xa0,0xa0,0xa0,0x00, - - 4, // 0x6f 'o' - 0x00,0x40,0xa0,0xa0,0x40,0x00, - - 4, // 0x70 'p' - 0x00,0xc0,0xa0,0xc0,0x80,0x80, - - 4, // 0x71 'q' - 0x00,0x60,0xa0,0x60,0x20,0x20, - - 4, // 0x72 'r' - 0x00,0xa0,0x50,0x40,0x40,0x00, - - 4, // 0x73 's' - 0x00,0x60,0xc0,0x20,0xc0,0x00, - - 4, // 0x74 't' - 0x40,0x40,0xe0,0x40,0x60,0x00, - - 4, // 0x75 'u' - 0x00,0xa0,0xa0,0xa0,0x60,0x00, - - 4, // 0x76 'v' - 0x00,0xa0,0xa0,0xa0,0x40,0x00, - - 4, // 0x77 'w' - 0x00,0xa0,0xa0,0xe0,0xa0,0x00, - - 4, // 0x78 'x' - 0x00,0xa0,0x40,0xa0,0xa0,0x00, - - 4, // 0x79 'y' - 0x00,0xa0,0xa0,0x60,0x20,0xc0, - - 4, // 0x7a 'z' - 0x00,0xe0,0x40,0x80,0xe0,0x00, - - 4, // 0x7b '{' - 0x30,0x20,0xc0,0x20,0x30,0x00, - - 4, // 0x7c '|' - 0x40,0x40,0x00,0x40,0x40,0x40, - - 4, // 0x7d '}' - 0xc0,0x40,0x30,0x40,0xc0,0x00, - - 4, // 0x7e '~' - 0x50,0xa0,0x00,0x00,0x00,0x00, - - 4, // 0x7f '' - 0x00,0x60,0x90,0xf0,0x00,0x00, - 0 - }; - - const int8u gse4x8[] = - { - 8, 0, 32, 128-32, - - 0x00,0x00,0x09,0x00,0x12,0x00,0x1b,0x00,0x24,0x00,0x2d,0x00,0x36,0x00,0x3f,0x00,0x48,0x00, - 0x51,0x00,0x5a,0x00,0x63,0x00,0x6c,0x00,0x75,0x00,0x7e,0x00,0x87,0x00,0x90,0x00,0x99,0x00, - 0xa2,0x00,0xab,0x00,0xb4,0x00,0xbd,0x00,0xc6,0x00,0xcf,0x00,0xd8,0x00,0xe1,0x00,0xea,0x00, - 0xf3,0x00,0xfc,0x00,0x05,0x01,0x0e,0x01,0x17,0x01,0x20,0x01,0x29,0x01,0x32,0x01,0x3b,0x01, - 0x44,0x01,0x4d,0x01,0x56,0x01,0x5f,0x01,0x68,0x01,0x71,0x01,0x7a,0x01,0x83,0x01,0x8c,0x01, - 0x95,0x01,0x9e,0x01,0xa7,0x01,0xb0,0x01,0xb9,0x01,0xc2,0x01,0xcb,0x01,0xd4,0x01,0xdd,0x01, - 0xe6,0x01,0xef,0x01,0xf8,0x01,0x01,0x02,0x0a,0x02,0x13,0x02,0x1c,0x02,0x25,0x02,0x2e,0x02, - 0x37,0x02,0x40,0x02,0x49,0x02,0x52,0x02,0x5b,0x02,0x64,0x02,0x6d,0x02,0x76,0x02,0x7f,0x02, - 0x88,0x02,0x91,0x02,0x9a,0x02,0xa3,0x02,0xac,0x02,0xb5,0x02,0xbe,0x02,0xc7,0x02,0xd0,0x02, - 0xd9,0x02,0xe2,0x02,0xeb,0x02,0xf4,0x02,0xfd,0x02,0x06,0x03,0x0f,0x03,0x18,0x03,0x21,0x03, - 0x2a,0x03,0x33,0x03,0x3c,0x03,0x45,0x03,0x4e,0x03,0x57,0x03, - - 4, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x21 '!' - 0x00,0x40,0x40,0x40,0x40,0x00,0x40,0x00, - - 4, // 0x22 '"' - 0x00,0xa0,0xa0,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x23 '#' - 0x60,0x60,0xf0,0x60,0x60,0xf0,0x60,0x60, - - 4, // 0x24 '$' - 0x40,0x60,0xc0,0xc0,0x60,0x60,0xc0,0x40, - - 4, // 0x25 '%' - 0x00,0xa0,0x20,0x40,0x40,0x80,0xa0,0x00, - - 4, // 0x26 '&' - 0x00,0x40,0xa0,0xa0,0x40,0xb0,0xa0,0x70, - - 4, // 0x27 ''' - 0x00,0x40,0x40,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x28 '(' - 0x20,0x40,0x80,0x80,0x80,0x80,0x40,0x20, - - 4, // 0x29 ')' - 0x80,0x40,0x20,0x20,0x20,0x20,0x40,0x80, - - 4, // 0x2a '*' - 0x00,0xa0,0x40,0xe0,0x40,0xa0,0x00,0x00, - - 4, // 0x2b '+' - 0x00,0x40,0x40,0xe0,0x40,0x40,0x00,0x00, - - 4, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x80, - - 4, // 0x2d '-' - 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, - - 4, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00, - - 4, // 0x2f '/' - 0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80, - - 4, // 0x30 '0' - 0x00,0xe0,0xa0,0xa0,0xa0,0xa0,0xe0,0x00, - - 4, // 0x31 '1' - 0x00,0x40,0xc0,0x40,0x40,0x40,0xe0,0x00, - - 4, // 0x32 '2' - 0x00,0xe0,0xa0,0x20,0x40,0x80,0xe0,0x00, - - 4, // 0x33 '3' - 0x00,0xe0,0x20,0x40,0x20,0x20,0xe0,0x00, - - 4, // 0x34 '4' - 0x00,0x60,0xa0,0xa0,0xf0,0x20,0x20,0x00, - - 4, // 0x35 '5' - 0x00,0xe0,0x80,0xc0,0x20,0x20,0xc0,0x00, - - 4, // 0x36 '6' - 0x00,0x40,0x80,0xe0,0xa0,0xa0,0xe0,0x00, - - 4, // 0x37 '7' - 0x00,0xe0,0xa0,0x20,0x40,0x40,0x40,0x00, - - 4, // 0x38 '8' - 0x00,0xe0,0xa0,0x40,0xa0,0xa0,0xe0,0x00, - - 4, // 0x39 '9' - 0x00,0xe0,0xa0,0xe0,0x20,0x20,0x40,0x00, - - 4, // 0x3a ':' - 0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00, - - 4, // 0x3b ';' - 0x00,0x00,0x40,0x00,0x00,0x40,0x40,0x80, - - 4, // 0x3c '<' - 0x00,0x20,0x40,0x80,0x40,0x20,0x00,0x00, - - 4, // 0x3d '=' - 0x00,0x00,0xe0,0x00,0xe0,0x00,0x00,0x00, - - 4, // 0x3e '>' - 0x00,0x80,0x40,0x20,0x40,0x80,0x00,0x00, - - 4, // 0x3f '?' - 0x00,0x40,0xa0,0x20,0x40,0x00,0x40,0x00, - - 4, // 0x40 '@' - 0x00,0x40,0xa0,0xe0,0xe0,0x80,0x60,0x00, - - 4, // 0x41 'A' - 0x00,0x40,0xa0,0xa0,0xe0,0xa0,0xa0,0x00, - - 4, // 0x42 'B' - 0x00,0xc0,0xa0,0xc0,0xa0,0xa0,0xc0,0x00, - - 4, // 0x43 'C' - 0x00,0x40,0xa0,0x80,0x80,0xa0,0x40,0x00, - - 4, // 0x44 'D' - 0x00,0xc0,0xa0,0xa0,0xa0,0xa0,0xc0,0x00, - - 4, // 0x45 'E' - 0x00,0xe0,0x80,0xc0,0x80,0x80,0xe0,0x00, - - 4, // 0x46 'F' - 0x00,0xe0,0x80,0xc0,0x80,0x80,0x80,0x00, - - 4, // 0x47 'G' - 0x00,0x60,0x80,0xa0,0xa0,0xa0,0x40,0x00, - - 4, // 0x48 'H' - 0x00,0xa0,0xa0,0xe0,0xa0,0xa0,0xa0,0x00, - - 4, // 0x49 'I' - 0x00,0xe0,0x40,0x40,0x40,0x40,0xe0,0x00, - - 4, // 0x4a 'J' - 0x00,0x20,0x20,0x20,0x20,0xa0,0x40,0x00, - - 4, // 0x4b 'K' - 0x00,0xa0,0xa0,0xc0,0xc0,0xa0,0xa0,0x00, - - 4, // 0x4c 'L' - 0x00,0x80,0x80,0x80,0x80,0x80,0xe0,0x00, - - 4, // 0x4d 'M' - 0x00,0xa0,0xe0,0xa0,0xa0,0xa0,0xa0,0x00, - - 4, // 0x4e 'N' - 0x00,0x90,0x90,0xd0,0xb0,0x90,0x90,0x00, - - 4, // 0x4f 'O' - 0x00,0x40,0xa0,0xa0,0xa0,0xa0,0x40,0x00, - - 4, // 0x50 'P' - 0x00,0xc0,0xa0,0xa0,0xc0,0x80,0x80,0x00, - - 4, // 0x51 'Q' - 0x00,0x40,0xa0,0xa0,0xa0,0xa0,0x60,0x00, - - 4, // 0x52 'R' - 0x00,0xc0,0xa0,0xa0,0xc0,0xc0,0xa0,0x00, - - 4, // 0x53 'S' - 0x00,0x60,0x80,0x40,0x20,0x20,0xc0,0x00, - - 4, // 0x54 'T' - 0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0x00, - - 4, // 0x55 'U' - 0x00,0xa0,0xa0,0xa0,0xa0,0xa0,0x40,0x00, - - 4, // 0x56 'V' - 0x00,0xa0,0xa0,0xa0,0xa0,0x40,0x40,0x00, - - 4, // 0x57 'W' - 0x00,0xa0,0xa0,0xa0,0xa0,0xe0,0xa0,0x00, - - 4, // 0x58 'X' - 0x00,0xa0,0xa0,0x40,0xa0,0xa0,0xa0,0x00, - - 4, // 0x59 'Y' - 0x00,0xa0,0xa0,0x40,0x40,0x40,0x40,0x00, - - 4, // 0x5a 'Z' - 0x00,0xe0,0x20,0x40,0x40,0x80,0xe0,0x00, - - 4, // 0x5b '[' - 0xc0,0x80,0x80,0x80,0x80,0x80,0x80,0xc0, - - 4, // 0x5c '\' - 0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10, - - 4, // 0x5d ']' - 0xc0,0x40,0x40,0x40,0x40,0x40,0x40,0xc0, - - 4, // 0x5e '^' - 0x00,0x40,0xa0,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0, - - 4, // 0x60 '`' - 0x00,0x40,0x20,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x61 'a' - 0x00,0x00,0x60,0xa0,0xa0,0xa0,0x70,0x00, - - 4, // 0x62 'b' - 0x00,0x80,0x80,0xc0,0xa0,0xa0,0xc0,0x00, - - 4, // 0x63 'c' - 0x00,0x00,0x40,0xa0,0x80,0xa0,0x40,0x00, - - 4, // 0x64 'd' - 0x00,0x20,0x20,0x60,0xa0,0xa0,0x60,0x00, - - 4, // 0x65 'e' - 0x00,0x00,0x40,0xa0,0xe0,0x80,0x60,0x00, - - 4, // 0x66 'f' - 0x00,0x20,0x40,0x40,0xe0,0x40,0x40,0x00, - - 4, // 0x67 'g' - 0x00,0x00,0x60,0xa0,0xa0,0x60,0x20,0xc0, - - 4, // 0x68 'h' - 0x00,0x80,0x80,0xc0,0xa0,0xa0,0xa0,0x00, - - 4, // 0x69 'i' - 0x00,0x40,0x00,0xc0,0x40,0x40,0xe0,0x00, - - 4, // 0x6a 'j' - 0x00,0x40,0x00,0xc0,0x40,0x40,0x40,0x80, - - 4, // 0x6b 'k' - 0x00,0x80,0x80,0xa0,0xc0,0xc0,0xa0,0x00, - - 4, // 0x6c 'l' - 0x00,0xc0,0x40,0x40,0x40,0x40,0xe0,0x00, - - 4, // 0x6d 'm' - 0x00,0x00,0xa0,0xf0,0xf0,0xf0,0x90,0x00, - - 4, // 0x6e 'n' - 0x00,0x00,0xc0,0xa0,0xa0,0xa0,0xa0,0x00, - - 4, // 0x6f 'o' - 0x00,0x00,0x40,0xa0,0xa0,0xa0,0x40,0x00, - - 4, // 0x70 'p' - 0x00,0x00,0xc0,0xa0,0xa0,0xc0,0x80,0x80, - - 4, // 0x71 'q' - 0x00,0x00,0x60,0xa0,0xa0,0x60,0x20,0x20, - - 4, // 0x72 'r' - 0x00,0x00,0xa0,0x50,0x40,0x40,0x40,0x00, - - 4, // 0x73 's' - 0x00,0x00,0x60,0x80,0x40,0x20,0xc0,0x00, - - 4, // 0x74 't' - 0x00,0x40,0x40,0xe0,0x40,0x40,0x20,0x00, - - 4, // 0x75 'u' - 0x00,0x00,0xa0,0xa0,0xa0,0xa0,0x60,0x00, - - 4, // 0x76 'v' - 0x00,0x00,0xa0,0xa0,0xa0,0x40,0x40,0x00, - - 4, // 0x77 'w' - 0x00,0x00,0xa0,0xa0,0xa0,0xe0,0xa0,0x00, - - 4, // 0x78 'x' - 0x00,0x00,0xa0,0xa0,0x40,0xa0,0xa0,0x00, - - 4, // 0x79 'y' - 0x00,0x00,0xa0,0xa0,0xa0,0x60,0x20,0xc0, - - 4, // 0x7a 'z' - 0x00,0x00,0xe0,0x20,0x40,0x80,0xe0,0x00, - - 4, // 0x7b '{' - 0x10,0x20,0x20,0xc0,0x20,0x20,0x10,0x00, - - 4, // 0x7c '|' - 0x00,0x40,0x40,0x40,0x00,0x40,0x40,0x40, - - 4, // 0x7d '}' - 0x80,0x40,0x40,0x30,0x40,0x40,0x80,0x00, - - 4, // 0x7e '~' - 0x00,0x50,0xa0,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x7f '' - 0x00,0x00,0x00,0x60,0x90,0xf0,0x00,0x00, - 0 - }; - - const int8u gse5x7[] = - { - 7, 0, 32, 128-32, - - 0x00,0x00,0x08,0x00,0x10,0x00,0x18,0x00,0x20,0x00,0x28,0x00,0x30,0x00,0x38,0x00,0x40,0x00, - 0x48,0x00,0x50,0x00,0x58,0x00,0x60,0x00,0x68,0x00,0x70,0x00,0x78,0x00,0x80,0x00,0x88,0x00, - 0x90,0x00,0x98,0x00,0xa0,0x00,0xa8,0x00,0xb0,0x00,0xb8,0x00,0xc0,0x00,0xc8,0x00,0xd0,0x00, - 0xd8,0x00,0xe0,0x00,0xe8,0x00,0xf0,0x00,0xf8,0x00,0x00,0x01,0x08,0x01,0x10,0x01,0x18,0x01, - 0x20,0x01,0x28,0x01,0x30,0x01,0x38,0x01,0x40,0x01,0x48,0x01,0x50,0x01,0x58,0x01,0x60,0x01, - 0x68,0x01,0x70,0x01,0x78,0x01,0x80,0x01,0x88,0x01,0x90,0x01,0x98,0x01,0xa0,0x01,0xa8,0x01, - 0xb0,0x01,0xb8,0x01,0xc0,0x01,0xc8,0x01,0xd0,0x01,0xd8,0x01,0xe0,0x01,0xe8,0x01,0xf0,0x01, - 0xf8,0x01,0x00,0x02,0x08,0x02,0x10,0x02,0x18,0x02,0x20,0x02,0x28,0x02,0x30,0x02,0x38,0x02, - 0x40,0x02,0x48,0x02,0x50,0x02,0x58,0x02,0x60,0x02,0x68,0x02,0x70,0x02,0x78,0x02,0x80,0x02, - 0x88,0x02,0x90,0x02,0x98,0x02,0xa0,0x02,0xa8,0x02,0xb0,0x02,0xb8,0x02,0xc0,0x02,0xc8,0x02, - 0xd0,0x02,0xd8,0x02,0xe0,0x02,0xe8,0x02,0xf0,0x02,0xf8,0x02, - - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x21 '!' - 0x00,0x20,0x20,0x20,0x00,0x20,0x00, - - 5, // 0x22 '"' - 0x00,0x50,0x50,0x00,0x00,0x00,0x00, - - 5, // 0x23 '#' - 0x00,0x50,0xf8,0x50,0xf8,0x50,0x00, - - 5, // 0x24 '$' - 0x20,0x78,0xa0,0x70,0x28,0xf0,0x20, - - 5, // 0x25 '%' - 0x00,0x88,0x10,0x20,0x40,0x88,0x00, - - 5, // 0x26 '&' - 0x00,0x40,0xa0,0x68,0x90,0x68,0x00, - - 5, // 0x27 ''' - 0x00,0x20,0x20,0x00,0x00,0x00,0x00, - - 5, // 0x28 '(' - 0x10,0x20,0x40,0x40,0x40,0x20,0x10, - - 5, // 0x29 ')' - 0x80,0x40,0x20,0x20,0x20,0x40,0x80, - - 5, // 0x2a '*' - 0x00,0x20,0xa8,0x70,0xa8,0x20,0x00, - - 5, // 0x2b '+' - 0x00,0x20,0x20,0xf8,0x20,0x20,0x00, - - 5, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x20,0x20,0x40, - - 5, // 0x2d '-' - 0x00,0x00,0x00,0xf0,0x00,0x00,0x00, - - 5, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x40,0x00, - - 5, // 0x2f '/' - 0x00,0x08,0x10,0x20,0x40,0x80,0x00, - - 5, // 0x30 '0' - 0x00,0x60,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x31 '1' - 0x00,0x20,0x60,0x20,0x20,0x70,0x00, - - 5, // 0x32 '2' - 0x00,0x60,0x90,0x20,0x40,0xf0,0x00, - - 5, // 0x33 '3' - 0x00,0xf0,0x20,0x60,0x10,0xe0,0x00, - - 5, // 0x34 '4' - 0x00,0x30,0x50,0x90,0xf0,0x10,0x00, - - 5, // 0x35 '5' - 0x00,0xf0,0x80,0xe0,0x10,0xe0,0x00, - - 5, // 0x36 '6' - 0x00,0x60,0x80,0xe0,0x90,0x60,0x00, - - 5, // 0x37 '7' - 0x00,0xf0,0x90,0x20,0x40,0x40,0x00, - - 5, // 0x38 '8' - 0x00,0x60,0x90,0x60,0x90,0x60,0x00, - - 5, // 0x39 '9' - 0x00,0x60,0x90,0x70,0x10,0x60,0x00, - - 5, // 0x3a ':' - 0x00,0x00,0x20,0x00,0x20,0x00,0x00, - - 5, // 0x3b ';' - 0x00,0x00,0x20,0x00,0x20,0x20,0x40, - - 5, // 0x3c '<' - 0x00,0x10,0x20,0x40,0x20,0x10,0x00, - - 5, // 0x3d '=' - 0x00,0x00,0xf0,0x00,0xf0,0x00,0x00, - - 5, // 0x3e '>' - 0x00,0x80,0x40,0x20,0x40,0x80,0x00, - - 5, // 0x3f '?' - 0x00,0x60,0x90,0x20,0x00,0x20,0x00, - - 5, // 0x40 '@' - 0x00,0x60,0x90,0xb0,0x80,0x70,0x00, - - 5, // 0x41 'A' - 0x00,0x60,0x90,0xf0,0x90,0x90,0x00, - - 5, // 0x42 'B' - 0x00,0xe0,0x90,0xe0,0x90,0xe0,0x00, - - 5, // 0x43 'C' - 0x00,0x60,0x90,0x80,0x90,0x60,0x00, - - 5, // 0x44 'D' - 0x00,0xe0,0x90,0x90,0x90,0xe0,0x00, - - 5, // 0x45 'E' - 0x00,0xf0,0x80,0xe0,0x80,0xf0,0x00, - - 5, // 0x46 'F' - 0x00,0xf0,0x80,0xe0,0x80,0x80,0x00, - - 5, // 0x47 'G' - 0x00,0x70,0x80,0xb0,0x90,0x60,0x00, - - 5, // 0x48 'H' - 0x00,0x90,0x90,0xf0,0x90,0x90,0x00, - - 5, // 0x49 'I' - 0x00,0x70,0x20,0x20,0x20,0x70,0x00, - - 5, // 0x4a 'J' - 0x00,0x70,0x20,0x20,0xa0,0x40,0x00, - - 5, // 0x4b 'K' - 0x00,0x90,0xa0,0xc0,0xa0,0x90,0x00, - - 5, // 0x4c 'L' - 0x00,0x80,0x80,0x80,0x80,0xf0,0x00, - - 5, // 0x4d 'M' - 0x00,0x90,0xf0,0x90,0x90,0x90,0x00, - - 5, // 0x4e 'N' - 0x00,0x90,0xd0,0xb0,0x90,0x90,0x00, - - 5, // 0x4f 'O' - 0x00,0x60,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x50 'P' - 0x00,0xe0,0x90,0xe0,0x80,0x80,0x00, - - 5, // 0x51 'Q' - 0x00,0x60,0x90,0x90,0xa0,0x50,0x00, - - 5, // 0x52 'R' - 0x00,0xe0,0x90,0xe0,0xa0,0x90,0x00, - - 5, // 0x53 'S' - 0x00,0x70,0x80,0x60,0x10,0xe0,0x00, - - 5, // 0x54 'T' - 0x00,0x70,0x20,0x20,0x20,0x20,0x00, - - 5, // 0x55 'U' - 0x00,0x90,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x56 'V' - 0x00,0x50,0x50,0x50,0x20,0x20,0x00, - - 5, // 0x57 'W' - 0x00,0x90,0x90,0x90,0xf0,0x90,0x00, - - 5, // 0x58 'X' - 0x00,0x90,0x90,0x60,0x90,0x90,0x00, - - 5, // 0x59 'Y' - 0x00,0x50,0x50,0x20,0x20,0x20,0x00, - - 5, // 0x5a 'Z' - 0x00,0xf0,0x10,0x20,0x40,0xf0,0x00, - - 5, // 0x5b '[' - 0x70,0x40,0x40,0x40,0x40,0x40,0x70, - - 5, // 0x5c '\' - 0x00,0x80,0x40,0x20,0x10,0x08,0x00, - - 5, // 0x5d ']' - 0xe0,0x20,0x20,0x20,0x20,0x20,0xe0, - - 5, // 0x5e '^' - 0x00,0x20,0x50,0x00,0x00,0x00,0x00, - - 5, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0xf8,0x00, - - 5, // 0x60 '`' - 0x00,0x40,0x20,0x00,0x00,0x00,0x00, - - 5, // 0x61 'a' - 0x00,0x00,0x60,0xa0,0xa0,0x50,0x00, - - 5, // 0x62 'b' - 0x00,0x80,0x80,0xe0,0x90,0xe0,0x00, - - 5, // 0x63 'c' - 0x00,0x00,0x70,0x80,0x80,0x70,0x00, - - 5, // 0x64 'd' - 0x00,0x10,0x10,0x70,0x90,0x70,0x00, - - 5, // 0x65 'e' - 0x00,0x00,0x60,0xf0,0x80,0x70,0x00, - - 5, // 0x66 'f' - 0x00,0x30,0x40,0xe0,0x40,0x40,0x00, - - 5, // 0x67 'g' - 0x00,0x00,0x70,0x90,0x70,0x10,0x60, - - 5, // 0x68 'h' - 0x00,0x80,0x80,0xe0,0x90,0x90,0x00, - - 5, // 0x69 'i' - 0x20,0x00,0x60,0x20,0x20,0x70,0x00, - - 5, // 0x6a 'j' - 0x20,0x00,0x60,0x20,0x20,0xa0,0x40, - - 5, // 0x6b 'k' - 0x80,0x80,0x90,0xa0,0xe0,0x90,0x00, - - 5, // 0x6c 'l' - 0x00,0x60,0x20,0x20,0x20,0x70,0x00, - - 5, // 0x6d 'm' - 0x00,0x00,0xa0,0xf0,0xf0,0x90,0x00, - - 5, // 0x6e 'n' - 0x00,0x00,0xa0,0xd0,0x90,0x90,0x00, - - 5, // 0x6f 'o' - 0x00,0x00,0x60,0x90,0x90,0x60,0x00, - - 5, // 0x70 'p' - 0x00,0x00,0xe0,0x90,0xe0,0x80,0x80, - - 5, // 0x71 'q' - 0x00,0x00,0x70,0x90,0x70,0x10,0x10, - - 5, // 0x72 'r' - 0x00,0x00,0xe0,0x90,0x80,0x80,0x00, - - 5, // 0x73 's' - 0x00,0x00,0x70,0xe0,0x10,0xe0,0x00, - - 5, // 0x74 't' - 0x40,0x40,0xe0,0x40,0x40,0x70,0x00, - - 5, // 0x75 'u' - 0x00,0x00,0x90,0x90,0x90,0x70,0x00, - - 5, // 0x76 'v' - 0x00,0x00,0x50,0x50,0x50,0x20,0x00, - - 5, // 0x77 'w' - 0x00,0x00,0x90,0x90,0xf0,0x90,0x00, - - 5, // 0x78 'x' - 0x00,0x00,0x90,0x60,0x60,0x90,0x00, - - 5, // 0x79 'y' - 0x00,0x00,0x90,0x90,0x70,0x10,0x60, - - 5, // 0x7a 'z' - 0x00,0x00,0xf0,0x20,0x40,0xf0,0x00, - - 5, // 0x7b '{' - 0x10,0x20,0x20,0xc0,0x20,0x20,0x10, - - 5, // 0x7c '|' - 0x20,0x20,0x20,0x00,0x20,0x20,0x20, - - 5, // 0x7d '}' - 0x40,0x20,0x20,0x18,0x20,0x20,0x40, - - 5, // 0x7e '~' - 0x00,0x40,0xa8,0x10,0x00,0x00,0x00, - - 5, // 0x7f '' - 0x00,0x00,0x20,0x50,0x88,0xf8,0x00, - 0 - }; - - const int8u gse5x9[] = - { - 9, 0, 32, 128-32, - - 0x00,0x00,0x0a,0x00,0x14,0x00,0x1e,0x00,0x28,0x00,0x32,0x00,0x3c,0x00,0x46,0x00,0x50,0x00, - 0x5a,0x00,0x64,0x00,0x6e,0x00,0x78,0x00,0x82,0x00,0x8c,0x00,0x96,0x00,0xa0,0x00,0xaa,0x00, - 0xb4,0x00,0xbe,0x00,0xc8,0x00,0xd2,0x00,0xdc,0x00,0xe6,0x00,0xf0,0x00,0xfa,0x00,0x04,0x01, - 0x0e,0x01,0x18,0x01,0x22,0x01,0x2c,0x01,0x36,0x01,0x40,0x01,0x4a,0x01,0x54,0x01,0x5e,0x01, - 0x68,0x01,0x72,0x01,0x7c,0x01,0x86,0x01,0x90,0x01,0x9a,0x01,0xa4,0x01,0xae,0x01,0xb8,0x01, - 0xc2,0x01,0xcc,0x01,0xd6,0x01,0xe0,0x01,0xea,0x01,0xf4,0x01,0xfe,0x01,0x08,0x02,0x12,0x02, - 0x1c,0x02,0x26,0x02,0x30,0x02,0x3a,0x02,0x44,0x02,0x4e,0x02,0x58,0x02,0x62,0x02,0x6c,0x02, - 0x76,0x02,0x80,0x02,0x8a,0x02,0x94,0x02,0x9e,0x02,0xa8,0x02,0xb2,0x02,0xbc,0x02,0xc6,0x02, - 0xd0,0x02,0xda,0x02,0xe4,0x02,0xee,0x02,0xf8,0x02,0x02,0x03,0x0c,0x03,0x16,0x03,0x20,0x03, - 0x2a,0x03,0x34,0x03,0x3e,0x03,0x48,0x03,0x52,0x03,0x5c,0x03,0x66,0x03,0x70,0x03,0x7a,0x03, - 0x84,0x03,0x8e,0x03,0x98,0x03,0xa2,0x03,0xac,0x03,0xb6,0x03, - - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x21 '!' - 0x00,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00, - - 5, // 0x22 '"' - 0x00,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x23 '#' - 0x00,0x50,0x50,0xf8,0x50,0xf8,0x50,0x50,0x00, - - 5, // 0x24 '$' - 0x00,0x20,0x78,0xa0,0x70,0x28,0xf0,0x20,0x00, - - 5, // 0x25 '%' - 0x00,0xc8,0xc8,0x10,0x20,0x40,0x98,0x98,0x00, - - 5, // 0x26 '&' - 0x00,0x40,0xa0,0xa0,0x40,0xa8,0x90,0x68,0x00, - - 5, // 0x27 ''' - 0x00,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x28 '(' - 0x10,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x10, - - 5, // 0x29 ')' - 0x80,0x40,0x20,0x20,0x20,0x20,0x20,0x40,0x80, - - 5, // 0x2a '*' - 0x00,0x00,0x20,0xa8,0x70,0xa8,0x20,0x00,0x00, - - 5, // 0x2b '+' - 0x00,0x00,0x20,0x20,0xf8,0x20,0x20,0x00,0x00, - - 5, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x40, - - 5, // 0x2d '-' - 0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00, - - 5, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00, - - 5, // 0x2f '/' - 0x00,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80, - - 5, // 0x30 '0' - 0x00,0x60,0x90,0xb0,0xd0,0x90,0x90,0x60,0x00, - - 5, // 0x31 '1' - 0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x70,0x00, - - 5, // 0x32 '2' - 0x00,0x60,0x90,0x10,0x20,0x40,0x80,0xf0,0x00, - - 5, // 0x33 '3' - 0x00,0xf0,0x10,0x20,0x60,0x10,0x90,0x60,0x00, - - 5, // 0x34 '4' - 0x00,0x30,0x50,0x90,0x90,0xf8,0x10,0x10,0x00, - - 5, // 0x35 '5' - 0x00,0xf0,0x80,0xe0,0x10,0x10,0x10,0xe0,0x00, - - 5, // 0x36 '6' - 0x00,0x60,0x80,0xe0,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x37 '7' - 0x00,0xf0,0x90,0x10,0x20,0x40,0x40,0x40,0x00, - - 5, // 0x38 '8' - 0x00,0x60,0x90,0x90,0x60,0x90,0x90,0x60,0x00, - - 5, // 0x39 '9' - 0x00,0x60,0x90,0x90,0x70,0x10,0x90,0x60,0x00, - - 5, // 0x3a ':' - 0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00, - - 5, // 0x3b ';' - 0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x20,0x40, - - 5, // 0x3c '<' - 0x00,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x00, - - 5, // 0x3d '=' - 0x00,0x00,0x00,0xf0,0x00,0xf0,0x00,0x00,0x00, - - 5, // 0x3e '>' - 0x00,0x80,0x40,0x20,0x10,0x20,0x40,0x80,0x00, - - 5, // 0x3f '?' - 0x00,0x60,0x90,0x10,0x20,0x20,0x00,0x20,0x00, - - 5, // 0x40 '@' - 0x00,0x60,0x90,0xb0,0xb0,0xb0,0x80,0x70,0x00, - - 5, // 0x41 'A' - 0x00,0x60,0x90,0x90,0xf0,0x90,0x90,0x90,0x00, - - 5, // 0x42 'B' - 0x00,0xe0,0x90,0x90,0xe0,0x90,0x90,0xe0,0x00, - - 5, // 0x43 'C' - 0x00,0x60,0x90,0x80,0x80,0x80,0x90,0x60,0x00, - - 5, // 0x44 'D' - 0x00,0xe0,0x90,0x90,0x90,0x90,0x90,0xe0,0x00, - - 5, // 0x45 'E' - 0x00,0xf0,0x80,0x80,0xe0,0x80,0x80,0xf0,0x00, - - 5, // 0x46 'F' - 0x00,0xf0,0x80,0x80,0xe0,0x80,0x80,0x80,0x00, - - 5, // 0x47 'G' - 0x00,0x60,0x90,0x80,0xb0,0x90,0x90,0x60,0x00, - - 5, // 0x48 'H' - 0x00,0x90,0x90,0x90,0xf0,0x90,0x90,0x90,0x00, - - 5, // 0x49 'I' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00, - - 5, // 0x4a 'J' - 0x00,0x70,0x20,0x20,0x20,0x20,0xa0,0x40,0x00, - - 5, // 0x4b 'K' - 0x00,0x90,0x90,0xa0,0xc0,0xa0,0x90,0x90,0x00, - - 5, // 0x4c 'L' - 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0xf0,0x00, - - 5, // 0x4d 'M' - 0x00,0x90,0xf0,0x90,0x90,0x90,0x90,0x90,0x00, - - 5, // 0x4e 'N' - 0x00,0x90,0x90,0xd0,0xb0,0x90,0x90,0x90,0x00, - - 5, // 0x4f 'O' - 0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x50 'P' - 0x00,0xe0,0x90,0x90,0xe0,0x80,0x80,0x80,0x00, - - 5, // 0x51 'Q' - 0x00,0x60,0x90,0x90,0x90,0x90,0xa0,0x50,0x00, - - 5, // 0x52 'R' - 0x00,0xe0,0x90,0x90,0xe0,0xa0,0x90,0x90,0x00, - - 5, // 0x53 'S' - 0x00,0x60,0x90,0x80,0x60,0x10,0x90,0x60,0x00, - - 5, // 0x54 'T' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x00, - - 5, // 0x55 'U' - 0x00,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x56 'V' - 0x00,0x50,0x50,0x50,0x50,0x50,0x20,0x20,0x00, - - 5, // 0x57 'W' - 0x00,0x90,0x90,0x90,0x90,0x90,0xf0,0x90,0x00, - - 5, // 0x58 'X' - 0x00,0x90,0x90,0x60,0x60,0x90,0x90,0x90,0x00, - - 5, // 0x59 'Y' - 0x00,0x50,0x50,0x50,0x20,0x20,0x20,0x20,0x00, - - 5, // 0x5a 'Z' - 0x00,0xf0,0x10,0x10,0x20,0x40,0x80,0xf0,0x00, - - 5, // 0x5b '[' - 0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x00, - - 5, // 0x5c '\' - 0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x00, - - 5, // 0x5d ']' - 0xe0,0x20,0x20,0x20,0x20,0x20,0x20,0xe0,0x00, - - 5, // 0x5e '^' - 0x00,0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00, - - 5, // 0x60 '`' - 0x00,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x61 'a' - 0x00,0x00,0x60,0x10,0x70,0x90,0x90,0x70,0x00, - - 5, // 0x62 'b' - 0x00,0x80,0x80,0xe0,0x90,0x90,0x90,0xe0,0x00, - - 5, // 0x63 'c' - 0x00,0x00,0x60,0x90,0x80,0x80,0x90,0x60,0x00, - - 5, // 0x64 'd' - 0x00,0x10,0x10,0x70,0x90,0x90,0x90,0x70,0x00, - - 5, // 0x65 'e' - 0x00,0x00,0x60,0x90,0xf0,0x80,0x80,0x70,0x00, - - 5, // 0x66 'f' - 0x00,0x30,0x40,0x40,0xe0,0x40,0x40,0x40,0x00, - - 5, // 0x67 'g' - 0x00,0x00,0x70,0x90,0x90,0x70,0x10,0x90,0x60, - - 5, // 0x68 'h' - 0x00,0x80,0x80,0xe0,0x90,0x90,0x90,0x90,0x00, - - 5, // 0x69 'i' - 0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x70,0x00, - - 5, // 0x6a 'j' - 0x00,0x20,0x00,0x60,0x20,0x20,0x20,0xa0,0x40, - - 5, // 0x6b 'k' - 0x00,0x80,0x80,0x90,0xa0,0xc0,0xa0,0x90,0x00, - - 5, // 0x6c 'l' - 0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00, - - 5, // 0x6d 'm' - 0x00,0x00,0xa0,0xf0,0xf0,0xf0,0x90,0x90,0x00, - - 5, // 0x6e 'n' - 0x00,0x00,0xa0,0xd0,0x90,0x90,0x90,0x90,0x00, - - 5, // 0x6f 'o' - 0x00,0x00,0x60,0x90,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x70 'p' - 0x00,0x00,0xe0,0x90,0x90,0x90,0xe0,0x80,0x80, - - 5, // 0x71 'q' - 0x00,0x00,0x70,0x90,0x90,0x90,0x70,0x10,0x10, - - 5, // 0x72 'r' - 0x00,0x00,0xe0,0x90,0x80,0x80,0x80,0x80,0x00, - - 5, // 0x73 's' - 0x00,0x00,0x60,0x90,0x40,0x20,0x90,0x60,0x00, - - 5, // 0x74 't' - 0x00,0x40,0x40,0xe0,0x40,0x40,0x50,0x20,0x00, - - 5, // 0x75 'u' - 0x00,0x00,0x90,0x90,0x90,0x90,0x90,0x70,0x00, - - 5, // 0x76 'v' - 0x00,0x00,0x50,0x50,0x50,0x50,0x20,0x20,0x00, - - 5, // 0x77 'w' - 0x00,0x00,0x90,0x90,0x90,0x90,0xf0,0x90,0x00, - - 5, // 0x78 'x' - 0x00,0x00,0x90,0x90,0x60,0x60,0x90,0x90,0x00, - - 5, // 0x79 'y' - 0x00,0x00,0x90,0x90,0x90,0x90,0x70,0x10,0xe0, - - 5, // 0x7a 'z' - 0x00,0x00,0xf0,0x10,0x20,0x40,0x80,0xf0,0x00, - - 5, // 0x7b '{' - 0x10,0x20,0x20,0x20,0xc0,0x20,0x20,0x20,0x10, - - 5, // 0x7c '|' - 0x00,0x20,0x20,0x20,0x00,0x20,0x20,0x20,0x00, - - 5, // 0x7d '}' - 0x80,0x40,0x40,0x40,0x30,0x40,0x40,0x40,0x80, - - 5, // 0x7e '~' - 0x00,0x40,0xa8,0x10,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x7f '' - 0x00,0x00,0x00,0x20,0x50,0x88,0xf8,0x00,0x00, - 0 - }; - - const int8u gse6x12[] = - { - 12, 0, 32, 128-32, - - 0x00,0x00,0x0d,0x00,0x1a,0x00,0x27,0x00,0x34,0x00,0x41,0x00,0x4e,0x00,0x5b,0x00,0x68,0x00, - 0x75,0x00,0x82,0x00,0x8f,0x00,0x9c,0x00,0xa9,0x00,0xb6,0x00,0xc3,0x00,0xd0,0x00,0xdd,0x00, - 0xea,0x00,0xf7,0x00,0x04,0x01,0x11,0x01,0x1e,0x01,0x2b,0x01,0x38,0x01,0x45,0x01,0x52,0x01, - 0x5f,0x01,0x6c,0x01,0x79,0x01,0x86,0x01,0x93,0x01,0xa0,0x01,0xad,0x01,0xba,0x01,0xc7,0x01, - 0xd4,0x01,0xe1,0x01,0xee,0x01,0xfb,0x01,0x08,0x02,0x15,0x02,0x22,0x02,0x2f,0x02,0x3c,0x02, - 0x49,0x02,0x56,0x02,0x63,0x02,0x70,0x02,0x7d,0x02,0x8a,0x02,0x97,0x02,0xa4,0x02,0xb1,0x02, - 0xbe,0x02,0xcb,0x02,0xd8,0x02,0xe5,0x02,0xf2,0x02,0xff,0x02,0x0c,0x03,0x19,0x03,0x26,0x03, - 0x33,0x03,0x40,0x03,0x4d,0x03,0x5a,0x03,0x67,0x03,0x74,0x03,0x81,0x03,0x8e,0x03,0x9b,0x03, - 0xa8,0x03,0xb5,0x03,0xc2,0x03,0xcf,0x03,0xdc,0x03,0xe9,0x03,0xf6,0x03,0x03,0x04,0x10,0x04, - 0x1d,0x04,0x2a,0x04,0x37,0x04,0x44,0x04,0x51,0x04,0x5e,0x04,0x6b,0x04,0x78,0x04,0x85,0x04, - 0x92,0x04,0x9f,0x04,0xac,0x04,0xb9,0x04,0xc6,0x04,0xd3,0x04, - - 6, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x21 '!' - 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, - - 6, // 0x22 '"' - 0x00,0x50,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x23 '#' - 0x00,0x50,0x50,0xf8,0x50,0x50,0x50,0xf8,0x50,0x50,0x00,0x00, - - 6, // 0x24 '$' - 0x00,0x20,0x70,0xa8,0xa0,0x70,0x28,0xa8,0x70,0x20,0x00,0x00, - - 6, // 0x25 '%' - 0x00,0xc8,0xd8,0x10,0x30,0x20,0x60,0x40,0xd8,0x98,0x00,0x00, - - 6, // 0x26 '&' - 0x00,0x60,0x90,0x90,0x90,0x60,0xa8,0x90,0x90,0x68,0x00,0x00, - - 6, // 0x27 ''' - 0x00,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x28 '(' - 0x00,0x10,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x10,0x00,0x00, - - 6, // 0x29 ')' - 0x00,0x40,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x40,0x00,0x00, - - 6, // 0x2a '*' - 0x00,0x00,0x00,0x50,0x20,0xf8,0x20,0x50,0x00,0x00,0x00,0x00, - - 6, // 0x2b '+' - 0x00,0x00,0x20,0x20,0x20,0xf8,0x20,0x20,0x20,0x00,0x00,0x00, - - 6, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x40, - - 6, // 0x2d '-' - 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00, - - 6, // 0x2f '/' - 0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80,0x00,0x00, - - 6, // 0x30 '0' - 0x00,0x70,0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x70,0x00,0x00, - - 6, // 0x31 '1' - 0x00,0x20,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - - 6, // 0x32 '2' - 0x00,0x70,0x88,0x88,0x08,0x10,0x20,0x40,0x80,0xf8,0x00,0x00, - - 6, // 0x33 '3' - 0x00,0xf8,0x10,0x20,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00, - - 6, // 0x34 '4' - 0x00,0x10,0x20,0x40,0x90,0x90,0xf8,0x10,0x10,0x10,0x00,0x00, - - 6, // 0x35 '5' - 0x00,0xf8,0x80,0x80,0xf0,0x08,0x08,0x08,0x88,0x70,0x00,0x00, - - 6, // 0x36 '6' - 0x00,0x70,0x88,0x80,0x80,0xf0,0x88,0x88,0x88,0x70,0x00,0x00, - - 6, // 0x37 '7' - 0x00,0xf8,0x88,0x08,0x08,0x10,0x20,0x20,0x20,0x20,0x00,0x00, - - 6, // 0x38 '8' - 0x00,0x70,0x88,0x88,0x88,0x70,0x88,0x88,0x88,0x70,0x00,0x00, - - 6, // 0x39 '9' - 0x00,0x70,0x88,0x88,0x88,0x78,0x08,0x08,0x88,0x70,0x00,0x00, - - 6, // 0x3a ':' - 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00, - - 6, // 0x3b ';' - 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x20,0x20,0x40, - - 6, // 0x3c '<' - 0x00,0x08,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x08,0x00,0x00, - - 6, // 0x3d '=' - 0x00,0x00,0x00,0x00,0xf8,0x00,0xf8,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x3e '>' - 0x00,0x80,0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x80,0x00,0x00, - - 6, // 0x3f '?' - 0x00,0x70,0x88,0x88,0x08,0x10,0x20,0x20,0x00,0x20,0x00,0x00, - - 6, // 0x40 '@' - 0x00,0x70,0x88,0x88,0xb8,0xb8,0xb0,0x80,0x88,0x70,0x00,0x00, - - 6, // 0x41 'A' - 0x00,0x20,0x50,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x00,0x00, - - 6, // 0x42 'B' - 0x00,0xf0,0x88,0x88,0x88,0xf0,0x88,0x88,0x88,0xf0,0x00,0x00, - - 6, // 0x43 'C' - 0x00,0x70,0x88,0x88,0x80,0x80,0x80,0x88,0x88,0x70,0x00,0x00, - - 6, // 0x44 'D' - 0x00,0xe0,0x90,0x88,0x88,0x88,0x88,0x88,0x90,0xe0,0x00,0x00, - - 6, // 0x45 'E' - 0x00,0xf8,0x80,0x80,0x80,0xf0,0x80,0x80,0x80,0xf8,0x00,0x00, - - 6, // 0x46 'F' - 0x00,0xf8,0x80,0x80,0x80,0xf0,0x80,0x80,0x80,0x80,0x00,0x00, - - 6, // 0x47 'G' - 0x00,0x70,0x88,0x80,0x80,0xb8,0x88,0x88,0x88,0x70,0x00,0x00, - - 6, // 0x48 'H' - 0x00,0x88,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x88,0x00,0x00, - - 6, // 0x49 'I' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - - 6, // 0x4a 'J' - 0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x90,0x60,0x00,0x00, - - 6, // 0x4b 'K' - 0x00,0x88,0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88,0x88,0x00,0x00, - - 6, // 0x4c 'L' - 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xf8,0x00,0x00, - - 6, // 0x4d 'M' - 0x00,0x88,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x88,0x00,0x00, - - 6, // 0x4e 'N' - 0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x88,0x88,0x00,0x00, - - 6, // 0x4f 'O' - 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00, - - 6, // 0x50 'P' - 0x00,0xf0,0x88,0x88,0x88,0xf0,0x80,0x80,0x80,0x80,0x00,0x00, - - 6, // 0x51 'Q' - 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0xa8,0x90,0x68,0x00,0x00, - - 6, // 0x52 'R' - 0x00,0xf0,0x88,0x88,0x88,0x88,0xf0,0xa0,0x90,0x88,0x00,0x00, - - 6, // 0x53 'S' - 0x00,0x70,0x88,0x80,0x80,0x70,0x08,0x08,0x88,0x70,0x00,0x00, - - 6, // 0x54 'T' - 0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00, - - 6, // 0x55 'U' - 0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00, - - 6, // 0x56 'V' - 0x00,0x88,0x88,0x88,0x88,0x88,0x50,0x50,0x20,0x20,0x00,0x00, - - 6, // 0x57 'W' - 0x00,0x88,0x88,0x88,0x88,0x88,0xa8,0xa8,0xd8,0x88,0x00,0x00, - - 6, // 0x58 'X' - 0x00,0x88,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x88,0x00,0x00, - - 6, // 0x59 'Y' - 0x00,0x88,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x20,0x00,0x00, - - 6, // 0x5a 'Z' - 0x00,0xf8,0x08,0x08,0x10,0x20,0x40,0x80,0x80,0xf8,0x00,0x00, - - 6, // 0x5b '[' - 0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x00, - - 6, // 0x5c '\' - 0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x00,0x00, - - 6, // 0x5d ']' - 0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70,0x00, - - 6, // 0x5e '^' - 0x00,0x00,0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00, - - 6, // 0x60 '`' - 0x00,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x61 'a' - 0x00,0x00,0x00,0x70,0x88,0x08,0x78,0x88,0x88,0x78,0x00,0x00, - - 6, // 0x62 'b' - 0x00,0x80,0x80,0x80,0xf0,0x88,0x88,0x88,0x88,0xf0,0x00,0x00, - - 6, // 0x63 'c' - 0x00,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x00,0x00, - - 6, // 0x64 'd' - 0x00,0x08,0x08,0x08,0x78,0x88,0x88,0x88,0x88,0x78,0x00,0x00, - - 6, // 0x65 'e' - 0x00,0x00,0x00,0x70,0x88,0x88,0xf8,0x80,0x80,0x78,0x00,0x00, - - 6, // 0x66 'f' - 0x00,0x18,0x20,0x20,0xf8,0x20,0x20,0x20,0x20,0x20,0x00,0x00, - - 6, // 0x67 'g' - 0x00,0x00,0x00,0x78,0x88,0x88,0x88,0x88,0x78,0x08,0x08,0xf0, - - 6, // 0x68 'h' - 0x00,0x80,0x80,0x80,0xf0,0x88,0x88,0x88,0x88,0x88,0x00,0x00, - - 6, // 0x69 'i' - 0x00,0x20,0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - - 6, // 0x6a 'j' - 0x00,0x10,0x00,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x90,0x60, - - 6, // 0x6b 'k' - 0x00,0x80,0x80,0x80,0x88,0x90,0xa0,0xd0,0x88,0x88,0x00,0x00, - - 6, // 0x6c 'l' - 0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - - 6, // 0x6d 'm' - 0x00,0x00,0x00,0xd0,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0x00,0x00, - - 6, // 0x6e 'n' - 0x00,0x00,0x00,0xb0,0xc8,0x88,0x88,0x88,0x88,0x88,0x00,0x00, - - 6, // 0x6f 'o' - 0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00, - - 6, // 0x70 'p' - 0x00,0x00,0x00,0xf0,0x88,0x88,0x88,0x88,0xf0,0x80,0x80,0x80, - - 6, // 0x71 'q' - 0x00,0x00,0x00,0x78,0x88,0x88,0x88,0x88,0x78,0x08,0x08,0x08, - - 6, // 0x72 'r' - 0x00,0x00,0x00,0xb0,0xc8,0x88,0x80,0x80,0x80,0x80,0x00,0x00, - - 6, // 0x73 's' - 0x00,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x00,0x00, - - 6, // 0x74 't' - 0x00,0x40,0x40,0x40,0xe0,0x40,0x40,0x40,0x48,0x30,0x00,0x00, - - 6, // 0x75 'u' - 0x00,0x00,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x78,0x00,0x00, - - 6, // 0x76 'v' - 0x00,0x00,0x00,0x88,0x88,0x88,0x50,0x50,0x20,0x20,0x00,0x00, - - 6, // 0x77 'w' - 0x00,0x00,0x00,0x88,0x88,0x88,0xa8,0xa8,0xd8,0x88,0x00,0x00, - - 6, // 0x78 'x' - 0x00,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x00,0x00, - - 6, // 0x79 'y' - 0x00,0x00,0x00,0x88,0x88,0x88,0x88,0x88,0x78,0x08,0x10,0xe0, - - 6, // 0x7a 'z' - 0x00,0x00,0x00,0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x00,0x00, - - 6, // 0x7b '{' - 0x18,0x20,0x20,0x20,0x20,0xc0,0x20,0x20,0x20,0x20,0x18,0x00, - - 6, // 0x7c '|' - 0x00,0x20,0x20,0x20,0x20,0x00,0x20,0x20,0x20,0x20,0x00,0x00, - - 6, // 0x7d '}' - 0xc0,0x20,0x20,0x20,0x20,0x18,0x20,0x20,0x20,0x20,0xc0,0x00, - - 6, // 0x7e '~' - 0x00,0x00,0x40,0xa8,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x7f '' - 0x00,0x00,0x00,0x00,0x20,0x50,0x88,0xf8,0x00,0x00,0x00,0x00, - 0 - }; - - const int8u gse6x9[] = - { - 9, 0, 32, 128-32, - - 0x00,0x00,0x0a,0x00,0x14,0x00,0x1e,0x00,0x28,0x00,0x32,0x00,0x3c,0x00,0x46,0x00,0x50,0x00, - 0x5a,0x00,0x64,0x00,0x6e,0x00,0x78,0x00,0x82,0x00,0x8c,0x00,0x96,0x00,0xa0,0x00,0xaa,0x00, - 0xb4,0x00,0xbe,0x00,0xc8,0x00,0xd2,0x00,0xdc,0x00,0xe6,0x00,0xf0,0x00,0xfa,0x00,0x04,0x01, - 0x0e,0x01,0x18,0x01,0x22,0x01,0x2c,0x01,0x36,0x01,0x40,0x01,0x4a,0x01,0x54,0x01,0x5e,0x01, - 0x68,0x01,0x72,0x01,0x7c,0x01,0x86,0x01,0x90,0x01,0x9a,0x01,0xa4,0x01,0xae,0x01,0xb8,0x01, - 0xc2,0x01,0xcc,0x01,0xd6,0x01,0xe0,0x01,0xea,0x01,0xf4,0x01,0xfe,0x01,0x08,0x02,0x12,0x02, - 0x1c,0x02,0x26,0x02,0x30,0x02,0x3a,0x02,0x44,0x02,0x4e,0x02,0x58,0x02,0x62,0x02,0x6c,0x02, - 0x76,0x02,0x80,0x02,0x8a,0x02,0x94,0x02,0x9e,0x02,0xa8,0x02,0xb2,0x02,0xbc,0x02,0xc6,0x02, - 0xd0,0x02,0xda,0x02,0xe4,0x02,0xee,0x02,0xf8,0x02,0x02,0x03,0x0c,0x03,0x16,0x03,0x20,0x03, - 0x2a,0x03,0x34,0x03,0x3e,0x03,0x48,0x03,0x52,0x03,0x5c,0x03,0x66,0x03,0x70,0x03,0x7a,0x03, - 0x84,0x03,0x8e,0x03,0x98,0x03,0xa2,0x03,0xac,0x03,0xb6,0x03, - - 6, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x21 '!' - 0x00,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00, - - 6, // 0x22 '"' - 0x00,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x23 '#' - 0x00,0x50,0x50,0xf8,0x50,0xf8,0x50,0x50,0x00, - - 6, // 0x24 '$' - 0x00,0x70,0xa8,0xa0,0x70,0x28,0xa8,0x70,0x00, - - 6, // 0x25 '%' - 0x00,0xc8,0xc8,0x10,0x20,0x40,0x98,0x98,0x00, - - 6, // 0x26 '&' - 0x00,0x60,0x90,0x90,0x60,0xa8,0x90,0x68,0x00, - - 6, // 0x27 ''' - 0x00,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x28 '(' - 0x10,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x10, - - 6, // 0x29 ')' - 0x40,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x40, - - 6, // 0x2a '*' - 0x00,0x00,0x20,0xa8,0x70,0xa8,0x20,0x00,0x00, - - 6, // 0x2b '+' - 0x00,0x00,0x20,0x20,0xf8,0x20,0x20,0x00,0x00, - - 6, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x40, - - 6, // 0x2d '-' - 0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00, - - 6, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00, - - 6, // 0x2f '/' - 0x00,0x08,0x08,0x10,0x20,0x40,0x80,0x80,0x00, - - 6, // 0x30 '0' - 0x00,0x70,0x88,0x98,0xa8,0xc8,0x88,0x70,0x00, - - 6, // 0x31 '1' - 0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x70,0x00, - - 6, // 0x32 '2' - 0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xf8,0x00, - - 6, // 0x33 '3' - 0x00,0xf8,0x10,0x20,0x70,0x08,0x88,0x70,0x00, - - 6, // 0x34 '4' - 0x00,0x10,0x20,0x40,0x90,0xf8,0x10,0x10,0x00, - - 6, // 0x35 '5' - 0x00,0xf8,0x80,0xf0,0x08,0x08,0x88,0x70,0x00, - - 6, // 0x36 '6' - 0x00,0x70,0x88,0x80,0xf0,0x88,0x88,0x70,0x00, - - 6, // 0x37 '7' - 0x00,0xf8,0x08,0x08,0x10,0x20,0x40,0x40,0x00, - - 6, // 0x38 '8' - 0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x00, - - 6, // 0x39 '9' - 0x00,0x70,0x88,0x88,0x78,0x08,0x88,0x70,0x00, - - 6, // 0x3a ':' - 0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00, - - 6, // 0x3b ';' - 0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x20,0x40, - - 6, // 0x3c '<' - 0x00,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x00, - - 6, // 0x3d '=' - 0x00,0x00,0x00,0xf8,0x00,0xf8,0x00,0x00,0x00, - - 6, // 0x3e '>' - 0x00,0x80,0x40,0x20,0x10,0x20,0x40,0x80,0x00, - - 6, // 0x3f '?' - 0x00,0x70,0x88,0x08,0x10,0x20,0x00,0x20,0x00, - - 6, // 0x40 '@' - 0x00,0x70,0x88,0x88,0xb8,0xb8,0x80,0x70,0x00, - - 6, // 0x41 'A' - 0x00,0x20,0x50,0x88,0x88,0xf8,0x88,0x88,0x00, - - 6, // 0x42 'B' - 0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0xf0,0x00, - - 6, // 0x43 'C' - 0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x00, - - 6, // 0x44 'D' - 0x00,0xe0,0x90,0x88,0x88,0x88,0x90,0xe0,0x00, - - 6, // 0x45 'E' - 0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x00, - - 6, // 0x46 'F' - 0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0x80,0x00, - - 6, // 0x47 'G' - 0x00,0x70,0x88,0x80,0xb8,0x88,0x88,0x70,0x00, - - 6, // 0x48 'H' - 0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x00, - - 6, // 0x49 'I' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00, - - 6, // 0x4a 'J' - 0x00,0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x00, - - 6, // 0x4b 'K' - 0x00,0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88,0x00, - - 6, // 0x4c 'L' - 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0xf8,0x00, - - 6, // 0x4d 'M' - 0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x00, - - 6, // 0x4e 'N' - 0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x00, - - 6, // 0x4f 'O' - 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00, - - 6, // 0x50 'P' - 0x00,0xf0,0x88,0x88,0xf0,0x80,0x80,0x80,0x00, - - 6, // 0x51 'Q' - 0x00,0x70,0x88,0x88,0x88,0xa8,0x90,0x68,0x00, - - 6, // 0x52 'R' - 0x00,0xf0,0x88,0x88,0x88,0xf0,0x90,0x88,0x00, - - 6, // 0x53 'S' - 0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x00, - - 6, // 0x54 'T' - 0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x00, - - 6, // 0x55 'U' - 0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00, - - 6, // 0x56 'V' - 0x00,0x88,0x88,0x88,0x50,0x50,0x20,0x20,0x00, - - 6, // 0x57 'W' - 0x00,0x88,0x88,0x88,0xa8,0xa8,0xd8,0x88,0x00, - - 6, // 0x58 'X' - 0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x00, - - 6, // 0x59 'Y' - 0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x00, - - 6, // 0x5a 'Z' - 0x00,0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x00, - - 6, // 0x5b '[' - 0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70, - - 6, // 0x5c '\' - 0x00,0x80,0x80,0x40,0x20,0x10,0x08,0x08,0x00, - - 6, // 0x5d ']' - 0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70, - - 6, // 0x5e '^' - 0x00,0x00,0x20,0x50,0x88,0x00,0x00,0x00,0x00, - - 6, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00, - - 6, // 0x60 '`' - 0x00,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x61 'a' - 0x00,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x00, - - 6, // 0x62 'b' - 0x00,0x80,0x80,0xf0,0x88,0x88,0x88,0xf0,0x00, - - 6, // 0x63 'c' - 0x00,0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x00, - - 6, // 0x64 'd' - 0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x00, - - 6, // 0x65 'e' - 0x00,0x00,0x00,0x70,0x88,0xf8,0x80,0x78,0x00, - - 6, // 0x66 'f' - 0x00,0x18,0x20,0x20,0xf8,0x20,0x20,0x20,0x00, - - 6, // 0x67 'g' - 0x00,0x00,0x00,0x78,0x88,0x88,0x78,0x08,0x70, - - 6, // 0x68 'h' - 0x00,0x80,0x80,0xf0,0x88,0x88,0x88,0x88,0x00, - - 6, // 0x69 'i' - 0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x70,0x00, - - 6, // 0x6a 'j' - 0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x90,0x60, - - 6, // 0x6b 'k' - 0x00,0x00,0x80,0x88,0x90,0xa0,0xd0,0x88,0x00, - - 6, // 0x6c 'l' - 0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00, - - 6, // 0x6d 'm' - 0x00,0x00,0x00,0xd0,0xa8,0xa8,0xa8,0xa8,0x00, - - 6, // 0x6e 'n' - 0x00,0x00,0x00,0xb0,0xc8,0x88,0x88,0x88,0x00, - - 6, // 0x6f 'o' - 0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x00, - - 6, // 0x70 'p' - 0x00,0x00,0x00,0xf0,0x88,0x88,0xf0,0x80,0x80, - - 6, // 0x71 'q' - 0x00,0x00,0x00,0x78,0x88,0x88,0x78,0x08,0x08, - - 6, // 0x72 'r' - 0x00,0x00,0x00,0xb8,0xc0,0x80,0x80,0x80,0x00, - - 6, // 0x73 's' - 0x00,0x00,0x00,0x78,0x80,0x70,0x08,0xf0,0x00, - - 6, // 0x74 't' - 0x00,0x40,0x40,0xe0,0x40,0x40,0x48,0x30,0x00, - - 6, // 0x75 'u' - 0x00,0x00,0x00,0x88,0x88,0x88,0x88,0x78,0x00, - - 6, // 0x76 'v' - 0x00,0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x00, - - 6, // 0x77 'w' - 0x00,0x00,0x00,0x88,0x88,0xa8,0xd8,0x88,0x00, - - 6, // 0x78 'x' - 0x00,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x00, - - 6, // 0x79 'y' - 0x00,0x00,0x00,0x88,0x88,0x88,0x78,0x08,0x70, - - 6, // 0x7a 'z' - 0x00,0x00,0x00,0xf8,0x10,0x20,0x40,0xf8,0x00, - - 6, // 0x7b '{' - 0x18,0x20,0x20,0x20,0xc0,0x20,0x20,0x20,0x18, - - 6, // 0x7c '|' - 0x00,0x20,0x20,0x20,0x00,0x20,0x20,0x20,0x00, - - 6, // 0x7d '}' - 0xc0,0x20,0x20,0x20,0x18,0x20,0x20,0x20,0xc0, - - 6, // 0x7e '~' - 0x00,0x40,0xa8,0x10,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x7f '' - 0x00,0x00,0x00,0x20,0x50,0x88,0xf8,0x00,0x00, - 0 - }; - - const int8u gse7x11[] = - { - 11, 0, 32, 128-32, - - 0x00,0x00,0x0c,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x3c,0x00,0x48,0x00,0x54,0x00,0x60,0x00, - 0x6c,0x00,0x78,0x00,0x84,0x00,0x90,0x00,0x9c,0x00,0xa8,0x00,0xb4,0x00,0xc0,0x00,0xcc,0x00, - 0xd8,0x00,0xe4,0x00,0xf0,0x00,0xfc,0x00,0x08,0x01,0x14,0x01,0x20,0x01,0x2c,0x01,0x38,0x01, - 0x44,0x01,0x50,0x01,0x5c,0x01,0x68,0x01,0x74,0x01,0x80,0x01,0x8c,0x01,0x98,0x01,0xa4,0x01, - 0xb0,0x01,0xbc,0x01,0xc8,0x01,0xd4,0x01,0xe0,0x01,0xec,0x01,0xf8,0x01,0x04,0x02,0x10,0x02, - 0x1c,0x02,0x28,0x02,0x34,0x02,0x40,0x02,0x4c,0x02,0x58,0x02,0x64,0x02,0x70,0x02,0x7c,0x02, - 0x88,0x02,0x94,0x02,0xa0,0x02,0xac,0x02,0xb8,0x02,0xc4,0x02,0xd0,0x02,0xdc,0x02,0xe8,0x02, - 0xf4,0x02,0x00,0x03,0x0c,0x03,0x18,0x03,0x24,0x03,0x30,0x03,0x3c,0x03,0x48,0x03,0x54,0x03, - 0x60,0x03,0x6c,0x03,0x78,0x03,0x84,0x03,0x90,0x03,0x9c,0x03,0xa8,0x03,0xb4,0x03,0xc0,0x03, - 0xcc,0x03,0xd8,0x03,0xe4,0x03,0xf0,0x03,0xfc,0x03,0x08,0x04,0x14,0x04,0x20,0x04,0x2c,0x04, - 0x38,0x04,0x44,0x04,0x50,0x04,0x5c,0x04,0x68,0x04,0x74,0x04, - - 7, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x21 '!' - 0x00,0x10,0x38,0x38,0x38,0x10,0x10,0x00,0x10,0x00,0x00, - - 7, // 0x22 '"' - 0x00,0x00,0x24,0x24,0x24,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x23 '#' - 0x00,0x48,0x48,0xfc,0x48,0x48,0xfc,0x48,0x48,0x00,0x00, - - 7, // 0x24 '$' - 0x00,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x00, - - 7, // 0x25 '%' - 0x00,0x00,0x42,0xa4,0x48,0x10,0x24,0x4a,0x84,0x00,0x00, - - 7, // 0x26 '&' - 0x00,0x30,0x48,0x48,0x30,0x60,0x94,0x98,0x6c,0x00,0x00, - - 7, // 0x27 ''' - 0x00,0x20,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x28 '(' - 0x00,0x04,0x08,0x10,0x10,0x10,0x10,0x08,0x04,0x00,0x00, - - 7, // 0x29 ')' - 0x00,0x40,0x20,0x10,0x10,0x10,0x10,0x20,0x40,0x00,0x00, - - 7, // 0x2a '*' - 0x00,0x00,0x00,0x20,0xa8,0x70,0xa8,0x20,0x00,0x00,0x00, - - 7, // 0x2b '+' - 0x00,0x00,0x00,0x10,0x10,0x7c,0x10,0x10,0x00,0x00,0x00, - - 7, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x60, - - 7, // 0x2d '-' - 0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00, - - 7, // 0x2f '/' - 0x00,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00,0x00, - - 7, // 0x30 '0' - 0x00,0x38,0x44,0x4c,0x54,0x64,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x31 '1' - 0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x10,0x7c,0x00,0x00, - - 7, // 0x32 '2' - 0x00,0x38,0x44,0x04,0x08,0x10,0x20,0x44,0x7c,0x00,0x00, - - 7, // 0x33 '3' - 0x00,0x7c,0x48,0x10,0x38,0x04,0x04,0x44,0x38,0x00,0x00, - - 7, // 0x34 '4' - 0x00,0x08,0x10,0x20,0x48,0x48,0x7c,0x08,0x1c,0x00,0x00, - - 7, // 0x35 '5' - 0x00,0x7c,0x40,0x40,0x78,0x04,0x04,0x44,0x38,0x00,0x00, - - 7, // 0x36 '6' - 0x00,0x18,0x20,0x40,0x78,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x37 '7' - 0x00,0x7c,0x44,0x04,0x08,0x10,0x10,0x10,0x10,0x00,0x00, - - 7, // 0x38 '8' - 0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x39 '9' - 0x00,0x38,0x44,0x44,0x44,0x3c,0x04,0x08,0x30,0x00,0x00, - - 7, // 0x3a ':' - 0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00, - - 7, // 0x3b ';' - 0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x30,0x60,0x00, - - 7, // 0x3c '<' - 0x00,0x00,0x04,0x08,0x10,0x20,0x10,0x08,0x04,0x00,0x00, - - 7, // 0x3d '=' - 0x00,0x00,0x00,0x00,0xfc,0x00,0xfc,0x00,0x00,0x00,0x00, - - 7, // 0x3e '>' - 0x00,0x00,0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x00,0x00, - - 7, // 0x3f '?' - 0x00,0x70,0x88,0x88,0x10,0x20,0x20,0x00,0x20,0x00,0x00, - - 7, // 0x40 '@' - 0x00,0x30,0x48,0x04,0x34,0x54,0x54,0x54,0x28,0x00,0x00, - - 7, // 0x41 'A' - 0x00,0x10,0x28,0x44,0x44,0x7c,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x42 'B' - 0x00,0x78,0x44,0x44,0x78,0x44,0x44,0x44,0x78,0x00,0x00, - - 7, // 0x43 'C' - 0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x44,0x38,0x00,0x00, - - 7, // 0x44 'D' - 0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x48,0x70,0x00,0x00, - - 7, // 0x45 'E' - 0x00,0x7c,0x40,0x40,0x70,0x40,0x40,0x40,0x7c,0x00,0x00, - - 7, // 0x46 'F' - 0x00,0x7c,0x40,0x40,0x70,0x40,0x40,0x40,0x40,0x00,0x00, - - 7, // 0x47 'G' - 0x00,0x38,0x44,0x40,0x40,0x5c,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x48 'H' - 0x00,0x44,0x44,0x44,0x7c,0x44,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x49 'I' - 0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - - 7, // 0x4a 'J' - 0x00,0x1c,0x08,0x08,0x08,0x08,0x08,0x48,0x30,0x00,0x00, - - 7, // 0x4b 'K' - 0x00,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x44,0x00,0x00, - - 7, // 0x4c 'L' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7c,0x00,0x00, - - 7, // 0x4d 'M' - 0x00,0x44,0x6c,0x54,0x54,0x44,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x4e 'N' - 0x00,0x44,0x44,0x64,0x54,0x4c,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x4f 'O' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x50 'P' - 0x00,0x78,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00, - - 7, // 0x51 'Q' - 0x00,0x38,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00, - - 7, // 0x52 'R' - 0x00,0x78,0x44,0x44,0x44,0x78,0x50,0x48,0x44,0x00,0x00, - - 7, // 0x53 'S' - 0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x54 'T' - 0x00,0x7c,0x54,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - - 7, // 0x55 'U' - 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x56 'V' - 0x00,0x44,0x44,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00, - - 7, // 0x57 'W' - 0x00,0x44,0x44,0x44,0x44,0x54,0x54,0x6c,0x44,0x00,0x00, - - 7, // 0x58 'X' - 0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x59 'Y' - 0x00,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x38,0x00,0x00, - - 7, // 0x5a 'Z' - 0x00,0x7c,0x04,0x08,0x10,0x20,0x40,0x44,0x7c,0x00,0x00, - - 7, // 0x5b '[' - 0x00,0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00,0x00, - - 7, // 0x5c '\' - 0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x00,0x00, - - 7, // 0x5d ']' - 0x00,0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x38,0x00,0x00, - - 7, // 0x5e '^' - 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00, - - 7, // 0x60 '`' - 0x00,0x20,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x61 'a' - 0x00,0x00,0x00,0x38,0x04,0x3c,0x44,0x44,0x3c,0x00,0x00, - - 7, // 0x62 'b' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x78,0x00,0x00, - - 7, // 0x63 'c' - 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x44,0x38,0x00,0x00, - - 7, // 0x64 'd' - 0x00,0x04,0x04,0x3c,0x44,0x44,0x44,0x44,0x3c,0x00,0x00, - - 7, // 0x65 'e' - 0x00,0x00,0x00,0x38,0x44,0x7c,0x40,0x44,0x38,0x00,0x00, - - 7, // 0x66 'f' - 0x00,0x18,0x24,0x20,0x70,0x20,0x20,0x20,0x70,0x00,0x00, - - 7, // 0x67 'g' - 0x00,0x00,0x00,0x3c,0x44,0x44,0x44,0x3c,0x04,0x44,0x38, - - 7, // 0x68 'h' - 0x00,0x40,0x40,0x40,0x58,0x64,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x69 'i' - 0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - - 7, // 0x6a 'j' - 0x00,0x08,0x00,0x18,0x08,0x08,0x08,0x08,0x48,0x30,0x00, - - 7, // 0x6b 'k' - 0x00,0x40,0x40,0x44,0x48,0x50,0x68,0x44,0x44,0x00,0x00, - - 7, // 0x6c 'l' - 0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - - 7, // 0x6d 'm' - 0x00,0x00,0x00,0xa8,0x54,0x54,0x54,0x54,0x54,0x00,0x00, - - 7, // 0x6e 'n' - 0x00,0x00,0x00,0xb8,0x44,0x44,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x6f 'o' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x70 'p' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40, - - 7, // 0x71 'q' - 0x00,0x00,0x00,0x3c,0x44,0x44,0x44,0x44,0x3c,0x04,0x04, - - 7, // 0x72 'r' - 0x00,0x00,0x00,0x58,0x64,0x44,0x40,0x40,0x40,0x00,0x00, - - 7, // 0x73 's' - 0x00,0x00,0x00,0x3c,0x40,0x38,0x04,0x04,0x78,0x00,0x00, - - 7, // 0x74 't' - 0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x24,0x18,0x00,0x00, - - 7, // 0x75 'u' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x3a,0x00,0x00, - - 7, // 0x76 'v' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x28,0x10,0x00,0x00, - - 7, // 0x77 'w' - 0x00,0x00,0x00,0x44,0x44,0x54,0x54,0x6c,0x44,0x00,0x00, - - 7, // 0x78 'x' - 0x00,0x00,0x00,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00, - - 7, // 0x79 'y' - 0x00,0x00,0x00,0x44,0x44,0x44,0x3c,0x04,0x08,0x30,0x00, - - 7, // 0x7a 'z' - 0x00,0x00,0x00,0x7c,0x08,0x10,0x20,0x44,0x7c,0x00,0x00, - - 7, // 0x7b '{' - 0x00,0x0c,0x10,0x10,0x10,0x60,0x10,0x10,0x0c,0x00,0x00, - - 7, // 0x7c '|' - 0x00,0x20,0x20,0x20,0x00,0x20,0x20,0x20,0x20,0x00,0x00, - - 7, // 0x7d '}' - 0x00,0x60,0x10,0x10,0x10,0x0c,0x10,0x10,0x60,0x00,0x00, - - 7, // 0x7e '~' - 0x00,0x00,0x64,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x7f '' - 0x00,0x00,0x00,0x10,0x28,0x44,0x44,0x7c,0x00,0x00,0x00, - 0 - }; - - const int8u gse7x11_bold[] = - { - 11, 0, 32, 128-32, - - 0x00,0x00,0x0c,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x3c,0x00,0x48,0x00,0x54,0x00,0x60,0x00, - 0x6c,0x00,0x78,0x00,0x84,0x00,0x90,0x00,0x9c,0x00,0xa8,0x00,0xb4,0x00,0xc0,0x00,0xcc,0x00, - 0xd8,0x00,0xe4,0x00,0xf0,0x00,0xfc,0x00,0x08,0x01,0x14,0x01,0x20,0x01,0x2c,0x01,0x38,0x01, - 0x44,0x01,0x50,0x01,0x5c,0x01,0x68,0x01,0x74,0x01,0x80,0x01,0x8c,0x01,0x98,0x01,0xa4,0x01, - 0xb0,0x01,0xbc,0x01,0xc8,0x01,0xd4,0x01,0xe0,0x01,0xec,0x01,0xf8,0x01,0x04,0x02,0x10,0x02, - 0x1c,0x02,0x28,0x02,0x34,0x02,0x40,0x02,0x4c,0x02,0x58,0x02,0x64,0x02,0x70,0x02,0x7c,0x02, - 0x88,0x02,0x94,0x02,0xa0,0x02,0xac,0x02,0xb8,0x02,0xc4,0x02,0xd0,0x02,0xdc,0x02,0xe8,0x02, - 0xf4,0x02,0x00,0x03,0x0c,0x03,0x18,0x03,0x24,0x03,0x30,0x03,0x3c,0x03,0x48,0x03,0x54,0x03, - 0x60,0x03,0x6c,0x03,0x78,0x03,0x84,0x03,0x90,0x03,0x9c,0x03,0xa8,0x03,0xb4,0x03,0xc0,0x03, - 0xcc,0x03,0xd8,0x03,0xe4,0x03,0xf0,0x03,0xfc,0x03,0x08,0x04,0x14,0x04,0x20,0x04,0x2c,0x04, - 0x38,0x04,0x44,0x04,0x50,0x04,0x5c,0x04,0x68,0x04,0x74,0x04, - - 7, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x21 '!' - 0x00,0x30,0x30,0x30,0x30,0x30,0x00,0x30,0x30,0x00,0x00, - - 7, // 0x22 '"' - 0x00,0x6c,0x6c,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x23 '#' - 0x00,0x48,0x48,0xfc,0x48,0x48,0xfc,0x48,0x48,0x00,0x00, - - 7, // 0x24 '$' - 0x30,0x30,0x78,0xcc,0xc0,0x78,0x0c,0xcc,0x78,0x30,0x30, - - 7, // 0x25 '%' - 0x00,0x00,0xc4,0x0c,0x18,0x30,0x60,0xc0,0x8c,0x00,0x00, - - 7, // 0x26 '&' - 0x00,0x30,0x58,0x58,0x30,0x74,0xdc,0xd8,0x6c,0x00,0x00, - - 7, // 0x27 ''' - 0x00,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x28 '(' - 0x00,0x0c,0x18,0x30,0x30,0x30,0x30,0x18,0x0c,0x00,0x00, - - 7, // 0x29 ')' - 0x00,0xc0,0x60,0x30,0x30,0x30,0x30,0x60,0xc0,0x00,0x00, - - 7, // 0x2a '*' - 0x00,0x00,0x00,0x20,0xa8,0x70,0xa8,0x20,0x00,0x00,0x00, - - 7, // 0x2b '+' - 0x00,0x00,0x00,0x30,0x30,0xfc,0x30,0x30,0x00,0x00,0x00, - - 7, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x60,0x00, - - 7, // 0x2d '-' - 0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00, - - 7, // 0x2f '/' - 0x00,0x0c,0x0c,0x18,0x18,0x30,0x30,0x60,0x60,0x00,0x00, - - 7, // 0x30 '0' - 0x00,0x78,0xcc,0xcc,0xdc,0xec,0xcc,0xcc,0x78,0x00,0x00, - - 7, // 0x31 '1' - 0x00,0x30,0x70,0xf0,0x30,0x30,0x30,0x30,0xfc,0x00,0x00, - - 7, // 0x32 '2' - 0x00,0x78,0xcc,0xcc,0x18,0x30,0x60,0xcc,0xfc,0x00,0x00, - - 7, // 0x33 '3' - 0x00,0xfc,0x98,0x30,0x78,0x0c,0x0c,0xcc,0x78,0x00,0x00, - - 7, // 0x34 '4' - 0x00,0x18,0x30,0x68,0xd8,0xd8,0xfc,0x18,0x3c,0x00,0x00, - - 7, // 0x35 '5' - 0x00,0xfc,0xc0,0xc0,0xf8,0x0c,0x0c,0xcc,0x78,0x00,0x00, - - 7, // 0x36 '6' - 0x00,0x38,0x60,0xc0,0xf8,0xcc,0xcc,0xcc,0x78,0x00,0x00, - - 7, // 0x37 '7' - 0x00,0xfc,0x8c,0x0c,0x18,0x30,0x30,0x30,0x30,0x00,0x00, - - 7, // 0x38 '8' - 0x00,0x78,0xcc,0xcc,0x78,0xcc,0xcc,0xcc,0x78,0x00,0x00, - - 7, // 0x39 '9' - 0x00,0x78,0xcc,0xcc,0xcc,0x7c,0x0c,0x18,0x70,0x00,0x00, - - 7, // 0x3a ':' - 0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00,0x00,0x00, - - 7, // 0x3b ';' - 0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x30,0x60,0x00, - - 7, // 0x3c '<' - 0x00,0x00,0x0c,0x18,0x30,0x60,0x30,0x18,0x0c,0x00,0x00, - - 7, // 0x3d '=' - 0x00,0x00,0x00,0x00,0xfc,0x00,0xfc,0x00,0x00,0x00,0x00, - - 7, // 0x3e '>' - 0x00,0x00,0x60,0x30,0x18,0x0c,0x18,0x30,0x60,0x00,0x00, - - 7, // 0x3f '?' - 0x00,0x78,0xcc,0xcc,0x18,0x30,0x30,0x00,0x30,0x00,0x00, - - 7, // 0x40 '@' - 0x00,0x70,0x88,0x04,0x74,0xb4,0xb4,0xb4,0x68,0x00,0x00, - - 7, // 0x41 'A' - 0x00,0x30,0x78,0xcc,0xcc,0xfc,0xcc,0xcc,0xcc,0x00,0x00, - - 7, // 0x42 'B' - 0x00,0xf8,0xcc,0xcc,0xf8,0xcc,0xcc,0xcc,0xf8,0x00,0x00, - - 7, // 0x43 'C' - 0x00,0x78,0xcc,0xc0,0xc0,0xc0,0xc0,0xcc,0x78,0x00,0x00, - - 7, // 0x44 'D' - 0x00,0xf0,0xd8,0xcc,0xcc,0xcc,0xcc,0xd8,0xf0,0x00,0x00, - - 7, // 0x45 'E' - 0x00,0xfc,0xc4,0xd0,0xf0,0xd0,0xc0,0xc4,0xfc,0x00,0x00, - - 7, // 0x46 'F' - 0x00,0xfc,0xc4,0xd0,0xf0,0xd0,0xc0,0xc0,0xc0,0x00,0x00, - - 7, // 0x47 'G' - 0x00,0x78,0xcc,0xc0,0xc0,0xdc,0xcc,0xcc,0x78,0x00,0x00, - - 7, // 0x48 'H' - 0x00,0xcc,0xcc,0xcc,0xfc,0xcc,0xcc,0xcc,0xcc,0x00,0x00, - - 7, // 0x49 'I' - 0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00, - - 7, // 0x4a 'J' - 0x00,0x3c,0x18,0x18,0x18,0x18,0xd8,0xd8,0x70,0x00,0x00, - - 7, // 0x4b 'K' - 0x00,0xcc,0xcc,0xd8,0xf0,0xd8,0xcc,0xcc,0xcc,0x00,0x00, - - 7, // 0x4c 'L' - 0x00,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc4,0xfc,0x00,0x00, - - 7, // 0x4d 'M' - 0x00,0x84,0xcc,0xfc,0xb4,0xcc,0xcc,0xcc,0xcc,0x00,0x00, - - 7, // 0x4e 'N' - 0x00,0xcc,0xcc,0xec,0xfc,0xdc,0xcc,0xcc,0xcc,0x00,0x00, - - 7, // 0x4f 'O' - 0x00,0x78,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00, - - 7, // 0x50 'P' - 0x00,0xf8,0xcc,0xcc,0xcc,0xf8,0xc0,0xc0,0xc0,0x00,0x00, - - 7, // 0x51 'Q' - 0x00,0x78,0xcc,0xcc,0xcc,0xcc,0xdc,0x78,0x18,0x0c,0x00, - - 7, // 0x52 'R' - 0x00,0xf8,0xcc,0xcc,0xcc,0xf8,0xd8,0xcc,0xcc,0x00,0x00, - - 7, // 0x53 'S' - 0x00,0x78,0xcc,0xe0,0x70,0x38,0x1c,0xcc,0x78,0x00,0x00, - - 7, // 0x54 'T' - 0x00,0xfc,0xb4,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x00, - - 7, // 0x55 'U' - 0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00, - - 7, // 0x56 'V' - 0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x30,0x00,0x00, - - 7, // 0x57 'W' - 0x00,0xcc,0xcc,0xcc,0xcc,0xb4,0xfc,0xcc,0x84,0x00,0x00, - - 7, // 0x58 'X' - 0x00,0xcc,0xcc,0x78,0x30,0x78,0xcc,0xcc,0xcc,0x00,0x00, - - 7, // 0x59 'Y' - 0x00,0xcc,0xcc,0xcc,0x78,0x30,0x30,0x30,0x78,0x00,0x00, - - 7, // 0x5a 'Z' - 0x00,0xfc,0x8c,0x18,0x30,0x60,0xc0,0xc4,0xfc,0x00,0x00, - - 7, // 0x5b '[' - 0x00,0x78,0x60,0x60,0x60,0x60,0x60,0x60,0x78,0x00,0x00, - - 7, // 0x5c '\' - 0x00,0x60,0x60,0x30,0x30,0x18,0x18,0x0c,0x0c,0x00,0x00, - - 7, // 0x5d ']' - 0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x78,0x00,0x00, - - 7, // 0x5e '^' - 0x00,0x10,0x38,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00, - - 7, // 0x60 '`' - 0x00,0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x61 'a' - 0x00,0x00,0x00,0x70,0x18,0x78,0xd8,0xd8,0x6c,0x00,0x00, - - 7, // 0x62 'b' - 0x00,0x60,0x60,0x60,0x78,0x6c,0x6c,0x6c,0x78,0x00,0x00, - - 7, // 0x63 'c' - 0x00,0x00,0x00,0x78,0xcc,0xc0,0xc0,0xcc,0x78,0x00,0x00, - - 7, // 0x64 'd' - 0x00,0x18,0x18,0x18,0x78,0xd8,0xd8,0xd8,0x6c,0x00,0x00, - - 7, // 0x65 'e' - 0x00,0x00,0x00,0x78,0xcc,0xfc,0xc0,0xcc,0x78,0x00,0x00, - - 7, // 0x66 'f' - 0x00,0x18,0x34,0x30,0x78,0x30,0x30,0x30,0x78,0x00,0x00, - - 7, // 0x67 'g' - 0x00,0x00,0x00,0x6c,0xd8,0xd8,0xd8,0x78,0x18,0xd8,0x70, - - 7, // 0x68 'h' - 0x00,0xc0,0xc0,0xd8,0xec,0xcc,0xcc,0xcc,0xcc,0x00,0x00, - - 7, // 0x69 'i' - 0x00,0x30,0x00,0x70,0x30,0x30,0x30,0x30,0x78,0x00,0x00, - - 7, // 0x6a 'j' - 0x00,0x0c,0x00,0x1c,0x0c,0x0c,0x0c,0x0c,0x6c,0x6c,0x38, - - 7, // 0x6b 'k' - 0x00,0xc0,0xc0,0xcc,0xcc,0xd8,0xf0,0xd8,0xcc,0x00,0x00, - - 7, // 0x6c 'l' - 0x00,0x70,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00, - - 7, // 0x6d 'm' - 0x00,0x00,0x00,0xe8,0xfc,0xd4,0xd4,0xc4,0xc4,0x00,0x00, - - 7, // 0x6e 'n' - 0x00,0x00,0x00,0xd8,0x6c,0x6c,0x6c,0x6c,0x6c,0x00,0x00, - - 7, // 0x6f 'o' - 0x00,0x00,0x00,0x78,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00, - - 7, // 0x70 'p' - 0x00,0x00,0x00,0xf8,0xcc,0xcc,0xcc,0xf8,0xc0,0xc0,0xc0, - - 7, // 0x71 'q' - 0x00,0x00,0x00,0x7c,0xcc,0xcc,0xcc,0x7c,0x0c,0x0c,0x0c, - - 7, // 0x72 'r' - 0x00,0x00,0x00,0xd8,0xec,0xcc,0xc0,0xc0,0xc0,0x00,0x00, - - 7, // 0x73 's' - 0x00,0x00,0x00,0x78,0xcc,0x60,0x18,0xcc,0x78,0x00,0x00, - - 7, // 0x74 't' - 0x00,0x20,0x60,0x60,0xf0,0x60,0x60,0x68,0x30,0x00,0x00, - - 7, // 0x75 'u' - 0x00,0x00,0x00,0xd8,0xd8,0xd8,0xd8,0xd8,0x6c,0x00,0x00, - - 7, // 0x76 'v' - 0x00,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0x78,0x30,0x00,0x00, - - 7, // 0x77 'w' - 0x00,0x00,0x00,0xcc,0xcc,0xb4,0xfc,0xcc,0x84,0x00,0x00, - - 7, // 0x78 'x' - 0x00,0x00,0x00,0xcc,0x78,0x30,0x78,0xcc,0xcc,0x00,0x00, - - 7, // 0x79 'y' - 0x00,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0x7c,0x0c,0x18,0xf0, - - 7, // 0x7a 'z' - 0x00,0x00,0x00,0xfc,0x98,0x30,0x60,0xc4,0xfc,0x00,0x00, - - 7, // 0x7b '{' - 0x1c,0x30,0x30,0x30,0xe0,0x30,0x30,0x30,0x1c,0x00,0x00, - - 7, // 0x7c '|' - 0x30,0x30,0x30,0x30,0x00,0x30,0x30,0x30,0x30,0x00,0x00, - - 7, // 0x7d '}' - 0xe0,0x30,0x30,0x30,0x1c,0x30,0x30,0x30,0xe0,0x00,0x00, - - 7, // 0x7e '~' - 0x00,0x34,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x7f '' - 0x00,0x00,0x00,0x30,0x78,0xcc,0xcc,0xfc,0x00,0x00,0x00, - 0 - }; - - const int8u gse7x15[] = - { - 15, 0, 32, 128-32, - - 0x00,0x00,0x10,0x00,0x20,0x00,0x30,0x00,0x40,0x00,0x50,0x00,0x60,0x00,0x70,0x00,0x80,0x00, - 0x90,0x00,0xa0,0x00,0xb0,0x00,0xc0,0x00,0xd0,0x00,0xe0,0x00,0xf0,0x00,0x00,0x01,0x10,0x01, - 0x20,0x01,0x30,0x01,0x40,0x01,0x50,0x01,0x60,0x01,0x70,0x01,0x80,0x01,0x90,0x01,0xa0,0x01, - 0xb0,0x01,0xc0,0x01,0xd0,0x01,0xe0,0x01,0xf0,0x01,0x00,0x02,0x10,0x02,0x20,0x02,0x30,0x02, - 0x40,0x02,0x50,0x02,0x60,0x02,0x70,0x02,0x80,0x02,0x90,0x02,0xa0,0x02,0xb0,0x02,0xc0,0x02, - 0xd0,0x02,0xe0,0x02,0xf0,0x02,0x00,0x03,0x10,0x03,0x20,0x03,0x30,0x03,0x40,0x03,0x50,0x03, - 0x60,0x03,0x70,0x03,0x80,0x03,0x90,0x03,0xa0,0x03,0xb0,0x03,0xc0,0x03,0xd0,0x03,0xe0,0x03, - 0xf0,0x03,0x00,0x04,0x10,0x04,0x20,0x04,0x30,0x04,0x40,0x04,0x50,0x04,0x60,0x04,0x70,0x04, - 0x80,0x04,0x90,0x04,0xa0,0x04,0xb0,0x04,0xc0,0x04,0xd0,0x04,0xe0,0x04,0xf0,0x04,0x00,0x05, - 0x10,0x05,0x20,0x05,0x30,0x05,0x40,0x05,0x50,0x05,0x60,0x05,0x70,0x05,0x80,0x05,0x90,0x05, - 0xa0,0x05,0xb0,0x05,0xc0,0x05,0xd0,0x05,0xe0,0x05,0xf0,0x05, - - 7, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x21 '!' - 0x00,0x00,0x10,0x38,0x38,0x38,0x38,0x10,0x10,0x00,0x10,0x10,0x00,0x00,0x00, - - 7, // 0x22 '"' - 0x00,0x00,0x24,0x24,0x24,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x23 '#' - 0x00,0x00,0x48,0x48,0x48,0xfc,0x48,0x48,0xfc,0x48,0x48,0x48,0x00,0x00,0x00, - - 7, // 0x24 '$' - 0x00,0x00,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x54,0x38,0x10,0x00,0x00,0x00, - - 7, // 0x25 '%' - 0x00,0x00,0x44,0x44,0x08,0x08,0x10,0x10,0x20,0x20,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x26 '&' - 0x00,0x00,0x00,0x30,0x48,0x48,0x30,0x60,0x94,0x98,0x90,0x6c,0x00,0x00,0x00, - - 7, // 0x27 ''' - 0x00,0x00,0x20,0x20,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x28 '(' - 0x00,0x04,0x08,0x10,0x20,0x20,0x20,0x20,0x20,0x10,0x08,0x04,0x00,0x00,0x00, - - 7, // 0x29 ')' - 0x00,0x40,0x20,0x10,0x08,0x08,0x08,0x08,0x08,0x10,0x20,0x40,0x00,0x00,0x00, - - 7, // 0x2a '*' - 0x00,0x00,0x00,0x00,0x00,0x20,0xa8,0x70,0xa8,0x20,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x2b '+' - 0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x7c,0x10,0x10,0x10,0x00,0x00,0x00,0x00, - - 7, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x60,0x00, - - 7, // 0x2d '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00, - - 7, // 0x2f '/' - 0x00,0x00,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00,0x00,0x00, - - 7, // 0x30 '0' - 0x00,0x00,0x38,0x44,0x44,0x4c,0x54,0x64,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x31 '1' - 0x00,0x00,0x10,0x10,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x7c,0x00,0x00,0x00, - - 7, // 0x32 '2' - 0x00,0x00,0x38,0x44,0x44,0x04,0x08,0x10,0x20,0x40,0x44,0x7c,0x00,0x00,0x00, - - 7, // 0x33 '3' - 0x00,0x00,0x7c,0x44,0x08,0x10,0x38,0x04,0x04,0x04,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x34 '4' - 0x00,0x00,0x08,0x10,0x20,0x40,0x48,0x48,0x7c,0x08,0x08,0x1c,0x00,0x00,0x00, - - 7, // 0x35 '5' - 0x00,0x00,0x7c,0x40,0x40,0x40,0x78,0x04,0x04,0x04,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x36 '6' - 0x00,0x00,0x18,0x20,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x37 '7' - 0x00,0x00,0x7c,0x44,0x04,0x04,0x08,0x08,0x10,0x10,0x10,0x10,0x00,0x00,0x00, - - 7, // 0x38 '8' - 0x00,0x00,0x38,0x44,0x44,0x44,0x38,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x39 '9' - 0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x3c,0x04,0x04,0x08,0x30,0x00,0x00,0x00, - - 7, // 0x3a ':' - 0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00, - - 7, // 0x3b ';' - 0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x30,0x30,0x60,0x00,0x00, - - 7, // 0x3c '<' - 0x00,0x00,0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00,0x00,0x00, - - 7, // 0x3d '=' - 0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x3e '>' - 0x00,0x00,0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00,0x00,0x00, - - 7, // 0x3f '?' - 0x00,0x00,0x78,0x84,0x84,0x84,0x08,0x10,0x20,0x20,0x00,0x20,0x00,0x00,0x00, - - 7, // 0x40 '@' - 0x00,0x00,0x00,0x30,0x48,0x04,0x34,0x54,0x54,0x54,0x54,0x28,0x00,0x00,0x00, - - 7, // 0x41 'A' - 0x00,0x00,0x10,0x28,0x44,0x44,0x44,0x7c,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x42 'B' - 0x00,0x00,0x78,0x44,0x44,0x44,0x78,0x44,0x44,0x44,0x44,0x78,0x00,0x00,0x00, - - 7, // 0x43 'C' - 0x00,0x00,0x38,0x44,0x44,0x40,0x40,0x40,0x40,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x44 'D' - 0x00,0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x44,0x44,0x48,0x70,0x00,0x00,0x00, - - 7, // 0x45 'E' - 0x00,0x00,0x7c,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x40,0x7c,0x00,0x00,0x00, - - 7, // 0x46 'F' - 0x00,0x00,0x7c,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 7, // 0x47 'G' - 0x00,0x00,0x38,0x44,0x40,0x40,0x40,0x5c,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x48 'H' - 0x00,0x00,0x44,0x44,0x44,0x44,0x7c,0x44,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x49 'I' - 0x00,0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, - - 7, // 0x4a 'J' - 0x00,0x00,0x1c,0x08,0x08,0x08,0x08,0x08,0x08,0x48,0x48,0x30,0x00,0x00,0x00, - - 7, // 0x4b 'K' - 0x00,0x00,0x44,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x4c 'L' - 0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7c,0x00,0x00,0x00, - - 7, // 0x4d 'M' - 0x00,0x00,0x44,0x6c,0x54,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x4e 'N' - 0x00,0x00,0x44,0x44,0x44,0x64,0x54,0x4c,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x4f 'O' - 0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x50 'P' - 0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 7, // 0x51 'Q' - 0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00,0x00, - - 7, // 0x52 'R' - 0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x50,0x48,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x53 'S' - 0x00,0x00,0x38,0x44,0x44,0x40,0x38,0x04,0x04,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x54 'T' - 0x00,0x00,0x7c,0x54,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00, - - 7, // 0x55 'U' - 0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x56 'V' - 0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00,0x00, - - 7, // 0x57 'W' - 0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x54,0x6c,0x44,0x00,0x00,0x00, - - 7, // 0x58 'X' - 0x00,0x00,0x44,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x59 'Y' - 0x00,0x00,0x44,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, - - 7, // 0x5a 'Z' - 0x00,0x00,0x7c,0x04,0x04,0x08,0x10,0x20,0x40,0x40,0x40,0x7c,0x00,0x00,0x00, - - 7, // 0x5b '[' - 0x00,0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00,0x00, - - 7, // 0x5c '\' - 0x00,0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x00,0x00,0x00, - - 7, // 0x5d ']' - 0x00,0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x38,0x00,0x00, - - 7, // 0x5e '^' - 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00, - - 7, // 0x60 '`' - 0x00,0x20,0x20,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x38,0x44,0x04,0x3c,0x44,0x44,0x44,0x3a,0x00,0x00,0x00, - - 7, // 0x62 'b' - 0x00,0x00,0x40,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x00,0x00,0x00, - - 7, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x64 'd' - 0x00,0x00,0x04,0x04,0x04,0x3c,0x44,0x44,0x44,0x44,0x44,0x3a,0x00,0x00,0x00, - - 7, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x38,0x44,0x44,0x7c,0x40,0x40,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x66 'f' - 0x00,0x00,0x18,0x24,0x20,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00,0x00, - - 7, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x3a,0x44,0x44,0x44,0x44,0x44,0x3c,0x04,0x44,0x38,0x00, - - 7, // 0x68 'h' - 0x00,0x00,0x40,0x40,0x40,0x58,0x64,0x44,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x69 'i' - 0x00,0x00,0x10,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, - - 7, // 0x6a 'j' - 0x00,0x00,0x08,0x08,0x00,0x18,0x08,0x08,0x08,0x08,0x08,0x48,0x48,0x30,0x00, - - 7, // 0x6b 'k' - 0x00,0x00,0x40,0x40,0x44,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00,0x00, - - 7, // 0x6c 'l' - 0x00,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, - - 7, // 0x6d 'm' - 0x00,0x00,0x00,0x00,0xa8,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x00,0x00,0x00, - - 7, // 0x6e 'n' - 0x00,0x00,0x00,0x00,0xb8,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x6f 'o' - 0x00,0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00, - - 7, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x3c,0x44,0x44,0x44,0x44,0x44,0x3c,0x04,0x04,0x04,0x00, - - 7, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x58,0x64,0x44,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 7, // 0x73 's' - 0x00,0x00,0x00,0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x74 't' - 0x00,0x00,0x20,0x20,0x20,0x70,0x20,0x20,0x20,0x20,0x24,0x18,0x00,0x00,0x00, - - 7, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x3a,0x00,0x00,0x00, - - 7, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00,0x00, - - 7, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x54,0x54,0x6c,0x44,0x00,0x00,0x00, - - 7, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x3c,0x04,0x08,0x70,0x00, - - 7, // 0x7a 'z' - 0x00,0x00,0x00,0x00,0x7c,0x04,0x08,0x10,0x20,0x40,0x40,0x7c,0x00,0x00,0x00, - - 7, // 0x7b '{' - 0x00,0x0c,0x10,0x10,0x10,0x10,0x10,0x60,0x10,0x10,0x10,0x10,0x0c,0x00,0x00, - - 7, // 0x7c '|' - 0x00,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x00,0x00, - - 7, // 0x7d '}' - 0x00,0x60,0x10,0x10,0x10,0x10,0x10,0x0c,0x10,0x10,0x10,0x10,0x60,0x00,0x00, - - 7, // 0x7e '~' - 0x00,0x00,0x64,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x7f '' - 0x00,0x00,0x00,0x00,0x00,0x10,0x28,0x44,0x44,0x7c,0x00,0x00,0x00,0x00,0x00, - 0 - }; - - const int8u gse7x15_bold[] = - { - 15, 0, 32, 128-32, - - 0x00,0x00,0x10,0x00,0x20,0x00,0x30,0x00,0x40,0x00,0x50,0x00,0x60,0x00,0x70,0x00,0x80,0x00, - 0x90,0x00,0xa0,0x00,0xb0,0x00,0xc0,0x00,0xd0,0x00,0xe0,0x00,0xf0,0x00,0x00,0x01,0x10,0x01, - 0x20,0x01,0x30,0x01,0x40,0x01,0x50,0x01,0x60,0x01,0x70,0x01,0x80,0x01,0x90,0x01,0xa0,0x01, - 0xb0,0x01,0xc0,0x01,0xd0,0x01,0xe0,0x01,0xf0,0x01,0x00,0x02,0x10,0x02,0x20,0x02,0x30,0x02, - 0x40,0x02,0x50,0x02,0x60,0x02,0x70,0x02,0x80,0x02,0x90,0x02,0xa0,0x02,0xb0,0x02,0xc0,0x02, - 0xd0,0x02,0xe0,0x02,0xf0,0x02,0x00,0x03,0x10,0x03,0x20,0x03,0x30,0x03,0x40,0x03,0x50,0x03, - 0x60,0x03,0x70,0x03,0x80,0x03,0x90,0x03,0xa0,0x03,0xb0,0x03,0xc0,0x03,0xd0,0x03,0xe0,0x03, - 0xf0,0x03,0x00,0x04,0x10,0x04,0x20,0x04,0x30,0x04,0x40,0x04,0x50,0x04,0x60,0x04,0x70,0x04, - 0x80,0x04,0x90,0x04,0xa0,0x04,0xb0,0x04,0xc0,0x04,0xd0,0x04,0xe0,0x04,0xf0,0x04,0x00,0x05, - 0x10,0x05,0x20,0x05,0x30,0x05,0x40,0x05,0x50,0x05,0x60,0x05,0x70,0x05,0x80,0x05,0x90,0x05, - 0xa0,0x05,0xb0,0x05,0xc0,0x05,0xd0,0x05,0xe0,0x05,0xf0,0x05, - - 7, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x21 '!' - 0x00,0x00,0x00,0x30,0x78,0x78,0x78,0x30,0x30,0x00,0x30,0x30,0x00,0x00,0x00, - - 7, // 0x22 '"' - 0x00,0x00,0x6c,0x6c,0x6c,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x23 '#' - 0x00,0x00,0x48,0x48,0x48,0xfc,0x48,0x48,0xfc,0x48,0x48,0x48,0x00,0x00,0x00, - - 7, // 0x24 '$' - 0x00,0x30,0x30,0x78,0xcc,0xe0,0x70,0x38,0x1c,0xcc,0x78,0x30,0x30,0x00,0x00, - - 7, // 0x25 '%' - 0x00,0x00,0x00,0x64,0x6c,0x08,0x18,0x10,0x30,0x20,0x6c,0x4c,0x00,0x00,0x00, - - 7, // 0x26 '&' - 0x00,0x00,0x00,0x30,0x58,0x58,0x30,0x74,0xdc,0xd8,0xd8,0x6c,0x00,0x00,0x00, - - 7, // 0x27 ''' - 0x00,0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x28 '(' - 0x00,0x0c,0x18,0x30,0x60,0x60,0x60,0x60,0x60,0x30,0x18,0x0c,0x00,0x00,0x00, - - 7, // 0x29 ')' - 0x00,0xc0,0x60,0x30,0x18,0x18,0x18,0x18,0x18,0x30,0x60,0xc0,0x00,0x00,0x00, - - 7, // 0x2a '*' - 0x00,0x00,0x00,0x00,0x00,0x20,0xa8,0x70,0xa8,0x20,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x2b '+' - 0x00,0x00,0x00,0x00,0x00,0x30,0x30,0xfc,0x30,0x30,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x60,0x00, - - 7, // 0x2d '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00, - - 7, // 0x2f '/' - 0x00,0x00,0x0c,0x0c,0x18,0x18,0x30,0x30,0x60,0x60,0xc0,0xc0,0x00,0x00,0x00, - - 7, // 0x30 '0' - 0x00,0x00,0x78,0xcc,0xcc,0xcc,0xdc,0xec,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00, - - 7, // 0x31 '1' - 0x00,0x00,0x30,0x30,0x70,0xf0,0x30,0x30,0x30,0x30,0x30,0xfc,0x00,0x00,0x00, - - 7, // 0x32 '2' - 0x00,0x00,0x78,0xcc,0xcc,0x0c,0x18,0x30,0x60,0xc0,0xcc,0xfc,0x00,0x00,0x00, - - 7, // 0x33 '3' - 0x00,0x00,0xfc,0x8c,0x18,0x30,0x78,0x0c,0x0c,0x0c,0xcc,0x78,0x00,0x00,0x00, - - 7, // 0x34 '4' - 0x00,0x00,0x18,0x30,0x60,0xc8,0xd8,0xd8,0xfc,0x18,0x18,0x3c,0x00,0x00,0x00, - - 7, // 0x35 '5' - 0x00,0x00,0xfc,0xc0,0xc0,0xc0,0xf8,0x0c,0x0c,0x0c,0xcc,0x78,0x00,0x00,0x00, - - 7, // 0x36 '6' - 0x00,0x00,0x38,0x60,0xc0,0xc0,0xf8,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00, - - 7, // 0x37 '7' - 0x00,0x00,0xfc,0x8c,0x0c,0x0c,0x18,0x18,0x30,0x30,0x30,0x30,0x00,0x00,0x00, - - 7, // 0x38 '8' - 0x00,0x00,0x78,0xcc,0xcc,0xcc,0x78,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00, - - 7, // 0x39 '9' - 0x00,0x00,0x78,0xcc,0xcc,0xcc,0xcc,0x7c,0x0c,0x0c,0x18,0x70,0x00,0x00,0x00, - - 7, // 0x3a ':' - 0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00, - - 7, // 0x3b ';' - 0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x60,0x00, - - 7, // 0x3c '<' - 0x00,0x00,0x00,0x0c,0x18,0x30,0x60,0xc0,0x60,0x30,0x18,0x0c,0x00,0x00,0x00, - - 7, // 0x3d '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x3e '>' - 0x00,0x00,0x00,0xc0,0x60,0x30,0x18,0x0c,0x18,0x30,0x60,0xc0,0x00,0x00,0x00, - - 7, // 0x3f '?' - 0x00,0x00,0x78,0xcc,0xcc,0x18,0x30,0x30,0x30,0x00,0x30,0x30,0x00,0x00,0x00, - - 7, // 0x40 '@' - 0x00,0x00,0x00,0x70,0x88,0x04,0x74,0xb4,0xb4,0xb4,0xb4,0x68,0x00,0x00,0x00, - - 7, // 0x41 'A' - 0x00,0x00,0x30,0x78,0xcc,0xcc,0xcc,0xfc,0xcc,0xcc,0xcc,0xcc,0x00,0x00,0x00, - - 7, // 0x42 'B' - 0x00,0x00,0xf8,0xcc,0xcc,0xcc,0xf8,0xcc,0xcc,0xcc,0xcc,0xf8,0x00,0x00,0x00, - - 7, // 0x43 'C' - 0x00,0x00,0x78,0xcc,0xc4,0xc0,0xc0,0xc0,0xc0,0xc4,0xcc,0x78,0x00,0x00,0x00, - - 7, // 0x44 'D' - 0x00,0x00,0xf0,0xd8,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xd8,0xf0,0x00,0x00,0x00, - - 7, // 0x45 'E' - 0x00,0x00,0xfc,0xc4,0xc0,0xd0,0xf0,0xd0,0xc0,0xc0,0xc4,0xfc,0x00,0x00,0x00, - - 7, // 0x46 'F' - 0x00,0x00,0xfc,0xc4,0xc0,0xd0,0xf0,0xd0,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00, - - 7, // 0x47 'G' - 0x00,0x00,0x78,0xcc,0xc0,0xc0,0xc0,0xdc,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00, - - 7, // 0x48 'H' - 0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xfc,0xcc,0xcc,0xcc,0xcc,0xcc,0x00,0x00,0x00, - - 7, // 0x49 'I' - 0x00,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00, - - 7, // 0x4a 'J' - 0x00,0x00,0x3c,0x18,0x18,0x18,0x18,0x18,0x18,0xd8,0xd8,0x70,0x00,0x00,0x00, - - 7, // 0x4b 'K' - 0x00,0x00,0xcc,0xcc,0xd8,0xd8,0xf0,0xd8,0xd8,0xcc,0xcc,0xcc,0x00,0x00,0x00, - - 7, // 0x4c 'L' - 0x00,0x00,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc4,0xfc,0x00,0x00,0x00, - - 7, // 0x4d 'M' - 0x00,0x00,0x84,0xcc,0xfc,0xb4,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x00,0x00,0x00, - - 7, // 0x4e 'N' - 0x00,0x00,0xcc,0xcc,0xcc,0xec,0xfc,0xdc,0xcc,0xcc,0xcc,0xcc,0x00,0x00,0x00, - - 7, // 0x4f 'O' - 0x00,0x00,0x78,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00, - - 7, // 0x50 'P' - 0x00,0x00,0xf8,0xcc,0xcc,0xcc,0xcc,0xf8,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00, - - 7, // 0x51 'Q' - 0x00,0x00,0x78,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xdc,0x78,0x18,0x0c,0x00,0x00, - - 7, // 0x52 'R' - 0x00,0x00,0xf8,0xcc,0xcc,0xcc,0xcc,0xf8,0xd8,0xcc,0xcc,0xcc,0x00,0x00,0x00, - - 7, // 0x53 'S' - 0x00,0x00,0x78,0xcc,0xcc,0xe0,0x70,0x38,0x1c,0xcc,0xcc,0x78,0x00,0x00,0x00, - - 7, // 0x54 'T' - 0x00,0x00,0xfc,0xb4,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x00,0x00, - - 7, // 0x55 'U' - 0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00, - - 7, // 0x56 'V' - 0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x30,0x00,0x00,0x00, - - 7, // 0x57 'W' - 0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xb4,0xfc,0xcc,0x84,0x00,0x00,0x00, - - 7, // 0x58 'X' - 0x00,0x00,0xcc,0xcc,0xcc,0x78,0x30,0x78,0xcc,0xcc,0xcc,0xcc,0x00,0x00,0x00, - - 7, // 0x59 'Y' - 0x00,0x00,0xcc,0xcc,0xcc,0xcc,0x78,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00, - - 7, // 0x5a 'Z' - 0x00,0x00,0xfc,0x8c,0x0c,0x18,0x30,0x60,0xc0,0xc0,0xc4,0xfc,0x00,0x00,0x00, - - 7, // 0x5b '[' - 0x00,0x78,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x78,0x00,0x00, - - 7, // 0x5c '\' - 0x00,0x00,0xc0,0xc0,0x60,0x60,0x30,0x30,0x18,0x18,0x0c,0x0c,0x00,0x00,0x00, - - 7, // 0x5d ']' - 0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x78,0x00,0x00, - - 7, // 0x5e '^' - 0x00,0x10,0x38,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00, - - 7, // 0x60 '`' - 0x00,0x30,0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x70,0xd8,0x18,0x78,0xd8,0xd8,0xd8,0x6c,0x00,0x00,0x00, - - 7, // 0x62 'b' - 0x00,0x00,0x60,0x60,0x60,0x78,0x6c,0x6c,0x6c,0x6c,0x6c,0x78,0x00,0x00,0x00, - - 7, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x78,0xcc,0xc0,0xc0,0xc0,0xc0,0xcc,0x78,0x00,0x00,0x00, - - 7, // 0x64 'd' - 0x00,0x00,0x18,0x18,0x18,0x78,0xd8,0xd8,0xd8,0xd8,0xd8,0x6c,0x00,0x00,0x00, - - 7, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x78,0xcc,0xcc,0xfc,0xc0,0xc0,0xcc,0x78,0x00,0x00,0x00, - - 7, // 0x66 'f' - 0x00,0x00,0x30,0x68,0x60,0x60,0xf0,0x60,0x60,0x60,0x60,0xf0,0x00,0x00,0x00, - - 7, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x6c,0xd8,0xd8,0xd8,0xd8,0xd8,0x78,0x18,0xd8,0x70,0x00, - - 7, // 0x68 'h' - 0x00,0x00,0xc0,0xc0,0xc0,0xd8,0xec,0xcc,0xcc,0xcc,0xcc,0xcc,0x00,0x00,0x00, - - 7, // 0x69 'i' - 0x00,0x00,0x30,0x30,0x00,0x70,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00, - - 7, // 0x6a 'j' - 0x00,0x00,0x18,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0xd8,0xd8,0x70,0x00, - - 7, // 0x6b 'k' - 0x00,0x00,0xc0,0xc0,0xcc,0xcc,0xcc,0xd8,0xf0,0xd8,0xcc,0xcc,0x00,0x00,0x00, - - 7, // 0x6c 'l' - 0x00,0x00,0x70,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00, - - 7, // 0x6d 'm' - 0x00,0x00,0x00,0x00,0xe8,0xfc,0xd4,0xd4,0xd4,0xc4,0xc4,0xc4,0x00,0x00,0x00, - - 7, // 0x6e 'n' - 0x00,0x00,0x00,0x00,0xd8,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x00,0x00,0x00, - - 7, // 0x6f 'o' - 0x00,0x00,0x00,0x00,0x78,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00, - - 7, // 0x70 'p' - 0x00,0x00,0x00,0x00,0xf8,0xcc,0xcc,0xcc,0xcc,0xcc,0xf8,0xc0,0xc0,0xc0,0x00, - - 7, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x7c,0xcc,0xcc,0xcc,0xcc,0xcc,0x7c,0x0c,0x0c,0x0c,0x00, - - 7, // 0x72 'r' - 0x00,0x00,0x00,0x00,0xd8,0xec,0xcc,0xc0,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00, - - 7, // 0x73 's' - 0x00,0x00,0x00,0x00,0x78,0xcc,0xe0,0x70,0x38,0x1c,0xcc,0x78,0x00,0x00,0x00, - - 7, // 0x74 't' - 0x00,0x00,0x20,0x60,0x60,0xf0,0x60,0x60,0x60,0x60,0x6c,0x38,0x00,0x00,0x00, - - 7, // 0x75 'u' - 0x00,0x00,0x00,0x00,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0x6c,0x00,0x00,0x00, - - 7, // 0x76 'v' - 0x00,0x00,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x30,0x00,0x00,0x00, - - 7, // 0x77 'w' - 0x00,0x00,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xb4,0xfc,0xcc,0x84,0x00,0x00,0x00, - - 7, // 0x78 'x' - 0x00,0x00,0x00,0x00,0xcc,0xcc,0x78,0x30,0x78,0xcc,0xcc,0xcc,0x00,0x00,0x00, - - 7, // 0x79 'y' - 0x00,0x00,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x7c,0x0c,0x18,0xf0,0x00, - - 7, // 0x7a 'z' - 0x00,0x00,0x00,0x00,0xfc,0x8c,0x18,0x30,0x60,0xc0,0xc4,0xfc,0x00,0x00,0x00, - - 7, // 0x7b '{' - 0x00,0x1c,0x30,0x30,0x30,0x30,0x30,0xe0,0x30,0x30,0x30,0x30,0x1c,0x00,0x00, - - 7, // 0x7c '|' - 0x00,0x30,0x30,0x30,0x30,0x30,0x00,0x00,0x30,0x30,0x30,0x30,0x30,0x00,0x00, - - 7, // 0x7d '}' - 0x00,0xe0,0x30,0x30,0x30,0x30,0x30,0x1c,0x30,0x30,0x30,0x30,0xe0,0x00,0x00, - - 7, // 0x7e '~' - 0x00,0x00,0x34,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x7f '' - 0x00,0x00,0x00,0x00,0x00,0x30,0x78,0xcc,0xcc,0xfc,0x00,0x00,0x00,0x00,0x00, - 0 - }; - - const int8u gse8x16[] = - { - 16, 0, 32, 128-32, - - 0x00,0x00,0x11,0x00,0x22,0x00,0x33,0x00,0x44,0x00,0x55,0x00,0x66,0x00,0x77,0x00,0x88,0x00, - 0x99,0x00,0xaa,0x00,0xbb,0x00,0xcc,0x00,0xdd,0x00,0xee,0x00,0xff,0x00,0x10,0x01,0x21,0x01, - 0x32,0x01,0x43,0x01,0x54,0x01,0x65,0x01,0x76,0x01,0x87,0x01,0x98,0x01,0xa9,0x01,0xba,0x01, - 0xcb,0x01,0xdc,0x01,0xed,0x01,0xfe,0x01,0x0f,0x02,0x20,0x02,0x31,0x02,0x42,0x02,0x53,0x02, - 0x64,0x02,0x75,0x02,0x86,0x02,0x97,0x02,0xa8,0x02,0xb9,0x02,0xca,0x02,0xdb,0x02,0xec,0x02, - 0xfd,0x02,0x0e,0x03,0x1f,0x03,0x30,0x03,0x41,0x03,0x52,0x03,0x63,0x03,0x74,0x03,0x85,0x03, - 0x96,0x03,0xa7,0x03,0xb8,0x03,0xc9,0x03,0xda,0x03,0xeb,0x03,0xfc,0x03,0x0d,0x04,0x1e,0x04, - 0x2f,0x04,0x40,0x04,0x51,0x04,0x62,0x04,0x73,0x04,0x84,0x04,0x95,0x04,0xa6,0x04,0xb7,0x04, - 0xc8,0x04,0xd9,0x04,0xea,0x04,0xfb,0x04,0x0c,0x05,0x1d,0x05,0x2e,0x05,0x3f,0x05,0x50,0x05, - 0x61,0x05,0x72,0x05,0x83,0x05,0x94,0x05,0xa5,0x05,0xb6,0x05,0xc7,0x05,0xd8,0x05,0xe9,0x05, - 0xfa,0x05,0x0b,0x06,0x1c,0x06,0x2d,0x06,0x3e,0x06,0x4f,0x06, - - 8, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x21 '!' - 0x00,0x00,0x10,0x38,0x38,0x38,0x38,0x10,0x10,0x00,0x10,0x10,0x00,0x00,0x00,0x00, - - 8, // 0x22 '"' - 0x00,0x24,0x24,0x24,0x24,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x23 '#' - 0x00,0x00,0x24,0x24,0x24,0x7e,0x24,0x24,0x7e,0x24,0x24,0x24,0x00,0x00,0x00,0x00, - - 8, // 0x24 '$' - 0x00,0x14,0x14,0x3e,0x55,0x54,0x54,0x3e,0x15,0x15,0x55,0x3e,0x14,0x14,0x00,0x00, - - 8, // 0x25 '%' - 0x00,0x00,0x32,0x56,0x6c,0x04,0x08,0x08,0x10,0x13,0x25,0x26,0x00,0x00,0x00,0x00, - - 8, // 0x26 '&' - 0x00,0x00,0x18,0x24,0x24,0x24,0x18,0x28,0x45,0x46,0x44,0x3b,0x00,0x00,0x00,0x00, - - 8, // 0x27 ''' - 0x00,0x00,0x08,0x08,0x08,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x28 '(' - 0x00,0x04,0x08,0x10,0x10,0x20,0x20,0x20,0x20,0x10,0x10,0x08,0x04,0x00,0x00,0x00, - - 8, // 0x29 ')' - 0x00,0x10,0x08,0x04,0x04,0x02,0x02,0x02,0x02,0x04,0x04,0x08,0x10,0x00,0x00,0x00, - - 8, // 0x2a '*' - 0x00,0x00,0x00,0x00,0x66,0x24,0x18,0xff,0x18,0x24,0x66,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x2b '+' - 0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x7f,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x20,0x00, - - 8, // 0x2d '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00, - - 8, // 0x2f '/' - 0x00,0x02,0x02,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00,0x00,0x00, - - 8, // 0x30 '0' - 0x00,0x00,0x3c,0x42,0x42,0x46,0x4a,0x52,0x62,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x31 '1' - 0x00,0x00,0x08,0x08,0x18,0x38,0x08,0x08,0x08,0x08,0x08,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x32 '2' - 0x00,0x00,0x3c,0x42,0x42,0x02,0x04,0x08,0x10,0x20,0x42,0x7e,0x00,0x00,0x00,0x00, - - 8, // 0x33 '3' - 0x00,0x00,0x7e,0x42,0x04,0x08,0x1c,0x02,0x02,0x02,0x42,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x34 '4' - 0x00,0x00,0x04,0x08,0x10,0x24,0x44,0x44,0x7e,0x04,0x04,0x0e,0x00,0x00,0x00,0x00, - - 8, // 0x35 '5' - 0x00,0x00,0x7e,0x42,0x40,0x40,0x7c,0x02,0x02,0x02,0x42,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x36 '6' - 0x00,0x00,0x1c,0x20,0x40,0x40,0x7c,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x37 '7' - 0x00,0x00,0x7e,0x42,0x42,0x02,0x04,0x08,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00, - - 8, // 0x38 '8' - 0x00,0x00,0x3c,0x42,0x42,0x42,0x3c,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x39 '9' - 0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x3e,0x02,0x02,0x04,0x38,0x00,0x00,0x00,0x00, - - 8, // 0x3a ':' - 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x3b ';' - 0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x60,0x40,0x00, - - 8, // 0x3c '<' - 0x00,0x00,0x00,0x02,0x04,0x08,0x10,0x20,0x10,0x08,0x04,0x02,0x00,0x00,0x00,0x00, - - 8, // 0x3d '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x3e '>' - 0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x04,0x08,0x10,0x20,0x00,0x00,0x00,0x00, - - 8, // 0x3f '?' - 0x00,0x00,0x3c,0x42,0x42,0x42,0x04,0x08,0x08,0x00,0x08,0x08,0x00,0x00,0x00,0x00, - - 8, // 0x40 '@' - 0x00,0x00,0x3c,0x42,0x01,0x39,0x49,0x49,0x49,0x49,0x49,0x36,0x00,0x00,0x00,0x00, - - 8, // 0x41 'A' - 0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x7e,0x42,0x42,0x42,0x42,0x00,0x00,0x00,0x00, - - 8, // 0x42 'B' - 0x00,0x00,0x7c,0x22,0x22,0x22,0x3c,0x22,0x22,0x22,0x22,0x7c,0x00,0x00,0x00,0x00, - - 8, // 0x43 'C' - 0x00,0x00,0x3c,0x42,0x42,0x40,0x40,0x40,0x40,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x44 'D' - 0x00,0x00,0x7c,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x7c,0x00,0x00,0x00,0x00, - - 8, // 0x45 'E' - 0x00,0x00,0x7e,0x22,0x20,0x28,0x38,0x28,0x20,0x20,0x22,0x7e,0x00,0x00,0x00,0x00, - - 8, // 0x46 'F' - 0x00,0x00,0x7e,0x22,0x20,0x28,0x38,0x28,0x20,0x20,0x20,0x70,0x00,0x00,0x00,0x00, - - 8, // 0x47 'G' - 0x00,0x00,0x3c,0x42,0x42,0x40,0x40,0x4e,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x48 'H' - 0x00,0x00,0x42,0x42,0x42,0x42,0x7e,0x42,0x42,0x42,0x42,0x42,0x00,0x00,0x00,0x00, - - 8, // 0x49 'I' - 0x00,0x00,0x1c,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x1c,0x00,0x00,0x00,0x00, - - 8, // 0x4a 'J' - 0x00,0x00,0x0e,0x04,0x04,0x04,0x04,0x04,0x04,0x44,0x44,0x38,0x00,0x00,0x00,0x00, - - 8, // 0x4b 'K' - 0x00,0x00,0x62,0x22,0x24,0x28,0x30,0x28,0x24,0x22,0x22,0x62,0x00,0x00,0x00,0x00, - - 8, // 0x4c 'L' - 0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x7e,0x00,0x00,0x00,0x00, - - 8, // 0x4d 'M' - 0x00,0x00,0x41,0x63,0x55,0x49,0x41,0x41,0x41,0x41,0x41,0x41,0x00,0x00,0x00,0x00, - - 8, // 0x4e 'N' - 0x00,0x00,0x42,0x42,0x62,0x52,0x4a,0x46,0x42,0x42,0x42,0x42,0x00,0x00,0x00,0x00, - - 8, // 0x4f 'O' - 0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x50 'P' - 0x00,0x00,0x7c,0x22,0x22,0x22,0x22,0x3c,0x20,0x20,0x20,0x70,0x00,0x00,0x00,0x00, - - 8, // 0x51 'Q' - 0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x42,0x42,0x4a,0x44,0x3a,0x02,0x00,0x00,0x00, - - 8, // 0x52 'R' - 0x00,0x00,0x7c,0x22,0x22,0x22,0x22,0x3c,0x28,0x24,0x22,0x62,0x00,0x00,0x00,0x00, - - 8, // 0x53 'S' - 0x00,0x00,0x3c,0x42,0x42,0x40,0x30,0x0c,0x02,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x54 'T' - 0x00,0x00,0x7f,0x49,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x1c,0x00,0x00,0x00,0x00, - - 8, // 0x55 'U' - 0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x56 'V' - 0x00,0x00,0x41,0x41,0x41,0x41,0x22,0x22,0x14,0x14,0x08,0x08,0x00,0x00,0x00,0x00, - - 8, // 0x57 'W' - 0x00,0x00,0x41,0x41,0x41,0x41,0x41,0x49,0x49,0x55,0x63,0x41,0x00,0x00,0x00,0x00, - - 8, // 0x58 'X' - 0x00,0x00,0x42,0x42,0x42,0x24,0x18,0x18,0x24,0x42,0x42,0x42,0x00,0x00,0x00,0x00, - - 8, // 0x59 'Y' - 0x00,0x00,0x22,0x22,0x22,0x22,0x14,0x08,0x08,0x08,0x08,0x1c,0x00,0x00,0x00,0x00, - - 8, // 0x5a 'Z' - 0x00,0x00,0x7e,0x42,0x02,0x04,0x08,0x10,0x20,0x40,0x42,0x7e,0x00,0x00,0x00,0x00, - - 8, // 0x5b '[' - 0x00,0x1e,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1e,0x00,0x00,0x00, - - 8, // 0x5c '\' - 0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x02,0x02,0x00,0x00,0x00, - - 8, // 0x5d ']' - 0x00,0x3c,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x3c,0x00,0x00,0x00, - - 8, // 0x5e '^' - 0x00,0x00,0x08,0x14,0x22,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00, - - 8, // 0x60 '`' - 0x00,0x00,0x08,0x08,0x08,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x04,0x3c,0x44,0x44,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x62 'b' - 0x00,0x00,0x60,0x20,0x20,0x38,0x24,0x22,0x22,0x22,0x22,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x3c,0x42,0x40,0x40,0x40,0x42,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x64 'd' - 0x00,0x00,0x0c,0x04,0x04,0x1c,0x24,0x44,0x44,0x44,0x44,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x3c,0x42,0x42,0x7e,0x40,0x42,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x66 'f' - 0x00,0x00,0x0c,0x12,0x10,0x10,0x38,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00,0x00, - - 8, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x3e,0x44,0x44,0x44,0x44,0x44,0x3c,0x04,0x44,0x38,0x00, - - 8, // 0x68 'h' - 0x00,0x00,0x60,0x20,0x20,0x2c,0x32,0x22,0x22,0x22,0x22,0x62,0x00,0x00,0x00,0x00, - - 8, // 0x69 'i' - 0x00,0x00,0x08,0x08,0x00,0x18,0x08,0x08,0x08,0x08,0x08,0x1c,0x00,0x00,0x00,0x00, - - 8, // 0x6a 'j' - 0x00,0x00,0x04,0x04,0x00,0x0c,0x04,0x04,0x04,0x04,0x04,0x44,0x44,0x38,0x00,0x00, - - 8, // 0x6b 'k' - 0x00,0x00,0x60,0x20,0x20,0x22,0x24,0x28,0x38,0x24,0x22,0x62,0x00,0x00,0x00,0x00, - - 8, // 0x6c 'l' - 0x00,0x00,0x18,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x1c,0x00,0x00,0x00,0x00, - - 8, // 0x6d 'm' - 0x00,0x00,0x00,0x00,0x00,0x76,0x49,0x49,0x49,0x49,0x41,0x41,0x00,0x00,0x00,0x00, - - 8, // 0x6e 'n' - 0x00,0x00,0x00,0x00,0x00,0x5c,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00,0x00,0x00, - - 8, // 0x6f 'o' - 0x00,0x00,0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x7c,0x22,0x22,0x22,0x22,0x22,0x3c,0x20,0x20,0x70,0x00, - - 8, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x3e,0x44,0x44,0x44,0x44,0x44,0x3c,0x04,0x04,0x0e,0x00, - - 8, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x7c,0x22,0x22,0x20,0x20,0x20,0x70,0x00,0x00,0x00,0x00, - - 8, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x3c,0x42,0x40,0x3c,0x02,0x42,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x74 't' - 0x00,0x00,0x10,0x10,0x10,0x7c,0x10,0x10,0x10,0x10,0x12,0x0c,0x00,0x00,0x00,0x00, - - 8, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x41,0x41,0x41,0x41,0x22,0x14,0x08,0x00,0x00,0x00,0x00, - - 8, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x41,0x41,0x41,0x49,0x49,0x55,0x22,0x00,0x00,0x00,0x00, - - 8, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x00,0x00,0x00,0x00, - - 8, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x3e,0x02,0x04,0x78,0x00, - - 8, // 0x7a 'z' - 0x00,0x00,0x00,0x00,0x00,0x7e,0x44,0x08,0x10,0x20,0x42,0x7e,0x00,0x00,0x00,0x00, - - 8, // 0x7b '{' - 0x00,0x06,0x08,0x08,0x08,0x08,0x08,0x30,0x08,0x08,0x08,0x08,0x08,0x06,0x00,0x00, - - 8, // 0x7c '|' - 0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00, - - 8, // 0x7d '}' - 0x00,0x30,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x30,0x00,0x00, - - 8, // 0x7e '~' - 0x00,0x00,0x39,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x7f '' - 0x00,0x00,0x00,0x00,0x00,0x08,0x14,0x22,0x41,0x41,0x7f,0x00,0x00,0x00,0x00,0x00, - 0 - }; - - const int8u gse8x16_bold[] = - { - 16, 0, 32, 128-32, - - 0x00,0x00,0x11,0x00,0x22,0x00,0x33,0x00,0x44,0x00,0x55,0x00,0x66,0x00,0x77,0x00,0x88,0x00, - 0x99,0x00,0xaa,0x00,0xbb,0x00,0xcc,0x00,0xdd,0x00,0xee,0x00,0xff,0x00,0x10,0x01,0x21,0x01, - 0x32,0x01,0x43,0x01,0x54,0x01,0x65,0x01,0x76,0x01,0x87,0x01,0x98,0x01,0xa9,0x01,0xba,0x01, - 0xcb,0x01,0xdc,0x01,0xed,0x01,0xfe,0x01,0x0f,0x02,0x20,0x02,0x31,0x02,0x42,0x02,0x53,0x02, - 0x64,0x02,0x75,0x02,0x86,0x02,0x97,0x02,0xa8,0x02,0xb9,0x02,0xca,0x02,0xdb,0x02,0xec,0x02, - 0xfd,0x02,0x0e,0x03,0x1f,0x03,0x30,0x03,0x41,0x03,0x52,0x03,0x63,0x03,0x74,0x03,0x85,0x03, - 0x96,0x03,0xa7,0x03,0xb8,0x03,0xc9,0x03,0xda,0x03,0xeb,0x03,0xfc,0x03,0x0d,0x04,0x1e,0x04, - 0x2f,0x04,0x40,0x04,0x51,0x04,0x62,0x04,0x73,0x04,0x84,0x04,0x95,0x04,0xa6,0x04,0xb7,0x04, - 0xc8,0x04,0xd9,0x04,0xea,0x04,0xfb,0x04,0x0c,0x05,0x1d,0x05,0x2e,0x05,0x3f,0x05,0x50,0x05, - 0x61,0x05,0x72,0x05,0x83,0x05,0x94,0x05,0xa5,0x05,0xb6,0x05,0xc7,0x05,0xd8,0x05,0xe9,0x05, - 0xfa,0x05,0x0b,0x06,0x1c,0x06,0x2d,0x06,0x3e,0x06,0x4f,0x06, - - 8, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x21 '!' - 0x00,0x00,0x18,0x3c,0x3c,0x3c,0x3c,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00, - - 8, // 0x22 '"' - 0x00,0x66,0x66,0x66,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x23 '#' - 0x00,0x00,0x66,0x66,0x66,0xff,0x66,0x66,0xff,0x66,0x66,0x66,0x00,0x00,0x00,0x00, - - 8, // 0x24 '$' - 0x00,0x08,0x08,0x3e,0x6b,0x6b,0x68,0x3e,0x0b,0x6b,0x6b,0x3e,0x08,0x08,0x00,0x00, - - 8, // 0x25 '%' - 0x00,0x00,0x66,0xbe,0xcc,0x0c,0x18,0x18,0x30,0x33,0x65,0x66,0x00,0x00,0x00,0x00, - - 8, // 0x26 '&' - 0x00,0x00,0x1c,0x36,0x36,0x36,0x1c,0x3b,0x6e,0x66,0x66,0x3b,0x00,0x00,0x00,0x00, - - 8, // 0x27 ''' - 0x00,0x00,0x18,0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x28 '(' - 0x00,0x06,0x0c,0x18,0x18,0x30,0x30,0x30,0x30,0x18,0x18,0x0c,0x06,0x00,0x00,0x00, - - 8, // 0x29 ')' - 0x00,0x30,0x18,0x0c,0x0c,0x06,0x06,0x06,0x06,0x0c,0x0c,0x18,0x30,0x00,0x00,0x00, - - 8, // 0x2a '*' - 0x00,0x00,0x00,0x00,0x66,0x24,0x18,0xff,0x18,0x24,0x66,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x2b '+' - 0x00,0x00,0x00,0x00,0x18,0x18,0x18,0xff,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x20,0x00, - - 8, // 0x2d '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00, - - 8, // 0x2f '/' - 0x00,0x03,0x03,0x06,0x06,0x0c,0x0c,0x18,0x18,0x30,0x30,0x60,0x60,0x00,0x00,0x00, - - 8, // 0x30 '0' - 0x00,0x00,0x3e,0x63,0x63,0x67,0x6b,0x73,0x63,0x63,0x63,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x31 '1' - 0x00,0x00,0x0c,0x0c,0x1c,0x3c,0x0c,0x0c,0x0c,0x0c,0x0c,0x3f,0x00,0x00,0x00,0x00, - - 8, // 0x32 '2' - 0x00,0x00,0x3e,0x63,0x63,0x03,0x06,0x0c,0x18,0x30,0x61,0x7f,0x00,0x00,0x00,0x00, - - 8, // 0x33 '3' - 0x00,0x00,0x7f,0x43,0x06,0x0c,0x1e,0x03,0x03,0x03,0x63,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x34 '4' - 0x00,0x00,0x06,0x0c,0x18,0x32,0x66,0x66,0x7f,0x06,0x06,0x0f,0x00,0x00,0x00,0x00, - - 8, // 0x35 '5' - 0x00,0x00,0x7f,0x61,0x60,0x60,0x7e,0x03,0x03,0x03,0x63,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x36 '6' - 0x00,0x00,0x1e,0x30,0x60,0x60,0x7e,0x63,0x63,0x63,0x63,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x37 '7' - 0x00,0x00,0x7f,0x63,0x63,0x03,0x06,0x0c,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00, - - 8, // 0x38 '8' - 0x00,0x00,0x3e,0x63,0x63,0x63,0x3e,0x63,0x63,0x63,0x63,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x39 '9' - 0x00,0x00,0x3e,0x63,0x63,0x63,0x63,0x3f,0x03,0x03,0x06,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x3a ':' - 0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x3b ';' - 0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x60,0x40,0x00, - - 8, // 0x3c '<' - 0x00,0x00,0x00,0x06,0x0c,0x18,0x30,0x60,0x30,0x18,0x0c,0x06,0x00,0x00,0x00,0x00, - - 8, // 0x3d '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x3e '>' - 0x00,0x00,0x00,0x30,0x18,0x0c,0x06,0x03,0x06,0x0c,0x18,0x30,0x00,0x00,0x00,0x00, - - 8, // 0x3f '?' - 0x00,0x00,0x3e,0x63,0x63,0x63,0x06,0x0c,0x0c,0x00,0x0c,0x0c,0x00,0x00,0x00,0x00, - - 8, // 0x40 '@' - 0x00,0x00,0x7c,0x86,0x03,0x73,0xdb,0xdb,0xdb,0xdb,0xdb,0x6e,0x00,0x00,0x00,0x00, - - 8, // 0x41 'A' - 0x00,0x00,0x08,0x1c,0x36,0x63,0x63,0x63,0x7f,0x63,0x63,0x63,0x00,0x00,0x00,0x00, - - 8, // 0x42 'B' - 0x00,0x00,0x7e,0x33,0x33,0x33,0x3e,0x33,0x33,0x33,0x33,0x7e,0x00,0x00,0x00,0x00, - - 8, // 0x43 'C' - 0x00,0x00,0x1e,0x33,0x61,0x60,0x60,0x60,0x60,0x61,0x33,0x1e,0x00,0x00,0x00,0x00, - - 8, // 0x44 'D' - 0x00,0x00,0x7c,0x36,0x33,0x33,0x33,0x33,0x33,0x33,0x36,0x7c,0x00,0x00,0x00,0x00, - - 8, // 0x45 'E' - 0x00,0x00,0x7f,0x33,0x31,0x34,0x3c,0x34,0x30,0x31,0x33,0x7f,0x00,0x00,0x00,0x00, - - 8, // 0x46 'F' - 0x00,0x00,0x7f,0x33,0x31,0x34,0x3c,0x34,0x30,0x30,0x30,0x78,0x00,0x00,0x00,0x00, - - 8, // 0x47 'G' - 0x00,0x00,0x1f,0x33,0x61,0x60,0x60,0x6f,0x63,0x63,0x33,0x1e,0x00,0x00,0x00,0x00, - - 8, // 0x48 'H' - 0x00,0x00,0x63,0x63,0x63,0x63,0x7f,0x63,0x63,0x63,0x63,0x63,0x00,0x00,0x00,0x00, - - 8, // 0x49 'I' - 0x00,0x00,0x1e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x1e,0x00,0x00,0x00,0x00, - - 8, // 0x4a 'J' - 0x00,0x00,0x0f,0x06,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x4b 'K' - 0x00,0x00,0x73,0x33,0x36,0x36,0x3c,0x36,0x36,0x33,0x33,0x73,0x00,0x00,0x00,0x00, - - 8, // 0x4c 'L' - 0x00,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x33,0x7f,0x00,0x00,0x00,0x00, - - 8, // 0x4d 'M' - 0x00,0x00,0x63,0x63,0x77,0x77,0x7f,0x6b,0x6b,0x63,0x63,0x63,0x00,0x00,0x00,0x00, - - 8, // 0x4e 'N' - 0x00,0x00,0x63,0x63,0x73,0x7b,0x6f,0x67,0x63,0x63,0x63,0x63,0x00,0x00,0x00,0x00, - - 8, // 0x4f 'O' - 0x00,0x00,0x1c,0x36,0x63,0x63,0x63,0x63,0x63,0x63,0x36,0x1c,0x00,0x00,0x00,0x00, - - 8, // 0x50 'P' - 0x00,0x00,0x7e,0x33,0x33,0x33,0x33,0x3e,0x30,0x30,0x30,0x78,0x00,0x00,0x00,0x00, - - 8, // 0x51 'Q' - 0x00,0x00,0x1c,0x36,0x63,0x63,0x63,0x63,0x63,0x6f,0x36,0x1e,0x03,0x00,0x00,0x00, - - 8, // 0x52 'R' - 0x00,0x00,0x7e,0x33,0x33,0x33,0x33,0x3e,0x36,0x33,0x33,0x73,0x00,0x00,0x00,0x00, - - 8, // 0x53 'S' - 0x00,0x00,0x3e,0x63,0x63,0x30,0x18,0x0c,0x06,0x63,0x63,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x54 'T' - 0x00,0x00,0x3f,0x3f,0x2d,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x1e,0x00,0x00,0x00,0x00, - - 8, // 0x55 'U' - 0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x56 'V' - 0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x36,0x1c,0x08,0x00,0x00,0x00,0x00, - - 8, // 0x57 'W' - 0x00,0x00,0x63,0x63,0x63,0x6b,0x6b,0x7f,0x77,0x77,0x63,0x63,0x00,0x00,0x00,0x00, - - 8, // 0x58 'X' - 0x00,0x00,0x63,0x63,0x63,0x36,0x1c,0x1c,0x36,0x63,0x63,0x63,0x00,0x00,0x00,0x00, - - 8, // 0x59 'Y' - 0x00,0x00,0x33,0x33,0x33,0x33,0x1e,0x0c,0x0c,0x0c,0x0c,0x1e,0x00,0x00,0x00,0x00, - - 8, // 0x5a 'Z' - 0x00,0x00,0x7f,0x63,0x43,0x06,0x0c,0x18,0x30,0x61,0x63,0x7f,0x00,0x00,0x00,0x00, - - 8, // 0x5b '[' - 0x00,0x1f,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1f,0x00,0x00,0x00, - - 8, // 0x5c '\' - 0x00,0x60,0x60,0x30,0x30,0x18,0x18,0x0c,0x0c,0x06,0x06,0x03,0x03,0x00,0x00,0x00, - - 8, // 0x5d ']' - 0x00,0x7c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x7c,0x00,0x00,0x00, - - 8, // 0x5e '^' - 0x00,0x00,0x08,0x1c,0x36,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00, - - 8, // 0x60 '`' - 0x00,0x00,0x18,0x18,0x18,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x3c,0x66,0x06,0x3e,0x66,0x66,0x3b,0x00,0x00,0x00,0x00, - - 8, // 0x62 'b' - 0x00,0x00,0x70,0x30,0x30,0x3c,0x36,0x33,0x33,0x33,0x33,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x3e,0x63,0x63,0x60,0x60,0x63,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x64 'd' - 0x00,0x00,0x0e,0x06,0x06,0x1e,0x36,0x66,0x66,0x66,0x66,0x3b,0x00,0x00,0x00,0x00, - - 8, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x3e,0x63,0x63,0x7f,0x60,0x63,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x66 'f' - 0x00,0x00,0x0e,0x1b,0x1b,0x18,0x3c,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x3b,0x66,0x66,0x66,0x66,0x66,0x3e,0x06,0x66,0x3c,0x00, - - 8, // 0x68 'h' - 0x00,0x00,0x70,0x30,0x30,0x36,0x3b,0x33,0x33,0x33,0x33,0x73,0x00,0x00,0x00,0x00, - - 8, // 0x69 'i' - 0x00,0x00,0x0c,0x0c,0x00,0x1c,0x0c,0x0c,0x0c,0x0c,0x0c,0x1e,0x00,0x00,0x00,0x00, - - 8, // 0x6a 'j' - 0x00,0x00,0x06,0x06,0x00,0x0e,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3c,0x00,0x00, - - 8, // 0x6b 'k' - 0x00,0x00,0x70,0x30,0x30,0x33,0x33,0x36,0x3c,0x36,0x33,0x73,0x00,0x00,0x00,0x00, - - 8, // 0x6c 'l' - 0x00,0x00,0x1c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x1e,0x00,0x00,0x00,0x00, - - 8, // 0x6d 'm' - 0x00,0x00,0x00,0x00,0x00,0x76,0x7f,0x6b,0x6b,0x6b,0x63,0x63,0x00,0x00,0x00,0x00, - - 8, // 0x6e 'n' - 0x00,0x00,0x00,0x00,0x00,0x6e,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0x00,0x00,0x00, - - 8, // 0x6f 'o' - 0x00,0x00,0x00,0x00,0x00,0x3e,0x63,0x63,0x63,0x63,0x63,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x6e,0x33,0x33,0x33,0x33,0x33,0x3e,0x30,0x30,0x78,0x00, - - 8, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x3b,0x66,0x66,0x66,0x66,0x66,0x3e,0x06,0x06,0x0f,0x00, - - 8, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x6e,0x3b,0x33,0x30,0x30,0x30,0x78,0x00,0x00,0x00,0x00, - - 8, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x3e,0x63,0x60,0x3e,0x03,0x63,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x74 't' - 0x00,0x00,0x08,0x18,0x18,0x7e,0x18,0x18,0x18,0x18,0x1b,0x0e,0x00,0x00,0x00,0x00, - - 8, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x3b,0x00,0x00,0x00,0x00, - - 8, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x63,0x63,0x36,0x1c,0x08,0x00,0x00,0x00,0x00, - - 8, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x6b,0x6b,0x7f,0x36,0x36,0x00,0x00,0x00,0x00, - - 8, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x36,0x1c,0x36,0x63,0x63,0x00,0x00,0x00,0x00, - - 8, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x63,0x3f,0x03,0x06,0x7c,0x00, - - 8, // 0x7a 'z' - 0x00,0x00,0x00,0x00,0x00,0x7f,0x63,0x06,0x0c,0x18,0x31,0x7f,0x00,0x00,0x00,0x00, - - 8, // 0x7b '{' - 0x00,0x03,0x04,0x0c,0x0c,0x0c,0x08,0x30,0x08,0x0c,0x0c,0x0c,0x04,0x03,0x00,0x00, - - 8, // 0x7c '|' - 0x00,0x00,0x0c,0x0c,0x0c,0x0c,0x0c,0x00,0x0c,0x0c,0x0c,0x0c,0x0c,0x00,0x00,0x00, - - 8, // 0x7d '}' - 0x00,0x60,0x10,0x18,0x18,0x18,0x08,0x06,0x08,0x18,0x18,0x18,0x10,0x60,0x00,0x00, - - 8, // 0x7e '~' - 0x00,0x00,0x3b,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x7f '' - 0x00,0x00,0x00,0x00,0x00,0x08,0x1c,0x36,0x63,0x63,0x7f,0x00,0x00,0x00,0x00,0x00, - 0 - }; - - const int8u mcs11_prop[] = - { - 11, 2, 32, 128-32, - 0x00,0x00,0x0C,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x3C,0x00,0x48,0x00,0x54,0x00,0x60,0x00, - 0x6C,0x00,0x78,0x00,0x84,0x00,0x90,0x00,0x9C,0x00,0xA8,0x00,0xB4,0x00,0xC0,0x00,0xCC,0x00, - 0xD8,0x00,0xE4,0x00,0xF0,0x00,0xFC,0x00,0x08,0x01,0x14,0x01,0x20,0x01,0x2C,0x01,0x38,0x01, - 0x44,0x01,0x50,0x01,0x5C,0x01,0x68,0x01,0x74,0x01,0x80,0x01,0x8C,0x01,0x98,0x01,0xA4,0x01, - 0xB0,0x01,0xBC,0x01,0xC8,0x01,0xD4,0x01,0xE0,0x01,0xEC,0x01,0xF8,0x01,0x04,0x02,0x10,0x02, - 0x1C,0x02,0x28,0x02,0x34,0x02,0x40,0x02,0x4C,0x02,0x58,0x02,0x64,0x02,0x70,0x02,0x7C,0x02, - 0x88,0x02,0x94,0x02,0xA0,0x02,0xAC,0x02,0xB8,0x02,0xC4,0x02,0xD0,0x02,0xDC,0x02,0xE8,0x02, - 0xF4,0x02,0x00,0x03,0x0C,0x03,0x18,0x03,0x24,0x03,0x30,0x03,0x3C,0x03,0x48,0x03,0x54,0x03, - 0x60,0x03,0x6C,0x03,0x78,0x03,0x84,0x03,0x90,0x03,0x9C,0x03,0xA8,0x03,0xB4,0x03,0xC0,0x03, - 0xCC,0x03,0xD8,0x03,0xE4,0x03,0xF0,0x03,0xFC,0x03,0x08,0x04,0x14,0x04,0x20,0x04,0x2C,0x04, - 0x38,0x04,0x44,0x04,0x50,0x04,0x5C,0x04,0x68,0x04,0x74,0x04, - - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x21 '!' - 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00, - - 4, // 0x22 '"' - 0x50,0x50,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x23 '#' - 0x00,0x28,0x28,0x7C,0x28,0x28,0x28,0x7C,0x28,0x28,0x00, - - 6, // 0x24 '$' - 0x10,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x10, - - 6, // 0x25 '%' - 0x00,0x00,0x68,0xA8,0xD0,0x10,0x20,0x2C,0x54,0x58,0x00, - - 6, // 0x26 '&' - 0x00,0x20,0x50,0x50,0x50,0x20,0x54,0x54,0x48,0x34,0x00, - - 3, // 0x27 ''' - 0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x28 '(' - 0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10, - - 5, // 0x29 ')' - 0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x20,0x40, - - 6, // 0x2A '*' - 0x00,0x00,0x28,0x7C,0x38,0x7C,0x28,0x00,0x00,0x00,0x00, - - 6, // 0x2B '+' - 0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00, - - 4, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0xC0, - - 6, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00, - - 7, // 0x2F '/' - 0x00,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40, - - 6, // 0x30 '0' - 0x00,0x38,0x44,0x44,0x54,0x54,0x54,0x44,0x44,0x38,0x00, - - 4, // 0x31 '1' - 0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00, - - 6, // 0x32 '2' - 0x00,0x38,0x44,0x44,0x04,0x08,0x10,0x20,0x40,0x7C,0x00, - - 6, // 0x33 '3' - 0x00,0x38,0x44,0x04,0x04,0x38,0x04,0x04,0x44,0x38,0x00, - - 6, // 0x34 '4' - 0x00,0x08,0x18,0x18,0x28,0x28,0x48,0x7C,0x08,0x08,0x00, - - 6, // 0x35 '5' - 0x00,0x7C,0x40,0x40,0x78,0x44,0x04,0x04,0x44,0x38,0x00, - - 6, // 0x36 '6' - 0x00,0x38,0x44,0x40,0x40,0x78,0x44,0x44,0x44,0x38,0x00, - - 6, // 0x37 '7' - 0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x20,0x00, - - 6, // 0x38 '8' - 0x00,0x38,0x44,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00, - - 6, // 0x39 '9' - 0x00,0x38,0x44,0x44,0x44,0x3C,0x04,0x04,0x44,0x38,0x00, - - 4, // 0x3A ':' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x00, - - 4, // 0x3B ';' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0xC0, - - 6, // 0x3C '<' - 0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00, - - 6, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00, - - 6, // 0x3E '>' - 0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00, - - 6, // 0x3F '?' - 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x10,0x00,0x10,0x00, - - 6, // 0x40 '@' - 0x00,0x38,0x44,0x44,0x5C,0x54,0x54,0x4C,0x40,0x38,0x00, - - 6, // 0x41 'A' - 0x00,0x38,0x44,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x00, - - 6, // 0x42 'B' - 0x00,0x78,0x44,0x44,0x44,0x78,0x44,0x44,0x44,0x78,0x00, - - 6, // 0x43 'C' - 0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x40,0x44,0x38,0x00, - - 6, // 0x44 'D' - 0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x44,0x48,0x70,0x00, - - 6, // 0x45 'E' - 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x7C,0x00, - - 6, // 0x46 'F' - 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x40,0x00, - - 6, // 0x47 'G' - 0x00,0x38,0x44,0x40,0x40,0x5C,0x44,0x44,0x4C,0x34,0x00, - - 6, // 0x48 'H' - 0x00,0x44,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00, - - 4, // 0x49 'I' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00, - - 6, // 0x4A 'J' - 0x00,0x1C,0x08,0x08,0x08,0x08,0x08,0x08,0x48,0x30,0x00, - - 6, // 0x4B 'K' - 0x00,0x44,0x48,0x50,0x60,0x60,0x50,0x48,0x44,0x44,0x00, - - 6, // 0x4C 'L' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00, - - 8, // 0x4D 'M' - 0x00,0x41,0x63,0x55,0x49,0x49,0x41,0x41,0x41,0x41,0x00, - - 7, // 0x4E 'N' - 0x00,0x42,0x42,0x62,0x52,0x4A,0x46,0x42,0x42,0x42,0x00, - - 6, // 0x4F 'O' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00, - - 6, // 0x50 'P' - 0x00,0x78,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x40,0x00, - - 6, // 0x51 'Q' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00, - - 6, // 0x52 'R' - 0x00,0x78,0x44,0x44,0x44,0x78,0x44,0x44,0x44,0x44,0x00, - - 6, // 0x53 'S' - 0x00,0x38,0x44,0x40,0x40,0x38,0x04,0x04,0x44,0x38,0x00, - - 6, // 0x54 'T' - 0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00, - - 6, // 0x55 'U' - 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00, - - 6, // 0x56 'V' - 0x00,0x44,0x44,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x00, - - 8, // 0x57 'W' - 0x00,0x41,0x41,0x41,0x41,0x49,0x49,0x49,0x55,0x22,0x00, - - 6, // 0x58 'X' - 0x00,0x44,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00, - - 6, // 0x59 'Y' - 0x00,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x10,0x00, - - 6, // 0x5A 'Z' - 0x00,0x7C,0x04,0x04,0x08,0x10,0x20,0x40,0x40,0x7C,0x00, - - 5, // 0x5B '[' - 0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30, - - 7, // 0x5C '\' - 0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x00, - - 4, // 0x5D ']' - 0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x60, - - 6, // 0x5E '^' - 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00, - - 4, // 0x60 '`' - 0x00,0x40,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x61 'a' - 0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x44,0x44,0x3C,0x00, - - 6, // 0x62 'b' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x00, - - 6, // 0x63 'c' - 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x40,0x44,0x38,0x00, - - 6, // 0x64 'd' - 0x00,0x04,0x04,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x00, - - 6, // 0x65 'e' - 0x00,0x00,0x00,0x38,0x44,0x44,0x7C,0x40,0x44,0x38,0x00, - - 4, // 0x66 'f' - 0x00,0x10,0x20,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x00, - - 6, // 0x67 'g' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x3C,0x04,0x44,0x38, - - 6, // 0x68 'h' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x44,0x00, - - 2, // 0x69 'i' - 0x00,0x40,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00, - - 3, // 0x6A 'j' - 0x00,0x20,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x40, - - 5, // 0x6B 'k' - 0x00,0x40,0x40,0x48,0x50,0x60,0x60,0x50,0x48,0x48,0x00, - - 2, // 0x6C 'l' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00, - - 8, // 0x6D 'm' - 0x00,0x00,0x00,0x76,0x49,0x49,0x49,0x49,0x41,0x41,0x00, - - 6, // 0x6E 'n' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x44,0x00, - - 6, // 0x6F 'o' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x38,0x00, - - 6, // 0x70 'p' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40, - - 6, // 0x71 'q' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x3C,0x04,0x04, - - 6, // 0x72 'r' - 0x00,0x00,0x00,0x58,0x24,0x20,0x20,0x20,0x20,0x20,0x00, - - 6, // 0x73 's' - 0x00,0x00,0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x38,0x00, - - 5, // 0x74 't' - 0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x20,0x28,0x10,0x00, - - 6, // 0x75 'u' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x4C,0x34,0x00, - - 6, // 0x76 'v' - 0x00,0x00,0x00,0x44,0x44,0x44,0x28,0x28,0x10,0x10,0x00, - - 8, // 0x77 'w' - 0x00,0x00,0x00,0x41,0x41,0x41,0x41,0x49,0x49,0x36,0x00, - - 6, // 0x78 'x' - 0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00, - - 6, // 0x79 'y' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x3C,0x04,0x08,0x70, - - 6, // 0x7A 'z' - 0x00,0x00,0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x7C,0x00, - - 5, // 0x7B '{' - 0x18,0x20,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x20,0x18, - - 3, // 0x7C '|' - 0x00,0x40,0x40,0x40,0x40,0x00,0x40,0x40,0x40,0x40,0x00, - - 5, // 0x7D '}' - 0xC0,0x20,0x20,0x20,0x20,0x18,0x20,0x20,0x20,0x20,0xC0, - - 6, // 0x7E '~' - 0x00,0x24,0x54,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x7F '' - 0x00,0x10,0x38,0x6C,0x44,0x44,0x7C,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u mcs11_prop_condensed[] = - { - 11, 2, 32, 128-32, - 0x00,0x00,0x0C,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x3C,0x00,0x48,0x00,0x54,0x00,0x60,0x00, - 0x6C,0x00,0x78,0x00,0x84,0x00,0x90,0x00,0x9C,0x00,0xA8,0x00,0xB4,0x00,0xC0,0x00,0xCC,0x00, - 0xD8,0x00,0xE4,0x00,0xF0,0x00,0xFC,0x00,0x08,0x01,0x14,0x01,0x20,0x01,0x2C,0x01,0x38,0x01, - 0x44,0x01,0x50,0x01,0x5C,0x01,0x68,0x01,0x74,0x01,0x80,0x01,0x8C,0x01,0x98,0x01,0xA4,0x01, - 0xB0,0x01,0xBC,0x01,0xC8,0x01,0xD4,0x01,0xE0,0x01,0xEC,0x01,0xF8,0x01,0x04,0x02,0x10,0x02, - 0x1C,0x02,0x28,0x02,0x34,0x02,0x40,0x02,0x4C,0x02,0x58,0x02,0x64,0x02,0x70,0x02,0x7C,0x02, - 0x88,0x02,0x94,0x02,0xA0,0x02,0xAC,0x02,0xB8,0x02,0xC4,0x02,0xD0,0x02,0xDC,0x02,0xE8,0x02, - 0xF4,0x02,0x00,0x03,0x0C,0x03,0x18,0x03,0x24,0x03,0x30,0x03,0x3C,0x03,0x48,0x03,0x54,0x03, - 0x60,0x03,0x6C,0x03,0x78,0x03,0x84,0x03,0x90,0x03,0x9C,0x03,0xA8,0x03,0xB4,0x03,0xC0,0x03, - 0xCC,0x03,0xD8,0x03,0xE4,0x03,0xF0,0x03,0xFC,0x03,0x08,0x04,0x14,0x04,0x20,0x04,0x2C,0x04, - 0x38,0x04,0x44,0x04,0x50,0x04,0x5C,0x04,0x68,0x04,0x74,0x04, - - 3, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 3, // 0x21 '!' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x40,0x00, - - 4, // 0x22 '"' - 0x50,0x50,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x23 '#' - 0x00,0x50,0x50,0xF8,0x50,0x50,0x50,0xF8,0x50,0x50,0x00, - - 5, // 0x24 '$' - 0x00,0x40,0x60,0x90,0x80,0x60,0x10,0x90,0x60,0x20,0x00, - - 5, // 0x25 '%' - 0x00,0x00,0x90,0x90,0x20,0x20,0x40,0x40,0x90,0x90,0x00, - - 5, // 0x26 '&' - 0x00,0x40,0xA0,0xA0,0xA0,0x40,0xA8,0x90,0x90,0x68,0x00, - - 5, // 0x27 ''' - 0x00,0x00,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x28 '(' - 0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10, - - 4, // 0x29 ')' - 0x80,0x40,0x40,0x20,0x20,0x20,0x20,0x20,0x40,0x40,0x80, - - 5, // 0x2A '*' - 0x00,0x00,0x90,0x60,0xF0,0x60,0x90,0x00,0x00,0x00,0x00, - - 5, // 0x2B '+' - 0x00,0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x00,0x00,0x00, - - 4, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0xC0, - - 5, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00, - - 6, // 0x2F '/' - 0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80,0x00, - - 5, // 0x30 '0' - 0x00,0x70,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xE0,0x00, - - 3, // 0x31 '1' - 0x00,0x40,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00, - - 5, // 0x32 '2' - 0x00,0x60,0x90,0x90,0x10,0x10,0x20,0x40,0x80,0xF0,0x00, - - 5, // 0x33 '3' - 0x00,0x60,0x90,0x10,0x10,0x60,0x10,0x10,0x90,0x60,0x00, - - 5, // 0x34 '4' - 0x00,0x10,0x30,0x30,0x50,0x50,0x90,0xF0,0x10,0x10,0x00, - - 5, // 0x35 '5' - 0x00,0xF0,0x80,0x80,0xE0,0x90,0x10,0x10,0x90,0x60,0x00, - - 5, // 0x36 '6' - 0x00,0x60,0x90,0x80,0x80,0xE0,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x37 '7' - 0x00,0xF0,0x10,0x10,0x10,0x20,0x20,0x40,0x40,0x40,0x00, - - 5, // 0x38 '8' - 0x00,0x60,0x90,0x90,0x90,0x60,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x39 '9' - 0x00,0x60,0x90,0x90,0x90,0x70,0x10,0x10,0x90,0x60,0x00, - - 4, // 0x3A ':' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x00, - - 4, // 0x3B ';' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0xC0, - - 6, // 0x3C '<' - 0x00,0x08,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x08,0x00, - - 5, // 0x3D '=' - 0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0xF0,0x00,0x00,0x00, - - 6, // 0x3E '>' - 0x00,0x80,0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x80,0x00, - - 5, // 0x3F '?' - 0x00,0x60,0x90,0x10,0x10,0x20,0x40,0x00,0x40,0x00,0x00, - - 5, // 0x40 '@' - 0x00,0x60,0x90,0x90,0xB0,0xB0,0xB0,0x80,0x80,0x70,0x00, - - 5, // 0x41 'A' - 0x00,0x60,0x90,0x90,0x90,0xF0,0x90,0x90,0x90,0x90,0x00, - - 5, // 0x42 'B' - 0x00,0xE0,0x90,0x90,0x90,0xE0,0x90,0x90,0x90,0xE0,0x00, - - 5, // 0x43 'C' - 0x00,0x60,0x90,0x80,0x80,0x80,0x80,0x80,0x90,0x60,0x00, - - 5, // 0x44 'D' - 0x00,0xE0,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xE0,0x00, - - 5, // 0x45 'E' - 0x00,0xF0,0x80,0x80,0x80,0xF0,0x80,0x80,0x80,0xF0,0x00, - - 5, // 0x46 'F' - 0x00,0xF0,0x80,0x80,0x80,0xF0,0x80,0x80,0x80,0x80,0x00, - - 5, // 0x47 'G' - 0x00,0x70,0x80,0x80,0x80,0xB0,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x48 'H' - 0x00,0x90,0x90,0x90,0x90,0xF0,0x90,0x90,0x90,0x90,0x00, - - 4, // 0x49 'I' - 0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xE0,0x00, - - 5, // 0x4A 'J' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0xA0,0xA0,0x40,0x00, - - 5, // 0x4B 'K' - 0x00,0x90,0x90,0xA0,0xA0,0xC0,0xA0,0xA0,0x90,0x90,0x00, - - 5, // 0x4C 'L' - 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xF0,0x00, - - 6, // 0x4D 'M' - 0x00,0x88,0xD8,0xA8,0xA8,0xA8,0x88,0x88,0x88,0x88,0x00, - - 5, // 0x4E 'N' - 0x00,0x90,0x90,0xD0,0xD0,0xB0,0xB0,0x90,0x90,0x90,0x00, - - 5, // 0x4F 'O' - 0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x50 'P' - 0x00,0xE0,0x90,0x90,0x90,0x90,0xE0,0x80,0x80,0x80,0x00, - - 5, // 0x51 'Q' - 0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x30, - - 5, // 0x52 'R' - 0x00,0xE0,0x90,0x90,0x90,0x90,0xE0,0xA0,0x90,0x90,0x00, - - 5, // 0x53 'S' - 0x00,0x60,0x90,0x80,0x80,0x60,0x10,0x10,0x90,0x60,0x00, - - 6, // 0x54 'T' - 0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00, - - 5, // 0x55 'U' - 0x00,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00, - - 6, // 0x56 'V' - 0x00,0x88,0x88,0x88,0x88,0x50,0x50,0x50,0x20,0x20,0x00, - - 6, // 0x57 'W' - 0x00,0x88,0x88,0x88,0xA8,0xA8,0xA8,0xA8,0xA8,0x50,0x00, - - 5, // 0x58 'X' - 0x00,0x90,0x90,0x90,0x60,0x60,0x90,0x90,0x90,0x90,0x00, - - 6, // 0x59 'Y' - 0x00,0x88,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x20,0x00, - - 5, // 0x5A 'Z' - 0x00,0xF0,0x10,0x20,0x20,0x40,0x40,0x80,0x80,0xF0,0x00, - - 4, // 0x5B '[' - 0x60,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x60,0x00, - - 6, // 0x5C '\' - 0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x00, - - 4, // 0x5D ']' - 0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x60,0x00, - - 5, // 0x5E '^' - 0x00,0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00, - - 5, // 0x60 '`' - 0x00,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x61 'a' - 0x00,0x00,0x00,0x60,0x90,0x10,0x70,0x90,0x90,0x70,0x00, - - 5, // 0x62 'b' - 0x00,0x80,0x80,0x80,0xE0,0x90,0x90,0x90,0x90,0xE0,0x00, - - 5, // 0x63 'c' - 0x00,0x00,0x00,0x60,0x90,0x80,0x80,0x80,0x90,0x60,0x00, - - 5, // 0x64 'd' - 0x00,0x10,0x10,0x10,0x70,0x90,0x90,0x90,0x90,0x70,0x00, - - 5, // 0x65 'e' - 0x00,0x00,0x00,0x60,0x90,0x90,0xF0,0x80,0x90,0x60,0x00, - - 4, // 0x66 'f' - 0x00,0x20,0x40,0x40,0xE0,0x40,0x40,0x40,0x40,0x40,0x00, - - 5, // 0x67 'g' - 0x00,0x00,0x00,0x70,0x90,0x90,0x90,0x70,0x10,0x90,0x60, - - 5, // 0x68 'h' - 0x00,0x80,0x80,0x80,0xE0,0x90,0x90,0x90,0x90,0x90,0x00, - - 2, // 0x69 'i' - 0x00,0x80,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00, - - 4, // 0x6A 'j' - 0x00,0x20,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x40, - - 5, // 0x6B 'k' - 0x00,0x80,0x80,0x90,0x90,0xA0,0xC0,0xA0,0x90,0x90,0x00, - - 2, // 0x6C 'l' - 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00, - - 6, // 0x6D 'm' - 0x00,0x00,0x00,0xD0,0xA8,0xA8,0xA8,0x88,0x88,0x88,0x00, - - 5, // 0x6E 'n' - 0x00,0x00,0x00,0xA0,0xD0,0x90,0x90,0x90,0x90,0x90,0x00, - - 5, // 0x6F 'o' - 0x00,0x00,0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x70 'p' - 0x00,0x00,0x00,0xE0,0x90,0x90,0x90,0x90,0xE0,0x80,0x80, - - 5, // 0x71 'q' - 0x00,0x00,0x00,0x70,0x90,0x90,0x90,0x90,0x70,0x10,0x10, - - 6, // 0x72 'r' - 0x00,0x00,0x00,0xB8,0x48,0x40,0x40,0x40,0x40,0x40,0x00, - - 5, // 0x73 's' - 0x00,0x00,0x00,0x60,0x90,0x40,0x20,0x10,0x90,0x60,0x00, - - 4, // 0x74 't' - 0x00,0x40,0x40,0xE0,0x40,0x40,0x40,0x40,0x40,0x20,0x00, - - 5, // 0x75 'u' - 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0x90,0x90,0x70,0x00, - - 6, // 0x76 'v' - 0x00,0x00,0x00,0x88,0x88,0x88,0x50,0x50,0x20,0x20,0x00, - - 6, // 0x77 'w' - 0x00,0x00,0x00,0x88,0x88,0x88,0xA8,0xA8,0xA8,0x50,0x00, - - 5, // 0x78 'x' - 0x00,0x00,0x00,0x90,0x90,0x60,0x60,0x90,0x90,0x90,0x00, - - 5, // 0x79 'y' - 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0x70,0x10,0x20,0xC0, - - 5, // 0x7A 'z' - 0x00,0x00,0x00,0xF0,0x10,0x20,0x40,0x80,0x80,0xF0,0x00, - - 5, // 0x7B '{' - 0x30,0x40,0x40,0x40,0x40,0x80,0x40,0x40,0x40,0x40,0x30, - - 3, // 0x7C '|' - 0x00,0x40,0x40,0x40,0x40,0x00,0x40,0x40,0x40,0x40,0x00, - - 5, // 0x7D '}' - 0xC0,0x20,0x20,0x20,0x20,0x10,0x20,0x20,0x20,0x20,0xC0, - - 5, // 0x7E '~' - 0x00,0x40,0xA8,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x7F '' - 0x00,0x20,0x70,0xD8,0x88,0x88,0xF8,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u mcs12_prop[] = - { - 12, 3, 32, 128-32, - 0x00,0x00,0x0D,0x00,0x1A,0x00,0x27,0x00,0x34,0x00,0x41,0x00,0x4E,0x00,0x5B,0x00,0x68,0x00, - 0x75,0x00,0x82,0x00,0x8F,0x00,0x9C,0x00,0xA9,0x00,0xB6,0x00,0xC3,0x00,0xD0,0x00,0xDD,0x00, - 0xEA,0x00,0xF7,0x00,0x04,0x01,0x11,0x01,0x1E,0x01,0x2B,0x01,0x38,0x01,0x45,0x01,0x52,0x01, - 0x5F,0x01,0x6C,0x01,0x79,0x01,0x86,0x01,0x93,0x01,0xA0,0x01,0xAD,0x01,0xBA,0x01,0xC7,0x01, - 0xD4,0x01,0xE1,0x01,0xEE,0x01,0xFB,0x01,0x08,0x02,0x15,0x02,0x22,0x02,0x2F,0x02,0x3C,0x02, - 0x49,0x02,0x62,0x02,0x6F,0x02,0x7C,0x02,0x89,0x02,0x96,0x02,0xA3,0x02,0xB0,0x02,0xBD,0x02, - 0xCA,0x02,0xD7,0x02,0xF0,0x02,0xFD,0x02,0x0A,0x03,0x17,0x03,0x24,0x03,0x31,0x03,0x3E,0x03, - 0x4B,0x03,0x58,0x03,0x65,0x03,0x72,0x03,0x7F,0x03,0x8C,0x03,0x99,0x03,0xA6,0x03,0xB3,0x03, - 0xC0,0x03,0xCD,0x03,0xDA,0x03,0xE7,0x03,0xF4,0x03,0x01,0x04,0x1A,0x04,0x27,0x04,0x34,0x04, - 0x41,0x04,0x4E,0x04,0x5B,0x04,0x68,0x04,0x75,0x04,0x82,0x04,0x8F,0x04,0xA8,0x04,0xB5,0x04, - 0xC2,0x04,0xCF,0x04,0xDC,0x04,0xE9,0x04,0xF6,0x04,0x03,0x05, - - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x21 '!' - 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, - - 4, // 0x22 '"' - 0x50,0x50,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x23 '#' - 0x28,0x28,0x28,0x7C,0x28,0x28,0x28,0x7C,0x28,0x28,0x28,0x00, - - 6, // 0x24 '$' - 0x10,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x10,0x00, - - 7, // 0x25 '%' - 0x32,0x54,0x64,0x08,0x08,0x10,0x10,0x26,0x2A,0x4C,0x00,0x00, - - 7, // 0x26 '&' - 0x00,0x30,0x48,0x48,0x48,0x30,0x4A,0x4A,0x44,0x3A,0x00,0x00, - - 3, // 0x27 ''' - 0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x28 '(' - 0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10,0x00, - - 5, // 0x29 ')' - 0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x20,0x40,0x00, - - 6, // 0x2A '*' - 0x00,0x00,0x10,0x54,0x38,0x7C,0x38,0x54,0x10,0x00,0x00,0x00, - - 6, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00, - - 4, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x40,0x80, - - 6, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00, - - 7, // 0x2F '/' - 0x00,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00, - - 7, // 0x30 '0' - 0x00,0x38,0x44,0x44,0x54,0x54,0x54,0x44,0x44,0x38,0x00,0x00, - - 4, // 0x31 '1' - 0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00, - - 7, // 0x32 '2' - 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, - - 7, // 0x33 '3' - 0x00,0x38,0x44,0x04,0x04,0x38,0x04,0x04,0x44,0x38,0x00,0x00, - - 6, // 0x34 '4' - 0x00,0x08,0x18,0x28,0x28,0x48,0x48,0x7C,0x08,0x08,0x00,0x00, - - 7, // 0x35 '5' - 0x00,0x7C,0x40,0x40,0x78,0x44,0x04,0x04,0x44,0x38,0x00,0x00, - - 7, // 0x36 '6' - 0x00,0x38,0x44,0x40,0x78,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 6, // 0x37 '7' - 0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x20,0x00,0x00, - - 7, // 0x38 '8' - 0x00,0x38,0x44,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x39 '9' - 0x00,0x38,0x44,0x44,0x44,0x3C,0x04,0x04,0x44,0x38,0x00,0x00, - - 4, // 0x3A ':' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x00,0x00, - - 4, // 0x3B ';' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x40,0x80, - - 6, // 0x3C '<' - 0x00,0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00, - - 6, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00,0x00, - - 6, // 0x3E '>' - 0x00,0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00, - - 6, // 0x3F '?' - 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x10,0x00,0x10,0x00,0x00, - - 7, // 0x40 '@' - 0x00,0x38,0x44,0x44,0x5C,0x54,0x54,0x4C,0x40,0x38,0x00,0x00, - - 7, // 0x41 'A' - 0x00,0x38,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x42 'B' - 0x00,0x78,0x44,0x44,0x44,0x78,0x44,0x44,0x44,0x78,0x00,0x00, - - 6, // 0x43 'C' - 0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x40,0x44,0x38,0x00,0x00, - - 7, // 0x44 'D' - 0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x44,0x48,0x70,0x00,0x00, - - 6, // 0x45 'E' - 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x7C,0x00,0x00, - - 6, // 0x46 'F' - 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x40,0x00,0x00, - - 7, // 0x47 'G' - 0x00,0x38,0x44,0x40,0x40,0x5C,0x44,0x44,0x4C,0x34,0x00,0x00, - - 7, // 0x48 'H' - 0x00,0x44,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00, - - 5, // 0x49 'I' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - - 6, // 0x4A 'J' - 0x00,0x1C,0x08,0x08,0x08,0x08,0x08,0x48,0x48,0x30,0x00,0x00, - - 6, // 0x4B 'K' - 0x00,0x44,0x48,0x50,0x60,0x60,0x50,0x48,0x44,0x44,0x00,0x00, - - 6, // 0x4C 'L' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00, - - 9, // 0x4D 'M' - 0x00,0x00,0x41,0x00,0x63,0x00,0x55,0x00,0x49,0x00,0x49,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x4E 'N' - 0x00,0x44,0x64,0x64,0x54,0x54,0x4C,0x4C,0x44,0x44,0x00,0x00, - - 7, // 0x4F 'O' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x50 'P' - 0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00, - - 7, // 0x51 'Q' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00, - - 7, // 0x52 'R' - 0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x48,0x44,0x44,0x00,0x00, - - 7, // 0x53 'S' - 0x00,0x38,0x44,0x40,0x40,0x38,0x04,0x04,0x44,0x38,0x00,0x00, - - 6, // 0x54 'T' - 0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - - 7, // 0x55 'U' - 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 6, // 0x56 'V' - 0x00,0x44,0x44,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x00,0x00, - - 9, // 0x57 'W' - 0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x49,0x00,0x49,0x00,0x55,0x00,0x22,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x58 'X' - 0x00,0x44,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x59 'Y' - 0x00,0x44,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x00,0x00, - - 6, // 0x5A 'Z' - 0x00,0x7C,0x04,0x04,0x08,0x10,0x20,0x40,0x40,0x7C,0x00,0x00, - - 4, // 0x5B '[' - 0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x00, - - 7, // 0x5C '\' - 0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x00, - - 4, // 0x5D ']' - 0xE0,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xE0,0x00, - - 6, // 0x5E '^' - 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00, - - 4, // 0x60 '`' - 0x00,0x40,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x61 'a' - 0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x44,0x44,0x3C,0x00,0x00, - - 7, // 0x62 'b' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x00,0x00, - - 6, // 0x63 'c' - 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x40,0x44,0x38,0x00,0x00, - - 7, // 0x64 'd' - 0x00,0x04,0x04,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x00,0x00, - - 7, // 0x65 'e' - 0x00,0x00,0x00,0x38,0x44,0x44,0x7C,0x40,0x44,0x38,0x00,0x00, - - 4, // 0x66 'f' - 0x00,0x30,0x40,0xE0,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - - 7, // 0x67 'g' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x78, - - 7, // 0x68 'h' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x44,0x00,0x00, - - 3, // 0x69 'i' - 0x00,0x40,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - - 5, // 0x6A 'j' - 0x00,0x10,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x90,0x60, - - 6, // 0x6B 'k' - 0x00,0x40,0x40,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00, - - 3, // 0x6C 'l' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - - 9, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x6E 'n' - 0x00,0x00,0x00,0x58,0x64,0x44,0x44,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x6F 'o' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x70 'p' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x40,0x40, - - 7, // 0x71 'q' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x04, - - 6, // 0x72 'r' - 0x00,0x00,0x00,0x58,0x24,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - - 7, // 0x73 's' - 0x00,0x00,0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x38,0x00,0x00, - - 5, // 0x74 't' - 0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x20,0x20,0x18,0x00,0x00, - - 7, // 0x75 'u' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x4C,0x34,0x00,0x00, - - 6, // 0x76 'v' - 0x00,0x00,0x00,0x44,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00, - - 9, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x36,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x78 'x' - 0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00, - - 7, // 0x79 'y' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x3C,0x08,0x70, - - 6, // 0x7A 'z' - 0x00,0x00,0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, - - 5, // 0x7B '{' - 0x18,0x20,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x20,0x18,0x00, - - 3, // 0x7C '|' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00, - - 5, // 0x7D '}' - 0xC0,0x20,0x20,0x20,0x20,0x18,0x20,0x20,0x20,0x20,0xC0,0x00, - - 7, // 0x7E '~' - 0x00,0x60,0x92,0x92,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x7F '' - 0x00,0x10,0x38,0x6C,0x44,0x44,0x7C,0x00,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u mcs13_prop[] = - { - 13, 4, 32, 128-32, - 0x00,0x00,0x0E,0x00,0x1C,0x00,0x2A,0x00,0x38,0x00,0x46,0x00,0x54,0x00,0x62,0x00,0x70,0x00, - 0x7E,0x00,0x8C,0x00,0x9A,0x00,0xA8,0x00,0xB6,0x00,0xC4,0x00,0xD2,0x00,0xE0,0x00,0xEE,0x00, - 0xFC,0x00,0x0A,0x01,0x18,0x01,0x26,0x01,0x34,0x01,0x42,0x01,0x50,0x01,0x5E,0x01,0x6C,0x01, - 0x7A,0x01,0x88,0x01,0x96,0x01,0xA4,0x01,0xB2,0x01,0xC0,0x01,0xCE,0x01,0xDC,0x01,0xEA,0x01, - 0xF8,0x01,0x06,0x02,0x14,0x02,0x22,0x02,0x30,0x02,0x3E,0x02,0x4C,0x02,0x5A,0x02,0x68,0x02, - 0x76,0x02,0x91,0x02,0x9F,0x02,0xAD,0x02,0xBB,0x02,0xC9,0x02,0xD7,0x02,0xE5,0x02,0xF3,0x02, - 0x01,0x03,0x0F,0x03,0x2A,0x03,0x38,0x03,0x46,0x03,0x54,0x03,0x62,0x03,0x70,0x03,0x7E,0x03, - 0x8C,0x03,0x9A,0x03,0xA8,0x03,0xB6,0x03,0xC4,0x03,0xD2,0x03,0xE0,0x03,0xEE,0x03,0xFC,0x03, - 0x0A,0x04,0x18,0x04,0x26,0x04,0x34,0x04,0x42,0x04,0x50,0x04,0x6B,0x04,0x79,0x04,0x87,0x04, - 0x95,0x04,0xA3,0x04,0xB1,0x04,0xBF,0x04,0xCD,0x04,0xDB,0x04,0xE9,0x04,0x04,0x05,0x12,0x05, - 0x20,0x05,0x2E,0x05,0x3C,0x05,0x4A,0x05,0x58,0x05,0x66,0x05, - - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x21 '!' - 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, - - 4, // 0x22 '"' - 0x00,0x50,0x50,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x23 '#' - 0x00,0x28,0x28,0x28,0x7C,0x28,0x28,0x28,0x7C,0x28,0x28,0x28,0x00, - - 6, // 0x24 '$' - 0x00,0x10,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x10,0x00, - - 7, // 0x25 '%' - 0x00,0x32,0x54,0x64,0x08,0x08,0x10,0x10,0x26,0x2A,0x4C,0x00,0x00, - - 7, // 0x26 '&' - 0x00,0x30,0x48,0x48,0x48,0x30,0x4A,0x4A,0x44,0x3A,0x00,0x00,0x00, - - 3, // 0x27 ''' - 0x00,0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x28 '(' - 0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10,0x00,0x00, - - 5, // 0x29 ')' - 0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x20,0x40,0x00,0x00, - - 6, // 0x2A '*' - 0x00,0x00,0x10,0x54,0x38,0x7C,0x38,0x54,0x10,0x00,0x00,0x00,0x00, - - 6, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00,0x00, - - 4, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x20,0x40,0x80, - - 6, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00, - - 7, // 0x2F '/' - 0x00,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00,0x00, - - 7, // 0x30 '0' - 0x00,0x38,0x44,0x44,0x54,0x54,0x54,0x44,0x44,0x38,0x00,0x00,0x00, - - 4, // 0x31 '1' - 0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00, - - 7, // 0x32 '2' - 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00,0x00, - - 7, // 0x33 '3' - 0x00,0x38,0x44,0x04,0x04,0x38,0x04,0x04,0x44,0x38,0x00,0x00,0x00, - - 6, // 0x34 '4' - 0x00,0x08,0x18,0x28,0x28,0x48,0x48,0x7C,0x08,0x08,0x00,0x00,0x00, - - 7, // 0x35 '5' - 0x00,0x7C,0x40,0x40,0x78,0x44,0x04,0x04,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x36 '6' - 0x00,0x38,0x44,0x40,0x78,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 6, // 0x37 '7' - 0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x20,0x00,0x00,0x00, - - 7, // 0x38 '8' - 0x00,0x38,0x44,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x39 '9' - 0x00,0x38,0x44,0x44,0x44,0x3C,0x04,0x04,0x44,0x38,0x00,0x00,0x00, - - 4, // 0x3A ':' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00, - - 4, // 0x3B ';' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x20,0x40,0x80, - - 6, // 0x3C '<' - 0x00,0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00,0x00, - - 6, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x3E '>' - 0x00,0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00,0x00, - - 6, // 0x3F '?' - 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x10,0x00,0x10,0x00,0x00,0x00, - - 7, // 0x40 '@' - 0x00,0x38,0x44,0x44,0x5C,0x54,0x54,0x4C,0x40,0x38,0x00,0x00,0x00, - - 7, // 0x41 'A' - 0x00,0x38,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x42 'B' - 0x00,0x78,0x44,0x44,0x44,0x78,0x44,0x44,0x44,0x78,0x00,0x00,0x00, - - 6, // 0x43 'C' - 0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x40,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x44 'D' - 0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x44,0x48,0x70,0x00,0x00,0x00, - - 6, // 0x45 'E' - 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x7C,0x00,0x00,0x00, - - 6, // 0x46 'F' - 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 7, // 0x47 'G' - 0x00,0x38,0x44,0x40,0x40,0x5C,0x44,0x44,0x4C,0x34,0x00,0x00,0x00, - - 7, // 0x48 'H' - 0x00,0x44,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - - 5, // 0x49 'I' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00,0x00, - - 6, // 0x4A 'J' - 0x00,0x1C,0x08,0x08,0x08,0x08,0x08,0x48,0x48,0x30,0x00,0x00,0x00, - - 6, // 0x4B 'K' - 0x00,0x44,0x48,0x50,0x60,0x60,0x50,0x48,0x44,0x44,0x00,0x00,0x00, - - 6, // 0x4C 'L' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00,0x00, - - 9, // 0x4D 'M' - 0x00,0x00,0x41,0x00,0x63,0x00,0x55,0x00,0x49,0x00,0x49,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x4E 'N' - 0x00,0x44,0x64,0x64,0x54,0x54,0x4C,0x4C,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x4F 'O' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x50 'P' - 0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00,0x00, - - 7, // 0x51 'Q' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00,0x00, - - 7, // 0x52 'R' - 0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x48,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x53 'S' - 0x00,0x38,0x44,0x40,0x40,0x38,0x04,0x04,0x44,0x38,0x00,0x00,0x00, - - 6, // 0x54 'T' - 0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00, - - 7, // 0x55 'U' - 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 6, // 0x56 'V' - 0x00,0x44,0x44,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x00,0x00,0x00, - - 9, // 0x57 'W' - 0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x49,0x00,0x49,0x00,0x55,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x58 'X' - 0x00,0x44,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x59 'Y' - 0x00,0x44,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x00,0x00,0x00, - - 6, // 0x5A 'Z' - 0x00,0x7C,0x04,0x04,0x08,0x10,0x20,0x40,0x40,0x7C,0x00,0x00,0x00, - - 4, // 0x5B '[' - 0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x00,0x00, - - 7, // 0x5C '\' - 0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x00,0x00, - - 4, // 0x5D ']' - 0xE0,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xE0,0x00,0x00, - - 6, // 0x5E '^' - 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00, - - 4, // 0x60 '`' - 0x00,0x40,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x61 'a' - 0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x44,0x44,0x3C,0x00,0x00,0x00, - - 7, // 0x62 'b' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x00,0x00,0x00, - - 6, // 0x63 'c' - 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x40,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x64 'd' - 0x00,0x04,0x04,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x00,0x00,0x00, - - 7, // 0x65 'e' - 0x00,0x00,0x00,0x38,0x44,0x44,0x7C,0x40,0x44,0x38,0x00,0x00,0x00, - - 4, // 0x66 'f' - 0x00,0x30,0x40,0xE0,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 7, // 0x67 'g' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x44,0x38, - - 7, // 0x68 'h' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - - 3, // 0x69 'i' - 0x00,0x40,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 5, // 0x6A 'j' - 0x00,0x10,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x90,0x60,0x00, - - 6, // 0x6B 'k' - 0x00,0x40,0x40,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00,0x00, - - 3, // 0x6C 'l' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 9, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x6E 'n' - 0x00,0x00,0x00,0x58,0x64,0x44,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x6F 'o' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x70 'p' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x40,0x40,0x40, - - 7, // 0x71 'q' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x04,0x04, - - 6, // 0x72 'r' - 0x00,0x00,0x00,0x58,0x24,0x20,0x20,0x20,0x20,0x70,0x00,0x00,0x00, - - 7, // 0x73 's' - 0x00,0x00,0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x38,0x00,0x00,0x00, - - 5, // 0x74 't' - 0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x20,0x20,0x18,0x00,0x00,0x00, - - 7, // 0x75 'u' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x4C,0x34,0x00,0x00,0x00, - - 6, // 0x76 'v' - 0x00,0x00,0x00,0x44,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00,0x00, - - 9, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x78 'x' - 0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x79 'y' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x08,0x70, - - 6, // 0x7A 'z' - 0x00,0x00,0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00,0x00, - - 5, // 0x7B '{' - 0x18,0x20,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x20,0x18,0x00,0x00, - - 3, // 0x7C '|' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - - 5, // 0x7D '}' - 0xC0,0x20,0x20,0x20,0x20,0x18,0x20,0x20,0x20,0x20,0xC0,0x00,0x00, - - 7, // 0x7E '~' - 0x00,0x60,0x92,0x92,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x7F '' - 0x00,0x10,0x38,0x6C,0x44,0x44,0x7C,0x00,0x00,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u mcs5x10_mono[] = - { - 10, 2, 32, 128-32, - 0x00,0x00,0x0B,0x00,0x16,0x00,0x21,0x00,0x2C,0x00,0x37,0x00,0x42,0x00,0x4D,0x00,0x58,0x00, - 0x63,0x00,0x6E,0x00,0x79,0x00,0x84,0x00,0x8F,0x00,0x9A,0x00,0xA5,0x00,0xB0,0x00,0xBB,0x00, - 0xC6,0x00,0xD1,0x00,0xDC,0x00,0xE7,0x00,0xF2,0x00,0xFD,0x00,0x08,0x01,0x13,0x01,0x1E,0x01, - 0x29,0x01,0x34,0x01,0x3F,0x01,0x4A,0x01,0x55,0x01,0x60,0x01,0x6B,0x01,0x76,0x01,0x81,0x01, - 0x8C,0x01,0x97,0x01,0xA2,0x01,0xAD,0x01,0xB8,0x01,0xC3,0x01,0xCE,0x01,0xD9,0x01,0xE4,0x01, - 0xEF,0x01,0xFA,0x01,0x05,0x02,0x10,0x02,0x1B,0x02,0x26,0x02,0x31,0x02,0x3C,0x02,0x47,0x02, - 0x52,0x02,0x5D,0x02,0x68,0x02,0x73,0x02,0x7E,0x02,0x89,0x02,0x94,0x02,0x9F,0x02,0xAA,0x02, - 0xB5,0x02,0xC0,0x02,0xCB,0x02,0xD6,0x02,0xE1,0x02,0xEC,0x02,0xF7,0x02,0x02,0x03,0x0D,0x03, - 0x18,0x03,0x23,0x03,0x2E,0x03,0x39,0x03,0x44,0x03,0x4F,0x03,0x5A,0x03,0x65,0x03,0x70,0x03, - 0x7B,0x03,0x86,0x03,0x91,0x03,0x9C,0x03,0xA7,0x03,0xB2,0x03,0xBD,0x03,0xC8,0x03,0xD3,0x03, - 0xDE,0x03,0xE9,0x03,0xF4,0x03,0xFF,0x03,0x0A,0x04,0x15,0x04, - - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x21 '!' - 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00, - - 5, // 0x22 '"' - 0x00,0x50,0x50,0xA0,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x23 '#' - 0x00,0x50,0x50,0xF8,0x50,0x50,0x50,0xF8,0x50,0x50, - - 5, // 0x24 '$' - 0x00,0x40,0x60,0x90,0x80,0x60,0x10,0x90,0x60,0x20, - - 5, // 0x25 '%' - 0x00,0x00,0x90,0x90,0x20,0x20,0x40,0x40,0x90,0x90, - - 5, // 0x26 '&' - 0x00,0x40,0xA0,0xA0,0xA0,0x40,0xA8,0x90,0x90,0x68, - - 5, // 0x27 ''' - 0x00,0x20,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x28 '(' - 0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x20,0x20,0x10, - - 5, // 0x29 ')' - 0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x20,0x20,0x40, - - 5, // 0x2A '*' - 0x00,0x00,0x90,0x60,0xF0,0x60,0x90,0x00,0x00,0x00, - - 5, // 0x2B '+' - 0x00,0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x00,0x00, - - 5, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0xC0, - - 5, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00, - - 5, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00, - - 5, // 0x2F '/' - 0x00,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x00, - - 5, // 0x30 '0' - 0x00,0x70,0x90,0x90,0x90,0x90,0x90,0x90,0xE0,0x00, - - 5, // 0x31 '1' - 0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00, - - 5, // 0x32 '2' - 0x00,0x60,0x90,0x90,0x10,0x20,0x40,0x80,0xF0,0x00, - - 5, // 0x33 '3' - 0x00,0x60,0x90,0x10,0x60,0x10,0x10,0x90,0x60,0x00, - - 5, // 0x34 '4' - 0x00,0x10,0x30,0x50,0x50,0x90,0xF0,0x10,0x10,0x00, - - 5, // 0x35 '5' - 0x00,0xF0,0x80,0x80,0xE0,0x10,0x10,0x90,0x60,0x00, - - 5, // 0x36 '6' - 0x00,0x60,0x80,0x80,0xE0,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x37 '7' - 0x00,0xF0,0x10,0x10,0x20,0x20,0x40,0x40,0x40,0x00, - - 5, // 0x38 '8' - 0x00,0x60,0x90,0x90,0x60,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x39 '9' - 0x00,0x60,0x90,0x90,0x90,0x70,0x10,0x10,0x60,0x00, - - 5, // 0x3A ':' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00, - - 5, // 0x3B ';' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0xC0, - - 5, // 0x3C '<' - 0x00,0x08,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x08, - - 5, // 0x3D '=' - 0x00,0x00,0x00,0x00,0xF0,0x00,0xF0,0x00,0x00,0x00, - - 5, // 0x3E '>' - 0x00,0x80,0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x80, - - 5, // 0x3F '?' - 0x00,0x60,0x90,0x10,0x10,0x20,0x40,0x00,0x40,0x00, - - 5, // 0x40 '@' - 0x00,0x60,0x90,0x90,0xB0,0xB0,0x80,0x80,0x70,0x00, - - 5, // 0x41 'A' - 0x00,0x60,0x90,0x90,0x90,0xF0,0x90,0x90,0x90,0x00, - - 5, // 0x42 'B' - 0x00,0xE0,0x90,0x90,0xE0,0x90,0x90,0x90,0xE0,0x00, - - 5, // 0x43 'C' - 0x00,0x60,0x90,0x80,0x80,0x80,0x80,0x90,0x60,0x00, - - 5, // 0x44 'D' - 0x00,0xE0,0x90,0x90,0x90,0x90,0x90,0x90,0xE0,0x00, - - 5, // 0x45 'E' - 0x00,0xF0,0x80,0x80,0xF0,0x80,0x80,0x80,0xF0,0x00, - - 5, // 0x46 'F' - 0x00,0xF0,0x80,0x80,0xF0,0x80,0x80,0x80,0x80,0x00, - - 5, // 0x47 'G' - 0x00,0x60,0x90,0x80,0x80,0xB0,0x90,0x90,0x60,0x00, - - 5, // 0x48 'H' - 0x00,0x90,0x90,0x90,0x90,0xF0,0x90,0x90,0x90,0x00, - - 5, // 0x49 'I' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00, - - 5, // 0x4A 'J' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0xA0,0x40,0x00, - - 5, // 0x4B 'K' - 0x00,0x90,0xA0,0xA0,0xC0,0xC0,0xA0,0xA0,0x90,0x00, - - 5, // 0x4C 'L' - 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xF0,0x00, - - 5, // 0x4D 'M' - 0x00,0x90,0x90,0xF0,0xF0,0x90,0x90,0x90,0x90,0x00, - - 5, // 0x4E 'N' - 0x00,0x90,0x90,0xD0,0xD0,0xB0,0xB0,0x90,0x90,0x00, - - 5, // 0x4F 'O' - 0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x50 'P' - 0x00,0xE0,0x90,0x90,0x90,0xE0,0x80,0x80,0x80,0x00, - - 5, // 0x51 'Q' - 0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x30, - - 5, // 0x52 'R' - 0x00,0xE0,0x90,0x90,0x90,0xE0,0xA0,0x90,0x90,0x00, - - 5, // 0x53 'S' - 0x00,0x60,0x90,0x80,0x60,0x10,0x90,0x90,0x60,0x00, - - 5, // 0x54 'T' - 0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00, - - 5, // 0x55 'U' - 0x00,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x56 'V' - 0x00,0x90,0x90,0x90,0x50,0x50,0x50,0x20,0x20,0x00, - - 5, // 0x57 'W' - 0x00,0x90,0x90,0x90,0x90,0x90,0xF0,0xF0,0x90,0x00, - - 5, // 0x58 'X' - 0x00,0x90,0x90,0x90,0x60,0x60,0x90,0x90,0x90,0x00, - - 5, // 0x59 'Y' - 0x00,0x88,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x00, - - 5, // 0x5A 'Z' - 0x00,0xF0,0x10,0x20,0x20,0x40,0x40,0x80,0xF0,0x00, - - 5, // 0x5B '[' - 0x60,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x60, - - 5, // 0x5C '\' - 0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08, - - 5, // 0x5D ']' - 0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x60, - - 5, // 0x5E '^' - 0x00,0x20,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00, - - 5, // 0x60 '`' - 0x00,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x61 'a' - 0x00,0x00,0x00,0x60,0x10,0x70,0x90,0x90,0x70,0x00, - - 5, // 0x62 'b' - 0x00,0x80,0x80,0xE0,0x90,0x90,0x90,0x90,0xE0,0x00, - - 5, // 0x63 'c' - 0x00,0x00,0x00,0x60,0x90,0x80,0x80,0x90,0x60,0x00, - - 5, // 0x64 'd' - 0x00,0x10,0x10,0x70,0x90,0x90,0x90,0x90,0x70,0x00, - - 5, // 0x65 'e' - 0x00,0x00,0x00,0x60,0x90,0x90,0xF0,0x80,0x70,0x00, - - 5, // 0x66 'f' - 0x00,0x30,0x40,0xE0,0x40,0x40,0x40,0x40,0x40,0x00, - - 5, // 0x67 'g' - 0x00,0x00,0x00,0x70,0x90,0x90,0x90,0x70,0x10,0xE0, - - 5, // 0x68 'h' - 0x00,0x80,0x80,0xE0,0x90,0x90,0x90,0x90,0x90,0x00, - - 5, // 0x69 'i' - 0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00, - - 5, // 0x6A 'j' - 0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0xC0, - - 5, // 0x6B 'k' - 0x00,0x80,0x80,0x90,0xA0,0xC0,0xA0,0x90,0x90,0x00, - - 5, // 0x6C 'l' - 0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00, - - 5, // 0x6D 'm' - 0x00,0x00,0x00,0x90,0xF0,0x90,0x90,0x90,0x90,0x00, - - 5, // 0x6E 'n' - 0x00,0x00,0x00,0xE0,0x90,0x90,0x90,0x90,0x90,0x00, - - 5, // 0x6F 'o' - 0x00,0x00,0x00,0x60,0x90,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x70 'p' - 0x00,0x00,0x00,0xE0,0x90,0x90,0x90,0xE0,0x80,0x80, - - 5, // 0x71 'q' - 0x00,0x00,0x00,0x70,0x90,0x90,0x90,0x70,0x10,0x10, - - 5, // 0x72 'r' - 0x00,0x00,0x00,0xB0,0x50,0x40,0x40,0x40,0xE0,0x00, - - 5, // 0x73 's' - 0x00,0x00,0x00,0x60,0x90,0x40,0x20,0x90,0x60,0x00, - - 5, // 0x74 't' - 0x00,0x40,0x40,0xE0,0x40,0x40,0x40,0x50,0x20,0x00, - - 5, // 0x75 'u' - 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0x90,0x70,0x00, - - 5, // 0x76 'v' - 0x00,0x00,0x00,0x90,0x90,0x50,0x50,0x20,0x20,0x00, - - 5, // 0x77 'w' - 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0xF0,0x90,0x00, - - 5, // 0x78 'x' - 0x00,0x00,0x00,0x90,0x90,0x60,0x60,0x90,0x90,0x00, - - 5, // 0x79 'y' - 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0x70,0x10,0xE0, - - 5, // 0x7A 'z' - 0x00,0x00,0x00,0xF0,0x10,0x20,0x40,0x80,0xF0,0x00, - - 5, // 0x7B '{' - 0x30,0x40,0x40,0x40,0x80,0x40,0x40,0x40,0x40,0x30, - - 5, // 0x7C '|' - 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - - 5, // 0x7D '}' - 0xC0,0x20,0x20,0x20,0x10,0x20,0x20,0x20,0x20,0xC0, - - 5, // 0x7E '~' - 0x00,0x40,0xA8,0x10,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x7F '' - 0x00,0x20,0x70,0xD8,0x88,0x88,0xF8,0x00,0x00,0x00, - - 0 - }; - - const int8u mcs5x11_mono[] = - { - 11, 3, 32, 128-32, - 0x00,0x00,0x0C,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x3C,0x00,0x48,0x00,0x54,0x00,0x60,0x00, - 0x6C,0x00,0x78,0x00,0x84,0x00,0x90,0x00,0x9C,0x00,0xA8,0x00,0xB4,0x00,0xC0,0x00,0xCC,0x00, - 0xD8,0x00,0xE4,0x00,0xF0,0x00,0xFC,0x00,0x08,0x01,0x14,0x01,0x20,0x01,0x2C,0x01,0x38,0x01, - 0x44,0x01,0x50,0x01,0x5C,0x01,0x68,0x01,0x74,0x01,0x80,0x01,0x8C,0x01,0x98,0x01,0xA4,0x01, - 0xB0,0x01,0xBC,0x01,0xC8,0x01,0xD4,0x01,0xE0,0x01,0xEC,0x01,0xF8,0x01,0x04,0x02,0x10,0x02, - 0x1C,0x02,0x28,0x02,0x34,0x02,0x40,0x02,0x4C,0x02,0x58,0x02,0x64,0x02,0x70,0x02,0x7C,0x02, - 0x88,0x02,0x94,0x02,0xA0,0x02,0xAC,0x02,0xB8,0x02,0xC4,0x02,0xD0,0x02,0xDC,0x02,0xE8,0x02, - 0xF4,0x02,0x00,0x03,0x0C,0x03,0x18,0x03,0x24,0x03,0x30,0x03,0x3C,0x03,0x48,0x03,0x54,0x03, - 0x60,0x03,0x6C,0x03,0x78,0x03,0x84,0x03,0x90,0x03,0x9C,0x03,0xA8,0x03,0xB4,0x03,0xC0,0x03, - 0xCC,0x03,0xD8,0x03,0xE4,0x03,0xF0,0x03,0xFC,0x03,0x08,0x04,0x14,0x04,0x20,0x04,0x2C,0x04, - 0x38,0x04,0x44,0x04,0x50,0x04,0x5C,0x04,0x68,0x04,0x74,0x04, - - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x21 '!' - 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, - - 5, // 0x22 '"' - 0x00,0x50,0x50,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x23 '#' - 0x00,0x50,0x50,0xF8,0x50,0x50,0x50,0xF8,0x50,0x50,0x00, - - 5, // 0x24 '$' - 0x00,0x40,0x60,0x90,0x80,0x60,0x10,0x90,0x60,0x20,0x00, - - 5, // 0x25 '%' - 0x00,0x00,0x90,0x90,0x20,0x20,0x40,0x40,0x90,0x90,0x00, - - 5, // 0x26 '&' - 0x00,0x40,0xA0,0xA0,0x40,0xA8,0x90,0x90,0x68,0x00,0x00, - - 5, // 0x27 ''' - 0x00,0x20,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x28 '(' - 0x00,0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x20,0x20,0x10, - - 5, // 0x29 ')' - 0x00,0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x20,0x20,0x40, - - 5, // 0x2A '*' - 0x00,0x00,0x90,0x60,0xF0,0x60,0x90,0x00,0x00,0x00,0x00, - - 5, // 0x2B '+' - 0x00,0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x00,0x00,0x00, - - 5, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x40,0x80, - - 5, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00, - - 5, // 0x2F '/' - 0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80,0x00, - - 5, // 0x30 '0' - 0x00,0x70,0x90,0x90,0x90,0x90,0x90,0x90,0xE0,0x00,0x00, - - 5, // 0x31 '1' - 0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - - 5, // 0x32 '2' - 0x00,0x60,0x90,0x90,0x10,0x20,0x40,0x80,0xF0,0x00,0x00, - - 5, // 0x33 '3' - 0x00,0x60,0x90,0x10,0x60,0x10,0x10,0x90,0x60,0x00,0x00, - - 5, // 0x34 '4' - 0x00,0x10,0x30,0x50,0x50,0x90,0xF8,0x10,0x10,0x00,0x00, - - 5, // 0x35 '5' - 0x00,0xF0,0x80,0xE0,0x90,0x10,0x10,0x90,0x60,0x00,0x00, - - 5, // 0x36 '6' - 0x00,0x60,0x90,0x80,0xE0,0x90,0x90,0x90,0x60,0x00,0x00, - - 5, // 0x37 '7' - 0x00,0xF0,0x10,0x10,0x20,0x20,0x40,0x40,0x40,0x00,0x00, - - 5, // 0x38 '8' - 0x00,0x60,0x90,0x90,0x60,0x90,0x90,0x90,0x60,0x00,0x00, - - 5, // 0x39 '9' - 0x00,0x60,0x90,0x90,0x90,0x70,0x10,0x90,0x60,0x00,0x00, - - 5, // 0x3A ':' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00, - - 5, // 0x3B ';' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x40,0x80, - - 5, // 0x3C '<' - 0x00,0x08,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x08,0x00, - - 5, // 0x3D '=' - 0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0xF0,0x00,0x00,0x00, - - 5, // 0x3E '>' - 0x00,0x80,0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x80,0x00, - - 5, // 0x3F '?' - 0x00,0x60,0x90,0x10,0x10,0x20,0x40,0x00,0x40,0x00,0x00, - - 5, // 0x40 '@' - 0x00,0x60,0x90,0x90,0xB0,0xB0,0x80,0x80,0x70,0x00,0x00, - - 5, // 0x41 'A' - 0x00,0x60,0x90,0x90,0x90,0xF0,0x90,0x90,0x90,0x00,0x00, - - 5, // 0x42 'B' - 0x00,0xE0,0x90,0x90,0xE0,0x90,0x90,0x90,0xE0,0x00,0x00, - - 5, // 0x43 'C' - 0x00,0x60,0x90,0x80,0x80,0x80,0x80,0x90,0x60,0x00,0x00, - - 5, // 0x44 'D' - 0x00,0xE0,0x90,0x90,0x90,0x90,0x90,0x90,0xE0,0x00,0x00, - - 5, // 0x45 'E' - 0x00,0xF0,0x80,0x80,0xE0,0x80,0x80,0x80,0xF0,0x00,0x00, - - 5, // 0x46 'F' - 0x00,0xF0,0x80,0x80,0xE0,0x80,0x80,0x80,0x80,0x00,0x00, - - 5, // 0x47 'G' - 0x00,0x60,0x90,0x80,0x80,0xB0,0x90,0x90,0x60,0x00,0x00, - - 5, // 0x48 'H' - 0x00,0x90,0x90,0x90,0xF0,0x90,0x90,0x90,0x90,0x00,0x00, - - 5, // 0x49 'I' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - - 5, // 0x4A 'J' - 0x00,0x70,0x20,0x20,0x20,0x20,0xA0,0xA0,0x40,0x00,0x00, - - 5, // 0x4B 'K' - 0x00,0x90,0xA0,0xA0,0xC0,0xA0,0xA0,0x90,0x90,0x00,0x00, - - 5, // 0x4C 'L' - 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xF0,0x00,0x00, - - 5, // 0x4D 'M' - 0x00,0x90,0xF0,0xF0,0x90,0x90,0x90,0x90,0x90,0x00,0x00, - - 5, // 0x4E 'N' - 0x00,0x90,0x90,0xD0,0xD0,0xB0,0xB0,0x90,0x90,0x00,0x00, - - 5, // 0x4F 'O' - 0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00,0x00, - - 5, // 0x50 'P' - 0x00,0xE0,0x90,0x90,0x90,0xE0,0x80,0x80,0x80,0x00,0x00, - - 5, // 0x51 'Q' - 0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x30,0x00, - - 5, // 0x52 'R' - 0x00,0xE0,0x90,0x90,0x90,0xE0,0xA0,0x90,0x90,0x00,0x00, - - 5, // 0x53 'S' - 0x00,0x60,0x90,0x80,0x60,0x10,0x90,0x90,0x60,0x00,0x00, - - 5, // 0x54 'T' - 0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00, - - 5, // 0x55 'U' - 0x00,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00,0x00, - - 5, // 0x56 'V' - 0x00,0x90,0x90,0x90,0x50,0x50,0x50,0x20,0x20,0x00,0x00, - - 5, // 0x57 'W' - 0x00,0x90,0x90,0x90,0x90,0x90,0xF0,0xF0,0x90,0x00,0x00, - - 5, // 0x58 'X' - 0x00,0x90,0x90,0x90,0x60,0x60,0x90,0x90,0x90,0x00,0x00, - - 5, // 0x59 'Y' - 0x00,0x88,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x00,0x00, - - 5, // 0x5A 'Z' - 0x00,0xF0,0x10,0x20,0x20,0x40,0x40,0x80,0xF0,0x00,0x00, - - 5, // 0x5B '[' - 0x00,0x60,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x60, - - 5, // 0x5C '\' - 0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x00, - - 5, // 0x5D ']' - 0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x60, - - 5, // 0x5E '^' - 0x00,0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00, - - 5, // 0x60 '`' - 0x00,0x40,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x61 'a' - 0x00,0x00,0x00,0x60,0x10,0x70,0x90,0x90,0x70,0x00,0x00, - - 5, // 0x62 'b' - 0x00,0x80,0x80,0xE0,0x90,0x90,0x90,0x90,0xE0,0x00,0x00, - - 5, // 0x63 'c' - 0x00,0x00,0x00,0x60,0x90,0x80,0x80,0x90,0x60,0x00,0x00, - - 5, // 0x64 'd' - 0x00,0x10,0x10,0x70,0x90,0x90,0x90,0x90,0x70,0x00,0x00, - - 5, // 0x65 'e' - 0x00,0x00,0x00,0x60,0x90,0x90,0xF0,0x80,0x70,0x00,0x00, - - 5, // 0x66 'f' - 0x00,0x30,0x40,0xE0,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - - 5, // 0x67 'g' - 0x00,0x00,0x00,0x70,0x90,0x90,0x90,0x90,0x70,0x10,0xE0, - - 5, // 0x68 'h' - 0x00,0x80,0x80,0xE0,0x90,0x90,0x90,0x90,0x90,0x00,0x00, - - 5, // 0x69 'i' - 0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - - 5, // 0x6A 'j' - 0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0xA0,0x40, - - 5, // 0x6B 'k' - 0x00,0x80,0x80,0x90,0xA0,0xC0,0xA0,0x90,0x90,0x00,0x00, - - 5, // 0x6C 'l' - 0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - - 5, // 0x6D 'm' - 0x00,0x00,0x00,0x90,0xF0,0x90,0x90,0x90,0x90,0x00,0x00, - - 5, // 0x6E 'n' - 0x00,0x00,0x00,0xE0,0x90,0x90,0x90,0x90,0x90,0x00,0x00, - - 5, // 0x6F 'o' - 0x00,0x00,0x00,0x60,0x90,0x90,0x90,0x90,0x60,0x00,0x00, - - 5, // 0x70 'p' - 0x00,0x00,0x00,0xE0,0x90,0x90,0x90,0x90,0xE0,0x80,0x80, - - 5, // 0x71 'q' - 0x00,0x00,0x00,0x70,0x90,0x90,0x90,0x90,0x70,0x10,0x10, - - 5, // 0x72 'r' - 0x00,0x00,0x00,0xA0,0x50,0x40,0x40,0x40,0xE0,0x00,0x00, - - 5, // 0x73 's' - 0x00,0x00,0x00,0x60,0x90,0x40,0x20,0x90,0x60,0x00,0x00, - - 5, // 0x74 't' - 0x00,0x40,0x40,0xE0,0x40,0x40,0x40,0x40,0x30,0x00,0x00, - - 5, // 0x75 'u' - 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0x90,0x70,0x00,0x00, - - 5, // 0x76 'v' - 0x00,0x00,0x00,0x90,0x90,0x50,0x50,0x20,0x20,0x00,0x00, - - 5, // 0x77 'w' - 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0xF0,0x90,0x00,0x00, - - 5, // 0x78 'x' - 0x00,0x00,0x00,0x90,0x90,0x60,0x60,0x90,0x90,0x00,0x00, - - 5, // 0x79 'y' - 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0x90,0x70,0x10,0xE0, - - 5, // 0x7A 'z' - 0x00,0x00,0x00,0xF0,0x10,0x20,0x40,0x80,0xF0,0x00,0x00, - - 5, // 0x7B '{' - 0x30,0x40,0x40,0x40,0x40,0x80,0x40,0x40,0x40,0x40,0x30, - - 5, // 0x7C '|' - 0x00,0x20,0x20,0x20,0x20,0x00,0x20,0x20,0x20,0x20,0x00, - - 5, // 0x7D '}' - 0xC0,0x20,0x20,0x20,0x20,0x10,0x20,0x20,0x20,0x20,0xC0, - - 5, // 0x7E '~' - 0x00,0x40,0xA8,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x7F '' - 0x00,0x20,0x70,0xD8,0x88,0x88,0xF8,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u mcs6x10_mono[] = - { - 10, 3, 32, 128-32, - 0x00,0x00,0x0B,0x00,0x16,0x00,0x21,0x00,0x2C,0x00,0x37,0x00,0x42,0x00,0x4D,0x00,0x58,0x00, - 0x63,0x00,0x6E,0x00,0x79,0x00,0x84,0x00,0x8F,0x00,0x9A,0x00,0xA5,0x00,0xB0,0x00,0xBB,0x00, - 0xC6,0x00,0xD1,0x00,0xDC,0x00,0xE7,0x00,0xF2,0x00,0xFD,0x00,0x08,0x01,0x13,0x01,0x1E,0x01, - 0x29,0x01,0x34,0x01,0x3F,0x01,0x4A,0x01,0x55,0x01,0x60,0x01,0x6B,0x01,0x76,0x01,0x81,0x01, - 0x8C,0x01,0x97,0x01,0xA2,0x01,0xAD,0x01,0xB8,0x01,0xC3,0x01,0xCE,0x01,0xD9,0x01,0xE4,0x01, - 0xEF,0x01,0xFA,0x01,0x05,0x02,0x10,0x02,0x1B,0x02,0x26,0x02,0x31,0x02,0x3C,0x02,0x47,0x02, - 0x52,0x02,0x5D,0x02,0x68,0x02,0x73,0x02,0x7E,0x02,0x89,0x02,0x94,0x02,0x9F,0x02,0xAA,0x02, - 0xB5,0x02,0xC0,0x02,0xCB,0x02,0xD6,0x02,0xE1,0x02,0xEC,0x02,0xF7,0x02,0x02,0x03,0x0D,0x03, - 0x18,0x03,0x23,0x03,0x2E,0x03,0x39,0x03,0x44,0x03,0x4F,0x03,0x5A,0x03,0x65,0x03,0x70,0x03, - 0x7B,0x03,0x86,0x03,0x91,0x03,0x9C,0x03,0xA7,0x03,0xB2,0x03,0xBD,0x03,0xC8,0x03,0xD3,0x03, - 0xDE,0x03,0xE9,0x03,0xF4,0x03,0xFF,0x03,0x0A,0x04,0x15,0x04, - - 6, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x21 '!' - 0x00,0x10,0x10,0x10,0x10,0x10,0x00,0x10,0x00,0x00, - - 6, // 0x22 '"' - 0x00,0x28,0x28,0x50,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x23 '#' - 0x00,0x28,0x28,0x7C,0x28,0x28,0x7C,0x28,0x28,0x00, - - 6, // 0x24 '$' - 0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x00, - - 6, // 0x25 '%' - 0x00,0x08,0xC8,0xD0,0x10,0x20,0x2C,0x4C,0x40,0x00, - - 6, // 0x26 '&' - 0x00,0x20,0x50,0x50,0x24,0x54,0x48,0x34,0x00,0x00, - - 6, // 0x27 ''' - 0x00,0x10,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x28 '(' - 0x08,0x10,0x10,0x20,0x20,0x20,0x10,0x10,0x08,0x00, - - 6, // 0x29 ')' - 0x20,0x10,0x10,0x08,0x08,0x08,0x10,0x10,0x20,0x00, - - 6, // 0x2A '*' - 0x00,0x00,0x28,0x7C,0x38,0x7C,0x28,0x00,0x00,0x00, - - 6, // 0x2B '+' - 0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00, - - 6, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x20,0x40, - - 6, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00, - - 6, // 0x2F '/' - 0x00,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00, - - 6, // 0x30 '0' - 0x00,0x38,0x44,0x4C,0x54,0x64,0x44,0x38,0x00,0x00, - - 6, // 0x31 '1' - 0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - - 6, // 0x32 '2' - 0x00,0x38,0x44,0x04,0x18,0x20,0x40,0x7C,0x00,0x00, - - 6, // 0x33 '3' - 0x00,0x38,0x44,0x04,0x38,0x04,0x44,0x38,0x00,0x00, - - 6, // 0x34 '4' - 0x00,0x08,0x18,0x28,0x48,0x7C,0x08,0x08,0x00,0x00, - - 6, // 0x35 '5' - 0x00,0x7C,0x40,0x40,0x78,0x04,0x44,0x38,0x00,0x00, - - 6, // 0x36 '6' - 0x00,0x38,0x40,0x40,0x78,0x44,0x44,0x38,0x00,0x00, - - 6, // 0x37 '7' - 0x00,0x7C,0x04,0x08,0x10,0x20,0x20,0x20,0x00,0x00, - - 6, // 0x38 '8' - 0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x38,0x00,0x00, - - 6, // 0x39 '9' - 0x00,0x38,0x44,0x44,0x3C,0x04,0x04,0x38,0x00,0x00, - - 6, // 0x3A ':' - 0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00,0x00, - - 6, // 0x3B ';' - 0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x20,0x40, - - 6, // 0x3C '<' - 0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00, - - 6, // 0x3D '=' - 0x00,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00, - - 6, // 0x3E '>' - 0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00, - - 6, // 0x3F '?' - 0x00,0x38,0x44,0x04,0x18,0x10,0x00,0x10,0x00,0x00, - - 6, // 0x40 '@' - 0x00,0x38,0x44,0x5C,0x54,0x5C,0x40,0x38,0x00,0x00, - - 6, // 0x41 'A' - 0x00,0x38,0x44,0x44,0x44,0x7C,0x44,0x44,0x00,0x00, - - 6, // 0x42 'B' - 0x00,0x78,0x44,0x44,0x78,0x44,0x44,0x78,0x00,0x00, - - 6, // 0x43 'C' - 0x00,0x38,0x44,0x40,0x40,0x40,0x44,0x38,0x00,0x00, - - 6, // 0x44 'D' - 0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x00,0x00, - - 6, // 0x45 'E' - 0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x7C,0x00,0x00, - - 6, // 0x46 'F' - 0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x40,0x00,0x00, - - 6, // 0x47 'G' - 0x00,0x38,0x44,0x40,0x4C,0x44,0x44,0x3C,0x00,0x00, - - 6, // 0x48 'H' - 0x00,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x00,0x00, - - 6, // 0x49 'I' - 0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - - 6, // 0x4A 'J' - 0x00,0x1C,0x08,0x08,0x08,0x48,0x48,0x30,0x00,0x00, - - 6, // 0x4B 'K' - 0x00,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00, - - 6, // 0x4C 'L' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00, - - 6, // 0x4D 'M' - 0x00,0x44,0x6C,0x54,0x54,0x44,0x44,0x44,0x00,0x00, - - 6, // 0x4E 'N' - 0x00,0x44,0x44,0x64,0x54,0x4C,0x44,0x44,0x00,0x00, - - 6, // 0x4F 'O' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 6, // 0x50 'P' - 0x00,0x78,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00, - - 6, // 0x51 'Q' - 0x00,0x38,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00, - - 6, // 0x52 'R' - 0x00,0x78,0x44,0x44,0x78,0x48,0x44,0x44,0x00,0x00, - - 6, // 0x53 'S' - 0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x38,0x00,0x00, - - 6, // 0x54 'T' - 0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - - 6, // 0x55 'U' - 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 6, // 0x56 'V' - 0x00,0x44,0x44,0x44,0x44,0x28,0x28,0x10,0x00,0x00, - - 6, // 0x57 'W' - 0x00,0x44,0x44,0x54,0x54,0x54,0x54,0x28,0x00,0x00, - - 6, // 0x58 'X' - 0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00, - - 6, // 0x59 'Y' - 0x00,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x00,0x00, - - 6, // 0x5A 'Z' - 0x00,0x78,0x08,0x10,0x20,0x40,0x40,0x78,0x00,0x00, - - 6, // 0x5B '[' - 0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00, - - 6, // 0x5C '\' - 0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x00, - - 6, // 0x5D ']' - 0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x38,0x00, - - 6, // 0x5E '^' - 0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00, - - 6, // 0x60 '`' - 0x00,0x10,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x61 'a' - 0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x3C,0x00,0x00, - - 6, // 0x62 'b' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x78,0x00,0x00, - - 6, // 0x63 'c' - 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x3C,0x00,0x00, - - 6, // 0x64 'd' - 0x00,0x04,0x04,0x3C,0x44,0x44,0x44,0x3C,0x00,0x00, - - 6, // 0x65 'e' - 0x00,0x00,0x00,0x38,0x44,0x78,0x40,0x3C,0x00,0x00, - - 6, // 0x66 'f' - 0x00,0x0C,0x10,0x10,0x38,0x10,0x10,0x10,0x00,0x00, - - 6, // 0x67 'g' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x3C,0x04,0x38, - - 6, // 0x68 'h' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x00,0x00, - - 6, // 0x69 'i' - 0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x38,0x00,0x00, - - 6, // 0x6A 'j' - 0x00,0x08,0x00,0x18,0x08,0x08,0x08,0x08,0x48,0x30, - - 6, // 0x6B 'k' - 0x00,0x40,0x40,0x48,0x50,0x60,0x50,0x48,0x00,0x00, - - 6, // 0x6C 'l' - 0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - - 6, // 0x6D 'm' - 0x00,0x00,0x00,0x68,0x54,0x54,0x44,0x44,0x00,0x00, - - 6, // 0x6E 'n' - 0x00,0x00,0x00,0x58,0x64,0x44,0x44,0x44,0x00,0x00, - - 6, // 0x6F 'o' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x38,0x00,0x00, - - 6, // 0x70 'p' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x78,0x40,0x40, - - 6, // 0x71 'q' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x3C,0x04,0x04, - - 6, // 0x72 'r' - 0x00,0x00,0x00,0x58,0x24,0x20,0x20,0x70,0x00,0x00, - - 6, // 0x73 's' - 0x00,0x00,0x00,0x38,0x40,0x38,0x04,0x78,0x00,0x00, - - 6, // 0x74 't' - 0x00,0x10,0x10,0x38,0x10,0x10,0x14,0x08,0x00,0x00, - - 6, // 0x75 'u' - 0x00,0x00,0x00,0x44,0x44,0x44,0x4C,0x34,0x00,0x00, - - 6, // 0x76 'v' - 0x00,0x00,0x00,0x44,0x44,0x44,0x28,0x10,0x00,0x00, - - 6, // 0x77 'w' - 0x00,0x00,0x00,0x44,0x44,0x54,0x7C,0x28,0x00,0x00, - - 6, // 0x78 'x' - 0x00,0x00,0x00,0x48,0x48,0x30,0x48,0x48,0x00,0x00, - - 6, // 0x79 'y' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x3C,0x04,0x38, - - 6, // 0x7A 'z' - 0x00,0x00,0x00,0x78,0x08,0x30,0x40,0x78,0x00,0x00, - - 6, // 0x7B '{' - 0x18,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x18,0x00, - - 6, // 0x7C '|' - 0x10,0x10,0x10,0x10,0x00,0x10,0x10,0x10,0x10,0x00, - - 6, // 0x7D '}' - 0x60,0x10,0x10,0x10,0x0C,0x10,0x10,0x10,0x60,0x00, - - 6, // 0x7E '~' - 0x00,0x48,0xA8,0x90,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x7F '' - 0x00,0x10,0x38,0x6C,0x44,0x44,0x7C,0x00,0x00,0x00, - - 0 - }; - - const int8u mcs6x11_mono[] = - { - 11, 3, 32, 128-32, - 0x00,0x00,0x0C,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x3C,0x00,0x48,0x00,0x54,0x00,0x60,0x00, - 0x6C,0x00,0x78,0x00,0x84,0x00,0x90,0x00,0x9C,0x00,0xA8,0x00,0xB4,0x00,0xC0,0x00,0xCC,0x00, - 0xD8,0x00,0xE4,0x00,0xF0,0x00,0xFC,0x00,0x08,0x01,0x14,0x01,0x20,0x01,0x2C,0x01,0x38,0x01, - 0x44,0x01,0x50,0x01,0x5C,0x01,0x68,0x01,0x74,0x01,0x80,0x01,0x8C,0x01,0x98,0x01,0xA4,0x01, - 0xB0,0x01,0xBC,0x01,0xC8,0x01,0xD4,0x01,0xE0,0x01,0xEC,0x01,0xF8,0x01,0x04,0x02,0x10,0x02, - 0x1C,0x02,0x28,0x02,0x34,0x02,0x40,0x02,0x4C,0x02,0x58,0x02,0x64,0x02,0x70,0x02,0x7C,0x02, - 0x88,0x02,0x94,0x02,0xA0,0x02,0xAC,0x02,0xB8,0x02,0xC4,0x02,0xD0,0x02,0xDC,0x02,0xE8,0x02, - 0xF4,0x02,0x00,0x03,0x0C,0x03,0x18,0x03,0x24,0x03,0x30,0x03,0x3C,0x03,0x48,0x03,0x54,0x03, - 0x60,0x03,0x6C,0x03,0x78,0x03,0x84,0x03,0x90,0x03,0x9C,0x03,0xA8,0x03,0xB4,0x03,0xC0,0x03, - 0xCC,0x03,0xD8,0x03,0xE4,0x03,0xF0,0x03,0xFC,0x03,0x08,0x04,0x14,0x04,0x20,0x04,0x2C,0x04, - 0x38,0x04,0x44,0x04,0x50,0x04,0x5C,0x04,0x68,0x04,0x74,0x04, - - 6, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x21 '!' - 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, - - 6, // 0x22 '"' - 0x00,0x28,0x28,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x23 '#' - 0x00,0x28,0x28,0x7C,0x28,0x28,0x7C,0x28,0x28,0x00,0x00, - - 6, // 0x24 '$' - 0x00,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x00, - - 6, // 0x25 '%' - 0x00,0x68,0xA8,0xD0,0x10,0x20,0x2C,0x54,0x58,0x00,0x00, - - 6, // 0x26 '&' - 0x00,0x20,0x50,0x50,0x20,0x54,0x54,0x48,0x34,0x00,0x00, - - 6, // 0x27 ''' - 0x00,0x10,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x28 '(' - 0x08,0x10,0x10,0x20,0x20,0x20,0x20,0x10,0x10,0x08,0x00, - - 6, // 0x29 ')' - 0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x00, - - 6, // 0x2A '*' - 0x00,0x00,0x28,0x7C,0x38,0x7C,0x28,0x00,0x00,0x00,0x00, - - 6, // 0x2B '+' - 0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00, - - 6, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x20,0x40, - - 6, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00, - - 6, // 0x2F '/' - 0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00, - - 6, // 0x30 '0' - 0x00,0x38,0x44,0x44,0x54,0x54,0x44,0x44,0x38,0x00,0x00, - - 6, // 0x31 '1' - 0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - - 6, // 0x32 '2' - 0x00,0x38,0x44,0x44,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, - - 6, // 0x33 '3' - 0x00,0x38,0x44,0x04,0x38,0x04,0x04,0x44,0x38,0x00,0x00, - - 6, // 0x34 '4' - 0x00,0x08,0x18,0x28,0x28,0x48,0x7C,0x08,0x08,0x00,0x00, - - 6, // 0x35 '5' - 0x00,0x7C,0x40,0x78,0x44,0x04,0x04,0x44,0x38,0x00,0x00, - - 6, // 0x36 '6' - 0x00,0x38,0x44,0x40,0x78,0x44,0x44,0x44,0x38,0x00,0x00, - - 6, // 0x37 '7' - 0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x00,0x00, - - 6, // 0x38 '8' - 0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00,0x00, - - 6, // 0x39 '9' - 0x00,0x38,0x44,0x44,0x3C,0x04,0x04,0x44,0x38,0x00,0x00, - - 6, // 0x3A ':' - 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00,0x00, - - 6, // 0x3B ';' - 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x20,0x40, - - 6, // 0x3C '<' - 0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00, - - 6, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00, - - 6, // 0x3E '>' - 0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00, - - 6, // 0x3F '?' - 0x00,0x38,0x44,0x04,0x08,0x10,0x10,0x00,0x10,0x00,0x00, - - 6, // 0x40 '@' - 0x00,0x38,0x44,0x5C,0x54,0x54,0x4C,0x40,0x38,0x00,0x00, - - 6, // 0x41 'A' - 0x00,0x38,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x00,0x00, - - 6, // 0x42 'B' - 0x00,0x78,0x44,0x44,0x78,0x44,0x44,0x44,0x78,0x00,0x00, - - 6, // 0x43 'C' - 0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x44,0x38,0x00,0x00, - - 6, // 0x44 'D' - 0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x48,0x70,0x00,0x00, - - 6, // 0x45 'E' - 0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x40,0x7C,0x00,0x00, - - 6, // 0x46 'F' - 0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x40,0x40,0x00,0x00, - - 6, // 0x47 'G' - 0x00,0x38,0x44,0x40,0x40,0x5C,0x44,0x4C,0x34,0x00,0x00, - - 6, // 0x48 'H' - 0x00,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00, - - 6, // 0x49 'I' - 0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - - 6, // 0x4A 'J' - 0x00,0x1C,0x08,0x08,0x08,0x08,0x48,0x48,0x30,0x00,0x00, - - 6, // 0x4B 'K' - 0x00,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x44,0x00,0x00, - - 6, // 0x4C 'L' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00, - - 6, // 0x4D 'M' - 0x00,0x44,0x6C,0x54,0x54,0x54,0x44,0x44,0x44,0x00,0x00, - - 6, // 0x4E 'N' - 0x00,0x44,0x64,0x64,0x54,0x54,0x4C,0x4C,0x44,0x00,0x00, - - 6, // 0x4F 'O' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 6, // 0x50 'P' - 0x00,0x78,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00, - - 6, // 0x51 'Q' - 0x00,0x38,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00, - - 6, // 0x52 'R' - 0x00,0x78,0x44,0x44,0x44,0x78,0x48,0x44,0x44,0x00,0x00, - - 6, // 0x53 'S' - 0x00,0x38,0x44,0x40,0x38,0x04,0x04,0x44,0x38,0x00,0x00, - - 6, // 0x54 'T' - 0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - - 6, // 0x55 'U' - 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 6, // 0x56 'V' - 0x00,0x44,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x00,0x00, - - 6, // 0x57 'W' - 0x00,0x44,0x44,0x54,0x54,0x54,0x54,0x54,0x28,0x00,0x00, - - 6, // 0x58 'X' - 0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00,0x00, - - 6, // 0x59 'Y' - 0x00,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x00,0x00, - - 6, // 0x5A 'Z' - 0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x40,0x7C,0x00,0x00, - - 6, // 0x5B '[' - 0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00, - - 6, // 0x5C '\' - 0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x00, - - 6, // 0x5D ']' - 0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x38,0x00, - - 6, // 0x5E '^' - 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00, - - 6, // 0x60 '`' - 0x00,0x20,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x61 'a' - 0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x44,0x3C,0x00,0x00, - - 6, // 0x62 'b' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x78,0x00,0x00, - - 6, // 0x63 'c' - 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x44,0x38,0x00,0x00, - - 6, // 0x64 'd' - 0x00,0x04,0x04,0x3C,0x44,0x44,0x44,0x44,0x3C,0x00,0x00, - - 6, // 0x65 'e' - 0x00,0x00,0x00,0x38,0x44,0x7C,0x40,0x44,0x38,0x00,0x00, - - 6, // 0x66 'f' - 0x00,0x0C,0x10,0x38,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - - 6, // 0x67 'g' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x3C,0x04,0x78, - - 6, // 0x68 'h' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x00,0x00, - - 6, // 0x69 'i' - 0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - - 6, // 0x6A 'j' - 0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x50,0x20, - - 6, // 0x6B 'k' - 0x00,0x40,0x40,0x4C,0x50,0x60,0x50,0x48,0x44,0x00,0x00, - - 6, // 0x6C 'l' - 0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - - 6, // 0x6D 'm' - 0x00,0x00,0x00,0x68,0x54,0x54,0x54,0x44,0x44,0x00,0x00, - - 6, // 0x6E 'n' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x00,0x00, - - 6, // 0x6F 'o' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 6, // 0x70 'p' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40, - - 6, // 0x71 'q' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x3C,0x04,0x04, - - 6, // 0x72 'r' - 0x00,0x00,0x00,0x58,0x24,0x20,0x20,0x20,0x70,0x00,0x00, - - 6, // 0x73 's' - 0x00,0x00,0x00,0x38,0x44,0x30,0x08,0x44,0x38,0x00,0x00, - - 6, // 0x74 't' - 0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x20,0x18,0x00,0x00, - - 6, // 0x75 'u' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x4C,0x34,0x00,0x00, - - 6, // 0x76 'v' - 0x00,0x00,0x00,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00, - - 6, // 0x77 'w' - 0x00,0x00,0x00,0x44,0x44,0x44,0x54,0x7C,0x28,0x00,0x00, - - 6, // 0x78 'x' - 0x00,0x00,0x00,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00, - - 6, // 0x79 'y' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x3C,0x08,0x70, - - 6, // 0x7A 'z' - 0x00,0x00,0x00,0x7C,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, - - 6, // 0x7B '{' - 0x18,0x20,0x20,0x20,0xC0,0xC0,0x20,0x20,0x20,0x18,0x00, - - 6, // 0x7C '|' - 0x00,0x10,0x10,0x10,0x10,0x00,0x10,0x10,0x10,0x10,0x00, - - 6, // 0x7D '}' - 0x60,0x10,0x10,0x10,0x0C,0x0C,0x10,0x10,0x10,0x60,0x00, - - 6, // 0x7E '~' - 0x00,0x24,0x54,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x7F '' - 0x00,0x10,0x38,0x6C,0x44,0x44,0x7C,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u mcs7x12_mono_high[] = - { - 12, 3, 32, 128-32, - 0x00,0x00,0x0D,0x00,0x1A,0x00,0x27,0x00,0x34,0x00,0x41,0x00,0x4E,0x00,0x5B,0x00,0x68,0x00, - 0x75,0x00,0x82,0x00,0x8F,0x00,0x9C,0x00,0xA9,0x00,0xB6,0x00,0xC3,0x00,0xD0,0x00,0xDD,0x00, - 0xEA,0x00,0xF7,0x00,0x04,0x01,0x11,0x01,0x1E,0x01,0x2B,0x01,0x38,0x01,0x45,0x01,0x52,0x01, - 0x5F,0x01,0x6C,0x01,0x79,0x01,0x86,0x01,0x93,0x01,0xA0,0x01,0xAD,0x01,0xBA,0x01,0xC7,0x01, - 0xD4,0x01,0xE1,0x01,0xEE,0x01,0xFB,0x01,0x08,0x02,0x15,0x02,0x22,0x02,0x2F,0x02,0x3C,0x02, - 0x49,0x02,0x56,0x02,0x63,0x02,0x70,0x02,0x7D,0x02,0x8A,0x02,0x97,0x02,0xA4,0x02,0xB1,0x02, - 0xBE,0x02,0xCB,0x02,0xD8,0x02,0xE5,0x02,0xF2,0x02,0xFF,0x02,0x0C,0x03,0x19,0x03,0x26,0x03, - 0x33,0x03,0x40,0x03,0x4D,0x03,0x5A,0x03,0x67,0x03,0x74,0x03,0x81,0x03,0x8E,0x03,0x9B,0x03, - 0xA8,0x03,0xB5,0x03,0xC2,0x03,0xCF,0x03,0xDC,0x03,0xE9,0x03,0xF6,0x03,0x03,0x04,0x10,0x04, - 0x1D,0x04,0x2A,0x04,0x37,0x04,0x44,0x04,0x51,0x04,0x5E,0x04,0x6B,0x04,0x78,0x04,0x85,0x04, - 0x92,0x04,0x9F,0x04,0xAC,0x04,0xB9,0x04,0xC6,0x04,0xD3,0x04, - - 7, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x21 '!' - 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x10,0x00,0x00, - - 7, // 0x22 '"' - 0x28,0x28,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x23 '#' - 0x24,0x24,0x24,0x7E,0x24,0x24,0x24,0x7E,0x24,0x24,0x24,0x00, - - 7, // 0x24 '$' - 0x10,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x10,0x00, - - 7, // 0x25 '%' - 0x32,0x54,0x64,0x08,0x08,0x10,0x10,0x26,0x2A,0x4C,0x00,0x00, - - 7, // 0x26 '&' - 0x00,0x20,0x50,0x50,0x50,0x20,0x54,0x54,0x48,0x34,0x00,0x00, - - 7, // 0x27 ''' - 0x10,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x28 '(' - 0x08,0x10,0x10,0x20,0x20,0x20,0x20,0x20,0x10,0x10,0x08,0x00, - - 7, // 0x29 ')' - 0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x00, - - 7, // 0x2A '*' - 0x00,0x00,0x10,0x54,0x38,0x7C,0x38,0x54,0x10,0x00,0x00,0x00, - - 7, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00, - - 7, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x20,0x40, - - 7, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00, - - 7, // 0x2F '/' - 0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00,0x00, - - 7, // 0x30 '0' - 0x00,0x38,0x44,0x44,0x54,0x54,0x54,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x31 '1' - 0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - - 7, // 0x32 '2' - 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, - - 7, // 0x33 '3' - 0x00,0x38,0x44,0x04,0x04,0x38,0x04,0x04,0x44,0x38,0x00,0x00, - - 7, // 0x34 '4' - 0x00,0x08,0x18,0x28,0x28,0x48,0x48,0x7C,0x08,0x08,0x00,0x00, - - 7, // 0x35 '5' - 0x00,0x7C,0x40,0x40,0x78,0x44,0x04,0x04,0x44,0x38,0x00,0x00, - - 7, // 0x36 '6' - 0x00,0x38,0x44,0x40,0x78,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x37 '7' - 0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x20,0x00,0x00, - - 7, // 0x38 '8' - 0x00,0x38,0x44,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x39 '9' - 0x00,0x38,0x44,0x44,0x44,0x3C,0x04,0x04,0x44,0x38,0x00,0x00, - - 7, // 0x3A ':' - 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x30,0x30,0x00,0x00, - - 7, // 0x3B ';' - 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x30,0x30,0x20,0x40, - - 7, // 0x3C '<' - 0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00,0x00, - - 7, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00,0x00, - - 7, // 0x3E '>' - 0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00,0x00, - - 7, // 0x3F '?' - 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x10,0x00,0x10,0x00,0x00, - - 7, // 0x40 '@' - 0x00,0x38,0x44,0x44,0x5C,0x54,0x54,0x4C,0x40,0x38,0x00,0x00, - - 7, // 0x41 'A' - 0x00,0x38,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x42 'B' - 0x00,0x78,0x44,0x44,0x44,0x78,0x44,0x44,0x44,0x78,0x00,0x00, - - 7, // 0x43 'C' - 0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x40,0x44,0x38,0x00,0x00, - - 7, // 0x44 'D' - 0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x44,0x48,0x70,0x00,0x00, - - 7, // 0x45 'E' - 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x7C,0x00,0x00, - - 7, // 0x46 'F' - 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x40,0x00,0x00, - - 7, // 0x47 'G' - 0x00,0x38,0x44,0x40,0x40,0x5C,0x44,0x44,0x4C,0x34,0x00,0x00, - - 7, // 0x48 'H' - 0x00,0x44,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x49 'I' - 0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - - 7, // 0x4A 'J' - 0x00,0x1C,0x08,0x08,0x08,0x08,0x08,0x48,0x48,0x30,0x00,0x00, - - 7, // 0x4B 'K' - 0x00,0x44,0x48,0x50,0x60,0x60,0x50,0x48,0x44,0x44,0x00,0x00, - - 7, // 0x4C 'L' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00, - - 7, // 0x4D 'M' - 0x00,0x44,0x6C,0x6C,0x54,0x54,0x44,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x4E 'N' - 0x00,0x44,0x64,0x64,0x54,0x54,0x4C,0x4C,0x44,0x44,0x00,0x00, - - 7, // 0x4F 'O' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x50 'P' - 0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00, - - 7, // 0x51 'Q' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00, - - 7, // 0x52 'R' - 0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x48,0x44,0x44,0x00,0x00, - - 7, // 0x53 'S' - 0x00,0x38,0x44,0x40,0x40,0x38,0x04,0x04,0x44,0x38,0x00,0x00, - - 7, // 0x54 'T' - 0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - - 7, // 0x55 'U' - 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x56 'V' - 0x00,0x44,0x44,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x00,0x00, - - 7, // 0x57 'W' - 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x54,0x28,0x00,0x00, - - 7, // 0x58 'X' - 0x00,0x44,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x59 'Y' - 0x00,0x44,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x00,0x00, - - 7, // 0x5A 'Z' - 0x00,0x7C,0x04,0x04,0x08,0x10,0x20,0x40,0x40,0x7C,0x00,0x00, - - 7, // 0x5B '[' - 0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00, - - 7, // 0x5C '\' - 0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x00, - - 7, // 0x5D ']' - 0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x38,0x00, - - 7, // 0x5E '^' - 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00, - - 7, // 0x60 '`' - 0x00,0x20,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x61 'a' - 0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x44,0x44,0x3C,0x00,0x00, - - 7, // 0x62 'b' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x00,0x00, - - 7, // 0x63 'c' - 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x40,0x44,0x38,0x00,0x00, - - 7, // 0x64 'd' - 0x00,0x04,0x04,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x00,0x00, - - 7, // 0x65 'e' - 0x00,0x00,0x00,0x38,0x44,0x44,0x7C,0x40,0x44,0x38,0x00,0x00, - - 7, // 0x66 'f' - 0x00,0x0C,0x10,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - - 7, // 0x67 'g' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x78, - - 7, // 0x68 'h' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x69 'i' - 0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - - 7, // 0x6A 'j' - 0x00,0x08,0x00,0x18,0x08,0x08,0x08,0x08,0x08,0x08,0x48,0x30, - - 7, // 0x6B 'k' - 0x00,0x40,0x40,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00, - - 7, // 0x6C 'l' - 0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - - 7, // 0x6D 'm' - 0x00,0x00,0x00,0x68,0x54,0x54,0x44,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x6E 'n' - 0x00,0x00,0x00,0x58,0x64,0x44,0x44,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x6F 'o' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x70 'p' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x40,0x40, - - 7, // 0x71 'q' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x04, - - 7, // 0x72 'r' - 0x00,0x00,0x00,0x58,0x24,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - - 7, // 0x73 's' - 0x00,0x00,0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x38,0x00,0x00, - - 7, // 0x74 't' - 0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x20,0x24,0x18,0x00,0x00, - - 7, // 0x75 'u' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x4C,0x34,0x00,0x00, - - 7, // 0x76 'v' - 0x00,0x00,0x00,0x44,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00, - - 7, // 0x77 'w' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x54,0x54,0x28,0x00,0x00, - - 7, // 0x78 'x' - 0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00, - - 7, // 0x79 'y' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x3C,0x08,0x70, - - 7, // 0x7A 'z' - 0x00,0x00,0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, - - 7, // 0x7B '{' - 0x18,0x20,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x20,0x18,0x00, - - 7, // 0x7C '|' - 0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00, - - 7, // 0x7D '}' - 0x60,0x10,0x10,0x10,0x10,0x0C,0x10,0x10,0x10,0x10,0x60,0x00, - - 7, // 0x7E '~' - 0x00,0x60,0x92,0x92,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x7F '' - 0x00,0x10,0x38,0x6C,0x44,0x44,0x7C,0x00,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u mcs7x12_mono_low[] = - { - 12, 4, 32, 128-32, - 0x00,0x00,0x0D,0x00,0x1A,0x00,0x27,0x00,0x34,0x00,0x41,0x00,0x4E,0x00,0x5B,0x00,0x68,0x00, - 0x75,0x00,0x82,0x00,0x8F,0x00,0x9C,0x00,0xA9,0x00,0xB6,0x00,0xC3,0x00,0xD0,0x00,0xDD,0x00, - 0xEA,0x00,0xF7,0x00,0x04,0x01,0x11,0x01,0x1E,0x01,0x2B,0x01,0x38,0x01,0x45,0x01,0x52,0x01, - 0x5F,0x01,0x6C,0x01,0x79,0x01,0x86,0x01,0x93,0x01,0xA0,0x01,0xAD,0x01,0xBA,0x01,0xC7,0x01, - 0xD4,0x01,0xE1,0x01,0xEE,0x01,0xFB,0x01,0x08,0x02,0x15,0x02,0x22,0x02,0x2F,0x02,0x3C,0x02, - 0x49,0x02,0x56,0x02,0x63,0x02,0x70,0x02,0x7D,0x02,0x8A,0x02,0x97,0x02,0xA4,0x02,0xB1,0x02, - 0xBE,0x02,0xCB,0x02,0xD8,0x02,0xE5,0x02,0xF2,0x02,0xFF,0x02,0x0C,0x03,0x19,0x03,0x26,0x03, - 0x33,0x03,0x40,0x03,0x4D,0x03,0x5A,0x03,0x67,0x03,0x74,0x03,0x81,0x03,0x8E,0x03,0x9B,0x03, - 0xA8,0x03,0xB5,0x03,0xC2,0x03,0xCF,0x03,0xDC,0x03,0xE9,0x03,0xF6,0x03,0x03,0x04,0x10,0x04, - 0x1D,0x04,0x2A,0x04,0x37,0x04,0x44,0x04,0x51,0x04,0x5E,0x04,0x6B,0x04,0x78,0x04,0x85,0x04, - 0x92,0x04,0x9F,0x04,0xAC,0x04,0xB9,0x04,0xC6,0x04,0xD3,0x04, - - 7, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x21 '!' - 0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x10,0x00,0x00, - - 7, // 0x22 '"' - 0x28,0x28,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x23 '#' - 0x00,0x28,0x28,0x7C,0x28,0x28,0x28,0x7C,0x28,0x28,0x00,0x00, - - 7, // 0x24 '$' - 0x00,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x00,0x00, - - 7, // 0x25 '%' - 0x34,0x54,0x68,0x08,0x10,0x10,0x20,0x2C,0x54,0x58,0x00,0x00, - - 7, // 0x26 '&' - 0x00,0x20,0x50,0x50,0x20,0x54,0x54,0x48,0x34,0x00,0x00,0x00, - - 7, // 0x27 ''' - 0x00,0x10,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x28 '(' - 0x08,0x10,0x10,0x20,0x20,0x20,0x20,0x20,0x10,0x10,0x08,0x00, - - 7, // 0x29 ')' - 0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x00, - - 7, // 0x2A '*' - 0x00,0x00,0x10,0x54,0x38,0x7C,0x38,0x54,0x10,0x00,0x00,0x00, - - 7, // 0x2B '+' - 0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00,0x00, - - 7, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x20,0x40,0x00, - - 7, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00, - - 7, // 0x2F '/' - 0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00,0x00, - - 7, // 0x30 '0' - 0x00,0x38,0x44,0x44,0x54,0x54,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x31 '1' - 0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, - - 7, // 0x32 '2' - 0x00,0x38,0x44,0x44,0x08,0x10,0x20,0x40,0x7C,0x00,0x00,0x00, - - 7, // 0x33 '3' - 0x00,0x38,0x44,0x04,0x38,0x04,0x04,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x34 '4' - 0x00,0x08,0x18,0x28,0x28,0x48,0x7C,0x08,0x08,0x00,0x00,0x00, - - 7, // 0x35 '5' - 0x00,0x7C,0x40,0x78,0x44,0x04,0x04,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x36 '6' - 0x00,0x38,0x44,0x40,0x78,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x37 '7' - 0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x00,0x00,0x00, - - 7, // 0x38 '8' - 0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x39 '9' - 0x00,0x38,0x44,0x44,0x44,0x3C,0x04,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x3A ':' - 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00,0x00,0x00, - - 7, // 0x3B ';' - 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x20,0x40,0x00, - - 7, // 0x3C '<' - 0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00,0x00, - - 7, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00,0x00, - - 7, // 0x3E '>' - 0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00,0x00, - - 7, // 0x3F '?' - 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x10,0x00,0x10,0x00,0x00, - - 7, // 0x40 '@' - 0x00,0x38,0x44,0x44,0x5C,0x54,0x4C,0x40,0x38,0x00,0x00,0x00, - - 7, // 0x41 'A' - 0x00,0x38,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x42 'B' - 0x00,0x78,0x44,0x44,0x78,0x44,0x44,0x44,0x78,0x00,0x00,0x00, - - 7, // 0x43 'C' - 0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x44 'D' - 0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x48,0x70,0x00,0x00,0x00, - - 7, // 0x45 'E' - 0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x40,0x7C,0x00,0x00,0x00, - - 7, // 0x46 'F' - 0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 7, // 0x47 'G' - 0x00,0x38,0x44,0x40,0x40,0x4C,0x44,0x4C,0x34,0x00,0x00,0x00, - - 7, // 0x48 'H' - 0x00,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x49 'I' - 0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, - - 7, // 0x4A 'J' - 0x00,0x1C,0x08,0x08,0x08,0x08,0x48,0x48,0x30,0x00,0x00,0x00, - - 7, // 0x4B 'K' - 0x00,0x44,0x48,0x50,0x60,0x60,0x50,0x48,0x44,0x00,0x00,0x00, - - 7, // 0x4C 'L' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00,0x00, - - 7, // 0x4D 'M' - 0x00,0x44,0x6C,0x54,0x54,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x4E 'N' - 0x00,0x44,0x64,0x64,0x54,0x54,0x4C,0x4C,0x44,0x00,0x00,0x00, - - 7, // 0x4F 'O' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x50 'P' - 0x00,0x78,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00,0x00, - - 7, // 0x51 'Q' - 0x00,0x38,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00,0x00, - - 7, // 0x52 'R' - 0x00,0x78,0x44,0x44,0x44,0x78,0x48,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x53 'S' - 0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x54 'T' - 0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00, - - 7, // 0x55 'U' - 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x56 'V' - 0x00,0x44,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x00,0x00,0x00, - - 7, // 0x57 'W' - 0x00,0x44,0x44,0x44,0x44,0x44,0x54,0x54,0x28,0x00,0x00,0x00, - - 7, // 0x58 'X' - 0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x59 'Y' - 0x00,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x00,0x00,0x00, - - 7, // 0x5A 'Z' - 0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x40,0x7C,0x00,0x00,0x00, - - 7, // 0x5B '[' - 0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00, - - 7, // 0x5C '\' - 0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x00, - - 7, // 0x5D ']' - 0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x38,0x00, - - 7, // 0x5E '^' - 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00, - - 7, // 0x60 '`' - 0x00,0x20,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x61 'a' - 0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x44,0x3C,0x00,0x00,0x00, - - 7, // 0x62 'b' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x78,0x00,0x00,0x00, - - 7, // 0x63 'c' - 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x64 'd' - 0x00,0x04,0x04,0x3C,0x44,0x44,0x44,0x44,0x3C,0x00,0x00,0x00, - - 7, // 0x65 'e' - 0x00,0x00,0x00,0x38,0x44,0x7C,0x40,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x66 'f' - 0x00,0x0C,0x10,0x38,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00, - - 7, // 0x67 'g' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x3C,0x04,0x44,0x38, - - 7, // 0x68 'h' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x69 'i' - 0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, - - 7, // 0x6A 'j' - 0x00,0x08,0x00,0x18,0x08,0x08,0x08,0x08,0x08,0x48,0x48,0x30, - - 7, // 0x6B 'k' - 0x00,0x40,0x40,0x4C,0x50,0x60,0x50,0x48,0x44,0x00,0x00,0x00, - - 7, // 0x6C 'l' - 0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, - - 7, // 0x6D 'm' - 0x00,0x00,0x00,0x68,0x54,0x54,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x6E 'n' - 0x00,0x00,0x00,0x58,0x64,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x6F 'o' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x70 'p' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40,0x40, - - 7, // 0x71 'q' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x3C,0x04,0x04,0x04, - - 7, // 0x72 'r' - 0x00,0x00,0x00,0x58,0x24,0x20,0x20,0x20,0x70,0x00,0x00,0x00, - - 7, // 0x73 's' - 0x00,0x00,0x00,0x38,0x44,0x30,0x08,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x74 't' - 0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x24,0x18,0x00,0x00,0x00, - - 7, // 0x75 'u' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x4C,0x34,0x00,0x00,0x00, - - 7, // 0x76 'v' - 0x00,0x00,0x00,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00,0x00, - - 7, // 0x77 'w' - 0x00,0x00,0x00,0x44,0x44,0x44,0x54,0x54,0x28,0x00,0x00,0x00, - - 7, // 0x78 'x' - 0x00,0x00,0x00,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x79 'y' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x08,0x70, - - 7, // 0x7A 'z' - 0x00,0x00,0x00,0x7C,0x08,0x10,0x20,0x40,0x7C,0x00,0x00,0x00, - - 7, // 0x7B '{' - 0x18,0x20,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x20,0x18,0x00, - - 7, // 0x7C '|' - 0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00, - - 7, // 0x7D '}' - 0x60,0x10,0x10,0x10,0x10,0x0C,0x10,0x10,0x10,0x10,0x60,0x00, - - 7, // 0x7E '~' - 0x00,0x24,0x54,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x7F '' - 0x00,0x10,0x38,0x6C,0x44,0x44,0x7C,0x00,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u verdana12[] = - { - 12, 3, 32, 128-32, - 0x00,0x00,0x0D,0x00,0x1A,0x00,0x27,0x00,0x34,0x00,0x41,0x00,0x5A,0x00,0x67,0x00,0x74,0x00, - 0x81,0x00,0x8E,0x00,0x9B,0x00,0xA8,0x00,0xB5,0x00,0xC2,0x00,0xCF,0x00,0xDC,0x00,0xE9,0x00, - 0xF6,0x00,0x03,0x01,0x10,0x01,0x1D,0x01,0x2A,0x01,0x37,0x01,0x44,0x01,0x51,0x01,0x5E,0x01, - 0x6B,0x01,0x78,0x01,0x85,0x01,0x92,0x01,0x9F,0x01,0xAC,0x01,0xC5,0x01,0xD2,0x01,0xDF,0x01, - 0xEC,0x01,0xF9,0x01,0x06,0x02,0x13,0x02,0x20,0x02,0x2D,0x02,0x3A,0x02,0x47,0x02,0x54,0x02, - 0x61,0x02,0x7A,0x02,0x87,0x02,0xA0,0x02,0xAD,0x02,0xC6,0x02,0xD3,0x02,0xE0,0x02,0xED,0x02, - 0xFA,0x02,0x07,0x03,0x20,0x03,0x2D,0x03,0x3A,0x03,0x47,0x03,0x54,0x03,0x61,0x03,0x6E,0x03, - 0x7B,0x03,0x88,0x03,0x95,0x03,0xA2,0x03,0xAF,0x03,0xBC,0x03,0xC9,0x03,0xD6,0x03,0xE3,0x03, - 0xF0,0x03,0xFD,0x03,0x0A,0x04,0x17,0x04,0x24,0x04,0x31,0x04,0x4A,0x04,0x57,0x04,0x64,0x04, - 0x71,0x04,0x7E,0x04,0x8B,0x04,0x98,0x04,0xA5,0x04,0xB2,0x04,0xBF,0x04,0xCC,0x04,0xD9,0x04, - 0xE6,0x04,0xF3,0x04,0x00,0x05,0x0D,0x05,0x1A,0x05,0x27,0x05, - - 3, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x21 '!' - 0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, - - 5, // 0x22 '"' - 0x00,0x00,0x50,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x28,0x7C,0x28,0x7C,0x28,0x00,0x00,0x00, - - 7, // 0x24 '$' - 0x00,0x00,0x10,0x10,0x3C,0x50,0x30,0x18,0x14,0x78,0x10,0x10, - - 11, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x4A,0x00,0x4A,0x00,0x35,0x80,0x0A,0x40,0x0A,0x40,0x11,0x80,0x00,0x00,0x00,0x00, - - 7, // 0x26 '&' - 0x00,0x00,0x00,0x30,0x48,0x48,0x32,0x4A,0x44,0x3A,0x00,0x00, - - 3, // 0x27 ''' - 0x00,0x00,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x28 '(' - 0x00,0x00,0x10,0x20,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x10, - - 4, // 0x29 ')' - 0x00,0x00,0x80,0x40,0x20,0x20,0x20,0x20,0x20,0x20,0x40,0x80, - - 7, // 0x2A '*' - 0x00,0x10,0x54,0x38,0x54,0x10,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00, - - 3, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x80,0x00, - - 5, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00, - - 3, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x00,0x00, - - 4, // 0x2F '/' - 0x00,0x00,0x10,0x10,0x20,0x20,0x40,0x40,0x40,0x80,0x80,0x00, - - 7, // 0x30 '0' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x31 '1' - 0x00,0x00,0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - - 7, // 0x32 '2' - 0x00,0x00,0x00,0x38,0x44,0x04,0x08,0x10,0x20,0x7C,0x00,0x00, - - 7, // 0x33 '3' - 0x00,0x00,0x00,0x38,0x44,0x04,0x18,0x04,0x44,0x38,0x00,0x00, - - 7, // 0x34 '4' - 0x00,0x00,0x00,0x08,0x18,0x28,0x48,0x7C,0x08,0x08,0x00,0x00, - - 7, // 0x35 '5' - 0x00,0x00,0x00,0x7C,0x40,0x78,0x04,0x04,0x44,0x38,0x00,0x00, - - 7, // 0x36 '6' - 0x00,0x00,0x00,0x18,0x20,0x40,0x78,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x37 '7' - 0x00,0x00,0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x10,0x00,0x00, - - 7, // 0x38 '8' - 0x00,0x00,0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x39 '9' - 0x00,0x00,0x00,0x38,0x44,0x44,0x3C,0x04,0x08,0x30,0x00,0x00, - - 4, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x00, - - 4, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x00,0x40,0x40,0x80,0x00, - - 7, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x04,0x18,0x60,0x18,0x04,0x00,0x00,0x00, - - 7, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x7C,0x00,0x00,0x00,0x00, - - 7, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x40,0x30,0x0C,0x30,0x40,0x00,0x00,0x00, - - 6, // 0x3F '?' - 0x00,0x00,0x00,0x70,0x08,0x08,0x10,0x20,0x00,0x20,0x00,0x00, - - 10, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x20,0x80,0x4E,0x80,0x52,0x80,0x52,0x80,0x4D,0x00,0x20,0x00,0x1F,0x00,0x00,0x00, - - 8, // 0x41 'A' - 0x00,0x00,0x00,0x18,0x18,0x24,0x24,0x7E,0x42,0x42,0x00,0x00, - - 7, // 0x42 'B' - 0x00,0x00,0x00,0x70,0x48,0x48,0x78,0x44,0x44,0x78,0x00,0x00, - - 8, // 0x43 'C' - 0x00,0x00,0x00,0x1C,0x22,0x40,0x40,0x40,0x22,0x1C,0x00,0x00, - - 8, // 0x44 'D' - 0x00,0x00,0x00,0x78,0x44,0x42,0x42,0x42,0x44,0x78,0x00,0x00, - - 7, // 0x45 'E' - 0x00,0x00,0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x7C,0x00,0x00, - - 6, // 0x46 'F' - 0x00,0x00,0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x40,0x00,0x00, - - 8, // 0x47 'G' - 0x00,0x00,0x00,0x1C,0x22,0x40,0x4E,0x42,0x22,0x1C,0x00,0x00, - - 8, // 0x48 'H' - 0x00,0x00,0x00,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x00,0x00, - - 5, // 0x49 'I' - 0x00,0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - - 5, // 0x4A 'J' - 0x00,0x00,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0xE0,0x00,0x00, - - 7, // 0x4B 'K' - 0x00,0x00,0x00,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00, - - 6, // 0x4C 'L' - 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00, - - 9, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x55,0x00,0x55,0x00,0x49,0x00,0x49,0x00,0x41,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x4E 'N' - 0x00,0x00,0x00,0x42,0x62,0x52,0x4A,0x46,0x42,0x42,0x00,0x00, - - 9, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x50 'P' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x78,0x40,0x40,0x00,0x00, - - 9, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x04,0x00,0x03,0x00, - - 7, // 0x52 'R' - 0x00,0x00,0x00,0x78,0x44,0x44,0x78,0x50,0x48,0x44,0x00,0x00, - - 7, // 0x53 'S' - 0x00,0x00,0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x38,0x00,0x00, - - 7, // 0x54 'T' - 0x00,0x00,0x00,0xFE,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - - 8, // 0x55 'U' - 0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, - - 8, // 0x56 'V' - 0x00,0x00,0x00,0x42,0x42,0x42,0x24,0x24,0x18,0x18,0x00,0x00, - - 9, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x49,0x00,0x49,0x00,0x55,0x00,0x55,0x00,0x22,0x00,0x22,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x58 'X' - 0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00, - - 7, // 0x59 'Y' - 0x00,0x00,0x00,0x44,0x44,0x28,0x28,0x10,0x10,0x10,0x00,0x00, - - 7, // 0x5A 'Z' - 0x00,0x00,0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, - - 4, // 0x5B '[' - 0x00,0x00,0x60,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x60, - - 4, // 0x5C '\' - 0x00,0x00,0x80,0x80,0x40,0x40,0x40,0x20,0x20,0x10,0x10,0x00, - - 4, // 0x5D ']' - 0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x60, - - 7, // 0x5E '^' - 0x00,0x00,0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC, - - 6, // 0x60 '`' - 0x00,0x00,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x30,0x08,0x38,0x48,0x38,0x00,0x00, - - 6, // 0x62 'b' - 0x00,0x00,0x40,0x40,0x40,0x70,0x48,0x48,0x48,0x70,0x00,0x00, - - 6, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x40,0x40,0x38,0x00,0x00, - - 6, // 0x64 'd' - 0x00,0x00,0x08,0x08,0x08,0x38,0x48,0x48,0x48,0x38,0x00,0x00, - - 6, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x78,0x40,0x38,0x00,0x00, - - 4, // 0x66 'f' - 0x00,0x00,0x30,0x40,0x40,0xE0,0x40,0x40,0x40,0x40,0x00,0x00, - - 6, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x38,0x48,0x48,0x48,0x38,0x08,0x30, - - 6, // 0x68 'h' - 0x00,0x00,0x40,0x40,0x40,0x70,0x48,0x48,0x48,0x48,0x00,0x00, - - 3, // 0x69 'i' - 0x00,0x00,0x00,0x40,0x00,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - - 3, // 0x6A 'j' - 0x00,0x00,0x00,0x40,0x00,0xC0,0x40,0x40,0x40,0x40,0x40,0x80, - - 6, // 0x6B 'k' - 0x00,0x00,0x40,0x40,0x40,0x48,0x50,0x60,0x50,0x48,0x00,0x00, - - 3, // 0x6C 'l' - 0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - - 9, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x70,0x48,0x48,0x48,0x48,0x00,0x00, - - 6, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x48,0x48,0x30,0x00,0x00, - - 6, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x70,0x48,0x48,0x48,0x70,0x40,0x40, - - 6, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x38,0x48,0x48,0x48,0x38,0x08,0x08, - - 4, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x50,0x60,0x40,0x40,0x40,0x00,0x00, - - 6, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x30,0x08,0x70,0x00,0x00, - - 4, // 0x74 't' - 0x00,0x00,0x00,0x00,0x40,0xF0,0x40,0x40,0x40,0x30,0x00,0x00, - - 6, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x48,0x48,0x48,0x48,0x38,0x00,0x00, - - 6, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x48,0x48,0x48,0x30,0x30,0x00,0x00, - - 7, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x44,0x54,0x54,0x28,0x28,0x00,0x00, - - 6, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x48,0x48,0x30,0x48,0x48,0x00,0x00, - - 6, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x48,0x48,0x48,0x30,0x10,0x20,0x20, - - 5, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x70,0x10,0x20,0x40,0x70,0x00,0x00, - - 6, // 0x7B '{' - 0x00,0x00,0x18,0x20,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x18, - - 5, // 0x7C '|' - 0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - - 6, // 0x7D '}' - 0x00,0x00,0x60,0x10,0x10,0x10,0x10,0x0C,0x10,0x10,0x10,0x60, - - 7, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x58,0x00,0x00,0x00,0x00, - - 9, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7F,0x00,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u verdana12_bold[] = - { - 12, 3, 32, 128-32, - 0x00,0x00,0x0D,0x00,0x1A,0x00,0x27,0x00,0x34,0x00,0x41,0x00,0x5A,0x00,0x67,0x00,0x74,0x00, - 0x81,0x00,0x8E,0x00,0x9B,0x00,0xA8,0x00,0xB5,0x00,0xC2,0x00,0xCF,0x00,0xDC,0x00,0xE9,0x00, - 0xF6,0x00,0x03,0x01,0x10,0x01,0x1D,0x01,0x2A,0x01,0x37,0x01,0x44,0x01,0x51,0x01,0x5E,0x01, - 0x6B,0x01,0x78,0x01,0x85,0x01,0x92,0x01,0x9F,0x01,0xAC,0x01,0xC5,0x01,0xD2,0x01,0xDF,0x01, - 0xEC,0x01,0xF9,0x01,0x06,0x02,0x13,0x02,0x20,0x02,0x2D,0x02,0x3A,0x02,0x47,0x02,0x54,0x02, - 0x61,0x02,0x6E,0x02,0x7B,0x02,0x88,0x02,0x95,0x02,0xA2,0x02,0xAF,0x02,0xBC,0x02,0xC9,0x02, - 0xD6,0x02,0xE3,0x02,0xFC,0x02,0x09,0x03,0x16,0x03,0x23,0x03,0x30,0x03,0x3D,0x03,0x4A,0x03, - 0x57,0x03,0x64,0x03,0x71,0x03,0x7E,0x03,0x8B,0x03,0x98,0x03,0xA5,0x03,0xB2,0x03,0xBF,0x03, - 0xCC,0x03,0xD9,0x03,0xE6,0x03,0xF3,0x03,0x00,0x04,0x0D,0x04,0x26,0x04,0x33,0x04,0x40,0x04, - 0x4D,0x04,0x5A,0x04,0x67,0x04,0x74,0x04,0x81,0x04,0x8E,0x04,0x9B,0x04,0xB4,0x04,0xC1,0x04, - 0xCE,0x04,0xDB,0x04,0xE8,0x04,0xF5,0x04,0x02,0x05,0x0F,0x05, - - 3, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x21 '!' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x00,0x60,0x00,0x00, - - 5, // 0x22 '"' - 0x00,0x00,0xD8,0xD8,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x23 '#' - 0x00,0x00,0x00,0x14,0x14,0x7E,0x28,0xFC,0x50,0x50,0x00,0x00, - - 6, // 0x24 '$' - 0x00,0x00,0x20,0x20,0x70,0xE8,0xE0,0x38,0xB8,0x70,0x20,0x20, - - 11, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x94,0x00,0x94,0x00,0x69,0x80,0x0A,0x40,0x0A,0x40,0x11,0x80,0x00,0x00,0x00,0x00, - - 8, // 0x26 '&' - 0x00,0x00,0x00,0x70,0xD8,0xD8,0x76,0xDC,0xCC,0x76,0x00,0x00, - - 3, // 0x27 ''' - 0x00,0x00,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x28 '(' - 0x00,0x00,0x30,0x60,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x60,0x30, - - 5, // 0x29 ')' - 0x00,0x00,0xC0,0x60,0x30,0x30,0x30,0x30,0x30,0x30,0x60,0xC0, - - 6, // 0x2A '*' - 0x00,0x00,0x20,0xA8,0x70,0xA8,0x20,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00, - - 3, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x80,0x00, - - 4, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00, - - 3, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00, - - 6, // 0x2F '/' - 0x00,0x00,0x08,0x08,0x10,0x10,0x20,0x40,0x40,0x80,0x80,0x00, - - 6, // 0x30 '0' - 0x00,0x00,0x00,0x70,0xD8,0xD8,0xD8,0xD8,0xD8,0x70,0x00,0x00, - - 6, // 0x31 '1' - 0x00,0x00,0x00,0x30,0x70,0x30,0x30,0x30,0x30,0x78,0x00,0x00, - - 6, // 0x32 '2' - 0x00,0x00,0x00,0x70,0x98,0x18,0x30,0x60,0xC0,0xF8,0x00,0x00, - - 6, // 0x33 '3' - 0x00,0x00,0x00,0x70,0x98,0x18,0x70,0x18,0x98,0x70,0x00,0x00, - - 6, // 0x34 '4' - 0x00,0x00,0x00,0x18,0x38,0x58,0x98,0xFC,0x18,0x18,0x00,0x00, - - 6, // 0x35 '5' - 0x00,0x00,0x00,0xF8,0xC0,0xF0,0x18,0x18,0x98,0x70,0x00,0x00, - - 6, // 0x36 '6' - 0x00,0x00,0x00,0x70,0xC0,0xF0,0xD8,0xD8,0xD8,0x70,0x00,0x00, - - 6, // 0x37 '7' - 0x00,0x00,0x00,0xF8,0x18,0x30,0x30,0x60,0x60,0xC0,0x00,0x00, - - 6, // 0x38 '8' - 0x00,0x00,0x00,0x70,0xD8,0xD8,0x70,0xD8,0xD8,0x70,0x00,0x00, - - 6, // 0x39 '9' - 0x00,0x00,0x00,0x70,0xD8,0xD8,0xD8,0x78,0x18,0x70,0x00,0x00, - - 4, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x60,0x60,0x00,0x00, - - 4, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x60,0x60,0x40,0x00, - - 8, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x04,0x18,0x60,0x60,0x18,0x04,0x00,0x00, - - 8, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x7C,0x00,0x00,0x00,0x00, - - 8, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x40,0x30,0x0C,0x0C,0x30,0x40,0x00,0x00, - - 6, // 0x3F '?' - 0x00,0x00,0x00,0xF0,0x18,0x18,0x30,0x60,0x00,0x60,0x00,0x00, - - 9, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x42,0x00,0x9D,0x00,0xA5,0x00,0xA5,0x00,0x9E,0x00,0x40,0x00,0x3C,0x00,0x00,0x00, - - 8, // 0x41 'A' - 0x00,0x00,0x00,0x38,0x38,0x6C,0x6C,0x7C,0xC6,0xC6,0x00,0x00, - - 7, // 0x42 'B' - 0x00,0x00,0x00,0xF8,0xCC,0xCC,0xF8,0xCC,0xCC,0xF8,0x00,0x00, - - 6, // 0x43 'C' - 0x00,0x00,0x00,0x70,0xC8,0xC0,0xC0,0xC0,0xC8,0x70,0x00,0x00, - - 7, // 0x44 'D' - 0x00,0x00,0x00,0xF8,0xCC,0xCC,0xCC,0xCC,0xCC,0xF8,0x00,0x00, - - 6, // 0x45 'E' - 0x00,0x00,0x00,0xF8,0xC0,0xC0,0xF8,0xC0,0xC0,0xF8,0x00,0x00, - - 6, // 0x46 'F' - 0x00,0x00,0x00,0xF8,0xC0,0xC0,0xF8,0xC0,0xC0,0xC0,0x00,0x00, - - 7, // 0x47 'G' - 0x00,0x00,0x00,0x78,0xC4,0xC0,0xC0,0xDC,0xCC,0x7C,0x00,0x00, - - 7, // 0x48 'H' - 0x00,0x00,0x00,0xCC,0xCC,0xCC,0xFC,0xCC,0xCC,0xCC,0x00,0x00, - - 5, // 0x49 'I' - 0x00,0x00,0x00,0xF0,0x60,0x60,0x60,0x60,0x60,0xF0,0x00,0x00, - - 5, // 0x4A 'J' - 0x00,0x00,0x00,0x70,0x30,0x30,0x30,0x30,0x30,0xE0,0x00,0x00, - - 7, // 0x4B 'K' - 0x00,0x00,0x00,0xCC,0xD8,0xF0,0xE0,0xF0,0xD8,0xCC,0x00,0x00, - - 6, // 0x4C 'L' - 0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xF8,0x00,0x00, - - 8, // 0x4D 'M' - 0x00,0x00,0x00,0x82,0xC6,0xEE,0xB6,0xB6,0x86,0x86,0x00,0x00, - - 7, // 0x4E 'N' - 0x00,0x00,0x00,0x84,0xC4,0xE4,0xB4,0x9C,0x8C,0x84,0x00,0x00, - - 8, // 0x4F 'O' - 0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00, - - 7, // 0x50 'P' - 0x00,0x00,0x00,0xF8,0xCC,0xCC,0xCC,0xF8,0xC0,0xC0,0x00,0x00, - - 8, // 0x51 'Q' - 0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x18,0x0E, - - 7, // 0x52 'R' - 0x00,0x00,0x00,0xF8,0xCC,0xCC,0xF8,0xD8,0xCC,0xC6,0x00,0x00, - - 6, // 0x53 'S' - 0x00,0x00,0x00,0x70,0xC8,0xC0,0x70,0x18,0x98,0x70,0x00,0x00, - - 6, // 0x54 'T' - 0x00,0x00,0x00,0xFC,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x00, - - 7, // 0x55 'U' - 0x00,0x00,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x78,0x00,0x00, - - 7, // 0x56 'V' - 0x00,0x00,0x00,0xCC,0xCC,0x78,0x78,0x78,0x30,0x30,0x00,0x00, - - 11, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0xCC,0xC0,0xCC,0xC0,0x6D,0x80,0x6D,0x80,0x73,0x80,0x33,0x00,0x33,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x58 'X' - 0x00,0x00,0x00,0xCC,0xCC,0x78,0x30,0x78,0xCC,0xCC,0x00,0x00, - - 7, // 0x59 'Y' - 0x00,0x00,0x00,0xCC,0xCC,0x78,0x30,0x30,0x30,0x30,0x00,0x00, - - 6, // 0x5A 'Z' - 0x00,0x00,0x00,0xF8,0x18,0x30,0x60,0xC0,0xC0,0xF8,0x00,0x00, - - 5, // 0x5B '[' - 0x00,0x00,0x70,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x70, - - 6, // 0x5C '\' - 0x00,0x00,0x80,0x80,0x40,0x40,0x20,0x10,0x10,0x08,0x08,0x00, - - 5, // 0x5D ']' - 0x00,0x00,0x70,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x70, - - 8, // 0x5E '^' - 0x00,0x00,0x00,0x18,0x3C,0x66,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC, - - 6, // 0x60 '`' - 0x00,0x00,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x70,0x18,0x78,0xD8,0x78,0x00,0x00, - - 6, // 0x62 'b' - 0x00,0x00,0xC0,0xC0,0xC0,0xF0,0xD8,0xD8,0xD8,0xF0,0x00,0x00, - - 5, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x70,0xC0,0xC0,0xC0,0x70,0x00,0x00, - - 6, // 0x64 'd' - 0x00,0x00,0x18,0x18,0x18,0x78,0xD8,0xD8,0xD8,0x78,0x00,0x00, - - 6, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x70,0xD8,0xF8,0xC0,0x78,0x00,0x00, - - 5, // 0x66 'f' - 0x00,0x00,0x38,0x60,0x60,0xF8,0x60,0x60,0x60,0x60,0x00,0x00, - - 6, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x78,0xD8,0xD8,0xD8,0x78,0x18,0x70, - - 6, // 0x68 'h' - 0x00,0x00,0xC0,0xC0,0xC0,0xF0,0xD8,0xD8,0xD8,0xD8,0x00,0x00, - - 3, // 0x69 'i' - 0x00,0x00,0x00,0xC0,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00, - - 4, // 0x6A 'j' - 0x00,0x00,0x00,0x60,0x00,0xE0,0x60,0x60,0x60,0x60,0x60,0xC0, - - 6, // 0x6B 'k' - 0x00,0x00,0xC0,0xC0,0xC0,0xD8,0xD8,0xF0,0xD8,0xD8,0x00,0x00, - - 3, // 0x6C 'l' - 0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00, - - 9, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF6,0x00,0xDB,0x00,0xDB,0x00,0xDB,0x00,0xDB,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0xF0,0xD8,0xD8,0xD8,0xD8,0x00,0x00, - - 6, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x70,0xD8,0xD8,0xD8,0x70,0x00,0x00, - - 6, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0xF0,0xD8,0xD8,0xD8,0xF0,0xC0,0xC0, - - 6, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x78,0xD8,0xD8,0xD8,0x78,0x18,0x18, - - 4, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0xD0,0xE0,0xC0,0xC0,0xC0,0x00,0x00, - - 5, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x70,0xC0,0xF0,0x30,0xE0,0x00,0x00, - - 5, // 0x74 't' - 0x00,0x00,0x00,0x60,0x60,0xF8,0x60,0x60,0x60,0x38,0x00,0x00, - - 6, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0xD8,0xD8,0x78,0x00,0x00, - - 6, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0xD8,0x70,0x70,0x00,0x00, - - 9, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDB,0x00,0xDB,0x00,0xDB,0x00,0x66,0x00,0x66,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x70,0xD8,0xD8,0x00,0x00, - - 6, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0xD8,0x70,0x70,0x30,0x60, - - 5, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0xF0,0x30,0x60,0xC0,0xF0,0x00,0x00, - - 6, // 0x7B '{' - 0x00,0x00,0x18,0x30,0x30,0x30,0xE0,0x30,0x30,0x30,0x30,0x18, - - 5, // 0x7C '|' - 0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - - 6, // 0x7D '}' - 0x00,0x00,0xC0,0x60,0x60,0x60,0x38,0x60,0x60,0x60,0x60,0xC0, - - 8, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x92,0x8C,0x00,0x00,0x00, - - 9, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7F,0x00,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u verdana13[] = - { - 13, 3, 32, 128-32, - 0x00,0x00,0x0E,0x00,0x1C,0x00,0x2A,0x00,0x45,0x00,0x53,0x00,0x6E,0x00,0x7C,0x00,0x8A,0x00, - 0x98,0x00,0xA6,0x00,0xB4,0x00,0xCF,0x00,0xDD,0x00,0xEB,0x00,0xF9,0x00,0x07,0x01,0x15,0x01, - 0x23,0x01,0x31,0x01,0x3F,0x01,0x4D,0x01,0x5B,0x01,0x69,0x01,0x77,0x01,0x85,0x01,0x93,0x01, - 0xA1,0x01,0xAF,0x01,0xCA,0x01,0xE5,0x01,0x00,0x02,0x0E,0x02,0x29,0x02,0x37,0x02,0x45,0x02, - 0x60,0x02,0x7B,0x02,0x89,0x02,0x97,0x02,0xB2,0x02,0xC0,0x02,0xCE,0x02,0xDC,0x02,0xEA,0x02, - 0xF8,0x02,0x13,0x03,0x21,0x03,0x3C,0x03,0x4A,0x03,0x65,0x03,0x73,0x03,0x81,0x03,0x8F,0x03, - 0x9D,0x03,0xAB,0x03,0xC6,0x03,0xD4,0x03,0xE2,0x03,0xF0,0x03,0xFE,0x03,0x0C,0x04,0x1A,0x04, - 0x35,0x04,0x43,0x04,0x51,0x04,0x5F,0x04,0x6D,0x04,0x7B,0x04,0x89,0x04,0x97,0x04,0xA5,0x04, - 0xB3,0x04,0xC1,0x04,0xCF,0x04,0xDD,0x04,0xEB,0x04,0xF9,0x04,0x14,0x05,0x22,0x05,0x30,0x05, - 0x3E,0x05,0x4C,0x05,0x5A,0x05,0x68,0x05,0x76,0x05,0x84,0x05,0x92,0x05,0xAD,0x05,0xBB,0x05, - 0xC9,0x05,0xD7,0x05,0xE5,0x05,0xF3,0x05,0x01,0x06,0x1C,0x06, - - 4, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x21 '!' - 0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, - - 5, // 0x22 '"' - 0x00,0x00,0x50,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0x00,0x0A,0x00,0x3F,0x00,0x14,0x00,0x14,0x00,0x7E,0x00,0x28,0x00,0x28,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x24 '$' - 0x00,0x00,0x10,0x10,0x3C,0x50,0x50,0x38,0x14,0x14,0x78,0x10,0x10, - - 12, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x49,0x00,0x4A,0x00,0x32,0x00,0x04,0xC0,0x05,0x20,0x09,0x20,0x08,0xC0,0x00,0x00,0x00,0x00, - - 8, // 0x26 '&' - 0x00,0x00,0x00,0x30,0x48,0x48,0x32,0x4A,0x44,0x46,0x39,0x00,0x00, - - 3, // 0x27 ''' - 0x00,0x00,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x28 '(' - 0x00,0x00,0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10, - - 5, // 0x29 ')' - 0x00,0x00,0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x20,0x40, - - 7, // 0x2A '*' - 0x00,0x00,0x10,0x54,0x38,0x54,0x10,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x7F,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x40, - - 5, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00, - - 5, // 0x2F '/' - 0x00,0x00,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80,0x00, - - 7, // 0x30 '0' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x31 '1' - 0x00,0x00,0x00,0x10,0x70,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00, - - 7, // 0x32 '2' - 0x00,0x00,0x00,0x38,0x44,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, - - 7, // 0x33 '3' - 0x00,0x00,0x00,0x38,0x44,0x04,0x18,0x04,0x04,0x44,0x38,0x00,0x00, - - 7, // 0x34 '4' - 0x00,0x00,0x00,0x08,0x18,0x28,0x48,0x88,0xFC,0x08,0x08,0x00,0x00, - - 7, // 0x35 '5' - 0x00,0x00,0x00,0x7C,0x40,0x40,0x78,0x04,0x04,0x44,0x38,0x00,0x00, - - 7, // 0x36 '6' - 0x00,0x00,0x00,0x18,0x20,0x40,0x78,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x37 '7' - 0x00,0x00,0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x00,0x00, - - 7, // 0x38 '8' - 0x00,0x00,0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x39 '9' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x3C,0x04,0x08,0x30,0x00,0x00, - - 5, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x20,0x20,0x00,0x00, - - 5, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x20,0x20,0x20,0x40, - - 9, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x18,0x00,0x60,0x00,0x18,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x0C,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x3F '?' - 0x00,0x00,0x00,0x70,0x08,0x08,0x10,0x20,0x20,0x00,0x20,0x00,0x00, - - 10, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x20,0x80,0x4E,0x80,0x52,0x80,0x52,0x80,0x52,0x80,0x4D,0x00,0x20,0x00,0x1E,0x00,0x00,0x00, - - 8, // 0x41 'A' - 0x00,0x00,0x00,0x18,0x18,0x24,0x24,0x24,0x7E,0x42,0x42,0x00,0x00, - - 8, // 0x42 'B' - 0x00,0x00,0x00,0x78,0x44,0x44,0x7C,0x42,0x42,0x42,0x7C,0x00,0x00, - - 9, // 0x43 'C' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x44 'D' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x42,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x45 'E' - 0x00,0x00,0x00,0x7C,0x40,0x40,0x7C,0x40,0x40,0x40,0x7C,0x00,0x00, - - 6, // 0x46 'F' - 0x00,0x00,0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x40,0x40,0x00,0x00, - - 9, // 0x47 'G' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x00,0x40,0x00,0x47,0x00,0x41,0x00,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x48 'H' - 0x00,0x00,0x00,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x42,0x00,0x00, - - 5, // 0x49 'I' - 0x00,0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - - 5, // 0x4A 'J' - 0x00,0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0xE0,0x00,0x00, - - 8, // 0x4B 'K' - 0x00,0x00,0x00,0x42,0x44,0x48,0x50,0x70,0x48,0x44,0x42,0x00,0x00, - - 6, // 0x4C 'L' - 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00, - - 9, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x55,0x00,0x55,0x00,0x49,0x00,0x49,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x4E 'N' - 0x00,0x00,0x00,0x62,0x62,0x52,0x52,0x4A,0x4A,0x46,0x46,0x00,0x00, - - 9, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x50 'P' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00, - - 9, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x04,0x00,0x03,0x00, - - 8, // 0x52 'R' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x78,0x48,0x44,0x42,0x00,0x00, - - 8, // 0x53 'S' - 0x00,0x00,0x00,0x3C,0x42,0x40,0x30,0x0C,0x02,0x42,0x3C,0x00,0x00, - - 7, // 0x54 'T' - 0x00,0x00,0x00,0xFE,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - - 8, // 0x55 'U' - 0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, - - 8, // 0x56 'V' - 0x00,0x00,0x00,0x42,0x42,0x42,0x24,0x24,0x24,0x18,0x18,0x00,0x00, - - 11, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x40,0x44,0x40,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x11,0x00,0x11,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x58 'X' - 0x00,0x00,0x00,0x42,0x42,0x24,0x18,0x18,0x24,0x42,0x42,0x00,0x00, - - 7, // 0x59 'Y' - 0x00,0x00,0x00,0x82,0x44,0x28,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - - 8, // 0x5A 'Z' - 0x00,0x00,0x00,0x7E,0x02,0x04,0x08,0x10,0x20,0x40,0x7E,0x00,0x00, - - 5, // 0x5B '[' - 0x00,0x00,0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70, - - 5, // 0x5C '\' - 0x00,0x00,0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x00, - - 5, // 0x5D ']' - 0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70, - - 9, // 0x5E '^' - 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x14,0x00,0x22,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE, - - 7, // 0x60 '`' - 0x00,0x00,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x44,0x3C,0x00,0x00, - - 7, // 0x62 'b' - 0x00,0x00,0x40,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x78,0x00,0x00, - - 6, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x44,0x38,0x00,0x00, - - 7, // 0x64 'd' - 0x00,0x00,0x04,0x04,0x04,0x3C,0x44,0x44,0x44,0x44,0x3C,0x00,0x00, - - 7, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x7C,0x40,0x44,0x38,0x00,0x00, - - 4, // 0x66 'f' - 0x00,0x00,0x30,0x40,0x40,0xF0,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - - 7, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x3C,0x04,0x38, - - 7, // 0x68 'h' - 0x00,0x00,0x40,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x00,0x00, - - 3, // 0x69 'i' - 0x00,0x00,0x40,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - - 4, // 0x6A 'j' - 0x00,0x00,0x20,0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0xC0, - - 7, // 0x6B 'k' - 0x00,0x00,0x40,0x40,0x40,0x44,0x48,0x50,0x70,0x48,0x44,0x00,0x00, - - 3, // 0x6C 'l' - 0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - - 11, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7B,0x80,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x00,0x00,0x00,0x00, - - 7, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40, - - 7, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x3C,0x04,0x04, - - 5, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x58,0x60,0x40,0x40,0x40,0x40,0x00,0x00, - - 6, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x60,0x18,0x08,0x70,0x00,0x00, - - 4, // 0x74 't' - 0x00,0x00,0x00,0x40,0x40,0xF0,0x40,0x40,0x40,0x40,0x30,0x00,0x00, - - 7, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x3C,0x00,0x00, - - 7, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00, - - 9, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x49,0x00,0x55,0x00,0x55,0x00,0x22,0x00,0x22,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x44,0x28,0x10,0x10,0x28,0x44,0x00,0x00, - - 7, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x44,0x28,0x28,0x28,0x10,0x10,0x10,0x20, - - 6, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x78,0x08,0x10,0x20,0x40,0x78,0x00,0x00, - - 7, // 0x7B '{' - 0x00,0x00,0x0C,0x10,0x10,0x10,0x10,0x60,0x10,0x10,0x10,0x10,0x0C, - - 5, // 0x7C '|' - 0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - - 7, // 0x7D '}' - 0x00,0x00,0x60,0x10,0x10,0x10,0x10,0x0C,0x10,0x10,0x10,0x10,0x60, - - 9, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x49,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x7F,0x80,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u verdana13_bold[] = - { - 13, 3, 32, 128-32, - 0x00,0x00,0x0E,0x00,0x1C,0x00,0x2A,0x00,0x45,0x00,0x53,0x00,0x6E,0x00,0x89,0x00,0x97,0x00, - 0xA5,0x00,0xB3,0x00,0xC1,0x00,0xDC,0x00,0xEA,0x00,0xF8,0x00,0x06,0x01,0x14,0x01,0x22,0x01, - 0x30,0x01,0x3E,0x01,0x4C,0x01,0x5A,0x01,0x68,0x01,0x76,0x01,0x84,0x01,0x92,0x01,0xA0,0x01, - 0xAE,0x01,0xBC,0x01,0xD7,0x01,0xF2,0x01,0x0D,0x02,0x1B,0x02,0x36,0x02,0x51,0x02,0x5F,0x02, - 0x6D,0x02,0x88,0x02,0x96,0x02,0xA4,0x02,0xBF,0x02,0xDA,0x02,0xE8,0x02,0xF6,0x02,0x04,0x03, - 0x12,0x03,0x2D,0x03,0x48,0x03,0x63,0x03,0x71,0x03,0x8C,0x03,0x9A,0x03,0xA8,0x03,0xB6,0x03, - 0xD1,0x03,0xDF,0x03,0xFA,0x03,0x08,0x04,0x16,0x04,0x24,0x04,0x32,0x04,0x40,0x04,0x4E,0x04, - 0x69,0x04,0x77,0x04,0x85,0x04,0x93,0x04,0xA1,0x04,0xAF,0x04,0xBD,0x04,0xCB,0x04,0xD9,0x04, - 0xE7,0x04,0xF5,0x04,0x03,0x05,0x11,0x05,0x1F,0x05,0x2D,0x05,0x48,0x05,0x56,0x05,0x64,0x05, - 0x72,0x05,0x80,0x05,0x8E,0x05,0x9C,0x05,0xAA,0x05,0xB8,0x05,0xC6,0x05,0xE1,0x05,0xEF,0x05, - 0xFD,0x05,0x0B,0x06,0x19,0x06,0x27,0x06,0x35,0x06,0x50,0x06, - - 4, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x21 '!' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x60,0x00,0x00, - - 7, // 0x22 '"' - 0x00,0x00,0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0x00,0x0A,0x00,0x3F,0x00,0x14,0x00,0x14,0x00,0x7E,0x00,0x28,0x00,0x28,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x24 '$' - 0x00,0x00,0x08,0x08,0x3C,0x6A,0x68,0x3C,0x16,0x56,0x3C,0x10,0x10, - - 14, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x80,0x6C,0x80,0x6D,0x00,0x6D,0x70,0x3A,0xD8,0x02,0xD8,0x04,0xD8,0x04,0x70,0x00,0x00,0x00,0x00, - - 10, // 0x26 '&' - 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x6C,0x00,0x6C,0x00,0x39,0x80,0x6D,0x00,0x66,0x00,0x63,0x00,0x3D,0x80,0x00,0x00,0x00,0x00, - - 4, // 0x27 ''' - 0x00,0x00,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x28 '(' - 0x00,0x00,0x18,0x30,0x30,0x60,0x60,0x60,0x60,0x60,0x30,0x30,0x18, - - 6, // 0x29 ')' - 0x00,0x00,0x60,0x30,0x30,0x18,0x18,0x18,0x18,0x18,0x30,0x30,0x60, - - 8, // 0x2A '*' - 0x00,0x00,0x10,0x54,0x38,0x54,0x10,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x7F,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x60,0x40, - - 6, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00, - - 8, // 0x2F '/' - 0x00,0x00,0x06,0x06,0x0C,0x0C,0x18,0x18,0x18,0x30,0x30,0x60,0x60, - - 8, // 0x30 '0' - 0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x66,0x66,0x66,0x3C,0x00,0x00, - - 8, // 0x31 '1' - 0x00,0x00,0x00,0x18,0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00, - - 8, // 0x32 '2' - 0x00,0x00,0x00,0x3C,0x66,0x06,0x0C,0x18,0x30,0x60,0x7E,0x00,0x00, - - 8, // 0x33 '3' - 0x00,0x00,0x00,0x3C,0x66,0x06,0x1C,0x06,0x06,0x66,0x3C,0x00,0x00, - - 8, // 0x34 '4' - 0x00,0x00,0x00,0x04,0x0C,0x1C,0x2C,0x4C,0x7E,0x0C,0x0C,0x00,0x00, - - 8, // 0x35 '5' - 0x00,0x00,0x00,0x3E,0x30,0x30,0x3C,0x06,0x06,0x66,0x3C,0x00,0x00, - - 8, // 0x36 '6' - 0x00,0x00,0x00,0x1C,0x30,0x60,0x7C,0x66,0x66,0x66,0x3C,0x00,0x00, - - 8, // 0x37 '7' - 0x00,0x00,0x00,0x7E,0x06,0x0C,0x0C,0x18,0x18,0x30,0x30,0x00,0x00, - - 8, // 0x38 '8' - 0x00,0x00,0x00,0x3C,0x66,0x66,0x3C,0x66,0x66,0x66,0x3C,0x00,0x00, - - 8, // 0x39 '9' - 0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x3E,0x06,0x0C,0x38,0x00,0x00, - - 4, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00, - - 4, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x60,0x40, - - 9, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x18,0x00,0x06,0x00,0x01,0x00,0x06,0x00,0x18,0x00,0x60,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x3F '?' - 0x00,0x00,0x00,0x38,0x4C,0x0C,0x18,0x30,0x30,0x00,0x30,0x00,0x00, - - 11, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x20,0x40,0x4F,0x40,0x5B,0x40,0x5B,0x40,0x5B,0x40,0x4F,0x80,0x20,0x00,0x1F,0x00,0x00,0x00, - - 9, // 0x41 'A' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x1C,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x7F,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x42 'B' - 0x00,0x00,0x00,0x7C,0x66,0x66,0x7C,0x66,0x66,0x66,0x7C,0x00,0x00, - - 8, // 0x43 'C' - 0x00,0x00,0x00,0x3C,0x62,0x60,0x60,0x60,0x60,0x62,0x3C,0x00,0x00, - - 9, // 0x44 'D' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x66,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x66,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x45 'E' - 0x00,0x00,0x00,0x7E,0x60,0x60,0x7E,0x60,0x60,0x60,0x7E,0x00,0x00, - - 8, // 0x46 'F' - 0x00,0x00,0x00,0x7E,0x60,0x60,0x7E,0x60,0x60,0x60,0x60,0x00,0x00, - - 9, // 0x47 'G' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x61,0x00,0x60,0x00,0x60,0x00,0x67,0x00,0x63,0x00,0x63,0x00,0x3F,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x48 'H' - 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7F,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x49 'I' - 0x00,0x00,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00, - - 6, // 0x4A 'J' - 0x00,0x00,0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0xF0,0x00,0x00, - - 8, // 0x4B 'K' - 0x00,0x00,0x00,0x66,0x6C,0x78,0x70,0x70,0x78,0x6C,0x66,0x00,0x00, - - 7, // 0x4C 'L' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x7E,0x00,0x00, - - 10, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x80,0x71,0x80,0x7B,0x80,0x5D,0x80,0x49,0x80,0x41,0x80,0x41,0x80,0x41,0x80,0x00,0x00,0x00,0x00, - - 9, // 0x4E 'N' - 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x61,0x00,0x71,0x00,0x59,0x00,0x4D,0x00,0x47,0x00,0x43,0x00,0x41,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x50 'P' - 0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x7C,0x60,0x60,0x60,0x00,0x00, - - 9, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x0C,0x00,0x07,0x00, - - 8, // 0x52 'R' - 0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x7C,0x6C,0x66,0x63,0x00,0x00, - - 8, // 0x53 'S' - 0x00,0x00,0x00,0x3C,0x62,0x60,0x7C,0x3E,0x06,0x46,0x3C,0x00,0x00, - - 8, // 0x54 'T' - 0x00,0x00,0x00,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00, - - 9, // 0x55 'U' - 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x56 'V' - 0x00,0x00,0x00,0x66,0x66,0x66,0x3C,0x3C,0x3C,0x18,0x18,0x00,0x00, - - 12, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x60,0x66,0x60,0x66,0x60,0x36,0xC0,0x3F,0xC0,0x39,0xC0,0x19,0x80,0x19,0x80,0x00,0x00,0x00,0x00, - - 8, // 0x58 'X' - 0x00,0x00,0x00,0x66,0x66,0x3C,0x18,0x18,0x3C,0x66,0x66,0x00,0x00, - - 8, // 0x59 'Y' - 0x00,0x00,0x00,0x66,0x66,0x3C,0x3C,0x18,0x18,0x18,0x18,0x00,0x00, - - 8, // 0x5A 'Z' - 0x00,0x00,0x00,0x7E,0x06,0x0E,0x1C,0x38,0x70,0x60,0x7E,0x00,0x00, - - 6, // 0x5B '[' - 0x00,0x00,0x78,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x78, - - 8, // 0x5C '\' - 0x00,0x00,0x60,0x60,0x30,0x30,0x18,0x18,0x18,0x0C,0x0C,0x06,0x06, - - 6, // 0x5D ']' - 0x00,0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x78, - - 10, // 0x5E '^' - 0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, - - 8, // 0x60 '`' - 0x00,0x00,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x06,0x3E,0x66,0x66,0x3E,0x00,0x00, - - 8, // 0x62 'b' - 0x00,0x00,0x60,0x60,0x60,0x7C,0x66,0x66,0x66,0x66,0x7C,0x00,0x00, - - 7, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x60,0x60,0x60,0x60,0x3C,0x00,0x00, - - 8, // 0x64 'd' - 0x00,0x00,0x06,0x06,0x06,0x3E,0x66,0x66,0x66,0x66,0x3E,0x00,0x00, - - 8, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x7E,0x60,0x62,0x3C,0x00,0x00, - - 5, // 0x66 'f' - 0x00,0x00,0x38,0x60,0x60,0xF8,0x60,0x60,0x60,0x60,0x60,0x00,0x00, - - 8, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x3E,0x66,0x66,0x66,0x66,0x3E,0x06,0x3C, - - 8, // 0x68 'h' - 0x00,0x00,0x60,0x60,0x60,0x7C,0x66,0x66,0x66,0x66,0x66,0x00,0x00, - - 4, // 0x69 'i' - 0x00,0x00,0x00,0x60,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00, - - 5, // 0x6A 'j' - 0x00,0x00,0x00,0x30,0x00,0x70,0x30,0x30,0x30,0x30,0x30,0x30,0xE0, - - 8, // 0x6B 'k' - 0x00,0x00,0x60,0x60,0x60,0x66,0x6C,0x78,0x78,0x6C,0x66,0x00,0x00, - - 4, // 0x6C 'l' - 0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00, - - 12, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7D,0xC0,0x66,0x60,0x66,0x60,0x66,0x60,0x66,0x60,0x66,0x60,0x00,0x00,0x00,0x00, - - 8, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x66,0x00,0x00, - - 8, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x66,0x3C,0x00,0x00, - - 8, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x7C,0x60,0x60, - - 8, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x3E,0x66,0x66,0x66,0x66,0x3E,0x06,0x06, - - 6, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x6C,0x7C,0x60,0x60,0x60,0x60,0x00,0x00, - - 7, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x60,0x78,0x3C,0x0C,0x78,0x00,0x00, - - 5, // 0x74 't' - 0x00,0x00,0x00,0x60,0x60,0xF8,0x60,0x60,0x60,0x60,0x38,0x00,0x00, - - 8, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x3E,0x00,0x00, - - 8, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x3C,0x3C,0x18,0x00,0x00, - - 10, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6D,0x80,0x6D,0x80,0x6D,0x80,0x6D,0x80,0x33,0x00,0x33,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x3C,0x3C,0x66,0x66,0x00,0x00, - - 8, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x3C,0x3C,0x18,0x18,0x30,0x30, - - 7, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x0C,0x18,0x30,0x60,0x7C,0x00,0x00, - - 8, // 0x7B '{' - 0x00,0x00,0x0E,0x18,0x18,0x18,0x18,0x70,0x18,0x18,0x18,0x18,0x0E, - - 6, // 0x7C '|' - 0x00,0x00,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30, - - 8, // 0x7D '}' - 0x00,0x00,0x70,0x18,0x18,0x18,0x18,0x0E,0x18,0x18,0x18,0x18,0x70, - - 9, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x49,0x00,0x49,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x7F,0x80,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u verdana14[] = - { - 14, 3, 32, 128-32, - 0x00,0x00,0x0F,0x00,0x1E,0x00,0x2D,0x00,0x4A,0x00,0x59,0x00,0x76,0x00,0x93,0x00,0xA2,0x00, - 0xB1,0x00,0xC0,0x00,0xCF,0x00,0xEC,0x00,0xFB,0x00,0x0A,0x01,0x19,0x01,0x28,0x01,0x37,0x01, - 0x46,0x01,0x55,0x01,0x64,0x01,0x73,0x01,0x82,0x01,0x91,0x01,0xA0,0x01,0xAF,0x01,0xBE,0x01, - 0xCD,0x01,0xDC,0x01,0xF9,0x01,0x16,0x02,0x33,0x02,0x42,0x02,0x5F,0x02,0x6E,0x02,0x7D,0x02, - 0x9A,0x02,0xB7,0x02,0xC6,0x02,0xD5,0x02,0xF2,0x02,0x0F,0x03,0x1E,0x03,0x2D,0x03,0x3C,0x03, - 0x4B,0x03,0x68,0x03,0x85,0x03,0xA2,0x03,0xB1,0x03,0xCE,0x03,0xDD,0x03,0xEC,0x03,0xFB,0x03, - 0x18,0x04,0x27,0x04,0x44,0x04,0x53,0x04,0x62,0x04,0x71,0x04,0x80,0x04,0x8F,0x04,0x9E,0x04, - 0xBB,0x04,0xCA,0x04,0xD9,0x04,0xE8,0x04,0xF7,0x04,0x06,0x05,0x15,0x05,0x24,0x05,0x33,0x05, - 0x42,0x05,0x51,0x05,0x60,0x05,0x6F,0x05,0x7E,0x05,0x8D,0x05,0xAA,0x05,0xB9,0x05,0xC8,0x05, - 0xD7,0x05,0xE6,0x05,0xF5,0x05,0x04,0x06,0x13,0x06,0x22,0x06,0x31,0x06,0x4E,0x06,0x5D,0x06, - 0x6C,0x06,0x7B,0x06,0x8A,0x06,0x99,0x06,0xA8,0x06,0xC5,0x06, - - 4, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x21 '!' - 0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, - - 6, // 0x22 '"' - 0x00,0x00,0x48,0x48,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x09,0x00,0x12,0x00,0x3F,0x80,0x12,0x00,0x12,0x00,0x7F,0x00,0x24,0x00,0x24,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x24 '$' - 0x00,0x00,0x10,0x10,0x3E,0x50,0x50,0x30,0x1C,0x12,0x12,0x7C,0x10,0x10, - - 13, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x80,0x49,0x00,0x49,0x00,0x4A,0x00,0x32,0x60,0x02,0x90,0x04,0x90,0x04,0x90,0x08,0x60,0x00,0x00,0x00,0x00, - - 10, // 0x26 '&' - 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x39,0x00,0x45,0x00,0x42,0x00,0x43,0x00,0x3C,0x80,0x00,0x00,0x00,0x00, - - 3, // 0x27 ''' - 0x00,0x00,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x28 '(' - 0x00,0x00,0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10, - - 5, // 0x29 ')' - 0x00,0x00,0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x10,0x20,0x20,0x40, - - 8, // 0x2A '*' - 0x00,0x00,0x10,0x54,0x38,0x54,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x7F,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x40, - - 5, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00, - - 5, // 0x2F '/' - 0x00,0x00,0x08,0x08,0x10,0x10,0x10,0x20,0x20,0x20,0x40,0x40,0x40,0x80, - - 8, // 0x30 '0' - 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, - - 8, // 0x31 '1' - 0x00,0x00,0x00,0x08,0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00, - - 8, // 0x32 '2' - 0x00,0x00,0x00,0x3C,0x42,0x42,0x02,0x04,0x18,0x20,0x40,0x7E,0x00,0x00, - - 8, // 0x33 '3' - 0x00,0x00,0x00,0x3C,0x42,0x02,0x02,0x1C,0x02,0x02,0x42,0x3C,0x00,0x00, - - 8, // 0x34 '4' - 0x00,0x00,0x00,0x04,0x0C,0x14,0x24,0x44,0x7F,0x04,0x04,0x04,0x00,0x00, - - 8, // 0x35 '5' - 0x00,0x00,0x00,0x7E,0x40,0x40,0x7C,0x02,0x02,0x02,0x42,0x3C,0x00,0x00, - - 8, // 0x36 '6' - 0x00,0x00,0x00,0x1C,0x20,0x40,0x7C,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, - - 8, // 0x37 '7' - 0x00,0x00,0x00,0x7E,0x02,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x00,0x00, - - 8, // 0x38 '8' - 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x3C,0x42,0x42,0x42,0x3C,0x00,0x00, - - 8, // 0x39 '9' - 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x3E,0x02,0x04,0x38,0x00,0x00, - - 5, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00,0x20,0x20,0x00,0x00, - - 5, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00,0x20,0x20,0x20,0x40, - - 9, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x18,0x00,0x06,0x00,0x01,0x00,0x06,0x00,0x18,0x00,0x60,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x3F '?' - 0x00,0x00,0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x10,0x00,0x10,0x00,0x00, - - 12, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x27,0x40,0x49,0x20,0x49,0x20,0x49,0x20,0x49,0x20,0x27,0xC0,0x30,0x00,0x0F,0x00,0x00,0x00, - - 8, // 0x41 'A' - 0x00,0x00,0x00,0x18,0x18,0x24,0x24,0x42,0x42,0x7E,0x81,0x81,0x00,0x00, - - 8, // 0x42 'B' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x7C,0x42,0x42,0x42,0x7C,0x00,0x00, - - 9, // 0x43 'C' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x44 'D' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x42,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x45 'E' - 0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x7E,0x40,0x40,0x40,0x7E,0x00,0x00, - - 7, // 0x46 'F' - 0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x40,0x00,0x00, - - 9, // 0x47 'G' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x00,0x40,0x00,0x47,0x00,0x41,0x00,0x41,0x00,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x48 'H' - 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7F,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x49 'I' - 0x00,0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - - 5, // 0x4A 'J' - 0x00,0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0xE0,0x00,0x00, - - 8, // 0x4B 'K' - 0x00,0x00,0x00,0x42,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x42,0x00,0x00, - - 7, // 0x4C 'L' - 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7E,0x00,0x00, - - 10, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x52,0x80,0x52,0x80,0x52,0x80,0x4C,0x80,0x4C,0x80,0x40,0x80,0x40,0x80,0x00,0x00,0x00,0x00, - - 9, // 0x4E 'N' - 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x61,0x00,0x51,0x00,0x51,0x00,0x49,0x00,0x45,0x00,0x45,0x00,0x43,0x00,0x43,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x50 'P' - 0x00,0x00,0x00,0x7C,0x42,0x42,0x42,0x42,0x7C,0x40,0x40,0x40,0x00,0x00, - - 10, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x02,0x00,0x01,0x80, - - 8, // 0x52 'R' - 0x00,0x00,0x00,0x7C,0x42,0x42,0x42,0x7C,0x48,0x44,0x42,0x41,0x00,0x00, - - 8, // 0x53 'S' - 0x00,0x00,0x00,0x3C,0x42,0x40,0x40,0x3C,0x02,0x02,0x42,0x3C,0x00,0x00, - - 7, // 0x54 'T' - 0x00,0x00,0x00,0xFE,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - - 9, // 0x55 'U' - 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x56 'V' - 0x00,0x00,0x00,0x81,0x81,0x42,0x42,0x42,0x24,0x24,0x18,0x18,0x00,0x00, - - 13, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x10,0x42,0x10,0x45,0x10,0x45,0x10,0x25,0x20,0x28,0xA0,0x28,0xA0,0x10,0x40,0x10,0x40,0x00,0x00,0x00,0x00, - - 8, // 0x58 'X' - 0x00,0x00,0x00,0x42,0x42,0x24,0x18,0x18,0x18,0x24,0x42,0x42,0x00,0x00, - - 7, // 0x59 'Y' - 0x00,0x00,0x00,0x82,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - - 8, // 0x5A 'Z' - 0x00,0x00,0x00,0x7E,0x02,0x04,0x08,0x10,0x10,0x20,0x40,0x7E,0x00,0x00, - - 5, // 0x5B '[' - 0x00,0x00,0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70, - - 5, // 0x5C '\' - 0x00,0x00,0x80,0x80,0x40,0x40,0x40,0x20,0x20,0x10,0x10,0x10,0x08,0x08, - - 5, // 0x5D ']' - 0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70, - - 10, // 0x5E '^' - 0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x12,0x00,0x21,0x00,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, - - 8, // 0x60 '`' - 0x00,0x00,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x02,0x02,0x3E,0x42,0x42,0x3E,0x00,0x00, - - 8, // 0x62 'b' - 0x00,0x00,0x40,0x40,0x40,0x5C,0x62,0x42,0x42,0x42,0x42,0x7C,0x00,0x00, - - 6, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x40,0x44,0x38,0x00,0x00, - - 8, // 0x64 'd' - 0x00,0x00,0x02,0x02,0x02,0x3E,0x42,0x42,0x42,0x42,0x46,0x3A,0x00,0x00, - - 8, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x7E,0x40,0x42,0x3C,0x00,0x00, - - 4, // 0x66 'f' - 0x00,0x00,0x30,0x40,0x40,0xF0,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - - 8, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x3E,0x42,0x42,0x42,0x42,0x46,0x3A,0x02,0x3C, - - 8, // 0x68 'h' - 0x00,0x00,0x40,0x40,0x40,0x5C,0x62,0x42,0x42,0x42,0x42,0x42,0x00,0x00, - - 3, // 0x69 'i' - 0x00,0x00,0x40,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - - 4, // 0x6A 'j' - 0x00,0x00,0x20,0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xC0, - - 7, // 0x6B 'k' - 0x00,0x00,0x40,0x40,0x40,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00, - - 3, // 0x6C 'l' - 0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - - 11, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7B,0x80,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x00,0x00,0x00,0x00, - - 8, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x5C,0x62,0x42,0x42,0x42,0x42,0x42,0x00,0x00, - - 8, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, - - 8, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x5C,0x62,0x42,0x42,0x42,0x42,0x7C,0x40,0x40, - - 8, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x3E,0x42,0x42,0x42,0x42,0x46,0x3A,0x02,0x02, - - 5, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x58,0x60,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - - 7, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x40,0x40,0x38,0x04,0x04,0x78,0x00,0x00, - - 5, // 0x74 't' - 0x00,0x00,0x00,0x40,0x40,0xF8,0x40,0x40,0x40,0x40,0x40,0x38,0x00,0x00, - - 8, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x46,0x3A,0x00,0x00, - - 7, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x00,0x00, - - 11, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x40,0x44,0x40,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x11,0x00,0x11,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00, - - 7, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x10,0x20, - - 7, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, - - 8, // 0x7B '{' - 0x00,0x00,0x0C,0x10,0x10,0x10,0x10,0x60,0x10,0x10,0x10,0x10,0x10,0x0C, - - 5, // 0x7C '|' - 0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - - 8, // 0x7D '}' - 0x00,0x00,0x30,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x30, - - 10, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x80,0x4C,0x80,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0xE0,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u verdana14_bold[] = - { - 14, 3, 32, 128-32, - 0x00,0x00,0x0F,0x00,0x1E,0x00,0x2D,0x00,0x4A,0x00,0x67,0x00,0x84,0x00,0xA1,0x00,0xB0,0x00, - 0xBF,0x00,0xCE,0x00,0xEB,0x00,0x08,0x01,0x17,0x01,0x26,0x01,0x35,0x01,0x44,0x01,0x61,0x01, - 0x7E,0x01,0x9B,0x01,0xB8,0x01,0xD5,0x01,0xF2,0x01,0x0F,0x02,0x2C,0x02,0x49,0x02,0x66,0x02, - 0x75,0x02,0x84,0x02,0xA1,0x02,0xBE,0x02,0xDB,0x02,0xEA,0x02,0x07,0x03,0x24,0x03,0x41,0x03, - 0x5E,0x03,0x7B,0x03,0x8A,0x03,0x99,0x03,0xB6,0x03,0xD3,0x03,0xE2,0x03,0xF1,0x03,0x0E,0x04, - 0x1D,0x04,0x3A,0x04,0x57,0x04,0x74,0x04,0x91,0x04,0xAE,0x04,0xCB,0x04,0xE8,0x04,0xF7,0x04, - 0x14,0x05,0x31,0x05,0x4E,0x05,0x6B,0x05,0x88,0x05,0x97,0x05,0xA6,0x05,0xB5,0x05,0xC4,0x05, - 0xE1,0x05,0xFE,0x05,0x1B,0x06,0x2A,0x06,0x39,0x06,0x48,0x06,0x57,0x06,0x66,0x06,0x75,0x06, - 0x84,0x06,0x93,0x06,0xA2,0x06,0xB1,0x06,0xC0,0x06,0xCF,0x06,0xEC,0x06,0xFB,0x06,0x0A,0x07, - 0x19,0x07,0x28,0x07,0x37,0x07,0x46,0x07,0x55,0x07,0x64,0x07,0x73,0x07,0x90,0x07,0x9F,0x07, - 0xAE,0x07,0xBD,0x07,0xDA,0x07,0xE9,0x07,0x06,0x08,0x23,0x08, - - 4, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x21 '!' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x60,0x60,0x00,0x00, - - 7, // 0x22 '"' - 0x00,0x00,0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x09,0x00,0x3F,0x80,0x3F,0x80,0x12,0x00,0x7F,0x00,0x7F,0x00,0x24,0x00,0x24,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x24 '$' - 0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x3E,0x00,0x69,0x00,0x68,0x00,0x7E,0x00,0x3F,0x00,0x0B,0x00,0x4B,0x00,0x3E,0x00,0x08,0x00,0x08,0x00, - - 15, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x6C,0x40,0x6C,0x80,0x6C,0xB8,0x6D,0x6C,0x3A,0x6C,0x02,0x6C,0x04,0x6C,0x04,0x38,0x00,0x00,0x00,0x00, - - 10, // 0x26 '&' - 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x39,0x80,0x6D,0x00,0x66,0x00,0x63,0x00,0x3D,0x80,0x00,0x00,0x00,0x00, - - 4, // 0x27 ''' - 0x00,0x00,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x28 '(' - 0x00,0x00,0x18,0x30,0x30,0x60,0x60,0x60,0x60,0x60,0x60,0x30,0x30,0x18, - - 7, // 0x29 ')' - 0x00,0x00,0x30,0x18,0x18,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x18,0x18,0x30, - - 9, // 0x2A '*' - 0x00,0x00,0x00,0x00,0x08,0x00,0x2A,0x00,0x1C,0x00,0x1C,0x00,0x2A,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x7F,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x60,0x40, - - 6, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00, - - 8, // 0x2F '/' - 0x00,0x00,0x06,0x06,0x0C,0x0C,0x0C,0x18,0x18,0x30,0x30,0x30,0x60,0x60, - - 9, // 0x30 '0' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x31 '1' - 0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x3C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x3F,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x32 '2' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x03,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x7F,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x33 '3' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x03,0x00,0x03,0x00,0x1E,0x00,0x03,0x00,0x03,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x34 '4' - 0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x0E,0x00,0x16,0x00,0x16,0x00,0x26,0x00,0x46,0x00,0x7F,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x35 '5' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x30,0x00,0x30,0x00,0x3E,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x36 '6' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x30,0x00,0x60,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x37 '7' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x38 '8' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x39 '9' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3F,0x00,0x03,0x00,0x06,0x00,0x3C,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x00,0x00, - - 5, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x60,0x40, - - 10, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x06,0x00,0x18,0x00,0x60,0x00,0x60,0x00,0x18,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x03,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x3F '?' - 0x00,0x00,0x00,0x38,0x4C,0x0C,0x18,0x30,0x30,0x00,0x30,0x30,0x00,0x00, - - 12, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x2F,0x40,0x5B,0x20,0x5B,0x20,0x5B,0x20,0x5B,0x20,0x2F,0xC0,0x30,0x00,0x0F,0x00,0x00,0x00, - - 9, // 0x41 'A' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x1C,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x7F,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x42 'B' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7E,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x43 'C' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x31,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x31,0x00,0x1E,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x44 'D' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7E,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x45 'E' - 0x00,0x00,0x00,0x7E,0x60,0x60,0x60,0x7E,0x60,0x60,0x60,0x7E,0x00,0x00, - - 8, // 0x46 'F' - 0x00,0x00,0x00,0x7E,0x60,0x60,0x60,0x7E,0x60,0x60,0x60,0x60,0x00,0x00, - - 10, // 0x47 'G' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x30,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x67,0x80,0x61,0x80,0x31,0x80,0x1F,0x80,0x00,0x00,0x00,0x00, - - 10, // 0x48 'H' - 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x7F,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x00,0x00,0x00,0x00, - - 6, // 0x49 'I' - 0x00,0x00,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00, - - 7, // 0x4A 'J' - 0x00,0x00,0x00,0x7C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0xF8,0x00,0x00, - - 9, // 0x4B 'K' - 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x66,0x00,0x6C,0x00,0x78,0x00,0x70,0x00,0x78,0x00,0x6C,0x00,0x66,0x00,0x63,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x4C 'L' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x7F,0x00,0x00, - - 11, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x71,0xC0,0x71,0xC0,0x5A,0xC0,0x5A,0xC0,0x4C,0xC0,0x4C,0xC0,0x40,0xC0,0x40,0xC0,0x00,0x00,0x00,0x00, - - 10, // 0x4E 'N' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x80,0x70,0x80,0x58,0x80,0x58,0x80,0x4C,0x80,0x46,0x80,0x46,0x80,0x43,0x80,0x41,0x80,0x00,0x00,0x00,0x00, - - 11, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x50 'P' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7E,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x06,0x00,0x03,0xC0, - - 9, // 0x52 'R' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7E,0x00,0x6C,0x00,0x66,0x00,0x63,0x00,0x61,0x80,0x00,0x00,0x00,0x00, - - 9, // 0x53 'S' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x61,0x00,0x60,0x00,0x70,0x00,0x3E,0x00,0x07,0x00,0x03,0x00,0x43,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x54 'T' - 0x00,0x00,0x00,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00, - - 10, // 0x55 'U' - 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x3F,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x56 'V' - 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x00,0x00,0x00,0x00, - - 14, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x18,0x63,0x18,0x63,0x18,0x33,0x30,0x37,0xB0,0x34,0xB0,0x1C,0xE0,0x18,0x60,0x18,0x60,0x00,0x00,0x00,0x00, - - 9, // 0x58 'X' - 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x36,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x59 'Y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x5A 'Z' - 0x00,0x00,0x00,0x7E,0x0C,0x0C,0x18,0x18,0x30,0x30,0x60,0x7E,0x00,0x00, - - 6, // 0x5B '[' - 0x00,0x00,0x78,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x78, - - 8, // 0x5C '\' - 0x00,0x00,0x60,0x60,0x30,0x30,0x30,0x18,0x18,0x0C,0x0C,0x0C,0x06,0x06, - - 6, // 0x5D ']' - 0x00,0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x78, - - 10, // 0x5E '^' - 0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x80, - - 9, // 0x60 '`' - 0x00,0x00,0x00,0x00,0x30,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x06,0x3E,0x66,0x66,0x66,0x3E,0x00,0x00, - - 8, // 0x62 'b' - 0x00,0x00,0x60,0x60,0x60,0x7C,0x66,0x66,0x66,0x66,0x66,0x7C,0x00,0x00, - - 7, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x62,0x60,0x60,0x60,0x62,0x3C,0x00,0x00, - - 8, // 0x64 'd' - 0x00,0x00,0x06,0x06,0x06,0x3E,0x66,0x66,0x66,0x66,0x66,0x3E,0x00,0x00, - - 8, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x66,0x7E,0x60,0x62,0x3C,0x00,0x00, - - 5, // 0x66 'f' - 0x00,0x00,0x38,0x60,0x60,0xF8,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00, - - 8, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x3E,0x66,0x66,0x66,0x66,0x66,0x3E,0x06,0x3C, - - 8, // 0x68 'h' - 0x00,0x00,0x60,0x60,0x60,0x7C,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00, - - 4, // 0x69 'i' - 0x00,0x00,0x60,0x60,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00, - - 5, // 0x6A 'j' - 0x00,0x00,0x30,0x30,0x00,0x70,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0xE0, - - 8, // 0x6B 'k' - 0x00,0x00,0x60,0x60,0x60,0x66,0x6C,0x78,0x78,0x6C,0x66,0x63,0x00,0x00, - - 4, // 0x6C 'l' - 0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00, - - 12, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6C,0xC0,0x77,0x60,0x66,0x60,0x66,0x60,0x66,0x60,0x66,0x60,0x66,0x60,0x00,0x00,0x00,0x00, - - 8, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00, - - 8, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x66,0x66,0x3C,0x00,0x00, - - 8, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x66,0x7C,0x60,0x60, - - 8, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x3E,0x66,0x66,0x66,0x66,0x66,0x3E,0x06,0x06, - - 6, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x6C,0x7C,0x60,0x60,0x60,0x60,0x60,0x00,0x00, - - 7, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x60,0x60,0x38,0x0C,0x0C,0x78,0x00,0x00, - - 5, // 0x74 't' - 0x00,0x00,0x00,0x60,0x60,0xF8,0x60,0x60,0x60,0x60,0x60,0x38,0x00,0x00, - - 8, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x3E,0x00,0x00, - - 8, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x3C,0x3C,0x3C,0x18,0x00,0x00, - - 12, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x60,0x66,0x60,0x66,0x60,0x69,0x60,0x39,0xC0,0x30,0xC0,0x30,0xC0,0x00,0x00,0x00,0x00, - - 8, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x3C,0x18,0x3C,0x66,0x66,0x00,0x00, - - 8, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x3C,0x3C,0x3C,0x18,0x18,0x30, - - 7, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x0C,0x18,0x38,0x30,0x60,0x7C,0x00,0x00, - - 9, // 0x7B '{' - 0x00,0x00,0x00,0x00,0x0E,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x70,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x0E,0x00, - - 6, // 0x7C '|' - 0x00,0x00,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30, - - 9, // 0x7D '}' - 0x00,0x00,0x00,0x00,0x38,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x07,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x38,0x00, - - 10, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x80,0x48,0x80,0x44,0x80,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0xE0,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u verdana16[] = - { - 16, 4, 32, 128-32, - 0x00,0x00,0x11,0x00,0x22,0x00,0x33,0x00,0x54,0x00,0x65,0x00,0x86,0x00,0xA7,0x00,0xB8,0x00, - 0xC9,0x00,0xDA,0x00,0xFB,0x00,0x1C,0x01,0x2D,0x01,0x3E,0x01,0x4F,0x01,0x60,0x01,0x71,0x01, - 0x82,0x01,0x93,0x01,0xA4,0x01,0xB5,0x01,0xC6,0x01,0xD7,0x01,0xE8,0x01,0xF9,0x01,0x0A,0x02, - 0x1B,0x02,0x2C,0x02,0x4D,0x02,0x6E,0x02,0x8F,0x02,0xA0,0x02,0xC1,0x02,0xE2,0x02,0xF3,0x02, - 0x14,0x03,0x35,0x03,0x46,0x03,0x57,0x03,0x78,0x03,0x99,0x03,0xAA,0x03,0xBB,0x03,0xCC,0x03, - 0xDD,0x03,0xFE,0x03,0x1F,0x04,0x40,0x04,0x51,0x04,0x72,0x04,0x93,0x04,0xB4,0x04,0xD5,0x04, - 0xF6,0x04,0x17,0x05,0x38,0x05,0x59,0x05,0x7A,0x05,0x9B,0x05,0xAC,0x05,0xBD,0x05,0xCE,0x05, - 0xEF,0x05,0x00,0x06,0x11,0x06,0x22,0x06,0x33,0x06,0x44,0x06,0x55,0x06,0x66,0x06,0x77,0x06, - 0x88,0x06,0x99,0x06,0xAA,0x06,0xBB,0x06,0xCC,0x06,0xDD,0x06,0xFE,0x06,0x0F,0x07,0x20,0x07, - 0x31,0x07,0x42,0x07,0x53,0x07,0x64,0x07,0x75,0x07,0x86,0x07,0x97,0x07,0xB8,0x07,0xC9,0x07, - 0xDA,0x07,0xEB,0x07,0xFC,0x07,0x0D,0x08,0x1E,0x08,0x3F,0x08, - - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x21 '!' - 0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x20,0x00,0x00,0x00, - - 5, // 0x22 '"' - 0x00,0x00,0x00,0x50,0x50,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x09,0x00,0x3F,0x80,0x12,0x00,0x12,0x00,0x7F,0x00,0x24,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x24 '$' - 0x00,0x00,0x00,0x10,0x10,0x3E,0x50,0x50,0x30,0x1C,0x12,0x12,0x7C,0x10,0x10,0x00, - - 13, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x44,0x80,0x45,0x00,0x45,0x00,0x3A,0xE0,0x05,0x10,0x05,0x10,0x09,0x10,0x10,0xE0,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x26 '&' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x38,0x80,0x45,0x00,0x42,0x00,0x46,0x00,0x39,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 3, // 0x27 ''' - 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x28 '(' - 0x00,0x00,0x00,0x08,0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10,0x08, - - 6, // 0x29 ')' - 0x00,0x00,0x00,0x40,0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x40, - - 9, // 0x2A '*' - 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x2A,0x00,0x1C,0x00,0x2A,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x7F,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x40,0x00, - - 7, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00, - - 6, // 0x2F '/' - 0x00,0x00,0x00,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80,0x00, - - 8, // 0x30 '0' - 0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00,0x00, - - 8, // 0x31 '1' - 0x00,0x00,0x00,0x00,0x08,0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00,0x00, - - 8, // 0x32 '2' - 0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x02,0x04,0x18,0x20,0x40,0x7E,0x00,0x00,0x00, - - 8, // 0x33 '3' - 0x00,0x00,0x00,0x00,0x3C,0x42,0x02,0x02,0x1C,0x02,0x02,0x42,0x3C,0x00,0x00,0x00, - - 8, // 0x34 '4' - 0x00,0x00,0x00,0x00,0x04,0x0C,0x14,0x24,0x44,0x7F,0x04,0x04,0x04,0x00,0x00,0x00, - - 8, // 0x35 '5' - 0x00,0x00,0x00,0x00,0x3E,0x20,0x20,0x20,0x3C,0x02,0x02,0x42,0x3C,0x00,0x00,0x00, - - 8, // 0x36 '6' - 0x00,0x00,0x00,0x00,0x1C,0x20,0x40,0x7C,0x42,0x42,0x42,0x42,0x3C,0x00,0x00,0x00, - - 8, // 0x37 '7' - 0x00,0x00,0x00,0x00,0x7E,0x02,0x04,0x04,0x08,0x08,0x10,0x10,0x10,0x00,0x00,0x00, - - 8, // 0x38 '8' - 0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x3C,0x42,0x42,0x42,0x3C,0x00,0x00,0x00, - - 8, // 0x39 '9' - 0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x3E,0x02,0x04,0x38,0x00,0x00,0x00, - - 6, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00, - - 6, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00,0x20,0x20,0x20,0x40,0x00, - - 9, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x18,0x00,0x06,0x00,0x01,0x00,0x06,0x00,0x18,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x3F '?' - 0x00,0x00,0x00,0x00,0x38,0x44,0x04,0x08,0x10,0x10,0x00,0x10,0x10,0x00,0x00,0x00, - - 13, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x10,0x40,0x27,0xA0,0x48,0x90,0x48,0x90,0x48,0x90,0x48,0x90,0x48,0x90,0x27,0xE0,0x10,0x00,0x0F,0x80,0x00,0x00, - - 9, // 0x41 'A' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x14,0x00,0x14,0x00,0x22,0x00,0x22,0x00,0x3E,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x42 'B' - 0x00,0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x7C,0x42,0x42,0x42,0x7C,0x00,0x00,0x00, - - 9, // 0x43 'C' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x44 'D' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x42,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x45 'E' - 0x00,0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x7E,0x40,0x40,0x40,0x7E,0x00,0x00,0x00, - - 8, // 0x46 'F' - 0x00,0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 9, // 0x47 'G' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x47,0x00,0x41,0x00,0x21,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x48 'H' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7F,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x49 'I' - 0x00,0x00,0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00,0x00, - - 6, // 0x4A 'J' - 0x00,0x00,0x00,0x00,0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x00, - - 8, // 0x4B 'K' - 0x00,0x00,0x00,0x00,0x42,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x42,0x00,0x00,0x00, - - 7, // 0x4C 'L' - 0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7E,0x00,0x00,0x00, - - 11, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x60,0xC0,0x51,0x40,0x51,0x40,0x4A,0x40,0x4A,0x40,0x44,0x40,0x44,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x4E 'N' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x61,0x00,0x51,0x00,0x51,0x00,0x49,0x00,0x45,0x00,0x45,0x00,0x43,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x50 'P' - 0x00,0x00,0x00,0x00,0x7C,0x42,0x42,0x42,0x42,0x7C,0x40,0x40,0x40,0x00,0x00,0x00, - - 10, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x02,0x00,0x01,0x80,0x00,0x00, - - 9, // 0x52 'R' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x44,0x00,0x78,0x00,0x44,0x00,0x42,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x53 'S' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x41,0x00,0x40,0x00,0x40,0x00,0x3E,0x00,0x01,0x00,0x01,0x00,0x41,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x54 'T' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x55 'U' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x56 'V' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x22,0x00,0x14,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 13, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x10,0x42,0x10,0x45,0x10,0x45,0x10,0x25,0x20,0x28,0xA0,0x28,0xA0,0x10,0x40,0x10,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x58 'X' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x14,0x00,0x08,0x00,0x14,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x59 'Y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x22,0x00,0x22,0x00,0x14,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x5A 'Z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x5B '[' - 0x00,0x00,0x00,0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00, - - 6, // 0x5C '\' - 0x00,0x00,0x00,0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x00, - - 6, // 0x5D ']' - 0x00,0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70,0x00, - - 11, // 0x5E '^' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00, - - 8, // 0x60 '`' - 0x00,0x00,0x00,0x10,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x02,0x02,0x3E,0x42,0x42,0x3E,0x00,0x00,0x00, - - 8, // 0x62 'b' - 0x00,0x00,0x00,0x40,0x40,0x40,0x5C,0x62,0x42,0x42,0x42,0x42,0x7C,0x00,0x00,0x00, - - 8, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x40,0x40,0x40,0x42,0x3C,0x00,0x00,0x00, - - 8, // 0x64 'd' - 0x00,0x00,0x00,0x02,0x02,0x02,0x3E,0x42,0x42,0x42,0x42,0x46,0x3A,0x00,0x00,0x00, - - 8, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x7E,0x40,0x42,0x3C,0x00,0x00,0x00, - - 6, // 0x66 'f' - 0x00,0x00,0x00,0x1C,0x20,0x20,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00, - - 8, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x42,0x42,0x42,0x42,0x46,0x3A,0x02,0x02,0x3C, - - 8, // 0x68 'h' - 0x00,0x00,0x00,0x40,0x40,0x40,0x5C,0x62,0x42,0x42,0x42,0x42,0x42,0x00,0x00,0x00, - - 3, // 0x69 'i' - 0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 4, // 0x6A 'j' - 0x00,0x00,0x00,0x20,0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xC0, - - 7, // 0x6B 'k' - 0x00,0x00,0x00,0x40,0x40,0x40,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00,0x00, - - 3, // 0x6C 'l' - 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 11, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x80,0x66,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x62,0x42,0x42,0x42,0x42,0x42,0x00,0x00,0x00, - - 8, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00,0x00, - - 8, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x62,0x42,0x42,0x42,0x42,0x7C,0x40,0x40,0x40, - - 8, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x42,0x42,0x42,0x42,0x46,0x3A,0x02,0x02,0x02, - - 5, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x60,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 7, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x40,0x40,0x38,0x04,0x04,0x78,0x00,0x00,0x00, - - 6, // 0x74 't' - 0x00,0x00,0x00,0x00,0x20,0x20,0x78,0x20,0x20,0x20,0x20,0x20,0x18,0x00,0x00,0x00, - - 8, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x46,0x3A,0x00,0x00,0x00, - - 8, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x24,0x24,0x24,0x18,0x18,0x00,0x00,0x00, - - 11, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x40,0x44,0x40,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x11,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00,0x00, - - 8, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x24,0x24,0x24,0x18,0x18,0x10,0x10,0x20, - - 7, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00,0x00, - - 8, // 0x7B '{' - 0x00,0x00,0x00,0x0C,0x10,0x10,0x10,0x10,0x60,0x10,0x10,0x10,0x10,0x10,0x0C,0x00, - - 7, // 0x7C '|' - 0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00, - - 8, // 0x7D '}' - 0x00,0x00,0x00,0x30,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x30,0x00, - - 11, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x80,0x4C,0x80,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 13, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF0,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u verdana16_bold[] = - { - 16, 4, 32, 128-32, - 0x00,0x00,0x11,0x00,0x22,0x00,0x33,0x00,0x54,0x00,0x75,0x00,0xA6,0x00,0xC7,0x00,0xD8,0x00, - 0xE9,0x00,0xFA,0x00,0x1B,0x01,0x3C,0x01,0x4D,0x01,0x5E,0x01,0x6F,0x01,0x90,0x01,0xB1,0x01, - 0xD2,0x01,0xF3,0x01,0x14,0x02,0x35,0x02,0x56,0x02,0x77,0x02,0x98,0x02,0xB9,0x02,0xDA,0x02, - 0xEB,0x02,0xFC,0x02,0x1D,0x03,0x3E,0x03,0x5F,0x03,0x70,0x03,0x91,0x03,0xB2,0x03,0xD3,0x03, - 0xF4,0x03,0x15,0x04,0x36,0x04,0x57,0x04,0x78,0x04,0x99,0x04,0xAA,0x04,0xBB,0x04,0xDC,0x04, - 0xED,0x04,0x0E,0x05,0x2F,0x05,0x50,0x05,0x71,0x05,0x92,0x05,0xB3,0x05,0xD4,0x05,0xE5,0x05, - 0x06,0x06,0x27,0x06,0x48,0x06,0x69,0x06,0x8A,0x06,0xAB,0x06,0xBC,0x06,0xDD,0x06,0xEE,0x06, - 0x0F,0x07,0x30,0x07,0x51,0x07,0x72,0x07,0x93,0x07,0xA4,0x07,0xC5,0x07,0xE6,0x07,0xF7,0x07, - 0x18,0x08,0x39,0x08,0x4A,0x08,0x5B,0x08,0x6C,0x08,0x7D,0x08,0x9E,0x08,0xBF,0x08,0xE0,0x08, - 0x01,0x09,0x22,0x09,0x33,0x09,0x44,0x09,0x55,0x09,0x76,0x09,0x97,0x09,0xB8,0x09,0xD9,0x09, - 0xFA,0x09,0x0B,0x0A,0x2C,0x0A,0x3D,0x0A,0x5E,0x0A,0x7F,0x0A, - - 4, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x21 '!' - 0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x30,0x30,0x00,0x00,0x00, - - 7, // 0x22 '"' - 0x00,0x00,0x00,0x6C,0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x09,0x00,0x3F,0x80,0x3F,0x80,0x12,0x00,0x7F,0x00,0x7F,0x00,0x24,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x24 '$' - 0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x3E,0x00,0x69,0x00,0x68,0x00,0x78,0x00,0x3E,0x00,0x0F,0x00,0x0B,0x00,0x4B,0x00,0x3E,0x00,0x08,0x00,0x08,0x00,0x00,0x00, - - 17, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x20,0x00,0x66,0x20,0x00,0x66,0x40,0x00,0x66,0x5E,0x00,0x66,0xB3,0x00,0x3D,0x33,0x00,0x01,0x33,0x00,0x02,0x33,0x00,0x02,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x26 '&' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x66,0x00,0x66,0x00,0x66,0xC0,0x3C,0xC0,0x66,0x80,0x63,0x00,0x63,0x80,0x3C,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x27 ''' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x28 '(' - 0x00,0x00,0x00,0x0C,0x18,0x30,0x30,0x60,0x60,0x60,0x60,0x60,0x30,0x30,0x18,0x0C, - - 7, // 0x29 ')' - 0x00,0x00,0x00,0x60,0x30,0x18,0x18,0x0C,0x0C,0x0C,0x0C,0x0C,0x18,0x18,0x30,0x60, - - 9, // 0x2A '*' - 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x49,0x00,0x2A,0x00,0x1C,0x00,0x2A,0x00,0x49,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x60,0x60,0xC0,0xC0, - - 7, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00, - - 9, // 0x2F '/' - 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x30,0x00,0x60,0x00,0x60,0x00,0x00,0x00, - - 9, // 0x30 '0' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x31 '1' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x3C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x32 '2' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x33 '3' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x03,0x00,0x0E,0x00,0x03,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x34 '4' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x0E,0x00,0x16,0x00,0x26,0x00,0x46,0x00,0x7F,0x80,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x35 '5' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x30,0x00,0x30,0x00,0x3E,0x00,0x03,0x00,0x03,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x36 '6' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x30,0x00,0x60,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x37 '7' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x38 '8' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x39 '9' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3F,0x00,0x03,0x00,0x06,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00, - - 5, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x38,0x30,0x30,0x60,0x60, - - 11, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x18,0x00,0x06,0x00,0x01,0x80,0x00,0x40,0x01,0x80,0x06,0x00,0x18,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x3F '?' - 0x00,0x00,0x00,0x00,0x3C,0x66,0x06,0x0C,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00, - - 13, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x30,0x60,0x27,0xA0,0x4D,0x90,0x4D,0x90,0x4D,0x90,0x4D,0x90,0x27,0xE0,0x30,0x00,0x0F,0x80,0x00,0x00,0x00,0x00, - - 10, // 0x41 'A' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x0C,0x00,0x1E,0x00,0x1E,0x00,0x33,0x00,0x33,0x00,0x7F,0x80,0x61,0x80,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x42 'B' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7F,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x43 'C' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x61,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x61,0x80,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x44 'D' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x45 'E' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x46 'F' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x47 'G' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x61,0x80,0x60,0x00,0x60,0x00,0x63,0x80,0x61,0x80,0x31,0x80,0x1F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x48 'H' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x7F,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x49 'I' - 0x00,0x00,0x00,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00, - - 7, // 0x4A 'J' - 0x00,0x00,0x00,0x00,0x7C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0xF8,0x00,0x00,0x00, - - 9, // 0x4B 'K' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x66,0x00,0x6C,0x00,0x78,0x00,0x78,0x00,0x6C,0x00,0x66,0x00,0x63,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x4C 'L' - 0x00,0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x7F,0x00,0x00,0x00, - - 12, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0xE0,0x70,0xE0,0x59,0x60,0x59,0x60,0x4E,0x60,0x4E,0x60,0x44,0x60,0x44,0x60,0x40,0x60,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x4E 'N' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x80,0x70,0x80,0x58,0x80,0x58,0x80,0x4C,0x80,0x46,0x80,0x46,0x80,0x43,0x80,0x43,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x50 'P' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7E,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x03,0x00,0x01,0xC0,0x00,0x00, - - 9, // 0x52 'R' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7E,0x00,0x6C,0x00,0x66,0x00,0x63,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x53 'S' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x70,0x00,0x3E,0x00,0x07,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x54 'T' - 0x00,0x00,0x00,0x00,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00, - - 10, // 0x55 'U' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x56 'V' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x00,0x33,0x00,0x1E,0x00,0x1E,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 14, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x18,0x63,0x18,0x63,0x18,0x33,0x30,0x37,0xB0,0x34,0xB0,0x1C,0xE0,0x18,0x60,0x18,0x60,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x58 'X' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x33,0x00,0x33,0x00,0x1E,0x00,0x0C,0x00,0x1E,0x00,0x33,0x00,0x33,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x59 'Y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x5A 'Z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x30,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x5B '[' - 0x00,0x00,0x00,0x78,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x78,0x00, - - 9, // 0x5C '\' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x30,0x00,0x30,0x00,0x18,0x00,0x18,0x00,0x0C,0x00,0x0C,0x00,0x06,0x00,0x06,0x00,0x03,0x00,0x03,0x00,0x00,0x00, - - 6, // 0x5D ']' - 0x00,0x00,0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x78,0x00, - - 10, // 0x5E '^' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x80,0x00,0x00, - - 9, // 0x60 '`' - 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x03,0x00,0x3F,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x62 'b' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x6E,0x00,0x73,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x63,0x60,0x60,0x60,0x63,0x3E,0x00,0x00,0x00, - - 9, // 0x64 'd' - 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x3F,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x67,0x00,0x3B,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x7F,0x00,0x60,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x66 'f' - 0x00,0x00,0x00,0x38,0x60,0x60,0xF8,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, - - 9, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x67,0x00,0x3B,0x00,0x03,0x00,0x03,0x00,0x3E,0x00, - - 9, // 0x68 'h' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x6E,0x00,0x73,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x69 'i' - 0x00,0x00,0x00,0x60,0x60,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, - - 5, // 0x6A 'j' - 0x00,0x00,0x00,0x30,0x30,0x00,0x70,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0xE0, - - 8, // 0x6B 'k' - 0x00,0x00,0x00,0x60,0x60,0x60,0x66,0x6C,0x78,0x78,0x6C,0x66,0x63,0x00,0x00,0x00, - - 4, // 0x6C 'l' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, - - 14, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x70,0x73,0x98,0x63,0x18,0x63,0x18,0x63,0x18,0x63,0x18,0x63,0x18,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x00,0x73,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x00,0x73,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7E,0x00,0x60,0x00,0x60,0x00,0x60,0x00, - - 9, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x67,0x00,0x3B,0x00,0x03,0x00,0x03,0x00,0x03,0x00, - - 6, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x00,0x6C,0x7C,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, - - 8, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x60,0x70,0x3C,0x0E,0x06,0x7C,0x00,0x00,0x00, - - 6, // 0x74 't' - 0x00,0x00,0x00,0x00,0x60,0x60,0xF8,0x60,0x60,0x60,0x60,0x60,0x38,0x00,0x00,0x00, - - 9, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x67,0x00,0x3B,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x60,0x66,0x60,0x66,0x60,0x69,0x60,0x39,0xC0,0x30,0xC0,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x1C,0x00,0x36,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00, - - 8, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x06,0x0C,0x18,0x30,0x60,0x7E,0x00,0x00,0x00, - - 9, // 0x7B '{' - 0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x70,0x00,0x18,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x07,0x00,0x00,0x00, - - 8, // 0x7C '|' - 0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00, - - 9, // 0x7D '}' - 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x0C,0x00,0x07,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x70,0x00,0x00,0x00, - - 11, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x44,0x40,0x44,0x40,0x43,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 13, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF0,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u verdana17[] = - { - 17, 4, 32, 128-32, - 0x00,0x00,0x12,0x00,0x24,0x00,0x36,0x00,0x59,0x00,0x7C,0x00,0x9F,0x00,0xC2,0x00,0xD4,0x00, - 0xE6,0x00,0xF8,0x00,0x1B,0x01,0x3E,0x01,0x50,0x01,0x62,0x01,0x74,0x01,0x86,0x01,0xA9,0x01, - 0xCC,0x01,0xEF,0x01,0x12,0x02,0x35,0x02,0x58,0x02,0x7B,0x02,0x9E,0x02,0xC1,0x02,0xE4,0x02, - 0xF6,0x02,0x08,0x03,0x2B,0x03,0x4E,0x03,0x71,0x03,0x83,0x03,0xA6,0x03,0xC9,0x03,0xEC,0x03, - 0x0F,0x04,0x32,0x04,0x55,0x04,0x67,0x04,0x8A,0x04,0xAD,0x04,0xBF,0x04,0xD1,0x04,0xF4,0x04, - 0x06,0x05,0x29,0x05,0x4C,0x05,0x6F,0x05,0x81,0x05,0xA4,0x05,0xC7,0x05,0xEA,0x05,0x0D,0x06, - 0x30,0x06,0x53,0x06,0x76,0x06,0x99,0x06,0xBC,0x06,0xDF,0x06,0xF1,0x06,0x03,0x07,0x15,0x07, - 0x38,0x07,0x5B,0x07,0x7E,0x07,0x90,0x07,0xB3,0x07,0xC5,0x07,0xE8,0x07,0xFA,0x07,0x0C,0x08, - 0x2F,0x08,0x52,0x08,0x64,0x08,0x76,0x08,0x88,0x08,0x9A,0x08,0xBD,0x08,0xE0,0x08,0x03,0x09, - 0x26,0x09,0x49,0x09,0x5B,0x09,0x6D,0x09,0x7F,0x09,0xA2,0x09,0xB4,0x09,0xD7,0x09,0xFA,0x09, - 0x0C,0x0A,0x1E,0x0A,0x41,0x0A,0x53,0x0A,0x76,0x0A,0x99,0x0A, - - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x21 '!' - 0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x20,0x00,0x00,0x00, - - 6, // 0x22 '"' - 0x00,0x00,0x00,0x48,0x48,0x48,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x80,0x04,0x80,0x09,0x00,0x3F,0xC0,0x09,0x00,0x12,0x00,0x7F,0x80,0x12,0x00,0x24,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x24 '$' - 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x3E,0x00,0x49,0x00,0x48,0x00,0x48,0x00,0x3E,0x00,0x09,0x00,0x09,0x00,0x49,0x00,0x3E,0x00,0x08,0x00,0x08,0x00,0x00,0x00, - - 15, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x20,0x44,0x40,0x44,0x80,0x44,0x80,0x45,0x38,0x39,0x44,0x02,0x44,0x04,0x44,0x04,0x44,0x08,0x38,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x26 '&' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x42,0x00,0x42,0x00,0x44,0x00,0x38,0x80,0x44,0x80,0x42,0x80,0x41,0x00,0x22,0x80,0x1C,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x27 ''' - 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x28 '(' - 0x00,0x00,0x00,0x08,0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10,0x08, - - 6, // 0x29 ')' - 0x00,0x00,0x00,0x40,0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x40, - - 9, // 0x2A '*' - 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x49,0x00,0x2A,0x00,0x1C,0x00,0x2A,0x00,0x49,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x40,0x00, - - 7, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00, - - 6, // 0x2F '/' - 0x00,0x00,0x00,0x04,0x08,0x08,0x08,0x10,0x10,0x20,0x20,0x20,0x40,0x40,0x80,0x80,0x00, - - 9, // 0x30 '0' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x31 '1' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x38,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x32 '2' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x41,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x0C,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x33 '3' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x41,0x00,0x01,0x00,0x02,0x00,0x1C,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x42,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x34 '4' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x00,0x0A,0x00,0x12,0x00,0x22,0x00,0x42,0x00,0x7F,0x80,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x35 '5' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x7C,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x42,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x36 '6' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x30,0x00,0x20,0x00,0x40,0x00,0x7C,0x00,0x42,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x37 '7' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x10,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x38 '8' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x3E,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x39 '9' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x21,0x00,0x1F,0x00,0x01,0x00,0x02,0x00,0x06,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00, - - 6, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x40,0x00, - - 11, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x06,0x00,0x18,0x00,0x60,0x00,0x60,0x00,0x18,0x00,0x06,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x3F '?' - 0x00,0x00,0x00,0x00,0x3C,0x42,0x02,0x02,0x0C,0x10,0x10,0x00,0x10,0x10,0x00,0x00,0x00, - - 14, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xC0,0x18,0x20,0x20,0x10,0x27,0xC8,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x27,0xF0,0x20,0x00,0x18,0x00,0x07,0xC0,0x00,0x00, - - 10, // 0x41 'A' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x12,0x00,0x12,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x7F,0x80,0x40,0x80,0x80,0x40,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x42 'B' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7E,0x00,0x41,0x00,0x40,0x80,0x40,0x80,0x41,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x43 'C' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0x80,0x20,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x30,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x44 'D' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x41,0x80,0x40,0x80,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x80,0x41,0x80,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x45 'E' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x7F,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x46 'F' - 0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x7E,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 11, // 0x47 'G' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x20,0x40,0x40,0x00,0x40,0x00,0x43,0xC0,0x40,0x40,0x20,0x40,0x30,0x40,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x48 'H' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x7F,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x49 'I' - 0x00,0x00,0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00,0x00, - - 6, // 0x4A 'J' - 0x00,0x00,0x00,0x00,0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x00, - - 10, // 0x4B 'K' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x42,0x00,0x44,0x00,0x48,0x00,0x50,0x00,0x68,0x00,0x44,0x00,0x42,0x00,0x41,0x00,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x4C 'L' - 0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7F,0x00,0x00,0x00, - - 11, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x60,0xC0,0x51,0x40,0x51,0x40,0x4A,0x40,0x4A,0x40,0x44,0x40,0x44,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x4E 'N' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x80,0x60,0x80,0x50,0x80,0x48,0x80,0x48,0x80,0x44,0x80,0x44,0x80,0x42,0x80,0x41,0x80,0x41,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x31,0x80,0x20,0x80,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x80,0x31,0x80,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x50 'P' - 0x00,0x00,0x00,0x00,0x7C,0x42,0x41,0x41,0x42,0x7C,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 11, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x31,0x80,0x20,0x80,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x80,0x31,0x80,0x0E,0x00,0x02,0x00,0x02,0x00,0x01,0xC0, - - 10, // 0x52 'R' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x44,0x00,0x78,0x00,0x44,0x00,0x42,0x00,0x41,0x00,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x53 'S' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x20,0x80,0x40,0x00,0x40,0x00,0x38,0x00,0x07,0x00,0x00,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x54 'T' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x80,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x55 'U' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x56 'V' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x80,0x40,0x40,0x80,0x40,0x80,0x21,0x00,0x21,0x00,0x21,0x00,0x12,0x00,0x12,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 15, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x04,0x41,0x04,0x22,0x88,0x22,0x88,0x22,0x88,0x14,0x50,0x14,0x50,0x14,0x50,0x08,0x20,0x08,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x58 'X' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x21,0x00,0x12,0x00,0x12,0x00,0x0C,0x00,0x0C,0x00,0x12,0x00,0x12,0x00,0x21,0x00,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x59 'Y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x41,0x00,0x22,0x00,0x22,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x5A 'Z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x00,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x5B '[' - 0x00,0x00,0x00,0x3C,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3C, - - 6, // 0x5C '\' - 0x00,0x00,0x00,0x80,0x40,0x40,0x40,0x20,0x20,0x10,0x10,0x10,0x08,0x08,0x08,0x04,0x00, - - 6, // 0x5D ']' - 0x00,0x00,0x00,0x78,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x78, - - 11, // 0x5E '^' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x80,0x00,0x00, - - 9, // 0x60 '`' - 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x22,0x02,0x3E,0x42,0x42,0x46,0x3A,0x00,0x00,0x00, - - 9, // 0x62 'b' - 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x5C,0x00,0x62,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x22,0x40,0x40,0x40,0x40,0x22,0x1C,0x00,0x00,0x00, - - 9, // 0x64 'd' - 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x1F,0x00,0x21,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x23,0x00,0x1D,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x24,0x42,0x7E,0x40,0x40,0x22,0x1C,0x00,0x00,0x00, - - 6, // 0x66 'f' - 0x00,0x00,0x00,0x1C,0x20,0x20,0x7C,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00, - - 9, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x21,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x23,0x00,0x1D,0x00,0x01,0x00,0x22,0x00,0x1C,0x00, - - 9, // 0x68 'h' - 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x5E,0x00,0x61,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 3, // 0x69 'i' - 0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 5, // 0x6A 'j' - 0x00,0x00,0x00,0x00,0x10,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0xE0, - - 8, // 0x6B 'k' - 0x00,0x00,0x00,0x40,0x40,0x40,0x42,0x44,0x48,0x50,0x70,0x48,0x44,0x42,0x00,0x00,0x00, - - 3, // 0x6C 'l' - 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 13, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0xE0,0x63,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5E,0x00,0x61,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x00,0x62,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x40,0x00,0x40,0x00,0x40,0x00, - - 9, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x21,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x23,0x00,0x1D,0x00,0x01,0x00,0x01,0x00,0x01,0x00, - - 6, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x60,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 8, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x40,0x30,0x0C,0x02,0x42,0x3C,0x00,0x00,0x00, - - 6, // 0x74 't' - 0x00,0x00,0x00,0x00,0x20,0x20,0x7C,0x20,0x20,0x20,0x20,0x20,0x20,0x1C,0x00,0x00,0x00, - - 9, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x43,0x00,0x3D,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x24,0x24,0x24,0x18,0x18,0x18,0x00,0x00,0x00, - - 11, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x40,0x44,0x40,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x11,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x22,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x14,0x00,0x22,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x24,0x24,0x24,0x18,0x18,0x18,0x10,0x10,0x20, - - 8, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x02,0x04,0x08,0x10,0x20,0x40,0x7E,0x00,0x00,0x00, - - 9, // 0x7B '{' - 0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x60,0x00,0x10,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x07,0x00, - - 6, // 0x7C '|' - 0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, - - 9, // 0x7D '}' - 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x04,0x00,0x03,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x70,0x00, - - 11, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x44,0x40,0x44,0x40,0x43,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 14, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u verdana17_bold[] = - { - 17, 4, 32, 128-32, - 0x00,0x00,0x12,0x00,0x24,0x00,0x36,0x00,0x59,0x00,0x7C,0x00,0xB0,0x00,0xD3,0x00,0xE5,0x00, - 0xF7,0x00,0x09,0x01,0x2C,0x01,0x4F,0x01,0x61,0x01,0x73,0x01,0x85,0x01,0xA8,0x01,0xCB,0x01, - 0xEE,0x01,0x11,0x02,0x34,0x02,0x57,0x02,0x7A,0x02,0x9D,0x02,0xC0,0x02,0xE3,0x02,0x06,0x03, - 0x18,0x03,0x2A,0x03,0x4D,0x03,0x70,0x03,0x93,0x03,0xB6,0x03,0xD9,0x03,0xFC,0x03,0x1F,0x04, - 0x42,0x04,0x65,0x04,0x88,0x04,0xAB,0x04,0xCE,0x04,0xF1,0x04,0x03,0x05,0x15,0x05,0x38,0x05, - 0x5B,0x05,0x7E,0x05,0xA1,0x05,0xC4,0x05,0xE7,0x05,0x0A,0x06,0x2D,0x06,0x50,0x06,0x73,0x06, - 0x96,0x06,0xB9,0x06,0xDC,0x06,0xFF,0x06,0x22,0x07,0x45,0x07,0x57,0x07,0x7A,0x07,0x8C,0x07, - 0xAF,0x07,0xD2,0x07,0xF5,0x07,0x18,0x08,0x3B,0x08,0x4D,0x08,0x70,0x08,0x93,0x08,0xA5,0x08, - 0xC8,0x08,0xEB,0x08,0xFD,0x08,0x0F,0x09,0x32,0x09,0x44,0x09,0x67,0x09,0x8A,0x09,0xAD,0x09, - 0xD0,0x09,0xF3,0x09,0x05,0x0A,0x17,0x0A,0x29,0x0A,0x4C,0x0A,0x6F,0x0A,0x92,0x0A,0xB5,0x0A, - 0xD8,0x0A,0xEA,0x0A,0x0D,0x0B,0x1F,0x0B,0x42,0x0B,0x65,0x0B, - - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x21 '!' - 0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x30,0x30,0x00,0x00,0x00, - - 8, // 0x22 '"' - 0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x40,0x04,0x40,0x3F,0xE0,0x3F,0xE0,0x08,0x80,0x11,0x00,0x7F,0xC0,0x7F,0xC0,0x22,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x24 '$' - 0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x1F,0x00,0x34,0x80,0x64,0x00,0x74,0x00,0x3C,0x00,0x0F,0x00,0x0B,0x80,0x09,0x80,0x4B,0x00,0x3E,0x00,0x08,0x00,0x08,0x00,0x00,0x00, - - 18, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x08,0x00,0x66,0x10,0x00,0x66,0x20,0x00,0x66,0x2F,0x00,0x66,0x59,0x80,0x66,0x99,0x80,0x3D,0x19,0x80,0x01,0x19,0x80,0x02,0x19,0x80,0x04,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x26 '&' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x33,0x00,0x36,0x00,0x1C,0x60,0x36,0x60,0x63,0x60,0x61,0xC0,0x31,0xC0,0x1F,0x60,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x27 ''' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x28 '(' - 0x00,0x00,0x00,0x0C,0x18,0x30,0x30,0x60,0x60,0x60,0x60,0x60,0x60,0x30,0x30,0x18,0x0C, - - 8, // 0x29 ')' - 0x00,0x00,0x00,0x30,0x18,0x0C,0x0C,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0x0C,0x18,0x30, - - 10, // 0x2A '*' - 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x49,0x00,0x2A,0x00,0x1C,0x00,0x2A,0x00,0x49,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x60,0x60,0xC0,0xC0,0x00, - - 7, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x00, - - 10, // 0x2F '/' - 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x30,0x00,0x60,0x00,0x60,0x00,0x00,0x00, - - 10, // 0x30 '0' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x31 '1' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x3C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x32 '2' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x61,0x80,0x61,0x80,0x01,0x80,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x33 '3' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x61,0x80,0x61,0x80,0x01,0x80,0x0F,0x00,0x03,0x00,0x01,0x80,0x61,0x80,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x34 '4' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x07,0x00,0x0B,0x00,0x13,0x00,0x23,0x00,0x43,0x00,0x7F,0xC0,0x03,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x35 '5' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x80,0x30,0x00,0x30,0x00,0x3E,0x00,0x03,0x00,0x01,0x80,0x01,0x80,0x61,0x80,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x36 '6' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x38,0x00,0x30,0x00,0x6E,0x00,0x73,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x37 '7' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x01,0x80,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x38 '8' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x3F,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x39 '9' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0x80,0x03,0x00,0x07,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x00, - - 6, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x38,0x30,0x30,0x60,0x60,0x00, - - 12, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x18,0x00,0x06,0x00,0x01,0x80,0x00,0x40,0x01,0x80,0x06,0x00,0x18,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x3F '?' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 14, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xC0,0x18,0x20,0x20,0x10,0x27,0xC8,0x4C,0xC8,0x4C,0xC8,0x4C,0xC8,0x4C,0xC8,0x27,0xF0,0x20,0x00,0x18,0x00,0x07,0xC0,0x00,0x00, - - 11, // 0x41 'A' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x1B,0x00,0x1B,0x00,0x31,0x80,0x3F,0x80,0x31,0x80,0x60,0xC0,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x42 'B' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x7F,0x00,0x61,0x80,0x60,0xC0,0x60,0xC0,0x61,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x43 'C' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x30,0xC0,0x30,0xC0,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x30,0xC0,0x30,0xC0,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x44 'D' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x61,0x80,0x61,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x61,0x80,0x61,0x80,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x45 'E' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x46 'F' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x47 'G' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x30,0xC0,0x30,0xC0,0x60,0x00,0x60,0x00,0x63,0xC0,0x60,0xC0,0x30,0xC0,0x30,0xC0,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x48 'H' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x7F,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x49 'I' - 0x00,0x00,0x00,0x00,0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,0x00,0x00, - - 8, // 0x4A 'J' - 0x00,0x00,0x00,0x00,0x3E,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0xF8,0x00,0x00,0x00, - - 11, // 0x4B 'K' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x61,0x80,0x63,0x00,0x66,0x00,0x6C,0x00,0x7C,0x00,0x76,0x00,0x63,0x00,0x61,0x80,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x4C 'L' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 13, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x70,0x70,0x70,0x70,0xF0,0x58,0xB0,0x59,0xB0,0x4D,0x30,0x4F,0x30,0x46,0x30,0x46,0x30,0x40,0x30,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x4E 'N' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x40,0x70,0x40,0x58,0x40,0x4C,0x40,0x4C,0x40,0x46,0x40,0x43,0x40,0x43,0x40,0x41,0xC0,0x40,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x30,0xC0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x30,0xC0,0x30,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x50 'P' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7E,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x30,0xC0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x30,0xC0,0x30,0xC0,0x0F,0x80,0x03,0x00,0x03,0x00,0x01,0xE0, - - 11, // 0x52 'R' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x61,0x80,0x60,0xC0,0x60,0xC0,0x61,0x80,0x7F,0x00,0x63,0x00,0x61,0x80,0x60,0xC0,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x53 'S' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x61,0x80,0x60,0x00,0x3E,0x00,0x1F,0x00,0x01,0x80,0x61,0x80,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x54 'T' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x55 'U' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x56 'V' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x31,0x80,0x31,0x80,0x1B,0x00,0x1B,0x00,0x0E,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 16, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x86,0x61,0x86,0x63,0xC6,0x32,0x4C,0x36,0x6C,0x36,0x6C,0x34,0x2C,0x1C,0x38,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x58 'X' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x31,0x80,0x31,0x80,0x1B,0x00,0x0E,0x00,0x0E,0x00,0x1B,0x00,0x31,0x80,0x31,0x80,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x59 'Y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x5A 'Z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x01,0x80,0x03,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x5B '[' - 0x00,0x00,0x00,0x3E,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3E, - - 10, // 0x5C '\' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x30,0x00,0x30,0x00,0x18,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x06,0x00,0x03,0x00,0x03,0x00,0x01,0x80,0x01,0x80,0x00,0x00, - - 8, // 0x5D ']' - 0x00,0x00,0x00,0x7C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x7C, - - 12, // 0x5E '^' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0E,0x00,0x1B,0x00,0x31,0x80,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xC0,0x00,0x00, - - 10, // 0x60 '`' - 0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x03,0x00,0x03,0x00,0x3F,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x62 'b' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x6E,0x00,0x73,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x33,0x60,0x60,0x60,0x60,0x33,0x1E,0x00,0x00,0x00, - - 10, // 0x64 'd' - 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x1F,0x80,0x31,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x63,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x33,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x66 'f' - 0x00,0x00,0x00,0x1C,0x30,0x30,0x7C,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x00,0x00, - - 10, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x31,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0x80,0x01,0x80,0x03,0x00,0x3E,0x00, - - 10, // 0x68 'h' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x6F,0x00,0x71,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x69 'i' - 0x00,0x00,0x00,0x60,0x60,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, - - 6, // 0x6A 'j' - 0x00,0x00,0x00,0x18,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xF0, - - 9, // 0x6B 'k' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x63,0x00,0x66,0x00,0x6C,0x00,0x78,0x00,0x7C,0x00,0x66,0x00,0x63,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x6C 'l' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, - - 14, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x70,0x73,0x98,0x63,0x18,0x63,0x18,0x63,0x18,0x63,0x18,0x63,0x18,0x63,0x18,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6F,0x00,0x71,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x00,0x73,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7E,0x00,0x60,0x00,0x60,0x00,0x60,0x00, - - 10, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x31,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0x80,0x01,0x80,0x01,0x80,0x01,0x80, - - 7, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x7E,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, - - 8, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x62,0x60,0x7C,0x3E,0x06,0x46,0x3C,0x00,0x00,0x00, - - 6, // 0x74 't' - 0x00,0x00,0x00,0x00,0x60,0x60,0xFC,0x60,0x60,0x60,0x60,0x60,0x60,0x3C,0x00,0x00,0x00, - - 10, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x80,0x3D,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 14, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x18,0x63,0x18,0x33,0x30,0x37,0xB0,0x34,0xB0,0x1C,0xE0,0x1C,0xE0,0x0C,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x36,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00, - - 8, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x06,0x0C,0x18,0x18,0x30,0x60,0x7E,0x00,0x00,0x00, - - 10, // 0x7B '{' - 0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x70,0x00,0x18,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x07,0x80, - - 8, // 0x7C '|' - 0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - - 10, // 0x7D '}' - 0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x06,0x00,0x03,0x80,0x06,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x78,0x00, - - 12, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x20,0x24,0x20,0x46,0x20,0x42,0x40,0x41,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 14, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u verdana18[] = - { - 18, 4, 32, 128-32, - 0x00,0x00,0x13,0x00,0x26,0x00,0x39,0x00,0x5E,0x00,0x83,0x00,0xA8,0x00,0xCD,0x00,0xE0,0x00, - 0xF3,0x00,0x06,0x01,0x2B,0x01,0x50,0x01,0x63,0x01,0x76,0x01,0x89,0x01,0x9C,0x01,0xC1,0x01, - 0xE6,0x01,0x0B,0x02,0x30,0x02,0x55,0x02,0x7A,0x02,0x9F,0x02,0xC4,0x02,0xE9,0x02,0x0E,0x03, - 0x21,0x03,0x34,0x03,0x59,0x03,0x7E,0x03,0xA3,0x03,0xB6,0x03,0xDB,0x03,0x00,0x04,0x25,0x04, - 0x4A,0x04,0x6F,0x04,0x94,0x04,0xB9,0x04,0xDE,0x04,0x03,0x05,0x16,0x05,0x29,0x05,0x4E,0x05, - 0x61,0x05,0x86,0x05,0xAB,0x05,0xD0,0x05,0xF5,0x05,0x1A,0x06,0x3F,0x06,0x64,0x06,0x89,0x06, - 0xAE,0x06,0xD3,0x06,0xF8,0x06,0x1D,0x07,0x42,0x07,0x67,0x07,0x7A,0x07,0x8D,0x07,0xA0,0x07, - 0xC5,0x07,0xEA,0x07,0x0F,0x08,0x34,0x08,0x59,0x08,0x6C,0x08,0x91,0x08,0xB6,0x08,0xC9,0x08, - 0xEE,0x08,0x13,0x09,0x26,0x09,0x39,0x09,0x5E,0x09,0x71,0x09,0x96,0x09,0xBB,0x09,0xE0,0x09, - 0x05,0x0A,0x2A,0x0A,0x3D,0x0A,0x50,0x0A,0x63,0x0A,0x88,0x0A,0xAD,0x0A,0xD2,0x0A,0xF7,0x0A, - 0x1C,0x0B,0x41,0x0B,0x66,0x0B,0x79,0x0B,0x9E,0x0B,0xC3,0x0B, - - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x21 '!' - 0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x20,0x00,0x00,0x00, - - 7, // 0x22 '"' - 0x00,0x00,0x00,0x48,0x48,0x48,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x80,0x04,0x80,0x09,0x00,0x3F,0xC0,0x09,0x00,0x11,0x00,0x12,0x00,0x7F,0x80,0x12,0x00,0x24,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x24 '$' - 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x3E,0x00,0x49,0x00,0x48,0x00,0x48,0x00,0x38,0x00,0x0E,0x00,0x09,0x00,0x09,0x00,0x49,0x00,0x3E,0x00,0x08,0x00,0x08,0x00,0x08,0x00, - - 16, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x20,0x44,0x40,0x44,0x40,0x44,0x80,0x44,0x80,0x38,0x9C,0x01,0x22,0x01,0x22,0x02,0x22,0x02,0x22,0x04,0x1C,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x26 '&' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x1E,0x40,0x24,0x40,0x42,0x40,0x41,0x40,0x40,0x80,0x21,0x40,0x1E,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x27 ''' - 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x28 '(' - 0x00,0x00,0x00,0x08,0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10,0x08, - - 7, // 0x29 ')' - 0x00,0x00,0x00,0x20,0x10,0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x08,0x08,0x10,0x20, - - 10, // 0x2A '*' - 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x49,0x00,0x2A,0x00,0x1C,0x00,0x2A,0x00,0x49,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x3F,0xE0,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x40,0x40, - - 7, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00, - - 7, // 0x2F '/' - 0x00,0x00,0x00,0x02,0x04,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x40,0x80,0x00, - - 10, // 0x30 '0' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x31 '1' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x1C,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x32 '2' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x41,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x01,0x00,0x02,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x33 '3' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x40,0x80,0x00,0x80,0x01,0x00,0x0E,0x00,0x01,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x41,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x34 '4' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x05,0x00,0x09,0x00,0x11,0x00,0x21,0x00,0x41,0x00,0x7F,0xC0,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x35 '5' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x80,0x20,0x00,0x20,0x00,0x20,0x00,0x3E,0x00,0x01,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x41,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x36 '6' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x5E,0x00,0x61,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x37 '7' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x10,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x38 '8' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x39 '9' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x20,0x80,0x1F,0x80,0x00,0x80,0x01,0x00,0x02,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x00,0x00, - - 7, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x20,0x20, - - 12, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x3F '?' - 0x00,0x00,0x00,0x00,0x3C,0x42,0x02,0x02,0x04,0x08,0x10,0x10,0x00,0x10,0x10,0x00,0x00,0x00, - - 15, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x18,0x60,0x20,0x10,0x23,0xD0,0x44,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x44,0x48,0x23,0xF0,0x20,0x00,0x18,0x00,0x07,0xC0,0x00,0x00, - - 10, // 0x41 'A' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x12,0x00,0x12,0x00,0x12,0x00,0x21,0x00,0x21,0x00,0x40,0x80,0x7F,0x80,0x40,0x80,0x80,0x40,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x42 'B' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7E,0x00,0x41,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x41,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x43 'C' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x20,0x40,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x20,0x40,0x30,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x44 'D' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x41,0x80,0x40,0x80,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x80,0x41,0x80,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x45 'E' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x7F,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x46 'F' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x40,0x00,0x40,0x00,0x40,0x00,0x7F,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x47 'G' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x30,0x60,0x20,0x20,0x40,0x00,0x40,0x00,0x41,0xE0,0x40,0x20,0x40,0x20,0x20,0x20,0x30,0x20,0x0F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x48 'H' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7F,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x49 'I' - 0x00,0x00,0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00,0x00, - - 7, // 0x4A 'J' - 0x00,0x00,0x00,0x00,0x3C,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x08,0xF0,0x00,0x00,0x00, - - 10, // 0x4B 'K' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x41,0x00,0x42,0x00,0x44,0x00,0x48,0x00,0x50,0x00,0x68,0x00,0x44,0x00,0x42,0x00,0x41,0x00,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x4C 'L' - 0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7F,0x00,0x00,0x00, - - 13, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x30,0x50,0x50,0x50,0x50,0x48,0x90,0x48,0x90,0x45,0x10,0x45,0x10,0x42,0x10,0x42,0x10,0x40,0x10,0x40,0x10,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x4E 'N' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x60,0x40,0x50,0x40,0x48,0x40,0x48,0x40,0x44,0x40,0x42,0x40,0x42,0x40,0x41,0x40,0x40,0xC0,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x20,0x40,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x20,0x40,0x30,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x50 'P' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x41,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x41,0x00,0x7E,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x20,0x40,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x20,0x40,0x30,0xC0,0x0F,0x00,0x01,0x00,0x01,0x00,0x00,0xE0, - - 10, // 0x52 'R' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x42,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x42,0x00,0x41,0x00,0x40,0x80,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x53 'S' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x20,0x80,0x40,0x00,0x40,0x00,0x20,0x00,0x1E,0x00,0x01,0x00,0x00,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x54 'T' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x80,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x55 'U' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x56 'V' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x80,0x40,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x21,0x00,0x12,0x00,0x12,0x00,0x12,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 15, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x04,0x41,0x04,0x22,0x88,0x22,0x88,0x22,0x88,0x12,0x90,0x14,0x50,0x14,0x50,0x14,0x50,0x08,0x20,0x08,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x58 'X' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x21,0x00,0x21,0x00,0x12,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x12,0x00,0x21,0x00,0x21,0x00,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x59 'Y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x41,0x00,0x22,0x00,0x22,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x5A 'Z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x00,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x5B '[' - 0x00,0x00,0x00,0x3C,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3C, - - 7, // 0x5C '\' - 0x00,0x00,0x00,0x80,0x40,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x04,0x02,0x00, - - 7, // 0x5D ']' - 0x00,0x00,0x00,0x78,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x78, - - 12, // 0x5E '^' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x09,0x00,0x10,0x80,0x20,0x40,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xC0,0x00,0x00, - - 10, // 0x60 '`' - 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x01,0x00,0x3F,0x00,0x41,0x00,0x41,0x00,0x43,0x00,0x3D,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x62 'b' - 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x5C,0x00,0x62,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x21,0x40,0x40,0x40,0x40,0x21,0x1E,0x00,0x00,0x00, - - 9, // 0x64 'd' - 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x1F,0x00,0x21,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x23,0x00,0x1D,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x7F,0x00,0x40,0x00,0x40,0x00,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x66 'f' - 0x00,0x00,0x00,0x1C,0x20,0x20,0x20,0x7C,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00, - - 9, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x21,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x23,0x00,0x1D,0x00,0x01,0x00,0x22,0x00,0x1C,0x00, - - 9, // 0x68 'h' - 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x5E,0x00,0x61,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 3, // 0x69 'i' - 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 5, // 0x6A 'j' - 0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0xE0, - - 9, // 0x6B 'k' - 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x42,0x00,0x44,0x00,0x48,0x00,0x50,0x00,0x68,0x00,0x44,0x00,0x42,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 3, // 0x6C 'l' - 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 15, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2E,0x70,0x31,0x88,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5E,0x00,0x61,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x00,0x62,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x40,0x00,0x40,0x00,0x40,0x00, - - 9, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x21,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x23,0x00,0x1D,0x00,0x01,0x00,0x01,0x00,0x01,0x00, - - 6, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x60,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 8, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x40,0x30,0x0C,0x02,0x42,0x3C,0x00,0x00,0x00, - - 6, // 0x74 't' - 0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x7C,0x20,0x20,0x20,0x20,0x20,0x20,0x1C,0x00,0x00,0x00, - - 9, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x43,0x00,0x3D,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x14,0x00,0x14,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 13, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x10,0x42,0x10,0x25,0x20,0x25,0x20,0x28,0xA0,0x28,0xA0,0x10,0x40,0x10,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x22,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x14,0x00,0x22,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x14,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x10,0x00, - - 9, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x7B '{' - 0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x60,0x00,0x10,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x07,0x00, - - 7, // 0x7C '|' - 0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, - - 10, // 0x7D '}' - 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x01,0x80,0x02,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x38,0x00, - - 12, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x20,0x24,0x20,0x42,0x40,0x41,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 15, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u verdana18_bold[] = - { - 18, 4, 32, 128-32, - 0x00,0x00,0x13,0x00,0x26,0x00,0x4B,0x00,0x70,0x00,0x95,0x00,0xCC,0x00,0xF1,0x00,0x04,0x01, - 0x17,0x01,0x2A,0x01,0x4F,0x01,0x74,0x01,0x87,0x01,0x9A,0x01,0xAD,0x01,0xD2,0x01,0xF7,0x01, - 0x1C,0x02,0x41,0x02,0x66,0x02,0x8B,0x02,0xB0,0x02,0xD5,0x02,0xFA,0x02,0x1F,0x03,0x44,0x03, - 0x57,0x03,0x6A,0x03,0x8F,0x03,0xB4,0x03,0xD9,0x03,0xFE,0x03,0x23,0x04,0x48,0x04,0x6D,0x04, - 0x92,0x04,0xB7,0x04,0xDC,0x04,0x01,0x05,0x26,0x05,0x4B,0x05,0x5E,0x05,0x71,0x05,0x96,0x05, - 0xBB,0x05,0xE0,0x05,0x05,0x06,0x2A,0x06,0x4F,0x06,0x74,0x06,0x99,0x06,0xBE,0x06,0xE3,0x06, - 0x08,0x07,0x2D,0x07,0x52,0x07,0x77,0x07,0x9C,0x07,0xC1,0x07,0xD4,0x07,0xF9,0x07,0x0C,0x08, - 0x31,0x08,0x56,0x08,0x7B,0x08,0xA0,0x08,0xC5,0x08,0xD8,0x08,0xFD,0x08,0x22,0x09,0x35,0x09, - 0x5A,0x09,0x7F,0x09,0x92,0x09,0xA5,0x09,0xCA,0x09,0xDD,0x09,0x02,0x0A,0x27,0x0A,0x4C,0x0A, - 0x71,0x0A,0x96,0x0A,0xA9,0x0A,0xCE,0x0A,0xE1,0x0A,0x06,0x0B,0x2B,0x0B,0x50,0x0B,0x75,0x0B, - 0x9A,0x0B,0xBF,0x0B,0xE4,0x0B,0xF7,0x0B,0x1C,0x0C,0x41,0x0C, - - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x21 '!' - 0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x30,0x30,0x00,0x00,0x00, - - 9, // 0x22 '"' - 0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 13, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x20,0x04,0x20,0x08,0x40,0x3F,0xF0,0x3F,0xF0,0x08,0x40,0x10,0x80,0x7F,0xE0,0x7F,0xE0,0x21,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x24 '$' - 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x1F,0x80,0x34,0xC0,0x64,0xC0,0x64,0x00,0x3C,0x00,0x07,0x80,0x04,0xC0,0x64,0xC0,0x65,0x80,0x3F,0x00,0x04,0x00,0x04,0x00,0x00,0x00, - - 19, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x08,0x00,0x63,0x10,0x00,0x63,0x10,0x00,0x63,0x20,0x00,0x63,0x2F,0x80,0x63,0x58,0xC0,0x3E,0x98,0xC0,0x00,0x98,0xC0,0x01,0x18,0xC0,0x01,0x18,0xC0,0x02,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 13, // 0x26 '&' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x33,0x00,0x33,0x00,0x1E,0x60,0x36,0x60,0x63,0x60,0x61,0xC0,0x60,0xC0,0x30,0xE0,0x1F,0x30,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x27 ''' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x28 '(' - 0x00,0x00,0x00,0x06,0x0C,0x18,0x30,0x30,0x60,0x60,0x60,0x60,0x60,0x30,0x30,0x18,0x0C,0x06, - - 8, // 0x29 ')' - 0x00,0x00,0x00,0x60,0x30,0x18,0x0C,0x0C,0x06,0x06,0x06,0x06,0x06,0x0C,0x0C,0x18,0x30,0x60, - - 11, // 0x2A '*' - 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x24,0x80,0x15,0x00,0x0E,0x00,0x15,0x00,0x24,0x80,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 13, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x3F,0xE0,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x60,0x60,0x60,0xC0,0xC0, - - 7, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x00, - - 10, // 0x2F '/' - 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x30,0x00,0x60,0x00,0x60,0x00,0x00,0x00, - - 11, // 0x30 '0' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x31 '1' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x1E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x32 '2' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x61,0x80,0x60,0xC0,0x00,0xC0,0x01,0x80,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x33 '3' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x61,0x80,0x60,0xC0,0x00,0xC0,0x01,0x80,0x0F,0x00,0x01,0x80,0x00,0xC0,0x60,0xC0,0x61,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x34 '4' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x03,0x80,0x05,0x80,0x09,0x80,0x11,0x80,0x21,0x80,0x41,0x80,0x7F,0xE0,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x35 '5' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xC0,0x30,0x00,0x30,0x00,0x30,0x00,0x3F,0x00,0x01,0x80,0x00,0xC0,0x00,0xC0,0x60,0xC0,0x61,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x36 '6' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x18,0x00,0x30,0x00,0x60,0x00,0x6F,0x00,0x71,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x37 '7' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xC0,0x00,0xC0,0x01,0x80,0x01,0x80,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x38 '8' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x39 '9' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0xC0,0x1E,0xC0,0x00,0xC0,0x01,0x80,0x03,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x00, - - 6, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x38,0x30,0x30,0x30,0x60,0x60, - - 13, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - - 13, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 13, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x18,0x00,0x06,0x00,0x01,0x80,0x00,0x60,0x00,0x60,0x01,0x80,0x06,0x00,0x18,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x3F '?' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x03,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 14, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x18,0x60,0x20,0x10,0x27,0xD0,0x4C,0xC8,0x4C,0xC8,0x4C,0xC8,0x4C,0xC8,0x4C,0xC8,0x27,0xF0,0x20,0x00,0x18,0x00,0x07,0xC0,0x00,0x00, - - 12, // 0x41 'A' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x0F,0x00,0x0F,0x00,0x19,0x80,0x19,0x80,0x30,0xC0,0x3F,0xC0,0x30,0xC0,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x42 'B' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7F,0x00,0x61,0x80,0x60,0xC0,0x60,0xC0,0x61,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x43 'C' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x38,0xC0,0x30,0xC0,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x30,0xC0,0x38,0xC0,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x44 'D' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x61,0xC0,0x60,0xC0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0xC0,0x61,0xC0,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x45 'E' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x46 'F' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x47 'G' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xC0,0x38,0x60,0x30,0x60,0x60,0x00,0x60,0x00,0x63,0xE0,0x60,0x60,0x60,0x60,0x30,0x60,0x38,0x60,0x0F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x48 'H' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x7F,0xE0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x49 'I' - 0x00,0x00,0x00,0x00,0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,0x00,0x00, - - 8, // 0x4A 'J' - 0x00,0x00,0x00,0x00,0x3E,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0xF8,0x00,0x00,0x00, - - 12, // 0x4B 'K' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x60,0xC0,0x61,0x80,0x63,0x00,0x66,0x00,0x6C,0x00,0x7E,0x00,0x73,0x00,0x61,0x80,0x60,0xC0,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x4C 'L' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 14, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x38,0x70,0x38,0x70,0x78,0x58,0x58,0x58,0xD8,0x4C,0x98,0x4D,0x98,0x47,0x18,0x47,0x18,0x42,0x18,0x40,0x18,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x4E 'N' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x20,0x70,0x20,0x58,0x20,0x4C,0x20,0x4C,0x20,0x46,0x20,0x43,0x20,0x43,0x20,0x41,0xA0,0x40,0xE0,0x40,0xE0,0x00,0x00,0x00,0x00,0x00,0x00, - - 13, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x38,0xE0,0x30,0x60,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x30,0x60,0x38,0xE0,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x50 'P' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x61,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x61,0x80,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 13, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x38,0xE0,0x30,0x60,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x30,0x60,0x38,0xE0,0x0F,0x80,0x03,0x00,0x03,0x80,0x01,0xF0, - - 12, // 0x52 'R' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x61,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x61,0x80,0x7F,0x00,0x61,0x80,0x60,0xC0,0x60,0x60,0x60,0x30,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x53 'S' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x30,0xC0,0x60,0xC0,0x60,0x00,0x7C,0x00,0x3F,0x80,0x03,0xC0,0x00,0xC0,0x60,0xC0,0x61,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x54 'T' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x55 'U' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x30,0xC0,0x1F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x56 'V' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x31,0x80,0x31,0x80,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x0E,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 16, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x86,0x61,0x86,0x63,0xC6,0x33,0xCC,0x32,0x4C,0x32,0x4C,0x1E,0x78,0x1C,0x38,0x1C,0x38,0x0C,0x30,0x0C,0x30,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x58 'X' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x31,0x80,0x31,0x80,0x1B,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x1B,0x00,0x31,0x80,0x31,0x80,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x59 'Y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x1E,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x5A 'Z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x01,0x80,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x5B '[' - 0x00,0x00,0x00,0x3E,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3E, - - 10, // 0x5C '\' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x30,0x00,0x30,0x00,0x18,0x00,0x18,0x00,0x0C,0x00,0x0C,0x00,0x06,0x00,0x06,0x00,0x03,0x00,0x03,0x00,0x01,0x80,0x01,0x80,0x00,0x00, - - 8, // 0x5D ']' - 0x00,0x00,0x00,0x7C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x7C, - - 13, // 0x5E '^' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00, - - 11, // 0x60 '`' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x01,0x80,0x01,0x80,0x3F,0x80,0x61,0x80,0x61,0x80,0x63,0x80,0x3D,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x62 'b' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x6E,0x00,0x73,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x33,0x60,0x60,0x60,0x60,0x33,0x1E,0x00,0x00,0x00, - - 10, // 0x64 'd' - 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x1F,0x80,0x31,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x7F,0x80,0x60,0x00,0x60,0x00,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x66 'f' - 0x00,0x00,0x00,0x1C,0x30,0x30,0x30,0x7C,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x00,0x00, - - 10, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x31,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0x80,0x01,0x80,0x03,0x00,0x3E,0x00, - - 10, // 0x68 'h' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x6F,0x00,0x71,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x69 'i' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, - - 6, // 0x6A 'j' - 0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xF0, - - 10, // 0x6B 'k' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x61,0x80,0x63,0x00,0x66,0x00,0x6C,0x00,0x7E,0x00,0x73,0x00,0x61,0x80,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x6C 'l' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, - - 16, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6F,0x3C,0x71,0xC6,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6F,0x00,0x71,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x00,0x73,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7E,0x00,0x60,0x00,0x60,0x00,0x60,0x00, - - 10, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x31,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0x80,0x01,0x80,0x01,0x80,0x01,0x80, - - 7, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x7E,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, - - 9, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x61,0x00,0x60,0x00,0x7E,0x00,0x3F,0x00,0x03,0x00,0x43,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x74 't' - 0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x7E,0x30,0x30,0x30,0x30,0x30,0x30,0x1E,0x00,0x00,0x00, - - 10, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x80,0x3D,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x33,0x00,0x33,0x00,0x33,0x00,0x1E,0x00,0x1E,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 14, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x18,0x63,0x18,0x63,0x18,0x37,0xB0,0x34,0xB0,0x3C,0xF0,0x18,0x60,0x18,0x60,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x33,0x00,0x33,0x00,0x1E,0x00,0x1E,0x00,0x33,0x00,0x33,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x33,0x00,0x33,0x00,0x33,0x00,0x1E,0x00,0x1E,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00, - - 9, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x7B '{' - 0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x70,0x00,0x18,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x07,0x80, - - 8, // 0x7C '|' - 0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - - 11, // 0x7D '}' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x03,0x00,0x01,0xC0,0x03,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x3C,0x00, - - 13, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x10,0x24,0x10,0x42,0x10,0x41,0x20,0x40,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 15, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00, - - 0 - }; - -} - diff --git a/uppdev/agg24/agg_embedded_raster_fonts.h b/uppdev/agg24/agg_embedded_raster_fonts.h deleted file mode 100644 index 9d522d671..000000000 --- a/uppdev/agg24/agg_embedded_raster_fonts.h +++ /dev/null @@ -1,59 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_EMBEDDED_RASTER_FONTS_INCLUDED -#define AGG_EMBEDDED_RASTER_FONTS_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - extern const int8u gse4x6[]; - extern const int8u gse4x8[]; - extern const int8u gse5x7[]; - extern const int8u gse5x9[]; - extern const int8u gse6x12[]; - extern const int8u gse6x9[]; - extern const int8u gse7x11[]; - extern const int8u gse7x11_bold[]; - extern const int8u gse7x15[]; - extern const int8u gse7x15_bold[]; - extern const int8u gse8x16[]; - extern const int8u gse8x16_bold[]; - extern const int8u mcs11_prop[]; - extern const int8u mcs11_prop_condensed[]; - extern const int8u mcs12_prop[]; - extern const int8u mcs13_prop[]; - extern const int8u mcs5x10_mono[]; - extern const int8u mcs5x11_mono[]; - extern const int8u mcs6x10_mono[]; - extern const int8u mcs6x11_mono[]; - extern const int8u mcs7x12_mono_high[]; - extern const int8u mcs7x12_mono_low[]; - extern const int8u verdana12[]; - extern const int8u verdana12_bold[]; - extern const int8u verdana13[]; - extern const int8u verdana13_bold[]; - extern const int8u verdana14[]; - extern const int8u verdana14_bold[]; - extern const int8u verdana16[]; - extern const int8u verdana16_bold[]; - extern const int8u verdana17[]; - extern const int8u verdana17_bold[]; - extern const int8u verdana18[]; - extern const int8u verdana18_bold[]; -} - -#endif diff --git a/uppdev/agg24/agg_font_cache_manager.h b/uppdev/agg24/agg_font_cache_manager.h deleted file mode 100644 index fe9a9280f..000000000 --- a/uppdev/agg24/agg_font_cache_manager.h +++ /dev/null @@ -1,409 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_FONT_CACHE_MANAGER_INCLUDED -#define AGG_FONT_CACHE_MANAGER_INCLUDED - -#include -#include "agg_array.h" - -namespace agg -{ - - //---------------------------------------------------------glyph_data_type - enum glyph_data_type - { - glyph_data_invalid = 0, - glyph_data_mono = 1, - glyph_data_gray8 = 2, - glyph_data_outline = 3 - }; - - - //-------------------------------------------------------------glyph_cache - struct glyph_cache - { - unsigned glyph_index; - int8u* data; - unsigned data_size; - glyph_data_type data_type; - rect_i bounds; - double advance_x; - double advance_y; - }; - - - //--------------------------------------------------------------font_cache - class font_cache - { - public: - enum block_size_e { block_size = 16384-16 }; - - //-------------------------------------------------------------------- - font_cache() : - m_allocator(block_size), - m_font_signature(0) - {} - - //-------------------------------------------------------------------- - void signature(const char* font_signature) - { - m_font_signature = (char*)m_allocator.allocate(strlen(font_signature) + 1); - strcpy(m_font_signature, font_signature); - memset(m_glyphs, 0, sizeof(m_glyphs)); - } - - //-------------------------------------------------------------------- - bool font_is(const char* font_signature) const - { - return strcmp(font_signature, m_font_signature) == 0; - } - - //-------------------------------------------------------------------- - const glyph_cache* find_glyph(unsigned glyph_code) const - { - unsigned msb = (glyph_code >> 8) & 0xFF; - if(m_glyphs[msb]) - { - return m_glyphs[msb][glyph_code & 0xFF]; - } - return 0; - } - - //-------------------------------------------------------------------- - glyph_cache* cache_glyph(unsigned glyph_code, - unsigned glyph_index, - unsigned data_size, - glyph_data_type data_type, - const rect_i& bounds, - double advance_x, - double advance_y) - { - unsigned msb = (glyph_code >> 8) & 0xFF; - if(m_glyphs[msb] == 0) - { - m_glyphs[msb] = - (glyph_cache**)m_allocator.allocate(sizeof(glyph_cache*) * 256, - sizeof(glyph_cache*)); - memset(m_glyphs[msb], 0, sizeof(glyph_cache*) * 256); - } - - unsigned lsb = glyph_code & 0xFF; - if(m_glyphs[msb][lsb]) return 0; // Already exists, do not overwrite - - glyph_cache* glyph = - (glyph_cache*)m_allocator.allocate(sizeof(glyph_cache), - sizeof(double)); - - glyph->glyph_index = glyph_index; - glyph->data = m_allocator.allocate(data_size); - glyph->data_size = data_size; - glyph->data_type = data_type; - glyph->bounds = bounds; - glyph->advance_x = advance_x; - glyph->advance_y = advance_y; - return m_glyphs[msb][lsb] = glyph; - } - - private: - block_allocator m_allocator; - glyph_cache** m_glyphs[256]; - char* m_font_signature; - }; - - - - - - - - //---------------------------------------------------------font_cache_pool - class font_cache_pool - { - public: - //-------------------------------------------------------------------- - ~font_cache_pool() - { - unsigned i; - for(i = 0; i < m_num_fonts; ++i) - { - obj_allocator::deallocate(m_fonts[i]); - } - pod_allocator::deallocate(m_fonts, m_max_fonts); - } - - //-------------------------------------------------------------------- - font_cache_pool(unsigned max_fonts=32) : - m_fonts(pod_allocator::allocate(max_fonts)), - m_max_fonts(max_fonts), - m_num_fonts(0), - m_cur_font(0) - {} - - - //-------------------------------------------------------------------- - void font(const char* font_signature, bool reset_cache = false) - { - int idx = find_font(font_signature); - if(idx >= 0) - { - if(reset_cache) - { - obj_allocator::deallocate(m_fonts[idx]); - m_fonts[idx] = obj_allocator::allocate(); - m_fonts[idx]->signature(font_signature); - } - m_cur_font = m_fonts[idx]; - } - else - { - if(m_num_fonts >= m_max_fonts) - { - obj_allocator::deallocate(m_fonts[0]); - memcpy(m_fonts, - m_fonts + 1, - (m_max_fonts - 1) * sizeof(font_cache*)); - m_num_fonts = m_max_fonts - 1; - } - m_fonts[m_num_fonts] = obj_allocator::allocate(); - m_fonts[m_num_fonts]->signature(font_signature); - m_cur_font = m_fonts[m_num_fonts]; - ++m_num_fonts; - } - } - - //-------------------------------------------------------------------- - const font_cache* font() const - { - return m_cur_font; - } - - //-------------------------------------------------------------------- - const glyph_cache* find_glyph(unsigned glyph_code) const - { - if(m_cur_font) return m_cur_font->find_glyph(glyph_code); - return 0; - } - - //-------------------------------------------------------------------- - glyph_cache* cache_glyph(unsigned glyph_code, - unsigned glyph_index, - unsigned data_size, - glyph_data_type data_type, - const rect_i& bounds, - double advance_x, - double advance_y) - { - if(m_cur_font) - { - return m_cur_font->cache_glyph(glyph_code, - glyph_index, - data_size, - data_type, - bounds, - advance_x, - advance_y); - } - return 0; - } - - - //-------------------------------------------------------------------- - int find_font(const char* font_signature) - { - unsigned i; - for(i = 0; i < m_num_fonts; i++) - { - if(m_fonts[i]->font_is(font_signature)) return int(i); - } - return -1; - } - - private: - font_cache** m_fonts; - unsigned m_max_fonts; - unsigned m_num_fonts; - font_cache* m_cur_font; - }; - - - - - //------------------------------------------------------------------------ - enum glyph_rendering - { - glyph_ren_native_mono, - glyph_ren_native_gray8, - glyph_ren_outline, - glyph_ren_agg_mono, - glyph_ren_agg_gray8 - }; - - - - - //------------------------------------------------------font_cache_manager - template class font_cache_manager - { - public: - typedef FontEngine font_engine_type; - typedef font_cache_manager self_type; - typedef typename font_engine_type::path_adaptor_type path_adaptor_type; - typedef typename font_engine_type::gray8_adaptor_type gray8_adaptor_type; - typedef typename gray8_adaptor_type::embedded_scanline gray8_scanline_type; - typedef typename font_engine_type::mono_adaptor_type mono_adaptor_type; - typedef typename mono_adaptor_type::embedded_scanline mono_scanline_type; - - //-------------------------------------------------------------------- - font_cache_manager(font_engine_type& engine, unsigned max_fonts=32) : - m_fonts(max_fonts), - m_engine(engine), - m_change_stamp(-1), - m_prev_glyph(0), - m_last_glyph(0) - {} - - //-------------------------------------------------------------------- - void reset_last_glyph() - { - m_prev_glyph = m_last_glyph = 0; - } - - //-------------------------------------------------------------------- - const glyph_cache* glyph(unsigned glyph_code) - { - synchronize(); - const glyph_cache* gl = m_fonts.find_glyph(glyph_code); - if(gl) - { - m_prev_glyph = m_last_glyph; - return m_last_glyph = gl; - } - else - { - if(m_engine.prepare_glyph(glyph_code)) - { - m_prev_glyph = m_last_glyph; - m_last_glyph = m_fonts.cache_glyph(glyph_code, - m_engine.glyph_index(), - m_engine.data_size(), - m_engine.data_type(), - m_engine.bounds(), - m_engine.advance_x(), - m_engine.advance_y()); - m_engine.write_glyph_to(m_last_glyph->data); - return m_last_glyph; - } - } - return 0; - } - - //-------------------------------------------------------------------- - void init_embedded_adaptors(const glyph_cache* gl, - double x, double y, - double scale=1.0) - { - if(gl) - { - switch(gl->data_type) - { - default: return; - case glyph_data_mono: - m_mono_adaptor.init(gl->data, gl->data_size, x, y); - break; - - case glyph_data_gray8: - m_gray8_adaptor.init(gl->data, gl->data_size, x, y); - break; - - case glyph_data_outline: - m_path_adaptor.init(gl->data, gl->data_size, x, y, scale); - break; - } - } - } - - - //-------------------------------------------------------------------- - path_adaptor_type& path_adaptor() { return m_path_adaptor; } - gray8_adaptor_type& gray8_adaptor() { return m_gray8_adaptor; } - gray8_scanline_type& gray8_scanline() { return m_gray8_scanline; } - mono_adaptor_type& mono_adaptor() { return m_mono_adaptor; } - mono_scanline_type& mono_scanline() { return m_mono_scanline; } - - //-------------------------------------------------------------------- - const glyph_cache* perv_glyph() const { return m_prev_glyph; } - const glyph_cache* last_glyph() const { return m_last_glyph; } - - //-------------------------------------------------------------------- - bool add_kerning(double* x, double* y) - { - if(m_prev_glyph && m_last_glyph) - { - return m_engine.add_kerning(m_prev_glyph->glyph_index, - m_last_glyph->glyph_index, - x, y); - } - return false; - } - - //-------------------------------------------------------------------- - void precache(unsigned from, unsigned to) - { - for(; from <= to; ++from) glyph(from); - } - - //-------------------------------------------------------------------- - void reset_cache() - { - m_fonts.font(m_engine.font_signature(), true); - m_change_stamp = m_engine.change_stamp(); - m_prev_glyph = m_last_glyph = 0; - } - - private: - //-------------------------------------------------------------------- - font_cache_manager(const self_type&); - const self_type& operator = (const self_type&); - - //-------------------------------------------------------------------- - void synchronize() - { - if(m_change_stamp != m_engine.change_stamp()) - { - m_fonts.font(m_engine.font_signature()); - m_change_stamp = m_engine.change_stamp(); - m_prev_glyph = m_last_glyph = 0; - } - } - - font_cache_pool m_fonts; - font_engine_type& m_engine; - int m_change_stamp; - double m_dx; - double m_dy; - const glyph_cache* m_prev_glyph; - const glyph_cache* m_last_glyph; - path_adaptor_type m_path_adaptor; - gray8_adaptor_type m_gray8_adaptor; - gray8_scanline_type m_gray8_scanline; - mono_adaptor_type m_mono_adaptor; - mono_scanline_type m_mono_scanline; - }; - -} - -#endif - diff --git a/uppdev/agg24/agg_font_freetype.cpp b/uppdev/agg24/agg_font_freetype.cpp deleted file mode 100644 index 6a9bb5c41..000000000 --- a/uppdev/agg24/agg_font_freetype.cpp +++ /dev/null @@ -1,1148 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifdef PLATFORM_X11 - -#include -#include "agg_font_freetype.h" -#include "agg_bitset_iterator.h" -#include "agg_renderer_scanline.h" - - -namespace agg -{ - - //------------------------------------------------------------------------------ - // - // This code implements the AUTODIN II polynomial - // The variable corresponding to the macro argument "crc" should - // be an unsigned long. - // Oroginal code by Spencer Garrett - // - - // generated using the AUTODIN II polynomial - // x^32 + x^26 + x^23 + x^22 + x^16 + - // x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x^1 + 1 - // - //------------------------------------------------------------------------------ - - static const unsigned crc32tab[256] = - { - 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, - 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, - 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, - 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, - 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, - 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, - 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, - 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, - 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, - 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, - 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, - 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, - 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, - 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, - 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, - 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, - 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, - 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, - 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, - 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, - 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, - 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, - 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, - 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, - 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, - 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, - 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, - 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, - 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, - 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, - 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, - 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, - 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, - 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, - 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, - 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, - 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, - 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, - 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, - 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, - 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, - 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, - 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, - 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, - 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, - 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, - 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, - 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, - 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, - 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, - 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, - 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, - 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, - 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, - 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, - 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, - 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, - 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, - 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, - 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, - 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, - 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, - 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, - 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d, - }; - - - //------------------------------------------------------------------------------ - - static unsigned calc_crc32(const unsigned char* buf, unsigned size) - { - unsigned crc = (unsigned)~0; - const unsigned char* p; - unsigned len = 0; - unsigned nr = size; - - for (len += nr, p = buf; nr--; ++p) - { - crc = (crc >> 8) ^ crc32tab[(crc ^ *p) & 0xff]; - } - return ~crc; - } - - //------------------------------------------------------------------------ - static inline int dbl_to_plain_fx(double d) - { - return int(d * 65536.0); - } - - //------------------------------------------------------------------------ - static inline double int26p6_to_dbl(int p) - { - return double(p) / 64.0; - } - - //------------------------------------------------------------------------ - static inline int dbl_to_int26p6(double p) - { - return int(p * 64.0 + 0.5); - } - - - //------------------------------------------------------------------------ - template - bool decompose_ft_outline(const FT_Outline& outline, - bool flip_y, - const trans_affine& mtx, - PathStorage& path) - { - typedef typename PathStorage::value_type value_type; - - FT_Vector v_last; - FT_Vector v_control; - FT_Vector v_start; - double x1, y1, x2, y2, x3, y3; - - FT_Vector* point; - FT_Vector* limit; - char* tags; - - int n; // index of contour in outline - int first; // index of first point in contour - char tag; // current point's state - - first = 0; - - for(n = 0; n < outline.n_contours; n++) - { - int last; // index of last point in contour - - last = outline.contours[n]; - limit = outline.points + last; - - v_start = outline.points[first]; - v_last = outline.points[last]; - - v_control = v_start; - - point = outline.points + first; - tags = outline.tags + first; - tag = FT_CURVE_TAG(tags[0]); - - // A contour cannot start with a cubic control point! - if(tag == FT_CURVE_TAG_CUBIC) return false; - - // check first point to determine origin - if( tag == FT_CURVE_TAG_CONIC) - { - // first point is conic control. Yes, this happens. - if(FT_CURVE_TAG(outline.tags[last]) == FT_CURVE_TAG_ON) - { - // start at last point if it is on the curve - v_start = v_last; - limit--; - } - else - { - // if both first and last points are conic, - // start at their middle and record its position - // for closure - v_start.x = (v_start.x + v_last.x) / 2; - v_start.y = (v_start.y + v_last.y) / 2; - - v_last = v_start; - } - point--; - tags--; - } - - x1 = int26p6_to_dbl(v_start.x); - y1 = int26p6_to_dbl(v_start.y); - if(flip_y) y1 = -y1; - mtx.transform(&x1, &y1); - path.move_to(value_type(dbl_to_int26p6(x1)), - value_type(dbl_to_int26p6(y1))); - - while(point < limit) - { - point++; - tags++; - - tag = FT_CURVE_TAG(tags[0]); - switch(tag) - { - case FT_CURVE_TAG_ON: // emit a single line_to - { - x1 = int26p6_to_dbl(point->x); - y1 = int26p6_to_dbl(point->y); - if(flip_y) y1 = -y1; - mtx.transform(&x1, &y1); - path.line_to(value_type(dbl_to_int26p6(x1)), - value_type(dbl_to_int26p6(y1))); - //path.line_to(conv(point->x), flip_y ? -conv(point->y) : conv(point->y)); - continue; - } - - case FT_CURVE_TAG_CONIC: // consume conic arcs - { - v_control.x = point->x; - v_control.y = point->y; - - Do_Conic: - if(point < limit) - { - FT_Vector vec; - FT_Vector v_middle; - - point++; - tags++; - tag = FT_CURVE_TAG(tags[0]); - - vec.x = point->x; - vec.y = point->y; - - if(tag == FT_CURVE_TAG_ON) - { - x1 = int26p6_to_dbl(v_control.x); - y1 = int26p6_to_dbl(v_control.y); - x2 = int26p6_to_dbl(vec.x); - y2 = int26p6_to_dbl(vec.y); - if(flip_y) { y1 = -y1; y2 = -y2; } - mtx.transform(&x1, &y1); - mtx.transform(&x2, &y2); - path.curve3(value_type(dbl_to_int26p6(x1)), - value_type(dbl_to_int26p6(y1)), - value_type(dbl_to_int26p6(x2)), - value_type(dbl_to_int26p6(y2))); - continue; - } - - if(tag != FT_CURVE_TAG_CONIC) return false; - - v_middle.x = (v_control.x + vec.x) / 2; - v_middle.y = (v_control.y + vec.y) / 2; - - x1 = int26p6_to_dbl(v_control.x); - y1 = int26p6_to_dbl(v_control.y); - x2 = int26p6_to_dbl(v_middle.x); - y2 = int26p6_to_dbl(v_middle.y); - if(flip_y) { y1 = -y1; y2 = -y2; } - mtx.transform(&x1, &y1); - mtx.transform(&x2, &y2); - path.curve3(value_type(dbl_to_int26p6(x1)), - value_type(dbl_to_int26p6(y1)), - value_type(dbl_to_int26p6(x2)), - value_type(dbl_to_int26p6(y2))); - - //path.curve3(conv(v_control.x), - // flip_y ? -conv(v_control.y) : conv(v_control.y), - // conv(v_middle.x), - // flip_y ? -conv(v_middle.y) : conv(v_middle.y)); - - v_control = vec; - goto Do_Conic; - } - - x1 = int26p6_to_dbl(v_control.x); - y1 = int26p6_to_dbl(v_control.y); - x2 = int26p6_to_dbl(v_start.x); - y2 = int26p6_to_dbl(v_start.y); - if(flip_y) { y1 = -y1; y2 = -y2; } - mtx.transform(&x1, &y1); - mtx.transform(&x2, &y2); - path.curve3(value_type(dbl_to_int26p6(x1)), - value_type(dbl_to_int26p6(y1)), - value_type(dbl_to_int26p6(x2)), - value_type(dbl_to_int26p6(y2))); - - //path.curve3(conv(v_control.x), - // flip_y ? -conv(v_control.y) : conv(v_control.y), - // conv(v_start.x), - // flip_y ? -conv(v_start.y) : conv(v_start.y)); - goto Close; - } - - default: // FT_CURVE_TAG_CUBIC - { - FT_Vector vec1, vec2; - - if(point + 1 > limit || FT_CURVE_TAG(tags[1]) != FT_CURVE_TAG_CUBIC) - { - return false; - } - - vec1.x = point[0].x; - vec1.y = point[0].y; - vec2.x = point[1].x; - vec2.y = point[1].y; - - point += 2; - tags += 2; - - if(point <= limit) - { - FT_Vector vec; - - vec.x = point->x; - vec.y = point->y; - - x1 = int26p6_to_dbl(vec1.x); - y1 = int26p6_to_dbl(vec1.y); - x2 = int26p6_to_dbl(vec2.x); - y2 = int26p6_to_dbl(vec2.y); - x3 = int26p6_to_dbl(vec.x); - y3 = int26p6_to_dbl(vec.y); - if(flip_y) { y1 = -y1; y2 = -y2; y3 = -y3; } - mtx.transform(&x1, &y1); - mtx.transform(&x2, &y2); - mtx.transform(&x3, &y3); - path.curve4(value_type(dbl_to_int26p6(x1)), - value_type(dbl_to_int26p6(y1)), - value_type(dbl_to_int26p6(x2)), - value_type(dbl_to_int26p6(y2)), - value_type(dbl_to_int26p6(x3)), - value_type(dbl_to_int26p6(y3))); - - //path.curve4(conv(vec1.x), - // flip_y ? -conv(vec1.y) : conv(vec1.y), - // conv(vec2.x), - // flip_y ? -conv(vec2.y) : conv(vec2.y), - // conv(vec.x), - // flip_y ? -conv(vec.y) : conv(vec.y)); - continue; - } - - x1 = int26p6_to_dbl(vec1.x); - y1 = int26p6_to_dbl(vec1.y); - x2 = int26p6_to_dbl(vec2.x); - y2 = int26p6_to_dbl(vec2.y); - x3 = int26p6_to_dbl(v_start.x); - y3 = int26p6_to_dbl(v_start.y); - if(flip_y) { y1 = -y1; y2 = -y2; y3 = -y3; } - mtx.transform(&x1, &y1); - mtx.transform(&x2, &y2); - mtx.transform(&x3, &y3); - path.curve4(value_type(dbl_to_int26p6(x1)), - value_type(dbl_to_int26p6(y1)), - value_type(dbl_to_int26p6(x2)), - value_type(dbl_to_int26p6(y2)), - value_type(dbl_to_int26p6(x3)), - value_type(dbl_to_int26p6(y3))); - - //path.curve4(conv(vec1.x), - // flip_y ? -conv(vec1.y) : conv(vec1.y), - // conv(vec2.x), - // flip_y ? -conv(vec2.y) : conv(vec2.y), - // conv(v_start.x), - // flip_y ? -conv(v_start.y) : conv(v_start.y)); - goto Close; - } - } - } - - path.close_polygon(); - - Close: - first = last + 1; - } - - return true; - } - - - - //------------------------------------------------------------------------ - template - void decompose_ft_bitmap_mono(const FT_Bitmap& bitmap, - int x, int y, - bool flip_y, - Scanline& sl, - ScanlineStorage& storage) - { - int i; - const int8u* buf = (const int8u*)bitmap.buffer; - int pitch = bitmap.pitch; - sl.reset(x, x + bitmap.width); - storage.prepare(); - if(flip_y) - { - buf += bitmap.pitch * (bitmap.rows - 1); - y += bitmap.rows; - pitch = -pitch; - } - for(i = 0; i < bitmap.rows; i++) - { - sl.reset_spans(); - bitset_iterator bits(buf, 0); - int j; - for(j = 0; j < bitmap.width; j++) - { - if(bits.bit()) sl.add_cell(x + j, cover_full); - ++bits; - } - buf += pitch; - if(sl.num_spans()) - { - sl.finalize(y - i - 1); - storage.render(sl); - } - } - } - - - - //------------------------------------------------------------------------ - template - void decompose_ft_bitmap_gray8(const FT_Bitmap& bitmap, - int x, int y, - bool flip_y, - Rasterizer& ras, - Scanline& sl, - ScanlineStorage& storage) - { - int i, j; - const int8u* buf = (const int8u*)bitmap.buffer; - int pitch = bitmap.pitch; - sl.reset(x, x + bitmap.width); - storage.prepare(); - if(flip_y) - { - buf += bitmap.pitch * (bitmap.rows - 1); - y += bitmap.rows; - pitch = -pitch; - } - for(i = 0; i < bitmap.rows; i++) - { - sl.reset_spans(); - const int8u* p = buf; - for(j = 0; j < bitmap.width; j++) - { - if(*p) sl.add_cell(x + j, ras.apply_gamma(*p)); - ++p; - } - buf += pitch; - if(sl.num_spans()) - { - sl.finalize(y - i - 1); - storage.render(sl); - } - } - } - - - - - - - - - - - - - - //------------------------------------------------------------------------ - font_engine_freetype_base::~font_engine_freetype_base() - { - unsigned i; - for(i = 0; i < m_num_faces; ++i) - { - delete [] m_face_names[i]; - FT_Done_Face(m_faces[i]); - } - delete [] m_face_names; - delete [] m_faces; - delete [] m_signature; - if(m_library_initialized) FT_Done_FreeType(m_library); - } - - - //------------------------------------------------------------------------ - font_engine_freetype_base::font_engine_freetype_base(bool flag32, - unsigned max_faces) : - m_flag32(flag32), - m_change_stamp(0), - m_last_error(0), - m_name(0), - m_name_len(256-16-1), - m_face_index(0), - m_char_map(FT_ENCODING_NONE), - m_signature(new char [256+256-16]), - m_height(0), - m_width(0), - m_hinting(true), - m_flip_y(false), - m_library_initialized(false), - m_library(0), - m_faces(new FT_Face [max_faces]), - m_face_names(new char* [max_faces]), - m_num_faces(0), - m_max_faces(max_faces), - m_cur_face(0), - m_resolution(0), - m_glyph_rendering(glyph_ren_native_gray8), - m_glyph_index(0), - m_data_size(0), - m_data_type(glyph_data_invalid), - m_bounds(1,1,0,0), - m_advance_x(0.0), - m_advance_y(0.0), - - m_path16(), - m_path32(), - m_curves16(m_path16), - m_curves32(m_path32), - m_scanline_aa(), - m_scanline_bin(), - m_scanlines_aa(), - m_scanlines_bin(), - m_rasterizer() - { - m_curves16.approximation_scale(4.0); - m_curves32.approximation_scale(4.0); - m_last_error = FT_Init_FreeType(&m_library); - if(m_last_error == 0) m_library_initialized = true; - } - - - - //------------------------------------------------------------------------ - void font_engine_freetype_base::resolution(unsigned dpi) - { - m_resolution = dpi; - update_char_size(); - } - - - //------------------------------------------------------------------------ - int font_engine_freetype_base::find_face(const char* face_name) const - { - unsigned i; - for(i = 0; i < m_num_faces; ++i) - { - if(strcmp(face_name, m_face_names[i]) == 0) return i; - } - return -1; - } - - - //------------------------------------------------------------------------ - double font_engine_freetype_base::ascender() const - { - if(m_cur_face) - { - return m_cur_face->ascender * height() / m_cur_face->height; - } - return 0.0; - } - - //------------------------------------------------------------------------ - double font_engine_freetype_base::descender() const - { - if(m_cur_face) - { - return m_cur_face->descender * height() / m_cur_face->height; - } - return 0.0; - } - - - //------------------------------------------------------------------------ - bool font_engine_freetype_base::load_font(const char* font_name, - unsigned face_index, - glyph_rendering ren_type, - const char* font_mem, - const long font_mem_size) - { - bool ret = false; - - if(m_library_initialized) - { - m_last_error = 0; - - int idx = find_face(font_name); - if(idx >= 0) - { - m_cur_face = m_faces[idx]; - m_name = m_face_names[idx]; - } - else - { - if(m_num_faces >= m_max_faces) - { - delete [] m_face_names[0]; - FT_Done_Face(m_faces[0]); - memcpy(m_faces, - m_faces + 1, - (m_max_faces - 1) * sizeof(FT_Face)); - memcpy(m_face_names, - m_face_names + 1, - (m_max_faces - 1) * sizeof(char*)); - m_num_faces = m_max_faces - 1; - } - - if (font_mem && font_mem_size) - { - m_last_error = FT_New_Memory_Face(m_library, - (const FT_Byte*)font_mem, - font_mem_size, - face_index, - &m_faces[m_num_faces]); - } - else - { - m_last_error = FT_New_Face(m_library, - font_name, - face_index, - &m_faces[m_num_faces]); - } - - if(m_last_error == 0) - { - m_face_names[m_num_faces] = new char [strlen(font_name) + 1]; - strcpy(m_face_names[m_num_faces], font_name); - m_cur_face = m_faces[m_num_faces]; - m_name = m_face_names[m_num_faces]; - ++m_num_faces; - } - else - { - m_face_names[m_num_faces] = 0; - m_cur_face = 0; - m_name = 0; - } - } - - - if(m_last_error == 0) - { - ret = true; - - switch(ren_type) - { - case glyph_ren_native_mono: - m_glyph_rendering = glyph_ren_native_mono; - break; - - case glyph_ren_native_gray8: - m_glyph_rendering = glyph_ren_native_gray8; - break; - - case glyph_ren_outline: - if(FT_IS_SCALABLE(m_cur_face)) - { - m_glyph_rendering = glyph_ren_outline; - } - else - { - m_glyph_rendering = glyph_ren_native_gray8; - } - break; - - case glyph_ren_agg_mono: - if(FT_IS_SCALABLE(m_cur_face)) - { - m_glyph_rendering = glyph_ren_agg_mono; - } - else - { - m_glyph_rendering = glyph_ren_native_mono; - } - break; - - case glyph_ren_agg_gray8: - if(FT_IS_SCALABLE(m_cur_face)) - { - m_glyph_rendering = glyph_ren_agg_gray8; - } - else - { - m_glyph_rendering = glyph_ren_native_gray8; - } - break; - } - update_signature(); - } - } - return ret; - } - - - //------------------------------------------------------------------------ - bool font_engine_freetype_base::attach(const char* file_name) - { - if(m_cur_face) - { - m_last_error = FT_Attach_File(m_cur_face, file_name); - return m_last_error == 0; - } - return false; - } - - //------------------------------------------------------------------------ - unsigned font_engine_freetype_base::num_faces() const - { - if(m_cur_face) - { - return m_cur_face->num_faces; - } - return 0; - } - - //------------------------------------------------------------------------ - bool font_engine_freetype_base::char_map(FT_Encoding char_map) - { - if(m_cur_face) - { - m_last_error = FT_Select_Charmap(m_cur_face, m_char_map); - if(m_last_error == 0) - { - update_signature(); - return true; - } - } - return false; - } - - //------------------------------------------------------------------------ - bool font_engine_freetype_base::height(double h) - { - m_height = int(h * 64.0); - if(m_cur_face) - { - update_char_size(); - return true; - } - return false; - } - - //------------------------------------------------------------------------ - bool font_engine_freetype_base::width(double w) - { - m_width = int(w * 64.0); - if(m_cur_face) - { - update_char_size(); - return true; - } - return false; - } - - //------------------------------------------------------------------------ - void font_engine_freetype_base::hinting(bool h) - { - m_hinting = h; - if(m_cur_face) - { - update_signature(); - } - } - - //------------------------------------------------------------------------ - void font_engine_freetype_base::flip_y(bool f) - { - m_flip_y = f; - if(m_cur_face) - { - update_signature(); - } - } - - //------------------------------------------------------------------------ - void font_engine_freetype_base::transform(const trans_affine& affine) - { - m_affine = affine; - if(m_cur_face) - { - update_signature(); - } - } - - //------------------------------------------------------------------------ - void font_engine_freetype_base::update_signature() - { - if(m_cur_face && m_name) - { - unsigned name_len = strlen(m_name); - if(name_len > m_name_len) - { - delete [] m_signature; - m_signature = new char [name_len + 32 + 256]; - m_name_len = name_len + 32 - 1; - } - - unsigned gamma_hash = 0; - if(m_glyph_rendering == glyph_ren_native_gray8 || - m_glyph_rendering == glyph_ren_agg_mono || - m_glyph_rendering == glyph_ren_agg_gray8) - { - unsigned char gamma_table[rasterizer_scanline_aa<>::aa_scale]; - unsigned i; - for(i = 0; i < rasterizer_scanline_aa<>::aa_scale; ++i) - { - gamma_table[i] = m_rasterizer.apply_gamma(i); - } - gamma_hash = calc_crc32(gamma_table, sizeof(gamma_table)); - } - - sprintf(m_signature, - "%s,%u,%d,%d,%d:%dx%d,%d,%d,%08X", - m_name, - m_char_map, - m_face_index, - int(m_glyph_rendering), - m_resolution, - m_height, - m_width, - int(m_hinting), - int(m_flip_y), - gamma_hash); - if(m_glyph_rendering == glyph_ren_outline || - m_glyph_rendering == glyph_ren_agg_mono || - m_glyph_rendering == glyph_ren_agg_gray8) - { - double mtx[6]; - char buf[100]; - m_affine.store_to(mtx); - sprintf(buf, ",%08X%08X%08X%08X%08X%08X", - dbl_to_plain_fx(mtx[0]), - dbl_to_plain_fx(mtx[1]), - dbl_to_plain_fx(mtx[2]), - dbl_to_plain_fx(mtx[3]), - dbl_to_plain_fx(mtx[4]), - dbl_to_plain_fx(mtx[5])); - strcat(m_signature, buf); - } - ++m_change_stamp; - } - } - - - //------------------------------------------------------------------------ - void font_engine_freetype_base::update_char_size() - { - if(m_cur_face) - { - if(m_resolution) - { - FT_Set_Char_Size(m_cur_face, - m_width, // char_width in 1/64th of points - m_height, // char_height in 1/64th of points - m_resolution, // horizontal device resolution - m_resolution); // vertical device resolution - } - else - { - FT_Set_Pixel_Sizes(m_cur_face, - m_width >> 6, // pixel_width - m_height >> 6); // pixel_height - } - update_signature(); - } - } - - - - - - //------------------------------------------------------------------------ - bool font_engine_freetype_base::prepare_glyph(unsigned glyph_code) - { - m_glyph_index = FT_Get_Char_Index(m_cur_face, glyph_code); - m_last_error = FT_Load_Glyph(m_cur_face, - m_glyph_index, - m_hinting ? FT_LOAD_DEFAULT : FT_LOAD_NO_HINTING); -// m_hinting ? FT_LOAD_FORCE_AUTOHINT : FT_LOAD_NO_HINTING); - if(m_last_error == 0) - { - switch(m_glyph_rendering) - { - case glyph_ren_native_mono: - m_last_error = FT_Render_Glyph(m_cur_face->glyph, FT_RENDER_MODE_MONO); - if(m_last_error == 0) - { - decompose_ft_bitmap_mono(m_cur_face->glyph->bitmap, - m_cur_face->glyph->bitmap_left, - m_flip_y ? -m_cur_face->glyph->bitmap_top : - m_cur_face->glyph->bitmap_top, - m_flip_y, - m_scanline_bin, - m_scanlines_bin); - m_bounds.x1 = m_scanlines_bin.min_x(); - m_bounds.y1 = m_scanlines_bin.min_y(); - m_bounds.x2 = m_scanlines_bin.max_x() + 1; - m_bounds.y2 = m_scanlines_bin.max_y() + 1; - m_data_size = m_scanlines_bin.byte_size(); - m_data_type = glyph_data_mono; - m_advance_x = int26p6_to_dbl(m_cur_face->glyph->advance.x); - m_advance_y = int26p6_to_dbl(m_cur_face->glyph->advance.y); - return true; - } - break; - - - case glyph_ren_native_gray8: - m_last_error = FT_Render_Glyph(m_cur_face->glyph, FT_RENDER_MODE_NORMAL); - if(m_last_error == 0) - { - decompose_ft_bitmap_gray8(m_cur_face->glyph->bitmap, - m_cur_face->glyph->bitmap_left, - m_flip_y ? -m_cur_face->glyph->bitmap_top : - m_cur_face->glyph->bitmap_top, - m_flip_y, - m_rasterizer, - m_scanline_aa, - m_scanlines_aa); - m_bounds.x1 = m_scanlines_aa.min_x(); - m_bounds.y1 = m_scanlines_aa.min_y(); - m_bounds.x2 = m_scanlines_aa.max_x() + 1; - m_bounds.y2 = m_scanlines_aa.max_y() + 1; - m_data_size = m_scanlines_aa.byte_size(); - m_data_type = glyph_data_gray8; - m_advance_x = int26p6_to_dbl(m_cur_face->glyph->advance.x); - m_advance_y = int26p6_to_dbl(m_cur_face->glyph->advance.y); - return true; - } - break; - - - case glyph_ren_outline: - if(m_last_error == 0) - { - if(m_flag32) - { - m_path32.remove_all(); - if(decompose_ft_outline(m_cur_face->glyph->outline, - m_flip_y, - m_affine, - m_path32)) - { - rect_d bnd = m_path32.bounding_rect(); - m_data_size = m_path32.byte_size(); - m_data_type = glyph_data_outline; - m_bounds.x1 = int(floor(bnd.x1)); - m_bounds.y1 = int(floor(bnd.y1)); - m_bounds.x2 = int(ceil(bnd.x2)); - m_bounds.y2 = int(ceil(bnd.y2)); - m_advance_x = int26p6_to_dbl(m_cur_face->glyph->advance.x); - m_advance_y = int26p6_to_dbl(m_cur_face->glyph->advance.y); - m_affine.transform(&m_advance_x, &m_advance_y); - return true; - } - } - else - { - m_path16.remove_all(); - if(decompose_ft_outline(m_cur_face->glyph->outline, - m_flip_y, - m_affine, - m_path16)) - { - rect_d bnd = m_path16.bounding_rect(); - m_data_size = m_path16.byte_size(); - m_data_type = glyph_data_outline; - m_bounds.x1 = int(floor(bnd.x1)); - m_bounds.y1 = int(floor(bnd.y1)); - m_bounds.x2 = int(ceil(bnd.x2)); - m_bounds.y2 = int(ceil(bnd.y2)); - m_advance_x = int26p6_to_dbl(m_cur_face->glyph->advance.x); - m_advance_y = int26p6_to_dbl(m_cur_face->glyph->advance.y); - m_affine.transform(&m_advance_x, &m_advance_y); - return true; - } - } - } - return false; - - case glyph_ren_agg_mono: - if(m_last_error == 0) - { - m_rasterizer.reset(); - if(m_flag32) - { - m_path32.remove_all(); - decompose_ft_outline(m_cur_face->glyph->outline, - m_flip_y, - m_affine, - m_path32); - m_rasterizer.add_path(m_curves32); - } - else - { - m_path16.remove_all(); - decompose_ft_outline(m_cur_face->glyph->outline, - m_flip_y, - m_affine, - m_path16); - m_rasterizer.add_path(m_curves16); - } - m_scanlines_bin.prepare(); // Remove all - render_scanlines(m_rasterizer, m_scanline_bin, m_scanlines_bin); - m_bounds.x1 = m_scanlines_bin.min_x(); - m_bounds.y1 = m_scanlines_bin.min_y(); - m_bounds.x2 = m_scanlines_bin.max_x() + 1; - m_bounds.y2 = m_scanlines_bin.max_y() + 1; - m_data_size = m_scanlines_bin.byte_size(); - m_data_type = glyph_data_mono; - m_advance_x = int26p6_to_dbl(m_cur_face->glyph->advance.x); - m_advance_y = int26p6_to_dbl(m_cur_face->glyph->advance.y); - m_affine.transform(&m_advance_x, &m_advance_y); - return true; - } - return false; - - - case glyph_ren_agg_gray8: - if(m_last_error == 0) - { - m_rasterizer.reset(); - if(m_flag32) - { - m_path32.remove_all(); - decompose_ft_outline(m_cur_face->glyph->outline, - m_flip_y, - m_affine, - m_path32); - m_rasterizer.add_path(m_curves32); - } - else - { - m_path16.remove_all(); - decompose_ft_outline(m_cur_face->glyph->outline, - m_flip_y, - m_affine, - m_path16); - m_rasterizer.add_path(m_curves16); - } - m_scanlines_aa.prepare(); // Remove all - render_scanlines(m_rasterizer, m_scanline_aa, m_scanlines_aa); - m_bounds.x1 = m_scanlines_aa.min_x(); - m_bounds.y1 = m_scanlines_aa.min_y(); - m_bounds.x2 = m_scanlines_aa.max_x() + 1; - m_bounds.y2 = m_scanlines_aa.max_y() + 1; - m_data_size = m_scanlines_aa.byte_size(); - m_data_type = glyph_data_gray8; - m_advance_x = int26p6_to_dbl(m_cur_face->glyph->advance.x); - m_advance_y = int26p6_to_dbl(m_cur_face->glyph->advance.y); - m_affine.transform(&m_advance_x, &m_advance_y); - return true; - } - return false; - } - } - return false; - } - - - - - //------------------------------------------------------------------------ - void font_engine_freetype_base::write_glyph_to(int8u* data) const - { - if(data && m_data_size) - { - switch(m_data_type) - { - default: return; - case glyph_data_mono: m_scanlines_bin.serialize(data); break; - case glyph_data_gray8: m_scanlines_aa.serialize(data); break; - case glyph_data_outline: - if(m_flag32) - { - m_path32.serialize(data); - } - else - { - m_path16.serialize(data); - } - break; - case glyph_data_invalid: break; - } - } - } - - - - //------------------------------------------------------------------------ - bool font_engine_freetype_base::add_kerning(unsigned first, unsigned second, - double* x, double* y) - { - if(m_cur_face && first && second && FT_HAS_KERNING(m_cur_face)) - { - FT_Vector delta; - FT_Get_Kerning(m_cur_face, first, second, - FT_KERNING_DEFAULT, &delta); - double dx = int26p6_to_dbl(delta.x); - double dy = int26p6_to_dbl(delta.y); - if(m_glyph_rendering == glyph_ren_outline || - m_glyph_rendering == glyph_ren_agg_mono || - m_glyph_rendering == glyph_ren_agg_gray8) - { - m_affine.transform_2x2(&dx, &dy); - } - *x += dx; - *y += dy; - - return true; - } - return false; - } - - - -} - -#endif diff --git a/uppdev/agg24/agg_font_freetype.h b/uppdev/agg24/agg_font_freetype.h deleted file mode 100644 index f664afb4c..000000000 --- a/uppdev/agg24/agg_font_freetype.h +++ /dev/null @@ -1,199 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// See implementation agg_font_freetype.cpp -// -//---------------------------------------------------------------------------- - -#ifndef AGG_FONT_FREETYPE_INCLUDED -#define AGG_FONT_FREETYPE_INCLUDED - -#ifdef PLATFORM_X11 - -#include -#include FT_FREETYPE_H - - -#include "agg_scanline_storage_aa.h" -#include "agg_scanline_storage_bin.h" -#include "agg_scanline_u.h" -#include "agg_scanline_bin.h" -#include "agg_path_storage_integer.h" -#include "agg_rasterizer_scanline_aa.h" -#include "agg_conv_curve.h" -#include "agg_font_cache_manager.h" -#include "agg_trans_affine.h" - -namespace agg -{ - - - //-----------------------------------------------font_engine_freetype_base - class font_engine_freetype_base - { - public: - //-------------------------------------------------------------------- - typedef serialized_scanlines_adaptor_aa gray8_adaptor_type; - typedef serialized_scanlines_adaptor_bin mono_adaptor_type; - typedef scanline_storage_aa8 scanlines_aa_type; - typedef scanline_storage_bin scanlines_bin_type; - - //-------------------------------------------------------------------- - ~font_engine_freetype_base(); - font_engine_freetype_base(bool flag32, unsigned max_faces = 32); - - // Set font parameters - //-------------------------------------------------------------------- - void resolution(unsigned dpi); - bool load_font(const char* font_name, unsigned face_index, glyph_rendering ren_type, - const char* font_mem = 0, const long font_mem_size = 0); - bool attach(const char* file_name); - bool char_map(FT_Encoding map); - bool height(double h); - bool width(double w); - void hinting(bool h); - void flip_y(bool f); - void transform(const trans_affine& affine); - - // Set Gamma - //-------------------------------------------------------------------- - template void gamma(const GammaF& f) - { - m_rasterizer.gamma(f); - } - - // Accessors - //-------------------------------------------------------------------- - int last_error() const { return m_last_error; } - unsigned resolution() const { return m_resolution; } - const char* name() const { return m_name; } - unsigned num_faces() const; - FT_Encoding char_map() const { return m_char_map; } - double height() const { return double(m_height) / 64.0; } - double width() const { return double(m_width) / 64.0; } - double ascender() const; - double descender() const; - bool hinting() const { return m_hinting; } - bool flip_y() const { return m_flip_y; } - - - // Interface mandatory to implement for font_cache_manager - //-------------------------------------------------------------------- - const char* font_signature() const { return m_signature; } - int change_stamp() const { return m_change_stamp; } - - bool prepare_glyph(unsigned glyph_code); - unsigned glyph_index() const { return m_glyph_index; } - unsigned data_size() const { return m_data_size; } - glyph_data_type data_type() const { return m_data_type; } - const rect_i& bounds() const { return m_bounds; } - double advance_x() const { return m_advance_x; } - double advance_y() const { return m_advance_y; } - void write_glyph_to(int8u* data) const; - bool add_kerning(unsigned first, unsigned second, - double* x, double* y); - - private: - font_engine_freetype_base(const font_engine_freetype_base&); - const font_engine_freetype_base& operator = (const font_engine_freetype_base&); - - void update_char_size(); - void update_signature(); - int find_face(const char* face_name) const; - - bool m_flag32; - int m_change_stamp; - int m_last_error; - char* m_name; - unsigned m_name_len; - unsigned m_face_index; - FT_Encoding m_char_map; - char* m_signature; - unsigned m_height; - unsigned m_width; - bool m_hinting; - bool m_flip_y; - bool m_library_initialized; - FT_Library m_library; // handle to library - FT_Face* m_faces; // A pool of font faces - char** m_face_names; - unsigned m_num_faces; - unsigned m_max_faces; - FT_Face m_cur_face; // handle to the current face object - int m_resolution; - glyph_rendering m_glyph_rendering; - unsigned m_glyph_index; - unsigned m_data_size; - glyph_data_type m_data_type; - rect_i m_bounds; - double m_advance_x; - double m_advance_y; - trans_affine m_affine; - - path_storage_integer m_path16; - path_storage_integer m_path32; - conv_curve > m_curves16; - conv_curve > m_curves32; - scanline_u8 m_scanline_aa; - scanline_bin m_scanline_bin; - scanlines_aa_type m_scanlines_aa; - scanlines_bin_type m_scanlines_bin; - rasterizer_scanline_aa<> m_rasterizer; - }; - - - - - //------------------------------------------------font_engine_freetype_int16 - // This class uses values of type int16 (10.6 format) for the vector cache. - // The vector cache is compact, but when rendering glyphs of height - // more that 200 there integer overflow can occur. - // - class font_engine_freetype_int16 : public font_engine_freetype_base - { - public: - typedef serialized_integer_path_adaptor path_adaptor_type; - typedef font_engine_freetype_base::gray8_adaptor_type gray8_adaptor_type; - typedef font_engine_freetype_base::mono_adaptor_type mono_adaptor_type; - typedef font_engine_freetype_base::scanlines_aa_type scanlines_aa_type; - typedef font_engine_freetype_base::scanlines_bin_type scanlines_bin_type; - - font_engine_freetype_int16(unsigned max_faces = 32) : - font_engine_freetype_base(false, max_faces) {} - }; - - //------------------------------------------------font_engine_freetype_int32 - // This class uses values of type int32 (26.6 format) for the vector cache. - // The vector cache is twice larger than in font_engine_freetype_int16, - // but it allows you to render glyphs of very large sizes. - // - class font_engine_freetype_int32 : public font_engine_freetype_base - { - public: - typedef serialized_integer_path_adaptor path_adaptor_type; - typedef font_engine_freetype_base::gray8_adaptor_type gray8_adaptor_type; - typedef font_engine_freetype_base::mono_adaptor_type mono_adaptor_type; - typedef font_engine_freetype_base::scanlines_aa_type scanlines_aa_type; - typedef font_engine_freetype_base::scanlines_bin_type scanlines_bin_type; - - font_engine_freetype_int32(unsigned max_faces = 32) : - font_engine_freetype_base(true, max_faces) {} - }; - - -} - -#endif -#endif diff --git a/uppdev/agg24/agg_font_win32_tt.cpp b/uppdev/agg24/agg_font_win32_tt.cpp deleted file mode 100644 index 5d5bcd27e..000000000 --- a/uppdev/agg24/agg_font_win32_tt.cpp +++ /dev/null @@ -1,939 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -#ifdef PLATFORM_WIN32 - -#include -#include "agg_font_win32_tt.h" -#include "agg_bitset_iterator.h" -#include "agg_renderer_scanline.h" - -#ifdef AGG_WIN9X_COMPLIANT -#define GetGlyphOutlineX GetGlyphOutline -#else -#define GetGlyphOutlineX GetGlyphOutlineW -#endif - -namespace agg -{ - - //------------------------------------------------------------------------------ - // - // This code implements the AUTODIN II polynomial - // The variable corresponding to the macro argument "crc" should - // be an unsigned long. - // Oroginal code by Spencer Garrett - // - - // generated using the AUTODIN II polynomial - // x^32 + x^26 + x^23 + x^22 + x^16 + - // x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x^1 + 1 - // - //------------------------------------------------------------------------------ - - static const unsigned crc32tab[256] = - { - 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, - 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, - 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, - 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, - 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, - 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, - 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, - 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, - 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, - 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, - 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, - 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, - 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, - 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, - 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, - 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, - 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, - 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, - 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, - 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, - 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, - 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, - 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, - 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, - 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, - 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, - 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, - 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, - 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, - 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, - 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, - 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, - 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, - 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, - 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, - 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, - 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, - 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, - 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, - 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, - 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, - 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, - 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, - 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, - 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, - 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, - 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, - 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, - 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, - 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, - 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, - 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, - 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, - 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, - 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, - 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, - 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, - 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, - 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, - 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, - 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, - 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, - 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, - 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d, - }; - - //------------------------------------------------------------------------------ - static unsigned calc_crc32(const unsigned char* buf, unsigned size) - { - unsigned crc = (unsigned)~0; - const unsigned char* p; - unsigned len = 0; - unsigned nr = size; - - for (len += nr, p = buf; nr--; ++p) - { - crc = (crc >> 8) ^ crc32tab[(crc ^ *p) & 0xff]; - } - return ~crc; - } - - //------------------------------------------------------------------------ - static inline FIXED dbl_to_fx(double d) - { - int l; - l = int(d * 65536.0); - return *(FIXED*)&l; - } - - //------------------------------------------------------------------------ - static inline int dbl_to_plain_fx(double d) - { - return int(d * 65536.0); - } - - //------------------------------------------------------------------------ - static inline FIXED negate_fx(const FIXED& fx) - { - int l = -(*(int*)(&fx)); - return *(FIXED*)&l; - } - - //------------------------------------------------------------------------ - static inline double fx_to_dbl(const FIXED& p) - { - return double(p.value) + double(p.fract) * (1.0 / 65536.0); - } - - //------------------------------------------------------------------------ - static inline int fx_to_plain_int(const FIXED& fx) - { - return *(int*)(&fx); - } - - //------------------------------------------------------------------------ - static inline int fx_to_int26p6(const FIXED& p) - { - return (int(p.value) << 6) + (int(p.fract) >> 10); - } - - //------------------------------------------------------------------------ - static inline int dbl_to_int26p6(double p) - { - return int(p * 64.0 + 0.5); - } - - //------------------------------------------------------------------------ - template - void decompose_win32_glyph_bitmap_mono(const char* gbuf, - int w, int h, - int x, int y, - bool flip_y, - Scanline& sl, - ScanlineStorage& storage) - { - int i; - int pitch = ((w + 31) >> 5) << 2; - const int8u* buf = (const int8u*)gbuf; - sl.reset(x, x + w); - storage.prepare(); - if(flip_y) - { - buf += pitch * (h - 1); - y += h; - pitch = -pitch; - } - for(i = 0; i < h; i++) - { - sl.reset_spans(); - bitset_iterator bits(buf, 0); - int j; - for(j = 0; j < w; j++) - { - if(bits.bit()) sl.add_cell(x + j, cover_full); - ++bits; - } - buf += pitch; - if(sl.num_spans()) - { - sl.finalize(y - i - 1); - storage.render(sl); - } - } - } - - - - //------------------------------------------------------------------------ - template - void decompose_win32_glyph_bitmap_gray8(const char* gbuf, - int w, int h, - int x, int y, - bool flip_y, - Rasterizer& ras, - Scanline& sl, - ScanlineStorage& storage) - { - int i, j; - int pitch = ((w + 3) >> 2) << 2; - const int8u* buf = (const int8u*)gbuf; - sl.reset(x, x + w); - storage.prepare(); - if(flip_y) - { - buf += pitch * (h - 1); - y += h; - pitch = -pitch; - } - for(i = 0; i < h; i++) - { - sl.reset_spans(); - const int8u* p = buf; - for(j = 0; j < w; j++) - { - if(*p) - { - unsigned v = *p; - if(v == 64) v = 255; - else v <<= 2; - sl.add_cell(x + j, ras.apply_gamma(v)); - } - ++p; - } - buf += pitch; - if(sl.num_spans()) - { - sl.finalize(y - i - 1); - storage.render(sl); - } - } - } - - - - //------------------------------------------------------------------------ - template - bool decompose_win32_glyph_outline(const char* gbuf, - unsigned total_size, - bool flip_y, - const trans_affine& mtx, - PathStorage& path) - { - const char* cur_glyph = gbuf; - const char* end_glyph = gbuf + total_size; - double x, y; - typedef typename PathStorage::value_type value_type; - - while(cur_glyph < end_glyph) - { - const TTPOLYGONHEADER* th = (TTPOLYGONHEADER*)cur_glyph; - - const char* end_poly = cur_glyph + th->cb; - const char* cur_poly = cur_glyph + sizeof(TTPOLYGONHEADER); - - x = fx_to_dbl(th->pfxStart.x); - y = fx_to_dbl(th->pfxStart.y); - if(flip_y) y = -y; - mtx.transform(&x, &y); - path.move_to(value_type(dbl_to_int26p6(x)), - value_type(dbl_to_int26p6(y))); - - while(cur_poly < end_poly) - { - const TTPOLYCURVE* pc = (const TTPOLYCURVE*)cur_poly; - - if (pc->wType == TT_PRIM_LINE) - { - int i; - for (i = 0; i < pc->cpfx; i++) - { - x = fx_to_dbl(pc->apfx[i].x); - y = fx_to_dbl(pc->apfx[i].y); - if(flip_y) y = -y; - mtx.transform(&x, &y); - path.line_to(value_type(dbl_to_int26p6(x)), - value_type(dbl_to_int26p6(y))); - } - } - - if (pc->wType == TT_PRIM_QSPLINE) - { - int u; - for (u = 0; u < pc->cpfx - 1; u++) // Walk through points in spline - { - POINTFX pnt_b = pc->apfx[u]; // B is always the current point - POINTFX pnt_c = pc->apfx[u+1]; - - if (u < pc->cpfx - 2) // If not on last spline, compute C - { - // midpoint (x,y) - *(int*)&pnt_c.x = (*(int*)&pnt_b.x + *(int*)&pnt_c.x) / 2; - *(int*)&pnt_c.y = (*(int*)&pnt_b.y + *(int*)&pnt_c.y) / 2; - } - - double x2, y2; - x = fx_to_dbl(pnt_b.x); - y = fx_to_dbl(pnt_b.y); - x2 = fx_to_dbl(pnt_c.x); - y2 = fx_to_dbl(pnt_c.y); - if(flip_y) { y = -y; y2 = -y2; } - mtx.transform(&x, &y); - mtx.transform(&x2, &y2); - path.curve3(value_type(dbl_to_int26p6(x)), - value_type(dbl_to_int26p6(y)), - value_type(dbl_to_int26p6(x2)), - value_type(dbl_to_int26p6(y2))); - } - } - cur_poly += sizeof(WORD) * 2 + sizeof(POINTFX) * pc->cpfx; - } - cur_glyph += th->cb; - } - return true; - } - - - - - //------------------------------------------------------------------------ - font_engine_win32_tt_base::~font_engine_win32_tt_base() - { - delete [] m_kerning_pairs; - delete [] m_gbuf; - delete [] m_signature; - delete [] m_typeface; - if(m_dc && m_old_font) ::SelectObject(m_dc, m_old_font); - unsigned i; - for(i = 0; i < m_num_fonts; ++i) - { - delete [] m_font_names[i]; - ::DeleteObject(m_fonts[i]); - } - delete [] m_font_names; - delete [] m_fonts; - } - - - - //------------------------------------------------------------------------ - font_engine_win32_tt_base::font_engine_win32_tt_base(bool flag32, - HDC dc, - unsigned max_fonts) : - m_flag32(flag32), - m_dc(dc), - m_old_font(m_dc ? (HFONT)::GetCurrentObject(m_dc, OBJ_FONT) : 0), - m_fonts(new HFONT [max_fonts]), - m_num_fonts(0), - m_max_fonts(max_fonts), - m_font_names(new char* [max_fonts]), - m_cur_font(0), - - m_change_stamp(0), - m_typeface(new char [256-16]), - m_typeface_len(256-16-1), - m_signature(new char [256+256-16]), - m_height(0), - m_width(0), - m_weight(FW_REGULAR), - m_italic(false), - m_char_set(DEFAULT_CHARSET), - m_pitch_and_family(FF_DONTCARE), - m_hinting(true), - m_flip_y(false), - m_font_created(false), - m_resolution(0), - m_glyph_rendering(glyph_ren_native_gray8), - m_glyph_index(0), - m_data_size(0), - m_data_type(glyph_data_invalid), - m_bounds(1,1,0,0), - m_advance_x(0.0), - m_advance_y(0.0), - m_gbuf(new char [buf_size]), - m_kerning_pairs(0), - m_num_kerning_pairs(0), - m_max_kerning_pairs(0), - - m_path16(), - m_path32(), - m_curves16(m_path16), - m_curves32(m_path32), - m_scanline_aa(), - m_scanline_bin(), - m_scanlines_aa(), - m_scanlines_bin(), - m_rasterizer() - { - m_curves16.approximation_scale(4.0); - m_curves32.approximation_scale(4.0); - memset(&m_matrix, 0, sizeof(m_matrix)); - m_matrix.eM11.value = 1; - m_matrix.eM22.value = 1; - } - - - - //------------------------------------------------------------------------ - int font_engine_win32_tt_base::find_font(const char* name) const - { - unsigned i; - for(i = 0; i < m_num_fonts; ++i) - { - if(strcmp(name, m_font_names[i]) == 0) return i; - } - return -1; - } - - //------------------------------------------------------------------------ - bool font_engine_win32_tt_base::create_font(const char* typeface_, - glyph_rendering ren_type) - { - if(m_dc) - { - unsigned len = strlen(typeface_); - if(len > m_typeface_len) - { - delete [] m_signature; - delete [] m_typeface; - m_typeface = new char [len + 32]; - m_signature = new char [len + 32 + 256]; - m_typeface_len = len + 32 - 1; - } - - strcpy(m_typeface, typeface_); - - int h = m_height; - int w = m_width; - - if(m_resolution) - { - h = ::MulDiv(m_height, m_resolution, 72); - w = ::MulDiv(m_width, m_resolution, 72); - } - - m_glyph_rendering = ren_type; - update_signature(); - int idx = find_font(m_signature); - if(idx >= 0) - { - m_cur_font = m_fonts[idx]; - ::SelectObject(m_dc, m_cur_font); - m_num_kerning_pairs = 0; - return true; - } - else - { - m_cur_font = ::CreateFont(-h, // height of font - w, // average character width - 0, // angle of escapement - 0, // base-line orientation angle - m_weight, // font weight - m_italic, // italic attribute option - 0, // underline attribute option - 0, // strikeout attribute option - m_char_set, // character set identifier - OUT_DEFAULT_PRECIS, // output precision - CLIP_DEFAULT_PRECIS, // clipping precision - ANTIALIASED_QUALITY, // output quality - m_pitch_and_family, // pitch and family - m_typeface); // typeface name - if(m_cur_font) - { - if(m_num_fonts >= m_max_fonts) - { - delete [] m_font_names[0]; - if(m_old_font) ::SelectObject(m_dc, m_old_font); - ::DeleteObject(m_fonts[0]); - memcpy(m_fonts, - m_fonts + 1, - (m_max_fonts - 1) * sizeof(HFONT)); - memcpy(m_font_names, - m_font_names + 1, - (m_max_fonts - 1) * sizeof(char*)); - m_num_fonts = m_max_fonts - 1; - } - - update_signature(); - m_font_names[m_num_fonts] = new char[strlen(m_signature) + 1]; - strcpy(m_font_names[m_num_fonts], m_signature); - m_fonts[m_num_fonts] = m_cur_font; - ++m_num_fonts; - ::SelectObject(m_dc, m_cur_font); - m_num_kerning_pairs = 0; - return true; - } - } - } - return false; - } - - - - - - //------------------------------------------------------------------------ - bool font_engine_win32_tt_base::create_font(const char* typeface_, - glyph_rendering ren_type, - double height_, - double width_, - int weight_, - bool italic_, - DWORD char_set_, - DWORD pitch_and_family_) - { - height(height_); - width(width_); - weight(weight_); - italic(italic_); - char_set(char_set_); - pitch_and_family(pitch_and_family_); - return create_font(typeface_, ren_type); - } - - - - - //------------------------------------------------------------------------ - void font_engine_win32_tt_base::update_signature() - { - m_signature[0] = 0; - if(m_dc && m_cur_font) - { - unsigned gamma_hash = 0; - if(m_glyph_rendering == glyph_ren_native_gray8 || - m_glyph_rendering == glyph_ren_agg_mono || - m_glyph_rendering == glyph_ren_agg_gray8) - { - unsigned char gamma_table[rasterizer_scanline_aa<>::aa_scale]; - unsigned i; - for(i = 0; i < rasterizer_scanline_aa<>::aa_scale; ++i) - { - gamma_table[i] = m_rasterizer.apply_gamma(i); - } - gamma_hash = calc_crc32(gamma_table, sizeof(gamma_table)); - } - - sprintf(m_signature, - "%s,%u,%d,%d:%dx%d,%d,%d,%d,%d,%d,%08X", - m_typeface, - m_char_set, - int(m_glyph_rendering), - m_resolution, - m_height, - m_width, - m_weight, - int(m_italic), - int(m_hinting), - int(m_flip_y), - int(m_pitch_and_family), - gamma_hash); - - if(m_glyph_rendering == glyph_ren_outline || - m_glyph_rendering == glyph_ren_agg_mono || - m_glyph_rendering == glyph_ren_agg_gray8) - { - double mtx[6]; - char buf[100]; - m_affine.store_to(mtx); - sprintf(buf, ",%08X%08X%08X%08X%08X%08X", - dbl_to_plain_fx(mtx[0]), - dbl_to_plain_fx(mtx[1]), - dbl_to_plain_fx(mtx[2]), - dbl_to_plain_fx(mtx[3]), - dbl_to_plain_fx(mtx[4]), - dbl_to_plain_fx(mtx[5])); - strcat(m_signature, buf); - } - ++m_change_stamp; - } - } - - - - //------------------------------------------------------------------------ - bool font_engine_win32_tt_base::prepare_glyph(unsigned glyph_code) - { - if(m_dc && m_cur_font) - { - int format = GGO_BITMAP; - - switch(m_glyph_rendering) - { - case glyph_ren_native_gray8: - format = GGO_GRAY8_BITMAP; - break; - - case glyph_ren_outline: - case glyph_ren_agg_mono: - case glyph_ren_agg_gray8: - format = GGO_NATIVE; - break; - } - -#ifndef GGO_UNHINTED // For compatibility with old SDKs. -#define GGO_UNHINTED 0x0100 -#endif - if(!m_hinting) format |= GGO_UNHINTED; - - GLYPHMETRICS gm; - int total_size = GetGlyphOutlineX(m_dc, - glyph_code, - format, - &gm, - buf_size, - (void*)m_gbuf, - &m_matrix); - - if(total_size < 0) - { - // GetGlyphOutline() fails when being called for - // GGO_GRAY8_BITMAP and white space (stupid Microsoft). - // It doesn't even initialize the glyph metrics - // structure. So, we have to query the metrics - // separately (basically we need gmCellIncX). - int total_size = GetGlyphOutlineX(m_dc, - glyph_code, - GGO_METRICS, - &gm, - buf_size, - (void*)m_gbuf, - &m_matrix); - - if(total_size < 0) return false; - gm.gmBlackBoxX = gm.gmBlackBoxY = 0; - total_size = 0; - } - - m_glyph_index = glyph_code; - m_advance_x = gm.gmCellIncX; - m_advance_y = -gm.gmCellIncY; - - switch(m_glyph_rendering) - { - case glyph_ren_native_mono: - decompose_win32_glyph_bitmap_mono(m_gbuf, - gm.gmBlackBoxX, - gm.gmBlackBoxY, - gm.gmptGlyphOrigin.x, - m_flip_y ? -gm.gmptGlyphOrigin.y : - gm.gmptGlyphOrigin.y, - m_flip_y, - m_scanline_bin, - m_scanlines_bin); - m_bounds.x1 = m_scanlines_bin.min_x(); - m_bounds.y1 = m_scanlines_bin.min_y(); - m_bounds.x2 = m_scanlines_bin.max_x() + 1; - m_bounds.y2 = m_scanlines_bin.max_y() + 1; - m_data_size = m_scanlines_bin.byte_size(); - m_data_type = glyph_data_mono; - return true; - - case glyph_ren_native_gray8: - decompose_win32_glyph_bitmap_gray8(m_gbuf, - gm.gmBlackBoxX, - gm.gmBlackBoxY, - gm.gmptGlyphOrigin.x, - m_flip_y ? -gm.gmptGlyphOrigin.y : - gm.gmptGlyphOrigin.y, - m_flip_y, - m_rasterizer, - m_scanline_aa, - m_scanlines_aa); - m_bounds.x1 = m_scanlines_aa.min_x(); - m_bounds.y1 = m_scanlines_aa.min_y(); - m_bounds.x2 = m_scanlines_aa.max_x() + 1; - m_bounds.y2 = m_scanlines_aa.max_y() + 1; - m_data_size = m_scanlines_aa.byte_size(); - m_data_type = glyph_data_gray8; - return true; - - case glyph_ren_outline: - m_affine.transform(&m_advance_x, &m_advance_y); - if(m_flag32) - { - m_path32.remove_all(); - if(decompose_win32_glyph_outline(m_gbuf, - total_size, - m_flip_y, - m_affine, - m_path32)) - { - rect_d bnd = m_path32.bounding_rect(); - m_data_size = m_path32.byte_size(); - m_data_type = glyph_data_outline; - m_bounds.x1 = int(floor(bnd.x1)); - m_bounds.y1 = int(floor(bnd.y1)); - m_bounds.x2 = int(ceil(bnd.x2)); - m_bounds.y2 = int(ceil(bnd.y2)); - return true; - } - } - else - { - m_path16.remove_all(); - if(decompose_win32_glyph_outline(m_gbuf, - total_size, - m_flip_y, - m_affine, - m_path16)) - { - rect_d bnd = m_path16.bounding_rect(); - m_data_size = m_path16.byte_size(); - m_data_type = glyph_data_outline; - m_bounds.x1 = int(floor(bnd.x1)); - m_bounds.y1 = int(floor(bnd.y1)); - m_bounds.x2 = int(ceil(bnd.x2)); - m_bounds.y2 = int(ceil(bnd.y2)); - return true; - } - } - break; - - case glyph_ren_agg_mono: - m_rasterizer.reset(); - m_affine.transform(&m_advance_x, &m_advance_y); - if(m_flag32) - { - m_path32.remove_all(); - decompose_win32_glyph_outline(m_gbuf, - total_size, - m_flip_y, - m_affine, - m_path32); - m_rasterizer.add_path(m_curves32); - } - else - { - m_path16.remove_all(); - decompose_win32_glyph_outline(m_gbuf, - total_size, - m_flip_y, - m_affine, - m_path16); - m_rasterizer.add_path(m_curves16); - } - m_scanlines_bin.prepare(); // Remove all - render_scanlines(m_rasterizer, m_scanline_bin, m_scanlines_bin); - m_bounds.x1 = m_scanlines_bin.min_x(); - m_bounds.y1 = m_scanlines_bin.min_y(); - m_bounds.x2 = m_scanlines_bin.max_x() + 1; - m_bounds.y2 = m_scanlines_bin.max_y() + 1; - m_data_size = m_scanlines_bin.byte_size(); - m_data_type = glyph_data_mono; - return true; - - case glyph_ren_agg_gray8: - m_rasterizer.reset(); - m_affine.transform(&m_advance_x, &m_advance_y); - if(m_flag32) - { - m_path32.remove_all(); - decompose_win32_glyph_outline(m_gbuf, - total_size, - m_flip_y, - m_affine, - m_path32); - m_rasterizer.add_path(m_curves32); - } - else - { - m_path16.remove_all(); - decompose_win32_glyph_outline(m_gbuf, - total_size, - m_flip_y, - m_affine, - m_path16); - m_rasterizer.add_path(m_curves16); - } - m_scanlines_aa.prepare(); // Remove all - render_scanlines(m_rasterizer, m_scanline_aa, m_scanlines_aa); - m_bounds.x1 = m_scanlines_aa.min_x(); - m_bounds.y1 = m_scanlines_aa.min_y(); - m_bounds.x2 = m_scanlines_aa.max_x() + 1; - m_bounds.y2 = m_scanlines_aa.max_y() + 1; - m_data_size = m_scanlines_aa.byte_size(); - m_data_type = glyph_data_gray8; - return true; - } - } - return false; - } - - - - //------------------------------------------------------------------------ - void font_engine_win32_tt_base::write_glyph_to(int8u* data) const - { - if(data && m_data_size) - { - switch(m_data_type) - { - case glyph_data_mono: m_scanlines_bin.serialize(data); break; - case glyph_data_gray8: m_scanlines_aa.serialize(data); break; - case glyph_data_outline: - if(m_flag32) - { - m_path32.serialize(data); - } - else - { - m_path16.serialize(data); - } - break; - } - } - } - - - - //------------------------------------------------------------------------ - static bool pair_less(const KERNINGPAIR& v1, const KERNINGPAIR& v2) - { - if(v1.wFirst != v2.wFirst) return v1.wFirst < v2.wFirst; - return v1.wSecond < v2.wSecond; - } - - - //------------------------------------------------------------------------ - void font_engine_win32_tt_base::sort_kerning_pairs() - { - pod_array_adaptor pairs(m_kerning_pairs, m_num_kerning_pairs); - quick_sort(pairs, pair_less); - } - - - - //------------------------------------------------------------------------ - void font_engine_win32_tt_base::load_kerning_pairs() - { - if(m_dc && m_cur_font) - { - if(m_kerning_pairs == 0) - { - m_kerning_pairs = new KERNINGPAIR [16384-16]; - m_max_kerning_pairs = 16384-16; - } - m_num_kerning_pairs = ::GetKerningPairs(m_dc, - m_max_kerning_pairs, - m_kerning_pairs); - - if(m_num_kerning_pairs) - { - // Check to see if the kerning pairs are sorted and - // sort them if they are not. - //---------------- - unsigned i; - for(i = 1; i < m_num_kerning_pairs; ++i) - { - if(!pair_less(m_kerning_pairs[i - 1], m_kerning_pairs[i])) - { - sort_kerning_pairs(); - break; - } - } - } - } - } - - - //------------------------------------------------------------------------ - bool font_engine_win32_tt_base::add_kerning(unsigned first, unsigned second, - double* x, double* y) - { - if(m_dc && m_cur_font) - { - if(m_num_kerning_pairs == 0) - { - load_kerning_pairs(); - } - - int end = m_num_kerning_pairs - 1; - int beg = 0; - KERNINGPAIR t; - t.wFirst = (WORD)first; - t.wSecond = (WORD)second; - while(beg <= end) - { - int mid = (end + beg) / 2; - if(m_kerning_pairs[mid].wFirst == t.wFirst && - m_kerning_pairs[mid].wSecond == t.wSecond) - { - double dx = m_kerning_pairs[mid].iKernAmount; - double dy = 0.0; - if(m_glyph_rendering == glyph_ren_outline || - m_glyph_rendering == glyph_ren_agg_mono || - m_glyph_rendering == glyph_ren_agg_gray8) - { - m_affine.transform_2x2(&dx, &dy); - } - *x += dx; - *y += dy; - return true; - } - else - if(pair_less(t, m_kerning_pairs[mid])) - { - end = mid - 1; - } - else - { - beg = mid + 1; - } - } - return false; - } - return false; - } - - - -} - -#endif diff --git a/uppdev/agg24/agg_font_win32_tt.h b/uppdev/agg24/agg_font_win32_tt.h deleted file mode 100644 index 03a39186e..000000000 --- a/uppdev/agg24/agg_font_win32_tt.h +++ /dev/null @@ -1,217 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_FONT_WIN32_TT_INCLUDED -#define AGG_FONT_WIN32_TT_INCLUDED - -#ifdef PLATFORM_WIN32 - -#include -#include "agg_scanline_storage_aa.h" -#include "agg_scanline_storage_bin.h" -#include "agg_scanline_u.h" -#include "agg_scanline_bin.h" -#include "agg_path_storage_integer.h" -#include "agg_rasterizer_scanline_aa.h" -#include "agg_conv_curve.h" -#include "agg_trans_affine.h" -#include "agg_font_cache_manager.h" - -namespace agg -{ - - //-----------------------------------------------font_engine_win32_tt_base - class font_engine_win32_tt_base - { - enum { buf_size = 32768-32 }; - - public: - //-------------------------------------------------------------------- - typedef serialized_scanlines_adaptor_aa gray8_adaptor_type; - typedef serialized_scanlines_adaptor_bin mono_adaptor_type; - typedef scanline_storage_aa8 scanlines_aa_type; - typedef scanline_storage_bin scanlines_bin_type; - - //-------------------------------------------------------------------- - ~font_engine_win32_tt_base(); - font_engine_win32_tt_base(bool flag32, HDC dc, unsigned max_fonts = 32); - - // Set font parameters - //-------------------------------------------------------------------- - void resolution(unsigned dpi) { m_resolution = unsigned(dpi); } - void height(double h) { m_height = unsigned(h); } - void width(double w) { m_width = unsigned(w); } - void weight(int w) { m_weight = w; } - void italic(bool it) { m_italic = it; } - void char_set(DWORD c) { m_char_set = c; } - void pitch_and_family(DWORD p){ m_pitch_and_family = p; } - void flip_y(bool flip) { m_flip_y = flip; } - void hinting(bool h) { m_hinting = h; } - bool create_font(const char* typeface_, glyph_rendering ren_type); - - bool create_font(const char* typeface_, - glyph_rendering ren_type, - double height_, - double width_=0.0, - int weight_=FW_REGULAR, - bool italic_=false, - DWORD char_set_=ANSI_CHARSET, - DWORD pitch_and_family_=FF_DONTCARE); - - // Set Gamma - //-------------------------------------------------------------------- - template void gamma(const GammaF& f) - { - m_rasterizer.gamma(f); - } - - //-------------------------------------------------------------------- - void transform(const agg::trans_affine& mtx) - { - m_affine = mtx; - } - - // Accessors - //-------------------------------------------------------------------- - unsigned resolution() const { return m_resolution; } - const char* typeface() const { return m_typeface; } - double height() const { return m_height; } - double width() const { return m_width; } - int weight() const { return m_weight; } - bool italic() const { return m_italic; } - DWORD char_set() const { return m_char_set; } - DWORD pitch_and_family() const { return m_pitch_and_family; } - bool hinting() const { return m_hinting; } - bool flip_y() const { return m_flip_y; } - - - // Interface mandatory to implement for font_cache_manager - //-------------------------------------------------------------------- - const char* font_signature() const { return m_signature; } - int change_stamp() const { return m_change_stamp; } - - bool prepare_glyph(unsigned glyph_code); - unsigned glyph_index() const { return m_glyph_index; } - unsigned data_size() const { return m_data_size; } - glyph_data_type data_type() const { return m_data_type; } - const rect_i& bounds() const { return m_bounds; } - double advance_x() const { return m_advance_x; } - double advance_y() const { return m_advance_y; } - void write_glyph_to(int8u* data) const; - bool add_kerning(unsigned first, unsigned second, - double* x, double* y); - - private: - font_engine_win32_tt_base(const font_engine_win32_tt_base&); - const font_engine_win32_tt_base& operator = (const font_engine_win32_tt_base&); - - void update_signature(); - void load_kerning_pairs(); - void sort_kerning_pairs(); - int find_font(const char* name) const; - - bool m_flag32; - HDC m_dc; - HFONT m_old_font; - HFONT* m_fonts; - unsigned m_num_fonts; - unsigned m_max_fonts; - char** m_font_names; - HFONT m_cur_font; - - int m_change_stamp; - char* m_typeface; - unsigned m_typeface_len; - char* m_signature; - unsigned m_height; - unsigned m_width; - int m_weight; - bool m_italic; - DWORD m_char_set; - DWORD m_pitch_and_family; - bool m_hinting; - bool m_flip_y; - - bool m_font_created; - unsigned m_resolution; - glyph_rendering m_glyph_rendering; - unsigned m_glyph_index; - unsigned m_data_size; - glyph_data_type m_data_type; - rect_i m_bounds; - double m_advance_x; - double m_advance_y; - MAT2 m_matrix; - char* m_gbuf; - KERNINGPAIR* m_kerning_pairs; - unsigned m_num_kerning_pairs; - unsigned m_max_kerning_pairs; - trans_affine m_affine; - - path_storage_integer m_path16; - path_storage_integer m_path32; - conv_curve > m_curves16; - conv_curve > m_curves32; - scanline_u8 m_scanline_aa; - scanline_bin m_scanline_bin; - scanlines_aa_type m_scanlines_aa; - scanlines_bin_type m_scanlines_bin; - rasterizer_scanline_aa<> m_rasterizer; - }; - - - - - //------------------------------------------------font_engine_win32_tt_int16 - // This class uses values of type int16 (10.6 format) for the vector cache. - // The vector cache is compact, but when rendering glyphs of height - // more that 200 there integer overflow can occur. - // - class font_engine_win32_tt_int16 : public font_engine_win32_tt_base - { - public: - typedef serialized_integer_path_adaptor path_adaptor_type; - typedef font_engine_win32_tt_base::gray8_adaptor_type gray8_adaptor_type; - typedef font_engine_win32_tt_base::mono_adaptor_type mono_adaptor_type; - typedef font_engine_win32_tt_base::scanlines_aa_type scanlines_aa_type; - typedef font_engine_win32_tt_base::scanlines_bin_type scanlines_bin_type; - - font_engine_win32_tt_int16(HDC dc, unsigned max_fonts = 32) : - font_engine_win32_tt_base(false, dc, max_fonts) {} - }; - - //------------------------------------------------font_engine_win32_tt_int32 - // This class uses values of type int32 (26.6 format) for the vector cache. - // The vector cache is twice larger than in font_engine_win32_tt_int16, - // but it allows you to render glyphs of very large sizes. - // - class font_engine_win32_tt_int32 : public font_engine_win32_tt_base - { - public: - typedef serialized_integer_path_adaptor path_adaptor_type; - typedef font_engine_win32_tt_base::gray8_adaptor_type gray8_adaptor_type; - typedef font_engine_win32_tt_base::mono_adaptor_type mono_adaptor_type; - typedef font_engine_win32_tt_base::scanlines_aa_type scanlines_aa_type; - typedef font_engine_win32_tt_base::scanlines_bin_type scanlines_bin_type; - - font_engine_win32_tt_int32(HDC dc, unsigned max_fonts = 32) : - font_engine_win32_tt_base(true, dc, max_fonts) {} - }; - - -} - -#endif -#endif diff --git a/uppdev/agg24/agg_gamma_ctrl.cpp b/uppdev/agg24/agg_gamma_ctrl.cpp deleted file mode 100644 index 6bdb1a706..000000000 --- a/uppdev/agg24/agg_gamma_ctrl.cpp +++ /dev/null @@ -1,433 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// class gamma_ctrl_impl -// -//---------------------------------------------------------------------------- - -#include -#include "agg_math.h" -#include "agg_gamma_ctrl.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - gamma_ctrl_impl::gamma_ctrl_impl(double x1, double y1, double x2, double y2, bool flip_y) : - ctrl(x1, y1, x2, y2, flip_y), - m_border_width(2.0), - m_border_extra(0.0), - m_curve_width(2.0), - m_grid_width(0.2), - m_text_thickness(1.5), - m_point_size(5.0), - m_text_height(9.0), - m_text_width(0.0), - m_xc1(x1), - m_yc1(y1), - m_xc2(x2), - m_yc2(y2 - m_text_height * 2.0), - m_xt1(x1), - m_yt1(y2 - m_text_height * 2.0), - m_xt2(x2), - m_yt2(y2), - m_curve_poly(m_gamma_spline), - m_text_poly(m_text), - m_idx(0), - m_vertex(0), - m_p1_active(true), - m_mouse_point(0), - m_pdx(0.0), - m_pdy(0.0) - { - calc_spline_box(); - } - - - //------------------------------------------------------------------------ - void gamma_ctrl_impl::calc_spline_box() - { - m_xs1 = m_xc1 + m_border_width; - m_ys1 = m_yc1 + m_border_width; - m_xs2 = m_xc2 - m_border_width; - m_ys2 = m_yc2 - m_border_width * 0.5; - } - - - //------------------------------------------------------------------------ - void gamma_ctrl_impl::calc_points() - { - double kx1, ky1, kx2, ky2; - m_gamma_spline.values(&kx1, &ky1, &kx2, &ky2); - m_xp1 = m_xs1 + (m_xs2 - m_xs1) * kx1 * 0.25; - m_yp1 = m_ys1 + (m_ys2 - m_ys1) * ky1 * 0.25; - m_xp2 = m_xs2 - (m_xs2 - m_xs1) * kx2 * 0.25; - m_yp2 = m_ys2 - (m_ys2 - m_ys1) * ky2 * 0.25; - } - - - //------------------------------------------------------------------------ - void gamma_ctrl_impl::calc_values() - { - double kx1, ky1, kx2, ky2; - - kx1 = (m_xp1 - m_xs1) * 4.0 / (m_xs2 - m_xs1); - ky1 = (m_yp1 - m_ys1) * 4.0 / (m_ys2 - m_ys1); - kx2 = (m_xs2 - m_xp2) * 4.0 / (m_xs2 - m_xs1); - ky2 = (m_ys2 - m_yp2) * 4.0 / (m_ys2 - m_ys1); - m_gamma_spline.values(kx1, ky1, kx2, ky2); - } - - - //------------------------------------------------------------------------ - void gamma_ctrl_impl::text_size(double h, double w) - { - m_text_width = w; - m_text_height = h; - m_yc2 = m_y2 - m_text_height * 2.0; - m_yt1 = m_y2 - m_text_height * 2.0; - calc_spline_box(); - } - - - //------------------------------------------------------------------------ - void gamma_ctrl_impl::border_width(double t, double extra) - { - m_border_width = t; - m_border_extra = extra; - calc_spline_box(); - } - - //------------------------------------------------------------------------ - void gamma_ctrl_impl::values(double kx1, double ky1, double kx2, double ky2) - { - m_gamma_spline.values(kx1, ky1, kx2, ky2); - } - - - //------------------------------------------------------------------------ - void gamma_ctrl_impl::values(double* kx1, double* ky1, double* kx2, double* ky2) const - { - m_gamma_spline.values(kx1, ky1, kx2, ky2); - } - - //------------------------------------------------------------------------ - void gamma_ctrl_impl::rewind(unsigned idx) - { - double kx1, ky1, kx2, ky2; - char tbuf[32]; - - m_idx = idx; - - switch(idx) - { - default: - - case 0: // Background - m_vertex = 0; - m_vx[0] = m_x1 - m_border_extra; - m_vy[0] = m_y1 - m_border_extra; - m_vx[1] = m_x2 + m_border_extra; - m_vy[1] = m_y1 - m_border_extra; - m_vx[2] = m_x2 + m_border_extra; - m_vy[2] = m_y2 + m_border_extra; - m_vx[3] = m_x1 - m_border_extra; - m_vy[3] = m_y2 + m_border_extra; - break; - - case 1: // Border - m_vertex = 0; - m_vx[0] = m_x1; - m_vy[0] = m_y1; - m_vx[1] = m_x2; - m_vy[1] = m_y1; - m_vx[2] = m_x2; - m_vy[2] = m_y2; - m_vx[3] = m_x1; - m_vy[3] = m_y2; - m_vx[4] = m_x1 + m_border_width; - m_vy[4] = m_y1 + m_border_width; - m_vx[5] = m_x1 + m_border_width; - m_vy[5] = m_y2 - m_border_width; - m_vx[6] = m_x2 - m_border_width; - m_vy[6] = m_y2 - m_border_width; - m_vx[7] = m_x2 - m_border_width; - m_vy[7] = m_y1 + m_border_width; - m_vx[8] = m_xc1 + m_border_width; - m_vy[8] = m_yc2 - m_border_width * 0.5; - m_vx[9] = m_xc2 - m_border_width; - m_vy[9] = m_yc2 - m_border_width * 0.5; - m_vx[10] = m_xc2 - m_border_width; - m_vy[10] = m_yc2 + m_border_width * 0.5; - m_vx[11] = m_xc1 + m_border_width; - m_vy[11] = m_yc2 + m_border_width * 0.5; - break; - - case 2: // Curve - m_gamma_spline.box(m_xs1, m_ys1, m_xs2, m_ys2); - m_curve_poly.width(m_curve_width); - m_curve_poly.rewind(0); - break; - - case 3: // Grid - m_vertex = 0; - m_vx[0] = m_xs1; - m_vy[0] = (m_ys1 + m_ys2) * 0.5 - m_grid_width * 0.5; - m_vx[1] = m_xs2; - m_vy[1] = (m_ys1 + m_ys2) * 0.5 - m_grid_width * 0.5; - m_vx[2] = m_xs2; - m_vy[2] = (m_ys1 + m_ys2) * 0.5 + m_grid_width * 0.5; - m_vx[3] = m_xs1; - m_vy[3] = (m_ys1 + m_ys2) * 0.5 + m_grid_width * 0.5; - m_vx[4] = (m_xs1 + m_xs2) * 0.5 - m_grid_width * 0.5; - m_vy[4] = m_ys1; - m_vx[5] = (m_xs1 + m_xs2) * 0.5 - m_grid_width * 0.5; - m_vy[5] = m_ys2; - m_vx[6] = (m_xs1 + m_xs2) * 0.5 + m_grid_width * 0.5; - m_vy[6] = m_ys2; - m_vx[7] = (m_xs1 + m_xs2) * 0.5 + m_grid_width * 0.5; - m_vy[7] = m_ys1; - calc_points(); - m_vx[8] = m_xs1; - m_vy[8] = m_yp1 - m_grid_width * 0.5; - m_vx[9] = m_xp1 - m_grid_width * 0.5; - m_vy[9] = m_yp1 - m_grid_width * 0.5; - m_vx[10] = m_xp1 - m_grid_width * 0.5; - m_vy[10] = m_ys1; - m_vx[11] = m_xp1 + m_grid_width * 0.5; - m_vy[11] = m_ys1; - m_vx[12] = m_xp1 + m_grid_width * 0.5; - m_vy[12] = m_yp1 + m_grid_width * 0.5; - m_vx[13] = m_xs1; - m_vy[13] = m_yp1 + m_grid_width * 0.5; - m_vx[14] = m_xs2; - m_vy[14] = m_yp2 + m_grid_width * 0.5; - m_vx[15] = m_xp2 + m_grid_width * 0.5; - m_vy[15] = m_yp2 + m_grid_width * 0.5; - m_vx[16] = m_xp2 + m_grid_width * 0.5; - m_vy[16] = m_ys2; - m_vx[17] = m_xp2 - m_grid_width * 0.5; - m_vy[17] = m_ys2; - m_vx[18] = m_xp2 - m_grid_width * 0.5; - m_vy[18] = m_yp2 - m_grid_width * 0.5; - m_vx[19] = m_xs2; - m_vy[19] = m_yp2 - m_grid_width * 0.5; - break; - - case 4: // Point1 - calc_points(); - if(m_p1_active) m_ellipse.init(m_xp2, m_yp2, m_point_size, m_point_size, 32); - else m_ellipse.init(m_xp1, m_yp1, m_point_size, m_point_size, 32); - break; - - case 5: // Point2 - calc_points(); - if(m_p1_active) m_ellipse.init(m_xp1, m_yp1, m_point_size, m_point_size, 32); - else m_ellipse.init(m_xp2, m_yp2, m_point_size, m_point_size, 32); - break; - - case 6: // Text - m_gamma_spline.values(&kx1, &ky1, &kx2, &ky2); - sprintf(tbuf, "%5.3f %5.3f %5.3f %5.3f", kx1, ky1, kx2, ky2); - m_text.text(tbuf); - m_text.size(m_text_height, m_text_width); - m_text.start_point(m_xt1 + m_border_width * 2.0, (m_yt1 + m_yt2) * 0.5 - m_text_height * 0.5); - m_text_poly.width(m_text_thickness); - m_text_poly.line_join(round_join); - m_text_poly.line_cap(round_cap); - m_text_poly.rewind(0); - break; - } - } - - - //------------------------------------------------------------------------ - unsigned gamma_ctrl_impl::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_line_to; - switch(m_idx) - { - case 0: - if(m_vertex == 0) cmd = path_cmd_move_to; - if(m_vertex >= 4) cmd = path_cmd_stop; - *x = m_vx[m_vertex]; - *y = m_vy[m_vertex]; - m_vertex++; - break; - - case 1: - if(m_vertex == 0 || m_vertex == 4 || m_vertex == 8) cmd = path_cmd_move_to; - if(m_vertex >= 12) cmd = path_cmd_stop; - *x = m_vx[m_vertex]; - *y = m_vy[m_vertex]; - m_vertex++; - break; - - case 2: - cmd = m_curve_poly.vertex(x, y); - break; - - case 3: - if(m_vertex == 0 || - m_vertex == 4 || - m_vertex == 8 || - m_vertex == 14) cmd = path_cmd_move_to; - - if(m_vertex >= 20) cmd = path_cmd_stop; - *x = m_vx[m_vertex]; - *y = m_vy[m_vertex]; - m_vertex++; - break; - - case 4: // Point1 - case 5: // Point2 - cmd = m_ellipse.vertex(x, y); - break; - - case 6: - cmd = m_text_poly.vertex(x, y); - break; - - default: - cmd = path_cmd_stop; - break; - } - - if(!is_stop(cmd)) - { - transform_xy(x, y); - } - - return cmd; - } - - - - //------------------------------------------------------------------------ - bool gamma_ctrl_impl::on_arrow_keys(bool left, bool right, bool down, bool up) - { - double kx1, ky1, kx2, ky2; - bool ret = false; - m_gamma_spline.values(&kx1, &ky1, &kx2, &ky2); - if(m_p1_active) - { - if(left) { kx1 -= 0.005; ret = true; } - if(right) { kx1 += 0.005; ret = true; } - if(down) { ky1 -= 0.005; ret = true; } - if(up) { ky1 += 0.005; ret = true; } - } - else - { - if(left) { kx2 += 0.005; ret = true; } - if(right) { kx2 -= 0.005; ret = true; } - if(down) { ky2 += 0.005; ret = true; } - if(up) { ky2 -= 0.005; ret = true; } - } - if(ret) - { - m_gamma_spline.values(kx1, ky1, kx2, ky2); - } - return ret; - } - - - - //------------------------------------------------------------------------ - void gamma_ctrl_impl::change_active_point() - { - m_p1_active = m_p1_active ? false : true; - } - - - - - //------------------------------------------------------------------------ - bool gamma_ctrl_impl::in_rect(double x, double y) const - { - inverse_transform_xy(&x, &y); - return x >= m_x1 && x <= m_x2 && y >= m_y1 && y <= m_y2; - } - - - //------------------------------------------------------------------------ - bool gamma_ctrl_impl::on_mouse_button_down(double x, double y) - { - inverse_transform_xy(&x, &y); - calc_points(); - - if(calc_distance(x, y, m_xp1, m_yp1) <= m_point_size + 1) - { - m_mouse_point = 1; - m_pdx = m_xp1 - x; - m_pdy = m_yp1 - y; - m_p1_active = true; - return true; - } - - if(calc_distance(x, y, m_xp2, m_yp2) <= m_point_size + 1) - { - m_mouse_point = 2; - m_pdx = m_xp2 - x; - m_pdy = m_yp2 - y; - m_p1_active = false; - return true; - } - - return false; - } - - - //------------------------------------------------------------------------ - bool gamma_ctrl_impl::on_mouse_button_up(double, double) - { - if(m_mouse_point) - { - m_mouse_point = 0; - return true; - } - return false; - } - - - //------------------------------------------------------------------------ - bool gamma_ctrl_impl::on_mouse_move(double x, double y, bool button_flag) - { - inverse_transform_xy(&x, &y); - if(!button_flag) - { - return on_mouse_button_up(x, y); - } - - if(m_mouse_point == 1) - { - m_xp1 = x + m_pdx; - m_yp1 = y + m_pdy; - calc_values(); - return true; - } - if(m_mouse_point == 2) - { - m_xp2 = x + m_pdx; - m_yp2 = y + m_pdy; - calc_values(); - return true; - } - return false; - } - - - -} - diff --git a/uppdev/agg24/agg_gamma_ctrl.h b/uppdev/agg24/agg_gamma_ctrl.h deleted file mode 100644 index 0a645a714..000000000 --- a/uppdev/agg24/agg_gamma_ctrl.h +++ /dev/null @@ -1,170 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// class gamma_ctrl -// -//---------------------------------------------------------------------------- - -#ifndef AGG_GAMMA_CTRL_INCLUDED -#define AGG_GAMMA_CTRL_INCLUDED - -#include "agg_basics.h" -#include "agg_gamma_spline.h" -#include "agg_ellipse.h" -#include "agg_conv_stroke.h" -#include "agg_gsv_text.h" -#include "agg_trans_affine.h" -#include "agg_color_rgba.h" -#include "agg_ctrl.h" - -namespace agg -{ - //------------------------------------------------------------------------ - // Class that can be used to create an interactive control to set up - // gamma arrays. - //------------------------------------------------------------------------ - class gamma_ctrl_impl : public ctrl - { - public: - gamma_ctrl_impl(double x1, double y1, double x2, double y2, bool flip_y=false); - - // Set other parameters - void border_width(double t, double extra=0.0); - void curve_width(double t) { m_curve_width = t; } - void grid_width(double t) { m_grid_width = t; } - void text_thickness(double t) { m_text_thickness = t; } - void text_size(double h, double w=0.0); - void point_size(double s) { m_point_size = s; } - - // Event handlers. Just call them if the respective events - // in your system occure. The functions return true if redrawing - // is required. - virtual bool in_rect(double x, double y) const; - virtual bool on_mouse_button_down(double x, double y); - virtual bool on_mouse_button_up(double x, double y); - virtual bool on_mouse_move(double x, double y, bool button_flag); - virtual bool on_arrow_keys(bool left, bool right, bool down, bool up); - - void change_active_point(); - - // A copy of agg::gamma_spline interface - void values(double kx1, double ky1, double kx2, double ky2); - void values(double* kx1, double* ky1, double* kx2, double* ky2) const; - const unsigned char* gamma() const { return m_gamma_spline.gamma(); } - double y(double x) const { return m_gamma_spline.y(x); } - double operator() (double x) const { return m_gamma_spline.y(x); } - const gamma_spline& get_gamma_spline() const { return m_gamma_spline; } - - // Vertex soutce interface - unsigned num_paths() { return 7; } - void rewind(unsigned idx); - unsigned vertex(double* x, double* y); - - private: - void calc_spline_box(); - void calc_points(); - void calc_values(); - - gamma_spline m_gamma_spline; - double m_border_width; - double m_border_extra; - double m_curve_width; - double m_grid_width; - double m_text_thickness; - double m_point_size; - double m_text_height; - double m_text_width; - double m_xc1; - double m_yc1; - double m_xc2; - double m_yc2; - double m_xs1; - double m_ys1; - double m_xs2; - double m_ys2; - double m_xt1; - double m_yt1; - double m_xt2; - double m_yt2; - conv_stroke m_curve_poly; - ellipse m_ellipse; - gsv_text m_text; - conv_stroke m_text_poly; - unsigned m_idx; - unsigned m_vertex; - double m_vx[32]; - double m_vy[32]; - double m_xp1; - double m_yp1; - double m_xp2; - double m_yp2; - bool m_p1_active; - unsigned m_mouse_point; - double m_pdx; - double m_pdy; - }; - - - - template class gamma_ctrl : public gamma_ctrl_impl - { - public: - gamma_ctrl(double x1, double y1, double x2, double y2, bool flip_y=false) : - gamma_ctrl_impl(x1, y1, x2, y2, flip_y), - m_background_color(rgba(1.0, 1.0, 0.9)), - m_border_color(rgba(0.0, 0.0, 0.0)), - m_curve_color(rgba(0.0, 0.0, 0.0)), - m_grid_color(rgba(0.2, 0.2, 0.0)), - m_inactive_pnt_color(rgba(0.0, 0.0, 0.0)), - m_active_pnt_color(rgba(1.0, 0.0, 0.0)), - m_text_color(rgba(0.0, 0.0, 0.0)) - { - m_colors[0] = &m_background_color; - m_colors[1] = &m_border_color; - m_colors[2] = &m_curve_color; - m_colors[3] = &m_grid_color; - m_colors[4] = &m_inactive_pnt_color; - m_colors[5] = &m_active_pnt_color; - m_colors[6] = &m_text_color; - } - - // Set colors - void background_color(const ColorT& c) { m_background_color = c; } - void border_color(const ColorT& c) { m_border_color = c; } - void curve_color(const ColorT& c) { m_curve_color = c; } - void grid_color(const ColorT& c) { m_grid_color = c; } - void inactive_pnt_color(const ColorT& c) { m_inactive_pnt_color = c; } - void active_pnt_color(const ColorT& c) { m_active_pnt_color = c; } - void text_color(const ColorT& c) { m_text_color = c; } - const ColorT& color(unsigned i) const { return *m_colors[i]; } - - private: - gamma_ctrl(const gamma_ctrl&); - const gamma_ctrl& operator = (const gamma_ctrl&); - - ColorT m_background_color; - ColorT m_border_color; - ColorT m_curve_color; - ColorT m_grid_color; - ColorT m_inactive_pnt_color; - ColorT m_active_pnt_color; - ColorT m_text_color; - ColorT* m_colors[7]; - }; - - -} - -#endif diff --git a/uppdev/agg24/agg_gamma_functions.h b/uppdev/agg24/agg_gamma_functions.h deleted file mode 100644 index 45facac00..000000000 --- a/uppdev/agg24/agg_gamma_functions.h +++ /dev/null @@ -1,123 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_GAMMA_FUNCTIONS_INCLUDED -#define AGG_GAMMA_FUNCTIONS_INCLUDED - -#include -#include "agg_basics.h" - -namespace agg -{ - //===============================================================gamma_none - struct gamma_none - { - double operator()(double x) const { return x; } - }; - - - //==============================================================gamma_power - class gamma_power - { - public: - gamma_power() : m_gamma(1.0) {} - gamma_power(double g) : m_gamma(g) {} - - void gamma(double g) { m_gamma = g; } - double gamma() const { return m_gamma; } - - double operator() (double x) const - { - return pow(x, m_gamma); - } - - private: - double m_gamma; - }; - - - //==========================================================gamma_threshold - class gamma_threshold - { - public: - gamma_threshold() : m_threshold(0.5) {} - gamma_threshold(double t) : m_threshold(t) {} - - void threshold(double t) { m_threshold = t; } - double threshold() const { return m_threshold; } - - double operator() (double x) const - { - return (x < m_threshold) ? 0.0 : 1.0; - } - - private: - double m_threshold; - }; - - - //============================================================gamma_linear - class gamma_linear - { - public: - gamma_linear() : m_start(0.0), m_end(1.0) {} - gamma_linear(double s, double e) : m_start(s), m_end(e) {} - - void set(double s, double e) { m_start = s; m_end = e; } - void start(double s) { m_start = s; } - void end(double e) { m_end = e; } - double start() const { return m_start; } - double end() const { return m_end; } - - double operator() (double x) const - { - if(x < m_start) return 0.0; - if(x > m_end) return 1.0; - return (x - m_start) / (m_end - m_start); - } - - private: - double m_start; - double m_end; - }; - - - //==========================================================gamma_multiply - class gamma_multiply - { - public: - gamma_multiply() : m_mul(1.0) {} - gamma_multiply(double v) : m_mul(v) {} - - void value(double v) { m_mul = v; } - double value() const { return m_mul; } - - double operator() (double x) const - { - double y = x * m_mul; - if(y > 1.0) y = 1.0; - return y; - } - - private: - double m_mul; - }; - -} - -#endif - - - diff --git a/uppdev/agg24/agg_gamma_lut.h b/uppdev/agg24/agg_gamma_lut.h deleted file mode 100644 index c3e8dfc13..000000000 --- a/uppdev/agg24/agg_gamma_lut.h +++ /dev/null @@ -1,121 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_GAMMA_LUT_INCLUDED -#define AGG_GAMMA_LUT_INCLUDED - -#include -#include "agg_basics.h" - -namespace agg -{ - template class gamma_lut - { - public: - typedef gamma_lut self_type; - - enum gamma_scale_e - { - gamma_shift = GammaShift, - gamma_size = 1 << gamma_shift, - gamma_mask = gamma_size - 1 - }; - - enum hi_res_scale_e - { - hi_res_shift = HiResShift, - hi_res_size = 1 << hi_res_shift, - hi_res_mask = hi_res_size - 1 - }; - - ~gamma_lut() - { - pod_allocator::deallocate(m_inv_gamma, hi_res_size); - pod_allocator::deallocate(m_dir_gamma, gamma_size); - } - - gamma_lut() : - m_gamma(1.0), - m_dir_gamma(pod_allocator::allocate(gamma_size)), - m_inv_gamma(pod_allocator::allocate(hi_res_size)) - { - unsigned i; - for(i = 0; i < gamma_size; i++) - { - m_dir_gamma[i] = HiResT(i << (hi_res_shift - gamma_shift)); - } - - for(i = 0; i < hi_res_size; i++) - { - m_inv_gamma[i] = LoResT(i >> (hi_res_shift - gamma_shift)); - } - } - - gamma_lut(double g) : - m_gamma(1.0), - m_dir_gamma(pod_allocator::allocate(gamma_size)), - m_inv_gamma(pod_allocator::allocate(hi_res_size)) - { - gamma(g); - } - - void gamma(double g) - { - m_gamma = g; - - unsigned i; - for(i = 0; i < gamma_size; i++) - { - m_dir_gamma[i] = (HiResT) - uround(pow(i / double(gamma_mask), m_gamma) * double(hi_res_mask)); - } - - double inv_g = 1.0 / g; - for(i = 0; i < hi_res_size; i++) - { - m_inv_gamma[i] = (LoResT) - uround(pow(i / double(hi_res_mask), inv_g) * double(gamma_mask)); - } - } - - double gamma() const - { - return m_gamma; - } - - HiResT dir(LoResT v) const - { - return m_dir_gamma[unsigned(v)]; - } - - LoResT inv(HiResT v) const - { - return m_inv_gamma[unsigned(v)]; - } - - private: - gamma_lut(const self_type&); - const self_type& operator = (const self_type&); - - double m_gamma; - HiResT* m_dir_gamma; - LoResT* m_inv_gamma; - }; -} - -#endif diff --git a/uppdev/agg24/agg_gamma_spline.cpp b/uppdev/agg24/agg_gamma_spline.cpp deleted file mode 100644 index b779f5597..000000000 --- a/uppdev/agg24/agg_gamma_spline.cpp +++ /dev/null @@ -1,130 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// class gamma_spline -// -//---------------------------------------------------------------------------- - -#include "agg_gamma_spline.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - gamma_spline::gamma_spline() : - m_x1(0), m_y1(0), m_x2(10), m_y2(10), m_cur_x(0.0) - { - values(1.0, 1.0, 1.0, 1.0); - } - - - //------------------------------------------------------------------------ - double gamma_spline::y(double x) const - { - if(x < 0.0) x = 0.0; - if(x > 1.0) x = 1.0; - double val = m_spline.get(x); - if(val < 0.0) val = 0.0; - if(val > 1.0) val = 1.0; - return val; - } - - - - //------------------------------------------------------------------------ - void gamma_spline::values(double kx1, double ky1, double kx2, double ky2) - { - if(kx1 < 0.001) kx1 = 0.001; - if(kx1 > 1.999) kx1 = 1.999; - if(ky1 < 0.001) ky1 = 0.001; - if(ky1 > 1.999) ky1 = 1.999; - if(kx2 < 0.001) kx2 = 0.001; - if(kx2 > 1.999) kx2 = 1.999; - if(ky2 < 0.001) ky2 = 0.001; - if(ky2 > 1.999) ky2 = 1.999; - - m_x[0] = 0.0; - m_y[0] = 0.0; - m_x[1] = kx1 * 0.25; - m_y[1] = ky1 * 0.25; - m_x[2] = 1.0 - kx2 * 0.25; - m_y[2] = 1.0 - ky2 * 0.25; - m_x[3] = 1.0; - m_y[3] = 1.0; - - m_spline.init(4, m_x, m_y); - - int i; - for(i = 0; i < 256; i++) - { - m_gamma[i] = (unsigned char)(y(double(i) / 255.0) * 255.0); - } - } - - - //------------------------------------------------------------------------ - void gamma_spline::values(double* kx1, double* ky1, double* kx2, double* ky2) const - { - *kx1 = m_x[1] * 4.0; - *ky1 = m_y[1] * 4.0; - *kx2 = (1.0 - m_x[2]) * 4.0; - *ky2 = (1.0 - m_y[2]) * 4.0; - } - - - //------------------------------------------------------------------------ - void gamma_spline::box(double x1, double y1, double x2, double y2) - { - m_x1 = x1; - m_y1 = y1; - m_x2 = x2; - m_y2 = y2; - } - - - //------------------------------------------------------------------------ - void gamma_spline::rewind(unsigned) - { - m_cur_x = 0.0; - } - - - //------------------------------------------------------------------------ - unsigned gamma_spline::vertex(double* vx, double* vy) - { - if(m_cur_x == 0.0) - { - *vx = m_x1; - *vy = m_y1; - m_cur_x += 1.0 / (m_x2 - m_x1); - return path_cmd_move_to; - } - - if(m_cur_x > 1.0) - { - return path_cmd_stop; - } - - *vx = m_x1 + m_cur_x * (m_x2 - m_x1); - *vy = m_y1 + y(m_cur_x) * (m_y2 - m_y1); - - m_cur_x += 1.0 / (m_x2 - m_x1); - return path_cmd_line_to; - } - - - -} - diff --git a/uppdev/agg24/agg_gamma_spline.h b/uppdev/agg24/agg_gamma_spline.h deleted file mode 100644 index 4f21710d9..000000000 --- a/uppdev/agg24/agg_gamma_spline.h +++ /dev/null @@ -1,95 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// class gamma_spline -// -//---------------------------------------------------------------------------- - -#ifndef AGG_GAMMA_SPLINE_INCLUDED -#define AGG_GAMMA_SPLINE_INCLUDED - -#include "agg_basics.h" -#include "agg_bspline.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - // Class-helper for calculation gamma-correction arrays. A gamma-correction - // array is an array of 256 unsigned chars that determine the actual values - // of Anti-Aliasing for each pixel coverage value from 0 to 255. If all the - // values in the array are equal to its index, i.e. 0,1,2,3,... there's - // no gamma-correction. Class agg::polyfill allows you to use custom - // gamma-correction arrays. You can calculate it using any approach, and - // class gamma_spline allows you to calculate almost any reasonable shape - // of the gamma-curve with using only 4 values - kx1, ky1, kx2, ky2. - // - // kx2 - // +----------------------------------+ - // | | | . | - // | | | . | ky2 - // | | . ------| - // | | . | - // | | . | - // |----------------.|----------------| - // | . | | - // | . | | - // |-------. | | - // ky1 | . | | | - // | . | | | - // +----------------------------------+ - // kx1 - // - // Each value can be in range [0...2]. Value 1.0 means one quarter of the - // bounding rectangle. Function values() calculates the curve by these - // 4 values. After calling it one can get the gamma-array with call gamma(). - // Class also supports the vertex source interface, i.e rewind() and - // vertex(). It's made for convinience and used in class gamma_ctrl. - // Before calling rewind/vertex one must set the bounding box - // box() using pixel coordinates. - //------------------------------------------------------------------------ - - class gamma_spline - { - public: - gamma_spline(); - - void values(double kx1, double ky1, double kx2, double ky2); - const unsigned char* gamma() const { return m_gamma; } - double y(double x) const; - void values(double* kx1, double* ky1, double* kx2, double* ky2) const; - void box(double x1, double y1, double x2, double y2); - - void rewind(unsigned); - unsigned vertex(double* x, double* y); - - private: - unsigned char m_gamma[256]; - double m_x[4]; - double m_y[4]; - bspline m_spline; - double m_x1; - double m_y1; - double m_x2; - double m_y2; - double m_cur_x; - }; - - - - -} - -#endif diff --git a/uppdev/agg24/agg_glyph_raster_bin.h b/uppdev/agg24/agg_glyph_raster_bin.h deleted file mode 100644 index b0bf858ef..000000000 --- a/uppdev/agg24/agg_glyph_raster_bin.h +++ /dev/null @@ -1,155 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_GLYPH_RASTER_BIN_INCLUDED -#define AGG_GLYPH_RASTER_BIN_INCLUDED - -#include -#include "agg_basics.h" - -namespace agg -{ - - //========================================================glyph_raster_bin - template class glyph_raster_bin - { - public: - typedef ColorT color_type; - - //-------------------------------------------------------------------- - struct glyph_rect - { - int x1,y1,x2,y2; - double dx, dy; - }; - - //-------------------------------------------------------------------- - glyph_raster_bin(const int8u* font) : - m_font(font), - m_big_endian(false) - { - int t = 1; - if(*(char*)&t == 0) m_big_endian = true; - memset(m_span, 0, sizeof(m_span)); - } - - //-------------------------------------------------------------------- - const int8u* font() const { return m_font; } - void font(const int8u* f) { m_font = f; } - - //-------------------------------------------------------------------- - double height() const { return m_font[0]; } - double base_line() const { return m_font[1]; } - - //-------------------------------------------------------------------- - template - double width(const CharT* str) const - { - unsigned start_char = m_font[2]; - unsigned num_chars = m_font[3]; - - unsigned w = 0; - while(*str) - { - unsigned glyph = *str; - const int8u* bits = m_font + 4 + num_chars * 2 + - value(m_font + 4 + (glyph - start_char) * 2); - w += *bits; - ++str; - } - return w; - } - - //-------------------------------------------------------------------- - void prepare(glyph_rect* r, double x, double y, unsigned glyph, bool flip) - { - unsigned start_char = m_font[2]; - unsigned num_chars = m_font[3]; - - m_bits = m_font + 4 + num_chars * 2 + - value(m_font + 4 + (glyph - start_char) * 2); - - m_glyph_width = *m_bits++; - m_glyph_byte_width = (m_glyph_width + 7) >> 3; - - r->x1 = int(x); - r->x2 = r->x1 + m_glyph_width - 1; - if(flip) - { - r->y1 = int(y) - m_font[0] + m_font[1]; - r->y2 = r->y1 + m_font[0] - 1; - } - else - { - r->y1 = int(y) - m_font[1] + 1; - r->y2 = r->y1 + m_font[0] - 1; - } - r->dx = m_glyph_width; - r->dy = 0; - } - - //-------------------------------------------------------------------- - const cover_type* span(unsigned i) - { - i = m_font[0] - i - 1; - const int8u* bits = m_bits + i * m_glyph_byte_width; - unsigned j; - unsigned val = *bits; - unsigned nb = 0; - for(j = 0; j < m_glyph_width; ++j) - { - m_span[j] = (cover_type)((val & 0x80) ? cover_full : cover_none); - val <<= 1; - if(++nb >= 8) - { - val = *++bits; - nb = 0; - } - } - return m_span; - } - - private: - //-------------------------------------------------------------------- - int16u value(const int8u* p) const - { - int16u v; - if(m_big_endian) - { - *(int8u*)&v = p[1]; - *((int8u*)&v + 1) = p[0]; - } - else - { - *(int8u*)&v = p[0]; - *((int8u*)&v + 1) = p[1]; - } - return v; - } - - - //-------------------------------------------------------------------- - const int8u* m_font; - bool m_big_endian; - cover_type m_span[32]; - const int8u* m_bits; - unsigned m_glyph_width; - unsigned m_glyph_byte_width; - }; - - -} - -#endif diff --git a/uppdev/agg24/agg_gradient_lut.h b/uppdev/agg24/agg_gradient_lut.h deleted file mode 100644 index 9aaa42681..000000000 --- a/uppdev/agg24/agg_gradient_lut.h +++ /dev/null @@ -1,244 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_GRADIENT_LUT_INCLUDED -#define AGG_GRADIENT_LUT_INCLUDED - -#include "agg_array.h" -#include "agg_dda_line.h" -#include "agg_color_rgba.h" -#include "agg_color_gray.h" - -namespace agg -{ - - //======================================================color_interpolator - template struct color_interpolator - { - public: - typedef ColorT color_type; - - color_interpolator(const color_type& c1, - const color_type& c2, - unsigned len) : - m_c1(c1), - m_c2(c2), - m_len(len), - m_count(0) - {} - - void operator ++ () - { - ++m_count; - } - - color_type color() const - { - return m_c1.gradient(m_c2, double(m_count) / m_len); - } - - private: - color_type m_c1; - color_type m_c2; - unsigned m_len; - unsigned m_count; - }; - - //======================================================================== - // Fast specialization for rgba8 - template<> struct color_interpolator - { - public: - typedef rgba8 color_type; - - color_interpolator(const color_type& c1, - const color_type& c2, - unsigned len) : - r(c1.r, c2.r, len), - g(c1.g, c2.g, len), - b(c1.b, c2.b, len), - a(c1.a, c2.a, len) - {} - - void operator ++ () - { - ++r; ++g; ++b; ++a; - } - - color_type color() const - { - return color_type(r.y(), g.y(), b.y(), a.y()); - } - - private: - agg::dda_line_interpolator<14> r, g, b, a; - }; - - //======================================================================== - // Fast specialization for gray8 - template<> struct color_interpolator - { - public: - typedef gray8 color_type; - - color_interpolator(const color_type& c1, - const color_type& c2, - unsigned len) : - v(c1.v, c2.v, len), - a(c1.a, c2.a, len) - {} - - void operator ++ () - { - ++v; ++a; - } - - color_type color() const - { - return color_type(v.y(), a.y()); - } - - private: - agg::dda_line_interpolator<14> v,a; - }; - - //============================================================gradient_lut - template class gradient_lut - { - public: - typedef ColorInterpolator interpolator_type; - typedef typename interpolator_type::color_type color_type; - enum { color_lut_size = ColorLutSize }; - - //-------------------------------------------------------------------- - gradient_lut() : m_color_lut(color_lut_size) {} - - // Build Gradient Lut - // First, call remove_all(), then add_color() at least twice, - // then build_lut(). Argument "offset" in add_color must be - // in range [0...1] and defines a color stop as it is described - // in SVG specification, section Gradients and Patterns. - // The simplest linear gradient is: - // gradient_lut.add_color(0.0, start_color); - // gradient_lut.add_color(1.0, end_color); - //-------------------------------------------------------------------- - void remove_all(); - void add_color(double offset, const color_type& color); - void build_lut(); - - // Size-index Interface. This class can be used directly as the - // ColorF in span_gradient. All it needs is two access methods - // size() and operator []. - //-------------------------------------------------------------------- - static unsigned size() - { - return color_lut_size; - } - const color_type& operator [] (unsigned i) const - { - return m_color_lut[i]; - } - - private: - //-------------------------------------------------------------------- - struct color_point - { - double offset; - color_type color; - - color_point() {} - color_point(double off, const color_type& c) : - offset(off), color(c) - { - if(offset < 0.0) offset = 0.0; - if(offset > 1.0) offset = 1.0; - } - }; - typedef agg::pod_bvector color_profile_type; - typedef agg::pod_array color_lut_type; - - static bool offset_less(const color_point& a, const color_point& b) - { - return a.offset < b.offset; - } - static bool offset_equal(const color_point& a, const color_point& b) - { - return a.offset == b.offset; - } - - //-------------------------------------------------------------------- - color_profile_type m_color_profile; - color_lut_type m_color_lut; - }; - - - - //------------------------------------------------------------------------ - template - void gradient_lut::remove_all() - { - m_color_profile.remove_all(); - } - - //------------------------------------------------------------------------ - template - void gradient_lut::add_color(double offset, const color_type& color) - { - m_color_profile.add(color_point(offset, color)); - } - - //------------------------------------------------------------------------ - template - void gradient_lut::build_lut() - { - quick_sort(m_color_profile, offset_less); - m_color_profile.cut_at(remove_duplicates(m_color_profile, offset_equal)); - if(m_color_profile.size() >= 2) - { - unsigned i; - unsigned start = uround(m_color_profile[0].offset * color_lut_size); - unsigned end; - color_type c = m_color_profile[0].color; - for(i = 0; i < start; i++) - { - m_color_lut[i] = c; - } - for(i = 1; i < m_color_profile.size(); i++) - { - end = uround(m_color_profile[i].offset * color_lut_size); - interpolator_type ci(m_color_profile[i-1].color, - m_color_profile[i ].color, - end - start + 1); - while(start < end) - { - m_color_lut[start] = ci.color(); - ++ci; - ++start; - } - } - c = m_color_profile.last().color; - for(; end < m_color_lut.size(); end++) - { - m_color_lut[end] = c; - } - } - } -} - - - - -#endif diff --git a/uppdev/agg24/agg_gsv_text.cpp b/uppdev/agg24/agg_gsv_text.cpp deleted file mode 100644 index ffb24eb9b..000000000 --- a/uppdev/agg24/agg_gsv_text.cpp +++ /dev/null @@ -1,675 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Class gsv_text -// -//---------------------------------------------------------------------------- -#include -#include -#include "agg_gsv_text.h" -#include "agg_bounding_rect.h" - - - -namespace agg -{ - int8u gsv_default_font[] = - { - 0x40,0x00,0x6c,0x0f,0x15,0x00,0x0e,0x00,0xf9,0xff, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x0d,0x0a,0x0d,0x0a,0x46,0x6f,0x6e,0x74,0x20,0x28, - 0x63,0x29,0x20,0x4d,0x69,0x63,0x72,0x6f,0x50,0x72, - 0x6f,0x66,0x20,0x32,0x37,0x20,0x53,0x65,0x70,0x74, - 0x65,0x6d,0x62,0x2e,0x31,0x39,0x38,0x39,0x00,0x0d, - 0x0a,0x0d,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x02,0x00,0x12,0x00,0x34,0x00,0x46,0x00,0x94,0x00, - 0xd0,0x00,0x2e,0x01,0x3e,0x01,0x64,0x01,0x8a,0x01, - 0x98,0x01,0xa2,0x01,0xb4,0x01,0xba,0x01,0xc6,0x01, - 0xcc,0x01,0xf0,0x01,0xfa,0x01,0x18,0x02,0x38,0x02, - 0x44,0x02,0x68,0x02,0x98,0x02,0xa2,0x02,0xde,0x02, - 0x0e,0x03,0x24,0x03,0x40,0x03,0x48,0x03,0x52,0x03, - 0x5a,0x03,0x82,0x03,0xec,0x03,0xfa,0x03,0x26,0x04, - 0x4c,0x04,0x6a,0x04,0x7c,0x04,0x8a,0x04,0xb6,0x04, - 0xc4,0x04,0xca,0x04,0xe0,0x04,0xee,0x04,0xf8,0x04, - 0x0a,0x05,0x18,0x05,0x44,0x05,0x5e,0x05,0x8e,0x05, - 0xac,0x05,0xd6,0x05,0xe0,0x05,0xf6,0x05,0x00,0x06, - 0x12,0x06,0x1c,0x06,0x28,0x06,0x36,0x06,0x48,0x06, - 0x4e,0x06,0x60,0x06,0x6e,0x06,0x74,0x06,0x84,0x06, - 0xa6,0x06,0xc8,0x06,0xe6,0x06,0x08,0x07,0x2c,0x07, - 0x3c,0x07,0x68,0x07,0x7c,0x07,0x8c,0x07,0xa2,0x07, - 0xb0,0x07,0xb6,0x07,0xd8,0x07,0xec,0x07,0x10,0x08, - 0x32,0x08,0x54,0x08,0x64,0x08,0x88,0x08,0x98,0x08, - 0xac,0x08,0xb6,0x08,0xc8,0x08,0xd2,0x08,0xe4,0x08, - 0xf2,0x08,0x3e,0x09,0x48,0x09,0x94,0x09,0xc2,0x09, - 0xc4,0x09,0xd0,0x09,0xe2,0x09,0x04,0x0a,0x0e,0x0a, - 0x26,0x0a,0x34,0x0a,0x4a,0x0a,0x66,0x0a,0x70,0x0a, - 0x7e,0x0a,0x8e,0x0a,0x9a,0x0a,0xa6,0x0a,0xb4,0x0a, - 0xd8,0x0a,0xe2,0x0a,0xf6,0x0a,0x18,0x0b,0x22,0x0b, - 0x32,0x0b,0x56,0x0b,0x60,0x0b,0x6e,0x0b,0x7c,0x0b, - 0x8a,0x0b,0x9c,0x0b,0x9e,0x0b,0xb2,0x0b,0xc2,0x0b, - 0xd8,0x0b,0xf4,0x0b,0x08,0x0c,0x30,0x0c,0x56,0x0c, - 0x72,0x0c,0x90,0x0c,0xb2,0x0c,0xce,0x0c,0xe2,0x0c, - 0xfe,0x0c,0x10,0x0d,0x26,0x0d,0x36,0x0d,0x42,0x0d, - 0x4e,0x0d,0x5c,0x0d,0x78,0x0d,0x8c,0x0d,0x8e,0x0d, - 0x90,0x0d,0x92,0x0d,0x94,0x0d,0x96,0x0d,0x98,0x0d, - 0x9a,0x0d,0x9c,0x0d,0x9e,0x0d,0xa0,0x0d,0xa2,0x0d, - 0xa4,0x0d,0xa6,0x0d,0xa8,0x0d,0xaa,0x0d,0xac,0x0d, - 0xae,0x0d,0xb0,0x0d,0xb2,0x0d,0xb4,0x0d,0xb6,0x0d, - 0xb8,0x0d,0xba,0x0d,0xbc,0x0d,0xbe,0x0d,0xc0,0x0d, - 0xc2,0x0d,0xc4,0x0d,0xc6,0x0d,0xc8,0x0d,0xca,0x0d, - 0xcc,0x0d,0xce,0x0d,0xd0,0x0d,0xd2,0x0d,0xd4,0x0d, - 0xd6,0x0d,0xd8,0x0d,0xda,0x0d,0xdc,0x0d,0xde,0x0d, - 0xe0,0x0d,0xe2,0x0d,0xe4,0x0d,0xe6,0x0d,0xe8,0x0d, - 0xea,0x0d,0xec,0x0d,0x0c,0x0e,0x26,0x0e,0x48,0x0e, - 0x64,0x0e,0x88,0x0e,0x92,0x0e,0xa6,0x0e,0xb4,0x0e, - 0xd0,0x0e,0xee,0x0e,0x02,0x0f,0x16,0x0f,0x26,0x0f, - 0x3c,0x0f,0x58,0x0f,0x6c,0x0f,0x6c,0x0f,0x6c,0x0f, - 0x6c,0x0f,0x6c,0x0f,0x6c,0x0f,0x6c,0x0f,0x6c,0x0f, - 0x6c,0x0f,0x6c,0x0f,0x6c,0x0f,0x6c,0x0f,0x6c,0x0f, - 0x6c,0x0f,0x6c,0x0f,0x6c,0x0f,0x6c,0x0f,0x10,0x80, - 0x05,0x95,0x00,0x72,0x00,0xfb,0xff,0x7f,0x01,0x7f, - 0x01,0x01,0xff,0x01,0x05,0xfe,0x05,0x95,0xff,0x7f, - 0x00,0x7a,0x01,0x86,0xff,0x7a,0x01,0x87,0x01,0x7f, - 0xfe,0x7a,0x0a,0x87,0xff,0x7f,0x00,0x7a,0x01,0x86, - 0xff,0x7a,0x01,0x87,0x01,0x7f,0xfe,0x7a,0x05,0xf2, - 0x0b,0x95,0xf9,0x64,0x0d,0x9c,0xf9,0x64,0xfa,0x91, - 0x0e,0x00,0xf1,0xfa,0x0e,0x00,0x04,0xfc,0x08,0x99, - 0x00,0x63,0x04,0x9d,0x00,0x63,0x04,0x96,0xff,0x7f, - 0x01,0x7f,0x01,0x01,0x00,0x01,0xfe,0x02,0xfd,0x01, - 0xfc,0x00,0xfd,0x7f,0xfe,0x7e,0x00,0x7e,0x01,0x7e, - 0x01,0x7f,0x02,0x7f,0x06,0x7e,0x02,0x7f,0x02,0x7e, - 0xf2,0x89,0x02,0x7e,0x02,0x7f,0x06,0x7e,0x02,0x7f, - 0x01,0x7f,0x01,0x7e,0x00,0x7c,0xfe,0x7e,0xfd,0x7f, - 0xfc,0x00,0xfd,0x01,0xfe,0x02,0x00,0x01,0x01,0x01, - 0x01,0x7f,0xff,0x7f,0x10,0xfd,0x15,0x95,0xee,0x6b, - 0x05,0x95,0x02,0x7e,0x00,0x7e,0xff,0x7e,0xfe,0x7f, - 0xfe,0x00,0xfe,0x02,0x00,0x02,0x01,0x02,0x02,0x01, - 0x02,0x00,0x02,0x7f,0x03,0x7f,0x03,0x00,0x03,0x01, - 0x02,0x01,0xfc,0xf2,0xfe,0x7f,0xff,0x7e,0x00,0x7e, - 0x02,0x7e,0x02,0x00,0x02,0x01,0x01,0x02,0x00,0x02, - 0xfe,0x02,0xfe,0x00,0x07,0xf9,0x15,0x8d,0xff,0x7f, - 0x01,0x7f,0x01,0x01,0x00,0x01,0xff,0x01,0xff,0x00, - 0xff,0x7f,0xff,0x7e,0xfe,0x7b,0xfe,0x7d,0xfe,0x7e, - 0xfe,0x7f,0xfd,0x00,0xfd,0x01,0xff,0x02,0x00,0x03, - 0x01,0x02,0x06,0x04,0x02,0x02,0x01,0x02,0x00,0x02, - 0xff,0x02,0xfe,0x01,0xfe,0x7f,0xff,0x7e,0x00,0x7e, - 0x01,0x7d,0x02,0x7d,0x05,0x79,0x02,0x7e,0x03,0x7f, - 0x01,0x00,0x01,0x01,0x00,0x01,0xf1,0xfe,0xfe,0x01, - 0xff,0x02,0x00,0x03,0x01,0x02,0x02,0x02,0x00,0x86, - 0x01,0x7e,0x08,0x75,0x02,0x7e,0x02,0x7f,0x05,0x80, - 0x05,0x93,0xff,0x01,0x01,0x01,0x01,0x7f,0x00,0x7e, - 0xff,0x7e,0xff,0x7f,0x06,0xf1,0x0b,0x99,0xfe,0x7e, - 0xfe,0x7d,0xfe,0x7c,0xff,0x7b,0x00,0x7c,0x01,0x7b, - 0x02,0x7c,0x02,0x7d,0x02,0x7e,0xfe,0x9e,0xfe,0x7c, - 0xff,0x7d,0xff,0x7b,0x00,0x7c,0x01,0x7b,0x01,0x7d, - 0x02,0x7c,0x05,0x85,0x03,0x99,0x02,0x7e,0x02,0x7d, - 0x02,0x7c,0x01,0x7b,0x00,0x7c,0xff,0x7b,0xfe,0x7c, - 0xfe,0x7d,0xfe,0x7e,0x02,0x9e,0x02,0x7c,0x01,0x7d, - 0x01,0x7b,0x00,0x7c,0xff,0x7b,0xff,0x7d,0xfe,0x7c, - 0x09,0x85,0x08,0x95,0x00,0x74,0xfb,0x89,0x0a,0x7a, - 0x00,0x86,0xf6,0x7a,0x0d,0xf4,0x0d,0x92,0x00,0x6e, - 0xf7,0x89,0x12,0x00,0x04,0xf7,0x06,0x81,0xff,0x7f, - 0xff,0x01,0x01,0x01,0x01,0x7f,0x00,0x7e,0xff,0x7e, - 0xff,0x7f,0x06,0x84,0x04,0x89,0x12,0x00,0x04,0xf7, - 0x05,0x82,0xff,0x7f,0x01,0x7f,0x01,0x01,0xff,0x01, - 0x05,0xfe,0x00,0xfd,0x0e,0x18,0x00,0xeb,0x09,0x95, - 0xfd,0x7f,0xfe,0x7d,0xff,0x7b,0x00,0x7d,0x01,0x7b, - 0x02,0x7d,0x03,0x7f,0x02,0x00,0x03,0x01,0x02,0x03, - 0x01,0x05,0x00,0x03,0xff,0x05,0xfe,0x03,0xfd,0x01, - 0xfe,0x00,0x0b,0xeb,0x06,0x91,0x02,0x01,0x03,0x03, - 0x00,0x6b,0x09,0x80,0x04,0x90,0x00,0x01,0x01,0x02, - 0x01,0x01,0x02,0x01,0x04,0x00,0x02,0x7f,0x01,0x7f, - 0x01,0x7e,0x00,0x7e,0xff,0x7e,0xfe,0x7d,0xf6,0x76, - 0x0e,0x00,0x03,0x80,0x05,0x95,0x0b,0x00,0xfa,0x78, - 0x03,0x00,0x02,0x7f,0x01,0x7f,0x01,0x7d,0x00,0x7e, - 0xff,0x7d,0xfe,0x7e,0xfd,0x7f,0xfd,0x00,0xfd,0x01, - 0xff,0x01,0xff,0x02,0x11,0xfc,0x0d,0x95,0xf6,0x72, - 0x0f,0x00,0xfb,0x8e,0x00,0x6b,0x07,0x80,0x0f,0x95, - 0xf6,0x00,0xff,0x77,0x01,0x01,0x03,0x01,0x03,0x00, - 0x03,0x7f,0x02,0x7e,0x01,0x7d,0x00,0x7e,0xff,0x7d, - 0xfe,0x7e,0xfd,0x7f,0xfd,0x00,0xfd,0x01,0xff,0x01, - 0xff,0x02,0x11,0xfc,0x10,0x92,0xff,0x02,0xfd,0x01, - 0xfe,0x00,0xfd,0x7f,0xfe,0x7d,0xff,0x7b,0x00,0x7b, - 0x01,0x7c,0x02,0x7e,0x03,0x7f,0x01,0x00,0x03,0x01, - 0x02,0x02,0x01,0x03,0x00,0x01,0xff,0x03,0xfe,0x02, - 0xfd,0x01,0xff,0x00,0xfd,0x7f,0xfe,0x7e,0xff,0x7d, - 0x10,0xf9,0x11,0x95,0xf6,0x6b,0xfc,0x95,0x0e,0x00, - 0x03,0xeb,0x08,0x95,0xfd,0x7f,0xff,0x7e,0x00,0x7e, - 0x01,0x7e,0x02,0x7f,0x04,0x7f,0x03,0x7f,0x02,0x7e, - 0x01,0x7e,0x00,0x7d,0xff,0x7e,0xff,0x7f,0xfd,0x7f, - 0xfc,0x00,0xfd,0x01,0xff,0x01,0xff,0x02,0x00,0x03, - 0x01,0x02,0x02,0x02,0x03,0x01,0x04,0x01,0x02,0x01, - 0x01,0x02,0x00,0x02,0xff,0x02,0xfd,0x01,0xfc,0x00, - 0x0c,0xeb,0x10,0x8e,0xff,0x7d,0xfe,0x7e,0xfd,0x7f, - 0xff,0x00,0xfd,0x01,0xfe,0x02,0xff,0x03,0x00,0x01, - 0x01,0x03,0x02,0x02,0x03,0x01,0x01,0x00,0x03,0x7f, - 0x02,0x7e,0x01,0x7c,0x00,0x7b,0xff,0x7b,0xfe,0x7d, - 0xfd,0x7f,0xfe,0x00,0xfd,0x01,0xff,0x02,0x10,0xfd, - 0x05,0x8e,0xff,0x7f,0x01,0x7f,0x01,0x01,0xff,0x01, - 0x00,0xf4,0xff,0x7f,0x01,0x7f,0x01,0x01,0xff,0x01, - 0x05,0xfe,0x05,0x8e,0xff,0x7f,0x01,0x7f,0x01,0x01, - 0xff,0x01,0x01,0xf3,0xff,0x7f,0xff,0x01,0x01,0x01, - 0x01,0x7f,0x00,0x7e,0xff,0x7e,0xff,0x7f,0x06,0x84, - 0x14,0x92,0xf0,0x77,0x10,0x77,0x04,0x80,0x04,0x8c, - 0x12,0x00,0xee,0xfa,0x12,0x00,0x04,0xfa,0x04,0x92, - 0x10,0x77,0xf0,0x77,0x14,0x80,0x03,0x90,0x00,0x01, - 0x01,0x02,0x01,0x01,0x02,0x01,0x04,0x00,0x02,0x7f, - 0x01,0x7f,0x01,0x7e,0x00,0x7e,0xff,0x7e,0xff,0x7f, - 0xfc,0x7e,0x00,0x7d,0x00,0xfb,0xff,0x7f,0x01,0x7f, - 0x01,0x01,0xff,0x01,0x09,0xfe,0x12,0x8d,0xff,0x02, - 0xfe,0x01,0xfd,0x00,0xfe,0x7f,0xff,0x7f,0xff,0x7d, - 0x00,0x7d,0x01,0x7e,0x02,0x7f,0x03,0x00,0x02,0x01, - 0x01,0x02,0xfb,0x88,0xfe,0x7e,0xff,0x7d,0x00,0x7d, - 0x01,0x7e,0x01,0x7f,0x07,0x8b,0xff,0x78,0x00,0x7e, - 0x02,0x7f,0x02,0x00,0x02,0x02,0x01,0x03,0x00,0x02, - 0xff,0x03,0xff,0x02,0xfe,0x02,0xfe,0x01,0xfd,0x01, - 0xfd,0x00,0xfd,0x7f,0xfe,0x7f,0xfe,0x7e,0xff,0x7e, - 0xff,0x7d,0x00,0x7d,0x01,0x7d,0x01,0x7e,0x02,0x7e, - 0x02,0x7f,0x03,0x7f,0x03,0x00,0x03,0x01,0x02,0x01, - 0x01,0x01,0xfe,0x8d,0xff,0x78,0x00,0x7e,0x01,0x7f, - 0x08,0xfb,0x09,0x95,0xf8,0x6b,0x08,0x95,0x08,0x6b, - 0xf3,0x87,0x0a,0x00,0x04,0xf9,0x04,0x95,0x00,0x6b, - 0x00,0x95,0x09,0x00,0x03,0x7f,0x01,0x7f,0x01,0x7e, - 0x00,0x7e,0xff,0x7e,0xff,0x7f,0xfd,0x7f,0xf7,0x80, - 0x09,0x00,0x03,0x7f,0x01,0x7f,0x01,0x7e,0x00,0x7d, - 0xff,0x7e,0xff,0x7f,0xfd,0x7f,0xf7,0x00,0x11,0x80, - 0x12,0x90,0xff,0x02,0xfe,0x02,0xfe,0x01,0xfc,0x00, - 0xfe,0x7f,0xfe,0x7e,0xff,0x7e,0xff,0x7d,0x00,0x7b, - 0x01,0x7d,0x01,0x7e,0x02,0x7e,0x02,0x7f,0x04,0x00, - 0x02,0x01,0x02,0x02,0x01,0x02,0x03,0xfb,0x04,0x95, - 0x00,0x6b,0x00,0x95,0x07,0x00,0x03,0x7f,0x02,0x7e, - 0x01,0x7e,0x01,0x7d,0x00,0x7b,0xff,0x7d,0xff,0x7e, - 0xfe,0x7e,0xfd,0x7f,0xf9,0x00,0x11,0x80,0x04,0x95, - 0x00,0x6b,0x00,0x95,0x0d,0x00,0xf3,0xf6,0x08,0x00, - 0xf8,0xf5,0x0d,0x00,0x02,0x80,0x04,0x95,0x00,0x6b, - 0x00,0x95,0x0d,0x00,0xf3,0xf6,0x08,0x00,0x06,0xf5, - 0x12,0x90,0xff,0x02,0xfe,0x02,0xfe,0x01,0xfc,0x00, - 0xfe,0x7f,0xfe,0x7e,0xff,0x7e,0xff,0x7d,0x00,0x7b, - 0x01,0x7d,0x01,0x7e,0x02,0x7e,0x02,0x7f,0x04,0x00, - 0x02,0x01,0x02,0x02,0x01,0x02,0x00,0x03,0xfb,0x80, - 0x05,0x00,0x03,0xf8,0x04,0x95,0x00,0x6b,0x0e,0x95, - 0x00,0x6b,0xf2,0x8b,0x0e,0x00,0x04,0xf5,0x04,0x95, - 0x00,0x6b,0x04,0x80,0x0c,0x95,0x00,0x70,0xff,0x7d, - 0xff,0x7f,0xfe,0x7f,0xfe,0x00,0xfe,0x01,0xff,0x01, - 0xff,0x03,0x00,0x02,0x0e,0xf9,0x04,0x95,0x00,0x6b, - 0x0e,0x95,0xf2,0x72,0x05,0x85,0x09,0x74,0x03,0x80, - 0x04,0x95,0x00,0x6b,0x00,0x80,0x0c,0x00,0x01,0x80, - 0x04,0x95,0x00,0x6b,0x00,0x95,0x08,0x6b,0x08,0x95, - 0xf8,0x6b,0x08,0x95,0x00,0x6b,0x04,0x80,0x04,0x95, - 0x00,0x6b,0x00,0x95,0x0e,0x6b,0x00,0x95,0x00,0x6b, - 0x04,0x80,0x09,0x95,0xfe,0x7f,0xfe,0x7e,0xff,0x7e, - 0xff,0x7d,0x00,0x7b,0x01,0x7d,0x01,0x7e,0x02,0x7e, - 0x02,0x7f,0x04,0x00,0x02,0x01,0x02,0x02,0x01,0x02, - 0x01,0x03,0x00,0x05,0xff,0x03,0xff,0x02,0xfe,0x02, - 0xfe,0x01,0xfc,0x00,0x0d,0xeb,0x04,0x95,0x00,0x6b, - 0x00,0x95,0x09,0x00,0x03,0x7f,0x01,0x7f,0x01,0x7e, - 0x00,0x7d,0xff,0x7e,0xff,0x7f,0xfd,0x7f,0xf7,0x00, - 0x11,0xf6,0x09,0x95,0xfe,0x7f,0xfe,0x7e,0xff,0x7e, - 0xff,0x7d,0x00,0x7b,0x01,0x7d,0x01,0x7e,0x02,0x7e, - 0x02,0x7f,0x04,0x00,0x02,0x01,0x02,0x02,0x01,0x02, - 0x01,0x03,0x00,0x05,0xff,0x03,0xff,0x02,0xfe,0x02, - 0xfe,0x01,0xfc,0x00,0x03,0xef,0x06,0x7a,0x04,0x82, - 0x04,0x95,0x00,0x6b,0x00,0x95,0x09,0x00,0x03,0x7f, - 0x01,0x7f,0x01,0x7e,0x00,0x7e,0xff,0x7e,0xff,0x7f, - 0xfd,0x7f,0xf7,0x00,0x07,0x80,0x07,0x75,0x03,0x80, - 0x11,0x92,0xfe,0x02,0xfd,0x01,0xfc,0x00,0xfd,0x7f, - 0xfe,0x7e,0x00,0x7e,0x01,0x7e,0x01,0x7f,0x02,0x7f, - 0x06,0x7e,0x02,0x7f,0x01,0x7f,0x01,0x7e,0x00,0x7d, - 0xfe,0x7e,0xfd,0x7f,0xfc,0x00,0xfd,0x01,0xfe,0x02, - 0x11,0xfd,0x08,0x95,0x00,0x6b,0xf9,0x95,0x0e,0x00, - 0x01,0xeb,0x04,0x95,0x00,0x71,0x01,0x7d,0x02,0x7e, - 0x03,0x7f,0x02,0x00,0x03,0x01,0x02,0x02,0x01,0x03, - 0x00,0x0f,0x04,0xeb,0x01,0x95,0x08,0x6b,0x08,0x95, - 0xf8,0x6b,0x09,0x80,0x02,0x95,0x05,0x6b,0x05,0x95, - 0xfb,0x6b,0x05,0x95,0x05,0x6b,0x05,0x95,0xfb,0x6b, - 0x07,0x80,0x03,0x95,0x0e,0x6b,0x00,0x95,0xf2,0x6b, - 0x11,0x80,0x01,0x95,0x08,0x76,0x00,0x75,0x08,0x95, - 0xf8,0x76,0x09,0xf5,0x11,0x95,0xf2,0x6b,0x00,0x95, - 0x0e,0x00,0xf2,0xeb,0x0e,0x00,0x03,0x80,0x03,0x93, - 0x00,0x6c,0x01,0x94,0x00,0x6c,0xff,0x94,0x05,0x00, - 0xfb,0xec,0x05,0x00,0x02,0x81,0x00,0x95,0x0e,0x68, - 0x00,0x83,0x06,0x93,0x00,0x6c,0x01,0x94,0x00,0x6c, - 0xfb,0x94,0x05,0x00,0xfb,0xec,0x05,0x00,0x03,0x81, - 0x03,0x87,0x08,0x05,0x08,0x7b,0xf0,0x80,0x08,0x04, - 0x08,0x7c,0x03,0xf9,0x01,0x80,0x10,0x00,0x01,0x80, - 0x06,0x95,0xff,0x7f,0xff,0x7e,0x00,0x7e,0x01,0x7f, - 0x01,0x01,0xff,0x01,0x05,0xef,0x0f,0x8e,0x00,0x72, - 0x00,0x8b,0xfe,0x02,0xfe,0x01,0xfd,0x00,0xfe,0x7f, - 0xfe,0x7e,0xff,0x7d,0x00,0x7e,0x01,0x7d,0x02,0x7e, - 0x02,0x7f,0x03,0x00,0x02,0x01,0x02,0x02,0x04,0xfd, - 0x04,0x95,0x00,0x6b,0x00,0x8b,0x02,0x02,0x02,0x01, - 0x03,0x00,0x02,0x7f,0x02,0x7e,0x01,0x7d,0x00,0x7e, - 0xff,0x7d,0xfe,0x7e,0xfe,0x7f,0xfd,0x00,0xfe,0x01, - 0xfe,0x02,0x0f,0xfd,0x0f,0x8b,0xfe,0x02,0xfe,0x01, - 0xfd,0x00,0xfe,0x7f,0xfe,0x7e,0xff,0x7d,0x00,0x7e, - 0x01,0x7d,0x02,0x7e,0x02,0x7f,0x03,0x00,0x02,0x01, - 0x02,0x02,0x03,0xfd,0x0f,0x95,0x00,0x6b,0x00,0x8b, - 0xfe,0x02,0xfe,0x01,0xfd,0x00,0xfe,0x7f,0xfe,0x7e, - 0xff,0x7d,0x00,0x7e,0x01,0x7d,0x02,0x7e,0x02,0x7f, - 0x03,0x00,0x02,0x01,0x02,0x02,0x04,0xfd,0x03,0x88, - 0x0c,0x00,0x00,0x02,0xff,0x02,0xff,0x01,0xfe,0x01, - 0xfd,0x00,0xfe,0x7f,0xfe,0x7e,0xff,0x7d,0x00,0x7e, - 0x01,0x7d,0x02,0x7e,0x02,0x7f,0x03,0x00,0x02,0x01, - 0x02,0x02,0x03,0xfd,0x0a,0x95,0xfe,0x00,0xfe,0x7f, - 0xff,0x7d,0x00,0x6f,0xfd,0x8e,0x07,0x00,0x03,0xf2, - 0x0f,0x8e,0x00,0x70,0xff,0x7d,0xff,0x7f,0xfe,0x7f, - 0xfd,0x00,0xfe,0x01,0x09,0x91,0xfe,0x02,0xfe,0x01, - 0xfd,0x00,0xfe,0x7f,0xfe,0x7e,0xff,0x7d,0x00,0x7e, - 0x01,0x7d,0x02,0x7e,0x02,0x7f,0x03,0x00,0x02,0x01, - 0x02,0x02,0x04,0xfd,0x04,0x95,0x00,0x6b,0x00,0x8a, - 0x03,0x03,0x02,0x01,0x03,0x00,0x02,0x7f,0x01,0x7d, - 0x00,0x76,0x04,0x80,0x03,0x95,0x01,0x7f,0x01,0x01, - 0xff,0x01,0xff,0x7f,0x01,0xf9,0x00,0x72,0x04,0x80, - 0x05,0x95,0x01,0x7f,0x01,0x01,0xff,0x01,0xff,0x7f, - 0x01,0xf9,0x00,0x6f,0xff,0x7d,0xfe,0x7f,0xfe,0x00, - 0x09,0x87,0x04,0x95,0x00,0x6b,0x0a,0x8e,0xf6,0x76, - 0x04,0x84,0x07,0x78,0x02,0x80,0x04,0x95,0x00,0x6b, - 0x04,0x80,0x04,0x8e,0x00,0x72,0x00,0x8a,0x03,0x03, - 0x02,0x01,0x03,0x00,0x02,0x7f,0x01,0x7d,0x00,0x76, - 0x00,0x8a,0x03,0x03,0x02,0x01,0x03,0x00,0x02,0x7f, - 0x01,0x7d,0x00,0x76,0x04,0x80,0x04,0x8e,0x00,0x72, - 0x00,0x8a,0x03,0x03,0x02,0x01,0x03,0x00,0x02,0x7f, - 0x01,0x7d,0x00,0x76,0x04,0x80,0x08,0x8e,0xfe,0x7f, - 0xfe,0x7e,0xff,0x7d,0x00,0x7e,0x01,0x7d,0x02,0x7e, - 0x02,0x7f,0x03,0x00,0x02,0x01,0x02,0x02,0x01,0x03, - 0x00,0x02,0xff,0x03,0xfe,0x02,0xfe,0x01,0xfd,0x00, - 0x0b,0xf2,0x04,0x8e,0x00,0x6b,0x00,0x92,0x02,0x02, - 0x02,0x01,0x03,0x00,0x02,0x7f,0x02,0x7e,0x01,0x7d, - 0x00,0x7e,0xff,0x7d,0xfe,0x7e,0xfe,0x7f,0xfd,0x00, - 0xfe,0x01,0xfe,0x02,0x0f,0xfd,0x0f,0x8e,0x00,0x6b, - 0x00,0x92,0xfe,0x02,0xfe,0x01,0xfd,0x00,0xfe,0x7f, - 0xfe,0x7e,0xff,0x7d,0x00,0x7e,0x01,0x7d,0x02,0x7e, - 0x02,0x7f,0x03,0x00,0x02,0x01,0x02,0x02,0x04,0xfd, - 0x04,0x8e,0x00,0x72,0x00,0x88,0x01,0x03,0x02,0x02, - 0x02,0x01,0x03,0x00,0x01,0xf2,0x0e,0x8b,0xff,0x02, - 0xfd,0x01,0xfd,0x00,0xfd,0x7f,0xff,0x7e,0x01,0x7e, - 0x02,0x7f,0x05,0x7f,0x02,0x7f,0x01,0x7e,0x00,0x7f, - 0xff,0x7e,0xfd,0x7f,0xfd,0x00,0xfd,0x01,0xff,0x02, - 0x0e,0xfd,0x05,0x95,0x00,0x6f,0x01,0x7d,0x02,0x7f, - 0x02,0x00,0xf8,0x8e,0x07,0x00,0x03,0xf2,0x04,0x8e, - 0x00,0x76,0x01,0x7d,0x02,0x7f,0x03,0x00,0x02,0x01, - 0x03,0x03,0x00,0x8a,0x00,0x72,0x04,0x80,0x02,0x8e, - 0x06,0x72,0x06,0x8e,0xfa,0x72,0x08,0x80,0x03,0x8e, - 0x04,0x72,0x04,0x8e,0xfc,0x72,0x04,0x8e,0x04,0x72, - 0x04,0x8e,0xfc,0x72,0x07,0x80,0x03,0x8e,0x0b,0x72, - 0x00,0x8e,0xf5,0x72,0x0e,0x80,0x02,0x8e,0x06,0x72, - 0x06,0x8e,0xfa,0x72,0xfe,0x7c,0xfe,0x7e,0xfe,0x7f, - 0xff,0x00,0x0f,0x87,0x0e,0x8e,0xf5,0x72,0x00,0x8e, - 0x0b,0x00,0xf5,0xf2,0x0b,0x00,0x03,0x80,0x09,0x99, - 0xfe,0x7f,0xff,0x7f,0xff,0x7e,0x00,0x7e,0x01,0x7e, - 0x01,0x7f,0x01,0x7e,0x00,0x7e,0xfe,0x7e,0x01,0x8e, - 0xff,0x7e,0x00,0x7e,0x01,0x7e,0x01,0x7f,0x01,0x7e, - 0x00,0x7e,0xff,0x7e,0xfc,0x7e,0x04,0x7e,0x01,0x7e, - 0x00,0x7e,0xff,0x7e,0xff,0x7f,0xff,0x7e,0x00,0x7e, - 0x01,0x7e,0xff,0x8e,0x02,0x7e,0x00,0x7e,0xff,0x7e, - 0xff,0x7f,0xff,0x7e,0x00,0x7e,0x01,0x7e,0x01,0x7f, - 0x02,0x7f,0x05,0x87,0x04,0x95,0x00,0x77,0x00,0xfd, - 0x00,0x77,0x04,0x80,0x05,0x99,0x02,0x7f,0x01,0x7f, - 0x01,0x7e,0x00,0x7e,0xff,0x7e,0xff,0x7f,0xff,0x7e, - 0x00,0x7e,0x02,0x7e,0xff,0x8e,0x01,0x7e,0x00,0x7e, - 0xff,0x7e,0xff,0x7f,0xff,0x7e,0x00,0x7e,0x01,0x7e, - 0x04,0x7e,0xfc,0x7e,0xff,0x7e,0x00,0x7e,0x01,0x7e, - 0x01,0x7f,0x01,0x7e,0x00,0x7e,0xff,0x7e,0x01,0x8e, - 0xfe,0x7e,0x00,0x7e,0x01,0x7e,0x01,0x7f,0x01,0x7e, - 0x00,0x7e,0xff,0x7e,0xff,0x7f,0xfe,0x7f,0x09,0x87, - 0x03,0x86,0x00,0x02,0x01,0x03,0x02,0x01,0x02,0x00, - 0x02,0x7f,0x04,0x7d,0x02,0x7f,0x02,0x00,0x02,0x01, - 0x01,0x02,0xee,0xfe,0x01,0x02,0x02,0x01,0x02,0x00, - 0x02,0x7f,0x04,0x7d,0x02,0x7f,0x02,0x00,0x02,0x01, - 0x01,0x03,0x00,0x02,0x03,0xf4,0x10,0x80,0x03,0x80, - 0x07,0x15,0x08,0x6b,0xfe,0x85,0xf5,0x00,0x10,0xfb, - 0x0d,0x95,0xf6,0x00,0x00,0x6b,0x0a,0x00,0x02,0x02, - 0x00,0x08,0xfe,0x02,0xf6,0x00,0x0e,0xf4,0x03,0x80, - 0x00,0x15,0x0a,0x00,0x02,0x7e,0x00,0x7e,0x00,0x7d, - 0x00,0x7e,0xfe,0x7f,0xf6,0x00,0x0a,0x80,0x02,0x7e, - 0x01,0x7e,0x00,0x7d,0xff,0x7d,0xfe,0x7f,0xf6,0x00, - 0x10,0x80,0x03,0x80,0x00,0x15,0x0c,0x00,0xff,0x7e, - 0x03,0xed,0x03,0xfd,0x00,0x03,0x02,0x00,0x00,0x12, - 0x02,0x03,0x0a,0x00,0x00,0x6b,0x02,0x00,0x00,0x7d, - 0xfe,0x83,0xf4,0x00,0x11,0x80,0x0f,0x80,0xf4,0x00, - 0x00,0x15,0x0c,0x00,0xff,0xf6,0xf5,0x00,0x0f,0xf5, - 0x04,0x95,0x07,0x76,0x00,0x0a,0x07,0x80,0xf9,0x76, - 0x00,0x75,0xf8,0x80,0x07,0x0c,0x09,0xf4,0xf9,0x0c, - 0x09,0xf4,0x03,0x92,0x02,0x03,0x07,0x00,0x03,0x7d, - 0x00,0x7b,0xfc,0x7e,0x04,0x7d,0x00,0x7a,0xfd,0x7e, - 0xf9,0x00,0xfe,0x02,0x06,0x89,0x02,0x00,0x06,0xf5, - 0x03,0x95,0x00,0x6b,0x0c,0x15,0x00,0x6b,0x02,0x80, - 0x03,0x95,0x00,0x6b,0x0c,0x15,0x00,0x6b,0xf8,0x96, - 0x03,0x00,0x07,0xea,0x03,0x80,0x00,0x15,0x0c,0x80, - 0xf7,0x76,0xfd,0x00,0x03,0x80,0x0a,0x75,0x03,0x80, - 0x03,0x80,0x07,0x13,0x02,0x02,0x03,0x00,0x00,0x6b, - 0x02,0x80,0x03,0x80,0x00,0x15,0x09,0x6b,0x09,0x15, - 0x00,0x6b,0x03,0x80,0x03,0x80,0x00,0x15,0x00,0xf6, - 0x0d,0x00,0x00,0x8a,0x00,0x6b,0x03,0x80,0x07,0x80, - 0xfd,0x00,0xff,0x03,0x00,0x04,0x00,0x07,0x00,0x04, - 0x01,0x02,0x03,0x01,0x06,0x00,0x03,0x7f,0x01,0x7e, - 0x01,0x7c,0x00,0x79,0xff,0x7c,0xff,0x7d,0xfd,0x00, - 0xfa,0x00,0x0e,0x80,0x03,0x80,0x00,0x15,0x0c,0x00, - 0x00,0x6b,0x02,0x80,0x03,0x80,0x00,0x15,0x0a,0x00, - 0x02,0x7f,0x01,0x7d,0x00,0x7b,0xff,0x7e,0xfe,0x7f, - 0xf6,0x00,0x10,0xf7,0x11,0x8f,0xff,0x03,0xff,0x02, - 0xfe,0x01,0xfa,0x00,0xfd,0x7f,0xff,0x7e,0x00,0x7c, - 0x00,0x79,0x00,0x7b,0x01,0x7e,0x03,0x00,0x06,0x00, - 0x02,0x00,0x01,0x03,0x01,0x02,0x03,0xfb,0x03,0x95, - 0x0c,0x00,0xfa,0x80,0x00,0x6b,0x09,0x80,0x03,0x95, - 0x00,0x77,0x06,0x7a,0x06,0x06,0x00,0x09,0xfa,0xf1, - 0xfa,0x7a,0x0e,0x80,0x03,0x87,0x00,0x0b,0x02,0x02, - 0x03,0x00,0x02,0x7e,0x01,0x02,0x04,0x00,0x02,0x7e, - 0x00,0x75,0xfe,0x7e,0xfc,0x00,0xff,0x01,0xfe,0x7f, - 0xfd,0x00,0xfe,0x02,0x07,0x8e,0x00,0x6b,0x09,0x80, - 0x03,0x80,0x0e,0x15,0xf2,0x80,0x0e,0x6b,0x03,0x80, - 0x03,0x95,0x00,0x6b,0x0e,0x00,0x00,0x7d,0xfe,0x98, - 0x00,0x6b,0x05,0x80,0x03,0x95,0x00,0x75,0x02,0x7d, - 0x0a,0x00,0x00,0x8e,0x00,0x6b,0x02,0x80,0x03,0x95, - 0x00,0x6b,0x10,0x00,0x00,0x15,0xf8,0x80,0x00,0x6b, - 0x0a,0x80,0x03,0x95,0x00,0x6b,0x10,0x00,0x00,0x15, - 0xf8,0x80,0x00,0x6b,0x0a,0x00,0x00,0x7d,0x02,0x83, - 0x10,0x80,0x03,0x95,0x00,0x6b,0x09,0x00,0x03,0x02, - 0x00,0x08,0xfd,0x02,0xf7,0x00,0x0e,0x89,0x00,0x6b, - 0x03,0x80,0x03,0x95,0x00,0x6b,0x09,0x00,0x03,0x02, - 0x00,0x08,0xfd,0x02,0xf7,0x00,0x0e,0xf4,0x03,0x92, - 0x02,0x03,0x07,0x00,0x03,0x7d,0x00,0x70,0xfd,0x7e, - 0xf9,0x00,0xfe,0x02,0x03,0x89,0x09,0x00,0x02,0xf5, - 0x03,0x80,0x00,0x15,0x00,0xf5,0x07,0x00,0x00,0x08, - 0x02,0x03,0x06,0x00,0x02,0x7d,0x00,0x70,0xfe,0x7e, - 0xfa,0x00,0xfe,0x02,0x00,0x08,0x0c,0xf6,0x0f,0x80, - 0x00,0x15,0xf6,0x00,0xfe,0x7d,0x00,0x79,0x02,0x7e, - 0x0a,0x00,0xf4,0xf7,0x07,0x09,0x07,0xf7,0x03,0x8c, - 0x01,0x02,0x01,0x01,0x05,0x00,0x02,0x7f,0x01,0x7e, - 0x00,0x74,0x00,0x86,0xff,0x01,0xfe,0x01,0xfb,0x00, - 0xff,0x7f,0xff,0x7f,0x00,0x7c,0x01,0x7e,0x01,0x00, - 0x05,0x00,0x02,0x00,0x01,0x02,0x03,0xfe,0x04,0x8e, - 0x02,0x01,0x04,0x00,0x02,0x7f,0x01,0x7e,0x00,0x77, - 0xff,0x7e,0xfe,0x7f,0xfc,0x00,0xfe,0x01,0xff,0x02, - 0x00,0x09,0x01,0x02,0x02,0x02,0x03,0x01,0x02,0x01, - 0x01,0x01,0x01,0x02,0x02,0xeb,0x03,0x80,0x00,0x15, - 0x03,0x00,0x02,0x7e,0x00,0x7b,0xfe,0x7e,0xfd,0x00, - 0x03,0x80,0x04,0x00,0x03,0x7e,0x00,0x78,0xfd,0x7e, - 0xf9,0x00,0x0c,0x80,0x03,0x8c,0x02,0x02,0x02,0x01, - 0x03,0x00,0x02,0x7f,0x01,0x7d,0xfe,0x7e,0xf9,0x7d, - 0xff,0x7e,0x00,0x7d,0x03,0x7f,0x02,0x00,0x03,0x01, - 0x02,0x01,0x02,0xfe,0x0d,0x8c,0xff,0x02,0xfe,0x01, - 0xfc,0x00,0xfe,0x7f,0xff,0x7e,0x00,0x77,0x01,0x7e, - 0x02,0x7f,0x04,0x00,0x02,0x01,0x01,0x02,0x00,0x0f, - 0xff,0x02,0xfe,0x01,0xf9,0x00,0x0c,0xeb,0x03,0x88, - 0x0a,0x00,0x00,0x02,0x00,0x03,0xfe,0x02,0xfa,0x00, - 0xff,0x7e,0xff,0x7d,0x00,0x7b,0x01,0x7c,0x01,0x7f, - 0x06,0x00,0x02,0x02,0x03,0xfe,0x03,0x8f,0x06,0x77, - 0x06,0x09,0xfa,0x80,0x00,0x71,0xff,0x87,0xfb,0x79, - 0x07,0x87,0x05,0x79,0x02,0x80,0x03,0x8d,0x02,0x02, - 0x06,0x00,0x02,0x7e,0x00,0x7d,0xfc,0x7d,0x04,0x7e, - 0x00,0x7d,0xfe,0x7e,0xfa,0x00,0xfe,0x02,0x04,0x85, - 0x02,0x00,0x06,0xf9,0x03,0x8f,0x00,0x73,0x01,0x7e, - 0x07,0x00,0x02,0x02,0x00,0x0d,0x00,0xf3,0x01,0x7e, - 0x03,0x80,0x03,0x8f,0x00,0x73,0x01,0x7e,0x07,0x00, - 0x02,0x02,0x00,0x0d,0x00,0xf3,0x01,0x7e,0xf8,0x90, - 0x03,0x00,0x08,0xf0,0x03,0x80,0x00,0x15,0x00,0xf3, - 0x02,0x00,0x06,0x07,0xfa,0xf9,0x07,0x78,0x03,0x80, - 0x03,0x80,0x04,0x0c,0x02,0x03,0x04,0x00,0x00,0x71, - 0x02,0x80,0x03,0x80,0x00,0x0f,0x06,0x77,0x06,0x09, - 0x00,0x71,0x02,0x80,0x03,0x80,0x00,0x0f,0x0a,0xf1, - 0x00,0x0f,0xf6,0xf8,0x0a,0x00,0x02,0xf9,0x05,0x80, - 0xff,0x01,0xff,0x04,0x00,0x05,0x01,0x03,0x01,0x02, - 0x06,0x00,0x02,0x7e,0x00,0x7d,0x00,0x7b,0x00,0x7c, - 0xfe,0x7f,0xfa,0x00,0x0b,0x80,0x03,0x80,0x00,0x0f, - 0x00,0xfb,0x01,0x03,0x01,0x02,0x05,0x00,0x02,0x7e, - 0x01,0x7d,0x00,0x76,0x03,0x80,0x10,0x80,0x10,0x80, - 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, - 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, - 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, - 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, - 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, - 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, - 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, - 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, - 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, - 0x10,0x80,0x0a,0x8f,0x02,0x7f,0x01,0x7e,0x00,0x76, - 0xff,0x7f,0xfe,0x7f,0xfb,0x00,0xff,0x01,0xff,0x01, - 0x00,0x0a,0x01,0x02,0x01,0x01,0x05,0x00,0xf9,0x80, - 0x00,0x6b,0x0c,0x86,0x0d,0x8a,0xff,0x03,0xfe,0x02, - 0xfb,0x00,0xff,0x7e,0xff,0x7d,0x00,0x7b,0x01,0x7c, - 0x01,0x7f,0x05,0x00,0x02,0x01,0x01,0x03,0x03,0xfc, - 0x03,0x80,0x00,0x0f,0x00,0xfb,0x01,0x03,0x01,0x02, - 0x04,0x00,0x01,0x7e,0x01,0x7d,0x00,0x76,0x00,0x8a, - 0x01,0x03,0x02,0x02,0x03,0x00,0x02,0x7e,0x01,0x7d, - 0x00,0x76,0x03,0x80,0x03,0x8f,0x00,0x74,0x01,0x7e, - 0x02,0x7f,0x04,0x00,0x02,0x01,0x01,0x01,0x00,0x8d, - 0x00,0x6e,0xff,0x7e,0xfe,0x7f,0xfb,0x00,0xfe,0x01, - 0x0c,0x85,0x03,0x8d,0x01,0x02,0x03,0x00,0x02,0x7e, - 0x01,0x02,0x03,0x00,0x02,0x7e,0x00,0x74,0xfe,0x7f, - 0xfd,0x00,0xff,0x01,0xfe,0x7f,0xfd,0x00,0xff,0x01, - 0x00,0x0c,0x06,0x82,0x00,0x6b,0x08,0x86,0x03,0x80, - 0x0a,0x0f,0xf6,0x80,0x0a,0x71,0x03,0x80,0x03,0x8f, - 0x00,0x73,0x01,0x7e,0x07,0x00,0x02,0x02,0x00,0x0d, - 0x00,0xf3,0x01,0x7e,0x00,0x7e,0x03,0x82,0x03,0x8f, - 0x00,0x79,0x02,0x7e,0x08,0x00,0x00,0x89,0x00,0x71, - 0x02,0x80,0x03,0x8f,0x00,0x73,0x01,0x7e,0x03,0x00, - 0x02,0x02,0x00,0x0d,0x00,0xf3,0x01,0x7e,0x03,0x00, - 0x02,0x02,0x00,0x0d,0x00,0xf3,0x01,0x7e,0x03,0x80, - 0x03,0x8f,0x00,0x73,0x01,0x7e,0x03,0x00,0x02,0x02, - 0x00,0x0d,0x00,0xf3,0x01,0x7e,0x03,0x00,0x02,0x02, - 0x00,0x0d,0x00,0xf3,0x01,0x7e,0x00,0x7e,0x03,0x82, - 0x03,0x8d,0x00,0x02,0x02,0x00,0x00,0x71,0x08,0x00, - 0x02,0x02,0x00,0x06,0xfe,0x02,0xf8,0x00,0x0c,0xf6, - 0x03,0x8f,0x00,0x71,0x07,0x00,0x02,0x02,0x00,0x06, - 0xfe,0x02,0xf9,0x00,0x0c,0x85,0x00,0x71,0x02,0x80, - 0x03,0x8f,0x00,0x71,0x07,0x00,0x03,0x02,0x00,0x06, - 0xfd,0x02,0xf9,0x00,0x0c,0xf6,0x03,0x8d,0x02,0x02, - 0x06,0x00,0x02,0x7e,0x00,0x75,0xfe,0x7e,0xfa,0x00, - 0xfe,0x02,0x04,0x85,0x06,0x00,0x02,0xf9,0x03,0x80, - 0x00,0x0f,0x00,0xf8,0x04,0x00,0x00,0x06,0x02,0x02, - 0x04,0x00,0x02,0x7e,0x00,0x75,0xfe,0x7e,0xfc,0x00, - 0xfe,0x02,0x00,0x05,0x0a,0xf9,0x0d,0x80,0x00,0x0f, - 0xf7,0x00,0xff,0x7e,0x00,0x7b,0x01,0x7e,0x09,0x00, - 0xf6,0xfa,0x04,0x06,0x08,0xfa - }; - - //------------------------------------------------------------------------- - gsv_text::gsv_text() : - m_x(0.0), - m_y(0.0), - m_start_x(0.0), - m_width(10.0), - m_height(0.0), - m_space(0.0), - m_line_space(0.0), - m_text(m_chr), - m_text_buf(), - m_cur_chr(m_chr), - m_font(gsv_default_font), - m_loaded_font(), - m_status(initial), - m_big_endian(false), - m_flip(false) - { - m_chr[0] = m_chr[1] = 0; - - int t = 1; - if(*(char*)&t == 0) m_big_endian = true; - } - - //------------------------------------------------------------------------- - void gsv_text::font(const void* font) - { - m_font = font; - if(m_font == 0) m_font = &m_loaded_font[0]; - } - - //------------------------------------------------------------------------- - void gsv_text::size(double height, double width) - { - m_height = height; - m_width = width; - } - - //------------------------------------------------------------------------- - void gsv_text::space(double space) - { - m_space = space; - } - - //------------------------------------------------------------------------- - void gsv_text::line_space(double line_space) - { - m_line_space = line_space; - } - - //------------------------------------------------------------------------- - void gsv_text::start_point(double x, double y) - { - m_x = m_start_x = x; - m_y = y; - //if(m_flip) m_y += m_height; - } - - //------------------------------------------------------------------------- - void gsv_text::load_font(const char* file) - { - m_loaded_font.resize(0); - FILE* fd = fopen(file, "rb"); - if(fd) - { - unsigned len; - - fseek(fd, 0l, SEEK_END); - len = ftell(fd); - fseek(fd, 0l, SEEK_SET); - if(len > 0) - { - m_loaded_font.resize(len); - fread(&m_loaded_font[0], 1, len, fd); - m_font = &m_loaded_font[0]; - } - fclose(fd); - } - } - - //------------------------------------------------------------------------- - void gsv_text::text(const char* text) - { - if(text == 0) - { - m_chr[0] = 0; - m_text = m_chr; - return; - } - unsigned new_size = strlen(text) + 1; - if(new_size > m_text_buf.size()) - { - m_text_buf.resize(new_size); - } - memcpy(&m_text_buf[0], text, new_size); - m_text = &m_text_buf[0]; - } - - //------------------------------------------------------------------------- - void gsv_text::rewind(unsigned) - { - m_status = initial; - if(m_font == 0) return; - - m_indices = (int8u*)m_font; - double base_height = value(m_indices + 4); - m_indices += value(m_indices); - m_glyphs = (int8*)(m_indices + 257*2); - m_h = m_height / base_height; - m_w = (m_width == 0.0) ? m_h : m_width / base_height; - if(m_flip) m_h = -m_h; - m_cur_chr = m_text; - } - - //------------------------------------------------------------------------- - unsigned gsv_text::vertex(double* x, double* y) - { - unsigned idx; - int8 yc, yf; - int dx, dy; - bool quit = false; - - while(!quit) - { - switch(m_status) - { - case initial: - if(m_font == 0) - { - quit = true; - break; - } - m_status = next_char; - - case next_char: - if(*m_cur_chr == 0) - { - quit = true; - break; - } - idx = (*m_cur_chr++) & 0xFF; - if(idx == '\n') - { - m_x = m_start_x; - m_y -= m_flip ? -m_height - m_line_space : m_height + m_line_space; - break; - } - idx <<= 1; - m_bglyph = m_glyphs + value(m_indices + idx); - m_eglyph = m_glyphs + value(m_indices + idx + 2); - m_status = start_glyph; - - case start_glyph: - *x = m_x; - *y = m_y; - m_status = glyph; - return path_cmd_move_to; - - case glyph: - if(m_bglyph >= m_eglyph) - { - m_status = next_char; - m_x += m_space; - break; - } - dx = int(*m_bglyph++); - yf = (yc = *m_bglyph++) & 0x80; - yc <<= 1; - yc >>= 1; - dy = int(yc); - m_x += double(dx) * m_w; - m_y += double(dy) * m_h; - *x = m_x; - *y = m_y; - return yf ? path_cmd_move_to : path_cmd_line_to; - } - - } - return path_cmd_stop; - } - - //------------------------------------------------------------------------- - double gsv_text::text_width() - { - double x1, y1, x2, y2; - bounding_rect_single(*this, 0, &x1, &y1, &x2, &y2); - return x2 - x1; - } - - -} diff --git a/uppdev/agg24/agg_gsv_text.h b/uppdev/agg24/agg_gsv_text.h deleted file mode 100644 index 73e4ec888..000000000 --- a/uppdev/agg24/agg_gsv_text.h +++ /dev/null @@ -1,153 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Class gsv_text -// -//---------------------------------------------------------------------------- - -#ifndef AGG_GSV_TEXT_INCLUDED -#define AGG_GSV_TEXT_INCLUDED - -#include "agg_array.h" -#include "agg_conv_stroke.h" -#include "agg_conv_transform.h" - -namespace agg -{ - - - //---------------------------------------------------------------gsv_text - // - // See Implementation agg_gsv_text.cpp - // - class gsv_text - { - enum status - { - initial, - next_char, - start_glyph, - glyph - }; - - public: - gsv_text(); - - void font(const void* font); - void flip(bool flip_y) { m_flip = flip_y; } - void load_font(const char* file); - void size(double height, double width=0.0); - void space(double space); - void line_space(double line_space); - void start_point(double x, double y); - void text(const char* text); - - double text_width(); - - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - // not supposed to be copied - gsv_text(const gsv_text&); - const gsv_text& operator = (const gsv_text&); - - int16u value(const int8u* p) const - { - int16u v; - if(m_big_endian) - { - *(int8u*)&v = p[1]; - *((int8u*)&v + 1) = p[0]; - } - else - { - *(int8u*)&v = p[0]; - *((int8u*)&v + 1) = p[1]; - } - return v; - } - - private: - double m_x; - double m_y; - double m_start_x; - double m_width; - double m_height; - double m_space; - double m_line_space; - char m_chr[2]; - char* m_text; - pod_array m_text_buf; - char* m_cur_chr; - const void* m_font; - pod_array m_loaded_font; - status m_status; - bool m_big_endian; - bool m_flip; - int8u* m_indices; - int8* m_glyphs; - int8* m_bglyph; - int8* m_eglyph; - double m_w; - double m_h; - }; - - - - - //--------------------------------------------------------gsv_text_outline - template class gsv_text_outline - { - public: - gsv_text_outline(gsv_text& text, const Transformer& trans) : - m_polyline(text), - m_trans(m_polyline, trans) - { - } - - void width(double w) - { - m_polyline.width(w); - } - - void transformer(const Transformer* trans) - { - m_trans->transformer(trans); - } - - void rewind(unsigned path_id) - { - m_trans.rewind(path_id); - m_polyline.line_join(round_join); - m_polyline.line_cap(round_cap); - } - - unsigned vertex(double* x, double* y) - { - return m_trans.vertex(x, y); - } - - private: - conv_stroke m_polyline; - conv_transform, Transformer> m_trans; - }; - - - -} - - -#endif diff --git a/uppdev/agg24/agg_image_accessors.h b/uppdev/agg24/agg_image_accessors.h deleted file mode 100644 index baaef9c5b..000000000 --- a/uppdev/agg24/agg_image_accessors.h +++ /dev/null @@ -1,481 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_IMAGE_ACCESSORS_INCLUDED -#define AGG_IMAGE_ACCESSORS_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - - //-----------------------------------------------------image_accessor_clip - template class image_accessor_clip - { - public: - typedef PixFmt pixfmt_type; - typedef typename pixfmt_type::color_type color_type; - typedef typename pixfmt_type::order_type order_type; - typedef typename pixfmt_type::value_type value_type; - enum pix_width_e { pix_width = pixfmt_type::pix_width }; - - image_accessor_clip() {} - explicit image_accessor_clip(const pixfmt_type& pixf, - const color_type& bk) : - m_pixf(&pixf) - { - pixfmt_type::make_pix(m_bk_buf, bk); - } - - void attach(const pixfmt_type& pixf) - { - m_pixf = &pixf; - } - - void background_color(const color_type& bk) - { - pixfmt_type::make_pix(m_bk_buf, bk); - } - - private: - AGG_INLINE const int8u* pixel() const - { - if(m_y >= 0 && m_y < (int)m_pixf->height() && - m_x >= 0 && m_x < (int)m_pixf->width()) - { - return m_pixf->pix_ptr(m_x, m_y); - } - return m_bk_buf; - } - - public: - AGG_INLINE const int8u* span(int x, int y, unsigned len) - { - m_x = m_x0 = x; - m_y = y; - if(y >= 0 && y < (int)m_pixf->height() && - x >= 0 && x+(int)len <= (int)m_pixf->width()) - { - return m_pix_ptr = m_pixf->pix_ptr(x, y); - } - m_pix_ptr = 0; - return pixel(); - } - - AGG_INLINE const int8u* next_x() - { - if(m_pix_ptr) return m_pix_ptr += pix_width; - ++m_x; - return pixel(); - } - - AGG_INLINE const int8u* next_y() - { - ++m_y; - m_x = m_x0; - if(m_pix_ptr && - m_y >= 0 && m_y < (int)m_pixf->height()) - { - return m_pix_ptr = m_pixf->pix_ptr(m_x, m_y); - } - m_pix_ptr = 0; - return pixel(); - } - - private: - const pixfmt_type* m_pixf; - int8u m_bk_buf[4]; - int m_x, m_x0, m_y; - const int8u* m_pix_ptr; - }; - - - - - //--------------------------------------------------image_accessor_no_clip - template class image_accessor_no_clip - { - public: - typedef PixFmt pixfmt_type; - typedef typename pixfmt_type::color_type color_type; - typedef typename pixfmt_type::order_type order_type; - typedef typename pixfmt_type::value_type value_type; - enum pix_width_e { pix_width = pixfmt_type::pix_width }; - - image_accessor_no_clip() {} - explicit image_accessor_no_clip(const pixfmt_type& pixf) : - m_pixf(&pixf) - {} - - void attach(const pixfmt_type& pixf) - { - m_pixf = &pixf; - } - - AGG_INLINE const int8u* span(int x, int y, unsigned) - { - m_x = x; - m_y = y; - return m_pix_ptr = m_pixf->pix_ptr(x, y); - } - - AGG_INLINE const int8u* next_x() - { - return m_pix_ptr += pix_width; - } - - AGG_INLINE const int8u* next_y() - { - ++m_y; - return m_pix_ptr = m_pixf->pix_ptr(m_x, m_y); - } - - private: - const pixfmt_type* m_pixf; - int m_x, m_y; - const int8u* m_pix_ptr; - }; - - - - - //----------------------------------------------------image_accessor_clone - template class image_accessor_clone - { - public: - typedef PixFmt pixfmt_type; - typedef typename pixfmt_type::color_type color_type; - typedef typename pixfmt_type::order_type order_type; - typedef typename pixfmt_type::value_type value_type; - enum pix_width_e { pix_width = pixfmt_type::pix_width }; - - image_accessor_clone() {} - explicit image_accessor_clone(const pixfmt_type& pixf) : - m_pixf(&pixf) - {} - - void attach(const pixfmt_type& pixf) - { - m_pixf = &pixf; - } - - private: - AGG_INLINE const int8u* pixel() const - { - register int x = m_x; - register int y = m_y; - if(x < 0) x = 0; - if(y < 0) y = 0; - if(x >= (int)m_pixf->width()) x = m_pixf->width() - 1; - if(y >= (int)m_pixf->height()) y = m_pixf->height() - 1; - return m_pixf->pix_ptr(x, y); - } - - public: - AGG_INLINE const int8u* span(int x, int y, unsigned len) - { - m_x = m_x0 = x; - m_y = y; - if(y >= 0 && y < (int)m_pixf->height() && - x >= 0 && x+len <= (int)m_pixf->width()) - { - return m_pix_ptr = m_pixf->pix_ptr(x, y); - } - m_pix_ptr = 0; - return pixel(); - } - - AGG_INLINE const int8u* next_x() - { - if(m_pix_ptr) return m_pix_ptr += pix_width; - ++m_x; - return pixel(); - } - - AGG_INLINE const int8u* next_y() - { - ++m_y; - m_x = m_x0; - if(m_pix_ptr && - m_y >= 0 && m_y < (int)m_pixf->height()) - { - return m_pix_ptr = m_pixf->pix_ptr(m_x, m_y); - } - m_pix_ptr = 0; - return pixel(); - } - - private: - const pixfmt_type* m_pixf; - int m_x, m_x0, m_y; - const int8u* m_pix_ptr; - }; - - - - - - //-----------------------------------------------------image_accessor_wrap - template class image_accessor_wrap - { - public: - typedef PixFmt pixfmt_type; - typedef typename pixfmt_type::color_type color_type; - typedef typename pixfmt_type::order_type order_type; - typedef typename pixfmt_type::value_type value_type; - enum pix_width_e { pix_width = pixfmt_type::pix_width }; - - image_accessor_wrap() {} - explicit image_accessor_wrap(const pixfmt_type& pixf) : - m_pixf(&pixf), - m_wrap_x(pixf.width()), - m_wrap_y(pixf.height()) - {} - - void attach(const pixfmt_type& pixf) - { - m_pixf = &pixf; - } - - AGG_INLINE const int8u* span(int x, int y, unsigned) - { - m_x = x; - m_row_ptr = m_pixf->row_ptr(m_wrap_y(y)); - return m_row_ptr + m_wrap_x(x) * pix_width; - } - - AGG_INLINE const int8u* next_x() - { - int x = ++m_wrap_x; - return m_row_ptr + x * pix_width; - } - - AGG_INLINE const int8u* next_y() - { - m_row_ptr = m_pixf->row_ptr(++m_wrap_y); - return m_row_ptr + m_wrap_x(m_x) * pix_width; - } - - private: - const pixfmt_type* m_pixf; - const int8u* m_row_ptr; - int m_x; - WrapX m_wrap_x; - WrapY m_wrap_y; - }; - - - - - //--------------------------------------------------------wrap_mode_repeat - class wrap_mode_repeat - { - public: - wrap_mode_repeat() {} - wrap_mode_repeat(unsigned size) : - m_size(size), - m_add(size * (0x3FFFFFFF / size)), - m_value(0) - {} - - AGG_INLINE unsigned operator() (int v) - { - return m_value = (unsigned(v) + m_add) % m_size; - } - - AGG_INLINE unsigned operator++ () - { - ++m_value; - if(m_value >= m_size) m_value = 0; - return m_value; - } - private: - unsigned m_size; - unsigned m_add; - unsigned m_value; - }; - - - //---------------------------------------------------wrap_mode_repeat_pow2 - class wrap_mode_repeat_pow2 - { - public: - wrap_mode_repeat_pow2() {} - wrap_mode_repeat_pow2(unsigned size) : m_value(0) - { - m_mask = 1; - while(m_mask < size) m_mask = (m_mask << 1) | 1; - m_mask >>= 1; - } - AGG_INLINE unsigned operator() (int v) - { - return m_value = unsigned(v) & m_mask; - } - AGG_INLINE unsigned operator++ () - { - ++m_value; - if(m_value > m_mask) m_value = 0; - return m_value; - } - private: - unsigned m_mask; - unsigned m_value; - }; - - - //----------------------------------------------wrap_mode_repeat_auto_pow2 - class wrap_mode_repeat_auto_pow2 - { - public: - wrap_mode_repeat_auto_pow2() {} - wrap_mode_repeat_auto_pow2(unsigned size) : - m_size(size), - m_add(size * (0x3FFFFFFF / size)), - m_mask((m_size & (m_size-1)) ? 0 : m_size-1), - m_value(0) - {} - - AGG_INLINE unsigned operator() (int v) - { - if(m_mask) return m_value = unsigned(v) & m_mask; - return m_value = (unsigned(v) + m_add) % m_size; - } - AGG_INLINE unsigned operator++ () - { - ++m_value; - if(m_value >= m_size) m_value = 0; - return m_value; - } - - private: - unsigned m_size; - unsigned m_add; - unsigned m_mask; - unsigned m_value; - }; - - - //-------------------------------------------------------wrap_mode_reflect - class wrap_mode_reflect - { - public: - wrap_mode_reflect() {} - wrap_mode_reflect(unsigned size) : - m_size(size), - m_size2(size * 2), - m_add(m_size2 * (0x3FFFFFFF / m_size2)), - m_value(0) - {} - - AGG_INLINE unsigned operator() (int v) - { - m_value = (unsigned(v) + m_add) % m_size2; - if(m_value >= m_size) return m_size2 - m_value - 1; - return m_value; - } - - AGG_INLINE unsigned operator++ () - { - ++m_value; - if(m_value >= m_size2) m_value = 0; - if(m_value >= m_size) return m_size2 - m_value - 1; - return m_value; - } - private: - unsigned m_size; - unsigned m_size2; - unsigned m_add; - unsigned m_value; - }; - - - - //--------------------------------------------------wrap_mode_reflect_pow2 - class wrap_mode_reflect_pow2 - { - public: - wrap_mode_reflect_pow2() {} - wrap_mode_reflect_pow2(unsigned size) : m_value(0) - { - m_mask = 1; - m_size = 1; - while(m_mask < size) - { - m_mask = (m_mask << 1) | 1; - m_size <<= 1; - } - } - AGG_INLINE unsigned operator() (int v) - { - m_value = unsigned(v) & m_mask; - if(m_value >= m_size) return m_mask - m_value; - return m_value; - } - AGG_INLINE unsigned operator++ () - { - ++m_value; - m_value &= m_mask; - if(m_value >= m_size) return m_mask - m_value; - return m_value; - } - private: - unsigned m_size; - unsigned m_mask; - unsigned m_value; - }; - - - - //---------------------------------------------wrap_mode_reflect_auto_pow2 - class wrap_mode_reflect_auto_pow2 - { - public: - wrap_mode_reflect_auto_pow2() {} - wrap_mode_reflect_auto_pow2(unsigned size) : - m_size(size), - m_size2(size * 2), - m_add(m_size2 * (0x3FFFFFFF / m_size2)), - m_mask((m_size2 & (m_size2-1)) ? 0 : m_size2-1), - m_value(0) - {} - - AGG_INLINE unsigned operator() (int v) - { - m_value = m_mask ? unsigned(v) & m_mask : - (unsigned(v) + m_add) % m_size2; - if(m_value >= m_size) return m_size2 - m_value - 1; - return m_value; - } - AGG_INLINE unsigned operator++ () - { - ++m_value; - if(m_value >= m_size2) m_value = 0; - if(m_value >= m_size) return m_size2 - m_value - 1; - return m_value; - } - - private: - unsigned m_size; - unsigned m_size2; - unsigned m_add; - unsigned m_mask; - unsigned m_value; - }; - - -} - - -#endif diff --git a/uppdev/agg24/agg_image_filters.cpp b/uppdev/agg24/agg_image_filters.cpp deleted file mode 100644 index 549d9adbf..000000000 --- a/uppdev/agg24/agg_image_filters.cpp +++ /dev/null @@ -1,103 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Filtering class image_filter_lut implemantation -// -//---------------------------------------------------------------------------- - - -#include "agg_image_filters.h" - - -namespace agg -{ - //-------------------------------------------------------------------- - void image_filter_lut::realloc_lut(double radius) - { - m_radius = radius; - m_diameter = uceil(radius) * 2; - m_start = -int(m_diameter / 2 - 1); - unsigned size = m_diameter << image_subpixel_shift; - if(size > m_weight_array.size()) - { - m_weight_array.resize(size); - } - } - - - - //-------------------------------------------------------------------- - // This function normalizes integer values and corrects the rounding - // errors. It doesn't do anything with the source floating point values - // (m_weight_array_dbl), it corrects only integers according to the rule - // of 1.0 which means that any sum of pixel weights must be equal to 1.0. - // So, the filter function must produce a graph of the proper shape. - //-------------------------------------------------------------------- - void image_filter_lut::normalize() - { - unsigned i; - int flip = 1; - - for(i = 0; i < image_subpixel_scale; i++) - { - for(;;) - { - int sum = 0; - unsigned j; - for(j = 0; j < m_diameter; j++) - { - sum += m_weight_array[j * image_subpixel_scale + i]; - } - - if(sum == image_filter_scale) break; - - double k = double(image_filter_scale) / double(sum); - sum = 0; - for(j = 0; j < m_diameter; j++) - { - sum += m_weight_array[j * image_subpixel_scale + i] = - iround(m_weight_array[j * image_subpixel_scale + i] * k); - } - - sum -= image_filter_scale; - int inc = (sum > 0) ? -1 : 1; - - for(j = 0; j < m_diameter && sum; j++) - { - flip ^= 1; - unsigned idx = flip ? m_diameter/2 + j/2 : m_diameter/2 - j/2; - int v = m_weight_array[idx * image_subpixel_scale + i]; - if(v < image_filter_scale) - { - m_weight_array[idx * image_subpixel_scale + i] += inc; - sum += inc; - } - } - } - } - - unsigned pivot = m_diameter << (image_subpixel_shift - 1); - - for(i = 0; i < pivot; i++) - { - m_weight_array[pivot + i] = m_weight_array[pivot - i]; - } - unsigned end = (diameter() << image_subpixel_shift) - 1; - m_weight_array[0] = m_weight_array[end]; - } - - -} - diff --git a/uppdev/agg24/agg_image_filters.h b/uppdev/agg24/agg_image_filters.h deleted file mode 100644 index 8e1bc8f0d..000000000 --- a/uppdev/agg24/agg_image_filters.h +++ /dev/null @@ -1,448 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Image transformation filters, -// Filtering classes (image_filter_lut, image_filter), -// Basic filter shape classes -//---------------------------------------------------------------------------- -#ifndef AGG_IMAGE_FILTERS_INCLUDED -#define AGG_IMAGE_FILTERS_INCLUDED - -#include "agg_array.h" -#include "agg_math.h" - -namespace agg -{ - - // See Implementation agg_image_filters.cpp - - enum image_filter_scale_e - { - image_filter_shift = 14, //----image_filter_shift - image_filter_scale = 1 << image_filter_shift, //----image_filter_scale - image_filter_mask = image_filter_scale - 1 //----image_filter_mask - }; - - enum image_subpixel_scale_e - { - image_subpixel_shift = 8, //----image_subpixel_shift - image_subpixel_scale = 1 << image_subpixel_shift, //----image_subpixel_scale - image_subpixel_mask = image_subpixel_scale - 1 //----image_subpixel_mask - }; - - - //-----------------------------------------------------image_filter_lut - class image_filter_lut - { - public: - template void calculate(const FilterF& filter, - bool normalization=true) - { - double r = filter.radius(); - realloc_lut(r); - unsigned i; - unsigned pivot = diameter() << (image_subpixel_shift - 1); - for(i = 0; i < pivot; i++) - { - double x = double(i) / double(image_subpixel_scale); - double y = filter.calc_weight(x); - m_weight_array[pivot + i] = - m_weight_array[pivot - i] = (int16)iround(y * image_filter_scale); - } - unsigned end = (diameter() << image_subpixel_shift) - 1; - m_weight_array[0] = m_weight_array[end]; - if(normalization) - { - normalize(); - } - } - - image_filter_lut() : m_radius(0), m_diameter(0), m_start(0) {} - - template image_filter_lut(const FilterF& filter, - bool normalization=true) - { - calculate(filter, normalization); - } - - double radius() const { return m_radius; } - unsigned diameter() const { return m_diameter; } - int start() const { return m_start; } - const int16* weight_array() const { return &m_weight_array[0]; } - void normalize(); - - private: - void realloc_lut(double radius); - image_filter_lut(const image_filter_lut&); - const image_filter_lut& operator = (const image_filter_lut&); - - double m_radius; - unsigned m_diameter; - int m_start; - pod_array m_weight_array; - }; - - - - //--------------------------------------------------------image_filter - template class image_filter : public image_filter_lut - { - public: - image_filter() - { - calculate(m_filter_function); - } - private: - FilterF m_filter_function; - }; - - - //-----------------------------------------------image_filter_bilinear - struct image_filter_bilinear - { - static double radius() { return 1.0; } - static double calc_weight(double x) - { - return 1.0 - x; - } - }; - - - //-----------------------------------------------image_filter_hanning - struct image_filter_hanning - { - static double radius() { return 1.0; } - static double calc_weight(double x) - { - return 0.5 + 0.5 * cos(pi * x); - } - }; - - - //-----------------------------------------------image_filter_hamming - struct image_filter_hamming - { - static double radius() { return 1.0; } - static double calc_weight(double x) - { - return 0.54 + 0.46 * cos(pi * x); - } - }; - - //-----------------------------------------------image_filter_hermite - struct image_filter_hermite - { - static double radius() { return 1.0; } - static double calc_weight(double x) - { - return (2.0 * x - 3.0) * x * x + 1.0; - } - }; - - //------------------------------------------------image_filter_quadric - struct image_filter_quadric - { - static double radius() { return 1.5; } - static double calc_weight(double x) - { - double t; - if(x < 0.5) return 0.75 - x * x; - if(x < 1.5) {t = x - 1.5; return 0.5 * t * t;} - return 0.0; - } - }; - - //------------------------------------------------image_filter_bicubic - class image_filter_bicubic - { - static double pow3(double x) - { - return (x <= 0.0) ? 0.0 : x * x * x; - } - - public: - static double radius() { return 2.0; } - static double calc_weight(double x) - { - return - (1.0/6.0) * - (pow3(x + 2) - 4 * pow3(x + 1) + 6 * pow3(x) - 4 * pow3(x - 1)); - } - }; - - //-------------------------------------------------image_filter_kaiser - class image_filter_kaiser - { - double a; - double i0a; - double epsilon; - - public: - image_filter_kaiser(double b = 6.33) : - a(b), epsilon(1e-12) - { - i0a = 1.0 / bessel_i0(b); - } - - static double radius() { return 1.0; } - double calc_weight(double x) const - { - return bessel_i0(a * sqrt(1. - x * x)) * i0a; - } - - private: - double bessel_i0(double x) const - { - int i; - double sum, y, t; - - sum = 1.; - y = x * x / 4.; - t = y; - - for(i = 2; t > epsilon; i++) - { - sum += t; - t *= (double)y / (i * i); - } - return sum; - } - }; - - //----------------------------------------------image_filter_catrom - struct image_filter_catrom - { - static double radius() { return 2.0; } - static double calc_weight(double x) - { - if(x < 1.0) return 0.5 * (2.0 + x * x * (-5.0 + x * 3.0)); - if(x < 2.0) return 0.5 * (4.0 + x * (-8.0 + x * (5.0 - x))); - return 0.; - } - }; - - //---------------------------------------------image_filter_mitchell - class image_filter_mitchell - { - double p0, p2, p3; - double q0, q1, q2, q3; - - public: - image_filter_mitchell(double b = 1.0/3.0, double c = 1.0/3.0) : - p0((6.0 - 2.0 * b) / 6.0), - p2((-18.0 + 12.0 * b + 6.0 * c) / 6.0), - p3((12.0 - 9.0 * b - 6.0 * c) / 6.0), - q0((8.0 * b + 24.0 * c) / 6.0), - q1((-12.0 * b - 48.0 * c) / 6.0), - q2((6.0 * b + 30.0 * c) / 6.0), - q3((-b - 6.0 * c) / 6.0) - {} - - static double radius() { return 2.0; } - double calc_weight(double x) const - { - if(x < 1.0) return p0 + x * x * (p2 + x * p3); - if(x < 2.0) return q0 + x * (q1 + x * (q2 + x * q3)); - return 0.0; - } - }; - - - //----------------------------------------------image_filter_spline16 - struct image_filter_spline16 - { - static double radius() { return 2.0; } - static double calc_weight(double x) - { - if(x < 1.0) - { - return ((x - 9.0/5.0 ) * x - 1.0/5.0 ) * x + 1.0; - } - return ((-1.0/3.0 * (x-1) + 4.0/5.0) * (x-1) - 7.0/15.0 ) * (x-1); - } - }; - - - //---------------------------------------------image_filter_spline36 - struct image_filter_spline36 - { - static double radius() { return 3.0; } - static double calc_weight(double x) - { - if(x < 1.0) - { - return ((13.0/11.0 * x - 453.0/209.0) * x - 3.0/209.0) * x + 1.0; - } - if(x < 2.0) - { - return ((-6.0/11.0 * (x-1) + 270.0/209.0) * (x-1) - 156.0/ 209.0) * (x-1); - } - return ((1.0/11.0 * (x-2) - 45.0/209.0) * (x-2) + 26.0/209.0) * (x-2); - } - }; - - - //----------------------------------------------image_filter_gaussian - struct image_filter_gaussian - { - static double radius() { return 2.0; } - static double calc_weight(double x) - { - return exp(-2.0 * x * x) * sqrt(2.0 / pi); - } - }; - - - //------------------------------------------------image_filter_bessel - struct image_filter_bessel - { - static double radius() { return 3.2383; } - static double calc_weight(double x) - { - return (x == 0.0) ? pi / 4.0 : besj(pi * x, 1) / (2.0 * x); - } - }; - - - //-------------------------------------------------image_filter_sinc - class image_filter_sinc - { - public: - image_filter_sinc(double r) : m_radius(r < 2.0 ? 2.0 : r) {} - double radius() const { return m_radius; } - double calc_weight(double x) const - { - if(x == 0.0) return 1.0; - x *= pi; - return sin(x) / x; - } - private: - double m_radius; - }; - - - //-----------------------------------------------image_filter_lanczos - class image_filter_lanczos - { - public: - image_filter_lanczos(double r) : m_radius(r < 2.0 ? 2.0 : r) {} - double radius() const { return m_radius; } - double calc_weight(double x) const - { - if(x == 0.0) return 1.0; - if(x > m_radius) return 0.0; - x *= pi; - double xr = x / m_radius; - return (sin(x) / x) * (sin(xr) / xr); - } - private: - double m_radius; - }; - - - //----------------------------------------------image_filter_blackman - class image_filter_blackman - { - public: - image_filter_blackman(double r) : m_radius(r < 2.0 ? 2.0 : r) {} - double radius() const { return m_radius; } - double calc_weight(double x) const - { - if(x == 0.0) return 1.0; - if(x > m_radius) return 0.0; - x *= pi; - double xr = x / m_radius; - return (sin(x) / x) * (0.42 + 0.5*cos(xr) + 0.08*cos(2*xr)); - } - private: - double m_radius; - }; - - //------------------------------------------------image_filter_sinc36 - class image_filter_sinc36 : public image_filter_sinc - { public: image_filter_sinc36() : image_filter_sinc(3.0){} }; - - //------------------------------------------------image_filter_sinc64 - class image_filter_sinc64 : public image_filter_sinc - { public: image_filter_sinc64() : image_filter_sinc(4.0){} }; - - //-----------------------------------------------image_filter_sinc100 - class image_filter_sinc100 : public image_filter_sinc - { public: image_filter_sinc100() : image_filter_sinc(5.0){} }; - - //-----------------------------------------------image_filter_sinc144 - class image_filter_sinc144 : public image_filter_sinc - { public: image_filter_sinc144() : image_filter_sinc(6.0){} }; - - //-----------------------------------------------image_filter_sinc196 - class image_filter_sinc196 : public image_filter_sinc - { public: image_filter_sinc196() : image_filter_sinc(7.0){} }; - - //-----------------------------------------------image_filter_sinc256 - class image_filter_sinc256 : public image_filter_sinc - { public: image_filter_sinc256() : image_filter_sinc(8.0){} }; - - //---------------------------------------------image_filter_lanczos36 - class image_filter_lanczos36 : public image_filter_lanczos - { public: image_filter_lanczos36() : image_filter_lanczos(3.0){} }; - - //---------------------------------------------image_filter_lanczos64 - class image_filter_lanczos64 : public image_filter_lanczos - { public: image_filter_lanczos64() : image_filter_lanczos(4.0){} }; - - //--------------------------------------------image_filter_lanczos100 - class image_filter_lanczos100 : public image_filter_lanczos - { public: image_filter_lanczos100() : image_filter_lanczos(5.0){} }; - - //--------------------------------------------image_filter_lanczos144 - class image_filter_lanczos144 : public image_filter_lanczos - { public: image_filter_lanczos144() : image_filter_lanczos(6.0){} }; - - //--------------------------------------------image_filter_lanczos196 - class image_filter_lanczos196 : public image_filter_lanczos - { public: image_filter_lanczos196() : image_filter_lanczos(7.0){} }; - - //--------------------------------------------image_filter_lanczos256 - class image_filter_lanczos256 : public image_filter_lanczos - { public: image_filter_lanczos256() : image_filter_lanczos(8.0){} }; - - //--------------------------------------------image_filter_blackman36 - class image_filter_blackman36 : public image_filter_blackman - { public: image_filter_blackman36() : image_filter_blackman(3.0){} }; - - //--------------------------------------------image_filter_blackman64 - class image_filter_blackman64 : public image_filter_blackman - { public: image_filter_blackman64() : image_filter_blackman(4.0){} }; - - //-------------------------------------------image_filter_blackman100 - class image_filter_blackman100 : public image_filter_blackman - { public: image_filter_blackman100() : image_filter_blackman(5.0){} }; - - //-------------------------------------------image_filter_blackman144 - class image_filter_blackman144 : public image_filter_blackman - { public: image_filter_blackman144() : image_filter_blackman(6.0){} }; - - //-------------------------------------------image_filter_blackman196 - class image_filter_blackman196 : public image_filter_blackman - { public: image_filter_blackman196() : image_filter_blackman(7.0){} }; - - //-------------------------------------------image_filter_blackman256 - class image_filter_blackman256 : public image_filter_blackman - { public: image_filter_blackman256() : image_filter_blackman(8.0){} }; - - -} - -#endif diff --git a/uppdev/agg24/agg_line_aa_basics.cpp b/uppdev/agg24/agg_line_aa_basics.cpp deleted file mode 100644 index 018d65366..000000000 --- a/uppdev/agg24/agg_line_aa_basics.cpp +++ /dev/null @@ -1,82 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#include -#include "agg_line_aa_basics.h" - -namespace agg -{ - //------------------------------------------------------------------------- - // The number of the octant is determined as a 3-bit value as follows: - // bit 0 = vertical flag - // bit 1 = sx < 0 - // bit 2 = sy < 0 - // - // [N] shows the number of the orthogonal quadrant - // shows the number of the diagonal quadrant - // <1> - // [1] | [0] - // . (3)011 | 001(1) . - // . | . - // . | . - // . | . - // (2)010 .|. 000(0) - // <2> ----------.+.----------- <0> - // (6)110 . | . 100(4) - // . | . - // . | . - // . | . - // (7)111 | 101(5) - // [2] | [3] - // <3> - // 0,1,2,3,4,5,6,7 - const int8u line_parameters::s_orthogonal_quadrant[8] = { 0,0,1,1,3,3,2,2 }; - const int8u line_parameters::s_diagonal_quadrant[8] = { 0,1,2,1,0,3,2,3 }; - - - - //------------------------------------------------------------------------- - void bisectrix(const line_parameters& l1, - const line_parameters& l2, - int* x, int* y) - { - double k = double(l2.len) / double(l1.len); - double tx = l2.x2 - (l2.x1 - l1.x1) * k; - double ty = l2.y2 - (l2.y1 - l1.y1) * k; - - //All bisectrices must be on the right of the line - //If the next point is on the left (l1 => l2.2) - //then the bisectix should be rotated by 180 degrees. - if(double(l2.x2 - l2.x1) * double(l2.y1 - l1.y1) < - double(l2.y2 - l2.y1) * double(l2.x1 - l1.x1) + 100.0) - { - tx -= (tx - l2.x1) * 2.0; - ty -= (ty - l2.y1) * 2.0; - } - - // Check if the bisectrix is too short - double dx = tx - l2.x1; - double dy = ty - l2.y1; - if((int)sqrt(dx * dx + dy * dy) < line_subpixel_scale) - { - *x = (l2.x1 + l2.x1 + (l2.y1 - l1.y1) + (l2.y2 - l2.y1)) >> 1; - *y = (l2.y1 + l2.y1 - (l2.x1 - l1.x1) - (l2.x2 - l2.x1)) >> 1; - return; - } - *x = iround(tx); - *y = iround(ty); - } - -} diff --git a/uppdev/agg24/agg_line_aa_basics.h b/uppdev/agg24/agg_line_aa_basics.h deleted file mode 100644 index c5acb18e7..000000000 --- a/uppdev/agg24/agg_line_aa_basics.h +++ /dev/null @@ -1,189 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -#ifndef AGG_LINE_AA_BASICS_INCLUDED -#define AGG_LINE_AA_BASICS_INCLUDED - -#include -#include "agg_basics.h" - -namespace agg -{ - - // See Implementation agg_line_aa_basics.cpp - - //------------------------------------------------------------------------- - enum line_subpixel_scale_e - { - line_subpixel_shift = 8, //----line_subpixel_shift - line_subpixel_scale = 1 << line_subpixel_shift, //----line_subpixel_scale - line_subpixel_mask = line_subpixel_scale - 1, //----line_subpixel_mask - line_max_coord = (1 << 28) - 1, //----line_max_coord - line_max_length = 1 << (line_subpixel_shift + 10) //----line_max_length - }; - - //------------------------------------------------------------------------- - enum line_mr_subpixel_scale_e - { - line_mr_subpixel_shift = 4, //----line_mr_subpixel_shift - line_mr_subpixel_scale = 1 << line_mr_subpixel_shift, //----line_mr_subpixel_scale - line_mr_subpixel_mask = line_mr_subpixel_scale - 1 //----line_mr_subpixel_mask - }; - - //------------------------------------------------------------------line_mr - AGG_INLINE int line_mr(int x) - { - return x >> (line_subpixel_shift - line_mr_subpixel_shift); - } - - //-------------------------------------------------------------------line_hr - AGG_INLINE int line_hr(int x) - { - return x << (line_subpixel_shift - line_mr_subpixel_shift); - } - - //---------------------------------------------------------------line_dbl_hr - AGG_INLINE int line_dbl_hr(int x) - { - return x << line_subpixel_shift; - } - - //---------------------------------------------------------------line_coord - struct line_coord - { - AGG_INLINE static int conv(double x) - { - return iround(x * line_subpixel_scale); - } - }; - - //-----------------------------------------------------------line_coord_sat - struct line_coord_sat - { - AGG_INLINE static int conv(double x) - { - return saturation::iround(x * line_subpixel_scale); - } - }; - - //==========================================================line_parameters - struct line_parameters - { - //--------------------------------------------------------------------- - line_parameters() {} - line_parameters(int x1_, int y1_, int x2_, int y2_, int len_) : - x1(x1_), y1(y1_), x2(x2_), y2(y2_), - dx(abs(x2_ - x1_)), - dy(abs(y2_ - y1_)), - sx((x2_ > x1_) ? 1 : -1), - sy((y2_ > y1_) ? 1 : -1), - vertical(dy >= dx), - inc(vertical ? sy : sx), - len(len_), - octant((sy & 4) | (sx & 2) | int(vertical)) - { - } - - //--------------------------------------------------------------------- - unsigned orthogonal_quadrant() const { return s_orthogonal_quadrant[octant]; } - unsigned diagonal_quadrant() const { return s_diagonal_quadrant[octant]; } - - //--------------------------------------------------------------------- - bool same_orthogonal_quadrant(const line_parameters& lp) const - { - return s_orthogonal_quadrant[octant] == s_orthogonal_quadrant[lp.octant]; - } - - //--------------------------------------------------------------------- - bool same_diagonal_quadrant(const line_parameters& lp) const - { - return s_diagonal_quadrant[octant] == s_diagonal_quadrant[lp.octant]; - } - - //--------------------------------------------------------------------- - void divide(line_parameters& lp1, line_parameters& lp2) const - { - int xmid = (x1 + x2) >> 1; - int ymid = (y1 + y2) >> 1; - int len2 = len >> 1; - - lp1 = *this; - lp2 = *this; - - lp1.x2 = xmid; - lp1.y2 = ymid; - lp1.len = len2; - lp1.dx = abs(lp1.x2 - lp1.x1); - lp1.dy = abs(lp1.y2 - lp1.y1); - - lp2.x1 = xmid; - lp2.y1 = ymid; - lp2.len = len2; - lp2.dx = abs(lp2.x2 - lp2.x1); - lp2.dy = abs(lp2.y2 - lp2.y1); - } - - //--------------------------------------------------------------------- - int x1, y1, x2, y2, dx, dy, sx, sy; - bool vertical; - int inc; - int len; - int octant; - - //--------------------------------------------------------------------- - static const int8u s_orthogonal_quadrant[8]; - static const int8u s_diagonal_quadrant[8]; - }; - - - - // See Implementation agg_line_aa_basics.cpp - - //----------------------------------------------------------------bisectrix - void bisectrix(const line_parameters& l1, - const line_parameters& l2, - int* x, int* y); - - - //-------------------------------------------fix_degenerate_bisectrix_start - void inline fix_degenerate_bisectrix_start(const line_parameters& lp, - int* x, int* y) - { - int d = iround((double(*x - lp.x2) * double(lp.y2 - lp.y1) - - double(*y - lp.y2) * double(lp.x2 - lp.x1)) / lp.len); - if(d < line_subpixel_scale/2) - { - *x = lp.x1 + (lp.y2 - lp.y1); - *y = lp.y1 - (lp.x2 - lp.x1); - } - } - - - //---------------------------------------------fix_degenerate_bisectrix_end - void inline fix_degenerate_bisectrix_end(const line_parameters& lp, - int* x, int* y) - { - int d = iround((double(*x - lp.x2) * double(lp.y2 - lp.y1) - - double(*y - lp.y2) * double(lp.x2 - lp.x1)) / lp.len); - if(d < line_subpixel_scale/2) - { - *x = lp.x2 + (lp.y2 - lp.y1); - *y = lp.y2 - (lp.x2 - lp.x1); - } - } - - -} - -#endif diff --git a/uppdev/agg24/agg_line_profile_aa.cpp b/uppdev/agg24/agg_line_profile_aa.cpp deleted file mode 100644 index 6066662cb..000000000 --- a/uppdev/agg24/agg_line_profile_aa.cpp +++ /dev/null @@ -1,116 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#include "agg_renderer_outline_aa.h" - -namespace agg -{ - - //--------------------------------------------------------------------- - void line_profile_aa::width(double w) - { - if(w < 0.0) w = 0.0; - - if(w < m_smoother_width) w += w; - else w += m_smoother_width; - - w *= 0.5; - - w -= m_smoother_width; - double s = m_smoother_width; - if(w < 0.0) - { - s += w; - w = 0.0; - } - set(w, s); - } - - - //--------------------------------------------------------------------- - line_profile_aa::value_type* line_profile_aa::profile(double w) - { - m_subpixel_width = uround(w * subpixel_scale); - unsigned size = m_subpixel_width + subpixel_scale * 6; - if(size > m_profile.size()) - { - m_profile.resize(size); - } - return &m_profile[0]; - } - - - //--------------------------------------------------------------------- - void line_profile_aa::set(double center_width, double smoother_width) - { - double base_val = 1.0; - if(center_width == 0.0) center_width = 1.0 / subpixel_scale; - if(smoother_width == 0.0) smoother_width = 1.0 / subpixel_scale; - - double width = center_width + smoother_width; - if(width < m_min_width) - { - double k = width / m_min_width; - base_val *= k; - center_width /= k; - smoother_width /= k; - } - - value_type* ch = profile(center_width + smoother_width); - - unsigned subpixel_center_width = unsigned(center_width * subpixel_scale); - unsigned subpixel_smoother_width = unsigned(smoother_width * subpixel_scale); - - value_type* ch_center = ch + subpixel_scale*2; - value_type* ch_smoother = ch_center + subpixel_center_width; - - unsigned i; - - unsigned val = m_gamma[unsigned(base_val * aa_mask)]; - ch = ch_center; - for(i = 0; i < subpixel_center_width; i++) - { - *ch++ = (value_type)val; - } - - for(i = 0; i < subpixel_smoother_width; i++) - { - *ch_smoother++ = - m_gamma[unsigned((base_val - - base_val * - (double(i) / subpixel_smoother_width)) * aa_mask)]; - } - - unsigned n_smoother = profile_size() - - subpixel_smoother_width - - subpixel_center_width - - subpixel_scale*2; - - val = m_gamma[0]; - for(i = 0; i < n_smoother; i++) - { - *ch_smoother++ = (value_type)val; - } - - ch = ch_center; - for(i = 0; i < subpixel_scale*2; i++) - { - *--ch = *ch_center++; - } - } - - -} - diff --git a/uppdev/agg24/agg_mac_pmap.cpp b/uppdev/agg24/agg_mac_pmap.cpp deleted file mode 100644 index ad7e60437..000000000 --- a/uppdev/agg24/agg_mac_pmap.cpp +++ /dev/null @@ -1,300 +0,0 @@ -//---------------------------------------------------------------------------- -// -//---------------------------------------------------------------------------- -// Contact: mcseemagg@yahoo.com -// baer@karto.baug.ethz.ch -//---------------------------------------------------------------------------- -// -// class pixel_map -// -//---------------------------------------------------------------------------- - -#ifdef PLATFORM_MAC - -#include -#include -#include -#include -#include "../mac/agg_mac_pmap.h" -#include "../../agg_basics.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - pixel_map::~pixel_map() - { - destroy(); - } - - - //------------------------------------------------------------------------ - pixel_map::pixel_map() : - m_pmap(0), - m_buf(0), - m_bpp(0), - m_img_size(0) - - { - } - - - //------------------------------------------------------------------------ - void pixel_map::destroy() - { - delete[] m_buf; - m_buf = NULL; - if (m_pmap != nil) - { - DisposeGWorld(m_pmap); - m_pmap = nil; - } - } - - - //------------------------------------------------------------------------ - void pixel_map::create(unsigned width, - unsigned height, - org_e org, - unsigned clear_val) - { - destroy(); - if(width == 0) width = 1; - if(height == 0) height = 1; - m_bpp = org; - - Rect r; - int row_bytes = calc_row_len (width, m_bpp); - MacSetRect(&r, 0, 0, width, height); - m_buf = new unsigned char[m_img_size = row_bytes * height]; - // The Quicktime version for creating GWorlds is more flexible than the classical function. - QTNewGWorldFromPtr (&m_pmap, m_bpp, &r, nil, nil, 0, m_buf, row_bytes); - - // create_gray_scale_palette(m_pmap); I didn't care about gray scale palettes so far. - if(clear_val <= 255) - { - memset(m_buf, clear_val, m_img_size); - } - } - - - - //------------------------------------------------------------------------ - void pixel_map::clear(unsigned clear_val) - { - if(m_buf) memset(m_buf, clear_val, m_img_size); - } - - - //static - //This function is just copied from the Win32 plattform support. - //Is also seems to be appropriate for MacOS as well, but it is not - //thouroughly tested so far. - //------------------------------------------------------------------------ - - unsigned pixel_map::calc_row_len(unsigned width, unsigned bits_per_pixel) - { - unsigned n = width; - unsigned k; - - switch(bits_per_pixel) - { - case 1: k = n; - n = n >> 3; - if(k & 7) n++; - break; - - case 4: k = n; - n = n >> 1; - if(k & 3) n++; - break; - - case 8: - break; - - case 16: n = n << 1; - break; - - case 24: n = (n << 1) + n; - break; - - case 32: n = n << 2; - break; - - default: n = 0; - break; - } - return ((n + 3) >> 2) << 2; - } - - - - - //------------------------------------------------------------------------ - void pixel_map::draw(WindowRef window, const Rect *device_rect, const Rect *pmap_rect) const - { - if(m_pmap == nil || m_buf == NULL) return; - - PixMapHandle pm = GetGWorldPixMap (m_pmap); - CGrafPtr port = GetWindowPort (window); - Rect dest_rect; - - // Again, I used the Quicktime version. - // Good old 'CopyBits' does better interpolation when scaling - // but does not support all pixel depths. - MacSetRect (&dest_rect, 0, 0, this->width(), this->height()); - ImageDescriptionHandle image_description; - MakeImageDescriptionForPixMap (pm, &image_description); - if (image_description != nil) - { - DecompressImage (GetPixBaseAddr (pm), image_description, GetPortPixMap (port), nil, &dest_rect, ditherCopy, nil); - DisposeHandle ((Handle) image_description); - } - } - - - //------------------------------------------------------------------------ - void pixel_map::draw(WindowRef window, int x, int y, double scale) const - { - if(m_pmap == nil || m_buf == NULL) return; - unsigned width = (unsigned)(this->width() * scale); - unsigned height = (unsigned)(this->height() * scale); - Rect rect; - SetRect (&rect, x, y, x + width, y + height); - draw(window, &rect); - } - - - - //------------------------------------------------------------------------ - void pixel_map::blend(WindowRef window, const Rect *device_rect, const Rect *bmp_rect) const - { - draw (window, device_rect, bmp_rect); // currently just mapped to drawing method - } - - - //------------------------------------------------------------------------ - void pixel_map::blend(WindowRef window, int x, int y, double scale) const - { - draw(window, x, y, scale); // currently just mapped to drawing method - } - - - // I let Quicktime handle image import since it supports most popular - // image formats such as: - // *.psd, *.bmp, *.tif, *.png, *.jpg, *.gif, *.pct, *.pcx - //------------------------------------------------------------------------ - bool pixel_map::load_from_qt(const char *filename) - { - FSSpec fss; - OSErr err; - - // get file specification to application directory - err = HGetVol(nil, &fss.vRefNum, &fss.parID); - if (err == noErr) - { - CopyCStringToPascal(filename, fss.name); - GraphicsImportComponent gi; - err = GetGraphicsImporterForFile (&fss, &gi); - if (err == noErr) - { - ImageDescriptionHandle desc; - GraphicsImportGetImageDescription(gi, &desc); -// For simplicity, all images are currently converted to 32 bit. - // create an empty pixelmap - short depth = 32; - create ((**desc).width, (**desc).height, (org_e)depth, 0xff); - DisposeHandle ((Handle)desc); - // let Quicktime draw to pixelmap - GraphicsImportSetGWorld(gi, m_pmap, nil); - GraphicsImportDraw(gi); -// Well, this is a hack. The graphics importer sets the alpha channel of the pixelmap to 0x00 -// for imported images without alpha channel but this would cause agg to draw an invisible image. - // set alpha channel to 0xff - unsigned char * buf = m_buf; - for (unsigned int size = 0; size < m_img_size; size += 4) - { - *buf = 0xff; - buf += 4; - } - } - } - return err == noErr; - } - - - - //------------------------------------------------------------------------ - bool pixel_map::save_as_qt(const char *filename) const - { - FSSpec fss; - OSErr err; - - // get file specification to application directory - err = HGetVol(nil, &fss.vRefNum, &fss.parID); - if (err == noErr) - { - GraphicsExportComponent ge; - CopyCStringToPascal(filename, fss.name); - // I decided to use PNG as output image file type. - // There are a number of other available formats. - // Should I check the file suffix to choose the image file format? - err = OpenADefaultComponent(GraphicsExporterComponentType, kQTFileTypePNG, &ge); - if (err == noErr) - { - err = GraphicsExportSetInputGWorld(ge, m_pmap); - if (err == noErr) - { - err = GraphicsExportSetOutputFile (ge, &fss); - if (err == noErr) - { - GraphicsExportDoExport(ge, nil); - } - } - CloseComponent(ge); - } - } - - return err == noErr; - } - - //------------------------------------------------------------------------ - unsigned char* pixel_map::buf() - { - return m_buf; - } - - //------------------------------------------------------------------------ - unsigned pixel_map::width() const - { - if(m_pmap == nil) return 0; - PixMapHandle pm = GetGWorldPixMap (m_pmap); - Rect bounds; - GetPixBounds (pm, &bounds); - return bounds.right - bounds.left; - } - - //------------------------------------------------------------------------ - unsigned pixel_map::height() const - { - if(m_pmap == nil) return 0; - PixMapHandle pm = GetGWorldPixMap (m_pmap); - Rect bounds; - GetPixBounds (pm, &bounds); - return bounds.bottom - bounds.top; - } - - //------------------------------------------------------------------------ - int pixel_map::row_bytes() const - { - if(m_pmap == nil) return 0; - PixMapHandle pm = GetGWorldPixMap (m_pmap); - return calc_row_len(width(), GetPixDepth(pm)); - } - - - -} - - -#endif diff --git a/uppdev/agg24/agg_mac_pmap.h b/uppdev/agg24/agg_mac_pmap.h deleted file mode 100644 index 775da20f7..000000000 --- a/uppdev/agg24/agg_mac_pmap.h +++ /dev/null @@ -1,91 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (McSeem) -// Copyright (C) 2002 Hansruedi Baer (MacOS support) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -// baer@karto.baug.eth.ch -//---------------------------------------------------------------------------- -// -// class pixel_map -// -//---------------------------------------------------------------------------- - -#ifdef PLATFORM_MAC - -#ifndef AGG_MAC_PMAP_INCLUDED -#define AGG_MAC_PMAP_INCLUDED - - -#include -#include - - -namespace agg -{ - - enum org_e - { - org_mono8 = 8, - org_color16 = 16, - org_color24 = 24, - org_color32 = 32 - }; - - class pixel_map - { - public: - ~pixel_map(); - pixel_map(); - - public: - void destroy(); - void create(unsigned width, - unsigned height, - org_e org, - unsigned clear_val=255); - - void clear(unsigned clear_val=255); - bool load_from_qt(const char* filename); - bool save_as_qt(const char* filename) const; - - void draw(WindowRef window, - const Rect* device_rect=0, - const Rect* bmp_rect=0) const; - void draw(WindowRef window, int x, int y, double scale=1.0) const; - void blend(WindowRef window, - const Rect* device_rect=0, - const Rect* bmp_rect=0) const; - void blend(WindowRef window, int x, int y, double scale=1.0) const; - - unsigned char* buf(); - unsigned width() const; - unsigned height() const; - int row_bytes() const; - unsigned bpp() const { return m_bpp; } - - //Auxiliary static functions - static unsigned calc_row_len(unsigned width, unsigned bits_per_pixel); - private: - pixel_map(const pixel_map&); - const pixel_map& operator = (const pixel_map&); - - private: - GWorldPtr m_pmap; - unsigned char* m_buf; - unsigned m_bpp; - unsigned m_img_size; - }; - -} - -#endif -#endif diff --git a/uppdev/agg24/agg_math.h b/uppdev/agg24/agg_math.h deleted file mode 100644 index 2ec49cf3f..000000000 --- a/uppdev/agg24/agg_math.h +++ /dev/null @@ -1,437 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// Bessel function (besj) was adapted for use in AGG library by Andy Wilk -// Contact: castor.vulgaris@gmail.com -//---------------------------------------------------------------------------- - -#ifndef AGG_MATH_INCLUDED -#define AGG_MATH_INCLUDED - -#include -#include "agg_basics.h" - -namespace agg -{ - - //------------------------------------------------------vertex_dist_epsilon - // Coinciding points maximal distance (Epsilon) - const double vertex_dist_epsilon = 1e-14; - - //-----------------------------------------------------intersection_epsilon - // See calc_intersection - const double intersection_epsilon = 1.0e-30; - - //------------------------------------------------------------cross_product - AGG_INLINE double cross_product(double x1, double y1, - double x2, double y2, - double x, double y) - { - return (x - x2) * (y2 - y1) - (y - y2) * (x2 - x1); - } - - //--------------------------------------------------------point_in_triangle - AGG_INLINE bool point_in_triangle(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x, double y) - { - bool cp1 = cross_product(x1, y1, x2, y2, x, y) < 0.0; - bool cp2 = cross_product(x2, y2, x3, y3, x, y) < 0.0; - bool cp3 = cross_product(x3, y3, x1, y1, x, y) < 0.0; - return cp1 == cp2 && cp2 == cp3 && cp3 == cp1; - } - - //-----------------------------------------------------------calc_distance - AGG_INLINE double calc_distance(double x1, double y1, double x2, double y2) - { - double dx = x2-x1; - double dy = y2-y1; - return sqrt(dx * dx + dy * dy); - } - - //--------------------------------------------------------calc_sq_distance - AGG_INLINE double calc_sq_distance(double x1, double y1, double x2, double y2) - { - double dx = x2-x1; - double dy = y2-y1; - return dx * dx + dy * dy; - } - - //------------------------------------------------calc_line_point_distance - AGG_INLINE double calc_line_point_distance(double x1, double y1, - double x2, double y2, - double x, double y) - { - double dx = x2-x1; - double dy = y2-y1; - double d = sqrt(dx * dx + dy * dy); - if(d < vertex_dist_epsilon) - { - return calc_distance(x1, y1, x, y); - } - return ((x - x2) * dy - (y - y2) * dx) / d; - } - - //-------------------------------------------------------calc_line_point_u - AGG_INLINE double calc_segment_point_u(double x1, double y1, - double x2, double y2, - double x, double y) - { - double dx = x2 - x1; - double dy = y2 - y1; - - if(dx == 0 && dy == 0) - { - return 0; - } - - double pdx = x - x1; - double pdy = y - y1; - - return (pdx * dx + pdy * dy) / (dx * dx + dy * dy); - } - - //---------------------------------------------calc_line_point_sq_distance - AGG_INLINE double calc_segment_point_sq_distance(double x1, double y1, - double x2, double y2, - double x, double y, - double u) - { - if(u <= 0) - { - return calc_sq_distance(x, y, x1, y1); - } - else - if(u >= 1) - { - return calc_sq_distance(x, y, x2, y2); - } - return calc_sq_distance(x, y, x1 + u * (x2 - x1), y1 + u * (y2 - y1)); - } - - //---------------------------------------------calc_line_point_sq_distance - AGG_INLINE double calc_segment_point_sq_distance(double x1, double y1, - double x2, double y2, - double x, double y) - { - return - calc_segment_point_sq_distance( - x1, y1, x2, y2, x, y, - calc_segment_point_u(x1, y1, x2, y2, x, y)); - } - - //-------------------------------------------------------calc_intersection - AGG_INLINE bool calc_intersection(double ax, double ay, double bx, double by, - double cx, double cy, double dx, double dy, - double* x, double* y) - { - double num = (ay-cy) * (dx-cx) - (ax-cx) * (dy-cy); - double den = (bx-ax) * (dy-cy) - (by-ay) * (dx-cx); - if(fabs(den) < intersection_epsilon) return false; - double r = num / den; - *x = ax + r * (bx-ax); - *y = ay + r * (by-ay); - return true; - } - - //-----------------------------------------------------intersection_exists - AGG_INLINE bool intersection_exists(double x1, double y1, double x2, double y2, - double x3, double y3, double x4, double y4) - { - // It's less expensive but you can't control the - // boundary conditions: Less or LessEqual - double dx1 = x2 - x1; - double dy1 = y2 - y1; - double dx2 = x4 - x3; - double dy2 = y4 - y3; - return ((x3 - x2) * dy1 - (y3 - y2) * dx1 < 0.0) != - ((x4 - x2) * dy1 - (y4 - y2) * dx1 < 0.0) && - ((x1 - x4) * dy2 - (y1 - y4) * dx2 < 0.0) != - ((x2 - x4) * dy2 - (y2 - y4) * dx2 < 0.0); - - // It's is more expensive but more flexible - // in terms of boundary conditions. - //-------------------- - //double den = (x2-x1) * (y4-y3) - (y2-y1) * (x4-x3); - //if(fabs(den) < intersection_epsilon) return false; - //double nom1 = (x4-x3) * (y1-y3) - (y4-y3) * (x1-x3); - //double nom2 = (x2-x1) * (y1-y3) - (y2-y1) * (x1-x3); - //double ua = nom1 / den; - //double ub = nom2 / den; - //return ua >= 0.0 && ua <= 1.0 && ub >= 0.0 && ub <= 1.0; - } - - //--------------------------------------------------------calc_orthogonal - AGG_INLINE void calc_orthogonal(double thickness, - double x1, double y1, - double x2, double y2, - double* x, double* y) - { - double dx = x2 - x1; - double dy = y2 - y1; - double d = sqrt(dx*dx + dy*dy); - *x = thickness * dy / d; - *y = -thickness * dx / d; - } - - //--------------------------------------------------------dilate_triangle - AGG_INLINE void dilate_triangle(double x1, double y1, - double x2, double y2, - double x3, double y3, - double *x, double* y, - double d) - { - double dx1=0.0; - double dy1=0.0; - double dx2=0.0; - double dy2=0.0; - double dx3=0.0; - double dy3=0.0; - double loc = cross_product(x1, y1, x2, y2, x3, y3); - if(fabs(loc) > intersection_epsilon) - { - if(cross_product(x1, y1, x2, y2, x3, y3) > 0.0) - { - d = -d; - } - calc_orthogonal(d, x1, y1, x2, y2, &dx1, &dy1); - calc_orthogonal(d, x2, y2, x3, y3, &dx2, &dy2); - calc_orthogonal(d, x3, y3, x1, y1, &dx3, &dy3); - } - *x++ = x1 + dx1; *y++ = y1 + dy1; - *x++ = x2 + dx1; *y++ = y2 + dy1; - *x++ = x2 + dx2; *y++ = y2 + dy2; - *x++ = x3 + dx2; *y++ = y3 + dy2; - *x++ = x3 + dx3; *y++ = y3 + dy3; - *x++ = x1 + dx3; *y++ = y1 + dy3; - } - - //------------------------------------------------------calc_triangle_area - AGG_INLINE double calc_triangle_area(double x1, double y1, - double x2, double y2, - double x3, double y3) - { - return (x1*y2 - x2*y1 + x2*y3 - x3*y2 + x3*y1 - x1*y3) * 0.5; - } - - //-------------------------------------------------------calc_polygon_area - template double calc_polygon_area(const Storage& st) - { - unsigned i; - double sum = 0.0; - double x = st[0].x; - double y = st[0].y; - double xs = x; - double ys = y; - - for(i = 1; i < st.size(); i++) - { - const typename Storage::value_type& v = st[i]; - sum += x * v.y - y * v.x; - x = v.x; - y = v.y; - } - return (sum + x * ys - y * xs) * 0.5; - } - - //------------------------------------------------------------------------ - // Tables for fast sqrt - extern int16u g_sqrt_table[1024]; - extern int8 g_elder_bit_table[256]; - - - //---------------------------------------------------------------fast_sqrt - //Fast integer Sqrt - really fast: no cycles, divisions or multiplications - #if defined(_MSC_VER) - #pragma warning(push) - #pragma warning(disable : 4035) //Disable warning "no return value" - #endif - AGG_INLINE unsigned fast_sqrt(unsigned val) - { - #if defined(_M_IX86) && defined(_MSC_VER) && !defined(AGG_NO_ASM) - //For Ix86 family processors this assembler code is used. - //The key command here is bsr - determination the number of the most - //significant bit of the value. For other processors - //(and maybe compilers) the pure C "#else" section is used. - __asm - { - mov ebx, val - mov edx, 11 - bsr ecx, ebx - sub ecx, 9 - jle less_than_9_bits - shr ecx, 1 - adc ecx, 0 - sub edx, ecx - shl ecx, 1 - shr ebx, cl - less_than_9_bits: - xor eax, eax - mov ax, g_sqrt_table[ebx*2] - mov ecx, edx - shr eax, cl - } - #else - - //This code is actually pure C and portable to most - //arcitectures including 64bit ones. - unsigned t = val; - int bit=0; - unsigned shift = 11; - - //The following piece of code is just an emulation of the - //Ix86 assembler command "bsr" (see above). However on old - //Intels (like Intel MMX 233MHz) this code is about twice - //faster (sic!) then just one "bsr". On PIII and PIV the - //bsr is optimized quite well. - bit = t >> 24; - if(bit) - { - bit = g_elder_bit_table[bit] + 24; - } - else - { - bit = (t >> 16) & 0xFF; - if(bit) - { - bit = g_elder_bit_table[bit] + 16; - } - else - { - bit = (t >> 8) & 0xFF; - if(bit) - { - bit = g_elder_bit_table[bit] + 8; - } - else - { - bit = g_elder_bit_table[t]; - } - } - } - - //This code calculates the sqrt. - bit -= 9; - if(bit > 0) - { - bit = (bit >> 1) + (bit & 1); - shift -= bit; - val >>= (bit << 1); - } - return g_sqrt_table[val] >> shift; - #endif - } - #if defined(_MSC_VER) - #pragma warning(pop) - #endif - - - - - //--------------------------------------------------------------------besj - // Function BESJ calculates Bessel function of first kind of order n - // Arguments: - // n - an integer (>=0), the order - // x - value at which the Bessel function is required - //-------------------- - // C++ Mathematical Library - // Convereted from equivalent FORTRAN library - // Converetd by Gareth Walker for use by course 392 computational project - // All functions tested and yield the same results as the corresponding - // FORTRAN versions. - // - // If you have any problems using these functions please report them to - // M.Muldoon@UMIST.ac.uk - // - // Documentation available on the web - // http://www.ma.umist.ac.uk/mrm/Teaching/392/libs/392.html - // Version 1.0 8/98 - // 29 October, 1999 - //-------------------- - // Adapted for use in AGG library by Andy Wilk (castor.vulgaris@gmail.com) - //------------------------------------------------------------------------ - inline double besj(double x, int n) - { - if(n < 0) - { - return 0; - } - double d = 1E-6; - double b = 0; - if(fabs(x) <= d) - { - if(n != 0) return 0; - return 1; - } - double b1 = 0; // b1 is the value from the previous iteration - // Set up a starting order for recurrence - int m1 = (int)fabs(x) + 6; - if(fabs(x) > 5) - { - m1 = (int)(fabs(1.4 * x + 60 / x)); - } - int m2 = (int)(n + 2 + fabs(x) / 4); - if (m1 > m2) - { - m2 = m1; - } - - // Apply recurrence down from curent max order - for(;;) - { - double c3 = 0; - double c2 = 1E-30; - double c4 = 0; - int m8 = 1; - if (m2 / 2 * 2 == m2) - { - m8 = -1; - } - int imax = m2 - 2; - for (int i = 1; i <= imax; i++) - { - double c6 = 2 * (m2 - i) * c2 / x - c3; - c3 = c2; - c2 = c6; - if(m2 - i - 1 == n) - { - b = c6; - } - m8 = -1 * m8; - if (m8 > 0) - { - c4 = c4 + 2 * c6; - } - } - double c6 = 2 * c2 / x - c3; - if(n == 0) - { - b = c6; - } - c4 += c6; - b /= c4; - if(fabs(b - b1) < d) - { - return b; - } - b1 = b; - m2 += 3; - } - } - -} - - -#endif diff --git a/uppdev/agg24/agg_math_stroke.h b/uppdev/agg24/agg_math_stroke.h deleted file mode 100644 index 4806dcd4b..000000000 --- a/uppdev/agg24/agg_math_stroke.h +++ /dev/null @@ -1,526 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Stroke math -// -//---------------------------------------------------------------------------- - -#ifndef AGG_STROKE_MATH_INCLUDED -#define AGG_STROKE_MATH_INCLUDED - -#include "agg_math.h" -#include "agg_vertex_sequence.h" - -namespace agg -{ - //-------------------------------------------------------------line_cap_e - enum line_cap_e - { - butt_cap, - square_cap, - round_cap - }; - - //------------------------------------------------------------line_join_e - enum line_join_e - { - miter_join = 0, - miter_join_revert = 1, - round_join = 2, - bevel_join = 3, - miter_join_round = 4 - }; - - - //-----------------------------------------------------------inner_join_e - enum inner_join_e - { - inner_bevel, - inner_miter, - inner_jag, - inner_round - }; - - //------------------------------------------------------------math_stroke - template class math_stroke - { - public: - typedef typename VertexConsumer::value_type coord_type; - - math_stroke(); - - void line_cap(line_cap_e lc) { m_line_cap = lc; } - void line_join(line_join_e lj) { m_line_join = lj; } - void inner_join(inner_join_e ij) { m_inner_join = ij; } - - line_cap_e line_cap() const { return m_line_cap; } - line_join_e line_join() const { return m_line_join; } - inner_join_e inner_join() const { return m_inner_join; } - - void width(double w); - void miter_limit(double ml) { m_miter_limit = ml; } - void miter_limit_theta(double t); - void inner_miter_limit(double ml) { m_inner_miter_limit = ml; } - void approximation_scale(double as) { m_approx_scale = as; } - - double width() const { return m_width * 2.0; } - double miter_limit() const { return m_miter_limit; } - double inner_miter_limit() const { return m_inner_miter_limit; } - double approximation_scale() const { return m_approx_scale; } - - void calc_cap(VertexConsumer& vc, - const vertex_dist& v0, - const vertex_dist& v1, - double len); - - void calc_join(VertexConsumer& vc, - const vertex_dist& v0, - const vertex_dist& v1, - const vertex_dist& v2, - double len1, - double len2); - - private: - AGG_INLINE void add_vertex(VertexConsumer& vc, double x, double y) - { - vc.add(coord_type(x, y)); - } - - void calc_arc(VertexConsumer& vc, - double x, double y, - double dx1, double dy1, - double dx2, double dy2); - - void calc_miter(VertexConsumer& vc, - const vertex_dist& v0, - const vertex_dist& v1, - const vertex_dist& v2, - double dx1, double dy1, - double dx2, double dy2, - line_join_e lj, - double mlimit, - double dbevel); - - double m_width; - double m_width_abs; - double m_width_eps; - int m_width_sign; - double m_miter_limit; - double m_inner_miter_limit; - double m_approx_scale; - line_cap_e m_line_cap; - line_join_e m_line_join; - inner_join_e m_inner_join; - }; - - //----------------------------------------------------------------------- - template math_stroke::math_stroke() : - m_width(0.5), - m_width_abs(0.5), - m_width_eps(0.5/1024.0), - m_width_sign(1), - m_miter_limit(4.0), - m_inner_miter_limit(1.01), - m_approx_scale(1.0), - m_line_cap(butt_cap), - m_line_join(miter_join), - m_inner_join(inner_miter) - { - } - - //----------------------------------------------------------------------- - template void math_stroke::width(double w) - { - m_width = w * 0.5; - if(m_width < 0) - { - m_width_abs = -m_width; - m_width_sign = -1; - } - else - { - m_width_abs = m_width; - m_width_sign = 1; - } - m_width_eps = m_width / 1024.0; - } - - //----------------------------------------------------------------------- - template void math_stroke::miter_limit_theta(double t) - { - m_miter_limit = 1.0 / sin(t * 0.5) ; - } - - //----------------------------------------------------------------------- - template - void math_stroke::calc_arc(VC& vc, - double x, double y, - double dx1, double dy1, - double dx2, double dy2) - { - double a1 = atan2(dy1 * m_width_sign, dx1 * m_width_sign); - double a2 = atan2(dy2 * m_width_sign, dx2 * m_width_sign); - double da = a1 - a2; - int i, n; - - da = acos(m_width_abs / (m_width_abs + 0.125 / m_approx_scale)) * 2; - - add_vertex(vc, x + dx1, y + dy1); - if(m_width_sign > 0) - { - if(a1 > a2) a2 += 2 * pi; - n = int((a2 - a1) / da); - da = (a2 - a1) / (n + 1); - a1 += da; - for(i = 0; i < n; i++) - { - add_vertex(vc, x + cos(a1) * m_width, y + sin(a1) * m_width); - a1 += da; - } - } - else - { - if(a1 < a2) a2 -= 2 * pi; - n = int((a1 - a2) / da); - da = (a1 - a2) / (n + 1); - a1 -= da; - for(i = 0; i < n; i++) - { - add_vertex(vc, x + cos(a1) * m_width, y + sin(a1) * m_width); - a1 -= da; - } - } - add_vertex(vc, x + dx2, y + dy2); - } - - //----------------------------------------------------------------------- - template - void math_stroke::calc_miter(VC& vc, - const vertex_dist& v0, - const vertex_dist& v1, - const vertex_dist& v2, - double dx1, double dy1, - double dx2, double dy2, - line_join_e lj, - double mlimit, - double dbevel) - { - double xi = v1.x; - double yi = v1.y; - double di = 1; - double lim = m_width_abs * mlimit; - bool miter_limit_exceeded = true; // Assume the worst - bool intersection_failed = true; // Assume the worst - - if(calc_intersection(v0.x + dx1, v0.y - dy1, - v1.x + dx1, v1.y - dy1, - v1.x + dx2, v1.y - dy2, - v2.x + dx2, v2.y - dy2, - &xi, &yi)) - { - // Calculation of the intersection succeeded - //--------------------- - di = calc_distance(v1.x, v1.y, xi, yi); - if(di <= lim) - { - // Inside the miter limit - //--------------------- - add_vertex(vc, xi, yi); - miter_limit_exceeded = false; - } - intersection_failed = false; - } - else - { - // Calculation of the intersection failed, most probably - // the three points lie one straight line. - // First check if v0 and v2 lie on the opposite sides of vector: - // (v1.x, v1.y) -> (v1.x+dx1, v1.y-dy1), that is, the perpendicular - // to the line determined by vertices v0 and v1. - // This condition determines whether the next line segments continues - // the previous one or goes back. - //---------------- - double x2 = v1.x + dx1; - double y2 = v1.y - dy1; - if((cross_product(v0.x, v0.y, v1.x, v1.y, x2, y2) < 0.0) == - (cross_product(v1.x, v1.y, v2.x, v2.y, x2, y2) < 0.0)) - { - // This case means that the next segment continues - // the previous one (straight line) - //----------------- - add_vertex(vc, v1.x + dx1, v1.y - dy1); - miter_limit_exceeded = false; - } - } - - if(miter_limit_exceeded) - { - // Miter limit exceeded - //------------------------ - switch(lj) - { - case miter_join_revert: - // For the compatibility with SVG, PDF, etc, - // we use a simple bevel join instead of - // "smart" bevel - //------------------- - add_vertex(vc, v1.x + dx1, v1.y - dy1); - add_vertex(vc, v1.x + dx2, v1.y - dy2); - break; - - case miter_join_round: - calc_arc(vc, v1.x, v1.y, dx1, -dy1, dx2, -dy2); - break; - - default: - // If no miter-revert, calculate new dx1, dy1, dx2, dy2 - //---------------- - if(intersection_failed) - { - mlimit *= m_width_sign; - add_vertex(vc, v1.x + dx1 + dy1 * mlimit, - v1.y - dy1 + dx1 * mlimit); - add_vertex(vc, v1.x + dx2 - dy2 * mlimit, - v1.y - dy2 - dx2 * mlimit); - } - else - { - double x1 = v1.x + dx1; - double y1 = v1.y - dy1; - double x2 = v1.x + dx2; - double y2 = v1.y - dy2; - di = (lim - dbevel) / (di - dbevel); - add_vertex(vc, x1 + (xi - x1) * di, - y1 + (yi - y1) * di); - add_vertex(vc, x2 + (xi - x2) * di, - y2 + (yi - y2) * di); - } - break; - } - } - } - - //--------------------------------------------------------stroke_calc_cap - template - void math_stroke::calc_cap(VC& vc, - const vertex_dist& v0, - const vertex_dist& v1, - double len) - { - vc.remove_all(); - - double dx1 = (v1.y - v0.y) / len; - double dy1 = (v1.x - v0.x) / len; - double dx2 = 0; - double dy2 = 0; - - dx1 *= m_width; - dy1 *= m_width; - - if(m_line_cap != round_cap) - { - if(m_line_cap == square_cap) - { - dx2 = dy1 * m_width_sign; - dy2 = dx1 * m_width_sign; - } - add_vertex(vc, v0.x - dx1 - dx2, v0.y + dy1 - dy2); - add_vertex(vc, v0.x + dx1 - dx2, v0.y - dy1 - dy2); - } - else - { - double da = acos(m_width_abs / (m_width_abs + 0.125 / m_approx_scale)) * 2; - double a1; - int i; - int n = int(pi / da); - - da = pi / (n + 1); - add_vertex(vc, v0.x - dx1, v0.y + dy1); - if(m_width_sign > 0) - { - a1 = atan2(dy1, -dx1); - a1 += da; - for(i = 0; i < n; i++) - { - add_vertex(vc, v0.x + cos(a1) * m_width, - v0.y + sin(a1) * m_width); - a1 += da; - } - } - else - { - a1 = atan2(-dy1, dx1); - a1 -= da; - for(i = 0; i < n; i++) - { - add_vertex(vc, v0.x + cos(a1) * m_width, - v0.y + sin(a1) * m_width); - a1 -= da; - } - } - add_vertex(vc, v0.x + dx1, v0.y - dy1); - } - } - - //----------------------------------------------------------------------- - template - void math_stroke::calc_join(VC& vc, - const vertex_dist& v0, - const vertex_dist& v1, - const vertex_dist& v2, - double len1, - double len2) - { - double dx1 = m_width * (v1.y - v0.y) / len1; - double dy1 = m_width * (v1.x - v0.x) / len1; - double dx2 = m_width * (v2.y - v1.y) / len2; - double dy2 = m_width * (v2.x - v1.x) / len2; - - vc.remove_all(); - - double cp = cross_product(v0.x, v0.y, v1.x, v1.y, v2.x, v2.y); - if(cp != 0 && (cp > 0) == (m_width > 0)) - { - // Inner join - //--------------- - double limit = ((len1 < len2) ? len1 : len2) / m_width_abs; - if(limit < m_inner_miter_limit) - { - limit = m_inner_miter_limit; - } - - switch(m_inner_join) - { - default: // inner_bevel - add_vertex(vc, v1.x + dx1, v1.y - dy1); - add_vertex(vc, v1.x + dx2, v1.y - dy2); - break; - - case inner_miter: - calc_miter(vc, - v0, v1, v2, dx1, dy1, dx2, dy2, - miter_join_revert, - limit, 0); - break; - - case inner_jag: - case inner_round: - cp = (dx1-dx2) * (dx1-dx2) + (dy1-dy2) * (dy1-dy2); - if(cp < len1 * len1 && cp < len2 * len2) - { - calc_miter(vc, - v0, v1, v2, dx1, dy1, dx2, dy2, - miter_join_revert, - limit, 0); - } - else - { - if(m_inner_join == inner_jag) - { - add_vertex(vc, v1.x + dx1, v1.y - dy1); - add_vertex(vc, v1.x, v1.y ); - add_vertex(vc, v1.x + dx2, v1.y - dy2); - } - else - { - add_vertex(vc, v1.x + dx1, v1.y - dy1); - add_vertex(vc, v1.x, v1.y ); - calc_arc(vc, v1.x, v1.y, dx2, -dy2, dx1, -dy1); - add_vertex(vc, v1.x, v1.y ); - add_vertex(vc, v1.x + dx2, v1.y - dy2); - } - } - break; - } - } - else - { - // Outer join - //--------------- - - // Calculate the distance between v1 and - // the central point of the bevel line segment - //--------------- - double dx = (dx1 + dx2) / 2; - double dy = (dy1 + dy2) / 2; - double dbevel = sqrt(dx * dx + dy * dy); - - if(m_line_join == round_join || m_line_join == bevel_join) - { - // This is an optimization that reduces the number of points - // in cases of almost collinear segments. If there's no - // visible difference between bevel and miter joins we'd rather - // use miter join because it adds only one point instead of two. - // - // Here we calculate the middle point between the bevel points - // and then, the distance between v1 and this middle point. - // At outer joins this distance always less than stroke width, - // because it's actually the height of an isosceles triangle of - // v1 and its two bevel points. If the difference between this - // width and this value is small (no visible bevel) we can - // add just one point. - // - // The constant in the expression makes the result approximately - // the same as in round joins and caps. You can safely comment - // out this entire "if". - //------------------- - if(m_approx_scale * (m_width_abs - dbevel) < m_width_eps) - { - if(calc_intersection(v0.x + dx1, v0.y - dy1, - v1.x + dx1, v1.y - dy1, - v1.x + dx2, v1.y - dy2, - v2.x + dx2, v2.y - dy2, - &dx, &dy)) - { - add_vertex(vc, dx, dy); - } - else - { - add_vertex(vc, v1.x + dx1, v1.y - dy1); - } - return; - } - } - - switch(m_line_join) - { - case miter_join: - case miter_join_revert: - case miter_join_round: - calc_miter(vc, - v0, v1, v2, dx1, dy1, dx2, dy2, - m_line_join, - m_miter_limit, - dbevel); - break; - - case round_join: - calc_arc(vc, v1.x, v1.y, dx1, -dy1, dx2, -dy2); - break; - - default: // Bevel join - add_vertex(vc, v1.x + dx1, v1.y - dy1); - add_vertex(vc, v1.x + dx2, v1.y - dy2); - break; - } - } - } - - - - -} - -#endif diff --git a/uppdev/agg24/agg_path_length.h b/uppdev/agg24/agg_path_length.h deleted file mode 100644 index 740ba31df..000000000 --- a/uppdev/agg24/agg_path_length.h +++ /dev/null @@ -1,65 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -#ifndef AGG_PATH_LENGTH_INCLUDED -#define AGG_PATH_LENGTH_INCLUDED - -#include "agg_math.h" - -namespace agg -{ - template - double path_length(VertexSource& vs, unsigned path_id = 0) - { - double len = 0.0; - double start_x = 0.0; - double start_y = 0.0; - double x1 = 0.0; - double y1 = 0.0; - double x2 = 0.0; - double y2 = 0.0; - bool first = true; - - unsigned cmd; - vs.rewind(path_id); - while(!is_stop(cmd = vs.vertex(&x2, &y2))) - { - if(is_vertex(cmd)) - { - if(first || is_move_to(cmd)) - { - start_x = x2; - start_y = y2; - } - else - { - len += calc_distance(x1, y1, x2, y2); - } - x1 = x2; - y1 = y2; - first = false; - } - else - { - if(is_close(cmd) && !first) - { - len += calc_distance(x1, y1, start_x, start_y); - } - } - } - return len; - } -} - -#endif diff --git a/uppdev/agg24/agg_path_storage.h b/uppdev/agg24/agg_path_storage.h deleted file mode 100644 index f4f754746..000000000 --- a/uppdev/agg24/agg_path_storage.h +++ /dev/null @@ -1,1545 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_PATH_STORAGE_INCLUDED -#define AGG_PATH_STORAGE_INCLUDED - -#include -#include -#include "agg_math.h" -#include "agg_array.h" -#include "agg_bezier_arc.h" - -namespace agg -{ - - - //----------------------------------------------------vertex_block_storage - template - class vertex_block_storage - { - public: - // Allocation parameters - enum block_scale_e - { - block_shift = BlockShift, - block_size = 1 << block_shift, - block_mask = block_size - 1, - block_pool = BlockPool - }; - - typedef T value_type; - typedef vertex_block_storage self_type; - - ~vertex_block_storage(); - vertex_block_storage(); - vertex_block_storage(const self_type& v); - const self_type& operator = (const self_type& ps); - - void remove_all(); - void free_all(); - - void add_vertex(double x, double y, unsigned cmd); - void modify_vertex(unsigned idx, double x, double y); - void modify_vertex(unsigned idx, double x, double y, unsigned cmd); - void modify_command(unsigned idx, unsigned cmd); - void swap_vertices(unsigned v1, unsigned v2); - - unsigned last_command() const; - unsigned last_vertex(double* x, double* y) const; - unsigned prev_vertex(double* x, double* y) const; - - double last_x() const; - double last_y() const; - - unsigned total_vertices() const; - unsigned vertex(unsigned idx, double* x, double* y) const; - unsigned command(unsigned idx) const; - - private: - void allocate_block(unsigned nb); - int8u* storage_ptrs(T** xy_ptr); - - private: - unsigned m_total_vertices; - unsigned m_total_blocks; - unsigned m_max_blocks; - T** m_coord_blocks; - int8u** m_cmd_blocks; - }; - - - //------------------------------------------------------------------------ - template - void vertex_block_storage::free_all() - { - if(m_total_blocks) - { - T** coord_blk = m_coord_blocks + m_total_blocks - 1; - while(m_total_blocks--) - { - pod_allocator::deallocate( - *coord_blk, - block_size * 2 + - block_size / (sizeof(T) / sizeof(unsigned char))); - --coord_blk; - } - pod_allocator::deallocate(m_coord_blocks, m_max_blocks * 2); - m_total_blocks = 0; - m_max_blocks = 0; - m_coord_blocks = 0; - m_cmd_blocks = 0; - m_total_vertices = 0; - } - } - - //------------------------------------------------------------------------ - template - vertex_block_storage::~vertex_block_storage() - { - free_all(); - } - - //------------------------------------------------------------------------ - template - vertex_block_storage::vertex_block_storage() : - m_total_vertices(0), - m_total_blocks(0), - m_max_blocks(0), - m_coord_blocks(0), - m_cmd_blocks(0) - { - } - - //------------------------------------------------------------------------ - template - vertex_block_storage::vertex_block_storage(const vertex_block_storage& v) : - m_total_vertices(0), - m_total_blocks(0), - m_max_blocks(0), - m_coord_blocks(0), - m_cmd_blocks(0) - { - *this = v; - } - - //------------------------------------------------------------------------ - template - const vertex_block_storage& - vertex_block_storage::operator = (const vertex_block_storage& v) - { - remove_all(); - unsigned i; - for(i = 0; i < v.total_vertices(); i++) - { - double x, y; - unsigned cmd = v.vertex(i, &x, &y); - add_vertex(x, y, cmd); - } - return *this; - } - - //------------------------------------------------------------------------ - template - inline void vertex_block_storage::remove_all() - { - m_total_vertices = 0; - } - - //------------------------------------------------------------------------ - template - inline void vertex_block_storage::add_vertex(double x, double y, - unsigned cmd) - { - T* coord_ptr = 0; - *storage_ptrs(&coord_ptr) = (int8u)cmd; - coord_ptr[0] = T(x); - coord_ptr[1] = T(y); - m_total_vertices++; - } - - //------------------------------------------------------------------------ - template - inline void vertex_block_storage::modify_vertex(unsigned idx, - double x, double y) - { - T* pv = m_coord_blocks[idx >> block_shift] + ((idx & block_mask) << 1); - pv[0] = T(x); - pv[1] = T(y); - } - - //------------------------------------------------------------------------ - template - inline void vertex_block_storage::modify_vertex(unsigned idx, - double x, double y, - unsigned cmd) - { - unsigned block = idx >> block_shift; - unsigned offset = idx & block_mask; - T* pv = m_coord_blocks[block] + (offset << 1); - pv[0] = T(x); - pv[1] = T(y); - m_cmd_blocks[block][offset] = (int8u)cmd; - } - - //------------------------------------------------------------------------ - template - inline void vertex_block_storage::modify_command(unsigned idx, - unsigned cmd) - { - m_cmd_blocks[idx >> block_shift][idx & block_mask] = (int8u)cmd; - } - - //------------------------------------------------------------------------ - template - inline void vertex_block_storage::swap_vertices(unsigned v1, unsigned v2) - { - unsigned b1 = v1 >> block_shift; - unsigned b2 = v2 >> block_shift; - unsigned o1 = v1 & block_mask; - unsigned o2 = v2 & block_mask; - T* pv1 = m_coord_blocks[b1] + (o1 << 1); - T* pv2 = m_coord_blocks[b2] + (o2 << 1); - T val; - val = pv1[0]; pv1[0] = pv2[0]; pv2[0] = val; - val = pv1[1]; pv1[1] = pv2[1]; pv2[1] = val; - int8u cmd = m_cmd_blocks[b1][o1]; - m_cmd_blocks[b1][o1] = m_cmd_blocks[b2][o2]; - m_cmd_blocks[b2][o2] = cmd; - } - - //------------------------------------------------------------------------ - template - inline unsigned vertex_block_storage::last_command() const - { - if(m_total_vertices) return command(m_total_vertices - 1); - return path_cmd_stop; - } - - //------------------------------------------------------------------------ - template - inline unsigned vertex_block_storage::last_vertex(double* x, double* y) const - { - if(m_total_vertices) return vertex(m_total_vertices - 1, x, y); - return path_cmd_stop; - } - - //------------------------------------------------------------------------ - template - inline unsigned vertex_block_storage::prev_vertex(double* x, double* y) const - { - if(m_total_vertices > 1) return vertex(m_total_vertices - 2, x, y); - return path_cmd_stop; - } - - //------------------------------------------------------------------------ - template - inline double vertex_block_storage::last_x() const - { - if(m_total_vertices) - { - unsigned idx = m_total_vertices - 1; - return m_coord_blocks[idx >> block_shift][(idx & block_mask) << 1]; - } - return 0.0; - } - - //------------------------------------------------------------------------ - template - inline double vertex_block_storage::last_y() const - { - if(m_total_vertices) - { - unsigned idx = m_total_vertices - 1; - return m_coord_blocks[idx >> block_shift][((idx & block_mask) << 1) + 1]; - } - return 0.0; - } - - //------------------------------------------------------------------------ - template - inline unsigned vertex_block_storage::total_vertices() const - { - return m_total_vertices; - } - - //------------------------------------------------------------------------ - template - inline unsigned vertex_block_storage::vertex(unsigned idx, - double* x, double* y) const - { - unsigned nb = idx >> block_shift; - const T* pv = m_coord_blocks[nb] + ((idx & block_mask) << 1); - *x = pv[0]; - *y = pv[1]; - return m_cmd_blocks[nb][idx & block_mask]; - } - - //------------------------------------------------------------------------ - template - inline unsigned vertex_block_storage::command(unsigned idx) const - { - return m_cmd_blocks[idx >> block_shift][idx & block_mask]; - } - - //------------------------------------------------------------------------ - template - void vertex_block_storage::allocate_block(unsigned nb) - { - if(nb >= m_max_blocks) - { - T** new_coords = - pod_allocator::allocate((m_max_blocks + block_pool) * 2); - - unsigned char** new_cmds = - (unsigned char**)(new_coords + m_max_blocks + block_pool); - - if(m_coord_blocks) - { - memcpy(new_coords, - m_coord_blocks, - m_max_blocks * sizeof(T*)); - - memcpy(new_cmds, - m_cmd_blocks, - m_max_blocks * sizeof(unsigned char*)); - - pod_allocator::deallocate(m_coord_blocks, m_max_blocks * 2); - } - m_coord_blocks = new_coords; - m_cmd_blocks = new_cmds; - m_max_blocks += block_pool; - } - m_coord_blocks[nb] = - pod_allocator::allocate(block_size * 2 + - block_size / (sizeof(T) / sizeof(unsigned char))); - - m_cmd_blocks[nb] = - (unsigned char*)(m_coord_blocks[nb] + block_size * 2); - - m_total_blocks++; - } - - //------------------------------------------------------------------------ - template - int8u* vertex_block_storage::storage_ptrs(T** xy_ptr) - { - unsigned nb = m_total_vertices >> block_shift; - if(nb >= m_total_blocks) - { - allocate_block(nb); - } - *xy_ptr = m_coord_blocks[nb] + ((m_total_vertices & block_mask) << 1); - return m_cmd_blocks[nb] + (m_total_vertices & block_mask); - } - - - - - //-----------------------------------------------------poly_plain_adaptor - template class poly_plain_adaptor - { - public: - typedef T value_type; - - poly_plain_adaptor() : - m_data(0), - m_ptr(0), - m_end(0), - m_closed(false), - m_stop(false) - {} - - poly_plain_adaptor(const T* data, unsigned num_points, bool closed) : - m_data(data), - m_ptr(data), - m_end(data + num_points * 2), - m_closed(closed), - m_stop(false) - {} - - void init(const T* data, unsigned num_points, bool closed) - { - m_data = data; - m_ptr = data; - m_end = data + num_points * 2; - m_closed = closed; - m_stop = false; - } - - void rewind(unsigned) - { - m_ptr = m_data; - m_stop = false; - } - - unsigned vertex(double* x, double* y) - { - if(m_ptr < m_end) - { - bool first = m_ptr == m_data; - *x = *m_ptr++; - *y = *m_ptr++; - return first ? path_cmd_move_to : path_cmd_line_to; - } - *x = *y = 0.0; - if(m_closed && !m_stop) - { - m_stop = true; - return path_cmd_end_poly | path_flags_close; - } - return path_cmd_stop; - } - - private: - const T* m_data; - const T* m_ptr; - const T* m_end; - bool m_closed; - bool m_stop; - }; - - - - - - //-------------------------------------------------poly_container_adaptor - template class poly_container_adaptor - { - public: - typedef typename Container::value_type vertex_type; - - poly_container_adaptor() : - m_container(0), - m_index(0), - m_closed(false), - m_stop(false) - {} - - poly_container_adaptor(const Container& data, bool closed) : - m_container(&data), - m_index(0), - m_closed(closed), - m_stop(false) - {} - - void init(const Container& data, bool closed) - { - m_container = &data; - m_index = 0; - m_closed = closed; - m_stop = false; - } - - void rewind(unsigned) - { - m_index = 0; - m_stop = false; - } - - unsigned vertex(double* x, double* y) - { - if(m_index < m_container->size()) - { - bool first = m_index == 0; - const vertex_type& v = (*m_container)[m_index++]; - *x = v.x; - *y = v.y; - return first ? path_cmd_move_to : path_cmd_line_to; - } - *x = *y = 0.0; - if(m_closed && !m_stop) - { - m_stop = true; - return path_cmd_end_poly | path_flags_close; - } - return path_cmd_stop; - } - - private: - const Container* m_container; - unsigned m_index; - bool m_closed; - bool m_stop; - }; - - - - //-----------------------------------------poly_container_reverse_adaptor - template class poly_container_reverse_adaptor - { - public: - typedef typename Container::value_type vertex_type; - - poly_container_reverse_adaptor() : - m_container(0), - m_index(-1), - m_closed(false), - m_stop(false) - {} - - poly_container_reverse_adaptor(const Container& data, bool closed) : - m_container(&data), - m_index(-1), - m_closed(closed), - m_stop(false) - {} - - void init(const Container& data, bool closed) - { - m_container = &data; - m_index = m_container->size() - 1; - m_closed = closed; - m_stop = false; - } - - void rewind(unsigned) - { - m_index = m_container->size() - 1; - m_stop = false; - } - - unsigned vertex(double* x, double* y) - { - if(m_index >= 0) - { - bool first = m_index == int(m_container->size() - 1); - const vertex_type& v = (*m_container)[m_index--]; - *x = v.x; - *y = v.y; - return first ? path_cmd_move_to : path_cmd_line_to; - } - *x = *y = 0.0; - if(m_closed && !m_stop) - { - m_stop = true; - return path_cmd_end_poly | path_flags_close; - } - return path_cmd_stop; - } - - private: - const Container* m_container; - int m_index; - bool m_closed; - bool m_stop; - }; - - - - - - //--------------------------------------------------------line_adaptor - class line_adaptor - { - public: - typedef double value_type; - - line_adaptor() : m_line(m_coord, 2, false) {} - line_adaptor(double x1, double y1, double x2, double y2) : - m_line(m_coord, 2, false) - { - m_coord[0] = x1; - m_coord[1] = y1; - m_coord[2] = x2; - m_coord[3] = y2; - } - - void init(double x1, double y1, double x2, double y2) - { - m_coord[0] = x1; - m_coord[1] = y1; - m_coord[2] = x2; - m_coord[3] = y2; - m_line.rewind(0); - } - - void rewind(unsigned) - { - m_line.rewind(0); - } - - unsigned vertex(double* x, double* y) - { - return m_line.vertex(x, y); - } - - private: - double m_coord[4]; - poly_plain_adaptor m_line; - }; - - - - - - - - - - - - - - //---------------------------------------------------------------path_base - // A container to store vertices with their flags. - // A path consists of a number of contours separated with "move_to" - // commands. The path storage can keep and maintain more than one - // path. - // To navigate to the beginning of a particular path, use rewind(path_id); - // Where path_id is what start_new_path() returns. So, when you call - // start_new_path() you need to store its return value somewhere else - // to navigate to the path afterwards. - // - // See also: vertex_source concept - //------------------------------------------------------------------------ - template class path_base - { - public: - typedef VertexContainer container_type; - typedef path_base self_type; - - //-------------------------------------------------------------------- - path_base() : m_vertices(), m_iterator(0) {} - void remove_all() { m_vertices.remove_all(); m_iterator = 0; } - void free_all() { m_vertices.free_all(); m_iterator = 0; } - - // Make path functions - //-------------------------------------------------------------------- - unsigned start_new_path(); - - void move_to(double x, double y); - void move_rel(double dx, double dy); - - void line_to(double x, double y); - void line_rel(double dx, double dy); - - void hline_to(double x); - void hline_rel(double dx); - - void vline_to(double y); - void vline_rel(double dy); - - void arc_to(double rx, double ry, - double angle, - bool large_arc_flag, - bool sweep_flag, - double x, double y); - - void arc_rel(double rx, double ry, - double angle, - bool large_arc_flag, - bool sweep_flag, - double dx, double dy); - - void curve3(double x_ctrl, double y_ctrl, - double x_to, double y_to); - - void curve3_rel(double dx_ctrl, double dy_ctrl, - double dx_to, double dy_to); - - void curve3(double x_to, double y_to); - - void curve3_rel(double dx_to, double dy_to); - - void curve4(double x_ctrl1, double y_ctrl1, - double x_ctrl2, double y_ctrl2, - double x_to, double y_to); - - void curve4_rel(double dx_ctrl1, double dy_ctrl1, - double dx_ctrl2, double dy_ctrl2, - double dx_to, double dy_to); - - void curve4(double x_ctrl2, double y_ctrl2, - double x_to, double y_to); - - void curve4_rel(double x_ctrl2, double y_ctrl2, - double x_to, double y_to); - - - void end_poly(unsigned flags = path_flags_close); - void close_polygon(unsigned flags = path_flags_none); - - // Accessors - //-------------------------------------------------------------------- - const container_type& vertices() const { return m_vertices; } - container_type& vertices() { return m_vertices; } - - unsigned total_vertices() const; - - void rel_to_abs(double* x, double* y) const; - - unsigned last_vertex(double* x, double* y) const; - unsigned prev_vertex(double* x, double* y) const; - - double last_x() const; - double last_y() const; - - unsigned vertex(unsigned idx, double* x, double* y) const; - unsigned command(unsigned idx) const; - - void modify_vertex(unsigned idx, double x, double y); - void modify_vertex(unsigned idx, double x, double y, unsigned cmd); - void modify_command(unsigned idx, unsigned cmd); - - // VertexSource interface - //-------------------------------------------------------------------- - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - // Arrange the orientation of a polygon, all polygons in a path, - // or in all paths. After calling arrange_orientations() or - // arrange_orientations_all_paths(), all the polygons will have - // the same orientation, i.e. path_flags_cw or path_flags_ccw - //-------------------------------------------------------------------- - unsigned arrange_polygon_orientation(unsigned start, path_flags_e orientation); - unsigned arrange_orientations(unsigned path_id, path_flags_e orientation); - void arrange_orientations_all_paths(path_flags_e orientation); - void invert_polygon(unsigned start); - - // Flip all vertices horizontally or vertically, - // between x1 and x2, or between y1 and y2 respectively - //-------------------------------------------------------------------- - void flip_x(double x1, double x2); - void flip_y(double y1, double y2); - - // Concatenate path. The path is added as is. - //-------------------------------------------------------------------- - template - void concat_path(VertexSource& vs, unsigned path_id = 0) - { - double x, y; - unsigned cmd; - vs.rewind(path_id); - while(!is_stop(cmd = vs.vertex(&x, &y))) - { - m_vertices.add_vertex(x, y, cmd); - } - } - - //-------------------------------------------------------------------- - // Join path. The path is joined with the existing one, that is, - // it behaves as if the pen of a plotter was always down (drawing) - template - void join_path(VertexSource& vs, unsigned path_id = 0) - { - double x, y; - unsigned cmd; - vs.rewind(path_id); - cmd = vs.vertex(&x, &y); - if(!is_stop(cmd)) - { - if(is_vertex(cmd)) - { - double x0, y0; - unsigned cmd0 = last_vertex(&x0, &y0); - if(is_vertex(cmd0)) - { - if(calc_distance(x, y, x0, y0) > vertex_dist_epsilon) - { - if(is_move_to(cmd)) cmd = path_cmd_line_to; - m_vertices.add_vertex(x, y, cmd); - } - } - else - { - if(is_stop(cmd0)) - { - cmd = path_cmd_move_to; - } - else - { - if(is_move_to(cmd)) cmd = path_cmd_line_to; - } - m_vertices.add_vertex(x, y, cmd); - } - } - while(!is_stop(cmd = vs.vertex(&x, &y))) - { - m_vertices.add_vertex(x, y, is_move_to(cmd) ? - unsigned(path_cmd_line_to) : - cmd); - } - } - } - - // Concatenate polygon/polyline. - //-------------------------------------------------------------------- - template void concat_poly(const T* data, - unsigned num_points, - bool closed) - { - poly_plain_adaptor poly(data, num_points, closed); - concat_path(poly); - } - - // Join polygon/polyline continuously. - //-------------------------------------------------------------------- - template void join_poly(const T* data, - unsigned num_points, - bool closed) - { - poly_plain_adaptor poly(data, num_points, closed); - join_path(poly); - } - - //-------------------------------------------------------------------- - void translate(double dx, double dy, unsigned path_id=0); - void translate_all_paths(double dx, double dy); - - //-------------------------------------------------------------------- - template - void transform(const Trans& trans, unsigned path_id=0) - { - unsigned num_ver = m_vertices.total_vertices(); - for(; path_id < num_ver; path_id++) - { - double x, y; - unsigned cmd = m_vertices.vertex(path_id, &x, &y); - if(is_stop(cmd)) break; - if(is_vertex(cmd)) - { - trans.transform(&x, &y); - m_vertices.modify_vertex(path_id, x, y); - } - } - } - - //-------------------------------------------------------------------- - template - void transform_all_paths(const Trans& trans) - { - unsigned idx; - unsigned num_ver = m_vertices.total_vertices(); - for(idx = 0; idx < num_ver; idx++) - { - double x, y; - if(is_vertex(m_vertices.vertex(idx, &x, &y))) - { - trans.transform(&x, &y); - m_vertices.modify_vertex(idx, x, y); - } - } - } - - - - private: - unsigned perceive_polygon_orientation(unsigned start, unsigned end); - void invert_polygon(unsigned start, unsigned end); - - VertexContainer m_vertices; - unsigned m_iterator; - }; - - //------------------------------------------------------------------------ - template - unsigned path_base::start_new_path() - { - if(!is_stop(m_vertices.last_command())) - { - m_vertices.add_vertex(0.0, 0.0, path_cmd_stop); - } - return m_vertices.total_vertices(); - } - - - //------------------------------------------------------------------------ - template - inline void path_base::rel_to_abs(double* x, double* y) const - { - if(m_vertices.total_vertices()) - { - double x2; - double y2; - if(is_vertex(m_vertices.last_vertex(&x2, &y2))) - { - *x += x2; - *y += y2; - } - } - } - - //------------------------------------------------------------------------ - template - inline void path_base::move_to(double x, double y) - { - m_vertices.add_vertex(x, y, path_cmd_move_to); - } - - //------------------------------------------------------------------------ - template - inline void path_base::move_rel(double dx, double dy) - { - rel_to_abs(&dx, &dy); - m_vertices.add_vertex(dx, dy, path_cmd_move_to); - } - - //------------------------------------------------------------------------ - template - inline void path_base::line_to(double x, double y) - { - m_vertices.add_vertex(x, y, path_cmd_line_to); - } - - //------------------------------------------------------------------------ - template - inline void path_base::line_rel(double dx, double dy) - { - rel_to_abs(&dx, &dy); - m_vertices.add_vertex(dx, dy, path_cmd_line_to); - } - - //------------------------------------------------------------------------ - template - inline void path_base::hline_to(double x) - { - m_vertices.add_vertex(x, last_y(), path_cmd_line_to); - } - - //------------------------------------------------------------------------ - template - inline void path_base::hline_rel(double dx) - { - double dy = 0; - rel_to_abs(&dx, &dy); - m_vertices.add_vertex(dx, dy, path_cmd_line_to); - } - - //------------------------------------------------------------------------ - template - inline void path_base::vline_to(double y) - { - m_vertices.add_vertex(last_x(), y, path_cmd_line_to); - } - - //------------------------------------------------------------------------ - template - inline void path_base::vline_rel(double dy) - { - double dx = 0; - rel_to_abs(&dx, &dy); - m_vertices.add_vertex(dx, dy, path_cmd_line_to); - } - - //------------------------------------------------------------------------ - template - void path_base::arc_to(double rx, double ry, - double angle, - bool large_arc_flag, - bool sweep_flag, - double x, double y) - { - if(m_vertices.total_vertices() && is_vertex(m_vertices.last_command())) - { - const double epsilon = 1e-30; - double x0 = 0.0; - double y0 = 0.0; - m_vertices.last_vertex(&x0, &y0); - - rx = fabs(rx); - ry = fabs(ry); - - // Ensure radii are valid - //------------------------- - if(rx < epsilon || ry < epsilon) - { - line_to(x, y); - return; - } - - if(calc_distance(x0, y0, x, y) < epsilon) - { - // If the endpoints (x, y) and (x0, y0) are identical, then this - // is equivalent to omitting the elliptical arc segment entirely. - return; - } - bezier_arc_svg a(x0, y0, rx, ry, angle, large_arc_flag, sweep_flag, x, y); - if(a.radii_ok()) - { - join_path(a); - } - else - { - line_to(x, y); - } - } - else - { - move_to(x, y); - } - } - - //------------------------------------------------------------------------ - template - void path_base::arc_rel(double rx, double ry, - double angle, - bool large_arc_flag, - bool sweep_flag, - double dx, double dy) - { - rel_to_abs(&dx, &dy); - arc_to(rx, ry, angle, large_arc_flag, sweep_flag, dx, dy); - } - - //------------------------------------------------------------------------ - template - void path_base::curve3(double x_ctrl, double y_ctrl, - double x_to, double y_to) - { - m_vertices.add_vertex(x_ctrl, y_ctrl, path_cmd_curve3); - m_vertices.add_vertex(x_to, y_to, path_cmd_curve3); - } - - //------------------------------------------------------------------------ - template - void path_base::curve3_rel(double dx_ctrl, double dy_ctrl, - double dx_to, double dy_to) - { - rel_to_abs(&dx_ctrl, &dy_ctrl); - rel_to_abs(&dx_to, &dy_to); - m_vertices.add_vertex(dx_ctrl, dy_ctrl, path_cmd_curve3); - m_vertices.add_vertex(dx_to, dy_to, path_cmd_curve3); - } - - //------------------------------------------------------------------------ - template - void path_base::curve3(double x_to, double y_to) - { - double x0; - double y0; - if(is_vertex(m_vertices.last_vertex(&x0, &y0))) - { - double x_ctrl; - double y_ctrl; - unsigned cmd = m_vertices.prev_vertex(&x_ctrl, &y_ctrl); - if(is_curve(cmd)) - { - x_ctrl = x0 + x0 - x_ctrl; - y_ctrl = y0 + y0 - y_ctrl; - } - else - { - x_ctrl = x0; - y_ctrl = y0; - } - curve3(x_ctrl, y_ctrl, x_to, y_to); - } - } - - //------------------------------------------------------------------------ - template - void path_base::curve3_rel(double dx_to, double dy_to) - { - rel_to_abs(&dx_to, &dy_to); - curve3(dx_to, dy_to); - } - - //------------------------------------------------------------------------ - template - void path_base::curve4(double x_ctrl1, double y_ctrl1, - double x_ctrl2, double y_ctrl2, - double x_to, double y_to) - { - m_vertices.add_vertex(x_ctrl1, y_ctrl1, path_cmd_curve4); - m_vertices.add_vertex(x_ctrl2, y_ctrl2, path_cmd_curve4); - m_vertices.add_vertex(x_to, y_to, path_cmd_curve4); - } - - //------------------------------------------------------------------------ - template - void path_base::curve4_rel(double dx_ctrl1, double dy_ctrl1, - double dx_ctrl2, double dy_ctrl2, - double dx_to, double dy_to) - { - rel_to_abs(&dx_ctrl1, &dy_ctrl1); - rel_to_abs(&dx_ctrl2, &dy_ctrl2); - rel_to_abs(&dx_to, &dy_to); - m_vertices.add_vertex(dx_ctrl1, dy_ctrl1, path_cmd_curve4); - m_vertices.add_vertex(dx_ctrl2, dy_ctrl2, path_cmd_curve4); - m_vertices.add_vertex(dx_to, dy_to, path_cmd_curve4); - } - - //------------------------------------------------------------------------ - template - void path_base::curve4(double x_ctrl2, double y_ctrl2, - double x_to, double y_to) - { - double x0; - double y0; - if(is_vertex(last_vertex(&x0, &y0))) - { - double x_ctrl1; - double y_ctrl1; - unsigned cmd = prev_vertex(&x_ctrl1, &y_ctrl1); - if(is_curve(cmd)) - { - x_ctrl1 = x0 + x0 - x_ctrl1; - y_ctrl1 = y0 + y0 - y_ctrl1; - } - else - { - x_ctrl1 = x0; - y_ctrl1 = y0; - } - curve4(x_ctrl1, y_ctrl1, x_ctrl2, y_ctrl2, x_to, y_to); - } - } - - //------------------------------------------------------------------------ - template - void path_base::curve4_rel(double dx_ctrl2, double dy_ctrl2, - double dx_to, double dy_to) - { - rel_to_abs(&dx_ctrl2, &dy_ctrl2); - rel_to_abs(&dx_to, &dy_to); - curve4(dx_ctrl2, dy_ctrl2, dx_to, dy_to); - } - - //------------------------------------------------------------------------ - template - inline void path_base::end_poly(unsigned flags) - { - if(is_vertex(m_vertices.last_command())) - { - m_vertices.add_vertex(0.0, 0.0, path_cmd_end_poly | flags); - } - } - - //------------------------------------------------------------------------ - template - inline void path_base::close_polygon(unsigned flags) - { - end_poly(path_flags_close | flags); - } - - //------------------------------------------------------------------------ - template - inline unsigned path_base::total_vertices() const - { - return m_vertices.total_vertices(); - } - - //------------------------------------------------------------------------ - template - inline unsigned path_base::last_vertex(double* x, double* y) const - { - return m_vertices.last_vertex(x, y); - } - - //------------------------------------------------------------------------ - template - inline unsigned path_base::prev_vertex(double* x, double* y) const - { - return m_vertices.prev_vertex(x, y); - } - - //------------------------------------------------------------------------ - template - inline double path_base::last_x() const - { - return m_vertices.last_x(); - } - - //------------------------------------------------------------------------ - template - inline double path_base::last_y() const - { - return m_vertices.last_y(); - } - - //------------------------------------------------------------------------ - template - inline unsigned path_base::vertex(unsigned idx, double* x, double* y) const - { - return m_vertices.vertex(idx, x, y); - } - - //------------------------------------------------------------------------ - template - inline unsigned path_base::command(unsigned idx) const - { - return m_vertices.command(idx); - } - - //------------------------------------------------------------------------ - template - void path_base::modify_vertex(unsigned idx, double x, double y) - { - m_vertices.modify_vertex(idx, x, y); - } - - //------------------------------------------------------------------------ - template - void path_base::modify_vertex(unsigned idx, double x, double y, unsigned cmd) - { - m_vertices.modify_vertex(idx, x, y, cmd); - } - - //------------------------------------------------------------------------ - template - void path_base::modify_command(unsigned idx, unsigned cmd) - { - m_vertices.modify_command(idx, cmd); - } - - //------------------------------------------------------------------------ - template - inline void path_base::rewind(unsigned path_id) - { - m_iterator = path_id; - } - - //------------------------------------------------------------------------ - template - inline unsigned path_base::vertex(double* x, double* y) - { - if(m_iterator >= m_vertices.total_vertices()) return path_cmd_stop; - return m_vertices.vertex(m_iterator++, x, y); - } - - //------------------------------------------------------------------------ - template - unsigned path_base::perceive_polygon_orientation(unsigned start, - unsigned end) - { - // Calculate signed area (double area to be exact) - //--------------------- - unsigned np = end - start; - double area = 0.0; - unsigned i; - for(i = 0; i < np; i++) - { - double x1, y1, x2, y2; - m_vertices.vertex(start + i, &x1, &y1); - m_vertices.vertex(start + (i + 1) % np, &x2, &y2); - area += x1 * y2 - y1 * x2; - } - return (area < 0.0) ? path_flags_cw : path_flags_ccw; - } - - //------------------------------------------------------------------------ - template - void path_base::invert_polygon(unsigned start, unsigned end) - { - unsigned i; - unsigned tmp_cmd = m_vertices.command(start); - - --end; // Make "end" inclusive - - // Shift all commands to one position - for(i = start; i < end; i++) - { - m_vertices.modify_command(i, m_vertices.command(i + 1)); - } - - // Assign starting command to the ending command - m_vertices.modify_command(end, tmp_cmd); - - // Reverse the polygon - while(end > start) - { - m_vertices.swap_vertices(start++, end--); - } - } - - //------------------------------------------------------------------------ - template - void path_base::invert_polygon(unsigned start) - { - // Skip all non-vertices at the beginning - while(start < m_vertices.total_vertices() && - !is_vertex(m_vertices.command(start))) ++start; - - // Skip all insignificant move_to - while(start+1 < m_vertices.total_vertices() && - is_move_to(m_vertices.command(start)) && - is_move_to(m_vertices.command(start+1))) ++start; - - // Find the last vertex - unsigned end = start + 1; - while(end < m_vertices.total_vertices() && - !is_next_poly(m_vertices.command(end))) ++end; - - invert_polygon(start, end); - } - - //------------------------------------------------------------------------ - template - unsigned path_base::arrange_polygon_orientation(unsigned start, - path_flags_e orientation) - { - if(orientation == path_flags_none) return start; - - // Skip all non-vertices at the beginning - while(start < m_vertices.total_vertices() && - !is_vertex(m_vertices.command(start))) ++start; - - // Skip all insignificant move_to - while(start+1 < m_vertices.total_vertices() && - is_move_to(m_vertices.command(start)) && - is_move_to(m_vertices.command(start+1))) ++start; - - // Find the last vertex - unsigned end = start + 1; - while(end < m_vertices.total_vertices() && - !is_next_poly(m_vertices.command(end))) ++end; - - if(end - start > 2) - { - if(perceive_polygon_orientation(start, end) != unsigned(orientation)) - { - // Invert polygon, set orientation flag, and skip all end_poly - invert_polygon(start, end); - unsigned cmd; - while(end < m_vertices.total_vertices() && - is_end_poly(cmd = m_vertices.command(end))) - { - m_vertices.modify_command(end++, set_orientation(cmd, orientation)); - } - } - } - return end; - } - - //------------------------------------------------------------------------ - template - unsigned path_base::arrange_orientations(unsigned start, - path_flags_e orientation) - { - if(orientation != path_flags_none) - { - while(start < m_vertices.total_vertices()) - { - start = arrange_polygon_orientation(start, orientation); - if(is_stop(m_vertices.command(start))) - { - ++start; - break; - } - } - } - return start; - } - - //------------------------------------------------------------------------ - template - void path_base::arrange_orientations_all_paths(path_flags_e orientation) - { - if(orientation != path_flags_none) - { - unsigned start = 0; - while(start < m_vertices.total_vertices()) - { - start = arrange_orientations(start, orientation); - } - } - } - - //------------------------------------------------------------------------ - template - void path_base::flip_x(double x1, double x2) - { - unsigned i; - double x, y; - for(i = 0; i < m_vertices.total_vertices(); i++) - { - unsigned cmd = m_vertices.vertex(i, &x, &y); - if(is_vertex(cmd)) - { - m_vertices.modify_vertex(i, x2 - x + x1, y); - } - } - } - - //------------------------------------------------------------------------ - template - void path_base::flip_y(double y1, double y2) - { - unsigned i; - double x, y; - for(i = 0; i < m_vertices.total_vertices(); i++) - { - unsigned cmd = m_vertices.vertex(i, &x, &y); - if(is_vertex(cmd)) - { - m_vertices.modify_vertex(i, x, y2 - y + y1); - } - } - } - - //------------------------------------------------------------------------ - template - void path_base::translate(double dx, double dy, unsigned path_id) - { - unsigned num_ver = m_vertices.total_vertices(); - for(; path_id < num_ver; path_id++) - { - double x, y; - unsigned cmd = m_vertices.vertex(path_id, &x, &y); - if(is_stop(cmd)) break; - if(is_vertex(cmd)) - { - x += dx; - y += dy; - m_vertices.modify_vertex(path_id, x, y); - } - } - } - - //------------------------------------------------------------------------ - template - void path_base::translate_all_paths(double dx, double dy) - { - unsigned idx; - unsigned num_ver = m_vertices.total_vertices(); - for(idx = 0; idx < num_ver; idx++) - { - double x, y; - if(is_vertex(m_vertices.vertex(idx, &x, &y))) - { - x += dx; - y += dy; - m_vertices.modify_vertex(idx, x, y); - } - } - } - - //-----------------------------------------------------vertex_stl_storage - template class vertex_stl_storage - { - public: - typedef typename Container::value_type vertex_type; - typedef typename vertex_type::value_type value_type; - - void remove_all() { m_vertices.clear(); } - void free_all() { m_vertices.clear(); } - - void add_vertex(double x, double y, unsigned cmd) - { - m_vertices.push_back(vertex_type(value_type(x), - value_type(y), - int8u(cmd))); - } - - void modify_vertex(unsigned idx, double x, double y) - { - vertex_type& v = m_vertices[idx]; - v.x = value_type(x); - v.y = value_type(y); - } - - void modify_vertex(unsigned idx, double x, double y, unsigned cmd) - { - vertex_type& v = m_vertices[idx]; - v.x = value_type(x); - v.y = value_type(y); - v.cmd = int8u(cmd); - } - - void modify_command(unsigned idx, unsigned cmd) - { - m_vertices[idx].cmd = int8u(cmd); - } - - void swap_vertices(unsigned v1, unsigned v2) - { - vertex_type t = m_vertices[v1]; - m_vertices[v1] = m_vertices[v2]; - m_vertices[v2] = t; - } - - unsigned last_command() const - { - return m_vertices.size() ? - m_vertices[m_vertices.size() - 1].cmd : - path_cmd_stop; - } - - unsigned last_vertex(double* x, double* y) const - { - if(m_vertices.size() == 0) - { - *x = *y = 0.0; - return path_cmd_stop; - } - return vertex(m_vertices.size() - 1, x, y); - } - - unsigned prev_vertex(double* x, double* y) const - { - if(m_vertices.size() < 2) - { - *x = *y = 0.0; - return path_cmd_stop; - } - return vertex(m_vertices.size() - 2, x, y); - } - - double last_x() const - { - return m_vertices.size() ? m_vertices[m_vertices.size() - 1].x : 0.0; - } - - double last_y() const - { - return m_vertices.size() ? m_vertices[m_vertices.size() - 1].y : 0.0; - } - - unsigned total_vertices() const - { - return m_vertices.size(); - } - - unsigned vertex(unsigned idx, double* x, double* y) const - { - const vertex_type& v = m_vertices[idx]; - *x = v.x; - *y = v.y; - return v.cmd; - } - - unsigned command(unsigned idx) const - { - return m_vertices[idx].cmd; - } - - private: - Container m_vertices; - }; - - //-----------------------------------------------------------path_storage - typedef path_base > path_storage; - - // Example of declarations path_storage with pod_bvector as a container - //----------------------------------------------------------------------- - //typedef path_base > > path_storage; - -} - - - -// Example of declarations path_storage with std::vector as a container -//--------------------------------------------------------------------------- -//#include -//namespace agg -//{ -// typedef path_base > > stl_path_storage; -//} - - - - -#endif diff --git a/uppdev/agg24/agg_path_storage_integer.h b/uppdev/agg24/agg_path_storage_integer.h deleted file mode 100644 index 7c4835599..000000000 --- a/uppdev/agg24/agg_path_storage_integer.h +++ /dev/null @@ -1,295 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_PATH_STORAGE_INTEGER_INCLUDED -#define AGG_PATH_STORAGE_INTEGER_INCLUDED - -#include -#include "agg_array.h" - -namespace agg -{ - //---------------------------------------------------------vertex_integer - template struct vertex_integer - { - enum path_cmd - { - cmd_move_to = 0, - cmd_line_to = 1, - cmd_curve3 = 2, - cmd_curve4 = 3 - }; - - enum coord_scale_e - { - coord_shift = CoordShift, - coord_scale = 1 << coord_shift - }; - - T x,y; - vertex_integer() {} - vertex_integer(T x_, T y_, unsigned flag) : - x(((x_ << 1) & ~1) | (flag & 1)), - y(((y_ << 1) & ~1) | (flag >> 1)) {} - - unsigned vertex(double* x_, double* y_, - double dx=0, double dy=0, - double scale=1.0) const - { - *x_ = dx + (double(x >> 1) / coord_scale) * scale; - *y_ = dy + (double(y >> 1) / coord_scale) * scale; - switch(((y & 1) << 1) | (x & 1)) - { - case cmd_move_to: return path_cmd_move_to; - case cmd_line_to: return path_cmd_line_to; - case cmd_curve3: return path_cmd_curve3; - case cmd_curve4: return path_cmd_curve4; - } - return path_cmd_stop; - } - }; - - - //---------------------------------------------------path_storage_integer - template class path_storage_integer - { - public: - typedef T value_type; - typedef vertex_integer vertex_integer_type; - - //-------------------------------------------------------------------- - path_storage_integer() : m_storage(), m_vertex_idx(0), m_closed(true) {} - - //-------------------------------------------------------------------- - void remove_all() { m_storage.remove_all(); } - - //-------------------------------------------------------------------- - void move_to(T x, T y) - { - m_storage.add(vertex_integer_type(x, y, vertex_integer_type::cmd_move_to)); - } - - //-------------------------------------------------------------------- - void line_to(T x, T y) - { - m_storage.add(vertex_integer_type(x, y, vertex_integer_type::cmd_line_to)); - } - - //-------------------------------------------------------------------- - void curve3(T x_ctrl, T y_ctrl, - T x_to, T y_to) - { - m_storage.add(vertex_integer_type(x_ctrl, y_ctrl, vertex_integer_type::cmd_curve3)); - m_storage.add(vertex_integer_type(x_to, y_to, vertex_integer_type::cmd_curve3)); - } - - //-------------------------------------------------------------------- - void curve4(T x_ctrl1, T y_ctrl1, - T x_ctrl2, T y_ctrl2, - T x_to, T y_to) - { - m_storage.add(vertex_integer_type(x_ctrl1, y_ctrl1, vertex_integer_type::cmd_curve4)); - m_storage.add(vertex_integer_type(x_ctrl2, y_ctrl2, vertex_integer_type::cmd_curve4)); - m_storage.add(vertex_integer_type(x_to, y_to, vertex_integer_type::cmd_curve4)); - } - - //-------------------------------------------------------------------- - void close_polygon() {} - - //-------------------------------------------------------------------- - unsigned size() const { return m_storage.size(); } - unsigned vertex(unsigned idx, double* x, double* y) const - { - return m_storage[idx].vertex(x, y); - } - - //-------------------------------------------------------------------- - unsigned byte_size() const { return m_storage.size() * sizeof(vertex_integer_type); } - void serialize(int8u* ptr) const - { - unsigned i; - for(i = 0; i < m_storage.size(); i++) - { - memcpy(ptr, &m_storage[i], sizeof(vertex_integer_type)); - ptr += sizeof(vertex_integer_type); - } - } - - //-------------------------------------------------------------------- - void rewind(unsigned) - { - m_vertex_idx = 0; - m_closed = true; - } - - //-------------------------------------------------------------------- - unsigned vertex(double* x, double* y) - { - if(m_storage.size() < 2 || m_vertex_idx > m_storage.size()) - { - *x = 0; - *y = 0; - return path_cmd_stop; - } - if(m_vertex_idx == m_storage.size()) - { - *x = 0; - *y = 0; - ++m_vertex_idx; - return path_cmd_end_poly | path_flags_close; - } - unsigned cmd = m_storage[m_vertex_idx].vertex(x, y); - if(is_move_to(cmd) && !m_closed) - { - *x = 0; - *y = 0; - m_closed = true; - return path_cmd_end_poly | path_flags_close; - } - m_closed = false; - ++m_vertex_idx; - return cmd; - } - - //-------------------------------------------------------------------- - rect_d bounding_rect() const - { - rect_d bounds(1e100, 1e100, -1e100, -1e100); - if(m_storage.size() == 0) - { - bounds.x1 = bounds.y1 = bounds.x2 = bounds.y2 = 0.0; - } - else - { - unsigned i; - for(i = 0; i < m_storage.size(); i++) - { - double x, y; - m_storage[i].vertex(&x, &y); - if(x < bounds.x1) bounds.x1 = x; - if(y < bounds.y1) bounds.y1 = y; - if(x > bounds.x2) bounds.x2 = x; - if(y > bounds.y2) bounds.y2 = y; - } - } - return bounds; - } - - private: - pod_bvector m_storage; - unsigned m_vertex_idx; - bool m_closed; - }; - - - - - //-----------------------------------------serialized_integer_path_adaptor - template class serialized_integer_path_adaptor - { - public: - typedef vertex_integer vertex_integer_type; - - //-------------------------------------------------------------------- - serialized_integer_path_adaptor() : - m_data(0), - m_end(0), - m_ptr(0), - m_dx(0.0), - m_dy(0.0), - m_scale(1.0), - m_vertices(0) - {} - - //-------------------------------------------------------------------- - serialized_integer_path_adaptor(const int8u* data, unsigned size, - double dx, double dy) : - m_data(data), - m_end(data + size), - m_ptr(data), - m_dx(dx), - m_dy(dy), - m_vertices(0) - {} - - //-------------------------------------------------------------------- - void init(const int8u* data, unsigned size, - double dx, double dy, double scale=1.0) - { - m_data = data; - m_end = data + size; - m_ptr = data; - m_dx = dx; - m_dy = dy; - m_scale = scale; - m_vertices = 0; - } - - - //-------------------------------------------------------------------- - void rewind(unsigned) - { - m_ptr = m_data; - m_vertices = 0; - } - - //-------------------------------------------------------------------- - unsigned vertex(double* x, double* y) - { - if(m_data == 0 || m_ptr > m_end) - { - *x = 0; - *y = 0; - return path_cmd_stop; - } - - if(m_ptr == m_end) - { - *x = 0; - *y = 0; - m_ptr += sizeof(vertex_integer_type); - return path_cmd_end_poly | path_flags_close; - } - - vertex_integer_type v; - memcpy(&v, m_ptr, sizeof(vertex_integer_type)); - unsigned cmd = v.vertex(x, y, m_dx, m_dy, m_scale); - if(is_move_to(cmd) && m_vertices > 2) - { - *x = 0; - *y = 0; - m_vertices = 0; - return path_cmd_end_poly | path_flags_close; - } - ++m_vertices; - m_ptr += sizeof(vertex_integer_type); - return cmd; - } - - private: - const int8u* m_data; - const int8u* m_end; - const int8u* m_ptr; - double m_dx; - double m_dy; - double m_scale; - unsigned m_vertices; - }; - -} - - -#endif - diff --git a/uppdev/agg24/agg_pattern_filters_rgba.h b/uppdev/agg24/agg_pattern_filters_rgba.h deleted file mode 100644 index 9fb8afa6c..000000000 --- a/uppdev/agg24/agg_pattern_filters_rgba.h +++ /dev/null @@ -1,122 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -#ifndef AGG_PATTERN_FILTERS_RGBA8_INCLUDED -#define AGG_PATTERN_FILTERS_RGBA8_INCLUDED - -#include "agg_basics.h" -#include "agg_line_aa_basics.h" -#include "agg_color_rgba.h" - - -namespace agg -{ - - //=======================================================pattern_filter_nn - template struct pattern_filter_nn - { - typedef ColorT color_type; - static unsigned dilation() { return 0; } - - static void AGG_INLINE pixel_low_res(color_type const* const* buf, - color_type* p, int x, int y) - { - *p = buf[y][x]; - } - - static void AGG_INLINE pixel_high_res(color_type const* const* buf, - color_type* p, int x, int y) - { - *p = buf[y >> line_subpixel_shift] - [x >> line_subpixel_shift]; - } - }; - - typedef pattern_filter_nn pattern_filter_nn_rgba8; - typedef pattern_filter_nn pattern_filter_nn_rgba16; - - - //===========================================pattern_filter_bilinear_rgba - template struct pattern_filter_bilinear_rgba - { - typedef ColorT color_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - - - static unsigned dilation() { return 1; } - - static AGG_INLINE void pixel_low_res(color_type const* const* buf, - color_type* p, int x, int y) - { - *p = buf[y][x]; - } - - static AGG_INLINE void pixel_high_res(color_type const* const* buf, - color_type* p, int x, int y) - { - calc_type r, g, b, a; - r = g = b = a = line_subpixel_scale * line_subpixel_scale / 2; - - calc_type weight; - int x_lr = x >> line_subpixel_shift; - int y_lr = y >> line_subpixel_shift; - - x &= line_subpixel_mask; - y &= line_subpixel_mask; - const color_type* ptr = buf[y_lr] + x_lr; - - weight = (line_subpixel_scale - x) * - (line_subpixel_scale - y); - r += weight * ptr->r; - g += weight * ptr->g; - b += weight * ptr->b; - a += weight * ptr->a; - - ++ptr; - - weight = x * (line_subpixel_scale - y); - r += weight * ptr->r; - g += weight * ptr->g; - b += weight * ptr->b; - a += weight * ptr->a; - - ptr = buf[y_lr + 1] + x_lr; - - weight = (line_subpixel_scale - x) * y; - r += weight * ptr->r; - g += weight * ptr->g; - b += weight * ptr->b; - a += weight * ptr->a; - - ++ptr; - - weight = x * y; - r += weight * ptr->r; - g += weight * ptr->g; - b += weight * ptr->b; - a += weight * ptr->a; - - p->r = (value_type)(r >> line_subpixel_shift * 2); - p->g = (value_type)(g >> line_subpixel_shift * 2); - p->b = (value_type)(b >> line_subpixel_shift * 2); - p->a = (value_type)(a >> line_subpixel_shift * 2); - } - }; - - typedef pattern_filter_bilinear_rgba pattern_filter_bilinear_rgba8; - typedef pattern_filter_bilinear_rgba pattern_filter_bilinear_rgba16; -} - -#endif diff --git a/uppdev/agg24/agg_pixfmt_amask_adaptor.h b/uppdev/agg24/agg_pixfmt_amask_adaptor.h deleted file mode 100644 index b30014fc4..000000000 --- a/uppdev/agg24/agg_pixfmt_amask_adaptor.h +++ /dev/null @@ -1,240 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_PIXFMT_AMASK_ADAPTOR_INCLUDED -#define AGG_PIXFMT_AMASK_ADAPTOR_INCLUDED - - -#include -#include "agg_array.h" -#include "agg_rendering_buffer.h" - - -namespace agg -{ - //==================================================pixfmt_amask_adaptor - template class pixfmt_amask_adaptor - { - public: - typedef PixFmt pixfmt_type; - typedef typename pixfmt_type::color_type color_type; - typedef typename pixfmt_type::row_data row_data; - typedef AlphaMask amask_type; - typedef typename amask_type::cover_type cover_type; - - private: - enum span_extra_tail_e { span_extra_tail = 256 }; - - void realloc_span(unsigned len) - { - if(len > m_span.size()) - { - m_span.resize(len + span_extra_tail); - } - } - - void init_span(unsigned len) - { - realloc_span(len); - memset(&m_span[0], amask_type::cover_full, len * sizeof(cover_type)); - } - - void init_span(unsigned len, const cover_type* covers) - { - realloc_span(len); - memcpy(&m_span[0], covers, len * sizeof(cover_type)); - } - - - public: - pixfmt_amask_adaptor(pixfmt_type& pixf, const amask_type& mask) : - m_pixf(&pixf), m_mask(&mask), m_span() - {} - - void attach_pixfmt(pixfmt_type& pixf) { m_pixf = &pixf; } - void attach_alpha_mask(const amask_type& mask) { m_mask = &mask; } - - //-------------------------------------------------------------------- - template - bool attach_pixfmt(PixFmt2& pixf, int x1, int y1, int x2, int y2) - { - return m_pixf->attach(pixf, x1, y1, x2, y2); - } - - //-------------------------------------------------------------------- - unsigned width() const { return m_pixf->width(); } - unsigned height() const { return m_pixf->height(); } - - //-------------------------------------------------------------------- - color_type pixel(int x, int y) - { - return m_pixf->pixel(x, y); - } - - //-------------------------------------------------------------------- - void copy_pixel(int x, int y, const color_type& c) - { - m_pixf->blend_pixel(x, y, c, m_mask->pixel(x, y)); - } - - //-------------------------------------------------------------------- - void blend_pixel(int x, int y, const color_type& c, cover_type cover) - { - m_pixf->blend_pixel(x, y, c, m_mask->combine_pixel(x, y, cover)); - } - - //-------------------------------------------------------------------- - void copy_hline(int x, int y, - unsigned len, - const color_type& c) - { - realloc_span(len); - m_mask->fill_hspan(x, y, &m_span[0], len); - m_pixf->blend_solid_hspan(x, y, len, c, &m_span[0]); - } - - //-------------------------------------------------------------------- - void blend_hline(int x, int y, - unsigned len, - const color_type& c, - cover_type cover) - { - init_span(len); - m_mask->combine_hspan(x, y, &m_span[0], len); - m_pixf->blend_solid_hspan(x, y, len, c, &m_span[0]); - } - - //-------------------------------------------------------------------- - void copy_vline(int x, int y, - unsigned len, - const color_type& c) - { - realloc_span(len); - m_mask->fill_vspan(x, y, &m_span[0], len); - m_pixf->blend_solid_vspan(x, y, len, c, &m_span[0]); - } - - //-------------------------------------------------------------------- - void blend_vline(int x, int y, - unsigned len, - const color_type& c, - cover_type cover) - { - init_span(len); - m_mask->combine_vspan(x, y, &m_span[0], len); - m_pixf->blend_solid_vspan(x, y, len, c, &m_span[0]); - } - - //-------------------------------------------------------------------- - void copy_from(const rendering_buffer& from, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len) - { - m_pixf->copy_from(from, xdst, ydst, xsrc, ysrc, len); - } - - - //-------------------------------------------------------------------- - void blend_solid_hspan(int x, int y, - unsigned len, - const color_type& c, - const cover_type* covers) - { - init_span(len, covers); - m_mask->combine_hspan(x, y, &m_span[0], len); - m_pixf->blend_solid_hspan(x, y, len, c, &m_span[0]); - } - - - //-------------------------------------------------------------------- - void blend_solid_vspan(int x, int y, - unsigned len, - const color_type& c, - const cover_type* covers) - { - init_span(len, covers); - m_mask->combine_vspan(x, y, &m_span[0], len); - m_pixf->blend_solid_vspan(x, y, len, c, &m_span[0]); - } - - - //-------------------------------------------------------------------- - void copy_color_hspan(int x, int y, unsigned len, const color_type* colors) - { - realloc_span(len); - m_mask->fill_hspan(x, y, &m_span[0], len); - m_pixf->blend_color_hspan(x, y, len, colors, &m_span[0], cover_full); - } - - //-------------------------------------------------------------------- - void copy_color_vspan(int x, int y, unsigned len, const color_type* colors) - { - realloc_span(len); - m_mask->fill_vspan(x, y, &m_span[0], len); - m_pixf->blend_color_vspan(x, y, len, colors, &m_span[0], cover_full); - } - - //-------------------------------------------------------------------- - void blend_color_hspan(int x, int y, - unsigned len, - const color_type* colors, - const cover_type* covers, - cover_type cover = cover_full) - { - if(covers) - { - init_span(len, covers); - m_mask->combine_hspan(x, y, &m_span[0], len); - } - else - { - realloc_span(len); - m_mask->fill_hspan(x, y, &m_span[0], len); - } - m_pixf->blend_color_hspan(x, y, len, colors, &m_span[0], cover); - } - - - //-------------------------------------------------------------------- - void blend_color_vspan(int x, int y, - unsigned len, - const color_type* colors, - const cover_type* covers, - cover_type cover = cover_full) - { - if(covers) - { - init_span(len, covers); - m_mask->combine_vspan(x, y, &m_span[0], len); - } - else - { - realloc_span(len); - m_mask->fill_vspan(x, y, &m_span[0], len); - } - m_pixf->blend_color_vspan(x, y, len, colors, &m_span[0], cover); - } - - private: - pixfmt_type* m_pixf; - const amask_type* m_mask; - pod_array m_span; - }; - -} - -#endif - diff --git a/uppdev/agg24/agg_pixfmt_gray.h b/uppdev/agg24/agg_pixfmt_gray.h deleted file mode 100644 index dd4f2469d..000000000 --- a/uppdev/agg24/agg_pixfmt_gray.h +++ /dev/null @@ -1,670 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Adaptation for high precision colors has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- - -#ifndef AGG_PIXFMT_GRAY_INCLUDED -#define AGG_PIXFMT_GRAY_INCLUDED - -#include -#include "agg_basics.h" -#include "agg_color_gray.h" -#include "agg_rendering_buffer.h" - -namespace agg -{ - - //============================================================blender_gray - template struct blender_gray - { - typedef ColorT color_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e { base_shift = color_type::base_shift }; - - static AGG_INLINE void blend_pix(value_type* p, unsigned cv, - unsigned alpha, unsigned cover=0) - { - *p = (value_type)((((cv - calc_type(*p)) * alpha) + (calc_type(*p) << base_shift)) >> base_shift); - } - }; - - - //======================================================blender_gray_pre - template struct blender_gray_pre - { - typedef ColorT color_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e { base_shift = color_type::base_shift }; - - static AGG_INLINE void blend_pix(value_type* p, unsigned cv, - unsigned alpha, unsigned cover) - { - alpha = color_type::base_mask - alpha; - cover = (cover + 1) << (base_shift - 8); - *p = (value_type)((*p * alpha + cv * cover) >> base_shift); - } - - static AGG_INLINE void blend_pix(value_type* p, unsigned cv, - unsigned alpha) - { - *p = (value_type)(((*p * (color_type::base_mask - alpha)) >> base_shift) + cv); - } - }; - - - - //=====================================================apply_gamma_dir_gray - template class apply_gamma_dir_gray - { - public: - typedef typename ColorT::value_type value_type; - - apply_gamma_dir_gray(const GammaLut& gamma) : m_gamma(gamma) {} - - AGG_INLINE void operator () (value_type* p) - { - *p = m_gamma.dir(*p); - } - - private: - const GammaLut& m_gamma; - }; - - - - //=====================================================apply_gamma_inv_gray - template class apply_gamma_inv_gray - { - public: - typedef typename ColorT::value_type value_type; - - apply_gamma_inv_gray(const GammaLut& gamma) : m_gamma(gamma) {} - - AGG_INLINE void operator () (value_type* p) - { - *p = m_gamma.inv(*p); - } - - private: - const GammaLut& m_gamma; - }; - - - - //=================================================pixfmt_alpha_blend_gray - template - class pixfmt_alpha_blend_gray - { - public: - typedef RenBuf rbuf_type; - typedef typename rbuf_type::row_data row_data; - typedef Blender blender_type; - typedef typename blender_type::color_type color_type; - typedef int order_type; // A fake one - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_scale = color_type::base_scale, - base_mask = color_type::base_mask, - pix_width = sizeof(value_type), - pix_step = Step, - pix_offset = Offset - }; - - private: - //-------------------------------------------------------------------- - static AGG_INLINE void copy_or_blend_pix(value_type* p, - const color_type& c, - unsigned cover) - { - if (c.a) - { - calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8; - if(alpha == base_mask) - { - *p = c.v; - } - else - { - Blender::blend_pix(p, c.v, alpha, cover); - } - } - } - - - static AGG_INLINE void copy_or_blend_pix(value_type* p, - const color_type& c) - { - if (c.a) - { - if(c.a == base_mask) - { - *p = c.v; - } - else - { - Blender::blend_pix(p, c.v, c.a); - } - } - } - - - public: - //-------------------------------------------------------------------- - explicit pixfmt_alpha_blend_gray(rbuf_type& rb) : - m_rbuf(&rb) - {} - void attach(rbuf_type& rb) { m_rbuf = &rb; } - //-------------------------------------------------------------------- - - template - bool attach(PixFmt& pixf, int x1, int y1, int x2, int y2) - { - rect_i r(x1, y1, x2, y2); - if(r.clip(rect_i(0, 0, pixf.width()-1, pixf.height()-1))) - { - int stride = pixf.stride(); - m_rbuf->attach(pixf.pix_ptr(r.x1, stride < 0 ? r.y2 : r.y1), - (r.x2 - r.x1) + 1, - (r.y2 - r.y1) + 1, - stride); - return true; - } - return false; - } - - //-------------------------------------------------------------------- - AGG_INLINE unsigned width() const { return m_rbuf->width(); } - AGG_INLINE unsigned height() const { return m_rbuf->height(); } - AGG_INLINE int stride() const { return m_rbuf->stride(); } - - //-------------------------------------------------------------------- - int8u* row_ptr(int y) { return m_rbuf->row_ptr(y); } - const int8u* row_ptr(int y) const { return m_rbuf->row_ptr(y); } - row_data row(int y) const { return m_rbuf->row(y); } - - const int8u* pix_ptr(int x, int y) const - { - return m_rbuf->row_ptr(y) + x * Step + Offset; - } - - int8u* pix_ptr(int x, int y) - { - return m_rbuf->row_ptr(y) + x * Step + Offset; - } - - //-------------------------------------------------------------------- - AGG_INLINE static void make_pix(int8u* p, const color_type& c) - { - *(value_type*)p = c.v; - } - - //-------------------------------------------------------------------- - AGG_INLINE color_type pixel(int x, int y) const - { - value_type* p = (value_type*)m_rbuf->row_ptr(y) + x * Step + Offset; - return color_type(*p); - } - - //-------------------------------------------------------------------- - AGG_INLINE void copy_pixel(int x, int y, const color_type& c) - { - *((value_type*)m_rbuf->row_ptr(x, y, 1) + x * Step + Offset) = c.v; - } - - //-------------------------------------------------------------------- - AGG_INLINE void blend_pixel(int x, int y, const color_type& c, int8u cover) - { - copy_or_blend_pix((value_type*) - m_rbuf->row_ptr(x, y, 1) + x * Step + Offset, - c, - cover); - } - - - //-------------------------------------------------------------------- - AGG_INLINE void copy_hline(int x, int y, - unsigned len, - const color_type& c) - { - value_type* p = (value_type*) - m_rbuf->row_ptr(x, y, len) + x * Step + Offset; - - do - { - *p = c.v; - p += Step; - } - while(--len); - } - - - //-------------------------------------------------------------------- - AGG_INLINE void copy_vline(int x, int y, - unsigned len, - const color_type& c) - { - do - { - value_type* p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset; - - *p = c.v; - } - while(--len); - } - - - //-------------------------------------------------------------------- - void blend_hline(int x, int y, - unsigned len, - const color_type& c, - int8u cover) - { - if (c.a) - { - value_type* p = (value_type*) - m_rbuf->row_ptr(x, y, len) + x * Step + Offset; - - calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8; - if(alpha == base_mask) - { - do - { - *p = c.v; - p += Step; - } - while(--len); - } - else - { - do - { - Blender::blend_pix(p, c.v, alpha, cover); - p += Step; - } - while(--len); - } - } - } - - - //-------------------------------------------------------------------- - void blend_vline(int x, int y, - unsigned len, - const color_type& c, - int8u cover) - { - if (c.a) - { - value_type* p; - calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8; - if(alpha == base_mask) - { - do - { - p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset; - - *p = c.v; - } - while(--len); - } - else - { - do - { - p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset; - - Blender::blend_pix(p, c.v, alpha, cover); - } - while(--len); - } - } - } - - - //-------------------------------------------------------------------- - void blend_solid_hspan(int x, int y, - unsigned len, - const color_type& c, - const int8u* covers) - { - if (c.a) - { - value_type* p = (value_type*) - m_rbuf->row_ptr(x, y, len) + x * Step + Offset; - - do - { - calc_type alpha = (calc_type(c.a) * (calc_type(*covers) + 1)) >> 8; - if(alpha == base_mask) - { - *p = c.v; - } - else - { - Blender::blend_pix(p, c.v, alpha, *covers); - } - p += Step; - ++covers; - } - while(--len); - } - } - - - //-------------------------------------------------------------------- - void blend_solid_vspan(int x, int y, - unsigned len, - const color_type& c, - const int8u* covers) - { - if (c.a) - { - do - { - calc_type alpha = (calc_type(c.a) * (calc_type(*covers) + 1)) >> 8; - - value_type* p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset; - - if(alpha == base_mask) - { - *p = c.v; - } - else - { - Blender::blend_pix(p, c.v, alpha, *covers); - } - ++covers; - } - while(--len); - } - } - - - //-------------------------------------------------------------------- - void copy_color_hspan(int x, int y, - unsigned len, - const color_type* colors) - { - value_type* p = (value_type*) - m_rbuf->row_ptr(x, y, len) + x * Step + Offset; - - do - { - *p = colors->v; - p += Step; - ++colors; - } - while(--len); - } - - - //-------------------------------------------------------------------- - void copy_color_vspan(int x, int y, - unsigned len, - const color_type* colors) - { - do - { - value_type* p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset; - *p = colors->v; - ++colors; - } - while(--len); - } - - - //-------------------------------------------------------------------- - void blend_color_hspan(int x, int y, - unsigned len, - const color_type* colors, - const int8u* covers, - int8u cover) - { - value_type* p = (value_type*) - m_rbuf->row_ptr(x, y, len) + x * Step + Offset; - - if(covers) - { - do - { - copy_or_blend_pix(p, *colors++, *covers++); - p += Step; - } - while(--len); - } - else - { - if(cover == 255) - { - do - { - if(colors->a == base_mask) - { - *p = colors->v; - } - else - { - copy_or_blend_pix(p, *colors); - } - p += Step; - ++colors; - } - while(--len); - } - else - { - do - { - copy_or_blend_pix(p, *colors++, cover); - p += Step; - } - while(--len); - } - } - } - - - - //-------------------------------------------------------------------- - void blend_color_vspan(int x, int y, - unsigned len, - const color_type* colors, - const int8u* covers, - int8u cover) - { - value_type* p; - if(covers) - { - do - { - p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset; - - copy_or_blend_pix(p, *colors++, *covers++); - } - while(--len); - } - else - { - if(cover == 255) - { - do - { - p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset; - - if(colors->a == base_mask) - { - *p = colors->v; - } - else - { - copy_or_blend_pix(p, *colors); - } - ++colors; - } - while(--len); - } - else - { - do - { - p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset; - - copy_or_blend_pix(p, *colors++, cover); - } - while(--len); - } - } - } - - //-------------------------------------------------------------------- - template void for_each_pixel(Function f) - { - unsigned y; - for(y = 0; y < height(); ++y) - { - row_data r = m_rbuf->row(y); - if(r.ptr) - { - unsigned len = r.x2 - r.x1 + 1; - - value_type* p = (value_type*) - m_rbuf->row_ptr(r.x1, y, len) + r.x1 * Step + Offset; - - do - { - f(p); - p += Step; - } - while(--len); - } - } - } - - //-------------------------------------------------------------------- - template void apply_gamma_dir(const GammaLut& g) - { - for_each_pixel(apply_gamma_dir_gray(g)); - } - - //-------------------------------------------------------------------- - template void apply_gamma_inv(const GammaLut& g) - { - for_each_pixel(apply_gamma_inv_gray(g)); - } - - //-------------------------------------------------------------------- - template - void copy_from(const RenBuf2& from, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len) - { - const int8u* p = from.row_ptr(ysrc); - if(p) - { - memmove(m_rbuf->row_ptr(xdst, ydst, len) + xdst * pix_width, - p + xsrc * pix_width, - len * pix_width); - } - } - - //-------------------------------------------------------------------- - template - void blend_from_color(const SrcPixelFormatRenderer& from, - const color_type& color, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len, - int8u cover) - { - typedef typename SrcPixelFormatRenderer::value_type src_value_type; - const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc); - if(psrc) - { - value_type* pdst = - (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst; - do - { - copy_or_blend_pix(pdst, - color, - (*psrc * cover + base_mask) >> base_shift); - ++psrc; - ++pdst; - } - while(--len); - } - } - - //-------------------------------------------------------------------- - template - void blend_from_lut(const SrcPixelFormatRenderer& from, - const color_type* color_lut, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len, - int8u cover) - { - typedef typename SrcPixelFormatRenderer::value_type src_value_type; - const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc); - if(psrc) - { - value_type* pdst = - (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst; - do - { - copy_or_blend_pix(pdst, color_lut[*psrc], cover); - ++psrc; - ++pdst; - } - while(--len); - } - } - - private: - rbuf_type* m_rbuf; - }; - - typedef blender_gray blender_gray8; - typedef blender_gray_pre blender_gray8_pre; - typedef blender_gray blender_gray16; - typedef blender_gray_pre blender_gray16_pre; - - typedef pixfmt_alpha_blend_gray pixfmt_gray8; //----pixfmt_gray8 - typedef pixfmt_alpha_blend_gray pixfmt_gray8_pre; //----pixfmt_gray8_pre - typedef pixfmt_alpha_blend_gray pixfmt_gray16; //----pixfmt_gray16 - typedef pixfmt_alpha_blend_gray pixfmt_gray16_pre; //----pixfmt_gray16_pre -} - -#endif - diff --git a/uppdev/agg24/agg_pixfmt_rgb.h b/uppdev/agg24/agg_pixfmt_rgb.h deleted file mode 100644 index 4025fa5ab..000000000 --- a/uppdev/agg24/agg_pixfmt_rgb.h +++ /dev/null @@ -1,860 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Adaptation for high precision colors has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- - -#ifndef AGG_PIXFMT_RGB_INCLUDED -#define AGG_PIXFMT_RGB_INCLUDED - -#include -#include "agg_basics.h" -#include "agg_color_rgba.h" -#include "agg_rendering_buffer.h" - -namespace agg -{ - - //=====================================================apply_gamma_dir_rgb - template class apply_gamma_dir_rgb - { - public: - typedef typename ColorT::value_type value_type; - - apply_gamma_dir_rgb(const GammaLut& gamma) : m_gamma(gamma) {} - - AGG_INLINE void operator () (value_type* p) - { - p[Order::R] = m_gamma.dir(p[Order::R]); - p[Order::G] = m_gamma.dir(p[Order::G]); - p[Order::B] = m_gamma.dir(p[Order::B]); - } - - private: - const GammaLut& m_gamma; - }; - - - - //=====================================================apply_gamma_inv_rgb - template class apply_gamma_inv_rgb - { - public: - typedef typename ColorT::value_type value_type; - - apply_gamma_inv_rgb(const GammaLut& gamma) : m_gamma(gamma) {} - - AGG_INLINE void operator () (value_type* p) - { - p[Order::R] = m_gamma.inv(p[Order::R]); - p[Order::G] = m_gamma.inv(p[Order::G]); - p[Order::B] = m_gamma.inv(p[Order::B]); - } - - private: - const GammaLut& m_gamma; - }; - - - //=========================================================blender_rgb - template struct blender_rgb - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e { base_shift = color_type::base_shift }; - - //-------------------------------------------------------------------- - static AGG_INLINE void blend_pix(value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned cover=0) - { - p[Order::R] += (value_type)(((cr - p[Order::R]) * alpha) >> base_shift); - p[Order::G] += (value_type)(((cg - p[Order::G]) * alpha) >> base_shift); - p[Order::B] += (value_type)(((cb - p[Order::B]) * alpha) >> base_shift); - } - }; - - - //======================================================blender_rgb_pre - template struct blender_rgb_pre - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e { base_shift = color_type::base_shift }; - - //-------------------------------------------------------------------- - static AGG_INLINE void blend_pix(value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned cover) - { - alpha = color_type::base_mask - alpha; - cover = (cover + 1) << (base_shift - 8); - p[Order::R] = (value_type)((p[Order::R] * alpha + cr * cover) >> base_shift); - p[Order::G] = (value_type)((p[Order::G] * alpha + cg * cover) >> base_shift); - p[Order::B] = (value_type)((p[Order::B] * alpha + cb * cover) >> base_shift); - } - - //-------------------------------------------------------------------- - static AGG_INLINE void blend_pix(value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha) - { - alpha = color_type::base_mask - alpha; - p[Order::R] = (value_type)(((p[Order::R] * alpha) >> base_shift) + cr); - p[Order::G] = (value_type)(((p[Order::G] * alpha) >> base_shift) + cg); - p[Order::B] = (value_type)(((p[Order::B] * alpha) >> base_shift) + cb); - } - - }; - - - - //===================================================blender_rgb_gamma - template class blender_rgb_gamma - { - public: - typedef ColorT color_type; - typedef Order order_type; - typedef Gamma gamma_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e { base_shift = color_type::base_shift }; - - //-------------------------------------------------------------------- - blender_rgb_gamma() : m_gamma(0) {} - void gamma(const gamma_type& g) { m_gamma = &g; } - - //-------------------------------------------------------------------- - AGG_INLINE void blend_pix(value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned cover=0) - { - calc_type r = m_gamma->dir(p[Order::R]); - calc_type g = m_gamma->dir(p[Order::G]); - calc_type b = m_gamma->dir(p[Order::B]); - p[Order::R] = m_gamma->inv((((m_gamma->dir(cr) - r) * alpha) >> base_shift) + r); - p[Order::G] = m_gamma->inv((((m_gamma->dir(cg) - g) * alpha) >> base_shift) + g); - p[Order::B] = m_gamma->inv((((m_gamma->dir(cb) - b) * alpha) >> base_shift) + b); - } - - private: - const gamma_type* m_gamma; - }; - - - - - //==================================================pixfmt_alpha_blend_rgb - template class pixfmt_alpha_blend_rgb - { - public: - typedef RenBuf rbuf_type; - typedef Blender blender_type; - typedef typename rbuf_type::row_data row_data; - typedef typename blender_type::color_type color_type; - typedef typename blender_type::order_type order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_scale = color_type::base_scale, - base_mask = color_type::base_mask, - pix_width = sizeof(value_type) * 3 - }; - - private: - //-------------------------------------------------------------------- - AGG_INLINE void copy_or_blend_pix(value_type* p, - const color_type& c, - unsigned cover) - { - if (c.a) - { - calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8; - if(alpha == base_mask) - { - p[order_type::R] = c.r; - p[order_type::G] = c.g; - p[order_type::B] = c.b; - } - else - { - m_blender.blend_pix(p, c.r, c.g, c.b, alpha, cover); - } - } - } - - //-------------------------------------------------------------------- - AGG_INLINE void copy_or_blend_pix(value_type* p, - const color_type& c) - { - if (c.a) - { - if(c.a == base_mask) - { - p[order_type::R] = c.r; - p[order_type::G] = c.g; - p[order_type::B] = c.b; - } - else - { - m_blender.blend_pix(p, c.r, c.g, c.b, c.a); - } - } - } - - - public: - //-------------------------------------------------------------------- - explicit pixfmt_alpha_blend_rgb(rbuf_type& rb) : - m_rbuf(&rb) - {} - void attach(rbuf_type& rb) { m_rbuf = &rb; } - - //-------------------------------------------------------------------- - template - bool attach(PixFmt& pixf, int x1, int y1, int x2, int y2) - { - rect_i r(x1, y1, x2, y2); - if(r.clip(rect_i(0, 0, pixf.width()-1, pixf.height()-1))) - { - int stride = pixf.stride(); - m_rbuf->attach(pixf.pix_ptr(r.x1, stride < 0 ? r.y2 : r.y1), - (r.x2 - r.x1) + 1, - (r.y2 - r.y1) + 1, - stride); - return true; - } - return false; - } - - //-------------------------------------------------------------------- - Blender& blender() { return m_blender; } - - //-------------------------------------------------------------------- - AGG_INLINE unsigned width() const { return m_rbuf->width(); } - AGG_INLINE unsigned height() const { return m_rbuf->height(); } - AGG_INLINE int stride() const { return m_rbuf->stride(); } - - //-------------------------------------------------------------------- - AGG_INLINE int8u* row_ptr(int y) { return m_rbuf->row_ptr(y); } - AGG_INLINE const int8u* row_ptr(int y) const { return m_rbuf->row_ptr(y); } - AGG_INLINE row_data row(int y) const { return m_rbuf->row(y); } - - //-------------------------------------------------------------------- - AGG_INLINE int8u* pix_ptr(int x, int y) - { - return m_rbuf->row_ptr(y) + x * pix_width; - } - - AGG_INLINE const int8u* pix_ptr(int x, int y) const - { - return m_rbuf->row_ptr(y) + x * pix_width; - } - - //-------------------------------------------------------------------- - AGG_INLINE static void make_pix(int8u* p, const color_type& c) - { - ((value_type*)p)[order_type::R] = c.r; - ((value_type*)p)[order_type::G] = c.g; - ((value_type*)p)[order_type::B] = c.b; - } - - //-------------------------------------------------------------------- - AGG_INLINE color_type pixel(int x, int y) const - { - value_type* p = (value_type*)m_rbuf->row_ptr(y) + x + x + x; - return color_type(p[order_type::R], - p[order_type::G], - p[order_type::B]); - } - - //-------------------------------------------------------------------- - AGG_INLINE void copy_pixel(int x, int y, const color_type& c) - { - value_type* p = (value_type*)m_rbuf->row_ptr(x, y, 1) + x + x + x; - p[order_type::R] = c.r; - p[order_type::G] = c.g; - p[order_type::B] = c.b; - } - - //-------------------------------------------------------------------- - AGG_INLINE void blend_pixel(int x, int y, const color_type& c, int8u cover) - { - copy_or_blend_pix((value_type*)m_rbuf->row_ptr(x, y, 1) + x + x + x, c, cover); - } - - - //-------------------------------------------------------------------- - AGG_INLINE void copy_hline(int x, int y, - unsigned len, - const color_type& c) - { - value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + x + x + x; - do - { - p[order_type::R] = c.r; - p[order_type::G] = c.g; - p[order_type::B] = c.b; - p += 3; - } - while(--len); - } - - - //-------------------------------------------------------------------- - AGG_INLINE void copy_vline(int x, int y, - unsigned len, - const color_type& c) - { - do - { - value_type* p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x + x + x; - p[order_type::R] = c.r; - p[order_type::G] = c.g; - p[order_type::B] = c.b; - } - while(--len); - } - - - //-------------------------------------------------------------------- - void blend_hline(int x, int y, - unsigned len, - const color_type& c, - int8u cover) - { - if (c.a) - { - value_type* p = (value_type*) - m_rbuf->row_ptr(x, y, len) + x + x + x; - - calc_type alpha = (calc_type(c.a) * (calc_type(cover) + 1)) >> 8; - if(alpha == base_mask) - { - do - { - p[order_type::R] = c.r; - p[order_type::G] = c.g; - p[order_type::B] = c.b; - p += 3; - } - while(--len); - } - else - { - do - { - m_blender.blend_pix(p, c.r, c.g, c.b, alpha, cover); - p += 3; - } - while(--len); - } - } - } - - - //-------------------------------------------------------------------- - void blend_vline(int x, int y, - unsigned len, - const color_type& c, - int8u cover) - { - if (c.a) - { - value_type* p; - calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8; - if(alpha == base_mask) - { - do - { - p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x + x + x; - - p[order_type::R] = c.r; - p[order_type::G] = c.g; - p[order_type::B] = c.b; - } - while(--len); - } - else - { - do - { - p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x + x + x; - - m_blender.blend_pix(p, c.r, c.g, c.b, alpha, cover); - } - while(--len); - } - } - } - - - //-------------------------------------------------------------------- - void blend_solid_hspan(int x, int y, - unsigned len, - const color_type& c, - const int8u* covers) - { - if (c.a) - { - value_type* p = (value_type*) - m_rbuf->row_ptr(x, y, len) + x + x + x; - - do - { - calc_type alpha = (calc_type(c.a) * (calc_type(*covers) + 1)) >> 8; - if(alpha == base_mask) - { - p[order_type::R] = c.r; - p[order_type::G] = c.g; - p[order_type::B] = c.b; - } - else - { - m_blender.blend_pix(p, c.r, c.g, c.b, alpha, *covers); - } - p += 3; - ++covers; - } - while(--len); - } - } - - - //-------------------------------------------------------------------- - void blend_solid_vspan(int x, int y, - unsigned len, - const color_type& c, - const int8u* covers) - { - if (c.a) - { - do - { - value_type* p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x + x + x; - - calc_type alpha = (calc_type(c.a) * (calc_type(*covers) + 1)) >> 8; - if(alpha == base_mask) - { - p[order_type::R] = c.r; - p[order_type::G] = c.g; - p[order_type::B] = c.b; - } - else - { - m_blender.blend_pix(p, c.r, c.g, c.b, alpha, *covers); - } - ++covers; - } - while(--len); - } - } - - - //-------------------------------------------------------------------- - void copy_color_hspan(int x, int y, - unsigned len, - const color_type* colors) - { - value_type* p = (value_type*) - m_rbuf->row_ptr(x, y, len) + x + x + x; - - do - { - p[order_type::R] = colors->r; - p[order_type::G] = colors->g; - p[order_type::B] = colors->b; - ++colors; - p += 3; - } - while(--len); - } - - - //-------------------------------------------------------------------- - void copy_color_vspan(int x, int y, - unsigned len, - const color_type* colors) - { - do - { - value_type* p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x + x + x; - p[order_type::R] = colors->r; - p[order_type::G] = colors->g; - p[order_type::B] = colors->b; - ++colors; - } - while(--len); - } - - - //-------------------------------------------------------------------- - void blend_color_hspan(int x, int y, - unsigned len, - const color_type* colors, - const int8u* covers, - int8u cover) - { - value_type* p = (value_type*) - m_rbuf->row_ptr(x, y, len) + x + x + x; - - if(covers) - { - do - { - copy_or_blend_pix(p, *colors++, *covers++); - p += 3; - } - while(--len); - } - else - { - if(cover == 255) - { - do - { - copy_or_blend_pix(p, *colors++); - p += 3; - } - while(--len); - } - else - { - do - { - copy_or_blend_pix(p, *colors++, cover); - p += 3; - } - while(--len); - } - } - } - - - - //-------------------------------------------------------------------- - void blend_color_vspan(int x, int y, - unsigned len, - const color_type* colors, - const int8u* covers, - int8u cover) - { - value_type* p; - if(covers) - { - do - { - p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x + x + x; - - copy_or_blend_pix(p, *colors++, *covers++); - } - while(--len); - } - else - { - if(cover == 255) - { - do - { - p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x + x + x; - - copy_or_blend_pix(p, *colors++); - } - while(--len); - } - else - { - do - { - p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x + x + x; - - copy_or_blend_pix(p, *colors++, cover); - } - while(--len); - } - } - } - - //-------------------------------------------------------------------- - template void for_each_pixel(Function f) - { - unsigned y; - for(y = 0; y < height(); ++y) - { - row_data r = m_rbuf->row(y); - if(r.ptr) - { - unsigned len = r.x2 - r.x1 + 1; - value_type* p = (value_type*) - m_rbuf->row_ptr(r.x1, y, len) + r.x1 * 3; - do - { - f(p); - p += 3; - } - while(--len); - } - } - } - - //-------------------------------------------------------------------- - template void apply_gamma_dir(const GammaLut& g) - { - for_each_pixel(apply_gamma_dir_rgb(g)); - } - - //-------------------------------------------------------------------- - template void apply_gamma_inv(const GammaLut& g) - { - for_each_pixel(apply_gamma_inv_rgb(g)); - } - - //-------------------------------------------------------------------- - template - void copy_from(const RenBuf2& from, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len) - { - const int8u* p = from.row_ptr(ysrc); - if(p) - { - memmove(m_rbuf->row_ptr(xdst, ydst, len) + xdst * pix_width, - p + xsrc * pix_width, - len * pix_width); - } - } - - - //-------------------------------------------------------------------- - template - void blend_from(const SrcPixelFormatRenderer& from, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len, - int8u cover) - { - typedef typename SrcPixelFormatRenderer::order_type src_order; - - const value_type* psrc = (const value_type*)from.row_ptr(ysrc); - if(psrc) - { - psrc += xsrc * 4; - value_type* pdst = - (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst * 3; - - if(cover == 255) - { - do - { - value_type alpha = psrc[src_order::A]; - if(alpha) - { - if(alpha == base_mask) - { - pdst[order_type::R] = psrc[src_order::R]; - pdst[order_type::G] = psrc[src_order::G]; - pdst[order_type::B] = psrc[src_order::B]; - } - else - { - m_blender.blend_pix(pdst, - psrc[src_order::R], - psrc[src_order::G], - psrc[src_order::B], - alpha); - } - } - psrc += 4; - pdst += 3; - } - while(--len); - } - else - { - color_type color; - do - { - color.r = psrc[src_order::R]; - color.g = psrc[src_order::G]; - color.b = psrc[src_order::B]; - color.a = psrc[src_order::A]; - copy_or_blend_pix(pdst, color, cover); - psrc += 4; - pdst += 3; - } - while(--len); - } - } - } - - //-------------------------------------------------------------------- - template - void blend_from_color(const SrcPixelFormatRenderer& from, - const color_type& color, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len, - int8u cover) - { - typedef typename SrcPixelFormatRenderer::value_type src_value_type; - const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc); - if(psrc) - { - value_type* pdst = - (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst * 3; - do - { - copy_or_blend_pix(pdst, - color, - (*psrc * cover + base_mask) >> base_shift); - ++psrc; - pdst += 3; - } - while(--len); - } - } - - //-------------------------------------------------------------------- - template - void blend_from_lut(const SrcPixelFormatRenderer& from, - const color_type* color_lut, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len, - int8u cover) - { - typedef typename SrcPixelFormatRenderer::value_type src_value_type; - const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc); - if(psrc) - { - value_type* pdst = - (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst * 3; - - if(cover == 255) - { - do - { - const color_type& color = color_lut[*psrc]; - m_blender.blend_pix(pdst, - color.r, color.g, color.b, color.a); - ++psrc; - pdst += 3; - } - while(--len); - } - else - { - do - { - copy_or_blend_pix(pdst, color_lut[*psrc], cover); - ++psrc; - pdst += 3; - } - while(--len); - } - } - } - - private: - rbuf_type* m_rbuf; - Blender m_blender; - }; - - typedef pixfmt_alpha_blend_rgb, rendering_buffer> pixfmt_rgb24; //----pixfmt_rgb24 - typedef pixfmt_alpha_blend_rgb, rendering_buffer> pixfmt_bgr24; //----pixfmt_bgr24 - typedef pixfmt_alpha_blend_rgb, rendering_buffer> pixfmt_rgb48; //----pixfmt_rgb48 - typedef pixfmt_alpha_blend_rgb, rendering_buffer> pixfmt_bgr48; //----pixfmt_bgr48 - - typedef pixfmt_alpha_blend_rgb, rendering_buffer> pixfmt_rgb24_pre; //----pixfmt_rgb24_pre - typedef pixfmt_alpha_blend_rgb, rendering_buffer> pixfmt_bgr24_pre; //----pixfmt_bgr24_pre - typedef pixfmt_alpha_blend_rgb, rendering_buffer> pixfmt_rgb48_pre; //----pixfmt_rgb48_pre - typedef pixfmt_alpha_blend_rgb, rendering_buffer> pixfmt_bgr48_pre; //----pixfmt_bgr48_pre - - //-----------------------------------------------------pixfmt_rgb24_gamma - template class pixfmt_rgb24_gamma : - public pixfmt_alpha_blend_rgb, rendering_buffer> - { - public: - pixfmt_rgb24_gamma(rendering_buffer& rb, const Gamma& g) : - pixfmt_alpha_blend_rgb, rendering_buffer>(rb) - { - this->blender().gamma(g); - } - }; - - //-----------------------------------------------------pixfmt_bgr24_gamma - template class pixfmt_bgr24_gamma : - public pixfmt_alpha_blend_rgb, rendering_buffer> - { - public: - pixfmt_bgr24_gamma(rendering_buffer& rb, const Gamma& g) : - pixfmt_alpha_blend_rgb, rendering_buffer>(rb) - { - this->blender().gamma(g); - } - }; - - //-----------------------------------------------------pixfmt_rgb48_gamma - template class pixfmt_rgb48_gamma : - public pixfmt_alpha_blend_rgb, rendering_buffer> - { - public: - pixfmt_rgb48_gamma(rendering_buffer& rb, const Gamma& g) : - pixfmt_alpha_blend_rgb, rendering_buffer>(rb) - { - this->blender().gamma(g); - } - }; - - //-----------------------------------------------------pixfmt_bgr48_gamma - template class pixfmt_bgr48_gamma : - public pixfmt_alpha_blend_rgb, rendering_buffer> - { - public: - pixfmt_bgr48_gamma(rendering_buffer& rb, const Gamma& g) : - pixfmt_alpha_blend_rgb, rendering_buffer>(rb) - { - this->blender().gamma(g); - } - }; - - -} - -#endif - diff --git a/uppdev/agg24/agg_pixfmt_rgb_packed.h b/uppdev/agg24/agg_pixfmt_rgb_packed.h deleted file mode 100644 index 4bb11cf19..000000000 --- a/uppdev/agg24/agg_pixfmt_rgb_packed.h +++ /dev/null @@ -1,1309 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Adaptation for high precision colors has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- - -#ifndef AGG_PIXFMT_RGB_PACKED_INCLUDED -#define AGG_PIXFMT_RGB_PACKED_INCLUDED - -#include -#include "agg_basics.h" -#include "agg_color_rgba.h" -#include "agg_rendering_buffer.h" - -namespace agg -{ - //=========================================================blender_rgb555 - struct blender_rgb555 - { - typedef rgba8 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int16u pixel_type; - - static AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned) - { - pixel_type rgb = *p; - calc_type r = (rgb >> 7) & 0xF8; - calc_type g = (rgb >> 2) & 0xF8; - calc_type b = (rgb << 3) & 0xF8; - *p = (pixel_type) - (((((cr - r) * alpha + (r << 8)) >> 1) & 0x7C00) | - ((((cg - g) * alpha + (g << 8)) >> 6) & 0x03E0) | - (((cb - b) * alpha + (b << 8)) >> 11) | 0x8000); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((r & 0xF8) << 7) | - ((g & 0xF8) << 2) | - (b >> 3) | 0x8000); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p >> 7) & 0xF8, - (p >> 2) & 0xF8, - (p << 3) & 0xF8); - } - }; - - - //=====================================================blender_rgb555_pre - struct blender_rgb555_pre - { - typedef rgba8 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int16u pixel_type; - - static AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned cover) - { - alpha = color_type::base_mask - alpha; - pixel_type rgb = *p; - calc_type r = (rgb >> 7) & 0xF8; - calc_type g = (rgb >> 2) & 0xF8; - calc_type b = (rgb << 3) & 0xF8; - *p = (pixel_type) - ((((r * alpha + cr * cover) >> 1) & 0x7C00) | - (((g * alpha + cg * cover) >> 6) & 0x03E0) | - ((b * alpha + cb * cover) >> 11) | 0x8000); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((r & 0xF8) << 7) | - ((g & 0xF8) << 2) | - (b >> 3) | 0x8000); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p >> 7) & 0xF8, - (p >> 2) & 0xF8, - (p << 3) & 0xF8); - } - }; - - - - - //=====================================================blender_rgb555_gamma - template class blender_rgb555_gamma - { - public: - typedef rgba8 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int16u pixel_type; - typedef Gamma gamma_type; - - blender_rgb555_gamma() : m_gamma(0) {} - void gamma(const gamma_type& g) { m_gamma = &g; } - - AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned) - { - pixel_type rgb = *p; - calc_type r = m_gamma->dir((rgb >> 7) & 0xF8); - calc_type g = m_gamma->dir((rgb >> 2) & 0xF8); - calc_type b = m_gamma->dir((rgb << 3) & 0xF8); - *p = (pixel_type) - (((m_gamma->inv(((m_gamma->dir(cr) - r) * alpha + (r << 8)) >> 8) << 7) & 0x7C00) | - ((m_gamma->inv(((m_gamma->dir(cg) - g) * alpha + (g << 8)) >> 8) << 2) & 0x03E0) | - (m_gamma->inv(((m_gamma->dir(cb) - b) * alpha + (b << 8)) >> 8) >> 3) | 0x8000); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((r & 0xF8) << 7) | - ((g & 0xF8) << 2) | - (b >> 3) | 0x8000); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p >> 7) & 0xF8, - (p >> 2) & 0xF8, - (p << 3) & 0xF8); - } - - private: - const Gamma* m_gamma; - }; - - - - - - //=========================================================blender_rgb565 - struct blender_rgb565 - { - typedef rgba8 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int16u pixel_type; - - static AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned) - { - pixel_type rgb = *p; - calc_type r = (rgb >> 8) & 0xF8; - calc_type g = (rgb >> 3) & 0xFC; - calc_type b = (rgb << 3) & 0xF8; - *p = (pixel_type) - (((((cr - r) * alpha + (r << 8)) ) & 0xF800) | - ((((cg - g) * alpha + (g << 8)) >> 5) & 0x07E0) | - (((cb - b) * alpha + (b << 8)) >> 11)); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3)); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p >> 8) & 0xF8, - (p >> 3) & 0xFC, - (p << 3) & 0xF8); - } - }; - - - - //=====================================================blender_rgb565_pre - struct blender_rgb565_pre - { - typedef rgba8 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int16u pixel_type; - - static AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned cover) - { - alpha = color_type::base_mask - alpha; - pixel_type rgb = *p; - calc_type r = (rgb >> 8) & 0xF8; - calc_type g = (rgb >> 3) & 0xFC; - calc_type b = (rgb << 3) & 0xF8; - *p = (pixel_type) - ((((r * alpha + cr * cover) ) & 0xF800) | - (((g * alpha + cg * cover) >> 5 ) & 0x07E0) | - ((b * alpha + cb * cover) >> 11)); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3)); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p >> 8) & 0xF8, - (p >> 3) & 0xFC, - (p << 3) & 0xF8); - } - }; - - - - //=====================================================blender_rgb565_gamma - template class blender_rgb565_gamma - { - public: - typedef rgba8 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int16u pixel_type; - typedef Gamma gamma_type; - - blender_rgb565_gamma() : m_gamma(0) {} - void gamma(const gamma_type& g) { m_gamma = &g; } - - AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned) - { - pixel_type rgb = *p; - calc_type r = m_gamma->dir((rgb >> 8) & 0xF8); - calc_type g = m_gamma->dir((rgb >> 3) & 0xFC); - calc_type b = m_gamma->dir((rgb << 3) & 0xF8); - *p = (pixel_type) - (((m_gamma->inv(((m_gamma->dir(cr) - r) * alpha + (r << 8)) >> 8) << 8) & 0xF800) | - ((m_gamma->inv(((m_gamma->dir(cg) - g) * alpha + (g << 8)) >> 8) << 3) & 0x07E0) | - (m_gamma->inv(((m_gamma->dir(cb) - b) * alpha + (b << 8)) >> 8) >> 3)); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3)); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p >> 8) & 0xF8, - (p >> 3) & 0xFC, - (p << 3) & 0xF8); - } - - private: - const Gamma* m_gamma; - }; - - - - //=====================================================blender_rgbAAA - struct blender_rgbAAA - { - typedef rgba16 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int32u pixel_type; - - static AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned) - { - pixel_type rgb = *p; - calc_type r = (rgb >> 14) & 0xFFC0; - calc_type g = (rgb >> 4) & 0xFFC0; - calc_type b = (rgb << 6) & 0xFFC0; - *p = (pixel_type) - (((((cr - r) * alpha + (r << 16)) >> 2) & 0x3FF00000) | - ((((cg - g) * alpha + (g << 16)) >> 12) & 0x000FFC00) | - (((cb - b) * alpha + (b << 16)) >> 22) | 0xC0000000); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((r & 0xFFC0) << 14) | - ((g & 0xFFC0) << 4) | - (b >> 6) | 0xC0000000); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p >> 14) & 0xFFC0, - (p >> 4) & 0xFFC0, - (p << 6) & 0xFFC0); - } - }; - - - - //==================================================blender_rgbAAA_pre - struct blender_rgbAAA_pre - { - typedef rgba16 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int32u pixel_type; - - static AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned cover) - { - alpha = color_type::base_mask - alpha; - cover = (cover + 1) << (color_type::base_shift - 8); - pixel_type rgb = *p; - calc_type r = (rgb >> 14) & 0xFFC0; - calc_type g = (rgb >> 4) & 0xFFC0; - calc_type b = (rgb << 6) & 0xFFC0; - *p = (pixel_type) - ((((r * alpha + cr * cover) >> 2) & 0x3FF00000) | - (((g * alpha + cg * cover) >> 12) & 0x000FFC00) | - ((b * alpha + cb * cover) >> 22) | 0xC0000000); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((r & 0xFFC0) << 14) | - ((g & 0xFFC0) << 4) | - (b >> 6) | 0xC0000000); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p >> 14) & 0xFFC0, - (p >> 4) & 0xFFC0, - (p << 6) & 0xFFC0); - } - }; - - - - //=================================================blender_rgbAAA_gamma - template class blender_rgbAAA_gamma - { - public: - typedef rgba16 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int32u pixel_type; - typedef Gamma gamma_type; - - blender_rgbAAA_gamma() : m_gamma(0) {} - void gamma(const gamma_type& g) { m_gamma = &g; } - - AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned) - { - pixel_type rgb = *p; - calc_type r = m_gamma->dir((rgb >> 14) & 0xFFC0); - calc_type g = m_gamma->dir((rgb >> 4) & 0xFFC0); - calc_type b = m_gamma->dir((rgb << 6) & 0xFFC0); - *p = (pixel_type) - (((m_gamma->inv(((m_gamma->dir(cr) - r) * alpha + (r << 16)) >> 16) << 14) & 0x3FF00000) | - ((m_gamma->inv(((m_gamma->dir(cg) - g) * alpha + (g << 16)) >> 16) << 4 ) & 0x000FFC00) | - (m_gamma->inv(((m_gamma->dir(cb) - b) * alpha + (b << 16)) >> 16) >> 6 ) | 0xC0000000); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((r & 0xFFC0) << 14) | - ((g & 0xFFC0) << 4) | - (b >> 6) | 0xC0000000); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p >> 14) & 0xFFC0, - (p >> 4) & 0xFFC0, - (p << 6) & 0xFFC0); - } - private: - const Gamma* m_gamma; - }; - - - //=====================================================blender_bgrAAA - struct blender_bgrAAA - { - typedef rgba16 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int32u pixel_type; - - static AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned) - { - pixel_type bgr = *p; - calc_type b = (bgr >> 14) & 0xFFC0; - calc_type g = (bgr >> 4) & 0xFFC0; - calc_type r = (bgr << 6) & 0xFFC0; - *p = (pixel_type) - (((((cb - b) * alpha + (b << 16)) >> 2) & 0x3FF00000) | - ((((cg - g) * alpha + (g << 16)) >> 12) & 0x000FFC00) | - (((cr - r) * alpha + (r << 16)) >> 22) | 0xC0000000); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((b & 0xFFC0) << 14) | - ((g & 0xFFC0) << 4) | - (r >> 6) | 0xC0000000); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p << 6) & 0xFFC0, - (p >> 4) & 0xFFC0, - (p >> 14) & 0xFFC0); - } - }; - - - - //=================================================blender_bgrAAA_pre - struct blender_bgrAAA_pre - { - typedef rgba16 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int32u pixel_type; - - static AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned cover) - { - alpha = color_type::base_mask - alpha; - cover = (cover + 1) << (color_type::base_shift - 8); - pixel_type bgr = *p; - calc_type b = (bgr >> 14) & 0xFFC0; - calc_type g = (bgr >> 4) & 0xFFC0; - calc_type r = (bgr << 6) & 0xFFC0; - *p = (pixel_type) - ((((b * alpha + cb * cover) >> 2) & 0x3FF00000) | - (((g * alpha + cg * cover) >> 12) & 0x000FFC00) | - ((r * alpha + cr * cover) >> 22) | 0xC0000000); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((b & 0xFFC0) << 14) | - ((g & 0xFFC0) << 4) | - (r >> 6) | 0xC0000000); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p << 6) & 0xFFC0, - (p >> 4) & 0xFFC0, - (p >> 14) & 0xFFC0); - } - }; - - - - //=================================================blender_bgrAAA_gamma - template class blender_bgrAAA_gamma - { - public: - typedef rgba16 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int32u pixel_type; - typedef Gamma gamma_type; - - blender_bgrAAA_gamma() : m_gamma(0) {} - void gamma(const gamma_type& g) { m_gamma = &g; } - - AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned) - { - pixel_type bgr = *p; - calc_type b = m_gamma->dir((bgr >> 14) & 0xFFC0); - calc_type g = m_gamma->dir((bgr >> 4) & 0xFFC0); - calc_type r = m_gamma->dir((bgr << 6) & 0xFFC0); - *p = (pixel_type) - (((m_gamma->inv(((m_gamma->dir(cb) - b) * alpha + (b << 16)) >> 16) << 14) & 0x3FF00000) | - ((m_gamma->inv(((m_gamma->dir(cg) - g) * alpha + (g << 16)) >> 16) << 4 ) & 0x000FFC00) | - (m_gamma->inv(((m_gamma->dir(cr) - r) * alpha + (r << 16)) >> 16) >> 6 ) | 0xC0000000); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((b & 0xFFC0) << 14) | - ((g & 0xFFC0) << 4) | - (r >> 6) | 0xC0000000); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p << 6) & 0xFFC0, - (p >> 4) & 0xFFC0, - (p >> 14) & 0xFFC0); - } - - private: - const Gamma* m_gamma; - }; - - - - //=====================================================blender_rgbBBA - struct blender_rgbBBA - { - typedef rgba16 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int32u pixel_type; - - static AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned) - { - pixel_type rgb = *p; - calc_type r = (rgb >> 16) & 0xFFE0; - calc_type g = (rgb >> 5) & 0xFFE0; - calc_type b = (rgb << 6) & 0xFFC0; - *p = (pixel_type) - (((((cr - r) * alpha + (r << 16)) ) & 0xFFE00000) | - ((((cg - g) * alpha + (g << 16)) >> 11) & 0x001FFC00) | - (((cb - b) * alpha + (b << 16)) >> 22)); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((r & 0xFFE0) << 16) | ((g & 0xFFE0) << 5) | (b >> 6)); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p >> 16) & 0xFFE0, - (p >> 5) & 0xFFE0, - (p << 6) & 0xFFC0); - } - }; - - - //=================================================blender_rgbBBA_pre - struct blender_rgbBBA_pre - { - typedef rgba16 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int32u pixel_type; - - static AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned cover) - { - alpha = color_type::base_mask - alpha; - cover = (cover + 1) << (color_type::base_shift - 8); - pixel_type rgb = *p; - calc_type r = (rgb >> 16) & 0xFFE0; - calc_type g = (rgb >> 5) & 0xFFE0; - calc_type b = (rgb << 6) & 0xFFC0; - *p = (pixel_type) - ((((r * alpha + cr * cover) ) & 0xFFE00000) | - (((g * alpha + cg * cover) >> 11) & 0x001FFC00) | - ((b * alpha + cb * cover) >> 22)); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((r & 0xFFE0) << 16) | ((g & 0xFFE0) << 5) | (b >> 6)); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p >> 16) & 0xFFE0, - (p >> 5) & 0xFFE0, - (p << 6) & 0xFFC0); - } - }; - - - - //=================================================blender_rgbBBA_gamma - template class blender_rgbBBA_gamma - { - public: - typedef rgba16 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int32u pixel_type; - typedef Gamma gamma_type; - - blender_rgbBBA_gamma() : m_gamma(0) {} - void gamma(const gamma_type& g) { m_gamma = &g; } - - AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned) - { - pixel_type rgb = *p; - calc_type r = m_gamma->dir((rgb >> 16) & 0xFFE0); - calc_type g = m_gamma->dir((rgb >> 5) & 0xFFE0); - calc_type b = m_gamma->dir((rgb << 6) & 0xFFC0); - *p = (pixel_type) - (((m_gamma->inv(((m_gamma->dir(cr) - r) * alpha + (r << 16)) >> 16) << 16) & 0xFFE00000) | - ((m_gamma->inv(((m_gamma->dir(cg) - g) * alpha + (g << 16)) >> 16) << 5 ) & 0x001FFC00) | - (m_gamma->inv(((m_gamma->dir(cb) - b) * alpha + (b << 16)) >> 16) >> 6 )); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((r & 0xFFE0) << 16) | ((g & 0xFFE0) << 5) | (b >> 6)); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p >> 16) & 0xFFE0, - (p >> 5) & 0xFFE0, - (p << 6) & 0xFFC0); - } - - private: - const Gamma* m_gamma; - }; - - - //=====================================================blender_bgrABB - struct blender_bgrABB - { - typedef rgba16 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int32u pixel_type; - - static AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned) - { - pixel_type bgr = *p; - calc_type b = (bgr >> 16) & 0xFFC0; - calc_type g = (bgr >> 6) & 0xFFE0; - calc_type r = (bgr << 5) & 0xFFE0; - *p = (pixel_type) - (((((cb - b) * alpha + (b << 16)) ) & 0xFFC00000) | - ((((cg - g) * alpha + (g << 16)) >> 10) & 0x003FF800) | - (((cr - r) * alpha + (r << 16)) >> 21)); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((b & 0xFFC0) << 16) | ((g & 0xFFE0) << 6) | (r >> 5)); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p << 5) & 0xFFE0, - (p >> 6) & 0xFFE0, - (p >> 16) & 0xFFC0); - } - }; - - - //=================================================blender_bgrABB_pre - struct blender_bgrABB_pre - { - typedef rgba16 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int32u pixel_type; - - static AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned cover) - { - alpha = color_type::base_mask - alpha; - cover = (cover + 1) << (color_type::base_shift - 8); - pixel_type bgr = *p; - calc_type b = (bgr >> 16) & 0xFFC0; - calc_type g = (bgr >> 6) & 0xFFE0; - calc_type r = (bgr << 5) & 0xFFE0; - *p = (pixel_type) - ((((b * alpha + cb * cover) ) & 0xFFC00000) | - (((g * alpha + cg * cover) >> 10) & 0x003FF800) | - ((r * alpha + cr * cover) >> 21)); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((b & 0xFFC0) << 16) | ((g & 0xFFE0) << 6) | (r >> 5)); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p << 5) & 0xFFE0, - (p >> 6) & 0xFFE0, - (p >> 16) & 0xFFC0); - } - }; - - - - //=================================================blender_bgrABB_gamma - template class blender_bgrABB_gamma - { - public: - typedef rgba16 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int32u pixel_type; - typedef Gamma gamma_type; - - blender_bgrABB_gamma() : m_gamma(0) {} - void gamma(const gamma_type& g) { m_gamma = &g; } - - AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned) - { - pixel_type bgr = *p; - calc_type b = m_gamma->dir((bgr >> 16) & 0xFFC0); - calc_type g = m_gamma->dir((bgr >> 6) & 0xFFE0); - calc_type r = m_gamma->dir((bgr << 5) & 0xFFE0); - *p = (pixel_type) - (((m_gamma->inv(((m_gamma->dir(cb) - b) * alpha + (b << 16)) >> 16) << 16) & 0xFFC00000) | - ((m_gamma->inv(((m_gamma->dir(cg) - g) * alpha + (g << 16)) >> 16) << 6 ) & 0x003FF800) | - (m_gamma->inv(((m_gamma->dir(cr) - r) * alpha + (r << 16)) >> 16) >> 5 )); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((b & 0xFFC0) << 16) | ((g & 0xFFE0) << 6) | (r >> 5)); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p << 5) & 0xFFE0, - (p >> 6) & 0xFFE0, - (p >> 16) & 0xFFC0); - } - - private: - const Gamma* m_gamma; - }; - - - - //===========================================pixfmt_alpha_blend_rgb_packed - template class pixfmt_alpha_blend_rgb_packed - { - public: - typedef RenBuf rbuf_type; - typedef typename rbuf_type::row_data row_data; - typedef Blender blender_type; - typedef typename blender_type::color_type color_type; - typedef typename blender_type::pixel_type pixel_type; - typedef int order_type; // A fake one - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_scale = color_type::base_scale, - base_mask = color_type::base_mask, - pix_width = sizeof(pixel_type) - }; - - private: - //-------------------------------------------------------------------- - AGG_INLINE void copy_or_blend_pix(pixel_type* p, const color_type& c, unsigned cover) - { - if (c.a) - { - calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8; - if(alpha == base_mask) - { - *p = m_blender.make_pix(c.r, c.g, c.b); - } - else - { - m_blender.blend_pix(p, c.r, c.g, c.b, alpha, cover); - } - } - } - - public: - //-------------------------------------------------------------------- - explicit pixfmt_alpha_blend_rgb_packed(rbuf_type& rb) : m_rbuf(&rb) {} - void attach(rbuf_type& rb) { m_rbuf = &rb; } - - //-------------------------------------------------------------------- - template - bool attach(PixFmt& pixf, int x1, int y1, int x2, int y2) - { - rect_i r(x1, y1, x2, y2); - if(r.clip(rect_i(0, 0, pixf.width()-1, pixf.height()-1))) - { - int stride = pixf.stride(); - m_rbuf->attach(pixf.pix_ptr(r.x1, stride < 0 ? r.y2 : r.y1), - (r.x2 - r.x1) + 1, - (r.y2 - r.y1) + 1, - stride); - return true; - } - return false; - } - - Blender& blender() { return m_blender; } - - //-------------------------------------------------------------------- - AGG_INLINE unsigned width() const { return m_rbuf->width(); } - AGG_INLINE unsigned height() const { return m_rbuf->height(); } - AGG_INLINE int stride() const { return m_rbuf->stride(); } - - //-------------------------------------------------------------------- - AGG_INLINE int8u* row_ptr(int y) { return m_rbuf->row_ptr(y); } - AGG_INLINE const int8u* row_ptr(int y) const { return m_rbuf->row_ptr(y); } - AGG_INLINE row_data row(int y) const { return m_rbuf->row(y); } - - //-------------------------------------------------------------------- - AGG_INLINE int8u* pix_ptr(int x, int y) - { - return m_rbuf->row_ptr(y) + x * pix_width; - } - - AGG_INLINE const int8u* pix_ptr(int x, int y) const - { - return m_rbuf->row_ptr(y) + x * pix_width; - } - - //-------------------------------------------------------------------- - AGG_INLINE void make_pix(int8u* p, const color_type& c) - { - *(pixel_type*)p = m_blender.make_pix(c.r, c.g, c.b); - } - - //-------------------------------------------------------------------- - AGG_INLINE color_type pixel(int x, int y) const - { - return m_blender.make_color(((pixel_type*)m_rbuf->row_ptr(y))[x]); - } - - //-------------------------------------------------------------------- - AGG_INLINE void copy_pixel(int x, int y, const color_type& c) - { - ((pixel_type*) - m_rbuf->row_ptr(x, y, 1))[x] = - m_blender.make_pix(c.r, c.g, c.b); - } - - //-------------------------------------------------------------------- - AGG_INLINE void blend_pixel(int x, int y, const color_type& c, int8u cover) - { - copy_or_blend_pix((pixel_type*)m_rbuf->row_ptr(x, y, 1) + x, c, cover); - } - - //-------------------------------------------------------------------- - AGG_INLINE void copy_hline(int x, int y, - unsigned len, - const color_type& c) - { - pixel_type* p = (pixel_type*)m_rbuf->row_ptr(x, y, len) + x; - pixel_type v = m_blender.make_pix(c.r, c.g, c.b); - do - { - *p++ = v; - } - while(--len); - } - - //-------------------------------------------------------------------- - AGG_INLINE void copy_vline(int x, int y, - unsigned len, - const color_type& c) - { - pixel_type v = m_blender.make_pix(c.r, c.g, c.b); - do - { - pixel_type* p = (pixel_type*)m_rbuf->row_ptr(x, y++, 1) + x; - *p = v; - } - while(--len); - } - - //-------------------------------------------------------------------- - void blend_hline(int x, int y, - unsigned len, - const color_type& c, - int8u cover) - { - if (c.a) - { - pixel_type* p = (pixel_type*)m_rbuf->row_ptr(x, y, len) + x; - calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8; - if(alpha == base_mask) - { - pixel_type v = m_blender.make_pix(c.r, c.g, c.b); - do - { - *p++ = v; - } - while(--len); - } - else - { - do - { - m_blender.blend_pix(p, c.r, c.g, c.b, alpha, cover); - ++p; - } - while(--len); - } - } - } - - //-------------------------------------------------------------------- - void blend_vline(int x, int y, - unsigned len, - const color_type& c, - int8u cover) - { - if (c.a) - { - calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8; - if(alpha == base_mask) - { - pixel_type v = m_blender.make_pix(c.r, c.g, c.b); - do - { - ((pixel_type*)m_rbuf->row_ptr(x, y++, 1))[x] = v; - } - while(--len); - } - else - { - do - { - m_blender.blend_pix( - (pixel_type*)m_rbuf->row_ptr(x, y++, 1), - c.r, c.g, c.b, alpha, cover); - } - while(--len); - } - } - } - - //-------------------------------------------------------------------- - void blend_solid_hspan(int x, int y, - unsigned len, - const color_type& c, - const int8u* covers) - { - pixel_type* p = (pixel_type*)m_rbuf->row_ptr(x, y, len) + x; - do - { - copy_or_blend_pix(p, c, *covers++); - ++p; - } - while(--len); - } - - //-------------------------------------------------------------------- - void blend_solid_vspan(int x, int y, - unsigned len, - const color_type& c, - const int8u* covers) - { - do - { - copy_or_blend_pix((pixel_type*)m_rbuf->row_ptr(x, y++, 1) + x, - c, *covers++); - } - while(--len); - } - - //-------------------------------------------------------------------- - void copy_color_hspan(int x, int y, - unsigned len, - const color_type* colors) - { - pixel_type* p = (pixel_type*)m_rbuf->row_ptr(x, y, len) + x; - do - { - *p++ = m_blender.make_pix(colors->r, colors->g, colors->b); - ++colors; - } - while(--len); - } - - //-------------------------------------------------------------------- - void copy_color_vspan(int x, int y, - unsigned len, - const color_type* colors) - { - do - { - pixel_type* p = (pixel_type*)m_rbuf->row_ptr(x, y++, 1) + x; - *p = m_blender.make_pix(colors->r, colors->g, colors->b); - ++colors; - } - while(--len); - } - - //-------------------------------------------------------------------- - void blend_color_hspan(int x, int y, - unsigned len, - const color_type* colors, - const int8u* covers, - int8u cover) - { - pixel_type* p = (pixel_type*)m_rbuf->row_ptr(x, y, len) + x; - do - { - copy_or_blend_pix(p++, *colors++, covers ? *covers++ : cover); - } - while(--len); - } - - //-------------------------------------------------------------------- - void blend_color_vspan(int x, int y, - unsigned len, - const color_type* colors, - const int8u* covers, - int8u cover) - { - do - { - copy_or_blend_pix((pixel_type*)m_rbuf->row_ptr(x, y++, 1) + x, - *colors++, covers ? *covers++ : cover); - } - while(--len); - } - - //-------------------------------------------------------------------- - template - void copy_from(const RenBuf2& from, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len) - { - const int8u* p = from.row_ptr(ysrc); - if(p) - { - memmove(m_rbuf->row_ptr(xdst, ydst, len) + xdst * pix_width, - p + xsrc * pix_width, - len * pix_width); - } - } - - //-------------------------------------------------------------------- - template - void blend_from(const SrcPixelFormatRenderer& from, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len, - int8u cover) - { - typedef typename SrcPixelFormatRenderer::order_type src_order; - - const value_type* psrc = (const value_type*)from.row_ptr(ysrc); - if(psrc) - { - psrc += xsrc * 4; - pixel_type* pdst = - (pixel_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst; - do - { - value_type alpha = psrc[src_order::A]; - if(alpha) - { - if(alpha == base_mask && cover == 255) - { - *pdst = m_blender.make_pix(psrc[src_order::R], - psrc[src_order::G], - psrc[src_order::B]); - } - else - { - m_blender.blend_pix(pdst, - psrc[src_order::R], - psrc[src_order::G], - psrc[src_order::B], - alpha, - cover); - } - } - psrc += 4; - ++pdst; - } - while(--len); - } - } - - //-------------------------------------------------------------------- - template - void blend_from_color(const SrcPixelFormatRenderer& from, - const color_type& color, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len, - int8u cover) - { - typedef typename SrcPixelFormatRenderer::value_type src_value_type; - const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc); - if(psrc) - { - pixel_type* pdst = - (pixel_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst; - - do - { - m_blender.blend_pix(pdst, - color.r, color.g, color.b, color.a, - cover); - ++psrc; - ++pdst; - } - while(--len); - } - } - - //-------------------------------------------------------------------- - template - void blend_from_lut(const SrcPixelFormatRenderer& from, - const color_type* color_lut, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len, - int8u cover) - { - typedef typename SrcPixelFormatRenderer::value_type src_value_type; - const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc); - if(psrc) - { - pixel_type* pdst = - (pixel_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst; - - do - { - const color_type& color = color_lut[*psrc]; - m_blender.blend_pix(pdst, - color.r, color.g, color.b, color.a, - cover); - ++psrc; - ++pdst; - } - while(--len); - } - } - - - - private: - rbuf_type* m_rbuf; - Blender m_blender; - }; - - typedef pixfmt_alpha_blend_rgb_packed pixfmt_rgb555; //----pixfmt_rgb555 - typedef pixfmt_alpha_blend_rgb_packed pixfmt_rgb565; //----pixfmt_rgb565 - - typedef pixfmt_alpha_blend_rgb_packed pixfmt_rgb555_pre; //----pixfmt_rgb555_pre - typedef pixfmt_alpha_blend_rgb_packed pixfmt_rgb565_pre; //----pixfmt_rgb565_pre - - typedef pixfmt_alpha_blend_rgb_packed pixfmt_rgbAAA; //----pixfmt_rgbAAA - typedef pixfmt_alpha_blend_rgb_packed pixfmt_bgrAAA; //----pixfmt_bgrAAA - typedef pixfmt_alpha_blend_rgb_packed pixfmt_rgbBBA; //----pixfmt_rgbBBA - typedef pixfmt_alpha_blend_rgb_packed pixfmt_bgrABB; //----pixfmt_bgrABB - - typedef pixfmt_alpha_blend_rgb_packed pixfmt_rgbAAA_pre; //----pixfmt_rgbAAA_pre - typedef pixfmt_alpha_blend_rgb_packed pixfmt_bgrAAA_pre; //----pixfmt_bgrAAA_pre - typedef pixfmt_alpha_blend_rgb_packed pixfmt_rgbBBA_pre; //----pixfmt_rgbBBA_pre - typedef pixfmt_alpha_blend_rgb_packed pixfmt_bgrABB_pre; //----pixfmt_bgrABB_pre - - - //-----------------------------------------------------pixfmt_rgb555_gamma - template class pixfmt_rgb555_gamma : - public pixfmt_alpha_blend_rgb_packed, - rendering_buffer> - { - public: - pixfmt_rgb555_gamma(rendering_buffer& rb, const Gamma& g) : - pixfmt_alpha_blend_rgb_packed, - rendering_buffer>(rb) - { - this->blender().gamma(g); - } - }; - - - //-----------------------------------------------------pixfmt_rgb565_gamma - template class pixfmt_rgb565_gamma : - public pixfmt_alpha_blend_rgb_packed, rendering_buffer> - { - public: - pixfmt_rgb565_gamma(rendering_buffer& rb, const Gamma& g) : - pixfmt_alpha_blend_rgb_packed, rendering_buffer>(rb) - { - this->blender().gamma(g); - } - }; - - - //-----------------------------------------------------pixfmt_rgbAAA_gamma - template class pixfmt_rgbAAA_gamma : - public pixfmt_alpha_blend_rgb_packed, - rendering_buffer> - { - public: - pixfmt_rgbAAA_gamma(rendering_buffer& rb, const Gamma& g) : - pixfmt_alpha_blend_rgb_packed, - rendering_buffer>(rb) - { - this->blender().gamma(g); - } - }; - - - //-----------------------------------------------------pixfmt_bgrAAA_gamma - template class pixfmt_bgrAAA_gamma : - public pixfmt_alpha_blend_rgb_packed, - rendering_buffer> - { - public: - pixfmt_bgrAAA_gamma(rendering_buffer& rb, const Gamma& g) : - pixfmt_alpha_blend_rgb_packed, - rendering_buffer>(rb) - { - this->blender().gamma(g); - } - }; - - - //-----------------------------------------------------pixfmt_rgbBBA_gamma - template class pixfmt_rgbBBA_gamma : - public pixfmt_alpha_blend_rgb_packed, - rendering_buffer> - { - public: - pixfmt_rgbBBA_gamma(rendering_buffer& rb, const Gamma& g) : - pixfmt_alpha_blend_rgb_packed, - rendering_buffer>(rb) - { - this->blender().gamma(g); - } - }; - - - //-----------------------------------------------------pixfmt_bgrABB_gamma - template class pixfmt_bgrABB_gamma : - public pixfmt_alpha_blend_rgb_packed, - rendering_buffer> - { - public: - pixfmt_bgrABB_gamma(rendering_buffer& rb, const Gamma& g) : - pixfmt_alpha_blend_rgb_packed, - rendering_buffer>(rb) - { - this->blender().gamma(g); - } - }; - - -} - -#endif - diff --git a/uppdev/agg24/agg_pixfmt_rgba.h b/uppdev/agg24/agg_pixfmt_rgba.h deleted file mode 100644 index 7d89b4905..000000000 --- a/uppdev/agg24/agg_pixfmt_rgba.h +++ /dev/null @@ -1,2902 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Adaptation for high precision colors has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- - -#ifndef AGG_PIXFMT_RGBA_INCLUDED -#define AGG_PIXFMT_RGBA_INCLUDED - -#include -#include -#include "agg_basics.h" -#include "agg_color_rgba.h" -#include "agg_rendering_buffer.h" - -namespace agg -{ - - //=========================================================multiplier_rgba - template struct multiplier_rgba - { - typedef typename ColorT::value_type value_type; - typedef typename ColorT::calc_type calc_type; - - //-------------------------------------------------------------------- - static AGG_INLINE void premultiply(value_type* p) - { - calc_type a = p[Order::A]; - if(a < ColorT::base_mask) - { - if(a == 0) - { - p[Order::R] = p[Order::G] = p[Order::B] = 0; - return; - } - p[Order::R] = value_type((p[Order::R] * a + ColorT::base_mask) >> ColorT::base_shift); - p[Order::G] = value_type((p[Order::G] * a + ColorT::base_mask) >> ColorT::base_shift); - p[Order::B] = value_type((p[Order::B] * a + ColorT::base_mask) >> ColorT::base_shift); - } - } - - - //-------------------------------------------------------------------- - static AGG_INLINE void demultiply(value_type* p) - { - calc_type a = p[Order::A]; - if(a < ColorT::base_mask) - { - if(a == 0) - { - p[Order::R] = p[Order::G] = p[Order::B] = 0; - return; - } - calc_type r = (calc_type(p[Order::R]) * ColorT::base_mask) / a; - calc_type g = (calc_type(p[Order::G]) * ColorT::base_mask) / a; - calc_type b = (calc_type(p[Order::B]) * ColorT::base_mask) / a; - p[Order::R] = value_type((r > ColorT::base_mask) ? ColorT::base_mask : r); - p[Order::G] = value_type((g > ColorT::base_mask) ? ColorT::base_mask : g); - p[Order::B] = value_type((b > ColorT::base_mask) ? ColorT::base_mask : b); - } - } - }; - - //=====================================================apply_gamma_dir_rgba - template class apply_gamma_dir_rgba - { - public: - typedef typename ColorT::value_type value_type; - - apply_gamma_dir_rgba(const GammaLut& gamma) : m_gamma(gamma) {} - - AGG_INLINE void operator () (value_type* p) - { - p[Order::R] = m_gamma.dir(p[Order::R]); - p[Order::G] = m_gamma.dir(p[Order::G]); - p[Order::B] = m_gamma.dir(p[Order::B]); - } - - private: - const GammaLut& m_gamma; - }; - - //=====================================================apply_gamma_inv_rgba - template class apply_gamma_inv_rgba - { - public: - typedef typename ColorT::value_type value_type; - - apply_gamma_inv_rgba(const GammaLut& gamma) : m_gamma(gamma) {} - - AGG_INLINE void operator () (value_type* p) - { - p[Order::R] = m_gamma.inv(p[Order::R]); - p[Order::G] = m_gamma.inv(p[Order::G]); - p[Order::B] = m_gamma.inv(p[Order::B]); - } - - private: - const GammaLut& m_gamma; - }; - - - - - - - - - - - //=============================================================blender_rgba - template struct blender_rgba - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - static AGG_INLINE void blend_pix(value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned cover=0) - { - calc_type r = p[Order::R]; - calc_type g = p[Order::G]; - calc_type b = p[Order::B]; - calc_type a = p[Order::A]; - p[Order::R] = (value_type)(((cr - r) * alpha + (r << base_shift)) >> base_shift); - p[Order::G] = (value_type)(((cg - g) * alpha + (g << base_shift)) >> base_shift); - p[Order::B] = (value_type)(((cb - b) * alpha + (b << base_shift)) >> base_shift); - p[Order::A] = (value_type)((alpha + a) - ((alpha * a + base_mask) >> base_shift)); - } - }; - - //=========================================================blender_rgba_pre - template struct blender_rgba_pre - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - static AGG_INLINE void blend_pix(value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned cover) - { - alpha = color_type::base_mask - alpha; - cover = (cover + 1) << (base_shift - 8); - p[Order::R] = (value_type)((p[Order::R] * alpha + cr * cover) >> base_shift); - p[Order::G] = (value_type)((p[Order::G] * alpha + cg * cover) >> base_shift); - p[Order::B] = (value_type)((p[Order::B] * alpha + cb * cover) >> base_shift); - p[Order::A] = (value_type)(base_mask - ((alpha * (base_mask - p[Order::A])) >> base_shift)); - } - - //-------------------------------------------------------------------- - static AGG_INLINE void blend_pix(value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha) - { - alpha = color_type::base_mask - alpha; - p[Order::R] = (value_type)(((p[Order::R] * alpha) >> base_shift) + cr); - p[Order::G] = (value_type)(((p[Order::G] * alpha) >> base_shift) + cg); - p[Order::B] = (value_type)(((p[Order::B] * alpha) >> base_shift) + cb); - p[Order::A] = (value_type)(base_mask - ((alpha * (base_mask - p[Order::A])) >> base_shift)); - } - }; - - //======================================================blender_rgba_plain - template struct blender_rgba_plain - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e { base_shift = color_type::base_shift }; - - //-------------------------------------------------------------------- - static AGG_INLINE void blend_pix(value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned cover=0) - { - if(alpha == 0) return; - calc_type a = p[Order::A]; - calc_type r = p[Order::R] * a; - calc_type g = p[Order::G] * a; - calc_type b = p[Order::B] * a; - a = ((alpha + a) << base_shift) - alpha * a; - p[Order::A] = (value_type)(a >> base_shift); - p[Order::R] = (value_type)((((cr << base_shift) - r) * alpha + (r << base_shift)) / a); - p[Order::G] = (value_type)((((cg << base_shift) - g) * alpha + (g << base_shift)) / a); - p[Order::B] = (value_type)((((cb << base_shift) - b) * alpha + (b << base_shift)) / a); - } - }; - - - - - - - - - - - - //=========================================================comp_op_rgba_clear - template struct comp_op_rgba_clear - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - static AGG_INLINE void blend_pix(value_type* p, - unsigned, unsigned, unsigned, unsigned, - unsigned cover) - { - if(cover < 255) - { - cover = 255 - cover; - p[Order::R] = (value_type)((p[Order::R] * cover + 255) >> 8); - p[Order::G] = (value_type)((p[Order::G] * cover + 255) >> 8); - p[Order::B] = (value_type)((p[Order::B] * cover + 255) >> 8); - p[Order::A] = (value_type)((p[Order::A] * cover + 255) >> 8); - } - else - { - p[0] = p[1] = p[2] = p[3] = 0; - } - } - }; - - //===========================================================comp_op_rgba_src - template struct comp_op_rgba_src - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - unsigned alpha = 255 - cover; - p[Order::R] = (value_type)(((p[Order::R] * alpha + 255) >> 8) + ((sr * cover + 255) >> 8)); - p[Order::G] = (value_type)(((p[Order::G] * alpha + 255) >> 8) + ((sg * cover + 255) >> 8)); - p[Order::B] = (value_type)(((p[Order::B] * alpha + 255) >> 8) + ((sb * cover + 255) >> 8)); - p[Order::A] = (value_type)(((p[Order::A] * alpha + 255) >> 8) + ((sa * cover + 255) >> 8)); - } - else - { - p[Order::R] = sr; - p[Order::G] = sg; - p[Order::B] = sb; - p[Order::A] = sa; - } - } - }; - - //===========================================================comp_op_rgba_dst - template struct comp_op_rgba_dst - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - - static AGG_INLINE void blend_pix(value_type*, - unsigned, unsigned, unsigned, - unsigned, unsigned) - { - } - }; - - //======================================================comp_op_rgba_src_over - template struct comp_op_rgba_src_over - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = Sca + Dca.(1 - Sa) - // Da' = Sa + Da - Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - calc_type s1a = base_mask - sa; - p[Order::R] = (value_type)(sr + ((p[Order::R] * s1a + base_mask) >> base_shift)); - p[Order::G] = (value_type)(sg + ((p[Order::G] * s1a + base_mask) >> base_shift)); - p[Order::B] = (value_type)(sb + ((p[Order::B] * s1a + base_mask) >> base_shift)); - p[Order::A] = (value_type)(sa + p[Order::A] - ((sa * p[Order::A] + base_mask) >> base_shift)); - } - }; - - //======================================================comp_op_rgba_dst_over - template struct comp_op_rgba_dst_over - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = Dca + Sca.(1 - Da) - // Da' = Sa + Da - Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - calc_type d1a = base_mask - p[Order::A]; - p[Order::R] = (value_type)(p[Order::R] + ((sr * d1a + base_mask) >> base_shift)); - p[Order::G] = (value_type)(p[Order::G] + ((sg * d1a + base_mask) >> base_shift)); - p[Order::B] = (value_type)(p[Order::B] + ((sb * d1a + base_mask) >> base_shift)); - p[Order::A] = (value_type)(sa + p[Order::A] - ((sa * p[Order::A] + base_mask) >> base_shift)); - } - }; - - //======================================================comp_op_rgba_src_in - template struct comp_op_rgba_src_in - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = Sca.Da - // Da' = Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - calc_type da = p[Order::A]; - if(cover < 255) - { - unsigned alpha = 255 - cover; - p[Order::R] = (value_type)(((p[Order::R] * alpha + 255) >> 8) + ((((sr * da + base_mask) >> base_shift) * cover + 255) >> 8)); - p[Order::G] = (value_type)(((p[Order::G] * alpha + 255) >> 8) + ((((sg * da + base_mask) >> base_shift) * cover + 255) >> 8)); - p[Order::B] = (value_type)(((p[Order::B] * alpha + 255) >> 8) + ((((sb * da + base_mask) >> base_shift) * cover + 255) >> 8)); - p[Order::A] = (value_type)(((p[Order::A] * alpha + 255) >> 8) + ((((sa * da + base_mask) >> base_shift) * cover + 255) >> 8)); - } - else - { - p[Order::R] = (value_type)((sr * da + base_mask) >> base_shift); - p[Order::G] = (value_type)((sg * da + base_mask) >> base_shift); - p[Order::B] = (value_type)((sb * da + base_mask) >> base_shift); - p[Order::A] = (value_type)((sa * da + base_mask) >> base_shift); - } - } - }; - - //======================================================comp_op_rgba_dst_in - template struct comp_op_rgba_dst_in - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = Dca.Sa - // Da' = Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned, unsigned, unsigned, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sa = base_mask - ((cover * (base_mask - sa) + 255) >> 8); - } - p[Order::R] = (value_type)((p[Order::R] * sa + base_mask) >> base_shift); - p[Order::G] = (value_type)((p[Order::G] * sa + base_mask) >> base_shift); - p[Order::B] = (value_type)((p[Order::B] * sa + base_mask) >> base_shift); - p[Order::A] = (value_type)((p[Order::A] * sa + base_mask) >> base_shift); - } - }; - - //======================================================comp_op_rgba_src_out - template struct comp_op_rgba_src_out - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = Sca.(1 - Da) - // Da' = Sa.(1 - Da) - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - calc_type da = base_mask - p[Order::A]; - if(cover < 255) - { - unsigned alpha = 255 - cover; - p[Order::R] = (value_type)(((p[Order::R] * alpha + 255) >> 8) + ((((sr * da + base_mask) >> base_shift) * cover + 255) >> 8)); - p[Order::G] = (value_type)(((p[Order::G] * alpha + 255) >> 8) + ((((sg * da + base_mask) >> base_shift) * cover + 255) >> 8)); - p[Order::B] = (value_type)(((p[Order::B] * alpha + 255) >> 8) + ((((sb * da + base_mask) >> base_shift) * cover + 255) >> 8)); - p[Order::A] = (value_type)(((p[Order::A] * alpha + 255) >> 8) + ((((sa * da + base_mask) >> base_shift) * cover + 255) >> 8)); - } - else - { - p[Order::R] = (value_type)((sr * da + base_mask) >> base_shift); - p[Order::G] = (value_type)((sg * da + base_mask) >> base_shift); - p[Order::B] = (value_type)((sb * da + base_mask) >> base_shift); - p[Order::A] = (value_type)((sa * da + base_mask) >> base_shift); - } - } - }; - - //======================================================comp_op_rgba_dst_out - template struct comp_op_rgba_dst_out - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = Dca.(1 - Sa) - // Da' = Da.(1 - Sa) - static AGG_INLINE void blend_pix(value_type* p, - unsigned, unsigned, unsigned, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sa = (sa * cover + 255) >> 8; - } - sa = base_mask - sa; - p[Order::R] = (value_type)((p[Order::R] * sa + base_shift) >> base_shift); - p[Order::G] = (value_type)((p[Order::G] * sa + base_shift) >> base_shift); - p[Order::B] = (value_type)((p[Order::B] * sa + base_shift) >> base_shift); - p[Order::A] = (value_type)((p[Order::A] * sa + base_shift) >> base_shift); - } - }; - - //=====================================================comp_op_rgba_src_atop - template struct comp_op_rgba_src_atop - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = Sca.Da + Dca.(1 - Sa) - // Da' = Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - calc_type da = p[Order::A]; - sa = base_mask - sa; - p[Order::R] = (value_type)((sr * da + p[Order::R] * sa + base_mask) >> base_shift); - p[Order::G] = (value_type)((sg * da + p[Order::G] * sa + base_mask) >> base_shift); - p[Order::B] = (value_type)((sb * da + p[Order::B] * sa + base_mask) >> base_shift); - } - }; - - //=====================================================comp_op_rgba_dst_atop - template struct comp_op_rgba_dst_atop - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = Dca.Sa + Sca.(1 - Da) - // Da' = Sa - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - calc_type da = base_mask - p[Order::A]; - if(cover < 255) - { - unsigned alpha = 255 - cover; - sr = (p[Order::R] * sa + sr * da + base_mask) >> base_shift; - sg = (p[Order::G] * sa + sg * da + base_mask) >> base_shift; - sb = (p[Order::B] * sa + sb * da + base_mask) >> base_shift; - p[Order::R] = (value_type)(((p[Order::R] * alpha + 255) >> 8) + ((sr * cover + 255) >> 8)); - p[Order::G] = (value_type)(((p[Order::G] * alpha + 255) >> 8) + ((sg * cover + 255) >> 8)); - p[Order::B] = (value_type)(((p[Order::B] * alpha + 255) >> 8) + ((sb * cover + 255) >> 8)); - p[Order::A] = (value_type)(((p[Order::A] * alpha + 255) >> 8) + ((sa * cover + 255) >> 8)); - - } - else - { - p[Order::R] = (value_type)((p[Order::R] * sa + sr * da + base_mask) >> base_shift); - p[Order::G] = (value_type)((p[Order::G] * sa + sg * da + base_mask) >> base_shift); - p[Order::B] = (value_type)((p[Order::B] * sa + sb * da + base_mask) >> base_shift); - p[Order::A] = (value_type)sa; - } - } - }; - - //=========================================================comp_op_rgba_xor - template struct comp_op_rgba_xor - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = Sca.(1 - Da) + Dca.(1 - Sa) - // Da' = Sa + Da - 2.Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - if(sa) - { - calc_type s1a = base_mask - sa; - calc_type d1a = base_mask - p[Order::A]; - p[Order::R] = (value_type)((p[Order::R] * s1a + sr * d1a + base_mask) >> base_shift); - p[Order::G] = (value_type)((p[Order::G] * s1a + sg * d1a + base_mask) >> base_shift); - p[Order::B] = (value_type)((p[Order::B] * s1a + sb * d1a + base_mask) >> base_shift); - p[Order::A] = (value_type)(sa + p[Order::A] - ((sa * p[Order::A] + base_mask/2) >> (base_shift - 1))); - } - } - }; - - //=========================================================comp_op_rgba_plus - template struct comp_op_rgba_plus - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = Sca + Dca - // Da' = Sa + Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - if(sa) - { - calc_type dr = p[Order::R] + sr; - calc_type dg = p[Order::G] + sg; - calc_type db = p[Order::B] + sb; - calc_type da = p[Order::A] + sa; - p[Order::R] = (dr > base_mask) ? (value_type)base_mask : dr; - p[Order::G] = (dg > base_mask) ? (value_type)base_mask : dg; - p[Order::B] = (db > base_mask) ? (value_type)base_mask : db; - p[Order::A] = (da > base_mask) ? (value_type)base_mask : da; - } - } - }; - - //========================================================comp_op_rgba_minus - template struct comp_op_rgba_minus - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = Dca - Sca - // Da' = 1 - (1 - Sa).(1 - Da) - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - if(sa) - { - calc_type dr = p[Order::R] - sr; - calc_type dg = p[Order::G] - sg; - calc_type db = p[Order::B] - sb; - p[Order::R] = (dr > base_mask) ? 0 : dr; - p[Order::G] = (dg > base_mask) ? 0 : dg; - p[Order::B] = (db > base_mask) ? 0 : db; - p[Order::A] = (value_type)(sa + p[Order::A] - ((sa * p[Order::A] + base_mask) >> base_shift)); - //p[Order::A] = (value_type)(base_mask - (((base_mask - sa) * (base_mask - p[Order::A]) + base_mask) >> base_shift)); - } - } - }; - - //=====================================================comp_op_rgba_multiply - template struct comp_op_rgba_multiply - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = Sca.Dca + Sca.(1 - Da) + Dca.(1 - Sa) - // Da' = Sa + Da - Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - if(sa) - { - calc_type s1a = base_mask - sa; - calc_type d1a = base_mask - p[Order::A]; - calc_type dr = p[Order::R]; - calc_type dg = p[Order::G]; - calc_type db = p[Order::B]; - p[Order::R] = (value_type)((sr * dr + sr * d1a + dr * s1a + base_mask) >> base_shift); - p[Order::G] = (value_type)((sg * dg + sg * d1a + dg * s1a + base_mask) >> base_shift); - p[Order::B] = (value_type)((sb * db + sb * d1a + db * s1a + base_mask) >> base_shift); - p[Order::A] = (value_type)(sa + p[Order::A] - ((sa * p[Order::A] + base_mask) >> base_shift)); - } - } - }; - - //=====================================================comp_op_rgba_screen - template struct comp_op_rgba_screen - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = Sca + Dca - Sca.Dca - // Da' = Sa + Da - Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - if(sa) - { - calc_type dr = p[Order::R]; - calc_type dg = p[Order::G]; - calc_type db = p[Order::B]; - calc_type da = p[Order::A]; - p[Order::R] = (value_type)(sr + dr - ((sr * dr + base_mask) >> base_shift)); - p[Order::G] = (value_type)(sg + dg - ((sg * dg + base_mask) >> base_shift)); - p[Order::B] = (value_type)(sb + db - ((sb * db + base_mask) >> base_shift)); - p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); - } - } - }; - - //=====================================================comp_op_rgba_overlay - template struct comp_op_rgba_overlay - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // if 2.Dca < Da - // Dca' = 2.Sca.Dca + Sca.(1 - Da) + Dca.(1 - Sa) - // otherwise - // Dca' = Sa.Da - 2.(Da - Dca).(Sa - Sca) + Sca.(1 - Da) + Dca.(1 - Sa) - // - // Da' = Sa + Da - Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - if(sa) - { - calc_type d1a = base_mask - p[Order::A]; - calc_type s1a = base_mask - sa; - calc_type dr = p[Order::R]; - calc_type dg = p[Order::G]; - calc_type db = p[Order::B]; - calc_type da = p[Order::A]; - calc_type sada = sa * p[Order::A]; - - p[Order::R] = (value_type)(((2*dr < da) ? - 2*sr*dr + sr*d1a + dr*s1a : - sada - 2*(da - dr)*(sa - sr) + sr*d1a + dr*s1a + base_mask) >> base_shift); - - p[Order::G] = (value_type)(((2*dg < da) ? - 2*sg*dg + sg*d1a + dg*s1a : - sada - 2*(da - dg)*(sa - sg) + sg*d1a + dg*s1a + base_mask) >> base_shift); - - p[Order::B] = (value_type)(((2*db < da) ? - 2*sb*db + sb*d1a + db*s1a : - sada - 2*(da - db)*(sa - sb) + sb*d1a + db*s1a + base_mask) >> base_shift); - - p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); - } - } - }; - - - template inline T sd_min(T a, T b) { return (a < b) ? a : b; } - template inline T sd_max(T a, T b) { return (a > b) ? a : b; } - - //=====================================================comp_op_rgba_darken - template struct comp_op_rgba_darken - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = min(Sca.Da, Dca.Sa) + Sca.(1 - Da) + Dca.(1 - Sa) - // Da' = Sa + Da - Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - if(sa) - { - calc_type d1a = base_mask - p[Order::A]; - calc_type s1a = base_mask - sa; - calc_type dr = p[Order::R]; - calc_type dg = p[Order::G]; - calc_type db = p[Order::B]; - calc_type da = p[Order::A]; - - p[Order::R] = (value_type)((sd_min(sr * da, dr * sa) + sr * d1a + dr * s1a + base_mask) >> base_shift); - p[Order::G] = (value_type)((sd_min(sg * da, dg * sa) + sg * d1a + dg * s1a + base_mask) >> base_shift); - p[Order::B] = (value_type)((sd_min(sb * da, db * sa) + sb * d1a + db * s1a + base_mask) >> base_shift); - p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); - } - } - }; - - //=====================================================comp_op_rgba_lighten - template struct comp_op_rgba_lighten - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = max(Sca.Da, Dca.Sa) + Sca.(1 - Da) + Dca.(1 - Sa) - // Da' = Sa + Da - Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - if(sa) - { - calc_type d1a = base_mask - p[Order::A]; - calc_type s1a = base_mask - sa; - calc_type dr = p[Order::R]; - calc_type dg = p[Order::G]; - calc_type db = p[Order::B]; - calc_type da = p[Order::A]; - - p[Order::R] = (value_type)((sd_max(sr * da, dr * sa) + sr * d1a + dr * s1a + base_mask) >> base_shift); - p[Order::G] = (value_type)((sd_max(sg * da, dg * sa) + sg * d1a + dg * s1a + base_mask) >> base_shift); - p[Order::B] = (value_type)((sd_max(sb * da, db * sa) + sb * d1a + db * s1a + base_mask) >> base_shift); - p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); - } - } - }; - - //=====================================================comp_op_rgba_color_dodge - template struct comp_op_rgba_color_dodge - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - typedef typename color_type::long_type long_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // if Sca.Da + Dca.Sa >= Sa.Da - // Dca' = Sa.Da + Sca.(1 - Da) + Dca.(1 - Sa) - // otherwise - // Dca' = Dca.Sa/(1-Sca/Sa) + Sca.(1 - Da) + Dca.(1 - Sa) - // - // Da' = Sa + Da - Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - if(sa) - { - calc_type d1a = base_mask - p[Order::A]; - calc_type s1a = base_mask - sa; - calc_type dr = p[Order::R]; - calc_type dg = p[Order::G]; - calc_type db = p[Order::B]; - calc_type da = p[Order::A]; - long_type drsa = dr * sa; - long_type dgsa = dg * sa; - long_type dbsa = db * sa; - long_type srda = sr * da; - long_type sgda = sg * da; - long_type sbda = sb * da; - long_type sada = sa * da; - - p[Order::R] = (value_type)((srda + drsa >= sada) ? - (sada + sr * d1a + dr * s1a + base_mask) >> base_shift : - drsa / (base_mask - (sr << base_shift) / sa) + ((sr * d1a + dr * s1a + base_mask) >> base_shift)); - - p[Order::G] = (value_type)((sgda + dgsa >= sada) ? - (sada + sg * d1a + dg * s1a + base_mask) >> base_shift : - dgsa / (base_mask - (sg << base_shift) / sa) + ((sg * d1a + dg * s1a + base_mask) >> base_shift)); - - p[Order::B] = (value_type)((sbda + dbsa >= sada) ? - (sada + sb * d1a + db * s1a + base_mask) >> base_shift : - dbsa / (base_mask - (sb << base_shift) / sa) + ((sb * d1a + db * s1a + base_mask) >> base_shift)); - - p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); - } - } - }; - - //=====================================================comp_op_rgba_color_burn - template struct comp_op_rgba_color_burn - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - typedef typename color_type::long_type long_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // if Sca.Da + Dca.Sa <= Sa.Da - // Dca' = Sca.(1 - Da) + Dca.(1 - Sa) - // otherwise - // Dca' = Sa.(Sca.Da + Dca.Sa - Sa.Da)/Sca + Sca.(1 - Da) + Dca.(1 - Sa) - // - // Da' = Sa + Da - Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - if(sa) - { - calc_type d1a = base_mask - p[Order::A]; - calc_type s1a = base_mask - sa; - calc_type dr = p[Order::R]; - calc_type dg = p[Order::G]; - calc_type db = p[Order::B]; - calc_type da = p[Order::A]; - long_type drsa = dr * sa; - long_type dgsa = dg * sa; - long_type dbsa = db * sa; - long_type srda = sr * da; - long_type sgda = sg * da; - long_type sbda = sb * da; - long_type sada = sa * da; - - p[Order::R] = (value_type)(((srda + drsa <= sada) ? - sr * d1a + dr * s1a : - sa * (srda + drsa - sada) / sr + sr * d1a + dr * s1a + base_mask) >> base_shift); - - p[Order::G] = (value_type)(((sgda + dgsa <= sada) ? - sg * d1a + dg * s1a : - sa * (sgda + dgsa - sada) / sg + sg * d1a + dg * s1a + base_mask) >> base_shift); - - p[Order::B] = (value_type)(((sbda + dbsa <= sada) ? - sb * d1a + db * s1a : - sa * (sbda + dbsa - sada) / sb + sb * d1a + db * s1a + base_mask) >> base_shift); - - p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); - } - } - }; - - //=====================================================comp_op_rgba_hard_light - template struct comp_op_rgba_hard_light - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - typedef typename color_type::long_type long_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // if 2.Sca < Sa - // Dca' = 2.Sca.Dca + Sca.(1 - Da) + Dca.(1 - Sa) - // otherwise - // Dca' = Sa.Da - 2.(Da - Dca).(Sa - Sca) + Sca.(1 - Da) + Dca.(1 - Sa) - // - // Da' = Sa + Da - Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - if(sa) - { - calc_type d1a = base_mask - p[Order::A]; - calc_type s1a = base_mask - sa; - calc_type dr = p[Order::R]; - calc_type dg = p[Order::G]; - calc_type db = p[Order::B]; - calc_type da = p[Order::A]; - calc_type sada = sa * da; - - p[Order::R] = (value_type)(((2*sr < sa) ? - 2*sr*dr + sr*d1a + dr*s1a : - sada - 2*(da - dr)*(sa - sr) + sr*d1a + dr*s1a + base_mask) >> base_shift); - - p[Order::G] = (value_type)(((2*sg < sa) ? - 2*sg*dg + sg*d1a + dg*s1a : - sada - 2*(da - dg)*(sa - sg) + sg*d1a + dg*s1a + base_mask) >> base_shift); - - p[Order::B] = (value_type)(((2*sb < sa) ? - 2*sb*db + sb*d1a + db*s1a : - sada - 2*(da - db)*(sa - sb) + sb*d1a + db*s1a + base_mask) >> base_shift); - - p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); - } - } - }; - - //=====================================================comp_op_rgba_soft_light - template struct comp_op_rgba_soft_light - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - typedef typename color_type::long_type long_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // if 2.Sca < Sa - // Dca' = Dca.(Sa + (1 - Dca/Da).(2.Sca - Sa)) + Sca.(1 - Da) + Dca.(1 - Sa) - // otherwise if 8.Dca <= Da - // Dca' = Dca.(Sa + (1 - Dca/Da).(2.Sca - Sa).(3 - 8.Dca/Da)) + Sca.(1 - Da) + Dca.(1 - Sa) - // otherwise - // Dca' = (Dca.Sa + ((Dca/Da)^(0.5).Da - Dca).(2.Sca - Sa)) + Sca.(1 - Da) + Dca.(1 - Sa) - // - // Da' = Sa + Da - Sa.Da - - static AGG_INLINE void blend_pix(value_type* p, - unsigned r, unsigned g, unsigned b, - unsigned a, unsigned cover) - { - double sr = double(r * cover) / (base_mask * 255); - double sg = double(g * cover) / (base_mask * 255); - double sb = double(b * cover) / (base_mask * 255); - double sa = double(a * cover) / (base_mask * 255); - if(sa > 0) - { - double dr = double(p[Order::R]) / base_mask; - double dg = double(p[Order::G]) / base_mask; - double db = double(p[Order::B]) / base_mask; - double da = double(p[Order::A] ? p[Order::A] : 1) / base_mask; - if(cover < 255) - { - a = (a * cover + 255) >> 8; - } - - if(2*sr < sa) dr = dr*(sa + (1 - dr/da)*(2*sr - sa)) + sr*(1 - da) + dr*(1 - sa); - else if(8*dr <= da) dr = dr*(sa + (1 - dr/da)*(2*sr - sa)*(3 - 8*dr/da)) + sr*(1 - da) + dr*(1 - sa); - else dr = (dr*sa + (sqrt(dr/da)*da - dr)*(2*sr - sa)) + sr*(1 - da) + dr*(1 - sa); - - if(2*sg < sa) dg = dg*(sa + (1 - dg/da)*(2*sg - sa)) + sg*(1 - da) + dg*(1 - sa); - else if(8*dg <= da) dg = dg*(sa + (1 - dg/da)*(2*sg - sa)*(3 - 8*dg/da)) + sg*(1 - da) + dg*(1 - sa); - else dg = (dg*sa + (sqrt(dg/da)*da - dg)*(2*sg - sa)) + sg*(1 - da) + dg*(1 - sa); - - if(2*sb < sa) db = db*(sa + (1 - db/da)*(2*sb - sa)) + sb*(1 - da) + db*(1 - sa); - else if(8*db <= da) db = db*(sa + (1 - db/da)*(2*sb - sa)*(3 - 8*db/da)) + sb*(1 - da) + db*(1 - sa); - else db = (db*sa + (sqrt(db/da)*da - db)*(2*sb - sa)) + sb*(1 - da) + db*(1 - sa); - - p[Order::R] = (value_type)uround(dr * base_mask); - p[Order::G] = (value_type)uround(dg * base_mask); - p[Order::B] = (value_type)uround(db * base_mask); - p[Order::A] = (value_type)(a + p[Order::A] - ((a * p[Order::A] + base_mask) >> base_shift)); - } - } - }; - - //=====================================================comp_op_rgba_difference - template struct comp_op_rgba_difference - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - typedef typename color_type::long_type long_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_scale = color_type::base_scale, - base_mask = color_type::base_mask - }; - - // Dca' = Sca + Dca - 2.min(Sca.Da, Dca.Sa) - // Da' = Sa + Da - Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - if(sa) - { - calc_type dr = p[Order::R]; - calc_type dg = p[Order::G]; - calc_type db = p[Order::B]; - calc_type da = p[Order::A]; - p[Order::R] = (value_type)(sr + dr - ((2 * sd_min(sr*da, dr*sa) + base_mask) >> base_shift)); - p[Order::G] = (value_type)(sg + dg - ((2 * sd_min(sg*da, dg*sa) + base_mask) >> base_shift)); - p[Order::B] = (value_type)(sb + db - ((2 * sd_min(sb*da, db*sa) + base_mask) >> base_shift)); - p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); - } - } - }; - - //=====================================================comp_op_rgba_exclusion - template struct comp_op_rgba_exclusion - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - typedef typename color_type::long_type long_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = (Sca.Da + Dca.Sa - 2.Sca.Dca) + Sca.(1 - Da) + Dca.(1 - Sa) - // Da' = Sa + Da - Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - if(sa) - { - calc_type d1a = base_mask - p[Order::A]; - calc_type s1a = base_mask - sa; - calc_type dr = p[Order::R]; - calc_type dg = p[Order::G]; - calc_type db = p[Order::B]; - calc_type da = p[Order::A]; - p[Order::R] = (value_type)((sr*da + dr*sa - 2*sr*dr + sr*d1a + dr*s1a + base_mask) >> base_shift); - p[Order::G] = (value_type)((sg*da + dg*sa - 2*sg*dg + sg*d1a + dg*s1a + base_mask) >> base_shift); - p[Order::B] = (value_type)((sb*da + db*sa - 2*sb*db + sb*d1a + db*s1a + base_mask) >> base_shift); - p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); - } - } - }; - - //=====================================================comp_op_rgba_contrast - template struct comp_op_rgba_contrast - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - typedef typename color_type::long_type long_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - long_type dr = p[Order::R]; - long_type dg = p[Order::G]; - long_type db = p[Order::B]; - int da = p[Order::A]; - long_type d2a = da >> 1; - unsigned s2a = sa >> 1; - - int r = (int)((((dr - d2a) * int((sr - s2a)*2 + base_mask)) >> base_shift) + d2a); - int g = (int)((((dg - d2a) * int((sg - s2a)*2 + base_mask)) >> base_shift) + d2a); - int b = (int)((((db - d2a) * int((sb - s2a)*2 + base_mask)) >> base_shift) + d2a); - - r = (r < 0) ? 0 : r; - g = (g < 0) ? 0 : g; - b = (b < 0) ? 0 : b; - - p[Order::R] = (value_type)((r > da) ? da : r); - p[Order::G] = (value_type)((g > da) ? da : g); - p[Order::B] = (value_type)((b > da) ? da : b); - } - }; - - //=====================================================comp_op_rgba_invert - template struct comp_op_rgba_invert - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - typedef typename color_type::long_type long_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = (Da - Dca) * Sa + Dca.(1 - Sa) - // Da' = Sa + Da - Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - sa = (sa * cover + 255) >> 8; - if(sa) - { - calc_type da = p[Order::A]; - calc_type dr = ((da - p[Order::R]) * sa + base_mask) >> base_shift; - calc_type dg = ((da - p[Order::G]) * sa + base_mask) >> base_shift; - calc_type db = ((da - p[Order::B]) * sa + base_mask) >> base_shift; - calc_type s1a = base_mask - sa; - p[Order::R] = (value_type)(dr + ((p[Order::R] * s1a + base_mask) >> base_shift)); - p[Order::G] = (value_type)(dg + ((p[Order::G] * s1a + base_mask) >> base_shift)); - p[Order::B] = (value_type)(db + ((p[Order::B] * s1a + base_mask) >> base_shift)); - p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); - } - } - }; - - //=================================================comp_op_rgba_invert_rgb - template struct comp_op_rgba_invert_rgb - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - typedef typename color_type::long_type long_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = (Da - Dca) * Sca + Dca.(1 - Sa) - // Da' = Sa + Da - Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - if(sa) - { - calc_type da = p[Order::A]; - calc_type dr = ((da - p[Order::R]) * sr + base_mask) >> base_shift; - calc_type dg = ((da - p[Order::G]) * sg + base_mask) >> base_shift; - calc_type db = ((da - p[Order::B]) * sb + base_mask) >> base_shift; - calc_type s1a = base_mask - sa; - p[Order::R] = (value_type)(dr + ((p[Order::R] * s1a + base_mask) >> base_shift)); - p[Order::G] = (value_type)(dg + ((p[Order::G] * s1a + base_mask) >> base_shift)); - p[Order::B] = (value_type)(db + ((p[Order::B] * s1a + base_mask) >> base_shift)); - p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); - } - } - }; - - - - - - //======================================================comp_op_table_rgba - template struct comp_op_table_rgba - { - typedef typename ColorT::value_type value_type; - typedef void (*comp_op_func_type)(value_type* p, - unsigned cr, - unsigned cg, - unsigned cb, - unsigned ca, - unsigned cover); - static comp_op_func_type g_comp_op_func[]; - }; - - //==========================================================g_comp_op_func - template - typename comp_op_table_rgba::comp_op_func_type - comp_op_table_rgba::g_comp_op_func[] = - { - comp_op_rgba_clear ::blend_pix, - comp_op_rgba_src ::blend_pix, - comp_op_rgba_dst ::blend_pix, - comp_op_rgba_src_over ::blend_pix, - comp_op_rgba_dst_over ::blend_pix, - comp_op_rgba_src_in ::blend_pix, - comp_op_rgba_dst_in ::blend_pix, - comp_op_rgba_src_out ::blend_pix, - comp_op_rgba_dst_out ::blend_pix, - comp_op_rgba_src_atop ::blend_pix, - comp_op_rgba_dst_atop ::blend_pix, - comp_op_rgba_xor ::blend_pix, - comp_op_rgba_plus ::blend_pix, - comp_op_rgba_minus ::blend_pix, - comp_op_rgba_multiply ::blend_pix, - comp_op_rgba_screen ::blend_pix, - comp_op_rgba_overlay ::blend_pix, - comp_op_rgba_darken ::blend_pix, - comp_op_rgba_lighten ::blend_pix, - comp_op_rgba_color_dodge::blend_pix, - comp_op_rgba_color_burn ::blend_pix, - comp_op_rgba_hard_light ::blend_pix, - comp_op_rgba_soft_light ::blend_pix, - comp_op_rgba_difference ::blend_pix, - comp_op_rgba_exclusion ::blend_pix, - comp_op_rgba_contrast ::blend_pix, - comp_op_rgba_invert ::blend_pix, - comp_op_rgba_invert_rgb ::blend_pix, - 0 - }; - - - //==============================================================comp_op_e - enum comp_op_e - { - comp_op_clear, //----comp_op_clear - comp_op_src, //----comp_op_src - comp_op_dst, //----comp_op_dst - comp_op_src_over, //----comp_op_src_over - comp_op_dst_over, //----comp_op_dst_over - comp_op_src_in, //----comp_op_src_in - comp_op_dst_in, //----comp_op_dst_in - comp_op_src_out, //----comp_op_src_out - comp_op_dst_out, //----comp_op_dst_out - comp_op_src_atop, //----comp_op_src_atop - comp_op_dst_atop, //----comp_op_dst_atop - comp_op_xor, //----comp_op_xor - comp_op_plus, //----comp_op_plus - comp_op_minus, //----comp_op_minus - comp_op_multiply, //----comp_op_multiply - comp_op_screen, //----comp_op_screen - comp_op_overlay, //----comp_op_overlay - comp_op_darken, //----comp_op_darken - comp_op_lighten, //----comp_op_lighten - comp_op_color_dodge, //----comp_op_color_dodge - comp_op_color_burn, //----comp_op_color_burn - comp_op_hard_light, //----comp_op_hard_light - comp_op_soft_light, //----comp_op_soft_light - comp_op_difference, //----comp_op_difference - comp_op_exclusion, //----comp_op_exclusion - comp_op_contrast, //----comp_op_contrast - comp_op_invert, //----comp_op_invert - comp_op_invert_rgb, //----comp_op_invert_rgb - - end_of_comp_op_e - }; - - - - - - - - //====================================================comp_op_adaptor_rgba - template struct comp_op_adaptor_rgba - { - typedef Order order_type; - typedef ColorT color_type; - typedef typename color_type::value_type value_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - static AGG_INLINE void blend_pix(unsigned op, value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned ca, - unsigned cover) - { - comp_op_table_rgba::g_comp_op_func[op] - (p, (cr * ca + base_mask) >> base_shift, - (cg * ca + base_mask) >> base_shift, - (cb * ca + base_mask) >> base_shift, - ca, cover); - } - }; - - //=========================================comp_op_adaptor_clip_to_dst_rgba - template struct comp_op_adaptor_clip_to_dst_rgba - { - typedef Order order_type; - typedef ColorT color_type; - typedef typename color_type::value_type value_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - static AGG_INLINE void blend_pix(unsigned op, value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned ca, - unsigned cover) - { - cr = (cr * ca + base_mask) >> base_shift; - cg = (cg * ca + base_mask) >> base_shift; - cb = (cb * ca + base_mask) >> base_shift; - unsigned da = p[Order::A]; - comp_op_table_rgba::g_comp_op_func[op] - (p, (cr * da + base_mask) >> base_shift, - (cg * da + base_mask) >> base_shift, - (cb * da + base_mask) >> base_shift, - (ca * da + base_mask) >> base_shift, - cover); - } - }; - - //================================================comp_op_adaptor_rgba_pre - template struct comp_op_adaptor_rgba_pre - { - typedef Order order_type; - typedef ColorT color_type; - typedef typename color_type::value_type value_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - static AGG_INLINE void blend_pix(unsigned op, value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned ca, - unsigned cover) - { - comp_op_table_rgba::g_comp_op_func[op](p, cr, cg, cb, ca, cover); - } - }; - - //=====================================comp_op_adaptor_clip_to_dst_rgba_pre - template struct comp_op_adaptor_clip_to_dst_rgba_pre - { - typedef Order order_type; - typedef ColorT color_type; - typedef typename color_type::value_type value_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - static AGG_INLINE void blend_pix(unsigned op, value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned ca, - unsigned cover) - { - unsigned da = p[Order::A]; - comp_op_table_rgba::g_comp_op_func[op] - (p, (cr * da + base_mask) >> base_shift, - (cg * da + base_mask) >> base_shift, - (cb * da + base_mask) >> base_shift, - (ca * da + base_mask) >> base_shift, - cover); - } - }; - - //=======================================================comp_adaptor_rgba - template struct comp_adaptor_rgba - { - typedef typename BlenderPre::order_type order_type; - typedef typename BlenderPre::color_type color_type; - typedef typename color_type::value_type value_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - static AGG_INLINE void blend_pix(unsigned op, value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned ca, - unsigned cover) - { - BlenderPre::blend_pix(p, - (cr * ca + base_mask) >> base_shift, - (cg * ca + base_mask) >> base_shift, - (cb * ca + base_mask) >> base_shift, - ca, cover); - } - }; - - //==========================================comp_adaptor_clip_to_dst_rgba - template struct comp_adaptor_clip_to_dst_rgba - { - typedef typename BlenderPre::order_type order_type; - typedef typename BlenderPre::color_type color_type; - typedef typename color_type::value_type value_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - static AGG_INLINE void blend_pix(unsigned op, value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned ca, - unsigned cover) - { - cr = (cr * ca + base_mask) >> base_shift; - cg = (cg * ca + base_mask) >> base_shift; - cb = (cb * ca + base_mask) >> base_shift; - unsigned da = p[order_type::A]; - BlenderPre::blend_pix(p, - (cr * da + base_mask) >> base_shift, - (cg * da + base_mask) >> base_shift, - (cb * da + base_mask) >> base_shift, - (ca * da + base_mask) >> base_shift, - cover); - } - }; - - //======================================comp_adaptor_clip_to_dst_rgba_pre - template struct comp_adaptor_clip_to_dst_rgba_pre - { - typedef typename BlenderPre::order_type order_type; - typedef typename BlenderPre::color_type color_type; - typedef typename color_type::value_type value_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - static AGG_INLINE void blend_pix(unsigned op, value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned ca, - unsigned cover) - { - unsigned da = p[order_type::A]; - BlenderPre::blend_pix(p, - (cr * da + base_mask) >> base_shift, - (cg * da + base_mask) >> base_shift, - (cb * da + base_mask) >> base_shift, - (ca * da + base_mask) >> base_shift, - cover); - } - }; - - - - - - - //===============================================copy_or_blend_rgba_wrapper - template struct copy_or_blend_rgba_wrapper - { - typedef typename Blender::color_type color_type; - typedef typename Blender::order_type order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_scale = color_type::base_scale, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - static AGG_INLINE void copy_or_blend_pix(value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha) - { - if(alpha) - { - if(alpha == base_mask) - { - p[order_type::R] = cr; - p[order_type::G] = cg; - p[order_type::B] = cb; - p[order_type::A] = base_mask; - } - else - { - Blender::blend_pix(p, cr, cg, cb, alpha); - } - } - } - - //-------------------------------------------------------------------- - static AGG_INLINE void copy_or_blend_pix(value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned cover) - { - if(cover == 255) - { - copy_or_blend_pix(p, cr, cg, cb, alpha); - } - else - { - if(alpha) - { - alpha = (alpha * (cover + 1)) >> 8; - if(alpha == base_mask) - { - p[order_type::R] = cr; - p[order_type::G] = cg; - p[order_type::B] = cb; - p[order_type::A] = base_mask; - } - else - { - Blender::blend_pix(p, cr, cg, cb, alpha, cover); - } - } - } - } - }; - - - - - - - //=================================================pixfmt_alpha_blend_rgba - template - class pixfmt_alpha_blend_rgba - { - public: - typedef RenBuf rbuf_type; - typedef typename rbuf_type::row_data row_data; - typedef PixelT pixel_type; - typedef Blender blender_type; - typedef typename blender_type::color_type color_type; - typedef typename blender_type::order_type order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - typedef copy_or_blend_rgba_wrapper cob_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_scale = color_type::base_scale, - base_mask = color_type::base_mask, - pix_width = sizeof(pixel_type) - }; - - //-------------------------------------------------------------------- - pixfmt_alpha_blend_rgba() : m_rbuf(0) {} - explicit pixfmt_alpha_blend_rgba(rbuf_type& rb) : m_rbuf(&rb) {} - void attach(rbuf_type& rb) { m_rbuf = &rb; } - - //-------------------------------------------------------------------- - template - bool attach(PixFmt& pixf, int x1, int y1, int x2, int y2) - { - rect_i r(x1, y1, x2, y2); - if(r.clip(rect_i(0, 0, pixf.width()-1, pixf.height()-1))) - { - int stride = pixf.stride(); - m_rbuf->attach(pixf.pix_ptr(r.x1, stride < 0 ? r.y2 : r.y1), - (r.x2 - r.x1) + 1, - (r.y2 - r.y1) + 1, - stride); - return true; - } - return false; - } - - //-------------------------------------------------------------------- - AGG_INLINE unsigned width() const { return m_rbuf->width(); } - AGG_INLINE unsigned height() const { return m_rbuf->height(); } - AGG_INLINE int stride() const { return m_rbuf->stride(); } - - //-------------------------------------------------------------------- - AGG_INLINE int8u* row_ptr(int y) { return m_rbuf->row_ptr(y); } - AGG_INLINE const int8u* row_ptr(int y) const { return m_rbuf->row_ptr(y); } - AGG_INLINE row_data row(int y) const { return m_rbuf->row(y); } - - //-------------------------------------------------------------------- - AGG_INLINE int8u* pix_ptr(int x, int y) - { - return m_rbuf->row_ptr(y) + x * pix_width; - } - - AGG_INLINE const int8u* pix_ptr(int x, int y) const - { - return m_rbuf->row_ptr(y) + x * pix_width; - } - - - //-------------------------------------------------------------------- - AGG_INLINE static void make_pix(int8u* p, const color_type& c) - { - ((value_type*)p)[order_type::R] = c.r; - ((value_type*)p)[order_type::G] = c.g; - ((value_type*)p)[order_type::B] = c.b; - ((value_type*)p)[order_type::A] = c.a; - } - - //-------------------------------------------------------------------- - AGG_INLINE color_type pixel(int x, int y) const - { - const value_type* p = (const value_type*)m_rbuf->row_ptr(y); - if(p) - { - p += x << 2; - return color_type(p[order_type::R], - p[order_type::G], - p[order_type::B], - p[order_type::A]); - } - return color_type::no_color(); - } - - //-------------------------------------------------------------------- - AGG_INLINE void copy_pixel(int x, int y, const color_type& c) - { - value_type* p = (value_type*)m_rbuf->row_ptr(x, y, 1) + (x << 2); - p[order_type::R] = c.r; - p[order_type::G] = c.g; - p[order_type::B] = c.b; - p[order_type::A] = c.a; - } - - //-------------------------------------------------------------------- - AGG_INLINE void blend_pixel(int x, int y, const color_type& c, int8u cover) - { - cob_type::copy_or_blend_pix( - (value_type*)m_rbuf->row_ptr(x, y, 1) + (x << 2), - c.r, c.g, c.b, c.a, - cover); - } - - - //-------------------------------------------------------------------- - AGG_INLINE void copy_hline(int x, int y, - unsigned len, - const color_type& c) - { - value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2); - pixel_type v; - ((value_type*)&v)[order_type::R] = c.r; - ((value_type*)&v)[order_type::G] = c.g; - ((value_type*)&v)[order_type::B] = c.b; - ((value_type*)&v)[order_type::A] = c.a; - do - { - *(pixel_type*)p = v; - p += 4; - } - while(--len); - } - - - //-------------------------------------------------------------------- - AGG_INLINE void copy_vline(int x, int y, - unsigned len, - const color_type& c) - { - pixel_type v; - ((value_type*)&v)[order_type::R] = c.r; - ((value_type*)&v)[order_type::G] = c.g; - ((value_type*)&v)[order_type::B] = c.b; - ((value_type*)&v)[order_type::A] = c.a; - do - { - value_type* p = (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2); - *(pixel_type*)p = v; - } - while(--len); - } - - - //-------------------------------------------------------------------- - void blend_hline(int x, int y, - unsigned len, - const color_type& c, - int8u cover) - { - if (c.a) - { - value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2); - calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8; - if(alpha == base_mask) - { - pixel_type v; - ((value_type*)&v)[order_type::R] = c.r; - ((value_type*)&v)[order_type::G] = c.g; - ((value_type*)&v)[order_type::B] = c.b; - ((value_type*)&v)[order_type::A] = c.a; - do - { - *(pixel_type*)p = v; - p += 4; - } - while(--len); - } - else - { - if(cover == 255) - { - do - { - blender_type::blend_pix(p, c.r, c.g, c.b, alpha); - p += 4; - } - while(--len); - } - else - { - do - { - blender_type::blend_pix(p, c.r, c.g, c.b, alpha, cover); - p += 4; - } - while(--len); - } - } - } - } - - - //-------------------------------------------------------------------- - void blend_vline(int x, int y, - unsigned len, - const color_type& c, - int8u cover) - { - if (c.a) - { - value_type* p; - calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8; - if(alpha == base_mask) - { - pixel_type v; - ((value_type*)&v)[order_type::R] = c.r; - ((value_type*)&v)[order_type::G] = c.g; - ((value_type*)&v)[order_type::B] = c.b; - ((value_type*)&v)[order_type::A] = c.a; - do - { - p = (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2); - *(pixel_type*)p = v; - } - while(--len); - } - else - { - if(cover == 255) - { - do - { - p = (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2); - blender_type::blend_pix(p, c.r, c.g, c.b, alpha); - } - while(--len); - } - else - { - do - { - p = (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2); - blender_type::blend_pix(p, c.r, c.g, c.b, alpha, cover); - } - while(--len); - } - } - } - } - - - //-------------------------------------------------------------------- - void blend_solid_hspan(int x, int y, - unsigned len, - const color_type& c, - const int8u* covers) - { - if (c.a) - { - value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2); - do - { - calc_type alpha = (calc_type(c.a) * (calc_type(*covers) + 1)) >> 8; - if(alpha == base_mask) - { - p[order_type::R] = c.r; - p[order_type::G] = c.g; - p[order_type::B] = c.b; - p[order_type::A] = base_mask; - } - else - { - blender_type::blend_pix(p, c.r, c.g, c.b, alpha, *covers); - } - p += 4; - ++covers; - } - while(--len); - } - } - - - //-------------------------------------------------------------------- - void blend_solid_vspan(int x, int y, - unsigned len, - const color_type& c, - const int8u* covers) - { - if (c.a) - { - do - { - value_type* p = (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2); - calc_type alpha = (calc_type(c.a) * (calc_type(*covers) + 1)) >> 8; - if(alpha == base_mask) - { - p[order_type::R] = c.r; - p[order_type::G] = c.g; - p[order_type::B] = c.b; - p[order_type::A] = base_mask; - } - else - { - blender_type::blend_pix(p, c.r, c.g, c.b, alpha, *covers); - } - ++covers; - } - while(--len); - } - } - - - //-------------------------------------------------------------------- - void copy_color_hspan(int x, int y, - unsigned len, - const color_type* colors) - { - value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2); - do - { - p[order_type::R] = colors->r; - p[order_type::G] = colors->g; - p[order_type::B] = colors->b; - p[order_type::A] = colors->a; - ++colors; - p += 4; - } - while(--len); - } - - - //-------------------------------------------------------------------- - void copy_color_vspan(int x, int y, - unsigned len, - const color_type* colors) - { - do - { - value_type* p = (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2); - p[order_type::R] = colors->r; - p[order_type::G] = colors->g; - p[order_type::B] = colors->b; - p[order_type::A] = colors->a; - ++colors; - } - while(--len); - } - - - //-------------------------------------------------------------------- - void blend_color_hspan(int x, int y, - unsigned len, - const color_type* colors, - const int8u* covers, - int8u cover) - { - value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2); - if(covers) - { - do - { - cob_type::copy_or_blend_pix(p, - colors->r, - colors->g, - colors->b, - colors->a, - *covers++); - p += 4; - ++colors; - } - while(--len); - } - else - { - if(cover == 255) - { - do - { - cob_type::copy_or_blend_pix(p, - colors->r, - colors->g, - colors->b, - colors->a); - p += 4; - ++colors; - } - while(--len); - } - else - { - do - { - cob_type::copy_or_blend_pix(p, - colors->r, - colors->g, - colors->b, - colors->a, - cover); - p += 4; - ++colors; - } - while(--len); - } - } - } - - - - //-------------------------------------------------------------------- - void blend_color_vspan(int x, int y, - unsigned len, - const color_type* colors, - const int8u* covers, - int8u cover) - { - value_type* p; - if(covers) - { - do - { - p = (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2); - cob_type::copy_or_blend_pix(p, - colors->r, - colors->g, - colors->b, - colors->a, - *covers++); - ++colors; - } - while(--len); - } - else - { - if(cover == 255) - { - do - { - p = (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2); - cob_type::copy_or_blend_pix(p, - colors->r, - colors->g, - colors->b, - colors->a); - ++colors; - } - while(--len); - } - else - { - do - { - p = (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2); - cob_type::copy_or_blend_pix(p, - colors->r, - colors->g, - colors->b, - colors->a, - cover); - ++colors; - } - while(--len); - } - } - } - - //-------------------------------------------------------------------- - template void for_each_pixel(Function f) - { - unsigned y; - for(y = 0; y < height(); ++y) - { - row_data r = m_rbuf->row(y); - if(r.ptr) - { - unsigned len = r.x2 - r.x1 + 1; - value_type* p = - (value_type*)m_rbuf->row_ptr(r.x1, y, len) + (r.x1 << 2); - do - { - f(p); - p += 4; - } - while(--len); - } - } - } - - //-------------------------------------------------------------------- - void premultiply() - { - for_each_pixel(multiplier_rgba::premultiply); - } - - //-------------------------------------------------------------------- - void demultiply() - { - for_each_pixel(multiplier_rgba::demultiply); - } - - //-------------------------------------------------------------------- - template void apply_gamma_dir(const GammaLut& g) - { - for_each_pixel(apply_gamma_dir_rgba(g)); - } - - //-------------------------------------------------------------------- - template void apply_gamma_inv(const GammaLut& g) - { - for_each_pixel(apply_gamma_inv_rgba(g)); - } - - //-------------------------------------------------------------------- - template void copy_from(const RenBuf2& from, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len) - { - const int8u* p = from.row_ptr(ysrc); - if(p) - { - memmove(m_rbuf->row_ptr(xdst, ydst, len) + xdst * pix_width, - p + xsrc * pix_width, - len * pix_width); - } - } - - //-------------------------------------------------------------------- - template - void blend_from(const SrcPixelFormatRenderer& from, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len, - int8u cover) - { - typedef typename SrcPixelFormatRenderer::order_type src_order; - const value_type* psrc = (value_type*)from.row_ptr(ysrc); - if(psrc) - { - psrc += xsrc << 2; - value_type* pdst = - (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + (xdst << 2); - int incp = 4; - if(xdst > xsrc) - { - psrc += (len-1) << 2; - pdst += (len-1) << 2; - incp = -4; - } - - if(cover == 255) - { - do - { - cob_type::copy_or_blend_pix(pdst, - psrc[src_order::R], - psrc[src_order::G], - psrc[src_order::B], - psrc[src_order::A]); - psrc += incp; - pdst += incp; - } - while(--len); - } - else - { - do - { - cob_type::copy_or_blend_pix(pdst, - psrc[src_order::R], - psrc[src_order::G], - psrc[src_order::B], - psrc[src_order::A], - cover); - psrc += incp; - pdst += incp; - } - while(--len); - } - } - } - - //-------------------------------------------------------------------- - template - void blend_from_color(const SrcPixelFormatRenderer& from, - const color_type& color, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len, - int8u cover) - { - typedef typename SrcPixelFormatRenderer::value_type src_value_type; - const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc); - if(psrc) - { - value_type* pdst = - (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + (xdst << 2); - do - { - cob_type::copy_or_blend_pix(pdst, - color.r, color.g, color.b, color.a, - (*psrc * cover + base_mask) >> base_shift); - ++psrc; - pdst += 4; - } - while(--len); - } - } - - //-------------------------------------------------------------------- - template - void blend_from_lut(const SrcPixelFormatRenderer& from, - const color_type* color_lut, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len, - int8u cover) - { - typedef typename SrcPixelFormatRenderer::value_type src_value_type; - const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc); - if(psrc) - { - value_type* pdst = - (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + (xdst << 2); - - if(cover == 255) - { - do - { - const color_type& color = color_lut[*psrc]; - cob_type::copy_or_blend_pix(pdst, - color.r, color.g, color.b, color.a); - ++psrc; - pdst += 4; - } - while(--len); - } - else - { - do - { - const color_type& color = color_lut[*psrc]; - cob_type::copy_or_blend_pix(pdst, - color.r, color.g, color.b, color.a, - cover); - ++psrc; - pdst += 4; - } - while(--len); - } - } - } - - private: - rbuf_type* m_rbuf; - }; - - - - - //================================================pixfmt_custom_blend_rgba - template class pixfmt_custom_blend_rgba - { - public: - typedef RenBuf rbuf_type; - typedef typename rbuf_type::row_data row_data; - typedef Blender blender_type; - typedef typename blender_type::color_type color_type; - typedef typename blender_type::order_type order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_scale = color_type::base_scale, - base_mask = color_type::base_mask, - pix_width = sizeof(value_type) * 4 - }; - - - //-------------------------------------------------------------------- - pixfmt_custom_blend_rgba() : m_rbuf(0), m_comp_op(3) {} - explicit pixfmt_custom_blend_rgba(rbuf_type& rb, unsigned comp_op=3) : - m_rbuf(&rb), - m_comp_op(comp_op) - {} - void attach(rbuf_type& rb) { m_rbuf = &rb; } - - //-------------------------------------------------------------------- - template - bool attach(PixFmt& pixf, int x1, int y1, int x2, int y2) - { - rect_i r(x1, y1, x2, y2); - if(r.clip(rect_i(0, 0, pixf.width()-1, pixf.height()-1))) - { - int stride = pixf.stride(); - m_rbuf->attach(pixf.pix_ptr(r.x1, stride < 0 ? r.y2 : r.y1), - (r.x2 - r.x1) + 1, - (r.y2 - r.y1) + 1, - stride); - return true; - } - return false; - } - - //-------------------------------------------------------------------- - AGG_INLINE unsigned width() const { return m_rbuf->width(); } - AGG_INLINE unsigned height() const { return m_rbuf->height(); } - AGG_INLINE int stride() const { return m_rbuf->stride(); } - - //-------------------------------------------------------------------- - AGG_INLINE int8u* row_ptr(int y) { return m_rbuf->row_ptr(y); } - AGG_INLINE const int8u* row_ptr(int y) const { return m_rbuf->row_ptr(y); } - AGG_INLINE row_data row(int y) const { return m_rbuf->row(y); } - - //-------------------------------------------------------------------- - AGG_INLINE int8u* pix_ptr(int x, int y) - { - return m_rbuf->row_ptr(y) + x * pix_width; - } - - AGG_INLINE const int8u* pix_ptr(int x, int y) const - { - return m_rbuf->row_ptr(y) + x * pix_width; - } - - //-------------------------------------------------------------------- - void comp_op(unsigned op) { m_comp_op = op; } - unsigned comp_op() const { return m_comp_op; } - - //-------------------------------------------------------------------- - AGG_INLINE static void make_pix(int8u* p, const color_type& c) - { - ((value_type*)p)[order_type::R] = c.r; - ((value_type*)p)[order_type::G] = c.g; - ((value_type*)p)[order_type::B] = c.b; - ((value_type*)p)[order_type::A] = c.a; - } - - //-------------------------------------------------------------------- - color_type pixel(int x, int y) const - { - const value_type* p = (value_type*)m_rbuf->row_ptr(y) + (x << 2); - return color_type(p[order_type::R], - p[order_type::G], - p[order_type::B], - p[order_type::A]); - } - - //-------------------------------------------------------------------- - void copy_pixel(int x, int y, const color_type& c) - { - blender_type::blend_pix( - m_comp_op, - (value_type*)m_rbuf->row_ptr(x, y, 1) + (x << 2), - c.r, c.g, c.b, c.a, 255); - } - - //-------------------------------------------------------------------- - void blend_pixel(int x, int y, const color_type& c, int8u cover) - { - blender_type::blend_pix( - m_comp_op, - (value_type*)m_rbuf->row_ptr(x, y, 1) + (x << 2), - c.r, c.g, c.b, c.a, - cover); - } - - //-------------------------------------------------------------------- - void copy_hline(int x, int y, unsigned len, const color_type& c) - { - value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2);; - do - { - blender_type::blend_pix(m_comp_op, p, c.r, c.g, c.b, c.a, 255); - p += 4; - } - while(--len); - } - - //-------------------------------------------------------------------- - void copy_vline(int x, int y, unsigned len, const color_type& c) - { - do - { - blender_type::blend_pix( - m_comp_op, - (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2), - c.r, c.g, c.b, c.a, 255); - } - while(--len); - } - - //-------------------------------------------------------------------- - void blend_hline(int x, int y, unsigned len, - const color_type& c, int8u cover) - { - - value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2); - do - { - blender_type::blend_pix(m_comp_op, p, c.r, c.g, c.b, c.a, cover); - p += 4; - } - while(--len); - } - - //-------------------------------------------------------------------- - void blend_vline(int x, int y, unsigned len, - const color_type& c, int8u cover) - { - - do - { - blender_type::blend_pix( - m_comp_op, - (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2), - c.r, c.g, c.b, c.a, - cover); - } - while(--len); - } - - //-------------------------------------------------------------------- - void blend_solid_hspan(int x, int y, unsigned len, - const color_type& c, const int8u* covers) - { - value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2); - do - { - blender_type::blend_pix(m_comp_op, - p, c.r, c.g, c.b, c.a, - *covers++); - p += 4; - } - while(--len); - } - - //-------------------------------------------------------------------- - void blend_solid_vspan(int x, int y, unsigned len, - const color_type& c, const int8u* covers) - { - do - { - blender_type::blend_pix( - m_comp_op, - (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2), - c.r, c.g, c.b, c.a, - *covers++); - } - while(--len); - } - - //-------------------------------------------------------------------- - void copy_color_hspan(int x, int y, - unsigned len, - const color_type* colors) - { - - value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2); - do - { - p[order_type::R] = colors->r; - p[order_type::G] = colors->g; - p[order_type::B] = colors->b; - p[order_type::A] = colors->a; - ++colors; - p += 4; - } - while(--len); - } - - //-------------------------------------------------------------------- - void copy_color_vspan(int x, int y, - unsigned len, - const color_type* colors) - { - do - { - value_type* p = (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2); - p[order_type::R] = colors->r; - p[order_type::G] = colors->g; - p[order_type::B] = colors->b; - p[order_type::A] = colors->a; - ++colors; - } - while(--len); - } - - //-------------------------------------------------------------------- - void blend_color_hspan(int x, int y, unsigned len, - const color_type* colors, - const int8u* covers, - int8u cover) - { - value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2); - do - { - blender_type::blend_pix(m_comp_op, - p, - colors->r, - colors->g, - colors->b, - colors->a, - covers ? *covers++ : cover); - p += 4; - ++colors; - } - while(--len); - } - - //-------------------------------------------------------------------- - void blend_color_vspan(int x, int y, unsigned len, - const color_type* colors, - const int8u* covers, - int8u cover) - { - do - { - blender_type::blend_pix( - m_comp_op, - (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2), - colors->r, - colors->g, - colors->b, - colors->a, - covers ? *covers++ : cover); - ++colors; - } - while(--len); - - } - - //-------------------------------------------------------------------- - template void for_each_pixel(Function f) - { - unsigned y; - for(y = 0; y < height(); ++y) - { - row_data r = m_rbuf->row(y); - if(r.ptr) - { - unsigned len = r.x2 - r.x1 + 1; - value_type* p = - (value_type*)m_rbuf->row_ptr(r.x1, y, len) + (r.x1 << 2); - do - { - f(p); - p += 4; - } - while(--len); - } - } - } - - //-------------------------------------------------------------------- - void premultiply() - { - for_each_pixel(multiplier_rgba::premultiply); - } - - //-------------------------------------------------------------------- - void demultiply() - { - for_each_pixel(multiplier_rgba::demultiply); - } - - //-------------------------------------------------------------------- - template void apply_gamma_dir(const GammaLut& g) - { - for_each_pixel(apply_gamma_dir_rgba(g)); - } - - //-------------------------------------------------------------------- - template void apply_gamma_inv(const GammaLut& g) - { - for_each_pixel(apply_gamma_inv_rgba(g)); - } - - //-------------------------------------------------------------------- - template void copy_from(const RenBuf2& from, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len) - { - const int8u* p = from.row_ptr(ysrc); - if(p) - { - memmove(m_rbuf->row_ptr(xdst, ydst, len) + xdst * pix_width, - p + xsrc * pix_width, - len * pix_width); - } - } - - //-------------------------------------------------------------------- - template - void blend_from(const SrcPixelFormatRenderer& from, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len, - int8u cover) - { - typedef typename SrcPixelFormatRenderer::order_type src_order; - const value_type* psrc = (const value_type*)from.row_ptr(ysrc); - if(psrc) - { - psrc += xsrc << 2; - value_type* pdst = - (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + (xdst << 2); - - int incp = 4; - if(xdst > xsrc) - { - psrc += (len-1) << 2; - pdst += (len-1) << 2; - incp = -4; - } - - do - { - blender_type::blend_pix(m_comp_op, - pdst, - psrc[src_order::R], - psrc[src_order::G], - psrc[src_order::B], - psrc[src_order::A], - cover); - psrc += incp; - pdst += incp; - } - while(--len); - } - } - - //-------------------------------------------------------------------- - template - void blend_from_color(const SrcPixelFormatRenderer& from, - const color_type& color, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len, - int8u cover) - { - typedef typename SrcPixelFormatRenderer::value_type src_value_type; - const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc); - if(psrc) - { - value_type* pdst = - (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + (xdst << 2); - do - { - blender_type::blend_pix(m_comp_op, - pdst, - color.r, color.g, color.b, color.a, - (*psrc * cover + base_mask) >> base_shift); - ++psrc; - pdst += 4; - } - while(--len); - } - } - - //-------------------------------------------------------------------- - template - void blend_from_lut(const SrcPixelFormatRenderer& from, - const color_type* color_lut, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len, - int8u cover) - { - typedef typename SrcPixelFormatRenderer::value_type src_value_type; - const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc); - if(psrc) - { - value_type* pdst = - (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + (xdst << 2); - do - { - const color_type& color = color_lut[*psrc]; - blender_type::blend_pix(m_comp_op, - pdst, - color.r, color.g, color.b, color.a, - cover); - ++psrc; - pdst += 4; - } - while(--len); - } - } - - private: - rbuf_type* m_rbuf; - unsigned m_comp_op; - }; - - - - - //----------------------------------------------------------------------- - typedef blender_rgba blender_rgba32; //----blender_rgba32 - typedef blender_rgba blender_argb32; //----blender_argb32 - typedef blender_rgba blender_abgr32; //----blender_abgr32 - typedef blender_rgba blender_bgra32; //----blender_bgra32 - - typedef blender_rgba_pre blender_rgba32_pre; //----blender_rgba32_pre - typedef blender_rgba_pre blender_argb32_pre; //----blender_argb32_pre - typedef blender_rgba_pre blender_abgr32_pre; //----blender_abgr32_pre - typedef blender_rgba_pre blender_bgra32_pre; //----blender_bgra32_pre - - typedef blender_rgba_plain blender_rgba32_plain; //----blender_rgba32_plain - typedef blender_rgba_plain blender_argb32_plain; //----blender_argb32_plain - typedef blender_rgba_plain blender_abgr32_plain; //----blender_abgr32_plain - typedef blender_rgba_plain blender_bgra32_plain; //----blender_bgra32_plain - - typedef blender_rgba blender_rgba64; //----blender_rgba64 - typedef blender_rgba blender_argb64; //----blender_argb64 - typedef blender_rgba blender_abgr64; //----blender_abgr64 - typedef blender_rgba blender_bgra64; //----blender_bgra64 - - typedef blender_rgba_pre blender_rgba64_pre; //----blender_rgba64_pre - typedef blender_rgba_pre blender_argb64_pre; //----blender_argb64_pre - typedef blender_rgba_pre blender_abgr64_pre; //----blender_abgr64_pre - typedef blender_rgba_pre blender_bgra64_pre; //----blender_bgra64_pre - - - //----------------------------------------------------------------------- - typedef int32u pixel32_type; - typedef pixfmt_alpha_blend_rgba pixfmt_rgba32; //----pixfmt_rgba32 - typedef pixfmt_alpha_blend_rgba pixfmt_argb32; //----pixfmt_argb32 - typedef pixfmt_alpha_blend_rgba pixfmt_abgr32; //----pixfmt_abgr32 - typedef pixfmt_alpha_blend_rgba pixfmt_bgra32; //----pixfmt_bgra32 - - typedef pixfmt_alpha_blend_rgba pixfmt_rgba32_pre; //----pixfmt_rgba32_pre - typedef pixfmt_alpha_blend_rgba pixfmt_argb32_pre; //----pixfmt_argb32_pre - typedef pixfmt_alpha_blend_rgba pixfmt_abgr32_pre; //----pixfmt_abgr32_pre - typedef pixfmt_alpha_blend_rgba pixfmt_bgra32_pre; //----pixfmt_bgra32_pre - - typedef pixfmt_alpha_blend_rgba pixfmt_rgba32_plain; //----pixfmt_rgba32_plain - typedef pixfmt_alpha_blend_rgba pixfmt_argb32_plain; //----pixfmt_argb32_plain - typedef pixfmt_alpha_blend_rgba pixfmt_abgr32_plain; //----pixfmt_abgr32_plain - typedef pixfmt_alpha_blend_rgba pixfmt_bgra32_plain; //----pixfmt_bgra32_plain - - struct pixel64_type { int16u c[4]; }; - typedef pixfmt_alpha_blend_rgba pixfmt_rgba64; //----pixfmt_rgba64 - typedef pixfmt_alpha_blend_rgba pixfmt_argb64; //----pixfmt_argb64 - typedef pixfmt_alpha_blend_rgba pixfmt_abgr64; //----pixfmt_abgr64 - typedef pixfmt_alpha_blend_rgba pixfmt_bgra64; //----pixfmt_bgra64 - - typedef pixfmt_alpha_blend_rgba pixfmt_rgba64_pre; //----pixfmt_rgba64_pre - typedef pixfmt_alpha_blend_rgba pixfmt_argb64_pre; //----pixfmt_argb64_pre - typedef pixfmt_alpha_blend_rgba pixfmt_abgr64_pre; //----pixfmt_abgr64_pre - typedef pixfmt_alpha_blend_rgba pixfmt_bgra64_pre; //----pixfmt_bgra64_pre -} - -#endif - diff --git a/uppdev/agg24/agg_pixfmt_transposer.h b/uppdev/agg24/agg_pixfmt_transposer.h deleted file mode 100644 index 64738b6c7..000000000 --- a/uppdev/agg24/agg_pixfmt_transposer.h +++ /dev/null @@ -1,157 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_PIXFMT_TRANSPOSER_INCLUDED -#define AGG_PIXFMT_TRANSPOSER_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - //=======================================================pixfmt_transposer - template class pixfmt_transposer - { - public: - typedef PixFmt pixfmt_type; - typedef typename pixfmt_type::color_type color_type; - typedef typename pixfmt_type::row_data row_data; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - - //-------------------------------------------------------------------- - pixfmt_transposer() : m_pixf(0) {} - explicit pixfmt_transposer(pixfmt_type& pixf) : m_pixf(&pixf) {} - void attach(pixfmt_type& pixf) { m_pixf = &pixf; } - - //-------------------------------------------------------------------- - AGG_INLINE unsigned width() const { return m_pixf->height(); } - AGG_INLINE unsigned height() const { return m_pixf->width(); } - - //-------------------------------------------------------------------- - AGG_INLINE color_type pixel(int x, int y) const - { - return m_pixf->pixel(y, x); - } - - //-------------------------------------------------------------------- - AGG_INLINE void copy_pixel(int x, int y, const color_type& c) - { - m_pixf->copy_pixel(y, x, c); - } - - //-------------------------------------------------------------------- - AGG_INLINE void blend_pixel(int x, int y, - const color_type& c, - int8u cover) - { - m_pixf->blend_pixel(y, x, c, cover); - } - - //-------------------------------------------------------------------- - AGG_INLINE void copy_hline(int x, int y, - unsigned len, - const color_type& c) - { - m_pixf->copy_vline(y, x, len, c); - } - - //-------------------------------------------------------------------- - AGG_INLINE void copy_vline(int x, int y, - unsigned len, - const color_type& c) - { - m_pixf->copy_hline(y, x, len, c); - } - - //-------------------------------------------------------------------- - AGG_INLINE void blend_hline(int x, int y, - unsigned len, - const color_type& c, - int8u cover) - { - m_pixf->blend_vline(y, x, len, c, cover); - } - - //-------------------------------------------------------------------- - AGG_INLINE void blend_vline(int x, int y, - unsigned len, - const color_type& c, - int8u cover) - { - m_pixf->blend_hline(y, x, len, c, cover); - } - - //-------------------------------------------------------------------- - AGG_INLINE void blend_solid_hspan(int x, int y, - unsigned len, - const color_type& c, - const int8u* covers) - { - m_pixf->blend_solid_vspan(y, x, len, c, covers); - } - - //-------------------------------------------------------------------- - AGG_INLINE void blend_solid_vspan(int x, int y, - unsigned len, - const color_type& c, - const int8u* covers) - { - m_pixf->blend_solid_hspan(y, x, len, c, covers); - } - - //-------------------------------------------------------------------- - AGG_INLINE void copy_color_hspan(int x, int y, - unsigned len, - const color_type* colors) - { - m_pixf->copy_color_vspan(y, x, len, colors); - } - - //-------------------------------------------------------------------- - AGG_INLINE void copy_color_vspan(int x, int y, - unsigned len, - const color_type* colors) - { - m_pixf->copy_color_hspan(y, x, len, colors); - } - - //-------------------------------------------------------------------- - AGG_INLINE void blend_color_hspan(int x, int y, - unsigned len, - const color_type* colors, - const int8u* covers, - int8u cover) - { - m_pixf->blend_color_vspan(y, x, len, colors, covers, cover); - } - - //-------------------------------------------------------------------- - AGG_INLINE void blend_color_vspan(int x, int y, - unsigned len, - const color_type* colors, - const int8u* covers, - int8u cover) - { - m_pixf->blend_color_hspan(y, x, len, colors, covers, cover); - } - - private: - pixfmt_type* m_pixf; - }; -} - -#endif - - diff --git a/uppdev/agg24/agg_platform_support.cpp b/uppdev/agg24/agg_platform_support.cpp deleted file mode 100644 index 243544920..000000000 --- a/uppdev/agg24/agg_platform_support.cpp +++ /dev/null @@ -1,7504 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// class platform_support. X11 version. -// -//---------------------------------------------------------------------------- -#ifndef AGG_PLATFORM_SUPPORT -#define AGG_PLATFORM_SUPPORT - -#include - -#ifdef PLATFORM_X11 - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -namespace agg -{ - //------------------------------------------------------------------------ - class platform_specific - { - public: - platform_specific(pix_format_e format, bool flip_y); - ~platform_specific(); - - void caption(const char* capt); - void put_image(const rendering_buffer* src); - - pix_format_e m_format; - pix_format_e m_sys_format; - int m_byte_order; - bool m_flip_y; - unsigned m_bpp; - unsigned m_sys_bpp; - Display* m_display; - int m_screen; - int m_depth; - Visual* m_visual; - Window m_window; - GC m_gc; - XImage* m_ximg_window; - XSetWindowAttributes m_window_attributes; - Atom m_close_atom; - unsigned char* m_buf_window; - unsigned char* m_buf_img[platform_support::max_images]; - unsigned m_keymap[256]; - - bool m_update_flag; - bool m_resize_flag; - bool m_initialized; - //bool m_wait_mode; - clock_t m_sw_start; - }; - - - - //------------------------------------------------------------------------ - platform_specific::platform_specific(pix_format_e format, bool flip_y) : - m_format(format), - m_sys_format(pix_format_undefined), - m_byte_order(LSBFirst), - m_flip_y(flip_y), - m_bpp(0), - m_sys_bpp(0), - m_display(0), - m_screen(0), - m_depth(0), - m_visual(0), - m_window(0), - m_gc(0), - m_ximg_window(0), - m_close_atom(0), - - m_buf_window(0), - - m_update_flag(true), - m_resize_flag(true), - m_initialized(false) - //m_wait_mode(true) - { - memset(m_buf_img, 0, sizeof(m_buf_img)); - - unsigned i; - for(i = 0; i < 256; i++) - { - m_keymap[i] = i; - } - - m_keymap[XK_Pause&0xFF] = key_pause; - m_keymap[XK_Clear&0xFF] = key_clear; - - m_keymap[XK_KP_0&0xFF] = key_kp0; - m_keymap[XK_KP_1&0xFF] = key_kp1; - m_keymap[XK_KP_2&0xFF] = key_kp2; - m_keymap[XK_KP_3&0xFF] = key_kp3; - m_keymap[XK_KP_4&0xFF] = key_kp4; - m_keymap[XK_KP_5&0xFF] = key_kp5; - m_keymap[XK_KP_6&0xFF] = key_kp6; - m_keymap[XK_KP_7&0xFF] = key_kp7; - m_keymap[XK_KP_8&0xFF] = key_kp8; - m_keymap[XK_KP_9&0xFF] = key_kp9; - - m_keymap[XK_KP_Insert&0xFF] = key_kp0; - m_keymap[XK_KP_End&0xFF] = key_kp1; - m_keymap[XK_KP_Down&0xFF] = key_kp2; - m_keymap[XK_KP_Page_Down&0xFF] = key_kp3; - m_keymap[XK_KP_Left&0xFF] = key_kp4; - m_keymap[XK_KP_Begin&0xFF] = key_kp5; - m_keymap[XK_KP_Right&0xFF] = key_kp6; - m_keymap[XK_KP_Home&0xFF] = key_kp7; - m_keymap[XK_KP_Up&0xFF] = key_kp8; - m_keymap[XK_KP_Page_Up&0xFF] = key_kp9; - m_keymap[XK_KP_Delete&0xFF] = key_kp_period; - m_keymap[XK_KP_Decimal&0xFF] = key_kp_period; - m_keymap[XK_KP_Divide&0xFF] = key_kp_divide; - m_keymap[XK_KP_Multiply&0xFF] = key_kp_multiply; - m_keymap[XK_KP_Subtract&0xFF] = key_kp_minus; - m_keymap[XK_KP_Add&0xFF] = key_kp_plus; - m_keymap[XK_KP_Enter&0xFF] = key_kp_enter; - m_keymap[XK_KP_Equal&0xFF] = key_kp_equals; - - m_keymap[XK_Up&0xFF] = key_up; - m_keymap[XK_Down&0xFF] = key_down; - m_keymap[XK_Right&0xFF] = key_right; - m_keymap[XK_Left&0xFF] = key_left; - m_keymap[XK_Insert&0xFF] = key_insert; - m_keymap[XK_Home&0xFF] = key_delete; - m_keymap[XK_End&0xFF] = key_end; - m_keymap[XK_Page_Up&0xFF] = key_page_up; - m_keymap[XK_Page_Down&0xFF] = key_page_down; - - m_keymap[XK_F1&0xFF] = key_f1; - m_keymap[XK_F2&0xFF] = key_f2; - m_keymap[XK_F3&0xFF] = key_f3; - m_keymap[XK_F4&0xFF] = key_f4; - m_keymap[XK_F5&0xFF] = key_f5; - m_keymap[XK_F6&0xFF] = key_f6; - m_keymap[XK_F7&0xFF] = key_f7; - m_keymap[XK_F8&0xFF] = key_f8; - m_keymap[XK_F9&0xFF] = key_f9; - m_keymap[XK_F10&0xFF] = key_f10; - m_keymap[XK_F11&0xFF] = key_f11; - m_keymap[XK_F12&0xFF] = key_f12; - m_keymap[XK_F13&0xFF] = key_f13; - m_keymap[XK_F14&0xFF] = key_f14; - m_keymap[XK_F15&0xFF] = key_f15; - - m_keymap[XK_Num_Lock&0xFF] = key_numlock; - m_keymap[XK_Caps_Lock&0xFF] = key_capslock; - m_keymap[XK_Scroll_Lock&0xFF] = key_scrollock; - - switch(m_format) - { - default: break; - case pix_format_gray8: - m_bpp = 8; - break; - - case pix_format_rgb565: - case pix_format_rgb555: - m_bpp = 16; - break; - - case pix_format_rgb24: - case pix_format_bgr24: - m_bpp = 24; - break; - - case pix_format_bgra32: - case pix_format_abgr32: - case pix_format_argb32: - case pix_format_rgba32: - m_bpp = 32; - break; - } - m_sw_start = clock(); - } - - //------------------------------------------------------------------------ - platform_specific::~platform_specific() - { - } - - //------------------------------------------------------------------------ - void platform_specific::caption(const char* capt) - { - XTextProperty tp; - tp.value = (unsigned char *)capt; - tp.encoding = XA_WM_NAME; - tp.format = 8; - tp.nitems = strlen(capt); - XSetWMName(m_display, m_window, &tp); - XStoreName(m_display, m_window, capt); - XSetIconName(m_display, m_window, capt); - XSetWMIconName(m_display, m_window, &tp); - } - - - //------------------------------------------------------------------------ - void platform_specific::put_image(const rendering_buffer* src) - { - if(m_ximg_window == 0) return; - m_ximg_window->data = (char*)m_buf_window; - - if(m_format == m_sys_format) - { - XPutImage(m_display, - m_window, - m_gc, - m_ximg_window, - 0, 0, 0, 0, - src->width(), - src->height()); - } - else - { - int row_len = src->width() * m_sys_bpp / 8; - unsigned char* buf_tmp = - new unsigned char[row_len * src->height()]; - - rendering_buffer rbuf_tmp; - rbuf_tmp.attach(buf_tmp, - src->width(), - src->height(), - m_flip_y ? -row_len : row_len); - - switch(m_sys_format) - { - default: break; - case pix_format_rgb555: - switch(m_format) - { - default: break; - case pix_format_rgb555: color_conv(&rbuf_tmp, src, color_conv_rgb555_to_rgb555()); break; - case pix_format_rgb565: color_conv(&rbuf_tmp, src, color_conv_rgb565_to_rgb555()); break; - case pix_format_rgb24: color_conv(&rbuf_tmp, src, color_conv_rgb24_to_rgb555()); break; - case pix_format_bgr24: color_conv(&rbuf_tmp, src, color_conv_bgr24_to_rgb555()); break; - case pix_format_rgba32: color_conv(&rbuf_tmp, src, color_conv_rgba32_to_rgb555()); break; - case pix_format_argb32: color_conv(&rbuf_tmp, src, color_conv_argb32_to_rgb555()); break; - case pix_format_bgra32: color_conv(&rbuf_tmp, src, color_conv_bgra32_to_rgb555()); break; - case pix_format_abgr32: color_conv(&rbuf_tmp, src, color_conv_abgr32_to_rgb555()); break; - } - break; - - case pix_format_rgb565: - switch(m_format) - { - default: break; - case pix_format_rgb555: color_conv(&rbuf_tmp, src, color_conv_rgb555_to_rgb565()); break; - case pix_format_rgb565: color_conv(&rbuf_tmp, src, color_conv_rgb565_to_rgb565()); break; - case pix_format_rgb24: color_conv(&rbuf_tmp, src, color_conv_rgb24_to_rgb565()); break; - case pix_format_bgr24: color_conv(&rbuf_tmp, src, color_conv_bgr24_to_rgb565()); break; - case pix_format_rgba32: color_conv(&rbuf_tmp, src, color_conv_rgba32_to_rgb565()); break; - case pix_format_argb32: color_conv(&rbuf_tmp, src, color_conv_argb32_to_rgb565()); break; - case pix_format_bgra32: color_conv(&rbuf_tmp, src, color_conv_bgra32_to_rgb565()); break; - case pix_format_abgr32: color_conv(&rbuf_tmp, src, color_conv_abgr32_to_rgb565()); break; - } - break; - - case pix_format_rgba32: - switch(m_format) - { - default: break; - case pix_format_rgb555: color_conv(&rbuf_tmp, src, color_conv_rgb555_to_rgba32()); break; - case pix_format_rgb565: color_conv(&rbuf_tmp, src, color_conv_rgb565_to_rgba32()); break; - case pix_format_rgb24: color_conv(&rbuf_tmp, src, color_conv_rgb24_to_rgba32()); break; - case pix_format_bgr24: color_conv(&rbuf_tmp, src, color_conv_bgr24_to_rgba32()); break; - case pix_format_rgba32: color_conv(&rbuf_tmp, src, color_conv_rgba32_to_rgba32()); break; - case pix_format_argb32: color_conv(&rbuf_tmp, src, color_conv_argb32_to_rgba32()); break; - case pix_format_bgra32: color_conv(&rbuf_tmp, src, color_conv_bgra32_to_rgba32()); break; - case pix_format_abgr32: color_conv(&rbuf_tmp, src, color_conv_abgr32_to_rgba32()); break; - } - break; - - case pix_format_abgr32: - switch(m_format) - { - default: break; - case pix_format_rgb555: color_conv(&rbuf_tmp, src, color_conv_rgb555_to_abgr32()); break; - case pix_format_rgb565: color_conv(&rbuf_tmp, src, color_conv_rgb565_to_abgr32()); break; - case pix_format_rgb24: color_conv(&rbuf_tmp, src, color_conv_rgb24_to_abgr32()); break; - case pix_format_bgr24: color_conv(&rbuf_tmp, src, color_conv_bgr24_to_abgr32()); break; - case pix_format_abgr32: color_conv(&rbuf_tmp, src, color_conv_abgr32_to_abgr32()); break; - case pix_format_rgba32: color_conv(&rbuf_tmp, src, color_conv_rgba32_to_abgr32()); break; - case pix_format_argb32: color_conv(&rbuf_tmp, src, color_conv_argb32_to_abgr32()); break; - case pix_format_bgra32: color_conv(&rbuf_tmp, src, color_conv_bgra32_to_abgr32()); break; - } - break; - - case pix_format_argb32: - switch(m_format) - { - default: break; - case pix_format_rgb555: color_conv(&rbuf_tmp, src, color_conv_rgb555_to_argb32()); break; - case pix_format_rgb565: color_conv(&rbuf_tmp, src, color_conv_rgb565_to_argb32()); break; - case pix_format_rgb24: color_conv(&rbuf_tmp, src, color_conv_rgb24_to_argb32()); break; - case pix_format_bgr24: color_conv(&rbuf_tmp, src, color_conv_bgr24_to_argb32()); break; - case pix_format_rgba32: color_conv(&rbuf_tmp, src, color_conv_rgba32_to_argb32()); break; - case pix_format_argb32: color_conv(&rbuf_tmp, src, color_conv_argb32_to_argb32()); break; - case pix_format_abgr32: color_conv(&rbuf_tmp, src, color_conv_abgr32_to_argb32()); break; - case pix_format_bgra32: color_conv(&rbuf_tmp, src, color_conv_bgra32_to_argb32()); break; - } - break; - - case pix_format_bgra32: - switch(m_format) - { - default: break; - case pix_format_rgb555: color_conv(&rbuf_tmp, src, color_conv_rgb555_to_bgra32()); break; - case pix_format_rgb565: color_conv(&rbuf_tmp, src, color_conv_rgb565_to_bgra32()); break; - case pix_format_rgb24: color_conv(&rbuf_tmp, src, color_conv_rgb24_to_bgra32()); break; - case pix_format_bgr24: color_conv(&rbuf_tmp, src, color_conv_bgr24_to_bgra32()); break; - case pix_format_rgba32: color_conv(&rbuf_tmp, src, color_conv_rgba32_to_bgra32()); break; - case pix_format_argb32: color_conv(&rbuf_tmp, src, color_conv_argb32_to_bgra32()); break; - case pix_format_abgr32: color_conv(&rbuf_tmp, src, color_conv_abgr32_to_bgra32()); break; - case pix_format_bgra32: color_conv(&rbuf_tmp, src, color_conv_bgra32_to_bgra32()); break; - } - break; - } - - m_ximg_window->data = (char*)buf_tmp; - XPutImage(m_display, - m_window, - m_gc, - m_ximg_window, - 0, 0, 0, 0, - src->width(), - src->height()); - - delete [] buf_tmp; - } - } - - - //------------------------------------------------------------------------ - platform_support::platform_support(pix_format_e format, bool flip_y) : - m_specific(new platform_specific(format, flip_y)), - m_format(format), - m_bpp(m_specific->m_bpp), - m_window_flags(0), - m_wait_mode(true), - m_flip_y(flip_y), - m_initial_width(10), - m_initial_height(10) - { - strcpy(m_caption, "AGG Application"); - } - - //------------------------------------------------------------------------ - platform_support::~platform_support() - { - delete m_specific; - } - - - - //------------------------------------------------------------------------ - void platform_support::caption(const char* cap) - { - strcpy(m_caption, cap); - if(m_specific->m_initialized) - { - m_specific->caption(cap); - } - } - - - //------------------------------------------------------------------------ - enum xevent_mask_e - { - xevent_mask = - PointerMotionMask| - ButtonPressMask| - ButtonReleaseMask| - ExposureMask| - KeyPressMask| - StructureNotifyMask - }; - - - //------------------------------------------------------------------------ - bool platform_support::init(unsigned width, unsigned height, unsigned flags) - { - m_window_flags = flags; - - m_specific->m_display = XOpenDisplay(NULL); - if(m_specific->m_display == 0) - { - fprintf(stderr, "Unable to open DISPLAY!\n"); - return false; - } - - m_specific->m_screen = XDefaultScreen(m_specific->m_display); - m_specific->m_depth = XDefaultDepth(m_specific->m_display, - m_specific->m_screen); - m_specific->m_visual = XDefaultVisual(m_specific->m_display, - m_specific->m_screen); - unsigned long r_mask = m_specific->m_visual->red_mask; - unsigned long g_mask = m_specific->m_visual->green_mask; - unsigned long b_mask = m_specific->m_visual->blue_mask; - -//printf("depth=%d, red=%08x, green=%08x, blue=%08x\n", -// m_specific->m_depth, -// m_specific->m_visual->red_mask, -// m_specific->m_visual->green_mask, -// m_specific->m_visual->blue_mask); - - -// // NOT COMPLETED YET! -// // Try to find an appropriate Visual if the default doesn't fit. -// if(m_specific->m_depth < 15 || -// r_mask == 0 || g_mask == 0 || b_mask == 0) -// { -// -// // This is an attempt to find an appropriate Visual if -// // the default one doesn't match the minumum requirements -// static int depth[] = { 32, 24, 16, 15 }; -// int i; -// for(int i = 0; i < 4; i++) -// { -// XVisualInfo vi; -// if(XMatchVisualInfo(m_specific->m_display, -// m_specific->m_screen, -// depth[i], -// TrueColor, -// &vi)) -// { -// // printf("TrueColor depth=%d, red=%08x, green=%08x, blue=%08x, bits=%d\n", -// // vi.depth, -// // vi.visual->red_mask, -// // vi.visual->green_mask, -// // vi.visual->blue_mask, -// // vi.bits_per_rgb); -// m_specific->m_depth = vi.depth; -// m_specific->m_visual = vi.visual; -// r_mask = m_specific->m_visual->red_mask; -// g_mask = m_specific->m_visual->green_mask; -// b_mask = m_specific->m_visual->blue_mask; -// break; -// } -// if(XMatchVisualInfo(m_specific->m_display, -// m_specific->m_screen, -// depth[i], -// DirectColor, -// &vi)) -// { -// // printf("DirectColor depth=%d, red=%08x, green=%08x, blue=%08x, bits=%d\n", -// // vi.depth, -// // vi.visual->red_mask, -// // vi.visual->green_mask, -// // vi.visual->blue_mask, -// // vi.bits_per_rgb); -// m_specific->m_depth = vi.depth; -// m_specific->m_visual = vi.visual; -// r_mask = m_specific->m_visual->red_mask; -// g_mask = m_specific->m_visual->green_mask; -// b_mask = m_specific->m_visual->blue_mask; -// break; -// } -// } -// } - - if(m_specific->m_depth < 15 || - r_mask == 0 || g_mask == 0 || b_mask == 0) - { - fprintf(stderr, - "There's no Visual compatible with minimal AGG requirements:\n" - "At least 15-bit color depth and True- or DirectColor class.\n\n"); - XCloseDisplay(m_specific->m_display); - return false; - } - - int t = 1; - int hw_byte_order = LSBFirst; - if(*(char*)&t == 0) hw_byte_order = MSBFirst; - - // Perceive SYS-format by mask - switch(m_specific->m_depth) - { - case 15: - m_specific->m_sys_bpp = 16; - if(r_mask == 0x7C00 && g_mask == 0x3E0 && b_mask == 0x1F) - { - m_specific->m_sys_format = pix_format_rgb555; - m_specific->m_byte_order = hw_byte_order; - } - break; - - case 16: - m_specific->m_sys_bpp = 16; - if(r_mask == 0xF800 && g_mask == 0x7E0 && b_mask == 0x1F) - { - m_specific->m_sys_format = pix_format_rgb565; - m_specific->m_byte_order = hw_byte_order; - } - break; - - case 24: - case 32: - m_specific->m_sys_bpp = 32; - if(g_mask == 0xFF00) - { - if(r_mask == 0xFF && b_mask == 0xFF0000) - { - switch(m_specific->m_format) - { - case pix_format_rgba32: - m_specific->m_sys_format = pix_format_rgba32; - m_specific->m_byte_order = LSBFirst; - break; - - case pix_format_abgr32: - m_specific->m_sys_format = pix_format_abgr32; - m_specific->m_byte_order = MSBFirst; - break; - - default: - m_specific->m_byte_order = hw_byte_order; - m_specific->m_sys_format = - (hw_byte_order == LSBFirst) ? - pix_format_rgba32 : - pix_format_abgr32; - break; - } - } - - if(r_mask == 0xFF0000 && b_mask == 0xFF) - { - switch(m_specific->m_format) - { - case pix_format_argb32: - m_specific->m_sys_format = pix_format_argb32; - m_specific->m_byte_order = MSBFirst; - break; - - case pix_format_bgra32: - m_specific->m_sys_format = pix_format_bgra32; - m_specific->m_byte_order = LSBFirst; - break; - - default: - m_specific->m_byte_order = hw_byte_order; - m_specific->m_sys_format = - (hw_byte_order == MSBFirst) ? - pix_format_argb32 : - pix_format_bgra32; - break; - } - } - } - break; - } - - if(m_specific->m_sys_format == pix_format_undefined) - { - fprintf(stderr, - "RGB masks are not compatible with AGG pixel formats:\n" - "R=%08x, R=%08x, B=%08x\n", r_mask, g_mask, b_mask); - XCloseDisplay(m_specific->m_display); - return false; - } - - - - memset(&m_specific->m_window_attributes, - 0, - sizeof(m_specific->m_window_attributes)); - - m_specific->m_window_attributes.border_pixel = - XBlackPixel(m_specific->m_display, m_specific->m_screen); - - m_specific->m_window_attributes.background_pixel = - XWhitePixel(m_specific->m_display, m_specific->m_screen); - - m_specific->m_window_attributes.override_redirect = 0; - - unsigned long window_mask = CWBackPixel | CWBorderPixel; - - m_specific->m_window = - XCreateWindow(m_specific->m_display, - XDefaultRootWindow(m_specific->m_display), - 0, 0, - width, - height, - 0, - m_specific->m_depth, - InputOutput, - CopyFromParent, - window_mask, - &m_specific->m_window_attributes); - - - m_specific->m_gc = XCreateGC(m_specific->m_display, - m_specific->m_window, - 0, 0); - m_specific->m_buf_window = - new unsigned char[width * height * (m_bpp / 8)]; - - memset(m_specific->m_buf_window, 255, width * height * (m_bpp / 8)); - - m_rbuf_window.attach(m_specific->m_buf_window, - width, - height, - m_flip_y ? -width * (m_bpp / 8) : width * (m_bpp / 8)); - - m_specific->m_ximg_window = - XCreateImage(m_specific->m_display, - m_specific->m_visual, //CopyFromParent, - m_specific->m_depth, - ZPixmap, - 0, - (char*)m_specific->m_buf_window, - width, - height, - m_specific->m_sys_bpp, - width * (m_specific->m_sys_bpp / 8)); - m_specific->m_ximg_window->byte_order = m_specific->m_byte_order; - - m_specific->caption(m_caption); - m_initial_width = width; - m_initial_height = height; - - if(!m_specific->m_initialized) - { - on_init(); - m_specific->m_initialized = true; - } - - trans_affine_resizing(width, height); - on_resize(width, height); - m_specific->m_update_flag = true; - - XSizeHints *hints = XAllocSizeHints(); - if(hints) - { - if(flags & window_resize) - { - hints->min_width = 32; - hints->min_height = 32; - hints->max_width = 4096; - hints->max_height = 4096; - } - else - { - hints->min_width = width; - hints->min_height = height; - hints->max_width = width; - hints->max_height = height; - } - hints->flags = PMaxSize | PMinSize; - - XSetWMNormalHints(m_specific->m_display, - m_specific->m_window, - hints); - - XFree(hints); - } - - - XMapWindow(m_specific->m_display, - m_specific->m_window); - - XSelectInput(m_specific->m_display, - m_specific->m_window, - xevent_mask); - - - m_specific->m_close_atom = XInternAtom(m_specific->m_display, - "WM_DELETE_WINDOW", - false); - - XSetWMProtocols(m_specific->m_display, - m_specific->m_window, - &m_specific->m_close_atom, - 1); - - return true; - } - - - - //------------------------------------------------------------------------ - void platform_support::update_window() - { - m_specific->put_image(&m_rbuf_window); - - // When m_wait_mode is true we can discard all the events - // came while the image is being drawn. In this case - // the X server does not accumulate mouse motion events. - // When m_wait_mode is false, i.e. we have some idle drawing - // we cannot afford to miss any events - XSync(m_specific->m_display, m_wait_mode); - } - - - //------------------------------------------------------------------------ - int platform_support::run() - { - XFlush(m_specific->m_display); - - bool quit = false; - unsigned flags; - int cur_x; - int cur_y; - - while(!quit) - { - if(m_specific->m_update_flag) - { - on_draw(); - update_window(); - m_specific->m_update_flag = false; - } - - if(!m_wait_mode) - { - if(XPending(m_specific->m_display) == 0) - { - on_idle(); - continue; - } - } - - XEvent x_event; - XNextEvent(m_specific->m_display, &x_event); - - // In the Idle mode discard all intermediate MotionNotify events - if(!m_wait_mode && x_event.type == MotionNotify) - { - XEvent te = x_event; - for(;;) - { - if(XPending(m_specific->m_display) == 0) break; - XNextEvent(m_specific->m_display, &te); - if(te.type != MotionNotify) break; - } - x_event = te; - } - - switch(x_event.type) - { - case ConfigureNotify: - { - if(x_event.xconfigure.width != int(m_rbuf_window.width()) || - x_event.xconfigure.height != int(m_rbuf_window.height())) - { - int width = x_event.xconfigure.width; - int height = x_event.xconfigure.height; - - delete [] m_specific->m_buf_window; - m_specific->m_ximg_window->data = 0; - XDestroyImage(m_specific->m_ximg_window); - - m_specific->m_buf_window = - new unsigned char[width * height * (m_bpp / 8)]; - - m_rbuf_window.attach(m_specific->m_buf_window, - width, - height, - m_flip_y ? - -width * (m_bpp / 8) : - width * (m_bpp / 8)); - - m_specific->m_ximg_window = - XCreateImage(m_specific->m_display, - m_specific->m_visual, //CopyFromParent, - m_specific->m_depth, - ZPixmap, - 0, - (char*)m_specific->m_buf_window, - width, - height, - m_specific->m_sys_bpp, - width * (m_specific->m_sys_bpp / 8)); - m_specific->m_ximg_window->byte_order = m_specific->m_byte_order; - - trans_affine_resizing(width, height); - on_resize(width, height); - on_draw(); - update_window(); - } - } - break; - - case Expose: - m_specific->put_image(&m_rbuf_window); - XFlush(m_specific->m_display); - XSync(m_specific->m_display, false); - break; - - case KeyPress: - { - KeySym key = XLookupKeysym(&x_event.xkey, 0); - flags = 0; - if(x_event.xkey.state & Button1Mask) flags |= mouse_left; - if(x_event.xkey.state & Button3Mask) flags |= mouse_right; - if(x_event.xkey.state & ShiftMask) flags |= kbd_shift; - if(x_event.xkey.state & ControlMask) flags |= kbd_ctrl; - - bool left = false; - bool up = false; - bool right = false; - bool down = false; - - switch(m_specific->m_keymap[key & 0xFF]) - { - case key_left: - left = true; - break; - - case key_up: - up = true; - break; - - case key_right: - right = true; - break; - - case key_down: - down = true; - break; - - case key_f2: - copy_window_to_img(max_images - 1); - save_img(max_images - 1, "screenshot"); - break; - } - - if(m_ctrls.on_arrow_keys(left, right, down, up)) - { - on_ctrl_change(); - force_redraw(); - } - else - { - on_key(x_event.xkey.x, - m_flip_y ? - m_rbuf_window.height() - x_event.xkey.y : - x_event.xkey.y, - m_specific->m_keymap[key & 0xFF], - flags); - } - } - break; - - - case ButtonPress: - { - flags = 0; - if(x_event.xbutton.state & ShiftMask) flags |= kbd_shift; - if(x_event.xbutton.state & ControlMask) flags |= kbd_ctrl; - if(x_event.xbutton.button == Button1) flags |= mouse_left; - if(x_event.xbutton.button == Button3) flags |= mouse_right; - - cur_x = x_event.xbutton.x; - cur_y = m_flip_y ? m_rbuf_window.height() - x_event.xbutton.y : - x_event.xbutton.y; - - if(flags & mouse_left) - { - if(m_ctrls.on_mouse_button_down(cur_x, cur_y)) - { - m_ctrls.set_cur(cur_x, cur_y); - on_ctrl_change(); - force_redraw(); - } - else - { - if(m_ctrls.in_rect(cur_x, cur_y)) - { - if(m_ctrls.set_cur(cur_x, cur_y)) - { - on_ctrl_change(); - force_redraw(); - } - } - else - { - on_mouse_button_down(cur_x, cur_y, flags); - } - } - } - if(flags & mouse_right) - { - on_mouse_button_down(cur_x, cur_y, flags); - } - //m_specific->m_wait_mode = m_wait_mode; - //m_wait_mode = true; - } - break; - - - case MotionNotify: - { - flags = 0; - if(x_event.xmotion.state & Button1Mask) flags |= mouse_left; - if(x_event.xmotion.state & Button3Mask) flags |= mouse_right; - if(x_event.xmotion.state & ShiftMask) flags |= kbd_shift; - if(x_event.xmotion.state & ControlMask) flags |= kbd_ctrl; - - cur_x = x_event.xbutton.x; - cur_y = m_flip_y ? m_rbuf_window.height() - x_event.xbutton.y : - x_event.xbutton.y; - - if(m_ctrls.on_mouse_move(cur_x, cur_y, (flags & mouse_left) != 0)) - { - on_ctrl_change(); - force_redraw(); - } - else - { - if(!m_ctrls.in_rect(cur_x, cur_y)) - { - on_mouse_move(cur_x, cur_y, flags); - } - } - } - break; - - case ButtonRelease: - { - flags = 0; - if(x_event.xbutton.state & ShiftMask) flags |= kbd_shift; - if(x_event.xbutton.state & ControlMask) flags |= kbd_ctrl; - if(x_event.xbutton.button == Button1) flags |= mouse_left; - if(x_event.xbutton.button == Button3) flags |= mouse_right; - - cur_x = x_event.xbutton.x; - cur_y = m_flip_y ? m_rbuf_window.height() - x_event.xbutton.y : - x_event.xbutton.y; - - if(flags & mouse_left) - { - if(m_ctrls.on_mouse_button_up(cur_x, cur_y)) - { - on_ctrl_change(); - force_redraw(); - } - } - if(flags & (mouse_left | mouse_right)) - { - on_mouse_button_up(cur_x, cur_y, flags); - } - } - //m_wait_mode = m_specific->m_wait_mode; - break; - - case ClientMessage: - if((x_event.xclient.format == 32) && - (x_event.xclient.data.l[0] == int(m_specific->m_close_atom))) - { - quit = true; - } - break; - } - } - - - unsigned i = platform_support::max_images; - while(i--) - { - if(m_specific->m_buf_img[i]) - { - delete [] m_specific->m_buf_img[i]; - } - } - - delete [] m_specific->m_buf_window; - m_specific->m_ximg_window->data = 0; - XDestroyImage(m_specific->m_ximg_window); - XFreeGC(m_specific->m_display, m_specific->m_gc); - XDestroyWindow(m_specific->m_display, m_specific->m_window); - XCloseDisplay(m_specific->m_display); - - return 0; - } - - - - //------------------------------------------------------------------------ - const char* platform_support::img_ext() const { return ".ppm"; } - - //------------------------------------------------------------------------ - const char* platform_support::full_file_name(const char* file_name) - { - return file_name; - } - - //------------------------------------------------------------------------ - bool platform_support::load_img(unsigned idx, const char* file) - { - if(idx < max_images) - { - char buf[1024]; - strcpy(buf, file); - int len = strlen(buf); - if(len < 4 || strcasecmp(buf + len - 4, ".ppm") != 0) - { - strcat(buf, ".ppm"); - } - - FILE* fd = fopen(buf, "rb"); - if(fd == 0) return false; - - if((len = fread(buf, 1, 1022, fd)) == 0) - { - fclose(fd); - return false; - } - buf[len] = 0; - - if(buf[0] != 'P' && buf[1] != '6') - { - fclose(fd); - return false; - } - - char* ptr = buf + 2; - - while(*ptr && !isdigit(*ptr)) ptr++; - if(*ptr == 0) - { - fclose(fd); - return false; - } - - unsigned width = atoi(ptr); - if(width == 0 || width > 4096) - { - fclose(fd); - return false; - } - while(*ptr && isdigit(*ptr)) ptr++; - while(*ptr && !isdigit(*ptr)) ptr++; - if(*ptr == 0) - { - fclose(fd); - return false; - } - unsigned height = atoi(ptr); - if(height == 0 || height > 4096) - { - fclose(fd); - return false; - } - while(*ptr && isdigit(*ptr)) ptr++; - while(*ptr && !isdigit(*ptr)) ptr++; - if(atoi(ptr) != 255) - { - fclose(fd); - return false; - } - while(*ptr && isdigit(*ptr)) ptr++; - if(*ptr == 0) - { - fclose(fd); - return false; - } - ptr++; - fseek(fd, long(ptr - buf), SEEK_SET); - - create_img(idx, width, height); - bool ret = true; - - if(m_format == pix_format_rgb24) - { - fread(m_specific->m_buf_img[idx], 1, width * height * 3, fd); - } - else - { - unsigned char* buf_img = new unsigned char [width * height * 3]; - rendering_buffer rbuf_img; - rbuf_img.attach(buf_img, - width, - height, - m_flip_y ? - -width * 3 : - width * 3); - - fread(buf_img, 1, width * height * 3, fd); - - switch(m_format) - { - case pix_format_rgb555: - color_conv(m_rbuf_img+idx, &rbuf_img, color_conv_rgb24_to_rgb555()); - break; - - case pix_format_rgb565: - color_conv(m_rbuf_img+idx, &rbuf_img, color_conv_rgb24_to_rgb565()); - break; - - case pix_format_bgr24: - color_conv(m_rbuf_img+idx, &rbuf_img, color_conv_rgb24_to_bgr24()); - break; - - case pix_format_rgba32: - color_conv(m_rbuf_img+idx, &rbuf_img, color_conv_rgb24_to_rgba32()); - break; - - case pix_format_argb32: - color_conv(m_rbuf_img+idx, &rbuf_img, color_conv_rgb24_to_argb32()); - break; - - case pix_format_bgra32: - color_conv(m_rbuf_img+idx, &rbuf_img, color_conv_rgb24_to_bgra32()); - break; - - case pix_format_abgr32: - color_conv(m_rbuf_img+idx, &rbuf_img, color_conv_rgb24_to_abgr32()); - break; - - default: - ret = false; - } - delete [] buf_img; - } - - fclose(fd); - return ret; - } - return false; - } - - - - - //------------------------------------------------------------------------ - bool platform_support::save_img(unsigned idx, const char* file) - { - if(idx < max_images && rbuf_img(idx).buf()) - { - char buf[1024]; - strcpy(buf, file); - int len = strlen(buf); - if(len < 4 || strcasecmp(buf + len - 4, ".ppm") != 0) - { - strcat(buf, ".ppm"); - } - - FILE* fd = fopen(buf, "wb"); - if(fd == 0) return false; - - unsigned w = rbuf_img(idx).width(); - unsigned h = rbuf_img(idx).height(); - - fprintf(fd, "P6\n%d %d\n255\n", w, h); - - unsigned y; - unsigned char* tmp_buf = new unsigned char [w * 3]; - for(y = 0; y < rbuf_img(idx).height(); y++) - { - const unsigned char* src = rbuf_img(idx).row_ptr(m_flip_y ? h - 1 - y : y); - switch(m_format) - { - default: break; - case pix_format_rgb555: - color_conv_row(tmp_buf, src, w, color_conv_rgb555_to_rgb24()); - break; - - case pix_format_rgb565: - color_conv_row(tmp_buf, src, w, color_conv_rgb565_to_rgb24()); - break; - - case pix_format_bgr24: - color_conv_row(tmp_buf, src, w, color_conv_bgr24_to_rgb24()); - break; - - case pix_format_rgb24: - color_conv_row(tmp_buf, src, w, color_conv_rgb24_to_rgb24()); - break; - - case pix_format_rgba32: - color_conv_row(tmp_buf, src, w, color_conv_rgba32_to_rgb24()); - break; - - case pix_format_argb32: - color_conv_row(tmp_buf, src, w, color_conv_argb32_to_rgb24()); - break; - - case pix_format_bgra32: - color_conv_row(tmp_buf, src, w, color_conv_bgra32_to_rgb24()); - break; - - case pix_format_abgr32: - color_conv_row(tmp_buf, src, w, color_conv_abgr32_to_rgb24()); - break; - } - fwrite(tmp_buf, 1, w * 3, fd); - } - delete [] tmp_buf; - fclose(fd); - return true; - } - return false; - } - - - - //------------------------------------------------------------------------ - bool platform_support::create_img(unsigned idx, unsigned width, unsigned height) - { - if(idx < max_images) - { - if(width == 0) width = rbuf_window().width(); - if(height == 0) height = rbuf_window().height(); - delete [] m_specific->m_buf_img[idx]; - m_specific->m_buf_img[idx] = - new unsigned char[width * height * (m_bpp / 8)]; - - m_rbuf_img[idx].attach(m_specific->m_buf_img[idx], - width, - height, - m_flip_y ? - -width * (m_bpp / 8) : - width * (m_bpp / 8)); - return true; - } - return false; - } - - - //------------------------------------------------------------------------ - void platform_support::force_redraw() - { - m_specific->m_update_flag = true; - } - - - //------------------------------------------------------------------------ - void platform_support::message(const char* msg) - { - fprintf(stderr, "%s\n", msg); - } - - //------------------------------------------------------------------------ - void platform_support::start_timer() - { - m_specific->m_sw_start = clock(); - } - - //------------------------------------------------------------------------ - double platform_support::elapsed_time() const - { - clock_t stop = clock(); - return double(stop - m_specific->m_sw_start) * 1000.0 / CLOCKS_PER_SEC; - } - - - //------------------------------------------------------------------------ - void platform_support::on_init() {} - void platform_support::on_resize(int sx, int sy) {} - void platform_support::on_idle() {} - void platform_support::on_mouse_move(int x, int y, unsigned flags) {} - void platform_support::on_mouse_button_down(int x, int y, unsigned flags) {} - void platform_support::on_mouse_button_up(int x, int y, unsigned flags) {} - void platform_support::on_key(int x, int y, unsigned key, unsigned flags) {} - void platform_support::on_ctrl_change() {} - void platform_support::on_draw() {} - void platform_support::on_post_draw(void* raw_handler) {} - - - -} - -#endif - -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// class platform_support -// -//---------------------------------------------------------------------------- - -#ifdef PLATFORM_WIN32 -#include -#include -#include "agg_platform_support.h" -#include "agg_win32_bmp.h" -#include "agg_color_conv_rgb8.h" -#include "agg_color_conv_rgb16.h" - - -namespace agg -{ - - //------------------------------------------------------------------------ - HINSTANCE g_windows_instance = 0; - int g_windows_cmd_show = 0; - - - //------------------------------------------------------------------------ - class platform_specific - { - public: - platform_specific(pix_format_e format, bool flip_y); - - void create_pmap(unsigned width, unsigned height, - rendering_buffer* wnd); - - void display_pmap(HDC dc, const rendering_buffer* src); - bool load_pmap(const char* fn, unsigned idx, - rendering_buffer* dst); - - bool save_pmap(const char* fn, unsigned idx, - const rendering_buffer* src); - - unsigned translate(unsigned keycode); - - pix_format_e m_format; - pix_format_e m_sys_format; - bool m_flip_y; - unsigned m_bpp; - unsigned m_sys_bpp; - HWND m_hwnd; - pixel_map m_pmap_window; - pixel_map m_pmap_img[platform_support::max_images]; - unsigned m_keymap[256]; - unsigned m_last_translated_key; - int m_cur_x; - int m_cur_y; - unsigned m_input_flags; - bool m_redraw_flag; - HDC m_current_dc; - LARGE_INTEGER m_sw_freq; - LARGE_INTEGER m_sw_start; - }; - - - //------------------------------------------------------------------------ - platform_specific::platform_specific(pix_format_e format, bool flip_y) : - m_format(format), - m_sys_format(pix_format_undefined), - m_flip_y(flip_y), - m_bpp(0), - m_sys_bpp(0), - m_hwnd(0), - m_last_translated_key(0), - m_cur_x(0), - m_cur_y(0), - m_input_flags(0), - m_redraw_flag(true), - m_current_dc(0) - { - memset(m_keymap, 0, sizeof(m_keymap)); - - m_keymap[VK_PAUSE] = key_pause; - m_keymap[VK_CLEAR] = key_clear; - - m_keymap[VK_NUMPAD0] = key_kp0; - m_keymap[VK_NUMPAD1] = key_kp1; - m_keymap[VK_NUMPAD2] = key_kp2; - m_keymap[VK_NUMPAD3] = key_kp3; - m_keymap[VK_NUMPAD4] = key_kp4; - m_keymap[VK_NUMPAD5] = key_kp5; - m_keymap[VK_NUMPAD6] = key_kp6; - m_keymap[VK_NUMPAD7] = key_kp7; - m_keymap[VK_NUMPAD8] = key_kp8; - m_keymap[VK_NUMPAD9] = key_kp9; - m_keymap[VK_DECIMAL] = key_kp_period; - m_keymap[VK_DIVIDE] = key_kp_divide; - m_keymap[VK_MULTIPLY] = key_kp_multiply; - m_keymap[VK_SUBTRACT] = key_kp_minus; - m_keymap[VK_ADD] = key_kp_plus; - - m_keymap[VK_UP] = key_up; - m_keymap[VK_DOWN] = key_down; - m_keymap[VK_RIGHT] = key_right; - m_keymap[VK_LEFT] = key_left; - m_keymap[VK_INSERT] = key_insert; - m_keymap[VK_DELETE] = key_delete; - m_keymap[VK_HOME] = key_home; - m_keymap[VK_END] = key_end; - m_keymap[VK_PRIOR] = key_page_up; - m_keymap[VK_NEXT] = key_page_down; - - m_keymap[VK_F1] = key_f1; - m_keymap[VK_F2] = key_f2; - m_keymap[VK_F3] = key_f3; - m_keymap[VK_F4] = key_f4; - m_keymap[VK_F5] = key_f5; - m_keymap[VK_F6] = key_f6; - m_keymap[VK_F7] = key_f7; - m_keymap[VK_F8] = key_f8; - m_keymap[VK_F9] = key_f9; - m_keymap[VK_F10] = key_f10; - m_keymap[VK_F11] = key_f11; - m_keymap[VK_F12] = key_f12; - m_keymap[VK_F13] = key_f13; - m_keymap[VK_F14] = key_f14; - m_keymap[VK_F15] = key_f15; - - m_keymap[VK_NUMLOCK] = key_numlock; - m_keymap[VK_CAPITAL] = key_capslock; - m_keymap[VK_SCROLL] = key_scrollock; - - - switch(m_format) - { - case pix_format_bw: - m_sys_format = pix_format_bw; - m_bpp = 1; - m_sys_bpp = 1; - break; - - case pix_format_gray8: - m_sys_format = pix_format_gray8; - m_bpp = 8; - m_sys_bpp = 8; - break; - - case pix_format_gray16: - m_sys_format = pix_format_gray8; - m_bpp = 16; - m_sys_bpp = 8; - break; - - case pix_format_rgb565: - case pix_format_rgb555: - m_sys_format = pix_format_rgb555; - m_bpp = 16; - m_sys_bpp = 16; - break; - - case pix_format_rgbAAA: - case pix_format_bgrAAA: - case pix_format_rgbBBA: - case pix_format_bgrABB: - m_sys_format = pix_format_bgr24; - m_bpp = 32; - m_sys_bpp = 24; - break; - - case pix_format_rgb24: - case pix_format_bgr24: - m_sys_format = pix_format_bgr24; - m_bpp = 24; - m_sys_bpp = 24; - break; - - case pix_format_rgb48: - case pix_format_bgr48: - m_sys_format = pix_format_bgr24; - m_bpp = 48; - m_sys_bpp = 24; - break; - - case pix_format_bgra32: - case pix_format_abgr32: - case pix_format_argb32: - case pix_format_rgba32: - m_sys_format = pix_format_bgra32; - m_bpp = 32; - m_sys_bpp = 32; - break; - - case pix_format_bgra64: - case pix_format_abgr64: - case pix_format_argb64: - case pix_format_rgba64: - m_sys_format = pix_format_bgra32; - m_bpp = 64; - m_sys_bpp = 32; - break; - } - ::QueryPerformanceFrequency(&m_sw_freq); - ::QueryPerformanceCounter(&m_sw_start); - } - - - //------------------------------------------------------------------------ - void platform_specific::create_pmap(unsigned width, - unsigned height, - rendering_buffer* wnd) - { - m_pmap_window.create(width, height, org_e(m_bpp)); - wnd->attach(m_pmap_window.buf(), - m_pmap_window.width(), - m_pmap_window.height(), - m_flip_y ? - m_pmap_window.stride() : - -m_pmap_window.stride()); - } - - - //------------------------------------------------------------------------ - static void convert_pmap(rendering_buffer* dst, - const rendering_buffer* src, - pix_format_e format) - { - switch(format) - { - case pix_format_gray8: - break; - - case pix_format_gray16: - color_conv(dst, src, color_conv_gray16_to_gray8()); - break; - - case pix_format_rgb565: - color_conv(dst, src, color_conv_rgb565_to_rgb555()); - break; - - case pix_format_rgbAAA: - color_conv(dst, src, color_conv_rgbAAA_to_bgr24()); - break; - - case pix_format_bgrAAA: - color_conv(dst, src, color_conv_bgrAAA_to_bgr24()); - break; - - case pix_format_rgbBBA: - color_conv(dst, src, color_conv_rgbBBA_to_bgr24()); - break; - - case pix_format_bgrABB: - color_conv(dst, src, color_conv_bgrABB_to_bgr24()); - break; - - case pix_format_rgb24: - color_conv(dst, src, color_conv_rgb24_to_bgr24()); - break; - - case pix_format_rgb48: - color_conv(dst, src, color_conv_rgb48_to_bgr24()); - break; - - case pix_format_bgr48: - color_conv(dst, src, color_conv_bgr48_to_bgr24()); - break; - - case pix_format_abgr32: - color_conv(dst, src, color_conv_abgr32_to_bgra32()); - break; - - case pix_format_argb32: - color_conv(dst, src, color_conv_argb32_to_bgra32()); - break; - - case pix_format_rgba32: - color_conv(dst, src, color_conv_rgba32_to_bgra32()); - break; - - case pix_format_bgra64: - color_conv(dst, src, color_conv_bgra64_to_bgra32()); - break; - - case pix_format_abgr64: - color_conv(dst, src, color_conv_abgr64_to_bgra32()); - break; - - case pix_format_argb64: - color_conv(dst, src, color_conv_argb64_to_bgra32()); - break; - - case pix_format_rgba64: - color_conv(dst, src, color_conv_rgba64_to_bgra32()); - break; - } - } - - - //------------------------------------------------------------------------ - void platform_specific::display_pmap(HDC dc, const rendering_buffer* src) - { - if(m_sys_format == m_format) - { - m_pmap_window.draw(dc); - } - else - { - pixel_map pmap_tmp; - pmap_tmp.create(m_pmap_window.width(), - m_pmap_window.height(), - org_e(m_sys_bpp)); - - rendering_buffer rbuf_tmp; - rbuf_tmp.attach(pmap_tmp.buf(), - pmap_tmp.width(), - pmap_tmp.height(), - m_flip_y ? - pmap_tmp.stride() : - -pmap_tmp.stride()); - - convert_pmap(&rbuf_tmp, src, m_format); - pmap_tmp.draw(dc); - } - } - - - - //------------------------------------------------------------------------ - bool platform_specific::save_pmap(const char* fn, unsigned idx, - const rendering_buffer* src) - { - if(m_sys_format == m_format) - { - return m_pmap_img[idx].save_as_bmp(fn); - } - - pixel_map pmap_tmp; - pmap_tmp.create(m_pmap_img[idx].width(), - m_pmap_img[idx].height(), - org_e(m_sys_bpp)); - - rendering_buffer rbuf_tmp; - rbuf_tmp.attach(pmap_tmp.buf(), - pmap_tmp.width(), - pmap_tmp.height(), - m_flip_y ? - pmap_tmp.stride() : - -pmap_tmp.stride()); - - convert_pmap(&rbuf_tmp, src, m_format); - return pmap_tmp.save_as_bmp(fn); - } - - - - //------------------------------------------------------------------------ - bool platform_specific::load_pmap(const char* fn, unsigned idx, - rendering_buffer* dst) - { - pixel_map pmap_tmp; - if(!pmap_tmp.load_from_bmp(fn)) return false; - - rendering_buffer rbuf_tmp; - rbuf_tmp.attach(pmap_tmp.buf(), - pmap_tmp.width(), - pmap_tmp.height(), - m_flip_y ? - pmap_tmp.stride() : - -pmap_tmp.stride()); - - m_pmap_img[idx].create(pmap_tmp.width(), - pmap_tmp.height(), - org_e(m_bpp), - 0); - - dst->attach(m_pmap_img[idx].buf(), - m_pmap_img[idx].width(), - m_pmap_img[idx].height(), - m_flip_y ? - m_pmap_img[idx].stride() : - -m_pmap_img[idx].stride()); - - switch(m_format) - { - case pix_format_gray8: - switch(pmap_tmp.bpp()) - { - //case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_gray8()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_gray8()); break; - //case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_gray8()); break; - } - break; - - case pix_format_gray16: - switch(pmap_tmp.bpp()) - { - //case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_gray16()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_gray16()); break; - //case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_gray16()); break; - } - break; - - case pix_format_rgb555: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_rgb555()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_rgb555()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgb555()); break; - } - break; - - case pix_format_rgb565: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_rgb565()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_rgb565()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgb565()); break; - } - break; - - case pix_format_rgb24: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_rgb24()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_rgb24()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgb24()); break; - } - break; - - case pix_format_bgr24: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_bgr24()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_bgr24()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_bgr24()); break; - } - break; - - case pix_format_rgb48: - switch(pmap_tmp.bpp()) - { - //case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_rgb48()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_rgb48()); break; - //case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgb48()); break; - } - break; - - case pix_format_bgr48: - switch(pmap_tmp.bpp()) - { - //case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_bgr48()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_bgr48()); break; - //case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_bgr48()); break; - } - break; - - case pix_format_abgr32: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_abgr32()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_abgr32()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_abgr32()); break; - } - break; - - case pix_format_argb32: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_argb32()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_argb32()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_argb32()); break; - } - break; - - case pix_format_bgra32: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_bgra32()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_bgra32()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_bgra32()); break; - } - break; - - case pix_format_rgba32: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_rgba32()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_rgba32()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgba32()); break; - } - break; - - case pix_format_abgr64: - switch(pmap_tmp.bpp()) - { - //case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_abgr64()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_abgr64()); break; - //case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_abgr64()); break; - } - break; - - case pix_format_argb64: - switch(pmap_tmp.bpp()) - { - //case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_argb64()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_argb64()); break; - //case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_argb64()); break; - } - break; - - case pix_format_bgra64: - switch(pmap_tmp.bpp()) - { - //case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_bgra64()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_bgra64()); break; - //case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_bgra64()); break; - } - break; - - case pix_format_rgba64: - switch(pmap_tmp.bpp()) - { - //case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_rgba64()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_rgba64()); break; - //case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgba64()); break; - } - break; - - } - - return true; - } - - - - - - - - - //------------------------------------------------------------------------ - unsigned platform_specific::translate(unsigned keycode) - { - return m_last_translated_key = (keycode > 255) ? 0 : m_keymap[keycode]; - } - - - - //------------------------------------------------------------------------ - platform_support::platform_support(pix_format_e format, bool flip_y) : - m_specific(new platform_specific(format, flip_y)), - m_format(format), - m_bpp(m_specific->m_bpp), - m_window_flags(0), - m_wait_mode(true), - m_flip_y(flip_y), - m_initial_width(10), - m_initial_height(10) - { - strcpy(m_caption, "Anti-Grain Geometry Application"); - } - - - //------------------------------------------------------------------------ - platform_support::~platform_support() - { - delete m_specific; - } - - - - //------------------------------------------------------------------------ - void platform_support::caption(const char* cap) - { - strcpy(m_caption, cap); - if(m_specific->m_hwnd) - { - SetWindowText(m_specific->m_hwnd, m_caption); - } - } - - //------------------------------------------------------------------------ - void platform_support::start_timer() - { - ::QueryPerformanceCounter(&(m_specific->m_sw_start)); - } - - //------------------------------------------------------------------------ - double platform_support::elapsed_time() const - { - LARGE_INTEGER stop; - ::QueryPerformanceCounter(&stop); - return double(stop.QuadPart - - m_specific->m_sw_start.QuadPart) * 1000.0 / - double(m_specific->m_sw_freq.QuadPart); - } - - - - //------------------------------------------------------------------------ - static unsigned get_key_flags(int wflags) - { - unsigned flags = 0; - if(wflags & MK_LBUTTON) flags |= mouse_left; - if(wflags & MK_RBUTTON) flags |= mouse_right; - if(wflags & MK_SHIFT) flags |= kbd_shift; - if(wflags & MK_CONTROL) flags |= kbd_ctrl; - return flags; - } - - - void* platform_support::raw_display_handler() - { - return m_specific->m_current_dc; - } - - - //------------------------------------------------------------------------ - LRESULT CALLBACK window_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) - { - PAINTSTRUCT ps; - HDC paintDC; - - - void* user_data = reinterpret_cast(::GetWindowLong(hWnd, GWL_USERDATA)); - platform_support* app = 0; - - if(user_data) - { - app = reinterpret_cast(user_data); - } - - if(app == 0) - { - if(msg == WM_DESTROY) - { - ::PostQuitMessage(0); - return 0; - } - return ::DefWindowProc(hWnd, msg, wParam, lParam); - } - - HDC dc = ::GetDC(app->m_specific->m_hwnd); - app->m_specific->m_current_dc = dc; - LRESULT ret = 0; - - switch(msg) - { - //-------------------------------------------------------------------- - case WM_CREATE: - break; - - //-------------------------------------------------------------------- - case WM_SIZE: - app->m_specific->create_pmap(LOWORD(lParam), - HIWORD(lParam), - &app->rbuf_window()); - - app->trans_affine_resizing(LOWORD(lParam), HIWORD(lParam)); - app->on_resize(LOWORD(lParam), HIWORD(lParam)); - app->force_redraw(); - break; - - //-------------------------------------------------------------------- - case WM_ERASEBKGND: - break; - - //-------------------------------------------------------------------- - case WM_LBUTTONDOWN: - ::SetCapture(app->m_specific->m_hwnd); - app->m_specific->m_cur_x = int16(LOWORD(lParam)); - if(app->flip_y()) - { - app->m_specific->m_cur_y = app->rbuf_window().height() - int16(HIWORD(lParam)); - } - else - { - app->m_specific->m_cur_y = int16(HIWORD(lParam)); - } - app->m_specific->m_input_flags = mouse_left | get_key_flags(wParam); - - app->m_ctrls.set_cur(app->m_specific->m_cur_x, - app->m_specific->m_cur_y); - if(app->m_ctrls.on_mouse_button_down(app->m_specific->m_cur_x, - app->m_specific->m_cur_y)) - { - app->on_ctrl_change(); - app->force_redraw(); - } - else - { - if(app->m_ctrls.in_rect(app->m_specific->m_cur_x, - app->m_specific->m_cur_y)) - { - if(app->m_ctrls.set_cur(app->m_specific->m_cur_x, - app->m_specific->m_cur_y)) - { - app->on_ctrl_change(); - app->force_redraw(); - } - } - else - { - app->on_mouse_button_down(app->m_specific->m_cur_x, - app->m_specific->m_cur_y, - app->m_specific->m_input_flags); - } - } -/* - if(!app->wait_mode()) - { - app->on_idle(); - } -*/ - break; - - //-------------------------------------------------------------------- - case WM_LBUTTONUP: - ::ReleaseCapture(); - app->m_specific->m_cur_x = int16(LOWORD(lParam)); - if(app->flip_y()) - { - app->m_specific->m_cur_y = app->rbuf_window().height() - int16(HIWORD(lParam)); - } - else - { - app->m_specific->m_cur_y = int16(HIWORD(lParam)); - } - app->m_specific->m_input_flags = mouse_left | get_key_flags(wParam); - - if(app->m_ctrls.on_mouse_button_up(app->m_specific->m_cur_x, - app->m_specific->m_cur_y)) - { - app->on_ctrl_change(); - app->force_redraw(); - } - app->on_mouse_button_up(app->m_specific->m_cur_x, - app->m_specific->m_cur_y, - app->m_specific->m_input_flags); -/* - if(!app->wait_mode()) - { - app->on_idle(); - } -*/ - break; - - - //-------------------------------------------------------------------- - case WM_RBUTTONDOWN: - ::SetCapture(app->m_specific->m_hwnd); - app->m_specific->m_cur_x = int16(LOWORD(lParam)); - if(app->flip_y()) - { - app->m_specific->m_cur_y = app->rbuf_window().height() - int16(HIWORD(lParam)); - } - else - { - app->m_specific->m_cur_y = int16(HIWORD(lParam)); - } - app->m_specific->m_input_flags = mouse_right | get_key_flags(wParam); - app->on_mouse_button_down(app->m_specific->m_cur_x, - app->m_specific->m_cur_y, - app->m_specific->m_input_flags); -/* - if(!app->wait_mode()) - { - app->on_idle(); - } -*/ - break; - - //-------------------------------------------------------------------- - case WM_RBUTTONUP: - ::ReleaseCapture(); - app->m_specific->m_cur_x = int16(LOWORD(lParam)); - if(app->flip_y()) - { - app->m_specific->m_cur_y = app->rbuf_window().height() - int16(HIWORD(lParam)); - } - else - { - app->m_specific->m_cur_y = int16(HIWORD(lParam)); - } - app->m_specific->m_input_flags = mouse_right | get_key_flags(wParam); - app->on_mouse_button_up(app->m_specific->m_cur_x, - app->m_specific->m_cur_y, - app->m_specific->m_input_flags); -/* - if(!app->wait_mode()) - { - app->on_idle(); - } -*/ - break; - - //-------------------------------------------------------------------- - case WM_MOUSEMOVE: - app->m_specific->m_cur_x = int16(LOWORD(lParam)); - if(app->flip_y()) - { - app->m_specific->m_cur_y = app->rbuf_window().height() - int16(HIWORD(lParam)); - } - else - { - app->m_specific->m_cur_y = int16(HIWORD(lParam)); - } - app->m_specific->m_input_flags = get_key_flags(wParam); - - - if(app->m_ctrls.on_mouse_move( - app->m_specific->m_cur_x, - app->m_specific->m_cur_y, - (app->m_specific->m_input_flags & mouse_left) != 0)) - { - app->on_ctrl_change(); - app->force_redraw(); - } - else - { - if(!app->m_ctrls.in_rect(app->m_specific->m_cur_x, - app->m_specific->m_cur_y)) - { - app->on_mouse_move(app->m_specific->m_cur_x, - app->m_specific->m_cur_y, - app->m_specific->m_input_flags); - } - } -/* - if(!app->wait_mode()) - { - app->on_idle(); - } -*/ - break; - - //-------------------------------------------------------------------- - case WM_SYSKEYDOWN: - case WM_KEYDOWN: - app->m_specific->m_last_translated_key = 0; - switch(wParam) - { - case VK_CONTROL: - app->m_specific->m_input_flags |= kbd_ctrl; - break; - - case VK_SHIFT: - app->m_specific->m_input_flags |= kbd_shift; - break; - - default: - app->m_specific->translate(wParam); - break; - } - - if(app->m_specific->m_last_translated_key) - { - bool left = false; - bool up = false; - bool right = false; - bool down = false; - - switch(app->m_specific->m_last_translated_key) - { - case key_left: - left = true; - break; - - case key_up: - up = true; - break; - - case key_right: - right = true; - break; - - case key_down: - down = true; - break; - - case key_f2: - app->copy_window_to_img(agg::platform_support::max_images - 1); - app->save_img(agg::platform_support::max_images - 1, "screenshot"); - break; - } - - if(app->window_flags() & window_process_all_keys) - { - app->on_key(app->m_specific->m_cur_x, - app->m_specific->m_cur_y, - app->m_specific->m_last_translated_key, - app->m_specific->m_input_flags); - } - else - { - if(app->m_ctrls.on_arrow_keys(left, right, down, up)) - { - app->on_ctrl_change(); - app->force_redraw(); - } - else - { - app->on_key(app->m_specific->m_cur_x, - app->m_specific->m_cur_y, - app->m_specific->m_last_translated_key, - app->m_specific->m_input_flags); - } - } - } -/* - if(!app->wait_mode()) - { - app->on_idle(); - } -*/ - break; - - //-------------------------------------------------------------------- - case WM_SYSKEYUP: - case WM_KEYUP: - app->m_specific->m_last_translated_key = 0; - switch(wParam) - { - case VK_CONTROL: - app->m_specific->m_input_flags &= ~kbd_ctrl; - break; - - case VK_SHIFT: - app->m_specific->m_input_flags &= ~kbd_shift; - break; - } - break; - - //-------------------------------------------------------------------- - case WM_CHAR: - case WM_SYSCHAR: - if(app->m_specific->m_last_translated_key == 0) - { - app->on_key(app->m_specific->m_cur_x, - app->m_specific->m_cur_y, - wParam, - app->m_specific->m_input_flags); - } - break; - - //-------------------------------------------------------------------- - case WM_PAINT: - paintDC = ::BeginPaint(hWnd, &ps); - app->m_specific->m_current_dc = paintDC; - if(app->m_specific->m_redraw_flag) - { - app->on_draw(); - app->m_specific->m_redraw_flag = false; - } - app->m_specific->display_pmap(paintDC, &app->rbuf_window()); - app->on_post_draw(paintDC); - app->m_specific->m_current_dc = 0; - ::EndPaint(hWnd, &ps); - break; - - //-------------------------------------------------------------------- - case WM_COMMAND: - break; - - //-------------------------------------------------------------------- - case WM_DESTROY: - ::PostQuitMessage(0); - break; - - //-------------------------------------------------------------------- - default: - ret = ::DefWindowProc(hWnd, msg, wParam, lParam); - break; - } - app->m_specific->m_current_dc = 0; - ::ReleaseDC(app->m_specific->m_hwnd, dc); - return ret; - } - - - //------------------------------------------------------------------------ - void platform_support::message(const char* msg) - { - ::MessageBox(m_specific->m_hwnd, msg, "AGG Message", MB_OK); - } - - - //------------------------------------------------------------------------ - bool platform_support::init(unsigned width, unsigned height, unsigned flags) - { - if(m_specific->m_sys_format == pix_format_undefined) - { - return false; - } - - m_window_flags = flags; - - int wflags = CS_OWNDC | CS_VREDRAW | CS_HREDRAW; - - WNDCLASS wc; - wc.lpszClassName = "AGGAppClass"; - wc.lpfnWndProc = window_proc; - wc.style = wflags; - wc.hInstance = g_windows_instance; - wc.hIcon = LoadIcon(0, IDI_APPLICATION); - wc.hCursor = LoadCursor(0, IDC_ARROW); - wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); - wc.lpszMenuName = "AGGAppMenu"; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - ::RegisterClass(&wc); - - wflags = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX; - - if(m_window_flags & window_resize) - { - wflags |= WS_THICKFRAME | WS_MAXIMIZEBOX; - } - - m_specific->m_hwnd = ::CreateWindow("AGGAppClass", - m_caption, - wflags, - 100, - 100, - width, - height, - 0, - 0, - g_windows_instance, - 0); - - if(m_specific->m_hwnd == 0) - { - return false; - } - - - RECT rct; - ::GetClientRect(m_specific->m_hwnd, &rct); - - ::MoveWindow(m_specific->m_hwnd, // handle to window - 100, // horizontal position - 100, // vertical position - width + (width - (rct.right - rct.left)), - height + (height - (rct.bottom - rct.top)), - FALSE); - - ::SetWindowLong(m_specific->m_hwnd, GWL_USERDATA, (LONG)this); - m_specific->create_pmap(width, height, &m_rbuf_window); - m_initial_width = width; - m_initial_height = height; - on_init(); - m_specific->m_redraw_flag = true; - ::ShowWindow(m_specific->m_hwnd, g_windows_cmd_show); - return true; - } - - - - //------------------------------------------------------------------------ - int platform_support::run() - { - MSG msg; - - for(;;) - { - if(m_wait_mode) - { - if(!::GetMessage(&msg, 0, 0, 0)) - { - break; - } - ::TranslateMessage(&msg); - ::DispatchMessage(&msg); - } - else - { - if(::PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) - { - ::TranslateMessage(&msg); - if(msg.message == WM_QUIT) - { - break; - } - ::DispatchMessage(&msg); - } - else - { - on_idle(); - } - } - } - return (int)msg.wParam; - } - - - //------------------------------------------------------------------------ - const char* platform_support::img_ext() const { return ".bmp"; } - - - //------------------------------------------------------------------------ - const char* platform_support::full_file_name(const char* file_name) - { - return file_name; - } - - //------------------------------------------------------------------------ - bool platform_support::load_img(unsigned idx, const char* file) - { - if(idx < max_images) - { - char fn[1024]; - strcpy(fn, file); - int len = strlen(fn); - if(len < 4 || stricmp(fn + len - 4, ".BMP") != 0) - { - strcat(fn, ".bmp"); - } - return m_specific->load_pmap(fn, idx, &m_rbuf_img[idx]); - } - return true; - } - - - - //------------------------------------------------------------------------ - bool platform_support::save_img(unsigned idx, const char* file) - { - if(idx < max_images) - { - char fn[1024]; - strcpy(fn, file); - int len = strlen(fn); - if(len < 4 || stricmp(fn + len - 4, ".BMP") != 0) - { - strcat(fn, ".bmp"); - } - return m_specific->save_pmap(fn, idx, &m_rbuf_img[idx]); - } - return true; - } - - - - //------------------------------------------------------------------------ - bool platform_support::create_img(unsigned idx, unsigned width, unsigned height) - { - if(idx < max_images) - { - if(width == 0) width = m_specific->m_pmap_window.width(); - if(height == 0) height = m_specific->m_pmap_window.height(); - m_specific->m_pmap_img[idx].create(width, height, org_e(m_specific->m_bpp)); - m_rbuf_img[idx].attach(m_specific->m_pmap_img[idx].buf(), - m_specific->m_pmap_img[idx].width(), - m_specific->m_pmap_img[idx].height(), - m_flip_y ? - m_specific->m_pmap_img[idx].stride() : - -m_specific->m_pmap_img[idx].stride()); - return true; - } - return false; - } - - - //------------------------------------------------------------------------ - void platform_support::force_redraw() - { - m_specific->m_redraw_flag = true; - ::InvalidateRect(m_specific->m_hwnd, 0, FALSE); - } - - - - //------------------------------------------------------------------------ - void platform_support::update_window() - { - HDC dc = ::GetDC(m_specific->m_hwnd); - m_specific->display_pmap(dc, &m_rbuf_window); - ::ReleaseDC(m_specific->m_hwnd, dc); - } - - - //------------------------------------------------------------------------ - void platform_support::on_init() {} - void platform_support::on_resize(int sx, int sy) {} - void platform_support::on_idle() {} - void platform_support::on_mouse_move(int x, int y, unsigned flags) {} - void platform_support::on_mouse_button_down(int x, int y, unsigned flags) {} - void platform_support::on_mouse_button_up(int x, int y, unsigned flags) {} - void platform_support::on_key(int x, int y, unsigned key, unsigned flags) {} - void platform_support::on_ctrl_change() {} - void platform_support::on_draw() {} - void platform_support::on_post_draw(void* raw_handler) {} -}; - - - - -namespace agg -{ - // That's ridiculous. I have to parse the command line by myself - // because Windows doesn't provide a method of getting the command - // line arguments in a form of argc, argv. Of course, there's - // CommandLineToArgv() but first, it returns Unicode that I don't - // need to deal with, but most of all, it's not compatible with Win98. - //----------------------------------------------------------------------- - class tokenizer - { - public: - enum sep_flag - { - single, - multiple, - whole_str - }; - - struct token - { - const char* ptr; - unsigned len; - }; - - public: - tokenizer(const char* sep, - const char* trim=0, - const char* quote="\"", - char mask_chr='\\', - sep_flag sf=multiple); - - void set_str(const char* str); - token next_token(); - - private: - int check_chr(const char *str, char chr); - - private: - const char* m_src_string; - int m_start; - const char* m_sep; - const char* m_trim; - const char* m_quote; - char m_mask_chr; - unsigned m_sep_len; - sep_flag m_sep_flag; - }; - - - - //----------------------------------------------------------------------- - inline void tokenizer::set_str(const char* str) - { - m_src_string = str; - m_start = 0; - } - - - //----------------------------------------------------------------------- - inline int tokenizer::check_chr(const char *str, char chr) - { - return int(strchr(str, chr)); - } - - - //----------------------------------------------------------------------- - tokenizer::tokenizer(const char* sep, - const char* trim, - const char* quote, - char mask_chr, - sep_flag sf) : - m_src_string(0), - m_start(0), - m_sep(sep), - m_trim(trim), - m_quote(quote), - m_mask_chr(mask_chr), - m_sep_len(sep ? strlen(sep) : 0), - m_sep_flag(sep ? sf : single) - { - } - - - //----------------------------------------------------------------------- - tokenizer::token tokenizer::next_token() - { - unsigned count = 0; - char quote_chr = 0; - token tok; - - tok.ptr = 0; - tok.len = 0; - if(m_src_string == 0 || m_start == -1) return tok; - - register const char *pstr = m_src_string + m_start; - - if(*pstr == 0) - { - m_start = -1; - return tok; - } - - int sep_len = 1; - if(m_sep_flag == whole_str) sep_len = m_sep_len; - - if(m_sep_flag == multiple) - { - //Pass all the separator symbols at the begin of the string - while(*pstr && check_chr(m_sep, *pstr)) - { - ++pstr; - ++m_start; - } - } - - if(*pstr == 0) - { - m_start = -1; - return tok; - } - - for(count = 0;; ++count) - { - char c = *pstr; - int found = 0; - - //We are outside of qotation: find one of separator symbols - if(quote_chr == 0) - { - if(sep_len == 1) - { - found = check_chr(m_sep, c); - } - else - { - found = strncmp(m_sep, pstr, m_sep_len) == 0; - } - } - - ++pstr; - - if(c == 0 || found) - { - if(m_trim) - { - while(count && - check_chr(m_trim, m_src_string[m_start])) - { - ++m_start; - --count; - } - - while(count && - check_chr(m_trim, m_src_string[m_start + count - 1])) - { - --count; - } - } - - tok.ptr = m_src_string + m_start; - tok.len = count; - - //Next time it will be the next separator character - //But we must check, whether it is NOT the end of the string. - m_start += count; - if(c) - { - m_start += sep_len; - if(m_sep_flag == multiple) - { - //Pass all the separator symbols - //after the end of the string - while(check_chr(m_sep, m_src_string[m_start])) - { - ++m_start; - } - } - } - break; - } - - //Switch quote. If it is not a quote yet, try to check any of - //quote symbols. Otherwise quote must be finished with quote_symb - if(quote_chr == 0) - { - if(check_chr(m_quote, c)) - { - quote_chr = c; - continue; - } - } - else - { - //We are inside quote: pass all the mask symbols - if(m_mask_chr && c == m_mask_chr) - { - if(*pstr) - { - ++count; - ++pstr; - } - continue; - } - if(c == quote_chr) - { - quote_chr = 0; - continue; - } - } - } - return tok; - } - - -} - - - -//---------------------------------------------------------------------------- -int agg_main(int argc, char* argv[]); - - - -//---------------------------------------------------------------------------- -/*int PASCAL WinMain(HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPSTR lpszCmdLine, - int nCmdShow) -{ - agg::g_windows_instance = hInstance; - agg::g_windows_cmd_show = nCmdShow; - - char* argv_str = new char [strlen(lpszCmdLine) + 3]; - char* argv_ptr = argv_str; - - char* argv[64]; - memset(argv, 0, sizeof(argv)); - - agg::tokenizer cmd_line(" ", "\"' ", "\"'", '\\', agg::tokenizer::multiple); - cmd_line.set_str(lpszCmdLine); - - int argc = 0; - argv[argc++] = argv_ptr; - *argv_ptr++ = 0; - - while(argc < 64) - { - agg::tokenizer::token tok = cmd_line.next_token(); - if(tok.ptr == 0) break; - if(tok.len) - { - memcpy(argv_ptr, tok.ptr, tok.len); - argv[argc++] = argv_ptr; - argv_ptr += tok.len; - *argv_ptr++ = 0; - } - } - - int ret = agg_main(argc, argv); - delete [] argv_str; - - return ret; -} -*/ - -#endif - - -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// class platform_support -// -//---------------------------------------------------------------------------- - -#ifdef PLATFORM_AMIGA - -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -Library* DataTypesBase = 0; -Library* GraphicsBase = 0; -Library* IntuitionBase = 0; -Library* KeymapBase = 0; -Library* P96Base = 0; - -DataTypesIFace* IDataTypes = 0; -GraphicsIFace* IGraphics = 0; -IntuitionIFace* IIntuition = 0; -KeymapIFace* IKeymap = 0; -P96IFace* IP96 = 0; - -Class* RequesterClass = 0; -Class* WindowClass = 0; - - -namespace agg -{ - void handle_idcmp(Hook* hook, APTR win, IntuiMessage* msg); - - //------------------------------------------------------------------------ - class platform_specific - { - public: - platform_specific(platform_support& support, pix_format_e format, - bool flip_y); - ~platform_specific(); - bool handle_input(); - bool load_img(const char* file, unsigned idx, rendering_buffer* rbuf); - bool create_img(unsigned idx, rendering_buffer* rbuf, unsigned width, - unsigned height); - bool make_bitmap(); - public: - platform_support& m_support; - RGBFTYPE m_ftype; - pix_format_e m_format; - unsigned m_bpp; - BitMap* m_bitmap; - bool m_flip_y; - uint16 m_width; - uint16 m_height; - APTR m_window_obj; - Window* m_window; - Hook* m_idcmp_hook; - unsigned m_input_flags; - bool m_dragging; - double m_start_time; - uint16 m_last_key; - BitMap* m_img_bitmaps[platform_support::max_images]; - }; - - //------------------------------------------------------------------------ - platform_specific::platform_specific(platform_support& support, - pix_format_e format, bool flip_y) : - m_support(support), - m_ftype(RGBFB_NONE), - m_format(format), - m_bpp(0), - m_bitmap(0), - m_flip_y(flip_y), - m_width(0), - m_height(0), - m_window_obj(0), - m_window(0), - m_idcmp_hook(0), - m_input_flags(0), - m_dragging(false), - m_start_time(0.0), - m_last_key(0) - { - switch ( format ) - { - case pix_format_gray8: - // Not supported. - break; - case pix_format_rgb555: - m_ftype = RGBFB_R5G5B5; - m_bpp = 15; - break; - case pix_format_rgb565: - m_ftype = RGBFB_R5G6B5; - m_bpp = 16; - break; - case pix_format_rgb24: - m_ftype = RGBFB_R8G8B8; - m_bpp = 24; - break; - case pix_format_bgr24: - m_ftype = RGBFB_B8G8R8; - m_bpp = 24; - break; - case pix_format_bgra32: - m_ftype = RGBFB_B8G8R8A8; - m_bpp = 32; - break; - case pix_format_abgr32: - m_ftype = RGBFB_A8B8G8R8; - m_bpp = 32; - break; - case pix_format_argb32: - m_ftype = RGBFB_A8R8G8B8; - m_bpp = 32; - break; - case pix_format_rgba32: - m_ftype = RGBFB_R8G8B8A8; - m_bpp = 32; - break; - } - - for ( unsigned i = 0; i < platform_support::max_images; ++i ) - { - m_img_bitmaps[i] = 0; - } - } - - //------------------------------------------------------------------------ - platform_specific::~platform_specific() - { - IIntuition->DisposeObject(m_window_obj); - - IP96->p96FreeBitMap(m_bitmap); - - for ( unsigned i = 0; i < platform_support::max_images; ++i ) - { - IP96->p96FreeBitMap(m_img_bitmaps[i]); - } - - if ( m_idcmp_hook != 0 ) - { - IExec->FreeSysObject(ASOT_HOOK, m_idcmp_hook); - } - } - - //------------------------------------------------------------------------ - bool platform_specific::handle_input() - { - int16 code = 0; - uint32 result = 0; - Object* obj = reinterpret_cast(m_window_obj); - - while ( (result = IIntuition->IDoMethod(obj, WM_HANDLEINPUT, - &code)) != WMHI_LASTMSG ) - { - switch ( result & WMHI_CLASSMASK ) - { - case WMHI_CLOSEWINDOW: - return true; - break; - case WMHI_INTUITICK: - if ( !m_support.wait_mode() ) - { - m_support.on_idle(); - } - break; - case WMHI_NEWSIZE: - if ( make_bitmap() ) - { - m_support.trans_affine_resizing(m_width, m_height); - m_support.on_resize(m_width, m_height); - m_support.force_redraw(); - } - break; - } - } - - return false; - } - - //------------------------------------------------------------------------ - bool platform_specific::load_img(const char* file, unsigned idx, - rendering_buffer* rbuf) - { - if ( m_img_bitmaps[idx] != 0 ) - { - IP96->p96FreeBitMap(m_img_bitmaps[idx]); - m_img_bitmaps[idx] = 0; - } - - bool result = false; - - Object* picture = IDataTypes->NewDTObject(const_cast(file), - DTA_GroupID, GID_PICTURE, - PDTA_DestMode, PMODE_V43, - PDTA_Remap, FALSE, - TAG_END); - if ( picture != 0 ) - { - gpLayout layout; - layout.MethodID = DTM_PROCLAYOUT; - layout.gpl_GInfo = 0; - layout.gpl_Initial = 1; - ULONG loaded = IDataTypes->DoDTMethodA(picture, 0, 0, - reinterpret_cast(&layout)); - if ( loaded != 0 ) - { - BitMap* src_bitmap = 0; - IDataTypes->GetDTAttrs(picture, - PDTA_ClassBitMap, &src_bitmap, - TAG_END); - - bool supported = false; - - RGBFTYPE ftype = static_cast(IP96->p96GetBitMapAttr( - src_bitmap, P96BMA_RGBFORMAT)); - - switch ( ftype ) - { - case RGBFB_R8G8B8: - supported = true; - break; - default: - m_support.message("File uses unsupported graphics mode."); - break; - } - - if ( supported ) { - uint16 width = IP96->p96GetBitMapAttr(src_bitmap, - P96BMA_WIDTH); - uint16 height = IP96->p96GetBitMapAttr(src_bitmap, - P96BMA_HEIGHT); - - m_img_bitmaps[idx] = IP96->p96AllocBitMap(width, height, - m_bpp, BMF_USERPRIVATE, 0, m_ftype); - if ( m_img_bitmaps[idx] != 0 ) - { - int8u* buf = reinterpret_cast( - IP96->p96GetBitMapAttr(m_img_bitmaps[idx], - P96BMA_MEMORY)); - int bpr = IP96->p96GetBitMapAttr(m_img_bitmaps[idx], - P96BMA_BYTESPERROW); - int stride = (m_flip_y) ? -bpr : bpr; - rbuf->attach(buf, width, height, stride); - - // P96 sets the alpha to zero so it can't be used to - // color convert true color modes. - if ( m_bpp == 32 ) - { - RenderInfo ri; - int32 lock = IP96->p96LockBitMap(src_bitmap, - reinterpret_cast(&ri), - sizeof(RenderInfo)); - - rendering_buffer rbuf_src; - rbuf_src.attach( - reinterpret_cast(ri.Memory), - width, height, (m_flip_y) ? - -ri.BytesPerRow : ri.BytesPerRow); - - switch ( m_format ) - { - case pix_format_bgra32: - color_conv(rbuf, &rbuf_src, - color_conv_rgb24_to_bgra32()); - break; - case pix_format_abgr32: - color_conv(rbuf, &rbuf_src, - color_conv_rgb24_to_abgr32()); - break; - case pix_format_argb32: - color_conv(rbuf, &rbuf_src, - color_conv_rgb24_to_argb32()); - break; - case pix_format_rgba32: - color_conv(rbuf, &rbuf_src, - color_conv_rgb24_to_rgba32()); - break; - } - - IP96->p96UnlockBitMap(src_bitmap, lock); - } - else - { - IGraphics->BltBitMap(src_bitmap, 0, 0, - m_img_bitmaps[idx], 0, 0, width, height, - ABC|ABNC, 0xFF, 0); - } - - result = true; - } - } - } - } - - IGraphics->WaitBlit(); - IDataTypes->DisposeDTObject(picture); - - return result; - } - - //------------------------------------------------------------------------ - bool platform_specific::create_img(unsigned idx, rendering_buffer* rbuf, - unsigned width, unsigned height) - { - if ( m_img_bitmaps[idx] != 0 ) - { - IP96->p96FreeBitMap(m_img_bitmaps[idx]); - m_img_bitmaps[idx] = 0; - } - - m_img_bitmaps[idx] = IP96->p96AllocBitMap(width, height, - m_bpp, BMF_USERPRIVATE, m_bitmap, m_ftype); - if ( m_img_bitmaps[idx] != 0 ) - { - int8u* buf = reinterpret_cast( - IP96->p96GetBitMapAttr(m_img_bitmaps[idx], - P96BMA_MEMORY)); - int bpr = IP96->p96GetBitMapAttr(m_img_bitmaps[idx], - P96BMA_BYTESPERROW); - int stride = (m_flip_y) ? -bpr : bpr; - - rbuf->attach(buf, width, height, stride); - - return true; - } - - return false; - } - - //------------------------------------------------------------------------ - bool platform_specific::make_bitmap() - { - uint32 width = 0; - uint32 height = 0; - IIntuition->GetWindowAttrs(m_window, - WA_InnerWidth, &width, - WA_InnerHeight, &height, - TAG_END); - - BitMap* bm = IP96->p96AllocBitMap(width, height, m_bpp, - BMF_USERPRIVATE|BMF_CLEAR, 0, m_ftype); - if ( bm == 0 ) - { - return false; - } - - int8u* buf = reinterpret_cast( - IP96->p96GetBitMapAttr(bm, P96BMA_MEMORY)); - int bpr = IP96->p96GetBitMapAttr(bm, P96BMA_BYTESPERROW); - int stride = (m_flip_y) ? -bpr : bpr; - - m_support.rbuf_window().attach(buf, width, height, stride); - - if ( m_bitmap != 0 ) - { - IP96->p96FreeBitMap(m_bitmap); - m_bitmap = 0; - } - - m_bitmap = bm; - m_width = width; - m_height = height; - - return true; - } - - //------------------------------------------------------------------------ - platform_support::platform_support(pix_format_e format, bool flip_y) : - m_specific(new platform_specific(*this, format, flip_y)), - m_format(format), - m_bpp(m_specific->m_bpp), - m_window_flags(0), - m_wait_mode(true), - m_flip_y(flip_y), - m_initial_width(10), - m_initial_height(10) - { - std::strncpy(m_caption, "Anti-Grain Geometry", 256); - } - - //------------------------------------------------------------------------ - platform_support::~platform_support() - { - delete m_specific; - } - - //------------------------------------------------------------------------ - void platform_support::caption(const char* cap) - { - std::strncpy(m_caption, cap, 256); - if ( m_specific->m_window != 0 ) - { - const char* ignore = reinterpret_cast(-1); - IIntuition->SetWindowAttr(m_specific->m_window, - WA_Title, m_caption, sizeof(char*)); - } - } - - //------------------------------------------------------------------------ - void platform_support::start_timer() - { - timeval tv; - gettimeofday(&tv, 0); - m_specific->m_start_time = tv.tv_secs + tv.tv_micro/1e6; - } - - //------------------------------------------------------------------------ - double platform_support::elapsed_time() const - { - timeval tv; - gettimeofday(&tv, 0); - double end_time = tv.tv_secs + tv.tv_micro/1e6; - - double elasped_seconds = end_time - m_specific->m_start_time; - double elasped_millis = elasped_seconds*1e3; - - return elasped_millis; - } - - //------------------------------------------------------------------------ - void* platform_support::raw_display_handler() - { - return 0; // Not available. - } - - //------------------------------------------------------------------------ - void platform_support::message(const char* msg) - { - APTR req = IIntuition->NewObject(RequesterClass, 0, - REQ_TitleText, "Anti-Grain Geometry", - REQ_Image, REQIMAGE_INFO, - REQ_BodyText, msg, - REQ_GadgetText, "_Ok", - TAG_END); - if ( req == 0 ) - { - IDOS->Printf("Message: %s\n", msg); - return; - } - - orRequest reqmsg; - reqmsg.MethodID = RM_OPENREQ; - reqmsg.or_Attrs = 0; - reqmsg.or_Window = m_specific->m_window; - reqmsg.or_Screen = 0; - - IIntuition->IDoMethodA(reinterpret_cast(req), - reinterpret_cast(&reqmsg)); - IIntuition->DisposeObject(req); - } - - //------------------------------------------------------------------------ - bool platform_support::init(unsigned width, unsigned height, - unsigned flags) - { - if( m_specific->m_ftype == RGBFB_NONE ) - { - message("Unsupported mode requested."); - return false; - } - - m_window_flags = flags; - - m_specific->m_idcmp_hook = reinterpret_cast( - IExec->AllocSysObjectTags(ASOT_HOOK, - ASOHOOK_Entry, handle_idcmp, - ASOHOOK_Data, this, - TAG_END)); - if ( m_specific->m_idcmp_hook == 0 ) - { - return false; - } - - m_specific->m_window_obj = IIntuition->NewObject(WindowClass, 0, - WA_Title, m_caption, - WA_AutoAdjustDClip, TRUE, - WA_InnerWidth, width, - WA_InnerHeight, height, - WA_Activate, TRUE, - WA_SmartRefresh, TRUE, - WA_NoCareRefresh, TRUE, - WA_CloseGadget, TRUE, - WA_DepthGadget, TRUE, - WA_SizeGadget, (flags & agg::window_resize) ? TRUE : FALSE, - WA_DragBar, TRUE, - WA_AutoAdjust, TRUE, - WA_ReportMouse, TRUE, - WA_RMBTrap, TRUE, - WA_MouseQueue, 1, - WA_IDCMP, - IDCMP_NEWSIZE | - IDCMP_MOUSEBUTTONS | - IDCMP_MOUSEMOVE | - IDCMP_RAWKEY | - IDCMP_INTUITICKS, - WINDOW_IDCMPHook, m_specific->m_idcmp_hook, - WINDOW_IDCMPHookBits, - IDCMP_MOUSEBUTTONS | - IDCMP_MOUSEMOVE | - IDCMP_RAWKEY, - TAG_END); - if ( m_specific->m_window_obj == 0 ) - { - return false; - } - - Object* obj = reinterpret_cast(m_specific->m_window_obj); - m_specific->m_window = - reinterpret_cast(IIntuition->IDoMethod(obj, WM_OPEN)); - if ( m_specific->m_window == 0 ) - { - return false; - } - - RGBFTYPE ftype = static_cast(IP96->p96GetBitMapAttr( - m_specific->m_window->RPort->BitMap, P96BMA_RGBFORMAT)); - - switch ( ftype ) - { - case RGBFB_A8R8G8B8: - case RGBFB_B8G8R8A8: - case RGBFB_R5G6B5PC: - break; - default: - message("Unsupported screen mode.\n"); - return false; - } - - if ( !m_specific->make_bitmap() ) - { - return false; - } - - m_initial_width = width; - m_initial_height = height; - - on_init(); - on_resize(width, height); - force_redraw(); - - return true; - } - - //------------------------------------------------------------------------ - int platform_support::run() - { - uint32 window_mask = 0; - IIntuition->GetAttr(WINDOW_SigMask, m_specific->m_window_obj, - &window_mask); - uint32 wait_mask = window_mask | SIGBREAKF_CTRL_C; - - bool done = false; - - while ( !done ) - { - uint32 sig_mask = IExec->Wait(wait_mask); - if ( sig_mask & SIGBREAKF_CTRL_C ) - { - done = true; - } - else - { - done = m_specific->handle_input(); - } - } - - return 0; - } - - //------------------------------------------------------------------------ - const char* platform_support::img_ext() const - { - return ".bmp"; - } - - //------------------------------------------------------------------------ - const char* platform_support::full_file_name(const char* file_name) - { - return file_name; - } - - //------------------------------------------------------------------------ - bool platform_support::load_img(unsigned idx, const char* file) - { - if ( idx < max_images ) - { - static char fn[1024]; - std::strncpy(fn, file, 1024); - int len = std::strlen(fn); - if ( len < 4 || std::strcmp(fn + len - 4, ".bmp") != 0 ) - { - std::strncat(fn, ".bmp", 1024); - } - - return m_specific->load_img(fn, idx, &m_rbuf_img[idx]); - } - - return false; - } - - //------------------------------------------------------------------------ - bool platform_support::save_img(unsigned idx, const char* file) - { - message("Not supported"); - return false; - } - - //------------------------------------------------------------------------ - bool platform_support::create_img(unsigned idx, unsigned width, - unsigned height) - { - if ( idx < max_images ) - { - if ( width == 0 ) - { - width = m_specific->m_width; - } - - if ( height == 0 ) - { - height = m_specific->m_height; - } - - return m_specific->create_img(idx, &m_rbuf_img[idx], width, - height); - } - - return false; - } - - //------------------------------------------------------------------------ - void platform_support::force_redraw() - { - on_draw(); - update_window(); - } - - //------------------------------------------------------------------------ - void platform_support::update_window() - { - // Note this function does automatic color conversion. - IGraphics->BltBitMapRastPort(m_specific->m_bitmap, 0, 0, - m_specific->m_window->RPort, m_specific->m_window->BorderLeft, - m_specific->m_window->BorderTop, m_specific->m_width, - m_specific->m_height, ABC|ABNC); - } - - //------------------------------------------------------------------------ - void platform_support::on_init() {} - void platform_support::on_resize(int sx, int sy) {} - void platform_support::on_idle() {} - void platform_support::on_mouse_move(int x, int y, unsigned flags) {} - void platform_support::on_mouse_button_down(int x, int y, unsigned flags) {} - void platform_support::on_mouse_button_up(int x, int y, unsigned flags) {} - void platform_support::on_key(int x, int y, unsigned key, unsigned flags) {} - void platform_support::on_ctrl_change() {} - void platform_support::on_draw() {} - void platform_support::on_post_draw(void* raw_handler) {} - - //------------------------------------------------------------------------ - void handle_idcmp(Hook* hook, APTR obj, IntuiMessage* msg) - { - platform_support* app = - reinterpret_cast(hook->h_Data); - Window* window = app->m_specific->m_window; - - int16 x = msg->MouseX - window->BorderLeft; - - int16 y = 0; - if ( app->flip_y() ) - { - y = window->Height - window->BorderBottom - msg->MouseY; - } - else - { - y = msg->MouseY - window->BorderTop; - } - - switch ( msg->Class ) - { - case IDCMP_MOUSEBUTTONS: - if ( msg->Code & IECODE_UP_PREFIX ) - { - if ( msg->Code == SELECTUP ) - { - app->m_specific->m_input_flags = mouse_left; - app->m_specific->m_dragging = false; - } - else if ( msg->Code == MENUUP ) - { - app->m_specific->m_input_flags = mouse_right; - app->m_specific->m_dragging = false; - } - else - { - return; - } - - - if ( app->m_ctrls.on_mouse_button_up(x, y) ) - { - app->on_ctrl_change(); - app->force_redraw(); - } - - app->on_mouse_button_up(x, y, app->m_specific->m_input_flags); - } - else - { - if ( msg->Code == SELECTDOWN ) - { - app->m_specific->m_input_flags = mouse_left; - app->m_specific->m_dragging = true; - } - else if ( msg->Code == MENUDOWN ) - { - app->m_specific->m_input_flags = mouse_right; - app->m_specific->m_dragging = true; - } - else - { - return; - } - - app->m_ctrls.set_cur(x, y); - if ( app->m_ctrls.on_mouse_button_down(x, y) ) - { - app->on_ctrl_change(); - app->force_redraw(); - } - else - { - if ( app->m_ctrls.in_rect(x, y) ) - { - if ( app->m_ctrls.set_cur(x, y) ) - { - app->on_ctrl_change(); - app->force_redraw(); - } - } - else - { - app->on_mouse_button_down(x, y, - app->m_specific->m_input_flags); - } - } - } - break; - case IDCMP_MOUSEMOVE: - if ( app->m_specific->m_dragging ) { - if ( app->m_ctrls.on_mouse_move(x, y, - app->m_specific->m_input_flags & mouse_left) != 0 ) - { - app->on_ctrl_change(); - app->force_redraw(); - } - else - { - if ( !app->m_ctrls.in_rect(x, y) ) - { - app->on_mouse_move(x, y, - app->m_specific->m_input_flags); - } - } - } - break; - case IDCMP_RAWKEY: - { - static InputEvent ie = { 0 }; - ie.ie_Class = IECLASS_RAWKEY; - ie.ie_Code = msg->Code; - ie.ie_Qualifier = msg->Qualifier; - - static const unsigned BUF_SIZE = 16; - static char key_buf[BUF_SIZE]; - int16 num_chars = IKeymap->MapRawKey(&ie, key_buf, BUF_SIZE, 0); - - uint32 code = 0x00000000; - switch ( num_chars ) - { - case 1: - code = key_buf[0]; - break; - case 2: - code = key_buf[0]<<8 | key_buf[1]; - break; - case 3: - code = key_buf[0]<<16 | key_buf[1]<<8 | key_buf[2]; - break; - } - - uint16 key_code = 0; - - if ( num_chars == 1 ) - { - if ( code >= IECODE_ASCII_FIRST && code <= IECODE_ASCII_LAST ) - { - key_code = code; - } - } - - if ( key_code == 0 ) - { - switch ( code ) - { - case 0x00000008: key_code = key_backspace; break; - case 0x00000009: key_code = key_tab; break; - case 0x0000000D: key_code = key_return; break; - case 0x0000001B: key_code = key_escape; break; - case 0x0000007F: key_code = key_delete; break; - case 0x00009B41: - case 0x00009B54: key_code = key_up; break; - case 0x00009B42: - case 0x00009B53: key_code = key_down; break; - case 0x00009B43: - case 0x009B2040: key_code = key_right; break; - case 0x00009B44: - case 0x009B2041: key_code = key_left; break; - case 0x009B307E: key_code = key_f1; break; - case 0x009B317E: key_code = key_f2; break; - case 0x009B327E: key_code = key_f3; break; - case 0x009B337E: key_code = key_f4; break; - case 0x009B347E: key_code = key_f5; break; - case 0x009B357E: key_code = key_f6; break; - case 0x009B367E: key_code = key_f7; break; - case 0x009B377E: key_code = key_f8; break; - case 0x009B387E: key_code = key_f9; break; - case 0x009B397E: key_code = key_f10; break; - case 0x009B3F7E: key_code = key_scrollock; break; - } - } - - if ( ie.ie_Code & IECODE_UP_PREFIX ) - { - if ( app->m_specific->m_last_key != 0 ) - { - bool left = (key_code == key_left) ? true : false; - bool right = (key_code == key_right) ? true : false; - bool down = (key_code == key_down) ? true : false; - bool up = (key_code == key_up) ? true : false; - - if ( app->m_ctrls.on_arrow_keys(left, right, down, up) ) - { - app->on_ctrl_change(); - app->force_redraw(); - } - else - { - app->on_key(x, y, app->m_specific->m_last_key, 0); - } - - app->m_specific->m_last_key = 0; - } - } - else - { - app->m_specific->m_last_key = key_code; - } - break; - } - default: - break; - } - } -} - -//---------------------------------------------------------------------------- -int agg_main(int argc, char* argv[]); -bool open_libs(); -void close_libs(); - -//---------------------------------------------------------------------------- -bool open_libs() -{ - DataTypesBase = IExec->OpenLibrary("datatypes.library", 51); - GraphicsBase = IExec->OpenLibrary("graphics.library", 51); - IntuitionBase = IExec->OpenLibrary("intuition.library", 51); - KeymapBase = IExec->OpenLibrary("keymap.library", 51); - P96Base = IExec->OpenLibrary("Picasso96API.library", 2); - - IDataTypes = reinterpret_cast( - IExec->GetInterface(DataTypesBase, "main", 1, 0)); - IGraphics = reinterpret_cast( - IExec->GetInterface(GraphicsBase, "main", 1, 0)); - IIntuition = reinterpret_cast( - IExec->GetInterface(IntuitionBase, "main", 1, 0)); - IKeymap = reinterpret_cast( - IExec->GetInterface(KeymapBase, "main", 1, 0)); - IP96 = reinterpret_cast( - IExec->GetInterface(P96Base, "main", 1, 0)); - - if ( IDataTypes == 0 || - IGraphics == 0 || - IIntuition == 0 || - IKeymap == 0 || - IP96 == 0 ) - { - close_libs(); - return false; - } - else - { - return true; - } -} - -//---------------------------------------------------------------------------- -void close_libs() -{ - IExec->DropInterface(reinterpret_cast(IP96)); - IExec->DropInterface(reinterpret_cast(IKeymap)); - IExec->DropInterface(reinterpret_cast(IIntuition)); - IExec->DropInterface(reinterpret_cast(IGraphics)); - IExec->DropInterface(reinterpret_cast(IDataTypes)); - - IExec->CloseLibrary(P96Base); - IExec->CloseLibrary(KeymapBase); - IExec->CloseLibrary(IntuitionBase); - IExec->CloseLibrary(GraphicsBase); - IExec->CloseLibrary(DataTypesBase); -} - -//---------------------------------------------------------------------------- -int main(int argc, char* argv[]) -{ - if ( !open_libs() ) { - IDOS->Printf("Can't open libraries.\n"); - return -1; - } - - ClassLibrary* requester = - IIntuition->OpenClass("requester.class", 51, &RequesterClass); - ClassLibrary* window = - IIntuition->OpenClass("window.class", 51, &WindowClass); - if ( requester == 0 || window == 0 ) - { - IDOS->Printf("Can't open classes.\n"); - IIntuition->CloseClass(requester); - IIntuition->CloseClass(window); - close_libs(); - return -1; - } - - int rc = agg_main(argc, argv); - - IIntuition->CloseClass(window); - IIntuition->CloseClass(requester); - close_libs(); - - return rc; -} - -#endif - -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: superstippi@gmx.de -//---------------------------------------------------------------------------- -// -// class platform_support -// -//---------------------------------------------------------------------------- - -#ifdef PLATFORM_BEOS - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -using std::nothrow; - - -static void -attach_buffer_to_BBitmap(agg::rendering_buffer& buffer, BBitmap* bitmap, bool flipY) -{ - uint8* bits = (uint8*)bitmap->Bits(); - uint32 width = bitmap->Bounds().IntegerWidth() + 1; - uint32 height = bitmap->Bounds().IntegerHeight() + 1; - int32 bpr = bitmap->BytesPerRow(); - if (flipY) { -// XXX: why don't I have to do this?!? -// bits += bpr * (height - 1); - bpr = -bpr; - } - buffer.attach(bits, width, height, bpr); -} - - -static color_space -pix_format_to_color_space(agg::pix_format_e format) -{ - color_space bitmapFormat = B_NO_COLOR_SPACE; - switch (format) { - case agg::pix_format_rgb555: - - bitmapFormat = B_RGB15; - break; - - case agg::pix_format_rgb565: - - bitmapFormat = B_RGB16; - break; - - case agg::pix_format_rgb24: - case agg::pix_format_bgr24: - - bitmapFormat = B_RGB24; - break; - - case agg::pix_format_rgba32: - case agg::pix_format_argb32: - case agg::pix_format_abgr32: - case agg::pix_format_bgra32: - - bitmapFormat = B_RGBA32; - break; - } - return bitmapFormat; -} - - -// #pragma mark - - - -class AGGView : public BView { - public: - AGGView(BRect frame, agg::platform_support* agg, - agg::pix_format_e format, bool flipY); - virtual ~AGGView(); - - virtual void AttachedToWindow(); - virtual void DetachedFromWindow(); - - virtual void MessageReceived(BMessage* message); - virtual void Draw(BRect updateRect); - virtual void FrameResized(float width, float height); - - virtual void KeyDown(const char* bytes, int32 numBytes); - - virtual void MouseDown(BPoint where); - virtual void MouseMoved(BPoint where, uint32 transit, - const BMessage* dragMesage); - virtual void MouseUp(BPoint where); - - BBitmap* Bitmap() const; - - uint8 LastKeyDown() const; - uint32 MouseButtons(); - - void Update(); - void ForceRedraw(); - - unsigned GetKeyFlags(); - - private: - BBitmap* fBitmap; - agg::pix_format_e fFormat; - bool fFlipY; - - agg::platform_support* fAGG; - - uint32 fMouseButtons; - int32 fMouseX; - int32 fMouseY; - - uint8 fLastKeyDown; - - bool fRedraw; - - BMessageRunner* fPulse; - bigtime_t fLastPulse; - bool fEnableTicks; -}; - -AGGView::AGGView(BRect frame, - agg::platform_support* agg, - agg::pix_format_e format, - bool flipY) - : BView(frame, "AGG View", B_FOLLOW_ALL, - B_FRAME_EVENTS | B_WILL_DRAW), - fFormat(format), - fFlipY(flipY), - - fAGG(agg), - - fMouseButtons(0), - fMouseX(-1), - fMouseY(-1), - - fLastKeyDown(0), - - fRedraw(true), - - fPulse(NULL), - fLastPulse(0), - fEnableTicks(true) -{ - SetViewColor(B_TRANSPARENT_32_BIT); - - frame.OffsetTo(0.0, 0.0); - fBitmap = new BBitmap(frame, 0, pix_format_to_color_space(fFormat)); - if (fBitmap->IsValid()) { - attach_buffer_to_BBitmap(fAGG->rbuf_window(), fBitmap, fFlipY); - } else { - delete fBitmap; - fBitmap = NULL; - } -} - - -AGGView::~AGGView() -{ - delete fBitmap; - delete fPulse; -} - - -void -AGGView::AttachedToWindow() -{ - BMessage message('tick'); - BMessenger target(this, Looper()); - delete fPulse; -// BScreen screen; -// TODO: calc screen retrace - fPulse = new BMessageRunner(target, &message, 40000); - - // make sure we call this once - fAGG->on_resize(Bounds().IntegerWidth() + 1, - Bounds().IntegerHeight() + 1); - MakeFocus(); -} - - -void -AGGView::DetachedFromWindow() -{ - delete fPulse; - fPulse = NULL; -} - - -void -AGGView::MessageReceived(BMessage* message) -{ - bigtime_t now = system_time(); - switch (message->what) { - case 'tick': - // drop messages that have piled up - if (/*now - fLastPulse > 30000*/fEnableTicks) { - fLastPulse = now; - if (!fAGG->wait_mode()) - fAGG->on_idle(); - Window()->PostMessage('entk', this); - fEnableTicks = false; - } else { -// printf("dropping tick message (%lld)\n", now - fLastPulse); - } - break; - case 'entk': - fEnableTicks = true; - if (now - fLastPulse > 30000) { - fLastPulse = now; - if (!fAGG->wait_mode()) - fAGG->on_idle(); - } - break; - default: - BView::MessageReceived(message); - break; - } -} - - -void -AGGView::Draw(BRect updateRect) -{ - if (fBitmap) { - if (fRedraw) { - fAGG->on_draw(); - fRedraw = false; - } - if (fFormat == agg::pix_format_bgra32) { - DrawBitmap(fBitmap, updateRect, updateRect); - } else { - BBitmap* bitmap = new BBitmap(fBitmap->Bounds(), 0, B_RGBA32); - - agg::rendering_buffer rbufSrc; - attach_buffer_to_BBitmap(rbufSrc, fBitmap, false); - - agg::rendering_buffer rbufDst; - attach_buffer_to_BBitmap(rbufDst, bitmap, false); - - switch(fFormat) { - case agg::pix_format_rgb555: - agg::color_conv(&rbufDst, &rbufSrc, - agg::color_conv_rgb555_to_bgra32()); - break; - case agg::pix_format_rgb565: - agg::color_conv(&rbufDst, &rbufSrc, - agg::color_conv_rgb565_to_bgra32()); - break; - case agg::pix_format_rgb24: - agg::color_conv(&rbufDst, &rbufSrc, - agg::color_conv_rgb24_to_bgra32()); - break; - case agg::pix_format_bgr24: - agg::color_conv(&rbufDst, &rbufSrc, - agg::color_conv_bgr24_to_bgra32()); - break; - case agg::pix_format_rgba32: - agg::color_conv(&rbufDst, &rbufSrc, - agg::color_conv_rgba32_to_bgra32()); - break; - case agg::pix_format_argb32: - agg::color_conv(&rbufDst, &rbufSrc, - agg::color_conv_argb32_to_bgra32()); - break; - case agg::pix_format_abgr32: - agg::color_conv(&rbufDst, &rbufSrc, - agg::color_conv_abgr32_to_bgra32()); - break; - case agg::pix_format_bgra32: - agg::color_conv(&rbufDst, &rbufSrc, - agg::color_conv_bgra32_to_bgra32()); - break; - } - DrawBitmap(bitmap, updateRect, updateRect); - delete bitmap; - } - } else { - FillRect(updateRect); - } -} - - -void -AGGView::FrameResized(float width, float height) -{ - BRect r(0.0, 0.0, width, height); - BBitmap* bitmap = new BBitmap(r, 0, pix_format_to_color_space(fFormat)); - if (bitmap->IsValid()) { - delete fBitmap; - fBitmap = bitmap; - attach_buffer_to_BBitmap(fAGG->rbuf_window(), fBitmap, fFlipY); - - fAGG->trans_affine_resizing((int)width + 1, - (int)height + 1); - - // pass the event on to AGG - fAGG->on_resize((int)width + 1, (int)height + 1); - - fRedraw = true; - Invalidate(); - } else - delete bitmap; -} - - -void -AGGView::KeyDown(const char* bytes, int32 numBytes) -{ - if (bytes && numBytes > 0) { - fLastKeyDown = bytes[0]; - - bool left = false; - bool up = false; - bool right = false; - bool down = false; - - switch (fLastKeyDown) { - - case B_LEFT_ARROW: - left = true; - break; - - case B_UP_ARROW: - up = true; - break; - - case B_RIGHT_ARROW: - right = true; - break; - - case B_DOWN_ARROW: - down = true; - break; - } - -/* case key_f2: -fAGG->copy_window_to_img(agg::platform_support::max_images - 1); -fAGG->save_img(agg::platform_support::max_images - 1, "screenshot"); -break; -}*/ - - - if (fAGG->m_ctrls.on_arrow_keys(left, right, down, up)) { - fAGG->on_ctrl_change(); - fAGG->force_redraw(); - } else { - fAGG->on_key(fMouseX, fMouseY, fLastKeyDown, GetKeyFlags()); - } -// fAGG->on_key(fMouseX, fMouseY, fLastKeyDown, GetKeyFlags()); - - } -} - - -void -AGGView::MouseDown(BPoint where) -{ - BMessage* currentMessage = Window()->CurrentMessage(); - if (currentMessage) { - if (currentMessage->FindInt32("buttons", (int32*)&fMouseButtons) < B_OK) - fMouseButtons = B_PRIMARY_MOUSE_BUTTON; - } else - fMouseButtons = B_PRIMARY_MOUSE_BUTTON; - - fMouseX = (int)where.x; - fMouseY = fFlipY ? (int)(Bounds().Height() - where.y) : (int)where.y; - - // pass the event on to AGG - if (fMouseButtons == B_PRIMARY_MOUSE_BUTTON) { - // left mouse button -> see if to handle in controls - fAGG->m_ctrls.set_cur(fMouseX, fMouseY); - if (fAGG->m_ctrls.on_mouse_button_down(fMouseX, fMouseY)) { - fAGG->on_ctrl_change(); - fAGG->force_redraw(); - } else { - if (fAGG->m_ctrls.in_rect(fMouseX, fMouseY)) { - if (fAGG->m_ctrls.set_cur(fMouseX, fMouseY)) { - fAGG->on_ctrl_change(); - fAGG->force_redraw(); - } - } else { - fAGG->on_mouse_button_down(fMouseX, fMouseY, GetKeyFlags()); - } - } - } else if (fMouseButtons & B_SECONDARY_MOUSE_BUTTON) { - // right mouse button -> simple - fAGG->on_mouse_button_down(fMouseX, fMouseY, GetKeyFlags()); - } - SetMouseEventMask(B_POINTER_EVENTS, B_LOCK_WINDOW_FOCUS); -} - - -void -AGGView::MouseMoved(BPoint where, uint32 transit, const BMessage* dragMesage) -{ - // workarround missed mouse up events - // (if we react too slowly, app_server might have dropped events) - BMessage* currentMessage = Window()->CurrentMessage(); - int32 buttons = 0; - if (currentMessage->FindInt32("buttons", &buttons) < B_OK) { - buttons = 0; - } - if (!buttons) - MouseUp(where); - - fMouseX = (int)where.x; - fMouseY = fFlipY ? (int)(Bounds().Height() - where.y) : (int)where.y; - - // pass the event on to AGG - if (fAGG->m_ctrls.on_mouse_move(fMouseX, fMouseY, - (GetKeyFlags() & agg::mouse_left) != 0)) { - fAGG->on_ctrl_change(); - fAGG->force_redraw(); - } else { - if (!fAGG->m_ctrls.in_rect(fMouseX, fMouseY)) { - fAGG->on_mouse_move(fMouseX, fMouseY, GetKeyFlags()); - } - } -} - - -void -AGGView::MouseUp(BPoint where) -{ - fMouseX = (int)where.x; - fMouseY = fFlipY ? (int)(Bounds().Height() - where.y) : (int)where.y; - - // pass the event on to AGG - if (fMouseButtons == B_PRIMARY_MOUSE_BUTTON) { - fMouseButtons = 0; - - if (fAGG->m_ctrls.on_mouse_button_up(fMouseX, fMouseY)) { - fAGG->on_ctrl_change(); - fAGG->force_redraw(); - } - fAGG->on_mouse_button_up(fMouseX, fMouseY, GetKeyFlags()); - } else if (fMouseButtons == B_SECONDARY_MOUSE_BUTTON) { - fMouseButtons = 0; - - fAGG->on_mouse_button_up(fMouseX, fMouseY, GetKeyFlags()); - } -} - - -BBitmap* -AGGView::Bitmap() const -{ - return fBitmap; -} - - -uint8 -AGGView::LastKeyDown() const -{ - return fLastKeyDown; -} - - -uint32 -AGGView::MouseButtons() -{ - uint32 buttons = 0; - if (LockLooper()) { - buttons = fMouseButtons; - UnlockLooper(); - } - return buttons; -} - - -void -AGGView::Update() -{ - // trigger display update - if (LockLooper()) { - Invalidate(); - UnlockLooper(); - } -} - - -void -AGGView::ForceRedraw() -{ - // force a redraw (fRedraw = true;) - // and trigger display update - if (LockLooper()) { - fRedraw = true; - Invalidate(); - UnlockLooper(); - } -} - - -unsigned -AGGView::GetKeyFlags() -{ - uint32 buttons = fMouseButtons; - uint32 mods = modifiers(); - unsigned flags = 0; - if (buttons & B_PRIMARY_MOUSE_BUTTON) flags |= agg::mouse_left; - if (buttons & B_SECONDARY_MOUSE_BUTTON) flags |= agg::mouse_right; - if (mods & B_SHIFT_KEY) flags |= agg::kbd_shift; - if (mods & B_COMMAND_KEY) flags |= agg::kbd_ctrl; - return flags; -} - -// #pragma mark - - - -class AGGWindow : public BWindow { - public: - AGGWindow() - : BWindow(BRect(-50.0, -50.0, -10.0, -10.0), - "AGG Application", B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS) - { - } - - virtual bool QuitRequested() - { - be_app->PostMessage(B_QUIT_REQUESTED); - return true; - } - - bool Init(BRect frame, agg::platform_support* agg, agg::pix_format_e format, - bool flipY, uint32 flags) - { - MoveTo(frame.LeftTop()); - ResizeTo(frame.Width(), frame.Height()); - - SetFlags(flags); - - frame.OffsetTo(0.0, 0.0); - fView = new AGGView(frame, agg, format, flipY); - AddChild(fView); - - return fView->Bitmap() != NULL; - } - - - AGGView* View() const - { - return fView; - } - private: - AGGView* fView; -}; - -// #pragma mark - - - -class AGGApplication : public BApplication { - public: - AGGApplication() - : BApplication("application/x-vnd.AGG-AGG") - { - fWindow = new AGGWindow(); - } - - virtual void ReadyToRun() - { - if (fWindow) { - fWindow->Show(); - } - } - - virtual bool Init(agg::platform_support* agg, int width, int height, - agg::pix_format_e format, bool flipY, uint32 flags) - { - BRect r(50.0, 50.0, - 50.0 + width - 1.0, - 50.0 + height - 1.0); - uint32 windowFlags = B_ASYNCHRONOUS_CONTROLS; - if (!(flags & agg::window_resize)) - windowFlags |= B_NOT_RESIZABLE; - - return fWindow->Init(r, agg, format, flipY, windowFlags);; - } - - - AGGWindow* Window() const - { - return fWindow; - } - - private: - AGGWindow* fWindow; -}; - - -// #pragma mark - - - -namespace agg -{ - -class platform_specific { - public: - platform_specific(agg::platform_support* agg, - agg::pix_format_e format, bool flip_y) - : fAGG(agg), - fApp(NULL), - fFormat(format), - fFlipY(flip_y), - fTimerStart(system_time()) - { - memset(fImages, 0, sizeof(fImages)); - fApp = new AGGApplication(); - fAppPath[0] = 0; - // figure out where we're running from - app_info info; - status_t ret = fApp->GetAppInfo(&info); - if (ret >= B_OK) { - BPath path(&info.ref); - ret = path.InitCheck(); - if (ret >= B_OK) { - ret = path.GetParent(&path); - if (ret >= B_OK) { - sprintf(fAppPath, "%s", path.Path()); - } else { - fprintf(stderr, "getting app parent folder failed: %s\n", strerror(ret)); - } - } else { - fprintf(stderr, "making app path failed: %s\n", strerror(ret)); - } - } else { - fprintf(stderr, "GetAppInfo() failed: %s\n", strerror(ret)); - } - } - ~platform_specific() - { - for (int32 i = 0; i < agg::platform_support::max_images; i++) - delete fImages[i]; - delete fApp; - } - - bool Init(int width, int height, unsigned flags) - { - return fApp->Init(fAGG, width, height, fFormat, fFlipY, flags); - } - - int Run() - { - status_t ret = B_NO_INIT; - if (fApp) { - fApp->Run(); - ret = B_OK; - } - return ret; - } - - void SetTitle(const char* title) - { - if (fApp && fApp->Window() && fApp->Window()->Lock()) { - fApp->Window()->SetTitle(title); - fApp->Window()->Unlock(); - } - } - void StartTimer() - { - fTimerStart = system_time(); - } - double ElapsedTime() const - { - return (system_time() - fTimerStart) / 1000.0; - } - - void ForceRedraw() - { - fApp->Window()->View()->ForceRedraw(); - } - void UpdateWindow() - { - fApp->Window()->View()->Update(); - } - - - agg::platform_support* fAGG; - AGGApplication* fApp; - agg::pix_format_e fFormat; - bool fFlipY; - bigtime_t fTimerStart; - BBitmap* fImages[agg::platform_support::max_images]; - - char fAppPath[B_PATH_NAME_LENGTH]; - char fFilePath[B_PATH_NAME_LENGTH]; -}; - - - //------------------------------------------------------------------------ - platform_support::platform_support(pix_format_e format, bool flip_y) : - m_specific(new platform_specific(this, format, flip_y)), - m_format(format), - m_bpp(32/*m_specific->m_bpp*/), - m_window_flags(0), - m_wait_mode(true), - m_flip_y(flip_y), - m_initial_width(10), - m_initial_height(10) - { - strcpy(m_caption, "Anti-Grain Geometry Application"); - } - - - //------------------------------------------------------------------------ - platform_support::~platform_support() - { - delete m_specific; - } - - //------------------------------------------------------------------------ - void platform_support::caption(const char* cap) - { - strcpy(m_caption, cap); - m_specific->SetTitle(cap); - } - - //------------------------------------------------------------------------ - void platform_support::start_timer() - { - m_specific->StartTimer(); - } - - //------------------------------------------------------------------------ - double platform_support::elapsed_time() const - { - return m_specific->ElapsedTime(); - } - - //------------------------------------------------------------------------ - void* platform_support::raw_display_handler() - { - // TODO: if we ever support BDirectWindow here, that would - // be the frame buffer pointer with offset to the window top left - return NULL; - } - - //------------------------------------------------------------------------ - void platform_support::message(const char* msg) - { - BAlert* alert = new BAlert("AGG Message", msg, "Ok"); - alert->Go(/*NULL*/); - } - - - //------------------------------------------------------------------------ - bool platform_support::init(unsigned width, unsigned height, unsigned flags) - { - m_initial_width = width; - m_initial_height = height; - m_window_flags = flags; - - if (m_specific->Init(width, height, flags)) { - on_init(); - return true; - } - - return false; - } - - - //------------------------------------------------------------------------ - int platform_support::run() - { - return m_specific->Run(); - } - - - //------------------------------------------------------------------------ - const char* platform_support::img_ext() const { return ".ppm"; } - - - const char* platform_support::full_file_name(const char* file_name) - { - sprintf(m_specific->fFilePath, "%s/%s", m_specific->fAppPath, file_name); - return m_specific->fFilePath; - } - - - //------------------------------------------------------------------------ - bool platform_support::load_img(unsigned idx, const char* file) - { - if (idx < max_images) - { - char path[B_PATH_NAME_LENGTH]; - sprintf(path, "%s/%s%s", m_specific->fAppPath, file, img_ext()); - BBitmap* transBitmap = BTranslationUtils::GetBitmap(path); - if (transBitmap && transBitmap->IsValid()) { - if(transBitmap->ColorSpace() != B_RGB32 && transBitmap->ColorSpace() != B_RGBA32) { - // ups we got a smart ass Translator making our live harder - delete transBitmap; - return false; - } - - color_space format = B_RGB24; - - switch (m_format) { - case pix_format_gray8: - format = B_GRAY8; - break; - case pix_format_rgb555: - format = B_RGB15; - break; - case pix_format_rgb565: - format = B_RGB16; - break; - case pix_format_rgb24: - format = B_RGB24_BIG; - break; - case pix_format_bgr24: - format = B_RGB24; - break; - case pix_format_abgr32: - case pix_format_argb32: - case pix_format_bgra32: - format = B_RGB32; - break; - case pix_format_rgba32: - format = B_RGB32_BIG; - break; - } - BBitmap* bitmap = new (nothrow) BBitmap(transBitmap->Bounds(), 0, format); - if (!bitmap || !bitmap->IsValid()) { - fprintf(stderr, "failed to allocate temporary bitmap!\n"); - delete transBitmap; - delete bitmap; - return false; - } - - delete m_specific->fImages[idx]; - - rendering_buffer rbuf_tmp; - attach_buffer_to_BBitmap(rbuf_tmp, transBitmap, m_flip_y); - - m_specific->fImages[idx] = bitmap; - - attach_buffer_to_BBitmap(m_rbuf_img[idx], bitmap, m_flip_y); - - rendering_buffer* dst = &m_rbuf_img[idx]; - - switch(m_format) - { - case pix_format_gray8: - return false; -// color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_gray8()); break; - break; - - case pix_format_rgb555: - color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgb555()); break; - break; - - case pix_format_rgb565: - color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgb565()); break; - break; - - case pix_format_rgb24: - color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgb24()); break; - break; - - case pix_format_bgr24: - color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_bgr24()); break; - break; - - case pix_format_abgr32: - color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_abgr32()); break; - break; - - case pix_format_argb32: - color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_argb32()); break; - break; - - case pix_format_bgra32: - color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_bgra32()); break; - break; - - case pix_format_rgba32: - color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgba32()); break; - break; - } - delete transBitmap; - - return true; - - } else { - fprintf(stderr, "failed to load bitmap: '%s'\n", full_file_name(file)); - } - } - return false; - } - - - - //------------------------------------------------------------------------ - bool platform_support::save_img(unsigned idx, const char* file) - { - // TODO: implement using BTranslatorRoster and friends - return false; - } - - - - //------------------------------------------------------------------------ - bool platform_support::create_img(unsigned idx, unsigned width, unsigned height) - { - if(idx < max_images) - { - if(width == 0) width = m_specific->fApp->Window()->View()->Bitmap()->Bounds().IntegerWidth() + 1; - if(height == 0) height = m_specific->fApp->Window()->View()->Bitmap()->Bounds().IntegerHeight() + 1; - BBitmap* bitmap = new BBitmap(BRect(0.0, 0.0, width - 1, height - 1), 0, B_RGBA32);; - if (bitmap && bitmap->IsValid()) { - delete m_specific->fImages[idx]; - m_specific->fImages[idx] = bitmap; - attach_buffer_to_BBitmap(m_rbuf_img[idx], bitmap, m_flip_y); - return true; - } else { - delete bitmap; - } - } - return false; - } - - - //------------------------------------------------------------------------ - void platform_support::force_redraw() - { - m_specific->ForceRedraw(); - } - - - - //------------------------------------------------------------------------ - void platform_support::update_window() - { - m_specific->UpdateWindow(); - } - - - //------------------------------------------------------------------------ - void platform_support::on_init() {} - void platform_support::on_resize(int sx, int sy) {} - void platform_support::on_idle() {} - void platform_support::on_mouse_move(int x, int y, unsigned flags) {} - void platform_support::on_mouse_button_down(int x, int y, unsigned flags) {} - void platform_support::on_mouse_button_up(int x, int y, unsigned flags) {} - void platform_support::on_key(int x, int y, unsigned key, unsigned flags) {} - void platform_support::on_ctrl_change() {} - void platform_support::on_draw() {} - void platform_support::on_post_draw(void* raw_handler) {} -} - - - - - - -//---------------------------------------------------------------------------- -int agg_main(int argc, char* argv[]); - - - -int -main(int argc, char* argv[]) -{ - return agg_main(argc, argv); -} - - -#endif - -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// class platform_support. SDL version. -// -//---------------------------------------------------------------------------- - -#ifdef USE_SDL - -#include -#include -#include "SDL.h" -#include "SDL_byteorder.h" - - -namespace agg -{ - - //------------------------------------------------------------------------ - class platform_specific - { - public: - platform_specific(pix_format_e format, bool flip_y); - ~platform_specific(); - - pix_format_e m_format; - pix_format_e m_sys_format; - bool m_flip_y; - unsigned m_bpp; - unsigned m_sys_bpp; - unsigned m_rmask; - unsigned m_gmask; - unsigned m_bmask; - unsigned m_amask; - bool m_update_flag; - bool m_resize_flag; - bool m_initialized; - SDL_Surface* m_surf_screen; - SDL_Surface* m_surf_window; - SDL_Surface* m_surf_img[platform_support::max_images]; - int m_cur_x; - int m_cur_y; - int m_sw_start; - }; - - - - //------------------------------------------------------------------------ - platform_specific::platform_specific(pix_format_e format, bool flip_y) : - m_format(format), - m_sys_format(pix_format_undefined), - m_flip_y(flip_y), - m_bpp(0), - m_sys_bpp(0), - m_update_flag(true), - m_resize_flag(true), - m_initialized(false), - m_surf_screen(0), - m_surf_window(0), - m_cur_x(0), - m_cur_y(0) - { - memset(m_surf_img, 0, sizeof(m_surf_img)); - - switch(m_format) - { - case pix_format_gray8: - m_bpp = 8; - break; - - case pix_format_rgb565: - m_rmask = 0xF800; - m_gmask = 0x7E0; - m_bmask = 0x1F; - m_amask = 0; - m_bpp = 16; - break; - - case pix_format_rgb555: - m_rmask = 0x7C00; - m_gmask = 0x3E0; - m_bmask = 0x1F; - m_amask = 0; - m_bpp = 16; - break; - -#if SDL_BYTEORDER == SDL_LIL_ENDIAN - case pix_format_rgb24: - m_rmask = 0xFF; - m_gmask = 0xFF00; - m_bmask = 0xFF0000; - m_amask = 0; - m_bpp = 24; - break; - - case pix_format_bgr24: - m_rmask = 0xFF0000; - m_gmask = 0xFF00; - m_bmask = 0xFF; - m_amask = 0; - m_bpp = 24; - break; - - case pix_format_bgra32: - m_rmask = 0xFF0000; - m_gmask = 0xFF00; - m_bmask = 0xFF; - m_amask = 0xFF000000; - m_bpp = 32; - break; - - case pix_format_abgr32: - m_rmask = 0xFF000000; - m_gmask = 0xFF0000; - m_bmask = 0xFF00; - m_amask = 0xFF; - m_bpp = 32; - break; - - case pix_format_argb32: - m_rmask = 0xFF00; - m_gmask = 0xFF0000; - m_bmask = 0xFF000000; - m_amask = 0xFF; - m_bpp = 32; - break; - - case pix_format_rgba32: - m_rmask = 0xFF; - m_gmask = 0xFF00; - m_bmask = 0xFF0000; - m_amask = 0xFF000000; - m_bpp = 32; - break; -#else //SDL_BIG_ENDIAN (PPC) - case pix_format_rgb24: - m_rmask = 0xFF0000; - m_gmask = 0xFF00; - m_bmask = 0xFF; - m_amask = 0; - m_bpp = 24; - break; - - case pix_format_bgr24: - m_rmask = 0xFF; - m_gmask = 0xFF00; - m_bmask = 0xFF0000; - m_amask = 0; - m_bpp = 24; - break; - - case pix_format_bgra32: - m_rmask = 0xFF00; - m_gmask = 0xFF0000; - m_bmask = 0xFF000000; - m_amask = 0xFF; - m_bpp = 32; - break; - - case pix_format_abgr32: - m_rmask = 0xFF; - m_gmask = 0xFF00; - m_bmask = 0xFF0000; - m_amask = 0xFF000000; - m_bpp = 32; - break; - - case pix_format_argb32: - m_rmask = 0xFF0000; - m_gmask = 0xFF00; - m_bmask = 0xFF; - m_amask = 0xFF000000; - m_bpp = 32; - break; - - case pix_format_rgba32: - m_rmask = 0xFF000000; - m_gmask = 0xFF0000; - m_bmask = 0xFF00; - m_amask = 0xFF; - m_bpp = 32; - break; -#endif - } - } - - //------------------------------------------------------------------------ - platform_specific::~platform_specific() - { - int i; - for(i = platform_support::max_images - 1; i >= 0; --i) - { - if(m_surf_img[i]) SDL_FreeSurface(m_surf_img[i]); - } - if(m_surf_window) SDL_FreeSurface(m_surf_window); - if(m_surf_screen) SDL_FreeSurface(m_surf_screen); - } - - - - //------------------------------------------------------------------------ - platform_support::platform_support(pix_format_e format, bool flip_y) : - m_specific(new platform_specific(format, flip_y)), - m_format(format), - m_bpp(m_specific->m_bpp), - m_window_flags(0), - m_wait_mode(true), - m_flip_y(flip_y) - { - SDL_Init(SDL_INIT_VIDEO); - strcpy(m_caption, "Anti-Grain Geometry Application"); - } - - - //------------------------------------------------------------------------ - platform_support::~platform_support() - { - delete m_specific; - } - - - - //------------------------------------------------------------------------ - void platform_support::caption(const char* cap) - { - strcpy(m_caption, cap); - if(m_specific->m_initialized) - { - SDL_WM_SetCaption(cap, 0); - } - } - - - - - - //------------------------------------------------------------------------ - bool platform_support::init(unsigned width, unsigned height, unsigned flags) - { - m_window_flags = flags; - unsigned wflags = SDL_SWSURFACE; - - if(m_window_flags & window_hw_buffer) - { - wflags = SDL_HWSURFACE; - } - - if(m_window_flags & window_resize) - { - wflags |= SDL_RESIZABLE; - } - - if(m_specific->m_surf_screen) SDL_FreeSurface(m_specific->m_surf_screen); - - m_specific->m_surf_screen = SDL_SetVideoMode(width, height, m_bpp, wflags); - if(m_specific->m_surf_screen == 0) - { - fprintf(stderr, - "Unable to set %dx%d %d bpp video: %s\n", - width, - height, - m_bpp, - ::SDL_GetError()); - return false; - } - - SDL_WM_SetCaption(m_caption, 0); - - if(m_specific->m_surf_window) SDL_FreeSurface(m_specific->m_surf_window); - - m_specific->m_surf_window = - SDL_CreateRGBSurface(SDL_HWSURFACE, - m_specific->m_surf_screen->w, - m_specific->m_surf_screen->h, - m_specific->m_surf_screen->format->BitsPerPixel, - m_specific->m_rmask, - m_specific->m_gmask, - m_specific->m_bmask, - m_specific->m_amask); - - if(m_specific->m_surf_window == 0) - { - fprintf(stderr, - "Unable to create image buffer %dx%d %d bpp: %s\n", - width, - height, - m_bpp, - SDL_GetError()); - return false; - } - - m_rbuf_window.attach((unsigned char*)m_specific->m_surf_window->pixels, - m_specific->m_surf_window->w, - m_specific->m_surf_window->h, - m_flip_y ? -m_specific->m_surf_window->pitch : - m_specific->m_surf_window->pitch); - - if(!m_specific->m_initialized) - { - m_initial_width = width; - m_initial_height = height; - on_init(); - m_specific->m_initialized = true; - } - on_resize(m_rbuf_window.width(), m_rbuf_window.height()); - m_specific->m_update_flag = true; - return true; - } - - - - //------------------------------------------------------------------------ - void platform_support::update_window() - { - SDL_BlitSurface(m_specific->m_surf_window, 0, m_specific->m_surf_screen, 0); - SDL_UpdateRect(m_specific->m_surf_screen, 0, 0, 0, 0); - } - - - //------------------------------------------------------------------------ - int platform_support::run() - { - SDL_Event event; - bool ev_flag = false; - - for(;;) - { - if(m_specific->m_update_flag) - { - on_draw(); - update_window(); - m_specific->m_update_flag = false; - } - - ev_flag = false; - if(m_wait_mode) - { - SDL_WaitEvent(&event); - ev_flag = true; - } - else - { - if(SDL_PollEvent(&event)) - { - ev_flag = true; - } - else - { - on_idle(); - } - } - - if(ev_flag) - { - if(event.type == SDL_QUIT) - { - break; - } - - int y; - unsigned flags = 0; - - switch (event.type) - { - case SDL_VIDEORESIZE: - if(!init(event.resize.w, event.resize.h, m_window_flags)) return false; - on_resize(m_rbuf_window.width(), m_rbuf_window.height()); - trans_affine_resizing(event.resize.w, event.resize.h); - m_specific->m_update_flag = true; - break; - - case SDL_KEYDOWN: - { - flags = 0; - if(event.key.keysym.mod & KMOD_SHIFT) flags |= kbd_shift; - if(event.key.keysym.mod & KMOD_CTRL) flags |= kbd_ctrl; - - bool left = false; - bool up = false; - bool right = false; - bool down = false; - - switch(event.key.keysym.sym) - { - case key_left: - left = true; - break; - - case key_up: - up = true; - break; - - case key_right: - right = true; - break; - - case key_down: - down = true; - break; - } - - if(m_ctrls.on_arrow_keys(left, right, down, up)) - { - on_ctrl_change(); - force_redraw(); - } - else - { - on_key(m_specific->m_cur_x, - m_specific->m_cur_y, - event.key.keysym.sym, - flags); - } - } - break; - - case SDL_MOUSEMOTION: - y = m_flip_y ? - m_rbuf_window.height() - event.motion.y : - event.motion.y; - - m_specific->m_cur_x = event.motion.x; - m_specific->m_cur_y = y; - flags = 0; - if(event.motion.state & SDL_BUTTON_LMASK) flags |= mouse_left; - if(event.motion.state & SDL_BUTTON_RMASK) flags |= mouse_right; - - if(m_ctrls.on_mouse_move(m_specific->m_cur_x, - m_specific->m_cur_y, - (flags & mouse_left) != 0)) - { - on_ctrl_change(); - force_redraw(); - } - else - { - on_mouse_move(m_specific->m_cur_x, - m_specific->m_cur_y, - flags); - } - SDL_Event eventtrash; - while (SDL_PeepEvents(&eventtrash, 1, SDL_GETEVENT, SDL_EVENTMASK(SDL_MOUSEMOTION))!=0){;} - break; - - case SDL_MOUSEBUTTONDOWN: - y = m_flip_y - ? m_rbuf_window.height() - event.button.y - : event.button.y; - - m_specific->m_cur_x = event.button.x; - m_specific->m_cur_y = y; - flags = 0; - switch(event.button.button) - { - case SDL_BUTTON_LEFT: - { - flags = mouse_left; - -if(m_ctrls.on_mouse_button_down(m_specific->m_cur_x, - m_specific->m_cur_y)) - { - m_ctrls.set_cur(m_specific->m_cur_x, - m_specific->m_cur_y); - on_ctrl_change(); - force_redraw(); - } - else - { - if(m_ctrls.in_rect(m_specific->m_cur_x, - m_specific->m_cur_y)) - { - if(m_ctrls.set_cur(m_specific->m_cur_x, - m_specific->m_cur_y)) - { - on_ctrl_change(); - force_redraw(); - } - } - else - { - on_mouse_button_down(m_specific->m_cur_x, - m_specific->m_cur_y, - flags); - } - } - } - break; - case SDL_BUTTON_RIGHT: - flags = mouse_right; - on_mouse_button_down(m_specific->m_cur_x, - m_specific->m_cur_y, - flags); - break; - } //switch(event.button.button) - break; - - case SDL_MOUSEBUTTONUP: - y = m_flip_y - ? m_rbuf_window.height() - event.button.y - : event.button.y; - - m_specific->m_cur_x = event.button.x; - m_specific->m_cur_y = y; - flags = 0; - if(m_ctrls.on_mouse_button_up(m_specific->m_cur_x, - m_specific->m_cur_y)) - { - on_ctrl_change(); - force_redraw(); - } - on_mouse_button_up(m_specific->m_cur_x, - m_specific->m_cur_y, - flags); - break; - } - } - } - return 0; - } - - - - //------------------------------------------------------------------------ - const char* platform_support::img_ext() const { return ".bmp"; } - - //------------------------------------------------------------------------ - const char* platform_support::full_file_name(const char* file_name) - { - return file_name; - } - - //------------------------------------------------------------------------ - bool platform_support::load_img(unsigned idx, const char* file) - { - if(idx < max_images) - { - if(m_specific->m_surf_img[idx]) SDL_FreeSurface(m_specific->m_surf_img[idx]); - - char fn[1024]; - strcpy(fn, file); - int len = strlen(fn); - if(len < 4 || strcmp(fn + len - 4, ".bmp") != 0) - { - strcat(fn, ".bmp"); - } - - SDL_Surface* tmp_surf = SDL_LoadBMP(fn); - if (tmp_surf == 0) - { - fprintf(stderr, "Couldn't load %s: %s\n", fn, SDL_GetError()); - return false; - } - - SDL_PixelFormat format; - format.palette = 0; - format.BitsPerPixel = m_bpp; - format.BytesPerPixel = m_bpp >> 8; - format.Rmask = m_specific->m_rmask; - format.Gmask = m_specific->m_gmask; - format.Bmask = m_specific->m_bmask; - format.Amask = m_specific->m_amask; - format.Rshift = 0; - format.Gshift = 0; - format.Bshift = 0; - format.Ashift = 0; - format.Rloss = 0; - format.Gloss = 0; - format.Bloss = 0; - format.Aloss = 0; - format.colorkey = 0; - format.alpha = 0; - - m_specific->m_surf_img[idx] = - SDL_ConvertSurface(tmp_surf, - &format, - SDL_SWSURFACE); - - SDL_FreeSurface(tmp_surf); - - if(m_specific->m_surf_img[idx] == 0) return false; - - m_rbuf_img[idx].attach((unsigned char*)m_specific->m_surf_img[idx]->pixels, - m_specific->m_surf_img[idx]->w, - m_specific->m_surf_img[idx]->h, - m_flip_y ? -m_specific->m_surf_img[idx]->pitch : - m_specific->m_surf_img[idx]->pitch); - return true; - - } - return false; - } - - - - - //------------------------------------------------------------------------ - bool platform_support::save_img(unsigned idx, const char* file) - { - if(idx < max_images && m_specific->m_surf_img[idx]) - { - char fn[1024]; - strcpy(fn, file); - int len = strlen(fn); - if(len < 4 || strcmp(fn + len - 4, ".bmp") != 0) - { - strcat(fn, ".bmp"); - } - return SDL_SaveBMP(m_specific->m_surf_img[idx], fn) == 0; - } - return false; - } - - - - //------------------------------------------------------------------------ - bool platform_support::create_img(unsigned idx, unsigned width, unsigned height) - { - if(idx < max_images) - { - - if(m_specific->m_surf_img[idx]) SDL_FreeSurface(m_specific->m_surf_img[idx]); - - m_specific->m_surf_img[idx] = - SDL_CreateRGBSurface(SDL_SWSURFACE, - width, - height, - m_specific->m_surf_screen->format->BitsPerPixel, - m_specific->m_rmask, - m_specific->m_gmask, - m_specific->m_bmask, - m_specific->m_amask); - if(m_specific->m_surf_img[idx] == 0) - { - fprintf(stderr, "Couldn't create image: %s\n", SDL_GetError()); - return false; - } - - m_rbuf_img[idx].attach((unsigned char*)m_specific->m_surf_img[idx]->pixels, - m_specific->m_surf_img[idx]->w, - m_specific->m_surf_img[idx]->h, - m_flip_y ? -m_specific->m_surf_img[idx]->pitch : - m_specific->m_surf_img[idx]->pitch); - - return true; - } - - return false; - } - - //------------------------------------------------------------------------ - void platform_support::start_timer() - { - m_specific->m_sw_start = SDL_GetTicks(); - } - - //------------------------------------------------------------------------ - double platform_support::elapsed_time() const - { - int stop = SDL_GetTicks(); - return double(stop - m_specific->m_sw_start); - } - - //------------------------------------------------------------------------ - void platform_support::message(const char* msg) - { - fprintf(stderr, "%s\n", msg); - } - - //------------------------------------------------------------------------ - void platform_support::force_redraw() - { - m_specific->m_update_flag = true; - } - - - //------------------------------------------------------------------------ - void platform_support::on_init() {} - void platform_support::on_resize(int sx, int sy) {} - void platform_support::on_idle() {} - void platform_support::on_mouse_move(int x, int y, unsigned flags) {} - void platform_support::on_mouse_button_down(int x, int y, unsigned flags) {} - void platform_support::on_mouse_button_up(int x, int y, unsigned flags) {} - void platform_support::on_key(int x, int y, unsigned key, unsigned flags) {} - void platform_support::on_ctrl_change() {} - void platform_support::on_draw() {} - void platform_support::on_post_draw(void* raw_handler) {} - - -} - - -int agg_main(int argc, char* argv[]); - -int main(int argc, char* argv[]) -{ - return agg_main(argc, argv); -} - -#endif - - - -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: superstippi@gmx.de -//---------------------------------------------------------------------------- -// -// class platform_support -// -//---------------------------------------------------------------------------- - -#ifdef PLATFORM_BEOS - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -using std::nothrow; - - -static void -attach_buffer_to_BBitmap(agg::rendering_buffer& buffer, BBitmap* bitmap, bool flipY) -{ - uint8* bits = (uint8*)bitmap->Bits(); - uint32 width = bitmap->Bounds().IntegerWidth() + 1; - uint32 height = bitmap->Bounds().IntegerHeight() + 1; - int32 bpr = bitmap->BytesPerRow(); - if (flipY) { -// XXX: why don't I have to do this?!? -// bits += bpr * (height - 1); - bpr = -bpr; - } - buffer.attach(bits, width, height, bpr); -} - - -static color_space -pix_format_to_color_space(agg::pix_format_e format) -{ - color_space bitmapFormat = B_NO_COLOR_SPACE; - switch (format) { - case agg::pix_format_rgb555: - - bitmapFormat = B_RGB15; - break; - - case agg::pix_format_rgb565: - - bitmapFormat = B_RGB16; - break; - - case agg::pix_format_rgb24: - case agg::pix_format_bgr24: - - bitmapFormat = B_RGB24; - break; - - case agg::pix_format_rgba32: - case agg::pix_format_argb32: - case agg::pix_format_abgr32: - case agg::pix_format_bgra32: - - bitmapFormat = B_RGBA32; - break; - } - return bitmapFormat; -} - - -// #pragma mark - - - -class AGGView : public BView { - public: - AGGView(BRect frame, agg::platform_support* agg, - agg::pix_format_e format, bool flipY); - virtual ~AGGView(); - - virtual void AttachedToWindow(); - virtual void DetachedFromWindow(); - - virtual void MessageReceived(BMessage* message); - virtual void Draw(BRect updateRect); - virtual void FrameResized(float width, float height); - - virtual void KeyDown(const char* bytes, int32 numBytes); - - virtual void MouseDown(BPoint where); - virtual void MouseMoved(BPoint where, uint32 transit, - const BMessage* dragMesage); - virtual void MouseUp(BPoint where); - - BBitmap* Bitmap() const; - - uint8 LastKeyDown() const; - uint32 MouseButtons(); - - void Update(); - void ForceRedraw(); - - unsigned GetKeyFlags(); - - private: - BBitmap* fBitmap; - agg::pix_format_e fFormat; - bool fFlipY; - - agg::platform_support* fAGG; - - uint32 fMouseButtons; - int32 fMouseX; - int32 fMouseY; - - uint8 fLastKeyDown; - - bool fRedraw; - - BMessageRunner* fPulse; - bigtime_t fLastPulse; - bool fEnableTicks; -}; - -AGGView::AGGView(BRect frame, - agg::platform_support* agg, - agg::pix_format_e format, - bool flipY) - : BView(frame, "AGG View", B_FOLLOW_ALL, - B_FRAME_EVENTS | B_WILL_DRAW), - fFormat(format), - fFlipY(flipY), - - fAGG(agg), - - fMouseButtons(0), - fMouseX(-1), - fMouseY(-1), - - fLastKeyDown(0), - - fRedraw(true), - - fPulse(NULL), - fLastPulse(0), - fEnableTicks(true) -{ - SetViewColor(B_TRANSPARENT_32_BIT); - - frame.OffsetTo(0.0, 0.0); - fBitmap = new BBitmap(frame, 0, pix_format_to_color_space(fFormat)); - if (fBitmap->IsValid()) { - attach_buffer_to_BBitmap(fAGG->rbuf_window(), fBitmap, fFlipY); - } else { - delete fBitmap; - fBitmap = NULL; - } -} - - -AGGView::~AGGView() -{ - delete fBitmap; - delete fPulse; -} - - -void -AGGView::AttachedToWindow() -{ - BMessage message('tick'); - BMessenger target(this, Looper()); - delete fPulse; -// BScreen screen; -// TODO: calc screen retrace - fPulse = new BMessageRunner(target, &message, 40000); - - // make sure we call this once - fAGG->on_resize(Bounds().IntegerWidth() + 1, - Bounds().IntegerHeight() + 1); - MakeFocus(); -} - - -void -AGGView::DetachedFromWindow() -{ - delete fPulse; - fPulse = NULL; -} - - -void -AGGView::MessageReceived(BMessage* message) -{ - bigtime_t now = system_time(); - switch (message->what) { - case 'tick': - // drop messages that have piled up - if (/*now - fLastPulse > 30000*/fEnableTicks) { - fLastPulse = now; - if (!fAGG->wait_mode()) - fAGG->on_idle(); - Window()->PostMessage('entk', this); - fEnableTicks = false; - } else { -// printf("dropping tick message (%lld)\n", now - fLastPulse); - } - break; - case 'entk': - fEnableTicks = true; - if (now - fLastPulse > 30000) { - fLastPulse = now; - if (!fAGG->wait_mode()) - fAGG->on_idle(); - } - break; - default: - BView::MessageReceived(message); - break; - } -} - - -void -AGGView::Draw(BRect updateRect) -{ - if (fBitmap) { - if (fRedraw) { - fAGG->on_draw(); - fRedraw = false; - } - if (fFormat == agg::pix_format_bgra32) { - DrawBitmap(fBitmap, updateRect, updateRect); - } else { - BBitmap* bitmap = new BBitmap(fBitmap->Bounds(), 0, B_RGBA32); - - agg::rendering_buffer rbufSrc; - attach_buffer_to_BBitmap(rbufSrc, fBitmap, false); - - agg::rendering_buffer rbufDst; - attach_buffer_to_BBitmap(rbufDst, bitmap, false); - - switch(fFormat) { - case agg::pix_format_rgb555: - agg::color_conv(&rbufDst, &rbufSrc, - agg::color_conv_rgb555_to_bgra32()); - break; - case agg::pix_format_rgb565: - agg::color_conv(&rbufDst, &rbufSrc, - agg::color_conv_rgb565_to_bgra32()); - break; - case agg::pix_format_rgb24: - agg::color_conv(&rbufDst, &rbufSrc, - agg::color_conv_rgb24_to_bgra32()); - break; - case agg::pix_format_bgr24: - agg::color_conv(&rbufDst, &rbufSrc, - agg::color_conv_bgr24_to_bgra32()); - break; - case agg::pix_format_rgba32: - agg::color_conv(&rbufDst, &rbufSrc, - agg::color_conv_rgba32_to_bgra32()); - break; - case agg::pix_format_argb32: - agg::color_conv(&rbufDst, &rbufSrc, - agg::color_conv_argb32_to_bgra32()); - break; - case agg::pix_format_abgr32: - agg::color_conv(&rbufDst, &rbufSrc, - agg::color_conv_abgr32_to_bgra32()); - break; - case agg::pix_format_bgra32: - agg::color_conv(&rbufDst, &rbufSrc, - agg::color_conv_bgra32_to_bgra32()); - break; - } - DrawBitmap(bitmap, updateRect, updateRect); - delete bitmap; - } - } else { - FillRect(updateRect); - } -} - - -void -AGGView::FrameResized(float width, float height) -{ - BRect r(0.0, 0.0, width, height); - BBitmap* bitmap = new BBitmap(r, 0, pix_format_to_color_space(fFormat)); - if (bitmap->IsValid()) { - delete fBitmap; - fBitmap = bitmap; - attach_buffer_to_BBitmap(fAGG->rbuf_window(), fBitmap, fFlipY); - - fAGG->trans_affine_resizing((int)width + 1, - (int)height + 1); - - // pass the event on to AGG - fAGG->on_resize((int)width + 1, (int)height + 1); - - fRedraw = true; - Invalidate(); - } else - delete bitmap; -} - - -void -AGGView::KeyDown(const char* bytes, int32 numBytes) -{ - if (bytes && numBytes > 0) { - fLastKeyDown = bytes[0]; - - bool left = false; - bool up = false; - bool right = false; - bool down = false; - - switch (fLastKeyDown) { - - case B_LEFT_ARROW: - left = true; - break; - - case B_UP_ARROW: - up = true; - break; - - case B_RIGHT_ARROW: - right = true; - break; - - case B_DOWN_ARROW: - down = true; - break; - } - -/* case key_f2: -fAGG->copy_window_to_img(agg::platform_support::max_images - 1); -fAGG->save_img(agg::platform_support::max_images - 1, "screenshot"); -break; -}*/ - - - if (fAGG->m_ctrls.on_arrow_keys(left, right, down, up)) { - fAGG->on_ctrl_change(); - fAGG->force_redraw(); - } else { - fAGG->on_key(fMouseX, fMouseY, fLastKeyDown, GetKeyFlags()); - } -// fAGG->on_key(fMouseX, fMouseY, fLastKeyDown, GetKeyFlags()); - - } -} - - -void -AGGView::MouseDown(BPoint where) -{ - BMessage* currentMessage = Window()->CurrentMessage(); - if (currentMessage) { - if (currentMessage->FindInt32("buttons", (int32*)&fMouseButtons) < B_OK) - fMouseButtons = B_PRIMARY_MOUSE_BUTTON; - } else - fMouseButtons = B_PRIMARY_MOUSE_BUTTON; - - fMouseX = (int)where.x; - fMouseY = fFlipY ? (int)(Bounds().Height() - where.y) : (int)where.y; - - // pass the event on to AGG - if (fMouseButtons == B_PRIMARY_MOUSE_BUTTON) { - // left mouse button -> see if to handle in controls - fAGG->m_ctrls.set_cur(fMouseX, fMouseY); - if (fAGG->m_ctrls.on_mouse_button_down(fMouseX, fMouseY)) { - fAGG->on_ctrl_change(); - fAGG->force_redraw(); - } else { - if (fAGG->m_ctrls.in_rect(fMouseX, fMouseY)) { - if (fAGG->m_ctrls.set_cur(fMouseX, fMouseY)) { - fAGG->on_ctrl_change(); - fAGG->force_redraw(); - } - } else { - fAGG->on_mouse_button_down(fMouseX, fMouseY, GetKeyFlags()); - } - } - } else if (fMouseButtons & B_SECONDARY_MOUSE_BUTTON) { - // right mouse button -> simple - fAGG->on_mouse_button_down(fMouseX, fMouseY, GetKeyFlags()); - } - SetMouseEventMask(B_POINTER_EVENTS, B_LOCK_WINDOW_FOCUS); -} - - -void -AGGView::MouseMoved(BPoint where, uint32 transit, const BMessage* dragMesage) -{ - // workarround missed mouse up events - // (if we react too slowly, app_server might have dropped events) - BMessage* currentMessage = Window()->CurrentMessage(); - int32 buttons = 0; - if (currentMessage->FindInt32("buttons", &buttons) < B_OK) { - buttons = 0; - } - if (!buttons) - MouseUp(where); - - fMouseX = (int)where.x; - fMouseY = fFlipY ? (int)(Bounds().Height() - where.y) : (int)where.y; - - // pass the event on to AGG - if (fAGG->m_ctrls.on_mouse_move(fMouseX, fMouseY, - (GetKeyFlags() & agg::mouse_left) != 0)) { - fAGG->on_ctrl_change(); - fAGG->force_redraw(); - } else { - if (!fAGG->m_ctrls.in_rect(fMouseX, fMouseY)) { - fAGG->on_mouse_move(fMouseX, fMouseY, GetKeyFlags()); - } - } -} - - -void -AGGView::MouseUp(BPoint where) -{ - fMouseX = (int)where.x; - fMouseY = fFlipY ? (int)(Bounds().Height() - where.y) : (int)where.y; - - // pass the event on to AGG - if (fMouseButtons == B_PRIMARY_MOUSE_BUTTON) { - fMouseButtons = 0; - - if (fAGG->m_ctrls.on_mouse_button_up(fMouseX, fMouseY)) { - fAGG->on_ctrl_change(); - fAGG->force_redraw(); - } - fAGG->on_mouse_button_up(fMouseX, fMouseY, GetKeyFlags()); - } else if (fMouseButtons == B_SECONDARY_MOUSE_BUTTON) { - fMouseButtons = 0; - - fAGG->on_mouse_button_up(fMouseX, fMouseY, GetKeyFlags()); - } -} - - -BBitmap* -AGGView::Bitmap() const -{ - return fBitmap; -} - - -uint8 -AGGView::LastKeyDown() const -{ - return fLastKeyDown; -} - - -uint32 -AGGView::MouseButtons() -{ - uint32 buttons = 0; - if (LockLooper()) { - buttons = fMouseButtons; - UnlockLooper(); - } - return buttons; -} - - -void -AGGView::Update() -{ - // trigger display update - if (LockLooper()) { - Invalidate(); - UnlockLooper(); - } -} - - -void -AGGView::ForceRedraw() -{ - // force a redraw (fRedraw = true;) - // and trigger display update - if (LockLooper()) { - fRedraw = true; - Invalidate(); - UnlockLooper(); - } -} - - -unsigned -AGGView::GetKeyFlags() -{ - uint32 buttons = fMouseButtons; - uint32 mods = modifiers(); - unsigned flags = 0; - if (buttons & B_PRIMARY_MOUSE_BUTTON) flags |= agg::mouse_left; - if (buttons & B_SECONDARY_MOUSE_BUTTON) flags |= agg::mouse_right; - if (mods & B_SHIFT_KEY) flags |= agg::kbd_shift; - if (mods & B_COMMAND_KEY) flags |= agg::kbd_ctrl; - return flags; -} - -// #pragma mark - - - -class AGGWindow : public BWindow { - public: - AGGWindow() - : BWindow(BRect(-50.0, -50.0, -10.0, -10.0), - "AGG Application", B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS) - { - } - - virtual bool QuitRequested() - { - be_app->PostMessage(B_QUIT_REQUESTED); - return true; - } - - bool Init(BRect frame, agg::platform_support* agg, agg::pix_format_e format, - bool flipY, uint32 flags) - { - MoveTo(frame.LeftTop()); - ResizeTo(frame.Width(), frame.Height()); - - SetFlags(flags); - - frame.OffsetTo(0.0, 0.0); - fView = new AGGView(frame, agg, format, flipY); - AddChild(fView); - - return fView->Bitmap() != NULL; - } - - - AGGView* View() const - { - return fView; - } - private: - AGGView* fView; -}; - -// #pragma mark - - - -class AGGApplication : public BApplication { - public: - AGGApplication() - : BApplication("application/x-vnd.AGG-AGG") - { - fWindow = new AGGWindow(); - } - - virtual void ReadyToRun() - { - if (fWindow) { - fWindow->Show(); - } - } - - virtual bool Init(agg::platform_support* agg, int width, int height, - agg::pix_format_e format, bool flipY, uint32 flags) - { - BRect r(50.0, 50.0, - 50.0 + width - 1.0, - 50.0 + height - 1.0); - uint32 windowFlags = B_ASYNCHRONOUS_CONTROLS; - if (!(flags & agg::window_resize)) - windowFlags |= B_NOT_RESIZABLE; - - return fWindow->Init(r, agg, format, flipY, windowFlags);; - } - - - AGGWindow* Window() const - { - return fWindow; - } - - private: - AGGWindow* fWindow; -}; - - -// #pragma mark - - - -namespace agg -{ - -class platform_specific { - public: - platform_specific(agg::platform_support* agg, - agg::pix_format_e format, bool flip_y) - : fAGG(agg), - fApp(NULL), - fFormat(format), - fFlipY(flip_y), - fTimerStart(system_time()) - { - memset(fImages, 0, sizeof(fImages)); - fApp = new AGGApplication(); - fAppPath[0] = 0; - // figure out where we're running from - app_info info; - status_t ret = fApp->GetAppInfo(&info); - if (ret >= B_OK) { - BPath path(&info.ref); - ret = path.InitCheck(); - if (ret >= B_OK) { - ret = path.GetParent(&path); - if (ret >= B_OK) { - sprintf(fAppPath, "%s", path.Path()); - } else { - fprintf(stderr, "getting app parent folder failed: %s\n", strerror(ret)); - } - } else { - fprintf(stderr, "making app path failed: %s\n", strerror(ret)); - } - } else { - fprintf(stderr, "GetAppInfo() failed: %s\n", strerror(ret)); - } - } - ~platform_specific() - { - for (int32 i = 0; i < agg::platform_support::max_images; i++) - delete fImages[i]; - delete fApp; - } - - bool Init(int width, int height, unsigned flags) - { - return fApp->Init(fAGG, width, height, fFormat, fFlipY, flags); - } - - int Run() - { - status_t ret = B_NO_INIT; - if (fApp) { - fApp->Run(); - ret = B_OK; - } - return ret; - } - - void SetTitle(const char* title) - { - if (fApp && fApp->Window() && fApp->Window()->Lock()) { - fApp->Window()->SetTitle(title); - fApp->Window()->Unlock(); - } - } - void StartTimer() - { - fTimerStart = system_time(); - } - double ElapsedTime() const - { - return (system_time() - fTimerStart) / 1000.0; - } - - void ForceRedraw() - { - fApp->Window()->View()->ForceRedraw(); - } - void UpdateWindow() - { - fApp->Window()->View()->Update(); - } - - - agg::platform_support* fAGG; - AGGApplication* fApp; - agg::pix_format_e fFormat; - bool fFlipY; - bigtime_t fTimerStart; - BBitmap* fImages[agg::platform_support::max_images]; - - char fAppPath[B_PATH_NAME_LENGTH]; - char fFilePath[B_PATH_NAME_LENGTH]; -}; - - - //------------------------------------------------------------------------ - platform_support::platform_support(pix_format_e format, bool flip_y) : - m_specific(new platform_specific(this, format, flip_y)), - m_format(format), - m_bpp(32/*m_specific->m_bpp*/), - m_window_flags(0), - m_wait_mode(true), - m_flip_y(flip_y), - m_initial_width(10), - m_initial_height(10) - { - strcpy(m_caption, "Anti-Grain Geometry Application"); - } - - - //------------------------------------------------------------------------ - platform_support::~platform_support() - { - delete m_specific; - } - - //------------------------------------------------------------------------ - void platform_support::caption(const char* cap) - { - strcpy(m_caption, cap); - m_specific->SetTitle(cap); - } - - //------------------------------------------------------------------------ - void platform_support::start_timer() - { - m_specific->StartTimer(); - } - - //------------------------------------------------------------------------ - double platform_support::elapsed_time() const - { - return m_specific->ElapsedTime(); - } - - //------------------------------------------------------------------------ - void* platform_support::raw_display_handler() - { - // TODO: if we ever support BDirectWindow here, that would - // be the frame buffer pointer with offset to the window top left - return NULL; - } - - //------------------------------------------------------------------------ - void platform_support::message(const char* msg) - { - BAlert* alert = new BAlert("AGG Message", msg, "Ok"); - alert->Go(/*NULL*/); - } - - - //------------------------------------------------------------------------ - bool platform_support::init(unsigned width, unsigned height, unsigned flags) - { - m_initial_width = width; - m_initial_height = height; - m_window_flags = flags; - - if (m_specific->Init(width, height, flags)) { - on_init(); - return true; - } - - return false; - } - - - //------------------------------------------------------------------------ - int platform_support::run() - { - return m_specific->Run(); - } - - - //------------------------------------------------------------------------ - const char* platform_support::img_ext() const { return ".ppm"; } - - - const char* platform_support::full_file_name(const char* file_name) - { - sprintf(m_specific->fFilePath, "%s/%s", m_specific->fAppPath, file_name); - return m_specific->fFilePath; - } - - - //------------------------------------------------------------------------ - bool platform_support::load_img(unsigned idx, const char* file) - { - if (idx < max_images) - { - char path[B_PATH_NAME_LENGTH]; - sprintf(path, "%s/%s%s", m_specific->fAppPath, file, img_ext()); - BBitmap* transBitmap = BTranslationUtils::GetBitmap(path); - if (transBitmap && transBitmap->IsValid()) { - if(transBitmap->ColorSpace() != B_RGB32 && transBitmap->ColorSpace() != B_RGBA32) { - // ups we got a smart ass Translator making our live harder - delete transBitmap; - return false; - } - - color_space format = B_RGB24; - - switch (m_format) { - case pix_format_gray8: - format = B_GRAY8; - break; - case pix_format_rgb555: - format = B_RGB15; - break; - case pix_format_rgb565: - format = B_RGB16; - break; - case pix_format_rgb24: - format = B_RGB24_BIG; - break; - case pix_format_bgr24: - format = B_RGB24; - break; - case pix_format_abgr32: - case pix_format_argb32: - case pix_format_bgra32: - format = B_RGB32; - break; - case pix_format_rgba32: - format = B_RGB32_BIG; - break; - } - BBitmap* bitmap = new (nothrow) BBitmap(transBitmap->Bounds(), 0, format); - if (!bitmap || !bitmap->IsValid()) { - fprintf(stderr, "failed to allocate temporary bitmap!\n"); - delete transBitmap; - delete bitmap; - return false; - } - - delete m_specific->fImages[idx]; - - rendering_buffer rbuf_tmp; - attach_buffer_to_BBitmap(rbuf_tmp, transBitmap, m_flip_y); - - m_specific->fImages[idx] = bitmap; - - attach_buffer_to_BBitmap(m_rbuf_img[idx], bitmap, m_flip_y); - - rendering_buffer* dst = &m_rbuf_img[idx]; - - switch(m_format) - { - case pix_format_gray8: - return false; -// color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_gray8()); break; - break; - - case pix_format_rgb555: - color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgb555()); break; - break; - - case pix_format_rgb565: - color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgb565()); break; - break; - - case pix_format_rgb24: - color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgb24()); break; - break; - - case pix_format_bgr24: - color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_bgr24()); break; - break; - - case pix_format_abgr32: - color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_abgr32()); break; - break; - - case pix_format_argb32: - color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_argb32()); break; - break; - - case pix_format_bgra32: - color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_bgra32()); break; - break; - - case pix_format_rgba32: - color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgba32()); break; - break; - } - delete transBitmap; - - return true; - - } else { - fprintf(stderr, "failed to load bitmap: '%s'\n", full_file_name(file)); - } - } - return false; - } - - - - //------------------------------------------------------------------------ - bool platform_support::save_img(unsigned idx, const char* file) - { - // TODO: implement using BTranslatorRoster and friends - return false; - } - - - - //------------------------------------------------------------------------ - bool platform_support::create_img(unsigned idx, unsigned width, unsigned height) - { - if(idx < max_images) - { - if(width == 0) width = m_specific->fApp->Window()->View()->Bitmap()->Bounds().IntegerWidth() + 1; - if(height == 0) height = m_specific->fApp->Window()->View()->Bitmap()->Bounds().IntegerHeight() + 1; - BBitmap* bitmap = new BBitmap(BRect(0.0, 0.0, width - 1, height - 1), 0, B_RGBA32);; - if (bitmap && bitmap->IsValid()) { - delete m_specific->fImages[idx]; - m_specific->fImages[idx] = bitmap; - attach_buffer_to_BBitmap(m_rbuf_img[idx], bitmap, m_flip_y); - return true; - } else { - delete bitmap; - } - } - return false; - } - - - //------------------------------------------------------------------------ - void platform_support::force_redraw() - { - m_specific->ForceRedraw(); - } - - - - //------------------------------------------------------------------------ - void platform_support::update_window() - { - m_specific->UpdateWindow(); - } - - - //------------------------------------------------------------------------ - void platform_support::on_init() {} - void platform_support::on_resize(int sx, int sy) {} - void platform_support::on_idle() {} - void platform_support::on_mouse_move(int x, int y, unsigned flags) {} - void platform_support::on_mouse_button_down(int x, int y, unsigned flags) {} - void platform_support::on_mouse_button_up(int x, int y, unsigned flags) {} - void platform_support::on_key(int x, int y, unsigned key, unsigned flags) {} - void platform_support::on_ctrl_change() {} - void platform_support::on_draw() {} - void platform_support::on_post_draw(void* raw_handler) {} -} - - - - - - -//---------------------------------------------------------------------------- -int agg_main(int argc, char* argv[]); - - - -int -main(int argc, char* argv[]) -{ - return agg_main(argc, argv); -} - - -#endif - -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (McSeem) -// Copyright (C) 2003 Hansruedi Baer (MacOS support) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -// baer@karto.baug.eth.ch -//---------------------------------------------------------------------------- -// -// class platform_support -// -//---------------------------------------------------------------------------- -// -// Note: -// I tried to retain the original structure for the Win32 platform as far -// as possible. Currently, not all features are implemented but the examples -// should work properly. -// HB -//---------------------------------------------------------------------------- - -#ifdef PLATFORM_OSX11 - -#include -#if defined(__MWERKS__) -#include "console.h" -#endif -#include -#include -#include -#include -#include - - -namespace agg -{ - -pascal OSStatus DoWindowClose (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData); -pascal OSStatus DoWindowDrawContent (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData); -pascal OSStatus DoAppQuit (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData); -pascal OSStatus DoMouseDown (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData); -pascal OSStatus DoMouseUp (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData); -pascal OSStatus DoMouseDragged (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData); -pascal OSStatus DoKeyDown (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData); -pascal OSStatus DoKeyUp (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData); -pascal void DoPeriodicTask (EventLoopTimerRef theTimer, void* userData); - - - //------------------------------------------------------------------------ - class platform_specific - { - public: - platform_specific(pix_format_e format, bool flip_y); - - void create_pmap(unsigned width, unsigned height, - rendering_buffer* wnd); - - void display_pmap(WindowRef window, const rendering_buffer* src); - bool load_pmap(const char* fn, unsigned idx, - rendering_buffer* dst); - - bool save_pmap(const char* fn, unsigned idx, - const rendering_buffer* src); - - unsigned translate(unsigned keycode); - - pix_format_e m_format; - pix_format_e m_sys_format; - bool m_flip_y; - unsigned m_bpp; - unsigned m_sys_bpp; - WindowRef m_window; - pixel_map m_pmap_window; - pixel_map m_pmap_img[platform_support::max_images]; - unsigned m_keymap[256]; - unsigned m_last_translated_key; - int m_cur_x; - int m_cur_y; - unsigned m_input_flags; - bool m_redraw_flag; - UnsignedWide m_sw_freq; - UnsignedWide m_sw_start; - }; - - - //------------------------------------------------------------------------ - platform_specific::platform_specific(pix_format_e format, bool flip_y) : - m_format(format), - m_sys_format(pix_format_undefined), - m_flip_y(flip_y), - m_bpp(0), - m_sys_bpp(0), - m_window(nil), - m_last_translated_key(0), - m_cur_x(0), - m_cur_y(0), - m_input_flags(0), - m_redraw_flag(true) - { - memset(m_keymap, 0, sizeof(m_keymap)); - - //Keyboard input is not yet fully supported nor tested - //m_keymap[VK_PAUSE] = key_pause; - m_keymap[kClearCharCode] = key_clear; - - //m_keymap[VK_NUMPAD0] = key_kp0; - //m_keymap[VK_NUMPAD1] = key_kp1; - //m_keymap[VK_NUMPAD2] = key_kp2; - //m_keymap[VK_NUMPAD3] = key_kp3; - //m_keymap[VK_NUMPAD4] = key_kp4; - //m_keymap[VK_NUMPAD5] = key_kp5; - //m_keymap[VK_NUMPAD6] = key_kp6; - //m_keymap[VK_NUMPAD7] = key_kp7; - //m_keymap[VK_NUMPAD8] = key_kp8; - //m_keymap[VK_NUMPAD9] = key_kp9; - //m_keymap[VK_DECIMAL] = key_kp_period; - //m_keymap[VK_DIVIDE] = key_kp_divide; - //m_keymap[VK_MULTIPLY] = key_kp_multiply; - //m_keymap[VK_SUBTRACT] = key_kp_minus; - //m_keymap[VK_ADD] = key_kp_plus; - - m_keymap[kUpArrowCharCode] = key_up; - m_keymap[kDownArrowCharCode] = key_down; - m_keymap[kRightArrowCharCode] = key_right; - m_keymap[kLeftArrowCharCode] = key_left; - //m_keymap[VK_INSERT] = key_insert; - m_keymap[kDeleteCharCode] = key_delete; - m_keymap[kHomeCharCode] = key_home; - m_keymap[kEndCharCode] = key_end; - m_keymap[kPageUpCharCode] = key_page_up; - m_keymap[kPageDownCharCode] = key_page_down; - - //m_keymap[VK_F1] = key_f1; - //m_keymap[VK_F2] = key_f2; - //m_keymap[VK_F3] = key_f3; - //m_keymap[VK_F4] = key_f4; - //m_keymap[VK_F5] = key_f5; - //m_keymap[VK_F6] = key_f6; - //m_keymap[VK_F7] = key_f7; - //m_keymap[VK_F8] = key_f8; - //m_keymap[VK_F9] = key_f9; - //m_keymap[VK_F10] = key_f10; - //m_keymap[VK_F11] = key_f11; - //m_keymap[VK_F12] = key_f12; - //m_keymap[VK_F13] = key_f13; - //m_keymap[VK_F14] = key_f14; - //m_keymap[VK_F15] = key_f15; - - //m_keymap[VK_NUMLOCK] = key_numlock; - //m_keymap[VK_CAPITAL] = key_capslock; - //m_keymap[VK_SCROLL] = key_scrollock; - - switch(m_format) - { - case pix_format_gray8: - m_sys_format = pix_format_gray8; - m_bpp = 8; - m_sys_bpp = 8; - break; - - case pix_format_rgb565: - case pix_format_rgb555: - m_sys_format = pix_format_rgb555; - m_bpp = 16; - m_sys_bpp = 16; - break; - - case pix_format_rgb24: - case pix_format_bgr24: - m_sys_format = pix_format_rgb24; - m_bpp = 24; - m_sys_bpp = 24; - break; - - case pix_format_bgra32: - case pix_format_abgr32: - case pix_format_argb32: - case pix_format_rgba32: - m_sys_format = pix_format_argb32; - m_bpp = 32; - m_sys_bpp = 32; - break; - } - ::Microseconds(&m_sw_freq); - ::Microseconds(&m_sw_start); - } - - - //------------------------------------------------------------------------ - void platform_specific::create_pmap(unsigned width, - unsigned height, - rendering_buffer* wnd) - { - m_pmap_window.create(width, height, org_e(m_bpp)); - wnd->attach(m_pmap_window.buf(), - m_pmap_window.width(), - m_pmap_window.height(), - m_flip_y ? - -m_pmap_window.row_bytes() : - m_pmap_window.row_bytes()); - } - - - //------------------------------------------------------------------------ - void platform_specific::display_pmap(WindowRef window, const rendering_buffer* src) - { - if(m_sys_format == m_format) - { - m_pmap_window.draw(window); - } - else - { - pixel_map pmap_tmp; - pmap_tmp.create(m_pmap_window.width(), - m_pmap_window.height(), - org_e(m_sys_bpp)); - - rendering_buffer rbuf_tmp; - rbuf_tmp.attach(pmap_tmp.buf(), - pmap_tmp.width(), - pmap_tmp.height(), - m_flip_y ? - -pmap_tmp.row_bytes() : - pmap_tmp.row_bytes()); - - switch(m_format) - { - case pix_format_gray8: - return; - - case pix_format_rgb565: - color_conv(&rbuf_tmp, src, color_conv_rgb565_to_rgb555()); - break; - - case pix_format_bgr24: - color_conv(&rbuf_tmp, src, color_conv_bgr24_to_rgb24()); - break; - - case pix_format_abgr32: - color_conv(&rbuf_tmp, src, color_conv_abgr32_to_argb32()); - break; - - case pix_format_bgra32: - color_conv(&rbuf_tmp, src, color_conv_bgra32_to_argb32()); - break; - - case pix_format_rgba32: - color_conv(&rbuf_tmp, src, color_conv_rgba32_to_argb32()); - break; - } - pmap_tmp.draw(window); - } - } - - - //------------------------------------------------------------------------ - bool platform_specific::save_pmap(const char* fn, unsigned idx, - const rendering_buffer* src) - { - if(m_sys_format == m_format) - { - return m_pmap_img[idx].save_as_qt(fn); - } - else - { - pixel_map pmap_tmp; - pmap_tmp.create(m_pmap_img[idx].width(), - m_pmap_img[idx].height(), - org_e(m_sys_bpp)); - - rendering_buffer rbuf_tmp; - rbuf_tmp.attach(pmap_tmp.buf(), - pmap_tmp.width(), - pmap_tmp.height(), - m_flip_y ? - -pmap_tmp.row_bytes() : - pmap_tmp.row_bytes()); - switch(m_format) - { - case pix_format_gray8: - return false; - - case pix_format_rgb565: - color_conv(&rbuf_tmp, src, color_conv_rgb565_to_rgb555()); - break; - - case pix_format_rgb24: - color_conv(&rbuf_tmp, src, color_conv_rgb24_to_bgr24()); - break; - - case pix_format_abgr32: - color_conv(&rbuf_tmp, src, color_conv_abgr32_to_bgra32()); - break; - - case pix_format_argb32: - color_conv(&rbuf_tmp, src, color_conv_argb32_to_bgra32()); - break; - - case pix_format_rgba32: - color_conv(&rbuf_tmp, src, color_conv_rgba32_to_bgra32()); - break; - } - return pmap_tmp.save_as_qt(fn); - } - return true; - } - - - - //------------------------------------------------------------------------ - bool platform_specific::load_pmap(const char* fn, unsigned idx, - rendering_buffer* dst) - { - pixel_map pmap_tmp; - if(!pmap_tmp.load_from_qt(fn)) return false; - - rendering_buffer rbuf_tmp; - rbuf_tmp.attach(pmap_tmp.buf(), - pmap_tmp.width(), - pmap_tmp.height(), - m_flip_y ? - -pmap_tmp.row_bytes() : - pmap_tmp.row_bytes()); - - m_pmap_img[idx].create(pmap_tmp.width(), - pmap_tmp.height(), - org_e(m_bpp), - 0); - - dst->attach(m_pmap_img[idx].buf(), - m_pmap_img[idx].width(), - m_pmap_img[idx].height(), - m_flip_y ? - -m_pmap_img[idx].row_bytes() : - m_pmap_img[idx].row_bytes()); - - switch(m_format) - { - case pix_format_gray8: - return false; - break; - - case pix_format_rgb555: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_rgb555()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_rgb24_to_rgb555()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_argb32_to_rgb555()); break; - } - break; - - case pix_format_rgb565: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_rgb565()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_rgb24_to_rgb565()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_argb32_to_rgb565()); break; - } - break; - - case pix_format_rgb24: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_rgb24()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_rgb24_to_rgb24()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_argb32_to_rgb24()); break; - } - break; - - case pix_format_bgr24: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_bgr24()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_rgb24_to_bgr24()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_argb32_to_bgr24()); break; - } - break; - - case pix_format_abgr32: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_abgr32()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_rgb24_to_abgr32()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_argb32_to_abgr32()); break; - } - break; - - case pix_format_argb32: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_argb32()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_rgb24_to_argb32()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_argb32_to_argb32()); break; - } - break; - - case pix_format_bgra32: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_bgra32()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_rgb24_to_bgra32()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_argb32_to_bgra32()); break; - } - break; - - case pix_format_rgba32: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_rgba32()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_rgb24_to_rgba32()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_argb32_to_rgba32()); break; - } - break; - } - - return true; - } - - - - - - - - - //------------------------------------------------------------------------ - unsigned platform_specific::translate(unsigned keycode) - { - return m_last_translated_key = (keycode > 255) ? 0 : m_keymap[keycode]; - } - - - - //------------------------------------------------------------------------ - platform_support::platform_support(pix_format_e format, bool flip_y) : - m_specific(new platform_specific(format, flip_y)), - m_format(format), - m_bpp(m_specific->m_bpp), - m_window_flags(0), - m_wait_mode(true), - m_flip_y(flip_y), - m_initial_width(10), - m_initial_height(10) - { - strcpy(m_caption, "Anti-Grain Geometry Application"); - } - - - //------------------------------------------------------------------------ - platform_support::~platform_support() - { - delete m_specific; - } - - - - //------------------------------------------------------------------------ - void platform_support::caption(const char* cap) - { - strcpy(m_caption, cap); - if(m_specific->m_window) - { - SetWindowTitleWithCFString (m_specific->m_window, CFStringCreateWithCStringNoCopy (nil, cap, kCFStringEncodingASCII, nil)); - } - } - - - - //------------------------------------------------------------------------ - static unsigned get_key_flags(UInt32 wflags) - { - unsigned flags = 0; - - if(wflags & shiftKey) flags |= kbd_shift; - if(wflags & controlKey) flags |= kbd_ctrl; - - return flags; - } - - - //------------------------------------------------------------------------ - void platform_support::message(const char* msg) - { - SInt16 item; - Str255 p_msg; - - ::CopyCStringToPascal (msg, p_msg); - ::StandardAlert (kAlertPlainAlert, (const unsigned char*) "\013AGG Message", p_msg, NULL, &item); - //::StandardAlert (kAlertPlainAlert, (const unsigned char*) "\pAGG Message", p_msg, NULL, &item); - } - - - //------------------------------------------------------------------------ - void platform_support::start_timer() - { - ::Microseconds (&(m_specific->m_sw_start)); - } - - - //------------------------------------------------------------------------ - double platform_support::elapsed_time() const - { - UnsignedWide stop; - ::Microseconds(&stop); - return double(stop.lo - - m_specific->m_sw_start.lo) * 1e6 / - double(m_specific->m_sw_freq.lo); - } - - - //------------------------------------------------------------------------ - bool platform_support::init(unsigned width, unsigned height, unsigned flags) - { - if(m_specific->m_sys_format == pix_format_undefined) - { - return false; - } - - m_window_flags = flags; - - // application - EventTypeSpec eventType; - EventHandlerUPP handlerUPP; - - eventType.eventClass = kEventClassApplication; - eventType.eventKind = kEventAppQuit; - - handlerUPP = NewEventHandlerUPP(DoAppQuit); - - InstallApplicationEventHandler (handlerUPP, 1, &eventType, nil, nil); - - eventType.eventClass = kEventClassMouse; - eventType.eventKind = kEventMouseDown; - handlerUPP = NewEventHandlerUPP(DoMouseDown); - InstallApplicationEventHandler (handlerUPP, 1, &eventType, this, nil); - - eventType.eventKind = kEventMouseUp; - handlerUPP = NewEventHandlerUPP(DoMouseUp); - InstallApplicationEventHandler (handlerUPP, 1, &eventType, this, nil); - - eventType.eventKind = kEventMouseDragged; - handlerUPP = NewEventHandlerUPP(DoMouseDragged); - InstallApplicationEventHandler (handlerUPP, 1, &eventType, this, nil); - - eventType.eventClass = kEventClassKeyboard; - eventType.eventKind = kEventRawKeyDown; - handlerUPP = NewEventHandlerUPP(DoKeyDown); - InstallApplicationEventHandler (handlerUPP, 1, &eventType, this, nil); - - eventType.eventKind = kEventRawKeyUp; - handlerUPP = NewEventHandlerUPP(DoKeyUp); - InstallApplicationEventHandler (handlerUPP, 1, &eventType, this, nil); - - eventType.eventKind = kEventRawKeyRepeat; - handlerUPP = NewEventHandlerUPP(DoKeyDown); // 'key repeat' is translated to 'key down' - InstallApplicationEventHandler (handlerUPP, 1, &eventType, this, nil); - - WindowAttributes windowAttrs; - Rect bounds; - - // window - windowAttrs = kWindowCloseBoxAttribute | kWindowCollapseBoxAttribute | kWindowStandardHandlerAttribute; - SetRect (&bounds, 0, 0, width, height); - OffsetRect (&bounds, 100, 100); - CreateNewWindow (kDocumentWindowClass, windowAttrs, &bounds, &m_specific->m_window); - - if(m_specific->m_window == nil) - { - return false; - } - - // I assume the text is ASCII. - // Change to kCFStringEncodingMacRoman, kCFStringEncodingISOLatin1, kCFStringEncodingUTF8 or what else you need. - SetWindowTitleWithCFString (m_specific->m_window, CFStringCreateWithCStringNoCopy (nil, m_caption, kCFStringEncodingASCII, nil)); - - eventType.eventClass = kEventClassWindow; - eventType.eventKind = kEventWindowClose; - - handlerUPP = NewEventHandlerUPP(DoWindowClose); - InstallWindowEventHandler (m_specific->m_window, handlerUPP, 1, &eventType, this, NULL); - - eventType.eventKind = kEventWindowDrawContent; - handlerUPP = NewEventHandlerUPP(DoWindowDrawContent); - InstallWindowEventHandler (m_specific->m_window, handlerUPP, 1, &eventType, this, NULL); - - // Periodic task - // Instead of an idle function I use the Carbon event timer. - // You may decide to change the wait value which is currently 50 milliseconds. - EventLoopRef mainLoop; - EventLoopTimerUPP timerUPP; - EventLoopTimerRef theTimer; - - mainLoop = GetMainEventLoop(); - timerUPP = NewEventLoopTimerUPP (DoPeriodicTask); - InstallEventLoopTimer (mainLoop, 0, 50 * kEventDurationMillisecond, timerUPP, this, &theTimer); - - m_specific->create_pmap(width, height, &m_rbuf_window); - m_initial_width = width; - m_initial_height = height; - on_init(); - on_resize(width, height); - m_specific->m_redraw_flag = true; - - ShowWindow (m_specific->m_window); - SetPortWindowPort (m_specific->m_window); - - return true; - } - - - //------------------------------------------------------------------------ - int platform_support::run() - { - - RunApplicationEventLoop (); - return true; - } - - - //------------------------------------------------------------------------ - const char* platform_support::img_ext() const { return ".bmp"; } - - //------------------------------------------------------------------------ - const char* platform_support::full_file_name(const char* file_name) - { - return file_name; - } - - //------------------------------------------------------------------------ - bool platform_support::load_img(unsigned idx, const char* file) - { - if(idx < max_images) - { - char fn[1024]; - strcpy(fn, file); - int len = strlen(fn); -#if defined(__MWERKS__) - if(len < 4 || stricmp(fn + len - 4, ".BMP") != 0) -#else - if(len < 4 || strncasecmp(fn + len - 4, ".BMP", 4) != 0) -#endif - { - strcat(fn, ".bmp"); - } - return m_specific->load_pmap(fn, idx, &m_rbuf_img[idx]); - } - return true; - } - - - - //------------------------------------------------------------------------ - bool platform_support::save_img(unsigned idx, const char* file) - { - if(idx < max_images) - { - char fn[1024]; - strcpy(fn, file); - int len = strlen(fn); -#if defined(__MWERKS__) - if(len < 4 || stricmp(fn + len - 4, ".BMP") != 0) -#else - if(len < 4 || strncasecmp(fn + len - 4, ".BMP", 4) != 0) -#endif - { - strcat(fn, ".bmp"); - } - return m_specific->save_pmap(fn, idx, &m_rbuf_img[idx]); - } - return true; - } - - - - //------------------------------------------------------------------------ - bool platform_support::create_img(unsigned idx, unsigned width, unsigned height) - { - if(idx < max_images) - { - if(width == 0) width = m_specific->m_pmap_window.width(); - if(height == 0) height = m_specific->m_pmap_window.height(); - m_specific->m_pmap_img[idx].create(width, height, org_e(m_specific->m_bpp)); - m_rbuf_img[idx].attach(m_specific->m_pmap_img[idx].buf(), - m_specific->m_pmap_img[idx].width(), - m_specific->m_pmap_img[idx].height(), - m_flip_y ? - -m_specific->m_pmap_img[idx].row_bytes() : - m_specific->m_pmap_img[idx].row_bytes()); - return true; - } - return false; - } - - - //------------------------------------------------------------------------ - void platform_support::force_redraw() - { - Rect bounds; - - m_specific->m_redraw_flag = true; - // on_ctrl_change (); - on_draw(); - - SetRect(&bounds, 0, 0, m_rbuf_window.width(), m_rbuf_window.height()); - InvalWindowRect(m_specific->m_window, &bounds); - } - - - - //------------------------------------------------------------------------ - void platform_support::update_window() - { - m_specific->display_pmap(m_specific->m_window, &m_rbuf_window); - } - - - //------------------------------------------------------------------------ - void platform_support::on_init() {} - void platform_support::on_resize(int sx, int sy) {} - void platform_support::on_idle() {} - void platform_support::on_mouse_move(int x, int y, unsigned flags) {} - void platform_support::on_mouse_button_down(int x, int y, unsigned flags) {} - void platform_support::on_mouse_button_up(int x, int y, unsigned flags) {} - void platform_support::on_key(int x, int y, unsigned key, unsigned flags) {} - void platform_support::on_ctrl_change() {} - void platform_support::on_draw() {} - void platform_support::on_post_draw(void* raw_handler) {} - - -//------------------------------------------------------------------------ -pascal OSStatus DoWindowClose (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData) -{ - userData; - - QuitApplicationEventLoop (); - - return CallNextEventHandler (nextHandler, theEvent); -} - - -//------------------------------------------------------------------------ -pascal OSStatus DoAppQuit (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData) -{ - userData; - - return CallNextEventHandler (nextHandler, theEvent); -} - - -//------------------------------------------------------------------------ -pascal OSStatus DoMouseDown (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData) -{ - Point wheresMyMouse; - UInt32 modifier; - - GetEventParameter (theEvent, kEventParamMouseLocation, typeQDPoint, NULL, sizeof(Point), NULL, &wheresMyMouse); - GlobalToLocal (&wheresMyMouse); - GetEventParameter (theEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifier); - - platform_support * app = reinterpret_cast(userData); - - app->m_specific->m_cur_x = wheresMyMouse.h; - if(app->flip_y()) - { - app->m_specific->m_cur_y = app->rbuf_window().height() - wheresMyMouse.v; - } - else - { - app->m_specific->m_cur_y = wheresMyMouse.v; - } - app->m_specific->m_input_flags = mouse_left | get_key_flags(modifier); - - app->m_ctrls.set_cur(app->m_specific->m_cur_x, - app->m_specific->m_cur_y); - if(app->m_ctrls.on_mouse_button_down(app->m_specific->m_cur_x, - app->m_specific->m_cur_y)) - { - app->on_ctrl_change(); - app->force_redraw(); - } - else - { - if(app->m_ctrls.in_rect(app->m_specific->m_cur_x, - app->m_specific->m_cur_y)) - { - if(app->m_ctrls.set_cur(app->m_specific->m_cur_x, - app->m_specific->m_cur_y)) - { - app->on_ctrl_change(); - app->force_redraw(); - } - } - else - { - app->on_mouse_button_down(app->m_specific->m_cur_x, - app->m_specific->m_cur_y, - app->m_specific->m_input_flags); - } - } - - return CallNextEventHandler (nextHandler, theEvent); -} - - -//------------------------------------------------------------------------ -pascal OSStatus DoMouseUp (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData) -{ - Point wheresMyMouse; - UInt32 modifier; - - GetEventParameter (theEvent, kEventParamMouseLocation, typeQDPoint, NULL, sizeof(Point), NULL, &wheresMyMouse); - GlobalToLocal (&wheresMyMouse); - GetEventParameter (theEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifier); - - platform_support * app = reinterpret_cast(userData); - - app->m_specific->m_cur_x = wheresMyMouse.h; - if(app->flip_y()) - { - app->m_specific->m_cur_y = app->rbuf_window().height() - wheresMyMouse.v; - } - else - { - app->m_specific->m_cur_y = wheresMyMouse.v; - } - app->m_specific->m_input_flags = mouse_left | get_key_flags(modifier); - - if(app->m_ctrls.on_mouse_button_up(app->m_specific->m_cur_x, - app->m_specific->m_cur_y)) - { - app->on_ctrl_change(); - app->force_redraw(); - } - app->on_mouse_button_up(app->m_specific->m_cur_x, - app->m_specific->m_cur_y, - app->m_specific->m_input_flags); - - return CallNextEventHandler (nextHandler, theEvent); -} - - -//------------------------------------------------------------------------ -pascal OSStatus DoMouseDragged (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData) -{ - Point wheresMyMouse; - UInt32 modifier; - - GetEventParameter (theEvent, kEventParamMouseLocation, typeQDPoint, NULL, sizeof(Point), NULL, &wheresMyMouse); - GlobalToLocal (&wheresMyMouse); - GetEventParameter (theEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifier); - - platform_support * app = reinterpret_cast(userData); - - app->m_specific->m_cur_x = wheresMyMouse.h; - if(app->flip_y()) - { - app->m_specific->m_cur_y = app->rbuf_window().height() - wheresMyMouse.v; - } - else - { - app->m_specific->m_cur_y = wheresMyMouse.v; - } - app->m_specific->m_input_flags = mouse_left | get_key_flags(modifier); - - - if(app->m_ctrls.on_mouse_move( - app->m_specific->m_cur_x, - app->m_specific->m_cur_y, - (app->m_specific->m_input_flags & mouse_left) != 0)) - { - app->on_ctrl_change(); - app->force_redraw(); - } - else - { - app->on_mouse_move(app->m_specific->m_cur_x, - app->m_specific->m_cur_y, - app->m_specific->m_input_flags); - } - - return CallNextEventHandler (nextHandler, theEvent); -} - - -//------------------------------------------------------------------------ -pascal OSStatus DoKeyDown (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData) -{ - char key_code; - UInt32 modifier; - - GetEventParameter (theEvent, kEventParamKeyMacCharCodes, typeChar, NULL, sizeof(char), NULL, &key_code); - GetEventParameter (theEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifier); - - platform_support * app = reinterpret_cast(userData); - - app->m_specific->m_last_translated_key = 0; - switch(modifier) - { - case controlKey: - app->m_specific->m_input_flags |= kbd_ctrl; - break; - - case shiftKey: - app->m_specific->m_input_flags |= kbd_shift; - break; - - default: - app->m_specific->translate(key_code); - break; - } - - if(app->m_specific->m_last_translated_key) - { - bool left = false; - bool up = false; - bool right = false; - bool down = false; - - switch(app->m_specific->m_last_translated_key) - { - case key_left: - left = true; - break; - - case key_up: - up = true; - break; - - case key_right: - right = true; - break; - - case key_down: - down = true; - break; - - //On a Mac, screenshots are handled by the system. - case key_f2: - app->copy_window_to_img(agg::platform_support::max_images - 1); - app->save_img(agg::platform_support::max_images - 1, "screenshot"); - break; - } - - - if(app->m_ctrls.on_arrow_keys(left, right, down, up)) - { - app->on_ctrl_change(); - app->force_redraw(); - } - else - { - app->on_key(app->m_specific->m_cur_x, - app->m_specific->m_cur_y, - app->m_specific->m_last_translated_key, - app->m_specific->m_input_flags); - } - } - - return CallNextEventHandler (nextHandler, theEvent); -} - - -//------------------------------------------------------------------------ -pascal OSStatus DoKeyUp (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData) -{ - char key_code; - UInt32 modifier; - - GetEventParameter (theEvent, kEventParamKeyMacCharCodes, typeChar, NULL, sizeof(char), NULL, &key_code); - GetEventParameter (theEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifier); - - platform_support * app = reinterpret_cast(userData); - - app->m_specific->m_last_translated_key = 0; - switch(modifier) - { - case controlKey: - app->m_specific->m_input_flags &= ~kbd_ctrl; - break; - - case shiftKey: - app->m_specific->m_input_flags &= ~kbd_shift; - break; - } - - return CallNextEventHandler (nextHandler, theEvent); -} - - -//------------------------------------------------------------------------ -pascal OSStatus DoWindowDrawContent (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData) -{ - platform_support * app = reinterpret_cast(userData); - - if(app) - { - if(app->m_specific->m_redraw_flag) - { - app->on_draw(); - app->m_specific->m_redraw_flag = false; - } - app->m_specific->display_pmap(app->m_specific->m_window, &app->rbuf_window()); - } - - return CallNextEventHandler (nextHandler, theEvent); -} - - -//------------------------------------------------------------------------ -pascal void DoPeriodicTask (EventLoopTimerRef theTimer, void* userData) -{ - platform_support * app = reinterpret_cast(userData); - - if(!app->wait_mode()) - app->on_idle(); -} - - -} - - - - -//---------------------------------------------------------------------------- -int agg_main(int argc, char* argv[]); - - -// Hm. Classic MacOS does not know command line input. -// CodeWarrior provides a way to mimic command line input. -// The function 'ccommand' can be used to get the command -// line arguments. -//---------------------------------------------------------------------------- -int main(int argc, char* argv[]) -{ -#if defined(__MWERKS__) - // argc = ccommand (&argv); -#endif - - // Check if we are launched by double-clicking under OSX - // Get rid of extra argument, this will confuse the standard argument parsing - // calls used in the examples to get the name of the image file to be used - if ( argc >= 2 && strncmp (argv[1], "-psn", 4) == 0 ) { - argc = 1; - } - -launch: - return agg_main(argc, argv); -} - -#endif - -#endif - diff --git a/uppdev/agg24/agg_platform_support.h b/uppdev/agg24/agg_platform_support.h deleted file mode 100644 index 5a65f353e..000000000 --- a/uppdev/agg24/agg_platform_support.h +++ /dev/null @@ -1,669 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// class platform_support -// -// It's not a part of the AGG library, it's just a helper class to create -// interactive demo examples. Since the examples should not be too complex -// this class is provided to support some very basic interactive graphical -// funtionality, such as putting the rendered image to the window, simple -// keyboard and mouse input, window resizing, setting the window title, -// and catching the "idle" events. -// -// The idea is to have a single header file that does not depend on any -// platform (I hate these endless #ifdef/#elif/#elif.../#endif) and a number -// of different implementations depending on the concrete platform. -// The most popular platforms are: -// -// Windows-32 API -// X-Window API -// SDL library (see http://www.libsdl.org/) -// MacOS C/C++ API -// -// This file does not include any system dependent .h files such as -// windows.h or X11.h, so, your demo applications do not depend on the -// platform. The only file that can #include system dependend headers -// is the implementation file agg_platform_support.cpp. Different -// implementations are placed in different directories, such as -// ~/agg/src/platform/win32 -// ~/agg/src/platform/sdl -// ~/agg/src/platform/X11 -// and so on. -// -// All the system dependent stuff sits in the platform_specific -// class which is forward-declared here but not defined. -// The platform_support class has just a pointer to it and it's -// the responsibility of the implementation to create/delete it. -// This class being defined in the implementation file can have -// any platform dependent stuff such as HWND, X11 Window and so on. -// -//---------------------------------------------------------------------------- - - -#ifndef AGG_PLATFORM_SUPPORT_INCLUDED -#define AGG_PLATFORM_SUPPORT_INCLUDED - - -#include "agg_basics.h" -#include "agg_rendering_buffer.h" -#include "agg_trans_viewport.h" -#include "agg_ctrl.h" - -namespace agg -{ - - //----------------------------------------------------------window_flag_e - // These are flags used in method init(). Not all of them are - // applicable on different platforms, for example the win32_api - // cannot use a hardware buffer (window_hw_buffer). - // The implementation should simply ignore unsupported flags. - enum window_flag_e - { - window_resize = 1, - window_hw_buffer = 2, - window_keep_aspect_ratio = 4, - window_process_all_keys = 8 - }; - - //-----------------------------------------------------------pix_format_e - // Possible formats of the rendering buffer. Initially I thought that it's - // reasonable to create the buffer and the rendering functions in - // accordance with the native pixel format of the system because it - // would have no overhead for pixel format conersion. - // But eventually I came to a conclusion that having a possibility to - // convert pixel formats on demand is a good idea. First, it was X11 where - // there lots of different formats and visuals and it would be great to - // render everything in, say, RGB-24 and display it automatically without - // any additional efforts. The second reason is to have a possibility to - // debug renderers for different pixel formats and colorspaces having only - // one computer and one system. - // - // This stuff is not included into the basic AGG functionality because the - // number of supported pixel formats (and/or colorspaces) can be great and - // if one needs to add new format it would be good only to add new - // rendering files without having to modify any existing ones (a general - // principle of incapsulation and isolation). - // - // Using a particular pixel format doesn't obligatory mean the necessity - // of software conversion. For example, win32 API can natively display - // gray8, 15-bit RGB, 24-bit BGR, and 32-bit BGRA formats. - // This list can be (and will be!) extended in future. - enum pix_format_e - { - pix_format_undefined = 0, // By default. No conversions are applied - pix_format_bw, // 1 bit per color B/W - pix_format_gray8, // Simple 256 level grayscale - pix_format_gray16, // Simple 65535 level grayscale - pix_format_rgb555, // 15 bit rgb. Depends on the byte ordering! - pix_format_rgb565, // 16 bit rgb. Depends on the byte ordering! - pix_format_rgbAAA, // 30 bit rgb. Depends on the byte ordering! - pix_format_rgbBBA, // 32 bit rgb. Depends on the byte ordering! - pix_format_bgrAAA, // 30 bit bgr. Depends on the byte ordering! - pix_format_bgrABB, // 32 bit bgr. Depends on the byte ordering! - pix_format_rgb24, // R-G-B, one byte per color component - pix_format_bgr24, // B-G-R, native win32 BMP format. - pix_format_rgba32, // R-G-B-A, one byte per color component - pix_format_argb32, // A-R-G-B, native MAC format - pix_format_abgr32, // A-B-G-R, one byte per color component - pix_format_bgra32, // B-G-R-A, native win32 BMP format - pix_format_rgb48, // R-G-B, 16 bits per color component - pix_format_bgr48, // B-G-R, native win32 BMP format. - pix_format_rgba64, // R-G-B-A, 16 bits byte per color component - pix_format_argb64, // A-R-G-B, native MAC format - pix_format_abgr64, // A-B-G-R, one byte per color component - pix_format_bgra64, // B-G-R-A, native win32 BMP format - - end_of_pix_formats - }; - - //-------------------------------------------------------------input_flag_e - // Mouse and keyboard flags. They can be different on different platforms - // and the ways they are obtained are also different. But in any case - // the system dependent flags should be mapped into these ones. The meaning - // of that is as follows. For example, if kbd_ctrl is set it means that the - // ctrl key is pressed and being held at the moment. They are also used in - // the overridden methods such as on_mouse_move(), on_mouse_button_down(), - // on_mouse_button_dbl_click(), on_mouse_button_up(), on_key(). - // In the method on_mouse_button_up() the mouse flags have different - // meaning. They mean that the respective button is being released, but - // the meaning of the keyboard flags remains the same. - // There's absolut minimal set of flags is used because they'll be most - // probably supported on different platforms. Even the mouse_right flag - // is restricted because Mac's mice have only one button, but AFAIK - // it can be simulated with holding a special key on the keydoard. - enum input_flag_e - { - mouse_left = 1, - mouse_right = 2, - kbd_shift = 4, - kbd_ctrl = 8 - }; - - //--------------------------------------------------------------key_code_e - // Keyboard codes. There's also a restricted set of codes that are most - // probably supported on different platforms. Any platform dependent codes - // should be converted into these ones. There're only those codes are - // defined that cannot be represented as printable ASCII-characters. - // All printable ASCII-set can be used in a regular C/C++ manner: - // ' ', 'A', '0' '+' and so on. - // Since the class is used for creating very simple demo-applications - // we don't need very rich possibilities here, just basic ones. - // Actually the numeric key codes are taken from the SDL library, so, - // the implementation of the SDL support does not require any mapping. - enum key_code_e - { - // ASCII set. Should be supported everywhere - key_backspace = 8, - key_tab = 9, - key_clear = 12, - key_return = 13, - key_pause = 19, - key_escape = 27, - - // Keypad - key_delete = 127, - key_kp0 = 256, - key_kp1 = 257, - key_kp2 = 258, - key_kp3 = 259, - key_kp4 = 260, - key_kp5 = 261, - key_kp6 = 262, - key_kp7 = 263, - key_kp8 = 264, - key_kp9 = 265, - key_kp_period = 266, - key_kp_divide = 267, - key_kp_multiply = 268, - key_kp_minus = 269, - key_kp_plus = 270, - key_kp_enter = 271, - key_kp_equals = 272, - - // Arrow-keys and stuff - key_up = 273, - key_down = 274, - key_right = 275, - key_left = 276, - key_insert = 277, - key_home = 278, - key_end = 279, - key_page_up = 280, - key_page_down = 281, - - // Functional keys. You'd better avoid using - // f11...f15 in your applications if you want - // the applications to be portable - key_f1 = 282, - key_f2 = 283, - key_f3 = 284, - key_f4 = 285, - key_f5 = 286, - key_f6 = 287, - key_f7 = 288, - key_f8 = 289, - key_f9 = 290, - key_f10 = 291, - key_f11 = 292, - key_f12 = 293, - key_f13 = 294, - key_f14 = 295, - key_f15 = 296, - - // The possibility of using these keys is - // very restricted. Actually it's guaranteed - // only in win32_api and win32_sdl implementations - key_numlock = 300, - key_capslock = 301, - key_scrollock = 302, - - // Phew! - end_of_key_codes - }; - - - //------------------------------------------------------------------------ - // A predeclaration of the platform dependent class. Since we do not - // know anything here the only we can have is just a pointer to this - // class as a data member. It should be created and destroyed explicitly - // in the constructor/destructor of the platform_support class. - // Although the pointer to platform_specific is public the application - // cannot have access to its members or methods since it does not know - // anything about them and it's a perfect incapsulation :-) - class platform_specific; - - - //----------------------------------------------------------ctrl_container - // A helper class that contains pointers to a number of controls. - // This class is used to ease the event handling with controls. - // The implementation should simply call the appropriate methods - // of this class when appropriate events occur. - class ctrl_container - { - enum max_ctrl_e { max_ctrl = 64 }; - - public: - //-------------------------------------------------------------------- - ctrl_container() : m_num_ctrl(0), m_cur_ctrl(-1) {} - - //-------------------------------------------------------------------- - void add(ctrl& c) - { - if(m_num_ctrl < max_ctrl) - { - m_ctrl[m_num_ctrl++] = &c; - } - } - - //-------------------------------------------------------------------- - bool in_rect(double x, double y) - { - unsigned i; - for(i = 0; i < m_num_ctrl; i++) - { - if(m_ctrl[i]->in_rect(x, y)) return true; - } - return false; - } - - //-------------------------------------------------------------------- - bool on_mouse_button_down(double x, double y) - { - unsigned i; - for(i = 0; i < m_num_ctrl; i++) - { - if(m_ctrl[i]->on_mouse_button_down(x, y)) return true; - } - return false; - } - - //-------------------------------------------------------------------- - bool on_mouse_button_up(double x, double y) - { - unsigned i; - bool flag = false; - for(i = 0; i < m_num_ctrl; i++) - { - if(m_ctrl[i]->on_mouse_button_up(x, y)) flag = true; - } - return flag; - } - - //-------------------------------------------------------------------- - bool on_mouse_move(double x, double y, bool button_flag) - { - unsigned i; - for(i = 0; i < m_num_ctrl; i++) - { - if(m_ctrl[i]->on_mouse_move(x, y, button_flag)) return true; - } - return false; - } - - //-------------------------------------------------------------------- - bool on_arrow_keys(bool left, bool right, bool down, bool up) - { - if(m_cur_ctrl >= 0) - { - return m_ctrl[m_cur_ctrl]->on_arrow_keys(left, right, down, up); - } - return false; - } - - //-------------------------------------------------------------------- - bool set_cur(double x, double y) - { - unsigned i; - for(i = 0; i < m_num_ctrl; i++) - { - if(m_ctrl[i]->in_rect(x, y)) - { - if(m_cur_ctrl != int(i)) - { - m_cur_ctrl = i; - return true; - } - return false; - } - } - if(m_cur_ctrl != -1) - { - m_cur_ctrl = -1; - return true; - } - return false; - } - - private: - ctrl* m_ctrl[max_ctrl]; - unsigned m_num_ctrl; - int m_cur_ctrl; - }; - - - - //---------------------------------------------------------platform_support - // This class is a base one to the apllication classes. It can be used - // as follows: - // - // class the_application : public agg::platform_support - // { - // public: - // the_application(unsigned bpp, bool flip_y) : - // platform_support(bpp, flip_y) - // . . . - // - // //override stuff . . . - // virtual void on_init() - // { - // . . . - // } - // - // virtual void on_draw() - // { - // . . . - // } - // - // virtual void on_resize(int sx, int sy) - // { - // . . . - // } - // // . . . and so on, see virtual functions - // - // - // //any your own stuff . . . - // }; - // - // - // int agg_main(int argc, char* argv[]) - // { - // the_application app(pix_format_rgb24, true); - // app.caption("AGG Example. Lion"); - // - // if(app.init(500, 400, agg::window_resize)) - // { - // return app.run(); - // } - // return 1; - // } - // - // The reason to have agg_main() instead of just main() is that SDL - // for Windows requires including SDL.h if you define main(). Since - // the demo applications cannot rely on any platform/library specific - // stuff it's impossible to include SDL.h into the application files. - // The demo applications are simple and their use is restricted, so, - // this approach is quite reasonable. - // - class platform_support - { - public: - enum max_images_e { max_images = 16 }; - - // format - see enum pix_format_e {}; - // flip_y - true if you want to have the Y-axis flipped vertically. - platform_support(pix_format_e format, bool flip_y); - virtual ~platform_support(); - - // Setting the windows caption (title). Should be able - // to be called at least before calling init(). - // It's perfect if they can be called anytime. - void caption(const char* cap); - const char* caption() const { return m_caption; } - - //-------------------------------------------------------------------- - // These 3 methods handle working with images. The image - // formats are the simplest ones, such as .BMP in Windows or - // .ppm in Linux. In the applications the names of the files - // should not have any file extensions. Method load_img() can - // be called before init(), so, the application could be able - // to determine the initial size of the window depending on - // the size of the loaded image. - // The argument "idx" is the number of the image 0...max_images-1 - bool load_img(unsigned idx, const char* file); - bool save_img(unsigned idx, const char* file); - bool create_img(unsigned idx, unsigned width=0, unsigned height=0); - - //-------------------------------------------------------------------- - // init() and run(). See description before the class for details. - // The necessity of calling init() after creation is that it's - // impossible to call the overridden virtual function (on_init()) - // from the constructor. On the other hand it's very useful to have - // some on_init() event handler when the window is created but - // not yet displayed. The rbuf_window() method (see below) is - // accessible from on_init(). - bool init(unsigned width, unsigned height, unsigned flags); - int run(); - - //-------------------------------------------------------------------- - // The very same parameters that were used in the constructor - pix_format_e format() const { return m_format; } - bool flip_y() const { return m_flip_y; } - unsigned bpp() const { return m_bpp; } - - //-------------------------------------------------------------------- - // The following provides a very simple mechanism of doing someting - // in background. It's not multithreading. When wait_mode is true - // the class waits for the events and it does not ever call on_idle(). - // When it's false it calls on_idle() when the event queue is empty. - // The mode can be changed anytime. This mechanism is satisfactory - // to create very simple animations. - bool wait_mode() const { return m_wait_mode; } - void wait_mode(bool wait_mode) { m_wait_mode = wait_mode; } - - //-------------------------------------------------------------------- - // These two functions control updating of the window. - // force_redraw() is an analog of the Win32 InvalidateRect() function. - // Being called it sets a flag (or sends a message) which results - // in calling on_draw() and updating the content of the window - // when the next event cycle comes. - // update_window() results in just putting immediately the content - // of the currently rendered buffer to the window without calling - // on_draw(). - void force_redraw(); - void update_window(); - - //-------------------------------------------------------------------- - // So, finally, how to draw anythig with AGG? Very simple. - // rbuf_window() returns a reference to the main rendering - // buffer which can be attached to any rendering class. - // rbuf_img() returns a reference to the previously created - // or loaded image buffer (see load_img()). The image buffers - // are not displayed directly, they should be copied to or - // combined somehow with the rbuf_window(). rbuf_window() is - // the only buffer that can be actually displayed. - rendering_buffer& rbuf_window() { return m_rbuf_window; } - rendering_buffer& rbuf_img(unsigned idx) { return m_rbuf_img[idx]; } - - - //-------------------------------------------------------------------- - // Returns file extension used in the implementation for the particular - // system. - const char* img_ext() const; - - //-------------------------------------------------------------------- - void copy_img_to_window(unsigned idx) - { - if(idx < max_images && rbuf_img(idx).buf()) - { - rbuf_window().copy_from(rbuf_img(idx)); - } - } - - //-------------------------------------------------------------------- - void copy_window_to_img(unsigned idx) - { - if(idx < max_images) - { - create_img(idx, rbuf_window().width(), rbuf_window().height()); - rbuf_img(idx).copy_from(rbuf_window()); - } - } - - //-------------------------------------------------------------------- - void copy_img_to_img(unsigned idx_to, unsigned idx_from) - { - if(idx_from < max_images && - idx_to < max_images && - rbuf_img(idx_from).buf()) - { - create_img(idx_to, - rbuf_img(idx_from).width(), - rbuf_img(idx_from).height()); - rbuf_img(idx_to).copy_from(rbuf_img(idx_from)); - } - } - - //-------------------------------------------------------------------- - // Event handlers. They are not pure functions, so you don't have - // to override them all. - // In my demo applications these functions are defined inside - // the the_application class (implicit inlining) which is in general - // very bad practice, I mean vitual inline methods. At least it does - // not make sense. - // But in this case it's quite appropriate bacause we have the only - // instance of the the_application class and it is in the same file - // where this class is defined. - virtual void on_init(); - virtual void on_resize(int sx, int sy); - virtual void on_idle(); - virtual void on_mouse_move(int x, int y, unsigned flags); - virtual void on_mouse_button_down(int x, int y, unsigned flags); - virtual void on_mouse_button_up(int x, int y, unsigned flags); - virtual void on_key(int x, int y, unsigned key, unsigned flags); - virtual void on_ctrl_change(); - virtual void on_draw(); - virtual void on_post_draw(void* raw_handler); - - //-------------------------------------------------------------------- - // Adding control elements. A control element once added will be - // working and reacting to the mouse and keyboard events. Still, you - // will have to render them in the on_draw() using function - // render_ctrl() because platform_support doesn't know anything about - // renderers you use. The controls will be also scaled automatically - // if they provide a proper scaling mechanism (all the controls - // included into the basic AGG package do). - // If you don't need a particular control to be scaled automatically - // call ctrl::no_transform() after adding. - void add_ctrl(ctrl& c) { m_ctrls.add(c); c.transform(m_resize_mtx); } - - //-------------------------------------------------------------------- - // Auxiliary functions. trans_affine_resizing() modifier sets up the resizing - // matrix on the basis of the given width and height and the initial - // width and height of the window. The implementation should simply - // call this function every time when it catches the resizing event - // passing in the new values of width and height of the window. - // Nothing prevents you from "cheating" the scaling matrix if you - // call this function from somewhere with wrong arguments. - // trans_affine_resizing() accessor simply returns current resizing matrix - // which can be used to apply additional scaling of any of your - // stuff when the window is being resized. - // width(), height(), initial_width(), and initial_height() must be - // clear to understand with no comments :-) - void trans_affine_resizing(int width, int height) - { - if(m_window_flags & window_keep_aspect_ratio) - { - //double sx = double(width) / double(m_initial_width); - //double sy = double(height) / double(m_initial_height); - //if(sy < sx) sx = sy; - //m_resize_mtx = trans_affine_scaling(sx, sx); - trans_viewport vp; - vp.preserve_aspect_ratio(0.5, 0.5, aspect_ratio_meet); - vp.device_viewport(0, 0, width, height); - vp.world_viewport(0, 0, m_initial_width, m_initial_height); - m_resize_mtx = vp.to_affine(); - } - else - { - m_resize_mtx = trans_affine_scaling( - double(width) / double(m_initial_width), - double(height) / double(m_initial_height)); - } - } - const trans_affine& trans_affine_resizing() const { return m_resize_mtx; } - double width() const { return m_rbuf_window.width(); } - double height() const { return m_rbuf_window.height(); } - double initial_width() const { return m_initial_width; } - double initial_height() const { return m_initial_height; } - unsigned window_flags() const { return m_window_flags; } - - //-------------------------------------------------------------------- - // Get raw display handler depending on the system. - // For win32 its an HDC, for other systems it can be a pointer to some - // structure. See the implementation files for detals. - // It's provided "as is", so, first you should check if it's not null. - // If it's null the raw_display_handler is not supported. Also, there's - // no guarantee that this function is implemented, so, in some - // implementations you may have simply an unresolved symbol when linking. - void* raw_display_handler(); - - //-------------------------------------------------------------------- - // display message box or print the message to the console - // (depending on implementation) - void message(const char* msg); - - //-------------------------------------------------------------------- - // Stopwatch functions. Function elapsed_time() returns time elapsed - // since the latest start_timer() invocation in millisecods. - // The resolutoin depends on the implementation. - // In Win32 it uses QueryPerformanceFrequency() / QueryPerformanceCounter(). - void start_timer(); - double elapsed_time() const; - - //-------------------------------------------------------------------- - // Get the full file name. In most cases it simply returns - // file_name. As it's appropriate in many systems if you open - // a file by its name without specifying the path, it tries to - // open it in the current directory. The demos usually expect - // all the supplementary files to be placed in the current - // directory, that is usually coincides with the directory where - // the the executable is. However, in some systems (BeOS) it's not so. - // For those kinds of systems full_file_name() can help access files - // preserving commonly used policy. - // So, it's a good idea to use in the demos the following: - // FILE* fd = fopen(full_file_name("some.file"), "r"); - // instead of - // FILE* fd = fopen("some.file", "r"); - const char* full_file_name(const char* file_name); - - public: - platform_specific* m_specific; - ctrl_container m_ctrls; - - // Sorry, I'm too tired to describe the private - // data membders. See the implementations for different - // platforms for details. - private: - platform_support(const platform_support&); - const platform_support& operator = (const platform_support&); - - pix_format_e m_format; - unsigned m_bpp; - rendering_buffer m_rbuf_window; - rendering_buffer m_rbuf_img[max_images]; - unsigned m_window_flags; - bool m_wait_mode; - bool m_flip_y; - char m_caption[256]; - int m_initial_width; - int m_initial_height; - trans_affine m_resize_mtx; - }; - - -} - -#endif - diff --git a/uppdev/agg24/agg_polygon_ctrl.cpp b/uppdev/agg24/agg_polygon_ctrl.cpp deleted file mode 100644 index 71d2f065b..000000000 --- a/uppdev/agg24/agg_polygon_ctrl.cpp +++ /dev/null @@ -1,332 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// classes polygon_ctrl_impl -// -//---------------------------------------------------------------------------- - -#include "agg_polygon_ctrl.h" - -namespace agg -{ - - polygon_ctrl_impl::polygon_ctrl_impl(unsigned np, double point_radius) : - ctrl(0, 0, 1, 1, false), - m_polygon(np * 2), - m_num_points(np), - m_node(-1), - m_edge(-1), - m_vs(&m_polygon[0], m_num_points, false), - m_stroke(m_vs), - m_point_radius(point_radius), - m_status(0), - m_dx(0.0), - m_dy(0.0), - m_in_polygon_check(true) - { - m_stroke.width(1.0); - } - - - void polygon_ctrl_impl::rewind(unsigned) - { - m_status = 0; - m_stroke.rewind(0); - } - - unsigned polygon_ctrl_impl::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_stop; - double r = m_point_radius; - if(m_status == 0) - { - cmd = m_stroke.vertex(x, y); - if(!is_stop(cmd)) - { - transform_xy(x, y); - return cmd; - } - if(m_node >= 0 && m_node == int(m_status)) r *= 1.2; - m_ellipse.init(xn(m_status), yn(m_status), r, r, 32); - ++m_status; - } - cmd = m_ellipse.vertex(x, y); - if(!is_stop(cmd)) - { - transform_xy(x, y); - return cmd; - } - if(m_status >= m_num_points) return path_cmd_stop; - if(m_node >= 0 && m_node == int(m_status)) r *= 1.2; - m_ellipse.init(xn(m_status), yn(m_status), r, r, 32); - ++m_status; - cmd = m_ellipse.vertex(x, y); - if(!is_stop(cmd)) - { - transform_xy(x, y); - } - return cmd; - } - - - bool polygon_ctrl_impl::check_edge(unsigned i, double x, double y) const - { - bool ret = false; - - unsigned n1 = i; - unsigned n2 = (i + m_num_points - 1) % m_num_points; - double x1 = xn(n1); - double y1 = yn(n1); - double x2 = xn(n2); - double y2 = yn(n2); - - double dx = x2 - x1; - double dy = y2 - y1; - - if(sqrt(dx*dx + dy*dy) > 0.0000001) - { - double x3 = x; - double y3 = y; - double x4 = x3 - dy; - double y4 = y3 + dx; - - double den = (y4-y3) * (x2-x1) - (x4-x3) * (y2-y1); - double u1 = ((x4-x3) * (y1-y3) - (y4-y3) * (x1-x3)) / den; - - double xi = x1 + u1 * (x2 - x1); - double yi = y1 + u1 * (y2 - y1); - - dx = xi - x; - dy = yi - y; - - if (u1 > 0.0 && u1 < 1.0 && sqrt(dx*dx + dy*dy) <= m_point_radius) - { - ret = true; - } - } - return ret; - } - - - - bool polygon_ctrl_impl::in_rect(double x, double y) const - { - return false; - } - - - bool polygon_ctrl_impl::on_mouse_button_down(double x, double y) - { - unsigned i; - bool ret = false; - m_node = -1; - m_edge = -1; - inverse_transform_xy(&x, &y); - for (i = 0; i < m_num_points; i++) - { - if(sqrt( (x-xn(i)) * (x-xn(i)) + (y-yn(i)) * (y-yn(i)) ) < m_point_radius) - { - m_dx = x - xn(i); - m_dy = y - yn(i); - m_node = int(i); - ret = true; - break; - } - } - - if(!ret) - { - for (i = 0; i < m_num_points; i++) - { - if(check_edge(i, x, y)) - { - m_dx = x; - m_dy = y; - m_edge = int(i); - ret = true; - break; - } - } - } - - if(!ret) - { - if(point_in_polygon(x, y)) - { - m_dx = x; - m_dy = y; - m_node = int(m_num_points); - ret = true; - } - } - return ret; - } - - - bool polygon_ctrl_impl::on_mouse_move(double x, double y, bool button_flag) - { - bool ret = false; - double dx; - double dy; - inverse_transform_xy(&x, &y); - if(m_node == int(m_num_points)) - { - dx = x - m_dx; - dy = y - m_dy; - unsigned i; - for(i = 0; i < m_num_points; i++) - { - xn(i) += dx; - yn(i) += dy; - } - m_dx = x; - m_dy = y; - ret = true; - } - else - { - if(m_edge >= 0) - { - unsigned n1 = m_edge; - unsigned n2 = (n1 + m_num_points - 1) % m_num_points; - dx = x - m_dx; - dy = y - m_dy; - xn(n1) += dx; - yn(n1) += dy; - xn(n2) += dx; - yn(n2) += dy; - m_dx = x; - m_dy = y; - ret = true; - } - else - { - if(m_node >= 0) - { - xn(m_node) = x - m_dx; - yn(m_node) = y - m_dy; - ret = true; - } - } - } - return ret; - } - - bool polygon_ctrl_impl::on_mouse_button_up(double x, double y) - { - bool ret = (m_node >= 0) || (m_edge >= 0); - m_node = -1; - m_edge = -1; - return ret; - } - - - bool polygon_ctrl_impl::on_arrow_keys(bool left, bool right, bool down, bool up) - { - return false; - } - - - //======= Crossings Multiply algorithm of InsideTest ======================== - // - // By Eric Haines, 3D/Eye Inc, erich@eye.com - // - // This version is usually somewhat faster than the original published in - // Graphics Gems IV; by turning the division for testing the X axis crossing - // into a tricky multiplication test this part of the test became faster, - // which had the additional effect of making the test for "both to left or - // both to right" a bit slower for triangles than simply computing the - // intersection each time. The main increase is in triangle testing speed, - // which was about 15% faster; all other polygon complexities were pretty much - // the same as before. On machines where division is very expensive (not the - // case on the HP 9000 series on which I tested) this test should be much - // faster overall than the old code. Your mileage may (in fact, will) vary, - // depending on the machine and the test data, but in general I believe this - // code is both shorter and faster. This test was inspired by unpublished - // Graphics Gems submitted by Joseph Samosky and Mark Haigh-Hutchinson. - // Related work by Samosky is in: - // - // Samosky, Joseph, "SectionView: A system for interactively specifying and - // visualizing sections through three-dimensional medical image data", - // M.S. Thesis, Department of Electrical Engineering and Computer Science, - // Massachusetts Institute of Technology, 1993. - // - // Shoot a test ray along +X axis. The strategy is to compare vertex Y values - // to the testing point's Y and quickly discard edges which are entirely to one - // side of the test ray. Note that CONVEX and WINDING code can be added as - // for the CrossingsTest() code; it is left out here for clarity. - // - // Input 2D polygon _pgon_ with _numverts_ number of vertices and test point - // _point_, returns 1 if inside, 0 if outside. - bool polygon_ctrl_impl::point_in_polygon(double tx, double ty) const - { - if(m_num_points < 3) return false; - if(!m_in_polygon_check) return false; - - unsigned j; - int yflag0, yflag1, inside_flag; - double vtx0, vty0, vtx1, vty1; - - vtx0 = xn(m_num_points - 1); - vty0 = yn(m_num_points - 1); - - // get test bit for above/below X axis - yflag0 = (vty0 >= ty); - - vtx1 = xn(0); - vty1 = yn(0); - - inside_flag = 0; - for (j = 1; j <= m_num_points; ++j) - { - yflag1 = (vty1 >= ty); - // Check if endpoints straddle (are on opposite sides) of X axis - // (i.e. the Y's differ); if so, +X ray could intersect this edge. - // The old test also checked whether the endpoints are both to the - // right or to the left of the test point. However, given the faster - // intersection point computation used below, this test was found to - // be a break-even proposition for most polygons and a loser for - // triangles (where 50% or more of the edges which survive this test - // will cross quadrants and so have to have the X intersection computed - // anyway). I credit Joseph Samosky with inspiring me to try dropping - // the "both left or both right" part of my code. - if (yflag0 != yflag1) - { - // Check intersection of pgon segment with +X ray. - // Note if >= point's X; if so, the ray hits it. - // The division operation is avoided for the ">=" test by checking - // the sign of the first vertex wrto the test point; idea inspired - // by Joseph Samosky's and Mark Haigh-Hutchinson's different - // polygon inclusion tests. - if ( ((vty1-ty) * (vtx0-vtx1) >= - (vtx1-tx) * (vty0-vty1)) == yflag1 ) - { - inside_flag ^= 1; - } - } - - // Move to the next pair of vertices, retaining info as possible. - yflag0 = yflag1; - vtx0 = vtx1; - vty0 = vty1; - - unsigned k = (j >= m_num_points) ? j - m_num_points : j; - vtx1 = xn(k); - vty1 = yn(k); - } - return inside_flag != 0; - } -} - diff --git a/uppdev/agg24/agg_polygon_ctrl.h b/uppdev/agg24/agg_polygon_ctrl.h deleted file mode 100644 index 6f465d96b..000000000 --- a/uppdev/agg24/agg_polygon_ctrl.h +++ /dev/null @@ -1,166 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// classes polygon_ctrl_impl, polygon_ctrl -// -//---------------------------------------------------------------------------- - -#ifndef POLYGON_CTRL_INCLUDED -#define POLYGON_CTRL_INCLUDED - -#include "agg_array.h" -#include "agg_conv_stroke.h" -#include "agg_ellipse.h" -#include "agg_color_rgba.h" -#include "agg_ctrl.h" - -namespace agg -{ - class simple_polygon_vertex_source - { - public: - simple_polygon_vertex_source(const double* polygon, unsigned np, - bool roundoff = false, - bool close = true) : - m_polygon(polygon), - m_num_points(np), - m_vertex(0), - m_roundoff(roundoff), - m_close(close) - { - } - - void close(bool f) { m_close = f; } - bool close() const { return m_close; } - - void rewind(unsigned) - { - m_vertex = 0; - } - - unsigned vertex(double* x, double* y) - { - if(m_vertex > m_num_points) return path_cmd_stop; - if(m_vertex == m_num_points) - { - ++m_vertex; - return path_cmd_end_poly | (m_close ? path_flags_close : 0); - } - *x = m_polygon[m_vertex * 2]; - *y = m_polygon[m_vertex * 2 + 1]; - if(m_roundoff) - { - *x = floor(*x) + 0.5; - *y = floor(*y) + 0.5; - } - ++m_vertex; - return (m_vertex == 1) ? path_cmd_move_to : path_cmd_line_to; - } - - private: - const double* m_polygon; - unsigned m_num_points; - unsigned m_vertex; - bool m_roundoff; - bool m_close; - }; - - - - - class polygon_ctrl_impl : public ctrl - { - public: - polygon_ctrl_impl(unsigned np, double point_radius=5); - - unsigned num_points() const { return m_num_points; } - double xn(unsigned n) const { return m_polygon[n * 2]; } - double yn(unsigned n) const { return m_polygon[n * 2 + 1]; } - double& xn(unsigned n) { return m_polygon[n * 2]; } - double& yn(unsigned n) { return m_polygon[n * 2 + 1]; } - - const double* polygon() const { return &m_polygon[0]; } - - void line_width(double w) { m_stroke.width(w); } - double line_width() const { return m_stroke.width(); } - - void point_radius(double r) { m_point_radius = r; } - double point_radius() const { return m_point_radius; } - - void in_polygon_check(bool f) { m_in_polygon_check = f; } - bool in_polygon_check() const { return m_in_polygon_check; } - - void close(bool f) { m_vs.close(f); } - bool close() const { return m_vs.close(); } - - // Vertex source interface - unsigned num_paths() { return 1; } - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - virtual bool in_rect(double x, double y) const; - virtual bool on_mouse_button_down(double x, double y); - virtual bool on_mouse_button_up(double x, double y); - virtual bool on_mouse_move(double x, double y, bool button_flag); - virtual bool on_arrow_keys(bool left, bool right, bool down, bool up); - - - private: - bool check_edge(unsigned i, double x, double y) const; - bool point_in_polygon(double x, double y) const; - - pod_array m_polygon; - unsigned m_num_points; - int m_node; - int m_edge; - simple_polygon_vertex_source m_vs; - conv_stroke m_stroke; - ellipse m_ellipse; - double m_point_radius; - unsigned m_status; - double m_dx; - double m_dy; - bool m_in_polygon_check; - }; - - - - //----------------------------------------------------------polygon_ctrl - template class polygon_ctrl : public polygon_ctrl_impl - { - public: - polygon_ctrl(unsigned np, double point_radius=5) : - polygon_ctrl_impl(np, point_radius), - m_color(rgba(0.0, 0.0, 0.0)) - { - } - - void line_color(const ColorT& c) { m_color = c; } - const ColorT& color(unsigned i) const { return m_color; } - - private: - polygon_ctrl(const polygon_ctrl&); - const polygon_ctrl& operator = (const polygon_ctrl&); - - ColorT m_color; - }; - - - - -} - -#endif - diff --git a/uppdev/agg24/agg_rasterizer_cells_aa.h b/uppdev/agg24/agg_rasterizer_cells_aa.h deleted file mode 100644 index 502765f08..000000000 --- a/uppdev/agg24/agg_rasterizer_cells_aa.h +++ /dev/null @@ -1,754 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// -// The author gratefully acknowleges the support of David Turner, -// Robert Wilhelm, and Werner Lemberg - the authors of the FreeType -// libray - in producing this work. See http://www.freetype.org for details. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Adaptation for 32-bit screen coordinates has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- -#ifndef AGG_RASTERIZER_CELLS_AA_INCLUDED -#define AGG_RASTERIZER_CELLS_AA_INCLUDED - -#include -#include -#include "agg_math.h" -#include "agg_array.h" - - -namespace agg -{ - - //-----------------------------------------------------rasterizer_cells_aa - // An internal class that implements the main rasterization algorithm. - // Used in the rasterizer. Should not be used direcly. - template class rasterizer_cells_aa - { - enum cell_block_scale_e - { - cell_block_shift = 12, - cell_block_size = 1 << cell_block_shift, - cell_block_mask = cell_block_size - 1, - cell_block_pool = 256, - cell_block_limit = 1024 - }; - - struct sorted_y - { - unsigned start; - unsigned num; - }; - - public: - typedef Cell cell_type; - typedef rasterizer_cells_aa self_type; - - ~rasterizer_cells_aa(); - rasterizer_cells_aa(); - - void reset(); - void style(const cell_type& style_cell); - void line(int x1, int y1, int x2, int y2); - - int min_x() const { return m_min_x; } - int min_y() const { return m_min_y; } - int max_x() const { return m_max_x; } - int max_y() const { return m_max_y; } - - void sort_cells(); - - unsigned total_cells() const - { - return m_num_cells; - } - - unsigned scanline_num_cells(unsigned y) const - { - return m_sorted_y[y - m_min_y].num; - } - - const cell_type* const* scanline_cells(unsigned y) const - { - return m_sorted_cells.data() + m_sorted_y[y - m_min_y].start; - } - - bool sorted() const { return m_sorted; } - - private: - rasterizer_cells_aa(const self_type&); - const self_type& operator = (const self_type&); - - void set_curr_cell(int x, int y); - void add_curr_cell(); - void render_hline(int ey, int x1, int y1, int x2, int y2); - void allocate_block(); - - private: - unsigned m_num_blocks; - unsigned m_max_blocks; - unsigned m_curr_block; - unsigned m_num_cells; - cell_type** m_cells; - cell_type* m_curr_cell_ptr; - pod_vector m_sorted_cells; - pod_vector m_sorted_y; - cell_type m_curr_cell; - cell_type m_style_cell; - int m_min_x; - int m_min_y; - int m_max_x; - int m_max_y; - bool m_sorted; - }; - - - - - //------------------------------------------------------------------------ - template - rasterizer_cells_aa::~rasterizer_cells_aa() - { - if(m_num_blocks) - { - cell_type** ptr = m_cells + m_num_blocks - 1; - while(m_num_blocks--) - { - pod_allocator::deallocate(*ptr, cell_block_size); - ptr--; - } - pod_allocator::deallocate(m_cells, m_max_blocks); - } - } - - //------------------------------------------------------------------------ - template - rasterizer_cells_aa::rasterizer_cells_aa() : - m_num_blocks(0), - m_max_blocks(0), - m_curr_block(0), - m_num_cells(0), - m_cells(0), - m_curr_cell_ptr(0), - m_sorted_cells(), - m_sorted_y(), - m_min_x(0x7FFFFFFF), - m_min_y(0x7FFFFFFF), - m_max_x(-0x7FFFFFFF), - m_max_y(-0x7FFFFFFF), - m_sorted(false) - { - m_style_cell.initial(); - m_curr_cell.initial(); - } - - //------------------------------------------------------------------------ - template - void rasterizer_cells_aa::reset() - { - m_num_cells = 0; - m_curr_block = 0; - m_curr_cell.initial(); - m_style_cell.initial(); - m_sorted = false; - m_min_x = 0x7FFFFFFF; - m_min_y = 0x7FFFFFFF; - m_max_x = -0x7FFFFFFF; - m_max_y = -0x7FFFFFFF; - } - - //------------------------------------------------------------------------ - template - AGG_INLINE void rasterizer_cells_aa::add_curr_cell() - { - if(m_curr_cell.area | m_curr_cell.cover) - { - if((m_num_cells & cell_block_mask) == 0) - { - if(m_num_blocks >= cell_block_limit) return; - allocate_block(); - } - *m_curr_cell_ptr++ = m_curr_cell; - ++m_num_cells; - } - } - - //------------------------------------------------------------------------ - template - AGG_INLINE void rasterizer_cells_aa::set_curr_cell(int x, int y) - { - if(m_curr_cell.not_equal(x, y, m_style_cell)) - { - add_curr_cell(); - m_curr_cell.style(m_style_cell); - m_curr_cell.x = x; - m_curr_cell.y = y; - m_curr_cell.cover = 0; - m_curr_cell.area = 0; - } - } - - //------------------------------------------------------------------------ - template - AGG_INLINE void rasterizer_cells_aa::render_hline(int ey, - int x1, int y1, - int x2, int y2) - { - int ex1 = x1 >> poly_subpixel_shift; - int ex2 = x2 >> poly_subpixel_shift; - int fx1 = x1 & poly_subpixel_mask; - int fx2 = x2 & poly_subpixel_mask; - - int delta, p, first, dx; - int incr, lift, mod, rem; - - //trivial case. Happens often - if(y1 == y2) - { - set_curr_cell(ex2, ey); - return; - } - - //everything is located in a single cell. That is easy! - if(ex1 == ex2) - { - delta = y2 - y1; - m_curr_cell.cover += delta; - m_curr_cell.area += (fx1 + fx2) * delta; - return; - } - - //ok, we'll have to render a run of adjacent cells on the same - //hline... - p = (poly_subpixel_scale - fx1) * (y2 - y1); - first = poly_subpixel_scale; - incr = 1; - - dx = x2 - x1; - - if(dx < 0) - { - p = fx1 * (y2 - y1); - first = 0; - incr = -1; - dx = -dx; - } - - delta = p / dx; - mod = p % dx; - - if(mod < 0) - { - delta--; - mod += dx; - } - - m_curr_cell.cover += delta; - m_curr_cell.area += (fx1 + first) * delta; - - ex1 += incr; - set_curr_cell(ex1, ey); - y1 += delta; - - if(ex1 != ex2) - { - p = poly_subpixel_scale * (y2 - y1 + delta); - lift = p / dx; - rem = p % dx; - - if (rem < 0) - { - lift--; - rem += dx; - } - - mod -= dx; - - while (ex1 != ex2) - { - delta = lift; - mod += rem; - if(mod >= 0) - { - mod -= dx; - delta++; - } - - m_curr_cell.cover += delta; - m_curr_cell.area += poly_subpixel_scale * delta; - y1 += delta; - ex1 += incr; - set_curr_cell(ex1, ey); - } - } - delta = y2 - y1; - m_curr_cell.cover += delta; - m_curr_cell.area += (fx2 + poly_subpixel_scale - first) * delta; - } - - //------------------------------------------------------------------------ - template - AGG_INLINE void rasterizer_cells_aa::style(const cell_type& style_cell) - { - m_style_cell.style(style_cell); - } - - //------------------------------------------------------------------------ - template - void rasterizer_cells_aa::line(int x1, int y1, int x2, int y2) - { - enum dx_limit_e { dx_limit = 16384 << poly_subpixel_shift }; - - int dx = x2 - x1; - - if(dx >= dx_limit || dx <= -dx_limit) - { - int cx = (x1 + x2) >> 1; - int cy = (y1 + y2) >> 1; - line(x1, y1, cx, cy); - line(cx, cy, x2, y2); - } - - int dy = y2 - y1; - int ex1 = x1 >> poly_subpixel_shift; - int ex2 = x2 >> poly_subpixel_shift; - int ey1 = y1 >> poly_subpixel_shift; - int ey2 = y2 >> poly_subpixel_shift; - int fy1 = y1 & poly_subpixel_mask; - int fy2 = y2 & poly_subpixel_mask; - - int x_from, x_to; - int p, rem, mod, lift, delta, first, incr; - - if(ex1 < m_min_x) m_min_x = ex1; - if(ex1 > m_max_x) m_max_x = ex1; - if(ey1 < m_min_y) m_min_y = ey1; - if(ey1 > m_max_y) m_max_y = ey1; - if(ex2 < m_min_x) m_min_x = ex2; - if(ex2 > m_max_x) m_max_x = ex2; - if(ey2 < m_min_y) m_min_y = ey2; - if(ey2 > m_max_y) m_max_y = ey2; - - set_curr_cell(ex1, ey1); - - //everything is on a single hline - if(ey1 == ey2) - { - render_hline(ey1, x1, fy1, x2, fy2); - return; - } - - //Vertical line - we have to calculate start and end cells, - //and then - the common values of the area and coverage for - //all cells of the line. We know exactly there's only one - //cell, so, we don't have to call render_hline(). - incr = 1; - if(dx == 0) - { - int ex = x1 >> poly_subpixel_shift; - int two_fx = (x1 - (ex << poly_subpixel_shift)) << 1; - int area; - - first = poly_subpixel_scale; - if(dy < 0) - { - first = 0; - incr = -1; - } - - x_from = x1; - - //render_hline(ey1, x_from, fy1, x_from, first); - delta = first - fy1; - m_curr_cell.cover += delta; - m_curr_cell.area += two_fx * delta; - - ey1 += incr; - set_curr_cell(ex, ey1); - - delta = first + first - poly_subpixel_scale; - area = two_fx * delta; - while(ey1 != ey2) - { - //render_hline(ey1, x_from, poly_subpixel_scale - first, x_from, first); - m_curr_cell.cover = delta; - m_curr_cell.area = area; - ey1 += incr; - set_curr_cell(ex, ey1); - } - //render_hline(ey1, x_from, poly_subpixel_scale - first, x_from, fy2); - delta = fy2 - poly_subpixel_scale + first; - m_curr_cell.cover += delta; - m_curr_cell.area += two_fx * delta; - return; - } - - //ok, we have to render several hlines - p = (poly_subpixel_scale - fy1) * dx; - first = poly_subpixel_scale; - - if(dy < 0) - { - p = fy1 * dx; - first = 0; - incr = -1; - dy = -dy; - } - - delta = p / dy; - mod = p % dy; - - if(mod < 0) - { - delta--; - mod += dy; - } - - x_from = x1 + delta; - render_hline(ey1, x1, fy1, x_from, first); - - ey1 += incr; - set_curr_cell(x_from >> poly_subpixel_shift, ey1); - - if(ey1 != ey2) - { - p = poly_subpixel_scale * dx; - lift = p / dy; - rem = p % dy; - - if(rem < 0) - { - lift--; - rem += dy; - } - mod -= dy; - - while(ey1 != ey2) - { - delta = lift; - mod += rem; - if (mod >= 0) - { - mod -= dy; - delta++; - } - - x_to = x_from + delta; - render_hline(ey1, x_from, poly_subpixel_scale - first, x_to, first); - x_from = x_to; - - ey1 += incr; - set_curr_cell(x_from >> poly_subpixel_shift, ey1); - } - } - render_hline(ey1, x_from, poly_subpixel_scale - first, x2, fy2); - } - - //------------------------------------------------------------------------ - template - void rasterizer_cells_aa::allocate_block() - { - if(m_curr_block >= m_num_blocks) - { - if(m_num_blocks >= m_max_blocks) - { - cell_type** new_cells = - pod_allocator::allocate(m_max_blocks + - cell_block_pool); - - if(m_cells) - { - memcpy(new_cells, m_cells, m_max_blocks * sizeof(cell_type*)); - pod_allocator::deallocate(m_cells, m_max_blocks); - } - m_cells = new_cells; - m_max_blocks += cell_block_pool; - } - - m_cells[m_num_blocks++] = - pod_allocator::allocate(cell_block_size); - - } - m_curr_cell_ptr = m_cells[m_curr_block++]; - } - - - - //------------------------------------------------------------------------ - template static AGG_INLINE void swap_cells(T* a, T* b) - { - T temp = *a; - *a = *b; - *b = temp; - } - - - //------------------------------------------------------------------------ - enum - { - qsort_threshold = 9 - }; - - - //------------------------------------------------------------------------ - template - void qsort_cells(Cell** start, unsigned num) - { - Cell** stack[80]; - Cell*** top; - Cell** limit; - Cell** base; - - limit = start + num; - base = start; - top = stack; - - for (;;) - { - int len = int(limit - base); - - Cell** i; - Cell** j; - Cell** pivot; - - if(len > qsort_threshold) - { - // we use base + len/2 as the pivot - pivot = base + len / 2; - swap_cells(base, pivot); - - i = base + 1; - j = limit - 1; - - // now ensure that *i <= *base <= *j - if((*j)->x < (*i)->x) - { - swap_cells(i, j); - } - - if((*base)->x < (*i)->x) - { - swap_cells(base, i); - } - - if((*j)->x < (*base)->x) - { - swap_cells(base, j); - } - - for(;;) - { - int x = (*base)->x; - do i++; while( (*i)->x < x ); - do j--; while( x < (*j)->x ); - - if(i > j) - { - break; - } - - swap_cells(i, j); - } - - swap_cells(base, j); - - // now, push the largest sub-array - if(j - base > limit - i) - { - top[0] = base; - top[1] = j; - base = i; - } - else - { - top[0] = i; - top[1] = limit; - limit = j; - } - top += 2; - } - else - { - // the sub-array is small, perform insertion sort - j = base; - i = j + 1; - - for(; i < limit; j = i, i++) - { - for(; j[1]->x < (*j)->x; j--) - { - swap_cells(j + 1, j); - if (j == base) - { - break; - } - } - } - - if(top > stack) - { - top -= 2; - base = top[0]; - limit = top[1]; - } - else - { - break; - } - } - } - } - - - //------------------------------------------------------------------------ - template - void rasterizer_cells_aa::sort_cells() - { - if(m_sorted) return; //Perform sort only the first time. - - add_curr_cell(); - m_curr_cell.x = 0x7FFFFFFF; - m_curr_cell.y = 0x7FFFFFFF; - m_curr_cell.cover = 0; - m_curr_cell.area = 0; - - if(m_num_cells == 0) return; - -// DBG: Check to see if min/max works well. -//for(unsigned nc = 0; nc < m_num_cells; nc++) -//{ -// cell_type* cell = m_cells[nc >> cell_block_shift] + (nc & cell_block_mask); -// if(cell->x < m_min_x || -// cell->y < m_min_y || -// cell->x > m_max_x || -// cell->y > m_max_y) -// { -// cell = cell; // Breakpoint here -// } -//} - // Allocate the array of cell pointers - m_sorted_cells.allocate(m_num_cells, 16); - - // Allocate and zero the Y array - m_sorted_y.allocate(m_max_y - m_min_y + 1, 16); - m_sorted_y.zero(); - - // Create the Y-histogram (count the numbers of cells for each Y) - cell_type** block_ptr = m_cells; - cell_type* cell_ptr; - unsigned nb = m_num_cells >> cell_block_shift; - unsigned i; - while(nb--) - { - cell_ptr = *block_ptr++; - i = cell_block_size; - while(i--) - { - m_sorted_y[cell_ptr->y - m_min_y].start++; - ++cell_ptr; - } - } - - cell_ptr = *block_ptr++; - i = m_num_cells & cell_block_mask; - while(i--) - { - m_sorted_y[cell_ptr->y - m_min_y].start++; - ++cell_ptr; - } - - // Convert the Y-histogram into the array of starting indexes - unsigned start = 0; - for(i = 0; i < m_sorted_y.size(); i++) - { - unsigned v = m_sorted_y[i].start; - m_sorted_y[i].start = start; - start += v; - } - - // Fill the cell pointer array sorted by Y - block_ptr = m_cells; - nb = m_num_cells >> cell_block_shift; - while(nb--) - { - cell_ptr = *block_ptr++; - i = cell_block_size; - while(i--) - { - sorted_y& curr_y = m_sorted_y[cell_ptr->y - m_min_y]; - m_sorted_cells[curr_y.start + curr_y.num] = cell_ptr; - ++curr_y.num; - ++cell_ptr; - } - } - - cell_ptr = *block_ptr++; - i = m_num_cells & cell_block_mask; - while(i--) - { - sorted_y& curr_y = m_sorted_y[cell_ptr->y - m_min_y]; - m_sorted_cells[curr_y.start + curr_y.num] = cell_ptr; - ++curr_y.num; - ++cell_ptr; - } - - // Finally arrange the X-arrays - for(i = 0; i < m_sorted_y.size(); i++) - { - const sorted_y& curr_y = m_sorted_y[i]; - if(curr_y.num) - { - qsort_cells(m_sorted_cells.data() + curr_y.start, curr_y.num); - } - } - m_sorted = true; - } - - - - //------------------------------------------------------scanline_hit_test - class scanline_hit_test - { - public: - scanline_hit_test(int x) : m_x(x), m_hit(false) {} - - void reset_spans() {} - void finalize(int) {} - void add_cell(int x, int) - { - if(m_x == x) m_hit = true; - } - void add_span(int x, int len, int) - { - if(m_x >= x && m_x < x+len) m_hit = true; - } - unsigned num_spans() const { return 1; } - bool hit() const { return m_hit; } - - private: - int m_x; - bool m_hit; - }; - - -} - -#endif diff --git a/uppdev/agg24/agg_rasterizer_compound_aa.h b/uppdev/agg24/agg_rasterizer_compound_aa.h deleted file mode 100644 index 15b88b545..000000000 --- a/uppdev/agg24/agg_rasterizer_compound_aa.h +++ /dev/null @@ -1,698 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.3 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// -// The author gratefully acknowleges the support of David Turner, -// Robert Wilhelm, and Werner Lemberg - the authors of the FreeType -// libray - in producing this work. See http://www.freetype.org for details. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Adaptation for 32-bit screen coordinates has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- -#ifndef AGG_RASTERIZER_COMPOUND_AA_INCLUDED -#define AGG_RASTERIZER_COMPOUND_AA_INCLUDED - -#include "agg_rasterizer_cells_aa.h" -#include "agg_rasterizer_sl_clip.h" - -namespace agg -{ - - //-----------------------------------------------------------cell_style_aa - // A pixel cell. There're no constructors defined and it was done - // intentionally in order to avoid extra overhead when allocating an - // array of cells. - struct cell_style_aa - { - int x; - int y; - int cover; - int area; - int16 left, right; - - void initial() - { - x = 0x7FFFFFFF; - y = 0x7FFFFFFF; - cover = 0; - area = 0; - left = -1; - right = -1; - } - - void style(const cell_style_aa& c) - { - left = c.left; - right = c.right; - } - - int not_equal(int ex, int ey, const cell_style_aa& c) const - { - return (ex - x) | (ey - y) | (left - c.left) | (right - c.right); - } - }; - - - //===========================================================layer_order_e - enum layer_order_e - { - layer_unsorted, //------layer_unsorted - layer_direct, //------layer_direct - layer_inverse //------layer_inverse - }; - - - //==================================================rasterizer_compound_aa - template class rasterizer_compound_aa - { - struct style_info - { - unsigned start_cell; - unsigned num_cells; - int last_x; - }; - - struct cell_info - { - int x, area, cover; - }; - - public: - typedef Clip clip_type; - typedef typename Clip::conv_type conv_type; - typedef typename Clip::coord_type coord_type; - - enum aa_scale_e - { - aa_shift = 8, - aa_scale = 1 << aa_shift, - aa_mask = aa_scale - 1, - aa_scale2 = aa_scale * 2, - aa_mask2 = aa_scale2 - 1 - }; - - //-------------------------------------------------------------------- - rasterizer_compound_aa() : - m_outline(), - m_clipper(), - m_filling_rule(fill_non_zero), - m_layer_order(layer_direct), - m_styles(), // Active Styles - m_ast(), // Active Style Table (unique values) - m_asm(), // Active Style Mask - m_cells(), - m_cover_buf(), - m_master_alpha(), - m_min_style(0x7FFFFFFF), - m_max_style(-0x7FFFFFFF), - m_start_x(0), - m_start_y(0), - m_scan_y(0x7FFFFFFF), - m_sl_start(0), - m_sl_len(0) - {} - - //-------------------------------------------------------------------- - void reset(); - void reset_clipping(); - void clip_box(double x1, double y1, double x2, double y2); - void filling_rule(filling_rule_e filling_rule); - void layer_order(layer_order_e order); - void master_alpha(int style, double alpha); - - //-------------------------------------------------------------------- - void styles(int left, int right); - void move_to(int x, int y); - void line_to(int x, int y); - void move_to_d(double x, double y); - void line_to_d(double x, double y); - void add_vertex(double x, double y, unsigned cmd); - - void edge(int x1, int y1, int x2, int y2); - void edge_d(double x1, double y1, double x2, double y2); - - //------------------------------------------------------------------- - template - void add_path(VertexSource& vs, unsigned path_id=0) - { - double x; - double y; - - unsigned cmd; - vs.rewind(path_id); - if(m_outline.sorted()) reset(); - while(!is_stop(cmd = vs.vertex(&x, &y))) - { - add_vertex(x, y, cmd); - } - } - - - //-------------------------------------------------------------------- - int min_x() const { return m_outline.min_x(); } - int min_y() const { return m_outline.min_y(); } - int max_x() const { return m_outline.max_x(); } - int max_y() const { return m_outline.max_y(); } - int min_style() const { return m_min_style; } - int max_style() const { return m_max_style; } - - //-------------------------------------------------------------------- - void sort(); - bool rewind_scanlines(); - unsigned sweep_styles(); - int scanline_start() const { return m_sl_start; } - unsigned scanline_length() const { return m_sl_len; } - unsigned style(unsigned style_idx) const; - - cover_type* allocate_cover_buffer(unsigned len); - - //-------------------------------------------------------------------- - bool navigate_scanline(int y); - bool hit_test(int tx, int ty); - - //-------------------------------------------------------------------- - AGG_INLINE unsigned calculate_alpha(int area, unsigned master_alpha) const - { - int cover = area >> (poly_subpixel_shift*2 + 1 - aa_shift); - if(cover < 0) cover = -cover; - if(m_filling_rule == fill_even_odd) - { - cover &= aa_mask2; - if(cover > aa_scale) - { - cover = aa_scale2 - cover; - } - } - if(cover > aa_mask) cover = aa_mask; - return (cover * master_alpha + aa_mask) >> aa_shift; - } - - //-------------------------------------------------------------------- - // Sweeps one scanline with one style index. The style ID can be - // determined by calling style(). - template bool sweep_scanline(Scanline& sl, int style_idx) - { - int scan_y = m_scan_y - 1; - if(scan_y > m_outline.max_y()) return false; - - sl.reset_spans(); - - unsigned master_alpha = aa_mask; - - if(style_idx < 0) - { - style_idx = 0; - } - else - { - style_idx++; - master_alpha = m_master_alpha[m_ast[style_idx] + m_min_style - 1]; - } - - const style_info& st = m_styles[m_ast[style_idx]]; - - unsigned num_cells = st.num_cells; - cell_info* cell = &m_cells[st.start_cell]; - - int cover = 0; - while(num_cells--) - { - unsigned alpha; - int x = cell->x; - int area = cell->area; - - cover += cell->cover; - - ++cell; - - if(area) - { - alpha = calculate_alpha((cover << (poly_subpixel_shift + 1)) - area, - master_alpha); - sl.add_cell(x, alpha); - x++; - } - - if(num_cells && cell->x > x) - { - alpha = calculate_alpha(cover << (poly_subpixel_shift + 1), - master_alpha); - if(alpha) - { - sl.add_span(x, cell->x - x, alpha); - } - } - } - - if(sl.num_spans() == 0) return false; - sl.finalize(scan_y); - return true; - } - - private: - void add_style(int style_id); - void allocate_master_alpha(); - - //-------------------------------------------------------------------- - // Disable copying - rasterizer_compound_aa(const rasterizer_compound_aa&); - const rasterizer_compound_aa& - operator = (const rasterizer_compound_aa&); - - private: - rasterizer_cells_aa m_outline; - clip_type m_clipper; - filling_rule_e m_filling_rule; - layer_order_e m_layer_order; - pod_vector m_styles; // Active Styles - pod_vector m_ast; // Active Style Table (unique values) - pod_vector m_asm; // Active Style Mask - pod_vector m_cells; - pod_vector m_cover_buf; - pod_bvector m_master_alpha; - - int m_min_style; - int m_max_style; - coord_type m_start_x; - coord_type m_start_y; - int m_scan_y; - int m_sl_start; - unsigned m_sl_len; - }; - - - - - - - - - - - //------------------------------------------------------------------------ - template - void rasterizer_compound_aa::reset() - { - m_outline.reset(); - m_min_style = 0x7FFFFFFF; - m_max_style = -0x7FFFFFFF; - m_scan_y = 0x7FFFFFFF; - m_sl_start = 0; - m_sl_len = 0; - } - - //------------------------------------------------------------------------ - template - void rasterizer_compound_aa::filling_rule(filling_rule_e filling_rule) - { - m_filling_rule = filling_rule; - } - - //------------------------------------------------------------------------ - template - void rasterizer_compound_aa::layer_order(layer_order_e order) - { - m_layer_order = order; - } - - //------------------------------------------------------------------------ - template - void rasterizer_compound_aa::clip_box(double x1, double y1, - double x2, double y2) - { - reset(); - m_clipper.clip_box(conv_type::upscale(x1), conv_type::upscale(y1), - conv_type::upscale(x2), conv_type::upscale(y2)); - } - - //------------------------------------------------------------------------ - template - void rasterizer_compound_aa::reset_clipping() - { - reset(); - m_clipper.reset_clipping(); - } - - //------------------------------------------------------------------------ - template - void rasterizer_compound_aa::styles(int left, int right) - { - cell_style_aa cell; - cell.initial(); - cell.left = (int16)left; - cell.right = (int16)right; - m_outline.style(cell); - if(left >= 0 && left < m_min_style) m_min_style = left; - if(left >= 0 && left > m_max_style) m_max_style = left; - if(right >= 0 && right < m_min_style) m_min_style = right; - if(right >= 0 && right > m_max_style) m_max_style = right; - } - - //------------------------------------------------------------------------ - template - void rasterizer_compound_aa::move_to(int x, int y) - { - if(m_outline.sorted()) reset(); - m_clipper.move_to(m_start_x = conv_type::downscale(x), - m_start_y = conv_type::downscale(y)); - } - - //------------------------------------------------------------------------ - template - void rasterizer_compound_aa::line_to(int x, int y) - { - m_clipper.line_to(m_outline, - conv_type::downscale(x), - conv_type::downscale(y)); - } - - //------------------------------------------------------------------------ - template - void rasterizer_compound_aa::move_to_d(double x, double y) - { - if(m_outline.sorted()) reset(); - m_clipper.move_to(m_start_x = conv_type::upscale(x), - m_start_y = conv_type::upscale(y)); - } - - //------------------------------------------------------------------------ - template - void rasterizer_compound_aa::line_to_d(double x, double y) - { - m_clipper.line_to(m_outline, - conv_type::upscale(x), - conv_type::upscale(y)); - } - - //------------------------------------------------------------------------ - template - void rasterizer_compound_aa::add_vertex(double x, double y, unsigned cmd) - { - if(is_move_to(cmd)) - { - move_to_d(x, y); - } - else - if(is_vertex(cmd)) - { - line_to_d(x, y); - } - else - if(is_close(cmd)) - { - m_clipper.line_to(m_outline, m_start_x, m_start_y); - } - } - - //------------------------------------------------------------------------ - template - void rasterizer_compound_aa::edge(int x1, int y1, int x2, int y2) - { - if(m_outline.sorted()) reset(); - m_clipper.move_to(conv_type::downscale(x1), conv_type::downscale(y1)); - m_clipper.line_to(m_outline, - conv_type::downscale(x2), - conv_type::downscale(y2)); - } - - //------------------------------------------------------------------------ - template - void rasterizer_compound_aa::edge_d(double x1, double y1, - double x2, double y2) - { - if(m_outline.sorted()) reset(); - m_clipper.move_to(conv_type::upscale(x1), conv_type::upscale(y1)); - m_clipper.line_to(m_outline, - conv_type::upscale(x2), - conv_type::upscale(y2)); - } - - //------------------------------------------------------------------------ - template - AGG_INLINE void rasterizer_compound_aa::sort() - { - m_outline.sort_cells(); - } - - //------------------------------------------------------------------------ - template - AGG_INLINE bool rasterizer_compound_aa::rewind_scanlines() - { - m_outline.sort_cells(); - if(m_outline.total_cells() == 0) - { - return false; - } - if(m_max_style < m_min_style) - { - return false; - } - m_scan_y = m_outline.min_y(); - m_styles.allocate(m_max_style - m_min_style + 2, 128); - allocate_master_alpha(); - return true; - } - - //------------------------------------------------------------------------ - template - AGG_INLINE void rasterizer_compound_aa::add_style(int style_id) - { - if(style_id < 0) style_id = 0; - else style_id -= m_min_style - 1; - - unsigned nbyte = style_id >> 3; - unsigned mask = 1 << (style_id & 7); - - style_info* style = &m_styles[style_id]; - if((m_asm[nbyte] & mask) == 0) - { - m_ast.add(style_id); - m_asm[nbyte] |= mask; - style->start_cell = 0; - style->num_cells = 0; - style->last_x = -0x7FFFFFFF; - } - ++style->start_cell; - } - - //------------------------------------------------------------------------ - // Returns the number of styles - template - unsigned rasterizer_compound_aa::sweep_styles() - { - for(;;) - { - if(m_scan_y > m_outline.max_y()) return 0; - unsigned num_cells = m_outline.scanline_num_cells(m_scan_y); - const cell_style_aa* const* cells = m_outline.scanline_cells(m_scan_y); - unsigned num_styles = m_max_style - m_min_style + 2; - const cell_style_aa* curr_cell; - unsigned style_id; - style_info* style; - cell_info* cell; - - m_cells.allocate(num_cells * 2, 256); // Each cell can have two styles - m_ast.capacity(num_styles, 64); - m_asm.allocate((num_styles + 7) >> 3, 8); - m_asm.zero(); - - if(num_cells) - { - // Pre-add zero (for no-fill style, that is, -1). - // We need that to ensure that the "-1 style" would go first. - m_asm[0] |= 1; - m_ast.add(0); - style = &m_styles[0]; - style->start_cell = 0; - style->num_cells = 0; - style->last_x = -0x7FFFFFFF; - - m_sl_start = cells[0]->x; - m_sl_len = cells[num_cells-1]->x - m_sl_start + 1; - while(num_cells--) - { - curr_cell = *cells++; - add_style(curr_cell->left); - add_style(curr_cell->right); - } - - // Convert the Y-histogram into the array of starting indexes - unsigned i; - unsigned start_cell = 0; - for(i = 0; i < m_ast.size(); i++) - { - style_info& st = m_styles[m_ast[i]]; - unsigned v = st.start_cell; - st.start_cell = start_cell; - start_cell += v; - } - - cells = m_outline.scanline_cells(m_scan_y); - num_cells = m_outline.scanline_num_cells(m_scan_y); - - while(num_cells--) - { - curr_cell = *cells++; - style_id = (curr_cell->left < 0) ? 0 : - curr_cell->left - m_min_style + 1; - - style = &m_styles[style_id]; - if(curr_cell->x == style->last_x) - { - cell = &m_cells[style->start_cell + style->num_cells - 1]; - cell->area += curr_cell->area; - cell->cover += curr_cell->cover; - } - else - { - cell = &m_cells[style->start_cell + style->num_cells]; - cell->x = curr_cell->x; - cell->area = curr_cell->area; - cell->cover = curr_cell->cover; - style->last_x = curr_cell->x; - style->num_cells++; - } - - style_id = (curr_cell->right < 0) ? 0 : - curr_cell->right - m_min_style + 1; - - style = &m_styles[style_id]; - if(curr_cell->x == style->last_x) - { - cell = &m_cells[style->start_cell + style->num_cells - 1]; - cell->area -= curr_cell->area; - cell->cover -= curr_cell->cover; - } - else - { - cell = &m_cells[style->start_cell + style->num_cells]; - cell->x = curr_cell->x; - cell->area = -curr_cell->area; - cell->cover = -curr_cell->cover; - style->last_x = curr_cell->x; - style->num_cells++; - } - } - } - if(m_ast.size() > 1) break; - ++m_scan_y; - } - ++m_scan_y; - - if(m_layer_order != layer_unsorted) - { - range_adaptor > ra(m_ast, 1, m_ast.size() - 1); - if(m_layer_order == layer_direct) quick_sort(ra, unsigned_greater); - else quick_sort(ra, unsigned_less); - } - - return m_ast.size() - 1; - } - - //------------------------------------------------------------------------ - // Returns style ID depending of the existing style index - template - AGG_INLINE - unsigned rasterizer_compound_aa::style(unsigned style_idx) const - { - return m_ast[style_idx + 1] + m_min_style - 1; - } - - //------------------------------------------------------------------------ - template - AGG_INLINE bool rasterizer_compound_aa::navigate_scanline(int y) - { - m_outline.sort_cells(); - if(m_outline.total_cells() == 0) - { - return false; - } - if(m_max_style < m_min_style) - { - return false; - } - if(y < m_outline.min_y() || y > m_outline.max_y()) - { - return false; - } - m_scan_y = y; - m_styles.allocate(m_max_style - m_min_style + 2, 128); - allocate_master_alpha(); - return true; - } - - //------------------------------------------------------------------------ - template - bool rasterizer_compound_aa::hit_test(int tx, int ty) - { - if(!navigate_scanline(ty)) - { - return false; - } - - unsigned num_styles = sweep_styles(); - if(num_styles <= 0) - { - return false; - } - - scanline_hit_test sl(tx); - sweep_scanline(sl, -1); - return sl.hit(); - } - - //------------------------------------------------------------------------ - template - cover_type* rasterizer_compound_aa::allocate_cover_buffer(unsigned len) - { - m_cover_buf.allocate(len, 256); - return &m_cover_buf[0]; - } - - //------------------------------------------------------------------------ - template - void rasterizer_compound_aa::allocate_master_alpha() - { - while((int)m_master_alpha.size() <= m_max_style) - { - m_master_alpha.add(aa_mask); - } - } - - //------------------------------------------------------------------------ - template - void rasterizer_compound_aa::master_alpha(int style, double alpha) - { - if(style >= 0) - { - while((int)m_master_alpha.size() <= style) - { - m_master_alpha.add(aa_mask); - } - m_master_alpha[style] = uround(alpha * aa_mask); - } - } - -} - - - -#endif - diff --git a/uppdev/agg24/agg_rasterizer_outline.h b/uppdev/agg24/agg_rasterizer_outline.h deleted file mode 100644 index 65203e34c..000000000 --- a/uppdev/agg24/agg_rasterizer_outline.h +++ /dev/null @@ -1,147 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -#ifndef AGG_RASTERIZER_OUTLINE_INCLUDED -#define AGG_RASTERIZER_OUTLINE_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - //======================================================rasterizer_outline - template class rasterizer_outline - { - public: - explicit rasterizer_outline(Renderer& ren) : - m_ren(&ren), - m_start_x(0), - m_start_y(0), - m_vertices(0) - {} - void attach(Renderer& ren) { m_ren = &ren; } - - - //-------------------------------------------------------------------- - void move_to(int x, int y) - { - m_vertices = 1; - m_ren->move_to(m_start_x = x, m_start_y = y); - } - - //-------------------------------------------------------------------- - void line_to(int x, int y) - { - ++m_vertices; - m_ren->line_to(x, y); - } - - //-------------------------------------------------------------------- - void move_to_d(double x, double y) - { - move_to(m_ren->coord(x), m_ren->coord(y)); - } - - //-------------------------------------------------------------------- - void line_to_d(double x, double y) - { - line_to(m_ren->coord(x), m_ren->coord(y)); - } - - //-------------------------------------------------------------------- - void close() - { - if(m_vertices > 2) - { - line_to(m_start_x, m_start_y); - } - m_vertices = 0; - } - - //-------------------------------------------------------------------- - void add_vertex(double x, double y, unsigned cmd) - { - if(is_move_to(cmd)) - { - move_to_d(x, y); - } - else - { - if(is_end_poly(cmd)) - { - if(is_closed(cmd)) close(); - } - else - { - line_to_d(x, y); - } - } - } - - - //-------------------------------------------------------------------- - template - void add_path(VertexSource& vs, unsigned path_id=0) - { - double x; - double y; - - unsigned cmd; - vs.rewind(path_id); - while(!is_stop(cmd = vs.vertex(&x, &y))) - { - add_vertex(x, y, cmd); - } - } - - - //-------------------------------------------------------------------- - template - void render_all_paths(VertexSource& vs, - const ColorStorage& colors, - const PathId& path_id, - unsigned num_paths) - { - for(unsigned i = 0; i < num_paths; i++) - { - m_ren->line_color(colors[i]); - add_path(vs, path_id[i]); - } - } - - - //-------------------------------------------------------------------- - template void render_ctrl(Ctrl& c) - { - unsigned i; - for(i = 0; i < c.num_paths(); i++) - { - m_ren->line_color(c.color(i)); - add_path(c, i); - } - } - - - private: - Renderer* m_ren; - int m_start_x; - int m_start_y; - unsigned m_vertices; - }; - - -} - - -#endif - diff --git a/uppdev/agg24/agg_rasterizer_outline_aa.h b/uppdev/agg24/agg_rasterizer_outline_aa.h deleted file mode 100644 index a06bd1e84..000000000 --- a/uppdev/agg24/agg_rasterizer_outline_aa.h +++ /dev/null @@ -1,599 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -#ifndef AGG_RASTERIZER_OUTLINE_AA_INCLUDED -#define AGG_RASTERIZER_OUTLINE_AA_INCLUDED - -#include "agg_basics.h" -#include "agg_line_aa_basics.h" -#include "agg_vertex_sequence.h" - -namespace agg -{ - - //------------------------------------------------------------------------- - inline bool cmp_dist_start(int d) { return d > 0; } - inline bool cmp_dist_end(int d) { return d <= 0; } - - - - //-----------------------------------------------------------line_aa_vertex - // Vertex (x, y) with the distance to the next one. The last vertex has - // the distance between the last and the first points - struct line_aa_vertex - { - int x; - int y; - int len; - - line_aa_vertex() {} - line_aa_vertex(int x_, int y_) : - x(x_), - y(y_), - len(0) - { - } - - bool operator () (const line_aa_vertex& val) - { - double dx = val.x - x; - double dy = val.y - y; - return (len = uround(sqrt(dx * dx + dy * dy))) > - (line_subpixel_scale + line_subpixel_scale / 2); - } - }; - - - //----------------------------------------------------------outline_aa_join_e - enum outline_aa_join_e - { - outline_no_join, //-----outline_no_join - outline_miter_join, //-----outline_miter_join - outline_round_join, //-----outline_round_join - outline_miter_accurate_join //-----outline_accurate_join - }; - - //=======================================================rasterizer_outline_aa - template class rasterizer_outline_aa - { - private: - //------------------------------------------------------------------------ - struct draw_vars - { - unsigned idx; - int x1, y1, x2, y2; - line_parameters curr, next; - int lcurr, lnext; - int xb1, yb1, xb2, yb2; - unsigned flags; - }; - - void draw(draw_vars& dv, unsigned start, unsigned end); - - public: - typedef line_aa_vertex vertex_type; - typedef vertex_sequence vertex_storage_type; - - explicit rasterizer_outline_aa(Renderer& ren) : - m_ren(&ren), - m_line_join(ren.accurate_join_only() ? - outline_miter_accurate_join : - outline_round_join), - m_round_cap(false), - m_start_x(0), - m_start_y(0) - {} - void attach(Renderer& ren) { m_ren = &ren; } - - //------------------------------------------------------------------------ - void line_join(outline_aa_join_e join) - { - m_line_join = m_ren->accurate_join_only() ? - outline_miter_accurate_join : - join; - } - bool line_join() const { return m_line_join; } - - //------------------------------------------------------------------------ - void round_cap(bool v) { m_round_cap = v; } - bool round_cap() const { return m_round_cap; } - - //------------------------------------------------------------------------ - void move_to(int x, int y) - { - m_src_vertices.modify_last(vertex_type(m_start_x = x, m_start_y = y)); - } - - //------------------------------------------------------------------------ - void line_to(int x, int y) - { - m_src_vertices.add(vertex_type(x, y)); - } - - //------------------------------------------------------------------------ - void move_to_d(double x, double y) - { - move_to(Coord::conv(x), Coord::conv(y)); - } - - //------------------------------------------------------------------------ - void line_to_d(double x, double y) - { - line_to(Coord::conv(x), Coord::conv(y)); - } - - //------------------------------------------------------------------------ - void render(bool close_polygon); - - //------------------------------------------------------------------------ - void add_vertex(double x, double y, unsigned cmd) - { - if(is_move_to(cmd)) - { - render(false); - move_to_d(x, y); - } - else - { - if(is_end_poly(cmd)) - { - render(is_closed(cmd)); - if(is_closed(cmd)) - { - move_to(m_start_x, m_start_y); - } - } - else - { - line_to_d(x, y); - } - } - } - - //------------------------------------------------------------------------ - template - void add_path(VertexSource& vs, unsigned path_id=0) - { - double x; - double y; - - unsigned cmd; - vs.rewind(path_id); - while(!is_stop(cmd = vs.vertex(&x, &y))) - { - add_vertex(x, y, cmd); - } - render(false); - } - - - //------------------------------------------------------------------------ - template - void render_all_paths(VertexSource& vs, - const ColorStorage& colors, - const PathId& path_id, - unsigned num_paths) - { - for(unsigned i = 0; i < num_paths; i++) - { - m_ren->color(colors[i]); - add_path(vs, path_id[i]); - } - } - - - //------------------------------------------------------------------------ - template void render_ctrl(Ctrl& c) - { - unsigned i; - for(i = 0; i < c.num_paths(); i++) - { - m_ren->color(c.color(i)); - add_path(c, i); - } - } - - private: - rasterizer_outline_aa(const rasterizer_outline_aa&); - const rasterizer_outline_aa& operator = - (const rasterizer_outline_aa&); - - Renderer* m_ren; - vertex_storage_type m_src_vertices; - outline_aa_join_e m_line_join; - bool m_round_cap; - int m_start_x; - int m_start_y; - }; - - - - - - - - - //---------------------------------------------------------------------------- - template - void rasterizer_outline_aa::draw(draw_vars& dv, - unsigned start, - unsigned end) - { - unsigned i; - const vertex_storage_type::value_type* v; - - for(i = start; i < end; i++) - { - if(m_line_join == outline_round_join) - { - dv.xb1 = dv.curr.x1 + (dv.curr.y2 - dv.curr.y1); - dv.yb1 = dv.curr.y1 - (dv.curr.x2 - dv.curr.x1); - dv.xb2 = dv.curr.x2 + (dv.curr.y2 - dv.curr.y1); - dv.yb2 = dv.curr.y2 - (dv.curr.x2 - dv.curr.x1); - } - - switch(dv.flags) - { - case 0: m_ren->line3(dv.curr, dv.xb1, dv.yb1, dv.xb2, dv.yb2); break; - case 1: m_ren->line2(dv.curr, dv.xb2, dv.yb2); break; - case 2: m_ren->line1(dv.curr, dv.xb1, dv.yb1); break; - case 3: m_ren->line0(dv.curr); break; - } - - if(m_line_join == outline_round_join && (dv.flags & 2) == 0) - { - m_ren->pie(dv.curr.x2, dv.curr.y2, - dv.curr.x2 + (dv.curr.y2 - dv.curr.y1), - dv.curr.y2 - (dv.curr.x2 - dv.curr.x1), - dv.curr.x2 + (dv.next.y2 - dv.next.y1), - dv.curr.y2 - (dv.next.x2 - dv.next.x1)); - } - - dv.x1 = dv.x2; - dv.y1 = dv.y2; - dv.lcurr = dv.lnext; - dv.lnext = m_src_vertices[dv.idx].len; - - ++dv.idx; - if(dv.idx >= m_src_vertices.size()) dv.idx = 0; - - v = &m_src_vertices[dv.idx]; - dv.x2 = v->x; - dv.y2 = v->y; - - dv.curr = dv.next; - dv.next = line_parameters(dv.x1, dv.y1, dv.x2, dv.y2, dv.lnext); - dv.xb1 = dv.xb2; - dv.yb1 = dv.yb2; - - switch(m_line_join) - { - case outline_no_join: - dv.flags = 3; - break; - - case outline_miter_join: - dv.flags >>= 1; - dv.flags |= ((dv.curr.diagonal_quadrant() == - dv.next.diagonal_quadrant()) << 1); - if((dv.flags & 2) == 0) - { - bisectrix(dv.curr, dv.next, &dv.xb2, &dv.yb2); - } - break; - - case outline_round_join: - dv.flags >>= 1; - dv.flags |= ((dv.curr.diagonal_quadrant() == - dv.next.diagonal_quadrant()) << 1); - break; - - case outline_miter_accurate_join: - dv.flags = 0; - bisectrix(dv.curr, dv.next, &dv.xb2, &dv.yb2); - break; - } - } - } - - - - - //---------------------------------------------------------------------------- - template - void rasterizer_outline_aa::render(bool close_polygon) - { - m_src_vertices.close(close_polygon); - draw_vars dv; - const vertex_storage_type::value_type* v; - int x1; - int y1; - int x2; - int y2; - int lprev; - - if(close_polygon) - { - if(m_src_vertices.size() >= 3) - { - dv.idx = 2; - - v = &m_src_vertices[m_src_vertices.size() - 1]; - x1 = v->x; - y1 = v->y; - lprev = v->len; - - v = &m_src_vertices[0]; - x2 = v->x; - y2 = v->y; - dv.lcurr = v->len; - line_parameters prev(x1, y1, x2, y2, lprev); - - v = &m_src_vertices[1]; - dv.x1 = v->x; - dv.y1 = v->y; - dv.lnext = v->len; - dv.curr = line_parameters(x2, y2, dv.x1, dv.y1, dv.lcurr); - - v = &m_src_vertices[dv.idx]; - dv.x2 = v->x; - dv.y2 = v->y; - dv.next = line_parameters(dv.x1, dv.y1, dv.x2, dv.y2, dv.lnext); - - dv.xb1 = 0; - dv.yb1 = 0; - dv.xb2 = 0; - dv.yb2 = 0; - - switch(m_line_join) - { - case outline_no_join: - dv.flags = 3; - break; - - case outline_miter_join: - case outline_round_join: - dv.flags = - (prev.diagonal_quadrant() == dv.curr.diagonal_quadrant()) | - ((dv.curr.diagonal_quadrant() == dv.next.diagonal_quadrant()) << 1); - break; - - case outline_miter_accurate_join: - dv.flags = 0; - break; - } - - if((dv.flags & 1) == 0 && m_line_join != outline_round_join) - { - bisectrix(prev, dv.curr, &dv.xb1, &dv.yb1); - } - - if((dv.flags & 2) == 0 && m_line_join != outline_round_join) - { - bisectrix(dv.curr, dv.next, &dv.xb2, &dv.yb2); - } - draw(dv, 0, m_src_vertices.size()); - } - } - else - { - switch(m_src_vertices.size()) - { - case 0: - case 1: - break; - - case 2: - { - v = &m_src_vertices[0]; - x1 = v->x; - y1 = v->y; - lprev = v->len; - v = &m_src_vertices[1]; - x2 = v->x; - y2 = v->y; - line_parameters lp(x1, y1, x2, y2, lprev); - if(m_round_cap) - { - m_ren->semidot(cmp_dist_start, x1, y1, x1 + (y2 - y1), y1 - (x2 - x1)); - } - m_ren->line3(lp, - x1 + (y2 - y1), - y1 - (x2 - x1), - x2 + (y2 - y1), - y2 - (x2 - x1)); - if(m_round_cap) - { - m_ren->semidot(cmp_dist_end, x2, y2, x2 + (y2 - y1), y2 - (x2 - x1)); - } - } - break; - - case 3: - { - int x3, y3; - int lnext; - v = &m_src_vertices[0]; - x1 = v->x; - y1 = v->y; - lprev = v->len; - v = &m_src_vertices[1]; - x2 = v->x; - y2 = v->y; - lnext = v->len; - v = &m_src_vertices[2]; - x3 = v->x; - y3 = v->y; - line_parameters lp1(x1, y1, x2, y2, lprev); - line_parameters lp2(x2, y2, x3, y3, lnext); - - if(m_round_cap) - { - m_ren->semidot(cmp_dist_start, x1, y1, x1 + (y2 - y1), y1 - (x2 - x1)); - } - - if(m_line_join == outline_round_join) - { - m_ren->line3(lp1, x1 + (y2 - y1), y1 - (x2 - x1), - x2 + (y2 - y1), y2 - (x2 - x1)); - - m_ren->pie(x2, y2, x2 + (y2 - y1), y2 - (x2 - x1), - x2 + (y3 - y2), y2 - (x3 - x2)); - - m_ren->line3(lp2, x2 + (y3 - y2), y2 - (x3 - x2), - x3 + (y3 - y2), y3 - (x3 - x2)); - } - else - { - bisectrix(lp1, lp2, &dv.xb1, &dv.yb1); - m_ren->line3(lp1, x1 + (y2 - y1), y1 - (x2 - x1), - dv.xb1, dv.yb1); - - m_ren->line3(lp2, dv.xb1, dv.yb1, - x3 + (y3 - y2), y3 - (x3 - x2)); - } - if(m_round_cap) - { - m_ren->semidot(cmp_dist_end, x3, y3, x3 + (y3 - y2), y3 - (x3 - x2)); - } - } - break; - - default: - { - dv.idx = 3; - - v = &m_src_vertices[0]; - x1 = v->x; - y1 = v->y; - lprev = v->len; - - v = &m_src_vertices[1]; - x2 = v->x; - y2 = v->y; - dv.lcurr = v->len; - line_parameters prev(x1, y1, x2, y2, lprev); - - v = &m_src_vertices[2]; - dv.x1 = v->x; - dv.y1 = v->y; - dv.lnext = v->len; - dv.curr = line_parameters(x2, y2, dv.x1, dv.y1, dv.lcurr); - - v = &m_src_vertices[dv.idx]; - dv.x2 = v->x; - dv.y2 = v->y; - dv.next = line_parameters(dv.x1, dv.y1, dv.x2, dv.y2, dv.lnext); - - dv.xb1 = 0; - dv.yb1 = 0; - dv.xb2 = 0; - dv.yb2 = 0; - - switch(m_line_join) - { - case outline_no_join: - dv.flags = 3; - break; - - case outline_miter_join: - case outline_round_join: - dv.flags = - (prev.diagonal_quadrant() == dv.curr.diagonal_quadrant()) | - ((dv.curr.diagonal_quadrant() == dv.next.diagonal_quadrant()) << 1); - break; - - case outline_miter_accurate_join: - dv.flags = 0; - break; - } - - if(m_round_cap) - { - m_ren->semidot(cmp_dist_start, x1, y1, x1 + (y2 - y1), y1 - (x2 - x1)); - } - if((dv.flags & 1) == 0) - { - if(m_line_join == outline_round_join) - { - m_ren->line3(prev, x1 + (y2 - y1), y1 - (x2 - x1), - x2 + (y2 - y1), y2 - (x2 - x1)); - m_ren->pie(prev.x2, prev.y2, - x2 + (y2 - y1), y2 - (x2 - x1), - dv.curr.x1 + (dv.curr.y2 - dv.curr.y1), - dv.curr.y1 - (dv.curr.x2 - dv.curr.x1)); - } - else - { - bisectrix(prev, dv.curr, &dv.xb1, &dv.yb1); - m_ren->line3(prev, x1 + (y2 - y1), y1 - (x2 - x1), - dv.xb1, dv.yb1); - } - } - else - { - m_ren->line1(prev, - x1 + (y2 - y1), - y1 - (x2 - x1)); - } - if((dv.flags & 2) == 0 && m_line_join != outline_round_join) - { - bisectrix(dv.curr, dv.next, &dv.xb2, &dv.yb2); - } - - draw(dv, 1, m_src_vertices.size() - 2); - - if((dv.flags & 1) == 0) - { - if(m_line_join == outline_round_join) - { - m_ren->line3(dv.curr, - dv.curr.x1 + (dv.curr.y2 - dv.curr.y1), - dv.curr.y1 - (dv.curr.x2 - dv.curr.x1), - dv.curr.x2 + (dv.curr.y2 - dv.curr.y1), - dv.curr.y2 - (dv.curr.x2 - dv.curr.x1)); - } - else - { - m_ren->line3(dv.curr, dv.xb1, dv.yb1, - dv.curr.x2 + (dv.curr.y2 - dv.curr.y1), - dv.curr.y2 - (dv.curr.x2 - dv.curr.x1)); - } - } - else - { - m_ren->line2(dv.curr, - dv.curr.x2 + (dv.curr.y2 - dv.curr.y1), - dv.curr.y2 - (dv.curr.x2 - dv.curr.x1)); - } - if(m_round_cap) - { - m_ren->semidot(cmp_dist_end, dv.curr.x2, dv.curr.y2, - dv.curr.x2 + (dv.curr.y2 - dv.curr.y1), - dv.curr.y2 - (dv.curr.x2 - dv.curr.x1)); - } - - } - break; - } - } - m_src_vertices.remove_all(); - } - - -} - - -#endif - diff --git a/uppdev/agg24/agg_rasterizer_scanline_aa.h b/uppdev/agg24/agg_rasterizer_scanline_aa.h deleted file mode 100644 index 77bc41bc7..000000000 --- a/uppdev/agg24/agg_rasterizer_scanline_aa.h +++ /dev/null @@ -1,510 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// -// The author gratefully acknowleges the support of David Turner, -// Robert Wilhelm, and Werner Lemberg - the authors of the FreeType -// libray - in producing this work. See http://www.freetype.org for details. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Adaptation for 32-bit screen coordinates has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- -#ifndef AGG_RASTERIZER_SCANLINE_AA_INCLUDED -#define AGG_RASTERIZER_SCANLINE_AA_INCLUDED - -#include "agg_rasterizer_cells_aa.h" -#include "agg_rasterizer_sl_clip.h" -#include "agg_gamma_functions.h" - - -namespace agg -{ - - - //-----------------------------------------------------------------cell_aa - // A pixel cell. There're no constructors defined and it was done - // intentionally in order to avoid extra overhead when allocating an - // array of cells. - struct cell_aa - { - int x; - int y; - int cover; - int area; - - void initial() - { - x = 0x7FFFFFFF; - y = 0x7FFFFFFF; - cover = 0; - area = 0; - } - - void style(const cell_aa&) {} - - int not_equal(int ex, int ey, const cell_aa&) const - { - return (ex - x) | (ey - y); - } - }; - - - //==================================================rasterizer_scanline_aa - // Polygon rasterizer that is used to render filled polygons with - // high-quality Anti-Aliasing. Internally, by default, the class uses - // integer coordinates in format 24.8, i.e. 24 bits for integer part - // and 8 bits for fractional - see poly_subpixel_shift. This class can be - // used in the following way: - // - // 1. filling_rule(filling_rule_e ft) - optional. - // - // 2. gamma() - optional. - // - // 3. reset() - // - // 4. move_to(x, y) / line_to(x, y) - make the polygon. One can create - // more than one contour, but each contour must consist of at least 3 - // vertices, i.e. move_to(x1, y1); line_to(x2, y2); line_to(x3, y3); - // is the absolute minimum of vertices that define a triangle. - // The algorithm does not check either the number of vertices nor - // coincidence of their coordinates, but in the worst case it just - // won't draw anything. - // The orger of the vertices (clockwise or counterclockwise) - // is important when using the non-zero filling rule (fill_non_zero). - // In this case the vertex order of all the contours must be the same - // if you want your intersecting polygons to be without "holes". - // You actually can use different vertices order. If the contours do not - // intersect each other the order is not important anyway. If they do, - // contours with the same vertex order will be rendered without "holes" - // while the intersecting contours with different orders will have "holes". - // - // filling_rule() and gamma() can be called anytime before "sweeping". - //------------------------------------------------------------------------ - template class rasterizer_scanline_aa - { - enum status - { - status_initial, - status_move_to, - status_line_to, - status_closed - }; - - public: - typedef Clip clip_type; - typedef typename Clip::conv_type conv_type; - typedef typename Clip::coord_type coord_type; - - enum aa_scale_e - { - aa_shift = 8, - aa_scale = 1 << aa_shift, - aa_mask = aa_scale - 1, - aa_scale2 = aa_scale * 2, - aa_mask2 = aa_scale2 - 1 - }; - - //-------------------------------------------------------------------- - rasterizer_scanline_aa() : - m_outline(), - m_clipper(), - m_filling_rule(fill_non_zero), - m_auto_close(true), - m_start_x(0), - m_start_y(0), - m_status(status_initial) - { - int i; - for(i = 0; i < aa_scale; i++) m_gamma[i] = i; - } - - //-------------------------------------------------------------------- - template - rasterizer_scanline_aa(const GammaF& gamma_function) : - m_outline(), - m_clipper(m_outline), - m_filling_rule(fill_non_zero), - m_auto_close(true), - m_start_x(0), - m_start_y(0), - m_status(status_initial) - { - gamma(gamma_function); - } - - //-------------------------------------------------------------------- - void reset(); - void reset_clipping(); - void clip_box(double x1, double y1, double x2, double y2); - void filling_rule(filling_rule_e filling_rule); - void auto_close(bool flag) { m_auto_close = flag; } - - //-------------------------------------------------------------------- - template void gamma(const GammaF& gamma_function) - { - int i; - for(i = 0; i < aa_scale; i++) - { - m_gamma[i] = uround(gamma_function(double(i) / aa_mask) * aa_mask); - } - } - - //-------------------------------------------------------------------- - unsigned apply_gamma(unsigned cover) const - { - return m_gamma[cover]; - } - - //-------------------------------------------------------------------- - void move_to(int x, int y); - void line_to(int x, int y); - void move_to_d(double x, double y); - void line_to_d(double x, double y); - void close_polygon(); - void add_vertex(double x, double y, unsigned cmd); - - void edge(int x1, int y1, int x2, int y2); - void edge_d(double x1, double y1, double x2, double y2); - - //------------------------------------------------------------------- - template - void add_path(VertexSource& vs, unsigned path_id=0) - { - double x; - double y; - - unsigned cmd; - vs.rewind(path_id); - if(m_outline.sorted()) reset(); - while(!is_stop(cmd = vs.vertex(&x, &y))) - { - add_vertex(x, y, cmd); - } - } - - //-------------------------------------------------------------------- - int min_x() const { return m_outline.min_x(); } - int min_y() const { return m_outline.min_y(); } - int max_x() const { return m_outline.max_x(); } - int max_y() const { return m_outline.max_y(); } - - //-------------------------------------------------------------------- - void sort(); - bool rewind_scanlines(); - bool navigate_scanline(int y); - - //-------------------------------------------------------------------- - AGG_INLINE unsigned calculate_alpha(int area) const - { - int cover = area >> (poly_subpixel_shift*2 + 1 - aa_shift); - - if(cover < 0) cover = -cover; - if(m_filling_rule == fill_even_odd) - { - cover &= aa_mask2; - if(cover > aa_scale) - { - cover = aa_scale2 - cover; - } - } - if(cover > aa_mask) cover = aa_mask; - return m_gamma[cover]; - } - - //-------------------------------------------------------------------- - template bool sweep_scanline(Scanline& sl) - { - for(;;) - { - if(m_scan_y > m_outline.max_y()) return false; - sl.reset_spans(); - unsigned num_cells = m_outline.scanline_num_cells(m_scan_y); - const cell_aa* const* cells = m_outline.scanline_cells(m_scan_y); - int cover = 0; - - while(num_cells) - { - const cell_aa* cur_cell = *cells; - int x = cur_cell->x; - int area = cur_cell->area; - unsigned alpha; - - cover += cur_cell->cover; - - //accumulate all cells with the same X - while(--num_cells) - { - cur_cell = *++cells; - if(cur_cell->x != x) break; - area += cur_cell->area; - cover += cur_cell->cover; - } - - if(area) - { - alpha = calculate_alpha((cover << (poly_subpixel_shift + 1)) - area); - if(alpha) - { - sl.add_cell(x, alpha); - } - x++; - } - - if(num_cells && cur_cell->x > x) - { - alpha = calculate_alpha(cover << (poly_subpixel_shift + 1)); - if(alpha) - { - sl.add_span(x, cur_cell->x - x, alpha); - } - } - } - - if(sl.num_spans()) break; - ++m_scan_y; - } - - sl.finalize(m_scan_y); - ++m_scan_y; - return true; - } - - //-------------------------------------------------------------------- - bool hit_test(int tx, int ty); - - - private: - //-------------------------------------------------------------------- - // Disable copying - rasterizer_scanline_aa(const rasterizer_scanline_aa&); - const rasterizer_scanline_aa& - operator = (const rasterizer_scanline_aa&); - - private: - rasterizer_cells_aa m_outline; - clip_type m_clipper; - int m_gamma[aa_scale]; - filling_rule_e m_filling_rule; - bool m_auto_close; - coord_type m_start_x; - coord_type m_start_y; - unsigned m_status; - int m_scan_y; - }; - - - - - - - - - - - - - //------------------------------------------------------------------------ - template - void rasterizer_scanline_aa::reset() - { - m_outline.reset(); - m_status = status_initial; - } - - //------------------------------------------------------------------------ - template - void rasterizer_scanline_aa::filling_rule(filling_rule_e filling_rule) - { - m_filling_rule = filling_rule; - } - - //------------------------------------------------------------------------ - template - void rasterizer_scanline_aa::clip_box(double x1, double y1, - double x2, double y2) - { - reset(); - m_clipper.clip_box(conv_type::upscale(x1), conv_type::upscale(y1), - conv_type::upscale(x2), conv_type::upscale(y2)); - } - - //------------------------------------------------------------------------ - template - void rasterizer_scanline_aa::reset_clipping() - { - reset(); - m_clipper.reset_clipping(); - } - - //------------------------------------------------------------------------ - template - void rasterizer_scanline_aa::close_polygon() - { - if(m_status == status_line_to) - { - m_clipper.line_to(m_outline, m_start_x, m_start_y); - m_status = status_closed; - } - } - - //------------------------------------------------------------------------ - template - void rasterizer_scanline_aa::move_to(int x, int y) - { - if(m_outline.sorted()) reset(); - if(m_auto_close) close_polygon(); - m_clipper.move_to(m_start_x = conv_type::downscale(x), - m_start_y = conv_type::downscale(y)); - m_status = status_move_to; - } - - //------------------------------------------------------------------------ - template - void rasterizer_scanline_aa::line_to(int x, int y) - { - m_clipper.line_to(m_outline, - conv_type::downscale(x), - conv_type::downscale(y)); - m_status = status_line_to; - } - - //------------------------------------------------------------------------ - template - void rasterizer_scanline_aa::move_to_d(double x, double y) - { - if(m_outline.sorted()) reset(); - if(m_auto_close) close_polygon(); - m_clipper.move_to(m_start_x = conv_type::upscale(x), - m_start_y = conv_type::upscale(y)); - m_status = status_move_to; - } - - //------------------------------------------------------------------------ - template - void rasterizer_scanline_aa::line_to_d(double x, double y) - { - m_clipper.line_to(m_outline, - conv_type::upscale(x), - conv_type::upscale(y)); - m_status = status_line_to; - } - - //------------------------------------------------------------------------ - template - void rasterizer_scanline_aa::add_vertex(double x, double y, unsigned cmd) - { - if(is_move_to(cmd)) - { - move_to_d(x, y); - } - else - if(is_vertex(cmd)) - { - line_to_d(x, y); - } - else - if(is_close(cmd)) - { - close_polygon(); - } - } - - //------------------------------------------------------------------------ - template - void rasterizer_scanline_aa::edge(int x1, int y1, int x2, int y2) - { - if(m_outline.sorted()) reset(); - m_clipper.move_to(conv_type::downscale(x1), conv_type::downscale(y1)); - m_clipper.line_to(m_outline, - conv_type::downscale(x2), - conv_type::downscale(y2)); - m_status = status_move_to; - } - - //------------------------------------------------------------------------ - template - void rasterizer_scanline_aa::edge_d(double x1, double y1, - double x2, double y2) - { - if(m_outline.sorted()) reset(); - m_clipper.move_to(conv_type::upscale(x1), conv_type::upscale(y1)); - m_clipper.line_to(m_outline, - conv_type::upscale(x2), - conv_type::upscale(y2)); - m_status = status_move_to; - } - - //------------------------------------------------------------------------ - template - void rasterizer_scanline_aa::sort() - { - if(m_auto_close) close_polygon(); - m_outline.sort_cells(); - } - - //------------------------------------------------------------------------ - template - AGG_INLINE bool rasterizer_scanline_aa::rewind_scanlines() - { - if(m_auto_close) close_polygon(); - m_outline.sort_cells(); - if(m_outline.total_cells() == 0) - { - return false; - } - m_scan_y = m_outline.min_y(); - return true; - } - - - //------------------------------------------------------------------------ - template - AGG_INLINE bool rasterizer_scanline_aa::navigate_scanline(int y) - { - if(m_auto_close) close_polygon(); - m_outline.sort_cells(); - if(m_outline.total_cells() == 0 || - y < m_outline.min_y() || - y > m_outline.max_y()) - { - return false; - } - m_scan_y = y; - return true; - } - - //------------------------------------------------------------------------ - template - bool rasterizer_scanline_aa::hit_test(int tx, int ty) - { - if(!navigate_scanline(ty)) return false; - scanline_hit_test sl(tx); - sweep_scanline(sl); - return sl.hit(); - } - - - -} - - - -#endif - diff --git a/uppdev/agg24/agg_rasterizer_sl_clip.h b/uppdev/agg24/agg_rasterizer_sl_clip.h deleted file mode 100644 index e7ba065ac..000000000 --- a/uppdev/agg24/agg_rasterizer_sl_clip.h +++ /dev/null @@ -1,351 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -#ifndef AGG_RASTERIZER_SL_CLIP_INCLUDED -#define AGG_RASTERIZER_SL_CLIP_INCLUDED - -#include "agg_clip_liang_barsky.h" - -namespace agg -{ - //--------------------------------------------------------poly_max_coord_e - enum poly_max_coord_e - { - poly_max_coord = (1 << 30) - 1 //----poly_max_coord - }; - - //------------------------------------------------------------ras_conv_int - struct ras_conv_int - { - typedef int coord_type; - static AGG_INLINE int mul_div(double a, double b, double c) - { - return iround(a * b / c); - } - static int xi(int v) { return v; } - static int yi(int v) { return v; } - static int upscale(double v) { return iround(v * poly_subpixel_scale); } - static int downscale(int v) { return v; } - }; - - //--------------------------------------------------------ras_conv_int_sat - struct ras_conv_int_sat - { - typedef int coord_type; - static AGG_INLINE int mul_div(double a, double b, double c) - { - return saturation::iround(a * b / c); - } - static int xi(int v) { return v; } - static int yi(int v) { return v; } - static int upscale(double v) - { - return saturation::iround(v * poly_subpixel_scale); - } - static int downscale(int v) { return v; } - }; - - //---------------------------------------------------------ras_conv_int_3x - struct ras_conv_int_3x - { - typedef int coord_type; - static AGG_INLINE int mul_div(double a, double b, double c) - { - return iround(a * b / c); - } - static int xi(int v) { return v * 3; } - static int yi(int v) { return v; } - static int upscale(double v) { return iround(v * poly_subpixel_scale); } - static int downscale(int v) { return v; } - }; - - //-----------------------------------------------------------ras_conv_dbl - struct ras_conv_dbl - { - typedef double coord_type; - static AGG_INLINE double mul_div(double a, double b, double c) - { - return a * b / c; - } - static int xi(double v) { return iround(v * poly_subpixel_scale); } - static int yi(double v) { return iround(v * poly_subpixel_scale); } - static double upscale(double v) { return v; } - static double downscale(int v) { return v / double(poly_subpixel_scale); } - }; - - //--------------------------------------------------------ras_conv_dbl_3x - struct ras_conv_dbl_3x - { - typedef double coord_type; - static AGG_INLINE double mul_div(double a, double b, double c) - { - return a * b / c; - } - static int xi(double v) { return iround(v * poly_subpixel_scale * 3); } - static int yi(double v) { return iround(v * poly_subpixel_scale); } - static double upscale(double v) { return v; } - static double downscale(int v) { return v / double(poly_subpixel_scale); } - }; - - - - - - //------------------------------------------------------rasterizer_sl_clip - template class rasterizer_sl_clip - { - public: - typedef Conv conv_type; - typedef typename Conv::coord_type coord_type; - typedef rect_base rect_type; - - //-------------------------------------------------------------------- - rasterizer_sl_clip() : - m_clip_box(0,0,0,0), - m_x1(0), - m_y1(0), - m_f1(0), - m_clipping(false) - {} - - //-------------------------------------------------------------------- - void reset_clipping() - { - m_clipping = false; - } - - //-------------------------------------------------------------------- - void clip_box(coord_type x1, coord_type y1, coord_type x2, coord_type y2) - { - m_clip_box = rect_type(x1, y1, x2, y2); - m_clip_box.normalize(); - m_clipping = true; - } - - //-------------------------------------------------------------------- - void move_to(coord_type x1, coord_type y1) - { - m_x1 = x1; - m_y1 = y1; - if(m_clipping) m_f1 = clipping_flags(x1, y1, m_clip_box); - } - - private: - //------------------------------------------------------------------------ - template - AGG_INLINE void line_clip_y(Rasterizer& ras, - coord_type x1, coord_type y1, - coord_type x2, coord_type y2, - unsigned f1, unsigned f2) const - { - f1 &= 10; - f2 &= 10; - if((f1 | f2) == 0) - { - // Fully visible - ras.line(Conv::xi(x1), Conv::yi(y1), Conv::xi(x2), Conv::yi(y2)); - } - else - { - if(f1 == f2) - { - // Invisible by Y - return; - } - - coord_type tx1 = x1; - coord_type ty1 = y1; - coord_type tx2 = x2; - coord_type ty2 = y2; - - if(f1 & 8) // y1 < clip.y1 - { - tx1 = x1 + Conv::mul_div(m_clip_box.y1-y1, x2-x1, y2-y1); - ty1 = m_clip_box.y1; - } - - if(f1 & 2) // y1 > clip.y2 - { - tx1 = x1 + Conv::mul_div(m_clip_box.y2-y1, x2-x1, y2-y1); - ty1 = m_clip_box.y2; - } - - if(f2 & 8) // y2 < clip.y1 - { - tx2 = x1 + Conv::mul_div(m_clip_box.y1-y1, x2-x1, y2-y1); - ty2 = m_clip_box.y1; - } - - if(f2 & 2) // y2 > clip.y2 - { - tx2 = x1 + Conv::mul_div(m_clip_box.y2-y1, x2-x1, y2-y1); - ty2 = m_clip_box.y2; - } - ras.line(Conv::xi(tx1), Conv::yi(ty1), - Conv::xi(tx2), Conv::yi(ty2)); - } - } - - - public: - //-------------------------------------------------------------------- - template - void line_to(Rasterizer& ras, coord_type x2, coord_type y2) - { - if(m_clipping) - { - unsigned f2 = clipping_flags(x2, y2, m_clip_box); - - if((m_f1 & 10) == (f2 & 10) && (m_f1 & 10) != 0) - { - // Invisible by Y - m_x1 = x2; - m_y1 = y2; - m_f1 = f2; - return; - } - - coord_type x1 = m_x1; - coord_type y1 = m_y1; - unsigned f1 = m_f1; - coord_type y3, y4; - unsigned f3, f4; - - switch(((f1 & 5) << 1) | (f2 & 5)) - { - case 0: // Visible by X - line_clip_y(ras, x1, y1, x2, y2, f1, f2); - break; - - case 1: // x2 > clip.x2 - y3 = y1 + Conv::mul_div(m_clip_box.x2-x1, y2-y1, x2-x1); - f3 = clipping_flags_y(y3, m_clip_box); - line_clip_y(ras, x1, y1, m_clip_box.x2, y3, f1, f3); - line_clip_y(ras, m_clip_box.x2, y3, m_clip_box.x2, y2, f3, f2); - break; - - case 2: // x1 > clip.x2 - y3 = y1 + Conv::mul_div(m_clip_box.x2-x1, y2-y1, x2-x1); - f3 = clipping_flags_y(y3, m_clip_box); - line_clip_y(ras, m_clip_box.x2, y1, m_clip_box.x2, y3, f1, f3); - line_clip_y(ras, m_clip_box.x2, y3, x2, y2, f3, f2); - break; - - case 3: // x1 > clip.x2 && x2 > clip.x2 - line_clip_y(ras, m_clip_box.x2, y1, m_clip_box.x2, y2, f1, f2); - break; - - case 4: // x2 < clip.x1 - y3 = y1 + Conv::mul_div(m_clip_box.x1-x1, y2-y1, x2-x1); - f3 = clipping_flags_y(y3, m_clip_box); - line_clip_y(ras, x1, y1, m_clip_box.x1, y3, f1, f3); - line_clip_y(ras, m_clip_box.x1, y3, m_clip_box.x1, y2, f3, f2); - break; - - case 6: // x1 > clip.x2 && x2 < clip.x1 - y3 = y1 + Conv::mul_div(m_clip_box.x2-x1, y2-y1, x2-x1); - y4 = y1 + Conv::mul_div(m_clip_box.x1-x1, y2-y1, x2-x1); - f3 = clipping_flags_y(y3, m_clip_box); - f4 = clipping_flags_y(y4, m_clip_box); - line_clip_y(ras, m_clip_box.x2, y1, m_clip_box.x2, y3, f1, f3); - line_clip_y(ras, m_clip_box.x2, y3, m_clip_box.x1, y4, f3, f4); - line_clip_y(ras, m_clip_box.x1, y4, m_clip_box.x1, y2, f4, f2); - break; - - case 8: // x1 < clip.x1 - y3 = y1 + Conv::mul_div(m_clip_box.x1-x1, y2-y1, x2-x1); - f3 = clipping_flags_y(y3, m_clip_box); - line_clip_y(ras, m_clip_box.x1, y1, m_clip_box.x1, y3, f1, f3); - line_clip_y(ras, m_clip_box.x1, y3, x2, y2, f3, f2); - break; - - case 9: // x1 < clip.x1 && x2 > clip.x2 - y3 = y1 + Conv::mul_div(m_clip_box.x1-x1, y2-y1, x2-x1); - y4 = y1 + Conv::mul_div(m_clip_box.x2-x1, y2-y1, x2-x1); - f3 = clipping_flags_y(y3, m_clip_box); - f4 = clipping_flags_y(y4, m_clip_box); - line_clip_y(ras, m_clip_box.x1, y1, m_clip_box.x1, y3, f1, f3); - line_clip_y(ras, m_clip_box.x1, y3, m_clip_box.x2, y4, f3, f4); - line_clip_y(ras, m_clip_box.x2, y4, m_clip_box.x2, y2, f4, f2); - break; - - case 12: // x1 < clip.x1 && x2 < clip.x1 - line_clip_y(ras, m_clip_box.x1, y1, m_clip_box.x1, y2, f1, f2); - break; - } - m_f1 = f2; - } - else - { - ras.line(Conv::xi(m_x1), Conv::yi(m_y1), - Conv::xi(x2), Conv::yi(y2)); - } - m_x1 = x2; - m_y1 = y2; - } - - - private: - rect_type m_clip_box; - coord_type m_x1; - coord_type m_y1; - unsigned m_f1; - bool m_clipping; - }; - - - - - //---------------------------------------------------rasterizer_sl_no_clip - class rasterizer_sl_no_clip - { - public: - typedef ras_conv_int conv_type; - typedef int coord_type; - - rasterizer_sl_no_clip() : m_x1(0), m_y1(0) {} - - void reset_clipping() {} - void clip_box(coord_type x1, coord_type y1, coord_type x2, coord_type y2) {} - void move_to(coord_type x1, coord_type y1) { m_x1 = x1; m_y1 = y1; } - - template - void line_to(Rasterizer& ras, coord_type x2, coord_type y2) - { - ras.line(m_x1, m_y1, x2, y2); - m_x1 = x2; - m_y1 = y2; - } - - private: - int m_x1, m_y1; - }; - - - // -----rasterizer_sl_clip_int - // -----rasterizer_sl_clip_int_sat - // -----rasterizer_sl_clip_int_3x - // -----rasterizer_sl_clip_dbl - // -----rasterizer_sl_clip_dbl_3x - //------------------------------------------------------------------------ - typedef rasterizer_sl_clip rasterizer_sl_clip_int; - typedef rasterizer_sl_clip rasterizer_sl_clip_int_sat; - typedef rasterizer_sl_clip rasterizer_sl_clip_int_3x; - typedef rasterizer_sl_clip rasterizer_sl_clip_dbl; - typedef rasterizer_sl_clip rasterizer_sl_clip_dbl_3x; - - -} - -#endif diff --git a/uppdev/agg24/agg_rbox_ctrl.cpp b/uppdev/agg24/agg_rbox_ctrl.cpp deleted file mode 100644 index 39cd8bc0f..000000000 --- a/uppdev/agg24/agg_rbox_ctrl.cpp +++ /dev/null @@ -1,325 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// classes rbox_ctrl_impl, rbox_ctrl -// -//---------------------------------------------------------------------------- - -#include -#include "agg_rbox_ctrl.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - rbox_ctrl_impl::rbox_ctrl_impl(double x1, double y1, - double x2, double y2, bool flip_y) : - ctrl(x1, y1, x2, y2, flip_y), - m_border_width(1.0), - m_border_extra(0.0), - m_text_thickness(1.5), - m_text_height(9.0), - m_text_width(0.0), - m_num_items(0), - m_cur_item(-1), - m_ellipse_poly(m_ellipse), - m_text_poly(m_text), - m_idx(0), - m_vertex(0) - { - calc_rbox(); - } - - - //------------------------------------------------------------------------ - void rbox_ctrl_impl::calc_rbox() - { - m_xs1 = m_x1 + m_border_width; - m_ys1 = m_y1 + m_border_width; - m_xs2 = m_x2 - m_border_width; - m_ys2 = m_y2 - m_border_width; - } - - - //------------------------------------------------------------------------ - void rbox_ctrl_impl::add_item(const char* text) - { - if(m_num_items < 32) - { - m_items[m_num_items].resize(strlen(text) + 1); - strcpy(&m_items[m_num_items][0], text); - m_num_items++; - } - } - - - //------------------------------------------------------------------------ - void rbox_ctrl_impl::border_width(double t, double extra) - { - m_border_width = t; - m_border_extra = extra; - calc_rbox(); - } - - - //------------------------------------------------------------------------ - void rbox_ctrl_impl::text_size(double h, double w) - { - m_text_width = w; - m_text_height = h; - } - - - - //------------------------------------------------------------------------ - void rbox_ctrl_impl::rewind(unsigned idx) - { - m_idx = idx; - m_dy = m_text_height * 2.0; - m_draw_item = 0; - - switch(idx) - { - default: - - case 0: // Background - m_vertex = 0; - m_vx[0] = m_x1 - m_border_extra; - m_vy[0] = m_y1 - m_border_extra; - m_vx[1] = m_x2 + m_border_extra; - m_vy[1] = m_y1 - m_border_extra; - m_vx[2] = m_x2 + m_border_extra; - m_vy[2] = m_y2 + m_border_extra; - m_vx[3] = m_x1 - m_border_extra; - m_vy[3] = m_y2 + m_border_extra; - break; - - case 1: // Border - m_vertex = 0; - m_vx[0] = m_x1; - m_vy[0] = m_y1; - m_vx[1] = m_x2; - m_vy[1] = m_y1; - m_vx[2] = m_x2; - m_vy[2] = m_y2; - m_vx[3] = m_x1; - m_vy[3] = m_y2; - m_vx[4] = m_x1 + m_border_width; - m_vy[4] = m_y1 + m_border_width; - m_vx[5] = m_x1 + m_border_width; - m_vy[5] = m_y2 - m_border_width; - m_vx[6] = m_x2 - m_border_width; - m_vy[6] = m_y2 - m_border_width; - m_vx[7] = m_x2 - m_border_width; - m_vy[7] = m_y1 + m_border_width; - break; - - case 2: // Text - m_text.text(&m_items[0][0]); - m_text.start_point(m_xs1 + m_dy * 1.5, m_ys1 + m_dy / 2.0); - m_text.size(m_text_height, m_text_width); - m_text_poly.width(m_text_thickness); - m_text_poly.line_join(round_join); - m_text_poly.line_cap(round_cap); - m_text_poly.rewind(0); - break; - - case 3: // Inactive items - m_ellipse.init(m_xs1 + m_dy / 1.3, - m_ys1 + m_dy / 1.3, - m_text_height / 1.5, - m_text_height / 1.5, 32); - m_ellipse_poly.width(m_text_thickness); - m_ellipse_poly.rewind(0); - break; - - - case 4: // Active Item - if(m_cur_item >= 0) - { - m_ellipse.init(m_xs1 + m_dy / 1.3, - m_ys1 + m_dy * m_cur_item + m_dy / 1.3, - m_text_height / 2.0, - m_text_height / 2.0, 32); - m_ellipse.rewind(0); - } - break; - - } - } - - - //------------------------------------------------------------------------ - unsigned rbox_ctrl_impl::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_line_to; - switch(m_idx) - { - case 0: - if(m_vertex == 0) cmd = path_cmd_move_to; - if(m_vertex >= 4) cmd = path_cmd_stop; - *x = m_vx[m_vertex]; - *y = m_vy[m_vertex]; - m_vertex++; - break; - - case 1: - if(m_vertex == 0 || m_vertex == 4) cmd = path_cmd_move_to; - if(m_vertex >= 8) cmd = path_cmd_stop; - *x = m_vx[m_vertex]; - *y = m_vy[m_vertex]; - m_vertex++; - break; - - case 2: - cmd = m_text_poly.vertex(x, y); - if(is_stop(cmd)) - { - m_draw_item++; - if(m_draw_item >= m_num_items) - { - break; - } - else - { - m_text.text(&m_items[m_draw_item][0]); - m_text.start_point(m_xs1 + m_dy * 1.5, - m_ys1 + m_dy * (m_draw_item + 1) - m_dy / 2.0); - - m_text_poly.rewind(0); - cmd = m_text_poly.vertex(x, y); - } - } - break; - - case 3: - cmd = m_ellipse_poly.vertex(x, y); - if(is_stop(cmd)) - { - m_draw_item++; - if(m_draw_item >= m_num_items) - { - break; - } - else - { - m_ellipse.init(m_xs1 + m_dy / 1.3, - m_ys1 + m_dy * m_draw_item + m_dy / 1.3, - m_text_height / 1.5, - m_text_height / 1.5, 32); - m_ellipse_poly.rewind(0); - cmd = m_ellipse_poly.vertex(x, y); - } - } - break; - - - case 4: - if(m_cur_item >= 0) - { - cmd = m_ellipse.vertex(x, y); - } - else - { - cmd = path_cmd_stop; - } - break; - - default: - cmd = path_cmd_stop; - break; - } - - if(!is_stop(cmd)) - { - transform_xy(x, y); - } - - return cmd; - } - - - //------------------------------------------------------------------------ - bool rbox_ctrl_impl::in_rect(double x, double y) const - { - inverse_transform_xy(&x, &y); - return x >= m_x1 && x <= m_x2 && y >= m_y1 && y <= m_y2; - } - - - - //------------------------------------------------------------------------ - bool rbox_ctrl_impl::on_mouse_button_down(double x, double y) - { - inverse_transform_xy(&x, &y); - unsigned i; - for(i = 0; i < m_num_items; i++) - { - double xp = m_xs1 + m_dy / 1.3; - double yp = m_ys1 + m_dy * i + m_dy / 1.3; - if(calc_distance(x, y, xp, yp) <= m_text_height / 1.5) - { - m_cur_item = int(i); - return true; - } - } - return false; - } - - - //------------------------------------------------------------------------ - bool rbox_ctrl_impl::on_mouse_move(double, double, bool) - { - return false; - } - - //------------------------------------------------------------------------ - bool rbox_ctrl_impl::on_mouse_button_up(double, double) - { - return false; - } - - //------------------------------------------------------------------------ - bool rbox_ctrl_impl::on_arrow_keys(bool left, bool right, bool down, bool up) - { - if(m_cur_item >= 0) - { - if(up || right) - { - m_cur_item++; - if(m_cur_item >= int(m_num_items)) - { - m_cur_item = 0; - } - return true; - } - - if(down || left) - { - m_cur_item--; - if(m_cur_item < 0) - { - m_cur_item = m_num_items - 1; - } - return true; - } - } - return false; - } - - -} - - diff --git a/uppdev/agg24/agg_rbox_ctrl.h b/uppdev/agg24/agg_rbox_ctrl.h deleted file mode 100644 index 4d47bccdb..000000000 --- a/uppdev/agg24/agg_rbox_ctrl.h +++ /dev/null @@ -1,141 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// classes rbox_ctrl_impl, rbox_ctrl -// -//---------------------------------------------------------------------------- - -#ifndef AGG_RBOX_CTRL_INCLUDED -#define AGG_RBOX_CTRL_INCLUDED - -#include "agg_array.h" -#include "agg_ellipse.h" -#include "agg_conv_stroke.h" -#include "agg_gsv_text.h" -#include "agg_trans_affine.h" -#include "agg_color_rgba.h" -#include "agg_ctrl.h" - - - -namespace agg -{ - - //------------------------------------------------------------------------ - class rbox_ctrl_impl : public ctrl - { - public: - rbox_ctrl_impl(double x1, double y1, double x2, double y2, bool flip_y=false); - - void border_width(double t, double extra=0.0); - void text_thickness(double t) { m_text_thickness = t; } - void text_size(double h, double w=0.0); - - void add_item(const char* text); - int cur_item() const { return m_cur_item; } - void cur_item(int i) { m_cur_item = i; } - - virtual bool in_rect(double x, double y) const; - virtual bool on_mouse_button_down(double x, double y); - virtual bool on_mouse_button_up(double x, double y); - virtual bool on_mouse_move(double x, double y, bool button_flag); - virtual bool on_arrow_keys(bool left, bool right, bool down, bool up); - - // Vertex soutce interface - unsigned num_paths() { return 5; }; - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - void calc_rbox(); - - double m_border_width; - double m_border_extra; - double m_text_thickness; - double m_text_height; - double m_text_width; - pod_array m_items[32]; - unsigned m_num_items; - int m_cur_item; - - double m_xs1; - double m_ys1; - double m_xs2; - double m_ys2; - - double m_vx[32]; - double m_vy[32]; - unsigned m_draw_item; - double m_dy; - - ellipse m_ellipse; - conv_stroke m_ellipse_poly; - gsv_text m_text; - conv_stroke m_text_poly; - - unsigned m_idx; - unsigned m_vertex; - }; - - - - //------------------------------------------------------------------------ - template class rbox_ctrl : public rbox_ctrl_impl - { - public: - rbox_ctrl(double x1, double y1, double x2, double y2, bool flip_y=false) : - rbox_ctrl_impl(x1, y1, x2, y2, flip_y), - m_background_color(rgba(1.0, 1.0, 0.9)), - m_border_color(rgba(0.0, 0.0, 0.0)), - m_text_color(rgba(0.0, 0.0, 0.0)), - m_inactive_color(rgba(0.0, 0.0, 0.0)), - m_active_color(rgba(0.4, 0.0, 0.0)) - { - m_colors[0] = &m_background_color; - m_colors[1] = &m_border_color; - m_colors[2] = &m_text_color; - m_colors[3] = &m_inactive_color; - m_colors[4] = &m_active_color; - } - - - void background_color(const ColorT& c) { m_background_color = c; } - void border_color(const ColorT& c) { m_border_color = c; } - void text_color(const ColorT& c) { m_text_color = c; } - void inactive_color(const ColorT& c) { m_inactive_color = c; } - void active_color(const ColorT& c) { m_active_color = c; } - - const ColorT& color(unsigned i) const { return *m_colors[i]; } - - private: - rbox_ctrl(const rbox_ctrl&); - const rbox_ctrl& operator = (const rbox_ctrl&); - - ColorT m_background_color; - ColorT m_border_color; - ColorT m_text_color; - ColorT m_inactive_color; - ColorT m_active_color; - ColorT* m_colors[5]; - }; - - - -} - - - -#endif - diff --git a/uppdev/agg24/agg_renderer_base.h b/uppdev/agg24/agg_renderer_base.h deleted file mode 100644 index ad7915a2a..000000000 --- a/uppdev/agg24/agg_renderer_base.h +++ /dev/null @@ -1,718 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// class renderer_base -// -//---------------------------------------------------------------------------- - -#ifndef AGG_RENDERER_BASE_INCLUDED -#define AGG_RENDERER_BASE_INCLUDED - -#include "agg_basics.h" -#include "agg_rendering_buffer.h" - -namespace agg -{ - - //-----------------------------------------------------------renderer_base - template class renderer_base - { - public: - typedef PixelFormat pixfmt_type; - typedef typename pixfmt_type::color_type color_type; - typedef typename pixfmt_type::row_data row_data; - - //-------------------------------------------------------------------- - renderer_base() : m_ren(0), m_clip_box(1, 1, 0, 0) {} - explicit renderer_base(pixfmt_type& ren) : - m_ren(&ren), - m_clip_box(0, 0, ren.width() - 1, ren.height() - 1) - {} - void attach(pixfmt_type& ren) - { - m_ren = &ren; - m_clip_box = rect_i(0, 0, ren.width() - 1, ren.height() - 1); - } - - //-------------------------------------------------------------------- - const pixfmt_type& ren() const { return *m_ren; } - pixfmt_type& ren() { return *m_ren; } - - //-------------------------------------------------------------------- - unsigned width() const { return m_ren->width(); } - unsigned height() const { return m_ren->height(); } - - //-------------------------------------------------------------------- - bool clip_box(int x1, int y1, int x2, int y2) - { - rect_i cb(x1, y1, x2, y2); - cb.normalize(); - if(cb.clip(rect_i(0, 0, width() - 1, height() - 1))) - { - m_clip_box = cb; - return true; - } - m_clip_box.x1 = 1; - m_clip_box.y1 = 1; - m_clip_box.x2 = 0; - m_clip_box.y2 = 0; - return false; - } - - //-------------------------------------------------------------------- - void reset_clipping(bool visibility) - { - if(visibility) - { - m_clip_box.x1 = 0; - m_clip_box.y1 = 0; - m_clip_box.x2 = width() - 1; - m_clip_box.y2 = height() - 1; - } - else - { - m_clip_box.x1 = 1; - m_clip_box.y1 = 1; - m_clip_box.x2 = 0; - m_clip_box.y2 = 0; - } - } - - //-------------------------------------------------------------------- - void clip_box_naked(int x1, int y1, int x2, int y2) - { - m_clip_box.x1 = x1; - m_clip_box.y1 = y1; - m_clip_box.x2 = x2; - m_clip_box.y2 = y2; - } - - //-------------------------------------------------------------------- - bool inbox(int x, int y) const - { - return x >= m_clip_box.x1 && y >= m_clip_box.y1 && - x <= m_clip_box.x2 && y <= m_clip_box.y2; - } - - //-------------------------------------------------------------------- - const rect_i& clip_box() const { return m_clip_box; } - int xmin() const { return m_clip_box.x1; } - int ymin() const { return m_clip_box.y1; } - int xmax() const { return m_clip_box.x2; } - int ymax() const { return m_clip_box.y2; } - - //-------------------------------------------------------------------- - const rect_i& bounding_clip_box() const { return m_clip_box; } - int bounding_xmin() const { return m_clip_box.x1; } - int bounding_ymin() const { return m_clip_box.y1; } - int bounding_xmax() const { return m_clip_box.x2; } - int bounding_ymax() const { return m_clip_box.y2; } - - //-------------------------------------------------------------------- - void clear(const color_type& c) - { - unsigned y; - if(width()) - { - for(y = 0; y < height(); y++) - { - m_ren->copy_hline(0, y, width(), c); - } - } - } - - - //-------------------------------------------------------------------- - void copy_pixel(int x, int y, const color_type& c) - { - if(inbox(x, y)) - { - m_ren->copy_pixel(x, y, c); - } - } - - //-------------------------------------------------------------------- - void blend_pixel(int x, int y, const color_type& c, cover_type cover) - { - if(inbox(x, y)) - { - m_ren->blend_pixel(x, y, c, cover); - } - } - - //-------------------------------------------------------------------- - color_type pixel(int x, int y) const - { - return inbox(x, y) ? - m_ren->pixel(x, y) : - color_type::no_color(); - } - - //-------------------------------------------------------------------- - void copy_hline(int x1, int y, int x2, const color_type& c) - { - if(x1 > x2) { int t = x2; x2 = x1; x1 = t; } - if(y > ymax()) return; - if(y < ymin()) return; - if(x1 > xmax()) return; - if(x2 < xmin()) return; - - if(x1 < xmin()) x1 = xmin(); - if(x2 > xmax()) x2 = xmax(); - - m_ren->copy_hline(x1, y, x2 - x1 + 1, c); - } - - //-------------------------------------------------------------------- - void copy_vline(int x, int y1, int y2, const color_type& c) - { - if(y1 > y2) { int t = y2; y2 = y1; y1 = t; } - if(x > xmax()) return; - if(x < xmin()) return; - if(y1 > ymax()) return; - if(y2 < ymin()) return; - - if(y1 < ymin()) y1 = ymin(); - if(y2 > ymax()) y2 = ymax(); - - m_ren->copy_vline(x, y1, y2 - y1 + 1, c); - } - - //-------------------------------------------------------------------- - void blend_hline(int x1, int y, int x2, - const color_type& c, cover_type cover) - { - if(x1 > x2) { int t = x2; x2 = x1; x1 = t; } - if(y > ymax()) return; - if(y < ymin()) return; - if(x1 > xmax()) return; - if(x2 < xmin()) return; - - if(x1 < xmin()) x1 = xmin(); - if(x2 > xmax()) x2 = xmax(); - - m_ren->blend_hline(x1, y, x2 - x1 + 1, c, cover); - } - - //-------------------------------------------------------------------- - void blend_vline(int x, int y1, int y2, - const color_type& c, cover_type cover) - { - if(y1 > y2) { int t = y2; y2 = y1; y1 = t; } - if(x > xmax()) return; - if(x < xmin()) return; - if(y1 > ymax()) return; - if(y2 < ymin()) return; - - if(y1 < ymin()) y1 = ymin(); - if(y2 > ymax()) y2 = ymax(); - - m_ren->blend_vline(x, y1, y2 - y1 + 1, c, cover); - } - - - //-------------------------------------------------------------------- - void copy_bar(int x1, int y1, int x2, int y2, const color_type& c) - { - rect_i rc(x1, y1, x2, y2); - rc.normalize(); - if(rc.clip(clip_box())) - { - int y; - for(y = rc.y1; y <= rc.y2; y++) - { - m_ren->copy_hline(rc.x1, y, unsigned(rc.x2 - rc.x1 + 1), c); - } - } - } - - //-------------------------------------------------------------------- - void blend_bar(int x1, int y1, int x2, int y2, - const color_type& c, cover_type cover) - { - rect_i rc(x1, y1, x2, y2); - rc.normalize(); - if(rc.clip(clip_box())) - { - int y; - for(y = rc.y1; y <= rc.y2; y++) - { - m_ren->blend_hline(rc.x1, - y, - unsigned(rc.x2 - rc.x1 + 1), - c, - cover); - } - } - } - - //-------------------------------------------------------------------- - void blend_solid_hspan(int x, int y, int len, - const color_type& c, - const cover_type* covers) - { - if(y > ymax()) return; - if(y < ymin()) return; - - if(x < xmin()) - { - len -= xmin() - x; - if(len <= 0) return; - covers += xmin() - x; - x = xmin(); - } - if(x + len > xmax()) - { - len = xmax() - x + 1; - if(len <= 0) return; - } - m_ren->blend_solid_hspan(x, y, len, c, covers); - } - - //-------------------------------------------------------------------- - void blend_solid_vspan(int x, int y, int len, - const color_type& c, - const cover_type* covers) - { - if(x > xmax()) return; - if(x < xmin()) return; - - if(y < ymin()) - { - len -= ymin() - y; - if(len <= 0) return; - covers += ymin() - y; - y = ymin(); - } - if(y + len > ymax()) - { - len = ymax() - y + 1; - if(len <= 0) return; - } - m_ren->blend_solid_vspan(x, y, len, c, covers); - } - - - //-------------------------------------------------------------------- - void copy_color_hspan(int x, int y, int len, const color_type* colors) - { - if(y > ymax()) return; - if(y < ymin()) return; - - if(x < xmin()) - { - int d = xmin() - x; - len -= d; - if(len <= 0) return; - colors += d; - x = xmin(); - } - if(x + len > xmax()) - { - len = xmax() - x + 1; - if(len <= 0) return; - } - m_ren->copy_color_hspan(x, y, len, colors); - } - - - //-------------------------------------------------------------------- - void copy_color_vspan(int x, int y, int len, const color_type* colors) - { - if(x > xmax()) return; - if(x < xmin()) return; - - if(y < ymin()) - { - int d = ymin() - y; - len -= d; - if(len <= 0) return; - colors += d; - y = ymin(); - } - if(y + len > ymax()) - { - len = ymax() - y + 1; - if(len <= 0) return; - } - m_ren->copy_color_vspan(x, y, len, colors); - } - - - //-------------------------------------------------------------------- - void blend_color_hspan(int x, int y, int len, - const color_type* colors, - const cover_type* covers, - cover_type cover = agg::cover_full) - { - if(y > ymax()) return; - if(y < ymin()) return; - - if(x < xmin()) - { - int d = xmin() - x; - len -= d; - if(len <= 0) return; - if(covers) covers += d; - colors += d; - x = xmin(); - } - if(x + len > xmax()) - { - len = xmax() - x + 1; - if(len <= 0) return; - } - m_ren->blend_color_hspan(x, y, len, colors, covers, cover); - } - - //-------------------------------------------------------------------- - void blend_color_vspan(int x, int y, int len, - const color_type* colors, - const cover_type* covers, - cover_type cover = agg::cover_full) - { - if(x > xmax()) return; - if(x < xmin()) return; - - if(y < ymin()) - { - int d = ymin() - y; - len -= d; - if(len <= 0) return; - if(covers) covers += d; - colors += d; - y = ymin(); - } - if(y + len > ymax()) - { - len = ymax() - y + 1; - if(len <= 0) return; - } - m_ren->blend_color_vspan(x, y, len, colors, covers, cover); - } - - //-------------------------------------------------------------------- - rect_i clip_rect_area(rect_i& dst, rect_i& src, int wsrc, int hsrc) const - { - rect_i rc(0,0,0,0); - rect_i cb = clip_box(); - ++cb.x2; - ++cb.y2; - - if(src.x1 < 0) - { - dst.x1 -= src.x1; - src.x1 = 0; - } - if(src.y1 < 0) - { - dst.y1 -= src.y1; - src.y1 = 0; - } - - if(src.x2 > wsrc) src.x2 = wsrc; - if(src.y2 > hsrc) src.y2 = hsrc; - - if(dst.x1 < cb.x1) - { - src.x1 += cb.x1 - dst.x1; - dst.x1 = cb.x1; - } - if(dst.y1 < cb.y1) - { - src.y1 += cb.y1 - dst.y1; - dst.y1 = cb.y1; - } - - if(dst.x2 > cb.x2) dst.x2 = cb.x2; - if(dst.y2 > cb.y2) dst.y2 = cb.y2; - - rc.x2 = dst.x2 - dst.x1; - rc.y2 = dst.y2 - dst.y1; - - if(rc.x2 > src.x2 - src.x1) rc.x2 = src.x2 - src.x1; - if(rc.y2 > src.y2 - src.y1) rc.y2 = src.y2 - src.y1; - return rc; - } - - //-------------------------------------------------------------------- - template - void copy_from(const RenBuf& src, - const rect_i* rect_src_ptr = 0, - int dx = 0, - int dy = 0) - { - rect_i rsrc(0, 0, src.width(), src.height()); - if(rect_src_ptr) - { - rsrc.x1 = rect_src_ptr->x1; - rsrc.y1 = rect_src_ptr->y1; - rsrc.x2 = rect_src_ptr->x2 + 1; - rsrc.y2 = rect_src_ptr->y2 + 1; - } - - // Version with xdst, ydst (absolute positioning) - //rect_i rdst(xdst, ydst, xdst + rsrc.x2 - rsrc.x1, ydst + rsrc.y2 - rsrc.y1); - - // Version with dx, dy (relative positioning) - rect_i rdst(rsrc.x1 + dx, rsrc.y1 + dy, rsrc.x2 + dx, rsrc.y2 + dy); - - rect_i rc = clip_rect_area(rdst, rsrc, src.width(), src.height()); - - if(rc.x2 > 0) - { - int incy = 1; - if(rdst.y1 > rsrc.y1) - { - rsrc.y1 += rc.y2 - 1; - rdst.y1 += rc.y2 - 1; - incy = -1; - } - while(rc.y2 > 0) - { - m_ren->copy_from(src, - rdst.x1, rdst.y1, - rsrc.x1, rsrc.y1, - rc.x2); - rdst.y1 += incy; - rsrc.y1 += incy; - --rc.y2; - } - } - } - - //-------------------------------------------------------------------- - template - void blend_from(const SrcPixelFormatRenderer& src, - const rect_i* rect_src_ptr = 0, - int dx = 0, - int dy = 0, - cover_type cover = agg::cover_full) - { - rect_i rsrc(0, 0, src.width(), src.height()); - if(rect_src_ptr) - { - rsrc.x1 = rect_src_ptr->x1; - rsrc.y1 = rect_src_ptr->y1; - rsrc.x2 = rect_src_ptr->x2 + 1; - rsrc.y2 = rect_src_ptr->y2 + 1; - } - - // Version with xdst, ydst (absolute positioning) - //rect_i rdst(xdst, ydst, xdst + rsrc.x2 - rsrc.x1, ydst + rsrc.y2 - rsrc.y1); - - // Version with dx, dy (relative positioning) - rect_i rdst(rsrc.x1 + dx, rsrc.y1 + dy, rsrc.x2 + dx, rsrc.y2 + dy); - rect_i rc = clip_rect_area(rdst, rsrc, src.width(), src.height()); - - if(rc.x2 > 0) - { - int incy = 1; - if(rdst.y1 > rsrc.y1) - { - rsrc.y1 += rc.y2 - 1; - rdst.y1 += rc.y2 - 1; - incy = -1; - } - while(rc.y2 > 0) - { - typename SrcPixelFormatRenderer::row_data rw = src.row(rsrc.y1); - if(rw.ptr) - { - int x1src = rsrc.x1; - int x1dst = rdst.x1; - int len = rc.x2; - if(rw.x1 > x1src) - { - x1dst += rw.x1 - x1src; - len -= rw.x1 - x1src; - x1src = rw.x1; - } - if(len > 0) - { - if(x1src + len-1 > rw.x2) - { - len -= x1src + len - rw.x2 - 1; - } - if(len > 0) - { - m_ren->blend_from(src, - x1dst, rdst.y1, - x1src, rsrc.y1, - len, - cover); - } - } - } - rdst.y1 += incy; - rsrc.y1 += incy; - --rc.y2; - } - } - } - - //-------------------------------------------------------------------- - template - void blend_from_color(const SrcPixelFormatRenderer& src, - const color_type& color, - const rect_i* rect_src_ptr = 0, - int dx = 0, - int dy = 0, - cover_type cover = agg::cover_full) - { - rect_i rsrc(0, 0, src.width(), src.height()); - if(rect_src_ptr) - { - rsrc.x1 = rect_src_ptr->x1; - rsrc.y1 = rect_src_ptr->y1; - rsrc.x2 = rect_src_ptr->x2 + 1; - rsrc.y2 = rect_src_ptr->y2 + 1; - } - - // Version with xdst, ydst (absolute positioning) - //rect_i rdst(xdst, ydst, xdst + rsrc.x2 - rsrc.x1, ydst + rsrc.y2 - rsrc.y1); - - // Version with dx, dy (relative positioning) - rect_i rdst(rsrc.x1 + dx, rsrc.y1 + dy, rsrc.x2 + dx, rsrc.y2 + dy); - rect_i rc = clip_rect_area(rdst, rsrc, src.width(), src.height()); - - if(rc.x2 > 0) - { - int incy = 1; - if(rdst.y1 > rsrc.y1) - { - rsrc.y1 += rc.y2 - 1; - rdst.y1 += rc.y2 - 1; - incy = -1; - } - while(rc.y2 > 0) - { - typename SrcPixelFormatRenderer::row_data rw = src.row(rsrc.y1); - if(rw.ptr) - { - int x1src = rsrc.x1; - int x1dst = rdst.x1; - int len = rc.x2; - if(rw.x1 > x1src) - { - x1dst += rw.x1 - x1src; - len -= rw.x1 - x1src; - x1src = rw.x1; - } - if(len > 0) - { - if(x1src + len-1 > rw.x2) - { - len -= x1src + len - rw.x2 - 1; - } - if(len > 0) - { - m_ren->blend_from_color(src, - color, - x1dst, rdst.y1, - x1src, rsrc.y1, - len, - cover); - } - } - } - rdst.y1 += incy; - rsrc.y1 += incy; - --rc.y2; - } - } - } - - //-------------------------------------------------------------------- - template - void blend_from_lut(const SrcPixelFormatRenderer& src, - const color_type* color_lut, - const rect_i* rect_src_ptr = 0, - int dx = 0, - int dy = 0, - cover_type cover = agg::cover_full) - { - rect_i rsrc(0, 0, src.width(), src.height()); - if(rect_src_ptr) - { - rsrc.x1 = rect_src_ptr->x1; - rsrc.y1 = rect_src_ptr->y1; - rsrc.x2 = rect_src_ptr->x2 + 1; - rsrc.y2 = rect_src_ptr->y2 + 1; - } - - // Version with xdst, ydst (absolute positioning) - //rect_i rdst(xdst, ydst, xdst + rsrc.x2 - rsrc.x1, ydst + rsrc.y2 - rsrc.y1); - - // Version with dx, dy (relative positioning) - rect_i rdst(rsrc.x1 + dx, rsrc.y1 + dy, rsrc.x2 + dx, rsrc.y2 + dy); - rect_i rc = clip_rect_area(rdst, rsrc, src.width(), src.height()); - - if(rc.x2 > 0) - { - int incy = 1; - if(rdst.y1 > rsrc.y1) - { - rsrc.y1 += rc.y2 - 1; - rdst.y1 += rc.y2 - 1; - incy = -1; - } - while(rc.y2 > 0) - { - typename SrcPixelFormatRenderer::row_data rw = src.row(rsrc.y1); - if(rw.ptr) - { - int x1src = rsrc.x1; - int x1dst = rdst.x1; - int len = rc.x2; - if(rw.x1 > x1src) - { - x1dst += rw.x1 - x1src; - len -= rw.x1 - x1src; - x1src = rw.x1; - } - if(len > 0) - { - if(x1src + len-1 > rw.x2) - { - len -= x1src + len - rw.x2 - 1; - } - if(len > 0) - { - m_ren->blend_from_lut(src, - color_lut, - x1dst, rdst.y1, - x1src, rsrc.y1, - len, - cover); - } - } - } - rdst.y1 += incy; - rsrc.y1 += incy; - --rc.y2; - } - } - } - - private: - pixfmt_type* m_ren; - rect_i m_clip_box; - }; - - -} - -#endif diff --git a/uppdev/agg24/agg_renderer_markers.h b/uppdev/agg24/agg_renderer_markers.h deleted file mode 100644 index 820f75307..000000000 --- a/uppdev/agg24/agg_renderer_markers.h +++ /dev/null @@ -1,706 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// class renderer_markers -// -//---------------------------------------------------------------------------- - -#ifndef AGG_RENDERER_MARKERS_INCLUDED -#define AGG_RENDERER_MARKERS_INCLUDED - -#include "agg_basics.h" -#include "agg_renderer_primitives.h" - -namespace agg -{ - - //---------------------------------------------------------------marker_e - enum marker_e - { - marker_square, - marker_diamond, - marker_circle, - marker_crossed_circle, - marker_semiellipse_left, - marker_semiellipse_right, - marker_semiellipse_up, - marker_semiellipse_down, - marker_triangle_left, - marker_triangle_right, - marker_triangle_up, - marker_triangle_down, - marker_four_rays, - marker_cross, - marker_x, - marker_dash, - marker_dot, - marker_pixel, - - end_of_markers - }; - - - - //--------------------------------------------------------renderer_markers - template class renderer_markers : - public renderer_primitives - { - public: - typedef renderer_primitives base_type; - typedef BaseRenderer base_ren_type; - typedef typename base_ren_type::color_type color_type; - - //-------------------------------------------------------------------- - renderer_markers(base_ren_type& rbuf) : - base_type(rbuf) - {} - - //-------------------------------------------------------------------- - bool visible(int x, int y, int r) const - { - rect_i rc(x-r, y-r, x+y, y+r); - return rc.clip(base_type::ren().bounding_clip_box()); - } - - //-------------------------------------------------------------------- - void square(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) base_type::outlined_rectangle(x-r, y-r, x+r, y+r); - else base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - - //-------------------------------------------------------------------- - void diamond(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) - { - int dy = -r; - int dx = 0; - do - { - base_type::ren().blend_pixel(x - dx, y + dy, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x + dx, y + dy, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x - dx, y - dy, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x + dx, y - dy, base_type::line_color(), cover_full); - - if(dx) - { - base_type::ren().blend_hline(x-dx+1, y+dy, x+dx-1, base_type::fill_color(), cover_full); - base_type::ren().blend_hline(x-dx+1, y-dy, x+dx-1, base_type::fill_color(), cover_full); - } - ++dy; - ++dx; - } - while(dy <= 0); - } - else - { - base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - } - - //-------------------------------------------------------------------- - void circle(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) base_type::outlined_ellipse(x, y, r, r); - else base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - - - - //-------------------------------------------------------------------- - void crossed_circle(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) - { - base_type::outlined_ellipse(x, y, r, r); - int r6 = r + (r >> 1); - if(r <= 2) r6++; - r >>= 1; - base_type::ren().blend_hline(x-r6, y, x-r, base_type::line_color(), cover_full); - base_type::ren().blend_hline(x+r, y, x+r6, base_type::line_color(), cover_full); - base_type::ren().blend_vline(x, y-r6, y-r, base_type::line_color(), cover_full); - base_type::ren().blend_vline(x, y+r, y+r6, base_type::line_color(), cover_full); - } - else - { - base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - } - - - //------------------------------------------------------------------------ - void semiellipse_left(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) - { - int r8 = r * 4 / 5; - int dy = -r; - int dx = 0; - ellipse_bresenham_interpolator ei(r * 3 / 5, r+r8); - do - { - dx += ei.dx(); - dy += ei.dy(); - - base_type::ren().blend_pixel(x + dy, y + dx, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x + dy, y - dx, base_type::line_color(), cover_full); - - if(ei.dy() && dx) - { - base_type::ren().blend_vline(x+dy, y-dx+1, y+dx-1, base_type::fill_color(), cover_full); - } - ++ei; - } - while(dy < r8); - base_type::ren().blend_vline(x+dy, y-dx, y+dx, base_type::line_color(), cover_full); - } - else - { - base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - } - - - //-------------------------------------------------------------------- - void semiellipse_right(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) - { - int r8 = r * 4 / 5; - int dy = -r; - int dx = 0; - ellipse_bresenham_interpolator ei(r * 3 / 5, r+r8); - do - { - dx += ei.dx(); - dy += ei.dy(); - - base_type::ren().blend_pixel(x - dy, y + dx, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x - dy, y - dx, base_type::line_color(), cover_full); - - if(ei.dy() && dx) - { - base_type::ren().blend_vline(x-dy, y-dx+1, y+dx-1, base_type::fill_color(), cover_full); - } - ++ei; - } - while(dy < r8); - base_type::ren().blend_vline(x-dy, y-dx, y+dx, base_type::line_color(), cover_full); - } - else - { - base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - } - - - //-------------------------------------------------------------------- - void semiellipse_up(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) - { - int r8 = r * 4 / 5; - int dy = -r; - int dx = 0; - ellipse_bresenham_interpolator ei(r * 3 / 5, r+r8); - do - { - dx += ei.dx(); - dy += ei.dy(); - - base_type::ren().blend_pixel(x + dx, y - dy, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x - dx, y - dy, base_type::line_color(), cover_full); - - if(ei.dy() && dx) - { - base_type::ren().blend_hline(x-dx+1, y-dy, x+dx-1, base_type::fill_color(), cover_full); - } - ++ei; - } - while(dy < r8); - base_type::ren().blend_hline(x-dx, y-dy-1, x+dx, base_type::line_color(), cover_full); - } - else - { - base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - } - - - //-------------------------------------------------------------------- - void semiellipse_down(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) - { - int r8 = r * 4 / 5; - int dy = -r; - int dx = 0; - ellipse_bresenham_interpolator ei(r * 3 / 5, r+r8); - do - { - dx += ei.dx(); - dy += ei.dy(); - - base_type::ren().blend_pixel(x + dx, y + dy, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x - dx, y + dy, base_type::line_color(), cover_full); - - if(ei.dy() && dx) - { - base_type::ren().blend_hline(x-dx+1, y+dy, x+dx-1, base_type::fill_color(), cover_full); - } - ++ei; - } - while(dy < r8); - base_type::ren().blend_hline(x-dx, y+dy+1, x+dx, base_type::line_color(), cover_full); - } - else - { - base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - } - - - //-------------------------------------------------------------------- - void triangle_left(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) - { - int dy = -r; - int dx = 0; - int flip = 0; - int r6 = r * 3 / 5; - do - { - base_type::ren().blend_pixel(x + dy, y - dx, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x + dy, y + dx, base_type::line_color(), cover_full); - - if(dx) - { - base_type::ren().blend_vline(x+dy, y-dx+1, y+dx-1, base_type::fill_color(), cover_full); - } - ++dy; - dx += flip; - flip ^= 1; - } - while(dy < r6); - base_type::ren().blend_vline(x+dy, y-dx, y+dx, base_type::line_color(), cover_full); - } - else - { - base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - } - - - //-------------------------------------------------------------------- - void triangle_right(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) - { - int dy = -r; - int dx = 0; - int flip = 0; - int r6 = r * 3 / 5; - do - { - base_type::ren().blend_pixel(x - dy, y - dx, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x - dy, y + dx, base_type::line_color(), cover_full); - - if(dx) - { - base_type::ren().blend_vline(x-dy, y-dx+1, y+dx-1, base_type::fill_color(), cover_full); - } - ++dy; - dx += flip; - flip ^= 1; - } - while(dy < r6); - base_type::ren().blend_vline(x-dy, y-dx, y+dx, base_type::line_color(), cover_full); - } - else - { - base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - } - - - //-------------------------------------------------------------------- - void triangle_up(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) - { - int dy = -r; - int dx = 0; - int flip = 0; - int r6 = r * 3 / 5; - do - { - base_type::ren().blend_pixel(x - dx, y - dy, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x + dx, y - dy, base_type::line_color(), cover_full); - - if(dx) - { - base_type::ren().blend_hline(x-dx+1, y-dy, x+dx-1, base_type::fill_color(), cover_full); - } - ++dy; - dx += flip; - flip ^= 1; - } - while(dy < r6); - base_type::ren().blend_hline(x-dx, y-dy, x+dx, base_type::line_color(), cover_full); - } - else - { - base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - } - - - //-------------------------------------------------------------------- - void triangle_down(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) - { - int dy = -r; - int dx = 0; - int flip = 0; - int r6 = r * 3 / 5; - do - { - base_type::ren().blend_pixel(x - dx, y + dy, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x + dx, y + dy, base_type::line_color(), cover_full); - - if(dx) - { - base_type::ren().blend_hline(x-dx+1, y+dy, x+dx-1, base_type::fill_color(), cover_full); - } - ++dy; - dx += flip; - flip ^= 1; - } - while(dy < r6); - base_type::ren().blend_hline(x-dx, y+dy, x+dx, base_type::line_color(), cover_full); - } - else - { - base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - } - - - //-------------------------------------------------------------------- - void four_rays(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) - { - int dy = -r; - int dx = 0; - int flip = 0; - int r3 = -(r / 3); - do - { - base_type::ren().blend_pixel(x - dx, y + dy, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x + dx, y + dy, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x - dx, y - dy, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x + dx, y - dy, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x + dy, y - dx, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x + dy, y + dx, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x - dy, y - dx, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x - dy, y + dx, base_type::line_color(), cover_full); - - if(dx) - { - base_type::ren().blend_hline(x-dx+1, y+dy, x+dx-1, base_type::fill_color(), cover_full); - base_type::ren().blend_hline(x-dx+1, y-dy, x+dx-1, base_type::fill_color(), cover_full); - base_type::ren().blend_vline(x+dy, y-dx+1, y+dx-1, base_type::fill_color(), cover_full); - base_type::ren().blend_vline(x-dy, y-dx+1, y+dx-1, base_type::fill_color(), cover_full); - } - ++dy; - dx += flip; - flip ^= 1; - } - while(dy <= r3); - base_type::solid_rectangle(x+r3+1, y+r3+1, x-r3-1, y-r3-1); - } - else - { - base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - } - - - //-------------------------------------------------------------------- - void cross(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) - { - base_type::ren().blend_vline(x, y-r, y+r, base_type::line_color(), cover_full); - base_type::ren().blend_hline(x-r, y, x+r, base_type::line_color(), cover_full); - } - else - { - base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - } - - - //-------------------------------------------------------------------- - void xing(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) - { - int dy = -r * 7 / 10; - do - { - base_type::ren().blend_pixel(x + dy, y + dy, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x - dy, y + dy, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x + dy, y - dy, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x - dy, y - dy, base_type::line_color(), cover_full); - ++dy; - } - while(dy < 0); - } - base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - - - //-------------------------------------------------------------------- - void dash(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) base_type::ren().blend_hline(x-r, y, x+r, base_type::line_color(), cover_full); - else base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - - - //-------------------------------------------------------------------- - void dot(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) base_type::solid_ellipse(x, y, r, r); - else base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - - //-------------------------------------------------------------------- - void pixel(int x, int y, int) - { - base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - - //-------------------------------------------------------------------- - void marker(int x, int y, int r, marker_e type) - { - switch(type) - { - case marker_square: square(x, y, r); break; - case marker_diamond: diamond(x, y, r); break; - case marker_circle: circle(x, y, r); break; - case marker_crossed_circle: crossed_circle(x, y, r); break; - case marker_semiellipse_left: semiellipse_left(x, y, r); break; - case marker_semiellipse_right: semiellipse_right(x, y, r); break; - case marker_semiellipse_up: semiellipse_up(x, y, r); break; - case marker_semiellipse_down: semiellipse_down(x, y, r); break; - case marker_triangle_left: triangle_left(x, y, r); break; - case marker_triangle_right: triangle_right(x, y, r); break; - case marker_triangle_up: triangle_up(x, y, r); break; - case marker_triangle_down: triangle_down(x, y, r); break; - case marker_four_rays: four_rays(x, y, r); break; - case marker_cross: cross(x, y, r); break; - case marker_x: xing(x, y, r); break; - case marker_dash: dash(x, y, r); break; - case marker_dot: dot(x, y, r); break; - case marker_pixel: pixel(x, y, r); break; - } - } - - - //-------------------------------------------------------------------- - template - void markers(int n, const T* x, const T* y, T r, marker_e type) - { - if(n <= 0) return; - if(r == 0) - { - do - { - base_type::ren().blend_pixel(int(*x), int(*y), base_type::fill_color(), cover_full); - ++x; - ++y; - } - while(--n); - return; - } - - switch(type) - { - case marker_square: do { square (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_diamond: do { diamond (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_circle: do { circle (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_crossed_circle: do { crossed_circle (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_semiellipse_left: do { semiellipse_left (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_semiellipse_right: do { semiellipse_right(int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_semiellipse_up: do { semiellipse_up (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_semiellipse_down: do { semiellipse_down (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_triangle_left: do { triangle_left (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_triangle_right: do { triangle_right (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_triangle_up: do { triangle_up (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_triangle_down: do { triangle_down (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_four_rays: do { four_rays (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_cross: do { cross (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_x: do { xing (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_dash: do { dash (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_dot: do { dot (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_pixel: do { pixel (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - } - } - - //-------------------------------------------------------------------- - template - void markers(int n, const T* x, const T* y, const T* r, marker_e type) - { - if(n <= 0) return; - switch(type) - { - case marker_square: do { square (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_diamond: do { diamond (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_circle: do { circle (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_crossed_circle: do { crossed_circle (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_semiellipse_left: do { semiellipse_left (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_semiellipse_right: do { semiellipse_right(int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_semiellipse_up: do { semiellipse_up (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_semiellipse_down: do { semiellipse_down (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_triangle_left: do { triangle_left (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_triangle_right: do { triangle_right (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_triangle_up: do { triangle_up (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_triangle_down: do { triangle_down (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_four_rays: do { four_rays (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_cross: do { cross (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_x: do { xing (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_dash: do { dash (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_dot: do { dot (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_pixel: do { pixel (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - } - } - - //-------------------------------------------------------------------- - template - void markers(int n, const T* x, const T* y, const T* r, const color_type* fc, marker_e type) - { - if(n <= 0) return; - switch(type) - { - case marker_square: do { base_type::fill_color(*fc); square (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_diamond: do { base_type::fill_color(*fc); diamond (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_circle: do { base_type::fill_color(*fc); circle (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_crossed_circle: do { base_type::fill_color(*fc); crossed_circle (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_semiellipse_left: do { base_type::fill_color(*fc); semiellipse_left (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_semiellipse_right: do { base_type::fill_color(*fc); semiellipse_right(int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_semiellipse_up: do { base_type::fill_color(*fc); semiellipse_up (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_semiellipse_down: do { base_type::fill_color(*fc); semiellipse_down (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_triangle_left: do { base_type::fill_color(*fc); triangle_left (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_triangle_right: do { base_type::fill_color(*fc); triangle_right (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_triangle_up: do { base_type::fill_color(*fc); triangle_up (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_triangle_down: do { base_type::fill_color(*fc); triangle_down (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_four_rays: do { base_type::fill_color(*fc); four_rays (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_cross: do { base_type::fill_color(*fc); cross (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_x: do { base_type::fill_color(*fc); xing (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_dash: do { base_type::fill_color(*fc); dash (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_dot: do { base_type::fill_color(*fc); dot (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_pixel: do { base_type::fill_color(*fc); pixel (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - } - } - - //-------------------------------------------------------------------- - template - void markers(int n, const T* x, const T* y, const T* r, const color_type* fc, const color_type* lc, marker_e type) - { - if(n <= 0) return; - switch(type) - { - case marker_square: do { base_type::fill_color(*fc); base_type::line_color(*lc); square (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_diamond: do { base_type::fill_color(*fc); base_type::line_color(*lc); diamond (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_circle: do { base_type::fill_color(*fc); base_type::line_color(*lc); circle (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_crossed_circle: do { base_type::fill_color(*fc); base_type::line_color(*lc); crossed_circle (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_semiellipse_left: do { base_type::fill_color(*fc); base_type::line_color(*lc); semiellipse_left (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_semiellipse_right: do { base_type::fill_color(*fc); base_type::line_color(*lc); semiellipse_right(int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_semiellipse_up: do { base_type::fill_color(*fc); base_type::line_color(*lc); semiellipse_up (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_semiellipse_down: do { base_type::fill_color(*fc); base_type::line_color(*lc); semiellipse_down (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_triangle_left: do { base_type::fill_color(*fc); base_type::line_color(*lc); triangle_left (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_triangle_right: do { base_type::fill_color(*fc); base_type::line_color(*lc); triangle_right (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_triangle_up: do { base_type::fill_color(*fc); base_type::line_color(*lc); triangle_up (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_triangle_down: do { base_type::fill_color(*fc); base_type::line_color(*lc); triangle_down (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_four_rays: do { base_type::fill_color(*fc); base_type::line_color(*lc); four_rays (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_cross: do { base_type::fill_color(*fc); base_type::line_color(*lc); cross (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_x: do { base_type::fill_color(*fc); base_type::line_color(*lc); xing (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_dash: do { base_type::fill_color(*fc); base_type::line_color(*lc); dash (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_dot: do { base_type::fill_color(*fc); base_type::line_color(*lc); dot (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_pixel: do { base_type::fill_color(*fc); base_type::line_color(*lc); pixel (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - } - } - }; - -} - -#endif diff --git a/uppdev/agg24/agg_renderer_mclip.h b/uppdev/agg24/agg_renderer_mclip.h deleted file mode 100644 index 96a7d4e09..000000000 --- a/uppdev/agg24/agg_renderer_mclip.h +++ /dev/null @@ -1,349 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// class renderer_mclip -// -//---------------------------------------------------------------------------- - -#ifndef AGG_RENDERER_MCLIP_INCLUDED -#define AGG_RENDERER_MCLIP_INCLUDED - -#include "agg_basics.h" -#include "agg_array.h" -#include "agg_renderer_base.h" - -namespace agg -{ - - //----------------------------------------------------------renderer_mclip - template class renderer_mclip - { - public: - typedef PixelFormat pixfmt_type; - typedef typename pixfmt_type::color_type color_type; - typedef typename pixfmt_type::row_data row_data; - typedef renderer_base base_ren_type; - - //-------------------------------------------------------------------- - explicit renderer_mclip(pixfmt_type& pixf) : - m_ren(pixf), - m_curr_cb(0), - m_bounds(m_ren.xmin(), m_ren.ymin(), m_ren.xmax(), m_ren.ymax()) - {} - void attach(pixfmt_type& pixf) - { - m_ren.attach(pixf); - reset_clipping(true); - } - - //-------------------------------------------------------------------- - const pixfmt_type& ren() const { return m_ren.ren(); } - pixfmt_type& ren() { return m_ren.ren(); } - - //-------------------------------------------------------------------- - unsigned width() const { return m_ren.width(); } - unsigned height() const { return m_ren.height(); } - - //-------------------------------------------------------------------- - const rect_i& clip_box() const { return m_ren.clip_box(); } - int xmin() const { return m_ren.xmin(); } - int ymin() const { return m_ren.ymin(); } - int xmax() const { return m_ren.xmax(); } - int ymax() const { return m_ren.ymax(); } - - //-------------------------------------------------------------------- - const rect_i& bounding_clip_box() const { return m_bounds; } - int bounding_xmin() const { return m_bounds.x1; } - int bounding_ymin() const { return m_bounds.y1; } - int bounding_xmax() const { return m_bounds.x2; } - int bounding_ymax() const { return m_bounds.y2; } - - //-------------------------------------------------------------------- - void first_clip_box() - { - m_curr_cb = 0; - if(m_clip.size()) - { - const rect_i& cb = m_clip[0]; - m_ren.clip_box_naked(cb.x1, cb.y1, cb.x2, cb.y2); - } - } - - //-------------------------------------------------------------------- - bool next_clip_box() - { - if(++m_curr_cb < m_clip.size()) - { - const rect_i& cb = m_clip[m_curr_cb]; - m_ren.clip_box_naked(cb.x1, cb.y1, cb.x2, cb.y2); - return true; - } - return false; - } - - //-------------------------------------------------------------------- - void reset_clipping(bool visibility) - { - m_ren.reset_clipping(visibility); - m_clip.remove_all(); - m_curr_cb = 0; - m_bounds = m_ren.clip_box(); - } - - //-------------------------------------------------------------------- - void add_clip_box(int x1, int y1, int x2, int y2) - { - rect_i cb(x1, y1, x2, y2); - cb.normalize(); - if(cb.clip(rect_i(0, 0, width() - 1, height() - 1))) - { - m_clip.add(cb); - if(cb.x1 < m_bounds.x1) m_bounds.x1 = cb.x1; - if(cb.y1 < m_bounds.y1) m_bounds.y1 = cb.y1; - if(cb.x2 > m_bounds.x2) m_bounds.x2 = cb.x2; - if(cb.y2 > m_bounds.y2) m_bounds.y2 = cb.y2; - } - } - - //-------------------------------------------------------------------- - void clear(const color_type& c) - { - m_ren.clear(c); - } - - //-------------------------------------------------------------------- - void copy_pixel(int x, int y, const color_type& c) - { - first_clip_box(); - do - { - if(m_ren.inbox(x, y)) - { - m_ren.ren().copy_pixel(x, y, c); - break; - } - } - while(next_clip_box()); - } - - //-------------------------------------------------------------------- - void blend_pixel(int x, int y, const color_type& c, cover_type cover) - { - first_clip_box(); - do - { - if(m_ren.inbox(x, y)) - { - m_ren.ren().blend_pixel(x, y, c, cover); - break; - } - } - while(next_clip_box()); - } - - //-------------------------------------------------------------------- - color_type pixel(int x, int y) const - { - first_clip_box(); - do - { - if(m_ren.inbox(x, y)) - { - return m_ren.ren().pixel(x, y); - } - } - while(next_clip_box()); - return color_type::no_color(); - } - - //-------------------------------------------------------------------- - void copy_hline(int x1, int y, int x2, const color_type& c) - { - first_clip_box(); - do - { - m_ren.copy_hline(x1, y, x2, c); - } - while(next_clip_box()); - } - - //-------------------------------------------------------------------- - void copy_vline(int x, int y1, int y2, const color_type& c) - { - first_clip_box(); - do - { - m_ren.copy_vline(x, y1, y2, c); - } - while(next_clip_box()); - } - - //-------------------------------------------------------------------- - void blend_hline(int x1, int y, int x2, - const color_type& c, cover_type cover) - { - first_clip_box(); - do - { - m_ren.blend_hline(x1, y, x2, c, cover); - } - while(next_clip_box()); - } - - //-------------------------------------------------------------------- - void blend_vline(int x, int y1, int y2, - const color_type& c, cover_type cover) - { - first_clip_box(); - do - { - m_ren.blend_vline(x, y1, y2, c, cover); - } - while(next_clip_box()); - } - - //-------------------------------------------------------------------- - void copy_bar(int x1, int y1, int x2, int y2, const color_type& c) - { - first_clip_box(); - do - { - m_ren.copy_bar(x1, y1, x2, y2, c); - } - while(next_clip_box()); - } - - //-------------------------------------------------------------------- - void blend_bar(int x1, int y1, int x2, int y2, - const color_type& c, cover_type cover) - { - first_clip_box(); - do - { - m_ren.blend_bar(x1, y1, x2, y2, c, cover); - } - while(next_clip_box()); - } - - //-------------------------------------------------------------------- - void blend_solid_hspan(int x, int y, int len, - const color_type& c, const cover_type* covers) - { - first_clip_box(); - do - { - m_ren.blend_solid_hspan(x, y, len, c, covers); - } - while(next_clip_box()); - } - - //-------------------------------------------------------------------- - void blend_solid_vspan(int x, int y, int len, - const color_type& c, const cover_type* covers) - { - first_clip_box(); - do - { - m_ren.blend_solid_vspan(x, y, len, c, covers); - } - while(next_clip_box()); - } - - - //-------------------------------------------------------------------- - void copy_color_hspan(int x, int y, int len, const color_type* colors) - { - first_clip_box(); - do - { - m_ren.copy_color_hspan(x, y, len, colors); - } - while(next_clip_box()); - } - - //-------------------------------------------------------------------- - void blend_color_hspan(int x, int y, int len, - const color_type* colors, - const cover_type* covers, - cover_type cover = cover_full) - { - first_clip_box(); - do - { - m_ren.blend_color_hspan(x, y, len, colors, covers, cover); - } - while(next_clip_box()); - } - - //-------------------------------------------------------------------- - void blend_color_vspan(int x, int y, int len, - const color_type* colors, - const cover_type* covers, - cover_type cover = cover_full) - { - first_clip_box(); - do - { - m_ren.blend_color_vspan(x, y, len, colors, covers, cover); - } - while(next_clip_box()); - } - - //-------------------------------------------------------------------- - void copy_from(const rendering_buffer& from, - const rect_i* rc=0, - int x_to=0, - int y_to=0) - { - first_clip_box(); - do - { - m_ren.copy_from(from, rc, x_to, y_to); - } - while(next_clip_box()); - } - - //-------------------------------------------------------------------- - template - void blend_from(const SrcPixelFormatRenderer& src, - const rect_i* rect_src_ptr = 0, - int dx = 0, - int dy = 0, - cover_type cover = cover_full) - { - first_clip_box(); - do - { - m_ren.blend_from(src, rect_src_ptr, dx, dy, cover); - } - while(next_clip_box()); - } - - - private: - renderer_mclip(const renderer_mclip&); - const renderer_mclip& - operator = (const renderer_mclip&); - - base_ren_type m_ren; - pod_bvector m_clip; - unsigned m_curr_cb; - rect_i m_bounds; - }; - - -} - -#endif diff --git a/uppdev/agg24/agg_renderer_outline_aa.h b/uppdev/agg24/agg_renderer_outline_aa.h deleted file mode 100644 index e3629db72..000000000 --- a/uppdev/agg24/agg_renderer_outline_aa.h +++ /dev/null @@ -1,1837 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -#ifndef AGG_RENDERER_OUTLINE_AA_INCLUDED -#define AGG_RENDERER_OUTLINE_AA_INCLUDED - -#include "agg_array.h" -#include "agg_math.h" -#include "agg_line_aa_basics.h" -#include "agg_dda_line.h" -#include "agg_ellipse_bresenham.h" -#include "agg_renderer_base.h" -#include "agg_gamma_functions.h" -#include "agg_clip_liang_barsky.h" - -namespace agg -{ - - //===================================================distance_interpolator0 - class distance_interpolator0 - { - public: - //--------------------------------------------------------------------- - distance_interpolator0() {} - distance_interpolator0(int x1, int y1, int x2, int y2, int x, int y) : - m_dx(line_mr(x2) - line_mr(x1)), - m_dy(line_mr(y2) - line_mr(y1)), - m_dist((line_mr(x + line_subpixel_scale/2) - line_mr(x2)) * m_dy - - (line_mr(y + line_subpixel_scale/2) - line_mr(y2)) * m_dx) - { - m_dx <<= line_mr_subpixel_shift; - m_dy <<= line_mr_subpixel_shift; - } - - //--------------------------------------------------------------------- - void inc_x() { m_dist += m_dy; } - int dist() const { return m_dist; } - - private: - //--------------------------------------------------------------------- - int m_dx; - int m_dy; - int m_dist; - }; - - //==================================================distance_interpolator00 - class distance_interpolator00 - { - public: - //--------------------------------------------------------------------- - distance_interpolator00() {} - distance_interpolator00(int xc, int yc, - int x1, int y1, int x2, int y2, - int x, int y) : - m_dx1(line_mr(x1) - line_mr(xc)), - m_dy1(line_mr(y1) - line_mr(yc)), - m_dx2(line_mr(x2) - line_mr(xc)), - m_dy2(line_mr(y2) - line_mr(yc)), - m_dist1((line_mr(x + line_subpixel_scale/2) - line_mr(x1)) * m_dy1 - - (line_mr(y + line_subpixel_scale/2) - line_mr(y1)) * m_dx1), - m_dist2((line_mr(x + line_subpixel_scale/2) - line_mr(x2)) * m_dy2 - - (line_mr(y + line_subpixel_scale/2) - line_mr(y2)) * m_dx2) - { - m_dx1 <<= line_mr_subpixel_shift; - m_dy1 <<= line_mr_subpixel_shift; - m_dx2 <<= line_mr_subpixel_shift; - m_dy2 <<= line_mr_subpixel_shift; - } - - //--------------------------------------------------------------------- - void inc_x() { m_dist1 += m_dy1; m_dist2 += m_dy2; } - int dist1() const { return m_dist1; } - int dist2() const { return m_dist2; } - - private: - //--------------------------------------------------------------------- - int m_dx1; - int m_dy1; - int m_dx2; - int m_dy2; - int m_dist1; - int m_dist2; - }; - - //===================================================distance_interpolator1 - class distance_interpolator1 - { - public: - //--------------------------------------------------------------------- - distance_interpolator1() {} - distance_interpolator1(int x1, int y1, int x2, int y2, int x, int y) : - m_dx(x2 - x1), - m_dy(y2 - y1), - m_dist(iround(double(x + line_subpixel_scale/2 - x2) * double(m_dy) - - double(y + line_subpixel_scale/2 - y2) * double(m_dx))) - { - m_dx <<= line_subpixel_shift; - m_dy <<= line_subpixel_shift; - } - - //--------------------------------------------------------------------- - void inc_x() { m_dist += m_dy; } - void dec_x() { m_dist -= m_dy; } - void inc_y() { m_dist -= m_dx; } - void dec_y() { m_dist += m_dx; } - - //--------------------------------------------------------------------- - void inc_x(int dy) - { - m_dist += m_dy; - if(dy > 0) m_dist -= m_dx; - if(dy < 0) m_dist += m_dx; - } - - //--------------------------------------------------------------------- - void dec_x(int dy) - { - m_dist -= m_dy; - if(dy > 0) m_dist -= m_dx; - if(dy < 0) m_dist += m_dx; - } - - //--------------------------------------------------------------------- - void inc_y(int dx) - { - m_dist -= m_dx; - if(dx > 0) m_dist += m_dy; - if(dx < 0) m_dist -= m_dy; - } - - void dec_y(int dx) - //--------------------------------------------------------------------- - { - m_dist += m_dx; - if(dx > 0) m_dist += m_dy; - if(dx < 0) m_dist -= m_dy; - } - - //--------------------------------------------------------------------- - int dist() const { return m_dist; } - int dx() const { return m_dx; } - int dy() const { return m_dy; } - - private: - //--------------------------------------------------------------------- - int m_dx; - int m_dy; - int m_dist; - }; - - - - - - //===================================================distance_interpolator2 - class distance_interpolator2 - { - public: - //--------------------------------------------------------------------- - distance_interpolator2() {} - distance_interpolator2(int x1, int y1, int x2, int y2, - int sx, int sy, int x, int y) : - m_dx(x2 - x1), - m_dy(y2 - y1), - m_dx_start(line_mr(sx) - line_mr(x1)), - m_dy_start(line_mr(sy) - line_mr(y1)), - - m_dist(iround(double(x + line_subpixel_scale/2 - x2) * double(m_dy) - - double(y + line_subpixel_scale/2 - y2) * double(m_dx))), - - m_dist_start((line_mr(x + line_subpixel_scale/2) - line_mr(sx)) * m_dy_start - - (line_mr(y + line_subpixel_scale/2) - line_mr(sy)) * m_dx_start) - { - m_dx <<= line_subpixel_shift; - m_dy <<= line_subpixel_shift; - m_dx_start <<= line_mr_subpixel_shift; - m_dy_start <<= line_mr_subpixel_shift; - } - - distance_interpolator2(int x1, int y1, int x2, int y2, - int ex, int ey, int x, int y, int) : - m_dx(x2 - x1), - m_dy(y2 - y1), - m_dx_start(line_mr(ex) - line_mr(x2)), - m_dy_start(line_mr(ey) - line_mr(y2)), - - m_dist(iround(double(x + line_subpixel_scale/2 - x2) * double(m_dy) - - double(y + line_subpixel_scale/2 - y2) * double(m_dx))), - - m_dist_start((line_mr(x + line_subpixel_scale/2) - line_mr(ex)) * m_dy_start - - (line_mr(y + line_subpixel_scale/2) - line_mr(ey)) * m_dx_start) - { - m_dx <<= line_subpixel_shift; - m_dy <<= line_subpixel_shift; - m_dx_start <<= line_mr_subpixel_shift; - m_dy_start <<= line_mr_subpixel_shift; - } - - - //--------------------------------------------------------------------- - void inc_x() { m_dist += m_dy; m_dist_start += m_dy_start; } - void dec_x() { m_dist -= m_dy; m_dist_start -= m_dy_start; } - void inc_y() { m_dist -= m_dx; m_dist_start -= m_dx_start; } - void dec_y() { m_dist += m_dx; m_dist_start += m_dx_start; } - - //--------------------------------------------------------------------- - void inc_x(int dy) - { - m_dist += m_dy; - m_dist_start += m_dy_start; - if(dy > 0) - { - m_dist -= m_dx; - m_dist_start -= m_dx_start; - } - if(dy < 0) - { - m_dist += m_dx; - m_dist_start += m_dx_start; - } - } - - //--------------------------------------------------------------------- - void dec_x(int dy) - { - m_dist -= m_dy; - m_dist_start -= m_dy_start; - if(dy > 0) - { - m_dist -= m_dx; - m_dist_start -= m_dx_start; - } - if(dy < 0) - { - m_dist += m_dx; - m_dist_start += m_dx_start; - } - } - - //--------------------------------------------------------------------- - void inc_y(int dx) - { - m_dist -= m_dx; - m_dist_start -= m_dx_start; - if(dx > 0) - { - m_dist += m_dy; - m_dist_start += m_dy_start; - } - if(dx < 0) - { - m_dist -= m_dy; - m_dist_start -= m_dy_start; - } - } - - //--------------------------------------------------------------------- - void dec_y(int dx) - { - m_dist += m_dx; - m_dist_start += m_dx_start; - if(dx > 0) - { - m_dist += m_dy; - m_dist_start += m_dy_start; - } - if(dx < 0) - { - m_dist -= m_dy; - m_dist_start -= m_dy_start; - } - } - - //--------------------------------------------------------------------- - int dist() const { return m_dist; } - int dist_start() const { return m_dist_start; } - int dist_end() const { return m_dist_start; } - - //--------------------------------------------------------------------- - int dx() const { return m_dx; } - int dy() const { return m_dy; } - int dx_start() const { return m_dx_start; } - int dy_start() const { return m_dy_start; } - int dx_end() const { return m_dx_start; } - int dy_end() const { return m_dy_start; } - - private: - //--------------------------------------------------------------------- - int m_dx; - int m_dy; - int m_dx_start; - int m_dy_start; - - int m_dist; - int m_dist_start; - }; - - - - - - //===================================================distance_interpolator3 - class distance_interpolator3 - { - public: - //--------------------------------------------------------------------- - distance_interpolator3() {} - distance_interpolator3(int x1, int y1, int x2, int y2, - int sx, int sy, int ex, int ey, - int x, int y) : - m_dx(x2 - x1), - m_dy(y2 - y1), - m_dx_start(line_mr(sx) - line_mr(x1)), - m_dy_start(line_mr(sy) - line_mr(y1)), - m_dx_end(line_mr(ex) - line_mr(x2)), - m_dy_end(line_mr(ey) - line_mr(y2)), - - m_dist(iround(double(x + line_subpixel_scale/2 - x2) * double(m_dy) - - double(y + line_subpixel_scale/2 - y2) * double(m_dx))), - - m_dist_start((line_mr(x + line_subpixel_scale/2) - line_mr(sx)) * m_dy_start - - (line_mr(y + line_subpixel_scale/2) - line_mr(sy)) * m_dx_start), - - m_dist_end((line_mr(x + line_subpixel_scale/2) - line_mr(ex)) * m_dy_end - - (line_mr(y + line_subpixel_scale/2) - line_mr(ey)) * m_dx_end) - { - m_dx <<= line_subpixel_shift; - m_dy <<= line_subpixel_shift; - m_dx_start <<= line_mr_subpixel_shift; - m_dy_start <<= line_mr_subpixel_shift; - m_dx_end <<= line_mr_subpixel_shift; - m_dy_end <<= line_mr_subpixel_shift; - } - - //--------------------------------------------------------------------- - void inc_x() { m_dist += m_dy; m_dist_start += m_dy_start; m_dist_end += m_dy_end; } - void dec_x() { m_dist -= m_dy; m_dist_start -= m_dy_start; m_dist_end -= m_dy_end; } - void inc_y() { m_dist -= m_dx; m_dist_start -= m_dx_start; m_dist_end -= m_dx_end; } - void dec_y() { m_dist += m_dx; m_dist_start += m_dx_start; m_dist_end += m_dx_end; } - - //--------------------------------------------------------------------- - void inc_x(int dy) - { - m_dist += m_dy; - m_dist_start += m_dy_start; - m_dist_end += m_dy_end; - if(dy > 0) - { - m_dist -= m_dx; - m_dist_start -= m_dx_start; - m_dist_end -= m_dx_end; - } - if(dy < 0) - { - m_dist += m_dx; - m_dist_start += m_dx_start; - m_dist_end += m_dx_end; - } - } - - //--------------------------------------------------------------------- - void dec_x(int dy) - { - m_dist -= m_dy; - m_dist_start -= m_dy_start; - m_dist_end -= m_dy_end; - if(dy > 0) - { - m_dist -= m_dx; - m_dist_start -= m_dx_start; - m_dist_end -= m_dx_end; - } - if(dy < 0) - { - m_dist += m_dx; - m_dist_start += m_dx_start; - m_dist_end += m_dx_end; - } - } - - //--------------------------------------------------------------------- - void inc_y(int dx) - { - m_dist -= m_dx; - m_dist_start -= m_dx_start; - m_dist_end -= m_dx_end; - if(dx > 0) - { - m_dist += m_dy; - m_dist_start += m_dy_start; - m_dist_end += m_dy_end; - } - if(dx < 0) - { - m_dist -= m_dy; - m_dist_start -= m_dy_start; - m_dist_end -= m_dy_end; - } - } - - //--------------------------------------------------------------------- - void dec_y(int dx) - { - m_dist += m_dx; - m_dist_start += m_dx_start; - m_dist_end += m_dx_end; - if(dx > 0) - { - m_dist += m_dy; - m_dist_start += m_dy_start; - m_dist_end += m_dy_end; - } - if(dx < 0) - { - m_dist -= m_dy; - m_dist_start -= m_dy_start; - m_dist_end -= m_dy_end; - } - } - - //--------------------------------------------------------------------- - int dist() const { return m_dist; } - int dist_start() const { return m_dist_start; } - int dist_end() const { return m_dist_end; } - - //--------------------------------------------------------------------- - int dx() const { return m_dx; } - int dy() const { return m_dy; } - int dx_start() const { return m_dx_start; } - int dy_start() const { return m_dy_start; } - int dx_end() const { return m_dx_end; } - int dy_end() const { return m_dy_end; } - - private: - //--------------------------------------------------------------------- - int m_dx; - int m_dy; - int m_dx_start; - int m_dy_start; - int m_dx_end; - int m_dy_end; - - int m_dist; - int m_dist_start; - int m_dist_end; - }; - - - - - - //================================================line_interpolator_aa_base - template class line_interpolator_aa_base - { - public: - typedef Renderer renderer_type; - typedef typename Renderer::color_type color_type; - - //--------------------------------------------------------------------- - enum max_half_width_e - { - max_half_width = 64 - }; - - //--------------------------------------------------------------------- - line_interpolator_aa_base(renderer_type& ren, const line_parameters& lp) : - m_lp(&lp), - m_li(lp.vertical ? line_dbl_hr(lp.x2 - lp.x1) : - line_dbl_hr(lp.y2 - lp.y1), - lp.vertical ? abs(lp.y2 - lp.y1) : - abs(lp.x2 - lp.x1) + 1), - m_ren(ren), - m_len((lp.vertical == (lp.inc > 0)) ? -lp.len : lp.len), - m_x(lp.x1 >> line_subpixel_shift), - m_y(lp.y1 >> line_subpixel_shift), - m_old_x(m_x), - m_old_y(m_y), - m_count((lp.vertical ? abs((lp.y2 >> line_subpixel_shift) - m_y) : - abs((lp.x2 >> line_subpixel_shift) - m_x))), - m_width(ren.subpixel_width()), - //m_max_extent(m_width >> (line_subpixel_shift - 2)), - m_max_extent((m_width + line_subpixel_mask) >> line_subpixel_shift), - m_step(0) - { - agg::dda2_line_interpolator li(0, lp.vertical ? - (lp.dy << agg::line_subpixel_shift) : - (lp.dx << agg::line_subpixel_shift), - lp.len); - - unsigned i; - int stop = m_width + line_subpixel_scale * 2; - for(i = 0; i < max_half_width; ++i) - { - m_dist[i] = li.y(); - if(m_dist[i] >= stop) break; - ++li; - } - m_dist[i++] = 0x7FFF0000; - } - - //--------------------------------------------------------------------- - template int step_hor_base(DI& di) - { - ++m_li; - m_x += m_lp->inc; - m_y = (m_lp->y1 + m_li.y()) >> line_subpixel_shift; - - if(m_lp->inc > 0) di.inc_x(m_y - m_old_y); - else di.dec_x(m_y - m_old_y); - - m_old_y = m_y; - - return di.dist() / m_len; - } - - //--------------------------------------------------------------------- - template int step_ver_base(DI& di) - { - ++m_li; - m_y += m_lp->inc; - m_x = (m_lp->x1 + m_li.y()) >> line_subpixel_shift; - - if(m_lp->inc > 0) di.inc_y(m_x - m_old_x); - else di.dec_y(m_x - m_old_x); - - m_old_x = m_x; - - return di.dist() / m_len; - } - - //--------------------------------------------------------------------- - bool vertical() const { return m_lp->vertical; } - int width() const { return m_width; } - int count() const { return m_count; } - - private: - line_interpolator_aa_base(const line_interpolator_aa_base&); - const line_interpolator_aa_base& - operator = (const line_interpolator_aa_base&); - - protected: - const line_parameters* m_lp; - dda2_line_interpolator m_li; - renderer_type& m_ren; - int m_len; - int m_x; - int m_y; - int m_old_x; - int m_old_y; - int m_count; - int m_width; - int m_max_extent; - int m_step; - int m_dist[max_half_width + 1]; - cover_type m_covers[max_half_width * 2 + 4]; - }; - - - - - - - - //====================================================line_interpolator_aa0 - template class line_interpolator_aa0 : - public line_interpolator_aa_base - { - public: - typedef Renderer renderer_type; - typedef typename Renderer::color_type color_type; - typedef line_interpolator_aa_base base_type; - - //--------------------------------------------------------------------- - line_interpolator_aa0(renderer_type& ren, const line_parameters& lp) : - line_interpolator_aa_base(ren, lp), - m_di(lp.x1, lp.y1, lp.x2, lp.y2, - lp.x1 & ~line_subpixel_mask, lp.y1 & ~line_subpixel_mask) - { - base_type::m_li.adjust_forward(); - } - - //--------------------------------------------------------------------- - bool step_hor() - { - int dist; - int dy; - int s1 = base_type::step_hor_base(m_di); - cover_type* p0 = base_type::m_covers + base_type::max_half_width + 2; - cover_type* p1 = p0; - - *p1++ = (cover_type)base_type::m_ren.cover(s1); - - dy = 1; - while((dist = base_type::m_dist[dy] - s1) <= base_type::m_width) - { - *p1++ = (cover_type)base_type::m_ren.cover(dist); - ++dy; - } - - dy = 1; - while((dist = base_type::m_dist[dy] + s1) <= base_type::m_width) - { - *--p0 = (cover_type)base_type::m_ren.cover(dist); - ++dy; - } - base_type::m_ren.blend_solid_vspan(base_type::m_x, - base_type::m_y - dy + 1, - unsigned(p1 - p0), - p0); - return ++base_type::m_step < base_type::m_count; - } - - //--------------------------------------------------------------------- - bool step_ver() - { - int dist; - int dx; - int s1 = base_type::step_ver_base(m_di); - cover_type* p0 = base_type::m_covers + base_type::max_half_width + 2; - cover_type* p1 = p0; - - *p1++ = (cover_type)base_type::m_ren.cover(s1); - - dx = 1; - while((dist = base_type::m_dist[dx] - s1) <= base_type::m_width) - { - *p1++ = (cover_type)base_type::m_ren.cover(dist); - ++dx; - } - - dx = 1; - while((dist = base_type::m_dist[dx] + s1) <= base_type::m_width) - { - *--p0 = (cover_type)base_type::m_ren.cover(dist); - ++dx; - } - base_type::m_ren.blend_solid_hspan(base_type::m_x - dx + 1, - base_type::m_y, - unsigned(p1 - p0), - p0); - return ++base_type::m_step < base_type::m_count; - } - - private: - line_interpolator_aa0(const line_interpolator_aa0&); - const line_interpolator_aa0& - operator = (const line_interpolator_aa0&); - - //--------------------------------------------------------------------- - distance_interpolator1 m_di; - }; - - - - - - - //====================================================line_interpolator_aa1 - template class line_interpolator_aa1 : - public line_interpolator_aa_base - { - public: - typedef Renderer renderer_type; - typedef typename Renderer::color_type color_type; - typedef line_interpolator_aa_base base_type; - - //--------------------------------------------------------------------- - line_interpolator_aa1(renderer_type& ren, const line_parameters& lp, - int sx, int sy) : - line_interpolator_aa_base(ren, lp), - m_di(lp.x1, lp.y1, lp.x2, lp.y2, sx, sy, - lp.x1 & ~line_subpixel_mask, lp.y1 & ~line_subpixel_mask) - { - int dist1_start; - int dist2_start; - - int npix = 1; - - if(lp.vertical) - { - do - { - --base_type::m_li; - base_type::m_y -= lp.inc; - base_type::m_x = (base_type::m_lp->x1 + base_type::m_li.y()) >> line_subpixel_shift; - - if(lp.inc > 0) m_di.dec_y(base_type::m_x - base_type::m_old_x); - else m_di.inc_y(base_type::m_x - base_type::m_old_x); - - base_type::m_old_x = base_type::m_x; - - dist1_start = dist2_start = m_di.dist_start(); - - int dx = 0; - if(dist1_start < 0) ++npix; - do - { - dist1_start += m_di.dy_start(); - dist2_start -= m_di.dy_start(); - if(dist1_start < 0) ++npix; - if(dist2_start < 0) ++npix; - ++dx; - } - while(base_type::m_dist[dx] <= base_type::m_width); - --base_type::m_step; - if(npix == 0) break; - npix = 0; - } - while(base_type::m_step >= -base_type::m_max_extent); - } - else - { - do - { - --base_type::m_li; - base_type::m_x -= lp.inc; - base_type::m_y = (base_type::m_lp->y1 + base_type::m_li.y()) >> line_subpixel_shift; - - if(lp.inc > 0) m_di.dec_x(base_type::m_y - base_type::m_old_y); - else m_di.inc_x(base_type::m_y - base_type::m_old_y); - - base_type::m_old_y = base_type::m_y; - - dist1_start = dist2_start = m_di.dist_start(); - - int dy = 0; - if(dist1_start < 0) ++npix; - do - { - dist1_start -= m_di.dx_start(); - dist2_start += m_di.dx_start(); - if(dist1_start < 0) ++npix; - if(dist2_start < 0) ++npix; - ++dy; - } - while(base_type::m_dist[dy] <= base_type::m_width); - --base_type::m_step; - if(npix == 0) break; - npix = 0; - } - while(base_type::m_step >= -base_type::m_max_extent); - } - base_type::m_li.adjust_forward(); - } - - //--------------------------------------------------------------------- - bool step_hor() - { - int dist_start; - int dist; - int dy; - int s1 = base_type::step_hor_base(m_di); - - dist_start = m_di.dist_start(); - cover_type* p0 = base_type::m_covers + base_type::max_half_width + 2; - cover_type* p1 = p0; - - *p1 = 0; - if(dist_start <= 0) - { - *p1 = (cover_type)base_type::m_ren.cover(s1); - } - ++p1; - - dy = 1; - while((dist = base_type::m_dist[dy] - s1) <= base_type::m_width) - { - dist_start -= m_di.dx_start(); - *p1 = 0; - if(dist_start <= 0) - { - *p1 = (cover_type)base_type::m_ren.cover(dist); - } - ++p1; - ++dy; - } - - dy = 1; - dist_start = m_di.dist_start(); - while((dist = base_type::m_dist[dy] + s1) <= base_type::m_width) - { - dist_start += m_di.dx_start(); - *--p0 = 0; - if(dist_start <= 0) - { - *p0 = (cover_type)base_type::m_ren.cover(dist); - } - ++dy; - } - - base_type::m_ren.blend_solid_vspan(base_type::m_x, - base_type::m_y - dy + 1, - unsigned(p1 - p0), - p0); - return ++base_type::m_step < base_type::m_count; - } - - //--------------------------------------------------------------------- - bool step_ver() - { - int dist_start; - int dist; - int dx; - int s1 = base_type::step_ver_base(m_di); - cover_type* p0 = base_type::m_covers + base_type::max_half_width + 2; - cover_type* p1 = p0; - - dist_start = m_di.dist_start(); - - *p1 = 0; - if(dist_start <= 0) - { - *p1 = (cover_type)base_type::m_ren.cover(s1); - } - ++p1; - - dx = 1; - while((dist = base_type::m_dist[dx] - s1) <= base_type::m_width) - { - dist_start += m_di.dy_start(); - *p1 = 0; - if(dist_start <= 0) - { - *p1 = (cover_type)base_type::m_ren.cover(dist); - } - ++p1; - ++dx; - } - - dx = 1; - dist_start = m_di.dist_start(); - while((dist = base_type::m_dist[dx] + s1) <= base_type::m_width) - { - dist_start -= m_di.dy_start(); - *--p0 = 0; - if(dist_start <= 0) - { - *p0 = (cover_type)base_type::m_ren.cover(dist); - } - ++dx; - } - base_type::m_ren.blend_solid_hspan(base_type::m_x - dx + 1, - base_type::m_y, - unsigned(p1 - p0), - p0); - return ++base_type::m_step < base_type::m_count; - } - - private: - line_interpolator_aa1(const line_interpolator_aa1&); - const line_interpolator_aa1& - operator = (const line_interpolator_aa1&); - - //--------------------------------------------------------------------- - distance_interpolator2 m_di; - }; - - - - - - - - - - - - - //====================================================line_interpolator_aa2 - template class line_interpolator_aa2 : - public line_interpolator_aa_base - { - public: - typedef Renderer renderer_type; - typedef typename Renderer::color_type color_type; - typedef line_interpolator_aa_base base_type; - - //--------------------------------------------------------------------- - line_interpolator_aa2(renderer_type& ren, const line_parameters& lp, - int ex, int ey) : - line_interpolator_aa_base(ren, lp), - m_di(lp.x1, lp.y1, lp.x2, lp.y2, ex, ey, - lp.x1 & ~line_subpixel_mask, lp.y1 & ~line_subpixel_mask, - 0) - { - base_type::m_li.adjust_forward(); - base_type::m_step -= base_type::m_max_extent; - } - - //--------------------------------------------------------------------- - bool step_hor() - { - int dist_end; - int dist; - int dy; - int s1 = base_type::step_hor_base(m_di); - cover_type* p0 = base_type::m_covers + base_type::max_half_width + 2; - cover_type* p1 = p0; - - dist_end = m_di.dist_end(); - - int npix = 0; - *p1 = 0; - if(dist_end > 0) - { - *p1 = (cover_type)base_type::m_ren.cover(s1); - ++npix; - } - ++p1; - - dy = 1; - while((dist = base_type::m_dist[dy] - s1) <= base_type::m_width) - { - dist_end -= m_di.dx_end(); - *p1 = 0; - if(dist_end > 0) - { - *p1 = (cover_type)base_type::m_ren.cover(dist); - ++npix; - } - ++p1; - ++dy; - } - - dy = 1; - dist_end = m_di.dist_end(); - while((dist = base_type::m_dist[dy] + s1) <= base_type::m_width) - { - dist_end += m_di.dx_end(); - *--p0 = 0; - if(dist_end > 0) - { - *p0 = (cover_type)base_type::m_ren.cover(dist); - ++npix; - } - ++dy; - } - base_type::m_ren.blend_solid_vspan(base_type::m_x, - base_type::m_y - dy + 1, - unsigned(p1 - p0), - p0); - return npix && ++base_type::m_step < base_type::m_count; - } - - //--------------------------------------------------------------------- - bool step_ver() - { - int dist_end; - int dist; - int dx; - int s1 = base_type::step_ver_base(m_di); - cover_type* p0 = base_type::m_covers + base_type::max_half_width + 2; - cover_type* p1 = p0; - - dist_end = m_di.dist_end(); - - int npix = 0; - *p1 = 0; - if(dist_end > 0) - { - *p1 = (cover_type)base_type::m_ren.cover(s1); - ++npix; - } - ++p1; - - dx = 1; - while((dist = base_type::m_dist[dx] - s1) <= base_type::m_width) - { - dist_end += m_di.dy_end(); - *p1 = 0; - if(dist_end > 0) - { - *p1 = (cover_type)base_type::m_ren.cover(dist); - ++npix; - } - ++p1; - ++dx; - } - - dx = 1; - dist_end = m_di.dist_end(); - while((dist = base_type::m_dist[dx] + s1) <= base_type::m_width) - { - dist_end -= m_di.dy_end(); - *--p0 = 0; - if(dist_end > 0) - { - *p0 = (cover_type)base_type::m_ren.cover(dist); - ++npix; - } - ++dx; - } - base_type::m_ren.blend_solid_hspan(base_type::m_x - dx + 1, - base_type::m_y, - unsigned(p1 - p0), - p0); - return npix && ++base_type::m_step < base_type::m_count; - } - - private: - line_interpolator_aa2(const line_interpolator_aa2&); - const line_interpolator_aa2& - operator = (const line_interpolator_aa2&); - - //--------------------------------------------------------------------- - distance_interpolator2 m_di; - }; - - - - - - - - - - - //====================================================line_interpolator_aa3 - template class line_interpolator_aa3 : - public line_interpolator_aa_base - { - public: - typedef Renderer renderer_type; - typedef typename Renderer::color_type color_type; - typedef line_interpolator_aa_base base_type; - - //--------------------------------------------------------------------- - line_interpolator_aa3(renderer_type& ren, const line_parameters& lp, - int sx, int sy, int ex, int ey) : - line_interpolator_aa_base(ren, lp), - m_di(lp.x1, lp.y1, lp.x2, lp.y2, sx, sy, ex, ey, - lp.x1 & ~line_subpixel_mask, lp.y1 & ~line_subpixel_mask) - { - int dist1_start; - int dist2_start; - int npix = 1; - if(lp.vertical) - { - do - { - --base_type::m_li; - base_type::m_y -= lp.inc; - base_type::m_x = (base_type::m_lp->x1 + base_type::m_li.y()) >> line_subpixel_shift; - - if(lp.inc > 0) m_di.dec_y(base_type::m_x - base_type::m_old_x); - else m_di.inc_y(base_type::m_x - base_type::m_old_x); - - base_type::m_old_x = base_type::m_x; - - dist1_start = dist2_start = m_di.dist_start(); - - int dx = 0; - if(dist1_start < 0) ++npix; - do - { - dist1_start += m_di.dy_start(); - dist2_start -= m_di.dy_start(); - if(dist1_start < 0) ++npix; - if(dist2_start < 0) ++npix; - ++dx; - } - while(base_type::m_dist[dx] <= base_type::m_width); - if(npix == 0) break; - npix = 0; - } - while(--base_type::m_step >= -base_type::m_max_extent); - } - else - { - do - { - --base_type::m_li; - base_type::m_x -= lp.inc; - base_type::m_y = (base_type::m_lp->y1 + base_type::m_li.y()) >> line_subpixel_shift; - - if(lp.inc > 0) m_di.dec_x(base_type::m_y - base_type::m_old_y); - else m_di.inc_x(base_type::m_y - base_type::m_old_y); - - base_type::m_old_y = base_type::m_y; - - dist1_start = dist2_start = m_di.dist_start(); - - int dy = 0; - if(dist1_start < 0) ++npix; - do - { - dist1_start -= m_di.dx_start(); - dist2_start += m_di.dx_start(); - if(dist1_start < 0) ++npix; - if(dist2_start < 0) ++npix; - ++dy; - } - while(base_type::m_dist[dy] <= base_type::m_width); - if(npix == 0) break; - npix = 0; - } - while(--base_type::m_step >= -base_type::m_max_extent); - } - base_type::m_li.adjust_forward(); - base_type::m_step -= base_type::m_max_extent; - } - - - //--------------------------------------------------------------------- - bool step_hor() - { - int dist_start; - int dist_end; - int dist; - int dy; - int s1 = base_type::step_hor_base(m_di); - cover_type* p0 = base_type::m_covers + base_type::max_half_width + 2; - cover_type* p1 = p0; - - dist_start = m_di.dist_start(); - dist_end = m_di.dist_end(); - - int npix = 0; - *p1 = 0; - if(dist_end > 0) - { - if(dist_start <= 0) - { - *p1 = (cover_type)base_type::m_ren.cover(s1); - } - ++npix; - } - ++p1; - - dy = 1; - while((dist = base_type::m_dist[dy] - s1) <= base_type::m_width) - { - dist_start -= m_di.dx_start(); - dist_end -= m_di.dx_end(); - *p1 = 0; - if(dist_end > 0 && dist_start <= 0) - { - *p1 = (cover_type)base_type::m_ren.cover(dist); - ++npix; - } - ++p1; - ++dy; - } - - dy = 1; - dist_start = m_di.dist_start(); - dist_end = m_di.dist_end(); - while((dist = base_type::m_dist[dy] + s1) <= base_type::m_width) - { - dist_start += m_di.dx_start(); - dist_end += m_di.dx_end(); - *--p0 = 0; - if(dist_end > 0 && dist_start <= 0) - { - *p0 = (cover_type)base_type::m_ren.cover(dist); - ++npix; - } - ++dy; - } - base_type::m_ren.blend_solid_vspan(base_type::m_x, - base_type::m_y - dy + 1, - unsigned(p1 - p0), - p0); - return npix && ++base_type::m_step < base_type::m_count; - } - - //--------------------------------------------------------------------- - bool step_ver() - { - int dist_start; - int dist_end; - int dist; - int dx; - int s1 = base_type::step_ver_base(m_di); - cover_type* p0 = base_type::m_covers + base_type::max_half_width + 2; - cover_type* p1 = p0; - - dist_start = m_di.dist_start(); - dist_end = m_di.dist_end(); - - int npix = 0; - *p1 = 0; - if(dist_end > 0) - { - if(dist_start <= 0) - { - *p1 = (cover_type)base_type::m_ren.cover(s1); - } - ++npix; - } - ++p1; - - dx = 1; - while((dist = base_type::m_dist[dx] - s1) <= base_type::m_width) - { - dist_start += m_di.dy_start(); - dist_end += m_di.dy_end(); - *p1 = 0; - if(dist_end > 0 && dist_start <= 0) - { - *p1 = (cover_type)base_type::m_ren.cover(dist); - ++npix; - } - ++p1; - ++dx; - } - - dx = 1; - dist_start = m_di.dist_start(); - dist_end = m_di.dist_end(); - while((dist = base_type::m_dist[dx] + s1) <= base_type::m_width) - { - dist_start -= m_di.dy_start(); - dist_end -= m_di.dy_end(); - *--p0 = 0; - if(dist_end > 0 && dist_start <= 0) - { - *p0 = (cover_type)base_type::m_ren.cover(dist); - ++npix; - } - ++dx; - } - base_type::m_ren.blend_solid_hspan(base_type::m_x - dx + 1, - base_type::m_y, - unsigned(p1 - p0), - p0); - return npix && ++base_type::m_step < base_type::m_count; - } - - private: - line_interpolator_aa3(const line_interpolator_aa3&); - const line_interpolator_aa3& - operator = (const line_interpolator_aa3&); - - //--------------------------------------------------------------------- - distance_interpolator3 m_di; - }; - - - - - //==========================================================line_profile_aa - // - // See Implementation agg_line_profile_aa.cpp - // - class line_profile_aa - { - public: - //--------------------------------------------------------------------- - typedef int8u value_type; - enum subpixel_scale_e - { - subpixel_shift = line_subpixel_shift, - subpixel_scale = 1 << subpixel_shift, - subpixel_mask = subpixel_scale - 1 - }; - - enum aa_scale_e - { - aa_shift = 8, - aa_scale = 1 << aa_shift, - aa_mask = aa_scale - 1 - }; - - //--------------------------------------------------------------------- - line_profile_aa() : - m_subpixel_width(0), - m_min_width(1.0), - m_smoother_width(1.0) - { - int i; - for(i = 0; i < aa_scale; i++) m_gamma[i] = (value_type)i; - } - - //--------------------------------------------------------------------- - template - line_profile_aa(double w, const GammaF& gamma_function) : - m_subpixel_width(0), - m_min_width(1.0), - m_smoother_width(1.0) - { - gamma(gamma_function); - width(w); - } - - //--------------------------------------------------------------------- - void min_width(double w) { m_min_width = w; } - void smoother_width(double w) { m_smoother_width = w; } - - //--------------------------------------------------------------------- - template void gamma(const GammaF& gamma_function) - { - int i; - for(i = 0; i < aa_scale; i++) - { - m_gamma[i] = value_type( - uround(gamma_function(double(i) / aa_mask) * aa_mask)); - } - } - - void width(double w); - - unsigned profile_size() const { return m_profile.size(); } - int subpixel_width() const { return m_subpixel_width; } - - //--------------------------------------------------------------------- - double min_width() const { return m_min_width; } - double smoother_width() const { return m_smoother_width; } - - //--------------------------------------------------------------------- - value_type value(int dist) const - { - return m_profile[dist + subpixel_scale*2]; - } - - private: - line_profile_aa(const line_profile_aa&); - const line_profile_aa& operator = (const line_profile_aa&); - - value_type* profile(double w); - void set(double center_width, double smoother_width); - - //--------------------------------------------------------------------- - pod_array m_profile; - value_type m_gamma[aa_scale]; - int m_subpixel_width; - double m_min_width; - double m_smoother_width; - }; - - - //======================================================renderer_outline_aa - template class renderer_outline_aa - { - public: - //--------------------------------------------------------------------- - typedef BaseRenderer base_ren_type; - typedef renderer_outline_aa self_type; - typedef typename base_ren_type::color_type color_type; - - //--------------------------------------------------------------------- - renderer_outline_aa(base_ren_type& ren, const line_profile_aa& prof) : - m_ren(&ren), - m_profile(&prof), - m_clip_box(0,0,0,0), - m_clipping(false) - {} - void attach(base_ren_type& ren) { m_ren = &ren; } - - //--------------------------------------------------------------------- - void color(const color_type& c) { m_color = c; } - const color_type& color() const { return m_color; } - - //--------------------------------------------------------------------- - void profile(const line_profile_aa& prof) { m_profile = &prof; } - const line_profile_aa& profile() const { return *m_profile; } - line_profile_aa& profile() { return *m_profile; } - - //--------------------------------------------------------------------- - int subpixel_width() const { return m_profile->subpixel_width(); } - - //--------------------------------------------------------------------- - void reset_clipping() { m_clipping = false; } - void clip_box(double x1, double y1, double x2, double y2) - { - m_clip_box.x1 = line_coord_sat::conv(x1); - m_clip_box.y1 = line_coord_sat::conv(y1); - m_clip_box.x2 = line_coord_sat::conv(x2); - m_clip_box.y2 = line_coord_sat::conv(y2); - m_clipping = true; - } - - //--------------------------------------------------------------------- - int cover(int d) const - { - return m_profile->value(d); - } - - //------------------------------------------------------------------------- - void blend_solid_hspan(int x, int y, unsigned len, const cover_type* covers) - { - m_ren->blend_solid_hspan(x, y, len, m_color, covers); - } - - //------------------------------------------------------------------------- - void blend_solid_vspan(int x, int y, unsigned len, const cover_type* covers) - { - m_ren->blend_solid_vspan(x, y, len, m_color, covers); - } - - //------------------------------------------------------------------------- - static bool accurate_join_only() { return false; } - - //------------------------------------------------------------------------- - template - void semidot_hline(Cmp cmp, - int xc1, int yc1, int xc2, int yc2, - int x1, int y1, int x2) - { - cover_type covers[line_interpolator_aa_base::max_half_width * 2 + 4]; - cover_type* p0 = covers; - cover_type* p1 = covers; - int x = x1 << line_subpixel_shift; - int y = y1 << line_subpixel_shift; - int w = subpixel_width(); - distance_interpolator0 di(xc1, yc1, xc2, yc2, x, y); - x += line_subpixel_scale/2; - y += line_subpixel_scale/2; - - int x0 = x1; - int dx = x - xc1; - int dy = y - yc1; - do - { - int d = int(fast_sqrt(dx*dx + dy*dy)); - *p1 = 0; - if(cmp(di.dist()) && d <= w) - { - *p1 = (cover_type)cover(d); - } - ++p1; - dx += line_subpixel_scale; - di.inc_x(); - } - while(++x1 <= x2); - m_ren->blend_solid_hspan(x0, y1, - unsigned(p1 - p0), - color(), - p0); - } - - //------------------------------------------------------------------------- - template - void semidot(Cmp cmp, int xc1, int yc1, int xc2, int yc2) - { - if(m_clipping && clipping_flags(xc1, yc1, m_clip_box)) return; - - int r = ((subpixel_width() + line_subpixel_mask) >> line_subpixel_shift); - if(r < 1) r = 1; - ellipse_bresenham_interpolator ei(r, r); - int dx = 0; - int dy = -r; - int dy0 = dy; - int dx0 = dx; - int x = xc1 >> line_subpixel_shift; - int y = yc1 >> line_subpixel_shift; - - do - { - dx += ei.dx(); - dy += ei.dy(); - - if(dy != dy0) - { - semidot_hline(cmp, xc1, yc1, xc2, yc2, x-dx0, y+dy0, x+dx0); - semidot_hline(cmp, xc1, yc1, xc2, yc2, x-dx0, y-dy0, x+dx0); - } - dx0 = dx; - dy0 = dy; - ++ei; - } - while(dy < 0); - semidot_hline(cmp, xc1, yc1, xc2, yc2, x-dx0, y+dy0, x+dx0); - } - - //------------------------------------------------------------------------- - void pie_hline(int xc, int yc, int xp1, int yp1, int xp2, int yp2, - int xh1, int yh1, int xh2) - { - if(m_clipping && clipping_flags(xc, yc, m_clip_box)) return; - - cover_type covers[line_interpolator_aa_base::max_half_width * 2 + 4]; - cover_type* p0 = covers; - cover_type* p1 = covers; - int x = xh1 << line_subpixel_shift; - int y = yh1 << line_subpixel_shift; - int w = subpixel_width(); - - distance_interpolator00 di(xc, yc, xp1, yp1, xp2, yp2, x, y); - x += line_subpixel_scale/2; - y += line_subpixel_scale/2; - - int xh0 = xh1; - int dx = x - xc; - int dy = y - yc; - do - { - int d = int(fast_sqrt(dx*dx + dy*dy)); - *p1 = 0; - if(di.dist1() <= 0 && di.dist2() > 0 && d <= w) - { - *p1 = (cover_type)cover(d); - } - ++p1; - dx += line_subpixel_scale; - di.inc_x(); - } - while(++xh1 <= xh2); - m_ren->blend_solid_hspan(xh0, yh1, - unsigned(p1 - p0), - color(), - p0); - } - - - //------------------------------------------------------------------------- - void pie(int xc, int yc, int x1, int y1, int x2, int y2) - { - int r = ((subpixel_width() + line_subpixel_mask) >> line_subpixel_shift); - if(r < 1) r = 1; - ellipse_bresenham_interpolator ei(r, r); - int dx = 0; - int dy = -r; - int dy0 = dy; - int dx0 = dx; - int x = xc >> line_subpixel_shift; - int y = yc >> line_subpixel_shift; - - do - { - dx += ei.dx(); - dy += ei.dy(); - - if(dy != dy0) - { - pie_hline(xc, yc, x1, y1, x2, y2, x-dx0, y+dy0, x+dx0); - pie_hline(xc, yc, x1, y1, x2, y2, x-dx0, y-dy0, x+dx0); - } - dx0 = dx; - dy0 = dy; - ++ei; - } - while(dy < 0); - pie_hline(xc, yc, x1, y1, x2, y2, x-dx0, y+dy0, x+dx0); - } - - //------------------------------------------------------------------------- - void line0_no_clip(const line_parameters& lp) - { - if(lp.len > line_max_length) - { - line_parameters lp1, lp2; - lp.divide(lp1, lp2); - line0_no_clip(lp1); - line0_no_clip(lp2); - return; - } - - line_interpolator_aa0 li(*this, lp); - if(li.count()) - { - if(li.vertical()) - { - while(li.step_ver()); - } - else - { - while(li.step_hor()); - } - } - } - - //------------------------------------------------------------------------- - void line0(const line_parameters& lp) - { - if(m_clipping) - { - int x1 = lp.x1; - int y1 = lp.y1; - int x2 = lp.x2; - int y2 = lp.y2; - unsigned flags = clip_line_segment(&x1, &y1, &x2, &y2, m_clip_box); - if((flags & 4) == 0) - { - if(flags) - { - line_parameters lp2(x1, y1, x2, y2, - uround(calc_distance(x1, y1, x2, y2))); - line0_no_clip(lp2); - } - else - { - line0_no_clip(lp); - } - } - } - else - { - line0_no_clip(lp); - } - } - - //------------------------------------------------------------------------- - void line1_no_clip(const line_parameters& lp, int sx, int sy) - { - if(lp.len > line_max_length) - { - line_parameters lp1, lp2; - lp.divide(lp1, lp2); - line1_no_clip(lp1, (lp.x1 + sx) >> 1, (lp.y1 + sy) >> 1); - line1_no_clip(lp2, lp1.x2 + (lp1.y2 - lp1.y1), lp1.y2 - (lp1.x2 - lp1.x1)); - return; - } - - fix_degenerate_bisectrix_start(lp, &sx, &sy); - line_interpolator_aa1 li(*this, lp, sx, sy); - if(li.vertical()) - { - while(li.step_ver()); - } - else - { - while(li.step_hor()); - } - } - - - //------------------------------------------------------------------------- - void line1(const line_parameters& lp, int sx, int sy) - { - if(m_clipping) - { - int x1 = lp.x1; - int y1 = lp.y1; - int x2 = lp.x2; - int y2 = lp.y2; - unsigned flags = clip_line_segment(&x1, &y1, &x2, &y2, m_clip_box); - if((flags & 4) == 0) - { - if(flags) - { - line_parameters lp2(x1, y1, x2, y2, - uround(calc_distance(x1, y1, x2, y2))); - if(flags & 1) - { - sx = x1 + (y2 - y1); - sy = y1 - (x2 - x1); - } - else - { - while(abs(sx - lp.x1) + abs(sy - lp.y1) > lp2.len) - { - sx = (lp.x1 + sx) >> 1; - sy = (lp.y1 + sy) >> 1; - } - } - line1_no_clip(lp2, sx, sy); - } - else - { - line1_no_clip(lp, sx, sy); - } - } - } - else - { - line1_no_clip(lp, sx, sy); - } - } - - //------------------------------------------------------------------------- - void line2_no_clip(const line_parameters& lp, int ex, int ey) - { - if(lp.len > line_max_length) - { - line_parameters lp1, lp2; - lp.divide(lp1, lp2); - line2_no_clip(lp1, lp1.x2 + (lp1.y2 - lp1.y1), lp1.y2 - (lp1.x2 - lp1.x1)); - line2_no_clip(lp2, (lp.x2 + ex) >> 1, (lp.y2 + ey) >> 1); - return; - } - - fix_degenerate_bisectrix_end(lp, &ex, &ey); - line_interpolator_aa2 li(*this, lp, ex, ey); - if(li.vertical()) - { - while(li.step_ver()); - } - else - { - while(li.step_hor()); - } - } - - //------------------------------------------------------------------------- - void line2(const line_parameters& lp, int ex, int ey) - { - if(m_clipping) - { - int x1 = lp.x1; - int y1 = lp.y1; - int x2 = lp.x2; - int y2 = lp.y2; - unsigned flags = clip_line_segment(&x1, &y1, &x2, &y2, m_clip_box); - if((flags & 4) == 0) - { - if(flags) - { - line_parameters lp2(x1, y1, x2, y2, - uround(calc_distance(x1, y1, x2, y2))); - if(flags & 2) - { - ex = x2 + (y2 - y1); - ey = y2 - (x2 - x1); - } - else - { - while(abs(ex - lp.x2) + abs(ey - lp.y2) > lp2.len) - { - ex = (lp.x2 + ex) >> 1; - ey = (lp.y2 + ey) >> 1; - } - } - line2_no_clip(lp2, ex, ey); - } - else - { - line2_no_clip(lp, ex, ey); - } - } - } - else - { - line2_no_clip(lp, ex, ey); - } - } - - //------------------------------------------------------------------------- - void line3_no_clip(const line_parameters& lp, - int sx, int sy, int ex, int ey) - { - if(lp.len > line_max_length) - { - line_parameters lp1, lp2; - lp.divide(lp1, lp2); - int mx = lp1.x2 + (lp1.y2 - lp1.y1); - int my = lp1.y2 - (lp1.x2 - lp1.x1); - line3_no_clip(lp1, (lp.x1 + sx) >> 1, (lp.y1 + sy) >> 1, mx, my); - line3_no_clip(lp2, mx, my, (lp.x2 + ex) >> 1, (lp.y2 + ey) >> 1); - return; - } - - fix_degenerate_bisectrix_start(lp, &sx, &sy); - fix_degenerate_bisectrix_end(lp, &ex, &ey); - line_interpolator_aa3 li(*this, lp, sx, sy, ex, ey); - if(li.vertical()) - { - while(li.step_ver()); - } - else - { - while(li.step_hor()); - } - } - - //------------------------------------------------------------------------- - void line3(const line_parameters& lp, - int sx, int sy, int ex, int ey) - { - if(m_clipping) - { - int x1 = lp.x1; - int y1 = lp.y1; - int x2 = lp.x2; - int y2 = lp.y2; - unsigned flags = clip_line_segment(&x1, &y1, &x2, &y2, m_clip_box); - if((flags & 4) == 0) - { - if(flags) - { - line_parameters lp2(x1, y1, x2, y2, - uround(calc_distance(x1, y1, x2, y2))); - if(flags & 1) - { - sx = x1 + (y2 - y1); - sy = y1 - (x2 - x1); - } - else - { - while(abs(sx - lp.x1) + abs(sy - lp.y1) > lp2.len) - { - sx = (lp.x1 + sx) >> 1; - sy = (lp.y1 + sy) >> 1; - } - } - if(flags & 2) - { - ex = x2 + (y2 - y1); - ey = y2 - (x2 - x1); - } - else - { - while(abs(ex - lp.x2) + abs(ey - lp.y2) > lp2.len) - { - ex = (lp.x2 + ex) >> 1; - ey = (lp.y2 + ey) >> 1; - } - } - line3_no_clip(lp2, sx, sy, ex, ey); - } - else - { - line3_no_clip(lp, sx, sy, ex, ey); - } - } - } - else - { - line3_no_clip(lp, sx, sy, ex, ey); - } - } - - - private: - base_ren_type* m_ren; - const line_profile_aa* m_profile; - color_type m_color; - rect_i m_clip_box; - bool m_clipping; - }; - - - -} - -#endif diff --git a/uppdev/agg24/agg_renderer_outline_image.h b/uppdev/agg24/agg_renderer_outline_image.h deleted file mode 100644 index dd48450ed..000000000 --- a/uppdev/agg24/agg_renderer_outline_image.h +++ /dev/null @@ -1,1013 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -#ifndef AGG_RENDERER_OUTLINE_IMAGE_INCLUDED -#define AGG_RENDERER_OUTLINE_IMAGE_INCLUDED - -#include "agg_array.h" -#include "agg_math.h" -#include "agg_line_aa_basics.h" -#include "agg_dda_line.h" -#include "agg_rendering_buffer.h" -#include "agg_clip_liang_barsky.h" - - -namespace agg -{ - //========================================================line_image_scale - template class line_image_scale - { - public: - typedef typename Source::color_type color_type; - - line_image_scale(const Source& src, double height) : - m_source(src), - m_height(height), - m_scale(src.height() / height) - { - } - - double width() const { return m_source.width(); } - double height() const { return m_height; } - - color_type pixel(int x, int y) const - { - double src_y = (y + 0.5) * m_scale - 0.5; - int h = m_source.height() - 1; - int y1 = ufloor(src_y); - int y2 = y1 + 1; - color_type pix1 = (y1 < 0) ? color_type::no_color() : m_source.pixel(x, y1); - color_type pix2 = (y2 > h) ? color_type::no_color() : m_source.pixel(x, y2); - return pix1.gradient(pix2, src_y - y1); - } - - private: - line_image_scale(const line_image_scale&); - const line_image_scale& operator = (const line_image_scale&); - - const Source& m_source; - double m_height; - double m_scale; - }; - - - - //======================================================line_image_pattern - template class line_image_pattern - { - public: - typedef Filter filter_type; - typedef typename filter_type::color_type color_type; - - //-------------------------------------------------------------------- - line_image_pattern(const Filter& filter) : - m_filter(&filter), - m_dilation(filter.dilation() + 1), - m_dilation_hr(m_dilation << line_subpixel_shift), - m_data(), - m_width(0), - m_height(0), - m_width_hr(0), - m_half_height_hr(0), - m_offset_y_hr(0) - { - } - - // Create - //-------------------------------------------------------------------- - template - line_image_pattern(const Filter& filter, const Source& src) : - m_filter(&filter), - m_dilation(filter.dilation() + 1), - m_dilation_hr(m_dilation << line_subpixel_shift), - m_data(), - m_width(0), - m_height(0), - m_width_hr(0), - m_half_height_hr(0), - m_offset_y_hr(0) - { - create(src); - } - - // Create - //-------------------------------------------------------------------- - template void create(const Source& src) - { - m_height = uceil(src.height()); - m_width = uceil(src.width()); - m_width_hr = uround(src.width() * line_subpixel_scale); - m_half_height_hr = uround(src.height() * line_subpixel_scale/2); - m_offset_y_hr = m_dilation_hr + m_half_height_hr - line_subpixel_scale/2; - m_half_height_hr += line_subpixel_scale/2; - - m_data.resize((m_width + m_dilation * 2) * (m_height + m_dilation * 2)); - - m_buf.attach(&m_data[0], m_width + m_dilation * 2, - m_height + m_dilation * 2, - m_width + m_dilation * 2); - unsigned x, y; - color_type* d1; - color_type* d2; - for(y = 0; y < m_height; y++) - { - d1 = m_buf.row_ptr(y + m_dilation) + m_dilation; - for(x = 0; x < m_width; x++) - { - *d1++ = src.pixel(x, y); - } - } - - const color_type* s1; - const color_type* s2; - for(y = 0; y < m_dilation; y++) - { - //s1 = m_buf.row_ptr(m_height + m_dilation - 1) + m_dilation; - //s2 = m_buf.row_ptr(m_dilation) + m_dilation; - d1 = m_buf.row_ptr(m_dilation + m_height + y) + m_dilation; - d2 = m_buf.row_ptr(m_dilation - y - 1) + m_dilation; - for(x = 0; x < m_width; x++) - { - //*d1++ = color_type(*s1++, 0); - //*d2++ = color_type(*s2++, 0); - *d1++ = color_type::no_color(); - *d2++ = color_type::no_color(); - } - } - - unsigned h = m_height + m_dilation * 2; - for(y = 0; y < h; y++) - { - s1 = m_buf.row_ptr(y) + m_dilation; - s2 = m_buf.row_ptr(y) + m_dilation + m_width; - d1 = m_buf.row_ptr(y) + m_dilation + m_width; - d2 = m_buf.row_ptr(y) + m_dilation; - - for(x = 0; x < m_dilation; x++) - { - *d1++ = *s1++; - *--d2 = *--s2; - } - } - } - - //-------------------------------------------------------------------- - int pattern_width() const { return m_width_hr; } - int line_width() const { return m_half_height_hr; } - double width() const { return m_height; } - - //-------------------------------------------------------------------- - void pixel(color_type* p, int x, int y) const - { - m_filter->pixel_high_res(m_buf.rows(), - p, - x % m_width_hr + m_dilation_hr, - y + m_offset_y_hr); - } - - //-------------------------------------------------------------------- - const filter_type& filter() const { return *m_filter; } - - private: - line_image_pattern(const line_image_pattern&); - const line_image_pattern& - operator = (const line_image_pattern&); - - protected: - row_ptr_cache m_buf; - const filter_type* m_filter; - unsigned m_dilation; - int m_dilation_hr; - pod_array m_data; - unsigned m_width; - unsigned m_height; - int m_width_hr; - int m_half_height_hr; - int m_offset_y_hr; - }; - - - - - - - //=================================================line_image_pattern_pow2 - template class line_image_pattern_pow2 : - public line_image_pattern - { - public: - typedef Filter filter_type; - typedef typename filter_type::color_type color_type; - typedef line_image_pattern base_type; - - //-------------------------------------------------------------------- - line_image_pattern_pow2(const Filter& filter) : - line_image_pattern(filter), m_mask(line_subpixel_mask) {} - - //-------------------------------------------------------------------- - template - line_image_pattern_pow2(const Filter& filter, const Source& src) : - line_image_pattern(filter), m_mask(line_subpixel_mask) - { - create(src); - } - - //-------------------------------------------------------------------- - template void create(const Source& src) - { - line_image_pattern::create(src); - m_mask = 1; - while(m_mask < base_type::m_width) - { - m_mask <<= 1; - m_mask |= 1; - } - m_mask <<= line_subpixel_shift - 1; - m_mask |= line_subpixel_mask; - base_type::m_width_hr = m_mask + 1; - } - - //-------------------------------------------------------------------- - void pixel(color_type* p, int x, int y) const - { - base_type::m_filter->pixel_high_res( - base_type::m_buf.rows(), - p, - (x & m_mask) + base_type::m_dilation_hr, - y + base_type::m_offset_y_hr); - } - private: - unsigned m_mask; - }; - - - - - - - - //===================================================distance_interpolator4 - class distance_interpolator4 - { - public: - //--------------------------------------------------------------------- - distance_interpolator4() {} - distance_interpolator4(int x1, int y1, int x2, int y2, - int sx, int sy, int ex, int ey, - int len, double scale, int x, int y) : - m_dx(x2 - x1), - m_dy(y2 - y1), - m_dx_start(line_mr(sx) - line_mr(x1)), - m_dy_start(line_mr(sy) - line_mr(y1)), - m_dx_end(line_mr(ex) - line_mr(x2)), - m_dy_end(line_mr(ey) - line_mr(y2)), - - m_dist(iround(double(x + line_subpixel_scale/2 - x2) * double(m_dy) - - double(y + line_subpixel_scale/2 - y2) * double(m_dx))), - - m_dist_start((line_mr(x + line_subpixel_scale/2) - line_mr(sx)) * m_dy_start - - (line_mr(y + line_subpixel_scale/2) - line_mr(sy)) * m_dx_start), - - m_dist_end((line_mr(x + line_subpixel_scale/2) - line_mr(ex)) * m_dy_end - - (line_mr(y + line_subpixel_scale/2) - line_mr(ey)) * m_dx_end), - m_len(uround(len / scale)) - { - double d = len * scale; - int dx = iround(((x2 - x1) << line_subpixel_shift) / d); - int dy = iround(((y2 - y1) << line_subpixel_shift) / d); - m_dx_pict = -dy; - m_dy_pict = dx; - m_dist_pict = ((x + line_subpixel_scale/2 - (x1 - dy)) * m_dy_pict - - (y + line_subpixel_scale/2 - (y1 + dx)) * m_dx_pict) >> - line_subpixel_shift; - - m_dx <<= line_subpixel_shift; - m_dy <<= line_subpixel_shift; - m_dx_start <<= line_mr_subpixel_shift; - m_dy_start <<= line_mr_subpixel_shift; - m_dx_end <<= line_mr_subpixel_shift; - m_dy_end <<= line_mr_subpixel_shift; - } - - //--------------------------------------------------------------------- - void inc_x() - { - m_dist += m_dy; - m_dist_start += m_dy_start; - m_dist_pict += m_dy_pict; - m_dist_end += m_dy_end; - } - - //--------------------------------------------------------------------- - void dec_x() - { - m_dist -= m_dy; - m_dist_start -= m_dy_start; - m_dist_pict -= m_dy_pict; - m_dist_end -= m_dy_end; - } - - //--------------------------------------------------------------------- - void inc_y() - { - m_dist -= m_dx; - m_dist_start -= m_dx_start; - m_dist_pict -= m_dx_pict; - m_dist_end -= m_dx_end; - } - - //--------------------------------------------------------------------- - void dec_y() - { - m_dist += m_dx; - m_dist_start += m_dx_start; - m_dist_pict += m_dx_pict; - m_dist_end += m_dx_end; - } - - //--------------------------------------------------------------------- - void inc_x(int dy) - { - m_dist += m_dy; - m_dist_start += m_dy_start; - m_dist_pict += m_dy_pict; - m_dist_end += m_dy_end; - if(dy > 0) - { - m_dist -= m_dx; - m_dist_start -= m_dx_start; - m_dist_pict -= m_dx_pict; - m_dist_end -= m_dx_end; - } - if(dy < 0) - { - m_dist += m_dx; - m_dist_start += m_dx_start; - m_dist_pict += m_dx_pict; - m_dist_end += m_dx_end; - } - } - - //--------------------------------------------------------------------- - void dec_x(int dy) - { - m_dist -= m_dy; - m_dist_start -= m_dy_start; - m_dist_pict -= m_dy_pict; - m_dist_end -= m_dy_end; - if(dy > 0) - { - m_dist -= m_dx; - m_dist_start -= m_dx_start; - m_dist_pict -= m_dx_pict; - m_dist_end -= m_dx_end; - } - if(dy < 0) - { - m_dist += m_dx; - m_dist_start += m_dx_start; - m_dist_pict += m_dx_pict; - m_dist_end += m_dx_end; - } - } - - //--------------------------------------------------------------------- - void inc_y(int dx) - { - m_dist -= m_dx; - m_dist_start -= m_dx_start; - m_dist_pict -= m_dx_pict; - m_dist_end -= m_dx_end; - if(dx > 0) - { - m_dist += m_dy; - m_dist_start += m_dy_start; - m_dist_pict += m_dy_pict; - m_dist_end += m_dy_end; - } - if(dx < 0) - { - m_dist -= m_dy; - m_dist_start -= m_dy_start; - m_dist_pict -= m_dy_pict; - m_dist_end -= m_dy_end; - } - } - - //--------------------------------------------------------------------- - void dec_y(int dx) - { - m_dist += m_dx; - m_dist_start += m_dx_start; - m_dist_pict += m_dx_pict; - m_dist_end += m_dx_end; - if(dx > 0) - { - m_dist += m_dy; - m_dist_start += m_dy_start; - m_dist_pict += m_dy_pict; - m_dist_end += m_dy_end; - } - if(dx < 0) - { - m_dist -= m_dy; - m_dist_start -= m_dy_start; - m_dist_pict -= m_dy_pict; - m_dist_end -= m_dy_end; - } - } - - //--------------------------------------------------------------------- - int dist() const { return m_dist; } - int dist_start() const { return m_dist_start; } - int dist_pict() const { return m_dist_pict; } - int dist_end() const { return m_dist_end; } - - //--------------------------------------------------------------------- - int dx() const { return m_dx; } - int dy() const { return m_dy; } - int dx_start() const { return m_dx_start; } - int dy_start() const { return m_dy_start; } - int dx_pict() const { return m_dx_pict; } - int dy_pict() const { return m_dy_pict; } - int dx_end() const { return m_dx_end; } - int dy_end() const { return m_dy_end; } - int len() const { return m_len; } - - private: - //--------------------------------------------------------------------- - int m_dx; - int m_dy; - int m_dx_start; - int m_dy_start; - int m_dx_pict; - int m_dy_pict; - int m_dx_end; - int m_dy_end; - - int m_dist; - int m_dist_start; - int m_dist_pict; - int m_dist_end; - int m_len; - }; - - - - - - //==================================================line_interpolator_image - template class line_interpolator_image - { - public: - typedef Renderer renderer_type; - typedef typename Renderer::color_type color_type; - - //--------------------------------------------------------------------- - enum max_half_width_e - { - max_half_width = 64 - }; - - //--------------------------------------------------------------------- - line_interpolator_image(renderer_type& ren, const line_parameters& lp, - int sx, int sy, int ex, int ey, - int pattern_start, - double scale_x) : - m_lp(lp), - m_li(lp.vertical ? line_dbl_hr(lp.x2 - lp.x1) : - line_dbl_hr(lp.y2 - lp.y1), - lp.vertical ? abs(lp.y2 - lp.y1) : - abs(lp.x2 - lp.x1) + 1), - m_di(lp.x1, lp.y1, lp.x2, lp.y2, sx, sy, ex, ey, lp.len, scale_x, - lp.x1 & ~line_subpixel_mask, lp.y1 & ~line_subpixel_mask), - m_ren(ren), - m_x(lp.x1 >> line_subpixel_shift), - m_y(lp.y1 >> line_subpixel_shift), - m_old_x(m_x), - m_old_y(m_y), - m_count((lp.vertical ? abs((lp.y2 >> line_subpixel_shift) - m_y) : - abs((lp.x2 >> line_subpixel_shift) - m_x))), - m_width(ren.subpixel_width()), - //m_max_extent(m_width >> (line_subpixel_shift - 2)), - m_max_extent((m_width + line_subpixel_scale) >> line_subpixel_shift), - m_start(pattern_start + (m_max_extent + 2) * ren.pattern_width()), - m_step(0) - { - agg::dda2_line_interpolator li(0, lp.vertical ? - (lp.dy << agg::line_subpixel_shift) : - (lp.dx << agg::line_subpixel_shift), - lp.len); - - unsigned i; - int stop = m_width + line_subpixel_scale * 2; - for(i = 0; i < max_half_width; ++i) - { - m_dist_pos[i] = li.y(); - if(m_dist_pos[i] >= stop) break; - ++li; - } - m_dist_pos[i] = 0x7FFF0000; - - int dist1_start; - int dist2_start; - int npix = 1; - - if(lp.vertical) - { - do - { - --m_li; - m_y -= lp.inc; - m_x = (m_lp.x1 + m_li.y()) >> line_subpixel_shift; - - if(lp.inc > 0) m_di.dec_y(m_x - m_old_x); - else m_di.inc_y(m_x - m_old_x); - - m_old_x = m_x; - - dist1_start = dist2_start = m_di.dist_start(); - - int dx = 0; - if(dist1_start < 0) ++npix; - do - { - dist1_start += m_di.dy_start(); - dist2_start -= m_di.dy_start(); - if(dist1_start < 0) ++npix; - if(dist2_start < 0) ++npix; - ++dx; - } - while(m_dist_pos[dx] <= m_width); - if(npix == 0) break; - - npix = 0; - } - while(--m_step >= -m_max_extent); - } - else - { - do - { - --m_li; - - m_x -= lp.inc; - m_y = (m_lp.y1 + m_li.y()) >> line_subpixel_shift; - - if(lp.inc > 0) m_di.dec_x(m_y - m_old_y); - else m_di.inc_x(m_y - m_old_y); - - m_old_y = m_y; - - dist1_start = dist2_start = m_di.dist_start(); - - int dy = 0; - if(dist1_start < 0) ++npix; - do - { - dist1_start -= m_di.dx_start(); - dist2_start += m_di.dx_start(); - if(dist1_start < 0) ++npix; - if(dist2_start < 0) ++npix; - ++dy; - } - while(m_dist_pos[dy] <= m_width); - if(npix == 0) break; - - npix = 0; - } - while(--m_step >= -m_max_extent); - } - m_li.adjust_forward(); - m_step -= m_max_extent; - } - - //--------------------------------------------------------------------- - bool step_hor() - { - ++m_li; - m_x += m_lp.inc; - m_y = (m_lp.y1 + m_li.y()) >> line_subpixel_shift; - - if(m_lp.inc > 0) m_di.inc_x(m_y - m_old_y); - else m_di.dec_x(m_y - m_old_y); - - m_old_y = m_y; - - int s1 = m_di.dist() / m_lp.len; - int s2 = -s1; - - if(m_lp.inc < 0) s1 = -s1; - - int dist_start; - int dist_pict; - int dist_end; - int dy; - int dist; - - dist_start = m_di.dist_start(); - dist_pict = m_di.dist_pict() + m_start; - dist_end = m_di.dist_end(); - color_type* p0 = m_colors + max_half_width + 2; - color_type* p1 = p0; - - int npix = 0; - p1->clear(); - if(dist_end > 0) - { - if(dist_start <= 0) - { - m_ren.pixel(p1, dist_pict, s2); - } - ++npix; - } - ++p1; - - dy = 1; - while((dist = m_dist_pos[dy]) - s1 <= m_width) - { - dist_start -= m_di.dx_start(); - dist_pict -= m_di.dx_pict(); - dist_end -= m_di.dx_end(); - p1->clear(); - if(dist_end > 0 && dist_start <= 0) - { - if(m_lp.inc > 0) dist = -dist; - m_ren.pixel(p1, dist_pict, s2 - dist); - ++npix; - } - ++p1; - ++dy; - } - - dy = 1; - dist_start = m_di.dist_start(); - dist_pict = m_di.dist_pict() + m_start; - dist_end = m_di.dist_end(); - while((dist = m_dist_pos[dy]) + s1 <= m_width) - { - dist_start += m_di.dx_start(); - dist_pict += m_di.dx_pict(); - dist_end += m_di.dx_end(); - --p0; - p0->clear(); - if(dist_end > 0 && dist_start <= 0) - { - if(m_lp.inc > 0) dist = -dist; - m_ren.pixel(p0, dist_pict, s2 + dist); - ++npix; - } - ++dy; - } - m_ren.blend_color_vspan(m_x, - m_y - dy + 1, - unsigned(p1 - p0), - p0); - return npix && ++m_step < m_count; - } - - - - //--------------------------------------------------------------------- - bool step_ver() - { - ++m_li; - m_y += m_lp.inc; - m_x = (m_lp.x1 + m_li.y()) >> line_subpixel_shift; - - if(m_lp.inc > 0) m_di.inc_y(m_x - m_old_x); - else m_di.dec_y(m_x - m_old_x); - - m_old_x = m_x; - - int s1 = m_di.dist() / m_lp.len; - int s2 = -s1; - - if(m_lp.inc > 0) s1 = -s1; - - int dist_start; - int dist_pict; - int dist_end; - int dist; - int dx; - - dist_start = m_di.dist_start(); - dist_pict = m_di.dist_pict() + m_start; - dist_end = m_di.dist_end(); - color_type* p0 = m_colors + max_half_width + 2; - color_type* p1 = p0; - - int npix = 0; - p1->clear(); - if(dist_end > 0) - { - if(dist_start <= 0) - { - m_ren.pixel(p1, dist_pict, s2); - } - ++npix; - } - ++p1; - - dx = 1; - while((dist = m_dist_pos[dx]) - s1 <= m_width) - { - dist_start += m_di.dy_start(); - dist_pict += m_di.dy_pict(); - dist_end += m_di.dy_end(); - p1->clear(); - if(dist_end > 0 && dist_start <= 0) - { - if(m_lp.inc > 0) dist = -dist; - m_ren.pixel(p1, dist_pict, s2 + dist); - ++npix; - } - ++p1; - ++dx; - } - - dx = 1; - dist_start = m_di.dist_start(); - dist_pict = m_di.dist_pict() + m_start; - dist_end = m_di.dist_end(); - while((dist = m_dist_pos[dx]) + s1 <= m_width) - { - dist_start -= m_di.dy_start(); - dist_pict -= m_di.dy_pict(); - dist_end -= m_di.dy_end(); - --p0; - p0->clear(); - if(dist_end > 0 && dist_start <= 0) - { - if(m_lp.inc > 0) dist = -dist; - m_ren.pixel(p0, dist_pict, s2 - dist); - ++npix; - } - ++dx; - } - m_ren.blend_color_hspan(m_x - dx + 1, - m_y, - unsigned(p1 - p0), - p0); - return npix && ++m_step < m_count; - } - - - //--------------------------------------------------------------------- - int pattern_end() const { return m_start + m_di.len(); } - - //--------------------------------------------------------------------- - bool vertical() const { return m_lp.vertical; } - int width() const { return m_width; } - int count() const { return m_count; } - - private: - line_interpolator_image(const line_interpolator_image&); - const line_interpolator_image& - operator = (const line_interpolator_image&); - - protected: - const line_parameters& m_lp; - dda2_line_interpolator m_li; - distance_interpolator4 m_di; - renderer_type& m_ren; - int m_plen; - int m_x; - int m_y; - int m_old_x; - int m_old_y; - int m_count; - int m_width; - int m_max_extent; - int m_start; - int m_step; - int m_dist_pos[max_half_width + 1]; - color_type m_colors[max_half_width * 2 + 4]; - }; - - - - - - - - - //===================================================renderer_outline_image - template - class renderer_outline_image - { - public: - //--------------------------------------------------------------------- - typedef BaseRenderer base_ren_type; - typedef renderer_outline_image self_type; - typedef typename base_ren_type::color_type color_type; - typedef ImagePattern pattern_type; - - - //--------------------------------------------------------------------- - renderer_outline_image(base_ren_type& ren, const pattern_type& patt) : - m_ren(&ren), - m_pattern(&patt), - m_start(0), - m_scale_x(1.0), - m_clip_box(0,0,0,0), - m_clipping(false) - {} - void attach(base_ren_type& ren) { m_ren = &ren; } - - //--------------------------------------------------------------------- - void pattern(const pattern_type& p) { m_pattern = &p; } - const pattern_type& pattern() const { return *m_pattern; } - - //--------------------------------------------------------------------- - void reset_clipping() { m_clipping = false; } - void clip_box(double x1, double y1, double x2, double y2) - { - m_clip_box.x1 = line_coord_sat::conv(x1); - m_clip_box.y1 = line_coord_sat::conv(y1); - m_clip_box.x2 = line_coord_sat::conv(x2); - m_clip_box.y2 = line_coord_sat::conv(y2); - m_clipping = true; - } - - //--------------------------------------------------------------------- - void scale_x(double s) { m_scale_x = s; } - double scale_x() const { return m_scale_x; } - - //--------------------------------------------------------------------- - void start_x(double s) { m_start = iround(s * line_subpixel_scale); } - double start_x() const { return double(m_start) / line_subpixel_scale; } - - //--------------------------------------------------------------------- - int subpixel_width() const { return m_pattern->line_width(); } - int pattern_width() const { return m_pattern->pattern_width(); } - double width() const { return double(subpixel_width()) / line_subpixel_scale; } - - //------------------------------------------------------------------------- - void pixel(color_type* p, int x, int y) const - { - m_pattern->pixel(p, x, y); - } - - //------------------------------------------------------------------------- - void blend_color_hspan(int x, int y, unsigned len, const color_type* colors) - { - m_ren->blend_color_hspan(x, y, len, colors, 0); - } - - //------------------------------------------------------------------------- - void blend_color_vspan(int x, int y, unsigned len, const color_type* colors) - { - m_ren->blend_color_vspan(x, y, len, colors, 0); - } - - //------------------------------------------------------------------------- - static bool accurate_join_only() { return true; } - - //------------------------------------------------------------------------- - template - void semidot(Cmp, int, int, int, int) - { - } - - //------------------------------------------------------------------------- - void pie(int, int, int, int, int, int) - { - } - - //------------------------------------------------------------------------- - void line0(const line_parameters&) - { - } - - //------------------------------------------------------------------------- - void line1(const line_parameters&, int, int) - { - } - - //------------------------------------------------------------------------- - void line2(const line_parameters&, int, int) - { - } - - //------------------------------------------------------------------------- - void line3_no_clip(const line_parameters& lp, - int sx, int sy, int ex, int ey) - { - if(lp.len > line_max_length) - { - line_parameters lp1, lp2; - lp.divide(lp1, lp2); - int mx = lp1.x2 + (lp1.y2 - lp1.y1); - int my = lp1.y2 - (lp1.x2 - lp1.x1); - line3_no_clip(lp1, (lp.x1 + sx) >> 1, (lp.y1 + sy) >> 1, mx, my); - line3_no_clip(lp2, mx, my, (lp.x2 + ex) >> 1, (lp.y2 + ey) >> 1); - return; - } - - fix_degenerate_bisectrix_start(lp, &sx, &sy); - fix_degenerate_bisectrix_end(lp, &ex, &ey); - line_interpolator_image li(*this, lp, - sx, sy, - ex, ey, - m_start, m_scale_x); - if(li.vertical()) - { - while(li.step_ver()); - } - else - { - while(li.step_hor()); - } - m_start += uround(lp.len / m_scale_x); - } - - //------------------------------------------------------------------------- - void line3(const line_parameters& lp, - int sx, int sy, int ex, int ey) - { - if(m_clipping) - { - int x1 = lp.x1; - int y1 = lp.y1; - int x2 = lp.x2; - int y2 = lp.y2; - unsigned flags = clip_line_segment(&x1, &y1, &x2, &y2, m_clip_box); - int start = m_start; - if((flags & 4) == 0) - { - if(flags) - { - line_parameters lp2(x1, y1, x2, y2, - uround(calc_distance(x1, y1, x2, y2))); - if(flags & 1) - { - m_start += uround(calc_distance(lp.x1, lp.y1, x1, y1) / m_scale_x); - sx = x1 + (y2 - y1); - sy = y1 - (x2 - x1); - } - else - { - while(abs(sx - lp.x1) + abs(sy - lp.y1) > lp2.len) - { - sx = (lp.x1 + sx) >> 1; - sy = (lp.y1 + sy) >> 1; - } - } - if(flags & 2) - { - ex = x2 + (y2 - y1); - ey = y2 - (x2 - x1); - } - else - { - while(abs(ex - lp.x2) + abs(ey - lp.y2) > lp2.len) - { - ex = (lp.x2 + ex) >> 1; - ey = (lp.y2 + ey) >> 1; - } - } - line3_no_clip(lp2, sx, sy, ex, ey); - } - else - { - line3_no_clip(lp, sx, sy, ex, ey); - } - } - m_start = start + uround(lp.len / m_scale_x); - } - else - { - line3_no_clip(lp, sx, sy, ex, ey); - } - } - - private: - base_ren_type* m_ren; - const pattern_type* m_pattern; - int m_start; - double m_scale_x; - rect_i m_clip_box; - bool m_clipping; - }; - - - - - -} - - - -#endif diff --git a/uppdev/agg24/agg_renderer_primitives.h b/uppdev/agg24/agg_renderer_primitives.h deleted file mode 100644 index f008db7c9..000000000 --- a/uppdev/agg24/agg_renderer_primitives.h +++ /dev/null @@ -1,224 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// class renderer_primitives -// -//---------------------------------------------------------------------------- - -#ifndef AGG_RENDERER_PRIMITIVES_INCLUDED -#define AGG_RENDERER_PRIMITIVES_INCLUDED - -#include "agg_basics.h" -#include "agg_renderer_base.h" -#include "agg_dda_line.h" -#include "agg_ellipse_bresenham.h" - -namespace agg -{ - //-----------------------------------------------------renderer_primitives - template class renderer_primitives - { - public: - typedef BaseRenderer base_ren_type; - typedef typename base_ren_type::color_type color_type; - - //-------------------------------------------------------------------- - explicit renderer_primitives(base_ren_type& ren) : - m_ren(&ren), - m_fill_color(), - m_line_color(), - m_curr_x(0), - m_curr_y(0) - {} - void attach(base_ren_type& ren) { m_ren = &ren; } - - //-------------------------------------------------------------------- - static int coord(double c) - { - return iround(c * line_bresenham_interpolator::subpixel_scale); - } - - //-------------------------------------------------------------------- - void fill_color(const color_type& c) { m_fill_color = c; } - void line_color(const color_type& c) { m_line_color = c; } - const color_type& fill_color() const { return m_fill_color; } - const color_type& line_color() const { return m_line_color; } - - //-------------------------------------------------------------------- - void rectangle(int x1, int y1, int x2, int y2) - { - m_ren->blend_hline(x1, y1, x2-1, m_line_color, cover_full); - m_ren->blend_vline(x2, y1, y2-1, m_line_color, cover_full); - m_ren->blend_hline(x1+1, y2, x2, m_line_color, cover_full); - m_ren->blend_vline(x1, y1+1, y2, m_line_color, cover_full); - } - - //-------------------------------------------------------------------- - void solid_rectangle(int x1, int y1, int x2, int y2) - { - m_ren->blend_bar(x1, y1, x2, y2, m_fill_color, cover_full); - } - - //-------------------------------------------------------------------- - void outlined_rectangle(int x1, int y1, int x2, int y2) - { - rectangle(x1, y1, x2, y2); - m_ren->blend_bar(x1+1, y1+1, x2-1, y2-1, m_fill_color, cover_full); - } - - //-------------------------------------------------------------------- - void ellipse(int x, int y, int rx, int ry) - { - ellipse_bresenham_interpolator ei(rx, ry); - int dx = 0; - int dy = -ry; - do - { - dx += ei.dx(); - dy += ei.dy(); - m_ren->blend_pixel(x + dx, y + dy, m_line_color, cover_full); - m_ren->blend_pixel(x + dx, y - dy, m_line_color, cover_full); - m_ren->blend_pixel(x - dx, y - dy, m_line_color, cover_full); - m_ren->blend_pixel(x - dx, y + dy, m_line_color, cover_full); - ++ei; - } - while(dy < 0); - } - - //-------------------------------------------------------------------- - void solid_ellipse(int x, int y, int rx, int ry) - { - ellipse_bresenham_interpolator ei(rx, ry); - int dx = 0; - int dy = -ry; - int dy0 = dy; - int dx0 = dx; - - do - { - dx += ei.dx(); - dy += ei.dy(); - - if(dy != dy0) - { - m_ren->blend_hline(x-dx0, y+dy0, x+dx0, m_fill_color, cover_full); - m_ren->blend_hline(x-dx0, y-dy0, x+dx0, m_fill_color, cover_full); - } - dx0 = dx; - dy0 = dy; - ++ei; - } - while(dy < 0); - m_ren->blend_hline(x-dx0, y+dy0, x+dx0, m_fill_color, cover_full); - } - - //-------------------------------------------------------------------- - void outlined_ellipse(int x, int y, int rx, int ry) - { - ellipse_bresenham_interpolator ei(rx, ry); - int dx = 0; - int dy = -ry; - - do - { - dx += ei.dx(); - dy += ei.dy(); - - m_ren->blend_pixel(x + dx, y + dy, m_line_color, cover_full); - m_ren->blend_pixel(x + dx, y - dy, m_line_color, cover_full); - m_ren->blend_pixel(x - dx, y - dy, m_line_color, cover_full); - m_ren->blend_pixel(x - dx, y + dy, m_line_color, cover_full); - - if(ei.dy() && dx) - { - m_ren->blend_hline(x-dx+1, y+dy, x+dx-1, m_fill_color, cover_full); - m_ren->blend_hline(x-dx+1, y-dy, x+dx-1, m_fill_color, cover_full); - } - ++ei; - } - while(dy < 0); - } - - //-------------------------------------------------------------------- - void line(int x1, int y1, int x2, int y2, bool last=false) - { - line_bresenham_interpolator li(x1, y1, x2, y2); - - unsigned len = li.len(); - if(len == 0) - { - if(last) - { - m_ren->blend_pixel(li.line_lr(x1), li.line_lr(y1), m_line_color, cover_full); - } - return; - } - - if(last) ++len; - - if(li.is_ver()) - { - do - { - m_ren->blend_pixel(li.x2(), li.y1(), m_line_color, cover_full); - li.vstep(); - } - while(--len); - } - else - { - do - { - m_ren->blend_pixel(li.x1(), li.y2(), m_line_color, cover_full); - li.hstep(); - } - while(--len); - } - } - - //-------------------------------------------------------------------- - void move_to(int x, int y) - { - m_curr_x = x; - m_curr_y = y; - } - - //-------------------------------------------------------------------- - void line_to(int x, int y, bool last=false) - { - line(m_curr_x, m_curr_y, x, y, last); - m_curr_x = x; - m_curr_y = y; - } - - //-------------------------------------------------------------------- - const base_ren_type& ren() const { return *m_ren; } - base_ren_type& ren() { return *m_ren; } - - //-------------------------------------------------------------------- - const rendering_buffer& rbuf() const { return m_ren->rbuf(); } - rendering_buffer& rbuf() { return m_ren->rbuf(); } - - private: - base_ren_type* m_ren; - color_type m_fill_color; - color_type m_line_color; - int m_curr_x; - int m_curr_y; - }; - -} - -#endif diff --git a/uppdev/agg24/agg_renderer_raster_text.h b/uppdev/agg24/agg_renderer_raster_text.h deleted file mode 100644 index 87b43f960..000000000 --- a/uppdev/agg24/agg_renderer_raster_text.h +++ /dev/null @@ -1,264 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_RENDERER_RASTER_TEXT_INCLUDED -#define AGG_RENDERER_RASTER_TEXT_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - - //==============================================renderer_raster_htext_solid - template - class renderer_raster_htext_solid - { - public: - typedef BaseRenderer ren_type; - typedef GlyphGenerator glyph_gen_type; - typedef typename glyph_gen_type::glyph_rect glyph_rect; - typedef typename ren_type::color_type color_type; - - renderer_raster_htext_solid(ren_type& ren, glyph_gen_type& glyph) : - m_ren(&ren), - m_glyph(&glyph) - {} - void attach(ren_type& ren) { m_ren = &ren; } - - //-------------------------------------------------------------------- - void color(const color_type& c) { m_color = c; } - const color_type& color() const { return m_color; } - - //-------------------------------------------------------------------- - template - void render_text(double x, double y, const CharT* str, bool flip=false) - { - glyph_rect r; - while(*str) - { - m_glyph->prepare(&r, x, y, *str, flip); - if(r.x2 >= r.x1) - { - int i; - if(flip) - { - for(i = r.y1; i <= r.y2; i++) - { - m_ren->blend_solid_hspan(r.x1, i, (r.x2 - r.x1 + 1), - m_color, - m_glyph->span(r.y2 - i)); - } - } - else - { - for(i = r.y1; i <= r.y2; i++) - { - m_ren->blend_solid_hspan(r.x1, i, (r.x2 - r.x1 + 1), - m_color, - m_glyph->span(i - r.y1)); - } - } - } - x += r.dx; - y += r.dy; - ++str; - } - } - - private: - ren_type* m_ren; - glyph_gen_type* m_glyph; - color_type m_color; - }; - - - - //=============================================renderer_raster_vtext_solid - template - class renderer_raster_vtext_solid - { - public: - typedef BaseRenderer ren_type; - typedef GlyphGenerator glyph_gen_type; - typedef typename glyph_gen_type::glyph_rect glyph_rect; - typedef typename ren_type::color_type color_type; - - renderer_raster_vtext_solid(ren_type& ren, glyph_gen_type& glyph) : - m_ren(&ren), - m_glyph(&glyph) - { - } - - //-------------------------------------------------------------------- - void color(const color_type& c) { m_color = c; } - const color_type& color() const { return m_color; } - - //-------------------------------------------------------------------- - template - void render_text(double x, double y, const CharT* str, bool flip=false) - { - glyph_rect r; - while(*str) - { - m_glyph->prepare(&r, x, y, *str, !flip); - if(r.x2 >= r.x1) - { - int i; - if(flip) - { - for(i = r.y1; i <= r.y2; i++) - { - m_ren->blend_solid_vspan(i, r.x1, (r.x2 - r.x1 + 1), - m_color, - m_glyph->span(i - r.y1)); - } - } - else - { - for(i = r.y1; i <= r.y2; i++) - { - m_ren->blend_solid_vspan(i, r.x1, (r.x2 - r.x1 + 1), - m_color, - m_glyph->span(r.y2 - i)); - } - } - } - x += r.dx; - y += r.dy; - ++str; - } - } - - private: - ren_type* m_ren; - glyph_gen_type* m_glyph; - color_type m_color; - }; - - - - - - - //===================================================renderer_raster_htext - template - class renderer_raster_htext - { - public: - typedef ScanlineRenderer ren_type; - typedef GlyphGenerator glyph_gen_type; - typedef typename glyph_gen_type::glyph_rect glyph_rect; - - class scanline_single_span - { - public: - typedef agg::cover_type cover_type; - - //---------------------------------------------------------------- - struct const_span - { - int x; - unsigned len; - const cover_type* covers; - - const_span() {} - const_span(int x_, unsigned len_, const cover_type* covers_) : - x(x_), len(len_), covers(covers_) - {} - }; - - typedef const const_span* const_iterator; - - //---------------------------------------------------------------- - scanline_single_span(int x, int y, unsigned len, - const cover_type* covers) : - m_y(y), - m_span(x, len, covers) - {} - - //---------------------------------------------------------------- - int y() const { return m_y; } - unsigned num_spans() const { return 1; } - const_iterator begin() const { return &m_span; } - - private: - //---------------------------------------------------------------- - int m_y; - const_span m_span; - }; - - - - //-------------------------------------------------------------------- - renderer_raster_htext(ren_type& ren, glyph_gen_type& glyph) : - m_ren(&ren), - m_glyph(&glyph) - { - } - - - //-------------------------------------------------------------------- - template - void render_text(double x, double y, const CharT* str, bool flip=false) - { - glyph_rect r; - while(*str) - { - m_glyph->prepare(&r, x, y, *str, flip); - if(r.x2 >= r.x1) - { - m_ren->prepare(); - int i; - if(flip) - { - for(i = r.y1; i <= r.y2; i++) - { - m_ren->render( - scanline_single_span(r.x1, - i, - (r.x2 - r.x1 + 1), - m_glyph->span(r.y2 - i))); - } - } - else - { - for(i = r.y1; i <= r.y2; i++) - { - m_ren->render( - scanline_single_span(r.x1, - i, - (r.x2 - r.x1 + 1), - m_glyph->span(i - r.y1))); - } - } - } - x += r.dx; - y += r.dy; - ++str; - } - } - - private: - ren_type* m_ren; - glyph_gen_type* m_glyph; - }; - - - - -} - -#endif - diff --git a/uppdev/agg24/agg_renderer_scanline.h b/uppdev/agg24/agg_renderer_scanline.h deleted file mode 100644 index 6d65056c5..000000000 --- a/uppdev/agg24/agg_renderer_scanline.h +++ /dev/null @@ -1,852 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_RENDERER_SCANLINE_INCLUDED -#define AGG_RENDERER_SCANLINE_INCLUDED - -#include "agg_basics.h" -#include "agg_renderer_base.h" - -namespace agg -{ - - //================================================render_scanline_aa_solid - template - void render_scanline_aa_solid(const Scanline& sl, - BaseRenderer& ren, - const ColorT& color) - { - int y = sl.y(); - unsigned num_spans = sl.num_spans(); - typename Scanline::const_iterator span = sl.begin(); - - for(;;) - { - int x = span->x; - if(span->len > 0) - { - ren.blend_solid_hspan(x, y, (unsigned)span->len, - color, - span->covers); - } - else - { - ren.blend_hline(x, y, (unsigned)(x - span->len - 1), - color, - *(span->covers)); - } - if(--num_spans == 0) break; - ++span; - } - } - - //===============================================render_scanlines_aa_solid - template - void render_scanlines_aa_solid(Rasterizer& ras, Scanline& sl, - BaseRenderer& ren, const ColorT& color) - { - if(ras.rewind_scanlines()) - { - // Explicitly convert "color" to the BaseRenderer color type. - // For example, it can be called with color type "rgba", while - // "rgba8" is needed. Otherwise it will be implicitly - // converted in the loop many times. - //---------------------- - typename BaseRenderer::color_type ren_color(color); - - sl.reset(ras.min_x(), ras.max_x()); - while(ras.sweep_scanline(sl)) - { - //render_scanline_aa_solid(sl, ren, ren_color); - - // This code is equivalent to the above call (copy/paste). - // It's just a "manual" optimization for old compilers, - // like Microsoft Visual C++ v6.0 - //------------------------------- - int y = sl.y(); - unsigned num_spans = sl.num_spans(); - typename Scanline::const_iterator span = sl.begin(); - - for(;;) - { - int x = span->x; - if(span->len > 0) - { - ren.blend_solid_hspan(x, y, (unsigned)span->len, - ren_color, - span->covers); - } - else - { - ren.blend_hline(x, y, (unsigned)(x - span->len - 1), - ren_color, - *(span->covers)); - } - if(--num_spans == 0) break; - ++span; - } - } - } - } - - //==============================================renderer_scanline_aa_solid - template class renderer_scanline_aa_solid - { - public: - typedef BaseRenderer base_ren_type; - typedef typename base_ren_type::color_type color_type; - - //-------------------------------------------------------------------- - renderer_scanline_aa_solid() : m_ren(0) {} - explicit renderer_scanline_aa_solid(base_ren_type& ren) : m_ren(&ren) {} - void attach(base_ren_type& ren) - { - m_ren = &ren; - } - - //-------------------------------------------------------------------- - void color(const color_type& c) { m_color = c; } - const color_type& color() const { return m_color; } - - //-------------------------------------------------------------------- - void prepare() {} - - //-------------------------------------------------------------------- - template void render(const Scanline& sl) - { - render_scanline_aa_solid(sl, *m_ren, m_color); - } - - private: - base_ren_type* m_ren; - color_type m_color; - }; - - - - - - - - - - - - - - //======================================================render_scanline_aa - template - void render_scanline_aa(const Scanline& sl, BaseRenderer& ren, - SpanAllocator& alloc, SpanGenerator& span_gen) - { - int y = sl.y(); - - unsigned num_spans = sl.num_spans(); - typename Scanline::const_iterator span = sl.begin(); - for(;;) - { - int x = span->x; - int len = span->len; - const typename Scanline::cover_type* covers = span->covers; - - if(len < 0) len = -len; - typename BaseRenderer::color_type* colors = alloc.allocate(len); - span_gen.generate(colors, x, y, len); - ren.blend_color_hspan(x, y, len, colors, - (span->len < 0) ? 0 : covers, *covers); - - if(--num_spans == 0) break; - ++span; - } - } - - //=====================================================render_scanlines_aa - template - void render_scanlines_aa(Rasterizer& ras, Scanline& sl, BaseRenderer& ren, - SpanAllocator& alloc, SpanGenerator& span_gen) - { - if(ras.rewind_scanlines()) - { - sl.reset(ras.min_x(), ras.max_x()); - span_gen.prepare(); - while(ras.sweep_scanline(sl)) - { - render_scanline_aa(sl, ren, alloc, span_gen); - } - } - } - - //====================================================renderer_scanline_aa - template - class renderer_scanline_aa - { - public: - typedef BaseRenderer base_ren_type; - typedef SpanAllocator alloc_type; - typedef SpanGenerator span_gen_type; - - //-------------------------------------------------------------------- - renderer_scanline_aa() : m_ren(0), m_alloc(0), m_span_gen(0) {} - renderer_scanline_aa(base_ren_type& ren, - alloc_type& alloc, - span_gen_type& span_gen) : - m_ren(&ren), - m_alloc(&alloc), - m_span_gen(&span_gen) - {} - void attach(base_ren_type& ren, - alloc_type& alloc, - span_gen_type& span_gen) - { - m_ren = &ren; - m_alloc = &alloc; - m_span_gen = &span_gen; - } - - //-------------------------------------------------------------------- - void prepare() { m_span_gen->prepare(); } - - //-------------------------------------------------------------------- - template void render(const Scanline& sl) - { - render_scanline_aa(sl, *m_ren, *m_alloc, *m_span_gen); - } - - private: - base_ren_type* m_ren; - alloc_type* m_alloc; - span_gen_type* m_span_gen; - }; - - - - - - - //===============================================render_scanline_bin_solid - template - void render_scanline_bin_solid(const Scanline& sl, - BaseRenderer& ren, - const ColorT& color) - { - unsigned num_spans = sl.num_spans(); - typename Scanline::const_iterator span = sl.begin(); - for(;;) - { - ren.blend_hline(span->x, - sl.y(), - span->x - 1 + ((span->len < 0) ? - -span->len : - span->len), - color, - cover_full); - if(--num_spans == 0) break; - ++span; - } - } - - //==============================================render_scanlines_bin_solid - template - void render_scanlines_bin_solid(Rasterizer& ras, Scanline& sl, - BaseRenderer& ren, const ColorT& color) - { - if(ras.rewind_scanlines()) - { - // Explicitly convert "color" to the BaseRenderer color type. - // For example, it can be called with color type "rgba", while - // "rgba8" is needed. Otherwise it will be implicitly - // converted in the loop many times. - //---------------------- - typename BaseRenderer::color_type ren_color(color); - - sl.reset(ras.min_x(), ras.max_x()); - while(ras.sweep_scanline(sl)) - { - //render_scanline_bin_solid(sl, ren, ren_color); - - // This code is equivalent to the above call (copy/paste). - // It's just a "manual" optimization for old compilers, - // like Microsoft Visual C++ v6.0 - //------------------------------- - unsigned num_spans = sl.num_spans(); - typename Scanline::const_iterator span = sl.begin(); - for(;;) - { - ren.blend_hline(span->x, - sl.y(), - span->x - 1 + ((span->len < 0) ? - -span->len : - span->len), - ren_color, - cover_full); - if(--num_spans == 0) break; - ++span; - } - } - } - } - - //=============================================renderer_scanline_bin_solid - template class renderer_scanline_bin_solid - { - public: - typedef BaseRenderer base_ren_type; - typedef typename base_ren_type::color_type color_type; - - //-------------------------------------------------------------------- - renderer_scanline_bin_solid() : m_ren(0) {} - explicit renderer_scanline_bin_solid(base_ren_type& ren) : m_ren(&ren) {} - void attach(base_ren_type& ren) - { - m_ren = &ren; - } - - //-------------------------------------------------------------------- - void color(const color_type& c) { m_color = c; } - const color_type& color() const { return m_color; } - - //-------------------------------------------------------------------- - void prepare() {} - - //-------------------------------------------------------------------- - template void render(const Scanline& sl) - { - render_scanline_bin_solid(sl, *m_ren, m_color); - } - - private: - base_ren_type* m_ren; - color_type m_color; - }; - - - - - - - - - //======================================================render_scanline_bin - template - void render_scanline_bin(const Scanline& sl, BaseRenderer& ren, - SpanAllocator& alloc, SpanGenerator& span_gen) - { - int y = sl.y(); - - unsigned num_spans = sl.num_spans(); - typename Scanline::const_iterator span = sl.begin(); - for(;;) - { - int x = span->x; - int len = span->len; - if(len < 0) len = -len; - typename BaseRenderer::color_type* colors = alloc.allocate(len); - span_gen.generate(colors, x, y, len); - ren.blend_color_hspan(x, y, len, colors, 0, cover_full); - if(--num_spans == 0) break; - ++span; - } - } - - //=====================================================render_scanlines_bin - template - void render_scanlines_bin(Rasterizer& ras, Scanline& sl, BaseRenderer& ren, - SpanAllocator& alloc, SpanGenerator& span_gen) - { - if(ras.rewind_scanlines()) - { - sl.reset(ras.min_x(), ras.max_x()); - span_gen.prepare(); - while(ras.sweep_scanline(sl)) - { - render_scanline_bin(sl, ren, alloc, span_gen); - } - } - } - - //====================================================renderer_scanline_bin - template - class renderer_scanline_bin - { - public: - typedef BaseRenderer base_ren_type; - typedef SpanAllocator alloc_type; - typedef SpanGenerator span_gen_type; - - //-------------------------------------------------------------------- - renderer_scanline_bin() : m_ren(0), m_alloc(0), m_span_gen(0) {} - renderer_scanline_bin(base_ren_type& ren, - alloc_type& alloc, - span_gen_type& span_gen) : - m_ren(&ren), - m_alloc(&alloc), - m_span_gen(&span_gen) - {} - void attach(base_ren_type& ren, - alloc_type& alloc, - span_gen_type& span_gen) - { - m_ren = &ren; - m_alloc = &alloc; - m_span_gen = &span_gen; - } - - //-------------------------------------------------------------------- - void prepare() { m_span_gen->prepare(); } - - //-------------------------------------------------------------------- - template void render(const Scanline& sl) - { - render_scanline_bin(sl, *m_ren, *m_alloc, *m_span_gen); - } - - private: - base_ren_type* m_ren; - alloc_type* m_alloc; - span_gen_type* m_span_gen; - }; - - - - - - - - - - - //========================================================render_scanlines - template - void render_scanlines(Rasterizer& ras, Scanline& sl, Renderer& ren) - { - if(ras.rewind_scanlines()) - { - sl.reset(ras.min_x(), ras.max_x()); - ren.prepare(); - while(ras.sweep_scanline(sl)) - { - ren.render(sl); - } - } - } - - //========================================================render_all_paths - template - void render_all_paths(Rasterizer& ras, - Scanline& sl, - Renderer& r, - VertexSource& vs, - const ColorStorage& as, - const PathId& path_id, - unsigned num_paths) - { - for(unsigned i = 0; i < num_paths; i++) - { - ras.reset(); - ras.add_path(vs, path_id[i]); - r.color(as[i]); - render_scanlines(ras, sl, r); - } - } - - - - - - - //=============================================render_scanlines_compound - template - void render_scanlines_compound(Rasterizer& ras, - ScanlineAA& sl_aa, - ScanlineBin& sl_bin, - BaseRenderer& ren, - SpanAllocator& alloc, - StyleHandler& sh) - { - if(ras.rewind_scanlines()) - { - int min_x = ras.min_x(); - int len = ras.max_x() - min_x + 2; - sl_aa.reset(min_x, ras.max_x()); - sl_bin.reset(min_x, ras.max_x()); - - typedef typename BaseRenderer::color_type color_type; - color_type* color_span = alloc.allocate(len * 2); - color_type* mix_buffer = color_span + len; - unsigned num_spans; - - unsigned num_styles; - unsigned style; - bool solid; - while((num_styles = ras.sweep_styles()) > 0) - { - typename ScanlineAA::const_iterator span_aa; - if(num_styles == 1) - { - // Optimization for a single style. Happens often - //------------------------- - if(ras.sweep_scanline(sl_aa, 0)) - { - style = ras.style(0); - if(sh.is_solid(style)) - { - // Just solid fill - //----------------------- - render_scanline_aa_solid(sl_aa, ren, sh.color(style)); - } - else - { - // Arbitrary span generator - //----------------------- - span_aa = sl_aa.begin(); - num_spans = sl_aa.num_spans(); - for(;;) - { - len = span_aa->len; - sh.generate_span(color_span, - span_aa->x, - sl_aa.y(), - len, - style); - - ren.blend_color_hspan(span_aa->x, - sl_aa.y(), - span_aa->len, - color_span, - span_aa->covers); - if(--num_spans == 0) break; - ++span_aa; - } - } - } - } - else - { - if(ras.sweep_scanline(sl_bin, -1)) - { - // Clear the spans of the mix_buffer - //-------------------- - typename ScanlineBin::const_iterator span_bin = sl_bin.begin(); - num_spans = sl_bin.num_spans(); - for(;;) - { - memset(mix_buffer + span_bin->x - min_x, - 0, - span_bin->len * sizeof(color_type)); - - if(--num_spans == 0) break; - ++span_bin; - } - - unsigned i; - for(i = 0; i < num_styles; i++) - { - style = ras.style(i); - solid = sh.is_solid(style); - - if(ras.sweep_scanline(sl_aa, i)) - { - color_type* colors; - color_type* cspan; - typename ScanlineAA::cover_type* covers; - span_aa = sl_aa.begin(); - num_spans = sl_aa.num_spans(); - if(solid) - { - // Just solid fill - //----------------------- - for(;;) - { - color_type c = sh.color(style); - len = span_aa->len; - colors = mix_buffer + span_aa->x - min_x; - covers = span_aa->covers; - do - { - if(*covers == cover_full) - { - *colors = c; - } - else - { - colors->add(c, *covers); - } - ++colors; - ++covers; - } - while(--len); - if(--num_spans == 0) break; - ++span_aa; - } - } - else - { - // Arbitrary span generator - //----------------------- - for(;;) - { - len = span_aa->len; - colors = mix_buffer + span_aa->x - min_x; - cspan = color_span; - sh.generate_span(cspan, - span_aa->x, - sl_aa.y(), - len, - style); - covers = span_aa->covers; - do - { - if(*covers == cover_full) - { - *colors = *cspan; - } - else - { - colors->add(*cspan, *covers); - } - ++cspan; - ++colors; - ++covers; - } - while(--len); - if(--num_spans == 0) break; - ++span_aa; - } - } - } - } - - // Emit the blended result as a color hspan - //------------------------- - span_bin = sl_bin.begin(); - num_spans = sl_bin.num_spans(); - for(;;) - { - ren.blend_color_hspan(span_bin->x, - sl_bin.y(), - span_bin->len, - mix_buffer + span_bin->x - min_x, - 0, - cover_full); - if(--num_spans == 0) break; - ++span_bin; - } - } // if(ras.sweep_scanline(sl_bin, -1)) - } // if(num_styles == 1) ... else - } // while((num_styles = ras.sweep_styles()) > 0) - } // if(ras.rewind_scanlines()) - } - - //=======================================render_scanlines_compound_layered - template - void render_scanlines_compound_layered(Rasterizer& ras, - ScanlineAA& sl_aa, - BaseRenderer& ren, - SpanAllocator& alloc, - StyleHandler& sh) - { - if(ras.rewind_scanlines()) - { - int min_x = ras.min_x(); - int len = ras.max_x() - min_x + 2; - sl_aa.reset(min_x, ras.max_x()); - - typedef typename BaseRenderer::color_type color_type; - color_type* color_span = alloc.allocate(len * 2); - color_type* mix_buffer = color_span + len; - cover_type* cover_buffer = ras.allocate_cover_buffer(len); - unsigned num_spans; - - unsigned num_styles; - unsigned style; - bool solid; - while((num_styles = ras.sweep_styles()) > 0) - { - typename ScanlineAA::const_iterator span_aa; - if(num_styles == 1) - { - // Optimization for a single style. Happens often - //------------------------- - if(ras.sweep_scanline(sl_aa, 0)) - { - style = ras.style(0); - if(sh.is_solid(style)) - { - // Just solid fill - //----------------------- - render_scanline_aa_solid(sl_aa, ren, sh.color(style)); - } - else - { - // Arbitrary span generator - //----------------------- - span_aa = sl_aa.begin(); - num_spans = sl_aa.num_spans(); - for(;;) - { - len = span_aa->len; - sh.generate_span(color_span, - span_aa->x, - sl_aa.y(), - len, - style); - - ren.blend_color_hspan(span_aa->x, - sl_aa.y(), - span_aa->len, - color_span, - span_aa->covers); - if(--num_spans == 0) break; - ++span_aa; - } - } - } - } - else - { - int sl_start = ras.scanline_start(); - unsigned sl_len = ras.scanline_length(); - - if(sl_len) - { - memset(mix_buffer + sl_start - min_x, - 0, - sl_len * sizeof(color_type)); - - memset(cover_buffer + sl_start - min_x, - 0, - sl_len * sizeof(cover_type)); - - int sl_y = 0x7FFFFFFF; - unsigned i; - for(i = 0; i < num_styles; i++) - { - style = ras.style(i); - solid = sh.is_solid(style); - - if(ras.sweep_scanline(sl_aa, i)) - { - unsigned cover; - color_type* colors; - color_type* cspan; - cover_type* src_covers; - cover_type* dst_covers; - span_aa = sl_aa.begin(); - num_spans = sl_aa.num_spans(); - sl_y = sl_aa.y(); - if(solid) - { - // Just solid fill - //----------------------- - for(;;) - { - color_type c = sh.color(style); - len = span_aa->len; - colors = mix_buffer + span_aa->x - min_x; - src_covers = span_aa->covers; - dst_covers = cover_buffer + span_aa->x - min_x; - do - { - cover = *src_covers; - if(*dst_covers + cover > cover_full) - { - cover = cover_full - *dst_covers; - } - if(cover) - { - colors->add(c, cover); - *dst_covers += cover; - } - ++colors; - ++src_covers; - ++dst_covers; - } - while(--len); - if(--num_spans == 0) break; - ++span_aa; - } - } - else - { - // Arbitrary span generator - //----------------------- - for(;;) - { - len = span_aa->len; - colors = mix_buffer + span_aa->x - min_x; - cspan = color_span; - sh.generate_span(cspan, - span_aa->x, - sl_aa.y(), - len, - style); - src_covers = span_aa->covers; - dst_covers = cover_buffer + span_aa->x - min_x; - do - { - cover = *src_covers; - if(*dst_covers + cover > cover_full) - { - cover = cover_full - *dst_covers; - } - if(cover) - { - colors->add(*cspan, cover); - *dst_covers += cover; - } - ++cspan; - ++colors; - ++src_covers; - ++dst_covers; - } - while(--len); - if(--num_spans == 0) break; - ++span_aa; - } - } - } - } - ren.blend_color_hspan(sl_start, - sl_y, - sl_len, - mix_buffer + sl_start - min_x, - 0, - cover_full); - } //if(sl_len) - } //if(num_styles == 1) ... else - } //while((num_styles = ras.sweep_styles()) > 0) - } //if(ras.rewind_scanlines()) - } - - -} - -#endif diff --git a/uppdev/agg24/agg_rendering_buffer.h b/uppdev/agg24/agg_rendering_buffer.h deleted file mode 100644 index 14d3e5397..000000000 --- a/uppdev/agg24/agg_rendering_buffer.h +++ /dev/null @@ -1,300 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// class rendering_buffer -// -//---------------------------------------------------------------------------- - -#ifndef AGG_RENDERING_BUFFER_INCLUDED -#define AGG_RENDERING_BUFFER_INCLUDED - -#include "agg_array.h" - -namespace agg -{ - - //===========================================================row_accessor - template class row_accessor - { - public: - typedef const_row_info row_data; - - //------------------------------------------------------------------- - row_accessor() : - m_buf(0), - m_start(0), - m_width(0), - m_height(0), - m_stride(0) - { - } - - //-------------------------------------------------------------------- - row_accessor(T* buf, unsigned width, unsigned height, int stride) : - m_buf(0), - m_start(0), - m_width(0), - m_height(0), - m_stride(0) - { - attach(buf, width, height, stride); - } - - - //-------------------------------------------------------------------- - void attach(T* buf, unsigned width, unsigned height, int stride) - { - m_buf = m_start = buf; - m_width = width; - m_height = height; - m_stride = stride; - if(stride < 0) - { - m_start = m_buf - int(height - 1) * stride; - } - } - - //-------------------------------------------------------------------- - AGG_INLINE T* buf() { return m_buf; } - AGG_INLINE const T* buf() const { return m_buf; } - AGG_INLINE unsigned width() const { return m_width; } - AGG_INLINE unsigned height() const { return m_height; } - AGG_INLINE int stride() const { return m_stride; } - AGG_INLINE unsigned stride_abs() const - { - return (m_stride < 0) ? unsigned(-m_stride) : unsigned(m_stride); - } - - //-------------------------------------------------------------------- - AGG_INLINE T* row_ptr(int, int y, unsigned) - { - return m_start + y * m_stride; - } - AGG_INLINE T* row_ptr(int y) { return m_start + y * m_stride; } - AGG_INLINE const T* row_ptr(int y) const { return m_start + y * m_stride; } - AGG_INLINE row_data row (int y) const - { - return row_data(0, m_width-1, row_ptr(y)); - } - - //-------------------------------------------------------------------- - template - void copy_from(const RenBuf& src) - { - unsigned h = height(); - if(src.height() < h) h = src.height(); - - unsigned l = stride_abs(); - if(src.stride_abs() < l) l = src.stride_abs(); - - l *= sizeof(T); - - unsigned y; - unsigned w = width(); - for (y = 0; y < h; y++) - { - memcpy(row_ptr(0, y, w), src.row_ptr(y), l); - } - } - - //-------------------------------------------------------------------- - void clear(T value) - { - unsigned y; - unsigned w = width(); - unsigned stride = stride_abs(); - for(y = 0; y < height(); y++) - { - T* p = row_ptr(0, y, w); - unsigned x; - for(x = 0; x < stride; x++) - { - *p++ = value; - } - } - } - - private: - //-------------------------------------------------------------------- - T* m_buf; // Pointer to renrdering buffer - T* m_start; // Pointer to first pixel depending on stride - unsigned m_width; // Width in pixels - unsigned m_height; // Height in pixels - int m_stride; // Number of bytes per row. Can be < 0 - }; - - - - - //==========================================================row_ptr_cache - template class row_ptr_cache - { - public: - typedef const_row_info row_data; - - //------------------------------------------------------------------- - row_ptr_cache() : - m_buf(0), - m_rows(), - m_width(0), - m_height(0), - m_stride(0) - { - } - - //-------------------------------------------------------------------- - row_ptr_cache(T* buf, unsigned width, unsigned height, int stride) : - m_buf(0), - m_rows(), - m_width(0), - m_height(0), - m_stride(0) - { - attach(buf, width, height, stride); - } - - //-------------------------------------------------------------------- - void attach(T* buf, unsigned width, unsigned height, int stride) - { - m_buf = buf; - m_width = width; - m_height = height; - m_stride = stride; - if(height > m_rows.size()) - { - m_rows.resize(height); - } - - T* row_ptr = m_buf; - - if(stride < 0) - { - row_ptr = m_buf - int(height - 1) * stride; - } - - T** rows = &m_rows[0]; - - while(height--) - { - *rows++ = row_ptr; - row_ptr += stride; - } - } - - //-------------------------------------------------------------------- - AGG_INLINE T* buf() { return m_buf; } - AGG_INLINE const T* buf() const { return m_buf; } - AGG_INLINE unsigned width() const { return m_width; } - AGG_INLINE unsigned height() const { return m_height; } - AGG_INLINE int stride() const { return m_stride; } - AGG_INLINE unsigned stride_abs() const - { - return (m_stride < 0) ? unsigned(-m_stride) : unsigned(m_stride); - } - - //-------------------------------------------------------------------- - AGG_INLINE T* row_ptr(int, int y, unsigned) - { - return m_rows[y]; - } - AGG_INLINE T* row_ptr(int y) { return m_rows[y]; } - AGG_INLINE const T* row_ptr(int y) const { return m_rows[y]; } - AGG_INLINE row_data row (int y) const - { - return row_data(0, m_width-1, m_rows[y]); - } - - //-------------------------------------------------------------------- - T const* const* rows() const { return &m_rows[0]; } - - //-------------------------------------------------------------------- - template - void copy_from(const RenBuf& src) - { - unsigned h = height(); - if(src.height() < h) h = src.height(); - - unsigned l = stride_abs(); - if(src.stride_abs() < l) l = src.stride_abs(); - - l *= sizeof(T); - - unsigned y; - unsigned w = width(); - for (y = 0; y < h; y++) - { - memcpy(row_ptr(0, y, w), src.row_ptr(y), l); - } - } - - //-------------------------------------------------------------------- - void clear(T value) - { - unsigned y; - unsigned w = width(); - unsigned stride = stride_abs(); - for(y = 0; y < height(); y++) - { - T* p = row_ptr(0, y, w); - unsigned x; - for(x = 0; x < stride; x++) - { - *p++ = value; - } - } - } - - private: - //-------------------------------------------------------------------- - T* m_buf; // Pointer to renrdering buffer - pod_array m_rows; // Pointers to each row of the buffer - unsigned m_width; // Width in pixels - unsigned m_height; // Height in pixels - int m_stride; // Number of bytes per row. Can be < 0 - }; - - - - - //========================================================rendering_buffer - // - // The definition of the main type for accessing the rows in the frame - // buffer. It provides functionality to navigate to the rows in a - // rectangular matrix, from top to bottom or from bottom to top depending - // on stride. - // - // row_accessor is cheap to create/destroy, but performs one multiplication - // when calling row_ptr(). - // - // row_ptr_cache creates an array of pointers to rows, so, the access - // via row_ptr() may be faster. But it requires memory allocation - // when creating. For example, on typical Intel Pentium hardware - // row_ptr_cache speeds span_image_filter_rgb_nn up to 10% - // - // It's used only in short hand typedefs like pixfmt_rgba32 and can be - // redefined in agg_config.h - // In real applications you can use both, depending on your needs - //------------------------------------------------------------------------ -#ifdef AGG_RENDERING_BUFFER - typedef AGG_RENDERING_BUFFER rendering_buffer; -#else -// typedef row_ptr_cache rendering_buffer; - typedef row_accessor rendering_buffer; -#endif - -} - - -#endif diff --git a/uppdev/agg24/agg_rendering_buffer_dynarow.h b/uppdev/agg24/agg_rendering_buffer_dynarow.h deleted file mode 100644 index 188746f3d..000000000 --- a/uppdev/agg24/agg_rendering_buffer_dynarow.h +++ /dev/null @@ -1,137 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// class rendering_buffer_dynarow -// -//---------------------------------------------------------------------------- - -#ifndef AGG_RENDERING_BUFFER_DYNAROW_INCLUDED -#define AGG_RENDERING_BUFFER_DYNAROW_INCLUDED - -#include "agg_array.h" - -namespace agg -{ - - //===============================================rendering_buffer_dynarow - // Rendering buffer class with dynamic allocation of the rows. - // The rows are allocated as needed when requesting for span_ptr(). - // The class automatically calculates min_x and max_x for each row. - // Generally it's more efficient to use this class as a temporary buffer - // for rendering a few lines and then to blend it with another buffer. - // - class rendering_buffer_dynarow - { - public: - typedef row_info row_data; - - //------------------------------------------------------------------- - ~rendering_buffer_dynarow() - { - init(0,0,0); - } - - //------------------------------------------------------------------- - rendering_buffer_dynarow() : - m_rows(), - m_width(0), - m_height(0), - m_byte_width(0) - { - } - - // Allocate and clear the buffer - //-------------------------------------------------------------------- - rendering_buffer_dynarow(unsigned width, unsigned height, - unsigned byte_width) : - m_rows(height), - m_width(width), - m_height(height), - m_byte_width(byte_width) - { - memset(&m_rows[0], 0, sizeof(row_data) * height); - } - - // Allocate and clear the buffer - //-------------------------------------------------------------------- - void init(unsigned width, unsigned height, unsigned byte_width) - { - unsigned i; - for(i = 0; i < m_height; ++i) - { - pod_allocator::deallocate((int8u*)m_rows[i].ptr, m_byte_width); - } - if(width && height) - { - m_width = width; - m_height = height; - m_byte_width = byte_width; - m_rows.resize(height); - memset(&m_rows[0], 0, sizeof(row_data) * height); - } - } - - //-------------------------------------------------------------------- - unsigned width() const { return m_width; } - unsigned height() const { return m_height; } - unsigned byte_width() const { return m_byte_width; } - - // The main function used for rendering. Returns pointer to the - // pre-allocated span. Memory for the row is allocated as needed. - //-------------------------------------------------------------------- - int8u* row_ptr(int x, int y, unsigned len) - { - row_data* r = &m_rows[y]; - int x2 = x + len - 1; - if(r->ptr) - { - if(x < r->x1) { r->x1 = x; } - if(x2 > r->x2) { r->x2 = x2; } - } - else - { - int8u* p = pod_allocator::allocate(m_byte_width); - r->ptr = p; - r->x1 = x; - r->x2 = x2; - memset(p, 0, m_byte_width); - } - return (int8u*)r->ptr; - } - - //-------------------------------------------------------------------- - const int8u* row_ptr(int y) const { return m_rows[y].ptr; } - int8u* row_ptr(int y) { return row_ptr(0, y, m_width); } - row_data row (int y) const { return m_rows[y]; } - - private: - //-------------------------------------------------------------------- - // Prohibit copying - rendering_buffer_dynarow(const rendering_buffer_dynarow&); - const rendering_buffer_dynarow& operator = (const rendering_buffer_dynarow&); - - private: - //-------------------------------------------------------------------- - pod_array m_rows; // Pointers to each row of the buffer - unsigned m_width; // Width in pixels - unsigned m_height; // Height in pixels - unsigned m_byte_width; // Width in bytes - }; - - -} - - -#endif diff --git a/uppdev/agg24/agg_rounded_rect.cpp b/uppdev/agg24/agg_rounded_rect.cpp deleted file mode 100644 index bebc06362..000000000 --- a/uppdev/agg24/agg_rounded_rect.cpp +++ /dev/null @@ -1,164 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Rounded rectangle vertex generator -// -//---------------------------------------------------------------------------- - -#include -#include "agg_rounded_rect.h" - - -namespace agg -{ - //------------------------------------------------------------------------ - rounded_rect::rounded_rect(double x1, double y1, double x2, double y2, double r) : - m_x1(x1), m_y1(y1), m_x2(x2), m_y2(y2), - m_rx1(r), m_ry1(r), m_rx2(r), m_ry2(r), - m_rx3(r), m_ry3(r), m_rx4(r), m_ry4(r) - { - if(x1 > x2) { m_x1 = x2; m_x2 = x1; } - if(y1 > y2) { m_y1 = y2; m_y2 = y1; } - } - - //-------------------------------------------------------------------- - void rounded_rect::rect(double x1, double y1, double x2, double y2) - { - m_x1 = x1; - m_y1 = y1; - m_x2 = x2; - m_y2 = y2; - if(x1 > x2) { m_x1 = x2; m_x2 = x1; } - if(y1 > y2) { m_y1 = y2; m_y2 = y1; } - } - - //-------------------------------------------------------------------- - void rounded_rect::radius(double r) - { - m_rx1 = m_ry1 = m_rx2 = m_ry2 = m_rx3 = m_ry3 = m_rx4 = m_ry4 = r; - } - - //-------------------------------------------------------------------- - void rounded_rect::radius(double rx, double ry) - { - m_rx1 = m_rx2 = m_rx3 = m_rx4 = rx; - m_ry1 = m_ry2 = m_ry3 = m_ry4 = ry; - } - - //-------------------------------------------------------------------- - void rounded_rect::radius(double rx_bottom, double ry_bottom, - double rx_top, double ry_top) - { - m_rx1 = m_rx2 = rx_bottom; - m_rx3 = m_rx4 = rx_top; - m_ry1 = m_ry2 = ry_bottom; - m_ry3 = m_ry4 = ry_top; - } - - //-------------------------------------------------------------------- - void rounded_rect::radius(double rx1, double ry1, double rx2, double ry2, - double rx3, double ry3, double rx4, double ry4) - { - m_rx1 = rx1; m_ry1 = ry1; m_rx2 = rx2; m_ry2 = ry2; - m_rx3 = rx3; m_ry3 = ry3; m_rx4 = rx4; m_ry4 = ry4; - } - - //-------------------------------------------------------------------- - void rounded_rect::normalize_radius() - { - double dx = fabs(m_y2 - m_y1); - double dy = fabs(m_x2 - m_x1); - - double k = 1.0; - double t; - t = dx / (m_rx1 + m_rx2); if(t < k) k = t; - t = dx / (m_rx3 + m_rx4); if(t < k) k = t; - t = dy / (m_ry1 + m_ry2); if(t < k) k = t; - t = dy / (m_ry3 + m_ry4); if(t < k) k = t; - - if(k < 1.0) - { - m_rx1 *= k; m_ry1 *= k; m_rx2 *= k; m_ry2 *= k; - m_rx3 *= k; m_ry3 *= k; m_rx4 *= k; m_ry4 *= k; - } - } - - //-------------------------------------------------------------------- - void rounded_rect::rewind(unsigned) - { - m_status = 0; - } - - //-------------------------------------------------------------------- - unsigned rounded_rect::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_stop; - switch(m_status) - { - case 0: - m_arc.init(m_x1 + m_rx1, m_y1 + m_ry1, m_rx1, m_ry1, - pi, pi+pi*0.5); - m_arc.rewind(0); - m_status++; - - case 1: - cmd = m_arc.vertex(x, y); - if(is_stop(cmd)) m_status++; - else return cmd; - - case 2: - m_arc.init(m_x2 - m_rx2, m_y1 + m_ry2, m_rx2, m_ry2, - pi+pi*0.5, 0.0); - m_arc.rewind(0); - m_status++; - - case 3: - cmd = m_arc.vertex(x, y); - if(is_stop(cmd)) m_status++; - else return path_cmd_line_to; - - case 4: - m_arc.init(m_x2 - m_rx3, m_y2 - m_ry3, m_rx3, m_ry3, - 0.0, pi*0.5); - m_arc.rewind(0); - m_status++; - - case 5: - cmd = m_arc.vertex(x, y); - if(is_stop(cmd)) m_status++; - else return path_cmd_line_to; - - case 6: - m_arc.init(m_x1 + m_rx4, m_y2 - m_ry4, m_rx4, m_ry4, - pi*0.5, pi); - m_arc.rewind(0); - m_status++; - - case 7: - cmd = m_arc.vertex(x, y); - if(is_stop(cmd)) m_status++; - else return path_cmd_line_to; - - case 8: - cmd = path_cmd_end_poly | path_flags_close | path_flags_ccw; - m_status++; - break; - } - return cmd; - } - - -} - diff --git a/uppdev/agg24/agg_rounded_rect.h b/uppdev/agg24/agg_rounded_rect.h deleted file mode 100644 index fe8d26f71..000000000 --- a/uppdev/agg24/agg_rounded_rect.h +++ /dev/null @@ -1,72 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Rounded rectangle vertex generator -// -//---------------------------------------------------------------------------- - -#ifndef AGG_ROUNDED_RECT_INCLUDED -#define AGG_ROUNDED_RECT_INCLUDED - -#include "agg_basics.h" -#include "agg_arc.h" - -namespace agg -{ - //------------------------------------------------------------rounded_rect - // - // See Implemantation agg_rounded_rect.cpp - // - class rounded_rect - { - public: - rounded_rect() {} - rounded_rect(double x1, double y1, double x2, double y2, double r); - - void rect(double x1, double y1, double x2, double y2); - void radius(double r); - void radius(double rx, double ry); - void radius(double rx_bottom, double ry_bottom, double rx_top, double ry_top); - void radius(double rx1, double ry1, double rx2, double ry2, - double rx3, double ry3, double rx4, double ry4); - void normalize_radius(); - - void approximation_scale(double s) { m_arc.approximation_scale(s); } - double approximation_scale() const { return m_arc.approximation_scale(); } - - void rewind(unsigned); - unsigned vertex(double* x, double* y); - - private: - double m_x1; - double m_y1; - double m_x2; - double m_y2; - double m_rx1; - double m_ry1; - double m_rx2; - double m_ry2; - double m_rx3; - double m_ry3; - double m_rx4; - double m_ry4; - unsigned m_status; - arc m_arc; - }; - -} - -#endif - diff --git a/uppdev/agg24/agg_scale_ctrl.cpp b/uppdev/agg24/agg_scale_ctrl.cpp deleted file mode 100644 index 19bc8db7d..000000000 --- a/uppdev/agg24/agg_scale_ctrl.cpp +++ /dev/null @@ -1,454 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// classes scale_ctrl_impl, scale_ctrl -// -//---------------------------------------------------------------------------- - -#include "agg_scale_ctrl.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - scale_ctrl_impl::scale_ctrl_impl(double x1, double y1, - double x2, double y2, bool flip_y) : - ctrl(x1, y1, x2, y2, flip_y), - m_border_thickness(1.0), - m_border_extra((fabs(x2 - x1) > fabs(y2 - y1)) ? (y2 - y1) / 2 : (x2 - x1) / 2), - m_pdx(0.0), - m_pdy(0.0), - m_move_what(move_nothing), - m_value1(0.3), - m_value2(0.7), - m_min_d(0.01) - { - calc_box(); - } - - - //------------------------------------------------------------------------ - void scale_ctrl_impl::calc_box() - { - m_xs1 = m_x1 + m_border_thickness; - m_ys1 = m_y1 + m_border_thickness; - m_xs2 = m_x2 - m_border_thickness; - m_ys2 = m_y2 - m_border_thickness; - } - - - //------------------------------------------------------------------------ - void scale_ctrl_impl::border_thickness(double t, double extra) - { - m_border_thickness = t; - m_border_extra = extra; - calc_box(); - } - - - //------------------------------------------------------------------------ - void scale_ctrl_impl::resize(double x1, double y1, double x2, double y2) - { - m_x1 = x1; - m_y1 = y1; - m_x2 = x2; - m_y2 = y2; - calc_box(); - m_border_extra = (fabs(x2 - x1) > fabs(y2 - y1)) ? - (y2 - y1) / 2 : - (x2 - x1) / 2; - } - - - //------------------------------------------------------------------------ - void scale_ctrl_impl::value1(double value) - { - if(value < 0.0) value = 0.0; - if(value > 1.0) value = 1.0; - if(m_value2 - value < m_min_d) value = m_value2 - m_min_d; - m_value1 = value; - } - - - //------------------------------------------------------------------------ - void scale_ctrl_impl::value2(double value) - { - if(value < 0.0) value = 0.0; - if(value > 1.0) value = 1.0; - if(m_value1 + value < m_min_d) value = m_value1 + m_min_d; - m_value2 = value; - } - - - //------------------------------------------------------------------------ - void scale_ctrl_impl::move(double d) - { - m_value1 += d; - m_value2 += d; - if(m_value1 < 0.0) - { - m_value2 -= m_value1; - m_value1 = 0.0; - } - if(m_value2 > 1.0) - { - m_value1 -= m_value2 - 1.0; - m_value2 = 1.0; - } - } - - - //------------------------------------------------------------------------ - void scale_ctrl_impl::rewind(unsigned idx) - { - m_idx = idx; - - switch(idx) - { - default: - - case 0: // Background - m_vertex = 0; - m_vx[0] = m_x1 - m_border_extra; - m_vy[0] = m_y1 - m_border_extra; - m_vx[1] = m_x2 + m_border_extra; - m_vy[1] = m_y1 - m_border_extra; - m_vx[2] = m_x2 + m_border_extra; - m_vy[2] = m_y2 + m_border_extra; - m_vx[3] = m_x1 - m_border_extra; - m_vy[3] = m_y2 + m_border_extra; - break; - - case 1: // Border - m_vertex = 0; - m_vx[0] = m_x1; - m_vy[0] = m_y1; - m_vx[1] = m_x2; - m_vy[1] = m_y1; - m_vx[2] = m_x2; - m_vy[2] = m_y2; - m_vx[3] = m_x1; - m_vy[3] = m_y2; - m_vx[4] = m_x1 + m_border_thickness; - m_vy[4] = m_y1 + m_border_thickness; - m_vx[5] = m_x1 + m_border_thickness; - m_vy[5] = m_y2 - m_border_thickness; - m_vx[6] = m_x2 - m_border_thickness; - m_vy[6] = m_y2 - m_border_thickness; - m_vx[7] = m_x2 - m_border_thickness; - m_vy[7] = m_y1 + m_border_thickness; - break; - - case 2: // pointer1 - if(fabs(m_x2 - m_x1) > fabs(m_y2 - m_y1)) - { - m_ellipse.init(m_xs1 + (m_xs2 - m_xs1) * m_value1, - (m_ys1 + m_ys2) / 2.0, - m_y2 - m_y1, - m_y2 - m_y1, - 32); - } - else - { - m_ellipse.init((m_xs1 + m_xs2) / 2.0, - m_ys1 + (m_ys2 - m_ys1) * m_value1, - m_x2 - m_x1, - m_x2 - m_x1, - 32); - } - m_ellipse.rewind(0); - break; - - case 3: // pointer2 - if(fabs(m_x2 - m_x1) > fabs(m_y2 - m_y1)) - { - m_ellipse.init(m_xs1 + (m_xs2 - m_xs1) * m_value2, - (m_ys1 + m_ys2) / 2.0, - m_y2 - m_y1, - m_y2 - m_y1, - 32); - } - else - { - m_ellipse.init((m_xs1 + m_xs2) / 2.0, - m_ys1 + (m_ys2 - m_ys1) * m_value2, - m_x2 - m_x1, - m_x2 - m_x1, - 32); - } - m_ellipse.rewind(0); - break; - - case 4: // slider - m_vertex = 0; - if(fabs(m_x2 - m_x1) > fabs(m_y2 - m_y1)) - { - m_vx[0] = m_xs1 + (m_xs2 - m_xs1) * m_value1; - m_vy[0] = m_y1 - m_border_extra / 2.0; - m_vx[1] = m_xs1 + (m_xs2 - m_xs1) * m_value2; - m_vy[1] = m_vy[0]; - m_vx[2] = m_vx[1]; - m_vy[2] = m_y2 + m_border_extra / 2.0; - m_vx[3] = m_vx[0]; - m_vy[3] = m_vy[2]; - } - else - { - m_vx[0] = m_x1 - m_border_extra / 2.0; - m_vy[0] = m_ys1 + (m_ys2 - m_ys1) * m_value1; - m_vx[1] = m_vx[0]; - m_vy[1] = m_ys1 + (m_ys2 - m_ys1) * m_value2; - m_vx[2] = m_x2 + m_border_extra / 2.0; - m_vy[2] = m_vy[1]; - m_vx[3] = m_vx[2]; - m_vy[3] = m_vy[0]; - } - break; - } - } - - - //------------------------------------------------------------------------ - unsigned scale_ctrl_impl::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_line_to; - switch(m_idx) - { - case 0: - case 4: - if(m_vertex == 0) cmd = path_cmd_move_to; - if(m_vertex >= 4) cmd = path_cmd_stop; - *x = m_vx[m_vertex]; - *y = m_vy[m_vertex]; - m_vertex++; - break; - - case 1: - if(m_vertex == 0 || m_vertex == 4) cmd = path_cmd_move_to; - if(m_vertex >= 8) cmd = path_cmd_stop; - *x = m_vx[m_vertex]; - *y = m_vy[m_vertex]; - m_vertex++; - break; - - case 2: - case 3: - cmd = m_ellipse.vertex(x, y); - break; - - default: - cmd = path_cmd_stop; - break; - } - - if(!is_stop(cmd)) - { - transform_xy(x, y); - } - - return cmd; - } - - - - //------------------------------------------------------------------------ - bool scale_ctrl_impl::in_rect(double x, double y) const - { - inverse_transform_xy(&x, &y); - return x >= m_x1 && x <= m_x2 && y >= m_y1 && y <= m_y2; - } - - - //------------------------------------------------------------------------ - bool scale_ctrl_impl::on_mouse_button_down(double x, double y) - { - inverse_transform_xy(&x, &y); - - double xp1; - double xp2; - double ys1; - double ys2; - double xp; - double yp; - - if(fabs(m_x2 - m_x1) > fabs(m_y2 - m_y1)) - { - xp1 = m_xs1 + (m_xs2 - m_xs1) * m_value1; - xp2 = m_xs1 + (m_xs2 - m_xs1) * m_value2; - ys1 = m_y1 - m_border_extra / 2.0; - ys2 = m_y2 + m_border_extra / 2.0; - yp = (m_ys1 + m_ys2) / 2.0; - - if(x > xp1 && y > ys1 && x < xp2 && y < ys2) - { - m_pdx = xp1 - x; - m_move_what = move_slider; - return true; - } - - //if(x < xp1 && calc_distance(x, y, xp1, yp) <= m_y2 - m_y1) - if(calc_distance(x, y, xp1, yp) <= m_y2 - m_y1) - { - m_pdx = xp1 - x; - m_move_what = move_value1; - return true; - } - - //if(x > xp2 && calc_distance(x, y, xp2, yp) <= m_y2 - m_y1) - if(calc_distance(x, y, xp2, yp) <= m_y2 - m_y1) - { - m_pdx = xp2 - x; - m_move_what = move_value2; - return true; - } - } - else - { - xp1 = m_x1 - m_border_extra / 2.0; - xp2 = m_x2 + m_border_extra / 2.0; - ys1 = m_ys1 + (m_ys2 - m_ys1) * m_value1; - ys2 = m_ys1 + (m_ys2 - m_ys1) * m_value2; - xp = (m_xs1 + m_xs2) / 2.0; - - if(x > xp1 && y > ys1 && x < xp2 && y < ys2) - { - m_pdy = ys1 - y; - m_move_what = move_slider; - return true; - } - - //if(y < ys1 && calc_distance(x, y, xp, ys1) <= m_x2 - m_x1) - if(calc_distance(x, y, xp, ys1) <= m_x2 - m_x1) - { - m_pdy = ys1 - y; - m_move_what = move_value1; - return true; - } - - //if(y > ys2 && calc_distance(x, y, xp, ys2) <= m_x2 - m_x1) - if(calc_distance(x, y, xp, ys2) <= m_x2 - m_x1) - { - m_pdy = ys2 - y; - m_move_what = move_value2; - return true; - } - } - - return false; - } - - - //------------------------------------------------------------------------ - bool scale_ctrl_impl::on_mouse_move(double x, double y, bool button_flag) - { - inverse_transform_xy(&x, &y); - if(!button_flag) - { - return on_mouse_button_up(x, y); - } - - double xp = x + m_pdx; - double yp = y + m_pdy; - double dv; - - switch(m_move_what) - { - case move_value1: - if(fabs(m_x2 - m_x1) > fabs(m_y2 - m_y1)) - { - m_value1 = (xp - m_xs1) / (m_xs2 - m_xs1); - } - else - { - m_value1 = (yp - m_ys1) / (m_ys2 - m_ys1); - } - if(m_value1 < 0.0) m_value1 = 0.0; - if(m_value1 > m_value2 - m_min_d) m_value1 = m_value2 - m_min_d; - return true; - - case move_value2: - if(fabs(m_x2 - m_x1) > fabs(m_y2 - m_y1)) - { - m_value2 = (xp - m_xs1) / (m_xs2 - m_xs1); - } - else - { - m_value2 = (yp - m_ys1) / (m_ys2 - m_ys1); - } - if(m_value2 > 1.0) m_value2 = 1.0; - if(m_value2 < m_value1 + m_min_d) m_value2 = m_value1 + m_min_d; - return true; - - case move_slider: - dv = m_value2 - m_value1; - if(fabs(m_x2 - m_x1) > fabs(m_y2 - m_y1)) - { - m_value1 = (xp - m_xs1) / (m_xs2 - m_xs1); - } - else - { - m_value1 = (yp - m_ys1) / (m_ys2 - m_ys1); - } - m_value2 = m_value1 + dv; - if(m_value1 < 0.0) - { - dv = m_value2 - m_value1; - m_value1 = 0.0; - m_value2 = m_value1 + dv; - } - if(m_value2 > 1.0) - { - dv = m_value2 - m_value1; - m_value2 = 1.0; - m_value1 = m_value2 - dv; - } - return true; - } - - return false; - } - - - //------------------------------------------------------------------------ - bool scale_ctrl_impl::on_mouse_button_up(double, double) - { - m_move_what = move_nothing; - return false; - } - - - //------------------------------------------------------------------------ - bool scale_ctrl_impl::on_arrow_keys(bool left, bool right, bool down, bool up) - { -/* - if(right || up) - { - m_value += 0.005; - if(m_value > 1.0) m_value = 1.0; - return true; - } - - if(left || down) - { - m_value -= 0.005; - if(m_value < 0.0) m_value = 0.0; - return true; - } -*/ - return false; - } - -} - diff --git a/uppdev/agg24/agg_scale_ctrl.h b/uppdev/agg24/agg_scale_ctrl.h deleted file mode 100644 index b1e32c203..000000000 --- a/uppdev/agg24/agg_scale_ctrl.h +++ /dev/null @@ -1,146 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// classes scale_ctrl_impl, scale_ctrl -// -//---------------------------------------------------------------------------- - -#ifndef AGG_SCALE_CTRL_INCLUDED -#define AGG_SCALE_CTRL_INCLUDED - -#include "agg_basics.h" -#include "agg_math.h" -#include "agg_ellipse.h" -#include "agg_trans_affine.h" -#include "agg_color_rgba.h" -#include "agg_ctrl.h" - - -namespace agg -{ - - //------------------------------------------------------------------------ - class scale_ctrl_impl : public ctrl - { - enum move_e - { - move_nothing, - move_value1, - move_value2, - move_slider - }; - - public: - scale_ctrl_impl(double x1, double y1, double x2, double y2, bool flip_y=false); - - void border_thickness(double t, double extra=0.0); - void resize(double x1, double y1, double x2, double y2); - - double min_delta() const { return m_min_d; } - void min_delta(double d) { m_min_d = d; } - - double value1() const { return m_value1; } - void value1(double value); - - double value2() const { return m_value2; } - void value2(double value); - - void move(double d); - - virtual bool in_rect(double x, double y) const; - virtual bool on_mouse_button_down(double x, double y); - virtual bool on_mouse_button_up(double x, double y); - virtual bool on_mouse_move(double x, double y, bool button_flag); - virtual bool on_arrow_keys(bool left, bool right, bool down, bool up); - - // Vertex soutce interface - unsigned num_paths() { return 5; }; - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - void calc_box(); - - double m_border_thickness; - double m_border_extra; - double m_value1; - double m_value2; - double m_min_d; - double m_xs1; - double m_ys1; - double m_xs2; - double m_ys2; - double m_pdx; - double m_pdy; - move_e m_move_what; - double m_vx[32]; - double m_vy[32]; - - ellipse m_ellipse; - - unsigned m_idx; - unsigned m_vertex; - - }; - - - - //------------------------------------------------------------------------ - template class scale_ctrl : public scale_ctrl_impl - { - public: - scale_ctrl(double x1, double y1, double x2, double y2, bool flip_y=false) : - scale_ctrl_impl(x1, y1, x2, y2, flip_y), - m_background_color(rgba(1.0, 0.9, 0.8)), - m_border_color(rgba(0.0, 0.0, 0.0)), - m_pointers_color(rgba(0.8, 0.0, 0.0, 0.8)), - m_slider_color(rgba(0.2, 0.1, 0.0, 0.6)) - { - m_colors[0] = &m_background_color; - m_colors[1] = &m_border_color; - m_colors[2] = &m_pointers_color; - m_colors[3] = &m_pointers_color; - m_colors[4] = &m_slider_color; - } - - - void background_color(const ColorT& c) { m_background_color = c; } - void border_color(const ColorT& c) { m_border_color = c; } - void pointers_color(const ColorT& c) { m_pointers_color = c; } - void slider_color(const ColorT& c) { m_slider_color = c; } - - const ColorT& color(unsigned i) const { return *m_colors[i]; } - - private: - scale_ctrl(const scale_ctrl&); - const scale_ctrl& operator = (const scale_ctrl&); - - ColorT m_background_color; - ColorT m_border_color; - ColorT m_pointers_color; - ColorT m_slider_color; - ColorT* m_colors[5]; - }; - - - - - -} - - - -#endif - diff --git a/uppdev/agg24/agg_scanline_bin.h b/uppdev/agg24/agg_scanline_bin.h deleted file mode 100644 index 660292b61..000000000 --- a/uppdev/agg24/agg_scanline_bin.h +++ /dev/null @@ -1,264 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Class scanline_bin - binary scanline. -// -//---------------------------------------------------------------------------- -// -// Adaptation for 32-bit screen coordinates (scanline32_bin) has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- - -#ifndef AGG_SCANLINE_BIN_INCLUDED -#define AGG_SCANLINE_BIN_INCLUDED - -#include "agg_array.h" - -namespace agg -{ - - //=============================================================scanline_bin - // - // This is binary scaline container which supports the interface - // used in the rasterizer::render(). See description of agg_scanline_u8 - // for details. - // - //------------------------------------------------------------------------ - class scanline_bin - { - public: - typedef int32 coord_type; - - struct span - { - int16 x; - int16 len; - }; - - typedef const span* const_iterator; - - //-------------------------------------------------------------------- - scanline_bin() : - m_last_x(0x7FFFFFF0), - m_spans(), - m_cur_span(0) - { - } - - //-------------------------------------------------------------------- - void reset(int min_x, int max_x) - { - unsigned max_len = max_x - min_x + 3; - if(max_len > m_spans.size()) - { - m_spans.resize(max_len); - } - m_last_x = 0x7FFFFFF0; - m_cur_span = &m_spans[0]; - } - - //-------------------------------------------------------------------- - void add_cell(int x, unsigned) - { - if(x == m_last_x+1) - { - m_cur_span->len++; - } - else - { - ++m_cur_span; - m_cur_span->x = (int16)x; - m_cur_span->len = 1; - } - m_last_x = x; - } - - //-------------------------------------------------------------------- - void add_span(int x, unsigned len, unsigned) - { - if(x == m_last_x+1) - { - m_cur_span->len = (int16)(m_cur_span->len + len); - } - else - { - ++m_cur_span; - m_cur_span->x = (int16)x; - m_cur_span->len = (int16)len; - } - m_last_x = x + len - 1; - } - - //-------------------------------------------------------------------- - void add_cells(int x, unsigned len, const void*) - { - add_span(x, len, 0); - } - - //-------------------------------------------------------------------- - void finalize(int y) - { - m_y = y; - } - - //-------------------------------------------------------------------- - void reset_spans() - { - m_last_x = 0x7FFFFFF0; - m_cur_span = &m_spans[0]; - } - - //-------------------------------------------------------------------- - int y() const { return m_y; } - unsigned num_spans() const { return unsigned(m_cur_span - &m_spans[0]); } - const_iterator begin() const { return &m_spans[1]; } - - private: - scanline_bin(const scanline_bin&); - const scanline_bin operator = (const scanline_bin&); - - int m_last_x; - int m_y; - pod_array m_spans; - span* m_cur_span; - }; - - - - - - - //===========================================================scanline32_bin - class scanline32_bin - { - public: - typedef int32 coord_type; - - //-------------------------------------------------------------------- - struct span - { - span() {} - span(coord_type x_, coord_type len_) : x(x_), len(len_) {} - - coord_type x; - coord_type len; - }; - typedef pod_bvector span_array_type; - - - //-------------------------------------------------------------------- - class const_iterator - { - public: - const_iterator(const span_array_type& spans) : - m_spans(spans), - m_span_idx(0) - {} - - const span& operator*() const { return m_spans[m_span_idx]; } - const span* operator->() const { return &m_spans[m_span_idx]; } - - void operator ++ () { ++m_span_idx; } - - private: - const span_array_type& m_spans; - unsigned m_span_idx; - }; - - - //-------------------------------------------------------------------- - scanline32_bin() : m_max_len(0), m_last_x(0x7FFFFFF0) {} - - //-------------------------------------------------------------------- - void reset(int min_x, int max_x) - { - m_last_x = 0x7FFFFFF0; - m_spans.remove_all(); - } - - //-------------------------------------------------------------------- - void add_cell(int x, unsigned) - { - if(x == m_last_x+1) - { - m_spans.last().len++; - } - else - { - m_spans.add(span(coord_type(x), 1)); - } - m_last_x = x; - } - - //-------------------------------------------------------------------- - void add_span(int x, unsigned len, unsigned) - { - if(x == m_last_x+1) - { - m_spans.last().len += coord_type(len); - } - else - { - m_spans.add(span(coord_type(x), coord_type(len))); - } - m_last_x = x + len - 1; - } - - //-------------------------------------------------------------------- - void add_cells(int x, unsigned len, const void*) - { - add_span(x, len, 0); - } - - //-------------------------------------------------------------------- - void finalize(int y) - { - m_y = y; - } - - //-------------------------------------------------------------------- - void reset_spans() - { - m_last_x = 0x7FFFFFF0; - m_spans.remove_all(); - } - - //-------------------------------------------------------------------- - int y() const { return m_y; } - unsigned num_spans() const { return m_spans.size(); } - const_iterator begin() const { return const_iterator(m_spans); } - - private: - scanline32_bin(const scanline32_bin&); - const scanline32_bin operator = (const scanline32_bin&); - - unsigned m_max_len; - int m_last_x; - int m_y; - span_array_type m_spans; - }; - - - - - -} - - -#endif diff --git a/uppdev/agg24/agg_scanline_boolean_algebra.h b/uppdev/agg24/agg_scanline_boolean_algebra.h deleted file mode 100644 index bc2e9c9d5..000000000 --- a/uppdev/agg24/agg_scanline_boolean_algebra.h +++ /dev/null @@ -1,1567 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_SCANLINE_BOOLEAN_ALGEBRA_INCLUDED -#define AGG_SCANLINE_BOOLEAN_ALGEBRA_INCLUDED - -#include -#include -#include "agg_basics.h" - - -namespace agg -{ - - //-----------------------------------------------sbool_combine_spans_bin - // Functor. - // Combine two binary encoded spans, i.e., when we don't have any - // anti-aliasing information, but only X and Length. The function - // is compatible with any type of scanlines. - //---------------- - template - struct sbool_combine_spans_bin - { - void operator () (const typename Scanline1::const_iterator&, - const typename Scanline2::const_iterator&, - int x, unsigned len, - Scanline& sl) const - { - sl.add_span(x, len, cover_full); - } - }; - - - - //---------------------------------------------sbool_combine_spans_empty - // Functor. - // Combine two spans as empty ones. The functor does nothing - // and is used to XOR binary spans. - //---------------- - template - struct sbool_combine_spans_empty - { - void operator () (const typename Scanline1::const_iterator&, - const typename Scanline2::const_iterator&, - int, unsigned, - Scanline&) const - {} - }; - - - - //--------------------------------------------------sbool_add_span_empty - // Functor. - // Add nothing. Used in conbine_shapes_sub - //---------------- - template - struct sbool_add_span_empty - { - void operator () (const typename Scanline1::const_iterator&, - int, unsigned, - Scanline&) const - {} - }; - - - //----------------------------------------------------sbool_add_span_bin - // Functor. - // Add a binary span - //---------------- - template - struct sbool_add_span_bin - { - void operator () (const typename Scanline1::const_iterator&, - int x, unsigned len, - Scanline& sl) const - { - sl.add_span(x, len, cover_full); - } - }; - - - - - //-----------------------------------------------------sbool_add_span_aa - // Functor. - // Add an anti-aliased span - // anti-aliasing information, but only X and Length. The function - // is compatible with any type of scanlines. - //---------------- - template - struct sbool_add_span_aa - { - void operator () (const typename Scanline1::const_iterator& span, - int x, unsigned len, - Scanline& sl) const - { - if(span->len < 0) - { - sl.add_span(x, len, *span->covers); - } - else - if(span->len > 0) - { - const typename Scanline1::cover_type* covers = span->covers; - if(span->x < x) covers += x - span->x; - sl.add_cells(x, len, covers); - } - } - }; - - - - - //----------------------------------------------sbool_intersect_spans_aa - // Functor. - // Intersect two spans preserving the anti-aliasing information. - // The result is added to the "sl" scanline. - //------------------ - template - struct sbool_intersect_spans_aa - { - enum cover_scale_e - { - cover_shift = CoverShift, - cover_size = 1 << cover_shift, - cover_mask = cover_size - 1, - cover_full = cover_mask - }; - - - void operator () (const typename Scanline1::const_iterator& span1, - const typename Scanline2::const_iterator& span2, - int x, unsigned len, - Scanline& sl) const - { - unsigned cover; - const typename Scanline1::cover_type* covers1; - const typename Scanline2::cover_type* covers2; - - // Calculate the operation code and choose the - // proper combination algorithm. - // 0 = Both spans are of AA type - // 1 = span1 is solid, span2 is AA - // 2 = span1 is AA, span2 is solid - // 3 = Both spans are of solid type - //----------------- - switch((span1->len < 0) | ((span2->len < 0) << 1)) - { - case 0: // Both are AA spans - covers1 = span1->covers; - covers2 = span2->covers; - if(span1->x < x) covers1 += x - span1->x; - if(span2->x < x) covers2 += x - span2->x; - do - { - cover = *covers1++ * *covers2++; - sl.add_cell(x++, - (cover == cover_full * cover_full) ? - cover_full : - (cover >> cover_shift)); - } - while(--len); - break; - - case 1: // span1 is solid, span2 is AA - covers2 = span2->covers; - if(span2->x < x) covers2 += x - span2->x; - if(*(span1->covers) == cover_full) - { - sl.add_cells(x, len, covers2); - } - else - { - do - { - cover = *(span1->covers) * *covers2++; - sl.add_cell(x++, - (cover == cover_full * cover_full) ? - cover_full : - (cover >> cover_shift)); - } - while(--len); - } - break; - - case 2: // span1 is AA, span2 is solid - covers1 = span1->covers; - if(span1->x < x) covers1 += x - span1->x; - if(*(span2->covers) == cover_full) - { - sl.add_cells(x, len, covers1); - } - else - { - do - { - cover = *covers1++ * *(span2->covers); - sl.add_cell(x++, - (cover == cover_full * cover_full) ? - cover_full : - (cover >> cover_shift)); - } - while(--len); - } - break; - - case 3: // Both are solid spans - cover = *(span1->covers) * *(span2->covers); - sl.add_span(x, len, - (cover == cover_full * cover_full) ? - cover_full : - (cover >> cover_shift)); - break; - } - } - }; - - - - - - - //--------------------------------------------------sbool_unite_spans_aa - // Functor. - // Unite two spans preserving the anti-aliasing information. - // The result is added to the "sl" scanline. - //------------------ - template - struct sbool_unite_spans_aa - { - enum cover_scale_e - { - cover_shift = CoverShift, - cover_size = 1 << cover_shift, - cover_mask = cover_size - 1, - cover_full = cover_mask - }; - - - void operator () (const typename Scanline1::const_iterator& span1, - const typename Scanline2::const_iterator& span2, - int x, unsigned len, - Scanline& sl) const - { - unsigned cover; - const typename Scanline1::cover_type* covers1; - const typename Scanline2::cover_type* covers2; - - // Calculate the operation code and choose the - // proper combination algorithm. - // 0 = Both spans are of AA type - // 1 = span1 is solid, span2 is AA - // 2 = span1 is AA, span2 is solid - // 3 = Both spans are of solid type - //----------------- - switch((span1->len < 0) | ((span2->len < 0) << 1)) - { - case 0: // Both are AA spans - covers1 = span1->covers; - covers2 = span2->covers; - if(span1->x < x) covers1 += x - span1->x; - if(span2->x < x) covers2 += x - span2->x; - do - { - cover = cover_mask * cover_mask - - (cover_mask - *covers1++) * - (cover_mask - *covers2++); - sl.add_cell(x++, - (cover == cover_full * cover_full) ? - cover_full : - (cover >> cover_shift)); - } - while(--len); - break; - - case 1: // span1 is solid, span2 is AA - covers2 = span2->covers; - if(span2->x < x) covers2 += x - span2->x; - if(*(span1->covers) == cover_full) - { - sl.add_span(x, len, cover_full); - } - else - { - do - { - cover = cover_mask * cover_mask - - (cover_mask - *(span1->covers)) * - (cover_mask - *covers2++); - sl.add_cell(x++, - (cover == cover_full * cover_full) ? - cover_full : - (cover >> cover_shift)); - } - while(--len); - } - break; - - case 2: // span1 is AA, span2 is solid - covers1 = span1->covers; - if(span1->x < x) covers1 += x - span1->x; - if(*(span2->covers) == cover_full) - { - sl.add_span(x, len, cover_full); - } - else - { - do - { - cover = cover_mask * cover_mask - - (cover_mask - *covers1++) * - (cover_mask - *(span2->covers)); - sl.add_cell(x++, - (cover == cover_full * cover_full) ? - cover_full : - (cover >> cover_shift)); - } - while(--len); - } - break; - - case 3: // Both are solid spans - cover = cover_mask * cover_mask - - (cover_mask - *(span1->covers)) * - (cover_mask - *(span2->covers)); - sl.add_span(x, len, - (cover == cover_full * cover_full) ? - cover_full : - (cover >> cover_shift)); - break; - } - } - }; - - - //---------------------------------------------sbool_xor_formula_linear - template - struct sbool_xor_formula_linear - { - enum cover_scale_e - { - cover_shift = CoverShift, - cover_size = 1 << cover_shift, - cover_mask = cover_size - 1 - }; - - static AGG_INLINE unsigned calculate(unsigned a, unsigned b) - { - unsigned cover = a + b; - if(cover > cover_mask) cover = cover_mask + cover_mask - cover; - return cover; - } - }; - - - //---------------------------------------------sbool_xor_formula_saddle - template - struct sbool_xor_formula_saddle - { - enum cover_scale_e - { - cover_shift = CoverShift, - cover_size = 1 << cover_shift, - cover_mask = cover_size - 1 - }; - - static AGG_INLINE unsigned calculate(unsigned a, unsigned b) - { - unsigned k = a * b; - if(k == cover_mask * cover_mask) return 0; - - a = (cover_mask * cover_mask - (a << cover_shift) + k) >> cover_shift; - b = (cover_mask * cover_mask - (b << cover_shift) + k) >> cover_shift; - return cover_mask - ((a * b) >> cover_shift); - } - }; - - - //-------------------------------------------sbool_xor_formula_abs_diff - struct sbool_xor_formula_abs_diff - { - static AGG_INLINE unsigned calculate(unsigned a, unsigned b) - { - return unsigned(abs(int(a) - int(b))); - } - }; - - - - //----------------------------------------------------sbool_xor_spans_aa - // Functor. - // XOR two spans preserving the anti-aliasing information. - // The result is added to the "sl" scanline. - //------------------ - template - struct sbool_xor_spans_aa - { - enum cover_scale_e - { - cover_shift = CoverShift, - cover_size = 1 << cover_shift, - cover_mask = cover_size - 1, - cover_full = cover_mask - }; - - - void operator () (const typename Scanline1::const_iterator& span1, - const typename Scanline2::const_iterator& span2, - int x, unsigned len, - Scanline& sl) const - { - unsigned cover; - const typename Scanline1::cover_type* covers1; - const typename Scanline2::cover_type* covers2; - - // Calculate the operation code and choose the - // proper combination algorithm. - // 0 = Both spans are of AA type - // 1 = span1 is solid, span2 is AA - // 2 = span1 is AA, span2 is solid - // 3 = Both spans are of solid type - //----------------- - switch((span1->len < 0) | ((span2->len < 0) << 1)) - { - case 0: // Both are AA spans - covers1 = span1->covers; - covers2 = span2->covers; - if(span1->x < x) covers1 += x - span1->x; - if(span2->x < x) covers2 += x - span2->x; - do - { - cover = XorFormula::calculate(*covers1++, *covers2++); - if(cover) sl.add_cell(x, cover); - ++x; - } - while(--len); - break; - - case 1: // span1 is solid, span2 is AA - covers2 = span2->covers; - if(span2->x < x) covers2 += x - span2->x; - do - { - cover = XorFormula::calculate(*(span1->covers), *covers2++); - if(cover) sl.add_cell(x, cover); - ++x; - } - while(--len); - break; - - case 2: // span1 is AA, span2 is solid - covers1 = span1->covers; - if(span1->x < x) covers1 += x - span1->x; - do - { - cover = XorFormula::calculate(*covers1++, *(span2->covers)); - if(cover) sl.add_cell(x, cover); - ++x; - } - while(--len); - break; - - case 3: // Both are solid spans - cover = XorFormula::calculate(*(span1->covers), *(span2->covers)); - if(cover) sl.add_span(x, len, cover); - break; - - } - } - }; - - - - - - //-----------------------------------------------sbool_subtract_spans_aa - // Functor. - // Unite two spans preserving the anti-aliasing information. - // The result is added to the "sl" scanline. - //------------------ - template - struct sbool_subtract_spans_aa - { - enum cover_scale_e - { - cover_shift = CoverShift, - cover_size = 1 << cover_shift, - cover_mask = cover_size - 1, - cover_full = cover_mask - }; - - - void operator () (const typename Scanline1::const_iterator& span1, - const typename Scanline2::const_iterator& span2, - int x, unsigned len, - Scanline& sl) const - { - unsigned cover; - const typename Scanline1::cover_type* covers1; - const typename Scanline2::cover_type* covers2; - - // Calculate the operation code and choose the - // proper combination algorithm. - // 0 = Both spans are of AA type - // 1 = span1 is solid, span2 is AA - // 2 = span1 is AA, span2 is solid - // 3 = Both spans are of solid type - //----------------- - switch((span1->len < 0) | ((span2->len < 0) << 1)) - { - case 0: // Both are AA spans - covers1 = span1->covers; - covers2 = span2->covers; - if(span1->x < x) covers1 += x - span1->x; - if(span2->x < x) covers2 += x - span2->x; - do - { - cover = *covers1++ * (cover_mask - *covers2++); - if(cover) - { - sl.add_cell(x, - (cover == cover_full * cover_full) ? - cover_full : - (cover >> cover_shift)); - } - ++x; - } - while(--len); - break; - - case 1: // span1 is solid, span2 is AA - covers2 = span2->covers; - if(span2->x < x) covers2 += x - span2->x; - do - { - cover = *(span1->covers) * (cover_mask - *covers2++); - if(cover) - { - sl.add_cell(x, - (cover == cover_full * cover_full) ? - cover_full : - (cover >> cover_shift)); - } - ++x; - } - while(--len); - break; - - case 2: // span1 is AA, span2 is solid - covers1 = span1->covers; - if(span1->x < x) covers1 += x - span1->x; - if(*(span2->covers) != cover_full) - { - do - { - cover = *covers1++ * (cover_mask - *(span2->covers)); - if(cover) - { - sl.add_cell(x, - (cover == cover_full * cover_full) ? - cover_full : - (cover >> cover_shift)); - } - ++x; - } - while(--len); - } - break; - - case 3: // Both are solid spans - cover = *(span1->covers) * (cover_mask - *(span2->covers)); - if(cover) - { - sl.add_span(x, len, - (cover == cover_full * cover_full) ? - cover_full : - (cover >> cover_shift)); - } - break; - } - } - }; - - - - - - - //--------------------------------------------sbool_add_spans_and_render - template - void sbool_add_spans_and_render(const Scanline1& sl1, - Scanline& sl, - Renderer& ren, - AddSpanFunctor add_span) - { - sl.reset_spans(); - typename Scanline1::const_iterator span = sl1.begin(); - unsigned num_spans = sl1.num_spans(); - for(;;) - { - add_span(span, span->x, abs((int)span->len), sl); - if(--num_spans == 0) break; - ++span; - } - sl.finalize(sl1.y()); - ren.render(sl); - } - - - - - - - - //---------------------------------------------sbool_intersect_scanlines - // Intersect two scanlines, "sl1" and "sl2" and generate a new "sl" one. - // The combine_spans functor can be of type sbool_combine_spans_bin or - // sbool_intersect_spans_aa. First is a general functor to combine - // two spans without Anti-Aliasing, the second preserves the AA - // information, but works slower - // - template - void sbool_intersect_scanlines(const Scanline1& sl1, - const Scanline2& sl2, - Scanline& sl, - CombineSpansFunctor combine_spans) - { - sl.reset_spans(); - - unsigned num1 = sl1.num_spans(); - if(num1 == 0) return; - - unsigned num2 = sl2.num_spans(); - if(num2 == 0) return; - - typename Scanline1::const_iterator span1 = sl1.begin(); - typename Scanline2::const_iterator span2 = sl2.begin(); - - while(num1 && num2) - { - int xb1 = span1->x; - int xb2 = span2->x; - int xe1 = xb1 + abs((int)span1->len) - 1; - int xe2 = xb2 + abs((int)span2->len) - 1; - - // Determine what spans we should advance in the next step - // The span with the least ending X should be advanced - // advance_both is just an optimization when we ending - // coordinates are the same and we can advance both - //-------------- - bool advance_span1 = xe1 < xe2; - bool advance_both = xe1 == xe2; - - // Find the intersection of the spans - // and check if they intersect - //-------------- - if(xb1 < xb2) xb1 = xb2; - if(xe1 > xe2) xe1 = xe2; - if(xb1 <= xe1) - { - combine_spans(span1, span2, xb1, xe1 - xb1 + 1, sl); - } - - // Advance the spans - //-------------- - if(advance_both) - { - --num1; - --num2; - if(num1) ++span1; - if(num2) ++span2; - } - else - { - if(advance_span1) - { - --num1; - if(num1) ++span1; - } - else - { - --num2; - if(num2) ++span2; - } - } - } - } - - - - - - - - - //------------------------------------------------sbool_intersect_shapes - // Intersect the scanline shapes. Here the "Scanline Generator" - // abstraction is used. ScanlineGen1 and ScanlineGen2 are - // the generators, and can be of type rasterizer_scanline_aa<>. - // There function requires three scanline containers that can be of - // different types. - // "sl1" and "sl2" are used to retrieve scanlines from the generators, - // "sl" is ised as the resulting scanline to render it. - // The external "sl1" and "sl2" are used only for the sake of - // optimization and reusing of the scanline objects. - // the function calls sbool_intersect_scanlines with CombineSpansFunctor - // as the last argument. See sbool_intersect_scanlines for details. - //---------- - template - void sbool_intersect_shapes(ScanlineGen1& sg1, ScanlineGen2& sg2, - Scanline1& sl1, Scanline2& sl2, - Scanline& sl, Renderer& ren, - CombineSpansFunctor combine_spans) - { - // Prepare the scanline generators. - // If anyone of them doesn't contain - // any scanlines, then return. - //----------------- - if(!sg1.rewind_scanlines()) return; - if(!sg2.rewind_scanlines()) return; - - // Get the bounding boxes - //---------------- - rect_i r1(sg1.min_x(), sg1.min_y(), sg1.max_x(), sg1.max_y()); - rect_i r2(sg2.min_x(), sg2.min_y(), sg2.max_x(), sg2.max_y()); - - // Calculate the intersection of the bounding - // boxes and return if they don't intersect. - //----------------- - rect_i ir = intersect_rectangles(r1, r2); - if(!ir.is_valid()) return; - - // Reset the scanlines and get two first ones - //----------------- - sl.reset(ir.x1, ir.x2); - sl1.reset(sg1.min_x(), sg1.max_x()); - sl2.reset(sg2.min_x(), sg2.max_x()); - if(!sg1.sweep_scanline(sl1)) return; - if(!sg2.sweep_scanline(sl2)) return; - - ren.prepare(); - - // The main loop - // Here we synchronize the scanlines with - // the same Y coordinate, ignoring all other ones. - // Only scanlines having the same Y-coordinate - // are to be combined. - //----------------- - for(;;) - { - while(sl1.y() < sl2.y()) - { - if(!sg1.sweep_scanline(sl1)) return; - } - while(sl2.y() < sl1.y()) - { - if(!sg2.sweep_scanline(sl2)) return; - } - - if(sl1.y() == sl2.y()) - { - // The Y coordinates are the same. - // Combine the scanlines, render if they contain any spans, - // and advance both generators to the next scanlines - //---------------------- - sbool_intersect_scanlines(sl1, sl2, sl, combine_spans); - if(sl.num_spans()) - { - sl.finalize(sl1.y()); - ren.render(sl); - } - if(!sg1.sweep_scanline(sl1)) return; - if(!sg2.sweep_scanline(sl2)) return; - } - } - } - - - - - - - - //-------------------------------------------------sbool_unite_scanlines - // Unite two scanlines, "sl1" and "sl2" and generate a new "sl" one. - // The combine_spans functor can be of type sbool_combine_spans_bin or - // sbool_intersect_spans_aa. First is a general functor to combine - // two spans without Anti-Aliasing, the second preserves the AA - // information, but works slower - // - template - void sbool_unite_scanlines(const Scanline1& sl1, - const Scanline2& sl2, - Scanline& sl, - AddSpanFunctor1 add_span1, - AddSpanFunctor2 add_span2, - CombineSpansFunctor combine_spans) - { - sl.reset_spans(); - - unsigned num1 = sl1.num_spans(); - unsigned num2 = sl2.num_spans(); - - typename Scanline1::const_iterator span1;// = sl1.begin(); - typename Scanline2::const_iterator span2;// = sl2.begin(); - - enum invalidation_e - { - invalid_b = 0xFFFFFFF, - invalid_e = invalid_b - 1 - }; - - // Initialize the spans as invalid - //--------------- - int xb1 = invalid_b; - int xb2 = invalid_b; - int xe1 = invalid_e; - int xe2 = invalid_e; - - // Initialize span1 if there are spans - //--------------- - if(num1) - { - span1 = sl1.begin(); - xb1 = span1->x; - xe1 = xb1 + abs((int)span1->len) - 1; - --num1; - } - - // Initialize span2 if there are spans - //--------------- - if(num2) - { - span2 = sl2.begin(); - xb2 = span2->x; - xe2 = xb2 + abs((int)span2->len) - 1; - --num2; - } - - - for(;;) - { - // Retrieve a new span1 if it's invalid - //---------------- - if(num1 && xb1 > xe1) - { - --num1; - ++span1; - xb1 = span1->x; - xe1 = xb1 + abs((int)span1->len) - 1; - } - - // Retrieve a new span2 if it's invalid - //---------------- - if(num2 && xb2 > xe2) - { - --num2; - ++span2; - xb2 = span2->x; - xe2 = xb2 + abs((int)span2->len) - 1; - } - - if(xb1 > xe1 && xb2 > xe2) break; - - // Calculate the intersection - //---------------- - int xb = xb1; - int xe = xe1; - if(xb < xb2) xb = xb2; - if(xe > xe2) xe = xe2; - int len = xe - xb + 1; // The length of the intersection - if(len > 0) - { - // The spans intersect, - // add the beginning of the span - //---------------- - if(xb1 < xb2) - { - add_span1(span1, xb1, xb2 - xb1, sl); - xb1 = xb2; - } - else - if(xb2 < xb1) - { - add_span2(span2, xb2, xb1 - xb2, sl); - xb2 = xb1; - } - - // Add the combination part of the spans - //---------------- - combine_spans(span1, span2, xb, len, sl); - - - // Invalidate the fully processed span or both - //---------------- - if(xe1 < xe2) - { - // Invalidate span1 and eat - // the processed part of span2 - //-------------- - xb1 = invalid_b; - xe1 = invalid_e; - xb2 += len; - } - else - if(xe2 < xe1) - { - // Invalidate span2 and eat - // the processed part of span1 - //-------------- - xb2 = invalid_b; - xe2 = invalid_e; - xb1 += len; - } - else - { - xb1 = invalid_b; // Invalidate both - xb2 = invalid_b; - xe1 = invalid_e; - xe2 = invalid_e; - } - } - else - { - // The spans do not intersect - //-------------- - if(xb1 < xb2) - { - // Advance span1 - //--------------- - if(xb1 <= xe1) - { - add_span1(span1, xb1, xe1 - xb1 + 1, sl); - } - xb1 = invalid_b; // Invalidate - xe1 = invalid_e; - } - else - { - // Advance span2 - //--------------- - if(xb2 <= xe2) - { - add_span2(span2, xb2, xe2 - xb2 + 1, sl); - } - xb2 = invalid_b; // Invalidate - xe2 = invalid_e; - } - } - } - } - - - - - //----------------------------------------------------sbool_unite_shapes - // Unite the scanline shapes. Here the "Scanline Generator" - // abstraction is used. ScanlineGen1 and ScanlineGen2 are - // the generators, and can be of type rasterizer_scanline_aa<>. - // There function requires three scanline containers that can be - // of different type. - // "sl1" and "sl2" are used to retrieve scanlines from the generators, - // "sl" is ised as the resulting scanline to render it. - // The external "sl1" and "sl2" are used only for the sake of - // optimization and reusing of the scanline objects. - // the function calls sbool_unite_scanlines with CombineSpansFunctor - // as the last argument. See sbool_unite_scanlines for details. - //---------- - template - void sbool_unite_shapes(ScanlineGen1& sg1, ScanlineGen2& sg2, - Scanline1& sl1, Scanline2& sl2, - Scanline& sl, Renderer& ren, - AddSpanFunctor1 add_span1, - AddSpanFunctor2 add_span2, - CombineSpansFunctor combine_spans) - { - // Prepare the scanline generators. - // If anyone of them doesn't contain - // any scanlines, then return. - //----------------- - bool flag1 = sg1.rewind_scanlines(); - bool flag2 = sg2.rewind_scanlines(); - if(!flag1 && !flag2) return; - - // Get the bounding boxes - //---------------- - rect_i r1(sg1.min_x(), sg1.min_y(), sg1.max_x(), sg1.max_y()); - rect_i r2(sg2.min_x(), sg2.min_y(), sg2.max_x(), sg2.max_y()); - - // Calculate the union of the bounding boxes - //----------------- - rect_i ur(1,1,0,0); - if(flag1 && flag2) ur = unite_rectangles(r1, r2); - else if(flag1) ur = r1; - else if(flag2) ur = r2; - - if(!ur.is_valid()) return; - - ren.prepare(); - - // Reset the scanlines and get two first ones - //----------------- - sl.reset(ur.x1, ur.x2); - if(flag1) - { - sl1.reset(sg1.min_x(), sg1.max_x()); - flag1 = sg1.sweep_scanline(sl1); - } - - if(flag2) - { - sl2.reset(sg2.min_x(), sg2.max_x()); - flag2 = sg2.sweep_scanline(sl2); - } - - // The main loop - // Here we synchronize the scanlines with - // the same Y coordinate. - //----------------- - while(flag1 || flag2) - { - if(flag1 && flag2) - { - if(sl1.y() == sl2.y()) - { - // The Y coordinates are the same. - // Combine the scanlines, render if they contain any spans, - // and advance both generators to the next scanlines - //---------------------- - sbool_unite_scanlines(sl1, sl2, sl, - add_span1, add_span2, combine_spans); - if(sl.num_spans()) - { - sl.finalize(sl1.y()); - ren.render(sl); - } - flag1 = sg1.sweep_scanline(sl1); - flag2 = sg2.sweep_scanline(sl2); - } - else - { - if(sl1.y() < sl2.y()) - { - sbool_add_spans_and_render(sl1, sl, ren, add_span1); - flag1 = sg1.sweep_scanline(sl1); - } - else - { - sbool_add_spans_and_render(sl2, sl, ren, add_span2); - flag2 = sg2.sweep_scanline(sl2); - } - } - } - else - { - if(flag1) - { - sbool_add_spans_and_render(sl1, sl, ren, add_span1); - flag1 = sg1.sweep_scanline(sl1); - } - if(flag2) - { - sbool_add_spans_and_render(sl2, sl, ren, add_span2); - flag2 = sg2.sweep_scanline(sl2); - } - } - } - } - - - - - - - - - //-------------------------------------------------sbool_subtract_shapes - // Subtract the scanline shapes, "sg1-sg2". Here the "Scanline Generator" - // abstraction is used. ScanlineGen1 and ScanlineGen2 are - // the generators, and can be of type rasterizer_scanline_aa<>. - // There function requires three scanline containers that can be of - // different types. - // "sl1" and "sl2" are used to retrieve scanlines from the generators, - // "sl" is ised as the resulting scanline to render it. - // The external "sl1" and "sl2" are used only for the sake of - // optimization and reusing of the scanline objects. - // the function calls sbool_intersect_scanlines with CombineSpansFunctor - // as the last argument. See combine_scanlines_sub for details. - //---------- - template - void sbool_subtract_shapes(ScanlineGen1& sg1, ScanlineGen2& sg2, - Scanline1& sl1, Scanline2& sl2, - Scanline& sl, Renderer& ren, - AddSpanFunctor1 add_span1, - CombineSpansFunctor combine_spans) - { - // Prepare the scanline generators. - // Here "sg1" is master, "sg2" is slave. - //----------------- - if(!sg1.rewind_scanlines()) return; - bool flag2 = sg2.rewind_scanlines(); - - // Get the bounding box - //---------------- - rect_i r1(sg1.min_x(), sg1.min_y(), sg1.max_x(), sg1.max_y()); - - // Reset the scanlines and get two first ones - //----------------- - sl.reset(sg1.min_x(), sg1.max_x()); - sl1.reset(sg1.min_x(), sg1.max_x()); - sl2.reset(sg2.min_x(), sg2.max_x()); - if(!sg1.sweep_scanline(sl1)) return; - - if(flag2) flag2 = sg2.sweep_scanline(sl2); - - ren.prepare(); - - // A fake span2 processor - sbool_add_span_empty add_span2; - - // The main loop - // Here we synchronize the scanlines with - // the same Y coordinate, ignoring all other ones. - // Only scanlines having the same Y-coordinate - // are to be combined. - //----------------- - bool flag1 = true; - do - { - // Synchronize "slave" with "master" - //----------------- - while(flag2 && sl2.y() < sl1.y()) - { - flag2 = sg2.sweep_scanline(sl2); - } - - - if(flag2 && sl2.y() == sl1.y()) - { - // The Y coordinates are the same. - // Combine the scanlines and render if they contain any spans. - //---------------------- - sbool_unite_scanlines(sl1, sl2, sl, add_span1, add_span2, combine_spans); - if(sl.num_spans()) - { - sl.finalize(sl1.y()); - ren.render(sl); - } - } - else - { - sbool_add_spans_and_render(sl1, sl, ren, add_span1); - } - - // Advance the "master" - flag1 = sg1.sweep_scanline(sl1); - } - while(flag1); - } - - - - - - - - //---------------------------------------------sbool_intersect_shapes_aa - // Intersect two anti-aliased scanline shapes. - // Here the "Scanline Generator" abstraction is used. - // ScanlineGen1 and ScanlineGen2 are the generators, and can be of - // type rasterizer_scanline_aa<>. There function requires three - // scanline containers that can be of different types. - // "sl1" and "sl2" are used to retrieve scanlines from the generators, - // "sl" is ised as the resulting scanline to render it. - // The external "sl1" and "sl2" are used only for the sake of - // optimization and reusing of the scanline objects. - //---------- - template - void sbool_intersect_shapes_aa(ScanlineGen1& sg1, ScanlineGen2& sg2, - Scanline1& sl1, Scanline2& sl2, - Scanline& sl, Renderer& ren) - { - sbool_intersect_spans_aa combine_functor; - sbool_intersect_shapes(sg1, sg2, sl1, sl2, sl, ren, combine_functor); - } - - - - - - //--------------------------------------------sbool_intersect_shapes_bin - // Intersect two binary scanline shapes (without anti-aliasing). - // See intersect_shapes_aa for more comments - //---------- - template - void sbool_intersect_shapes_bin(ScanlineGen1& sg1, ScanlineGen2& sg2, - Scanline1& sl1, Scanline2& sl2, - Scanline& sl, Renderer& ren) - { - sbool_combine_spans_bin combine_functor; - sbool_intersect_shapes(sg1, sg2, sl1, sl2, sl, ren, combine_functor); - } - - - - - - //-------------------------------------------------sbool_unite_shapes_aa - // Unite two anti-aliased scanline shapes - // See intersect_shapes_aa for more comments - //---------- - template - void sbool_unite_shapes_aa(ScanlineGen1& sg1, ScanlineGen2& sg2, - Scanline1& sl1, Scanline2& sl2, - Scanline& sl, Renderer& ren) - { - sbool_add_span_aa add_functor1; - sbool_add_span_aa add_functor2; - sbool_unite_spans_aa combine_functor; - sbool_unite_shapes(sg1, sg2, sl1, sl2, sl, ren, - add_functor1, add_functor2, combine_functor); - } - - - - - - //------------------------------------------------sbool_unite_shapes_bin - // Unite two binary scanline shapes (without anti-aliasing). - // See intersect_shapes_aa for more comments - //---------- - template - void sbool_unite_shapes_bin(ScanlineGen1& sg1, ScanlineGen2& sg2, - Scanline1& sl1, Scanline2& sl2, - Scanline& sl, Renderer& ren) - { - sbool_add_span_bin add_functor1; - sbool_add_span_bin add_functor2; - sbool_combine_spans_bin combine_functor; - sbool_unite_shapes(sg1, sg2, sl1, sl2, sl, ren, - add_functor1, add_functor2, combine_functor); - } - - - - - - - - - - //---------------------------------------------------sbool_xor_shapes_aa - // Apply eXclusive OR to two anti-aliased scanline shapes. There's - // a modified "Linear" XOR used instead of classical "Saddle" one. - // The reason is to have the result absolutely conststent with what - // the scanline rasterizer produces. - // See intersect_shapes_aa for more comments - //---------- - template - void sbool_xor_shapes_aa(ScanlineGen1& sg1, ScanlineGen2& sg2, - Scanline1& sl1, Scanline2& sl2, - Scanline& sl, Renderer& ren) - { - sbool_add_span_aa add_functor1; - sbool_add_span_aa add_functor2; - sbool_xor_spans_aa > combine_functor; - sbool_unite_shapes(sg1, sg2, sl1, sl2, sl, ren, - add_functor1, add_functor2, combine_functor); - } - - - - //------------------------------------------sbool_xor_shapes_saddle_aa - // Apply eXclusive OR to two anti-aliased scanline shapes. - // There's the classical "Saddle" used to calculate the - // Anti-Aliasing values, that is: - // a XOR b : 1-((1-a+a*b)*(1-b+a*b)) - // See intersect_shapes_aa for more comments - //---------- - template - void sbool_xor_shapes_saddle_aa(ScanlineGen1& sg1, ScanlineGen2& sg2, - Scanline1& sl1, Scanline2& sl2, - Scanline& sl, Renderer& ren) - { - sbool_add_span_aa add_functor1; - sbool_add_span_aa add_functor2; - sbool_xor_spans_aa > combine_functor; - sbool_unite_shapes(sg1, sg2, sl1, sl2, sl, ren, - add_functor1, add_functor2, combine_functor); - } - - - //--------------------------------------sbool_xor_shapes_abs_diff_aa - // Apply eXclusive OR to two anti-aliased scanline shapes. - // There's the absolute difference used to calculate - // Anti-Aliasing values, that is: - // a XOR b : abs(a-b) - // See intersect_shapes_aa for more comments - //---------- - template - void sbool_xor_shapes_abs_diff_aa(ScanlineGen1& sg1, ScanlineGen2& sg2, - Scanline1& sl1, Scanline2& sl2, - Scanline& sl, Renderer& ren) - { - sbool_add_span_aa add_functor1; - sbool_add_span_aa add_functor2; - sbool_xor_spans_aa combine_functor; - sbool_unite_shapes(sg1, sg2, sl1, sl2, sl, ren, - add_functor1, add_functor2, combine_functor); - } - - - - //--------------------------------------------------sbool_xor_shapes_bin - // Apply eXclusive OR to two binary scanline shapes (without anti-aliasing). - // See intersect_shapes_aa for more comments - //---------- - template - void sbool_xor_shapes_bin(ScanlineGen1& sg1, ScanlineGen2& sg2, - Scanline1& sl1, Scanline2& sl2, - Scanline& sl, Renderer& ren) - { - sbool_add_span_bin add_functor1; - sbool_add_span_bin add_functor2; - sbool_combine_spans_empty combine_functor; - sbool_unite_shapes(sg1, sg2, sl1, sl2, sl, ren, - add_functor1, add_functor2, combine_functor); - } - - - - - - - //----------------------------------------------sbool_subtract_shapes_aa - // Subtract shapes "sg1-sg2" with anti-aliasing - // See intersect_shapes_aa for more comments - //---------- - template - void sbool_subtract_shapes_aa(ScanlineGen1& sg1, ScanlineGen2& sg2, - Scanline1& sl1, Scanline2& sl2, - Scanline& sl, Renderer& ren) - { - sbool_add_span_aa add_functor; - sbool_subtract_spans_aa combine_functor; - sbool_subtract_shapes(sg1, sg2, sl1, sl2, sl, ren, - add_functor, combine_functor); - } - - - - - - //---------------------------------------------sbool_subtract_shapes_bin - // Subtract binary shapes "sg1-sg2" without anti-aliasing - // See intersect_shapes_aa for more comments - //---------- - template - void sbool_subtract_shapes_bin(ScanlineGen1& sg1, ScanlineGen2& sg2, - Scanline1& sl1, Scanline2& sl2, - Scanline& sl, Renderer& ren) - { - sbool_add_span_bin add_functor; - sbool_combine_spans_empty combine_functor; - sbool_subtract_shapes(sg1, sg2, sl1, sl2, sl, ren, - add_functor, combine_functor); - } - - - - - - - //------------------------------------------------------------sbool_op_e - enum sbool_op_e - { - sbool_or, //----sbool_or - sbool_and, //----sbool_and - sbool_xor, //----sbool_xor - sbool_xor_saddle, //----sbool_xor_saddle - sbool_xor_abs_diff, //----sbool_xor_abs_diff - sbool_a_minus_b, //----sbool_a_minus_b - sbool_b_minus_a //----sbool_b_minus_a - }; - - - - - - - //----------------------------------------------sbool_combine_shapes_bin - template - void sbool_combine_shapes_bin(sbool_op_e op, - ScanlineGen1& sg1, ScanlineGen2& sg2, - Scanline1& sl1, Scanline2& sl2, - Scanline& sl, Renderer& ren) - { - switch(op) - { - case sbool_or : sbool_unite_shapes_bin (sg1, sg2, sl1, sl2, sl, ren); break; - case sbool_and : sbool_intersect_shapes_bin(sg1, sg2, sl1, sl2, sl, ren); break; - case sbool_xor : - case sbool_xor_saddle : - case sbool_xor_abs_diff: sbool_xor_shapes_bin (sg1, sg2, sl1, sl2, sl, ren); break; - case sbool_a_minus_b : sbool_subtract_shapes_bin (sg1, sg2, sl1, sl2, sl, ren); break; - case sbool_b_minus_a : sbool_subtract_shapes_bin (sg2, sg1, sl2, sl1, sl, ren); break; - } - } - - - - - //-----------------------------------------------sbool_combine_shapes_aa - template - void sbool_combine_shapes_aa(sbool_op_e op, - ScanlineGen1& sg1, ScanlineGen2& sg2, - Scanline1& sl1, Scanline2& sl2, - Scanline& sl, Renderer& ren) - { - switch(op) - { - case sbool_or : sbool_unite_shapes_aa (sg1, sg2, sl1, sl2, sl, ren); break; - case sbool_and : sbool_intersect_shapes_aa (sg1, sg2, sl1, sl2, sl, ren); break; - case sbool_xor : sbool_xor_shapes_aa (sg1, sg2, sl1, sl2, sl, ren); break; - case sbool_xor_saddle : sbool_xor_shapes_saddle_aa (sg1, sg2, sl1, sl2, sl, ren); break; - case sbool_xor_abs_diff: sbool_xor_shapes_abs_diff_aa(sg1, sg2, sl1, sl2, sl, ren); break; - case sbool_a_minus_b : sbool_subtract_shapes_aa (sg1, sg2, sl1, sl2, sl, ren); break; - case sbool_b_minus_a : sbool_subtract_shapes_aa (sg2, sg1, sl2, sl1, sl, ren); break; - } - } - -} - - -#endif - diff --git a/uppdev/agg24/agg_scanline_p.h b/uppdev/agg24/agg_scanline_p.h deleted file mode 100644 index 1d1cbe72f..000000000 --- a/uppdev/agg24/agg_scanline_p.h +++ /dev/null @@ -1,329 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Class scanline_p - a general purpose scanline container with packed spans. -// -//---------------------------------------------------------------------------- -// -// Adaptation for 32-bit screen coordinates (scanline32_p) has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- -#ifndef AGG_SCANLINE_P_INCLUDED -#define AGG_SCANLINE_P_INCLUDED - -#include "agg_array.h" - -namespace agg -{ - - //=============================================================scanline_p8 - // - // This is a general purpose scaline container which supports the interface - // used in the rasterizer::render(). See description of scanline_u8 - // for details. - // - //------------------------------------------------------------------------ - class scanline_p8 - { - public: - typedef scanline_p8 self_type; - typedef int8u cover_type; - typedef int16 coord_type; - - //-------------------------------------------------------------------- - struct span - { - coord_type x; - coord_type len; // If negative, it's a solid span, covers is valid - const cover_type* covers; - }; - - typedef span* iterator; - typedef const span* const_iterator; - - scanline_p8() : - m_last_x(0x7FFFFFF0), - m_covers(), - m_cover_ptr(0), - m_spans(), - m_cur_span(0) - { - } - - //-------------------------------------------------------------------- - void reset(int min_x, int max_x) - { - unsigned max_len = max_x - min_x + 3; - if(max_len > m_spans.size()) - { - m_spans.resize(max_len); - m_covers.resize(max_len); - } - m_last_x = 0x7FFFFFF0; - m_cover_ptr = &m_covers[0]; - m_cur_span = &m_spans[0]; - m_cur_span->len = 0; - } - - //-------------------------------------------------------------------- - void add_cell(int x, unsigned cover) - { - *m_cover_ptr = (cover_type)cover; - if(x == m_last_x+1 && m_cur_span->len > 0) - { - m_cur_span->len++; - } - else - { - m_cur_span++; - m_cur_span->covers = m_cover_ptr; - m_cur_span->x = (int16)x; - m_cur_span->len = 1; - } - m_last_x = x; - m_cover_ptr++; - } - - //-------------------------------------------------------------------- - void add_cells(int x, unsigned len, const cover_type* covers) - { - memcpy(m_cover_ptr, covers, len * sizeof(cover_type)); - if(x == m_last_x+1 && m_cur_span->len > 0) - { - m_cur_span->len += (int16)len; - } - else - { - m_cur_span++; - m_cur_span->covers = m_cover_ptr; - m_cur_span->x = (int16)x; - m_cur_span->len = (int16)len; - } - m_cover_ptr += len; - m_last_x = x + len - 1; - } - - //-------------------------------------------------------------------- - void add_span(int x, unsigned len, unsigned cover) - { - if(x == m_last_x+1 && - m_cur_span->len < 0 && - cover == *m_cur_span->covers) - { - m_cur_span->len -= (int16)len; - } - else - { - *m_cover_ptr = (cover_type)cover; - m_cur_span++; - m_cur_span->covers = m_cover_ptr++; - m_cur_span->x = (int16)x; - m_cur_span->len = (int16)(-int(len)); - } - m_last_x = x + len - 1; - } - - //-------------------------------------------------------------------- - void finalize(int y) - { - m_y = y; - } - - //-------------------------------------------------------------------- - void reset_spans() - { - m_last_x = 0x7FFFFFF0; - m_cover_ptr = &m_covers[0]; - m_cur_span = &m_spans[0]; - m_cur_span->len = 0; - } - - //-------------------------------------------------------------------- - int y() const { return m_y; } - unsigned num_spans() const { return unsigned(m_cur_span - &m_spans[0]); } - const_iterator begin() const { return &m_spans[1]; } - - private: - scanline_p8(const self_type&); - const self_type& operator = (const self_type&); - - int m_last_x; - int m_y; - pod_array m_covers; - cover_type* m_cover_ptr; - pod_array m_spans; - span* m_cur_span; - }; - - - - - - - - - //==========================================================scanline32_p8 - class scanline32_p8 - { - public: - typedef scanline32_p8 self_type; - typedef int8u cover_type; - typedef int32 coord_type; - - struct span - { - span() {} - span(coord_type x_, coord_type len_, const cover_type* covers_) : - x(x_), len(len_), covers(covers_) {} - - coord_type x; - coord_type len; // If negative, it's a solid span, covers is valid - const cover_type* covers; - }; - typedef pod_bvector span_array_type; - - - //-------------------------------------------------------------------- - class const_iterator - { - public: - const_iterator(const span_array_type& spans) : - m_spans(spans), - m_span_idx(0) - {} - - const span& operator*() const { return m_spans[m_span_idx]; } - const span* operator->() const { return &m_spans[m_span_idx]; } - - void operator ++ () { ++m_span_idx; } - - private: - const span_array_type& m_spans; - unsigned m_span_idx; - }; - - //-------------------------------------------------------------------- - scanline32_p8() : - m_max_len(0), - m_last_x(0x7FFFFFF0), - m_covers(), - m_cover_ptr(0) - { - } - - //-------------------------------------------------------------------- - void reset(int min_x, int max_x) - { - unsigned max_len = max_x - min_x + 3; - if(max_len > m_covers.size()) - { - m_covers.resize(max_len); - } - m_last_x = 0x7FFFFFF0; - m_cover_ptr = &m_covers[0]; - m_spans.remove_all(); - } - - //-------------------------------------------------------------------- - void add_cell(int x, unsigned cover) - { - *m_cover_ptr = cover_type(cover); - if(x == m_last_x+1 && m_spans.size() && m_spans.last().len > 0) - { - m_spans.last().len++; - } - else - { - m_spans.add(span(coord_type(x), 1, m_cover_ptr)); - } - m_last_x = x; - m_cover_ptr++; - } - - //-------------------------------------------------------------------- - void add_cells(int x, unsigned len, const cover_type* covers) - { - memcpy(m_cover_ptr, covers, len * sizeof(cover_type)); - if(x == m_last_x+1 && m_spans.size() && m_spans.last().len > 0) - { - m_spans.last().len += coord_type(len); - } - else - { - m_spans.add(span(coord_type(x), coord_type(len), m_cover_ptr)); - } - m_cover_ptr += len; - m_last_x = x + len - 1; - } - - //-------------------------------------------------------------------- - void add_span(int x, unsigned len, unsigned cover) - { - if(x == m_last_x+1 && - m_spans.size() && - m_spans.last().len < 0 && - cover == *m_spans.last().covers) - { - m_spans.last().len -= coord_type(len); - } - else - { - *m_cover_ptr = cover_type(cover); - m_spans.add(span(coord_type(x), -coord_type(len), m_cover_ptr++)); - } - m_last_x = x + len - 1; - } - - //-------------------------------------------------------------------- - void finalize(int y) - { - m_y = y; - } - - //-------------------------------------------------------------------- - void reset_spans() - { - m_last_x = 0x7FFFFFF0; - m_cover_ptr = &m_covers[0]; - m_spans.remove_all(); - } - - //-------------------------------------------------------------------- - int y() const { return m_y; } - unsigned num_spans() const { return m_spans.size(); } - const_iterator begin() const { return const_iterator(m_spans); } - - private: - scanline32_p8(const self_type&); - const self_type& operator = (const self_type&); - - unsigned m_max_len; - int m_last_x; - int m_y; - pod_array m_covers; - cover_type* m_cover_ptr; - span_array_type m_spans; - }; - - -} - - -#endif - diff --git a/uppdev/agg24/agg_scanline_storage_aa.h b/uppdev/agg24/agg_scanline_storage_aa.h deleted file mode 100644 index be452a88f..000000000 --- a/uppdev/agg24/agg_scanline_storage_aa.h +++ /dev/null @@ -1,815 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Adaptation for 32-bit screen coordinates has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- - -#ifndef AGG_SCANLINE_STORAGE_AA_INCLUDED -#define AGG_SCANLINE_STORAGE_AA_INCLUDED - -#include -#include -#include -#include "agg_array.h" - - -namespace agg -{ - - //----------------------------------------------scanline_cell_storage - template class scanline_cell_storage - { - struct extra_span - { - unsigned len; - T* ptr; - }; - - public: - typedef T value_type; - - //--------------------------------------------------------------- - ~scanline_cell_storage() - { - remove_all(); - } - - //--------------------------------------------------------------- - scanline_cell_storage() : - m_cells(128-2), - m_extra_storage() - {} - - - // Copying - //--------------------------------------------------------------- - scanline_cell_storage(const scanline_cell_storage& v) : - m_cells(v.m_cells), - m_extra_storage() - { - copy_extra_storage(v); - } - - //--------------------------------------------------------------- - const scanline_cell_storage& - operator = (const scanline_cell_storage& v) - { - remove_all(); - m_cells = v.m_cells; - copy_extra_storage(v); - return *this; - } - - //--------------------------------------------------------------- - void remove_all() - { - int i; - for(i = m_extra_storage.size()-1; i >= 0; --i) - { - pod_allocator::deallocate(m_extra_storage[i].ptr, - m_extra_storage[i].len); - } - m_extra_storage.remove_all(); - m_cells.remove_all(); - } - - //--------------------------------------------------------------- - int add_cells(const T* cells, unsigned num_cells) - { - int idx = m_cells.allocate_continuous_block(num_cells); - if(idx >= 0) - { - T* ptr = &m_cells[idx]; - memcpy(ptr, cells, sizeof(T) * num_cells); - return idx; - } - extra_span s; - s.len = num_cells; - s.ptr = pod_allocator::allocate(num_cells); - memcpy(s.ptr, cells, sizeof(T) * num_cells); - m_extra_storage.add(s); - return -int(m_extra_storage.size()); - } - - //--------------------------------------------------------------- - const T* operator [] (int idx) const - { - if(idx >= 0) - { - if((unsigned)idx >= m_cells.size()) return 0; - return &m_cells[(unsigned)idx]; - } - unsigned i = unsigned(-idx - 1); - if(i >= m_extra_storage.size()) return 0; - return m_extra_storage[i].ptr; - } - - //--------------------------------------------------------------- - T* operator [] (int idx) - { - if(idx >= 0) - { - if((unsigned)idx >= m_cells.size()) return 0; - return &m_cells[(unsigned)idx]; - } - unsigned i = unsigned(-idx - 1); - if(i >= m_extra_storage.size()) return 0; - return m_extra_storage[i].ptr; - } - - private: - void copy_extra_storage(const scanline_cell_storage& v) - { - unsigned i; - for(i = 0; i < v.m_extra_storage.size(); ++i) - { - const extra_span& src = v.m_extra_storage[i]; - extra_span dst; - dst.len = src.len; - dst.ptr = pod_allocator::allocate(dst.len); - memcpy(dst.ptr, src.ptr, dst.len * sizeof(T)); - m_extra_storage.add(dst); - } - } - - pod_bvector m_cells; - pod_bvector m_extra_storage; - }; - - - - - - - //-----------------------------------------------scanline_storage_aa - template class scanline_storage_aa - { - public: - typedef T cover_type; - - //--------------------------------------------------------------- - struct span_data - { - int32 x; - int32 len; // If negative, it's a solid span, covers is valid - int covers_id; // The index of the cells in the scanline_cell_storage - }; - - //--------------------------------------------------------------- - struct scanline_data - { - int y; - unsigned num_spans; - unsigned start_span; - }; - - - //--------------------------------------------------------------- - class embedded_scanline - { - public: - - //----------------------------------------------------------- - class const_iterator - { - public: - struct span - { - int32 x; - int32 len; // If negative, it's a solid span, covers is valid - const T* covers; - }; - - const_iterator() : m_storage(0) {} - const_iterator(const embedded_scanline& sl) : - m_storage(sl.m_storage), - m_span_idx(sl.m_scanline.start_span) - { - init_span(); - } - - const span& operator*() const { return m_span; } - const span* operator->() const { return &m_span; } - - void operator ++ () - { - ++m_span_idx; - init_span(); - } - - private: - void init_span() - { - const span_data& s = m_storage->span_by_index(m_span_idx); - m_span.x = s.x; - m_span.len = s.len; - m_span.covers = m_storage->covers_by_index(s.covers_id); - } - - const scanline_storage_aa* m_storage; - unsigned m_span_idx; - span m_span; - }; - - friend class const_iterator; - - - //----------------------------------------------------------- - embedded_scanline(const scanline_storage_aa& storage) : - m_storage(&storage) - { - init(0); - } - - //----------------------------------------------------------- - void reset(int, int) {} - unsigned num_spans() const { return m_scanline.num_spans; } - int y() const { return m_scanline.y; } - const_iterator begin() const { return const_iterator(*this); } - - //----------------------------------------------------------- - void init(unsigned scanline_idx) - { - m_scanline_idx = scanline_idx; - m_scanline = m_storage->scanline_by_index(m_scanline_idx); - } - - private: - const scanline_storage_aa* m_storage; - scanline_data m_scanline; - unsigned m_scanline_idx; - }; - - - //--------------------------------------------------------------- - scanline_storage_aa() : - m_covers(), - m_spans(256-2), // Block increment size - m_scanlines(), - m_min_x( 0x7FFFFFFF), - m_min_y( 0x7FFFFFFF), - m_max_x(-0x7FFFFFFF), - m_max_y(-0x7FFFFFFF), - m_cur_scanline(0) - { - m_fake_scanline.y = 0; - m_fake_scanline.num_spans = 0; - m_fake_scanline.start_span = 0; - m_fake_span.x = 0; - m_fake_span.len = 0; - m_fake_span.covers_id = 0; - } - - // Renderer Interface - //--------------------------------------------------------------- - void prepare() - { - m_covers.remove_all(); - m_scanlines.remove_all(); - m_spans.remove_all(); - m_min_x = 0x7FFFFFFF; - m_min_y = 0x7FFFFFFF; - m_max_x = -0x7FFFFFFF; - m_max_y = -0x7FFFFFFF; - m_cur_scanline = 0; - } - - //--------------------------------------------------------------- - template void render(const Scanline& sl) - { - scanline_data sl_this; - - int y = sl.y(); - if(y < m_min_y) m_min_y = y; - if(y > m_max_y) m_max_y = y; - - sl_this.y = y; - sl_this.num_spans = sl.num_spans(); - sl_this.start_span = m_spans.size(); - typename Scanline::const_iterator span_iterator = sl.begin(); - - unsigned num_spans = sl_this.num_spans; - for(;;) - { - span_data sp; - - sp.x = span_iterator->x; - sp.len = span_iterator->len; - int len = abs(int(sp.len)); - sp.covers_id = - m_covers.add_cells(span_iterator->covers, - unsigned(len)); - m_spans.add(sp); - int x1 = sp.x; - int x2 = sp.x + len - 1; - if(x1 < m_min_x) m_min_x = x1; - if(x2 > m_max_x) m_max_x = x2; - if(--num_spans == 0) break; - ++span_iterator; - } - m_scanlines.add(sl_this); - } - - - //--------------------------------------------------------------- - // Iterate scanlines interface - int min_x() const { return m_min_x; } - int min_y() const { return m_min_y; } - int max_x() const { return m_max_x; } - int max_y() const { return m_max_y; } - - //--------------------------------------------------------------- - bool rewind_scanlines() - { - m_cur_scanline = 0; - return m_scanlines.size() > 0; - } - - - //--------------------------------------------------------------- - template bool sweep_scanline(Scanline& sl) - { - sl.reset_spans(); - for(;;) - { - if(m_cur_scanline >= m_scanlines.size()) return false; - const scanline_data& sl_this = m_scanlines[m_cur_scanline]; - - unsigned num_spans = sl_this.num_spans; - unsigned span_idx = sl_this.start_span; - do - { - const span_data& sp = m_spans[span_idx++]; - const T* covers = covers_by_index(sp.covers_id); - if(sp.len < 0) - { - sl.add_span(sp.x, unsigned(-sp.len), *covers); - } - else - { - sl.add_cells(sp.x, sp.len, covers); - } - } - while(--num_spans); - ++m_cur_scanline; - if(sl.num_spans()) - { - sl.finalize(sl_this.y); - break; - } - } - return true; - } - - - //--------------------------------------------------------------- - // Specialization for embedded_scanline - bool sweep_scanline(embedded_scanline& sl) - { - do - { - if(m_cur_scanline >= m_scanlines.size()) return false; - sl.init(m_cur_scanline); - ++m_cur_scanline; - } - while(sl.num_spans() == 0); - return true; - } - - //--------------------------------------------------------------- - unsigned byte_size() const - { - unsigned i; - unsigned size = sizeof(int32) * 4; // min_x, min_y, max_x, max_y - - for(i = 0; i < m_scanlines.size(); ++i) - { - size += sizeof(int32) * 3; // scanline size in bytes, Y, num_spans - - const scanline_data& sl_this = m_scanlines[i]; - - unsigned num_spans = sl_this.num_spans; - unsigned span_idx = sl_this.start_span; - do - { - const span_data& sp = m_spans[span_idx++]; - - size += sizeof(int32) * 2; // X, span_len - if(sp.len < 0) - { - size += sizeof(T); // cover - } - else - { - size += sizeof(T) * unsigned(sp.len); // covers - } - } - while(--num_spans); - } - return size; - } - - - //--------------------------------------------------------------- - static void write_int32(int8u* dst, int32 val) - { - dst[0] = ((const int8u*)&val)[0]; - dst[1] = ((const int8u*)&val)[1]; - dst[2] = ((const int8u*)&val)[2]; - dst[3] = ((const int8u*)&val)[3]; - } - - - //--------------------------------------------------------------- - void serialize(int8u* data) const - { - unsigned i; - - write_int32(data, min_x()); // min_x - data += sizeof(int32); - write_int32(data, min_y()); // min_y - data += sizeof(int32); - write_int32(data, max_x()); // max_x - data += sizeof(int32); - write_int32(data, max_y()); // max_y - data += sizeof(int32); - - for(i = 0; i < m_scanlines.size(); ++i) - { - const scanline_data& sl_this = m_scanlines[i]; - - int8u* size_ptr = data; - data += sizeof(int32); // Reserve space for scanline size in bytes - - write_int32(data, sl_this.y); // Y - data += sizeof(int32); - - write_int32(data, sl_this.num_spans); // num_spans - data += sizeof(int32); - - unsigned num_spans = sl_this.num_spans; - unsigned span_idx = sl_this.start_span; - do - { - const span_data& sp = m_spans[span_idx++]; - const T* covers = covers_by_index(sp.covers_id); - - write_int32(data, sp.x); // X - data += sizeof(int32); - - write_int32(data, sp.len); // span_len - data += sizeof(int32); - - if(sp.len < 0) - { - memcpy(data, covers, sizeof(T)); - data += sizeof(T); - } - else - { - memcpy(data, covers, unsigned(sp.len) * sizeof(T)); - data += sizeof(T) * unsigned(sp.len); - } - } - while(--num_spans); - write_int32(size_ptr, int32(unsigned(data - size_ptr))); - } - } - - - //--------------------------------------------------------------- - const scanline_data& scanline_by_index(unsigned i) const - { - return (i < m_scanlines.size()) ? m_scanlines[i] : m_fake_scanline; - } - - //--------------------------------------------------------------- - const span_data& span_by_index(unsigned i) const - { - return (i < m_spans.size()) ? m_spans[i] : m_fake_span; - } - - //--------------------------------------------------------------- - const T* covers_by_index(int i) const - { - return m_covers[i]; - } - - private: - scanline_cell_storage m_covers; - pod_bvector m_spans; - pod_bvector m_scanlines; - span_data m_fake_span; - scanline_data m_fake_scanline; - int m_min_x; - int m_min_y; - int m_max_x; - int m_max_y; - unsigned m_cur_scanline; - }; - - - typedef scanline_storage_aa scanline_storage_aa8; //--------scanline_storage_aa8 - typedef scanline_storage_aa scanline_storage_aa16; //--------scanline_storage_aa16 - typedef scanline_storage_aa scanline_storage_aa32; //--------scanline_storage_aa32 - - - - - //------------------------------------------serialized_scanlines_adaptor_aa - template class serialized_scanlines_adaptor_aa - { - public: - typedef T cover_type; - - //--------------------------------------------------------------------- - class embedded_scanline - { - public: - typedef T cover_type; - - //----------------------------------------------------------------- - class const_iterator - { - public: - struct span - { - int32 x; - int32 len; // If negative, it's a solid span, "covers" is valid - const T* covers; - }; - - const_iterator() : m_ptr(0) {} - const_iterator(const embedded_scanline& sl) : - m_ptr(sl.m_ptr), - m_dx(sl.m_dx) - { - init_span(); - } - - const span& operator*() const { return m_span; } - const span* operator->() const { return &m_span; } - - void operator ++ () - { - if(m_span.len < 0) - { - m_ptr += sizeof(T); - } - else - { - m_ptr += m_span.len * sizeof(T); - } - init_span(); - } - - private: - int read_int32() - { - int32 val; - ((int8u*)&val)[0] = *m_ptr++; - ((int8u*)&val)[1] = *m_ptr++; - ((int8u*)&val)[2] = *m_ptr++; - ((int8u*)&val)[3] = *m_ptr++; - return val; - } - - void init_span() - { - m_span.x = read_int32() + m_dx; - m_span.len = read_int32(); - m_span.covers = m_ptr; - } - - const int8u* m_ptr; - span m_span; - int m_dx; - }; - - friend class const_iterator; - - - //----------------------------------------------------------------- - embedded_scanline() : m_ptr(0), m_y(0), m_num_spans(0) {} - - //----------------------------------------------------------------- - void reset(int, int) {} - unsigned num_spans() const { return m_num_spans; } - int y() const { return m_y; } - const_iterator begin() const { return const_iterator(*this); } - - - private: - //----------------------------------------------------------------- - int read_int32() - { - int32 val; - ((int8u*)&val)[0] = *m_ptr++; - ((int8u*)&val)[1] = *m_ptr++; - ((int8u*)&val)[2] = *m_ptr++; - ((int8u*)&val)[3] = *m_ptr++; - return val; - } - - public: - //----------------------------------------------------------------- - void init(const int8u* ptr, int dx, int dy) - { - m_ptr = ptr; - m_y = read_int32() + dy; - m_num_spans = unsigned(read_int32()); - m_dx = dx; - } - - private: - const int8u* m_ptr; - int m_y; - unsigned m_num_spans; - int m_dx; - }; - - - - public: - //-------------------------------------------------------------------- - serialized_scanlines_adaptor_aa() : - m_data(0), - m_end(0), - m_ptr(0), - m_dx(0), - m_dy(0), - m_min_x(0x7FFFFFFF), - m_min_y(0x7FFFFFFF), - m_max_x(-0x7FFFFFFF), - m_max_y(-0x7FFFFFFF) - {} - - //-------------------------------------------------------------------- - serialized_scanlines_adaptor_aa(const int8u* data, unsigned size, - double dx, double dy) : - m_data(data), - m_end(data + size), - m_ptr(data), - m_dx(iround(dx)), - m_dy(iround(dy)), - m_min_x(0x7FFFFFFF), - m_min_y(0x7FFFFFFF), - m_max_x(-0x7FFFFFFF), - m_max_y(-0x7FFFFFFF) - {} - - //-------------------------------------------------------------------- - void init(const int8u* data, unsigned size, double dx, double dy) - { - m_data = data; - m_end = data + size; - m_ptr = data; - m_dx = iround(dx); - m_dy = iround(dy); - m_min_x = 0x7FFFFFFF; - m_min_y = 0x7FFFFFFF; - m_max_x = -0x7FFFFFFF; - m_max_y = -0x7FFFFFFF; - } - - private: - //-------------------------------------------------------------------- - int read_int32() - { - int32 val; - ((int8u*)&val)[0] = *m_ptr++; - ((int8u*)&val)[1] = *m_ptr++; - ((int8u*)&val)[2] = *m_ptr++; - ((int8u*)&val)[3] = *m_ptr++; - return val; - } - - //-------------------------------------------------------------------- - unsigned read_int32u() - { - int32u val; - ((int8u*)&val)[0] = *m_ptr++; - ((int8u*)&val)[1] = *m_ptr++; - ((int8u*)&val)[2] = *m_ptr++; - ((int8u*)&val)[3] = *m_ptr++; - return val; - } - - public: - // Iterate scanlines interface - //-------------------------------------------------------------------- - bool rewind_scanlines() - { - m_ptr = m_data; - if(m_ptr < m_end) - { - m_min_x = read_int32() + m_dx; - m_min_y = read_int32() + m_dy; - m_max_x = read_int32() + m_dx; - m_max_y = read_int32() + m_dy; - } - return m_ptr < m_end; - } - - //-------------------------------------------------------------------- - int min_x() const { return m_min_x; } - int min_y() const { return m_min_y; } - int max_x() const { return m_max_x; } - int max_y() const { return m_max_y; } - - //-------------------------------------------------------------------- - template bool sweep_scanline(Scanline& sl) - { - sl.reset_spans(); - for(;;) - { - if(m_ptr >= m_end) return false; - - read_int32(); // Skip scanline size in bytes - int y = read_int32() + m_dy; - unsigned num_spans = read_int32(); - - do - { - int x = read_int32() + m_dx; - int len = read_int32(); - - if(len < 0) - { - sl.add_span(x, unsigned(-len), *m_ptr); - m_ptr += sizeof(T); - } - else - { - sl.add_cells(x, len, m_ptr); - m_ptr += len * sizeof(T); - } - } - while(--num_spans); - - if(sl.num_spans()) - { - sl.finalize(y); - break; - } - } - return true; - } - - - //-------------------------------------------------------------------- - // Specialization for embedded_scanline - bool sweep_scanline(embedded_scanline& sl) - { - do - { - if(m_ptr >= m_end) return false; - - unsigned byte_size = read_int32u(); - sl.init(m_ptr, m_dx, m_dy); - m_ptr += byte_size - sizeof(int32); - } - while(sl.num_spans() == 0); - return true; - } - - private: - const int8u* m_data; - const int8u* m_end; - const int8u* m_ptr; - int m_dx; - int m_dy; - int m_min_x; - int m_min_y; - int m_max_x; - int m_max_y; - }; - - - - typedef serialized_scanlines_adaptor_aa serialized_scanlines_adaptor_aa8; //----serialized_scanlines_adaptor_aa8 - typedef serialized_scanlines_adaptor_aa serialized_scanlines_adaptor_aa16; //----serialized_scanlines_adaptor_aa16 - typedef serialized_scanlines_adaptor_aa serialized_scanlines_adaptor_aa32; //----serialized_scanlines_adaptor_aa32 - -} - - -#endif - diff --git a/uppdev/agg24/agg_scanline_storage_bin.h b/uppdev/agg24/agg_scanline_storage_bin.h deleted file mode 100644 index d76001697..000000000 --- a/uppdev/agg24/agg_scanline_storage_bin.h +++ /dev/null @@ -1,586 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Adaptation for 32-bit screen coordinates has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- - - -#ifndef AGG_SCANLINE_STORAGE_BIN_INCLUDED -#define AGG_SCANLINE_STORAGE_BIN_INCLUDED - -#include -#include -#include -#include "agg_array.h" - - -namespace agg -{ - - //-----------------------------------------------scanline_storage_bin - class scanline_storage_bin - { - public: - //--------------------------------------------------------------- - struct span_data - { - int32 x; - int32 len; - }; - - //--------------------------------------------------------------- - struct scanline_data - { - int y; - unsigned num_spans; - unsigned start_span; - }; - - - //--------------------------------------------------------------- - class embedded_scanline - { - public: - - //----------------------------------------------------------- - class const_iterator - { - public: - const_iterator() : m_storage(0) {} - const_iterator(const embedded_scanline& sl) : - m_storage(sl.m_storage), - m_span_idx(sl.m_scanline.start_span) - { - m_span = m_storage->span_by_index(m_span_idx); - } - - const span_data& operator*() const { return m_span; } - const span_data* operator->() const { return &m_span; } - - void operator ++ () - { - ++m_span_idx; - m_span = m_storage->span_by_index(m_span_idx); - } - - private: - const scanline_storage_bin* m_storage; - unsigned m_span_idx; - span_data m_span; - }; - - friend class const_iterator; - - - //----------------------------------------------------------- - embedded_scanline(const scanline_storage_bin& storage) : - m_storage(&storage) - { - setup(0); - } - - //----------------------------------------------------------- - void reset(int, int) {} - unsigned num_spans() const { return m_scanline.num_spans; } - int y() const { return m_scanline.y; } - const_iterator begin() const { return const_iterator(*this); } - - //----------------------------------------------------------- - void setup(unsigned scanline_idx) - { - m_scanline_idx = scanline_idx; - m_scanline = m_storage->scanline_by_index(m_scanline_idx); - } - - private: - const scanline_storage_bin* m_storage; - scanline_data m_scanline; - unsigned m_scanline_idx; - }; - - - //--------------------------------------------------------------- - scanline_storage_bin() : - m_spans(256-2), // Block increment size - m_scanlines(), - m_min_x( 0x7FFFFFFF), - m_min_y( 0x7FFFFFFF), - m_max_x(-0x7FFFFFFF), - m_max_y(-0x7FFFFFFF), - m_cur_scanline(0) - { - m_fake_scanline.y = 0; - m_fake_scanline.num_spans = 0; - m_fake_scanline.start_span = 0; - m_fake_span.x = 0; - m_fake_span.len = 0; - } - - // Renderer Interface - //--------------------------------------------------------------- - void prepare() - { - m_scanlines.remove_all(); - m_spans.remove_all(); - m_min_x = 0x7FFFFFFF; - m_min_y = 0x7FFFFFFF; - m_max_x = -0x7FFFFFFF; - m_max_y = -0x7FFFFFFF; - m_cur_scanline = 0; - } - - //--------------------------------------------------------------- - template void render(const Scanline& sl) - { - scanline_data sl_this; - - int y = sl.y(); - if(y < m_min_y) m_min_y = y; - if(y > m_max_y) m_max_y = y; - - sl_this.y = y; - sl_this.num_spans = sl.num_spans(); - sl_this.start_span = m_spans.size(); - typename Scanline::const_iterator span_iterator = sl.begin(); - - unsigned num_spans = sl_this.num_spans; - for(;;) - { - span_data sp; - sp.x = span_iterator->x; - sp.len = (int32)abs((int)(span_iterator->len)); - m_spans.add(sp); - int x1 = sp.x; - int x2 = sp.x + sp.len - 1; - if(x1 < m_min_x) m_min_x = x1; - if(x2 > m_max_x) m_max_x = x2; - if(--num_spans == 0) break; - ++span_iterator; - } - m_scanlines.add(sl_this); - } - - - //--------------------------------------------------------------- - // Iterate scanlines interface - int min_x() const { return m_min_x; } - int min_y() const { return m_min_y; } - int max_x() const { return m_max_x; } - int max_y() const { return m_max_y; } - - //--------------------------------------------------------------- - bool rewind_scanlines() - { - m_cur_scanline = 0; - return m_scanlines.size() > 0; - } - - - //--------------------------------------------------------------- - template bool sweep_scanline(Scanline& sl) - { - sl.reset_spans(); - for(;;) - { - if(m_cur_scanline >= m_scanlines.size()) return false; - const scanline_data& sl_this = m_scanlines[m_cur_scanline]; - - unsigned num_spans = sl_this.num_spans; - unsigned span_idx = sl_this.start_span; - do - { - const span_data& sp = m_spans[span_idx++]; - sl.add_span(sp.x, sp.len, cover_full); - } - while(--num_spans); - - ++m_cur_scanline; - if(sl.num_spans()) - { - sl.finalize(sl_this.y); - break; - } - } - return true; - } - - - //--------------------------------------------------------------- - // Specialization for embedded_scanline - bool sweep_scanline(embedded_scanline& sl) - { - do - { - if(m_cur_scanline >= m_scanlines.size()) return false; - sl.setup(m_cur_scanline); - ++m_cur_scanline; - } - while(sl.num_spans() == 0); - return true; - } - - - //--------------------------------------------------------------- - unsigned byte_size() const - { - unsigned i; - unsigned size = sizeof(int32) * 4; // min_x, min_y, max_x, max_y - - for(i = 0; i < m_scanlines.size(); ++i) - { - size += sizeof(int32) * 2 + // Y, num_spans - unsigned(m_scanlines[i].num_spans) * sizeof(int32) * 2; // X, span_len - } - return size; - } - - - //--------------------------------------------------------------- - static void write_int32(int8u* dst, int32 val) - { - dst[0] = ((const int8u*)&val)[0]; - dst[1] = ((const int8u*)&val)[1]; - dst[2] = ((const int8u*)&val)[2]; - dst[3] = ((const int8u*)&val)[3]; - } - - - //--------------------------------------------------------------- - void serialize(int8u* data) const - { - unsigned i; - - write_int32(data, min_x()); // min_x - data += sizeof(int32); - write_int32(data, min_y()); // min_y - data += sizeof(int32); - write_int32(data, max_x()); // max_x - data += sizeof(int32); - write_int32(data, max_y()); // max_y - data += sizeof(int32); - - for(i = 0; i < m_scanlines.size(); ++i) - { - const scanline_data& sl_this = m_scanlines[i]; - - write_int32(data, sl_this.y); // Y - data += sizeof(int32); - - write_int32(data, sl_this.num_spans); // num_spans - data += sizeof(int32); - - unsigned num_spans = sl_this.num_spans; - unsigned span_idx = sl_this.start_span; - do - { - const span_data& sp = m_spans[span_idx++]; - - write_int32(data, sp.x); // X - data += sizeof(int32); - - write_int32(data, sp.len); // len - data += sizeof(int32); - } - while(--num_spans); - } - } - - - //--------------------------------------------------------------- - const scanline_data& scanline_by_index(unsigned i) const - { - return (i < m_scanlines.size()) ? m_scanlines[i] : m_fake_scanline; - } - - //--------------------------------------------------------------- - const span_data& span_by_index(unsigned i) const - { - return (i < m_spans.size()) ? m_spans[i] : m_fake_span; - } - - - private: - pod_bvector m_spans; - pod_bvector m_scanlines; - span_data m_fake_span; - scanline_data m_fake_scanline; - int m_min_x; - int m_min_y; - int m_max_x; - int m_max_y; - unsigned m_cur_scanline; - }; - - - - - - - - - - - - - - //---------------------------------------serialized_scanlines_adaptor_bin - class serialized_scanlines_adaptor_bin - { - public: - typedef bool cover_type; - - //-------------------------------------------------------------------- - class embedded_scanline - { - public: - - //---------------------------------------------------------------- - class const_iterator - { - public: - struct span - { - int32 x; - int32 len; - }; - - const_iterator() : m_ptr(0) {} - const_iterator(const embedded_scanline& sl) : - m_ptr(sl.m_ptr), - m_dx(sl.m_dx) - { - m_span.x = read_int32() + m_dx; - m_span.len = read_int32(); - } - - const span& operator*() const { return m_span; } - const span* operator->() const { return &m_span; } - - void operator ++ () - { - m_span.x = read_int32() + m_dx; - m_span.len = read_int32(); - } - - private: - int read_int32() - { - int32 val; - ((int8u*)&val)[0] = *m_ptr++; - ((int8u*)&val)[1] = *m_ptr++; - ((int8u*)&val)[2] = *m_ptr++; - ((int8u*)&val)[3] = *m_ptr++; - return val; - } - - const int8u* m_ptr; - span m_span; - int m_dx; - }; - - friend class const_iterator; - - - //---------------------------------------------------------------- - embedded_scanline() : m_ptr(0), m_y(0), m_num_spans(0) {} - - //---------------------------------------------------------------- - void reset(int, int) {} - unsigned num_spans() const { return m_num_spans; } - int y() const { return m_y; } - const_iterator begin() const { return const_iterator(*this); } - - - private: - //---------------------------------------------------------------- - int read_int32() - { - int32 val; - ((int8u*)&val)[0] = *m_ptr++; - ((int8u*)&val)[1] = *m_ptr++; - ((int8u*)&val)[2] = *m_ptr++; - ((int8u*)&val)[3] = *m_ptr++; - return val; - } - - public: - //---------------------------------------------------------------- - void init(const int8u* ptr, int dx, int dy) - { - m_ptr = ptr; - m_y = read_int32() + dy; - m_num_spans = unsigned(read_int32()); - m_dx = dx; - } - - private: - const int8u* m_ptr; - int m_y; - unsigned m_num_spans; - int m_dx; - }; - - - - public: - //-------------------------------------------------------------------- - serialized_scanlines_adaptor_bin() : - m_data(0), - m_end(0), - m_ptr(0), - m_dx(0), - m_dy(0), - m_min_x(0x7FFFFFFF), - m_min_y(0x7FFFFFFF), - m_max_x(-0x7FFFFFFF), - m_max_y(-0x7FFFFFFF) - {} - - //-------------------------------------------------------------------- - serialized_scanlines_adaptor_bin(const int8u* data, unsigned size, - double dx, double dy) : - m_data(data), - m_end(data + size), - m_ptr(data), - m_dx(iround(dx)), - m_dy(iround(dy)), - m_min_x(0x7FFFFFFF), - m_min_y(0x7FFFFFFF), - m_max_x(-0x7FFFFFFF), - m_max_y(-0x7FFFFFFF) - {} - - //-------------------------------------------------------------------- - void init(const int8u* data, unsigned size, double dx, double dy) - { - m_data = data; - m_end = data + size; - m_ptr = data; - m_dx = iround(dx); - m_dy = iround(dy); - m_min_x = 0x7FFFFFFF; - m_min_y = 0x7FFFFFFF; - m_max_x = -0x7FFFFFFF; - m_max_y = -0x7FFFFFFF; - } - - private: - //-------------------------------------------------------------------- - int read_int32() - { - int32 val; - ((int8u*)&val)[0] = *m_ptr++; - ((int8u*)&val)[1] = *m_ptr++; - ((int8u*)&val)[2] = *m_ptr++; - ((int8u*)&val)[3] = *m_ptr++; - return val; - } - - public: - // Iterate scanlines interface - //-------------------------------------------------------------------- - bool rewind_scanlines() - { - m_ptr = m_data; - if(m_ptr < m_end) - { - m_min_x = read_int32() + m_dx; - m_min_y = read_int32() + m_dy; - m_max_x = read_int32() + m_dx; - m_max_y = read_int32() + m_dy; - } - return m_ptr < m_end; - } - - //-------------------------------------------------------------------- - int min_x() const { return m_min_x; } - int min_y() const { return m_min_y; } - int max_x() const { return m_max_x; } - int max_y() const { return m_max_y; } - - //-------------------------------------------------------------------- - template bool sweep_scanline(Scanline& sl) - { - sl.reset_spans(); - for(;;) - { - if(m_ptr >= m_end) return false; - - int y = read_int32() + m_dy; - unsigned num_spans = read_int32(); - - do - { - int x = read_int32() + m_dx; - int len = read_int32(); - - if(len < 0) len = -len; - sl.add_span(x, unsigned(len), cover_full); - } - while(--num_spans); - - if(sl.num_spans()) - { - sl.finalize(y); - break; - } - } - return true; - } - - - //-------------------------------------------------------------------- - // Specialization for embedded_scanline - bool sweep_scanline(embedded_scanline& sl) - { - do - { - if(m_ptr >= m_end) return false; - - sl.init(m_ptr, m_dx, m_dy); - - // Jump to the next scanline - //-------------------------- - read_int32(); // Y - int num_spans = read_int32(); // num_spans - m_ptr += num_spans * sizeof(int32) * 2; - } - while(sl.num_spans() == 0); - return true; - } - - private: - const int8u* m_data; - const int8u* m_end; - const int8u* m_ptr; - int m_dx; - int m_dy; - int m_min_x; - int m_min_y; - int m_max_x; - int m_max_y; - }; - - - -} - -#endif - diff --git a/uppdev/agg24/agg_scanline_u.h b/uppdev/agg24/agg_scanline_u.h deleted file mode 100644 index 5a28ed17e..000000000 --- a/uppdev/agg24/agg_scanline_u.h +++ /dev/null @@ -1,499 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Adaptation for 32-bit screen coordinates (scanline32_u) has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- - -#ifndef AGG_SCANLINE_U_INCLUDED -#define AGG_SCANLINE_U_INCLUDED - -#include "agg_array.h" - -namespace agg -{ - //=============================================================scanline_u8 - // - // Unpacked scanline container class - // - // This class is used to transfer data from a scanline rasterizer - // to the rendering buffer. It's organized very simple. The class stores - // information of horizontal spans to render it into a pixel-map buffer. - // Each span has staring X, length, and an array of bytes that determine the - // cover-values for each pixel. - // Before using this class you should know the minimal and maximal pixel - // coordinates of your scanline. The protocol of using is: - // 1. reset(min_x, max_x) - // 2. add_cell() / add_span() - accumulate scanline. - // When forming one scanline the next X coordinate must be always greater - // than the last stored one, i.e. it works only with ordered coordinates. - // 3. Call finalize(y) and render the scanline. - // 3. Call reset_spans() to prepare for the new scanline. - // - // 4. Rendering: - // - // Scanline provides an iterator class that allows you to extract - // the spans and the cover values for each pixel. Be aware that clipping - // has not been done yet, so you should perform it yourself. - // Use scanline_u8::iterator to render spans: - //------------------------------------------------------------------------- - // - // int y = sl.y(); // Y-coordinate of the scanline - // - // ************************************ - // ...Perform vertical clipping here... - // ************************************ - // - // scanline_u8::const_iterator span = sl.begin(); - // - // unsigned char* row = m_rbuf->row(y); // The the address of the beginning - // // of the current row - // - // unsigned num_spans = sl.num_spans(); // Number of spans. It's guaranteed that - // // num_spans is always greater than 0. - // - // do - // { - // const scanline_u8::cover_type* covers = - // span->covers; // The array of the cover values - // - // int num_pix = span->len; // Number of pixels of the span. - // // Always greater than 0, still it's - // // better to use "int" instead of - // // "unsigned" because it's more - // // convenient for clipping - // int x = span->x; - // - // ************************************** - // ...Perform horizontal clipping here... - // ...you have x, covers, and pix_count.. - // ************************************** - // - // unsigned char* dst = row + x; // Calculate the start address of the row. - // // In this case we assume a simple - // // grayscale image 1-byte per pixel. - // do - // { - // *dst++ = *covers++; // Hypotetical rendering. - // } - // while(--num_pix); - // - // ++span; - // } - // while(--num_spans); // num_spans cannot be 0, so this loop is quite safe - //------------------------------------------------------------------------ - // - // The question is: why should we accumulate the whole scanline when we - // could render just separate spans when they're ready? - // That's because using the scanline is generally faster. When is consists - // of more than one span the conditions for the processor cash system - // are better, because switching between two different areas of memory - // (that can be very large) occurs less frequently. - //------------------------------------------------------------------------ - class scanline_u8 - { - public: - typedef scanline_u8 self_type; - typedef int8u cover_type; - typedef int16 coord_type; - - //-------------------------------------------------------------------- - struct span - { - coord_type x; - coord_type len; - cover_type* covers; - }; - - typedef span* iterator; - typedef const span* const_iterator; - - //-------------------------------------------------------------------- - scanline_u8() : - m_min_x(0), - m_last_x(0x7FFFFFF0), - m_cur_span(0) - {} - - //-------------------------------------------------------------------- - void reset(int min_x, int max_x) - { - unsigned max_len = max_x - min_x + 2; - if(max_len > m_spans.size()) - { - m_spans.resize(max_len); - m_covers.resize(max_len); - } - m_last_x = 0x7FFFFFF0; - m_min_x = min_x; - m_cur_span = &m_spans[0]; - } - - //-------------------------------------------------------------------- - void add_cell(int x, unsigned cover) - { - x -= m_min_x; - m_covers[x] = (cover_type)cover; - if(x == m_last_x+1) - { - m_cur_span->len++; - } - else - { - m_cur_span++; - m_cur_span->x = (coord_type)(x + m_min_x); - m_cur_span->len = 1; - m_cur_span->covers = &m_covers[x]; - } - m_last_x = x; - } - - //-------------------------------------------------------------------- - void add_cells(int x, unsigned len, const cover_type* covers) - { - x -= m_min_x; - memcpy(&m_covers[x], covers, len * sizeof(cover_type)); - if(x == m_last_x+1) - { - m_cur_span->len += (coord_type)len; - } - else - { - m_cur_span++; - m_cur_span->x = (coord_type)(x + m_min_x); - m_cur_span->len = (coord_type)len; - m_cur_span->covers = &m_covers[x]; - } - m_last_x = x + len - 1; - } - - //-------------------------------------------------------------------- - void add_span(int x, unsigned len, unsigned cover) - { - x -= m_min_x; - memset(&m_covers[x], cover, len); - if(x == m_last_x+1) - { - m_cur_span->len += (coord_type)len; - } - else - { - m_cur_span++; - m_cur_span->x = (coord_type)(x + m_min_x); - m_cur_span->len = (coord_type)len; - m_cur_span->covers = &m_covers[x]; - } - m_last_x = x + len - 1; - } - - //-------------------------------------------------------------------- - void finalize(int y) - { - m_y = y; - } - - //-------------------------------------------------------------------- - void reset_spans() - { - m_last_x = 0x7FFFFFF0; - m_cur_span = &m_spans[0]; - } - - //-------------------------------------------------------------------- - int y() const { return m_y; } - unsigned num_spans() const { return unsigned(m_cur_span - &m_spans[0]); } - const_iterator begin() const { return &m_spans[1]; } - iterator begin() { return &m_spans[1]; } - - private: - scanline_u8(const self_type&); - const self_type& operator = (const self_type&); - - private: - int m_min_x; - int m_last_x; - int m_y; - pod_array m_covers; - pod_array m_spans; - span* m_cur_span; - }; - - - - - //==========================================================scanline_u8_am - // - // The scanline container with alpha-masking - // - //------------------------------------------------------------------------ - template - class scanline_u8_am : public scanline_u8 - { - public: - typedef scanline_u8 base_type; - typedef AlphaMask alpha_mask_type; - typedef base_type::cover_type cover_type; - typedef base_type::coord_type coord_type; - - scanline_u8_am() : base_type(), m_alpha_mask(0) {} - scanline_u8_am(const AlphaMask& am) : base_type(), m_alpha_mask(&am) {} - - //-------------------------------------------------------------------- - void finalize(int span_y) - { - base_type::finalize(span_y); - if(m_alpha_mask) - { - typename base_type::iterator span = base_type::begin(); - unsigned count = base_type::num_spans(); - do - { - m_alpha_mask->combine_hspan(span->x, - base_type::y(), - span->covers, - span->len); - ++span; - } - while(--count); - } - } - - private: - const AlphaMask* m_alpha_mask; - }; - - - - - //===========================================================scanline32_u8 - class scanline32_u8 - { - public: - typedef scanline32_u8 self_type; - typedef int8u cover_type; - typedef int32 coord_type; - - //-------------------------------------------------------------------- - struct span - { - span() {} - span(coord_type x_, coord_type len_, cover_type* covers_) : - x(x_), len(len_), covers(covers_) {} - - coord_type x; - coord_type len; - cover_type* covers; - }; - - typedef pod_bvector span_array_type; - - //-------------------------------------------------------------------- - class const_iterator - { - public: - const_iterator(const span_array_type& spans) : - m_spans(spans), - m_span_idx(0) - {} - - const span& operator*() const { return m_spans[m_span_idx]; } - const span* operator->() const { return &m_spans[m_span_idx]; } - - void operator ++ () { ++m_span_idx; } - - private: - const span_array_type& m_spans; - unsigned m_span_idx; - }; - - //-------------------------------------------------------------------- - class iterator - { - public: - iterator(span_array_type& spans) : - m_spans(spans), - m_span_idx(0) - {} - - span& operator*() { return m_spans[m_span_idx]; } - span* operator->() { return &m_spans[m_span_idx]; } - - void operator ++ () { ++m_span_idx; } - - private: - span_array_type& m_spans; - unsigned m_span_idx; - }; - - - - //-------------------------------------------------------------------- - scanline32_u8() : - m_min_x(0), - m_last_x(0x7FFFFFF0), - m_covers() - {} - - //-------------------------------------------------------------------- - void reset(int min_x, int max_x) - { - unsigned max_len = max_x - min_x + 2; - if(max_len > m_covers.size()) - { - m_covers.resize(max_len); - } - m_last_x = 0x7FFFFFF0; - m_min_x = min_x; - m_spans.remove_all(); - } - - //-------------------------------------------------------------------- - void add_cell(int x, unsigned cover) - { - x -= m_min_x; - m_covers[x] = cover_type(cover); - if(x == m_last_x+1) - { - m_spans.last().len++; - } - else - { - m_spans.add(span(coord_type(x + m_min_x), 1, &m_covers[x])); - } - m_last_x = x; - } - - //-------------------------------------------------------------------- - void add_cells(int x, unsigned len, const cover_type* covers) - { - x -= m_min_x; - memcpy(&m_covers[x], covers, len * sizeof(cover_type)); - if(x == m_last_x+1) - { - m_spans.last().len += coord_type(len); - } - else - { - m_spans.add(span(coord_type(x + m_min_x), - coord_type(len), - &m_covers[x])); - } - m_last_x = x + len - 1; - } - - //-------------------------------------------------------------------- - void add_span(int x, unsigned len, unsigned cover) - { - x -= m_min_x; - memset(&m_covers[x], cover, len); - if(x == m_last_x+1) - { - m_spans.last().len += coord_type(len); - } - else - { - m_spans.add(span(coord_type(x + m_min_x), - coord_type(len), - &m_covers[x])); - } - m_last_x = x + len - 1; - } - - //-------------------------------------------------------------------- - void finalize(int y) - { - m_y = y; - } - - //-------------------------------------------------------------------- - void reset_spans() - { - m_last_x = 0x7FFFFFF0; - m_spans.remove_all(); - } - - //-------------------------------------------------------------------- - int y() const { return m_y; } - unsigned num_spans() const { return m_spans.size(); } - const_iterator begin() const { return const_iterator(m_spans); } - iterator begin() { return iterator(m_spans); } - - private: - scanline32_u8(const self_type&); - const self_type& operator = (const self_type&); - - private: - int m_min_x; - int m_last_x; - int m_y; - pod_array m_covers; - span_array_type m_spans; - }; - - - - - //========================================================scanline32_u8_am - // - // The scanline container with alpha-masking - // - //------------------------------------------------------------------------ - template - class scanline32_u8_am : public scanline32_u8 - { - public: - typedef scanline_u8 base_type; - typedef AlphaMask alpha_mask_type; - typedef base_type::cover_type cover_type; - typedef base_type::coord_type coord_type; - - - scanline32_u8_am() : base_type(), m_alpha_mask(0) {} - scanline32_u8_am(const AlphaMask& am) : base_type(), m_alpha_mask(&am) {} - - //-------------------------------------------------------------------- - void finalize(int span_y) - { - base_type::finalize(span_y); - if(m_alpha_mask) - { - typename base_type::iterator span = base_type::begin(); - unsigned count = base_type::num_spans(); - do - { - m_alpha_mask->combine_hspan(span->x, - base_type::y(), - span->covers, - span->len); - ++span; - } - while(--count); - } - } - - private: - const AlphaMask* m_alpha_mask; - }; - - - -} - -#endif - diff --git a/uppdev/agg24/agg_shorten_path.h b/uppdev/agg24/agg_shorten_path.h deleted file mode 100644 index dd9929ff9..000000000 --- a/uppdev/agg24/agg_shorten_path.h +++ /dev/null @@ -1,66 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_SHORTEN_PATH_INCLUDED -#define AGG_SHORTEN_PATH_INCLUDED - -#include "agg_basics.h" -#include "agg_vertex_sequence.h" - -namespace agg -{ - - //===========================================================shorten_path - template - void shorten_path(VertexSequence& vs, double s, unsigned closed = 0) - { - typedef typename VertexSequence::value_type vertex_type; - - if(s > 0.0 && vs.size() > 1) - { - double d; - int n = int(vs.size() - 2); - while(n) - { - d = vs[n].dist; - if(d > s) break; - vs.remove_last(); - s -= d; - --n; - } - if(vs.size() < 2) - { - vs.remove_all(); - } - else - { - n = vs.size() - 1; - vertex_type& prev = vs[n-1]; - vertex_type& last = vs[n]; - d = (prev.dist - s) / prev.dist; - double x = prev.x + (last.x - prev.x) * d; - double y = prev.y + (last.y - prev.y) * d; - last.x = x; - last.y = y; - if(!prev(last)) vs.remove_last(); - vs.close(closed != 0); - } - } - } - - -} - -#endif diff --git a/uppdev/agg24/agg_simul_eq.h b/uppdev/agg24/agg_simul_eq.h deleted file mode 100644 index 3d0dce4b4..000000000 --- a/uppdev/agg24/agg_simul_eq.h +++ /dev/null @@ -1,147 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Solving simultaneous equations -// -//---------------------------------------------------------------------------- -#ifndef AGG_SIMUL_EQ_INCLUDED -#define AGG_SIMUL_EQ_INCLUDED - -#include -#include "agg_basics.h" - -namespace agg -{ - - //=============================================================swap_arrays - template void swap_arrays(T* a1, T* a2, unsigned n) - { - unsigned i; - for(i = 0; i < n; i++) - { - T tmp = *a1; - *a1++ = *a2; - *a2++ = tmp; - } - } - - - //============================================================matrix_pivot - template - struct matrix_pivot - { - static int pivot(double m[Rows][Cols], unsigned row) - { - int k = int(row); - double max_val, tmp; - - max_val = -1.0; - unsigned i; - for(i = row; i < Rows; i++) - { - if((tmp = fabs(m[i][row])) > max_val && tmp != 0.0) - { - max_val = tmp; - k = i; - } - } - - if(m[k][row] == 0.0) - { - return -1; - } - - if(k != int(row)) - { - swap_arrays(m[k], m[row], Cols); - return k; - } - return 0; - } - }; - - - - //===============================================================simul_eq - template - struct simul_eq - { - static bool solve(const double left[Size][Size], - const double right[Size][RightCols], - double result[Size][RightCols]) - { - unsigned i, j, k; - double a1; - - double tmp[Size][Size + RightCols]; - - for(i = 0; i < Size; i++) - { - for(j = 0; j < Size; j++) - { - tmp[i][j] = left[i][j]; - } - for(j = 0; j < RightCols; j++) - { - tmp[i][Size + j] = right[i][j]; - } - } - - for(k = 0; k < Size; k++) - { - if(matrix_pivot::pivot(tmp, k) < 0) - { - return false; // Singularity.... - } - - a1 = tmp[k][k]; - - for(j = k; j < Size + RightCols; j++) - { - tmp[k][j] /= a1; - } - - for(i = k + 1; i < Size; i++) - { - a1 = tmp[i][k]; - for (j = k; j < Size + RightCols; j++) - { - tmp[i][j] -= a1 * tmp[k][j]; - } - } - } - - - for(k = 0; k < RightCols; k++) - { - int m; - for(m = int(Size - 1); m >= 0; m--) - { - result[m][k] = tmp[m][Size + k]; - for(j = m + 1; j < Size; j++) - { - result[m][k] -= tmp[m][j] * result[j][k]; - } - } - } - return true; - } - - }; - - -} - -#endif diff --git a/uppdev/agg24/agg_slider_ctrl.cpp b/uppdev/agg24/agg_slider_ctrl.cpp deleted file mode 100644 index 543c99168..000000000 --- a/uppdev/agg24/agg_slider_ctrl.cpp +++ /dev/null @@ -1,349 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// classes slider_ctrl_impl, slider_ctrl -// -//---------------------------------------------------------------------------- - -#include -#include -#include "agg_slider_ctrl.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - slider_ctrl_impl::slider_ctrl_impl(double x1, double y1, - double x2, double y2, bool flip_y) : - ctrl(x1, y1, x2, y2, flip_y), - m_border_width(1.0), - m_border_extra((y2 - y1) / 2), - m_text_thickness(1.0), - m_pdx(0.0), - m_mouse_move(false), - m_value(0.5), - m_preview_value(0.5), - m_min(0.0), - m_max(1.0), - m_num_steps(0), - m_descending(false), - m_text_poly(m_text) - { - m_label[0] = 0; - calc_box(); - } - - - //------------------------------------------------------------------------ - void slider_ctrl_impl::calc_box() - { - m_xs1 = m_x1 + m_border_width; - m_ys1 = m_y1 + m_border_width; - m_xs2 = m_x2 - m_border_width; - m_ys2 = m_y2 - m_border_width; - } - - - //------------------------------------------------------------------------ - bool slider_ctrl_impl::normalize_value(bool preview_value_flag) - { - bool ret = true; - if(m_num_steps) - { - int step = int(m_preview_value * m_num_steps + 0.5); - ret = m_value != step / double(m_num_steps); - m_value = step / double(m_num_steps); - } - else - { - m_value = m_preview_value; - } - - if(preview_value_flag) - { - m_preview_value = m_value; - } - return ret; - } - - - //------------------------------------------------------------------------ - void slider_ctrl_impl::border_width(double t, double extra) - { - m_border_width = t; - m_border_extra = extra; - calc_box(); - } - - - //------------------------------------------------------------------------ - void slider_ctrl_impl::value(double value) - { - m_preview_value = (value - m_min) / (m_max - m_min); - if(m_preview_value > 1.0) m_preview_value = 1.0; - if(m_preview_value < 0.0) m_preview_value = 0.0; - normalize_value(true); - } - - //------------------------------------------------------------------------ - void slider_ctrl_impl::label(const char* fmt) - { - m_label[0] = 0; - if(fmt) - { - unsigned len = strlen(fmt); - if(len > 63) len = 63; - memcpy(m_label, fmt, len); - m_label[len] = 0; - } - } - - //------------------------------------------------------------------------ - void slider_ctrl_impl::rewind(unsigned idx) - { - m_idx = idx; - - switch(idx) - { - default: - - case 0: // Background - m_vertex = 0; - m_vx[0] = m_x1 - m_border_extra; - m_vy[0] = m_y1 - m_border_extra; - m_vx[1] = m_x2 + m_border_extra; - m_vy[1] = m_y1 - m_border_extra; - m_vx[2] = m_x2 + m_border_extra; - m_vy[2] = m_y2 + m_border_extra; - m_vx[3] = m_x1 - m_border_extra; - m_vy[3] = m_y2 + m_border_extra; - break; - - case 1: // Triangle - m_vertex = 0; - if(m_descending) - { - m_vx[0] = m_x1; - m_vy[0] = m_y1; - m_vx[1] = m_x2; - m_vy[1] = m_y1; - m_vx[2] = m_x1; - m_vy[2] = m_y2; - m_vx[3] = m_x1; - m_vy[3] = m_y1; - } - else - { - m_vx[0] = m_x1; - m_vy[0] = m_y1; - m_vx[1] = m_x2; - m_vy[1] = m_y1; - m_vx[2] = m_x2; - m_vy[2] = m_y2; - m_vx[3] = m_x1; - m_vy[3] = m_y1; - } - break; - - case 2: - m_text.text(m_label); - if(m_label[0]) - { - char buf[256]; - sprintf(buf, m_label, value()); - m_text.text(buf); - } - m_text.start_point(m_x1, m_y1); - m_text.size((m_y2 - m_y1) * 1.2, m_y2 - m_y1); - m_text_poly.width(m_text_thickness); - m_text_poly.line_join(round_join); - m_text_poly.line_cap(round_cap); - m_text_poly.rewind(0); - break; - - case 3: // pointer preview - m_ellipse.init(m_xs1 + (m_xs2 - m_xs1) * m_preview_value, - (m_ys1 + m_ys2) / 2.0, - m_y2 - m_y1, - m_y2 - m_y1, - 32); - break; - - - case 4: // pointer - normalize_value(false); - m_ellipse.init(m_xs1 + (m_xs2 - m_xs1) * m_value, - (m_ys1 + m_ys2) / 2.0, - m_y2 - m_y1, - m_y2 - m_y1, - 32); - m_ellipse.rewind(0); - break; - - case 5: - m_storage.remove_all(); - if(m_num_steps) - { - unsigned i; - double d = (m_xs2 - m_xs1) / m_num_steps; - if(d > 0.004) d = 0.004; - for(i = 0; i < m_num_steps + 1; i++) - { - double x = m_xs1 + (m_xs2 - m_xs1) * i / m_num_steps; - m_storage.move_to(x, m_y1); - m_storage.line_to(x - d * (m_x2 - m_x1), m_y1 - m_border_extra); - m_storage.line_to(x + d * (m_x2 - m_x1), m_y1 - m_border_extra); - } - } - } - } - - - //------------------------------------------------------------------------ - unsigned slider_ctrl_impl::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_line_to; - switch(m_idx) - { - case 0: - if(m_vertex == 0) cmd = path_cmd_move_to; - if(m_vertex >= 4) cmd = path_cmd_stop; - *x = m_vx[m_vertex]; - *y = m_vy[m_vertex]; - m_vertex++; - break; - - case 1: - if(m_vertex == 0) cmd = path_cmd_move_to; - if(m_vertex >= 4) cmd = path_cmd_stop; - *x = m_vx[m_vertex]; - *y = m_vy[m_vertex]; - m_vertex++; - break; - - case 2: - cmd = m_text_poly.vertex(x, y); - break; - - case 3: - case 4: - cmd = m_ellipse.vertex(x, y); - break; - - case 5: - cmd = m_storage.vertex(x, y); - break; - - default: - cmd = path_cmd_stop; - break; - } - - if(!is_stop(cmd)) - { - transform_xy(x, y); - } - - return cmd; - } - - - - //------------------------------------------------------------------------ - bool slider_ctrl_impl::in_rect(double x, double y) const - { - inverse_transform_xy(&x, &y); - return x >= m_x1 && x <= m_x2 && y >= m_y1 && y <= m_y2; - } - - - //------------------------------------------------------------------------ - bool slider_ctrl_impl::on_mouse_button_down(double x, double y) - { - inverse_transform_xy(&x, &y); - - double xp = m_xs1 + (m_xs2 - m_xs1) * m_value; - double yp = (m_ys1 + m_ys2) / 2.0; - - if(calc_distance(x, y, xp, yp) <= m_y2 - m_y1) - { - m_pdx = xp - x; - m_mouse_move = true; - return true; - } - return false; - } - - - //------------------------------------------------------------------------ - bool slider_ctrl_impl::on_mouse_move(double x, double y, bool button_flag) - { - inverse_transform_xy(&x, &y); - if(!button_flag) - { - on_mouse_button_up(x, y); - return false; - } - - if(m_mouse_move) - { - double xp = x + m_pdx; - m_preview_value = (xp - m_xs1) / (m_xs2 - m_xs1); - if(m_preview_value < 0.0) m_preview_value = 0.0; - if(m_preview_value > 1.0) m_preview_value = 1.0; - return true; - } - return false; - } - - - //------------------------------------------------------------------------ - bool slider_ctrl_impl::on_mouse_button_up(double, double) - { - m_mouse_move = false; - normalize_value(true); - return true; - } - - - //------------------------------------------------------------------------ - bool slider_ctrl_impl::on_arrow_keys(bool left, bool right, bool down, bool up) - { - double d = 0.005; - if(m_num_steps) - { - d = 1.0 / m_num_steps; - } - - if(right || up) - { - m_preview_value += d; - if(m_preview_value > 1.0) m_preview_value = 1.0; - normalize_value(true); - return true; - } - - if(left || down) - { - m_preview_value -= d; - if(m_preview_value < 0.0) m_preview_value = 0.0; - normalize_value(true); - return true; - } - return false; - } - -} - diff --git a/uppdev/agg24/agg_slider_ctrl.h b/uppdev/agg24/agg_slider_ctrl.h deleted file mode 100644 index b50a95c59..000000000 --- a/uppdev/agg24/agg_slider_ctrl.h +++ /dev/null @@ -1,150 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// classes slider_ctrl_impl, slider_ctrl -// -//---------------------------------------------------------------------------- - -#ifndef AGG_SLIDER_CTRL_INCLUDED -#define AGG_SLIDER_CTRL_INCLUDED - -#include "agg_basics.h" -#include "agg_math.h" -#include "agg_ellipse.h" -#include "agg_trans_affine.h" -#include "agg_color_rgba.h" -#include "agg_gsv_text.h" -#include "agg_conv_stroke.h" -#include "agg_path_storage.h" -#include "agg_ctrl.h" - - -namespace agg -{ - - //--------------------------------------------------------slider_ctrl_impl - class slider_ctrl_impl : public ctrl - { - public: - slider_ctrl_impl(double x1, double y1, double x2, double y2, bool flip_y=false); - - void border_width(double t, double extra=0.0); - - void range(double min, double max) { m_min = min; m_max = max; } - void num_steps(unsigned num) { m_num_steps = num; } - void label(const char* fmt); - void text_thickness(double t) { m_text_thickness = t; } - - bool descending() const { return m_descending; } - void descending(bool v) { m_descending = v; } - - double value() const { return m_value * (m_max - m_min) + m_min; } - void value(double value); - - virtual bool in_rect(double x, double y) const; - virtual bool on_mouse_button_down(double x, double y); - virtual bool on_mouse_button_up(double x, double y); - virtual bool on_mouse_move(double x, double y, bool button_flag); - virtual bool on_arrow_keys(bool left, bool right, bool down, bool up); - - // Vertex source interface - unsigned num_paths() { return 6; }; - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - void calc_box(); - bool normalize_value(bool preview_value_flag); - - double m_border_width; - double m_border_extra; - double m_text_thickness; - double m_value; - double m_preview_value; - double m_min; - double m_max; - unsigned m_num_steps; - bool m_descending; - char m_label[64]; - double m_xs1; - double m_ys1; - double m_xs2; - double m_ys2; - double m_pdx; - bool m_mouse_move; - double m_vx[32]; - double m_vy[32]; - - ellipse m_ellipse; - - unsigned m_idx; - unsigned m_vertex; - - gsv_text m_text; - conv_stroke m_text_poly; - path_storage m_storage; - - }; - - - - //----------------------------------------------------------slider_ctrl - template class slider_ctrl : public slider_ctrl_impl - { - public: - slider_ctrl(double x1, double y1, double x2, double y2, bool flip_y=false) : - slider_ctrl_impl(x1, y1, x2, y2, flip_y), - m_background_color(rgba(1.0, 0.9, 0.8)), - m_triangle_color(rgba(0.7, 0.6, 0.6)), - m_text_color(rgba(0.0, 0.0, 0.0)), - m_pointer_preview_color(rgba(0.6, 0.4, 0.4, 0.4)), - m_pointer_color(rgba(0.8, 0.0, 0.0, 0.6)) - { - m_colors[0] = &m_background_color; - m_colors[1] = &m_triangle_color; - m_colors[2] = &m_text_color; - m_colors[3] = &m_pointer_preview_color; - m_colors[4] = &m_pointer_color; - m_colors[5] = &m_text_color; - } - - - void background_color(const ColorT& c) { m_background_color = c; } - void pointer_color(const ColorT& c) { m_pointer_color = c; } - - const ColorT& color(unsigned i) const { return *m_colors[i]; } - - private: - slider_ctrl(const slider_ctrl&); - const slider_ctrl& operator = (const slider_ctrl&); - - ColorT m_background_color; - ColorT m_triangle_color; - ColorT m_text_color; - ColorT m_pointer_preview_color; - ColorT m_pointer_color; - ColorT* m_colors[6]; - }; - - - - - -} - - - -#endif - diff --git a/uppdev/agg24/agg_span_allocator.h b/uppdev/agg24/agg_span_allocator.h deleted file mode 100644 index 201b69bb0..000000000 --- a/uppdev/agg24/agg_span_allocator.h +++ /dev/null @@ -1,54 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_SPAN_ALLOCATOR_INCLUDED -#define AGG_SPAN_ALLOCATOR_INCLUDED - -#include "agg_array.h" - -namespace agg -{ - //----------------------------------------------------------span_allocator - template class span_allocator - { - public: - typedef ColorT color_type; - - //-------------------------------------------------------------------- - AGG_INLINE color_type* allocate(unsigned span_len) - { - if(span_len > m_span.size()) - { - // To reduce the number of reallocs we align the - // span_len to 256 color elements. - // Well, I just like this number and it looks reasonable. - //----------------------- - m_span.resize(((span_len + 255) >> 8) << 8); - } - return &m_span[0]; - } - - AGG_INLINE color_type* span() { return &m_span[0]; } - AGG_INLINE unsigned max_span_len() const { return m_span.size(); } - - private: - pod_array m_span; - }; -} - - -#endif - - diff --git a/uppdev/agg24/agg_span_converter.h b/uppdev/agg24/agg_span_converter.h deleted file mode 100644 index 91d0f87c2..000000000 --- a/uppdev/agg24/agg_span_converter.h +++ /dev/null @@ -1,56 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_SPAN_CONVERTER_INCLUDED -#define AGG_SPAN_CONVERTER_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - //----------------------------------------------------------span_converter - template class span_converter - { - public: - typedef typename SpanGenerator::color_type color_type; - - span_converter(SpanGenerator& span_gen, SpanConverter& span_cnv) : - m_span_gen(&span_gen), m_span_cnv(&span_cnv) {} - - void attach_generator(SpanGenerator& span_gen) { m_span_gen = &span_gen; } - void attach_converter(SpanConverter& span_cnv) { m_span_cnv = &span_cnv; } - - //-------------------------------------------------------------------- - void prepare() - { - m_span_gen->prepare(); - m_span_cnv->prepare(); - } - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - m_span_gen->generate(span, x, y, len); - m_span_cnv->generate(span, x, y, len); - } - - private: - SpanGenerator* m_span_gen; - SpanConverter* m_span_cnv; - }; - -} - -#endif diff --git a/uppdev/agg24/agg_span_gouraud.h b/uppdev/agg24/agg_span_gouraud.h deleted file mode 100644 index 2986c88fe..000000000 --- a/uppdev/agg24/agg_span_gouraud.h +++ /dev/null @@ -1,172 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_SPAN_GOURAUD_INCLUDED -#define AGG_SPAN_GOURAUD_INCLUDED - -#include "agg_basics.h" -#include "agg_math.h" - -namespace agg -{ - - //============================================================span_gouraud - template class span_gouraud - { - public: - typedef ColorT color_type; - - struct coord_type - { - double x; - double y; - color_type color; - }; - - //-------------------------------------------------------------------- - span_gouraud() : - m_vertex(0) - { - m_cmd[0] = path_cmd_stop; - } - - //-------------------------------------------------------------------- - span_gouraud(const color_type& c1, - const color_type& c2, - const color_type& c3, - double x1, double y1, - double x2, double y2, - double x3, double y3, - double d) : - m_vertex(0) - { - colors(c1, c2, c3); - triangle(x1, y1, x2, y2, x3, y3, d); - } - - //-------------------------------------------------------------------- - void colors(ColorT c1, ColorT c2, ColorT c3) - { - m_coord[0].color = c1; - m_coord[1].color = c2; - m_coord[2].color = c3; - } - - //-------------------------------------------------------------------- - // Sets the triangle and dilates it if needed. - // The trick here is to calculate beveled joins in the vertices of the - // triangle and render it as a 6-vertex polygon. - // It's necessary to achieve numerical stability. - // However, the coordinates to interpolate colors are calculated - // as miter joins (calc_intersection). - void triangle(double x1, double y1, - double x2, double y2, - double x3, double y3, - double d) - { - m_coord[0].x = m_x[0] = x1; - m_coord[0].y = m_y[0] = y1; - m_coord[1].x = m_x[1] = x2; - m_coord[1].y = m_y[1] = y2; - m_coord[2].x = m_x[2] = x3; - m_coord[2].y = m_y[2] = y3; - m_cmd[0] = path_cmd_move_to; - m_cmd[1] = path_cmd_line_to; - m_cmd[2] = path_cmd_line_to; - m_cmd[3] = path_cmd_stop; - - if(d != 0.0) - { - dilate_triangle(m_coord[0].x, m_coord[0].y, - m_coord[1].x, m_coord[1].y, - m_coord[2].x, m_coord[2].y, - m_x, m_y, d); - - calc_intersection(m_x[4], m_y[4], m_x[5], m_y[5], - m_x[0], m_y[0], m_x[1], m_y[1], - &m_coord[0].x, &m_coord[0].y); - - calc_intersection(m_x[0], m_y[0], m_x[1], m_y[1], - m_x[2], m_y[2], m_x[3], m_y[3], - &m_coord[1].x, &m_coord[1].y); - - calc_intersection(m_x[2], m_y[2], m_x[3], m_y[3], - m_x[4], m_y[4], m_x[5], m_y[5], - &m_coord[2].x, &m_coord[2].y); - m_cmd[3] = path_cmd_line_to; - m_cmd[4] = path_cmd_line_to; - m_cmd[5] = path_cmd_line_to; - m_cmd[6] = path_cmd_stop; - } - } - - //-------------------------------------------------------------------- - // Vertex Source Interface to feed the coordinates to the rasterizer - void rewind(unsigned) - { - m_vertex = 0; - } - - //-------------------------------------------------------------------- - unsigned vertex(double* x, double* y) - { - *x = m_x[m_vertex]; - *y = m_y[m_vertex]; - return m_cmd[m_vertex++]; - } - - protected: - //-------------------------------------------------------------------- - void arrange_vertices(coord_type* coord) const - { - coord[0] = m_coord[0]; - coord[1] = m_coord[1]; - coord[2] = m_coord[2]; - - if(m_coord[0].y > m_coord[2].y) - { - coord[0] = m_coord[2]; - coord[2] = m_coord[0]; - } - - coord_type tmp; - if(coord[0].y > coord[1].y) - { - tmp = coord[1]; - coord[1] = coord[0]; - coord[0] = tmp; - } - - if(coord[1].y > coord[2].y) - { - tmp = coord[2]; - coord[2] = coord[1]; - coord[1] = tmp; - } - } - - private: - //-------------------------------------------------------------------- - coord_type m_coord[3]; - double m_x[8]; - double m_y[8]; - unsigned m_cmd[8]; - unsigned m_vertex; - }; - -} - -#endif - diff --git a/uppdev/agg24/agg_span_gouraud_gray.h b/uppdev/agg24/agg_span_gouraud_gray.h deleted file mode 100644 index d5fc39d10..000000000 --- a/uppdev/agg24/agg_span_gouraud_gray.h +++ /dev/null @@ -1,241 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Adaptation for high precision colors has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- - -#ifndef AGG_SPAN_GOURAUD_GRAY_INCLUDED -#define AGG_SPAN_GOURAUD_GRAY_INCLUDED - -#include "agg_basics.h" -#include "agg_color_gray.h" -#include "agg_dda_line.h" -#include "agg_span_gouraud.h" - -namespace agg -{ - - //=======================================================span_gouraud_gray - template class span_gouraud_gray : public span_gouraud - { - public: - typedef ColorT color_type; - typedef typename color_type::value_type value_type; - typedef span_gouraud base_type; - typedef typename base_type::coord_type coord_type; - enum subpixel_scale_e - { - subpixel_shift = 4, - subpixel_scale = 1 << subpixel_shift - }; - - private: - //-------------------------------------------------------------------- - struct gray_calc - { - void init(const coord_type& c1, const coord_type& c2) - { - m_x1 = c1.x - 0.5; - m_y1 = c1.y - 0.5; - m_dx = c2.x - c1.x; - double dy = c2.y - c1.y; - m_1dy = (fabs(dy) < 1e-10) ? 1e10 : 1.0 / dy; - m_v1 = c1.color.v; - m_a1 = c1.color.a; - m_dv = c2.color.v - m_v1; - m_da = c2.color.a - m_a1; - } - - void calc(double y) - { - double k = (y - m_y1) * m_1dy; - if(k < 0.0) k = 0.0; - if(k > 1.0) k = 1.0; - m_v = m_v1 + iround(m_dv * k); - m_a = m_a1 + iround(m_da * k); - m_x = iround((m_x1 + m_dx * k) * subpixel_scale); - } - - double m_x1; - double m_y1; - double m_dx; - double m_1dy; - int m_v1; - int m_a1; - int m_dv; - int m_da; - int m_v; - int m_a; - int m_x; - }; - - - public: - //-------------------------------------------------------------------- - span_gouraud_gray() {} - span_gouraud_gray(const color_type& c1, - const color_type& c2, - const color_type& c3, - double x1, double y1, - double x2, double y2, - double x3, double y3, - double d = 0) : - base_type(c1, c2, c3, x1, y1, x2, y2, x3, y3, d) - {} - - //-------------------------------------------------------------------- - void prepare() - { - coord_type coord[3]; - base_type::arrange_vertices(coord); - - m_y2 = int(coord[1].y); - - m_swap = cross_product(coord[0].x, coord[0].y, - coord[2].x, coord[2].y, - coord[1].x, coord[1].y) < 0.0; - - m_c1.init(coord[0], coord[2]); - m_c2.init(coord[0], coord[1]); - m_c3.init(coord[1], coord[2]); - } - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - m_c1.calc(y); - const gray_calc* pc1 = &m_c1; - const gray_calc* pc2 = &m_c2; - - if(y < m_y2) - { - // Bottom part of the triangle (first subtriangle) - //------------------------- - m_c2.calc(y + m_c2.m_1dy); - } - else - { - // Upper part (second subtriangle) - //------------------------- - m_c3.calc(y - m_c3.m_1dy); - pc2 = &m_c3; - } - - if(m_swap) - { - // It means that the triangle is oriented clockwise, - // so that we need to swap the controlling structures - //------------------------- - const gray_calc* t = pc2; - pc2 = pc1; - pc1 = t; - } - - // Get the horizontal length with subpixel accuracy - // and protect it from division by zero - //------------------------- - int nlen = abs(pc2->m_x - pc1->m_x); - if(nlen <= 0) nlen = 1; - - dda_line_interpolator<14> v(pc1->m_v, pc2->m_v, nlen); - dda_line_interpolator<14> a(pc1->m_a, pc2->m_a, nlen); - - // Calculate the starting point of the gradient with subpixel - // accuracy and correct (roll back) the interpolators. - // This operation will also clip the beginning of the span - // if necessary. - //------------------------- - int start = pc1->m_x - (x << subpixel_shift); - v -= start; - a -= start; - nlen += start; - - int vv, va; - enum lim_e { lim = color_type::base_mask }; - - // Beginning part of the span. Since we rolled back the - // interpolators, the color values may have overflow. - // So that, we render the beginning part with checking - // for overflow. It lasts until "start" is positive; - // typically it's 1-2 pixels, but may be more in some cases. - //------------------------- - while(len && start > 0) - { - vv = v.y(); - va = a.y(); - if(vv < 0) vv = 0; if(vv > lim) vv = lim; - if(va < 0) va = 0; if(va > lim) va = lim; - span->v = (value_type)vv; - span->a = (value_type)va; - v += subpixel_scale; - a += subpixel_scale; - nlen -= subpixel_scale; - start -= subpixel_scale; - ++span; - --len; - } - - // Middle part, no checking for overflow. - // Actual spans can be longer than the calculated length - // because of anti-aliasing, thus, the interpolators can - // overflow. But while "nlen" is positive we are safe. - //------------------------- - while(len && nlen > 0) - { - span->v = (value_type)v.y(); - span->a = (value_type)a.y(); - v += subpixel_scale; - a += subpixel_scale; - nlen -= subpixel_scale; - ++span; - --len; - } - - // Ending part; checking for overflow. - // Typically it's 1-2 pixels, but may be more in some cases. - //------------------------- - while(len) - { - vv = v.y(); - va = a.y(); - if(vv < 0) vv = 0; if(vv > lim) vv = lim; - if(va < 0) va = 0; if(va > lim) va = lim; - span->v = (value_type)vv; - span->a = (value_type)va; - v += subpixel_scale; - a += subpixel_scale; - ++span; - --len; - } - } - - - private: - bool m_swap; - int m_y2; - gray_calc m_c1; - gray_calc m_c2; - gray_calc m_c3; - }; - - -} - -#endif diff --git a/uppdev/agg24/agg_span_gouraud_rgba.h b/uppdev/agg24/agg_span_gouraud_rgba.h deleted file mode 100644 index 89192d227..000000000 --- a/uppdev/agg24/agg_span_gouraud_rgba.h +++ /dev/null @@ -1,277 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Adaptation for high precision colors has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- - -#ifndef AGG_SPAN_GOURAUD_RGBA_INCLUDED -#define AGG_SPAN_GOURAUD_RGBA_INCLUDED - -#include "agg_basics.h" -#include "agg_color_rgba.h" -#include "agg_dda_line.h" -#include "agg_span_gouraud.h" - -namespace agg -{ - - //=======================================================span_gouraud_rgba - template class span_gouraud_rgba : public span_gouraud - { - public: - typedef ColorT color_type; - typedef typename ColorT::value_type value_type; - typedef span_gouraud base_type; - typedef typename base_type::coord_type coord_type; - enum subpixel_scale_e - { - subpixel_shift = 4, - subpixel_scale = 1 << subpixel_shift - }; - - private: - //-------------------------------------------------------------------- - struct rgba_calc - { - void init(const coord_type& c1, const coord_type& c2) - { - m_x1 = c1.x - 0.5; - m_y1 = c1.y - 0.5; - m_dx = c2.x - c1.x; - double dy = c2.y - c1.y; - m_1dy = (dy < 1e-5) ? 1e5 : 1.0 / dy; - m_r1 = c1.color.r; - m_g1 = c1.color.g; - m_b1 = c1.color.b; - m_a1 = c1.color.a; - m_dr = c2.color.r - m_r1; - m_dg = c2.color.g - m_g1; - m_db = c2.color.b - m_b1; - m_da = c2.color.a - m_a1; - } - - void calc(double y) - { - double k = (y - m_y1) * m_1dy; - if(k < 0.0) k = 0.0; - if(k > 1.0) k = 1.0; - m_r = m_r1 + iround(m_dr * k); - m_g = m_g1 + iround(m_dg * k); - m_b = m_b1 + iround(m_db * k); - m_a = m_a1 + iround(m_da * k); - m_x = iround((m_x1 + m_dx * k) * subpixel_scale); - } - - double m_x1; - double m_y1; - double m_dx; - double m_1dy; - int m_r1; - int m_g1; - int m_b1; - int m_a1; - int m_dr; - int m_dg; - int m_db; - int m_da; - int m_r; - int m_g; - int m_b; - int m_a; - int m_x; - }; - - public: - - //-------------------------------------------------------------------- - span_gouraud_rgba() {} - span_gouraud_rgba(const color_type& c1, - const color_type& c2, - const color_type& c3, - double x1, double y1, - double x2, double y2, - double x3, double y3, - double d = 0) : - base_type(c1, c2, c3, x1, y1, x2, y2, x3, y3, d) - {} - - //-------------------------------------------------------------------- - void prepare() - { - coord_type coord[3]; - base_type::arrange_vertices(coord); - - m_y2 = int(coord[1].y); - - m_swap = cross_product(coord[0].x, coord[0].y, - coord[2].x, coord[2].y, - coord[1].x, coord[1].y) < 0.0; - - m_rgba1.init(coord[0], coord[2]); - m_rgba2.init(coord[0], coord[1]); - m_rgba3.init(coord[1], coord[2]); - } - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - m_rgba1.calc(y);//(m_rgba1.m_1dy > 2) ? m_rgba1.m_y1 : y); - const rgba_calc* pc1 = &m_rgba1; - const rgba_calc* pc2 = &m_rgba2; - - if(y <= m_y2) - { - // Bottom part of the triangle (first subtriangle) - //------------------------- - m_rgba2.calc(y + m_rgba2.m_1dy); - } - else - { - // Upper part (second subtriangle) - m_rgba3.calc(y - m_rgba3.m_1dy); - //------------------------- - pc2 = &m_rgba3; - } - - if(m_swap) - { - // It means that the triangle is oriented clockwise, - // so that we need to swap the controlling structures - //------------------------- - const rgba_calc* t = pc2; - pc2 = pc1; - pc1 = t; - } - - // Get the horizontal length with subpixel accuracy - // and protect it from division by zero - //------------------------- - int nlen = abs(pc2->m_x - pc1->m_x); - if(nlen <= 0) nlen = 1; - - dda_line_interpolator<14> r(pc1->m_r, pc2->m_r, nlen); - dda_line_interpolator<14> g(pc1->m_g, pc2->m_g, nlen); - dda_line_interpolator<14> b(pc1->m_b, pc2->m_b, nlen); - dda_line_interpolator<14> a(pc1->m_a, pc2->m_a, nlen); - - // Calculate the starting point of the gradient with subpixel - // accuracy and correct (roll back) the interpolators. - // This operation will also clip the beginning of the span - // if necessary. - //------------------------- - int start = pc1->m_x - (x << subpixel_shift); - r -= start; - g -= start; - b -= start; - a -= start; - nlen += start; - - int vr, vg, vb, va; - enum lim_e { lim = color_type::base_mask }; - - // Beginning part of the span. Since we rolled back the - // interpolators, the color values may have overflow. - // So that, we render the beginning part with checking - // for overflow. It lasts until "start" is positive; - // typically it's 1-2 pixels, but may be more in some cases. - //------------------------- - while(len && start > 0) - { - vr = r.y(); - vg = g.y(); - vb = b.y(); - va = a.y(); - if(vr < 0) vr = 0; if(vr > lim) vr = lim; - if(vg < 0) vg = 0; if(vg > lim) vg = lim; - if(vb < 0) vb = 0; if(vb > lim) vb = lim; - if(va < 0) va = 0; if(va > lim) va = lim; - span->r = (value_type)vr; - span->g = (value_type)vg; - span->b = (value_type)vb; - span->a = (value_type)va; - r += subpixel_scale; - g += subpixel_scale; - b += subpixel_scale; - a += subpixel_scale; - nlen -= subpixel_scale; - start -= subpixel_scale; - ++span; - --len; - } - - // Middle part, no checking for overflow. - // Actual spans can be longer than the calculated length - // because of anti-aliasing, thus, the interpolators can - // overflow. But while "nlen" is positive we are safe. - //------------------------- - while(len && nlen > 0) - { - span->r = (value_type)r.y(); - span->g = (value_type)g.y(); - span->b = (value_type)b.y(); - span->a = (value_type)a.y(); - r += subpixel_scale; - g += subpixel_scale; - b += subpixel_scale; - a += subpixel_scale; - nlen -= subpixel_scale; - ++span; - --len; - } - - // Ending part; checking for overflow. - // Typically it's 1-2 pixels, but may be more in some cases. - //------------------------- - while(len) - { - vr = r.y(); - vg = g.y(); - vb = b.y(); - va = a.y(); - if(vr < 0) vr = 0; if(vr > lim) vr = lim; - if(vg < 0) vg = 0; if(vg > lim) vg = lim; - if(vb < 0) vb = 0; if(vb > lim) vb = lim; - if(va < 0) va = 0; if(va > lim) va = lim; - span->r = (value_type)vr; - span->g = (value_type)vg; - span->b = (value_type)vb; - span->a = (value_type)va; - r += subpixel_scale; - g += subpixel_scale; - b += subpixel_scale; - a += subpixel_scale; - ++span; - --len; - } - } - - private: - bool m_swap; - int m_y2; - rgba_calc m_rgba1; - rgba_calc m_rgba2; - rgba_calc m_rgba3; - }; - - - -} - -#endif diff --git a/uppdev/agg24/agg_span_gradient.h b/uppdev/agg24/agg_span_gradient.h deleted file mode 100644 index 182f4683e..000000000 --- a/uppdev/agg24/agg_span_gradient.h +++ /dev/null @@ -1,361 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_SPAN_GRADIENT_INCLUDED -#define AGG_SPAN_GRADIENT_INCLUDED - -#include -#include -#include -#include "agg_basics.h" -#include "agg_math.h" -#include "agg_array.h" - - -namespace agg -{ - - enum gradient_subpixel_scale_e - { - gradient_subpixel_shift = 4, //-----gradient_subpixel_shift - gradient_subpixel_scale = 1 << gradient_subpixel_shift, //-----gradient_subpixel_scale - gradient_subpixel_mask = gradient_subpixel_scale - 1 //-----gradient_subpixel_mask - }; - - - - //==========================================================span_gradient - template - class span_gradient - { - public: - typedef Interpolator interpolator_type; - typedef ColorT color_type; - - enum downscale_shift_e - { - downscale_shift = interpolator_type::subpixel_shift - - gradient_subpixel_shift - }; - - //-------------------------------------------------------------------- - span_gradient() {} - - //-------------------------------------------------------------------- - span_gradient(interpolator_type& inter, - const GradientF& gradient_function, - const ColorF& color_function, - double d1, double d2) : - m_interpolator(&inter), - m_gradient_function(&gradient_function), - m_color_function(&color_function), - m_d1(iround(d1 * gradient_subpixel_scale)), - m_d2(iround(d2 * gradient_subpixel_scale)) - {} - - //-------------------------------------------------------------------- - interpolator_type& interpolator() { return *m_interpolator; } - const GradientF& gradient_function() const { return *m_gradient_function; } - const ColorF& color_function() const { return *m_color_function; } - double d1() const { return double(m_d1) / gradient_subpixel_scale; } - double d2() const { return double(m_d2) / gradient_subpixel_scale; } - - //-------------------------------------------------------------------- - void interpolator(interpolator_type& i) { m_interpolator = &i; } - void gradient_function(const GradientF& gf) { m_gradient_function = &gf; } - void color_function(const ColorF& cf) { m_color_function = &cf; } - void d1(double v) { m_d1 = iround(v * gradient_subpixel_scale); } - void d2(double v) { m_d2 = iround(v * gradient_subpixel_scale); } - - //-------------------------------------------------------------------- - void prepare() {} - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - int dd = m_d2 - m_d1; - if(dd < 1) dd = 1; - m_interpolator->begin(x+0.5, y+0.5, len); - do - { - m_interpolator->coordinates(&x, &y); - int d = m_gradient_function->calculate(x >> downscale_shift, - y >> downscale_shift, m_d2); - d = ((d - m_d1) * (int)m_color_function->size()) / dd; - if(d < 0) d = 0; - if(d >= (int)m_color_function->size()) d = m_color_function->size() - 1; - *span++ = (*m_color_function)[d]; - ++(*m_interpolator); - } - while(--len); - } - - private: - interpolator_type* m_interpolator; - const GradientF* m_gradient_function; - const ColorF* m_color_function; - int m_d1; - int m_d2; - }; - - - - - //=====================================================gradient_linear_color - template - struct gradient_linear_color - { - typedef ColorT color_type; - - gradient_linear_color() {} - gradient_linear_color(const color_type& c1, const color_type& c2, - unsigned size = 256) : - m_c1(c1), m_c2(c2), m_size(size) {} - - unsigned size() const { return m_size; } - color_type operator [] (unsigned v) const - { - return m_c1.gradient(m_c2, double(v) / double(m_size - 1)); - } - - void colors(const color_type& c1, const color_type& c2, unsigned size = 256) - { - m_c1 = c1; - m_c2 = c2; - m_size = size; - } - - color_type m_c1; - color_type m_c2; - unsigned m_size; - }; - - - - - - - //==========================================================gradient_circle - class gradient_circle - { - // Actually the same as radial. Just for compatibility - public: - static AGG_INLINE int calculate(int x, int y, int) - { - return int(fast_sqrt(x*x + y*y)); - } - }; - - - //==========================================================gradient_radial - class gradient_radial - { - public: - static AGG_INLINE int calculate(int x, int y, int) - { - return int(fast_sqrt(x*x + y*y)); - } - }; - - //========================================================gradient_radial_d - class gradient_radial_d - { - public: - static AGG_INLINE int calculate(int x, int y, int) - { - return uround(sqrt(double(x)*double(x) + double(y)*double(y))); - } - }; - - //====================================================gradient_radial_focus - class gradient_radial_focus - { - public: - //--------------------------------------------------------------------- - gradient_radial_focus() : - m_r(100 * gradient_subpixel_scale), - m_fx(0), - m_fy(0) - { - update_values(); - } - - //--------------------------------------------------------------------- - gradient_radial_focus(double r, double fx, double fy) : - m_r (iround(r * gradient_subpixel_scale)), - m_fx(iround(fx * gradient_subpixel_scale)), - m_fy(iround(fy * gradient_subpixel_scale)) - { - update_values(); - } - - //--------------------------------------------------------------------- - void init(double r, double fx, double fy) - { - m_r = iround(r * gradient_subpixel_scale); - m_fx = iround(fx * gradient_subpixel_scale); - m_fy = iround(fy * gradient_subpixel_scale); - update_values(); - } - - //--------------------------------------------------------------------- - double radius() const { return double(m_r) / gradient_subpixel_scale; } - double focus_x() const { return double(m_fx) / gradient_subpixel_scale; } - double focus_y() const { return double(m_fy) / gradient_subpixel_scale; } - - //--------------------------------------------------------------------- - int calculate(int x, int y, int) const - { - double dx = x - m_fx; - double dy = y - m_fy; - double d2 = dx * m_fy - dy * m_fx; - double d3 = m_r2 * (dx * dx + dy * dy) - d2 * d2; - return iround((dx * m_fx + dy * m_fy + sqrt(fabs(d3))) * m_mul); - } - - private: - //--------------------------------------------------------------------- - void update_values() - { - // Calculate the invariant values. In case the focal center - // lies exactly on the gradient circle the divisor degenerates - // into zero. In this case we just move the focal center by - // one subpixel unit possibly in the direction to the origin (0,0) - // and calculate the values again. - //------------------------- - m_r2 = double(m_r) * double(m_r); - m_fx2 = double(m_fx) * double(m_fx); - m_fy2 = double(m_fy) * double(m_fy); - double d = (m_r2 - (m_fx2 + m_fy2)); - if(d == 0) - { - if(m_fx) { if(m_fx < 0) ++m_fx; else --m_fx; } - if(m_fy) { if(m_fy < 0) ++m_fy; else --m_fy; } - m_fx2 = double(m_fx) * double(m_fx); - m_fy2 = double(m_fy) * double(m_fy); - d = (m_r2 - (m_fx2 + m_fy2)); - } - m_mul = m_r / d; - } - - int m_r; - int m_fx; - int m_fy; - double m_r2; - double m_fx2; - double m_fy2; - double m_mul; - }; - - - //==============================================================gradient_x - class gradient_x - { - public: - static int calculate(int x, int, int) { return x; } - }; - - - //==============================================================gradient_y - class gradient_y - { - public: - static int calculate(int, int y, int) { return y; } - }; - - //========================================================gradient_diamond - class gradient_diamond - { - public: - static AGG_INLINE int calculate(int x, int y, int) - { - int ax = abs(x); - int ay = abs(y); - return ax > ay ? ax : ay; - } - }; - - //=============================================================gradient_xy - class gradient_xy - { - public: - static AGG_INLINE int calculate(int x, int y, int d) - { - return abs(x) * abs(y) / d; - } - }; - - //========================================================gradient_sqrt_xy - class gradient_sqrt_xy - { - public: - static AGG_INLINE int calculate(int x, int y, int) - { - return fast_sqrt(abs(x) * abs(y)); - } - }; - - //==========================================================gradient_conic - class gradient_conic - { - public: - static AGG_INLINE int calculate(int x, int y, int d) - { - return uround(fabs(atan2(double(y), double(x))) * double(d) / pi); - } - }; - - //=================================================gradient_repeat_adaptor - template class gradient_repeat_adaptor - { - public: - gradient_repeat_adaptor(const GradientF& gradient) : - m_gradient(&gradient) {} - - AGG_INLINE int calculate(int x, int y, int d) const - { - int ret = m_gradient->calculate(x, y, d) % d; - if(ret < 0) ret += d; - return ret; - } - - private: - const GradientF* m_gradient; - }; - - //================================================gradient_reflect_adaptor - template class gradient_reflect_adaptor - { - public: - gradient_reflect_adaptor(const GradientF& gradient) : - m_gradient(&gradient) {} - - AGG_INLINE int calculate(int x, int y, int d) const - { - int d2 = d << 1; - int ret = m_gradient->calculate(x, y, d) % d2; - if(ret < 0) ret += d2; - if(ret >= d) ret = d2 - ret; - return ret; - } - - private: - const GradientF* m_gradient; - }; - - -} - -#endif diff --git a/uppdev/agg24/agg_span_gradient_alpha.h b/uppdev/agg24/agg_span_gradient_alpha.h deleted file mode 100644 index e6ee21655..000000000 --- a/uppdev/agg24/agg_span_gradient_alpha.h +++ /dev/null @@ -1,126 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_SPAN_GRADIENT_ALPHA_INCLUDED -#define AGG_SPAN_GRADIENT_ALPHA_INCLUDED - -#include "agg_span_gradient.h" - -namespace agg -{ - //======================================================span_gradient_alpha - template - class span_gradient_alpha - { - public: - typedef Interpolator interpolator_type; - typedef ColorT color_type; - typedef typename color_type::value_type alpha_type; - - enum downscale_shift_e - { - downscale_shift = interpolator_type::subpixel_shift - gradient_subpixel_shift - }; - - - //-------------------------------------------------------------------- - span_gradient_alpha() {} - - //-------------------------------------------------------------------- - span_gradient_alpha(interpolator_type& inter, - const GradientF& gradient_function, - const AlphaF& alpha_function, - double d1, double d2) : - m_interpolator(&inter), - m_gradient_function(&gradient_function), - m_alpha_function(&alpha_function), - m_d1(iround(d1 * gradient_subpixel_scale)), - m_d2(iround(d2 * gradient_subpixel_scale)) - {} - - //-------------------------------------------------------------------- - interpolator_type& interpolator() { return *m_interpolator; } - const GradientF& gradient_function() const { return *m_gradient_function; } - const AlphaF& alpha_function() const { return *m_alpha_function; } - double d1() const { return double(m_d1) / gradient_subpixel_scale; } - double d2() const { return double(m_d2) / gradient_subpixel_scale; } - - //-------------------------------------------------------------------- - void interpolator(interpolator_type& i) { m_interpolator = &i; } - void gradient_function(const GradientF& gf) { m_gradient_function = &gf; } - void alpha_function(const AlphaF& af) { m_alpha_function = ⁡ } - void d1(double v) { m_d1 = iround(v * gradient_subpixel_scale); } - void d2(double v) { m_d2 = iround(v * gradient_subpixel_scale); } - - //-------------------------------------------------------------------- - void prepare() {} - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - int dd = m_d2 - m_d1; - if(dd < 1) dd = 1; - m_interpolator->begin(x+0.5, y+0.5, len); - do - { - m_interpolator->coordinates(&x, &y); - int d = m_gradient_function->calculate(x >> downscale_shift, - y >> downscale_shift, m_d2); - d = ((d - m_d1) * (int)m_alpha_function->size()) / dd; - if(d < 0) d = 0; - if(d >= (int)m_alpha_function->size()) d = m_alpha_function->size() - 1; - span->a = (*m_alpha_function)[d]; - ++span; - ++(*m_interpolator); - } - while(--len); - } - - private: - interpolator_type* m_interpolator; - const GradientF* m_gradient_function; - const AlphaF* m_alpha_function; - int m_d1; - int m_d2; - }; - - - //=======================================================gradient_alpha_x - template struct gradient_alpha_x - { - typedef typename ColorT::value_type alpha_type; - alpha_type operator [] (alpha_type x) const { return x; } - }; - - //====================================================gradient_alpha_x_u8 - struct gradient_alpha_x_u8 - { - typedef int8u alpha_type; - alpha_type operator [] (alpha_type x) const { return x; } - }; - - //==========================================gradient_alpha_one_munus_x_u8 - struct gradient_alpha_one_munus_x_u8 - { - typedef int8u alpha_type; - alpha_type operator [] (alpha_type x) const { return 255-x; } - }; - -} - -#endif diff --git a/uppdev/agg24/agg_span_image_filter.h b/uppdev/agg24/agg_span_image_filter.h deleted file mode 100644 index 47e2f44e3..000000000 --- a/uppdev/agg24/agg_span_image_filter.h +++ /dev/null @@ -1,246 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Image transformations with filtering. Span generator base class -// -//---------------------------------------------------------------------------- -#ifndef AGG_SPAN_IMAGE_FILTER_INCLUDED -#define AGG_SPAN_IMAGE_FILTER_INCLUDED - -#include "agg_basics.h" -#include "agg_image_filters.h" -#include "agg_span_interpolator_linear.h" - -namespace agg -{ - - //-------------------------------------------------------span_image_filter - template class span_image_filter - { - public: - typedef Source source_type; - typedef Interpolator interpolator_type; - - //-------------------------------------------------------------------- - span_image_filter() {} - span_image_filter(source_type& src, - interpolator_type& interpolator, - const image_filter_lut* filter) : - m_src(&src), - m_interpolator(&interpolator), - m_filter(filter), - m_dx_dbl(0.5), - m_dy_dbl(0.5), - m_dx_int(image_subpixel_scale / 2), - m_dy_int(image_subpixel_scale / 2) - {} - void attach(source_type& v) { m_src = &v; } - - //-------------------------------------------------------------------- - source_type& source() { return *m_src; } - const source_type& source() const { return *m_src; } - const image_filter_lut& filter() const { return *m_filter; } - int filter_dx_int() const { return m_dx_int; } - int filter_dy_int() const { return m_dy_int; } - double filter_dx_dbl() const { return m_dx_dbl; } - double filter_dy_dbl() const { return m_dy_dbl; } - - //-------------------------------------------------------------------- - void interpolator(interpolator_type& v) { m_interpolator = &v; } - void filter(const image_filter_lut& v) { m_filter = &v; } - void filter_offset(double dx, double dy) - { - m_dx_dbl = dx; - m_dy_dbl = dy; - m_dx_int = iround(dx * image_subpixel_scale); - m_dy_int = iround(dy * image_subpixel_scale); - } - void filter_offset(double d) { filter_offset(d, d); } - - //-------------------------------------------------------------------- - interpolator_type& interpolator() { return *m_interpolator; } - - //-------------------------------------------------------------------- - void prepare() {} - - //-------------------------------------------------------------------- - private: - source_type* m_src; - interpolator_type* m_interpolator; - const image_filter_lut* m_filter; - double m_dx_dbl; - double m_dy_dbl; - unsigned m_dx_int; - unsigned m_dy_int; - }; - - - - - //==============================================span_image_resample_affine - template - class span_image_resample_affine : - public span_image_filter > - { - public: - typedef Source source_type; - typedef span_interpolator_linear interpolator_type; - typedef span_image_filter base_type; - - //-------------------------------------------------------------------- - span_image_resample_affine() : - m_scale_limit(200.0), - m_blur_x(1.0), - m_blur_y(1.0) - {} - - //-------------------------------------------------------------------- - span_image_resample_affine(source_type& src, - interpolator_type& inter, - const image_filter_lut& filter) : - base_type(src, inter, &filter), - m_scale_limit(200.0), - m_blur_x(1.0), - m_blur_y(1.0) - {} - - - //-------------------------------------------------------------------- - int scale_limit() const { return uround(m_scale_limit); } - void scale_limit(int v) { m_scale_limit = v; } - - //-------------------------------------------------------------------- - double blur_x() const { return m_blur_x; } - double blur_y() const { return m_blur_y; } - void blur_x(double v) { m_blur_x = v; } - void blur_y(double v) { m_blur_y = v; } - void blur(double v) { m_blur_x = m_blur_y = v; } - - //-------------------------------------------------------------------- - void prepare() - { - double scale_x; - double scale_y; - - base_type::interpolator().transformer().scaling_abs(&scale_x, &scale_y); - - if(scale_x * scale_y > m_scale_limit) - { - scale_x = scale_x * m_scale_limit / (scale_x * scale_y); - scale_y = scale_y * m_scale_limit / (scale_x * scale_y); - } - - if(scale_x < 1) scale_x = 1; - if(scale_y < 1) scale_y = 1; - - if(scale_x > m_scale_limit) scale_x = m_scale_limit; - if(scale_y > m_scale_limit) scale_y = m_scale_limit; - - scale_x *= m_blur_x; - scale_y *= m_blur_y; - - if(scale_x < 1) scale_x = 1; - if(scale_y < 1) scale_y = 1; - - m_rx = uround( scale_x * double(image_subpixel_scale)); - m_rx_inv = uround(1.0/scale_x * double(image_subpixel_scale)); - - m_ry = uround( scale_y * double(image_subpixel_scale)); - m_ry_inv = uround(1.0/scale_y * double(image_subpixel_scale)); - } - - protected: - int m_rx; - int m_ry; - int m_rx_inv; - int m_ry_inv; - - private: - double m_scale_limit; - double m_blur_x; - double m_blur_y; - }; - - - - //=====================================================span_image_resample - template - class span_image_resample : - public span_image_filter - { - public: - typedef Source source_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - - //-------------------------------------------------------------------- - span_image_resample() : - m_scale_limit(20), - m_blur_x(image_subpixel_scale), - m_blur_y(image_subpixel_scale) - {} - - //-------------------------------------------------------------------- - span_image_resample(source_type& src, - interpolator_type& inter, - const image_filter_lut& filter) : - base_type(src, inter, &filter), - m_scale_limit(20), - m_blur_x(image_subpixel_scale), - m_blur_y(image_subpixel_scale) - {} - - //-------------------------------------------------------------------- - int scale_limit() const { return m_scale_limit; } - void scale_limit(int v) { m_scale_limit = v; } - - //-------------------------------------------------------------------- - double blur_x() const { return double(m_blur_x) / double(image_subpixel_scale); } - double blur_y() const { return double(m_blur_y) / double(image_subpixel_scale); } - void blur_x(double v) { m_blur_x = uround(v * double(image_subpixel_scale)); } - void blur_y(double v) { m_blur_y = uround(v * double(image_subpixel_scale)); } - void blur(double v) { m_blur_x = - m_blur_y = uround(v * double(image_subpixel_scale)); } - - protected: - AGG_INLINE void adjust_scale(int* rx, int* ry) - { - if(*rx < image_subpixel_scale) *rx = image_subpixel_scale; - if(*ry < image_subpixel_scale) *ry = image_subpixel_scale; - if(*rx > image_subpixel_scale * m_scale_limit) - { - *rx = image_subpixel_scale * m_scale_limit; - } - if(*ry > image_subpixel_scale * m_scale_limit) - { - *ry = image_subpixel_scale * m_scale_limit; - } - *rx = (*rx * m_blur_x) >> image_subpixel_shift; - *ry = (*ry * m_blur_y) >> image_subpixel_shift; - if(*rx < image_subpixel_scale) *rx = image_subpixel_scale; - if(*ry < image_subpixel_scale) *ry = image_subpixel_scale; - } - - int m_scale_limit; - int m_blur_x; - int m_blur_y; - }; - - - - -} - -#endif diff --git a/uppdev/agg24/agg_span_image_filter_gray.h b/uppdev/agg24/agg_span_image_filter_gray.h deleted file mode 100644 index 9f3ede78f..000000000 --- a/uppdev/agg24/agg_span_image_filter_gray.h +++ /dev/null @@ -1,748 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Adaptation for high precision colors has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- -#ifndef AGG_SPAN_IMAGE_FILTER_GRAY_INCLUDED -#define AGG_SPAN_IMAGE_FILTER_GRAY_INCLUDED - -#include "agg_basics.h" -#include "agg_color_gray.h" -#include "agg_span_image_filter.h" - - -namespace agg -{ - - //==============================================span_image_filter_gray_nn - template - class span_image_filter_gray_nn : - public span_image_filter - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - span_image_filter_gray_nn() {} - span_image_filter_gray_nn(source_type& src, - interpolator_type& inter) : - base_type(src, inter, 0) - {} - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - do - { - base_type::interpolator().coordinates(&x, &y); - span->v = *(const value_type*) - base_type::source().span(x >> image_subpixel_shift, - y >> image_subpixel_shift, - 1); - span->a = base_mask; - ++span; - ++base_type::interpolator(); - } while(--len); - } - }; - - - - //=========================================span_image_filter_gray_bilinear - template - class span_image_filter_gray_bilinear : - public span_image_filter - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - span_image_filter_gray_bilinear() {} - span_image_filter_gray_bilinear(source_type& src, - interpolator_type& inter) : - base_type(src, inter, 0) - {} - - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - calc_type fg; - const value_type *fg_ptr; - do - { - int x_hr; - int y_hr; - - base_type::interpolator().coordinates(&x_hr, &y_hr); - - x_hr -= base_type::filter_dx_int(); - y_hr -= base_type::filter_dy_int(); - - int x_lr = x_hr >> image_subpixel_shift; - int y_lr = y_hr >> image_subpixel_shift; - - fg = image_subpixel_scale * image_subpixel_scale / 2; - - x_hr &= image_subpixel_mask; - y_hr &= image_subpixel_mask; - - fg_ptr = (const value_type*)base_type::source().span(x_lr, y_lr, 2); - fg += *fg_ptr * (image_subpixel_scale - x_hr) * (image_subpixel_scale - y_hr); - - fg_ptr = (const value_type*)base_type::source().next_x(); - fg += *fg_ptr * x_hr * (image_subpixel_scale - y_hr); - - fg_ptr = (const value_type*)base_type::source().next_y(); - fg += *fg_ptr * (image_subpixel_scale - x_hr) * y_hr; - - fg_ptr = (const value_type*)base_type::source().next_x(); - fg += *fg_ptr * x_hr * y_hr; - - span->v = value_type(fg >> (image_subpixel_shift * 2)); - span->a = base_mask; - ++span; - ++base_type::interpolator(); - - } while(--len); - } - }; - - - //====================================span_image_filter_gray_bilinear_clip - template - class span_image_filter_gray_bilinear_clip : - public span_image_filter - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - span_image_filter_gray_bilinear_clip() {} - span_image_filter_gray_bilinear_clip(source_type& src, - const color_type& back_color, - interpolator_type& inter) : - base_type(src, inter, 0), - m_back_color(back_color) - {} - const color_type& background_color() const { return m_back_color; } - void background_color(const color_type& v) { m_back_color = v; } - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - calc_type fg; - calc_type src_alpha; - value_type back_v = m_back_color.v; - value_type back_a = m_back_color.a; - - const value_type *fg_ptr; - - int maxx = base_type::source().width() - 1; - int maxy = base_type::source().height() - 1; - - do - { - int x_hr; - int y_hr; - - base_type::interpolator().coordinates(&x_hr, &y_hr); - - x_hr -= base_type::filter_dx_int(); - y_hr -= base_type::filter_dy_int(); - - int x_lr = x_hr >> image_subpixel_shift; - int y_lr = y_hr >> image_subpixel_shift; - - if(x_lr >= 0 && y_lr >= 0 && - x_lr < maxx && y_lr < maxy) - { - fg = image_subpixel_scale * image_subpixel_scale / 2; - - x_hr &= image_subpixel_mask; - y_hr &= image_subpixel_mask; - fg_ptr = (const value_type*)base_type::source().row_ptr(y_lr) + x_lr; - - fg += *fg_ptr++ * (image_subpixel_scale - x_hr) * (image_subpixel_scale - y_hr); - fg += *fg_ptr++ * (image_subpixel_scale - y_hr) * x_hr; - - ++y_lr; - fg_ptr = (const value_type*)base_type::source().row_ptr(y_lr) + x_lr; - - fg += *fg_ptr++ * (image_subpixel_scale - x_hr) * y_hr; - fg += *fg_ptr++ * x_hr * y_hr; - - fg >>= image_subpixel_shift * 2; - src_alpha = base_mask; - } - else - { - unsigned weight; - if(x_lr < -1 || y_lr < -1 || - x_lr > maxx || y_lr > maxy) - { - fg = back_v; - src_alpha = back_a; - } - else - { - fg = - src_alpha = image_subpixel_scale * image_subpixel_scale / 2; - - x_hr &= image_subpixel_mask; - y_hr &= image_subpixel_mask; - - weight = (image_subpixel_scale - x_hr) * - (image_subpixel_scale - y_hr); - if(x_lr >= 0 && y_lr >= 0 && - x_lr <= maxx && y_lr <= maxy) - { - fg += weight * - *((const value_type*)base_type::source().row_ptr(y_lr) + x_lr); - src_alpha += weight * base_mask; - } - else - { - fg += back_v * weight; - src_alpha += back_a * weight; - } - - x_lr++; - - weight = x_hr * (image_subpixel_scale - y_hr); - if(x_lr >= 0 && y_lr >= 0 && - x_lr <= maxx && y_lr <= maxy) - { - fg += weight * - *((const value_type*)base_type::source().row_ptr(y_lr) + x_lr); - src_alpha += weight * base_mask; - } - else - { - fg += back_v * weight; - src_alpha += back_a * weight; - } - - x_lr--; - y_lr++; - - weight = (image_subpixel_scale - x_hr) * y_hr; - if(x_lr >= 0 && y_lr >= 0 && - x_lr <= maxx && y_lr <= maxy) - { - fg += weight * - *((const value_type*)base_type::source().row_ptr(y_lr) + x_lr); - src_alpha += weight * base_mask; - } - else - { - fg += back_v * weight; - src_alpha += back_a * weight; - } - - x_lr++; - - weight = x_hr * y_hr; - if(x_lr >= 0 && y_lr >= 0 && - x_lr <= maxx && y_lr <= maxy) - { - fg += weight * - *((const value_type*)base_type::source().row_ptr(y_lr) + x_lr); - src_alpha += weight * base_mask; - } - else - { - fg += back_v * weight; - src_alpha += back_a * weight; - } - - fg >>= image_subpixel_shift * 2; - src_alpha >>= image_subpixel_shift * 2; - } - } - - span->v = (value_type)fg; - span->a = (value_type)src_alpha; - ++span; - ++base_type::interpolator(); - - } while(--len); - } - private: - color_type m_back_color; - }; - - - - //==============================================span_image_filter_gray_2x2 - template - class span_image_filter_gray_2x2 : - public span_image_filter - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - span_image_filter_gray_2x2() {} - span_image_filter_gray_2x2(source_type& src, - interpolator_type& inter, - const image_filter_lut& filter) : - base_type(src, inter, &filter) - {} - - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - - calc_type fg; - - const value_type *fg_ptr; - const int16* weight_array = base_type::filter().weight_array() + - ((base_type::filter().diameter()/2 - 1) << - image_subpixel_shift); - do - { - int x_hr; - int y_hr; - - base_type::interpolator().coordinates(&x_hr, &y_hr); - - x_hr -= base_type::filter_dx_int(); - y_hr -= base_type::filter_dy_int(); - - int x_lr = x_hr >> image_subpixel_shift; - int y_lr = y_hr >> image_subpixel_shift; - - unsigned weight; - fg = image_filter_scale / 2; - - x_hr &= image_subpixel_mask; - y_hr &= image_subpixel_mask; - - fg_ptr = (const value_type*)base_type::source().span(x_lr, y_lr, 2); - weight = (weight_array[x_hr + image_subpixel_scale] * - weight_array[y_hr + image_subpixel_scale] + - image_filter_scale / 2) >> - image_filter_shift; - fg += weight * *fg_ptr; - - fg_ptr = (const value_type*)base_type::source().next_x(); - weight = (weight_array[x_hr] * - weight_array[y_hr + image_subpixel_scale] + - image_filter_scale / 2) >> - image_filter_shift; - fg += weight * *fg_ptr; - - fg_ptr = (const value_type*)base_type::source().next_y(); - weight = (weight_array[x_hr + image_subpixel_scale] * - weight_array[y_hr] + - image_filter_scale / 2) >> - image_filter_shift; - fg += weight * *fg_ptr; - - fg_ptr = (const value_type*)base_type::source().next_x(); - weight = (weight_array[x_hr] * - weight_array[y_hr] + - image_filter_scale / 2) >> - image_filter_shift; - fg += weight * *fg_ptr; - - fg >>= image_filter_shift; - if(fg > base_mask) fg = base_mask; - - span->v = (value_type)fg; - span->a = base_mask; - ++span; - ++base_type::interpolator(); - } while(--len); - } - }; - - - - //==================================================span_image_filter_gray - template - class span_image_filter_gray : - public span_image_filter - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - span_image_filter_gray() {} - span_image_filter_gray(source_type& src, - interpolator_type& inter, - const image_filter_lut& filter) : - base_type(src, inter, &filter) - {} - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - - int fg; - const value_type *fg_ptr; - - unsigned diameter = base_type::filter().diameter(); - int start = base_type::filter().start(); - const int16* weight_array = base_type::filter().weight_array(); - - int x_count; - int weight_y; - - do - { - base_type::interpolator().coordinates(&x, &y); - - x -= base_type::filter_dx_int(); - y -= base_type::filter_dy_int(); - - int x_hr = x; - int y_hr = y; - - int x_lr = x_hr >> image_subpixel_shift; - int y_lr = y_hr >> image_subpixel_shift; - - fg = image_filter_scale / 2; - - int x_fract = x_hr & image_subpixel_mask; - unsigned y_count = diameter; - - y_hr = image_subpixel_mask - (y_hr & image_subpixel_mask); - fg_ptr = (const value_type*)base_type::source().span(x_lr + start, - y_lr + start, - diameter); - for(;;) - { - x_count = diameter; - weight_y = weight_array[y_hr]; - x_hr = image_subpixel_mask - x_fract; - for(;;) - { - fg += *fg_ptr * - ((weight_y * weight_array[x_hr] + - image_filter_scale / 2) >> - image_filter_shift); - if(--x_count == 0) break; - x_hr += image_subpixel_scale; - fg_ptr = (const value_type*)base_type::source().next_x(); - } - - if(--y_count == 0) break; - y_hr += image_subpixel_scale; - fg_ptr = (const value_type*)base_type::source().next_y(); - } - - fg >>= image_filter_shift; - if(fg < 0) fg = 0; - if(fg > base_mask) fg = base_mask; - span->v = (value_type)fg; - span->a = base_mask; - - ++span; - ++base_type::interpolator(); - - } while(--len); - } - }; - - - - //=========================================span_image_resample_gray_affine - template - class span_image_resample_gray_affine : - public span_image_resample_affine - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef span_image_resample_affine base_type; - typedef typename base_type::interpolator_type interpolator_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::long_type long_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask, - downscale_shift = image_filter_shift - }; - - //-------------------------------------------------------------------- - span_image_resample_gray_affine() {} - span_image_resample_gray_affine(source_type& src, - interpolator_type& inter, - const image_filter_lut& filter) : - base_type(src, inter, filter) - {} - - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - - long_type fg; - - int diameter = base_type::filter().diameter(); - int filter_scale = diameter << image_subpixel_shift; - int radius_x = (diameter * base_type::m_rx) >> 1; - int radius_y = (diameter * base_type::m_ry) >> 1; - int len_x_lr = - (diameter * base_type::m_rx + image_subpixel_mask) >> - image_subpixel_shift; - - const int16* weight_array = base_type::filter().weight_array(); - - do - { - base_type::interpolator().coordinates(&x, &y); - - x += base_type::filter_dx_int() - radius_x; - y += base_type::filter_dy_int() - radius_y; - - fg = image_filter_scale / 2; - - int y_lr = y >> image_subpixel_shift; - int y_hr = ((image_subpixel_mask - (y & image_subpixel_mask)) * - base_type::m_ry_inv) >> - image_subpixel_shift; - int total_weight = 0; - int x_lr = x >> image_subpixel_shift; - int x_hr = ((image_subpixel_mask - (x & image_subpixel_mask)) * - base_type::m_rx_inv) >> - image_subpixel_shift; - - int x_hr2 = x_hr; - const value_type* fg_ptr = - (const value_type*)base_type::source().span(x_lr, y_lr, len_x_lr); - for(;;) - { - int weight_y = weight_array[y_hr]; - x_hr = x_hr2; - for(;;) - { - int weight = (weight_y * weight_array[x_hr] + - image_filter_scale / 2) >> - downscale_shift; - - fg += *fg_ptr * weight; - total_weight += weight; - x_hr += base_type::m_rx_inv; - if(x_hr >= filter_scale) break; - fg_ptr = (const value_type*)base_type::source().next_x(); - } - y_hr += base_type::m_ry_inv; - if(y_hr >= filter_scale) break; - fg_ptr = (const value_type*)base_type::source().next_y(); - } - - fg /= total_weight; - if(fg < 0) fg = 0; - if(fg > base_mask) fg = base_mask; - - span->v = (value_type)fg; - span->a = base_mask; - - ++span; - ++base_type::interpolator(); - } while(--len); - } - }; - - - - //================================================span_image_resample_gray - template - class span_image_resample_gray : - public span_image_resample - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef Interpolator interpolator_type; - typedef span_image_resample base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::long_type long_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask, - downscale_shift = image_filter_shift - }; - - //-------------------------------------------------------------------- - span_image_resample_gray() {} - span_image_resample_gray(source_type& src, - interpolator_type& inter, - const image_filter_lut& filter) : - base_type(src, inter, filter) - {} - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - long_type fg; - - int diameter = base_type::filter().diameter(); - int filter_scale = diameter << image_subpixel_shift; - - const int16* weight_array = base_type::filter().weight_array(); - do - { - int rx; - int ry; - int rx_inv = image_subpixel_scale; - int ry_inv = image_subpixel_scale; - base_type::interpolator().coordinates(&x, &y); - base_type::interpolator().local_scale(&rx, &ry); - base_type::adjust_scale(&rx, &ry); - - rx_inv = image_subpixel_scale * image_subpixel_scale / rx; - ry_inv = image_subpixel_scale * image_subpixel_scale / ry; - - int radius_x = (diameter * rx) >> 1; - int radius_y = (diameter * ry) >> 1; - int len_x_lr = - (diameter * rx + image_subpixel_mask) >> - image_subpixel_shift; - - x += base_type::filter_dx_int() - radius_x; - y += base_type::filter_dy_int() - radius_y; - - fg = image_filter_scale / 2; - - int y_lr = y >> image_subpixel_shift; - int y_hr = ((image_subpixel_mask - (y & image_subpixel_mask)) * - ry_inv) >> - image_subpixel_shift; - int total_weight = 0; - int x_lr = x >> image_subpixel_shift; - int x_hr = ((image_subpixel_mask - (x & image_subpixel_mask)) * - rx_inv) >> - image_subpixel_shift; - int x_hr2 = x_hr; - const value_type* fg_ptr = - (const value_type*)base_type::source().span(x_lr, y_lr, len_x_lr); - - for(;;) - { - int weight_y = weight_array[y_hr]; - x_hr = x_hr2; - for(;;) - { - int weight = (weight_y * weight_array[x_hr] + - image_filter_scale / 2) >> - downscale_shift; - fg += *fg_ptr * weight; - total_weight += weight; - x_hr += rx_inv; - if(x_hr >= filter_scale) break; - fg_ptr = (const value_type*)base_type::source().next_x(); - } - y_hr += ry_inv; - if(y_hr >= filter_scale) break; - fg_ptr = (const value_type*)base_type::source().next_y(); - } - - fg /= total_weight; - if(fg < 0) fg = 0; - if(fg > base_mask) fg = base_mask; - - span->v = (value_type)fg; - span->a = base_mask; - - ++span; - ++base_type::interpolator(); - } while(--len); - } - }; - - -} - - -#endif - - - diff --git a/uppdev/agg24/agg_span_image_filter_rgb.h b/uppdev/agg24/agg_span_image_filter_rgb.h deleted file mode 100644 index a72ffd240..000000000 --- a/uppdev/agg24/agg_span_image_filter_rgb.h +++ /dev/null @@ -1,892 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Adaptation for high precision colors has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- -#ifndef AGG_SPAN_IMAGE_FILTER_RGB_INCLUDED -#define AGG_SPAN_IMAGE_FILTER_RGB_INCLUDED - -#include "agg_basics.h" -#include "agg_color_rgba.h" -#include "agg_span_image_filter.h" - - -namespace agg -{ - - //===============================================span_image_filter_rgb_nn - template - class span_image_filter_rgb_nn : - public span_image_filter - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - span_image_filter_rgb_nn() {} - span_image_filter_rgb_nn(source_type& src, - interpolator_type& inter) : - base_type(src, inter, 0) - {} - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - do - { - base_type::interpolator().coordinates(&x, &y); - const value_type* fg_ptr = (const value_type*) - base_type::source().span(x >> image_subpixel_shift, - y >> image_subpixel_shift, - 1); - span->r = fg_ptr[order_type::R]; - span->g = fg_ptr[order_type::G]; - span->b = fg_ptr[order_type::B]; - span->a = base_mask; - ++span; - ++base_type::interpolator(); - - } while(--len); - } - }; - - - - //==========================================span_image_filter_rgb_bilinear - template - class span_image_filter_rgb_bilinear : - public span_image_filter - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - span_image_filter_rgb_bilinear() {} - span_image_filter_rgb_bilinear(source_type& src, - interpolator_type& inter) : - base_type(src, inter, 0) - {} - - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - calc_type fg[3]; - const value_type *fg_ptr; - do - { - int x_hr; - int y_hr; - - base_type::interpolator().coordinates(&x_hr, &y_hr); - - x_hr -= base_type::filter_dx_int(); - y_hr -= base_type::filter_dy_int(); - - int x_lr = x_hr >> image_subpixel_shift; - int y_lr = y_hr >> image_subpixel_shift; - - unsigned weight; - - fg[0] = - fg[1] = - fg[2] = image_subpixel_scale * image_subpixel_scale / 2; - - x_hr &= image_subpixel_mask; - y_hr &= image_subpixel_mask; - - fg_ptr = (const value_type*)base_type::source().span(x_lr, y_lr, 2); - weight = (image_subpixel_scale - x_hr) * - (image_subpixel_scale - y_hr); - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr; - - fg_ptr = (const value_type*)base_type::source().next_x(); - weight = x_hr * (image_subpixel_scale - y_hr); - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr; - - fg_ptr = (const value_type*)base_type::source().next_y(); - weight = (image_subpixel_scale - x_hr) * y_hr; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr; - - fg_ptr = (const value_type*)base_type::source().next_x(); - weight = x_hr * y_hr; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr; - - span->r = value_type(fg[order_type::R] >> (image_subpixel_shift * 2)); - span->g = value_type(fg[order_type::G] >> (image_subpixel_shift * 2)); - span->b = value_type(fg[order_type::B] >> (image_subpixel_shift * 2)); - span->a = base_mask; - - ++span; - ++base_type::interpolator(); - - } while(--len); - } - }; - - - - //=====================================span_image_filter_rgb_bilinear_clip - template - class span_image_filter_rgb_bilinear_clip : - public span_image_filter - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - span_image_filter_rgb_bilinear_clip() {} - span_image_filter_rgb_bilinear_clip(source_type& src, - const color_type& back_color, - interpolator_type& inter) : - base_type(src, inter, 0), - m_back_color(back_color) - {} - const color_type& background_color() const { return m_back_color; } - void background_color(const color_type& v) { m_back_color = v; } - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - calc_type fg[3]; - calc_type src_alpha; - value_type back_r = m_back_color.r; - value_type back_g = m_back_color.g; - value_type back_b = m_back_color.b; - value_type back_a = m_back_color.a; - - const value_type *fg_ptr; - - int maxx = base_type::source().width() - 1; - int maxy = base_type::source().height() - 1; - - do - { - int x_hr; - int y_hr; - - base_type::interpolator().coordinates(&x_hr, &y_hr); - - x_hr -= base_type::filter_dx_int(); - y_hr -= base_type::filter_dy_int(); - - int x_lr = x_hr >> image_subpixel_shift; - int y_lr = y_hr >> image_subpixel_shift; - unsigned weight; - - if(x_lr >= 0 && y_lr >= 0 && - x_lr < maxx && y_lr < maxy) - { - fg[0] = - fg[1] = - fg[2] = image_subpixel_scale * image_subpixel_scale / 2; - - x_hr &= image_subpixel_mask; - y_hr &= image_subpixel_mask; - - fg_ptr = (const value_type*) - base_type::source().row_ptr(y_lr) + x_lr + x_lr + x_lr; - - weight = (image_subpixel_scale - x_hr) * - (image_subpixel_scale - y_hr); - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - - weight = x_hr * (image_subpixel_scale - y_hr); - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - - ++y_lr; - fg_ptr = (const value_type*) - base_type::source().row_ptr(y_lr) + x_lr + x_lr + x_lr; - - weight = (image_subpixel_scale - x_hr) * y_hr; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - - weight = x_hr * y_hr; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - - fg[0] >>= image_subpixel_shift * 2; - fg[1] >>= image_subpixel_shift * 2; - fg[2] >>= image_subpixel_shift * 2; - src_alpha = base_mask; - } - else - { - if(x_lr < -1 || y_lr < -1 || - x_lr > maxx || y_lr > maxy) - { - fg[order_type::R] = back_r; - fg[order_type::G] = back_g; - fg[order_type::B] = back_b; - src_alpha = back_a; - } - else - { - fg[0] = - fg[1] = - fg[2] = - src_alpha = image_subpixel_scale * image_subpixel_scale / 2; - - x_hr &= image_subpixel_mask; - y_hr &= image_subpixel_mask; - - weight = (image_subpixel_scale - x_hr) * - (image_subpixel_scale - y_hr); - if(x_lr >= 0 && y_lr >= 0 && - x_lr <= maxx && y_lr <= maxy) - { - fg_ptr = (const value_type*) - base_type::source().row_ptr(y_lr) + x_lr + x_lr + x_lr; - - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - src_alpha += weight * base_mask; - } - else - { - fg[order_type::R] += back_r * weight; - fg[order_type::G] += back_g * weight; - fg[order_type::B] += back_b * weight; - src_alpha += back_a * weight; - } - - x_lr++; - - weight = x_hr * (image_subpixel_scale - y_hr); - if(x_lr >= 0 && y_lr >= 0 && - x_lr <= maxx && y_lr <= maxy) - { - fg_ptr = (const value_type*) - base_type::source().row_ptr(y_lr) + x_lr + x_lr + x_lr; - - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - src_alpha += weight * base_mask; - } - else - { - fg[order_type::R] += back_r * weight; - fg[order_type::G] += back_g * weight; - fg[order_type::B] += back_b * weight; - src_alpha += back_a * weight; - } - - x_lr--; - y_lr++; - - weight = (image_subpixel_scale - x_hr) * y_hr; - if(x_lr >= 0 && y_lr >= 0 && - x_lr <= maxx && y_lr <= maxy) - { - fg_ptr = (const value_type*) - base_type::source().row_ptr(y_lr) + x_lr + x_lr + x_lr; - - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - src_alpha += weight * base_mask; - } - else - { - fg[order_type::R] += back_r * weight; - fg[order_type::G] += back_g * weight; - fg[order_type::B] += back_b * weight; - src_alpha += back_a * weight; - } - - x_lr++; - - weight = x_hr * y_hr; - if(x_lr >= 0 && y_lr >= 0 && - x_lr <= maxx && y_lr <= maxy) - { - fg_ptr = (const value_type*) - base_type::source().row_ptr(y_lr) + x_lr + x_lr + x_lr; - - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - src_alpha += weight * base_mask; - } - else - { - fg[order_type::R] += back_r * weight; - fg[order_type::G] += back_g * weight; - fg[order_type::B] += back_b * weight; - src_alpha += back_a * weight; - } - - fg[0] >>= image_subpixel_shift * 2; - fg[1] >>= image_subpixel_shift * 2; - fg[2] >>= image_subpixel_shift * 2; - src_alpha >>= image_subpixel_shift * 2; - } - } - - span->r = (value_type)fg[order_type::R]; - span->g = (value_type)fg[order_type::G]; - span->b = (value_type)fg[order_type::B]; - span->a = (value_type)src_alpha; - ++span; - ++base_type::interpolator(); - - } while(--len); - } - private: - color_type m_back_color; - }; - - - - //===============================================span_image_filter_rgb_2x2 - template - class span_image_filter_rgb_2x2 : - public span_image_filter - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - span_image_filter_rgb_2x2() {} - span_image_filter_rgb_2x2(source_type& src, - interpolator_type& inter, - const image_filter_lut& filter) : - base_type(src, inter, &filter) - {} - - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - - calc_type fg[3]; - - const value_type *fg_ptr; - const int16* weight_array = base_type::filter().weight_array() + - ((base_type::filter().diameter()/2 - 1) << - image_subpixel_shift); - do - { - int x_hr; - int y_hr; - - base_type::interpolator().coordinates(&x_hr, &y_hr); - - x_hr -= base_type::filter_dx_int(); - y_hr -= base_type::filter_dy_int(); - - int x_lr = x_hr >> image_subpixel_shift; - int y_lr = y_hr >> image_subpixel_shift; - - unsigned weight; - fg[0] = fg[1] = fg[2] = image_filter_scale / 2; - - x_hr &= image_subpixel_mask; - y_hr &= image_subpixel_mask; - - fg_ptr = (const value_type*)base_type::source().span(x_lr, y_lr, 2); - weight = (weight_array[x_hr + image_subpixel_scale] * - weight_array[y_hr + image_subpixel_scale] + - image_filter_scale / 2) >> - image_filter_shift; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr; - - fg_ptr = (const value_type*)base_type::source().next_x(); - weight = (weight_array[x_hr] * - weight_array[y_hr + image_subpixel_scale] + - image_filter_scale / 2) >> - image_filter_shift; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr; - - fg_ptr = (const value_type*)base_type::source().next_y(); - weight = (weight_array[x_hr + image_subpixel_scale] * - weight_array[y_hr] + - image_filter_scale / 2) >> - image_filter_shift; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr; - - fg_ptr = (const value_type*)base_type::source().next_x(); - weight = (weight_array[x_hr] * - weight_array[y_hr] + - image_filter_scale / 2) >> - image_filter_shift; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr; - - fg[0] >>= image_filter_shift; - fg[1] >>= image_filter_shift; - fg[2] >>= image_filter_shift; - - if(fg[order_type::R] > base_mask) fg[order_type::R] = base_mask; - if(fg[order_type::G] > base_mask) fg[order_type::G] = base_mask; - if(fg[order_type::B] > base_mask) fg[order_type::B] = base_mask; - - span->r = (value_type)fg[order_type::R]; - span->g = (value_type)fg[order_type::G]; - span->b = (value_type)fg[order_type::B]; - span->a = base_mask; - - ++span; - ++base_type::interpolator(); - - } while(--len); - } - }; - - - - //===================================================span_image_filter_rgb - template - class span_image_filter_rgb : - public span_image_filter - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - span_image_filter_rgb() {} - span_image_filter_rgb(source_type& src, - interpolator_type& inter, - const image_filter_lut& filter) : - base_type(src, inter, &filter) - {} - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - - int fg[3]; - const value_type *fg_ptr; - - unsigned diameter = base_type::filter().diameter(); - int start = base_type::filter().start(); - const int16* weight_array = base_type::filter().weight_array(); - - int x_count; - int weight_y; - - do - { - base_type::interpolator().coordinates(&x, &y); - - x -= base_type::filter_dx_int(); - y -= base_type::filter_dy_int(); - - int x_hr = x; - int y_hr = y; - - int x_lr = x_hr >> image_subpixel_shift; - int y_lr = y_hr >> image_subpixel_shift; - - fg[0] = fg[1] = fg[2] = image_filter_scale / 2; - - int x_fract = x_hr & image_subpixel_mask; - unsigned y_count = diameter; - - y_hr = image_subpixel_mask - (y_hr & image_subpixel_mask); - fg_ptr = (const value_type*)base_type::source().span(x_lr + start, - y_lr + start, - diameter); - for(;;) - { - x_count = diameter; - weight_y = weight_array[y_hr]; - x_hr = image_subpixel_mask - x_fract; - for(;;) - { - int weight = (weight_y * weight_array[x_hr] + - image_filter_scale / 2) >> - image_filter_shift; - - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr; - - if(--x_count == 0) break; - x_hr += image_subpixel_scale; - fg_ptr = (const value_type*)base_type::source().next_x(); - } - - if(--y_count == 0) break; - y_hr += image_subpixel_scale; - fg_ptr = (const value_type*)base_type::source().next_y(); - } - - fg[0] >>= image_filter_shift; - fg[1] >>= image_filter_shift; - fg[2] >>= image_filter_shift; - - if(fg[0] < 0) fg[0] = 0; - if(fg[1] < 0) fg[1] = 0; - if(fg[2] < 0) fg[2] = 0; - - if(fg[order_type::R] > base_mask) fg[order_type::R] = base_mask; - if(fg[order_type::G] > base_mask) fg[order_type::G] = base_mask; - if(fg[order_type::B] > base_mask) fg[order_type::B] = base_mask; - - span->r = (value_type)fg[order_type::R]; - span->g = (value_type)fg[order_type::G]; - span->b = (value_type)fg[order_type::B]; - span->a = base_mask; - - ++span; - ++base_type::interpolator(); - - } while(--len); - } - }; - - - - //==========================================span_image_resample_rgb_affine - template - class span_image_resample_rgb_affine : - public span_image_resample_affine - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef span_image_resample_affine base_type; - typedef typename base_type::interpolator_type interpolator_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::long_type long_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask, - downscale_shift = image_filter_shift - }; - - //-------------------------------------------------------------------- - span_image_resample_rgb_affine() {} - span_image_resample_rgb_affine(source_type& src, - interpolator_type& inter, - const image_filter_lut& filter) : - base_type(src, inter, filter) - {} - - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - - long_type fg[3]; - - int diameter = base_type::filter().diameter(); - int filter_scale = diameter << image_subpixel_shift; - int radius_x = (diameter * base_type::m_rx) >> 1; - int radius_y = (diameter * base_type::m_ry) >> 1; - int len_x_lr = - (diameter * base_type::m_rx + image_subpixel_mask) >> - image_subpixel_shift; - - const int16* weight_array = base_type::filter().weight_array(); - - do - { - base_type::interpolator().coordinates(&x, &y); - - x += base_type::filter_dx_int() - radius_x; - y += base_type::filter_dy_int() - radius_y; - - fg[0] = fg[1] = fg[2] = image_filter_scale / 2; - - int y_lr = y >> image_subpixel_shift; - int y_hr = ((image_subpixel_mask - (y & image_subpixel_mask)) * - base_type::m_ry_inv) >> - image_subpixel_shift; - int total_weight = 0; - int x_lr = x >> image_subpixel_shift; - int x_hr = ((image_subpixel_mask - (x & image_subpixel_mask)) * - base_type::m_rx_inv) >> - image_subpixel_shift; - - int x_hr2 = x_hr; - const value_type* fg_ptr = - (const value_type*)base_type::source().span(x_lr, y_lr, len_x_lr); - for(;;) - { - int weight_y = weight_array[y_hr]; - x_hr = x_hr2; - for(;;) - { - int weight = (weight_y * weight_array[x_hr] + - image_filter_scale / 2) >> - downscale_shift; - - fg[0] += *fg_ptr++ * weight; - fg[1] += *fg_ptr++ * weight; - fg[2] += *fg_ptr * weight; - total_weight += weight; - x_hr += base_type::m_rx_inv; - if(x_hr >= filter_scale) break; - fg_ptr = (const value_type*)base_type::source().next_x(); - } - y_hr += base_type::m_ry_inv; - if(y_hr >= filter_scale) break; - fg_ptr = (const value_type*)base_type::source().next_y(); - } - - fg[0] /= total_weight; - fg[1] /= total_weight; - fg[2] /= total_weight; - - if(fg[0] < 0) fg[0] = 0; - if(fg[1] < 0) fg[1] = 0; - if(fg[2] < 0) fg[2] = 0; - - if(fg[order_type::R] > base_mask) fg[order_type::R] = base_mask; - if(fg[order_type::G] > base_mask) fg[order_type::G] = base_mask; - if(fg[order_type::B] > base_mask) fg[order_type::B] = base_mask; - - span->r = (value_type)fg[order_type::R]; - span->g = (value_type)fg[order_type::G]; - span->b = (value_type)fg[order_type::B]; - span->a = base_mask; - - ++span; - ++base_type::interpolator(); - } while(--len); - } - }; - - - - //=================================================span_image_resample_rgb - template - class span_image_resample_rgb : - public span_image_resample - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef Interpolator interpolator_type; - typedef span_image_resample base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::long_type long_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask, - downscale_shift = image_filter_shift - }; - - //-------------------------------------------------------------------- - span_image_resample_rgb() {} - span_image_resample_rgb(source_type& src, - interpolator_type& inter, - const image_filter_lut& filter) : - base_type(src, inter, filter) - {} - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - long_type fg[3]; - - int diameter = base_type::filter().diameter(); - int filter_scale = diameter << image_subpixel_shift; - - const int16* weight_array = base_type::filter().weight_array(); - do - { - int rx; - int ry; - int rx_inv = image_subpixel_scale; - int ry_inv = image_subpixel_scale; - base_type::interpolator().coordinates(&x, &y); - base_type::interpolator().local_scale(&rx, &ry); - base_type::adjust_scale(&rx, &ry); - - rx_inv = image_subpixel_scale * image_subpixel_scale / rx; - ry_inv = image_subpixel_scale * image_subpixel_scale / ry; - - int radius_x = (diameter * rx) >> 1; - int radius_y = (diameter * ry) >> 1; - int len_x_lr = - (diameter * rx + image_subpixel_mask) >> - image_subpixel_shift; - - x += base_type::filter_dx_int() - radius_x; - y += base_type::filter_dy_int() - radius_y; - - fg[0] = fg[1] = fg[2] = image_filter_scale / 2; - - int y_lr = y >> image_subpixel_shift; - int y_hr = ((image_subpixel_mask - (y & image_subpixel_mask)) * - ry_inv) >> - image_subpixel_shift; - int total_weight = 0; - int x_lr = x >> image_subpixel_shift; - int x_hr = ((image_subpixel_mask - (x & image_subpixel_mask)) * - rx_inv) >> - image_subpixel_shift; - int x_hr2 = x_hr; - const value_type* fg_ptr = - (const value_type*)base_type::source().span(x_lr, y_lr, len_x_lr); - - for(;;) - { - int weight_y = weight_array[y_hr]; - x_hr = x_hr2; - for(;;) - { - int weight = (weight_y * weight_array[x_hr] + - image_filter_scale / 2) >> - downscale_shift; - fg[0] += *fg_ptr++ * weight; - fg[1] += *fg_ptr++ * weight; - fg[2] += *fg_ptr * weight; - total_weight += weight; - x_hr += rx_inv; - if(x_hr >= filter_scale) break; - fg_ptr = (const value_type*)base_type::source().next_x(); - } - y_hr += ry_inv; - if(y_hr >= filter_scale) break; - fg_ptr = (const value_type*)base_type::source().next_y(); - } - - fg[0] /= total_weight; - fg[1] /= total_weight; - fg[2] /= total_weight; - - if(fg[0] < 0) fg[0] = 0; - if(fg[1] < 0) fg[1] = 0; - if(fg[2] < 0) fg[2] = 0; - - if(fg[order_type::R] > base_mask) fg[order_type::R] = base_mask; - if(fg[order_type::G] > base_mask) fg[order_type::G] = base_mask; - if(fg[order_type::B] > base_mask) fg[order_type::B] = base_mask; - - span->r = (value_type)fg[order_type::R]; - span->g = (value_type)fg[order_type::G]; - span->b = (value_type)fg[order_type::B]; - span->a = base_mask; - - ++span; - ++base_type::interpolator(); - } while(--len); - } - }; - - -} - - -#endif - - - diff --git a/uppdev/agg24/agg_span_image_filter_rgba.h b/uppdev/agg24/agg_span_image_filter_rgba.h deleted file mode 100644 index 134a80255..000000000 --- a/uppdev/agg24/agg_span_image_filter_rgba.h +++ /dev/null @@ -1,920 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Adaptation for high precision colors has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- -#ifndef AGG_SPAN_IMAGE_FILTER_RGBA_INCLUDED -#define AGG_SPAN_IMAGE_FILTER_RGBA_INCLUDED - -#include "agg_basics.h" -#include "agg_color_rgba.h" -#include "agg_span_image_filter.h" - - -namespace agg -{ - - //==============================================span_image_filter_rgba_nn - template - class span_image_filter_rgba_nn : - public span_image_filter - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - span_image_filter_rgba_nn() {} - span_image_filter_rgba_nn(source_type& src, - interpolator_type& inter) : - base_type(src, inter, 0) - {} - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - do - { - base_type::interpolator().coordinates(&x, &y); - const value_type* fg_ptr = (const value_type*) - base_type::source().span(x >> image_subpixel_shift, - y >> image_subpixel_shift, - 1); - span->r = fg_ptr[order_type::R]; - span->g = fg_ptr[order_type::G]; - span->b = fg_ptr[order_type::B]; - span->a = fg_ptr[order_type::A]; - ++span; - ++base_type::interpolator(); - - } while(--len); - } - }; - - - - //=========================================span_image_filter_rgba_bilinear - template - class span_image_filter_rgba_bilinear : - public span_image_filter - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - span_image_filter_rgba_bilinear() {} - span_image_filter_rgba_bilinear(source_type& src, - interpolator_type& inter) : - base_type(src, inter, 0) - {} - - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - - calc_type fg[4]; - const value_type *fg_ptr; - - do - { - int x_hr; - int y_hr; - - base_type::interpolator().coordinates(&x_hr, &y_hr); - - x_hr -= base_type::filter_dx_int(); - y_hr -= base_type::filter_dy_int(); - - int x_lr = x_hr >> image_subpixel_shift; - int y_lr = y_hr >> image_subpixel_shift; - - unsigned weight; - - fg[0] = - fg[1] = - fg[2] = - fg[3] = image_subpixel_scale * image_subpixel_scale / 2; - - x_hr &= image_subpixel_mask; - y_hr &= image_subpixel_mask; - - fg_ptr = (const value_type*)base_type::source().span(x_lr, y_lr, 2); - weight = (image_subpixel_scale - x_hr) * - (image_subpixel_scale - y_hr); - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr; - - fg_ptr = (const value_type*)base_type::source().next_x(); - weight = x_hr * (image_subpixel_scale - y_hr); - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr; - - fg_ptr = (const value_type*)base_type::source().next_y(); - weight = (image_subpixel_scale - x_hr) * y_hr; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr; - - fg_ptr = (const value_type*)base_type::source().next_x(); - weight = x_hr * y_hr; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr; - - span->r = value_type(fg[order_type::R] >> (image_subpixel_shift * 2)); - span->g = value_type(fg[order_type::G] >> (image_subpixel_shift * 2)); - span->b = value_type(fg[order_type::B] >> (image_subpixel_shift * 2)); - span->a = value_type(fg[order_type::A] >> (image_subpixel_shift * 2)); - - ++span; - ++base_type::interpolator(); - - } while(--len); - } - }; - - - //====================================span_image_filter_rgba_bilinear_clip - template - class span_image_filter_rgba_bilinear_clip : - public span_image_filter - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - span_image_filter_rgba_bilinear_clip() {} - span_image_filter_rgba_bilinear_clip(source_type& src, - const color_type& back_color, - interpolator_type& inter) : - base_type(src, inter, 0), - m_back_color(back_color) - {} - const color_type& background_color() const { return m_back_color; } - void background_color(const color_type& v) { m_back_color = v; } - - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - - calc_type fg[4]; - value_type back_r = m_back_color.r; - value_type back_g = m_back_color.g; - value_type back_b = m_back_color.b; - value_type back_a = m_back_color.a; - - const value_type *fg_ptr; - int maxx = base_type::source().width() - 1; - int maxy = base_type::source().height() - 1; - - do - { - int x_hr; - int y_hr; - - base_type::interpolator().coordinates(&x_hr, &y_hr); - - x_hr -= base_type::filter_dx_int(); - y_hr -= base_type::filter_dy_int(); - - int x_lr = x_hr >> image_subpixel_shift; - int y_lr = y_hr >> image_subpixel_shift; - - unsigned weight; - - if(x_lr >= 0 && y_lr >= 0 && - x_lr < maxx && y_lr < maxy) - { - fg[0] = - fg[1] = - fg[2] = - fg[3] = image_subpixel_scale * image_subpixel_scale / 2; - - x_hr &= image_subpixel_mask; - y_hr &= image_subpixel_mask; - - fg_ptr = (const value_type*) - base_type::source().row_ptr(y_lr) + (x_lr << 2); - - weight = (image_subpixel_scale - x_hr) * - (image_subpixel_scale - y_hr); - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr++; - - weight = x_hr * (image_subpixel_scale - y_hr); - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr++; - - ++y_lr; - fg_ptr = (const value_type*) - base_type::source().row_ptr(y_lr) + (x_lr << 2); - - weight = (image_subpixel_scale - x_hr) * y_hr; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr++; - - weight = x_hr * y_hr; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr++; - - fg[0] >>= image_subpixel_shift * 2; - fg[1] >>= image_subpixel_shift * 2; - fg[2] >>= image_subpixel_shift * 2; - fg[3] >>= image_subpixel_shift * 2; - } - else - { - if(x_lr < -1 || y_lr < -1 || - x_lr > maxx || y_lr > maxy) - { - fg[order_type::R] = back_r; - fg[order_type::G] = back_g; - fg[order_type::B] = back_b; - fg[order_type::A] = back_a; - } - else - { - fg[0] = - fg[1] = - fg[2] = - fg[3] = image_subpixel_scale * image_subpixel_scale / 2; - - x_hr &= image_subpixel_mask; - y_hr &= image_subpixel_mask; - - weight = (image_subpixel_scale - x_hr) * - (image_subpixel_scale - y_hr); - if(x_lr >= 0 && y_lr >= 0 && - x_lr <= maxx && y_lr <= maxy) - { - fg_ptr = (const value_type*) - base_type::source().row_ptr(y_lr) + (x_lr << 2); - - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr++; - } - else - { - fg[order_type::R] += back_r * weight; - fg[order_type::G] += back_g * weight; - fg[order_type::B] += back_b * weight; - fg[order_type::A] += back_a * weight; - } - - x_lr++; - - weight = x_hr * (image_subpixel_scale - y_hr); - if(x_lr >= 0 && y_lr >= 0 && - x_lr <= maxx && y_lr <= maxy) - { - fg_ptr = (const value_type*) - base_type::source().row_ptr(y_lr) + (x_lr << 2); - - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr++; - } - else - { - fg[order_type::R] += back_r * weight; - fg[order_type::G] += back_g * weight; - fg[order_type::B] += back_b * weight; - fg[order_type::A] += back_a * weight; - } - - x_lr--; - y_lr++; - - weight = (image_subpixel_scale - x_hr) * y_hr; - if(x_lr >= 0 && y_lr >= 0 && - x_lr <= maxx && y_lr <= maxy) - { - fg_ptr = (const value_type*) - base_type::source().row_ptr(y_lr) + (x_lr << 2); - - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr++; - } - else - { - fg[order_type::R] += back_r * weight; - fg[order_type::G] += back_g * weight; - fg[order_type::B] += back_b * weight; - fg[order_type::A] += back_a * weight; - } - - x_lr++; - - weight = x_hr * y_hr; - if(x_lr >= 0 && y_lr >= 0 && - x_lr <= maxx && y_lr <= maxy) - { - fg_ptr = (const value_type*) - base_type::source().row_ptr(y_lr) + (x_lr << 2); - - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr++; - } - else - { - fg[order_type::R] += back_r * weight; - fg[order_type::G] += back_g * weight; - fg[order_type::B] += back_b * weight; - fg[order_type::A] += back_a * weight; - } - - fg[0] >>= image_subpixel_shift * 2; - fg[1] >>= image_subpixel_shift * 2; - fg[2] >>= image_subpixel_shift * 2; - fg[3] >>= image_subpixel_shift * 2; - } - } - - span->r = (value_type)fg[order_type::R]; - span->g = (value_type)fg[order_type::G]; - span->b = (value_type)fg[order_type::B]; - span->a = (value_type)fg[order_type::A]; - ++span; - ++base_type::interpolator(); - - } while(--len); - } - private: - color_type m_back_color; - }; - - - //==============================================span_image_filter_rgba_2x2 - template - class span_image_filter_rgba_2x2 : - public span_image_filter - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - span_image_filter_rgba_2x2() {} - span_image_filter_rgba_2x2(source_type& src, - interpolator_type& inter, - const image_filter_lut& filter) : - base_type(src, inter, &filter) - {} - - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - - calc_type fg[4]; - - const value_type *fg_ptr; - const int16* weight_array = base_type::filter().weight_array() + - ((base_type::filter().diameter()/2 - 1) << - image_subpixel_shift); - - do - { - int x_hr; - int y_hr; - - base_type::interpolator().coordinates(&x_hr, &y_hr); - - x_hr -= base_type::filter_dx_int(); - y_hr -= base_type::filter_dy_int(); - - int x_lr = x_hr >> image_subpixel_shift; - int y_lr = y_hr >> image_subpixel_shift; - - unsigned weight; - fg[0] = fg[1] = fg[2] = fg[3] = image_filter_scale / 2; - - x_hr &= image_subpixel_mask; - y_hr &= image_subpixel_mask; - - fg_ptr = (const value_type*)base_type::source().span(x_lr, y_lr, 2); - weight = (weight_array[x_hr + image_subpixel_scale] * - weight_array[y_hr + image_subpixel_scale] + - image_filter_scale / 2) >> - image_filter_shift; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr; - - fg_ptr = (const value_type*)base_type::source().next_x(); - weight = (weight_array[x_hr] * - weight_array[y_hr + image_subpixel_scale] + - image_filter_scale / 2) >> - image_filter_shift; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr; - - fg_ptr = (const value_type*)base_type::source().next_y(); - weight = (weight_array[x_hr + image_subpixel_scale] * - weight_array[y_hr] + - image_filter_scale / 2) >> - image_filter_shift; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr; - - fg_ptr = (const value_type*)base_type::source().next_x(); - weight = (weight_array[x_hr] * - weight_array[y_hr] + - image_filter_scale / 2) >> - image_filter_shift; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr; - - fg[0] >>= image_filter_shift; - fg[1] >>= image_filter_shift; - fg[2] >>= image_filter_shift; - fg[3] >>= image_filter_shift; - - if(fg[order_type::A] > base_mask) fg[order_type::A] = base_mask; - if(fg[order_type::R] > fg[order_type::A]) fg[order_type::R] = fg[order_type::A]; - if(fg[order_type::G] > fg[order_type::A]) fg[order_type::G] = fg[order_type::A]; - if(fg[order_type::B] > fg[order_type::A]) fg[order_type::B] = fg[order_type::A]; - - span->r = (value_type)fg[order_type::R]; - span->g = (value_type)fg[order_type::G]; - span->b = (value_type)fg[order_type::B]; - span->a = (value_type)fg[order_type::A]; - ++span; - ++base_type::interpolator(); - - } while(--len); - } - }; - - - - //==================================================span_image_filter_rgba - template - class span_image_filter_rgba : - public span_image_filter - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - span_image_filter_rgba() {} - span_image_filter_rgba(source_type& src, - interpolator_type& inter, - const image_filter_lut& filter) : - base_type(src, inter, &filter) - {} - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - - int fg[4]; - const value_type *fg_ptr; - - unsigned diameter = base_type::filter().diameter(); - int start = base_type::filter().start(); - const int16* weight_array = base_type::filter().weight_array(); - - int x_count; - int weight_y; - - do - { - base_type::interpolator().coordinates(&x, &y); - - x -= base_type::filter_dx_int(); - y -= base_type::filter_dy_int(); - - int x_hr = x; - int y_hr = y; - - int x_lr = x_hr >> image_subpixel_shift; - int y_lr = y_hr >> image_subpixel_shift; - - fg[0] = fg[1] = fg[2] = fg[3] = image_filter_scale / 2; - - int x_fract = x_hr & image_subpixel_mask; - unsigned y_count = diameter; - - y_hr = image_subpixel_mask - (y_hr & image_subpixel_mask); - fg_ptr = (const value_type*)base_type::source().span(x_lr + start, - y_lr + start, - diameter); - for(;;) - { - x_count = diameter; - weight_y = weight_array[y_hr]; - x_hr = image_subpixel_mask - x_fract; - for(;;) - { - int weight = (weight_y * weight_array[x_hr] + - image_filter_scale / 2) >> - image_filter_shift; - - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr; - - if(--x_count == 0) break; - x_hr += image_subpixel_scale; - fg_ptr = (const value_type*)base_type::source().next_x(); - } - - if(--y_count == 0) break; - y_hr += image_subpixel_scale; - fg_ptr = (const value_type*)base_type::source().next_y(); - } - - fg[0] >>= image_filter_shift; - fg[1] >>= image_filter_shift; - fg[2] >>= image_filter_shift; - fg[3] >>= image_filter_shift; - - if(fg[0] < 0) fg[0] = 0; - if(fg[1] < 0) fg[1] = 0; - if(fg[2] < 0) fg[2] = 0; - if(fg[3] < 0) fg[3] = 0; - - if(fg[order_type::A] > base_mask) fg[order_type::A] = base_mask; - if(fg[order_type::R] > fg[order_type::A]) fg[order_type::R] = fg[order_type::A]; - if(fg[order_type::G] > fg[order_type::A]) fg[order_type::G] = fg[order_type::A]; - if(fg[order_type::B] > fg[order_type::A]) fg[order_type::B] = fg[order_type::A]; - - span->r = (value_type)fg[order_type::R]; - span->g = (value_type)fg[order_type::G]; - span->b = (value_type)fg[order_type::B]; - span->a = (value_type)fg[order_type::A]; - ++span; - ++base_type::interpolator(); - - } while(--len); - } - }; - - - - //========================================span_image_resample_rgba_affine - template - class span_image_resample_rgba_affine : - public span_image_resample_affine - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef span_image_resample_affine base_type; - typedef typename base_type::interpolator_type interpolator_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::long_type long_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask, - downscale_shift = image_filter_shift - }; - - //-------------------------------------------------------------------- - span_image_resample_rgba_affine() {} - span_image_resample_rgba_affine(source_type& src, - interpolator_type& inter, - const image_filter_lut& filter) : - base_type(src, inter, filter) - {} - - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - - long_type fg[4]; - - int diameter = base_type::filter().diameter(); - int filter_scale = diameter << image_subpixel_shift; - int radius_x = (diameter * base_type::m_rx) >> 1; - int radius_y = (diameter * base_type::m_ry) >> 1; - int len_x_lr = - (diameter * base_type::m_rx + image_subpixel_mask) >> - image_subpixel_shift; - - const int16* weight_array = base_type::filter().weight_array(); - - do - { - base_type::interpolator().coordinates(&x, &y); - - x += base_type::filter_dx_int() - radius_x; - y += base_type::filter_dy_int() - radius_y; - - fg[0] = fg[1] = fg[2] = fg[3] = image_filter_scale / 2; - - int y_lr = y >> image_subpixel_shift; - int y_hr = ((image_subpixel_mask - (y & image_subpixel_mask)) * - base_type::m_ry_inv) >> - image_subpixel_shift; - int total_weight = 0; - int x_lr = x >> image_subpixel_shift; - int x_hr = ((image_subpixel_mask - (x & image_subpixel_mask)) * - base_type::m_rx_inv) >> - image_subpixel_shift; - - int x_hr2 = x_hr; - const value_type* fg_ptr = - (const value_type*)base_type::source().span(x_lr, y_lr, len_x_lr); - for(;;) - { - int weight_y = weight_array[y_hr]; - x_hr = x_hr2; - for(;;) - { - int weight = (weight_y * weight_array[x_hr] + - image_filter_scale / 2) >> - downscale_shift; - - fg[0] += *fg_ptr++ * weight; - fg[1] += *fg_ptr++ * weight; - fg[2] += *fg_ptr++ * weight; - fg[3] += *fg_ptr++ * weight; - total_weight += weight; - x_hr += base_type::m_rx_inv; - if(x_hr >= filter_scale) break; - fg_ptr = (const value_type*)base_type::source().next_x(); - } - y_hr += base_type::m_ry_inv; - if(y_hr >= filter_scale) break; - fg_ptr = (const value_type*)base_type::source().next_y(); - } - - fg[0] /= total_weight; - fg[1] /= total_weight; - fg[2] /= total_weight; - fg[3] /= total_weight; - - if(fg[0] < 0) fg[0] = 0; - if(fg[1] < 0) fg[1] = 0; - if(fg[2] < 0) fg[2] = 0; - if(fg[3] < 0) fg[3] = 0; - - if(fg[order_type::A] > base_mask) fg[order_type::A] = base_mask; - if(fg[order_type::R] > fg[order_type::A]) fg[order_type::R] = fg[order_type::A]; - if(fg[order_type::G] > fg[order_type::A]) fg[order_type::G] = fg[order_type::A]; - if(fg[order_type::B] > fg[order_type::A]) fg[order_type::B] = fg[order_type::A]; - - span->r = (value_type)fg[order_type::R]; - span->g = (value_type)fg[order_type::G]; - span->b = (value_type)fg[order_type::B]; - span->a = (value_type)fg[order_type::A]; - - ++span; - ++base_type::interpolator(); - } while(--len); - } - }; - - - - //==============================================span_image_resample_rgba - template - class span_image_resample_rgba : - public span_image_resample - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef Interpolator interpolator_type; - typedef span_image_resample base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::long_type long_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask, - downscale_shift = image_filter_shift - }; - - //-------------------------------------------------------------------- - span_image_resample_rgba() {} - span_image_resample_rgba(source_type& src, - interpolator_type& inter, - const image_filter_lut& filter) : - base_type(src, inter, filter) - {} - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - long_type fg[4]; - - int diameter = base_type::filter().diameter(); - int filter_scale = diameter << image_subpixel_shift; - - const int16* weight_array = base_type::filter().weight_array(); - do - { - int rx; - int ry; - int rx_inv = image_subpixel_scale; - int ry_inv = image_subpixel_scale; - base_type::interpolator().coordinates(&x, &y); - base_type::interpolator().local_scale(&rx, &ry); - base_type::adjust_scale(&rx, &ry); - - rx_inv = image_subpixel_scale * image_subpixel_scale / rx; - ry_inv = image_subpixel_scale * image_subpixel_scale / ry; - - int radius_x = (diameter * rx) >> 1; - int radius_y = (diameter * ry) >> 1; - int len_x_lr = - (diameter * rx + image_subpixel_mask) >> - image_subpixel_shift; - - x += base_type::filter_dx_int() - radius_x; - y += base_type::filter_dy_int() - radius_y; - - fg[0] = fg[1] = fg[2] = fg[3] = image_filter_scale / 2; - - int y_lr = y >> image_subpixel_shift; - int y_hr = ((image_subpixel_mask - (y & image_subpixel_mask)) * - ry_inv) >> - image_subpixel_shift; - int total_weight = 0; - int x_lr = x >> image_subpixel_shift; - int x_hr = ((image_subpixel_mask - (x & image_subpixel_mask)) * - rx_inv) >> - image_subpixel_shift; - int x_hr2 = x_hr; - const value_type* fg_ptr = - (const value_type*)base_type::source().span(x_lr, y_lr, len_x_lr); - - for(;;) - { - int weight_y = weight_array[y_hr]; - x_hr = x_hr2; - for(;;) - { - int weight = (weight_y * weight_array[x_hr] + - image_filter_scale / 2) >> - downscale_shift; - fg[0] += *fg_ptr++ * weight; - fg[1] += *fg_ptr++ * weight; - fg[2] += *fg_ptr++ * weight; - fg[3] += *fg_ptr++ * weight; - total_weight += weight; - x_hr += rx_inv; - if(x_hr >= filter_scale) break; - fg_ptr = (const value_type*)base_type::source().next_x(); - } - y_hr += ry_inv; - if(y_hr >= filter_scale) break; - fg_ptr = (const value_type*)base_type::source().next_y(); - } - - fg[0] /= total_weight; - fg[1] /= total_weight; - fg[2] /= total_weight; - fg[3] /= total_weight; - - if(fg[0] < 0) fg[0] = 0; - if(fg[1] < 0) fg[1] = 0; - if(fg[2] < 0) fg[2] = 0; - if(fg[3] < 0) fg[3] = 0; - - if(fg[order_type::A] > base_mask) fg[order_type::A] = base_mask; - if(fg[order_type::R] > fg[order_type::R]) fg[order_type::R] = fg[order_type::R]; - if(fg[order_type::G] > fg[order_type::G]) fg[order_type::G] = fg[order_type::G]; - if(fg[order_type::B] > fg[order_type::B]) fg[order_type::B] = fg[order_type::B]; - - span->r = (value_type)fg[order_type::R]; - span->g = (value_type)fg[order_type::G]; - span->b = (value_type)fg[order_type::B]; - span->a = (value_type)fg[order_type::A]; - - ++span; - ++base_type::interpolator(); - } while(--len); - } - }; - - -} - - -#endif - - - diff --git a/uppdev/agg24/agg_span_interpolator_adaptor.h b/uppdev/agg24/agg_span_interpolator_adaptor.h deleted file mode 100644 index 17ea71291..000000000 --- a/uppdev/agg24/agg_span_interpolator_adaptor.h +++ /dev/null @@ -1,77 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_SPAN_INTERPOLATOR_ADAPTOR_INCLUDED -#define AGG_SPAN_INTERPOLATOR_ADAPTOR_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - - //===============================================span_interpolator_adaptor - template - class span_interpolator_adaptor : public Interpolator - { - public: - typedef Interpolator base_type; - typedef typename base_type::trans_type trans_type; - typedef Distortion distortion_type; - - //-------------------------------------------------------------------- - span_interpolator_adaptor() {} - span_interpolator_adaptor(const trans_type& trans, - const distortion_type& dist) : - base_type(trans), - m_distortion(&dist) - { - } - - //-------------------------------------------------------------------- - span_interpolator_adaptor(const trans_type& trans, - const distortion_type& dist, - double x, double y, unsigned len) : - base_type(trans, x, y, len), - m_distortion(&dist) - { - } - - //-------------------------------------------------------------------- - const distortion_type& distortion() const - { - return *m_distortion; - } - - //-------------------------------------------------------------------- - void distortion(const distortion_type& dist) - { - m_distortion = dist; - } - - //-------------------------------------------------------------------- - void coordinates(int* x, int* y) const - { - base_type::coordinates(x, y); - m_distortion->calculate(x, y); - } - - private: - //-------------------------------------------------------------------- - const distortion_type* m_distortion; - }; -} - - -#endif diff --git a/uppdev/agg24/agg_span_interpolator_linear.h b/uppdev/agg24/agg_span_interpolator_linear.h deleted file mode 100644 index cbf3d1a41..000000000 --- a/uppdev/agg24/agg_span_interpolator_linear.h +++ /dev/null @@ -1,232 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_SPAN_INTERPOLATOR_LINEAR_INCLUDED -#define AGG_SPAN_INTERPOLATOR_LINEAR_INCLUDED - -#include "agg_basics.h" -#include "agg_dda_line.h" -#include "agg_trans_affine.h" - -namespace agg -{ - - //================================================span_interpolator_linear - template - class span_interpolator_linear - { - public: - typedef Transformer trans_type; - - enum subpixel_scale_e - { - subpixel_shift = SubpixelShift, - subpixel_scale = 1 << subpixel_shift - }; - - //-------------------------------------------------------------------- - span_interpolator_linear() {} - span_interpolator_linear(const trans_type& trans) : m_trans(&trans) {} - span_interpolator_linear(const trans_type& trans, - double x, double y, unsigned len) : - m_trans(&trans) - { - begin(x, y, len); - } - - //---------------------------------------------------------------- - const trans_type& transformer() const { return *m_trans; } - void transformer(const trans_type& trans) { m_trans = &trans; } - - //---------------------------------------------------------------- - void begin(double x, double y, unsigned len) - { - double tx; - double ty; - - tx = x; - ty = y; - m_trans->transform(&tx, &ty); - int x1 = iround(tx * subpixel_scale); - int y1 = iround(ty * subpixel_scale); - - tx = x + len; - ty = y; - m_trans->transform(&tx, &ty); - int x2 = iround(tx * subpixel_scale); - int y2 = iround(ty * subpixel_scale); - - m_li_x = dda2_line_interpolator(x1, x2, len); - m_li_y = dda2_line_interpolator(y1, y2, len); - } - - //---------------------------------------------------------------- - void resynchronize(double xe, double ye, unsigned len) - { - m_trans->transform(&xe, &ye); - m_li_x = dda2_line_interpolator(m_li_x.y(), iround(xe * subpixel_scale), len); - m_li_y = dda2_line_interpolator(m_li_y.y(), iround(ye * subpixel_scale), len); - } - - //---------------------------------------------------------------- - void operator++() - { - ++m_li_x; - ++m_li_y; - } - - //---------------------------------------------------------------- - void coordinates(int* x, int* y) const - { - *x = m_li_x.y(); - *y = m_li_y.y(); - } - - private: - const trans_type* m_trans; - dda2_line_interpolator m_li_x; - dda2_line_interpolator m_li_y; - }; - - - - - - - //=====================================span_interpolator_linear_subdiv - template - class span_interpolator_linear_subdiv - { - public: - typedef Transformer trans_type; - - enum subpixel_scale_e - { - subpixel_shift = SubpixelShift, - subpixel_scale = 1 << subpixel_shift - }; - - - //---------------------------------------------------------------- - span_interpolator_linear_subdiv() : - m_subdiv_shift(4), - m_subdiv_size(1 << m_subdiv_shift), - m_subdiv_mask(m_subdiv_size - 1) {} - - span_interpolator_linear_subdiv(const trans_type& trans, - unsigned subdiv_shift = 4) : - m_subdiv_shift(subdiv_shift), - m_subdiv_size(1 << m_subdiv_shift), - m_subdiv_mask(m_subdiv_size - 1), - m_trans(&trans) {} - - span_interpolator_linear_subdiv(const trans_type& trans, - double x, double y, unsigned len, - unsigned subdiv_shift = 4) : - m_subdiv_shift(subdiv_shift), - m_subdiv_size(1 << m_subdiv_shift), - m_subdiv_mask(m_subdiv_size - 1), - m_trans(&trans) - { - begin(x, y, len); - } - - //---------------------------------------------------------------- - const trans_type& transformer() const { return *m_trans; } - void transformer(const trans_type& trans) { m_trans = &trans; } - - //---------------------------------------------------------------- - unsigned subdiv_shift() const { return m_subdiv_shift; } - void subdiv_shift(unsigned shift) - { - m_subdiv_shift = shift; - m_subdiv_size = 1 << m_subdiv_shift; - m_subdiv_mask = m_subdiv_size - 1; - } - - //---------------------------------------------------------------- - void begin(double x, double y, unsigned len) - { - double tx; - double ty; - m_pos = 1; - m_src_x = iround(x * subpixel_scale) + subpixel_scale; - m_src_y = y; - m_len = len; - - if(len > m_subdiv_size) len = m_subdiv_size; - tx = x; - ty = y; - m_trans->transform(&tx, &ty); - int x1 = iround(tx * subpixel_scale); - int y1 = iround(ty * subpixel_scale); - - tx = x + len; - ty = y; - m_trans->transform(&tx, &ty); - - m_li_x = dda2_line_interpolator(x1, iround(tx * subpixel_scale), len); - m_li_y = dda2_line_interpolator(y1, iround(ty * subpixel_scale), len); - } - - //---------------------------------------------------------------- - void operator++() - { - ++m_li_x; - ++m_li_y; - if(m_pos >= m_subdiv_size) - { - unsigned len = m_len; - if(len > m_subdiv_size) len = m_subdiv_size; - double tx = double(m_src_x) / double(subpixel_scale) + len; - double ty = m_src_y; - m_trans->transform(&tx, &ty); - m_li_x = dda2_line_interpolator(m_li_x.y(), iround(tx * subpixel_scale), len); - m_li_y = dda2_line_interpolator(m_li_y.y(), iround(ty * subpixel_scale), len); - m_pos = 0; - } - m_src_x += subpixel_scale; - ++m_pos; - --m_len; - } - - //---------------------------------------------------------------- - void coordinates(int* x, int* y) const - { - *x = m_li_x.y(); - *y = m_li_y.y(); - } - - private: - unsigned m_subdiv_shift; - unsigned m_subdiv_size; - unsigned m_subdiv_mask; - const trans_type* m_trans; - dda2_line_interpolator m_li_x; - dda2_line_interpolator m_li_y; - int m_src_x; - double m_src_y; - unsigned m_pos; - unsigned m_len; - }; - - -} - - - -#endif - - diff --git a/uppdev/agg24/agg_span_interpolator_persp.h b/uppdev/agg24/agg_span_interpolator_persp.h deleted file mode 100644 index cad437e04..000000000 --- a/uppdev/agg24/agg_span_interpolator_persp.h +++ /dev/null @@ -1,462 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -#ifndef AGG_SPAN_INTERPOLATOR_PERSP_INCLUDED -#define AGG_SPAN_INTERPOLATOR_PERSP_INCLUDED - -#include "agg_trans_perspective.h" -#include "agg_dda_line.h" - -namespace agg -{ - - - - //===========================================span_interpolator_persp_exact - template - class span_interpolator_persp_exact - { - public: - typedef trans_perspective trans_type; - typedef trans_perspective::iterator_x iterator_type; - enum subpixel_scale_e - { - subpixel_shift = SubpixelShift, - subpixel_scale = 1 << subpixel_shift - }; - - //-------------------------------------------------------------------- - span_interpolator_persp_exact() {} - - //-------------------------------------------------------------------- - // Arbitrary quadrangle transformations - span_interpolator_persp_exact(const double* src, const double* dst) - { - quad_to_quad(src, dst); - } - - //-------------------------------------------------------------------- - // Direct transformations - span_interpolator_persp_exact(double x1, double y1, - double x2, double y2, - const double* quad) - { - rect_to_quad(x1, y1, x2, y2, quad); - } - - //-------------------------------------------------------------------- - // Reverse transformations - span_interpolator_persp_exact(const double* quad, - double x1, double y1, - double x2, double y2) - { - quad_to_rect(quad, x1, y1, x2, y2); - } - - //-------------------------------------------------------------------- - // Set the transformations using two arbitrary quadrangles. - void quad_to_quad(const double* src, const double* dst) - { - m_trans_dir.quad_to_quad(src, dst); - m_trans_inv.quad_to_quad(dst, src); - } - - //-------------------------------------------------------------------- - // Set the direct transformations, i.e., rectangle -> quadrangle - void rect_to_quad(double x1, double y1, double x2, double y2, - const double* quad) - { - double src[8]; - src[0] = src[6] = x1; - src[2] = src[4] = x2; - src[1] = src[3] = y1; - src[5] = src[7] = y2; - quad_to_quad(src, quad); - } - - - //-------------------------------------------------------------------- - // Set the reverse transformations, i.e., quadrangle -> rectangle - void quad_to_rect(const double* quad, - double x1, double y1, double x2, double y2) - { - double dst[8]; - dst[0] = dst[6] = x1; - dst[2] = dst[4] = x2; - dst[1] = dst[3] = y1; - dst[5] = dst[7] = y2; - quad_to_quad(quad, dst); - } - - //-------------------------------------------------------------------- - // Check if the equations were solved successfully - bool is_valid() const { return m_trans_dir.is_valid(); } - - //---------------------------------------------------------------- - void begin(double x, double y, unsigned len) - { - m_iterator = m_trans_dir.begin(x, y, 1.0); - double xt = m_iterator.x; - double yt = m_iterator.y; - - double dx; - double dy; - const double delta = 1/double(subpixel_scale); - dx = xt + delta; - dy = yt; - m_trans_inv.transform(&dx, &dy); - dx -= x; - dy -= y; - int sx1 = uround(subpixel_scale/sqrt(dx*dx + dy*dy)) >> subpixel_shift; - dx = xt; - dy = yt + delta; - m_trans_inv.transform(&dx, &dy); - dx -= x; - dy -= y; - int sy1 = uround(subpixel_scale/sqrt(dx*dx + dy*dy)) >> subpixel_shift; - - x += len; - xt = x; - yt = y; - m_trans_dir.transform(&xt, &yt); - - dx = xt + delta; - dy = yt; - m_trans_inv.transform(&dx, &dy); - dx -= x; - dy -= y; - int sx2 = uround(subpixel_scale/sqrt(dx*dx + dy*dy)) >> subpixel_shift; - dx = xt; - dy = yt + delta; - m_trans_inv.transform(&dx, &dy); - dx -= x; - dy -= y; - int sy2 = uround(subpixel_scale/sqrt(dx*dx + dy*dy)) >> subpixel_shift; - - m_scale_x = dda2_line_interpolator(sx1, sx2, len); - m_scale_y = dda2_line_interpolator(sy1, sy2, len); - } - - - //---------------------------------------------------------------- - void resynchronize(double xe, double ye, unsigned len) - { - // Assume x1,y1 are equal to the ones at the previous end point - int sx1 = m_scale_x.y(); - int sy1 = m_scale_y.y(); - - // Calculate transformed coordinates at x2,y2 - double xt = xe; - double yt = ye; - m_trans_dir.transform(&xt, &yt); - - const double delta = 1/double(subpixel_scale); - double dx; - double dy; - - // Calculate scale by X at x2,y2 - dx = xt + delta; - dy = yt; - m_trans_inv.transform(&dx, &dy); - dx -= xe; - dy -= ye; - int sx2 = uround(subpixel_scale/sqrt(dx*dx + dy*dy)) >> subpixel_shift; - - // Calculate scale by Y at x2,y2 - dx = xt; - dy = yt + delta; - m_trans_inv.transform(&dx, &dy); - dx -= xe; - dy -= ye; - int sy2 = uround(subpixel_scale/sqrt(dx*dx + dy*dy)) >> subpixel_shift; - - // Initialize the interpolators - m_scale_x = dda2_line_interpolator(sx1, sx2, len); - m_scale_y = dda2_line_interpolator(sy1, sy2, len); - } - - - - //---------------------------------------------------------------- - void operator++() - { - ++m_iterator; - ++m_scale_x; - ++m_scale_y; - } - - //---------------------------------------------------------------- - void coordinates(int* x, int* y) const - { - *x = iround(m_iterator.x * subpixel_scale); - *y = iround(m_iterator.y * subpixel_scale); - } - - //---------------------------------------------------------------- - void local_scale(int* x, int* y) - { - *x = m_scale_x.y(); - *y = m_scale_y.y(); - } - - //---------------------------------------------------------------- - void transform(double* x, double* y) const - { - m_trans_dir.transform(x, y); - } - - private: - trans_type m_trans_dir; - trans_type m_trans_inv; - iterator_type m_iterator; - dda2_line_interpolator m_scale_x; - dda2_line_interpolator m_scale_y; - }; - - - - - - - - - - - - //============================================span_interpolator_persp_lerp - template - class span_interpolator_persp_lerp - { - public: - typedef trans_perspective trans_type; - enum subpixel_scale_e - { - subpixel_shift = SubpixelShift, - subpixel_scale = 1 << subpixel_shift - }; - - //-------------------------------------------------------------------- - span_interpolator_persp_lerp() {} - - //-------------------------------------------------------------------- - // Arbitrary quadrangle transformations - span_interpolator_persp_lerp(const double* src, const double* dst) - { - quad_to_quad(src, dst); - } - - //-------------------------------------------------------------------- - // Direct transformations - span_interpolator_persp_lerp(double x1, double y1, - double x2, double y2, - const double* quad) - { - rect_to_quad(x1, y1, x2, y2, quad); - } - - //-------------------------------------------------------------------- - // Reverse transformations - span_interpolator_persp_lerp(const double* quad, - double x1, double y1, - double x2, double y2) - { - quad_to_rect(quad, x1, y1, x2, y2); - } - - //-------------------------------------------------------------------- - // Set the transformations using two arbitrary quadrangles. - void quad_to_quad(const double* src, const double* dst) - { - m_trans_dir.quad_to_quad(src, dst); - m_trans_inv.quad_to_quad(dst, src); - } - - //-------------------------------------------------------------------- - // Set the direct transformations, i.e., rectangle -> quadrangle - void rect_to_quad(double x1, double y1, double x2, double y2, - const double* quad) - { - double src[8]; - src[0] = src[6] = x1; - src[2] = src[4] = x2; - src[1] = src[3] = y1; - src[5] = src[7] = y2; - quad_to_quad(src, quad); - } - - - //-------------------------------------------------------------------- - // Set the reverse transformations, i.e., quadrangle -> rectangle - void quad_to_rect(const double* quad, - double x1, double y1, double x2, double y2) - { - double dst[8]; - dst[0] = dst[6] = x1; - dst[2] = dst[4] = x2; - dst[1] = dst[3] = y1; - dst[5] = dst[7] = y2; - quad_to_quad(quad, dst); - } - - //-------------------------------------------------------------------- - // Check if the equations were solved successfully - bool is_valid() const { return m_trans_dir.is_valid(); } - - //---------------------------------------------------------------- - void begin(double x, double y, unsigned len) - { - // Calculate transformed coordinates at x1,y1 - double xt = x; - double yt = y; - m_trans_dir.transform(&xt, &yt); - int x1 = iround(xt * subpixel_scale); - int y1 = iround(yt * subpixel_scale); - - double dx; - double dy; - const double delta = 1/double(subpixel_scale); - - // Calculate scale by X at x1,y1 - dx = xt + delta; - dy = yt; - m_trans_inv.transform(&dx, &dy); - dx -= x; - dy -= y; - int sx1 = uround(subpixel_scale/sqrt(dx*dx + dy*dy)) >> subpixel_shift; - - // Calculate scale by Y at x1,y1 - dx = xt; - dy = yt + delta; - m_trans_inv.transform(&dx, &dy); - dx -= x; - dy -= y; - int sy1 = uround(subpixel_scale/sqrt(dx*dx + dy*dy)) >> subpixel_shift; - - // Calculate transformed coordinates at x2,y2 - x += len; - xt = x; - yt = y; - m_trans_dir.transform(&xt, &yt); - int x2 = iround(xt * subpixel_scale); - int y2 = iround(yt * subpixel_scale); - - // Calculate scale by X at x2,y2 - dx = xt + delta; - dy = yt; - m_trans_inv.transform(&dx, &dy); - dx -= x; - dy -= y; - int sx2 = uround(subpixel_scale/sqrt(dx*dx + dy*dy)) >> subpixel_shift; - - // Calculate scale by Y at x2,y2 - dx = xt; - dy = yt + delta; - m_trans_inv.transform(&dx, &dy); - dx -= x; - dy -= y; - int sy2 = uround(subpixel_scale/sqrt(dx*dx + dy*dy)) >> subpixel_shift; - - // Initialize the interpolators - m_coord_x = dda2_line_interpolator(x1, x2, len); - m_coord_y = dda2_line_interpolator(y1, y2, len); - m_scale_x = dda2_line_interpolator(sx1, sx2, len); - m_scale_y = dda2_line_interpolator(sy1, sy2, len); - } - - - //---------------------------------------------------------------- - void resynchronize(double xe, double ye, unsigned len) - { - // Assume x1,y1 are equal to the ones at the previous end point - int x1 = m_coord_x.y(); - int y1 = m_coord_y.y(); - int sx1 = m_scale_x.y(); - int sy1 = m_scale_y.y(); - - // Calculate transformed coordinates at x2,y2 - double xt = xe; - double yt = ye; - m_trans_dir.transform(&xt, &yt); - int x2 = iround(xt * subpixel_scale); - int y2 = iround(yt * subpixel_scale); - - const double delta = 1/double(subpixel_scale); - double dx; - double dy; - - // Calculate scale by X at x2,y2 - dx = xt + delta; - dy = yt; - m_trans_inv.transform(&dx, &dy); - dx -= xe; - dy -= ye; - int sx2 = uround(subpixel_scale/sqrt(dx*dx + dy*dy)) >> subpixel_shift; - - // Calculate scale by Y at x2,y2 - dx = xt; - dy = yt + delta; - m_trans_inv.transform(&dx, &dy); - dx -= xe; - dy -= ye; - int sy2 = uround(subpixel_scale/sqrt(dx*dx + dy*dy)) >> subpixel_shift; - - // Initialize the interpolators - m_coord_x = dda2_line_interpolator(x1, x2, len); - m_coord_y = dda2_line_interpolator(y1, y2, len); - m_scale_x = dda2_line_interpolator(sx1, sx2, len); - m_scale_y = dda2_line_interpolator(sy1, sy2, len); - } - - - //---------------------------------------------------------------- - void operator++() - { - ++m_coord_x; - ++m_coord_y; - ++m_scale_x; - ++m_scale_y; - } - - //---------------------------------------------------------------- - void coordinates(int* x, int* y) const - { - *x = m_coord_x.y(); - *y = m_coord_y.y(); - } - - //---------------------------------------------------------------- - void local_scale(int* x, int* y) - { - *x = m_scale_x.y(); - *y = m_scale_y.y(); - } - - //---------------------------------------------------------------- - void transform(double* x, double* y) const - { - m_trans_dir.transform(x, y); - } - - private: - trans_type m_trans_dir; - trans_type m_trans_inv; - dda2_line_interpolator m_coord_x; - dda2_line_interpolator m_coord_y; - dda2_line_interpolator m_scale_x; - dda2_line_interpolator m_scale_y; - }; - -} - -#endif diff --git a/uppdev/agg24/agg_span_interpolator_trans.h b/uppdev/agg24/agg_span_interpolator_trans.h deleted file mode 100644 index 7c474742f..000000000 --- a/uppdev/agg24/agg_span_interpolator_trans.h +++ /dev/null @@ -1,92 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Horizontal span interpolator for use with an arbitrary transformer -// The efficiency highly depends on the operations done in the transformer -// -//---------------------------------------------------------------------------- - -#ifndef AGG_SPAN_INTERPOLATOR_TRANS_INCLUDED -#define AGG_SPAN_INTERPOLATOR_TRANS_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - //=================================================span_interpolator_trans - template - class span_interpolator_trans - { - public: - typedef Transformer trans_type; - enum subpixel_scale_e - { - subpixel_shift = SubpixelShift, - subpixel_scale = 1 << subpixel_shift - }; - - //-------------------------------------------------------------------- - span_interpolator_trans() {} - span_interpolator_trans(const trans_type& trans) : m_trans(&trans) {} - span_interpolator_trans(const trans_type& trans, - double x, double y, unsigned) : - m_trans(&trans) - { - begin(x, y, 0); - } - - //---------------------------------------------------------------- - const trans_type& transformer() const { return *m_trans; } - void transformer(const trans_type& trans) { m_trans = &trans; } - - //---------------------------------------------------------------- - void begin(double x, double y, unsigned) - { - m_x = x; - m_y = y; - m_trans->transform(&x, &y); - m_ix = iround(x * subpixel_scale); - m_iy = iround(y * subpixel_scale); - } - - //---------------------------------------------------------------- - void operator++() - { - m_x += 1.0; - double x = m_x; - double y = m_y; - m_trans->transform(&x, &y); - m_ix = iround(x * subpixel_scale); - m_iy = iround(y * subpixel_scale); - } - - //---------------------------------------------------------------- - void coordinates(int* x, int* y) const - { - *x = m_ix; - *y = m_iy; - } - - private: - const trans_type* m_trans; - double m_x; - double m_y; - int m_ix; - int m_iy; - }; - -} - -#endif diff --git a/uppdev/agg24/agg_span_pattern_gray.h b/uppdev/agg24/agg_span_pattern_gray.h deleted file mode 100644 index ae1a49f87..000000000 --- a/uppdev/agg24/agg_span_pattern_gray.h +++ /dev/null @@ -1,93 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Adaptation for high precision colors has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- - - -#ifndef AGG_SPAN_PATTERN_GRAY_INCLUDED -#define AGG_SPAN_PATTERN_GRAY_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - - //=======================================================span_pattern_gray - template class span_pattern_gray - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - - //-------------------------------------------------------------------- - span_pattern_gray() {} - span_pattern_gray(source_type& src, - unsigned offset_x, unsigned offset_y) : - m_src(&src), - m_offset_x(offset_x), - m_offset_y(offset_y), - m_alpha(color_type::base_mask) - {} - - //-------------------------------------------------------------------- - void attach(source_type& v) { m_src = &v; } - source_type& source() { return *m_src; } - const source_type& source() const { return *m_src; } - - //-------------------------------------------------------------------- - void offset_x(unsigned v) { m_offset_x = v; } - void offset_y(unsigned v) { m_offset_y = v; } - unsigned offset_x() const { return m_offset_x; } - unsigned offset_y() const { return m_offset_y; } - void alpha(value_type v) { m_alpha = v; } - value_type alpha() const { return m_alpha; } - - //-------------------------------------------------------------------- - void prepare() {} - void generate(color_type* span, int x, int y, unsigned len) - { - x += m_offset_x; - y += m_offset_y; - const value_type* p = (const value_type*)m_src->span(x, y, len); - do - { - span->v = *p; - span->a = m_alpha; - p = m_src->next_x(); - ++span; - } - while(--len); - } - - private: - source_type* m_src; - unsigned m_offset_x; - unsigned m_offset_y; - value_type m_alpha; - - }; - -} - -#endif - diff --git a/uppdev/agg24/agg_span_pattern_rgb.h b/uppdev/agg24/agg_span_pattern_rgb.h deleted file mode 100644 index 4850508af..000000000 --- a/uppdev/agg24/agg_span_pattern_rgb.h +++ /dev/null @@ -1,96 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Adaptation for high precision colors has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- - - -#ifndef AGG_SPAN_PATTERN_RGB_INCLUDED -#define AGG_SPAN_PATTERN_RGB_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - - //========================================================span_pattern_rgb - template class span_pattern_rgb - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - - //-------------------------------------------------------------------- - span_pattern_rgb() {} - span_pattern_rgb(source_type& src, - unsigned offset_x, unsigned offset_y) : - m_src(&src), - m_offset_x(offset_x), - m_offset_y(offset_y), - m_alpha(color_type::base_mask) - {} - - //-------------------------------------------------------------------- - void attach(source_type& v) { m_src = &v; } - source_type& source() { return *m_src; } - const source_type& source() const { return *m_src; } - - //-------------------------------------------------------------------- - void offset_x(unsigned v) { m_offset_x = v; } - void offset_y(unsigned v) { m_offset_y = v; } - unsigned offset_x() const { return m_offset_x; } - unsigned offset_y() const { return m_offset_y; } - void alpha(value_type v) { m_alpha = v; } - value_type alpha() const { return m_alpha; } - - //-------------------------------------------------------------------- - void prepare() {} - void generate(color_type* span, int x, int y, unsigned len) - { - x += m_offset_x; - y += m_offset_y; - const value_type* p = (const value_type*)m_src->span(x, y, len); - do - { - span->r = p[order_type::R]; - span->g = p[order_type::G]; - span->b = p[order_type::B]; - span->a = m_alpha; - p = m_src->next_x(); - ++span; - } - while(--len); - } - - private: - source_type* m_src; - unsigned m_offset_x; - unsigned m_offset_y; - value_type m_alpha; - - }; - -} - -#endif - diff --git a/uppdev/agg24/agg_span_pattern_rgba.h b/uppdev/agg24/agg_span_pattern_rgba.h deleted file mode 100644 index d47d2a6c0..000000000 --- a/uppdev/agg24/agg_span_pattern_rgba.h +++ /dev/null @@ -1,94 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Adaptation for high precision colors has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- - - -#ifndef AGG_SPAN_PATTERN_RGBA_INCLUDED -#define AGG_SPAN_PATTERN_RGBA_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - - //======================================================span_pattern_rgba - template class span_pattern_rgba - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - - //-------------------------------------------------------------------- - span_pattern_rgba() {} - span_pattern_rgba(source_type& src, - unsigned offset_x, unsigned offset_y) : - m_src(&src), - m_offset_x(offset_x), - m_offset_y(offset_y) - {} - - //-------------------------------------------------------------------- - void attach(source_type& v) { m_src = &v; } - source_type& source() { return *m_src; } - const source_type& source() const { return *m_src; } - - //-------------------------------------------------------------------- - void offset_x(unsigned v) { m_offset_x = v; } - void offset_y(unsigned v) { m_offset_y = v; } - unsigned offset_x() const { return m_offset_x; } - unsigned offset_y() const { return m_offset_y; } - void alpha(value_type) {} - value_type alpha() const { return 0; } - - //-------------------------------------------------------------------- - void prepare() {} - void generate(color_type* span, int x, int y, unsigned len) - { - x += m_offset_x; - y += m_offset_y; - const value_type* p = (const value_type*)m_src->span(x, y, len); - do - { - span->r = p[order_type::R]; - span->g = p[order_type::G]; - span->b = p[order_type::B]; - span->a = p[order_type::A]; - p = (const value_type*)m_src->next_x(); - ++span; - } - while(--len); - } - - private: - source_type* m_src; - unsigned m_offset_x; - unsigned m_offset_y; - - }; - -} - -#endif - diff --git a/uppdev/agg24/agg_span_solid.h b/uppdev/agg24/agg_span_solid.h deleted file mode 100644 index ee46df999..000000000 --- a/uppdev/agg24/agg_span_solid.h +++ /dev/null @@ -1,53 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// span_solid_rgba8 -// -//---------------------------------------------------------------------------- - -#ifndef AGG_SPAN_SOLID_INCLUDED -#define AGG_SPAN_SOLID_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - //--------------------------------------------------------------span_solid - template class span_solid - { - public: - typedef ColorT color_type; - - //-------------------------------------------------------------------- - void color(const color_type& c) { m_color = c; } - const color_type& color() const { return m_color; } - - //-------------------------------------------------------------------- - void prepare() {} - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - do { *span++ = m_color; } while(--len); - } - - private: - color_type m_color; - }; - - -} - -#endif diff --git a/uppdev/agg24/agg_span_subdiv_adaptor.h b/uppdev/agg24/agg_span_subdiv_adaptor.h deleted file mode 100644 index b5b855ec9..000000000 --- a/uppdev/agg24/agg_span_subdiv_adaptor.h +++ /dev/null @@ -1,141 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -#ifndef AGG_SPAN_SUBDIV_ADAPTOR_INCLUDED -#define AGG_SPAN_SUBDIV_ADAPTOR_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - - //=================================================span_subdiv_adaptor - template - class span_subdiv_adaptor - { - public: - typedef Interpolator interpolator_type; - typedef typename interpolator_type::trans_type trans_type; - - enum sublixel_scale_e - { - subpixel_shift = SubpixelShift, - subpixel_scale = 1 << subpixel_shift - }; - - - //---------------------------------------------------------------- - span_subdiv_adaptor() : - m_subdiv_shift(4), - m_subdiv_size(1 << m_subdiv_shift), - m_subdiv_mask(m_subdiv_size - 1) {} - - span_subdiv_adaptor(interpolator_type& interpolator, - unsigned subdiv_shift = 4) : - m_subdiv_shift(subdiv_shift), - m_subdiv_size(1 << m_subdiv_shift), - m_subdiv_mask(m_subdiv_size - 1), - m_interpolator(&interpolator) {} - - span_subdiv_adaptor(interpolator_type& interpolator, - double x, double y, unsigned len, - unsigned subdiv_shift = 4) : - m_subdiv_shift(subdiv_shift), - m_subdiv_size(1 << m_subdiv_shift), - m_subdiv_mask(m_subdiv_size - 1), - m_interpolator(&interpolator) - { - begin(x, y, len); - } - - - //---------------------------------------------------------------- - const interpolator_type& interpolator() const { return *m_interpolator; } - void interpolator(interpolator_type& intr) { m_interpolator = &intr; } - - //---------------------------------------------------------------- - const trans_type& transformer() const - { - return *m_interpolator->transformer(); - } - void transformer(const trans_type& trans) - { - m_interpolator->transformer(trans); - } - - //---------------------------------------------------------------- - unsigned subdiv_shift() const { return m_subdiv_shift; } - void subdiv_shift(unsigned shift) - { - m_subdiv_shift = shift; - m_subdiv_size = 1 << m_subdiv_shift; - m_subdiv_mask = m_subdiv_size - 1; - } - - //---------------------------------------------------------------- - void begin(double x, double y, unsigned len) - { - m_pos = 1; - m_src_x = iround(x * subpixel_scale) + subpixel_scale; - m_src_y = y; - m_len = len; - if(len > m_subdiv_size) len = m_subdiv_size; - m_interpolator->begin(x, y, len); - } - - //---------------------------------------------------------------- - void operator++() - { - ++(*m_interpolator); - if(m_pos >= m_subdiv_size) - { - unsigned len = m_len; - if(len > m_subdiv_size) len = m_subdiv_size; - m_interpolator->resynchronize(double(m_src_x) / double(subpixel_scale) + len, - m_src_y, - len); - m_pos = 0; - } - m_src_x += subpixel_scale; - ++m_pos; - --m_len; - } - - //---------------------------------------------------------------- - void coordinates(int* x, int* y) const - { - m_interpolator->coordinates(x, y); - } - - //---------------------------------------------------------------- - void local_scale(int* x, int* y) const - { - m_interpolator->local_scale(x, y); - } - - - private: - unsigned m_subdiv_shift; - unsigned m_subdiv_size; - unsigned m_subdiv_mask; - interpolator_type* m_interpolator; - int m_src_x; - double m_src_y; - unsigned m_pos; - unsigned m_len; - }; - -} - -#endif diff --git a/uppdev/agg24/agg_spline_ctrl.cpp b/uppdev/agg24/agg_spline_ctrl.cpp deleted file mode 100644 index 9b56b44eb..000000000 --- a/uppdev/agg24/agg_spline_ctrl.cpp +++ /dev/null @@ -1,407 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// classes spline_ctrl_impl, spline_ctrl -// -//---------------------------------------------------------------------------- - -#include "agg_spline_ctrl.h" - - -namespace agg -{ - - //------------------------------------------------------------------------ - spline_ctrl_impl::spline_ctrl_impl(double x1, double y1, double x2, double y2, - unsigned num_pnt, bool flip_y) : - ctrl(x1, y1, x2, y2, flip_y), - m_num_pnt(num_pnt), - m_border_width(1.0), - m_border_extra(0.0), - m_curve_width(1.0), - m_point_size(3.0), - m_curve_poly(m_curve_pnt), - m_idx(0), - m_vertex(0), - m_active_pnt(-1), - m_move_pnt(-1), - m_pdx(0.0), - m_pdy(0.0) - { - if(m_num_pnt < 4) m_num_pnt = 4; - if(m_num_pnt > 32) m_num_pnt = 32; - - unsigned i; - for(i = 0; i < m_num_pnt; i++) - { - m_xp[i] = double(i) / double(m_num_pnt - 1); - m_yp[i] = 0.5; - } - calc_spline_box(); - update_spline(); - } - - - //------------------------------------------------------------------------ - void spline_ctrl_impl::border_width(double t, double extra) - { - m_border_width = t; - m_border_extra = extra; - calc_spline_box(); - } - - - //------------------------------------------------------------------------ - void spline_ctrl_impl::calc_spline_box() - { - m_xs1 = m_x1 + m_border_width; - m_ys1 = m_y1 + m_border_width; - m_xs2 = m_x2 - m_border_width; - m_ys2 = m_y2 - m_border_width; - } - - - //------------------------------------------------------------------------ - void spline_ctrl_impl::update_spline() - { - int i; - m_spline.init(m_num_pnt, m_xp, m_yp); - for(i = 0; i < 256; i++) - { - m_spline_values[i] = m_spline.get(double(i) / 255.0); - if(m_spline_values[i] < 0.0) m_spline_values[i] = 0.0; - if(m_spline_values[i] > 1.0) m_spline_values[i] = 1.0; - m_spline_values8[i] = (int8u)(m_spline_values[i] * 255.0); - } - } - - - //------------------------------------------------------------------------ - void spline_ctrl_impl::calc_curve() - { - int i; - m_curve_pnt.remove_all(); - m_curve_pnt.move_to(m_xs1, m_ys1 + (m_ys2 - m_ys1) * m_spline_values[0]); - for(i = 1; i < 256; i++) - { - m_curve_pnt.line_to(m_xs1 + (m_xs2 - m_xs1) * double(i) / 255.0, - m_ys1 + (m_ys2 - m_ys1) * m_spline_values[i]); - } - } - - - //------------------------------------------------------------------------ - double spline_ctrl_impl::calc_xp(unsigned idx) - { - return m_xs1 + (m_xs2 - m_xs1) * m_xp[idx]; - } - - - //------------------------------------------------------------------------ - double spline_ctrl_impl::calc_yp(unsigned idx) - { - return m_ys1 + (m_ys2 - m_ys1) * m_yp[idx]; - } - - - //------------------------------------------------------------------------ - void spline_ctrl_impl::set_xp(unsigned idx, double val) - { - if(val < 0.0) val = 0.0; - if(val > 1.0) val = 1.0; - - if(idx == 0) - { - val = 0.0; - } - else if(idx == m_num_pnt - 1) - { - val = 1.0; - } - else - { - if(val < m_xp[idx - 1] + 0.001) val = m_xp[idx - 1] + 0.001; - if(val > m_xp[idx + 1] - 0.001) val = m_xp[idx + 1] - 0.001; - } - m_xp[idx] = val; - } - - //------------------------------------------------------------------------ - void spline_ctrl_impl::set_yp(unsigned idx, double val) - { - if(val < 0.0) val = 0.0; - if(val > 1.0) val = 1.0; - m_yp[idx] = val; - } - - - //------------------------------------------------------------------------ - void spline_ctrl_impl::point(unsigned idx, double x, double y) - { - if(idx < m_num_pnt) - { - set_xp(idx, x); - set_yp(idx, y); - } - } - - - //------------------------------------------------------------------------ - void spline_ctrl_impl::value(unsigned idx, double y) - { - if(idx < m_num_pnt) - { - set_yp(idx, y); - } - } - - //------------------------------------------------------------------------ - double spline_ctrl_impl::value(double x) const - { - x = m_spline.get(x); - if(x < 0.0) x = 0.0; - if(x > 1.0) x = 1.0; - return x; - } - - - //------------------------------------------------------------------------ - void spline_ctrl_impl::rewind(unsigned idx) - { - unsigned i; - - m_idx = idx; - - switch(idx) - { - default: - - case 0: // Background - m_vertex = 0; - m_vx[0] = m_x1 - m_border_extra; - m_vy[0] = m_y1 - m_border_extra; - m_vx[1] = m_x2 + m_border_extra; - m_vy[1] = m_y1 - m_border_extra; - m_vx[2] = m_x2 + m_border_extra; - m_vy[2] = m_y2 + m_border_extra; - m_vx[3] = m_x1 - m_border_extra; - m_vy[3] = m_y2 + m_border_extra; - break; - - case 1: // Border - m_vertex = 0; - m_vx[0] = m_x1; - m_vy[0] = m_y1; - m_vx[1] = m_x2; - m_vy[1] = m_y1; - m_vx[2] = m_x2; - m_vy[2] = m_y2; - m_vx[3] = m_x1; - m_vy[3] = m_y2; - m_vx[4] = m_x1 + m_border_width; - m_vy[4] = m_y1 + m_border_width; - m_vx[5] = m_x1 + m_border_width; - m_vy[5] = m_y2 - m_border_width; - m_vx[6] = m_x2 - m_border_width; - m_vy[6] = m_y2 - m_border_width; - m_vx[7] = m_x2 - m_border_width; - m_vy[7] = m_y1 + m_border_width; - break; - - case 2: // Curve - calc_curve(); - m_curve_poly.width(m_curve_width); - m_curve_poly.rewind(0); - break; - - - case 3: // Inactive points - m_curve_pnt.remove_all(); - for(i = 0; i < m_num_pnt; i++) - { - if(int(i) != m_active_pnt) - { - m_ellipse.init(calc_xp(i), calc_yp(i), - m_point_size, m_point_size, 32); - m_curve_pnt.concat_path(m_ellipse); - } - } - m_curve_poly.rewind(0); - break; - - - case 4: // Active point - m_curve_pnt.remove_all(); - if(m_active_pnt >= 0) - { - m_ellipse.init(calc_xp(m_active_pnt), calc_yp(m_active_pnt), - m_point_size, m_point_size, 32); - - m_curve_pnt.concat_path(m_ellipse); - } - m_curve_poly.rewind(0); - break; - - } - } - - - //------------------------------------------------------------------------ - unsigned spline_ctrl_impl::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_line_to; - switch(m_idx) - { - case 0: - if(m_vertex == 0) cmd = path_cmd_move_to; - if(m_vertex >= 4) cmd = path_cmd_stop; - *x = m_vx[m_vertex]; - *y = m_vy[m_vertex]; - m_vertex++; - break; - - case 1: - if(m_vertex == 0 || m_vertex == 4) cmd = path_cmd_move_to; - if(m_vertex >= 8) cmd = path_cmd_stop; - *x = m_vx[m_vertex]; - *y = m_vy[m_vertex]; - m_vertex++; - break; - - case 2: - cmd = m_curve_poly.vertex(x, y); - break; - - case 3: - case 4: - cmd = m_curve_pnt.vertex(x, y); - break; - - default: - cmd = path_cmd_stop; - break; - } - - if(!is_stop(cmd)) - { - transform_xy(x, y); - } - - return cmd; - } - - - - //------------------------------------------------------------------------ - void spline_ctrl_impl::active_point(int i) - { - m_active_pnt = i; - } - - - //------------------------------------------------------------------------ - bool spline_ctrl_impl::in_rect(double x, double y) const - { - inverse_transform_xy(&x, &y); - return x >= m_x1 && x <= m_x2 && y >= m_y1 && y <= m_y2; - } - - - //------------------------------------------------------------------------ - bool spline_ctrl_impl::on_mouse_button_down(double x, double y) - { - inverse_transform_xy(&x, &y); - unsigned i; - for(i = 0; i < m_num_pnt; i++) - { - double xp = calc_xp(i); - double yp = calc_yp(i); - if(calc_distance(x, y, xp, yp) <= m_point_size + 1) - { - m_pdx = xp - x; - m_pdy = yp - y; - m_active_pnt = m_move_pnt = int(i); - return true; - } - } - return false; - } - - - //------------------------------------------------------------------------ - bool spline_ctrl_impl::on_mouse_button_up(double, double) - { - if(m_move_pnt >= 0) - { - m_move_pnt = -1; - return true; - } - return false; - } - - - //------------------------------------------------------------------------ - bool spline_ctrl_impl::on_mouse_move(double x, double y, bool button_flag) - { - inverse_transform_xy(&x, &y); - if(!button_flag) - { - return on_mouse_button_up(x, y); - } - - if(m_move_pnt >= 0) - { - double xp = x + m_pdx; - double yp = y + m_pdy; - - set_xp(m_move_pnt, (xp - m_xs1) / (m_xs2 - m_xs1)); - set_yp(m_move_pnt, (yp - m_ys1) / (m_ys2 - m_ys1)); - - update_spline(); - return true; - } - return false; - } - - - //------------------------------------------------------------------------ - bool spline_ctrl_impl::on_arrow_keys(bool left, bool right, bool down, bool up) - { - double kx = 0.0; - double ky = 0.0; - bool ret = false; - if(m_active_pnt >= 0) - { - kx = m_xp[m_active_pnt]; - ky = m_yp[m_active_pnt]; - if(left) { kx -= 0.001; ret = true; } - if(right) { kx += 0.001; ret = true; } - if(down) { ky -= 0.001; ret = true; } - if(up) { ky += 0.001; ret = true; } - } - if(ret) - { - set_xp(m_active_pnt, kx); - set_yp(m_active_pnt, ky); - update_spline(); - } - return ret; - } - - - - -} - diff --git a/uppdev/agg24/agg_spline_ctrl.h b/uppdev/agg24/agg_spline_ctrl.h deleted file mode 100644 index 8477f27d7..000000000 --- a/uppdev/agg24/agg_spline_ctrl.h +++ /dev/null @@ -1,159 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// classes spline_ctrl_impl, spline_ctrl -// -//---------------------------------------------------------------------------- - -#ifndef AGG_SPLINE_CTRL_INCLUDED -#define AGG_SPLINE_CTRL_INCLUDED - -#include "agg_basics.h" -#include "agg_ellipse.h" -#include "agg_bspline.h" -#include "agg_conv_stroke.h" -#include "agg_path_storage.h" -#include "agg_trans_affine.h" -#include "agg_color_rgba.h" -#include "agg_ctrl.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - // Class that can be used to create an interactive control to set up - // gamma arrays. - //------------------------------------------------------------------------ - class spline_ctrl_impl : public ctrl - { - public: - spline_ctrl_impl(double x1, double y1, double x2, double y2, - unsigned num_pnt, bool flip_y=false); - - // Set other parameters - void border_width(double t, double extra=0.0); - void curve_width(double t) { m_curve_width = t; } - void point_size(double s) { m_point_size = s; } - - // Event handlers. Just call them if the respective events - // in your system occure. The functions return true if redrawing - // is required. - virtual bool in_rect(double x, double y) const; - virtual bool on_mouse_button_down(double x, double y); - virtual bool on_mouse_button_up(double x, double y); - virtual bool on_mouse_move(double x, double y, bool button_flag); - virtual bool on_arrow_keys(bool left, bool right, bool down, bool up); - - void active_point(int i); - - const double* spline() const { return m_spline_values; } - const int8u* spline8() const { return m_spline_values8; } - double value(double x) const; - void value(unsigned idx, double y); - void point(unsigned idx, double x, double y); - void x(unsigned idx, double x) { m_xp[idx] = x; } - void y(unsigned idx, double y) { m_yp[idx] = y; } - double x(unsigned idx) const { return m_xp[idx]; } - double y(unsigned idx) const { return m_yp[idx]; } - void update_spline(); - - // Vertex soutce interface - unsigned num_paths() { return 5; } - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - void calc_spline_box(); - void calc_curve(); - double calc_xp(unsigned idx); - double calc_yp(unsigned idx); - void set_xp(unsigned idx, double val); - void set_yp(unsigned idx, double val); - - unsigned m_num_pnt; - double m_xp[32]; - double m_yp[32]; - bspline m_spline; - double m_spline_values[256]; - int8u m_spline_values8[256]; - double m_border_width; - double m_border_extra; - double m_curve_width; - double m_point_size; - double m_xs1; - double m_ys1; - double m_xs2; - double m_ys2; - path_storage m_curve_pnt; - conv_stroke m_curve_poly; - ellipse m_ellipse; - unsigned m_idx; - unsigned m_vertex; - double m_vx[32]; - double m_vy[32]; - int m_active_pnt; - int m_move_pnt; - double m_pdx; - double m_pdy; - const trans_affine* m_mtx; - }; - - - template class spline_ctrl : public spline_ctrl_impl - { - public: - spline_ctrl(double x1, double y1, double x2, double y2, - unsigned num_pnt, bool flip_y=false) : - spline_ctrl_impl(x1, y1, x2, y2, num_pnt, flip_y), - m_background_color(rgba(1.0, 1.0, 0.9)), - m_border_color(rgba(0.0, 0.0, 0.0)), - m_curve_color(rgba(0.0, 0.0, 0.0)), - m_inactive_pnt_color(rgba(0.0, 0.0, 0.0)), - m_active_pnt_color(rgba(1.0, 0.0, 0.0)) - { - m_colors[0] = &m_background_color; - m_colors[1] = &m_border_color; - m_colors[2] = &m_curve_color; - m_colors[3] = &m_inactive_pnt_color; - m_colors[4] = &m_active_pnt_color; - } - - // Set colors - void background_color(const ColorT& c) { m_background_color = c; } - void border_color(const ColorT& c) { m_border_color = c; } - void curve_color(const ColorT& c) { m_curve_color = c; } - void inactive_pnt_color(const ColorT& c) { m_inactive_pnt_color = c; } - void active_pnt_color(const ColorT& c) { m_active_pnt_color = c; } - const ColorT& color(unsigned i) const { return *m_colors[i]; } - - private: - spline_ctrl(const spline_ctrl&); - const spline_ctrl& operator = (const spline_ctrl&); - - ColorT m_background_color; - ColorT m_border_color; - ColorT m_curve_color; - ColorT m_inactive_pnt_color; - ColorT m_active_pnt_color; - ColorT* m_colors[5]; - }; - - - - -} - - -#endif diff --git a/uppdev/agg24/agg_sqrt_tables.cpp b/uppdev/agg24/agg_sqrt_tables.cpp deleted file mode 100644 index 19a1bd8cb..000000000 --- a/uppdev/agg24/agg_sqrt_tables.cpp +++ /dev/null @@ -1,115 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// static tables for fast integer sqrt -// -//---------------------------------------------------------------------------- - -#include "agg_basics.h" - -namespace agg -{ - int16u g_sqrt_table[1024] = //----------g_sqrt_table - { - 0, - 2048,2896,3547,4096,4579,5017,5418,5793,6144,6476,6792,7094,7384,7663,7932,8192,8444, - 8689,8927,9159,9385,9606,9822,10033,10240,10443,10642,10837,11029,11217,11403,11585, - 11765,11942,12116,12288,12457,12625,12790,12953,13114,13273,13430,13585,13738,13890, - 14040,14189,14336,14482,14626,14768,14910,15050,15188,15326,15462,15597,15731,15864, - 15995,16126,16255,16384,16512,16638,16764,16888,17012,17135,17257,17378,17498,17618, - 17736,17854,17971,18087,18203,18318,18432,18545,18658,18770,18882,18992,19102,19212, - 19321,19429,19537,19644,19750,19856,19961,20066,20170,20274,20377,20480,20582,20684, - 20785,20886,20986,21085,21185,21283,21382,21480,21577,21674,21771,21867,21962,22058, - 22153,22247,22341,22435,22528,22621,22713,22806,22897,22989,23080,23170,23261,23351, - 23440,23530,23619,23707,23796,23884,23971,24059,24146,24232,24319,24405,24491,24576, - 24661,24746,24831,24915,24999,25083,25166,25249,25332,25415,25497,25580,25661,25743, - 25824,25905,25986,26067,26147,26227,26307,26387,26466,26545,26624,26703,26781,26859, - 26937,27015,27092,27170,27247,27324,27400,27477,27553,27629,27705,27780,27856,27931, - 28006,28081,28155,28230,28304,28378,28452,28525,28599,28672,28745,28818,28891,28963, - 29035,29108,29180,29251,29323,29394,29466,29537,29608,29678,29749,29819,29890,29960, - 30030,30099,30169,30238,30308,30377,30446,30515,30583,30652,30720,30788,30856,30924, - 30992,31059,31127,31194,31261,31328,31395,31462,31529,31595,31661,31727,31794,31859, - 31925,31991,32056,32122,32187,32252,32317,32382,32446,32511,32575,32640,32704,32768, - 32832,32896,32959,33023,33086,33150,33213,33276,33339,33402,33465,33527,33590,33652, - 33714,33776,33839,33900,33962,34024,34086,34147,34208,34270,34331,34392,34453,34514, - 34574,34635,34695,34756,34816,34876,34936,34996,35056,35116,35176,35235,35295,35354, - 35413,35472,35531,35590,35649,35708,35767,35825,35884,35942,36001,36059,36117,36175, - 36233,36291,36348,36406,36464,36521,36578,36636,36693,36750,36807,36864,36921,36978, - 37034,37091,37147,37204,37260,37316,37372,37429,37485,37540,37596,37652,37708,37763, - 37819,37874,37929,37985,38040,38095,38150,38205,38260,38315,38369,38424,38478,38533, - 38587,38642,38696,38750,38804,38858,38912,38966,39020,39073,39127,39181,39234,39287, - 39341,39394,39447,39500,39553,39606,39659,39712,39765,39818,39870,39923,39975,40028, - 40080,40132,40185,40237,40289,40341,40393,40445,40497,40548,40600,40652,40703,40755, - 40806,40857,40909,40960,41011,41062,41113,41164,41215,41266,41317,41368,41418,41469, - 41519,41570,41620,41671,41721,41771,41821,41871,41922,41972,42021,42071,42121,42171, - 42221,42270,42320,42369,42419,42468,42518,42567,42616,42665,42714,42763,42813,42861, - 42910,42959,43008,43057,43105,43154,43203,43251,43300,43348,43396,43445,43493,43541, - 43589,43637,43685,43733,43781,43829,43877,43925,43972,44020,44068,44115,44163,44210, - 44258,44305,44352,44400,44447,44494,44541,44588,44635,44682,44729,44776,44823,44869, - 44916,44963,45009,45056,45103,45149,45195,45242,45288,45334,45381,45427,45473,45519, - 45565,45611,45657,45703,45749,45795,45840,45886,45932,45977,46023,46069,46114,46160, - 46205,46250,46296,46341,46386,46431,46477,46522,46567,46612,46657,46702,46746,46791, - 46836,46881,46926,46970,47015,47059,47104,47149,47193,47237,47282,47326,47370,47415, - 47459,47503,47547,47591,47635,47679,47723,47767,47811,47855,47899,47942,47986,48030, - 48074,48117,48161,48204,48248,48291,48335,48378,48421,48465,48508,48551,48594,48637, - 48680,48723,48766,48809,48852,48895,48938,48981,49024,49067,49109,49152,49195,49237, - 49280,49322,49365,49407,49450,49492,49535,49577,49619,49661,49704,49746,49788,49830, - 49872,49914,49956,49998,50040,50082,50124,50166,50207,50249,50291,50332,50374,50416, - 50457,50499,50540,50582,50623,50665,50706,50747,50789,50830,50871,50912,50954,50995, - 51036,51077,51118,51159,51200,51241,51282,51323,51364,51404,51445,51486,51527,51567, - 51608,51649,51689,51730,51770,51811,51851,51892,51932,51972,52013,52053,52093,52134, - 52174,52214,52254,52294,52334,52374,52414,52454,52494,52534,52574,52614,52654,52694, - 52734,52773,52813,52853,52892,52932,52972,53011,53051,53090,53130,53169,53209,53248, - 53287,53327,53366,53405,53445,53484,53523,53562,53601,53640,53679,53719,53758,53797, - 53836,53874,53913,53952,53991,54030,54069,54108,54146,54185,54224,54262,54301,54340, - 54378,54417,54455,54494,54532,54571,54609,54647,54686,54724,54762,54801,54839,54877, - 54915,54954,54992,55030,55068,55106,55144,55182,55220,55258,55296,55334,55372,55410, - 55447,55485,55523,55561,55599,55636,55674,55712,55749,55787,55824,55862,55900,55937, - 55975,56012,56049,56087,56124,56162,56199,56236,56273,56311,56348,56385,56422,56459, - 56497,56534,56571,56608,56645,56682,56719,56756,56793,56830,56867,56903,56940,56977, - 57014,57051,57087,57124,57161,57198,57234,57271,57307,57344,57381,57417,57454,57490, - 57527,57563,57599,57636,57672,57709,57745,57781,57817,57854,57890,57926,57962,57999, - 58035,58071,58107,58143,58179,58215,58251,58287,58323,58359,58395,58431,58467,58503, - 58538,58574,58610,58646,58682,58717,58753,58789,58824,58860,58896,58931,58967,59002, - 59038,59073,59109,59144,59180,59215,59251,59286,59321,59357,59392,59427,59463,59498, - 59533,59568,59603,59639,59674,59709,59744,59779,59814,59849,59884,59919,59954,59989, - 60024,60059,60094,60129,60164,60199,60233,60268,60303,60338,60373,60407,60442,60477, - 60511,60546,60581,60615,60650,60684,60719,60753,60788,60822,60857,60891,60926,60960, - 60995,61029,61063,61098,61132,61166,61201,61235,61269,61303,61338,61372,61406,61440, - 61474,61508,61542,61576,61610,61644,61678,61712,61746,61780,61814,61848,61882,61916, - 61950,61984,62018,62051,62085,62119,62153,62186,62220,62254,62287,62321,62355,62388, - 62422,62456,62489,62523,62556,62590,62623,62657,62690,62724,62757,62790,62824,62857, - 62891,62924,62957,62991,63024,63057,63090,63124,63157,63190,63223,63256,63289,63323, - 63356,63389,63422,63455,63488,63521,63554,63587,63620,63653,63686,63719,63752,63785, - 63817,63850,63883,63916,63949,63982,64014,64047,64080,64113,64145,64178,64211,64243, - 64276,64309,64341,64374,64406,64439,64471,64504,64536,64569,64601,64634,64666,64699, - 64731,64763,64796,64828,64861,64893,64925,64957,64990,65022,65054,65086,65119,65151, - 65183,65215,65247,65279,65312,65344,65376,65408,65440,65472,65504 - }; - - - int8 g_elder_bit_table[256] = //---------g_elder_bit_table - { - 0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 - }; - -} diff --git a/uppdev/agg24/agg_trans_affine.cpp b/uppdev/agg24/agg_trans_affine.cpp deleted file mode 100644 index 99febc953..000000000 --- a/uppdev/agg24/agg_trans_affine.cpp +++ /dev/null @@ -1,194 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Affine transformations -// -//---------------------------------------------------------------------------- -#include "agg_trans_affine.h" - - - -namespace agg -{ - - //------------------------------------------------------------------------ - const trans_affine& trans_affine::parl_to_parl(const double* src, - const double* dst) - { - sx = src[2] - src[0]; - shy = src[3] - src[1]; - shx = src[4] - src[0]; - sy = src[5] - src[1]; - tx = src[0]; - ty = src[1]; - invert(); - multiply(trans_affine(dst[2] - dst[0], dst[3] - dst[1], - dst[4] - dst[0], dst[5] - dst[1], - dst[0], dst[1])); - return *this; - } - - //------------------------------------------------------------------------ - const trans_affine& trans_affine::rect_to_parl(double x1, double y1, - double x2, double y2, - const double* parl) - { - double src[6]; - src[0] = x1; src[1] = y1; - src[2] = x2; src[3] = y1; - src[4] = x2; src[5] = y2; - parl_to_parl(src, parl); - return *this; - } - - //------------------------------------------------------------------------ - const trans_affine& trans_affine::parl_to_rect(const double* parl, - double x1, double y1, - double x2, double y2) - { - double dst[6]; - dst[0] = x1; dst[1] = y1; - dst[2] = x2; dst[3] = y1; - dst[4] = x2; dst[5] = y2; - parl_to_parl(parl, dst); - return *this; - } - - //------------------------------------------------------------------------ - const trans_affine& trans_affine::multiply(const trans_affine& m) - { - double t0 = sx * m.sx + shy * m.shx; - double t2 = shx * m.sx + sy * m.shx; - double t4 = tx * m.sx + ty * m.shx + m.tx; - shy = sx * m.shy + shy * m.sy; - sy = shx * m.shy + sy * m.sy; - ty = tx * m.shy + ty * m.sy + m.ty; - sx = t0; - shx = t2; - tx = t4; - return *this; - } - - - //------------------------------------------------------------------------ - const trans_affine& trans_affine::invert() - { - double d = determinant_reciprocal(); - - double t0 = sy * d; - sy = sx * d; - shy = -shy * d; - shx = -shx * d; - - double t4 = -tx * t0 - ty * shx; - ty = -tx * shy - ty * sy; - - sx = t0; - tx = t4; - return *this; - } - - - //------------------------------------------------------------------------ - const trans_affine& trans_affine::flip_x() - { - sx = -sx; - shy = -shy; - tx = -tx; - return *this; - } - - //------------------------------------------------------------------------ - const trans_affine& trans_affine::flip_y() - { - shx = -shx; - sy = -sy; - ty = -ty; - return *this; - } - - //------------------------------------------------------------------------ - const trans_affine& trans_affine::reset() - { - sx = sy = 1.0; - shy = shx = tx = ty = 0.0; - return *this; - } - - //------------------------------------------------------------------------ - bool trans_affine::is_identity(double epsilon) const - { - return is_equal_eps(sx, 1.0, epsilon) && - is_equal_eps(shy, 0.0, epsilon) && - is_equal_eps(shx, 0.0, epsilon) && - is_equal_eps(sy, 1.0, epsilon) && - is_equal_eps(tx, 0.0, epsilon) && - is_equal_eps(ty, 0.0, epsilon); - } - - //------------------------------------------------------------------------ - bool trans_affine::is_valid(double epsilon) const - { - return fabs(sx) > epsilon && fabs(sy) > epsilon; - } - - //------------------------------------------------------------------------ - bool trans_affine::is_equal(const trans_affine& m, double epsilon) const - { - return is_equal_eps(sx, m.sx, epsilon) && - is_equal_eps(shy, m.shy, epsilon) && - is_equal_eps(shx, m.shx, epsilon) && - is_equal_eps(sy, m.sy, epsilon) && - is_equal_eps(tx, m.tx, epsilon) && - is_equal_eps(ty, m.ty, epsilon); - } - - //------------------------------------------------------------------------ - double trans_affine::rotation() const - { - double x1 = 0.0; - double y1 = 0.0; - double x2 = 1.0; - double y2 = 0.0; - transform(&x1, &y1); - transform(&x2, &y2); - return atan2(y2-y1, x2-x1); - } - - //------------------------------------------------------------------------ - void trans_affine::translation(double* dx, double* dy) const - { - *dx = tx; - *dy = ty; - } - - //------------------------------------------------------------------------ - void trans_affine::scaling(double* x, double* y) const - { - double x1 = 0.0; - double y1 = 0.0; - double x2 = 1.0; - double y2 = 1.0; - trans_affine t(*this); - t *= trans_affine_rotation(-rotation()); - t.transform(&x1, &y1); - t.transform(&x2, &y2); - *x = x2 - x1; - *y = y2 - y1; - } - - -} - diff --git a/uppdev/agg24/agg_trans_affine.h b/uppdev/agg24/agg_trans_affine.h deleted file mode 100644 index cbed7c86d..000000000 --- a/uppdev/agg24/agg_trans_affine.h +++ /dev/null @@ -1,518 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Affine transformation classes. -// -//---------------------------------------------------------------------------- -#ifndef AGG_TRANS_AFFINE_INCLUDED -#define AGG_TRANS_AFFINE_INCLUDED - -#include -#include "agg_basics.h" - -namespace agg -{ - const double affine_epsilon = 1e-14; - - //============================================================trans_affine - // - // See Implementation agg_trans_affine.cpp - // - // Affine transformation are linear transformations in Cartesian coordinates - // (strictly speaking not only in Cartesian, but for the beginning we will - // think so). They are rotation, scaling, translation and skewing. - // After any affine transformation a line segment remains a line segment - // and it will never become a curve. - // - // There will be no math about matrix calculations, since it has been - // described many times. Ask yourself a very simple question: - // "why do we need to understand and use some matrix stuff instead of just - // rotating, scaling and so on". The answers are: - // - // 1. Any combination of transformations can be done by only 4 multiplications - // and 4 additions in floating point. - // 2. One matrix transformation is equivalent to the number of consecutive - // discrete transformations, i.e. the matrix "accumulates" all transformations - // in the order of their settings. Suppose we have 4 transformations: - // * rotate by 30 degrees, - // * scale X to 2.0, - // * scale Y to 1.5, - // * move to (100, 100). - // The result will depend on the order of these transformations, - // and the advantage of matrix is that the sequence of discret calls: - // rotate(30), scaleX(2.0), scaleY(1.5), move(100,100) - // will have exactly the same result as the following matrix transformations: - // - // affine_matrix m; - // m *= rotate_matrix(30); - // m *= scaleX_matrix(2.0); - // m *= scaleY_matrix(1.5); - // m *= move_matrix(100,100); - // - // m.transform_my_point_at_last(x, y); - // - // What is the good of it? In real life we will set-up the matrix only once - // and then transform many points, let alone the convenience to set any - // combination of transformations. - // - // So, how to use it? Very easy - literally as it's shown above. Not quite, - // let us write a correct example: - // - // agg::trans_affine m; - // m *= agg::trans_affine_rotation(30.0 * 3.1415926 / 180.0); - // m *= agg::trans_affine_scaling(2.0, 1.5); - // m *= agg::trans_affine_translation(100.0, 100.0); - // m.transform(&x, &y); - // - // The affine matrix is all you need to perform any linear transformation, - // but all transformations have origin point (0,0). It means that we need to - // use 2 translations if we want to rotate someting around (100,100): - // - // m *= agg::trans_affine_translation(-100.0, -100.0); // move to (0,0) - // m *= agg::trans_affine_rotation(30.0 * 3.1415926 / 180.0); // rotate - // m *= agg::trans_affine_translation(100.0, 100.0); // move back to (100,100) - //---------------------------------------------------------------------- - struct trans_affine - { - double sx, shy, shx, sy, tx, ty; - - //------------------------------------------ Construction - // Identity matrix - trans_affine() : - sx(1.0), shy(0.0), shx(0.0), sy(1.0), tx(0.0), ty(0.0) - {} - - // Custom matrix. Usually used in derived classes - trans_affine(double v0, double v1, double v2, - double v3, double v4, double v5) : - sx(v0), shy(v1), shx(v2), sy(v3), tx(v4), ty(v5) - {} - - // Custom matrix from m[6] - explicit trans_affine(const double* m) : - sx(m[0]), shy(m[1]), shx(m[2]), sy(m[3]), tx(m[4]), ty(m[5]) - {} - - // Rectangle to a parallelogram. - trans_affine(double x1, double y1, double x2, double y2, - const double* parl) - { - rect_to_parl(x1, y1, x2, y2, parl); - } - - // Parallelogram to a rectangle. - trans_affine(const double* parl, - double x1, double y1, double x2, double y2) - { - parl_to_rect(parl, x1, y1, x2, y2); - } - - // Arbitrary parallelogram transformation. - trans_affine(const double* src, const double* dst) - { - parl_to_parl(src, dst); - } - - //---------------------------------- Parellelogram transformations - // transform a parallelogram to another one. Src and dst are - // pointers to arrays of three points (double[6], x1,y1,...) that - // identify three corners of the parallelograms assuming implicit - // fourth point. The arguments are arrays of double[6] mapped - // to x1,y1, x2,y2, x3,y3 where the coordinates are: - // *-----------------* - // / (x3,y3)/ - // / / - // /(x1,y1) (x2,y2)/ - // *-----------------* - const trans_affine& parl_to_parl(const double* src, - const double* dst); - - const trans_affine& rect_to_parl(double x1, double y1, - double x2, double y2, - const double* parl); - - const trans_affine& parl_to_rect(const double* parl, - double x1, double y1, - double x2, double y2); - - - //------------------------------------------ Operations - // Reset - load an identity matrix - const trans_affine& reset(); - - // Direct transformations operations - const trans_affine& translate(double x, double y); - const trans_affine& rotate(double a); - const trans_affine& scale(double s); - const trans_affine& scale(double x, double y); - - // Multiply matrix to another one - const trans_affine& multiply(const trans_affine& m); - - // Multiply "m" to "this" and assign the result to "this" - const trans_affine& premultiply(const trans_affine& m); - - // Multiply matrix to inverse of another one - const trans_affine& multiply_inv(const trans_affine& m); - - // Multiply inverse of "m" to "this" and assign the result to "this" - const trans_affine& premultiply_inv(const trans_affine& m); - - // Invert matrix. Do not try to invert degenerate matrices, - // there's no check for validity. If you set scale to 0 and - // then try to invert matrix, expect unpredictable result. - const trans_affine& invert(); - - // Mirroring around X - const trans_affine& flip_x(); - - // Mirroring around Y - const trans_affine& flip_y(); - - //------------------------------------------- Load/Store - // Store matrix to an array [6] of double - void store_to(double* m) const - { - *m++ = sx; *m++ = shy; *m++ = shx; *m++ = sy; *m++ = tx; *m++ = ty; - } - - // Load matrix from an array [6] of double - const trans_affine& load_from(const double* m) - { - sx = *m++; shy = *m++; shx = *m++; sy = *m++; tx = *m++; ty = *m++; - return *this; - } - - //------------------------------------------- Operators - - // Multiply the matrix by another one - const trans_affine& operator *= (const trans_affine& m) - { - return multiply(m); - } - - // Multiply the matrix by inverse of another one - const trans_affine& operator /= (const trans_affine& m) - { - return multiply_inv(m); - } - - // Multiply the matrix by another one and return - // the result in a separete matrix. - trans_affine operator * (const trans_affine& m) - { - return trans_affine(*this).multiply(m); - } - - // Multiply the matrix by inverse of another one - // and return the result in a separete matrix. - trans_affine operator / (const trans_affine& m) - { - return trans_affine(*this).multiply_inv(m); - } - - // Calculate and return the inverse matrix - trans_affine operator ~ () const - { - trans_affine ret = *this; - return ret.invert(); - } - - // Equal operator with default epsilon - bool operator == (const trans_affine& m) const - { - return is_equal(m, affine_epsilon); - } - - // Not Equal operator with default epsilon - bool operator != (const trans_affine& m) const - { - return !is_equal(m, affine_epsilon); - } - - //-------------------------------------------- Transformations - // Direct transformation of x and y - void transform(double* x, double* y) const; - - // Direct transformation of x and y, 2x2 matrix only, no translation - void transform_2x2(double* x, double* y) const; - - // Inverse transformation of x and y. It works slower than the - // direct transformation. For massive operations it's better to - // invert() the matrix and then use direct transformations. - void inverse_transform(double* x, double* y) const; - - //-------------------------------------------- Auxiliary - // Calculate the determinant of matrix - double determinant() const - { - return sx * sy - shy * shx; - } - - // Calculate the reciprocal of the determinant - double determinant_reciprocal() const - { - return 1.0 / (sx * sy - shy * shx); - } - - // Get the average scale (by X and Y). - // Basically used to calculate the approximation_scale when - // decomposinting curves into line segments. - double scale() const; - - // Check to see if the matrix is not degenerate - bool is_valid(double epsilon = affine_epsilon) const; - - // Check to see if it's an identity matrix - bool is_identity(double epsilon = affine_epsilon) const; - - // Check to see if two matrices are equal - bool is_equal(const trans_affine& m, double epsilon = affine_epsilon) const; - - // Determine the major parameters. Use with caution considering - // possible degenerate cases. - double rotation() const; - void translation(double* dx, double* dy) const; - void scaling(double* x, double* y) const; - void scaling_abs(double* x, double* y) const; - }; - - //------------------------------------------------------------------------ - inline void trans_affine::transform(double* x, double* y) const - { - register double tmp = *x; - *x = tmp * sx + *y * shx + tx; - *y = tmp * shy + *y * sy + ty; - } - - //------------------------------------------------------------------------ - inline void trans_affine::transform_2x2(double* x, double* y) const - { - register double tmp = *x; - *x = tmp * sx + *y * shx; - *y = tmp * shy + *y * sy; - } - - //------------------------------------------------------------------------ - inline void trans_affine::inverse_transform(double* x, double* y) const - { - register double d = determinant_reciprocal(); - register double a = (*x - tx) * d; - register double b = (*y - ty) * d; - *x = a * sy - b * shx; - *y = b * sx - a * shy; - } - - //------------------------------------------------------------------------ - inline double trans_affine::scale() const - { - double x = 0.707106781 * sx + 0.707106781 * shx; - double y = 0.707106781 * shy + 0.707106781 * sy; - return sqrt(x*x + y*y); - } - - //------------------------------------------------------------------------ - inline const trans_affine& trans_affine::translate(double x, double y) - { - tx += x; - ty += y; - return *this; - } - - //------------------------------------------------------------------------ - inline const trans_affine& trans_affine::rotate(double a) - { - double ca = cos(a); - double sa = sin(a); - double t0 = sx * ca - shy * sa; - double t2 = shx * ca - sy * sa; - double t4 = tx * ca - ty * sa; - shy = sx * sa + shy * ca; - sy = shx * sa + sy * ca; - ty = tx * sa + ty * ca; - sx = t0; - shx = t2; - tx = t4; - return *this; - } - - //------------------------------------------------------------------------ - inline const trans_affine& trans_affine::scale(double x, double y) - { - double mm0 = x; // Possible hint for the optimizer - double mm3 = y; - sx *= mm0; - shx *= mm0; - tx *= mm0; - shy *= mm3; - sy *= mm3; - ty *= mm3; - return *this; - } - - //------------------------------------------------------------------------ - inline const trans_affine& trans_affine::scale(double s) - { - double m = s; // Possible hint for the optimizer - sx *= m; - shx *= m; - tx *= m; - shy *= m; - sy *= m; - ty *= m; - return *this; - } - - //------------------------------------------------------------------------ - inline const trans_affine& trans_affine::premultiply(const trans_affine& m) - { - trans_affine t = m; - return *this = t.multiply(*this); - } - - //------------------------------------------------------------------------ - inline const trans_affine& trans_affine::multiply_inv(const trans_affine& m) - { - trans_affine t = m; - t.invert(); - return multiply(t); - } - - //------------------------------------------------------------------------ - inline const trans_affine& trans_affine::premultiply_inv(const trans_affine& m) - { - trans_affine t = m; - t.invert(); - return *this = t.multiply(*this); - } - - //------------------------------------------------------------------------ - inline void trans_affine::scaling_abs(double* x, double* y) const - { - // Used to calculate scaling coefficients in image resampling. - // When there is considerable shear this method gives us much - // better estimation than just sx, sy. - *x = sqrt(sx * sx + shx * shx); - *y = sqrt(shy * shy + sy * sy); - } - - //====================================================trans_affine_rotation - // Rotation matrix. sin() and cos() are calculated twice for the same angle. - // There's no harm because the performance of sin()/cos() is very good on all - // modern processors. Besides, this operation is not going to be invoked too - // often. - class trans_affine_rotation : public trans_affine - { - public: - trans_affine_rotation(double a) : - trans_affine(cos(a), sin(a), -sin(a), cos(a), 0.0, 0.0) - {} - }; - - //====================================================trans_affine_scaling - // Scaling matrix. x, y - scale coefficients by X and Y respectively - class trans_affine_scaling : public trans_affine - { - public: - trans_affine_scaling(double x, double y) : - trans_affine(x, 0.0, 0.0, y, 0.0, 0.0) - {} - - trans_affine_scaling(double s) : - trans_affine(s, 0.0, 0.0, s, 0.0, 0.0) - {} - }; - - //================================================trans_affine_translation - // Translation matrix - class trans_affine_translation : public trans_affine - { - public: - trans_affine_translation(double x, double y) : - trans_affine(1.0, 0.0, 0.0, 1.0, x, y) - {} - }; - - //====================================================trans_affine_skewing - // Sckewing (shear) matrix - class trans_affine_skewing : public trans_affine - { - public: - trans_affine_skewing(double x, double y) : - trans_affine(1.0, tan(y), tan(x), 1.0, 0.0, 0.0) - {} - }; - - - //===============================================trans_affine_line_segment - // Rotate, Scale and Translate, associating 0...dist with line segment - // x1,y1,x2,y2 - class trans_affine_line_segment : public trans_affine - { - public: - trans_affine_line_segment(double x1, double y1, double x2, double y2, - double dist) - { - double dx = x2 - x1; - double dy = y2 - y1; - if(dist > 0.0) - { - multiply(trans_affine_scaling(sqrt(dx * dx + dy * dy) / dist)); - } - multiply(trans_affine_rotation(atan2(dy, dx))); - multiply(trans_affine_translation(x1, y1)); - } - }; - - - //============================================trans_affine_reflection_unit - // Reflection matrix. Reflect coordinates across the line through - // the origin containing the unit vector (ux, uy). - // Contributed by John Horigan - class trans_affine_reflection_unit : public trans_affine - { - public: - trans_affine_reflection_unit(double ux, double uy) : - trans_affine(2.0 * ux * ux - 1.0, - 2.0 * ux * uy, - 2.0 * ux * uy, - 2.0 * uy * uy - 1.0, - 0.0, 0.0) - {} - }; - - - //=================================================trans_affine_reflection - // Reflection matrix. Reflect coordinates across the line through - // the origin at the angle a or containing the non-unit vector (x, y). - // Contributed by John Horigan - class trans_affine_reflection : public trans_affine_reflection_unit - { - public: - trans_affine_reflection(double a) : - trans_affine_reflection_unit(cos(a), sin(a)) - {} - - - trans_affine_reflection(double x, double y) : - trans_affine_reflection_unit(x / sqrt(x * x + y * y), y / sqrt(x * x + y * y)) - {} - }; - -} - - -#endif - diff --git a/uppdev/agg24/agg_trans_bilinear.h b/uppdev/agg24/agg_trans_bilinear.h deleted file mode 100644 index f3ab59647..000000000 --- a/uppdev/agg24/agg_trans_bilinear.h +++ /dev/null @@ -1,166 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Bilinear 2D transformations -// -//---------------------------------------------------------------------------- -#ifndef AGG_TRANS_BILINEAR_INCLUDED -#define AGG_TRANS_BILINEAR_INCLUDED - -#include "agg_basics.h" -#include "agg_simul_eq.h" - -namespace agg -{ - - //==========================================================trans_bilinear - class trans_bilinear - { - public: - //-------------------------------------------------------------------- - trans_bilinear() : m_valid(false) {} - - //-------------------------------------------------------------------- - // Arbitrary quadrangle transformations - trans_bilinear(const double* src, const double* dst) - { - quad_to_quad(src, dst); - } - - - //-------------------------------------------------------------------- - // Direct transformations - trans_bilinear(double x1, double y1, double x2, double y2, - const double* quad) - { - rect_to_quad(x1, y1, x2, y2, quad); - } - - - //-------------------------------------------------------------------- - // Reverse transformations - trans_bilinear(const double* quad, - double x1, double y1, double x2, double y2) - { - quad_to_rect(quad, x1, y1, x2, y2); - } - - - //-------------------------------------------------------------------- - // Set the transformations using two arbitrary quadrangles. - void quad_to_quad(const double* src, const double* dst) - { - double left[4][4]; - double right[4][2]; - - unsigned i; - for(i = 0; i < 4; i++) - { - unsigned ix = i * 2; - unsigned iy = ix + 1; - left[i][0] = 1.0; - left[i][1] = src[ix] * src[iy]; - left[i][2] = src[ix]; - left[i][3] = src[iy]; - - right[i][0] = dst[ix]; - right[i][1] = dst[iy]; - } - m_valid = simul_eq<4, 2>::solve(left, right, m_mtx); - } - - - //-------------------------------------------------------------------- - // Set the direct transformations, i.e., rectangle -> quadrangle - void rect_to_quad(double x1, double y1, double x2, double y2, - const double* quad) - { - double src[8]; - src[0] = src[6] = x1; - src[2] = src[4] = x2; - src[1] = src[3] = y1; - src[5] = src[7] = y2; - quad_to_quad(src, quad); - } - - - //-------------------------------------------------------------------- - // Set the reverse transformations, i.e., quadrangle -> rectangle - void quad_to_rect(const double* quad, - double x1, double y1, double x2, double y2) - { - double dst[8]; - dst[0] = dst[6] = x1; - dst[2] = dst[4] = x2; - dst[1] = dst[3] = y1; - dst[5] = dst[7] = y2; - quad_to_quad(quad, dst); - } - - //-------------------------------------------------------------------- - // Check if the equations were solved successfully - bool is_valid() const { return m_valid; } - - //-------------------------------------------------------------------- - // Transform a point (x, y) - void transform(double* x, double* y) const - { - double tx = *x; - double ty = *y; - double xy = tx * ty; - *x = m_mtx[0][0] + m_mtx[1][0] * xy + m_mtx[2][0] * tx + m_mtx[3][0] * ty; - *y = m_mtx[0][1] + m_mtx[1][1] * xy + m_mtx[2][1] * tx + m_mtx[3][1] * ty; - } - - - //-------------------------------------------------------------------- - class iterator_x - { - double inc_x; - double inc_y; - - public: - double x; - double y; - - iterator_x() {} - iterator_x(double tx, double ty, double step, const double m[4][2]) : - inc_x(m[1][0] * step * ty + m[2][0] * step), - inc_y(m[1][1] * step * ty + m[2][1] * step), - x(m[0][0] + m[1][0] * tx * ty + m[2][0] * tx + m[3][0] * ty), - y(m[0][1] + m[1][1] * tx * ty + m[2][1] * tx + m[3][1] * ty) - { - } - - void operator ++ () - { - x += inc_x; - y += inc_y; - } - }; - - iterator_x begin(double x, double y, double step) const - { - return iterator_x(x, y, step, m_mtx); - } - - private: - double m_mtx[4][2]; - bool m_valid; - }; - -} - -#endif diff --git a/uppdev/agg24/agg_trans_double_path.cpp b/uppdev/agg24/agg_trans_double_path.cpp deleted file mode 100644 index cd40c7f58..000000000 --- a/uppdev/agg24/agg_trans_double_path.cpp +++ /dev/null @@ -1,273 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#include "agg_math.h" -#include "agg_trans_double_path.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - trans_double_path::trans_double_path() : - m_kindex1(0.0), - m_kindex2(0.0), - m_base_length(0.0), - m_base_height(1.0), - m_status1(initial), - m_status2(initial), - m_preserve_x_scale(true) - { - } - - - //------------------------------------------------------------------------ - void trans_double_path::reset() - { - m_src_vertices1.remove_all(); - m_src_vertices2.remove_all(); - m_kindex1 = 0.0; - m_kindex1 = 0.0; - m_status1 = initial; - m_status2 = initial; - } - - - //------------------------------------------------------------------------ - void trans_double_path::move_to1(double x, double y) - { - if(m_status1 == initial) - { - m_src_vertices1.modify_last(vertex_dist(x, y)); - m_status1 = making_path; - } - else - { - line_to1(x, y); - } - } - - - //------------------------------------------------------------------------ - void trans_double_path::line_to1(double x, double y) - { - if(m_status1 == making_path) - { - m_src_vertices1.add(vertex_dist(x, y)); - } - } - - - //------------------------------------------------------------------------ - void trans_double_path::move_to2(double x, double y) - { - if(m_status2 == initial) - { - m_src_vertices2.modify_last(vertex_dist(x, y)); - m_status2 = making_path; - } - else - { - line_to2(x, y); - } - } - - - //------------------------------------------------------------------------ - void trans_double_path::line_to2(double x, double y) - { - if(m_status2 == making_path) - { - m_src_vertices2.add(vertex_dist(x, y)); - } - } - - - //------------------------------------------------------------------------ - double trans_double_path::finalize_path(vertex_storage& vertices) - { - unsigned i; - double dist; - double d; - - vertices.close(false); - if(vertices.size() > 2) - { - if(vertices[vertices.size() - 2].dist * 10.0 < - vertices[vertices.size() - 3].dist) - { - d = vertices[vertices.size() - 3].dist + - vertices[vertices.size() - 2].dist; - - vertices[vertices.size() - 2] = - vertices[vertices.size() - 1]; - - vertices.remove_last(); - vertices[vertices.size() - 2].dist = d; - } - } - - dist = 0; - for(i = 0; i < vertices.size(); i++) - { - vertex_dist& v = vertices[i]; - d = v.dist; - v.dist = dist; - dist += d; - } - - return (vertices.size() - 1) / dist; - } - - - //------------------------------------------------------------------------ - void trans_double_path::finalize_paths() - { - if(m_status1 == making_path && m_src_vertices1.size() > 1 && - m_status2 == making_path && m_src_vertices2.size() > 1) - { - m_kindex1 = finalize_path(m_src_vertices1); - m_kindex2 = finalize_path(m_src_vertices2); - m_status1 = ready; - m_status2 = ready; - } - } - - - //------------------------------------------------------------------------ - double trans_double_path::total_length1() const - { - if(m_base_length >= 1e-10) return m_base_length; - return (m_status1 == ready) ? - m_src_vertices1[m_src_vertices1.size() - 1].dist : - 0.0; - } - - - //------------------------------------------------------------------------ - double trans_double_path::total_length2() const - { - if(m_base_length >= 1e-10) return m_base_length; - return (m_status2 == ready) ? - m_src_vertices2[m_src_vertices2.size() - 1].dist : - 0.0; - } - - - //------------------------------------------------------------------------ - void trans_double_path::transform1(const vertex_storage& vertices, - double kindex, double kx, - double *x, double* y) const - { - double x1 = 0.0; - double y1 = 0.0; - double dx = 1.0; - double dy = 1.0; - double d = 0.0; - double dd = 1.0; - *x *= kx; - if(*x < 0.0) - { - // Extrapolation on the left - //-------------------------- - x1 = vertices[0].x; - y1 = vertices[0].y; - dx = vertices[1].x - x1; - dy = vertices[1].y - y1; - dd = vertices[1].dist - vertices[0].dist; - d = *x; - } - else - if(*x > vertices[vertices.size() - 1].dist) - { - // Extrapolation on the right - //-------------------------- - unsigned i = vertices.size() - 2; - unsigned j = vertices.size() - 1; - x1 = vertices[j].x; - y1 = vertices[j].y; - dx = x1 - vertices[i].x; - dy = y1 - vertices[i].y; - dd = vertices[j].dist - vertices[i].dist; - d = *x - vertices[j].dist; - } - else - { - // Interpolation - //-------------------------- - unsigned i = 0; - unsigned j = vertices.size() - 1; - if(m_preserve_x_scale) - { - unsigned k; - for(i = 0; (j - i) > 1; ) - { - if(*x < vertices[k = (i + j) >> 1].dist) - { - j = k; - } - else - { - i = k; - } - } - d = vertices[i].dist; - dd = vertices[j].dist - d; - d = *x - d; - } - else - { - i = unsigned(*x * kindex); - j = i + 1; - dd = vertices[j].dist - vertices[i].dist; - d = ((*x * kindex) - i) * dd; - } - x1 = vertices[i].x; - y1 = vertices[i].y; - dx = vertices[j].x - x1; - dy = vertices[j].y - y1; - } - *x = x1 + dx * d / dd; - *y = y1 + dy * d / dd; - } - - - //------------------------------------------------------------------------ - void trans_double_path::transform(double *x, double *y) const - { - if(m_status1 == ready && m_status2 == ready) - { - if(m_base_length > 1e-10) - { - *x *= m_src_vertices1[m_src_vertices1.size() - 1].dist / - m_base_length; - } - - double x1 = *x; - double y1 = *y; - double x2 = *x; - double y2 = *y; - double dd = m_src_vertices2[m_src_vertices2.size() - 1].dist / - m_src_vertices1[m_src_vertices1.size() - 1].dist; - - transform1(m_src_vertices1, m_kindex1, 1.0, &x1, &y1); - transform1(m_src_vertices2, m_kindex2, dd, &x2, &y2); - - *x = x1 + *y * (x2 - x1) / m_base_height; - *y = y1 + *y * (y2 - y1) / m_base_height; - } - } - -} - diff --git a/uppdev/agg24/agg_trans_double_path.h b/uppdev/agg24/agg_trans_double_path.h deleted file mode 100644 index c645a7f86..000000000 --- a/uppdev/agg24/agg_trans_double_path.h +++ /dev/null @@ -1,131 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_TRANS_DOUBLE_PATH_INCLUDED -#define AGG_TRANS_DOUBLE_PATH_INCLUDED - -#include "agg_basics.h" -#include "agg_vertex_sequence.h" - -namespace agg -{ - - // See also: agg_trans_double_path.cpp - // - //-------------------------------------------------------trans_double_path - class trans_double_path - { - enum status_e - { - initial, - making_path, - ready - }; - - public: - typedef vertex_sequence vertex_storage; - - trans_double_path(); - - //-------------------------------------------------------------------- - void base_length(double v) { m_base_length = v; } - double base_length() const { return m_base_length; } - - //-------------------------------------------------------------------- - void base_height(double v) { m_base_height = v; } - double base_height() const { return m_base_height; } - - //-------------------------------------------------------------------- - void preserve_x_scale(bool f) { m_preserve_x_scale = f; } - bool preserve_x_scale() const { return m_preserve_x_scale; } - - //-------------------------------------------------------------------- - void reset(); - void move_to1(double x, double y); - void line_to1(double x, double y); - void move_to2(double x, double y); - void line_to2(double x, double y); - void finalize_paths(); - - //-------------------------------------------------------------------- - template - void add_paths(VertexSource1& vs1, VertexSource2& vs2, - unsigned path1_id=0, unsigned path2_id=0) - { - double x; - double y; - - unsigned cmd; - - vs1.rewind(path1_id); - while(!is_stop(cmd = vs1.vertex(&x, &y))) - { - if(is_move_to(cmd)) - { - move_to1(x, y); - } - else - { - if(is_vertex(cmd)) - { - line_to1(x, y); - } - } - } - - vs2.rewind(path2_id); - while(!is_stop(cmd = vs2.vertex(&x, &y))) - { - if(is_move_to(cmd)) - { - move_to2(x, y); - } - else - { - if(is_vertex(cmd)) - { - line_to2(x, y); - } - } - } - finalize_paths(); - } - - //-------------------------------------------------------------------- - double total_length1() const; - double total_length2() const; - void transform(double *x, double *y) const; - - private: - double finalize_path(vertex_storage& vertices); - void transform1(const vertex_storage& vertices, - double kindex, double kx, - double *x, double* y) const; - - vertex_storage m_src_vertices1; - vertex_storage m_src_vertices2; - double m_base_length; - double m_base_height; - double m_kindex1; - double m_kindex2; - status_e m_status1; - status_e m_status2; - bool m_preserve_x_scale; - }; - -} - - -#endif diff --git a/uppdev/agg24/agg_trans_perspective.h b/uppdev/agg24/agg_trans_perspective.h deleted file mode 100644 index 20a9aa66d..000000000 --- a/uppdev/agg24/agg_trans_perspective.h +++ /dev/null @@ -1,731 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Perspective 2D transformations -// -//---------------------------------------------------------------------------- -#ifndef AGG_TRANS_PERSPECTIVE_INCLUDED -#define AGG_TRANS_PERSPECTIVE_INCLUDED - -#include "agg_trans_affine.h" - -namespace agg -{ - //=======================================================trans_perspective - struct trans_perspective - { - double sx, shy, w0, shx, sy, w1, tx, ty, w2; - - //------------------------------------------------------- Construction - // Identity matrix - trans_perspective() : - sx (1), shy(0), w0(0), - shx(0), sy (1), w1(0), - tx (0), ty (0), w2(1) {} - - // Custom matrix - trans_perspective(double v0, double v1, double v2, - double v3, double v4, double v5, - double v6, double v7, double v8) : - sx (v0), shy(v1), w0(v2), - shx(v3), sy (v4), w1(v5), - tx (v6), ty (v7), w2(v8) {} - - // Custom matrix from m[9] - explicit trans_perspective(const double* m) : - sx (m[0]), shy(m[1]), w0(m[2]), - shx(m[3]), sy (m[4]), w1(m[5]), - tx (m[6]), ty (m[7]), w2(m[8]) {} - - // From affine - explicit trans_perspective(const trans_affine& a) : - sx (a.sx ), shy(a.shy), w0(0), - shx(a.shx), sy (a.sy ), w1(0), - tx (a.tx ), ty (a.ty ), w2(1) {} - - // Rectangle to quadrilateral - trans_perspective(double x1, double y1, double x2, double y2, - const double* quad); - - // Quadrilateral to rectangle - trans_perspective(const double* quad, - double x1, double y1, double x2, double y2); - - // Arbitrary quadrilateral transformations - trans_perspective(const double* src, const double* dst); - - //-------------------------------------- Quadrilateral transformations - // The arguments are double[8] that are mapped to quadrilaterals: - // x1,y1, x2,y2, x3,y3, x4,y4 - bool quad_to_quad(const double* qs, const double* qd); - - bool rect_to_quad(double x1, double y1, - double x2, double y2, - const double* q); - - bool quad_to_rect(const double* q, - double x1, double y1, - double x2, double y2); - - // Map square (0,0,1,1) to the quadrilateral and vice versa - bool square_to_quad(const double* q); - bool quad_to_square(const double* q); - - - //--------------------------------------------------------- Operations - // Reset - load an identity matrix - const trans_perspective& reset(); - - // Invert matrix. Returns false in degenerate case - bool invert(); - - // Direct transformations operations - const trans_perspective& translate(double x, double y); - const trans_perspective& rotate(double a); - const trans_perspective& scale(double s); - const trans_perspective& scale(double x, double y); - - // Multiply the matrix by another one - const trans_perspective& multiply(const trans_perspective& m); - - // Multiply "m" by "this" and assign the result to "this" - const trans_perspective& premultiply(const trans_perspective& m); - - // Multiply matrix to inverse of another one - const trans_perspective& multiply_inv(const trans_perspective& m); - - // Multiply inverse of "m" by "this" and assign the result to "this" - const trans_perspective& premultiply_inv(const trans_perspective& m); - - // Multiply the matrix by another one - const trans_perspective& multiply(const trans_affine& m); - - // Multiply "m" by "this" and assign the result to "this" - const trans_perspective& premultiply(const trans_affine& m); - - // Multiply the matrix by inverse of another one - const trans_perspective& multiply_inv(const trans_affine& m); - - // Multiply inverse of "m" by "this" and assign the result to "this" - const trans_perspective& premultiply_inv(const trans_affine& m); - - //--------------------------------------------------------- Load/Store - void store_to(double* m) const; - const trans_perspective& load_from(const double* m); - - //---------------------------------------------------------- Operators - // Multiply the matrix by another one - const trans_perspective& operator *= (const trans_perspective& m) - { - return multiply(m); - } - const trans_perspective& operator *= (const trans_affine& m) - { - return multiply(m); - } - - // Multiply the matrix by inverse of another one - const trans_perspective& operator /= (const trans_perspective& m) - { - return multiply_inv(m); - } - const trans_perspective& operator /= (const trans_affine& m) - { - return multiply_inv(m); - } - - // Multiply the matrix by another one and return - // the result in a separete matrix. - trans_perspective operator * (const trans_perspective& m) - { - return trans_perspective(*this).multiply(m); - } - trans_perspective operator * (const trans_affine& m) - { - return trans_perspective(*this).multiply(m); - } - - // Multiply the matrix by inverse of another one - // and return the result in a separete matrix. - trans_perspective operator / (const trans_perspective& m) - { - return trans_perspective(*this).multiply_inv(m); - } - trans_perspective operator / (const trans_affine& m) - { - return trans_perspective(*this).multiply_inv(m); - } - - // Calculate and return the inverse matrix - trans_perspective operator ~ () const - { - trans_perspective ret = *this; - ret.invert(); - return ret; - } - - // Equal operator with default epsilon - bool operator == (const trans_perspective& m) const - { - return is_equal(m, affine_epsilon); - } - - // Not Equal operator with default epsilon - bool operator != (const trans_perspective& m) const - { - return !is_equal(m, affine_epsilon); - } - - //---------------------------------------------------- Transformations - // Direct transformation of x and y - void transform(double* x, double* y) const; - - // Direct transformation of x and y, affine part only - void transform_affine(double* x, double* y) const; - - // Direct transformation of x and y, 2x2 matrix only, no translation - void transform_2x2(double* x, double* y) const; - - // Inverse transformation of x and y. It works slow because - // it explicitly inverts the matrix on every call. For massive - // operations it's better to invert() the matrix and then use - // direct transformations. - void inverse_transform(double* x, double* y) const; - - - //---------------------------------------------------------- Auxiliary - const trans_perspective& from_affine(const trans_affine& a); - double determinant() const; - double determinant_reciprocal() const; - - bool is_valid(double epsilon = affine_epsilon) const; - bool is_identity(double epsilon = affine_epsilon) const; - bool is_equal(const trans_perspective& m, - double epsilon = affine_epsilon) const; - - // Determine the major affine parameters. Use with caution - // considering possible degenerate cases. - double scale() const; - double rotation() const; - void translation(double* dx, double* dy) const; - void scaling(double* x, double* y) const; - void scaling_abs(double* x, double* y) const; - - - - //-------------------------------------------------------------------- - class iterator_x - { - double den; - double den_step; - double nom_x; - double nom_x_step; - double nom_y; - double nom_y_step; - - public: - double x; - double y; - - iterator_x() {} - iterator_x(double px, double py, double step, const trans_perspective& m) : - den(px * m.w0 + py * m.w1 + m.w2), - den_step(m.w0 * step), - nom_x(px * m.sx + py * m.shx + m.tx), - nom_x_step(step * m.sx), - nom_y(px * m.shy + py * m.sy + m.ty), - nom_y_step(step * m.shy), - x(nom_x / den), - y(nom_y / den) - {} - - void operator ++ () - { - den += den_step; - nom_x += nom_x_step; - nom_y += nom_y_step; - double d = 1.0 / den; - x = nom_x * d; - y = nom_y * d; - } - }; - - //-------------------------------------------------------------------- - iterator_x begin(double x, double y, double step) const - { - return iterator_x(x, y, step, *this); - } - }; - - - - - - - - - - - - - - - //------------------------------------------------------------------------ - inline bool trans_perspective::square_to_quad(const double* q) - { - double dx = q[0] - q[2] + q[4] - q[6]; - double dy = q[1] - q[3] + q[5] - q[7]; - if(dx == 0.0 && dy == 0.0) - { - // Affine case (parallelogram) - //--------------- - sx = q[2] - q[0]; - shy = q[3] - q[1]; - w0 = 0.0; - shx = q[4] - q[2]; - sy = q[5] - q[3]; - w1 = 0.0; - tx = q[0]; - ty = q[1]; - w2 = 1.0; - } - else - { - double dx1 = q[2] - q[4]; - double dy1 = q[3] - q[5]; - double dx2 = q[6] - q[4]; - double dy2 = q[7] - q[5]; - double den = dx1 * dy2 - dx2 * dy1; - if(den == 0.0) - { - // Singular case - //--------------- - sx = shy = w0 = shx = sy = w1 = tx = ty = w2 = 0.0; - return false; - } - // General case - //--------------- - double u = (dx * dy2 - dy * dx2) / den; - double v = (dy * dx1 - dx * dy1) / den; - sx = q[2] - q[0] + u * q[2]; - shy = q[3] - q[1] + u * q[3]; - w0 = u; - shx = q[6] - q[0] + v * q[6]; - sy = q[7] - q[1] + v * q[7]; - w1 = v; - tx = q[0]; - ty = q[1]; - w2 = 1.0; - } - return true; - } - - //------------------------------------------------------------------------ - inline bool trans_perspective::invert() - { - double d0 = sy * w2 - w1 * ty; - double d1 = w0 * ty - shy * w2; - double d2 = shy * w1 - w0 * sy; - double d = sx * d0 + shx * d1 + tx * d2; - if(d == 0.0) - { - sx = shy = w0 = shx = sy = w1 = tx = ty = w2 = 0.0; - return false; - } - d = 1.0 / d; - trans_perspective a = *this; - sx = d * d0; - shy = d * d1; - w0 = d * d2; - shx = d * (a.w1 *a.tx - a.shx*a.w2); - sy = d * (a.sx *a.w2 - a.w0 *a.tx); - w1 = d * (a.w0 *a.shx - a.sx *a.w1); - tx = d * (a.shx*a.ty - a.sy *a.tx); - ty = d * (a.shy*a.tx - a.sx *a.ty); - w2 = d * (a.sx *a.sy - a.shy*a.shx); - return true; - } - - //------------------------------------------------------------------------ - inline bool trans_perspective::quad_to_square(const double* q) - { - if(!square_to_quad(q)) return false; - invert(); - return true; - } - - //------------------------------------------------------------------------ - inline bool trans_perspective::quad_to_quad(const double* qs, - const double* qd) - { - trans_perspective p; - if(! quad_to_square(qs)) return false; - if(!p.square_to_quad(qd)) return false; - multiply(p); - return true; - } - - //------------------------------------------------------------------------ - inline bool trans_perspective::rect_to_quad(double x1, double y1, - double x2, double y2, - const double* q) - { - double r[8]; - r[0] = r[6] = x1; - r[2] = r[4] = x2; - r[1] = r[3] = y1; - r[5] = r[7] = y2; - return quad_to_quad(r, q); - } - - //------------------------------------------------------------------------ - inline bool trans_perspective::quad_to_rect(const double* q, - double x1, double y1, - double x2, double y2) - { - double r[8]; - r[0] = r[6] = x1; - r[2] = r[4] = x2; - r[1] = r[3] = y1; - r[5] = r[7] = y2; - return quad_to_quad(q, r); - } - - //------------------------------------------------------------------------ - inline trans_perspective::trans_perspective(double x1, double y1, - double x2, double y2, - const double* quad) - { - rect_to_quad(x1, y1, x2, y2, quad); - } - - //------------------------------------------------------------------------ - inline trans_perspective::trans_perspective(const double* quad, - double x1, double y1, - double x2, double y2) - { - quad_to_rect(quad, x1, y1, x2, y2); - } - - //------------------------------------------------------------------------ - inline trans_perspective::trans_perspective(const double* src, - const double* dst) - { - quad_to_quad(src, dst); - } - - //------------------------------------------------------------------------ - inline const trans_perspective& trans_perspective::reset() - { - sx = 1; shy = 0; w0 = 0; - shx = 0; sy = 1; w1 = 0; - tx = 0; ty = 0; w2 = 1; - return *this; - } - - //------------------------------------------------------------------------ - inline const trans_perspective& - trans_perspective::multiply(const trans_perspective& a) - { - trans_perspective b = *this; - sx = a.sx *b.sx + a.shx*b.shy + a.tx*b.w0; - shx = a.sx *b.shx + a.shx*b.sy + a.tx*b.w1; - tx = a.sx *b.tx + a.shx*b.ty + a.tx*b.w2; - shy = a.shy*b.sx + a.sy *b.shy + a.ty*b.w0; - sy = a.shy*b.shx + a.sy *b.sy + a.ty*b.w1; - ty = a.shy*b.tx + a.sy *b.ty + a.ty*b.w2; - w0 = a.w0 *b.sx + a.w1 *b.shy + a.w2*b.w0; - w1 = a.w0 *b.shx + a.w1 *b.sy + a.w2*b.w1; - w2 = a.w0 *b.tx + a.w1 *b.ty + a.w2*b.w2; - return *this; - } - - //------------------------------------------------------------------------ - inline const trans_perspective& - trans_perspective::multiply(const trans_affine& a) - { - trans_perspective b = *this; - sx = a.sx *b.sx + a.shx*b.shy + a.tx*b.w0; - shx = a.sx *b.shx + a.shx*b.sy + a.tx*b.w1; - tx = a.sx *b.tx + a.shx*b.ty + a.tx*b.w2; - shy = a.shy*b.sx + a.sy *b.shy + a.ty*b.w0; - sy = a.shy*b.shx + a.sy *b.sy + a.ty*b.w1; - ty = a.shy*b.tx + a.sy *b.ty + a.ty*b.w2; - return *this; - } - - //------------------------------------------------------------------------ - inline const trans_perspective& - trans_perspective::premultiply(const trans_perspective& b) - { - trans_perspective a = *this; - sx = a.sx *b.sx + a.shx*b.shy + a.tx*b.w0; - shx = a.sx *b.shx + a.shx*b.sy + a.tx*b.w1; - tx = a.sx *b.tx + a.shx*b.ty + a.tx*b.w2; - shy = a.shy*b.sx + a.sy *b.shy + a.ty*b.w0; - sy = a.shy*b.shx + a.sy *b.sy + a.ty*b.w1; - ty = a.shy*b.tx + a.sy *b.ty + a.ty*b.w2; - w0 = a.w0 *b.sx + a.w1 *b.shy + a.w2*b.w0; - w1 = a.w0 *b.shx + a.w1 *b.sy + a.w2*b.w1; - w2 = a.w0 *b.tx + a.w1 *b.ty + a.w2*b.w2; - return *this; - } - - //------------------------------------------------------------------------ - inline const trans_perspective& - trans_perspective::premultiply(const trans_affine& b) - { - trans_perspective a = *this; - sx = a.sx *b.sx + a.shx*b.shy; - shx = a.sx *b.shx + a.shx*b.sy; - tx = a.sx *b.tx + a.shx*b.ty + a.tx; - shy = a.shy*b.sx + a.sy *b.shy; - sy = a.shy*b.shx + a.sy *b.sy; - ty = a.shy*b.tx + a.sy *b.ty + a.ty; - w0 = a.w0 *b.sx + a.w1 *b.shy; - w1 = a.w0 *b.shx + a.w1 *b.sy; - w2 = a.w0 *b.tx + a.w1 *b.ty + a.w2; - return *this; - } - - //------------------------------------------------------------------------ - const trans_perspective& - trans_perspective::multiply_inv(const trans_perspective& m) - { - trans_perspective t = m; - t.invert(); - return multiply(t); - } - - //------------------------------------------------------------------------ - const trans_perspective& - trans_perspective::multiply_inv(const trans_affine& m) - { - trans_affine t = m; - t.invert(); - return multiply(t); - } - - //------------------------------------------------------------------------ - const trans_perspective& - trans_perspective::premultiply_inv(const trans_perspective& m) - { - trans_perspective t = m; - t.invert(); - return *this = t.multiply(*this); - } - - //------------------------------------------------------------------------ - const trans_perspective& - trans_perspective::premultiply_inv(const trans_affine& m) - { - trans_perspective t(m); - t.invert(); - return *this = t.multiply(*this); - } - - //------------------------------------------------------------------------ - inline const trans_perspective& - trans_perspective::translate(double x, double y) - { - tx += x; - ty += y; - return *this; - } - - //------------------------------------------------------------------------ - inline const trans_perspective& trans_perspective::rotate(double a) - { - multiply(trans_affine_rotation(a)); - return *this; - } - - //------------------------------------------------------------------------ - inline const trans_perspective& trans_perspective::scale(double s) - { - multiply(trans_affine_scaling(s)); - return *this; - } - - //------------------------------------------------------------------------ - inline const trans_perspective& trans_perspective::scale(double x, double y) - { - multiply(trans_affine_scaling(x, y)); - return *this; - } - - //------------------------------------------------------------------------ - inline void trans_perspective::transform(double* px, double* py) const - { - double x = *px; - double y = *py; - double m = 1.0 / (x*w0 + y*w1 + w2); - *px = m * (x*sx + y*shx + tx); - *py = m * (x*shy + y*sy + ty); - } - - //------------------------------------------------------------------------ - inline void trans_perspective::transform_affine(double* x, double* y) const - { - double tmp = *x; - *x = tmp * sx + *y * shx + tx; - *y = tmp * shy + *y * sy + ty; - } - - //------------------------------------------------------------------------ - inline void trans_perspective::transform_2x2(double* x, double* y) const - { - double tmp = *x; - *x = tmp * sx + *y * shx; - *y = tmp * shy + *y * sy; - } - - //------------------------------------------------------------------------ - inline void trans_perspective::inverse_transform(double* x, double* y) const - { - trans_perspective t(*this); - if(t.invert()) t.transform(x, y); - } - - //------------------------------------------------------------------------ - inline void trans_perspective::store_to(double* m) const - { - *m++ = sx; *m++ = shy; *m++ = w0; - *m++ = shx; *m++ = sy; *m++ = w1; - *m++ = tx; *m++ = ty; *m++ = w2; - } - - //------------------------------------------------------------------------ - inline const trans_perspective& trans_perspective::load_from(const double* m) - { - sx = *m++; shy = *m++; w0 = *m++; - shx = *m++; sy = *m++; w1 = *m++; - tx = *m++; ty = *m++; w2 = *m++; - return *this; - } - - //------------------------------------------------------------------------ - inline const trans_perspective& - trans_perspective::from_affine(const trans_affine& a) - { - sx = a.sx; shy = a.shy; w0 = 0; - shx = a.shx; sy = a.sy; w1 = 0; - tx = a.tx; ty = a.ty; w2 = 1; - return *this; - } - - //------------------------------------------------------------------------ - inline double trans_perspective::determinant() const - { - return sx * (sy * w2 - ty * w1) + - shx * (ty * w0 - shy * w2) + - tx * (shy * w1 - sy * w0); - } - - //------------------------------------------------------------------------ - inline double trans_perspective::determinant_reciprocal() const - { - return 1.0 / determinant(); - } - - //------------------------------------------------------------------------ - inline bool trans_perspective::is_valid(double epsilon) const - { - return fabs(sx) > epsilon && fabs(sy) > epsilon && fabs(w2) > epsilon; - } - - //------------------------------------------------------------------------ - inline bool trans_perspective::is_identity(double epsilon) const - { - return is_equal_eps(sx, 1.0, epsilon) && - is_equal_eps(shy, 0.0, epsilon) && - is_equal_eps(w0, 0.0, epsilon) && - is_equal_eps(shx, 0.0, epsilon) && - is_equal_eps(sy, 1.0, epsilon) && - is_equal_eps(w1, 0.0, epsilon) && - is_equal_eps(tx, 0.0, epsilon) && - is_equal_eps(ty, 0.0, epsilon) && - is_equal_eps(w2, 1.0, epsilon); - } - - //------------------------------------------------------------------------ - inline bool trans_perspective::is_equal(const trans_perspective& m, - double epsilon) const - { - return is_equal_eps(sx, m.sx, epsilon) && - is_equal_eps(shy, m.shy, epsilon) && - is_equal_eps(w0, m.w0, epsilon) && - is_equal_eps(shx, m.shx, epsilon) && - is_equal_eps(sy, m.sy, epsilon) && - is_equal_eps(w1, m.w1, epsilon) && - is_equal_eps(tx, m.tx, epsilon) && - is_equal_eps(ty, m.ty, epsilon) && - is_equal_eps(w2, m.w2, epsilon); - } - - //------------------------------------------------------------------------ - inline double trans_perspective::scale() const - { - double x = 0.707106781 * sx + 0.707106781 * shx; - double y = 0.707106781 * shy + 0.707106781 * sy; - return sqrt(x*x + y*y); - } - - //------------------------------------------------------------------------ - inline double trans_perspective::rotation() const - { - double x1 = 0.0; - double y1 = 0.0; - double x2 = 1.0; - double y2 = 0.0; - transform(&x1, &y1); - transform(&x2, &y2); - return atan2(y2-y1, x2-x1); - } - - //------------------------------------------------------------------------ - void trans_perspective::translation(double* dx, double* dy) const - { - *dx = tx; - *dy = ty; - } - - //------------------------------------------------------------------------ - void trans_perspective::scaling(double* x, double* y) const - { - double x1 = 0.0; - double y1 = 0.0; - double x2 = 1.0; - double y2 = 1.0; - trans_perspective t(*this); - t *= trans_affine_rotation(-rotation()); - t.transform(&x1, &y1); - t.transform(&x2, &y2); - *x = x2 - x1; - *y = y2 - y1; - } - - //------------------------------------------------------------------------ - void trans_perspective::scaling_abs(double* x, double* y) const - { - *x = sqrt(sx * sx + shx * shx); - *y = sqrt(shy * shy + sy * sy); - } - - -} - -#endif - diff --git a/uppdev/agg24/agg_trans_single_path.cpp b/uppdev/agg24/agg_trans_single_path.cpp deleted file mode 100644 index 2120fc9b9..000000000 --- a/uppdev/agg24/agg_trans_single_path.cpp +++ /dev/null @@ -1,202 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#include "agg_math.h" -#include "agg_vertex_sequence.h" -#include "agg_trans_single_path.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - trans_single_path::trans_single_path() : - m_base_length(0.0), - m_kindex(0.0), - m_status(initial), - m_preserve_x_scale(true) - { - } - - //------------------------------------------------------------------------ - void trans_single_path::reset() - { - m_src_vertices.remove_all(); - m_kindex = 0.0; - m_status = initial; - } - - //------------------------------------------------------------------------ - void trans_single_path::move_to(double x, double y) - { - if(m_status == initial) - { - m_src_vertices.modify_last(vertex_dist(x, y)); - m_status = making_path; - } - else - { - line_to(x, y); - } - } - - //------------------------------------------------------------------------ - void trans_single_path::line_to(double x, double y) - { - if(m_status == making_path) - { - m_src_vertices.add(vertex_dist(x, y)); - } - } - - - //------------------------------------------------------------------------ - void trans_single_path::finalize_path() - { - if(m_status == making_path && m_src_vertices.size() > 1) - { - unsigned i; - double dist; - double d; - - m_src_vertices.close(false); - if(m_src_vertices.size() > 2) - { - if(m_src_vertices[m_src_vertices.size() - 2].dist * 10.0 < - m_src_vertices[m_src_vertices.size() - 3].dist) - { - d = m_src_vertices[m_src_vertices.size() - 3].dist + - m_src_vertices[m_src_vertices.size() - 2].dist; - - m_src_vertices[m_src_vertices.size() - 2] = - m_src_vertices[m_src_vertices.size() - 1]; - - m_src_vertices.remove_last(); - m_src_vertices[m_src_vertices.size() - 2].dist = d; - } - } - - dist = 0.0; - for(i = 0; i < m_src_vertices.size(); i++) - { - vertex_dist& v = m_src_vertices[i]; - double d = v.dist; - v.dist = dist; - dist += d; - } - m_kindex = (m_src_vertices.size() - 1) / dist; - m_status = ready; - } - } - - - - //------------------------------------------------------------------------ - double trans_single_path::total_length() const - { - if(m_base_length >= 1e-10) return m_base_length; - return (m_status == ready) ? - m_src_vertices[m_src_vertices.size() - 1].dist : - 0.0; - } - - - //------------------------------------------------------------------------ - void trans_single_path::transform(double *x, double *y) const - { - if(m_status == ready) - { - if(m_base_length > 1e-10) - { - *x *= m_src_vertices[m_src_vertices.size() - 1].dist / - m_base_length; - } - - double x1 = 0.0; - double y1 = 0.0; - double dx = 1.0; - double dy = 1.0; - double d = 0.0; - double dd = 1.0; - if(*x < 0.0) - { - // Extrapolation on the left - //-------------------------- - x1 = m_src_vertices[0].x; - y1 = m_src_vertices[0].y; - dx = m_src_vertices[1].x - x1; - dy = m_src_vertices[1].y - y1; - dd = m_src_vertices[1].dist - m_src_vertices[0].dist; - d = *x; - } - else - if(*x > m_src_vertices[m_src_vertices.size() - 1].dist) - { - // Extrapolation on the right - //-------------------------- - unsigned i = m_src_vertices.size() - 2; - unsigned j = m_src_vertices.size() - 1; - x1 = m_src_vertices[j].x; - y1 = m_src_vertices[j].y; - dx = x1 - m_src_vertices[i].x; - dy = y1 - m_src_vertices[i].y; - dd = m_src_vertices[j].dist - m_src_vertices[i].dist; - d = *x - m_src_vertices[j].dist; - } - else - { - // Interpolation - //-------------------------- - unsigned i = 0; - unsigned j = m_src_vertices.size() - 1; - if(m_preserve_x_scale) - { - unsigned k; - for(i = 0; (j - i) > 1; ) - { - if(*x < m_src_vertices[k = (i + j) >> 1].dist) - { - j = k; - } - else - { - i = k; - } - } - d = m_src_vertices[i].dist; - dd = m_src_vertices[j].dist - d; - d = *x - d; - } - else - { - i = unsigned(*x * m_kindex); - j = i + 1; - dd = m_src_vertices[j].dist - m_src_vertices[i].dist; - d = ((*x * m_kindex) - i) * dd; - } - x1 = m_src_vertices[i].x; - y1 = m_src_vertices[i].y; - dx = m_src_vertices[j].x - x1; - dy = m_src_vertices[j].y - y1; - } - double x2 = x1 + dx * d / dd; - double y2 = y1 + dy * d / dd; - *x = x2 - *y * dy / dd; - *y = y2 + *y * dx / dd; - } - } - - -} - diff --git a/uppdev/agg24/agg_trans_single_path.h b/uppdev/agg24/agg_trans_single_path.h deleted file mode 100644 index 9f4bf53bd..000000000 --- a/uppdev/agg24/agg_trans_single_path.h +++ /dev/null @@ -1,97 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_TRANS_SINGLE_PATH_INCLUDED -#define AGG_TRANS_SINGLE_PATH_INCLUDED - -#include "agg_basics.h" -#include "agg_vertex_sequence.h" - -namespace agg -{ - - // See also: agg_trans_single_path.cpp - // - //-------------------------------------------------------trans_single_path - class trans_single_path - { - enum status_e - { - initial, - making_path, - ready - }; - - public: - typedef vertex_sequence vertex_storage; - - trans_single_path(); - - //-------------------------------------------------------------------- - void base_length(double v) { m_base_length = v; } - double base_length() const { return m_base_length; } - - //-------------------------------------------------------------------- - void preserve_x_scale(bool f) { m_preserve_x_scale = f; } - bool preserve_x_scale() const { return m_preserve_x_scale; } - - //-------------------------------------------------------------------- - void reset(); - void move_to(double x, double y); - void line_to(double x, double y); - void finalize_path(); - - //-------------------------------------------------------------------- - template - void add_path(VertexSource& vs, unsigned path_id=0) - { - double x; - double y; - - unsigned cmd; - vs.rewind(path_id); - while(!is_stop(cmd = vs.vertex(&x, &y))) - { - if(is_move_to(cmd)) - { - move_to(x, y); - } - else - { - if(is_vertex(cmd)) - { - line_to(x, y); - } - } - } - finalize_path(); - } - - //-------------------------------------------------------------------- - double total_length() const; - void transform(double *x, double *y) const; - - private: - vertex_storage m_src_vertices; - double m_base_length; - double m_kindex; - status_e m_status; - bool m_preserve_x_scale; - }; - - -} - -#endif diff --git a/uppdev/agg24/agg_trans_viewport.h b/uppdev/agg24/agg_trans_viewport.h deleted file mode 100644 index 7088f9907..000000000 --- a/uppdev/agg24/agg_trans_viewport.h +++ /dev/null @@ -1,303 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Viewport transformer - simple orthogonal conversions from world coordinates -// to screen (device) ones. -// -//---------------------------------------------------------------------------- - -#ifndef AGG_TRANS_VIEWPORT_INCLUDED -#define AGG_TRANS_VIEWPORT_INCLUDED - -#include -#include "agg_trans_affine.h" - - -namespace agg -{ - - enum aspect_ratio_e - { - aspect_ratio_stretch, - aspect_ratio_meet, - aspect_ratio_slice - }; - - - //----------------------------------------------------------trans_viewport - class trans_viewport - { - public: - //------------------------------------------------------------------- - trans_viewport() : - m_world_x1(0.0), - m_world_y1(0.0), - m_world_x2(1.0), - m_world_y2(1.0), - m_device_x1(0.0), - m_device_y1(0.0), - m_device_x2(1.0), - m_device_y2(1.0), - m_aspect(aspect_ratio_stretch), - m_is_valid(true), - m_align_x(0.5), - m_align_y(0.5), - m_wx1(0.0), - m_wy1(0.0), - m_wx2(1.0), - m_wy2(1.0), - m_dx1(0.0), - m_dy1(0.0), - m_kx(1.0), - m_ky(1.0) - {} - - //------------------------------------------------------------------- - void preserve_aspect_ratio(double alignx, - double aligny, - aspect_ratio_e aspect) - { - m_align_x = alignx; - m_align_y = aligny; - m_aspect = aspect; - update(); - } - - //------------------------------------------------------------------- - void device_viewport(double x1, double y1, double x2, double y2) - { - m_device_x1 = x1; - m_device_y1 = y1; - m_device_x2 = x2; - m_device_y2 = y2; - update(); - } - - //------------------------------------------------------------------- - void world_viewport(double x1, double y1, double x2, double y2) - { - m_world_x1 = x1; - m_world_y1 = y1; - m_world_x2 = x2; - m_world_y2 = y2; - update(); - } - - //------------------------------------------------------------------- - void device_viewport(double* x1, double* y1, double* x2, double* y2) const - { - *x1 = m_device_x1; - *y1 = m_device_y1; - *x2 = m_device_x2; - *y2 = m_device_y2; - } - - //------------------------------------------------------------------- - void world_viewport(double* x1, double* y1, double* x2, double* y2) const - { - *x1 = m_world_x1; - *y1 = m_world_y1; - *x2 = m_world_x2; - *y2 = m_world_y2; - } - - //------------------------------------------------------------------- - void world_viewport_actual(double* x1, double* y1, - double* x2, double* y2) const - { - *x1 = m_wx1; - *y1 = m_wy1; - *x2 = m_wx2; - *y2 = m_wy2; - } - - //------------------------------------------------------------------- - bool is_valid() const { return m_is_valid; } - double align_x() const { return m_align_x; } - double align_y() const { return m_align_y; } - aspect_ratio_e aspect_ratio() const { return m_aspect; } - - //------------------------------------------------------------------- - void transform(double* x, double* y) const - { - *x = (*x - m_wx1) * m_kx + m_dx1; - *y = (*y - m_wy1) * m_ky + m_dy1; - } - - //------------------------------------------------------------------- - void transform_scale_only(double* x, double* y) const - { - *x *= m_kx; - *y *= m_ky; - } - - //------------------------------------------------------------------- - void inverse_transform(double* x, double* y) const - { - *x = (*x - m_dx1) / m_kx + m_wx1; - *y = (*y - m_dy1) / m_ky + m_wy1; - } - - //------------------------------------------------------------------- - void inverse_transform_scale_only(double* x, double* y) const - { - *x /= m_kx; - *y /= m_ky; - } - - //------------------------------------------------------------------- - double device_dx() const { return m_dx1 - m_wx1 * m_kx; } - double device_dy() const { return m_dy1 - m_wy1 * m_ky; } - - //------------------------------------------------------------------- - double scale_x() const - { - return m_kx; - } - - //------------------------------------------------------------------- - double scale_y() const - { - return m_ky; - } - - //------------------------------------------------------------------- - double scale() const - { - return (m_kx + m_ky) * 0.5; - } - - //------------------------------------------------------------------- - trans_affine to_affine() const - { - trans_affine mtx = trans_affine_translation(-m_wx1, -m_wy1); - mtx *= trans_affine_scaling(m_kx, m_ky); - mtx *= trans_affine_translation(m_dx1, m_dy1); - return mtx; - } - - //------------------------------------------------------------------- - trans_affine to_affine_scale_only() const - { - return trans_affine_scaling(m_kx, m_ky); - } - - //------------------------------------------------------------------- - unsigned byte_size() const - { - return sizeof(*this); - } - - void serialize(int8u* ptr) const - { - memcpy(ptr, this, sizeof(*this)); - } - - void deserialize(const int8u* ptr) - { - memcpy(this, ptr, sizeof(*this)); - } - - private: - void update(); - - double m_world_x1; - double m_world_y1; - double m_world_x2; - double m_world_y2; - double m_device_x1; - double m_device_y1; - double m_device_x2; - double m_device_y2; - aspect_ratio_e m_aspect; - bool m_is_valid; - double m_align_x; - double m_align_y; - double m_wx1; - double m_wy1; - double m_wx2; - double m_wy2; - double m_dx1; - double m_dy1; - double m_kx; - double m_ky; - }; - - - - //----------------------------------------------------------------------- - inline void trans_viewport::update() - { - const double epsilon = 1e-30; - if(fabs(m_world_x1 - m_world_x2) < epsilon || - fabs(m_world_y1 - m_world_y2) < epsilon || - fabs(m_device_x1 - m_device_x2) < epsilon || - fabs(m_device_y1 - m_device_y2) < epsilon) - { - m_wx1 = m_world_x1; - m_wy1 = m_world_y1; - m_wx2 = m_world_x1 + 1.0; - m_wy2 = m_world_y2 + 1.0; - m_dx1 = m_device_x1; - m_dy1 = m_device_y1; - m_kx = 1.0; - m_ky = 1.0; - m_is_valid = false; - return; - } - - double world_x1 = m_world_x1; - double world_y1 = m_world_y1; - double world_x2 = m_world_x2; - double world_y2 = m_world_y2; - double device_x1 = m_device_x1; - double device_y1 = m_device_y1; - double device_x2 = m_device_x2; - double device_y2 = m_device_y2; - if(m_aspect != aspect_ratio_stretch) - { - double d; - m_kx = (device_x2 - device_x1) / (world_x2 - world_x1); - m_ky = (device_y2 - device_y1) / (world_y2 - world_y1); - - if((m_aspect == aspect_ratio_meet) == (m_kx < m_ky)) - { - d = (world_y2 - world_y1) * m_ky / m_kx; - world_y1 += (world_y2 - world_y1 - d) * m_align_y; - world_y2 = world_y1 + d; - } - else - { - d = (world_x2 - world_x1) * m_kx / m_ky; - world_x1 += (world_x2 - world_x1 - d) * m_align_x; - world_x2 = world_x1 + d; - } - } - m_wx1 = world_x1; - m_wy1 = world_y1; - m_wx2 = world_x2; - m_wy2 = world_y2; - m_dx1 = device_x1; - m_dy1 = device_y1; - m_kx = (device_x2 - device_x1) / (world_x2 - world_x1); - m_ky = (device_y2 - device_y1) / (world_y2 - world_y1); - m_is_valid = true; - } - - -} - - -#endif diff --git a/uppdev/agg24/agg_trans_warp_magnifier.cpp b/uppdev/agg24/agg_trans_warp_magnifier.cpp deleted file mode 100644 index e65afabba..000000000 --- a/uppdev/agg24/agg_trans_warp_magnifier.cpp +++ /dev/null @@ -1,70 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#include -#include "agg_trans_warp_magnifier.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - void trans_warp_magnifier::transform(double* x, double* y) const - { - double dx = *x - m_xc; - double dy = *y - m_yc; - double r = sqrt(dx * dx + dy * dy); - if(r < m_radius) - { - *x = m_xc + dx * m_magn; - *y = m_yc + dy * m_magn; - return; - } - - double m = (r + m_radius * (m_magn - 1.0)) / r; - *x = m_xc + dx * m; - *y = m_yc + dy * m; - } - - //------------------------------------------------------------------------ - void trans_warp_magnifier::inverse_transform(double* x, double* y) const - { - // New version by Andrew Skalkin - //----------------- - double dx = *x - m_xc; - double dy = *y - m_yc; - double r = sqrt(dx * dx + dy * dy); - - if(r < m_radius * m_magn) - { - *x = m_xc + dx / m_magn; - *y = m_yc + dy / m_magn; - } - else - { - double rnew = r - m_radius * (m_magn - 1.0); - *x = m_xc + rnew * dx / r; - *y = m_yc + rnew * dy / r; - } - - // Old version - //----------------- - //trans_warp_magnifier t(*this); - //t.magnification(1.0 / m_magn); - //t.radius(m_radius * m_magn); - //t.transform(x, y); - } - - -} diff --git a/uppdev/agg24/agg_trans_warp_magnifier.h b/uppdev/agg24/agg_trans_warp_magnifier.h deleted file mode 100644 index 38a92dbec..000000000 --- a/uppdev/agg24/agg_trans_warp_magnifier.h +++ /dev/null @@ -1,56 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_WARP_MAGNIFIER_INCLUDED -#define AGG_WARP_MAGNIFIER_INCLUDED - - -namespace agg -{ - - //----------------------------------------------------trans_warp_magnifier - // - // See Inmplementation agg_trans_warp_magnifier.cpp - // - class trans_warp_magnifier - { - public: - trans_warp_magnifier() : m_xc(0.0), m_yc(0.0), m_magn(1.0), m_radius(1.0) {} - - void center(double x, double y) { m_xc = x; m_yc = y; } - void magnification(double m) { m_magn = m; } - void radius(double r) { m_radius = r; } - - double xc() const { return m_xc; } - double yc() const { return m_yc; } - double magnification() const { return m_magn; } - double radius() const { return m_radius; } - - void transform(double* x, double* y) const; - void inverse_transform(double* x, double* y) const; - - private: - double m_xc; - double m_yc; - double m_magn; - double m_radius; - }; - - -} - - -#endif - diff --git a/uppdev/agg24/agg_vcgen_bspline.cpp b/uppdev/agg24/agg_vcgen_bspline.cpp deleted file mode 100644 index 4a0be6693..000000000 --- a/uppdev/agg24/agg_vcgen_bspline.cpp +++ /dev/null @@ -1,194 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#include "agg_vcgen_bspline.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - vcgen_bspline::vcgen_bspline() : - m_src_vertices(), - m_spline_x(), - m_spline_y(), - m_interpolation_step(1.0/50.0), - m_closed(0), - m_status(initial), - m_src_vertex(0) - { - } - - - //------------------------------------------------------------------------ - void vcgen_bspline::remove_all() - { - m_src_vertices.remove_all(); - m_closed = 0; - m_status = initial; - m_src_vertex = 0; - } - - - //------------------------------------------------------------------------ - void vcgen_bspline::add_vertex(double x, double y, unsigned cmd) - { - m_status = initial; - if(is_move_to(cmd)) - { - m_src_vertices.modify_last(point_d(x, y)); - } - else - { - if(is_vertex(cmd)) - { - m_src_vertices.add(point_d(x, y)); - } - else - { - m_closed = get_close_flag(cmd); - } - } - } - - - //------------------------------------------------------------------------ - void vcgen_bspline::rewind(unsigned) - { - m_cur_abscissa = 0.0; - m_max_abscissa = 0.0; - m_src_vertex = 0; - if(m_status == initial && m_src_vertices.size() > 2) - { - if(m_closed) - { - m_spline_x.init(m_src_vertices.size() + 8); - m_spline_y.init(m_src_vertices.size() + 8); - m_spline_x.add_point(0.0, m_src_vertices.prev(m_src_vertices.size() - 3).x); - m_spline_y.add_point(0.0, m_src_vertices.prev(m_src_vertices.size() - 3).y); - m_spline_x.add_point(1.0, m_src_vertices[m_src_vertices.size() - 3].x); - m_spline_y.add_point(1.0, m_src_vertices[m_src_vertices.size() - 3].y); - m_spline_x.add_point(2.0, m_src_vertices[m_src_vertices.size() - 2].x); - m_spline_y.add_point(2.0, m_src_vertices[m_src_vertices.size() - 2].y); - m_spline_x.add_point(3.0, m_src_vertices[m_src_vertices.size() - 1].x); - m_spline_y.add_point(3.0, m_src_vertices[m_src_vertices.size() - 1].y); - } - else - { - m_spline_x.init(m_src_vertices.size()); - m_spline_y.init(m_src_vertices.size()); - } - unsigned i; - for(i = 0; i < m_src_vertices.size(); i++) - { - double x = m_closed ? i + 4 : i; - m_spline_x.add_point(x, m_src_vertices[i].x); - m_spline_y.add_point(x, m_src_vertices[i].y); - } - m_cur_abscissa = 0.0; - m_max_abscissa = m_src_vertices.size() - 1; - if(m_closed) - { - m_cur_abscissa = 4.0; - m_max_abscissa += 5.0; - m_spline_x.add_point(m_src_vertices.size() + 4, m_src_vertices[0].x); - m_spline_y.add_point(m_src_vertices.size() + 4, m_src_vertices[0].y); - m_spline_x.add_point(m_src_vertices.size() + 5, m_src_vertices[1].x); - m_spline_y.add_point(m_src_vertices.size() + 5, m_src_vertices[1].y); - m_spline_x.add_point(m_src_vertices.size() + 6, m_src_vertices[2].x); - m_spline_y.add_point(m_src_vertices.size() + 6, m_src_vertices[2].y); - m_spline_x.add_point(m_src_vertices.size() + 7, m_src_vertices.next(2).x); - m_spline_y.add_point(m_src_vertices.size() + 7, m_src_vertices.next(2).y); - } - m_spline_x.prepare(); - m_spline_y.prepare(); - } - m_status = ready; - } - - - - - - - //------------------------------------------------------------------------ - unsigned vcgen_bspline::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_line_to; - while(!is_stop(cmd)) - { - switch(m_status) - { - case initial: - rewind(0); - - case ready: - if(m_src_vertices.size() < 2) - { - cmd = path_cmd_stop; - break; - } - - if(m_src_vertices.size() == 2) - { - *x = m_src_vertices[m_src_vertex].x; - *y = m_src_vertices[m_src_vertex].y; - m_src_vertex++; - if(m_src_vertex == 1) return path_cmd_move_to; - if(m_src_vertex == 2) return path_cmd_line_to; - cmd = path_cmd_stop; - break; - } - - cmd = path_cmd_move_to; - m_status = polygon; - m_src_vertex = 0; - - case polygon: - if(m_cur_abscissa >= m_max_abscissa) - { - if(m_closed) - { - m_status = end_poly; - break; - } - else - { - *x = m_src_vertices[m_src_vertices.size() - 1].x; - *y = m_src_vertices[m_src_vertices.size() - 1].y; - m_status = end_poly; - return path_cmd_line_to; - } - } - - *x = m_spline_x.get_stateful(m_cur_abscissa); - *y = m_spline_y.get_stateful(m_cur_abscissa); - m_src_vertex++; - m_cur_abscissa += m_interpolation_step; - return (m_src_vertex == 1) ? path_cmd_move_to : path_cmd_line_to; - - case end_poly: - m_status = stop; - return path_cmd_end_poly | m_closed; - - case stop: - return path_cmd_stop; - } - } - return cmd; - } - - -} - diff --git a/uppdev/agg24/agg_vcgen_bspline.h b/uppdev/agg24/agg_vcgen_bspline.h deleted file mode 100644 index a2944548c..000000000 --- a/uppdev/agg24/agg_vcgen_bspline.h +++ /dev/null @@ -1,74 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_VCGEN_BSPLINE_INCLUDED -#define AGG_VCGEN_BSPLINE_INCLUDED - -#include "agg_basics.h" -#include "agg_array.h" -#include "agg_bspline.h" - - -namespace agg -{ - - //==========================================================vcgen_bspline - class vcgen_bspline - { - enum status_e - { - initial, - ready, - polygon, - end_poly, - stop - }; - - public: - typedef pod_bvector vertex_storage; - - vcgen_bspline(); - - void interpolation_step(double v) { m_interpolation_step = v; } - double interpolation_step() const { return m_interpolation_step; } - - // Vertex Generator Interface - void remove_all(); - void add_vertex(double x, double y, unsigned cmd); - - // Vertex Source Interface - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - vcgen_bspline(const vcgen_bspline&); - const vcgen_bspline& operator = (const vcgen_bspline&); - - vertex_storage m_src_vertices; - bspline m_spline_x; - bspline m_spline_y; - double m_interpolation_step; - unsigned m_closed; - status_e m_status; - unsigned m_src_vertex; - double m_cur_abscissa; - double m_max_abscissa; - }; - -} - - -#endif - diff --git a/uppdev/agg24/agg_vcgen_contour.cpp b/uppdev/agg24/agg_vcgen_contour.cpp deleted file mode 100644 index a6a99405a..000000000 --- a/uppdev/agg24/agg_vcgen_contour.cpp +++ /dev/null @@ -1,165 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Contour generator -// -//---------------------------------------------------------------------------- - -#include -#include "agg_vcgen_contour.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - vcgen_contour::vcgen_contour() : - m_stroker(), - m_width(1), - m_src_vertices(), - m_out_vertices(), - m_status(initial), - m_src_vertex(0), - m_closed(0), - m_orientation(0), - m_auto_detect(false) - { - } - - //------------------------------------------------------------------------ - void vcgen_contour::remove_all() - { - m_src_vertices.remove_all(); - m_closed = 0; - m_orientation = 0; - m_status = initial; - } - - //------------------------------------------------------------------------ - void vcgen_contour::add_vertex(double x, double y, unsigned cmd) - { - m_status = initial; - if(is_move_to(cmd)) - { - m_src_vertices.modify_last(vertex_dist(x, y)); - } - else - { - if(is_vertex(cmd)) - { - m_src_vertices.add(vertex_dist(x, y)); - } - else - { - if(is_end_poly(cmd)) - { - m_closed = get_close_flag(cmd); - if(m_orientation == path_flags_none) - { - m_orientation = get_orientation(cmd); - } - } - } - } - } - - //------------------------------------------------------------------------ - void vcgen_contour::rewind(unsigned) - { - if(m_status == initial) - { - m_src_vertices.close(true); - if(m_auto_detect) - { - if(!is_oriented(m_orientation)) - { - m_orientation = (calc_polygon_area(m_src_vertices) > 0.0) ? - path_flags_ccw : - path_flags_cw; - } - } - if(is_oriented(m_orientation)) - { - m_stroker.width(is_ccw(m_orientation) ? m_width : -m_width); - } - } - m_status = ready; - m_src_vertex = 0; - } - - //------------------------------------------------------------------------ - unsigned vcgen_contour::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_line_to; - while(!is_stop(cmd)) - { - switch(m_status) - { - case initial: - rewind(0); - - case ready: - if(m_src_vertices.size() < 2 + unsigned(m_closed != 0)) - { - cmd = path_cmd_stop; - break; - } - m_status = outline; - cmd = path_cmd_move_to; - m_src_vertex = 0; - m_out_vertex = 0; - - case outline: - if(m_src_vertex >= m_src_vertices.size()) - { - m_status = end_poly; - break; - } - m_stroker.calc_join(m_out_vertices, - m_src_vertices.prev(m_src_vertex), - m_src_vertices.curr(m_src_vertex), - m_src_vertices.next(m_src_vertex), - m_src_vertices.prev(m_src_vertex).dist, - m_src_vertices.curr(m_src_vertex).dist); - ++m_src_vertex; - m_status = out_vertices; - m_out_vertex = 0; - - case out_vertices: - if(m_out_vertex >= m_out_vertices.size()) - { - m_status = outline; - } - else - { - const point_d& c = m_out_vertices[m_out_vertex++]; - *x = c.x; - *y = c.y; - return cmd; - } - break; - - case end_poly: - if(!m_closed) return path_cmd_stop; - m_status = stop; - return path_cmd_end_poly | path_flags_close | path_flags_ccw; - - case stop: - return path_cmd_stop; - } - } - return cmd; - } - -} diff --git a/uppdev/agg24/agg_vcgen_contour.h b/uppdev/agg24/agg_vcgen_contour.h deleted file mode 100644 index 8c25da13f..000000000 --- a/uppdev/agg24/agg_vcgen_contour.h +++ /dev/null @@ -1,94 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_VCGEN_CONTOUR_INCLUDED -#define AGG_VCGEN_CONTOUR_INCLUDED - -#include "agg_math_stroke.h" - -namespace agg -{ - - //----------------------------------------------------------vcgen_contour - // - // See Implementation agg_vcgen_contour.cpp - // - class vcgen_contour - { - enum status_e - { - initial, - ready, - outline, - out_vertices, - end_poly, - stop - }; - - public: - typedef vertex_sequence vertex_storage; - typedef pod_bvector coord_storage; - - vcgen_contour(); - - void line_cap(line_cap_e lc) { m_stroker.line_cap(lc); } - void line_join(line_join_e lj) { m_stroker.line_join(lj); } - void inner_join(inner_join_e ij) { m_stroker.inner_join(ij); } - - line_cap_e line_cap() const { return m_stroker.line_cap(); } - line_join_e line_join() const { return m_stroker.line_join(); } - inner_join_e inner_join() const { return m_stroker.inner_join(); } - - void width(double w) { m_stroker.width(m_width = w); } - void miter_limit(double ml) { m_stroker.miter_limit(ml); } - void miter_limit_theta(double t) { m_stroker.miter_limit_theta(t); } - void inner_miter_limit(double ml) { m_stroker.inner_miter_limit(ml); } - void approximation_scale(double as) { m_stroker.approximation_scale(as); } - - double width() const { return m_width; } - double miter_limit() const { return m_stroker.miter_limit(); } - double inner_miter_limit() const { return m_stroker.inner_miter_limit(); } - double approximation_scale() const { return m_stroker.approximation_scale(); } - - void auto_detect_orientation(bool v) { m_auto_detect = v; } - bool auto_detect_orientation() const { return m_auto_detect; } - - // Generator interface - void remove_all(); - void add_vertex(double x, double y, unsigned cmd); - - // Vertex Source Interface - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - vcgen_contour(const vcgen_contour&); - const vcgen_contour& operator = (const vcgen_contour&); - - math_stroke m_stroker; - double m_width; - vertex_storage m_src_vertices; - coord_storage m_out_vertices; - status_e m_status; - unsigned m_src_vertex; - unsigned m_out_vertex; - unsigned m_closed; - unsigned m_orientation; - bool m_auto_detect; - }; - -} - -#endif diff --git a/uppdev/agg24/agg_vcgen_dash.cpp b/uppdev/agg24/agg_vcgen_dash.cpp deleted file mode 100644 index 129505786..000000000 --- a/uppdev/agg24/agg_vcgen_dash.cpp +++ /dev/null @@ -1,235 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Line dash generator -// -//---------------------------------------------------------------------------- - -#include -#include "agg_vcgen_dash.h" -#include "agg_shorten_path.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - vcgen_dash::vcgen_dash() : - m_total_dash_len(0.0), - m_num_dashes(0), - m_dash_start(0.0), - m_shorten(0.0), - m_curr_dash_start(0.0), - m_curr_dash(0), - m_src_vertices(), - m_closed(0), - m_status(initial), - m_src_vertex(0) - { - } - - - - //------------------------------------------------------------------------ - void vcgen_dash::remove_all_dashes() - { - m_total_dash_len = 0.0; - m_num_dashes = 0; - m_curr_dash_start = 0.0; - m_curr_dash = 0; - } - - - //------------------------------------------------------------------------ - void vcgen_dash::add_dash(double dash_len, double gap_len) - { - if(m_num_dashes < max_dashes) - { - m_total_dash_len += dash_len + gap_len; - m_dashes[m_num_dashes++] = dash_len; - m_dashes[m_num_dashes++] = gap_len; - } - } - - - //------------------------------------------------------------------------ - void vcgen_dash::dash_start(double ds) - { - m_dash_start = ds; - calc_dash_start(fabs(ds)); - } - - - //------------------------------------------------------------------------ - void vcgen_dash::calc_dash_start(double ds) - { - m_curr_dash = 0; - m_curr_dash_start = 0.0; - while(ds > 0.0) - { - if(ds > m_dashes[m_curr_dash]) - { - ds -= m_dashes[m_curr_dash]; - ++m_curr_dash; - m_curr_dash_start = 0.0; - if(m_curr_dash >= m_num_dashes) m_curr_dash = 0; - } - else - { - m_curr_dash_start = ds; - ds = 0.0; - } - } - } - - - //------------------------------------------------------------------------ - void vcgen_dash::remove_all() - { - m_status = initial; - m_src_vertices.remove_all(); - m_closed = 0; - } - - - //------------------------------------------------------------------------ - void vcgen_dash::add_vertex(double x, double y, unsigned cmd) - { - m_status = initial; - if(is_move_to(cmd)) - { - m_src_vertices.modify_last(vertex_dist(x, y)); - } - else - { - if(is_vertex(cmd)) - { - m_src_vertices.add(vertex_dist(x, y)); - } - else - { - m_closed = get_close_flag(cmd); - } - } - } - - - //------------------------------------------------------------------------ - void vcgen_dash::rewind(unsigned) - { - if(m_status == initial) - { - m_src_vertices.close(m_closed != 0); - shorten_path(m_src_vertices, m_shorten, m_closed); - } - m_status = ready; - m_src_vertex = 0; - } - - - //------------------------------------------------------------------------ - unsigned vcgen_dash::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_move_to; - while(!is_stop(cmd)) - { - switch(m_status) - { - case initial: - rewind(0); - - case ready: - if(m_num_dashes < 2 || m_src_vertices.size() < 2) - { - cmd = path_cmd_stop; - break; - } - m_status = polyline; - m_src_vertex = 1; - m_v1 = &m_src_vertices[0]; - m_v2 = &m_src_vertices[1]; - m_curr_rest = m_v1->dist; - *x = m_v1->x; - *y = m_v1->y; - if(m_dash_start >= 0.0) calc_dash_start(m_dash_start); - return path_cmd_move_to; - - case polyline: - { - double dash_rest = m_dashes[m_curr_dash] - m_curr_dash_start; - - unsigned cmd = (m_curr_dash & 1) ? - path_cmd_move_to : - path_cmd_line_to; - - if(m_curr_rest > dash_rest) - { - m_curr_rest -= dash_rest; - ++m_curr_dash; - if(m_curr_dash >= m_num_dashes) m_curr_dash = 0; - m_curr_dash_start = 0.0; - *x = m_v2->x - (m_v2->x - m_v1->x) * m_curr_rest / m_v1->dist; - *y = m_v2->y - (m_v2->y - m_v1->y) * m_curr_rest / m_v1->dist; - } - else - { - m_curr_dash_start += m_curr_rest; - *x = m_v2->x; - *y = m_v2->y; - ++m_src_vertex; - m_v1 = m_v2; - m_curr_rest = m_v1->dist; - if(m_closed) - { - if(m_src_vertex > m_src_vertices.size()) - { - m_status = stop; - } - else - { - m_v2 = &m_src_vertices - [ - (m_src_vertex >= m_src_vertices.size()) ? 0 : - m_src_vertex - ]; - } - } - else - { - if(m_src_vertex >= m_src_vertices.size()) - { - m_status = stop; - } - else - { - m_v2 = &m_src_vertices[m_src_vertex]; - } - } - } - return cmd; - } - break; - - case stop: - cmd = path_cmd_stop; - break; - } - - } - return path_cmd_stop; - } - - -} - diff --git a/uppdev/agg24/agg_vcgen_dash.h b/uppdev/agg24/agg_vcgen_dash.h deleted file mode 100644 index c87dce4c8..000000000 --- a/uppdev/agg24/agg_vcgen_dash.h +++ /dev/null @@ -1,93 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Line dash generator -// -//---------------------------------------------------------------------------- -#ifndef AGG_VCGEN_DASH_INCLUDED -#define AGG_VCGEN_DASH_INCLUDED - -#include "agg_basics.h" -#include "agg_vertex_sequence.h" - -namespace agg -{ - - //---------------------------------------------------------------vcgen_dash - // - // See Implementation agg_vcgen_dash.cpp - // - class vcgen_dash - { - enum max_dashes_e - { - max_dashes = 32 - }; - - enum status_e - { - initial, - ready, - polyline, - stop - }; - - public: - typedef vertex_sequence vertex_storage; - - vcgen_dash(); - - void remove_all_dashes(); - void add_dash(double dash_len, double gap_len); - void dash_start(double ds); - - void shorten(double s) { m_shorten = s; } - double shorten() const { return m_shorten; } - - // Vertex Generator Interface - void remove_all(); - void add_vertex(double x, double y, unsigned cmd); - - // Vertex Source Interface - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - vcgen_dash(const vcgen_dash&); - const vcgen_dash& operator = (const vcgen_dash&); - - void calc_dash_start(double ds); - - double m_dashes[max_dashes]; - double m_total_dash_len; - unsigned m_num_dashes; - double m_dash_start; - double m_shorten; - double m_curr_dash_start; - unsigned m_curr_dash; - double m_curr_rest; - const vertex_dist* m_v1; - const vertex_dist* m_v2; - - vertex_storage m_src_vertices; - unsigned m_closed; - status_e m_status; - unsigned m_src_vertex; - }; - - -} - -#endif diff --git a/uppdev/agg24/agg_vcgen_markers_term.cpp b/uppdev/agg24/agg_vcgen_markers_term.cpp deleted file mode 100644 index 3374ab5e8..000000000 --- a/uppdev/agg24/agg_vcgen_markers_term.cpp +++ /dev/null @@ -1,103 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Terminal markers generator (arrowhead/arrowtail) -// -//---------------------------------------------------------------------------- - -#include "agg_vcgen_markers_term.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - void vcgen_markers_term::remove_all() - { - m_markers.remove_all(); - } - - - //------------------------------------------------------------------------ - void vcgen_markers_term::add_vertex(double x, double y, unsigned cmd) - { - if(is_move_to(cmd)) - { - if(m_markers.size() & 1) - { - // Initial state, the first coordinate was added. - // If two of more calls of start_vertex() occures - // we just modify the last one. - m_markers.modify_last(coord_type(x, y)); - } - else - { - m_markers.add(coord_type(x, y)); - } - } - else - { - if(is_vertex(cmd)) - { - if(m_markers.size() & 1) - { - // Initial state, the first coordinate was added. - // Add three more points, 0,1,1,0 - m_markers.add(coord_type(x, y)); - m_markers.add(m_markers[m_markers.size() - 1]); - m_markers.add(m_markers[m_markers.size() - 3]); - } - else - { - if(m_markers.size()) - { - // Replace two last points: 0,1,1,0 -> 0,1,2,1 - m_markers[m_markers.size() - 1] = m_markers[m_markers.size() - 2]; - m_markers[m_markers.size() - 2] = coord_type(x, y); - } - } - } - } - } - - - //------------------------------------------------------------------------ - void vcgen_markers_term::rewind(unsigned path_id) - { - m_curr_id = path_id * 2; - m_curr_idx = m_curr_id; - } - - - //------------------------------------------------------------------------ - unsigned vcgen_markers_term::vertex(double* x, double* y) - { - if(m_curr_id > 2 || m_curr_idx >= m_markers.size()) - { - return path_cmd_stop; - } - const coord_type& c = m_markers[m_curr_idx]; - *x = c.x; - *y = c.y; - if(m_curr_idx & 1) - { - m_curr_idx += 3; - return path_cmd_line_to; - } - ++m_curr_idx; - return path_cmd_move_to; - } - - -} diff --git a/uppdev/agg24/agg_vcgen_markers_term.h b/uppdev/agg24/agg_vcgen_markers_term.h deleted file mode 100644 index ee1e74e3e..000000000 --- a/uppdev/agg24/agg_vcgen_markers_term.h +++ /dev/null @@ -1,66 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_VCGEN_MARKERS_TERM_INCLUDED -#define AGG_VCGEN_MARKERS_TERM_INCLUDED - -#include "agg_basics.h" -#include "agg_vertex_sequence.h" - -namespace agg -{ - - //======================================================vcgen_markers_term - // - // See Implemantation agg_vcgen_markers_term.cpp - // Terminal markers generator (arrowhead/arrowtail) - // - //------------------------------------------------------------------------ - class vcgen_markers_term - { - public: - vcgen_markers_term() : m_curr_id(0), m_curr_idx(0) {} - - // Vertex Generator Interface - void remove_all(); - void add_vertex(double x, double y, unsigned cmd); - - // Vertex Source Interface - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - vcgen_markers_term(const vcgen_markers_term&); - const vcgen_markers_term& operator = (const vcgen_markers_term&); - - struct coord_type - { - double x, y; - - coord_type() {} - coord_type(double x_, double y_) : x(x_), y(y_) {} - }; - - typedef pod_bvector coord_storage; - - coord_storage m_markers; - unsigned m_curr_id; - unsigned m_curr_idx; - }; - - -} - -#endif diff --git a/uppdev/agg24/agg_vcgen_smooth_poly1.cpp b/uppdev/agg24/agg_vcgen_smooth_poly1.cpp deleted file mode 100644 index ff7d488d3..000000000 --- a/uppdev/agg24/agg_vcgen_smooth_poly1.cpp +++ /dev/null @@ -1,225 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Smooth polygon generator -// -//---------------------------------------------------------------------------- - -#include "agg_vcgen_smooth_poly1.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - vcgen_smooth_poly1::vcgen_smooth_poly1() : - m_src_vertices(), - m_smooth_value(0.5), - m_closed(0), - m_status(initial), - m_src_vertex(0) - { - } - - - //------------------------------------------------------------------------ - void vcgen_smooth_poly1::remove_all() - { - m_src_vertices.remove_all(); - m_closed = 0; - m_status = initial; - } - - - //------------------------------------------------------------------------ - void vcgen_smooth_poly1::add_vertex(double x, double y, unsigned cmd) - { - m_status = initial; - if(is_move_to(cmd)) - { - m_src_vertices.modify_last(vertex_dist(x, y)); - } - else - { - if(is_vertex(cmd)) - { - m_src_vertices.add(vertex_dist(x, y)); - } - else - { - m_closed = get_close_flag(cmd); - } - } - } - - - //------------------------------------------------------------------------ - void vcgen_smooth_poly1::rewind(unsigned) - { - if(m_status == initial) - { - m_src_vertices.close(m_closed != 0); - } - m_status = ready; - m_src_vertex = 0; - } - - - //------------------------------------------------------------------------ - void vcgen_smooth_poly1::calculate(const vertex_dist& v0, - const vertex_dist& v1, - const vertex_dist& v2, - const vertex_dist& v3) - { - - double k1 = v0.dist / (v0.dist + v1.dist); - double k2 = v1.dist / (v1.dist + v2.dist); - - double xm1 = v0.x + (v2.x - v0.x) * k1; - double ym1 = v0.y + (v2.y - v0.y) * k1; - double xm2 = v1.x + (v3.x - v1.x) * k2; - double ym2 = v1.y + (v3.y - v1.y) * k2; - - m_ctrl1_x = v1.x + m_smooth_value * (v2.x - xm1); - m_ctrl1_y = v1.y + m_smooth_value * (v2.y - ym1); - m_ctrl2_x = v2.x + m_smooth_value * (v1.x - xm2); - m_ctrl2_y = v2.y + m_smooth_value * (v1.y - ym2); - } - - - //------------------------------------------------------------------------ - unsigned vcgen_smooth_poly1::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_line_to; - while(!is_stop(cmd)) - { - switch(m_status) - { - case initial: - rewind(0); - - case ready: - if(m_src_vertices.size() < 2) - { - cmd = path_cmd_stop; - break; - } - - if(m_src_vertices.size() == 2) - { - *x = m_src_vertices[m_src_vertex].x; - *y = m_src_vertices[m_src_vertex].y; - m_src_vertex++; - if(m_src_vertex == 1) return path_cmd_move_to; - if(m_src_vertex == 2) return path_cmd_line_to; - cmd = path_cmd_stop; - break; - } - - cmd = path_cmd_move_to; - m_status = polygon; - m_src_vertex = 0; - - case polygon: - if(m_closed) - { - if(m_src_vertex >= m_src_vertices.size()) - { - *x = m_src_vertices[0].x; - *y = m_src_vertices[0].y; - m_status = end_poly; - return path_cmd_curve4; - } - } - else - { - if(m_src_vertex >= m_src_vertices.size() - 1) - { - *x = m_src_vertices[m_src_vertices.size() - 1].x; - *y = m_src_vertices[m_src_vertices.size() - 1].y; - m_status = end_poly; - return path_cmd_curve3; - } - } - - calculate(m_src_vertices.prev(m_src_vertex), - m_src_vertices.curr(m_src_vertex), - m_src_vertices.next(m_src_vertex), - m_src_vertices.next(m_src_vertex + 1)); - - *x = m_src_vertices[m_src_vertex].x; - *y = m_src_vertices[m_src_vertex].y; - m_src_vertex++; - - if(m_closed) - { - m_status = ctrl1; - return ((m_src_vertex == 1) ? - path_cmd_move_to : - path_cmd_curve4); - } - else - { - if(m_src_vertex == 1) - { - m_status = ctrl_b; - return path_cmd_move_to; - } - if(m_src_vertex >= m_src_vertices.size() - 1) - { - m_status = ctrl_e; - return path_cmd_curve3; - } - m_status = ctrl1; - return path_cmd_curve4; - } - break; - - case ctrl_b: - *x = m_ctrl2_x; - *y = m_ctrl2_y; - m_status = polygon; - return path_cmd_curve3; - - case ctrl_e: - *x = m_ctrl1_x; - *y = m_ctrl1_y; - m_status = polygon; - return path_cmd_curve3; - - case ctrl1: - *x = m_ctrl1_x; - *y = m_ctrl1_y; - m_status = ctrl2; - return path_cmd_curve4; - - case ctrl2: - *x = m_ctrl2_x; - *y = m_ctrl2_y; - m_status = polygon; - return path_cmd_curve4; - - case end_poly: - m_status = stop; - return path_cmd_end_poly | m_closed; - - case stop: - return path_cmd_stop; - } - } - return cmd; - } - -} - diff --git a/uppdev/agg24/agg_vcgen_smooth_poly1.h b/uppdev/agg24/agg_vcgen_smooth_poly1.h deleted file mode 100644 index 80fc0fb79..000000000 --- a/uppdev/agg24/agg_vcgen_smooth_poly1.h +++ /dev/null @@ -1,87 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_VCGEN_SMOOTH_POLY1_INCLUDED -#define AGG_VCGEN_SMOOTH_POLY1_INCLUDED - -#include "agg_basics.h" -#include "agg_vertex_sequence.h" - - -namespace agg -{ - - //======================================================vcgen_smooth_poly1 - // - // See Implementation agg_vcgen_smooth_poly1.cpp - // Smooth polygon generator - // - //------------------------------------------------------------------------ - class vcgen_smooth_poly1 - { - enum status_e - { - initial, - ready, - polygon, - ctrl_b, - ctrl_e, - ctrl1, - ctrl2, - end_poly, - stop - }; - - public: - typedef vertex_sequence vertex_storage; - - vcgen_smooth_poly1(); - - void smooth_value(double v) { m_smooth_value = v * 0.5; } - double smooth_value() const { return m_smooth_value * 2.0; } - - // Vertex Generator Interface - void remove_all(); - void add_vertex(double x, double y, unsigned cmd); - - // Vertex Source Interface - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - vcgen_smooth_poly1(const vcgen_smooth_poly1&); - const vcgen_smooth_poly1& operator = (const vcgen_smooth_poly1&); - - void calculate(const vertex_dist& v0, - const vertex_dist& v1, - const vertex_dist& v2, - const vertex_dist& v3); - - vertex_storage m_src_vertices; - double m_smooth_value; - unsigned m_closed; - status_e m_status; - unsigned m_src_vertex; - double m_ctrl1_x; - double m_ctrl1_y; - double m_ctrl2_x; - double m_ctrl2_y; - }; - -} - - -#endif - diff --git a/uppdev/agg24/agg_vcgen_stroke.cpp b/uppdev/agg24/agg_vcgen_stroke.cpp deleted file mode 100644 index 2dae3e122..000000000 --- a/uppdev/agg24/agg_vcgen_stroke.cpp +++ /dev/null @@ -1,213 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Stroke generator -// -//---------------------------------------------------------------------------- -#include -#include "agg_vcgen_stroke.h" -#include "agg_shorten_path.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - vcgen_stroke::vcgen_stroke() : - m_stroker(), - m_src_vertices(), - m_out_vertices(), - m_shorten(0.0), - m_closed(0), - m_status(initial), - m_src_vertex(0), - m_out_vertex(0) - { - } - - //------------------------------------------------------------------------ - void vcgen_stroke::remove_all() - { - m_src_vertices.remove_all(); - m_closed = 0; - m_status = initial; - } - - - //------------------------------------------------------------------------ - void vcgen_stroke::add_vertex(double x, double y, unsigned cmd) - { - m_status = initial; - if(is_move_to(cmd)) - { - m_src_vertices.modify_last(vertex_dist(x, y)); - } - else - { - if(is_vertex(cmd)) - { - m_src_vertices.add(vertex_dist(x, y)); - } - else - { - m_closed = get_close_flag(cmd); - } - } - } - - //------------------------------------------------------------------------ - void vcgen_stroke::rewind(unsigned) - { - if(m_status == initial) - { - m_src_vertices.close(m_closed != 0); - shorten_path(m_src_vertices, m_shorten, m_closed); - if(m_src_vertices.size() < 3) m_closed = 0; - } - m_status = ready; - m_src_vertex = 0; - m_out_vertex = 0; - } - - - //------------------------------------------------------------------------ - unsigned vcgen_stroke::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_line_to; - while(!is_stop(cmd)) - { - switch(m_status) - { - case initial: - rewind(0); - - case ready: - if(m_src_vertices.size() < 2 + unsigned(m_closed != 0)) - { - cmd = path_cmd_stop; - break; - } - m_status = m_closed ? outline1 : cap1; - cmd = path_cmd_move_to; - m_src_vertex = 0; - m_out_vertex = 0; - break; - - case cap1: - m_stroker.calc_cap(m_out_vertices, - m_src_vertices[0], - m_src_vertices[1], - m_src_vertices[0].dist); - m_src_vertex = 1; - m_prev_status = outline1; - m_status = out_vertices; - m_out_vertex = 0; - break; - - case cap2: - m_stroker.calc_cap(m_out_vertices, - m_src_vertices[m_src_vertices.size() - 1], - m_src_vertices[m_src_vertices.size() - 2], - m_src_vertices[m_src_vertices.size() - 2].dist); - m_prev_status = outline2; - m_status = out_vertices; - m_out_vertex = 0; - break; - - case outline1: - if(m_closed) - { - if(m_src_vertex >= m_src_vertices.size()) - { - m_prev_status = close_first; - m_status = end_poly1; - break; - } - } - else - { - if(m_src_vertex >= m_src_vertices.size() - 1) - { - m_status = cap2; - break; - } - } - m_stroker.calc_join(m_out_vertices, - m_src_vertices.prev(m_src_vertex), - m_src_vertices.curr(m_src_vertex), - m_src_vertices.next(m_src_vertex), - m_src_vertices.prev(m_src_vertex).dist, - m_src_vertices.curr(m_src_vertex).dist); - ++m_src_vertex; - m_prev_status = m_status; - m_status = out_vertices; - m_out_vertex = 0; - break; - - case close_first: - m_status = outline2; - cmd = path_cmd_move_to; - - case outline2: - if(m_src_vertex <= unsigned(m_closed == 0)) - { - m_status = end_poly2; - m_prev_status = stop; - break; - } - - --m_src_vertex; - m_stroker.calc_join(m_out_vertices, - m_src_vertices.next(m_src_vertex), - m_src_vertices.curr(m_src_vertex), - m_src_vertices.prev(m_src_vertex), - m_src_vertices.curr(m_src_vertex).dist, - m_src_vertices.prev(m_src_vertex).dist); - - m_prev_status = m_status; - m_status = out_vertices; - m_out_vertex = 0; - break; - - case out_vertices: - if(m_out_vertex >= m_out_vertices.size()) - { - m_status = m_prev_status; - } - else - { - const point_d& c = m_out_vertices[m_out_vertex++]; - *x = c.x; - *y = c.y; - return cmd; - } - break; - - case end_poly1: - m_status = m_prev_status; - return path_cmd_end_poly | path_flags_close | path_flags_ccw; - - case end_poly2: - m_status = m_prev_status; - return path_cmd_end_poly | path_flags_close | path_flags_cw; - - case stop: - cmd = path_cmd_stop; - break; - } - } - return cmd; - } - -} diff --git a/uppdev/agg24/agg_vcgen_stroke.h b/uppdev/agg24/agg_vcgen_stroke.h deleted file mode 100644 index 778223fe4..000000000 --- a/uppdev/agg24/agg_vcgen_stroke.h +++ /dev/null @@ -1,102 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_VCGEN_STROKE_INCLUDED -#define AGG_VCGEN_STROKE_INCLUDED - -#include "agg_math_stroke.h" - - -namespace agg -{ - - //============================================================vcgen_stroke - // - // See Implementation agg_vcgen_stroke.cpp - // Stroke generator - // - //------------------------------------------------------------------------ - class vcgen_stroke - { - enum status_e - { - initial, - ready, - cap1, - cap2, - outline1, - close_first, - outline2, - out_vertices, - end_poly1, - end_poly2, - stop - }; - - public: - typedef vertex_sequence vertex_storage; - typedef pod_bvector coord_storage; - - vcgen_stroke(); - - void line_cap(line_cap_e lc) { m_stroker.line_cap(lc); } - void line_join(line_join_e lj) { m_stroker.line_join(lj); } - void inner_join(inner_join_e ij) { m_stroker.inner_join(ij); } - - line_cap_e line_cap() const { return m_stroker.line_cap(); } - line_join_e line_join() const { return m_stroker.line_join(); } - inner_join_e inner_join() const { return m_stroker.inner_join(); } - - void width(double w) { m_stroker.width(w); } - void miter_limit(double ml) { m_stroker.miter_limit(ml); } - void miter_limit_theta(double t) { m_stroker.miter_limit_theta(t); } - void inner_miter_limit(double ml) { m_stroker.inner_miter_limit(ml); } - void approximation_scale(double as) { m_stroker.approximation_scale(as); } - - double width() const { return m_stroker.width(); } - double miter_limit() const { return m_stroker.miter_limit(); } - double inner_miter_limit() const { return m_stroker.inner_miter_limit(); } - double approximation_scale() const { return m_stroker.approximation_scale(); } - - void shorten(double s) { m_shorten = s; } - double shorten() const { return m_shorten; } - - // Vertex Generator Interface - void remove_all(); - void add_vertex(double x, double y, unsigned cmd); - - // Vertex Source Interface - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - vcgen_stroke(const vcgen_stroke&); - const vcgen_stroke& operator = (const vcgen_stroke&); - - math_stroke m_stroker; - vertex_storage m_src_vertices; - coord_storage m_out_vertices; - double m_shorten; - unsigned m_closed; - status_e m_status; - status_e m_prev_status; - unsigned m_src_vertex; - unsigned m_out_vertex; - }; - - -} - -#endif diff --git a/uppdev/agg24/agg_vcgen_vertex_sequence.h b/uppdev/agg24/agg_vcgen_vertex_sequence.h deleted file mode 100644 index 5adc67159..000000000 --- a/uppdev/agg24/agg_vcgen_vertex_sequence.h +++ /dev/null @@ -1,135 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_VCGEN_VERTEX_SEQUENCE_INCLUDED -#define AGG_VCGEN_VERTEX_SEQUENCE_INCLUDED - -#include "agg_basics.h" -#include "agg_vertex_sequence.h" -#include "agg_shorten_path.h" - -namespace agg -{ - - //===================================================vcgen_vertex_sequence - class vcgen_vertex_sequence - { - public: - typedef vertex_dist_cmd vertex_type; - typedef vertex_sequence vertex_storage; - - vcgen_vertex_sequence() : - m_flags(0), - m_cur_vertex(0), - m_shorten(0.0), - m_ready(false) - { - } - - // Vertex Generator Interface - void remove_all(); - void add_vertex(double x, double y, unsigned cmd); - - // Vertex Source Interface - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - void shorten(double s) { m_shorten = s; } - double shorten() const { return m_shorten; } - - private: - vcgen_vertex_sequence(const vcgen_vertex_sequence&); - const vcgen_vertex_sequence& operator = (const vcgen_vertex_sequence&); - - vertex_storage m_src_vertices; - unsigned m_flags; - unsigned m_cur_vertex; - double m_shorten; - bool m_ready; - }; - - - //------------------------------------------------------------------------ - inline void vcgen_vertex_sequence::remove_all() - { - m_ready = false; - m_src_vertices.remove_all(); - m_cur_vertex = 0; - m_flags = 0; - } - - //------------------------------------------------------------------------ - inline void vcgen_vertex_sequence::add_vertex(double x, double y, unsigned cmd) - { - m_ready = false; - if(is_move_to(cmd)) - { - m_src_vertices.modify_last(vertex_dist_cmd(x, y, cmd)); - } - else - { - if(is_vertex(cmd)) - { - m_src_vertices.add(vertex_dist_cmd(x, y, cmd)); - } - else - { - m_flags = cmd & path_flags_mask; - } - } - } - - - //------------------------------------------------------------------------ - inline void vcgen_vertex_sequence::rewind(unsigned) - { - if(!m_ready) - { - m_src_vertices.close(is_closed(m_flags)); - shorten_path(m_src_vertices, m_shorten, get_close_flag(m_flags)); - } - m_ready = true; - m_cur_vertex = 0; - } - - //------------------------------------------------------------------------ - inline unsigned vcgen_vertex_sequence::vertex(double* x, double* y) - { - if(!m_ready) - { - rewind(0); - } - - if(m_cur_vertex == m_src_vertices.size()) - { - ++m_cur_vertex; - return path_cmd_end_poly | m_flags; - } - - if(m_cur_vertex > m_src_vertices.size()) - { - return path_cmd_stop; - } - - vertex_type& v = m_src_vertices[m_cur_vertex++]; - *x = v.x; - *y = v.y; - return v.cmd; - } - - -} - -#endif diff --git a/uppdev/agg24/agg_vertex_sequence.h b/uppdev/agg24/agg_vertex_sequence.h deleted file mode 100644 index 2ad0701b3..000000000 --- a/uppdev/agg24/agg_vertex_sequence.h +++ /dev/null @@ -1,172 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// vertex_sequence container and vertex_dist struct -// -//---------------------------------------------------------------------------- -#ifndef AGG_VERTEX_SEQUENCE_INCLUDED -#define AGG_VERTEX_SEQUENCE_INCLUDED - -#include "agg_basics.h" -#include "agg_array.h" -#include "agg_math.h" - -namespace agg -{ - - //----------------------------------------------------------vertex_sequence - // Modified agg::pod_bvector. The data is interpreted as a sequence - // of vertices. It means that the type T must expose: - // - // bool T::operator() (const T& val) - // - // that is called every time new vertex is being added. The main purpose - // of this operator is the possibility to calculate some values during - // adding and to return true if the vertex fits some criteria or false if - // it doesn't. In the last case the new vertex is not added. - // - // The simple example is filtering coinciding vertices with calculation - // of the distance between the current and previous ones: - // - // struct vertex_dist - // { - // double x; - // double y; - // double dist; - // - // vertex_dist() {} - // vertex_dist(double x_, double y_) : - // x(x_), - // y(y_), - // dist(0.0) - // { - // } - // - // bool operator () (const vertex_dist& val) - // { - // return (dist = calc_distance(x, y, val.x, val.y)) > EPSILON; - // } - // }; - // - // Function close() calls this operator and removes the last vertex if - // necessary. - //------------------------------------------------------------------------ - template - class vertex_sequence : public pod_bvector - { - public: - typedef pod_bvector base_type; - - void add(const T& val); - void modify_last(const T& val); - void close(bool remove_flag); - }; - - - - //------------------------------------------------------------------------ - template - void vertex_sequence::add(const T& val) - { - if(base_type::size() > 1) - { - if(!(*this)[base_type::size() - 2]((*this)[base_type::size() - 1])) - { - base_type::remove_last(); - } - } - base_type::add(val); - } - - - //------------------------------------------------------------------------ - template - void vertex_sequence::modify_last(const T& val) - { - base_type::remove_last(); - add(val); - } - - - - //------------------------------------------------------------------------ - template - void vertex_sequence::close(bool closed) - { - while(base_type::size() > 1) - { - if((*this)[base_type::size() - 2]((*this)[base_type::size() - 1])) break; - T t = (*this)[base_type::size() - 1]; - base_type::remove_last(); - modify_last(t); - } - - if(closed) - { - while(base_type::size() > 1) - { - if((*this)[base_type::size() - 1]((*this)[0])) break; - base_type::remove_last(); - } - } - } - - - //-------------------------------------------------------------vertex_dist - // Vertex (x, y) with the distance to the next one. The last vertex has - // distance between the last and the first points if the polygon is closed - // and 0.0 if it's a polyline. - struct vertex_dist - { - double x; - double y; - double dist; - - vertex_dist() {} - vertex_dist(double x_, double y_) : - x(x_), - y(y_), - dist(0.0) - { - } - - bool operator () (const vertex_dist& val) - { - bool ret = (dist = calc_distance(x, y, val.x, val.y)) > vertex_dist_epsilon; - if(!ret) dist = 1.0 / vertex_dist_epsilon; - return ret; - } - }; - - - - //--------------------------------------------------------vertex_dist_cmd - // Save as the above but with additional "command" value - struct vertex_dist_cmd : public vertex_dist - { - unsigned cmd; - - vertex_dist_cmd() {} - vertex_dist_cmd(double x_, double y_, unsigned cmd_) : - vertex_dist(x_, y_), - cmd(cmd_) - { - } - }; - - -} - -#endif diff --git a/uppdev/agg24/agg_vpgen_clip_polygon.cpp b/uppdev/agg24/agg_vpgen_clip_polygon.cpp deleted file mode 100644 index 452452601..000000000 --- a/uppdev/agg24/agg_vpgen_clip_polygon.cpp +++ /dev/null @@ -1,133 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#include "agg_vpgen_clip_polygon.h" -#include "agg_clip_liang_barsky.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - // Determine the clipping code of the vertex according to the - // Cyrus-Beck line clipping algorithm - // - // | | - // 0110 | 0010 | 0011 - // | | - // -------+--------+-------- clip_box.y2 - // | | - // 0100 | 0000 | 0001 - // | | - // -------+--------+-------- clip_box.y1 - // | | - // 1100 | 1000 | 1001 - // | | - // clip_box.x1 clip_box.x2 - // - // - unsigned vpgen_clip_polygon::clipping_flags(double x, double y) - { - if(x < m_clip_box.x1) - { - if(y > m_clip_box.y2) return 6; - if(y < m_clip_box.y1) return 12; - return 4; - } - - if(x > m_clip_box.x2) - { - if(y > m_clip_box.y2) return 3; - if(y < m_clip_box.y1) return 9; - return 1; - } - - if(y > m_clip_box.y2) return 2; - if(y < m_clip_box.y1) return 8; - - return 0; - } - - //---------------------------------------------------------------------------- - void vpgen_clip_polygon::reset() - { - m_vertex = 0; - m_num_vertices = 0; - } - - //---------------------------------------------------------------------------- - void vpgen_clip_polygon::move_to(double x, double y) - { - m_vertex = 0; - m_num_vertices = 0; - m_clip_flags = clipping_flags(x, y); - if(m_clip_flags == 0) - { - m_x[0] = x; - m_y[0] = y; - m_num_vertices = 1; - } - m_x1 = x; - m_y1 = y; - m_cmd = path_cmd_move_to; - } - - - //---------------------------------------------------------------------------- - void vpgen_clip_polygon::line_to(double x, double y) - { - m_vertex = 0; - m_num_vertices = 0; - unsigned flags = clipping_flags(x, y); - - if(m_clip_flags == flags) - { - if(flags == 0) - { - m_x[0] = x; - m_y[0] = y; - m_num_vertices = 1; - } - } - else - { - m_num_vertices = clip_liang_barsky(m_x1, m_y1, - x, y, - m_clip_box, - m_x, m_y); - } - - m_clip_flags = flags; - m_x1 = x; - m_y1 = y; - } - - - //---------------------------------------------------------------------------- - unsigned vpgen_clip_polygon::vertex(double* x, double* y) - { - if(m_vertex < m_num_vertices) - { - *x = m_x[m_vertex]; - *y = m_y[m_vertex]; - ++m_vertex; - unsigned cmd = m_cmd; - m_cmd = path_cmd_line_to; - return cmd; - } - return path_cmd_stop; - } - - -} diff --git a/uppdev/agg24/agg_vpgen_clip_polygon.h b/uppdev/agg24/agg_vpgen_clip_polygon.h deleted file mode 100644 index ded754e21..000000000 --- a/uppdev/agg24/agg_vpgen_clip_polygon.h +++ /dev/null @@ -1,83 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_VPGEN_CLIP_POLYGON_INCLUDED -#define AGG_VPGEN_CLIP_POLYGON_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - - //======================================================vpgen_clip_polygon - // - // See Implementation agg_vpgen_clip_polygon.cpp - // - class vpgen_clip_polygon - { - public: - vpgen_clip_polygon() : - m_clip_box(0, 0, 1, 1), - m_x1(0), - m_y1(0), - m_clip_flags(0), - m_num_vertices(0), - m_vertex(0), - m_cmd(path_cmd_move_to) - { - } - - void clip_box(double x1, double y1, double x2, double y2) - { - m_clip_box.x1 = x1; - m_clip_box.y1 = y1; - m_clip_box.x2 = x2; - m_clip_box.y2 = y2; - m_clip_box.normalize(); - } - - - double x1() const { return m_clip_box.x1; } - double y1() const { return m_clip_box.y1; } - double x2() const { return m_clip_box.x2; } - double y2() const { return m_clip_box.y2; } - - static bool auto_close() { return true; } - static bool auto_unclose() { return false; } - - void reset(); - void move_to(double x, double y); - void line_to(double x, double y); - unsigned vertex(double* x, double* y); - - private: - unsigned clipping_flags(double x, double y); - - private: - rect_d m_clip_box; - double m_x1; - double m_y1; - unsigned m_clip_flags; - double m_x[4]; - double m_y[4]; - unsigned m_num_vertices; - unsigned m_vertex; - unsigned m_cmd; - }; - -} - - -#endif diff --git a/uppdev/agg24/agg_vpgen_clip_polyline.cpp b/uppdev/agg24/agg_vpgen_clip_polyline.cpp deleted file mode 100644 index 6840803a9..000000000 --- a/uppdev/agg24/agg_vpgen_clip_polyline.cpp +++ /dev/null @@ -1,77 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#include "agg_vpgen_clip_polyline.h" -#include "agg_clip_liang_barsky.h" - -namespace agg -{ - //---------------------------------------------------------------------------- - void vpgen_clip_polyline::reset() - { - m_vertex = 0; - m_num_vertices = 0; - m_move_to = false; - } - - //---------------------------------------------------------------------------- - void vpgen_clip_polyline::move_to(double x, double y) - { - m_vertex = 0; - m_num_vertices = 0; - m_x1 = x; - m_y1 = y; - m_move_to = true; - } - - //---------------------------------------------------------------------------- - void vpgen_clip_polyline::line_to(double x, double y) - { - double x2 = x; - double y2 = y; - unsigned flags = clip_line_segment(&m_x1, &m_y1, &x2, &y2, m_clip_box); - - m_vertex = 0; - m_num_vertices = 0; - if((flags & 4) == 0) - { - if((flags & 1) != 0 || m_move_to) - { - m_x[0] = m_x1; - m_y[0] = m_y1; - m_cmd[0] = path_cmd_move_to; - m_num_vertices = 1; - } - m_x[m_num_vertices] = x2; - m_y[m_num_vertices] = y2; - m_cmd[m_num_vertices++] = path_cmd_line_to; - m_move_to = (flags & 2) != 0; - } - m_x1 = x; - m_y1 = y; - } - - //---------------------------------------------------------------------------- - unsigned vpgen_clip_polyline::vertex(double* x, double* y) - { - if(m_vertex < m_num_vertices) - { - *x = m_x[m_vertex]; - *y = m_y[m_vertex]; - return m_cmd[m_vertex++]; - } - return path_cmd_stop; - } -} diff --git a/uppdev/agg24/agg_vpgen_clip_polyline.h b/uppdev/agg24/agg_vpgen_clip_polyline.h deleted file mode 100644 index b070a7759..000000000 --- a/uppdev/agg24/agg_vpgen_clip_polyline.h +++ /dev/null @@ -1,78 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_VPGEN_CLIP_POLYLINE_INCLUDED -#define AGG_VPGEN_CLIP_POLYLINE_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - - //======================================================vpgen_clip_polyline - // - // See Implementation agg_vpgen_clip_polyline.cpp - // - class vpgen_clip_polyline - { - public: - vpgen_clip_polyline() : - m_clip_box(0, 0, 1, 1), - m_x1(0), - m_y1(0), - m_num_vertices(0), - m_vertex(0), - m_move_to(false) - { - } - - void clip_box(double x1, double y1, double x2, double y2) - { - m_clip_box.x1 = x1; - m_clip_box.y1 = y1; - m_clip_box.x2 = x2; - m_clip_box.y2 = y2; - m_clip_box.normalize(); - } - - double x1() const { return m_clip_box.x1; } - double y1() const { return m_clip_box.y1; } - double x2() const { return m_clip_box.x2; } - double y2() const { return m_clip_box.y2; } - - static bool auto_close() { return false; } - static bool auto_unclose() { return true; } - - void reset(); - void move_to(double x, double y); - void line_to(double x, double y); - unsigned vertex(double* x, double* y); - - private: - rect_d m_clip_box; - double m_x1; - double m_y1; - double m_x[2]; - double m_y[2]; - unsigned m_cmd[2]; - unsigned m_num_vertices; - unsigned m_vertex; - bool m_move_to; - }; - -} - - -#endif diff --git a/uppdev/agg24/agg_vpgen_segmentator.cpp b/uppdev/agg24/agg_vpgen_segmentator.cpp deleted file mode 100644 index 49a45b6b1..000000000 --- a/uppdev/agg24/agg_vpgen_segmentator.cpp +++ /dev/null @@ -1,67 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#include -#include "agg_vpgen_segmentator.h" - -namespace agg -{ - - void vpgen_segmentator::move_to(double x, double y) - { - m_x1 = x; - m_y1 = y; - m_dx = 0.0; - m_dy = 0.0; - m_dl = 2.0; - m_ddl = 2.0; - m_cmd = path_cmd_move_to; - } - - void vpgen_segmentator::line_to(double x, double y) - { - m_x1 += m_dx; - m_y1 += m_dy; - m_dx = x - m_x1; - m_dy = y - m_y1; - double len = sqrt(m_dx * m_dx + m_dy * m_dy) * m_approximation_scale; - if(len < 1e-30) len = 1e-30; - m_ddl = 1.0 / len; - m_dl = (m_cmd == path_cmd_move_to) ? 0.0 : m_ddl; - if(m_cmd == path_cmd_stop) m_cmd = path_cmd_line_to; - } - - unsigned vpgen_segmentator::vertex(double* x, double* y) - { - if(m_cmd == path_cmd_stop) return path_cmd_stop; - - unsigned cmd = m_cmd; - m_cmd = path_cmd_line_to; - if(m_dl >= 1.0 - m_ddl) - { - m_dl = 1.0; - m_cmd = path_cmd_stop; - *x = m_x1 + m_dx; - *y = m_y1 + m_dy; - return cmd; - } - *x = m_x1 + m_dx * m_dl; - *y = m_y1 + m_dy * m_dl; - m_dl += m_ddl; - return cmd; - } - -} - diff --git a/uppdev/agg24/agg_vpgen_segmentator.h b/uppdev/agg24/agg_vpgen_segmentator.h deleted file mode 100644 index 29b3c9fa6..000000000 --- a/uppdev/agg24/agg_vpgen_segmentator.h +++ /dev/null @@ -1,61 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_VPGEN_SEGMENTATOR_INCLUDED -#define AGG_VPGEN_SEGMENTATOR_INCLUDED - -#include -#include "agg_basics.h" - -namespace agg -{ - - //=======================================================vpgen_segmentator - // - // See Implementation agg_vpgen_segmentator.cpp - // - class vpgen_segmentator - { - public: - vpgen_segmentator() : m_approximation_scale(1.0) {} - - void approximation_scale(double s) { m_approximation_scale = s; } - double approximation_scale() const { return m_approximation_scale; } - - static bool auto_close() { return false; } - static bool auto_unclose() { return false; } - - void reset() { m_cmd = path_cmd_stop; } - void move_to(double x, double y); - void line_to(double x, double y); - unsigned vertex(double* x, double* y); - - private: - double m_approximation_scale; - double m_x1; - double m_y1; - double m_dx; - double m_dy; - double m_dl; - double m_ddl; - unsigned m_cmd; - }; - - - -} - -#endif - diff --git a/uppdev/agg24/agg_win32_bmp.cpp b/uppdev/agg24/agg_win32_bmp.cpp deleted file mode 100644 index e402a79f4..000000000 --- a/uppdev/agg24/agg_win32_bmp.cpp +++ /dev/null @@ -1,626 +0,0 @@ -//---------------------------------------------------------------------------- -// -//---------------------------------------------------------------------------- -// Contact: mcseemagg@yahoo.com -//---------------------------------------------------------------------------- -// -// class pixel_map -// -//---------------------------------------------------------------------------- - -#include "agg_win32_bmp.h" -#ifdef PLATFORM_WIN32 -#include "agg_basics.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - pixel_map::~pixel_map() - { - destroy(); - } - - - //------------------------------------------------------------------------ - pixel_map::pixel_map() : - m_bmp(0), - m_buf(0), - m_bpp(0), - m_is_internal(false), - m_img_size(0), - m_full_size(0) - - { - } - - - //------------------------------------------------------------------------ - void pixel_map::destroy() - { - if(m_bmp && m_is_internal) delete [] (unsigned char*)m_bmp; - m_bmp = 0; - m_is_internal = false; - m_buf = 0; - } - - - //------------------------------------------------------------------------ - void pixel_map::create(unsigned width, - unsigned height, - org_e org, - unsigned clear_val) - { - destroy(); - if(width == 0) width = 1; - if(height == 0) height = 1; - m_bpp = org; - create_from_bmp(create_bitmap_info(width, height, m_bpp)); - create_gray_scale_palette(m_bmp); - m_is_internal = true; - if(clear_val <= 255) - { - memset(m_buf, clear_val, m_img_size); - } - } - - - //------------------------------------------------------------------------ - HBITMAP pixel_map::create_dib_section(HDC h_dc, - unsigned width, - unsigned height, - org_e org, - unsigned clear_val) - { - destroy(); - if(width == 0) width = 1; - if(height == 0) height = 1; - m_bpp = org; - HBITMAP h_bitmap = create_dib_section_from_args(h_dc, width, height, m_bpp); - create_gray_scale_palette(m_bmp); - m_is_internal = true; - if(clear_val <= 255) - { - memset(m_buf, clear_val, m_img_size); - } - return h_bitmap; - } - - - - //------------------------------------------------------------------------ - void pixel_map::clear(unsigned clear_val) - { - if(m_buf) memset(m_buf, clear_val, m_img_size); - } - - - //------------------------------------------------------------------------ - void pixel_map::attach_to_bmp(BITMAPINFO *bmp) - { - if(bmp) - { - destroy(); - create_from_bmp(bmp); - m_is_internal = false; - } - } - - - - //static - //------------------------------------------------------------------------ - unsigned pixel_map::calc_full_size(BITMAPINFO *bmp) - { - if(bmp == 0) return 0; - - return sizeof(BITMAPINFOHEADER) + - sizeof(RGBQUAD) * calc_palette_size(bmp) + - bmp->bmiHeader.biSizeImage; - } - - //static - //------------------------------------------------------------------------ - unsigned pixel_map::calc_header_size(BITMAPINFO *bmp) - { - if(bmp == 0) return 0; - return sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * calc_palette_size(bmp); - } - - - //static - //------------------------------------------------------------------------ - unsigned pixel_map::calc_palette_size(unsigned clr_used, unsigned bits_per_pixel) - { - int palette_size = 0; - - if(bits_per_pixel <= 8) - { - palette_size = clr_used; - if(palette_size == 0) - { - palette_size = 1 << bits_per_pixel; - } - } - return palette_size; - } - - //static - //------------------------------------------------------------------------ - unsigned pixel_map::calc_palette_size(BITMAPINFO *bmp) - { - if(bmp == 0) return 0; - return calc_palette_size(bmp->bmiHeader.biClrUsed, bmp->bmiHeader.biBitCount); - } - - - //static - //------------------------------------------------------------------------ - unsigned char * pixel_map::calc_img_ptr(BITMAPINFO *bmp) - { - if(bmp == 0) return 0; - return ((unsigned char*)bmp) + calc_header_size(bmp); - } - - //static - //------------------------------------------------------------------------ - BITMAPINFO* pixel_map::create_bitmap_info(unsigned width, - unsigned height, - unsigned bits_per_pixel) - { - unsigned line_len = calc_row_len(width, bits_per_pixel); - unsigned img_size = line_len * height; - unsigned rgb_size = calc_palette_size(0, bits_per_pixel) * sizeof(RGBQUAD); - unsigned full_size = sizeof(BITMAPINFOHEADER) + rgb_size + img_size; - - BITMAPINFO *bmp = (BITMAPINFO *) new unsigned char[full_size]; - - bmp->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - bmp->bmiHeader.biWidth = width; - bmp->bmiHeader.biHeight = height; - bmp->bmiHeader.biPlanes = 1; - bmp->bmiHeader.biBitCount = (unsigned short)bits_per_pixel; - bmp->bmiHeader.biCompression = 0; - bmp->bmiHeader.biSizeImage = img_size; - bmp->bmiHeader.biXPelsPerMeter = 0; - bmp->bmiHeader.biYPelsPerMeter = 0; - bmp->bmiHeader.biClrUsed = 0; - bmp->bmiHeader.biClrImportant = 0; - - return bmp; - } - - - //static - //------------------------------------------------------------------------ - void pixel_map::create_gray_scale_palette(BITMAPINFO *bmp) - { - if(bmp == 0) return; - - unsigned rgb_size = calc_palette_size(bmp); - RGBQUAD *rgb = (RGBQUAD*)(((unsigned char*)bmp) + sizeof(BITMAPINFOHEADER)); - unsigned brightness; - unsigned i; - - for(i = 0; i < rgb_size; i++) - { - brightness = (255 * i) / (rgb_size - 1); - rgb->rgbBlue = - rgb->rgbGreen = - rgb->rgbRed = (unsigned char)brightness; - rgb->rgbReserved = 0; - rgb++; - } - } - - - - //static - //------------------------------------------------------------------------ - unsigned pixel_map::calc_row_len(unsigned width, unsigned bits_per_pixel) - { - unsigned n = width; - unsigned k; - - switch(bits_per_pixel) - { - case 1: k = n; - n = n >> 3; - if(k & 7) n++; - break; - - case 4: k = n; - n = n >> 1; - if(k & 3) n++; - break; - - case 8: - break; - - case 16: n *= 2; - break; - - case 24: n *= 3; - break; - - case 32: n *= 4; - break; - - case 48: n *= 6; - break; - - case 64: n *= 8; - break; - - default: n = 0; - break; - } - return ((n + 3) >> 2) << 2; - } - - - - - - //------------------------------------------------------------------------ - void pixel_map::draw(HDC h_dc, const RECT *device_rect, const RECT *bmp_rect) const - { - if(m_bmp == 0 || m_buf == 0) return; - - unsigned bmp_x = 0; - unsigned bmp_y = 0; - unsigned bmp_width = m_bmp->bmiHeader.biWidth; - unsigned bmp_height = m_bmp->bmiHeader.biHeight; - unsigned dvc_x = 0; - unsigned dvc_y = 0; - unsigned dvc_width = m_bmp->bmiHeader.biWidth; - unsigned dvc_height = m_bmp->bmiHeader.biHeight; - - if(bmp_rect) - { - bmp_x = bmp_rect->left; - bmp_y = bmp_rect->top; - bmp_width = bmp_rect->right - bmp_rect->left; - bmp_height = bmp_rect->bottom - bmp_rect->top; - } - - dvc_x = bmp_x; - dvc_y = bmp_y; - dvc_width = bmp_width; - dvc_height = bmp_height; - - if(device_rect) - { - dvc_x = device_rect->left; - dvc_y = device_rect->top; - dvc_width = device_rect->right - device_rect->left; - dvc_height = device_rect->bottom - device_rect->top; - } - - if(dvc_width != bmp_width || dvc_height != bmp_height) - { - ::SetStretchBltMode(h_dc, COLORONCOLOR); - ::StretchDIBits( - h_dc, // handle of device context - dvc_x, // x-coordinate of upper-left corner of source rect. - dvc_y, // y-coordinate of upper-left corner of source rect. - dvc_width, // width of source rectangle - dvc_height, // height of source rectangle - bmp_x, - bmp_y, // x, y -coordinates of upper-left corner of dest. rect. - bmp_width, // width of destination rectangle - bmp_height, // height of destination rectangle - m_buf, // address of bitmap bits - m_bmp, // address of bitmap data - DIB_RGB_COLORS, // usage - SRCCOPY // raster operation code - ); - } - else - { - ::SetDIBitsToDevice( - h_dc, // handle to device context - dvc_x, // x-coordinate of upper-left corner of - dvc_y, // y-coordinate of upper-left corner of - dvc_width, // source rectangle width - dvc_height, // source rectangle height - bmp_x, // x-coordinate of lower-left corner of - bmp_y, // y-coordinate of lower-left corner of - 0, // first scan line in array - bmp_height, // number of scan lines - m_buf, // address of array with DIB bits - m_bmp, // address of structure with bitmap info. - DIB_RGB_COLORS // RGB or palette indexes - ); - } - } - - - //------------------------------------------------------------------------ - void pixel_map::draw(HDC h_dc, int x, int y, double scale) const - { - if(m_bmp == 0 || m_buf == 0) return; - - unsigned width = unsigned(m_bmp->bmiHeader.biWidth * scale); - unsigned height = unsigned(m_bmp->bmiHeader.biHeight * scale); - RECT rect; - rect.left = x; - rect.top = y; - rect.right = x + width; - rect.bottom = y + height; - draw(h_dc, &rect); - } - - - - - //------------------------------------------------------------------------ - void pixel_map::blend(HDC h_dc, const RECT *device_rect, const RECT *bmp_rect) const - { -#if !defined(AGG_BMP_ALPHA_BLEND) - draw(h_dc, device_rect, bmp_rect); - return; -#else - if(m_bpp != 32) - { - draw(h_dc, device_rect, bmp_rect); - return; - } - - if(m_bmp == 0 || m_buf == 0) return; - - unsigned bmp_x = 0; - unsigned bmp_y = 0; - unsigned bmp_width = m_bmp->bmiHeader.biWidth; - unsigned bmp_height = m_bmp->bmiHeader.biHeight; - unsigned dvc_x = 0; - unsigned dvc_y = 0; - unsigned dvc_width = m_bmp->bmiHeader.biWidth; - unsigned dvc_height = m_bmp->bmiHeader.biHeight; - - if(bmp_rect) - { - bmp_x = bmp_rect->left; - bmp_y = bmp_rect->top; - bmp_width = bmp_rect->right - bmp_rect->left; - bmp_height = bmp_rect->bottom - bmp_rect->top; - } - - dvc_x = bmp_x; - dvc_y = bmp_y; - dvc_width = bmp_width; - dvc_height = bmp_height; - - if(device_rect) - { - dvc_x = device_rect->left; - dvc_y = device_rect->top; - dvc_width = device_rect->right - device_rect->left; - dvc_height = device_rect->bottom - device_rect->top; - } - - HDC mem_dc = ::CreateCompatibleDC(h_dc); - void* buf = 0; - HBITMAP bmp = ::CreateDIBSection( - mem_dc, - m_bmp, - DIB_RGB_COLORS, - &buf, - 0, - 0 - ); - memcpy(buf, m_buf, m_bmp->bmiHeader.biSizeImage); - - HBITMAP temp = (HBITMAP)::SelectObject(mem_dc, bmp); - - BLENDFUNCTION blend; - blend.BlendOp = AC_SRC_OVER; - blend.BlendFlags = 0; - -#if defined(AC_SRC_ALPHA) - blend.AlphaFormat = AC_SRC_ALPHA; -//#elif defined(AC_SRC_NO_PREMULT_ALPHA) -// blend.AlphaFormat = AC_SRC_NO_PREMULT_ALPHA; -#else -#error "No appropriate constant for alpha format. Check version of wingdi.h, There must be AC_SRC_ALPHA or AC_SRC_NO_PREMULT_ALPHA" -#endif - - blend.SourceConstantAlpha = 255; - ::AlphaBlend( - h_dc, - dvc_x, - dvc_y, - dvc_width, - dvc_height, - mem_dc, - bmp_x, - bmp_y, - bmp_width, - bmp_height, - blend - ); - - ::SelectObject(mem_dc, temp); - ::DeleteObject(bmp); - ::DeleteObject(mem_dc); -#endif //defined(AGG_BMP_ALPHA_BLEND) - } - - - //------------------------------------------------------------------------ - void pixel_map::blend(HDC h_dc, int x, int y, double scale) const - { - if(m_bmp == 0 || m_buf == 0) return; - unsigned width = unsigned(m_bmp->bmiHeader.biWidth * scale); - unsigned height = unsigned(m_bmp->bmiHeader.biHeight * scale); - RECT rect; - rect.left = x; - rect.top = y; - rect.right = x + width; - rect.bottom = y + height; - blend(h_dc, &rect); - } - - - //------------------------------------------------------------------------ - bool pixel_map::load_from_bmp(FILE *fd) - { - BITMAPFILEHEADER bmf; - BITMAPINFO *bmi = 0; - unsigned bmp_size; - - fread(&bmf, sizeof(bmf), 1, fd); - if(bmf.bfType != 0x4D42) goto bmperr; - - bmp_size = bmf.bfSize - sizeof(BITMAPFILEHEADER); - - bmi = (BITMAPINFO*) new unsigned char [bmp_size]; - if(fread(bmi, 1, bmp_size, fd) != bmp_size) goto bmperr; - destroy(); - m_bpp = bmi->bmiHeader.biBitCount; - create_from_bmp(bmi); - m_is_internal = 1; - return true; - - bmperr: - if(bmi) delete [] (unsigned char*) bmi; - return false; - } - - - - //------------------------------------------------------------------------ - bool pixel_map::load_from_bmp(const char *filename) - { - FILE *fd = fopen(filename, "rb"); - bool ret = false; - if(fd) - { - ret = load_from_bmp(fd); - fclose(fd); - } - return ret; - } - - - - //------------------------------------------------------------------------ - bool pixel_map::save_as_bmp(FILE *fd) const - { - if(m_bmp == 0) return 0; - - BITMAPFILEHEADER bmf; - - bmf.bfType = 0x4D42; - bmf.bfOffBits = calc_header_size(m_bmp) + sizeof(bmf); - bmf.bfSize = bmf.bfOffBits + m_img_size; - bmf.bfReserved1 = 0; - bmf.bfReserved2 = 0; - - fwrite(&bmf, sizeof(bmf), 1, fd); - fwrite(m_bmp, m_full_size, 1, fd); - return true; - } - - - - //------------------------------------------------------------------------ - bool pixel_map::save_as_bmp(const char *filename) const - { - FILE *fd = fopen(filename, "wb"); - bool ret = false; - if(fd) - { - ret = save_as_bmp(fd); - fclose(fd); - } - return ret; - } - - - //------------------------------------------------------------------------ - unsigned char* pixel_map::buf() - { - return m_buf; - } - - //------------------------------------------------------------------------ - unsigned pixel_map::width() const - { - return m_bmp->bmiHeader.biWidth; - } - - //------------------------------------------------------------------------ - unsigned pixel_map::height() const - { - return m_bmp->bmiHeader.biHeight; - } - - //------------------------------------------------------------------------ - int pixel_map::stride() const - { - return calc_row_len(m_bmp->bmiHeader.biWidth, - m_bmp->bmiHeader.biBitCount); - } - - - //private - //------------------------------------------------------------------------ - void pixel_map::create_from_bmp(BITMAPINFO *bmp) - { - if(bmp) - { - m_img_size = calc_row_len(bmp->bmiHeader.biWidth, - bmp->bmiHeader.biBitCount) * - bmp->bmiHeader.biHeight; - - m_full_size = calc_full_size(bmp); - m_bmp = bmp; - m_buf = calc_img_ptr(bmp); - } - } - - - //private - //------------------------------------------------------------------------ - HBITMAP pixel_map::create_dib_section_from_args(HDC h_dc, - unsigned width, - unsigned height, - unsigned bits_per_pixel) - { - unsigned line_len = calc_row_len(width, bits_per_pixel); - unsigned img_size = line_len * height; - unsigned rgb_size = calc_palette_size(0, bits_per_pixel) * sizeof(RGBQUAD); - unsigned full_size = sizeof(BITMAPINFOHEADER) + rgb_size; - - BITMAPINFO *bmp = (BITMAPINFO *) new unsigned char[full_size]; - - bmp->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - bmp->bmiHeader.biWidth = width; - bmp->bmiHeader.biHeight = height; - bmp->bmiHeader.biPlanes = 1; - bmp->bmiHeader.biBitCount = (unsigned short)bits_per_pixel; - bmp->bmiHeader.biCompression = 0; - bmp->bmiHeader.biSizeImage = img_size; - bmp->bmiHeader.biXPelsPerMeter = 0; - bmp->bmiHeader.biYPelsPerMeter = 0; - bmp->bmiHeader.biClrUsed = 0; - bmp->bmiHeader.biClrImportant = 0; - - void* img_ptr = 0; - HBITMAP h_bitmap = ::CreateDIBSection(h_dc, bmp, DIB_RGB_COLORS, &img_ptr, NULL, 0); - - if(img_ptr) - { - m_img_size = calc_row_len(width, bits_per_pixel) * height; - m_full_size = 0; - m_bmp = bmp; - m_buf = (unsigned char *) img_ptr; - } - - return h_bitmap; - } -} - -#endif - diff --git a/uppdev/agg24/agg_win32_bmp.h b/uppdev/agg24/agg_win32_bmp.h deleted file mode 100644 index 5f7022523..000000000 --- a/uppdev/agg24/agg_win32_bmp.h +++ /dev/null @@ -1,118 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.4 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// class pixel_map -// -//---------------------------------------------------------------------------- -#ifndef AGG_WIN32_BMP_INCLUDED -#define AGG_WIN32_BMP_INCLUDED - -#include -#ifdef PLATFORM_WIN32 - -#include -#include - -namespace agg -{ - enum org_e - { - org_mono8 = 8, - org_color16 = 16, - org_color24 = 24, - org_color32 = 32, - org_color48 = 48, - org_color64 = 64 - }; - - class pixel_map - { - public: - ~pixel_map(); - pixel_map(); - - public: - void destroy(); - void create(unsigned width, - unsigned height, - org_e org, - unsigned clear_val=256); - HBITMAP create_dib_section(HDC h_dc, - unsigned width, - unsigned height, - org_e org, - unsigned clear_val=256); - - void clear(unsigned clear_val=256); - void attach_to_bmp(BITMAPINFO* bmp); - BITMAPINFO* bitmap_info() { return m_bmp; } - bool load_from_bmp(FILE* fd); - bool save_as_bmp(FILE* fd) const; - bool load_from_bmp(const char* filename); - bool save_as_bmp(const char* filename) const; - - void draw(HDC h_dc, - const RECT* device_rect=0, - const RECT* bmp_rect=0) const; - void draw(HDC h_dc, int x, int y, double scale=1.0) const; - - void blend(HDC h_dc, - const RECT* device_rect=0, - const RECT* bmp_rect=0) const; - void blend(HDC h_dc, int x, int y, double scale=1.0) const; - - - unsigned char* buf(); - unsigned width() const; - unsigned height() const; - int stride() const; - unsigned bpp() const { return m_bpp; } - - //Auxiliary static functions - static unsigned calc_full_size(BITMAPINFO *bmp); - static unsigned calc_header_size(BITMAPINFO *bmp); - static unsigned calc_palette_size(unsigned clr_used, - unsigned bits_per_pixel); - static unsigned calc_palette_size(BITMAPINFO *bmp); - static unsigned char* calc_img_ptr(BITMAPINFO *bmp); - static BITMAPINFO* create_bitmap_info(unsigned width, - unsigned height, - unsigned bits_per_pixel); - static void create_gray_scale_palette(BITMAPINFO *bmp); - static unsigned calc_row_len(unsigned width, unsigned bits_per_pixel); - - private: - pixel_map(const pixel_map&); - const pixel_map& operator = (const pixel_map&); - void create_from_bmp(BITMAPINFO *bmp); - - HBITMAP create_dib_section_from_args(HDC h_dc, - unsigned width, - unsigned height, - unsigned bits_per_pixel); - - private: - BITMAPINFO* m_bmp; - unsigned char* m_buf; - unsigned m_bpp; - bool m_is_internal; - unsigned m_img_size; - unsigned m_full_size; - }; - -} - -#endif -#endif diff --git a/uppdev/agg24/authors b/uppdev/agg24/authors deleted file mode 100644 index fd278460c..000000000 --- a/uppdev/agg24/authors +++ /dev/null @@ -1,7 +0,0 @@ -Original work: - -Anti-Grain Geometry - Version 2.4 -Copyright (C) 2002-2005 Maxim Shemanarev (McSeem) - -Upp implementation: -Jan Dolinár 2008 \ No newline at end of file diff --git a/uppdev/agg24/copying b/uppdev/agg24/copying deleted file mode 100644 index b6028e519..000000000 --- a/uppdev/agg24/copying +++ /dev/null @@ -1,65 +0,0 @@ -The Anti-Grain Geometry Project -A high quality rendering engine for C++ -http://antigrain.com - -Anti-Grain Geometry has dual licensing model. The Modified BSD -License was first added in version v2.4 just for convenience. -It is a simple, permissive non-copyleft free software license, -compatible with the GNU GPL. It's well proven and recognizable. -See http://www.fsf.org/licensing/licenses/index_html#ModifiedBSD -for details. - -Note that the Modified BSD license DOES NOT restrict your rights -if you choose the Anti-Grain Geometry Public License. - - - - -Anti-Grain Geometry Public License -==================================================== - -Anti-Grain Geometry - Version 2.4 -Copyright (C) 2002-2005 Maxim Shemanarev (McSeem) - -Permission to copy, use, modify, sell and distribute this software -is granted provided this copyright notice appears in all copies. -This software is provided "as is" without express or implied -warranty, and with no claim as to its suitability for any purpose. - - - - - -Modified BSD License -==================================================== -Anti-Grain Geometry - Version 2.4 -Copyright (C) 2002-2005 Maxim Shemanarev (McSeem) - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - 3. The name of the author may not be used to endorse or promote - products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - diff --git a/uppdev/agg24/gpc.c b/uppdev/agg24/gpc.c deleted file mode 100644 index b9cce1bed..000000000 --- a/uppdev/agg24/gpc.c +++ /dev/null @@ -1,2472 +0,0 @@ -/* -=========================================================================== - -Project: Generic Polygon Clipper - - A new algorithm for calculating the difference, intersection, - exclusive-or or union of arbitrary polygon sets. - -File: gpc.c -Author: Alan Murta (email: gpc@cs.man.ac.uk) -Version: 2.32 -Date: 17th December 2004 - -Copyright: (C) 1997-2004, Advanced Interfaces Group, - University of Manchester. - - This software is free for non-commercial use. It may be copied, - modified, and redistributed provided that this copyright notice - is preserved on all copies. The intellectual property rights of - the algorithms used reside with the University of Manchester - Advanced Interfaces Group. - - You may not use this software, in whole or in part, in support - of any commercial product without the express consent of the - author. - - There is no warranty or other guarantee of fitness of this - software for any purpose. It is provided solely "as is". - -=========================================================================== -*/ - - -/* -=========================================================================== - Includes -=========================================================================== -*/ - -#include "gpc.h" -#include -#include -#include - - -/* -=========================================================================== - Constants -=========================================================================== -*/ - -#ifndef TRUE -#define FALSE 0 -#define TRUE 1 -#endif - -#define LEFT 0 -#define RIGHT 1 - -#define ABOVE 0 -#define BELOW 1 - -#define CLIP 0 -#define SUBJ 1 - -#define INVERT_TRISTRIPS FALSE - - -/* -=========================================================================== - Macros -=========================================================================== -*/ - -#define EQ(a, b) (fabs((a) - (b)) <= GPC_EPSILON) - -#define PREV_INDEX(i, n) ((i - 1 + n) % n) -#define NEXT_INDEX(i, n) ((i + 1 ) % n) - -#define OPTIMAL(v, i, n) ((v[PREV_INDEX(i, n)].y != v[i].y) || \ - (v[NEXT_INDEX(i, n)].y != v[i].y)) - -#define FWD_MIN(v, i, n) ((v[PREV_INDEX(i, n)].vertex.y >= v[i].vertex.y) \ - && (v[NEXT_INDEX(i, n)].vertex.y > v[i].vertex.y)) - -#define NOT_FMAX(v, i, n) (v[NEXT_INDEX(i, n)].vertex.y > v[i].vertex.y) - -#define REV_MIN(v, i, n) ((v[PREV_INDEX(i, n)].vertex.y > v[i].vertex.y) \ - && (v[NEXT_INDEX(i, n)].vertex.y >= v[i].vertex.y)) - -#define NOT_RMAX(v, i, n) (v[PREV_INDEX(i, n)].vertex.y > v[i].vertex.y) - -#define VERTEX(e,p,s,x,y) {add_vertex(&((e)->outp[(p)]->v[(s)]), x, y); \ - (e)->outp[(p)]->active++;} - -#define P_EDGE(d,e,p,i,j) {(d)= (e); \ - do {(d)= (d)->prev;} while (!(d)->outp[(p)]); \ - (i)= (d)->bot.x + (d)->dx * ((j)-(d)->bot.y);} - -#define N_EDGE(d,e,p,i,j) {(d)= (e); \ - do {(d)= (d)->next;} while (!(d)->outp[(p)]); \ - (i)= (d)->bot.x + (d)->dx * ((j)-(d)->bot.y);} - -#define MALLOC(p, b, s, t) {if ((b) > 0) { \ - p= (t*)malloc(b); if (!(p)) { \ - fprintf(stderr, "gpc malloc failure: %s\n", s); \ - exit(0);}} else p= NULL;} - -#define FREE(p) {if (p) {free(p); (p)= NULL;}} - - -/* -=========================================================================== - Private Data Types -=========================================================================== -*/ - -typedef enum /* Edge intersection classes */ -{ - NUL, /* Empty non-intersection */ - EMX, /* External maximum */ - ELI, /* External left intermediate */ - TED, /* Top edge */ - ERI, /* External right intermediate */ - RED, /* Right edge */ - IMM, /* Internal maximum and minimum */ - IMN, /* Internal minimum */ - EMN, /* External minimum */ - EMM, /* External maximum and minimum */ - LED, /* Left edge */ - ILI, /* Internal left intermediate */ - BED, /* Bottom edge */ - IRI, /* Internal right intermediate */ - IMX, /* Internal maximum */ - FUL /* Full non-intersection */ -} vertex_type; - -typedef enum /* Horizontal edge states */ -{ - NH, /* No horizontal edge */ - BH, /* Bottom horizontal edge */ - TH /* Top horizontal edge */ -} h_state; - -typedef enum /* Edge bundle state */ -{ - UNBUNDLED, /* Isolated edge not within a bundle */ - BUNDLE_HEAD, /* Bundle head node */ - BUNDLE_TAIL /* Passive bundle tail node */ -} bundle_state; - -typedef struct v_shape /* Internal vertex list datatype */ -{ - double x; /* X coordinate component */ - double y; /* Y coordinate component */ - struct v_shape *next; /* Pointer to next vertex in list */ -} vertex_node; - -typedef struct p_shape /* Internal contour / tristrip type */ -{ - int active; /* Active flag / vertex count */ - int hole; /* Hole / external contour flag */ - vertex_node *v[2]; /* Left and right vertex list ptrs */ - struct p_shape *next; /* Pointer to next polygon contour */ - struct p_shape *proxy; /* Pointer to actual structure used */ -} polygon_node; - -typedef struct edge_shape -{ - gpc_vertex vertex; /* Piggy-backed contour vertex data */ - gpc_vertex bot; /* Edge lower (x, y) coordinate */ - gpc_vertex top; /* Edge upper (x, y) coordinate */ - double xb; /* Scanbeam bottom x coordinate */ - double xt; /* Scanbeam top x coordinate */ - double dx; /* Change in x for a unit y increase */ - int type; /* Clip / subject edge flag */ - int bundle[2][2]; /* Bundle edge flags */ - int bside[2]; /* Bundle left / right indicators */ - bundle_state bstate[2]; /* Edge bundle state */ - polygon_node *outp[2]; /* Output polygon / tristrip pointer */ - struct edge_shape *prev; /* Previous edge in the AET */ - struct edge_shape *next; /* Next edge in the AET */ - struct edge_shape *pred; /* Edge connected at the lower end */ - struct edge_shape *succ; /* Edge connected at the upper end */ - struct edge_shape *next_bound; /* Pointer to next bound in LMT */ -} edge_node; - -typedef struct lmt_shape /* Local minima table */ -{ - double y; /* Y coordinate at local minimum */ - edge_node *first_bound; /* Pointer to bound list */ - struct lmt_shape *next; /* Pointer to next local minimum */ -} lmt_node; - -typedef struct sbt_t_shape /* Scanbeam tree */ -{ - double y; /* Scanbeam node y value */ - struct sbt_t_shape *less; /* Pointer to nodes with lower y */ - struct sbt_t_shape *more; /* Pointer to nodes with higher y */ -} sb_tree; - -typedef struct it_shape /* Intersection table */ -{ - edge_node *ie[2]; /* Intersecting edge (bundle) pair */ - gpc_vertex point; /* Point of intersection */ - struct it_shape *next; /* The next intersection table node */ -} it_node; - -typedef struct st_shape /* Sorted edge table */ -{ - edge_node *edge; /* Pointer to AET edge */ - double xb; /* Scanbeam bottom x coordinate */ - double xt; /* Scanbeam top x coordinate */ - double dx; /* Change in x for a unit y increase */ - struct st_shape *prev; /* Previous edge in sorted list */ -} st_node; - -typedef struct bbox_shape /* Contour axis-aligned bounding box */ -{ - double xmin; /* Minimum x coordinate */ - double ymin; /* Minimum y coordinate */ - double xmax; /* Maximum x coordinate */ - double ymax; /* Maximum y coordinate */ -} bbox; - - -/* -=========================================================================== - Global Data -=========================================================================== -*/ - -/* Horizontal edge state transitions within scanbeam boundary */ -const h_state next_h_state[3][6]= -{ - /* ABOVE BELOW CROSS */ - /* L R L R L R */ - /* NH */ {BH, TH, TH, BH, NH, NH}, - /* BH */ {NH, NH, NH, NH, TH, TH}, - /* TH */ {NH, NH, NH, NH, BH, BH} -}; - - -/* -=========================================================================== - Private Functions -=========================================================================== -*/ - -static void reset_it(it_node **it) -{ - it_node *itn; - - while (*it) - { - itn= (*it)->next; - FREE(*it); - *it= itn; - } -} - - -static void reset_lmt(lmt_node **lmt) -{ - lmt_node *lmtn; - - while (*lmt) - { - lmtn= (*lmt)->next; - FREE(*lmt); - *lmt= lmtn; - } -} - - -static void insert_bound(edge_node **b, edge_node *e) -{ - edge_node *existing_bound; - - if (!*b) - { - /* Link node e to the tail of the list */ - *b= e; - } - else - { - /* Do primary sort on the x field */ - if (e[0].bot.x < (*b)[0].bot.x) - { - /* Insert a new node mid-list */ - existing_bound= *b; - *b= e; - (*b)->next_bound= existing_bound; - } - else - { - if (e[0].bot.x == (*b)[0].bot.x) - { - /* Do secondary sort on the dx field */ - if (e[0].dx < (*b)[0].dx) - { - /* Insert a new node mid-list */ - existing_bound= *b; - *b= e; - (*b)->next_bound= existing_bound; - } - else - { - /* Head further down the list */ - insert_bound(&((*b)->next_bound), e); - } - } - else - { - /* Head further down the list */ - insert_bound(&((*b)->next_bound), e); - } - } - } -} - - -static edge_node **bound_list(lmt_node **lmt, double y) -{ - lmt_node *existing_node; - - if (!*lmt) - { - /* Add node onto the tail end of the LMT */ - MALLOC(*lmt, sizeof(lmt_node), "LMT insertion", lmt_node); - (*lmt)->y= y; - (*lmt)->first_bound= NULL; - (*lmt)->next= NULL; - return &((*lmt)->first_bound); - } - else - if (y < (*lmt)->y) - { - /* Insert a new LMT node before the current node */ - existing_node= *lmt; - MALLOC(*lmt, sizeof(lmt_node), "LMT insertion", lmt_node); - (*lmt)->y= y; - (*lmt)->first_bound= NULL; - (*lmt)->next= existing_node; - return &((*lmt)->first_bound); - } - else - if (y > (*lmt)->y) - /* Head further up the LMT */ - return bound_list(&((*lmt)->next), y); - else - /* Use this existing LMT node */ - return &((*lmt)->first_bound); -} - - -static void add_to_sbtree(int *entries, sb_tree **sbtree, double y) -{ - if (!*sbtree) - { - /* Add a new tree node here */ - MALLOC(*sbtree, sizeof(sb_tree), "scanbeam tree insertion", sb_tree); - (*sbtree)->y= y; - (*sbtree)->less= NULL; - (*sbtree)->more= NULL; - (*entries)++; - } - else - { - if ((*sbtree)->y > y) - { - /* Head into the 'less' sub-tree */ - add_to_sbtree(entries, &((*sbtree)->less), y); - } - else - { - if ((*sbtree)->y < y) - { - /* Head into the 'more' sub-tree */ - add_to_sbtree(entries, &((*sbtree)->more), y); - } - } - } -} - - -static void build_sbt(int *entries, double *sbt, sb_tree *sbtree) -{ - if (sbtree->less) - build_sbt(entries, sbt, sbtree->less); - sbt[*entries]= sbtree->y; - (*entries)++; - if (sbtree->more) - build_sbt(entries, sbt, sbtree->more); -} - - -static void free_sbtree(sb_tree **sbtree) -{ - if (*sbtree) - { - free_sbtree(&((*sbtree)->less)); - free_sbtree(&((*sbtree)->more)); - FREE(*sbtree); - } -} - - -static int count_optimal_vertices(gpc_vertex_list c) -{ - int result= 0, i; - - /* Ignore non-contributing contours */ - if (c.num_vertices > 0) - { - for (i= 0; i < c.num_vertices; i++) - /* Ignore superfluous vertices embedded in horizontal edges */ - if (OPTIMAL(c.vertex, i, c.num_vertices)) - result++; - } - return result; -} - - -static edge_node *build_lmt(lmt_node **lmt, sb_tree **sbtree, - int *sbt_entries, gpc_polygon *p, int type, - gpc_op op) -{ - int c, i, min, max, num_edges, v, num_vertices; - int total_vertices= 0, e_index=0; - edge_node *e, *edge_table; - - for (c= 0; c < p->num_contours; c++) - total_vertices+= count_optimal_vertices(p->contour[c]); - - /* Create the entire input polygon edge table in one go */ - MALLOC(edge_table, total_vertices * sizeof(edge_node), - "edge table creation", edge_node); - - for (c= 0; c < p->num_contours; c++) - { - if (p->contour[c].num_vertices < 0) - { - /* Ignore the non-contributing contour and repair the vertex count */ - p->contour[c].num_vertices= -p->contour[c].num_vertices; - } - else - { - /* Perform contour optimisation */ - num_vertices= 0; - for (i= 0; i < p->contour[c].num_vertices; i++) - if (OPTIMAL(p->contour[c].vertex, i, p->contour[c].num_vertices)) - { - edge_table[num_vertices].vertex.x= p->contour[c].vertex[i].x; - edge_table[num_vertices].vertex.y= p->contour[c].vertex[i].y; - - /* Record vertex in the scanbeam table */ - add_to_sbtree(sbt_entries, sbtree, - edge_table[num_vertices].vertex.y); - - num_vertices++; - } - - /* Do the contour forward pass */ - for (min= 0; min < num_vertices; min++) - { - /* If a forward local minimum... */ - if (FWD_MIN(edge_table, min, num_vertices)) - { - /* Search for the next local maximum... */ - num_edges= 1; - max= NEXT_INDEX(min, num_vertices); - while (NOT_FMAX(edge_table, max, num_vertices)) - { - num_edges++; - max= NEXT_INDEX(max, num_vertices); - } - - /* Build the next edge list */ - e= &edge_table[e_index]; - e_index+= num_edges; - v= min; - e[0].bstate[BELOW]= UNBUNDLED; - e[0].bundle[BELOW][CLIP]= FALSE; - e[0].bundle[BELOW][SUBJ]= FALSE; - for (i= 0; i < num_edges; i++) - { - e[i].xb= edge_table[v].vertex.x; - e[i].bot.x= edge_table[v].vertex.x; - e[i].bot.y= edge_table[v].vertex.y; - - v= NEXT_INDEX(v, num_vertices); - - e[i].top.x= edge_table[v].vertex.x; - e[i].top.y= edge_table[v].vertex.y; - e[i].dx= (edge_table[v].vertex.x - e[i].bot.x) / - (e[i].top.y - e[i].bot.y); - e[i].type= type; - e[i].outp[ABOVE]= NULL; - e[i].outp[BELOW]= NULL; - e[i].next= NULL; - e[i].prev= NULL; - e[i].succ= ((num_edges > 1) && (i < (num_edges - 1))) ? - &(e[i + 1]) : NULL; - e[i].pred= ((num_edges > 1) && (i > 0)) ? &(e[i - 1]) : NULL; - e[i].next_bound= NULL; - e[i].bside[CLIP]= (op == GPC_DIFF) ? RIGHT : LEFT; - e[i].bside[SUBJ]= LEFT; - } - insert_bound(bound_list(lmt, edge_table[min].vertex.y), e); - } - } - - /* Do the contour reverse pass */ - for (min= 0; min < num_vertices; min++) - { - /* If a reverse local minimum... */ - if (REV_MIN(edge_table, min, num_vertices)) - { - /* Search for the previous local maximum... */ - num_edges= 1; - max= PREV_INDEX(min, num_vertices); - while (NOT_RMAX(edge_table, max, num_vertices)) - { - num_edges++; - max= PREV_INDEX(max, num_vertices); - } - - /* Build the previous edge list */ - e= &edge_table[e_index]; - e_index+= num_edges; - v= min; - e[0].bstate[BELOW]= UNBUNDLED; - e[0].bundle[BELOW][CLIP]= FALSE; - e[0].bundle[BELOW][SUBJ]= FALSE; - for (i= 0; i < num_edges; i++) - { - e[i].xb= edge_table[v].vertex.x; - e[i].bot.x= edge_table[v].vertex.x; - e[i].bot.y= edge_table[v].vertex.y; - - v= PREV_INDEX(v, num_vertices); - - e[i].top.x= edge_table[v].vertex.x; - e[i].top.y= edge_table[v].vertex.y; - e[i].dx= (edge_table[v].vertex.x - e[i].bot.x) / - (e[i].top.y - e[i].bot.y); - e[i].type= type; - e[i].outp[ABOVE]= NULL; - e[i].outp[BELOW]= NULL; - e[i].next= NULL; - e[i].prev= NULL; - e[i].succ= ((num_edges > 1) && (i < (num_edges - 1))) ? - &(e[i + 1]) : NULL; - e[i].pred= ((num_edges > 1) && (i > 0)) ? &(e[i - 1]) : NULL; - e[i].next_bound= NULL; - e[i].bside[CLIP]= (op == GPC_DIFF) ? RIGHT : LEFT; - e[i].bside[SUBJ]= LEFT; - } - insert_bound(bound_list(lmt, edge_table[min].vertex.y), e); - } - } - } - } - return edge_table; -} - - -static void add_edge_to_aet(edge_node **aet, edge_node *edge, edge_node *prev) -{ - if (!*aet) - { - /* Append edge onto the tail end of the AET */ - *aet= edge; - edge->prev= prev; - edge->next= NULL; - } - else - { - /* Do primary sort on the xb field */ - if (edge->xb < (*aet)->xb) - { - /* Insert edge here (before the AET edge) */ - edge->prev= prev; - edge->next= *aet; - (*aet)->prev= edge; - *aet= edge; - } - else - { - if (edge->xb == (*aet)->xb) - { - /* Do secondary sort on the dx field */ - if (edge->dx < (*aet)->dx) - { - /* Insert edge here (before the AET edge) */ - edge->prev= prev; - edge->next= *aet; - (*aet)->prev= edge; - *aet= edge; - } - else - { - /* Head further into the AET */ - add_edge_to_aet(&((*aet)->next), edge, *aet); - } - } - else - { - /* Head further into the AET */ - add_edge_to_aet(&((*aet)->next), edge, *aet); - } - } - } -} - - -static void add_intersection(it_node **it, edge_node *edge0, edge_node *edge1, - double x, double y) -{ - it_node *existing_node; - - if (!*it) - { - /* Append a new node to the tail of the list */ - MALLOC(*it, sizeof(it_node), "IT insertion", it_node); - (*it)->ie[0]= edge0; - (*it)->ie[1]= edge1; - (*it)->point.x= x; - (*it)->point.y= y; - (*it)->next= NULL; - } - else - { - if ((*it)->point.y > y) - { - /* Insert a new node mid-list */ - existing_node= *it; - MALLOC(*it, sizeof(it_node), "IT insertion", it_node); - (*it)->ie[0]= edge0; - (*it)->ie[1]= edge1; - (*it)->point.x= x; - (*it)->point.y= y; - (*it)->next= existing_node; - } - else - /* Head further down the list */ - add_intersection(&((*it)->next), edge0, edge1, x, y); - } -} - - -static void add_st_edge(st_node **st, it_node **it, edge_node *edge, - double dy) -{ - st_node *existing_node; - double den, r, x, y; - - if (!*st) - { - /* Append edge onto the tail end of the ST */ - MALLOC(*st, sizeof(st_node), "ST insertion", st_node); - (*st)->edge= edge; - (*st)->xb= edge->xb; - (*st)->xt= edge->xt; - (*st)->dx= edge->dx; - (*st)->prev= NULL; - } - else - { - den= ((*st)->xt - (*st)->xb) - (edge->xt - edge->xb); - - /* If new edge and ST edge don't cross */ - if ((edge->xt >= (*st)->xt) || (edge->dx == (*st)->dx) || - (fabs(den) <= DBL_EPSILON)) - { - /* No intersection - insert edge here (before the ST edge) */ - existing_node= *st; - MALLOC(*st, sizeof(st_node), "ST insertion", st_node); - (*st)->edge= edge; - (*st)->xb= edge->xb; - (*st)->xt= edge->xt; - (*st)->dx= edge->dx; - (*st)->prev= existing_node; - } - else - { - /* Compute intersection between new edge and ST edge */ - r= (edge->xb - (*st)->xb) / den; - x= (*st)->xb + r * ((*st)->xt - (*st)->xb); - y= r * dy; - - /* Insert the edge pointers and the intersection point in the IT */ - add_intersection(it, (*st)->edge, edge, x, y); - - /* Head further into the ST */ - add_st_edge(&((*st)->prev), it, edge, dy); - } - } -} - - -static void build_intersection_table(it_node **it, edge_node *aet, double dy) -{ - st_node *st, *stp; - edge_node *edge; - - /* Build intersection table for the current scanbeam */ - reset_it(it); - st= NULL; - - /* Process each AET edge */ - for (edge= aet; edge; edge= edge->next) - { - if ((edge->bstate[ABOVE] == BUNDLE_HEAD) || - edge->bundle[ABOVE][CLIP] || edge->bundle[ABOVE][SUBJ]) - add_st_edge(&st, it, edge, dy); - } - - /* Free the sorted edge table */ - while (st) - { - stp= st->prev; - FREE(st); - st= stp; - } -} - -static int count_contours(polygon_node *polygon) -{ - int nc, nv; - vertex_node *v, *nextv; - - for (nc= 0; polygon; polygon= polygon->next) - if (polygon->active) - { - /* Count the vertices in the current contour */ - nv= 0; - for (v= polygon->proxy->v[LEFT]; v; v= v->next) - nv++; - - /* Record valid vertex counts in the active field */ - if (nv > 2) - { - polygon->active= nv; - nc++; - } - else - { - /* Invalid contour: just free the heap */ - for (v= polygon->proxy->v[LEFT]; v; v= nextv) - { - nextv= v->next; - FREE(v); - } - polygon->active= 0; - } - } - return nc; -} - - -static void add_left(polygon_node *p, double x, double y) -{ - vertex_node *nv; - - /* Create a new vertex node and set its fields */ - MALLOC(nv, sizeof(vertex_node), "vertex node creation", vertex_node); - nv->x= x; - nv->y= y; - - /* Add vertex nv to the left end of the polygon's vertex list */ - nv->next= p->proxy->v[LEFT]; - - /* Update proxy->[LEFT] to point to nv */ - p->proxy->v[LEFT]= nv; -} - - -static void merge_left(polygon_node *p, polygon_node *q, polygon_node *list) -{ - polygon_node *target; - - /* Label contour as a hole */ - q->proxy->hole= TRUE; - - if (p->proxy != q->proxy) - { - /* Assign p's vertex list to the left end of q's list */ - p->proxy->v[RIGHT]->next= q->proxy->v[LEFT]; - q->proxy->v[LEFT]= p->proxy->v[LEFT]; - - /* Redirect any p->proxy references to q->proxy */ - - for (target= p->proxy; list; list= list->next) - { - if (list->proxy == target) - { - list->active= FALSE; - list->proxy= q->proxy; - } - } - } -} - - -static void add_right(polygon_node *p, double x, double y) -{ - vertex_node *nv; - - /* Create a new vertex node and set its fields */ - MALLOC(nv, sizeof(vertex_node), "vertex node creation", vertex_node); - nv->x= x; - nv->y= y; - nv->next= NULL; - - /* Add vertex nv to the right end of the polygon's vertex list */ - p->proxy->v[RIGHT]->next= nv; - - /* Update proxy->v[RIGHT] to point to nv */ - p->proxy->v[RIGHT]= nv; -} - - -static void merge_right(polygon_node *p, polygon_node *q, polygon_node *list) -{ - polygon_node *target; - - /* Label contour as external */ - q->proxy->hole= FALSE; - - if (p->proxy != q->proxy) - { - /* Assign p's vertex list to the right end of q's list */ - q->proxy->v[RIGHT]->next= p->proxy->v[LEFT]; - q->proxy->v[RIGHT]= p->proxy->v[RIGHT]; - - /* Redirect any p->proxy references to q->proxy */ - for (target= p->proxy; list; list= list->next) - { - if (list->proxy == target) - { - list->active= FALSE; - list->proxy= q->proxy; - } - } - } -} - - -static void add_local_min(polygon_node **p, edge_node *edge, - double x, double y) -{ - polygon_node *existing_min; - vertex_node *nv; - - existing_min= *p; - - MALLOC(*p, sizeof(polygon_node), "polygon node creation", polygon_node); - - /* Create a new vertex node and set its fields */ - MALLOC(nv, sizeof(vertex_node), "vertex node creation", vertex_node); - nv->x= x; - nv->y= y; - nv->next= NULL; - - /* Initialise proxy to point to p itself */ - (*p)->proxy= (*p); - (*p)->active= TRUE; - (*p)->next= existing_min; - - /* Make v[LEFT] and v[RIGHT] point to new vertex nv */ - (*p)->v[LEFT]= nv; - (*p)->v[RIGHT]= nv; - - /* Assign polygon p to the edge */ - edge->outp[ABOVE]= *p; -} - - -static int count_tristrips(polygon_node *tn) -{ - int total; - - for (total= 0; tn; tn= tn->next) - if (tn->active > 2) - total++; - return total; -} - - -static void add_vertex(vertex_node **t, double x, double y) -{ - if (!(*t)) - { - MALLOC(*t, sizeof(vertex_node), "tristrip vertex creation", vertex_node); - (*t)->x= x; - (*t)->y= y; - (*t)->next= NULL; - } - else - /* Head further down the list */ - add_vertex(&((*t)->next), x, y); -} - - -static void new_tristrip(polygon_node **tn, edge_node *edge, - double x, double y) -{ - if (!(*tn)) - { - MALLOC(*tn, sizeof(polygon_node), "tristrip node creation", polygon_node); - (*tn)->next= NULL; - (*tn)->v[LEFT]= NULL; - (*tn)->v[RIGHT]= NULL; - (*tn)->active= 1; - add_vertex(&((*tn)->v[LEFT]), x, y); - edge->outp[ABOVE]= *tn; - } - else - /* Head further down the list */ - new_tristrip(&((*tn)->next), edge, x, y); -} - - -static bbox *create_contour_bboxes(gpc_polygon *p) -{ - bbox *box; - int c, v; - - MALLOC(box, p->num_contours * sizeof(bbox), "Bounding box creation", bbox); - - /* Construct contour bounding boxes */ - for (c= 0; c < p->num_contours; c++) - { - /* Initialise bounding box extent */ - box[c].xmin= DBL_MAX; - box[c].ymin= DBL_MAX; - box[c].xmax= -DBL_MAX; - box[c].ymax= -DBL_MAX; - - for (v= 0; v < p->contour[c].num_vertices; v++) - { - /* Adjust bounding box */ - if (p->contour[c].vertex[v].x < box[c].xmin) - box[c].xmin= p->contour[c].vertex[v].x; - if (p->contour[c].vertex[v].y < box[c].ymin) - box[c].ymin= p->contour[c].vertex[v].y; - if (p->contour[c].vertex[v].x > box[c].xmax) - box[c].xmax= p->contour[c].vertex[v].x; - if (p->contour[c].vertex[v].y > box[c].ymax) - box[c].ymax= p->contour[c].vertex[v].y; - } - } - return box; -} - - -static void minimax_test(gpc_polygon *subj, gpc_polygon *clip, gpc_op op) -{ - bbox *s_bbox, *c_bbox; - int s, c, *o_table, overlap; - - s_bbox= create_contour_bboxes(subj); - c_bbox= create_contour_bboxes(clip); - - MALLOC(o_table, subj->num_contours * clip->num_contours * sizeof(int), - "overlap table creation", int); - - /* Check all subject contour bounding boxes against clip boxes */ - for (s= 0; s < subj->num_contours; s++) - for (c= 0; c < clip->num_contours; c++) - o_table[c * subj->num_contours + s]= - (!((s_bbox[s].xmax < c_bbox[c].xmin) || - (s_bbox[s].xmin > c_bbox[c].xmax))) && - (!((s_bbox[s].ymax < c_bbox[c].ymin) || - (s_bbox[s].ymin > c_bbox[c].ymax))); - - /* For each clip contour, search for any subject contour overlaps */ - for (c= 0; c < clip->num_contours; c++) - { - overlap= 0; - for (s= 0; (!overlap) && (s < subj->num_contours); s++) - overlap= o_table[c * subj->num_contours + s]; - - if (!overlap) - /* Flag non contributing status by negating vertex count */ - clip->contour[c].num_vertices = -clip->contour[c].num_vertices; - } - - if (op == GPC_INT) - { - /* For each subject contour, search for any clip contour overlaps */ - for (s= 0; s < subj->num_contours; s++) - { - overlap= 0; - for (c= 0; (!overlap) && (c < clip->num_contours); c++) - overlap= o_table[c * subj->num_contours + s]; - - if (!overlap) - /* Flag non contributing status by negating vertex count */ - subj->contour[s].num_vertices = -subj->contour[s].num_vertices; - } - } - - FREE(s_bbox); - FREE(c_bbox); - FREE(o_table); -} - - -/* -=========================================================================== - Public Functions -=========================================================================== -*/ - -void gpc_free_polygon(gpc_polygon *p) -{ - int c; - - for (c= 0; c < p->num_contours; c++) - FREE(p->contour[c].vertex); - FREE(p->hole); - FREE(p->contour); - p->num_contours= 0; -} - - -void gpc_read_polygon(FILE *fp, int read_hole_flags, gpc_polygon *p) -{ - int c, v; - - fscanf(fp, "%d", &(p->num_contours)); - MALLOC(p->hole, p->num_contours * sizeof(int), - "hole flag array creation", int); - MALLOC(p->contour, p->num_contours - * sizeof(gpc_vertex_list), "contour creation", gpc_vertex_list); - for (c= 0; c < p->num_contours; c++) - { - fscanf(fp, "%d", &(p->contour[c].num_vertices)); - - if (read_hole_flags) - fscanf(fp, "%d", &(p->hole[c])); - else - p->hole[c]= FALSE; /* Assume all contours to be external */ - - MALLOC(p->contour[c].vertex, p->contour[c].num_vertices - * sizeof(gpc_vertex), "vertex creation", gpc_vertex); - for (v= 0; v < p->contour[c].num_vertices; v++) - fscanf(fp, "%lf %lf", &(p->contour[c].vertex[v].x), - &(p->contour[c].vertex[v].y)); - } -} - - -void gpc_write_polygon(FILE *fp, int write_hole_flags, gpc_polygon *p) -{ - int c, v; - - fprintf(fp, "%d\n", p->num_contours); - for (c= 0; c < p->num_contours; c++) - { - fprintf(fp, "%d\n", p->contour[c].num_vertices); - - if (write_hole_flags) - fprintf(fp, "%d\n", p->hole[c]); - - for (v= 0; v < p->contour[c].num_vertices; v++) - fprintf(fp, "% .*lf % .*lf\n", - DBL_DIG, p->contour[c].vertex[v].x, - DBL_DIG, p->contour[c].vertex[v].y); - } -} - - -void gpc_add_contour(gpc_polygon *p, gpc_vertex_list *new_contour, int hole) -{ - int *extended_hole, c, v; - gpc_vertex_list *extended_contour; - - /* Create an extended hole array */ - MALLOC(extended_hole, (p->num_contours + 1) - * sizeof(int), "contour hole addition", int); - - /* Create an extended contour array */ - MALLOC(extended_contour, (p->num_contours + 1) - * sizeof(gpc_vertex_list), "contour addition", gpc_vertex_list); - - /* Copy the old contour and hole data into the extended arrays */ - for (c= 0; c < p->num_contours; c++) - { - extended_hole[c]= p->hole[c]; - extended_contour[c]= p->contour[c]; - } - - /* Copy the new contour and hole onto the end of the extended arrays */ - c= p->num_contours; - extended_hole[c]= hole; - extended_contour[c].num_vertices= new_contour->num_vertices; - MALLOC(extended_contour[c].vertex, new_contour->num_vertices - * sizeof(gpc_vertex), "contour addition", gpc_vertex); - for (v= 0; v < new_contour->num_vertices; v++) - extended_contour[c].vertex[v]= new_contour->vertex[v]; - - /* Dispose of the old contour */ - FREE(p->contour); - FREE(p->hole); - - /* Update the polygon information */ - p->num_contours++; - p->hole= extended_hole; - p->contour= extended_contour; -} - - -void gpc_polygon_clip(gpc_op op, gpc_polygon *subj, gpc_polygon *clip, - gpc_polygon *result) -{ - sb_tree *sbtree= NULL; - it_node *it= NULL, *intersect; - edge_node *edge, *prev_edge, *next_edge, *succ_edge, *e0, *e1; - edge_node *aet= NULL, *c_heap= NULL, *s_heap= NULL; - lmt_node *lmt= NULL, *local_min; - polygon_node *out_poly= NULL, *p, *q, *poly, *npoly, *cf= NULL; - vertex_node *vtx, *nv; - h_state horiz[2]; - int in[2], exists[2], parity[2]= {LEFT, LEFT}; - int c, v, contributing, search, scanbeam= 0, sbt_entries= 0; - int vclass, bl, br, tl, tr; - double *sbt= NULL, xb, px, yb, yt, dy, ix, iy; - - /* Test for trivial NULL result cases */ - if (((subj->num_contours == 0) && (clip->num_contours == 0)) - || ((subj->num_contours == 0) && ((op == GPC_INT) || (op == GPC_DIFF))) - || ((clip->num_contours == 0) && (op == GPC_INT))) - { - result->num_contours= 0; - result->hole= NULL; - result->contour= NULL; - return; - } - - /* Identify potentialy contributing contours */ - if (((op == GPC_INT) || (op == GPC_DIFF)) - && (subj->num_contours > 0) && (clip->num_contours > 0)) - minimax_test(subj, clip, op); - - /* Build LMT */ - if (subj->num_contours > 0) - s_heap= build_lmt(&lmt, &sbtree, &sbt_entries, subj, SUBJ, op); - if (clip->num_contours > 0) - c_heap= build_lmt(&lmt, &sbtree, &sbt_entries, clip, CLIP, op); - - /* Return a NULL result if no contours contribute */ - if (lmt == NULL) - { - result->num_contours= 0; - result->hole= NULL; - result->contour= NULL; - reset_lmt(&lmt); - FREE(s_heap); - FREE(c_heap); - return; - } - - /* Build scanbeam table from scanbeam tree */ - MALLOC(sbt, sbt_entries * sizeof(double), "sbt creation", double); - build_sbt(&scanbeam, sbt, sbtree); - scanbeam= 0; - free_sbtree(&sbtree); - - /* Allow pointer re-use without causing memory leak */ - if (subj == result) - gpc_free_polygon(subj); - if (clip == result) - gpc_free_polygon(clip); - - /* Invert clip polygon for difference operation */ - if (op == GPC_DIFF) - parity[CLIP]= RIGHT; - - local_min= lmt; - - /* Process each scanbeam */ - while (scanbeam < sbt_entries) - { - /* Set yb and yt to the bottom and top of the scanbeam */ - yb= sbt[scanbeam++]; - if (scanbeam < sbt_entries) - { - yt= sbt[scanbeam]; - dy= yt - yb; - } - - /* === SCANBEAM BOUNDARY PROCESSING ================================ */ - - /* If LMT node corresponding to yb exists */ - if (local_min) - { - if (local_min->y == yb) - { - /* Add edges starting at this local minimum to the AET */ - for (edge= local_min->first_bound; edge; edge= edge->next_bound) - add_edge_to_aet(&aet, edge, NULL); - - local_min= local_min->next; - } - } - - /* Set dummy previous x value */ - px= -DBL_MAX; - - /* Create bundles within AET */ - e0= aet; - e1= aet; - - /* Set up bundle fields of first edge */ - aet->bundle[ABOVE][ aet->type]= (aet->top.y != yb); - aet->bundle[ABOVE][!aet->type]= FALSE; - aet->bstate[ABOVE]= UNBUNDLED; - - for (next_edge= aet->next; next_edge; next_edge= next_edge->next) - { - /* Set up bundle fields of next edge */ - next_edge->bundle[ABOVE][ next_edge->type]= (next_edge->top.y != yb); - next_edge->bundle[ABOVE][!next_edge->type]= FALSE; - next_edge->bstate[ABOVE]= UNBUNDLED; - - /* Bundle edges above the scanbeam boundary if they coincide */ - if (next_edge->bundle[ABOVE][next_edge->type]) - { - if (EQ(e0->xb, next_edge->xb) && EQ(e0->dx, next_edge->dx) - && (e0->top.y != yb)) - { - next_edge->bundle[ABOVE][ next_edge->type]^= - e0->bundle[ABOVE][ next_edge->type]; - next_edge->bundle[ABOVE][!next_edge->type]= - e0->bundle[ABOVE][!next_edge->type]; - next_edge->bstate[ABOVE]= BUNDLE_HEAD; - e0->bundle[ABOVE][CLIP]= FALSE; - e0->bundle[ABOVE][SUBJ]= FALSE; - e0->bstate[ABOVE]= BUNDLE_TAIL; - } - e0= next_edge; - } - } - - horiz[CLIP]= NH; - horiz[SUBJ]= NH; - - /* Process each edge at this scanbeam boundary */ - for (edge= aet; edge; edge= edge->next) - { - exists[CLIP]= edge->bundle[ABOVE][CLIP] + - (edge->bundle[BELOW][CLIP] << 1); - exists[SUBJ]= edge->bundle[ABOVE][SUBJ] + - (edge->bundle[BELOW][SUBJ] << 1); - - if (exists[CLIP] || exists[SUBJ]) - { - /* Set bundle side */ - edge->bside[CLIP]= parity[CLIP]; - edge->bside[SUBJ]= parity[SUBJ]; - - /* Determine contributing status and quadrant occupancies */ - switch (op) - { - case GPC_DIFF: - case GPC_INT: - contributing= (exists[CLIP] && (parity[SUBJ] || horiz[SUBJ])) - || (exists[SUBJ] && (parity[CLIP] || horiz[CLIP])) - || (exists[CLIP] && exists[SUBJ] - && (parity[CLIP] == parity[SUBJ])); - br= (parity[CLIP]) - && (parity[SUBJ]); - bl= (parity[CLIP] ^ edge->bundle[ABOVE][CLIP]) - && (parity[SUBJ] ^ edge->bundle[ABOVE][SUBJ]); - tr= (parity[CLIP] ^ (horiz[CLIP]!=NH)) - && (parity[SUBJ] ^ (horiz[SUBJ]!=NH)); - tl= (parity[CLIP] ^ (horiz[CLIP]!=NH) ^ edge->bundle[BELOW][CLIP]) - && (parity[SUBJ] ^ (horiz[SUBJ]!=NH) ^ edge->bundle[BELOW][SUBJ]); - break; - case GPC_XOR: - contributing= exists[CLIP] || exists[SUBJ]; - br= (parity[CLIP]) - ^ (parity[SUBJ]); - bl= (parity[CLIP] ^ edge->bundle[ABOVE][CLIP]) - ^ (parity[SUBJ] ^ edge->bundle[ABOVE][SUBJ]); - tr= (parity[CLIP] ^ (horiz[CLIP]!=NH)) - ^ (parity[SUBJ] ^ (horiz[SUBJ]!=NH)); - tl= (parity[CLIP] ^ (horiz[CLIP]!=NH) ^ edge->bundle[BELOW][CLIP]) - ^ (parity[SUBJ] ^ (horiz[SUBJ]!=NH) ^ edge->bundle[BELOW][SUBJ]); - break; - case GPC_UNION: - contributing= (exists[CLIP] && (!parity[SUBJ] || horiz[SUBJ])) - || (exists[SUBJ] && (!parity[CLIP] || horiz[CLIP])) - || (exists[CLIP] && exists[SUBJ] - && (parity[CLIP] == parity[SUBJ])); - br= (parity[CLIP]) - || (parity[SUBJ]); - bl= (parity[CLIP] ^ edge->bundle[ABOVE][CLIP]) - || (parity[SUBJ] ^ edge->bundle[ABOVE][SUBJ]); - tr= (parity[CLIP] ^ (horiz[CLIP]!=NH)) - || (parity[SUBJ] ^ (horiz[SUBJ]!=NH)); - tl= (parity[CLIP] ^ (horiz[CLIP]!=NH) ^ edge->bundle[BELOW][CLIP]) - || (parity[SUBJ] ^ (horiz[SUBJ]!=NH) ^ edge->bundle[BELOW][SUBJ]); - break; - } - - /* Update parity */ - parity[CLIP]^= edge->bundle[ABOVE][CLIP]; - parity[SUBJ]^= edge->bundle[ABOVE][SUBJ]; - - /* Update horizontal state */ - if (exists[CLIP]) - horiz[CLIP]= - next_h_state[horiz[CLIP]] - [((exists[CLIP] - 1) << 1) + parity[CLIP]]; - if (exists[SUBJ]) - horiz[SUBJ]= - next_h_state[horiz[SUBJ]] - [((exists[SUBJ] - 1) << 1) + parity[SUBJ]]; - - vclass= tr + (tl << 1) + (br << 2) + (bl << 3); - - if (contributing) - { - xb= edge->xb; - - switch (vclass) - { - case EMN: - case IMN: - add_local_min(&out_poly, edge, xb, yb); - px= xb; - cf= edge->outp[ABOVE]; - break; - case ERI: - if (xb != px) - { - add_right(cf, xb, yb); - px= xb; - } - edge->outp[ABOVE]= cf; - cf= NULL; - break; - case ELI: - add_left(edge->outp[BELOW], xb, yb); - px= xb; - cf= edge->outp[BELOW]; - break; - case EMX: - if (xb != px) - { - add_left(cf, xb, yb); - px= xb; - } - merge_right(cf, edge->outp[BELOW], out_poly); - cf= NULL; - break; - case ILI: - if (xb != px) - { - add_left(cf, xb, yb); - px= xb; - } - edge->outp[ABOVE]= cf; - cf= NULL; - break; - case IRI: - add_right(edge->outp[BELOW], xb, yb); - px= xb; - cf= edge->outp[BELOW]; - edge->outp[BELOW]= NULL; - break; - case IMX: - if (xb != px) - { - add_right(cf, xb, yb); - px= xb; - } - merge_left(cf, edge->outp[BELOW], out_poly); - cf= NULL; - edge->outp[BELOW]= NULL; - break; - case IMM: - if (xb != px) - { - add_right(cf, xb, yb); - px= xb; - } - merge_left(cf, edge->outp[BELOW], out_poly); - edge->outp[BELOW]= NULL; - add_local_min(&out_poly, edge, xb, yb); - cf= edge->outp[ABOVE]; - break; - case EMM: - if (xb != px) - { - add_left(cf, xb, yb); - px= xb; - } - merge_right(cf, edge->outp[BELOW], out_poly); - edge->outp[BELOW]= NULL; - add_local_min(&out_poly, edge, xb, yb); - cf= edge->outp[ABOVE]; - break; - case LED: - if (edge->bot.y == yb) - add_left(edge->outp[BELOW], xb, yb); - edge->outp[ABOVE]= edge->outp[BELOW]; - px= xb; - break; - case RED: - if (edge->bot.y == yb) - add_right(edge->outp[BELOW], xb, yb); - edge->outp[ABOVE]= edge->outp[BELOW]; - px= xb; - break; - default: - break; - } /* End of switch */ - } /* End of contributing conditional */ - } /* End of edge exists conditional */ - } /* End of AET loop */ - - /* Delete terminating edges from the AET, otherwise compute xt */ - for (edge= aet; edge; edge= edge->next) - { - if (edge->top.y == yb) - { - prev_edge= edge->prev; - next_edge= edge->next; - if (prev_edge) - prev_edge->next= next_edge; - else - aet= next_edge; - if (next_edge) - next_edge->prev= prev_edge; - - /* Copy bundle head state to the adjacent tail edge if required */ - if ((edge->bstate[BELOW] == BUNDLE_HEAD) && prev_edge) - { - if (prev_edge->bstate[BELOW] == BUNDLE_TAIL) - { - prev_edge->outp[BELOW]= edge->outp[BELOW]; - prev_edge->bstate[BELOW]= UNBUNDLED; - if (prev_edge->prev) - if (prev_edge->prev->bstate[BELOW] == BUNDLE_TAIL) - prev_edge->bstate[BELOW]= BUNDLE_HEAD; - } - } - } - else - { - if (edge->top.y == yt) - edge->xt= edge->top.x; - else - edge->xt= edge->bot.x + edge->dx * (yt - edge->bot.y); - } - } - - if (scanbeam < sbt_entries) - { - /* === SCANBEAM INTERIOR PROCESSING ============================== */ - - build_intersection_table(&it, aet, dy); - - /* Process each node in the intersection table */ - for (intersect= it; intersect; intersect= intersect->next) - { - e0= intersect->ie[0]; - e1= intersect->ie[1]; - - /* Only generate output for contributing intersections */ - if ((e0->bundle[ABOVE][CLIP] || e0->bundle[ABOVE][SUBJ]) - && (e1->bundle[ABOVE][CLIP] || e1->bundle[ABOVE][SUBJ])) - { - p= e0->outp[ABOVE]; - q= e1->outp[ABOVE]; - ix= intersect->point.x; - iy= intersect->point.y + yb; - - in[CLIP]= ( e0->bundle[ABOVE][CLIP] && !e0->bside[CLIP]) - || ( e1->bundle[ABOVE][CLIP] && e1->bside[CLIP]) - || (!e0->bundle[ABOVE][CLIP] && !e1->bundle[ABOVE][CLIP] - && e0->bside[CLIP] && e1->bside[CLIP]); - in[SUBJ]= ( e0->bundle[ABOVE][SUBJ] && !e0->bside[SUBJ]) - || ( e1->bundle[ABOVE][SUBJ] && e1->bside[SUBJ]) - || (!e0->bundle[ABOVE][SUBJ] && !e1->bundle[ABOVE][SUBJ] - && e0->bside[SUBJ] && e1->bside[SUBJ]); - - /* Determine quadrant occupancies */ - switch (op) - { - case GPC_DIFF: - case GPC_INT: - tr= (in[CLIP]) - && (in[SUBJ]); - tl= (in[CLIP] ^ e1->bundle[ABOVE][CLIP]) - && (in[SUBJ] ^ e1->bundle[ABOVE][SUBJ]); - br= (in[CLIP] ^ e0->bundle[ABOVE][CLIP]) - && (in[SUBJ] ^ e0->bundle[ABOVE][SUBJ]); - bl= (in[CLIP] ^ e1->bundle[ABOVE][CLIP] ^ e0->bundle[ABOVE][CLIP]) - && (in[SUBJ] ^ e1->bundle[ABOVE][SUBJ] ^ e0->bundle[ABOVE][SUBJ]); - break; - case GPC_XOR: - tr= (in[CLIP]) - ^ (in[SUBJ]); - tl= (in[CLIP] ^ e1->bundle[ABOVE][CLIP]) - ^ (in[SUBJ] ^ e1->bundle[ABOVE][SUBJ]); - br= (in[CLIP] ^ e0->bundle[ABOVE][CLIP]) - ^ (in[SUBJ] ^ e0->bundle[ABOVE][SUBJ]); - bl= (in[CLIP] ^ e1->bundle[ABOVE][CLIP] ^ e0->bundle[ABOVE][CLIP]) - ^ (in[SUBJ] ^ e1->bundle[ABOVE][SUBJ] ^ e0->bundle[ABOVE][SUBJ]); - break; - case GPC_UNION: - tr= (in[CLIP]) - || (in[SUBJ]); - tl= (in[CLIP] ^ e1->bundle[ABOVE][CLIP]) - || (in[SUBJ] ^ e1->bundle[ABOVE][SUBJ]); - br= (in[CLIP] ^ e0->bundle[ABOVE][CLIP]) - || (in[SUBJ] ^ e0->bundle[ABOVE][SUBJ]); - bl= (in[CLIP] ^ e1->bundle[ABOVE][CLIP] ^ e0->bundle[ABOVE][CLIP]) - || (in[SUBJ] ^ e1->bundle[ABOVE][SUBJ] ^ e0->bundle[ABOVE][SUBJ]); - break; - } - - vclass= tr + (tl << 1) + (br << 2) + (bl << 3); - - switch (vclass) - { - case EMN: - add_local_min(&out_poly, e0, ix, iy); - e1->outp[ABOVE]= e0->outp[ABOVE]; - break; - case ERI: - if (p) - { - add_right(p, ix, iy); - e1->outp[ABOVE]= p; - e0->outp[ABOVE]= NULL; - } - break; - case ELI: - if (q) - { - add_left(q, ix, iy); - e0->outp[ABOVE]= q; - e1->outp[ABOVE]= NULL; - } - break; - case EMX: - if (p && q) - { - add_left(p, ix, iy); - merge_right(p, q, out_poly); - e0->outp[ABOVE]= NULL; - e1->outp[ABOVE]= NULL; - } - break; - case IMN: - add_local_min(&out_poly, e0, ix, iy); - e1->outp[ABOVE]= e0->outp[ABOVE]; - break; - case ILI: - if (p) - { - add_left(p, ix, iy); - e1->outp[ABOVE]= p; - e0->outp[ABOVE]= NULL; - } - break; - case IRI: - if (q) - { - add_right(q, ix, iy); - e0->outp[ABOVE]= q; - e1->outp[ABOVE]= NULL; - } - break; - case IMX: - if (p && q) - { - add_right(p, ix, iy); - merge_left(p, q, out_poly); - e0->outp[ABOVE]= NULL; - e1->outp[ABOVE]= NULL; - } - break; - case IMM: - if (p && q) - { - add_right(p, ix, iy); - merge_left(p, q, out_poly); - add_local_min(&out_poly, e0, ix, iy); - e1->outp[ABOVE]= e0->outp[ABOVE]; - } - break; - case EMM: - if (p && q) - { - add_left(p, ix, iy); - merge_right(p, q, out_poly); - add_local_min(&out_poly, e0, ix, iy); - e1->outp[ABOVE]= e0->outp[ABOVE]; - } - break; - default: - break; - } /* End of switch */ - } /* End of contributing intersection conditional */ - - /* Swap bundle sides in response to edge crossing */ - if (e0->bundle[ABOVE][CLIP]) - e1->bside[CLIP]= !e1->bside[CLIP]; - if (e1->bundle[ABOVE][CLIP]) - e0->bside[CLIP]= !e0->bside[CLIP]; - if (e0->bundle[ABOVE][SUBJ]) - e1->bside[SUBJ]= !e1->bside[SUBJ]; - if (e1->bundle[ABOVE][SUBJ]) - e0->bside[SUBJ]= !e0->bside[SUBJ]; - - /* Swap e0 and e1 bundles in the AET */ - prev_edge= e0->prev; - next_edge= e1->next; - if (next_edge) - next_edge->prev= e0; - - if (e0->bstate[ABOVE] == BUNDLE_HEAD) - { - search= TRUE; - while (search) - { - prev_edge= prev_edge->prev; - if (prev_edge) - { - if (prev_edge->bstate[ABOVE] != BUNDLE_TAIL) - search= FALSE; - } - else - search= FALSE; - } - } - if (!prev_edge) - { - aet->prev= e1; - e1->next= aet; - aet= e0->next; - } - else - { - prev_edge->next->prev= e1; - e1->next= prev_edge->next; - prev_edge->next= e0->next; - } - e0->next->prev= prev_edge; - e1->next->prev= e1; - e0->next= next_edge; - } /* End of IT loop*/ - - /* Prepare for next scanbeam */ - for (edge= aet; edge; edge= next_edge) - { - next_edge= edge->next; - succ_edge= edge->succ; - - if ((edge->top.y == yt) && succ_edge) - { - /* Replace AET edge by its successor */ - succ_edge->outp[BELOW]= edge->outp[ABOVE]; - succ_edge->bstate[BELOW]= edge->bstate[ABOVE]; - succ_edge->bundle[BELOW][CLIP]= edge->bundle[ABOVE][CLIP]; - succ_edge->bundle[BELOW][SUBJ]= edge->bundle[ABOVE][SUBJ]; - prev_edge= edge->prev; - if (prev_edge) - prev_edge->next= succ_edge; - else - aet= succ_edge; - if (next_edge) - next_edge->prev= succ_edge; - succ_edge->prev= prev_edge; - succ_edge->next= next_edge; - } - else - { - /* Update this edge */ - edge->outp[BELOW]= edge->outp[ABOVE]; - edge->bstate[BELOW]= edge->bstate[ABOVE]; - edge->bundle[BELOW][CLIP]= edge->bundle[ABOVE][CLIP]; - edge->bundle[BELOW][SUBJ]= edge->bundle[ABOVE][SUBJ]; - edge->xb= edge->xt; - } - edge->outp[ABOVE]= NULL; - } - } - } /* === END OF SCANBEAM PROCESSING ================================== */ - - /* Generate result polygon from out_poly */ - result->contour= NULL; - result->hole= NULL; - result->num_contours= count_contours(out_poly); - if (result->num_contours > 0) - { - MALLOC(result->hole, result->num_contours - * sizeof(int), "hole flag table creation", int); - MALLOC(result->contour, result->num_contours - * sizeof(gpc_vertex_list), "contour creation", gpc_vertex_list); - - c= 0; - for (poly= out_poly; poly; poly= npoly) - { - npoly= poly->next; - if (poly->active) - { - result->hole[c]= poly->proxy->hole; - result->contour[c].num_vertices= poly->active; - MALLOC(result->contour[c].vertex, - result->contour[c].num_vertices * sizeof(gpc_vertex), - "vertex creation", gpc_vertex); - - v= result->contour[c].num_vertices - 1; - for (vtx= poly->proxy->v[LEFT]; vtx; vtx= nv) - { - nv= vtx->next; - result->contour[c].vertex[v].x= vtx->x; - result->contour[c].vertex[v].y= vtx->y; - FREE(vtx); - v--; - } - c++; - } - FREE(poly); - } - } - else - { - for (poly= out_poly; poly; poly= npoly) - { - npoly= poly->next; - FREE(poly); - } - } - - /* Tidy up */ - reset_it(&it); - reset_lmt(&lmt); - FREE(c_heap); - FREE(s_heap); - FREE(sbt); -} - - -void gpc_free_tristrip(gpc_tristrip *t) -{ - int s; - - for (s= 0; s < t->num_strips; s++) - FREE(t->strip[s].vertex); - FREE(t->strip); - t->num_strips= 0; -} - - -void gpc_polygon_to_tristrip(gpc_polygon *s, gpc_tristrip *t) -{ - gpc_polygon c; - - c.num_contours= 0; - c.hole= NULL; - c.contour= NULL; - gpc_tristrip_clip(GPC_DIFF, s, &c, t); -} - - -void gpc_tristrip_clip(gpc_op op, gpc_polygon *subj, gpc_polygon *clip, - gpc_tristrip *result) -{ - sb_tree *sbtree= NULL; - it_node *it= NULL, *intersect; - edge_node *edge, *prev_edge, *next_edge, *succ_edge, *e0, *e1; - edge_node *aet= NULL, *c_heap= NULL, *s_heap= NULL, *cf; - lmt_node *lmt= NULL, *local_min; - polygon_node *tlist= NULL, *tn, *tnn, *p, *q; - vertex_node *lt, *ltn, *rt, *rtn; - h_state horiz[2]; - vertex_type cft; - int in[2], exists[2], parity[2]= {LEFT, LEFT}; - int s, v, contributing, search, scanbeam= 0, sbt_entries= 0; - int vclass, bl, br, tl, tr; - double *sbt= NULL, xb, px, nx, yb, yt, dy, ix, iy; - - /* Test for trivial NULL result cases */ - if (((subj->num_contours == 0) && (clip->num_contours == 0)) - || ((subj->num_contours == 0) && ((op == GPC_INT) || (op == GPC_DIFF))) - || ((clip->num_contours == 0) && (op == GPC_INT))) - { - result->num_strips= 0; - result->strip= NULL; - return; - } - - /* Identify potentialy contributing contours */ - if (((op == GPC_INT) || (op == GPC_DIFF)) - && (subj->num_contours > 0) && (clip->num_contours > 0)) - minimax_test(subj, clip, op); - - /* Build LMT */ - if (subj->num_contours > 0) - s_heap= build_lmt(&lmt, &sbtree, &sbt_entries, subj, SUBJ, op); - if (clip->num_contours > 0) - c_heap= build_lmt(&lmt, &sbtree, &sbt_entries, clip, CLIP, op); - - /* Return a NULL result if no contours contribute */ - if (lmt == NULL) - { - result->num_strips= 0; - result->strip= NULL; - reset_lmt(&lmt); - FREE(s_heap); - FREE(c_heap); - return; - } - - /* Build scanbeam table from scanbeam tree */ - MALLOC(sbt, sbt_entries * sizeof(double), "sbt creation", double); - build_sbt(&scanbeam, sbt, sbtree); - scanbeam= 0; - free_sbtree(&sbtree); - - /* Invert clip polygon for difference operation */ - if (op == GPC_DIFF) - parity[CLIP]= RIGHT; - - local_min= lmt; - - /* Process each scanbeam */ - while (scanbeam < sbt_entries) - { - /* Set yb and yt to the bottom and top of the scanbeam */ - yb= sbt[scanbeam++]; - if (scanbeam < sbt_entries) - { - yt= sbt[scanbeam]; - dy= yt - yb; - } - - /* === SCANBEAM BOUNDARY PROCESSING ================================ */ - - /* If LMT node corresponding to yb exists */ - if (local_min) - { - if (local_min->y == yb) - { - /* Add edges starting at this local minimum to the AET */ - for (edge= local_min->first_bound; edge; edge= edge->next_bound) - add_edge_to_aet(&aet, edge, NULL); - - local_min= local_min->next; - } - } - - /* Set dummy previous x value */ - px= -DBL_MAX; - - /* Create bundles within AET */ - e0= aet; - e1= aet; - - /* Set up bundle fields of first edge */ - aet->bundle[ABOVE][ aet->type]= (aet->top.y != yb); - aet->bundle[ABOVE][!aet->type]= FALSE; - aet->bstate[ABOVE]= UNBUNDLED; - - for (next_edge= aet->next; next_edge; next_edge= next_edge->next) - { - /* Set up bundle fields of next edge */ - next_edge->bundle[ABOVE][ next_edge->type]= (next_edge->top.y != yb); - next_edge->bundle[ABOVE][!next_edge->type]= FALSE; - next_edge->bstate[ABOVE]= UNBUNDLED; - - /* Bundle edges above the scanbeam boundary if they coincide */ - if (next_edge->bundle[ABOVE][next_edge->type]) - { - if (EQ(e0->xb, next_edge->xb) && EQ(e0->dx, next_edge->dx) - && (e0->top.y != yb)) - { - next_edge->bundle[ABOVE][ next_edge->type]^= - e0->bundle[ABOVE][ next_edge->type]; - next_edge->bundle[ABOVE][!next_edge->type]= - e0->bundle[ABOVE][!next_edge->type]; - next_edge->bstate[ABOVE]= BUNDLE_HEAD; - e0->bundle[ABOVE][CLIP]= FALSE; - e0->bundle[ABOVE][SUBJ]= FALSE; - e0->bstate[ABOVE]= BUNDLE_TAIL; - } - e0= next_edge; - } - } - - horiz[CLIP]= NH; - horiz[SUBJ]= NH; - - /* Process each edge at this scanbeam boundary */ - for (edge= aet; edge; edge= edge->next) - { - exists[CLIP]= edge->bundle[ABOVE][CLIP] + - (edge->bundle[BELOW][CLIP] << 1); - exists[SUBJ]= edge->bundle[ABOVE][SUBJ] + - (edge->bundle[BELOW][SUBJ] << 1); - - if (exists[CLIP] || exists[SUBJ]) - { - /* Set bundle side */ - edge->bside[CLIP]= parity[CLIP]; - edge->bside[SUBJ]= parity[SUBJ]; - - /* Determine contributing status and quadrant occupancies */ - switch (op) - { - case GPC_DIFF: - case GPC_INT: - contributing= (exists[CLIP] && (parity[SUBJ] || horiz[SUBJ])) - || (exists[SUBJ] && (parity[CLIP] || horiz[CLIP])) - || (exists[CLIP] && exists[SUBJ] - && (parity[CLIP] == parity[SUBJ])); - br= (parity[CLIP]) - && (parity[SUBJ]); - bl= (parity[CLIP] ^ edge->bundle[ABOVE][CLIP]) - && (parity[SUBJ] ^ edge->bundle[ABOVE][SUBJ]); - tr= (parity[CLIP] ^ (horiz[CLIP]!=NH)) - && (parity[SUBJ] ^ (horiz[SUBJ]!=NH)); - tl= (parity[CLIP] ^ (horiz[CLIP]!=NH) ^ edge->bundle[BELOW][CLIP]) - && (parity[SUBJ] ^ (horiz[SUBJ]!=NH) ^ edge->bundle[BELOW][SUBJ]); - break; - case GPC_XOR: - contributing= exists[CLIP] || exists[SUBJ]; - br= (parity[CLIP]) - ^ (parity[SUBJ]); - bl= (parity[CLIP] ^ edge->bundle[ABOVE][CLIP]) - ^ (parity[SUBJ] ^ edge->bundle[ABOVE][SUBJ]); - tr= (parity[CLIP] ^ (horiz[CLIP]!=NH)) - ^ (parity[SUBJ] ^ (horiz[SUBJ]!=NH)); - tl= (parity[CLIP] ^ (horiz[CLIP]!=NH) ^ edge->bundle[BELOW][CLIP]) - ^ (parity[SUBJ] ^ (horiz[SUBJ]!=NH) ^ edge->bundle[BELOW][SUBJ]); - break; - case GPC_UNION: - contributing= (exists[CLIP] && (!parity[SUBJ] || horiz[SUBJ])) - || (exists[SUBJ] && (!parity[CLIP] || horiz[CLIP])) - || (exists[CLIP] && exists[SUBJ] - && (parity[CLIP] == parity[SUBJ])); - br= (parity[CLIP]) - || (parity[SUBJ]); - bl= (parity[CLIP] ^ edge->bundle[ABOVE][CLIP]) - || (parity[SUBJ] ^ edge->bundle[ABOVE][SUBJ]); - tr= (parity[CLIP] ^ (horiz[CLIP]!=NH)) - || (parity[SUBJ] ^ (horiz[SUBJ]!=NH)); - tl= (parity[CLIP] ^ (horiz[CLIP]!=NH) ^ edge->bundle[BELOW][CLIP]) - || (parity[SUBJ] ^ (horiz[SUBJ]!=NH) ^ edge->bundle[BELOW][SUBJ]); - break; - } - - /* Update parity */ - parity[CLIP]^= edge->bundle[ABOVE][CLIP]; - parity[SUBJ]^= edge->bundle[ABOVE][SUBJ]; - - /* Update horizontal state */ - if (exists[CLIP]) - horiz[CLIP]= - next_h_state[horiz[CLIP]] - [((exists[CLIP] - 1) << 1) + parity[CLIP]]; - if (exists[SUBJ]) - horiz[SUBJ]= - next_h_state[horiz[SUBJ]] - [((exists[SUBJ] - 1) << 1) + parity[SUBJ]]; - - vclass= tr + (tl << 1) + (br << 2) + (bl << 3); - - if (contributing) - { - xb= edge->xb; - - switch (vclass) - { - case EMN: - new_tristrip(&tlist, edge, xb, yb); - cf= edge; - break; - case ERI: - edge->outp[ABOVE]= cf->outp[ABOVE]; - if (xb != cf->xb) - VERTEX(edge, ABOVE, RIGHT, xb, yb); - cf= NULL; - break; - case ELI: - VERTEX(edge, BELOW, LEFT, xb, yb); - edge->outp[ABOVE]= NULL; - cf= edge; - break; - case EMX: - if (xb != cf->xb) - VERTEX(edge, BELOW, RIGHT, xb, yb); - edge->outp[ABOVE]= NULL; - cf= NULL; - break; - case IMN: - if (cft == LED) - { - if (cf->bot.y != yb) - VERTEX(cf, BELOW, LEFT, cf->xb, yb); - new_tristrip(&tlist, cf, cf->xb, yb); - } - edge->outp[ABOVE]= cf->outp[ABOVE]; - VERTEX(edge, ABOVE, RIGHT, xb, yb); - break; - case ILI: - new_tristrip(&tlist, edge, xb, yb); - cf= edge; - cft= ILI; - break; - case IRI: - if (cft == LED) - { - if (cf->bot.y != yb) - VERTEX(cf, BELOW, LEFT, cf->xb, yb); - new_tristrip(&tlist, cf, cf->xb, yb); - } - VERTEX(edge, BELOW, RIGHT, xb, yb); - edge->outp[ABOVE]= NULL; - break; - case IMX: - VERTEX(edge, BELOW, LEFT, xb, yb); - edge->outp[ABOVE]= NULL; - cft= IMX; - break; - case IMM: - VERTEX(edge, BELOW, LEFT, xb, yb); - edge->outp[ABOVE]= cf->outp[ABOVE]; - if (xb != cf->xb) - VERTEX(cf, ABOVE, RIGHT, xb, yb); - cf= edge; - break; - case EMM: - VERTEX(edge, BELOW, RIGHT, xb, yb); - edge->outp[ABOVE]= NULL; - new_tristrip(&tlist, edge, xb, yb); - cf= edge; - break; - case LED: - if (edge->bot.y == yb) - VERTEX(edge, BELOW, LEFT, xb, yb); - edge->outp[ABOVE]= edge->outp[BELOW]; - cf= edge; - cft= LED; - break; - case RED: - edge->outp[ABOVE]= cf->outp[ABOVE]; - if (cft == LED) - { - if (cf->bot.y == yb) - { - VERTEX(edge, BELOW, RIGHT, xb, yb); - } - else - { - if (edge->bot.y == yb) - { - VERTEX(cf, BELOW, LEFT, cf->xb, yb); - VERTEX(edge, BELOW, RIGHT, xb, yb); - } - } - } - else - { - VERTEX(edge, BELOW, RIGHT, xb, yb); - VERTEX(edge, ABOVE, RIGHT, xb, yb); - } - cf= NULL; - break; - default: - break; - } /* End of switch */ - } /* End of contributing conditional */ - } /* End of edge exists conditional */ - } /* End of AET loop */ - - /* Delete terminating edges from the AET, otherwise compute xt */ - for (edge= aet; edge; edge= edge->next) - { - if (edge->top.y == yb) - { - prev_edge= edge->prev; - next_edge= edge->next; - if (prev_edge) - prev_edge->next= next_edge; - else - aet= next_edge; - if (next_edge) - next_edge->prev= prev_edge; - - /* Copy bundle head state to the adjacent tail edge if required */ - if ((edge->bstate[BELOW] == BUNDLE_HEAD) && prev_edge) - { - if (prev_edge->bstate[BELOW] == BUNDLE_TAIL) - { - prev_edge->outp[BELOW]= edge->outp[BELOW]; - prev_edge->bstate[BELOW]= UNBUNDLED; - if (prev_edge->prev) - if (prev_edge->prev->bstate[BELOW] == BUNDLE_TAIL) - prev_edge->bstate[BELOW]= BUNDLE_HEAD; - } - } - } - else - { - if (edge->top.y == yt) - edge->xt= edge->top.x; - else - edge->xt= edge->bot.x + edge->dx * (yt - edge->bot.y); - } - } - - if (scanbeam < sbt_entries) - { - /* === SCANBEAM INTERIOR PROCESSING ============================== */ - - build_intersection_table(&it, aet, dy); - - /* Process each node in the intersection table */ - for (intersect= it; intersect; intersect= intersect->next) - { - e0= intersect->ie[0]; - e1= intersect->ie[1]; - - /* Only generate output for contributing intersections */ - if ((e0->bundle[ABOVE][CLIP] || e0->bundle[ABOVE][SUBJ]) - && (e1->bundle[ABOVE][CLIP] || e1->bundle[ABOVE][SUBJ])) - { - p= e0->outp[ABOVE]; - q= e1->outp[ABOVE]; - ix= intersect->point.x; - iy= intersect->point.y + yb; - - in[CLIP]= ( e0->bundle[ABOVE][CLIP] && !e0->bside[CLIP]) - || ( e1->bundle[ABOVE][CLIP] && e1->bside[CLIP]) - || (!e0->bundle[ABOVE][CLIP] && !e1->bundle[ABOVE][CLIP] - && e0->bside[CLIP] && e1->bside[CLIP]); - in[SUBJ]= ( e0->bundle[ABOVE][SUBJ] && !e0->bside[SUBJ]) - || ( e1->bundle[ABOVE][SUBJ] && e1->bside[SUBJ]) - || (!e0->bundle[ABOVE][SUBJ] && !e1->bundle[ABOVE][SUBJ] - && e0->bside[SUBJ] && e1->bside[SUBJ]); - - /* Determine quadrant occupancies */ - switch (op) - { - case GPC_DIFF: - case GPC_INT: - tr= (in[CLIP]) - && (in[SUBJ]); - tl= (in[CLIP] ^ e1->bundle[ABOVE][CLIP]) - && (in[SUBJ] ^ e1->bundle[ABOVE][SUBJ]); - br= (in[CLIP] ^ e0->bundle[ABOVE][CLIP]) - && (in[SUBJ] ^ e0->bundle[ABOVE][SUBJ]); - bl= (in[CLIP] ^ e1->bundle[ABOVE][CLIP] ^ e0->bundle[ABOVE][CLIP]) - && (in[SUBJ] ^ e1->bundle[ABOVE][SUBJ] ^ e0->bundle[ABOVE][SUBJ]); - break; - case GPC_XOR: - tr= (in[CLIP]) - ^ (in[SUBJ]); - tl= (in[CLIP] ^ e1->bundle[ABOVE][CLIP]) - ^ (in[SUBJ] ^ e1->bundle[ABOVE][SUBJ]); - br= (in[CLIP] ^ e0->bundle[ABOVE][CLIP]) - ^ (in[SUBJ] ^ e0->bundle[ABOVE][SUBJ]); - bl= (in[CLIP] ^ e1->bundle[ABOVE][CLIP] ^ e0->bundle[ABOVE][CLIP]) - ^ (in[SUBJ] ^ e1->bundle[ABOVE][SUBJ] ^ e0->bundle[ABOVE][SUBJ]); - break; - case GPC_UNION: - tr= (in[CLIP]) - || (in[SUBJ]); - tl= (in[CLIP] ^ e1->bundle[ABOVE][CLIP]) - || (in[SUBJ] ^ e1->bundle[ABOVE][SUBJ]); - br= (in[CLIP] ^ e0->bundle[ABOVE][CLIP]) - || (in[SUBJ] ^ e0->bundle[ABOVE][SUBJ]); - bl= (in[CLIP] ^ e1->bundle[ABOVE][CLIP] ^ e0->bundle[ABOVE][CLIP]) - || (in[SUBJ] ^ e1->bundle[ABOVE][SUBJ] ^ e0->bundle[ABOVE][SUBJ]); - break; - } - - vclass= tr + (tl << 1) + (br << 2) + (bl << 3); - - switch (vclass) - { - case EMN: - new_tristrip(&tlist, e1, ix, iy); - e0->outp[ABOVE]= e1->outp[ABOVE]; - break; - case ERI: - if (p) - { - P_EDGE(prev_edge, e0, ABOVE, px, iy); - VERTEX(prev_edge, ABOVE, LEFT, px, iy); - VERTEX(e0, ABOVE, RIGHT, ix, iy); - e1->outp[ABOVE]= e0->outp[ABOVE]; - e0->outp[ABOVE]= NULL; - } - break; - case ELI: - if (q) - { - N_EDGE(next_edge, e1, ABOVE, nx, iy); - VERTEX(e1, ABOVE, LEFT, ix, iy); - VERTEX(next_edge, ABOVE, RIGHT, nx, iy); - e0->outp[ABOVE]= e1->outp[ABOVE]; - e1->outp[ABOVE]= NULL; - } - break; - case EMX: - if (p && q) - { - VERTEX(e0, ABOVE, LEFT, ix, iy); - e0->outp[ABOVE]= NULL; - e1->outp[ABOVE]= NULL; - } - break; - case IMN: - P_EDGE(prev_edge, e0, ABOVE, px, iy); - VERTEX(prev_edge, ABOVE, LEFT, px, iy); - N_EDGE(next_edge, e1, ABOVE, nx, iy); - VERTEX(next_edge, ABOVE, RIGHT, nx, iy); - new_tristrip(&tlist, prev_edge, px, iy); - e1->outp[ABOVE]= prev_edge->outp[ABOVE]; - VERTEX(e1, ABOVE, RIGHT, ix, iy); - new_tristrip(&tlist, e0, ix, iy); - next_edge->outp[ABOVE]= e0->outp[ABOVE]; - VERTEX(next_edge, ABOVE, RIGHT, nx, iy); - break; - case ILI: - if (p) - { - VERTEX(e0, ABOVE, LEFT, ix, iy); - N_EDGE(next_edge, e1, ABOVE, nx, iy); - VERTEX(next_edge, ABOVE, RIGHT, nx, iy); - e1->outp[ABOVE]= e0->outp[ABOVE]; - e0->outp[ABOVE]= NULL; - } - break; - case IRI: - if (q) - { - VERTEX(e1, ABOVE, RIGHT, ix, iy); - P_EDGE(prev_edge, e0, ABOVE, px, iy); - VERTEX(prev_edge, ABOVE, LEFT, px, iy); - e0->outp[ABOVE]= e1->outp[ABOVE]; - e1->outp[ABOVE]= NULL; - } - break; - case IMX: - if (p && q) - { - VERTEX(e0, ABOVE, RIGHT, ix, iy); - VERTEX(e1, ABOVE, LEFT, ix, iy); - e0->outp[ABOVE]= NULL; - e1->outp[ABOVE]= NULL; - P_EDGE(prev_edge, e0, ABOVE, px, iy); - VERTEX(prev_edge, ABOVE, LEFT, px, iy); - new_tristrip(&tlist, prev_edge, px, iy); - N_EDGE(next_edge, e1, ABOVE, nx, iy); - VERTEX(next_edge, ABOVE, RIGHT, nx, iy); - next_edge->outp[ABOVE]= prev_edge->outp[ABOVE]; - VERTEX(next_edge, ABOVE, RIGHT, nx, iy); - } - break; - case IMM: - if (p && q) - { - VERTEX(e0, ABOVE, RIGHT, ix, iy); - VERTEX(e1, ABOVE, LEFT, ix, iy); - P_EDGE(prev_edge, e0, ABOVE, px, iy); - VERTEX(prev_edge, ABOVE, LEFT, px, iy); - new_tristrip(&tlist, prev_edge, px, iy); - N_EDGE(next_edge, e1, ABOVE, nx, iy); - VERTEX(next_edge, ABOVE, RIGHT, nx, iy); - e1->outp[ABOVE]= prev_edge->outp[ABOVE]; - VERTEX(e1, ABOVE, RIGHT, ix, iy); - new_tristrip(&tlist, e0, ix, iy); - next_edge->outp[ABOVE]= e0->outp[ABOVE]; - VERTEX(next_edge, ABOVE, RIGHT, nx, iy); - } - break; - case EMM: - if (p && q) - { - VERTEX(e0, ABOVE, LEFT, ix, iy); - new_tristrip(&tlist, e1, ix, iy); - e0->outp[ABOVE]= e1->outp[ABOVE]; - } - break; - default: - break; - } /* End of switch */ - } /* End of contributing intersection conditional */ - - /* Swap bundle sides in response to edge crossing */ - if (e0->bundle[ABOVE][CLIP]) - e1->bside[CLIP]= !e1->bside[CLIP]; - if (e1->bundle[ABOVE][CLIP]) - e0->bside[CLIP]= !e0->bside[CLIP]; - if (e0->bundle[ABOVE][SUBJ]) - e1->bside[SUBJ]= !e1->bside[SUBJ]; - if (e1->bundle[ABOVE][SUBJ]) - e0->bside[SUBJ]= !e0->bside[SUBJ]; - - /* Swap e0 and e1 bundles in the AET */ - prev_edge= e0->prev; - next_edge= e1->next; - if (e1->next) - e1->next->prev= e0; - - if (e0->bstate[ABOVE] == BUNDLE_HEAD) - { - search= TRUE; - while (search) - { - prev_edge= prev_edge->prev; - if (prev_edge) - { - if (prev_edge->bundle[ABOVE][CLIP] - || prev_edge->bundle[ABOVE][SUBJ] - || (prev_edge->bstate[ABOVE] == BUNDLE_HEAD)) - search= FALSE; - } - else - search= FALSE; - } - } - if (!prev_edge) - { - e1->next= aet; - aet= e0->next; - } - else - { - e1->next= prev_edge->next; - prev_edge->next= e0->next; - } - e0->next->prev= prev_edge; - e1->next->prev= e1; - e0->next= next_edge; - } /* End of IT loop*/ - - /* Prepare for next scanbeam */ - for (edge= aet; edge; edge= next_edge) - { - next_edge= edge->next; - succ_edge= edge->succ; - - if ((edge->top.y == yt) && succ_edge) - { - /* Replace AET edge by its successor */ - succ_edge->outp[BELOW]= edge->outp[ABOVE]; - succ_edge->bstate[BELOW]= edge->bstate[ABOVE]; - succ_edge->bundle[BELOW][CLIP]= edge->bundle[ABOVE][CLIP]; - succ_edge->bundle[BELOW][SUBJ]= edge->bundle[ABOVE][SUBJ]; - prev_edge= edge->prev; - if (prev_edge) - prev_edge->next= succ_edge; - else - aet= succ_edge; - if (next_edge) - next_edge->prev= succ_edge; - succ_edge->prev= prev_edge; - succ_edge->next= next_edge; - } - else - { - /* Update this edge */ - edge->outp[BELOW]= edge->outp[ABOVE]; - edge->bstate[BELOW]= edge->bstate[ABOVE]; - edge->bundle[BELOW][CLIP]= edge->bundle[ABOVE][CLIP]; - edge->bundle[BELOW][SUBJ]= edge->bundle[ABOVE][SUBJ]; - edge->xb= edge->xt; - } - edge->outp[ABOVE]= NULL; - } - } - } /* === END OF SCANBEAM PROCESSING ================================== */ - - /* Generate result tristrip from tlist */ - result->strip= NULL; - result->num_strips= count_tristrips(tlist); - if (result->num_strips > 0) - { - MALLOC(result->strip, result->num_strips * sizeof(gpc_vertex_list), - "tristrip list creation", gpc_vertex_list); - - s= 0; - for (tn= tlist; tn; tn= tnn) - { - tnn= tn->next; - - if (tn->active > 2) - { - /* Valid tristrip: copy the vertices and free the heap */ - result->strip[s].num_vertices= tn->active; - MALLOC(result->strip[s].vertex, tn->active * sizeof(gpc_vertex), - "tristrip creation", gpc_vertex); - v= 0; - if (INVERT_TRISTRIPS) - { - lt= tn->v[RIGHT]; - rt= tn->v[LEFT]; - } - else - { - lt= tn->v[LEFT]; - rt= tn->v[RIGHT]; - } - while (lt || rt) - { - if (lt) - { - ltn= lt->next; - result->strip[s].vertex[v].x= lt->x; - result->strip[s].vertex[v].y= lt->y; - v++; - FREE(lt); - lt= ltn; - } - if (rt) - { - rtn= rt->next; - result->strip[s].vertex[v].x= rt->x; - result->strip[s].vertex[v].y= rt->y; - v++; - FREE(rt); - rt= rtn; - } - } - s++; - } - else - { - /* Invalid tristrip: just free the heap */ - for (lt= tn->v[LEFT]; lt; lt= ltn) - { - ltn= lt->next; - FREE(lt); - } - for (rt= tn->v[RIGHT]; rt; rt=rtn) - { - rtn= rt->next; - FREE(rt); - } - } - FREE(tn); - } - } - - /* Tidy up */ - reset_it(&it); - reset_lmt(&lmt); - FREE(c_heap); - FREE(s_heap); - FREE(sbt); -} - -/* -=========================================================================== - End of file: gpc.c -=========================================================================== -*/ diff --git a/uppdev/agg24/gpc.h b/uppdev/agg24/gpc.h deleted file mode 100644 index ff00f7b6c..000000000 --- a/uppdev/agg24/gpc.h +++ /dev/null @@ -1,133 +0,0 @@ -/* -=========================================================================== - -Project: Generic Polygon Clipper - - A new algorithm for calculating the difference, intersection, - exclusive-or or union of arbitrary polygon sets. - -File: gpc.h -Author: Alan Murta (email: gpc@cs.man.ac.uk) -Version: 2.32 -Date: 17th December 2004 - -Copyright: (C) 1997-2004, Advanced Interfaces Group, - University of Manchester. - - This software is free for non-commercial use. It may be copied, - modified, and redistributed provided that this copyright notice - is preserved on all copies. The intellectual property rights of - the algorithms used reside with the University of Manchester - Advanced Interfaces Group. - - You may not use this software, in whole or in part, in support - of any commercial product without the express consent of the - author. - - There is no warranty or other guarantee of fitness of this - software for any purpose. It is provided solely "as is". - -=========================================================================== -*/ - -#ifndef __gpc_h -#define __gpc_h - -#include - - -/* -=========================================================================== - Constants -=========================================================================== -*/ - -/* Increase GPC_EPSILON to encourage merging of near coincident edges */ - -#define GPC_EPSILON (DBL_EPSILON) - -#define GPC_VERSION "2.32" - - -/* -=========================================================================== - Public Data Types -=========================================================================== -*/ - -typedef enum /* Set operation type */ -{ - GPC_DIFF, /* Difference */ - GPC_INT, /* Intersection */ - GPC_XOR, /* Exclusive or */ - GPC_UNION /* Union */ -} gpc_op; - -typedef struct /* Polygon vertex structure */ -{ - double x; /* Vertex x component */ - double y; /* vertex y component */ -} gpc_vertex; - -typedef struct /* Vertex list structure */ -{ - int num_vertices; /* Number of vertices in list */ - gpc_vertex *vertex; /* Vertex array pointer */ -} gpc_vertex_list; - -typedef struct /* Polygon set structure */ -{ - int num_contours; /* Number of contours in polygon */ - int *hole; /* Hole / external contour flags */ - gpc_vertex_list *contour; /* Contour array pointer */ -} gpc_polygon; - -typedef struct /* Tristrip set structure */ -{ - int num_strips; /* Number of tristrips */ - gpc_vertex_list *strip; /* Tristrip array pointer */ -} gpc_tristrip; - - -/* -=========================================================================== - Public Function Prototypes -=========================================================================== -*/ - -void gpc_read_polygon (FILE *infile_ptr, - int read_hole_flags, - gpc_polygon *polygon); - -void gpc_write_polygon (FILE *outfile_ptr, - int write_hole_flags, - gpc_polygon *polygon); - -void gpc_add_contour (gpc_polygon *polygon, - gpc_vertex_list *contour, - int hole); - -void gpc_polygon_clip (gpc_op set_operation, - gpc_polygon *subject_polygon, - gpc_polygon *clip_polygon, - gpc_polygon *result_polygon); - -void gpc_tristrip_clip (gpc_op set_operation, - gpc_polygon *subject_polygon, - gpc_polygon *clip_polygon, - gpc_tristrip *result_tristrip); - -void gpc_polygon_to_tristrip (gpc_polygon *polygon, - gpc_tristrip *tristrip); - -void gpc_free_polygon (gpc_polygon *polygon); - -void gpc_free_tristrip (gpc_tristrip *tristrip); - -#endif - -/* -=========================================================================== - End of file: gpc.h -=========================================================================== -*/ diff --git a/uppdev/agg24/init b/uppdev/agg24/init deleted file mode 100644 index a85af586e..000000000 --- a/uppdev/agg24/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _agg24_icpp_init_stub -#define _agg24_icpp_init_stub -#include "Core/init" -#endif diff --git a/uppdev/agg_upp_bind/AggCtrl.cpp b/uppdev/agg_upp_bind/AggCtrl.cpp deleted file mode 100644 index febba51a8..000000000 --- a/uppdev/agg_upp_bind/AggCtrl.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include "agg_upp_bind.h" - -//NAMESPACE_UPP - -AggCtrl::AggCtrl() -{ -} - -//END_UPP_NAMESPACE diff --git a/uppdev/agg_upp_bind/AggCtrl.h b/uppdev/agg_upp_bind/AggCtrl.h deleted file mode 100644 index b4ccd3b0a..000000000 --- a/uppdev/agg_upp_bind/AggCtrl.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef _agg_upp_bind_AggCtrl_h_ -#define _agg_upp_bind_AggCtrl_h_ - -#include "agg_upp_bind.h" - -class AggCtrl : public ParentCtrl { - ImageBuffer uibuf; -public: - - typedef AggCtrl CLASSNAME; - AggCtrl(); - ~AggCtrl() {;} -}; - -#endif diff --git a/uppdev/agg_upp_bind/AggDrawer.cpp b/uppdev/agg_upp_bind/AggDrawer.cpp deleted file mode 100644 index 0588f9a8a..000000000 --- a/uppdev/agg_upp_bind/AggDrawer.cpp +++ /dev/null @@ -1,77 +0,0 @@ -#include "agg_upp_bind.h" - -NAMESPACE_UPP -//typedef agg::renderer_base renderer_base; -//typedef agg::renderer_scanline_aa_solid renderer_solid; - -void AggDrawer::DrawLine(int x1, int y1, int x2, int y2, int width) -{ -// m_renb.clip_box( m_clipboxdev.x, m_clipboxdev.y, m_clipboxdev.x + m_clipboxdev.width, m_clipboxdev.y + m_clipboxdev.height); - - agg::path_storage path; - path.move_to(x1, y1); - path.line_to(x2, y2); - - agg::conv_stroke stroke(path); -// stroke.line_join(); -// stroke.line_cap(); - stroke.line_cap(agg::round_cap); - //stroke.miter_limit(); - stroke.width(width); - m_ras.add_path(stroke); - -// RenderScanlines(); // at the end or after all same color? -} - -//void AggDrawer::DrawLine(Point p1, Point p2, color_type ct) -//{ -// m_ren.col -//agg::ellipse e1; -//} - -void AggDrawer::DrawEllipse(int x1, int y1, int cx, int cy, int width) -{ - agg::ellipse el; -// el.init(double x double y double rx double ry unsigned num_steps=0 bool cw=false); - el.init(x1, y1, cx, cy); - - agg::conv_stroke stroke(el); - - stroke.width(width); - m_ras.add_path(stroke); - -// agg::conv_transform tr(ellipse, mtx); -// m_ras.add_path(tr); -// ren.color( color ); - -// typedef agg::wrap_mode_reflect_auto_pow2 wrap_x_type; -// typedef agg::wrap_mode_reflect_auto_pow2 wrap_y_type; -// typedef agg::span_pattern_rgb span_gen_type; -// typedef agg::renderer_scanline_aa renderer_type; - -// agg::span_allocator sa; -// span_gen_type sg(sa, m_pattern_rbuf, offset_x, offset_y); -// sg.alpha(span_gen_type::value_type(m_FillOpacity)); -// renderer_type rp(renb, sg); -// agg::render_scanlines(m_ras, m_sl, rp); -// agg::render_scanlines_aa_solid(m_ras, m_sl, m_ren, agg::rgba(1,1,0.5) ); -} - -void AggDrawer::RenderScanlines() -{ -// m_ras.filling_rule(filling_rule_e filling_rule); - agg::render_scanlines(m_ras, m_sl, m_ren); -// agg::render_scanlines_aa_solid(m_ras, m_sl, m_ren, agg::rgba(1,1,0.5) ); -} - - -void AggDrawer::AttachBuffers() //or better name - ConnectPipelineBuffers? -{ - m_rbuf.attach((agg::int8u *)uibuf[0], sz.cx, sz.cy, sz.cx*4); - m_pixf.attach(m_rbuf); - m_renb.attach(m_pixf); //ren_base - m_ren.attach(m_renb); -} - - -END_UPP_NAMESPACE diff --git a/uppdev/agg_upp_bind/AggDrawer.h b/uppdev/agg_upp_bind/AggDrawer.h deleted file mode 100644 index cd75bf411..000000000 --- a/uppdev/agg_upp_bind/AggDrawer.h +++ /dev/null @@ -1,41 +0,0 @@ -//#ifndef _agg_upp_bind_AggDrawer_h_ -//#define _agg_upp_bind_AggDrawer_h_ - -//from DrawingDraw? -//#include "agg_upp_bind.h" - -class AggDrawer { -private: - typedef agg::renderer_base renderer_base; - typedef agg::renderer_scanline_aa_solid renderer_solid; - - Rect m_r; - Size sz; - ImagBuffer uibuf; - agg::rendering_buffer m_rbuf; - - agg::rasterizer_scanline_aa<> m_ras; - agg::scanline_p8 m_sl; - renderer_base m_renb; //renderer base - renderer_solid m_ren; //(renb); // - agg::pixfmt_bgra32 m_pixf; - - void AttachBuffers(); -public: - void DrawLine(int x1, int y1, int x2, int y2, int width = 0); - void DrawEllipse(int x1, int y1, int cx, int cy, int width); - - void SetBackground(const agg::rgba8& ct) { m_renb.clear(ct); } - void SetBrushColor(const agg::rgba8& ct) { m_ren.color(ct); } - - void RenderScanlines(); - - void End(Draw& w, bool norr=false) { RenderScanlines(); uibuf.Rectangalize(w, norr); uibuf.Clear(); } - -// AggDrawer(Draw& w, const Rect& r) { m_w=w; m_r=r; sz=r.GetSize(); uibuf.Create(sz); AttachBuffers(); } - AggDrawer(const Rect& r) { m_r=r; sz=r.GetSize(); uibuf.Create(sz); AttachBuffers(); } - -//virtual ~AggDrawer() { uibuf.Rectangalize(m_w, true); uibuf.Clear(); } -}; - -//#endif diff --git a/uppdev/agg_upp_bind/ImagBuffer.cpp b/uppdev/agg_upp_bind/ImagBuffer.cpp deleted file mode 100644 index 763e3b973..000000000 --- a/uppdev/agg_upp_bind/ImagBuffer.cpp +++ /dev/null @@ -1,214 +0,0 @@ -#include "agg_upp_bind.h" -//#include "ImagBuffer.h" - -NAMESPACE_UPP - -RGBA ImagBuffer::GetPixel(int x, int y) const -{ - const RGBA *p=this[0] + y*GetSize().cx + x; - return *p; -} - -void ImagBuffer::SetPixel(int x, int y, RGBA color) -{ - RGBA *p = this[0] + y*GetSize().cx + x; - *p=color; -} - - -void ImagBuffer::SetPixel(int x, int y, Color color, int alpha) -{ - RGBA ba; - ba.a = alpha; - ba.b = color.GetB(); - ba.r = color.GetR(); - ba.g = color.GetG(); - RGBA *p = this[0] + y*GetSize().cx + x; -// p+=y*GetSize().cx+x; - p->a=ba.a; - p->r=ba.r; - p->g=ba.g; - p->b=ba.b; -} - -bool ImagBuffer::IsEqualColumn(int x, int y, int height, RGBA rgba) -{ - RGBA *p = this[0] + (y+height-1)*GetSize().cx + x; - - while(height>0) { - if (*p!=rgba) { - return false; - } - p-=GetSize().cx; - --height; - } - return true; -} - -void ImagBuffer::SetLineV(int x, int y, int height, RGBA rgba) -{ - ASSERT(height>0); //don't make height <=0 !!! later change to out of bounds... - RGBA *p = this[0] + (y+height-1)*GetSize().cx + x; - while(height>0) { - *p=rgba; - p-=GetSize().cx; - --height; - } -} - -Image ImagBuffer::CreateCopy(int x, int y, int width, int height) -{ - ImageBuffer imgb(width,height); - RGBA *src = this[0] + y *GetSize().cx+ x; - int dy=0; - while(--height >= 0) { - memcpy(imgb[dy++] , src, width * sizeof(RGBA)); - src+=GetSize().cx; - } - return imgb; -} - - -void ImagBuffer::Rectangalize(Draw& w, bool norect) //showrect for DEBUG -{ - Size bsz=GetSize(); - int cx=bsz.cx; - int cy=bsz.cy; - - RGBA back=RGBA(Color(255,200,200)); //for background blending -// memset(uibuf, 255, cx * cy * 4); //!!!change or remove this for the background... - - -int x=0; -int y=0; - int band=1; -int yy = 0; - - while(yy < cy) { //going through each full horizontal 16 pix strip - int ccy = min(cy - yy, 16); -// Image m = imgA.InitRender(aggTriangle(m_x,m_y), 0, -yy, 600, ccy); //render some lines (rectangle of image) - int x2 = 0; - int x1 = 0; - int ximg1 = -1; - int ximg2 = -1; - RGBA c; - - while(x2 < cx) { //while inside a horizontal strip - going through each several times!!! - c = GetPixel(x1, yy); - - while(IsEqualColumn(x2, yy, ccy, c) && x2 < cx) { - ++x2; //end of a mono-rectangle - } - - if( (x2 - x1 > 0) && (x2 - x1 <= 16) ) { //first small mono-rectangle - if( ximg2-ximg1 == 0 ) { - ximg1=x1; //start the very first small mono-rectangle as image series - } - ximg2=x2; - } - - else { - if( x2 - x1 > 16 ) { - if (ximg2-ximg1>0) { // Step1 draw as accumulated image - w.DrawImage( x + ximg1, y + yy, CreateCopy(ximg1, yy, ximg2 - ximg1, ccy) ); - ximg1=ximg2=-1; - } - //Step 2 draw mono-rectangle - - if (norect) { //if false - it paints only near the img, other area is 100 % transparent - // RGBA c1=back; - RGBA c1=c; -// AlphaBlend(&c1,&c, 1, Color(c.r, c.g, c.b)); //Aris FIXME - w.DrawRect(x + x1, y + yy, x2 - x1, ccy, - Color(c1.r, c1.g, c1.b)); //Mirek's old TODO - Color RGBA conversion? - } - } - } - - x1 = x2; //x counter forward because we processed the solid part - - //below means pure image - while(!IsEqualColumn( x2, yy, ccy, GetPixel(x2, yy)) && x2 < cx) - x2++; - - if( x2 - x1 > 0) { //piece of image found - if ( ximg2-ximg1 == 0 ) { - ximg1 = x1; - } - ximg2 = x2; - x1 = x2; //x counter forward - } - - } //end of a strip - - if (ximg2-ximg1>0) { //after the end of strip paint the image - w.DrawImage( x + ximg1, y + yy, CreateCopy(ximg1, yy, ximg2 - ximg1, ccy)); - } - - yy += ccy; //next strip -// if (yy>=8) break; - } //end of all strips - -} - -#if 0 - typedef agg::pixfmt_bgra32 pixfmt; - typedef agg::renderer_base renderer_base; - typedef agg::renderer_scanline_aa_solid renderer_solid; - agg::rendering_buffer rbuf; - - // sz-=50; - uibuf.Create(sz); //aris002 - rbuf.attach((agg::int8u *)uibuf[0], sz.cx, sz.cy, sz.cx*4); //THIS IS THE MAIN agg and upp CONNECTION!!! - pixfmt pixf(rbuf); - - renderer_base rb(pixf); - renderer_solid ren(rb); - - rb.clear(agg::rgba(1,0.8,0.8)); - - agg::rasterizer_scanline_aa<> ras; - agg::scanline_p8 sl; - agg::trans_affine mtx; - - -// mtx *= agg::trans_affine_translation(-g_base_dx, -g_base_dy); -// mtx *= agg::trans_affine_scaling(g_scale, g_scale); -// mtx *= agg::trans_affine_rotation(g_angle + agg::pi); -// mtx *= agg::trans_affine_skewing(g_skew_x/1000.0, g_skew_y/1000.0); -// mtx *= agg::trans_affine_translation(sz.cx/2, sz.cy/2); - mtx *= agg::trans_affine_translation(300, 0); - mtx *= agg::trans_affine_rotation(agg::deg2rad(time.second*6)); -// mtx *= agg::trans_affine_translation(300, -sz.cy/2); - - - // This code renders the lion: - // agg::conv_transform trans(g_path, mtx); - // agg::render_all_paths(g_rasterizer, g_scanline, r, trans, g_colors, g_path_idx, g_npaths); - - - m_path.render(ras, sl, ren, mtx, rb.clip_box(), 1.0); - // double tm; // = elapsed_time(); - unsigned vertex_count = m_path.vertex_count(); - // m_path.bounding_rect(double* x1 double* y1 double* x2 double* y2) - - String txt; - agg::gsv_text t; - t.size(12.0); - t.flip(true); - - agg::conv_stroke pt(t); - pt.width(1.5); - -// sprintf(buf, "Vertices=%d Time=%.3f ms", vertex_count, tm); - txt<<"Vertices="< -//#include "agg_upp_bind_test.h" -//#define AGG_RGBA32 -//#include - -using namespace Upp; - -struct Clock : TopWindow { -// ImagBuffer uibuf; -// agg::svg::path_renderer m_path; - - void PaintPtr(Draw& w, double pos, double m, int d, Color color, Size sz2) - { - w.DrawLine(sz2.cx, sz2.cy, - sz2.cx + int(m * sin(pos * 2 * M_PI) * sz2.cx), - sz2.cy - int(m * cos(pos * 2 * M_PI) * sz2.cy), - d, color); - } - - void PaintCenteredText(Draw& w, int x, int y, const char *text, Font fnt, Color c) - { - Size tsz = GetTextSize(text, fnt); - w.DrawText(x - tsz.cx / 2, y - tsz.cy / 2, text, fnt, c); - } - - virtual void Paint(Draw& w) - { - Size sz = GetSize(); - w.DrawRect(sz, SLtGray); - sz -= 6; - w.Offset(3, 3); - Size sz2 = sz / 2; - w.DrawEllipse(0, 0, sz.cx, sz.cy, SWhite, 3, SBlack); - - // Font fnt = Arial(min(sz.cx, sz.cy) / 10); - // for(int i = 1; i <= 12; i++) { - // int d = i % 3 == 0 ? 3 : 2; - // PaintCenteredText(w, sz2.cx + int(0.8 * sin(i * M_PI / 6) * sz2.cx), - // sz2.cy - int(0.8 * cos(i * M_PI / 6) * sz2.cy), - // AsString(i), i % 3 ? fnt : fnt().Bold(), SBlack); - // } - Date date = GetSysDate(); - Time time = GetSysTime(); - // PaintCenteredText(w, sz.cx / 2, 3 * sz.cy / 5, GetLanguageInfo().FormatDate(date), - // fnt().Bold(), SLtBlue); - double tm = GetSysTime() - ToTime(date); - // PaintPtr(w, tm / 60, 0.75, 1, SRed, sz2); - // PaintPtr(w, tm / 3600, 0.6, 2, SCyan, sz2); - // PaintPtr(w, tm / 3600 / 12, 0.5, 4, SBlack, sz2); -// AggDrawer agd(w.GetClip()); -// agd.DrawLine(0,0,100,100,3, SBlue); -// agd.End(w); - w.End(); - } - - void Timer() - { - Refresh(); - } - - Clock() - { - - SetRect(0, 0, 600, 300); - Sizeable().Zoomable(); - BackPaint(); - SetTimeCallback(-1000, callback(this, &Clock::Timer)); - Title("Clock"); - } -}; - -GUI_APP_MAIN -{ - Clock().Run(); -} diff --git a/uppdev/aggdraw/agg_alpha_mask_u8.h b/uppdev/aggdraw/agg_alpha_mask_u8.h deleted file mode 100644 index 4a99a94e1..000000000 --- a/uppdev/aggdraw/agg_alpha_mask_u8.h +++ /dev/null @@ -1,505 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_ALPHA_MASK_U8_INCLUDED -#define AGG_ALPHA_MASK_U8_INCLUDED - -#include -#include "agg_basics.h" -#include "agg_rendering_buffer.h" - -namespace agg -{ - //===================================================one_component_mask_u8 - struct one_component_mask_u8 - { - static unsigned calculate(const int8u* p) { return *p; } - }; - - - //=====================================================rgb_to_gray_mask_u8 - template - struct rgb_to_gray_mask_u8 - { - static unsigned calculate(const int8u* p) - { - return (p[R]*77 + p[G]*150 + p[B]*29) >> 8; - } - }; - - //==========================================================alpha_mask_u8 - template - class alpha_mask_u8 - { - public: - typedef int8u cover_type; - typedef alpha_mask_u8 self_type; - enum cover_scale_e - { - cover_shift = 8, - cover_none = 0, - cover_full = 255 - }; - - alpha_mask_u8() : m_rbuf(0) {} - explicit alpha_mask_u8(rendering_buffer& rbuf) : m_rbuf(&rbuf) {} - - void attach(rendering_buffer& rbuf) { m_rbuf = &rbuf; } - - MaskF& mask_function() { return m_mask_function; } - const MaskF& mask_function() const { return m_mask_function; } - - - //-------------------------------------------------------------------- - cover_type pixel(int x, int y) const - { - if(x >= 0 && y >= 0 && - x < (int)m_rbuf->width() && - y < (int)m_rbuf->height()) - { - return (cover_type)m_mask_function.calculate( - m_rbuf->row_ptr(y) + x * Step + Offset); - } - return 0; - } - - //-------------------------------------------------------------------- - cover_type combine_pixel(int x, int y, cover_type val) const - { - if(x >= 0 && y >= 0 && - x < (int)m_rbuf->width() && - y < (int)m_rbuf->height()) - { - return (cover_type)((cover_full + val * - m_mask_function.calculate( - m_rbuf->row_ptr(y) + x * Step + Offset)) >> - cover_shift); - } - return 0; - } - - - //-------------------------------------------------------------------- - void fill_hspan(int x, int y, cover_type* dst, int num_pix) const - { - int xmax = m_rbuf->width() - 1; - int ymax = m_rbuf->height() - 1; - - int count = num_pix; - cover_type* covers = dst; - - if(y < 0 || y > ymax) - { - memset(dst, 0, num_pix * sizeof(cover_type)); - return; - } - - if(x < 0) - { - count += x; - if(count <= 0) - { - memset(dst, 0, num_pix * sizeof(cover_type)); - return; - } - memset(covers, 0, -x * sizeof(cover_type)); - covers -= x; - x = 0; - } - - if(x + count > xmax) - { - int rest = x + count - xmax - 1; - count -= rest; - if(count <= 0) - { - memset(dst, 0, num_pix * sizeof(cover_type)); - return; - } - memset(covers + count, 0, rest * sizeof(cover_type)); - } - - const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset; - do - { - *covers++ = (cover_type)m_mask_function.calculate(mask); - mask += Step; - } - while(--count); - } - - - //-------------------------------------------------------------------- - void combine_hspan(int x, int y, cover_type* dst, int num_pix) const - { - int xmax = m_rbuf->width() - 1; - int ymax = m_rbuf->height() - 1; - - int count = num_pix; - cover_type* covers = dst; - - if(y < 0 || y > ymax) - { - memset(dst, 0, num_pix * sizeof(cover_type)); - return; - } - - if(x < 0) - { - count += x; - if(count <= 0) - { - memset(dst, 0, num_pix * sizeof(cover_type)); - return; - } - memset(covers, 0, -x * sizeof(cover_type)); - covers -= x; - x = 0; - } - - if(x + count > xmax) - { - int rest = x + count - xmax - 1; - count -= rest; - if(count <= 0) - { - memset(dst, 0, num_pix * sizeof(cover_type)); - return; - } - memset(covers + count, 0, rest * sizeof(cover_type)); - } - - const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset; - do - { - *covers = (cover_type)((cover_full + (*covers) * - m_mask_function.calculate(mask)) >> - cover_shift); - ++covers; - mask += Step; - } - while(--count); - } - - //-------------------------------------------------------------------- - void fill_vspan(int x, int y, cover_type* dst, int num_pix) const - { - int xmax = m_rbuf->width() - 1; - int ymax = m_rbuf->height() - 1; - - int count = num_pix; - cover_type* covers = dst; - - if(x < 0 || x > xmax) - { - memset(dst, 0, num_pix * sizeof(cover_type)); - return; - } - - if(y < 0) - { - count += y; - if(count <= 0) - { - memset(dst, 0, num_pix * sizeof(cover_type)); - return; - } - memset(covers, 0, -y * sizeof(cover_type)); - covers -= y; - y = 0; - } - - if(y + count > ymax) - { - int rest = y + count - ymax - 1; - count -= rest; - if(count <= 0) - { - memset(dst, 0, num_pix * sizeof(cover_type)); - return; - } - memset(covers + count, 0, rest * sizeof(cover_type)); - } - - const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset; - do - { - *covers++ = (cover_type)m_mask_function.calculate(mask); - mask += m_rbuf->stride(); - } - while(--count); - } - - //-------------------------------------------------------------------- - void combine_vspan(int x, int y, cover_type* dst, int num_pix) const - { - int xmax = m_rbuf->width() - 1; - int ymax = m_rbuf->height() - 1; - - int count = num_pix; - cover_type* covers = dst; - - if(x < 0 || x > xmax) - { - memset(dst, 0, num_pix * sizeof(cover_type)); - return; - } - - if(y < 0) - { - count += y; - if(count <= 0) - { - memset(dst, 0, num_pix * sizeof(cover_type)); - return; - } - memset(covers, 0, -y * sizeof(cover_type)); - covers -= y; - y = 0; - } - - if(y + count > ymax) - { - int rest = y + count - ymax - 1; - count -= rest; - if(count <= 0) - { - memset(dst, 0, num_pix * sizeof(cover_type)); - return; - } - memset(covers + count, 0, rest * sizeof(cover_type)); - } - - const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset; - do - { - *covers = (cover_type)((cover_full + (*covers) * - m_mask_function.calculate(mask)) >> - cover_shift); - ++covers; - mask += m_rbuf->stride(); - } - while(--count); - } - - - private: - alpha_mask_u8(const self_type&); - const self_type& operator = (const self_type&); - - rendering_buffer* m_rbuf; - MaskF m_mask_function; - }; - - - typedef alpha_mask_u8<1, 0> alpha_mask_gray8; //----alpha_mask_gray8 - - typedef alpha_mask_u8<3, 0> alpha_mask_rgb24r; //----alpha_mask_rgb24r - typedef alpha_mask_u8<3, 1> alpha_mask_rgb24g; //----alpha_mask_rgb24g - typedef alpha_mask_u8<3, 2> alpha_mask_rgb24b; //----alpha_mask_rgb24b - - typedef alpha_mask_u8<3, 2> alpha_mask_bgr24r; //----alpha_mask_bgr24r - typedef alpha_mask_u8<3, 1> alpha_mask_bgr24g; //----alpha_mask_bgr24g - typedef alpha_mask_u8<3, 0> alpha_mask_bgr24b; //----alpha_mask_bgr24b - - typedef alpha_mask_u8<4, 0> alpha_mask_rgba32r; //----alpha_mask_rgba32r - typedef alpha_mask_u8<4, 1> alpha_mask_rgba32g; //----alpha_mask_rgba32g - typedef alpha_mask_u8<4, 2> alpha_mask_rgba32b; //----alpha_mask_rgba32b - typedef alpha_mask_u8<4, 3> alpha_mask_rgba32a; //----alpha_mask_rgba32a - - typedef alpha_mask_u8<4, 1> alpha_mask_argb32r; //----alpha_mask_argb32r - typedef alpha_mask_u8<4, 2> alpha_mask_argb32g; //----alpha_mask_argb32g - typedef alpha_mask_u8<4, 3> alpha_mask_argb32b; //----alpha_mask_argb32b - typedef alpha_mask_u8<4, 0> alpha_mask_argb32a; //----alpha_mask_argb32a - - typedef alpha_mask_u8<4, 2> alpha_mask_bgra32r; //----alpha_mask_bgra32r - typedef alpha_mask_u8<4, 1> alpha_mask_bgra32g; //----alpha_mask_bgra32g - typedef alpha_mask_u8<4, 0> alpha_mask_bgra32b; //----alpha_mask_bgra32b - typedef alpha_mask_u8<4, 3> alpha_mask_bgra32a; //----alpha_mask_bgra32a - - typedef alpha_mask_u8<4, 3> alpha_mask_abgr32r; //----alpha_mask_abgr32r - typedef alpha_mask_u8<4, 2> alpha_mask_abgr32g; //----alpha_mask_abgr32g - typedef alpha_mask_u8<4, 1> alpha_mask_abgr32b; //----alpha_mask_abgr32b - typedef alpha_mask_u8<4, 0> alpha_mask_abgr32a; //----alpha_mask_abgr32a - - typedef alpha_mask_u8<3, 0, rgb_to_gray_mask_u8<0, 1, 2> > alpha_mask_rgb24gray; //----alpha_mask_rgb24gray - typedef alpha_mask_u8<3, 0, rgb_to_gray_mask_u8<2, 1, 0> > alpha_mask_bgr24gray; //----alpha_mask_bgr24gray - typedef alpha_mask_u8<4, 0, rgb_to_gray_mask_u8<0, 1, 2> > alpha_mask_rgba32gray; //----alpha_mask_rgba32gray - typedef alpha_mask_u8<4, 1, rgb_to_gray_mask_u8<0, 1, 2> > alpha_mask_argb32gray; //----alpha_mask_argb32gray - typedef alpha_mask_u8<4, 0, rgb_to_gray_mask_u8<2, 1, 0> > alpha_mask_bgra32gray; //----alpha_mask_bgra32gray - typedef alpha_mask_u8<4, 1, rgb_to_gray_mask_u8<2, 1, 0> > alpha_mask_abgr32gray; //----alpha_mask_abgr32gray - - - - //==========================================================amask_no_clip_u8 - template - class amask_no_clip_u8 - { - public: - typedef int8u cover_type; - typedef amask_no_clip_u8 self_type; - enum cover_scale_e - { - cover_shift = 8, - cover_none = 0, - cover_full = 255 - }; - - amask_no_clip_u8() : m_rbuf(0) {} - explicit amask_no_clip_u8(rendering_buffer& rbuf) : m_rbuf(&rbuf) {} - - void attach(rendering_buffer& rbuf) { m_rbuf = &rbuf; } - - MaskF& mask_function() { return m_mask_function; } - const MaskF& mask_function() const { return m_mask_function; } - - - //-------------------------------------------------------------------- - cover_type pixel(int x, int y) const - { - return (cover_type)m_mask_function.calculate( - m_rbuf->row_ptr(y) + x * Step + Offset); - } - - - //-------------------------------------------------------------------- - cover_type combine_pixel(int x, int y, cover_type val) const - { - return (cover_type)((cover_full + val * - m_mask_function.calculate( - m_rbuf->row_ptr(y) + x * Step + Offset)) >> - cover_shift); - } - - - //-------------------------------------------------------------------- - void fill_hspan(int x, int y, cover_type* dst, int num_pix) const - { - const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset; - do - { - *dst++ = (cover_type)m_mask_function.calculate(mask); - mask += Step; - } - while(--num_pix); - } - - - - //-------------------------------------------------------------------- - void combine_hspan(int x, int y, cover_type* dst, int num_pix) const - { - const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset; - do - { - *dst = (cover_type)((cover_full + (*dst) * - m_mask_function.calculate(mask)) >> - cover_shift); - ++dst; - mask += Step; - } - while(--num_pix); - } - - - //-------------------------------------------------------------------- - void fill_vspan(int x, int y, cover_type* dst, int num_pix) const - { - const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset; - do - { - *dst++ = (cover_type)m_mask_function.calculate(mask); - mask += m_rbuf->stride(); - } - while(--num_pix); - } - - - //-------------------------------------------------------------------- - void combine_vspan(int x, int y, cover_type* dst, int num_pix) const - { - const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset; - do - { - *dst = (cover_type)((cover_full + (*dst) * - m_mask_function.calculate(mask)) >> - cover_shift); - ++dst; - mask += m_rbuf->stride(); - } - while(--num_pix); - } - - private: - amask_no_clip_u8(const self_type&); - const self_type& operator = (const self_type&); - - rendering_buffer* m_rbuf; - MaskF m_mask_function; - }; - - - typedef amask_no_clip_u8<1, 0> amask_no_clip_gray8; //----amask_no_clip_gray8 - - typedef amask_no_clip_u8<3, 0> amask_no_clip_rgb24r; //----amask_no_clip_rgb24r - typedef amask_no_clip_u8<3, 1> amask_no_clip_rgb24g; //----amask_no_clip_rgb24g - typedef amask_no_clip_u8<3, 2> amask_no_clip_rgb24b; //----amask_no_clip_rgb24b - - typedef amask_no_clip_u8<3, 2> amask_no_clip_bgr24r; //----amask_no_clip_bgr24r - typedef amask_no_clip_u8<3, 1> amask_no_clip_bgr24g; //----amask_no_clip_bgr24g - typedef amask_no_clip_u8<3, 0> amask_no_clip_bgr24b; //----amask_no_clip_bgr24b - - typedef amask_no_clip_u8<4, 0> amask_no_clip_rgba32r; //----amask_no_clip_rgba32r - typedef amask_no_clip_u8<4, 1> amask_no_clip_rgba32g; //----amask_no_clip_rgba32g - typedef amask_no_clip_u8<4, 2> amask_no_clip_rgba32b; //----amask_no_clip_rgba32b - typedef amask_no_clip_u8<4, 3> amask_no_clip_rgba32a; //----amask_no_clip_rgba32a - - typedef amask_no_clip_u8<4, 1> amask_no_clip_argb32r; //----amask_no_clip_argb32r - typedef amask_no_clip_u8<4, 2> amask_no_clip_argb32g; //----amask_no_clip_argb32g - typedef amask_no_clip_u8<4, 3> amask_no_clip_argb32b; //----amask_no_clip_argb32b - typedef amask_no_clip_u8<4, 0> amask_no_clip_argb32a; //----amask_no_clip_argb32a - - typedef amask_no_clip_u8<4, 2> amask_no_clip_bgra32r; //----amask_no_clip_bgra32r - typedef amask_no_clip_u8<4, 1> amask_no_clip_bgra32g; //----amask_no_clip_bgra32g - typedef amask_no_clip_u8<4, 0> amask_no_clip_bgra32b; //----amask_no_clip_bgra32b - typedef amask_no_clip_u8<4, 3> amask_no_clip_bgra32a; //----amask_no_clip_bgra32a - - typedef amask_no_clip_u8<4, 3> amask_no_clip_abgr32r; //----amask_no_clip_abgr32r - typedef amask_no_clip_u8<4, 2> amask_no_clip_abgr32g; //----amask_no_clip_abgr32g - typedef amask_no_clip_u8<4, 1> amask_no_clip_abgr32b; //----amask_no_clip_abgr32b - typedef amask_no_clip_u8<4, 0> amask_no_clip_abgr32a; //----amask_no_clip_abgr32a - - typedef amask_no_clip_u8<3, 0, rgb_to_gray_mask_u8<0, 1, 2> > amask_no_clip_rgb24gray; //----amask_no_clip_rgb24gray - typedef amask_no_clip_u8<3, 0, rgb_to_gray_mask_u8<2, 1, 0> > amask_no_clip_bgr24gray; //----amask_no_clip_bgr24gray - typedef amask_no_clip_u8<4, 0, rgb_to_gray_mask_u8<0, 1, 2> > amask_no_clip_rgba32gray; //----amask_no_clip_rgba32gray - typedef amask_no_clip_u8<4, 1, rgb_to_gray_mask_u8<0, 1, 2> > amask_no_clip_argb32gray; //----amask_no_clip_argb32gray - typedef amask_no_clip_u8<4, 0, rgb_to_gray_mask_u8<2, 1, 0> > amask_no_clip_bgra32gray; //----amask_no_clip_bgra32gray - typedef amask_no_clip_u8<4, 1, rgb_to_gray_mask_u8<2, 1, 0> > amask_no_clip_abgr32gray; //----amask_no_clip_abgr32gray - - -} - - - -#endif diff --git a/uppdev/aggdraw/agg_arc.cpp b/uppdev/aggdraw/agg_arc.cpp deleted file mode 100644 index f97717f58..000000000 --- a/uppdev/aggdraw/agg_arc.cpp +++ /dev/null @@ -1,111 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#include -#include "agg_arc.h" - - -namespace agg -{ - //------------------------------------------------------------------------ - arc::arc(double x, double y, - double rx, double ry, - double a1, double a2, - bool ccw) : - m_x(x), m_y(y), m_rx(rx), m_ry(ry), m_scale(1.0) - { - normalize(a1, a2, ccw); - } - - //------------------------------------------------------------------------ - void arc::init(double x, double y, - double rx, double ry, - double a1, double a2, - bool ccw) - { - m_x = x; m_y = y; - m_rx = rx; m_ry = ry; - normalize(a1, a2, ccw); - } - - //------------------------------------------------------------------------ - void arc::approximation_scale(double s) - { - m_scale = s; - if(m_initialized) - { - normalize(m_start, m_end, m_ccw); - } - } - - //------------------------------------------------------------------------ - void arc::rewind(unsigned) - { - m_path_cmd = path_cmd_move_to; - m_angle = m_start; - } - - //------------------------------------------------------------------------ - unsigned arc::vertex(double* x, double* y) - { - if(is_stop(m_path_cmd)) return path_cmd_stop; - if((m_angle < m_end - m_da/4) != m_ccw) - { - *x = m_x + cos(m_end) * m_rx; - *y = m_y + sin(m_end) * m_ry; - m_path_cmd = path_cmd_stop; - return path_cmd_line_to; - } - - *x = m_x + cos(m_angle) * m_rx; - *y = m_y + sin(m_angle) * m_ry; - - m_angle += m_da; - - unsigned pf = m_path_cmd; - m_path_cmd = path_cmd_line_to; - return pf; - } - - //------------------------------------------------------------------------ - void arc::normalize(double a1, double a2, bool ccw) - { - double ra = (fabs(m_rx) + fabs(m_ry)) / 2; - m_da = acos(ra / (ra + 0.125 / m_scale)) * 2; - if(ccw) - { - while(a2 < a1) a2 += pi * 2.0; - } - else - { - while(a1 < a2) a1 += pi * 2.0; - m_da = -m_da; - } - m_ccw = ccw; - m_start = a1; - m_end = a2; - m_initialized = true; - } - -} diff --git a/uppdev/aggdraw/agg_arc.h b/uppdev/aggdraw/agg_arc.h deleted file mode 100644 index 6ff919e58..000000000 --- a/uppdev/aggdraw/agg_arc.h +++ /dev/null @@ -1,79 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_ARC_INCLUDED -#define AGG_ARC_INCLUDED - -#include -#include "agg_basics.h" - -namespace agg -{ - - //=====================================================================arc - // - // See Implementation agg_arc.cpp - // - class arc - { - public: - arc() : m_scale(1.0), m_initialized(false) {} - arc(double x, double y, - double rx, double ry, - double a1, double a2, - bool ccw=true); - - void init(double x, double y, - double rx, double ry, - double a1, double a2, - bool ccw=true); - - void approximation_scale(double s); - double approximation_scale() const { return m_scale; } - - void rewind(unsigned); - unsigned vertex(double* x, double* y); - - private: - void normalize(double a1, double a2, bool ccw); - - double m_x; - double m_y; - double m_rx; - double m_ry; - double m_angle; - double m_start; - double m_end; - double m_scale; - double m_da; - bool m_ccw; - bool m_initialized; - unsigned m_path_cmd; - }; - - -} - - -#endif diff --git a/uppdev/aggdraw/agg_array.h b/uppdev/aggdraw/agg_array.h deleted file mode 100644 index 81ed4dd82..000000000 --- a/uppdev/aggdraw/agg_array.h +++ /dev/null @@ -1,1129 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_ARRAY_INCLUDED -#define AGG_ARRAY_INCLUDED - -#include -#include -#include "agg_basics.h" - -namespace agg -{ - - //-------------------------------------------------------pod_array_adaptor - template class pod_array_adaptor - { - public: - typedef T value_type; - pod_array_adaptor(T* array, unsigned size) : - m_array(array), m_size(size) {} - - unsigned size() const { return m_size; } - const T& operator [] (unsigned i) const { return m_array[i]; } - T& operator [] (unsigned i) { return m_array[i]; } - const T& at(unsigned i) const { return m_array[i]; } - T& at(unsigned i) { return m_array[i]; } - T value_at(unsigned i) const { return m_array[i]; } - - private: - T* m_array; - unsigned m_size; - }; - - - //---------------------------------------------------------pod_auto_array - template class pod_auto_array - { - public: - typedef T value_type; - typedef pod_auto_array self_type; - - pod_auto_array() {} - explicit pod_auto_array(const T* c) - { - memcpy(m_array, c, sizeof(T) * Size); - } - - const self_type& operator = (const T* c) - { - memcpy(m_array, c, sizeof(T) * Size); - return *this; - } - - static unsigned size() { return Size; } - const T& operator [] (unsigned i) const { return m_array[i]; } - T& operator [] (unsigned i) { return m_array[i]; } - const T& at(unsigned i) const { return m_array[i]; } - T& at(unsigned i) { return m_array[i]; } - T value_at(unsigned i) const { return m_array[i]; } - - private: - T m_array[Size]; - }; - - - //--------------------------------------------------------pod_auto_vector - template class pod_auto_vector - { - public: - typedef T value_type; - typedef pod_auto_vector self_type; - - pod_auto_vector() : m_size(0) {} - - void remove_all() { m_size = 0; } - void clear() { m_size = 0; } - void add(const T& v) { m_array[m_size++] = v; } - void push_back(const T& v) { m_array[m_size++] = v; } - void inc_size(unsigned size) { m_size += size; } - - unsigned size() const { return m_size; } - const T& operator [] (unsigned i) const { return m_array[i]; } - T& operator [] (unsigned i) { return m_array[i]; } - const T& at(unsigned i) const { return m_array[i]; } - T& at(unsigned i) { return m_array[i]; } - T value_at(unsigned i) const { return m_array[i]; } - - private: - T m_array[Size]; - unsigned m_size; - }; - - - //---------------------------------------------------------------pod_array - template class pod_array - { - public: - typedef T value_type; - typedef pod_array self_type; - - ~pod_array() { pod_allocator::deallocate(m_array, m_size); } - pod_array() : m_array(0), m_size(0) {} - - pod_array(unsigned size) : - m_array(pod_allocator::allocate(size)), - m_size(size) - {} - - pod_array(const self_type& v) : - m_array(pod_allocator::allocate(v.m_size)), - m_size(v.m_size) - { - memcpy(m_array, v.m_array, sizeof(T) * m_size); - } - - void resize(unsigned size) - { - if(size != m_size) - { - pod_allocator::deallocate(m_array, m_size); - m_array = pod_allocator::allocate(m_size = size); - } - } - const self_type& operator = (const self_type& v) - { - resize(v.size()); - memcpy(m_array, v.m_array, sizeof(T) * m_size); - return *this; - } - - unsigned size() const { return m_size; } - const T& operator [] (unsigned i) const { return m_array[i]; } - T& operator [] (unsigned i) { return m_array[i]; } - const T& at(unsigned i) const { return m_array[i]; } - T& at(unsigned i) { return m_array[i]; } - T value_at(unsigned i) const { return m_array[i]; } - - const T* data() const { return m_array; } - T* data() { return m_array; } - private: - T* m_array; - unsigned m_size; - }; - - - - //--------------------------------------------------------------pod_vector - // A simple class template to store Plain Old Data, a vector - // of a fixed size. The data is continous in memory - //------------------------------------------------------------------------ - template class pod_vector - { - public: - typedef T value_type; - - ~pod_vector() { pod_allocator::deallocate(m_array, m_capacity); } - pod_vector() : m_size(0), m_capacity(0), m_array(0) {} - pod_vector(unsigned cap, unsigned extra_tail=0); - - // Copying - pod_vector(const pod_vector&); - const pod_vector& operator = (const pod_vector&); - - // Set new capacity. All data is lost, size is set to zero. - void capacity(unsigned cap, unsigned extra_tail=0); - unsigned capacity() const { return m_capacity; } - - // Allocate n elements. All data is lost, - // but elements can be accessed in range 0...size-1. - void allocate(unsigned size, unsigned extra_tail=0); - - // Resize keeping the content. - void resize(unsigned new_size); - - void zero() - { - memset(m_array, 0, sizeof(T) * m_size); - } - - void add(const T& v) { m_array[m_size++] = v; } - void push_back(const T& v) { m_array[m_size++] = v; } - void insert_at(unsigned pos, const T& val); - void inc_size(unsigned size) { m_size += size; } - unsigned size() const { return m_size; } - unsigned byte_size() const { return m_size * sizeof(T); } - void serialize(int8u* ptr) const; - void deserialize(const int8u* data, unsigned byte_size); - const T& operator [] (unsigned i) const { return m_array[i]; } - T& operator [] (unsigned i) { return m_array[i]; } - const T& at(unsigned i) const { return m_array[i]; } - T& at(unsigned i) { return m_array[i]; } - T value_at(unsigned i) const { return m_array[i]; } - - const T* data() const { return m_array; } - T* data() { return m_array; } - - void remove_all() { m_size = 0; } - void clear() { m_size = 0; } - void cut_at(unsigned num) { if(num < m_size) m_size = num; } - - private: - unsigned m_size; - unsigned m_capacity; - T* m_array; - }; - - //------------------------------------------------------------------------ - template - void pod_vector::capacity(unsigned cap, unsigned extra_tail) - { - m_size = 0; - if(cap > m_capacity) - { - pod_allocator::deallocate(m_array, m_capacity); - m_capacity = cap + extra_tail; - m_array = m_capacity ? pod_allocator::allocate(m_capacity) : 0; - } - } - - //------------------------------------------------------------------------ - template - void pod_vector::allocate(unsigned size, unsigned extra_tail) - { - capacity(size, extra_tail); - m_size = size; - } - - - //------------------------------------------------------------------------ - template - void pod_vector::resize(unsigned new_size) - { - if(new_size > m_size) - { - if(new_size > m_capacity) - { - T* data = pod_allocator::allocate(new_size); - memcpy(data, m_array, m_size * sizeof(T)); - pod_allocator::deallocate(m_array, m_capacity); - m_array = data; - } - } - else - { - m_size = new_size; - } - } - - //------------------------------------------------------------------------ - template pod_vector::pod_vector(unsigned cap, unsigned extra_tail) : - m_size(0), - m_capacity(cap + extra_tail), - m_array(pod_allocator::allocate(m_capacity)) {} - - //------------------------------------------------------------------------ - template pod_vector::pod_vector(const pod_vector& v) : - m_size(v.m_size), - m_capacity(v.m_capacity), - m_array(v.m_capacity ? pod_allocator::allocate(v.m_capacity) : 0) - { - memcpy(m_array, v.m_array, sizeof(T) * v.m_size); - } - - //------------------------------------------------------------------------ - template const pod_vector& - pod_vector::operator = (const pod_vector&v) - { - allocate(v.m_size); - if(v.m_size) memcpy(m_array, v.m_array, sizeof(T) * v.m_size); - return *this; - } - - //------------------------------------------------------------------------ - template void pod_vector::serialize(int8u* ptr) const - { - if(m_size) memcpy(ptr, m_array, m_size * sizeof(T)); - } - - //------------------------------------------------------------------------ - template - void pod_vector::deserialize(const int8u* data, unsigned byte_size) - { - byte_size /= sizeof(T); - allocate(byte_size); - if(byte_size) memcpy(m_array, data, byte_size * sizeof(T)); - } - - //------------------------------------------------------------------------ - template - void pod_vector::insert_at(unsigned pos, const T& val) - { - if(pos >= m_size) - { - m_array[m_size] = val; - } - else - { - memmove(m_array + pos + 1, m_array + pos, (m_size - pos) * sizeof(T)); - m_array[pos] = val; - } - ++m_size; - } - - //---------------------------------------------------------------pod_bvector - // A simple class template to store Plain Old Data, similar to std::deque - // It doesn't reallocate memory but instead, uses blocks of data of size - // of (1 << S), that is, power of two. The data is NOT contiguous in memory, - // so the only valid access method is operator [] or curr(), prev(), next() - // - // There reallocs occure only when the pool of pointers to blocks needs - // to be extended (it happens very rarely). You can control the value - // of increment to reallocate the pointer buffer. See the second constructor. - // By default, the incremeent value equals (1 << S), i.e., the block size. - //------------------------------------------------------------------------ - template class pod_bvector - { - public: - enum block_scale_e - { - block_shift = S, - block_size = 1 << block_shift, - block_mask = block_size - 1 - }; - - typedef T value_type; - - ~pod_bvector(); - pod_bvector(); - pod_bvector(unsigned block_ptr_inc); - - // Copying - pod_bvector(const pod_bvector& v); - const pod_bvector& operator = (const pod_bvector& v); - - void remove_all() { m_size = 0; } - void clear() { m_size = 0; } - void free_all() { free_tail(0); } - void free_tail(unsigned size); - void add(const T& val); - void push_back(const T& val) { add(val); } - void modify_last(const T& val); - void remove_last(); - - int allocate_continuous_block(unsigned num_elements); - - void add_array(const T* ptr, unsigned num_elem) - { - while(num_elem--) - { - add(*ptr++); - } - } - - template void add_data(DataAccessor& data) - { - while(data.size()) - { - add(*data); - ++data; - } - } - - void cut_at(unsigned size) - { - if(size < m_size) m_size = size; - } - - unsigned size() const { return m_size; } - - const T& operator [] (unsigned i) const - { - return m_blocks[i >> block_shift][i & block_mask]; - } - - T& operator [] (unsigned i) - { - return m_blocks[i >> block_shift][i & block_mask]; - } - - const T& at(unsigned i) const - { - return m_blocks[i >> block_shift][i & block_mask]; - } - - T& at(unsigned i) - { - return m_blocks[i >> block_shift][i & block_mask]; - } - - T value_at(unsigned i) const - { - return m_blocks[i >> block_shift][i & block_mask]; - } - - const T& curr(unsigned idx) const - { - return (*this)[idx]; - } - - T& curr(unsigned idx) - { - return (*this)[idx]; - } - - const T& prev(unsigned idx) const - { - return (*this)[(idx + m_size - 1) % m_size]; - } - - T& prev(unsigned idx) - { - return (*this)[(idx + m_size - 1) % m_size]; - } - - const T& next(unsigned idx) const - { - return (*this)[(idx + 1) % m_size]; - } - - T& next(unsigned idx) - { - return (*this)[(idx + 1) % m_size]; - } - - const T& last() const - { - return (*this)[m_size - 1]; - } - - T& last() - { - return (*this)[m_size - 1]; - } - - unsigned byte_size() const; - void serialize(int8u* ptr) const; - void deserialize(const int8u* data, unsigned byte_size); - void deserialize(unsigned start, const T& empty_val, - const int8u* data, unsigned byte_size); - - template - void deserialize(ByteAccessor data) - { - remove_all(); - unsigned elem_size = data.size() / sizeof(T); - - for(unsigned i = 0; i < elem_size; ++i) - { - int8u* ptr = (int8u*)data_ptr(); - for(unsigned j = 0; j < sizeof(T); ++j) - { - *ptr++ = *data; - ++data; - } - ++m_size; - } - } - - template - void deserialize(unsigned start, const T& empty_val, ByteAccessor data) - { - while(m_size < start) - { - add(empty_val); - } - - unsigned elem_size = data.size() / sizeof(T); - for(unsigned i = 0; i < elem_size; ++i) - { - int8u* ptr; - if(start + i < m_size) - { - ptr = (int8u*)(&((*this)[start + i])); - } - else - { - ptr = (int8u*)data_ptr(); - ++m_size; - } - for(unsigned j = 0; j < sizeof(T); ++j) - { - *ptr++ = *data; - ++data; - } - } - } - - const T* block(unsigned nb) const { return m_blocks[nb]; } - - private: - void allocate_block(unsigned nb); - T* data_ptr(); - - unsigned m_size; - unsigned m_num_blocks; - unsigned m_max_blocks; - T** m_blocks; - unsigned m_block_ptr_inc; - }; - - - //------------------------------------------------------------------------ - template pod_bvector::~pod_bvector() - { - if(m_num_blocks) - { - T** blk = m_blocks + m_num_blocks - 1; - while(m_num_blocks--) - { - pod_allocator::deallocate(*blk, block_size); - --blk; - } - } - pod_allocator::deallocate(m_blocks, m_max_blocks); - } - - - //------------------------------------------------------------------------ - template - void pod_bvector::free_tail(unsigned size) - { - if(size < m_size) - { - unsigned nb = (size + block_mask) >> block_shift; - while(m_num_blocks > nb) - { - pod_allocator::deallocate(m_blocks[--m_num_blocks], block_size); - } - if(m_num_blocks == 0) - { - pod_allocator::deallocate(m_blocks, m_max_blocks); - m_blocks = 0; - m_max_blocks = 0; - } - m_size = size; - } - } - - - //------------------------------------------------------------------------ - template pod_bvector::pod_bvector() : - m_size(0), - m_num_blocks(0), - m_max_blocks(0), - m_blocks(0), - m_block_ptr_inc(block_size) - { - } - - - //------------------------------------------------------------------------ - template - pod_bvector::pod_bvector(unsigned block_ptr_inc) : - m_size(0), - m_num_blocks(0), - m_max_blocks(0), - m_blocks(0), - m_block_ptr_inc(block_ptr_inc) - { - } - - - //------------------------------------------------------------------------ - template - pod_bvector::pod_bvector(const pod_bvector& v) : - m_size(v.m_size), - m_num_blocks(v.m_num_blocks), - m_max_blocks(v.m_max_blocks), - m_blocks(v.m_max_blocks ? - pod_allocator::allocate(v.m_max_blocks) : - 0), - m_block_ptr_inc(v.m_block_ptr_inc) - { - unsigned i; - for(i = 0; i < v.m_num_blocks; ++i) - { - m_blocks[i] = pod_allocator::allocate(block_size); - memcpy(m_blocks[i], v.m_blocks[i], block_size * sizeof(T)); - } - } - - - //------------------------------------------------------------------------ - template - const pod_bvector& - pod_bvector::operator = (const pod_bvector& v) - { - unsigned i; - for(i = m_num_blocks; i < v.m_num_blocks; ++i) - { - allocate_block(i); - } - for(i = 0; i < v.m_num_blocks; ++i) - { - memcpy(m_blocks[i], v.m_blocks[i], block_size * sizeof(T)); - } - m_size = v.m_size; - return *this; - } - - - //------------------------------------------------------------------------ - template - void pod_bvector::allocate_block(unsigned nb) - { - if(nb >= m_max_blocks) - { - T** new_blocks = pod_allocator::allocate(m_max_blocks + m_block_ptr_inc); - - if(m_blocks) - { - memcpy(new_blocks, - m_blocks, - m_num_blocks * sizeof(T*)); - - pod_allocator::deallocate(m_blocks, m_max_blocks); - } - m_blocks = new_blocks; - m_max_blocks += m_block_ptr_inc; - } - m_blocks[nb] = pod_allocator::allocate(block_size); - m_num_blocks++; - } - - - - //------------------------------------------------------------------------ - template - inline T* pod_bvector::data_ptr() - { - unsigned nb = m_size >> block_shift; - if(nb >= m_num_blocks) - { - allocate_block(nb); - } - return m_blocks[nb] + (m_size & block_mask); - } - - - - //------------------------------------------------------------------------ - template - inline void pod_bvector::add(const T& val) - { - *data_ptr() = val; - ++m_size; - } - - - //------------------------------------------------------------------------ - template - inline void pod_bvector::remove_last() - { - if(m_size) --m_size; - } - - - //------------------------------------------------------------------------ - template - void pod_bvector::modify_last(const T& val) - { - remove_last(); - add(val); - } - - - //------------------------------------------------------------------------ - template - int pod_bvector::allocate_continuous_block(unsigned num_elements) - { - if(num_elements < block_size) - { - data_ptr(); // Allocate initial block if necessary - unsigned rest = block_size - (m_size & block_mask); - unsigned index; - if(num_elements <= rest) - { - // The rest of the block is good, we can use it - //----------------- - index = m_size; - m_size += num_elements; - return index; - } - - // New block - //--------------- - m_size += rest; - data_ptr(); - index = m_size; - m_size += num_elements; - return index; - } - return -1; // Impossible to allocate - } - - - //------------------------------------------------------------------------ - template - unsigned pod_bvector::byte_size() const - { - return m_size * sizeof(T); - } - - - //------------------------------------------------------------------------ - template - void pod_bvector::serialize(int8u* ptr) const - { - unsigned i; - for(i = 0; i < m_size; i++) - { - memcpy(ptr, &(*this)[i], sizeof(T)); - ptr += sizeof(T); - } - } - - //------------------------------------------------------------------------ - template - void pod_bvector::deserialize(const int8u* data, unsigned byte_size) - { - remove_all(); - byte_size /= sizeof(T); - for(unsigned i = 0; i < byte_size; ++i) - { - T* ptr = data_ptr(); - memcpy(ptr, data, sizeof(T)); - ++m_size; - data += sizeof(T); - } - } - - - // Replace or add a number of elements starting from "start" position - //------------------------------------------------------------------------ - template - void pod_bvector::deserialize(unsigned start, const T& empty_val, - const int8u* data, unsigned byte_size) - { - while(m_size < start) - { - add(empty_val); - } - - byte_size /= sizeof(T); - for(unsigned i = 0; i < byte_size; ++i) - { - if(start + i < m_size) - { - memcpy(&((*this)[start + i]), data, sizeof(T)); - } - else - { - T* ptr = data_ptr(); - memcpy(ptr, data, sizeof(T)); - ++m_size; - } - data += sizeof(T); - } - } - - - //---------------------------------------------------------block_allocator - // Allocator for arbitrary POD data. Most usable in different cache - // systems for efficient memory allocations. - // Memory is allocated with blocks of fixed size ("block_size" in - // the constructor). If required size exceeds the block size the allocator - // creates a new block of the required size. However, the most efficient - // use is when the average reqired size is much less than the block size. - //------------------------------------------------------------------------ - class block_allocator - { - struct block_type - { - int8u* data; - unsigned size; - }; - - public: - void remove_all() - { - if(m_num_blocks) - { - block_type* blk = m_blocks + m_num_blocks - 1; - while(m_num_blocks--) - { - pod_allocator::deallocate(blk->data, blk->size); - --blk; - } - pod_allocator::deallocate(m_blocks, m_max_blocks); - } - m_num_blocks = 0; - m_max_blocks = 0; - m_blocks = 0; - m_buf_ptr = 0; - m_rest = 0; - } - - ~block_allocator() - { - remove_all(); - } - - block_allocator(unsigned block_size, unsigned block_ptr_inc=256-8) : - m_block_size(block_size), - m_block_ptr_inc(block_ptr_inc), - m_num_blocks(0), - m_max_blocks(0), - m_blocks(0), - m_buf_ptr(0), - m_rest(0) - { - } - - - int8u* allocate(unsigned size, unsigned alignment=1) - { - if(size == 0) return 0; - if(size <= m_rest) - { - int8u* ptr = m_buf_ptr; - if(alignment > 1) - { - unsigned align = - (alignment - unsigned((size_t)ptr) % alignment) % alignment; - - size += align; - ptr += align; - if(size <= m_rest) - { - m_rest -= size; - m_buf_ptr += size; - return ptr; - } - allocate_block(size); - return allocate(size - align, alignment); - } - m_rest -= size; - m_buf_ptr += size; - return ptr; - } - allocate_block(size + alignment - 1); - return allocate(size, alignment); - } - - - private: - void allocate_block(unsigned size) - { - if(size < m_block_size) size = m_block_size; - if(m_num_blocks >= m_max_blocks) - { - block_type* new_blocks = - pod_allocator::allocate(m_max_blocks + m_block_ptr_inc); - - if(m_blocks) - { - memcpy(new_blocks, - m_blocks, - m_num_blocks * sizeof(block_type)); - pod_allocator::deallocate(m_blocks, m_max_blocks); - } - m_blocks = new_blocks; - m_max_blocks += m_block_ptr_inc; - } - - m_blocks[m_num_blocks].size = size; - m_blocks[m_num_blocks].data = - m_buf_ptr = - pod_allocator::allocate(size); - - m_num_blocks++; - m_rest = size; - } - - unsigned m_block_size; - unsigned m_block_ptr_inc; - unsigned m_num_blocks; - unsigned m_max_blocks; - block_type* m_blocks; - int8u* m_buf_ptr; - unsigned m_rest; - }; - - - - - - - - - //------------------------------------------------------------------------ - enum quick_sort_threshold_e - { - quick_sort_threshold = 9 - }; - - - //-----------------------------------------------------------swap_elements - template inline void swap_elements(T& a, T& b) - { - T temp = a; - a = b; - b = temp; - } - - - //--------------------------------------------------------------quick_sort - template - void quick_sort(Array& arr, Less less) - { - if(arr.size() < 2) return; - - typename Array::value_type* e1; - typename Array::value_type* e2; - - int stack[80]; - int* top = stack; - int limit = arr.size(); - int base = 0; - - for(;;) - { - int len = limit - base; - - int i; - int j; - int pivot; - - if(len > quick_sort_threshold) - { - // we use base + len/2 as the pivot - pivot = base + len / 2; - swap_elements(arr[base], arr[pivot]); - - i = base + 1; - j = limit - 1; - - // now ensure that *i <= *base <= *j - e1 = &(arr[j]); - e2 = &(arr[i]); - if(less(*e1, *e2)) swap_elements(*e1, *e2); - - e1 = &(arr[base]); - e2 = &(arr[i]); - if(less(*e1, *e2)) swap_elements(*e1, *e2); - - e1 = &(arr[j]); - e2 = &(arr[base]); - if(less(*e1, *e2)) swap_elements(*e1, *e2); - - for(;;) - { - do i++; while( less(arr[i], arr[base]) ); - do j--; while( less(arr[base], arr[j]) ); - - if( i > j ) - { - break; - } - - swap_elements(arr[i], arr[j]); - } - - swap_elements(arr[base], arr[j]); - - // now, push the largest sub-array - if(j - base > limit - i) - { - top[0] = base; - top[1] = j; - base = i; - } - else - { - top[0] = i; - top[1] = limit; - limit = j; - } - top += 2; - } - else - { - // the sub-array is small, perform insertion sort - j = base; - i = j + 1; - - for(; i < limit; j = i, i++) - { - for(; less(*(e1 = &(arr[j + 1])), *(e2 = &(arr[j]))); j--) - { - swap_elements(*e1, *e2); - if(j == base) - { - break; - } - } - } - if(top > stack) - { - top -= 2; - base = top[0]; - limit = top[1]; - } - else - { - break; - } - } - } - } - - - - - //------------------------------------------------------remove_duplicates - // Remove duplicates from a sorted array. It doesn't cut the - // tail of the array, it just returns the number of remaining elements. - //----------------------------------------------------------------------- - template - unsigned remove_duplicates(Array& arr, Equal equal) - { - if(arr.size() < 2) return arr.size(); - - unsigned i, j; - for(i = 1, j = 1; i < arr.size(); i++) - { - typename Array::value_type& e = arr[i]; - if(!equal(e, arr[i - 1])) - { - arr[j++] = e; - } - } - return j; - } - - //--------------------------------------------------------invert_container - template void invert_container(Array& arr) - { - int i = 0; - int j = arr.size() - 1; - while(i < j) - { - swap_elements(arr[i++], arr[j--]); - } - } - - //------------------------------------------------------binary_search_pos - template - unsigned binary_search_pos(const Array& arr, const Value& val, Less less) - { - if(arr.size() == 0) return 0; - - unsigned beg = 0; - unsigned end = arr.size() - 1; - - if(less(val, arr[0])) return 0; - if(less(arr[end], val)) return end + 1; - - while(end - beg > 1) - { - unsigned mid = (end + beg) >> 1; - if(less(val, arr[mid])) end = mid; - else beg = mid; - } - - //if(beg <= 0 && less(val, arr[0])) return 0; - //if(end >= arr.size() - 1 && less(arr[end], val)) ++end; - - return end; - } - - //----------------------------------------------------------range_adaptor - template class range_adaptor - { - public: - typedef typename Array::value_type value_type; - - range_adaptor(Array& array, unsigned start, unsigned size) : - m_array(array), m_start(start), m_size(size) - {} - - unsigned size() const { return m_size; } - const value_type& operator [] (unsigned i) const { return m_array[m_start + i]; } - value_type& operator [] (unsigned i) { return m_array[m_start + i]; } - const value_type& at(unsigned i) const { return m_array[m_start + i]; } - value_type& at(unsigned i) { return m_array[m_start + i]; } - value_type value_at(unsigned i) const { return m_array[m_start + i]; } - - private: - Array& m_array; - unsigned m_start; - unsigned m_size; - }; - - //---------------------------------------------------------------int_less - inline bool int_less(int a, int b) { return a < b; } - - //------------------------------------------------------------int_greater - inline bool int_greater(int a, int b) { return a > b; } - - //----------------------------------------------------------unsigned_less - inline bool unsigned_less(unsigned a, unsigned b) { return a < b; } - - //-------------------------------------------------------unsigned_greater - inline bool unsigned_greater(unsigned a, unsigned b) { return a > b; } -} - -#endif diff --git a/uppdev/aggdraw/agg_arrowhead.cpp b/uppdev/aggdraw/agg_arrowhead.cpp deleted file mode 100644 index 47a6572a8..000000000 --- a/uppdev/aggdraw/agg_arrowhead.cpp +++ /dev/null @@ -1,115 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#include "agg_arrowhead.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - arrowhead::arrowhead() : - m_head_d1(1.0), - m_head_d2(1.0), - m_head_d3(1.0), - m_head_d4(0.0), - m_tail_d1(1.0), - m_tail_d2(1.0), - m_tail_d3(1.0), - m_tail_d4(0.0), - m_head_flag(false), - m_tail_flag(false), - m_curr_id(0), - m_curr_coord(0) - { - } - - - - //------------------------------------------------------------------------ - void arrowhead::rewind(unsigned path_id) - { - m_curr_id = path_id; - m_curr_coord = 0; - if(path_id == 0) - { - if(!m_tail_flag) - { - m_cmd[0] = path_cmd_stop; - return; - } - m_coord[0] = m_tail_d1; m_coord[1] = 0.0; - m_coord[2] = m_tail_d1 - m_tail_d4; m_coord[3] = m_tail_d3; - m_coord[4] = -m_tail_d2 - m_tail_d4; m_coord[5] = m_tail_d3; - m_coord[6] = -m_tail_d2; m_coord[7] = 0.0; - m_coord[8] = -m_tail_d2 - m_tail_d4; m_coord[9] = -m_tail_d3; - m_coord[10] = m_tail_d1 - m_tail_d4; m_coord[11] = -m_tail_d3; - - m_cmd[0] = path_cmd_move_to; - m_cmd[1] = path_cmd_line_to; - m_cmd[2] = path_cmd_line_to; - m_cmd[3] = path_cmd_line_to; - m_cmd[4] = path_cmd_line_to; - m_cmd[5] = path_cmd_line_to; - m_cmd[7] = path_cmd_end_poly | path_flags_close | path_flags_ccw; - m_cmd[6] = path_cmd_stop; - return; - } - - if(path_id == 1) - { - if(!m_head_flag) - { - m_cmd[0] = path_cmd_stop; - return; - } - m_coord[0] = -m_head_d1; m_coord[1] = 0.0; - m_coord[2] = m_head_d2 + m_head_d4; m_coord[3] = -m_head_d3; - m_coord[4] = m_head_d2; m_coord[5] = 0.0; - m_coord[6] = m_head_d2 + m_head_d4; m_coord[7] = m_head_d3; - - m_cmd[0] = path_cmd_move_to; - m_cmd[1] = path_cmd_line_to; - m_cmd[2] = path_cmd_line_to; - m_cmd[3] = path_cmd_line_to; - m_cmd[4] = path_cmd_end_poly | path_flags_close | path_flags_ccw; - m_cmd[5] = path_cmd_stop; - return; - } - } - - - //------------------------------------------------------------------------ - unsigned arrowhead::vertex(double* x, double* y) - { - if(m_curr_id < 2) - { - unsigned curr_idx = m_curr_coord * 2; - *x = m_coord[curr_idx]; - *y = m_coord[curr_idx + 1]; - return m_cmd[m_curr_coord++]; - } - return path_cmd_stop; - } - -} diff --git a/uppdev/aggdraw/agg_arrowhead.h b/uppdev/aggdraw/agg_arrowhead.h deleted file mode 100644 index 9c7c97c63..000000000 --- a/uppdev/aggdraw/agg_arrowhead.h +++ /dev/null @@ -1,88 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_ARROWHEAD_INCLUDED -#define AGG_ARROWHEAD_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - - //===============================================================arrowhead - // - // See implementation agg_arrowhead.cpp - // - class arrowhead - { - public: - arrowhead(); - - void head(double d1, double d2, double d3, double d4) - { - m_head_d1 = d1; - m_head_d2 = d2; - m_head_d3 = d3; - m_head_d4 = d4; - m_head_flag = true; - } - - void head() { m_head_flag = true; } - void no_head() { m_head_flag = false; } - - void tail(double d1, double d2, double d3, double d4) - { - m_tail_d1 = d1; - m_tail_d2 = d2; - m_tail_d3 = d3; - m_tail_d4 = d4; - m_tail_flag = true; - } - - void tail() { m_tail_flag = true; } - void no_tail() { m_tail_flag = false; } - - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - double m_head_d1; - double m_head_d2; - double m_head_d3; - double m_head_d4; - double m_tail_d1; - double m_tail_d2; - double m_tail_d3; - double m_tail_d4; - bool m_head_flag; - bool m_tail_flag; - double m_coord[16]; - unsigned m_cmd[8]; - unsigned m_curr_id; - unsigned m_curr_coord; - }; - -} - -#endif diff --git a/uppdev/aggdraw/agg_basics.h b/uppdev/aggdraw/agg_basics.h deleted file mode 100644 index f673863b4..000000000 --- a/uppdev/aggdraw/agg_basics.h +++ /dev/null @@ -1,539 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_BASICS_INCLUDED -#define AGG_BASICS_INCLUDED - -#include -#include "agg_config.h" - -//---------------------------------------------------------AGG_CUSTOM_ALLOCATOR -#ifdef AGG_CUSTOM_ALLOCATOR -#include "agg_allocator.h" -#else -namespace agg -{ - // The policy of all AGG containers and memory allocation strategy - // in general is that no allocated data requires explicit construction. - // It means that the allocator can be really simple; you can even - // replace new/delete to malloc/free. The constructors and destructors - // won't be called in this case, however everything will remain working. - // The second argument of deallocate() is the size of the allocated - // block. You can use this information if you wish. - //------------------------------------------------------------pod_allocator - template struct pod_allocator - { - static T* allocate(unsigned num) { return new T [num]; } - static void deallocate(T* ptr, unsigned) { delete [] ptr; } - }; - - // Single object allocator. It's also can be replaced with your custom - // allocator. The difference is that it can only allocate a single - // object and the constructor and destructor must be called. - // In AGG there is no need to allocate an array of objects with - // calling their constructors (only single ones). So that, if you - // replace these new/delete to malloc/free make sure that the in-place - // new is called and take care of calling the destructor too. - //------------------------------------------------------------obj_allocator - template struct obj_allocator - { - static T* allocate() { return new T; } - static void deallocate(T* ptr) { delete ptr; } - }; -} -#endif - - -//-------------------------------------------------------- Default basic types -// -// If the compiler has different capacity of the basic types you can redefine -// them via the compiler command line or by generating agg_config.h that is -// empty by default. -// -#ifndef AGG_INT8 -#define AGG_INT8 signed char -#endif - -#ifndef AGG_INT8U -#define AGG_INT8U unsigned char -#endif - -#ifndef AGG_INT16 -#define AGG_INT16 short -#endif - -#ifndef AGG_INT16U -#define AGG_INT16U unsigned short -#endif - -#ifndef AGG_INT32 -#define AGG_INT32 int -#endif - -#ifndef AGG_INT32U -#define AGG_INT32U unsigned -#endif - -#ifndef AGG_INT64 -#if defined(_MSC_VER) || defined(__BORLANDC__) -#define AGG_INT64 signed __int64 -#else -#define AGG_INT64 signed long long -#endif -#endif - -#ifndef AGG_INT64U -#if defined(_MSC_VER) || defined(__BORLANDC__) -#define AGG_INT64U unsigned __int64 -#else -#define AGG_INT64U unsigned long long -#endif -#endif - -//------------------------------------------------ Some fixes for MS Visual C++ -#if defined(_MSC_VER) -#pragma warning(disable:4786) // Identifier was truncated... -#endif - -#if defined(_MSC_VER) -#define AGG_INLINE __forceinline -#else -#define AGG_INLINE inline -#endif - -namespace agg -{ - //------------------------------------------------------------------------- - typedef AGG_INT8 int8; //----int8 - typedef AGG_INT8U int8u; //----int8u - typedef AGG_INT16 int16; //----int16 - typedef AGG_INT16U int16u; //----int16u - typedef AGG_INT32 int32; //----int32 - typedef AGG_INT32U int32u; //----int32u - typedef AGG_INT64 int64; //----int64 - typedef AGG_INT64U int64u; //----int64u - -#if defined(AGG_FISTP) -#pragma warning(push) -#pragma warning(disable : 4035) //Disable warning "no return value" - AGG_INLINE int iround(double v) //-------iround - { - int t; - __asm fld qword ptr [v] - __asm fistp dword ptr [t] - __asm mov eax, dword ptr [t] - } - AGG_INLINE unsigned uround(double v) //-------uround - { - unsigned t; - __asm fld qword ptr [v] - __asm fistp dword ptr [t] - __asm mov eax, dword ptr [t] - } -#pragma warning(pop) - AGG_INLINE unsigned ufloor(double v) //-------ufloor - { - return unsigned(floor(v)); - } - AGG_INLINE unsigned uceil(double v) //--------uceil - { - return unsigned(ceil(v)); - } -#elif defined(AGG_QIFIST) - AGG_INLINE int iround(double v) - { - return int(v); - } - AGG_INLINE int uround(double v) - { - return unsigned(v); - } - AGG_INLINE unsigned ufloor(double v) - { - return unsigned(floor(v)); - } - AGG_INLINE unsigned uceil(double v) - { - return unsigned(ceil(v)); - } -#else - AGG_INLINE int iround(double v) - { - return int((v < 0.0) ? v - 0.5 : v + 0.5); - } - AGG_INLINE int uround(double v) - { - return unsigned(v + 0.5); - } - AGG_INLINE unsigned ufloor(double v) - { - return unsigned(v); - } - AGG_INLINE unsigned uceil(double v) - { - return unsigned(ceil(v)); - } -#endif - - //---------------------------------------------------------------saturation - template struct saturation - { - AGG_INLINE static int iround(double v) - { - if(v < double(-Limit)) return -Limit; - if(v > double( Limit)) return Limit; - return agg::iround(v); - } - }; - - //------------------------------------------------------------------mul_one - template struct mul_one - { - AGG_INLINE static unsigned mul(unsigned a, unsigned b) - { - register unsigned q = a * b + (1 << (Shift-1)); - return (q + (q >> Shift)) >> Shift; - } - }; - - //------------------------------------------------------------------------- - typedef unsigned char cover_type; //----cover_type - enum cover_scale_e - { - cover_shift = 8, //----cover_shift - cover_size = 1 << cover_shift, //----cover_size - cover_mask = cover_size - 1, //----cover_mask - cover_none = 0, //----cover_none - cover_full = cover_mask //----cover_full - }; - - //----------------------------------------------------poly_subpixel_scale_e - // These constants determine the subpixel accuracy, to be more precise, - // the number of bits of the fractional part of the coordinates. - // The possible coordinate capacity in bits can be calculated by formula: - // sizeof(int) * 8 - poly_subpixel_shift, i.e, for 32-bit integers and - // 8-bits fractional part the capacity is 24 bits. - enum poly_subpixel_scale_e - { - poly_subpixel_shift = 8, //----poly_subpixel_shift - poly_subpixel_scale = 1< struct rect_base - { - typedef T value_type; - typedef rect_base self_type; - T x1, y1, x2, y2; - - rect_base() {} - rect_base(T x1_, T y1_, T x2_, T y2_) : - x1(x1_), y1(y1_), x2(x2_), y2(y2_) {} - - void init(T x1_, T y1_, T x2_, T y2_) - { - x1 = x1_; y1 = y1_; x2 = x2_; y2 = y2_; - } - - const self_type& normalize() - { - T t; - if(x1 > x2) { t = x1; x1 = x2; x2 = t; } - if(y1 > y2) { t = y1; y1 = y2; y2 = t; } - return *this; - } - - bool clip(const self_type& r) - { - if(x2 > r.x2) x2 = r.x2; - if(y2 > r.y2) y2 = r.y2; - if(x1 < r.x1) x1 = r.x1; - if(y1 < r.y1) y1 = r.y1; - return x1 <= x2 && y1 <= y2; - } - - bool is_valid() const - { - return x1 <= x2 && y1 <= y2; - } - - bool hit_test(T x, T y) const - { - return (x >= x1 && x <= x2 && y >= y1 && y <= y2); - } - }; - - //-----------------------------------------------------intersect_rectangles - template - inline Rect intersect_rectangles(const Rect& r1, const Rect& r2) - { - Rect r = r1; - - // First process x2,y2 because the other order - // results in Internal Compiler Error under - // Microsoft Visual C++ .NET 2003 69462-335-0000007-18038 in - // case of "Maximize Speed" optimization option. - //----------------- - if(r.x2 > r2.x2) r.x2 = r2.x2; - if(r.y2 > r2.y2) r.y2 = r2.y2; - if(r.x1 < r2.x1) r.x1 = r2.x1; - if(r.y1 < r2.y1) r.y1 = r2.y1; - return r; - } - - - //---------------------------------------------------------unite_rectangles - template - inline Rect unite_rectangles(const Rect& r1, const Rect& r2) - { - Rect r = r1; - if(r.x2 < r2.x2) r.x2 = r2.x2; - if(r.y2 < r2.y2) r.y2 = r2.y2; - if(r.x1 > r2.x1) r.x1 = r2.x1; - if(r.y1 > r2.y1) r.y1 = r2.y1; - return r; - } - - typedef rect_base rect_i; //----rect_i - typedef rect_base rect_f; //----rect_f - typedef rect_base rect_d; //----rect_d - - //---------------------------------------------------------path_commands_e - enum path_commands_e - { - path_cmd_stop = 0, //----path_cmd_stop - path_cmd_move_to = 1, //----path_cmd_move_to - path_cmd_line_to = 2, //----path_cmd_line_to - path_cmd_curve3 = 3, //----path_cmd_curve3 - path_cmd_curve4 = 4, //----path_cmd_curve4 - path_cmd_curveN = 5, //----path_cmd_curveN - path_cmd_catrom = 6, //----path_cmd_catrom - path_cmd_ubspline = 7, //----path_cmd_ubspline - path_cmd_end_poly = 0x0F, //----path_cmd_end_poly - path_cmd_mask = 0x0F //----path_cmd_mask - }; - - //------------------------------------------------------------path_flags_e - enum path_flags_e - { - path_flags_none = 0, //----path_flags_none - path_flags_ccw = 0x10, //----path_flags_ccw - path_flags_cw = 0x20, //----path_flags_cw - path_flags_close = 0x40, //----path_flags_close - path_flags_mask = 0xF0 //----path_flags_mask - }; - - //---------------------------------------------------------------is_vertex - inline bool is_vertex(unsigned c) - { - return c >= path_cmd_move_to && c < path_cmd_end_poly; - } - - //--------------------------------------------------------------is_drawing - inline bool is_drawing(unsigned c) - { - return c >= path_cmd_line_to && c < path_cmd_end_poly; - } - - //-----------------------------------------------------------------is_stop - inline bool is_stop(unsigned c) - { - return c == path_cmd_stop; - } - - //--------------------------------------------------------------is_move_to - inline bool is_move_to(unsigned c) - { - return c == path_cmd_move_to; - } - - //--------------------------------------------------------------is_line_to - inline bool is_line_to(unsigned c) - { - return c == path_cmd_line_to; - } - - //----------------------------------------------------------------is_curve - inline bool is_curve(unsigned c) - { - return c == path_cmd_curve3 || c == path_cmd_curve4; - } - - //---------------------------------------------------------------is_curve3 - inline bool is_curve3(unsigned c) - { - return c == path_cmd_curve3; - } - - //---------------------------------------------------------------is_curve4 - inline bool is_curve4(unsigned c) - { - return c == path_cmd_curve4; - } - - //-------------------------------------------------------------is_end_poly - inline bool is_end_poly(unsigned c) - { - return (c & path_cmd_mask) == path_cmd_end_poly; - } - - //----------------------------------------------------------------is_close - inline bool is_close(unsigned c) - { - return (c & ~(path_flags_cw | path_flags_ccw)) == - (path_cmd_end_poly | path_flags_close); - } - - //------------------------------------------------------------is_next_poly - inline bool is_next_poly(unsigned c) - { - return is_stop(c) || is_move_to(c) || is_end_poly(c); - } - - //-------------------------------------------------------------------is_cw - inline bool is_cw(unsigned c) - { - return (c & path_flags_cw) != 0; - } - - //------------------------------------------------------------------is_ccw - inline bool is_ccw(unsigned c) - { - return (c & path_flags_ccw) != 0; - } - - //-------------------------------------------------------------is_oriented - inline bool is_oriented(unsigned c) - { - return (c & (path_flags_cw | path_flags_ccw)) != 0; - } - - //---------------------------------------------------------------is_closed - inline bool is_closed(unsigned c) - { - return (c & path_flags_close) != 0; - } - - //----------------------------------------------------------get_close_flag - inline unsigned get_close_flag(unsigned c) - { - return c & path_flags_close; - } - - //-------------------------------------------------------clear_orientation - inline unsigned clear_orientation(unsigned c) - { - return c & ~(path_flags_cw | path_flags_ccw); - } - - //---------------------------------------------------------get_orientation - inline unsigned get_orientation(unsigned c) - { - return c & (path_flags_cw | path_flags_ccw); - } - - //---------------------------------------------------------set_orientation - inline unsigned set_orientation(unsigned c, unsigned o) - { - return clear_orientation(c) | o; - } - - //--------------------------------------------------------------point_base - template struct point_base - { - typedef T value_type; - T x,y; - point_base() {} - point_base(T x_, T y_) : x(x_), y(y_) {} - }; - typedef point_base point_i; //-----point_i - typedef point_base point_f; //-----point_f - typedef point_base point_d; //-----point_d - - //-------------------------------------------------------------vertex_base - template struct vertex_base - { - typedef T value_type; - T x,y; - unsigned cmd; - vertex_base() {} - vertex_base(T x_, T y_, unsigned cmd_) : x(x_), y(y_), cmd(cmd_) {} - }; - typedef vertex_base vertex_i; //-----vertex_i - typedef vertex_base vertex_f; //-----vertex_f - typedef vertex_base vertex_d; //-----vertex_d - - //----------------------------------------------------------------row_info - template struct row_info - { - int x1, x2; - T* ptr; - row_info() {} - row_info(int x1_, int x2_, T* ptr_) : x1(x1_), x2(x2_), ptr(ptr_) {} - }; - - //----------------------------------------------------------const_row_info - template struct const_row_info - { - int x1, x2; - const T* ptr; - const_row_info() {} - const_row_info(int x1_, int x2_, const T* ptr_) : - x1(x1_), x2(x2_), ptr(ptr_) {} - }; - - //------------------------------------------------------------is_equal_eps - template inline bool is_equal_eps(T v1, T v2, T epsilon) - { - return fabs(v1 - v2) <= double(epsilon); - } - -} - - -#endif - diff --git a/uppdev/aggdraw/agg_bezier_arc.cpp b/uppdev/aggdraw/agg_bezier_arc.cpp deleted file mode 100644 index 2140783ac..000000000 --- a/uppdev/aggdraw/agg_bezier_arc.cpp +++ /dev/null @@ -1,261 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#include -#include "agg_bezier_arc.h" - - -namespace agg -{ - - // This epsilon is used to prevent us from adding degenerate curves - // (converging to a single point). - // The value isn't very critical. Function arc_to_bezier() has a limit - // of the sweep_angle. If fabs(sweep_angle) exceeds pi/2 the curve - // becomes inaccurate. But slight exceeding is quite appropriate. - //-------------------------------------------------bezier_arc_angle_epsilon - const double bezier_arc_angle_epsilon = 0.01; - - //------------------------------------------------------------arc_to_bezier - void arc_to_bezier(double cx, double cy, double rx, double ry, - double start_angle, double sweep_angle, - double* curve) - { - double x0 = cos(sweep_angle / 2.0); - double y0 = sin(sweep_angle / 2.0); - double tx = (1.0 - x0) * 4.0 / 3.0; - double ty = y0 - tx * x0 / y0; - double px[4]; - double py[4]; - px[0] = x0; - py[0] = -y0; - px[1] = x0 + tx; - py[1] = -ty; - px[2] = x0 + tx; - py[2] = ty; - px[3] = x0; - py[3] = y0; - - double sn = sin(start_angle + sweep_angle / 2.0); - double cs = cos(start_angle + sweep_angle / 2.0); - - unsigned i; - for(i = 0; i < 4; i++) - { - curve[i * 2] = cx + rx * (px[i] * cs - py[i] * sn); - curve[i * 2 + 1] = cy + ry * (px[i] * sn + py[i] * cs); - } - } - - - - //------------------------------------------------------------------------ - void bezier_arc::init(double x, double y, - double rx, double ry, - double start_angle, - double sweep_angle) - { - start_angle = fmod(start_angle, 2.0 * pi); - if(sweep_angle >= 2.0 * pi) sweep_angle = 2.0 * pi; - if(sweep_angle <= -2.0 * pi) sweep_angle = -2.0 * pi; - - if(fabs(sweep_angle) < 1e-10) - { - m_num_vertices = 4; - m_cmd = path_cmd_line_to; - m_vertices[0] = x + rx * cos(start_angle); - m_vertices[1] = y + ry * sin(start_angle); - m_vertices[2] = x + rx * cos(start_angle + sweep_angle); - m_vertices[3] = y + ry * sin(start_angle + sweep_angle); - return; - } - - double total_sweep = 0.0; - double local_sweep = 0.0; - double prev_sweep; - m_num_vertices = 2; - m_cmd = path_cmd_curve4; - bool done = false; - do - { - if(sweep_angle < 0.0) - { - prev_sweep = total_sweep; - local_sweep = -pi * 0.5; - total_sweep -= pi * 0.5; - if(total_sweep <= sweep_angle + bezier_arc_angle_epsilon) - { - local_sweep = sweep_angle - prev_sweep; - done = true; - } - } - else - { - prev_sweep = total_sweep; - local_sweep = pi * 0.5; - total_sweep += pi * 0.5; - if(total_sweep >= sweep_angle - bezier_arc_angle_epsilon) - { - local_sweep = sweep_angle - prev_sweep; - done = true; - } - } - - arc_to_bezier(x, y, rx, ry, - start_angle, - local_sweep, - m_vertices + m_num_vertices - 2); - - m_num_vertices += 6; - start_angle += local_sweep; - } - while(!done && m_num_vertices < 26); - } - - - - - //-------------------------------------------------------------------- - void bezier_arc_svg::init(double x0, double y0, - double rx, double ry, - double angle, - bool large_arc_flag, - bool sweep_flag, - double x2, double y2) - { - m_radii_ok = true; - - if(rx < 0.0) rx = -rx; - if(ry < 0.0) ry = -rx; - - // Calculate the middle point between - // the current and the final points - //------------------------ - double dx2 = (x0 - x2) / 2.0; - double dy2 = (y0 - y2) / 2.0; - - double cos_a = cos(angle); - double sin_a = sin(angle); - - // Calculate (x1, y1) - //------------------------ - double x1 = cos_a * dx2 + sin_a * dy2; - double y1 = -sin_a * dx2 + cos_a * dy2; - - // Ensure radii are large enough - //------------------------ - double prx = rx * rx; - double pry = ry * ry; - double px1 = x1 * x1; - double py1 = y1 * y1; - - // Check that radii are large enough - //------------------------ - double radii_check = px1/prx + py1/pry; - if(radii_check > 1.0) - { - rx = sqrt(radii_check) * rx; - ry = sqrt(radii_check) * ry; - prx = rx * rx; - pry = ry * ry; - if(radii_check > 10.0) m_radii_ok = false; - } - - // Calculate (cx1, cy1) - //------------------------ - double sign = (large_arc_flag == sweep_flag) ? -1.0 : 1.0; - double sq = (prx*pry - prx*py1 - pry*px1) / (prx*py1 + pry*px1); - double coef = sign * sqrt((sq < 0) ? 0 : sq); - double cx1 = coef * ((rx * y1) / ry); - double cy1 = coef * -((ry * x1) / rx); - - // - // Calculate (cx, cy) from (cx1, cy1) - //------------------------ - double sx2 = (x0 + x2) / 2.0; - double sy2 = (y0 + y2) / 2.0; - double cx = sx2 + (cos_a * cx1 - sin_a * cy1); - double cy = sy2 + (sin_a * cx1 + cos_a * cy1); - - // Calculate the start_angle (angle1) and the sweep_angle (dangle) - //------------------------ - double ux = (x1 - cx1) / rx; - double uy = (y1 - cy1) / ry; - double vx = (-x1 - cx1) / rx; - double vy = (-y1 - cy1) / ry; - double p, n; - - // Calculate the angle start - //------------------------ - n = sqrt(ux*ux + uy*uy); - p = ux; // (1 * ux) + (0 * uy) - sign = (uy < 0) ? -1.0 : 1.0; - double v = p / n; - if(v < -1.0) v = -1.0; - if(v > 1.0) v = 1.0; - double start_angle = sign * acos(v); - - // Calculate the sweep angle - //------------------------ - n = sqrt((ux*ux + uy*uy) * (vx*vx + vy*vy)); - p = ux * vx + uy * vy; - sign = (ux * vy - uy * vx < 0) ? -1.0 : 1.0; - v = p / n; - if(v < -1.0) v = -1.0; - if(v > 1.0) v = 1.0; - double sweep_angle = sign * acos(v); - if(!sweep_flag && sweep_angle > 0) - { - sweep_angle -= pi * 2.0; - } - else - if (sweep_flag && sweep_angle < 0) - { - sweep_angle += pi * 2.0; - } - - // We can now build and transform the resulting arc - //------------------------ - m_arc.init(0.0, 0.0, rx, ry, start_angle, sweep_angle); - trans_affine mtx = trans_affine_rotation(angle); - mtx *= trans_affine_translation(cx, cy); - - for(unsigned i = 2; i < m_arc.num_vertices()-2; i += 2) - { - mtx.transform(m_arc.vertices() + i, m_arc.vertices() + i + 1); - } - - // We must make sure that the starting and ending points - // exactly coincide with the initial (x0,y0) and (x2,y2) - m_arc.vertices()[0] = x0; - m_arc.vertices()[1] = y0; - if(m_arc.num_vertices() > 2) - { - m_arc.vertices()[m_arc.num_vertices() - 2] = x2; - m_arc.vertices()[m_arc.num_vertices() - 1] = y2; - } - } - - -} diff --git a/uppdev/aggdraw/agg_bezier_arc.h b/uppdev/aggdraw/agg_bezier_arc.h deleted file mode 100644 index faca7b691..000000000 --- a/uppdev/aggdraw/agg_bezier_arc.h +++ /dev/null @@ -1,163 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_BEZIER_ARC_INCLUDED -#define AGG_BEZIER_ARC_INCLUDED - -#include "agg_conv_transform.h" - -namespace agg -{ - - //----------------------------------------------------------------------- - void arc_to_bezier(double cx, double cy, double rx, double ry, - double start_angle, double sweep_angle, - double* curve); - - - //==============================================================bezier_arc - // - // See implemantaion agg_bezier_arc.cpp - // - class bezier_arc - { - public: - //-------------------------------------------------------------------- - bezier_arc() : m_vertex(26), m_num_vertices(0), m_cmd(path_cmd_line_to) {} - bezier_arc(double x, double y, - double rx, double ry, - double start_angle, - double sweep_angle) - { - init(x, y, rx, ry, start_angle, sweep_angle); - } - - //-------------------------------------------------------------------- - void init(double x, double y, - double rx, double ry, - double start_angle, - double sweep_angle); - - //-------------------------------------------------------------------- - void rewind(unsigned) - { - m_vertex = 0; - } - - //-------------------------------------------------------------------- - unsigned vertex(double* x, double* y) - { - if(m_vertex >= m_num_vertices) return path_cmd_stop; - *x = m_vertices[m_vertex]; - *y = m_vertices[m_vertex + 1]; - m_vertex += 2; - return (m_vertex == 2) ? path_cmd_move_to : m_cmd; - } - - // Supplemantary functions. num_vertices() actually returns doubled - // number of vertices. That is, for 1 vertex it returns 2. - //-------------------------------------------------------------------- - unsigned num_vertices() const { return m_num_vertices; } - const double* vertices() const { return m_vertices; } - double* vertices() { return m_vertices; } - - private: - unsigned m_vertex; - unsigned m_num_vertices; - double m_vertices[26]; - unsigned m_cmd; - }; - - - - //==========================================================bezier_arc_svg - // Compute an SVG-style bezier arc. - // - // Computes an elliptical arc from (x1, y1) to (x2, y2). The size and - // orientation of the ellipse are defined by two radii (rx, ry) - // and an x-axis-rotation, which indicates how the ellipse as a whole - // is rotated relative to the current coordinate system. The center - // (cx, cy) of the ellipse is calculated automatically to satisfy the - // constraints imposed by the other parameters. - // large-arc-flag and sweep-flag contribute to the automatic calculations - // and help determine how the arc is drawn. - class bezier_arc_svg - { - public: - //-------------------------------------------------------------------- - bezier_arc_svg() : m_arc(), m_radii_ok(false) {} - - bezier_arc_svg(double x1, double y1, - double rx, double ry, - double angle, - bool large_arc_flag, - bool sweep_flag, - double x2, double y2) : - m_arc(), m_radii_ok(false) - { - init(x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2); - } - - //-------------------------------------------------------------------- - void init(double x1, double y1, - double rx, double ry, - double angle, - bool large_arc_flag, - bool sweep_flag, - double x2, double y2); - - //-------------------------------------------------------------------- - bool radii_ok() const { return m_radii_ok; } - - //-------------------------------------------------------------------- - void rewind(unsigned) - { - m_arc.rewind(0); - } - - //-------------------------------------------------------------------- - unsigned vertex(double* x, double* y) - { - return m_arc.vertex(x, y); - } - - // Supplemantary functions. num_vertices() actually returns doubled - // number of vertices. That is, for 1 vertex it returns 2. - //-------------------------------------------------------------------- - unsigned num_vertices() const { return m_arc.num_vertices(); } - const double* vertices() const { return m_arc.vertices(); } - double* vertices() { return m_arc.vertices(); } - - private: - bezier_arc m_arc; - bool m_radii_ok; - }; - - - - -} - - -#endif diff --git a/uppdev/aggdraw/agg_bitset_iterator.h b/uppdev/aggdraw/agg_bitset_iterator.h deleted file mode 100644 index 1337f7819..000000000 --- a/uppdev/aggdraw/agg_bitset_iterator.h +++ /dev/null @@ -1,63 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_BITSET_ITERATOR_INCLUDED -#define AGG_BITSET_ITERATOR_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - - class bitset_iterator - { - public: - bitset_iterator(const int8u* bits, unsigned offset = 0) : - m_bits(bits + (offset >> 3)), - m_mask(0x80 >> (offset & 7)) - {} - - void operator ++ () - { - m_mask >>= 1; - if(m_mask == 0) - { - ++m_bits; - m_mask = 0x80; - } - } - - unsigned bit() const - { - return (*m_bits) & m_mask; - } - - private: - const int8u* m_bits; - int8u m_mask; - }; - -} - -#endif diff --git a/uppdev/aggdraw/agg_blur.h b/uppdev/aggdraw/agg_blur.h deleted file mode 100644 index 26c36a8d2..000000000 --- a/uppdev/aggdraw/agg_blur.h +++ /dev/null @@ -1,1303 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// The Stack Blur Algorithm was invented by Mario Klingemann, -// mario@quasimondo.com and described here: -// http://incubator.quasimondo.com/processing/fast_blur_deluxe.php -// (search phrase "Stackblur: Fast But Goodlooking"). -// The major improvement is that there's no more division table -// that was very expensive to create for large blur radii. Insted, -// for 8-bit per channel and radius not exceeding 254 the division is -// replaced by multiplication and shift. -// -//---------------------------------------------------------------------------- - -#ifndef AGG_BLUR_INCLUDED -#define AGG_BLUR_INCLUDED - -#include "agg_array.h" -#include "agg_pixfmt_transposer.h" - -namespace agg -{ - - template struct stack_blur_tables - { - static int16u const g_stack_blur8_mul[255]; - static int8u const g_stack_blur8_shr[255]; - }; - - //------------------------------------------------------------------------ - template - int16u const stack_blur_tables::g_stack_blur8_mul[255] = - { - 512,512,456,512,328,456,335,512,405,328,271,456,388,335,292,512, - 454,405,364,328,298,271,496,456,420,388,360,335,312,292,273,512, - 482,454,428,405,383,364,345,328,312,298,284,271,259,496,475,456, - 437,420,404,388,374,360,347,335,323,312,302,292,282,273,265,512, - 497,482,468,454,441,428,417,405,394,383,373,364,354,345,337,328, - 320,312,305,298,291,284,278,271,265,259,507,496,485,475,465,456, - 446,437,428,420,412,404,396,388,381,374,367,360,354,347,341,335, - 329,323,318,312,307,302,297,292,287,282,278,273,269,265,261,512, - 505,497,489,482,475,468,461,454,447,441,435,428,422,417,411,405, - 399,394,389,383,378,373,368,364,359,354,350,345,341,337,332,328, - 324,320,316,312,309,305,301,298,294,291,287,284,281,278,274,271, - 268,265,262,259,257,507,501,496,491,485,480,475,470,465,460,456, - 451,446,442,437,433,428,424,420,416,412,408,404,400,396,392,388, - 385,381,377,374,370,367,363,360,357,354,350,347,344,341,338,335, - 332,329,326,323,320,318,315,312,310,307,304,302,299,297,294,292, - 289,287,285,282,280,278,275,273,271,269,267,265,263,261,259 - }; - - //------------------------------------------------------------------------ - template - int8u const stack_blur_tables::g_stack_blur8_shr[255] = - { - 9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, - 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24 - }; - - - - //==============================================================stack_blur - template class stack_blur - { - public: - typedef ColorT color_type; - typedef CalculatorT calculator_type; - - //-------------------------------------------------------------------- - template void blur_x(Img& img, unsigned radius) - { - if(radius < 1) return; - - unsigned x, y, xp, i; - unsigned stack_ptr; - unsigned stack_start; - - color_type pix; - color_type* stack_pix; - calculator_type sum; - calculator_type sum_in; - calculator_type sum_out; - - unsigned w = img.width(); - unsigned h = img.height(); - unsigned wm = w - 1; - unsigned div = radius * 2 + 1; - - unsigned div_sum = (radius + 1) * (radius + 1); - unsigned mul_sum = 0; - unsigned shr_sum = 0; - unsigned max_val = color_type::base_mask; - - if(max_val <= 255 && radius < 255) - { - mul_sum = stack_blur_tables::g_stack_blur8_mul[radius]; - shr_sum = stack_blur_tables::g_stack_blur8_shr[radius]; - } - - m_buf.allocate(w, 128); - m_stack.allocate(div, 32); - - for(y = 0; y < h; y++) - { - sum.clear(); - sum_in.clear(); - sum_out.clear(); - - pix = img.pixel(0, y); - for(i = 0; i <= radius; i++) - { - m_stack[i] = pix; - sum.add(pix, i + 1); - sum_out.add(pix); - } - for(i = 1; i <= radius; i++) - { - pix = img.pixel((i > wm) ? wm : i, y); - m_stack[i + radius] = pix; - sum.add(pix, radius + 1 - i); - sum_in.add(pix); - } - - stack_ptr = radius; - for(x = 0; x < w; x++) - { - if(mul_sum) sum.calc_pix(m_buf[x], mul_sum, shr_sum); - else sum.calc_pix(m_buf[x], div_sum); - - sum.sub(sum_out); - - stack_start = stack_ptr + div - radius; - if(stack_start >= div) stack_start -= div; - stack_pix = &m_stack[stack_start]; - - sum_out.sub(*stack_pix); - - xp = x + radius + 1; - if(xp > wm) xp = wm; - pix = img.pixel(xp, y); - - *stack_pix = pix; - - sum_in.add(pix); - sum.add(sum_in); - - ++stack_ptr; - if(stack_ptr >= div) stack_ptr = 0; - stack_pix = &m_stack[stack_ptr]; - - sum_out.add(*stack_pix); - sum_in.sub(*stack_pix); - } - img.copy_color_hspan(0, y, w, &m_buf[0]); - } - } - - //-------------------------------------------------------------------- - template void blur_y(Img& img, unsigned radius) - { - pixfmt_transposer img2(img); - blur_x(img2, radius); - } - - //-------------------------------------------------------------------- - template void blur(Img& img, unsigned radius) - { - blur_x(img, radius); - pixfmt_transposer img2(img); - blur_x(img2, radius); - } - - private: - pod_vector m_buf; - pod_vector m_stack; - }; - - //====================================================stack_blur_calc_rgba - template struct stack_blur_calc_rgba - { - typedef T value_type; - value_type r,g,b,a; - - AGG_INLINE void clear() - { - r = g = b = a = 0; - } - - template AGG_INLINE void add(const ArgT& v) - { - r += v.r; - g += v.g; - b += v.b; - a += v.a; - } - - template AGG_INLINE void add(const ArgT& v, unsigned k) - { - r += v.r * k; - g += v.g * k; - b += v.b * k; - a += v.a * k; - } - - template AGG_INLINE void sub(const ArgT& v) - { - r -= v.r; - g -= v.g; - b -= v.b; - a -= v.a; - } - - template AGG_INLINE void calc_pix(ArgT& v, unsigned div) - { - typedef typename ArgT::value_type value_type; - v.r = value_type(r / div); - v.g = value_type(g / div); - v.b = value_type(b / div); - v.a = value_type(a / div); - } - - template - AGG_INLINE void calc_pix(ArgT& v, unsigned mul, unsigned shr) - { - typedef typename ArgT::value_type value_type; - v.r = value_type((r * mul) >> shr); - v.g = value_type((g * mul) >> shr); - v.b = value_type((b * mul) >> shr); - v.a = value_type((a * mul) >> shr); - } - }; - - - //=====================================================stack_blur_calc_rgb - template struct stack_blur_calc_rgb - { - typedef T value_type; - value_type r,g,b; - - AGG_INLINE void clear() - { - r = g = b = 0; - } - - template AGG_INLINE void add(const ArgT& v) - { - r += v.r; - g += v.g; - b += v.b; - } - - template AGG_INLINE void add(const ArgT& v, unsigned k) - { - r += v.r * k; - g += v.g * k; - b += v.b * k; - } - - template AGG_INLINE void sub(const ArgT& v) - { - r -= v.r; - g -= v.g; - b -= v.b; - } - - template AGG_INLINE void calc_pix(ArgT& v, unsigned div) - { - typedef typename ArgT::value_type value_type; - v.r = value_type(r / div); - v.g = value_type(g / div); - v.b = value_type(b / div); - } - - template - AGG_INLINE void calc_pix(ArgT& v, unsigned mul, unsigned shr) - { - typedef typename ArgT::value_type value_type; - v.r = value_type((r * mul) >> shr); - v.g = value_type((g * mul) >> shr); - v.b = value_type((b * mul) >> shr); - } - }; - - - //====================================================stack_blur_calc_gray - template struct stack_blur_calc_gray - { - typedef T value_type; - value_type v; - - AGG_INLINE void clear() - { - v = 0; - } - - template AGG_INLINE void add(const ArgT& a) - { - v += a.v; - } - - template AGG_INLINE void add(const ArgT& a, unsigned k) - { - v += a.v * k; - } - - template AGG_INLINE void sub(const ArgT& a) - { - v -= a.v; - } - - template AGG_INLINE void calc_pix(ArgT& a, unsigned div) - { - typedef typename ArgT::value_type value_type; - a.v = value_type(v / div); - } - - template - AGG_INLINE void calc_pix(ArgT& a, unsigned mul, unsigned shr) - { - typedef typename ArgT::value_type value_type; - a.v = value_type((v * mul) >> shr); - } - }; - - - - //========================================================stack_blur_gray8 - template - void stack_blur_gray8(Img& img, unsigned rx, unsigned ry) - { - unsigned x, y, xp, yp, i; - unsigned stack_ptr; - unsigned stack_start; - - const int8u* src_pix_ptr; - int8u* dst_pix_ptr; - unsigned pix; - unsigned stack_pix; - unsigned sum; - unsigned sum_in; - unsigned sum_out; - - unsigned w = img.width(); - unsigned h = img.height(); - unsigned wm = w - 1; - unsigned hm = h - 1; - - unsigned div; - unsigned mul_sum; - unsigned shr_sum; - - pod_vector stack; - - if(rx > 0) - { - if(rx > 254) rx = 254; - div = rx * 2 + 1; - mul_sum = stack_blur_tables::g_stack_blur8_mul[rx]; - shr_sum = stack_blur_tables::g_stack_blur8_shr[rx]; - stack.allocate(div); - - for(y = 0; y < h; y++) - { - sum = sum_in = sum_out = 0; - - src_pix_ptr = img.pix_ptr(0, y); - pix = *src_pix_ptr; - for(i = 0; i <= rx; i++) - { - stack[i] = pix; - sum += pix * (i + 1); - sum_out += pix; - } - for(i = 1; i <= rx; i++) - { - if(i <= wm) src_pix_ptr += Img::pix_step; - pix = *src_pix_ptr; - stack[i + rx] = pix; - sum += pix * (rx + 1 - i); - sum_in += pix; - } - - stack_ptr = rx; - xp = rx; - if(xp > wm) xp = wm; - src_pix_ptr = img.pix_ptr(xp, y); - dst_pix_ptr = img.pix_ptr(0, y); - for(x = 0; x < w; x++) - { - *dst_pix_ptr = (sum * mul_sum) >> shr_sum; - dst_pix_ptr += Img::pix_step; - - sum -= sum_out; - - stack_start = stack_ptr + div - rx; - if(stack_start >= div) stack_start -= div; - sum_out -= stack[stack_start]; - - if(xp < wm) - { - src_pix_ptr += Img::pix_step; - pix = *src_pix_ptr; - ++xp; - } - - stack[stack_start] = pix; - - sum_in += pix; - sum += sum_in; - - ++stack_ptr; - if(stack_ptr >= div) stack_ptr = 0; - stack_pix = stack[stack_ptr]; - - sum_out += stack_pix; - sum_in -= stack_pix; - } - } - } - - if(ry > 0) - { - if(ry > 254) ry = 254; - div = ry * 2 + 1; - mul_sum = stack_blur_tables::g_stack_blur8_mul[ry]; - shr_sum = stack_blur_tables::g_stack_blur8_shr[ry]; - stack.allocate(div); - - int stride = img.stride(); - for(x = 0; x < w; x++) - { - sum = sum_in = sum_out = 0; - - src_pix_ptr = img.pix_ptr(x, 0); - pix = *src_pix_ptr; - for(i = 0; i <= ry; i++) - { - stack[i] = pix; - sum += pix * (i + 1); - sum_out += pix; - } - for(i = 1; i <= ry; i++) - { - if(i <= hm) src_pix_ptr += stride; - pix = *src_pix_ptr; - stack[i + ry] = pix; - sum += pix * (ry + 1 - i); - sum_in += pix; - } - - stack_ptr = ry; - yp = ry; - if(yp > hm) yp = hm; - src_pix_ptr = img.pix_ptr(x, yp); - dst_pix_ptr = img.pix_ptr(x, 0); - for(y = 0; y < h; y++) - { - *dst_pix_ptr = (sum * mul_sum) >> shr_sum; - dst_pix_ptr += stride; - - sum -= sum_out; - - stack_start = stack_ptr + div - ry; - if(stack_start >= div) stack_start -= div; - sum_out -= stack[stack_start]; - - if(yp < hm) - { - src_pix_ptr += stride; - pix = *src_pix_ptr; - ++yp; - } - - stack[stack_start] = pix; - - sum_in += pix; - sum += sum_in; - - ++stack_ptr; - if(stack_ptr >= div) stack_ptr = 0; - stack_pix = stack[stack_ptr]; - - sum_out += stack_pix; - sum_in -= stack_pix; - } - } - } - } - - - - //========================================================stack_blur_rgb24 - template - void stack_blur_rgb24(Img& img, unsigned rx, unsigned ry) - { - typedef typename Img::color_type color_type; - typedef typename Img::order_type order_type; - enum order_e - { - R = order_type::R, - G = order_type::G, - B = order_type::B - }; - - unsigned x, y, xp, yp, i; - unsigned stack_ptr; - unsigned stack_start; - - const int8u* src_pix_ptr; - int8u* dst_pix_ptr; - color_type* stack_pix_ptr; - - unsigned sum_r; - unsigned sum_g; - unsigned sum_b; - unsigned sum_in_r; - unsigned sum_in_g; - unsigned sum_in_b; - unsigned sum_out_r; - unsigned sum_out_g; - unsigned sum_out_b; - - unsigned w = img.width(); - unsigned h = img.height(); - unsigned wm = w - 1; - unsigned hm = h - 1; - - unsigned div; - unsigned mul_sum; - unsigned shr_sum; - - pod_vector stack; - - if(rx > 0) - { - if(rx > 254) rx = 254; - div = rx * 2 + 1; - mul_sum = stack_blur_tables::g_stack_blur8_mul[rx]; - shr_sum = stack_blur_tables::g_stack_blur8_shr[rx]; - stack.allocate(div); - - for(y = 0; y < h; y++) - { - sum_r = - sum_g = - sum_b = - sum_in_r = - sum_in_g = - sum_in_b = - sum_out_r = - sum_out_g = - sum_out_b = 0; - - src_pix_ptr = img.pix_ptr(0, y); - for(i = 0; i <= rx; i++) - { - stack_pix_ptr = &stack[i]; - stack_pix_ptr->r = src_pix_ptr[R]; - stack_pix_ptr->g = src_pix_ptr[G]; - stack_pix_ptr->b = src_pix_ptr[B]; - sum_r += src_pix_ptr[R] * (i + 1); - sum_g += src_pix_ptr[G] * (i + 1); - sum_b += src_pix_ptr[B] * (i + 1); - sum_out_r += src_pix_ptr[R]; - sum_out_g += src_pix_ptr[G]; - sum_out_b += src_pix_ptr[B]; - } - for(i = 1; i <= rx; i++) - { - if(i <= wm) src_pix_ptr += Img::pix_width; - stack_pix_ptr = &stack[i + rx]; - stack_pix_ptr->r = src_pix_ptr[R]; - stack_pix_ptr->g = src_pix_ptr[G]; - stack_pix_ptr->b = src_pix_ptr[B]; - sum_r += src_pix_ptr[R] * (rx + 1 - i); - sum_g += src_pix_ptr[G] * (rx + 1 - i); - sum_b += src_pix_ptr[B] * (rx + 1 - i); - sum_in_r += src_pix_ptr[R]; - sum_in_g += src_pix_ptr[G]; - sum_in_b += src_pix_ptr[B]; - } - - stack_ptr = rx; - xp = rx; - if(xp > wm) xp = wm; - src_pix_ptr = img.pix_ptr(xp, y); - dst_pix_ptr = img.pix_ptr(0, y); - for(x = 0; x < w; x++) - { - dst_pix_ptr[R] = (sum_r * mul_sum) >> shr_sum; - dst_pix_ptr[G] = (sum_g * mul_sum) >> shr_sum; - dst_pix_ptr[B] = (sum_b * mul_sum) >> shr_sum; - dst_pix_ptr += Img::pix_width; - - sum_r -= sum_out_r; - sum_g -= sum_out_g; - sum_b -= sum_out_b; - - stack_start = stack_ptr + div - rx; - if(stack_start >= div) stack_start -= div; - stack_pix_ptr = &stack[stack_start]; - - sum_out_r -= stack_pix_ptr->r; - sum_out_g -= stack_pix_ptr->g; - sum_out_b -= stack_pix_ptr->b; - - if(xp < wm) - { - src_pix_ptr += Img::pix_width; - ++xp; - } - - stack_pix_ptr->r = src_pix_ptr[R]; - stack_pix_ptr->g = src_pix_ptr[G]; - stack_pix_ptr->b = src_pix_ptr[B]; - - sum_in_r += src_pix_ptr[R]; - sum_in_g += src_pix_ptr[G]; - sum_in_b += src_pix_ptr[B]; - sum_r += sum_in_r; - sum_g += sum_in_g; - sum_b += sum_in_b; - - ++stack_ptr; - if(stack_ptr >= div) stack_ptr = 0; - stack_pix_ptr = &stack[stack_ptr]; - - sum_out_r += stack_pix_ptr->r; - sum_out_g += stack_pix_ptr->g; - sum_out_b += stack_pix_ptr->b; - sum_in_r -= stack_pix_ptr->r; - sum_in_g -= stack_pix_ptr->g; - sum_in_b -= stack_pix_ptr->b; - } - } - } - - if(ry > 0) - { - if(ry > 254) ry = 254; - div = ry * 2 + 1; - mul_sum = stack_blur_tables::g_stack_blur8_mul[ry]; - shr_sum = stack_blur_tables::g_stack_blur8_shr[ry]; - stack.allocate(div); - - int stride = img.stride(); - for(x = 0; x < w; x++) - { - sum_r = - sum_g = - sum_b = - sum_in_r = - sum_in_g = - sum_in_b = - sum_out_r = - sum_out_g = - sum_out_b = 0; - - src_pix_ptr = img.pix_ptr(x, 0); - for(i = 0; i <= ry; i++) - { - stack_pix_ptr = &stack[i]; - stack_pix_ptr->r = src_pix_ptr[R]; - stack_pix_ptr->g = src_pix_ptr[G]; - stack_pix_ptr->b = src_pix_ptr[B]; - sum_r += src_pix_ptr[R] * (i + 1); - sum_g += src_pix_ptr[G] * (i + 1); - sum_b += src_pix_ptr[B] * (i + 1); - sum_out_r += src_pix_ptr[R]; - sum_out_g += src_pix_ptr[G]; - sum_out_b += src_pix_ptr[B]; - } - for(i = 1; i <= ry; i++) - { - if(i <= hm) src_pix_ptr += stride; - stack_pix_ptr = &stack[i + ry]; - stack_pix_ptr->r = src_pix_ptr[R]; - stack_pix_ptr->g = src_pix_ptr[G]; - stack_pix_ptr->b = src_pix_ptr[B]; - sum_r += src_pix_ptr[R] * (ry + 1 - i); - sum_g += src_pix_ptr[G] * (ry + 1 - i); - sum_b += src_pix_ptr[B] * (ry + 1 - i); - sum_in_r += src_pix_ptr[R]; - sum_in_g += src_pix_ptr[G]; - sum_in_b += src_pix_ptr[B]; - } - - stack_ptr = ry; - yp = ry; - if(yp > hm) yp = hm; - src_pix_ptr = img.pix_ptr(x, yp); - dst_pix_ptr = img.pix_ptr(x, 0); - for(y = 0; y < h; y++) - { - dst_pix_ptr[R] = (sum_r * mul_sum) >> shr_sum; - dst_pix_ptr[G] = (sum_g * mul_sum) >> shr_sum; - dst_pix_ptr[B] = (sum_b * mul_sum) >> shr_sum; - dst_pix_ptr += stride; - - sum_r -= sum_out_r; - sum_g -= sum_out_g; - sum_b -= sum_out_b; - - stack_start = stack_ptr + div - ry; - if(stack_start >= div) stack_start -= div; - - stack_pix_ptr = &stack[stack_start]; - sum_out_r -= stack_pix_ptr->r; - sum_out_g -= stack_pix_ptr->g; - sum_out_b -= stack_pix_ptr->b; - - if(yp < hm) - { - src_pix_ptr += stride; - ++yp; - } - - stack_pix_ptr->r = src_pix_ptr[R]; - stack_pix_ptr->g = src_pix_ptr[G]; - stack_pix_ptr->b = src_pix_ptr[B]; - - sum_in_r += src_pix_ptr[R]; - sum_in_g += src_pix_ptr[G]; - sum_in_b += src_pix_ptr[B]; - sum_r += sum_in_r; - sum_g += sum_in_g; - sum_b += sum_in_b; - - ++stack_ptr; - if(stack_ptr >= div) stack_ptr = 0; - stack_pix_ptr = &stack[stack_ptr]; - - sum_out_r += stack_pix_ptr->r; - sum_out_g += stack_pix_ptr->g; - sum_out_b += stack_pix_ptr->b; - sum_in_r -= stack_pix_ptr->r; - sum_in_g -= stack_pix_ptr->g; - sum_in_b -= stack_pix_ptr->b; - } - } - } - } - - - - //=======================================================stack_blur_rgba32 - template - void stack_blur_rgba32(Img& img, unsigned rx, unsigned ry) - { - typedef typename Img::color_type color_type; - typedef typename Img::order_type order_type; - enum order_e - { - R = order_type::R, - G = order_type::G, - B = order_type::B, - A = order_type::A - }; - - unsigned x, y, xp, yp, i; - unsigned stack_ptr; - unsigned stack_start; - - const int8u* src_pix_ptr; - int8u* dst_pix_ptr; - color_type* stack_pix_ptr; - - unsigned sum_r; - unsigned sum_g; - unsigned sum_b; - unsigned sum_a; - unsigned sum_in_r; - unsigned sum_in_g; - unsigned sum_in_b; - unsigned sum_in_a; - unsigned sum_out_r; - unsigned sum_out_g; - unsigned sum_out_b; - unsigned sum_out_a; - - unsigned w = img.width(); - unsigned h = img.height(); - unsigned wm = w - 1; - unsigned hm = h - 1; - - unsigned div; - unsigned mul_sum; - unsigned shr_sum; - - pod_vector stack; - - if(rx > 0) - { - if(rx > 254) rx = 254; - div = rx * 2 + 1; - mul_sum = stack_blur_tables::g_stack_blur8_mul[rx]; - shr_sum = stack_blur_tables::g_stack_blur8_shr[rx]; - stack.allocate(div); - - for(y = 0; y < h; y++) - { - sum_r = - sum_g = - sum_b = - sum_a = - sum_in_r = - sum_in_g = - sum_in_b = - sum_in_a = - sum_out_r = - sum_out_g = - sum_out_b = - sum_out_a = 0; - - src_pix_ptr = img.pix_ptr(0, y); - for(i = 0; i <= rx; i++) - { - stack_pix_ptr = &stack[i]; - stack_pix_ptr->r = src_pix_ptr[R]; - stack_pix_ptr->g = src_pix_ptr[G]; - stack_pix_ptr->b = src_pix_ptr[B]; - stack_pix_ptr->a = src_pix_ptr[A]; - sum_r += src_pix_ptr[R] * (i + 1); - sum_g += src_pix_ptr[G] * (i + 1); - sum_b += src_pix_ptr[B] * (i + 1); - sum_a += src_pix_ptr[A] * (i + 1); - sum_out_r += src_pix_ptr[R]; - sum_out_g += src_pix_ptr[G]; - sum_out_b += src_pix_ptr[B]; - sum_out_a += src_pix_ptr[A]; - } - for(i = 1; i <= rx; i++) - { - if(i <= wm) src_pix_ptr += Img::pix_width; - stack_pix_ptr = &stack[i + rx]; - stack_pix_ptr->r = src_pix_ptr[R]; - stack_pix_ptr->g = src_pix_ptr[G]; - stack_pix_ptr->b = src_pix_ptr[B]; - stack_pix_ptr->a = src_pix_ptr[A]; - sum_r += src_pix_ptr[R] * (rx + 1 - i); - sum_g += src_pix_ptr[G] * (rx + 1 - i); - sum_b += src_pix_ptr[B] * (rx + 1 - i); - sum_a += src_pix_ptr[A] * (rx + 1 - i); - sum_in_r += src_pix_ptr[R]; - sum_in_g += src_pix_ptr[G]; - sum_in_b += src_pix_ptr[B]; - sum_in_a += src_pix_ptr[A]; - } - - stack_ptr = rx; - xp = rx; - if(xp > wm) xp = wm; - src_pix_ptr = img.pix_ptr(xp, y); - dst_pix_ptr = img.pix_ptr(0, y); - for(x = 0; x < w; x++) - { - dst_pix_ptr[R] = (sum_r * mul_sum) >> shr_sum; - dst_pix_ptr[G] = (sum_g * mul_sum) >> shr_sum; - dst_pix_ptr[B] = (sum_b * mul_sum) >> shr_sum; - dst_pix_ptr[A] = (sum_a * mul_sum) >> shr_sum; - dst_pix_ptr += Img::pix_width; - - sum_r -= sum_out_r; - sum_g -= sum_out_g; - sum_b -= sum_out_b; - sum_a -= sum_out_a; - - stack_start = stack_ptr + div - rx; - if(stack_start >= div) stack_start -= div; - stack_pix_ptr = &stack[stack_start]; - - sum_out_r -= stack_pix_ptr->r; - sum_out_g -= stack_pix_ptr->g; - sum_out_b -= stack_pix_ptr->b; - sum_out_a -= stack_pix_ptr->a; - - if(xp < wm) - { - src_pix_ptr += Img::pix_width; - ++xp; - } - - stack_pix_ptr->r = src_pix_ptr[R]; - stack_pix_ptr->g = src_pix_ptr[G]; - stack_pix_ptr->b = src_pix_ptr[B]; - stack_pix_ptr->a = src_pix_ptr[A]; - - sum_in_r += src_pix_ptr[R]; - sum_in_g += src_pix_ptr[G]; - sum_in_b += src_pix_ptr[B]; - sum_in_a += src_pix_ptr[A]; - sum_r += sum_in_r; - sum_g += sum_in_g; - sum_b += sum_in_b; - sum_a += sum_in_a; - - ++stack_ptr; - if(stack_ptr >= div) stack_ptr = 0; - stack_pix_ptr = &stack[stack_ptr]; - - sum_out_r += stack_pix_ptr->r; - sum_out_g += stack_pix_ptr->g; - sum_out_b += stack_pix_ptr->b; - sum_out_a += stack_pix_ptr->a; - sum_in_r -= stack_pix_ptr->r; - sum_in_g -= stack_pix_ptr->g; - sum_in_b -= stack_pix_ptr->b; - sum_in_a -= stack_pix_ptr->a; - } - } - } - - if(ry > 0) - { - if(ry > 254) ry = 254; - div = ry * 2 + 1; - mul_sum = stack_blur_tables::g_stack_blur8_mul[ry]; - shr_sum = stack_blur_tables::g_stack_blur8_shr[ry]; - stack.allocate(div); - - int stride = img.stride(); - for(x = 0; x < w; x++) - { - sum_r = - sum_g = - sum_b = - sum_a = - sum_in_r = - sum_in_g = - sum_in_b = - sum_in_a = - sum_out_r = - sum_out_g = - sum_out_b = - sum_out_a = 0; - - src_pix_ptr = img.pix_ptr(x, 0); - for(i = 0; i <= ry; i++) - { - stack_pix_ptr = &stack[i]; - stack_pix_ptr->r = src_pix_ptr[R]; - stack_pix_ptr->g = src_pix_ptr[G]; - stack_pix_ptr->b = src_pix_ptr[B]; - stack_pix_ptr->a = src_pix_ptr[A]; - sum_r += src_pix_ptr[R] * (i + 1); - sum_g += src_pix_ptr[G] * (i + 1); - sum_b += src_pix_ptr[B] * (i + 1); - sum_a += src_pix_ptr[A] * (i + 1); - sum_out_r += src_pix_ptr[R]; - sum_out_g += src_pix_ptr[G]; - sum_out_b += src_pix_ptr[B]; - sum_out_a += src_pix_ptr[A]; - } - for(i = 1; i <= ry; i++) - { - if(i <= hm) src_pix_ptr += stride; - stack_pix_ptr = &stack[i + ry]; - stack_pix_ptr->r = src_pix_ptr[R]; - stack_pix_ptr->g = src_pix_ptr[G]; - stack_pix_ptr->b = src_pix_ptr[B]; - stack_pix_ptr->a = src_pix_ptr[A]; - sum_r += src_pix_ptr[R] * (ry + 1 - i); - sum_g += src_pix_ptr[G] * (ry + 1 - i); - sum_b += src_pix_ptr[B] * (ry + 1 - i); - sum_a += src_pix_ptr[A] * (ry + 1 - i); - sum_in_r += src_pix_ptr[R]; - sum_in_g += src_pix_ptr[G]; - sum_in_b += src_pix_ptr[B]; - sum_in_a += src_pix_ptr[A]; - } - - stack_ptr = ry; - yp = ry; - if(yp > hm) yp = hm; - src_pix_ptr = img.pix_ptr(x, yp); - dst_pix_ptr = img.pix_ptr(x, 0); - for(y = 0; y < h; y++) - { - dst_pix_ptr[R] = (sum_r * mul_sum) >> shr_sum; - dst_pix_ptr[G] = (sum_g * mul_sum) >> shr_sum; - dst_pix_ptr[B] = (sum_b * mul_sum) >> shr_sum; - dst_pix_ptr[A] = (sum_a * mul_sum) >> shr_sum; - dst_pix_ptr += stride; - - sum_r -= sum_out_r; - sum_g -= sum_out_g; - sum_b -= sum_out_b; - sum_a -= sum_out_a; - - stack_start = stack_ptr + div - ry; - if(stack_start >= div) stack_start -= div; - - stack_pix_ptr = &stack[stack_start]; - sum_out_r -= stack_pix_ptr->r; - sum_out_g -= stack_pix_ptr->g; - sum_out_b -= stack_pix_ptr->b; - sum_out_a -= stack_pix_ptr->a; - - if(yp < hm) - { - src_pix_ptr += stride; - ++yp; - } - - stack_pix_ptr->r = src_pix_ptr[R]; - stack_pix_ptr->g = src_pix_ptr[G]; - stack_pix_ptr->b = src_pix_ptr[B]; - stack_pix_ptr->a = src_pix_ptr[A]; - - sum_in_r += src_pix_ptr[R]; - sum_in_g += src_pix_ptr[G]; - sum_in_b += src_pix_ptr[B]; - sum_in_a += src_pix_ptr[A]; - sum_r += sum_in_r; - sum_g += sum_in_g; - sum_b += sum_in_b; - sum_a += sum_in_a; - - ++stack_ptr; - if(stack_ptr >= div) stack_ptr = 0; - stack_pix_ptr = &stack[stack_ptr]; - - sum_out_r += stack_pix_ptr->r; - sum_out_g += stack_pix_ptr->g; - sum_out_b += stack_pix_ptr->b; - sum_out_a += stack_pix_ptr->a; - sum_in_r -= stack_pix_ptr->r; - sum_in_g -= stack_pix_ptr->g; - sum_in_b -= stack_pix_ptr->b; - sum_in_a -= stack_pix_ptr->a; - } - } - } - } - - - - //===========================================================recursive_blur - template class recursive_blur - { - public: - typedef ColorT color_type; - typedef CalculatorT calculator_type; - typedef typename color_type::value_type value_type; - typedef typename calculator_type::value_type calc_type; - - //-------------------------------------------------------------------- - template void blur_x(Img& img, double radius) - { - if(radius < 0.62) return; - if(img.width() < 3) return; - - calc_type s = calc_type(radius * 0.5); - calc_type q = calc_type((s < 2.5) ? - 3.97156 - 4.14554 * sqrt(1 - 0.26891 * s) : - 0.98711 * s - 0.96330); - - calc_type q2 = calc_type(q * q); - calc_type q3 = calc_type(q2 * q); - - calc_type b0 = calc_type(1.0 / (1.578250 + - 2.444130 * q + - 1.428100 * q2 + - 0.422205 * q3)); - - calc_type b1 = calc_type( 2.44413 * q + - 2.85619 * q2 + - 1.26661 * q3); - - calc_type b2 = calc_type(-1.42810 * q2 + - -1.26661 * q3); - - calc_type b3 = calc_type(0.422205 * q3); - - calc_type b = calc_type(1 - (b1 + b2 + b3) * b0); - - b1 *= b0; - b2 *= b0; - b3 *= b0; - - int w = img.width(); - int h = img.height(); - int wm = w-1; - int x, y; - - m_sum1.allocate(w); - m_sum2.allocate(w); - m_buf.allocate(w); - - for(y = 0; y < h; y++) - { - calculator_type c; - c.from_pix(img.pixel(0, y)); - m_sum1[0].calc(b, b1, b2, b3, c, c, c, c); - c.from_pix(img.pixel(1, y)); - m_sum1[1].calc(b, b1, b2, b3, c, m_sum1[0], m_sum1[0], m_sum1[0]); - c.from_pix(img.pixel(2, y)); - m_sum1[2].calc(b, b1, b2, b3, c, m_sum1[1], m_sum1[0], m_sum1[0]); - - for(x = 3; x < w; ++x) - { - c.from_pix(img.pixel(x, y)); - m_sum1[x].calc(b, b1, b2, b3, c, m_sum1[x-1], m_sum1[x-2], m_sum1[x-3]); - } - - m_sum2[wm ].calc(b, b1, b2, b3, m_sum1[wm ], m_sum1[wm ], m_sum1[wm], m_sum1[wm]); - m_sum2[wm-1].calc(b, b1, b2, b3, m_sum1[wm-1], m_sum2[wm ], m_sum2[wm], m_sum2[wm]); - m_sum2[wm-2].calc(b, b1, b2, b3, m_sum1[wm-2], m_sum2[wm-1], m_sum2[wm], m_sum2[wm]); - m_sum2[wm ].to_pix(m_buf[wm ]); - m_sum2[wm-1].to_pix(m_buf[wm-1]); - m_sum2[wm-2].to_pix(m_buf[wm-2]); - - for(x = wm-3; x >= 0; --x) - { - m_sum2[x].calc(b, b1, b2, b3, m_sum1[x], m_sum2[x+1], m_sum2[x+2], m_sum2[x+3]); - m_sum2[x].to_pix(m_buf[x]); - } - img.copy_color_hspan(0, y, w, &m_buf[0]); - } - } - - //-------------------------------------------------------------------- - template void blur_y(Img& img, double radius) - { - pixfmt_transposer img2(img); - blur_x(img2, radius); - } - - //-------------------------------------------------------------------- - template void blur(Img& img, double radius) - { - blur_x(img, radius); - pixfmt_transposer img2(img); - blur_x(img2, radius); - } - - private: - agg::pod_vector m_sum1; - agg::pod_vector m_sum2; - agg::pod_vector m_buf; - }; - - - //=================================================recursive_blur_calc_rgba - template struct recursive_blur_calc_rgba - { - typedef T value_type; - typedef recursive_blur_calc_rgba self_type; - - value_type r,g,b,a; - - template - AGG_INLINE void from_pix(const ColorT& c) - { - r = c.r; - g = c.g; - b = c.b; - a = c.a; - } - - AGG_INLINE void calc(value_type b1, - value_type b2, - value_type b3, - value_type b4, - const self_type& c1, - const self_type& c2, - const self_type& c3, - const self_type& c4) - { - r = b1*c1.r + b2*c2.r + b3*c3.r + b4*c4.r; - g = b1*c1.g + b2*c2.g + b3*c3.g + b4*c4.g; - b = b1*c1.b + b2*c2.b + b3*c3.b + b4*c4.b; - a = b1*c1.a + b2*c2.a + b3*c3.a + b4*c4.a; - } - - template - AGG_INLINE void to_pix(ColorT& c) const - { - typedef typename ColorT::value_type cv_type; - c.r = (cv_type)uround(r); - c.g = (cv_type)uround(g); - c.b = (cv_type)uround(b); - c.a = (cv_type)uround(a); - } - }; - - - //=================================================recursive_blur_calc_rgb - template struct recursive_blur_calc_rgb - { - typedef T value_type; - typedef recursive_blur_calc_rgb self_type; - - value_type r,g,b; - - template - AGG_INLINE void from_pix(const ColorT& c) - { - r = c.r; - g = c.g; - b = c.b; - } - - AGG_INLINE void calc(value_type b1, - value_type b2, - value_type b3, - value_type b4, - const self_type& c1, - const self_type& c2, - const self_type& c3, - const self_type& c4) - { - r = b1*c1.r + b2*c2.r + b3*c3.r + b4*c4.r; - g = b1*c1.g + b2*c2.g + b3*c3.g + b4*c4.g; - b = b1*c1.b + b2*c2.b + b3*c3.b + b4*c4.b; - } - - template - AGG_INLINE void to_pix(ColorT& c) const - { - typedef typename ColorT::value_type cv_type; - c.r = (cv_type)uround(r); - c.g = (cv_type)uround(g); - c.b = (cv_type)uround(b); - } - }; - - - //================================================recursive_blur_calc_gray - template struct recursive_blur_calc_gray - { - typedef T value_type; - typedef recursive_blur_calc_gray self_type; - - value_type v; - - template - AGG_INLINE void from_pix(const ColorT& c) - { - v = c.v; - } - - AGG_INLINE void calc(value_type b1, - value_type b2, - value_type b3, - value_type b4, - const self_type& c1, - const self_type& c2, - const self_type& c3, - const self_type& c4) - { - v = b1*c1.v + b2*c2.v + b3*c3.v + b4*c4.v; - } - - template - AGG_INLINE void to_pix(ColorT& c) const - { - typedef typename ColorT::value_type cv_type; - c.v = (cv_type)uround(v); - } - }; - -} - - - - -#endif diff --git a/uppdev/aggdraw/agg_bounding_rect.h b/uppdev/aggdraw/agg_bounding_rect.h deleted file mode 100644 index eb869eb6d..000000000 --- a/uppdev/aggdraw/agg_bounding_rect.h +++ /dev/null @@ -1,122 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_BOUNDING_RECT_INCLUDED -#define AGG_BOUNDING_RECT_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - - //-----------------------------------------------------------bounding_rect - template - bool bounding_rect(VertexSource& vs, GetId& gi, - unsigned start, unsigned num, - CoordT* x1, CoordT* y1, CoordT* x2, CoordT* y2) - { - unsigned i; - double x; - double y; - bool first = true; - - *x1 = CoordT(1); - *y1 = CoordT(1); - *x2 = CoordT(0); - *y2 = CoordT(0); - - for(i = 0; i < num; i++) - { - vs.rewind(gi[start + i]); - unsigned cmd; - while(!is_stop(cmd = vs.vertex(&x, &y))) - { - if(is_vertex(cmd)) - { - if(first) - { - *x1 = CoordT(x); - *y1 = CoordT(y); - *x2 = CoordT(x); - *y2 = CoordT(y); - first = false; - } - else - { - if(CoordT(x) < *x1) *x1 = CoordT(x); - if(CoordT(y) < *y1) *y1 = CoordT(y); - if(CoordT(x) > *x2) *x2 = CoordT(x); - if(CoordT(y) > *y2) *y2 = CoordT(y); - } - } - } - } - return *x1 <= *x2 && *y1 <= *y2; - } - - - //-----------------------------------------------------bounding_rect_single - template - bool bounding_rect_single(VertexSource& vs, unsigned path_id, - CoordT* x1, CoordT* y1, CoordT* x2, CoordT* y2) - { - double x; - double y; - bool first = true; - - *x1 = CoordT(1); - *y1 = CoordT(1); - *x2 = CoordT(0); - *y2 = CoordT(0); - - vs.rewind(path_id); - unsigned cmd; - while(!is_stop(cmd = vs.vertex(&x, &y))) - { - if(is_vertex(cmd)) - { - if(first) - { - *x1 = CoordT(x); - *y1 = CoordT(y); - *x2 = CoordT(x); - *y2 = CoordT(y); - first = false; - } - else - { - if(CoordT(x) < *x1) *x1 = CoordT(x); - if(CoordT(y) < *y1) *y1 = CoordT(y); - if(CoordT(x) > *x2) *x2 = CoordT(x); - if(CoordT(y) > *y2) *y2 = CoordT(y); - } - } - } - return *x1 <= *x2 && *y1 <= *y2; - } - - -} - -#endif diff --git a/uppdev/aggdraw/agg_bspline.cpp b/uppdev/aggdraw/agg_bspline.cpp deleted file mode 100644 index 85bdfa969..000000000 --- a/uppdev/aggdraw/agg_bspline.cpp +++ /dev/null @@ -1,289 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#include "agg_bspline.h" - -namespace agg -{ - //------------------------------------------------------------------------ - bspline::bspline() : - m_max(0), - m_num(0), - m_x(0), - m_y(0), - m_last_idx(-1) - { - } - - //------------------------------------------------------------------------ - bspline::bspline(int num) : - m_max(0), - m_num(0), - m_x(0), - m_y(0), - m_last_idx(-1) - { - init(num); - } - - //------------------------------------------------------------------------ - bspline::bspline(int num, const double* x, const double* y) : - m_max(0), - m_num(0), - m_x(0), - m_y(0), - m_last_idx(-1) - { - init(num, x, y); - } - - - //------------------------------------------------------------------------ - void bspline::init(int max) - { - if(max > 2 && max > m_max) - { - m_am.resize(max * 3); - m_max = max; - m_x = &m_am[m_max]; - m_y = &m_am[m_max * 2]; - } - m_num = 0; - m_last_idx = -1; - } - - - //------------------------------------------------------------------------ - void bspline::add_point(double x, double y) - { - if(m_num < m_max) - { - m_x[m_num] = x; - m_y[m_num] = y; - ++m_num; - } - } - - - //------------------------------------------------------------------------ - void bspline::prepare() - { - if(m_num > 2) - { - int i, k, n1; - double* temp; - double* r; - double* s; - double h, p, d, f, e; - - for(k = 0; k < m_num; k++) - { - m_am[k] = 0.0; - } - - n1 = 3 * m_num; - - pod_array al(n1); - temp = &al[0]; - - for(k = 0; k < n1; k++) - { - temp[k] = 0.0; - } - - r = temp + m_num; - s = temp + m_num * 2; - - n1 = m_num - 1; - d = m_x[1] - m_x[0]; - e = (m_y[1] - m_y[0]) / d; - - for(k = 1; k < n1; k++) - { - h = d; - d = m_x[k + 1] - m_x[k]; - f = e; - e = (m_y[k + 1] - m_y[k]) / d; - al[k] = d / (d + h); - r[k] = 1.0 - al[k]; - s[k] = 6.0 * (e - f) / (h + d); - } - - for(k = 1; k < n1; k++) - { - p = 1.0 / (r[k] * al[k - 1] + 2.0); - al[k] *= -p; - s[k] = (s[k] - r[k] * s[k - 1]) * p; - } - - m_am[n1] = 0.0; - al[n1 - 1] = s[n1 - 1]; - m_am[n1 - 1] = al[n1 - 1]; - - for(k = n1 - 2, i = 0; i < m_num - 2; i++, k--) - { - al[k] = al[k] * al[k + 1] + s[k]; - m_am[k] = al[k]; - } - } - m_last_idx = -1; - } - - - - //------------------------------------------------------------------------ - void bspline::init(int num, const double* x, const double* y) - { - if(num > 2) - { - init(num); - int i; - for(i = 0; i < num; i++) - { - add_point(*x++, *y++); - } - prepare(); - } - m_last_idx = -1; - } - - - //------------------------------------------------------------------------ - void bspline::bsearch(int n, const double *x, double x0, int *i) - { - int j = n - 1; - int k; - - for(*i = 0; (j - *i) > 1; ) - { - if(x0 < x[k = (*i + j) >> 1]) j = k; - else *i = k; - } - } - - - - //------------------------------------------------------------------------ - double bspline::interpolation(double x, int i) const - { - int j = i + 1; - double d = m_x[i] - m_x[j]; - double h = x - m_x[j]; - double r = m_x[i] - x; - double p = d * d / 6.0; - return (m_am[j] * r * r * r + m_am[i] * h * h * h) / 6.0 / d + - ((m_y[j] - m_am[j] * p) * r + (m_y[i] - m_am[i] * p) * h) / d; - } - - - //------------------------------------------------------------------------ - double bspline::extrapolation_left(double x) const - { - double d = m_x[1] - m_x[0]; - return (-d * m_am[1] / 6 + (m_y[1] - m_y[0]) / d) * - (x - m_x[0]) + - m_y[0]; - } - - //------------------------------------------------------------------------ - double bspline::extrapolation_right(double x) const - { - double d = m_x[m_num - 1] - m_x[m_num - 2]; - return (d * m_am[m_num - 2] / 6 + (m_y[m_num - 1] - m_y[m_num - 2]) / d) * - (x - m_x[m_num - 1]) + - m_y[m_num - 1]; - } - - //------------------------------------------------------------------------ - double bspline::get(double x) const - { - if(m_num > 2) - { - int i; - - // Extrapolation on the left - if(x < m_x[0]) return extrapolation_left(x); - - // Extrapolation on the right - if(x >= m_x[m_num - 1]) return extrapolation_right(x); - - // Interpolation - bsearch(m_num, m_x, x, &i); - return interpolation(x, i); - } - return 0.0; - } - - - //------------------------------------------------------------------------ - double bspline::get_stateful(double x) const - { - if(m_num > 2) - { - // Extrapolation on the left - if(x < m_x[0]) return extrapolation_left(x); - - // Extrapolation on the right - if(x >= m_x[m_num - 1]) return extrapolation_right(x); - - if(m_last_idx >= 0) - { - // Check if x is not in current range - if(x < m_x[m_last_idx] || x > m_x[m_last_idx + 1]) - { - // Check if x between next points (most probably) - if(m_last_idx < m_num - 2 && - x >= m_x[m_last_idx + 1] && - x <= m_x[m_last_idx + 2]) - { - ++m_last_idx; - } - else - if(m_last_idx > 0 && - x >= m_x[m_last_idx - 1] && - x <= m_x[m_last_idx]) - { - // x is between pevious points - --m_last_idx; - } - else - { - // Else perform full search - bsearch(m_num, m_x, x, &m_last_idx); - } - } - return interpolation(x, m_last_idx); - } - else - { - // Interpolation - bsearch(m_num, m_x, x, &m_last_idx); - return interpolation(x, m_last_idx); - } - } - return 0.0; - } - -} - diff --git a/uppdev/aggdraw/agg_bspline.h b/uppdev/aggdraw/agg_bspline.h deleted file mode 100644 index ff8eda4fc..000000000 --- a/uppdev/aggdraw/agg_bspline.h +++ /dev/null @@ -1,81 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_BSPLINE_INCLUDED -#define AGG_BSPLINE_INCLUDED - -#include "agg_array.h" - -namespace agg -{ - //----------------------------------------------------------------bspline - // A very simple class of Bi-cubic Spline interpolation. - // First call init(num, x[], y[]) where num - number of source points, - // x, y - arrays of X and Y values respectively. Here Y must be a function - // of X. It means that all the X-coordinates must be arranged in the ascending - // order. - // Then call get(x) that calculates a value Y for the respective X. - // The class supports extrapolation, i.e. you can call get(x) where x is - // outside the given with init() X-range. Extrapolation is a simple linear - // function. - // - // See Implementation agg_bspline.cpp - //------------------------------------------------------------------------ - class bspline - { - public: - bspline(); - bspline(int num); - bspline(int num, const double* x, const double* y); - - void init(int num); - void add_point(double x, double y); - void prepare(); - - void init(int num, const double* x, const double* y); - - double get(double x) const; - double get_stateful(double x) const; - - private: - bspline(const bspline&); - const bspline& operator = (const bspline&); - - static void bsearch(int n, const double *x, double x0, int *i); - double extrapolation_left(double x) const; - double extrapolation_right(double x) const; - double interpolation(double x, int i) const; - - int m_max; - int m_num; - double* m_x; - double* m_y; - pod_array m_am; - mutable int m_last_idx; - }; - - -} - -#endif diff --git a/uppdev/aggdraw/agg_clip_liang_barsky.h b/uppdev/aggdraw/agg_clip_liang_barsky.h deleted file mode 100644 index a612ddf1f..000000000 --- a/uppdev/aggdraw/agg_clip_liang_barsky.h +++ /dev/null @@ -1,339 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_CLIP_LIANG_BARSKY_INCLUDED -#define AGG_CLIP_LIANG_BARSKY_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - enum clipping_flags_e - { - clipping_flags_x1_clipped = 4, - clipping_flags_x2_clipped = 1, - clipping_flags_y1_clipped = 8, - clipping_flags_y2_clipped = 2, - clipping_flags_x_clipped = clipping_flags_x1_clipped | clipping_flags_x2_clipped, - clipping_flags_y_clipped = clipping_flags_y1_clipped | clipping_flags_y2_clipped - }; - - //----------------------------------------------------------clipping_flags - // Determine the clipping code of the vertex according to the - // Cyrus-Beck line clipping algorithm - // - // | | - // 0110 | 0010 | 0011 - // | | - // -------+--------+-------- clip_box.y2 - // | | - // 0100 | 0000 | 0001 - // | | - // -------+--------+-------- clip_box.y1 - // | | - // 1100 | 1000 | 1001 - // | | - // clip_box.x1 clip_box.x2 - // - // - template - inline unsigned clipping_flags(T x, T y, const rect_base& clip_box) - { - return (x > clip_box.x2) | - ((y > clip_box.y2) << 1) | - ((x < clip_box.x1) << 2) | - ((y < clip_box.y1) << 3); - } - - //--------------------------------------------------------clipping_flags_x - template - inline unsigned clipping_flags_x(T x, const rect_base& clip_box) - { - return (x > clip_box.x2) | ((x < clip_box.x1) << 2); - } - - - //--------------------------------------------------------clipping_flags_y - template - inline unsigned clipping_flags_y(T y, const rect_base& clip_box) - { - return ((y > clip_box.y2) << 1) | ((y < clip_box.y1) << 3); - } - - - //-------------------------------------------------------clip_liang_barsky - template - inline unsigned clip_liang_barsky(T x1, T y1, T x2, T y2, - const rect_base& clip_box, - T* x, T* y) - { - const double nearzero = 1e-30; - - double deltax = x2 - x1; - double deltay = y2 - y1; - double xin; - double xout; - double yin; - double yout; - double tinx; - double tiny; - double toutx; - double touty; - double tin1; - double tin2; - double tout1; - unsigned np = 0; - - if(deltax == 0.0) - { - // bump off of the vertical - deltax = (x1 > clip_box.x1) ? -nearzero : nearzero; - } - - if(deltay == 0.0) - { - // bump off of the horizontal - deltay = (y1 > clip_box.y1) ? -nearzero : nearzero; - } - - if(deltax > 0.0) - { - // points to right - xin = clip_box.x1; - xout = clip_box.x2; - } - else - { - xin = clip_box.x2; - xout = clip_box.x1; - } - - if(deltay > 0.0) - { - // points up - yin = clip_box.y1; - yout = clip_box.y2; - } - else - { - yin = clip_box.y2; - yout = clip_box.y1; - } - - tinx = (xin - x1) / deltax; - tiny = (yin - y1) / deltay; - - if (tinx < tiny) - { - // hits x first - tin1 = tinx; - tin2 = tiny; - } - else - { - // hits y first - tin1 = tiny; - tin2 = tinx; - } - - if(tin1 <= 1.0) - { - if(0.0 < tin1) - { - *x++ = (T)xin; - *y++ = (T)yin; - ++np; - } - - if(tin2 <= 1.0) - { - toutx = (xout - x1) / deltax; - touty = (yout - y1) / deltay; - - tout1 = (toutx < touty) ? toutx : touty; - - if(tin2 > 0.0 || tout1 > 0.0) - { - if(tin2 <= tout1) - { - if(tin2 > 0.0) - { - if(tinx > tiny) - { - *x++ = (T)xin; - *y++ = (T)(y1 + tinx * deltay); - } - else - { - *x++ = (T)(x1 + tiny * deltax); - *y++ = (T)yin; - } - ++np; - } - - if(tout1 < 1.0) - { - if(toutx < touty) - { - *x++ = (T)xout; - *y++ = (T)(y1 + toutx * deltay); - } - else - { - *x++ = (T)(x1 + touty * deltax); - *y++ = (T)yout; - } - } - else - { - *x++ = x2; - *y++ = y2; - } - ++np; - } - else - { - if(tinx > tiny) - { - *x++ = (T)xin; - *y++ = (T)yout; - } - else - { - *x++ = (T)xout; - *y++ = (T)yin; - } - ++np; - } - } - } - } - return np; - } - - - //---------------------------------------------------------------------------- - template - bool clip_move_point(T x1, T y1, T x2, T y2, - const rect_base& clip_box, - T* x, T* y, unsigned flags) - { - T bound; - - if(flags & clipping_flags_x_clipped) - { - if(x1 == x2) - { - return false; - } - bound = (flags & clipping_flags_x1_clipped) ? clip_box.x1 : clip_box.x2; - *y = (T)(double(bound - x1) * (y2 - y1) / (x2 - x1) + y1); - *x = bound; - } - - flags = clipping_flags_y(*y, clip_box); - if(flags & clipping_flags_y_clipped) - { - if(y1 == y2) - { - return false; - } - bound = (flags & clipping_flags_y1_clipped) ? clip_box.y1 : clip_box.y2; - *x = (T)(double(bound - y1) * (x2 - x1) / (y2 - y1) + x1); - *y = bound; - } - return true; - } - - //-------------------------------------------------------clip_line_segment - // Returns: ret >= 4 - Fully clipped - // (ret & 1) != 0 - First point has been moved - // (ret & 2) != 0 - Second point has been moved - // - template - unsigned clip_line_segment(T* x1, T* y1, T* x2, T* y2, - const rect_base& clip_box) - { - unsigned f1 = clipping_flags(*x1, *y1, clip_box); - unsigned f2 = clipping_flags(*x2, *y2, clip_box); - unsigned ret = 0; - - if((f2 | f1) == 0) - { - // Fully visible - return 0; - } - - if((f1 & clipping_flags_x_clipped) != 0 && - (f1 & clipping_flags_x_clipped) == (f2 & clipping_flags_x_clipped)) - { - // Fully clipped - return 4; - } - - if((f1 & clipping_flags_y_clipped) != 0 && - (f1 & clipping_flags_y_clipped) == (f2 & clipping_flags_y_clipped)) - { - // Fully clipped - return 4; - } - - T tx1 = *x1; - T ty1 = *y1; - T tx2 = *x2; - T ty2 = *y2; - if(f1) - { - if(!clip_move_point(tx1, ty1, tx2, ty2, clip_box, x1, y1, f1)) - { - return 4; - } - if(*x1 == *x2 && *y1 == *y2) - { - return 4; - } - ret |= 1; - } - if(f2) - { - if(!clip_move_point(tx1, ty1, tx2, ty2, clip_box, x2, y2, f2)) - { - return 4; - } - if(*x1 == *x2 && *y1 == *y2) - { - return 4; - } - ret |= 2; - } - return ret; - } - - -} - - -#endif diff --git a/uppdev/aggdraw/agg_color_gray.h b/uppdev/aggdraw/agg_color_gray.h deleted file mode 100644 index 74ed66e1d..000000000 --- a/uppdev/aggdraw/agg_color_gray.h +++ /dev/null @@ -1,423 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// Adaptation for high precision colors has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- -// -// color types gray8, gray16 -// -//---------------------------------------------------------------------------- - -#ifndef AGG_COLOR_GRAY_INCLUDED -#define AGG_COLOR_GRAY_INCLUDED - -#include "agg_basics.h" -#include "agg_color_rgba.h" - -namespace agg -{ - - //===================================================================gray8 - struct gray8 - { - typedef int8u value_type; - typedef int32u calc_type; - typedef int32 long_type; - enum base_scale_e - { - base_shift = 8, - base_scale = 1 << base_shift, - base_mask = base_scale - 1 - }; - typedef gray8 self_type; - - value_type v; - value_type a; - - //-------------------------------------------------------------------- - gray8() {} - - //-------------------------------------------------------------------- - gray8(unsigned v_, unsigned a_=base_mask) : - v(int8u(v_)), a(int8u(a_)) {} - - //-------------------------------------------------------------------- - gray8(const self_type& c, unsigned a_) : - v(c.v), a(value_type(a_)) {} - - //-------------------------------------------------------------------- - gray8(const rgba& c) : - v((value_type)uround((0.299*c.r + 0.587*c.g + 0.114*c.b) * double(base_mask))), - a((value_type)uround(c.a * double(base_mask))) {} - - //-------------------------------------------------------------------- - gray8(const rgba& c, double a_) : - v((value_type)uround((0.299*c.r + 0.587*c.g + 0.114*c.b) * double(base_mask))), - a((value_type)uround(a_ * double(base_mask))) {} - - //-------------------------------------------------------------------- - gray8(const rgba8& c) : - v((c.r*77 + c.g*150 + c.b*29) >> 8), - a(c.a) {} - - //-------------------------------------------------------------------- - gray8(const rgba8& c, unsigned a_) : - v((c.r*77 + c.g*150 + c.b*29) >> 8), - a(a_) {} - - //-------------------------------------------------------------------- - void clear() - { - v = a = 0; - } - - //-------------------------------------------------------------------- - const self_type& transparent() - { - a = 0; - return *this; - } - - //-------------------------------------------------------------------- - void opacity(double a_) - { - if(a_ < 0.0) a_ = 0.0; - if(a_ > 1.0) a_ = 1.0; - a = (value_type)uround(a_ * double(base_mask)); - } - - //-------------------------------------------------------------------- - double opacity() const - { - return double(a) / double(base_mask); - } - - - //-------------------------------------------------------------------- - const self_type& premultiply() - { - if(a == base_mask) return *this; - if(a == 0) - { - v = 0; - return *this; - } - v = value_type((calc_type(v) * a) >> base_shift); - return *this; - } - - //-------------------------------------------------------------------- - const self_type& premultiply(unsigned a_) - { - if(a == base_mask && a_ >= base_mask) return *this; - if(a == 0 || a_ == 0) - { - v = a = 0; - return *this; - } - calc_type v_ = (calc_type(v) * a_) / a; - v = value_type((v_ > a_) ? a_ : v_); - a = value_type(a_); - return *this; - } - - //-------------------------------------------------------------------- - const self_type& demultiply() - { - if(a == base_mask) return *this; - if(a == 0) - { - v = 0; - return *this; - } - calc_type v_ = (calc_type(v) * base_mask) / a; - v = value_type((v_ > base_mask) ? (value_type)base_mask : v_); - return *this; - } - - //-------------------------------------------------------------------- - self_type gradient(self_type c, double k) const - { - self_type ret; - calc_type ik = uround(k * base_scale); - ret.v = value_type(calc_type(v) + (((calc_type(c.v) - v) * ik) >> base_shift)); - ret.a = value_type(calc_type(a) + (((calc_type(c.a) - a) * ik) >> base_shift)); - return ret; - } - - //-------------------------------------------------------------------- - AGG_INLINE void add(const self_type& c, unsigned cover) - { - calc_type cv, ca; - if(cover == cover_mask) - { - if(c.a == base_mask) - { - *this = c; - } - else - { - cv = v + c.v; v = (cv > calc_type(base_mask)) ? calc_type(base_mask) : cv; - ca = a + c.a; a = (ca > calc_type(base_mask)) ? calc_type(base_mask) : ca; - } - } - else - { - cv = v + ((c.v * cover + cover_mask/2) >> cover_shift); - ca = a + ((c.a * cover + cover_mask/2) >> cover_shift); - v = (cv > calc_type(base_mask)) ? calc_type(base_mask) : cv; - a = (ca > calc_type(base_mask)) ? calc_type(base_mask) : ca; - } - } - - //-------------------------------------------------------------------- - static self_type no_color() { return self_type(0,0); } - }; - - - //-------------------------------------------------------------gray8_pre - inline gray8 gray8_pre(unsigned v, unsigned a = gray8::base_mask) - { - return gray8(v,a).premultiply(); - } - inline gray8 gray8_pre(const gray8& c, unsigned a) - { - return gray8(c,a).premultiply(); - } - inline gray8 gray8_pre(const rgba& c) - { - return gray8(c).premultiply(); - } - inline gray8 gray8_pre(const rgba& c, double a) - { - return gray8(c,a).premultiply(); - } - inline gray8 gray8_pre(const rgba8& c) - { - return gray8(c).premultiply(); - } - inline gray8 gray8_pre(const rgba8& c, unsigned a) - { - return gray8(c,a).premultiply(); - } - - - - - //==================================================================gray16 - struct gray16 - { - typedef int16u value_type; - typedef int32u calc_type; - typedef int64 long_type; - enum base_scale_e - { - base_shift = 16, - base_scale = 1 << base_shift, - base_mask = base_scale - 1 - }; - typedef gray16 self_type; - - value_type v; - value_type a; - - //-------------------------------------------------------------------- - gray16() {} - - //-------------------------------------------------------------------- - gray16(unsigned v_, unsigned a_=base_mask) : - v(int16u(v_)), a(int16u(a_)) {} - - //-------------------------------------------------------------------- - gray16(const self_type& c, unsigned a_) : - v(c.v), a(value_type(a_)) {} - - //-------------------------------------------------------------------- - gray16(const rgba& c) : - v((value_type)uround((0.299*c.r + 0.587*c.g + 0.114*c.b) * double(base_mask))), - a((value_type)uround(c.a * double(base_mask))) {} - - //-------------------------------------------------------------------- - gray16(const rgba& c, double a_) : - v((value_type)uround((0.299*c.r + 0.587*c.g + 0.114*c.b) * double(base_mask))), - a((value_type)uround(a_ * double(base_mask))) {} - - //-------------------------------------------------------------------- - gray16(const rgba8& c) : - v(c.r*77 + c.g*150 + c.b*29), - a((value_type(c.a) << 8) | c.a) {} - - //-------------------------------------------------------------------- - gray16(const rgba8& c, unsigned a_) : - v(c.r*77 + c.g*150 + c.b*29), - a((value_type(a_) << 8) | c.a) {} - - //-------------------------------------------------------------------- - void clear() - { - v = a = 0; - } - - //-------------------------------------------------------------------- - const self_type& transparent() - { - a = 0; - return *this; - } - - //-------------------------------------------------------------------- - void opacity(double a_) - { - if(a_ < 0.0) a_ = 0.0; - if(a_ > 1.0) a_ = 1.0; - a = (value_type)uround(a_ * double(base_mask)); - } - - //-------------------------------------------------------------------- - double opacity() const - { - return double(a) / double(base_mask); - } - - - //-------------------------------------------------------------------- - const self_type& premultiply() - { - if(a == base_mask) return *this; - if(a == 0) - { - v = 0; - return *this; - } - v = value_type((calc_type(v) * a) >> base_shift); - return *this; - } - - //-------------------------------------------------------------------- - const self_type& premultiply(unsigned a_) - { - if(a == base_mask && a_ >= base_mask) return *this; - if(a == 0 || a_ == 0) - { - v = a = 0; - return *this; - } - calc_type v_ = (calc_type(v) * a_) / a; - v = value_type((v_ > a_) ? a_ : v_); - a = value_type(a_); - return *this; - } - - //-------------------------------------------------------------------- - const self_type& demultiply() - { - if(a == base_mask) return *this; - if(a == 0) - { - v = 0; - return *this; - } - calc_type v_ = (calc_type(v) * base_mask) / a; - v = value_type((v_ > base_mask) ? base_mask : v_); - return *this; - } - - //-------------------------------------------------------------------- - self_type gradient(self_type c, double k) const - { - self_type ret; - calc_type ik = uround(k * base_scale); - ret.v = value_type(calc_type(v) + (((calc_type(c.v) - v) * ik) >> base_shift)); - ret.a = value_type(calc_type(a) + (((calc_type(c.a) - a) * ik) >> base_shift)); - return ret; - } - - //-------------------------------------------------------------------- - AGG_INLINE void add(const self_type& c, unsigned cover) - { - calc_type cv, ca; - if(cover == cover_mask) - { - if(c.a == base_mask) - { - *this = c; - } - else - { - cv = v + c.v; v = (cv > calc_type(base_mask)) ? calc_type(base_mask) : cv; - ca = a + c.a; a = (ca > calc_type(base_mask)) ? calc_type(base_mask) : ca; - } - } - else - { - cv = v + ((c.v * cover + cover_mask/2) >> cover_shift); - ca = a + ((c.a * cover + cover_mask/2) >> cover_shift); - v = (cv > calc_type(base_mask)) ? calc_type(base_mask) : cv; - a = (ca > calc_type(base_mask)) ? calc_type(base_mask) : ca; - } - } - - //-------------------------------------------------------------------- - static self_type no_color() { return self_type(0,0); } - }; - - - //------------------------------------------------------------gray16_pre - inline gray16 gray16_pre(unsigned v, unsigned a = gray16::base_mask) - { - return gray16(v,a).premultiply(); - } - inline gray16 gray16_pre(const gray16& c, unsigned a) - { - return gray16(c,a).premultiply(); - } - inline gray16 gray16_pre(const rgba& c) - { - return gray16(c).premultiply(); - } - inline gray16 gray16_pre(const rgba& c, double a) - { - return gray16(c,a).premultiply(); - } - inline gray16 gray16_pre(const rgba8& c) - { - return gray16(c).premultiply(); - } - inline gray16 gray16_pre(const rgba8& c, unsigned a) - { - return gray16(c,a).premultiply(); - } - - -} - - - - -#endif diff --git a/uppdev/aggdraw/agg_color_rgba.h b/uppdev/aggdraw/agg_color_rgba.h deleted file mode 100644 index 7cc25b5f0..000000000 --- a/uppdev/aggdraw/agg_color_rgba.h +++ /dev/null @@ -1,756 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// Adaptation for high precision colors has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- - -#ifndef AGG_COLOR_RGBA_INCLUDED -#define AGG_COLOR_RGBA_INCLUDED - -#include -#include "agg_basics.h" - -namespace agg -{ - // Supported byte orders for RGB and RGBA pixel formats - //======================================================================= - struct order_rgb { enum rgb_e { R=0, G=1, B=2, rgb_tag }; }; //----order_rgb - struct order_bgr { enum bgr_e { B=0, G=1, R=2, rgb_tag }; }; //----order_bgr - struct order_rgba { enum rgba_e { R=0, G=1, B=2, A=3, rgba_tag }; }; //----order_rgba - struct order_argb { enum argb_e { A=0, R=1, G=2, B=3, rgba_tag }; }; //----order_argb - struct order_abgr { enum abgr_e { A=0, B=1, G=2, R=3, rgba_tag }; }; //----order_abgr - struct order_bgra { enum bgra_e { B=0, G=1, R=2, A=3, rgba_tag }; }; //----order_bgra - - //====================================================================rgba - struct rgba - { - typedef double value_type; - - double r; - double g; - double b; - double a; - - //-------------------------------------------------------------------- - rgba() {} - - //-------------------------------------------------------------------- - rgba(double r_, double g_, double b_, double a_=1.0) : - r(r_), g(g_), b(b_), a(a_) {} - - //-------------------------------------------------------------------- - rgba(const rgba& c, double a_) : r(c.r), g(c.g), b(c.b), a(a_) {} - - //-------------------------------------------------------------------- - void clear() - { - r = g = b = a = 0; - } - - //-------------------------------------------------------------------- - const rgba& transparent() - { - a = 0.0; - return *this; - } - - //-------------------------------------------------------------------- - const rgba& opacity(double a_) - { - if(a_ < 0.0) a_ = 0.0; - if(a_ > 1.0) a_ = 1.0; - a = a_; - return *this; - } - - //-------------------------------------------------------------------- - double opacity() const - { - return a; - } - - //-------------------------------------------------------------------- - const rgba& premultiply() - { - r *= a; - g *= a; - b *= a; - return *this; - } - - //-------------------------------------------------------------------- - const rgba& premultiply(double a_) - { - if(a <= 0.0 || a_ <= 0.0) - { - r = g = b = a = 0.0; - return *this; - } - a_ /= a; - r *= a_; - g *= a_; - b *= a_; - a = a_; - return *this; - } - - //-------------------------------------------------------------------- - const rgba& demultiply() - { - if(a == 0) - { - r = g = b = 0; - return *this; - } - double a_ = 1.0 / a; - r *= a_; - g *= a_; - b *= a_; - return *this; - } - - - //-------------------------------------------------------------------- - rgba gradient(rgba c, double k) const - { - rgba ret; - ret.r = r + (c.r - r) * k; - ret.g = g + (c.g - g) * k; - ret.b = b + (c.b - b) * k; - ret.a = a + (c.a - a) * k; - return ret; - } - - //-------------------------------------------------------------------- - static rgba no_color() { return rgba(0,0,0,0); } - - //-------------------------------------------------------------------- - static rgba from_wavelength(double wl, double gamma = 1.0); - - //-------------------------------------------------------------------- - explicit rgba(double wavelen, double gamma=1.0) - { - *this = from_wavelength(wavelen, gamma); - } - - }; - - //----------------------------------------------------------------rgba_pre - inline rgba rgba_pre(double r, double g, double b, double a=1.0) - { - return rgba(r, g, b, a).premultiply(); - } - inline rgba rgba_pre(const rgba& c) - { - return rgba(c).premultiply(); - } - inline rgba rgba_pre(const rgba& c, double a) - { - return rgba(c, a).premultiply(); - } - - //------------------------------------------------------------------------ - inline rgba rgba::from_wavelength(double wl, double gamma) - { - rgba t(0.0, 0.0, 0.0); - - if(wl >= 380.0 && wl <= 440.0) - { - t.r = -1.0 * (wl - 440.0) / (440.0 - 380.0); - t.b = 1.0; - } - else - if(wl >= 440.0 && wl <= 490.0) - { - t.g = (wl - 440.0) / (490.0 - 440.0); - t.b = 1.0; - } - else - if(wl >= 490.0 && wl <= 510.0) - { - t.g = 1.0; - t.b = -1.0 * (wl - 510.0) / (510.0 - 490.0); - } - else - if(wl >= 510.0 && wl <= 580.0) - { - t.r = (wl - 510.0) / (580.0 - 510.0); - t.g = 1.0; - } - else - if(wl >= 580.0 && wl <= 645.0) - { - t.r = 1.0; - t.g = -1.0 * (wl - 645.0) / (645.0 - 580.0); - } - else - if(wl >= 645.0 && wl <= 780.0) - { - t.r = 1.0; - } - - double s = 1.0; - if(wl > 700.0) s = 0.3 + 0.7 * (780.0 - wl) / (780.0 - 700.0); - else if(wl < 420.0) s = 0.3 + 0.7 * (wl - 380.0) / (420.0 - 380.0); - - t.r = pow(t.r * s, gamma); - t.g = pow(t.g * s, gamma); - t.b = pow(t.b * s, gamma); - return t; - } - - - - - //===================================================================rgba8 - struct rgba8 - { - typedef int8u value_type; - typedef int32u calc_type; - typedef int32 long_type; - enum base_scale_e - { - base_shift = 8, - base_scale = 1 << base_shift, - base_mask = base_scale - 1 - }; - typedef rgba8 self_type; - - - value_type r; - value_type g; - value_type b; - value_type a; - - //-------------------------------------------------------------------- - rgba8() {} - - //-------------------------------------------------------------------- - rgba8(unsigned r_, unsigned g_, unsigned b_, unsigned a_=base_mask) : - r(value_type(r_)), - g(value_type(g_)), - b(value_type(b_)), - a(value_type(a_)) {} - - //-------------------------------------------------------------------- - rgba8(const rgba& c, double a_) : - r((value_type)uround(c.r * double(base_mask))), - g((value_type)uround(c.g * double(base_mask))), - b((value_type)uround(c.b * double(base_mask))), - a((value_type)uround(a_ * double(base_mask))) {} - - //-------------------------------------------------------------------- - rgba8(const self_type& c, unsigned a_) : - r(c.r), g(c.g), b(c.b), a(value_type(a_)) {} - - //-------------------------------------------------------------------- - rgba8(const rgba& c) : - r((value_type)uround(c.r * double(base_mask))), - g((value_type)uround(c.g * double(base_mask))), - b((value_type)uround(c.b * double(base_mask))), - a((value_type)uround(c.a * double(base_mask))) {} - - //-------------------------------------------------------------------- - void clear() - { - r = g = b = a = 0; - } - - //-------------------------------------------------------------------- - const self_type& transparent() - { - a = 0; - return *this; - } - - //-------------------------------------------------------------------- - const self_type& opacity(double a_) - { - if(a_ < 0.0) a_ = 0.0; - if(a_ > 1.0) a_ = 1.0; - a = (value_type)uround(a_ * double(base_mask)); - return *this; - } - - //-------------------------------------------------------------------- - double opacity() const - { - return double(a) / double(base_mask); - } - - //-------------------------------------------------------------------- - AGG_INLINE const self_type& premultiply() - { - if(a == base_mask) return *this; - if(a == 0) - { - r = g = b = 0; - return *this; - } - r = value_type((calc_type(r) * a) >> base_shift); - g = value_type((calc_type(g) * a) >> base_shift); - b = value_type((calc_type(b) * a) >> base_shift); - return *this; - } - - //-------------------------------------------------------------------- - AGG_INLINE const self_type& premultiply(unsigned a_) - { - if(a == base_mask && a_ >= base_mask) return *this; - if(a == 0 || a_ == 0) - { - r = g = b = a = 0; - return *this; - } - calc_type r_ = (calc_type(r) * a_) / a; - calc_type g_ = (calc_type(g) * a_) / a; - calc_type b_ = (calc_type(b) * a_) / a; - r = value_type((r_ > a_) ? a_ : r_); - g = value_type((g_ > a_) ? a_ : g_); - b = value_type((b_ > a_) ? a_ : b_); - a = value_type(a_); - return *this; - } - - //-------------------------------------------------------------------- - AGG_INLINE const self_type& demultiply() - { - if(a == base_mask) return *this; - if(a == 0) - { - r = g = b = 0; - return *this; - } - calc_type r_ = (calc_type(r) * base_mask) / a; - calc_type g_ = (calc_type(g) * base_mask) / a; - calc_type b_ = (calc_type(b) * base_mask) / a; - r = value_type((r_ > calc_type(base_mask)) ? calc_type(base_mask) : r_); - g = value_type((g_ > calc_type(base_mask)) ? calc_type(base_mask) : g_); - b = value_type((b_ > calc_type(base_mask)) ? calc_type(base_mask) : b_); - return *this; - } - - //-------------------------------------------------------------------- - AGG_INLINE self_type gradient(const self_type& c, double k) const - { - self_type ret; - calc_type ik = uround(k * base_scale); - ret.r = value_type(calc_type(r) + (((calc_type(c.r) - r) * ik) >> base_shift)); - ret.g = value_type(calc_type(g) + (((calc_type(c.g) - g) * ik) >> base_shift)); - ret.b = value_type(calc_type(b) + (((calc_type(c.b) - b) * ik) >> base_shift)); - ret.a = value_type(calc_type(a) + (((calc_type(c.a) - a) * ik) >> base_shift)); - return ret; - } - - //-------------------------------------------------------------------- - AGG_INLINE void add(const self_type& c, unsigned cover) - { - calc_type cr, cg, cb, ca; - if(cover == cover_mask) - { - if(c.a == base_mask) - { - *this = c; - } - else - { - cr = r + c.r; r = (cr > calc_type(base_mask)) ? calc_type(base_mask) : cr; - cg = g + c.g; g = (cg > calc_type(base_mask)) ? calc_type(base_mask) : cg; - cb = b + c.b; b = (cb > calc_type(base_mask)) ? calc_type(base_mask) : cb; - ca = a + c.a; a = (ca > calc_type(base_mask)) ? calc_type(base_mask) : ca; - } - } - else - { - cr = r + ((c.r * cover + cover_mask/2) >> cover_shift); - cg = g + ((c.g * cover + cover_mask/2) >> cover_shift); - cb = b + ((c.b * cover + cover_mask/2) >> cover_shift); - ca = a + ((c.a * cover + cover_mask/2) >> cover_shift); - r = (cr > calc_type(base_mask)) ? calc_type(base_mask) : cr; - g = (cg > calc_type(base_mask)) ? calc_type(base_mask) : cg; - b = (cb > calc_type(base_mask)) ? calc_type(base_mask) : cb; - a = (ca > calc_type(base_mask)) ? calc_type(base_mask) : ca; - } - } - - //-------------------------------------------------------------------- - template - AGG_INLINE void apply_gamma_dir(const GammaLUT& gamma) - { - r = gamma.dir(r); - g = gamma.dir(g); - b = gamma.dir(b); - } - - //-------------------------------------------------------------------- - template - AGG_INLINE void apply_gamma_inv(const GammaLUT& gamma) - { - r = gamma.inv(r); - g = gamma.inv(g); - b = gamma.inv(b); - } - - //-------------------------------------------------------------------- - static self_type no_color() { return self_type(0,0,0,0); } - - //-------------------------------------------------------------------- - static self_type from_wavelength(double wl, double gamma = 1.0) - { - return self_type(rgba::from_wavelength(wl, gamma)); - } - }; - - - //-------------------------------------------------------------rgba8_pre - inline rgba8 rgba8_pre(unsigned r, unsigned g, unsigned b, - unsigned a = rgba8::base_mask) - { - return rgba8(r,g,b,a).premultiply(); - } - inline rgba8 rgba8_pre(const rgba8& c) - { - return rgba8(c).premultiply(); - } - inline rgba8 rgba8_pre(const rgba8& c, unsigned a) - { - return rgba8(c,a).premultiply(); - } - inline rgba8 rgba8_pre(const rgba& c) - { - return rgba8(c).premultiply(); - } - inline rgba8 rgba8_pre(const rgba& c, double a) - { - return rgba8(c,a).premultiply(); - } - - - //-------------------------------------------------------------rgb8_packed - inline rgba8 rgb8_packed(unsigned v) - { - return rgba8((v >> 16) & 0xFF, (v >> 8) & 0xFF, v & 0xFF); - } - - //-------------------------------------------------------------bgr8_packed - inline rgba8 bgr8_packed(unsigned v) - { - return rgba8(v & 0xFF, (v >> 8) & 0xFF, (v >> 16) & 0xFF); - } - - //------------------------------------------------------------argb8_packed - inline rgba8 argb8_packed(unsigned v) - { - return rgba8((v >> 16) & 0xFF, (v >> 8) & 0xFF, v & 0xFF, v >> 24); - } - - //---------------------------------------------------------rgba8_gamma_dir - template - rgba8 rgba8_gamma_dir(rgba8 c, const GammaLUT& gamma) - { - return rgba8(gamma.dir(c.r), gamma.dir(c.g), gamma.dir(c.b), c.a); - } - - //---------------------------------------------------------rgba8_gamma_inv - template - rgba8 rgba8_gamma_inv(rgba8 c, const GammaLUT& gamma) - { - return rgba8(gamma.inv(c.r), gamma.inv(c.g), gamma.inv(c.b), c.a); - } - - - - - - //==================================================================rgba16 - struct rgba16 - { - typedef int16u value_type; - typedef int32u calc_type; - typedef int64 long_type; - enum base_scale_e - { - base_shift = 16, - base_scale = 1 << base_shift, - base_mask = base_scale - 1 - }; - typedef rgba16 self_type; - - value_type r; - value_type g; - value_type b; - value_type a; - - //-------------------------------------------------------------------- - rgba16() {} - - //-------------------------------------------------------------------- - rgba16(unsigned r_, unsigned g_, unsigned b_, unsigned a_=base_mask) : - r(value_type(r_)), - g(value_type(g_)), - b(value_type(b_)), - a(value_type(a_)) {} - - //-------------------------------------------------------------------- - rgba16(const self_type& c, unsigned a_) : - r(c.r), g(c.g), b(c.b), a(value_type(a_)) {} - - //-------------------------------------------------------------------- - rgba16(const rgba& c) : - r((value_type)uround(c.r * double(base_mask))), - g((value_type)uround(c.g * double(base_mask))), - b((value_type)uround(c.b * double(base_mask))), - a((value_type)uround(c.a * double(base_mask))) {} - - //-------------------------------------------------------------------- - rgba16(const rgba& c, double a_) : - r((value_type)uround(c.r * double(base_mask))), - g((value_type)uround(c.g * double(base_mask))), - b((value_type)uround(c.b * double(base_mask))), - a((value_type)uround(a_ * double(base_mask))) {} - - //-------------------------------------------------------------------- - rgba16(const rgba8& c) : - r(value_type((value_type(c.r) << 8) | c.r)), - g(value_type((value_type(c.g) << 8) | c.g)), - b(value_type((value_type(c.b) << 8) | c.b)), - a(value_type((value_type(c.a) << 8) | c.a)) {} - - //-------------------------------------------------------------------- - rgba16(const rgba8& c, unsigned a_) : - r(value_type((value_type(c.r) << 8) | c.r)), - g(value_type((value_type(c.g) << 8) | c.g)), - b(value_type((value_type(c.b) << 8) | c.b)), - a(value_type(( a_ << 8) | c.a)) {} - - //-------------------------------------------------------------------- - void clear() - { - r = g = b = a = 0; - } - - //-------------------------------------------------------------------- - const self_type& transparent() - { - a = 0; - return *this; - } - - //-------------------------------------------------------------------- - AGG_INLINE const self_type& opacity(double a_) - { - if(a_ < 0.0) a_ = 0.0; - if(a_ > 1.0) a_ = 1.0; - a = (value_type)uround(a_ * double(base_mask)); - return *this; - } - - //-------------------------------------------------------------------- - double opacity() const - { - return double(a) / double(base_mask); - } - - //-------------------------------------------------------------------- - AGG_INLINE const self_type& premultiply() - { - if(a == base_mask) return *this; - if(a == 0) - { - r = g = b = 0; - return *this; - } - r = value_type((calc_type(r) * a) >> base_shift); - g = value_type((calc_type(g) * a) >> base_shift); - b = value_type((calc_type(b) * a) >> base_shift); - return *this; - } - - //-------------------------------------------------------------------- - AGG_INLINE const self_type& premultiply(unsigned a_) - { - if(a == base_mask && a_ >= base_mask) return *this; - if(a == 0 || a_ == 0) - { - r = g = b = a = 0; - return *this; - } - calc_type r_ = (calc_type(r) * a_) / a; - calc_type g_ = (calc_type(g) * a_) / a; - calc_type b_ = (calc_type(b) * a_) / a; - r = value_type((r_ > a_) ? a_ : r_); - g = value_type((g_ > a_) ? a_ : g_); - b = value_type((b_ > a_) ? a_ : b_); - a = value_type(a_); - return *this; - } - - //-------------------------------------------------------------------- - AGG_INLINE const self_type& demultiply() - { - if(a == base_mask) return *this; - if(a == 0) - { - r = g = b = 0; - return *this; - } - calc_type r_ = (calc_type(r) * base_mask) / a; - calc_type g_ = (calc_type(g) * base_mask) / a; - calc_type b_ = (calc_type(b) * base_mask) / a; - r = value_type((r_ > calc_type(base_mask)) ? calc_type(base_mask) : r_); - g = value_type((g_ > calc_type(base_mask)) ? calc_type(base_mask) : g_); - b = value_type((b_ > calc_type(base_mask)) ? calc_type(base_mask) : b_); - return *this; - } - - //-------------------------------------------------------------------- - AGG_INLINE self_type gradient(const self_type& c, double k) const - { - self_type ret; - calc_type ik = uround(k * base_scale); - ret.r = value_type(calc_type(r) + (((calc_type(c.r) - r) * ik) >> base_shift)); - ret.g = value_type(calc_type(g) + (((calc_type(c.g) - g) * ik) >> base_shift)); - ret.b = value_type(calc_type(b) + (((calc_type(c.b) - b) * ik) >> base_shift)); - ret.a = value_type(calc_type(a) + (((calc_type(c.a) - a) * ik) >> base_shift)); - return ret; - } - - //-------------------------------------------------------------------- - AGG_INLINE void add(const self_type& c, unsigned cover) - { - calc_type cr, cg, cb, ca; - if(cover == cover_mask) - { - if(c.a == base_mask) - { - *this = c; - } - else - { - cr = r + c.r; r = (cr > calc_type(base_mask)) ? calc_type(base_mask) : cr; - cg = g + c.g; g = (cg > calc_type(base_mask)) ? calc_type(base_mask) : cg; - cb = b + c.b; b = (cb > calc_type(base_mask)) ? calc_type(base_mask) : cb; - ca = a + c.a; a = (ca > calc_type(base_mask)) ? calc_type(base_mask) : ca; - } - } - else - { - cr = r + ((c.r * cover + cover_mask) >> cover_shift); - cg = g + ((c.g * cover + cover_mask) >> cover_shift); - cb = b + ((c.b * cover + cover_mask) >> cover_shift); - ca = a + ((c.a * cover + cover_mask) >> cover_shift); - r = (cr > calc_type(base_mask)) ? calc_type(base_mask) : cr; - g = (cg > calc_type(base_mask)) ? calc_type(base_mask) : cg; - b = (cb > calc_type(base_mask)) ? calc_type(base_mask) : cb; - a = (ca > calc_type(base_mask)) ? calc_type(base_mask) : ca; - } - } - - //-------------------------------------------------------------------- - template - AGG_INLINE void apply_gamma_dir(const GammaLUT& gamma) - { - r = gamma.dir(r); - g = gamma.dir(g); - b = gamma.dir(b); - } - - //-------------------------------------------------------------------- - template - AGG_INLINE void apply_gamma_inv(const GammaLUT& gamma) - { - r = gamma.inv(r); - g = gamma.inv(g); - b = gamma.inv(b); - } - - //-------------------------------------------------------------------- - static self_type no_color() { return self_type(0,0,0,0); } - - //-------------------------------------------------------------------- - static self_type from_wavelength(double wl, double gamma = 1.0) - { - return self_type(rgba::from_wavelength(wl, gamma)); - } - }; - - - - //--------------------------------------------------------------rgba16_pre - inline rgba16 rgba16_pre(unsigned r, unsigned g, unsigned b, - unsigned a = rgba16::base_mask) - { - return rgba16(r,g,b,a).premultiply(); - } - inline rgba16 rgba16_pre(const rgba16& c, unsigned a) - { - return rgba16(c,a).premultiply(); - } - inline rgba16 rgba16_pre(const rgba& c) - { - return rgba16(c).premultiply(); - } - inline rgba16 rgba16_pre(const rgba& c, double a) - { - return rgba16(c,a).premultiply(); - } - inline rgba16 rgba16_pre(const rgba8& c) - { - return rgba16(c).premultiply(); - } - inline rgba16 rgba16_pre(const rgba8& c, unsigned a) - { - return rgba16(c,a).premultiply(); - } - - - //------------------------------------------------------rgba16_gamma_dir - template - rgba16 rgba16_gamma_dir(rgba16 c, const GammaLUT& gamma) - { - return rgba16(gamma.dir(c.r), gamma.dir(c.g), gamma.dir(c.b), c.a); - } - - //------------------------------------------------------rgba16_gamma_inv - template - rgba16 rgba16_gamma_inv(rgba16 c, const GammaLUT& gamma) - { - return rgba16(gamma.inv(c.r), gamma.inv(c.g), gamma.inv(c.b), c.a); - } - - -} - - - -#endif diff --git a/uppdev/aggdraw/agg_config.h b/uppdev/aggdraw/agg_config.h deleted file mode 100644 index 372b77bfc..000000000 --- a/uppdev/aggdraw/agg_config.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef AGG_CONFIG_INCLUDED -#define AGG_CONFIG_INCLUDED - -// This file can be used to redefine certain data types. - -//--------------------------------------- -// 1. Default basic types such as: -// -// AGG_INT8 -// AGG_INT8U -// AGG_INT16 -// AGG_INT16U -// AGG_INT32 -// AGG_INT32U -// AGG_INT64 -// AGG_INT64U -// -// Just replace this file with new defines if necessary. -// For example, if your compiler doesn't have a 64 bit integer type -// you can still use AGG if you define the follows: -// -// #define AGG_INT64 int -// #define AGG_INT64U unsigned -// -// It will result in overflow in 16 bit-per-component image/pattern resampling -// but it won't result any crash and the rest of the library will remain -// fully functional. - - -//--------------------------------------- -// 2. Default rendering_buffer type. Can be: -// -// Provides faster access for massive pixel operations, -// such as blur, image filtering: -// #define AGG_RENDERING_BUFFER row_ptr_cache -// -// Provides cheaper creation and destruction (no mem allocs): -// #define AGG_RENDERING_BUFFER row_accessor -// -// You can still use both of them simultaneouslyin your applications -// This #define is used only for default rendering_buffer type, -// in short hand typedefs like pixfmt_rgba32. - -#endif diff --git a/uppdev/aggdraw/agg_conv_adaptor_vcgen.h b/uppdev/aggdraw/agg_conv_adaptor_vcgen.h deleted file mode 100644 index 9719c715e..000000000 --- a/uppdev/aggdraw/agg_conv_adaptor_vcgen.h +++ /dev/null @@ -1,166 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_CONV_ADAPTOR_VCGEN_INCLUDED -#define AGG_CONV_ADAPTOR_VCGEN_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - //------------------------------------------------------------null_markers - struct null_markers - { - void remove_all() {} - void add_vertex(double, double, unsigned) {} - void prepare_src() {} - - void rewind(unsigned) {} - unsigned vertex(double*, double*) { return path_cmd_stop; } - }; - - - //------------------------------------------------------conv_adaptor_vcgen - template class conv_adaptor_vcgen - { - enum status - { - initial, - accumulate, - generate - }; - - public: - explicit conv_adaptor_vcgen(VertexSource& source) : - m_source(&source), - m_status(initial) - {} - void attach(VertexSource& source) { m_source = &source; } - - Generator& generator() { return m_generator; } - const Generator& generator() const { return m_generator; } - - Markers& markers() { return m_markers; } - const Markers& markers() const { return m_markers; } - - void rewind(unsigned path_id) - { - m_source->rewind(path_id); - m_status = initial; - } - - unsigned vertex(double* x, double* y); - - private: - // Prohibit copying - conv_adaptor_vcgen(const conv_adaptor_vcgen&); - const conv_adaptor_vcgen& - operator = (const conv_adaptor_vcgen&); - - VertexSource* m_source; - Generator m_generator; - Markers m_markers; - status m_status; - unsigned m_last_cmd; - double m_start_x; - double m_start_y; - }; - - - - - - //------------------------------------------------------------------------ - template - unsigned conv_adaptor_vcgen::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_stop; - bool done = false; - while(!done) - { - switch(m_status) - { - case initial: - m_markers.remove_all(); - m_last_cmd = m_source->vertex(&m_start_x, &m_start_y); - m_status = accumulate; - - case accumulate: - if(is_stop(m_last_cmd)) return path_cmd_stop; - - m_generator.remove_all(); - m_generator.add_vertex(m_start_x, m_start_y, path_cmd_move_to); - m_markers.add_vertex(m_start_x, m_start_y, path_cmd_move_to); - - for(;;) - { - cmd = m_source->vertex(x, y); - if(is_vertex(cmd)) - { - m_last_cmd = cmd; - if(is_move_to(cmd)) - { - m_start_x = *x; - m_start_y = *y; - break; - } - m_generator.add_vertex(*x, *y, cmd); - m_markers.add_vertex(*x, *y, path_cmd_line_to); - } - else - { - if(is_stop(cmd)) - { - m_last_cmd = path_cmd_stop; - break; - } - if(is_end_poly(cmd)) - { - m_generator.add_vertex(*x, *y, cmd); - break; - } - } - } - m_generator.rewind(0); - m_status = generate; - - case generate: - cmd = m_generator.vertex(x, y); - if(is_stop(cmd)) - { - m_status = accumulate; - break; - } - done = true; - break; - } - } - return cmd; - } - -} - -#endif diff --git a/uppdev/aggdraw/agg_conv_adaptor_vpgen.h b/uppdev/aggdraw/agg_conv_adaptor_vpgen.h deleted file mode 100644 index 2243e1e87..000000000 --- a/uppdev/aggdraw/agg_conv_adaptor_vpgen.h +++ /dev/null @@ -1,168 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_CONV_ADAPTOR_VPGEN_INCLUDED -#define AGG_CONV_ADAPTOR_VPGEN_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - - //======================================================conv_adaptor_vpgen - template class conv_adaptor_vpgen - { - public: - explicit conv_adaptor_vpgen(VertexSource& source) : m_source(&source) {} - void attach(VertexSource& source) { m_source = &source; } - - VPGen& vpgen() { return m_vpgen; } - const VPGen& vpgen() const { return m_vpgen; } - - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - conv_adaptor_vpgen(const conv_adaptor_vpgen&); - const conv_adaptor_vpgen& - operator = (const conv_adaptor_vpgen&); - - VertexSource* m_source; - VPGen m_vpgen; - double m_start_x; - double m_start_y; - unsigned m_poly_flags; - int m_vertices; - }; - - - - //------------------------------------------------------------------------ - template - void conv_adaptor_vpgen::rewind(unsigned path_id) - { - m_source->rewind(path_id); - m_vpgen.reset(); - m_start_x = 0; - m_start_y = 0; - m_poly_flags = 0; - m_vertices = 0; - } - - - //------------------------------------------------------------------------ - template - unsigned conv_adaptor_vpgen::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_stop; - for(;;) - { - cmd = m_vpgen.vertex(x, y); - if(!is_stop(cmd)) break; - - if(m_poly_flags && !m_vpgen.auto_unclose()) - { - *x = 0.0; - *y = 0.0; - cmd = m_poly_flags; - m_poly_flags = 0; - break; - } - - if(m_vertices < 0) - { - if(m_vertices < -1) - { - m_vertices = 0; - return path_cmd_stop; - } - m_vpgen.move_to(m_start_x, m_start_y); - m_vertices = 1; - continue; - } - - double tx, ty; - cmd = m_source->vertex(&tx, &ty); - if(is_vertex(cmd)) - { - if(is_move_to(cmd)) - { - if(m_vpgen.auto_close() && m_vertices > 2) - { - m_vpgen.line_to(m_start_x, m_start_y); - m_poly_flags = path_cmd_end_poly | path_flags_close; - m_start_x = tx; - m_start_y = ty; - m_vertices = -1; - continue; - } - m_vpgen.move_to(tx, ty); - m_start_x = tx; - m_start_y = ty; - m_vertices = 1; - } - else - { - m_vpgen.line_to(tx, ty); - ++m_vertices; - } - } - else - { - if(is_end_poly(cmd)) - { - m_poly_flags = cmd; - if(is_closed(cmd) || m_vpgen.auto_close()) - { - if(m_vpgen.auto_close()) m_poly_flags |= path_flags_close; - if(m_vertices > 2) - { - m_vpgen.line_to(m_start_x, m_start_y); - } - m_vertices = 0; - } - } - else - { - // path_cmd_stop - if(m_vpgen.auto_close() && m_vertices > 2) - { - m_vpgen.line_to(m_start_x, m_start_y); - m_poly_flags = path_cmd_end_poly | path_flags_close; - m_vertices = -2; - continue; - } - break; - } - } - } - return cmd; - } - - -} - - -#endif - diff --git a/uppdev/aggdraw/agg_conv_bspline.h b/uppdev/aggdraw/agg_conv_bspline.h deleted file mode 100644 index ff5fb751f..000000000 --- a/uppdev/aggdraw/agg_conv_bspline.h +++ /dev/null @@ -1,58 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_CONV_BSPLINE_INCLUDED -#define AGG_CONV_BSPLINE_INCLUDED - -#include "agg_basics.h" -#include "agg_vcgen_bspline.h" -#include "agg_conv_adaptor_vcgen.h" - - -namespace agg -{ - - //---------------------------------------------------------conv_bspline - template - struct conv_bspline : public conv_adaptor_vcgen - { - typedef conv_adaptor_vcgen base_type; - - conv_bspline(VertexSource& vs) : - conv_adaptor_vcgen(vs) {} - - void interpolation_step(double v) { base_type::generator().interpolation_step(v); } - double interpolation_step() const { return base_type::generator().interpolation_step(); } - - private: - conv_bspline(const conv_bspline&); - const conv_bspline& - operator = (const conv_bspline&); - }; - -} - - -#endif - diff --git a/uppdev/aggdraw/agg_conv_clip_polygon.h b/uppdev/aggdraw/agg_conv_clip_polygon.h deleted file mode 100644 index e1e9d45a3..000000000 --- a/uppdev/aggdraw/agg_conv_clip_polygon.h +++ /dev/null @@ -1,72 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// Polygon clipping converter -// There an optimized Liang-Basky algorithm is used. -// The algorithm doesn't optimize the degenerate edges, i.e. it will never -// break a closed polygon into two or more ones, instead, there will be -// degenerate edges coinciding with the respective clipping boundaries. -// This is a sub-optimal solution, because that optimization would require -// extra, rather expensive math while the rasterizer tolerates it quite well, -// without any considerable overhead. -// -//---------------------------------------------------------------------------- -#ifndef AGG_CONV_CLIP_POLYGON_INCLUDED -#define AGG_CONV_CLIP_POLYGON_INCLUDED - -#include "agg_basics.h" -#include "agg_conv_adaptor_vpgen.h" -#include "agg_vpgen_clip_polygon.h" - -namespace agg -{ - - //=======================================================conv_clip_polygon - template - struct conv_clip_polygon : public conv_adaptor_vpgen - { - typedef conv_adaptor_vpgen base_type; - - conv_clip_polygon(VertexSource& vs) : - conv_adaptor_vpgen(vs) {} - - void clip_box(double x1, double y1, double x2, double y2) - { - base_type::vpgen().clip_box(x1, y1, x2, y2); - } - - double x1() const { return base_type::vpgen().x1(); } - double y1() const { return base_type::vpgen().y1(); } - double x2() const { return base_type::vpgen().x2(); } - double y2() const { return base_type::vpgen().y2(); } - - private: - conv_clip_polygon(const conv_clip_polygon&); - const conv_clip_polygon& - operator = (const conv_clip_polygon&); - }; - -} - -#endif diff --git a/uppdev/aggdraw/agg_conv_clip_polyline.h b/uppdev/aggdraw/agg_conv_clip_polyline.h deleted file mode 100644 index 7614f7eb3..000000000 --- a/uppdev/aggdraw/agg_conv_clip_polyline.h +++ /dev/null @@ -1,72 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// polyline clipping converter -// There an optimized Liang-Basky algorithm is used. -// The algorithm doesn't optimize the degenerate edges, i.e. it will never -// break a closed polyline into two or more ones, instead, there will be -// degenerate edges coinciding with the respective clipping boundaries. -// This is a sub-optimal solution, because that optimization would require -// extra, rather expensive math while the rasterizer tolerates it quite well, -// without any considerable overhead. -// -//---------------------------------------------------------------------------- -#ifndef AGG_CONV_CLIP_polyline_INCLUDED -#define AGG_CONV_CLIP_polyline_INCLUDED - -#include "agg_basics.h" -#include "agg_conv_adaptor_vpgen.h" -#include "agg_vpgen_clip_polyline.h" - -namespace agg -{ - - //=======================================================conv_clip_polyline - template - struct conv_clip_polyline : public conv_adaptor_vpgen - { - typedef conv_adaptor_vpgen base_type; - - conv_clip_polyline(VertexSource& vs) : - conv_adaptor_vpgen(vs) {} - - void clip_box(double x1, double y1, double x2, double y2) - { - base_type::vpgen().clip_box(x1, y1, x2, y2); - } - - double x1() const { return base_type::vpgen().x1(); } - double y1() const { return base_type::vpgen().y1(); } - double x2() const { return base_type::vpgen().x2(); } - double y2() const { return base_type::vpgen().y2(); } - - private: - conv_clip_polyline(const conv_clip_polyline&); - const conv_clip_polyline& - operator = (const conv_clip_polyline&); - }; - -} - -#endif diff --git a/uppdev/aggdraw/agg_conv_close_polygon.h b/uppdev/aggdraw/agg_conv_close_polygon.h deleted file mode 100644 index e50deed62..000000000 --- a/uppdev/aggdraw/agg_conv_close_polygon.h +++ /dev/null @@ -1,134 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_CONV_CLOSE_POLYGON_INCLUDED -#define AGG_CONV_CLOSE_POLYGON_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - - //======================================================conv_close_polygon - template class conv_close_polygon - { - public: - explicit conv_close_polygon(VertexSource& vs) : m_source(&vs) {} - void attach(VertexSource& source) { m_source = &source; } - - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - conv_close_polygon(const conv_close_polygon&); - const conv_close_polygon& - operator = (const conv_close_polygon&); - - VertexSource* m_source; - unsigned m_cmd[2]; - double m_x[2]; - double m_y[2]; - unsigned m_vertex; - bool m_line_to; - }; - - - - //------------------------------------------------------------------------ - template - void conv_close_polygon::rewind(unsigned path_id) - { - m_source->rewind(path_id); - m_vertex = 2; - m_line_to = false; - } - - - - //------------------------------------------------------------------------ - template - unsigned conv_close_polygon::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_stop; - for(;;) - { - if(m_vertex < 2) - { - *x = m_x[m_vertex]; - *y = m_y[m_vertex]; - cmd = m_cmd[m_vertex]; - ++m_vertex; - break; - } - - cmd = m_source->vertex(x, y); - - if(is_end_poly(cmd)) - { - cmd |= path_flags_close; - break; - } - - if(is_stop(cmd)) - { - if(m_line_to) - { - m_cmd[0] = path_cmd_end_poly | path_flags_close; - m_cmd[1] = path_cmd_stop; - m_vertex = 0; - m_line_to = false; - continue; - } - break; - } - - if(is_move_to(cmd)) - { - if(m_line_to) - { - m_x[0] = 0.0; - m_y[0] = 0.0; - m_cmd[0] = path_cmd_end_poly | path_flags_close; - m_x[1] = *x; - m_y[1] = *y; - m_cmd[1] = cmd; - m_vertex = 0; - m_line_to = false; - continue; - } - break; - } - - if(is_vertex(cmd)) - { - m_line_to = true; - break; - } - } - return cmd; - } - -} - -#endif diff --git a/uppdev/aggdraw/agg_conv_concat.h b/uppdev/aggdraw/agg_conv_concat.h deleted file mode 100644 index 72ff0fc68..000000000 --- a/uppdev/aggdraw/agg_conv_concat.h +++ /dev/null @@ -1,82 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_CONV_CONCAT_INCLUDED -#define AGG_CONV_CONCAT_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - //=============================================================conv_concat - // Concatenation of two paths. Usually used to combine lines or curves - // with markers such as arrowheads - template class conv_concat - { - public: - conv_concat(VS1& source1, VS2& source2) : - m_source1(&source1), m_source2(&source2), m_status(2) {} - void attach1(VS1& source) { m_source1 = &source; } - void attach2(VS2& source) { m_source2 = &source; } - - - void rewind(unsigned path_id) - { - m_source1->rewind(path_id); - m_source2->rewind(0); - m_status = 0; - } - - unsigned vertex(double* x, double* y) - { - unsigned cmd; - if(m_status == 0) - { - cmd = m_source1->vertex(x, y); - if(!is_stop(cmd)) return cmd; - m_status = 1; - } - if(m_status == 1) - { - cmd = m_source2->vertex(x, y); - if(!is_stop(cmd)) return cmd; - m_status = 2; - } - return path_cmd_stop; - } - - private: - conv_concat(const conv_concat&); - const conv_concat& - operator = (const conv_concat&); - - VS1* m_source1; - VS2* m_source2; - int m_status; - - }; -} - - -#endif diff --git a/uppdev/aggdraw/agg_conv_contour.h b/uppdev/aggdraw/agg_conv_contour.h deleted file mode 100644 index ae05b02a1..000000000 --- a/uppdev/aggdraw/agg_conv_contour.h +++ /dev/null @@ -1,71 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_CONV_CONTOUR_INCLUDED -#define AGG_CONV_CONTOUR_INCLUDED - -#include "agg_basics.h" -#include "agg_vcgen_contour.h" -#include "agg_conv_adaptor_vcgen.h" - -namespace agg -{ - - //-----------------------------------------------------------conv_contour - template - struct conv_contour : public conv_adaptor_vcgen - { - typedef conv_adaptor_vcgen base_type; - - conv_contour(VertexSource& vs) : - conv_adaptor_vcgen(vs) - { - } - - void line_join(line_join_e lj) { base_type::generator().line_join(lj); } - void inner_join(inner_join_e ij) { base_type::generator().inner_join(ij); } - void width(double w) { base_type::generator().width(w); } - void miter_limit(double ml) { base_type::generator().miter_limit(ml); } - void miter_limit_theta(double t) { base_type::generator().miter_limit_theta(t); } - void inner_miter_limit(double ml) { base_type::generator().inner_miter_limit(ml); } - void approximation_scale(double as) { base_type::generator().approximation_scale(as); } - void auto_detect_orientation(bool v) { base_type::generator().auto_detect_orientation(v); } - - line_join_e line_join() const { return base_type::generator().line_join(); } - inner_join_e inner_join() const { return base_type::generator().inner_join(); } - double width() const { return base_type::generator().width(); } - double miter_limit() const { return base_type::generator().miter_limit(); } - double inner_miter_limit() const { return base_type::generator().inner_miter_limit(); } - double approximation_scale() const { return base_type::generator().approximation_scale(); } - bool auto_detect_orientation() const { return base_type::generator().auto_detect_orientation(); } - - private: - conv_contour(const conv_contour&); - const conv_contour& - operator = (const conv_contour&); - }; - -} - -#endif diff --git a/uppdev/aggdraw/agg_conv_curve.h b/uppdev/aggdraw/agg_conv_curve.h deleted file mode 100644 index 504bd4709..000000000 --- a/uppdev/aggdraw/agg_conv_curve.h +++ /dev/null @@ -1,206 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_CONV_CURVE_INCLUDED -#define AGG_CONV_CURVE_INCLUDED - -#include "agg_basics.h" -#include "agg_curves.h" - -namespace agg -{ - - - //---------------------------------------------------------------conv_curve - // Curve converter class. Any path storage can have Bezier curves defined - // by their control points. There're two types of curves supported: curve3 - // and curve4. Curve3 is a conic Bezier curve with 2 endpoints and 1 control - // point. Curve4 has 2 control points (4 points in total) and can be used - // to interpolate more complicated curves. Curve4, unlike curve3 can be used - // to approximate arcs, both circular and elliptical. Curves are approximated - // with straight lines and one of the approaches is just to store the whole - // sequence of vertices that approximate our curve. It takes additional - // memory, and at the same time the consecutive vertices can be calculated - // on demand. - // - // Initially, path storages are not suppose to keep all the vertices of the - // curves (although, nothing prevents us from doing so). Instead, path_storage - // keeps only vertices, needed to calculate a curve on demand. Those vertices - // are marked with special commands. So, if the path_storage contains curves - // (which are not real curves yet), and we render this storage directly, - // all we will see is only 2 or 3 straight line segments (for curve3 and - // curve4 respectively). If we need to see real curves drawn we need to - // include this class into the conversion pipeline. - // - // Class conv_curve recognizes commands path_cmd_curve3 and path_cmd_curve4 - // and converts these vertices into a move_to/line_to sequence. - //----------------------------------------------------------------------- - template class conv_curve - { - public: - typedef Curve3 curve3_type; - typedef Curve4 curve4_type; - typedef conv_curve self_type; - - explicit conv_curve(VertexSource& source) : - m_source(&source), m_last_x(0.0), m_last_y(0.0) {} - void attach(VertexSource& source) { m_source = &source; } - - void approximation_method(curve_approximation_method_e v) - { - m_curve3.approximation_method(v); - m_curve4.approximation_method(v); - } - - curve_approximation_method_e approximation_method() const - { - return m_curve4.approximation_method(); - } - - void approximation_scale(double s) - { - m_curve3.approximation_scale(s); - m_curve4.approximation_scale(s); - } - - double approximation_scale() const - { - return m_curve4.approximation_scale(); - } - - void angle_tolerance(double v) - { - m_curve3.angle_tolerance(v); - m_curve4.angle_tolerance(v); - } - - double angle_tolerance() const - { - return m_curve4.angle_tolerance(); - } - - void cusp_limit(double v) - { - m_curve3.cusp_limit(v); - m_curve4.cusp_limit(v); - } - - double cusp_limit() const - { - return m_curve4.cusp_limit(); - } - - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - conv_curve(const self_type&); - const self_type& operator = (const self_type&); - - VertexSource* m_source; - double m_last_x; - double m_last_y; - curve3_type m_curve3; - curve4_type m_curve4; - }; - - - - //------------------------------------------------------------------------ - template - void conv_curve::rewind(unsigned path_id) - { - m_source->rewind(path_id); - m_last_x = 0.0; - m_last_y = 0.0; - m_curve3.reset(); - m_curve4.reset(); - } - - - //------------------------------------------------------------------------ - template - unsigned conv_curve::vertex(double* x, double* y) - { - if(!is_stop(m_curve3.vertex(x, y))) - { - m_last_x = *x; - m_last_y = *y; - return path_cmd_line_to; - } - - if(!is_stop(m_curve4.vertex(x, y))) - { - m_last_x = *x; - m_last_y = *y; - return path_cmd_line_to; - } - - double ct2_x; - double ct2_y; - double end_x; - double end_y; - - unsigned cmd = m_source->vertex(x, y); - switch(cmd) - { - case path_cmd_curve3: - m_source->vertex(&end_x, &end_y); - - m_curve3.init(m_last_x, m_last_y, - *x, *y, - end_x, end_y); - - m_curve3.vertex(x, y); // First call returns path_cmd_move_to - m_curve3.vertex(x, y); // This is the first vertex of the curve - cmd = path_cmd_line_to; - break; - - case path_cmd_curve4: - m_source->vertex(&ct2_x, &ct2_y); - m_source->vertex(&end_x, &end_y); - - m_curve4.init(m_last_x, m_last_y, - *x, *y, - ct2_x, ct2_y, - end_x, end_y); - - m_curve4.vertex(x, y); // First call returns path_cmd_move_to - m_curve4.vertex(x, y); // This is the first vertex of the curve - cmd = path_cmd_line_to; - break; - } - m_last_x = *x; - m_last_y = *y; - return cmd; - } - - -} - - - -#endif diff --git a/uppdev/aggdraw/agg_conv_dash.h b/uppdev/aggdraw/agg_conv_dash.h deleted file mode 100644 index c3f1613b1..000000000 --- a/uppdev/aggdraw/agg_conv_dash.h +++ /dev/null @@ -1,74 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_CONV_DASH_INCLUDED -#define AGG_CONV_DASH_INCLUDED - -#include "agg_basics.h" -#include "agg_vcgen_dash.h" -#include "agg_conv_adaptor_vcgen.h" - -namespace agg -{ - - //---------------------------------------------------------------conv_dash - template - struct conv_dash : public conv_adaptor_vcgen - { - typedef Markers marker_type; - typedef conv_adaptor_vcgen base_type; - - conv_dash(VertexSource& vs) : - conv_adaptor_vcgen(vs) - { - } - - void remove_all_dashes() - { - base_type::generator().remove_all_dashes(); - } - - void add_dash(double dash_len, double gap_len) - { - base_type::generator().add_dash(dash_len, gap_len); - } - - void dash_start(double ds) - { - base_type::generator().dash_start(ds); - } - - void shorten(double s) { base_type::generator().shorten(s); } - double shorten() const { return base_type::generator().shorten(); } - - private: - conv_dash(const conv_dash&); - const conv_dash& - operator = (const conv_dash&); - }; - - -} - -#endif diff --git a/uppdev/aggdraw/agg_conv_gpc.h b/uppdev/aggdraw/agg_conv_gpc.h deleted file mode 100644 index c837c08cc..000000000 --- a/uppdev/aggdraw/agg_conv_gpc.h +++ /dev/null @@ -1,441 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// General Polygon Clipper based on the GPC library by Alan Murta -// Union, Intersection, XOR, A-B, B-A -// Contact the author if you intend to use it in commercial applications! -// http://www.cs.man.ac.uk/aig/staff/alan/software/ -// Alan Murta (email: gpc@cs.man.ac.uk) -// -//---------------------------------------------------------------------------- - -#ifndef AGG_CONV_GPC_INCLUDED -#define AGG_CONV_GPC_INCLUDED - -#include -#include "agg_basics.h" -#include "agg_array.h" - -extern "C" -{ -#include "gpc.h" -} - -namespace agg -{ - enum gpc_op_e - { - gpc_or, - gpc_and, - gpc_xor, - gpc_a_minus_b, - gpc_b_minus_a - }; - - - //================================================================conv_gpc - template class conv_gpc - { - enum status - { - status_move_to, - status_line_to, - status_stop - }; - - struct contour_header_type - { - int num_vertices; - int hole_flag; - gpc_vertex* vertices; - }; - - typedef pod_bvector vertex_array_type; - typedef pod_bvector contour_header_array_type; - - - public: - typedef VSA source_a_type; - typedef VSB source_b_type; - typedef conv_gpc self_type; - - ~conv_gpc() - { - free_gpc_data(); - } - - conv_gpc(source_a_type& a, source_b_type& b, gpc_op_e op = gpc_or) : - m_src_a(&a), - m_src_b(&b), - m_status(status_move_to), - m_vertex(-1), - m_contour(-1), - m_operation(op) - { - memset(&m_poly_a, 0, sizeof(m_poly_a)); - memset(&m_poly_b, 0, sizeof(m_poly_b)); - memset(&m_result, 0, sizeof(m_result)); - } - - void attach1(VSA& source) { m_src_a = &source; } - void attach2(VSB& source) { m_src_b = &source; } - - void operation(gpc_op_e v) { m_operation = v; } - - // Vertex Source Interface - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - conv_gpc(const conv_gpc&); - const conv_gpc& operator = (const conv_gpc&); - - //-------------------------------------------------------------------- - void free_polygon(gpc_polygon& p); - void free_result(); - void free_gpc_data(); - void start_contour(); - void add_vertex(double x, double y); - void end_contour(unsigned orientation); - void make_polygon(gpc_polygon& p); - void start_extracting(); - bool next_contour(); - bool next_vertex(double* x, double* y); - - - //-------------------------------------------------------------------- - template void add(VS& src, gpc_polygon& p) - { - unsigned cmd; - double x, y; - double start_x = 0.0; - double start_y = 0.0; - bool line_to = false; - unsigned orientation = 0; - - m_contour_accumulator.remove_all(); - - while(!is_stop(cmd = src.vertex(&x, &y))) - { - if(is_vertex(cmd)) - { - if(is_move_to(cmd)) - { - if(line_to) - { - end_contour(orientation); - orientation = 0; - } - start_contour(); - start_x = x; - start_y = y; - } - add_vertex(x, y); - line_to = true; - } - else - { - if(is_end_poly(cmd)) - { - orientation = get_orientation(cmd); - if(line_to && is_closed(cmd)) - { - add_vertex(start_x, start_y); - } - } - } - } - if(line_to) - { - end_contour(orientation); - } - make_polygon(p); - } - - - private: - //-------------------------------------------------------------------- - source_a_type* m_src_a; - source_b_type* m_src_b; - status m_status; - int m_vertex; - int m_contour; - gpc_op_e m_operation; - vertex_array_type m_vertex_accumulator; - contour_header_array_type m_contour_accumulator; - gpc_polygon m_poly_a; - gpc_polygon m_poly_b; - gpc_polygon m_result; - }; - - - - - - //------------------------------------------------------------------------ - template - void conv_gpc::free_polygon(gpc_polygon& p) - { - int i; - for(i = 0; i < p.num_contours; i++) - { - pod_allocator::deallocate(p.contour[i].vertex, - p.contour[i].num_vertices); - } - pod_allocator::deallocate(p.contour, p.num_contours); - memset(&p, 0, sizeof(gpc_polygon)); - } - - - //------------------------------------------------------------------------ - template - void conv_gpc::free_result() - { - if(m_result.contour) - { - gpc_free_polygon(&m_result); - } - memset(&m_result, 0, sizeof(m_result)); - } - - - //------------------------------------------------------------------------ - template - void conv_gpc::free_gpc_data() - { - free_polygon(m_poly_a); - free_polygon(m_poly_b); - free_result(); - } - - - //------------------------------------------------------------------------ - template - void conv_gpc::start_contour() - { - contour_header_type h; - memset(&h, 0, sizeof(h)); - m_contour_accumulator.add(h); - m_vertex_accumulator.remove_all(); - } - - - //------------------------------------------------------------------------ - template - inline void conv_gpc::add_vertex(double x, double y) - { - gpc_vertex v; - v.x = x; - v.y = y; - m_vertex_accumulator.add(v); - } - - - //------------------------------------------------------------------------ - template - void conv_gpc::end_contour(unsigned orientation) - { - if(m_contour_accumulator.size()) - { - if(m_vertex_accumulator.size() > 2) - { - contour_header_type& h = - m_contour_accumulator[m_contour_accumulator.size() - 1]; - - h.num_vertices = m_vertex_accumulator.size(); - h.hole_flag = 0; - - // TO DO: Clarify the "holes" - //if(is_cw(orientation)) h.hole_flag = 1; - - h.vertices = pod_allocator::allocate(h.num_vertices); - gpc_vertex* d = h.vertices; - int i; - for(i = 0; i < h.num_vertices; i++) - { - const gpc_vertex& s = m_vertex_accumulator[i]; - d->x = s.x; - d->y = s.y; - ++d; - } - } - else - { - m_vertex_accumulator.remove_last(); - } - } - } - - - //------------------------------------------------------------------------ - template - void conv_gpc::make_polygon(gpc_polygon& p) - { - free_polygon(p); - if(m_contour_accumulator.size()) - { - p.num_contours = m_contour_accumulator.size(); - - p.hole = 0; - p.contour = pod_allocator::allocate(p.num_contours); - - int i; - gpc_vertex_list* pv = p.contour; - for(i = 0; i < p.num_contours; i++) - { - const contour_header_type& h = m_contour_accumulator[i]; - pv->num_vertices = h.num_vertices; - pv->vertex = h.vertices; - ++pv; - } - } - } - - - //------------------------------------------------------------------------ - template - void conv_gpc::start_extracting() - { - m_status = status_move_to; - m_contour = -1; - m_vertex = -1; - } - - - //------------------------------------------------------------------------ - template - bool conv_gpc::next_contour() - { - if(++m_contour < m_result.num_contours) - { - m_vertex = -1; - return true; - } - return false; - } - - - //------------------------------------------------------------------------ - template - inline bool conv_gpc::next_vertex(double* x, double* y) - { - const gpc_vertex_list& vlist = m_result.contour[m_contour]; - if(++m_vertex < vlist.num_vertices) - { - const gpc_vertex& v = vlist.vertex[m_vertex]; - *x = v.x; - *y = v.y; - return true; - } - return false; - } - - - //------------------------------------------------------------------------ - template - void conv_gpc::rewind(unsigned path_id) - { - free_result(); - m_src_a->rewind(path_id); - m_src_b->rewind(path_id); - add(*m_src_a, m_poly_a); - add(*m_src_b, m_poly_b); - switch(m_operation) - { - case gpc_or: - gpc_polygon_clip(GPC_UNION, - &m_poly_a, - &m_poly_b, - &m_result); - break; - - case gpc_and: - gpc_polygon_clip(GPC_INT, - &m_poly_a, - &m_poly_b, - &m_result); - break; - - case gpc_xor: - gpc_polygon_clip(GPC_XOR, - &m_poly_a, - &m_poly_b, - &m_result); - break; - - case gpc_a_minus_b: - gpc_polygon_clip(GPC_DIFF, - &m_poly_a, - &m_poly_b, - &m_result); - break; - - case gpc_b_minus_a: - gpc_polygon_clip(GPC_DIFF, - &m_poly_b, - &m_poly_a, - &m_result); - break; - } - start_extracting(); - } - - - //------------------------------------------------------------------------ - template - unsigned conv_gpc::vertex(double* x, double* y) - { - if(m_status == status_move_to) - { - if(next_contour()) - { - if(next_vertex(x, y)) - { - m_status = status_line_to; - return path_cmd_move_to; - } - m_status = status_stop; - return path_cmd_end_poly | path_flags_close; - } - } - else - { - if(next_vertex(x, y)) - { - return path_cmd_line_to; - } - else - { - m_status = status_move_to; - } - return path_cmd_end_poly | path_flags_close; - } - return path_cmd_stop; - } - - -} - - -#endif diff --git a/uppdev/aggdraw/agg_conv_marker.h b/uppdev/aggdraw/agg_conv_marker.h deleted file mode 100644 index 69f8f7bde..000000000 --- a/uppdev/aggdraw/agg_conv_marker.h +++ /dev/null @@ -1,154 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_CONV_MARKER_INCLUDED -#define AGG_CONV_MARKER_INCLUDED - -#include "agg_basics.h" -#include "agg_trans_affine.h" - -namespace agg -{ - //-------------------------------------------------------------conv_marker - template - class conv_marker - { - public: - conv_marker(MarkerLocator& ml, MarkerShapes& ms); - - trans_affine& transform() { return m_transform; } - const trans_affine& transform() const { return m_transform; } - - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - conv_marker(const conv_marker&); - const conv_marker& - operator = (const conv_marker&); - - enum status_e - { - initial, - markers, - polygon, - stop - }; - - MarkerLocator* m_marker_locator; - MarkerShapes* m_marker_shapes; - trans_affine m_transform; - trans_affine m_mtx; - status_e m_status; - unsigned m_marker; - unsigned m_num_markers; - }; - - - //------------------------------------------------------------------------ - template - conv_marker::conv_marker(MarkerLocator& ml, MarkerShapes& ms) : - m_marker_locator(&ml), - m_marker_shapes(&ms), - m_status(initial), - m_marker(0), - m_num_markers(1) - { - } - - - //------------------------------------------------------------------------ - template - void conv_marker::rewind(unsigned) - { - m_status = initial; - m_marker = 0; - m_num_markers = 1; - } - - - //------------------------------------------------------------------------ - template - unsigned conv_marker::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_move_to; - double x1, y1, x2, y2; - - while(!is_stop(cmd)) - { - switch(m_status) - { - case initial: - if(m_num_markers == 0) - { - cmd = path_cmd_stop; - break; - } - m_marker_locator->rewind(m_marker); - ++m_marker; - m_num_markers = 0; - m_status = markers; - - case markers: - if(is_stop(m_marker_locator->vertex(&x1, &y1))) - { - m_status = initial; - break; - } - if(is_stop(m_marker_locator->vertex(&x2, &y2))) - { - m_status = initial; - break; - } - ++m_num_markers; - m_mtx = m_transform; - m_mtx *= trans_affine_rotation(atan2(y2 - y1, x2 - x1)); - m_mtx *= trans_affine_translation(x1, y1); - m_marker_shapes->rewind(m_marker - 1); - m_status = polygon; - - case polygon: - cmd = m_marker_shapes->vertex(x, y); - if(is_stop(cmd)) - { - cmd = path_cmd_move_to; - m_status = markers; - break; - } - m_mtx.transform(x, y); - return cmd; - - case stop: - cmd = path_cmd_stop; - break; - } - } - return cmd; - } - -} - - -#endif - diff --git a/uppdev/aggdraw/agg_conv_marker_adaptor.h b/uppdev/aggdraw/agg_conv_marker_adaptor.h deleted file mode 100644 index cef4ae99b..000000000 --- a/uppdev/aggdraw/agg_conv_marker_adaptor.h +++ /dev/null @@ -1,60 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_CONV_MARKER_ADAPTOR_INCLUDED -#define AGG_CONV_MARKER_ADAPTOR_INCLUDED - -#include "agg_basics.h" -#include "agg_conv_adaptor_vcgen.h" -#include "agg_vcgen_vertex_sequence.h" - -namespace agg -{ - - //=====================================================conv_marker_adaptor - template - struct conv_marker_adaptor : - public conv_adaptor_vcgen - { - typedef Markers marker_type; - typedef conv_adaptor_vcgen base_type; - - conv_marker_adaptor(VertexSource& vs) : - conv_adaptor_vcgen(vs) - { - } - - void shorten(double s) { base_type::generator().shorten(s); } - double shorten() const { return base_type::generator().shorten(); } - - private: - conv_marker_adaptor(const conv_marker_adaptor&); - const conv_marker_adaptor& - operator = (const conv_marker_adaptor&); - }; - - -} - -#endif diff --git a/uppdev/aggdraw/agg_conv_segmentator.h b/uppdev/aggdraw/agg_conv_segmentator.h deleted file mode 100644 index a81c7f152..000000000 --- a/uppdev/aggdraw/agg_conv_segmentator.h +++ /dev/null @@ -1,57 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_CONV_SEGMENTATOR_INCLUDED -#define AGG_CONV_SEGMENTATOR_INCLUDED - -#include "agg_basics.h" -#include "agg_conv_adaptor_vpgen.h" -#include "agg_vpgen_segmentator.h" - -namespace agg -{ - - //========================================================conv_segmentator - template - struct conv_segmentator : public conv_adaptor_vpgen - { - typedef conv_adaptor_vpgen base_type; - - conv_segmentator(VertexSource& vs) : - conv_adaptor_vpgen(vs) {} - - void approximation_scale(double s) { base_type::vpgen().approximation_scale(s); } - double approximation_scale() const { return base_type::vpgen().approximation_scale(); } - - private: - conv_segmentator(const conv_segmentator&); - const conv_segmentator& - operator = (const conv_segmentator&); - }; - - -} - -#endif - diff --git a/uppdev/aggdraw/agg_conv_shorten_path.h b/uppdev/aggdraw/agg_conv_shorten_path.h deleted file mode 100644 index c8c7bcfa6..000000000 --- a/uppdev/aggdraw/agg_conv_shorten_path.h +++ /dev/null @@ -1,59 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_CONV_SHORTEN_PATH_INCLUDED -#define AGG_CONV_SHORTEN_PATH_INCLUDED - -#include "agg_basics.h" -#include "agg_conv_adaptor_vcgen.h" -#include "agg_vcgen_vertex_sequence.h" - -namespace agg -{ - - //=======================================================conv_shorten_path - template class conv_shorten_path : - public conv_adaptor_vcgen - { - public: - typedef conv_adaptor_vcgen base_type; - - conv_shorten_path(VertexSource& vs) : - conv_adaptor_vcgen(vs) - { - } - - void shorten(double s) { base_type::generator().shorten(s); } - double shorten() const { return base_type::generator().shorten(); } - - private: - conv_shorten_path(const conv_shorten_path&); - const conv_shorten_path& - operator = (const conv_shorten_path&); - }; - - -} - -#endif diff --git a/uppdev/aggdraw/agg_conv_smooth_poly1.h b/uppdev/aggdraw/agg_conv_smooth_poly1.h deleted file mode 100644 index 73d0e1066..000000000 --- a/uppdev/aggdraw/agg_conv_smooth_poly1.h +++ /dev/null @@ -1,86 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_CONV_SMOOTH_POLY1_INCLUDED -#define AGG_CONV_SMOOTH_POLY1_INCLUDED - -#include "agg_basics.h" -#include "agg_vcgen_smooth_poly1.h" -#include "agg_conv_adaptor_vcgen.h" -#include "agg_conv_curve.h" - - -namespace agg -{ - - //-------------------------------------------------------conv_smooth_poly1 - template - struct conv_smooth_poly1 : - public conv_adaptor_vcgen - { - typedef conv_adaptor_vcgen base_type; - - conv_smooth_poly1(VertexSource& vs) : - conv_adaptor_vcgen(vs) - { - } - - void smooth_value(double v) { base_type::generator().smooth_value(v); } - double smooth_value() const { return base_type::generator().smooth_value(); } - - private: - conv_smooth_poly1(const conv_smooth_poly1&); - const conv_smooth_poly1& - operator = (const conv_smooth_poly1&); - }; - - - - //-------------------------------------------------conv_smooth_poly1_curve - template - struct conv_smooth_poly1_curve : - public conv_curve > - { - conv_smooth_poly1_curve(VertexSource& vs) : - conv_curve >(m_smooth), - m_smooth(vs) - { - } - - void smooth_value(double v) { m_smooth.generator().smooth_value(v); } - double smooth_value() const { return m_smooth.generator().smooth_value(); } - - private: - conv_smooth_poly1_curve(const conv_smooth_poly1_curve&); - const conv_smooth_poly1_curve& - operator = (const conv_smooth_poly1_curve&); - - conv_smooth_poly1 m_smooth; - }; - -} - - -#endif - diff --git a/uppdev/aggdraw/agg_conv_stroke.h b/uppdev/aggdraw/agg_conv_stroke.h deleted file mode 100644 index 73b7801fe..000000000 --- a/uppdev/aggdraw/agg_conv_stroke.h +++ /dev/null @@ -1,79 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_CONV_STROKE_INCLUDED -#define AGG_CONV_STROKE_INCLUDED - -#include "agg_basics.h" -#include "agg_vcgen_stroke.h" -#include "agg_conv_adaptor_vcgen.h" - -namespace agg -{ - - //-------------------------------------------------------------conv_stroke - template - struct conv_stroke : - public conv_adaptor_vcgen - { - typedef Markers marker_type; - typedef conv_adaptor_vcgen base_type; - - conv_stroke(VertexSource& vs) : - conv_adaptor_vcgen(vs) - { - } - - void line_cap(line_cap_e lc) { base_type::generator().line_cap(lc); } - void line_join(line_join_e lj) { base_type::generator().line_join(lj); } - void inner_join(inner_join_e ij) { base_type::generator().inner_join(ij); } - - line_cap_e line_cap() const { return base_type::generator().line_cap(); } - line_join_e line_join() const { return base_type::generator().line_join(); } - inner_join_e inner_join() const { return base_type::generator().inner_join(); } - - void width(double w) { base_type::generator().width(w); } - void miter_limit(double ml) { base_type::generator().miter_limit(ml); } - void miter_limit_theta(double t) { base_type::generator().miter_limit_theta(t); } - void inner_miter_limit(double ml) { base_type::generator().inner_miter_limit(ml); } - void approximation_scale(double as) { base_type::generator().approximation_scale(as); } - - double width() const { return base_type::generator().width(); } - double miter_limit() const { return base_type::generator().miter_limit(); } - double inner_miter_limit() const { return base_type::generator().inner_miter_limit(); } - double approximation_scale() const { return base_type::generator().approximation_scale(); } - - void shorten(double s) { base_type::generator().shorten(s); } - double shorten() const { return base_type::generator().shorten(); } - - private: - conv_stroke(const conv_stroke&); - const conv_stroke& - operator = (const conv_stroke&); - - }; - -} - -#endif diff --git a/uppdev/aggdraw/agg_conv_transform.h b/uppdev/aggdraw/agg_conv_transform.h deleted file mode 100644 index 3ed2a9841..000000000 --- a/uppdev/aggdraw/agg_conv_transform.h +++ /dev/null @@ -1,74 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_CONV_TRANSFORM_INCLUDED -#define AGG_CONV_TRANSFORM_INCLUDED - -#include "agg_basics.h" -#include "agg_trans_affine.h" - -namespace agg -{ - - //----------------------------------------------------------conv_transform - template class conv_transform - { - public: - conv_transform(VertexSource& source, const Transformer& tr) : - m_source(&source), m_trans(&tr) {} - void attach(VertexSource& source) { m_source = &source; } - - void rewind(unsigned path_id) - { - m_source->rewind(path_id); - } - - unsigned vertex(double* x, double* y) - { - unsigned cmd = m_source->vertex(x, y); - if(is_vertex(cmd)) - { - m_trans->transform(x, y); - } - return cmd; - } - - void transformer(const Transformer& tr) - { - m_trans = &tr; - } - - private: - conv_transform(const conv_transform&); - const conv_transform& - operator = (const conv_transform&); - - VertexSource* m_source; - const Transformer* m_trans; - }; - - -} - -#endif diff --git a/uppdev/aggdraw/agg_conv_unclose_polygon.h b/uppdev/aggdraw/agg_conv_unclose_polygon.h deleted file mode 100644 index 76070e92c..000000000 --- a/uppdev/aggdraw/agg_conv_unclose_polygon.h +++ /dev/null @@ -1,61 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_CONV_UNCLOSE_POLYGON_INCLUDED -#define AGG_CONV_UNCLOSE_POLYGON_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - //====================================================conv_unclose_polygon - template class conv_unclose_polygon - { - public: - explicit conv_unclose_polygon(VertexSource& vs) : m_source(&vs) {} - void attach(VertexSource& source) { m_source = &source; } - - void rewind(unsigned path_id) - { - m_source->rewind(path_id); - } - - unsigned vertex(double* x, double* y) - { - unsigned cmd = m_source->vertex(x, y); - if(is_end_poly(cmd)) cmd &= ~path_flags_close; - return cmd; - } - - private: - conv_unclose_polygon(const conv_unclose_polygon&); - const conv_unclose_polygon& - operator = (const conv_unclose_polygon&); - - VertexSource* m_source; - }; - -} - -#endif diff --git a/uppdev/aggdraw/agg_curves.cpp b/uppdev/aggdraw/agg_curves.cpp deleted file mode 100644 index eec67d21f..000000000 --- a/uppdev/aggdraw/agg_curves.cpp +++ /dev/null @@ -1,620 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#include -#include "agg_curves.h" -#include "agg_math.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - const double curve_distance_epsilon = 1e-30; - const double curve_collinearity_epsilon = 1e-30; - const double curve_angle_tolerance_epsilon = 0.01; - enum curve_recursion_limit_e { curve_recursion_limit = 32 }; - - - - //------------------------------------------------------------------------ - void curve3_inc::approximation_scale(double s) - { - m_scale = s; - } - - //------------------------------------------------------------------------ - double curve3_inc::approximation_scale() const - { - return m_scale; - } - - //------------------------------------------------------------------------ - void curve3_inc::init(double x1, double y1, - double x2, double y2, - double x3, double y3) - { - m_start_x = x1; - m_start_y = y1; - m_end_x = x3; - m_end_y = y3; - - double dx1 = x2 - x1; - double dy1 = y2 - y1; - double dx2 = x3 - x2; - double dy2 = y3 - y2; - - double len = sqrt(dx1 * dx1 + dy1 * dy1) + sqrt(dx2 * dx2 + dy2 * dy2); - - m_num_steps = uround(len * 0.25 * m_scale); - - if(m_num_steps < 4) - { - m_num_steps = 4; - } - - double subdivide_step = 1.0 / m_num_steps; - double subdivide_step2 = subdivide_step * subdivide_step; - - double tmpx = (x1 - x2 * 2.0 + x3) * subdivide_step2; - double tmpy = (y1 - y2 * 2.0 + y3) * subdivide_step2; - - m_saved_fx = m_fx = x1; - m_saved_fy = m_fy = y1; - - m_saved_dfx = m_dfx = tmpx + (x2 - x1) * (2.0 * subdivide_step); - m_saved_dfy = m_dfy = tmpy + (y2 - y1) * (2.0 * subdivide_step); - - m_ddfx = tmpx * 2.0; - m_ddfy = tmpy * 2.0; - - m_step = m_num_steps; - } - - //------------------------------------------------------------------------ - void curve3_inc::rewind(unsigned) - { - if(m_num_steps == 0) - { - m_step = -1; - return; - } - m_step = m_num_steps; - m_fx = m_saved_fx; - m_fy = m_saved_fy; - m_dfx = m_saved_dfx; - m_dfy = m_saved_dfy; - } - - //------------------------------------------------------------------------ - unsigned curve3_inc::vertex(double* x, double* y) - { - if(m_step < 0) return path_cmd_stop; - if(m_step == m_num_steps) - { - *x = m_start_x; - *y = m_start_y; - --m_step; - return path_cmd_move_to; - } - if(m_step == 0) - { - *x = m_end_x; - *y = m_end_y; - --m_step; - return path_cmd_line_to; - } - m_fx += m_dfx; - m_fy += m_dfy; - m_dfx += m_ddfx; - m_dfy += m_ddfy; - *x = m_fx; - *y = m_fy; - --m_step; - return path_cmd_line_to; - } - - //------------------------------------------------------------------------ - void curve3_div::init(double x1, double y1, - double x2, double y2, - double x3, double y3) - { - m_points.remove_all(); - m_distance_tolerance_square = 0.5 / m_approximation_scale; - m_distance_tolerance_square *= m_distance_tolerance_square; - bezier(x1, y1, x2, y2, x3, y3); - m_count = 0; - } - - //------------------------------------------------------------------------ - void curve3_div::recursive_bezier(double x1, double y1, - double x2, double y2, - double x3, double y3, - unsigned level) - { - if(level > curve_recursion_limit) - { - return; - } - - // Calculate all the mid-points of the line segments - //---------------------- - double x12 = (x1 + x2) / 2; - double y12 = (y1 + y2) / 2; - double x23 = (x2 + x3) / 2; - double y23 = (y2 + y3) / 2; - double x123 = (x12 + x23) / 2; - double y123 = (y12 + y23) / 2; - - double dx = x3-x1; - double dy = y3-y1; - double d = fabs(((x2 - x3) * dy - (y2 - y3) * dx)); - double da; - - if(d > curve_collinearity_epsilon) - { - // Regular case - //----------------- - if(d * d <= m_distance_tolerance_square * (dx*dx + dy*dy)) - { - // If the curvature doesn't exceed the distance_tolerance value - // we tend to finish subdivisions. - //---------------------- - if(m_angle_tolerance < curve_angle_tolerance_epsilon) - { - m_points.add(point_d(x123, y123)); - return; - } - - // Angle & Cusp Condition - //---------------------- - da = fabs(atan2(y3 - y2, x3 - x2) - atan2(y2 - y1, x2 - x1)); - if(da >= pi) da = 2*pi - da; - - if(da < m_angle_tolerance) - { - // Finally we can stop the recursion - //---------------------- - m_points.add(point_d(x123, y123)); - return; - } - } - } - else - { - // Collinear case - //------------------ - da = dx*dx + dy*dy; - if(da == 0) - { - d = calc_sq_distance(x1, y1, x2, y2); - } - else - { - d = ((x2 - x1)*dx + (y2 - y1)*dy) / da; - if(d > 0 && d < 1) - { - // Simple collinear case, 1---2---3 - // We can leave just two endpoints - return; - } - if(d <= 0) d = calc_sq_distance(x2, y2, x1, y1); - else if(d >= 1) d = calc_sq_distance(x2, y2, x3, y3); - else d = calc_sq_distance(x2, y2, x1 + d*dx, y1 + d*dy); - } - if(d < m_distance_tolerance_square) - { - m_points.add(point_d(x2, y2)); - return; - } - } - - // Continue subdivision - //---------------------- - recursive_bezier(x1, y1, x12, y12, x123, y123, level + 1); - recursive_bezier(x123, y123, x23, y23, x3, y3, level + 1); - } - - //------------------------------------------------------------------------ - void curve3_div::bezier(double x1, double y1, - double x2, double y2, - double x3, double y3) - { - m_points.add(point_d(x1, y1)); - recursive_bezier(x1, y1, x2, y2, x3, y3, 0); - m_points.add(point_d(x3, y3)); - } - - - - - - //------------------------------------------------------------------------ - void curve4_inc::approximation_scale(double s) - { - m_scale = s; - } - - //------------------------------------------------------------------------ - double curve4_inc::approximation_scale() const - { - return m_scale; - } - - //------------------------------------------------------------------------ - static double MSC60_fix_ICE(double v) { return v; } - - //------------------------------------------------------------------------ - void curve4_inc::init(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4) - { - m_start_x = x1; - m_start_y = y1; - m_end_x = x4; - m_end_y = y4; - - double dx1 = x2 - x1; - double dy1 = y2 - y1; - double dx2 = x3 - x2; - double dy2 = y3 - y2; - double dx3 = x4 - x3; - double dy3 = y4 - y3; - - double len = (sqrt(dx1 * dx1 + dy1 * dy1) + - sqrt(dx2 * dx2 + dy2 * dy2) + - sqrt(dx3 * dx3 + dy3 * dy3)) * 0.25 * m_scale; - -#if defined(_MSC_VER) && _MSC_VER <= 1200 - m_num_steps = uround(MSC60_fix_ICE(len)); -#else - m_num_steps = uround(len); -#endif - - if(m_num_steps < 4) - { - m_num_steps = 4; - } - - double subdivide_step = 1.0 / m_num_steps; - double subdivide_step2 = subdivide_step * subdivide_step; - double subdivide_step3 = subdivide_step * subdivide_step * subdivide_step; - - double pre1 = 3.0 * subdivide_step; - double pre2 = 3.0 * subdivide_step2; - double pre4 = 6.0 * subdivide_step2; - double pre5 = 6.0 * subdivide_step3; - - double tmp1x = x1 - x2 * 2.0 + x3; - double tmp1y = y1 - y2 * 2.0 + y3; - - double tmp2x = (x2 - x3) * 3.0 - x1 + x4; - double tmp2y = (y2 - y3) * 3.0 - y1 + y4; - - m_saved_fx = m_fx = x1; - m_saved_fy = m_fy = y1; - - m_saved_dfx = m_dfx = (x2 - x1) * pre1 + tmp1x * pre2 + tmp2x * subdivide_step3; - m_saved_dfy = m_dfy = (y2 - y1) * pre1 + tmp1y * pre2 + tmp2y * subdivide_step3; - - m_saved_ddfx = m_ddfx = tmp1x * pre4 + tmp2x * pre5; - m_saved_ddfy = m_ddfy = tmp1y * pre4 + tmp2y * pre5; - - m_dddfx = tmp2x * pre5; - m_dddfy = tmp2y * pre5; - - m_step = m_num_steps; - } - - //------------------------------------------------------------------------ - void curve4_inc::rewind(unsigned) - { - if(m_num_steps == 0) - { - m_step = -1; - return; - } - m_step = m_num_steps; - m_fx = m_saved_fx; - m_fy = m_saved_fy; - m_dfx = m_saved_dfx; - m_dfy = m_saved_dfy; - m_ddfx = m_saved_ddfx; - m_ddfy = m_saved_ddfy; - } - - //------------------------------------------------------------------------ - unsigned curve4_inc::vertex(double* x, double* y) - { - if(m_step < 0) return path_cmd_stop; - if(m_step == m_num_steps) - { - *x = m_start_x; - *y = m_start_y; - --m_step; - return path_cmd_move_to; - } - - if(m_step == 0) - { - *x = m_end_x; - *y = m_end_y; - --m_step; - return path_cmd_line_to; - } - - m_fx += m_dfx; - m_fy += m_dfy; - m_dfx += m_ddfx; - m_dfy += m_ddfy; - m_ddfx += m_dddfx; - m_ddfy += m_dddfy; - - *x = m_fx; - *y = m_fy; - --m_step; - return path_cmd_line_to; - } - - - - - //------------------------------------------------------------------------ - void curve4_div::init(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4) - { - m_points.remove_all(); - m_distance_tolerance_square = 0.5 / m_approximation_scale; - m_distance_tolerance_square *= m_distance_tolerance_square; - bezier(x1, y1, x2, y2, x3, y3, x4, y4); - m_count = 0; - } - - //------------------------------------------------------------------------ - void curve4_div::recursive_bezier(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4, - unsigned level) - { - if(level > curve_recursion_limit) - { - return; - } - - // Calculate all the mid-points of the line segments - //---------------------- - double x12 = (x1 + x2) / 2; - double y12 = (y1 + y2) / 2; - double x23 = (x2 + x3) / 2; - double y23 = (y2 + y3) / 2; - double x34 = (x3 + x4) / 2; - double y34 = (y3 + y4) / 2; - double x123 = (x12 + x23) / 2; - double y123 = (y12 + y23) / 2; - double x234 = (x23 + x34) / 2; - double y234 = (y23 + y34) / 2; - double x1234 = (x123 + x234) / 2; - double y1234 = (y123 + y234) / 2; - - - // Try to approximate the full cubic curve by a single straight line - //------------------ - double dx = x4-x1; - double dy = y4-y1; - - double d2 = fabs(((x2 - x4) * dy - (y2 - y4) * dx)); - double d3 = fabs(((x3 - x4) * dy - (y3 - y4) * dx)); - double da1, da2, k; - - switch((int(d2 > curve_collinearity_epsilon) << 1) + - int(d3 > curve_collinearity_epsilon)) - { - case 0: - // All collinear OR p1==p4 - //---------------------- - k = dx*dx + dy*dy; - if(k == 0) - { - d2 = calc_sq_distance(x1, y1, x2, y2); - d3 = calc_sq_distance(x4, y4, x3, y3); - } - else - { - k = 1 / k; - da1 = x2 - x1; - da2 = y2 - y1; - d2 = k * (da1*dx + da2*dy); - da1 = x3 - x1; - da2 = y3 - y1; - d3 = k * (da1*dx + da2*dy); - if(d2 > 0 && d2 < 1 && d3 > 0 && d3 < 1) - { - // Simple collinear case, 1---2---3---4 - // We can leave just two endpoints - return; - } - if(d2 <= 0) d2 = calc_sq_distance(x2, y2, x1, y1); - else if(d2 >= 1) d2 = calc_sq_distance(x2, y2, x4, y4); - else d2 = calc_sq_distance(x2, y2, x1 + d2*dx, y1 + d2*dy); - - if(d3 <= 0) d3 = calc_sq_distance(x3, y3, x1, y1); - else if(d3 >= 1) d3 = calc_sq_distance(x3, y3, x4, y4); - else d3 = calc_sq_distance(x3, y3, x1 + d3*dx, y1 + d3*dy); - } - if(d2 > d3) - { - if(d2 < m_distance_tolerance_square) - { - m_points.add(point_d(x2, y2)); - return; - } - } - else - { - if(d3 < m_distance_tolerance_square) - { - m_points.add(point_d(x3, y3)); - return; - } - } - break; - - case 1: - // p1,p2,p4 are collinear, p3 is significant - //---------------------- - if(d3 * d3 <= m_distance_tolerance_square * (dx*dx + dy*dy)) - { - if(m_angle_tolerance < curve_angle_tolerance_epsilon) - { - m_points.add(point_d(x23, y23)); - return; - } - - // Angle Condition - //---------------------- - da1 = fabs(atan2(y4 - y3, x4 - x3) - atan2(y3 - y2, x3 - x2)); - if(da1 >= pi) da1 = 2*pi - da1; - - if(da1 < m_angle_tolerance) - { - m_points.add(point_d(x2, y2)); - m_points.add(point_d(x3, y3)); - return; - } - - if(m_cusp_limit != 0.0) - { - if(da1 > m_cusp_limit) - { - m_points.add(point_d(x3, y3)); - return; - } - } - } - break; - - case 2: - // p1,p3,p4 are collinear, p2 is significant - //---------------------- - if(d2 * d2 <= m_distance_tolerance_square * (dx*dx + dy*dy)) - { - if(m_angle_tolerance < curve_angle_tolerance_epsilon) - { - m_points.add(point_d(x23, y23)); - return; - } - - // Angle Condition - //---------------------- - da1 = fabs(atan2(y3 - y2, x3 - x2) - atan2(y2 - y1, x2 - x1)); - if(da1 >= pi) da1 = 2*pi - da1; - - if(da1 < m_angle_tolerance) - { - m_points.add(point_d(x2, y2)); - m_points.add(point_d(x3, y3)); - return; - } - - if(m_cusp_limit != 0.0) - { - if(da1 > m_cusp_limit) - { - m_points.add(point_d(x2, y2)); - return; - } - } - } - break; - - case 3: - // Regular case - //----------------- - if((d2 + d3)*(d2 + d3) <= m_distance_tolerance_square * (dx*dx + dy*dy)) - { - // If the curvature doesn't exceed the distance_tolerance value - // we tend to finish subdivisions. - //---------------------- - if(m_angle_tolerance < curve_angle_tolerance_epsilon) - { - m_points.add(point_d(x23, y23)); - return; - } - - // Angle & Cusp Condition - //---------------------- - k = atan2(y3 - y2, x3 - x2); - da1 = fabs(k - atan2(y2 - y1, x2 - x1)); - da2 = fabs(atan2(y4 - y3, x4 - x3) - k); - if(da1 >= pi) da1 = 2*pi - da1; - if(da2 >= pi) da2 = 2*pi - da2; - - if(da1 + da2 < m_angle_tolerance) - { - // Finally we can stop the recursion - //---------------------- - m_points.add(point_d(x23, y23)); - return; - } - - if(m_cusp_limit != 0.0) - { - if(da1 > m_cusp_limit) - { - m_points.add(point_d(x2, y2)); - return; - } - - if(da2 > m_cusp_limit) - { - m_points.add(point_d(x3, y3)); - return; - } - } - } - break; - } - - // Continue subdivision - //---------------------- - recursive_bezier(x1, y1, x12, y12, x123, y123, x1234, y1234, level + 1); - recursive_bezier(x1234, y1234, x234, y234, x34, y34, x4, y4, level + 1); - } - - //------------------------------------------------------------------------ - void curve4_div::bezier(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4) - { - m_points.add(point_d(x1, y1)); - recursive_bezier(x1, y1, x2, y2, x3, y3, x4, y4, 0); - m_points.add(point_d(x4, y4)); - } - -} - diff --git a/uppdev/aggdraw/agg_curves.h b/uppdev/aggdraw/agg_curves.h deleted file mode 100644 index ca2f5bc65..000000000 --- a/uppdev/aggdraw/agg_curves.h +++ /dev/null @@ -1,701 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_CURVES_INCLUDED -#define AGG_CURVES_INCLUDED - -#include "agg_array.h" - -namespace agg -{ - - // See Implementation agg_curves.cpp - - //--------------------------------------------curve_approximation_method_e - enum curve_approximation_method_e - { - curve_inc, - curve_div - }; - - //--------------------------------------------------------------curve3_inc - class curve3_inc - { - public: - curve3_inc() : - m_num_steps(0), m_step(0), m_scale(1.0) { } - - curve3_inc(double x1, double y1, - double x2, double y2, - double x3, double y3) : - m_num_steps(0), m_step(0), m_scale(1.0) - { - init(x1, y1, x2, y2, x3, y3); - } - - void reset() { m_num_steps = 0; m_step = -1; } - void init(double x1, double y1, - double x2, double y2, - double x3, double y3); - - void approximation_method(curve_approximation_method_e) {} - curve_approximation_method_e approximation_method() const { return curve_inc; } - - void approximation_scale(double s); - double approximation_scale() const; - - void angle_tolerance(double) {} - double angle_tolerance() const { return 0.0; } - - void cusp_limit(double) {} - double cusp_limit() const { return 0.0; } - - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - int m_num_steps; - int m_step; - double m_scale; - double m_start_x; - double m_start_y; - double m_end_x; - double m_end_y; - double m_fx; - double m_fy; - double m_dfx; - double m_dfy; - double m_ddfx; - double m_ddfy; - double m_saved_fx; - double m_saved_fy; - double m_saved_dfx; - double m_saved_dfy; - }; - - - - - - //-------------------------------------------------------------curve3_div - class curve3_div - { - public: - curve3_div() : - m_approximation_scale(1.0), - m_angle_tolerance(0.0), - m_count(0) - {} - - curve3_div(double x1, double y1, - double x2, double y2, - double x3, double y3) : - m_approximation_scale(1.0), - m_angle_tolerance(0.0), - m_count(0) - { - init(x1, y1, x2, y2, x3, y3); - } - - void reset() { m_points.remove_all(); m_count = 0; } - void init(double x1, double y1, - double x2, double y2, - double x3, double y3); - - void approximation_method(curve_approximation_method_e) {} - curve_approximation_method_e approximation_method() const { return curve_div; } - - void approximation_scale(double s) { m_approximation_scale = s; } - double approximation_scale() const { return m_approximation_scale; } - - void angle_tolerance(double a) { m_angle_tolerance = a; } - double angle_tolerance() const { return m_angle_tolerance; } - - void cusp_limit(double) {} - double cusp_limit() const { return 0.0; } - - void rewind(unsigned) - { - m_count = 0; - } - - unsigned vertex(double* x, double* y) - { - if(m_count >= m_points.size()) return path_cmd_stop; - const point_d& p = m_points[m_count++]; - *x = p.x; - *y = p.y; - return (m_count == 1) ? path_cmd_move_to : path_cmd_line_to; - } - - private: - void bezier(double x1, double y1, - double x2, double y2, - double x3, double y3); - void recursive_bezier(double x1, double y1, - double x2, double y2, - double x3, double y3, - unsigned level); - - double m_approximation_scale; - double m_distance_tolerance_square; - double m_angle_tolerance; - unsigned m_count; - pod_bvector m_points; - }; - - - - - - - - //-------------------------------------------------------------curve4_points - struct curve4_points - { - double cp[8]; - curve4_points() {} - curve4_points(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4) - { - cp[0] = x1; cp[1] = y1; cp[2] = x2; cp[3] = y2; - cp[4] = x3; cp[5] = y3; cp[6] = x4; cp[7] = y4; - } - void init(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4) - { - cp[0] = x1; cp[1] = y1; cp[2] = x2; cp[3] = y2; - cp[4] = x3; cp[5] = y3; cp[6] = x4; cp[7] = y4; - } - double operator [] (unsigned i) const { return cp[i]; } - double& operator [] (unsigned i) { return cp[i]; } - }; - - - - //-------------------------------------------------------------curve4_inc - class curve4_inc - { - public: - curve4_inc() : - m_num_steps(0), m_step(0), m_scale(1.0) { } - - curve4_inc(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4) : - m_num_steps(0), m_step(0), m_scale(1.0) - { - init(x1, y1, x2, y2, x3, y3, x4, y4); - } - - curve4_inc(const curve4_points& cp) : - m_num_steps(0), m_step(0), m_scale(1.0) - { - init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); - } - - void reset() { m_num_steps = 0; m_step = -1; } - void init(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4); - - void init(const curve4_points& cp) - { - init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); - } - - void approximation_method(curve_approximation_method_e) {} - curve_approximation_method_e approximation_method() const { return curve_inc; } - - void approximation_scale(double s); - double approximation_scale() const; - - void angle_tolerance(double) {} - double angle_tolerance() const { return 0.0; } - - void cusp_limit(double) {} - double cusp_limit() const { return 0.0; } - - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - int m_num_steps; - int m_step; - double m_scale; - double m_start_x; - double m_start_y; - double m_end_x; - double m_end_y; - double m_fx; - double m_fy; - double m_dfx; - double m_dfy; - double m_ddfx; - double m_ddfy; - double m_dddfx; - double m_dddfy; - double m_saved_fx; - double m_saved_fy; - double m_saved_dfx; - double m_saved_dfy; - double m_saved_ddfx; - double m_saved_ddfy; - }; - - - - //-------------------------------------------------------catrom_to_bezier - inline curve4_points catrom_to_bezier(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4) - { - // Trans. matrix Catmull-Rom to Bezier - // - // 0 1 0 0 - // -1/6 1 1/6 0 - // 0 1/6 1 -1/6 - // 0 0 1 0 - // - return curve4_points( - x2, - y2, - (-x1 + 6*x2 + x3) / 6, - (-y1 + 6*y2 + y3) / 6, - ( x2 + 6*x3 - x4) / 6, - ( y2 + 6*y3 - y4) / 6, - x3, - y3); - } - - - //----------------------------------------------------------------------- - inline curve4_points - catrom_to_bezier(const curve4_points& cp) - { - return catrom_to_bezier(cp[0], cp[1], cp[2], cp[3], - cp[4], cp[5], cp[6], cp[7]); - } - - - - //-----------------------------------------------------ubspline_to_bezier - inline curve4_points ubspline_to_bezier(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4) - { - // Trans. matrix Uniform BSpline to Bezier - // - // 1/6 4/6 1/6 0 - // 0 4/6 2/6 0 - // 0 2/6 4/6 0 - // 0 1/6 4/6 1/6 - // - return curve4_points( - (x1 + 4*x2 + x3) / 6, - (y1 + 4*y2 + y3) / 6, - (4*x2 + 2*x3) / 6, - (4*y2 + 2*y3) / 6, - (2*x2 + 4*x3) / 6, - (2*y2 + 4*y3) / 6, - (x2 + 4*x3 + x4) / 6, - (y2 + 4*y3 + y4) / 6); - } - - - //----------------------------------------------------------------------- - inline curve4_points - ubspline_to_bezier(const curve4_points& cp) - { - return ubspline_to_bezier(cp[0], cp[1], cp[2], cp[3], - cp[4], cp[5], cp[6], cp[7]); - } - - - - - //------------------------------------------------------hermite_to_bezier - inline curve4_points hermite_to_bezier(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4) - { - // Trans. matrix Hermite to Bezier - // - // 1 0 0 0 - // 1 0 1/3 0 - // 0 1 0 -1/3 - // 0 1 0 0 - // - return curve4_points( - x1, - y1, - (3*x1 + x3) / 3, - (3*y1 + y3) / 3, - (3*x2 - x4) / 3, - (3*y2 - y4) / 3, - x2, - y2); - } - - - - //----------------------------------------------------------------------- - inline curve4_points - hermite_to_bezier(const curve4_points& cp) - { - return hermite_to_bezier(cp[0], cp[1], cp[2], cp[3], - cp[4], cp[5], cp[6], cp[7]); - } - - - //-------------------------------------------------------------curve4_div - class curve4_div - { - public: - curve4_div() : - m_approximation_scale(1.0), - m_angle_tolerance(0.0), - m_cusp_limit(0.0), - m_count(0) - {} - - curve4_div(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4) : - m_approximation_scale(1.0), - m_angle_tolerance(0.0), - m_cusp_limit(0.0), - m_count(0) - { - init(x1, y1, x2, y2, x3, y3, x4, y4); - } - - curve4_div(const curve4_points& cp) : - m_approximation_scale(1.0), - m_angle_tolerance(0.0), - m_count(0) - { - init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); - } - - void reset() { m_points.remove_all(); m_count = 0; } - void init(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4); - - void init(const curve4_points& cp) - { - init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); - } - - void approximation_method(curve_approximation_method_e) {} - - curve_approximation_method_e approximation_method() const - { - return curve_div; - } - - void approximation_scale(double s) { m_approximation_scale = s; } - double approximation_scale() const { return m_approximation_scale; } - - void angle_tolerance(double a) { m_angle_tolerance = a; } - double angle_tolerance() const { return m_angle_tolerance; } - - void cusp_limit(double v) - { - m_cusp_limit = (v == 0.0) ? 0.0 : pi - v; - } - - double cusp_limit() const - { - return (m_cusp_limit == 0.0) ? 0.0 : pi - m_cusp_limit; - } - - void rewind(unsigned) - { - m_count = 0; - } - - unsigned vertex(double* x, double* y) - { - if(m_count >= m_points.size()) return path_cmd_stop; - const point_d& p = m_points[m_count++]; - *x = p.x; - *y = p.y; - return (m_count == 1) ? path_cmd_move_to : path_cmd_line_to; - } - - private: - void bezier(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4); - - void recursive_bezier(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4, - unsigned level); - - double m_approximation_scale; - double m_distance_tolerance_square; - double m_angle_tolerance; - double m_cusp_limit; - unsigned m_count; - pod_bvector m_points; - }; - - - //-----------------------------------------------------------------curve3 - class curve3 - { - public: - curve3() : m_approximation_method(curve_div) {} - curve3(double x1, double y1, - double x2, double y2, - double x3, double y3) : - m_approximation_method(curve_div) - { - init(x1, y1, x2, y2, x3, y3); - } - - void reset() - { - m_curve_inc.reset(); - m_curve_div.reset(); - } - - void init(double x1, double y1, - double x2, double y2, - double x3, double y3) - { - if(m_approximation_method == curve_inc) - { - m_curve_inc.init(x1, y1, x2, y2, x3, y3); - } - else - { - m_curve_div.init(x1, y1, x2, y2, x3, y3); - } - } - - void approximation_method(curve_approximation_method_e v) - { - m_approximation_method = v; - } - - curve_approximation_method_e approximation_method() const - { - return m_approximation_method; - } - - void approximation_scale(double s) - { - m_curve_inc.approximation_scale(s); - m_curve_div.approximation_scale(s); - } - - double approximation_scale() const - { - return m_curve_inc.approximation_scale(); - } - - void angle_tolerance(double a) - { - m_curve_div.angle_tolerance(a); - } - - double angle_tolerance() const - { - return m_curve_div.angle_tolerance(); - } - - void cusp_limit(double v) - { - m_curve_div.cusp_limit(v); - } - - double cusp_limit() const - { - return m_curve_div.cusp_limit(); - } - - void rewind(unsigned path_id) - { - if(m_approximation_method == curve_inc) - { - m_curve_inc.rewind(path_id); - } - else - { - m_curve_div.rewind(path_id); - } - } - - unsigned vertex(double* x, double* y) - { - if(m_approximation_method == curve_inc) - { - return m_curve_inc.vertex(x, y); - } - return m_curve_div.vertex(x, y); - } - - private: - curve3_inc m_curve_inc; - curve3_div m_curve_div; - curve_approximation_method_e m_approximation_method; - }; - - - - - - //-----------------------------------------------------------------curve4 - class curve4 - { - public: - curve4() : m_approximation_method(curve_div) {} - curve4(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4) : - m_approximation_method(curve_div) - { - init(x1, y1, x2, y2, x3, y3, x4, y4); - } - - curve4(const curve4_points& cp) : - m_approximation_method(curve_div) - { - init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); - } - - void reset() - { - m_curve_inc.reset(); - m_curve_div.reset(); - } - - void init(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x4, double y4) - { - if(m_approximation_method == curve_inc) - { - m_curve_inc.init(x1, y1, x2, y2, x3, y3, x4, y4); - } - else - { - m_curve_div.init(x1, y1, x2, y2, x3, y3, x4, y4); - } - } - - void init(const curve4_points& cp) - { - init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]); - } - - void approximation_method(curve_approximation_method_e v) - { - m_approximation_method = v; - } - - curve_approximation_method_e approximation_method() const - { - return m_approximation_method; - } - - void approximation_scale(double s) - { - m_curve_inc.approximation_scale(s); - m_curve_div.approximation_scale(s); - } - double approximation_scale() const { return m_curve_inc.approximation_scale(); } - - void angle_tolerance(double v) - { - m_curve_div.angle_tolerance(v); - } - - double angle_tolerance() const - { - return m_curve_div.angle_tolerance(); - } - - void cusp_limit(double v) - { - m_curve_div.cusp_limit(v); - } - - double cusp_limit() const - { - return m_curve_div.cusp_limit(); - } - - void rewind(unsigned path_id) - { - if(m_approximation_method == curve_inc) - { - m_curve_inc.rewind(path_id); - } - else - { - m_curve_div.rewind(path_id); - } - } - - unsigned vertex(double* x, double* y) - { - if(m_approximation_method == curve_inc) - { - return m_curve_inc.vertex(x, y); - } - return m_curve_div.vertex(x, y); - } - - private: - curve4_inc m_curve_inc; - curve4_div m_curve_div; - curve_approximation_method_e m_approximation_method; - }; - - - - -} - -#endif diff --git a/uppdev/aggdraw/agg_dda_line.h b/uppdev/aggdraw/agg_dda_line.h deleted file mode 100644 index 92bb0462a..000000000 --- a/uppdev/aggdraw/agg_dda_line.h +++ /dev/null @@ -1,295 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_DDA_LINE_INCLUDED -#define AGG_DDA_LINE_INCLUDED - -#include -#include "agg_basics.h" - -namespace agg -{ - - //===================================================dda_line_interpolator - template class dda_line_interpolator - { - public: - //-------------------------------------------------------------------- - dda_line_interpolator() {} - - //-------------------------------------------------------------------- - dda_line_interpolator(int y1, int y2, unsigned count) : - m_y(y1), - m_inc(((y2 - y1) << FractionShift) / int(count)), - m_dy(0) - { - } - - //-------------------------------------------------------------------- - void operator ++ () - { - m_dy += m_inc; - } - - //-------------------------------------------------------------------- - void operator -- () - { - m_dy -= m_inc; - } - - //-------------------------------------------------------------------- - void operator += (unsigned n) - { - m_dy += m_inc * n; - } - - //-------------------------------------------------------------------- - void operator -= (unsigned n) - { - m_dy -= m_inc * n; - } - - - //-------------------------------------------------------------------- - int y() const { return m_y + (m_dy >> (FractionShift-YShift)); } - int dy() const { return m_dy; } - - - private: - int m_y; - int m_inc; - int m_dy; - }; - - - - - - //=================================================dda2_line_interpolator - class dda2_line_interpolator - { - public: - typedef int save_data_type; - enum save_size_e { save_size = 2 }; - - //-------------------------------------------------------------------- - dda2_line_interpolator() {} - - //-------------------------------------------- Forward-adjusted line - dda2_line_interpolator(int y1, int y2, int count) : - m_cnt(count <= 0 ? 1 : count), - m_lft((y2 - y1) / m_cnt), - m_rem((y2 - y1) % m_cnt), - m_mod(m_rem), - m_y(y1) - { - if(m_mod <= 0) - { - m_mod += count; - m_rem += count; - m_lft--; - } - m_mod -= count; - } - - //-------------------------------------------- Backward-adjusted line - dda2_line_interpolator(int y1, int y2, int count, int) : - m_cnt(count <= 0 ? 1 : count), - m_lft((y2 - y1) / m_cnt), - m_rem((y2 - y1) % m_cnt), - m_mod(m_rem), - m_y(y1) - { - if(m_mod <= 0) - { - m_mod += count; - m_rem += count; - m_lft--; - } - } - - //-------------------------------------------- Backward-adjusted line - dda2_line_interpolator(int y, int count) : - m_cnt(count <= 0 ? 1 : count), - m_lft(y / m_cnt), - m_rem(y % m_cnt), - m_mod(m_rem), - m_y(0) - { - if(m_mod <= 0) - { - m_mod += count; - m_rem += count; - m_lft--; - } - } - - - //-------------------------------------------------------------------- - void save(save_data_type* data) const - { - data[0] = m_mod; - data[1] = m_y; - } - - //-------------------------------------------------------------------- - void load(const save_data_type* data) - { - m_mod = data[0]; - m_y = data[1]; - } - - //-------------------------------------------------------------------- - void operator++() - { - m_mod += m_rem; - m_y += m_lft; - if(m_mod > 0) - { - m_mod -= m_cnt; - m_y++; - } - } - - //-------------------------------------------------------------------- - void operator--() - { - if(m_mod <= m_rem) - { - m_mod += m_cnt; - m_y--; - } - m_mod -= m_rem; - m_y -= m_lft; - } - - //-------------------------------------------------------------------- - void adjust_forward() - { - m_mod -= m_cnt; - } - - //-------------------------------------------------------------------- - void adjust_backward() - { - m_mod += m_cnt; - } - - //-------------------------------------------------------------------- - int mod() const { return m_mod; } - int rem() const { return m_rem; } - int lft() const { return m_lft; } - - //-------------------------------------------------------------------- - int y() const { return m_y; } - - private: - int m_cnt; - int m_lft; - int m_rem; - int m_mod; - int m_y; - }; - - - - - - - - //---------------------------------------------line_bresenham_interpolator - class line_bresenham_interpolator - { - public: - enum subpixel_scale_e - { - subpixel_shift = 8, - subpixel_scale = 1 << subpixel_shift, - subpixel_mask = subpixel_scale - 1 - }; - - //-------------------------------------------------------------------- - static int line_lr(int v) { return v >> subpixel_shift; } - - //-------------------------------------------------------------------- - line_bresenham_interpolator(int x1, int y1, int x2, int y2) : - m_x1_lr(line_lr(x1)), - m_y1_lr(line_lr(y1)), - m_x2_lr(line_lr(x2)), - m_y2_lr(line_lr(y2)), - m_ver(abs(m_x2_lr - m_x1_lr) < abs(m_y2_lr - m_y1_lr)), - m_len(m_ver ? abs(m_y2_lr - m_y1_lr) : - abs(m_x2_lr - m_x1_lr)), - m_inc(m_ver ? ((y2 > y1) ? 1 : -1) : ((x2 > x1) ? 1 : -1)), - m_interpolator(m_ver ? x1 : y1, - m_ver ? x2 : y2, - m_len) - { - } - - //-------------------------------------------------------------------- - bool is_ver() const { return m_ver; } - unsigned len() const { return m_len; } - int inc() const { return m_inc; } - - //-------------------------------------------------------------------- - void hstep() - { - ++m_interpolator; - m_x1_lr += m_inc; - } - - //-------------------------------------------------------------------- - void vstep() - { - ++m_interpolator; - m_y1_lr += m_inc; - } - - //-------------------------------------------------------------------- - int x1() const { return m_x1_lr; } - int y1() const { return m_y1_lr; } - int x2() const { return line_lr(m_interpolator.y()); } - int y2() const { return line_lr(m_interpolator.y()); } - int x2_hr() const { return m_interpolator.y(); } - int y2_hr() const { return m_interpolator.y(); } - - private: - int m_x1_lr; - int m_y1_lr; - int m_x2_lr; - int m_y2_lr; - bool m_ver; - unsigned m_len; - int m_inc; - dda2_line_interpolator m_interpolator; - - }; - - -} - - - -#endif diff --git a/uppdev/aggdraw/agg_ellipse.h b/uppdev/aggdraw/agg_ellipse.h deleted file mode 100644 index 8693a3c38..000000000 --- a/uppdev/aggdraw/agg_ellipse.h +++ /dev/null @@ -1,128 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_ELLIPSE_INCLUDED -#define AGG_ELLIPSE_INCLUDED - -#include "agg_basics.h" -#include - -namespace agg -{ - - //----------------------------------------------------------------ellipse - class ellipse - { - public: - ellipse() : - m_x(0.0), m_y(0.0), m_rx(1.0), m_ry(1.0), m_scale(1.0), - m_num(4), m_step(0), m_cw(false) {} - - ellipse(double x, double y, double rx, double ry, - unsigned num_steps=0, bool cw=false) : - m_x(x), m_y(y), m_rx(rx), m_ry(ry), m_scale(1.0), - m_num(num_steps), m_step(0), m_cw(cw) - { - if(m_num == 0) calc_num_steps(); - } - - void init(double x, double y, double rx, double ry, - unsigned num_steps=0, bool cw=false); - - void approximation_scale(double scale); - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - void calc_num_steps(); - - double m_x; - double m_y; - double m_rx; - double m_ry; - double m_scale; - unsigned m_num; - unsigned m_step; - bool m_cw; - }; - - //------------------------------------------------------------------------ - inline void ellipse::init(double x, double y, double rx, double ry, - unsigned num_steps, bool cw) - { - m_x = x; - m_y = y; - m_rx = rx; - m_ry = ry; - m_num = num_steps; - m_step = 0; - m_cw = cw; - if(m_num == 0) calc_num_steps(); - } - - //------------------------------------------------------------------------ - inline void ellipse::approximation_scale(double scale) - { - m_scale = scale; - calc_num_steps(); - } - - //------------------------------------------------------------------------ - inline void ellipse::calc_num_steps() - { - double ra = (fabs(m_rx) + fabs(m_ry)) / 2; - double da = acos(ra / (ra + 0.125 / m_scale)) * 2; - m_num = uround(2*pi / da); - } - - //------------------------------------------------------------------------ - inline void ellipse::rewind(unsigned) - { - m_step = 0; - } - - //------------------------------------------------------------------------ - inline unsigned ellipse::vertex(double* x, double* y) - { - if(m_step == m_num) - { - ++m_step; - return path_cmd_end_poly | path_flags_close | path_flags_ccw; - } - if(m_step > m_num) return path_cmd_stop; - double angle = double(m_step) / double(m_num) * 2.0 * pi; - if(m_cw) angle = 2.0 * pi - angle; - *x = m_x + cos(angle) * m_rx; - *y = m_y + sin(angle) * m_ry; - m_step++; - return ((m_step == 1) ? path_cmd_move_to : path_cmd_line_to); - } - -} - - - -#endif - - diff --git a/uppdev/aggdraw/agg_ellipse_bresenham.h b/uppdev/aggdraw/agg_ellipse_bresenham.h deleted file mode 100644 index dfb66e874..000000000 --- a/uppdev/aggdraw/agg_ellipse_bresenham.h +++ /dev/null @@ -1,118 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_ELLIPSE_BRESENHAM_INCLUDED -#define AGG_ELLIPSE_BRESENHAM_INCLUDED - - -#include "agg_basics.h" - - -namespace agg -{ - - //------------------------------------------ellipse_bresenham_interpolator - class ellipse_bresenham_interpolator - { - public: - ellipse_bresenham_interpolator(int rx, int ry) : - m_rx2(rx * rx), - m_ry2(ry * ry), - m_two_rx2(m_rx2 << 1), - m_two_ry2(m_ry2 << 1), - m_dx(0), - m_dy(0), - m_inc_x(0), - m_inc_y(-ry * m_two_rx2), - m_cur_f(0) - {} - - int dx() const { return m_dx; } - int dy() const { return m_dy; } - - void operator++ () - { - int mx, my, mxy, min_m; - int fx, fy, fxy; - - mx = fx = m_cur_f + m_inc_x + m_ry2; - if(mx < 0) mx = -mx; - - my = fy = m_cur_f + m_inc_y + m_rx2; - if(my < 0) my = -my; - - mxy = fxy = m_cur_f + m_inc_x + m_ry2 + m_inc_y + m_rx2; - if(mxy < 0) mxy = -mxy; - - min_m = mx; - bool flag = true; - - if(min_m > my) - { - min_m = my; - flag = false; - } - - m_dx = m_dy = 0; - - if(min_m > mxy) - { - m_inc_x += m_two_ry2; - m_inc_y += m_two_rx2; - m_cur_f = fxy; - m_dx = 1; - m_dy = 1; - return; - } - - if(flag) - { - m_inc_x += m_two_ry2; - m_cur_f = fx; - m_dx = 1; - return; - } - - m_inc_y += m_two_rx2; - m_cur_f = fy; - m_dy = 1; - } - - private: - int m_rx2; - int m_ry2; - int m_two_rx2; - int m_two_ry2; - int m_dx; - int m_dy; - int m_inc_x; - int m_inc_y; - int m_cur_f; - - }; - -} - -#endif - diff --git a/uppdev/aggdraw/agg_embedded_raster_fonts.cpp b/uppdev/aggdraw/agg_embedded_raster_fonts.cpp deleted file mode 100644 index 9320fd86a..000000000 --- a/uppdev/aggdraw/agg_embedded_raster_fonts.cpp +++ /dev/null @@ -1,10435 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#include "agg_embedded_raster_fonts.h" - -namespace agg -{ - - const int8u gse4x6[] = - { - 6, 0, 32, 128-32, - - 0x00,0x00,0x07,0x00,0x0e,0x00,0x15,0x00,0x1c,0x00,0x23,0x00,0x2a,0x00,0x31,0x00,0x38,0x00, - 0x3f,0x00,0x46,0x00,0x4d,0x00,0x54,0x00,0x5b,0x00,0x62,0x00,0x69,0x00,0x70,0x00,0x77,0x00, - 0x7e,0x00,0x85,0x00,0x8c,0x00,0x93,0x00,0x9a,0x00,0xa1,0x00,0xa8,0x00,0xaf,0x00,0xb6,0x00, - 0xbd,0x00,0xc4,0x00,0xcb,0x00,0xd2,0x00,0xd9,0x00,0xe0,0x00,0xe7,0x00,0xee,0x00,0xf5,0x00, - 0xfc,0x00,0x03,0x01,0x0a,0x01,0x11,0x01,0x18,0x01,0x1f,0x01,0x26,0x01,0x2d,0x01,0x34,0x01, - 0x3b,0x01,0x42,0x01,0x49,0x01,0x50,0x01,0x57,0x01,0x5e,0x01,0x65,0x01,0x6c,0x01,0x73,0x01, - 0x7a,0x01,0x81,0x01,0x88,0x01,0x8f,0x01,0x96,0x01,0x9d,0x01,0xa4,0x01,0xab,0x01,0xb2,0x01, - 0xb9,0x01,0xc0,0x01,0xc7,0x01,0xce,0x01,0xd5,0x01,0xdc,0x01,0xe3,0x01,0xea,0x01,0xf1,0x01, - 0xf8,0x01,0xff,0x01,0x06,0x02,0x0d,0x02,0x14,0x02,0x1b,0x02,0x22,0x02,0x29,0x02,0x30,0x02, - 0x37,0x02,0x3e,0x02,0x45,0x02,0x4c,0x02,0x53,0x02,0x5a,0x02,0x61,0x02,0x68,0x02,0x6f,0x02, - 0x76,0x02,0x7d,0x02,0x84,0x02,0x8b,0x02,0x92,0x02,0x99,0x02, - - 4, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x21 '!' - 0x40,0x40,0x40,0x00,0x40,0x00, - - 4, // 0x22 '"' - 0xa0,0xa0,0x00,0x00,0x00,0x00, - - 4, // 0x23 '#' - 0x60,0xf0,0x60,0xf0,0x60,0x00, - - 4, // 0x24 '$' - 0x40,0x60,0xc0,0x60,0xc0,0x40, - - 4, // 0x25 '%' - 0xa0,0x20,0x40,0x80,0xa0,0x00, - - 4, // 0x26 '&' - 0xe0,0xa0,0x50,0xa0,0xd0,0x00, - - 4, // 0x27 ''' - 0x40,0x40,0x00,0x00,0x00,0x00, - - 4, // 0x28 '(' - 0x20,0x40,0x40,0x40,0x20,0x00, - - 4, // 0x29 ')' - 0x40,0x20,0x20,0x20,0x40,0x00, - - 4, // 0x2a '*' - 0xa0,0x40,0xe0,0x40,0xa0,0x00, - - 4, // 0x2b '+' - 0x40,0x40,0xe0,0x40,0x40,0x00, - - 4, // 0x2c ',' - 0x00,0x00,0x00,0x40,0x40,0x80, - - 4, // 0x2d '-' - 0x00,0x00,0xe0,0x00,0x00,0x00, - - 4, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x40,0x00, - - 4, // 0x2f '/' - 0x10,0x20,0x20,0x40,0x40,0x80, - - 4, // 0x30 '0' - 0xe0,0xa0,0xa0,0xa0,0xe0,0x00, - - 4, // 0x31 '1' - 0x40,0xc0,0x40,0x40,0xe0,0x00, - - 4, // 0x32 '2' - 0xe0,0xa0,0x20,0x40,0xe0,0x00, - - 4, // 0x33 '3' - 0xe0,0x20,0x40,0x20,0xe0,0x00, - - 4, // 0x34 '4' - 0xa0,0xa0,0xe0,0x20,0x20,0x00, - - 4, // 0x35 '5' - 0xe0,0x80,0xc0,0x20,0xc0,0x00, - - 4, // 0x36 '6' - 0x40,0x80,0xe0,0xa0,0xe0,0x00, - - 4, // 0x37 '7' - 0xe0,0xa0,0x20,0x40,0x40,0x00, - - 4, // 0x38 '8' - 0xe0,0xa0,0x40,0xa0,0xe0,0x00, - - 4, // 0x39 '9' - 0xe0,0xa0,0xe0,0x20,0xc0,0x00, - - 4, // 0x3a ':' - 0x00,0x40,0x00,0x40,0x00,0x00, - - 4, // 0x3b ';' - 0x00,0x40,0x00,0x40,0x40,0x80, - - 4, // 0x3c '<' - 0x20,0x40,0x80,0x40,0x20,0x00, - - 4, // 0x3d '=' - 0x00,0xe0,0x00,0xe0,0x00,0x00, - - 4, // 0x3e '>' - 0x80,0x40,0x20,0x40,0x80,0x00, - - 4, // 0x3f '?' - 0xc0,0x20,0x40,0x00,0x40,0x00, - - 4, // 0x40 '@' - 0x40,0xa0,0xe0,0xe0,0x80,0x60, - - 4, // 0x41 'A' - 0x40,0xa0,0xe0,0xa0,0xa0,0x00, - - 4, // 0x42 'B' - 0xc0,0xa0,0xc0,0xa0,0xc0,0x00, - - 4, // 0x43 'C' - 0x60,0x80,0x80,0x80,0x60,0x00, - - 4, // 0x44 'D' - 0xc0,0xa0,0xa0,0xa0,0xc0,0x00, - - 4, // 0x45 'E' - 0xe0,0x80,0xc0,0x80,0xe0,0x00, - - 4, // 0x46 'F' - 0xe0,0x80,0xc0,0x80,0x80,0x00, - - 4, // 0x47 'G' - 0x60,0x80,0xa0,0xa0,0x40,0x00, - - 4, // 0x48 'H' - 0xa0,0xa0,0xe0,0xa0,0xa0,0x00, - - 4, // 0x49 'I' - 0xe0,0x40,0x40,0x40,0xe0,0x00, - - 4, // 0x4a 'J' - 0x20,0x20,0x20,0x20,0xa0,0x40, - - 4, // 0x4b 'K' - 0xa0,0xa0,0xc0,0xc0,0xa0,0x00, - - 4, // 0x4c 'L' - 0x80,0x80,0x80,0x80,0xe0,0x00, - - 4, // 0x4d 'M' - 0xa0,0xe0,0xa0,0xa0,0xa0,0x00, - - 4, // 0x4e 'N' - 0x90,0xd0,0xb0,0x90,0x90,0x00, - - 4, // 0x4f 'O' - 0x40,0xa0,0xa0,0xa0,0x40,0x00, - - 4, // 0x50 'P' - 0xc0,0xa0,0xa0,0xc0,0x80,0x00, - - 4, // 0x51 'Q' - 0x40,0xa0,0xa0,0xa0,0x60,0x00, - - 4, // 0x52 'R' - 0xc0,0xa0,0xa0,0xc0,0xa0,0x00, - - 4, // 0x53 'S' - 0x60,0x80,0x40,0x20,0xc0,0x00, - - 4, // 0x54 'T' - 0xe0,0x40,0x40,0x40,0x40,0x00, - - 4, // 0x55 'U' - 0xa0,0xa0,0xa0,0xa0,0xe0,0x00, - - 4, // 0x56 'V' - 0xa0,0xa0,0xa0,0xa0,0x40,0x00, - - 4, // 0x57 'W' - 0xa0,0xa0,0xa0,0xe0,0xa0,0x00, - - 4, // 0x58 'X' - 0xa0,0xa0,0x40,0xa0,0xa0,0x00, - - 4, // 0x59 'Y' - 0xa0,0xa0,0x40,0x40,0x40,0x00, - - 4, // 0x5a 'Z' - 0xe0,0x20,0x40,0x80,0xe0,0x00, - - 4, // 0x5b '[' - 0xc0,0x80,0x80,0x80,0xc0,0x00, - - 4, // 0x5c '\' - 0x80,0x40,0x40,0x20,0x20,0x10, - - 4, // 0x5d ']' - 0xc0,0x40,0x40,0x40,0xc0,0x00, - - 4, // 0x5e '^' - 0x40,0xa0,0x00,0x00,0x00,0x00, - - 4, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0xf0, - - 4, // 0x60 '`' - 0x40,0x20,0x00,0x00,0x00,0x00, - - 4, // 0x61 'a' - 0x00,0x60,0xa0,0xa0,0x70,0x00, - - 4, // 0x62 'b' - 0x80,0x80,0xc0,0xa0,0xc0,0x00, - - 4, // 0x63 'c' - 0x00,0x60,0x80,0x80,0x60,0x00, - - 4, // 0x64 'd' - 0x20,0x20,0x60,0xa0,0x60,0x00, - - 4, // 0x65 'e' - 0x00,0x40,0xe0,0x80,0x60,0x00, - - 4, // 0x66 'f' - 0x20,0x40,0xe0,0x40,0x40,0x00, - - 4, // 0x67 'g' - 0x00,0x60,0xa0,0x60,0x20,0xc0, - - 4, // 0x68 'h' - 0x80,0x80,0xc0,0xa0,0xa0,0x00, - - 4, // 0x69 'i' - 0x40,0x00,0xc0,0x40,0xe0,0x00, - - 4, // 0x6a 'j' - 0x40,0x00,0xc0,0x40,0x40,0x80, - - 4, // 0x6b 'k' - 0x80,0x80,0xa0,0xc0,0xa0,0x00, - - 4, // 0x6c 'l' - 0xc0,0x40,0x40,0x40,0xe0,0x00, - - 4, // 0x6d 'm' - 0x00,0xa0,0xf0,0xf0,0x90,0x00, - - 4, // 0x6e 'n' - 0x00,0xc0,0xa0,0xa0,0xa0,0x00, - - 4, // 0x6f 'o' - 0x00,0x40,0xa0,0xa0,0x40,0x00, - - 4, // 0x70 'p' - 0x00,0xc0,0xa0,0xc0,0x80,0x80, - - 4, // 0x71 'q' - 0x00,0x60,0xa0,0x60,0x20,0x20, - - 4, // 0x72 'r' - 0x00,0xa0,0x50,0x40,0x40,0x00, - - 4, // 0x73 's' - 0x00,0x60,0xc0,0x20,0xc0,0x00, - - 4, // 0x74 't' - 0x40,0x40,0xe0,0x40,0x60,0x00, - - 4, // 0x75 'u' - 0x00,0xa0,0xa0,0xa0,0x60,0x00, - - 4, // 0x76 'v' - 0x00,0xa0,0xa0,0xa0,0x40,0x00, - - 4, // 0x77 'w' - 0x00,0xa0,0xa0,0xe0,0xa0,0x00, - - 4, // 0x78 'x' - 0x00,0xa0,0x40,0xa0,0xa0,0x00, - - 4, // 0x79 'y' - 0x00,0xa0,0xa0,0x60,0x20,0xc0, - - 4, // 0x7a 'z' - 0x00,0xe0,0x40,0x80,0xe0,0x00, - - 4, // 0x7b '{' - 0x30,0x20,0xc0,0x20,0x30,0x00, - - 4, // 0x7c '|' - 0x40,0x40,0x00,0x40,0x40,0x40, - - 4, // 0x7d '}' - 0xc0,0x40,0x30,0x40,0xc0,0x00, - - 4, // 0x7e '~' - 0x50,0xa0,0x00,0x00,0x00,0x00, - - 4, // 0x7f '' - 0x00,0x60,0x90,0xf0,0x00,0x00, - 0 - }; - - const int8u gse4x8[] = - { - 8, 0, 32, 128-32, - - 0x00,0x00,0x09,0x00,0x12,0x00,0x1b,0x00,0x24,0x00,0x2d,0x00,0x36,0x00,0x3f,0x00,0x48,0x00, - 0x51,0x00,0x5a,0x00,0x63,0x00,0x6c,0x00,0x75,0x00,0x7e,0x00,0x87,0x00,0x90,0x00,0x99,0x00, - 0xa2,0x00,0xab,0x00,0xb4,0x00,0xbd,0x00,0xc6,0x00,0xcf,0x00,0xd8,0x00,0xe1,0x00,0xea,0x00, - 0xf3,0x00,0xfc,0x00,0x05,0x01,0x0e,0x01,0x17,0x01,0x20,0x01,0x29,0x01,0x32,0x01,0x3b,0x01, - 0x44,0x01,0x4d,0x01,0x56,0x01,0x5f,0x01,0x68,0x01,0x71,0x01,0x7a,0x01,0x83,0x01,0x8c,0x01, - 0x95,0x01,0x9e,0x01,0xa7,0x01,0xb0,0x01,0xb9,0x01,0xc2,0x01,0xcb,0x01,0xd4,0x01,0xdd,0x01, - 0xe6,0x01,0xef,0x01,0xf8,0x01,0x01,0x02,0x0a,0x02,0x13,0x02,0x1c,0x02,0x25,0x02,0x2e,0x02, - 0x37,0x02,0x40,0x02,0x49,0x02,0x52,0x02,0x5b,0x02,0x64,0x02,0x6d,0x02,0x76,0x02,0x7f,0x02, - 0x88,0x02,0x91,0x02,0x9a,0x02,0xa3,0x02,0xac,0x02,0xb5,0x02,0xbe,0x02,0xc7,0x02,0xd0,0x02, - 0xd9,0x02,0xe2,0x02,0xeb,0x02,0xf4,0x02,0xfd,0x02,0x06,0x03,0x0f,0x03,0x18,0x03,0x21,0x03, - 0x2a,0x03,0x33,0x03,0x3c,0x03,0x45,0x03,0x4e,0x03,0x57,0x03, - - 4, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x21 '!' - 0x00,0x40,0x40,0x40,0x40,0x00,0x40,0x00, - - 4, // 0x22 '"' - 0x00,0xa0,0xa0,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x23 '#' - 0x60,0x60,0xf0,0x60,0x60,0xf0,0x60,0x60, - - 4, // 0x24 '$' - 0x40,0x60,0xc0,0xc0,0x60,0x60,0xc0,0x40, - - 4, // 0x25 '%' - 0x00,0xa0,0x20,0x40,0x40,0x80,0xa0,0x00, - - 4, // 0x26 '&' - 0x00,0x40,0xa0,0xa0,0x40,0xb0,0xa0,0x70, - - 4, // 0x27 ''' - 0x00,0x40,0x40,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x28 '(' - 0x20,0x40,0x80,0x80,0x80,0x80,0x40,0x20, - - 4, // 0x29 ')' - 0x80,0x40,0x20,0x20,0x20,0x20,0x40,0x80, - - 4, // 0x2a '*' - 0x00,0xa0,0x40,0xe0,0x40,0xa0,0x00,0x00, - - 4, // 0x2b '+' - 0x00,0x40,0x40,0xe0,0x40,0x40,0x00,0x00, - - 4, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x80, - - 4, // 0x2d '-' - 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00, - - 4, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00, - - 4, // 0x2f '/' - 0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80, - - 4, // 0x30 '0' - 0x00,0xe0,0xa0,0xa0,0xa0,0xa0,0xe0,0x00, - - 4, // 0x31 '1' - 0x00,0x40,0xc0,0x40,0x40,0x40,0xe0,0x00, - - 4, // 0x32 '2' - 0x00,0xe0,0xa0,0x20,0x40,0x80,0xe0,0x00, - - 4, // 0x33 '3' - 0x00,0xe0,0x20,0x40,0x20,0x20,0xe0,0x00, - - 4, // 0x34 '4' - 0x00,0x60,0xa0,0xa0,0xf0,0x20,0x20,0x00, - - 4, // 0x35 '5' - 0x00,0xe0,0x80,0xc0,0x20,0x20,0xc0,0x00, - - 4, // 0x36 '6' - 0x00,0x40,0x80,0xe0,0xa0,0xa0,0xe0,0x00, - - 4, // 0x37 '7' - 0x00,0xe0,0xa0,0x20,0x40,0x40,0x40,0x00, - - 4, // 0x38 '8' - 0x00,0xe0,0xa0,0x40,0xa0,0xa0,0xe0,0x00, - - 4, // 0x39 '9' - 0x00,0xe0,0xa0,0xe0,0x20,0x20,0x40,0x00, - - 4, // 0x3a ':' - 0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00, - - 4, // 0x3b ';' - 0x00,0x00,0x40,0x00,0x00,0x40,0x40,0x80, - - 4, // 0x3c '<' - 0x00,0x20,0x40,0x80,0x40,0x20,0x00,0x00, - - 4, // 0x3d '=' - 0x00,0x00,0xe0,0x00,0xe0,0x00,0x00,0x00, - - 4, // 0x3e '>' - 0x00,0x80,0x40,0x20,0x40,0x80,0x00,0x00, - - 4, // 0x3f '?' - 0x00,0x40,0xa0,0x20,0x40,0x00,0x40,0x00, - - 4, // 0x40 '@' - 0x00,0x40,0xa0,0xe0,0xe0,0x80,0x60,0x00, - - 4, // 0x41 'A' - 0x00,0x40,0xa0,0xa0,0xe0,0xa0,0xa0,0x00, - - 4, // 0x42 'B' - 0x00,0xc0,0xa0,0xc0,0xa0,0xa0,0xc0,0x00, - - 4, // 0x43 'C' - 0x00,0x40,0xa0,0x80,0x80,0xa0,0x40,0x00, - - 4, // 0x44 'D' - 0x00,0xc0,0xa0,0xa0,0xa0,0xa0,0xc0,0x00, - - 4, // 0x45 'E' - 0x00,0xe0,0x80,0xc0,0x80,0x80,0xe0,0x00, - - 4, // 0x46 'F' - 0x00,0xe0,0x80,0xc0,0x80,0x80,0x80,0x00, - - 4, // 0x47 'G' - 0x00,0x60,0x80,0xa0,0xa0,0xa0,0x40,0x00, - - 4, // 0x48 'H' - 0x00,0xa0,0xa0,0xe0,0xa0,0xa0,0xa0,0x00, - - 4, // 0x49 'I' - 0x00,0xe0,0x40,0x40,0x40,0x40,0xe0,0x00, - - 4, // 0x4a 'J' - 0x00,0x20,0x20,0x20,0x20,0xa0,0x40,0x00, - - 4, // 0x4b 'K' - 0x00,0xa0,0xa0,0xc0,0xc0,0xa0,0xa0,0x00, - - 4, // 0x4c 'L' - 0x00,0x80,0x80,0x80,0x80,0x80,0xe0,0x00, - - 4, // 0x4d 'M' - 0x00,0xa0,0xe0,0xa0,0xa0,0xa0,0xa0,0x00, - - 4, // 0x4e 'N' - 0x00,0x90,0x90,0xd0,0xb0,0x90,0x90,0x00, - - 4, // 0x4f 'O' - 0x00,0x40,0xa0,0xa0,0xa0,0xa0,0x40,0x00, - - 4, // 0x50 'P' - 0x00,0xc0,0xa0,0xa0,0xc0,0x80,0x80,0x00, - - 4, // 0x51 'Q' - 0x00,0x40,0xa0,0xa0,0xa0,0xa0,0x60,0x00, - - 4, // 0x52 'R' - 0x00,0xc0,0xa0,0xa0,0xc0,0xc0,0xa0,0x00, - - 4, // 0x53 'S' - 0x00,0x60,0x80,0x40,0x20,0x20,0xc0,0x00, - - 4, // 0x54 'T' - 0x00,0xe0,0x40,0x40,0x40,0x40,0x40,0x00, - - 4, // 0x55 'U' - 0x00,0xa0,0xa0,0xa0,0xa0,0xa0,0x40,0x00, - - 4, // 0x56 'V' - 0x00,0xa0,0xa0,0xa0,0xa0,0x40,0x40,0x00, - - 4, // 0x57 'W' - 0x00,0xa0,0xa0,0xa0,0xa0,0xe0,0xa0,0x00, - - 4, // 0x58 'X' - 0x00,0xa0,0xa0,0x40,0xa0,0xa0,0xa0,0x00, - - 4, // 0x59 'Y' - 0x00,0xa0,0xa0,0x40,0x40,0x40,0x40,0x00, - - 4, // 0x5a 'Z' - 0x00,0xe0,0x20,0x40,0x40,0x80,0xe0,0x00, - - 4, // 0x5b '[' - 0xc0,0x80,0x80,0x80,0x80,0x80,0x80,0xc0, - - 4, // 0x5c '\' - 0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10, - - 4, // 0x5d ']' - 0xc0,0x40,0x40,0x40,0x40,0x40,0x40,0xc0, - - 4, // 0x5e '^' - 0x00,0x40,0xa0,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0, - - 4, // 0x60 '`' - 0x00,0x40,0x20,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x61 'a' - 0x00,0x00,0x60,0xa0,0xa0,0xa0,0x70,0x00, - - 4, // 0x62 'b' - 0x00,0x80,0x80,0xc0,0xa0,0xa0,0xc0,0x00, - - 4, // 0x63 'c' - 0x00,0x00,0x40,0xa0,0x80,0xa0,0x40,0x00, - - 4, // 0x64 'd' - 0x00,0x20,0x20,0x60,0xa0,0xa0,0x60,0x00, - - 4, // 0x65 'e' - 0x00,0x00,0x40,0xa0,0xe0,0x80,0x60,0x00, - - 4, // 0x66 'f' - 0x00,0x20,0x40,0x40,0xe0,0x40,0x40,0x00, - - 4, // 0x67 'g' - 0x00,0x00,0x60,0xa0,0xa0,0x60,0x20,0xc0, - - 4, // 0x68 'h' - 0x00,0x80,0x80,0xc0,0xa0,0xa0,0xa0,0x00, - - 4, // 0x69 'i' - 0x00,0x40,0x00,0xc0,0x40,0x40,0xe0,0x00, - - 4, // 0x6a 'j' - 0x00,0x40,0x00,0xc0,0x40,0x40,0x40,0x80, - - 4, // 0x6b 'k' - 0x00,0x80,0x80,0xa0,0xc0,0xc0,0xa0,0x00, - - 4, // 0x6c 'l' - 0x00,0xc0,0x40,0x40,0x40,0x40,0xe0,0x00, - - 4, // 0x6d 'm' - 0x00,0x00,0xa0,0xf0,0xf0,0xf0,0x90,0x00, - - 4, // 0x6e 'n' - 0x00,0x00,0xc0,0xa0,0xa0,0xa0,0xa0,0x00, - - 4, // 0x6f 'o' - 0x00,0x00,0x40,0xa0,0xa0,0xa0,0x40,0x00, - - 4, // 0x70 'p' - 0x00,0x00,0xc0,0xa0,0xa0,0xc0,0x80,0x80, - - 4, // 0x71 'q' - 0x00,0x00,0x60,0xa0,0xa0,0x60,0x20,0x20, - - 4, // 0x72 'r' - 0x00,0x00,0xa0,0x50,0x40,0x40,0x40,0x00, - - 4, // 0x73 's' - 0x00,0x00,0x60,0x80,0x40,0x20,0xc0,0x00, - - 4, // 0x74 't' - 0x00,0x40,0x40,0xe0,0x40,0x40,0x20,0x00, - - 4, // 0x75 'u' - 0x00,0x00,0xa0,0xa0,0xa0,0xa0,0x60,0x00, - - 4, // 0x76 'v' - 0x00,0x00,0xa0,0xa0,0xa0,0x40,0x40,0x00, - - 4, // 0x77 'w' - 0x00,0x00,0xa0,0xa0,0xa0,0xe0,0xa0,0x00, - - 4, // 0x78 'x' - 0x00,0x00,0xa0,0xa0,0x40,0xa0,0xa0,0x00, - - 4, // 0x79 'y' - 0x00,0x00,0xa0,0xa0,0xa0,0x60,0x20,0xc0, - - 4, // 0x7a 'z' - 0x00,0x00,0xe0,0x20,0x40,0x80,0xe0,0x00, - - 4, // 0x7b '{' - 0x10,0x20,0x20,0xc0,0x20,0x20,0x10,0x00, - - 4, // 0x7c '|' - 0x00,0x40,0x40,0x40,0x00,0x40,0x40,0x40, - - 4, // 0x7d '}' - 0x80,0x40,0x40,0x30,0x40,0x40,0x80,0x00, - - 4, // 0x7e '~' - 0x00,0x50,0xa0,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x7f '' - 0x00,0x00,0x00,0x60,0x90,0xf0,0x00,0x00, - 0 - }; - - const int8u gse5x7[] = - { - 7, 0, 32, 128-32, - - 0x00,0x00,0x08,0x00,0x10,0x00,0x18,0x00,0x20,0x00,0x28,0x00,0x30,0x00,0x38,0x00,0x40,0x00, - 0x48,0x00,0x50,0x00,0x58,0x00,0x60,0x00,0x68,0x00,0x70,0x00,0x78,0x00,0x80,0x00,0x88,0x00, - 0x90,0x00,0x98,0x00,0xa0,0x00,0xa8,0x00,0xb0,0x00,0xb8,0x00,0xc0,0x00,0xc8,0x00,0xd0,0x00, - 0xd8,0x00,0xe0,0x00,0xe8,0x00,0xf0,0x00,0xf8,0x00,0x00,0x01,0x08,0x01,0x10,0x01,0x18,0x01, - 0x20,0x01,0x28,0x01,0x30,0x01,0x38,0x01,0x40,0x01,0x48,0x01,0x50,0x01,0x58,0x01,0x60,0x01, - 0x68,0x01,0x70,0x01,0x78,0x01,0x80,0x01,0x88,0x01,0x90,0x01,0x98,0x01,0xa0,0x01,0xa8,0x01, - 0xb0,0x01,0xb8,0x01,0xc0,0x01,0xc8,0x01,0xd0,0x01,0xd8,0x01,0xe0,0x01,0xe8,0x01,0xf0,0x01, - 0xf8,0x01,0x00,0x02,0x08,0x02,0x10,0x02,0x18,0x02,0x20,0x02,0x28,0x02,0x30,0x02,0x38,0x02, - 0x40,0x02,0x48,0x02,0x50,0x02,0x58,0x02,0x60,0x02,0x68,0x02,0x70,0x02,0x78,0x02,0x80,0x02, - 0x88,0x02,0x90,0x02,0x98,0x02,0xa0,0x02,0xa8,0x02,0xb0,0x02,0xb8,0x02,0xc0,0x02,0xc8,0x02, - 0xd0,0x02,0xd8,0x02,0xe0,0x02,0xe8,0x02,0xf0,0x02,0xf8,0x02, - - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x21 '!' - 0x00,0x20,0x20,0x20,0x00,0x20,0x00, - - 5, // 0x22 '"' - 0x00,0x50,0x50,0x00,0x00,0x00,0x00, - - 5, // 0x23 '#' - 0x00,0x50,0xf8,0x50,0xf8,0x50,0x00, - - 5, // 0x24 '$' - 0x20,0x78,0xa0,0x70,0x28,0xf0,0x20, - - 5, // 0x25 '%' - 0x00,0x88,0x10,0x20,0x40,0x88,0x00, - - 5, // 0x26 '&' - 0x00,0x40,0xa0,0x68,0x90,0x68,0x00, - - 5, // 0x27 ''' - 0x00,0x20,0x20,0x00,0x00,0x00,0x00, - - 5, // 0x28 '(' - 0x10,0x20,0x40,0x40,0x40,0x20,0x10, - - 5, // 0x29 ')' - 0x80,0x40,0x20,0x20,0x20,0x40,0x80, - - 5, // 0x2a '*' - 0x00,0x20,0xa8,0x70,0xa8,0x20,0x00, - - 5, // 0x2b '+' - 0x00,0x20,0x20,0xf8,0x20,0x20,0x00, - - 5, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x20,0x20,0x40, - - 5, // 0x2d '-' - 0x00,0x00,0x00,0xf0,0x00,0x00,0x00, - - 5, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x40,0x00, - - 5, // 0x2f '/' - 0x00,0x08,0x10,0x20,0x40,0x80,0x00, - - 5, // 0x30 '0' - 0x00,0x60,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x31 '1' - 0x00,0x20,0x60,0x20,0x20,0x70,0x00, - - 5, // 0x32 '2' - 0x00,0x60,0x90,0x20,0x40,0xf0,0x00, - - 5, // 0x33 '3' - 0x00,0xf0,0x20,0x60,0x10,0xe0,0x00, - - 5, // 0x34 '4' - 0x00,0x30,0x50,0x90,0xf0,0x10,0x00, - - 5, // 0x35 '5' - 0x00,0xf0,0x80,0xe0,0x10,0xe0,0x00, - - 5, // 0x36 '6' - 0x00,0x60,0x80,0xe0,0x90,0x60,0x00, - - 5, // 0x37 '7' - 0x00,0xf0,0x90,0x20,0x40,0x40,0x00, - - 5, // 0x38 '8' - 0x00,0x60,0x90,0x60,0x90,0x60,0x00, - - 5, // 0x39 '9' - 0x00,0x60,0x90,0x70,0x10,0x60,0x00, - - 5, // 0x3a ':' - 0x00,0x00,0x20,0x00,0x20,0x00,0x00, - - 5, // 0x3b ';' - 0x00,0x00,0x20,0x00,0x20,0x20,0x40, - - 5, // 0x3c '<' - 0x00,0x10,0x20,0x40,0x20,0x10,0x00, - - 5, // 0x3d '=' - 0x00,0x00,0xf0,0x00,0xf0,0x00,0x00, - - 5, // 0x3e '>' - 0x00,0x80,0x40,0x20,0x40,0x80,0x00, - - 5, // 0x3f '?' - 0x00,0x60,0x90,0x20,0x00,0x20,0x00, - - 5, // 0x40 '@' - 0x00,0x60,0x90,0xb0,0x80,0x70,0x00, - - 5, // 0x41 'A' - 0x00,0x60,0x90,0xf0,0x90,0x90,0x00, - - 5, // 0x42 'B' - 0x00,0xe0,0x90,0xe0,0x90,0xe0,0x00, - - 5, // 0x43 'C' - 0x00,0x60,0x90,0x80,0x90,0x60,0x00, - - 5, // 0x44 'D' - 0x00,0xe0,0x90,0x90,0x90,0xe0,0x00, - - 5, // 0x45 'E' - 0x00,0xf0,0x80,0xe0,0x80,0xf0,0x00, - - 5, // 0x46 'F' - 0x00,0xf0,0x80,0xe0,0x80,0x80,0x00, - - 5, // 0x47 'G' - 0x00,0x70,0x80,0xb0,0x90,0x60,0x00, - - 5, // 0x48 'H' - 0x00,0x90,0x90,0xf0,0x90,0x90,0x00, - - 5, // 0x49 'I' - 0x00,0x70,0x20,0x20,0x20,0x70,0x00, - - 5, // 0x4a 'J' - 0x00,0x70,0x20,0x20,0xa0,0x40,0x00, - - 5, // 0x4b 'K' - 0x00,0x90,0xa0,0xc0,0xa0,0x90,0x00, - - 5, // 0x4c 'L' - 0x00,0x80,0x80,0x80,0x80,0xf0,0x00, - - 5, // 0x4d 'M' - 0x00,0x90,0xf0,0x90,0x90,0x90,0x00, - - 5, // 0x4e 'N' - 0x00,0x90,0xd0,0xb0,0x90,0x90,0x00, - - 5, // 0x4f 'O' - 0x00,0x60,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x50 'P' - 0x00,0xe0,0x90,0xe0,0x80,0x80,0x00, - - 5, // 0x51 'Q' - 0x00,0x60,0x90,0x90,0xa0,0x50,0x00, - - 5, // 0x52 'R' - 0x00,0xe0,0x90,0xe0,0xa0,0x90,0x00, - - 5, // 0x53 'S' - 0x00,0x70,0x80,0x60,0x10,0xe0,0x00, - - 5, // 0x54 'T' - 0x00,0x70,0x20,0x20,0x20,0x20,0x00, - - 5, // 0x55 'U' - 0x00,0x90,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x56 'V' - 0x00,0x50,0x50,0x50,0x20,0x20,0x00, - - 5, // 0x57 'W' - 0x00,0x90,0x90,0x90,0xf0,0x90,0x00, - - 5, // 0x58 'X' - 0x00,0x90,0x90,0x60,0x90,0x90,0x00, - - 5, // 0x59 'Y' - 0x00,0x50,0x50,0x20,0x20,0x20,0x00, - - 5, // 0x5a 'Z' - 0x00,0xf0,0x10,0x20,0x40,0xf0,0x00, - - 5, // 0x5b '[' - 0x70,0x40,0x40,0x40,0x40,0x40,0x70, - - 5, // 0x5c '\' - 0x00,0x80,0x40,0x20,0x10,0x08,0x00, - - 5, // 0x5d ']' - 0xe0,0x20,0x20,0x20,0x20,0x20,0xe0, - - 5, // 0x5e '^' - 0x00,0x20,0x50,0x00,0x00,0x00,0x00, - - 5, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0xf8,0x00, - - 5, // 0x60 '`' - 0x00,0x40,0x20,0x00,0x00,0x00,0x00, - - 5, // 0x61 'a' - 0x00,0x00,0x60,0xa0,0xa0,0x50,0x00, - - 5, // 0x62 'b' - 0x00,0x80,0x80,0xe0,0x90,0xe0,0x00, - - 5, // 0x63 'c' - 0x00,0x00,0x70,0x80,0x80,0x70,0x00, - - 5, // 0x64 'd' - 0x00,0x10,0x10,0x70,0x90,0x70,0x00, - - 5, // 0x65 'e' - 0x00,0x00,0x60,0xf0,0x80,0x70,0x00, - - 5, // 0x66 'f' - 0x00,0x30,0x40,0xe0,0x40,0x40,0x00, - - 5, // 0x67 'g' - 0x00,0x00,0x70,0x90,0x70,0x10,0x60, - - 5, // 0x68 'h' - 0x00,0x80,0x80,0xe0,0x90,0x90,0x00, - - 5, // 0x69 'i' - 0x20,0x00,0x60,0x20,0x20,0x70,0x00, - - 5, // 0x6a 'j' - 0x20,0x00,0x60,0x20,0x20,0xa0,0x40, - - 5, // 0x6b 'k' - 0x80,0x80,0x90,0xa0,0xe0,0x90,0x00, - - 5, // 0x6c 'l' - 0x00,0x60,0x20,0x20,0x20,0x70,0x00, - - 5, // 0x6d 'm' - 0x00,0x00,0xa0,0xf0,0xf0,0x90,0x00, - - 5, // 0x6e 'n' - 0x00,0x00,0xa0,0xd0,0x90,0x90,0x00, - - 5, // 0x6f 'o' - 0x00,0x00,0x60,0x90,0x90,0x60,0x00, - - 5, // 0x70 'p' - 0x00,0x00,0xe0,0x90,0xe0,0x80,0x80, - - 5, // 0x71 'q' - 0x00,0x00,0x70,0x90,0x70,0x10,0x10, - - 5, // 0x72 'r' - 0x00,0x00,0xe0,0x90,0x80,0x80,0x00, - - 5, // 0x73 's' - 0x00,0x00,0x70,0xe0,0x10,0xe0,0x00, - - 5, // 0x74 't' - 0x40,0x40,0xe0,0x40,0x40,0x70,0x00, - - 5, // 0x75 'u' - 0x00,0x00,0x90,0x90,0x90,0x70,0x00, - - 5, // 0x76 'v' - 0x00,0x00,0x50,0x50,0x50,0x20,0x00, - - 5, // 0x77 'w' - 0x00,0x00,0x90,0x90,0xf0,0x90,0x00, - - 5, // 0x78 'x' - 0x00,0x00,0x90,0x60,0x60,0x90,0x00, - - 5, // 0x79 'y' - 0x00,0x00,0x90,0x90,0x70,0x10,0x60, - - 5, // 0x7a 'z' - 0x00,0x00,0xf0,0x20,0x40,0xf0,0x00, - - 5, // 0x7b '{' - 0x10,0x20,0x20,0xc0,0x20,0x20,0x10, - - 5, // 0x7c '|' - 0x20,0x20,0x20,0x00,0x20,0x20,0x20, - - 5, // 0x7d '}' - 0x40,0x20,0x20,0x18,0x20,0x20,0x40, - - 5, // 0x7e '~' - 0x00,0x40,0xa8,0x10,0x00,0x00,0x00, - - 5, // 0x7f '' - 0x00,0x00,0x20,0x50,0x88,0xf8,0x00, - 0 - }; - - const int8u gse5x9[] = - { - 9, 0, 32, 128-32, - - 0x00,0x00,0x0a,0x00,0x14,0x00,0x1e,0x00,0x28,0x00,0x32,0x00,0x3c,0x00,0x46,0x00,0x50,0x00, - 0x5a,0x00,0x64,0x00,0x6e,0x00,0x78,0x00,0x82,0x00,0x8c,0x00,0x96,0x00,0xa0,0x00,0xaa,0x00, - 0xb4,0x00,0xbe,0x00,0xc8,0x00,0xd2,0x00,0xdc,0x00,0xe6,0x00,0xf0,0x00,0xfa,0x00,0x04,0x01, - 0x0e,0x01,0x18,0x01,0x22,0x01,0x2c,0x01,0x36,0x01,0x40,0x01,0x4a,0x01,0x54,0x01,0x5e,0x01, - 0x68,0x01,0x72,0x01,0x7c,0x01,0x86,0x01,0x90,0x01,0x9a,0x01,0xa4,0x01,0xae,0x01,0xb8,0x01, - 0xc2,0x01,0xcc,0x01,0xd6,0x01,0xe0,0x01,0xea,0x01,0xf4,0x01,0xfe,0x01,0x08,0x02,0x12,0x02, - 0x1c,0x02,0x26,0x02,0x30,0x02,0x3a,0x02,0x44,0x02,0x4e,0x02,0x58,0x02,0x62,0x02,0x6c,0x02, - 0x76,0x02,0x80,0x02,0x8a,0x02,0x94,0x02,0x9e,0x02,0xa8,0x02,0xb2,0x02,0xbc,0x02,0xc6,0x02, - 0xd0,0x02,0xda,0x02,0xe4,0x02,0xee,0x02,0xf8,0x02,0x02,0x03,0x0c,0x03,0x16,0x03,0x20,0x03, - 0x2a,0x03,0x34,0x03,0x3e,0x03,0x48,0x03,0x52,0x03,0x5c,0x03,0x66,0x03,0x70,0x03,0x7a,0x03, - 0x84,0x03,0x8e,0x03,0x98,0x03,0xa2,0x03,0xac,0x03,0xb6,0x03, - - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x21 '!' - 0x00,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00, - - 5, // 0x22 '"' - 0x00,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x23 '#' - 0x00,0x50,0x50,0xf8,0x50,0xf8,0x50,0x50,0x00, - - 5, // 0x24 '$' - 0x00,0x20,0x78,0xa0,0x70,0x28,0xf0,0x20,0x00, - - 5, // 0x25 '%' - 0x00,0xc8,0xc8,0x10,0x20,0x40,0x98,0x98,0x00, - - 5, // 0x26 '&' - 0x00,0x40,0xa0,0xa0,0x40,0xa8,0x90,0x68,0x00, - - 5, // 0x27 ''' - 0x00,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x28 '(' - 0x10,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x10, - - 5, // 0x29 ')' - 0x80,0x40,0x20,0x20,0x20,0x20,0x20,0x40,0x80, - - 5, // 0x2a '*' - 0x00,0x00,0x20,0xa8,0x70,0xa8,0x20,0x00,0x00, - - 5, // 0x2b '+' - 0x00,0x00,0x20,0x20,0xf8,0x20,0x20,0x00,0x00, - - 5, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x40, - - 5, // 0x2d '-' - 0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00, - - 5, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00, - - 5, // 0x2f '/' - 0x00,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80, - - 5, // 0x30 '0' - 0x00,0x60,0x90,0xb0,0xd0,0x90,0x90,0x60,0x00, - - 5, // 0x31 '1' - 0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x70,0x00, - - 5, // 0x32 '2' - 0x00,0x60,0x90,0x10,0x20,0x40,0x80,0xf0,0x00, - - 5, // 0x33 '3' - 0x00,0xf0,0x10,0x20,0x60,0x10,0x90,0x60,0x00, - - 5, // 0x34 '4' - 0x00,0x30,0x50,0x90,0x90,0xf8,0x10,0x10,0x00, - - 5, // 0x35 '5' - 0x00,0xf0,0x80,0xe0,0x10,0x10,0x10,0xe0,0x00, - - 5, // 0x36 '6' - 0x00,0x60,0x80,0xe0,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x37 '7' - 0x00,0xf0,0x90,0x10,0x20,0x40,0x40,0x40,0x00, - - 5, // 0x38 '8' - 0x00,0x60,0x90,0x90,0x60,0x90,0x90,0x60,0x00, - - 5, // 0x39 '9' - 0x00,0x60,0x90,0x90,0x70,0x10,0x90,0x60,0x00, - - 5, // 0x3a ':' - 0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00, - - 5, // 0x3b ';' - 0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x20,0x40, - - 5, // 0x3c '<' - 0x00,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x00, - - 5, // 0x3d '=' - 0x00,0x00,0x00,0xf0,0x00,0xf0,0x00,0x00,0x00, - - 5, // 0x3e '>' - 0x00,0x80,0x40,0x20,0x10,0x20,0x40,0x80,0x00, - - 5, // 0x3f '?' - 0x00,0x60,0x90,0x10,0x20,0x20,0x00,0x20,0x00, - - 5, // 0x40 '@' - 0x00,0x60,0x90,0xb0,0xb0,0xb0,0x80,0x70,0x00, - - 5, // 0x41 'A' - 0x00,0x60,0x90,0x90,0xf0,0x90,0x90,0x90,0x00, - - 5, // 0x42 'B' - 0x00,0xe0,0x90,0x90,0xe0,0x90,0x90,0xe0,0x00, - - 5, // 0x43 'C' - 0x00,0x60,0x90,0x80,0x80,0x80,0x90,0x60,0x00, - - 5, // 0x44 'D' - 0x00,0xe0,0x90,0x90,0x90,0x90,0x90,0xe0,0x00, - - 5, // 0x45 'E' - 0x00,0xf0,0x80,0x80,0xe0,0x80,0x80,0xf0,0x00, - - 5, // 0x46 'F' - 0x00,0xf0,0x80,0x80,0xe0,0x80,0x80,0x80,0x00, - - 5, // 0x47 'G' - 0x00,0x60,0x90,0x80,0xb0,0x90,0x90,0x60,0x00, - - 5, // 0x48 'H' - 0x00,0x90,0x90,0x90,0xf0,0x90,0x90,0x90,0x00, - - 5, // 0x49 'I' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00, - - 5, // 0x4a 'J' - 0x00,0x70,0x20,0x20,0x20,0x20,0xa0,0x40,0x00, - - 5, // 0x4b 'K' - 0x00,0x90,0x90,0xa0,0xc0,0xa0,0x90,0x90,0x00, - - 5, // 0x4c 'L' - 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0xf0,0x00, - - 5, // 0x4d 'M' - 0x00,0x90,0xf0,0x90,0x90,0x90,0x90,0x90,0x00, - - 5, // 0x4e 'N' - 0x00,0x90,0x90,0xd0,0xb0,0x90,0x90,0x90,0x00, - - 5, // 0x4f 'O' - 0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x50 'P' - 0x00,0xe0,0x90,0x90,0xe0,0x80,0x80,0x80,0x00, - - 5, // 0x51 'Q' - 0x00,0x60,0x90,0x90,0x90,0x90,0xa0,0x50,0x00, - - 5, // 0x52 'R' - 0x00,0xe0,0x90,0x90,0xe0,0xa0,0x90,0x90,0x00, - - 5, // 0x53 'S' - 0x00,0x60,0x90,0x80,0x60,0x10,0x90,0x60,0x00, - - 5, // 0x54 'T' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x00, - - 5, // 0x55 'U' - 0x00,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x56 'V' - 0x00,0x50,0x50,0x50,0x50,0x50,0x20,0x20,0x00, - - 5, // 0x57 'W' - 0x00,0x90,0x90,0x90,0x90,0x90,0xf0,0x90,0x00, - - 5, // 0x58 'X' - 0x00,0x90,0x90,0x60,0x60,0x90,0x90,0x90,0x00, - - 5, // 0x59 'Y' - 0x00,0x50,0x50,0x50,0x20,0x20,0x20,0x20,0x00, - - 5, // 0x5a 'Z' - 0x00,0xf0,0x10,0x10,0x20,0x40,0x80,0xf0,0x00, - - 5, // 0x5b '[' - 0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x00, - - 5, // 0x5c '\' - 0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x00, - - 5, // 0x5d ']' - 0xe0,0x20,0x20,0x20,0x20,0x20,0x20,0xe0,0x00, - - 5, // 0x5e '^' - 0x00,0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00, - - 5, // 0x60 '`' - 0x00,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x61 'a' - 0x00,0x00,0x60,0x10,0x70,0x90,0x90,0x70,0x00, - - 5, // 0x62 'b' - 0x00,0x80,0x80,0xe0,0x90,0x90,0x90,0xe0,0x00, - - 5, // 0x63 'c' - 0x00,0x00,0x60,0x90,0x80,0x80,0x90,0x60,0x00, - - 5, // 0x64 'd' - 0x00,0x10,0x10,0x70,0x90,0x90,0x90,0x70,0x00, - - 5, // 0x65 'e' - 0x00,0x00,0x60,0x90,0xf0,0x80,0x80,0x70,0x00, - - 5, // 0x66 'f' - 0x00,0x30,0x40,0x40,0xe0,0x40,0x40,0x40,0x00, - - 5, // 0x67 'g' - 0x00,0x00,0x70,0x90,0x90,0x70,0x10,0x90,0x60, - - 5, // 0x68 'h' - 0x00,0x80,0x80,0xe0,0x90,0x90,0x90,0x90,0x00, - - 5, // 0x69 'i' - 0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x70,0x00, - - 5, // 0x6a 'j' - 0x00,0x20,0x00,0x60,0x20,0x20,0x20,0xa0,0x40, - - 5, // 0x6b 'k' - 0x00,0x80,0x80,0x90,0xa0,0xc0,0xa0,0x90,0x00, - - 5, // 0x6c 'l' - 0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00, - - 5, // 0x6d 'm' - 0x00,0x00,0xa0,0xf0,0xf0,0xf0,0x90,0x90,0x00, - - 5, // 0x6e 'n' - 0x00,0x00,0xa0,0xd0,0x90,0x90,0x90,0x90,0x00, - - 5, // 0x6f 'o' - 0x00,0x00,0x60,0x90,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x70 'p' - 0x00,0x00,0xe0,0x90,0x90,0x90,0xe0,0x80,0x80, - - 5, // 0x71 'q' - 0x00,0x00,0x70,0x90,0x90,0x90,0x70,0x10,0x10, - - 5, // 0x72 'r' - 0x00,0x00,0xe0,0x90,0x80,0x80,0x80,0x80,0x00, - - 5, // 0x73 's' - 0x00,0x00,0x60,0x90,0x40,0x20,0x90,0x60,0x00, - - 5, // 0x74 't' - 0x00,0x40,0x40,0xe0,0x40,0x40,0x50,0x20,0x00, - - 5, // 0x75 'u' - 0x00,0x00,0x90,0x90,0x90,0x90,0x90,0x70,0x00, - - 5, // 0x76 'v' - 0x00,0x00,0x50,0x50,0x50,0x50,0x20,0x20,0x00, - - 5, // 0x77 'w' - 0x00,0x00,0x90,0x90,0x90,0x90,0xf0,0x90,0x00, - - 5, // 0x78 'x' - 0x00,0x00,0x90,0x90,0x60,0x60,0x90,0x90,0x00, - - 5, // 0x79 'y' - 0x00,0x00,0x90,0x90,0x90,0x90,0x70,0x10,0xe0, - - 5, // 0x7a 'z' - 0x00,0x00,0xf0,0x10,0x20,0x40,0x80,0xf0,0x00, - - 5, // 0x7b '{' - 0x10,0x20,0x20,0x20,0xc0,0x20,0x20,0x20,0x10, - - 5, // 0x7c '|' - 0x00,0x20,0x20,0x20,0x00,0x20,0x20,0x20,0x00, - - 5, // 0x7d '}' - 0x80,0x40,0x40,0x40,0x30,0x40,0x40,0x40,0x80, - - 5, // 0x7e '~' - 0x00,0x40,0xa8,0x10,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x7f '' - 0x00,0x00,0x00,0x20,0x50,0x88,0xf8,0x00,0x00, - 0 - }; - - const int8u gse6x12[] = - { - 12, 0, 32, 128-32, - - 0x00,0x00,0x0d,0x00,0x1a,0x00,0x27,0x00,0x34,0x00,0x41,0x00,0x4e,0x00,0x5b,0x00,0x68,0x00, - 0x75,0x00,0x82,0x00,0x8f,0x00,0x9c,0x00,0xa9,0x00,0xb6,0x00,0xc3,0x00,0xd0,0x00,0xdd,0x00, - 0xea,0x00,0xf7,0x00,0x04,0x01,0x11,0x01,0x1e,0x01,0x2b,0x01,0x38,0x01,0x45,0x01,0x52,0x01, - 0x5f,0x01,0x6c,0x01,0x79,0x01,0x86,0x01,0x93,0x01,0xa0,0x01,0xad,0x01,0xba,0x01,0xc7,0x01, - 0xd4,0x01,0xe1,0x01,0xee,0x01,0xfb,0x01,0x08,0x02,0x15,0x02,0x22,0x02,0x2f,0x02,0x3c,0x02, - 0x49,0x02,0x56,0x02,0x63,0x02,0x70,0x02,0x7d,0x02,0x8a,0x02,0x97,0x02,0xa4,0x02,0xb1,0x02, - 0xbe,0x02,0xcb,0x02,0xd8,0x02,0xe5,0x02,0xf2,0x02,0xff,0x02,0x0c,0x03,0x19,0x03,0x26,0x03, - 0x33,0x03,0x40,0x03,0x4d,0x03,0x5a,0x03,0x67,0x03,0x74,0x03,0x81,0x03,0x8e,0x03,0x9b,0x03, - 0xa8,0x03,0xb5,0x03,0xc2,0x03,0xcf,0x03,0xdc,0x03,0xe9,0x03,0xf6,0x03,0x03,0x04,0x10,0x04, - 0x1d,0x04,0x2a,0x04,0x37,0x04,0x44,0x04,0x51,0x04,0x5e,0x04,0x6b,0x04,0x78,0x04,0x85,0x04, - 0x92,0x04,0x9f,0x04,0xac,0x04,0xb9,0x04,0xc6,0x04,0xd3,0x04, - - 6, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x21 '!' - 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, - - 6, // 0x22 '"' - 0x00,0x50,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x23 '#' - 0x00,0x50,0x50,0xf8,0x50,0x50,0x50,0xf8,0x50,0x50,0x00,0x00, - - 6, // 0x24 '$' - 0x00,0x20,0x70,0xa8,0xa0,0x70,0x28,0xa8,0x70,0x20,0x00,0x00, - - 6, // 0x25 '%' - 0x00,0xc8,0xd8,0x10,0x30,0x20,0x60,0x40,0xd8,0x98,0x00,0x00, - - 6, // 0x26 '&' - 0x00,0x60,0x90,0x90,0x90,0x60,0xa8,0x90,0x90,0x68,0x00,0x00, - - 6, // 0x27 ''' - 0x00,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x28 '(' - 0x00,0x10,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x10,0x00,0x00, - - 6, // 0x29 ')' - 0x00,0x40,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x40,0x00,0x00, - - 6, // 0x2a '*' - 0x00,0x00,0x00,0x50,0x20,0xf8,0x20,0x50,0x00,0x00,0x00,0x00, - - 6, // 0x2b '+' - 0x00,0x00,0x20,0x20,0x20,0xf8,0x20,0x20,0x20,0x00,0x00,0x00, - - 6, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x40, - - 6, // 0x2d '-' - 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00, - - 6, // 0x2f '/' - 0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80,0x00,0x00, - - 6, // 0x30 '0' - 0x00,0x70,0x88,0x88,0x98,0xa8,0xc8,0x88,0x88,0x70,0x00,0x00, - - 6, // 0x31 '1' - 0x00,0x20,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - - 6, // 0x32 '2' - 0x00,0x70,0x88,0x88,0x08,0x10,0x20,0x40,0x80,0xf8,0x00,0x00, - - 6, // 0x33 '3' - 0x00,0xf8,0x10,0x20,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00, - - 6, // 0x34 '4' - 0x00,0x10,0x20,0x40,0x90,0x90,0xf8,0x10,0x10,0x10,0x00,0x00, - - 6, // 0x35 '5' - 0x00,0xf8,0x80,0x80,0xf0,0x08,0x08,0x08,0x88,0x70,0x00,0x00, - - 6, // 0x36 '6' - 0x00,0x70,0x88,0x80,0x80,0xf0,0x88,0x88,0x88,0x70,0x00,0x00, - - 6, // 0x37 '7' - 0x00,0xf8,0x88,0x08,0x08,0x10,0x20,0x20,0x20,0x20,0x00,0x00, - - 6, // 0x38 '8' - 0x00,0x70,0x88,0x88,0x88,0x70,0x88,0x88,0x88,0x70,0x00,0x00, - - 6, // 0x39 '9' - 0x00,0x70,0x88,0x88,0x88,0x78,0x08,0x08,0x88,0x70,0x00,0x00, - - 6, // 0x3a ':' - 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00, - - 6, // 0x3b ';' - 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x20,0x20,0x40, - - 6, // 0x3c '<' - 0x00,0x08,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x08,0x00,0x00, - - 6, // 0x3d '=' - 0x00,0x00,0x00,0x00,0xf8,0x00,0xf8,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x3e '>' - 0x00,0x80,0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x80,0x00,0x00, - - 6, // 0x3f '?' - 0x00,0x70,0x88,0x88,0x08,0x10,0x20,0x20,0x00,0x20,0x00,0x00, - - 6, // 0x40 '@' - 0x00,0x70,0x88,0x88,0xb8,0xb8,0xb0,0x80,0x88,0x70,0x00,0x00, - - 6, // 0x41 'A' - 0x00,0x20,0x50,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x00,0x00, - - 6, // 0x42 'B' - 0x00,0xf0,0x88,0x88,0x88,0xf0,0x88,0x88,0x88,0xf0,0x00,0x00, - - 6, // 0x43 'C' - 0x00,0x70,0x88,0x88,0x80,0x80,0x80,0x88,0x88,0x70,0x00,0x00, - - 6, // 0x44 'D' - 0x00,0xe0,0x90,0x88,0x88,0x88,0x88,0x88,0x90,0xe0,0x00,0x00, - - 6, // 0x45 'E' - 0x00,0xf8,0x80,0x80,0x80,0xf0,0x80,0x80,0x80,0xf8,0x00,0x00, - - 6, // 0x46 'F' - 0x00,0xf8,0x80,0x80,0x80,0xf0,0x80,0x80,0x80,0x80,0x00,0x00, - - 6, // 0x47 'G' - 0x00,0x70,0x88,0x80,0x80,0xb8,0x88,0x88,0x88,0x70,0x00,0x00, - - 6, // 0x48 'H' - 0x00,0x88,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x88,0x00,0x00, - - 6, // 0x49 'I' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - - 6, // 0x4a 'J' - 0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x90,0x60,0x00,0x00, - - 6, // 0x4b 'K' - 0x00,0x88,0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88,0x88,0x00,0x00, - - 6, // 0x4c 'L' - 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xf8,0x00,0x00, - - 6, // 0x4d 'M' - 0x00,0x88,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x88,0x00,0x00, - - 6, // 0x4e 'N' - 0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x88,0x88,0x00,0x00, - - 6, // 0x4f 'O' - 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00, - - 6, // 0x50 'P' - 0x00,0xf0,0x88,0x88,0x88,0xf0,0x80,0x80,0x80,0x80,0x00,0x00, - - 6, // 0x51 'Q' - 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0xa8,0x90,0x68,0x00,0x00, - - 6, // 0x52 'R' - 0x00,0xf0,0x88,0x88,0x88,0x88,0xf0,0xa0,0x90,0x88,0x00,0x00, - - 6, // 0x53 'S' - 0x00,0x70,0x88,0x80,0x80,0x70,0x08,0x08,0x88,0x70,0x00,0x00, - - 6, // 0x54 'T' - 0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00, - - 6, // 0x55 'U' - 0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00, - - 6, // 0x56 'V' - 0x00,0x88,0x88,0x88,0x88,0x88,0x50,0x50,0x20,0x20,0x00,0x00, - - 6, // 0x57 'W' - 0x00,0x88,0x88,0x88,0x88,0x88,0xa8,0xa8,0xd8,0x88,0x00,0x00, - - 6, // 0x58 'X' - 0x00,0x88,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x88,0x00,0x00, - - 6, // 0x59 'Y' - 0x00,0x88,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x20,0x00,0x00, - - 6, // 0x5a 'Z' - 0x00,0xf8,0x08,0x08,0x10,0x20,0x40,0x80,0x80,0xf8,0x00,0x00, - - 6, // 0x5b '[' - 0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x00, - - 6, // 0x5c '\' - 0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x00,0x00, - - 6, // 0x5d ']' - 0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70,0x00, - - 6, // 0x5e '^' - 0x00,0x00,0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00, - - 6, // 0x60 '`' - 0x00,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x61 'a' - 0x00,0x00,0x00,0x70,0x88,0x08,0x78,0x88,0x88,0x78,0x00,0x00, - - 6, // 0x62 'b' - 0x00,0x80,0x80,0x80,0xf0,0x88,0x88,0x88,0x88,0xf0,0x00,0x00, - - 6, // 0x63 'c' - 0x00,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x00,0x00, - - 6, // 0x64 'd' - 0x00,0x08,0x08,0x08,0x78,0x88,0x88,0x88,0x88,0x78,0x00,0x00, - - 6, // 0x65 'e' - 0x00,0x00,0x00,0x70,0x88,0x88,0xf8,0x80,0x80,0x78,0x00,0x00, - - 6, // 0x66 'f' - 0x00,0x18,0x20,0x20,0xf8,0x20,0x20,0x20,0x20,0x20,0x00,0x00, - - 6, // 0x67 'g' - 0x00,0x00,0x00,0x78,0x88,0x88,0x88,0x88,0x78,0x08,0x08,0xf0, - - 6, // 0x68 'h' - 0x00,0x80,0x80,0x80,0xf0,0x88,0x88,0x88,0x88,0x88,0x00,0x00, - - 6, // 0x69 'i' - 0x00,0x20,0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - - 6, // 0x6a 'j' - 0x00,0x10,0x00,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x90,0x60, - - 6, // 0x6b 'k' - 0x00,0x80,0x80,0x80,0x88,0x90,0xa0,0xd0,0x88,0x88,0x00,0x00, - - 6, // 0x6c 'l' - 0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - - 6, // 0x6d 'm' - 0x00,0x00,0x00,0xd0,0xa8,0xa8,0xa8,0xa8,0xa8,0xa8,0x00,0x00, - - 6, // 0x6e 'n' - 0x00,0x00,0x00,0xb0,0xc8,0x88,0x88,0x88,0x88,0x88,0x00,0x00, - - 6, // 0x6f 'o' - 0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00, - - 6, // 0x70 'p' - 0x00,0x00,0x00,0xf0,0x88,0x88,0x88,0x88,0xf0,0x80,0x80,0x80, - - 6, // 0x71 'q' - 0x00,0x00,0x00,0x78,0x88,0x88,0x88,0x88,0x78,0x08,0x08,0x08, - - 6, // 0x72 'r' - 0x00,0x00,0x00,0xb0,0xc8,0x88,0x80,0x80,0x80,0x80,0x00,0x00, - - 6, // 0x73 's' - 0x00,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x00,0x00, - - 6, // 0x74 't' - 0x00,0x40,0x40,0x40,0xe0,0x40,0x40,0x40,0x48,0x30,0x00,0x00, - - 6, // 0x75 'u' - 0x00,0x00,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x78,0x00,0x00, - - 6, // 0x76 'v' - 0x00,0x00,0x00,0x88,0x88,0x88,0x50,0x50,0x20,0x20,0x00,0x00, - - 6, // 0x77 'w' - 0x00,0x00,0x00,0x88,0x88,0x88,0xa8,0xa8,0xd8,0x88,0x00,0x00, - - 6, // 0x78 'x' - 0x00,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x00,0x00, - - 6, // 0x79 'y' - 0x00,0x00,0x00,0x88,0x88,0x88,0x88,0x88,0x78,0x08,0x10,0xe0, - - 6, // 0x7a 'z' - 0x00,0x00,0x00,0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x00,0x00, - - 6, // 0x7b '{' - 0x18,0x20,0x20,0x20,0x20,0xc0,0x20,0x20,0x20,0x20,0x18,0x00, - - 6, // 0x7c '|' - 0x00,0x20,0x20,0x20,0x20,0x00,0x20,0x20,0x20,0x20,0x00,0x00, - - 6, // 0x7d '}' - 0xc0,0x20,0x20,0x20,0x20,0x18,0x20,0x20,0x20,0x20,0xc0,0x00, - - 6, // 0x7e '~' - 0x00,0x00,0x40,0xa8,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x7f '' - 0x00,0x00,0x00,0x00,0x20,0x50,0x88,0xf8,0x00,0x00,0x00,0x00, - 0 - }; - - const int8u gse6x9[] = - { - 9, 0, 32, 128-32, - - 0x00,0x00,0x0a,0x00,0x14,0x00,0x1e,0x00,0x28,0x00,0x32,0x00,0x3c,0x00,0x46,0x00,0x50,0x00, - 0x5a,0x00,0x64,0x00,0x6e,0x00,0x78,0x00,0x82,0x00,0x8c,0x00,0x96,0x00,0xa0,0x00,0xaa,0x00, - 0xb4,0x00,0xbe,0x00,0xc8,0x00,0xd2,0x00,0xdc,0x00,0xe6,0x00,0xf0,0x00,0xfa,0x00,0x04,0x01, - 0x0e,0x01,0x18,0x01,0x22,0x01,0x2c,0x01,0x36,0x01,0x40,0x01,0x4a,0x01,0x54,0x01,0x5e,0x01, - 0x68,0x01,0x72,0x01,0x7c,0x01,0x86,0x01,0x90,0x01,0x9a,0x01,0xa4,0x01,0xae,0x01,0xb8,0x01, - 0xc2,0x01,0xcc,0x01,0xd6,0x01,0xe0,0x01,0xea,0x01,0xf4,0x01,0xfe,0x01,0x08,0x02,0x12,0x02, - 0x1c,0x02,0x26,0x02,0x30,0x02,0x3a,0x02,0x44,0x02,0x4e,0x02,0x58,0x02,0x62,0x02,0x6c,0x02, - 0x76,0x02,0x80,0x02,0x8a,0x02,0x94,0x02,0x9e,0x02,0xa8,0x02,0xb2,0x02,0xbc,0x02,0xc6,0x02, - 0xd0,0x02,0xda,0x02,0xe4,0x02,0xee,0x02,0xf8,0x02,0x02,0x03,0x0c,0x03,0x16,0x03,0x20,0x03, - 0x2a,0x03,0x34,0x03,0x3e,0x03,0x48,0x03,0x52,0x03,0x5c,0x03,0x66,0x03,0x70,0x03,0x7a,0x03, - 0x84,0x03,0x8e,0x03,0x98,0x03,0xa2,0x03,0xac,0x03,0xb6,0x03, - - 6, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x21 '!' - 0x00,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00, - - 6, // 0x22 '"' - 0x00,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x23 '#' - 0x00,0x50,0x50,0xf8,0x50,0xf8,0x50,0x50,0x00, - - 6, // 0x24 '$' - 0x00,0x70,0xa8,0xa0,0x70,0x28,0xa8,0x70,0x00, - - 6, // 0x25 '%' - 0x00,0xc8,0xc8,0x10,0x20,0x40,0x98,0x98,0x00, - - 6, // 0x26 '&' - 0x00,0x60,0x90,0x90,0x60,0xa8,0x90,0x68,0x00, - - 6, // 0x27 ''' - 0x00,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x28 '(' - 0x10,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x10, - - 6, // 0x29 ')' - 0x40,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x40, - - 6, // 0x2a '*' - 0x00,0x00,0x20,0xa8,0x70,0xa8,0x20,0x00,0x00, - - 6, // 0x2b '+' - 0x00,0x00,0x20,0x20,0xf8,0x20,0x20,0x00,0x00, - - 6, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x40, - - 6, // 0x2d '-' - 0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00, - - 6, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00, - - 6, // 0x2f '/' - 0x00,0x08,0x08,0x10,0x20,0x40,0x80,0x80,0x00, - - 6, // 0x30 '0' - 0x00,0x70,0x88,0x98,0xa8,0xc8,0x88,0x70,0x00, - - 6, // 0x31 '1' - 0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x70,0x00, - - 6, // 0x32 '2' - 0x00,0x70,0x88,0x08,0x10,0x20,0x40,0xf8,0x00, - - 6, // 0x33 '3' - 0x00,0xf8,0x10,0x20,0x70,0x08,0x88,0x70,0x00, - - 6, // 0x34 '4' - 0x00,0x10,0x20,0x40,0x90,0xf8,0x10,0x10,0x00, - - 6, // 0x35 '5' - 0x00,0xf8,0x80,0xf0,0x08,0x08,0x88,0x70,0x00, - - 6, // 0x36 '6' - 0x00,0x70,0x88,0x80,0xf0,0x88,0x88,0x70,0x00, - - 6, // 0x37 '7' - 0x00,0xf8,0x08,0x08,0x10,0x20,0x40,0x40,0x00, - - 6, // 0x38 '8' - 0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x00, - - 6, // 0x39 '9' - 0x00,0x70,0x88,0x88,0x78,0x08,0x88,0x70,0x00, - - 6, // 0x3a ':' - 0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00, - - 6, // 0x3b ';' - 0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x20,0x40, - - 6, // 0x3c '<' - 0x00,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x00, - - 6, // 0x3d '=' - 0x00,0x00,0x00,0xf8,0x00,0xf8,0x00,0x00,0x00, - - 6, // 0x3e '>' - 0x00,0x80,0x40,0x20,0x10,0x20,0x40,0x80,0x00, - - 6, // 0x3f '?' - 0x00,0x70,0x88,0x08,0x10,0x20,0x00,0x20,0x00, - - 6, // 0x40 '@' - 0x00,0x70,0x88,0x88,0xb8,0xb8,0x80,0x70,0x00, - - 6, // 0x41 'A' - 0x00,0x20,0x50,0x88,0x88,0xf8,0x88,0x88,0x00, - - 6, // 0x42 'B' - 0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0xf0,0x00, - - 6, // 0x43 'C' - 0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x00, - - 6, // 0x44 'D' - 0x00,0xe0,0x90,0x88,0x88,0x88,0x90,0xe0,0x00, - - 6, // 0x45 'E' - 0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0xf8,0x00, - - 6, // 0x46 'F' - 0x00,0xf8,0x80,0x80,0xf0,0x80,0x80,0x80,0x00, - - 6, // 0x47 'G' - 0x00,0x70,0x88,0x80,0xb8,0x88,0x88,0x70,0x00, - - 6, // 0x48 'H' - 0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x00, - - 6, // 0x49 'I' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00, - - 6, // 0x4a 'J' - 0x00,0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x00, - - 6, // 0x4b 'K' - 0x00,0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88,0x00, - - 6, // 0x4c 'L' - 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0xf8,0x00, - - 6, // 0x4d 'M' - 0x00,0x88,0xd8,0xa8,0x88,0x88,0x88,0x88,0x00, - - 6, // 0x4e 'N' - 0x00,0x88,0x88,0xc8,0xa8,0x98,0x88,0x88,0x00, - - 6, // 0x4f 'O' - 0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00, - - 6, // 0x50 'P' - 0x00,0xf0,0x88,0x88,0xf0,0x80,0x80,0x80,0x00, - - 6, // 0x51 'Q' - 0x00,0x70,0x88,0x88,0x88,0xa8,0x90,0x68,0x00, - - 6, // 0x52 'R' - 0x00,0xf0,0x88,0x88,0x88,0xf0,0x90,0x88,0x00, - - 6, // 0x53 'S' - 0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x00, - - 6, // 0x54 'T' - 0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x00, - - 6, // 0x55 'U' - 0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00, - - 6, // 0x56 'V' - 0x00,0x88,0x88,0x88,0x50,0x50,0x20,0x20,0x00, - - 6, // 0x57 'W' - 0x00,0x88,0x88,0x88,0xa8,0xa8,0xd8,0x88,0x00, - - 6, // 0x58 'X' - 0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x00, - - 6, // 0x59 'Y' - 0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x00, - - 6, // 0x5a 'Z' - 0x00,0xf8,0x08,0x10,0x20,0x40,0x80,0xf8,0x00, - - 6, // 0x5b '[' - 0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70, - - 6, // 0x5c '\' - 0x00,0x80,0x80,0x40,0x20,0x10,0x08,0x08,0x00, - - 6, // 0x5d ']' - 0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70, - - 6, // 0x5e '^' - 0x00,0x00,0x20,0x50,0x88,0x00,0x00,0x00,0x00, - - 6, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00, - - 6, // 0x60 '`' - 0x00,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x61 'a' - 0x00,0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x00, - - 6, // 0x62 'b' - 0x00,0x80,0x80,0xf0,0x88,0x88,0x88,0xf0,0x00, - - 6, // 0x63 'c' - 0x00,0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x00, - - 6, // 0x64 'd' - 0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x00, - - 6, // 0x65 'e' - 0x00,0x00,0x00,0x70,0x88,0xf8,0x80,0x78,0x00, - - 6, // 0x66 'f' - 0x00,0x18,0x20,0x20,0xf8,0x20,0x20,0x20,0x00, - - 6, // 0x67 'g' - 0x00,0x00,0x00,0x78,0x88,0x88,0x78,0x08,0x70, - - 6, // 0x68 'h' - 0x00,0x80,0x80,0xf0,0x88,0x88,0x88,0x88,0x00, - - 6, // 0x69 'i' - 0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x70,0x00, - - 6, // 0x6a 'j' - 0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x90,0x60, - - 6, // 0x6b 'k' - 0x00,0x00,0x80,0x88,0x90,0xa0,0xd0,0x88,0x00, - - 6, // 0x6c 'l' - 0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00, - - 6, // 0x6d 'm' - 0x00,0x00,0x00,0xd0,0xa8,0xa8,0xa8,0xa8,0x00, - - 6, // 0x6e 'n' - 0x00,0x00,0x00,0xb0,0xc8,0x88,0x88,0x88,0x00, - - 6, // 0x6f 'o' - 0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x00, - - 6, // 0x70 'p' - 0x00,0x00,0x00,0xf0,0x88,0x88,0xf0,0x80,0x80, - - 6, // 0x71 'q' - 0x00,0x00,0x00,0x78,0x88,0x88,0x78,0x08,0x08, - - 6, // 0x72 'r' - 0x00,0x00,0x00,0xb8,0xc0,0x80,0x80,0x80,0x00, - - 6, // 0x73 's' - 0x00,0x00,0x00,0x78,0x80,0x70,0x08,0xf0,0x00, - - 6, // 0x74 't' - 0x00,0x40,0x40,0xe0,0x40,0x40,0x48,0x30,0x00, - - 6, // 0x75 'u' - 0x00,0x00,0x00,0x88,0x88,0x88,0x88,0x78,0x00, - - 6, // 0x76 'v' - 0x00,0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x00, - - 6, // 0x77 'w' - 0x00,0x00,0x00,0x88,0x88,0xa8,0xd8,0x88,0x00, - - 6, // 0x78 'x' - 0x00,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x00, - - 6, // 0x79 'y' - 0x00,0x00,0x00,0x88,0x88,0x88,0x78,0x08,0x70, - - 6, // 0x7a 'z' - 0x00,0x00,0x00,0xf8,0x10,0x20,0x40,0xf8,0x00, - - 6, // 0x7b '{' - 0x18,0x20,0x20,0x20,0xc0,0x20,0x20,0x20,0x18, - - 6, // 0x7c '|' - 0x00,0x20,0x20,0x20,0x00,0x20,0x20,0x20,0x00, - - 6, // 0x7d '}' - 0xc0,0x20,0x20,0x20,0x18,0x20,0x20,0x20,0xc0, - - 6, // 0x7e '~' - 0x00,0x40,0xa8,0x10,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x7f '' - 0x00,0x00,0x00,0x20,0x50,0x88,0xf8,0x00,0x00, - 0 - }; - - const int8u gse7x11[] = - { - 11, 0, 32, 128-32, - - 0x00,0x00,0x0c,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x3c,0x00,0x48,0x00,0x54,0x00,0x60,0x00, - 0x6c,0x00,0x78,0x00,0x84,0x00,0x90,0x00,0x9c,0x00,0xa8,0x00,0xb4,0x00,0xc0,0x00,0xcc,0x00, - 0xd8,0x00,0xe4,0x00,0xf0,0x00,0xfc,0x00,0x08,0x01,0x14,0x01,0x20,0x01,0x2c,0x01,0x38,0x01, - 0x44,0x01,0x50,0x01,0x5c,0x01,0x68,0x01,0x74,0x01,0x80,0x01,0x8c,0x01,0x98,0x01,0xa4,0x01, - 0xb0,0x01,0xbc,0x01,0xc8,0x01,0xd4,0x01,0xe0,0x01,0xec,0x01,0xf8,0x01,0x04,0x02,0x10,0x02, - 0x1c,0x02,0x28,0x02,0x34,0x02,0x40,0x02,0x4c,0x02,0x58,0x02,0x64,0x02,0x70,0x02,0x7c,0x02, - 0x88,0x02,0x94,0x02,0xa0,0x02,0xac,0x02,0xb8,0x02,0xc4,0x02,0xd0,0x02,0xdc,0x02,0xe8,0x02, - 0xf4,0x02,0x00,0x03,0x0c,0x03,0x18,0x03,0x24,0x03,0x30,0x03,0x3c,0x03,0x48,0x03,0x54,0x03, - 0x60,0x03,0x6c,0x03,0x78,0x03,0x84,0x03,0x90,0x03,0x9c,0x03,0xa8,0x03,0xb4,0x03,0xc0,0x03, - 0xcc,0x03,0xd8,0x03,0xe4,0x03,0xf0,0x03,0xfc,0x03,0x08,0x04,0x14,0x04,0x20,0x04,0x2c,0x04, - 0x38,0x04,0x44,0x04,0x50,0x04,0x5c,0x04,0x68,0x04,0x74,0x04, - - 7, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x21 '!' - 0x00,0x10,0x38,0x38,0x38,0x10,0x10,0x00,0x10,0x00,0x00, - - 7, // 0x22 '"' - 0x00,0x00,0x24,0x24,0x24,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x23 '#' - 0x00,0x48,0x48,0xfc,0x48,0x48,0xfc,0x48,0x48,0x00,0x00, - - 7, // 0x24 '$' - 0x00,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x00, - - 7, // 0x25 '%' - 0x00,0x00,0x42,0xa4,0x48,0x10,0x24,0x4a,0x84,0x00,0x00, - - 7, // 0x26 '&' - 0x00,0x30,0x48,0x48,0x30,0x60,0x94,0x98,0x6c,0x00,0x00, - - 7, // 0x27 ''' - 0x00,0x20,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x28 '(' - 0x00,0x04,0x08,0x10,0x10,0x10,0x10,0x08,0x04,0x00,0x00, - - 7, // 0x29 ')' - 0x00,0x40,0x20,0x10,0x10,0x10,0x10,0x20,0x40,0x00,0x00, - - 7, // 0x2a '*' - 0x00,0x00,0x00,0x20,0xa8,0x70,0xa8,0x20,0x00,0x00,0x00, - - 7, // 0x2b '+' - 0x00,0x00,0x00,0x10,0x10,0x7c,0x10,0x10,0x00,0x00,0x00, - - 7, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x60, - - 7, // 0x2d '-' - 0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00, - - 7, // 0x2f '/' - 0x00,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00,0x00, - - 7, // 0x30 '0' - 0x00,0x38,0x44,0x4c,0x54,0x64,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x31 '1' - 0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x10,0x7c,0x00,0x00, - - 7, // 0x32 '2' - 0x00,0x38,0x44,0x04,0x08,0x10,0x20,0x44,0x7c,0x00,0x00, - - 7, // 0x33 '3' - 0x00,0x7c,0x48,0x10,0x38,0x04,0x04,0x44,0x38,0x00,0x00, - - 7, // 0x34 '4' - 0x00,0x08,0x10,0x20,0x48,0x48,0x7c,0x08,0x1c,0x00,0x00, - - 7, // 0x35 '5' - 0x00,0x7c,0x40,0x40,0x78,0x04,0x04,0x44,0x38,0x00,0x00, - - 7, // 0x36 '6' - 0x00,0x18,0x20,0x40,0x78,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x37 '7' - 0x00,0x7c,0x44,0x04,0x08,0x10,0x10,0x10,0x10,0x00,0x00, - - 7, // 0x38 '8' - 0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x39 '9' - 0x00,0x38,0x44,0x44,0x44,0x3c,0x04,0x08,0x30,0x00,0x00, - - 7, // 0x3a ':' - 0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00, - - 7, // 0x3b ';' - 0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x30,0x60,0x00, - - 7, // 0x3c '<' - 0x00,0x00,0x04,0x08,0x10,0x20,0x10,0x08,0x04,0x00,0x00, - - 7, // 0x3d '=' - 0x00,0x00,0x00,0x00,0xfc,0x00,0xfc,0x00,0x00,0x00,0x00, - - 7, // 0x3e '>' - 0x00,0x00,0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x00,0x00, - - 7, // 0x3f '?' - 0x00,0x70,0x88,0x88,0x10,0x20,0x20,0x00,0x20,0x00,0x00, - - 7, // 0x40 '@' - 0x00,0x30,0x48,0x04,0x34,0x54,0x54,0x54,0x28,0x00,0x00, - - 7, // 0x41 'A' - 0x00,0x10,0x28,0x44,0x44,0x7c,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x42 'B' - 0x00,0x78,0x44,0x44,0x78,0x44,0x44,0x44,0x78,0x00,0x00, - - 7, // 0x43 'C' - 0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x44,0x38,0x00,0x00, - - 7, // 0x44 'D' - 0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x48,0x70,0x00,0x00, - - 7, // 0x45 'E' - 0x00,0x7c,0x40,0x40,0x70,0x40,0x40,0x40,0x7c,0x00,0x00, - - 7, // 0x46 'F' - 0x00,0x7c,0x40,0x40,0x70,0x40,0x40,0x40,0x40,0x00,0x00, - - 7, // 0x47 'G' - 0x00,0x38,0x44,0x40,0x40,0x5c,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x48 'H' - 0x00,0x44,0x44,0x44,0x7c,0x44,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x49 'I' - 0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - - 7, // 0x4a 'J' - 0x00,0x1c,0x08,0x08,0x08,0x08,0x08,0x48,0x30,0x00,0x00, - - 7, // 0x4b 'K' - 0x00,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x44,0x00,0x00, - - 7, // 0x4c 'L' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7c,0x00,0x00, - - 7, // 0x4d 'M' - 0x00,0x44,0x6c,0x54,0x54,0x44,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x4e 'N' - 0x00,0x44,0x44,0x64,0x54,0x4c,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x4f 'O' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x50 'P' - 0x00,0x78,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00, - - 7, // 0x51 'Q' - 0x00,0x38,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00, - - 7, // 0x52 'R' - 0x00,0x78,0x44,0x44,0x44,0x78,0x50,0x48,0x44,0x00,0x00, - - 7, // 0x53 'S' - 0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x54 'T' - 0x00,0x7c,0x54,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - - 7, // 0x55 'U' - 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x56 'V' - 0x00,0x44,0x44,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00, - - 7, // 0x57 'W' - 0x00,0x44,0x44,0x44,0x44,0x54,0x54,0x6c,0x44,0x00,0x00, - - 7, // 0x58 'X' - 0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x59 'Y' - 0x00,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x38,0x00,0x00, - - 7, // 0x5a 'Z' - 0x00,0x7c,0x04,0x08,0x10,0x20,0x40,0x44,0x7c,0x00,0x00, - - 7, // 0x5b '[' - 0x00,0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00,0x00, - - 7, // 0x5c '\' - 0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x00,0x00, - - 7, // 0x5d ']' - 0x00,0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x38,0x00,0x00, - - 7, // 0x5e '^' - 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00, - - 7, // 0x60 '`' - 0x00,0x20,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x61 'a' - 0x00,0x00,0x00,0x38,0x04,0x3c,0x44,0x44,0x3c,0x00,0x00, - - 7, // 0x62 'b' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x78,0x00,0x00, - - 7, // 0x63 'c' - 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x44,0x38,0x00,0x00, - - 7, // 0x64 'd' - 0x00,0x04,0x04,0x3c,0x44,0x44,0x44,0x44,0x3c,0x00,0x00, - - 7, // 0x65 'e' - 0x00,0x00,0x00,0x38,0x44,0x7c,0x40,0x44,0x38,0x00,0x00, - - 7, // 0x66 'f' - 0x00,0x18,0x24,0x20,0x70,0x20,0x20,0x20,0x70,0x00,0x00, - - 7, // 0x67 'g' - 0x00,0x00,0x00,0x3c,0x44,0x44,0x44,0x3c,0x04,0x44,0x38, - - 7, // 0x68 'h' - 0x00,0x40,0x40,0x40,0x58,0x64,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x69 'i' - 0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - - 7, // 0x6a 'j' - 0x00,0x08,0x00,0x18,0x08,0x08,0x08,0x08,0x48,0x30,0x00, - - 7, // 0x6b 'k' - 0x00,0x40,0x40,0x44,0x48,0x50,0x68,0x44,0x44,0x00,0x00, - - 7, // 0x6c 'l' - 0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - - 7, // 0x6d 'm' - 0x00,0x00,0x00,0xa8,0x54,0x54,0x54,0x54,0x54,0x00,0x00, - - 7, // 0x6e 'n' - 0x00,0x00,0x00,0xb8,0x44,0x44,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x6f 'o' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x70 'p' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40, - - 7, // 0x71 'q' - 0x00,0x00,0x00,0x3c,0x44,0x44,0x44,0x44,0x3c,0x04,0x04, - - 7, // 0x72 'r' - 0x00,0x00,0x00,0x58,0x64,0x44,0x40,0x40,0x40,0x00,0x00, - - 7, // 0x73 's' - 0x00,0x00,0x00,0x3c,0x40,0x38,0x04,0x04,0x78,0x00,0x00, - - 7, // 0x74 't' - 0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x24,0x18,0x00,0x00, - - 7, // 0x75 'u' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x3a,0x00,0x00, - - 7, // 0x76 'v' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x28,0x10,0x00,0x00, - - 7, // 0x77 'w' - 0x00,0x00,0x00,0x44,0x44,0x54,0x54,0x6c,0x44,0x00,0x00, - - 7, // 0x78 'x' - 0x00,0x00,0x00,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00, - - 7, // 0x79 'y' - 0x00,0x00,0x00,0x44,0x44,0x44,0x3c,0x04,0x08,0x30,0x00, - - 7, // 0x7a 'z' - 0x00,0x00,0x00,0x7c,0x08,0x10,0x20,0x44,0x7c,0x00,0x00, - - 7, // 0x7b '{' - 0x00,0x0c,0x10,0x10,0x10,0x60,0x10,0x10,0x0c,0x00,0x00, - - 7, // 0x7c '|' - 0x00,0x20,0x20,0x20,0x00,0x20,0x20,0x20,0x20,0x00,0x00, - - 7, // 0x7d '}' - 0x00,0x60,0x10,0x10,0x10,0x0c,0x10,0x10,0x60,0x00,0x00, - - 7, // 0x7e '~' - 0x00,0x00,0x64,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x7f '' - 0x00,0x00,0x00,0x10,0x28,0x44,0x44,0x7c,0x00,0x00,0x00, - 0 - }; - - const int8u gse7x11_bold[] = - { - 11, 0, 32, 128-32, - - 0x00,0x00,0x0c,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x3c,0x00,0x48,0x00,0x54,0x00,0x60,0x00, - 0x6c,0x00,0x78,0x00,0x84,0x00,0x90,0x00,0x9c,0x00,0xa8,0x00,0xb4,0x00,0xc0,0x00,0xcc,0x00, - 0xd8,0x00,0xe4,0x00,0xf0,0x00,0xfc,0x00,0x08,0x01,0x14,0x01,0x20,0x01,0x2c,0x01,0x38,0x01, - 0x44,0x01,0x50,0x01,0x5c,0x01,0x68,0x01,0x74,0x01,0x80,0x01,0x8c,0x01,0x98,0x01,0xa4,0x01, - 0xb0,0x01,0xbc,0x01,0xc8,0x01,0xd4,0x01,0xe0,0x01,0xec,0x01,0xf8,0x01,0x04,0x02,0x10,0x02, - 0x1c,0x02,0x28,0x02,0x34,0x02,0x40,0x02,0x4c,0x02,0x58,0x02,0x64,0x02,0x70,0x02,0x7c,0x02, - 0x88,0x02,0x94,0x02,0xa0,0x02,0xac,0x02,0xb8,0x02,0xc4,0x02,0xd0,0x02,0xdc,0x02,0xe8,0x02, - 0xf4,0x02,0x00,0x03,0x0c,0x03,0x18,0x03,0x24,0x03,0x30,0x03,0x3c,0x03,0x48,0x03,0x54,0x03, - 0x60,0x03,0x6c,0x03,0x78,0x03,0x84,0x03,0x90,0x03,0x9c,0x03,0xa8,0x03,0xb4,0x03,0xc0,0x03, - 0xcc,0x03,0xd8,0x03,0xe4,0x03,0xf0,0x03,0xfc,0x03,0x08,0x04,0x14,0x04,0x20,0x04,0x2c,0x04, - 0x38,0x04,0x44,0x04,0x50,0x04,0x5c,0x04,0x68,0x04,0x74,0x04, - - 7, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x21 '!' - 0x00,0x30,0x30,0x30,0x30,0x30,0x00,0x30,0x30,0x00,0x00, - - 7, // 0x22 '"' - 0x00,0x6c,0x6c,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x23 '#' - 0x00,0x48,0x48,0xfc,0x48,0x48,0xfc,0x48,0x48,0x00,0x00, - - 7, // 0x24 '$' - 0x30,0x30,0x78,0xcc,0xc0,0x78,0x0c,0xcc,0x78,0x30,0x30, - - 7, // 0x25 '%' - 0x00,0x00,0xc4,0x0c,0x18,0x30,0x60,0xc0,0x8c,0x00,0x00, - - 7, // 0x26 '&' - 0x00,0x30,0x58,0x58,0x30,0x74,0xdc,0xd8,0x6c,0x00,0x00, - - 7, // 0x27 ''' - 0x00,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x28 '(' - 0x00,0x0c,0x18,0x30,0x30,0x30,0x30,0x18,0x0c,0x00,0x00, - - 7, // 0x29 ')' - 0x00,0xc0,0x60,0x30,0x30,0x30,0x30,0x60,0xc0,0x00,0x00, - - 7, // 0x2a '*' - 0x00,0x00,0x00,0x20,0xa8,0x70,0xa8,0x20,0x00,0x00,0x00, - - 7, // 0x2b '+' - 0x00,0x00,0x00,0x30,0x30,0xfc,0x30,0x30,0x00,0x00,0x00, - - 7, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x60,0x00, - - 7, // 0x2d '-' - 0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00, - - 7, // 0x2f '/' - 0x00,0x0c,0x0c,0x18,0x18,0x30,0x30,0x60,0x60,0x00,0x00, - - 7, // 0x30 '0' - 0x00,0x78,0xcc,0xcc,0xdc,0xec,0xcc,0xcc,0x78,0x00,0x00, - - 7, // 0x31 '1' - 0x00,0x30,0x70,0xf0,0x30,0x30,0x30,0x30,0xfc,0x00,0x00, - - 7, // 0x32 '2' - 0x00,0x78,0xcc,0xcc,0x18,0x30,0x60,0xcc,0xfc,0x00,0x00, - - 7, // 0x33 '3' - 0x00,0xfc,0x98,0x30,0x78,0x0c,0x0c,0xcc,0x78,0x00,0x00, - - 7, // 0x34 '4' - 0x00,0x18,0x30,0x68,0xd8,0xd8,0xfc,0x18,0x3c,0x00,0x00, - - 7, // 0x35 '5' - 0x00,0xfc,0xc0,0xc0,0xf8,0x0c,0x0c,0xcc,0x78,0x00,0x00, - - 7, // 0x36 '6' - 0x00,0x38,0x60,0xc0,0xf8,0xcc,0xcc,0xcc,0x78,0x00,0x00, - - 7, // 0x37 '7' - 0x00,0xfc,0x8c,0x0c,0x18,0x30,0x30,0x30,0x30,0x00,0x00, - - 7, // 0x38 '8' - 0x00,0x78,0xcc,0xcc,0x78,0xcc,0xcc,0xcc,0x78,0x00,0x00, - - 7, // 0x39 '9' - 0x00,0x78,0xcc,0xcc,0xcc,0x7c,0x0c,0x18,0x70,0x00,0x00, - - 7, // 0x3a ':' - 0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00,0x00,0x00, - - 7, // 0x3b ';' - 0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x30,0x60,0x00, - - 7, // 0x3c '<' - 0x00,0x00,0x0c,0x18,0x30,0x60,0x30,0x18,0x0c,0x00,0x00, - - 7, // 0x3d '=' - 0x00,0x00,0x00,0x00,0xfc,0x00,0xfc,0x00,0x00,0x00,0x00, - - 7, // 0x3e '>' - 0x00,0x00,0x60,0x30,0x18,0x0c,0x18,0x30,0x60,0x00,0x00, - - 7, // 0x3f '?' - 0x00,0x78,0xcc,0xcc,0x18,0x30,0x30,0x00,0x30,0x00,0x00, - - 7, // 0x40 '@' - 0x00,0x70,0x88,0x04,0x74,0xb4,0xb4,0xb4,0x68,0x00,0x00, - - 7, // 0x41 'A' - 0x00,0x30,0x78,0xcc,0xcc,0xfc,0xcc,0xcc,0xcc,0x00,0x00, - - 7, // 0x42 'B' - 0x00,0xf8,0xcc,0xcc,0xf8,0xcc,0xcc,0xcc,0xf8,0x00,0x00, - - 7, // 0x43 'C' - 0x00,0x78,0xcc,0xc0,0xc0,0xc0,0xc0,0xcc,0x78,0x00,0x00, - - 7, // 0x44 'D' - 0x00,0xf0,0xd8,0xcc,0xcc,0xcc,0xcc,0xd8,0xf0,0x00,0x00, - - 7, // 0x45 'E' - 0x00,0xfc,0xc4,0xd0,0xf0,0xd0,0xc0,0xc4,0xfc,0x00,0x00, - - 7, // 0x46 'F' - 0x00,0xfc,0xc4,0xd0,0xf0,0xd0,0xc0,0xc0,0xc0,0x00,0x00, - - 7, // 0x47 'G' - 0x00,0x78,0xcc,0xc0,0xc0,0xdc,0xcc,0xcc,0x78,0x00,0x00, - - 7, // 0x48 'H' - 0x00,0xcc,0xcc,0xcc,0xfc,0xcc,0xcc,0xcc,0xcc,0x00,0x00, - - 7, // 0x49 'I' - 0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00, - - 7, // 0x4a 'J' - 0x00,0x3c,0x18,0x18,0x18,0x18,0xd8,0xd8,0x70,0x00,0x00, - - 7, // 0x4b 'K' - 0x00,0xcc,0xcc,0xd8,0xf0,0xd8,0xcc,0xcc,0xcc,0x00,0x00, - - 7, // 0x4c 'L' - 0x00,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc4,0xfc,0x00,0x00, - - 7, // 0x4d 'M' - 0x00,0x84,0xcc,0xfc,0xb4,0xcc,0xcc,0xcc,0xcc,0x00,0x00, - - 7, // 0x4e 'N' - 0x00,0xcc,0xcc,0xec,0xfc,0xdc,0xcc,0xcc,0xcc,0x00,0x00, - - 7, // 0x4f 'O' - 0x00,0x78,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00, - - 7, // 0x50 'P' - 0x00,0xf8,0xcc,0xcc,0xcc,0xf8,0xc0,0xc0,0xc0,0x00,0x00, - - 7, // 0x51 'Q' - 0x00,0x78,0xcc,0xcc,0xcc,0xcc,0xdc,0x78,0x18,0x0c,0x00, - - 7, // 0x52 'R' - 0x00,0xf8,0xcc,0xcc,0xcc,0xf8,0xd8,0xcc,0xcc,0x00,0x00, - - 7, // 0x53 'S' - 0x00,0x78,0xcc,0xe0,0x70,0x38,0x1c,0xcc,0x78,0x00,0x00, - - 7, // 0x54 'T' - 0x00,0xfc,0xb4,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x00, - - 7, // 0x55 'U' - 0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00, - - 7, // 0x56 'V' - 0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x30,0x00,0x00, - - 7, // 0x57 'W' - 0x00,0xcc,0xcc,0xcc,0xcc,0xb4,0xfc,0xcc,0x84,0x00,0x00, - - 7, // 0x58 'X' - 0x00,0xcc,0xcc,0x78,0x30,0x78,0xcc,0xcc,0xcc,0x00,0x00, - - 7, // 0x59 'Y' - 0x00,0xcc,0xcc,0xcc,0x78,0x30,0x30,0x30,0x78,0x00,0x00, - - 7, // 0x5a 'Z' - 0x00,0xfc,0x8c,0x18,0x30,0x60,0xc0,0xc4,0xfc,0x00,0x00, - - 7, // 0x5b '[' - 0x00,0x78,0x60,0x60,0x60,0x60,0x60,0x60,0x78,0x00,0x00, - - 7, // 0x5c '\' - 0x00,0x60,0x60,0x30,0x30,0x18,0x18,0x0c,0x0c,0x00,0x00, - - 7, // 0x5d ']' - 0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x78,0x00,0x00, - - 7, // 0x5e '^' - 0x00,0x10,0x38,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00, - - 7, // 0x60 '`' - 0x00,0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x61 'a' - 0x00,0x00,0x00,0x70,0x18,0x78,0xd8,0xd8,0x6c,0x00,0x00, - - 7, // 0x62 'b' - 0x00,0x60,0x60,0x60,0x78,0x6c,0x6c,0x6c,0x78,0x00,0x00, - - 7, // 0x63 'c' - 0x00,0x00,0x00,0x78,0xcc,0xc0,0xc0,0xcc,0x78,0x00,0x00, - - 7, // 0x64 'd' - 0x00,0x18,0x18,0x18,0x78,0xd8,0xd8,0xd8,0x6c,0x00,0x00, - - 7, // 0x65 'e' - 0x00,0x00,0x00,0x78,0xcc,0xfc,0xc0,0xcc,0x78,0x00,0x00, - - 7, // 0x66 'f' - 0x00,0x18,0x34,0x30,0x78,0x30,0x30,0x30,0x78,0x00,0x00, - - 7, // 0x67 'g' - 0x00,0x00,0x00,0x6c,0xd8,0xd8,0xd8,0x78,0x18,0xd8,0x70, - - 7, // 0x68 'h' - 0x00,0xc0,0xc0,0xd8,0xec,0xcc,0xcc,0xcc,0xcc,0x00,0x00, - - 7, // 0x69 'i' - 0x00,0x30,0x00,0x70,0x30,0x30,0x30,0x30,0x78,0x00,0x00, - - 7, // 0x6a 'j' - 0x00,0x0c,0x00,0x1c,0x0c,0x0c,0x0c,0x0c,0x6c,0x6c,0x38, - - 7, // 0x6b 'k' - 0x00,0xc0,0xc0,0xcc,0xcc,0xd8,0xf0,0xd8,0xcc,0x00,0x00, - - 7, // 0x6c 'l' - 0x00,0x70,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00, - - 7, // 0x6d 'm' - 0x00,0x00,0x00,0xe8,0xfc,0xd4,0xd4,0xc4,0xc4,0x00,0x00, - - 7, // 0x6e 'n' - 0x00,0x00,0x00,0xd8,0x6c,0x6c,0x6c,0x6c,0x6c,0x00,0x00, - - 7, // 0x6f 'o' - 0x00,0x00,0x00,0x78,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00, - - 7, // 0x70 'p' - 0x00,0x00,0x00,0xf8,0xcc,0xcc,0xcc,0xf8,0xc0,0xc0,0xc0, - - 7, // 0x71 'q' - 0x00,0x00,0x00,0x7c,0xcc,0xcc,0xcc,0x7c,0x0c,0x0c,0x0c, - - 7, // 0x72 'r' - 0x00,0x00,0x00,0xd8,0xec,0xcc,0xc0,0xc0,0xc0,0x00,0x00, - - 7, // 0x73 's' - 0x00,0x00,0x00,0x78,0xcc,0x60,0x18,0xcc,0x78,0x00,0x00, - - 7, // 0x74 't' - 0x00,0x20,0x60,0x60,0xf0,0x60,0x60,0x68,0x30,0x00,0x00, - - 7, // 0x75 'u' - 0x00,0x00,0x00,0xd8,0xd8,0xd8,0xd8,0xd8,0x6c,0x00,0x00, - - 7, // 0x76 'v' - 0x00,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0x78,0x30,0x00,0x00, - - 7, // 0x77 'w' - 0x00,0x00,0x00,0xcc,0xcc,0xb4,0xfc,0xcc,0x84,0x00,0x00, - - 7, // 0x78 'x' - 0x00,0x00,0x00,0xcc,0x78,0x30,0x78,0xcc,0xcc,0x00,0x00, - - 7, // 0x79 'y' - 0x00,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0x7c,0x0c,0x18,0xf0, - - 7, // 0x7a 'z' - 0x00,0x00,0x00,0xfc,0x98,0x30,0x60,0xc4,0xfc,0x00,0x00, - - 7, // 0x7b '{' - 0x1c,0x30,0x30,0x30,0xe0,0x30,0x30,0x30,0x1c,0x00,0x00, - - 7, // 0x7c '|' - 0x30,0x30,0x30,0x30,0x00,0x30,0x30,0x30,0x30,0x00,0x00, - - 7, // 0x7d '}' - 0xe0,0x30,0x30,0x30,0x1c,0x30,0x30,0x30,0xe0,0x00,0x00, - - 7, // 0x7e '~' - 0x00,0x34,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x7f '' - 0x00,0x00,0x00,0x30,0x78,0xcc,0xcc,0xfc,0x00,0x00,0x00, - 0 - }; - - const int8u gse7x15[] = - { - 15, 0, 32, 128-32, - - 0x00,0x00,0x10,0x00,0x20,0x00,0x30,0x00,0x40,0x00,0x50,0x00,0x60,0x00,0x70,0x00,0x80,0x00, - 0x90,0x00,0xa0,0x00,0xb0,0x00,0xc0,0x00,0xd0,0x00,0xe0,0x00,0xf0,0x00,0x00,0x01,0x10,0x01, - 0x20,0x01,0x30,0x01,0x40,0x01,0x50,0x01,0x60,0x01,0x70,0x01,0x80,0x01,0x90,0x01,0xa0,0x01, - 0xb0,0x01,0xc0,0x01,0xd0,0x01,0xe0,0x01,0xf0,0x01,0x00,0x02,0x10,0x02,0x20,0x02,0x30,0x02, - 0x40,0x02,0x50,0x02,0x60,0x02,0x70,0x02,0x80,0x02,0x90,0x02,0xa0,0x02,0xb0,0x02,0xc0,0x02, - 0xd0,0x02,0xe0,0x02,0xf0,0x02,0x00,0x03,0x10,0x03,0x20,0x03,0x30,0x03,0x40,0x03,0x50,0x03, - 0x60,0x03,0x70,0x03,0x80,0x03,0x90,0x03,0xa0,0x03,0xb0,0x03,0xc0,0x03,0xd0,0x03,0xe0,0x03, - 0xf0,0x03,0x00,0x04,0x10,0x04,0x20,0x04,0x30,0x04,0x40,0x04,0x50,0x04,0x60,0x04,0x70,0x04, - 0x80,0x04,0x90,0x04,0xa0,0x04,0xb0,0x04,0xc0,0x04,0xd0,0x04,0xe0,0x04,0xf0,0x04,0x00,0x05, - 0x10,0x05,0x20,0x05,0x30,0x05,0x40,0x05,0x50,0x05,0x60,0x05,0x70,0x05,0x80,0x05,0x90,0x05, - 0xa0,0x05,0xb0,0x05,0xc0,0x05,0xd0,0x05,0xe0,0x05,0xf0,0x05, - - 7, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x21 '!' - 0x00,0x00,0x10,0x38,0x38,0x38,0x38,0x10,0x10,0x00,0x10,0x10,0x00,0x00,0x00, - - 7, // 0x22 '"' - 0x00,0x00,0x24,0x24,0x24,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x23 '#' - 0x00,0x00,0x48,0x48,0x48,0xfc,0x48,0x48,0xfc,0x48,0x48,0x48,0x00,0x00,0x00, - - 7, // 0x24 '$' - 0x00,0x00,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x54,0x38,0x10,0x00,0x00,0x00, - - 7, // 0x25 '%' - 0x00,0x00,0x44,0x44,0x08,0x08,0x10,0x10,0x20,0x20,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x26 '&' - 0x00,0x00,0x00,0x30,0x48,0x48,0x30,0x60,0x94,0x98,0x90,0x6c,0x00,0x00,0x00, - - 7, // 0x27 ''' - 0x00,0x00,0x20,0x20,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x28 '(' - 0x00,0x04,0x08,0x10,0x20,0x20,0x20,0x20,0x20,0x10,0x08,0x04,0x00,0x00,0x00, - - 7, // 0x29 ')' - 0x00,0x40,0x20,0x10,0x08,0x08,0x08,0x08,0x08,0x10,0x20,0x40,0x00,0x00,0x00, - - 7, // 0x2a '*' - 0x00,0x00,0x00,0x00,0x00,0x20,0xa8,0x70,0xa8,0x20,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x2b '+' - 0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x7c,0x10,0x10,0x10,0x00,0x00,0x00,0x00, - - 7, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x60,0x00, - - 7, // 0x2d '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00, - - 7, // 0x2f '/' - 0x00,0x00,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00,0x00,0x00, - - 7, // 0x30 '0' - 0x00,0x00,0x38,0x44,0x44,0x4c,0x54,0x64,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x31 '1' - 0x00,0x00,0x10,0x10,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x7c,0x00,0x00,0x00, - - 7, // 0x32 '2' - 0x00,0x00,0x38,0x44,0x44,0x04,0x08,0x10,0x20,0x40,0x44,0x7c,0x00,0x00,0x00, - - 7, // 0x33 '3' - 0x00,0x00,0x7c,0x44,0x08,0x10,0x38,0x04,0x04,0x04,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x34 '4' - 0x00,0x00,0x08,0x10,0x20,0x40,0x48,0x48,0x7c,0x08,0x08,0x1c,0x00,0x00,0x00, - - 7, // 0x35 '5' - 0x00,0x00,0x7c,0x40,0x40,0x40,0x78,0x04,0x04,0x04,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x36 '6' - 0x00,0x00,0x18,0x20,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x37 '7' - 0x00,0x00,0x7c,0x44,0x04,0x04,0x08,0x08,0x10,0x10,0x10,0x10,0x00,0x00,0x00, - - 7, // 0x38 '8' - 0x00,0x00,0x38,0x44,0x44,0x44,0x38,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x39 '9' - 0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x3c,0x04,0x04,0x08,0x30,0x00,0x00,0x00, - - 7, // 0x3a ':' - 0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00, - - 7, // 0x3b ';' - 0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x30,0x30,0x60,0x00,0x00, - - 7, // 0x3c '<' - 0x00,0x00,0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00,0x00,0x00, - - 7, // 0x3d '=' - 0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x3e '>' - 0x00,0x00,0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00,0x00,0x00, - - 7, // 0x3f '?' - 0x00,0x00,0x78,0x84,0x84,0x84,0x08,0x10,0x20,0x20,0x00,0x20,0x00,0x00,0x00, - - 7, // 0x40 '@' - 0x00,0x00,0x00,0x30,0x48,0x04,0x34,0x54,0x54,0x54,0x54,0x28,0x00,0x00,0x00, - - 7, // 0x41 'A' - 0x00,0x00,0x10,0x28,0x44,0x44,0x44,0x7c,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x42 'B' - 0x00,0x00,0x78,0x44,0x44,0x44,0x78,0x44,0x44,0x44,0x44,0x78,0x00,0x00,0x00, - - 7, // 0x43 'C' - 0x00,0x00,0x38,0x44,0x44,0x40,0x40,0x40,0x40,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x44 'D' - 0x00,0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x44,0x44,0x48,0x70,0x00,0x00,0x00, - - 7, // 0x45 'E' - 0x00,0x00,0x7c,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x40,0x7c,0x00,0x00,0x00, - - 7, // 0x46 'F' - 0x00,0x00,0x7c,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 7, // 0x47 'G' - 0x00,0x00,0x38,0x44,0x40,0x40,0x40,0x5c,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x48 'H' - 0x00,0x00,0x44,0x44,0x44,0x44,0x7c,0x44,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x49 'I' - 0x00,0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, - - 7, // 0x4a 'J' - 0x00,0x00,0x1c,0x08,0x08,0x08,0x08,0x08,0x08,0x48,0x48,0x30,0x00,0x00,0x00, - - 7, // 0x4b 'K' - 0x00,0x00,0x44,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x4c 'L' - 0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7c,0x00,0x00,0x00, - - 7, // 0x4d 'M' - 0x00,0x00,0x44,0x6c,0x54,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x4e 'N' - 0x00,0x00,0x44,0x44,0x44,0x64,0x54,0x4c,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x4f 'O' - 0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x50 'P' - 0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 7, // 0x51 'Q' - 0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00,0x00, - - 7, // 0x52 'R' - 0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x50,0x48,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x53 'S' - 0x00,0x00,0x38,0x44,0x44,0x40,0x38,0x04,0x04,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x54 'T' - 0x00,0x00,0x7c,0x54,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00, - - 7, // 0x55 'U' - 0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x56 'V' - 0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00,0x00, - - 7, // 0x57 'W' - 0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x54,0x6c,0x44,0x00,0x00,0x00, - - 7, // 0x58 'X' - 0x00,0x00,0x44,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x59 'Y' - 0x00,0x00,0x44,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, - - 7, // 0x5a 'Z' - 0x00,0x00,0x7c,0x04,0x04,0x08,0x10,0x20,0x40,0x40,0x40,0x7c,0x00,0x00,0x00, - - 7, // 0x5b '[' - 0x00,0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00,0x00, - - 7, // 0x5c '\' - 0x00,0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x00,0x00,0x00, - - 7, // 0x5d ']' - 0x00,0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x38,0x00,0x00, - - 7, // 0x5e '^' - 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00, - - 7, // 0x60 '`' - 0x00,0x20,0x20,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x38,0x44,0x04,0x3c,0x44,0x44,0x44,0x3a,0x00,0x00,0x00, - - 7, // 0x62 'b' - 0x00,0x00,0x40,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x00,0x00,0x00, - - 7, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x64 'd' - 0x00,0x00,0x04,0x04,0x04,0x3c,0x44,0x44,0x44,0x44,0x44,0x3a,0x00,0x00,0x00, - - 7, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x38,0x44,0x44,0x7c,0x40,0x40,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x66 'f' - 0x00,0x00,0x18,0x24,0x20,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00,0x00, - - 7, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x3a,0x44,0x44,0x44,0x44,0x44,0x3c,0x04,0x44,0x38,0x00, - - 7, // 0x68 'h' - 0x00,0x00,0x40,0x40,0x40,0x58,0x64,0x44,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x69 'i' - 0x00,0x00,0x10,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, - - 7, // 0x6a 'j' - 0x00,0x00,0x08,0x08,0x00,0x18,0x08,0x08,0x08,0x08,0x08,0x48,0x48,0x30,0x00, - - 7, // 0x6b 'k' - 0x00,0x00,0x40,0x40,0x44,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00,0x00, - - 7, // 0x6c 'l' - 0x00,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, - - 7, // 0x6d 'm' - 0x00,0x00,0x00,0x00,0xa8,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x00,0x00,0x00, - - 7, // 0x6e 'n' - 0x00,0x00,0x00,0x00,0xb8,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x6f 'o' - 0x00,0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00, - - 7, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x3c,0x44,0x44,0x44,0x44,0x44,0x3c,0x04,0x04,0x04,0x00, - - 7, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x58,0x64,0x44,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 7, // 0x73 's' - 0x00,0x00,0x00,0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x74 't' - 0x00,0x00,0x20,0x20,0x20,0x70,0x20,0x20,0x20,0x20,0x24,0x18,0x00,0x00,0x00, - - 7, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x3a,0x00,0x00,0x00, - - 7, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00,0x00, - - 7, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x54,0x54,0x6c,0x44,0x00,0x00,0x00, - - 7, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x3c,0x04,0x08,0x70,0x00, - - 7, // 0x7a 'z' - 0x00,0x00,0x00,0x00,0x7c,0x04,0x08,0x10,0x20,0x40,0x40,0x7c,0x00,0x00,0x00, - - 7, // 0x7b '{' - 0x00,0x0c,0x10,0x10,0x10,0x10,0x10,0x60,0x10,0x10,0x10,0x10,0x0c,0x00,0x00, - - 7, // 0x7c '|' - 0x00,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x00,0x00, - - 7, // 0x7d '}' - 0x00,0x60,0x10,0x10,0x10,0x10,0x10,0x0c,0x10,0x10,0x10,0x10,0x60,0x00,0x00, - - 7, // 0x7e '~' - 0x00,0x00,0x64,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x7f '' - 0x00,0x00,0x00,0x00,0x00,0x10,0x28,0x44,0x44,0x7c,0x00,0x00,0x00,0x00,0x00, - 0 - }; - - const int8u gse7x15_bold[] = - { - 15, 0, 32, 128-32, - - 0x00,0x00,0x10,0x00,0x20,0x00,0x30,0x00,0x40,0x00,0x50,0x00,0x60,0x00,0x70,0x00,0x80,0x00, - 0x90,0x00,0xa0,0x00,0xb0,0x00,0xc0,0x00,0xd0,0x00,0xe0,0x00,0xf0,0x00,0x00,0x01,0x10,0x01, - 0x20,0x01,0x30,0x01,0x40,0x01,0x50,0x01,0x60,0x01,0x70,0x01,0x80,0x01,0x90,0x01,0xa0,0x01, - 0xb0,0x01,0xc0,0x01,0xd0,0x01,0xe0,0x01,0xf0,0x01,0x00,0x02,0x10,0x02,0x20,0x02,0x30,0x02, - 0x40,0x02,0x50,0x02,0x60,0x02,0x70,0x02,0x80,0x02,0x90,0x02,0xa0,0x02,0xb0,0x02,0xc0,0x02, - 0xd0,0x02,0xe0,0x02,0xf0,0x02,0x00,0x03,0x10,0x03,0x20,0x03,0x30,0x03,0x40,0x03,0x50,0x03, - 0x60,0x03,0x70,0x03,0x80,0x03,0x90,0x03,0xa0,0x03,0xb0,0x03,0xc0,0x03,0xd0,0x03,0xe0,0x03, - 0xf0,0x03,0x00,0x04,0x10,0x04,0x20,0x04,0x30,0x04,0x40,0x04,0x50,0x04,0x60,0x04,0x70,0x04, - 0x80,0x04,0x90,0x04,0xa0,0x04,0xb0,0x04,0xc0,0x04,0xd0,0x04,0xe0,0x04,0xf0,0x04,0x00,0x05, - 0x10,0x05,0x20,0x05,0x30,0x05,0x40,0x05,0x50,0x05,0x60,0x05,0x70,0x05,0x80,0x05,0x90,0x05, - 0xa0,0x05,0xb0,0x05,0xc0,0x05,0xd0,0x05,0xe0,0x05,0xf0,0x05, - - 7, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x21 '!' - 0x00,0x00,0x00,0x30,0x78,0x78,0x78,0x30,0x30,0x00,0x30,0x30,0x00,0x00,0x00, - - 7, // 0x22 '"' - 0x00,0x00,0x6c,0x6c,0x6c,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x23 '#' - 0x00,0x00,0x48,0x48,0x48,0xfc,0x48,0x48,0xfc,0x48,0x48,0x48,0x00,0x00,0x00, - - 7, // 0x24 '$' - 0x00,0x30,0x30,0x78,0xcc,0xe0,0x70,0x38,0x1c,0xcc,0x78,0x30,0x30,0x00,0x00, - - 7, // 0x25 '%' - 0x00,0x00,0x00,0x64,0x6c,0x08,0x18,0x10,0x30,0x20,0x6c,0x4c,0x00,0x00,0x00, - - 7, // 0x26 '&' - 0x00,0x00,0x00,0x30,0x58,0x58,0x30,0x74,0xdc,0xd8,0xd8,0x6c,0x00,0x00,0x00, - - 7, // 0x27 ''' - 0x00,0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x28 '(' - 0x00,0x0c,0x18,0x30,0x60,0x60,0x60,0x60,0x60,0x30,0x18,0x0c,0x00,0x00,0x00, - - 7, // 0x29 ')' - 0x00,0xc0,0x60,0x30,0x18,0x18,0x18,0x18,0x18,0x30,0x60,0xc0,0x00,0x00,0x00, - - 7, // 0x2a '*' - 0x00,0x00,0x00,0x00,0x00,0x20,0xa8,0x70,0xa8,0x20,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x2b '+' - 0x00,0x00,0x00,0x00,0x00,0x30,0x30,0xfc,0x30,0x30,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x60,0x00, - - 7, // 0x2d '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00, - - 7, // 0x2f '/' - 0x00,0x00,0x0c,0x0c,0x18,0x18,0x30,0x30,0x60,0x60,0xc0,0xc0,0x00,0x00,0x00, - - 7, // 0x30 '0' - 0x00,0x00,0x78,0xcc,0xcc,0xcc,0xdc,0xec,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00, - - 7, // 0x31 '1' - 0x00,0x00,0x30,0x30,0x70,0xf0,0x30,0x30,0x30,0x30,0x30,0xfc,0x00,0x00,0x00, - - 7, // 0x32 '2' - 0x00,0x00,0x78,0xcc,0xcc,0x0c,0x18,0x30,0x60,0xc0,0xcc,0xfc,0x00,0x00,0x00, - - 7, // 0x33 '3' - 0x00,0x00,0xfc,0x8c,0x18,0x30,0x78,0x0c,0x0c,0x0c,0xcc,0x78,0x00,0x00,0x00, - - 7, // 0x34 '4' - 0x00,0x00,0x18,0x30,0x60,0xc8,0xd8,0xd8,0xfc,0x18,0x18,0x3c,0x00,0x00,0x00, - - 7, // 0x35 '5' - 0x00,0x00,0xfc,0xc0,0xc0,0xc0,0xf8,0x0c,0x0c,0x0c,0xcc,0x78,0x00,0x00,0x00, - - 7, // 0x36 '6' - 0x00,0x00,0x38,0x60,0xc0,0xc0,0xf8,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00, - - 7, // 0x37 '7' - 0x00,0x00,0xfc,0x8c,0x0c,0x0c,0x18,0x18,0x30,0x30,0x30,0x30,0x00,0x00,0x00, - - 7, // 0x38 '8' - 0x00,0x00,0x78,0xcc,0xcc,0xcc,0x78,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00, - - 7, // 0x39 '9' - 0x00,0x00,0x78,0xcc,0xcc,0xcc,0xcc,0x7c,0x0c,0x0c,0x18,0x70,0x00,0x00,0x00, - - 7, // 0x3a ':' - 0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00, - - 7, // 0x3b ';' - 0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x60,0x00, - - 7, // 0x3c '<' - 0x00,0x00,0x00,0x0c,0x18,0x30,0x60,0xc0,0x60,0x30,0x18,0x0c,0x00,0x00,0x00, - - 7, // 0x3d '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x3e '>' - 0x00,0x00,0x00,0xc0,0x60,0x30,0x18,0x0c,0x18,0x30,0x60,0xc0,0x00,0x00,0x00, - - 7, // 0x3f '?' - 0x00,0x00,0x78,0xcc,0xcc,0x18,0x30,0x30,0x30,0x00,0x30,0x30,0x00,0x00,0x00, - - 7, // 0x40 '@' - 0x00,0x00,0x00,0x70,0x88,0x04,0x74,0xb4,0xb4,0xb4,0xb4,0x68,0x00,0x00,0x00, - - 7, // 0x41 'A' - 0x00,0x00,0x30,0x78,0xcc,0xcc,0xcc,0xfc,0xcc,0xcc,0xcc,0xcc,0x00,0x00,0x00, - - 7, // 0x42 'B' - 0x00,0x00,0xf8,0xcc,0xcc,0xcc,0xf8,0xcc,0xcc,0xcc,0xcc,0xf8,0x00,0x00,0x00, - - 7, // 0x43 'C' - 0x00,0x00,0x78,0xcc,0xc4,0xc0,0xc0,0xc0,0xc0,0xc4,0xcc,0x78,0x00,0x00,0x00, - - 7, // 0x44 'D' - 0x00,0x00,0xf0,0xd8,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xd8,0xf0,0x00,0x00,0x00, - - 7, // 0x45 'E' - 0x00,0x00,0xfc,0xc4,0xc0,0xd0,0xf0,0xd0,0xc0,0xc0,0xc4,0xfc,0x00,0x00,0x00, - - 7, // 0x46 'F' - 0x00,0x00,0xfc,0xc4,0xc0,0xd0,0xf0,0xd0,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00, - - 7, // 0x47 'G' - 0x00,0x00,0x78,0xcc,0xc0,0xc0,0xc0,0xdc,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00, - - 7, // 0x48 'H' - 0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xfc,0xcc,0xcc,0xcc,0xcc,0xcc,0x00,0x00,0x00, - - 7, // 0x49 'I' - 0x00,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00, - - 7, // 0x4a 'J' - 0x00,0x00,0x3c,0x18,0x18,0x18,0x18,0x18,0x18,0xd8,0xd8,0x70,0x00,0x00,0x00, - - 7, // 0x4b 'K' - 0x00,0x00,0xcc,0xcc,0xd8,0xd8,0xf0,0xd8,0xd8,0xcc,0xcc,0xcc,0x00,0x00,0x00, - - 7, // 0x4c 'L' - 0x00,0x00,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc4,0xfc,0x00,0x00,0x00, - - 7, // 0x4d 'M' - 0x00,0x00,0x84,0xcc,0xfc,0xb4,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x00,0x00,0x00, - - 7, // 0x4e 'N' - 0x00,0x00,0xcc,0xcc,0xcc,0xec,0xfc,0xdc,0xcc,0xcc,0xcc,0xcc,0x00,0x00,0x00, - - 7, // 0x4f 'O' - 0x00,0x00,0x78,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00, - - 7, // 0x50 'P' - 0x00,0x00,0xf8,0xcc,0xcc,0xcc,0xcc,0xf8,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00, - - 7, // 0x51 'Q' - 0x00,0x00,0x78,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xdc,0x78,0x18,0x0c,0x00,0x00, - - 7, // 0x52 'R' - 0x00,0x00,0xf8,0xcc,0xcc,0xcc,0xcc,0xf8,0xd8,0xcc,0xcc,0xcc,0x00,0x00,0x00, - - 7, // 0x53 'S' - 0x00,0x00,0x78,0xcc,0xcc,0xe0,0x70,0x38,0x1c,0xcc,0xcc,0x78,0x00,0x00,0x00, - - 7, // 0x54 'T' - 0x00,0x00,0xfc,0xb4,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x00,0x00, - - 7, // 0x55 'U' - 0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00, - - 7, // 0x56 'V' - 0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x30,0x00,0x00,0x00, - - 7, // 0x57 'W' - 0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xb4,0xfc,0xcc,0x84,0x00,0x00,0x00, - - 7, // 0x58 'X' - 0x00,0x00,0xcc,0xcc,0xcc,0x78,0x30,0x78,0xcc,0xcc,0xcc,0xcc,0x00,0x00,0x00, - - 7, // 0x59 'Y' - 0x00,0x00,0xcc,0xcc,0xcc,0xcc,0x78,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00, - - 7, // 0x5a 'Z' - 0x00,0x00,0xfc,0x8c,0x0c,0x18,0x30,0x60,0xc0,0xc0,0xc4,0xfc,0x00,0x00,0x00, - - 7, // 0x5b '[' - 0x00,0x78,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x78,0x00,0x00, - - 7, // 0x5c '\' - 0x00,0x00,0xc0,0xc0,0x60,0x60,0x30,0x30,0x18,0x18,0x0c,0x0c,0x00,0x00,0x00, - - 7, // 0x5d ']' - 0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x78,0x00,0x00, - - 7, // 0x5e '^' - 0x00,0x10,0x38,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00, - - 7, // 0x60 '`' - 0x00,0x30,0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x70,0xd8,0x18,0x78,0xd8,0xd8,0xd8,0x6c,0x00,0x00,0x00, - - 7, // 0x62 'b' - 0x00,0x00,0x60,0x60,0x60,0x78,0x6c,0x6c,0x6c,0x6c,0x6c,0x78,0x00,0x00,0x00, - - 7, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x78,0xcc,0xc0,0xc0,0xc0,0xc0,0xcc,0x78,0x00,0x00,0x00, - - 7, // 0x64 'd' - 0x00,0x00,0x18,0x18,0x18,0x78,0xd8,0xd8,0xd8,0xd8,0xd8,0x6c,0x00,0x00,0x00, - - 7, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x78,0xcc,0xcc,0xfc,0xc0,0xc0,0xcc,0x78,0x00,0x00,0x00, - - 7, // 0x66 'f' - 0x00,0x00,0x30,0x68,0x60,0x60,0xf0,0x60,0x60,0x60,0x60,0xf0,0x00,0x00,0x00, - - 7, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x6c,0xd8,0xd8,0xd8,0xd8,0xd8,0x78,0x18,0xd8,0x70,0x00, - - 7, // 0x68 'h' - 0x00,0x00,0xc0,0xc0,0xc0,0xd8,0xec,0xcc,0xcc,0xcc,0xcc,0xcc,0x00,0x00,0x00, - - 7, // 0x69 'i' - 0x00,0x00,0x30,0x30,0x00,0x70,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00, - - 7, // 0x6a 'j' - 0x00,0x00,0x18,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0xd8,0xd8,0x70,0x00, - - 7, // 0x6b 'k' - 0x00,0x00,0xc0,0xc0,0xcc,0xcc,0xcc,0xd8,0xf0,0xd8,0xcc,0xcc,0x00,0x00,0x00, - - 7, // 0x6c 'l' - 0x00,0x00,0x70,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00, - - 7, // 0x6d 'm' - 0x00,0x00,0x00,0x00,0xe8,0xfc,0xd4,0xd4,0xd4,0xc4,0xc4,0xc4,0x00,0x00,0x00, - - 7, // 0x6e 'n' - 0x00,0x00,0x00,0x00,0xd8,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x00,0x00,0x00, - - 7, // 0x6f 'o' - 0x00,0x00,0x00,0x00,0x78,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00, - - 7, // 0x70 'p' - 0x00,0x00,0x00,0x00,0xf8,0xcc,0xcc,0xcc,0xcc,0xcc,0xf8,0xc0,0xc0,0xc0,0x00, - - 7, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x7c,0xcc,0xcc,0xcc,0xcc,0xcc,0x7c,0x0c,0x0c,0x0c,0x00, - - 7, // 0x72 'r' - 0x00,0x00,0x00,0x00,0xd8,0xec,0xcc,0xc0,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00, - - 7, // 0x73 's' - 0x00,0x00,0x00,0x00,0x78,0xcc,0xe0,0x70,0x38,0x1c,0xcc,0x78,0x00,0x00,0x00, - - 7, // 0x74 't' - 0x00,0x00,0x20,0x60,0x60,0xf0,0x60,0x60,0x60,0x60,0x6c,0x38,0x00,0x00,0x00, - - 7, // 0x75 'u' - 0x00,0x00,0x00,0x00,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0xd8,0x6c,0x00,0x00,0x00, - - 7, // 0x76 'v' - 0x00,0x00,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,0x30,0x00,0x00,0x00, - - 7, // 0x77 'w' - 0x00,0x00,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xb4,0xfc,0xcc,0x84,0x00,0x00,0x00, - - 7, // 0x78 'x' - 0x00,0x00,0x00,0x00,0xcc,0xcc,0x78,0x30,0x78,0xcc,0xcc,0xcc,0x00,0x00,0x00, - - 7, // 0x79 'y' - 0x00,0x00,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x7c,0x0c,0x18,0xf0,0x00, - - 7, // 0x7a 'z' - 0x00,0x00,0x00,0x00,0xfc,0x8c,0x18,0x30,0x60,0xc0,0xc4,0xfc,0x00,0x00,0x00, - - 7, // 0x7b '{' - 0x00,0x1c,0x30,0x30,0x30,0x30,0x30,0xe0,0x30,0x30,0x30,0x30,0x1c,0x00,0x00, - - 7, // 0x7c '|' - 0x00,0x30,0x30,0x30,0x30,0x30,0x00,0x00,0x30,0x30,0x30,0x30,0x30,0x00,0x00, - - 7, // 0x7d '}' - 0x00,0xe0,0x30,0x30,0x30,0x30,0x30,0x1c,0x30,0x30,0x30,0x30,0xe0,0x00,0x00, - - 7, // 0x7e '~' - 0x00,0x00,0x34,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x7f '' - 0x00,0x00,0x00,0x00,0x00,0x30,0x78,0xcc,0xcc,0xfc,0x00,0x00,0x00,0x00,0x00, - 0 - }; - - const int8u gse8x16[] = - { - 16, 0, 32, 128-32, - - 0x00,0x00,0x11,0x00,0x22,0x00,0x33,0x00,0x44,0x00,0x55,0x00,0x66,0x00,0x77,0x00,0x88,0x00, - 0x99,0x00,0xaa,0x00,0xbb,0x00,0xcc,0x00,0xdd,0x00,0xee,0x00,0xff,0x00,0x10,0x01,0x21,0x01, - 0x32,0x01,0x43,0x01,0x54,0x01,0x65,0x01,0x76,0x01,0x87,0x01,0x98,0x01,0xa9,0x01,0xba,0x01, - 0xcb,0x01,0xdc,0x01,0xed,0x01,0xfe,0x01,0x0f,0x02,0x20,0x02,0x31,0x02,0x42,0x02,0x53,0x02, - 0x64,0x02,0x75,0x02,0x86,0x02,0x97,0x02,0xa8,0x02,0xb9,0x02,0xca,0x02,0xdb,0x02,0xec,0x02, - 0xfd,0x02,0x0e,0x03,0x1f,0x03,0x30,0x03,0x41,0x03,0x52,0x03,0x63,0x03,0x74,0x03,0x85,0x03, - 0x96,0x03,0xa7,0x03,0xb8,0x03,0xc9,0x03,0xda,0x03,0xeb,0x03,0xfc,0x03,0x0d,0x04,0x1e,0x04, - 0x2f,0x04,0x40,0x04,0x51,0x04,0x62,0x04,0x73,0x04,0x84,0x04,0x95,0x04,0xa6,0x04,0xb7,0x04, - 0xc8,0x04,0xd9,0x04,0xea,0x04,0xfb,0x04,0x0c,0x05,0x1d,0x05,0x2e,0x05,0x3f,0x05,0x50,0x05, - 0x61,0x05,0x72,0x05,0x83,0x05,0x94,0x05,0xa5,0x05,0xb6,0x05,0xc7,0x05,0xd8,0x05,0xe9,0x05, - 0xfa,0x05,0x0b,0x06,0x1c,0x06,0x2d,0x06,0x3e,0x06,0x4f,0x06, - - 8, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x21 '!' - 0x00,0x00,0x10,0x38,0x38,0x38,0x38,0x10,0x10,0x00,0x10,0x10,0x00,0x00,0x00,0x00, - - 8, // 0x22 '"' - 0x00,0x24,0x24,0x24,0x24,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x23 '#' - 0x00,0x00,0x24,0x24,0x24,0x7e,0x24,0x24,0x7e,0x24,0x24,0x24,0x00,0x00,0x00,0x00, - - 8, // 0x24 '$' - 0x00,0x14,0x14,0x3e,0x55,0x54,0x54,0x3e,0x15,0x15,0x55,0x3e,0x14,0x14,0x00,0x00, - - 8, // 0x25 '%' - 0x00,0x00,0x32,0x56,0x6c,0x04,0x08,0x08,0x10,0x13,0x25,0x26,0x00,0x00,0x00,0x00, - - 8, // 0x26 '&' - 0x00,0x00,0x18,0x24,0x24,0x24,0x18,0x28,0x45,0x46,0x44,0x3b,0x00,0x00,0x00,0x00, - - 8, // 0x27 ''' - 0x00,0x00,0x08,0x08,0x08,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x28 '(' - 0x00,0x04,0x08,0x10,0x10,0x20,0x20,0x20,0x20,0x10,0x10,0x08,0x04,0x00,0x00,0x00, - - 8, // 0x29 ')' - 0x00,0x10,0x08,0x04,0x04,0x02,0x02,0x02,0x02,0x04,0x04,0x08,0x10,0x00,0x00,0x00, - - 8, // 0x2a '*' - 0x00,0x00,0x00,0x00,0x66,0x24,0x18,0xff,0x18,0x24,0x66,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x2b '+' - 0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x7f,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x20,0x00, - - 8, // 0x2d '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00, - - 8, // 0x2f '/' - 0x00,0x02,0x02,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00,0x00,0x00, - - 8, // 0x30 '0' - 0x00,0x00,0x3c,0x42,0x42,0x46,0x4a,0x52,0x62,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x31 '1' - 0x00,0x00,0x08,0x08,0x18,0x38,0x08,0x08,0x08,0x08,0x08,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x32 '2' - 0x00,0x00,0x3c,0x42,0x42,0x02,0x04,0x08,0x10,0x20,0x42,0x7e,0x00,0x00,0x00,0x00, - - 8, // 0x33 '3' - 0x00,0x00,0x7e,0x42,0x04,0x08,0x1c,0x02,0x02,0x02,0x42,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x34 '4' - 0x00,0x00,0x04,0x08,0x10,0x24,0x44,0x44,0x7e,0x04,0x04,0x0e,0x00,0x00,0x00,0x00, - - 8, // 0x35 '5' - 0x00,0x00,0x7e,0x42,0x40,0x40,0x7c,0x02,0x02,0x02,0x42,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x36 '6' - 0x00,0x00,0x1c,0x20,0x40,0x40,0x7c,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x37 '7' - 0x00,0x00,0x7e,0x42,0x42,0x02,0x04,0x08,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00, - - 8, // 0x38 '8' - 0x00,0x00,0x3c,0x42,0x42,0x42,0x3c,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x39 '9' - 0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x3e,0x02,0x02,0x04,0x38,0x00,0x00,0x00,0x00, - - 8, // 0x3a ':' - 0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x3b ';' - 0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x60,0x40,0x00, - - 8, // 0x3c '<' - 0x00,0x00,0x00,0x02,0x04,0x08,0x10,0x20,0x10,0x08,0x04,0x02,0x00,0x00,0x00,0x00, - - 8, // 0x3d '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x3e '>' - 0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x04,0x08,0x10,0x20,0x00,0x00,0x00,0x00, - - 8, // 0x3f '?' - 0x00,0x00,0x3c,0x42,0x42,0x42,0x04,0x08,0x08,0x00,0x08,0x08,0x00,0x00,0x00,0x00, - - 8, // 0x40 '@' - 0x00,0x00,0x3c,0x42,0x01,0x39,0x49,0x49,0x49,0x49,0x49,0x36,0x00,0x00,0x00,0x00, - - 8, // 0x41 'A' - 0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x7e,0x42,0x42,0x42,0x42,0x00,0x00,0x00,0x00, - - 8, // 0x42 'B' - 0x00,0x00,0x7c,0x22,0x22,0x22,0x3c,0x22,0x22,0x22,0x22,0x7c,0x00,0x00,0x00,0x00, - - 8, // 0x43 'C' - 0x00,0x00,0x3c,0x42,0x42,0x40,0x40,0x40,0x40,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x44 'D' - 0x00,0x00,0x7c,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x7c,0x00,0x00,0x00,0x00, - - 8, // 0x45 'E' - 0x00,0x00,0x7e,0x22,0x20,0x28,0x38,0x28,0x20,0x20,0x22,0x7e,0x00,0x00,0x00,0x00, - - 8, // 0x46 'F' - 0x00,0x00,0x7e,0x22,0x20,0x28,0x38,0x28,0x20,0x20,0x20,0x70,0x00,0x00,0x00,0x00, - - 8, // 0x47 'G' - 0x00,0x00,0x3c,0x42,0x42,0x40,0x40,0x4e,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x48 'H' - 0x00,0x00,0x42,0x42,0x42,0x42,0x7e,0x42,0x42,0x42,0x42,0x42,0x00,0x00,0x00,0x00, - - 8, // 0x49 'I' - 0x00,0x00,0x1c,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x1c,0x00,0x00,0x00,0x00, - - 8, // 0x4a 'J' - 0x00,0x00,0x0e,0x04,0x04,0x04,0x04,0x04,0x04,0x44,0x44,0x38,0x00,0x00,0x00,0x00, - - 8, // 0x4b 'K' - 0x00,0x00,0x62,0x22,0x24,0x28,0x30,0x28,0x24,0x22,0x22,0x62,0x00,0x00,0x00,0x00, - - 8, // 0x4c 'L' - 0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x7e,0x00,0x00,0x00,0x00, - - 8, // 0x4d 'M' - 0x00,0x00,0x41,0x63,0x55,0x49,0x41,0x41,0x41,0x41,0x41,0x41,0x00,0x00,0x00,0x00, - - 8, // 0x4e 'N' - 0x00,0x00,0x42,0x42,0x62,0x52,0x4a,0x46,0x42,0x42,0x42,0x42,0x00,0x00,0x00,0x00, - - 8, // 0x4f 'O' - 0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x50 'P' - 0x00,0x00,0x7c,0x22,0x22,0x22,0x22,0x3c,0x20,0x20,0x20,0x70,0x00,0x00,0x00,0x00, - - 8, // 0x51 'Q' - 0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x42,0x42,0x4a,0x44,0x3a,0x02,0x00,0x00,0x00, - - 8, // 0x52 'R' - 0x00,0x00,0x7c,0x22,0x22,0x22,0x22,0x3c,0x28,0x24,0x22,0x62,0x00,0x00,0x00,0x00, - - 8, // 0x53 'S' - 0x00,0x00,0x3c,0x42,0x42,0x40,0x30,0x0c,0x02,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x54 'T' - 0x00,0x00,0x7f,0x49,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x1c,0x00,0x00,0x00,0x00, - - 8, // 0x55 'U' - 0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x56 'V' - 0x00,0x00,0x41,0x41,0x41,0x41,0x22,0x22,0x14,0x14,0x08,0x08,0x00,0x00,0x00,0x00, - - 8, // 0x57 'W' - 0x00,0x00,0x41,0x41,0x41,0x41,0x41,0x49,0x49,0x55,0x63,0x41,0x00,0x00,0x00,0x00, - - 8, // 0x58 'X' - 0x00,0x00,0x42,0x42,0x42,0x24,0x18,0x18,0x24,0x42,0x42,0x42,0x00,0x00,0x00,0x00, - - 8, // 0x59 'Y' - 0x00,0x00,0x22,0x22,0x22,0x22,0x14,0x08,0x08,0x08,0x08,0x1c,0x00,0x00,0x00,0x00, - - 8, // 0x5a 'Z' - 0x00,0x00,0x7e,0x42,0x02,0x04,0x08,0x10,0x20,0x40,0x42,0x7e,0x00,0x00,0x00,0x00, - - 8, // 0x5b '[' - 0x00,0x1e,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1e,0x00,0x00,0x00, - - 8, // 0x5c '\' - 0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x02,0x02,0x00,0x00,0x00, - - 8, // 0x5d ']' - 0x00,0x3c,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x3c,0x00,0x00,0x00, - - 8, // 0x5e '^' - 0x00,0x00,0x08,0x14,0x22,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00, - - 8, // 0x60 '`' - 0x00,0x00,0x08,0x08,0x08,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x04,0x3c,0x44,0x44,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x62 'b' - 0x00,0x00,0x60,0x20,0x20,0x38,0x24,0x22,0x22,0x22,0x22,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x3c,0x42,0x40,0x40,0x40,0x42,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x64 'd' - 0x00,0x00,0x0c,0x04,0x04,0x1c,0x24,0x44,0x44,0x44,0x44,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x3c,0x42,0x42,0x7e,0x40,0x42,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x66 'f' - 0x00,0x00,0x0c,0x12,0x10,0x10,0x38,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00,0x00, - - 8, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x3e,0x44,0x44,0x44,0x44,0x44,0x3c,0x04,0x44,0x38,0x00, - - 8, // 0x68 'h' - 0x00,0x00,0x60,0x20,0x20,0x2c,0x32,0x22,0x22,0x22,0x22,0x62,0x00,0x00,0x00,0x00, - - 8, // 0x69 'i' - 0x00,0x00,0x08,0x08,0x00,0x18,0x08,0x08,0x08,0x08,0x08,0x1c,0x00,0x00,0x00,0x00, - - 8, // 0x6a 'j' - 0x00,0x00,0x04,0x04,0x00,0x0c,0x04,0x04,0x04,0x04,0x04,0x44,0x44,0x38,0x00,0x00, - - 8, // 0x6b 'k' - 0x00,0x00,0x60,0x20,0x20,0x22,0x24,0x28,0x38,0x24,0x22,0x62,0x00,0x00,0x00,0x00, - - 8, // 0x6c 'l' - 0x00,0x00,0x18,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x1c,0x00,0x00,0x00,0x00, - - 8, // 0x6d 'm' - 0x00,0x00,0x00,0x00,0x00,0x76,0x49,0x49,0x49,0x49,0x41,0x41,0x00,0x00,0x00,0x00, - - 8, // 0x6e 'n' - 0x00,0x00,0x00,0x00,0x00,0x5c,0x22,0x22,0x22,0x22,0x22,0x22,0x00,0x00,0x00,0x00, - - 8, // 0x6f 'o' - 0x00,0x00,0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x7c,0x22,0x22,0x22,0x22,0x22,0x3c,0x20,0x20,0x70,0x00, - - 8, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x3e,0x44,0x44,0x44,0x44,0x44,0x3c,0x04,0x04,0x0e,0x00, - - 8, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x7c,0x22,0x22,0x20,0x20,0x20,0x70,0x00,0x00,0x00,0x00, - - 8, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x3c,0x42,0x40,0x3c,0x02,0x42,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x74 't' - 0x00,0x00,0x10,0x10,0x10,0x7c,0x10,0x10,0x10,0x10,0x12,0x0c,0x00,0x00,0x00,0x00, - - 8, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x41,0x41,0x41,0x41,0x22,0x14,0x08,0x00,0x00,0x00,0x00, - - 8, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x41,0x41,0x41,0x49,0x49,0x55,0x22,0x00,0x00,0x00,0x00, - - 8, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x00,0x00,0x00,0x00, - - 8, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x3e,0x02,0x04,0x78,0x00, - - 8, // 0x7a 'z' - 0x00,0x00,0x00,0x00,0x00,0x7e,0x44,0x08,0x10,0x20,0x42,0x7e,0x00,0x00,0x00,0x00, - - 8, // 0x7b '{' - 0x00,0x06,0x08,0x08,0x08,0x08,0x08,0x30,0x08,0x08,0x08,0x08,0x08,0x06,0x00,0x00, - - 8, // 0x7c '|' - 0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00, - - 8, // 0x7d '}' - 0x00,0x30,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x30,0x00,0x00, - - 8, // 0x7e '~' - 0x00,0x00,0x39,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x7f '' - 0x00,0x00,0x00,0x00,0x00,0x08,0x14,0x22,0x41,0x41,0x7f,0x00,0x00,0x00,0x00,0x00, - 0 - }; - - const int8u gse8x16_bold[] = - { - 16, 0, 32, 128-32, - - 0x00,0x00,0x11,0x00,0x22,0x00,0x33,0x00,0x44,0x00,0x55,0x00,0x66,0x00,0x77,0x00,0x88,0x00, - 0x99,0x00,0xaa,0x00,0xbb,0x00,0xcc,0x00,0xdd,0x00,0xee,0x00,0xff,0x00,0x10,0x01,0x21,0x01, - 0x32,0x01,0x43,0x01,0x54,0x01,0x65,0x01,0x76,0x01,0x87,0x01,0x98,0x01,0xa9,0x01,0xba,0x01, - 0xcb,0x01,0xdc,0x01,0xed,0x01,0xfe,0x01,0x0f,0x02,0x20,0x02,0x31,0x02,0x42,0x02,0x53,0x02, - 0x64,0x02,0x75,0x02,0x86,0x02,0x97,0x02,0xa8,0x02,0xb9,0x02,0xca,0x02,0xdb,0x02,0xec,0x02, - 0xfd,0x02,0x0e,0x03,0x1f,0x03,0x30,0x03,0x41,0x03,0x52,0x03,0x63,0x03,0x74,0x03,0x85,0x03, - 0x96,0x03,0xa7,0x03,0xb8,0x03,0xc9,0x03,0xda,0x03,0xeb,0x03,0xfc,0x03,0x0d,0x04,0x1e,0x04, - 0x2f,0x04,0x40,0x04,0x51,0x04,0x62,0x04,0x73,0x04,0x84,0x04,0x95,0x04,0xa6,0x04,0xb7,0x04, - 0xc8,0x04,0xd9,0x04,0xea,0x04,0xfb,0x04,0x0c,0x05,0x1d,0x05,0x2e,0x05,0x3f,0x05,0x50,0x05, - 0x61,0x05,0x72,0x05,0x83,0x05,0x94,0x05,0xa5,0x05,0xb6,0x05,0xc7,0x05,0xd8,0x05,0xe9,0x05, - 0xfa,0x05,0x0b,0x06,0x1c,0x06,0x2d,0x06,0x3e,0x06,0x4f,0x06, - - 8, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x21 '!' - 0x00,0x00,0x18,0x3c,0x3c,0x3c,0x3c,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00, - - 8, // 0x22 '"' - 0x00,0x66,0x66,0x66,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x23 '#' - 0x00,0x00,0x66,0x66,0x66,0xff,0x66,0x66,0xff,0x66,0x66,0x66,0x00,0x00,0x00,0x00, - - 8, // 0x24 '$' - 0x00,0x08,0x08,0x3e,0x6b,0x6b,0x68,0x3e,0x0b,0x6b,0x6b,0x3e,0x08,0x08,0x00,0x00, - - 8, // 0x25 '%' - 0x00,0x00,0x66,0xbe,0xcc,0x0c,0x18,0x18,0x30,0x33,0x65,0x66,0x00,0x00,0x00,0x00, - - 8, // 0x26 '&' - 0x00,0x00,0x1c,0x36,0x36,0x36,0x1c,0x3b,0x6e,0x66,0x66,0x3b,0x00,0x00,0x00,0x00, - - 8, // 0x27 ''' - 0x00,0x00,0x18,0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x28 '(' - 0x00,0x06,0x0c,0x18,0x18,0x30,0x30,0x30,0x30,0x18,0x18,0x0c,0x06,0x00,0x00,0x00, - - 8, // 0x29 ')' - 0x00,0x30,0x18,0x0c,0x0c,0x06,0x06,0x06,0x06,0x0c,0x0c,0x18,0x30,0x00,0x00,0x00, - - 8, // 0x2a '*' - 0x00,0x00,0x00,0x00,0x66,0x24,0x18,0xff,0x18,0x24,0x66,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x2b '+' - 0x00,0x00,0x00,0x00,0x18,0x18,0x18,0xff,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x2c ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x20,0x00, - - 8, // 0x2d '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x2e '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00, - - 8, // 0x2f '/' - 0x00,0x03,0x03,0x06,0x06,0x0c,0x0c,0x18,0x18,0x30,0x30,0x60,0x60,0x00,0x00,0x00, - - 8, // 0x30 '0' - 0x00,0x00,0x3e,0x63,0x63,0x67,0x6b,0x73,0x63,0x63,0x63,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x31 '1' - 0x00,0x00,0x0c,0x0c,0x1c,0x3c,0x0c,0x0c,0x0c,0x0c,0x0c,0x3f,0x00,0x00,0x00,0x00, - - 8, // 0x32 '2' - 0x00,0x00,0x3e,0x63,0x63,0x03,0x06,0x0c,0x18,0x30,0x61,0x7f,0x00,0x00,0x00,0x00, - - 8, // 0x33 '3' - 0x00,0x00,0x7f,0x43,0x06,0x0c,0x1e,0x03,0x03,0x03,0x63,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x34 '4' - 0x00,0x00,0x06,0x0c,0x18,0x32,0x66,0x66,0x7f,0x06,0x06,0x0f,0x00,0x00,0x00,0x00, - - 8, // 0x35 '5' - 0x00,0x00,0x7f,0x61,0x60,0x60,0x7e,0x03,0x03,0x03,0x63,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x36 '6' - 0x00,0x00,0x1e,0x30,0x60,0x60,0x7e,0x63,0x63,0x63,0x63,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x37 '7' - 0x00,0x00,0x7f,0x63,0x63,0x03,0x06,0x0c,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00, - - 8, // 0x38 '8' - 0x00,0x00,0x3e,0x63,0x63,0x63,0x3e,0x63,0x63,0x63,0x63,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x39 '9' - 0x00,0x00,0x3e,0x63,0x63,0x63,0x63,0x3f,0x03,0x03,0x06,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x3a ':' - 0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x3b ';' - 0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x60,0x40,0x00, - - 8, // 0x3c '<' - 0x00,0x00,0x00,0x06,0x0c,0x18,0x30,0x60,0x30,0x18,0x0c,0x06,0x00,0x00,0x00,0x00, - - 8, // 0x3d '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x3e '>' - 0x00,0x00,0x00,0x30,0x18,0x0c,0x06,0x03,0x06,0x0c,0x18,0x30,0x00,0x00,0x00,0x00, - - 8, // 0x3f '?' - 0x00,0x00,0x3e,0x63,0x63,0x63,0x06,0x0c,0x0c,0x00,0x0c,0x0c,0x00,0x00,0x00,0x00, - - 8, // 0x40 '@' - 0x00,0x00,0x7c,0x86,0x03,0x73,0xdb,0xdb,0xdb,0xdb,0xdb,0x6e,0x00,0x00,0x00,0x00, - - 8, // 0x41 'A' - 0x00,0x00,0x08,0x1c,0x36,0x63,0x63,0x63,0x7f,0x63,0x63,0x63,0x00,0x00,0x00,0x00, - - 8, // 0x42 'B' - 0x00,0x00,0x7e,0x33,0x33,0x33,0x3e,0x33,0x33,0x33,0x33,0x7e,0x00,0x00,0x00,0x00, - - 8, // 0x43 'C' - 0x00,0x00,0x1e,0x33,0x61,0x60,0x60,0x60,0x60,0x61,0x33,0x1e,0x00,0x00,0x00,0x00, - - 8, // 0x44 'D' - 0x00,0x00,0x7c,0x36,0x33,0x33,0x33,0x33,0x33,0x33,0x36,0x7c,0x00,0x00,0x00,0x00, - - 8, // 0x45 'E' - 0x00,0x00,0x7f,0x33,0x31,0x34,0x3c,0x34,0x30,0x31,0x33,0x7f,0x00,0x00,0x00,0x00, - - 8, // 0x46 'F' - 0x00,0x00,0x7f,0x33,0x31,0x34,0x3c,0x34,0x30,0x30,0x30,0x78,0x00,0x00,0x00,0x00, - - 8, // 0x47 'G' - 0x00,0x00,0x1f,0x33,0x61,0x60,0x60,0x6f,0x63,0x63,0x33,0x1e,0x00,0x00,0x00,0x00, - - 8, // 0x48 'H' - 0x00,0x00,0x63,0x63,0x63,0x63,0x7f,0x63,0x63,0x63,0x63,0x63,0x00,0x00,0x00,0x00, - - 8, // 0x49 'I' - 0x00,0x00,0x1e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x1e,0x00,0x00,0x00,0x00, - - 8, // 0x4a 'J' - 0x00,0x00,0x0f,0x06,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x4b 'K' - 0x00,0x00,0x73,0x33,0x36,0x36,0x3c,0x36,0x36,0x33,0x33,0x73,0x00,0x00,0x00,0x00, - - 8, // 0x4c 'L' - 0x00,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x33,0x7f,0x00,0x00,0x00,0x00, - - 8, // 0x4d 'M' - 0x00,0x00,0x63,0x63,0x77,0x77,0x7f,0x6b,0x6b,0x63,0x63,0x63,0x00,0x00,0x00,0x00, - - 8, // 0x4e 'N' - 0x00,0x00,0x63,0x63,0x73,0x7b,0x6f,0x67,0x63,0x63,0x63,0x63,0x00,0x00,0x00,0x00, - - 8, // 0x4f 'O' - 0x00,0x00,0x1c,0x36,0x63,0x63,0x63,0x63,0x63,0x63,0x36,0x1c,0x00,0x00,0x00,0x00, - - 8, // 0x50 'P' - 0x00,0x00,0x7e,0x33,0x33,0x33,0x33,0x3e,0x30,0x30,0x30,0x78,0x00,0x00,0x00,0x00, - - 8, // 0x51 'Q' - 0x00,0x00,0x1c,0x36,0x63,0x63,0x63,0x63,0x63,0x6f,0x36,0x1e,0x03,0x00,0x00,0x00, - - 8, // 0x52 'R' - 0x00,0x00,0x7e,0x33,0x33,0x33,0x33,0x3e,0x36,0x33,0x33,0x73,0x00,0x00,0x00,0x00, - - 8, // 0x53 'S' - 0x00,0x00,0x3e,0x63,0x63,0x30,0x18,0x0c,0x06,0x63,0x63,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x54 'T' - 0x00,0x00,0x3f,0x3f,0x2d,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x1e,0x00,0x00,0x00,0x00, - - 8, // 0x55 'U' - 0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x56 'V' - 0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x36,0x1c,0x08,0x00,0x00,0x00,0x00, - - 8, // 0x57 'W' - 0x00,0x00,0x63,0x63,0x63,0x6b,0x6b,0x7f,0x77,0x77,0x63,0x63,0x00,0x00,0x00,0x00, - - 8, // 0x58 'X' - 0x00,0x00,0x63,0x63,0x63,0x36,0x1c,0x1c,0x36,0x63,0x63,0x63,0x00,0x00,0x00,0x00, - - 8, // 0x59 'Y' - 0x00,0x00,0x33,0x33,0x33,0x33,0x1e,0x0c,0x0c,0x0c,0x0c,0x1e,0x00,0x00,0x00,0x00, - - 8, // 0x5a 'Z' - 0x00,0x00,0x7f,0x63,0x43,0x06,0x0c,0x18,0x30,0x61,0x63,0x7f,0x00,0x00,0x00,0x00, - - 8, // 0x5b '[' - 0x00,0x1f,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1f,0x00,0x00,0x00, - - 8, // 0x5c '\' - 0x00,0x60,0x60,0x30,0x30,0x18,0x18,0x0c,0x0c,0x06,0x06,0x03,0x03,0x00,0x00,0x00, - - 8, // 0x5d ']' - 0x00,0x7c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x7c,0x00,0x00,0x00, - - 8, // 0x5e '^' - 0x00,0x00,0x08,0x1c,0x36,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x5f '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00, - - 8, // 0x60 '`' - 0x00,0x00,0x18,0x18,0x18,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x3c,0x66,0x06,0x3e,0x66,0x66,0x3b,0x00,0x00,0x00,0x00, - - 8, // 0x62 'b' - 0x00,0x00,0x70,0x30,0x30,0x3c,0x36,0x33,0x33,0x33,0x33,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x3e,0x63,0x63,0x60,0x60,0x63,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x64 'd' - 0x00,0x00,0x0e,0x06,0x06,0x1e,0x36,0x66,0x66,0x66,0x66,0x3b,0x00,0x00,0x00,0x00, - - 8, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x3e,0x63,0x63,0x7f,0x60,0x63,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x66 'f' - 0x00,0x00,0x0e,0x1b,0x1b,0x18,0x3c,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, - - 8, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x3b,0x66,0x66,0x66,0x66,0x66,0x3e,0x06,0x66,0x3c,0x00, - - 8, // 0x68 'h' - 0x00,0x00,0x70,0x30,0x30,0x36,0x3b,0x33,0x33,0x33,0x33,0x73,0x00,0x00,0x00,0x00, - - 8, // 0x69 'i' - 0x00,0x00,0x0c,0x0c,0x00,0x1c,0x0c,0x0c,0x0c,0x0c,0x0c,0x1e,0x00,0x00,0x00,0x00, - - 8, // 0x6a 'j' - 0x00,0x00,0x06,0x06,0x00,0x0e,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3c,0x00,0x00, - - 8, // 0x6b 'k' - 0x00,0x00,0x70,0x30,0x30,0x33,0x33,0x36,0x3c,0x36,0x33,0x73,0x00,0x00,0x00,0x00, - - 8, // 0x6c 'l' - 0x00,0x00,0x1c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x1e,0x00,0x00,0x00,0x00, - - 8, // 0x6d 'm' - 0x00,0x00,0x00,0x00,0x00,0x76,0x7f,0x6b,0x6b,0x6b,0x63,0x63,0x00,0x00,0x00,0x00, - - 8, // 0x6e 'n' - 0x00,0x00,0x00,0x00,0x00,0x6e,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0x00,0x00,0x00, - - 8, // 0x6f 'o' - 0x00,0x00,0x00,0x00,0x00,0x3e,0x63,0x63,0x63,0x63,0x63,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x6e,0x33,0x33,0x33,0x33,0x33,0x3e,0x30,0x30,0x78,0x00, - - 8, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x3b,0x66,0x66,0x66,0x66,0x66,0x3e,0x06,0x06,0x0f,0x00, - - 8, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x6e,0x3b,0x33,0x30,0x30,0x30,0x78,0x00,0x00,0x00,0x00, - - 8, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x3e,0x63,0x60,0x3e,0x03,0x63,0x3e,0x00,0x00,0x00,0x00, - - 8, // 0x74 't' - 0x00,0x00,0x08,0x18,0x18,0x7e,0x18,0x18,0x18,0x18,0x1b,0x0e,0x00,0x00,0x00,0x00, - - 8, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x3b,0x00,0x00,0x00,0x00, - - 8, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x63,0x63,0x36,0x1c,0x08,0x00,0x00,0x00,0x00, - - 8, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x6b,0x6b,0x7f,0x36,0x36,0x00,0x00,0x00,0x00, - - 8, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x36,0x1c,0x36,0x63,0x63,0x00,0x00,0x00,0x00, - - 8, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x63,0x3f,0x03,0x06,0x7c,0x00, - - 8, // 0x7a 'z' - 0x00,0x00,0x00,0x00,0x00,0x7f,0x63,0x06,0x0c,0x18,0x31,0x7f,0x00,0x00,0x00,0x00, - - 8, // 0x7b '{' - 0x00,0x03,0x04,0x0c,0x0c,0x0c,0x08,0x30,0x08,0x0c,0x0c,0x0c,0x04,0x03,0x00,0x00, - - 8, // 0x7c '|' - 0x00,0x00,0x0c,0x0c,0x0c,0x0c,0x0c,0x00,0x0c,0x0c,0x0c,0x0c,0x0c,0x00,0x00,0x00, - - 8, // 0x7d '}' - 0x00,0x60,0x10,0x18,0x18,0x18,0x08,0x06,0x08,0x18,0x18,0x18,0x10,0x60,0x00,0x00, - - 8, // 0x7e '~' - 0x00,0x00,0x3b,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x7f '' - 0x00,0x00,0x00,0x00,0x00,0x08,0x1c,0x36,0x63,0x63,0x7f,0x00,0x00,0x00,0x00,0x00, - 0 - }; - - const int8u mcs11_prop[] = - { - 11, 2, 32, 128-32, - 0x00,0x00,0x0C,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x3C,0x00,0x48,0x00,0x54,0x00,0x60,0x00, - 0x6C,0x00,0x78,0x00,0x84,0x00,0x90,0x00,0x9C,0x00,0xA8,0x00,0xB4,0x00,0xC0,0x00,0xCC,0x00, - 0xD8,0x00,0xE4,0x00,0xF0,0x00,0xFC,0x00,0x08,0x01,0x14,0x01,0x20,0x01,0x2C,0x01,0x38,0x01, - 0x44,0x01,0x50,0x01,0x5C,0x01,0x68,0x01,0x74,0x01,0x80,0x01,0x8C,0x01,0x98,0x01,0xA4,0x01, - 0xB0,0x01,0xBC,0x01,0xC8,0x01,0xD4,0x01,0xE0,0x01,0xEC,0x01,0xF8,0x01,0x04,0x02,0x10,0x02, - 0x1C,0x02,0x28,0x02,0x34,0x02,0x40,0x02,0x4C,0x02,0x58,0x02,0x64,0x02,0x70,0x02,0x7C,0x02, - 0x88,0x02,0x94,0x02,0xA0,0x02,0xAC,0x02,0xB8,0x02,0xC4,0x02,0xD0,0x02,0xDC,0x02,0xE8,0x02, - 0xF4,0x02,0x00,0x03,0x0C,0x03,0x18,0x03,0x24,0x03,0x30,0x03,0x3C,0x03,0x48,0x03,0x54,0x03, - 0x60,0x03,0x6C,0x03,0x78,0x03,0x84,0x03,0x90,0x03,0x9C,0x03,0xA8,0x03,0xB4,0x03,0xC0,0x03, - 0xCC,0x03,0xD8,0x03,0xE4,0x03,0xF0,0x03,0xFC,0x03,0x08,0x04,0x14,0x04,0x20,0x04,0x2C,0x04, - 0x38,0x04,0x44,0x04,0x50,0x04,0x5C,0x04,0x68,0x04,0x74,0x04, - - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x21 '!' - 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00, - - 4, // 0x22 '"' - 0x50,0x50,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x23 '#' - 0x00,0x28,0x28,0x7C,0x28,0x28,0x28,0x7C,0x28,0x28,0x00, - - 6, // 0x24 '$' - 0x10,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x10, - - 6, // 0x25 '%' - 0x00,0x00,0x68,0xA8,0xD0,0x10,0x20,0x2C,0x54,0x58,0x00, - - 6, // 0x26 '&' - 0x00,0x20,0x50,0x50,0x50,0x20,0x54,0x54,0x48,0x34,0x00, - - 3, // 0x27 ''' - 0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x28 '(' - 0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10, - - 5, // 0x29 ')' - 0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x20,0x40, - - 6, // 0x2A '*' - 0x00,0x00,0x28,0x7C,0x38,0x7C,0x28,0x00,0x00,0x00,0x00, - - 6, // 0x2B '+' - 0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00, - - 4, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0xC0, - - 6, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00, - - 7, // 0x2F '/' - 0x00,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40, - - 6, // 0x30 '0' - 0x00,0x38,0x44,0x44,0x54,0x54,0x54,0x44,0x44,0x38,0x00, - - 4, // 0x31 '1' - 0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00, - - 6, // 0x32 '2' - 0x00,0x38,0x44,0x44,0x04,0x08,0x10,0x20,0x40,0x7C,0x00, - - 6, // 0x33 '3' - 0x00,0x38,0x44,0x04,0x04,0x38,0x04,0x04,0x44,0x38,0x00, - - 6, // 0x34 '4' - 0x00,0x08,0x18,0x18,0x28,0x28,0x48,0x7C,0x08,0x08,0x00, - - 6, // 0x35 '5' - 0x00,0x7C,0x40,0x40,0x78,0x44,0x04,0x04,0x44,0x38,0x00, - - 6, // 0x36 '6' - 0x00,0x38,0x44,0x40,0x40,0x78,0x44,0x44,0x44,0x38,0x00, - - 6, // 0x37 '7' - 0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x20,0x00, - - 6, // 0x38 '8' - 0x00,0x38,0x44,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00, - - 6, // 0x39 '9' - 0x00,0x38,0x44,0x44,0x44,0x3C,0x04,0x04,0x44,0x38,0x00, - - 4, // 0x3A ':' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x00, - - 4, // 0x3B ';' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0xC0, - - 6, // 0x3C '<' - 0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00, - - 6, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00, - - 6, // 0x3E '>' - 0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00, - - 6, // 0x3F '?' - 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x10,0x00,0x10,0x00, - - 6, // 0x40 '@' - 0x00,0x38,0x44,0x44,0x5C,0x54,0x54,0x4C,0x40,0x38,0x00, - - 6, // 0x41 'A' - 0x00,0x38,0x44,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x00, - - 6, // 0x42 'B' - 0x00,0x78,0x44,0x44,0x44,0x78,0x44,0x44,0x44,0x78,0x00, - - 6, // 0x43 'C' - 0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x40,0x44,0x38,0x00, - - 6, // 0x44 'D' - 0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x44,0x48,0x70,0x00, - - 6, // 0x45 'E' - 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x7C,0x00, - - 6, // 0x46 'F' - 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x40,0x00, - - 6, // 0x47 'G' - 0x00,0x38,0x44,0x40,0x40,0x5C,0x44,0x44,0x4C,0x34,0x00, - - 6, // 0x48 'H' - 0x00,0x44,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00, - - 4, // 0x49 'I' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00, - - 6, // 0x4A 'J' - 0x00,0x1C,0x08,0x08,0x08,0x08,0x08,0x08,0x48,0x30,0x00, - - 6, // 0x4B 'K' - 0x00,0x44,0x48,0x50,0x60,0x60,0x50,0x48,0x44,0x44,0x00, - - 6, // 0x4C 'L' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00, - - 8, // 0x4D 'M' - 0x00,0x41,0x63,0x55,0x49,0x49,0x41,0x41,0x41,0x41,0x00, - - 7, // 0x4E 'N' - 0x00,0x42,0x42,0x62,0x52,0x4A,0x46,0x42,0x42,0x42,0x00, - - 6, // 0x4F 'O' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00, - - 6, // 0x50 'P' - 0x00,0x78,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x40,0x00, - - 6, // 0x51 'Q' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00, - - 6, // 0x52 'R' - 0x00,0x78,0x44,0x44,0x44,0x78,0x44,0x44,0x44,0x44,0x00, - - 6, // 0x53 'S' - 0x00,0x38,0x44,0x40,0x40,0x38,0x04,0x04,0x44,0x38,0x00, - - 6, // 0x54 'T' - 0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00, - - 6, // 0x55 'U' - 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00, - - 6, // 0x56 'V' - 0x00,0x44,0x44,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x00, - - 8, // 0x57 'W' - 0x00,0x41,0x41,0x41,0x41,0x49,0x49,0x49,0x55,0x22,0x00, - - 6, // 0x58 'X' - 0x00,0x44,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00, - - 6, // 0x59 'Y' - 0x00,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x10,0x00, - - 6, // 0x5A 'Z' - 0x00,0x7C,0x04,0x04,0x08,0x10,0x20,0x40,0x40,0x7C,0x00, - - 5, // 0x5B '[' - 0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30, - - 7, // 0x5C '\' - 0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x00, - - 4, // 0x5D ']' - 0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x60, - - 6, // 0x5E '^' - 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00, - - 4, // 0x60 '`' - 0x00,0x40,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x61 'a' - 0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x44,0x44,0x3C,0x00, - - 6, // 0x62 'b' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x00, - - 6, // 0x63 'c' - 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x40,0x44,0x38,0x00, - - 6, // 0x64 'd' - 0x00,0x04,0x04,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x00, - - 6, // 0x65 'e' - 0x00,0x00,0x00,0x38,0x44,0x44,0x7C,0x40,0x44,0x38,0x00, - - 4, // 0x66 'f' - 0x00,0x10,0x20,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x00, - - 6, // 0x67 'g' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x3C,0x04,0x44,0x38, - - 6, // 0x68 'h' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x44,0x00, - - 2, // 0x69 'i' - 0x00,0x40,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00, - - 3, // 0x6A 'j' - 0x00,0x20,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x40, - - 5, // 0x6B 'k' - 0x00,0x40,0x40,0x48,0x50,0x60,0x60,0x50,0x48,0x48,0x00, - - 2, // 0x6C 'l' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00, - - 8, // 0x6D 'm' - 0x00,0x00,0x00,0x76,0x49,0x49,0x49,0x49,0x41,0x41,0x00, - - 6, // 0x6E 'n' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x44,0x00, - - 6, // 0x6F 'o' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x38,0x00, - - 6, // 0x70 'p' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40, - - 6, // 0x71 'q' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x3C,0x04,0x04, - - 6, // 0x72 'r' - 0x00,0x00,0x00,0x58,0x24,0x20,0x20,0x20,0x20,0x20,0x00, - - 6, // 0x73 's' - 0x00,0x00,0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x38,0x00, - - 5, // 0x74 't' - 0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x20,0x28,0x10,0x00, - - 6, // 0x75 'u' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x4C,0x34,0x00, - - 6, // 0x76 'v' - 0x00,0x00,0x00,0x44,0x44,0x44,0x28,0x28,0x10,0x10,0x00, - - 8, // 0x77 'w' - 0x00,0x00,0x00,0x41,0x41,0x41,0x41,0x49,0x49,0x36,0x00, - - 6, // 0x78 'x' - 0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00, - - 6, // 0x79 'y' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x3C,0x04,0x08,0x70, - - 6, // 0x7A 'z' - 0x00,0x00,0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x7C,0x00, - - 5, // 0x7B '{' - 0x18,0x20,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x20,0x18, - - 3, // 0x7C '|' - 0x00,0x40,0x40,0x40,0x40,0x00,0x40,0x40,0x40,0x40,0x00, - - 5, // 0x7D '}' - 0xC0,0x20,0x20,0x20,0x20,0x18,0x20,0x20,0x20,0x20,0xC0, - - 6, // 0x7E '~' - 0x00,0x24,0x54,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x7F '' - 0x00,0x10,0x38,0x6C,0x44,0x44,0x7C,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u mcs11_prop_condensed[] = - { - 11, 2, 32, 128-32, - 0x00,0x00,0x0C,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x3C,0x00,0x48,0x00,0x54,0x00,0x60,0x00, - 0x6C,0x00,0x78,0x00,0x84,0x00,0x90,0x00,0x9C,0x00,0xA8,0x00,0xB4,0x00,0xC0,0x00,0xCC,0x00, - 0xD8,0x00,0xE4,0x00,0xF0,0x00,0xFC,0x00,0x08,0x01,0x14,0x01,0x20,0x01,0x2C,0x01,0x38,0x01, - 0x44,0x01,0x50,0x01,0x5C,0x01,0x68,0x01,0x74,0x01,0x80,0x01,0x8C,0x01,0x98,0x01,0xA4,0x01, - 0xB0,0x01,0xBC,0x01,0xC8,0x01,0xD4,0x01,0xE0,0x01,0xEC,0x01,0xF8,0x01,0x04,0x02,0x10,0x02, - 0x1C,0x02,0x28,0x02,0x34,0x02,0x40,0x02,0x4C,0x02,0x58,0x02,0x64,0x02,0x70,0x02,0x7C,0x02, - 0x88,0x02,0x94,0x02,0xA0,0x02,0xAC,0x02,0xB8,0x02,0xC4,0x02,0xD0,0x02,0xDC,0x02,0xE8,0x02, - 0xF4,0x02,0x00,0x03,0x0C,0x03,0x18,0x03,0x24,0x03,0x30,0x03,0x3C,0x03,0x48,0x03,0x54,0x03, - 0x60,0x03,0x6C,0x03,0x78,0x03,0x84,0x03,0x90,0x03,0x9C,0x03,0xA8,0x03,0xB4,0x03,0xC0,0x03, - 0xCC,0x03,0xD8,0x03,0xE4,0x03,0xF0,0x03,0xFC,0x03,0x08,0x04,0x14,0x04,0x20,0x04,0x2C,0x04, - 0x38,0x04,0x44,0x04,0x50,0x04,0x5C,0x04,0x68,0x04,0x74,0x04, - - 3, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 3, // 0x21 '!' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x40,0x00, - - 4, // 0x22 '"' - 0x50,0x50,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x23 '#' - 0x00,0x50,0x50,0xF8,0x50,0x50,0x50,0xF8,0x50,0x50,0x00, - - 5, // 0x24 '$' - 0x00,0x40,0x60,0x90,0x80,0x60,0x10,0x90,0x60,0x20,0x00, - - 5, // 0x25 '%' - 0x00,0x00,0x90,0x90,0x20,0x20,0x40,0x40,0x90,0x90,0x00, - - 5, // 0x26 '&' - 0x00,0x40,0xA0,0xA0,0xA0,0x40,0xA8,0x90,0x90,0x68,0x00, - - 5, // 0x27 ''' - 0x00,0x00,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x28 '(' - 0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10, - - 4, // 0x29 ')' - 0x80,0x40,0x40,0x20,0x20,0x20,0x20,0x20,0x40,0x40,0x80, - - 5, // 0x2A '*' - 0x00,0x00,0x90,0x60,0xF0,0x60,0x90,0x00,0x00,0x00,0x00, - - 5, // 0x2B '+' - 0x00,0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x00,0x00,0x00, - - 4, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0xC0, - - 5, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00, - - 6, // 0x2F '/' - 0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80,0x00, - - 5, // 0x30 '0' - 0x00,0x70,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xE0,0x00, - - 3, // 0x31 '1' - 0x00,0x40,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00, - - 5, // 0x32 '2' - 0x00,0x60,0x90,0x90,0x10,0x10,0x20,0x40,0x80,0xF0,0x00, - - 5, // 0x33 '3' - 0x00,0x60,0x90,0x10,0x10,0x60,0x10,0x10,0x90,0x60,0x00, - - 5, // 0x34 '4' - 0x00,0x10,0x30,0x30,0x50,0x50,0x90,0xF0,0x10,0x10,0x00, - - 5, // 0x35 '5' - 0x00,0xF0,0x80,0x80,0xE0,0x90,0x10,0x10,0x90,0x60,0x00, - - 5, // 0x36 '6' - 0x00,0x60,0x90,0x80,0x80,0xE0,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x37 '7' - 0x00,0xF0,0x10,0x10,0x10,0x20,0x20,0x40,0x40,0x40,0x00, - - 5, // 0x38 '8' - 0x00,0x60,0x90,0x90,0x90,0x60,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x39 '9' - 0x00,0x60,0x90,0x90,0x90,0x70,0x10,0x10,0x90,0x60,0x00, - - 4, // 0x3A ':' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x00, - - 4, // 0x3B ';' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0xC0, - - 6, // 0x3C '<' - 0x00,0x08,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x08,0x00, - - 5, // 0x3D '=' - 0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0xF0,0x00,0x00,0x00, - - 6, // 0x3E '>' - 0x00,0x80,0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x80,0x00, - - 5, // 0x3F '?' - 0x00,0x60,0x90,0x10,0x10,0x20,0x40,0x00,0x40,0x00,0x00, - - 5, // 0x40 '@' - 0x00,0x60,0x90,0x90,0xB0,0xB0,0xB0,0x80,0x80,0x70,0x00, - - 5, // 0x41 'A' - 0x00,0x60,0x90,0x90,0x90,0xF0,0x90,0x90,0x90,0x90,0x00, - - 5, // 0x42 'B' - 0x00,0xE0,0x90,0x90,0x90,0xE0,0x90,0x90,0x90,0xE0,0x00, - - 5, // 0x43 'C' - 0x00,0x60,0x90,0x80,0x80,0x80,0x80,0x80,0x90,0x60,0x00, - - 5, // 0x44 'D' - 0x00,0xE0,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xE0,0x00, - - 5, // 0x45 'E' - 0x00,0xF0,0x80,0x80,0x80,0xF0,0x80,0x80,0x80,0xF0,0x00, - - 5, // 0x46 'F' - 0x00,0xF0,0x80,0x80,0x80,0xF0,0x80,0x80,0x80,0x80,0x00, - - 5, // 0x47 'G' - 0x00,0x70,0x80,0x80,0x80,0xB0,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x48 'H' - 0x00,0x90,0x90,0x90,0x90,0xF0,0x90,0x90,0x90,0x90,0x00, - - 4, // 0x49 'I' - 0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xE0,0x00, - - 5, // 0x4A 'J' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0xA0,0xA0,0x40,0x00, - - 5, // 0x4B 'K' - 0x00,0x90,0x90,0xA0,0xA0,0xC0,0xA0,0xA0,0x90,0x90,0x00, - - 5, // 0x4C 'L' - 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xF0,0x00, - - 6, // 0x4D 'M' - 0x00,0x88,0xD8,0xA8,0xA8,0xA8,0x88,0x88,0x88,0x88,0x00, - - 5, // 0x4E 'N' - 0x00,0x90,0x90,0xD0,0xD0,0xB0,0xB0,0x90,0x90,0x90,0x00, - - 5, // 0x4F 'O' - 0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x50 'P' - 0x00,0xE0,0x90,0x90,0x90,0x90,0xE0,0x80,0x80,0x80,0x00, - - 5, // 0x51 'Q' - 0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x30, - - 5, // 0x52 'R' - 0x00,0xE0,0x90,0x90,0x90,0x90,0xE0,0xA0,0x90,0x90,0x00, - - 5, // 0x53 'S' - 0x00,0x60,0x90,0x80,0x80,0x60,0x10,0x10,0x90,0x60,0x00, - - 6, // 0x54 'T' - 0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00, - - 5, // 0x55 'U' - 0x00,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00, - - 6, // 0x56 'V' - 0x00,0x88,0x88,0x88,0x88,0x50,0x50,0x50,0x20,0x20,0x00, - - 6, // 0x57 'W' - 0x00,0x88,0x88,0x88,0xA8,0xA8,0xA8,0xA8,0xA8,0x50,0x00, - - 5, // 0x58 'X' - 0x00,0x90,0x90,0x90,0x60,0x60,0x90,0x90,0x90,0x90,0x00, - - 6, // 0x59 'Y' - 0x00,0x88,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x20,0x00, - - 5, // 0x5A 'Z' - 0x00,0xF0,0x10,0x20,0x20,0x40,0x40,0x80,0x80,0xF0,0x00, - - 4, // 0x5B '[' - 0x60,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x60,0x00, - - 6, // 0x5C '\' - 0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x00, - - 4, // 0x5D ']' - 0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x60,0x00, - - 5, // 0x5E '^' - 0x00,0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00, - - 5, // 0x60 '`' - 0x00,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x61 'a' - 0x00,0x00,0x00,0x60,0x90,0x10,0x70,0x90,0x90,0x70,0x00, - - 5, // 0x62 'b' - 0x00,0x80,0x80,0x80,0xE0,0x90,0x90,0x90,0x90,0xE0,0x00, - - 5, // 0x63 'c' - 0x00,0x00,0x00,0x60,0x90,0x80,0x80,0x80,0x90,0x60,0x00, - - 5, // 0x64 'd' - 0x00,0x10,0x10,0x10,0x70,0x90,0x90,0x90,0x90,0x70,0x00, - - 5, // 0x65 'e' - 0x00,0x00,0x00,0x60,0x90,0x90,0xF0,0x80,0x90,0x60,0x00, - - 4, // 0x66 'f' - 0x00,0x20,0x40,0x40,0xE0,0x40,0x40,0x40,0x40,0x40,0x00, - - 5, // 0x67 'g' - 0x00,0x00,0x00,0x70,0x90,0x90,0x90,0x70,0x10,0x90,0x60, - - 5, // 0x68 'h' - 0x00,0x80,0x80,0x80,0xE0,0x90,0x90,0x90,0x90,0x90,0x00, - - 2, // 0x69 'i' - 0x00,0x80,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00, - - 4, // 0x6A 'j' - 0x00,0x20,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x40, - - 5, // 0x6B 'k' - 0x00,0x80,0x80,0x90,0x90,0xA0,0xC0,0xA0,0x90,0x90,0x00, - - 2, // 0x6C 'l' - 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00, - - 6, // 0x6D 'm' - 0x00,0x00,0x00,0xD0,0xA8,0xA8,0xA8,0x88,0x88,0x88,0x00, - - 5, // 0x6E 'n' - 0x00,0x00,0x00,0xA0,0xD0,0x90,0x90,0x90,0x90,0x90,0x00, - - 5, // 0x6F 'o' - 0x00,0x00,0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x70 'p' - 0x00,0x00,0x00,0xE0,0x90,0x90,0x90,0x90,0xE0,0x80,0x80, - - 5, // 0x71 'q' - 0x00,0x00,0x00,0x70,0x90,0x90,0x90,0x90,0x70,0x10,0x10, - - 6, // 0x72 'r' - 0x00,0x00,0x00,0xB8,0x48,0x40,0x40,0x40,0x40,0x40,0x00, - - 5, // 0x73 's' - 0x00,0x00,0x00,0x60,0x90,0x40,0x20,0x10,0x90,0x60,0x00, - - 4, // 0x74 't' - 0x00,0x40,0x40,0xE0,0x40,0x40,0x40,0x40,0x40,0x20,0x00, - - 5, // 0x75 'u' - 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0x90,0x90,0x70,0x00, - - 6, // 0x76 'v' - 0x00,0x00,0x00,0x88,0x88,0x88,0x50,0x50,0x20,0x20,0x00, - - 6, // 0x77 'w' - 0x00,0x00,0x00,0x88,0x88,0x88,0xA8,0xA8,0xA8,0x50,0x00, - - 5, // 0x78 'x' - 0x00,0x00,0x00,0x90,0x90,0x60,0x60,0x90,0x90,0x90,0x00, - - 5, // 0x79 'y' - 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0x70,0x10,0x20,0xC0, - - 5, // 0x7A 'z' - 0x00,0x00,0x00,0xF0,0x10,0x20,0x40,0x80,0x80,0xF0,0x00, - - 5, // 0x7B '{' - 0x30,0x40,0x40,0x40,0x40,0x80,0x40,0x40,0x40,0x40,0x30, - - 3, // 0x7C '|' - 0x00,0x40,0x40,0x40,0x40,0x00,0x40,0x40,0x40,0x40,0x00, - - 5, // 0x7D '}' - 0xC0,0x20,0x20,0x20,0x20,0x10,0x20,0x20,0x20,0x20,0xC0, - - 5, // 0x7E '~' - 0x00,0x40,0xA8,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x7F '' - 0x00,0x20,0x70,0xD8,0x88,0x88,0xF8,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u mcs12_prop[] = - { - 12, 3, 32, 128-32, - 0x00,0x00,0x0D,0x00,0x1A,0x00,0x27,0x00,0x34,0x00,0x41,0x00,0x4E,0x00,0x5B,0x00,0x68,0x00, - 0x75,0x00,0x82,0x00,0x8F,0x00,0x9C,0x00,0xA9,0x00,0xB6,0x00,0xC3,0x00,0xD0,0x00,0xDD,0x00, - 0xEA,0x00,0xF7,0x00,0x04,0x01,0x11,0x01,0x1E,0x01,0x2B,0x01,0x38,0x01,0x45,0x01,0x52,0x01, - 0x5F,0x01,0x6C,0x01,0x79,0x01,0x86,0x01,0x93,0x01,0xA0,0x01,0xAD,0x01,0xBA,0x01,0xC7,0x01, - 0xD4,0x01,0xE1,0x01,0xEE,0x01,0xFB,0x01,0x08,0x02,0x15,0x02,0x22,0x02,0x2F,0x02,0x3C,0x02, - 0x49,0x02,0x62,0x02,0x6F,0x02,0x7C,0x02,0x89,0x02,0x96,0x02,0xA3,0x02,0xB0,0x02,0xBD,0x02, - 0xCA,0x02,0xD7,0x02,0xF0,0x02,0xFD,0x02,0x0A,0x03,0x17,0x03,0x24,0x03,0x31,0x03,0x3E,0x03, - 0x4B,0x03,0x58,0x03,0x65,0x03,0x72,0x03,0x7F,0x03,0x8C,0x03,0x99,0x03,0xA6,0x03,0xB3,0x03, - 0xC0,0x03,0xCD,0x03,0xDA,0x03,0xE7,0x03,0xF4,0x03,0x01,0x04,0x1A,0x04,0x27,0x04,0x34,0x04, - 0x41,0x04,0x4E,0x04,0x5B,0x04,0x68,0x04,0x75,0x04,0x82,0x04,0x8F,0x04,0xA8,0x04,0xB5,0x04, - 0xC2,0x04,0xCF,0x04,0xDC,0x04,0xE9,0x04,0xF6,0x04,0x03,0x05, - - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x21 '!' - 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, - - 4, // 0x22 '"' - 0x50,0x50,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x23 '#' - 0x28,0x28,0x28,0x7C,0x28,0x28,0x28,0x7C,0x28,0x28,0x28,0x00, - - 6, // 0x24 '$' - 0x10,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x10,0x00, - - 7, // 0x25 '%' - 0x32,0x54,0x64,0x08,0x08,0x10,0x10,0x26,0x2A,0x4C,0x00,0x00, - - 7, // 0x26 '&' - 0x00,0x30,0x48,0x48,0x48,0x30,0x4A,0x4A,0x44,0x3A,0x00,0x00, - - 3, // 0x27 ''' - 0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x28 '(' - 0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10,0x00, - - 5, // 0x29 ')' - 0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x20,0x40,0x00, - - 6, // 0x2A '*' - 0x00,0x00,0x10,0x54,0x38,0x7C,0x38,0x54,0x10,0x00,0x00,0x00, - - 6, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00, - - 4, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x40,0x80, - - 6, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00, - - 7, // 0x2F '/' - 0x00,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00, - - 7, // 0x30 '0' - 0x00,0x38,0x44,0x44,0x54,0x54,0x54,0x44,0x44,0x38,0x00,0x00, - - 4, // 0x31 '1' - 0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00, - - 7, // 0x32 '2' - 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, - - 7, // 0x33 '3' - 0x00,0x38,0x44,0x04,0x04,0x38,0x04,0x04,0x44,0x38,0x00,0x00, - - 6, // 0x34 '4' - 0x00,0x08,0x18,0x28,0x28,0x48,0x48,0x7C,0x08,0x08,0x00,0x00, - - 7, // 0x35 '5' - 0x00,0x7C,0x40,0x40,0x78,0x44,0x04,0x04,0x44,0x38,0x00,0x00, - - 7, // 0x36 '6' - 0x00,0x38,0x44,0x40,0x78,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 6, // 0x37 '7' - 0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x20,0x00,0x00, - - 7, // 0x38 '8' - 0x00,0x38,0x44,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x39 '9' - 0x00,0x38,0x44,0x44,0x44,0x3C,0x04,0x04,0x44,0x38,0x00,0x00, - - 4, // 0x3A ':' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x00,0x00, - - 4, // 0x3B ';' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x40,0x80, - - 6, // 0x3C '<' - 0x00,0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00, - - 6, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00,0x00, - - 6, // 0x3E '>' - 0x00,0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00, - - 6, // 0x3F '?' - 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x10,0x00,0x10,0x00,0x00, - - 7, // 0x40 '@' - 0x00,0x38,0x44,0x44,0x5C,0x54,0x54,0x4C,0x40,0x38,0x00,0x00, - - 7, // 0x41 'A' - 0x00,0x38,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x42 'B' - 0x00,0x78,0x44,0x44,0x44,0x78,0x44,0x44,0x44,0x78,0x00,0x00, - - 6, // 0x43 'C' - 0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x40,0x44,0x38,0x00,0x00, - - 7, // 0x44 'D' - 0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x44,0x48,0x70,0x00,0x00, - - 6, // 0x45 'E' - 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x7C,0x00,0x00, - - 6, // 0x46 'F' - 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x40,0x00,0x00, - - 7, // 0x47 'G' - 0x00,0x38,0x44,0x40,0x40,0x5C,0x44,0x44,0x4C,0x34,0x00,0x00, - - 7, // 0x48 'H' - 0x00,0x44,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00, - - 5, // 0x49 'I' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - - 6, // 0x4A 'J' - 0x00,0x1C,0x08,0x08,0x08,0x08,0x08,0x48,0x48,0x30,0x00,0x00, - - 6, // 0x4B 'K' - 0x00,0x44,0x48,0x50,0x60,0x60,0x50,0x48,0x44,0x44,0x00,0x00, - - 6, // 0x4C 'L' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00, - - 9, // 0x4D 'M' - 0x00,0x00,0x41,0x00,0x63,0x00,0x55,0x00,0x49,0x00,0x49,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x4E 'N' - 0x00,0x44,0x64,0x64,0x54,0x54,0x4C,0x4C,0x44,0x44,0x00,0x00, - - 7, // 0x4F 'O' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x50 'P' - 0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00, - - 7, // 0x51 'Q' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00, - - 7, // 0x52 'R' - 0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x48,0x44,0x44,0x00,0x00, - - 7, // 0x53 'S' - 0x00,0x38,0x44,0x40,0x40,0x38,0x04,0x04,0x44,0x38,0x00,0x00, - - 6, // 0x54 'T' - 0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - - 7, // 0x55 'U' - 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 6, // 0x56 'V' - 0x00,0x44,0x44,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x00,0x00, - - 9, // 0x57 'W' - 0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x49,0x00,0x49,0x00,0x55,0x00,0x22,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x58 'X' - 0x00,0x44,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x59 'Y' - 0x00,0x44,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x00,0x00, - - 6, // 0x5A 'Z' - 0x00,0x7C,0x04,0x04,0x08,0x10,0x20,0x40,0x40,0x7C,0x00,0x00, - - 4, // 0x5B '[' - 0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x00, - - 7, // 0x5C '\' - 0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x00, - - 4, // 0x5D ']' - 0xE0,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xE0,0x00, - - 6, // 0x5E '^' - 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00, - - 4, // 0x60 '`' - 0x00,0x40,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x61 'a' - 0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x44,0x44,0x3C,0x00,0x00, - - 7, // 0x62 'b' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x00,0x00, - - 6, // 0x63 'c' - 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x40,0x44,0x38,0x00,0x00, - - 7, // 0x64 'd' - 0x00,0x04,0x04,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x00,0x00, - - 7, // 0x65 'e' - 0x00,0x00,0x00,0x38,0x44,0x44,0x7C,0x40,0x44,0x38,0x00,0x00, - - 4, // 0x66 'f' - 0x00,0x30,0x40,0xE0,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - - 7, // 0x67 'g' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x78, - - 7, // 0x68 'h' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x44,0x00,0x00, - - 3, // 0x69 'i' - 0x00,0x40,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - - 5, // 0x6A 'j' - 0x00,0x10,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x90,0x60, - - 6, // 0x6B 'k' - 0x00,0x40,0x40,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00, - - 3, // 0x6C 'l' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - - 9, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x6E 'n' - 0x00,0x00,0x00,0x58,0x64,0x44,0x44,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x6F 'o' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x70 'p' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x40,0x40, - - 7, // 0x71 'q' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x04, - - 6, // 0x72 'r' - 0x00,0x00,0x00,0x58,0x24,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - - 7, // 0x73 's' - 0x00,0x00,0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x38,0x00,0x00, - - 5, // 0x74 't' - 0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x20,0x20,0x18,0x00,0x00, - - 7, // 0x75 'u' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x4C,0x34,0x00,0x00, - - 6, // 0x76 'v' - 0x00,0x00,0x00,0x44,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00, - - 9, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x36,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x78 'x' - 0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00, - - 7, // 0x79 'y' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x3C,0x08,0x70, - - 6, // 0x7A 'z' - 0x00,0x00,0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, - - 5, // 0x7B '{' - 0x18,0x20,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x20,0x18,0x00, - - 3, // 0x7C '|' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00, - - 5, // 0x7D '}' - 0xC0,0x20,0x20,0x20,0x20,0x18,0x20,0x20,0x20,0x20,0xC0,0x00, - - 7, // 0x7E '~' - 0x00,0x60,0x92,0x92,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x7F '' - 0x00,0x10,0x38,0x6C,0x44,0x44,0x7C,0x00,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u mcs13_prop[] = - { - 13, 4, 32, 128-32, - 0x00,0x00,0x0E,0x00,0x1C,0x00,0x2A,0x00,0x38,0x00,0x46,0x00,0x54,0x00,0x62,0x00,0x70,0x00, - 0x7E,0x00,0x8C,0x00,0x9A,0x00,0xA8,0x00,0xB6,0x00,0xC4,0x00,0xD2,0x00,0xE0,0x00,0xEE,0x00, - 0xFC,0x00,0x0A,0x01,0x18,0x01,0x26,0x01,0x34,0x01,0x42,0x01,0x50,0x01,0x5E,0x01,0x6C,0x01, - 0x7A,0x01,0x88,0x01,0x96,0x01,0xA4,0x01,0xB2,0x01,0xC0,0x01,0xCE,0x01,0xDC,0x01,0xEA,0x01, - 0xF8,0x01,0x06,0x02,0x14,0x02,0x22,0x02,0x30,0x02,0x3E,0x02,0x4C,0x02,0x5A,0x02,0x68,0x02, - 0x76,0x02,0x91,0x02,0x9F,0x02,0xAD,0x02,0xBB,0x02,0xC9,0x02,0xD7,0x02,0xE5,0x02,0xF3,0x02, - 0x01,0x03,0x0F,0x03,0x2A,0x03,0x38,0x03,0x46,0x03,0x54,0x03,0x62,0x03,0x70,0x03,0x7E,0x03, - 0x8C,0x03,0x9A,0x03,0xA8,0x03,0xB6,0x03,0xC4,0x03,0xD2,0x03,0xE0,0x03,0xEE,0x03,0xFC,0x03, - 0x0A,0x04,0x18,0x04,0x26,0x04,0x34,0x04,0x42,0x04,0x50,0x04,0x6B,0x04,0x79,0x04,0x87,0x04, - 0x95,0x04,0xA3,0x04,0xB1,0x04,0xBF,0x04,0xCD,0x04,0xDB,0x04,0xE9,0x04,0x04,0x05,0x12,0x05, - 0x20,0x05,0x2E,0x05,0x3C,0x05,0x4A,0x05,0x58,0x05,0x66,0x05, - - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x21 '!' - 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, - - 4, // 0x22 '"' - 0x00,0x50,0x50,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x23 '#' - 0x00,0x28,0x28,0x28,0x7C,0x28,0x28,0x28,0x7C,0x28,0x28,0x28,0x00, - - 6, // 0x24 '$' - 0x00,0x10,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x10,0x00, - - 7, // 0x25 '%' - 0x00,0x32,0x54,0x64,0x08,0x08,0x10,0x10,0x26,0x2A,0x4C,0x00,0x00, - - 7, // 0x26 '&' - 0x00,0x30,0x48,0x48,0x48,0x30,0x4A,0x4A,0x44,0x3A,0x00,0x00,0x00, - - 3, // 0x27 ''' - 0x00,0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x28 '(' - 0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10,0x00,0x00, - - 5, // 0x29 ')' - 0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x20,0x40,0x00,0x00, - - 6, // 0x2A '*' - 0x00,0x00,0x10,0x54,0x38,0x7C,0x38,0x54,0x10,0x00,0x00,0x00,0x00, - - 6, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00,0x00, - - 4, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x20,0x40,0x80, - - 6, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00, - - 7, // 0x2F '/' - 0x00,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00,0x00, - - 7, // 0x30 '0' - 0x00,0x38,0x44,0x44,0x54,0x54,0x54,0x44,0x44,0x38,0x00,0x00,0x00, - - 4, // 0x31 '1' - 0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00, - - 7, // 0x32 '2' - 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00,0x00, - - 7, // 0x33 '3' - 0x00,0x38,0x44,0x04,0x04,0x38,0x04,0x04,0x44,0x38,0x00,0x00,0x00, - - 6, // 0x34 '4' - 0x00,0x08,0x18,0x28,0x28,0x48,0x48,0x7C,0x08,0x08,0x00,0x00,0x00, - - 7, // 0x35 '5' - 0x00,0x7C,0x40,0x40,0x78,0x44,0x04,0x04,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x36 '6' - 0x00,0x38,0x44,0x40,0x78,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 6, // 0x37 '7' - 0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x20,0x00,0x00,0x00, - - 7, // 0x38 '8' - 0x00,0x38,0x44,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x39 '9' - 0x00,0x38,0x44,0x44,0x44,0x3C,0x04,0x04,0x44,0x38,0x00,0x00,0x00, - - 4, // 0x3A ':' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00, - - 4, // 0x3B ';' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x20,0x40,0x80, - - 6, // 0x3C '<' - 0x00,0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00,0x00, - - 6, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x3E '>' - 0x00,0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00,0x00, - - 6, // 0x3F '?' - 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x10,0x00,0x10,0x00,0x00,0x00, - - 7, // 0x40 '@' - 0x00,0x38,0x44,0x44,0x5C,0x54,0x54,0x4C,0x40,0x38,0x00,0x00,0x00, - - 7, // 0x41 'A' - 0x00,0x38,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x42 'B' - 0x00,0x78,0x44,0x44,0x44,0x78,0x44,0x44,0x44,0x78,0x00,0x00,0x00, - - 6, // 0x43 'C' - 0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x40,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x44 'D' - 0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x44,0x48,0x70,0x00,0x00,0x00, - - 6, // 0x45 'E' - 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x7C,0x00,0x00,0x00, - - 6, // 0x46 'F' - 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 7, // 0x47 'G' - 0x00,0x38,0x44,0x40,0x40,0x5C,0x44,0x44,0x4C,0x34,0x00,0x00,0x00, - - 7, // 0x48 'H' - 0x00,0x44,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - - 5, // 0x49 'I' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00,0x00, - - 6, // 0x4A 'J' - 0x00,0x1C,0x08,0x08,0x08,0x08,0x08,0x48,0x48,0x30,0x00,0x00,0x00, - - 6, // 0x4B 'K' - 0x00,0x44,0x48,0x50,0x60,0x60,0x50,0x48,0x44,0x44,0x00,0x00,0x00, - - 6, // 0x4C 'L' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00,0x00, - - 9, // 0x4D 'M' - 0x00,0x00,0x41,0x00,0x63,0x00,0x55,0x00,0x49,0x00,0x49,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x4E 'N' - 0x00,0x44,0x64,0x64,0x54,0x54,0x4C,0x4C,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x4F 'O' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x50 'P' - 0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00,0x00, - - 7, // 0x51 'Q' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00,0x00, - - 7, // 0x52 'R' - 0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x48,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x53 'S' - 0x00,0x38,0x44,0x40,0x40,0x38,0x04,0x04,0x44,0x38,0x00,0x00,0x00, - - 6, // 0x54 'T' - 0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00, - - 7, // 0x55 'U' - 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 6, // 0x56 'V' - 0x00,0x44,0x44,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x00,0x00,0x00, - - 9, // 0x57 'W' - 0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x49,0x00,0x49,0x00,0x55,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x58 'X' - 0x00,0x44,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x59 'Y' - 0x00,0x44,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x00,0x00,0x00, - - 6, // 0x5A 'Z' - 0x00,0x7C,0x04,0x04,0x08,0x10,0x20,0x40,0x40,0x7C,0x00,0x00,0x00, - - 4, // 0x5B '[' - 0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x00,0x00, - - 7, // 0x5C '\' - 0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x00,0x00, - - 4, // 0x5D ']' - 0xE0,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xE0,0x00,0x00, - - 6, // 0x5E '^' - 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00, - - 4, // 0x60 '`' - 0x00,0x40,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x61 'a' - 0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x44,0x44,0x3C,0x00,0x00,0x00, - - 7, // 0x62 'b' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x00,0x00,0x00, - - 6, // 0x63 'c' - 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x40,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x64 'd' - 0x00,0x04,0x04,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x00,0x00,0x00, - - 7, // 0x65 'e' - 0x00,0x00,0x00,0x38,0x44,0x44,0x7C,0x40,0x44,0x38,0x00,0x00,0x00, - - 4, // 0x66 'f' - 0x00,0x30,0x40,0xE0,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 7, // 0x67 'g' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x44,0x38, - - 7, // 0x68 'h' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - - 3, // 0x69 'i' - 0x00,0x40,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 5, // 0x6A 'j' - 0x00,0x10,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x90,0x60,0x00, - - 6, // 0x6B 'k' - 0x00,0x40,0x40,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00,0x00, - - 3, // 0x6C 'l' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 9, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x6E 'n' - 0x00,0x00,0x00,0x58,0x64,0x44,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x6F 'o' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x70 'p' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x40,0x40,0x40, - - 7, // 0x71 'q' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x04,0x04, - - 6, // 0x72 'r' - 0x00,0x00,0x00,0x58,0x24,0x20,0x20,0x20,0x20,0x70,0x00,0x00,0x00, - - 7, // 0x73 's' - 0x00,0x00,0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x38,0x00,0x00,0x00, - - 5, // 0x74 't' - 0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x20,0x20,0x18,0x00,0x00,0x00, - - 7, // 0x75 'u' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x4C,0x34,0x00,0x00,0x00, - - 6, // 0x76 'v' - 0x00,0x00,0x00,0x44,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00,0x00, - - 9, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x78 'x' - 0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x79 'y' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x08,0x70, - - 6, // 0x7A 'z' - 0x00,0x00,0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00,0x00, - - 5, // 0x7B '{' - 0x18,0x20,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x20,0x18,0x00,0x00, - - 3, // 0x7C '|' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - - 5, // 0x7D '}' - 0xC0,0x20,0x20,0x20,0x20,0x18,0x20,0x20,0x20,0x20,0xC0,0x00,0x00, - - 7, // 0x7E '~' - 0x00,0x60,0x92,0x92,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x7F '' - 0x00,0x10,0x38,0x6C,0x44,0x44,0x7C,0x00,0x00,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u mcs5x10_mono[] = - { - 10, 2, 32, 128-32, - 0x00,0x00,0x0B,0x00,0x16,0x00,0x21,0x00,0x2C,0x00,0x37,0x00,0x42,0x00,0x4D,0x00,0x58,0x00, - 0x63,0x00,0x6E,0x00,0x79,0x00,0x84,0x00,0x8F,0x00,0x9A,0x00,0xA5,0x00,0xB0,0x00,0xBB,0x00, - 0xC6,0x00,0xD1,0x00,0xDC,0x00,0xE7,0x00,0xF2,0x00,0xFD,0x00,0x08,0x01,0x13,0x01,0x1E,0x01, - 0x29,0x01,0x34,0x01,0x3F,0x01,0x4A,0x01,0x55,0x01,0x60,0x01,0x6B,0x01,0x76,0x01,0x81,0x01, - 0x8C,0x01,0x97,0x01,0xA2,0x01,0xAD,0x01,0xB8,0x01,0xC3,0x01,0xCE,0x01,0xD9,0x01,0xE4,0x01, - 0xEF,0x01,0xFA,0x01,0x05,0x02,0x10,0x02,0x1B,0x02,0x26,0x02,0x31,0x02,0x3C,0x02,0x47,0x02, - 0x52,0x02,0x5D,0x02,0x68,0x02,0x73,0x02,0x7E,0x02,0x89,0x02,0x94,0x02,0x9F,0x02,0xAA,0x02, - 0xB5,0x02,0xC0,0x02,0xCB,0x02,0xD6,0x02,0xE1,0x02,0xEC,0x02,0xF7,0x02,0x02,0x03,0x0D,0x03, - 0x18,0x03,0x23,0x03,0x2E,0x03,0x39,0x03,0x44,0x03,0x4F,0x03,0x5A,0x03,0x65,0x03,0x70,0x03, - 0x7B,0x03,0x86,0x03,0x91,0x03,0x9C,0x03,0xA7,0x03,0xB2,0x03,0xBD,0x03,0xC8,0x03,0xD3,0x03, - 0xDE,0x03,0xE9,0x03,0xF4,0x03,0xFF,0x03,0x0A,0x04,0x15,0x04, - - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x21 '!' - 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00, - - 5, // 0x22 '"' - 0x00,0x50,0x50,0xA0,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x23 '#' - 0x00,0x50,0x50,0xF8,0x50,0x50,0x50,0xF8,0x50,0x50, - - 5, // 0x24 '$' - 0x00,0x40,0x60,0x90,0x80,0x60,0x10,0x90,0x60,0x20, - - 5, // 0x25 '%' - 0x00,0x00,0x90,0x90,0x20,0x20,0x40,0x40,0x90,0x90, - - 5, // 0x26 '&' - 0x00,0x40,0xA0,0xA0,0xA0,0x40,0xA8,0x90,0x90,0x68, - - 5, // 0x27 ''' - 0x00,0x20,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x28 '(' - 0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x20,0x20,0x10, - - 5, // 0x29 ')' - 0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x20,0x20,0x40, - - 5, // 0x2A '*' - 0x00,0x00,0x90,0x60,0xF0,0x60,0x90,0x00,0x00,0x00, - - 5, // 0x2B '+' - 0x00,0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x00,0x00, - - 5, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0xC0, - - 5, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00, - - 5, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00, - - 5, // 0x2F '/' - 0x00,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x00, - - 5, // 0x30 '0' - 0x00,0x70,0x90,0x90,0x90,0x90,0x90,0x90,0xE0,0x00, - - 5, // 0x31 '1' - 0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00, - - 5, // 0x32 '2' - 0x00,0x60,0x90,0x90,0x10,0x20,0x40,0x80,0xF0,0x00, - - 5, // 0x33 '3' - 0x00,0x60,0x90,0x10,0x60,0x10,0x10,0x90,0x60,0x00, - - 5, // 0x34 '4' - 0x00,0x10,0x30,0x50,0x50,0x90,0xF0,0x10,0x10,0x00, - - 5, // 0x35 '5' - 0x00,0xF0,0x80,0x80,0xE0,0x10,0x10,0x90,0x60,0x00, - - 5, // 0x36 '6' - 0x00,0x60,0x80,0x80,0xE0,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x37 '7' - 0x00,0xF0,0x10,0x10,0x20,0x20,0x40,0x40,0x40,0x00, - - 5, // 0x38 '8' - 0x00,0x60,0x90,0x90,0x60,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x39 '9' - 0x00,0x60,0x90,0x90,0x90,0x70,0x10,0x10,0x60,0x00, - - 5, // 0x3A ':' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00, - - 5, // 0x3B ';' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0xC0, - - 5, // 0x3C '<' - 0x00,0x08,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x08, - - 5, // 0x3D '=' - 0x00,0x00,0x00,0x00,0xF0,0x00,0xF0,0x00,0x00,0x00, - - 5, // 0x3E '>' - 0x00,0x80,0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x80, - - 5, // 0x3F '?' - 0x00,0x60,0x90,0x10,0x10,0x20,0x40,0x00,0x40,0x00, - - 5, // 0x40 '@' - 0x00,0x60,0x90,0x90,0xB0,0xB0,0x80,0x80,0x70,0x00, - - 5, // 0x41 'A' - 0x00,0x60,0x90,0x90,0x90,0xF0,0x90,0x90,0x90,0x00, - - 5, // 0x42 'B' - 0x00,0xE0,0x90,0x90,0xE0,0x90,0x90,0x90,0xE0,0x00, - - 5, // 0x43 'C' - 0x00,0x60,0x90,0x80,0x80,0x80,0x80,0x90,0x60,0x00, - - 5, // 0x44 'D' - 0x00,0xE0,0x90,0x90,0x90,0x90,0x90,0x90,0xE0,0x00, - - 5, // 0x45 'E' - 0x00,0xF0,0x80,0x80,0xF0,0x80,0x80,0x80,0xF0,0x00, - - 5, // 0x46 'F' - 0x00,0xF0,0x80,0x80,0xF0,0x80,0x80,0x80,0x80,0x00, - - 5, // 0x47 'G' - 0x00,0x60,0x90,0x80,0x80,0xB0,0x90,0x90,0x60,0x00, - - 5, // 0x48 'H' - 0x00,0x90,0x90,0x90,0x90,0xF0,0x90,0x90,0x90,0x00, - - 5, // 0x49 'I' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00, - - 5, // 0x4A 'J' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0xA0,0x40,0x00, - - 5, // 0x4B 'K' - 0x00,0x90,0xA0,0xA0,0xC0,0xC0,0xA0,0xA0,0x90,0x00, - - 5, // 0x4C 'L' - 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xF0,0x00, - - 5, // 0x4D 'M' - 0x00,0x90,0x90,0xF0,0xF0,0x90,0x90,0x90,0x90,0x00, - - 5, // 0x4E 'N' - 0x00,0x90,0x90,0xD0,0xD0,0xB0,0xB0,0x90,0x90,0x00, - - 5, // 0x4F 'O' - 0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x50 'P' - 0x00,0xE0,0x90,0x90,0x90,0xE0,0x80,0x80,0x80,0x00, - - 5, // 0x51 'Q' - 0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x30, - - 5, // 0x52 'R' - 0x00,0xE0,0x90,0x90,0x90,0xE0,0xA0,0x90,0x90,0x00, - - 5, // 0x53 'S' - 0x00,0x60,0x90,0x80,0x60,0x10,0x90,0x90,0x60,0x00, - - 5, // 0x54 'T' - 0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00, - - 5, // 0x55 'U' - 0x00,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x56 'V' - 0x00,0x90,0x90,0x90,0x50,0x50,0x50,0x20,0x20,0x00, - - 5, // 0x57 'W' - 0x00,0x90,0x90,0x90,0x90,0x90,0xF0,0xF0,0x90,0x00, - - 5, // 0x58 'X' - 0x00,0x90,0x90,0x90,0x60,0x60,0x90,0x90,0x90,0x00, - - 5, // 0x59 'Y' - 0x00,0x88,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x00, - - 5, // 0x5A 'Z' - 0x00,0xF0,0x10,0x20,0x20,0x40,0x40,0x80,0xF0,0x00, - - 5, // 0x5B '[' - 0x60,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x60, - - 5, // 0x5C '\' - 0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08, - - 5, // 0x5D ']' - 0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x60, - - 5, // 0x5E '^' - 0x00,0x20,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00, - - 5, // 0x60 '`' - 0x00,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x61 'a' - 0x00,0x00,0x00,0x60,0x10,0x70,0x90,0x90,0x70,0x00, - - 5, // 0x62 'b' - 0x00,0x80,0x80,0xE0,0x90,0x90,0x90,0x90,0xE0,0x00, - - 5, // 0x63 'c' - 0x00,0x00,0x00,0x60,0x90,0x80,0x80,0x90,0x60,0x00, - - 5, // 0x64 'd' - 0x00,0x10,0x10,0x70,0x90,0x90,0x90,0x90,0x70,0x00, - - 5, // 0x65 'e' - 0x00,0x00,0x00,0x60,0x90,0x90,0xF0,0x80,0x70,0x00, - - 5, // 0x66 'f' - 0x00,0x30,0x40,0xE0,0x40,0x40,0x40,0x40,0x40,0x00, - - 5, // 0x67 'g' - 0x00,0x00,0x00,0x70,0x90,0x90,0x90,0x70,0x10,0xE0, - - 5, // 0x68 'h' - 0x00,0x80,0x80,0xE0,0x90,0x90,0x90,0x90,0x90,0x00, - - 5, // 0x69 'i' - 0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00, - - 5, // 0x6A 'j' - 0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0xC0, - - 5, // 0x6B 'k' - 0x00,0x80,0x80,0x90,0xA0,0xC0,0xA0,0x90,0x90,0x00, - - 5, // 0x6C 'l' - 0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00, - - 5, // 0x6D 'm' - 0x00,0x00,0x00,0x90,0xF0,0x90,0x90,0x90,0x90,0x00, - - 5, // 0x6E 'n' - 0x00,0x00,0x00,0xE0,0x90,0x90,0x90,0x90,0x90,0x00, - - 5, // 0x6F 'o' - 0x00,0x00,0x00,0x60,0x90,0x90,0x90,0x90,0x60,0x00, - - 5, // 0x70 'p' - 0x00,0x00,0x00,0xE0,0x90,0x90,0x90,0xE0,0x80,0x80, - - 5, // 0x71 'q' - 0x00,0x00,0x00,0x70,0x90,0x90,0x90,0x70,0x10,0x10, - - 5, // 0x72 'r' - 0x00,0x00,0x00,0xB0,0x50,0x40,0x40,0x40,0xE0,0x00, - - 5, // 0x73 's' - 0x00,0x00,0x00,0x60,0x90,0x40,0x20,0x90,0x60,0x00, - - 5, // 0x74 't' - 0x00,0x40,0x40,0xE0,0x40,0x40,0x40,0x50,0x20,0x00, - - 5, // 0x75 'u' - 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0x90,0x70,0x00, - - 5, // 0x76 'v' - 0x00,0x00,0x00,0x90,0x90,0x50,0x50,0x20,0x20,0x00, - - 5, // 0x77 'w' - 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0xF0,0x90,0x00, - - 5, // 0x78 'x' - 0x00,0x00,0x00,0x90,0x90,0x60,0x60,0x90,0x90,0x00, - - 5, // 0x79 'y' - 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0x70,0x10,0xE0, - - 5, // 0x7A 'z' - 0x00,0x00,0x00,0xF0,0x10,0x20,0x40,0x80,0xF0,0x00, - - 5, // 0x7B '{' - 0x30,0x40,0x40,0x40,0x80,0x40,0x40,0x40,0x40,0x30, - - 5, // 0x7C '|' - 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - - 5, // 0x7D '}' - 0xC0,0x20,0x20,0x20,0x10,0x20,0x20,0x20,0x20,0xC0, - - 5, // 0x7E '~' - 0x00,0x40,0xA8,0x10,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x7F '' - 0x00,0x20,0x70,0xD8,0x88,0x88,0xF8,0x00,0x00,0x00, - - 0 - }; - - const int8u mcs5x11_mono[] = - { - 11, 3, 32, 128-32, - 0x00,0x00,0x0C,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x3C,0x00,0x48,0x00,0x54,0x00,0x60,0x00, - 0x6C,0x00,0x78,0x00,0x84,0x00,0x90,0x00,0x9C,0x00,0xA8,0x00,0xB4,0x00,0xC0,0x00,0xCC,0x00, - 0xD8,0x00,0xE4,0x00,0xF0,0x00,0xFC,0x00,0x08,0x01,0x14,0x01,0x20,0x01,0x2C,0x01,0x38,0x01, - 0x44,0x01,0x50,0x01,0x5C,0x01,0x68,0x01,0x74,0x01,0x80,0x01,0x8C,0x01,0x98,0x01,0xA4,0x01, - 0xB0,0x01,0xBC,0x01,0xC8,0x01,0xD4,0x01,0xE0,0x01,0xEC,0x01,0xF8,0x01,0x04,0x02,0x10,0x02, - 0x1C,0x02,0x28,0x02,0x34,0x02,0x40,0x02,0x4C,0x02,0x58,0x02,0x64,0x02,0x70,0x02,0x7C,0x02, - 0x88,0x02,0x94,0x02,0xA0,0x02,0xAC,0x02,0xB8,0x02,0xC4,0x02,0xD0,0x02,0xDC,0x02,0xE8,0x02, - 0xF4,0x02,0x00,0x03,0x0C,0x03,0x18,0x03,0x24,0x03,0x30,0x03,0x3C,0x03,0x48,0x03,0x54,0x03, - 0x60,0x03,0x6C,0x03,0x78,0x03,0x84,0x03,0x90,0x03,0x9C,0x03,0xA8,0x03,0xB4,0x03,0xC0,0x03, - 0xCC,0x03,0xD8,0x03,0xE4,0x03,0xF0,0x03,0xFC,0x03,0x08,0x04,0x14,0x04,0x20,0x04,0x2C,0x04, - 0x38,0x04,0x44,0x04,0x50,0x04,0x5C,0x04,0x68,0x04,0x74,0x04, - - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x21 '!' - 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, - - 5, // 0x22 '"' - 0x00,0x50,0x50,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x23 '#' - 0x00,0x50,0x50,0xF8,0x50,0x50,0x50,0xF8,0x50,0x50,0x00, - - 5, // 0x24 '$' - 0x00,0x40,0x60,0x90,0x80,0x60,0x10,0x90,0x60,0x20,0x00, - - 5, // 0x25 '%' - 0x00,0x00,0x90,0x90,0x20,0x20,0x40,0x40,0x90,0x90,0x00, - - 5, // 0x26 '&' - 0x00,0x40,0xA0,0xA0,0x40,0xA8,0x90,0x90,0x68,0x00,0x00, - - 5, // 0x27 ''' - 0x00,0x20,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x28 '(' - 0x00,0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x20,0x20,0x10, - - 5, // 0x29 ')' - 0x00,0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x20,0x20,0x40, - - 5, // 0x2A '*' - 0x00,0x00,0x90,0x60,0xF0,0x60,0x90,0x00,0x00,0x00,0x00, - - 5, // 0x2B '+' - 0x00,0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x00,0x00,0x00, - - 5, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x40,0x80, - - 5, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00, - - 5, // 0x2F '/' - 0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80,0x00, - - 5, // 0x30 '0' - 0x00,0x70,0x90,0x90,0x90,0x90,0x90,0x90,0xE0,0x00,0x00, - - 5, // 0x31 '1' - 0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - - 5, // 0x32 '2' - 0x00,0x60,0x90,0x90,0x10,0x20,0x40,0x80,0xF0,0x00,0x00, - - 5, // 0x33 '3' - 0x00,0x60,0x90,0x10,0x60,0x10,0x10,0x90,0x60,0x00,0x00, - - 5, // 0x34 '4' - 0x00,0x10,0x30,0x50,0x50,0x90,0xF8,0x10,0x10,0x00,0x00, - - 5, // 0x35 '5' - 0x00,0xF0,0x80,0xE0,0x90,0x10,0x10,0x90,0x60,0x00,0x00, - - 5, // 0x36 '6' - 0x00,0x60,0x90,0x80,0xE0,0x90,0x90,0x90,0x60,0x00,0x00, - - 5, // 0x37 '7' - 0x00,0xF0,0x10,0x10,0x20,0x20,0x40,0x40,0x40,0x00,0x00, - - 5, // 0x38 '8' - 0x00,0x60,0x90,0x90,0x60,0x90,0x90,0x90,0x60,0x00,0x00, - - 5, // 0x39 '9' - 0x00,0x60,0x90,0x90,0x90,0x70,0x10,0x90,0x60,0x00,0x00, - - 5, // 0x3A ':' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00, - - 5, // 0x3B ';' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x40,0x80, - - 5, // 0x3C '<' - 0x00,0x08,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x08,0x00, - - 5, // 0x3D '=' - 0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0xF0,0x00,0x00,0x00, - - 5, // 0x3E '>' - 0x00,0x80,0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x80,0x00, - - 5, // 0x3F '?' - 0x00,0x60,0x90,0x10,0x10,0x20,0x40,0x00,0x40,0x00,0x00, - - 5, // 0x40 '@' - 0x00,0x60,0x90,0x90,0xB0,0xB0,0x80,0x80,0x70,0x00,0x00, - - 5, // 0x41 'A' - 0x00,0x60,0x90,0x90,0x90,0xF0,0x90,0x90,0x90,0x00,0x00, - - 5, // 0x42 'B' - 0x00,0xE0,0x90,0x90,0xE0,0x90,0x90,0x90,0xE0,0x00,0x00, - - 5, // 0x43 'C' - 0x00,0x60,0x90,0x80,0x80,0x80,0x80,0x90,0x60,0x00,0x00, - - 5, // 0x44 'D' - 0x00,0xE0,0x90,0x90,0x90,0x90,0x90,0x90,0xE0,0x00,0x00, - - 5, // 0x45 'E' - 0x00,0xF0,0x80,0x80,0xE0,0x80,0x80,0x80,0xF0,0x00,0x00, - - 5, // 0x46 'F' - 0x00,0xF0,0x80,0x80,0xE0,0x80,0x80,0x80,0x80,0x00,0x00, - - 5, // 0x47 'G' - 0x00,0x60,0x90,0x80,0x80,0xB0,0x90,0x90,0x60,0x00,0x00, - - 5, // 0x48 'H' - 0x00,0x90,0x90,0x90,0xF0,0x90,0x90,0x90,0x90,0x00,0x00, - - 5, // 0x49 'I' - 0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - - 5, // 0x4A 'J' - 0x00,0x70,0x20,0x20,0x20,0x20,0xA0,0xA0,0x40,0x00,0x00, - - 5, // 0x4B 'K' - 0x00,0x90,0xA0,0xA0,0xC0,0xA0,0xA0,0x90,0x90,0x00,0x00, - - 5, // 0x4C 'L' - 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xF0,0x00,0x00, - - 5, // 0x4D 'M' - 0x00,0x90,0xF0,0xF0,0x90,0x90,0x90,0x90,0x90,0x00,0x00, - - 5, // 0x4E 'N' - 0x00,0x90,0x90,0xD0,0xD0,0xB0,0xB0,0x90,0x90,0x00,0x00, - - 5, // 0x4F 'O' - 0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00,0x00, - - 5, // 0x50 'P' - 0x00,0xE0,0x90,0x90,0x90,0xE0,0x80,0x80,0x80,0x00,0x00, - - 5, // 0x51 'Q' - 0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x30,0x00, - - 5, // 0x52 'R' - 0x00,0xE0,0x90,0x90,0x90,0xE0,0xA0,0x90,0x90,0x00,0x00, - - 5, // 0x53 'S' - 0x00,0x60,0x90,0x80,0x60,0x10,0x90,0x90,0x60,0x00,0x00, - - 5, // 0x54 'T' - 0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00, - - 5, // 0x55 'U' - 0x00,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00,0x00, - - 5, // 0x56 'V' - 0x00,0x90,0x90,0x90,0x50,0x50,0x50,0x20,0x20,0x00,0x00, - - 5, // 0x57 'W' - 0x00,0x90,0x90,0x90,0x90,0x90,0xF0,0xF0,0x90,0x00,0x00, - - 5, // 0x58 'X' - 0x00,0x90,0x90,0x90,0x60,0x60,0x90,0x90,0x90,0x00,0x00, - - 5, // 0x59 'Y' - 0x00,0x88,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x00,0x00, - - 5, // 0x5A 'Z' - 0x00,0xF0,0x10,0x20,0x20,0x40,0x40,0x80,0xF0,0x00,0x00, - - 5, // 0x5B '[' - 0x00,0x60,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x60, - - 5, // 0x5C '\' - 0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x00, - - 5, // 0x5D ']' - 0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x60, - - 5, // 0x5E '^' - 0x00,0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00, - - 5, // 0x60 '`' - 0x00,0x40,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x61 'a' - 0x00,0x00,0x00,0x60,0x10,0x70,0x90,0x90,0x70,0x00,0x00, - - 5, // 0x62 'b' - 0x00,0x80,0x80,0xE0,0x90,0x90,0x90,0x90,0xE0,0x00,0x00, - - 5, // 0x63 'c' - 0x00,0x00,0x00,0x60,0x90,0x80,0x80,0x90,0x60,0x00,0x00, - - 5, // 0x64 'd' - 0x00,0x10,0x10,0x70,0x90,0x90,0x90,0x90,0x70,0x00,0x00, - - 5, // 0x65 'e' - 0x00,0x00,0x00,0x60,0x90,0x90,0xF0,0x80,0x70,0x00,0x00, - - 5, // 0x66 'f' - 0x00,0x30,0x40,0xE0,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - - 5, // 0x67 'g' - 0x00,0x00,0x00,0x70,0x90,0x90,0x90,0x90,0x70,0x10,0xE0, - - 5, // 0x68 'h' - 0x00,0x80,0x80,0xE0,0x90,0x90,0x90,0x90,0x90,0x00,0x00, - - 5, // 0x69 'i' - 0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - - 5, // 0x6A 'j' - 0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0xA0,0x40, - - 5, // 0x6B 'k' - 0x00,0x80,0x80,0x90,0xA0,0xC0,0xA0,0x90,0x90,0x00,0x00, - - 5, // 0x6C 'l' - 0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - - 5, // 0x6D 'm' - 0x00,0x00,0x00,0x90,0xF0,0x90,0x90,0x90,0x90,0x00,0x00, - - 5, // 0x6E 'n' - 0x00,0x00,0x00,0xE0,0x90,0x90,0x90,0x90,0x90,0x00,0x00, - - 5, // 0x6F 'o' - 0x00,0x00,0x00,0x60,0x90,0x90,0x90,0x90,0x60,0x00,0x00, - - 5, // 0x70 'p' - 0x00,0x00,0x00,0xE0,0x90,0x90,0x90,0x90,0xE0,0x80,0x80, - - 5, // 0x71 'q' - 0x00,0x00,0x00,0x70,0x90,0x90,0x90,0x90,0x70,0x10,0x10, - - 5, // 0x72 'r' - 0x00,0x00,0x00,0xA0,0x50,0x40,0x40,0x40,0xE0,0x00,0x00, - - 5, // 0x73 's' - 0x00,0x00,0x00,0x60,0x90,0x40,0x20,0x90,0x60,0x00,0x00, - - 5, // 0x74 't' - 0x00,0x40,0x40,0xE0,0x40,0x40,0x40,0x40,0x30,0x00,0x00, - - 5, // 0x75 'u' - 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0x90,0x70,0x00,0x00, - - 5, // 0x76 'v' - 0x00,0x00,0x00,0x90,0x90,0x50,0x50,0x20,0x20,0x00,0x00, - - 5, // 0x77 'w' - 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0xF0,0x90,0x00,0x00, - - 5, // 0x78 'x' - 0x00,0x00,0x00,0x90,0x90,0x60,0x60,0x90,0x90,0x00,0x00, - - 5, // 0x79 'y' - 0x00,0x00,0x00,0x90,0x90,0x90,0x90,0x90,0x70,0x10,0xE0, - - 5, // 0x7A 'z' - 0x00,0x00,0x00,0xF0,0x10,0x20,0x40,0x80,0xF0,0x00,0x00, - - 5, // 0x7B '{' - 0x30,0x40,0x40,0x40,0x40,0x80,0x40,0x40,0x40,0x40,0x30, - - 5, // 0x7C '|' - 0x00,0x20,0x20,0x20,0x20,0x00,0x20,0x20,0x20,0x20,0x00, - - 5, // 0x7D '}' - 0xC0,0x20,0x20,0x20,0x20,0x10,0x20,0x20,0x20,0x20,0xC0, - - 5, // 0x7E '~' - 0x00,0x40,0xA8,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x7F '' - 0x00,0x20,0x70,0xD8,0x88,0x88,0xF8,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u mcs6x10_mono[] = - { - 10, 3, 32, 128-32, - 0x00,0x00,0x0B,0x00,0x16,0x00,0x21,0x00,0x2C,0x00,0x37,0x00,0x42,0x00,0x4D,0x00,0x58,0x00, - 0x63,0x00,0x6E,0x00,0x79,0x00,0x84,0x00,0x8F,0x00,0x9A,0x00,0xA5,0x00,0xB0,0x00,0xBB,0x00, - 0xC6,0x00,0xD1,0x00,0xDC,0x00,0xE7,0x00,0xF2,0x00,0xFD,0x00,0x08,0x01,0x13,0x01,0x1E,0x01, - 0x29,0x01,0x34,0x01,0x3F,0x01,0x4A,0x01,0x55,0x01,0x60,0x01,0x6B,0x01,0x76,0x01,0x81,0x01, - 0x8C,0x01,0x97,0x01,0xA2,0x01,0xAD,0x01,0xB8,0x01,0xC3,0x01,0xCE,0x01,0xD9,0x01,0xE4,0x01, - 0xEF,0x01,0xFA,0x01,0x05,0x02,0x10,0x02,0x1B,0x02,0x26,0x02,0x31,0x02,0x3C,0x02,0x47,0x02, - 0x52,0x02,0x5D,0x02,0x68,0x02,0x73,0x02,0x7E,0x02,0x89,0x02,0x94,0x02,0x9F,0x02,0xAA,0x02, - 0xB5,0x02,0xC0,0x02,0xCB,0x02,0xD6,0x02,0xE1,0x02,0xEC,0x02,0xF7,0x02,0x02,0x03,0x0D,0x03, - 0x18,0x03,0x23,0x03,0x2E,0x03,0x39,0x03,0x44,0x03,0x4F,0x03,0x5A,0x03,0x65,0x03,0x70,0x03, - 0x7B,0x03,0x86,0x03,0x91,0x03,0x9C,0x03,0xA7,0x03,0xB2,0x03,0xBD,0x03,0xC8,0x03,0xD3,0x03, - 0xDE,0x03,0xE9,0x03,0xF4,0x03,0xFF,0x03,0x0A,0x04,0x15,0x04, - - 6, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x21 '!' - 0x00,0x10,0x10,0x10,0x10,0x10,0x00,0x10,0x00,0x00, - - 6, // 0x22 '"' - 0x00,0x28,0x28,0x50,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x23 '#' - 0x00,0x28,0x28,0x7C,0x28,0x28,0x7C,0x28,0x28,0x00, - - 6, // 0x24 '$' - 0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x00, - - 6, // 0x25 '%' - 0x00,0x08,0xC8,0xD0,0x10,0x20,0x2C,0x4C,0x40,0x00, - - 6, // 0x26 '&' - 0x00,0x20,0x50,0x50,0x24,0x54,0x48,0x34,0x00,0x00, - - 6, // 0x27 ''' - 0x00,0x10,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x28 '(' - 0x08,0x10,0x10,0x20,0x20,0x20,0x10,0x10,0x08,0x00, - - 6, // 0x29 ')' - 0x20,0x10,0x10,0x08,0x08,0x08,0x10,0x10,0x20,0x00, - - 6, // 0x2A '*' - 0x00,0x00,0x28,0x7C,0x38,0x7C,0x28,0x00,0x00,0x00, - - 6, // 0x2B '+' - 0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00, - - 6, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x20,0x40, - - 6, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00, - - 6, // 0x2F '/' - 0x00,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00, - - 6, // 0x30 '0' - 0x00,0x38,0x44,0x4C,0x54,0x64,0x44,0x38,0x00,0x00, - - 6, // 0x31 '1' - 0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - - 6, // 0x32 '2' - 0x00,0x38,0x44,0x04,0x18,0x20,0x40,0x7C,0x00,0x00, - - 6, // 0x33 '3' - 0x00,0x38,0x44,0x04,0x38,0x04,0x44,0x38,0x00,0x00, - - 6, // 0x34 '4' - 0x00,0x08,0x18,0x28,0x48,0x7C,0x08,0x08,0x00,0x00, - - 6, // 0x35 '5' - 0x00,0x7C,0x40,0x40,0x78,0x04,0x44,0x38,0x00,0x00, - - 6, // 0x36 '6' - 0x00,0x38,0x40,0x40,0x78,0x44,0x44,0x38,0x00,0x00, - - 6, // 0x37 '7' - 0x00,0x7C,0x04,0x08,0x10,0x20,0x20,0x20,0x00,0x00, - - 6, // 0x38 '8' - 0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x38,0x00,0x00, - - 6, // 0x39 '9' - 0x00,0x38,0x44,0x44,0x3C,0x04,0x04,0x38,0x00,0x00, - - 6, // 0x3A ':' - 0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00,0x00, - - 6, // 0x3B ';' - 0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x20,0x40, - - 6, // 0x3C '<' - 0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00, - - 6, // 0x3D '=' - 0x00,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00, - - 6, // 0x3E '>' - 0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00, - - 6, // 0x3F '?' - 0x00,0x38,0x44,0x04,0x18,0x10,0x00,0x10,0x00,0x00, - - 6, // 0x40 '@' - 0x00,0x38,0x44,0x5C,0x54,0x5C,0x40,0x38,0x00,0x00, - - 6, // 0x41 'A' - 0x00,0x38,0x44,0x44,0x44,0x7C,0x44,0x44,0x00,0x00, - - 6, // 0x42 'B' - 0x00,0x78,0x44,0x44,0x78,0x44,0x44,0x78,0x00,0x00, - - 6, // 0x43 'C' - 0x00,0x38,0x44,0x40,0x40,0x40,0x44,0x38,0x00,0x00, - - 6, // 0x44 'D' - 0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x00,0x00, - - 6, // 0x45 'E' - 0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x7C,0x00,0x00, - - 6, // 0x46 'F' - 0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x40,0x00,0x00, - - 6, // 0x47 'G' - 0x00,0x38,0x44,0x40,0x4C,0x44,0x44,0x3C,0x00,0x00, - - 6, // 0x48 'H' - 0x00,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x00,0x00, - - 6, // 0x49 'I' - 0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - - 6, // 0x4A 'J' - 0x00,0x1C,0x08,0x08,0x08,0x48,0x48,0x30,0x00,0x00, - - 6, // 0x4B 'K' - 0x00,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00, - - 6, // 0x4C 'L' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00, - - 6, // 0x4D 'M' - 0x00,0x44,0x6C,0x54,0x54,0x44,0x44,0x44,0x00,0x00, - - 6, // 0x4E 'N' - 0x00,0x44,0x44,0x64,0x54,0x4C,0x44,0x44,0x00,0x00, - - 6, // 0x4F 'O' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 6, // 0x50 'P' - 0x00,0x78,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00, - - 6, // 0x51 'Q' - 0x00,0x38,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00, - - 6, // 0x52 'R' - 0x00,0x78,0x44,0x44,0x78,0x48,0x44,0x44,0x00,0x00, - - 6, // 0x53 'S' - 0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x38,0x00,0x00, - - 6, // 0x54 'T' - 0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - - 6, // 0x55 'U' - 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 6, // 0x56 'V' - 0x00,0x44,0x44,0x44,0x44,0x28,0x28,0x10,0x00,0x00, - - 6, // 0x57 'W' - 0x00,0x44,0x44,0x54,0x54,0x54,0x54,0x28,0x00,0x00, - - 6, // 0x58 'X' - 0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00, - - 6, // 0x59 'Y' - 0x00,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x00,0x00, - - 6, // 0x5A 'Z' - 0x00,0x78,0x08,0x10,0x20,0x40,0x40,0x78,0x00,0x00, - - 6, // 0x5B '[' - 0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00, - - 6, // 0x5C '\' - 0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x00, - - 6, // 0x5D ']' - 0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x38,0x00, - - 6, // 0x5E '^' - 0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00, - - 6, // 0x60 '`' - 0x00,0x10,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x61 'a' - 0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x3C,0x00,0x00, - - 6, // 0x62 'b' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x78,0x00,0x00, - - 6, // 0x63 'c' - 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x3C,0x00,0x00, - - 6, // 0x64 'd' - 0x00,0x04,0x04,0x3C,0x44,0x44,0x44,0x3C,0x00,0x00, - - 6, // 0x65 'e' - 0x00,0x00,0x00,0x38,0x44,0x78,0x40,0x3C,0x00,0x00, - - 6, // 0x66 'f' - 0x00,0x0C,0x10,0x10,0x38,0x10,0x10,0x10,0x00,0x00, - - 6, // 0x67 'g' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x3C,0x04,0x38, - - 6, // 0x68 'h' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x00,0x00, - - 6, // 0x69 'i' - 0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x38,0x00,0x00, - - 6, // 0x6A 'j' - 0x00,0x08,0x00,0x18,0x08,0x08,0x08,0x08,0x48,0x30, - - 6, // 0x6B 'k' - 0x00,0x40,0x40,0x48,0x50,0x60,0x50,0x48,0x00,0x00, - - 6, // 0x6C 'l' - 0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - - 6, // 0x6D 'm' - 0x00,0x00,0x00,0x68,0x54,0x54,0x44,0x44,0x00,0x00, - - 6, // 0x6E 'n' - 0x00,0x00,0x00,0x58,0x64,0x44,0x44,0x44,0x00,0x00, - - 6, // 0x6F 'o' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x38,0x00,0x00, - - 6, // 0x70 'p' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x78,0x40,0x40, - - 6, // 0x71 'q' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x3C,0x04,0x04, - - 6, // 0x72 'r' - 0x00,0x00,0x00,0x58,0x24,0x20,0x20,0x70,0x00,0x00, - - 6, // 0x73 's' - 0x00,0x00,0x00,0x38,0x40,0x38,0x04,0x78,0x00,0x00, - - 6, // 0x74 't' - 0x00,0x10,0x10,0x38,0x10,0x10,0x14,0x08,0x00,0x00, - - 6, // 0x75 'u' - 0x00,0x00,0x00,0x44,0x44,0x44,0x4C,0x34,0x00,0x00, - - 6, // 0x76 'v' - 0x00,0x00,0x00,0x44,0x44,0x44,0x28,0x10,0x00,0x00, - - 6, // 0x77 'w' - 0x00,0x00,0x00,0x44,0x44,0x54,0x7C,0x28,0x00,0x00, - - 6, // 0x78 'x' - 0x00,0x00,0x00,0x48,0x48,0x30,0x48,0x48,0x00,0x00, - - 6, // 0x79 'y' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x3C,0x04,0x38, - - 6, // 0x7A 'z' - 0x00,0x00,0x00,0x78,0x08,0x30,0x40,0x78,0x00,0x00, - - 6, // 0x7B '{' - 0x18,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x18,0x00, - - 6, // 0x7C '|' - 0x10,0x10,0x10,0x10,0x00,0x10,0x10,0x10,0x10,0x00, - - 6, // 0x7D '}' - 0x60,0x10,0x10,0x10,0x0C,0x10,0x10,0x10,0x60,0x00, - - 6, // 0x7E '~' - 0x00,0x48,0xA8,0x90,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x7F '' - 0x00,0x10,0x38,0x6C,0x44,0x44,0x7C,0x00,0x00,0x00, - - 0 - }; - - const int8u mcs6x11_mono[] = - { - 11, 3, 32, 128-32, - 0x00,0x00,0x0C,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x3C,0x00,0x48,0x00,0x54,0x00,0x60,0x00, - 0x6C,0x00,0x78,0x00,0x84,0x00,0x90,0x00,0x9C,0x00,0xA8,0x00,0xB4,0x00,0xC0,0x00,0xCC,0x00, - 0xD8,0x00,0xE4,0x00,0xF0,0x00,0xFC,0x00,0x08,0x01,0x14,0x01,0x20,0x01,0x2C,0x01,0x38,0x01, - 0x44,0x01,0x50,0x01,0x5C,0x01,0x68,0x01,0x74,0x01,0x80,0x01,0x8C,0x01,0x98,0x01,0xA4,0x01, - 0xB0,0x01,0xBC,0x01,0xC8,0x01,0xD4,0x01,0xE0,0x01,0xEC,0x01,0xF8,0x01,0x04,0x02,0x10,0x02, - 0x1C,0x02,0x28,0x02,0x34,0x02,0x40,0x02,0x4C,0x02,0x58,0x02,0x64,0x02,0x70,0x02,0x7C,0x02, - 0x88,0x02,0x94,0x02,0xA0,0x02,0xAC,0x02,0xB8,0x02,0xC4,0x02,0xD0,0x02,0xDC,0x02,0xE8,0x02, - 0xF4,0x02,0x00,0x03,0x0C,0x03,0x18,0x03,0x24,0x03,0x30,0x03,0x3C,0x03,0x48,0x03,0x54,0x03, - 0x60,0x03,0x6C,0x03,0x78,0x03,0x84,0x03,0x90,0x03,0x9C,0x03,0xA8,0x03,0xB4,0x03,0xC0,0x03, - 0xCC,0x03,0xD8,0x03,0xE4,0x03,0xF0,0x03,0xFC,0x03,0x08,0x04,0x14,0x04,0x20,0x04,0x2C,0x04, - 0x38,0x04,0x44,0x04,0x50,0x04,0x5C,0x04,0x68,0x04,0x74,0x04, - - 6, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x21 '!' - 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, - - 6, // 0x22 '"' - 0x00,0x28,0x28,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x23 '#' - 0x00,0x28,0x28,0x7C,0x28,0x28,0x7C,0x28,0x28,0x00,0x00, - - 6, // 0x24 '$' - 0x00,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x00, - - 6, // 0x25 '%' - 0x00,0x68,0xA8,0xD0,0x10,0x20,0x2C,0x54,0x58,0x00,0x00, - - 6, // 0x26 '&' - 0x00,0x20,0x50,0x50,0x20,0x54,0x54,0x48,0x34,0x00,0x00, - - 6, // 0x27 ''' - 0x00,0x10,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x28 '(' - 0x08,0x10,0x10,0x20,0x20,0x20,0x20,0x10,0x10,0x08,0x00, - - 6, // 0x29 ')' - 0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x00, - - 6, // 0x2A '*' - 0x00,0x00,0x28,0x7C,0x38,0x7C,0x28,0x00,0x00,0x00,0x00, - - 6, // 0x2B '+' - 0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00, - - 6, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x20,0x40, - - 6, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00, - - 6, // 0x2F '/' - 0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00, - - 6, // 0x30 '0' - 0x00,0x38,0x44,0x44,0x54,0x54,0x44,0x44,0x38,0x00,0x00, - - 6, // 0x31 '1' - 0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - - 6, // 0x32 '2' - 0x00,0x38,0x44,0x44,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, - - 6, // 0x33 '3' - 0x00,0x38,0x44,0x04,0x38,0x04,0x04,0x44,0x38,0x00,0x00, - - 6, // 0x34 '4' - 0x00,0x08,0x18,0x28,0x28,0x48,0x7C,0x08,0x08,0x00,0x00, - - 6, // 0x35 '5' - 0x00,0x7C,0x40,0x78,0x44,0x04,0x04,0x44,0x38,0x00,0x00, - - 6, // 0x36 '6' - 0x00,0x38,0x44,0x40,0x78,0x44,0x44,0x44,0x38,0x00,0x00, - - 6, // 0x37 '7' - 0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x00,0x00, - - 6, // 0x38 '8' - 0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00,0x00, - - 6, // 0x39 '9' - 0x00,0x38,0x44,0x44,0x3C,0x04,0x04,0x44,0x38,0x00,0x00, - - 6, // 0x3A ':' - 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00,0x00, - - 6, // 0x3B ';' - 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x20,0x40, - - 6, // 0x3C '<' - 0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00, - - 6, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00, - - 6, // 0x3E '>' - 0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00, - - 6, // 0x3F '?' - 0x00,0x38,0x44,0x04,0x08,0x10,0x10,0x00,0x10,0x00,0x00, - - 6, // 0x40 '@' - 0x00,0x38,0x44,0x5C,0x54,0x54,0x4C,0x40,0x38,0x00,0x00, - - 6, // 0x41 'A' - 0x00,0x38,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x00,0x00, - - 6, // 0x42 'B' - 0x00,0x78,0x44,0x44,0x78,0x44,0x44,0x44,0x78,0x00,0x00, - - 6, // 0x43 'C' - 0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x44,0x38,0x00,0x00, - - 6, // 0x44 'D' - 0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x48,0x70,0x00,0x00, - - 6, // 0x45 'E' - 0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x40,0x7C,0x00,0x00, - - 6, // 0x46 'F' - 0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x40,0x40,0x00,0x00, - - 6, // 0x47 'G' - 0x00,0x38,0x44,0x40,0x40,0x5C,0x44,0x4C,0x34,0x00,0x00, - - 6, // 0x48 'H' - 0x00,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00, - - 6, // 0x49 'I' - 0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - - 6, // 0x4A 'J' - 0x00,0x1C,0x08,0x08,0x08,0x08,0x48,0x48,0x30,0x00,0x00, - - 6, // 0x4B 'K' - 0x00,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x44,0x00,0x00, - - 6, // 0x4C 'L' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00, - - 6, // 0x4D 'M' - 0x00,0x44,0x6C,0x54,0x54,0x54,0x44,0x44,0x44,0x00,0x00, - - 6, // 0x4E 'N' - 0x00,0x44,0x64,0x64,0x54,0x54,0x4C,0x4C,0x44,0x00,0x00, - - 6, // 0x4F 'O' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 6, // 0x50 'P' - 0x00,0x78,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00, - - 6, // 0x51 'Q' - 0x00,0x38,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00, - - 6, // 0x52 'R' - 0x00,0x78,0x44,0x44,0x44,0x78,0x48,0x44,0x44,0x00,0x00, - - 6, // 0x53 'S' - 0x00,0x38,0x44,0x40,0x38,0x04,0x04,0x44,0x38,0x00,0x00, - - 6, // 0x54 'T' - 0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - - 6, // 0x55 'U' - 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 6, // 0x56 'V' - 0x00,0x44,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x00,0x00, - - 6, // 0x57 'W' - 0x00,0x44,0x44,0x54,0x54,0x54,0x54,0x54,0x28,0x00,0x00, - - 6, // 0x58 'X' - 0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00,0x00, - - 6, // 0x59 'Y' - 0x00,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x00,0x00, - - 6, // 0x5A 'Z' - 0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x40,0x7C,0x00,0x00, - - 6, // 0x5B '[' - 0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00, - - 6, // 0x5C '\' - 0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x00, - - 6, // 0x5D ']' - 0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x38,0x00, - - 6, // 0x5E '^' - 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00, - - 6, // 0x60 '`' - 0x00,0x20,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x61 'a' - 0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x44,0x3C,0x00,0x00, - - 6, // 0x62 'b' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x78,0x00,0x00, - - 6, // 0x63 'c' - 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x44,0x38,0x00,0x00, - - 6, // 0x64 'd' - 0x00,0x04,0x04,0x3C,0x44,0x44,0x44,0x44,0x3C,0x00,0x00, - - 6, // 0x65 'e' - 0x00,0x00,0x00,0x38,0x44,0x7C,0x40,0x44,0x38,0x00,0x00, - - 6, // 0x66 'f' - 0x00,0x0C,0x10,0x38,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - - 6, // 0x67 'g' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x3C,0x04,0x78, - - 6, // 0x68 'h' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x00,0x00, - - 6, // 0x69 'i' - 0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - - 6, // 0x6A 'j' - 0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x50,0x20, - - 6, // 0x6B 'k' - 0x00,0x40,0x40,0x4C,0x50,0x60,0x50,0x48,0x44,0x00,0x00, - - 6, // 0x6C 'l' - 0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - - 6, // 0x6D 'm' - 0x00,0x00,0x00,0x68,0x54,0x54,0x54,0x44,0x44,0x00,0x00, - - 6, // 0x6E 'n' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x00,0x00, - - 6, // 0x6F 'o' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 6, // 0x70 'p' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40, - - 6, // 0x71 'q' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x3C,0x04,0x04, - - 6, // 0x72 'r' - 0x00,0x00,0x00,0x58,0x24,0x20,0x20,0x20,0x70,0x00,0x00, - - 6, // 0x73 's' - 0x00,0x00,0x00,0x38,0x44,0x30,0x08,0x44,0x38,0x00,0x00, - - 6, // 0x74 't' - 0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x20,0x18,0x00,0x00, - - 6, // 0x75 'u' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x4C,0x34,0x00,0x00, - - 6, // 0x76 'v' - 0x00,0x00,0x00,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00, - - 6, // 0x77 'w' - 0x00,0x00,0x00,0x44,0x44,0x44,0x54,0x7C,0x28,0x00,0x00, - - 6, // 0x78 'x' - 0x00,0x00,0x00,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00, - - 6, // 0x79 'y' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x3C,0x08,0x70, - - 6, // 0x7A 'z' - 0x00,0x00,0x00,0x7C,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, - - 6, // 0x7B '{' - 0x18,0x20,0x20,0x20,0xC0,0xC0,0x20,0x20,0x20,0x18,0x00, - - 6, // 0x7C '|' - 0x00,0x10,0x10,0x10,0x10,0x00,0x10,0x10,0x10,0x10,0x00, - - 6, // 0x7D '}' - 0x60,0x10,0x10,0x10,0x0C,0x0C,0x10,0x10,0x10,0x60,0x00, - - 6, // 0x7E '~' - 0x00,0x24,0x54,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x7F '' - 0x00,0x10,0x38,0x6C,0x44,0x44,0x7C,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u mcs7x12_mono_high[] = - { - 12, 3, 32, 128-32, - 0x00,0x00,0x0D,0x00,0x1A,0x00,0x27,0x00,0x34,0x00,0x41,0x00,0x4E,0x00,0x5B,0x00,0x68,0x00, - 0x75,0x00,0x82,0x00,0x8F,0x00,0x9C,0x00,0xA9,0x00,0xB6,0x00,0xC3,0x00,0xD0,0x00,0xDD,0x00, - 0xEA,0x00,0xF7,0x00,0x04,0x01,0x11,0x01,0x1E,0x01,0x2B,0x01,0x38,0x01,0x45,0x01,0x52,0x01, - 0x5F,0x01,0x6C,0x01,0x79,0x01,0x86,0x01,0x93,0x01,0xA0,0x01,0xAD,0x01,0xBA,0x01,0xC7,0x01, - 0xD4,0x01,0xE1,0x01,0xEE,0x01,0xFB,0x01,0x08,0x02,0x15,0x02,0x22,0x02,0x2F,0x02,0x3C,0x02, - 0x49,0x02,0x56,0x02,0x63,0x02,0x70,0x02,0x7D,0x02,0x8A,0x02,0x97,0x02,0xA4,0x02,0xB1,0x02, - 0xBE,0x02,0xCB,0x02,0xD8,0x02,0xE5,0x02,0xF2,0x02,0xFF,0x02,0x0C,0x03,0x19,0x03,0x26,0x03, - 0x33,0x03,0x40,0x03,0x4D,0x03,0x5A,0x03,0x67,0x03,0x74,0x03,0x81,0x03,0x8E,0x03,0x9B,0x03, - 0xA8,0x03,0xB5,0x03,0xC2,0x03,0xCF,0x03,0xDC,0x03,0xE9,0x03,0xF6,0x03,0x03,0x04,0x10,0x04, - 0x1D,0x04,0x2A,0x04,0x37,0x04,0x44,0x04,0x51,0x04,0x5E,0x04,0x6B,0x04,0x78,0x04,0x85,0x04, - 0x92,0x04,0x9F,0x04,0xAC,0x04,0xB9,0x04,0xC6,0x04,0xD3,0x04, - - 7, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x21 '!' - 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x10,0x00,0x00, - - 7, // 0x22 '"' - 0x28,0x28,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x23 '#' - 0x24,0x24,0x24,0x7E,0x24,0x24,0x24,0x7E,0x24,0x24,0x24,0x00, - - 7, // 0x24 '$' - 0x10,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x10,0x00, - - 7, // 0x25 '%' - 0x32,0x54,0x64,0x08,0x08,0x10,0x10,0x26,0x2A,0x4C,0x00,0x00, - - 7, // 0x26 '&' - 0x00,0x20,0x50,0x50,0x50,0x20,0x54,0x54,0x48,0x34,0x00,0x00, - - 7, // 0x27 ''' - 0x10,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x28 '(' - 0x08,0x10,0x10,0x20,0x20,0x20,0x20,0x20,0x10,0x10,0x08,0x00, - - 7, // 0x29 ')' - 0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x00, - - 7, // 0x2A '*' - 0x00,0x00,0x10,0x54,0x38,0x7C,0x38,0x54,0x10,0x00,0x00,0x00, - - 7, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00, - - 7, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x20,0x40, - - 7, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00, - - 7, // 0x2F '/' - 0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00,0x00, - - 7, // 0x30 '0' - 0x00,0x38,0x44,0x44,0x54,0x54,0x54,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x31 '1' - 0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - - 7, // 0x32 '2' - 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, - - 7, // 0x33 '3' - 0x00,0x38,0x44,0x04,0x04,0x38,0x04,0x04,0x44,0x38,0x00,0x00, - - 7, // 0x34 '4' - 0x00,0x08,0x18,0x28,0x28,0x48,0x48,0x7C,0x08,0x08,0x00,0x00, - - 7, // 0x35 '5' - 0x00,0x7C,0x40,0x40,0x78,0x44,0x04,0x04,0x44,0x38,0x00,0x00, - - 7, // 0x36 '6' - 0x00,0x38,0x44,0x40,0x78,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x37 '7' - 0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x20,0x00,0x00, - - 7, // 0x38 '8' - 0x00,0x38,0x44,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x39 '9' - 0x00,0x38,0x44,0x44,0x44,0x3C,0x04,0x04,0x44,0x38,0x00,0x00, - - 7, // 0x3A ':' - 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x30,0x30,0x00,0x00, - - 7, // 0x3B ';' - 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x30,0x30,0x20,0x40, - - 7, // 0x3C '<' - 0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00,0x00, - - 7, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00,0x00, - - 7, // 0x3E '>' - 0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00,0x00, - - 7, // 0x3F '?' - 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x10,0x00,0x10,0x00,0x00, - - 7, // 0x40 '@' - 0x00,0x38,0x44,0x44,0x5C,0x54,0x54,0x4C,0x40,0x38,0x00,0x00, - - 7, // 0x41 'A' - 0x00,0x38,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x42 'B' - 0x00,0x78,0x44,0x44,0x44,0x78,0x44,0x44,0x44,0x78,0x00,0x00, - - 7, // 0x43 'C' - 0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x40,0x44,0x38,0x00,0x00, - - 7, // 0x44 'D' - 0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x44,0x48,0x70,0x00,0x00, - - 7, // 0x45 'E' - 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x7C,0x00,0x00, - - 7, // 0x46 'F' - 0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x40,0x00,0x00, - - 7, // 0x47 'G' - 0x00,0x38,0x44,0x40,0x40,0x5C,0x44,0x44,0x4C,0x34,0x00,0x00, - - 7, // 0x48 'H' - 0x00,0x44,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x49 'I' - 0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - - 7, // 0x4A 'J' - 0x00,0x1C,0x08,0x08,0x08,0x08,0x08,0x48,0x48,0x30,0x00,0x00, - - 7, // 0x4B 'K' - 0x00,0x44,0x48,0x50,0x60,0x60,0x50,0x48,0x44,0x44,0x00,0x00, - - 7, // 0x4C 'L' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00, - - 7, // 0x4D 'M' - 0x00,0x44,0x6C,0x6C,0x54,0x54,0x44,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x4E 'N' - 0x00,0x44,0x64,0x64,0x54,0x54,0x4C,0x4C,0x44,0x44,0x00,0x00, - - 7, // 0x4F 'O' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x50 'P' - 0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00, - - 7, // 0x51 'Q' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00, - - 7, // 0x52 'R' - 0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x48,0x44,0x44,0x00,0x00, - - 7, // 0x53 'S' - 0x00,0x38,0x44,0x40,0x40,0x38,0x04,0x04,0x44,0x38,0x00,0x00, - - 7, // 0x54 'T' - 0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - - 7, // 0x55 'U' - 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x56 'V' - 0x00,0x44,0x44,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x00,0x00, - - 7, // 0x57 'W' - 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x54,0x28,0x00,0x00, - - 7, // 0x58 'X' - 0x00,0x44,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x59 'Y' - 0x00,0x44,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x00,0x00, - - 7, // 0x5A 'Z' - 0x00,0x7C,0x04,0x04,0x08,0x10,0x20,0x40,0x40,0x7C,0x00,0x00, - - 7, // 0x5B '[' - 0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00, - - 7, // 0x5C '\' - 0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x00, - - 7, // 0x5D ']' - 0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x38,0x00, - - 7, // 0x5E '^' - 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00, - - 7, // 0x60 '`' - 0x00,0x20,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x61 'a' - 0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x44,0x44,0x3C,0x00,0x00, - - 7, // 0x62 'b' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x00,0x00, - - 7, // 0x63 'c' - 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x40,0x44,0x38,0x00,0x00, - - 7, // 0x64 'd' - 0x00,0x04,0x04,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x00,0x00, - - 7, // 0x65 'e' - 0x00,0x00,0x00,0x38,0x44,0x44,0x7C,0x40,0x44,0x38,0x00,0x00, - - 7, // 0x66 'f' - 0x00,0x0C,0x10,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - - 7, // 0x67 'g' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x78, - - 7, // 0x68 'h' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x69 'i' - 0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - - 7, // 0x6A 'j' - 0x00,0x08,0x00,0x18,0x08,0x08,0x08,0x08,0x08,0x08,0x48,0x30, - - 7, // 0x6B 'k' - 0x00,0x40,0x40,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00, - - 7, // 0x6C 'l' - 0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - - 7, // 0x6D 'm' - 0x00,0x00,0x00,0x68,0x54,0x54,0x44,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x6E 'n' - 0x00,0x00,0x00,0x58,0x64,0x44,0x44,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x6F 'o' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x70 'p' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x78,0x40,0x40, - - 7, // 0x71 'q' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x04, - - 7, // 0x72 'r' - 0x00,0x00,0x00,0x58,0x24,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - - 7, // 0x73 's' - 0x00,0x00,0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x38,0x00,0x00, - - 7, // 0x74 't' - 0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x20,0x24,0x18,0x00,0x00, - - 7, // 0x75 'u' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x4C,0x34,0x00,0x00, - - 7, // 0x76 'v' - 0x00,0x00,0x00,0x44,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00, - - 7, // 0x77 'w' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x54,0x54,0x28,0x00,0x00, - - 7, // 0x78 'x' - 0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00, - - 7, // 0x79 'y' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x3C,0x08,0x70, - - 7, // 0x7A 'z' - 0x00,0x00,0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, - - 7, // 0x7B '{' - 0x18,0x20,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x20,0x18,0x00, - - 7, // 0x7C '|' - 0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00, - - 7, // 0x7D '}' - 0x60,0x10,0x10,0x10,0x10,0x0C,0x10,0x10,0x10,0x10,0x60,0x00, - - 7, // 0x7E '~' - 0x00,0x60,0x92,0x92,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x7F '' - 0x00,0x10,0x38,0x6C,0x44,0x44,0x7C,0x00,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u mcs7x12_mono_low[] = - { - 12, 4, 32, 128-32, - 0x00,0x00,0x0D,0x00,0x1A,0x00,0x27,0x00,0x34,0x00,0x41,0x00,0x4E,0x00,0x5B,0x00,0x68,0x00, - 0x75,0x00,0x82,0x00,0x8F,0x00,0x9C,0x00,0xA9,0x00,0xB6,0x00,0xC3,0x00,0xD0,0x00,0xDD,0x00, - 0xEA,0x00,0xF7,0x00,0x04,0x01,0x11,0x01,0x1E,0x01,0x2B,0x01,0x38,0x01,0x45,0x01,0x52,0x01, - 0x5F,0x01,0x6C,0x01,0x79,0x01,0x86,0x01,0x93,0x01,0xA0,0x01,0xAD,0x01,0xBA,0x01,0xC7,0x01, - 0xD4,0x01,0xE1,0x01,0xEE,0x01,0xFB,0x01,0x08,0x02,0x15,0x02,0x22,0x02,0x2F,0x02,0x3C,0x02, - 0x49,0x02,0x56,0x02,0x63,0x02,0x70,0x02,0x7D,0x02,0x8A,0x02,0x97,0x02,0xA4,0x02,0xB1,0x02, - 0xBE,0x02,0xCB,0x02,0xD8,0x02,0xE5,0x02,0xF2,0x02,0xFF,0x02,0x0C,0x03,0x19,0x03,0x26,0x03, - 0x33,0x03,0x40,0x03,0x4D,0x03,0x5A,0x03,0x67,0x03,0x74,0x03,0x81,0x03,0x8E,0x03,0x9B,0x03, - 0xA8,0x03,0xB5,0x03,0xC2,0x03,0xCF,0x03,0xDC,0x03,0xE9,0x03,0xF6,0x03,0x03,0x04,0x10,0x04, - 0x1D,0x04,0x2A,0x04,0x37,0x04,0x44,0x04,0x51,0x04,0x5E,0x04,0x6B,0x04,0x78,0x04,0x85,0x04, - 0x92,0x04,0x9F,0x04,0xAC,0x04,0xB9,0x04,0xC6,0x04,0xD3,0x04, - - 7, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x21 '!' - 0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x10,0x00,0x00, - - 7, // 0x22 '"' - 0x28,0x28,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x23 '#' - 0x00,0x28,0x28,0x7C,0x28,0x28,0x28,0x7C,0x28,0x28,0x00,0x00, - - 7, // 0x24 '$' - 0x00,0x10,0x38,0x54,0x50,0x38,0x14,0x54,0x38,0x10,0x00,0x00, - - 7, // 0x25 '%' - 0x34,0x54,0x68,0x08,0x10,0x10,0x20,0x2C,0x54,0x58,0x00,0x00, - - 7, // 0x26 '&' - 0x00,0x20,0x50,0x50,0x20,0x54,0x54,0x48,0x34,0x00,0x00,0x00, - - 7, // 0x27 ''' - 0x00,0x10,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x28 '(' - 0x08,0x10,0x10,0x20,0x20,0x20,0x20,0x20,0x10,0x10,0x08,0x00, - - 7, // 0x29 ')' - 0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x00, - - 7, // 0x2A '*' - 0x00,0x00,0x10,0x54,0x38,0x7C,0x38,0x54,0x10,0x00,0x00,0x00, - - 7, // 0x2B '+' - 0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00,0x00, - - 7, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x20,0x40,0x00, - - 7, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00, - - 7, // 0x2F '/' - 0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00,0x00, - - 7, // 0x30 '0' - 0x00,0x38,0x44,0x44,0x54,0x54,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x31 '1' - 0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, - - 7, // 0x32 '2' - 0x00,0x38,0x44,0x44,0x08,0x10,0x20,0x40,0x7C,0x00,0x00,0x00, - - 7, // 0x33 '3' - 0x00,0x38,0x44,0x04,0x38,0x04,0x04,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x34 '4' - 0x00,0x08,0x18,0x28,0x28,0x48,0x7C,0x08,0x08,0x00,0x00,0x00, - - 7, // 0x35 '5' - 0x00,0x7C,0x40,0x78,0x44,0x04,0x04,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x36 '6' - 0x00,0x38,0x44,0x40,0x78,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x37 '7' - 0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x00,0x00,0x00, - - 7, // 0x38 '8' - 0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x39 '9' - 0x00,0x38,0x44,0x44,0x44,0x3C,0x04,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x3A ':' - 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00,0x00,0x00, - - 7, // 0x3B ';' - 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x20,0x40,0x00, - - 7, // 0x3C '<' - 0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00,0x00, - - 7, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00,0x00, - - 7, // 0x3E '>' - 0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00,0x00, - - 7, // 0x3F '?' - 0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x10,0x00,0x10,0x00,0x00, - - 7, // 0x40 '@' - 0x00,0x38,0x44,0x44,0x5C,0x54,0x4C,0x40,0x38,0x00,0x00,0x00, - - 7, // 0x41 'A' - 0x00,0x38,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x42 'B' - 0x00,0x78,0x44,0x44,0x78,0x44,0x44,0x44,0x78,0x00,0x00,0x00, - - 7, // 0x43 'C' - 0x00,0x38,0x44,0x40,0x40,0x40,0x40,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x44 'D' - 0x00,0x70,0x48,0x44,0x44,0x44,0x44,0x48,0x70,0x00,0x00,0x00, - - 7, // 0x45 'E' - 0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x40,0x7C,0x00,0x00,0x00, - - 7, // 0x46 'F' - 0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 7, // 0x47 'G' - 0x00,0x38,0x44,0x40,0x40,0x4C,0x44,0x4C,0x34,0x00,0x00,0x00, - - 7, // 0x48 'H' - 0x00,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x49 'I' - 0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, - - 7, // 0x4A 'J' - 0x00,0x1C,0x08,0x08,0x08,0x08,0x48,0x48,0x30,0x00,0x00,0x00, - - 7, // 0x4B 'K' - 0x00,0x44,0x48,0x50,0x60,0x60,0x50,0x48,0x44,0x00,0x00,0x00, - - 7, // 0x4C 'L' - 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00,0x00, - - 7, // 0x4D 'M' - 0x00,0x44,0x6C,0x54,0x54,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x4E 'N' - 0x00,0x44,0x64,0x64,0x54,0x54,0x4C,0x4C,0x44,0x00,0x00,0x00, - - 7, // 0x4F 'O' - 0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x50 'P' - 0x00,0x78,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00,0x00, - - 7, // 0x51 'Q' - 0x00,0x38,0x44,0x44,0x44,0x44,0x54,0x48,0x34,0x00,0x00,0x00, - - 7, // 0x52 'R' - 0x00,0x78,0x44,0x44,0x44,0x78,0x48,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x53 'S' - 0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x54 'T' - 0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00, - - 7, // 0x55 'U' - 0x00,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x56 'V' - 0x00,0x44,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x00,0x00,0x00, - - 7, // 0x57 'W' - 0x00,0x44,0x44,0x44,0x44,0x44,0x54,0x54,0x28,0x00,0x00,0x00, - - 7, // 0x58 'X' - 0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x59 'Y' - 0x00,0x44,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x00,0x00,0x00, - - 7, // 0x5A 'Z' - 0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x40,0x7C,0x00,0x00,0x00, - - 7, // 0x5B '[' - 0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00, - - 7, // 0x5C '\' - 0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x00, - - 7, // 0x5D ']' - 0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x38,0x00, - - 7, // 0x5E '^' - 0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00, - - 7, // 0x60 '`' - 0x00,0x20,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x61 'a' - 0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x44,0x3C,0x00,0x00,0x00, - - 7, // 0x62 'b' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x78,0x00,0x00,0x00, - - 7, // 0x63 'c' - 0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x64 'd' - 0x00,0x04,0x04,0x3C,0x44,0x44,0x44,0x44,0x3C,0x00,0x00,0x00, - - 7, // 0x65 'e' - 0x00,0x00,0x00,0x38,0x44,0x7C,0x40,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x66 'f' - 0x00,0x0C,0x10,0x38,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00, - - 7, // 0x67 'g' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x3C,0x04,0x44,0x38, - - 7, // 0x68 'h' - 0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x69 'i' - 0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, - - 7, // 0x6A 'j' - 0x00,0x08,0x00,0x18,0x08,0x08,0x08,0x08,0x08,0x48,0x48,0x30, - - 7, // 0x6B 'k' - 0x00,0x40,0x40,0x4C,0x50,0x60,0x50,0x48,0x44,0x00,0x00,0x00, - - 7, // 0x6C 'l' - 0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00,0x00, - - 7, // 0x6D 'm' - 0x00,0x00,0x00,0x68,0x54,0x54,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x6E 'n' - 0x00,0x00,0x00,0x58,0x64,0x44,0x44,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x6F 'o' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x70 'p' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40,0x40, - - 7, // 0x71 'q' - 0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x3C,0x04,0x04,0x04, - - 7, // 0x72 'r' - 0x00,0x00,0x00,0x58,0x24,0x20,0x20,0x20,0x70,0x00,0x00,0x00, - - 7, // 0x73 's' - 0x00,0x00,0x00,0x38,0x44,0x30,0x08,0x44,0x38,0x00,0x00,0x00, - - 7, // 0x74 't' - 0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x24,0x18,0x00,0x00,0x00, - - 7, // 0x75 'u' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x4C,0x34,0x00,0x00,0x00, - - 7, // 0x76 'v' - 0x00,0x00,0x00,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00,0x00, - - 7, // 0x77 'w' - 0x00,0x00,0x00,0x44,0x44,0x44,0x54,0x54,0x28,0x00,0x00,0x00, - - 7, // 0x78 'x' - 0x00,0x00,0x00,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00,0x00, - - 7, // 0x79 'y' - 0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x3C,0x04,0x08,0x70, - - 7, // 0x7A 'z' - 0x00,0x00,0x00,0x7C,0x08,0x10,0x20,0x40,0x7C,0x00,0x00,0x00, - - 7, // 0x7B '{' - 0x18,0x20,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x20,0x18,0x00, - - 7, // 0x7C '|' - 0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00, - - 7, // 0x7D '}' - 0x60,0x10,0x10,0x10,0x10,0x0C,0x10,0x10,0x10,0x10,0x60,0x00, - - 7, // 0x7E '~' - 0x00,0x24,0x54,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x7F '' - 0x00,0x10,0x38,0x6C,0x44,0x44,0x7C,0x00,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u verdana12[] = - { - 12, 3, 32, 128-32, - 0x00,0x00,0x0D,0x00,0x1A,0x00,0x27,0x00,0x34,0x00,0x41,0x00,0x5A,0x00,0x67,0x00,0x74,0x00, - 0x81,0x00,0x8E,0x00,0x9B,0x00,0xA8,0x00,0xB5,0x00,0xC2,0x00,0xCF,0x00,0xDC,0x00,0xE9,0x00, - 0xF6,0x00,0x03,0x01,0x10,0x01,0x1D,0x01,0x2A,0x01,0x37,0x01,0x44,0x01,0x51,0x01,0x5E,0x01, - 0x6B,0x01,0x78,0x01,0x85,0x01,0x92,0x01,0x9F,0x01,0xAC,0x01,0xC5,0x01,0xD2,0x01,0xDF,0x01, - 0xEC,0x01,0xF9,0x01,0x06,0x02,0x13,0x02,0x20,0x02,0x2D,0x02,0x3A,0x02,0x47,0x02,0x54,0x02, - 0x61,0x02,0x7A,0x02,0x87,0x02,0xA0,0x02,0xAD,0x02,0xC6,0x02,0xD3,0x02,0xE0,0x02,0xED,0x02, - 0xFA,0x02,0x07,0x03,0x20,0x03,0x2D,0x03,0x3A,0x03,0x47,0x03,0x54,0x03,0x61,0x03,0x6E,0x03, - 0x7B,0x03,0x88,0x03,0x95,0x03,0xA2,0x03,0xAF,0x03,0xBC,0x03,0xC9,0x03,0xD6,0x03,0xE3,0x03, - 0xF0,0x03,0xFD,0x03,0x0A,0x04,0x17,0x04,0x24,0x04,0x31,0x04,0x4A,0x04,0x57,0x04,0x64,0x04, - 0x71,0x04,0x7E,0x04,0x8B,0x04,0x98,0x04,0xA5,0x04,0xB2,0x04,0xBF,0x04,0xCC,0x04,0xD9,0x04, - 0xE6,0x04,0xF3,0x04,0x00,0x05,0x0D,0x05,0x1A,0x05,0x27,0x05, - - 3, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x21 '!' - 0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, - - 5, // 0x22 '"' - 0x00,0x00,0x50,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x28,0x7C,0x28,0x7C,0x28,0x00,0x00,0x00, - - 7, // 0x24 '$' - 0x00,0x00,0x10,0x10,0x3C,0x50,0x30,0x18,0x14,0x78,0x10,0x10, - - 11, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x4A,0x00,0x4A,0x00,0x35,0x80,0x0A,0x40,0x0A,0x40,0x11,0x80,0x00,0x00,0x00,0x00, - - 7, // 0x26 '&' - 0x00,0x00,0x00,0x30,0x48,0x48,0x32,0x4A,0x44,0x3A,0x00,0x00, - - 3, // 0x27 ''' - 0x00,0x00,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x28 '(' - 0x00,0x00,0x10,0x20,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x10, - - 4, // 0x29 ')' - 0x00,0x00,0x80,0x40,0x20,0x20,0x20,0x20,0x20,0x20,0x40,0x80, - - 7, // 0x2A '*' - 0x00,0x10,0x54,0x38,0x54,0x10,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00, - - 3, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x80,0x00, - - 5, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00, - - 3, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x00,0x00, - - 4, // 0x2F '/' - 0x00,0x00,0x10,0x10,0x20,0x20,0x40,0x40,0x40,0x80,0x80,0x00, - - 7, // 0x30 '0' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x31 '1' - 0x00,0x00,0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x38,0x00,0x00, - - 7, // 0x32 '2' - 0x00,0x00,0x00,0x38,0x44,0x04,0x08,0x10,0x20,0x7C,0x00,0x00, - - 7, // 0x33 '3' - 0x00,0x00,0x00,0x38,0x44,0x04,0x18,0x04,0x44,0x38,0x00,0x00, - - 7, // 0x34 '4' - 0x00,0x00,0x00,0x08,0x18,0x28,0x48,0x7C,0x08,0x08,0x00,0x00, - - 7, // 0x35 '5' - 0x00,0x00,0x00,0x7C,0x40,0x78,0x04,0x04,0x44,0x38,0x00,0x00, - - 7, // 0x36 '6' - 0x00,0x00,0x00,0x18,0x20,0x40,0x78,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x37 '7' - 0x00,0x00,0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x10,0x00,0x00, - - 7, // 0x38 '8' - 0x00,0x00,0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x39 '9' - 0x00,0x00,0x00,0x38,0x44,0x44,0x3C,0x04,0x08,0x30,0x00,0x00, - - 4, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x00, - - 4, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x00,0x40,0x40,0x80,0x00, - - 7, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x04,0x18,0x60,0x18,0x04,0x00,0x00,0x00, - - 7, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x7C,0x00,0x00,0x00,0x00, - - 7, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x40,0x30,0x0C,0x30,0x40,0x00,0x00,0x00, - - 6, // 0x3F '?' - 0x00,0x00,0x00,0x70,0x08,0x08,0x10,0x20,0x00,0x20,0x00,0x00, - - 10, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x20,0x80,0x4E,0x80,0x52,0x80,0x52,0x80,0x4D,0x00,0x20,0x00,0x1F,0x00,0x00,0x00, - - 8, // 0x41 'A' - 0x00,0x00,0x00,0x18,0x18,0x24,0x24,0x7E,0x42,0x42,0x00,0x00, - - 7, // 0x42 'B' - 0x00,0x00,0x00,0x70,0x48,0x48,0x78,0x44,0x44,0x78,0x00,0x00, - - 8, // 0x43 'C' - 0x00,0x00,0x00,0x1C,0x22,0x40,0x40,0x40,0x22,0x1C,0x00,0x00, - - 8, // 0x44 'D' - 0x00,0x00,0x00,0x78,0x44,0x42,0x42,0x42,0x44,0x78,0x00,0x00, - - 7, // 0x45 'E' - 0x00,0x00,0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x7C,0x00,0x00, - - 6, // 0x46 'F' - 0x00,0x00,0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x40,0x00,0x00, - - 8, // 0x47 'G' - 0x00,0x00,0x00,0x1C,0x22,0x40,0x4E,0x42,0x22,0x1C,0x00,0x00, - - 8, // 0x48 'H' - 0x00,0x00,0x00,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x00,0x00, - - 5, // 0x49 'I' - 0x00,0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - - 5, // 0x4A 'J' - 0x00,0x00,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0xE0,0x00,0x00, - - 7, // 0x4B 'K' - 0x00,0x00,0x00,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00, - - 6, // 0x4C 'L' - 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00, - - 9, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x55,0x00,0x55,0x00,0x49,0x00,0x49,0x00,0x41,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x4E 'N' - 0x00,0x00,0x00,0x42,0x62,0x52,0x4A,0x46,0x42,0x42,0x00,0x00, - - 9, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x50 'P' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x78,0x40,0x40,0x00,0x00, - - 9, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x04,0x00,0x03,0x00, - - 7, // 0x52 'R' - 0x00,0x00,0x00,0x78,0x44,0x44,0x78,0x50,0x48,0x44,0x00,0x00, - - 7, // 0x53 'S' - 0x00,0x00,0x00,0x38,0x44,0x40,0x38,0x04,0x44,0x38,0x00,0x00, - - 7, // 0x54 'T' - 0x00,0x00,0x00,0xFE,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - - 8, // 0x55 'U' - 0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, - - 8, // 0x56 'V' - 0x00,0x00,0x00,0x42,0x42,0x42,0x24,0x24,0x18,0x18,0x00,0x00, - - 9, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x49,0x00,0x49,0x00,0x55,0x00,0x55,0x00,0x22,0x00,0x22,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x58 'X' - 0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00, - - 7, // 0x59 'Y' - 0x00,0x00,0x00,0x44,0x44,0x28,0x28,0x10,0x10,0x10,0x00,0x00, - - 7, // 0x5A 'Z' - 0x00,0x00,0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, - - 4, // 0x5B '[' - 0x00,0x00,0x60,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x60, - - 4, // 0x5C '\' - 0x00,0x00,0x80,0x80,0x40,0x40,0x40,0x20,0x20,0x10,0x10,0x00, - - 4, // 0x5D ']' - 0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x60, - - 7, // 0x5E '^' - 0x00,0x00,0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC, - - 6, // 0x60 '`' - 0x00,0x00,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x30,0x08,0x38,0x48,0x38,0x00,0x00, - - 6, // 0x62 'b' - 0x00,0x00,0x40,0x40,0x40,0x70,0x48,0x48,0x48,0x70,0x00,0x00, - - 6, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x40,0x40,0x38,0x00,0x00, - - 6, // 0x64 'd' - 0x00,0x00,0x08,0x08,0x08,0x38,0x48,0x48,0x48,0x38,0x00,0x00, - - 6, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x78,0x40,0x38,0x00,0x00, - - 4, // 0x66 'f' - 0x00,0x00,0x30,0x40,0x40,0xE0,0x40,0x40,0x40,0x40,0x00,0x00, - - 6, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x38,0x48,0x48,0x48,0x38,0x08,0x30, - - 6, // 0x68 'h' - 0x00,0x00,0x40,0x40,0x40,0x70,0x48,0x48,0x48,0x48,0x00,0x00, - - 3, // 0x69 'i' - 0x00,0x00,0x00,0x40,0x00,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - - 3, // 0x6A 'j' - 0x00,0x00,0x00,0x40,0x00,0xC0,0x40,0x40,0x40,0x40,0x40,0x80, - - 6, // 0x6B 'k' - 0x00,0x00,0x40,0x40,0x40,0x48,0x50,0x60,0x50,0x48,0x00,0x00, - - 3, // 0x6C 'l' - 0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - - 9, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x70,0x48,0x48,0x48,0x48,0x00,0x00, - - 6, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x48,0x48,0x30,0x00,0x00, - - 6, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x70,0x48,0x48,0x48,0x70,0x40,0x40, - - 6, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x38,0x48,0x48,0x48,0x38,0x08,0x08, - - 4, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x50,0x60,0x40,0x40,0x40,0x00,0x00, - - 6, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x30,0x08,0x70,0x00,0x00, - - 4, // 0x74 't' - 0x00,0x00,0x00,0x00,0x40,0xF0,0x40,0x40,0x40,0x30,0x00,0x00, - - 6, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x48,0x48,0x48,0x48,0x38,0x00,0x00, - - 6, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x48,0x48,0x48,0x30,0x30,0x00,0x00, - - 7, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x44,0x54,0x54,0x28,0x28,0x00,0x00, - - 6, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x48,0x48,0x30,0x48,0x48,0x00,0x00, - - 6, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x48,0x48,0x48,0x30,0x10,0x20,0x20, - - 5, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x70,0x10,0x20,0x40,0x70,0x00,0x00, - - 6, // 0x7B '{' - 0x00,0x00,0x18,0x20,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x18, - - 5, // 0x7C '|' - 0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - - 6, // 0x7D '}' - 0x00,0x00,0x60,0x10,0x10,0x10,0x10,0x0C,0x10,0x10,0x10,0x60, - - 7, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x58,0x00,0x00,0x00,0x00, - - 9, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7F,0x00,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u verdana12_bold[] = - { - 12, 3, 32, 128-32, - 0x00,0x00,0x0D,0x00,0x1A,0x00,0x27,0x00,0x34,0x00,0x41,0x00,0x5A,0x00,0x67,0x00,0x74,0x00, - 0x81,0x00,0x8E,0x00,0x9B,0x00,0xA8,0x00,0xB5,0x00,0xC2,0x00,0xCF,0x00,0xDC,0x00,0xE9,0x00, - 0xF6,0x00,0x03,0x01,0x10,0x01,0x1D,0x01,0x2A,0x01,0x37,0x01,0x44,0x01,0x51,0x01,0x5E,0x01, - 0x6B,0x01,0x78,0x01,0x85,0x01,0x92,0x01,0x9F,0x01,0xAC,0x01,0xC5,0x01,0xD2,0x01,0xDF,0x01, - 0xEC,0x01,0xF9,0x01,0x06,0x02,0x13,0x02,0x20,0x02,0x2D,0x02,0x3A,0x02,0x47,0x02,0x54,0x02, - 0x61,0x02,0x6E,0x02,0x7B,0x02,0x88,0x02,0x95,0x02,0xA2,0x02,0xAF,0x02,0xBC,0x02,0xC9,0x02, - 0xD6,0x02,0xE3,0x02,0xFC,0x02,0x09,0x03,0x16,0x03,0x23,0x03,0x30,0x03,0x3D,0x03,0x4A,0x03, - 0x57,0x03,0x64,0x03,0x71,0x03,0x7E,0x03,0x8B,0x03,0x98,0x03,0xA5,0x03,0xB2,0x03,0xBF,0x03, - 0xCC,0x03,0xD9,0x03,0xE6,0x03,0xF3,0x03,0x00,0x04,0x0D,0x04,0x26,0x04,0x33,0x04,0x40,0x04, - 0x4D,0x04,0x5A,0x04,0x67,0x04,0x74,0x04,0x81,0x04,0x8E,0x04,0x9B,0x04,0xB4,0x04,0xC1,0x04, - 0xCE,0x04,0xDB,0x04,0xE8,0x04,0xF5,0x04,0x02,0x05,0x0F,0x05, - - 3, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x21 '!' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x00,0x60,0x00,0x00, - - 5, // 0x22 '"' - 0x00,0x00,0xD8,0xD8,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x23 '#' - 0x00,0x00,0x00,0x14,0x14,0x7E,0x28,0xFC,0x50,0x50,0x00,0x00, - - 6, // 0x24 '$' - 0x00,0x00,0x20,0x20,0x70,0xE8,0xE0,0x38,0xB8,0x70,0x20,0x20, - - 11, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x00,0x94,0x00,0x94,0x00,0x69,0x80,0x0A,0x40,0x0A,0x40,0x11,0x80,0x00,0x00,0x00,0x00, - - 8, // 0x26 '&' - 0x00,0x00,0x00,0x70,0xD8,0xD8,0x76,0xDC,0xCC,0x76,0x00,0x00, - - 3, // 0x27 ''' - 0x00,0x00,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x28 '(' - 0x00,0x00,0x30,0x60,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x60,0x30, - - 5, // 0x29 ')' - 0x00,0x00,0xC0,0x60,0x30,0x30,0x30,0x30,0x30,0x30,0x60,0xC0, - - 6, // 0x2A '*' - 0x00,0x00,0x20,0xA8,0x70,0xA8,0x20,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00, - - 3, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x80,0x00, - - 4, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00, - - 3, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00, - - 6, // 0x2F '/' - 0x00,0x00,0x08,0x08,0x10,0x10,0x20,0x40,0x40,0x80,0x80,0x00, - - 6, // 0x30 '0' - 0x00,0x00,0x00,0x70,0xD8,0xD8,0xD8,0xD8,0xD8,0x70,0x00,0x00, - - 6, // 0x31 '1' - 0x00,0x00,0x00,0x30,0x70,0x30,0x30,0x30,0x30,0x78,0x00,0x00, - - 6, // 0x32 '2' - 0x00,0x00,0x00,0x70,0x98,0x18,0x30,0x60,0xC0,0xF8,0x00,0x00, - - 6, // 0x33 '3' - 0x00,0x00,0x00,0x70,0x98,0x18,0x70,0x18,0x98,0x70,0x00,0x00, - - 6, // 0x34 '4' - 0x00,0x00,0x00,0x18,0x38,0x58,0x98,0xFC,0x18,0x18,0x00,0x00, - - 6, // 0x35 '5' - 0x00,0x00,0x00,0xF8,0xC0,0xF0,0x18,0x18,0x98,0x70,0x00,0x00, - - 6, // 0x36 '6' - 0x00,0x00,0x00,0x70,0xC0,0xF0,0xD8,0xD8,0xD8,0x70,0x00,0x00, - - 6, // 0x37 '7' - 0x00,0x00,0x00,0xF8,0x18,0x30,0x30,0x60,0x60,0xC0,0x00,0x00, - - 6, // 0x38 '8' - 0x00,0x00,0x00,0x70,0xD8,0xD8,0x70,0xD8,0xD8,0x70,0x00,0x00, - - 6, // 0x39 '9' - 0x00,0x00,0x00,0x70,0xD8,0xD8,0xD8,0x78,0x18,0x70,0x00,0x00, - - 4, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x60,0x60,0x00,0x00, - - 4, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x60,0x60,0x40,0x00, - - 8, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x04,0x18,0x60,0x60,0x18,0x04,0x00,0x00, - - 8, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x7C,0x00,0x00,0x00,0x00, - - 8, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x40,0x30,0x0C,0x0C,0x30,0x40,0x00,0x00, - - 6, // 0x3F '?' - 0x00,0x00,0x00,0xF0,0x18,0x18,0x30,0x60,0x00,0x60,0x00,0x00, - - 9, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x42,0x00,0x9D,0x00,0xA5,0x00,0xA5,0x00,0x9E,0x00,0x40,0x00,0x3C,0x00,0x00,0x00, - - 8, // 0x41 'A' - 0x00,0x00,0x00,0x38,0x38,0x6C,0x6C,0x7C,0xC6,0xC6,0x00,0x00, - - 7, // 0x42 'B' - 0x00,0x00,0x00,0xF8,0xCC,0xCC,0xF8,0xCC,0xCC,0xF8,0x00,0x00, - - 6, // 0x43 'C' - 0x00,0x00,0x00,0x70,0xC8,0xC0,0xC0,0xC0,0xC8,0x70,0x00,0x00, - - 7, // 0x44 'D' - 0x00,0x00,0x00,0xF8,0xCC,0xCC,0xCC,0xCC,0xCC,0xF8,0x00,0x00, - - 6, // 0x45 'E' - 0x00,0x00,0x00,0xF8,0xC0,0xC0,0xF8,0xC0,0xC0,0xF8,0x00,0x00, - - 6, // 0x46 'F' - 0x00,0x00,0x00,0xF8,0xC0,0xC0,0xF8,0xC0,0xC0,0xC0,0x00,0x00, - - 7, // 0x47 'G' - 0x00,0x00,0x00,0x78,0xC4,0xC0,0xC0,0xDC,0xCC,0x7C,0x00,0x00, - - 7, // 0x48 'H' - 0x00,0x00,0x00,0xCC,0xCC,0xCC,0xFC,0xCC,0xCC,0xCC,0x00,0x00, - - 5, // 0x49 'I' - 0x00,0x00,0x00,0xF0,0x60,0x60,0x60,0x60,0x60,0xF0,0x00,0x00, - - 5, // 0x4A 'J' - 0x00,0x00,0x00,0x70,0x30,0x30,0x30,0x30,0x30,0xE0,0x00,0x00, - - 7, // 0x4B 'K' - 0x00,0x00,0x00,0xCC,0xD8,0xF0,0xE0,0xF0,0xD8,0xCC,0x00,0x00, - - 6, // 0x4C 'L' - 0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xF8,0x00,0x00, - - 8, // 0x4D 'M' - 0x00,0x00,0x00,0x82,0xC6,0xEE,0xB6,0xB6,0x86,0x86,0x00,0x00, - - 7, // 0x4E 'N' - 0x00,0x00,0x00,0x84,0xC4,0xE4,0xB4,0x9C,0x8C,0x84,0x00,0x00, - - 8, // 0x4F 'O' - 0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00, - - 7, // 0x50 'P' - 0x00,0x00,0x00,0xF8,0xCC,0xCC,0xCC,0xF8,0xC0,0xC0,0x00,0x00, - - 8, // 0x51 'Q' - 0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x18,0x0E, - - 7, // 0x52 'R' - 0x00,0x00,0x00,0xF8,0xCC,0xCC,0xF8,0xD8,0xCC,0xC6,0x00,0x00, - - 6, // 0x53 'S' - 0x00,0x00,0x00,0x70,0xC8,0xC0,0x70,0x18,0x98,0x70,0x00,0x00, - - 6, // 0x54 'T' - 0x00,0x00,0x00,0xFC,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x00, - - 7, // 0x55 'U' - 0x00,0x00,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x78,0x00,0x00, - - 7, // 0x56 'V' - 0x00,0x00,0x00,0xCC,0xCC,0x78,0x78,0x78,0x30,0x30,0x00,0x00, - - 11, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0xCC,0xC0,0xCC,0xC0,0x6D,0x80,0x6D,0x80,0x73,0x80,0x33,0x00,0x33,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x58 'X' - 0x00,0x00,0x00,0xCC,0xCC,0x78,0x30,0x78,0xCC,0xCC,0x00,0x00, - - 7, // 0x59 'Y' - 0x00,0x00,0x00,0xCC,0xCC,0x78,0x30,0x30,0x30,0x30,0x00,0x00, - - 6, // 0x5A 'Z' - 0x00,0x00,0x00,0xF8,0x18,0x30,0x60,0xC0,0xC0,0xF8,0x00,0x00, - - 5, // 0x5B '[' - 0x00,0x00,0x70,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x70, - - 6, // 0x5C '\' - 0x00,0x00,0x80,0x80,0x40,0x40,0x20,0x10,0x10,0x08,0x08,0x00, - - 5, // 0x5D ']' - 0x00,0x00,0x70,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x70, - - 8, // 0x5E '^' - 0x00,0x00,0x00,0x18,0x3C,0x66,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC, - - 6, // 0x60 '`' - 0x00,0x00,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x70,0x18,0x78,0xD8,0x78,0x00,0x00, - - 6, // 0x62 'b' - 0x00,0x00,0xC0,0xC0,0xC0,0xF0,0xD8,0xD8,0xD8,0xF0,0x00,0x00, - - 5, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x70,0xC0,0xC0,0xC0,0x70,0x00,0x00, - - 6, // 0x64 'd' - 0x00,0x00,0x18,0x18,0x18,0x78,0xD8,0xD8,0xD8,0x78,0x00,0x00, - - 6, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x70,0xD8,0xF8,0xC0,0x78,0x00,0x00, - - 5, // 0x66 'f' - 0x00,0x00,0x38,0x60,0x60,0xF8,0x60,0x60,0x60,0x60,0x00,0x00, - - 6, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x78,0xD8,0xD8,0xD8,0x78,0x18,0x70, - - 6, // 0x68 'h' - 0x00,0x00,0xC0,0xC0,0xC0,0xF0,0xD8,0xD8,0xD8,0xD8,0x00,0x00, - - 3, // 0x69 'i' - 0x00,0x00,0x00,0xC0,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00, - - 4, // 0x6A 'j' - 0x00,0x00,0x00,0x60,0x00,0xE0,0x60,0x60,0x60,0x60,0x60,0xC0, - - 6, // 0x6B 'k' - 0x00,0x00,0xC0,0xC0,0xC0,0xD8,0xD8,0xF0,0xD8,0xD8,0x00,0x00, - - 3, // 0x6C 'l' - 0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00, - - 9, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF6,0x00,0xDB,0x00,0xDB,0x00,0xDB,0x00,0xDB,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0xF0,0xD8,0xD8,0xD8,0xD8,0x00,0x00, - - 6, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x70,0xD8,0xD8,0xD8,0x70,0x00,0x00, - - 6, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0xF0,0xD8,0xD8,0xD8,0xF0,0xC0,0xC0, - - 6, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x78,0xD8,0xD8,0xD8,0x78,0x18,0x18, - - 4, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0xD0,0xE0,0xC0,0xC0,0xC0,0x00,0x00, - - 5, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x70,0xC0,0xF0,0x30,0xE0,0x00,0x00, - - 5, // 0x74 't' - 0x00,0x00,0x00,0x60,0x60,0xF8,0x60,0x60,0x60,0x38,0x00,0x00, - - 6, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0xD8,0xD8,0x78,0x00,0x00, - - 6, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0xD8,0x70,0x70,0x00,0x00, - - 9, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDB,0x00,0xDB,0x00,0xDB,0x00,0x66,0x00,0x66,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x70,0xD8,0xD8,0x00,0x00, - - 6, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0xD8,0x70,0x70,0x30,0x60, - - 5, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0xF0,0x30,0x60,0xC0,0xF0,0x00,0x00, - - 6, // 0x7B '{' - 0x00,0x00,0x18,0x30,0x30,0x30,0xE0,0x30,0x30,0x30,0x30,0x18, - - 5, // 0x7C '|' - 0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - - 6, // 0x7D '}' - 0x00,0x00,0xC0,0x60,0x60,0x60,0x38,0x60,0x60,0x60,0x60,0xC0, - - 8, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x92,0x8C,0x00,0x00,0x00, - - 9, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7F,0x00,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u verdana13[] = - { - 13, 3, 32, 128-32, - 0x00,0x00,0x0E,0x00,0x1C,0x00,0x2A,0x00,0x45,0x00,0x53,0x00,0x6E,0x00,0x7C,0x00,0x8A,0x00, - 0x98,0x00,0xA6,0x00,0xB4,0x00,0xCF,0x00,0xDD,0x00,0xEB,0x00,0xF9,0x00,0x07,0x01,0x15,0x01, - 0x23,0x01,0x31,0x01,0x3F,0x01,0x4D,0x01,0x5B,0x01,0x69,0x01,0x77,0x01,0x85,0x01,0x93,0x01, - 0xA1,0x01,0xAF,0x01,0xCA,0x01,0xE5,0x01,0x00,0x02,0x0E,0x02,0x29,0x02,0x37,0x02,0x45,0x02, - 0x60,0x02,0x7B,0x02,0x89,0x02,0x97,0x02,0xB2,0x02,0xC0,0x02,0xCE,0x02,0xDC,0x02,0xEA,0x02, - 0xF8,0x02,0x13,0x03,0x21,0x03,0x3C,0x03,0x4A,0x03,0x65,0x03,0x73,0x03,0x81,0x03,0x8F,0x03, - 0x9D,0x03,0xAB,0x03,0xC6,0x03,0xD4,0x03,0xE2,0x03,0xF0,0x03,0xFE,0x03,0x0C,0x04,0x1A,0x04, - 0x35,0x04,0x43,0x04,0x51,0x04,0x5F,0x04,0x6D,0x04,0x7B,0x04,0x89,0x04,0x97,0x04,0xA5,0x04, - 0xB3,0x04,0xC1,0x04,0xCF,0x04,0xDD,0x04,0xEB,0x04,0xF9,0x04,0x14,0x05,0x22,0x05,0x30,0x05, - 0x3E,0x05,0x4C,0x05,0x5A,0x05,0x68,0x05,0x76,0x05,0x84,0x05,0x92,0x05,0xAD,0x05,0xBB,0x05, - 0xC9,0x05,0xD7,0x05,0xE5,0x05,0xF3,0x05,0x01,0x06,0x1C,0x06, - - 4, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x21 '!' - 0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, - - 5, // 0x22 '"' - 0x00,0x00,0x50,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0x00,0x0A,0x00,0x3F,0x00,0x14,0x00,0x14,0x00,0x7E,0x00,0x28,0x00,0x28,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x24 '$' - 0x00,0x00,0x10,0x10,0x3C,0x50,0x50,0x38,0x14,0x14,0x78,0x10,0x10, - - 12, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x49,0x00,0x4A,0x00,0x32,0x00,0x04,0xC0,0x05,0x20,0x09,0x20,0x08,0xC0,0x00,0x00,0x00,0x00, - - 8, // 0x26 '&' - 0x00,0x00,0x00,0x30,0x48,0x48,0x32,0x4A,0x44,0x46,0x39,0x00,0x00, - - 3, // 0x27 ''' - 0x00,0x00,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x28 '(' - 0x00,0x00,0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10, - - 5, // 0x29 ')' - 0x00,0x00,0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x20,0x40, - - 7, // 0x2A '*' - 0x00,0x00,0x10,0x54,0x38,0x54,0x10,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x7F,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x40, - - 5, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00, - - 5, // 0x2F '/' - 0x00,0x00,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80,0x00, - - 7, // 0x30 '0' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x31 '1' - 0x00,0x00,0x00,0x10,0x70,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00, - - 7, // 0x32 '2' - 0x00,0x00,0x00,0x38,0x44,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, - - 7, // 0x33 '3' - 0x00,0x00,0x00,0x38,0x44,0x04,0x18,0x04,0x04,0x44,0x38,0x00,0x00, - - 7, // 0x34 '4' - 0x00,0x00,0x00,0x08,0x18,0x28,0x48,0x88,0xFC,0x08,0x08,0x00,0x00, - - 7, // 0x35 '5' - 0x00,0x00,0x00,0x7C,0x40,0x40,0x78,0x04,0x04,0x44,0x38,0x00,0x00, - - 7, // 0x36 '6' - 0x00,0x00,0x00,0x18,0x20,0x40,0x78,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x37 '7' - 0x00,0x00,0x00,0x7C,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x00,0x00, - - 7, // 0x38 '8' - 0x00,0x00,0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x39 '9' - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x3C,0x04,0x08,0x30,0x00,0x00, - - 5, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x20,0x20,0x00,0x00, - - 5, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x20,0x20,0x20,0x40, - - 9, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x18,0x00,0x60,0x00,0x18,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x0C,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x3F '?' - 0x00,0x00,0x00,0x70,0x08,0x08,0x10,0x20,0x20,0x00,0x20,0x00,0x00, - - 10, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x20,0x80,0x4E,0x80,0x52,0x80,0x52,0x80,0x52,0x80,0x4D,0x00,0x20,0x00,0x1E,0x00,0x00,0x00, - - 8, // 0x41 'A' - 0x00,0x00,0x00,0x18,0x18,0x24,0x24,0x24,0x7E,0x42,0x42,0x00,0x00, - - 8, // 0x42 'B' - 0x00,0x00,0x00,0x78,0x44,0x44,0x7C,0x42,0x42,0x42,0x7C,0x00,0x00, - - 9, // 0x43 'C' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x44 'D' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x42,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x45 'E' - 0x00,0x00,0x00,0x7C,0x40,0x40,0x7C,0x40,0x40,0x40,0x7C,0x00,0x00, - - 6, // 0x46 'F' - 0x00,0x00,0x00,0x7C,0x40,0x40,0x78,0x40,0x40,0x40,0x40,0x00,0x00, - - 9, // 0x47 'G' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x00,0x40,0x00,0x47,0x00,0x41,0x00,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x48 'H' - 0x00,0x00,0x00,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x42,0x00,0x00, - - 5, // 0x49 'I' - 0x00,0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - - 5, // 0x4A 'J' - 0x00,0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0xE0,0x00,0x00, - - 8, // 0x4B 'K' - 0x00,0x00,0x00,0x42,0x44,0x48,0x50,0x70,0x48,0x44,0x42,0x00,0x00, - - 6, // 0x4C 'L' - 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C,0x00,0x00, - - 9, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x55,0x00,0x55,0x00,0x49,0x00,0x49,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x4E 'N' - 0x00,0x00,0x00,0x62,0x62,0x52,0x52,0x4A,0x4A,0x46,0x46,0x00,0x00, - - 9, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x50 'P' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x78,0x40,0x40,0x40,0x00,0x00, - - 9, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x04,0x00,0x03,0x00, - - 8, // 0x52 'R' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x78,0x48,0x44,0x42,0x00,0x00, - - 8, // 0x53 'S' - 0x00,0x00,0x00,0x3C,0x42,0x40,0x30,0x0C,0x02,0x42,0x3C,0x00,0x00, - - 7, // 0x54 'T' - 0x00,0x00,0x00,0xFE,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - - 8, // 0x55 'U' - 0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, - - 8, // 0x56 'V' - 0x00,0x00,0x00,0x42,0x42,0x42,0x24,0x24,0x24,0x18,0x18,0x00,0x00, - - 11, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x40,0x44,0x40,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x11,0x00,0x11,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x58 'X' - 0x00,0x00,0x00,0x42,0x42,0x24,0x18,0x18,0x24,0x42,0x42,0x00,0x00, - - 7, // 0x59 'Y' - 0x00,0x00,0x00,0x82,0x44,0x28,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - - 8, // 0x5A 'Z' - 0x00,0x00,0x00,0x7E,0x02,0x04,0x08,0x10,0x20,0x40,0x7E,0x00,0x00, - - 5, // 0x5B '[' - 0x00,0x00,0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70, - - 5, // 0x5C '\' - 0x00,0x00,0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x00, - - 5, // 0x5D ']' - 0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70, - - 9, // 0x5E '^' - 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x14,0x00,0x22,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE, - - 7, // 0x60 '`' - 0x00,0x00,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x44,0x3C,0x00,0x00, - - 7, // 0x62 'b' - 0x00,0x00,0x40,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x78,0x00,0x00, - - 6, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x44,0x38,0x00,0x00, - - 7, // 0x64 'd' - 0x00,0x00,0x04,0x04,0x04,0x3C,0x44,0x44,0x44,0x44,0x3C,0x00,0x00, - - 7, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x7C,0x40,0x44,0x38,0x00,0x00, - - 4, // 0x66 'f' - 0x00,0x00,0x30,0x40,0x40,0xF0,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - - 7, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x3C,0x04,0x38, - - 7, // 0x68 'h' - 0x00,0x00,0x40,0x40,0x40,0x78,0x44,0x44,0x44,0x44,0x44,0x00,0x00, - - 3, // 0x69 'i' - 0x00,0x00,0x40,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - - 4, // 0x6A 'j' - 0x00,0x00,0x20,0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0xC0, - - 7, // 0x6B 'k' - 0x00,0x00,0x40,0x40,0x40,0x44,0x48,0x50,0x70,0x48,0x44,0x00,0x00, - - 3, // 0x6C 'l' - 0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - - 11, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7B,0x80,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x00,0x00,0x00,0x00, - - 7, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x44,0x00,0x00, - - 7, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x38,0x00,0x00, - - 7, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x78,0x40,0x40, - - 7, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x3C,0x04,0x04, - - 5, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x58,0x60,0x40,0x40,0x40,0x40,0x00,0x00, - - 6, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x60,0x18,0x08,0x70,0x00,0x00, - - 4, // 0x74 't' - 0x00,0x00,0x00,0x40,0x40,0xF0,0x40,0x40,0x40,0x40,0x30,0x00,0x00, - - 7, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x3C,0x00,0x00, - - 7, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00, - - 9, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x00,0x49,0x00,0x55,0x00,0x55,0x00,0x22,0x00,0x22,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x44,0x28,0x10,0x10,0x28,0x44,0x00,0x00, - - 7, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x44,0x28,0x28,0x28,0x10,0x10,0x10,0x20, - - 6, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x78,0x08,0x10,0x20,0x40,0x78,0x00,0x00, - - 7, // 0x7B '{' - 0x00,0x00,0x0C,0x10,0x10,0x10,0x10,0x60,0x10,0x10,0x10,0x10,0x0C, - - 5, // 0x7C '|' - 0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - - 7, // 0x7D '}' - 0x00,0x00,0x60,0x10,0x10,0x10,0x10,0x0C,0x10,0x10,0x10,0x10,0x60, - - 9, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x49,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x7F,0x80,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u verdana13_bold[] = - { - 13, 3, 32, 128-32, - 0x00,0x00,0x0E,0x00,0x1C,0x00,0x2A,0x00,0x45,0x00,0x53,0x00,0x6E,0x00,0x89,0x00,0x97,0x00, - 0xA5,0x00,0xB3,0x00,0xC1,0x00,0xDC,0x00,0xEA,0x00,0xF8,0x00,0x06,0x01,0x14,0x01,0x22,0x01, - 0x30,0x01,0x3E,0x01,0x4C,0x01,0x5A,0x01,0x68,0x01,0x76,0x01,0x84,0x01,0x92,0x01,0xA0,0x01, - 0xAE,0x01,0xBC,0x01,0xD7,0x01,0xF2,0x01,0x0D,0x02,0x1B,0x02,0x36,0x02,0x51,0x02,0x5F,0x02, - 0x6D,0x02,0x88,0x02,0x96,0x02,0xA4,0x02,0xBF,0x02,0xDA,0x02,0xE8,0x02,0xF6,0x02,0x04,0x03, - 0x12,0x03,0x2D,0x03,0x48,0x03,0x63,0x03,0x71,0x03,0x8C,0x03,0x9A,0x03,0xA8,0x03,0xB6,0x03, - 0xD1,0x03,0xDF,0x03,0xFA,0x03,0x08,0x04,0x16,0x04,0x24,0x04,0x32,0x04,0x40,0x04,0x4E,0x04, - 0x69,0x04,0x77,0x04,0x85,0x04,0x93,0x04,0xA1,0x04,0xAF,0x04,0xBD,0x04,0xCB,0x04,0xD9,0x04, - 0xE7,0x04,0xF5,0x04,0x03,0x05,0x11,0x05,0x1F,0x05,0x2D,0x05,0x48,0x05,0x56,0x05,0x64,0x05, - 0x72,0x05,0x80,0x05,0x8E,0x05,0x9C,0x05,0xAA,0x05,0xB8,0x05,0xC6,0x05,0xE1,0x05,0xEF,0x05, - 0xFD,0x05,0x0B,0x06,0x19,0x06,0x27,0x06,0x35,0x06,0x50,0x06, - - 4, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x21 '!' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x60,0x00,0x00, - - 7, // 0x22 '"' - 0x00,0x00,0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0x00,0x0A,0x00,0x3F,0x00,0x14,0x00,0x14,0x00,0x7E,0x00,0x28,0x00,0x28,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x24 '$' - 0x00,0x00,0x08,0x08,0x3C,0x6A,0x68,0x3C,0x16,0x56,0x3C,0x10,0x10, - - 14, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x80,0x6C,0x80,0x6D,0x00,0x6D,0x70,0x3A,0xD8,0x02,0xD8,0x04,0xD8,0x04,0x70,0x00,0x00,0x00,0x00, - - 10, // 0x26 '&' - 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x6C,0x00,0x6C,0x00,0x39,0x80,0x6D,0x00,0x66,0x00,0x63,0x00,0x3D,0x80,0x00,0x00,0x00,0x00, - - 4, // 0x27 ''' - 0x00,0x00,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x28 '(' - 0x00,0x00,0x18,0x30,0x30,0x60,0x60,0x60,0x60,0x60,0x30,0x30,0x18, - - 6, // 0x29 ')' - 0x00,0x00,0x60,0x30,0x30,0x18,0x18,0x18,0x18,0x18,0x30,0x30,0x60, - - 8, // 0x2A '*' - 0x00,0x00,0x10,0x54,0x38,0x54,0x10,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x7F,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x60,0x40, - - 6, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00, - - 8, // 0x2F '/' - 0x00,0x00,0x06,0x06,0x0C,0x0C,0x18,0x18,0x18,0x30,0x30,0x60,0x60, - - 8, // 0x30 '0' - 0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x66,0x66,0x66,0x3C,0x00,0x00, - - 8, // 0x31 '1' - 0x00,0x00,0x00,0x18,0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00, - - 8, // 0x32 '2' - 0x00,0x00,0x00,0x3C,0x66,0x06,0x0C,0x18,0x30,0x60,0x7E,0x00,0x00, - - 8, // 0x33 '3' - 0x00,0x00,0x00,0x3C,0x66,0x06,0x1C,0x06,0x06,0x66,0x3C,0x00,0x00, - - 8, // 0x34 '4' - 0x00,0x00,0x00,0x04,0x0C,0x1C,0x2C,0x4C,0x7E,0x0C,0x0C,0x00,0x00, - - 8, // 0x35 '5' - 0x00,0x00,0x00,0x3E,0x30,0x30,0x3C,0x06,0x06,0x66,0x3C,0x00,0x00, - - 8, // 0x36 '6' - 0x00,0x00,0x00,0x1C,0x30,0x60,0x7C,0x66,0x66,0x66,0x3C,0x00,0x00, - - 8, // 0x37 '7' - 0x00,0x00,0x00,0x7E,0x06,0x0C,0x0C,0x18,0x18,0x30,0x30,0x00,0x00, - - 8, // 0x38 '8' - 0x00,0x00,0x00,0x3C,0x66,0x66,0x3C,0x66,0x66,0x66,0x3C,0x00,0x00, - - 8, // 0x39 '9' - 0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x3E,0x06,0x0C,0x38,0x00,0x00, - - 4, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00, - - 4, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x60,0x40, - - 9, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x18,0x00,0x06,0x00,0x01,0x00,0x06,0x00,0x18,0x00,0x60,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x3F '?' - 0x00,0x00,0x00,0x38,0x4C,0x0C,0x18,0x30,0x30,0x00,0x30,0x00,0x00, - - 11, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x20,0x40,0x4F,0x40,0x5B,0x40,0x5B,0x40,0x5B,0x40,0x4F,0x80,0x20,0x00,0x1F,0x00,0x00,0x00, - - 9, // 0x41 'A' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x1C,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x7F,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x42 'B' - 0x00,0x00,0x00,0x7C,0x66,0x66,0x7C,0x66,0x66,0x66,0x7C,0x00,0x00, - - 8, // 0x43 'C' - 0x00,0x00,0x00,0x3C,0x62,0x60,0x60,0x60,0x60,0x62,0x3C,0x00,0x00, - - 9, // 0x44 'D' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x66,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x66,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x45 'E' - 0x00,0x00,0x00,0x7E,0x60,0x60,0x7E,0x60,0x60,0x60,0x7E,0x00,0x00, - - 8, // 0x46 'F' - 0x00,0x00,0x00,0x7E,0x60,0x60,0x7E,0x60,0x60,0x60,0x60,0x00,0x00, - - 9, // 0x47 'G' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x61,0x00,0x60,0x00,0x60,0x00,0x67,0x00,0x63,0x00,0x63,0x00,0x3F,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x48 'H' - 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7F,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x49 'I' - 0x00,0x00,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00, - - 6, // 0x4A 'J' - 0x00,0x00,0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0xF0,0x00,0x00, - - 8, // 0x4B 'K' - 0x00,0x00,0x00,0x66,0x6C,0x78,0x70,0x70,0x78,0x6C,0x66,0x00,0x00, - - 7, // 0x4C 'L' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x7E,0x00,0x00, - - 10, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x80,0x71,0x80,0x7B,0x80,0x5D,0x80,0x49,0x80,0x41,0x80,0x41,0x80,0x41,0x80,0x00,0x00,0x00,0x00, - - 9, // 0x4E 'N' - 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x61,0x00,0x71,0x00,0x59,0x00,0x4D,0x00,0x47,0x00,0x43,0x00,0x41,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x50 'P' - 0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x7C,0x60,0x60,0x60,0x00,0x00, - - 9, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x0C,0x00,0x07,0x00, - - 8, // 0x52 'R' - 0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x7C,0x6C,0x66,0x63,0x00,0x00, - - 8, // 0x53 'S' - 0x00,0x00,0x00,0x3C,0x62,0x60,0x7C,0x3E,0x06,0x46,0x3C,0x00,0x00, - - 8, // 0x54 'T' - 0x00,0x00,0x00,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00, - - 9, // 0x55 'U' - 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x56 'V' - 0x00,0x00,0x00,0x66,0x66,0x66,0x3C,0x3C,0x3C,0x18,0x18,0x00,0x00, - - 12, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x60,0x66,0x60,0x66,0x60,0x36,0xC0,0x3F,0xC0,0x39,0xC0,0x19,0x80,0x19,0x80,0x00,0x00,0x00,0x00, - - 8, // 0x58 'X' - 0x00,0x00,0x00,0x66,0x66,0x3C,0x18,0x18,0x3C,0x66,0x66,0x00,0x00, - - 8, // 0x59 'Y' - 0x00,0x00,0x00,0x66,0x66,0x3C,0x3C,0x18,0x18,0x18,0x18,0x00,0x00, - - 8, // 0x5A 'Z' - 0x00,0x00,0x00,0x7E,0x06,0x0E,0x1C,0x38,0x70,0x60,0x7E,0x00,0x00, - - 6, // 0x5B '[' - 0x00,0x00,0x78,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x78, - - 8, // 0x5C '\' - 0x00,0x00,0x60,0x60,0x30,0x30,0x18,0x18,0x18,0x0C,0x0C,0x06,0x06, - - 6, // 0x5D ']' - 0x00,0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x78, - - 10, // 0x5E '^' - 0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, - - 8, // 0x60 '`' - 0x00,0x00,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x06,0x3E,0x66,0x66,0x3E,0x00,0x00, - - 8, // 0x62 'b' - 0x00,0x00,0x60,0x60,0x60,0x7C,0x66,0x66,0x66,0x66,0x7C,0x00,0x00, - - 7, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x60,0x60,0x60,0x60,0x3C,0x00,0x00, - - 8, // 0x64 'd' - 0x00,0x00,0x06,0x06,0x06,0x3E,0x66,0x66,0x66,0x66,0x3E,0x00,0x00, - - 8, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x7E,0x60,0x62,0x3C,0x00,0x00, - - 5, // 0x66 'f' - 0x00,0x00,0x38,0x60,0x60,0xF8,0x60,0x60,0x60,0x60,0x60,0x00,0x00, - - 8, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x3E,0x66,0x66,0x66,0x66,0x3E,0x06,0x3C, - - 8, // 0x68 'h' - 0x00,0x00,0x60,0x60,0x60,0x7C,0x66,0x66,0x66,0x66,0x66,0x00,0x00, - - 4, // 0x69 'i' - 0x00,0x00,0x00,0x60,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00, - - 5, // 0x6A 'j' - 0x00,0x00,0x00,0x30,0x00,0x70,0x30,0x30,0x30,0x30,0x30,0x30,0xE0, - - 8, // 0x6B 'k' - 0x00,0x00,0x60,0x60,0x60,0x66,0x6C,0x78,0x78,0x6C,0x66,0x00,0x00, - - 4, // 0x6C 'l' - 0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00, - - 12, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7D,0xC0,0x66,0x60,0x66,0x60,0x66,0x60,0x66,0x60,0x66,0x60,0x00,0x00,0x00,0x00, - - 8, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x66,0x00,0x00, - - 8, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x66,0x3C,0x00,0x00, - - 8, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x7C,0x60,0x60, - - 8, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x3E,0x66,0x66,0x66,0x66,0x3E,0x06,0x06, - - 6, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x6C,0x7C,0x60,0x60,0x60,0x60,0x00,0x00, - - 7, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x60,0x78,0x3C,0x0C,0x78,0x00,0x00, - - 5, // 0x74 't' - 0x00,0x00,0x00,0x60,0x60,0xF8,0x60,0x60,0x60,0x60,0x38,0x00,0x00, - - 8, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x3E,0x00,0x00, - - 8, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x3C,0x3C,0x18,0x00,0x00, - - 10, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6D,0x80,0x6D,0x80,0x6D,0x80,0x6D,0x80,0x33,0x00,0x33,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x3C,0x3C,0x66,0x66,0x00,0x00, - - 8, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x3C,0x3C,0x18,0x18,0x30,0x30, - - 7, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x0C,0x18,0x30,0x60,0x7C,0x00,0x00, - - 8, // 0x7B '{' - 0x00,0x00,0x0E,0x18,0x18,0x18,0x18,0x70,0x18,0x18,0x18,0x18,0x0E, - - 6, // 0x7C '|' - 0x00,0x00,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30, - - 8, // 0x7D '}' - 0x00,0x00,0x70,0x18,0x18,0x18,0x18,0x0E,0x18,0x18,0x18,0x18,0x70, - - 9, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x00,0x49,0x00,0x49,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x7F,0x80,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u verdana14[] = - { - 14, 3, 32, 128-32, - 0x00,0x00,0x0F,0x00,0x1E,0x00,0x2D,0x00,0x4A,0x00,0x59,0x00,0x76,0x00,0x93,0x00,0xA2,0x00, - 0xB1,0x00,0xC0,0x00,0xCF,0x00,0xEC,0x00,0xFB,0x00,0x0A,0x01,0x19,0x01,0x28,0x01,0x37,0x01, - 0x46,0x01,0x55,0x01,0x64,0x01,0x73,0x01,0x82,0x01,0x91,0x01,0xA0,0x01,0xAF,0x01,0xBE,0x01, - 0xCD,0x01,0xDC,0x01,0xF9,0x01,0x16,0x02,0x33,0x02,0x42,0x02,0x5F,0x02,0x6E,0x02,0x7D,0x02, - 0x9A,0x02,0xB7,0x02,0xC6,0x02,0xD5,0x02,0xF2,0x02,0x0F,0x03,0x1E,0x03,0x2D,0x03,0x3C,0x03, - 0x4B,0x03,0x68,0x03,0x85,0x03,0xA2,0x03,0xB1,0x03,0xCE,0x03,0xDD,0x03,0xEC,0x03,0xFB,0x03, - 0x18,0x04,0x27,0x04,0x44,0x04,0x53,0x04,0x62,0x04,0x71,0x04,0x80,0x04,0x8F,0x04,0x9E,0x04, - 0xBB,0x04,0xCA,0x04,0xD9,0x04,0xE8,0x04,0xF7,0x04,0x06,0x05,0x15,0x05,0x24,0x05,0x33,0x05, - 0x42,0x05,0x51,0x05,0x60,0x05,0x6F,0x05,0x7E,0x05,0x8D,0x05,0xAA,0x05,0xB9,0x05,0xC8,0x05, - 0xD7,0x05,0xE6,0x05,0xF5,0x05,0x04,0x06,0x13,0x06,0x22,0x06,0x31,0x06,0x4E,0x06,0x5D,0x06, - 0x6C,0x06,0x7B,0x06,0x8A,0x06,0x99,0x06,0xA8,0x06,0xC5,0x06, - - 4, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x21 '!' - 0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00, - - 6, // 0x22 '"' - 0x00,0x00,0x48,0x48,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x09,0x00,0x12,0x00,0x3F,0x80,0x12,0x00,0x12,0x00,0x7F,0x00,0x24,0x00,0x24,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x24 '$' - 0x00,0x00,0x10,0x10,0x3E,0x50,0x50,0x30,0x1C,0x12,0x12,0x7C,0x10,0x10, - - 13, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x80,0x49,0x00,0x49,0x00,0x4A,0x00,0x32,0x60,0x02,0x90,0x04,0x90,0x04,0x90,0x08,0x60,0x00,0x00,0x00,0x00, - - 10, // 0x26 '&' - 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x39,0x00,0x45,0x00,0x42,0x00,0x43,0x00,0x3C,0x80,0x00,0x00,0x00,0x00, - - 3, // 0x27 ''' - 0x00,0x00,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x28 '(' - 0x00,0x00,0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10, - - 5, // 0x29 ')' - 0x00,0x00,0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x10,0x20,0x20,0x40, - - 8, // 0x2A '*' - 0x00,0x00,0x10,0x54,0x38,0x54,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x7F,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x40, - - 5, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00, - - 5, // 0x2F '/' - 0x00,0x00,0x08,0x08,0x10,0x10,0x10,0x20,0x20,0x20,0x40,0x40,0x40,0x80, - - 8, // 0x30 '0' - 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, - - 8, // 0x31 '1' - 0x00,0x00,0x00,0x08,0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00, - - 8, // 0x32 '2' - 0x00,0x00,0x00,0x3C,0x42,0x42,0x02,0x04,0x18,0x20,0x40,0x7E,0x00,0x00, - - 8, // 0x33 '3' - 0x00,0x00,0x00,0x3C,0x42,0x02,0x02,0x1C,0x02,0x02,0x42,0x3C,0x00,0x00, - - 8, // 0x34 '4' - 0x00,0x00,0x00,0x04,0x0C,0x14,0x24,0x44,0x7F,0x04,0x04,0x04,0x00,0x00, - - 8, // 0x35 '5' - 0x00,0x00,0x00,0x7E,0x40,0x40,0x7C,0x02,0x02,0x02,0x42,0x3C,0x00,0x00, - - 8, // 0x36 '6' - 0x00,0x00,0x00,0x1C,0x20,0x40,0x7C,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, - - 8, // 0x37 '7' - 0x00,0x00,0x00,0x7E,0x02,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x00,0x00, - - 8, // 0x38 '8' - 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x3C,0x42,0x42,0x42,0x3C,0x00,0x00, - - 8, // 0x39 '9' - 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x3E,0x02,0x04,0x38,0x00,0x00, - - 5, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00,0x20,0x20,0x00,0x00, - - 5, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00,0x20,0x20,0x20,0x40, - - 9, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x18,0x00,0x06,0x00,0x01,0x00,0x06,0x00,0x18,0x00,0x60,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x3F '?' - 0x00,0x00,0x00,0x38,0x44,0x04,0x04,0x08,0x10,0x10,0x00,0x10,0x00,0x00, - - 12, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x27,0x40,0x49,0x20,0x49,0x20,0x49,0x20,0x49,0x20,0x27,0xC0,0x30,0x00,0x0F,0x00,0x00,0x00, - - 8, // 0x41 'A' - 0x00,0x00,0x00,0x18,0x18,0x24,0x24,0x42,0x42,0x7E,0x81,0x81,0x00,0x00, - - 8, // 0x42 'B' - 0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x7C,0x42,0x42,0x42,0x7C,0x00,0x00, - - 9, // 0x43 'C' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x44 'D' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x42,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x45 'E' - 0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x7E,0x40,0x40,0x40,0x7E,0x00,0x00, - - 7, // 0x46 'F' - 0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x40,0x00,0x00, - - 9, // 0x47 'G' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x00,0x40,0x00,0x47,0x00,0x41,0x00,0x41,0x00,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x48 'H' - 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7F,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x49 'I' - 0x00,0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, - - 5, // 0x4A 'J' - 0x00,0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0xE0,0x00,0x00, - - 8, // 0x4B 'K' - 0x00,0x00,0x00,0x42,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x42,0x00,0x00, - - 7, // 0x4C 'L' - 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7E,0x00,0x00, - - 10, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x52,0x80,0x52,0x80,0x52,0x80,0x4C,0x80,0x4C,0x80,0x40,0x80,0x40,0x80,0x00,0x00,0x00,0x00, - - 9, // 0x4E 'N' - 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x61,0x00,0x51,0x00,0x51,0x00,0x49,0x00,0x45,0x00,0x45,0x00,0x43,0x00,0x43,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x50 'P' - 0x00,0x00,0x00,0x7C,0x42,0x42,0x42,0x42,0x7C,0x40,0x40,0x40,0x00,0x00, - - 10, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x02,0x00,0x01,0x80, - - 8, // 0x52 'R' - 0x00,0x00,0x00,0x7C,0x42,0x42,0x42,0x7C,0x48,0x44,0x42,0x41,0x00,0x00, - - 8, // 0x53 'S' - 0x00,0x00,0x00,0x3C,0x42,0x40,0x40,0x3C,0x02,0x02,0x42,0x3C,0x00,0x00, - - 7, // 0x54 'T' - 0x00,0x00,0x00,0xFE,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - - 9, // 0x55 'U' - 0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x56 'V' - 0x00,0x00,0x00,0x81,0x81,0x42,0x42,0x42,0x24,0x24,0x18,0x18,0x00,0x00, - - 13, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x10,0x42,0x10,0x45,0x10,0x45,0x10,0x25,0x20,0x28,0xA0,0x28,0xA0,0x10,0x40,0x10,0x40,0x00,0x00,0x00,0x00, - - 8, // 0x58 'X' - 0x00,0x00,0x00,0x42,0x42,0x24,0x18,0x18,0x18,0x24,0x42,0x42,0x00,0x00, - - 7, // 0x59 'Y' - 0x00,0x00,0x00,0x82,0x44,0x44,0x28,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - - 8, // 0x5A 'Z' - 0x00,0x00,0x00,0x7E,0x02,0x04,0x08,0x10,0x10,0x20,0x40,0x7E,0x00,0x00, - - 5, // 0x5B '[' - 0x00,0x00,0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70, - - 5, // 0x5C '\' - 0x00,0x00,0x80,0x80,0x40,0x40,0x40,0x20,0x20,0x10,0x10,0x10,0x08,0x08, - - 5, // 0x5D ']' - 0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70, - - 10, // 0x5E '^' - 0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x12,0x00,0x21,0x00,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, - - 8, // 0x60 '`' - 0x00,0x00,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x02,0x02,0x3E,0x42,0x42,0x3E,0x00,0x00, - - 8, // 0x62 'b' - 0x00,0x00,0x40,0x40,0x40,0x5C,0x62,0x42,0x42,0x42,0x42,0x7C,0x00,0x00, - - 6, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x40,0x40,0x40,0x44,0x38,0x00,0x00, - - 8, // 0x64 'd' - 0x00,0x00,0x02,0x02,0x02,0x3E,0x42,0x42,0x42,0x42,0x46,0x3A,0x00,0x00, - - 8, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x7E,0x40,0x42,0x3C,0x00,0x00, - - 4, // 0x66 'f' - 0x00,0x00,0x30,0x40,0x40,0xF0,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - - 8, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x3E,0x42,0x42,0x42,0x42,0x46,0x3A,0x02,0x3C, - - 8, // 0x68 'h' - 0x00,0x00,0x40,0x40,0x40,0x5C,0x62,0x42,0x42,0x42,0x42,0x42,0x00,0x00, - - 3, // 0x69 'i' - 0x00,0x00,0x40,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - - 4, // 0x6A 'j' - 0x00,0x00,0x20,0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xC0, - - 7, // 0x6B 'k' - 0x00,0x00,0x40,0x40,0x40,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00, - - 3, // 0x6C 'l' - 0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - - 11, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7B,0x80,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x00,0x00,0x00,0x00, - - 8, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x5C,0x62,0x42,0x42,0x42,0x42,0x42,0x00,0x00, - - 8, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, - - 8, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x5C,0x62,0x42,0x42,0x42,0x42,0x7C,0x40,0x40, - - 8, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x3E,0x42,0x42,0x42,0x42,0x46,0x3A,0x02,0x02, - - 5, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x58,0x60,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - - 7, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x40,0x40,0x38,0x04,0x04,0x78,0x00,0x00, - - 5, // 0x74 't' - 0x00,0x00,0x00,0x40,0x40,0xF8,0x40,0x40,0x40,0x40,0x40,0x38,0x00,0x00, - - 8, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x46,0x3A,0x00,0x00, - - 7, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x00,0x00, - - 11, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x40,0x44,0x40,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x11,0x00,0x11,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00, - - 7, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x10,0x20, - - 7, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00, - - 8, // 0x7B '{' - 0x00,0x00,0x0C,0x10,0x10,0x10,0x10,0x60,0x10,0x10,0x10,0x10,0x10,0x0C, - - 5, // 0x7C '|' - 0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - - 8, // 0x7D '}' - 0x00,0x00,0x30,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x30, - - 10, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x80,0x4C,0x80,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0xE0,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u verdana14_bold[] = - { - 14, 3, 32, 128-32, - 0x00,0x00,0x0F,0x00,0x1E,0x00,0x2D,0x00,0x4A,0x00,0x67,0x00,0x84,0x00,0xA1,0x00,0xB0,0x00, - 0xBF,0x00,0xCE,0x00,0xEB,0x00,0x08,0x01,0x17,0x01,0x26,0x01,0x35,0x01,0x44,0x01,0x61,0x01, - 0x7E,0x01,0x9B,0x01,0xB8,0x01,0xD5,0x01,0xF2,0x01,0x0F,0x02,0x2C,0x02,0x49,0x02,0x66,0x02, - 0x75,0x02,0x84,0x02,0xA1,0x02,0xBE,0x02,0xDB,0x02,0xEA,0x02,0x07,0x03,0x24,0x03,0x41,0x03, - 0x5E,0x03,0x7B,0x03,0x8A,0x03,0x99,0x03,0xB6,0x03,0xD3,0x03,0xE2,0x03,0xF1,0x03,0x0E,0x04, - 0x1D,0x04,0x3A,0x04,0x57,0x04,0x74,0x04,0x91,0x04,0xAE,0x04,0xCB,0x04,0xE8,0x04,0xF7,0x04, - 0x14,0x05,0x31,0x05,0x4E,0x05,0x6B,0x05,0x88,0x05,0x97,0x05,0xA6,0x05,0xB5,0x05,0xC4,0x05, - 0xE1,0x05,0xFE,0x05,0x1B,0x06,0x2A,0x06,0x39,0x06,0x48,0x06,0x57,0x06,0x66,0x06,0x75,0x06, - 0x84,0x06,0x93,0x06,0xA2,0x06,0xB1,0x06,0xC0,0x06,0xCF,0x06,0xEC,0x06,0xFB,0x06,0x0A,0x07, - 0x19,0x07,0x28,0x07,0x37,0x07,0x46,0x07,0x55,0x07,0x64,0x07,0x73,0x07,0x90,0x07,0x9F,0x07, - 0xAE,0x07,0xBD,0x07,0xDA,0x07,0xE9,0x07,0x06,0x08,0x23,0x08, - - 4, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x21 '!' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x60,0x60,0x00,0x00, - - 7, // 0x22 '"' - 0x00,0x00,0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x09,0x00,0x3F,0x80,0x3F,0x80,0x12,0x00,0x7F,0x00,0x7F,0x00,0x24,0x00,0x24,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x24 '$' - 0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x3E,0x00,0x69,0x00,0x68,0x00,0x7E,0x00,0x3F,0x00,0x0B,0x00,0x4B,0x00,0x3E,0x00,0x08,0x00,0x08,0x00, - - 15, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x6C,0x40,0x6C,0x80,0x6C,0xB8,0x6D,0x6C,0x3A,0x6C,0x02,0x6C,0x04,0x6C,0x04,0x38,0x00,0x00,0x00,0x00, - - 10, // 0x26 '&' - 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x39,0x80,0x6D,0x00,0x66,0x00,0x63,0x00,0x3D,0x80,0x00,0x00,0x00,0x00, - - 4, // 0x27 ''' - 0x00,0x00,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x28 '(' - 0x00,0x00,0x18,0x30,0x30,0x60,0x60,0x60,0x60,0x60,0x60,0x30,0x30,0x18, - - 7, // 0x29 ')' - 0x00,0x00,0x30,0x18,0x18,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x18,0x18,0x30, - - 9, // 0x2A '*' - 0x00,0x00,0x00,0x00,0x08,0x00,0x2A,0x00,0x1C,0x00,0x1C,0x00,0x2A,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x7F,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x60,0x40, - - 6, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00, - - 8, // 0x2F '/' - 0x00,0x00,0x06,0x06,0x0C,0x0C,0x0C,0x18,0x18,0x30,0x30,0x30,0x60,0x60, - - 9, // 0x30 '0' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x31 '1' - 0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x3C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x3F,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x32 '2' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x03,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x7F,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x33 '3' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x03,0x00,0x03,0x00,0x1E,0x00,0x03,0x00,0x03,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x34 '4' - 0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x0E,0x00,0x16,0x00,0x16,0x00,0x26,0x00,0x46,0x00,0x7F,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x35 '5' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x30,0x00,0x30,0x00,0x3E,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x36 '6' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x30,0x00,0x60,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x37 '7' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x38 '8' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x39 '9' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3F,0x00,0x03,0x00,0x06,0x00,0x3C,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x00,0x00, - - 5, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x60,0x60,0x60,0x40, - - 10, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x06,0x00,0x18,0x00,0x60,0x00,0x60,0x00,0x18,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x03,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x3F '?' - 0x00,0x00,0x00,0x38,0x4C,0x0C,0x18,0x30,0x30,0x00,0x30,0x30,0x00,0x00, - - 12, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x2F,0x40,0x5B,0x20,0x5B,0x20,0x5B,0x20,0x5B,0x20,0x2F,0xC0,0x30,0x00,0x0F,0x00,0x00,0x00, - - 9, // 0x41 'A' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x1C,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x7F,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x42 'B' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7E,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x43 'C' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x31,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x31,0x00,0x1E,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x44 'D' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7E,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x45 'E' - 0x00,0x00,0x00,0x7E,0x60,0x60,0x60,0x7E,0x60,0x60,0x60,0x7E,0x00,0x00, - - 8, // 0x46 'F' - 0x00,0x00,0x00,0x7E,0x60,0x60,0x60,0x7E,0x60,0x60,0x60,0x60,0x00,0x00, - - 10, // 0x47 'G' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x30,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x67,0x80,0x61,0x80,0x31,0x80,0x1F,0x80,0x00,0x00,0x00,0x00, - - 10, // 0x48 'H' - 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x7F,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x00,0x00,0x00,0x00, - - 6, // 0x49 'I' - 0x00,0x00,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00, - - 7, // 0x4A 'J' - 0x00,0x00,0x00,0x7C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0xF8,0x00,0x00, - - 9, // 0x4B 'K' - 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x66,0x00,0x6C,0x00,0x78,0x00,0x70,0x00,0x78,0x00,0x6C,0x00,0x66,0x00,0x63,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x4C 'L' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x7F,0x00,0x00, - - 11, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x71,0xC0,0x71,0xC0,0x5A,0xC0,0x5A,0xC0,0x4C,0xC0,0x4C,0xC0,0x40,0xC0,0x40,0xC0,0x00,0x00,0x00,0x00, - - 10, // 0x4E 'N' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x80,0x70,0x80,0x58,0x80,0x58,0x80,0x4C,0x80,0x46,0x80,0x46,0x80,0x43,0x80,0x41,0x80,0x00,0x00,0x00,0x00, - - 11, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x50 'P' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7E,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x06,0x00,0x03,0xC0, - - 9, // 0x52 'R' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7E,0x00,0x6C,0x00,0x66,0x00,0x63,0x00,0x61,0x80,0x00,0x00,0x00,0x00, - - 9, // 0x53 'S' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x61,0x00,0x60,0x00,0x70,0x00,0x3E,0x00,0x07,0x00,0x03,0x00,0x43,0x00,0x3E,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x54 'T' - 0x00,0x00,0x00,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00, - - 10, // 0x55 'U' - 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x3F,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x56 'V' - 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x00,0x00,0x00,0x00, - - 14, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x18,0x63,0x18,0x63,0x18,0x33,0x30,0x37,0xB0,0x34,0xB0,0x1C,0xE0,0x18,0x60,0x18,0x60,0x00,0x00,0x00,0x00, - - 9, // 0x58 'X' - 0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x36,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x59 'Y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x5A 'Z' - 0x00,0x00,0x00,0x7E,0x0C,0x0C,0x18,0x18,0x30,0x30,0x60,0x7E,0x00,0x00, - - 6, // 0x5B '[' - 0x00,0x00,0x78,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x78, - - 8, // 0x5C '\' - 0x00,0x00,0x60,0x60,0x30,0x30,0x30,0x18,0x18,0x0C,0x0C,0x0C,0x06,0x06, - - 6, // 0x5D ']' - 0x00,0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x78, - - 10, // 0x5E '^' - 0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x80, - - 9, // 0x60 '`' - 0x00,0x00,0x00,0x00,0x30,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x06,0x3E,0x66,0x66,0x66,0x3E,0x00,0x00, - - 8, // 0x62 'b' - 0x00,0x00,0x60,0x60,0x60,0x7C,0x66,0x66,0x66,0x66,0x66,0x7C,0x00,0x00, - - 7, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x62,0x60,0x60,0x60,0x62,0x3C,0x00,0x00, - - 8, // 0x64 'd' - 0x00,0x00,0x06,0x06,0x06,0x3E,0x66,0x66,0x66,0x66,0x66,0x3E,0x00,0x00, - - 8, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x66,0x7E,0x60,0x62,0x3C,0x00,0x00, - - 5, // 0x66 'f' - 0x00,0x00,0x38,0x60,0x60,0xF8,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00, - - 8, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x3E,0x66,0x66,0x66,0x66,0x66,0x3E,0x06,0x3C, - - 8, // 0x68 'h' - 0x00,0x00,0x60,0x60,0x60,0x7C,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00, - - 4, // 0x69 'i' - 0x00,0x00,0x60,0x60,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00, - - 5, // 0x6A 'j' - 0x00,0x00,0x30,0x30,0x00,0x70,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0xE0, - - 8, // 0x6B 'k' - 0x00,0x00,0x60,0x60,0x60,0x66,0x6C,0x78,0x78,0x6C,0x66,0x63,0x00,0x00, - - 4, // 0x6C 'l' - 0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00, - - 12, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6C,0xC0,0x77,0x60,0x66,0x60,0x66,0x60,0x66,0x60,0x66,0x60,0x66,0x60,0x00,0x00,0x00,0x00, - - 8, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00, - - 8, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x66,0x66,0x3C,0x00,0x00, - - 8, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x66,0x7C,0x60,0x60, - - 8, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x3E,0x66,0x66,0x66,0x66,0x66,0x3E,0x06,0x06, - - 6, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x6C,0x7C,0x60,0x60,0x60,0x60,0x60,0x00,0x00, - - 7, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x3C,0x60,0x60,0x38,0x0C,0x0C,0x78,0x00,0x00, - - 5, // 0x74 't' - 0x00,0x00,0x00,0x60,0x60,0xF8,0x60,0x60,0x60,0x60,0x60,0x38,0x00,0x00, - - 8, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x3E,0x00,0x00, - - 8, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x3C,0x3C,0x3C,0x18,0x00,0x00, - - 12, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x60,0x66,0x60,0x66,0x60,0x69,0x60,0x39,0xC0,0x30,0xC0,0x30,0xC0,0x00,0x00,0x00,0x00, - - 8, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x3C,0x18,0x3C,0x66,0x66,0x00,0x00, - - 8, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x3C,0x3C,0x3C,0x18,0x18,0x30, - - 7, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x7C,0x0C,0x18,0x38,0x30,0x60,0x7C,0x00,0x00, - - 9, // 0x7B '{' - 0x00,0x00,0x00,0x00,0x0E,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x70,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x0E,0x00, - - 6, // 0x7C '|' - 0x00,0x00,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30, - - 9, // 0x7D '}' - 0x00,0x00,0x00,0x00,0x38,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x07,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x38,0x00, - - 10, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x80,0x48,0x80,0x44,0x80,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0xE0,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u verdana16[] = - { - 16, 4, 32, 128-32, - 0x00,0x00,0x11,0x00,0x22,0x00,0x33,0x00,0x54,0x00,0x65,0x00,0x86,0x00,0xA7,0x00,0xB8,0x00, - 0xC9,0x00,0xDA,0x00,0xFB,0x00,0x1C,0x01,0x2D,0x01,0x3E,0x01,0x4F,0x01,0x60,0x01,0x71,0x01, - 0x82,0x01,0x93,0x01,0xA4,0x01,0xB5,0x01,0xC6,0x01,0xD7,0x01,0xE8,0x01,0xF9,0x01,0x0A,0x02, - 0x1B,0x02,0x2C,0x02,0x4D,0x02,0x6E,0x02,0x8F,0x02,0xA0,0x02,0xC1,0x02,0xE2,0x02,0xF3,0x02, - 0x14,0x03,0x35,0x03,0x46,0x03,0x57,0x03,0x78,0x03,0x99,0x03,0xAA,0x03,0xBB,0x03,0xCC,0x03, - 0xDD,0x03,0xFE,0x03,0x1F,0x04,0x40,0x04,0x51,0x04,0x72,0x04,0x93,0x04,0xB4,0x04,0xD5,0x04, - 0xF6,0x04,0x17,0x05,0x38,0x05,0x59,0x05,0x7A,0x05,0x9B,0x05,0xAC,0x05,0xBD,0x05,0xCE,0x05, - 0xEF,0x05,0x00,0x06,0x11,0x06,0x22,0x06,0x33,0x06,0x44,0x06,0x55,0x06,0x66,0x06,0x77,0x06, - 0x88,0x06,0x99,0x06,0xAA,0x06,0xBB,0x06,0xCC,0x06,0xDD,0x06,0xFE,0x06,0x0F,0x07,0x20,0x07, - 0x31,0x07,0x42,0x07,0x53,0x07,0x64,0x07,0x75,0x07,0x86,0x07,0x97,0x07,0xB8,0x07,0xC9,0x07, - 0xDA,0x07,0xEB,0x07,0xFC,0x07,0x0D,0x08,0x1E,0x08,0x3F,0x08, - - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x21 '!' - 0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x20,0x00,0x00,0x00, - - 5, // 0x22 '"' - 0x00,0x00,0x00,0x50,0x50,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x09,0x00,0x3F,0x80,0x12,0x00,0x12,0x00,0x7F,0x00,0x24,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x24 '$' - 0x00,0x00,0x00,0x10,0x10,0x3E,0x50,0x50,0x30,0x1C,0x12,0x12,0x7C,0x10,0x10,0x00, - - 13, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x44,0x80,0x45,0x00,0x45,0x00,0x3A,0xE0,0x05,0x10,0x05,0x10,0x09,0x10,0x10,0xE0,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x26 '&' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x38,0x80,0x45,0x00,0x42,0x00,0x46,0x00,0x39,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 3, // 0x27 ''' - 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x28 '(' - 0x00,0x00,0x00,0x08,0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10,0x08, - - 6, // 0x29 ')' - 0x00,0x00,0x00,0x40,0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x40, - - 9, // 0x2A '*' - 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x2A,0x00,0x1C,0x00,0x2A,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x7F,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x40,0x00, - - 7, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00, - - 6, // 0x2F '/' - 0x00,0x00,0x00,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80,0x00, - - 8, // 0x30 '0' - 0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00,0x00, - - 8, // 0x31 '1' - 0x00,0x00,0x00,0x00,0x08,0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00,0x00, - - 8, // 0x32 '2' - 0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x02,0x04,0x18,0x20,0x40,0x7E,0x00,0x00,0x00, - - 8, // 0x33 '3' - 0x00,0x00,0x00,0x00,0x3C,0x42,0x02,0x02,0x1C,0x02,0x02,0x42,0x3C,0x00,0x00,0x00, - - 8, // 0x34 '4' - 0x00,0x00,0x00,0x00,0x04,0x0C,0x14,0x24,0x44,0x7F,0x04,0x04,0x04,0x00,0x00,0x00, - - 8, // 0x35 '5' - 0x00,0x00,0x00,0x00,0x3E,0x20,0x20,0x20,0x3C,0x02,0x02,0x42,0x3C,0x00,0x00,0x00, - - 8, // 0x36 '6' - 0x00,0x00,0x00,0x00,0x1C,0x20,0x40,0x7C,0x42,0x42,0x42,0x42,0x3C,0x00,0x00,0x00, - - 8, // 0x37 '7' - 0x00,0x00,0x00,0x00,0x7E,0x02,0x04,0x04,0x08,0x08,0x10,0x10,0x10,0x00,0x00,0x00, - - 8, // 0x38 '8' - 0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x3C,0x42,0x42,0x42,0x3C,0x00,0x00,0x00, - - 8, // 0x39 '9' - 0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x3E,0x02,0x04,0x38,0x00,0x00,0x00, - - 6, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00, - - 6, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00,0x20,0x20,0x20,0x40,0x00, - - 9, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x18,0x00,0x06,0x00,0x01,0x00,0x06,0x00,0x18,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x3F '?' - 0x00,0x00,0x00,0x00,0x38,0x44,0x04,0x08,0x10,0x10,0x00,0x10,0x10,0x00,0x00,0x00, - - 13, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x10,0x40,0x27,0xA0,0x48,0x90,0x48,0x90,0x48,0x90,0x48,0x90,0x48,0x90,0x27,0xE0,0x10,0x00,0x0F,0x80,0x00,0x00, - - 9, // 0x41 'A' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x14,0x00,0x14,0x00,0x22,0x00,0x22,0x00,0x3E,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x42 'B' - 0x00,0x00,0x00,0x00,0x78,0x44,0x44,0x44,0x7C,0x42,0x42,0x42,0x7C,0x00,0x00,0x00, - - 9, // 0x43 'C' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x44 'D' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x42,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x45 'E' - 0x00,0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x7E,0x40,0x40,0x40,0x7E,0x00,0x00,0x00, - - 8, // 0x46 'F' - 0x00,0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 9, // 0x47 'G' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x47,0x00,0x41,0x00,0x21,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x48 'H' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7F,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x49 'I' - 0x00,0x00,0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00,0x00, - - 6, // 0x4A 'J' - 0x00,0x00,0x00,0x00,0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x00, - - 8, // 0x4B 'K' - 0x00,0x00,0x00,0x00,0x42,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x42,0x00,0x00,0x00, - - 7, // 0x4C 'L' - 0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7E,0x00,0x00,0x00, - - 11, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x60,0xC0,0x51,0x40,0x51,0x40,0x4A,0x40,0x4A,0x40,0x44,0x40,0x44,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x4E 'N' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x00,0x61,0x00,0x51,0x00,0x51,0x00,0x49,0x00,0x45,0x00,0x45,0x00,0x43,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x50 'P' - 0x00,0x00,0x00,0x00,0x7C,0x42,0x42,0x42,0x42,0x7C,0x40,0x40,0x40,0x00,0x00,0x00, - - 10, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x02,0x00,0x01,0x80,0x00,0x00, - - 9, // 0x52 'R' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x44,0x00,0x78,0x00,0x44,0x00,0x42,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x53 'S' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x41,0x00,0x40,0x00,0x40,0x00,0x3E,0x00,0x01,0x00,0x01,0x00,0x41,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x54 'T' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x55 'U' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x56 'V' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x22,0x00,0x14,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 13, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x10,0x42,0x10,0x45,0x10,0x45,0x10,0x25,0x20,0x28,0xA0,0x28,0xA0,0x10,0x40,0x10,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x58 'X' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x14,0x00,0x08,0x00,0x14,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x59 'Y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x22,0x00,0x22,0x00,0x14,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x5A 'Z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x5B '[' - 0x00,0x00,0x00,0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00, - - 6, // 0x5C '\' - 0x00,0x00,0x00,0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x00, - - 6, // 0x5D ']' - 0x00,0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70,0x00, - - 11, // 0x5E '^' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00, - - 8, // 0x60 '`' - 0x00,0x00,0x00,0x10,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x02,0x02,0x3E,0x42,0x42,0x3E,0x00,0x00,0x00, - - 8, // 0x62 'b' - 0x00,0x00,0x00,0x40,0x40,0x40,0x5C,0x62,0x42,0x42,0x42,0x42,0x7C,0x00,0x00,0x00, - - 8, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x40,0x40,0x40,0x42,0x3C,0x00,0x00,0x00, - - 8, // 0x64 'd' - 0x00,0x00,0x00,0x02,0x02,0x02,0x3E,0x42,0x42,0x42,0x42,0x46,0x3A,0x00,0x00,0x00, - - 8, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x7E,0x40,0x42,0x3C,0x00,0x00,0x00, - - 6, // 0x66 'f' - 0x00,0x00,0x00,0x1C,0x20,0x20,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00, - - 8, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x42,0x42,0x42,0x42,0x46,0x3A,0x02,0x02,0x3C, - - 8, // 0x68 'h' - 0x00,0x00,0x00,0x40,0x40,0x40,0x5C,0x62,0x42,0x42,0x42,0x42,0x42,0x00,0x00,0x00, - - 3, // 0x69 'i' - 0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 4, // 0x6A 'j' - 0x00,0x00,0x00,0x20,0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xC0, - - 7, // 0x6B 'k' - 0x00,0x00,0x00,0x40,0x40,0x40,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x00,0x00,0x00, - - 3, // 0x6C 'l' - 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 11, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x80,0x66,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x62,0x42,0x42,0x42,0x42,0x42,0x00,0x00,0x00, - - 8, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00,0x00, - - 8, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x62,0x42,0x42,0x42,0x42,0x7C,0x40,0x40,0x40, - - 8, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x42,0x42,0x42,0x42,0x46,0x3A,0x02,0x02,0x02, - - 5, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x60,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 7, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x40,0x40,0x38,0x04,0x04,0x78,0x00,0x00,0x00, - - 6, // 0x74 't' - 0x00,0x00,0x00,0x00,0x20,0x20,0x78,0x20,0x20,0x20,0x20,0x20,0x18,0x00,0x00,0x00, - - 8, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x46,0x3A,0x00,0x00,0x00, - - 8, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x24,0x24,0x24,0x18,0x18,0x00,0x00,0x00, - - 11, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x40,0x44,0x40,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x11,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x00,0x00,0x00, - - 8, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x24,0x24,0x24,0x18,0x18,0x10,0x10,0x20, - - 7, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x04,0x08,0x10,0x20,0x40,0x7C,0x00,0x00,0x00, - - 8, // 0x7B '{' - 0x00,0x00,0x00,0x0C,0x10,0x10,0x10,0x10,0x60,0x10,0x10,0x10,0x10,0x10,0x0C,0x00, - - 7, // 0x7C '|' - 0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00, - - 8, // 0x7D '}' - 0x00,0x00,0x00,0x30,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x30,0x00, - - 11, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x80,0x4C,0x80,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 13, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF0,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u verdana16_bold[] = - { - 16, 4, 32, 128-32, - 0x00,0x00,0x11,0x00,0x22,0x00,0x33,0x00,0x54,0x00,0x75,0x00,0xA6,0x00,0xC7,0x00,0xD8,0x00, - 0xE9,0x00,0xFA,0x00,0x1B,0x01,0x3C,0x01,0x4D,0x01,0x5E,0x01,0x6F,0x01,0x90,0x01,0xB1,0x01, - 0xD2,0x01,0xF3,0x01,0x14,0x02,0x35,0x02,0x56,0x02,0x77,0x02,0x98,0x02,0xB9,0x02,0xDA,0x02, - 0xEB,0x02,0xFC,0x02,0x1D,0x03,0x3E,0x03,0x5F,0x03,0x70,0x03,0x91,0x03,0xB2,0x03,0xD3,0x03, - 0xF4,0x03,0x15,0x04,0x36,0x04,0x57,0x04,0x78,0x04,0x99,0x04,0xAA,0x04,0xBB,0x04,0xDC,0x04, - 0xED,0x04,0x0E,0x05,0x2F,0x05,0x50,0x05,0x71,0x05,0x92,0x05,0xB3,0x05,0xD4,0x05,0xE5,0x05, - 0x06,0x06,0x27,0x06,0x48,0x06,0x69,0x06,0x8A,0x06,0xAB,0x06,0xBC,0x06,0xDD,0x06,0xEE,0x06, - 0x0F,0x07,0x30,0x07,0x51,0x07,0x72,0x07,0x93,0x07,0xA4,0x07,0xC5,0x07,0xE6,0x07,0xF7,0x07, - 0x18,0x08,0x39,0x08,0x4A,0x08,0x5B,0x08,0x6C,0x08,0x7D,0x08,0x9E,0x08,0xBF,0x08,0xE0,0x08, - 0x01,0x09,0x22,0x09,0x33,0x09,0x44,0x09,0x55,0x09,0x76,0x09,0x97,0x09,0xB8,0x09,0xD9,0x09, - 0xFA,0x09,0x0B,0x0A,0x2C,0x0A,0x3D,0x0A,0x5E,0x0A,0x7F,0x0A, - - 4, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x21 '!' - 0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x30,0x30,0x00,0x00,0x00, - - 7, // 0x22 '"' - 0x00,0x00,0x00,0x6C,0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x09,0x00,0x3F,0x80,0x3F,0x80,0x12,0x00,0x7F,0x00,0x7F,0x00,0x24,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x24 '$' - 0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x3E,0x00,0x69,0x00,0x68,0x00,0x78,0x00,0x3E,0x00,0x0F,0x00,0x0B,0x00,0x4B,0x00,0x3E,0x00,0x08,0x00,0x08,0x00,0x00,0x00, - - 17, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x20,0x00,0x66,0x20,0x00,0x66,0x40,0x00,0x66,0x5E,0x00,0x66,0xB3,0x00,0x3D,0x33,0x00,0x01,0x33,0x00,0x02,0x33,0x00,0x02,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x26 '&' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x66,0x00,0x66,0x00,0x66,0xC0,0x3C,0xC0,0x66,0x80,0x63,0x00,0x63,0x80,0x3C,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x27 ''' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x28 '(' - 0x00,0x00,0x00,0x0C,0x18,0x30,0x30,0x60,0x60,0x60,0x60,0x60,0x30,0x30,0x18,0x0C, - - 7, // 0x29 ')' - 0x00,0x00,0x00,0x60,0x30,0x18,0x18,0x0C,0x0C,0x0C,0x0C,0x0C,0x18,0x18,0x30,0x60, - - 9, // 0x2A '*' - 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x49,0x00,0x2A,0x00,0x1C,0x00,0x2A,0x00,0x49,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x60,0x60,0xC0,0xC0, - - 7, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00, - - 9, // 0x2F '/' - 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x30,0x00,0x60,0x00,0x60,0x00,0x00,0x00, - - 9, // 0x30 '0' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x31 '1' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x3C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x32 '2' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x33 '3' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x03,0x00,0x0E,0x00,0x03,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x34 '4' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x0E,0x00,0x16,0x00,0x26,0x00,0x46,0x00,0x7F,0x80,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x35 '5' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x30,0x00,0x30,0x00,0x3E,0x00,0x03,0x00,0x03,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x36 '6' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x30,0x00,0x60,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x37 '7' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x38 '8' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x39 '9' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3F,0x00,0x03,0x00,0x06,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00, - - 5, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x38,0x30,0x30,0x60,0x60, - - 11, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x18,0x00,0x06,0x00,0x01,0x80,0x00,0x40,0x01,0x80,0x06,0x00,0x18,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x3F '?' - 0x00,0x00,0x00,0x00,0x3C,0x66,0x06,0x0C,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00, - - 13, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x30,0x60,0x27,0xA0,0x4D,0x90,0x4D,0x90,0x4D,0x90,0x4D,0x90,0x27,0xE0,0x30,0x00,0x0F,0x80,0x00,0x00,0x00,0x00, - - 10, // 0x41 'A' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x0C,0x00,0x1E,0x00,0x1E,0x00,0x33,0x00,0x33,0x00,0x7F,0x80,0x61,0x80,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x42 'B' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7F,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x43 'C' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x61,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x61,0x80,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x44 'D' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x45 'E' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x46 'F' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x47 'G' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x61,0x80,0x60,0x00,0x60,0x00,0x63,0x80,0x61,0x80,0x31,0x80,0x1F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x48 'H' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x7F,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x49 'I' - 0x00,0x00,0x00,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00, - - 7, // 0x4A 'J' - 0x00,0x00,0x00,0x00,0x7C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0xF8,0x00,0x00,0x00, - - 9, // 0x4B 'K' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x66,0x00,0x6C,0x00,0x78,0x00,0x78,0x00,0x6C,0x00,0x66,0x00,0x63,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x4C 'L' - 0x00,0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x7F,0x00,0x00,0x00, - - 12, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0xE0,0x70,0xE0,0x59,0x60,0x59,0x60,0x4E,0x60,0x4E,0x60,0x44,0x60,0x44,0x60,0x40,0x60,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x4E 'N' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x80,0x70,0x80,0x58,0x80,0x58,0x80,0x4C,0x80,0x46,0x80,0x46,0x80,0x43,0x80,0x43,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x50 'P' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7E,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x03,0x00,0x01,0xC0,0x00,0x00, - - 9, // 0x52 'R' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7E,0x00,0x6C,0x00,0x66,0x00,0x63,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x53 'S' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x70,0x00,0x3E,0x00,0x07,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x54 'T' - 0x00,0x00,0x00,0x00,0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00, - - 10, // 0x55 'U' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x56 'V' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x00,0x33,0x00,0x1E,0x00,0x1E,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 14, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x18,0x63,0x18,0x63,0x18,0x33,0x30,0x37,0xB0,0x34,0xB0,0x1C,0xE0,0x18,0x60,0x18,0x60,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x58 'X' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x33,0x00,0x33,0x00,0x1E,0x00,0x0C,0x00,0x1E,0x00,0x33,0x00,0x33,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x59 'Y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x5A 'Z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x30,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x5B '[' - 0x00,0x00,0x00,0x78,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x78,0x00, - - 9, // 0x5C '\' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x30,0x00,0x30,0x00,0x18,0x00,0x18,0x00,0x0C,0x00,0x0C,0x00,0x06,0x00,0x06,0x00,0x03,0x00,0x03,0x00,0x00,0x00, - - 6, // 0x5D ']' - 0x00,0x00,0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x78,0x00, - - 10, // 0x5E '^' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x80,0x00,0x00, - - 9, // 0x60 '`' - 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x03,0x00,0x3F,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x62 'b' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x6E,0x00,0x73,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x63,0x60,0x60,0x60,0x63,0x3E,0x00,0x00,0x00, - - 9, // 0x64 'd' - 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x3F,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x67,0x00,0x3B,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x7F,0x00,0x60,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x66 'f' - 0x00,0x00,0x00,0x38,0x60,0x60,0xF8,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, - - 9, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x67,0x00,0x3B,0x00,0x03,0x00,0x03,0x00,0x3E,0x00, - - 9, // 0x68 'h' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x6E,0x00,0x73,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x69 'i' - 0x00,0x00,0x00,0x60,0x60,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, - - 5, // 0x6A 'j' - 0x00,0x00,0x00,0x30,0x30,0x00,0x70,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0xE0, - - 8, // 0x6B 'k' - 0x00,0x00,0x00,0x60,0x60,0x60,0x66,0x6C,0x78,0x78,0x6C,0x66,0x63,0x00,0x00,0x00, - - 4, // 0x6C 'l' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, - - 14, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x70,0x73,0x98,0x63,0x18,0x63,0x18,0x63,0x18,0x63,0x18,0x63,0x18,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x00,0x73,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x00,0x73,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x7E,0x00,0x60,0x00,0x60,0x00,0x60,0x00, - - 9, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x67,0x00,0x3B,0x00,0x03,0x00,0x03,0x00,0x03,0x00, - - 6, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x00,0x6C,0x7C,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, - - 8, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x60,0x70,0x3C,0x0E,0x06,0x7C,0x00,0x00,0x00, - - 6, // 0x74 't' - 0x00,0x00,0x00,0x00,0x60,0x60,0xF8,0x60,0x60,0x60,0x60,0x60,0x38,0x00,0x00,0x00, - - 9, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x67,0x00,0x3B,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x60,0x66,0x60,0x66,0x60,0x69,0x60,0x39,0xC0,0x30,0xC0,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x1C,0x00,0x36,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00, - - 8, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x06,0x0C,0x18,0x30,0x60,0x7E,0x00,0x00,0x00, - - 9, // 0x7B '{' - 0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x70,0x00,0x18,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x07,0x00,0x00,0x00, - - 8, // 0x7C '|' - 0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00, - - 9, // 0x7D '}' - 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x0C,0x00,0x07,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x70,0x00,0x00,0x00, - - 11, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x44,0x40,0x44,0x40,0x43,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 13, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF0,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u verdana17[] = - { - 17, 4, 32, 128-32, - 0x00,0x00,0x12,0x00,0x24,0x00,0x36,0x00,0x59,0x00,0x7C,0x00,0x9F,0x00,0xC2,0x00,0xD4,0x00, - 0xE6,0x00,0xF8,0x00,0x1B,0x01,0x3E,0x01,0x50,0x01,0x62,0x01,0x74,0x01,0x86,0x01,0xA9,0x01, - 0xCC,0x01,0xEF,0x01,0x12,0x02,0x35,0x02,0x58,0x02,0x7B,0x02,0x9E,0x02,0xC1,0x02,0xE4,0x02, - 0xF6,0x02,0x08,0x03,0x2B,0x03,0x4E,0x03,0x71,0x03,0x83,0x03,0xA6,0x03,0xC9,0x03,0xEC,0x03, - 0x0F,0x04,0x32,0x04,0x55,0x04,0x67,0x04,0x8A,0x04,0xAD,0x04,0xBF,0x04,0xD1,0x04,0xF4,0x04, - 0x06,0x05,0x29,0x05,0x4C,0x05,0x6F,0x05,0x81,0x05,0xA4,0x05,0xC7,0x05,0xEA,0x05,0x0D,0x06, - 0x30,0x06,0x53,0x06,0x76,0x06,0x99,0x06,0xBC,0x06,0xDF,0x06,0xF1,0x06,0x03,0x07,0x15,0x07, - 0x38,0x07,0x5B,0x07,0x7E,0x07,0x90,0x07,0xB3,0x07,0xC5,0x07,0xE8,0x07,0xFA,0x07,0x0C,0x08, - 0x2F,0x08,0x52,0x08,0x64,0x08,0x76,0x08,0x88,0x08,0x9A,0x08,0xBD,0x08,0xE0,0x08,0x03,0x09, - 0x26,0x09,0x49,0x09,0x5B,0x09,0x6D,0x09,0x7F,0x09,0xA2,0x09,0xB4,0x09,0xD7,0x09,0xFA,0x09, - 0x0C,0x0A,0x1E,0x0A,0x41,0x0A,0x53,0x0A,0x76,0x0A,0x99,0x0A, - - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x21 '!' - 0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x20,0x00,0x00,0x00, - - 6, // 0x22 '"' - 0x00,0x00,0x00,0x48,0x48,0x48,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x80,0x04,0x80,0x09,0x00,0x3F,0xC0,0x09,0x00,0x12,0x00,0x7F,0x80,0x12,0x00,0x24,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x24 '$' - 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x3E,0x00,0x49,0x00,0x48,0x00,0x48,0x00,0x3E,0x00,0x09,0x00,0x09,0x00,0x49,0x00,0x3E,0x00,0x08,0x00,0x08,0x00,0x00,0x00, - - 15, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x20,0x44,0x40,0x44,0x80,0x44,0x80,0x45,0x38,0x39,0x44,0x02,0x44,0x04,0x44,0x04,0x44,0x08,0x38,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x26 '&' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x42,0x00,0x42,0x00,0x44,0x00,0x38,0x80,0x44,0x80,0x42,0x80,0x41,0x00,0x22,0x80,0x1C,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x27 ''' - 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x28 '(' - 0x00,0x00,0x00,0x08,0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10,0x08, - - 6, // 0x29 ')' - 0x00,0x00,0x00,0x40,0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x40, - - 9, // 0x2A '*' - 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x49,0x00,0x2A,0x00,0x1C,0x00,0x2A,0x00,0x49,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x40,0x00, - - 7, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00, - - 6, // 0x2F '/' - 0x00,0x00,0x00,0x04,0x08,0x08,0x08,0x10,0x10,0x20,0x20,0x20,0x40,0x40,0x80,0x80,0x00, - - 9, // 0x30 '0' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x31 '1' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x38,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x32 '2' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x41,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x0C,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x33 '3' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x41,0x00,0x01,0x00,0x02,0x00,0x1C,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x42,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x34 '4' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x00,0x0A,0x00,0x12,0x00,0x22,0x00,0x42,0x00,0x7F,0x80,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x35 '5' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x7C,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x42,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x36 '6' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x30,0x00,0x20,0x00,0x40,0x00,0x7C,0x00,0x42,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x37 '7' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x10,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x38 '8' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x3E,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x39 '9' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x21,0x00,0x1F,0x00,0x01,0x00,0x02,0x00,0x06,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00, - - 6, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x40,0x00, - - 11, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x06,0x00,0x18,0x00,0x60,0x00,0x60,0x00,0x18,0x00,0x06,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x3F '?' - 0x00,0x00,0x00,0x00,0x3C,0x42,0x02,0x02,0x0C,0x10,0x10,0x00,0x10,0x10,0x00,0x00,0x00, - - 14, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xC0,0x18,0x20,0x20,0x10,0x27,0xC8,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x27,0xF0,0x20,0x00,0x18,0x00,0x07,0xC0,0x00,0x00, - - 10, // 0x41 'A' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x12,0x00,0x12,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x7F,0x80,0x40,0x80,0x80,0x40,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x42 'B' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7E,0x00,0x41,0x00,0x40,0x80,0x40,0x80,0x41,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x43 'C' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0x80,0x20,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x30,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x44 'D' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x41,0x80,0x40,0x80,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x80,0x41,0x80,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x45 'E' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x7F,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x46 'F' - 0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x7E,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 11, // 0x47 'G' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x20,0x40,0x40,0x00,0x40,0x00,0x43,0xC0,0x40,0x40,0x20,0x40,0x30,0x40,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x48 'H' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x7F,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x49 'I' - 0x00,0x00,0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00,0x00, - - 6, // 0x4A 'J' - 0x00,0x00,0x00,0x00,0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x00, - - 10, // 0x4B 'K' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x42,0x00,0x44,0x00,0x48,0x00,0x50,0x00,0x68,0x00,0x44,0x00,0x42,0x00,0x41,0x00,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x4C 'L' - 0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7F,0x00,0x00,0x00, - - 11, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x60,0xC0,0x51,0x40,0x51,0x40,0x4A,0x40,0x4A,0x40,0x44,0x40,0x44,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x4E 'N' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x80,0x60,0x80,0x50,0x80,0x48,0x80,0x48,0x80,0x44,0x80,0x44,0x80,0x42,0x80,0x41,0x80,0x41,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x31,0x80,0x20,0x80,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x80,0x31,0x80,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x50 'P' - 0x00,0x00,0x00,0x00,0x7C,0x42,0x41,0x41,0x42,0x7C,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 11, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x31,0x80,0x20,0x80,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x80,0x31,0x80,0x0E,0x00,0x02,0x00,0x02,0x00,0x01,0xC0, - - 10, // 0x52 'R' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x44,0x00,0x78,0x00,0x44,0x00,0x42,0x00,0x41,0x00,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x53 'S' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x20,0x80,0x40,0x00,0x40,0x00,0x38,0x00,0x07,0x00,0x00,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x54 'T' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x80,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x55 'U' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x56 'V' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x80,0x40,0x40,0x80,0x40,0x80,0x21,0x00,0x21,0x00,0x21,0x00,0x12,0x00,0x12,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 15, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x04,0x41,0x04,0x22,0x88,0x22,0x88,0x22,0x88,0x14,0x50,0x14,0x50,0x14,0x50,0x08,0x20,0x08,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x58 'X' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x21,0x00,0x12,0x00,0x12,0x00,0x0C,0x00,0x0C,0x00,0x12,0x00,0x12,0x00,0x21,0x00,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x59 'Y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x41,0x00,0x22,0x00,0x22,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x5A 'Z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x00,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x5B '[' - 0x00,0x00,0x00,0x3C,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3C, - - 6, // 0x5C '\' - 0x00,0x00,0x00,0x80,0x40,0x40,0x40,0x20,0x20,0x10,0x10,0x10,0x08,0x08,0x08,0x04,0x00, - - 6, // 0x5D ']' - 0x00,0x00,0x00,0x78,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x78, - - 11, // 0x5E '^' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x80,0x00,0x00, - - 9, // 0x60 '`' - 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x22,0x02,0x3E,0x42,0x42,0x46,0x3A,0x00,0x00,0x00, - - 9, // 0x62 'b' - 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x5C,0x00,0x62,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x22,0x40,0x40,0x40,0x40,0x22,0x1C,0x00,0x00,0x00, - - 9, // 0x64 'd' - 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x1F,0x00,0x21,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x23,0x00,0x1D,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x24,0x42,0x7E,0x40,0x40,0x22,0x1C,0x00,0x00,0x00, - - 6, // 0x66 'f' - 0x00,0x00,0x00,0x1C,0x20,0x20,0x7C,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00, - - 9, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x21,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x23,0x00,0x1D,0x00,0x01,0x00,0x22,0x00,0x1C,0x00, - - 9, // 0x68 'h' - 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x5E,0x00,0x61,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 3, // 0x69 'i' - 0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 5, // 0x6A 'j' - 0x00,0x00,0x00,0x00,0x10,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0xE0, - - 8, // 0x6B 'k' - 0x00,0x00,0x00,0x40,0x40,0x40,0x42,0x44,0x48,0x50,0x70,0x48,0x44,0x42,0x00,0x00,0x00, - - 3, // 0x6C 'l' - 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 13, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0xE0,0x63,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5E,0x00,0x61,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x00,0x62,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x40,0x00,0x40,0x00,0x40,0x00, - - 9, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x21,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x23,0x00,0x1D,0x00,0x01,0x00,0x01,0x00,0x01,0x00, - - 6, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x60,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 8, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x40,0x30,0x0C,0x02,0x42,0x3C,0x00,0x00,0x00, - - 6, // 0x74 't' - 0x00,0x00,0x00,0x00,0x20,0x20,0x7C,0x20,0x20,0x20,0x20,0x20,0x20,0x1C,0x00,0x00,0x00, - - 9, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x43,0x00,0x3D,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x24,0x24,0x24,0x18,0x18,0x18,0x00,0x00,0x00, - - 11, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x40,0x44,0x40,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x11,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x22,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x14,0x00,0x22,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x24,0x24,0x24,0x18,0x18,0x18,0x10,0x10,0x20, - - 8, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x02,0x04,0x08,0x10,0x20,0x40,0x7E,0x00,0x00,0x00, - - 9, // 0x7B '{' - 0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x60,0x00,0x10,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x07,0x00, - - 6, // 0x7C '|' - 0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, - - 9, // 0x7D '}' - 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x04,0x00,0x03,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x70,0x00, - - 11, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x44,0x40,0x44,0x40,0x43,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 14, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u verdana17_bold[] = - { - 17, 4, 32, 128-32, - 0x00,0x00,0x12,0x00,0x24,0x00,0x36,0x00,0x59,0x00,0x7C,0x00,0xB0,0x00,0xD3,0x00,0xE5,0x00, - 0xF7,0x00,0x09,0x01,0x2C,0x01,0x4F,0x01,0x61,0x01,0x73,0x01,0x85,0x01,0xA8,0x01,0xCB,0x01, - 0xEE,0x01,0x11,0x02,0x34,0x02,0x57,0x02,0x7A,0x02,0x9D,0x02,0xC0,0x02,0xE3,0x02,0x06,0x03, - 0x18,0x03,0x2A,0x03,0x4D,0x03,0x70,0x03,0x93,0x03,0xB6,0x03,0xD9,0x03,0xFC,0x03,0x1F,0x04, - 0x42,0x04,0x65,0x04,0x88,0x04,0xAB,0x04,0xCE,0x04,0xF1,0x04,0x03,0x05,0x15,0x05,0x38,0x05, - 0x5B,0x05,0x7E,0x05,0xA1,0x05,0xC4,0x05,0xE7,0x05,0x0A,0x06,0x2D,0x06,0x50,0x06,0x73,0x06, - 0x96,0x06,0xB9,0x06,0xDC,0x06,0xFF,0x06,0x22,0x07,0x45,0x07,0x57,0x07,0x7A,0x07,0x8C,0x07, - 0xAF,0x07,0xD2,0x07,0xF5,0x07,0x18,0x08,0x3B,0x08,0x4D,0x08,0x70,0x08,0x93,0x08,0xA5,0x08, - 0xC8,0x08,0xEB,0x08,0xFD,0x08,0x0F,0x09,0x32,0x09,0x44,0x09,0x67,0x09,0x8A,0x09,0xAD,0x09, - 0xD0,0x09,0xF3,0x09,0x05,0x0A,0x17,0x0A,0x29,0x0A,0x4C,0x0A,0x6F,0x0A,0x92,0x0A,0xB5,0x0A, - 0xD8,0x0A,0xEA,0x0A,0x0D,0x0B,0x1F,0x0B,0x42,0x0B,0x65,0x0B, - - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x21 '!' - 0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x30,0x30,0x00,0x00,0x00, - - 8, // 0x22 '"' - 0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x40,0x04,0x40,0x3F,0xE0,0x3F,0xE0,0x08,0x80,0x11,0x00,0x7F,0xC0,0x7F,0xC0,0x22,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x24 '$' - 0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x1F,0x00,0x34,0x80,0x64,0x00,0x74,0x00,0x3C,0x00,0x0F,0x00,0x0B,0x80,0x09,0x80,0x4B,0x00,0x3E,0x00,0x08,0x00,0x08,0x00,0x00,0x00, - - 18, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x08,0x00,0x66,0x10,0x00,0x66,0x20,0x00,0x66,0x2F,0x00,0x66,0x59,0x80,0x66,0x99,0x80,0x3D,0x19,0x80,0x01,0x19,0x80,0x02,0x19,0x80,0x04,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x26 '&' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x33,0x00,0x36,0x00,0x1C,0x60,0x36,0x60,0x63,0x60,0x61,0xC0,0x31,0xC0,0x1F,0x60,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x27 ''' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x28 '(' - 0x00,0x00,0x00,0x0C,0x18,0x30,0x30,0x60,0x60,0x60,0x60,0x60,0x60,0x30,0x30,0x18,0x0C, - - 8, // 0x29 ')' - 0x00,0x00,0x00,0x30,0x18,0x0C,0x0C,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0x0C,0x18,0x30, - - 10, // 0x2A '*' - 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x49,0x00,0x2A,0x00,0x1C,0x00,0x2A,0x00,0x49,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x60,0x60,0xC0,0xC0,0x00, - - 7, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x00, - - 10, // 0x2F '/' - 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x30,0x00,0x60,0x00,0x60,0x00,0x00,0x00, - - 10, // 0x30 '0' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x31 '1' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x3C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x32 '2' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x61,0x80,0x61,0x80,0x01,0x80,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x33 '3' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x61,0x80,0x61,0x80,0x01,0x80,0x0F,0x00,0x03,0x00,0x01,0x80,0x61,0x80,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x34 '4' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x07,0x00,0x0B,0x00,0x13,0x00,0x23,0x00,0x43,0x00,0x7F,0xC0,0x03,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x35 '5' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x80,0x30,0x00,0x30,0x00,0x3E,0x00,0x03,0x00,0x01,0x80,0x01,0x80,0x61,0x80,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x36 '6' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x38,0x00,0x30,0x00,0x6E,0x00,0x73,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x37 '7' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x01,0x80,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x38 '8' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x3F,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x39 '9' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0x80,0x03,0x00,0x07,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x00, - - 6, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x38,0x30,0x30,0x60,0x60,0x00, - - 12, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x18,0x00,0x06,0x00,0x01,0x80,0x00,0x40,0x01,0x80,0x06,0x00,0x18,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x3F '?' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 14, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xC0,0x18,0x20,0x20,0x10,0x27,0xC8,0x4C,0xC8,0x4C,0xC8,0x4C,0xC8,0x4C,0xC8,0x27,0xF0,0x20,0x00,0x18,0x00,0x07,0xC0,0x00,0x00, - - 11, // 0x41 'A' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x1B,0x00,0x1B,0x00,0x31,0x80,0x3F,0x80,0x31,0x80,0x60,0xC0,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x42 'B' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x7F,0x00,0x61,0x80,0x60,0xC0,0x60,0xC0,0x61,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x43 'C' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x30,0xC0,0x30,0xC0,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x30,0xC0,0x30,0xC0,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x44 'D' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x61,0x80,0x61,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x61,0x80,0x61,0x80,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x45 'E' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x46 'F' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x47 'G' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x30,0xC0,0x30,0xC0,0x60,0x00,0x60,0x00,0x63,0xC0,0x60,0xC0,0x30,0xC0,0x30,0xC0,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x48 'H' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x7F,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x49 'I' - 0x00,0x00,0x00,0x00,0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,0x00,0x00, - - 8, // 0x4A 'J' - 0x00,0x00,0x00,0x00,0x3E,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0xF8,0x00,0x00,0x00, - - 11, // 0x4B 'K' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x61,0x80,0x63,0x00,0x66,0x00,0x6C,0x00,0x7C,0x00,0x76,0x00,0x63,0x00,0x61,0x80,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x4C 'L' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 13, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x70,0x70,0x70,0x70,0xF0,0x58,0xB0,0x59,0xB0,0x4D,0x30,0x4F,0x30,0x46,0x30,0x46,0x30,0x40,0x30,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x4E 'N' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x40,0x70,0x40,0x58,0x40,0x4C,0x40,0x4C,0x40,0x46,0x40,0x43,0x40,0x43,0x40,0x41,0xC0,0x40,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x30,0xC0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x30,0xC0,0x30,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x50 'P' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x63,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7E,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x30,0xC0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x30,0xC0,0x30,0xC0,0x0F,0x80,0x03,0x00,0x03,0x00,0x01,0xE0, - - 11, // 0x52 'R' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x61,0x80,0x60,0xC0,0x60,0xC0,0x61,0x80,0x7F,0x00,0x63,0x00,0x61,0x80,0x60,0xC0,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x53 'S' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x61,0x80,0x60,0x00,0x3E,0x00,0x1F,0x00,0x01,0x80,0x61,0x80,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x54 'T' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x55 'U' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x56 'V' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x31,0x80,0x31,0x80,0x1B,0x00,0x1B,0x00,0x0E,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 16, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x86,0x61,0x86,0x63,0xC6,0x32,0x4C,0x36,0x6C,0x36,0x6C,0x34,0x2C,0x1C,0x38,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x58 'X' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x31,0x80,0x31,0x80,0x1B,0x00,0x0E,0x00,0x0E,0x00,0x1B,0x00,0x31,0x80,0x31,0x80,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x59 'Y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x5A 'Z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x01,0x80,0x03,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x5B '[' - 0x00,0x00,0x00,0x3E,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3E, - - 10, // 0x5C '\' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x30,0x00,0x30,0x00,0x18,0x00,0x18,0x00,0x0C,0x00,0x06,0x00,0x06,0x00,0x03,0x00,0x03,0x00,0x01,0x80,0x01,0x80,0x00,0x00, - - 8, // 0x5D ']' - 0x00,0x00,0x00,0x7C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x7C, - - 12, // 0x5E '^' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0E,0x00,0x1B,0x00,0x31,0x80,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xC0,0x00,0x00, - - 10, // 0x60 '`' - 0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x03,0x00,0x03,0x00,0x3F,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x62 'b' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x6E,0x00,0x73,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x33,0x60,0x60,0x60,0x60,0x33,0x1E,0x00,0x00,0x00, - - 10, // 0x64 'd' - 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x1F,0x80,0x31,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x63,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x33,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x66 'f' - 0x00,0x00,0x00,0x1C,0x30,0x30,0x7C,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x00,0x00, - - 10, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x31,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0x80,0x01,0x80,0x03,0x00,0x3E,0x00, - - 10, // 0x68 'h' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x6F,0x00,0x71,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x69 'i' - 0x00,0x00,0x00,0x60,0x60,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, - - 6, // 0x6A 'j' - 0x00,0x00,0x00,0x18,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xF0, - - 9, // 0x6B 'k' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x63,0x00,0x66,0x00,0x6C,0x00,0x78,0x00,0x7C,0x00,0x66,0x00,0x63,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x6C 'l' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, - - 14, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x70,0x73,0x98,0x63,0x18,0x63,0x18,0x63,0x18,0x63,0x18,0x63,0x18,0x63,0x18,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6F,0x00,0x71,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x00,0x73,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7E,0x00,0x60,0x00,0x60,0x00,0x60,0x00, - - 10, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x31,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0x80,0x01,0x80,0x01,0x80,0x01,0x80, - - 7, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x7E,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, - - 8, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x62,0x60,0x7C,0x3E,0x06,0x46,0x3C,0x00,0x00,0x00, - - 6, // 0x74 't' - 0x00,0x00,0x00,0x00,0x60,0x60,0xFC,0x60,0x60,0x60,0x60,0x60,0x60,0x3C,0x00,0x00,0x00, - - 10, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x80,0x3D,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 14, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x18,0x63,0x18,0x33,0x30,0x37,0xB0,0x34,0xB0,0x1C,0xE0,0x1C,0xE0,0x0C,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x36,0x00,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00, - - 8, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x06,0x0C,0x18,0x18,0x30,0x60,0x7E,0x00,0x00,0x00, - - 10, // 0x7B '{' - 0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x70,0x00,0x18,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x07,0x80, - - 8, // 0x7C '|' - 0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - - 10, // 0x7D '}' - 0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x06,0x00,0x03,0x80,0x06,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x78,0x00, - - 12, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x20,0x24,0x20,0x46,0x20,0x42,0x40,0x41,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 14, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u verdana18[] = - { - 18, 4, 32, 128-32, - 0x00,0x00,0x13,0x00,0x26,0x00,0x39,0x00,0x5E,0x00,0x83,0x00,0xA8,0x00,0xCD,0x00,0xE0,0x00, - 0xF3,0x00,0x06,0x01,0x2B,0x01,0x50,0x01,0x63,0x01,0x76,0x01,0x89,0x01,0x9C,0x01,0xC1,0x01, - 0xE6,0x01,0x0B,0x02,0x30,0x02,0x55,0x02,0x7A,0x02,0x9F,0x02,0xC4,0x02,0xE9,0x02,0x0E,0x03, - 0x21,0x03,0x34,0x03,0x59,0x03,0x7E,0x03,0xA3,0x03,0xB6,0x03,0xDB,0x03,0x00,0x04,0x25,0x04, - 0x4A,0x04,0x6F,0x04,0x94,0x04,0xB9,0x04,0xDE,0x04,0x03,0x05,0x16,0x05,0x29,0x05,0x4E,0x05, - 0x61,0x05,0x86,0x05,0xAB,0x05,0xD0,0x05,0xF5,0x05,0x1A,0x06,0x3F,0x06,0x64,0x06,0x89,0x06, - 0xAE,0x06,0xD3,0x06,0xF8,0x06,0x1D,0x07,0x42,0x07,0x67,0x07,0x7A,0x07,0x8D,0x07,0xA0,0x07, - 0xC5,0x07,0xEA,0x07,0x0F,0x08,0x34,0x08,0x59,0x08,0x6C,0x08,0x91,0x08,0xB6,0x08,0xC9,0x08, - 0xEE,0x08,0x13,0x09,0x26,0x09,0x39,0x09,0x5E,0x09,0x71,0x09,0x96,0x09,0xBB,0x09,0xE0,0x09, - 0x05,0x0A,0x2A,0x0A,0x3D,0x0A,0x50,0x0A,0x63,0x0A,0x88,0x0A,0xAD,0x0A,0xD2,0x0A,0xF7,0x0A, - 0x1C,0x0B,0x41,0x0B,0x66,0x0B,0x79,0x0B,0x9E,0x0B,0xC3,0x0B, - - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x21 '!' - 0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x20,0x00,0x00,0x00, - - 7, // 0x22 '"' - 0x00,0x00,0x00,0x48,0x48,0x48,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x80,0x04,0x80,0x09,0x00,0x3F,0xC0,0x09,0x00,0x11,0x00,0x12,0x00,0x7F,0x80,0x12,0x00,0x24,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x24 '$' - 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x3E,0x00,0x49,0x00,0x48,0x00,0x48,0x00,0x38,0x00,0x0E,0x00,0x09,0x00,0x09,0x00,0x49,0x00,0x3E,0x00,0x08,0x00,0x08,0x00,0x08,0x00, - - 16, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x20,0x44,0x40,0x44,0x40,0x44,0x80,0x44,0x80,0x38,0x9C,0x01,0x22,0x01,0x22,0x02,0x22,0x02,0x22,0x04,0x1C,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x26 '&' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x1E,0x40,0x24,0x40,0x42,0x40,0x41,0x40,0x40,0x80,0x21,0x40,0x1E,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x27 ''' - 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x28 '(' - 0x00,0x00,0x00,0x08,0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10,0x08, - - 7, // 0x29 ')' - 0x00,0x00,0x00,0x20,0x10,0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x08,0x08,0x10,0x20, - - 10, // 0x2A '*' - 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x49,0x00,0x2A,0x00,0x1C,0x00,0x2A,0x00,0x49,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x3F,0xE0,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x40,0x40, - - 7, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x00, - - 7, // 0x2F '/' - 0x00,0x00,0x00,0x02,0x04,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x40,0x80,0x00, - - 10, // 0x30 '0' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x31 '1' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x1C,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x32 '2' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x41,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x01,0x00,0x02,0x00,0x0C,0x00,0x30,0x00,0x40,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x33 '3' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x40,0x80,0x00,0x80,0x01,0x00,0x0E,0x00,0x01,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x41,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x34 '4' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x05,0x00,0x09,0x00,0x11,0x00,0x21,0x00,0x41,0x00,0x7F,0xC0,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x35 '5' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x80,0x20,0x00,0x20,0x00,0x20,0x00,0x3E,0x00,0x01,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x41,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x36 '6' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x5E,0x00,0x61,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x37 '7' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x10,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x38 '8' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x39 '9' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x20,0x80,0x1F,0x80,0x00,0x80,0x01,0x00,0x02,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x00,0x00, - - 7, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x20,0x20, - - 12, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x3F '?' - 0x00,0x00,0x00,0x00,0x3C,0x42,0x02,0x02,0x04,0x08,0x10,0x10,0x00,0x10,0x10,0x00,0x00,0x00, - - 15, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x18,0x60,0x20,0x10,0x23,0xD0,0x44,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x44,0x48,0x23,0xF0,0x20,0x00,0x18,0x00,0x07,0xC0,0x00,0x00, - - 10, // 0x41 'A' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x12,0x00,0x12,0x00,0x12,0x00,0x21,0x00,0x21,0x00,0x40,0x80,0x7F,0x80,0x40,0x80,0x80,0x40,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x42 'B' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x7E,0x00,0x41,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x41,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x43 'C' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x20,0x40,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x20,0x40,0x30,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x44 'D' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x41,0x80,0x40,0x80,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x80,0x41,0x80,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x45 'E' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x7F,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x46 'F' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x40,0x00,0x40,0x00,0x40,0x00,0x7F,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x47 'G' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x30,0x60,0x20,0x20,0x40,0x00,0x40,0x00,0x41,0xE0,0x40,0x20,0x40,0x20,0x20,0x20,0x30,0x20,0x0F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x48 'H' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7F,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x49 'I' - 0x00,0x00,0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00,0x00, - - 7, // 0x4A 'J' - 0x00,0x00,0x00,0x00,0x3C,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x08,0xF0,0x00,0x00,0x00, - - 10, // 0x4B 'K' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x41,0x00,0x42,0x00,0x44,0x00,0x48,0x00,0x50,0x00,0x68,0x00,0x44,0x00,0x42,0x00,0x41,0x00,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x4C 'L' - 0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7F,0x00,0x00,0x00, - - 13, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x30,0x50,0x50,0x50,0x50,0x48,0x90,0x48,0x90,0x45,0x10,0x45,0x10,0x42,0x10,0x42,0x10,0x40,0x10,0x40,0x10,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x4E 'N' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x60,0x40,0x50,0x40,0x48,0x40,0x48,0x40,0x44,0x40,0x42,0x40,0x42,0x40,0x41,0x40,0x40,0xC0,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x20,0x40,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x20,0x40,0x30,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x50 'P' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x41,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x41,0x00,0x7E,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0xC0,0x20,0x40,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x20,0x40,0x30,0xC0,0x0F,0x00,0x01,0x00,0x01,0x00,0x00,0xE0, - - 10, // 0x52 'R' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x42,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x42,0x00,0x41,0x00,0x40,0x80,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x53 'S' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x20,0x80,0x40,0x00,0x40,0x00,0x20,0x00,0x1E,0x00,0x01,0x00,0x00,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x54 'T' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x80,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x55 'U' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x56 'V' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x80,0x40,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x21,0x00,0x12,0x00,0x12,0x00,0x12,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 15, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x04,0x41,0x04,0x22,0x88,0x22,0x88,0x22,0x88,0x12,0x90,0x14,0x50,0x14,0x50,0x14,0x50,0x08,0x20,0x08,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x58 'X' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x21,0x00,0x21,0x00,0x12,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x12,0x00,0x21,0x00,0x21,0x00,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x59 'Y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x41,0x00,0x22,0x00,0x22,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x5A 'Z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x00,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x5B '[' - 0x00,0x00,0x00,0x3C,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3C, - - 7, // 0x5C '\' - 0x00,0x00,0x00,0x80,0x40,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x04,0x02,0x00, - - 7, // 0x5D ']' - 0x00,0x00,0x00,0x78,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x78, - - 12, // 0x5E '^' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x09,0x00,0x10,0x80,0x20,0x40,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xC0,0x00,0x00, - - 10, // 0x60 '`' - 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x01,0x00,0x3F,0x00,0x41,0x00,0x41,0x00,0x43,0x00,0x3D,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x62 'b' - 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x5C,0x00,0x62,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x21,0x40,0x40,0x40,0x40,0x21,0x1E,0x00,0x00,0x00, - - 9, // 0x64 'd' - 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x1F,0x00,0x21,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x23,0x00,0x1D,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x22,0x00,0x41,0x00,0x7F,0x00,0x40,0x00,0x40,0x00,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x66 'f' - 0x00,0x00,0x00,0x1C,0x20,0x20,0x20,0x7C,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00, - - 9, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x21,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x23,0x00,0x1D,0x00,0x01,0x00,0x22,0x00,0x1C,0x00, - - 9, // 0x68 'h' - 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x5E,0x00,0x61,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 3, // 0x69 'i' - 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 5, // 0x6A 'j' - 0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0xE0, - - 9, // 0x6B 'k' - 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x42,0x00,0x44,0x00,0x48,0x00,0x50,0x00,0x68,0x00,0x44,0x00,0x42,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 3, // 0x6C 'l' - 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 15, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2E,0x70,0x31,0x88,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5E,0x00,0x61,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x21,0x00,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x21,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x00,0x62,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x42,0x00,0x7C,0x00,0x40,0x00,0x40,0x00,0x40,0x00, - - 9, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x21,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x23,0x00,0x1D,0x00,0x01,0x00,0x01,0x00,0x01,0x00, - - 6, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x60,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, - - 8, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x40,0x30,0x0C,0x02,0x42,0x3C,0x00,0x00,0x00, - - 6, // 0x74 't' - 0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x7C,0x20,0x20,0x20,0x20,0x20,0x20,0x1C,0x00,0x00,0x00, - - 9, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x43,0x00,0x3D,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x14,0x00,0x14,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 13, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x10,0x42,0x10,0x25,0x20,0x25,0x20,0x28,0xA0,0x28,0xA0,0x10,0x40,0x10,0x40,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x22,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x14,0x00,0x22,0x00,0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x00,0x41,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x14,0x00,0x14,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x10,0x00, - - 9, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x7B '{' - 0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x60,0x00,0x10,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x07,0x00, - - 7, // 0x7C '|' - 0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, - - 10, // 0x7D '}' - 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x01,0x80,0x02,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x38,0x00, - - 12, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x20,0x24,0x20,0x42,0x40,0x41,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 15, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00, - - 0 - }; - - const int8u verdana18_bold[] = - { - 18, 4, 32, 128-32, - 0x00,0x00,0x13,0x00,0x26,0x00,0x4B,0x00,0x70,0x00,0x95,0x00,0xCC,0x00,0xF1,0x00,0x04,0x01, - 0x17,0x01,0x2A,0x01,0x4F,0x01,0x74,0x01,0x87,0x01,0x9A,0x01,0xAD,0x01,0xD2,0x01,0xF7,0x01, - 0x1C,0x02,0x41,0x02,0x66,0x02,0x8B,0x02,0xB0,0x02,0xD5,0x02,0xFA,0x02,0x1F,0x03,0x44,0x03, - 0x57,0x03,0x6A,0x03,0x8F,0x03,0xB4,0x03,0xD9,0x03,0xFE,0x03,0x23,0x04,0x48,0x04,0x6D,0x04, - 0x92,0x04,0xB7,0x04,0xDC,0x04,0x01,0x05,0x26,0x05,0x4B,0x05,0x5E,0x05,0x71,0x05,0x96,0x05, - 0xBB,0x05,0xE0,0x05,0x05,0x06,0x2A,0x06,0x4F,0x06,0x74,0x06,0x99,0x06,0xBE,0x06,0xE3,0x06, - 0x08,0x07,0x2D,0x07,0x52,0x07,0x77,0x07,0x9C,0x07,0xC1,0x07,0xD4,0x07,0xF9,0x07,0x0C,0x08, - 0x31,0x08,0x56,0x08,0x7B,0x08,0xA0,0x08,0xC5,0x08,0xD8,0x08,0xFD,0x08,0x22,0x09,0x35,0x09, - 0x5A,0x09,0x7F,0x09,0x92,0x09,0xA5,0x09,0xCA,0x09,0xDD,0x09,0x02,0x0A,0x27,0x0A,0x4C,0x0A, - 0x71,0x0A,0x96,0x0A,0xA9,0x0A,0xCE,0x0A,0xE1,0x0A,0x06,0x0B,0x2B,0x0B,0x50,0x0B,0x75,0x0B, - 0x9A,0x0B,0xBF,0x0B,0xE4,0x0B,0xF7,0x0B,0x1C,0x0C,0x41,0x0C, - - 5, // 0x20 ' ' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x21 '!' - 0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x30,0x30,0x00,0x00,0x00, - - 9, // 0x22 '"' - 0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 13, // 0x23 '#' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x20,0x04,0x20,0x08,0x40,0x3F,0xF0,0x3F,0xF0,0x08,0x40,0x10,0x80,0x7F,0xE0,0x7F,0xE0,0x21,0x00,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x24 '$' - 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x1F,0x80,0x34,0xC0,0x64,0xC0,0x64,0x00,0x3C,0x00,0x07,0x80,0x04,0xC0,0x64,0xC0,0x65,0x80,0x3F,0x00,0x04,0x00,0x04,0x00,0x00,0x00, - - 19, // 0x25 '%' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x08,0x00,0x63,0x10,0x00,0x63,0x10,0x00,0x63,0x20,0x00,0x63,0x2F,0x80,0x63,0x58,0xC0,0x3E,0x98,0xC0,0x00,0x98,0xC0,0x01,0x18,0xC0,0x01,0x18,0xC0,0x02,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 13, // 0x26 '&' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x33,0x00,0x33,0x00,0x1E,0x60,0x36,0x60,0x63,0x60,0x61,0xC0,0x60,0xC0,0x30,0xE0,0x1F,0x30,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x27 ''' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x28 '(' - 0x00,0x00,0x00,0x06,0x0C,0x18,0x30,0x30,0x60,0x60,0x60,0x60,0x60,0x30,0x30,0x18,0x0C,0x06, - - 8, // 0x29 ')' - 0x00,0x00,0x00,0x60,0x30,0x18,0x0C,0x0C,0x06,0x06,0x06,0x06,0x06,0x0C,0x0C,0x18,0x30,0x60, - - 11, // 0x2A '*' - 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x24,0x80,0x15,0x00,0x0E,0x00,0x15,0x00,0x24,0x80,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 13, // 0x2B '+' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x3F,0xE0,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x2C ',' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x60,0x60,0x60,0xC0,0xC0, - - 7, // 0x2D '-' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 5, // 0x2E '.' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x00, - - 10, // 0x2F '/' - 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x30,0x00,0x60,0x00,0x60,0x00,0x00,0x00, - - 11, // 0x30 '0' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x31 '1' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x1E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x32 '2' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x61,0x80,0x60,0xC0,0x00,0xC0,0x01,0x80,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x33 '3' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x61,0x80,0x60,0xC0,0x00,0xC0,0x01,0x80,0x0F,0x00,0x01,0x80,0x00,0xC0,0x60,0xC0,0x61,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x34 '4' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x03,0x80,0x05,0x80,0x09,0x80,0x11,0x80,0x21,0x80,0x41,0x80,0x7F,0xE0,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x35 '5' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xC0,0x30,0x00,0x30,0x00,0x30,0x00,0x3F,0x00,0x01,0x80,0x00,0xC0,0x00,0xC0,0x60,0xC0,0x61,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x36 '6' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x18,0x00,0x30,0x00,0x60,0x00,0x6F,0x00,0x71,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x37 '7' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xC0,0x00,0xC0,0x01,0x80,0x01,0x80,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x38 '8' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x39 '9' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0xC0,0x1E,0xC0,0x00,0xC0,0x01,0x80,0x03,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x3A ':' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x00, - - 6, // 0x3B ';' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x38,0x30,0x30,0x30,0x60,0x60, - - 13, // 0x3C '<' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00, - - 13, // 0x3D '=' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 13, // 0x3E '>' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x18,0x00,0x06,0x00,0x01,0x80,0x00,0x60,0x00,0x60,0x01,0x80,0x06,0x00,0x18,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 9, // 0x3F '?' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x63,0x00,0x03,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 14, // 0x40 '@' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x18,0x60,0x20,0x10,0x27,0xD0,0x4C,0xC8,0x4C,0xC8,0x4C,0xC8,0x4C,0xC8,0x4C,0xC8,0x27,0xF0,0x20,0x00,0x18,0x00,0x07,0xC0,0x00,0x00, - - 12, // 0x41 'A' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x0F,0x00,0x0F,0x00,0x19,0x80,0x19,0x80,0x30,0xC0,0x3F,0xC0,0x30,0xC0,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x42 'B' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7F,0x00,0x61,0x80,0x60,0xC0,0x60,0xC0,0x61,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x43 'C' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x38,0xC0,0x30,0xC0,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x30,0xC0,0x38,0xC0,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x44 'D' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x61,0xC0,0x60,0xC0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0xC0,0x61,0xC0,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x45 'E' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x46 'F' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x47 'G' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xC0,0x38,0x60,0x30,0x60,0x60,0x00,0x60,0x00,0x63,0xE0,0x60,0x60,0x60,0x60,0x30,0x60,0x38,0x60,0x0F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x48 'H' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x7F,0xE0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x49 'I' - 0x00,0x00,0x00,0x00,0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,0x00,0x00, - - 8, // 0x4A 'J' - 0x00,0x00,0x00,0x00,0x3E,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0xF8,0x00,0x00,0x00, - - 12, // 0x4B 'K' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x60,0xC0,0x61,0x80,0x63,0x00,0x66,0x00,0x6C,0x00,0x7E,0x00,0x73,0x00,0x61,0x80,0x60,0xC0,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x4C 'L' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 14, // 0x4D 'M' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x38,0x70,0x38,0x70,0x78,0x58,0x58,0x58,0xD8,0x4C,0x98,0x4D,0x98,0x47,0x18,0x47,0x18,0x42,0x18,0x40,0x18,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x4E 'N' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x20,0x70,0x20,0x58,0x20,0x4C,0x20,0x4C,0x20,0x46,0x20,0x43,0x20,0x43,0x20,0x41,0xA0,0x40,0xE0,0x40,0xE0,0x00,0x00,0x00,0x00,0x00,0x00, - - 13, // 0x4F 'O' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x38,0xE0,0x30,0x60,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x30,0x60,0x38,0xE0,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x50 'P' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x61,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x61,0x80,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 13, // 0x51 'Q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x38,0xE0,0x30,0x60,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x30,0x60,0x38,0xE0,0x0F,0x80,0x03,0x00,0x03,0x80,0x01,0xF0, - - 12, // 0x52 'R' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x61,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x61,0x80,0x7F,0x00,0x61,0x80,0x60,0xC0,0x60,0x60,0x60,0x30,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x53 'S' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x30,0xC0,0x60,0xC0,0x60,0x00,0x7C,0x00,0x3F,0x80,0x03,0xC0,0x00,0xC0,0x60,0xC0,0x61,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x54 'T' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 12, // 0x55 'U' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x30,0xC0,0x1F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x56 'V' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x31,0x80,0x31,0x80,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x0E,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 16, // 0x57 'W' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x86,0x61,0x86,0x63,0xC6,0x33,0xCC,0x32,0x4C,0x32,0x4C,0x1E,0x78,0x1C,0x38,0x1C,0x38,0x0C,0x30,0x0C,0x30,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x58 'X' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xC0,0x31,0x80,0x31,0x80,0x1B,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x1B,0x00,0x31,0x80,0x31,0x80,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x59 'Y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x1E,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x5A 'Z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x01,0x80,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x5B '[' - 0x00,0x00,0x00,0x3E,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3E, - - 10, // 0x5C '\' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x30,0x00,0x30,0x00,0x18,0x00,0x18,0x00,0x0C,0x00,0x0C,0x00,0x06,0x00,0x06,0x00,0x03,0x00,0x03,0x00,0x01,0x80,0x01,0x80,0x00,0x00, - - 8, // 0x5D ']' - 0x00,0x00,0x00,0x7C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x7C, - - 13, // 0x5E '^' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x5F '_' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00, - - 11, // 0x60 '`' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x61 'a' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x01,0x80,0x01,0x80,0x3F,0x80,0x61,0x80,0x61,0x80,0x63,0x80,0x3D,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x62 'b' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x6E,0x00,0x73,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 8, // 0x63 'c' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x33,0x60,0x60,0x60,0x60,0x33,0x1E,0x00,0x00,0x00, - - 10, // 0x64 'd' - 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x1F,0x80,0x31,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x65 'e' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x7F,0x80,0x60,0x00,0x60,0x00,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 6, // 0x66 'f' - 0x00,0x00,0x00,0x1C,0x30,0x30,0x30,0x7C,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x00,0x00, - - 10, // 0x67 'g' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x31,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0x80,0x01,0x80,0x03,0x00,0x3E,0x00, - - 10, // 0x68 'h' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x6F,0x00,0x71,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x69 'i' - 0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, - - 6, // 0x6A 'j' - 0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xF0, - - 10, // 0x6B 'k' - 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x61,0x80,0x63,0x00,0x66,0x00,0x6C,0x00,0x7E,0x00,0x73,0x00,0x61,0x80,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, - - 4, // 0x6C 'l' - 0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, - - 16, // 0x6D 'm' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6F,0x3C,0x71,0xC6,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x6E 'n' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6F,0x00,0x71,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x6F 'o' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x70 'p' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x00,0x73,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x7E,0x00,0x60,0x00,0x60,0x00,0x60,0x00, - - 10, // 0x71 'q' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x31,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0x80,0x01,0x80,0x01,0x80,0x01,0x80, - - 7, // 0x72 'r' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6E,0x7E,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00, - - 9, // 0x73 's' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x61,0x00,0x60,0x00,0x7E,0x00,0x3F,0x00,0x03,0x00,0x43,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 7, // 0x74 't' - 0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x7E,0x30,0x30,0x30,0x30,0x30,0x30,0x1E,0x00,0x00,0x00, - - 10, // 0x75 'u' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x63,0x80,0x3D,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x76 'v' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x33,0x00,0x33,0x00,0x33,0x00,0x1E,0x00,0x1E,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 14, // 0x77 'w' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x18,0x63,0x18,0x63,0x18,0x37,0xB0,0x34,0xB0,0x3C,0xF0,0x18,0x60,0x18,0x60,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x78 'x' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x33,0x00,0x33,0x00,0x1E,0x00,0x1E,0x00,0x33,0x00,0x33,0x00,0x61,0x80,0x00,0x00,0x00,0x00,0x00,0x00, - - 10, // 0x79 'y' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x80,0x61,0x80,0x33,0x00,0x33,0x00,0x33,0x00,0x1E,0x00,0x1E,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00, - - 9, // 0x7A 'z' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 11, // 0x7B '{' - 0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x70,0x00,0x18,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x07,0x80, - - 8, // 0x7C '|' - 0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, - - 11, // 0x7D '}' - 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x03,0x00,0x01,0xC0,0x03,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x3C,0x00, - - 13, // 0x7E '~' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x10,0x24,0x10,0x42,0x10,0x41,0x20,0x40,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - - 15, // 0x7F '' - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00, - - 0 - }; - -} - diff --git a/uppdev/aggdraw/agg_embedded_raster_fonts.h b/uppdev/aggdraw/agg_embedded_raster_fonts.h deleted file mode 100644 index 795a90d00..000000000 --- a/uppdev/aggdraw/agg_embedded_raster_fonts.h +++ /dev/null @@ -1,68 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_EMBEDDED_RASTER_FONTS_INCLUDED -#define AGG_EMBEDDED_RASTER_FONTS_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - extern const int8u gse4x6[]; - extern const int8u gse4x8[]; - extern const int8u gse5x7[]; - extern const int8u gse5x9[]; - extern const int8u gse6x12[]; - extern const int8u gse6x9[]; - extern const int8u gse7x11[]; - extern const int8u gse7x11_bold[]; - extern const int8u gse7x15[]; - extern const int8u gse7x15_bold[]; - extern const int8u gse8x16[]; - extern const int8u gse8x16_bold[]; - extern const int8u mcs11_prop[]; - extern const int8u mcs11_prop_condensed[]; - extern const int8u mcs12_prop[]; - extern const int8u mcs13_prop[]; - extern const int8u mcs5x10_mono[]; - extern const int8u mcs5x11_mono[]; - extern const int8u mcs6x10_mono[]; - extern const int8u mcs6x11_mono[]; - extern const int8u mcs7x12_mono_high[]; - extern const int8u mcs7x12_mono_low[]; - extern const int8u verdana12[]; - extern const int8u verdana12_bold[]; - extern const int8u verdana13[]; - extern const int8u verdana13_bold[]; - extern const int8u verdana14[]; - extern const int8u verdana14_bold[]; - extern const int8u verdana16[]; - extern const int8u verdana16_bold[]; - extern const int8u verdana17[]; - extern const int8u verdana17_bold[]; - extern const int8u verdana18[]; - extern const int8u verdana18_bold[]; -} - -#endif diff --git a/uppdev/aggdraw/agg_font_cache_manager.h b/uppdev/aggdraw/agg_font_cache_manager.h deleted file mode 100644 index 6513868c7..000000000 --- a/uppdev/aggdraw/agg_font_cache_manager.h +++ /dev/null @@ -1,418 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_FONT_CACHE_MANAGER_INCLUDED -#define AGG_FONT_CACHE_MANAGER_INCLUDED - -#include -#include "agg_array.h" - -namespace agg -{ - - //---------------------------------------------------------glyph_data_type - enum glyph_data_type - { - glyph_data_invalid = 0, - glyph_data_mono = 1, - glyph_data_gray8 = 2, - glyph_data_outline = 3 - }; - - - //-------------------------------------------------------------glyph_cache - struct glyph_cache - { - unsigned glyph_index; - int8u* data; - unsigned data_size; - glyph_data_type data_type; - rect_i bounds; - double advance_x; - double advance_y; - }; - - - //--------------------------------------------------------------font_cache - class font_cache - { - public: - enum block_size_e { block_size = 16384-16 }; - - //-------------------------------------------------------------------- - font_cache() : - m_allocator(block_size), - m_font_signature(0) - {} - - //-------------------------------------------------------------------- - void signature(const char* font_signature) - { - m_font_signature = (char*)m_allocator.allocate(strlen(font_signature) + 1); - strcpy(m_font_signature, font_signature); - memset(m_glyphs, 0, sizeof(m_glyphs)); - } - - //-------------------------------------------------------------------- - bool font_is(const char* font_signature) const - { - return strcmp(font_signature, m_font_signature) == 0; - } - - //-------------------------------------------------------------------- - const glyph_cache* find_glyph(unsigned glyph_code) const - { - unsigned msb = (glyph_code >> 8) & 0xFF; - if(m_glyphs[msb]) - { - return m_glyphs[msb][glyph_code & 0xFF]; - } - return 0; - } - - //-------------------------------------------------------------------- - glyph_cache* cache_glyph(unsigned glyph_code, - unsigned glyph_index, - unsigned data_size, - glyph_data_type data_type, - const rect_i& bounds, - double advance_x, - double advance_y) - { - unsigned msb = (glyph_code >> 8) & 0xFF; - if(m_glyphs[msb] == 0) - { - m_glyphs[msb] = - (glyph_cache**)m_allocator.allocate(sizeof(glyph_cache*) * 256, - sizeof(glyph_cache*)); - memset(m_glyphs[msb], 0, sizeof(glyph_cache*) * 256); - } - - unsigned lsb = glyph_code & 0xFF; - if(m_glyphs[msb][lsb]) return 0; // Already exists, do not overwrite - - glyph_cache* glyph = - (glyph_cache*)m_allocator.allocate(sizeof(glyph_cache), - sizeof(double)); - - glyph->glyph_index = glyph_index; - glyph->data = m_allocator.allocate(data_size); - glyph->data_size = data_size; - glyph->data_type = data_type; - glyph->bounds = bounds; - glyph->advance_x = advance_x; - glyph->advance_y = advance_y; - return m_glyphs[msb][lsb] = glyph; - } - - private: - block_allocator m_allocator; - glyph_cache** m_glyphs[256]; - char* m_font_signature; - }; - - - - - - - - //---------------------------------------------------------font_cache_pool - class font_cache_pool - { - public: - //-------------------------------------------------------------------- - ~font_cache_pool() - { - unsigned i; - for(i = 0; i < m_num_fonts; ++i) - { - obj_allocator::deallocate(m_fonts[i]); - } - pod_allocator::deallocate(m_fonts, m_max_fonts); - } - - //-------------------------------------------------------------------- - font_cache_pool(unsigned max_fonts=32) : - m_fonts(pod_allocator::allocate(max_fonts)), - m_max_fonts(max_fonts), - m_num_fonts(0), - m_cur_font(0) - {} - - - //-------------------------------------------------------------------- - void font(const char* font_signature, bool reset_cache = false) - { - int idx = find_font(font_signature); - if(idx >= 0) - { - if(reset_cache) - { - obj_allocator::deallocate(m_fonts[idx]); - m_fonts[idx] = obj_allocator::allocate(); - m_fonts[idx]->signature(font_signature); - } - m_cur_font = m_fonts[idx]; - } - else - { - if(m_num_fonts >= m_max_fonts) - { - obj_allocator::deallocate(m_fonts[0]); - memcpy(m_fonts, - m_fonts + 1, - (m_max_fonts - 1) * sizeof(font_cache*)); - m_num_fonts = m_max_fonts - 1; - } - m_fonts[m_num_fonts] = obj_allocator::allocate(); - m_fonts[m_num_fonts]->signature(font_signature); - m_cur_font = m_fonts[m_num_fonts]; - ++m_num_fonts; - } - } - - //-------------------------------------------------------------------- - const font_cache* font() const - { - return m_cur_font; - } - - //-------------------------------------------------------------------- - const glyph_cache* find_glyph(unsigned glyph_code) const - { - if(m_cur_font) return m_cur_font->find_glyph(glyph_code); - return 0; - } - - //-------------------------------------------------------------------- - glyph_cache* cache_glyph(unsigned glyph_code, - unsigned glyph_index, - unsigned data_size, - glyph_data_type data_type, - const rect_i& bounds, - double advance_x, - double advance_y) - { - if(m_cur_font) - { - return m_cur_font->cache_glyph(glyph_code, - glyph_index, - data_size, - data_type, - bounds, - advance_x, - advance_y); - } - return 0; - } - - - //-------------------------------------------------------------------- - int find_font(const char* font_signature) - { - unsigned i; - for(i = 0; i < m_num_fonts; i++) - { - if(m_fonts[i]->font_is(font_signature)) return int(i); - } - return -1; - } - - private: - font_cache** m_fonts; - unsigned m_max_fonts; - unsigned m_num_fonts; - font_cache* m_cur_font; - }; - - - - - //------------------------------------------------------------------------ - enum glyph_rendering - { - glyph_ren_native_mono, - glyph_ren_native_gray8, - glyph_ren_outline, - glyph_ren_agg_mono, - glyph_ren_agg_gray8 - }; - - - - - //------------------------------------------------------font_cache_manager - template class font_cache_manager - { - public: - typedef FontEngine font_engine_type; - typedef font_cache_manager self_type; - typedef typename font_engine_type::path_adaptor_type path_adaptor_type; - typedef typename font_engine_type::gray8_adaptor_type gray8_adaptor_type; - typedef typename gray8_adaptor_type::embedded_scanline gray8_scanline_type; - typedef typename font_engine_type::mono_adaptor_type mono_adaptor_type; - typedef typename mono_adaptor_type::embedded_scanline mono_scanline_type; - - //-------------------------------------------------------------------- - font_cache_manager(font_engine_type& engine, unsigned max_fonts=32) : - m_fonts(max_fonts), - m_engine(engine), - m_change_stamp(-1), - m_prev_glyph(0), - m_last_glyph(0) - {} - - //-------------------------------------------------------------------- - void reset_last_glyph() - { - m_prev_glyph = m_last_glyph = 0; - } - - //-------------------------------------------------------------------- - const glyph_cache* glyph(unsigned glyph_code) - { - synchronize(); - const glyph_cache* gl = m_fonts.find_glyph(glyph_code); - if(gl) - { - m_prev_glyph = m_last_glyph; - return m_last_glyph = gl; - } - else - { - if(m_engine.prepare_glyph(glyph_code)) - { - m_prev_glyph = m_last_glyph; - m_last_glyph = m_fonts.cache_glyph(glyph_code, - m_engine.glyph_index(), - m_engine.data_size(), - m_engine.data_type(), - m_engine.bounds(), - m_engine.advance_x(), - m_engine.advance_y()); - m_engine.write_glyph_to(m_last_glyph->data); - return m_last_glyph; - } - } - return 0; - } - - //-------------------------------------------------------------------- - void init_embedded_adaptors(const glyph_cache* gl, - double x, double y, - double scale=1.0) - { - if(gl) - { - switch(gl->data_type) - { - default: return; - case glyph_data_mono: - m_mono_adaptor.init(gl->data, gl->data_size, x, y); - break; - - case glyph_data_gray8: - m_gray8_adaptor.init(gl->data, gl->data_size, x, y); - break; - - case glyph_data_outline: - m_path_adaptor.init(gl->data, gl->data_size, x, y, scale); - break; - } - } - } - - - //-------------------------------------------------------------------- - path_adaptor_type& path_adaptor() { return m_path_adaptor; } - gray8_adaptor_type& gray8_adaptor() { return m_gray8_adaptor; } - gray8_scanline_type& gray8_scanline() { return m_gray8_scanline; } - mono_adaptor_type& mono_adaptor() { return m_mono_adaptor; } - mono_scanline_type& mono_scanline() { return m_mono_scanline; } - - //-------------------------------------------------------------------- - const glyph_cache* perv_glyph() const { return m_prev_glyph; } - const glyph_cache* last_glyph() const { return m_last_glyph; } - - //-------------------------------------------------------------------- - bool add_kerning(double* x, double* y) - { - if(m_prev_glyph && m_last_glyph) - { - return m_engine.add_kerning(m_prev_glyph->glyph_index, - m_last_glyph->glyph_index, - x, y); - } - return false; - } - - //-------------------------------------------------------------------- - void precache(unsigned from, unsigned to) - { - for(; from <= to; ++from) glyph(from); - } - - //-------------------------------------------------------------------- - void reset_cache() - { - m_fonts.font(m_engine.font_signature(), true); - m_change_stamp = m_engine.change_stamp(); - m_prev_glyph = m_last_glyph = 0; - } - - private: - //-------------------------------------------------------------------- - font_cache_manager(const self_type&); - const self_type& operator = (const self_type&); - - //-------------------------------------------------------------------- - void synchronize() - { - if(m_change_stamp != m_engine.change_stamp()) - { - m_fonts.font(m_engine.font_signature()); - m_change_stamp = m_engine.change_stamp(); - m_prev_glyph = m_last_glyph = 0; - } - } - - font_cache_pool m_fonts; - font_engine_type& m_engine; - int m_change_stamp; - double m_dx; - double m_dy; - const glyph_cache* m_prev_glyph; - const glyph_cache* m_last_glyph; - path_adaptor_type m_path_adaptor; - gray8_adaptor_type m_gray8_adaptor; - gray8_scanline_type m_gray8_scanline; - mono_adaptor_type m_mono_adaptor; - mono_scanline_type m_mono_scanline; - }; - -} - -#endif - diff --git a/uppdev/aggdraw/agg_gamma_functions.h b/uppdev/aggdraw/agg_gamma_functions.h deleted file mode 100644 index 8c49cfa7e..000000000 --- a/uppdev/aggdraw/agg_gamma_functions.h +++ /dev/null @@ -1,132 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_GAMMA_FUNCTIONS_INCLUDED -#define AGG_GAMMA_FUNCTIONS_INCLUDED - -#include -#include "agg_basics.h" - -namespace agg -{ - //===============================================================gamma_none - struct gamma_none - { - double operator()(double x) const { return x; } - }; - - - //==============================================================gamma_power - class gamma_power - { - public: - gamma_power() : m_gamma(1.0) {} - gamma_power(double g) : m_gamma(g) {} - - void gamma(double g) { m_gamma = g; } - double gamma() const { return m_gamma; } - - double operator() (double x) const - { - return pow(x, m_gamma); - } - - private: - double m_gamma; - }; - - - //==========================================================gamma_threshold - class gamma_threshold - { - public: - gamma_threshold() : m_threshold(0.5) {} - gamma_threshold(double t) : m_threshold(t) {} - - void threshold(double t) { m_threshold = t; } - double threshold() const { return m_threshold; } - - double operator() (double x) const - { - return (x < m_threshold) ? 0.0 : 1.0; - } - - private: - double m_threshold; - }; - - - //============================================================gamma_linear - class gamma_linear - { - public: - gamma_linear() : m_start(0.0), m_end(1.0) {} - gamma_linear(double s, double e) : m_start(s), m_end(e) {} - - void set(double s, double e) { m_start = s; m_end = e; } - void start(double s) { m_start = s; } - void end(double e) { m_end = e; } - double start() const { return m_start; } - double end() const { return m_end; } - - double operator() (double x) const - { - if(x < m_start) return 0.0; - if(x > m_end) return 1.0; - return (x - m_start) / (m_end - m_start); - } - - private: - double m_start; - double m_end; - }; - - - //==========================================================gamma_multiply - class gamma_multiply - { - public: - gamma_multiply() : m_mul(1.0) {} - gamma_multiply(double v) : m_mul(v) {} - - void value(double v) { m_mul = v; } - double value() const { return m_mul; } - - double operator() (double x) const - { - double y = x * m_mul; - if(y > 1.0) y = 1.0; - return y; - } - - private: - double m_mul; - }; - -} - -#endif - - - diff --git a/uppdev/aggdraw/agg_gamma_lut.h b/uppdev/aggdraw/agg_gamma_lut.h deleted file mode 100644 index e9ffbf580..000000000 --- a/uppdev/aggdraw/agg_gamma_lut.h +++ /dev/null @@ -1,130 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_GAMMA_LUT_INCLUDED -#define AGG_GAMMA_LUT_INCLUDED - -#include -#include "agg_basics.h" - -namespace agg -{ - template class gamma_lut - { - public: - typedef gamma_lut self_type; - - enum gamma_scale_e - { - gamma_shift = GammaShift, - gamma_size = 1 << gamma_shift, - gamma_mask = gamma_size - 1 - }; - - enum hi_res_scale_e - { - hi_res_shift = HiResShift, - hi_res_size = 1 << hi_res_shift, - hi_res_mask = hi_res_size - 1 - }; - - ~gamma_lut() - { - pod_allocator::deallocate(m_inv_gamma, hi_res_size); - pod_allocator::deallocate(m_dir_gamma, gamma_size); - } - - gamma_lut() : - m_gamma(1.0), - m_dir_gamma(pod_allocator::allocate(gamma_size)), - m_inv_gamma(pod_allocator::allocate(hi_res_size)) - { - unsigned i; - for(i = 0; i < gamma_size; i++) - { - m_dir_gamma[i] = HiResT(i << (hi_res_shift - gamma_shift)); - } - - for(i = 0; i < hi_res_size; i++) - { - m_inv_gamma[i] = LoResT(i >> (hi_res_shift - gamma_shift)); - } - } - - gamma_lut(double g) : - m_gamma(1.0), - m_dir_gamma(pod_allocator::allocate(gamma_size)), - m_inv_gamma(pod_allocator::allocate(hi_res_size)) - { - gamma(g); - } - - void gamma(double g) - { - m_gamma = g; - - unsigned i; - for(i = 0; i < gamma_size; i++) - { - m_dir_gamma[i] = (HiResT) - uround(pow(i / double(gamma_mask), m_gamma) * double(hi_res_mask)); - } - - double inv_g = 1.0 / g; - for(i = 0; i < hi_res_size; i++) - { - m_inv_gamma[i] = (LoResT) - uround(pow(i / double(hi_res_mask), inv_g) * double(gamma_mask)); - } - } - - double gamma() const - { - return m_gamma; - } - - HiResT dir(LoResT v) const - { - return m_dir_gamma[unsigned(v)]; - } - - LoResT inv(HiResT v) const - { - return m_inv_gamma[unsigned(v)]; - } - - private: - gamma_lut(const self_type&); - const self_type& operator = (const self_type&); - - double m_gamma; - HiResT* m_dir_gamma; - LoResT* m_inv_gamma; - }; -} - -#endif diff --git a/uppdev/aggdraw/agg_glyph_raster_bin.h b/uppdev/aggdraw/agg_glyph_raster_bin.h deleted file mode 100644 index 085f1f21b..000000000 --- a/uppdev/aggdraw/agg_glyph_raster_bin.h +++ /dev/null @@ -1,164 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_GLYPH_RASTER_BIN_INCLUDED -#define AGG_GLYPH_RASTER_BIN_INCLUDED - -#include -#include "agg_basics.h" - -namespace agg -{ - - //========================================================glyph_raster_bin - template class glyph_raster_bin - { - public: - typedef ColorT color_type; - - //-------------------------------------------------------------------- - struct glyph_rect - { - int x1,y1,x2,y2; - double dx, dy; - }; - - //-------------------------------------------------------------------- - glyph_raster_bin(const int8u* font) : - m_font(font), - m_big_endian(false) - { - int t = 1; - if(*(char*)&t == 0) m_big_endian = true; - memset(m_span, 0, sizeof(m_span)); - } - - //-------------------------------------------------------------------- - const int8u* font() const { return m_font; } - void font(const int8u* f) { m_font = f; } - - //-------------------------------------------------------------------- - double height() const { return m_font[0]; } - double base_line() const { return m_font[1]; } - - //-------------------------------------------------------------------- - template - double width(const CharT* str) const - { - unsigned start_char = m_font[2]; - unsigned num_chars = m_font[3]; - - unsigned w = 0; - while(*str) - { - unsigned glyph = *str; - const int8u* bits = m_font + 4 + num_chars * 2 + - value(m_font + 4 + (glyph - start_char) * 2); - w += *bits; - ++str; - } - return w; - } - - //-------------------------------------------------------------------- - void prepare(glyph_rect* r, double x, double y, unsigned glyph, bool flip) - { - unsigned start_char = m_font[2]; - unsigned num_chars = m_font[3]; - - m_bits = m_font + 4 + num_chars * 2 + - value(m_font + 4 + (glyph - start_char) * 2); - - m_glyph_width = *m_bits++; - m_glyph_byte_width = (m_glyph_width + 7) >> 3; - - r->x1 = int(x); - r->x2 = r->x1 + m_glyph_width - 1; - if(flip) - { - r->y1 = int(y) - m_font[0] + m_font[1]; - r->y2 = r->y1 + m_font[0] - 1; - } - else - { - r->y1 = int(y) - m_font[1] + 1; - r->y2 = r->y1 + m_font[0] - 1; - } - r->dx = m_glyph_width; - r->dy = 0; - } - - //-------------------------------------------------------------------- - const cover_type* span(unsigned i) - { - i = m_font[0] - i - 1; - const int8u* bits = m_bits + i * m_glyph_byte_width; - unsigned j; - unsigned val = *bits; - unsigned nb = 0; - for(j = 0; j < m_glyph_width; ++j) - { - m_span[j] = (cover_type)((val & 0x80) ? cover_full : cover_none); - val <<= 1; - if(++nb >= 8) - { - val = *++bits; - nb = 0; - } - } - return m_span; - } - - private: - //-------------------------------------------------------------------- - int16u value(const int8u* p) const - { - int16u v; - if(m_big_endian) - { - *(int8u*)&v = p[1]; - *((int8u*)&v + 1) = p[0]; - } - else - { - *(int8u*)&v = p[0]; - *((int8u*)&v + 1) = p[1]; - } - return v; - } - - - //-------------------------------------------------------------------- - const int8u* m_font; - bool m_big_endian; - cover_type m_span[32]; - const int8u* m_bits; - unsigned m_glyph_width; - unsigned m_glyph_byte_width; - }; - - -} - -#endif diff --git a/uppdev/aggdraw/agg_gradient_lut.h b/uppdev/aggdraw/agg_gradient_lut.h deleted file mode 100644 index 905780bd3..000000000 --- a/uppdev/aggdraw/agg_gradient_lut.h +++ /dev/null @@ -1,253 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_GRADIENT_LUT_INCLUDED -#define AGG_GRADIENT_LUT_INCLUDED - -#include "agg_array.h" -#include "agg_dda_line.h" -#include "agg_color_rgba.h" -#include "agg_color_gray.h" - -namespace agg -{ - - //======================================================color_interpolator - template struct color_interpolator - { - public: - typedef ColorT color_type; - - color_interpolator(const color_type& c1, - const color_type& c2, - unsigned len) : - m_c1(c1), - m_c2(c2), - m_len(len), - m_count(0) - {} - - void operator ++ () - { - ++m_count; - } - - color_type color() const - { - return m_c1.gradient(m_c2, double(m_count) / m_len); - } - - private: - color_type m_c1; - color_type m_c2; - unsigned m_len; - unsigned m_count; - }; - - //======================================================================== - // Fast specialization for rgba8 - template<> struct color_interpolator - { - public: - typedef rgba8 color_type; - - color_interpolator(const color_type& c1, - const color_type& c2, - unsigned len) : - r(c1.r, c2.r, len), - g(c1.g, c2.g, len), - b(c1.b, c2.b, len), - a(c1.a, c2.a, len) - {} - - void operator ++ () - { - ++r; ++g; ++b; ++a; - } - - color_type color() const - { - return color_type(r.y(), g.y(), b.y(), a.y()); - } - - private: - agg::dda_line_interpolator<14> r, g, b, a; - }; - - //======================================================================== - // Fast specialization for gray8 - template<> struct color_interpolator - { - public: - typedef gray8 color_type; - - color_interpolator(const color_type& c1, - const color_type& c2, - unsigned len) : - v(c1.v, c2.v, len), - a(c1.a, c2.a, len) - {} - - void operator ++ () - { - ++v; ++a; - } - - color_type color() const - { - return color_type(v.y(), a.y()); - } - - private: - agg::dda_line_interpolator<14> v,a; - }; - - //============================================================gradient_lut - template class gradient_lut - { - public: - typedef ColorInterpolator interpolator_type; - typedef typename interpolator_type::color_type color_type; - enum { color_lut_size = ColorLutSize }; - - //-------------------------------------------------------------------- - gradient_lut() : m_color_lut(color_lut_size) {} - - // Build Gradient Lut - // First, call remove_all(), then add_color() at least twice, - // then build_lut(). Argument "offset" in add_color must be - // in range [0...1] and defines a color stop as it is described - // in SVG specification, section Gradients and Patterns. - // The simplest linear gradient is: - // gradient_lut.add_color(0.0, start_color); - // gradient_lut.add_color(1.0, end_color); - //-------------------------------------------------------------------- - void remove_all(); - void add_color(double offset, const color_type& color); - void build_lut(); - - // Size-index Interface. This class can be used directly as the - // ColorF in span_gradient. All it needs is two access methods - // size() and operator []. - //-------------------------------------------------------------------- - static unsigned size() - { - return color_lut_size; - } - const color_type& operator [] (unsigned i) const - { - return m_color_lut[i]; - } - - private: - //-------------------------------------------------------------------- - struct color_point - { - double offset; - color_type color; - - color_point() {} - color_point(double off, const color_type& c) : - offset(off), color(c) - { - if(offset < 0.0) offset = 0.0; - if(offset > 1.0) offset = 1.0; - } - }; - typedef agg::pod_bvector color_profile_type; - typedef agg::pod_array color_lut_type; - - static bool offset_less(const color_point& a, const color_point& b) - { - return a.offset < b.offset; - } - static bool offset_equal(const color_point& a, const color_point& b) - { - return a.offset == b.offset; - } - - //-------------------------------------------------------------------- - color_profile_type m_color_profile; - color_lut_type m_color_lut; - }; - - - - //------------------------------------------------------------------------ - template - void gradient_lut::remove_all() - { - m_color_profile.remove_all(); - } - - //------------------------------------------------------------------------ - template - void gradient_lut::add_color(double offset, const color_type& color) - { - m_color_profile.add(color_point(offset, color)); - } - - //------------------------------------------------------------------------ - template - void gradient_lut::build_lut() - { - quick_sort(m_color_profile, offset_less); - m_color_profile.cut_at(remove_duplicates(m_color_profile, offset_equal)); - if(m_color_profile.size() >= 2) - { - unsigned i; - unsigned start = uround(m_color_profile[0].offset * color_lut_size); - unsigned end; - color_type c = m_color_profile[0].color; - for(i = 0; i < start; i++) - { - m_color_lut[i] = c; - } - for(i = 1; i < m_color_profile.size(); i++) - { - end = uround(m_color_profile[i].offset * color_lut_size); - interpolator_type ci(m_color_profile[i-1].color, - m_color_profile[i ].color, - end - start + 1); - while(start < end) - { - m_color_lut[start] = ci.color(); - ++ci; - ++start; - } - } - c = m_color_profile.last().color; - for(; end < m_color_lut.size(); end++) - { - m_color_lut[end] = c; - } - } - } -} - - - - -#endif diff --git a/uppdev/aggdraw/agg_gsv_text.cpp b/uppdev/aggdraw/agg_gsv_text.cpp deleted file mode 100644 index bc54ef7cb..000000000 --- a/uppdev/aggdraw/agg_gsv_text.cpp +++ /dev/null @@ -1,681 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#include -#include -#include "agg_gsv_text.h" -#include "agg_bounding_rect.h" - - - -namespace agg -{ - int8u gsv_default_font[] = - { - 0x40,0x00,0x6c,0x0f,0x15,0x00,0x0e,0x00,0xf9,0xff, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x0d,0x0a,0x0d,0x0a,0x46,0x6f,0x6e,0x74,0x20,0x28, - 0x63,0x29,0x20,0x4d,0x69,0x63,0x72,0x6f,0x50,0x72, - 0x6f,0x66,0x20,0x32,0x37,0x20,0x53,0x65,0x70,0x74, - 0x65,0x6d,0x62,0x2e,0x31,0x39,0x38,0x39,0x00,0x0d, - 0x0a,0x0d,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x02,0x00,0x12,0x00,0x34,0x00,0x46,0x00,0x94,0x00, - 0xd0,0x00,0x2e,0x01,0x3e,0x01,0x64,0x01,0x8a,0x01, - 0x98,0x01,0xa2,0x01,0xb4,0x01,0xba,0x01,0xc6,0x01, - 0xcc,0x01,0xf0,0x01,0xfa,0x01,0x18,0x02,0x38,0x02, - 0x44,0x02,0x68,0x02,0x98,0x02,0xa2,0x02,0xde,0x02, - 0x0e,0x03,0x24,0x03,0x40,0x03,0x48,0x03,0x52,0x03, - 0x5a,0x03,0x82,0x03,0xec,0x03,0xfa,0x03,0x26,0x04, - 0x4c,0x04,0x6a,0x04,0x7c,0x04,0x8a,0x04,0xb6,0x04, - 0xc4,0x04,0xca,0x04,0xe0,0x04,0xee,0x04,0xf8,0x04, - 0x0a,0x05,0x18,0x05,0x44,0x05,0x5e,0x05,0x8e,0x05, - 0xac,0x05,0xd6,0x05,0xe0,0x05,0xf6,0x05,0x00,0x06, - 0x12,0x06,0x1c,0x06,0x28,0x06,0x36,0x06,0x48,0x06, - 0x4e,0x06,0x60,0x06,0x6e,0x06,0x74,0x06,0x84,0x06, - 0xa6,0x06,0xc8,0x06,0xe6,0x06,0x08,0x07,0x2c,0x07, - 0x3c,0x07,0x68,0x07,0x7c,0x07,0x8c,0x07,0xa2,0x07, - 0xb0,0x07,0xb6,0x07,0xd8,0x07,0xec,0x07,0x10,0x08, - 0x32,0x08,0x54,0x08,0x64,0x08,0x88,0x08,0x98,0x08, - 0xac,0x08,0xb6,0x08,0xc8,0x08,0xd2,0x08,0xe4,0x08, - 0xf2,0x08,0x3e,0x09,0x48,0x09,0x94,0x09,0xc2,0x09, - 0xc4,0x09,0xd0,0x09,0xe2,0x09,0x04,0x0a,0x0e,0x0a, - 0x26,0x0a,0x34,0x0a,0x4a,0x0a,0x66,0x0a,0x70,0x0a, - 0x7e,0x0a,0x8e,0x0a,0x9a,0x0a,0xa6,0x0a,0xb4,0x0a, - 0xd8,0x0a,0xe2,0x0a,0xf6,0x0a,0x18,0x0b,0x22,0x0b, - 0x32,0x0b,0x56,0x0b,0x60,0x0b,0x6e,0x0b,0x7c,0x0b, - 0x8a,0x0b,0x9c,0x0b,0x9e,0x0b,0xb2,0x0b,0xc2,0x0b, - 0xd8,0x0b,0xf4,0x0b,0x08,0x0c,0x30,0x0c,0x56,0x0c, - 0x72,0x0c,0x90,0x0c,0xb2,0x0c,0xce,0x0c,0xe2,0x0c, - 0xfe,0x0c,0x10,0x0d,0x26,0x0d,0x36,0x0d,0x42,0x0d, - 0x4e,0x0d,0x5c,0x0d,0x78,0x0d,0x8c,0x0d,0x8e,0x0d, - 0x90,0x0d,0x92,0x0d,0x94,0x0d,0x96,0x0d,0x98,0x0d, - 0x9a,0x0d,0x9c,0x0d,0x9e,0x0d,0xa0,0x0d,0xa2,0x0d, - 0xa4,0x0d,0xa6,0x0d,0xa8,0x0d,0xaa,0x0d,0xac,0x0d, - 0xae,0x0d,0xb0,0x0d,0xb2,0x0d,0xb4,0x0d,0xb6,0x0d, - 0xb8,0x0d,0xba,0x0d,0xbc,0x0d,0xbe,0x0d,0xc0,0x0d, - 0xc2,0x0d,0xc4,0x0d,0xc6,0x0d,0xc8,0x0d,0xca,0x0d, - 0xcc,0x0d,0xce,0x0d,0xd0,0x0d,0xd2,0x0d,0xd4,0x0d, - 0xd6,0x0d,0xd8,0x0d,0xda,0x0d,0xdc,0x0d,0xde,0x0d, - 0xe0,0x0d,0xe2,0x0d,0xe4,0x0d,0xe6,0x0d,0xe8,0x0d, - 0xea,0x0d,0xec,0x0d,0x0c,0x0e,0x26,0x0e,0x48,0x0e, - 0x64,0x0e,0x88,0x0e,0x92,0x0e,0xa6,0x0e,0xb4,0x0e, - 0xd0,0x0e,0xee,0x0e,0x02,0x0f,0x16,0x0f,0x26,0x0f, - 0x3c,0x0f,0x58,0x0f,0x6c,0x0f,0x6c,0x0f,0x6c,0x0f, - 0x6c,0x0f,0x6c,0x0f,0x6c,0x0f,0x6c,0x0f,0x6c,0x0f, - 0x6c,0x0f,0x6c,0x0f,0x6c,0x0f,0x6c,0x0f,0x6c,0x0f, - 0x6c,0x0f,0x6c,0x0f,0x6c,0x0f,0x6c,0x0f,0x10,0x80, - 0x05,0x95,0x00,0x72,0x00,0xfb,0xff,0x7f,0x01,0x7f, - 0x01,0x01,0xff,0x01,0x05,0xfe,0x05,0x95,0xff,0x7f, - 0x00,0x7a,0x01,0x86,0xff,0x7a,0x01,0x87,0x01,0x7f, - 0xfe,0x7a,0x0a,0x87,0xff,0x7f,0x00,0x7a,0x01,0x86, - 0xff,0x7a,0x01,0x87,0x01,0x7f,0xfe,0x7a,0x05,0xf2, - 0x0b,0x95,0xf9,0x64,0x0d,0x9c,0xf9,0x64,0xfa,0x91, - 0x0e,0x00,0xf1,0xfa,0x0e,0x00,0x04,0xfc,0x08,0x99, - 0x00,0x63,0x04,0x9d,0x00,0x63,0x04,0x96,0xff,0x7f, - 0x01,0x7f,0x01,0x01,0x00,0x01,0xfe,0x02,0xfd,0x01, - 0xfc,0x00,0xfd,0x7f,0xfe,0x7e,0x00,0x7e,0x01,0x7e, - 0x01,0x7f,0x02,0x7f,0x06,0x7e,0x02,0x7f,0x02,0x7e, - 0xf2,0x89,0x02,0x7e,0x02,0x7f,0x06,0x7e,0x02,0x7f, - 0x01,0x7f,0x01,0x7e,0x00,0x7c,0xfe,0x7e,0xfd,0x7f, - 0xfc,0x00,0xfd,0x01,0xfe,0x02,0x00,0x01,0x01,0x01, - 0x01,0x7f,0xff,0x7f,0x10,0xfd,0x15,0x95,0xee,0x6b, - 0x05,0x95,0x02,0x7e,0x00,0x7e,0xff,0x7e,0xfe,0x7f, - 0xfe,0x00,0xfe,0x02,0x00,0x02,0x01,0x02,0x02,0x01, - 0x02,0x00,0x02,0x7f,0x03,0x7f,0x03,0x00,0x03,0x01, - 0x02,0x01,0xfc,0xf2,0xfe,0x7f,0xff,0x7e,0x00,0x7e, - 0x02,0x7e,0x02,0x00,0x02,0x01,0x01,0x02,0x00,0x02, - 0xfe,0x02,0xfe,0x00,0x07,0xf9,0x15,0x8d,0xff,0x7f, - 0x01,0x7f,0x01,0x01,0x00,0x01,0xff,0x01,0xff,0x00, - 0xff,0x7f,0xff,0x7e,0xfe,0x7b,0xfe,0x7d,0xfe,0x7e, - 0xfe,0x7f,0xfd,0x00,0xfd,0x01,0xff,0x02,0x00,0x03, - 0x01,0x02,0x06,0x04,0x02,0x02,0x01,0x02,0x00,0x02, - 0xff,0x02,0xfe,0x01,0xfe,0x7f,0xff,0x7e,0x00,0x7e, - 0x01,0x7d,0x02,0x7d,0x05,0x79,0x02,0x7e,0x03,0x7f, - 0x01,0x00,0x01,0x01,0x00,0x01,0xf1,0xfe,0xfe,0x01, - 0xff,0x02,0x00,0x03,0x01,0x02,0x02,0x02,0x00,0x86, - 0x01,0x7e,0x08,0x75,0x02,0x7e,0x02,0x7f,0x05,0x80, - 0x05,0x93,0xff,0x01,0x01,0x01,0x01,0x7f,0x00,0x7e, - 0xff,0x7e,0xff,0x7f,0x06,0xf1,0x0b,0x99,0xfe,0x7e, - 0xfe,0x7d,0xfe,0x7c,0xff,0x7b,0x00,0x7c,0x01,0x7b, - 0x02,0x7c,0x02,0x7d,0x02,0x7e,0xfe,0x9e,0xfe,0x7c, - 0xff,0x7d,0xff,0x7b,0x00,0x7c,0x01,0x7b,0x01,0x7d, - 0x02,0x7c,0x05,0x85,0x03,0x99,0x02,0x7e,0x02,0x7d, - 0x02,0x7c,0x01,0x7b,0x00,0x7c,0xff,0x7b,0xfe,0x7c, - 0xfe,0x7d,0xfe,0x7e,0x02,0x9e,0x02,0x7c,0x01,0x7d, - 0x01,0x7b,0x00,0x7c,0xff,0x7b,0xff,0x7d,0xfe,0x7c, - 0x09,0x85,0x08,0x95,0x00,0x74,0xfb,0x89,0x0a,0x7a, - 0x00,0x86,0xf6,0x7a,0x0d,0xf4,0x0d,0x92,0x00,0x6e, - 0xf7,0x89,0x12,0x00,0x04,0xf7,0x06,0x81,0xff,0x7f, - 0xff,0x01,0x01,0x01,0x01,0x7f,0x00,0x7e,0xff,0x7e, - 0xff,0x7f,0x06,0x84,0x04,0x89,0x12,0x00,0x04,0xf7, - 0x05,0x82,0xff,0x7f,0x01,0x7f,0x01,0x01,0xff,0x01, - 0x05,0xfe,0x00,0xfd,0x0e,0x18,0x00,0xeb,0x09,0x95, - 0xfd,0x7f,0xfe,0x7d,0xff,0x7b,0x00,0x7d,0x01,0x7b, - 0x02,0x7d,0x03,0x7f,0x02,0x00,0x03,0x01,0x02,0x03, - 0x01,0x05,0x00,0x03,0xff,0x05,0xfe,0x03,0xfd,0x01, - 0xfe,0x00,0x0b,0xeb,0x06,0x91,0x02,0x01,0x03,0x03, - 0x00,0x6b,0x09,0x80,0x04,0x90,0x00,0x01,0x01,0x02, - 0x01,0x01,0x02,0x01,0x04,0x00,0x02,0x7f,0x01,0x7f, - 0x01,0x7e,0x00,0x7e,0xff,0x7e,0xfe,0x7d,0xf6,0x76, - 0x0e,0x00,0x03,0x80,0x05,0x95,0x0b,0x00,0xfa,0x78, - 0x03,0x00,0x02,0x7f,0x01,0x7f,0x01,0x7d,0x00,0x7e, - 0xff,0x7d,0xfe,0x7e,0xfd,0x7f,0xfd,0x00,0xfd,0x01, - 0xff,0x01,0xff,0x02,0x11,0xfc,0x0d,0x95,0xf6,0x72, - 0x0f,0x00,0xfb,0x8e,0x00,0x6b,0x07,0x80,0x0f,0x95, - 0xf6,0x00,0xff,0x77,0x01,0x01,0x03,0x01,0x03,0x00, - 0x03,0x7f,0x02,0x7e,0x01,0x7d,0x00,0x7e,0xff,0x7d, - 0xfe,0x7e,0xfd,0x7f,0xfd,0x00,0xfd,0x01,0xff,0x01, - 0xff,0x02,0x11,0xfc,0x10,0x92,0xff,0x02,0xfd,0x01, - 0xfe,0x00,0xfd,0x7f,0xfe,0x7d,0xff,0x7b,0x00,0x7b, - 0x01,0x7c,0x02,0x7e,0x03,0x7f,0x01,0x00,0x03,0x01, - 0x02,0x02,0x01,0x03,0x00,0x01,0xff,0x03,0xfe,0x02, - 0xfd,0x01,0xff,0x00,0xfd,0x7f,0xfe,0x7e,0xff,0x7d, - 0x10,0xf9,0x11,0x95,0xf6,0x6b,0xfc,0x95,0x0e,0x00, - 0x03,0xeb,0x08,0x95,0xfd,0x7f,0xff,0x7e,0x00,0x7e, - 0x01,0x7e,0x02,0x7f,0x04,0x7f,0x03,0x7f,0x02,0x7e, - 0x01,0x7e,0x00,0x7d,0xff,0x7e,0xff,0x7f,0xfd,0x7f, - 0xfc,0x00,0xfd,0x01,0xff,0x01,0xff,0x02,0x00,0x03, - 0x01,0x02,0x02,0x02,0x03,0x01,0x04,0x01,0x02,0x01, - 0x01,0x02,0x00,0x02,0xff,0x02,0xfd,0x01,0xfc,0x00, - 0x0c,0xeb,0x10,0x8e,0xff,0x7d,0xfe,0x7e,0xfd,0x7f, - 0xff,0x00,0xfd,0x01,0xfe,0x02,0xff,0x03,0x00,0x01, - 0x01,0x03,0x02,0x02,0x03,0x01,0x01,0x00,0x03,0x7f, - 0x02,0x7e,0x01,0x7c,0x00,0x7b,0xff,0x7b,0xfe,0x7d, - 0xfd,0x7f,0xfe,0x00,0xfd,0x01,0xff,0x02,0x10,0xfd, - 0x05,0x8e,0xff,0x7f,0x01,0x7f,0x01,0x01,0xff,0x01, - 0x00,0xf4,0xff,0x7f,0x01,0x7f,0x01,0x01,0xff,0x01, - 0x05,0xfe,0x05,0x8e,0xff,0x7f,0x01,0x7f,0x01,0x01, - 0xff,0x01,0x01,0xf3,0xff,0x7f,0xff,0x01,0x01,0x01, - 0x01,0x7f,0x00,0x7e,0xff,0x7e,0xff,0x7f,0x06,0x84, - 0x14,0x92,0xf0,0x77,0x10,0x77,0x04,0x80,0x04,0x8c, - 0x12,0x00,0xee,0xfa,0x12,0x00,0x04,0xfa,0x04,0x92, - 0x10,0x77,0xf0,0x77,0x14,0x80,0x03,0x90,0x00,0x01, - 0x01,0x02,0x01,0x01,0x02,0x01,0x04,0x00,0x02,0x7f, - 0x01,0x7f,0x01,0x7e,0x00,0x7e,0xff,0x7e,0xff,0x7f, - 0xfc,0x7e,0x00,0x7d,0x00,0xfb,0xff,0x7f,0x01,0x7f, - 0x01,0x01,0xff,0x01,0x09,0xfe,0x12,0x8d,0xff,0x02, - 0xfe,0x01,0xfd,0x00,0xfe,0x7f,0xff,0x7f,0xff,0x7d, - 0x00,0x7d,0x01,0x7e,0x02,0x7f,0x03,0x00,0x02,0x01, - 0x01,0x02,0xfb,0x88,0xfe,0x7e,0xff,0x7d,0x00,0x7d, - 0x01,0x7e,0x01,0x7f,0x07,0x8b,0xff,0x78,0x00,0x7e, - 0x02,0x7f,0x02,0x00,0x02,0x02,0x01,0x03,0x00,0x02, - 0xff,0x03,0xff,0x02,0xfe,0x02,0xfe,0x01,0xfd,0x01, - 0xfd,0x00,0xfd,0x7f,0xfe,0x7f,0xfe,0x7e,0xff,0x7e, - 0xff,0x7d,0x00,0x7d,0x01,0x7d,0x01,0x7e,0x02,0x7e, - 0x02,0x7f,0x03,0x7f,0x03,0x00,0x03,0x01,0x02,0x01, - 0x01,0x01,0xfe,0x8d,0xff,0x78,0x00,0x7e,0x01,0x7f, - 0x08,0xfb,0x09,0x95,0xf8,0x6b,0x08,0x95,0x08,0x6b, - 0xf3,0x87,0x0a,0x00,0x04,0xf9,0x04,0x95,0x00,0x6b, - 0x00,0x95,0x09,0x00,0x03,0x7f,0x01,0x7f,0x01,0x7e, - 0x00,0x7e,0xff,0x7e,0xff,0x7f,0xfd,0x7f,0xf7,0x80, - 0x09,0x00,0x03,0x7f,0x01,0x7f,0x01,0x7e,0x00,0x7d, - 0xff,0x7e,0xff,0x7f,0xfd,0x7f,0xf7,0x00,0x11,0x80, - 0x12,0x90,0xff,0x02,0xfe,0x02,0xfe,0x01,0xfc,0x00, - 0xfe,0x7f,0xfe,0x7e,0xff,0x7e,0xff,0x7d,0x00,0x7b, - 0x01,0x7d,0x01,0x7e,0x02,0x7e,0x02,0x7f,0x04,0x00, - 0x02,0x01,0x02,0x02,0x01,0x02,0x03,0xfb,0x04,0x95, - 0x00,0x6b,0x00,0x95,0x07,0x00,0x03,0x7f,0x02,0x7e, - 0x01,0x7e,0x01,0x7d,0x00,0x7b,0xff,0x7d,0xff,0x7e, - 0xfe,0x7e,0xfd,0x7f,0xf9,0x00,0x11,0x80,0x04,0x95, - 0x00,0x6b,0x00,0x95,0x0d,0x00,0xf3,0xf6,0x08,0x00, - 0xf8,0xf5,0x0d,0x00,0x02,0x80,0x04,0x95,0x00,0x6b, - 0x00,0x95,0x0d,0x00,0xf3,0xf6,0x08,0x00,0x06,0xf5, - 0x12,0x90,0xff,0x02,0xfe,0x02,0xfe,0x01,0xfc,0x00, - 0xfe,0x7f,0xfe,0x7e,0xff,0x7e,0xff,0x7d,0x00,0x7b, - 0x01,0x7d,0x01,0x7e,0x02,0x7e,0x02,0x7f,0x04,0x00, - 0x02,0x01,0x02,0x02,0x01,0x02,0x00,0x03,0xfb,0x80, - 0x05,0x00,0x03,0xf8,0x04,0x95,0x00,0x6b,0x0e,0x95, - 0x00,0x6b,0xf2,0x8b,0x0e,0x00,0x04,0xf5,0x04,0x95, - 0x00,0x6b,0x04,0x80,0x0c,0x95,0x00,0x70,0xff,0x7d, - 0xff,0x7f,0xfe,0x7f,0xfe,0x00,0xfe,0x01,0xff,0x01, - 0xff,0x03,0x00,0x02,0x0e,0xf9,0x04,0x95,0x00,0x6b, - 0x0e,0x95,0xf2,0x72,0x05,0x85,0x09,0x74,0x03,0x80, - 0x04,0x95,0x00,0x6b,0x00,0x80,0x0c,0x00,0x01,0x80, - 0x04,0x95,0x00,0x6b,0x00,0x95,0x08,0x6b,0x08,0x95, - 0xf8,0x6b,0x08,0x95,0x00,0x6b,0x04,0x80,0x04,0x95, - 0x00,0x6b,0x00,0x95,0x0e,0x6b,0x00,0x95,0x00,0x6b, - 0x04,0x80,0x09,0x95,0xfe,0x7f,0xfe,0x7e,0xff,0x7e, - 0xff,0x7d,0x00,0x7b,0x01,0x7d,0x01,0x7e,0x02,0x7e, - 0x02,0x7f,0x04,0x00,0x02,0x01,0x02,0x02,0x01,0x02, - 0x01,0x03,0x00,0x05,0xff,0x03,0xff,0x02,0xfe,0x02, - 0xfe,0x01,0xfc,0x00,0x0d,0xeb,0x04,0x95,0x00,0x6b, - 0x00,0x95,0x09,0x00,0x03,0x7f,0x01,0x7f,0x01,0x7e, - 0x00,0x7d,0xff,0x7e,0xff,0x7f,0xfd,0x7f,0xf7,0x00, - 0x11,0xf6,0x09,0x95,0xfe,0x7f,0xfe,0x7e,0xff,0x7e, - 0xff,0x7d,0x00,0x7b,0x01,0x7d,0x01,0x7e,0x02,0x7e, - 0x02,0x7f,0x04,0x00,0x02,0x01,0x02,0x02,0x01,0x02, - 0x01,0x03,0x00,0x05,0xff,0x03,0xff,0x02,0xfe,0x02, - 0xfe,0x01,0xfc,0x00,0x03,0xef,0x06,0x7a,0x04,0x82, - 0x04,0x95,0x00,0x6b,0x00,0x95,0x09,0x00,0x03,0x7f, - 0x01,0x7f,0x01,0x7e,0x00,0x7e,0xff,0x7e,0xff,0x7f, - 0xfd,0x7f,0xf7,0x00,0x07,0x80,0x07,0x75,0x03,0x80, - 0x11,0x92,0xfe,0x02,0xfd,0x01,0xfc,0x00,0xfd,0x7f, - 0xfe,0x7e,0x00,0x7e,0x01,0x7e,0x01,0x7f,0x02,0x7f, - 0x06,0x7e,0x02,0x7f,0x01,0x7f,0x01,0x7e,0x00,0x7d, - 0xfe,0x7e,0xfd,0x7f,0xfc,0x00,0xfd,0x01,0xfe,0x02, - 0x11,0xfd,0x08,0x95,0x00,0x6b,0xf9,0x95,0x0e,0x00, - 0x01,0xeb,0x04,0x95,0x00,0x71,0x01,0x7d,0x02,0x7e, - 0x03,0x7f,0x02,0x00,0x03,0x01,0x02,0x02,0x01,0x03, - 0x00,0x0f,0x04,0xeb,0x01,0x95,0x08,0x6b,0x08,0x95, - 0xf8,0x6b,0x09,0x80,0x02,0x95,0x05,0x6b,0x05,0x95, - 0xfb,0x6b,0x05,0x95,0x05,0x6b,0x05,0x95,0xfb,0x6b, - 0x07,0x80,0x03,0x95,0x0e,0x6b,0x00,0x95,0xf2,0x6b, - 0x11,0x80,0x01,0x95,0x08,0x76,0x00,0x75,0x08,0x95, - 0xf8,0x76,0x09,0xf5,0x11,0x95,0xf2,0x6b,0x00,0x95, - 0x0e,0x00,0xf2,0xeb,0x0e,0x00,0x03,0x80,0x03,0x93, - 0x00,0x6c,0x01,0x94,0x00,0x6c,0xff,0x94,0x05,0x00, - 0xfb,0xec,0x05,0x00,0x02,0x81,0x00,0x95,0x0e,0x68, - 0x00,0x83,0x06,0x93,0x00,0x6c,0x01,0x94,0x00,0x6c, - 0xfb,0x94,0x05,0x00,0xfb,0xec,0x05,0x00,0x03,0x81, - 0x03,0x87,0x08,0x05,0x08,0x7b,0xf0,0x80,0x08,0x04, - 0x08,0x7c,0x03,0xf9,0x01,0x80,0x10,0x00,0x01,0x80, - 0x06,0x95,0xff,0x7f,0xff,0x7e,0x00,0x7e,0x01,0x7f, - 0x01,0x01,0xff,0x01,0x05,0xef,0x0f,0x8e,0x00,0x72, - 0x00,0x8b,0xfe,0x02,0xfe,0x01,0xfd,0x00,0xfe,0x7f, - 0xfe,0x7e,0xff,0x7d,0x00,0x7e,0x01,0x7d,0x02,0x7e, - 0x02,0x7f,0x03,0x00,0x02,0x01,0x02,0x02,0x04,0xfd, - 0x04,0x95,0x00,0x6b,0x00,0x8b,0x02,0x02,0x02,0x01, - 0x03,0x00,0x02,0x7f,0x02,0x7e,0x01,0x7d,0x00,0x7e, - 0xff,0x7d,0xfe,0x7e,0xfe,0x7f,0xfd,0x00,0xfe,0x01, - 0xfe,0x02,0x0f,0xfd,0x0f,0x8b,0xfe,0x02,0xfe,0x01, - 0xfd,0x00,0xfe,0x7f,0xfe,0x7e,0xff,0x7d,0x00,0x7e, - 0x01,0x7d,0x02,0x7e,0x02,0x7f,0x03,0x00,0x02,0x01, - 0x02,0x02,0x03,0xfd,0x0f,0x95,0x00,0x6b,0x00,0x8b, - 0xfe,0x02,0xfe,0x01,0xfd,0x00,0xfe,0x7f,0xfe,0x7e, - 0xff,0x7d,0x00,0x7e,0x01,0x7d,0x02,0x7e,0x02,0x7f, - 0x03,0x00,0x02,0x01,0x02,0x02,0x04,0xfd,0x03,0x88, - 0x0c,0x00,0x00,0x02,0xff,0x02,0xff,0x01,0xfe,0x01, - 0xfd,0x00,0xfe,0x7f,0xfe,0x7e,0xff,0x7d,0x00,0x7e, - 0x01,0x7d,0x02,0x7e,0x02,0x7f,0x03,0x00,0x02,0x01, - 0x02,0x02,0x03,0xfd,0x0a,0x95,0xfe,0x00,0xfe,0x7f, - 0xff,0x7d,0x00,0x6f,0xfd,0x8e,0x07,0x00,0x03,0xf2, - 0x0f,0x8e,0x00,0x70,0xff,0x7d,0xff,0x7f,0xfe,0x7f, - 0xfd,0x00,0xfe,0x01,0x09,0x91,0xfe,0x02,0xfe,0x01, - 0xfd,0x00,0xfe,0x7f,0xfe,0x7e,0xff,0x7d,0x00,0x7e, - 0x01,0x7d,0x02,0x7e,0x02,0x7f,0x03,0x00,0x02,0x01, - 0x02,0x02,0x04,0xfd,0x04,0x95,0x00,0x6b,0x00,0x8a, - 0x03,0x03,0x02,0x01,0x03,0x00,0x02,0x7f,0x01,0x7d, - 0x00,0x76,0x04,0x80,0x03,0x95,0x01,0x7f,0x01,0x01, - 0xff,0x01,0xff,0x7f,0x01,0xf9,0x00,0x72,0x04,0x80, - 0x05,0x95,0x01,0x7f,0x01,0x01,0xff,0x01,0xff,0x7f, - 0x01,0xf9,0x00,0x6f,0xff,0x7d,0xfe,0x7f,0xfe,0x00, - 0x09,0x87,0x04,0x95,0x00,0x6b,0x0a,0x8e,0xf6,0x76, - 0x04,0x84,0x07,0x78,0x02,0x80,0x04,0x95,0x00,0x6b, - 0x04,0x80,0x04,0x8e,0x00,0x72,0x00,0x8a,0x03,0x03, - 0x02,0x01,0x03,0x00,0x02,0x7f,0x01,0x7d,0x00,0x76, - 0x00,0x8a,0x03,0x03,0x02,0x01,0x03,0x00,0x02,0x7f, - 0x01,0x7d,0x00,0x76,0x04,0x80,0x04,0x8e,0x00,0x72, - 0x00,0x8a,0x03,0x03,0x02,0x01,0x03,0x00,0x02,0x7f, - 0x01,0x7d,0x00,0x76,0x04,0x80,0x08,0x8e,0xfe,0x7f, - 0xfe,0x7e,0xff,0x7d,0x00,0x7e,0x01,0x7d,0x02,0x7e, - 0x02,0x7f,0x03,0x00,0x02,0x01,0x02,0x02,0x01,0x03, - 0x00,0x02,0xff,0x03,0xfe,0x02,0xfe,0x01,0xfd,0x00, - 0x0b,0xf2,0x04,0x8e,0x00,0x6b,0x00,0x92,0x02,0x02, - 0x02,0x01,0x03,0x00,0x02,0x7f,0x02,0x7e,0x01,0x7d, - 0x00,0x7e,0xff,0x7d,0xfe,0x7e,0xfe,0x7f,0xfd,0x00, - 0xfe,0x01,0xfe,0x02,0x0f,0xfd,0x0f,0x8e,0x00,0x6b, - 0x00,0x92,0xfe,0x02,0xfe,0x01,0xfd,0x00,0xfe,0x7f, - 0xfe,0x7e,0xff,0x7d,0x00,0x7e,0x01,0x7d,0x02,0x7e, - 0x02,0x7f,0x03,0x00,0x02,0x01,0x02,0x02,0x04,0xfd, - 0x04,0x8e,0x00,0x72,0x00,0x88,0x01,0x03,0x02,0x02, - 0x02,0x01,0x03,0x00,0x01,0xf2,0x0e,0x8b,0xff,0x02, - 0xfd,0x01,0xfd,0x00,0xfd,0x7f,0xff,0x7e,0x01,0x7e, - 0x02,0x7f,0x05,0x7f,0x02,0x7f,0x01,0x7e,0x00,0x7f, - 0xff,0x7e,0xfd,0x7f,0xfd,0x00,0xfd,0x01,0xff,0x02, - 0x0e,0xfd,0x05,0x95,0x00,0x6f,0x01,0x7d,0x02,0x7f, - 0x02,0x00,0xf8,0x8e,0x07,0x00,0x03,0xf2,0x04,0x8e, - 0x00,0x76,0x01,0x7d,0x02,0x7f,0x03,0x00,0x02,0x01, - 0x03,0x03,0x00,0x8a,0x00,0x72,0x04,0x80,0x02,0x8e, - 0x06,0x72,0x06,0x8e,0xfa,0x72,0x08,0x80,0x03,0x8e, - 0x04,0x72,0x04,0x8e,0xfc,0x72,0x04,0x8e,0x04,0x72, - 0x04,0x8e,0xfc,0x72,0x07,0x80,0x03,0x8e,0x0b,0x72, - 0x00,0x8e,0xf5,0x72,0x0e,0x80,0x02,0x8e,0x06,0x72, - 0x06,0x8e,0xfa,0x72,0xfe,0x7c,0xfe,0x7e,0xfe,0x7f, - 0xff,0x00,0x0f,0x87,0x0e,0x8e,0xf5,0x72,0x00,0x8e, - 0x0b,0x00,0xf5,0xf2,0x0b,0x00,0x03,0x80,0x09,0x99, - 0xfe,0x7f,0xff,0x7f,0xff,0x7e,0x00,0x7e,0x01,0x7e, - 0x01,0x7f,0x01,0x7e,0x00,0x7e,0xfe,0x7e,0x01,0x8e, - 0xff,0x7e,0x00,0x7e,0x01,0x7e,0x01,0x7f,0x01,0x7e, - 0x00,0x7e,0xff,0x7e,0xfc,0x7e,0x04,0x7e,0x01,0x7e, - 0x00,0x7e,0xff,0x7e,0xff,0x7f,0xff,0x7e,0x00,0x7e, - 0x01,0x7e,0xff,0x8e,0x02,0x7e,0x00,0x7e,0xff,0x7e, - 0xff,0x7f,0xff,0x7e,0x00,0x7e,0x01,0x7e,0x01,0x7f, - 0x02,0x7f,0x05,0x87,0x04,0x95,0x00,0x77,0x00,0xfd, - 0x00,0x77,0x04,0x80,0x05,0x99,0x02,0x7f,0x01,0x7f, - 0x01,0x7e,0x00,0x7e,0xff,0x7e,0xff,0x7f,0xff,0x7e, - 0x00,0x7e,0x02,0x7e,0xff,0x8e,0x01,0x7e,0x00,0x7e, - 0xff,0x7e,0xff,0x7f,0xff,0x7e,0x00,0x7e,0x01,0x7e, - 0x04,0x7e,0xfc,0x7e,0xff,0x7e,0x00,0x7e,0x01,0x7e, - 0x01,0x7f,0x01,0x7e,0x00,0x7e,0xff,0x7e,0x01,0x8e, - 0xfe,0x7e,0x00,0x7e,0x01,0x7e,0x01,0x7f,0x01,0x7e, - 0x00,0x7e,0xff,0x7e,0xff,0x7f,0xfe,0x7f,0x09,0x87, - 0x03,0x86,0x00,0x02,0x01,0x03,0x02,0x01,0x02,0x00, - 0x02,0x7f,0x04,0x7d,0x02,0x7f,0x02,0x00,0x02,0x01, - 0x01,0x02,0xee,0xfe,0x01,0x02,0x02,0x01,0x02,0x00, - 0x02,0x7f,0x04,0x7d,0x02,0x7f,0x02,0x00,0x02,0x01, - 0x01,0x03,0x00,0x02,0x03,0xf4,0x10,0x80,0x03,0x80, - 0x07,0x15,0x08,0x6b,0xfe,0x85,0xf5,0x00,0x10,0xfb, - 0x0d,0x95,0xf6,0x00,0x00,0x6b,0x0a,0x00,0x02,0x02, - 0x00,0x08,0xfe,0x02,0xf6,0x00,0x0e,0xf4,0x03,0x80, - 0x00,0x15,0x0a,0x00,0x02,0x7e,0x00,0x7e,0x00,0x7d, - 0x00,0x7e,0xfe,0x7f,0xf6,0x00,0x0a,0x80,0x02,0x7e, - 0x01,0x7e,0x00,0x7d,0xff,0x7d,0xfe,0x7f,0xf6,0x00, - 0x10,0x80,0x03,0x80,0x00,0x15,0x0c,0x00,0xff,0x7e, - 0x03,0xed,0x03,0xfd,0x00,0x03,0x02,0x00,0x00,0x12, - 0x02,0x03,0x0a,0x00,0x00,0x6b,0x02,0x00,0x00,0x7d, - 0xfe,0x83,0xf4,0x00,0x11,0x80,0x0f,0x80,0xf4,0x00, - 0x00,0x15,0x0c,0x00,0xff,0xf6,0xf5,0x00,0x0f,0xf5, - 0x04,0x95,0x07,0x76,0x00,0x0a,0x07,0x80,0xf9,0x76, - 0x00,0x75,0xf8,0x80,0x07,0x0c,0x09,0xf4,0xf9,0x0c, - 0x09,0xf4,0x03,0x92,0x02,0x03,0x07,0x00,0x03,0x7d, - 0x00,0x7b,0xfc,0x7e,0x04,0x7d,0x00,0x7a,0xfd,0x7e, - 0xf9,0x00,0xfe,0x02,0x06,0x89,0x02,0x00,0x06,0xf5, - 0x03,0x95,0x00,0x6b,0x0c,0x15,0x00,0x6b,0x02,0x80, - 0x03,0x95,0x00,0x6b,0x0c,0x15,0x00,0x6b,0xf8,0x96, - 0x03,0x00,0x07,0xea,0x03,0x80,0x00,0x15,0x0c,0x80, - 0xf7,0x76,0xfd,0x00,0x03,0x80,0x0a,0x75,0x03,0x80, - 0x03,0x80,0x07,0x13,0x02,0x02,0x03,0x00,0x00,0x6b, - 0x02,0x80,0x03,0x80,0x00,0x15,0x09,0x6b,0x09,0x15, - 0x00,0x6b,0x03,0x80,0x03,0x80,0x00,0x15,0x00,0xf6, - 0x0d,0x00,0x00,0x8a,0x00,0x6b,0x03,0x80,0x07,0x80, - 0xfd,0x00,0xff,0x03,0x00,0x04,0x00,0x07,0x00,0x04, - 0x01,0x02,0x03,0x01,0x06,0x00,0x03,0x7f,0x01,0x7e, - 0x01,0x7c,0x00,0x79,0xff,0x7c,0xff,0x7d,0xfd,0x00, - 0xfa,0x00,0x0e,0x80,0x03,0x80,0x00,0x15,0x0c,0x00, - 0x00,0x6b,0x02,0x80,0x03,0x80,0x00,0x15,0x0a,0x00, - 0x02,0x7f,0x01,0x7d,0x00,0x7b,0xff,0x7e,0xfe,0x7f, - 0xf6,0x00,0x10,0xf7,0x11,0x8f,0xff,0x03,0xff,0x02, - 0xfe,0x01,0xfa,0x00,0xfd,0x7f,0xff,0x7e,0x00,0x7c, - 0x00,0x79,0x00,0x7b,0x01,0x7e,0x03,0x00,0x06,0x00, - 0x02,0x00,0x01,0x03,0x01,0x02,0x03,0xfb,0x03,0x95, - 0x0c,0x00,0xfa,0x80,0x00,0x6b,0x09,0x80,0x03,0x95, - 0x00,0x77,0x06,0x7a,0x06,0x06,0x00,0x09,0xfa,0xf1, - 0xfa,0x7a,0x0e,0x80,0x03,0x87,0x00,0x0b,0x02,0x02, - 0x03,0x00,0x02,0x7e,0x01,0x02,0x04,0x00,0x02,0x7e, - 0x00,0x75,0xfe,0x7e,0xfc,0x00,0xff,0x01,0xfe,0x7f, - 0xfd,0x00,0xfe,0x02,0x07,0x8e,0x00,0x6b,0x09,0x80, - 0x03,0x80,0x0e,0x15,0xf2,0x80,0x0e,0x6b,0x03,0x80, - 0x03,0x95,0x00,0x6b,0x0e,0x00,0x00,0x7d,0xfe,0x98, - 0x00,0x6b,0x05,0x80,0x03,0x95,0x00,0x75,0x02,0x7d, - 0x0a,0x00,0x00,0x8e,0x00,0x6b,0x02,0x80,0x03,0x95, - 0x00,0x6b,0x10,0x00,0x00,0x15,0xf8,0x80,0x00,0x6b, - 0x0a,0x80,0x03,0x95,0x00,0x6b,0x10,0x00,0x00,0x15, - 0xf8,0x80,0x00,0x6b,0x0a,0x00,0x00,0x7d,0x02,0x83, - 0x10,0x80,0x03,0x95,0x00,0x6b,0x09,0x00,0x03,0x02, - 0x00,0x08,0xfd,0x02,0xf7,0x00,0x0e,0x89,0x00,0x6b, - 0x03,0x80,0x03,0x95,0x00,0x6b,0x09,0x00,0x03,0x02, - 0x00,0x08,0xfd,0x02,0xf7,0x00,0x0e,0xf4,0x03,0x92, - 0x02,0x03,0x07,0x00,0x03,0x7d,0x00,0x70,0xfd,0x7e, - 0xf9,0x00,0xfe,0x02,0x03,0x89,0x09,0x00,0x02,0xf5, - 0x03,0x80,0x00,0x15,0x00,0xf5,0x07,0x00,0x00,0x08, - 0x02,0x03,0x06,0x00,0x02,0x7d,0x00,0x70,0xfe,0x7e, - 0xfa,0x00,0xfe,0x02,0x00,0x08,0x0c,0xf6,0x0f,0x80, - 0x00,0x15,0xf6,0x00,0xfe,0x7d,0x00,0x79,0x02,0x7e, - 0x0a,0x00,0xf4,0xf7,0x07,0x09,0x07,0xf7,0x03,0x8c, - 0x01,0x02,0x01,0x01,0x05,0x00,0x02,0x7f,0x01,0x7e, - 0x00,0x74,0x00,0x86,0xff,0x01,0xfe,0x01,0xfb,0x00, - 0xff,0x7f,0xff,0x7f,0x00,0x7c,0x01,0x7e,0x01,0x00, - 0x05,0x00,0x02,0x00,0x01,0x02,0x03,0xfe,0x04,0x8e, - 0x02,0x01,0x04,0x00,0x02,0x7f,0x01,0x7e,0x00,0x77, - 0xff,0x7e,0xfe,0x7f,0xfc,0x00,0xfe,0x01,0xff,0x02, - 0x00,0x09,0x01,0x02,0x02,0x02,0x03,0x01,0x02,0x01, - 0x01,0x01,0x01,0x02,0x02,0xeb,0x03,0x80,0x00,0x15, - 0x03,0x00,0x02,0x7e,0x00,0x7b,0xfe,0x7e,0xfd,0x00, - 0x03,0x80,0x04,0x00,0x03,0x7e,0x00,0x78,0xfd,0x7e, - 0xf9,0x00,0x0c,0x80,0x03,0x8c,0x02,0x02,0x02,0x01, - 0x03,0x00,0x02,0x7f,0x01,0x7d,0xfe,0x7e,0xf9,0x7d, - 0xff,0x7e,0x00,0x7d,0x03,0x7f,0x02,0x00,0x03,0x01, - 0x02,0x01,0x02,0xfe,0x0d,0x8c,0xff,0x02,0xfe,0x01, - 0xfc,0x00,0xfe,0x7f,0xff,0x7e,0x00,0x77,0x01,0x7e, - 0x02,0x7f,0x04,0x00,0x02,0x01,0x01,0x02,0x00,0x0f, - 0xff,0x02,0xfe,0x01,0xf9,0x00,0x0c,0xeb,0x03,0x88, - 0x0a,0x00,0x00,0x02,0x00,0x03,0xfe,0x02,0xfa,0x00, - 0xff,0x7e,0xff,0x7d,0x00,0x7b,0x01,0x7c,0x01,0x7f, - 0x06,0x00,0x02,0x02,0x03,0xfe,0x03,0x8f,0x06,0x77, - 0x06,0x09,0xfa,0x80,0x00,0x71,0xff,0x87,0xfb,0x79, - 0x07,0x87,0x05,0x79,0x02,0x80,0x03,0x8d,0x02,0x02, - 0x06,0x00,0x02,0x7e,0x00,0x7d,0xfc,0x7d,0x04,0x7e, - 0x00,0x7d,0xfe,0x7e,0xfa,0x00,0xfe,0x02,0x04,0x85, - 0x02,0x00,0x06,0xf9,0x03,0x8f,0x00,0x73,0x01,0x7e, - 0x07,0x00,0x02,0x02,0x00,0x0d,0x00,0xf3,0x01,0x7e, - 0x03,0x80,0x03,0x8f,0x00,0x73,0x01,0x7e,0x07,0x00, - 0x02,0x02,0x00,0x0d,0x00,0xf3,0x01,0x7e,0xf8,0x90, - 0x03,0x00,0x08,0xf0,0x03,0x80,0x00,0x15,0x00,0xf3, - 0x02,0x00,0x06,0x07,0xfa,0xf9,0x07,0x78,0x03,0x80, - 0x03,0x80,0x04,0x0c,0x02,0x03,0x04,0x00,0x00,0x71, - 0x02,0x80,0x03,0x80,0x00,0x0f,0x06,0x77,0x06,0x09, - 0x00,0x71,0x02,0x80,0x03,0x80,0x00,0x0f,0x0a,0xf1, - 0x00,0x0f,0xf6,0xf8,0x0a,0x00,0x02,0xf9,0x05,0x80, - 0xff,0x01,0xff,0x04,0x00,0x05,0x01,0x03,0x01,0x02, - 0x06,0x00,0x02,0x7e,0x00,0x7d,0x00,0x7b,0x00,0x7c, - 0xfe,0x7f,0xfa,0x00,0x0b,0x80,0x03,0x80,0x00,0x0f, - 0x00,0xfb,0x01,0x03,0x01,0x02,0x05,0x00,0x02,0x7e, - 0x01,0x7d,0x00,0x76,0x03,0x80,0x10,0x80,0x10,0x80, - 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, - 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, - 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, - 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, - 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, - 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, - 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, - 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, - 0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80, - 0x10,0x80,0x0a,0x8f,0x02,0x7f,0x01,0x7e,0x00,0x76, - 0xff,0x7f,0xfe,0x7f,0xfb,0x00,0xff,0x01,0xff,0x01, - 0x00,0x0a,0x01,0x02,0x01,0x01,0x05,0x00,0xf9,0x80, - 0x00,0x6b,0x0c,0x86,0x0d,0x8a,0xff,0x03,0xfe,0x02, - 0xfb,0x00,0xff,0x7e,0xff,0x7d,0x00,0x7b,0x01,0x7c, - 0x01,0x7f,0x05,0x00,0x02,0x01,0x01,0x03,0x03,0xfc, - 0x03,0x80,0x00,0x0f,0x00,0xfb,0x01,0x03,0x01,0x02, - 0x04,0x00,0x01,0x7e,0x01,0x7d,0x00,0x76,0x00,0x8a, - 0x01,0x03,0x02,0x02,0x03,0x00,0x02,0x7e,0x01,0x7d, - 0x00,0x76,0x03,0x80,0x03,0x8f,0x00,0x74,0x01,0x7e, - 0x02,0x7f,0x04,0x00,0x02,0x01,0x01,0x01,0x00,0x8d, - 0x00,0x6e,0xff,0x7e,0xfe,0x7f,0xfb,0x00,0xfe,0x01, - 0x0c,0x85,0x03,0x8d,0x01,0x02,0x03,0x00,0x02,0x7e, - 0x01,0x02,0x03,0x00,0x02,0x7e,0x00,0x74,0xfe,0x7f, - 0xfd,0x00,0xff,0x01,0xfe,0x7f,0xfd,0x00,0xff,0x01, - 0x00,0x0c,0x06,0x82,0x00,0x6b,0x08,0x86,0x03,0x80, - 0x0a,0x0f,0xf6,0x80,0x0a,0x71,0x03,0x80,0x03,0x8f, - 0x00,0x73,0x01,0x7e,0x07,0x00,0x02,0x02,0x00,0x0d, - 0x00,0xf3,0x01,0x7e,0x00,0x7e,0x03,0x82,0x03,0x8f, - 0x00,0x79,0x02,0x7e,0x08,0x00,0x00,0x89,0x00,0x71, - 0x02,0x80,0x03,0x8f,0x00,0x73,0x01,0x7e,0x03,0x00, - 0x02,0x02,0x00,0x0d,0x00,0xf3,0x01,0x7e,0x03,0x00, - 0x02,0x02,0x00,0x0d,0x00,0xf3,0x01,0x7e,0x03,0x80, - 0x03,0x8f,0x00,0x73,0x01,0x7e,0x03,0x00,0x02,0x02, - 0x00,0x0d,0x00,0xf3,0x01,0x7e,0x03,0x00,0x02,0x02, - 0x00,0x0d,0x00,0xf3,0x01,0x7e,0x00,0x7e,0x03,0x82, - 0x03,0x8d,0x00,0x02,0x02,0x00,0x00,0x71,0x08,0x00, - 0x02,0x02,0x00,0x06,0xfe,0x02,0xf8,0x00,0x0c,0xf6, - 0x03,0x8f,0x00,0x71,0x07,0x00,0x02,0x02,0x00,0x06, - 0xfe,0x02,0xf9,0x00,0x0c,0x85,0x00,0x71,0x02,0x80, - 0x03,0x8f,0x00,0x71,0x07,0x00,0x03,0x02,0x00,0x06, - 0xfd,0x02,0xf9,0x00,0x0c,0xf6,0x03,0x8d,0x02,0x02, - 0x06,0x00,0x02,0x7e,0x00,0x75,0xfe,0x7e,0xfa,0x00, - 0xfe,0x02,0x04,0x85,0x06,0x00,0x02,0xf9,0x03,0x80, - 0x00,0x0f,0x00,0xf8,0x04,0x00,0x00,0x06,0x02,0x02, - 0x04,0x00,0x02,0x7e,0x00,0x75,0xfe,0x7e,0xfc,0x00, - 0xfe,0x02,0x00,0x05,0x0a,0xf9,0x0d,0x80,0x00,0x0f, - 0xf7,0x00,0xff,0x7e,0x00,0x7b,0x01,0x7e,0x09,0x00, - 0xf6,0xfa,0x04,0x06,0x08,0xfa - }; - - //------------------------------------------------------------------------- - gsv_text::gsv_text() : - m_x(0.0), - m_y(0.0), - m_start_x(0.0), - m_width(10.0), - m_height(0.0), - m_space(0.0), - m_line_space(0.0), - m_text(m_chr), - m_text_buf(), - m_cur_chr(m_chr), - m_font(gsv_default_font), - m_loaded_font(), - m_status(initial), - m_big_endian(false), - m_flip(false) - { - m_chr[0] = m_chr[1] = 0; - - int t = 1; - if(*(char*)&t == 0) m_big_endian = true; - } - - //------------------------------------------------------------------------- - void gsv_text::font(const void* font) - { - m_font = font; - if(m_font == 0) m_font = &m_loaded_font[0]; - } - - //------------------------------------------------------------------------- - void gsv_text::size(double height, double width) - { - m_height = height; - m_width = width; - } - - //------------------------------------------------------------------------- - void gsv_text::space(double space) - { - m_space = space; - } - - //------------------------------------------------------------------------- - void gsv_text::line_space(double line_space) - { - m_line_space = line_space; - } - - //------------------------------------------------------------------------- - void gsv_text::start_point(double x, double y) - { - m_x = m_start_x = x; - m_y = y; - //if(m_flip) m_y += m_height; - } - - //------------------------------------------------------------------------- - void gsv_text::load_font(const char* file) - { - m_loaded_font.resize(0); - FILE* fd = fopen(file, "rb"); - if(fd) - { - unsigned len; - - fseek(fd, 0l, SEEK_END); - len = ftell(fd); - fseek(fd, 0l, SEEK_SET); - if(len > 0) - { - m_loaded_font.resize(len); - fread(&m_loaded_font[0], 1, len, fd); - m_font = &m_loaded_font[0]; - } - fclose(fd); - } - } - - //------------------------------------------------------------------------- - void gsv_text::text(const char* text) - { - if(text == 0) - { - m_chr[0] = 0; - m_text = m_chr; - return; - } - unsigned new_size = strlen(text) + 1; - if(new_size > m_text_buf.size()) - { - m_text_buf.resize(new_size); - } - memcpy(&m_text_buf[0], text, new_size); - m_text = &m_text_buf[0]; - } - - //------------------------------------------------------------------------- - void gsv_text::rewind(unsigned) - { - m_status = initial; - if(m_font == 0) return; - - m_indices = (int8u*)m_font; - double base_height = value(m_indices + 4); - m_indices += value(m_indices); - m_glyphs = (int8*)(m_indices + 257*2); - m_h = m_height / base_height; - m_w = (m_width == 0.0) ? m_h : m_width / base_height; - if(m_flip) m_h = -m_h; - m_cur_chr = m_text; - } - - //------------------------------------------------------------------------- - unsigned gsv_text::vertex(double* x, double* y) - { - unsigned idx; - int8 yc, yf; - int dx, dy; - bool quit = false; - - while(!quit) - { - switch(m_status) - { - case initial: - if(m_font == 0) - { - quit = true; - break; - } - m_status = next_char; - - case next_char: - if(*m_cur_chr == 0) - { - quit = true; - break; - } - idx = (*m_cur_chr++) & 0xFF; - if(idx == '\n') - { - m_x = m_start_x; - m_y -= m_flip ? -m_height - m_line_space : m_height + m_line_space; - break; - } - idx <<= 1; - m_bglyph = m_glyphs + value(m_indices + idx); - m_eglyph = m_glyphs + value(m_indices + idx + 2); - m_status = start_glyph; - - case start_glyph: - *x = m_x; - *y = m_y; - m_status = glyph; - return path_cmd_move_to; - - case glyph: - if(m_bglyph >= m_eglyph) - { - m_status = next_char; - m_x += m_space; - break; - } - dx = int(*m_bglyph++); - yf = (yc = *m_bglyph++) & 0x80; - yc <<= 1; - yc >>= 1; - dy = int(yc); - m_x += double(dx) * m_w; - m_y += double(dy) * m_h; - *x = m_x; - *y = m_y; - return yf ? path_cmd_move_to : path_cmd_line_to; - } - - } - return path_cmd_stop; - } - - //------------------------------------------------------------------------- - double gsv_text::text_width() - { - double x1, y1, x2, y2; - bounding_rect_single(*this, 0, &x1, &y1, &x2, &y2); - return x2 - x1; - } - - -} diff --git a/uppdev/aggdraw/agg_gsv_text.h b/uppdev/aggdraw/agg_gsv_text.h deleted file mode 100644 index adcefb430..000000000 --- a/uppdev/aggdraw/agg_gsv_text.h +++ /dev/null @@ -1,158 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_GSV_TEXT_INCLUDED -#define AGG_GSV_TEXT_INCLUDED - -#include "agg_array.h" -#include "agg_conv_stroke.h" -#include "agg_conv_transform.h" - -namespace agg -{ - - - //---------------------------------------------------------------gsv_text - // - // See Implementation agg_gsv_text.cpp - // - class gsv_text - { - enum status - { - initial, - next_char, - start_glyph, - glyph - }; - - public: - gsv_text(); - - void font(const void* font); - void flip(bool flip_y) { m_flip = flip_y; } - void load_font(const char* file); - void size(double height, double width=0.0); - void space(double space); - void line_space(double line_space); - void start_point(double x, double y); - void text(const char* text); - - double text_width(); - - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - // not supposed to be copied - gsv_text(const gsv_text&); - const gsv_text& operator = (const gsv_text&); - - int16u value(const int8u* p) const - { - int16u v; - if(m_big_endian) - { - *(int8u*)&v = p[1]; - *((int8u*)&v + 1) = p[0]; - } - else - { - *(int8u*)&v = p[0]; - *((int8u*)&v + 1) = p[1]; - } - return v; - } - - private: - double m_x; - double m_y; - double m_start_x; - double m_width; - double m_height; - double m_space; - double m_line_space; - char m_chr[2]; - char* m_text; - pod_array m_text_buf; - char* m_cur_chr; - const void* m_font; - pod_array m_loaded_font; - status m_status; - bool m_big_endian; - bool m_flip; - int8u* m_indices; - int8* m_glyphs; - int8* m_bglyph; - int8* m_eglyph; - double m_w; - double m_h; - }; - - - - - //--------------------------------------------------------gsv_text_outline - template class gsv_text_outline - { - public: - gsv_text_outline(gsv_text& text, const Transformer& trans) : - m_polyline(text), - m_trans(m_polyline, trans) - { - } - - void width(double w) - { - m_polyline.width(w); - } - - void transformer(const Transformer* trans) - { - m_trans->transformer(trans); - } - - void rewind(unsigned path_id) - { - m_trans.rewind(path_id); - m_polyline.line_join(round_join); - m_polyline.line_cap(round_cap); - } - - unsigned vertex(double* x, double* y) - { - return m_trans.vertex(x, y); - } - - private: - conv_stroke m_polyline; - conv_transform, Transformer> m_trans; - }; - - - -} - - -#endif diff --git a/uppdev/aggdraw/agg_image_accessors.h b/uppdev/aggdraw/agg_image_accessors.h deleted file mode 100644 index b4d72a28a..000000000 --- a/uppdev/aggdraw/agg_image_accessors.h +++ /dev/null @@ -1,490 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_IMAGE_ACCESSORS_INCLUDED -#define AGG_IMAGE_ACCESSORS_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - - //-----------------------------------------------------image_accessor_clip - template class image_accessor_clip - { - public: - typedef PixFmt pixfmt_type; - typedef typename pixfmt_type::color_type color_type; - typedef typename pixfmt_type::order_type order_type; - typedef typename pixfmt_type::value_type value_type; - enum pix_width_e { pix_width = pixfmt_type::pix_width }; - - image_accessor_clip() {} - explicit image_accessor_clip(const pixfmt_type& pixf, - const color_type& bk) : - m_pixf(&pixf) - { - pixfmt_type::make_pix(m_bk_buf, bk); - } - - void attach(const pixfmt_type& pixf) - { - m_pixf = &pixf; - } - - void background_color(const color_type& bk) - { - pixfmt_type::make_pix(m_bk_buf, bk); - } - - private: - AGG_INLINE const int8u* pixel() const - { - if(m_y >= 0 && m_y < (int)m_pixf->height() && - m_x >= 0 && m_x < (int)m_pixf->width()) - { - return m_pixf->pix_ptr(m_x, m_y); - } - return m_bk_buf; - } - - public: - AGG_INLINE const int8u* span(int x, int y, unsigned len) - { - m_x = m_x0 = x; - m_y = y; - if(y >= 0 && y < (int)m_pixf->height() && - x >= 0 && x+(int)len <= (int)m_pixf->width()) - { - return m_pix_ptr = m_pixf->pix_ptr(x, y); - } - m_pix_ptr = 0; - return pixel(); - } - - AGG_INLINE const int8u* next_x() - { - if(m_pix_ptr) return m_pix_ptr += pix_width; - ++m_x; - return pixel(); - } - - AGG_INLINE const int8u* next_y() - { - ++m_y; - m_x = m_x0; - if(m_pix_ptr && - m_y >= 0 && m_y < (int)m_pixf->height()) - { - return m_pix_ptr = m_pixf->pix_ptr(m_x, m_y); - } - m_pix_ptr = 0; - return pixel(); - } - - private: - const pixfmt_type* m_pixf; - int8u m_bk_buf[4]; - int m_x, m_x0, m_y; - const int8u* m_pix_ptr; - }; - - - - - //--------------------------------------------------image_accessor_no_clip - template class image_accessor_no_clip - { - public: - typedef PixFmt pixfmt_type; - typedef typename pixfmt_type::color_type color_type; - typedef typename pixfmt_type::order_type order_type; - typedef typename pixfmt_type::value_type value_type; - enum pix_width_e { pix_width = pixfmt_type::pix_width }; - - image_accessor_no_clip() {} - explicit image_accessor_no_clip(const pixfmt_type& pixf) : - m_pixf(&pixf) - {} - - void attach(const pixfmt_type& pixf) - { - m_pixf = &pixf; - } - - AGG_INLINE const int8u* span(int x, int y, unsigned) - { - m_x = x; - m_y = y; - return m_pix_ptr = m_pixf->pix_ptr(x, y); - } - - AGG_INLINE const int8u* next_x() - { - return m_pix_ptr += pix_width; - } - - AGG_INLINE const int8u* next_y() - { - ++m_y; - return m_pix_ptr = m_pixf->pix_ptr(m_x, m_y); - } - - private: - const pixfmt_type* m_pixf; - int m_x, m_y; - const int8u* m_pix_ptr; - }; - - - - - //----------------------------------------------------image_accessor_clone - template class image_accessor_clone - { - public: - typedef PixFmt pixfmt_type; - typedef typename pixfmt_type::color_type color_type; - typedef typename pixfmt_type::order_type order_type; - typedef typename pixfmt_type::value_type value_type; - enum pix_width_e { pix_width = pixfmt_type::pix_width }; - - image_accessor_clone() {} - explicit image_accessor_clone(const pixfmt_type& pixf) : - m_pixf(&pixf) - {} - - void attach(const pixfmt_type& pixf) - { - m_pixf = &pixf; - } - - private: - AGG_INLINE const int8u* pixel() const - { - register int x = m_x; - register int y = m_y; - if(x < 0) x = 0; - if(y < 0) y = 0; - if(x >= (int)m_pixf->width()) x = m_pixf->width() - 1; - if(y >= (int)m_pixf->height()) y = m_pixf->height() - 1; - return m_pixf->pix_ptr(x, y); - } - - public: - AGG_INLINE const int8u* span(int x, int y, unsigned len) - { - m_x = m_x0 = x; - m_y = y; - if(y >= 0 && y < (int)m_pixf->height() && - x >= 0 && x+len <= (int)m_pixf->width()) - { - return m_pix_ptr = m_pixf->pix_ptr(x, y); - } - m_pix_ptr = 0; - return pixel(); - } - - AGG_INLINE const int8u* next_x() - { - if(m_pix_ptr) return m_pix_ptr += pix_width; - ++m_x; - return pixel(); - } - - AGG_INLINE const int8u* next_y() - { - ++m_y; - m_x = m_x0; - if(m_pix_ptr && - m_y >= 0 && m_y < (int)m_pixf->height()) - { - return m_pix_ptr = m_pixf->pix_ptr(m_x, m_y); - } - m_pix_ptr = 0; - return pixel(); - } - - private: - const pixfmt_type* m_pixf; - int m_x, m_x0, m_y; - const int8u* m_pix_ptr; - }; - - - - - - //-----------------------------------------------------image_accessor_wrap - template class image_accessor_wrap - { - public: - typedef PixFmt pixfmt_type; - typedef typename pixfmt_type::color_type color_type; - typedef typename pixfmt_type::order_type order_type; - typedef typename pixfmt_type::value_type value_type; - enum pix_width_e { pix_width = pixfmt_type::pix_width }; - - image_accessor_wrap() {} - explicit image_accessor_wrap(const pixfmt_type& pixf) : - m_pixf(&pixf), - m_wrap_x(pixf.width()), - m_wrap_y(pixf.height()) - {} - - void attach(const pixfmt_type& pixf) - { - m_pixf = &pixf; - } - - AGG_INLINE const int8u* span(int x, int y, unsigned) - { - m_x = x; - m_row_ptr = m_pixf->row_ptr(m_wrap_y(y)); - return m_row_ptr + m_wrap_x(x) * pix_width; - } - - AGG_INLINE const int8u* next_x() - { - int x = ++m_wrap_x; - return m_row_ptr + x * pix_width; - } - - AGG_INLINE const int8u* next_y() - { - m_row_ptr = m_pixf->row_ptr(++m_wrap_y); - return m_row_ptr + m_wrap_x(m_x) * pix_width; - } - - private: - const pixfmt_type* m_pixf; - const int8u* m_row_ptr; - int m_x; - WrapX m_wrap_x; - WrapY m_wrap_y; - }; - - - - - //--------------------------------------------------------wrap_mode_repeat - class wrap_mode_repeat - { - public: - wrap_mode_repeat() {} - wrap_mode_repeat(unsigned size) : - m_size(size), - m_add(size * (0x3FFFFFFF / size)), - m_value(0) - {} - - AGG_INLINE unsigned operator() (int v) - { - return m_value = (unsigned(v) + m_add) % m_size; - } - - AGG_INLINE unsigned operator++ () - { - ++m_value; - if(m_value >= m_size) m_value = 0; - return m_value; - } - private: - unsigned m_size; - unsigned m_add; - unsigned m_value; - }; - - - //---------------------------------------------------wrap_mode_repeat_pow2 - class wrap_mode_repeat_pow2 - { - public: - wrap_mode_repeat_pow2() {} - wrap_mode_repeat_pow2(unsigned size) : m_value(0) - { - m_mask = 1; - while(m_mask < size) m_mask = (m_mask << 1) | 1; - m_mask >>= 1; - } - AGG_INLINE unsigned operator() (int v) - { - return m_value = unsigned(v) & m_mask; - } - AGG_INLINE unsigned operator++ () - { - ++m_value; - if(m_value > m_mask) m_value = 0; - return m_value; - } - private: - unsigned m_mask; - unsigned m_value; - }; - - - //----------------------------------------------wrap_mode_repeat_auto_pow2 - class wrap_mode_repeat_auto_pow2 - { - public: - wrap_mode_repeat_auto_pow2() {} - wrap_mode_repeat_auto_pow2(unsigned size) : - m_size(size), - m_add(size * (0x3FFFFFFF / size)), - m_mask((m_size & (m_size-1)) ? 0 : m_size-1), - m_value(0) - {} - - AGG_INLINE unsigned operator() (int v) - { - if(m_mask) return m_value = unsigned(v) & m_mask; - return m_value = (unsigned(v) + m_add) % m_size; - } - AGG_INLINE unsigned operator++ () - { - ++m_value; - if(m_value >= m_size) m_value = 0; - return m_value; - } - - private: - unsigned m_size; - unsigned m_add; - unsigned m_mask; - unsigned m_value; - }; - - - //-------------------------------------------------------wrap_mode_reflect - class wrap_mode_reflect - { - public: - wrap_mode_reflect() {} - wrap_mode_reflect(unsigned size) : - m_size(size), - m_size2(size * 2), - m_add(m_size2 * (0x3FFFFFFF / m_size2)), - m_value(0) - {} - - AGG_INLINE unsigned operator() (int v) - { - m_value = (unsigned(v) + m_add) % m_size2; - if(m_value >= m_size) return m_size2 - m_value - 1; - return m_value; - } - - AGG_INLINE unsigned operator++ () - { - ++m_value; - if(m_value >= m_size2) m_value = 0; - if(m_value >= m_size) return m_size2 - m_value - 1; - return m_value; - } - private: - unsigned m_size; - unsigned m_size2; - unsigned m_add; - unsigned m_value; - }; - - - - //--------------------------------------------------wrap_mode_reflect_pow2 - class wrap_mode_reflect_pow2 - { - public: - wrap_mode_reflect_pow2() {} - wrap_mode_reflect_pow2(unsigned size) : m_value(0) - { - m_mask = 1; - m_size = 1; - while(m_mask < size) - { - m_mask = (m_mask << 1) | 1; - m_size <<= 1; - } - } - AGG_INLINE unsigned operator() (int v) - { - m_value = unsigned(v) & m_mask; - if(m_value >= m_size) return m_mask - m_value; - return m_value; - } - AGG_INLINE unsigned operator++ () - { - ++m_value; - m_value &= m_mask; - if(m_value >= m_size) return m_mask - m_value; - return m_value; - } - private: - unsigned m_size; - unsigned m_mask; - unsigned m_value; - }; - - - - //---------------------------------------------wrap_mode_reflect_auto_pow2 - class wrap_mode_reflect_auto_pow2 - { - public: - wrap_mode_reflect_auto_pow2() {} - wrap_mode_reflect_auto_pow2(unsigned size) : - m_size(size), - m_size2(size * 2), - m_add(m_size2 * (0x3FFFFFFF / m_size2)), - m_mask((m_size2 & (m_size2-1)) ? 0 : m_size2-1), - m_value(0) - {} - - AGG_INLINE unsigned operator() (int v) - { - m_value = m_mask ? unsigned(v) & m_mask : - (unsigned(v) + m_add) % m_size2; - if(m_value >= m_size) return m_size2 - m_value - 1; - return m_value; - } - AGG_INLINE unsigned operator++ () - { - ++m_value; - if(m_value >= m_size2) m_value = 0; - if(m_value >= m_size) return m_size2 - m_value - 1; - return m_value; - } - - private: - unsigned m_size; - unsigned m_size2; - unsigned m_add; - unsigned m_mask; - unsigned m_value; - }; - - -} - - -#endif diff --git a/uppdev/aggdraw/agg_image_filters.cpp b/uppdev/aggdraw/agg_image_filters.cpp deleted file mode 100644 index fb508f61d..000000000 --- a/uppdev/aggdraw/agg_image_filters.cpp +++ /dev/null @@ -1,107 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#include "agg_image_filters.h" - - -namespace agg -{ - //-------------------------------------------------------------------- - void image_filter_lut::realloc_lut(double radius) - { - m_radius = radius; - m_diameter = uceil(radius) * 2; - m_start = -int(m_diameter / 2 - 1); - unsigned size = m_diameter << image_subpixel_shift; - if(size > m_weight_array.size()) - { - m_weight_array.resize(size); - } - } - - - - //-------------------------------------------------------------------- - // This function normalizes integer values and corrects the rounding - // errors. It doesn't do anything with the source floating point values - // (m_weight_array_dbl), it corrects only integers according to the rule - // of 1.0 which means that any sum of pixel weights must be equal to 1.0. - // So, the filter function must produce a graph of the proper shape. - //-------------------------------------------------------------------- - void image_filter_lut::normalize() - { - unsigned i; - int flip = 1; - - for(i = 0; i < image_subpixel_scale; i++) - { - for(;;) - { - int sum = 0; - unsigned j; - for(j = 0; j < m_diameter; j++) - { - sum += m_weight_array[j * image_subpixel_scale + i]; - } - - if(sum == image_filter_scale) break; - - double k = double(image_filter_scale) / double(sum); - sum = 0; - for(j = 0; j < m_diameter; j++) - { - sum += m_weight_array[j * image_subpixel_scale + i] = - iround(m_weight_array[j * image_subpixel_scale + i] * k); - } - - sum -= image_filter_scale; - int inc = (sum > 0) ? -1 : 1; - - for(j = 0; j < m_diameter && sum; j++) - { - flip ^= 1; - unsigned idx = flip ? m_diameter/2 + j/2 : m_diameter/2 - j/2; - int v = m_weight_array[idx * image_subpixel_scale + i]; - if(v < image_filter_scale) - { - m_weight_array[idx * image_subpixel_scale + i] += inc; - sum += inc; - } - } - } - } - - unsigned pivot = m_diameter << (image_subpixel_shift - 1); - - for(i = 0; i < pivot; i++) - { - m_weight_array[pivot + i] = m_weight_array[pivot - i]; - } - unsigned end = (diameter() << image_subpixel_shift) - 1; - m_weight_array[0] = m_weight_array[end]; - } - - -} - diff --git a/uppdev/aggdraw/agg_image_filters.h b/uppdev/aggdraw/agg_image_filters.h deleted file mode 100644 index e66f8a782..000000000 --- a/uppdev/aggdraw/agg_image_filters.h +++ /dev/null @@ -1,453 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_IMAGE_FILTERS_INCLUDED -#define AGG_IMAGE_FILTERS_INCLUDED - -#include "agg_array.h" -#include "agg_math.h" - -namespace agg -{ - - // See Implementation agg_image_filters.cpp - - enum image_filter_scale_e - { - image_filter_shift = 14, //----image_filter_shift - image_filter_scale = 1 << image_filter_shift, //----image_filter_scale - image_filter_mask = image_filter_scale - 1 //----image_filter_mask - }; - - enum image_subpixel_scale_e - { - image_subpixel_shift = 8, //----image_subpixel_shift - image_subpixel_scale = 1 << image_subpixel_shift, //----image_subpixel_scale - image_subpixel_mask = image_subpixel_scale - 1 //----image_subpixel_mask - }; - - - //-----------------------------------------------------image_filter_lut - class image_filter_lut - { - public: - template void calculate(const FilterF& filter, - bool normalization=true) - { - double r = filter.radius(); - realloc_lut(r); - unsigned i; - unsigned pivot = diameter() << (image_subpixel_shift - 1); - for(i = 0; i < pivot; i++) - { - double x = double(i) / double(image_subpixel_scale); - double y = filter.calc_weight(x); - m_weight_array[pivot + i] = - m_weight_array[pivot - i] = (int16)iround(y * image_filter_scale); - } - unsigned end = (diameter() << image_subpixel_shift) - 1; - m_weight_array[0] = m_weight_array[end]; - if(normalization) - { - normalize(); - } - } - - image_filter_lut() : m_radius(0), m_diameter(0), m_start(0) {} - - template image_filter_lut(const FilterF& filter, - bool normalization=true) - { - calculate(filter, normalization); - } - - double radius() const { return m_radius; } - unsigned diameter() const { return m_diameter; } - int start() const { return m_start; } - const int16* weight_array() const { return &m_weight_array[0]; } - void normalize(); - - private: - void realloc_lut(double radius); - image_filter_lut(const image_filter_lut&); - const image_filter_lut& operator = (const image_filter_lut&); - - double m_radius; - unsigned m_diameter; - int m_start; - pod_array m_weight_array; - }; - - - - //--------------------------------------------------------image_filter - template class image_filter : public image_filter_lut - { - public: - image_filter() - { - calculate(m_filter_function); - } - private: - FilterF m_filter_function; - }; - - - //-----------------------------------------------image_filter_bilinear - struct image_filter_bilinear - { - static double radius() { return 1.0; } - static double calc_weight(double x) - { - return 1.0 - x; - } - }; - - - //-----------------------------------------------image_filter_hanning - struct image_filter_hanning - { - static double radius() { return 1.0; } - static double calc_weight(double x) - { - return 0.5 + 0.5 * cos(pi * x); - } - }; - - - //-----------------------------------------------image_filter_hamming - struct image_filter_hamming - { - static double radius() { return 1.0; } - static double calc_weight(double x) - { - return 0.54 + 0.46 * cos(pi * x); - } - }; - - //-----------------------------------------------image_filter_hermite - struct image_filter_hermite - { - static double radius() { return 1.0; } - static double calc_weight(double x) - { - return (2.0 * x - 3.0) * x * x + 1.0; - } - }; - - //------------------------------------------------image_filter_quadric - struct image_filter_quadric - { - static double radius() { return 1.5; } - static double calc_weight(double x) - { - double t; - if(x < 0.5) return 0.75 - x * x; - if(x < 1.5) {t = x - 1.5; return 0.5 * t * t;} - return 0.0; - } - }; - - //------------------------------------------------image_filter_bicubic - class image_filter_bicubic - { - static double pow3(double x) - { - return (x <= 0.0) ? 0.0 : x * x * x; - } - - public: - static double radius() { return 2.0; } - static double calc_weight(double x) - { - return - (1.0/6.0) * - (pow3(x + 2) - 4 * pow3(x + 1) + 6 * pow3(x) - 4 * pow3(x - 1)); - } - }; - - //-------------------------------------------------image_filter_kaiser - class image_filter_kaiser - { - double a; - double i0a; - double epsilon; - - public: - image_filter_kaiser(double b = 6.33) : - a(b), epsilon(1e-12) - { - i0a = 1.0 / bessel_i0(b); - } - - static double radius() { return 1.0; } - double calc_weight(double x) const - { - return bessel_i0(a * sqrt(1. - x * x)) * i0a; - } - - private: - double bessel_i0(double x) const - { - int i; - double sum, y, t; - - sum = 1.; - y = x * x / 4.; - t = y; - - for(i = 2; t > epsilon; i++) - { - sum += t; - t *= (double)y / (i * i); - } - return sum; - } - }; - - //----------------------------------------------image_filter_catrom - struct image_filter_catrom - { - static double radius() { return 2.0; } - static double calc_weight(double x) - { - if(x < 1.0) return 0.5 * (2.0 + x * x * (-5.0 + x * 3.0)); - if(x < 2.0) return 0.5 * (4.0 + x * (-8.0 + x * (5.0 - x))); - return 0.; - } - }; - - //---------------------------------------------image_filter_mitchell - class image_filter_mitchell - { - double p0, p2, p3; - double q0, q1, q2, q3; - - public: - image_filter_mitchell(double b = 1.0/3.0, double c = 1.0/3.0) : - p0((6.0 - 2.0 * b) / 6.0), - p2((-18.0 + 12.0 * b + 6.0 * c) / 6.0), - p3((12.0 - 9.0 * b - 6.0 * c) / 6.0), - q0((8.0 * b + 24.0 * c) / 6.0), - q1((-12.0 * b - 48.0 * c) / 6.0), - q2((6.0 * b + 30.0 * c) / 6.0), - q3((-b - 6.0 * c) / 6.0) - {} - - static double radius() { return 2.0; } - double calc_weight(double x) const - { - if(x < 1.0) return p0 + x * x * (p2 + x * p3); - if(x < 2.0) return q0 + x * (q1 + x * (q2 + x * q3)); - return 0.0; - } - }; - - - //----------------------------------------------image_filter_spline16 - struct image_filter_spline16 - { - static double radius() { return 2.0; } - static double calc_weight(double x) - { - if(x < 1.0) - { - return ((x - 9.0/5.0 ) * x - 1.0/5.0 ) * x + 1.0; - } - return ((-1.0/3.0 * (x-1) + 4.0/5.0) * (x-1) - 7.0/15.0 ) * (x-1); - } - }; - - - //---------------------------------------------image_filter_spline36 - struct image_filter_spline36 - { - static double radius() { return 3.0; } - static double calc_weight(double x) - { - if(x < 1.0) - { - return ((13.0/11.0 * x - 453.0/209.0) * x - 3.0/209.0) * x + 1.0; - } - if(x < 2.0) - { - return ((-6.0/11.0 * (x-1) + 270.0/209.0) * (x-1) - 156.0/ 209.0) * (x-1); - } - return ((1.0/11.0 * (x-2) - 45.0/209.0) * (x-2) + 26.0/209.0) * (x-2); - } - }; - - - //----------------------------------------------image_filter_gaussian - struct image_filter_gaussian - { - static double radius() { return 2.0; } - static double calc_weight(double x) - { - return exp(-2.0 * x * x) * sqrt(2.0 / pi); - } - }; - - - //------------------------------------------------image_filter_bessel - struct image_filter_bessel - { - static double radius() { return 3.2383; } - static double calc_weight(double x) - { - return (x == 0.0) ? pi / 4.0 : besj(pi * x, 1) / (2.0 * x); - } - }; - - - //-------------------------------------------------image_filter_sinc - class image_filter_sinc - { - public: - image_filter_sinc(double r) : m_radius(r < 2.0 ? 2.0 : r) {} - double radius() const { return m_radius; } - double calc_weight(double x) const - { - if(x == 0.0) return 1.0; - x *= pi; - return sin(x) / x; - } - private: - double m_radius; - }; - - - //-----------------------------------------------image_filter_lanczos - class image_filter_lanczos - { - public: - image_filter_lanczos(double r) : m_radius(r < 2.0 ? 2.0 : r) {} - double radius() const { return m_radius; } - double calc_weight(double x) const - { - if(x == 0.0) return 1.0; - if(x > m_radius) return 0.0; - x *= pi; - double xr = x / m_radius; - return (sin(x) / x) * (sin(xr) / xr); - } - private: - double m_radius; - }; - - - //----------------------------------------------image_filter_blackman - class image_filter_blackman - { - public: - image_filter_blackman(double r) : m_radius(r < 2.0 ? 2.0 : r) {} - double radius() const { return m_radius; } - double calc_weight(double x) const - { - if(x == 0.0) return 1.0; - if(x > m_radius) return 0.0; - x *= pi; - double xr = x / m_radius; - return (sin(x) / x) * (0.42 + 0.5*cos(xr) + 0.08*cos(2*xr)); - } - private: - double m_radius; - }; - - //------------------------------------------------image_filter_sinc36 - class image_filter_sinc36 : public image_filter_sinc - { public: image_filter_sinc36() : image_filter_sinc(3.0){} }; - - //------------------------------------------------image_filter_sinc64 - class image_filter_sinc64 : public image_filter_sinc - { public: image_filter_sinc64() : image_filter_sinc(4.0){} }; - - //-----------------------------------------------image_filter_sinc100 - class image_filter_sinc100 : public image_filter_sinc - { public: image_filter_sinc100() : image_filter_sinc(5.0){} }; - - //-----------------------------------------------image_filter_sinc144 - class image_filter_sinc144 : public image_filter_sinc - { public: image_filter_sinc144() : image_filter_sinc(6.0){} }; - - //-----------------------------------------------image_filter_sinc196 - class image_filter_sinc196 : public image_filter_sinc - { public: image_filter_sinc196() : image_filter_sinc(7.0){} }; - - //-----------------------------------------------image_filter_sinc256 - class image_filter_sinc256 : public image_filter_sinc - { public: image_filter_sinc256() : image_filter_sinc(8.0){} }; - - //---------------------------------------------image_filter_lanczos36 - class image_filter_lanczos36 : public image_filter_lanczos - { public: image_filter_lanczos36() : image_filter_lanczos(3.0){} }; - - //---------------------------------------------image_filter_lanczos64 - class image_filter_lanczos64 : public image_filter_lanczos - { public: image_filter_lanczos64() : image_filter_lanczos(4.0){} }; - - //--------------------------------------------image_filter_lanczos100 - class image_filter_lanczos100 : public image_filter_lanczos - { public: image_filter_lanczos100() : image_filter_lanczos(5.0){} }; - - //--------------------------------------------image_filter_lanczos144 - class image_filter_lanczos144 : public image_filter_lanczos - { public: image_filter_lanczos144() : image_filter_lanczos(6.0){} }; - - //--------------------------------------------image_filter_lanczos196 - class image_filter_lanczos196 : public image_filter_lanczos - { public: image_filter_lanczos196() : image_filter_lanczos(7.0){} }; - - //--------------------------------------------image_filter_lanczos256 - class image_filter_lanczos256 : public image_filter_lanczos - { public: image_filter_lanczos256() : image_filter_lanczos(8.0){} }; - - //--------------------------------------------image_filter_blackman36 - class image_filter_blackman36 : public image_filter_blackman - { public: image_filter_blackman36() : image_filter_blackman(3.0){} }; - - //--------------------------------------------image_filter_blackman64 - class image_filter_blackman64 : public image_filter_blackman - { public: image_filter_blackman64() : image_filter_blackman(4.0){} }; - - //-------------------------------------------image_filter_blackman100 - class image_filter_blackman100 : public image_filter_blackman - { public: image_filter_blackman100() : image_filter_blackman(5.0){} }; - - //-------------------------------------------image_filter_blackman144 - class image_filter_blackman144 : public image_filter_blackman - { public: image_filter_blackman144() : image_filter_blackman(6.0){} }; - - //-------------------------------------------image_filter_blackman196 - class image_filter_blackman196 : public image_filter_blackman - { public: image_filter_blackman196() : image_filter_blackman(7.0){} }; - - //-------------------------------------------image_filter_blackman256 - class image_filter_blackman256 : public image_filter_blackman - { public: image_filter_blackman256() : image_filter_blackman(8.0){} }; - - -} - -#endif diff --git a/uppdev/aggdraw/agg_line_aa_basics.cpp b/uppdev/aggdraw/agg_line_aa_basics.cpp deleted file mode 100644 index 8570e5c71..000000000 --- a/uppdev/aggdraw/agg_line_aa_basics.cpp +++ /dev/null @@ -1,91 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#include -#include "agg_line_aa_basics.h" - -namespace agg -{ - //------------------------------------------------------------------------- - // The number of the octant is determined as a 3-bit value as follows: - // bit 0 = vertical flag - // bit 1 = sx < 0 - // bit 2 = sy < 0 - // - // [N] shows the number of the orthogonal quadrant - // shows the number of the diagonal quadrant - // <1> - // [1] | [0] - // . (3)011 | 001(1) . - // . | . - // . | . - // . | . - // (2)010 .|. 000(0) - // <2> ----------.+.----------- <0> - // (6)110 . | . 100(4) - // . | . - // . | . - // . | . - // (7)111 | 101(5) - // [2] | [3] - // <3> - // 0,1,2,3,4,5,6,7 - const int8u line_parameters::s_orthogonal_quadrant[8] = { 0,0,1,1,3,3,2,2 }; - const int8u line_parameters::s_diagonal_quadrant[8] = { 0,1,2,1,0,3,2,3 }; - - - - //------------------------------------------------------------------------- - void bisectrix(const line_parameters& l1, - const line_parameters& l2, - int* x, int* y) - { - double k = double(l2.len) / double(l1.len); - double tx = l2.x2 - (l2.x1 - l1.x1) * k; - double ty = l2.y2 - (l2.y1 - l1.y1) * k; - - //All bisectrices must be on the right of the line - //If the next point is on the left (l1 => l2.2) - //then the bisectix should be rotated by 180 degrees. - if(double(l2.x2 - l2.x1) * double(l2.y1 - l1.y1) < - double(l2.y2 - l2.y1) * double(l2.x1 - l1.x1) + 100.0) - { - tx -= (tx - l2.x1) * 2.0; - ty -= (ty - l2.y1) * 2.0; - } - - // Check if the bisectrix is too short - double dx = tx - l2.x1; - double dy = ty - l2.y1; - if((int)sqrt(dx * dx + dy * dy) < line_subpixel_scale) - { - *x = (l2.x1 + l2.x1 + (l2.y1 - l1.y1) + (l2.y2 - l2.y1)) >> 1; - *y = (l2.y1 + l2.y1 - (l2.x1 - l1.x1) - (l2.x2 - l2.x1)) >> 1; - return; - } - *x = iround(tx); - *y = iround(ty); - } - -} diff --git a/uppdev/aggdraw/agg_line_aa_basics.h b/uppdev/aggdraw/agg_line_aa_basics.h deleted file mode 100644 index 8c3d7ee20..000000000 --- a/uppdev/aggdraw/agg_line_aa_basics.h +++ /dev/null @@ -1,199 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_LINE_AA_BASICS_INCLUDED -#define AGG_LINE_AA_BASICS_INCLUDED - -#include -#include "agg_basics.h" - -namespace agg -{ - - // See Implementation agg_line_aa_basics.cpp - - //------------------------------------------------------------------------- - enum line_subpixel_scale_e - { - line_subpixel_shift = 8, //----line_subpixel_shift - line_subpixel_scale = 1 << line_subpixel_shift, //----line_subpixel_scale - line_subpixel_mask = line_subpixel_scale - 1, //----line_subpixel_mask - line_max_coord = (1 << 28) - 1, //----line_max_coord - line_max_length = 1 << (line_subpixel_shift + 10) //----line_max_length - }; - - //------------------------------------------------------------------------- - enum line_mr_subpixel_scale_e - { - line_mr_subpixel_shift = 4, //----line_mr_subpixel_shift - line_mr_subpixel_scale = 1 << line_mr_subpixel_shift, //----line_mr_subpixel_scale - line_mr_subpixel_mask = line_mr_subpixel_scale - 1 //----line_mr_subpixel_mask - }; - - //------------------------------------------------------------------line_mr - AGG_INLINE int line_mr(int x) - { - return x >> (line_subpixel_shift - line_mr_subpixel_shift); - } - - //-------------------------------------------------------------------line_hr - AGG_INLINE int line_hr(int x) - { - return x << (line_subpixel_shift - line_mr_subpixel_shift); - } - - //---------------------------------------------------------------line_dbl_hr - AGG_INLINE int line_dbl_hr(int x) - { - return x << line_subpixel_shift; - } - - //---------------------------------------------------------------line_coord - struct line_coord - { - AGG_INLINE static int conv(double x) - { - return iround(x * line_subpixel_scale); - } - }; - - //-----------------------------------------------------------line_coord_sat - struct line_coord_sat - { - AGG_INLINE static int conv(double x) - { - return saturation::iround(x * line_subpixel_scale); - } - }; - - //==========================================================line_parameters - struct line_parameters - { - //--------------------------------------------------------------------- - line_parameters() {} - line_parameters(int x1_, int y1_, int x2_, int y2_, int len_) : - x1(x1_), y1(y1_), x2(x2_), y2(y2_), - dx(abs(x2_ - x1_)), - dy(abs(y2_ - y1_)), - sx((x2_ > x1_) ? 1 : -1), - sy((y2_ > y1_) ? 1 : -1), - vertical(dy >= dx), - inc(vertical ? sy : sx), - len(len_), - octant((sy & 4) | (sx & 2) | int(vertical)) - { - } - - //--------------------------------------------------------------------- - unsigned orthogonal_quadrant() const { return s_orthogonal_quadrant[octant]; } - unsigned diagonal_quadrant() const { return s_diagonal_quadrant[octant]; } - - //--------------------------------------------------------------------- - bool same_orthogonal_quadrant(const line_parameters& lp) const - { - return s_orthogonal_quadrant[octant] == s_orthogonal_quadrant[lp.octant]; - } - - //--------------------------------------------------------------------- - bool same_diagonal_quadrant(const line_parameters& lp) const - { - return s_diagonal_quadrant[octant] == s_diagonal_quadrant[lp.octant]; - } - - //--------------------------------------------------------------------- - void divide(line_parameters& lp1, line_parameters& lp2) const - { - int xmid = (x1 + x2) >> 1; - int ymid = (y1 + y2) >> 1; - int len2 = len >> 1; - - lp1 = *this; - lp2 = *this; - - lp1.x2 = xmid; - lp1.y2 = ymid; - lp1.len = len2; - lp1.dx = abs(lp1.x2 - lp1.x1); - lp1.dy = abs(lp1.y2 - lp1.y1); - - lp2.x1 = xmid; - lp2.y1 = ymid; - lp2.len = len2; - lp2.dx = abs(lp2.x2 - lp2.x1); - lp2.dy = abs(lp2.y2 - lp2.y1); - } - - //--------------------------------------------------------------------- - int x1, y1, x2, y2, dx, dy, sx, sy; - bool vertical; - int inc; - int len; - int octant; - - //--------------------------------------------------------------------- - static const int8u s_orthogonal_quadrant[8]; - static const int8u s_diagonal_quadrant[8]; - }; - - - - // See Implementation agg_line_aa_basics.cpp - - //----------------------------------------------------------------bisectrix - void bisectrix(const line_parameters& l1, - const line_parameters& l2, - int* x, int* y); - - - //-------------------------------------------fix_degenerate_bisectrix_start - void inline fix_degenerate_bisectrix_start(const line_parameters& lp, - int* x, int* y) - { - int d = iround((double(*x - lp.x2) * double(lp.y2 - lp.y1) - - double(*y - lp.y2) * double(lp.x2 - lp.x1)) / lp.len); - if(d < line_subpixel_scale/2) - { - *x = lp.x1 + (lp.y2 - lp.y1); - *y = lp.y1 - (lp.x2 - lp.x1); - } - } - - - //---------------------------------------------fix_degenerate_bisectrix_end - void inline fix_degenerate_bisectrix_end(const line_parameters& lp, - int* x, int* y) - { - int d = iround((double(*x - lp.x2) * double(lp.y2 - lp.y1) - - double(*y - lp.y2) * double(lp.x2 - lp.x1)) / lp.len); - if(d < line_subpixel_scale/2) - { - *x = lp.x2 + (lp.y2 - lp.y1); - *y = lp.y2 - (lp.x2 - lp.x1); - } - } - - -} - -#endif diff --git a/uppdev/aggdraw/agg_line_profile_aa.cpp b/uppdev/aggdraw/agg_line_profile_aa.cpp deleted file mode 100644 index 1df9e2cb8..000000000 --- a/uppdev/aggdraw/agg_line_profile_aa.cpp +++ /dev/null @@ -1,125 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#include "agg_renderer_outline_aa.h" - -namespace agg -{ - - //--------------------------------------------------------------------- - void line_profile_aa::width(double w) - { - if(w < 0.0) w = 0.0; - - if(w < m_smoother_width) w += w; - else w += m_smoother_width; - - w *= 0.5; - - w -= m_smoother_width; - double s = m_smoother_width; - if(w < 0.0) - { - s += w; - w = 0.0; - } - set(w, s); - } - - - //--------------------------------------------------------------------- - line_profile_aa::value_type* line_profile_aa::profile(double w) - { - m_subpixel_width = uround(w * subpixel_scale); - unsigned size = m_subpixel_width + subpixel_scale * 6; - if(size > m_profile.size()) - { - m_profile.resize(size); - } - return &m_profile[0]; - } - - - //--------------------------------------------------------------------- - void line_profile_aa::set(double center_width, double smoother_width) - { - double base_val = 1.0; - if(center_width == 0.0) center_width = 1.0 / subpixel_scale; - if(smoother_width == 0.0) smoother_width = 1.0 / subpixel_scale; - - double width = center_width + smoother_width; - if(width < m_min_width) - { - double k = width / m_min_width; - base_val *= k; - center_width /= k; - smoother_width /= k; - } - - value_type* ch = profile(center_width + smoother_width); - - unsigned subpixel_center_width = unsigned(center_width * subpixel_scale); - unsigned subpixel_smoother_width = unsigned(smoother_width * subpixel_scale); - - value_type* ch_center = ch + subpixel_scale*2; - value_type* ch_smoother = ch_center + subpixel_center_width; - - unsigned i; - - unsigned val = m_gamma[unsigned(base_val * aa_mask)]; - ch = ch_center; - for(i = 0; i < subpixel_center_width; i++) - { - *ch++ = (value_type)val; - } - - for(i = 0; i < subpixel_smoother_width; i++) - { - *ch_smoother++ = - m_gamma[unsigned((base_val - - base_val * - (double(i) / subpixel_smoother_width)) * aa_mask)]; - } - - unsigned n_smoother = profile_size() - - subpixel_smoother_width - - subpixel_center_width - - subpixel_scale*2; - - val = m_gamma[0]; - for(i = 0; i < n_smoother; i++) - { - *ch_smoother++ = (value_type)val; - } - - ch = ch_center; - for(i = 0; i < subpixel_scale*2; i++) - { - *--ch = *ch_center++; - } - } - - -} - diff --git a/uppdev/aggdraw/agg_math.h b/uppdev/aggdraw/agg_math.h deleted file mode 100644 index 62bc57c3c..000000000 --- a/uppdev/aggdraw/agg_math.h +++ /dev/null @@ -1,446 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// Bessel function (besj) was adapted for use in AGG library by Andy Wilk -// Contact: castor.vulgaris@gmail.com -//---------------------------------------------------------------------------- - -#ifndef AGG_MATH_INCLUDED -#define AGG_MATH_INCLUDED - -#include -#include "agg_basics.h" - -namespace agg -{ - - //------------------------------------------------------vertex_dist_epsilon - // Coinciding points maximal distance (Epsilon) - const double vertex_dist_epsilon = 1e-14; - - //-----------------------------------------------------intersection_epsilon - // See calc_intersection - const double intersection_epsilon = 1.0e-30; - - //------------------------------------------------------------cross_product - AGG_INLINE double cross_product(double x1, double y1, - double x2, double y2, - double x, double y) - { - return (x - x2) * (y2 - y1) - (y - y2) * (x2 - x1); - } - - //--------------------------------------------------------point_in_triangle - AGG_INLINE bool point_in_triangle(double x1, double y1, - double x2, double y2, - double x3, double y3, - double x, double y) - { - bool cp1 = cross_product(x1, y1, x2, y2, x, y) < 0.0; - bool cp2 = cross_product(x2, y2, x3, y3, x, y) < 0.0; - bool cp3 = cross_product(x3, y3, x1, y1, x, y) < 0.0; - return cp1 == cp2 && cp2 == cp3 && cp3 == cp1; - } - - //-----------------------------------------------------------calc_distance - AGG_INLINE double calc_distance(double x1, double y1, double x2, double y2) - { - double dx = x2-x1; - double dy = y2-y1; - return sqrt(dx * dx + dy * dy); - } - - //--------------------------------------------------------calc_sq_distance - AGG_INLINE double calc_sq_distance(double x1, double y1, double x2, double y2) - { - double dx = x2-x1; - double dy = y2-y1; - return dx * dx + dy * dy; - } - - //------------------------------------------------calc_line_point_distance - AGG_INLINE double calc_line_point_distance(double x1, double y1, - double x2, double y2, - double x, double y) - { - double dx = x2-x1; - double dy = y2-y1; - double d = sqrt(dx * dx + dy * dy); - if(d < vertex_dist_epsilon) - { - return calc_distance(x1, y1, x, y); - } - return ((x - x2) * dy - (y - y2) * dx) / d; - } - - //-------------------------------------------------------calc_line_point_u - AGG_INLINE double calc_segment_point_u(double x1, double y1, - double x2, double y2, - double x, double y) - { - double dx = x2 - x1; - double dy = y2 - y1; - - if(dx == 0 && dy == 0) - { - return 0; - } - - double pdx = x - x1; - double pdy = y - y1; - - return (pdx * dx + pdy * dy) / (dx * dx + dy * dy); - } - - //---------------------------------------------calc_line_point_sq_distance - AGG_INLINE double calc_segment_point_sq_distance(double x1, double y1, - double x2, double y2, - double x, double y, - double u) - { - if(u <= 0) - { - return calc_sq_distance(x, y, x1, y1); - } - else - if(u >= 1) - { - return calc_sq_distance(x, y, x2, y2); - } - return calc_sq_distance(x, y, x1 + u * (x2 - x1), y1 + u * (y2 - y1)); - } - - //---------------------------------------------calc_line_point_sq_distance - AGG_INLINE double calc_segment_point_sq_distance(double x1, double y1, - double x2, double y2, - double x, double y) - { - return - calc_segment_point_sq_distance( - x1, y1, x2, y2, x, y, - calc_segment_point_u(x1, y1, x2, y2, x, y)); - } - - //-------------------------------------------------------calc_intersection - AGG_INLINE bool calc_intersection(double ax, double ay, double bx, double by, - double cx, double cy, double dx, double dy, - double* x, double* y) - { - double num = (ay-cy) * (dx-cx) - (ax-cx) * (dy-cy); - double den = (bx-ax) * (dy-cy) - (by-ay) * (dx-cx); - if(fabs(den) < intersection_epsilon) return false; - double r = num / den; - *x = ax + r * (bx-ax); - *y = ay + r * (by-ay); - return true; - } - - //-----------------------------------------------------intersection_exists - AGG_INLINE bool intersection_exists(double x1, double y1, double x2, double y2, - double x3, double y3, double x4, double y4) - { - // It's less expensive but you can't control the - // boundary conditions: Less or LessEqual - double dx1 = x2 - x1; - double dy1 = y2 - y1; - double dx2 = x4 - x3; - double dy2 = y4 - y3; - return ((x3 - x2) * dy1 - (y3 - y2) * dx1 < 0.0) != - ((x4 - x2) * dy1 - (y4 - y2) * dx1 < 0.0) && - ((x1 - x4) * dy2 - (y1 - y4) * dx2 < 0.0) != - ((x2 - x4) * dy2 - (y2 - y4) * dx2 < 0.0); - - // It's is more expensive but more flexible - // in terms of boundary conditions. - //-------------------- - //double den = (x2-x1) * (y4-y3) - (y2-y1) * (x4-x3); - //if(fabs(den) < intersection_epsilon) return false; - //double nom1 = (x4-x3) * (y1-y3) - (y4-y3) * (x1-x3); - //double nom2 = (x2-x1) * (y1-y3) - (y2-y1) * (x1-x3); - //double ua = nom1 / den; - //double ub = nom2 / den; - //return ua >= 0.0 && ua <= 1.0 && ub >= 0.0 && ub <= 1.0; - } - - //--------------------------------------------------------calc_orthogonal - AGG_INLINE void calc_orthogonal(double thickness, - double x1, double y1, - double x2, double y2, - double* x, double* y) - { - double dx = x2 - x1; - double dy = y2 - y1; - double d = sqrt(dx*dx + dy*dy); - *x = thickness * dy / d; - *y = -thickness * dx / d; - } - - //--------------------------------------------------------dilate_triangle - AGG_INLINE void dilate_triangle(double x1, double y1, - double x2, double y2, - double x3, double y3, - double *x, double* y, - double d) - { - double dx1=0.0; - double dy1=0.0; - double dx2=0.0; - double dy2=0.0; - double dx3=0.0; - double dy3=0.0; - double loc = cross_product(x1, y1, x2, y2, x3, y3); - if(fabs(loc) > intersection_epsilon) - { - if(cross_product(x1, y1, x2, y2, x3, y3) > 0.0) - { - d = -d; - } - calc_orthogonal(d, x1, y1, x2, y2, &dx1, &dy1); - calc_orthogonal(d, x2, y2, x3, y3, &dx2, &dy2); - calc_orthogonal(d, x3, y3, x1, y1, &dx3, &dy3); - } - *x++ = x1 + dx1; *y++ = y1 + dy1; - *x++ = x2 + dx1; *y++ = y2 + dy1; - *x++ = x2 + dx2; *y++ = y2 + dy2; - *x++ = x3 + dx2; *y++ = y3 + dy2; - *x++ = x3 + dx3; *y++ = y3 + dy3; - *x++ = x1 + dx3; *y++ = y1 + dy3; - } - - //------------------------------------------------------calc_triangle_area - AGG_INLINE double calc_triangle_area(double x1, double y1, - double x2, double y2, - double x3, double y3) - { - return (x1*y2 - x2*y1 + x2*y3 - x3*y2 + x3*y1 - x1*y3) * 0.5; - } - - //-------------------------------------------------------calc_polygon_area - template double calc_polygon_area(const Storage& st) - { - unsigned i; - double sum = 0.0; - double x = st[0].x; - double y = st[0].y; - double xs = x; - double ys = y; - - for(i = 1; i < st.size(); i++) - { - const typename Storage::value_type& v = st[i]; - sum += x * v.y - y * v.x; - x = v.x; - y = v.y; - } - return (sum + x * ys - y * xs) * 0.5; - } - - //------------------------------------------------------------------------ - // Tables for fast sqrt - extern int16u g_sqrt_table[1024]; - extern int8 g_elder_bit_table[256]; - - - //---------------------------------------------------------------fast_sqrt - //Fast integer Sqrt - really fast: no cycles, divisions or multiplications - #if defined(_MSC_VER) - #pragma warning(push) - #pragma warning(disable : 4035) //Disable warning "no return value" - #endif - AGG_INLINE unsigned fast_sqrt(unsigned val) - { - #if defined(_M_IX86) && defined(_MSC_VER) && !defined(AGG_NO_ASM) - //For Ix86 family processors this assembler code is used. - //The key command here is bsr - determination the number of the most - //significant bit of the value. For other processors - //(and maybe compilers) the pure C "#else" section is used. - __asm - { - mov ebx, val - mov edx, 11 - bsr ecx, ebx - sub ecx, 9 - jle less_than_9_bits - shr ecx, 1 - adc ecx, 0 - sub edx, ecx - shl ecx, 1 - shr ebx, cl - less_than_9_bits: - xor eax, eax - mov ax, g_sqrt_table[ebx*2] - mov ecx, edx - shr eax, cl - } - #else - - //This code is actually pure C and portable to most - //arcitectures including 64bit ones. - unsigned t = val; - int bit=0; - unsigned shift = 11; - - //The following piece of code is just an emulation of the - //Ix86 assembler command "bsr" (see above). However on old - //Intels (like Intel MMX 233MHz) this code is about twice - //faster (sic!) then just one "bsr". On PIII and PIV the - //bsr is optimized quite well. - bit = t >> 24; - if(bit) - { - bit = g_elder_bit_table[bit] + 24; - } - else - { - bit = (t >> 16) & 0xFF; - if(bit) - { - bit = g_elder_bit_table[bit] + 16; - } - else - { - bit = (t >> 8) & 0xFF; - if(bit) - { - bit = g_elder_bit_table[bit] + 8; - } - else - { - bit = g_elder_bit_table[t]; - } - } - } - - //This code calculates the sqrt. - bit -= 9; - if(bit > 0) - { - bit = (bit >> 1) + (bit & 1); - shift -= bit; - val >>= (bit << 1); - } - return g_sqrt_table[val] >> shift; - #endif - } - #if defined(_MSC_VER) - #pragma warning(pop) - #endif - - - - - //--------------------------------------------------------------------besj - // Function BESJ calculates Bessel function of first kind of order n - // Arguments: - // n - an integer (>=0), the order - // x - value at which the Bessel function is required - //-------------------- - // C++ Mathematical Library - // Convereted from equivalent FORTRAN library - // Converetd by Gareth Walker for use by course 392 computational project - // All functions tested and yield the same results as the corresponding - // FORTRAN versions. - // - // If you have any problems using these functions please report them to - // M.Muldoon@UMIST.ac.uk - // - // Documentation available on the web - // http://www.ma.umist.ac.uk/mrm/Teaching/392/libs/392.html - // Version 1.0 8/98 - // 29 October, 1999 - //-------------------- - // Adapted for use in AGG library by Andy Wilk (castor.vulgaris@gmail.com) - //------------------------------------------------------------------------ - inline double besj(double x, int n) - { - if(n < 0) - { - return 0; - } - double d = 1E-6; - double b = 0; - if(fabs(x) <= d) - { - if(n != 0) return 0; - return 1; - } - double b1 = 0; // b1 is the value from the previous iteration - // Set up a starting order for recurrence - int m1 = (int)fabs(x) + 6; - if(fabs(x) > 5) - { - m1 = (int)(fabs(1.4 * x + 60 / x)); - } - int m2 = (int)(n + 2 + fabs(x) / 4); - if (m1 > m2) - { - m2 = m1; - } - - // Apply recurrence down from curent max order - for(;;) - { - double c3 = 0; - double c2 = 1E-30; - double c4 = 0; - int m8 = 1; - if (m2 / 2 * 2 == m2) - { - m8 = -1; - } - int imax = m2 - 2; - for (int i = 1; i <= imax; i++) - { - double c6 = 2 * (m2 - i) * c2 / x - c3; - c3 = c2; - c2 = c6; - if(m2 - i - 1 == n) - { - b = c6; - } - m8 = -1 * m8; - if (m8 > 0) - { - c4 = c4 + 2 * c6; - } - } - double c6 = 2 * c2 / x - c3; - if(n == 0) - { - b = c6; - } - c4 += c6; - b /= c4; - if(fabs(b - b1) < d) - { - return b; - } - b1 = b; - m2 += 3; - } - } - -} - - -#endif diff --git a/uppdev/aggdraw/agg_math_stroke.h b/uppdev/aggdraw/agg_math_stroke.h deleted file mode 100644 index 11e66b12b..000000000 --- a/uppdev/aggdraw/agg_math_stroke.h +++ /dev/null @@ -1,531 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_STROKE_MATH_INCLUDED -#define AGG_STROKE_MATH_INCLUDED - -#include "agg_math.h" -#include "agg_vertex_sequence.h" - -namespace agg -{ - //-------------------------------------------------------------line_cap_e - enum line_cap_e - { - butt_cap, - square_cap, - round_cap - }; - - //------------------------------------------------------------line_join_e - enum line_join_e - { - miter_join = 0, - miter_join_revert = 1, - round_join = 2, - bevel_join = 3, - miter_join_round = 4 - }; - - - //-----------------------------------------------------------inner_join_e - enum inner_join_e - { - inner_bevel, - inner_miter, - inner_jag, - inner_round - }; - - //------------------------------------------------------------math_stroke - template class math_stroke - { - public: - typedef typename VertexConsumer::value_type coord_type; - - math_stroke(); - - void line_cap(line_cap_e lc) { m_line_cap = lc; } - void line_join(line_join_e lj) { m_line_join = lj; } - void inner_join(inner_join_e ij) { m_inner_join = ij; } - - line_cap_e line_cap() const { return m_line_cap; } - line_join_e line_join() const { return m_line_join; } - inner_join_e inner_join() const { return m_inner_join; } - - void width(double w); - void miter_limit(double ml) { m_miter_limit = ml; } - void miter_limit_theta(double t); - void inner_miter_limit(double ml) { m_inner_miter_limit = ml; } - void approximation_scale(double as) { m_approx_scale = as; } - - double width() const { return m_width * 2.0; } - double miter_limit() const { return m_miter_limit; } - double inner_miter_limit() const { return m_inner_miter_limit; } - double approximation_scale() const { return m_approx_scale; } - - void calc_cap(VertexConsumer& vc, - const vertex_dist& v0, - const vertex_dist& v1, - double len); - - void calc_join(VertexConsumer& vc, - const vertex_dist& v0, - const vertex_dist& v1, - const vertex_dist& v2, - double len1, - double len2); - - private: - AGG_INLINE void add_vertex(VertexConsumer& vc, double x, double y) - { - vc.add(coord_type(x, y)); - } - - void calc_arc(VertexConsumer& vc, - double x, double y, - double dx1, double dy1, - double dx2, double dy2); - - void calc_miter(VertexConsumer& vc, - const vertex_dist& v0, - const vertex_dist& v1, - const vertex_dist& v2, - double dx1, double dy1, - double dx2, double dy2, - line_join_e lj, - double mlimit, - double dbevel); - - double m_width; - double m_width_abs; - double m_width_eps; - int m_width_sign; - double m_miter_limit; - double m_inner_miter_limit; - double m_approx_scale; - line_cap_e m_line_cap; - line_join_e m_line_join; - inner_join_e m_inner_join; - }; - - //----------------------------------------------------------------------- - template math_stroke::math_stroke() : - m_width(0.5), - m_width_abs(0.5), - m_width_eps(0.5/1024.0), - m_width_sign(1), - m_miter_limit(4.0), - m_inner_miter_limit(1.01), - m_approx_scale(1.0), - m_line_cap(butt_cap), - m_line_join(miter_join), - m_inner_join(inner_miter) - { - } - - //----------------------------------------------------------------------- - template void math_stroke::width(double w) - { - m_width = w * 0.5; - if(m_width < 0) - { - m_width_abs = -m_width; - m_width_sign = -1; - } - else - { - m_width_abs = m_width; - m_width_sign = 1; - } - m_width_eps = m_width / 1024.0; - } - - //----------------------------------------------------------------------- - template void math_stroke::miter_limit_theta(double t) - { - m_miter_limit = 1.0 / sin(t * 0.5) ; - } - - //----------------------------------------------------------------------- - template - void math_stroke::calc_arc(VC& vc, - double x, double y, - double dx1, double dy1, - double dx2, double dy2) - { - double a1 = atan2(dy1 * m_width_sign, dx1 * m_width_sign); - double a2 = atan2(dy2 * m_width_sign, dx2 * m_width_sign); - double da = a1 - a2; - int i, n; - - da = acos(m_width_abs / (m_width_abs + 0.125 / m_approx_scale)) * 2; - - add_vertex(vc, x + dx1, y + dy1); - if(m_width_sign > 0) - { - if(a1 > a2) a2 += 2 * pi; - n = int((a2 - a1) / da); - da = (a2 - a1) / (n + 1); - a1 += da; - for(i = 0; i < n; i++) - { - add_vertex(vc, x + cos(a1) * m_width, y + sin(a1) * m_width); - a1 += da; - } - } - else - { - if(a1 < a2) a2 -= 2 * pi; - n = int((a1 - a2) / da); - da = (a1 - a2) / (n + 1); - a1 -= da; - for(i = 0; i < n; i++) - { - add_vertex(vc, x + cos(a1) * m_width, y + sin(a1) * m_width); - a1 -= da; - } - } - add_vertex(vc, x + dx2, y + dy2); - } - - //----------------------------------------------------------------------- - template - void math_stroke::calc_miter(VC& vc, - const vertex_dist& v0, - const vertex_dist& v1, - const vertex_dist& v2, - double dx1, double dy1, - double dx2, double dy2, - line_join_e lj, - double mlimit, - double dbevel) - { - double xi = v1.x; - double yi = v1.y; - double di = 1; - double lim = m_width_abs * mlimit; - bool miter_limit_exceeded = true; // Assume the worst - bool intersection_failed = true; // Assume the worst - - if(calc_intersection(v0.x + dx1, v0.y - dy1, - v1.x + dx1, v1.y - dy1, - v1.x + dx2, v1.y - dy2, - v2.x + dx2, v2.y - dy2, - &xi, &yi)) - { - // Calculation of the intersection succeeded - //--------------------- - di = calc_distance(v1.x, v1.y, xi, yi); - if(di <= lim) - { - // Inside the miter limit - //--------------------- - add_vertex(vc, xi, yi); - miter_limit_exceeded = false; - } - intersection_failed = false; - } - else - { - // Calculation of the intersection failed, most probably - // the three points lie one straight line. - // First check if v0 and v2 lie on the opposite sides of vector: - // (v1.x, v1.y) -> (v1.x+dx1, v1.y-dy1), that is, the perpendicular - // to the line determined by vertices v0 and v1. - // This condition determines whether the next line segments continues - // the previous one or goes back. - //---------------- - double x2 = v1.x + dx1; - double y2 = v1.y - dy1; - if((cross_product(v0.x, v0.y, v1.x, v1.y, x2, y2) < 0.0) == - (cross_product(v1.x, v1.y, v2.x, v2.y, x2, y2) < 0.0)) - { - // This case means that the next segment continues - // the previous one (straight line) - //----------------- - add_vertex(vc, v1.x + dx1, v1.y - dy1); - miter_limit_exceeded = false; - } - } - - if(miter_limit_exceeded) - { - // Miter limit exceeded - //------------------------ - switch(lj) - { - case miter_join_revert: - // For the compatibility with SVG, PDF, etc, - // we use a simple bevel join instead of - // "smart" bevel - //------------------- - add_vertex(vc, v1.x + dx1, v1.y - dy1); - add_vertex(vc, v1.x + dx2, v1.y - dy2); - break; - - case miter_join_round: - calc_arc(vc, v1.x, v1.y, dx1, -dy1, dx2, -dy2); - break; - - default: - // If no miter-revert, calculate new dx1, dy1, dx2, dy2 - //---------------- - if(intersection_failed) - { - mlimit *= m_width_sign; - add_vertex(vc, v1.x + dx1 + dy1 * mlimit, - v1.y - dy1 + dx1 * mlimit); - add_vertex(vc, v1.x + dx2 - dy2 * mlimit, - v1.y - dy2 - dx2 * mlimit); - } - else - { - double x1 = v1.x + dx1; - double y1 = v1.y - dy1; - double x2 = v1.x + dx2; - double y2 = v1.y - dy2; - di = (lim - dbevel) / (di - dbevel); - add_vertex(vc, x1 + (xi - x1) * di, - y1 + (yi - y1) * di); - add_vertex(vc, x2 + (xi - x2) * di, - y2 + (yi - y2) * di); - } - break; - } - } - } - - //--------------------------------------------------------stroke_calc_cap - template - void math_stroke::calc_cap(VC& vc, - const vertex_dist& v0, - const vertex_dist& v1, - double len) - { - vc.remove_all(); - - double dx1 = (v1.y - v0.y) / len; - double dy1 = (v1.x - v0.x) / len; - double dx2 = 0; - double dy2 = 0; - - dx1 *= m_width; - dy1 *= m_width; - - if(m_line_cap != round_cap) - { - if(m_line_cap == square_cap) - { - dx2 = dy1 * m_width_sign; - dy2 = dx1 * m_width_sign; - } - add_vertex(vc, v0.x - dx1 - dx2, v0.y + dy1 - dy2); - add_vertex(vc, v0.x + dx1 - dx2, v0.y - dy1 - dy2); - } - else - { - double da = acos(m_width_abs / (m_width_abs + 0.125 / m_approx_scale)) * 2; - double a1; - int i; - int n = int(pi / da); - - da = pi / (n + 1); - add_vertex(vc, v0.x - dx1, v0.y + dy1); - if(m_width_sign > 0) - { - a1 = atan2(dy1, -dx1); - a1 += da; - for(i = 0; i < n; i++) - { - add_vertex(vc, v0.x + cos(a1) * m_width, - v0.y + sin(a1) * m_width); - a1 += da; - } - } - else - { - a1 = atan2(-dy1, dx1); - a1 -= da; - for(i = 0; i < n; i++) - { - add_vertex(vc, v0.x + cos(a1) * m_width, - v0.y + sin(a1) * m_width); - a1 -= da; - } - } - add_vertex(vc, v0.x + dx1, v0.y - dy1); - } - } - - //----------------------------------------------------------------------- - template - void math_stroke::calc_join(VC& vc, - const vertex_dist& v0, - const vertex_dist& v1, - const vertex_dist& v2, - double len1, - double len2) - { - double dx1 = m_width * (v1.y - v0.y) / len1; - double dy1 = m_width * (v1.x - v0.x) / len1; - double dx2 = m_width * (v2.y - v1.y) / len2; - double dy2 = m_width * (v2.x - v1.x) / len2; - - vc.remove_all(); - - double cp = cross_product(v0.x, v0.y, v1.x, v1.y, v2.x, v2.y); - if(cp != 0 && (cp > 0) == (m_width > 0)) - { - // Inner join - //--------------- - double limit = ((len1 < len2) ? len1 : len2) / m_width_abs; - if(limit < m_inner_miter_limit) - { - limit = m_inner_miter_limit; - } - - switch(m_inner_join) - { - default: // inner_bevel - add_vertex(vc, v1.x + dx1, v1.y - dy1); - add_vertex(vc, v1.x + dx2, v1.y - dy2); - break; - - case inner_miter: - calc_miter(vc, - v0, v1, v2, dx1, dy1, dx2, dy2, - miter_join_revert, - limit, 0); - break; - - case inner_jag: - case inner_round: - cp = (dx1-dx2) * (dx1-dx2) + (dy1-dy2) * (dy1-dy2); - if(cp < len1 * len1 && cp < len2 * len2) - { - calc_miter(vc, - v0, v1, v2, dx1, dy1, dx2, dy2, - miter_join_revert, - limit, 0); - } - else - { - if(m_inner_join == inner_jag) - { - add_vertex(vc, v1.x + dx1, v1.y - dy1); - add_vertex(vc, v1.x, v1.y ); - add_vertex(vc, v1.x + dx2, v1.y - dy2); - } - else - { - add_vertex(vc, v1.x + dx1, v1.y - dy1); - add_vertex(vc, v1.x, v1.y ); - calc_arc(vc, v1.x, v1.y, dx2, -dy2, dx1, -dy1); - add_vertex(vc, v1.x, v1.y ); - add_vertex(vc, v1.x + dx2, v1.y - dy2); - } - } - break; - } - } - else - { - // Outer join - //--------------- - - // Calculate the distance between v1 and - // the central point of the bevel line segment - //--------------- - double dx = (dx1 + dx2) / 2; - double dy = (dy1 + dy2) / 2; - double dbevel = sqrt(dx * dx + dy * dy); - - if(m_line_join == round_join || m_line_join == bevel_join) - { - // This is an optimization that reduces the number of points - // in cases of almost collinear segments. If there's no - // visible difference between bevel and miter joins we'd rather - // use miter join because it adds only one point instead of two. - // - // Here we calculate the middle point between the bevel points - // and then, the distance between v1 and this middle point. - // At outer joins this distance always less than stroke width, - // because it's actually the height of an isosceles triangle of - // v1 and its two bevel points. If the difference between this - // width and this value is small (no visible bevel) we can - // add just one point. - // - // The constant in the expression makes the result approximately - // the same as in round joins and caps. You can safely comment - // out this entire "if". - //------------------- - if(m_approx_scale * (m_width_abs - dbevel) < m_width_eps) - { - if(calc_intersection(v0.x + dx1, v0.y - dy1, - v1.x + dx1, v1.y - dy1, - v1.x + dx2, v1.y - dy2, - v2.x + dx2, v2.y - dy2, - &dx, &dy)) - { - add_vertex(vc, dx, dy); - } - else - { - add_vertex(vc, v1.x + dx1, v1.y - dy1); - } - return; - } - } - - switch(m_line_join) - { - case miter_join: - case miter_join_revert: - case miter_join_round: - calc_miter(vc, - v0, v1, v2, dx1, dy1, dx2, dy2, - m_line_join, - m_miter_limit, - dbevel); - break; - - case round_join: - calc_arc(vc, v1.x, v1.y, dx1, -dy1, dx2, -dy2); - break; - - default: // Bevel join - add_vertex(vc, v1.x + dx1, v1.y - dy1); - add_vertex(vc, v1.x + dx2, v1.y - dy2); - break; - } - } - } - - - - -} - -#endif diff --git a/uppdev/aggdraw/agg_path_length.h b/uppdev/aggdraw/agg_path_length.h deleted file mode 100644 index 487959e1f..000000000 --- a/uppdev/aggdraw/agg_path_length.h +++ /dev/null @@ -1,75 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_PATH_LENGTH_INCLUDED -#define AGG_PATH_LENGTH_INCLUDED - -#include "agg_math.h" - -namespace agg -{ - template - double path_length(VertexSource& vs, unsigned path_id = 0) - { - double len = 0.0; - double start_x = 0.0; - double start_y = 0.0; - double x1 = 0.0; - double y1 = 0.0; - double x2 = 0.0; - double y2 = 0.0; - bool first = true; - - unsigned cmd; - vs.rewind(path_id); - while(!is_stop(cmd = vs.vertex(&x2, &y2))) - { - if(is_vertex(cmd)) - { - if(first || is_move_to(cmd)) - { - start_x = x2; - start_y = y2; - } - else - { - len += calc_distance(x1, y1, x2, y2); - } - x1 = x2; - y1 = y2; - first = false; - } - else - { - if(is_close(cmd) && !first) - { - len += calc_distance(x1, y1, start_x, start_y); - } - } - } - return len; - } -} - -#endif diff --git a/uppdev/aggdraw/agg_path_storage.h b/uppdev/aggdraw/agg_path_storage.h deleted file mode 100644 index e8cb7ab48..000000000 --- a/uppdev/aggdraw/agg_path_storage.h +++ /dev/null @@ -1,1554 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_PATH_STORAGE_INCLUDED -#define AGG_PATH_STORAGE_INCLUDED - -#include -#include -#include "agg_math.h" -#include "agg_array.h" -#include "agg_bezier_arc.h" - -namespace agg -{ - - - //----------------------------------------------------vertex_block_storage - template - class vertex_block_storage - { - public: - // Allocation parameters - enum block_scale_e - { - block_shift = BlockShift, - block_size = 1 << block_shift, - block_mask = block_size - 1, - block_pool = BlockPool - }; - - typedef T value_type; - typedef vertex_block_storage self_type; - - ~vertex_block_storage(); - vertex_block_storage(); - vertex_block_storage(const self_type& v); - const self_type& operator = (const self_type& ps); - - void remove_all(); - void free_all(); - - void add_vertex(double x, double y, unsigned cmd); - void modify_vertex(unsigned idx, double x, double y); - void modify_vertex(unsigned idx, double x, double y, unsigned cmd); - void modify_command(unsigned idx, unsigned cmd); - void swap_vertices(unsigned v1, unsigned v2); - - unsigned last_command() const; - unsigned last_vertex(double* x, double* y) const; - unsigned prev_vertex(double* x, double* y) const; - - double last_x() const; - double last_y() const; - - unsigned total_vertices() const; - unsigned vertex(unsigned idx, double* x, double* y) const; - unsigned command(unsigned idx) const; - - private: - void allocate_block(unsigned nb); - int8u* storage_ptrs(T** xy_ptr); - - private: - unsigned m_total_vertices; - unsigned m_total_blocks; - unsigned m_max_blocks; - T** m_coord_blocks; - int8u** m_cmd_blocks; - }; - - - //------------------------------------------------------------------------ - template - void vertex_block_storage::free_all() - { - if(m_total_blocks) - { - T** coord_blk = m_coord_blocks + m_total_blocks - 1; - while(m_total_blocks--) - { - pod_allocator::deallocate( - *coord_blk, - block_size * 2 + - block_size / (sizeof(T) / sizeof(unsigned char))); - --coord_blk; - } - pod_allocator::deallocate(m_coord_blocks, m_max_blocks * 2); - m_total_blocks = 0; - m_max_blocks = 0; - m_coord_blocks = 0; - m_cmd_blocks = 0; - m_total_vertices = 0; - } - } - - //------------------------------------------------------------------------ - template - vertex_block_storage::~vertex_block_storage() - { - free_all(); - } - - //------------------------------------------------------------------------ - template - vertex_block_storage::vertex_block_storage() : - m_total_vertices(0), - m_total_blocks(0), - m_max_blocks(0), - m_coord_blocks(0), - m_cmd_blocks(0) - { - } - - //------------------------------------------------------------------------ - template - vertex_block_storage::vertex_block_storage(const vertex_block_storage& v) : - m_total_vertices(0), - m_total_blocks(0), - m_max_blocks(0), - m_coord_blocks(0), - m_cmd_blocks(0) - { - *this = v; - } - - //------------------------------------------------------------------------ - template - const vertex_block_storage& - vertex_block_storage::operator = (const vertex_block_storage& v) - { - remove_all(); - unsigned i; - for(i = 0; i < v.total_vertices(); i++) - { - double x, y; - unsigned cmd = v.vertex(i, &x, &y); - add_vertex(x, y, cmd); - } - return *this; - } - - //------------------------------------------------------------------------ - template - inline void vertex_block_storage::remove_all() - { - m_total_vertices = 0; - } - - //------------------------------------------------------------------------ - template - inline void vertex_block_storage::add_vertex(double x, double y, - unsigned cmd) - { - T* coord_ptr = 0; - *storage_ptrs(&coord_ptr) = (int8u)cmd; - coord_ptr[0] = T(x); - coord_ptr[1] = T(y); - m_total_vertices++; - } - - //------------------------------------------------------------------------ - template - inline void vertex_block_storage::modify_vertex(unsigned idx, - double x, double y) - { - T* pv = m_coord_blocks[idx >> block_shift] + ((idx & block_mask) << 1); - pv[0] = T(x); - pv[1] = T(y); - } - - //------------------------------------------------------------------------ - template - inline void vertex_block_storage::modify_vertex(unsigned idx, - double x, double y, - unsigned cmd) - { - unsigned block = idx >> block_shift; - unsigned offset = idx & block_mask; - T* pv = m_coord_blocks[block] + (offset << 1); - pv[0] = T(x); - pv[1] = T(y); - m_cmd_blocks[block][offset] = (int8u)cmd; - } - - //------------------------------------------------------------------------ - template - inline void vertex_block_storage::modify_command(unsigned idx, - unsigned cmd) - { - m_cmd_blocks[idx >> block_shift][idx & block_mask] = (int8u)cmd; - } - - //------------------------------------------------------------------------ - template - inline void vertex_block_storage::swap_vertices(unsigned v1, unsigned v2) - { - unsigned b1 = v1 >> block_shift; - unsigned b2 = v2 >> block_shift; - unsigned o1 = v1 & block_mask; - unsigned o2 = v2 & block_mask; - T* pv1 = m_coord_blocks[b1] + (o1 << 1); - T* pv2 = m_coord_blocks[b2] + (o2 << 1); - T val; - val = pv1[0]; pv1[0] = pv2[0]; pv2[0] = val; - val = pv1[1]; pv1[1] = pv2[1]; pv2[1] = val; - int8u cmd = m_cmd_blocks[b1][o1]; - m_cmd_blocks[b1][o1] = m_cmd_blocks[b2][o2]; - m_cmd_blocks[b2][o2] = cmd; - } - - //------------------------------------------------------------------------ - template - inline unsigned vertex_block_storage::last_command() const - { - if(m_total_vertices) return command(m_total_vertices - 1); - return path_cmd_stop; - } - - //------------------------------------------------------------------------ - template - inline unsigned vertex_block_storage::last_vertex(double* x, double* y) const - { - if(m_total_vertices) return vertex(m_total_vertices - 1, x, y); - return path_cmd_stop; - } - - //------------------------------------------------------------------------ - template - inline unsigned vertex_block_storage::prev_vertex(double* x, double* y) const - { - if(m_total_vertices > 1) return vertex(m_total_vertices - 2, x, y); - return path_cmd_stop; - } - - //------------------------------------------------------------------------ - template - inline double vertex_block_storage::last_x() const - { - if(m_total_vertices) - { - unsigned idx = m_total_vertices - 1; - return m_coord_blocks[idx >> block_shift][(idx & block_mask) << 1]; - } - return 0.0; - } - - //------------------------------------------------------------------------ - template - inline double vertex_block_storage::last_y() const - { - if(m_total_vertices) - { - unsigned idx = m_total_vertices - 1; - return m_coord_blocks[idx >> block_shift][((idx & block_mask) << 1) + 1]; - } - return 0.0; - } - - //------------------------------------------------------------------------ - template - inline unsigned vertex_block_storage::total_vertices() const - { - return m_total_vertices; - } - - //------------------------------------------------------------------------ - template - inline unsigned vertex_block_storage::vertex(unsigned idx, - double* x, double* y) const - { - unsigned nb = idx >> block_shift; - const T* pv = m_coord_blocks[nb] + ((idx & block_mask) << 1); - *x = pv[0]; - *y = pv[1]; - return m_cmd_blocks[nb][idx & block_mask]; - } - - //------------------------------------------------------------------------ - template - inline unsigned vertex_block_storage::command(unsigned idx) const - { - return m_cmd_blocks[idx >> block_shift][idx & block_mask]; - } - - //------------------------------------------------------------------------ - template - void vertex_block_storage::allocate_block(unsigned nb) - { - if(nb >= m_max_blocks) - { - T** new_coords = - pod_allocator::allocate((m_max_blocks + block_pool) * 2); - - unsigned char** new_cmds = - (unsigned char**)(new_coords + m_max_blocks + block_pool); - - if(m_coord_blocks) - { - memcpy(new_coords, - m_coord_blocks, - m_max_blocks * sizeof(T*)); - - memcpy(new_cmds, - m_cmd_blocks, - m_max_blocks * sizeof(unsigned char*)); - - pod_allocator::deallocate(m_coord_blocks, m_max_blocks * 2); - } - m_coord_blocks = new_coords; - m_cmd_blocks = new_cmds; - m_max_blocks += block_pool; - } - m_coord_blocks[nb] = - pod_allocator::allocate(block_size * 2 + - block_size / (sizeof(T) / sizeof(unsigned char))); - - m_cmd_blocks[nb] = - (unsigned char*)(m_coord_blocks[nb] + block_size * 2); - - m_total_blocks++; - } - - //------------------------------------------------------------------------ - template - int8u* vertex_block_storage::storage_ptrs(T** xy_ptr) - { - unsigned nb = m_total_vertices >> block_shift; - if(nb >= m_total_blocks) - { - allocate_block(nb); - } - *xy_ptr = m_coord_blocks[nb] + ((m_total_vertices & block_mask) << 1); - return m_cmd_blocks[nb] + (m_total_vertices & block_mask); - } - - - - - //-----------------------------------------------------poly_plain_adaptor - template class poly_plain_adaptor - { - public: - typedef T value_type; - - poly_plain_adaptor() : - m_data(0), - m_ptr(0), - m_end(0), - m_closed(false), - m_stop(false) - {} - - poly_plain_adaptor(const T* data, unsigned num_points, bool closed) : - m_data(data), - m_ptr(data), - m_end(data + num_points * 2), - m_closed(closed), - m_stop(false) - {} - - void init(const T* data, unsigned num_points, bool closed) - { - m_data = data; - m_ptr = data; - m_end = data + num_points * 2; - m_closed = closed; - m_stop = false; - } - - void rewind(unsigned) - { - m_ptr = m_data; - m_stop = false; - } - - unsigned vertex(double* x, double* y) - { - if(m_ptr < m_end) - { - bool first = m_ptr == m_data; - *x = *m_ptr++; - *y = *m_ptr++; - return first ? path_cmd_move_to : path_cmd_line_to; - } - *x = *y = 0.0; - if(m_closed && !m_stop) - { - m_stop = true; - return path_cmd_end_poly | path_flags_close; - } - return path_cmd_stop; - } - - private: - const T* m_data; - const T* m_ptr; - const T* m_end; - bool m_closed; - bool m_stop; - }; - - - - - - //-------------------------------------------------poly_container_adaptor - template class poly_container_adaptor - { - public: - typedef typename Container::value_type vertex_type; - - poly_container_adaptor() : - m_container(0), - m_index(0), - m_closed(false), - m_stop(false) - {} - - poly_container_adaptor(const Container& data, bool closed) : - m_container(&data), - m_index(0), - m_closed(closed), - m_stop(false) - {} - - void init(const Container& data, bool closed) - { - m_container = &data; - m_index = 0; - m_closed = closed; - m_stop = false; - } - - void rewind(unsigned) - { - m_index = 0; - m_stop = false; - } - - unsigned vertex(double* x, double* y) - { - if(m_index < m_container->size()) - { - bool first = m_index == 0; - const vertex_type& v = (*m_container)[m_index++]; - *x = v.x; - *y = v.y; - return first ? path_cmd_move_to : path_cmd_line_to; - } - *x = *y = 0.0; - if(m_closed && !m_stop) - { - m_stop = true; - return path_cmd_end_poly | path_flags_close; - } - return path_cmd_stop; - } - - private: - const Container* m_container; - unsigned m_index; - bool m_closed; - bool m_stop; - }; - - - - //-----------------------------------------poly_container_reverse_adaptor - template class poly_container_reverse_adaptor - { - public: - typedef typename Container::value_type vertex_type; - - poly_container_reverse_adaptor() : - m_container(0), - m_index(-1), - m_closed(false), - m_stop(false) - {} - - poly_container_reverse_adaptor(const Container& data, bool closed) : - m_container(&data), - m_index(-1), - m_closed(closed), - m_stop(false) - {} - - void init(const Container& data, bool closed) - { - m_container = &data; - m_index = m_container->size() - 1; - m_closed = closed; - m_stop = false; - } - - void rewind(unsigned) - { - m_index = m_container->size() - 1; - m_stop = false; - } - - unsigned vertex(double* x, double* y) - { - if(m_index >= 0) - { - bool first = m_index == int(m_container->size() - 1); - const vertex_type& v = (*m_container)[m_index--]; - *x = v.x; - *y = v.y; - return first ? path_cmd_move_to : path_cmd_line_to; - } - *x = *y = 0.0; - if(m_closed && !m_stop) - { - m_stop = true; - return path_cmd_end_poly | path_flags_close; - } - return path_cmd_stop; - } - - private: - const Container* m_container; - int m_index; - bool m_closed; - bool m_stop; - }; - - - - - - //--------------------------------------------------------line_adaptor - class line_adaptor - { - public: - typedef double value_type; - - line_adaptor() : m_line(m_coord, 2, false) {} - line_adaptor(double x1, double y1, double x2, double y2) : - m_line(m_coord, 2, false) - { - m_coord[0] = x1; - m_coord[1] = y1; - m_coord[2] = x2; - m_coord[3] = y2; - } - - void init(double x1, double y1, double x2, double y2) - { - m_coord[0] = x1; - m_coord[1] = y1; - m_coord[2] = x2; - m_coord[3] = y2; - m_line.rewind(0); - } - - void rewind(unsigned) - { - m_line.rewind(0); - } - - unsigned vertex(double* x, double* y) - { - return m_line.vertex(x, y); - } - - private: - double m_coord[4]; - poly_plain_adaptor m_line; - }; - - - - - - - - - - - - - - //---------------------------------------------------------------path_base - // A container to store vertices with their flags. - // A path consists of a number of contours separated with "move_to" - // commands. The path storage can keep and maintain more than one - // path. - // To navigate to the beginning of a particular path, use rewind(path_id); - // Where path_id is what start_new_path() returns. So, when you call - // start_new_path() you need to store its return value somewhere else - // to navigate to the path afterwards. - // - // See also: vertex_source concept - //------------------------------------------------------------------------ - template class path_base - { - public: - typedef VertexContainer container_type; - typedef path_base self_type; - - //-------------------------------------------------------------------- - path_base() : m_vertices(), m_iterator(0) {} - void remove_all() { m_vertices.remove_all(); m_iterator = 0; } - void free_all() { m_vertices.free_all(); m_iterator = 0; } - - // Make path functions - //-------------------------------------------------------------------- - unsigned start_new_path(); - - void move_to(double x, double y); - void move_rel(double dx, double dy); - - void line_to(double x, double y); - void line_rel(double dx, double dy); - - void hline_to(double x); - void hline_rel(double dx); - - void vline_to(double y); - void vline_rel(double dy); - - void arc_to(double rx, double ry, - double angle, - bool large_arc_flag, - bool sweep_flag, - double x, double y); - - void arc_rel(double rx, double ry, - double angle, - bool large_arc_flag, - bool sweep_flag, - double dx, double dy); - - void curve3(double x_ctrl, double y_ctrl, - double x_to, double y_to); - - void curve3_rel(double dx_ctrl, double dy_ctrl, - double dx_to, double dy_to); - - void curve3(double x_to, double y_to); - - void curve3_rel(double dx_to, double dy_to); - - void curve4(double x_ctrl1, double y_ctrl1, - double x_ctrl2, double y_ctrl2, - double x_to, double y_to); - - void curve4_rel(double dx_ctrl1, double dy_ctrl1, - double dx_ctrl2, double dy_ctrl2, - double dx_to, double dy_to); - - void curve4(double x_ctrl2, double y_ctrl2, - double x_to, double y_to); - - void curve4_rel(double x_ctrl2, double y_ctrl2, - double x_to, double y_to); - - - void end_poly(unsigned flags = path_flags_close); - void close_polygon(unsigned flags = path_flags_none); - - // Accessors - //-------------------------------------------------------------------- - const container_type& vertices() const { return m_vertices; } - container_type& vertices() { return m_vertices; } - - unsigned total_vertices() const; - - void rel_to_abs(double* x, double* y) const; - - unsigned last_vertex(double* x, double* y) const; - unsigned prev_vertex(double* x, double* y) const; - - double last_x() const; - double last_y() const; - - unsigned vertex(unsigned idx, double* x, double* y) const; - unsigned command(unsigned idx) const; - - void modify_vertex(unsigned idx, double x, double y); - void modify_vertex(unsigned idx, double x, double y, unsigned cmd); - void modify_command(unsigned idx, unsigned cmd); - - // VertexSource interface - //-------------------------------------------------------------------- - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - // Arrange the orientation of a polygon, all polygons in a path, - // or in all paths. After calling arrange_orientations() or - // arrange_orientations_all_paths(), all the polygons will have - // the same orientation, i.e. path_flags_cw or path_flags_ccw - //-------------------------------------------------------------------- - unsigned arrange_polygon_orientation(unsigned start, path_flags_e orientation); - unsigned arrange_orientations(unsigned path_id, path_flags_e orientation); - void arrange_orientations_all_paths(path_flags_e orientation); - void invert_polygon(unsigned start); - - // Flip all vertices horizontally or vertically, - // between x1 and x2, or between y1 and y2 respectively - //-------------------------------------------------------------------- - void flip_x(double x1, double x2); - void flip_y(double y1, double y2); - - // Concatenate path. The path is added as is. - //-------------------------------------------------------------------- - template - void concat_path(VertexSource& vs, unsigned path_id = 0) - { - double x, y; - unsigned cmd; - vs.rewind(path_id); - while(!is_stop(cmd = vs.vertex(&x, &y))) - { - m_vertices.add_vertex(x, y, cmd); - } - } - - //-------------------------------------------------------------------- - // Join path. The path is joined with the existing one, that is, - // it behaves as if the pen of a plotter was always down (drawing) - template - void join_path(VertexSource& vs, unsigned path_id = 0) - { - double x, y; - unsigned cmd; - vs.rewind(path_id); - cmd = vs.vertex(&x, &y); - if(!is_stop(cmd)) - { - if(is_vertex(cmd)) - { - double x0, y0; - unsigned cmd0 = last_vertex(&x0, &y0); - if(is_vertex(cmd0)) - { - if(calc_distance(x, y, x0, y0) > vertex_dist_epsilon) - { - if(is_move_to(cmd)) cmd = path_cmd_line_to; - m_vertices.add_vertex(x, y, cmd); - } - } - else - { - if(is_stop(cmd0)) - { - cmd = path_cmd_move_to; - } - else - { - if(is_move_to(cmd)) cmd = path_cmd_line_to; - } - m_vertices.add_vertex(x, y, cmd); - } - } - while(!is_stop(cmd = vs.vertex(&x, &y))) - { - m_vertices.add_vertex(x, y, is_move_to(cmd) ? - unsigned(path_cmd_line_to) : - cmd); - } - } - } - - // Concatenate polygon/polyline. - //-------------------------------------------------------------------- - template void concat_poly(const T* data, - unsigned num_points, - bool closed) - { - poly_plain_adaptor poly(data, num_points, closed); - concat_path(poly); - } - - // Join polygon/polyline continuously. - //-------------------------------------------------------------------- - template void join_poly(const T* data, - unsigned num_points, - bool closed) - { - poly_plain_adaptor poly(data, num_points, closed); - join_path(poly); - } - - //-------------------------------------------------------------------- - void translate(double dx, double dy, unsigned path_id=0); - void translate_all_paths(double dx, double dy); - - //-------------------------------------------------------------------- - template - void transform(const Trans& trans, unsigned path_id=0) - { - unsigned num_ver = m_vertices.total_vertices(); - for(; path_id < num_ver; path_id++) - { - double x, y; - unsigned cmd = m_vertices.vertex(path_id, &x, &y); - if(is_stop(cmd)) break; - if(is_vertex(cmd)) - { - trans.transform(&x, &y); - m_vertices.modify_vertex(path_id, x, y); - } - } - } - - //-------------------------------------------------------------------- - template - void transform_all_paths(const Trans& trans) - { - unsigned idx; - unsigned num_ver = m_vertices.total_vertices(); - for(idx = 0; idx < num_ver; idx++) - { - double x, y; - if(is_vertex(m_vertices.vertex(idx, &x, &y))) - { - trans.transform(&x, &y); - m_vertices.modify_vertex(idx, x, y); - } - } - } - - - - private: - unsigned perceive_polygon_orientation(unsigned start, unsigned end); - void invert_polygon(unsigned start, unsigned end); - - VertexContainer m_vertices; - unsigned m_iterator; - }; - - //------------------------------------------------------------------------ - template - unsigned path_base::start_new_path() - { - if(!is_stop(m_vertices.last_command())) - { - m_vertices.add_vertex(0.0, 0.0, path_cmd_stop); - } - return m_vertices.total_vertices(); - } - - - //------------------------------------------------------------------------ - template - inline void path_base::rel_to_abs(double* x, double* y) const - { - if(m_vertices.total_vertices()) - { - double x2; - double y2; - if(is_vertex(m_vertices.last_vertex(&x2, &y2))) - { - *x += x2; - *y += y2; - } - } - } - - //------------------------------------------------------------------------ - template - inline void path_base::move_to(double x, double y) - { - m_vertices.add_vertex(x, y, path_cmd_move_to); - } - - //------------------------------------------------------------------------ - template - inline void path_base::move_rel(double dx, double dy) - { - rel_to_abs(&dx, &dy); - m_vertices.add_vertex(dx, dy, path_cmd_move_to); - } - - //------------------------------------------------------------------------ - template - inline void path_base::line_to(double x, double y) - { - m_vertices.add_vertex(x, y, path_cmd_line_to); - } - - //------------------------------------------------------------------------ - template - inline void path_base::line_rel(double dx, double dy) - { - rel_to_abs(&dx, &dy); - m_vertices.add_vertex(dx, dy, path_cmd_line_to); - } - - //------------------------------------------------------------------------ - template - inline void path_base::hline_to(double x) - { - m_vertices.add_vertex(x, last_y(), path_cmd_line_to); - } - - //------------------------------------------------------------------------ - template - inline void path_base::hline_rel(double dx) - { - double dy = 0; - rel_to_abs(&dx, &dy); - m_vertices.add_vertex(dx, dy, path_cmd_line_to); - } - - //------------------------------------------------------------------------ - template - inline void path_base::vline_to(double y) - { - m_vertices.add_vertex(last_x(), y, path_cmd_line_to); - } - - //------------------------------------------------------------------------ - template - inline void path_base::vline_rel(double dy) - { - double dx = 0; - rel_to_abs(&dx, &dy); - m_vertices.add_vertex(dx, dy, path_cmd_line_to); - } - - //------------------------------------------------------------------------ - template - void path_base::arc_to(double rx, double ry, - double angle, - bool large_arc_flag, - bool sweep_flag, - double x, double y) - { - if(m_vertices.total_vertices() && is_vertex(m_vertices.last_command())) - { - const double epsilon = 1e-30; - double x0 = 0.0; - double y0 = 0.0; - m_vertices.last_vertex(&x0, &y0); - - rx = fabs(rx); - ry = fabs(ry); - - // Ensure radii are valid - //------------------------- - if(rx < epsilon || ry < epsilon) - { - line_to(x, y); - return; - } - - if(calc_distance(x0, y0, x, y) < epsilon) - { - // If the endpoints (x, y) and (x0, y0) are identical, then this - // is equivalent to omitting the elliptical arc segment entirely. - return; - } - bezier_arc_svg a(x0, y0, rx, ry, angle, large_arc_flag, sweep_flag, x, y); - if(a.radii_ok()) - { - join_path(a); - } - else - { - line_to(x, y); - } - } - else - { - move_to(x, y); - } - } - - //------------------------------------------------------------------------ - template - void path_base::arc_rel(double rx, double ry, - double angle, - bool large_arc_flag, - bool sweep_flag, - double dx, double dy) - { - rel_to_abs(&dx, &dy); - arc_to(rx, ry, angle, large_arc_flag, sweep_flag, dx, dy); - } - - //------------------------------------------------------------------------ - template - void path_base::curve3(double x_ctrl, double y_ctrl, - double x_to, double y_to) - { - m_vertices.add_vertex(x_ctrl, y_ctrl, path_cmd_curve3); - m_vertices.add_vertex(x_to, y_to, path_cmd_curve3); - } - - //------------------------------------------------------------------------ - template - void path_base::curve3_rel(double dx_ctrl, double dy_ctrl, - double dx_to, double dy_to) - { - rel_to_abs(&dx_ctrl, &dy_ctrl); - rel_to_abs(&dx_to, &dy_to); - m_vertices.add_vertex(dx_ctrl, dy_ctrl, path_cmd_curve3); - m_vertices.add_vertex(dx_to, dy_to, path_cmd_curve3); - } - - //------------------------------------------------------------------------ - template - void path_base::curve3(double x_to, double y_to) - { - double x0; - double y0; - if(is_vertex(m_vertices.last_vertex(&x0, &y0))) - { - double x_ctrl; - double y_ctrl; - unsigned cmd = m_vertices.prev_vertex(&x_ctrl, &y_ctrl); - if(is_curve(cmd)) - { - x_ctrl = x0 + x0 - x_ctrl; - y_ctrl = y0 + y0 - y_ctrl; - } - else - { - x_ctrl = x0; - y_ctrl = y0; - } - curve3(x_ctrl, y_ctrl, x_to, y_to); - } - } - - //------------------------------------------------------------------------ - template - void path_base::curve3_rel(double dx_to, double dy_to) - { - rel_to_abs(&dx_to, &dy_to); - curve3(dx_to, dy_to); - } - - //------------------------------------------------------------------------ - template - void path_base::curve4(double x_ctrl1, double y_ctrl1, - double x_ctrl2, double y_ctrl2, - double x_to, double y_to) - { - m_vertices.add_vertex(x_ctrl1, y_ctrl1, path_cmd_curve4); - m_vertices.add_vertex(x_ctrl2, y_ctrl2, path_cmd_curve4); - m_vertices.add_vertex(x_to, y_to, path_cmd_curve4); - } - - //------------------------------------------------------------------------ - template - void path_base::curve4_rel(double dx_ctrl1, double dy_ctrl1, - double dx_ctrl2, double dy_ctrl2, - double dx_to, double dy_to) - { - rel_to_abs(&dx_ctrl1, &dy_ctrl1); - rel_to_abs(&dx_ctrl2, &dy_ctrl2); - rel_to_abs(&dx_to, &dy_to); - m_vertices.add_vertex(dx_ctrl1, dy_ctrl1, path_cmd_curve4); - m_vertices.add_vertex(dx_ctrl2, dy_ctrl2, path_cmd_curve4); - m_vertices.add_vertex(dx_to, dy_to, path_cmd_curve4); - } - - //------------------------------------------------------------------------ - template - void path_base::curve4(double x_ctrl2, double y_ctrl2, - double x_to, double y_to) - { - double x0; - double y0; - if(is_vertex(last_vertex(&x0, &y0))) - { - double x_ctrl1; - double y_ctrl1; - unsigned cmd = prev_vertex(&x_ctrl1, &y_ctrl1); - if(is_curve(cmd)) - { - x_ctrl1 = x0 + x0 - x_ctrl1; - y_ctrl1 = y0 + y0 - y_ctrl1; - } - else - { - x_ctrl1 = x0; - y_ctrl1 = y0; - } - curve4(x_ctrl1, y_ctrl1, x_ctrl2, y_ctrl2, x_to, y_to); - } - } - - //------------------------------------------------------------------------ - template - void path_base::curve4_rel(double dx_ctrl2, double dy_ctrl2, - double dx_to, double dy_to) - { - rel_to_abs(&dx_ctrl2, &dy_ctrl2); - rel_to_abs(&dx_to, &dy_to); - curve4(dx_ctrl2, dy_ctrl2, dx_to, dy_to); - } - - //------------------------------------------------------------------------ - template - inline void path_base::end_poly(unsigned flags) - { - if(is_vertex(m_vertices.last_command())) - { - m_vertices.add_vertex(0.0, 0.0, path_cmd_end_poly | flags); - } - } - - //------------------------------------------------------------------------ - template - inline void path_base::close_polygon(unsigned flags) - { - end_poly(path_flags_close | flags); - } - - //------------------------------------------------------------------------ - template - inline unsigned path_base::total_vertices() const - { - return m_vertices.total_vertices(); - } - - //------------------------------------------------------------------------ - template - inline unsigned path_base::last_vertex(double* x, double* y) const - { - return m_vertices.last_vertex(x, y); - } - - //------------------------------------------------------------------------ - template - inline unsigned path_base::prev_vertex(double* x, double* y) const - { - return m_vertices.prev_vertex(x, y); - } - - //------------------------------------------------------------------------ - template - inline double path_base::last_x() const - { - return m_vertices.last_x(); - } - - //------------------------------------------------------------------------ - template - inline double path_base::last_y() const - { - return m_vertices.last_y(); - } - - //------------------------------------------------------------------------ - template - inline unsigned path_base::vertex(unsigned idx, double* x, double* y) const - { - return m_vertices.vertex(idx, x, y); - } - - //------------------------------------------------------------------------ - template - inline unsigned path_base::command(unsigned idx) const - { - return m_vertices.command(idx); - } - - //------------------------------------------------------------------------ - template - void path_base::modify_vertex(unsigned idx, double x, double y) - { - m_vertices.modify_vertex(idx, x, y); - } - - //------------------------------------------------------------------------ - template - void path_base::modify_vertex(unsigned idx, double x, double y, unsigned cmd) - { - m_vertices.modify_vertex(idx, x, y, cmd); - } - - //------------------------------------------------------------------------ - template - void path_base::modify_command(unsigned idx, unsigned cmd) - { - m_vertices.modify_command(idx, cmd); - } - - //------------------------------------------------------------------------ - template - inline void path_base::rewind(unsigned path_id) - { - m_iterator = path_id; - } - - //------------------------------------------------------------------------ - template - inline unsigned path_base::vertex(double* x, double* y) - { - if(m_iterator >= m_vertices.total_vertices()) return path_cmd_stop; - return m_vertices.vertex(m_iterator++, x, y); - } - - //------------------------------------------------------------------------ - template - unsigned path_base::perceive_polygon_orientation(unsigned start, - unsigned end) - { - // Calculate signed area (double area to be exact) - //--------------------- - unsigned np = end - start; - double area = 0.0; - unsigned i; - for(i = 0; i < np; i++) - { - double x1, y1, x2, y2; - m_vertices.vertex(start + i, &x1, &y1); - m_vertices.vertex(start + (i + 1) % np, &x2, &y2); - area += x1 * y2 - y1 * x2; - } - return (area < 0.0) ? path_flags_cw : path_flags_ccw; - } - - //------------------------------------------------------------------------ - template - void path_base::invert_polygon(unsigned start, unsigned end) - { - unsigned i; - unsigned tmp_cmd = m_vertices.command(start); - - --end; // Make "end" inclusive - - // Shift all commands to one position - for(i = start; i < end; i++) - { - m_vertices.modify_command(i, m_vertices.command(i + 1)); - } - - // Assign starting command to the ending command - m_vertices.modify_command(end, tmp_cmd); - - // Reverse the polygon - while(end > start) - { - m_vertices.swap_vertices(start++, end--); - } - } - - //------------------------------------------------------------------------ - template - void path_base::invert_polygon(unsigned start) - { - // Skip all non-vertices at the beginning - while(start < m_vertices.total_vertices() && - !is_vertex(m_vertices.command(start))) ++start; - - // Skip all insignificant move_to - while(start+1 < m_vertices.total_vertices() && - is_move_to(m_vertices.command(start)) && - is_move_to(m_vertices.command(start+1))) ++start; - - // Find the last vertex - unsigned end = start + 1; - while(end < m_vertices.total_vertices() && - !is_next_poly(m_vertices.command(end))) ++end; - - invert_polygon(start, end); - } - - //------------------------------------------------------------------------ - template - unsigned path_base::arrange_polygon_orientation(unsigned start, - path_flags_e orientation) - { - if(orientation == path_flags_none) return start; - - // Skip all non-vertices at the beginning - while(start < m_vertices.total_vertices() && - !is_vertex(m_vertices.command(start))) ++start; - - // Skip all insignificant move_to - while(start+1 < m_vertices.total_vertices() && - is_move_to(m_vertices.command(start)) && - is_move_to(m_vertices.command(start+1))) ++start; - - // Find the last vertex - unsigned end = start + 1; - while(end < m_vertices.total_vertices() && - !is_next_poly(m_vertices.command(end))) ++end; - - if(end - start > 2) - { - if(perceive_polygon_orientation(start, end) != unsigned(orientation)) - { - // Invert polygon, set orientation flag, and skip all end_poly - invert_polygon(start, end); - unsigned cmd; - while(end < m_vertices.total_vertices() && - is_end_poly(cmd = m_vertices.command(end))) - { - m_vertices.modify_command(end++, set_orientation(cmd, orientation)); - } - } - } - return end; - } - - //------------------------------------------------------------------------ - template - unsigned path_base::arrange_orientations(unsigned start, - path_flags_e orientation) - { - if(orientation != path_flags_none) - { - while(start < m_vertices.total_vertices()) - { - start = arrange_polygon_orientation(start, orientation); - if(is_stop(m_vertices.command(start))) - { - ++start; - break; - } - } - } - return start; - } - - //------------------------------------------------------------------------ - template - void path_base::arrange_orientations_all_paths(path_flags_e orientation) - { - if(orientation != path_flags_none) - { - unsigned start = 0; - while(start < m_vertices.total_vertices()) - { - start = arrange_orientations(start, orientation); - } - } - } - - //------------------------------------------------------------------------ - template - void path_base::flip_x(double x1, double x2) - { - unsigned i; - double x, y; - for(i = 0; i < m_vertices.total_vertices(); i++) - { - unsigned cmd = m_vertices.vertex(i, &x, &y); - if(is_vertex(cmd)) - { - m_vertices.modify_vertex(i, x2 - x + x1, y); - } - } - } - - //------------------------------------------------------------------------ - template - void path_base::flip_y(double y1, double y2) - { - unsigned i; - double x, y; - for(i = 0; i < m_vertices.total_vertices(); i++) - { - unsigned cmd = m_vertices.vertex(i, &x, &y); - if(is_vertex(cmd)) - { - m_vertices.modify_vertex(i, x, y2 - y + y1); - } - } - } - - //------------------------------------------------------------------------ - template - void path_base::translate(double dx, double dy, unsigned path_id) - { - unsigned num_ver = m_vertices.total_vertices(); - for(; path_id < num_ver; path_id++) - { - double x, y; - unsigned cmd = m_vertices.vertex(path_id, &x, &y); - if(is_stop(cmd)) break; - if(is_vertex(cmd)) - { - x += dx; - y += dy; - m_vertices.modify_vertex(path_id, x, y); - } - } - } - - //------------------------------------------------------------------------ - template - void path_base::translate_all_paths(double dx, double dy) - { - unsigned idx; - unsigned num_ver = m_vertices.total_vertices(); - for(idx = 0; idx < num_ver; idx++) - { - double x, y; - if(is_vertex(m_vertices.vertex(idx, &x, &y))) - { - x += dx; - y += dy; - m_vertices.modify_vertex(idx, x, y); - } - } - } - - //-----------------------------------------------------vertex_stl_storage - template class vertex_stl_storage - { - public: - typedef typename Container::value_type vertex_type; - typedef typename vertex_type::value_type value_type; - - void remove_all() { m_vertices.clear(); } - void free_all() { m_vertices.clear(); } - - void add_vertex(double x, double y, unsigned cmd) - { - m_vertices.push_back(vertex_type(value_type(x), - value_type(y), - int8u(cmd))); - } - - void modify_vertex(unsigned idx, double x, double y) - { - vertex_type& v = m_vertices[idx]; - v.x = value_type(x); - v.y = value_type(y); - } - - void modify_vertex(unsigned idx, double x, double y, unsigned cmd) - { - vertex_type& v = m_vertices[idx]; - v.x = value_type(x); - v.y = value_type(y); - v.cmd = int8u(cmd); - } - - void modify_command(unsigned idx, unsigned cmd) - { - m_vertices[idx].cmd = int8u(cmd); - } - - void swap_vertices(unsigned v1, unsigned v2) - { - vertex_type t = m_vertices[v1]; - m_vertices[v1] = m_vertices[v2]; - m_vertices[v2] = t; - } - - unsigned last_command() const - { - return m_vertices.size() ? - m_vertices[m_vertices.size() - 1].cmd : - path_cmd_stop; - } - - unsigned last_vertex(double* x, double* y) const - { - if(m_vertices.size() == 0) - { - *x = *y = 0.0; - return path_cmd_stop; - } - return vertex(m_vertices.size() - 1, x, y); - } - - unsigned prev_vertex(double* x, double* y) const - { - if(m_vertices.size() < 2) - { - *x = *y = 0.0; - return path_cmd_stop; - } - return vertex(m_vertices.size() - 2, x, y); - } - - double last_x() const - { - return m_vertices.size() ? m_vertices[m_vertices.size() - 1].x : 0.0; - } - - double last_y() const - { - return m_vertices.size() ? m_vertices[m_vertices.size() - 1].y : 0.0; - } - - unsigned total_vertices() const - { - return m_vertices.size(); - } - - unsigned vertex(unsigned idx, double* x, double* y) const - { - const vertex_type& v = m_vertices[idx]; - *x = v.x; - *y = v.y; - return v.cmd; - } - - unsigned command(unsigned idx) const - { - return m_vertices[idx].cmd; - } - - private: - Container m_vertices; - }; - - //-----------------------------------------------------------path_storage - typedef path_base > path_storage; - - // Example of declarations path_storage with pod_bvector as a container - //----------------------------------------------------------------------- - //typedef path_base > > path_storage; - -} - - - -// Example of declarations path_storage with std::vector as a container -//--------------------------------------------------------------------------- -//#include -//namespace agg -//{ -// typedef path_base > > stl_path_storage; -//} - - - - -#endif diff --git a/uppdev/aggdraw/agg_path_storage_integer.h b/uppdev/aggdraw/agg_path_storage_integer.h deleted file mode 100644 index 301e5f8af..000000000 --- a/uppdev/aggdraw/agg_path_storage_integer.h +++ /dev/null @@ -1,304 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_PATH_STORAGE_INTEGER_INCLUDED -#define AGG_PATH_STORAGE_INTEGER_INCLUDED - -#include -#include "agg_array.h" - -namespace agg -{ - //---------------------------------------------------------vertex_integer - template struct vertex_integer - { - enum path_cmd - { - cmd_move_to = 0, - cmd_line_to = 1, - cmd_curve3 = 2, - cmd_curve4 = 3 - }; - - enum coord_scale_e - { - coord_shift = CoordShift, - coord_scale = 1 << coord_shift - }; - - T x,y; - vertex_integer() {} - vertex_integer(T x_, T y_, unsigned flag) : - x(((x_ << 1) & ~1) | (flag & 1)), - y(((y_ << 1) & ~1) | (flag >> 1)) {} - - unsigned vertex(double* x_, double* y_, - double dx=0, double dy=0, - double scale=1.0) const - { - *x_ = dx + (double(x >> 1) / coord_scale) * scale; - *y_ = dy + (double(y >> 1) / coord_scale) * scale; - switch(((y & 1) << 1) | (x & 1)) - { - case cmd_move_to: return path_cmd_move_to; - case cmd_line_to: return path_cmd_line_to; - case cmd_curve3: return path_cmd_curve3; - case cmd_curve4: return path_cmd_curve4; - } - return path_cmd_stop; - } - }; - - - //---------------------------------------------------path_storage_integer - template class path_storage_integer - { - public: - typedef T value_type; - typedef vertex_integer vertex_integer_type; - - //-------------------------------------------------------------------- - path_storage_integer() : m_storage(), m_vertex_idx(0), m_closed(true) {} - - //-------------------------------------------------------------------- - void remove_all() { m_storage.remove_all(); } - - //-------------------------------------------------------------------- - void move_to(T x, T y) - { - m_storage.add(vertex_integer_type(x, y, vertex_integer_type::cmd_move_to)); - } - - //-------------------------------------------------------------------- - void line_to(T x, T y) - { - m_storage.add(vertex_integer_type(x, y, vertex_integer_type::cmd_line_to)); - } - - //-------------------------------------------------------------------- - void curve3(T x_ctrl, T y_ctrl, - T x_to, T y_to) - { - m_storage.add(vertex_integer_type(x_ctrl, y_ctrl, vertex_integer_type::cmd_curve3)); - m_storage.add(vertex_integer_type(x_to, y_to, vertex_integer_type::cmd_curve3)); - } - - //-------------------------------------------------------------------- - void curve4(T x_ctrl1, T y_ctrl1, - T x_ctrl2, T y_ctrl2, - T x_to, T y_to) - { - m_storage.add(vertex_integer_type(x_ctrl1, y_ctrl1, vertex_integer_type::cmd_curve4)); - m_storage.add(vertex_integer_type(x_ctrl2, y_ctrl2, vertex_integer_type::cmd_curve4)); - m_storage.add(vertex_integer_type(x_to, y_to, vertex_integer_type::cmd_curve4)); - } - - //-------------------------------------------------------------------- - void close_polygon() {} - - //-------------------------------------------------------------------- - unsigned size() const { return m_storage.size(); } - unsigned vertex(unsigned idx, double* x, double* y) const - { - return m_storage[idx].vertex(x, y); - } - - //-------------------------------------------------------------------- - unsigned byte_size() const { return m_storage.size() * sizeof(vertex_integer_type); } - void serialize(int8u* ptr) const - { - unsigned i; - for(i = 0; i < m_storage.size(); i++) - { - memcpy(ptr, &m_storage[i], sizeof(vertex_integer_type)); - ptr += sizeof(vertex_integer_type); - } - } - - //-------------------------------------------------------------------- - void rewind(unsigned) - { - m_vertex_idx = 0; - m_closed = true; - } - - //-------------------------------------------------------------------- - unsigned vertex(double* x, double* y) - { - if(m_storage.size() < 2 || m_vertex_idx > m_storage.size()) - { - *x = 0; - *y = 0; - return path_cmd_stop; - } - if(m_vertex_idx == m_storage.size()) - { - *x = 0; - *y = 0; - ++m_vertex_idx; - return path_cmd_end_poly | path_flags_close; - } - unsigned cmd = m_storage[m_vertex_idx].vertex(x, y); - if(is_move_to(cmd) && !m_closed) - { - *x = 0; - *y = 0; - m_closed = true; - return path_cmd_end_poly | path_flags_close; - } - m_closed = false; - ++m_vertex_idx; - return cmd; - } - - //-------------------------------------------------------------------- - rect_d bounding_rect() const - { - rect_d bounds(1e100, 1e100, -1e100, -1e100); - if(m_storage.size() == 0) - { - bounds.x1 = bounds.y1 = bounds.x2 = bounds.y2 = 0.0; - } - else - { - unsigned i; - for(i = 0; i < m_storage.size(); i++) - { - double x, y; - m_storage[i].vertex(&x, &y); - if(x < bounds.x1) bounds.x1 = x; - if(y < bounds.y1) bounds.y1 = y; - if(x > bounds.x2) bounds.x2 = x; - if(y > bounds.y2) bounds.y2 = y; - } - } - return bounds; - } - - private: - pod_bvector m_storage; - unsigned m_vertex_idx; - bool m_closed; - }; - - - - - //-----------------------------------------serialized_integer_path_adaptor - template class serialized_integer_path_adaptor - { - public: - typedef vertex_integer vertex_integer_type; - - //-------------------------------------------------------------------- - serialized_integer_path_adaptor() : - m_data(0), - m_end(0), - m_ptr(0), - m_dx(0.0), - m_dy(0.0), - m_scale(1.0), - m_vertices(0) - {} - - //-------------------------------------------------------------------- - serialized_integer_path_adaptor(const int8u* data, unsigned size, - double dx, double dy) : - m_data(data), - m_end(data + size), - m_ptr(data), - m_dx(dx), - m_dy(dy), - m_vertices(0) - {} - - //-------------------------------------------------------------------- - void init(const int8u* data, unsigned size, - double dx, double dy, double scale=1.0) - { - m_data = data; - m_end = data + size; - m_ptr = data; - m_dx = dx; - m_dy = dy; - m_scale = scale; - m_vertices = 0; - } - - - //-------------------------------------------------------------------- - void rewind(unsigned) - { - m_ptr = m_data; - m_vertices = 0; - } - - //-------------------------------------------------------------------- - unsigned vertex(double* x, double* y) - { - if(m_data == 0 || m_ptr > m_end) - { - *x = 0; - *y = 0; - return path_cmd_stop; - } - - if(m_ptr == m_end) - { - *x = 0; - *y = 0; - m_ptr += sizeof(vertex_integer_type); - return path_cmd_end_poly | path_flags_close; - } - - vertex_integer_type v; - memcpy(&v, m_ptr, sizeof(vertex_integer_type)); - unsigned cmd = v.vertex(x, y, m_dx, m_dy, m_scale); - if(is_move_to(cmd) && m_vertices > 2) - { - *x = 0; - *y = 0; - m_vertices = 0; - return path_cmd_end_poly | path_flags_close; - } - ++m_vertices; - m_ptr += sizeof(vertex_integer_type); - return cmd; - } - - private: - const int8u* m_data; - const int8u* m_end; - const int8u* m_ptr; - double m_dx; - double m_dy; - double m_scale; - unsigned m_vertices; - }; - -} - - -#endif - diff --git a/uppdev/aggdraw/agg_pattern_filters_rgba.h b/uppdev/aggdraw/agg_pattern_filters_rgba.h deleted file mode 100644 index a58cb66f5..000000000 --- a/uppdev/aggdraw/agg_pattern_filters_rgba.h +++ /dev/null @@ -1,132 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_PATTERN_FILTERS_RGBA8_INCLUDED -#define AGG_PATTERN_FILTERS_RGBA8_INCLUDED - -#include "agg_basics.h" -#include "agg_line_aa_basics.h" -#include "agg_color_rgba.h" - - -namespace agg -{ - - //=======================================================pattern_filter_nn - template struct pattern_filter_nn - { - typedef ColorT color_type; - static unsigned dilation() { return 0; } - - static void AGG_INLINE pixel_low_res(color_type const* const* buf, - color_type* p, int x, int y) - { - *p = buf[y][x]; - } - - static void AGG_INLINE pixel_high_res(color_type const* const* buf, - color_type* p, int x, int y) - { - *p = buf[y >> line_subpixel_shift] - [x >> line_subpixel_shift]; - } - }; - - typedef pattern_filter_nn pattern_filter_nn_rgba8; - typedef pattern_filter_nn pattern_filter_nn_rgba16; - - - //===========================================pattern_filter_bilinear_rgba - template struct pattern_filter_bilinear_rgba - { - typedef ColorT color_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - - - static unsigned dilation() { return 1; } - - static AGG_INLINE void pixel_low_res(color_type const* const* buf, - color_type* p, int x, int y) - { - *p = buf[y][x]; - } - - static AGG_INLINE void pixel_high_res(color_type const* const* buf, - color_type* p, int x, int y) - { - calc_type r, g, b, a; - r = g = b = a = line_subpixel_scale * line_subpixel_scale / 2; - - calc_type weight; - int x_lr = x >> line_subpixel_shift; - int y_lr = y >> line_subpixel_shift; - - x &= line_subpixel_mask; - y &= line_subpixel_mask; - const color_type* ptr = buf[y_lr] + x_lr; - - weight = (line_subpixel_scale - x) * - (line_subpixel_scale - y); - r += weight * ptr->r; - g += weight * ptr->g; - b += weight * ptr->b; - a += weight * ptr->a; - - ++ptr; - - weight = x * (line_subpixel_scale - y); - r += weight * ptr->r; - g += weight * ptr->g; - b += weight * ptr->b; - a += weight * ptr->a; - - ptr = buf[y_lr + 1] + x_lr; - - weight = (line_subpixel_scale - x) * y; - r += weight * ptr->r; - g += weight * ptr->g; - b += weight * ptr->b; - a += weight * ptr->a; - - ++ptr; - - weight = x * y; - r += weight * ptr->r; - g += weight * ptr->g; - b += weight * ptr->b; - a += weight * ptr->a; - - p->r = (value_type)(r >> line_subpixel_shift * 2); - p->g = (value_type)(g >> line_subpixel_shift * 2); - p->b = (value_type)(b >> line_subpixel_shift * 2); - p->a = (value_type)(a >> line_subpixel_shift * 2); - } - }; - - typedef pattern_filter_bilinear_rgba pattern_filter_bilinear_rgba8; - typedef pattern_filter_bilinear_rgba pattern_filter_bilinear_rgba16; -} - -#endif diff --git a/uppdev/aggdraw/agg_pixfmt_amask_adaptor.h b/uppdev/aggdraw/agg_pixfmt_amask_adaptor.h deleted file mode 100644 index 66d7bb1b3..000000000 --- a/uppdev/aggdraw/agg_pixfmt_amask_adaptor.h +++ /dev/null @@ -1,249 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_PIXFMT_AMASK_ADAPTOR_INCLUDED -#define AGG_PIXFMT_AMASK_ADAPTOR_INCLUDED - - -#include -#include "agg_array.h" -#include "agg_rendering_buffer.h" - - -namespace agg -{ - //==================================================pixfmt_amask_adaptor - template class pixfmt_amask_adaptor - { - public: - typedef PixFmt pixfmt_type; - typedef typename pixfmt_type::color_type color_type; - typedef typename pixfmt_type::row_data row_data; - typedef AlphaMask amask_type; - typedef typename amask_type::cover_type cover_type; - - private: - enum span_extra_tail_e { span_extra_tail = 256 }; - - void realloc_span(unsigned len) - { - if(len > m_span.size()) - { - m_span.resize(len + span_extra_tail); - } - } - - void init_span(unsigned len) - { - realloc_span(len); - memset(&m_span[0], amask_type::cover_full, len * sizeof(cover_type)); - } - - void init_span(unsigned len, const cover_type* covers) - { - realloc_span(len); - memcpy(&m_span[0], covers, len * sizeof(cover_type)); - } - - - public: - pixfmt_amask_adaptor(pixfmt_type& pixf, const amask_type& mask) : - m_pixf(&pixf), m_mask(&mask), m_span() - {} - - void attach_pixfmt(pixfmt_type& pixf) { m_pixf = &pixf; } - void attach_alpha_mask(const amask_type& mask) { m_mask = &mask; } - - //-------------------------------------------------------------------- - template - bool attach_pixfmt(PixFmt2& pixf, int x1, int y1, int x2, int y2) - { - return m_pixf->attach(pixf, x1, y1, x2, y2); - } - - //-------------------------------------------------------------------- - unsigned width() const { return m_pixf->width(); } - unsigned height() const { return m_pixf->height(); } - - //-------------------------------------------------------------------- - color_type pixel(int x, int y) - { - return m_pixf->pixel(x, y); - } - - //-------------------------------------------------------------------- - void copy_pixel(int x, int y, const color_type& c) - { - m_pixf->blend_pixel(x, y, c, m_mask->pixel(x, y)); - } - - //-------------------------------------------------------------------- - void blend_pixel(int x, int y, const color_type& c, cover_type cover) - { - m_pixf->blend_pixel(x, y, c, m_mask->combine_pixel(x, y, cover)); - } - - //-------------------------------------------------------------------- - void copy_hline(int x, int y, - unsigned len, - const color_type& c) - { - realloc_span(len); - m_mask->fill_hspan(x, y, &m_span[0], len); - m_pixf->blend_solid_hspan(x, y, len, c, &m_span[0]); - } - - //-------------------------------------------------------------------- - void blend_hline(int x, int y, - unsigned len, - const color_type& c, - cover_type cover) - { - init_span(len); - m_mask->combine_hspan(x, y, &m_span[0], len); - m_pixf->blend_solid_hspan(x, y, len, c, &m_span[0]); - } - - //-------------------------------------------------------------------- - void copy_vline(int x, int y, - unsigned len, - const color_type& c) - { - realloc_span(len); - m_mask->fill_vspan(x, y, &m_span[0], len); - m_pixf->blend_solid_vspan(x, y, len, c, &m_span[0]); - } - - //-------------------------------------------------------------------- - void blend_vline(int x, int y, - unsigned len, - const color_type& c, - cover_type cover) - { - init_span(len); - m_mask->combine_vspan(x, y, &m_span[0], len); - m_pixf->blend_solid_vspan(x, y, len, c, &m_span[0]); - } - - //-------------------------------------------------------------------- - void copy_from(const rendering_buffer& from, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len) - { - m_pixf->copy_from(from, xdst, ydst, xsrc, ysrc, len); - } - - - //-------------------------------------------------------------------- - void blend_solid_hspan(int x, int y, - unsigned len, - const color_type& c, - const cover_type* covers) - { - init_span(len, covers); - m_mask->combine_hspan(x, y, &m_span[0], len); - m_pixf->blend_solid_hspan(x, y, len, c, &m_span[0]); - } - - - //-------------------------------------------------------------------- - void blend_solid_vspan(int x, int y, - unsigned len, - const color_type& c, - const cover_type* covers) - { - init_span(len, covers); - m_mask->combine_vspan(x, y, &m_span[0], len); - m_pixf->blend_solid_vspan(x, y, len, c, &m_span[0]); - } - - - //-------------------------------------------------------------------- - void copy_color_hspan(int x, int y, unsigned len, const color_type* colors) - { - realloc_span(len); - m_mask->fill_hspan(x, y, &m_span[0], len); - m_pixf->blend_color_hspan(x, y, len, colors, &m_span[0], cover_full); - } - - //-------------------------------------------------------------------- - void copy_color_vspan(int x, int y, unsigned len, const color_type* colors) - { - realloc_span(len); - m_mask->fill_vspan(x, y, &m_span[0], len); - m_pixf->blend_color_vspan(x, y, len, colors, &m_span[0], cover_full); - } - - //-------------------------------------------------------------------- - void blend_color_hspan(int x, int y, - unsigned len, - const color_type* colors, - const cover_type* covers, - cover_type cover = cover_full) - { - if(covers) - { - init_span(len, covers); - m_mask->combine_hspan(x, y, &m_span[0], len); - } - else - { - realloc_span(len); - m_mask->fill_hspan(x, y, &m_span[0], len); - } - m_pixf->blend_color_hspan(x, y, len, colors, &m_span[0], cover); - } - - - //-------------------------------------------------------------------- - void blend_color_vspan(int x, int y, - unsigned len, - const color_type* colors, - const cover_type* covers, - cover_type cover = cover_full) - { - if(covers) - { - init_span(len, covers); - m_mask->combine_vspan(x, y, &m_span[0], len); - } - else - { - realloc_span(len); - m_mask->fill_vspan(x, y, &m_span[0], len); - } - m_pixf->blend_color_vspan(x, y, len, colors, &m_span[0], cover); - } - - private: - pixfmt_type* m_pixf; - const amask_type* m_mask; - pod_array m_span; - }; - -} - -#endif - diff --git a/uppdev/aggdraw/agg_pixfmt_gray.h b/uppdev/aggdraw/agg_pixfmt_gray.h deleted file mode 100644 index 5870b9523..000000000 --- a/uppdev/aggdraw/agg_pixfmt_gray.h +++ /dev/null @@ -1,679 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// Adaptation for high precision colors has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- - -#ifndef AGG_PIXFMT_GRAY_INCLUDED -#define AGG_PIXFMT_GRAY_INCLUDED - -#include -#include "agg_basics.h" -#include "agg_color_gray.h" -#include "agg_rendering_buffer.h" - -namespace agg -{ - - //============================================================blender_gray - template struct blender_gray - { - typedef ColorT color_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e { base_shift = color_type::base_shift }; - - static AGG_INLINE void blend_pix(value_type* p, unsigned cv, - unsigned alpha, unsigned cover=0) - { - *p = (value_type)((((cv - calc_type(*p)) * alpha) + (calc_type(*p) << base_shift)) >> base_shift); - } - }; - - - //======================================================blender_gray_pre - template struct blender_gray_pre - { - typedef ColorT color_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e { base_shift = color_type::base_shift }; - - static AGG_INLINE void blend_pix(value_type* p, unsigned cv, - unsigned alpha, unsigned cover) - { - alpha = color_type::base_mask - alpha; - cover = (cover + 1) << (base_shift - 8); - *p = (value_type)((*p * alpha + cv * cover) >> base_shift); - } - - static AGG_INLINE void blend_pix(value_type* p, unsigned cv, - unsigned alpha) - { - *p = (value_type)(((*p * (color_type::base_mask - alpha)) >> base_shift) + cv); - } - }; - - - - //=====================================================apply_gamma_dir_gray - template class apply_gamma_dir_gray - { - public: - typedef typename ColorT::value_type value_type; - - apply_gamma_dir_gray(const GammaLut& gamma) : m_gamma(gamma) {} - - AGG_INLINE void operator () (value_type* p) - { - *p = m_gamma.dir(*p); - } - - private: - const GammaLut& m_gamma; - }; - - - - //=====================================================apply_gamma_inv_gray - template class apply_gamma_inv_gray - { - public: - typedef typename ColorT::value_type value_type; - - apply_gamma_inv_gray(const GammaLut& gamma) : m_gamma(gamma) {} - - AGG_INLINE void operator () (value_type* p) - { - *p = m_gamma.inv(*p); - } - - private: - const GammaLut& m_gamma; - }; - - - - //=================================================pixfmt_alpha_blend_gray - template - class pixfmt_alpha_blend_gray - { - public: - typedef RenBuf rbuf_type; - typedef typename rbuf_type::row_data row_data; - typedef Blender blender_type; - typedef typename blender_type::color_type color_type; - typedef int order_type; // A fake one - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_scale = color_type::base_scale, - base_mask = color_type::base_mask, - pix_width = sizeof(value_type), - pix_step = Step, - pix_offset = Offset - }; - - private: - //-------------------------------------------------------------------- - static AGG_INLINE void copy_or_blend_pix(value_type* p, - const color_type& c, - unsigned cover) - { - if (c.a) - { - calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8; - if(alpha == base_mask) - { - *p = c.v; - } - else - { - Blender::blend_pix(p, c.v, alpha, cover); - } - } - } - - - static AGG_INLINE void copy_or_blend_pix(value_type* p, - const color_type& c) - { - if (c.a) - { - if(c.a == base_mask) - { - *p = c.v; - } - else - { - Blender::blend_pix(p, c.v, c.a); - } - } - } - - - public: - //-------------------------------------------------------------------- - explicit pixfmt_alpha_blend_gray(rbuf_type& rb) : - m_rbuf(&rb) - {} - void attach(rbuf_type& rb) { m_rbuf = &rb; } - //-------------------------------------------------------------------- - - template - bool attach(PixFmt& pixf, int x1, int y1, int x2, int y2) - { - rect_i r(x1, y1, x2, y2); - if(r.clip(rect_i(0, 0, pixf.width()-1, pixf.height()-1))) - { - int stride = pixf.stride(); - m_rbuf->attach(pixf.pix_ptr(r.x1, stride < 0 ? r.y2 : r.y1), - (r.x2 - r.x1) + 1, - (r.y2 - r.y1) + 1, - stride); - return true; - } - return false; - } - - //-------------------------------------------------------------------- - AGG_INLINE unsigned width() const { return m_rbuf->width(); } - AGG_INLINE unsigned height() const { return m_rbuf->height(); } - AGG_INLINE int stride() const { return m_rbuf->stride(); } - - //-------------------------------------------------------------------- - int8u* row_ptr(int y) { return m_rbuf->row_ptr(y); } - const int8u* row_ptr(int y) const { return m_rbuf->row_ptr(y); } - row_data row(int y) const { return m_rbuf->row(y); } - - const int8u* pix_ptr(int x, int y) const - { - return m_rbuf->row_ptr(y) + x * Step + Offset; - } - - int8u* pix_ptr(int x, int y) - { - return m_rbuf->row_ptr(y) + x * Step + Offset; - } - - //-------------------------------------------------------------------- - AGG_INLINE static void make_pix(int8u* p, const color_type& c) - { - *(value_type*)p = c.v; - } - - //-------------------------------------------------------------------- - AGG_INLINE color_type pixel(int x, int y) const - { - value_type* p = (value_type*)m_rbuf->row_ptr(y) + x * Step + Offset; - return color_type(*p); - } - - //-------------------------------------------------------------------- - AGG_INLINE void copy_pixel(int x, int y, const color_type& c) - { - *((value_type*)m_rbuf->row_ptr(x, y, 1) + x * Step + Offset) = c.v; - } - - //-------------------------------------------------------------------- - AGG_INLINE void blend_pixel(int x, int y, const color_type& c, int8u cover) - { - copy_or_blend_pix((value_type*) - m_rbuf->row_ptr(x, y, 1) + x * Step + Offset, - c, - cover); - } - - - //-------------------------------------------------------------------- - AGG_INLINE void copy_hline(int x, int y, - unsigned len, - const color_type& c) - { - value_type* p = (value_type*) - m_rbuf->row_ptr(x, y, len) + x * Step + Offset; - - do - { - *p = c.v; - p += Step; - } - while(--len); - } - - - //-------------------------------------------------------------------- - AGG_INLINE void copy_vline(int x, int y, - unsigned len, - const color_type& c) - { - do - { - value_type* p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset; - - *p = c.v; - } - while(--len); - } - - - //-------------------------------------------------------------------- - void blend_hline(int x, int y, - unsigned len, - const color_type& c, - int8u cover) - { - if (c.a) - { - value_type* p = (value_type*) - m_rbuf->row_ptr(x, y, len) + x * Step + Offset; - - calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8; - if(alpha == base_mask) - { - do - { - *p = c.v; - p += Step; - } - while(--len); - } - else - { - do - { - Blender::blend_pix(p, c.v, alpha, cover); - p += Step; - } - while(--len); - } - } - } - - - //-------------------------------------------------------------------- - void blend_vline(int x, int y, - unsigned len, - const color_type& c, - int8u cover) - { - if (c.a) - { - value_type* p; - calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8; - if(alpha == base_mask) - { - do - { - p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset; - - *p = c.v; - } - while(--len); - } - else - { - do - { - p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset; - - Blender::blend_pix(p, c.v, alpha, cover); - } - while(--len); - } - } - } - - - //-------------------------------------------------------------------- - void blend_solid_hspan(int x, int y, - unsigned len, - const color_type& c, - const int8u* covers) - { - if (c.a) - { - value_type* p = (value_type*) - m_rbuf->row_ptr(x, y, len) + x * Step + Offset; - - do - { - calc_type alpha = (calc_type(c.a) * (calc_type(*covers) + 1)) >> 8; - if(alpha == base_mask) - { - *p = c.v; - } - else - { - Blender::blend_pix(p, c.v, alpha, *covers); - } - p += Step; - ++covers; - } - while(--len); - } - } - - - //-------------------------------------------------------------------- - void blend_solid_vspan(int x, int y, - unsigned len, - const color_type& c, - const int8u* covers) - { - if (c.a) - { - do - { - calc_type alpha = (calc_type(c.a) * (calc_type(*covers) + 1)) >> 8; - - value_type* p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset; - - if(alpha == base_mask) - { - *p = c.v; - } - else - { - Blender::blend_pix(p, c.v, alpha, *covers); - } - ++covers; - } - while(--len); - } - } - - - //-------------------------------------------------------------------- - void copy_color_hspan(int x, int y, - unsigned len, - const color_type* colors) - { - value_type* p = (value_type*) - m_rbuf->row_ptr(x, y, len) + x * Step + Offset; - - do - { - *p = colors->v; - p += Step; - ++colors; - } - while(--len); - } - - - //-------------------------------------------------------------------- - void copy_color_vspan(int x, int y, - unsigned len, - const color_type* colors) - { - do - { - value_type* p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset; - *p = colors->v; - ++colors; - } - while(--len); - } - - - //-------------------------------------------------------------------- - void blend_color_hspan(int x, int y, - unsigned len, - const color_type* colors, - const int8u* covers, - int8u cover) - { - value_type* p = (value_type*) - m_rbuf->row_ptr(x, y, len) + x * Step + Offset; - - if(covers) - { - do - { - copy_or_blend_pix(p, *colors++, *covers++); - p += Step; - } - while(--len); - } - else - { - if(cover == 255) - { - do - { - if(colors->a == base_mask) - { - *p = colors->v; - } - else - { - copy_or_blend_pix(p, *colors); - } - p += Step; - ++colors; - } - while(--len); - } - else - { - do - { - copy_or_blend_pix(p, *colors++, cover); - p += Step; - } - while(--len); - } - } - } - - - - //-------------------------------------------------------------------- - void blend_color_vspan(int x, int y, - unsigned len, - const color_type* colors, - const int8u* covers, - int8u cover) - { - value_type* p; - if(covers) - { - do - { - p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset; - - copy_or_blend_pix(p, *colors++, *covers++); - } - while(--len); - } - else - { - if(cover == 255) - { - do - { - p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset; - - if(colors->a == base_mask) - { - *p = colors->v; - } - else - { - copy_or_blend_pix(p, *colors); - } - ++colors; - } - while(--len); - } - else - { - do - { - p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x * Step + Offset; - - copy_or_blend_pix(p, *colors++, cover); - } - while(--len); - } - } - } - - //-------------------------------------------------------------------- - template void for_each_pixel(Function f) - { - unsigned y; - for(y = 0; y < height(); ++y) - { - row_data r = m_rbuf->row(y); - if(r.ptr) - { - unsigned len = r.x2 - r.x1 + 1; - - value_type* p = (value_type*) - m_rbuf->row_ptr(r.x1, y, len) + r.x1 * Step + Offset; - - do - { - f(p); - p += Step; - } - while(--len); - } - } - } - - //-------------------------------------------------------------------- - template void apply_gamma_dir(const GammaLut& g) - { - for_each_pixel(apply_gamma_dir_gray(g)); - } - - //-------------------------------------------------------------------- - template void apply_gamma_inv(const GammaLut& g) - { - for_each_pixel(apply_gamma_inv_gray(g)); - } - - //-------------------------------------------------------------------- - template - void copy_from(const RenBuf2& from, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len) - { - const int8u* p = from.row_ptr(ysrc); - if(p) - { - memmove(m_rbuf->row_ptr(xdst, ydst, len) + xdst * pix_width, - p + xsrc * pix_width, - len * pix_width); - } - } - - //-------------------------------------------------------------------- - template - void blend_from_color(const SrcPixelFormatRenderer& from, - const color_type& color, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len, - int8u cover) - { - typedef typename SrcPixelFormatRenderer::value_type src_value_type; - const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc); - if(psrc) - { - value_type* pdst = - (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst; - do - { - copy_or_blend_pix(pdst, - color, - (*psrc * cover + base_mask) >> base_shift); - ++psrc; - ++pdst; - } - while(--len); - } - } - - //-------------------------------------------------------------------- - template - void blend_from_lut(const SrcPixelFormatRenderer& from, - const color_type* color_lut, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len, - int8u cover) - { - typedef typename SrcPixelFormatRenderer::value_type src_value_type; - const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc); - if(psrc) - { - value_type* pdst = - (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst; - do - { - copy_or_blend_pix(pdst, color_lut[*psrc], cover); - ++psrc; - ++pdst; - } - while(--len); - } - } - - private: - rbuf_type* m_rbuf; - }; - - typedef blender_gray blender_gray8; - typedef blender_gray_pre blender_gray8_pre; - typedef blender_gray blender_gray16; - typedef blender_gray_pre blender_gray16_pre; - - typedef pixfmt_alpha_blend_gray pixfmt_gray8; //----pixfmt_gray8 - typedef pixfmt_alpha_blend_gray pixfmt_gray8_pre; //----pixfmt_gray8_pre - typedef pixfmt_alpha_blend_gray pixfmt_gray16; //----pixfmt_gray16 - typedef pixfmt_alpha_blend_gray pixfmt_gray16_pre; //----pixfmt_gray16_pre -} - -#endif - diff --git a/uppdev/aggdraw/agg_pixfmt_rgb.h b/uppdev/aggdraw/agg_pixfmt_rgb.h deleted file mode 100644 index 7f0ed184f..000000000 --- a/uppdev/aggdraw/agg_pixfmt_rgb.h +++ /dev/null @@ -1,869 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// Adaptation for high precision colors has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- - -#ifndef AGG_PIXFMT_RGB_INCLUDED -#define AGG_PIXFMT_RGB_INCLUDED - -#include -#include "agg_basics.h" -#include "agg_color_rgba.h" -#include "agg_rendering_buffer.h" - -namespace agg -{ - - //=====================================================apply_gamma_dir_rgb - template class apply_gamma_dir_rgb - { - public: - typedef typename ColorT::value_type value_type; - - apply_gamma_dir_rgb(const GammaLut& gamma) : m_gamma(gamma) {} - - AGG_INLINE void operator () (value_type* p) - { - p[Order::R] = m_gamma.dir(p[Order::R]); - p[Order::G] = m_gamma.dir(p[Order::G]); - p[Order::B] = m_gamma.dir(p[Order::B]); - } - - private: - const GammaLut& m_gamma; - }; - - - - //=====================================================apply_gamma_inv_rgb - template class apply_gamma_inv_rgb - { - public: - typedef typename ColorT::value_type value_type; - - apply_gamma_inv_rgb(const GammaLut& gamma) : m_gamma(gamma) {} - - AGG_INLINE void operator () (value_type* p) - { - p[Order::R] = m_gamma.inv(p[Order::R]); - p[Order::G] = m_gamma.inv(p[Order::G]); - p[Order::B] = m_gamma.inv(p[Order::B]); - } - - private: - const GammaLut& m_gamma; - }; - - - //=========================================================blender_rgb - template struct blender_rgb - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e { base_shift = color_type::base_shift }; - - //-------------------------------------------------------------------- - static AGG_INLINE void blend_pix(value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned cover=0) - { - p[Order::R] += (value_type)(((cr - p[Order::R]) * alpha) >> base_shift); - p[Order::G] += (value_type)(((cg - p[Order::G]) * alpha) >> base_shift); - p[Order::B] += (value_type)(((cb - p[Order::B]) * alpha) >> base_shift); - } - }; - - - //======================================================blender_rgb_pre - template struct blender_rgb_pre - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e { base_shift = color_type::base_shift }; - - //-------------------------------------------------------------------- - static AGG_INLINE void blend_pix(value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned cover) - { - alpha = color_type::base_mask - alpha; - cover = (cover + 1) << (base_shift - 8); - p[Order::R] = (value_type)((p[Order::R] * alpha + cr * cover) >> base_shift); - p[Order::G] = (value_type)((p[Order::G] * alpha + cg * cover) >> base_shift); - p[Order::B] = (value_type)((p[Order::B] * alpha + cb * cover) >> base_shift); - } - - //-------------------------------------------------------------------- - static AGG_INLINE void blend_pix(value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha) - { - alpha = color_type::base_mask - alpha; - p[Order::R] = (value_type)(((p[Order::R] * alpha) >> base_shift) + cr); - p[Order::G] = (value_type)(((p[Order::G] * alpha) >> base_shift) + cg); - p[Order::B] = (value_type)(((p[Order::B] * alpha) >> base_shift) + cb); - } - - }; - - - - //===================================================blender_rgb_gamma - template class blender_rgb_gamma - { - public: - typedef ColorT color_type; - typedef Order order_type; - typedef Gamma gamma_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e { base_shift = color_type::base_shift }; - - //-------------------------------------------------------------------- - blender_rgb_gamma() : m_gamma(0) {} - void gamma(const gamma_type& g) { m_gamma = &g; } - - //-------------------------------------------------------------------- - AGG_INLINE void blend_pix(value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned cover=0) - { - calc_type r = m_gamma->dir(p[Order::R]); - calc_type g = m_gamma->dir(p[Order::G]); - calc_type b = m_gamma->dir(p[Order::B]); - p[Order::R] = m_gamma->inv((((m_gamma->dir(cr) - r) * alpha) >> base_shift) + r); - p[Order::G] = m_gamma->inv((((m_gamma->dir(cg) - g) * alpha) >> base_shift) + g); - p[Order::B] = m_gamma->inv((((m_gamma->dir(cb) - b) * alpha) >> base_shift) + b); - } - - private: - const gamma_type* m_gamma; - }; - - - - - //==================================================pixfmt_alpha_blend_rgb - template class pixfmt_alpha_blend_rgb - { - public: - typedef RenBuf rbuf_type; - typedef Blender blender_type; - typedef typename rbuf_type::row_data row_data; - typedef typename blender_type::color_type color_type; - typedef typename blender_type::order_type order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_scale = color_type::base_scale, - base_mask = color_type::base_mask, - pix_width = sizeof(value_type) * 3 - }; - - private: - //-------------------------------------------------------------------- - AGG_INLINE void copy_or_blend_pix(value_type* p, - const color_type& c, - unsigned cover) - { - if (c.a) - { - calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8; - if(alpha == base_mask) - { - p[order_type::R] = c.r; - p[order_type::G] = c.g; - p[order_type::B] = c.b; - } - else - { - m_blender.blend_pix(p, c.r, c.g, c.b, alpha, cover); - } - } - } - - //-------------------------------------------------------------------- - AGG_INLINE void copy_or_blend_pix(value_type* p, - const color_type& c) - { - if (c.a) - { - if(c.a == base_mask) - { - p[order_type::R] = c.r; - p[order_type::G] = c.g; - p[order_type::B] = c.b; - } - else - { - m_blender.blend_pix(p, c.r, c.g, c.b, c.a); - } - } - } - - - public: - //-------------------------------------------------------------------- - explicit pixfmt_alpha_blend_rgb(rbuf_type& rb) : - m_rbuf(&rb) - {} - void attach(rbuf_type& rb) { m_rbuf = &rb; } - - //-------------------------------------------------------------------- - template - bool attach(PixFmt& pixf, int x1, int y1, int x2, int y2) - { - rect_i r(x1, y1, x2, y2); - if(r.clip(rect_i(0, 0, pixf.width()-1, pixf.height()-1))) - { - int stride = pixf.stride(); - m_rbuf->attach(pixf.pix_ptr(r.x1, stride < 0 ? r.y2 : r.y1), - (r.x2 - r.x1) + 1, - (r.y2 - r.y1) + 1, - stride); - return true; - } - return false; - } - - //-------------------------------------------------------------------- - Blender& blender() { return m_blender; } - - //-------------------------------------------------------------------- - AGG_INLINE unsigned width() const { return m_rbuf->width(); } - AGG_INLINE unsigned height() const { return m_rbuf->height(); } - AGG_INLINE int stride() const { return m_rbuf->stride(); } - - //-------------------------------------------------------------------- - AGG_INLINE int8u* row_ptr(int y) { return m_rbuf->row_ptr(y); } - AGG_INLINE const int8u* row_ptr(int y) const { return m_rbuf->row_ptr(y); } - AGG_INLINE row_data row(int y) const { return m_rbuf->row(y); } - - //-------------------------------------------------------------------- - AGG_INLINE int8u* pix_ptr(int x, int y) - { - return m_rbuf->row_ptr(y) + x * pix_width; - } - - AGG_INLINE const int8u* pix_ptr(int x, int y) const - { - return m_rbuf->row_ptr(y) + x * pix_width; - } - - //-------------------------------------------------------------------- - AGG_INLINE static void make_pix(int8u* p, const color_type& c) - { - ((value_type*)p)[order_type::R] = c.r; - ((value_type*)p)[order_type::G] = c.g; - ((value_type*)p)[order_type::B] = c.b; - } - - //-------------------------------------------------------------------- - AGG_INLINE color_type pixel(int x, int y) const - { - value_type* p = (value_type*)m_rbuf->row_ptr(y) + x + x + x; - return color_type(p[order_type::R], - p[order_type::G], - p[order_type::B]); - } - - //-------------------------------------------------------------------- - AGG_INLINE void copy_pixel(int x, int y, const color_type& c) - { - value_type* p = (value_type*)m_rbuf->row_ptr(x, y, 1) + x + x + x; - p[order_type::R] = c.r; - p[order_type::G] = c.g; - p[order_type::B] = c.b; - } - - //-------------------------------------------------------------------- - AGG_INLINE void blend_pixel(int x, int y, const color_type& c, int8u cover) - { - copy_or_blend_pix((value_type*)m_rbuf->row_ptr(x, y, 1) + x + x + x, c, cover); - } - - - //-------------------------------------------------------------------- - AGG_INLINE void copy_hline(int x, int y, - unsigned len, - const color_type& c) - { - value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + x + x + x; - do - { - p[order_type::R] = c.r; - p[order_type::G] = c.g; - p[order_type::B] = c.b; - p += 3; - } - while(--len); - } - - - //-------------------------------------------------------------------- - AGG_INLINE void copy_vline(int x, int y, - unsigned len, - const color_type& c) - { - do - { - value_type* p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x + x + x; - p[order_type::R] = c.r; - p[order_type::G] = c.g; - p[order_type::B] = c.b; - } - while(--len); - } - - - //-------------------------------------------------------------------- - void blend_hline(int x, int y, - unsigned len, - const color_type& c, - int8u cover) - { - if (c.a) - { - value_type* p = (value_type*) - m_rbuf->row_ptr(x, y, len) + x + x + x; - - calc_type alpha = (calc_type(c.a) * (calc_type(cover) + 1)) >> 8; - if(alpha == base_mask) - { - do - { - p[order_type::R] = c.r; - p[order_type::G] = c.g; - p[order_type::B] = c.b; - p += 3; - } - while(--len); - } - else - { - do - { - m_blender.blend_pix(p, c.r, c.g, c.b, alpha, cover); - p += 3; - } - while(--len); - } - } - } - - - //-------------------------------------------------------------------- - void blend_vline(int x, int y, - unsigned len, - const color_type& c, - int8u cover) - { - if (c.a) - { - value_type* p; - calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8; - if(alpha == base_mask) - { - do - { - p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x + x + x; - - p[order_type::R] = c.r; - p[order_type::G] = c.g; - p[order_type::B] = c.b; - } - while(--len); - } - else - { - do - { - p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x + x + x; - - m_blender.blend_pix(p, c.r, c.g, c.b, alpha, cover); - } - while(--len); - } - } - } - - - //-------------------------------------------------------------------- - void blend_solid_hspan(int x, int y, - unsigned len, - const color_type& c, - const int8u* covers) - { - if (c.a) - { - value_type* p = (value_type*) - m_rbuf->row_ptr(x, y, len) + x + x + x; - - do - { - calc_type alpha = (calc_type(c.a) * (calc_type(*covers) + 1)) >> 8; - if(alpha == base_mask) - { - p[order_type::R] = c.r; - p[order_type::G] = c.g; - p[order_type::B] = c.b; - } - else - { - m_blender.blend_pix(p, c.r, c.g, c.b, alpha, *covers); - } - p += 3; - ++covers; - } - while(--len); - } - } - - - //-------------------------------------------------------------------- - void blend_solid_vspan(int x, int y, - unsigned len, - const color_type& c, - const int8u* covers) - { - if (c.a) - { - do - { - value_type* p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x + x + x; - - calc_type alpha = (calc_type(c.a) * (calc_type(*covers) + 1)) >> 8; - if(alpha == base_mask) - { - p[order_type::R] = c.r; - p[order_type::G] = c.g; - p[order_type::B] = c.b; - } - else - { - m_blender.blend_pix(p, c.r, c.g, c.b, alpha, *covers); - } - ++covers; - } - while(--len); - } - } - - - //-------------------------------------------------------------------- - void copy_color_hspan(int x, int y, - unsigned len, - const color_type* colors) - { - value_type* p = (value_type*) - m_rbuf->row_ptr(x, y, len) + x + x + x; - - do - { - p[order_type::R] = colors->r; - p[order_type::G] = colors->g; - p[order_type::B] = colors->b; - ++colors; - p += 3; - } - while(--len); - } - - - //-------------------------------------------------------------------- - void copy_color_vspan(int x, int y, - unsigned len, - const color_type* colors) - { - do - { - value_type* p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x + x + x; - p[order_type::R] = colors->r; - p[order_type::G] = colors->g; - p[order_type::B] = colors->b; - ++colors; - } - while(--len); - } - - - //-------------------------------------------------------------------- - void blend_color_hspan(int x, int y, - unsigned len, - const color_type* colors, - const int8u* covers, - int8u cover) - { - value_type* p = (value_type*) - m_rbuf->row_ptr(x, y, len) + x + x + x; - - if(covers) - { - do - { - copy_or_blend_pix(p, *colors++, *covers++); - p += 3; - } - while(--len); - } - else - { - if(cover == 255) - { - do - { - copy_or_blend_pix(p, *colors++); - p += 3; - } - while(--len); - } - else - { - do - { - copy_or_blend_pix(p, *colors++, cover); - p += 3; - } - while(--len); - } - } - } - - - - //-------------------------------------------------------------------- - void blend_color_vspan(int x, int y, - unsigned len, - const color_type* colors, - const int8u* covers, - int8u cover) - { - value_type* p; - if(covers) - { - do - { - p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x + x + x; - - copy_or_blend_pix(p, *colors++, *covers++); - } - while(--len); - } - else - { - if(cover == 255) - { - do - { - p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x + x + x; - - copy_or_blend_pix(p, *colors++); - } - while(--len); - } - else - { - do - { - p = (value_type*) - m_rbuf->row_ptr(x, y++, 1) + x + x + x; - - copy_or_blend_pix(p, *colors++, cover); - } - while(--len); - } - } - } - - //-------------------------------------------------------------------- - template void for_each_pixel(Function f) - { - unsigned y; - for(y = 0; y < height(); ++y) - { - row_data r = m_rbuf->row(y); - if(r.ptr) - { - unsigned len = r.x2 - r.x1 + 1; - value_type* p = (value_type*) - m_rbuf->row_ptr(r.x1, y, len) + r.x1 * 3; - do - { - f(p); - p += 3; - } - while(--len); - } - } - } - - //-------------------------------------------------------------------- - template void apply_gamma_dir(const GammaLut& g) - { - for_each_pixel(apply_gamma_dir_rgb(g)); - } - - //-------------------------------------------------------------------- - template void apply_gamma_inv(const GammaLut& g) - { - for_each_pixel(apply_gamma_inv_rgb(g)); - } - - //-------------------------------------------------------------------- - template - void copy_from(const RenBuf2& from, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len) - { - const int8u* p = from.row_ptr(ysrc); - if(p) - { - memmove(m_rbuf->row_ptr(xdst, ydst, len) + xdst * pix_width, - p + xsrc * pix_width, - len * pix_width); - } - } - - - //-------------------------------------------------------------------- - template - void blend_from(const SrcPixelFormatRenderer& from, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len, - int8u cover) - { - typedef typename SrcPixelFormatRenderer::order_type src_order; - - const value_type* psrc = (const value_type*)from.row_ptr(ysrc); - if(psrc) - { - psrc += xsrc * 4; - value_type* pdst = - (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst * 3; - - if(cover == 255) - { - do - { - value_type alpha = psrc[src_order::A]; - if(alpha) - { - if(alpha == base_mask) - { - pdst[order_type::R] = psrc[src_order::R]; - pdst[order_type::G] = psrc[src_order::G]; - pdst[order_type::B] = psrc[src_order::B]; - } - else - { - m_blender.blend_pix(pdst, - psrc[src_order::R], - psrc[src_order::G], - psrc[src_order::B], - alpha); - } - } - psrc += 4; - pdst += 3; - } - while(--len); - } - else - { - color_type color; - do - { - color.r = psrc[src_order::R]; - color.g = psrc[src_order::G]; - color.b = psrc[src_order::B]; - color.a = psrc[src_order::A]; - copy_or_blend_pix(pdst, color, cover); - psrc += 4; - pdst += 3; - } - while(--len); - } - } - } - - //-------------------------------------------------------------------- - template - void blend_from_color(const SrcPixelFormatRenderer& from, - const color_type& color, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len, - int8u cover) - { - typedef typename SrcPixelFormatRenderer::value_type src_value_type; - const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc); - if(psrc) - { - value_type* pdst = - (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst * 3; - do - { - copy_or_blend_pix(pdst, - color, - (*psrc * cover + base_mask) >> base_shift); - ++psrc; - pdst += 3; - } - while(--len); - } - } - - //-------------------------------------------------------------------- - template - void blend_from_lut(const SrcPixelFormatRenderer& from, - const color_type* color_lut, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len, - int8u cover) - { - typedef typename SrcPixelFormatRenderer::value_type src_value_type; - const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc); - if(psrc) - { - value_type* pdst = - (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst * 3; - - if(cover == 255) - { - do - { - const color_type& color = color_lut[*psrc]; - m_blender.blend_pix(pdst, - color.r, color.g, color.b, color.a); - ++psrc; - pdst += 3; - } - while(--len); - } - else - { - do - { - copy_or_blend_pix(pdst, color_lut[*psrc], cover); - ++psrc; - pdst += 3; - } - while(--len); - } - } - } - - private: - rbuf_type* m_rbuf; - Blender m_blender; - }; - - typedef pixfmt_alpha_blend_rgb, rendering_buffer> pixfmt_rgb24; //----pixfmt_rgb24 - typedef pixfmt_alpha_blend_rgb, rendering_buffer> pixfmt_bgr24; //----pixfmt_bgr24 - typedef pixfmt_alpha_blend_rgb, rendering_buffer> pixfmt_rgb48; //----pixfmt_rgb48 - typedef pixfmt_alpha_blend_rgb, rendering_buffer> pixfmt_bgr48; //----pixfmt_bgr48 - - typedef pixfmt_alpha_blend_rgb, rendering_buffer> pixfmt_rgb24_pre; //----pixfmt_rgb24_pre - typedef pixfmt_alpha_blend_rgb, rendering_buffer> pixfmt_bgr24_pre; //----pixfmt_bgr24_pre - typedef pixfmt_alpha_blend_rgb, rendering_buffer> pixfmt_rgb48_pre; //----pixfmt_rgb48_pre - typedef pixfmt_alpha_blend_rgb, rendering_buffer> pixfmt_bgr48_pre; //----pixfmt_bgr48_pre - - //-----------------------------------------------------pixfmt_rgb24_gamma - template class pixfmt_rgb24_gamma : - public pixfmt_alpha_blend_rgb, rendering_buffer> - { - public: - pixfmt_rgb24_gamma(rendering_buffer& rb, const Gamma& g) : - pixfmt_alpha_blend_rgb, rendering_buffer>(rb) - { - this->blender().gamma(g); - } - }; - - //-----------------------------------------------------pixfmt_bgr24_gamma - template class pixfmt_bgr24_gamma : - public pixfmt_alpha_blend_rgb, rendering_buffer> - { - public: - pixfmt_bgr24_gamma(rendering_buffer& rb, const Gamma& g) : - pixfmt_alpha_blend_rgb, rendering_buffer>(rb) - { - this->blender().gamma(g); - } - }; - - //-----------------------------------------------------pixfmt_rgb48_gamma - template class pixfmt_rgb48_gamma : - public pixfmt_alpha_blend_rgb, rendering_buffer> - { - public: - pixfmt_rgb48_gamma(rendering_buffer& rb, const Gamma& g) : - pixfmt_alpha_blend_rgb, rendering_buffer>(rb) - { - this->blender().gamma(g); - } - }; - - //-----------------------------------------------------pixfmt_bgr48_gamma - template class pixfmt_bgr48_gamma : - public pixfmt_alpha_blend_rgb, rendering_buffer> - { - public: - pixfmt_bgr48_gamma(rendering_buffer& rb, const Gamma& g) : - pixfmt_alpha_blend_rgb, rendering_buffer>(rb) - { - this->blender().gamma(g); - } - }; - - -} - -#endif - diff --git a/uppdev/aggdraw/agg_pixfmt_rgb_packed.h b/uppdev/aggdraw/agg_pixfmt_rgb_packed.h deleted file mode 100644 index 28bb79d4f..000000000 --- a/uppdev/aggdraw/agg_pixfmt_rgb_packed.h +++ /dev/null @@ -1,1318 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// Adaptation for high precision colors has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- - -#ifndef AGG_PIXFMT_RGB_PACKED_INCLUDED -#define AGG_PIXFMT_RGB_PACKED_INCLUDED - -#include -#include "agg_basics.h" -#include "agg_color_rgba.h" -#include "agg_rendering_buffer.h" - -namespace agg -{ - //=========================================================blender_rgb555 - struct blender_rgb555 - { - typedef rgba8 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int16u pixel_type; - - static AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned) - { - pixel_type rgb = *p; - calc_type r = (rgb >> 7) & 0xF8; - calc_type g = (rgb >> 2) & 0xF8; - calc_type b = (rgb << 3) & 0xF8; - *p = (pixel_type) - (((((cr - r) * alpha + (r << 8)) >> 1) & 0x7C00) | - ((((cg - g) * alpha + (g << 8)) >> 6) & 0x03E0) | - (((cb - b) * alpha + (b << 8)) >> 11) | 0x8000); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((r & 0xF8) << 7) | - ((g & 0xF8) << 2) | - (b >> 3) | 0x8000); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p >> 7) & 0xF8, - (p >> 2) & 0xF8, - (p << 3) & 0xF8); - } - }; - - - //=====================================================blender_rgb555_pre - struct blender_rgb555_pre - { - typedef rgba8 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int16u pixel_type; - - static AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned cover) - { - alpha = color_type::base_mask - alpha; - pixel_type rgb = *p; - calc_type r = (rgb >> 7) & 0xF8; - calc_type g = (rgb >> 2) & 0xF8; - calc_type b = (rgb << 3) & 0xF8; - *p = (pixel_type) - ((((r * alpha + cr * cover) >> 1) & 0x7C00) | - (((g * alpha + cg * cover) >> 6) & 0x03E0) | - ((b * alpha + cb * cover) >> 11) | 0x8000); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((r & 0xF8) << 7) | - ((g & 0xF8) << 2) | - (b >> 3) | 0x8000); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p >> 7) & 0xF8, - (p >> 2) & 0xF8, - (p << 3) & 0xF8); - } - }; - - - - - //=====================================================blender_rgb555_gamma - template class blender_rgb555_gamma - { - public: - typedef rgba8 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int16u pixel_type; - typedef Gamma gamma_type; - - blender_rgb555_gamma() : m_gamma(0) {} - void gamma(const gamma_type& g) { m_gamma = &g; } - - AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned) - { - pixel_type rgb = *p; - calc_type r = m_gamma->dir((rgb >> 7) & 0xF8); - calc_type g = m_gamma->dir((rgb >> 2) & 0xF8); - calc_type b = m_gamma->dir((rgb << 3) & 0xF8); - *p = (pixel_type) - (((m_gamma->inv(((m_gamma->dir(cr) - r) * alpha + (r << 8)) >> 8) << 7) & 0x7C00) | - ((m_gamma->inv(((m_gamma->dir(cg) - g) * alpha + (g << 8)) >> 8) << 2) & 0x03E0) | - (m_gamma->inv(((m_gamma->dir(cb) - b) * alpha + (b << 8)) >> 8) >> 3) | 0x8000); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((r & 0xF8) << 7) | - ((g & 0xF8) << 2) | - (b >> 3) | 0x8000); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p >> 7) & 0xF8, - (p >> 2) & 0xF8, - (p << 3) & 0xF8); - } - - private: - const Gamma* m_gamma; - }; - - - - - - //=========================================================blender_rgb565 - struct blender_rgb565 - { - typedef rgba8 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int16u pixel_type; - - static AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned) - { - pixel_type rgb = *p; - calc_type r = (rgb >> 8) & 0xF8; - calc_type g = (rgb >> 3) & 0xFC; - calc_type b = (rgb << 3) & 0xF8; - *p = (pixel_type) - (((((cr - r) * alpha + (r << 8)) ) & 0xF800) | - ((((cg - g) * alpha + (g << 8)) >> 5) & 0x07E0) | - (((cb - b) * alpha + (b << 8)) >> 11)); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3)); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p >> 8) & 0xF8, - (p >> 3) & 0xFC, - (p << 3) & 0xF8); - } - }; - - - - //=====================================================blender_rgb565_pre - struct blender_rgb565_pre - { - typedef rgba8 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int16u pixel_type; - - static AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned cover) - { - alpha = color_type::base_mask - alpha; - pixel_type rgb = *p; - calc_type r = (rgb >> 8) & 0xF8; - calc_type g = (rgb >> 3) & 0xFC; - calc_type b = (rgb << 3) & 0xF8; - *p = (pixel_type) - ((((r * alpha + cr * cover) ) & 0xF800) | - (((g * alpha + cg * cover) >> 5 ) & 0x07E0) | - ((b * alpha + cb * cover) >> 11)); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3)); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p >> 8) & 0xF8, - (p >> 3) & 0xFC, - (p << 3) & 0xF8); - } - }; - - - - //=====================================================blender_rgb565_gamma - template class blender_rgb565_gamma - { - public: - typedef rgba8 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int16u pixel_type; - typedef Gamma gamma_type; - - blender_rgb565_gamma() : m_gamma(0) {} - void gamma(const gamma_type& g) { m_gamma = &g; } - - AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned) - { - pixel_type rgb = *p; - calc_type r = m_gamma->dir((rgb >> 8) & 0xF8); - calc_type g = m_gamma->dir((rgb >> 3) & 0xFC); - calc_type b = m_gamma->dir((rgb << 3) & 0xF8); - *p = (pixel_type) - (((m_gamma->inv(((m_gamma->dir(cr) - r) * alpha + (r << 8)) >> 8) << 8) & 0xF800) | - ((m_gamma->inv(((m_gamma->dir(cg) - g) * alpha + (g << 8)) >> 8) << 3) & 0x07E0) | - (m_gamma->inv(((m_gamma->dir(cb) - b) * alpha + (b << 8)) >> 8) >> 3)); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3)); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p >> 8) & 0xF8, - (p >> 3) & 0xFC, - (p << 3) & 0xF8); - } - - private: - const Gamma* m_gamma; - }; - - - - //=====================================================blender_rgbAAA - struct blender_rgbAAA - { - typedef rgba16 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int32u pixel_type; - - static AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned) - { - pixel_type rgb = *p; - calc_type r = (rgb >> 14) & 0xFFC0; - calc_type g = (rgb >> 4) & 0xFFC0; - calc_type b = (rgb << 6) & 0xFFC0; - *p = (pixel_type) - (((((cr - r) * alpha + (r << 16)) >> 2) & 0x3FF00000) | - ((((cg - g) * alpha + (g << 16)) >> 12) & 0x000FFC00) | - (((cb - b) * alpha + (b << 16)) >> 22) | 0xC0000000); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((r & 0xFFC0) << 14) | - ((g & 0xFFC0) << 4) | - (b >> 6) | 0xC0000000); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p >> 14) & 0xFFC0, - (p >> 4) & 0xFFC0, - (p << 6) & 0xFFC0); - } - }; - - - - //==================================================blender_rgbAAA_pre - struct blender_rgbAAA_pre - { - typedef rgba16 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int32u pixel_type; - - static AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned cover) - { - alpha = color_type::base_mask - alpha; - cover = (cover + 1) << (color_type::base_shift - 8); - pixel_type rgb = *p; - calc_type r = (rgb >> 14) & 0xFFC0; - calc_type g = (rgb >> 4) & 0xFFC0; - calc_type b = (rgb << 6) & 0xFFC0; - *p = (pixel_type) - ((((r * alpha + cr * cover) >> 2) & 0x3FF00000) | - (((g * alpha + cg * cover) >> 12) & 0x000FFC00) | - ((b * alpha + cb * cover) >> 22) | 0xC0000000); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((r & 0xFFC0) << 14) | - ((g & 0xFFC0) << 4) | - (b >> 6) | 0xC0000000); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p >> 14) & 0xFFC0, - (p >> 4) & 0xFFC0, - (p << 6) & 0xFFC0); - } - }; - - - - //=================================================blender_rgbAAA_gamma - template class blender_rgbAAA_gamma - { - public: - typedef rgba16 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int32u pixel_type; - typedef Gamma gamma_type; - - blender_rgbAAA_gamma() : m_gamma(0) {} - void gamma(const gamma_type& g) { m_gamma = &g; } - - AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned) - { - pixel_type rgb = *p; - calc_type r = m_gamma->dir((rgb >> 14) & 0xFFC0); - calc_type g = m_gamma->dir((rgb >> 4) & 0xFFC0); - calc_type b = m_gamma->dir((rgb << 6) & 0xFFC0); - *p = (pixel_type) - (((m_gamma->inv(((m_gamma->dir(cr) - r) * alpha + (r << 16)) >> 16) << 14) & 0x3FF00000) | - ((m_gamma->inv(((m_gamma->dir(cg) - g) * alpha + (g << 16)) >> 16) << 4 ) & 0x000FFC00) | - (m_gamma->inv(((m_gamma->dir(cb) - b) * alpha + (b << 16)) >> 16) >> 6 ) | 0xC0000000); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((r & 0xFFC0) << 14) | - ((g & 0xFFC0) << 4) | - (b >> 6) | 0xC0000000); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p >> 14) & 0xFFC0, - (p >> 4) & 0xFFC0, - (p << 6) & 0xFFC0); - } - private: - const Gamma* m_gamma; - }; - - - //=====================================================blender_bgrAAA - struct blender_bgrAAA - { - typedef rgba16 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int32u pixel_type; - - static AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned) - { - pixel_type bgr = *p; - calc_type b = (bgr >> 14) & 0xFFC0; - calc_type g = (bgr >> 4) & 0xFFC0; - calc_type r = (bgr << 6) & 0xFFC0; - *p = (pixel_type) - (((((cb - b) * alpha + (b << 16)) >> 2) & 0x3FF00000) | - ((((cg - g) * alpha + (g << 16)) >> 12) & 0x000FFC00) | - (((cr - r) * alpha + (r << 16)) >> 22) | 0xC0000000); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((b & 0xFFC0) << 14) | - ((g & 0xFFC0) << 4) | - (r >> 6) | 0xC0000000); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p << 6) & 0xFFC0, - (p >> 4) & 0xFFC0, - (p >> 14) & 0xFFC0); - } - }; - - - - //=================================================blender_bgrAAA_pre - struct blender_bgrAAA_pre - { - typedef rgba16 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int32u pixel_type; - - static AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned cover) - { - alpha = color_type::base_mask - alpha; - cover = (cover + 1) << (color_type::base_shift - 8); - pixel_type bgr = *p; - calc_type b = (bgr >> 14) & 0xFFC0; - calc_type g = (bgr >> 4) & 0xFFC0; - calc_type r = (bgr << 6) & 0xFFC0; - *p = (pixel_type) - ((((b * alpha + cb * cover) >> 2) & 0x3FF00000) | - (((g * alpha + cg * cover) >> 12) & 0x000FFC00) | - ((r * alpha + cr * cover) >> 22) | 0xC0000000); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((b & 0xFFC0) << 14) | - ((g & 0xFFC0) << 4) | - (r >> 6) | 0xC0000000); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p << 6) & 0xFFC0, - (p >> 4) & 0xFFC0, - (p >> 14) & 0xFFC0); - } - }; - - - - //=================================================blender_bgrAAA_gamma - template class blender_bgrAAA_gamma - { - public: - typedef rgba16 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int32u pixel_type; - typedef Gamma gamma_type; - - blender_bgrAAA_gamma() : m_gamma(0) {} - void gamma(const gamma_type& g) { m_gamma = &g; } - - AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned) - { - pixel_type bgr = *p; - calc_type b = m_gamma->dir((bgr >> 14) & 0xFFC0); - calc_type g = m_gamma->dir((bgr >> 4) & 0xFFC0); - calc_type r = m_gamma->dir((bgr << 6) & 0xFFC0); - *p = (pixel_type) - (((m_gamma->inv(((m_gamma->dir(cb) - b) * alpha + (b << 16)) >> 16) << 14) & 0x3FF00000) | - ((m_gamma->inv(((m_gamma->dir(cg) - g) * alpha + (g << 16)) >> 16) << 4 ) & 0x000FFC00) | - (m_gamma->inv(((m_gamma->dir(cr) - r) * alpha + (r << 16)) >> 16) >> 6 ) | 0xC0000000); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((b & 0xFFC0) << 14) | - ((g & 0xFFC0) << 4) | - (r >> 6) | 0xC0000000); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p << 6) & 0xFFC0, - (p >> 4) & 0xFFC0, - (p >> 14) & 0xFFC0); - } - - private: - const Gamma* m_gamma; - }; - - - - //=====================================================blender_rgbBBA - struct blender_rgbBBA - { - typedef rgba16 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int32u pixel_type; - - static AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned) - { - pixel_type rgb = *p; - calc_type r = (rgb >> 16) & 0xFFE0; - calc_type g = (rgb >> 5) & 0xFFE0; - calc_type b = (rgb << 6) & 0xFFC0; - *p = (pixel_type) - (((((cr - r) * alpha + (r << 16)) ) & 0xFFE00000) | - ((((cg - g) * alpha + (g << 16)) >> 11) & 0x001FFC00) | - (((cb - b) * alpha + (b << 16)) >> 22)); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((r & 0xFFE0) << 16) | ((g & 0xFFE0) << 5) | (b >> 6)); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p >> 16) & 0xFFE0, - (p >> 5) & 0xFFE0, - (p << 6) & 0xFFC0); - } - }; - - - //=================================================blender_rgbBBA_pre - struct blender_rgbBBA_pre - { - typedef rgba16 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int32u pixel_type; - - static AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned cover) - { - alpha = color_type::base_mask - alpha; - cover = (cover + 1) << (color_type::base_shift - 8); - pixel_type rgb = *p; - calc_type r = (rgb >> 16) & 0xFFE0; - calc_type g = (rgb >> 5) & 0xFFE0; - calc_type b = (rgb << 6) & 0xFFC0; - *p = (pixel_type) - ((((r * alpha + cr * cover) ) & 0xFFE00000) | - (((g * alpha + cg * cover) >> 11) & 0x001FFC00) | - ((b * alpha + cb * cover) >> 22)); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((r & 0xFFE0) << 16) | ((g & 0xFFE0) << 5) | (b >> 6)); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p >> 16) & 0xFFE0, - (p >> 5) & 0xFFE0, - (p << 6) & 0xFFC0); - } - }; - - - - //=================================================blender_rgbBBA_gamma - template class blender_rgbBBA_gamma - { - public: - typedef rgba16 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int32u pixel_type; - typedef Gamma gamma_type; - - blender_rgbBBA_gamma() : m_gamma(0) {} - void gamma(const gamma_type& g) { m_gamma = &g; } - - AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned) - { - pixel_type rgb = *p; - calc_type r = m_gamma->dir((rgb >> 16) & 0xFFE0); - calc_type g = m_gamma->dir((rgb >> 5) & 0xFFE0); - calc_type b = m_gamma->dir((rgb << 6) & 0xFFC0); - *p = (pixel_type) - (((m_gamma->inv(((m_gamma->dir(cr) - r) * alpha + (r << 16)) >> 16) << 16) & 0xFFE00000) | - ((m_gamma->inv(((m_gamma->dir(cg) - g) * alpha + (g << 16)) >> 16) << 5 ) & 0x001FFC00) | - (m_gamma->inv(((m_gamma->dir(cb) - b) * alpha + (b << 16)) >> 16) >> 6 )); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((r & 0xFFE0) << 16) | ((g & 0xFFE0) << 5) | (b >> 6)); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p >> 16) & 0xFFE0, - (p >> 5) & 0xFFE0, - (p << 6) & 0xFFC0); - } - - private: - const Gamma* m_gamma; - }; - - - //=====================================================blender_bgrABB - struct blender_bgrABB - { - typedef rgba16 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int32u pixel_type; - - static AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned) - { - pixel_type bgr = *p; - calc_type b = (bgr >> 16) & 0xFFC0; - calc_type g = (bgr >> 6) & 0xFFE0; - calc_type r = (bgr << 5) & 0xFFE0; - *p = (pixel_type) - (((((cb - b) * alpha + (b << 16)) ) & 0xFFC00000) | - ((((cg - g) * alpha + (g << 16)) >> 10) & 0x003FF800) | - (((cr - r) * alpha + (r << 16)) >> 21)); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((b & 0xFFC0) << 16) | ((g & 0xFFE0) << 6) | (r >> 5)); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p << 5) & 0xFFE0, - (p >> 6) & 0xFFE0, - (p >> 16) & 0xFFC0); - } - }; - - - //=================================================blender_bgrABB_pre - struct blender_bgrABB_pre - { - typedef rgba16 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int32u pixel_type; - - static AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned cover) - { - alpha = color_type::base_mask - alpha; - cover = (cover + 1) << (color_type::base_shift - 8); - pixel_type bgr = *p; - calc_type b = (bgr >> 16) & 0xFFC0; - calc_type g = (bgr >> 6) & 0xFFE0; - calc_type r = (bgr << 5) & 0xFFE0; - *p = (pixel_type) - ((((b * alpha + cb * cover) ) & 0xFFC00000) | - (((g * alpha + cg * cover) >> 10) & 0x003FF800) | - ((r * alpha + cr * cover) >> 21)); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((b & 0xFFC0) << 16) | ((g & 0xFFE0) << 6) | (r >> 5)); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p << 5) & 0xFFE0, - (p >> 6) & 0xFFE0, - (p >> 16) & 0xFFC0); - } - }; - - - - //=================================================blender_bgrABB_gamma - template class blender_bgrABB_gamma - { - public: - typedef rgba16 color_type; - typedef color_type::value_type value_type; - typedef color_type::calc_type calc_type; - typedef int32u pixel_type; - typedef Gamma gamma_type; - - blender_bgrABB_gamma() : m_gamma(0) {} - void gamma(const gamma_type& g) { m_gamma = &g; } - - AGG_INLINE void blend_pix(pixel_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned) - { - pixel_type bgr = *p; - calc_type b = m_gamma->dir((bgr >> 16) & 0xFFC0); - calc_type g = m_gamma->dir((bgr >> 6) & 0xFFE0); - calc_type r = m_gamma->dir((bgr << 5) & 0xFFE0); - *p = (pixel_type) - (((m_gamma->inv(((m_gamma->dir(cb) - b) * alpha + (b << 16)) >> 16) << 16) & 0xFFC00000) | - ((m_gamma->inv(((m_gamma->dir(cg) - g) * alpha + (g << 16)) >> 16) << 6 ) & 0x003FF800) | - (m_gamma->inv(((m_gamma->dir(cr) - r) * alpha + (r << 16)) >> 16) >> 5 )); - } - - static AGG_INLINE pixel_type make_pix(unsigned r, unsigned g, unsigned b) - { - return (pixel_type)(((b & 0xFFC0) << 16) | ((g & 0xFFE0) << 6) | (r >> 5)); - } - - static AGG_INLINE color_type make_color(pixel_type p) - { - return color_type((p << 5) & 0xFFE0, - (p >> 6) & 0xFFE0, - (p >> 16) & 0xFFC0); - } - - private: - const Gamma* m_gamma; - }; - - - - //===========================================pixfmt_alpha_blend_rgb_packed - template class pixfmt_alpha_blend_rgb_packed - { - public: - typedef RenBuf rbuf_type; - typedef typename rbuf_type::row_data row_data; - typedef Blender blender_type; - typedef typename blender_type::color_type color_type; - typedef typename blender_type::pixel_type pixel_type; - typedef int order_type; // A fake one - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_scale = color_type::base_scale, - base_mask = color_type::base_mask, - pix_width = sizeof(pixel_type) - }; - - private: - //-------------------------------------------------------------------- - AGG_INLINE void copy_or_blend_pix(pixel_type* p, const color_type& c, unsigned cover) - { - if (c.a) - { - calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8; - if(alpha == base_mask) - { - *p = m_blender.make_pix(c.r, c.g, c.b); - } - else - { - m_blender.blend_pix(p, c.r, c.g, c.b, alpha, cover); - } - } - } - - public: - //-------------------------------------------------------------------- - explicit pixfmt_alpha_blend_rgb_packed(rbuf_type& rb) : m_rbuf(&rb) {} - void attach(rbuf_type& rb) { m_rbuf = &rb; } - - //-------------------------------------------------------------------- - template - bool attach(PixFmt& pixf, int x1, int y1, int x2, int y2) - { - rect_i r(x1, y1, x2, y2); - if(r.clip(rect_i(0, 0, pixf.width()-1, pixf.height()-1))) - { - int stride = pixf.stride(); - m_rbuf->attach(pixf.pix_ptr(r.x1, stride < 0 ? r.y2 : r.y1), - (r.x2 - r.x1) + 1, - (r.y2 - r.y1) + 1, - stride); - return true; - } - return false; - } - - Blender& blender() { return m_blender; } - - //-------------------------------------------------------------------- - AGG_INLINE unsigned width() const { return m_rbuf->width(); } - AGG_INLINE unsigned height() const { return m_rbuf->height(); } - AGG_INLINE int stride() const { return m_rbuf->stride(); } - - //-------------------------------------------------------------------- - AGG_INLINE int8u* row_ptr(int y) { return m_rbuf->row_ptr(y); } - AGG_INLINE const int8u* row_ptr(int y) const { return m_rbuf->row_ptr(y); } - AGG_INLINE row_data row(int y) const { return m_rbuf->row(y); } - - //-------------------------------------------------------------------- - AGG_INLINE int8u* pix_ptr(int x, int y) - { - return m_rbuf->row_ptr(y) + x * pix_width; - } - - AGG_INLINE const int8u* pix_ptr(int x, int y) const - { - return m_rbuf->row_ptr(y) + x * pix_width; - } - - //-------------------------------------------------------------------- - AGG_INLINE void make_pix(int8u* p, const color_type& c) - { - *(pixel_type*)p = m_blender.make_pix(c.r, c.g, c.b); - } - - //-------------------------------------------------------------------- - AGG_INLINE color_type pixel(int x, int y) const - { - return m_blender.make_color(((pixel_type*)m_rbuf->row_ptr(y))[x]); - } - - //-------------------------------------------------------------------- - AGG_INLINE void copy_pixel(int x, int y, const color_type& c) - { - ((pixel_type*) - m_rbuf->row_ptr(x, y, 1))[x] = - m_blender.make_pix(c.r, c.g, c.b); - } - - //-------------------------------------------------------------------- - AGG_INLINE void blend_pixel(int x, int y, const color_type& c, int8u cover) - { - copy_or_blend_pix((pixel_type*)m_rbuf->row_ptr(x, y, 1) + x, c, cover); - } - - //-------------------------------------------------------------------- - AGG_INLINE void copy_hline(int x, int y, - unsigned len, - const color_type& c) - { - pixel_type* p = (pixel_type*)m_rbuf->row_ptr(x, y, len) + x; - pixel_type v = m_blender.make_pix(c.r, c.g, c.b); - do - { - *p++ = v; - } - while(--len); - } - - //-------------------------------------------------------------------- - AGG_INLINE void copy_vline(int x, int y, - unsigned len, - const color_type& c) - { - pixel_type v = m_blender.make_pix(c.r, c.g, c.b); - do - { - pixel_type* p = (pixel_type*)m_rbuf->row_ptr(x, y++, 1) + x; - *p = v; - } - while(--len); - } - - //-------------------------------------------------------------------- - void blend_hline(int x, int y, - unsigned len, - const color_type& c, - int8u cover) - { - if (c.a) - { - pixel_type* p = (pixel_type*)m_rbuf->row_ptr(x, y, len) + x; - calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8; - if(alpha == base_mask) - { - pixel_type v = m_blender.make_pix(c.r, c.g, c.b); - do - { - *p++ = v; - } - while(--len); - } - else - { - do - { - m_blender.blend_pix(p, c.r, c.g, c.b, alpha, cover); - ++p; - } - while(--len); - } - } - } - - //-------------------------------------------------------------------- - void blend_vline(int x, int y, - unsigned len, - const color_type& c, - int8u cover) - { - if (c.a) - { - calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8; - if(alpha == base_mask) - { - pixel_type v = m_blender.make_pix(c.r, c.g, c.b); - do - { - ((pixel_type*)m_rbuf->row_ptr(x, y++, 1))[x] = v; - } - while(--len); - } - else - { - do - { - m_blender.blend_pix( - (pixel_type*)m_rbuf->row_ptr(x, y++, 1), - c.r, c.g, c.b, alpha, cover); - } - while(--len); - } - } - } - - //-------------------------------------------------------------------- - void blend_solid_hspan(int x, int y, - unsigned len, - const color_type& c, - const int8u* covers) - { - pixel_type* p = (pixel_type*)m_rbuf->row_ptr(x, y, len) + x; - do - { - copy_or_blend_pix(p, c, *covers++); - ++p; - } - while(--len); - } - - //-------------------------------------------------------------------- - void blend_solid_vspan(int x, int y, - unsigned len, - const color_type& c, - const int8u* covers) - { - do - { - copy_or_blend_pix((pixel_type*)m_rbuf->row_ptr(x, y++, 1) + x, - c, *covers++); - } - while(--len); - } - - //-------------------------------------------------------------------- - void copy_color_hspan(int x, int y, - unsigned len, - const color_type* colors) - { - pixel_type* p = (pixel_type*)m_rbuf->row_ptr(x, y, len) + x; - do - { - *p++ = m_blender.make_pix(colors->r, colors->g, colors->b); - ++colors; - } - while(--len); - } - - //-------------------------------------------------------------------- - void copy_color_vspan(int x, int y, - unsigned len, - const color_type* colors) - { - do - { - pixel_type* p = (pixel_type*)m_rbuf->row_ptr(x, y++, 1) + x; - *p = m_blender.make_pix(colors->r, colors->g, colors->b); - ++colors; - } - while(--len); - } - - //-------------------------------------------------------------------- - void blend_color_hspan(int x, int y, - unsigned len, - const color_type* colors, - const int8u* covers, - int8u cover) - { - pixel_type* p = (pixel_type*)m_rbuf->row_ptr(x, y, len) + x; - do - { - copy_or_blend_pix(p++, *colors++, covers ? *covers++ : cover); - } - while(--len); - } - - //-------------------------------------------------------------------- - void blend_color_vspan(int x, int y, - unsigned len, - const color_type* colors, - const int8u* covers, - int8u cover) - { - do - { - copy_or_blend_pix((pixel_type*)m_rbuf->row_ptr(x, y++, 1) + x, - *colors++, covers ? *covers++ : cover); - } - while(--len); - } - - //-------------------------------------------------------------------- - template - void copy_from(const RenBuf2& from, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len) - { - const int8u* p = from.row_ptr(ysrc); - if(p) - { - memmove(m_rbuf->row_ptr(xdst, ydst, len) + xdst * pix_width, - p + xsrc * pix_width, - len * pix_width); - } - } - - //-------------------------------------------------------------------- - template - void blend_from(const SrcPixelFormatRenderer& from, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len, - int8u cover) - { - typedef typename SrcPixelFormatRenderer::order_type src_order; - - const value_type* psrc = (const value_type*)from.row_ptr(ysrc); - if(psrc) - { - psrc += xsrc * 4; - pixel_type* pdst = - (pixel_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst; - do - { - value_type alpha = psrc[src_order::A]; - if(alpha) - { - if(alpha == base_mask && cover == 255) - { - *pdst = m_blender.make_pix(psrc[src_order::R], - psrc[src_order::G], - psrc[src_order::B]); - } - else - { - m_blender.blend_pix(pdst, - psrc[src_order::R], - psrc[src_order::G], - psrc[src_order::B], - alpha, - cover); - } - } - psrc += 4; - ++pdst; - } - while(--len); - } - } - - //-------------------------------------------------------------------- - template - void blend_from_color(const SrcPixelFormatRenderer& from, - const color_type& color, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len, - int8u cover) - { - typedef typename SrcPixelFormatRenderer::value_type src_value_type; - const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc); - if(psrc) - { - pixel_type* pdst = - (pixel_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst; - - do - { - m_blender.blend_pix(pdst, - color.r, color.g, color.b, color.a, - cover); - ++psrc; - ++pdst; - } - while(--len); - } - } - - //-------------------------------------------------------------------- - template - void blend_from_lut(const SrcPixelFormatRenderer& from, - const color_type* color_lut, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len, - int8u cover) - { - typedef typename SrcPixelFormatRenderer::value_type src_value_type; - const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc); - if(psrc) - { - pixel_type* pdst = - (pixel_type*)m_rbuf->row_ptr(xdst, ydst, len) + xdst; - - do - { - const color_type& color = color_lut[*psrc]; - m_blender.blend_pix(pdst, - color.r, color.g, color.b, color.a, - cover); - ++psrc; - ++pdst; - } - while(--len); - } - } - - - - private: - rbuf_type* m_rbuf; - Blender m_blender; - }; - - typedef pixfmt_alpha_blend_rgb_packed pixfmt_rgb555; //----pixfmt_rgb555 - typedef pixfmt_alpha_blend_rgb_packed pixfmt_rgb565; //----pixfmt_rgb565 - - typedef pixfmt_alpha_blend_rgb_packed pixfmt_rgb555_pre; //----pixfmt_rgb555_pre - typedef pixfmt_alpha_blend_rgb_packed pixfmt_rgb565_pre; //----pixfmt_rgb565_pre - - typedef pixfmt_alpha_blend_rgb_packed pixfmt_rgbAAA; //----pixfmt_rgbAAA - typedef pixfmt_alpha_blend_rgb_packed pixfmt_bgrAAA; //----pixfmt_bgrAAA - typedef pixfmt_alpha_blend_rgb_packed pixfmt_rgbBBA; //----pixfmt_rgbBBA - typedef pixfmt_alpha_blend_rgb_packed pixfmt_bgrABB; //----pixfmt_bgrABB - - typedef pixfmt_alpha_blend_rgb_packed pixfmt_rgbAAA_pre; //----pixfmt_rgbAAA_pre - typedef pixfmt_alpha_blend_rgb_packed pixfmt_bgrAAA_pre; //----pixfmt_bgrAAA_pre - typedef pixfmt_alpha_blend_rgb_packed pixfmt_rgbBBA_pre; //----pixfmt_rgbBBA_pre - typedef pixfmt_alpha_blend_rgb_packed pixfmt_bgrABB_pre; //----pixfmt_bgrABB_pre - - - //-----------------------------------------------------pixfmt_rgb555_gamma - template class pixfmt_rgb555_gamma : - public pixfmt_alpha_blend_rgb_packed, - rendering_buffer> - { - public: - pixfmt_rgb555_gamma(rendering_buffer& rb, const Gamma& g) : - pixfmt_alpha_blend_rgb_packed, - rendering_buffer>(rb) - { - this->blender().gamma(g); - } - }; - - - //-----------------------------------------------------pixfmt_rgb565_gamma - template class pixfmt_rgb565_gamma : - public pixfmt_alpha_blend_rgb_packed, rendering_buffer> - { - public: - pixfmt_rgb565_gamma(rendering_buffer& rb, const Gamma& g) : - pixfmt_alpha_blend_rgb_packed, rendering_buffer>(rb) - { - this->blender().gamma(g); - } - }; - - - //-----------------------------------------------------pixfmt_rgbAAA_gamma - template class pixfmt_rgbAAA_gamma : - public pixfmt_alpha_blend_rgb_packed, - rendering_buffer> - { - public: - pixfmt_rgbAAA_gamma(rendering_buffer& rb, const Gamma& g) : - pixfmt_alpha_blend_rgb_packed, - rendering_buffer>(rb) - { - this->blender().gamma(g); - } - }; - - - //-----------------------------------------------------pixfmt_bgrAAA_gamma - template class pixfmt_bgrAAA_gamma : - public pixfmt_alpha_blend_rgb_packed, - rendering_buffer> - { - public: - pixfmt_bgrAAA_gamma(rendering_buffer& rb, const Gamma& g) : - pixfmt_alpha_blend_rgb_packed, - rendering_buffer>(rb) - { - this->blender().gamma(g); - } - }; - - - //-----------------------------------------------------pixfmt_rgbBBA_gamma - template class pixfmt_rgbBBA_gamma : - public pixfmt_alpha_blend_rgb_packed, - rendering_buffer> - { - public: - pixfmt_rgbBBA_gamma(rendering_buffer& rb, const Gamma& g) : - pixfmt_alpha_blend_rgb_packed, - rendering_buffer>(rb) - { - this->blender().gamma(g); - } - }; - - - //-----------------------------------------------------pixfmt_bgrABB_gamma - template class pixfmt_bgrABB_gamma : - public pixfmt_alpha_blend_rgb_packed, - rendering_buffer> - { - public: - pixfmt_bgrABB_gamma(rendering_buffer& rb, const Gamma& g) : - pixfmt_alpha_blend_rgb_packed, - rendering_buffer>(rb) - { - this->blender().gamma(g); - } - }; - - -} - -#endif - diff --git a/uppdev/aggdraw/agg_pixfmt_rgba.h b/uppdev/aggdraw/agg_pixfmt_rgba.h deleted file mode 100644 index a6424c918..000000000 --- a/uppdev/aggdraw/agg_pixfmt_rgba.h +++ /dev/null @@ -1,2911 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// Adaptation for high precision colors has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- - -#ifndef AGG_PIXFMT_RGBA_INCLUDED -#define AGG_PIXFMT_RGBA_INCLUDED - -#include -#include -#include "agg_basics.h" -#include "agg_color_rgba.h" -#include "agg_rendering_buffer.h" - -namespace agg -{ - - //=========================================================multiplier_rgba - template struct multiplier_rgba - { - typedef typename ColorT::value_type value_type; - typedef typename ColorT::calc_type calc_type; - - //-------------------------------------------------------------------- - static AGG_INLINE void premultiply(value_type* p) - { - calc_type a = p[Order::A]; - if(a < ColorT::base_mask) - { - if(a == 0) - { - p[Order::R] = p[Order::G] = p[Order::B] = 0; - return; - } - p[Order::R] = value_type((p[Order::R] * a + ColorT::base_mask) >> ColorT::base_shift); - p[Order::G] = value_type((p[Order::G] * a + ColorT::base_mask) >> ColorT::base_shift); - p[Order::B] = value_type((p[Order::B] * a + ColorT::base_mask) >> ColorT::base_shift); - } - } - - - //-------------------------------------------------------------------- - static AGG_INLINE void demultiply(value_type* p) - { - calc_type a = p[Order::A]; - if(a < ColorT::base_mask) - { - if(a == 0) - { - p[Order::R] = p[Order::G] = p[Order::B] = 0; - return; - } - calc_type r = (calc_type(p[Order::R]) * ColorT::base_mask) / a; - calc_type g = (calc_type(p[Order::G]) * ColorT::base_mask) / a; - calc_type b = (calc_type(p[Order::B]) * ColorT::base_mask) / a; - p[Order::R] = value_type((r > ColorT::base_mask) ? ColorT::base_mask : r); - p[Order::G] = value_type((g > ColorT::base_mask) ? ColorT::base_mask : g); - p[Order::B] = value_type((b > ColorT::base_mask) ? ColorT::base_mask : b); - } - } - }; - - //=====================================================apply_gamma_dir_rgba - template class apply_gamma_dir_rgba - { - public: - typedef typename ColorT::value_type value_type; - - apply_gamma_dir_rgba(const GammaLut& gamma) : m_gamma(gamma) {} - - AGG_INLINE void operator () (value_type* p) - { - p[Order::R] = m_gamma.dir(p[Order::R]); - p[Order::G] = m_gamma.dir(p[Order::G]); - p[Order::B] = m_gamma.dir(p[Order::B]); - } - - private: - const GammaLut& m_gamma; - }; - - //=====================================================apply_gamma_inv_rgba - template class apply_gamma_inv_rgba - { - public: - typedef typename ColorT::value_type value_type; - - apply_gamma_inv_rgba(const GammaLut& gamma) : m_gamma(gamma) {} - - AGG_INLINE void operator () (value_type* p) - { - p[Order::R] = m_gamma.inv(p[Order::R]); - p[Order::G] = m_gamma.inv(p[Order::G]); - p[Order::B] = m_gamma.inv(p[Order::B]); - } - - private: - const GammaLut& m_gamma; - }; - - - - - - - - - - - //=============================================================blender_rgba - template struct blender_rgba - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - static AGG_INLINE void blend_pix(value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned cover=0) - { - calc_type r = p[Order::R]; - calc_type g = p[Order::G]; - calc_type b = p[Order::B]; - calc_type a = p[Order::A]; - p[Order::R] = (value_type)(((cr - r) * alpha + (r << base_shift)) >> base_shift); - p[Order::G] = (value_type)(((cg - g) * alpha + (g << base_shift)) >> base_shift); - p[Order::B] = (value_type)(((cb - b) * alpha + (b << base_shift)) >> base_shift); - p[Order::A] = (value_type)((alpha + a) - ((alpha * a + base_mask) >> base_shift)); - } - }; - - //=========================================================blender_rgba_pre - template struct blender_rgba_pre - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - static AGG_INLINE void blend_pix(value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned cover) - { - alpha = color_type::base_mask - alpha; - cover = (cover + 1) << (base_shift - 8); - p[Order::R] = (value_type)((p[Order::R] * alpha + cr * cover) >> base_shift); - p[Order::G] = (value_type)((p[Order::G] * alpha + cg * cover) >> base_shift); - p[Order::B] = (value_type)((p[Order::B] * alpha + cb * cover) >> base_shift); - p[Order::A] = (value_type)(base_mask - ((alpha * (base_mask - p[Order::A])) >> base_shift)); - } - - //-------------------------------------------------------------------- - static AGG_INLINE void blend_pix(value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha) - { - alpha = color_type::base_mask - alpha; - p[Order::R] = (value_type)(((p[Order::R] * alpha) >> base_shift) + cr); - p[Order::G] = (value_type)(((p[Order::G] * alpha) >> base_shift) + cg); - p[Order::B] = (value_type)(((p[Order::B] * alpha) >> base_shift) + cb); - p[Order::A] = (value_type)(base_mask - ((alpha * (base_mask - p[Order::A])) >> base_shift)); - } - }; - - //======================================================blender_rgba_plain - template struct blender_rgba_plain - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e { base_shift = color_type::base_shift }; - - //-------------------------------------------------------------------- - static AGG_INLINE void blend_pix(value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned cover=0) - { - if(alpha == 0) return; - calc_type a = p[Order::A]; - calc_type r = p[Order::R] * a; - calc_type g = p[Order::G] * a; - calc_type b = p[Order::B] * a; - a = ((alpha + a) << base_shift) - alpha * a; - p[Order::A] = (value_type)(a >> base_shift); - p[Order::R] = (value_type)((((cr << base_shift) - r) * alpha + (r << base_shift)) / a); - p[Order::G] = (value_type)((((cg << base_shift) - g) * alpha + (g << base_shift)) / a); - p[Order::B] = (value_type)((((cb << base_shift) - b) * alpha + (b << base_shift)) / a); - } - }; - - - - - - - - - - - - //=========================================================comp_op_rgba_clear - template struct comp_op_rgba_clear - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - static AGG_INLINE void blend_pix(value_type* p, - unsigned, unsigned, unsigned, unsigned, - unsigned cover) - { - if(cover < 255) - { - cover = 255 - cover; - p[Order::R] = (value_type)((p[Order::R] * cover + 255) >> 8); - p[Order::G] = (value_type)((p[Order::G] * cover + 255) >> 8); - p[Order::B] = (value_type)((p[Order::B] * cover + 255) >> 8); - p[Order::A] = (value_type)((p[Order::A] * cover + 255) >> 8); - } - else - { - p[0] = p[1] = p[2] = p[3] = 0; - } - } - }; - - //===========================================================comp_op_rgba_src - template struct comp_op_rgba_src - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - unsigned alpha = 255 - cover; - p[Order::R] = (value_type)(((p[Order::R] * alpha + 255) >> 8) + ((sr * cover + 255) >> 8)); - p[Order::G] = (value_type)(((p[Order::G] * alpha + 255) >> 8) + ((sg * cover + 255) >> 8)); - p[Order::B] = (value_type)(((p[Order::B] * alpha + 255) >> 8) + ((sb * cover + 255) >> 8)); - p[Order::A] = (value_type)(((p[Order::A] * alpha + 255) >> 8) + ((sa * cover + 255) >> 8)); - } - else - { - p[Order::R] = sr; - p[Order::G] = sg; - p[Order::B] = sb; - p[Order::A] = sa; - } - } - }; - - //===========================================================comp_op_rgba_dst - template struct comp_op_rgba_dst - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - - static AGG_INLINE void blend_pix(value_type*, - unsigned, unsigned, unsigned, - unsigned, unsigned) - { - } - }; - - //======================================================comp_op_rgba_src_over - template struct comp_op_rgba_src_over - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = Sca + Dca.(1 - Sa) - // Da' = Sa + Da - Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - calc_type s1a = base_mask - sa; - p[Order::R] = (value_type)(sr + ((p[Order::R] * s1a + base_mask) >> base_shift)); - p[Order::G] = (value_type)(sg + ((p[Order::G] * s1a + base_mask) >> base_shift)); - p[Order::B] = (value_type)(sb + ((p[Order::B] * s1a + base_mask) >> base_shift)); - p[Order::A] = (value_type)(sa + p[Order::A] - ((sa * p[Order::A] + base_mask) >> base_shift)); - } - }; - - //======================================================comp_op_rgba_dst_over - template struct comp_op_rgba_dst_over - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = Dca + Sca.(1 - Da) - // Da' = Sa + Da - Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - calc_type d1a = base_mask - p[Order::A]; - p[Order::R] = (value_type)(p[Order::R] + ((sr * d1a + base_mask) >> base_shift)); - p[Order::G] = (value_type)(p[Order::G] + ((sg * d1a + base_mask) >> base_shift)); - p[Order::B] = (value_type)(p[Order::B] + ((sb * d1a + base_mask) >> base_shift)); - p[Order::A] = (value_type)(sa + p[Order::A] - ((sa * p[Order::A] + base_mask) >> base_shift)); - } - }; - - //======================================================comp_op_rgba_src_in - template struct comp_op_rgba_src_in - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = Sca.Da - // Da' = Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - calc_type da = p[Order::A]; - if(cover < 255) - { - unsigned alpha = 255 - cover; - p[Order::R] = (value_type)(((p[Order::R] * alpha + 255) >> 8) + ((((sr * da + base_mask) >> base_shift) * cover + 255) >> 8)); - p[Order::G] = (value_type)(((p[Order::G] * alpha + 255) >> 8) + ((((sg * da + base_mask) >> base_shift) * cover + 255) >> 8)); - p[Order::B] = (value_type)(((p[Order::B] * alpha + 255) >> 8) + ((((sb * da + base_mask) >> base_shift) * cover + 255) >> 8)); - p[Order::A] = (value_type)(((p[Order::A] * alpha + 255) >> 8) + ((((sa * da + base_mask) >> base_shift) * cover + 255) >> 8)); - } - else - { - p[Order::R] = (value_type)((sr * da + base_mask) >> base_shift); - p[Order::G] = (value_type)((sg * da + base_mask) >> base_shift); - p[Order::B] = (value_type)((sb * da + base_mask) >> base_shift); - p[Order::A] = (value_type)((sa * da + base_mask) >> base_shift); - } - } - }; - - //======================================================comp_op_rgba_dst_in - template struct comp_op_rgba_dst_in - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = Dca.Sa - // Da' = Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned, unsigned, unsigned, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sa = base_mask - ((cover * (base_mask - sa) + 255) >> 8); - } - p[Order::R] = (value_type)((p[Order::R] * sa + base_mask) >> base_shift); - p[Order::G] = (value_type)((p[Order::G] * sa + base_mask) >> base_shift); - p[Order::B] = (value_type)((p[Order::B] * sa + base_mask) >> base_shift); - p[Order::A] = (value_type)((p[Order::A] * sa + base_mask) >> base_shift); - } - }; - - //======================================================comp_op_rgba_src_out - template struct comp_op_rgba_src_out - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = Sca.(1 - Da) - // Da' = Sa.(1 - Da) - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - calc_type da = base_mask - p[Order::A]; - if(cover < 255) - { - unsigned alpha = 255 - cover; - p[Order::R] = (value_type)(((p[Order::R] * alpha + 255) >> 8) + ((((sr * da + base_mask) >> base_shift) * cover + 255) >> 8)); - p[Order::G] = (value_type)(((p[Order::G] * alpha + 255) >> 8) + ((((sg * da + base_mask) >> base_shift) * cover + 255) >> 8)); - p[Order::B] = (value_type)(((p[Order::B] * alpha + 255) >> 8) + ((((sb * da + base_mask) >> base_shift) * cover + 255) >> 8)); - p[Order::A] = (value_type)(((p[Order::A] * alpha + 255) >> 8) + ((((sa * da + base_mask) >> base_shift) * cover + 255) >> 8)); - } - else - { - p[Order::R] = (value_type)((sr * da + base_mask) >> base_shift); - p[Order::G] = (value_type)((sg * da + base_mask) >> base_shift); - p[Order::B] = (value_type)((sb * da + base_mask) >> base_shift); - p[Order::A] = (value_type)((sa * da + base_mask) >> base_shift); - } - } - }; - - //======================================================comp_op_rgba_dst_out - template struct comp_op_rgba_dst_out - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = Dca.(1 - Sa) - // Da' = Da.(1 - Sa) - static AGG_INLINE void blend_pix(value_type* p, - unsigned, unsigned, unsigned, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sa = (sa * cover + 255) >> 8; - } - sa = base_mask - sa; - p[Order::R] = (value_type)((p[Order::R] * sa + base_shift) >> base_shift); - p[Order::G] = (value_type)((p[Order::G] * sa + base_shift) >> base_shift); - p[Order::B] = (value_type)((p[Order::B] * sa + base_shift) >> base_shift); - p[Order::A] = (value_type)((p[Order::A] * sa + base_shift) >> base_shift); - } - }; - - //=====================================================comp_op_rgba_src_atop - template struct comp_op_rgba_src_atop - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = Sca.Da + Dca.(1 - Sa) - // Da' = Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - calc_type da = p[Order::A]; - sa = base_mask - sa; - p[Order::R] = (value_type)((sr * da + p[Order::R] * sa + base_mask) >> base_shift); - p[Order::G] = (value_type)((sg * da + p[Order::G] * sa + base_mask) >> base_shift); - p[Order::B] = (value_type)((sb * da + p[Order::B] * sa + base_mask) >> base_shift); - } - }; - - //=====================================================comp_op_rgba_dst_atop - template struct comp_op_rgba_dst_atop - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = Dca.Sa + Sca.(1 - Da) - // Da' = Sa - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - calc_type da = base_mask - p[Order::A]; - if(cover < 255) - { - unsigned alpha = 255 - cover; - sr = (p[Order::R] * sa + sr * da + base_mask) >> base_shift; - sg = (p[Order::G] * sa + sg * da + base_mask) >> base_shift; - sb = (p[Order::B] * sa + sb * da + base_mask) >> base_shift; - p[Order::R] = (value_type)(((p[Order::R] * alpha + 255) >> 8) + ((sr * cover + 255) >> 8)); - p[Order::G] = (value_type)(((p[Order::G] * alpha + 255) >> 8) + ((sg * cover + 255) >> 8)); - p[Order::B] = (value_type)(((p[Order::B] * alpha + 255) >> 8) + ((sb * cover + 255) >> 8)); - p[Order::A] = (value_type)(((p[Order::A] * alpha + 255) >> 8) + ((sa * cover + 255) >> 8)); - - } - else - { - p[Order::R] = (value_type)((p[Order::R] * sa + sr * da + base_mask) >> base_shift); - p[Order::G] = (value_type)((p[Order::G] * sa + sg * da + base_mask) >> base_shift); - p[Order::B] = (value_type)((p[Order::B] * sa + sb * da + base_mask) >> base_shift); - p[Order::A] = (value_type)sa; - } - } - }; - - //=========================================================comp_op_rgba_xor - template struct comp_op_rgba_xor - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = Sca.(1 - Da) + Dca.(1 - Sa) - // Da' = Sa + Da - 2.Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - if(sa) - { - calc_type s1a = base_mask - sa; - calc_type d1a = base_mask - p[Order::A]; - p[Order::R] = (value_type)((p[Order::R] * s1a + sr * d1a + base_mask) >> base_shift); - p[Order::G] = (value_type)((p[Order::G] * s1a + sg * d1a + base_mask) >> base_shift); - p[Order::B] = (value_type)((p[Order::B] * s1a + sb * d1a + base_mask) >> base_shift); - p[Order::A] = (value_type)(sa + p[Order::A] - ((sa * p[Order::A] + base_mask/2) >> (base_shift - 1))); - } - } - }; - - //=========================================================comp_op_rgba_plus - template struct comp_op_rgba_plus - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = Sca + Dca - // Da' = Sa + Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - if(sa) - { - calc_type dr = p[Order::R] + sr; - calc_type dg = p[Order::G] + sg; - calc_type db = p[Order::B] + sb; - calc_type da = p[Order::A] + sa; - p[Order::R] = (dr > base_mask) ? (value_type)base_mask : dr; - p[Order::G] = (dg > base_mask) ? (value_type)base_mask : dg; - p[Order::B] = (db > base_mask) ? (value_type)base_mask : db; - p[Order::A] = (da > base_mask) ? (value_type)base_mask : da; - } - } - }; - - //========================================================comp_op_rgba_minus - template struct comp_op_rgba_minus - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = Dca - Sca - // Da' = 1 - (1 - Sa).(1 - Da) - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - if(sa) - { - calc_type dr = p[Order::R] - sr; - calc_type dg = p[Order::G] - sg; - calc_type db = p[Order::B] - sb; - p[Order::R] = (dr > base_mask) ? 0 : dr; - p[Order::G] = (dg > base_mask) ? 0 : dg; - p[Order::B] = (db > base_mask) ? 0 : db; - p[Order::A] = (value_type)(sa + p[Order::A] - ((sa * p[Order::A] + base_mask) >> base_shift)); - //p[Order::A] = (value_type)(base_mask - (((base_mask - sa) * (base_mask - p[Order::A]) + base_mask) >> base_shift)); - } - } - }; - - //=====================================================comp_op_rgba_multiply - template struct comp_op_rgba_multiply - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = Sca.Dca + Sca.(1 - Da) + Dca.(1 - Sa) - // Da' = Sa + Da - Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - if(sa) - { - calc_type s1a = base_mask - sa; - calc_type d1a = base_mask - p[Order::A]; - calc_type dr = p[Order::R]; - calc_type dg = p[Order::G]; - calc_type db = p[Order::B]; - p[Order::R] = (value_type)((sr * dr + sr * d1a + dr * s1a + base_mask) >> base_shift); - p[Order::G] = (value_type)((sg * dg + sg * d1a + dg * s1a + base_mask) >> base_shift); - p[Order::B] = (value_type)((sb * db + sb * d1a + db * s1a + base_mask) >> base_shift); - p[Order::A] = (value_type)(sa + p[Order::A] - ((sa * p[Order::A] + base_mask) >> base_shift)); - } - } - }; - - //=====================================================comp_op_rgba_screen - template struct comp_op_rgba_screen - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = Sca + Dca - Sca.Dca - // Da' = Sa + Da - Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - if(sa) - { - calc_type dr = p[Order::R]; - calc_type dg = p[Order::G]; - calc_type db = p[Order::B]; - calc_type da = p[Order::A]; - p[Order::R] = (value_type)(sr + dr - ((sr * dr + base_mask) >> base_shift)); - p[Order::G] = (value_type)(sg + dg - ((sg * dg + base_mask) >> base_shift)); - p[Order::B] = (value_type)(sb + db - ((sb * db + base_mask) >> base_shift)); - p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); - } - } - }; - - //=====================================================comp_op_rgba_overlay - template struct comp_op_rgba_overlay - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // if 2.Dca < Da - // Dca' = 2.Sca.Dca + Sca.(1 - Da) + Dca.(1 - Sa) - // otherwise - // Dca' = Sa.Da - 2.(Da - Dca).(Sa - Sca) + Sca.(1 - Da) + Dca.(1 - Sa) - // - // Da' = Sa + Da - Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - if(sa) - { - calc_type d1a = base_mask - p[Order::A]; - calc_type s1a = base_mask - sa; - calc_type dr = p[Order::R]; - calc_type dg = p[Order::G]; - calc_type db = p[Order::B]; - calc_type da = p[Order::A]; - calc_type sada = sa * p[Order::A]; - - p[Order::R] = (value_type)(((2*dr < da) ? - 2*sr*dr + sr*d1a + dr*s1a : - sada - 2*(da - dr)*(sa - sr) + sr*d1a + dr*s1a + base_mask) >> base_shift); - - p[Order::G] = (value_type)(((2*dg < da) ? - 2*sg*dg + sg*d1a + dg*s1a : - sada - 2*(da - dg)*(sa - sg) + sg*d1a + dg*s1a + base_mask) >> base_shift); - - p[Order::B] = (value_type)(((2*db < da) ? - 2*sb*db + sb*d1a + db*s1a : - sada - 2*(da - db)*(sa - sb) + sb*d1a + db*s1a + base_mask) >> base_shift); - - p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); - } - } - }; - - - template inline T sd_min(T a, T b) { return (a < b) ? a : b; } - template inline T sd_max(T a, T b) { return (a > b) ? a : b; } - - //=====================================================comp_op_rgba_darken - template struct comp_op_rgba_darken - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = min(Sca.Da, Dca.Sa) + Sca.(1 - Da) + Dca.(1 - Sa) - // Da' = Sa + Da - Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - if(sa) - { - calc_type d1a = base_mask - p[Order::A]; - calc_type s1a = base_mask - sa; - calc_type dr = p[Order::R]; - calc_type dg = p[Order::G]; - calc_type db = p[Order::B]; - calc_type da = p[Order::A]; - - p[Order::R] = (value_type)((sd_min(sr * da, dr * sa) + sr * d1a + dr * s1a + base_mask) >> base_shift); - p[Order::G] = (value_type)((sd_min(sg * da, dg * sa) + sg * d1a + dg * s1a + base_mask) >> base_shift); - p[Order::B] = (value_type)((sd_min(sb * da, db * sa) + sb * d1a + db * s1a + base_mask) >> base_shift); - p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); - } - } - }; - - //=====================================================comp_op_rgba_lighten - template struct comp_op_rgba_lighten - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = max(Sca.Da, Dca.Sa) + Sca.(1 - Da) + Dca.(1 - Sa) - // Da' = Sa + Da - Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - if(sa) - { - calc_type d1a = base_mask - p[Order::A]; - calc_type s1a = base_mask - sa; - calc_type dr = p[Order::R]; - calc_type dg = p[Order::G]; - calc_type db = p[Order::B]; - calc_type da = p[Order::A]; - - p[Order::R] = (value_type)((sd_max(sr * da, dr * sa) + sr * d1a + dr * s1a + base_mask) >> base_shift); - p[Order::G] = (value_type)((sd_max(sg * da, dg * sa) + sg * d1a + dg * s1a + base_mask) >> base_shift); - p[Order::B] = (value_type)((sd_max(sb * da, db * sa) + sb * d1a + db * s1a + base_mask) >> base_shift); - p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); - } - } - }; - - //=====================================================comp_op_rgba_color_dodge - template struct comp_op_rgba_color_dodge - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - typedef typename color_type::long_type long_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // if Sca.Da + Dca.Sa >= Sa.Da - // Dca' = Sa.Da + Sca.(1 - Da) + Dca.(1 - Sa) - // otherwise - // Dca' = Dca.Sa/(1-Sca/Sa) + Sca.(1 - Da) + Dca.(1 - Sa) - // - // Da' = Sa + Da - Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - if(sa) - { - calc_type d1a = base_mask - p[Order::A]; - calc_type s1a = base_mask - sa; - calc_type dr = p[Order::R]; - calc_type dg = p[Order::G]; - calc_type db = p[Order::B]; - calc_type da = p[Order::A]; - long_type drsa = dr * sa; - long_type dgsa = dg * sa; - long_type dbsa = db * sa; - long_type srda = sr * da; - long_type sgda = sg * da; - long_type sbda = sb * da; - long_type sada = sa * da; - - p[Order::R] = (value_type)((srda + drsa >= sada) ? - (sada + sr * d1a + dr * s1a + base_mask) >> base_shift : - drsa / (base_mask - (sr << base_shift) / sa) + ((sr * d1a + dr * s1a + base_mask) >> base_shift)); - - p[Order::G] = (value_type)((sgda + dgsa >= sada) ? - (sada + sg * d1a + dg * s1a + base_mask) >> base_shift : - dgsa / (base_mask - (sg << base_shift) / sa) + ((sg * d1a + dg * s1a + base_mask) >> base_shift)); - - p[Order::B] = (value_type)((sbda + dbsa >= sada) ? - (sada + sb * d1a + db * s1a + base_mask) >> base_shift : - dbsa / (base_mask - (sb << base_shift) / sa) + ((sb * d1a + db * s1a + base_mask) >> base_shift)); - - p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); - } - } - }; - - //=====================================================comp_op_rgba_color_burn - template struct comp_op_rgba_color_burn - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - typedef typename color_type::long_type long_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // if Sca.Da + Dca.Sa <= Sa.Da - // Dca' = Sca.(1 - Da) + Dca.(1 - Sa) - // otherwise - // Dca' = Sa.(Sca.Da + Dca.Sa - Sa.Da)/Sca + Sca.(1 - Da) + Dca.(1 - Sa) - // - // Da' = Sa + Da - Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - if(sa) - { - calc_type d1a = base_mask - p[Order::A]; - calc_type s1a = base_mask - sa; - calc_type dr = p[Order::R]; - calc_type dg = p[Order::G]; - calc_type db = p[Order::B]; - calc_type da = p[Order::A]; - long_type drsa = dr * sa; - long_type dgsa = dg * sa; - long_type dbsa = db * sa; - long_type srda = sr * da; - long_type sgda = sg * da; - long_type sbda = sb * da; - long_type sada = sa * da; - - p[Order::R] = (value_type)(((srda + drsa <= sada) ? - sr * d1a + dr * s1a : - sa * (srda + drsa - sada) / sr + sr * d1a + dr * s1a + base_mask) >> base_shift); - - p[Order::G] = (value_type)(((sgda + dgsa <= sada) ? - sg * d1a + dg * s1a : - sa * (sgda + dgsa - sada) / sg + sg * d1a + dg * s1a + base_mask) >> base_shift); - - p[Order::B] = (value_type)(((sbda + dbsa <= sada) ? - sb * d1a + db * s1a : - sa * (sbda + dbsa - sada) / sb + sb * d1a + db * s1a + base_mask) >> base_shift); - - p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); - } - } - }; - - //=====================================================comp_op_rgba_hard_light - template struct comp_op_rgba_hard_light - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - typedef typename color_type::long_type long_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // if 2.Sca < Sa - // Dca' = 2.Sca.Dca + Sca.(1 - Da) + Dca.(1 - Sa) - // otherwise - // Dca' = Sa.Da - 2.(Da - Dca).(Sa - Sca) + Sca.(1 - Da) + Dca.(1 - Sa) - // - // Da' = Sa + Da - Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - if(sa) - { - calc_type d1a = base_mask - p[Order::A]; - calc_type s1a = base_mask - sa; - calc_type dr = p[Order::R]; - calc_type dg = p[Order::G]; - calc_type db = p[Order::B]; - calc_type da = p[Order::A]; - calc_type sada = sa * da; - - p[Order::R] = (value_type)(((2*sr < sa) ? - 2*sr*dr + sr*d1a + dr*s1a : - sada - 2*(da - dr)*(sa - sr) + sr*d1a + dr*s1a + base_mask) >> base_shift); - - p[Order::G] = (value_type)(((2*sg < sa) ? - 2*sg*dg + sg*d1a + dg*s1a : - sada - 2*(da - dg)*(sa - sg) + sg*d1a + dg*s1a + base_mask) >> base_shift); - - p[Order::B] = (value_type)(((2*sb < sa) ? - 2*sb*db + sb*d1a + db*s1a : - sada - 2*(da - db)*(sa - sb) + sb*d1a + db*s1a + base_mask) >> base_shift); - - p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); - } - } - }; - - //=====================================================comp_op_rgba_soft_light - template struct comp_op_rgba_soft_light - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - typedef typename color_type::long_type long_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // if 2.Sca < Sa - // Dca' = Dca.(Sa + (1 - Dca/Da).(2.Sca - Sa)) + Sca.(1 - Da) + Dca.(1 - Sa) - // otherwise if 8.Dca <= Da - // Dca' = Dca.(Sa + (1 - Dca/Da).(2.Sca - Sa).(3 - 8.Dca/Da)) + Sca.(1 - Da) + Dca.(1 - Sa) - // otherwise - // Dca' = (Dca.Sa + ((Dca/Da)^(0.5).Da - Dca).(2.Sca - Sa)) + Sca.(1 - Da) + Dca.(1 - Sa) - // - // Da' = Sa + Da - Sa.Da - - static AGG_INLINE void blend_pix(value_type* p, - unsigned r, unsigned g, unsigned b, - unsigned a, unsigned cover) - { - double sr = double(r * cover) / (base_mask * 255); - double sg = double(g * cover) / (base_mask * 255); - double sb = double(b * cover) / (base_mask * 255); - double sa = double(a * cover) / (base_mask * 255); - if(sa > 0) - { - double dr = double(p[Order::R]) / base_mask; - double dg = double(p[Order::G]) / base_mask; - double db = double(p[Order::B]) / base_mask; - double da = double(p[Order::A] ? p[Order::A] : 1) / base_mask; - if(cover < 255) - { - a = (a * cover + 255) >> 8; - } - - if(2*sr < sa) dr = dr*(sa + (1 - dr/da)*(2*sr - sa)) + sr*(1 - da) + dr*(1 - sa); - else if(8*dr <= da) dr = dr*(sa + (1 - dr/da)*(2*sr - sa)*(3 - 8*dr/da)) + sr*(1 - da) + dr*(1 - sa); - else dr = (dr*sa + (sqrt(dr/da)*da - dr)*(2*sr - sa)) + sr*(1 - da) + dr*(1 - sa); - - if(2*sg < sa) dg = dg*(sa + (1 - dg/da)*(2*sg - sa)) + sg*(1 - da) + dg*(1 - sa); - else if(8*dg <= da) dg = dg*(sa + (1 - dg/da)*(2*sg - sa)*(3 - 8*dg/da)) + sg*(1 - da) + dg*(1 - sa); - else dg = (dg*sa + (sqrt(dg/da)*da - dg)*(2*sg - sa)) + sg*(1 - da) + dg*(1 - sa); - - if(2*sb < sa) db = db*(sa + (1 - db/da)*(2*sb - sa)) + sb*(1 - da) + db*(1 - sa); - else if(8*db <= da) db = db*(sa + (1 - db/da)*(2*sb - sa)*(3 - 8*db/da)) + sb*(1 - da) + db*(1 - sa); - else db = (db*sa + (sqrt(db/da)*da - db)*(2*sb - sa)) + sb*(1 - da) + db*(1 - sa); - - p[Order::R] = (value_type)uround(dr * base_mask); - p[Order::G] = (value_type)uround(dg * base_mask); - p[Order::B] = (value_type)uround(db * base_mask); - p[Order::A] = (value_type)(a + p[Order::A] - ((a * p[Order::A] + base_mask) >> base_shift)); - } - } - }; - - //=====================================================comp_op_rgba_difference - template struct comp_op_rgba_difference - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - typedef typename color_type::long_type long_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_scale = color_type::base_scale, - base_mask = color_type::base_mask - }; - - // Dca' = Sca + Dca - 2.min(Sca.Da, Dca.Sa) - // Da' = Sa + Da - Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - if(sa) - { - calc_type dr = p[Order::R]; - calc_type dg = p[Order::G]; - calc_type db = p[Order::B]; - calc_type da = p[Order::A]; - p[Order::R] = (value_type)(sr + dr - ((2 * sd_min(sr*da, dr*sa) + base_mask) >> base_shift)); - p[Order::G] = (value_type)(sg + dg - ((2 * sd_min(sg*da, dg*sa) + base_mask) >> base_shift)); - p[Order::B] = (value_type)(sb + db - ((2 * sd_min(sb*da, db*sa) + base_mask) >> base_shift)); - p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); - } - } - }; - - //=====================================================comp_op_rgba_exclusion - template struct comp_op_rgba_exclusion - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - typedef typename color_type::long_type long_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = (Sca.Da + Dca.Sa - 2.Sca.Dca) + Sca.(1 - Da) + Dca.(1 - Sa) - // Da' = Sa + Da - Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - if(sa) - { - calc_type d1a = base_mask - p[Order::A]; - calc_type s1a = base_mask - sa; - calc_type dr = p[Order::R]; - calc_type dg = p[Order::G]; - calc_type db = p[Order::B]; - calc_type da = p[Order::A]; - p[Order::R] = (value_type)((sr*da + dr*sa - 2*sr*dr + sr*d1a + dr*s1a + base_mask) >> base_shift); - p[Order::G] = (value_type)((sg*da + dg*sa - 2*sg*dg + sg*d1a + dg*s1a + base_mask) >> base_shift); - p[Order::B] = (value_type)((sb*da + db*sa - 2*sb*db + sb*d1a + db*s1a + base_mask) >> base_shift); - p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); - } - } - }; - - //=====================================================comp_op_rgba_contrast - template struct comp_op_rgba_contrast - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - typedef typename color_type::long_type long_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - long_type dr = p[Order::R]; - long_type dg = p[Order::G]; - long_type db = p[Order::B]; - int da = p[Order::A]; - long_type d2a = da >> 1; - unsigned s2a = sa >> 1; - - int r = (int)((((dr - d2a) * int((sr - s2a)*2 + base_mask)) >> base_shift) + d2a); - int g = (int)((((dg - d2a) * int((sg - s2a)*2 + base_mask)) >> base_shift) + d2a); - int b = (int)((((db - d2a) * int((sb - s2a)*2 + base_mask)) >> base_shift) + d2a); - - r = (r < 0) ? 0 : r; - g = (g < 0) ? 0 : g; - b = (b < 0) ? 0 : b; - - p[Order::R] = (value_type)((r > da) ? da : r); - p[Order::G] = (value_type)((g > da) ? da : g); - p[Order::B] = (value_type)((b > da) ? da : b); - } - }; - - //=====================================================comp_op_rgba_invert - template struct comp_op_rgba_invert - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - typedef typename color_type::long_type long_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = (Da - Dca) * Sa + Dca.(1 - Sa) - // Da' = Sa + Da - Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - sa = (sa * cover + 255) >> 8; - if(sa) - { - calc_type da = p[Order::A]; - calc_type dr = ((da - p[Order::R]) * sa + base_mask) >> base_shift; - calc_type dg = ((da - p[Order::G]) * sa + base_mask) >> base_shift; - calc_type db = ((da - p[Order::B]) * sa + base_mask) >> base_shift; - calc_type s1a = base_mask - sa; - p[Order::R] = (value_type)(dr + ((p[Order::R] * s1a + base_mask) >> base_shift)); - p[Order::G] = (value_type)(dg + ((p[Order::G] * s1a + base_mask) >> base_shift)); - p[Order::B] = (value_type)(db + ((p[Order::B] * s1a + base_mask) >> base_shift)); - p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); - } - } - }; - - //=================================================comp_op_rgba_invert_rgb - template struct comp_op_rgba_invert_rgb - { - typedef ColorT color_type; - typedef Order order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - typedef typename color_type::long_type long_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - // Dca' = (Da - Dca) * Sca + Dca.(1 - Sa) - // Da' = Sa + Da - Sa.Da - static AGG_INLINE void blend_pix(value_type* p, - unsigned sr, unsigned sg, unsigned sb, - unsigned sa, unsigned cover) - { - if(cover < 255) - { - sr = (sr * cover + 255) >> 8; - sg = (sg * cover + 255) >> 8; - sb = (sb * cover + 255) >> 8; - sa = (sa * cover + 255) >> 8; - } - if(sa) - { - calc_type da = p[Order::A]; - calc_type dr = ((da - p[Order::R]) * sr + base_mask) >> base_shift; - calc_type dg = ((da - p[Order::G]) * sg + base_mask) >> base_shift; - calc_type db = ((da - p[Order::B]) * sb + base_mask) >> base_shift; - calc_type s1a = base_mask - sa; - p[Order::R] = (value_type)(dr + ((p[Order::R] * s1a + base_mask) >> base_shift)); - p[Order::G] = (value_type)(dg + ((p[Order::G] * s1a + base_mask) >> base_shift)); - p[Order::B] = (value_type)(db + ((p[Order::B] * s1a + base_mask) >> base_shift)); - p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift)); - } - } - }; - - - - - - //======================================================comp_op_table_rgba - template struct comp_op_table_rgba - { - typedef typename ColorT::value_type value_type; - typedef void (*comp_op_func_type)(value_type* p, - unsigned cr, - unsigned cg, - unsigned cb, - unsigned ca, - unsigned cover); - static comp_op_func_type g_comp_op_func[]; - }; - - //==========================================================g_comp_op_func - template - typename comp_op_table_rgba::comp_op_func_type - comp_op_table_rgba::g_comp_op_func[] = - { - comp_op_rgba_clear ::blend_pix, - comp_op_rgba_src ::blend_pix, - comp_op_rgba_dst ::blend_pix, - comp_op_rgba_src_over ::blend_pix, - comp_op_rgba_dst_over ::blend_pix, - comp_op_rgba_src_in ::blend_pix, - comp_op_rgba_dst_in ::blend_pix, - comp_op_rgba_src_out ::blend_pix, - comp_op_rgba_dst_out ::blend_pix, - comp_op_rgba_src_atop ::blend_pix, - comp_op_rgba_dst_atop ::blend_pix, - comp_op_rgba_xor ::blend_pix, - comp_op_rgba_plus ::blend_pix, - comp_op_rgba_minus ::blend_pix, - comp_op_rgba_multiply ::blend_pix, - comp_op_rgba_screen ::blend_pix, - comp_op_rgba_overlay ::blend_pix, - comp_op_rgba_darken ::blend_pix, - comp_op_rgba_lighten ::blend_pix, - comp_op_rgba_color_dodge::blend_pix, - comp_op_rgba_color_burn ::blend_pix, - comp_op_rgba_hard_light ::blend_pix, - comp_op_rgba_soft_light ::blend_pix, - comp_op_rgba_difference ::blend_pix, - comp_op_rgba_exclusion ::blend_pix, - comp_op_rgba_contrast ::blend_pix, - comp_op_rgba_invert ::blend_pix, - comp_op_rgba_invert_rgb ::blend_pix, - 0 - }; - - - //==============================================================comp_op_e - enum comp_op_e - { - comp_op_clear, //----comp_op_clear - comp_op_src, //----comp_op_src - comp_op_dst, //----comp_op_dst - comp_op_src_over, //----comp_op_src_over - comp_op_dst_over, //----comp_op_dst_over - comp_op_src_in, //----comp_op_src_in - comp_op_dst_in, //----comp_op_dst_in - comp_op_src_out, //----comp_op_src_out - comp_op_dst_out, //----comp_op_dst_out - comp_op_src_atop, //----comp_op_src_atop - comp_op_dst_atop, //----comp_op_dst_atop - comp_op_xor, //----comp_op_xor - comp_op_plus, //----comp_op_plus - comp_op_minus, //----comp_op_minus - comp_op_multiply, //----comp_op_multiply - comp_op_screen, //----comp_op_screen - comp_op_overlay, //----comp_op_overlay - comp_op_darken, //----comp_op_darken - comp_op_lighten, //----comp_op_lighten - comp_op_color_dodge, //----comp_op_color_dodge - comp_op_color_burn, //----comp_op_color_burn - comp_op_hard_light, //----comp_op_hard_light - comp_op_soft_light, //----comp_op_soft_light - comp_op_difference, //----comp_op_difference - comp_op_exclusion, //----comp_op_exclusion - comp_op_contrast, //----comp_op_contrast - comp_op_invert, //----comp_op_invert - comp_op_invert_rgb, //----comp_op_invert_rgb - - end_of_comp_op_e - }; - - - - - - - - //====================================================comp_op_adaptor_rgba - template struct comp_op_adaptor_rgba - { - typedef Order order_type; - typedef ColorT color_type; - typedef typename color_type::value_type value_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - static AGG_INLINE void blend_pix(unsigned op, value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned ca, - unsigned cover) - { - comp_op_table_rgba::g_comp_op_func[op] - (p, (cr * ca + base_mask) >> base_shift, - (cg * ca + base_mask) >> base_shift, - (cb * ca + base_mask) >> base_shift, - ca, cover); - } - }; - - //=========================================comp_op_adaptor_clip_to_dst_rgba - template struct comp_op_adaptor_clip_to_dst_rgba - { - typedef Order order_type; - typedef ColorT color_type; - typedef typename color_type::value_type value_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - static AGG_INLINE void blend_pix(unsigned op, value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned ca, - unsigned cover) - { - cr = (cr * ca + base_mask) >> base_shift; - cg = (cg * ca + base_mask) >> base_shift; - cb = (cb * ca + base_mask) >> base_shift; - unsigned da = p[Order::A]; - comp_op_table_rgba::g_comp_op_func[op] - (p, (cr * da + base_mask) >> base_shift, - (cg * da + base_mask) >> base_shift, - (cb * da + base_mask) >> base_shift, - (ca * da + base_mask) >> base_shift, - cover); - } - }; - - //================================================comp_op_adaptor_rgba_pre - template struct comp_op_adaptor_rgba_pre - { - typedef Order order_type; - typedef ColorT color_type; - typedef typename color_type::value_type value_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - static AGG_INLINE void blend_pix(unsigned op, value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned ca, - unsigned cover) - { - comp_op_table_rgba::g_comp_op_func[op](p, cr, cg, cb, ca, cover); - } - }; - - //=====================================comp_op_adaptor_clip_to_dst_rgba_pre - template struct comp_op_adaptor_clip_to_dst_rgba_pre - { - typedef Order order_type; - typedef ColorT color_type; - typedef typename color_type::value_type value_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - static AGG_INLINE void blend_pix(unsigned op, value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned ca, - unsigned cover) - { - unsigned da = p[Order::A]; - comp_op_table_rgba::g_comp_op_func[op] - (p, (cr * da + base_mask) >> base_shift, - (cg * da + base_mask) >> base_shift, - (cb * da + base_mask) >> base_shift, - (ca * da + base_mask) >> base_shift, - cover); - } - }; - - //=======================================================comp_adaptor_rgba - template struct comp_adaptor_rgba - { - typedef typename BlenderPre::order_type order_type; - typedef typename BlenderPre::color_type color_type; - typedef typename color_type::value_type value_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - static AGG_INLINE void blend_pix(unsigned op, value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned ca, - unsigned cover) - { - BlenderPre::blend_pix(p, - (cr * ca + base_mask) >> base_shift, - (cg * ca + base_mask) >> base_shift, - (cb * ca + base_mask) >> base_shift, - ca, cover); - } - }; - - //==========================================comp_adaptor_clip_to_dst_rgba - template struct comp_adaptor_clip_to_dst_rgba - { - typedef typename BlenderPre::order_type order_type; - typedef typename BlenderPre::color_type color_type; - typedef typename color_type::value_type value_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - static AGG_INLINE void blend_pix(unsigned op, value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned ca, - unsigned cover) - { - cr = (cr * ca + base_mask) >> base_shift; - cg = (cg * ca + base_mask) >> base_shift; - cb = (cb * ca + base_mask) >> base_shift; - unsigned da = p[order_type::A]; - BlenderPre::blend_pix(p, - (cr * da + base_mask) >> base_shift, - (cg * da + base_mask) >> base_shift, - (cb * da + base_mask) >> base_shift, - (ca * da + base_mask) >> base_shift, - cover); - } - }; - - //======================================comp_adaptor_clip_to_dst_rgba_pre - template struct comp_adaptor_clip_to_dst_rgba_pre - { - typedef typename BlenderPre::order_type order_type; - typedef typename BlenderPre::color_type color_type; - typedef typename color_type::value_type value_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - static AGG_INLINE void blend_pix(unsigned op, value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned ca, - unsigned cover) - { - unsigned da = p[order_type::A]; - BlenderPre::blend_pix(p, - (cr * da + base_mask) >> base_shift, - (cg * da + base_mask) >> base_shift, - (cb * da + base_mask) >> base_shift, - (ca * da + base_mask) >> base_shift, - cover); - } - }; - - - - - - - //===============================================copy_or_blend_rgba_wrapper - template struct copy_or_blend_rgba_wrapper - { - typedef typename Blender::color_type color_type; - typedef typename Blender::order_type order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_scale = color_type::base_scale, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - static AGG_INLINE void copy_or_blend_pix(value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha) - { - if(alpha) - { - if(alpha == base_mask) - { - p[order_type::R] = cr; - p[order_type::G] = cg; - p[order_type::B] = cb; - p[order_type::A] = base_mask; - } - else - { - Blender::blend_pix(p, cr, cg, cb, alpha); - } - } - } - - //-------------------------------------------------------------------- - static AGG_INLINE void copy_or_blend_pix(value_type* p, - unsigned cr, unsigned cg, unsigned cb, - unsigned alpha, - unsigned cover) - { - if(cover == 255) - { - copy_or_blend_pix(p, cr, cg, cb, alpha); - } - else - { - if(alpha) - { - alpha = (alpha * (cover + 1)) >> 8; - if(alpha == base_mask) - { - p[order_type::R] = cr; - p[order_type::G] = cg; - p[order_type::B] = cb; - p[order_type::A] = base_mask; - } - else - { - Blender::blend_pix(p, cr, cg, cb, alpha, cover); - } - } - } - } - }; - - - - - - - //=================================================pixfmt_alpha_blend_rgba - template - class pixfmt_alpha_blend_rgba - { - public: - typedef RenBuf rbuf_type; - typedef typename rbuf_type::row_data row_data; - typedef PixelT pixel_type; - typedef Blender blender_type; - typedef typename blender_type::color_type color_type; - typedef typename blender_type::order_type order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - typedef copy_or_blend_rgba_wrapper cob_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_scale = color_type::base_scale, - base_mask = color_type::base_mask, - pix_width = sizeof(pixel_type) - }; - - //-------------------------------------------------------------------- - pixfmt_alpha_blend_rgba() : m_rbuf(0) {} - explicit pixfmt_alpha_blend_rgba(rbuf_type& rb) : m_rbuf(&rb) {} - void attach(rbuf_type& rb) { m_rbuf = &rb; } - - //-------------------------------------------------------------------- - template - bool attach(PixFmt& pixf, int x1, int y1, int x2, int y2) - { - rect_i r(x1, y1, x2, y2); - if(r.clip(rect_i(0, 0, pixf.width()-1, pixf.height()-1))) - { - int stride = pixf.stride(); - m_rbuf->attach(pixf.pix_ptr(r.x1, stride < 0 ? r.y2 : r.y1), - (r.x2 - r.x1) + 1, - (r.y2 - r.y1) + 1, - stride); - return true; - } - return false; - } - - //-------------------------------------------------------------------- - AGG_INLINE unsigned width() const { return m_rbuf->width(); } - AGG_INLINE unsigned height() const { return m_rbuf->height(); } - AGG_INLINE int stride() const { return m_rbuf->stride(); } - - //-------------------------------------------------------------------- - AGG_INLINE int8u* row_ptr(int y) { return m_rbuf->row_ptr(y); } - AGG_INLINE const int8u* row_ptr(int y) const { return m_rbuf->row_ptr(y); } - AGG_INLINE row_data row(int y) const { return m_rbuf->row(y); } - - //-------------------------------------------------------------------- - AGG_INLINE int8u* pix_ptr(int x, int y) - { - return m_rbuf->row_ptr(y) + x * pix_width; - } - - AGG_INLINE const int8u* pix_ptr(int x, int y) const - { - return m_rbuf->row_ptr(y) + x * pix_width; - } - - - //-------------------------------------------------------------------- - AGG_INLINE static void make_pix(int8u* p, const color_type& c) - { - ((value_type*)p)[order_type::R] = c.r; - ((value_type*)p)[order_type::G] = c.g; - ((value_type*)p)[order_type::B] = c.b; - ((value_type*)p)[order_type::A] = c.a; - } - - //-------------------------------------------------------------------- - AGG_INLINE color_type pixel(int x, int y) const - { - const value_type* p = (const value_type*)m_rbuf->row_ptr(y); - if(p) - { - p += x << 2; - return color_type(p[order_type::R], - p[order_type::G], - p[order_type::B], - p[order_type::A]); - } - return color_type::no_color(); - } - - //-------------------------------------------------------------------- - AGG_INLINE void copy_pixel(int x, int y, const color_type& c) - { - value_type* p = (value_type*)m_rbuf->row_ptr(x, y, 1) + (x << 2); - p[order_type::R] = c.r; - p[order_type::G] = c.g; - p[order_type::B] = c.b; - p[order_type::A] = c.a; - } - - //-------------------------------------------------------------------- - AGG_INLINE void blend_pixel(int x, int y, const color_type& c, int8u cover) - { - cob_type::copy_or_blend_pix( - (value_type*)m_rbuf->row_ptr(x, y, 1) + (x << 2), - c.r, c.g, c.b, c.a, - cover); - } - - - //-------------------------------------------------------------------- - AGG_INLINE void copy_hline(int x, int y, - unsigned len, - const color_type& c) - { - value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2); - pixel_type v; - ((value_type*)&v)[order_type::R] = c.r; - ((value_type*)&v)[order_type::G] = c.g; - ((value_type*)&v)[order_type::B] = c.b; - ((value_type*)&v)[order_type::A] = c.a; - do - { - *(pixel_type*)p = v; - p += 4; - } - while(--len); - } - - - //-------------------------------------------------------------------- - AGG_INLINE void copy_vline(int x, int y, - unsigned len, - const color_type& c) - { - pixel_type v; - ((value_type*)&v)[order_type::R] = c.r; - ((value_type*)&v)[order_type::G] = c.g; - ((value_type*)&v)[order_type::B] = c.b; - ((value_type*)&v)[order_type::A] = c.a; - do - { - value_type* p = (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2); - *(pixel_type*)p = v; - } - while(--len); - } - - - //-------------------------------------------------------------------- - void blend_hline(int x, int y, - unsigned len, - const color_type& c, - int8u cover) - { - if (c.a) - { - value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2); - calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8; - if(alpha == base_mask) - { - pixel_type v; - ((value_type*)&v)[order_type::R] = c.r; - ((value_type*)&v)[order_type::G] = c.g; - ((value_type*)&v)[order_type::B] = c.b; - ((value_type*)&v)[order_type::A] = c.a; - do - { - *(pixel_type*)p = v; - p += 4; - } - while(--len); - } - else - { - if(cover == 255) - { - do - { - blender_type::blend_pix(p, c.r, c.g, c.b, alpha); - p += 4; - } - while(--len); - } - else - { - do - { - blender_type::blend_pix(p, c.r, c.g, c.b, alpha, cover); - p += 4; - } - while(--len); - } - } - } - } - - - //-------------------------------------------------------------------- - void blend_vline(int x, int y, - unsigned len, - const color_type& c, - int8u cover) - { - if (c.a) - { - value_type* p; - calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8; - if(alpha == base_mask) - { - pixel_type v; - ((value_type*)&v)[order_type::R] = c.r; - ((value_type*)&v)[order_type::G] = c.g; - ((value_type*)&v)[order_type::B] = c.b; - ((value_type*)&v)[order_type::A] = c.a; - do - { - p = (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2); - *(pixel_type*)p = v; - } - while(--len); - } - else - { - if(cover == 255) - { - do - { - p = (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2); - blender_type::blend_pix(p, c.r, c.g, c.b, alpha); - } - while(--len); - } - else - { - do - { - p = (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2); - blender_type::blend_pix(p, c.r, c.g, c.b, alpha, cover); - } - while(--len); - } - } - } - } - - - //-------------------------------------------------------------------- - void blend_solid_hspan(int x, int y, - unsigned len, - const color_type& c, - const int8u* covers) - { - if (c.a) - { - value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2); - do - { - calc_type alpha = (calc_type(c.a) * (calc_type(*covers) + 1)) >> 8; - if(alpha == base_mask) - { - p[order_type::R] = c.r; - p[order_type::G] = c.g; - p[order_type::B] = c.b; - p[order_type::A] = base_mask; - } - else - { - blender_type::blend_pix(p, c.r, c.g, c.b, alpha, *covers); - } - p += 4; - ++covers; - } - while(--len); - } - } - - - //-------------------------------------------------------------------- - void blend_solid_vspan(int x, int y, - unsigned len, - const color_type& c, - const int8u* covers) - { - if (c.a) - { - do - { - value_type* p = (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2); - calc_type alpha = (calc_type(c.a) * (calc_type(*covers) + 1)) >> 8; - if(alpha == base_mask) - { - p[order_type::R] = c.r; - p[order_type::G] = c.g; - p[order_type::B] = c.b; - p[order_type::A] = base_mask; - } - else - { - blender_type::blend_pix(p, c.r, c.g, c.b, alpha, *covers); - } - ++covers; - } - while(--len); - } - } - - - //-------------------------------------------------------------------- - void copy_color_hspan(int x, int y, - unsigned len, - const color_type* colors) - { - value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2); - do - { - p[order_type::R] = colors->r; - p[order_type::G] = colors->g; - p[order_type::B] = colors->b; - p[order_type::A] = colors->a; - ++colors; - p += 4; - } - while(--len); - } - - - //-------------------------------------------------------------------- - void copy_color_vspan(int x, int y, - unsigned len, - const color_type* colors) - { - do - { - value_type* p = (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2); - p[order_type::R] = colors->r; - p[order_type::G] = colors->g; - p[order_type::B] = colors->b; - p[order_type::A] = colors->a; - ++colors; - } - while(--len); - } - - - //-------------------------------------------------------------------- - void blend_color_hspan(int x, int y, - unsigned len, - const color_type* colors, - const int8u* covers, - int8u cover) - { - value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2); - if(covers) - { - do - { - cob_type::copy_or_blend_pix(p, - colors->r, - colors->g, - colors->b, - colors->a, - *covers++); - p += 4; - ++colors; - } - while(--len); - } - else - { - if(cover == 255) - { - do - { - cob_type::copy_or_blend_pix(p, - colors->r, - colors->g, - colors->b, - colors->a); - p += 4; - ++colors; - } - while(--len); - } - else - { - do - { - cob_type::copy_or_blend_pix(p, - colors->r, - colors->g, - colors->b, - colors->a, - cover); - p += 4; - ++colors; - } - while(--len); - } - } - } - - - - //-------------------------------------------------------------------- - void blend_color_vspan(int x, int y, - unsigned len, - const color_type* colors, - const int8u* covers, - int8u cover) - { - value_type* p; - if(covers) - { - do - { - p = (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2); - cob_type::copy_or_blend_pix(p, - colors->r, - colors->g, - colors->b, - colors->a, - *covers++); - ++colors; - } - while(--len); - } - else - { - if(cover == 255) - { - do - { - p = (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2); - cob_type::copy_or_blend_pix(p, - colors->r, - colors->g, - colors->b, - colors->a); - ++colors; - } - while(--len); - } - else - { - do - { - p = (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2); - cob_type::copy_or_blend_pix(p, - colors->r, - colors->g, - colors->b, - colors->a, - cover); - ++colors; - } - while(--len); - } - } - } - - //-------------------------------------------------------------------- - template void for_each_pixel(Function f) - { - unsigned y; - for(y = 0; y < height(); ++y) - { - row_data r = m_rbuf->row(y); - if(r.ptr) - { - unsigned len = r.x2 - r.x1 + 1; - value_type* p = - (value_type*)m_rbuf->row_ptr(r.x1, y, len) + (r.x1 << 2); - do - { - f(p); - p += 4; - } - while(--len); - } - } - } - - //-------------------------------------------------------------------- - void premultiply() - { - for_each_pixel(multiplier_rgba::premultiply); - } - - //-------------------------------------------------------------------- - void demultiply() - { - for_each_pixel(multiplier_rgba::demultiply); - } - - //-------------------------------------------------------------------- - template void apply_gamma_dir(const GammaLut& g) - { - for_each_pixel(apply_gamma_dir_rgba(g)); - } - - //-------------------------------------------------------------------- - template void apply_gamma_inv(const GammaLut& g) - { - for_each_pixel(apply_gamma_inv_rgba(g)); - } - - //-------------------------------------------------------------------- - template void copy_from(const RenBuf2& from, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len) - { - const int8u* p = from.row_ptr(ysrc); - if(p) - { - memmove(m_rbuf->row_ptr(xdst, ydst, len) + xdst * pix_width, - p + xsrc * pix_width, - len * pix_width); - } - } - - //-------------------------------------------------------------------- - template - void blend_from(const SrcPixelFormatRenderer& from, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len, - int8u cover) - { - typedef typename SrcPixelFormatRenderer::order_type src_order; - const value_type* psrc = (value_type*)from.row_ptr(ysrc); - if(psrc) - { - psrc += xsrc << 2; - value_type* pdst = - (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + (xdst << 2); - int incp = 4; - if(xdst > xsrc) - { - psrc += (len-1) << 2; - pdst += (len-1) << 2; - incp = -4; - } - - if(cover == 255) - { - do - { - cob_type::copy_or_blend_pix(pdst, - psrc[src_order::R], - psrc[src_order::G], - psrc[src_order::B], - psrc[src_order::A]); - psrc += incp; - pdst += incp; - } - while(--len); - } - else - { - do - { - cob_type::copy_or_blend_pix(pdst, - psrc[src_order::R], - psrc[src_order::G], - psrc[src_order::B], - psrc[src_order::A], - cover); - psrc += incp; - pdst += incp; - } - while(--len); - } - } - } - - //-------------------------------------------------------------------- - template - void blend_from_color(const SrcPixelFormatRenderer& from, - const color_type& color, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len, - int8u cover) - { - typedef typename SrcPixelFormatRenderer::value_type src_value_type; - const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc); - if(psrc) - { - value_type* pdst = - (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + (xdst << 2); - do - { - cob_type::copy_or_blend_pix(pdst, - color.r, color.g, color.b, color.a, - (*psrc * cover + base_mask) >> base_shift); - ++psrc; - pdst += 4; - } - while(--len); - } - } - - //-------------------------------------------------------------------- - template - void blend_from_lut(const SrcPixelFormatRenderer& from, - const color_type* color_lut, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len, - int8u cover) - { - typedef typename SrcPixelFormatRenderer::value_type src_value_type; - const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc); - if(psrc) - { - value_type* pdst = - (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + (xdst << 2); - - if(cover == 255) - { - do - { - const color_type& color = color_lut[*psrc]; - cob_type::copy_or_blend_pix(pdst, - color.r, color.g, color.b, color.a); - ++psrc; - pdst += 4; - } - while(--len); - } - else - { - do - { - const color_type& color = color_lut[*psrc]; - cob_type::copy_or_blend_pix(pdst, - color.r, color.g, color.b, color.a, - cover); - ++psrc; - pdst += 4; - } - while(--len); - } - } - } - - private: - rbuf_type* m_rbuf; - }; - - - - - //================================================pixfmt_custom_blend_rgba - template class pixfmt_custom_blend_rgba - { - public: - typedef RenBuf rbuf_type; - typedef typename rbuf_type::row_data row_data; - typedef Blender blender_type; - typedef typename blender_type::color_type color_type; - typedef typename blender_type::order_type order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_scale = color_type::base_scale, - base_mask = color_type::base_mask, - pix_width = sizeof(value_type) * 4 - }; - - - //-------------------------------------------------------------------- - pixfmt_custom_blend_rgba() : m_rbuf(0), m_comp_op(3) {} - explicit pixfmt_custom_blend_rgba(rbuf_type& rb, unsigned comp_op=3) : - m_rbuf(&rb), - m_comp_op(comp_op) - {} - void attach(rbuf_type& rb) { m_rbuf = &rb; } - - //-------------------------------------------------------------------- - template - bool attach(PixFmt& pixf, int x1, int y1, int x2, int y2) - { - rect_i r(x1, y1, x2, y2); - if(r.clip(rect_i(0, 0, pixf.width()-1, pixf.height()-1))) - { - int stride = pixf.stride(); - m_rbuf->attach(pixf.pix_ptr(r.x1, stride < 0 ? r.y2 : r.y1), - (r.x2 - r.x1) + 1, - (r.y2 - r.y1) + 1, - stride); - return true; - } - return false; - } - - //-------------------------------------------------------------------- - AGG_INLINE unsigned width() const { return m_rbuf->width(); } - AGG_INLINE unsigned height() const { return m_rbuf->height(); } - AGG_INLINE int stride() const { return m_rbuf->stride(); } - - //-------------------------------------------------------------------- - AGG_INLINE int8u* row_ptr(int y) { return m_rbuf->row_ptr(y); } - AGG_INLINE const int8u* row_ptr(int y) const { return m_rbuf->row_ptr(y); } - AGG_INLINE row_data row(int y) const { return m_rbuf->row(y); } - - //-------------------------------------------------------------------- - AGG_INLINE int8u* pix_ptr(int x, int y) - { - return m_rbuf->row_ptr(y) + x * pix_width; - } - - AGG_INLINE const int8u* pix_ptr(int x, int y) const - { - return m_rbuf->row_ptr(y) + x * pix_width; - } - - //-------------------------------------------------------------------- - void comp_op(unsigned op) { m_comp_op = op; } - unsigned comp_op() const { return m_comp_op; } - - //-------------------------------------------------------------------- - AGG_INLINE static void make_pix(int8u* p, const color_type& c) - { - ((value_type*)p)[order_type::R] = c.r; - ((value_type*)p)[order_type::G] = c.g; - ((value_type*)p)[order_type::B] = c.b; - ((value_type*)p)[order_type::A] = c.a; - } - - //-------------------------------------------------------------------- - color_type pixel(int x, int y) const - { - const value_type* p = (value_type*)m_rbuf->row_ptr(y) + (x << 2); - return color_type(p[order_type::R], - p[order_type::G], - p[order_type::B], - p[order_type::A]); - } - - //-------------------------------------------------------------------- - void copy_pixel(int x, int y, const color_type& c) - { - blender_type::blend_pix( - m_comp_op, - (value_type*)m_rbuf->row_ptr(x, y, 1) + (x << 2), - c.r, c.g, c.b, c.a, 255); - } - - //-------------------------------------------------------------------- - void blend_pixel(int x, int y, const color_type& c, int8u cover) - { - blender_type::blend_pix( - m_comp_op, - (value_type*)m_rbuf->row_ptr(x, y, 1) + (x << 2), - c.r, c.g, c.b, c.a, - cover); - } - - //-------------------------------------------------------------------- - void copy_hline(int x, int y, unsigned len, const color_type& c) - { - value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2);; - do - { - blender_type::blend_pix(m_comp_op, p, c.r, c.g, c.b, c.a, 255); - p += 4; - } - while(--len); - } - - //-------------------------------------------------------------------- - void copy_vline(int x, int y, unsigned len, const color_type& c) - { - do - { - blender_type::blend_pix( - m_comp_op, - (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2), - c.r, c.g, c.b, c.a, 255); - } - while(--len); - } - - //-------------------------------------------------------------------- - void blend_hline(int x, int y, unsigned len, - const color_type& c, int8u cover) - { - - value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2); - do - { - blender_type::blend_pix(m_comp_op, p, c.r, c.g, c.b, c.a, cover); - p += 4; - } - while(--len); - } - - //-------------------------------------------------------------------- - void blend_vline(int x, int y, unsigned len, - const color_type& c, int8u cover) - { - - do - { - blender_type::blend_pix( - m_comp_op, - (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2), - c.r, c.g, c.b, c.a, - cover); - } - while(--len); - } - - //-------------------------------------------------------------------- - void blend_solid_hspan(int x, int y, unsigned len, - const color_type& c, const int8u* covers) - { - value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2); - do - { - blender_type::blend_pix(m_comp_op, - p, c.r, c.g, c.b, c.a, - *covers++); - p += 4; - } - while(--len); - } - - //-------------------------------------------------------------------- - void blend_solid_vspan(int x, int y, unsigned len, - const color_type& c, const int8u* covers) - { - do - { - blender_type::blend_pix( - m_comp_op, - (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2), - c.r, c.g, c.b, c.a, - *covers++); - } - while(--len); - } - - //-------------------------------------------------------------------- - void copy_color_hspan(int x, int y, - unsigned len, - const color_type* colors) - { - - value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2); - do - { - p[order_type::R] = colors->r; - p[order_type::G] = colors->g; - p[order_type::B] = colors->b; - p[order_type::A] = colors->a; - ++colors; - p += 4; - } - while(--len); - } - - //-------------------------------------------------------------------- - void copy_color_vspan(int x, int y, - unsigned len, - const color_type* colors) - { - do - { - value_type* p = (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2); - p[order_type::R] = colors->r; - p[order_type::G] = colors->g; - p[order_type::B] = colors->b; - p[order_type::A] = colors->a; - ++colors; - } - while(--len); - } - - //-------------------------------------------------------------------- - void blend_color_hspan(int x, int y, unsigned len, - const color_type* colors, - const int8u* covers, - int8u cover) - { - value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2); - do - { - blender_type::blend_pix(m_comp_op, - p, - colors->r, - colors->g, - colors->b, - colors->a, - covers ? *covers++ : cover); - p += 4; - ++colors; - } - while(--len); - } - - //-------------------------------------------------------------------- - void blend_color_vspan(int x, int y, unsigned len, - const color_type* colors, - const int8u* covers, - int8u cover) - { - do - { - blender_type::blend_pix( - m_comp_op, - (value_type*)m_rbuf->row_ptr(x, y++, 1) + (x << 2), - colors->r, - colors->g, - colors->b, - colors->a, - covers ? *covers++ : cover); - ++colors; - } - while(--len); - - } - - //-------------------------------------------------------------------- - template void for_each_pixel(Function f) - { - unsigned y; - for(y = 0; y < height(); ++y) - { - row_data r = m_rbuf->row(y); - if(r.ptr) - { - unsigned len = r.x2 - r.x1 + 1; - value_type* p = - (value_type*)m_rbuf->row_ptr(r.x1, y, len) + (r.x1 << 2); - do - { - f(p); - p += 4; - } - while(--len); - } - } - } - - //-------------------------------------------------------------------- - void premultiply() - { - for_each_pixel(multiplier_rgba::premultiply); - } - - //-------------------------------------------------------------------- - void demultiply() - { - for_each_pixel(multiplier_rgba::demultiply); - } - - //-------------------------------------------------------------------- - template void apply_gamma_dir(const GammaLut& g) - { - for_each_pixel(apply_gamma_dir_rgba(g)); - } - - //-------------------------------------------------------------------- - template void apply_gamma_inv(const GammaLut& g) - { - for_each_pixel(apply_gamma_inv_rgba(g)); - } - - //-------------------------------------------------------------------- - template void copy_from(const RenBuf2& from, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len) - { - const int8u* p = from.row_ptr(ysrc); - if(p) - { - memmove(m_rbuf->row_ptr(xdst, ydst, len) + xdst * pix_width, - p + xsrc * pix_width, - len * pix_width); - } - } - - //-------------------------------------------------------------------- - template - void blend_from(const SrcPixelFormatRenderer& from, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len, - int8u cover) - { - typedef typename SrcPixelFormatRenderer::order_type src_order; - const value_type* psrc = (const value_type*)from.row_ptr(ysrc); - if(psrc) - { - psrc += xsrc << 2; - value_type* pdst = - (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + (xdst << 2); - - int incp = 4; - if(xdst > xsrc) - { - psrc += (len-1) << 2; - pdst += (len-1) << 2; - incp = -4; - } - - do - { - blender_type::blend_pix(m_comp_op, - pdst, - psrc[src_order::R], - psrc[src_order::G], - psrc[src_order::B], - psrc[src_order::A], - cover); - psrc += incp; - pdst += incp; - } - while(--len); - } - } - - //-------------------------------------------------------------------- - template - void blend_from_color(const SrcPixelFormatRenderer& from, - const color_type& color, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len, - int8u cover) - { - typedef typename SrcPixelFormatRenderer::value_type src_value_type; - const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc); - if(psrc) - { - value_type* pdst = - (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + (xdst << 2); - do - { - blender_type::blend_pix(m_comp_op, - pdst, - color.r, color.g, color.b, color.a, - (*psrc * cover + base_mask) >> base_shift); - ++psrc; - pdst += 4; - } - while(--len); - } - } - - //-------------------------------------------------------------------- - template - void blend_from_lut(const SrcPixelFormatRenderer& from, - const color_type* color_lut, - int xdst, int ydst, - int xsrc, int ysrc, - unsigned len, - int8u cover) - { - typedef typename SrcPixelFormatRenderer::value_type src_value_type; - const src_value_type* psrc = (src_value_type*)from.row_ptr(ysrc); - if(psrc) - { - value_type* pdst = - (value_type*)m_rbuf->row_ptr(xdst, ydst, len) + (xdst << 2); - do - { - const color_type& color = color_lut[*psrc]; - blender_type::blend_pix(m_comp_op, - pdst, - color.r, color.g, color.b, color.a, - cover); - ++psrc; - pdst += 4; - } - while(--len); - } - } - - private: - rbuf_type* m_rbuf; - unsigned m_comp_op; - }; - - - - - //----------------------------------------------------------------------- - typedef blender_rgba blender_rgba32; //----blender_rgba32 - typedef blender_rgba blender_argb32; //----blender_argb32 - typedef blender_rgba blender_abgr32; //----blender_abgr32 - typedef blender_rgba blender_bgra32; //----blender_bgra32 - - typedef blender_rgba_pre blender_rgba32_pre; //----blender_rgba32_pre - typedef blender_rgba_pre blender_argb32_pre; //----blender_argb32_pre - typedef blender_rgba_pre blender_abgr32_pre; //----blender_abgr32_pre - typedef blender_rgba_pre blender_bgra32_pre; //----blender_bgra32_pre - - typedef blender_rgba_plain blender_rgba32_plain; //----blender_rgba32_plain - typedef blender_rgba_plain blender_argb32_plain; //----blender_argb32_plain - typedef blender_rgba_plain blender_abgr32_plain; //----blender_abgr32_plain - typedef blender_rgba_plain blender_bgra32_plain; //----blender_bgra32_plain - - typedef blender_rgba blender_rgba64; //----blender_rgba64 - typedef blender_rgba blender_argb64; //----blender_argb64 - typedef blender_rgba blender_abgr64; //----blender_abgr64 - typedef blender_rgba blender_bgra64; //----blender_bgra64 - - typedef blender_rgba_pre blender_rgba64_pre; //----blender_rgba64_pre - typedef blender_rgba_pre blender_argb64_pre; //----blender_argb64_pre - typedef blender_rgba_pre blender_abgr64_pre; //----blender_abgr64_pre - typedef blender_rgba_pre blender_bgra64_pre; //----blender_bgra64_pre - - - //----------------------------------------------------------------------- - typedef int32u pixel32_type; - typedef pixfmt_alpha_blend_rgba pixfmt_rgba32; //----pixfmt_rgba32 - typedef pixfmt_alpha_blend_rgba pixfmt_argb32; //----pixfmt_argb32 - typedef pixfmt_alpha_blend_rgba pixfmt_abgr32; //----pixfmt_abgr32 - typedef pixfmt_alpha_blend_rgba pixfmt_bgra32; //----pixfmt_bgra32 - - typedef pixfmt_alpha_blend_rgba pixfmt_rgba32_pre; //----pixfmt_rgba32_pre - typedef pixfmt_alpha_blend_rgba pixfmt_argb32_pre; //----pixfmt_argb32_pre - typedef pixfmt_alpha_blend_rgba pixfmt_abgr32_pre; //----pixfmt_abgr32_pre - typedef pixfmt_alpha_blend_rgba pixfmt_bgra32_pre; //----pixfmt_bgra32_pre - - typedef pixfmt_alpha_blend_rgba pixfmt_rgba32_plain; //----pixfmt_rgba32_plain - typedef pixfmt_alpha_blend_rgba pixfmt_argb32_plain; //----pixfmt_argb32_plain - typedef pixfmt_alpha_blend_rgba pixfmt_abgr32_plain; //----pixfmt_abgr32_plain - typedef pixfmt_alpha_blend_rgba pixfmt_bgra32_plain; //----pixfmt_bgra32_plain - - struct pixel64_type { int16u c[4]; }; - typedef pixfmt_alpha_blend_rgba pixfmt_rgba64; //----pixfmt_rgba64 - typedef pixfmt_alpha_blend_rgba pixfmt_argb64; //----pixfmt_argb64 - typedef pixfmt_alpha_blend_rgba pixfmt_abgr64; //----pixfmt_abgr64 - typedef pixfmt_alpha_blend_rgba pixfmt_bgra64; //----pixfmt_bgra64 - - typedef pixfmt_alpha_blend_rgba pixfmt_rgba64_pre; //----pixfmt_rgba64_pre - typedef pixfmt_alpha_blend_rgba pixfmt_argb64_pre; //----pixfmt_argb64_pre - typedef pixfmt_alpha_blend_rgba pixfmt_abgr64_pre; //----pixfmt_abgr64_pre - typedef pixfmt_alpha_blend_rgba pixfmt_bgra64_pre; //----pixfmt_bgra64_pre -} - -#endif - diff --git a/uppdev/aggdraw/agg_pixfmt_transposer.h b/uppdev/aggdraw/agg_pixfmt_transposer.h deleted file mode 100644 index c5038d49f..000000000 --- a/uppdev/aggdraw/agg_pixfmt_transposer.h +++ /dev/null @@ -1,166 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_PIXFMT_TRANSPOSER_INCLUDED -#define AGG_PIXFMT_TRANSPOSER_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - //=======================================================pixfmt_transposer - template class pixfmt_transposer - { - public: - typedef PixFmt pixfmt_type; - typedef typename pixfmt_type::color_type color_type; - typedef typename pixfmt_type::row_data row_data; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - - //-------------------------------------------------------------------- - pixfmt_transposer() : m_pixf(0) {} - explicit pixfmt_transposer(pixfmt_type& pixf) : m_pixf(&pixf) {} - void attach(pixfmt_type& pixf) { m_pixf = &pixf; } - - //-------------------------------------------------------------------- - AGG_INLINE unsigned width() const { return m_pixf->height(); } - AGG_INLINE unsigned height() const { return m_pixf->width(); } - - //-------------------------------------------------------------------- - AGG_INLINE color_type pixel(int x, int y) const - { - return m_pixf->pixel(y, x); - } - - //-------------------------------------------------------------------- - AGG_INLINE void copy_pixel(int x, int y, const color_type& c) - { - m_pixf->copy_pixel(y, x, c); - } - - //-------------------------------------------------------------------- - AGG_INLINE void blend_pixel(int x, int y, - const color_type& c, - int8u cover) - { - m_pixf->blend_pixel(y, x, c, cover); - } - - //-------------------------------------------------------------------- - AGG_INLINE void copy_hline(int x, int y, - unsigned len, - const color_type& c) - { - m_pixf->copy_vline(y, x, len, c); - } - - //-------------------------------------------------------------------- - AGG_INLINE void copy_vline(int x, int y, - unsigned len, - const color_type& c) - { - m_pixf->copy_hline(y, x, len, c); - } - - //-------------------------------------------------------------------- - AGG_INLINE void blend_hline(int x, int y, - unsigned len, - const color_type& c, - int8u cover) - { - m_pixf->blend_vline(y, x, len, c, cover); - } - - //-------------------------------------------------------------------- - AGG_INLINE void blend_vline(int x, int y, - unsigned len, - const color_type& c, - int8u cover) - { - m_pixf->blend_hline(y, x, len, c, cover); - } - - //-------------------------------------------------------------------- - AGG_INLINE void blend_solid_hspan(int x, int y, - unsigned len, - const color_type& c, - const int8u* covers) - { - m_pixf->blend_solid_vspan(y, x, len, c, covers); - } - - //-------------------------------------------------------------------- - AGG_INLINE void blend_solid_vspan(int x, int y, - unsigned len, - const color_type& c, - const int8u* covers) - { - m_pixf->blend_solid_hspan(y, x, len, c, covers); - } - - //-------------------------------------------------------------------- - AGG_INLINE void copy_color_hspan(int x, int y, - unsigned len, - const color_type* colors) - { - m_pixf->copy_color_vspan(y, x, len, colors); - } - - //-------------------------------------------------------------------- - AGG_INLINE void copy_color_vspan(int x, int y, - unsigned len, - const color_type* colors) - { - m_pixf->copy_color_hspan(y, x, len, colors); - } - - //-------------------------------------------------------------------- - AGG_INLINE void blend_color_hspan(int x, int y, - unsigned len, - const color_type* colors, - const int8u* covers, - int8u cover) - { - m_pixf->blend_color_vspan(y, x, len, colors, covers, cover); - } - - //-------------------------------------------------------------------- - AGG_INLINE void blend_color_vspan(int x, int y, - unsigned len, - const color_type* colors, - const int8u* covers, - int8u cover) - { - m_pixf->blend_color_hspan(y, x, len, colors, covers, cover); - } - - private: - pixfmt_type* m_pixf; - }; -} - -#endif - - diff --git a/uppdev/aggdraw/agg_rasterizer_cells_aa.h b/uppdev/aggdraw/agg_rasterizer_cells_aa.h deleted file mode 100644 index 789f2b787..000000000 --- a/uppdev/aggdraw/agg_rasterizer_cells_aa.h +++ /dev/null @@ -1,764 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// The author gratefully acknowleges the support of David Turner, -// Robert Wilhelm, and Werner Lemberg - the authors of the FreeType -// libray - in producing this work. See http://www.freetype.org for details. -// -//---------------------------------------------------------------------------- -// -// Adaptation for 32-bit screen coordinates has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- - -#ifndef AGG_RASTERIZER_CELLS_AA_INCLUDED -#define AGG_RASTERIZER_CELLS_AA_INCLUDED - -#include -#include -#include "agg_math.h" -#include "agg_array.h" - - -namespace agg -{ - - //-----------------------------------------------------rasterizer_cells_aa - // An internal class that implements the main rasterization algorithm. - // Used in the rasterizer. Should not be used direcly. - template class rasterizer_cells_aa - { - enum cell_block_scale_e - { - cell_block_shift = 12, - cell_block_size = 1 << cell_block_shift, - cell_block_mask = cell_block_size - 1, - cell_block_pool = 256, - cell_block_limit = 1024 - }; - - struct sorted_y - { - unsigned start; - unsigned num; - }; - - public: - typedef Cell cell_type; - typedef rasterizer_cells_aa self_type; - - ~rasterizer_cells_aa(); - rasterizer_cells_aa(); - - void reset(); - void style(const cell_type& style_cell); - void line(int x1, int y1, int x2, int y2); - - int min_x() const { return m_min_x; } - int min_y() const { return m_min_y; } - int max_x() const { return m_max_x; } - int max_y() const { return m_max_y; } - - void sort_cells(); - - unsigned total_cells() const - { - return m_num_cells; - } - - unsigned scanline_num_cells(unsigned y) const - { - return m_sorted_y[y - m_min_y].num; - } - - const cell_type* const* scanline_cells(unsigned y) const - { - return m_sorted_cells.data() + m_sorted_y[y - m_min_y].start; - } - - bool sorted() const { return m_sorted; } - - private: - rasterizer_cells_aa(const self_type&); - const self_type& operator = (const self_type&); - - void set_curr_cell(int x, int y); - void add_curr_cell(); - void render_hline(int ey, int x1, int y1, int x2, int y2); - void allocate_block(); - - private: - unsigned m_num_blocks; - unsigned m_max_blocks; - unsigned m_curr_block; - unsigned m_num_cells; - cell_type** m_cells; - cell_type* m_curr_cell_ptr; - pod_vector m_sorted_cells; - pod_vector m_sorted_y; - cell_type m_curr_cell; - cell_type m_style_cell; - int m_min_x; - int m_min_y; - int m_max_x; - int m_max_y; - bool m_sorted; - }; - - - - - //------------------------------------------------------------------------ - template - rasterizer_cells_aa::~rasterizer_cells_aa() - { - if(m_num_blocks) - { - cell_type** ptr = m_cells + m_num_blocks - 1; - while(m_num_blocks--) - { - pod_allocator::deallocate(*ptr, cell_block_size); - ptr--; - } - pod_allocator::deallocate(m_cells, m_max_blocks); - } - } - - //------------------------------------------------------------------------ - template - rasterizer_cells_aa::rasterizer_cells_aa() : - m_num_blocks(0), - m_max_blocks(0), - m_curr_block(0), - m_num_cells(0), - m_cells(0), - m_curr_cell_ptr(0), - m_sorted_cells(), - m_sorted_y(), - m_min_x(0x7FFFFFFF), - m_min_y(0x7FFFFFFF), - m_max_x(-0x7FFFFFFF), - m_max_y(-0x7FFFFFFF), - m_sorted(false) - { - m_style_cell.initial(); - m_curr_cell.initial(); - } - - //------------------------------------------------------------------------ - template - void rasterizer_cells_aa::reset() - { - m_num_cells = 0; - m_curr_block = 0; - m_curr_cell.initial(); - m_style_cell.initial(); - m_sorted = false; - m_min_x = 0x7FFFFFFF; - m_min_y = 0x7FFFFFFF; - m_max_x = -0x7FFFFFFF; - m_max_y = -0x7FFFFFFF; - } - - //------------------------------------------------------------------------ - template - AGG_INLINE void rasterizer_cells_aa::add_curr_cell() - { - if(m_curr_cell.area | m_curr_cell.cover) - { - if((m_num_cells & cell_block_mask) == 0) - { - if(m_num_blocks >= cell_block_limit) return; - allocate_block(); - } - *m_curr_cell_ptr++ = m_curr_cell; - ++m_num_cells; - } - } - - //------------------------------------------------------------------------ - template - AGG_INLINE void rasterizer_cells_aa::set_curr_cell(int x, int y) - { - if(m_curr_cell.not_equal(x, y, m_style_cell)) - { - add_curr_cell(); - m_curr_cell.style(m_style_cell); - m_curr_cell.x = x; - m_curr_cell.y = y; - m_curr_cell.cover = 0; - m_curr_cell.area = 0; - } - } - - //------------------------------------------------------------------------ - template - AGG_INLINE void rasterizer_cells_aa::render_hline(int ey, - int x1, int y1, - int x2, int y2) - { - int ex1 = x1 >> poly_subpixel_shift; - int ex2 = x2 >> poly_subpixel_shift; - int fx1 = x1 & poly_subpixel_mask; - int fx2 = x2 & poly_subpixel_mask; - - int delta, p, first, dx; - int incr, lift, mod, rem; - - //trivial case. Happens often - if(y1 == y2) - { - set_curr_cell(ex2, ey); - return; - } - - //everything is located in a single cell. That is easy! - if(ex1 == ex2) - { - delta = y2 - y1; - m_curr_cell.cover += delta; - m_curr_cell.area += (fx1 + fx2) * delta; - return; - } - - //ok, we'll have to render a run of adjacent cells on the same - //hline... - p = (poly_subpixel_scale - fx1) * (y2 - y1); - first = poly_subpixel_scale; - incr = 1; - - dx = x2 - x1; - - if(dx < 0) - { - p = fx1 * (y2 - y1); - first = 0; - incr = -1; - dx = -dx; - } - - delta = p / dx; - mod = p % dx; - - if(mod < 0) - { - delta--; - mod += dx; - } - - m_curr_cell.cover += delta; - m_curr_cell.area += (fx1 + first) * delta; - - ex1 += incr; - set_curr_cell(ex1, ey); - y1 += delta; - - if(ex1 != ex2) - { - p = poly_subpixel_scale * (y2 - y1 + delta); - lift = p / dx; - rem = p % dx; - - if (rem < 0) - { - lift--; - rem += dx; - } - - mod -= dx; - - while (ex1 != ex2) - { - delta = lift; - mod += rem; - if(mod >= 0) - { - mod -= dx; - delta++; - } - - m_curr_cell.cover += delta; - m_curr_cell.area += poly_subpixel_scale * delta; - y1 += delta; - ex1 += incr; - set_curr_cell(ex1, ey); - } - } - delta = y2 - y1; - m_curr_cell.cover += delta; - m_curr_cell.area += (fx2 + poly_subpixel_scale - first) * delta; - } - - //------------------------------------------------------------------------ - template - AGG_INLINE void rasterizer_cells_aa::style(const cell_type& style_cell) - { - m_style_cell.style(style_cell); - } - - //------------------------------------------------------------------------ - template - void rasterizer_cells_aa::line(int x1, int y1, int x2, int y2) - { - enum dx_limit_e { dx_limit = 16384 << poly_subpixel_shift }; - - int dx = x2 - x1; - - if(dx >= dx_limit || dx <= -dx_limit) - { - int cx = (x1 + x2) >> 1; - int cy = (y1 + y2) >> 1; - line(x1, y1, cx, cy); - line(cx, cy, x2, y2); - } - - int dy = y2 - y1; - int ex1 = x1 >> poly_subpixel_shift; - int ex2 = x2 >> poly_subpixel_shift; - int ey1 = y1 >> poly_subpixel_shift; - int ey2 = y2 >> poly_subpixel_shift; - int fy1 = y1 & poly_subpixel_mask; - int fy2 = y2 & poly_subpixel_mask; - - int x_from, x_to; - int p, rem, mod, lift, delta, first, incr; - - if(ex1 < m_min_x) m_min_x = ex1; - if(ex1 > m_max_x) m_max_x = ex1; - if(ey1 < m_min_y) m_min_y = ey1; - if(ey1 > m_max_y) m_max_y = ey1; - if(ex2 < m_min_x) m_min_x = ex2; - if(ex2 > m_max_x) m_max_x = ex2; - if(ey2 < m_min_y) m_min_y = ey2; - if(ey2 > m_max_y) m_max_y = ey2; - - set_curr_cell(ex1, ey1); - - //everything is on a single hline - if(ey1 == ey2) - { - render_hline(ey1, x1, fy1, x2, fy2); - return; - } - - //Vertical line - we have to calculate start and end cells, - //and then - the common values of the area and coverage for - //all cells of the line. We know exactly there's only one - //cell, so, we don't have to call render_hline(). - incr = 1; - if(dx == 0) - { - int ex = x1 >> poly_subpixel_shift; - int two_fx = (x1 - (ex << poly_subpixel_shift)) << 1; - int area; - - first = poly_subpixel_scale; - if(dy < 0) - { - first = 0; - incr = -1; - } - - x_from = x1; - - //render_hline(ey1, x_from, fy1, x_from, first); - delta = first - fy1; - m_curr_cell.cover += delta; - m_curr_cell.area += two_fx * delta; - - ey1 += incr; - set_curr_cell(ex, ey1); - - delta = first + first - poly_subpixel_scale; - area = two_fx * delta; - while(ey1 != ey2) - { - //render_hline(ey1, x_from, poly_subpixel_scale - first, x_from, first); - m_curr_cell.cover = delta; - m_curr_cell.area = area; - ey1 += incr; - set_curr_cell(ex, ey1); - } - //render_hline(ey1, x_from, poly_subpixel_scale - first, x_from, fy2); - delta = fy2 - poly_subpixel_scale + first; - m_curr_cell.cover += delta; - m_curr_cell.area += two_fx * delta; - return; - } - - //ok, we have to render several hlines - p = (poly_subpixel_scale - fy1) * dx; - first = poly_subpixel_scale; - - if(dy < 0) - { - p = fy1 * dx; - first = 0; - incr = -1; - dy = -dy; - } - - delta = p / dy; - mod = p % dy; - - if(mod < 0) - { - delta--; - mod += dy; - } - - x_from = x1 + delta; - render_hline(ey1, x1, fy1, x_from, first); - - ey1 += incr; - set_curr_cell(x_from >> poly_subpixel_shift, ey1); - - if(ey1 != ey2) - { - p = poly_subpixel_scale * dx; - lift = p / dy; - rem = p % dy; - - if(rem < 0) - { - lift--; - rem += dy; - } - mod -= dy; - - while(ey1 != ey2) - { - delta = lift; - mod += rem; - if (mod >= 0) - { - mod -= dy; - delta++; - } - - x_to = x_from + delta; - render_hline(ey1, x_from, poly_subpixel_scale - first, x_to, first); - x_from = x_to; - - ey1 += incr; - set_curr_cell(x_from >> poly_subpixel_shift, ey1); - } - } - render_hline(ey1, x_from, poly_subpixel_scale - first, x2, fy2); - } - - //------------------------------------------------------------------------ - template - void rasterizer_cells_aa::allocate_block() - { - if(m_curr_block >= m_num_blocks) - { - if(m_num_blocks >= m_max_blocks) - { - cell_type** new_cells = - pod_allocator::allocate(m_max_blocks + - cell_block_pool); - - if(m_cells) - { - memcpy(new_cells, m_cells, m_max_blocks * sizeof(cell_type*)); - pod_allocator::deallocate(m_cells, m_max_blocks); - } - m_cells = new_cells; - m_max_blocks += cell_block_pool; - } - - m_cells[m_num_blocks++] = - pod_allocator::allocate(cell_block_size); - - } - m_curr_cell_ptr = m_cells[m_curr_block++]; - } - - - - //------------------------------------------------------------------------ - template static AGG_INLINE void swap_cells(T* a, T* b) - { - T temp = *a; - *a = *b; - *b = temp; - } - - - //------------------------------------------------------------------------ - enum - { - qsort_threshold = 9 - }; - - - //------------------------------------------------------------------------ - template - void qsort_cells(Cell** start, unsigned num) - { - Cell** stack[80]; - Cell*** top; - Cell** limit; - Cell** base; - - limit = start + num; - base = start; - top = stack; - - for (;;) - { - int len = int(limit - base); - - Cell** i; - Cell** j; - Cell** pivot; - - if(len > qsort_threshold) - { - // we use base + len/2 as the pivot - pivot = base + len / 2; - swap_cells(base, pivot); - - i = base + 1; - j = limit - 1; - - // now ensure that *i <= *base <= *j - if((*j)->x < (*i)->x) - { - swap_cells(i, j); - } - - if((*base)->x < (*i)->x) - { - swap_cells(base, i); - } - - if((*j)->x < (*base)->x) - { - swap_cells(base, j); - } - - for(;;) - { - int x = (*base)->x; - do i++; while( (*i)->x < x ); - do j--; while( x < (*j)->x ); - - if(i > j) - { - break; - } - - swap_cells(i, j); - } - - swap_cells(base, j); - - // now, push the largest sub-array - if(j - base > limit - i) - { - top[0] = base; - top[1] = j; - base = i; - } - else - { - top[0] = i; - top[1] = limit; - limit = j; - } - top += 2; - } - else - { - // the sub-array is small, perform insertion sort - j = base; - i = j + 1; - - for(; i < limit; j = i, i++) - { - for(; j[1]->x < (*j)->x; j--) - { - swap_cells(j + 1, j); - if (j == base) - { - break; - } - } - } - - if(top > stack) - { - top -= 2; - base = top[0]; - limit = top[1]; - } - else - { - break; - } - } - } - } - - - //------------------------------------------------------------------------ - template - void rasterizer_cells_aa::sort_cells() - { - if(m_sorted) return; //Perform sort only the first time. - - add_curr_cell(); - m_curr_cell.x = 0x7FFFFFFF; - m_curr_cell.y = 0x7FFFFFFF; - m_curr_cell.cover = 0; - m_curr_cell.area = 0; - - if(m_num_cells == 0) return; - -// DBG: Check to see if min/max works well. -//for(unsigned nc = 0; nc < m_num_cells; nc++) -//{ -// cell_type* cell = m_cells[nc >> cell_block_shift] + (nc & cell_block_mask); -// if(cell->x < m_min_x || -// cell->y < m_min_y || -// cell->x > m_max_x || -// cell->y > m_max_y) -// { -// cell = cell; // Breakpoint here -// } -//} - // Allocate the array of cell pointers - m_sorted_cells.allocate(m_num_cells, 16); - - // Allocate and zero the Y array - m_sorted_y.allocate(m_max_y - m_min_y + 1, 16); - m_sorted_y.zero(); - - // Create the Y-histogram (count the numbers of cells for each Y) - cell_type** block_ptr = m_cells; - cell_type* cell_ptr; - unsigned nb = m_num_cells >> cell_block_shift; - unsigned i; - while(nb--) - { - cell_ptr = *block_ptr++; - i = cell_block_size; - while(i--) - { - m_sorted_y[cell_ptr->y - m_min_y].start++; - ++cell_ptr; - } - } - - cell_ptr = *block_ptr++; - i = m_num_cells & cell_block_mask; - while(i--) - { - m_sorted_y[cell_ptr->y - m_min_y].start++; - ++cell_ptr; - } - - // Convert the Y-histogram into the array of starting indexes - unsigned start = 0; - for(i = 0; i < m_sorted_y.size(); i++) - { - unsigned v = m_sorted_y[i].start; - m_sorted_y[i].start = start; - start += v; - } - - // Fill the cell pointer array sorted by Y - block_ptr = m_cells; - nb = m_num_cells >> cell_block_shift; - while(nb--) - { - cell_ptr = *block_ptr++; - i = cell_block_size; - while(i--) - { - sorted_y& curr_y = m_sorted_y[cell_ptr->y - m_min_y]; - m_sorted_cells[curr_y.start + curr_y.num] = cell_ptr; - ++curr_y.num; - ++cell_ptr; - } - } - - cell_ptr = *block_ptr++; - i = m_num_cells & cell_block_mask; - while(i--) - { - sorted_y& curr_y = m_sorted_y[cell_ptr->y - m_min_y]; - m_sorted_cells[curr_y.start + curr_y.num] = cell_ptr; - ++curr_y.num; - ++cell_ptr; - } - - // Finally arrange the X-arrays - for(i = 0; i < m_sorted_y.size(); i++) - { - const sorted_y& curr_y = m_sorted_y[i]; - if(curr_y.num) - { - qsort_cells(m_sorted_cells.data() + curr_y.start, curr_y.num); - } - } - m_sorted = true; - } - - - - //------------------------------------------------------scanline_hit_test - class scanline_hit_test - { - public: - scanline_hit_test(int x) : m_x(x), m_hit(false) {} - - void reset_spans() {} - void finalize(int) {} - void add_cell(int x, int) - { - if(m_x == x) m_hit = true; - } - void add_span(int x, int len, int) - { - if(m_x >= x && m_x < x+len) m_hit = true; - } - unsigned num_spans() const { return 1; } - bool hit() const { return m_hit; } - - private: - int m_x; - bool m_hit; - }; - - -} - -#endif diff --git a/uppdev/aggdraw/agg_rasterizer_compound_aa.h b/uppdev/aggdraw/agg_rasterizer_compound_aa.h deleted file mode 100644 index c37b031c5..000000000 --- a/uppdev/aggdraw/agg_rasterizer_compound_aa.h +++ /dev/null @@ -1,698 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry - Version 2.3 -// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -//---------------------------------------------------------------------------- -// -// The author gratefully acknowleges the support of David Turner, -// Robert Wilhelm, and Werner Lemberg - the authors of the FreeType -// libray - in producing this work. See http://www.freetype.org for details. -// -//---------------------------------------------------------------------------- -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://www.antigrain.com -//---------------------------------------------------------------------------- -// -// Adaptation for 32-bit screen coordinates has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- -#ifndef AGG_RASTERIZER_COMPOUND_AA_INCLUDED -#define AGG_RASTERIZER_COMPOUND_AA_INCLUDED - -#include "agg_rasterizer_cells_aa.h" -#include "agg_rasterizer_sl_clip.h" - -namespace agg -{ - - //-----------------------------------------------------------cell_style_aa - // A pixel cell. There're no constructors defined and it was done - // intentionally in order to avoid extra overhead when allocating an - // array of cells. - struct cell_style_aa - { - int x; - int y; - int cover; - int area; - int16 left, right; - - void initial() - { - x = 0x7FFFFFFF; - y = 0x7FFFFFFF; - cover = 0; - area = 0; - left = -1; - right = -1; - } - - void style(const cell_style_aa& c) - { - left = c.left; - right = c.right; - } - - int not_equal(int ex, int ey, const cell_style_aa& c) const - { - return (ex - x) | (ey - y) | (left - c.left) | (right - c.right); - } - }; - - - //===========================================================layer_order_e - enum layer_order_e - { - layer_unsorted, //------layer_unsorted - layer_direct, //------layer_direct - layer_inverse //------layer_inverse - }; - - - //==================================================rasterizer_compound_aa - template class rasterizer_compound_aa - { - struct style_info - { - unsigned start_cell; - unsigned num_cells; - int last_x; - }; - - struct cell_info - { - int x, area, cover; - }; - - public: - typedef Clip clip_type; - typedef typename Clip::conv_type conv_type; - typedef typename Clip::coord_type coord_type; - - enum aa_scale_e - { - aa_shift = 8, - aa_scale = 1 << aa_shift, - aa_mask = aa_scale - 1, - aa_scale2 = aa_scale * 2, - aa_mask2 = aa_scale2 - 1 - }; - - //-------------------------------------------------------------------- - rasterizer_compound_aa() : - m_outline(), - m_clipper(), - m_filling_rule(fill_non_zero), - m_layer_order(layer_direct), - m_styles(), // Active Styles - m_ast(), // Active Style Table (unique values) - m_asm(), // Active Style Mask - m_cells(), - m_cover_buf(), - m_master_alpha(), - m_min_style(0x7FFFFFFF), - m_max_style(-0x7FFFFFFF), - m_start_x(0), - m_start_y(0), - m_scan_y(0x7FFFFFFF), - m_sl_start(0), - m_sl_len(0) - {} - - //-------------------------------------------------------------------- - void reset(); - void reset_clipping(); - void clip_box(double x1, double y1, double x2, double y2); - void filling_rule(filling_rule_e filling_rule); - void layer_order(layer_order_e order); - void master_alpha(int style, double alpha); - - //-------------------------------------------------------------------- - void styles(int left, int right); - void move_to(int x, int y); - void line_to(int x, int y); - void move_to_d(double x, double y); - void line_to_d(double x, double y); - void add_vertex(double x, double y, unsigned cmd); - - void edge(int x1, int y1, int x2, int y2); - void edge_d(double x1, double y1, double x2, double y2); - - //------------------------------------------------------------------- - template - void add_path(VertexSource& vs, unsigned path_id=0) - { - double x; - double y; - - unsigned cmd; - vs.rewind(path_id); - if(m_outline.sorted()) reset(); - while(!is_stop(cmd = vs.vertex(&x, &y))) - { - add_vertex(x, y, cmd); - } - } - - - //-------------------------------------------------------------------- - int min_x() const { return m_outline.min_x(); } - int min_y() const { return m_outline.min_y(); } - int max_x() const { return m_outline.max_x(); } - int max_y() const { return m_outline.max_y(); } - int min_style() const { return m_min_style; } - int max_style() const { return m_max_style; } - - //-------------------------------------------------------------------- - void sort(); - bool rewind_scanlines(); - unsigned sweep_styles(); - int scanline_start() const { return m_sl_start; } - unsigned scanline_length() const { return m_sl_len; } - unsigned style(unsigned style_idx) const; - - cover_type* allocate_cover_buffer(unsigned len); - - //-------------------------------------------------------------------- - bool navigate_scanline(int y); - bool hit_test(int tx, int ty); - - //-------------------------------------------------------------------- - AGG_INLINE unsigned calculate_alpha(int area, unsigned master_alpha) const - { - int cover = area >> (poly_subpixel_shift*2 + 1 - aa_shift); - if(cover < 0) cover = -cover; - if(m_filling_rule == fill_even_odd) - { - cover &= aa_mask2; - if(cover > aa_scale) - { - cover = aa_scale2 - cover; - } - } - if(cover > aa_mask) cover = aa_mask; - return (cover * master_alpha + aa_mask) >> aa_shift; - } - - //-------------------------------------------------------------------- - // Sweeps one scanline with one style index. The style ID can be - // determined by calling style(). - template bool sweep_scanline(Scanline& sl, int style_idx) - { - int scan_y = m_scan_y - 1; - if(scan_y > m_outline.max_y()) return false; - - sl.reset_spans(); - - unsigned master_alpha = aa_mask; - - if(style_idx < 0) - { - style_idx = 0; - } - else - { - style_idx++; - master_alpha = m_master_alpha[m_ast[style_idx] + m_min_style - 1]; - } - - const style_info& st = m_styles[m_ast[style_idx]]; - - unsigned num_cells = st.num_cells; - cell_info* cell = &m_cells[st.start_cell]; - - int cover = 0; - while(num_cells--) - { - unsigned alpha; - int x = cell->x; - int area = cell->area; - - cover += cell->cover; - - ++cell; - - if(area) - { - alpha = calculate_alpha((cover << (poly_subpixel_shift + 1)) - area, - master_alpha); - sl.add_cell(x, alpha); - x++; - } - - if(num_cells && cell->x > x) - { - alpha = calculate_alpha(cover << (poly_subpixel_shift + 1), - master_alpha); - if(alpha) - { - sl.add_span(x, cell->x - x, alpha); - } - } - } - - if(sl.num_spans() == 0) return false; - sl.finalize(scan_y); - return true; - } - - private: - void add_style(int style_id); - void allocate_master_alpha(); - - //-------------------------------------------------------------------- - // Disable copying - rasterizer_compound_aa(const rasterizer_compound_aa&); - const rasterizer_compound_aa& - operator = (const rasterizer_compound_aa&); - - private: - rasterizer_cells_aa m_outline; - clip_type m_clipper; - filling_rule_e m_filling_rule; - layer_order_e m_layer_order; - pod_vector m_styles; // Active Styles - pod_vector m_ast; // Active Style Table (unique values) - pod_vector m_asm; // Active Style Mask - pod_vector m_cells; - pod_vector m_cover_buf; - pod_bvector m_master_alpha; - - int m_min_style; - int m_max_style; - coord_type m_start_x; - coord_type m_start_y; - int m_scan_y; - int m_sl_start; - unsigned m_sl_len; - }; - - - - - - - - - - - //------------------------------------------------------------------------ - template - void rasterizer_compound_aa::reset() - { - m_outline.reset(); - m_min_style = 0x7FFFFFFF; - m_max_style = -0x7FFFFFFF; - m_scan_y = 0x7FFFFFFF; - m_sl_start = 0; - m_sl_len = 0; - } - - //------------------------------------------------------------------------ - template - void rasterizer_compound_aa::filling_rule(filling_rule_e filling_rule) - { - m_filling_rule = filling_rule; - } - - //------------------------------------------------------------------------ - template - void rasterizer_compound_aa::layer_order(layer_order_e order) - { - m_layer_order = order; - } - - //------------------------------------------------------------------------ - template - void rasterizer_compound_aa::clip_box(double x1, double y1, - double x2, double y2) - { - reset(); - m_clipper.clip_box(conv_type::upscale(x1), conv_type::upscale(y1), - conv_type::upscale(x2), conv_type::upscale(y2)); - } - - //------------------------------------------------------------------------ - template - void rasterizer_compound_aa::reset_clipping() - { - reset(); - m_clipper.reset_clipping(); - } - - //------------------------------------------------------------------------ - template - void rasterizer_compound_aa::styles(int left, int right) - { - cell_style_aa cell; - cell.initial(); - cell.left = (int16)left; - cell.right = (int16)right; - m_outline.style(cell); - if(left >= 0 && left < m_min_style) m_min_style = left; - if(left >= 0 && left > m_max_style) m_max_style = left; - if(right >= 0 && right < m_min_style) m_min_style = right; - if(right >= 0 && right > m_max_style) m_max_style = right; - } - - //------------------------------------------------------------------------ - template - void rasterizer_compound_aa::move_to(int x, int y) - { - if(m_outline.sorted()) reset(); - m_clipper.move_to(m_start_x = conv_type::downscale(x), - m_start_y = conv_type::downscale(y)); - } - - //------------------------------------------------------------------------ - template - void rasterizer_compound_aa::line_to(int x, int y) - { - m_clipper.line_to(m_outline, - conv_type::downscale(x), - conv_type::downscale(y)); - } - - //------------------------------------------------------------------------ - template - void rasterizer_compound_aa::move_to_d(double x, double y) - { - if(m_outline.sorted()) reset(); - m_clipper.move_to(m_start_x = conv_type::upscale(x), - m_start_y = conv_type::upscale(y)); - } - - //------------------------------------------------------------------------ - template - void rasterizer_compound_aa::line_to_d(double x, double y) - { - m_clipper.line_to(m_outline, - conv_type::upscale(x), - conv_type::upscale(y)); - } - - //------------------------------------------------------------------------ - template - void rasterizer_compound_aa::add_vertex(double x, double y, unsigned cmd) - { - if(is_move_to(cmd)) - { - move_to_d(x, y); - } - else - if(is_vertex(cmd)) - { - line_to_d(x, y); - } - else - if(is_close(cmd)) - { - m_clipper.line_to(m_outline, m_start_x, m_start_y); - } - } - - //------------------------------------------------------------------------ - template - void rasterizer_compound_aa::edge(int x1, int y1, int x2, int y2) - { - if(m_outline.sorted()) reset(); - m_clipper.move_to(conv_type::downscale(x1), conv_type::downscale(y1)); - m_clipper.line_to(m_outline, - conv_type::downscale(x2), - conv_type::downscale(y2)); - } - - //------------------------------------------------------------------------ - template - void rasterizer_compound_aa::edge_d(double x1, double y1, - double x2, double y2) - { - if(m_outline.sorted()) reset(); - m_clipper.move_to(conv_type::upscale(x1), conv_type::upscale(y1)); - m_clipper.line_to(m_outline, - conv_type::upscale(x2), - conv_type::upscale(y2)); - } - - //------------------------------------------------------------------------ - template - AGG_INLINE void rasterizer_compound_aa::sort() - { - m_outline.sort_cells(); - } - - //------------------------------------------------------------------------ - template - AGG_INLINE bool rasterizer_compound_aa::rewind_scanlines() - { - m_outline.sort_cells(); - if(m_outline.total_cells() == 0) - { - return false; - } - if(m_max_style < m_min_style) - { - return false; - } - m_scan_y = m_outline.min_y(); - m_styles.allocate(m_max_style - m_min_style + 2, 128); - allocate_master_alpha(); - return true; - } - - //------------------------------------------------------------------------ - template - AGG_INLINE void rasterizer_compound_aa::add_style(int style_id) - { - if(style_id < 0) style_id = 0; - else style_id -= m_min_style - 1; - - unsigned nbyte = style_id >> 3; - unsigned mask = 1 << (style_id & 7); - - style_info* style = &m_styles[style_id]; - if((m_asm[nbyte] & mask) == 0) - { - m_ast.add(style_id); - m_asm[nbyte] |= mask; - style->start_cell = 0; - style->num_cells = 0; - style->last_x = -0x7FFFFFFF; - } - ++style->start_cell; - } - - //------------------------------------------------------------------------ - // Returns the number of styles - template - unsigned rasterizer_compound_aa::sweep_styles() - { - for(;;) - { - if(m_scan_y > m_outline.max_y()) return 0; - unsigned num_cells = m_outline.scanline_num_cells(m_scan_y); - const cell_style_aa* const* cells = m_outline.scanline_cells(m_scan_y); - unsigned num_styles = m_max_style - m_min_style + 2; - const cell_style_aa* curr_cell; - unsigned style_id; - style_info* style; - cell_info* cell; - - m_cells.allocate(num_cells * 2, 256); // Each cell can have two styles - m_ast.capacity(num_styles, 64); - m_asm.allocate((num_styles + 7) >> 3, 8); - m_asm.zero(); - - if(num_cells) - { - // Pre-add zero (for no-fill style, that is, -1). - // We need that to ensure that the "-1 style" would go first. - m_asm[0] |= 1; - m_ast.add(0); - style = &m_styles[0]; - style->start_cell = 0; - style->num_cells = 0; - style->last_x = -0x7FFFFFFF; - - m_sl_start = cells[0]->x; - m_sl_len = cells[num_cells-1]->x - m_sl_start + 1; - while(num_cells--) - { - curr_cell = *cells++; - add_style(curr_cell->left); - add_style(curr_cell->right); - } - - // Convert the Y-histogram into the array of starting indexes - unsigned i; - unsigned start_cell = 0; - for(i = 0; i < m_ast.size(); i++) - { - style_info& st = m_styles[m_ast[i]]; - unsigned v = st.start_cell; - st.start_cell = start_cell; - start_cell += v; - } - - cells = m_outline.scanline_cells(m_scan_y); - num_cells = m_outline.scanline_num_cells(m_scan_y); - - while(num_cells--) - { - curr_cell = *cells++; - style_id = (curr_cell->left < 0) ? 0 : - curr_cell->left - m_min_style + 1; - - style = &m_styles[style_id]; - if(curr_cell->x == style->last_x) - { - cell = &m_cells[style->start_cell + style->num_cells - 1]; - cell->area += curr_cell->area; - cell->cover += curr_cell->cover; - } - else - { - cell = &m_cells[style->start_cell + style->num_cells]; - cell->x = curr_cell->x; - cell->area = curr_cell->area; - cell->cover = curr_cell->cover; - style->last_x = curr_cell->x; - style->num_cells++; - } - - style_id = (curr_cell->right < 0) ? 0 : - curr_cell->right - m_min_style + 1; - - style = &m_styles[style_id]; - if(curr_cell->x == style->last_x) - { - cell = &m_cells[style->start_cell + style->num_cells - 1]; - cell->area -= curr_cell->area; - cell->cover -= curr_cell->cover; - } - else - { - cell = &m_cells[style->start_cell + style->num_cells]; - cell->x = curr_cell->x; - cell->area = -curr_cell->area; - cell->cover = -curr_cell->cover; - style->last_x = curr_cell->x; - style->num_cells++; - } - } - } - if(m_ast.size() > 1) break; - ++m_scan_y; - } - ++m_scan_y; - - if(m_layer_order != layer_unsorted) - { - range_adaptor > ra(m_ast, 1, m_ast.size() - 1); - if(m_layer_order == layer_direct) quick_sort(ra, unsigned_greater); - else quick_sort(ra, unsigned_less); - } - - return m_ast.size() - 1; - } - - //------------------------------------------------------------------------ - // Returns style ID depending of the existing style index - template - AGG_INLINE - unsigned rasterizer_compound_aa::style(unsigned style_idx) const - { - return m_ast[style_idx + 1] + m_min_style - 1; - } - - //------------------------------------------------------------------------ - template - AGG_INLINE bool rasterizer_compound_aa::navigate_scanline(int y) - { - m_outline.sort_cells(); - if(m_outline.total_cells() == 0) - { - return false; - } - if(m_max_style < m_min_style) - { - return false; - } - if(y < m_outline.min_y() || y > m_outline.max_y()) - { - return false; - } - m_scan_y = y; - m_styles.allocate(m_max_style - m_min_style + 2, 128); - allocate_master_alpha(); - return true; - } - - //------------------------------------------------------------------------ - template - bool rasterizer_compound_aa::hit_test(int tx, int ty) - { - if(!navigate_scanline(ty)) - { - return false; - } - - unsigned num_styles = sweep_styles(); - if(num_styles <= 0) - { - return false; - } - - scanline_hit_test sl(tx); - sweep_scanline(sl, -1); - return sl.hit(); - } - - //------------------------------------------------------------------------ - template - cover_type* rasterizer_compound_aa::allocate_cover_buffer(unsigned len) - { - m_cover_buf.allocate(len, 256); - return &m_cover_buf[0]; - } - - //------------------------------------------------------------------------ - template - void rasterizer_compound_aa::allocate_master_alpha() - { - while((int)m_master_alpha.size() <= m_max_style) - { - m_master_alpha.add(aa_mask); - } - } - - //------------------------------------------------------------------------ - template - void rasterizer_compound_aa::master_alpha(int style, double alpha) - { - if(style >= 0) - { - while((int)m_master_alpha.size() <= style) - { - m_master_alpha.add(aa_mask); - } - m_master_alpha[style] = uround(alpha * aa_mask); - } - } - -} - - - -#endif - diff --git a/uppdev/aggdraw/agg_rasterizer_outline.h b/uppdev/aggdraw/agg_rasterizer_outline.h deleted file mode 100644 index 57cb3e0a7..000000000 --- a/uppdev/aggdraw/agg_rasterizer_outline.h +++ /dev/null @@ -1,157 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_RASTERIZER_OUTLINE_INCLUDED -#define AGG_RASTERIZER_OUTLINE_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - //======================================================rasterizer_outline - template class rasterizer_outline - { - public: - explicit rasterizer_outline(Renderer& ren) : - m_ren(&ren), - m_start_x(0), - m_start_y(0), - m_vertices(0) - {} - void attach(Renderer& ren) { m_ren = &ren; } - - - //-------------------------------------------------------------------- - void move_to(int x, int y) - { - m_vertices = 1; - m_ren->move_to(m_start_x = x, m_start_y = y); - } - - //-------------------------------------------------------------------- - void line_to(int x, int y) - { - ++m_vertices; - m_ren->line_to(x, y); - } - - //-------------------------------------------------------------------- - void move_to_d(double x, double y) - { - move_to(m_ren->coord(x), m_ren->coord(y)); - } - - //-------------------------------------------------------------------- - void line_to_d(double x, double y) - { - line_to(m_ren->coord(x), m_ren->coord(y)); - } - - //-------------------------------------------------------------------- - void close() - { - if(m_vertices > 2) - { - line_to(m_start_x, m_start_y); - } - m_vertices = 0; - } - - //-------------------------------------------------------------------- - void add_vertex(double x, double y, unsigned cmd) - { - if(is_move_to(cmd)) - { - move_to_d(x, y); - } - else - { - if(is_end_poly(cmd)) - { - if(is_closed(cmd)) close(); - } - else - { - line_to_d(x, y); - } - } - } - - - //-------------------------------------------------------------------- - template - void add_path(VertexSource& vs, unsigned path_id=0) - { - double x; - double y; - - unsigned cmd; - vs.rewind(path_id); - while(!is_stop(cmd = vs.vertex(&x, &y))) - { - add_vertex(x, y, cmd); - } - } - - - //-------------------------------------------------------------------- - template - void render_all_paths(VertexSource& vs, - const ColorStorage& colors, - const PathId& path_id, - unsigned num_paths) - { - for(unsigned i = 0; i < num_paths; i++) - { - m_ren->line_color(colors[i]); - add_path(vs, path_id[i]); - } - } - - - //-------------------------------------------------------------------- - template void render_ctrl(Ctrl& c) - { - unsigned i; - for(i = 0; i < c.num_paths(); i++) - { - m_ren->line_color(c.color(i)); - add_path(c, i); - } - } - - - private: - Renderer* m_ren; - int m_start_x; - int m_start_y; - unsigned m_vertices; - }; - - -} - - -#endif - diff --git a/uppdev/aggdraw/agg_rasterizer_outline_aa.h b/uppdev/aggdraw/agg_rasterizer_outline_aa.h deleted file mode 100644 index 6347cdfe8..000000000 --- a/uppdev/aggdraw/agg_rasterizer_outline_aa.h +++ /dev/null @@ -1,609 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_RASTERIZER_OUTLINE_AA_INCLUDED -#define AGG_RASTERIZER_OUTLINE_AA_INCLUDED - -#include "agg_basics.h" -#include "agg_line_aa_basics.h" -#include "agg_vertex_sequence.h" - -namespace agg -{ - - //------------------------------------------------------------------------- - inline bool cmp_dist_start(int d) { return d > 0; } - inline bool cmp_dist_end(int d) { return d <= 0; } - - - - //-----------------------------------------------------------line_aa_vertex - // Vertex (x, y) with the distance to the next one. The last vertex has - // the distance between the last and the first points - struct line_aa_vertex - { - int x; - int y; - int len; - - line_aa_vertex() {} - line_aa_vertex(int x_, int y_) : - x(x_), - y(y_), - len(0) - { - } - - bool operator () (const line_aa_vertex& val) - { - double dx = val.x - x; - double dy = val.y - y; - return (len = uround(sqrt(dx * dx + dy * dy))) > - (line_subpixel_scale + line_subpixel_scale / 2); - } - }; - - - //----------------------------------------------------------outline_aa_join_e - enum outline_aa_join_e - { - outline_no_join, //-----outline_no_join - outline_miter_join, //-----outline_miter_join - outline_round_join, //-----outline_round_join - outline_miter_accurate_join //-----outline_accurate_join - }; - - //=======================================================rasterizer_outline_aa - template class rasterizer_outline_aa - { - private: - //------------------------------------------------------------------------ - struct draw_vars - { - unsigned idx; - int x1, y1, x2, y2; - line_parameters curr, next; - int lcurr, lnext; - int xb1, yb1, xb2, yb2; - unsigned flags; - }; - - void draw(draw_vars& dv, unsigned start, unsigned end); - - public: - typedef line_aa_vertex vertex_type; - typedef vertex_sequence vertex_storage_type; - - explicit rasterizer_outline_aa(Renderer& ren) : - m_ren(&ren), - m_line_join(ren.accurate_join_only() ? - outline_miter_accurate_join : - outline_round_join), - m_round_cap(false), - m_start_x(0), - m_start_y(0) - {} - void attach(Renderer& ren) { m_ren = &ren; } - - //------------------------------------------------------------------------ - void line_join(outline_aa_join_e join) - { - m_line_join = m_ren->accurate_join_only() ? - outline_miter_accurate_join : - join; - } - bool line_join() const { return m_line_join; } - - //------------------------------------------------------------------------ - void round_cap(bool v) { m_round_cap = v; } - bool round_cap() const { return m_round_cap; } - - //------------------------------------------------------------------------ - void move_to(int x, int y) - { - m_src_vertices.modify_last(vertex_type(m_start_x = x, m_start_y = y)); - } - - //------------------------------------------------------------------------ - void line_to(int x, int y) - { - m_src_vertices.add(vertex_type(x, y)); - } - - //------------------------------------------------------------------------ - void move_to_d(double x, double y) - { - move_to(Coord::conv(x), Coord::conv(y)); - } - - //------------------------------------------------------------------------ - void line_to_d(double x, double y) - { - line_to(Coord::conv(x), Coord::conv(y)); - } - - //------------------------------------------------------------------------ - void render(bool close_polygon); - - //------------------------------------------------------------------------ - void add_vertex(double x, double y, unsigned cmd) - { - if(is_move_to(cmd)) - { - render(false); - move_to_d(x, y); - } - else - { - if(is_end_poly(cmd)) - { - render(is_closed(cmd)); - if(is_closed(cmd)) - { - move_to(m_start_x, m_start_y); - } - } - else - { - line_to_d(x, y); - } - } - } - - //------------------------------------------------------------------------ - template - void add_path(VertexSource& vs, unsigned path_id=0) - { - double x; - double y; - - unsigned cmd; - vs.rewind(path_id); - while(!is_stop(cmd = vs.vertex(&x, &y))) - { - add_vertex(x, y, cmd); - } - render(false); - } - - - //------------------------------------------------------------------------ - template - void render_all_paths(VertexSource& vs, - const ColorStorage& colors, - const PathId& path_id, - unsigned num_paths) - { - for(unsigned i = 0; i < num_paths; i++) - { - m_ren->color(colors[i]); - add_path(vs, path_id[i]); - } - } - - - //------------------------------------------------------------------------ - template void render_ctrl(Ctrl& c) - { - unsigned i; - for(i = 0; i < c.num_paths(); i++) - { - m_ren->color(c.color(i)); - add_path(c, i); - } - } - - private: - rasterizer_outline_aa(const rasterizer_outline_aa&); - const rasterizer_outline_aa& operator = - (const rasterizer_outline_aa&); - - Renderer* m_ren; - vertex_storage_type m_src_vertices; - outline_aa_join_e m_line_join; - bool m_round_cap; - int m_start_x; - int m_start_y; - }; - - - - - - - - - //---------------------------------------------------------------------------- - template - void rasterizer_outline_aa::draw(draw_vars& dv, - unsigned start, - unsigned end) - { - unsigned i; - const vertex_storage_type::value_type* v; - - for(i = start; i < end; i++) - { - if(m_line_join == outline_round_join) - { - dv.xb1 = dv.curr.x1 + (dv.curr.y2 - dv.curr.y1); - dv.yb1 = dv.curr.y1 - (dv.curr.x2 - dv.curr.x1); - dv.xb2 = dv.curr.x2 + (dv.curr.y2 - dv.curr.y1); - dv.yb2 = dv.curr.y2 - (dv.curr.x2 - dv.curr.x1); - } - - switch(dv.flags) - { - case 0: m_ren->line3(dv.curr, dv.xb1, dv.yb1, dv.xb2, dv.yb2); break; - case 1: m_ren->line2(dv.curr, dv.xb2, dv.yb2); break; - case 2: m_ren->line1(dv.curr, dv.xb1, dv.yb1); break; - case 3: m_ren->line0(dv.curr); break; - } - - if(m_line_join == outline_round_join && (dv.flags & 2) == 0) - { - m_ren->pie(dv.curr.x2, dv.curr.y2, - dv.curr.x2 + (dv.curr.y2 - dv.curr.y1), - dv.curr.y2 - (dv.curr.x2 - dv.curr.x1), - dv.curr.x2 + (dv.next.y2 - dv.next.y1), - dv.curr.y2 - (dv.next.x2 - dv.next.x1)); - } - - dv.x1 = dv.x2; - dv.y1 = dv.y2; - dv.lcurr = dv.lnext; - dv.lnext = m_src_vertices[dv.idx].len; - - ++dv.idx; - if(dv.idx >= m_src_vertices.size()) dv.idx = 0; - - v = &m_src_vertices[dv.idx]; - dv.x2 = v->x; - dv.y2 = v->y; - - dv.curr = dv.next; - dv.next = line_parameters(dv.x1, dv.y1, dv.x2, dv.y2, dv.lnext); - dv.xb1 = dv.xb2; - dv.yb1 = dv.yb2; - - switch(m_line_join) - { - case outline_no_join: - dv.flags = 3; - break; - - case outline_miter_join: - dv.flags >>= 1; - dv.flags |= ((dv.curr.diagonal_quadrant() == - dv.next.diagonal_quadrant()) << 1); - if((dv.flags & 2) == 0) - { - bisectrix(dv.curr, dv.next, &dv.xb2, &dv.yb2); - } - break; - - case outline_round_join: - dv.flags >>= 1; - dv.flags |= ((dv.curr.diagonal_quadrant() == - dv.next.diagonal_quadrant()) << 1); - break; - - case outline_miter_accurate_join: - dv.flags = 0; - bisectrix(dv.curr, dv.next, &dv.xb2, &dv.yb2); - break; - } - } - } - - - - - //---------------------------------------------------------------------------- - template - void rasterizer_outline_aa::render(bool close_polygon) - { - m_src_vertices.close(close_polygon); - draw_vars dv; - const vertex_storage_type::value_type* v; - int x1; - int y1; - int x2; - int y2; - int lprev; - - if(close_polygon) - { - if(m_src_vertices.size() >= 3) - { - dv.idx = 2; - - v = &m_src_vertices[m_src_vertices.size() - 1]; - x1 = v->x; - y1 = v->y; - lprev = v->len; - - v = &m_src_vertices[0]; - x2 = v->x; - y2 = v->y; - dv.lcurr = v->len; - line_parameters prev(x1, y1, x2, y2, lprev); - - v = &m_src_vertices[1]; - dv.x1 = v->x; - dv.y1 = v->y; - dv.lnext = v->len; - dv.curr = line_parameters(x2, y2, dv.x1, dv.y1, dv.lcurr); - - v = &m_src_vertices[dv.idx]; - dv.x2 = v->x; - dv.y2 = v->y; - dv.next = line_parameters(dv.x1, dv.y1, dv.x2, dv.y2, dv.lnext); - - dv.xb1 = 0; - dv.yb1 = 0; - dv.xb2 = 0; - dv.yb2 = 0; - - switch(m_line_join) - { - case outline_no_join: - dv.flags = 3; - break; - - case outline_miter_join: - case outline_round_join: - dv.flags = - (prev.diagonal_quadrant() == dv.curr.diagonal_quadrant()) | - ((dv.curr.diagonal_quadrant() == dv.next.diagonal_quadrant()) << 1); - break; - - case outline_miter_accurate_join: - dv.flags = 0; - break; - } - - if((dv.flags & 1) == 0 && m_line_join != outline_round_join) - { - bisectrix(prev, dv.curr, &dv.xb1, &dv.yb1); - } - - if((dv.flags & 2) == 0 && m_line_join != outline_round_join) - { - bisectrix(dv.curr, dv.next, &dv.xb2, &dv.yb2); - } - draw(dv, 0, m_src_vertices.size()); - } - } - else - { - switch(m_src_vertices.size()) - { - case 0: - case 1: - break; - - case 2: - { - v = &m_src_vertices[0]; - x1 = v->x; - y1 = v->y; - lprev = v->len; - v = &m_src_vertices[1]; - x2 = v->x; - y2 = v->y; - line_parameters lp(x1, y1, x2, y2, lprev); - if(m_round_cap) - { - m_ren->semidot(cmp_dist_start, x1, y1, x1 + (y2 - y1), y1 - (x2 - x1)); - } - m_ren->line3(lp, - x1 + (y2 - y1), - y1 - (x2 - x1), - x2 + (y2 - y1), - y2 - (x2 - x1)); - if(m_round_cap) - { - m_ren->semidot(cmp_dist_end, x2, y2, x2 + (y2 - y1), y2 - (x2 - x1)); - } - } - break; - - case 3: - { - int x3, y3; - int lnext; - v = &m_src_vertices[0]; - x1 = v->x; - y1 = v->y; - lprev = v->len; - v = &m_src_vertices[1]; - x2 = v->x; - y2 = v->y; - lnext = v->len; - v = &m_src_vertices[2]; - x3 = v->x; - y3 = v->y; - line_parameters lp1(x1, y1, x2, y2, lprev); - line_parameters lp2(x2, y2, x3, y3, lnext); - - if(m_round_cap) - { - m_ren->semidot(cmp_dist_start, x1, y1, x1 + (y2 - y1), y1 - (x2 - x1)); - } - - if(m_line_join == outline_round_join) - { - m_ren->line3(lp1, x1 + (y2 - y1), y1 - (x2 - x1), - x2 + (y2 - y1), y2 - (x2 - x1)); - - m_ren->pie(x2, y2, x2 + (y2 - y1), y2 - (x2 - x1), - x2 + (y3 - y2), y2 - (x3 - x2)); - - m_ren->line3(lp2, x2 + (y3 - y2), y2 - (x3 - x2), - x3 + (y3 - y2), y3 - (x3 - x2)); - } - else - { - bisectrix(lp1, lp2, &dv.xb1, &dv.yb1); - m_ren->line3(lp1, x1 + (y2 - y1), y1 - (x2 - x1), - dv.xb1, dv.yb1); - - m_ren->line3(lp2, dv.xb1, dv.yb1, - x3 + (y3 - y2), y3 - (x3 - x2)); - } - if(m_round_cap) - { - m_ren->semidot(cmp_dist_end, x3, y3, x3 + (y3 - y2), y3 - (x3 - x2)); - } - } - break; - - default: - { - dv.idx = 3; - - v = &m_src_vertices[0]; - x1 = v->x; - y1 = v->y; - lprev = v->len; - - v = &m_src_vertices[1]; - x2 = v->x; - y2 = v->y; - dv.lcurr = v->len; - line_parameters prev(x1, y1, x2, y2, lprev); - - v = &m_src_vertices[2]; - dv.x1 = v->x; - dv.y1 = v->y; - dv.lnext = v->len; - dv.curr = line_parameters(x2, y2, dv.x1, dv.y1, dv.lcurr); - - v = &m_src_vertices[dv.idx]; - dv.x2 = v->x; - dv.y2 = v->y; - dv.next = line_parameters(dv.x1, dv.y1, dv.x2, dv.y2, dv.lnext); - - dv.xb1 = 0; - dv.yb1 = 0; - dv.xb2 = 0; - dv.yb2 = 0; - - switch(m_line_join) - { - case outline_no_join: - dv.flags = 3; - break; - - case outline_miter_join: - case outline_round_join: - dv.flags = - (prev.diagonal_quadrant() == dv.curr.diagonal_quadrant()) | - ((dv.curr.diagonal_quadrant() == dv.next.diagonal_quadrant()) << 1); - break; - - case outline_miter_accurate_join: - dv.flags = 0; - break; - } - - if(m_round_cap) - { - m_ren->semidot(cmp_dist_start, x1, y1, x1 + (y2 - y1), y1 - (x2 - x1)); - } - if((dv.flags & 1) == 0) - { - if(m_line_join == outline_round_join) - { - m_ren->line3(prev, x1 + (y2 - y1), y1 - (x2 - x1), - x2 + (y2 - y1), y2 - (x2 - x1)); - m_ren->pie(prev.x2, prev.y2, - x2 + (y2 - y1), y2 - (x2 - x1), - dv.curr.x1 + (dv.curr.y2 - dv.curr.y1), - dv.curr.y1 - (dv.curr.x2 - dv.curr.x1)); - } - else - { - bisectrix(prev, dv.curr, &dv.xb1, &dv.yb1); - m_ren->line3(prev, x1 + (y2 - y1), y1 - (x2 - x1), - dv.xb1, dv.yb1); - } - } - else - { - m_ren->line1(prev, - x1 + (y2 - y1), - y1 - (x2 - x1)); - } - if((dv.flags & 2) == 0 && m_line_join != outline_round_join) - { - bisectrix(dv.curr, dv.next, &dv.xb2, &dv.yb2); - } - - draw(dv, 1, m_src_vertices.size() - 2); - - if((dv.flags & 1) == 0) - { - if(m_line_join == outline_round_join) - { - m_ren->line3(dv.curr, - dv.curr.x1 + (dv.curr.y2 - dv.curr.y1), - dv.curr.y1 - (dv.curr.x2 - dv.curr.x1), - dv.curr.x2 + (dv.curr.y2 - dv.curr.y1), - dv.curr.y2 - (dv.curr.x2 - dv.curr.x1)); - } - else - { - m_ren->line3(dv.curr, dv.xb1, dv.yb1, - dv.curr.x2 + (dv.curr.y2 - dv.curr.y1), - dv.curr.y2 - (dv.curr.x2 - dv.curr.x1)); - } - } - else - { - m_ren->line2(dv.curr, - dv.curr.x2 + (dv.curr.y2 - dv.curr.y1), - dv.curr.y2 - (dv.curr.x2 - dv.curr.x1)); - } - if(m_round_cap) - { - m_ren->semidot(cmp_dist_end, dv.curr.x2, dv.curr.y2, - dv.curr.x2 + (dv.curr.y2 - dv.curr.y1), - dv.curr.y2 - (dv.curr.x2 - dv.curr.x1)); - } - - } - break; - } - } - m_src_vertices.remove_all(); - } - - -} - - -#endif - diff --git a/uppdev/aggdraw/agg_rasterizer_scanline_aa.h b/uppdev/aggdraw/agg_rasterizer_scanline_aa.h deleted file mode 100644 index b5d363add..000000000 --- a/uppdev/aggdraw/agg_rasterizer_scanline_aa.h +++ /dev/null @@ -1,520 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// The author gratefully acknowleges the support of David Turner, -// Robert Wilhelm, and Werner Lemberg - the authors of the FreeType -// libray - in producing this work. See http://www.freetype.org for details. -// -//---------------------------------------------------------------------------- -// -// Adaptation for 32-bit screen coordinates has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- - -#ifndef AGG_RASTERIZER_SCANLINE_AA_INCLUDED -#define AGG_RASTERIZER_SCANLINE_AA_INCLUDED - -#include "agg_rasterizer_cells_aa.h" -#include "agg_rasterizer_sl_clip.h" -#include "agg_gamma_functions.h" - - -namespace agg -{ - - - //-----------------------------------------------------------------cell_aa - // A pixel cell. There're no constructors defined and it was done - // intentionally in order to avoid extra overhead when allocating an - // array of cells. - struct cell_aa - { - int x; - int y; - int cover; - int area; - - void initial() - { - x = 0x7FFFFFFF; - y = 0x7FFFFFFF; - cover = 0; - area = 0; - } - - void style(const cell_aa&) {} - - int not_equal(int ex, int ey, const cell_aa&) const - { - return (ex - x) | (ey - y); - } - }; - - - //==================================================rasterizer_scanline_aa - // Polygon rasterizer that is used to render filled polygons with - // high-quality Anti-Aliasing. Internally, by default, the class uses - // integer coordinates in format 24.8, i.e. 24 bits for integer part - // and 8 bits for fractional - see poly_subpixel_shift. This class can be - // used in the following way: - // - // 1. filling_rule(filling_rule_e ft) - optional. - // - // 2. gamma() - optional. - // - // 3. reset() - // - // 4. move_to(x, y) / line_to(x, y) - make the polygon. One can create - // more than one contour, but each contour must consist of at least 3 - // vertices, i.e. move_to(x1, y1); line_to(x2, y2); line_to(x3, y3); - // is the absolute minimum of vertices that define a triangle. - // The algorithm does not check either the number of vertices nor - // coincidence of their coordinates, but in the worst case it just - // won't draw anything. - // The orger of the vertices (clockwise or counterclockwise) - // is important when using the non-zero filling rule (fill_non_zero). - // In this case the vertex order of all the contours must be the same - // if you want your intersecting polygons to be without "holes". - // You actually can use different vertices order. If the contours do not - // intersect each other the order is not important anyway. If they do, - // contours with the same vertex order will be rendered without "holes" - // while the intersecting contours with different orders will have "holes". - // - // filling_rule() and gamma() can be called anytime before "sweeping". - //------------------------------------------------------------------------ - template class rasterizer_scanline_aa - { - enum status - { - status_initial, - status_move_to, - status_line_to, - status_closed - }; - - public: - typedef Clip clip_type; - typedef typename Clip::conv_type conv_type; - typedef typename Clip::coord_type coord_type; - - enum aa_scale_e - { - aa_shift = 8, - aa_scale = 1 << aa_shift, - aa_mask = aa_scale - 1, - aa_scale2 = aa_scale * 2, - aa_mask2 = aa_scale2 - 1 - }; - - //-------------------------------------------------------------------- - rasterizer_scanline_aa() : - m_outline(), - m_clipper(), - m_filling_rule(fill_non_zero), - m_auto_close(true), - m_start_x(0), - m_start_y(0), - m_status(status_initial) - { - int i; - for(i = 0; i < aa_scale; i++) m_gamma[i] = i; - } - - //-------------------------------------------------------------------- - template - rasterizer_scanline_aa(const GammaF& gamma_function) : - m_outline(), - m_clipper(m_outline), - m_filling_rule(fill_non_zero), - m_auto_close(true), - m_start_x(0), - m_start_y(0), - m_status(status_initial) - { - gamma(gamma_function); - } - - //-------------------------------------------------------------------- - void reset(); - void reset_clipping(); - void clip_box(double x1, double y1, double x2, double y2); - void filling_rule(filling_rule_e filling_rule); - void auto_close(bool flag) { m_auto_close = flag; } - - //-------------------------------------------------------------------- - template void gamma(const GammaF& gamma_function) - { - int i; - for(i = 0; i < aa_scale; i++) - { - m_gamma[i] = uround(gamma_function(double(i) / aa_mask) * aa_mask); - } - } - - //-------------------------------------------------------------------- - unsigned apply_gamma(unsigned cover) const - { - return m_gamma[cover]; - } - - //-------------------------------------------------------------------- - void move_to(int x, int y); - void line_to(int x, int y); - void move_to_d(double x, double y); - void line_to_d(double x, double y); - void close_polygon(); - void add_vertex(double x, double y, unsigned cmd); - - void edge(int x1, int y1, int x2, int y2); - void edge_d(double x1, double y1, double x2, double y2); - - //------------------------------------------------------------------- - template - void add_path(VertexSource& vs, unsigned path_id=0) - { - double x; - double y; - - unsigned cmd; - vs.rewind(path_id); - if(m_outline.sorted()) reset(); - while(!is_stop(cmd = vs.vertex(&x, &y))) - { - add_vertex(x, y, cmd); - } - } - - //-------------------------------------------------------------------- - int min_x() const { return m_outline.min_x(); } - int min_y() const { return m_outline.min_y(); } - int max_x() const { return m_outline.max_x(); } - int max_y() const { return m_outline.max_y(); } - - //-------------------------------------------------------------------- - void sort(); - bool rewind_scanlines(); - bool navigate_scanline(int y); - - //-------------------------------------------------------------------- - AGG_INLINE unsigned calculate_alpha(int area) const - { - int cover = area >> (poly_subpixel_shift*2 + 1 - aa_shift); - - if(cover < 0) cover = -cover; - if(m_filling_rule == fill_even_odd) - { - cover &= aa_mask2; - if(cover > aa_scale) - { - cover = aa_scale2 - cover; - } - } - if(cover > aa_mask) cover = aa_mask; - return m_gamma[cover]; - } - - //-------------------------------------------------------------------- - template bool sweep_scanline(Scanline& sl) - { - for(;;) - { - if(m_scan_y > m_outline.max_y()) return false; - sl.reset_spans(); - unsigned num_cells = m_outline.scanline_num_cells(m_scan_y); - const cell_aa* const* cells = m_outline.scanline_cells(m_scan_y); - int cover = 0; - - while(num_cells) - { - const cell_aa* cur_cell = *cells; - int x = cur_cell->x; - int area = cur_cell->area; - unsigned alpha; - - cover += cur_cell->cover; - - //accumulate all cells with the same X - while(--num_cells) - { - cur_cell = *++cells; - if(cur_cell->x != x) break; - area += cur_cell->area; - cover += cur_cell->cover; - } - - if(area) - { - alpha = calculate_alpha((cover << (poly_subpixel_shift + 1)) - area); - if(alpha) - { - sl.add_cell(x, alpha); - } - x++; - } - - if(num_cells && cur_cell->x > x) - { - alpha = calculate_alpha(cover << (poly_subpixel_shift + 1)); - if(alpha) - { - sl.add_span(x, cur_cell->x - x, alpha); - } - } - } - - if(sl.num_spans()) break; - ++m_scan_y; - } - - sl.finalize(m_scan_y); - ++m_scan_y; - return true; - } - - //-------------------------------------------------------------------- - bool hit_test(int tx, int ty); - - - private: - //-------------------------------------------------------------------- - // Disable copying - rasterizer_scanline_aa(const rasterizer_scanline_aa&); - const rasterizer_scanline_aa& - operator = (const rasterizer_scanline_aa&); - - private: - rasterizer_cells_aa m_outline; - clip_type m_clipper; - int m_gamma[aa_scale]; - filling_rule_e m_filling_rule; - bool m_auto_close; - coord_type m_start_x; - coord_type m_start_y; - unsigned m_status; - int m_scan_y; - }; - - - - - - - - - - - - - //------------------------------------------------------------------------ - template - void rasterizer_scanline_aa::reset() - { - m_outline.reset(); - m_status = status_initial; - } - - //------------------------------------------------------------------------ - template - void rasterizer_scanline_aa::filling_rule(filling_rule_e filling_rule) - { - m_filling_rule = filling_rule; - } - - //------------------------------------------------------------------------ - template - void rasterizer_scanline_aa::clip_box(double x1, double y1, - double x2, double y2) - { - reset(); - m_clipper.clip_box(conv_type::upscale(x1), conv_type::upscale(y1), - conv_type::upscale(x2), conv_type::upscale(y2)); - } - - //------------------------------------------------------------------------ - template - void rasterizer_scanline_aa::reset_clipping() - { - reset(); - m_clipper.reset_clipping(); - } - - //------------------------------------------------------------------------ - template - void rasterizer_scanline_aa::close_polygon() - { - if(m_status == status_line_to) - { - m_clipper.line_to(m_outline, m_start_x, m_start_y); - m_status = status_closed; - } - } - - //------------------------------------------------------------------------ - template - void rasterizer_scanline_aa::move_to(int x, int y) - { - if(m_outline.sorted()) reset(); - if(m_auto_close) close_polygon(); - m_clipper.move_to(m_start_x = conv_type::downscale(x), - m_start_y = conv_type::downscale(y)); - m_status = status_move_to; - } - - //------------------------------------------------------------------------ - template - void rasterizer_scanline_aa::line_to(int x, int y) - { - m_clipper.line_to(m_outline, - conv_type::downscale(x), - conv_type::downscale(y)); - m_status = status_line_to; - } - - //------------------------------------------------------------------------ - template - void rasterizer_scanline_aa::move_to_d(double x, double y) - { - if(m_outline.sorted()) reset(); - if(m_auto_close) close_polygon(); - m_clipper.move_to(m_start_x = conv_type::upscale(x), - m_start_y = conv_type::upscale(y)); - m_status = status_move_to; - } - - //------------------------------------------------------------------------ - template - void rasterizer_scanline_aa::line_to_d(double x, double y) - { - m_clipper.line_to(m_outline, - conv_type::upscale(x), - conv_type::upscale(y)); - m_status = status_line_to; - } - - //------------------------------------------------------------------------ - template - void rasterizer_scanline_aa::add_vertex(double x, double y, unsigned cmd) - { - if(is_move_to(cmd)) - { - move_to_d(x, y); - } - else - if(is_vertex(cmd)) - { - line_to_d(x, y); - } - else - if(is_close(cmd)) - { - close_polygon(); - } - } - - //------------------------------------------------------------------------ - template - void rasterizer_scanline_aa::edge(int x1, int y1, int x2, int y2) - { - if(m_outline.sorted()) reset(); - m_clipper.move_to(conv_type::downscale(x1), conv_type::downscale(y1)); - m_clipper.line_to(m_outline, - conv_type::downscale(x2), - conv_type::downscale(y2)); - m_status = status_move_to; - } - - //------------------------------------------------------------------------ - template - void rasterizer_scanline_aa::edge_d(double x1, double y1, - double x2, double y2) - { - if(m_outline.sorted()) reset(); - m_clipper.move_to(conv_type::upscale(x1), conv_type::upscale(y1)); - m_clipper.line_to(m_outline, - conv_type::upscale(x2), - conv_type::upscale(y2)); - m_status = status_move_to; - } - - //------------------------------------------------------------------------ - template - void rasterizer_scanline_aa::sort() - { - if(m_auto_close) close_polygon(); - m_outline.sort_cells(); - } - - //------------------------------------------------------------------------ - template - AGG_INLINE bool rasterizer_scanline_aa::rewind_scanlines() - { - if(m_auto_close) close_polygon(); - m_outline.sort_cells(); - if(m_outline.total_cells() == 0) - { - return false; - } - m_scan_y = m_outline.min_y(); - return true; - } - - - //------------------------------------------------------------------------ - template - AGG_INLINE bool rasterizer_scanline_aa::navigate_scanline(int y) - { - if(m_auto_close) close_polygon(); - m_outline.sort_cells(); - if(m_outline.total_cells() == 0 || - y < m_outline.min_y() || - y > m_outline.max_y()) - { - return false; - } - m_scan_y = y; - return true; - } - - //------------------------------------------------------------------------ - template - bool rasterizer_scanline_aa::hit_test(int tx, int ty) - { - if(!navigate_scanline(ty)) return false; - scanline_hit_test sl(tx); - sweep_scanline(sl); - return sl.hit(); - } - - - -} - - - -#endif - diff --git a/uppdev/aggdraw/agg_rasterizer_sl_clip.h b/uppdev/aggdraw/agg_rasterizer_sl_clip.h deleted file mode 100644 index c11e6da76..000000000 --- a/uppdev/aggdraw/agg_rasterizer_sl_clip.h +++ /dev/null @@ -1,361 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_RASTERIZER_SL_CLIP_INCLUDED -#define AGG_RASTERIZER_SL_CLIP_INCLUDED - -#include "agg_clip_liang_barsky.h" - -namespace agg -{ - //--------------------------------------------------------poly_max_coord_e - enum poly_max_coord_e - { - poly_max_coord = (1 << 30) - 1 //----poly_max_coord - }; - - //------------------------------------------------------------ras_conv_int - struct ras_conv_int - { - typedef int coord_type; - static AGG_INLINE int mul_div(double a, double b, double c) - { - return iround(a * b / c); - } - static int xi(int v) { return v; } - static int yi(int v) { return v; } - static int upscale(double v) { return iround(v * poly_subpixel_scale); } - static int downscale(int v) { return v; } - }; - - //--------------------------------------------------------ras_conv_int_sat - struct ras_conv_int_sat - { - typedef int coord_type; - static AGG_INLINE int mul_div(double a, double b, double c) - { - return saturation::iround(a * b / c); - } - static int xi(int v) { return v; } - static int yi(int v) { return v; } - static int upscale(double v) - { - return saturation::iround(v * poly_subpixel_scale); - } - static int downscale(int v) { return v; } - }; - - //---------------------------------------------------------ras_conv_int_3x - struct ras_conv_int_3x - { - typedef int coord_type; - static AGG_INLINE int mul_div(double a, double b, double c) - { - return iround(a * b / c); - } - static int xi(int v) { return v * 3; } - static int yi(int v) { return v; } - static int upscale(double v) { return iround(v * poly_subpixel_scale); } - static int downscale(int v) { return v; } - }; - - //-----------------------------------------------------------ras_conv_dbl - struct ras_conv_dbl - { - typedef double coord_type; - static AGG_INLINE double mul_div(double a, double b, double c) - { - return a * b / c; - } - static int xi(double v) { return iround(v * poly_subpixel_scale); } - static int yi(double v) { return iround(v * poly_subpixel_scale); } - static double upscale(double v) { return v; } - static double downscale(int v) { return v / double(poly_subpixel_scale); } - }; - - //--------------------------------------------------------ras_conv_dbl_3x - struct ras_conv_dbl_3x - { - typedef double coord_type; - static AGG_INLINE double mul_div(double a, double b, double c) - { - return a * b / c; - } - static int xi(double v) { return iround(v * poly_subpixel_scale * 3); } - static int yi(double v) { return iround(v * poly_subpixel_scale); } - static double upscale(double v) { return v; } - static double downscale(int v) { return v / double(poly_subpixel_scale); } - }; - - - - - - //------------------------------------------------------rasterizer_sl_clip - template class rasterizer_sl_clip - { - public: - typedef Conv conv_type; - typedef typename Conv::coord_type coord_type; - typedef rect_base rect_type; - - //-------------------------------------------------------------------- - rasterizer_sl_clip() : - m_clip_box(0,0,0,0), - m_x1(0), - m_y1(0), - m_f1(0), - m_clipping(false) - {} - - //-------------------------------------------------------------------- - void reset_clipping() - { - m_clipping = false; - } - - //-------------------------------------------------------------------- - void clip_box(coord_type x1, coord_type y1, coord_type x2, coord_type y2) - { - m_clip_box = rect_type(x1, y1, x2, y2); - m_clip_box.normalize(); - m_clipping = true; - } - - //-------------------------------------------------------------------- - void move_to(coord_type x1, coord_type y1) - { - m_x1 = x1; - m_y1 = y1; - if(m_clipping) m_f1 = clipping_flags(x1, y1, m_clip_box); - } - - private: - //------------------------------------------------------------------------ - template - AGG_INLINE void line_clip_y(Rasterizer& ras, - coord_type x1, coord_type y1, - coord_type x2, coord_type y2, - unsigned f1, unsigned f2) const - { - f1 &= 10; - f2 &= 10; - if((f1 | f2) == 0) - { - // Fully visible - ras.line(Conv::xi(x1), Conv::yi(y1), Conv::xi(x2), Conv::yi(y2)); - } - else - { - if(f1 == f2) - { - // Invisible by Y - return; - } - - coord_type tx1 = x1; - coord_type ty1 = y1; - coord_type tx2 = x2; - coord_type ty2 = y2; - - if(f1 & 8) // y1 < clip.y1 - { - tx1 = x1 + Conv::mul_div(m_clip_box.y1-y1, x2-x1, y2-y1); - ty1 = m_clip_box.y1; - } - - if(f1 & 2) // y1 > clip.y2 - { - tx1 = x1 + Conv::mul_div(m_clip_box.y2-y1, x2-x1, y2-y1); - ty1 = m_clip_box.y2; - } - - if(f2 & 8) // y2 < clip.y1 - { - tx2 = x1 + Conv::mul_div(m_clip_box.y1-y1, x2-x1, y2-y1); - ty2 = m_clip_box.y1; - } - - if(f2 & 2) // y2 > clip.y2 - { - tx2 = x1 + Conv::mul_div(m_clip_box.y2-y1, x2-x1, y2-y1); - ty2 = m_clip_box.y2; - } - ras.line(Conv::xi(tx1), Conv::yi(ty1), - Conv::xi(tx2), Conv::yi(ty2)); - } - } - - - public: - //-------------------------------------------------------------------- - template - void line_to(Rasterizer& ras, coord_type x2, coord_type y2) - { - if(m_clipping) - { - unsigned f2 = clipping_flags(x2, y2, m_clip_box); - - if((m_f1 & 10) == (f2 & 10) && (m_f1 & 10) != 0) - { - // Invisible by Y - m_x1 = x2; - m_y1 = y2; - m_f1 = f2; - return; - } - - coord_type x1 = m_x1; - coord_type y1 = m_y1; - unsigned f1 = m_f1; - coord_type y3, y4; - unsigned f3, f4; - - switch(((f1 & 5) << 1) | (f2 & 5)) - { - case 0: // Visible by X - line_clip_y(ras, x1, y1, x2, y2, f1, f2); - break; - - case 1: // x2 > clip.x2 - y3 = y1 + Conv::mul_div(m_clip_box.x2-x1, y2-y1, x2-x1); - f3 = clipping_flags_y(y3, m_clip_box); - line_clip_y(ras, x1, y1, m_clip_box.x2, y3, f1, f3); - line_clip_y(ras, m_clip_box.x2, y3, m_clip_box.x2, y2, f3, f2); - break; - - case 2: // x1 > clip.x2 - y3 = y1 + Conv::mul_div(m_clip_box.x2-x1, y2-y1, x2-x1); - f3 = clipping_flags_y(y3, m_clip_box); - line_clip_y(ras, m_clip_box.x2, y1, m_clip_box.x2, y3, f1, f3); - line_clip_y(ras, m_clip_box.x2, y3, x2, y2, f3, f2); - break; - - case 3: // x1 > clip.x2 && x2 > clip.x2 - line_clip_y(ras, m_clip_box.x2, y1, m_clip_box.x2, y2, f1, f2); - break; - - case 4: // x2 < clip.x1 - y3 = y1 + Conv::mul_div(m_clip_box.x1-x1, y2-y1, x2-x1); - f3 = clipping_flags_y(y3, m_clip_box); - line_clip_y(ras, x1, y1, m_clip_box.x1, y3, f1, f3); - line_clip_y(ras, m_clip_box.x1, y3, m_clip_box.x1, y2, f3, f2); - break; - - case 6: // x1 > clip.x2 && x2 < clip.x1 - y3 = y1 + Conv::mul_div(m_clip_box.x2-x1, y2-y1, x2-x1); - y4 = y1 + Conv::mul_div(m_clip_box.x1-x1, y2-y1, x2-x1); - f3 = clipping_flags_y(y3, m_clip_box); - f4 = clipping_flags_y(y4, m_clip_box); - line_clip_y(ras, m_clip_box.x2, y1, m_clip_box.x2, y3, f1, f3); - line_clip_y(ras, m_clip_box.x2, y3, m_clip_box.x1, y4, f3, f4); - line_clip_y(ras, m_clip_box.x1, y4, m_clip_box.x1, y2, f4, f2); - break; - - case 8: // x1 < clip.x1 - y3 = y1 + Conv::mul_div(m_clip_box.x1-x1, y2-y1, x2-x1); - f3 = clipping_flags_y(y3, m_clip_box); - line_clip_y(ras, m_clip_box.x1, y1, m_clip_box.x1, y3, f1, f3); - line_clip_y(ras, m_clip_box.x1, y3, x2, y2, f3, f2); - break; - - case 9: // x1 < clip.x1 && x2 > clip.x2 - y3 = y1 + Conv::mul_div(m_clip_box.x1-x1, y2-y1, x2-x1); - y4 = y1 + Conv::mul_div(m_clip_box.x2-x1, y2-y1, x2-x1); - f3 = clipping_flags_y(y3, m_clip_box); - f4 = clipping_flags_y(y4, m_clip_box); - line_clip_y(ras, m_clip_box.x1, y1, m_clip_box.x1, y3, f1, f3); - line_clip_y(ras, m_clip_box.x1, y3, m_clip_box.x2, y4, f3, f4); - line_clip_y(ras, m_clip_box.x2, y4, m_clip_box.x2, y2, f4, f2); - break; - - case 12: // x1 < clip.x1 && x2 < clip.x1 - line_clip_y(ras, m_clip_box.x1, y1, m_clip_box.x1, y2, f1, f2); - break; - } - m_f1 = f2; - } - else - { - ras.line(Conv::xi(m_x1), Conv::yi(m_y1), - Conv::xi(x2), Conv::yi(y2)); - } - m_x1 = x2; - m_y1 = y2; - } - - - private: - rect_type m_clip_box; - coord_type m_x1; - coord_type m_y1; - unsigned m_f1; - bool m_clipping; - }; - - - - - //---------------------------------------------------rasterizer_sl_no_clip - class rasterizer_sl_no_clip - { - public: - typedef ras_conv_int conv_type; - typedef int coord_type; - - rasterizer_sl_no_clip() : m_x1(0), m_y1(0) {} - - void reset_clipping() {} - void clip_box(coord_type x1, coord_type y1, coord_type x2, coord_type y2) {} - void move_to(coord_type x1, coord_type y1) { m_x1 = x1; m_y1 = y1; } - - template - void line_to(Rasterizer& ras, coord_type x2, coord_type y2) - { - ras.line(m_x1, m_y1, x2, y2); - m_x1 = x2; - m_y1 = y2; - } - - private: - int m_x1, m_y1; - }; - - - // -----rasterizer_sl_clip_int - // -----rasterizer_sl_clip_int_sat - // -----rasterizer_sl_clip_int_3x - // -----rasterizer_sl_clip_dbl - // -----rasterizer_sl_clip_dbl_3x - //------------------------------------------------------------------------ - typedef rasterizer_sl_clip rasterizer_sl_clip_int; - typedef rasterizer_sl_clip rasterizer_sl_clip_int_sat; - typedef rasterizer_sl_clip rasterizer_sl_clip_int_3x; - typedef rasterizer_sl_clip rasterizer_sl_clip_dbl; - typedef rasterizer_sl_clip rasterizer_sl_clip_dbl_3x; - - -} - -#endif diff --git a/uppdev/aggdraw/agg_renderer_base.h b/uppdev/aggdraw/agg_renderer_base.h deleted file mode 100644 index 9d9c1be96..000000000 --- a/uppdev/aggdraw/agg_renderer_base.h +++ /dev/null @@ -1,723 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_RENDERER_BASE_INCLUDED -#define AGG_RENDERER_BASE_INCLUDED - -#include "agg_basics.h" -#include "agg_rendering_buffer.h" - -namespace agg -{ - - //-----------------------------------------------------------renderer_base - template class renderer_base - { - public: - typedef PixelFormat pixfmt_type; - typedef typename pixfmt_type::color_type color_type; - typedef typename pixfmt_type::row_data row_data; - - //-------------------------------------------------------------------- - renderer_base() : m_ren(0), m_clip_box(1, 1, 0, 0) {} - explicit renderer_base(pixfmt_type& ren) : - m_ren(&ren), - m_clip_box(0, 0, ren.width() - 1, ren.height() - 1) - {} - void attach(pixfmt_type& ren) - { - m_ren = &ren; - m_clip_box = rect_i(0, 0, ren.width() - 1, ren.height() - 1); - } - - //-------------------------------------------------------------------- - const pixfmt_type& ren() const { return *m_ren; } - pixfmt_type& ren() { return *m_ren; } - - //-------------------------------------------------------------------- - unsigned width() const { return m_ren->width(); } - unsigned height() const { return m_ren->height(); } - - //-------------------------------------------------------------------- - bool clip_box(int x1, int y1, int x2, int y2) - { - rect_i cb(x1, y1, x2, y2); - cb.normalize(); - if(cb.clip(rect_i(0, 0, width() - 1, height() - 1))) - { - m_clip_box = cb; - return true; - } - m_clip_box.x1 = 1; - m_clip_box.y1 = 1; - m_clip_box.x2 = 0; - m_clip_box.y2 = 0; - return false; - } - - //-------------------------------------------------------------------- - void reset_clipping(bool visibility) - { - if(visibility) - { - m_clip_box.x1 = 0; - m_clip_box.y1 = 0; - m_clip_box.x2 = width() - 1; - m_clip_box.y2 = height() - 1; - } - else - { - m_clip_box.x1 = 1; - m_clip_box.y1 = 1; - m_clip_box.x2 = 0; - m_clip_box.y2 = 0; - } - } - - //-------------------------------------------------------------------- - void clip_box_naked(int x1, int y1, int x2, int y2) - { - m_clip_box.x1 = x1; - m_clip_box.y1 = y1; - m_clip_box.x2 = x2; - m_clip_box.y2 = y2; - } - - //-------------------------------------------------------------------- - bool inbox(int x, int y) const - { - return x >= m_clip_box.x1 && y >= m_clip_box.y1 && - x <= m_clip_box.x2 && y <= m_clip_box.y2; - } - - //-------------------------------------------------------------------- - const rect_i& clip_box() const { return m_clip_box; } - int xmin() const { return m_clip_box.x1; } - int ymin() const { return m_clip_box.y1; } - int xmax() const { return m_clip_box.x2; } - int ymax() const { return m_clip_box.y2; } - - //-------------------------------------------------------------------- - const rect_i& bounding_clip_box() const { return m_clip_box; } - int bounding_xmin() const { return m_clip_box.x1; } - int bounding_ymin() const { return m_clip_box.y1; } - int bounding_xmax() const { return m_clip_box.x2; } - int bounding_ymax() const { return m_clip_box.y2; } - - //-------------------------------------------------------------------- - void clear(const color_type& c) - { - unsigned y; - if(width()) - { - for(y = 0; y < height(); y++) - { - m_ren->copy_hline(0, y, width(), c); - } - } - } - - - //-------------------------------------------------------------------- - void copy_pixel(int x, int y, const color_type& c) - { - if(inbox(x, y)) - { - m_ren->copy_pixel(x, y, c); - } - } - - //-------------------------------------------------------------------- - void blend_pixel(int x, int y, const color_type& c, cover_type cover) - { - if(inbox(x, y)) - { - m_ren->blend_pixel(x, y, c, cover); - } - } - - //-------------------------------------------------------------------- - color_type pixel(int x, int y) const - { - return inbox(x, y) ? - m_ren->pixel(x, y) : - color_type::no_color(); - } - - //-------------------------------------------------------------------- - void copy_hline(int x1, int y, int x2, const color_type& c) - { - if(x1 > x2) { int t = x2; x2 = x1; x1 = t; } - if(y > ymax()) return; - if(y < ymin()) return; - if(x1 > xmax()) return; - if(x2 < xmin()) return; - - if(x1 < xmin()) x1 = xmin(); - if(x2 > xmax()) x2 = xmax(); - - m_ren->copy_hline(x1, y, x2 - x1 + 1, c); - } - - //-------------------------------------------------------------------- - void copy_vline(int x, int y1, int y2, const color_type& c) - { - if(y1 > y2) { int t = y2; y2 = y1; y1 = t; } - if(x > xmax()) return; - if(x < xmin()) return; - if(y1 > ymax()) return; - if(y2 < ymin()) return; - - if(y1 < ymin()) y1 = ymin(); - if(y2 > ymax()) y2 = ymax(); - - m_ren->copy_vline(x, y1, y2 - y1 + 1, c); - } - - //-------------------------------------------------------------------- - void blend_hline(int x1, int y, int x2, - const color_type& c, cover_type cover) - { - if(x1 > x2) { int t = x2; x2 = x1; x1 = t; } - if(y > ymax()) return; - if(y < ymin()) return; - if(x1 > xmax()) return; - if(x2 < xmin()) return; - - if(x1 < xmin()) x1 = xmin(); - if(x2 > xmax()) x2 = xmax(); - - m_ren->blend_hline(x1, y, x2 - x1 + 1, c, cover); - } - - //-------------------------------------------------------------------- - void blend_vline(int x, int y1, int y2, - const color_type& c, cover_type cover) - { - if(y1 > y2) { int t = y2; y2 = y1; y1 = t; } - if(x > xmax()) return; - if(x < xmin()) return; - if(y1 > ymax()) return; - if(y2 < ymin()) return; - - if(y1 < ymin()) y1 = ymin(); - if(y2 > ymax()) y2 = ymax(); - - m_ren->blend_vline(x, y1, y2 - y1 + 1, c, cover); - } - - - //-------------------------------------------------------------------- - void copy_bar(int x1, int y1, int x2, int y2, const color_type& c) - { - rect_i rc(x1, y1, x2, y2); - rc.normalize(); - if(rc.clip(clip_box())) - { - int y; - for(y = rc.y1; y <= rc.y2; y++) - { - m_ren->copy_hline(rc.x1, y, unsigned(rc.x2 - rc.x1 + 1), c); - } - } - } - - //-------------------------------------------------------------------- - void blend_bar(int x1, int y1, int x2, int y2, - const color_type& c, cover_type cover) - { - rect_i rc(x1, y1, x2, y2); - rc.normalize(); - if(rc.clip(clip_box())) - { - int y; - for(y = rc.y1; y <= rc.y2; y++) - { - m_ren->blend_hline(rc.x1, - y, - unsigned(rc.x2 - rc.x1 + 1), - c, - cover); - } - } - } - - //-------------------------------------------------------------------- - void blend_solid_hspan(int x, int y, int len, - const color_type& c, - const cover_type* covers) - { - if(y > ymax()) return; - if(y < ymin()) return; - - if(x < xmin()) - { - len -= xmin() - x; - if(len <= 0) return; - covers += xmin() - x; - x = xmin(); - } - if(x + len > xmax()) - { - len = xmax() - x + 1; - if(len <= 0) return; - } - m_ren->blend_solid_hspan(x, y, len, c, covers); - } - - //-------------------------------------------------------------------- - void blend_solid_vspan(int x, int y, int len, - const color_type& c, - const cover_type* covers) - { - if(x > xmax()) return; - if(x < xmin()) return; - - if(y < ymin()) - { - len -= ymin() - y; - if(len <= 0) return; - covers += ymin() - y; - y = ymin(); - } - if(y + len > ymax()) - { - len = ymax() - y + 1; - if(len <= 0) return; - } - m_ren->blend_solid_vspan(x, y, len, c, covers); - } - - - //-------------------------------------------------------------------- - void copy_color_hspan(int x, int y, int len, const color_type* colors) - { - if(y > ymax()) return; - if(y < ymin()) return; - - if(x < xmin()) - { - int d = xmin() - x; - len -= d; - if(len <= 0) return; - colors += d; - x = xmin(); - } - if(x + len > xmax()) - { - len = xmax() - x + 1; - if(len <= 0) return; - } - m_ren->copy_color_hspan(x, y, len, colors); - } - - - //-------------------------------------------------------------------- - void copy_color_vspan(int x, int y, int len, const color_type* colors) - { - if(x > xmax()) return; - if(x < xmin()) return; - - if(y < ymin()) - { - int d = ymin() - y; - len -= d; - if(len <= 0) return; - colors += d; - y = ymin(); - } - if(y + len > ymax()) - { - len = ymax() - y + 1; - if(len <= 0) return; - } - m_ren->copy_color_vspan(x, y, len, colors); - } - - - //-------------------------------------------------------------------- - void blend_color_hspan(int x, int y, int len, - const color_type* colors, - const cover_type* covers, - cover_type cover = agg::cover_full) - { - if(y > ymax()) return; - if(y < ymin()) return; - - if(x < xmin()) - { - int d = xmin() - x; - len -= d; - if(len <= 0) return; - if(covers) covers += d; - colors += d; - x = xmin(); - } - if(x + len > xmax()) - { - len = xmax() - x + 1; - if(len <= 0) return; - } - m_ren->blend_color_hspan(x, y, len, colors, covers, cover); - } - - //-------------------------------------------------------------------- - void blend_color_vspan(int x, int y, int len, - const color_type* colors, - const cover_type* covers, - cover_type cover = agg::cover_full) - { - if(x > xmax()) return; - if(x < xmin()) return; - - if(y < ymin()) - { - int d = ymin() - y; - len -= d; - if(len <= 0) return; - if(covers) covers += d; - colors += d; - y = ymin(); - } - if(y + len > ymax()) - { - len = ymax() - y + 1; - if(len <= 0) return; - } - m_ren->blend_color_vspan(x, y, len, colors, covers, cover); - } - - //-------------------------------------------------------------------- - rect_i clip_rect_area(rect_i& dst, rect_i& src, int wsrc, int hsrc) const - { - rect_i rc(0,0,0,0); - rect_i cb = clip_box(); - ++cb.x2; - ++cb.y2; - - if(src.x1 < 0) - { - dst.x1 -= src.x1; - src.x1 = 0; - } - if(src.y1 < 0) - { - dst.y1 -= src.y1; - src.y1 = 0; - } - - if(src.x2 > wsrc) src.x2 = wsrc; - if(src.y2 > hsrc) src.y2 = hsrc; - - if(dst.x1 < cb.x1) - { - src.x1 += cb.x1 - dst.x1; - dst.x1 = cb.x1; - } - if(dst.y1 < cb.y1) - { - src.y1 += cb.y1 - dst.y1; - dst.y1 = cb.y1; - } - - if(dst.x2 > cb.x2) dst.x2 = cb.x2; - if(dst.y2 > cb.y2) dst.y2 = cb.y2; - - rc.x2 = dst.x2 - dst.x1; - rc.y2 = dst.y2 - dst.y1; - - if(rc.x2 > src.x2 - src.x1) rc.x2 = src.x2 - src.x1; - if(rc.y2 > src.y2 - src.y1) rc.y2 = src.y2 - src.y1; - return rc; - } - - //-------------------------------------------------------------------- - template - void copy_from(const RenBuf& src, - const rect_i* rect_src_ptr = 0, - int dx = 0, - int dy = 0) - { - rect_i rsrc(0, 0, src.width(), src.height()); - if(rect_src_ptr) - { - rsrc.x1 = rect_src_ptr->x1; - rsrc.y1 = rect_src_ptr->y1; - rsrc.x2 = rect_src_ptr->x2 + 1; - rsrc.y2 = rect_src_ptr->y2 + 1; - } - - // Version with xdst, ydst (absolute positioning) - //rect_i rdst(xdst, ydst, xdst + rsrc.x2 - rsrc.x1, ydst + rsrc.y2 - rsrc.y1); - - // Version with dx, dy (relative positioning) - rect_i rdst(rsrc.x1 + dx, rsrc.y1 + dy, rsrc.x2 + dx, rsrc.y2 + dy); - - rect_i rc = clip_rect_area(rdst, rsrc, src.width(), src.height()); - - if(rc.x2 > 0) - { - int incy = 1; - if(rdst.y1 > rsrc.y1) - { - rsrc.y1 += rc.y2 - 1; - rdst.y1 += rc.y2 - 1; - incy = -1; - } - while(rc.y2 > 0) - { - m_ren->copy_from(src, - rdst.x1, rdst.y1, - rsrc.x1, rsrc.y1, - rc.x2); - rdst.y1 += incy; - rsrc.y1 += incy; - --rc.y2; - } - } - } - - //-------------------------------------------------------------------- - template - void blend_from(const SrcPixelFormatRenderer& src, - const rect_i* rect_src_ptr = 0, - int dx = 0, - int dy = 0, - cover_type cover = agg::cover_full) - { - rect_i rsrc(0, 0, src.width(), src.height()); - if(rect_src_ptr) - { - rsrc.x1 = rect_src_ptr->x1; - rsrc.y1 = rect_src_ptr->y1; - rsrc.x2 = rect_src_ptr->x2 + 1; - rsrc.y2 = rect_src_ptr->y2 + 1; - } - - // Version with xdst, ydst (absolute positioning) - //rect_i rdst(xdst, ydst, xdst + rsrc.x2 - rsrc.x1, ydst + rsrc.y2 - rsrc.y1); - - // Version with dx, dy (relative positioning) - rect_i rdst(rsrc.x1 + dx, rsrc.y1 + dy, rsrc.x2 + dx, rsrc.y2 + dy); - rect_i rc = clip_rect_area(rdst, rsrc, src.width(), src.height()); - - if(rc.x2 > 0) - { - int incy = 1; - if(rdst.y1 > rsrc.y1) - { - rsrc.y1 += rc.y2 - 1; - rdst.y1 += rc.y2 - 1; - incy = -1; - } - while(rc.y2 > 0) - { - typename SrcPixelFormatRenderer::row_data rw = src.row(rsrc.y1); - if(rw.ptr) - { - int x1src = rsrc.x1; - int x1dst = rdst.x1; - int len = rc.x2; - if(rw.x1 > x1src) - { - x1dst += rw.x1 - x1src; - len -= rw.x1 - x1src; - x1src = rw.x1; - } - if(len > 0) - { - if(x1src + len-1 > rw.x2) - { - len -= x1src + len - rw.x2 - 1; - } - if(len > 0) - { - m_ren->blend_from(src, - x1dst, rdst.y1, - x1src, rsrc.y1, - len, - cover); - } - } - } - rdst.y1 += incy; - rsrc.y1 += incy; - --rc.y2; - } - } - } - - //-------------------------------------------------------------------- - template - void blend_from_color(const SrcPixelFormatRenderer& src, - const color_type& color, - const rect_i* rect_src_ptr = 0, - int dx = 0, - int dy = 0, - cover_type cover = agg::cover_full) - { - rect_i rsrc(0, 0, src.width(), src.height()); - if(rect_src_ptr) - { - rsrc.x1 = rect_src_ptr->x1; - rsrc.y1 = rect_src_ptr->y1; - rsrc.x2 = rect_src_ptr->x2 + 1; - rsrc.y2 = rect_src_ptr->y2 + 1; - } - - // Version with xdst, ydst (absolute positioning) - //rect_i rdst(xdst, ydst, xdst + rsrc.x2 - rsrc.x1, ydst + rsrc.y2 - rsrc.y1); - - // Version with dx, dy (relative positioning) - rect_i rdst(rsrc.x1 + dx, rsrc.y1 + dy, rsrc.x2 + dx, rsrc.y2 + dy); - rect_i rc = clip_rect_area(rdst, rsrc, src.width(), src.height()); - - if(rc.x2 > 0) - { - int incy = 1; - if(rdst.y1 > rsrc.y1) - { - rsrc.y1 += rc.y2 - 1; - rdst.y1 += rc.y2 - 1; - incy = -1; - } - while(rc.y2 > 0) - { - typename SrcPixelFormatRenderer::row_data rw = src.row(rsrc.y1); - if(rw.ptr) - { - int x1src = rsrc.x1; - int x1dst = rdst.x1; - int len = rc.x2; - if(rw.x1 > x1src) - { - x1dst += rw.x1 - x1src; - len -= rw.x1 - x1src; - x1src = rw.x1; - } - if(len > 0) - { - if(x1src + len-1 > rw.x2) - { - len -= x1src + len - rw.x2 - 1; - } - if(len > 0) - { - m_ren->blend_from_color(src, - color, - x1dst, rdst.y1, - x1src, rsrc.y1, - len, - cover); - } - } - } - rdst.y1 += incy; - rsrc.y1 += incy; - --rc.y2; - } - } - } - - //-------------------------------------------------------------------- - template - void blend_from_lut(const SrcPixelFormatRenderer& src, - const color_type* color_lut, - const rect_i* rect_src_ptr = 0, - int dx = 0, - int dy = 0, - cover_type cover = agg::cover_full) - { - rect_i rsrc(0, 0, src.width(), src.height()); - if(rect_src_ptr) - { - rsrc.x1 = rect_src_ptr->x1; - rsrc.y1 = rect_src_ptr->y1; - rsrc.x2 = rect_src_ptr->x2 + 1; - rsrc.y2 = rect_src_ptr->y2 + 1; - } - - // Version with xdst, ydst (absolute positioning) - //rect_i rdst(xdst, ydst, xdst + rsrc.x2 - rsrc.x1, ydst + rsrc.y2 - rsrc.y1); - - // Version with dx, dy (relative positioning) - rect_i rdst(rsrc.x1 + dx, rsrc.y1 + dy, rsrc.x2 + dx, rsrc.y2 + dy); - rect_i rc = clip_rect_area(rdst, rsrc, src.width(), src.height()); - - if(rc.x2 > 0) - { - int incy = 1; - if(rdst.y1 > rsrc.y1) - { - rsrc.y1 += rc.y2 - 1; - rdst.y1 += rc.y2 - 1; - incy = -1; - } - while(rc.y2 > 0) - { - typename SrcPixelFormatRenderer::row_data rw = src.row(rsrc.y1); - if(rw.ptr) - { - int x1src = rsrc.x1; - int x1dst = rdst.x1; - int len = rc.x2; - if(rw.x1 > x1src) - { - x1dst += rw.x1 - x1src; - len -= rw.x1 - x1src; - x1src = rw.x1; - } - if(len > 0) - { - if(x1src + len-1 > rw.x2) - { - len -= x1src + len - rw.x2 - 1; - } - if(len > 0) - { - m_ren->blend_from_lut(src, - color_lut, - x1dst, rdst.y1, - x1src, rsrc.y1, - len, - cover); - } - } - } - rdst.y1 += incy; - rsrc.y1 += incy; - --rc.y2; - } - } - } - - private: - pixfmt_type* m_ren; - rect_i m_clip_box; - }; - - -} - -#endif diff --git a/uppdev/aggdraw/agg_renderer_markers.h b/uppdev/aggdraw/agg_renderer_markers.h deleted file mode 100644 index 40d34da4f..000000000 --- a/uppdev/aggdraw/agg_renderer_markers.h +++ /dev/null @@ -1,711 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_RENDERER_MARKERS_INCLUDED -#define AGG_RENDERER_MARKERS_INCLUDED - -#include "agg_basics.h" -#include "agg_renderer_primitives.h" - -namespace agg -{ - - //---------------------------------------------------------------marker_e - enum marker_e - { - marker_square, - marker_diamond, - marker_circle, - marker_crossed_circle, - marker_semiellipse_left, - marker_semiellipse_right, - marker_semiellipse_up, - marker_semiellipse_down, - marker_triangle_left, - marker_triangle_right, - marker_triangle_up, - marker_triangle_down, - marker_four_rays, - marker_cross, - marker_x, - marker_dash, - marker_dot, - marker_pixel, - - end_of_markers - }; - - - - //--------------------------------------------------------renderer_markers - template class renderer_markers : - public renderer_primitives - { - public: - typedef renderer_primitives base_type; - typedef BaseRenderer base_ren_type; - typedef typename base_ren_type::color_type color_type; - - //-------------------------------------------------------------------- - renderer_markers(base_ren_type& rbuf) : - base_type(rbuf) - {} - - //-------------------------------------------------------------------- - bool visible(int x, int y, int r) const - { - rect_i rc(x-r, y-r, x+y, y+r); - return rc.clip(base_type::ren().bounding_clip_box()); - } - - //-------------------------------------------------------------------- - void square(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) base_type::outlined_rectangle(x-r, y-r, x+r, y+r); - else base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - - //-------------------------------------------------------------------- - void diamond(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) - { - int dy = -r; - int dx = 0; - do - { - base_type::ren().blend_pixel(x - dx, y + dy, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x + dx, y + dy, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x - dx, y - dy, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x + dx, y - dy, base_type::line_color(), cover_full); - - if(dx) - { - base_type::ren().blend_hline(x-dx+1, y+dy, x+dx-1, base_type::fill_color(), cover_full); - base_type::ren().blend_hline(x-dx+1, y-dy, x+dx-1, base_type::fill_color(), cover_full); - } - ++dy; - ++dx; - } - while(dy <= 0); - } - else - { - base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - } - - //-------------------------------------------------------------------- - void circle(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) base_type::outlined_ellipse(x, y, r, r); - else base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - - - - //-------------------------------------------------------------------- - void crossed_circle(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) - { - base_type::outlined_ellipse(x, y, r, r); - int r6 = r + (r >> 1); - if(r <= 2) r6++; - r >>= 1; - base_type::ren().blend_hline(x-r6, y, x-r, base_type::line_color(), cover_full); - base_type::ren().blend_hline(x+r, y, x+r6, base_type::line_color(), cover_full); - base_type::ren().blend_vline(x, y-r6, y-r, base_type::line_color(), cover_full); - base_type::ren().blend_vline(x, y+r, y+r6, base_type::line_color(), cover_full); - } - else - { - base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - } - - - //------------------------------------------------------------------------ - void semiellipse_left(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) - { - int r8 = r * 4 / 5; - int dy = -r; - int dx = 0; - ellipse_bresenham_interpolator ei(r * 3 / 5, r+r8); - do - { - dx += ei.dx(); - dy += ei.dy(); - - base_type::ren().blend_pixel(x + dy, y + dx, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x + dy, y - dx, base_type::line_color(), cover_full); - - if(ei.dy() && dx) - { - base_type::ren().blend_vline(x+dy, y-dx+1, y+dx-1, base_type::fill_color(), cover_full); - } - ++ei; - } - while(dy < r8); - base_type::ren().blend_vline(x+dy, y-dx, y+dx, base_type::line_color(), cover_full); - } - else - { - base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - } - - - //-------------------------------------------------------------------- - void semiellipse_right(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) - { - int r8 = r * 4 / 5; - int dy = -r; - int dx = 0; - ellipse_bresenham_interpolator ei(r * 3 / 5, r+r8); - do - { - dx += ei.dx(); - dy += ei.dy(); - - base_type::ren().blend_pixel(x - dy, y + dx, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x - dy, y - dx, base_type::line_color(), cover_full); - - if(ei.dy() && dx) - { - base_type::ren().blend_vline(x-dy, y-dx+1, y+dx-1, base_type::fill_color(), cover_full); - } - ++ei; - } - while(dy < r8); - base_type::ren().blend_vline(x-dy, y-dx, y+dx, base_type::line_color(), cover_full); - } - else - { - base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - } - - - //-------------------------------------------------------------------- - void semiellipse_up(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) - { - int r8 = r * 4 / 5; - int dy = -r; - int dx = 0; - ellipse_bresenham_interpolator ei(r * 3 / 5, r+r8); - do - { - dx += ei.dx(); - dy += ei.dy(); - - base_type::ren().blend_pixel(x + dx, y - dy, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x - dx, y - dy, base_type::line_color(), cover_full); - - if(ei.dy() && dx) - { - base_type::ren().blend_hline(x-dx+1, y-dy, x+dx-1, base_type::fill_color(), cover_full); - } - ++ei; - } - while(dy < r8); - base_type::ren().blend_hline(x-dx, y-dy-1, x+dx, base_type::line_color(), cover_full); - } - else - { - base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - } - - - //-------------------------------------------------------------------- - void semiellipse_down(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) - { - int r8 = r * 4 / 5; - int dy = -r; - int dx = 0; - ellipse_bresenham_interpolator ei(r * 3 / 5, r+r8); - do - { - dx += ei.dx(); - dy += ei.dy(); - - base_type::ren().blend_pixel(x + dx, y + dy, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x - dx, y + dy, base_type::line_color(), cover_full); - - if(ei.dy() && dx) - { - base_type::ren().blend_hline(x-dx+1, y+dy, x+dx-1, base_type::fill_color(), cover_full); - } - ++ei; - } - while(dy < r8); - base_type::ren().blend_hline(x-dx, y+dy+1, x+dx, base_type::line_color(), cover_full); - } - else - { - base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - } - - - //-------------------------------------------------------------------- - void triangle_left(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) - { - int dy = -r; - int dx = 0; - int flip = 0; - int r6 = r * 3 / 5; - do - { - base_type::ren().blend_pixel(x + dy, y - dx, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x + dy, y + dx, base_type::line_color(), cover_full); - - if(dx) - { - base_type::ren().blend_vline(x+dy, y-dx+1, y+dx-1, base_type::fill_color(), cover_full); - } - ++dy; - dx += flip; - flip ^= 1; - } - while(dy < r6); - base_type::ren().blend_vline(x+dy, y-dx, y+dx, base_type::line_color(), cover_full); - } - else - { - base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - } - - - //-------------------------------------------------------------------- - void triangle_right(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) - { - int dy = -r; - int dx = 0; - int flip = 0; - int r6 = r * 3 / 5; - do - { - base_type::ren().blend_pixel(x - dy, y - dx, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x - dy, y + dx, base_type::line_color(), cover_full); - - if(dx) - { - base_type::ren().blend_vline(x-dy, y-dx+1, y+dx-1, base_type::fill_color(), cover_full); - } - ++dy; - dx += flip; - flip ^= 1; - } - while(dy < r6); - base_type::ren().blend_vline(x-dy, y-dx, y+dx, base_type::line_color(), cover_full); - } - else - { - base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - } - - - //-------------------------------------------------------------------- - void triangle_up(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) - { - int dy = -r; - int dx = 0; - int flip = 0; - int r6 = r * 3 / 5; - do - { - base_type::ren().blend_pixel(x - dx, y - dy, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x + dx, y - dy, base_type::line_color(), cover_full); - - if(dx) - { - base_type::ren().blend_hline(x-dx+1, y-dy, x+dx-1, base_type::fill_color(), cover_full); - } - ++dy; - dx += flip; - flip ^= 1; - } - while(dy < r6); - base_type::ren().blend_hline(x-dx, y-dy, x+dx, base_type::line_color(), cover_full); - } - else - { - base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - } - - - //-------------------------------------------------------------------- - void triangle_down(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) - { - int dy = -r; - int dx = 0; - int flip = 0; - int r6 = r * 3 / 5; - do - { - base_type::ren().blend_pixel(x - dx, y + dy, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x + dx, y + dy, base_type::line_color(), cover_full); - - if(dx) - { - base_type::ren().blend_hline(x-dx+1, y+dy, x+dx-1, base_type::fill_color(), cover_full); - } - ++dy; - dx += flip; - flip ^= 1; - } - while(dy < r6); - base_type::ren().blend_hline(x-dx, y+dy, x+dx, base_type::line_color(), cover_full); - } - else - { - base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - } - - - //-------------------------------------------------------------------- - void four_rays(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) - { - int dy = -r; - int dx = 0; - int flip = 0; - int r3 = -(r / 3); - do - { - base_type::ren().blend_pixel(x - dx, y + dy, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x + dx, y + dy, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x - dx, y - dy, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x + dx, y - dy, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x + dy, y - dx, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x + dy, y + dx, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x - dy, y - dx, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x - dy, y + dx, base_type::line_color(), cover_full); - - if(dx) - { - base_type::ren().blend_hline(x-dx+1, y+dy, x+dx-1, base_type::fill_color(), cover_full); - base_type::ren().blend_hline(x-dx+1, y-dy, x+dx-1, base_type::fill_color(), cover_full); - base_type::ren().blend_vline(x+dy, y-dx+1, y+dx-1, base_type::fill_color(), cover_full); - base_type::ren().blend_vline(x-dy, y-dx+1, y+dx-1, base_type::fill_color(), cover_full); - } - ++dy; - dx += flip; - flip ^= 1; - } - while(dy <= r3); - base_type::solid_rectangle(x+r3+1, y+r3+1, x-r3-1, y-r3-1); - } - else - { - base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - } - - - //-------------------------------------------------------------------- - void cross(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) - { - base_type::ren().blend_vline(x, y-r, y+r, base_type::line_color(), cover_full); - base_type::ren().blend_hline(x-r, y, x+r, base_type::line_color(), cover_full); - } - else - { - base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - } - - - //-------------------------------------------------------------------- - void xing(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) - { - int dy = -r * 7 / 10; - do - { - base_type::ren().blend_pixel(x + dy, y + dy, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x - dy, y + dy, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x + dy, y - dy, base_type::line_color(), cover_full); - base_type::ren().blend_pixel(x - dy, y - dy, base_type::line_color(), cover_full); - ++dy; - } - while(dy < 0); - } - base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - - - //-------------------------------------------------------------------- - void dash(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) base_type::ren().blend_hline(x-r, y, x+r, base_type::line_color(), cover_full); - else base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - - - //-------------------------------------------------------------------- - void dot(int x, int y, int r) - { - if(visible(x, y, r)) - { - if(r) base_type::solid_ellipse(x, y, r, r); - else base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - } - - //-------------------------------------------------------------------- - void pixel(int x, int y, int) - { - base_type::ren().blend_pixel(x, y, base_type::fill_color(), cover_full); - } - - //-------------------------------------------------------------------- - void marker(int x, int y, int r, marker_e type) - { - switch(type) - { - case marker_square: square(x, y, r); break; - case marker_diamond: diamond(x, y, r); break; - case marker_circle: circle(x, y, r); break; - case marker_crossed_circle: crossed_circle(x, y, r); break; - case marker_semiellipse_left: semiellipse_left(x, y, r); break; - case marker_semiellipse_right: semiellipse_right(x, y, r); break; - case marker_semiellipse_up: semiellipse_up(x, y, r); break; - case marker_semiellipse_down: semiellipse_down(x, y, r); break; - case marker_triangle_left: triangle_left(x, y, r); break; - case marker_triangle_right: triangle_right(x, y, r); break; - case marker_triangle_up: triangle_up(x, y, r); break; - case marker_triangle_down: triangle_down(x, y, r); break; - case marker_four_rays: four_rays(x, y, r); break; - case marker_cross: cross(x, y, r); break; - case marker_x: xing(x, y, r); break; - case marker_dash: dash(x, y, r); break; - case marker_dot: dot(x, y, r); break; - case marker_pixel: pixel(x, y, r); break; - } - } - - - //-------------------------------------------------------------------- - template - void markers(int n, const T* x, const T* y, T r, marker_e type) - { - if(n <= 0) return; - if(r == 0) - { - do - { - base_type::ren().blend_pixel(int(*x), int(*y), base_type::fill_color(), cover_full); - ++x; - ++y; - } - while(--n); - return; - } - - switch(type) - { - case marker_square: do { square (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_diamond: do { diamond (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_circle: do { circle (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_crossed_circle: do { crossed_circle (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_semiellipse_left: do { semiellipse_left (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_semiellipse_right: do { semiellipse_right(int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_semiellipse_up: do { semiellipse_up (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_semiellipse_down: do { semiellipse_down (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_triangle_left: do { triangle_left (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_triangle_right: do { triangle_right (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_triangle_up: do { triangle_up (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_triangle_down: do { triangle_down (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_four_rays: do { four_rays (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_cross: do { cross (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_x: do { xing (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_dash: do { dash (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_dot: do { dot (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - case marker_pixel: do { pixel (int(*x), int(*y), int(r)); ++x; ++y; } while(--n); break; - } - } - - //-------------------------------------------------------------------- - template - void markers(int n, const T* x, const T* y, const T* r, marker_e type) - { - if(n <= 0) return; - switch(type) - { - case marker_square: do { square (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_diamond: do { diamond (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_circle: do { circle (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_crossed_circle: do { crossed_circle (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_semiellipse_left: do { semiellipse_left (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_semiellipse_right: do { semiellipse_right(int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_semiellipse_up: do { semiellipse_up (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_semiellipse_down: do { semiellipse_down (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_triangle_left: do { triangle_left (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_triangle_right: do { triangle_right (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_triangle_up: do { triangle_up (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_triangle_down: do { triangle_down (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_four_rays: do { four_rays (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_cross: do { cross (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_x: do { xing (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_dash: do { dash (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_dot: do { dot (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - case marker_pixel: do { pixel (int(*x), int(*y), int(*r)); ++x; ++y; ++r; } while(--n); break; - } - } - - //-------------------------------------------------------------------- - template - void markers(int n, const T* x, const T* y, const T* r, const color_type* fc, marker_e type) - { - if(n <= 0) return; - switch(type) - { - case marker_square: do { base_type::fill_color(*fc); square (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_diamond: do { base_type::fill_color(*fc); diamond (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_circle: do { base_type::fill_color(*fc); circle (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_crossed_circle: do { base_type::fill_color(*fc); crossed_circle (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_semiellipse_left: do { base_type::fill_color(*fc); semiellipse_left (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_semiellipse_right: do { base_type::fill_color(*fc); semiellipse_right(int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_semiellipse_up: do { base_type::fill_color(*fc); semiellipse_up (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_semiellipse_down: do { base_type::fill_color(*fc); semiellipse_down (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_triangle_left: do { base_type::fill_color(*fc); triangle_left (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_triangle_right: do { base_type::fill_color(*fc); triangle_right (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_triangle_up: do { base_type::fill_color(*fc); triangle_up (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_triangle_down: do { base_type::fill_color(*fc); triangle_down (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_four_rays: do { base_type::fill_color(*fc); four_rays (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_cross: do { base_type::fill_color(*fc); cross (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_x: do { base_type::fill_color(*fc); xing (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_dash: do { base_type::fill_color(*fc); dash (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_dot: do { base_type::fill_color(*fc); dot (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - case marker_pixel: do { base_type::fill_color(*fc); pixel (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; } while(--n); break; - } - } - - //-------------------------------------------------------------------- - template - void markers(int n, const T* x, const T* y, const T* r, const color_type* fc, const color_type* lc, marker_e type) - { - if(n <= 0) return; - switch(type) - { - case marker_square: do { base_type::fill_color(*fc); base_type::line_color(*lc); square (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_diamond: do { base_type::fill_color(*fc); base_type::line_color(*lc); diamond (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_circle: do { base_type::fill_color(*fc); base_type::line_color(*lc); circle (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_crossed_circle: do { base_type::fill_color(*fc); base_type::line_color(*lc); crossed_circle (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_semiellipse_left: do { base_type::fill_color(*fc); base_type::line_color(*lc); semiellipse_left (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_semiellipse_right: do { base_type::fill_color(*fc); base_type::line_color(*lc); semiellipse_right(int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_semiellipse_up: do { base_type::fill_color(*fc); base_type::line_color(*lc); semiellipse_up (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_semiellipse_down: do { base_type::fill_color(*fc); base_type::line_color(*lc); semiellipse_down (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_triangle_left: do { base_type::fill_color(*fc); base_type::line_color(*lc); triangle_left (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_triangle_right: do { base_type::fill_color(*fc); base_type::line_color(*lc); triangle_right (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_triangle_up: do { base_type::fill_color(*fc); base_type::line_color(*lc); triangle_up (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_triangle_down: do { base_type::fill_color(*fc); base_type::line_color(*lc); triangle_down (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_four_rays: do { base_type::fill_color(*fc); base_type::line_color(*lc); four_rays (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_cross: do { base_type::fill_color(*fc); base_type::line_color(*lc); cross (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_x: do { base_type::fill_color(*fc); base_type::line_color(*lc); xing (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_dash: do { base_type::fill_color(*fc); base_type::line_color(*lc); dash (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_dot: do { base_type::fill_color(*fc); base_type::line_color(*lc); dot (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - case marker_pixel: do { base_type::fill_color(*fc); base_type::line_color(*lc); pixel (int(*x), int(*y), int(*r)); ++x; ++y; ++r; ++fc; ++lc; } while(--n); break; - } - } - }; - -} - -#endif diff --git a/uppdev/aggdraw/agg_renderer_mclip.h b/uppdev/aggdraw/agg_renderer_mclip.h deleted file mode 100644 index 977725012..000000000 --- a/uppdev/aggdraw/agg_renderer_mclip.h +++ /dev/null @@ -1,354 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_RENDERER_MCLIP_INCLUDED -#define AGG_RENDERER_MCLIP_INCLUDED - -#include "agg_basics.h" -#include "agg_array.h" -#include "agg_renderer_base.h" - -namespace agg -{ - - //----------------------------------------------------------renderer_mclip - template class renderer_mclip - { - public: - typedef PixelFormat pixfmt_type; - typedef typename pixfmt_type::color_type color_type; - typedef typename pixfmt_type::row_data row_data; - typedef renderer_base base_ren_type; - - //-------------------------------------------------------------------- - explicit renderer_mclip(pixfmt_type& pixf) : - m_ren(pixf), - m_curr_cb(0), - m_bounds(m_ren.xmin(), m_ren.ymin(), m_ren.xmax(), m_ren.ymax()) - {} - void attach(pixfmt_type& pixf) - { - m_ren.attach(pixf); - reset_clipping(true); - } - - //-------------------------------------------------------------------- - const pixfmt_type& ren() const { return m_ren.ren(); } - pixfmt_type& ren() { return m_ren.ren(); } - - //-------------------------------------------------------------------- - unsigned width() const { return m_ren.width(); } - unsigned height() const { return m_ren.height(); } - - //-------------------------------------------------------------------- - const rect_i& clip_box() const { return m_ren.clip_box(); } - int xmin() const { return m_ren.xmin(); } - int ymin() const { return m_ren.ymin(); } - int xmax() const { return m_ren.xmax(); } - int ymax() const { return m_ren.ymax(); } - - //-------------------------------------------------------------------- - const rect_i& bounding_clip_box() const { return m_bounds; } - int bounding_xmin() const { return m_bounds.x1; } - int bounding_ymin() const { return m_bounds.y1; } - int bounding_xmax() const { return m_bounds.x2; } - int bounding_ymax() const { return m_bounds.y2; } - - //-------------------------------------------------------------------- - void first_clip_box() - { - m_curr_cb = 0; - if(m_clip.size()) - { - const rect_i& cb = m_clip[0]; - m_ren.clip_box_naked(cb.x1, cb.y1, cb.x2, cb.y2); - } - } - - //-------------------------------------------------------------------- - bool next_clip_box() - { - if(++m_curr_cb < m_clip.size()) - { - const rect_i& cb = m_clip[m_curr_cb]; - m_ren.clip_box_naked(cb.x1, cb.y1, cb.x2, cb.y2); - return true; - } - return false; - } - - //-------------------------------------------------------------------- - void reset_clipping(bool visibility) - { - m_ren.reset_clipping(visibility); - m_clip.remove_all(); - m_curr_cb = 0; - m_bounds = m_ren.clip_box(); - } - - //-------------------------------------------------------------------- - void add_clip_box(int x1, int y1, int x2, int y2) - { - rect_i cb(x1, y1, x2, y2); - cb.normalize(); - if(cb.clip(rect_i(0, 0, width() - 1, height() - 1))) - { - m_clip.add(cb); - if(cb.x1 < m_bounds.x1) m_bounds.x1 = cb.x1; - if(cb.y1 < m_bounds.y1) m_bounds.y1 = cb.y1; - if(cb.x2 > m_bounds.x2) m_bounds.x2 = cb.x2; - if(cb.y2 > m_bounds.y2) m_bounds.y2 = cb.y2; - } - } - - //-------------------------------------------------------------------- - void clear(const color_type& c) - { - m_ren.clear(c); - } - - //-------------------------------------------------------------------- - void copy_pixel(int x, int y, const color_type& c) - { - first_clip_box(); - do - { - if(m_ren.inbox(x, y)) - { - m_ren.ren().copy_pixel(x, y, c); - break; - } - } - while(next_clip_box()); - } - - //-------------------------------------------------------------------- - void blend_pixel(int x, int y, const color_type& c, cover_type cover) - { - first_clip_box(); - do - { - if(m_ren.inbox(x, y)) - { - m_ren.ren().blend_pixel(x, y, c, cover); - break; - } - } - while(next_clip_box()); - } - - //-------------------------------------------------------------------- - color_type pixel(int x, int y) const - { - first_clip_box(); - do - { - if(m_ren.inbox(x, y)) - { - return m_ren.ren().pixel(x, y); - } - } - while(next_clip_box()); - return color_type::no_color(); - } - - //-------------------------------------------------------------------- - void copy_hline(int x1, int y, int x2, const color_type& c) - { - first_clip_box(); - do - { - m_ren.copy_hline(x1, y, x2, c); - } - while(next_clip_box()); - } - - //-------------------------------------------------------------------- - void copy_vline(int x, int y1, int y2, const color_type& c) - { - first_clip_box(); - do - { - m_ren.copy_vline(x, y1, y2, c); - } - while(next_clip_box()); - } - - //-------------------------------------------------------------------- - void blend_hline(int x1, int y, int x2, - const color_type& c, cover_type cover) - { - first_clip_box(); - do - { - m_ren.blend_hline(x1, y, x2, c, cover); - } - while(next_clip_box()); - } - - //-------------------------------------------------------------------- - void blend_vline(int x, int y1, int y2, - const color_type& c, cover_type cover) - { - first_clip_box(); - do - { - m_ren.blend_vline(x, y1, y2, c, cover); - } - while(next_clip_box()); - } - - //-------------------------------------------------------------------- - void copy_bar(int x1, int y1, int x2, int y2, const color_type& c) - { - first_clip_box(); - do - { - m_ren.copy_bar(x1, y1, x2, y2, c); - } - while(next_clip_box()); - } - - //-------------------------------------------------------------------- - void blend_bar(int x1, int y1, int x2, int y2, - const color_type& c, cover_type cover) - { - first_clip_box(); - do - { - m_ren.blend_bar(x1, y1, x2, y2, c, cover); - } - while(next_clip_box()); - } - - //-------------------------------------------------------------------- - void blend_solid_hspan(int x, int y, int len, - const color_type& c, const cover_type* covers) - { - first_clip_box(); - do - { - m_ren.blend_solid_hspan(x, y, len, c, covers); - } - while(next_clip_box()); - } - - //-------------------------------------------------------------------- - void blend_solid_vspan(int x, int y, int len, - const color_type& c, const cover_type* covers) - { - first_clip_box(); - do - { - m_ren.blend_solid_vspan(x, y, len, c, covers); - } - while(next_clip_box()); - } - - - //-------------------------------------------------------------------- - void copy_color_hspan(int x, int y, int len, const color_type* colors) - { - first_clip_box(); - do - { - m_ren.copy_color_hspan(x, y, len, colors); - } - while(next_clip_box()); - } - - //-------------------------------------------------------------------- - void blend_color_hspan(int x, int y, int len, - const color_type* colors, - const cover_type* covers, - cover_type cover = cover_full) - { - first_clip_box(); - do - { - m_ren.blend_color_hspan(x, y, len, colors, covers, cover); - } - while(next_clip_box()); - } - - //-------------------------------------------------------------------- - void blend_color_vspan(int x, int y, int len, - const color_type* colors, - const cover_type* covers, - cover_type cover = cover_full) - { - first_clip_box(); - do - { - m_ren.blend_color_vspan(x, y, len, colors, covers, cover); - } - while(next_clip_box()); - } - - //-------------------------------------------------------------------- - void copy_from(const rendering_buffer& from, - const rect_i* rc=0, - int x_to=0, - int y_to=0) - { - first_clip_box(); - do - { - m_ren.copy_from(from, rc, x_to, y_to); - } - while(next_clip_box()); - } - - //-------------------------------------------------------------------- - template - void blend_from(const SrcPixelFormatRenderer& src, - const rect_i* rect_src_ptr = 0, - int dx = 0, - int dy = 0, - cover_type cover = cover_full) - { - first_clip_box(); - do - { - m_ren.blend_from(src, rect_src_ptr, dx, dy, cover); - } - while(next_clip_box()); - } - - - private: - renderer_mclip(const renderer_mclip&); - const renderer_mclip& - operator = (const renderer_mclip&); - - base_ren_type m_ren; - pod_bvector m_clip; - unsigned m_curr_cb; - rect_i m_bounds; - }; - - -} - -#endif diff --git a/uppdev/aggdraw/agg_renderer_outline_aa.h b/uppdev/aggdraw/agg_renderer_outline_aa.h deleted file mode 100644 index 70b4c9b7e..000000000 --- a/uppdev/aggdraw/agg_renderer_outline_aa.h +++ /dev/null @@ -1,1847 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_RENDERER_OUTLINE_AA_INCLUDED -#define AGG_RENDERER_OUTLINE_AA_INCLUDED - -#include "agg_array.h" -#include "agg_math.h" -#include "agg_line_aa_basics.h" -#include "agg_dda_line.h" -#include "agg_ellipse_bresenham.h" -#include "agg_renderer_base.h" -#include "agg_gamma_functions.h" -#include "agg_clip_liang_barsky.h" - -namespace agg -{ - - //===================================================distance_interpolator0 - class distance_interpolator0 - { - public: - //--------------------------------------------------------------------- - distance_interpolator0() {} - distance_interpolator0(int x1, int y1, int x2, int y2, int x, int y) : - m_dx(line_mr(x2) - line_mr(x1)), - m_dy(line_mr(y2) - line_mr(y1)), - m_dist((line_mr(x + line_subpixel_scale/2) - line_mr(x2)) * m_dy - - (line_mr(y + line_subpixel_scale/2) - line_mr(y2)) * m_dx) - { - m_dx <<= line_mr_subpixel_shift; - m_dy <<= line_mr_subpixel_shift; - } - - //--------------------------------------------------------------------- - void inc_x() { m_dist += m_dy; } - int dist() const { return m_dist; } - - private: - //--------------------------------------------------------------------- - int m_dx; - int m_dy; - int m_dist; - }; - - //==================================================distance_interpolator00 - class distance_interpolator00 - { - public: - //--------------------------------------------------------------------- - distance_interpolator00() {} - distance_interpolator00(int xc, int yc, - int x1, int y1, int x2, int y2, - int x, int y) : - m_dx1(line_mr(x1) - line_mr(xc)), - m_dy1(line_mr(y1) - line_mr(yc)), - m_dx2(line_mr(x2) - line_mr(xc)), - m_dy2(line_mr(y2) - line_mr(yc)), - m_dist1((line_mr(x + line_subpixel_scale/2) - line_mr(x1)) * m_dy1 - - (line_mr(y + line_subpixel_scale/2) - line_mr(y1)) * m_dx1), - m_dist2((line_mr(x + line_subpixel_scale/2) - line_mr(x2)) * m_dy2 - - (line_mr(y + line_subpixel_scale/2) - line_mr(y2)) * m_dx2) - { - m_dx1 <<= line_mr_subpixel_shift; - m_dy1 <<= line_mr_subpixel_shift; - m_dx2 <<= line_mr_subpixel_shift; - m_dy2 <<= line_mr_subpixel_shift; - } - - //--------------------------------------------------------------------- - void inc_x() { m_dist1 += m_dy1; m_dist2 += m_dy2; } - int dist1() const { return m_dist1; } - int dist2() const { return m_dist2; } - - private: - //--------------------------------------------------------------------- - int m_dx1; - int m_dy1; - int m_dx2; - int m_dy2; - int m_dist1; - int m_dist2; - }; - - //===================================================distance_interpolator1 - class distance_interpolator1 - { - public: - //--------------------------------------------------------------------- - distance_interpolator1() {} - distance_interpolator1(int x1, int y1, int x2, int y2, int x, int y) : - m_dx(x2 - x1), - m_dy(y2 - y1), - m_dist(iround(double(x + line_subpixel_scale/2 - x2) * double(m_dy) - - double(y + line_subpixel_scale/2 - y2) * double(m_dx))) - { - m_dx <<= line_subpixel_shift; - m_dy <<= line_subpixel_shift; - } - - //--------------------------------------------------------------------- - void inc_x() { m_dist += m_dy; } - void dec_x() { m_dist -= m_dy; } - void inc_y() { m_dist -= m_dx; } - void dec_y() { m_dist += m_dx; } - - //--------------------------------------------------------------------- - void inc_x(int dy) - { - m_dist += m_dy; - if(dy > 0) m_dist -= m_dx; - if(dy < 0) m_dist += m_dx; - } - - //--------------------------------------------------------------------- - void dec_x(int dy) - { - m_dist -= m_dy; - if(dy > 0) m_dist -= m_dx; - if(dy < 0) m_dist += m_dx; - } - - //--------------------------------------------------------------------- - void inc_y(int dx) - { - m_dist -= m_dx; - if(dx > 0) m_dist += m_dy; - if(dx < 0) m_dist -= m_dy; - } - - void dec_y(int dx) - //--------------------------------------------------------------------- - { - m_dist += m_dx; - if(dx > 0) m_dist += m_dy; - if(dx < 0) m_dist -= m_dy; - } - - //--------------------------------------------------------------------- - int dist() const { return m_dist; } - int dx() const { return m_dx; } - int dy() const { return m_dy; } - - private: - //--------------------------------------------------------------------- - int m_dx; - int m_dy; - int m_dist; - }; - - - - - - //===================================================distance_interpolator2 - class distance_interpolator2 - { - public: - //--------------------------------------------------------------------- - distance_interpolator2() {} - distance_interpolator2(int x1, int y1, int x2, int y2, - int sx, int sy, int x, int y) : - m_dx(x2 - x1), - m_dy(y2 - y1), - m_dx_start(line_mr(sx) - line_mr(x1)), - m_dy_start(line_mr(sy) - line_mr(y1)), - - m_dist(iround(double(x + line_subpixel_scale/2 - x2) * double(m_dy) - - double(y + line_subpixel_scale/2 - y2) * double(m_dx))), - - m_dist_start((line_mr(x + line_subpixel_scale/2) - line_mr(sx)) * m_dy_start - - (line_mr(y + line_subpixel_scale/2) - line_mr(sy)) * m_dx_start) - { - m_dx <<= line_subpixel_shift; - m_dy <<= line_subpixel_shift; - m_dx_start <<= line_mr_subpixel_shift; - m_dy_start <<= line_mr_subpixel_shift; - } - - distance_interpolator2(int x1, int y1, int x2, int y2, - int ex, int ey, int x, int y, int) : - m_dx(x2 - x1), - m_dy(y2 - y1), - m_dx_start(line_mr(ex) - line_mr(x2)), - m_dy_start(line_mr(ey) - line_mr(y2)), - - m_dist(iround(double(x + line_subpixel_scale/2 - x2) * double(m_dy) - - double(y + line_subpixel_scale/2 - y2) * double(m_dx))), - - m_dist_start((line_mr(x + line_subpixel_scale/2) - line_mr(ex)) * m_dy_start - - (line_mr(y + line_subpixel_scale/2) - line_mr(ey)) * m_dx_start) - { - m_dx <<= line_subpixel_shift; - m_dy <<= line_subpixel_shift; - m_dx_start <<= line_mr_subpixel_shift; - m_dy_start <<= line_mr_subpixel_shift; - } - - - //--------------------------------------------------------------------- - void inc_x() { m_dist += m_dy; m_dist_start += m_dy_start; } - void dec_x() { m_dist -= m_dy; m_dist_start -= m_dy_start; } - void inc_y() { m_dist -= m_dx; m_dist_start -= m_dx_start; } - void dec_y() { m_dist += m_dx; m_dist_start += m_dx_start; } - - //--------------------------------------------------------------------- - void inc_x(int dy) - { - m_dist += m_dy; - m_dist_start += m_dy_start; - if(dy > 0) - { - m_dist -= m_dx; - m_dist_start -= m_dx_start; - } - if(dy < 0) - { - m_dist += m_dx; - m_dist_start += m_dx_start; - } - } - - //--------------------------------------------------------------------- - void dec_x(int dy) - { - m_dist -= m_dy; - m_dist_start -= m_dy_start; - if(dy > 0) - { - m_dist -= m_dx; - m_dist_start -= m_dx_start; - } - if(dy < 0) - { - m_dist += m_dx; - m_dist_start += m_dx_start; - } - } - - //--------------------------------------------------------------------- - void inc_y(int dx) - { - m_dist -= m_dx; - m_dist_start -= m_dx_start; - if(dx > 0) - { - m_dist += m_dy; - m_dist_start += m_dy_start; - } - if(dx < 0) - { - m_dist -= m_dy; - m_dist_start -= m_dy_start; - } - } - - //--------------------------------------------------------------------- - void dec_y(int dx) - { - m_dist += m_dx; - m_dist_start += m_dx_start; - if(dx > 0) - { - m_dist += m_dy; - m_dist_start += m_dy_start; - } - if(dx < 0) - { - m_dist -= m_dy; - m_dist_start -= m_dy_start; - } - } - - //--------------------------------------------------------------------- - int dist() const { return m_dist; } - int dist_start() const { return m_dist_start; } - int dist_end() const { return m_dist_start; } - - //--------------------------------------------------------------------- - int dx() const { return m_dx; } - int dy() const { return m_dy; } - int dx_start() const { return m_dx_start; } - int dy_start() const { return m_dy_start; } - int dx_end() const { return m_dx_start; } - int dy_end() const { return m_dy_start; } - - private: - //--------------------------------------------------------------------- - int m_dx; - int m_dy; - int m_dx_start; - int m_dy_start; - - int m_dist; - int m_dist_start; - }; - - - - - - //===================================================distance_interpolator3 - class distance_interpolator3 - { - public: - //--------------------------------------------------------------------- - distance_interpolator3() {} - distance_interpolator3(int x1, int y1, int x2, int y2, - int sx, int sy, int ex, int ey, - int x, int y) : - m_dx(x2 - x1), - m_dy(y2 - y1), - m_dx_start(line_mr(sx) - line_mr(x1)), - m_dy_start(line_mr(sy) - line_mr(y1)), - m_dx_end(line_mr(ex) - line_mr(x2)), - m_dy_end(line_mr(ey) - line_mr(y2)), - - m_dist(iround(double(x + line_subpixel_scale/2 - x2) * double(m_dy) - - double(y + line_subpixel_scale/2 - y2) * double(m_dx))), - - m_dist_start((line_mr(x + line_subpixel_scale/2) - line_mr(sx)) * m_dy_start - - (line_mr(y + line_subpixel_scale/2) - line_mr(sy)) * m_dx_start), - - m_dist_end((line_mr(x + line_subpixel_scale/2) - line_mr(ex)) * m_dy_end - - (line_mr(y + line_subpixel_scale/2) - line_mr(ey)) * m_dx_end) - { - m_dx <<= line_subpixel_shift; - m_dy <<= line_subpixel_shift; - m_dx_start <<= line_mr_subpixel_shift; - m_dy_start <<= line_mr_subpixel_shift; - m_dx_end <<= line_mr_subpixel_shift; - m_dy_end <<= line_mr_subpixel_shift; - } - - //--------------------------------------------------------------------- - void inc_x() { m_dist += m_dy; m_dist_start += m_dy_start; m_dist_end += m_dy_end; } - void dec_x() { m_dist -= m_dy; m_dist_start -= m_dy_start; m_dist_end -= m_dy_end; } - void inc_y() { m_dist -= m_dx; m_dist_start -= m_dx_start; m_dist_end -= m_dx_end; } - void dec_y() { m_dist += m_dx; m_dist_start += m_dx_start; m_dist_end += m_dx_end; } - - //--------------------------------------------------------------------- - void inc_x(int dy) - { - m_dist += m_dy; - m_dist_start += m_dy_start; - m_dist_end += m_dy_end; - if(dy > 0) - { - m_dist -= m_dx; - m_dist_start -= m_dx_start; - m_dist_end -= m_dx_end; - } - if(dy < 0) - { - m_dist += m_dx; - m_dist_start += m_dx_start; - m_dist_end += m_dx_end; - } - } - - //--------------------------------------------------------------------- - void dec_x(int dy) - { - m_dist -= m_dy; - m_dist_start -= m_dy_start; - m_dist_end -= m_dy_end; - if(dy > 0) - { - m_dist -= m_dx; - m_dist_start -= m_dx_start; - m_dist_end -= m_dx_end; - } - if(dy < 0) - { - m_dist += m_dx; - m_dist_start += m_dx_start; - m_dist_end += m_dx_end; - } - } - - //--------------------------------------------------------------------- - void inc_y(int dx) - { - m_dist -= m_dx; - m_dist_start -= m_dx_start; - m_dist_end -= m_dx_end; - if(dx > 0) - { - m_dist += m_dy; - m_dist_start += m_dy_start; - m_dist_end += m_dy_end; - } - if(dx < 0) - { - m_dist -= m_dy; - m_dist_start -= m_dy_start; - m_dist_end -= m_dy_end; - } - } - - //--------------------------------------------------------------------- - void dec_y(int dx) - { - m_dist += m_dx; - m_dist_start += m_dx_start; - m_dist_end += m_dx_end; - if(dx > 0) - { - m_dist += m_dy; - m_dist_start += m_dy_start; - m_dist_end += m_dy_end; - } - if(dx < 0) - { - m_dist -= m_dy; - m_dist_start -= m_dy_start; - m_dist_end -= m_dy_end; - } - } - - //--------------------------------------------------------------------- - int dist() const { return m_dist; } - int dist_start() const { return m_dist_start; } - int dist_end() const { return m_dist_end; } - - //--------------------------------------------------------------------- - int dx() const { return m_dx; } - int dy() const { return m_dy; } - int dx_start() const { return m_dx_start; } - int dy_start() const { return m_dy_start; } - int dx_end() const { return m_dx_end; } - int dy_end() const { return m_dy_end; } - - private: - //--------------------------------------------------------------------- - int m_dx; - int m_dy; - int m_dx_start; - int m_dy_start; - int m_dx_end; - int m_dy_end; - - int m_dist; - int m_dist_start; - int m_dist_end; - }; - - - - - - //================================================line_interpolator_aa_base - template class line_interpolator_aa_base - { - public: - typedef Renderer renderer_type; - typedef typename Renderer::color_type color_type; - - //--------------------------------------------------------------------- - enum max_half_width_e - { - max_half_width = 64 - }; - - //--------------------------------------------------------------------- - line_interpolator_aa_base(renderer_type& ren, const line_parameters& lp) : - m_lp(&lp), - m_li(lp.vertical ? line_dbl_hr(lp.x2 - lp.x1) : - line_dbl_hr(lp.y2 - lp.y1), - lp.vertical ? abs(lp.y2 - lp.y1) : - abs(lp.x2 - lp.x1) + 1), - m_ren(ren), - m_len((lp.vertical == (lp.inc > 0)) ? -lp.len : lp.len), - m_x(lp.x1 >> line_subpixel_shift), - m_y(lp.y1 >> line_subpixel_shift), - m_old_x(m_x), - m_old_y(m_y), - m_count((lp.vertical ? abs((lp.y2 >> line_subpixel_shift) - m_y) : - abs((lp.x2 >> line_subpixel_shift) - m_x))), - m_width(ren.subpixel_width()), - //m_max_extent(m_width >> (line_subpixel_shift - 2)), - m_max_extent((m_width + line_subpixel_mask) >> line_subpixel_shift), - m_step(0) - { - agg::dda2_line_interpolator li(0, lp.vertical ? - (lp.dy << agg::line_subpixel_shift) : - (lp.dx << agg::line_subpixel_shift), - lp.len); - - unsigned i; - int stop = m_width + line_subpixel_scale * 2; - for(i = 0; i < max_half_width; ++i) - { - m_dist[i] = li.y(); - if(m_dist[i] >= stop) break; - ++li; - } - m_dist[i++] = 0x7FFF0000; - } - - //--------------------------------------------------------------------- - template int step_hor_base(DI& di) - { - ++m_li; - m_x += m_lp->inc; - m_y = (m_lp->y1 + m_li.y()) >> line_subpixel_shift; - - if(m_lp->inc > 0) di.inc_x(m_y - m_old_y); - else di.dec_x(m_y - m_old_y); - - m_old_y = m_y; - - return di.dist() / m_len; - } - - //--------------------------------------------------------------------- - template int step_ver_base(DI& di) - { - ++m_li; - m_y += m_lp->inc; - m_x = (m_lp->x1 + m_li.y()) >> line_subpixel_shift; - - if(m_lp->inc > 0) di.inc_y(m_x - m_old_x); - else di.dec_y(m_x - m_old_x); - - m_old_x = m_x; - - return di.dist() / m_len; - } - - //--------------------------------------------------------------------- - bool vertical() const { return m_lp->vertical; } - int width() const { return m_width; } - int count() const { return m_count; } - - private: - line_interpolator_aa_base(const line_interpolator_aa_base&); - const line_interpolator_aa_base& - operator = (const line_interpolator_aa_base&); - - protected: - const line_parameters* m_lp; - dda2_line_interpolator m_li; - renderer_type& m_ren; - int m_len; - int m_x; - int m_y; - int m_old_x; - int m_old_y; - int m_count; - int m_width; - int m_max_extent; - int m_step; - int m_dist[max_half_width + 1]; - cover_type m_covers[max_half_width * 2 + 4]; - }; - - - - - - - - //====================================================line_interpolator_aa0 - template class line_interpolator_aa0 : - public line_interpolator_aa_base - { - public: - typedef Renderer renderer_type; - typedef typename Renderer::color_type color_type; - typedef line_interpolator_aa_base base_type; - - //--------------------------------------------------------------------- - line_interpolator_aa0(renderer_type& ren, const line_parameters& lp) : - line_interpolator_aa_base(ren, lp), - m_di(lp.x1, lp.y1, lp.x2, lp.y2, - lp.x1 & ~line_subpixel_mask, lp.y1 & ~line_subpixel_mask) - { - base_type::m_li.adjust_forward(); - } - - //--------------------------------------------------------------------- - bool step_hor() - { - int dist; - int dy; - int s1 = base_type::step_hor_base(m_di); - cover_type* p0 = base_type::m_covers + base_type::max_half_width + 2; - cover_type* p1 = p0; - - *p1++ = (cover_type)base_type::m_ren.cover(s1); - - dy = 1; - while((dist = base_type::m_dist[dy] - s1) <= base_type::m_width) - { - *p1++ = (cover_type)base_type::m_ren.cover(dist); - ++dy; - } - - dy = 1; - while((dist = base_type::m_dist[dy] + s1) <= base_type::m_width) - { - *--p0 = (cover_type)base_type::m_ren.cover(dist); - ++dy; - } - base_type::m_ren.blend_solid_vspan(base_type::m_x, - base_type::m_y - dy + 1, - unsigned(p1 - p0), - p0); - return ++base_type::m_step < base_type::m_count; - } - - //--------------------------------------------------------------------- - bool step_ver() - { - int dist; - int dx; - int s1 = base_type::step_ver_base(m_di); - cover_type* p0 = base_type::m_covers + base_type::max_half_width + 2; - cover_type* p1 = p0; - - *p1++ = (cover_type)base_type::m_ren.cover(s1); - - dx = 1; - while((dist = base_type::m_dist[dx] - s1) <= base_type::m_width) - { - *p1++ = (cover_type)base_type::m_ren.cover(dist); - ++dx; - } - - dx = 1; - while((dist = base_type::m_dist[dx] + s1) <= base_type::m_width) - { - *--p0 = (cover_type)base_type::m_ren.cover(dist); - ++dx; - } - base_type::m_ren.blend_solid_hspan(base_type::m_x - dx + 1, - base_type::m_y, - unsigned(p1 - p0), - p0); - return ++base_type::m_step < base_type::m_count; - } - - private: - line_interpolator_aa0(const line_interpolator_aa0&); - const line_interpolator_aa0& - operator = (const line_interpolator_aa0&); - - //--------------------------------------------------------------------- - distance_interpolator1 m_di; - }; - - - - - - - //====================================================line_interpolator_aa1 - template class line_interpolator_aa1 : - public line_interpolator_aa_base - { - public: - typedef Renderer renderer_type; - typedef typename Renderer::color_type color_type; - typedef line_interpolator_aa_base base_type; - - //--------------------------------------------------------------------- - line_interpolator_aa1(renderer_type& ren, const line_parameters& lp, - int sx, int sy) : - line_interpolator_aa_base(ren, lp), - m_di(lp.x1, lp.y1, lp.x2, lp.y2, sx, sy, - lp.x1 & ~line_subpixel_mask, lp.y1 & ~line_subpixel_mask) - { - int dist1_start; - int dist2_start; - - int npix = 1; - - if(lp.vertical) - { - do - { - --base_type::m_li; - base_type::m_y -= lp.inc; - base_type::m_x = (base_type::m_lp->x1 + base_type::m_li.y()) >> line_subpixel_shift; - - if(lp.inc > 0) m_di.dec_y(base_type::m_x - base_type::m_old_x); - else m_di.inc_y(base_type::m_x - base_type::m_old_x); - - base_type::m_old_x = base_type::m_x; - - dist1_start = dist2_start = m_di.dist_start(); - - int dx = 0; - if(dist1_start < 0) ++npix; - do - { - dist1_start += m_di.dy_start(); - dist2_start -= m_di.dy_start(); - if(dist1_start < 0) ++npix; - if(dist2_start < 0) ++npix; - ++dx; - } - while(base_type::m_dist[dx] <= base_type::m_width); - --base_type::m_step; - if(npix == 0) break; - npix = 0; - } - while(base_type::m_step >= -base_type::m_max_extent); - } - else - { - do - { - --base_type::m_li; - base_type::m_x -= lp.inc; - base_type::m_y = (base_type::m_lp->y1 + base_type::m_li.y()) >> line_subpixel_shift; - - if(lp.inc > 0) m_di.dec_x(base_type::m_y - base_type::m_old_y); - else m_di.inc_x(base_type::m_y - base_type::m_old_y); - - base_type::m_old_y = base_type::m_y; - - dist1_start = dist2_start = m_di.dist_start(); - - int dy = 0; - if(dist1_start < 0) ++npix; - do - { - dist1_start -= m_di.dx_start(); - dist2_start += m_di.dx_start(); - if(dist1_start < 0) ++npix; - if(dist2_start < 0) ++npix; - ++dy; - } - while(base_type::m_dist[dy] <= base_type::m_width); - --base_type::m_step; - if(npix == 0) break; - npix = 0; - } - while(base_type::m_step >= -base_type::m_max_extent); - } - base_type::m_li.adjust_forward(); - } - - //--------------------------------------------------------------------- - bool step_hor() - { - int dist_start; - int dist; - int dy; - int s1 = base_type::step_hor_base(m_di); - - dist_start = m_di.dist_start(); - cover_type* p0 = base_type::m_covers + base_type::max_half_width + 2; - cover_type* p1 = p0; - - *p1 = 0; - if(dist_start <= 0) - { - *p1 = (cover_type)base_type::m_ren.cover(s1); - } - ++p1; - - dy = 1; - while((dist = base_type::m_dist[dy] - s1) <= base_type::m_width) - { - dist_start -= m_di.dx_start(); - *p1 = 0; - if(dist_start <= 0) - { - *p1 = (cover_type)base_type::m_ren.cover(dist); - } - ++p1; - ++dy; - } - - dy = 1; - dist_start = m_di.dist_start(); - while((dist = base_type::m_dist[dy] + s1) <= base_type::m_width) - { - dist_start += m_di.dx_start(); - *--p0 = 0; - if(dist_start <= 0) - { - *p0 = (cover_type)base_type::m_ren.cover(dist); - } - ++dy; - } - - base_type::m_ren.blend_solid_vspan(base_type::m_x, - base_type::m_y - dy + 1, - unsigned(p1 - p0), - p0); - return ++base_type::m_step < base_type::m_count; - } - - //--------------------------------------------------------------------- - bool step_ver() - { - int dist_start; - int dist; - int dx; - int s1 = base_type::step_ver_base(m_di); - cover_type* p0 = base_type::m_covers + base_type::max_half_width + 2; - cover_type* p1 = p0; - - dist_start = m_di.dist_start(); - - *p1 = 0; - if(dist_start <= 0) - { - *p1 = (cover_type)base_type::m_ren.cover(s1); - } - ++p1; - - dx = 1; - while((dist = base_type::m_dist[dx] - s1) <= base_type::m_width) - { - dist_start += m_di.dy_start(); - *p1 = 0; - if(dist_start <= 0) - { - *p1 = (cover_type)base_type::m_ren.cover(dist); - } - ++p1; - ++dx; - } - - dx = 1; - dist_start = m_di.dist_start(); - while((dist = base_type::m_dist[dx] + s1) <= base_type::m_width) - { - dist_start -= m_di.dy_start(); - *--p0 = 0; - if(dist_start <= 0) - { - *p0 = (cover_type)base_type::m_ren.cover(dist); - } - ++dx; - } - base_type::m_ren.blend_solid_hspan(base_type::m_x - dx + 1, - base_type::m_y, - unsigned(p1 - p0), - p0); - return ++base_type::m_step < base_type::m_count; - } - - private: - line_interpolator_aa1(const line_interpolator_aa1&); - const line_interpolator_aa1& - operator = (const line_interpolator_aa1&); - - //--------------------------------------------------------------------- - distance_interpolator2 m_di; - }; - - - - - - - - - - - - - //====================================================line_interpolator_aa2 - template class line_interpolator_aa2 : - public line_interpolator_aa_base - { - public: - typedef Renderer renderer_type; - typedef typename Renderer::color_type color_type; - typedef line_interpolator_aa_base base_type; - - //--------------------------------------------------------------------- - line_interpolator_aa2(renderer_type& ren, const line_parameters& lp, - int ex, int ey) : - line_interpolator_aa_base(ren, lp), - m_di(lp.x1, lp.y1, lp.x2, lp.y2, ex, ey, - lp.x1 & ~line_subpixel_mask, lp.y1 & ~line_subpixel_mask, - 0) - { - base_type::m_li.adjust_forward(); - base_type::m_step -= base_type::m_max_extent; - } - - //--------------------------------------------------------------------- - bool step_hor() - { - int dist_end; - int dist; - int dy; - int s1 = base_type::step_hor_base(m_di); - cover_type* p0 = base_type::m_covers + base_type::max_half_width + 2; - cover_type* p1 = p0; - - dist_end = m_di.dist_end(); - - int npix = 0; - *p1 = 0; - if(dist_end > 0) - { - *p1 = (cover_type)base_type::m_ren.cover(s1); - ++npix; - } - ++p1; - - dy = 1; - while((dist = base_type::m_dist[dy] - s1) <= base_type::m_width) - { - dist_end -= m_di.dx_end(); - *p1 = 0; - if(dist_end > 0) - { - *p1 = (cover_type)base_type::m_ren.cover(dist); - ++npix; - } - ++p1; - ++dy; - } - - dy = 1; - dist_end = m_di.dist_end(); - while((dist = base_type::m_dist[dy] + s1) <= base_type::m_width) - { - dist_end += m_di.dx_end(); - *--p0 = 0; - if(dist_end > 0) - { - *p0 = (cover_type)base_type::m_ren.cover(dist); - ++npix; - } - ++dy; - } - base_type::m_ren.blend_solid_vspan(base_type::m_x, - base_type::m_y - dy + 1, - unsigned(p1 - p0), - p0); - return npix && ++base_type::m_step < base_type::m_count; - } - - //--------------------------------------------------------------------- - bool step_ver() - { - int dist_end; - int dist; - int dx; - int s1 = base_type::step_ver_base(m_di); - cover_type* p0 = base_type::m_covers + base_type::max_half_width + 2; - cover_type* p1 = p0; - - dist_end = m_di.dist_end(); - - int npix = 0; - *p1 = 0; - if(dist_end > 0) - { - *p1 = (cover_type)base_type::m_ren.cover(s1); - ++npix; - } - ++p1; - - dx = 1; - while((dist = base_type::m_dist[dx] - s1) <= base_type::m_width) - { - dist_end += m_di.dy_end(); - *p1 = 0; - if(dist_end > 0) - { - *p1 = (cover_type)base_type::m_ren.cover(dist); - ++npix; - } - ++p1; - ++dx; - } - - dx = 1; - dist_end = m_di.dist_end(); - while((dist = base_type::m_dist[dx] + s1) <= base_type::m_width) - { - dist_end -= m_di.dy_end(); - *--p0 = 0; - if(dist_end > 0) - { - *p0 = (cover_type)base_type::m_ren.cover(dist); - ++npix; - } - ++dx; - } - base_type::m_ren.blend_solid_hspan(base_type::m_x - dx + 1, - base_type::m_y, - unsigned(p1 - p0), - p0); - return npix && ++base_type::m_step < base_type::m_count; - } - - private: - line_interpolator_aa2(const line_interpolator_aa2&); - const line_interpolator_aa2& - operator = (const line_interpolator_aa2&); - - //--------------------------------------------------------------------- - distance_interpolator2 m_di; - }; - - - - - - - - - - - //====================================================line_interpolator_aa3 - template class line_interpolator_aa3 : - public line_interpolator_aa_base - { - public: - typedef Renderer renderer_type; - typedef typename Renderer::color_type color_type; - typedef line_interpolator_aa_base base_type; - - //--------------------------------------------------------------------- - line_interpolator_aa3(renderer_type& ren, const line_parameters& lp, - int sx, int sy, int ex, int ey) : - line_interpolator_aa_base(ren, lp), - m_di(lp.x1, lp.y1, lp.x2, lp.y2, sx, sy, ex, ey, - lp.x1 & ~line_subpixel_mask, lp.y1 & ~line_subpixel_mask) - { - int dist1_start; - int dist2_start; - int npix = 1; - if(lp.vertical) - { - do - { - --base_type::m_li; - base_type::m_y -= lp.inc; - base_type::m_x = (base_type::m_lp->x1 + base_type::m_li.y()) >> line_subpixel_shift; - - if(lp.inc > 0) m_di.dec_y(base_type::m_x - base_type::m_old_x); - else m_di.inc_y(base_type::m_x - base_type::m_old_x); - - base_type::m_old_x = base_type::m_x; - - dist1_start = dist2_start = m_di.dist_start(); - - int dx = 0; - if(dist1_start < 0) ++npix; - do - { - dist1_start += m_di.dy_start(); - dist2_start -= m_di.dy_start(); - if(dist1_start < 0) ++npix; - if(dist2_start < 0) ++npix; - ++dx; - } - while(base_type::m_dist[dx] <= base_type::m_width); - if(npix == 0) break; - npix = 0; - } - while(--base_type::m_step >= -base_type::m_max_extent); - } - else - { - do - { - --base_type::m_li; - base_type::m_x -= lp.inc; - base_type::m_y = (base_type::m_lp->y1 + base_type::m_li.y()) >> line_subpixel_shift; - - if(lp.inc > 0) m_di.dec_x(base_type::m_y - base_type::m_old_y); - else m_di.inc_x(base_type::m_y - base_type::m_old_y); - - base_type::m_old_y = base_type::m_y; - - dist1_start = dist2_start = m_di.dist_start(); - - int dy = 0; - if(dist1_start < 0) ++npix; - do - { - dist1_start -= m_di.dx_start(); - dist2_start += m_di.dx_start(); - if(dist1_start < 0) ++npix; - if(dist2_start < 0) ++npix; - ++dy; - } - while(base_type::m_dist[dy] <= base_type::m_width); - if(npix == 0) break; - npix = 0; - } - while(--base_type::m_step >= -base_type::m_max_extent); - } - base_type::m_li.adjust_forward(); - base_type::m_step -= base_type::m_max_extent; - } - - - //--------------------------------------------------------------------- - bool step_hor() - { - int dist_start; - int dist_end; - int dist; - int dy; - int s1 = base_type::step_hor_base(m_di); - cover_type* p0 = base_type::m_covers + base_type::max_half_width + 2; - cover_type* p1 = p0; - - dist_start = m_di.dist_start(); - dist_end = m_di.dist_end(); - - int npix = 0; - *p1 = 0; - if(dist_end > 0) - { - if(dist_start <= 0) - { - *p1 = (cover_type)base_type::m_ren.cover(s1); - } - ++npix; - } - ++p1; - - dy = 1; - while((dist = base_type::m_dist[dy] - s1) <= base_type::m_width) - { - dist_start -= m_di.dx_start(); - dist_end -= m_di.dx_end(); - *p1 = 0; - if(dist_end > 0 && dist_start <= 0) - { - *p1 = (cover_type)base_type::m_ren.cover(dist); - ++npix; - } - ++p1; - ++dy; - } - - dy = 1; - dist_start = m_di.dist_start(); - dist_end = m_di.dist_end(); - while((dist = base_type::m_dist[dy] + s1) <= base_type::m_width) - { - dist_start += m_di.dx_start(); - dist_end += m_di.dx_end(); - *--p0 = 0; - if(dist_end > 0 && dist_start <= 0) - { - *p0 = (cover_type)base_type::m_ren.cover(dist); - ++npix; - } - ++dy; - } - base_type::m_ren.blend_solid_vspan(base_type::m_x, - base_type::m_y - dy + 1, - unsigned(p1 - p0), - p0); - return npix && ++base_type::m_step < base_type::m_count; - } - - //--------------------------------------------------------------------- - bool step_ver() - { - int dist_start; - int dist_end; - int dist; - int dx; - int s1 = base_type::step_ver_base(m_di); - cover_type* p0 = base_type::m_covers + base_type::max_half_width + 2; - cover_type* p1 = p0; - - dist_start = m_di.dist_start(); - dist_end = m_di.dist_end(); - - int npix = 0; - *p1 = 0; - if(dist_end > 0) - { - if(dist_start <= 0) - { - *p1 = (cover_type)base_type::m_ren.cover(s1); - } - ++npix; - } - ++p1; - - dx = 1; - while((dist = base_type::m_dist[dx] - s1) <= base_type::m_width) - { - dist_start += m_di.dy_start(); - dist_end += m_di.dy_end(); - *p1 = 0; - if(dist_end > 0 && dist_start <= 0) - { - *p1 = (cover_type)base_type::m_ren.cover(dist); - ++npix; - } - ++p1; - ++dx; - } - - dx = 1; - dist_start = m_di.dist_start(); - dist_end = m_di.dist_end(); - while((dist = base_type::m_dist[dx] + s1) <= base_type::m_width) - { - dist_start -= m_di.dy_start(); - dist_end -= m_di.dy_end(); - *--p0 = 0; - if(dist_end > 0 && dist_start <= 0) - { - *p0 = (cover_type)base_type::m_ren.cover(dist); - ++npix; - } - ++dx; - } - base_type::m_ren.blend_solid_hspan(base_type::m_x - dx + 1, - base_type::m_y, - unsigned(p1 - p0), - p0); - return npix && ++base_type::m_step < base_type::m_count; - } - - private: - line_interpolator_aa3(const line_interpolator_aa3&); - const line_interpolator_aa3& - operator = (const line_interpolator_aa3&); - - //--------------------------------------------------------------------- - distance_interpolator3 m_di; - }; - - - - - //==========================================================line_profile_aa - // - // See Implementation agg_line_profile_aa.cpp - // - class line_profile_aa - { - public: - //--------------------------------------------------------------------- - typedef int8u value_type; - enum subpixel_scale_e - { - subpixel_shift = line_subpixel_shift, - subpixel_scale = 1 << subpixel_shift, - subpixel_mask = subpixel_scale - 1 - }; - - enum aa_scale_e - { - aa_shift = 8, - aa_scale = 1 << aa_shift, - aa_mask = aa_scale - 1 - }; - - //--------------------------------------------------------------------- - line_profile_aa() : - m_subpixel_width(0), - m_min_width(1.0), - m_smoother_width(1.0) - { - int i; - for(i = 0; i < aa_scale; i++) m_gamma[i] = (value_type)i; - } - - //--------------------------------------------------------------------- - template - line_profile_aa(double w, const GammaF& gamma_function) : - m_subpixel_width(0), - m_min_width(1.0), - m_smoother_width(1.0) - { - gamma(gamma_function); - width(w); - } - - //--------------------------------------------------------------------- - void min_width(double w) { m_min_width = w; } - void smoother_width(double w) { m_smoother_width = w; } - - //--------------------------------------------------------------------- - template void gamma(const GammaF& gamma_function) - { - int i; - for(i = 0; i < aa_scale; i++) - { - m_gamma[i] = value_type( - uround(gamma_function(double(i) / aa_mask) * aa_mask)); - } - } - - void width(double w); - - unsigned profile_size() const { return m_profile.size(); } - int subpixel_width() const { return m_subpixel_width; } - - //--------------------------------------------------------------------- - double min_width() const { return m_min_width; } - double smoother_width() const { return m_smoother_width; } - - //--------------------------------------------------------------------- - value_type value(int dist) const - { - return m_profile[dist + subpixel_scale*2]; - } - - private: - line_profile_aa(const line_profile_aa&); - const line_profile_aa& operator = (const line_profile_aa&); - - value_type* profile(double w); - void set(double center_width, double smoother_width); - - //--------------------------------------------------------------------- - pod_array m_profile; - value_type m_gamma[aa_scale]; - int m_subpixel_width; - double m_min_width; - double m_smoother_width; - }; - - - //======================================================renderer_outline_aa - template class renderer_outline_aa - { - public: - //--------------------------------------------------------------------- - typedef BaseRenderer base_ren_type; - typedef renderer_outline_aa self_type; - typedef typename base_ren_type::color_type color_type; - - //--------------------------------------------------------------------- - renderer_outline_aa(base_ren_type& ren, const line_profile_aa& prof) : - m_ren(&ren), - m_profile(&prof), - m_clip_box(0,0,0,0), - m_clipping(false) - {} - void attach(base_ren_type& ren) { m_ren = &ren; } - - //--------------------------------------------------------------------- - void color(const color_type& c) { m_color = c; } - const color_type& color() const { return m_color; } - - //--------------------------------------------------------------------- - void profile(const line_profile_aa& prof) { m_profile = &prof; } - const line_profile_aa& profile() const { return *m_profile; } - line_profile_aa& profile() { return *m_profile; } - - //--------------------------------------------------------------------- - int subpixel_width() const { return m_profile->subpixel_width(); } - - //--------------------------------------------------------------------- - void reset_clipping() { m_clipping = false; } - void clip_box(double x1, double y1, double x2, double y2) - { - m_clip_box.x1 = line_coord_sat::conv(x1); - m_clip_box.y1 = line_coord_sat::conv(y1); - m_clip_box.x2 = line_coord_sat::conv(x2); - m_clip_box.y2 = line_coord_sat::conv(y2); - m_clipping = true; - } - - //--------------------------------------------------------------------- - int cover(int d) const - { - return m_profile->value(d); - } - - //------------------------------------------------------------------------- - void blend_solid_hspan(int x, int y, unsigned len, const cover_type* covers) - { - m_ren->blend_solid_hspan(x, y, len, m_color, covers); - } - - //------------------------------------------------------------------------- - void blend_solid_vspan(int x, int y, unsigned len, const cover_type* covers) - { - m_ren->blend_solid_vspan(x, y, len, m_color, covers); - } - - //------------------------------------------------------------------------- - static bool accurate_join_only() { return false; } - - //------------------------------------------------------------------------- - template - void semidot_hline(Cmp cmp, - int xc1, int yc1, int xc2, int yc2, - int x1, int y1, int x2) - { - cover_type covers[line_interpolator_aa_base::max_half_width * 2 + 4]; - cover_type* p0 = covers; - cover_type* p1 = covers; - int x = x1 << line_subpixel_shift; - int y = y1 << line_subpixel_shift; - int w = subpixel_width(); - distance_interpolator0 di(xc1, yc1, xc2, yc2, x, y); - x += line_subpixel_scale/2; - y += line_subpixel_scale/2; - - int x0 = x1; - int dx = x - xc1; - int dy = y - yc1; - do - { - int d = int(fast_sqrt(dx*dx + dy*dy)); - *p1 = 0; - if(cmp(di.dist()) && d <= w) - { - *p1 = (cover_type)cover(d); - } - ++p1; - dx += line_subpixel_scale; - di.inc_x(); - } - while(++x1 <= x2); - m_ren->blend_solid_hspan(x0, y1, - unsigned(p1 - p0), - color(), - p0); - } - - //------------------------------------------------------------------------- - template - void semidot(Cmp cmp, int xc1, int yc1, int xc2, int yc2) - { - if(m_clipping && clipping_flags(xc1, yc1, m_clip_box)) return; - - int r = ((subpixel_width() + line_subpixel_mask) >> line_subpixel_shift); - if(r < 1) r = 1; - ellipse_bresenham_interpolator ei(r, r); - int dx = 0; - int dy = -r; - int dy0 = dy; - int dx0 = dx; - int x = xc1 >> line_subpixel_shift; - int y = yc1 >> line_subpixel_shift; - - do - { - dx += ei.dx(); - dy += ei.dy(); - - if(dy != dy0) - { - semidot_hline(cmp, xc1, yc1, xc2, yc2, x-dx0, y+dy0, x+dx0); - semidot_hline(cmp, xc1, yc1, xc2, yc2, x-dx0, y-dy0, x+dx0); - } - dx0 = dx; - dy0 = dy; - ++ei; - } - while(dy < 0); - semidot_hline(cmp, xc1, yc1, xc2, yc2, x-dx0, y+dy0, x+dx0); - } - - //------------------------------------------------------------------------- - void pie_hline(int xc, int yc, int xp1, int yp1, int xp2, int yp2, - int xh1, int yh1, int xh2) - { - if(m_clipping && clipping_flags(xc, yc, m_clip_box)) return; - - cover_type covers[line_interpolator_aa_base::max_half_width * 2 + 4]; - cover_type* p0 = covers; - cover_type* p1 = covers; - int x = xh1 << line_subpixel_shift; - int y = yh1 << line_subpixel_shift; - int w = subpixel_width(); - - distance_interpolator00 di(xc, yc, xp1, yp1, xp2, yp2, x, y); - x += line_subpixel_scale/2; - y += line_subpixel_scale/2; - - int xh0 = xh1; - int dx = x - xc; - int dy = y - yc; - do - { - int d = int(fast_sqrt(dx*dx + dy*dy)); - *p1 = 0; - if(di.dist1() <= 0 && di.dist2() > 0 && d <= w) - { - *p1 = (cover_type)cover(d); - } - ++p1; - dx += line_subpixel_scale; - di.inc_x(); - } - while(++xh1 <= xh2); - m_ren->blend_solid_hspan(xh0, yh1, - unsigned(p1 - p0), - color(), - p0); - } - - - //------------------------------------------------------------------------- - void pie(int xc, int yc, int x1, int y1, int x2, int y2) - { - int r = ((subpixel_width() + line_subpixel_mask) >> line_subpixel_shift); - if(r < 1) r = 1; - ellipse_bresenham_interpolator ei(r, r); - int dx = 0; - int dy = -r; - int dy0 = dy; - int dx0 = dx; - int x = xc >> line_subpixel_shift; - int y = yc >> line_subpixel_shift; - - do - { - dx += ei.dx(); - dy += ei.dy(); - - if(dy != dy0) - { - pie_hline(xc, yc, x1, y1, x2, y2, x-dx0, y+dy0, x+dx0); - pie_hline(xc, yc, x1, y1, x2, y2, x-dx0, y-dy0, x+dx0); - } - dx0 = dx; - dy0 = dy; - ++ei; - } - while(dy < 0); - pie_hline(xc, yc, x1, y1, x2, y2, x-dx0, y+dy0, x+dx0); - } - - //------------------------------------------------------------------------- - void line0_no_clip(const line_parameters& lp) - { - if(lp.len > line_max_length) - { - line_parameters lp1, lp2; - lp.divide(lp1, lp2); - line0_no_clip(lp1); - line0_no_clip(lp2); - return; - } - - line_interpolator_aa0 li(*this, lp); - if(li.count()) - { - if(li.vertical()) - { - while(li.step_ver()); - } - else - { - while(li.step_hor()); - } - } - } - - //------------------------------------------------------------------------- - void line0(const line_parameters& lp) - { - if(m_clipping) - { - int x1 = lp.x1; - int y1 = lp.y1; - int x2 = lp.x2; - int y2 = lp.y2; - unsigned flags = clip_line_segment(&x1, &y1, &x2, &y2, m_clip_box); - if((flags & 4) == 0) - { - if(flags) - { - line_parameters lp2(x1, y1, x2, y2, - uround(calc_distance(x1, y1, x2, y2))); - line0_no_clip(lp2); - } - else - { - line0_no_clip(lp); - } - } - } - else - { - line0_no_clip(lp); - } - } - - //------------------------------------------------------------------------- - void line1_no_clip(const line_parameters& lp, int sx, int sy) - { - if(lp.len > line_max_length) - { - line_parameters lp1, lp2; - lp.divide(lp1, lp2); - line1_no_clip(lp1, (lp.x1 + sx) >> 1, (lp.y1 + sy) >> 1); - line1_no_clip(lp2, lp1.x2 + (lp1.y2 - lp1.y1), lp1.y2 - (lp1.x2 - lp1.x1)); - return; - } - - fix_degenerate_bisectrix_start(lp, &sx, &sy); - line_interpolator_aa1 li(*this, lp, sx, sy); - if(li.vertical()) - { - while(li.step_ver()); - } - else - { - while(li.step_hor()); - } - } - - - //------------------------------------------------------------------------- - void line1(const line_parameters& lp, int sx, int sy) - { - if(m_clipping) - { - int x1 = lp.x1; - int y1 = lp.y1; - int x2 = lp.x2; - int y2 = lp.y2; - unsigned flags = clip_line_segment(&x1, &y1, &x2, &y2, m_clip_box); - if((flags & 4) == 0) - { - if(flags) - { - line_parameters lp2(x1, y1, x2, y2, - uround(calc_distance(x1, y1, x2, y2))); - if(flags & 1) - { - sx = x1 + (y2 - y1); - sy = y1 - (x2 - x1); - } - else - { - while(abs(sx - lp.x1) + abs(sy - lp.y1) > lp2.len) - { - sx = (lp.x1 + sx) >> 1; - sy = (lp.y1 + sy) >> 1; - } - } - line1_no_clip(lp2, sx, sy); - } - else - { - line1_no_clip(lp, sx, sy); - } - } - } - else - { - line1_no_clip(lp, sx, sy); - } - } - - //------------------------------------------------------------------------- - void line2_no_clip(const line_parameters& lp, int ex, int ey) - { - if(lp.len > line_max_length) - { - line_parameters lp1, lp2; - lp.divide(lp1, lp2); - line2_no_clip(lp1, lp1.x2 + (lp1.y2 - lp1.y1), lp1.y2 - (lp1.x2 - lp1.x1)); - line2_no_clip(lp2, (lp.x2 + ex) >> 1, (lp.y2 + ey) >> 1); - return; - } - - fix_degenerate_bisectrix_end(lp, &ex, &ey); - line_interpolator_aa2 li(*this, lp, ex, ey); - if(li.vertical()) - { - while(li.step_ver()); - } - else - { - while(li.step_hor()); - } - } - - //------------------------------------------------------------------------- - void line2(const line_parameters& lp, int ex, int ey) - { - if(m_clipping) - { - int x1 = lp.x1; - int y1 = lp.y1; - int x2 = lp.x2; - int y2 = lp.y2; - unsigned flags = clip_line_segment(&x1, &y1, &x2, &y2, m_clip_box); - if((flags & 4) == 0) - { - if(flags) - { - line_parameters lp2(x1, y1, x2, y2, - uround(calc_distance(x1, y1, x2, y2))); - if(flags & 2) - { - ex = x2 + (y2 - y1); - ey = y2 - (x2 - x1); - } - else - { - while(abs(ex - lp.x2) + abs(ey - lp.y2) > lp2.len) - { - ex = (lp.x2 + ex) >> 1; - ey = (lp.y2 + ey) >> 1; - } - } - line2_no_clip(lp2, ex, ey); - } - else - { - line2_no_clip(lp, ex, ey); - } - } - } - else - { - line2_no_clip(lp, ex, ey); - } - } - - //------------------------------------------------------------------------- - void line3_no_clip(const line_parameters& lp, - int sx, int sy, int ex, int ey) - { - if(lp.len > line_max_length) - { - line_parameters lp1, lp2; - lp.divide(lp1, lp2); - int mx = lp1.x2 + (lp1.y2 - lp1.y1); - int my = lp1.y2 - (lp1.x2 - lp1.x1); - line3_no_clip(lp1, (lp.x1 + sx) >> 1, (lp.y1 + sy) >> 1, mx, my); - line3_no_clip(lp2, mx, my, (lp.x2 + ex) >> 1, (lp.y2 + ey) >> 1); - return; - } - - fix_degenerate_bisectrix_start(lp, &sx, &sy); - fix_degenerate_bisectrix_end(lp, &ex, &ey); - line_interpolator_aa3 li(*this, lp, sx, sy, ex, ey); - if(li.vertical()) - { - while(li.step_ver()); - } - else - { - while(li.step_hor()); - } - } - - //------------------------------------------------------------------------- - void line3(const line_parameters& lp, - int sx, int sy, int ex, int ey) - { - if(m_clipping) - { - int x1 = lp.x1; - int y1 = lp.y1; - int x2 = lp.x2; - int y2 = lp.y2; - unsigned flags = clip_line_segment(&x1, &y1, &x2, &y2, m_clip_box); - if((flags & 4) == 0) - { - if(flags) - { - line_parameters lp2(x1, y1, x2, y2, - uround(calc_distance(x1, y1, x2, y2))); - if(flags & 1) - { - sx = x1 + (y2 - y1); - sy = y1 - (x2 - x1); - } - else - { - while(abs(sx - lp.x1) + abs(sy - lp.y1) > lp2.len) - { - sx = (lp.x1 + sx) >> 1; - sy = (lp.y1 + sy) >> 1; - } - } - if(flags & 2) - { - ex = x2 + (y2 - y1); - ey = y2 - (x2 - x1); - } - else - { - while(abs(ex - lp.x2) + abs(ey - lp.y2) > lp2.len) - { - ex = (lp.x2 + ex) >> 1; - ey = (lp.y2 + ey) >> 1; - } - } - line3_no_clip(lp2, sx, sy, ex, ey); - } - else - { - line3_no_clip(lp, sx, sy, ex, ey); - } - } - } - else - { - line3_no_clip(lp, sx, sy, ex, ey); - } - } - - - private: - base_ren_type* m_ren; - const line_profile_aa* m_profile; - color_type m_color; - rect_i m_clip_box; - bool m_clipping; - }; - - - -} - -#endif diff --git a/uppdev/aggdraw/agg_renderer_outline_image.h b/uppdev/aggdraw/agg_renderer_outline_image.h deleted file mode 100644 index cedf6e83f..000000000 --- a/uppdev/aggdraw/agg_renderer_outline_image.h +++ /dev/null @@ -1,1023 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_RENDERER_OUTLINE_IMAGE_INCLUDED -#define AGG_RENDERER_OUTLINE_IMAGE_INCLUDED - -#include "agg_array.h" -#include "agg_math.h" -#include "agg_line_aa_basics.h" -#include "agg_dda_line.h" -#include "agg_rendering_buffer.h" -#include "agg_clip_liang_barsky.h" - - -namespace agg -{ - //========================================================line_image_scale - template class line_image_scale - { - public: - typedef typename Source::color_type color_type; - - line_image_scale(const Source& src, double height) : - m_source(src), - m_height(height), - m_scale(src.height() / height) - { - } - - double width() const { return m_source.width(); } - double height() const { return m_height; } - - color_type pixel(int x, int y) const - { - double src_y = (y + 0.5) * m_scale - 0.5; - int h = m_source.height() - 1; - int y1 = ufloor(src_y); - int y2 = y1 + 1; - color_type pix1 = (y1 < 0) ? color_type::no_color() : m_source.pixel(x, y1); - color_type pix2 = (y2 > h) ? color_type::no_color() : m_source.pixel(x, y2); - return pix1.gradient(pix2, src_y - y1); - } - - private: - line_image_scale(const line_image_scale&); - const line_image_scale& operator = (const line_image_scale&); - - const Source& m_source; - double m_height; - double m_scale; - }; - - - - //======================================================line_image_pattern - template class line_image_pattern - { - public: - typedef Filter filter_type; - typedef typename filter_type::color_type color_type; - - //-------------------------------------------------------------------- - line_image_pattern(const Filter& filter) : - m_filter(&filter), - m_dilation(filter.dilation() + 1), - m_dilation_hr(m_dilation << line_subpixel_shift), - m_data(), - m_width(0), - m_height(0), - m_width_hr(0), - m_half_height_hr(0), - m_offset_y_hr(0) - { - } - - // Create - //-------------------------------------------------------------------- - template - line_image_pattern(const Filter& filter, const Source& src) : - m_filter(&filter), - m_dilation(filter.dilation() + 1), - m_dilation_hr(m_dilation << line_subpixel_shift), - m_data(), - m_width(0), - m_height(0), - m_width_hr(0), - m_half_height_hr(0), - m_offset_y_hr(0) - { - create(src); - } - - // Create - //-------------------------------------------------------------------- - template void create(const Source& src) - { - m_height = uceil(src.height()); - m_width = uceil(src.width()); - m_width_hr = uround(src.width() * line_subpixel_scale); - m_half_height_hr = uround(src.height() * line_subpixel_scale/2); - m_offset_y_hr = m_dilation_hr + m_half_height_hr - line_subpixel_scale/2; - m_half_height_hr += line_subpixel_scale/2; - - m_data.resize((m_width + m_dilation * 2) * (m_height + m_dilation * 2)); - - m_buf.attach(&m_data[0], m_width + m_dilation * 2, - m_height + m_dilation * 2, - m_width + m_dilation * 2); - unsigned x, y; - color_type* d1; - color_type* d2; - for(y = 0; y < m_height; y++) - { - d1 = m_buf.row_ptr(y + m_dilation) + m_dilation; - for(x = 0; x < m_width; x++) - { - *d1++ = src.pixel(x, y); - } - } - - const color_type* s1; - const color_type* s2; - for(y = 0; y < m_dilation; y++) - { - //s1 = m_buf.row_ptr(m_height + m_dilation - 1) + m_dilation; - //s2 = m_buf.row_ptr(m_dilation) + m_dilation; - d1 = m_buf.row_ptr(m_dilation + m_height + y) + m_dilation; - d2 = m_buf.row_ptr(m_dilation - y - 1) + m_dilation; - for(x = 0; x < m_width; x++) - { - //*d1++ = color_type(*s1++, 0); - //*d2++ = color_type(*s2++, 0); - *d1++ = color_type::no_color(); - *d2++ = color_type::no_color(); - } - } - - unsigned h = m_height + m_dilation * 2; - for(y = 0; y < h; y++) - { - s1 = m_buf.row_ptr(y) + m_dilation; - s2 = m_buf.row_ptr(y) + m_dilation + m_width; - d1 = m_buf.row_ptr(y) + m_dilation + m_width; - d2 = m_buf.row_ptr(y) + m_dilation; - - for(x = 0; x < m_dilation; x++) - { - *d1++ = *s1++; - *--d2 = *--s2; - } - } - } - - //-------------------------------------------------------------------- - int pattern_width() const { return m_width_hr; } - int line_width() const { return m_half_height_hr; } - double width() const { return m_height; } - - //-------------------------------------------------------------------- - void pixel(color_type* p, int x, int y) const - { - m_filter->pixel_high_res(m_buf.rows(), - p, - x % m_width_hr + m_dilation_hr, - y + m_offset_y_hr); - } - - //-------------------------------------------------------------------- - const filter_type& filter() const { return *m_filter; } - - private: - line_image_pattern(const line_image_pattern&); - const line_image_pattern& - operator = (const line_image_pattern&); - - protected: - row_ptr_cache m_buf; - const filter_type* m_filter; - unsigned m_dilation; - int m_dilation_hr; - pod_array m_data; - unsigned m_width; - unsigned m_height; - int m_width_hr; - int m_half_height_hr; - int m_offset_y_hr; - }; - - - - - - - //=================================================line_image_pattern_pow2 - template class line_image_pattern_pow2 : - public line_image_pattern - { - public: - typedef Filter filter_type; - typedef typename filter_type::color_type color_type; - typedef line_image_pattern base_type; - - //-------------------------------------------------------------------- - line_image_pattern_pow2(const Filter& filter) : - line_image_pattern(filter), m_mask(line_subpixel_mask) {} - - //-------------------------------------------------------------------- - template - line_image_pattern_pow2(const Filter& filter, const Source& src) : - line_image_pattern(filter), m_mask(line_subpixel_mask) - { - create(src); - } - - //-------------------------------------------------------------------- - template void create(const Source& src) - { - line_image_pattern::create(src); - m_mask = 1; - while(m_mask < base_type::m_width) - { - m_mask <<= 1; - m_mask |= 1; - } - m_mask <<= line_subpixel_shift - 1; - m_mask |= line_subpixel_mask; - base_type::m_width_hr = m_mask + 1; - } - - //-------------------------------------------------------------------- - void pixel(color_type* p, int x, int y) const - { - base_type::m_filter->pixel_high_res( - base_type::m_buf.rows(), - p, - (x & m_mask) + base_type::m_dilation_hr, - y + base_type::m_offset_y_hr); - } - private: - unsigned m_mask; - }; - - - - - - - - //===================================================distance_interpolator4 - class distance_interpolator4 - { - public: - //--------------------------------------------------------------------- - distance_interpolator4() {} - distance_interpolator4(int x1, int y1, int x2, int y2, - int sx, int sy, int ex, int ey, - int len, double scale, int x, int y) : - m_dx(x2 - x1), - m_dy(y2 - y1), - m_dx_start(line_mr(sx) - line_mr(x1)), - m_dy_start(line_mr(sy) - line_mr(y1)), - m_dx_end(line_mr(ex) - line_mr(x2)), - m_dy_end(line_mr(ey) - line_mr(y2)), - - m_dist(iround(double(x + line_subpixel_scale/2 - x2) * double(m_dy) - - double(y + line_subpixel_scale/2 - y2) * double(m_dx))), - - m_dist_start((line_mr(x + line_subpixel_scale/2) - line_mr(sx)) * m_dy_start - - (line_mr(y + line_subpixel_scale/2) - line_mr(sy)) * m_dx_start), - - m_dist_end((line_mr(x + line_subpixel_scale/2) - line_mr(ex)) * m_dy_end - - (line_mr(y + line_subpixel_scale/2) - line_mr(ey)) * m_dx_end), - m_len(uround(len / scale)) - { - double d = len * scale; - int dx = iround(((x2 - x1) << line_subpixel_shift) / d); - int dy = iround(((y2 - y1) << line_subpixel_shift) / d); - m_dx_pict = -dy; - m_dy_pict = dx; - m_dist_pict = ((x + line_subpixel_scale/2 - (x1 - dy)) * m_dy_pict - - (y + line_subpixel_scale/2 - (y1 + dx)) * m_dx_pict) >> - line_subpixel_shift; - - m_dx <<= line_subpixel_shift; - m_dy <<= line_subpixel_shift; - m_dx_start <<= line_mr_subpixel_shift; - m_dy_start <<= line_mr_subpixel_shift; - m_dx_end <<= line_mr_subpixel_shift; - m_dy_end <<= line_mr_subpixel_shift; - } - - //--------------------------------------------------------------------- - void inc_x() - { - m_dist += m_dy; - m_dist_start += m_dy_start; - m_dist_pict += m_dy_pict; - m_dist_end += m_dy_end; - } - - //--------------------------------------------------------------------- - void dec_x() - { - m_dist -= m_dy; - m_dist_start -= m_dy_start; - m_dist_pict -= m_dy_pict; - m_dist_end -= m_dy_end; - } - - //--------------------------------------------------------------------- - void inc_y() - { - m_dist -= m_dx; - m_dist_start -= m_dx_start; - m_dist_pict -= m_dx_pict; - m_dist_end -= m_dx_end; - } - - //--------------------------------------------------------------------- - void dec_y() - { - m_dist += m_dx; - m_dist_start += m_dx_start; - m_dist_pict += m_dx_pict; - m_dist_end += m_dx_end; - } - - //--------------------------------------------------------------------- - void inc_x(int dy) - { - m_dist += m_dy; - m_dist_start += m_dy_start; - m_dist_pict += m_dy_pict; - m_dist_end += m_dy_end; - if(dy > 0) - { - m_dist -= m_dx; - m_dist_start -= m_dx_start; - m_dist_pict -= m_dx_pict; - m_dist_end -= m_dx_end; - } - if(dy < 0) - { - m_dist += m_dx; - m_dist_start += m_dx_start; - m_dist_pict += m_dx_pict; - m_dist_end += m_dx_end; - } - } - - //--------------------------------------------------------------------- - void dec_x(int dy) - { - m_dist -= m_dy; - m_dist_start -= m_dy_start; - m_dist_pict -= m_dy_pict; - m_dist_end -= m_dy_end; - if(dy > 0) - { - m_dist -= m_dx; - m_dist_start -= m_dx_start; - m_dist_pict -= m_dx_pict; - m_dist_end -= m_dx_end; - } - if(dy < 0) - { - m_dist += m_dx; - m_dist_start += m_dx_start; - m_dist_pict += m_dx_pict; - m_dist_end += m_dx_end; - } - } - - //--------------------------------------------------------------------- - void inc_y(int dx) - { - m_dist -= m_dx; - m_dist_start -= m_dx_start; - m_dist_pict -= m_dx_pict; - m_dist_end -= m_dx_end; - if(dx > 0) - { - m_dist += m_dy; - m_dist_start += m_dy_start; - m_dist_pict += m_dy_pict; - m_dist_end += m_dy_end; - } - if(dx < 0) - { - m_dist -= m_dy; - m_dist_start -= m_dy_start; - m_dist_pict -= m_dy_pict; - m_dist_end -= m_dy_end; - } - } - - //--------------------------------------------------------------------- - void dec_y(int dx) - { - m_dist += m_dx; - m_dist_start += m_dx_start; - m_dist_pict += m_dx_pict; - m_dist_end += m_dx_end; - if(dx > 0) - { - m_dist += m_dy; - m_dist_start += m_dy_start; - m_dist_pict += m_dy_pict; - m_dist_end += m_dy_end; - } - if(dx < 0) - { - m_dist -= m_dy; - m_dist_start -= m_dy_start; - m_dist_pict -= m_dy_pict; - m_dist_end -= m_dy_end; - } - } - - //--------------------------------------------------------------------- - int dist() const { return m_dist; } - int dist_start() const { return m_dist_start; } - int dist_pict() const { return m_dist_pict; } - int dist_end() const { return m_dist_end; } - - //--------------------------------------------------------------------- - int dx() const { return m_dx; } - int dy() const { return m_dy; } - int dx_start() const { return m_dx_start; } - int dy_start() const { return m_dy_start; } - int dx_pict() const { return m_dx_pict; } - int dy_pict() const { return m_dy_pict; } - int dx_end() const { return m_dx_end; } - int dy_end() const { return m_dy_end; } - int len() const { return m_len; } - - private: - //--------------------------------------------------------------------- - int m_dx; - int m_dy; - int m_dx_start; - int m_dy_start; - int m_dx_pict; - int m_dy_pict; - int m_dx_end; - int m_dy_end; - - int m_dist; - int m_dist_start; - int m_dist_pict; - int m_dist_end; - int m_len; - }; - - - - - - //==================================================line_interpolator_image - template class line_interpolator_image - { - public: - typedef Renderer renderer_type; - typedef typename Renderer::color_type color_type; - - //--------------------------------------------------------------------- - enum max_half_width_e - { - max_half_width = 64 - }; - - //--------------------------------------------------------------------- - line_interpolator_image(renderer_type& ren, const line_parameters& lp, - int sx, int sy, int ex, int ey, - int pattern_start, - double scale_x) : - m_lp(lp), - m_li(lp.vertical ? line_dbl_hr(lp.x2 - lp.x1) : - line_dbl_hr(lp.y2 - lp.y1), - lp.vertical ? abs(lp.y2 - lp.y1) : - abs(lp.x2 - lp.x1) + 1), - m_di(lp.x1, lp.y1, lp.x2, lp.y2, sx, sy, ex, ey, lp.len, scale_x, - lp.x1 & ~line_subpixel_mask, lp.y1 & ~line_subpixel_mask), - m_ren(ren), - m_x(lp.x1 >> line_subpixel_shift), - m_y(lp.y1 >> line_subpixel_shift), - m_old_x(m_x), - m_old_y(m_y), - m_count((lp.vertical ? abs((lp.y2 >> line_subpixel_shift) - m_y) : - abs((lp.x2 >> line_subpixel_shift) - m_x))), - m_width(ren.subpixel_width()), - //m_max_extent(m_width >> (line_subpixel_shift - 2)), - m_max_extent((m_width + line_subpixel_scale) >> line_subpixel_shift), - m_start(pattern_start + (m_max_extent + 2) * ren.pattern_width()), - m_step(0) - { - agg::dda2_line_interpolator li(0, lp.vertical ? - (lp.dy << agg::line_subpixel_shift) : - (lp.dx << agg::line_subpixel_shift), - lp.len); - - unsigned i; - int stop = m_width + line_subpixel_scale * 2; - for(i = 0; i < max_half_width; ++i) - { - m_dist_pos[i] = li.y(); - if(m_dist_pos[i] >= stop) break; - ++li; - } - m_dist_pos[i] = 0x7FFF0000; - - int dist1_start; - int dist2_start; - int npix = 1; - - if(lp.vertical) - { - do - { - --m_li; - m_y -= lp.inc; - m_x = (m_lp.x1 + m_li.y()) >> line_subpixel_shift; - - if(lp.inc > 0) m_di.dec_y(m_x - m_old_x); - else m_di.inc_y(m_x - m_old_x); - - m_old_x = m_x; - - dist1_start = dist2_start = m_di.dist_start(); - - int dx = 0; - if(dist1_start < 0) ++npix; - do - { - dist1_start += m_di.dy_start(); - dist2_start -= m_di.dy_start(); - if(dist1_start < 0) ++npix; - if(dist2_start < 0) ++npix; - ++dx; - } - while(m_dist_pos[dx] <= m_width); - if(npix == 0) break; - - npix = 0; - } - while(--m_step >= -m_max_extent); - } - else - { - do - { - --m_li; - - m_x -= lp.inc; - m_y = (m_lp.y1 + m_li.y()) >> line_subpixel_shift; - - if(lp.inc > 0) m_di.dec_x(m_y - m_old_y); - else m_di.inc_x(m_y - m_old_y); - - m_old_y = m_y; - - dist1_start = dist2_start = m_di.dist_start(); - - int dy = 0; - if(dist1_start < 0) ++npix; - do - { - dist1_start -= m_di.dx_start(); - dist2_start += m_di.dx_start(); - if(dist1_start < 0) ++npix; - if(dist2_start < 0) ++npix; - ++dy; - } - while(m_dist_pos[dy] <= m_width); - if(npix == 0) break; - - npix = 0; - } - while(--m_step >= -m_max_extent); - } - m_li.adjust_forward(); - m_step -= m_max_extent; - } - - //--------------------------------------------------------------------- - bool step_hor() - { - ++m_li; - m_x += m_lp.inc; - m_y = (m_lp.y1 + m_li.y()) >> line_subpixel_shift; - - if(m_lp.inc > 0) m_di.inc_x(m_y - m_old_y); - else m_di.dec_x(m_y - m_old_y); - - m_old_y = m_y; - - int s1 = m_di.dist() / m_lp.len; - int s2 = -s1; - - if(m_lp.inc < 0) s1 = -s1; - - int dist_start; - int dist_pict; - int dist_end; - int dy; - int dist; - - dist_start = m_di.dist_start(); - dist_pict = m_di.dist_pict() + m_start; - dist_end = m_di.dist_end(); - color_type* p0 = m_colors + max_half_width + 2; - color_type* p1 = p0; - - int npix = 0; - p1->clear(); - if(dist_end > 0) - { - if(dist_start <= 0) - { - m_ren.pixel(p1, dist_pict, s2); - } - ++npix; - } - ++p1; - - dy = 1; - while((dist = m_dist_pos[dy]) - s1 <= m_width) - { - dist_start -= m_di.dx_start(); - dist_pict -= m_di.dx_pict(); - dist_end -= m_di.dx_end(); - p1->clear(); - if(dist_end > 0 && dist_start <= 0) - { - if(m_lp.inc > 0) dist = -dist; - m_ren.pixel(p1, dist_pict, s2 - dist); - ++npix; - } - ++p1; - ++dy; - } - - dy = 1; - dist_start = m_di.dist_start(); - dist_pict = m_di.dist_pict() + m_start; - dist_end = m_di.dist_end(); - while((dist = m_dist_pos[dy]) + s1 <= m_width) - { - dist_start += m_di.dx_start(); - dist_pict += m_di.dx_pict(); - dist_end += m_di.dx_end(); - --p0; - p0->clear(); - if(dist_end > 0 && dist_start <= 0) - { - if(m_lp.inc > 0) dist = -dist; - m_ren.pixel(p0, dist_pict, s2 + dist); - ++npix; - } - ++dy; - } - m_ren.blend_color_vspan(m_x, - m_y - dy + 1, - unsigned(p1 - p0), - p0); - return npix && ++m_step < m_count; - } - - - - //--------------------------------------------------------------------- - bool step_ver() - { - ++m_li; - m_y += m_lp.inc; - m_x = (m_lp.x1 + m_li.y()) >> line_subpixel_shift; - - if(m_lp.inc > 0) m_di.inc_y(m_x - m_old_x); - else m_di.dec_y(m_x - m_old_x); - - m_old_x = m_x; - - int s1 = m_di.dist() / m_lp.len; - int s2 = -s1; - - if(m_lp.inc > 0) s1 = -s1; - - int dist_start; - int dist_pict; - int dist_end; - int dist; - int dx; - - dist_start = m_di.dist_start(); - dist_pict = m_di.dist_pict() + m_start; - dist_end = m_di.dist_end(); - color_type* p0 = m_colors + max_half_width + 2; - color_type* p1 = p0; - - int npix = 0; - p1->clear(); - if(dist_end > 0) - { - if(dist_start <= 0) - { - m_ren.pixel(p1, dist_pict, s2); - } - ++npix; - } - ++p1; - - dx = 1; - while((dist = m_dist_pos[dx]) - s1 <= m_width) - { - dist_start += m_di.dy_start(); - dist_pict += m_di.dy_pict(); - dist_end += m_di.dy_end(); - p1->clear(); - if(dist_end > 0 && dist_start <= 0) - { - if(m_lp.inc > 0) dist = -dist; - m_ren.pixel(p1, dist_pict, s2 + dist); - ++npix; - } - ++p1; - ++dx; - } - - dx = 1; - dist_start = m_di.dist_start(); - dist_pict = m_di.dist_pict() + m_start; - dist_end = m_di.dist_end(); - while((dist = m_dist_pos[dx]) + s1 <= m_width) - { - dist_start -= m_di.dy_start(); - dist_pict -= m_di.dy_pict(); - dist_end -= m_di.dy_end(); - --p0; - p0->clear(); - if(dist_end > 0 && dist_start <= 0) - { - if(m_lp.inc > 0) dist = -dist; - m_ren.pixel(p0, dist_pict, s2 - dist); - ++npix; - } - ++dx; - } - m_ren.blend_color_hspan(m_x - dx + 1, - m_y, - unsigned(p1 - p0), - p0); - return npix && ++m_step < m_count; - } - - - //--------------------------------------------------------------------- - int pattern_end() const { return m_start + m_di.len(); } - - //--------------------------------------------------------------------- - bool vertical() const { return m_lp.vertical; } - int width() const { return m_width; } - int count() const { return m_count; } - - private: - line_interpolator_image(const line_interpolator_image&); - const line_interpolator_image& - operator = (const line_interpolator_image&); - - protected: - const line_parameters& m_lp; - dda2_line_interpolator m_li; - distance_interpolator4 m_di; - renderer_type& m_ren; - int m_plen; - int m_x; - int m_y; - int m_old_x; - int m_old_y; - int m_count; - int m_width; - int m_max_extent; - int m_start; - int m_step; - int m_dist_pos[max_half_width + 1]; - color_type m_colors[max_half_width * 2 + 4]; - }; - - - - - - - - - //===================================================renderer_outline_image - template - class renderer_outline_image - { - public: - //--------------------------------------------------------------------- - typedef BaseRenderer base_ren_type; - typedef renderer_outline_image self_type; - typedef typename base_ren_type::color_type color_type; - typedef ImagePattern pattern_type; - - - //--------------------------------------------------------------------- - renderer_outline_image(base_ren_type& ren, const pattern_type& patt) : - m_ren(&ren), - m_pattern(&patt), - m_start(0), - m_scale_x(1.0), - m_clip_box(0,0,0,0), - m_clipping(false) - {} - void attach(base_ren_type& ren) { m_ren = &ren; } - - //--------------------------------------------------------------------- - void pattern(const pattern_type& p) { m_pattern = &p; } - const pattern_type& pattern() const { return *m_pattern; } - - //--------------------------------------------------------------------- - void reset_clipping() { m_clipping = false; } - void clip_box(double x1, double y1, double x2, double y2) - { - m_clip_box.x1 = line_coord_sat::conv(x1); - m_clip_box.y1 = line_coord_sat::conv(y1); - m_clip_box.x2 = line_coord_sat::conv(x2); - m_clip_box.y2 = line_coord_sat::conv(y2); - m_clipping = true; - } - - //--------------------------------------------------------------------- - void scale_x(double s) { m_scale_x = s; } - double scale_x() const { return m_scale_x; } - - //--------------------------------------------------------------------- - void start_x(double s) { m_start = iround(s * line_subpixel_scale); } - double start_x() const { return double(m_start) / line_subpixel_scale; } - - //--------------------------------------------------------------------- - int subpixel_width() const { return m_pattern->line_width(); } - int pattern_width() const { return m_pattern->pattern_width(); } - double width() const { return double(subpixel_width()) / line_subpixel_scale; } - - //------------------------------------------------------------------------- - void pixel(color_type* p, int x, int y) const - { - m_pattern->pixel(p, x, y); - } - - //------------------------------------------------------------------------- - void blend_color_hspan(int x, int y, unsigned len, const color_type* colors) - { - m_ren->blend_color_hspan(x, y, len, colors, 0); - } - - //------------------------------------------------------------------------- - void blend_color_vspan(int x, int y, unsigned len, const color_type* colors) - { - m_ren->blend_color_vspan(x, y, len, colors, 0); - } - - //------------------------------------------------------------------------- - static bool accurate_join_only() { return true; } - - //------------------------------------------------------------------------- - template - void semidot(Cmp, int, int, int, int) - { - } - - //------------------------------------------------------------------------- - void pie(int, int, int, int, int, int) - { - } - - //------------------------------------------------------------------------- - void line0(const line_parameters&) - { - } - - //------------------------------------------------------------------------- - void line1(const line_parameters&, int, int) - { - } - - //------------------------------------------------------------------------- - void line2(const line_parameters&, int, int) - { - } - - //------------------------------------------------------------------------- - void line3_no_clip(const line_parameters& lp, - int sx, int sy, int ex, int ey) - { - if(lp.len > line_max_length) - { - line_parameters lp1, lp2; - lp.divide(lp1, lp2); - int mx = lp1.x2 + (lp1.y2 - lp1.y1); - int my = lp1.y2 - (lp1.x2 - lp1.x1); - line3_no_clip(lp1, (lp.x1 + sx) >> 1, (lp.y1 + sy) >> 1, mx, my); - line3_no_clip(lp2, mx, my, (lp.x2 + ex) >> 1, (lp.y2 + ey) >> 1); - return; - } - - fix_degenerate_bisectrix_start(lp, &sx, &sy); - fix_degenerate_bisectrix_end(lp, &ex, &ey); - line_interpolator_image li(*this, lp, - sx, sy, - ex, ey, - m_start, m_scale_x); - if(li.vertical()) - { - while(li.step_ver()); - } - else - { - while(li.step_hor()); - } - m_start += uround(lp.len / m_scale_x); - } - - //------------------------------------------------------------------------- - void line3(const line_parameters& lp, - int sx, int sy, int ex, int ey) - { - if(m_clipping) - { - int x1 = lp.x1; - int y1 = lp.y1; - int x2 = lp.x2; - int y2 = lp.y2; - unsigned flags = clip_line_segment(&x1, &y1, &x2, &y2, m_clip_box); - int start = m_start; - if((flags & 4) == 0) - { - if(flags) - { - line_parameters lp2(x1, y1, x2, y2, - uround(calc_distance(x1, y1, x2, y2))); - if(flags & 1) - { - m_start += uround(calc_distance(lp.x1, lp.y1, x1, y1) / m_scale_x); - sx = x1 + (y2 - y1); - sy = y1 - (x2 - x1); - } - else - { - while(abs(sx - lp.x1) + abs(sy - lp.y1) > lp2.len) - { - sx = (lp.x1 + sx) >> 1; - sy = (lp.y1 + sy) >> 1; - } - } - if(flags & 2) - { - ex = x2 + (y2 - y1); - ey = y2 - (x2 - x1); - } - else - { - while(abs(ex - lp.x2) + abs(ey - lp.y2) > lp2.len) - { - ex = (lp.x2 + ex) >> 1; - ey = (lp.y2 + ey) >> 1; - } - } - line3_no_clip(lp2, sx, sy, ex, ey); - } - else - { - line3_no_clip(lp, sx, sy, ex, ey); - } - } - m_start = start + uround(lp.len / m_scale_x); - } - else - { - line3_no_clip(lp, sx, sy, ex, ey); - } - } - - private: - base_ren_type* m_ren; - const pattern_type* m_pattern; - int m_start; - double m_scale_x; - rect_i m_clip_box; - bool m_clipping; - }; - - - - - -} - - - -#endif diff --git a/uppdev/aggdraw/agg_renderer_primitives.h b/uppdev/aggdraw/agg_renderer_primitives.h deleted file mode 100644 index d999f8b56..000000000 --- a/uppdev/aggdraw/agg_renderer_primitives.h +++ /dev/null @@ -1,229 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_RENDERER_PRIMITIVES_INCLUDED -#define AGG_RENDERER_PRIMITIVES_INCLUDED - -#include "agg_basics.h" -#include "agg_renderer_base.h" -#include "agg_dda_line.h" -#include "agg_ellipse_bresenham.h" - -namespace agg -{ - //-----------------------------------------------------renderer_primitives - template class renderer_primitives - { - public: - typedef BaseRenderer base_ren_type; - typedef typename base_ren_type::color_type color_type; - - //-------------------------------------------------------------------- - explicit renderer_primitives(base_ren_type& ren) : - m_ren(&ren), - m_fill_color(), - m_line_color(), - m_curr_x(0), - m_curr_y(0) - {} - void attach(base_ren_type& ren) { m_ren = &ren; } - - //-------------------------------------------------------------------- - static int coord(double c) - { - return iround(c * line_bresenham_interpolator::subpixel_scale); - } - - //-------------------------------------------------------------------- - void fill_color(const color_type& c) { m_fill_color = c; } - void line_color(const color_type& c) { m_line_color = c; } - const color_type& fill_color() const { return m_fill_color; } - const color_type& line_color() const { return m_line_color; } - - //-------------------------------------------------------------------- - void rectangle(int x1, int y1, int x2, int y2) - { - m_ren->blend_hline(x1, y1, x2-1, m_line_color, cover_full); - m_ren->blend_vline(x2, y1, y2-1, m_line_color, cover_full); - m_ren->blend_hline(x1+1, y2, x2, m_line_color, cover_full); - m_ren->blend_vline(x1, y1+1, y2, m_line_color, cover_full); - } - - //-------------------------------------------------------------------- - void solid_rectangle(int x1, int y1, int x2, int y2) - { - m_ren->blend_bar(x1, y1, x2, y2, m_fill_color, cover_full); - } - - //-------------------------------------------------------------------- - void outlined_rectangle(int x1, int y1, int x2, int y2) - { - rectangle(x1, y1, x2, y2); - m_ren->blend_bar(x1+1, y1+1, x2-1, y2-1, m_fill_color, cover_full); - } - - //-------------------------------------------------------------------- - void ellipse(int x, int y, int rx, int ry) - { - ellipse_bresenham_interpolator ei(rx, ry); - int dx = 0; - int dy = -ry; - do - { - dx += ei.dx(); - dy += ei.dy(); - m_ren->blend_pixel(x + dx, y + dy, m_line_color, cover_full); - m_ren->blend_pixel(x + dx, y - dy, m_line_color, cover_full); - m_ren->blend_pixel(x - dx, y - dy, m_line_color, cover_full); - m_ren->blend_pixel(x - dx, y + dy, m_line_color, cover_full); - ++ei; - } - while(dy < 0); - } - - //-------------------------------------------------------------------- - void solid_ellipse(int x, int y, int rx, int ry) - { - ellipse_bresenham_interpolator ei(rx, ry); - int dx = 0; - int dy = -ry; - int dy0 = dy; - int dx0 = dx; - - do - { - dx += ei.dx(); - dy += ei.dy(); - - if(dy != dy0) - { - m_ren->blend_hline(x-dx0, y+dy0, x+dx0, m_fill_color, cover_full); - m_ren->blend_hline(x-dx0, y-dy0, x+dx0, m_fill_color, cover_full); - } - dx0 = dx; - dy0 = dy; - ++ei; - } - while(dy < 0); - m_ren->blend_hline(x-dx0, y+dy0, x+dx0, m_fill_color, cover_full); - } - - //-------------------------------------------------------------------- - void outlined_ellipse(int x, int y, int rx, int ry) - { - ellipse_bresenham_interpolator ei(rx, ry); - int dx = 0; - int dy = -ry; - - do - { - dx += ei.dx(); - dy += ei.dy(); - - m_ren->blend_pixel(x + dx, y + dy, m_line_color, cover_full); - m_ren->blend_pixel(x + dx, y - dy, m_line_color, cover_full); - m_ren->blend_pixel(x - dx, y - dy, m_line_color, cover_full); - m_ren->blend_pixel(x - dx, y + dy, m_line_color, cover_full); - - if(ei.dy() && dx) - { - m_ren->blend_hline(x-dx+1, y+dy, x+dx-1, m_fill_color, cover_full); - m_ren->blend_hline(x-dx+1, y-dy, x+dx-1, m_fill_color, cover_full); - } - ++ei; - } - while(dy < 0); - } - - //-------------------------------------------------------------------- - void line(int x1, int y1, int x2, int y2, bool last=false) - { - line_bresenham_interpolator li(x1, y1, x2, y2); - - unsigned len = li.len(); - if(len == 0) - { - if(last) - { - m_ren->blend_pixel(li.line_lr(x1), li.line_lr(y1), m_line_color, cover_full); - } - return; - } - - if(last) ++len; - - if(li.is_ver()) - { - do - { - m_ren->blend_pixel(li.x2(), li.y1(), m_line_color, cover_full); - li.vstep(); - } - while(--len); - } - else - { - do - { - m_ren->blend_pixel(li.x1(), li.y2(), m_line_color, cover_full); - li.hstep(); - } - while(--len); - } - } - - //-------------------------------------------------------------------- - void move_to(int x, int y) - { - m_curr_x = x; - m_curr_y = y; - } - - //-------------------------------------------------------------------- - void line_to(int x, int y, bool last=false) - { - line(m_curr_x, m_curr_y, x, y, last); - m_curr_x = x; - m_curr_y = y; - } - - //-------------------------------------------------------------------- - const base_ren_type& ren() const { return *m_ren; } - base_ren_type& ren() { return *m_ren; } - - //-------------------------------------------------------------------- - const rendering_buffer& rbuf() const { return m_ren->rbuf(); } - rendering_buffer& rbuf() { return m_ren->rbuf(); } - - private: - base_ren_type* m_ren; - color_type m_fill_color; - color_type m_line_color; - int m_curr_x; - int m_curr_y; - }; - -} - -#endif diff --git a/uppdev/aggdraw/agg_renderer_raster_text.h b/uppdev/aggdraw/agg_renderer_raster_text.h deleted file mode 100644 index 304554250..000000000 --- a/uppdev/aggdraw/agg_renderer_raster_text.h +++ /dev/null @@ -1,273 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_RENDERER_RASTER_TEXT_INCLUDED -#define AGG_RENDERER_RASTER_TEXT_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - - //==============================================renderer_raster_htext_solid - template - class renderer_raster_htext_solid - { - public: - typedef BaseRenderer ren_type; - typedef GlyphGenerator glyph_gen_type; - typedef typename glyph_gen_type::glyph_rect glyph_rect; - typedef typename ren_type::color_type color_type; - - renderer_raster_htext_solid(ren_type& ren, glyph_gen_type& glyph) : - m_ren(&ren), - m_glyph(&glyph) - {} - void attach(ren_type& ren) { m_ren = &ren; } - - //-------------------------------------------------------------------- - void color(const color_type& c) { m_color = c; } - const color_type& color() const { return m_color; } - - //-------------------------------------------------------------------- - template - void render_text(double x, double y, const CharT* str, bool flip=false) - { - glyph_rect r; - while(*str) - { - m_glyph->prepare(&r, x, y, *str, flip); - if(r.x2 >= r.x1) - { - int i; - if(flip) - { - for(i = r.y1; i <= r.y2; i++) - { - m_ren->blend_solid_hspan(r.x1, i, (r.x2 - r.x1 + 1), - m_color, - m_glyph->span(r.y2 - i)); - } - } - else - { - for(i = r.y1; i <= r.y2; i++) - { - m_ren->blend_solid_hspan(r.x1, i, (r.x2 - r.x1 + 1), - m_color, - m_glyph->span(i - r.y1)); - } - } - } - x += r.dx; - y += r.dy; - ++str; - } - } - - private: - ren_type* m_ren; - glyph_gen_type* m_glyph; - color_type m_color; - }; - - - - //=============================================renderer_raster_vtext_solid - template - class renderer_raster_vtext_solid - { - public: - typedef BaseRenderer ren_type; - typedef GlyphGenerator glyph_gen_type; - typedef typename glyph_gen_type::glyph_rect glyph_rect; - typedef typename ren_type::color_type color_type; - - renderer_raster_vtext_solid(ren_type& ren, glyph_gen_type& glyph) : - m_ren(&ren), - m_glyph(&glyph) - { - } - - //-------------------------------------------------------------------- - void color(const color_type& c) { m_color = c; } - const color_type& color() const { return m_color; } - - //-------------------------------------------------------------------- - template - void render_text(double x, double y, const CharT* str, bool flip=false) - { - glyph_rect r; - while(*str) - { - m_glyph->prepare(&r, x, y, *str, !flip); - if(r.x2 >= r.x1) - { - int i; - if(flip) - { - for(i = r.y1; i <= r.y2; i++) - { - m_ren->blend_solid_vspan(i, r.x1, (r.x2 - r.x1 + 1), - m_color, - m_glyph->span(i - r.y1)); - } - } - else - { - for(i = r.y1; i <= r.y2; i++) - { - m_ren->blend_solid_vspan(i, r.x1, (r.x2 - r.x1 + 1), - m_color, - m_glyph->span(r.y2 - i)); - } - } - } - x += r.dx; - y += r.dy; - ++str; - } - } - - private: - ren_type* m_ren; - glyph_gen_type* m_glyph; - color_type m_color; - }; - - - - - - - //===================================================renderer_raster_htext - template - class renderer_raster_htext - { - public: - typedef ScanlineRenderer ren_type; - typedef GlyphGenerator glyph_gen_type; - typedef typename glyph_gen_type::glyph_rect glyph_rect; - - class scanline_single_span - { - public: - typedef agg::cover_type cover_type; - - //---------------------------------------------------------------- - struct const_span - { - int x; - unsigned len; - const cover_type* covers; - - const_span() {} - const_span(int x_, unsigned len_, const cover_type* covers_) : - x(x_), len(len_), covers(covers_) - {} - }; - - typedef const const_span* const_iterator; - - //---------------------------------------------------------------- - scanline_single_span(int x, int y, unsigned len, - const cover_type* covers) : - m_y(y), - m_span(x, len, covers) - {} - - //---------------------------------------------------------------- - int y() const { return m_y; } - unsigned num_spans() const { return 1; } - const_iterator begin() const { return &m_span; } - - private: - //---------------------------------------------------------------- - int m_y; - const_span m_span; - }; - - - - //-------------------------------------------------------------------- - renderer_raster_htext(ren_type& ren, glyph_gen_type& glyph) : - m_ren(&ren), - m_glyph(&glyph) - { - } - - - //-------------------------------------------------------------------- - template - void render_text(double x, double y, const CharT* str, bool flip=false) - { - glyph_rect r; - while(*str) - { - m_glyph->prepare(&r, x, y, *str, flip); - if(r.x2 >= r.x1) - { - m_ren->prepare(); - int i; - if(flip) - { - for(i = r.y1; i <= r.y2; i++) - { - m_ren->render( - scanline_single_span(r.x1, - i, - (r.x2 - r.x1 + 1), - m_glyph->span(r.y2 - i))); - } - } - else - { - for(i = r.y1; i <= r.y2; i++) - { - m_ren->render( - scanline_single_span(r.x1, - i, - (r.x2 - r.x1 + 1), - m_glyph->span(i - r.y1))); - } - } - } - x += r.dx; - y += r.dy; - ++str; - } - } - - private: - ren_type* m_ren; - glyph_gen_type* m_glyph; - }; - - - - -} - -#endif - diff --git a/uppdev/aggdraw/agg_renderer_scanline.h b/uppdev/aggdraw/agg_renderer_scanline.h deleted file mode 100644 index c0b6df6f8..000000000 --- a/uppdev/aggdraw/agg_renderer_scanline.h +++ /dev/null @@ -1,861 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_RENDERER_SCANLINE_INCLUDED -#define AGG_RENDERER_SCANLINE_INCLUDED - -#include "agg_basics.h" -#include "agg_renderer_base.h" - -namespace agg -{ - - //================================================render_scanline_aa_solid - template - void render_scanline_aa_solid(const Scanline& sl, - BaseRenderer& ren, - const ColorT& color) - { - int y = sl.y(); - unsigned num_spans = sl.num_spans(); - typename Scanline::const_iterator span = sl.begin(); - - for(;;) - { - int x = span->x; - if(span->len > 0) - { - ren.blend_solid_hspan(x, y, (unsigned)span->len, - color, - span->covers); - } - else - { - ren.blend_hline(x, y, (unsigned)(x - span->len - 1), - color, - *(span->covers)); - } - if(--num_spans == 0) break; - ++span; - } - } - - //===============================================render_scanlines_aa_solid - template - void render_scanlines_aa_solid(Rasterizer& ras, Scanline& sl, - BaseRenderer& ren, const ColorT& color) - { - if(ras.rewind_scanlines()) - { - // Explicitly convert "color" to the BaseRenderer color type. - // For example, it can be called with color type "rgba", while - // "rgba8" is needed. Otherwise it will be implicitly - // converted in the loop many times. - //---------------------- - typename BaseRenderer::color_type ren_color(color); - - sl.reset(ras.min_x(), ras.max_x()); - while(ras.sweep_scanline(sl)) - { - //render_scanline_aa_solid(sl, ren, ren_color); - - // This code is equivalent to the above call (copy/paste). - // It's just a "manual" optimization for old compilers, - // like Microsoft Visual C++ v6.0 - //------------------------------- - int y = sl.y(); - unsigned num_spans = sl.num_spans(); - typename Scanline::const_iterator span = sl.begin(); - - for(;;) - { - int x = span->x; - if(span->len > 0) - { - ren.blend_solid_hspan(x, y, (unsigned)span->len, - ren_color, - span->covers); - } - else - { - ren.blend_hline(x, y, (unsigned)(x - span->len - 1), - ren_color, - *(span->covers)); - } - if(--num_spans == 0) break; - ++span; - } - } - } - } - - //==============================================renderer_scanline_aa_solid - template class renderer_scanline_aa_solid - { - public: - typedef BaseRenderer base_ren_type; - typedef typename base_ren_type::color_type color_type; - - //-------------------------------------------------------------------- - renderer_scanline_aa_solid() : m_ren(0) {} - explicit renderer_scanline_aa_solid(base_ren_type& ren) : m_ren(&ren) {} - void attach(base_ren_type& ren) - { - m_ren = &ren; - } - - //-------------------------------------------------------------------- - void color(const color_type& c) { m_color = c; } - const color_type& color() const { return m_color; } - - //-------------------------------------------------------------------- - void prepare() {} - - //-------------------------------------------------------------------- - template void render(const Scanline& sl) - { - render_scanline_aa_solid(sl, *m_ren, m_color); - } - - private: - base_ren_type* m_ren; - color_type m_color; - }; - - - - - - - - - - - - - - //======================================================render_scanline_aa - template - void render_scanline_aa(const Scanline& sl, BaseRenderer& ren, - SpanAllocator& alloc, SpanGenerator& span_gen) - { - int y = sl.y(); - - unsigned num_spans = sl.num_spans(); - typename Scanline::const_iterator span = sl.begin(); - for(;;) - { - int x = span->x; - int len = span->len; - const typename Scanline::cover_type* covers = span->covers; - - if(len < 0) len = -len; - typename BaseRenderer::color_type* colors = alloc.allocate(len); - span_gen.generate(colors, x, y, len); - ren.blend_color_hspan(x, y, len, colors, - (span->len < 0) ? 0 : covers, *covers); - - if(--num_spans == 0) break; - ++span; - } - } - - //=====================================================render_scanlines_aa - template - void render_scanlines_aa(Rasterizer& ras, Scanline& sl, BaseRenderer& ren, - SpanAllocator& alloc, SpanGenerator& span_gen) - { - if(ras.rewind_scanlines()) - { - sl.reset(ras.min_x(), ras.max_x()); - span_gen.prepare(); - while(ras.sweep_scanline(sl)) - { - render_scanline_aa(sl, ren, alloc, span_gen); - } - } - } - - //====================================================renderer_scanline_aa - template - class renderer_scanline_aa - { - public: - typedef BaseRenderer base_ren_type; - typedef SpanAllocator alloc_type; - typedef SpanGenerator span_gen_type; - - //-------------------------------------------------------------------- - renderer_scanline_aa() : m_ren(0), m_alloc(0), m_span_gen(0) {} - renderer_scanline_aa(base_ren_type& ren, - alloc_type& alloc, - span_gen_type& span_gen) : - m_ren(&ren), - m_alloc(&alloc), - m_span_gen(&span_gen) - {} - void attach(base_ren_type& ren, - alloc_type& alloc, - span_gen_type& span_gen) - { - m_ren = &ren; - m_alloc = &alloc; - m_span_gen = &span_gen; - } - - //-------------------------------------------------------------------- - void prepare() { m_span_gen->prepare(); } - - //-------------------------------------------------------------------- - template void render(const Scanline& sl) - { - render_scanline_aa(sl, *m_ren, *m_alloc, *m_span_gen); - } - - private: - base_ren_type* m_ren; - alloc_type* m_alloc; - span_gen_type* m_span_gen; - }; - - - - - - - //===============================================render_scanline_bin_solid - template - void render_scanline_bin_solid(const Scanline& sl, - BaseRenderer& ren, - const ColorT& color) - { - unsigned num_spans = sl.num_spans(); - typename Scanline::const_iterator span = sl.begin(); - for(;;) - { - ren.blend_hline(span->x, - sl.y(), - span->x - 1 + ((span->len < 0) ? - -span->len : - span->len), - color, - cover_full); - if(--num_spans == 0) break; - ++span; - } - } - - //==============================================render_scanlines_bin_solid - template - void render_scanlines_bin_solid(Rasterizer& ras, Scanline& sl, - BaseRenderer& ren, const ColorT& color) - { - if(ras.rewind_scanlines()) - { - // Explicitly convert "color" to the BaseRenderer color type. - // For example, it can be called with color type "rgba", while - // "rgba8" is needed. Otherwise it will be implicitly - // converted in the loop many times. - //---------------------- - typename BaseRenderer::color_type ren_color(color); - - sl.reset(ras.min_x(), ras.max_x()); - while(ras.sweep_scanline(sl)) - { - //render_scanline_bin_solid(sl, ren, ren_color); - - // This code is equivalent to the above call (copy/paste). - // It's just a "manual" optimization for old compilers, - // like Microsoft Visual C++ v6.0 - //------------------------------- - unsigned num_spans = sl.num_spans(); - typename Scanline::const_iterator span = sl.begin(); - for(;;) - { - ren.blend_hline(span->x, - sl.y(), - span->x - 1 + ((span->len < 0) ? - -span->len : - span->len), - ren_color, - cover_full); - if(--num_spans == 0) break; - ++span; - } - } - } - } - - //=============================================renderer_scanline_bin_solid - template class renderer_scanline_bin_solid - { - public: - typedef BaseRenderer base_ren_type; - typedef typename base_ren_type::color_type color_type; - - //-------------------------------------------------------------------- - renderer_scanline_bin_solid() : m_ren(0) {} - explicit renderer_scanline_bin_solid(base_ren_type& ren) : m_ren(&ren) {} - void attach(base_ren_type& ren) - { - m_ren = &ren; - } - - //-------------------------------------------------------------------- - void color(const color_type& c) { m_color = c; } - const color_type& color() const { return m_color; } - - //-------------------------------------------------------------------- - void prepare() {} - - //-------------------------------------------------------------------- - template void render(const Scanline& sl) - { - render_scanline_bin_solid(sl, *m_ren, m_color); - } - - private: - base_ren_type* m_ren; - color_type m_color; - }; - - - - - - - - - //======================================================render_scanline_bin - template - void render_scanline_bin(const Scanline& sl, BaseRenderer& ren, - SpanAllocator& alloc, SpanGenerator& span_gen) - { - int y = sl.y(); - - unsigned num_spans = sl.num_spans(); - typename Scanline::const_iterator span = sl.begin(); - for(;;) - { - int x = span->x; - int len = span->len; - if(len < 0) len = -len; - typename BaseRenderer::color_type* colors = alloc.allocate(len); - span_gen.generate(colors, x, y, len); - ren.blend_color_hspan(x, y, len, colors, 0, cover_full); - if(--num_spans == 0) break; - ++span; - } - } - - //=====================================================render_scanlines_bin - template - void render_scanlines_bin(Rasterizer& ras, Scanline& sl, BaseRenderer& ren, - SpanAllocator& alloc, SpanGenerator& span_gen) - { - if(ras.rewind_scanlines()) - { - sl.reset(ras.min_x(), ras.max_x()); - span_gen.prepare(); - while(ras.sweep_scanline(sl)) - { - render_scanline_bin(sl, ren, alloc, span_gen); - } - } - } - - //====================================================renderer_scanline_bin - template - class renderer_scanline_bin - { - public: - typedef BaseRenderer base_ren_type; - typedef SpanAllocator alloc_type; - typedef SpanGenerator span_gen_type; - - //-------------------------------------------------------------------- - renderer_scanline_bin() : m_ren(0), m_alloc(0), m_span_gen(0) {} - renderer_scanline_bin(base_ren_type& ren, - alloc_type& alloc, - span_gen_type& span_gen) : - m_ren(&ren), - m_alloc(&alloc), - m_span_gen(&span_gen) - {} - void attach(base_ren_type& ren, - alloc_type& alloc, - span_gen_type& span_gen) - { - m_ren = &ren; - m_alloc = &alloc; - m_span_gen = &span_gen; - } - - //-------------------------------------------------------------------- - void prepare() { m_span_gen->prepare(); } - - //-------------------------------------------------------------------- - template void render(const Scanline& sl) - { - render_scanline_bin(sl, *m_ren, *m_alloc, *m_span_gen); - } - - private: - base_ren_type* m_ren; - alloc_type* m_alloc; - span_gen_type* m_span_gen; - }; - - - - - - - - - - - //========================================================render_scanlines - template - void render_scanlines(Rasterizer& ras, Scanline& sl, Renderer& ren) - { - if(ras.rewind_scanlines()) - { - sl.reset(ras.min_x(), ras.max_x()); - ren.prepare(); - while(ras.sweep_scanline(sl)) - { - ren.render(sl); - } - } - } - - //========================================================render_all_paths - template - void render_all_paths(Rasterizer& ras, - Scanline& sl, - Renderer& r, - VertexSource& vs, - const ColorStorage& as, - const PathId& path_id, - unsigned num_paths) - { - for(unsigned i = 0; i < num_paths; i++) - { - ras.reset(); - ras.add_path(vs, path_id[i]); - r.color(as[i]); - render_scanlines(ras, sl, r); - } - } - - - - - - - //=============================================render_scanlines_compound - template - void render_scanlines_compound(Rasterizer& ras, - ScanlineAA& sl_aa, - ScanlineBin& sl_bin, - BaseRenderer& ren, - SpanAllocator& alloc, - StyleHandler& sh) - { - if(ras.rewind_scanlines()) - { - int min_x = ras.min_x(); - int len = ras.max_x() - min_x + 2; - sl_aa.reset(min_x, ras.max_x()); - sl_bin.reset(min_x, ras.max_x()); - - typedef typename BaseRenderer::color_type color_type; - color_type* color_span = alloc.allocate(len * 2); - color_type* mix_buffer = color_span + len; - unsigned num_spans; - - unsigned num_styles; - unsigned style; - bool solid; - while((num_styles = ras.sweep_styles()) > 0) - { - typename ScanlineAA::const_iterator span_aa; - if(num_styles == 1) - { - // Optimization for a single style. Happens often - //------------------------- - if(ras.sweep_scanline(sl_aa, 0)) - { - style = ras.style(0); - if(sh.is_solid(style)) - { - // Just solid fill - //----------------------- - render_scanline_aa_solid(sl_aa, ren, sh.color(style)); - } - else - { - // Arbitrary span generator - //----------------------- - span_aa = sl_aa.begin(); - num_spans = sl_aa.num_spans(); - for(;;) - { - len = span_aa->len; - sh.generate_span(color_span, - span_aa->x, - sl_aa.y(), - len, - style); - - ren.blend_color_hspan(span_aa->x, - sl_aa.y(), - span_aa->len, - color_span, - span_aa->covers); - if(--num_spans == 0) break; - ++span_aa; - } - } - } - } - else - { - if(ras.sweep_scanline(sl_bin, -1)) - { - // Clear the spans of the mix_buffer - //-------------------- - typename ScanlineBin::const_iterator span_bin = sl_bin.begin(); - num_spans = sl_bin.num_spans(); - for(;;) - { - memset(mix_buffer + span_bin->x - min_x, - 0, - span_bin->len * sizeof(color_type)); - - if(--num_spans == 0) break; - ++span_bin; - } - - unsigned i; - for(i = 0; i < num_styles; i++) - { - style = ras.style(i); - solid = sh.is_solid(style); - - if(ras.sweep_scanline(sl_aa, i)) - { - color_type* colors; - color_type* cspan; - typename ScanlineAA::cover_type* covers; - span_aa = sl_aa.begin(); - num_spans = sl_aa.num_spans(); - if(solid) - { - // Just solid fill - //----------------------- - for(;;) - { - color_type c = sh.color(style); - len = span_aa->len; - colors = mix_buffer + span_aa->x - min_x; - covers = span_aa->covers; - do - { - if(*covers == cover_full) - { - *colors = c; - } - else - { - colors->add(c, *covers); - } - ++colors; - ++covers; - } - while(--len); - if(--num_spans == 0) break; - ++span_aa; - } - } - else - { - // Arbitrary span generator - //----------------------- - for(;;) - { - len = span_aa->len; - colors = mix_buffer + span_aa->x - min_x; - cspan = color_span; - sh.generate_span(cspan, - span_aa->x, - sl_aa.y(), - len, - style); - covers = span_aa->covers; - do - { - if(*covers == cover_full) - { - *colors = *cspan; - } - else - { - colors->add(*cspan, *covers); - } - ++cspan; - ++colors; - ++covers; - } - while(--len); - if(--num_spans == 0) break; - ++span_aa; - } - } - } - } - - // Emit the blended result as a color hspan - //------------------------- - span_bin = sl_bin.begin(); - num_spans = sl_bin.num_spans(); - for(;;) - { - ren.blend_color_hspan(span_bin->x, - sl_bin.y(), - span_bin->len, - mix_buffer + span_bin->x - min_x, - 0, - cover_full); - if(--num_spans == 0) break; - ++span_bin; - } - } // if(ras.sweep_scanline(sl_bin, -1)) - } // if(num_styles == 1) ... else - } // while((num_styles = ras.sweep_styles()) > 0) - } // if(ras.rewind_scanlines()) - } - - //=======================================render_scanlines_compound_layered - template - void render_scanlines_compound_layered(Rasterizer& ras, - ScanlineAA& sl_aa, - BaseRenderer& ren, - SpanAllocator& alloc, - StyleHandler& sh) - { - if(ras.rewind_scanlines()) - { - int min_x = ras.min_x(); - int len = ras.max_x() - min_x + 2; - sl_aa.reset(min_x, ras.max_x()); - - typedef typename BaseRenderer::color_type color_type; - color_type* color_span = alloc.allocate(len * 2); - color_type* mix_buffer = color_span + len; - cover_type* cover_buffer = ras.allocate_cover_buffer(len); - unsigned num_spans; - - unsigned num_styles; - unsigned style; - bool solid; - while((num_styles = ras.sweep_styles()) > 0) - { - typename ScanlineAA::const_iterator span_aa; - if(num_styles == 1) - { - // Optimization for a single style. Happens often - //------------------------- - if(ras.sweep_scanline(sl_aa, 0)) - { - style = ras.style(0); - if(sh.is_solid(style)) - { - // Just solid fill - //----------------------- - render_scanline_aa_solid(sl_aa, ren, sh.color(style)); - } - else - { - // Arbitrary span generator - //----------------------- - span_aa = sl_aa.begin(); - num_spans = sl_aa.num_spans(); - for(;;) - { - len = span_aa->len; - sh.generate_span(color_span, - span_aa->x, - sl_aa.y(), - len, - style); - - ren.blend_color_hspan(span_aa->x, - sl_aa.y(), - span_aa->len, - color_span, - span_aa->covers); - if(--num_spans == 0) break; - ++span_aa; - } - } - } - } - else - { - int sl_start = ras.scanline_start(); - unsigned sl_len = ras.scanline_length(); - - if(sl_len) - { - memset(mix_buffer + sl_start - min_x, - 0, - sl_len * sizeof(color_type)); - - memset(cover_buffer + sl_start - min_x, - 0, - sl_len * sizeof(cover_type)); - - int sl_y = 0x7FFFFFFF; - unsigned i; - for(i = 0; i < num_styles; i++) - { - style = ras.style(i); - solid = sh.is_solid(style); - - if(ras.sweep_scanline(sl_aa, i)) - { - unsigned cover; - color_type* colors; - color_type* cspan; - cover_type* src_covers; - cover_type* dst_covers; - span_aa = sl_aa.begin(); - num_spans = sl_aa.num_spans(); - sl_y = sl_aa.y(); - if(solid) - { - // Just solid fill - //----------------------- - for(;;) - { - color_type c = sh.color(style); - len = span_aa->len; - colors = mix_buffer + span_aa->x - min_x; - src_covers = span_aa->covers; - dst_covers = cover_buffer + span_aa->x - min_x; - do - { - cover = *src_covers; - if(*dst_covers + cover > cover_full) - { - cover = cover_full - *dst_covers; - } - if(cover) - { - colors->add(c, cover); - *dst_covers += cover; - } - ++colors; - ++src_covers; - ++dst_covers; - } - while(--len); - if(--num_spans == 0) break; - ++span_aa; - } - } - else - { - // Arbitrary span generator - //----------------------- - for(;;) - { - len = span_aa->len; - colors = mix_buffer + span_aa->x - min_x; - cspan = color_span; - sh.generate_span(cspan, - span_aa->x, - sl_aa.y(), - len, - style); - src_covers = span_aa->covers; - dst_covers = cover_buffer + span_aa->x - min_x; - do - { - cover = *src_covers; - if(*dst_covers + cover > cover_full) - { - cover = cover_full - *dst_covers; - } - if(cover) - { - colors->add(*cspan, cover); - *dst_covers += cover; - } - ++cspan; - ++colors; - ++src_covers; - ++dst_covers; - } - while(--len); - if(--num_spans == 0) break; - ++span_aa; - } - } - } - } - ren.blend_color_hspan(sl_start, - sl_y, - sl_len, - mix_buffer + sl_start - min_x, - 0, - cover_full); - } //if(sl_len) - } //if(num_styles == 1) ... else - } //while((num_styles = ras.sweep_styles()) > 0) - } //if(ras.rewind_scanlines()) - } - - -} - -#endif diff --git a/uppdev/aggdraw/agg_rendering_buffer.h b/uppdev/aggdraw/agg_rendering_buffer.h deleted file mode 100644 index 5a06c8a00..000000000 --- a/uppdev/aggdraw/agg_rendering_buffer.h +++ /dev/null @@ -1,305 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_RENDERING_BUFFER_INCLUDED -#define AGG_RENDERING_BUFFER_INCLUDED - -#include "agg_array.h" - -namespace agg -{ - - //===========================================================row_accessor - template class row_accessor - { - public: - typedef const_row_info row_data; - - //------------------------------------------------------------------- - row_accessor() : - m_buf(0), - m_start(0), - m_width(0), - m_height(0), - m_stride(0) - { - } - - //-------------------------------------------------------------------- - row_accessor(T* buf, unsigned width, unsigned height, int stride) : - m_buf(0), - m_start(0), - m_width(0), - m_height(0), - m_stride(0) - { - attach(buf, width, height, stride); - } - - - //-------------------------------------------------------------------- - void attach(T* buf, unsigned width, unsigned height, int stride) - { - m_buf = m_start = buf; - m_width = width; - m_height = height; - m_stride = stride; - if(stride < 0) - { - m_start = m_buf - int(height - 1) * stride; - } - } - - //-------------------------------------------------------------------- - AGG_INLINE T* buf() { return m_buf; } - AGG_INLINE const T* buf() const { return m_buf; } - AGG_INLINE unsigned width() const { return m_width; } - AGG_INLINE unsigned height() const { return m_height; } - AGG_INLINE int stride() const { return m_stride; } - AGG_INLINE unsigned stride_abs() const - { - return (m_stride < 0) ? unsigned(-m_stride) : unsigned(m_stride); - } - - //-------------------------------------------------------------------- - AGG_INLINE T* row_ptr(int, int y, unsigned) - { - return m_start + y * m_stride; - } - AGG_INLINE T* row_ptr(int y) { return m_start + y * m_stride; } - AGG_INLINE const T* row_ptr(int y) const { return m_start + y * m_stride; } - AGG_INLINE row_data row (int y) const - { - return row_data(0, m_width-1, row_ptr(y)); - } - - //-------------------------------------------------------------------- - template - void copy_from(const RenBuf& src) - { - unsigned h = height(); - if(src.height() < h) h = src.height(); - - unsigned l = stride_abs(); - if(src.stride_abs() < l) l = src.stride_abs(); - - l *= sizeof(T); - - unsigned y; - unsigned w = width(); - for (y = 0; y < h; y++) - { - memcpy(row_ptr(0, y, w), src.row_ptr(y), l); - } - } - - //-------------------------------------------------------------------- - void clear(T value) - { - unsigned y; - unsigned w = width(); - unsigned stride = stride_abs(); - for(y = 0; y < height(); y++) - { - T* p = row_ptr(0, y, w); - unsigned x; - for(x = 0; x < stride; x++) - { - *p++ = value; - } - } - } - - private: - //-------------------------------------------------------------------- - T* m_buf; // Pointer to renrdering buffer - T* m_start; // Pointer to first pixel depending on stride - unsigned m_width; // Width in pixels - unsigned m_height; // Height in pixels - int m_stride; // Number of bytes per row. Can be < 0 - }; - - - - - //==========================================================row_ptr_cache - template class row_ptr_cache - { - public: - typedef const_row_info row_data; - - //------------------------------------------------------------------- - row_ptr_cache() : - m_buf(0), - m_rows(), - m_width(0), - m_height(0), - m_stride(0) - { - } - - //-------------------------------------------------------------------- - row_ptr_cache(T* buf, unsigned width, unsigned height, int stride) : - m_buf(0), - m_rows(), - m_width(0), - m_height(0), - m_stride(0) - { - attach(buf, width, height, stride); - } - - //-------------------------------------------------------------------- - void attach(T* buf, unsigned width, unsigned height, int stride) - { - m_buf = buf; - m_width = width; - m_height = height; - m_stride = stride; - if(height > m_rows.size()) - { - m_rows.resize(height); - } - - T* row_ptr = m_buf; - - if(stride < 0) - { - row_ptr = m_buf - int(height - 1) * stride; - } - - T** rows = &m_rows[0]; - - while(height--) - { - *rows++ = row_ptr; - row_ptr += stride; - } - } - - //-------------------------------------------------------------------- - AGG_INLINE T* buf() { return m_buf; } - AGG_INLINE const T* buf() const { return m_buf; } - AGG_INLINE unsigned width() const { return m_width; } - AGG_INLINE unsigned height() const { return m_height; } - AGG_INLINE int stride() const { return m_stride; } - AGG_INLINE unsigned stride_abs() const - { - return (m_stride < 0) ? unsigned(-m_stride) : unsigned(m_stride); - } - - //-------------------------------------------------------------------- - AGG_INLINE T* row_ptr(int, int y, unsigned) - { - return m_rows[y]; - } - AGG_INLINE T* row_ptr(int y) { return m_rows[y]; } - AGG_INLINE const T* row_ptr(int y) const { return m_rows[y]; } - AGG_INLINE row_data row (int y) const - { - return row_data(0, m_width-1, m_rows[y]); - } - - //-------------------------------------------------------------------- - T const* const* rows() const { return &m_rows[0]; } - - //-------------------------------------------------------------------- - template - void copy_from(const RenBuf& src) - { - unsigned h = height(); - if(src.height() < h) h = src.height(); - - unsigned l = stride_abs(); - if(src.stride_abs() < l) l = src.stride_abs(); - - l *= sizeof(T); - - unsigned y; - unsigned w = width(); - for (y = 0; y < h; y++) - { - memcpy(row_ptr(0, y, w), src.row_ptr(y), l); - } - } - - //-------------------------------------------------------------------- - void clear(T value) - { - unsigned y; - unsigned w = width(); - unsigned stride = stride_abs(); - for(y = 0; y < height(); y++) - { - T* p = row_ptr(0, y, w); - unsigned x; - for(x = 0; x < stride; x++) - { - *p++ = value; - } - } - } - - private: - //-------------------------------------------------------------------- - T* m_buf; // Pointer to renrdering buffer - pod_array m_rows; // Pointers to each row of the buffer - unsigned m_width; // Width in pixels - unsigned m_height; // Height in pixels - int m_stride; // Number of bytes per row. Can be < 0 - }; - - - - - //========================================================rendering_buffer - // - // The definition of the main type for accessing the rows in the frame - // buffer. It provides functionality to navigate to the rows in a - // rectangular matrix, from top to bottom or from bottom to top depending - // on stride. - // - // row_accessor is cheap to create/destroy, but performs one multiplication - // when calling row_ptr(). - // - // row_ptr_cache creates an array of pointers to rows, so, the access - // via row_ptr() may be faster. But it requires memory allocation - // when creating. For example, on typical Intel Pentium hardware - // row_ptr_cache speeds span_image_filter_rgb_nn up to 10% - // - // It's used only in short hand typedefs like pixfmt_rgba32 and can be - // redefined in agg_config.h - // In real applications you can use both, depending on your needs - //------------------------------------------------------------------------ -#ifdef AGG_RENDERING_BUFFER - typedef AGG_RENDERING_BUFFER rendering_buffer; -#else -// typedef row_ptr_cache rendering_buffer; - typedef row_accessor rendering_buffer; -#endif - -} - - -#endif diff --git a/uppdev/aggdraw/agg_rendering_buffer_dynarow.h b/uppdev/aggdraw/agg_rendering_buffer_dynarow.h deleted file mode 100644 index bc0ad4d21..000000000 --- a/uppdev/aggdraw/agg_rendering_buffer_dynarow.h +++ /dev/null @@ -1,142 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_RENDERING_BUFFER_DYNAROW_INCLUDED -#define AGG_RENDERING_BUFFER_DYNAROW_INCLUDED - -#include "agg_array.h" - -namespace agg -{ - - //===============================================rendering_buffer_dynarow - // Rendering buffer class with dynamic allocation of the rows. - // The rows are allocated as needed when requesting for span_ptr(). - // The class automatically calculates min_x and max_x for each row. - // Generally it's more efficient to use this class as a temporary buffer - // for rendering a few lines and then to blend it with another buffer. - // - class rendering_buffer_dynarow - { - public: - typedef row_info row_data; - - //------------------------------------------------------------------- - ~rendering_buffer_dynarow() - { - init(0,0,0); - } - - //------------------------------------------------------------------- - rendering_buffer_dynarow() : - m_rows(), - m_width(0), - m_height(0), - m_byte_width(0) - { - } - - // Allocate and clear the buffer - //-------------------------------------------------------------------- - rendering_buffer_dynarow(unsigned width, unsigned height, - unsigned byte_width) : - m_rows(height), - m_width(width), - m_height(height), - m_byte_width(byte_width) - { - memset(&m_rows[0], 0, sizeof(row_data) * height); - } - - // Allocate and clear the buffer - //-------------------------------------------------------------------- - void init(unsigned width, unsigned height, unsigned byte_width) - { - unsigned i; - for(i = 0; i < m_height; ++i) - { - pod_allocator::deallocate((int8u*)m_rows[i].ptr, m_byte_width); - } - if(width && height) - { - m_width = width; - m_height = height; - m_byte_width = byte_width; - m_rows.resize(height); - memset(&m_rows[0], 0, sizeof(row_data) * height); - } - } - - //-------------------------------------------------------------------- - unsigned width() const { return m_width; } - unsigned height() const { return m_height; } - unsigned byte_width() const { return m_byte_width; } - - // The main function used for rendering. Returns pointer to the - // pre-allocated span. Memory for the row is allocated as needed. - //-------------------------------------------------------------------- - int8u* row_ptr(int x, int y, unsigned len) - { - row_data* r = &m_rows[y]; - int x2 = x + len - 1; - if(r->ptr) - { - if(x < r->x1) { r->x1 = x; } - if(x2 > r->x2) { r->x2 = x2; } - } - else - { - int8u* p = pod_allocator::allocate(m_byte_width); - r->ptr = p; - r->x1 = x; - r->x2 = x2; - memset(p, 0, m_byte_width); - } - return (int8u*)r->ptr; - } - - //-------------------------------------------------------------------- - const int8u* row_ptr(int y) const { return m_rows[y].ptr; } - int8u* row_ptr(int y) { return row_ptr(0, y, m_width); } - row_data row (int y) const { return m_rows[y]; } - - private: - //-------------------------------------------------------------------- - // Prohibit copying - rendering_buffer_dynarow(const rendering_buffer_dynarow&); - const rendering_buffer_dynarow& operator = (const rendering_buffer_dynarow&); - - private: - //-------------------------------------------------------------------- - pod_array m_rows; // Pointers to each row of the buffer - unsigned m_width; // Width in pixels - unsigned m_height; // Height in pixels - unsigned m_byte_width; // Width in bytes - }; - - -} - - -#endif diff --git a/uppdev/aggdraw/agg_rounded_rect.cpp b/uppdev/aggdraw/agg_rounded_rect.cpp deleted file mode 100644 index 3a5e0f4fe..000000000 --- a/uppdev/aggdraw/agg_rounded_rect.cpp +++ /dev/null @@ -1,169 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#include -#include "agg_rounded_rect.h" - - -namespace agg -{ - //------------------------------------------------------------------------ - rounded_rect::rounded_rect(double x1, double y1, double x2, double y2, double r) : - m_x1(x1), m_y1(y1), m_x2(x2), m_y2(y2), - m_rx1(r), m_ry1(r), m_rx2(r), m_ry2(r), - m_rx3(r), m_ry3(r), m_rx4(r), m_ry4(r) - { - if(x1 > x2) { m_x1 = x2; m_x2 = x1; } - if(y1 > y2) { m_y1 = y2; m_y2 = y1; } - } - - //-------------------------------------------------------------------- - void rounded_rect::rect(double x1, double y1, double x2, double y2) - { - m_x1 = x1; - m_y1 = y1; - m_x2 = x2; - m_y2 = y2; - if(x1 > x2) { m_x1 = x2; m_x2 = x1; } - if(y1 > y2) { m_y1 = y2; m_y2 = y1; } - } - - //-------------------------------------------------------------------- - void rounded_rect::radius(double r) - { - m_rx1 = m_ry1 = m_rx2 = m_ry2 = m_rx3 = m_ry3 = m_rx4 = m_ry4 = r; - } - - //-------------------------------------------------------------------- - void rounded_rect::radius(double rx, double ry) - { - m_rx1 = m_rx2 = m_rx3 = m_rx4 = rx; - m_ry1 = m_ry2 = m_ry3 = m_ry4 = ry; - } - - //-------------------------------------------------------------------- - void rounded_rect::radius(double rx_bottom, double ry_bottom, - double rx_top, double ry_top) - { - m_rx1 = m_rx2 = rx_bottom; - m_rx3 = m_rx4 = rx_top; - m_ry1 = m_ry2 = ry_bottom; - m_ry3 = m_ry4 = ry_top; - } - - //-------------------------------------------------------------------- - void rounded_rect::radius(double rx1, double ry1, double rx2, double ry2, - double rx3, double ry3, double rx4, double ry4) - { - m_rx1 = rx1; m_ry1 = ry1; m_rx2 = rx2; m_ry2 = ry2; - m_rx3 = rx3; m_ry3 = ry3; m_rx4 = rx4; m_ry4 = ry4; - } - - //-------------------------------------------------------------------- - void rounded_rect::normalize_radius() - { - double dx = fabs(m_y2 - m_y1); - double dy = fabs(m_x2 - m_x1); - - double k = 1.0; - double t; - t = dx / (m_rx1 + m_rx2); if(t < k) k = t; - t = dx / (m_rx3 + m_rx4); if(t < k) k = t; - t = dy / (m_ry1 + m_ry2); if(t < k) k = t; - t = dy / (m_ry3 + m_ry4); if(t < k) k = t; - - if(k < 1.0) - { - m_rx1 *= k; m_ry1 *= k; m_rx2 *= k; m_ry2 *= k; - m_rx3 *= k; m_ry3 *= k; m_rx4 *= k; m_ry4 *= k; - } - } - - //-------------------------------------------------------------------- - void rounded_rect::rewind(unsigned) - { - m_status = 0; - } - - //-------------------------------------------------------------------- - unsigned rounded_rect::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_stop; - switch(m_status) - { - case 0: - m_arc.init(m_x1 + m_rx1, m_y1 + m_ry1, m_rx1, m_ry1, - pi, pi+pi*0.5); - m_arc.rewind(0); - m_status++; - - case 1: - cmd = m_arc.vertex(x, y); - if(is_stop(cmd)) m_status++; - else return cmd; - - case 2: - m_arc.init(m_x2 - m_rx2, m_y1 + m_ry2, m_rx2, m_ry2, - pi+pi*0.5, 0.0); - m_arc.rewind(0); - m_status++; - - case 3: - cmd = m_arc.vertex(x, y); - if(is_stop(cmd)) m_status++; - else return path_cmd_line_to; - - case 4: - m_arc.init(m_x2 - m_rx3, m_y2 - m_ry3, m_rx3, m_ry3, - 0.0, pi*0.5); - m_arc.rewind(0); - m_status++; - - case 5: - cmd = m_arc.vertex(x, y); - if(is_stop(cmd)) m_status++; - else return path_cmd_line_to; - - case 6: - m_arc.init(m_x1 + m_rx4, m_y2 - m_ry4, m_rx4, m_ry4, - pi*0.5, pi); - m_arc.rewind(0); - m_status++; - - case 7: - cmd = m_arc.vertex(x, y); - if(is_stop(cmd)) m_status++; - else return path_cmd_line_to; - - case 8: - cmd = path_cmd_end_poly | path_flags_close | path_flags_ccw; - m_status++; - break; - } - return cmd; - } - - -} - diff --git a/uppdev/aggdraw/agg_rounded_rect.h b/uppdev/aggdraw/agg_rounded_rect.h deleted file mode 100644 index ecaa370ea..000000000 --- a/uppdev/aggdraw/agg_rounded_rect.h +++ /dev/null @@ -1,77 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_ROUNDED_RECT_INCLUDED -#define AGG_ROUNDED_RECT_INCLUDED - -#include "agg_basics.h" -#include "agg_arc.h" - -namespace agg -{ - //------------------------------------------------------------rounded_rect - // - // See Implemantation agg_rounded_rect.cpp - // - class rounded_rect - { - public: - rounded_rect() {} - rounded_rect(double x1, double y1, double x2, double y2, double r); - - void rect(double x1, double y1, double x2, double y2); - void radius(double r); - void radius(double rx, double ry); - void radius(double rx_bottom, double ry_bottom, double rx_top, double ry_top); - void radius(double rx1, double ry1, double rx2, double ry2, - double rx3, double ry3, double rx4, double ry4); - void normalize_radius(); - - void approximation_scale(double s) { m_arc.approximation_scale(s); } - double approximation_scale() const { return m_arc.approximation_scale(); } - - void rewind(unsigned); - unsigned vertex(double* x, double* y); - - private: - double m_x1; - double m_y1; - double m_x2; - double m_y2; - double m_rx1; - double m_ry1; - double m_rx2; - double m_ry2; - double m_rx3; - double m_ry3; - double m_rx4; - double m_ry4; - unsigned m_status; - arc m_arc; - }; - -} - -#endif - diff --git a/uppdev/aggdraw/agg_scanline_bin.h b/uppdev/aggdraw/agg_scanline_bin.h deleted file mode 100644 index dd4cdf694..000000000 --- a/uppdev/aggdraw/agg_scanline_bin.h +++ /dev/null @@ -1,269 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// Adaptation for 32-bit screen coordinates (scanline32_bin) has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- - -#ifndef AGG_SCANLINE_BIN_INCLUDED -#define AGG_SCANLINE_BIN_INCLUDED - -#include "agg_array.h" - -namespace agg -{ - - //=============================================================scanline_bin - // - // This is binary scaline container which supports the interface - // used in the rasterizer::render(). See description of agg_scanline_u8 - // for details. - // - //------------------------------------------------------------------------ - class scanline_bin - { - public: - typedef int32 coord_type; - - struct span - { - int16 x; - int16 len; - }; - - typedef const span* const_iterator; - - //-------------------------------------------------------------------- - scanline_bin() : - m_last_x(0x7FFFFFF0), - m_spans(), - m_cur_span(0) - { - } - - //-------------------------------------------------------------------- - void reset(int min_x, int max_x) - { - unsigned max_len = max_x - min_x + 3; - if(max_len > m_spans.size()) - { - m_spans.resize(max_len); - } - m_last_x = 0x7FFFFFF0; - m_cur_span = &m_spans[0]; - } - - //-------------------------------------------------------------------- - void add_cell(int x, unsigned) - { - if(x == m_last_x+1) - { - m_cur_span->len++; - } - else - { - ++m_cur_span; - m_cur_span->x = (int16)x; - m_cur_span->len = 1; - } - m_last_x = x; - } - - //-------------------------------------------------------------------- - void add_span(int x, unsigned len, unsigned) - { - if(x == m_last_x+1) - { - m_cur_span->len = (int16)(m_cur_span->len + len); - } - else - { - ++m_cur_span; - m_cur_span->x = (int16)x; - m_cur_span->len = (int16)len; - } - m_last_x = x + len - 1; - } - - //-------------------------------------------------------------------- - void add_cells(int x, unsigned len, const void*) - { - add_span(x, len, 0); - } - - //-------------------------------------------------------------------- - void finalize(int y) - { - m_y = y; - } - - //-------------------------------------------------------------------- - void reset_spans() - { - m_last_x = 0x7FFFFFF0; - m_cur_span = &m_spans[0]; - } - - //-------------------------------------------------------------------- - int y() const { return m_y; } - unsigned num_spans() const { return unsigned(m_cur_span - &m_spans[0]); } - const_iterator begin() const { return &m_spans[1]; } - - private: - scanline_bin(const scanline_bin&); - const scanline_bin operator = (const scanline_bin&); - - int m_last_x; - int m_y; - pod_array m_spans; - span* m_cur_span; - }; - - - - - - - //===========================================================scanline32_bin - class scanline32_bin - { - public: - typedef int32 coord_type; - - //-------------------------------------------------------------------- - struct span - { - span() {} - span(coord_type x_, coord_type len_) : x(x_), len(len_) {} - - coord_type x; - coord_type len; - }; - typedef pod_bvector span_array_type; - - - //-------------------------------------------------------------------- - class const_iterator - { - public: - const_iterator(const span_array_type& spans) : - m_spans(spans), - m_span_idx(0) - {} - - const span& operator*() const { return m_spans[m_span_idx]; } - const span* operator->() const { return &m_spans[m_span_idx]; } - - void operator ++ () { ++m_span_idx; } - - private: - const span_array_type& m_spans; - unsigned m_span_idx; - }; - - - //-------------------------------------------------------------------- - scanline32_bin() : m_max_len(0), m_last_x(0x7FFFFFF0) {} - - //-------------------------------------------------------------------- - void reset(int min_x, int max_x) - { - m_last_x = 0x7FFFFFF0; - m_spans.remove_all(); - } - - //-------------------------------------------------------------------- - void add_cell(int x, unsigned) - { - if(x == m_last_x+1) - { - m_spans.last().len++; - } - else - { - m_spans.add(span(coord_type(x), 1)); - } - m_last_x = x; - } - - //-------------------------------------------------------------------- - void add_span(int x, unsigned len, unsigned) - { - if(x == m_last_x+1) - { - m_spans.last().len += coord_type(len); - } - else - { - m_spans.add(span(coord_type(x), coord_type(len))); - } - m_last_x = x + len - 1; - } - - //-------------------------------------------------------------------- - void add_cells(int x, unsigned len, const void*) - { - add_span(x, len, 0); - } - - //-------------------------------------------------------------------- - void finalize(int y) - { - m_y = y; - } - - //-------------------------------------------------------------------- - void reset_spans() - { - m_last_x = 0x7FFFFFF0; - m_spans.remove_all(); - } - - //-------------------------------------------------------------------- - int y() const { return m_y; } - unsigned num_spans() const { return m_spans.size(); } - const_iterator begin() const { return const_iterator(m_spans); } - - private: - scanline32_bin(const scanline32_bin&); - const scanline32_bin operator = (const scanline32_bin&); - - unsigned m_max_len; - int m_last_x; - int m_y; - span_array_type m_spans; - }; - - - - - -} - - -#endif diff --git a/uppdev/aggdraw/agg_scanline_boolean_algebra.h b/uppdev/aggdraw/agg_scanline_boolean_algebra.h deleted file mode 100644 index 7e0970bc5..000000000 --- a/uppdev/aggdraw/agg_scanline_boolean_algebra.h +++ /dev/null @@ -1,1576 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_SCANLINE_BOOLEAN_ALGEBRA_INCLUDED -#define AGG_SCANLINE_BOOLEAN_ALGEBRA_INCLUDED - -#include -#include -#include "agg_basics.h" - - -namespace agg -{ - - //-----------------------------------------------sbool_combine_spans_bin - // Functor. - // Combine two binary encoded spans, i.e., when we don't have any - // anti-aliasing information, but only X and Length. The function - // is compatible with any type of scanlines. - //---------------- - template - struct sbool_combine_spans_bin - { - void operator () (const typename Scanline1::const_iterator&, - const typename Scanline2::const_iterator&, - int x, unsigned len, - Scanline& sl) const - { - sl.add_span(x, len, cover_full); - } - }; - - - - //---------------------------------------------sbool_combine_spans_empty - // Functor. - // Combine two spans as empty ones. The functor does nothing - // and is used to XOR binary spans. - //---------------- - template - struct sbool_combine_spans_empty - { - void operator () (const typename Scanline1::const_iterator&, - const typename Scanline2::const_iterator&, - int, unsigned, - Scanline&) const - {} - }; - - - - //--------------------------------------------------sbool_add_span_empty - // Functor. - // Add nothing. Used in conbine_shapes_sub - //---------------- - template - struct sbool_add_span_empty - { - void operator () (const typename Scanline1::const_iterator&, - int, unsigned, - Scanline&) const - {} - }; - - - //----------------------------------------------------sbool_add_span_bin - // Functor. - // Add a binary span - //---------------- - template - struct sbool_add_span_bin - { - void operator () (const typename Scanline1::const_iterator&, - int x, unsigned len, - Scanline& sl) const - { - sl.add_span(x, len, cover_full); - } - }; - - - - - //-----------------------------------------------------sbool_add_span_aa - // Functor. - // Add an anti-aliased span - // anti-aliasing information, but only X and Length. The function - // is compatible with any type of scanlines. - //---------------- - template - struct sbool_add_span_aa - { - void operator () (const typename Scanline1::const_iterator& span, - int x, unsigned len, - Scanline& sl) const - { - if(span->len < 0) - { - sl.add_span(x, len, *span->covers); - } - else - if(span->len > 0) - { - const typename Scanline1::cover_type* covers = span->covers; - if(span->x < x) covers += x - span->x; - sl.add_cells(x, len, covers); - } - } - }; - - - - - //----------------------------------------------sbool_intersect_spans_aa - // Functor. - // Intersect two spans preserving the anti-aliasing information. - // The result is added to the "sl" scanline. - //------------------ - template - struct sbool_intersect_spans_aa - { - enum cover_scale_e - { - cover_shift = CoverShift, - cover_size = 1 << cover_shift, - cover_mask = cover_size - 1, - cover_full = cover_mask - }; - - - void operator () (const typename Scanline1::const_iterator& span1, - const typename Scanline2::const_iterator& span2, - int x, unsigned len, - Scanline& sl) const - { - unsigned cover; - const typename Scanline1::cover_type* covers1; - const typename Scanline2::cover_type* covers2; - - // Calculate the operation code and choose the - // proper combination algorithm. - // 0 = Both spans are of AA type - // 1 = span1 is solid, span2 is AA - // 2 = span1 is AA, span2 is solid - // 3 = Both spans are of solid type - //----------------- - switch((span1->len < 0) | ((span2->len < 0) << 1)) - { - case 0: // Both are AA spans - covers1 = span1->covers; - covers2 = span2->covers; - if(span1->x < x) covers1 += x - span1->x; - if(span2->x < x) covers2 += x - span2->x; - do - { - cover = *covers1++ * *covers2++; - sl.add_cell(x++, - (cover == cover_full * cover_full) ? - cover_full : - (cover >> cover_shift)); - } - while(--len); - break; - - case 1: // span1 is solid, span2 is AA - covers2 = span2->covers; - if(span2->x < x) covers2 += x - span2->x; - if(*(span1->covers) == cover_full) - { - sl.add_cells(x, len, covers2); - } - else - { - do - { - cover = *(span1->covers) * *covers2++; - sl.add_cell(x++, - (cover == cover_full * cover_full) ? - cover_full : - (cover >> cover_shift)); - } - while(--len); - } - break; - - case 2: // span1 is AA, span2 is solid - covers1 = span1->covers; - if(span1->x < x) covers1 += x - span1->x; - if(*(span2->covers) == cover_full) - { - sl.add_cells(x, len, covers1); - } - else - { - do - { - cover = *covers1++ * *(span2->covers); - sl.add_cell(x++, - (cover == cover_full * cover_full) ? - cover_full : - (cover >> cover_shift)); - } - while(--len); - } - break; - - case 3: // Both are solid spans - cover = *(span1->covers) * *(span2->covers); - sl.add_span(x, len, - (cover == cover_full * cover_full) ? - cover_full : - (cover >> cover_shift)); - break; - } - } - }; - - - - - - - //--------------------------------------------------sbool_unite_spans_aa - // Functor. - // Unite two spans preserving the anti-aliasing information. - // The result is added to the "sl" scanline. - //------------------ - template - struct sbool_unite_spans_aa - { - enum cover_scale_e - { - cover_shift = CoverShift, - cover_size = 1 << cover_shift, - cover_mask = cover_size - 1, - cover_full = cover_mask - }; - - - void operator () (const typename Scanline1::const_iterator& span1, - const typename Scanline2::const_iterator& span2, - int x, unsigned len, - Scanline& sl) const - { - unsigned cover; - const typename Scanline1::cover_type* covers1; - const typename Scanline2::cover_type* covers2; - - // Calculate the operation code and choose the - // proper combination algorithm. - // 0 = Both spans are of AA type - // 1 = span1 is solid, span2 is AA - // 2 = span1 is AA, span2 is solid - // 3 = Both spans are of solid type - //----------------- - switch((span1->len < 0) | ((span2->len < 0) << 1)) - { - case 0: // Both are AA spans - covers1 = span1->covers; - covers2 = span2->covers; - if(span1->x < x) covers1 += x - span1->x; - if(span2->x < x) covers2 += x - span2->x; - do - { - cover = cover_mask * cover_mask - - (cover_mask - *covers1++) * - (cover_mask - *covers2++); - sl.add_cell(x++, - (cover == cover_full * cover_full) ? - cover_full : - (cover >> cover_shift)); - } - while(--len); - break; - - case 1: // span1 is solid, span2 is AA - covers2 = span2->covers; - if(span2->x < x) covers2 += x - span2->x; - if(*(span1->covers) == cover_full) - { - sl.add_span(x, len, cover_full); - } - else - { - do - { - cover = cover_mask * cover_mask - - (cover_mask - *(span1->covers)) * - (cover_mask - *covers2++); - sl.add_cell(x++, - (cover == cover_full * cover_full) ? - cover_full : - (cover >> cover_shift)); - } - while(--len); - } - break; - - case 2: // span1 is AA, span2 is solid - covers1 = span1->covers; - if(span1->x < x) covers1 += x - span1->x; - if(*(span2->covers) == cover_full) - { - sl.add_span(x, len, cover_full); - } - else - { - do - { - cover = cover_mask * cover_mask - - (cover_mask - *covers1++) * - (cover_mask - *(span2->covers)); - sl.add_cell(x++, - (cover == cover_full * cover_full) ? - cover_full : - (cover >> cover_shift)); - } - while(--len); - } - break; - - case 3: // Both are solid spans - cover = cover_mask * cover_mask - - (cover_mask - *(span1->covers)) * - (cover_mask - *(span2->covers)); - sl.add_span(x, len, - (cover == cover_full * cover_full) ? - cover_full : - (cover >> cover_shift)); - break; - } - } - }; - - - //---------------------------------------------sbool_xor_formula_linear - template - struct sbool_xor_formula_linear - { - enum cover_scale_e - { - cover_shift = CoverShift, - cover_size = 1 << cover_shift, - cover_mask = cover_size - 1 - }; - - static AGG_INLINE unsigned calculate(unsigned a, unsigned b) - { - unsigned cover = a + b; - if(cover > cover_mask) cover = cover_mask + cover_mask - cover; - return cover; - } - }; - - - //---------------------------------------------sbool_xor_formula_saddle - template - struct sbool_xor_formula_saddle - { - enum cover_scale_e - { - cover_shift = CoverShift, - cover_size = 1 << cover_shift, - cover_mask = cover_size - 1 - }; - - static AGG_INLINE unsigned calculate(unsigned a, unsigned b) - { - unsigned k = a * b; - if(k == cover_mask * cover_mask) return 0; - - a = (cover_mask * cover_mask - (a << cover_shift) + k) >> cover_shift; - b = (cover_mask * cover_mask - (b << cover_shift) + k) >> cover_shift; - return cover_mask - ((a * b) >> cover_shift); - } - }; - - - //-------------------------------------------sbool_xor_formula_abs_diff - struct sbool_xor_formula_abs_diff - { - static AGG_INLINE unsigned calculate(unsigned a, unsigned b) - { - return unsigned(abs(int(a) - int(b))); - } - }; - - - - //----------------------------------------------------sbool_xor_spans_aa - // Functor. - // XOR two spans preserving the anti-aliasing information. - // The result is added to the "sl" scanline. - //------------------ - template - struct sbool_xor_spans_aa - { - enum cover_scale_e - { - cover_shift = CoverShift, - cover_size = 1 << cover_shift, - cover_mask = cover_size - 1, - cover_full = cover_mask - }; - - - void operator () (const typename Scanline1::const_iterator& span1, - const typename Scanline2::const_iterator& span2, - int x, unsigned len, - Scanline& sl) const - { - unsigned cover; - const typename Scanline1::cover_type* covers1; - const typename Scanline2::cover_type* covers2; - - // Calculate the operation code and choose the - // proper combination algorithm. - // 0 = Both spans are of AA type - // 1 = span1 is solid, span2 is AA - // 2 = span1 is AA, span2 is solid - // 3 = Both spans are of solid type - //----------------- - switch((span1->len < 0) | ((span2->len < 0) << 1)) - { - case 0: // Both are AA spans - covers1 = span1->covers; - covers2 = span2->covers; - if(span1->x < x) covers1 += x - span1->x; - if(span2->x < x) covers2 += x - span2->x; - do - { - cover = XorFormula::calculate(*covers1++, *covers2++); - if(cover) sl.add_cell(x, cover); - ++x; - } - while(--len); - break; - - case 1: // span1 is solid, span2 is AA - covers2 = span2->covers; - if(span2->x < x) covers2 += x - span2->x; - do - { - cover = XorFormula::calculate(*(span1->covers), *covers2++); - if(cover) sl.add_cell(x, cover); - ++x; - } - while(--len); - break; - - case 2: // span1 is AA, span2 is solid - covers1 = span1->covers; - if(span1->x < x) covers1 += x - span1->x; - do - { - cover = XorFormula::calculate(*covers1++, *(span2->covers)); - if(cover) sl.add_cell(x, cover); - ++x; - } - while(--len); - break; - - case 3: // Both are solid spans - cover = XorFormula::calculate(*(span1->covers), *(span2->covers)); - if(cover) sl.add_span(x, len, cover); - break; - - } - } - }; - - - - - - //-----------------------------------------------sbool_subtract_spans_aa - // Functor. - // Unite two spans preserving the anti-aliasing information. - // The result is added to the "sl" scanline. - //------------------ - template - struct sbool_subtract_spans_aa - { - enum cover_scale_e - { - cover_shift = CoverShift, - cover_size = 1 << cover_shift, - cover_mask = cover_size - 1, - cover_full = cover_mask - }; - - - void operator () (const typename Scanline1::const_iterator& span1, - const typename Scanline2::const_iterator& span2, - int x, unsigned len, - Scanline& sl) const - { - unsigned cover; - const typename Scanline1::cover_type* covers1; - const typename Scanline2::cover_type* covers2; - - // Calculate the operation code and choose the - // proper combination algorithm. - // 0 = Both spans are of AA type - // 1 = span1 is solid, span2 is AA - // 2 = span1 is AA, span2 is solid - // 3 = Both spans are of solid type - //----------------- - switch((span1->len < 0) | ((span2->len < 0) << 1)) - { - case 0: // Both are AA spans - covers1 = span1->covers; - covers2 = span2->covers; - if(span1->x < x) covers1 += x - span1->x; - if(span2->x < x) covers2 += x - span2->x; - do - { - cover = *covers1++ * (cover_mask - *covers2++); - if(cover) - { - sl.add_cell(x, - (cover == cover_full * cover_full) ? - cover_full : - (cover >> cover_shift)); - } - ++x; - } - while(--len); - break; - - case 1: // span1 is solid, span2 is AA - covers2 = span2->covers; - if(span2->x < x) covers2 += x - span2->x; - do - { - cover = *(span1->covers) * (cover_mask - *covers2++); - if(cover) - { - sl.add_cell(x, - (cover == cover_full * cover_full) ? - cover_full : - (cover >> cover_shift)); - } - ++x; - } - while(--len); - break; - - case 2: // span1 is AA, span2 is solid - covers1 = span1->covers; - if(span1->x < x) covers1 += x - span1->x; - if(*(span2->covers) != cover_full) - { - do - { - cover = *covers1++ * (cover_mask - *(span2->covers)); - if(cover) - { - sl.add_cell(x, - (cover == cover_full * cover_full) ? - cover_full : - (cover >> cover_shift)); - } - ++x; - } - while(--len); - } - break; - - case 3: // Both are solid spans - cover = *(span1->covers) * (cover_mask - *(span2->covers)); - if(cover) - { - sl.add_span(x, len, - (cover == cover_full * cover_full) ? - cover_full : - (cover >> cover_shift)); - } - break; - } - } - }; - - - - - - - //--------------------------------------------sbool_add_spans_and_render - template - void sbool_add_spans_and_render(const Scanline1& sl1, - Scanline& sl, - Renderer& ren, - AddSpanFunctor add_span) - { - sl.reset_spans(); - typename Scanline1::const_iterator span = sl1.begin(); - unsigned num_spans = sl1.num_spans(); - for(;;) - { - add_span(span, span->x, abs((int)span->len), sl); - if(--num_spans == 0) break; - ++span; - } - sl.finalize(sl1.y()); - ren.render(sl); - } - - - - - - - - //---------------------------------------------sbool_intersect_scanlines - // Intersect two scanlines, "sl1" and "sl2" and generate a new "sl" one. - // The combine_spans functor can be of type sbool_combine_spans_bin or - // sbool_intersect_spans_aa. First is a general functor to combine - // two spans without Anti-Aliasing, the second preserves the AA - // information, but works slower - // - template - void sbool_intersect_scanlines(const Scanline1& sl1, - const Scanline2& sl2, - Scanline& sl, - CombineSpansFunctor combine_spans) - { - sl.reset_spans(); - - unsigned num1 = sl1.num_spans(); - if(num1 == 0) return; - - unsigned num2 = sl2.num_spans(); - if(num2 == 0) return; - - typename Scanline1::const_iterator span1 = sl1.begin(); - typename Scanline2::const_iterator span2 = sl2.begin(); - - while(num1 && num2) - { - int xb1 = span1->x; - int xb2 = span2->x; - int xe1 = xb1 + abs((int)span1->len) - 1; - int xe2 = xb2 + abs((int)span2->len) - 1; - - // Determine what spans we should advance in the next step - // The span with the least ending X should be advanced - // advance_both is just an optimization when we ending - // coordinates are the same and we can advance both - //-------------- - bool advance_span1 = xe1 < xe2; - bool advance_both = xe1 == xe2; - - // Find the intersection of the spans - // and check if they intersect - //-------------- - if(xb1 < xb2) xb1 = xb2; - if(xe1 > xe2) xe1 = xe2; - if(xb1 <= xe1) - { - combine_spans(span1, span2, xb1, xe1 - xb1 + 1, sl); - } - - // Advance the spans - //-------------- - if(advance_both) - { - --num1; - --num2; - if(num1) ++span1; - if(num2) ++span2; - } - else - { - if(advance_span1) - { - --num1; - if(num1) ++span1; - } - else - { - --num2; - if(num2) ++span2; - } - } - } - } - - - - - - - - - //------------------------------------------------sbool_intersect_shapes - // Intersect the scanline shapes. Here the "Scanline Generator" - // abstraction is used. ScanlineGen1 and ScanlineGen2 are - // the generators, and can be of type rasterizer_scanline_aa<>. - // There function requires three scanline containers that can be of - // different types. - // "sl1" and "sl2" are used to retrieve scanlines from the generators, - // "sl" is ised as the resulting scanline to render it. - // The external "sl1" and "sl2" are used only for the sake of - // optimization and reusing of the scanline objects. - // the function calls sbool_intersect_scanlines with CombineSpansFunctor - // as the last argument. See sbool_intersect_scanlines for details. - //---------- - template - void sbool_intersect_shapes(ScanlineGen1& sg1, ScanlineGen2& sg2, - Scanline1& sl1, Scanline2& sl2, - Scanline& sl, Renderer& ren, - CombineSpansFunctor combine_spans) - { - // Prepare the scanline generators. - // If anyone of them doesn't contain - // any scanlines, then return. - //----------------- - if(!sg1.rewind_scanlines()) return; - if(!sg2.rewind_scanlines()) return; - - // Get the bounding boxes - //---------------- - rect_i r1(sg1.min_x(), sg1.min_y(), sg1.max_x(), sg1.max_y()); - rect_i r2(sg2.min_x(), sg2.min_y(), sg2.max_x(), sg2.max_y()); - - // Calculate the intersection of the bounding - // boxes and return if they don't intersect. - //----------------- - rect_i ir = intersect_rectangles(r1, r2); - if(!ir.is_valid()) return; - - // Reset the scanlines and get two first ones - //----------------- - sl.reset(ir.x1, ir.x2); - sl1.reset(sg1.min_x(), sg1.max_x()); - sl2.reset(sg2.min_x(), sg2.max_x()); - if(!sg1.sweep_scanline(sl1)) return; - if(!sg2.sweep_scanline(sl2)) return; - - ren.prepare(); - - // The main loop - // Here we synchronize the scanlines with - // the same Y coordinate, ignoring all other ones. - // Only scanlines having the same Y-coordinate - // are to be combined. - //----------------- - for(;;) - { - while(sl1.y() < sl2.y()) - { - if(!sg1.sweep_scanline(sl1)) return; - } - while(sl2.y() < sl1.y()) - { - if(!sg2.sweep_scanline(sl2)) return; - } - - if(sl1.y() == sl2.y()) - { - // The Y coordinates are the same. - // Combine the scanlines, render if they contain any spans, - // and advance both generators to the next scanlines - //---------------------- - sbool_intersect_scanlines(sl1, sl2, sl, combine_spans); - if(sl.num_spans()) - { - sl.finalize(sl1.y()); - ren.render(sl); - } - if(!sg1.sweep_scanline(sl1)) return; - if(!sg2.sweep_scanline(sl2)) return; - } - } - } - - - - - - - - //-------------------------------------------------sbool_unite_scanlines - // Unite two scanlines, "sl1" and "sl2" and generate a new "sl" one. - // The combine_spans functor can be of type sbool_combine_spans_bin or - // sbool_intersect_spans_aa. First is a general functor to combine - // two spans without Anti-Aliasing, the second preserves the AA - // information, but works slower - // - template - void sbool_unite_scanlines(const Scanline1& sl1, - const Scanline2& sl2, - Scanline& sl, - AddSpanFunctor1 add_span1, - AddSpanFunctor2 add_span2, - CombineSpansFunctor combine_spans) - { - sl.reset_spans(); - - unsigned num1 = sl1.num_spans(); - unsigned num2 = sl2.num_spans(); - - typename Scanline1::const_iterator span1;// = sl1.begin(); - typename Scanline2::const_iterator span2;// = sl2.begin(); - - enum invalidation_e - { - invalid_b = 0xFFFFFFF, - invalid_e = invalid_b - 1 - }; - - // Initialize the spans as invalid - //--------------- - int xb1 = invalid_b; - int xb2 = invalid_b; - int xe1 = invalid_e; - int xe2 = invalid_e; - - // Initialize span1 if there are spans - //--------------- - if(num1) - { - span1 = sl1.begin(); - xb1 = span1->x; - xe1 = xb1 + abs((int)span1->len) - 1; - --num1; - } - - // Initialize span2 if there are spans - //--------------- - if(num2) - { - span2 = sl2.begin(); - xb2 = span2->x; - xe2 = xb2 + abs((int)span2->len) - 1; - --num2; - } - - - for(;;) - { - // Retrieve a new span1 if it's invalid - //---------------- - if(num1 && xb1 > xe1) - { - --num1; - ++span1; - xb1 = span1->x; - xe1 = xb1 + abs((int)span1->len) - 1; - } - - // Retrieve a new span2 if it's invalid - //---------------- - if(num2 && xb2 > xe2) - { - --num2; - ++span2; - xb2 = span2->x; - xe2 = xb2 + abs((int)span2->len) - 1; - } - - if(xb1 > xe1 && xb2 > xe2) break; - - // Calculate the intersection - //---------------- - int xb = xb1; - int xe = xe1; - if(xb < xb2) xb = xb2; - if(xe > xe2) xe = xe2; - int len = xe - xb + 1; // The length of the intersection - if(len > 0) - { - // The spans intersect, - // add the beginning of the span - //---------------- - if(xb1 < xb2) - { - add_span1(span1, xb1, xb2 - xb1, sl); - xb1 = xb2; - } - else - if(xb2 < xb1) - { - add_span2(span2, xb2, xb1 - xb2, sl); - xb2 = xb1; - } - - // Add the combination part of the spans - //---------------- - combine_spans(span1, span2, xb, len, sl); - - - // Invalidate the fully processed span or both - //---------------- - if(xe1 < xe2) - { - // Invalidate span1 and eat - // the processed part of span2 - //-------------- - xb1 = invalid_b; - xe1 = invalid_e; - xb2 += len; - } - else - if(xe2 < xe1) - { - // Invalidate span2 and eat - // the processed part of span1 - //-------------- - xb2 = invalid_b; - xe2 = invalid_e; - xb1 += len; - } - else - { - xb1 = invalid_b; // Invalidate both - xb2 = invalid_b; - xe1 = invalid_e; - xe2 = invalid_e; - } - } - else - { - // The spans do not intersect - //-------------- - if(xb1 < xb2) - { - // Advance span1 - //--------------- - if(xb1 <= xe1) - { - add_span1(span1, xb1, xe1 - xb1 + 1, sl); - } - xb1 = invalid_b; // Invalidate - xe1 = invalid_e; - } - else - { - // Advance span2 - //--------------- - if(xb2 <= xe2) - { - add_span2(span2, xb2, xe2 - xb2 + 1, sl); - } - xb2 = invalid_b; // Invalidate - xe2 = invalid_e; - } - } - } - } - - - - - //----------------------------------------------------sbool_unite_shapes - // Unite the scanline shapes. Here the "Scanline Generator" - // abstraction is used. ScanlineGen1 and ScanlineGen2 are - // the generators, and can be of type rasterizer_scanline_aa<>. - // There function requires three scanline containers that can be - // of different type. - // "sl1" and "sl2" are used to retrieve scanlines from the generators, - // "sl" is ised as the resulting scanline to render it. - // The external "sl1" and "sl2" are used only for the sake of - // optimization and reusing of the scanline objects. - // the function calls sbool_unite_scanlines with CombineSpansFunctor - // as the last argument. See sbool_unite_scanlines for details. - //---------- - template - void sbool_unite_shapes(ScanlineGen1& sg1, ScanlineGen2& sg2, - Scanline1& sl1, Scanline2& sl2, - Scanline& sl, Renderer& ren, - AddSpanFunctor1 add_span1, - AddSpanFunctor2 add_span2, - CombineSpansFunctor combine_spans) - { - // Prepare the scanline generators. - // If anyone of them doesn't contain - // any scanlines, then return. - //----------------- - bool flag1 = sg1.rewind_scanlines(); - bool flag2 = sg2.rewind_scanlines(); - if(!flag1 && !flag2) return; - - // Get the bounding boxes - //---------------- - rect_i r1(sg1.min_x(), sg1.min_y(), sg1.max_x(), sg1.max_y()); - rect_i r2(sg2.min_x(), sg2.min_y(), sg2.max_x(), sg2.max_y()); - - // Calculate the union of the bounding boxes - //----------------- - rect_i ur(1,1,0,0); - if(flag1 && flag2) ur = unite_rectangles(r1, r2); - else if(flag1) ur = r1; - else if(flag2) ur = r2; - - if(!ur.is_valid()) return; - - ren.prepare(); - - // Reset the scanlines and get two first ones - //----------------- - sl.reset(ur.x1, ur.x2); - if(flag1) - { - sl1.reset(sg1.min_x(), sg1.max_x()); - flag1 = sg1.sweep_scanline(sl1); - } - - if(flag2) - { - sl2.reset(sg2.min_x(), sg2.max_x()); - flag2 = sg2.sweep_scanline(sl2); - } - - // The main loop - // Here we synchronize the scanlines with - // the same Y coordinate. - //----------------- - while(flag1 || flag2) - { - if(flag1 && flag2) - { - if(sl1.y() == sl2.y()) - { - // The Y coordinates are the same. - // Combine the scanlines, render if they contain any spans, - // and advance both generators to the next scanlines - //---------------------- - sbool_unite_scanlines(sl1, sl2, sl, - add_span1, add_span2, combine_spans); - if(sl.num_spans()) - { - sl.finalize(sl1.y()); - ren.render(sl); - } - flag1 = sg1.sweep_scanline(sl1); - flag2 = sg2.sweep_scanline(sl2); - } - else - { - if(sl1.y() < sl2.y()) - { - sbool_add_spans_and_render(sl1, sl, ren, add_span1); - flag1 = sg1.sweep_scanline(sl1); - } - else - { - sbool_add_spans_and_render(sl2, sl, ren, add_span2); - flag2 = sg2.sweep_scanline(sl2); - } - } - } - else - { - if(flag1) - { - sbool_add_spans_and_render(sl1, sl, ren, add_span1); - flag1 = sg1.sweep_scanline(sl1); - } - if(flag2) - { - sbool_add_spans_and_render(sl2, sl, ren, add_span2); - flag2 = sg2.sweep_scanline(sl2); - } - } - } - } - - - - - - - - - //-------------------------------------------------sbool_subtract_shapes - // Subtract the scanline shapes, "sg1-sg2". Here the "Scanline Generator" - // abstraction is used. ScanlineGen1 and ScanlineGen2 are - // the generators, and can be of type rasterizer_scanline_aa<>. - // There function requires three scanline containers that can be of - // different types. - // "sl1" and "sl2" are used to retrieve scanlines from the generators, - // "sl" is ised as the resulting scanline to render it. - // The external "sl1" and "sl2" are used only for the sake of - // optimization and reusing of the scanline objects. - // the function calls sbool_intersect_scanlines with CombineSpansFunctor - // as the last argument. See combine_scanlines_sub for details. - //---------- - template - void sbool_subtract_shapes(ScanlineGen1& sg1, ScanlineGen2& sg2, - Scanline1& sl1, Scanline2& sl2, - Scanline& sl, Renderer& ren, - AddSpanFunctor1 add_span1, - CombineSpansFunctor combine_spans) - { - // Prepare the scanline generators. - // Here "sg1" is master, "sg2" is slave. - //----------------- - if(!sg1.rewind_scanlines()) return; - bool flag2 = sg2.rewind_scanlines(); - - // Get the bounding box - //---------------- - rect_i r1(sg1.min_x(), sg1.min_y(), sg1.max_x(), sg1.max_y()); - - // Reset the scanlines and get two first ones - //----------------- - sl.reset(sg1.min_x(), sg1.max_x()); - sl1.reset(sg1.min_x(), sg1.max_x()); - sl2.reset(sg2.min_x(), sg2.max_x()); - if(!sg1.sweep_scanline(sl1)) return; - - if(flag2) flag2 = sg2.sweep_scanline(sl2); - - ren.prepare(); - - // A fake span2 processor - sbool_add_span_empty add_span2; - - // The main loop - // Here we synchronize the scanlines with - // the same Y coordinate, ignoring all other ones. - // Only scanlines having the same Y-coordinate - // are to be combined. - //----------------- - bool flag1 = true; - do - { - // Synchronize "slave" with "master" - //----------------- - while(flag2 && sl2.y() < sl1.y()) - { - flag2 = sg2.sweep_scanline(sl2); - } - - - if(flag2 && sl2.y() == sl1.y()) - { - // The Y coordinates are the same. - // Combine the scanlines and render if they contain any spans. - //---------------------- - sbool_unite_scanlines(sl1, sl2, sl, add_span1, add_span2, combine_spans); - if(sl.num_spans()) - { - sl.finalize(sl1.y()); - ren.render(sl); - } - } - else - { - sbool_add_spans_and_render(sl1, sl, ren, add_span1); - } - - // Advance the "master" - flag1 = sg1.sweep_scanline(sl1); - } - while(flag1); - } - - - - - - - - //---------------------------------------------sbool_intersect_shapes_aa - // Intersect two anti-aliased scanline shapes. - // Here the "Scanline Generator" abstraction is used. - // ScanlineGen1 and ScanlineGen2 are the generators, and can be of - // type rasterizer_scanline_aa<>. There function requires three - // scanline containers that can be of different types. - // "sl1" and "sl2" are used to retrieve scanlines from the generators, - // "sl" is ised as the resulting scanline to render it. - // The external "sl1" and "sl2" are used only for the sake of - // optimization and reusing of the scanline objects. - //---------- - template - void sbool_intersect_shapes_aa(ScanlineGen1& sg1, ScanlineGen2& sg2, - Scanline1& sl1, Scanline2& sl2, - Scanline& sl, Renderer& ren) - { - sbool_intersect_spans_aa combine_functor; - sbool_intersect_shapes(sg1, sg2, sl1, sl2, sl, ren, combine_functor); - } - - - - - - //--------------------------------------------sbool_intersect_shapes_bin - // Intersect two binary scanline shapes (without anti-aliasing). - // See intersect_shapes_aa for more comments - //---------- - template - void sbool_intersect_shapes_bin(ScanlineGen1& sg1, ScanlineGen2& sg2, - Scanline1& sl1, Scanline2& sl2, - Scanline& sl, Renderer& ren) - { - sbool_combine_spans_bin combine_functor; - sbool_intersect_shapes(sg1, sg2, sl1, sl2, sl, ren, combine_functor); - } - - - - - - //-------------------------------------------------sbool_unite_shapes_aa - // Unite two anti-aliased scanline shapes - // See intersect_shapes_aa for more comments - //---------- - template - void sbool_unite_shapes_aa(ScanlineGen1& sg1, ScanlineGen2& sg2, - Scanline1& sl1, Scanline2& sl2, - Scanline& sl, Renderer& ren) - { - sbool_add_span_aa add_functor1; - sbool_add_span_aa add_functor2; - sbool_unite_spans_aa combine_functor; - sbool_unite_shapes(sg1, sg2, sl1, sl2, sl, ren, - add_functor1, add_functor2, combine_functor); - } - - - - - - //------------------------------------------------sbool_unite_shapes_bin - // Unite two binary scanline shapes (without anti-aliasing). - // See intersect_shapes_aa for more comments - //---------- - template - void sbool_unite_shapes_bin(ScanlineGen1& sg1, ScanlineGen2& sg2, - Scanline1& sl1, Scanline2& sl2, - Scanline& sl, Renderer& ren) - { - sbool_add_span_bin add_functor1; - sbool_add_span_bin add_functor2; - sbool_combine_spans_bin combine_functor; - sbool_unite_shapes(sg1, sg2, sl1, sl2, sl, ren, - add_functor1, add_functor2, combine_functor); - } - - - - - - - - - - //---------------------------------------------------sbool_xor_shapes_aa - // Apply eXclusive OR to two anti-aliased scanline shapes. There's - // a modified "Linear" XOR used instead of classical "Saddle" one. - // The reason is to have the result absolutely conststent with what - // the scanline rasterizer produces. - // See intersect_shapes_aa for more comments - //---------- - template - void sbool_xor_shapes_aa(ScanlineGen1& sg1, ScanlineGen2& sg2, - Scanline1& sl1, Scanline2& sl2, - Scanline& sl, Renderer& ren) - { - sbool_add_span_aa add_functor1; - sbool_add_span_aa add_functor2; - sbool_xor_spans_aa > combine_functor; - sbool_unite_shapes(sg1, sg2, sl1, sl2, sl, ren, - add_functor1, add_functor2, combine_functor); - } - - - - //------------------------------------------sbool_xor_shapes_saddle_aa - // Apply eXclusive OR to two anti-aliased scanline shapes. - // There's the classical "Saddle" used to calculate the - // Anti-Aliasing values, that is: - // a XOR b : 1-((1-a+a*b)*(1-b+a*b)) - // See intersect_shapes_aa for more comments - //---------- - template - void sbool_xor_shapes_saddle_aa(ScanlineGen1& sg1, ScanlineGen2& sg2, - Scanline1& sl1, Scanline2& sl2, - Scanline& sl, Renderer& ren) - { - sbool_add_span_aa add_functor1; - sbool_add_span_aa add_functor2; - sbool_xor_spans_aa > combine_functor; - sbool_unite_shapes(sg1, sg2, sl1, sl2, sl, ren, - add_functor1, add_functor2, combine_functor); - } - - - //--------------------------------------sbool_xor_shapes_abs_diff_aa - // Apply eXclusive OR to two anti-aliased scanline shapes. - // There's the absolute difference used to calculate - // Anti-Aliasing values, that is: - // a XOR b : abs(a-b) - // See intersect_shapes_aa for more comments - //---------- - template - void sbool_xor_shapes_abs_diff_aa(ScanlineGen1& sg1, ScanlineGen2& sg2, - Scanline1& sl1, Scanline2& sl2, - Scanline& sl, Renderer& ren) - { - sbool_add_span_aa add_functor1; - sbool_add_span_aa add_functor2; - sbool_xor_spans_aa combine_functor; - sbool_unite_shapes(sg1, sg2, sl1, sl2, sl, ren, - add_functor1, add_functor2, combine_functor); - } - - - - //--------------------------------------------------sbool_xor_shapes_bin - // Apply eXclusive OR to two binary scanline shapes (without anti-aliasing). - // See intersect_shapes_aa for more comments - //---------- - template - void sbool_xor_shapes_bin(ScanlineGen1& sg1, ScanlineGen2& sg2, - Scanline1& sl1, Scanline2& sl2, - Scanline& sl, Renderer& ren) - { - sbool_add_span_bin add_functor1; - sbool_add_span_bin add_functor2; - sbool_combine_spans_empty combine_functor; - sbool_unite_shapes(sg1, sg2, sl1, sl2, sl, ren, - add_functor1, add_functor2, combine_functor); - } - - - - - - - //----------------------------------------------sbool_subtract_shapes_aa - // Subtract shapes "sg1-sg2" with anti-aliasing - // See intersect_shapes_aa for more comments - //---------- - template - void sbool_subtract_shapes_aa(ScanlineGen1& sg1, ScanlineGen2& sg2, - Scanline1& sl1, Scanline2& sl2, - Scanline& sl, Renderer& ren) - { - sbool_add_span_aa add_functor; - sbool_subtract_spans_aa combine_functor; - sbool_subtract_shapes(sg1, sg2, sl1, sl2, sl, ren, - add_functor, combine_functor); - } - - - - - - //---------------------------------------------sbool_subtract_shapes_bin - // Subtract binary shapes "sg1-sg2" without anti-aliasing - // See intersect_shapes_aa for more comments - //---------- - template - void sbool_subtract_shapes_bin(ScanlineGen1& sg1, ScanlineGen2& sg2, - Scanline1& sl1, Scanline2& sl2, - Scanline& sl, Renderer& ren) - { - sbool_add_span_bin add_functor; - sbool_combine_spans_empty combine_functor; - sbool_subtract_shapes(sg1, sg2, sl1, sl2, sl, ren, - add_functor, combine_functor); - } - - - - - - - //------------------------------------------------------------sbool_op_e - enum sbool_op_e - { - sbool_or, //----sbool_or - sbool_and, //----sbool_and - sbool_xor, //----sbool_xor - sbool_xor_saddle, //----sbool_xor_saddle - sbool_xor_abs_diff, //----sbool_xor_abs_diff - sbool_a_minus_b, //----sbool_a_minus_b - sbool_b_minus_a //----sbool_b_minus_a - }; - - - - - - - //----------------------------------------------sbool_combine_shapes_bin - template - void sbool_combine_shapes_bin(sbool_op_e op, - ScanlineGen1& sg1, ScanlineGen2& sg2, - Scanline1& sl1, Scanline2& sl2, - Scanline& sl, Renderer& ren) - { - switch(op) - { - case sbool_or : sbool_unite_shapes_bin (sg1, sg2, sl1, sl2, sl, ren); break; - case sbool_and : sbool_intersect_shapes_bin(sg1, sg2, sl1, sl2, sl, ren); break; - case sbool_xor : - case sbool_xor_saddle : - case sbool_xor_abs_diff: sbool_xor_shapes_bin (sg1, sg2, sl1, sl2, sl, ren); break; - case sbool_a_minus_b : sbool_subtract_shapes_bin (sg1, sg2, sl1, sl2, sl, ren); break; - case sbool_b_minus_a : sbool_subtract_shapes_bin (sg2, sg1, sl2, sl1, sl, ren); break; - } - } - - - - - //-----------------------------------------------sbool_combine_shapes_aa - template - void sbool_combine_shapes_aa(sbool_op_e op, - ScanlineGen1& sg1, ScanlineGen2& sg2, - Scanline1& sl1, Scanline2& sl2, - Scanline& sl, Renderer& ren) - { - switch(op) - { - case sbool_or : sbool_unite_shapes_aa (sg1, sg2, sl1, sl2, sl, ren); break; - case sbool_and : sbool_intersect_shapes_aa (sg1, sg2, sl1, sl2, sl, ren); break; - case sbool_xor : sbool_xor_shapes_aa (sg1, sg2, sl1, sl2, sl, ren); break; - case sbool_xor_saddle : sbool_xor_shapes_saddle_aa (sg1, sg2, sl1, sl2, sl, ren); break; - case sbool_xor_abs_diff: sbool_xor_shapes_abs_diff_aa(sg1, sg2, sl1, sl2, sl, ren); break; - case sbool_a_minus_b : sbool_subtract_shapes_aa (sg1, sg2, sl1, sl2, sl, ren); break; - case sbool_b_minus_a : sbool_subtract_shapes_aa (sg2, sg1, sl2, sl1, sl, ren); break; - } - } - -} - - -#endif - diff --git a/uppdev/aggdraw/agg_scanline_p.h b/uppdev/aggdraw/agg_scanline_p.h deleted file mode 100644 index 2380bcefb..000000000 --- a/uppdev/aggdraw/agg_scanline_p.h +++ /dev/null @@ -1,334 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// Adaptation for 32-bit screen coordinates (scanline32_p) has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- -#ifndef AGG_SCANLINE_P_INCLUDED -#define AGG_SCANLINE_P_INCLUDED - -#include "agg_array.h" - -namespace agg -{ - - //=============================================================scanline_p8 - // - // This is a general purpose scaline container which supports the interface - // used in the rasterizer::render(). See description of scanline_u8 - // for details. - // - //------------------------------------------------------------------------ - class scanline_p8 - { - public: - typedef scanline_p8 self_type; - typedef int8u cover_type; - typedef int16 coord_type; - - //-------------------------------------------------------------------- - struct span - { - coord_type x; - coord_type len; // If negative, it's a solid span, covers is valid - const cover_type* covers; - }; - - typedef span* iterator; - typedef const span* const_iterator; - - scanline_p8() : - m_last_x(0x7FFFFFF0), - m_covers(), - m_cover_ptr(0), - m_spans(), - m_cur_span(0) - { - } - - //-------------------------------------------------------------------- - void reset(int min_x, int max_x) - { - unsigned max_len = max_x - min_x + 3; - if(max_len > m_spans.size()) - { - m_spans.resize(max_len); - m_covers.resize(max_len); - } - m_last_x = 0x7FFFFFF0; - m_cover_ptr = &m_covers[0]; - m_cur_span = &m_spans[0]; - m_cur_span->len = 0; - } - - //-------------------------------------------------------------------- - void add_cell(int x, unsigned cover) - { - *m_cover_ptr = (cover_type)cover; - if(x == m_last_x+1 && m_cur_span->len > 0) - { - m_cur_span->len++; - } - else - { - m_cur_span++; - m_cur_span->covers = m_cover_ptr; - m_cur_span->x = (int16)x; - m_cur_span->len = 1; - } - m_last_x = x; - m_cover_ptr++; - } - - //-------------------------------------------------------------------- - void add_cells(int x, unsigned len, const cover_type* covers) - { - memcpy(m_cover_ptr, covers, len * sizeof(cover_type)); - if(x == m_last_x+1 && m_cur_span->len > 0) - { - m_cur_span->len += (int16)len; - } - else - { - m_cur_span++; - m_cur_span->covers = m_cover_ptr; - m_cur_span->x = (int16)x; - m_cur_span->len = (int16)len; - } - m_cover_ptr += len; - m_last_x = x + len - 1; - } - - //-------------------------------------------------------------------- - void add_span(int x, unsigned len, unsigned cover) - { - if(x == m_last_x+1 && - m_cur_span->len < 0 && - cover == *m_cur_span->covers) - { - m_cur_span->len -= (int16)len; - } - else - { - *m_cover_ptr = (cover_type)cover; - m_cur_span++; - m_cur_span->covers = m_cover_ptr++; - m_cur_span->x = (int16)x; - m_cur_span->len = (int16)(-int(len)); - } - m_last_x = x + len - 1; - } - - //-------------------------------------------------------------------- - void finalize(int y) - { - m_y = y; - } - - //-------------------------------------------------------------------- - void reset_spans() - { - m_last_x = 0x7FFFFFF0; - m_cover_ptr = &m_covers[0]; - m_cur_span = &m_spans[0]; - m_cur_span->len = 0; - } - - //-------------------------------------------------------------------- - int y() const { return m_y; } - unsigned num_spans() const { return unsigned(m_cur_span - &m_spans[0]); } - const_iterator begin() const { return &m_spans[1]; } - - private: - scanline_p8(const self_type&); - const self_type& operator = (const self_type&); - - int m_last_x; - int m_y; - pod_array m_covers; - cover_type* m_cover_ptr; - pod_array m_spans; - span* m_cur_span; - }; - - - - - - - - - //==========================================================scanline32_p8 - class scanline32_p8 - { - public: - typedef scanline32_p8 self_type; - typedef int8u cover_type; - typedef int32 coord_type; - - struct span - { - span() {} - span(coord_type x_, coord_type len_, const cover_type* covers_) : - x(x_), len(len_), covers(covers_) {} - - coord_type x; - coord_type len; // If negative, it's a solid span, covers is valid - const cover_type* covers; - }; - typedef pod_bvector span_array_type; - - - //-------------------------------------------------------------------- - class const_iterator - { - public: - const_iterator(const span_array_type& spans) : - m_spans(spans), - m_span_idx(0) - {} - - const span& operator*() const { return m_spans[m_span_idx]; } - const span* operator->() const { return &m_spans[m_span_idx]; } - - void operator ++ () { ++m_span_idx; } - - private: - const span_array_type& m_spans; - unsigned m_span_idx; - }; - - //-------------------------------------------------------------------- - scanline32_p8() : - m_max_len(0), - m_last_x(0x7FFFFFF0), - m_covers(), - m_cover_ptr(0) - { - } - - //-------------------------------------------------------------------- - void reset(int min_x, int max_x) - { - unsigned max_len = max_x - min_x + 3; - if(max_len > m_covers.size()) - { - m_covers.resize(max_len); - } - m_last_x = 0x7FFFFFF0; - m_cover_ptr = &m_covers[0]; - m_spans.remove_all(); - } - - //-------------------------------------------------------------------- - void add_cell(int x, unsigned cover) - { - *m_cover_ptr = cover_type(cover); - if(x == m_last_x+1 && m_spans.size() && m_spans.last().len > 0) - { - m_spans.last().len++; - } - else - { - m_spans.add(span(coord_type(x), 1, m_cover_ptr)); - } - m_last_x = x; - m_cover_ptr++; - } - - //-------------------------------------------------------------------- - void add_cells(int x, unsigned len, const cover_type* covers) - { - memcpy(m_cover_ptr, covers, len * sizeof(cover_type)); - if(x == m_last_x+1 && m_spans.size() && m_spans.last().len > 0) - { - m_spans.last().len += coord_type(len); - } - else - { - m_spans.add(span(coord_type(x), coord_type(len), m_cover_ptr)); - } - m_cover_ptr += len; - m_last_x = x + len - 1; - } - - //-------------------------------------------------------------------- - void add_span(int x, unsigned len, unsigned cover) - { - if(x == m_last_x+1 && - m_spans.size() && - m_spans.last().len < 0 && - cover == *m_spans.last().covers) - { - m_spans.last().len -= coord_type(len); - } - else - { - *m_cover_ptr = cover_type(cover); - m_spans.add(span(coord_type(x), -coord_type(len), m_cover_ptr++)); - } - m_last_x = x + len - 1; - } - - //-------------------------------------------------------------------- - void finalize(int y) - { - m_y = y; - } - - //-------------------------------------------------------------------- - void reset_spans() - { - m_last_x = 0x7FFFFFF0; - m_cover_ptr = &m_covers[0]; - m_spans.remove_all(); - } - - //-------------------------------------------------------------------- - int y() const { return m_y; } - unsigned num_spans() const { return m_spans.size(); } - const_iterator begin() const { return const_iterator(m_spans); } - - private: - scanline32_p8(const self_type&); - const self_type& operator = (const self_type&); - - unsigned m_max_len; - int m_last_x; - int m_y; - pod_array m_covers; - cover_type* m_cover_ptr; - span_array_type m_spans; - }; - - -} - - -#endif - diff --git a/uppdev/aggdraw/agg_scanline_storage_aa.h b/uppdev/aggdraw/agg_scanline_storage_aa.h deleted file mode 100644 index 09e3434e1..000000000 --- a/uppdev/aggdraw/agg_scanline_storage_aa.h +++ /dev/null @@ -1,824 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// Adaptation for 32-bit screen coordinates has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- - -#ifndef AGG_SCANLINE_STORAGE_AA_INCLUDED -#define AGG_SCANLINE_STORAGE_AA_INCLUDED - -#include -#include -#include -#include "agg_array.h" - - -namespace agg -{ - - //----------------------------------------------scanline_cell_storage - template class scanline_cell_storage - { - struct extra_span - { - unsigned len; - T* ptr; - }; - - public: - typedef T value_type; - - //--------------------------------------------------------------- - ~scanline_cell_storage() - { - remove_all(); - } - - //--------------------------------------------------------------- - scanline_cell_storage() : - m_cells(128-2), - m_extra_storage() - {} - - - // Copying - //--------------------------------------------------------------- - scanline_cell_storage(const scanline_cell_storage& v) : - m_cells(v.m_cells), - m_extra_storage() - { - copy_extra_storage(v); - } - - //--------------------------------------------------------------- - const scanline_cell_storage& - operator = (const scanline_cell_storage& v) - { - remove_all(); - m_cells = v.m_cells; - copy_extra_storage(v); - return *this; - } - - //--------------------------------------------------------------- - void remove_all() - { - int i; - for(i = m_extra_storage.size()-1; i >= 0; --i) - { - pod_allocator::deallocate(m_extra_storage[i].ptr, - m_extra_storage[i].len); - } - m_extra_storage.remove_all(); - m_cells.remove_all(); - } - - //--------------------------------------------------------------- - int add_cells(const T* cells, unsigned num_cells) - { - int idx = m_cells.allocate_continuous_block(num_cells); - if(idx >= 0) - { - T* ptr = &m_cells[idx]; - memcpy(ptr, cells, sizeof(T) * num_cells); - return idx; - } - extra_span s; - s.len = num_cells; - s.ptr = pod_allocator::allocate(num_cells); - memcpy(s.ptr, cells, sizeof(T) * num_cells); - m_extra_storage.add(s); - return -int(m_extra_storage.size()); - } - - //--------------------------------------------------------------- - const T* operator [] (int idx) const - { - if(idx >= 0) - { - if((unsigned)idx >= m_cells.size()) return 0; - return &m_cells[(unsigned)idx]; - } - unsigned i = unsigned(-idx - 1); - if(i >= m_extra_storage.size()) return 0; - return m_extra_storage[i].ptr; - } - - //--------------------------------------------------------------- - T* operator [] (int idx) - { - if(idx >= 0) - { - if((unsigned)idx >= m_cells.size()) return 0; - return &m_cells[(unsigned)idx]; - } - unsigned i = unsigned(-idx - 1); - if(i >= m_extra_storage.size()) return 0; - return m_extra_storage[i].ptr; - } - - private: - void copy_extra_storage(const scanline_cell_storage& v) - { - unsigned i; - for(i = 0; i < v.m_extra_storage.size(); ++i) - { - const extra_span& src = v.m_extra_storage[i]; - extra_span dst; - dst.len = src.len; - dst.ptr = pod_allocator::allocate(dst.len); - memcpy(dst.ptr, src.ptr, dst.len * sizeof(T)); - m_extra_storage.add(dst); - } - } - - pod_bvector m_cells; - pod_bvector m_extra_storage; - }; - - - - - - - //-----------------------------------------------scanline_storage_aa - template class scanline_storage_aa - { - public: - typedef T cover_type; - - //--------------------------------------------------------------- - struct span_data - { - int32 x; - int32 len; // If negative, it's a solid span, covers is valid - int covers_id; // The index of the cells in the scanline_cell_storage - }; - - //--------------------------------------------------------------- - struct scanline_data - { - int y; - unsigned num_spans; - unsigned start_span; - }; - - - //--------------------------------------------------------------- - class embedded_scanline - { - public: - - //----------------------------------------------------------- - class const_iterator - { - public: - struct span - { - int32 x; - int32 len; // If negative, it's a solid span, covers is valid - const T* covers; - }; - - const_iterator() : m_storage(0) {} - const_iterator(const embedded_scanline& sl) : - m_storage(sl.m_storage), - m_span_idx(sl.m_scanline.start_span) - { - init_span(); - } - - const span& operator*() const { return m_span; } - const span* operator->() const { return &m_span; } - - void operator ++ () - { - ++m_span_idx; - init_span(); - } - - private: - void init_span() - { - const span_data& s = m_storage->span_by_index(m_span_idx); - m_span.x = s.x; - m_span.len = s.len; - m_span.covers = m_storage->covers_by_index(s.covers_id); - } - - const scanline_storage_aa* m_storage; - unsigned m_span_idx; - span m_span; - }; - - friend class const_iterator; - - - //----------------------------------------------------------- - embedded_scanline(const scanline_storage_aa& storage) : - m_storage(&storage) - { - init(0); - } - - //----------------------------------------------------------- - void reset(int, int) {} - unsigned num_spans() const { return m_scanline.num_spans; } - int y() const { return m_scanline.y; } - const_iterator begin() const { return const_iterator(*this); } - - //----------------------------------------------------------- - void init(unsigned scanline_idx) - { - m_scanline_idx = scanline_idx; - m_scanline = m_storage->scanline_by_index(m_scanline_idx); - } - - private: - const scanline_storage_aa* m_storage; - scanline_data m_scanline; - unsigned m_scanline_idx; - }; - - - //--------------------------------------------------------------- - scanline_storage_aa() : - m_covers(), - m_spans(256-2), // Block increment size - m_scanlines(), - m_min_x( 0x7FFFFFFF), - m_min_y( 0x7FFFFFFF), - m_max_x(-0x7FFFFFFF), - m_max_y(-0x7FFFFFFF), - m_cur_scanline(0) - { - m_fake_scanline.y = 0; - m_fake_scanline.num_spans = 0; - m_fake_scanline.start_span = 0; - m_fake_span.x = 0; - m_fake_span.len = 0; - m_fake_span.covers_id = 0; - } - - // Renderer Interface - //--------------------------------------------------------------- - void prepare() - { - m_covers.remove_all(); - m_scanlines.remove_all(); - m_spans.remove_all(); - m_min_x = 0x7FFFFFFF; - m_min_y = 0x7FFFFFFF; - m_max_x = -0x7FFFFFFF; - m_max_y = -0x7FFFFFFF; - m_cur_scanline = 0; - } - - //--------------------------------------------------------------- - template void render(const Scanline& sl) - { - scanline_data sl_this; - - int y = sl.y(); - if(y < m_min_y) m_min_y = y; - if(y > m_max_y) m_max_y = y; - - sl_this.y = y; - sl_this.num_spans = sl.num_spans(); - sl_this.start_span = m_spans.size(); - typename Scanline::const_iterator span_iterator = sl.begin(); - - unsigned num_spans = sl_this.num_spans; - for(;;) - { - span_data sp; - - sp.x = span_iterator->x; - sp.len = span_iterator->len; - int len = abs(int(sp.len)); - sp.covers_id = - m_covers.add_cells(span_iterator->covers, - unsigned(len)); - m_spans.add(sp); - int x1 = sp.x; - int x2 = sp.x + len - 1; - if(x1 < m_min_x) m_min_x = x1; - if(x2 > m_max_x) m_max_x = x2; - if(--num_spans == 0) break; - ++span_iterator; - } - m_scanlines.add(sl_this); - } - - - //--------------------------------------------------------------- - // Iterate scanlines interface - int min_x() const { return m_min_x; } - int min_y() const { return m_min_y; } - int max_x() const { return m_max_x; } - int max_y() const { return m_max_y; } - - //--------------------------------------------------------------- - bool rewind_scanlines() - { - m_cur_scanline = 0; - return m_scanlines.size() > 0; - } - - - //--------------------------------------------------------------- - template bool sweep_scanline(Scanline& sl) - { - sl.reset_spans(); - for(;;) - { - if(m_cur_scanline >= m_scanlines.size()) return false; - const scanline_data& sl_this = m_scanlines[m_cur_scanline]; - - unsigned num_spans = sl_this.num_spans; - unsigned span_idx = sl_this.start_span; - do - { - const span_data& sp = m_spans[span_idx++]; - const T* covers = covers_by_index(sp.covers_id); - if(sp.len < 0) - { - sl.add_span(sp.x, unsigned(-sp.len), *covers); - } - else - { - sl.add_cells(sp.x, sp.len, covers); - } - } - while(--num_spans); - ++m_cur_scanline; - if(sl.num_spans()) - { - sl.finalize(sl_this.y); - break; - } - } - return true; - } - - - //--------------------------------------------------------------- - // Specialization for embedded_scanline - bool sweep_scanline(embedded_scanline& sl) - { - do - { - if(m_cur_scanline >= m_scanlines.size()) return false; - sl.init(m_cur_scanline); - ++m_cur_scanline; - } - while(sl.num_spans() == 0); - return true; - } - - //--------------------------------------------------------------- - unsigned byte_size() const - { - unsigned i; - unsigned size = sizeof(int32) * 4; // min_x, min_y, max_x, max_y - - for(i = 0; i < m_scanlines.size(); ++i) - { - size += sizeof(int32) * 3; // scanline size in bytes, Y, num_spans - - const scanline_data& sl_this = m_scanlines[i]; - - unsigned num_spans = sl_this.num_spans; - unsigned span_idx = sl_this.start_span; - do - { - const span_data& sp = m_spans[span_idx++]; - - size += sizeof(int32) * 2; // X, span_len - if(sp.len < 0) - { - size += sizeof(T); // cover - } - else - { - size += sizeof(T) * unsigned(sp.len); // covers - } - } - while(--num_spans); - } - return size; - } - - - //--------------------------------------------------------------- - static void write_int32(int8u* dst, int32 val) - { - dst[0] = ((const int8u*)&val)[0]; - dst[1] = ((const int8u*)&val)[1]; - dst[2] = ((const int8u*)&val)[2]; - dst[3] = ((const int8u*)&val)[3]; - } - - - //--------------------------------------------------------------- - void serialize(int8u* data) const - { - unsigned i; - - write_int32(data, min_x()); // min_x - data += sizeof(int32); - write_int32(data, min_y()); // min_y - data += sizeof(int32); - write_int32(data, max_x()); // max_x - data += sizeof(int32); - write_int32(data, max_y()); // max_y - data += sizeof(int32); - - for(i = 0; i < m_scanlines.size(); ++i) - { - const scanline_data& sl_this = m_scanlines[i]; - - int8u* size_ptr = data; - data += sizeof(int32); // Reserve space for scanline size in bytes - - write_int32(data, sl_this.y); // Y - data += sizeof(int32); - - write_int32(data, sl_this.num_spans); // num_spans - data += sizeof(int32); - - unsigned num_spans = sl_this.num_spans; - unsigned span_idx = sl_this.start_span; - do - { - const span_data& sp = m_spans[span_idx++]; - const T* covers = covers_by_index(sp.covers_id); - - write_int32(data, sp.x); // X - data += sizeof(int32); - - write_int32(data, sp.len); // span_len - data += sizeof(int32); - - if(sp.len < 0) - { - memcpy(data, covers, sizeof(T)); - data += sizeof(T); - } - else - { - memcpy(data, covers, unsigned(sp.len) * sizeof(T)); - data += sizeof(T) * unsigned(sp.len); - } - } - while(--num_spans); - write_int32(size_ptr, int32(unsigned(data - size_ptr))); - } - } - - - //--------------------------------------------------------------- - const scanline_data& scanline_by_index(unsigned i) const - { - return (i < m_scanlines.size()) ? m_scanlines[i] : m_fake_scanline; - } - - //--------------------------------------------------------------- - const span_data& span_by_index(unsigned i) const - { - return (i < m_spans.size()) ? m_spans[i] : m_fake_span; - } - - //--------------------------------------------------------------- - const T* covers_by_index(int i) const - { - return m_covers[i]; - } - - private: - scanline_cell_storage m_covers; - pod_bvector m_spans; - pod_bvector m_scanlines; - span_data m_fake_span; - scanline_data m_fake_scanline; - int m_min_x; - int m_min_y; - int m_max_x; - int m_max_y; - unsigned m_cur_scanline; - }; - - - typedef scanline_storage_aa scanline_storage_aa8; //--------scanline_storage_aa8 - typedef scanline_storage_aa scanline_storage_aa16; //--------scanline_storage_aa16 - typedef scanline_storage_aa scanline_storage_aa32; //--------scanline_storage_aa32 - - - - - //------------------------------------------serialized_scanlines_adaptor_aa - template class serialized_scanlines_adaptor_aa - { - public: - typedef T cover_type; - - //--------------------------------------------------------------------- - class embedded_scanline - { - public: - typedef T cover_type; - - //----------------------------------------------------------------- - class const_iterator - { - public: - struct span - { - int32 x; - int32 len; // If negative, it's a solid span, "covers" is valid - const T* covers; - }; - - const_iterator() : m_ptr(0) {} - const_iterator(const embedded_scanline& sl) : - m_ptr(sl.m_ptr), - m_dx(sl.m_dx) - { - init_span(); - } - - const span& operator*() const { return m_span; } - const span* operator->() const { return &m_span; } - - void operator ++ () - { - if(m_span.len < 0) - { - m_ptr += sizeof(T); - } - else - { - m_ptr += m_span.len * sizeof(T); - } - init_span(); - } - - private: - int read_int32() - { - int32 val; - ((int8u*)&val)[0] = *m_ptr++; - ((int8u*)&val)[1] = *m_ptr++; - ((int8u*)&val)[2] = *m_ptr++; - ((int8u*)&val)[3] = *m_ptr++; - return val; - } - - void init_span() - { - m_span.x = read_int32() + m_dx; - m_span.len = read_int32(); - m_span.covers = m_ptr; - } - - const int8u* m_ptr; - span m_span; - int m_dx; - }; - - friend class const_iterator; - - - //----------------------------------------------------------------- - embedded_scanline() : m_ptr(0), m_y(0), m_num_spans(0) {} - - //----------------------------------------------------------------- - void reset(int, int) {} - unsigned num_spans() const { return m_num_spans; } - int y() const { return m_y; } - const_iterator begin() const { return const_iterator(*this); } - - - private: - //----------------------------------------------------------------- - int read_int32() - { - int32 val; - ((int8u*)&val)[0] = *m_ptr++; - ((int8u*)&val)[1] = *m_ptr++; - ((int8u*)&val)[2] = *m_ptr++; - ((int8u*)&val)[3] = *m_ptr++; - return val; - } - - public: - //----------------------------------------------------------------- - void init(const int8u* ptr, int dx, int dy) - { - m_ptr = ptr; - m_y = read_int32() + dy; - m_num_spans = unsigned(read_int32()); - m_dx = dx; - } - - private: - const int8u* m_ptr; - int m_y; - unsigned m_num_spans; - int m_dx; - }; - - - - public: - //-------------------------------------------------------------------- - serialized_scanlines_adaptor_aa() : - m_data(0), - m_end(0), - m_ptr(0), - m_dx(0), - m_dy(0), - m_min_x(0x7FFFFFFF), - m_min_y(0x7FFFFFFF), - m_max_x(-0x7FFFFFFF), - m_max_y(-0x7FFFFFFF) - {} - - //-------------------------------------------------------------------- - serialized_scanlines_adaptor_aa(const int8u* data, unsigned size, - double dx, double dy) : - m_data(data), - m_end(data + size), - m_ptr(data), - m_dx(iround(dx)), - m_dy(iround(dy)), - m_min_x(0x7FFFFFFF), - m_min_y(0x7FFFFFFF), - m_max_x(-0x7FFFFFFF), - m_max_y(-0x7FFFFFFF) - {} - - //-------------------------------------------------------------------- - void init(const int8u* data, unsigned size, double dx, double dy) - { - m_data = data; - m_end = data + size; - m_ptr = data; - m_dx = iround(dx); - m_dy = iround(dy); - m_min_x = 0x7FFFFFFF; - m_min_y = 0x7FFFFFFF; - m_max_x = -0x7FFFFFFF; - m_max_y = -0x7FFFFFFF; - } - - private: - //-------------------------------------------------------------------- - int read_int32() - { - int32 val; - ((int8u*)&val)[0] = *m_ptr++; - ((int8u*)&val)[1] = *m_ptr++; - ((int8u*)&val)[2] = *m_ptr++; - ((int8u*)&val)[3] = *m_ptr++; - return val; - } - - //-------------------------------------------------------------------- - unsigned read_int32u() - { - int32u val; - ((int8u*)&val)[0] = *m_ptr++; - ((int8u*)&val)[1] = *m_ptr++; - ((int8u*)&val)[2] = *m_ptr++; - ((int8u*)&val)[3] = *m_ptr++; - return val; - } - - public: - // Iterate scanlines interface - //-------------------------------------------------------------------- - bool rewind_scanlines() - { - m_ptr = m_data; - if(m_ptr < m_end) - { - m_min_x = read_int32() + m_dx; - m_min_y = read_int32() + m_dy; - m_max_x = read_int32() + m_dx; - m_max_y = read_int32() + m_dy; - } - return m_ptr < m_end; - } - - //-------------------------------------------------------------------- - int min_x() const { return m_min_x; } - int min_y() const { return m_min_y; } - int max_x() const { return m_max_x; } - int max_y() const { return m_max_y; } - - //-------------------------------------------------------------------- - template bool sweep_scanline(Scanline& sl) - { - sl.reset_spans(); - for(;;) - { - if(m_ptr >= m_end) return false; - - read_int32(); // Skip scanline size in bytes - int y = read_int32() + m_dy; - unsigned num_spans = read_int32(); - - do - { - int x = read_int32() + m_dx; - int len = read_int32(); - - if(len < 0) - { - sl.add_span(x, unsigned(-len), *m_ptr); - m_ptr += sizeof(T); - } - else - { - sl.add_cells(x, len, m_ptr); - m_ptr += len * sizeof(T); - } - } - while(--num_spans); - - if(sl.num_spans()) - { - sl.finalize(y); - break; - } - } - return true; - } - - - //-------------------------------------------------------------------- - // Specialization for embedded_scanline - bool sweep_scanline(embedded_scanline& sl) - { - do - { - if(m_ptr >= m_end) return false; - - unsigned byte_size = read_int32u(); - sl.init(m_ptr, m_dx, m_dy); - m_ptr += byte_size - sizeof(int32); - } - while(sl.num_spans() == 0); - return true; - } - - private: - const int8u* m_data; - const int8u* m_end; - const int8u* m_ptr; - int m_dx; - int m_dy; - int m_min_x; - int m_min_y; - int m_max_x; - int m_max_y; - }; - - - - typedef serialized_scanlines_adaptor_aa serialized_scanlines_adaptor_aa8; //----serialized_scanlines_adaptor_aa8 - typedef serialized_scanlines_adaptor_aa serialized_scanlines_adaptor_aa16; //----serialized_scanlines_adaptor_aa16 - typedef serialized_scanlines_adaptor_aa serialized_scanlines_adaptor_aa32; //----serialized_scanlines_adaptor_aa32 - -} - - -#endif - diff --git a/uppdev/aggdraw/agg_scanline_storage_bin.h b/uppdev/aggdraw/agg_scanline_storage_bin.h deleted file mode 100644 index bdbbfa47e..000000000 --- a/uppdev/aggdraw/agg_scanline_storage_bin.h +++ /dev/null @@ -1,595 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// Adaptation for 32-bit screen coordinates has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- - - -#ifndef AGG_SCANLINE_STORAGE_BIN_INCLUDED -#define AGG_SCANLINE_STORAGE_BIN_INCLUDED - -#include -#include -#include -#include "agg_array.h" - - -namespace agg -{ - - //-----------------------------------------------scanline_storage_bin - class scanline_storage_bin - { - public: - //--------------------------------------------------------------- - struct span_data - { - int32 x; - int32 len; - }; - - //--------------------------------------------------------------- - struct scanline_data - { - int y; - unsigned num_spans; - unsigned start_span; - }; - - - //--------------------------------------------------------------- - class embedded_scanline - { - public: - - //----------------------------------------------------------- - class const_iterator - { - public: - const_iterator() : m_storage(0) {} - const_iterator(const embedded_scanline& sl) : - m_storage(sl.m_storage), - m_span_idx(sl.m_scanline.start_span) - { - m_span = m_storage->span_by_index(m_span_idx); - } - - const span_data& operator*() const { return m_span; } - const span_data* operator->() const { return &m_span; } - - void operator ++ () - { - ++m_span_idx; - m_span = m_storage->span_by_index(m_span_idx); - } - - private: - const scanline_storage_bin* m_storage; - unsigned m_span_idx; - span_data m_span; - }; - - friend class const_iterator; - - - //----------------------------------------------------------- - embedded_scanline(const scanline_storage_bin& storage) : - m_storage(&storage) - { - setup(0); - } - - //----------------------------------------------------------- - void reset(int, int) {} - unsigned num_spans() const { return m_scanline.num_spans; } - int y() const { return m_scanline.y; } - const_iterator begin() const { return const_iterator(*this); } - - //----------------------------------------------------------- - void setup(unsigned scanline_idx) - { - m_scanline_idx = scanline_idx; - m_scanline = m_storage->scanline_by_index(m_scanline_idx); - } - - private: - const scanline_storage_bin* m_storage; - scanline_data m_scanline; - unsigned m_scanline_idx; - }; - - - //--------------------------------------------------------------- - scanline_storage_bin() : - m_spans(256-2), // Block increment size - m_scanlines(), - m_min_x( 0x7FFFFFFF), - m_min_y( 0x7FFFFFFF), - m_max_x(-0x7FFFFFFF), - m_max_y(-0x7FFFFFFF), - m_cur_scanline(0) - { - m_fake_scanline.y = 0; - m_fake_scanline.num_spans = 0; - m_fake_scanline.start_span = 0; - m_fake_span.x = 0; - m_fake_span.len = 0; - } - - // Renderer Interface - //--------------------------------------------------------------- - void prepare() - { - m_scanlines.remove_all(); - m_spans.remove_all(); - m_min_x = 0x7FFFFFFF; - m_min_y = 0x7FFFFFFF; - m_max_x = -0x7FFFFFFF; - m_max_y = -0x7FFFFFFF; - m_cur_scanline = 0; - } - - //--------------------------------------------------------------- - template void render(const Scanline& sl) - { - scanline_data sl_this; - - int y = sl.y(); - if(y < m_min_y) m_min_y = y; - if(y > m_max_y) m_max_y = y; - - sl_this.y = y; - sl_this.num_spans = sl.num_spans(); - sl_this.start_span = m_spans.size(); - typename Scanline::const_iterator span_iterator = sl.begin(); - - unsigned num_spans = sl_this.num_spans; - for(;;) - { - span_data sp; - sp.x = span_iterator->x; - sp.len = (int32)abs((int)(span_iterator->len)); - m_spans.add(sp); - int x1 = sp.x; - int x2 = sp.x + sp.len - 1; - if(x1 < m_min_x) m_min_x = x1; - if(x2 > m_max_x) m_max_x = x2; - if(--num_spans == 0) break; - ++span_iterator; - } - m_scanlines.add(sl_this); - } - - - //--------------------------------------------------------------- - // Iterate scanlines interface - int min_x() const { return m_min_x; } - int min_y() const { return m_min_y; } - int max_x() const { return m_max_x; } - int max_y() const { return m_max_y; } - - //--------------------------------------------------------------- - bool rewind_scanlines() - { - m_cur_scanline = 0; - return m_scanlines.size() > 0; - } - - - //--------------------------------------------------------------- - template bool sweep_scanline(Scanline& sl) - { - sl.reset_spans(); - for(;;) - { - if(m_cur_scanline >= m_scanlines.size()) return false; - const scanline_data& sl_this = m_scanlines[m_cur_scanline]; - - unsigned num_spans = sl_this.num_spans; - unsigned span_idx = sl_this.start_span; - do - { - const span_data& sp = m_spans[span_idx++]; - sl.add_span(sp.x, sp.len, cover_full); - } - while(--num_spans); - - ++m_cur_scanline; - if(sl.num_spans()) - { - sl.finalize(sl_this.y); - break; - } - } - return true; - } - - - //--------------------------------------------------------------- - // Specialization for embedded_scanline - bool sweep_scanline(embedded_scanline& sl) - { - do - { - if(m_cur_scanline >= m_scanlines.size()) return false; - sl.setup(m_cur_scanline); - ++m_cur_scanline; - } - while(sl.num_spans() == 0); - return true; - } - - - //--------------------------------------------------------------- - unsigned byte_size() const - { - unsigned i; - unsigned size = sizeof(int32) * 4; // min_x, min_y, max_x, max_y - - for(i = 0; i < m_scanlines.size(); ++i) - { - size += sizeof(int32) * 2 + // Y, num_spans - unsigned(m_scanlines[i].num_spans) * sizeof(int32) * 2; // X, span_len - } - return size; - } - - - //--------------------------------------------------------------- - static void write_int32(int8u* dst, int32 val) - { - dst[0] = ((const int8u*)&val)[0]; - dst[1] = ((const int8u*)&val)[1]; - dst[2] = ((const int8u*)&val)[2]; - dst[3] = ((const int8u*)&val)[3]; - } - - - //--------------------------------------------------------------- - void serialize(int8u* data) const - { - unsigned i; - - write_int32(data, min_x()); // min_x - data += sizeof(int32); - write_int32(data, min_y()); // min_y - data += sizeof(int32); - write_int32(data, max_x()); // max_x - data += sizeof(int32); - write_int32(data, max_y()); // max_y - data += sizeof(int32); - - for(i = 0; i < m_scanlines.size(); ++i) - { - const scanline_data& sl_this = m_scanlines[i]; - - write_int32(data, sl_this.y); // Y - data += sizeof(int32); - - write_int32(data, sl_this.num_spans); // num_spans - data += sizeof(int32); - - unsigned num_spans = sl_this.num_spans; - unsigned span_idx = sl_this.start_span; - do - { - const span_data& sp = m_spans[span_idx++]; - - write_int32(data, sp.x); // X - data += sizeof(int32); - - write_int32(data, sp.len); // len - data += sizeof(int32); - } - while(--num_spans); - } - } - - - //--------------------------------------------------------------- - const scanline_data& scanline_by_index(unsigned i) const - { - return (i < m_scanlines.size()) ? m_scanlines[i] : m_fake_scanline; - } - - //--------------------------------------------------------------- - const span_data& span_by_index(unsigned i) const - { - return (i < m_spans.size()) ? m_spans[i] : m_fake_span; - } - - - private: - pod_bvector m_spans; - pod_bvector m_scanlines; - span_data m_fake_span; - scanline_data m_fake_scanline; - int m_min_x; - int m_min_y; - int m_max_x; - int m_max_y; - unsigned m_cur_scanline; - }; - - - - - - - - - - - - - - //---------------------------------------serialized_scanlines_adaptor_bin - class serialized_scanlines_adaptor_bin - { - public: - typedef bool cover_type; - - //-------------------------------------------------------------------- - class embedded_scanline - { - public: - - //---------------------------------------------------------------- - class const_iterator - { - public: - struct span - { - int32 x; - int32 len; - }; - - const_iterator() : m_ptr(0) {} - const_iterator(const embedded_scanline& sl) : - m_ptr(sl.m_ptr), - m_dx(sl.m_dx) - { - m_span.x = read_int32() + m_dx; - m_span.len = read_int32(); - } - - const span& operator*() const { return m_span; } - const span* operator->() const { return &m_span; } - - void operator ++ () - { - m_span.x = read_int32() + m_dx; - m_span.len = read_int32(); - } - - private: - int read_int32() - { - int32 val; - ((int8u*)&val)[0] = *m_ptr++; - ((int8u*)&val)[1] = *m_ptr++; - ((int8u*)&val)[2] = *m_ptr++; - ((int8u*)&val)[3] = *m_ptr++; - return val; - } - - const int8u* m_ptr; - span m_span; - int m_dx; - }; - - friend class const_iterator; - - - //---------------------------------------------------------------- - embedded_scanline() : m_ptr(0), m_y(0), m_num_spans(0) {} - - //---------------------------------------------------------------- - void reset(int, int) {} - unsigned num_spans() const { return m_num_spans; } - int y() const { return m_y; } - const_iterator begin() const { return const_iterator(*this); } - - - private: - //---------------------------------------------------------------- - int read_int32() - { - int32 val; - ((int8u*)&val)[0] = *m_ptr++; - ((int8u*)&val)[1] = *m_ptr++; - ((int8u*)&val)[2] = *m_ptr++; - ((int8u*)&val)[3] = *m_ptr++; - return val; - } - - public: - //---------------------------------------------------------------- - void init(const int8u* ptr, int dx, int dy) - { - m_ptr = ptr; - m_y = read_int32() + dy; - m_num_spans = unsigned(read_int32()); - m_dx = dx; - } - - private: - const int8u* m_ptr; - int m_y; - unsigned m_num_spans; - int m_dx; - }; - - - - public: - //-------------------------------------------------------------------- - serialized_scanlines_adaptor_bin() : - m_data(0), - m_end(0), - m_ptr(0), - m_dx(0), - m_dy(0), - m_min_x(0x7FFFFFFF), - m_min_y(0x7FFFFFFF), - m_max_x(-0x7FFFFFFF), - m_max_y(-0x7FFFFFFF) - {} - - //-------------------------------------------------------------------- - serialized_scanlines_adaptor_bin(const int8u* data, unsigned size, - double dx, double dy) : - m_data(data), - m_end(data + size), - m_ptr(data), - m_dx(iround(dx)), - m_dy(iround(dy)), - m_min_x(0x7FFFFFFF), - m_min_y(0x7FFFFFFF), - m_max_x(-0x7FFFFFFF), - m_max_y(-0x7FFFFFFF) - {} - - //-------------------------------------------------------------------- - void init(const int8u* data, unsigned size, double dx, double dy) - { - m_data = data; - m_end = data + size; - m_ptr = data; - m_dx = iround(dx); - m_dy = iround(dy); - m_min_x = 0x7FFFFFFF; - m_min_y = 0x7FFFFFFF; - m_max_x = -0x7FFFFFFF; - m_max_y = -0x7FFFFFFF; - } - - private: - //-------------------------------------------------------------------- - int read_int32() - { - int32 val; - ((int8u*)&val)[0] = *m_ptr++; - ((int8u*)&val)[1] = *m_ptr++; - ((int8u*)&val)[2] = *m_ptr++; - ((int8u*)&val)[3] = *m_ptr++; - return val; - } - - public: - // Iterate scanlines interface - //-------------------------------------------------------------------- - bool rewind_scanlines() - { - m_ptr = m_data; - if(m_ptr < m_end) - { - m_min_x = read_int32() + m_dx; - m_min_y = read_int32() + m_dy; - m_max_x = read_int32() + m_dx; - m_max_y = read_int32() + m_dy; - } - return m_ptr < m_end; - } - - //-------------------------------------------------------------------- - int min_x() const { return m_min_x; } - int min_y() const { return m_min_y; } - int max_x() const { return m_max_x; } - int max_y() const { return m_max_y; } - - //-------------------------------------------------------------------- - template bool sweep_scanline(Scanline& sl) - { - sl.reset_spans(); - for(;;) - { - if(m_ptr >= m_end) return false; - - int y = read_int32() + m_dy; - unsigned num_spans = read_int32(); - - do - { - int x = read_int32() + m_dx; - int len = read_int32(); - - if(len < 0) len = -len; - sl.add_span(x, unsigned(len), cover_full); - } - while(--num_spans); - - if(sl.num_spans()) - { - sl.finalize(y); - break; - } - } - return true; - } - - - //-------------------------------------------------------------------- - // Specialization for embedded_scanline - bool sweep_scanline(embedded_scanline& sl) - { - do - { - if(m_ptr >= m_end) return false; - - sl.init(m_ptr, m_dx, m_dy); - - // Jump to the next scanline - //-------------------------- - read_int32(); // Y - int num_spans = read_int32(); // num_spans - m_ptr += num_spans * sizeof(int32) * 2; - } - while(sl.num_spans() == 0); - return true; - } - - private: - const int8u* m_data; - const int8u* m_end; - const int8u* m_ptr; - int m_dx; - int m_dy; - int m_min_x; - int m_min_y; - int m_max_x; - int m_max_y; - }; - - - -} - -#endif - diff --git a/uppdev/aggdraw/agg_scanline_u.h b/uppdev/aggdraw/agg_scanline_u.h deleted file mode 100644 index ad9b28386..000000000 --- a/uppdev/aggdraw/agg_scanline_u.h +++ /dev/null @@ -1,508 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// Adaptation for 32-bit screen coordinates (scanline32_u) has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- - -#ifndef AGG_SCANLINE_U_INCLUDED -#define AGG_SCANLINE_U_INCLUDED - -#include "agg_array.h" - -namespace agg -{ - //=============================================================scanline_u8 - // - // Unpacked scanline container class - // - // This class is used to transfer data from a scanline rasterizer - // to the rendering buffer. It's organized very simple. The class stores - // information of horizontal spans to render it into a pixel-map buffer. - // Each span has staring X, length, and an array of bytes that determine the - // cover-values for each pixel. - // Before using this class you should know the minimal and maximal pixel - // coordinates of your scanline. The protocol of using is: - // 1. reset(min_x, max_x) - // 2. add_cell() / add_span() - accumulate scanline. - // When forming one scanline the next X coordinate must be always greater - // than the last stored one, i.e. it works only with ordered coordinates. - // 3. Call finalize(y) and render the scanline. - // 3. Call reset_spans() to prepare for the new scanline. - // - // 4. Rendering: - // - // Scanline provides an iterator class that allows you to extract - // the spans and the cover values for each pixel. Be aware that clipping - // has not been done yet, so you should perform it yourself. - // Use scanline_u8::iterator to render spans: - //------------------------------------------------------------------------- - // - // int y = sl.y(); // Y-coordinate of the scanline - // - // ************************************ - // ...Perform vertical clipping here... - // ************************************ - // - // scanline_u8::const_iterator span = sl.begin(); - // - // unsigned char* row = m_rbuf->row(y); // The the address of the beginning - // // of the current row - // - // unsigned num_spans = sl.num_spans(); // Number of spans. It's guaranteed that - // // num_spans is always greater than 0. - // - // do - // { - // const scanline_u8::cover_type* covers = - // span->covers; // The array of the cover values - // - // int num_pix = span->len; // Number of pixels of the span. - // // Always greater than 0, still it's - // // better to use "int" instead of - // // "unsigned" because it's more - // // convenient for clipping - // int x = span->x; - // - // ************************************** - // ...Perform horizontal clipping here... - // ...you have x, covers, and pix_count.. - // ************************************** - // - // unsigned char* dst = row + x; // Calculate the start address of the row. - // // In this case we assume a simple - // // grayscale image 1-byte per pixel. - // do - // { - // *dst++ = *covers++; // Hypotetical rendering. - // } - // while(--num_pix); - // - // ++span; - // } - // while(--num_spans); // num_spans cannot be 0, so this loop is quite safe - //------------------------------------------------------------------------ - // - // The question is: why should we accumulate the whole scanline when we - // could render just separate spans when they're ready? - // That's because using the scanline is generally faster. When is consists - // of more than one span the conditions for the processor cash system - // are better, because switching between two different areas of memory - // (that can be very large) occurs less frequently. - //------------------------------------------------------------------------ - class scanline_u8 - { - public: - typedef scanline_u8 self_type; - typedef int8u cover_type; - typedef int16 coord_type; - - //-------------------------------------------------------------------- - struct span - { - coord_type x; - coord_type len; - cover_type* covers; - }; - - typedef span* iterator; - typedef const span* const_iterator; - - //-------------------------------------------------------------------- - scanline_u8() : - m_min_x(0), - m_last_x(0x7FFFFFF0), - m_cur_span(0) - {} - - //-------------------------------------------------------------------- - void reset(int min_x, int max_x) - { - unsigned max_len = max_x - min_x + 2; - if(max_len > m_spans.size()) - { - m_spans.resize(max_len); - m_covers.resize(max_len); - } - m_last_x = 0x7FFFFFF0; - m_min_x = min_x; - m_cur_span = &m_spans[0]; - } - - //-------------------------------------------------------------------- - void add_cell(int x, unsigned cover) - { - x -= m_min_x; - m_covers[x] = (cover_type)cover; - if(x == m_last_x+1) - { - m_cur_span->len++; - } - else - { - m_cur_span++; - m_cur_span->x = (coord_type)(x + m_min_x); - m_cur_span->len = 1; - m_cur_span->covers = &m_covers[x]; - } - m_last_x = x; - } - - //-------------------------------------------------------------------- - void add_cells(int x, unsigned len, const cover_type* covers) - { - x -= m_min_x; - memcpy(&m_covers[x], covers, len * sizeof(cover_type)); - if(x == m_last_x+1) - { - m_cur_span->len += (coord_type)len; - } - else - { - m_cur_span++; - m_cur_span->x = (coord_type)(x + m_min_x); - m_cur_span->len = (coord_type)len; - m_cur_span->covers = &m_covers[x]; - } - m_last_x = x + len - 1; - } - - //-------------------------------------------------------------------- - void add_span(int x, unsigned len, unsigned cover) - { - x -= m_min_x; - memset(&m_covers[x], cover, len); - if(x == m_last_x+1) - { - m_cur_span->len += (coord_type)len; - } - else - { - m_cur_span++; - m_cur_span->x = (coord_type)(x + m_min_x); - m_cur_span->len = (coord_type)len; - m_cur_span->covers = &m_covers[x]; - } - m_last_x = x + len - 1; - } - - //-------------------------------------------------------------------- - void finalize(int y) - { - m_y = y; - } - - //-------------------------------------------------------------------- - void reset_spans() - { - m_last_x = 0x7FFFFFF0; - m_cur_span = &m_spans[0]; - } - - //-------------------------------------------------------------------- - int y() const { return m_y; } - unsigned num_spans() const { return unsigned(m_cur_span - &m_spans[0]); } - const_iterator begin() const { return &m_spans[1]; } - iterator begin() { return &m_spans[1]; } - - private: - scanline_u8(const self_type&); - const self_type& operator = (const self_type&); - - private: - int m_min_x; - int m_last_x; - int m_y; - pod_array m_covers; - pod_array m_spans; - span* m_cur_span; - }; - - - - - //==========================================================scanline_u8_am - // - // The scanline container with alpha-masking - // - //------------------------------------------------------------------------ - template - class scanline_u8_am : public scanline_u8 - { - public: - typedef scanline_u8 base_type; - typedef AlphaMask alpha_mask_type; - typedef base_type::cover_type cover_type; - typedef base_type::coord_type coord_type; - - scanline_u8_am() : base_type(), m_alpha_mask(0) {} - scanline_u8_am(const AlphaMask& am) : base_type(), m_alpha_mask(&am) {} - - //-------------------------------------------------------------------- - void finalize(int span_y) - { - base_type::finalize(span_y); - if(m_alpha_mask) - { - typename base_type::iterator span = base_type::begin(); - unsigned count = base_type::num_spans(); - do - { - m_alpha_mask->combine_hspan(span->x, - base_type::y(), - span->covers, - span->len); - ++span; - } - while(--count); - } - } - - private: - const AlphaMask* m_alpha_mask; - }; - - - - - //===========================================================scanline32_u8 - class scanline32_u8 - { - public: - typedef scanline32_u8 self_type; - typedef int8u cover_type; - typedef int32 coord_type; - - //-------------------------------------------------------------------- - struct span - { - span() {} - span(coord_type x_, coord_type len_, cover_type* covers_) : - x(x_), len(len_), covers(covers_) {} - - coord_type x; - coord_type len; - cover_type* covers; - }; - - typedef pod_bvector span_array_type; - - //-------------------------------------------------------------------- - class const_iterator - { - public: - const_iterator(const span_array_type& spans) : - m_spans(spans), - m_span_idx(0) - {} - - const span& operator*() const { return m_spans[m_span_idx]; } - const span* operator->() const { return &m_spans[m_span_idx]; } - - void operator ++ () { ++m_span_idx; } - - private: - const span_array_type& m_spans; - unsigned m_span_idx; - }; - - //-------------------------------------------------------------------- - class iterator - { - public: - iterator(span_array_type& spans) : - m_spans(spans), - m_span_idx(0) - {} - - span& operator*() { return m_spans[m_span_idx]; } - span* operator->() { return &m_spans[m_span_idx]; } - - void operator ++ () { ++m_span_idx; } - - private: - span_array_type& m_spans; - unsigned m_span_idx; - }; - - - - //-------------------------------------------------------------------- - scanline32_u8() : - m_min_x(0), - m_last_x(0x7FFFFFF0), - m_covers() - {} - - //-------------------------------------------------------------------- - void reset(int min_x, int max_x) - { - unsigned max_len = max_x - min_x + 2; - if(max_len > m_covers.size()) - { - m_covers.resize(max_len); - } - m_last_x = 0x7FFFFFF0; - m_min_x = min_x; - m_spans.remove_all(); - } - - //-------------------------------------------------------------------- - void add_cell(int x, unsigned cover) - { - x -= m_min_x; - m_covers[x] = cover_type(cover); - if(x == m_last_x+1) - { - m_spans.last().len++; - } - else - { - m_spans.add(span(coord_type(x + m_min_x), 1, &m_covers[x])); - } - m_last_x = x; - } - - //-------------------------------------------------------------------- - void add_cells(int x, unsigned len, const cover_type* covers) - { - x -= m_min_x; - memcpy(&m_covers[x], covers, len * sizeof(cover_type)); - if(x == m_last_x+1) - { - m_spans.last().len += coord_type(len); - } - else - { - m_spans.add(span(coord_type(x + m_min_x), - coord_type(len), - &m_covers[x])); - } - m_last_x = x + len - 1; - } - - //-------------------------------------------------------------------- - void add_span(int x, unsigned len, unsigned cover) - { - x -= m_min_x; - memset(&m_covers[x], cover, len); - if(x == m_last_x+1) - { - m_spans.last().len += coord_type(len); - } - else - { - m_spans.add(span(coord_type(x + m_min_x), - coord_type(len), - &m_covers[x])); - } - m_last_x = x + len - 1; - } - - //-------------------------------------------------------------------- - void finalize(int y) - { - m_y = y; - } - - //-------------------------------------------------------------------- - void reset_spans() - { - m_last_x = 0x7FFFFFF0; - m_spans.remove_all(); - } - - //-------------------------------------------------------------------- - int y() const { return m_y; } - unsigned num_spans() const { return m_spans.size(); } - const_iterator begin() const { return const_iterator(m_spans); } - iterator begin() { return iterator(m_spans); } - - private: - scanline32_u8(const self_type&); - const self_type& operator = (const self_type&); - - private: - int m_min_x; - int m_last_x; - int m_y; - pod_array m_covers; - span_array_type m_spans; - }; - - - - - //========================================================scanline32_u8_am - // - // The scanline container with alpha-masking - // - //------------------------------------------------------------------------ - template - class scanline32_u8_am : public scanline32_u8 - { - public: - typedef scanline_u8 base_type; - typedef AlphaMask alpha_mask_type; - typedef base_type::cover_type cover_type; - typedef base_type::coord_type coord_type; - - - scanline32_u8_am() : base_type(), m_alpha_mask(0) {} - scanline32_u8_am(const AlphaMask& am) : base_type(), m_alpha_mask(&am) {} - - //-------------------------------------------------------------------- - void finalize(int span_y) - { - base_type::finalize(span_y); - if(m_alpha_mask) - { - typename base_type::iterator span = base_type::begin(); - unsigned count = base_type::num_spans(); - do - { - m_alpha_mask->combine_hspan(span->x, - base_type::y(), - span->covers, - span->len); - ++span; - } - while(--count); - } - } - - private: - const AlphaMask* m_alpha_mask; - }; - - - -} - -#endif - diff --git a/uppdev/aggdraw/agg_shorten_path.h b/uppdev/aggdraw/agg_shorten_path.h deleted file mode 100644 index c914c42b7..000000000 --- a/uppdev/aggdraw/agg_shorten_path.h +++ /dev/null @@ -1,75 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_SHORTEN_PATH_INCLUDED -#define AGG_SHORTEN_PATH_INCLUDED - -#include "agg_basics.h" -#include "agg_vertex_sequence.h" - -namespace agg -{ - - //===========================================================shorten_path - template - void shorten_path(VertexSequence& vs, double s, unsigned closed = 0) - { - typedef typename VertexSequence::value_type vertex_type; - - if(s > 0.0 && vs.size() > 1) - { - double d; - int n = int(vs.size() - 2); - while(n) - { - d = vs[n].dist; - if(d > s) break; - vs.remove_last(); - s -= d; - --n; - } - if(vs.size() < 2) - { - vs.remove_all(); - } - else - { - n = vs.size() - 1; - vertex_type& prev = vs[n-1]; - vertex_type& last = vs[n]; - d = (prev.dist - s) / prev.dist; - double x = prev.x + (last.x - prev.x) * d; - double y = prev.y + (last.y - prev.y) * d; - last.x = x; - last.y = y; - if(!prev(last)) vs.remove_last(); - vs.close(closed != 0); - } - } - } - - -} - -#endif diff --git a/uppdev/aggdraw/agg_simul_eq.h b/uppdev/aggdraw/agg_simul_eq.h deleted file mode 100644 index c45f5ca33..000000000 --- a/uppdev/aggdraw/agg_simul_eq.h +++ /dev/null @@ -1,153 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_SIMUL_EQ_INCLUDED -#define AGG_SIMUL_EQ_INCLUDED - -#include -#include "agg_basics.h" - -namespace agg -{ - - //=============================================================swap_arrays - template void swap_arrays(T* a1, T* a2, unsigned n) - { - unsigned i; - for(i = 0; i < n; i++) - { - T tmp = *a1; - *a1++ = *a2; - *a2++ = tmp; - } - } - - - //============================================================matrix_pivot - template - struct matrix_pivot - { - static int pivot(double m[Rows][Cols], unsigned row) - { - int k = int(row); - double max_val, tmp; - - max_val = -1.0; - unsigned i; - for(i = row; i < Rows; i++) - { - if((tmp = fabs(m[i][row])) > max_val && tmp != 0.0) - { - max_val = tmp; - k = i; - } - } - - if(m[k][row] == 0.0) - { - return -1; - } - - if(k != int(row)) - { - swap_arrays(m[k], m[row], Cols); - return k; - } - return 0; - } - }; - - - - //===============================================================simul_eq - template - struct simul_eq - { - static bool solve(const double left[Size][Size], - const double right[Size][RightCols], - double result[Size][RightCols]) - { - unsigned i, j, k; - double a1; - - double tmp[Size][Size + RightCols]; - - for(i = 0; i < Size; i++) - { - for(j = 0; j < Size; j++) - { - tmp[i][j] = left[i][j]; - } - for(j = 0; j < RightCols; j++) - { - tmp[i][Size + j] = right[i][j]; - } - } - - for(k = 0; k < Size; k++) - { - if(matrix_pivot::pivot(tmp, k) < 0) - { - return false; // Singularity.... - } - - a1 = tmp[k][k]; - - for(j = k; j < Size + RightCols; j++) - { - tmp[k][j] /= a1; - } - - for(i = k + 1; i < Size; i++) - { - a1 = tmp[i][k]; - for (j = k; j < Size + RightCols; j++) - { - tmp[i][j] -= a1 * tmp[k][j]; - } - } - } - - - for(k = 0; k < RightCols; k++) - { - int m; - for(m = int(Size - 1); m >= 0; m--) - { - result[m][k] = tmp[m][Size + k]; - for(j = m + 1; j < Size; j++) - { - result[m][k] -= tmp[m][j] * result[j][k]; - } - } - } - return true; - } - - }; - - -} - -#endif diff --git a/uppdev/aggdraw/agg_span_allocator.h b/uppdev/aggdraw/agg_span_allocator.h deleted file mode 100644 index 6a9c3835a..000000000 --- a/uppdev/aggdraw/agg_span_allocator.h +++ /dev/null @@ -1,63 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_SPAN_ALLOCATOR_INCLUDED -#define AGG_SPAN_ALLOCATOR_INCLUDED - -#include "agg_array.h" - -namespace agg -{ - //----------------------------------------------------------span_allocator - template class span_allocator - { - public: - typedef ColorT color_type; - - //-------------------------------------------------------------------- - AGG_INLINE color_type* allocate(unsigned span_len) - { - if(span_len > m_span.size()) - { - // To reduce the number of reallocs we align the - // span_len to 256 color elements. - // Well, I just like this number and it looks reasonable. - //----------------------- - m_span.resize(((span_len + 255) >> 8) << 8); - } - return &m_span[0]; - } - - AGG_INLINE color_type* span() { return &m_span[0]; } - AGG_INLINE unsigned max_span_len() const { return m_span.size(); } - - private: - pod_array m_span; - }; -} - - -#endif - - diff --git a/uppdev/aggdraw/agg_span_converter.h b/uppdev/aggdraw/agg_span_converter.h deleted file mode 100644 index 99f1a2398..000000000 --- a/uppdev/aggdraw/agg_span_converter.h +++ /dev/null @@ -1,65 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_SPAN_CONVERTER_INCLUDED -#define AGG_SPAN_CONVERTER_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - //----------------------------------------------------------span_converter - template class span_converter - { - public: - typedef typename SpanGenerator::color_type color_type; - - span_converter(SpanGenerator& span_gen, SpanConverter& span_cnv) : - m_span_gen(&span_gen), m_span_cnv(&span_cnv) {} - - void attach_generator(SpanGenerator& span_gen) { m_span_gen = &span_gen; } - void attach_converter(SpanConverter& span_cnv) { m_span_cnv = &span_cnv; } - - //-------------------------------------------------------------------- - void prepare() - { - m_span_gen->prepare(); - m_span_cnv->prepare(); - } - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - m_span_gen->generate(span, x, y, len); - m_span_cnv->generate(span, x, y, len); - } - - private: - SpanGenerator* m_span_gen; - SpanConverter* m_span_cnv; - }; - -} - -#endif diff --git a/uppdev/aggdraw/agg_span_gouraud.h b/uppdev/aggdraw/agg_span_gouraud.h deleted file mode 100644 index 9af2ab001..000000000 --- a/uppdev/aggdraw/agg_span_gouraud.h +++ /dev/null @@ -1,181 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_SPAN_GOURAUD_INCLUDED -#define AGG_SPAN_GOURAUD_INCLUDED - -#include "agg_basics.h" -#include "agg_math.h" - -namespace agg -{ - - //============================================================span_gouraud - template class span_gouraud - { - public: - typedef ColorT color_type; - - struct coord_type - { - double x; - double y; - color_type color; - }; - - //-------------------------------------------------------------------- - span_gouraud() : - m_vertex(0) - { - m_cmd[0] = path_cmd_stop; - } - - //-------------------------------------------------------------------- - span_gouraud(const color_type& c1, - const color_type& c2, - const color_type& c3, - double x1, double y1, - double x2, double y2, - double x3, double y3, - double d) : - m_vertex(0) - { - colors(c1, c2, c3); - triangle(x1, y1, x2, y2, x3, y3, d); - } - - //-------------------------------------------------------------------- - void colors(ColorT c1, ColorT c2, ColorT c3) - { - m_coord[0].color = c1; - m_coord[1].color = c2; - m_coord[2].color = c3; - } - - //-------------------------------------------------------------------- - // Sets the triangle and dilates it if needed. - // The trick here is to calculate beveled joins in the vertices of the - // triangle and render it as a 6-vertex polygon. - // It's necessary to achieve numerical stability. - // However, the coordinates to interpolate colors are calculated - // as miter joins (calc_intersection). - void triangle(double x1, double y1, - double x2, double y2, - double x3, double y3, - double d) - { - m_coord[0].x = m_x[0] = x1; - m_coord[0].y = m_y[0] = y1; - m_coord[1].x = m_x[1] = x2; - m_coord[1].y = m_y[1] = y2; - m_coord[2].x = m_x[2] = x3; - m_coord[2].y = m_y[2] = y3; - m_cmd[0] = path_cmd_move_to; - m_cmd[1] = path_cmd_line_to; - m_cmd[2] = path_cmd_line_to; - m_cmd[3] = path_cmd_stop; - - if(d != 0.0) - { - dilate_triangle(m_coord[0].x, m_coord[0].y, - m_coord[1].x, m_coord[1].y, - m_coord[2].x, m_coord[2].y, - m_x, m_y, d); - - calc_intersection(m_x[4], m_y[4], m_x[5], m_y[5], - m_x[0], m_y[0], m_x[1], m_y[1], - &m_coord[0].x, &m_coord[0].y); - - calc_intersection(m_x[0], m_y[0], m_x[1], m_y[1], - m_x[2], m_y[2], m_x[3], m_y[3], - &m_coord[1].x, &m_coord[1].y); - - calc_intersection(m_x[2], m_y[2], m_x[3], m_y[3], - m_x[4], m_y[4], m_x[5], m_y[5], - &m_coord[2].x, &m_coord[2].y); - m_cmd[3] = path_cmd_line_to; - m_cmd[4] = path_cmd_line_to; - m_cmd[5] = path_cmd_line_to; - m_cmd[6] = path_cmd_stop; - } - } - - //-------------------------------------------------------------------- - // Vertex Source Interface to feed the coordinates to the rasterizer - void rewind(unsigned) - { - m_vertex = 0; - } - - //-------------------------------------------------------------------- - unsigned vertex(double* x, double* y) - { - *x = m_x[m_vertex]; - *y = m_y[m_vertex]; - return m_cmd[m_vertex++]; - } - - protected: - //-------------------------------------------------------------------- - void arrange_vertices(coord_type* coord) const - { - coord[0] = m_coord[0]; - coord[1] = m_coord[1]; - coord[2] = m_coord[2]; - - if(m_coord[0].y > m_coord[2].y) - { - coord[0] = m_coord[2]; - coord[2] = m_coord[0]; - } - - coord_type tmp; - if(coord[0].y > coord[1].y) - { - tmp = coord[1]; - coord[1] = coord[0]; - coord[0] = tmp; - } - - if(coord[1].y > coord[2].y) - { - tmp = coord[2]; - coord[2] = coord[1]; - coord[1] = tmp; - } - } - - private: - //-------------------------------------------------------------------- - coord_type m_coord[3]; - double m_x[8]; - double m_y[8]; - unsigned m_cmd[8]; - unsigned m_vertex; - }; - -} - -#endif - diff --git a/uppdev/aggdraw/agg_span_gouraud_gray.h b/uppdev/aggdraw/agg_span_gouraud_gray.h deleted file mode 100644 index 46a446ce0..000000000 --- a/uppdev/aggdraw/agg_span_gouraud_gray.h +++ /dev/null @@ -1,250 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// Adaptation for high precision colors has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- - -#ifndef AGG_SPAN_GOURAUD_GRAY_INCLUDED -#define AGG_SPAN_GOURAUD_GRAY_INCLUDED - -#include "agg_basics.h" -#include "agg_color_gray.h" -#include "agg_dda_line.h" -#include "agg_span_gouraud.h" - -namespace agg -{ - - //=======================================================span_gouraud_gray - template class span_gouraud_gray : public span_gouraud - { - public: - typedef ColorT color_type; - typedef typename color_type::value_type value_type; - typedef span_gouraud base_type; - typedef typename base_type::coord_type coord_type; - enum subpixel_scale_e - { - subpixel_shift = 4, - subpixel_scale = 1 << subpixel_shift - }; - - private: - //-------------------------------------------------------------------- - struct gray_calc - { - void init(const coord_type& c1, const coord_type& c2) - { - m_x1 = c1.x - 0.5; - m_y1 = c1.y - 0.5; - m_dx = c2.x - c1.x; - double dy = c2.y - c1.y; - m_1dy = (fabs(dy) < 1e-10) ? 1e10 : 1.0 / dy; - m_v1 = c1.color.v; - m_a1 = c1.color.a; - m_dv = c2.color.v - m_v1; - m_da = c2.color.a - m_a1; - } - - void calc(double y) - { - double k = (y - m_y1) * m_1dy; - if(k < 0.0) k = 0.0; - if(k > 1.0) k = 1.0; - m_v = m_v1 + iround(m_dv * k); - m_a = m_a1 + iround(m_da * k); - m_x = iround((m_x1 + m_dx * k) * subpixel_scale); - } - - double m_x1; - double m_y1; - double m_dx; - double m_1dy; - int m_v1; - int m_a1; - int m_dv; - int m_da; - int m_v; - int m_a; - int m_x; - }; - - - public: - //-------------------------------------------------------------------- - span_gouraud_gray() {} - span_gouraud_gray(const color_type& c1, - const color_type& c2, - const color_type& c3, - double x1, double y1, - double x2, double y2, - double x3, double y3, - double d = 0) : - base_type(c1, c2, c3, x1, y1, x2, y2, x3, y3, d) - {} - - //-------------------------------------------------------------------- - void prepare() - { - coord_type coord[3]; - base_type::arrange_vertices(coord); - - m_y2 = int(coord[1].y); - - m_swap = cross_product(coord[0].x, coord[0].y, - coord[2].x, coord[2].y, - coord[1].x, coord[1].y) < 0.0; - - m_c1.init(coord[0], coord[2]); - m_c2.init(coord[0], coord[1]); - m_c3.init(coord[1], coord[2]); - } - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - m_c1.calc(y); - const gray_calc* pc1 = &m_c1; - const gray_calc* pc2 = &m_c2; - - if(y < m_y2) - { - // Bottom part of the triangle (first subtriangle) - //------------------------- - m_c2.calc(y + m_c2.m_1dy); - } - else - { - // Upper part (second subtriangle) - //------------------------- - m_c3.calc(y - m_c3.m_1dy); - pc2 = &m_c3; - } - - if(m_swap) - { - // It means that the triangle is oriented clockwise, - // so that we need to swap the controlling structures - //------------------------- - const gray_calc* t = pc2; - pc2 = pc1; - pc1 = t; - } - - // Get the horizontal length with subpixel accuracy - // and protect it from division by zero - //------------------------- - int nlen = abs(pc2->m_x - pc1->m_x); - if(nlen <= 0) nlen = 1; - - dda_line_interpolator<14> v(pc1->m_v, pc2->m_v, nlen); - dda_line_interpolator<14> a(pc1->m_a, pc2->m_a, nlen); - - // Calculate the starting point of the gradient with subpixel - // accuracy and correct (roll back) the interpolators. - // This operation will also clip the beginning of the span - // if necessary. - //------------------------- - int start = pc1->m_x - (x << subpixel_shift); - v -= start; - a -= start; - nlen += start; - - int vv, va; - enum lim_e { lim = color_type::base_mask }; - - // Beginning part of the span. Since we rolled back the - // interpolators, the color values may have overflow. - // So that, we render the beginning part with checking - // for overflow. It lasts until "start" is positive; - // typically it's 1-2 pixels, but may be more in some cases. - //------------------------- - while(len && start > 0) - { - vv = v.y(); - va = a.y(); - if(vv < 0) vv = 0; if(vv > lim) vv = lim; - if(va < 0) va = 0; if(va > lim) va = lim; - span->v = (value_type)vv; - span->a = (value_type)va; - v += subpixel_scale; - a += subpixel_scale; - nlen -= subpixel_scale; - start -= subpixel_scale; - ++span; - --len; - } - - // Middle part, no checking for overflow. - // Actual spans can be longer than the calculated length - // because of anti-aliasing, thus, the interpolators can - // overflow. But while "nlen" is positive we are safe. - //------------------------- - while(len && nlen > 0) - { - span->v = (value_type)v.y(); - span->a = (value_type)a.y(); - v += subpixel_scale; - a += subpixel_scale; - nlen -= subpixel_scale; - ++span; - --len; - } - - // Ending part; checking for overflow. - // Typically it's 1-2 pixels, but may be more in some cases. - //------------------------- - while(len) - { - vv = v.y(); - va = a.y(); - if(vv < 0) vv = 0; if(vv > lim) vv = lim; - if(va < 0) va = 0; if(va > lim) va = lim; - span->v = (value_type)vv; - span->a = (value_type)va; - v += subpixel_scale; - a += subpixel_scale; - ++span; - --len; - } - } - - - private: - bool m_swap; - int m_y2; - gray_calc m_c1; - gray_calc m_c2; - gray_calc m_c3; - }; - - -} - -#endif diff --git a/uppdev/aggdraw/agg_span_gouraud_rgba.h b/uppdev/aggdraw/agg_span_gouraud_rgba.h deleted file mode 100644 index a379ddd95..000000000 --- a/uppdev/aggdraw/agg_span_gouraud_rgba.h +++ /dev/null @@ -1,286 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// Adaptation for high precision colors has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- - -#ifndef AGG_SPAN_GOURAUD_RGBA_INCLUDED -#define AGG_SPAN_GOURAUD_RGBA_INCLUDED - -#include "agg_basics.h" -#include "agg_color_rgba.h" -#include "agg_dda_line.h" -#include "agg_span_gouraud.h" - -namespace agg -{ - - //=======================================================span_gouraud_rgba - template class span_gouraud_rgba : public span_gouraud - { - public: - typedef ColorT color_type; - typedef typename ColorT::value_type value_type; - typedef span_gouraud base_type; - typedef typename base_type::coord_type coord_type; - enum subpixel_scale_e - { - subpixel_shift = 4, - subpixel_scale = 1 << subpixel_shift - }; - - private: - //-------------------------------------------------------------------- - struct rgba_calc - { - void init(const coord_type& c1, const coord_type& c2) - { - m_x1 = c1.x - 0.5; - m_y1 = c1.y - 0.5; - m_dx = c2.x - c1.x; - double dy = c2.y - c1.y; - m_1dy = (dy < 1e-5) ? 1e5 : 1.0 / dy; - m_r1 = c1.color.r; - m_g1 = c1.color.g; - m_b1 = c1.color.b; - m_a1 = c1.color.a; - m_dr = c2.color.r - m_r1; - m_dg = c2.color.g - m_g1; - m_db = c2.color.b - m_b1; - m_da = c2.color.a - m_a1; - } - - void calc(double y) - { - double k = (y - m_y1) * m_1dy; - if(k < 0.0) k = 0.0; - if(k > 1.0) k = 1.0; - m_r = m_r1 + iround(m_dr * k); - m_g = m_g1 + iround(m_dg * k); - m_b = m_b1 + iround(m_db * k); - m_a = m_a1 + iround(m_da * k); - m_x = iround((m_x1 + m_dx * k) * subpixel_scale); - } - - double m_x1; - double m_y1; - double m_dx; - double m_1dy; - int m_r1; - int m_g1; - int m_b1; - int m_a1; - int m_dr; - int m_dg; - int m_db; - int m_da; - int m_r; - int m_g; - int m_b; - int m_a; - int m_x; - }; - - public: - - //-------------------------------------------------------------------- - span_gouraud_rgba() {} - span_gouraud_rgba(const color_type& c1, - const color_type& c2, - const color_type& c3, - double x1, double y1, - double x2, double y2, - double x3, double y3, - double d = 0) : - base_type(c1, c2, c3, x1, y1, x2, y2, x3, y3, d) - {} - - //-------------------------------------------------------------------- - void prepare() - { - coord_type coord[3]; - base_type::arrange_vertices(coord); - - m_y2 = int(coord[1].y); - - m_swap = cross_product(coord[0].x, coord[0].y, - coord[2].x, coord[2].y, - coord[1].x, coord[1].y) < 0.0; - - m_rgba1.init(coord[0], coord[2]); - m_rgba2.init(coord[0], coord[1]); - m_rgba3.init(coord[1], coord[2]); - } - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - m_rgba1.calc(y);//(m_rgba1.m_1dy > 2) ? m_rgba1.m_y1 : y); - const rgba_calc* pc1 = &m_rgba1; - const rgba_calc* pc2 = &m_rgba2; - - if(y <= m_y2) - { - // Bottom part of the triangle (first subtriangle) - //------------------------- - m_rgba2.calc(y + m_rgba2.m_1dy); - } - else - { - // Upper part (second subtriangle) - m_rgba3.calc(y - m_rgba3.m_1dy); - //------------------------- - pc2 = &m_rgba3; - } - - if(m_swap) - { - // It means that the triangle is oriented clockwise, - // so that we need to swap the controlling structures - //------------------------- - const rgba_calc* t = pc2; - pc2 = pc1; - pc1 = t; - } - - // Get the horizontal length with subpixel accuracy - // and protect it from division by zero - //------------------------- - int nlen = abs(pc2->m_x - pc1->m_x); - if(nlen <= 0) nlen = 1; - - dda_line_interpolator<14> r(pc1->m_r, pc2->m_r, nlen); - dda_line_interpolator<14> g(pc1->m_g, pc2->m_g, nlen); - dda_line_interpolator<14> b(pc1->m_b, pc2->m_b, nlen); - dda_line_interpolator<14> a(pc1->m_a, pc2->m_a, nlen); - - // Calculate the starting point of the gradient with subpixel - // accuracy and correct (roll back) the interpolators. - // This operation will also clip the beginning of the span - // if necessary. - //------------------------- - int start = pc1->m_x - (x << subpixel_shift); - r -= start; - g -= start; - b -= start; - a -= start; - nlen += start; - - int vr, vg, vb, va; - enum lim_e { lim = color_type::base_mask }; - - // Beginning part of the span. Since we rolled back the - // interpolators, the color values may have overflow. - // So that, we render the beginning part with checking - // for overflow. It lasts until "start" is positive; - // typically it's 1-2 pixels, but may be more in some cases. - //------------------------- - while(len && start > 0) - { - vr = r.y(); - vg = g.y(); - vb = b.y(); - va = a.y(); - if(vr < 0) vr = 0; if(vr > lim) vr = lim; - if(vg < 0) vg = 0; if(vg > lim) vg = lim; - if(vb < 0) vb = 0; if(vb > lim) vb = lim; - if(va < 0) va = 0; if(va > lim) va = lim; - span->r = (value_type)vr; - span->g = (value_type)vg; - span->b = (value_type)vb; - span->a = (value_type)va; - r += subpixel_scale; - g += subpixel_scale; - b += subpixel_scale; - a += subpixel_scale; - nlen -= subpixel_scale; - start -= subpixel_scale; - ++span; - --len; - } - - // Middle part, no checking for overflow. - // Actual spans can be longer than the calculated length - // because of anti-aliasing, thus, the interpolators can - // overflow. But while "nlen" is positive we are safe. - //------------------------- - while(len && nlen > 0) - { - span->r = (value_type)r.y(); - span->g = (value_type)g.y(); - span->b = (value_type)b.y(); - span->a = (value_type)a.y(); - r += subpixel_scale; - g += subpixel_scale; - b += subpixel_scale; - a += subpixel_scale; - nlen -= subpixel_scale; - ++span; - --len; - } - - // Ending part; checking for overflow. - // Typically it's 1-2 pixels, but may be more in some cases. - //------------------------- - while(len) - { - vr = r.y(); - vg = g.y(); - vb = b.y(); - va = a.y(); - if(vr < 0) vr = 0; if(vr > lim) vr = lim; - if(vg < 0) vg = 0; if(vg > lim) vg = lim; - if(vb < 0) vb = 0; if(vb > lim) vb = lim; - if(va < 0) va = 0; if(va > lim) va = lim; - span->r = (value_type)vr; - span->g = (value_type)vg; - span->b = (value_type)vb; - span->a = (value_type)va; - r += subpixel_scale; - g += subpixel_scale; - b += subpixel_scale; - a += subpixel_scale; - ++span; - --len; - } - } - - private: - bool m_swap; - int m_y2; - rgba_calc m_rgba1; - rgba_calc m_rgba2; - rgba_calc m_rgba3; - }; - - - -} - -#endif diff --git a/uppdev/aggdraw/agg_span_gradient.h b/uppdev/aggdraw/agg_span_gradient.h deleted file mode 100644 index 382d1d979..000000000 --- a/uppdev/aggdraw/agg_span_gradient.h +++ /dev/null @@ -1,373 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_SPAN_GRADIENT_INCLUDED -#define AGG_SPAN_GRADIENT_INCLUDED - -#include -#include -#include -#include "agg_basics.h" -#include "agg_math.h" -#include "agg_array.h" - - -namespace agg -{ - - enum gradient_subpixel_scale_e - { - gradient_subpixel_shift = 4, //-----gradient_subpixel_shift - gradient_subpixel_scale = 1 << gradient_subpixel_shift, //-----gradient_subpixel_scale - gradient_subpixel_mask = gradient_subpixel_scale - 1 //-----gradient_subpixel_mask - }; - - - - //==========================================================span_gradient - template - class span_gradient - { - public: - typedef Interpolator interpolator_type; - typedef ColorT color_type; - - enum downscale_shift_e - { - downscale_shift = interpolator_type::subpixel_shift - - gradient_subpixel_shift - }; - - //-------------------------------------------------------------------- - span_gradient() {} - - //-------------------------------------------------------------------- - span_gradient(interpolator_type& inter, - const GradientF& gradient_function, - const ColorF& color_function, - double d1, double d2) : - m_interpolator(&inter), - m_gradient_function(&gradient_function), - m_color_function(&color_function), - m_d1(iround(d1 * gradient_subpixel_scale)), - m_d2(iround(d2 * gradient_subpixel_scale)) - {} - - //-------------------------------------------------------------------- - interpolator_type& interpolator() { return *m_interpolator; } - const GradientF& gradient_function() const { return *m_gradient_function; } - const ColorF& color_function() const { return *m_color_function; } - double d1() const { return double(m_d1) / gradient_subpixel_scale; } - double d2() const { return double(m_d2) / gradient_subpixel_scale; } - - //-------------------------------------------------------------------- - void interpolator(interpolator_type& i) { m_interpolator = &i; } - void gradient_function(const GradientF& gf) { m_gradient_function = &gf; } - void color_function(const ColorF& cf) { m_color_function = &cf; } - void d1(double v) { m_d1 = iround(v * gradient_subpixel_scale); } - void d2(double v) { m_d2 = iround(v * gradient_subpixel_scale); } - - //-------------------------------------------------------------------- - void prepare() {} - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - int dd = m_d2 - m_d1; - if(dd < 1) dd = 1; - m_interpolator->begin(x+0.5, y+0.5, len); - do - { - m_interpolator->coordinates(&x, &y); - int d = m_gradient_function->calculate(x >> downscale_shift, - y >> downscale_shift, m_d2); - d = ((d - m_d1) * (int)m_color_function->size()) / dd; - if(d < 0) d = 0; - if(d >= (int)m_color_function->size()) d = m_color_function->size() - 1; - *span++ = (*m_color_function)[d]; - ++(*m_interpolator); - } - while(--len); - } - - private: - interpolator_type* m_interpolator; - const GradientF* m_gradient_function; - const ColorF* m_color_function; - int m_d1; - int m_d2; - }; - - - - - //=====================================================gradient_linear_color - template - struct gradient_linear_color - { - typedef ColorT color_type; - - gradient_linear_color() {} - gradient_linear_color(const color_type& c1, const color_type& c2, - unsigned size = 256) : - m_c1(c1), m_c2(c2), m_size(size) {} - - unsigned size() const { return m_size; } - color_type operator [] (unsigned v) const - { - return m_c1.gradient(m_c2, double(v) / double(m_size - 1)); - } - - void colors(const color_type& c1, const color_type& c2, unsigned size = 256) - { - m_c1 = c1; - m_c2 = c2; - m_size = size; - } - - color_type m_c1; - color_type m_c2; - unsigned m_size; - }; - - - - - - - //==========================================================gradient_circle - class gradient_circle - { - // Actually the same as radial. Just for compatibility - public: - static AGG_INLINE int calculate(int x, int y, int) - { - return int(fast_sqrt(x*x + y*y)); - } - }; - - - //==========================================================gradient_radial - class gradient_radial - { - public: - static AGG_INLINE int calculate(int x, int y, int) - { - return int(fast_sqrt(x*x + y*y)); - } - }; - - //========================================================gradient_radial_d - class gradient_radial_d - { - public: - static AGG_INLINE int calculate(int x, int y, int) - { - return uround(sqrt(double(x)*double(x) + double(y)*double(y))); - } - }; - - //====================================================gradient_radial_focus - class gradient_radial_focus - { - public: - //--------------------------------------------------------------------- - gradient_radial_focus() : - m_r(100 * gradient_subpixel_scale), - m_fx(0), - m_fy(0) - { - update_values(); - } - - //--------------------------------------------------------------------- - gradient_radial_focus(double r, double fx, double fy) : - m_r (iround(r * gradient_subpixel_scale)), - m_fx(iround(fx * gradient_subpixel_scale)), - m_fy(iround(fy * gradient_subpixel_scale)) - { - update_values(); - } - - //--------------------------------------------------------------------- - void init(double r, double fx, double fy) - { - m_r = iround(r * gradient_subpixel_scale); - m_fx = iround(fx * gradient_subpixel_scale); - m_fy = iround(fy * gradient_subpixel_scale); - update_values(); - } - - //--------------------------------------------------------------------- - double radius() const { return double(m_r) / gradient_subpixel_scale; } - double focus_x() const { return double(m_fx) / gradient_subpixel_scale; } - double focus_y() const { return double(m_fy) / gradient_subpixel_scale; } - - //--------------------------------------------------------------------- - int calculate(int x, int y, int) const - { - double dx = x - m_fx; - double dy = y - m_fy; - double d2 = dx * m_fy - dy * m_fx; - double d3 = m_r2 * (dx * dx + dy * dy) - d2 * d2; - return iround((dx * m_fx + dy * m_fy + sqrt(fabs(d3))) * m_mul); - } - - private: - //--------------------------------------------------------------------- - void update_values() - { - // Calculate the invariant values. In case the focal center - // lies exactly on the gradient circle the divisor degenerates - // into zero. In this case we just move the focal center by - // one subpixel unit possibly in the direction to the origin (0,0) - // and calculate the values again. - //------------------------- - m_r2 = double(m_r) * double(m_r); - m_fx2 = double(m_fx) * double(m_fx); - m_fy2 = double(m_fy) * double(m_fy); - double d = (m_r2 - (m_fx2 + m_fy2)); - if(d == 0) - { - if(m_fx) { if(m_fx < 0) ++m_fx; else --m_fx; } - if(m_fy) { if(m_fy < 0) ++m_fy; else --m_fy; } - m_fx2 = double(m_fx) * double(m_fx); - m_fy2 = double(m_fy) * double(m_fy); - d = (m_r2 - (m_fx2 + m_fy2)); - } - m_mul = m_r / d; - } - - int m_r; - int m_fx; - int m_fy; - double m_r2; - double m_fx2; - double m_fy2; - double m_mul; - }; - - - //==============================================================gradient_x - class gradient_x - { - public: - static int calculate(int x, int, int) { return x; } - }; - - - //==============================================================gradient_y - class gradient_y - { - public: - static int calculate(int, int y, int) { return y; } - }; - - //========================================================gradient_diamond - class gradient_diamond - { - public: - static AGG_INLINE int calculate(int x, int y, int) - { - int ax = abs(x); - int ay = abs(y); - return ax > ay ? ax : ay; - } - }; - - //=============================================================gradient_xy - class gradient_xy - { - public: - static AGG_INLINE int calculate(int x, int y, int d) - { - return abs(x) * abs(y) / d; - } - }; - - //========================================================gradient_sqrt_xy - class gradient_sqrt_xy - { - public: - static AGG_INLINE int calculate(int x, int y, int) - { - return fast_sqrt(abs(x) * abs(y)); - } - }; - - //==========================================================gradient_conic - class gradient_conic - { - public: - static AGG_INLINE int calculate(int x, int y, int d) - { - return uround(fabs(atan2(double(y), double(x))) * double(d) / pi); - } - }; - - //=================================================gradient_repeat_adaptor - template class gradient_repeat_adaptor - { - public: - gradient_repeat_adaptor(const GradientF& gradient) : - m_gradient(&gradient) {} - - AGG_INLINE int calculate(int x, int y, int d) const - { - int ret = m_gradient->calculate(x, y, d) % d; - if(ret < 0) ret += d; - return ret; - } - - private: - const GradientF* m_gradient; - }; - - //================================================gradient_reflect_adaptor - template class gradient_reflect_adaptor - { - public: - gradient_reflect_adaptor(const GradientF& gradient) : - m_gradient(&gradient) {} - - AGG_INLINE int calculate(int x, int y, int d) const - { - int d2 = d << 1; - int ret = m_gradient->calculate(x, y, d) % d2; - if(ret < 0) ret += d2; - if(ret >= d) ret = d2 - ret; - return ret; - } - - private: - const GradientF* m_gradient; - }; - - -} - -#endif diff --git a/uppdev/aggdraw/agg_span_gradient_alpha.h b/uppdev/aggdraw/agg_span_gradient_alpha.h deleted file mode 100644 index 862957686..000000000 --- a/uppdev/aggdraw/agg_span_gradient_alpha.h +++ /dev/null @@ -1,135 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_SPAN_GRADIENT_ALPHA_INCLUDED -#define AGG_SPAN_GRADIENT_ALPHA_INCLUDED - -#include "agg_span_gradient.h" - -namespace agg -{ - //======================================================span_gradient_alpha - template - class span_gradient_alpha - { - public: - typedef Interpolator interpolator_type; - typedef ColorT color_type; - typedef typename color_type::value_type alpha_type; - - enum downscale_shift_e - { - downscale_shift = interpolator_type::subpixel_shift - gradient_subpixel_shift - }; - - - //-------------------------------------------------------------------- - span_gradient_alpha() {} - - //-------------------------------------------------------------------- - span_gradient_alpha(interpolator_type& inter, - const GradientF& gradient_function, - const AlphaF& alpha_function, - double d1, double d2) : - m_interpolator(&inter), - m_gradient_function(&gradient_function), - m_alpha_function(&alpha_function), - m_d1(iround(d1 * gradient_subpixel_scale)), - m_d2(iround(d2 * gradient_subpixel_scale)) - {} - - //-------------------------------------------------------------------- - interpolator_type& interpolator() { return *m_interpolator; } - const GradientF& gradient_function() const { return *m_gradient_function; } - const AlphaF& alpha_function() const { return *m_alpha_function; } - double d1() const { return double(m_d1) / gradient_subpixel_scale; } - double d2() const { return double(m_d2) / gradient_subpixel_scale; } - - //-------------------------------------------------------------------- - void interpolator(interpolator_type& i) { m_interpolator = &i; } - void gradient_function(const GradientF& gf) { m_gradient_function = &gf; } - void alpha_function(const AlphaF& af) { m_alpha_function = ⁡ } - void d1(double v) { m_d1 = iround(v * gradient_subpixel_scale); } - void d2(double v) { m_d2 = iround(v * gradient_subpixel_scale); } - - //-------------------------------------------------------------------- - void prepare() {} - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - int dd = m_d2 - m_d1; - if(dd < 1) dd = 1; - m_interpolator->begin(x+0.5, y+0.5, len); - do - { - m_interpolator->coordinates(&x, &y); - int d = m_gradient_function->calculate(x >> downscale_shift, - y >> downscale_shift, m_d2); - d = ((d - m_d1) * (int)m_alpha_function->size()) / dd; - if(d < 0) d = 0; - if(d >= (int)m_alpha_function->size()) d = m_alpha_function->size() - 1; - span->a = (*m_alpha_function)[d]; - ++span; - ++(*m_interpolator); - } - while(--len); - } - - private: - interpolator_type* m_interpolator; - const GradientF* m_gradient_function; - const AlphaF* m_alpha_function; - int m_d1; - int m_d2; - }; - - - //=======================================================gradient_alpha_x - template struct gradient_alpha_x - { - typedef typename ColorT::value_type alpha_type; - alpha_type operator [] (alpha_type x) const { return x; } - }; - - //====================================================gradient_alpha_x_u8 - struct gradient_alpha_x_u8 - { - typedef int8u alpha_type; - alpha_type operator [] (alpha_type x) const { return x; } - }; - - //==========================================gradient_alpha_one_munus_x_u8 - struct gradient_alpha_one_munus_x_u8 - { - typedef int8u alpha_type; - alpha_type operator [] (alpha_type x) const { return 255-x; } - }; - -} - -#endif diff --git a/uppdev/aggdraw/agg_span_image_filter.h b/uppdev/aggdraw/agg_span_image_filter.h deleted file mode 100644 index d0b1b9048..000000000 --- a/uppdev/aggdraw/agg_span_image_filter.h +++ /dev/null @@ -1,252 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_SPAN_IMAGE_FILTER_INCLUDED -#define AGG_SPAN_IMAGE_FILTER_INCLUDED - -#include "agg_basics.h" -#include "agg_image_filters.h" -#include "agg_span_interpolator_linear.h" - -namespace agg -{ - - //-------------------------------------------------------span_image_filter - template class span_image_filter - { - public: - typedef Source source_type; - typedef Interpolator interpolator_type; - - //-------------------------------------------------------------------- - span_image_filter() {} - span_image_filter(source_type& src, - interpolator_type& interpolator, - const image_filter_lut* filter) : - m_src(&src), - m_interpolator(&interpolator), - m_filter(filter), - m_dx_dbl(0.5), - m_dy_dbl(0.5), - m_dx_int(image_subpixel_scale / 2), - m_dy_int(image_subpixel_scale / 2) - {} - void attach(source_type& v) { m_src = &v; } - - //-------------------------------------------------------------------- - source_type& source() { return *m_src; } - const source_type& source() const { return *m_src; } - const image_filter_lut& filter() const { return *m_filter; } - int filter_dx_int() const { return m_dx_int; } - int filter_dy_int() const { return m_dy_int; } - double filter_dx_dbl() const { return m_dx_dbl; } - double filter_dy_dbl() const { return m_dy_dbl; } - - //-------------------------------------------------------------------- - void interpolator(interpolator_type& v) { m_interpolator = &v; } - void filter(const image_filter_lut& v) { m_filter = &v; } - void filter_offset(double dx, double dy) - { - m_dx_dbl = dx; - m_dy_dbl = dy; - m_dx_int = iround(dx * image_subpixel_scale); - m_dy_int = iround(dy * image_subpixel_scale); - } - void filter_offset(double d) { filter_offset(d, d); } - - //-------------------------------------------------------------------- - interpolator_type& interpolator() { return *m_interpolator; } - - //-------------------------------------------------------------------- - void prepare() {} - - //-------------------------------------------------------------------- - private: - source_type* m_src; - interpolator_type* m_interpolator; - const image_filter_lut* m_filter; - double m_dx_dbl; - double m_dy_dbl; - unsigned m_dx_int; - unsigned m_dy_int; - }; - - - - - //==============================================span_image_resample_affine - template - class span_image_resample_affine : - public span_image_filter > - { - public: - typedef Source source_type; - typedef span_interpolator_linear interpolator_type; - typedef span_image_filter base_type; - - //-------------------------------------------------------------------- - span_image_resample_affine() : - m_scale_limit(200.0), - m_blur_x(1.0), - m_blur_y(1.0) - {} - - //-------------------------------------------------------------------- - span_image_resample_affine(source_type& src, - interpolator_type& inter, - const image_filter_lut& filter) : - base_type(src, inter, &filter), - m_scale_limit(200.0), - m_blur_x(1.0), - m_blur_y(1.0) - {} - - - //-------------------------------------------------------------------- - int scale_limit() const { return uround(m_scale_limit); } - void scale_limit(int v) { m_scale_limit = v; } - - //-------------------------------------------------------------------- - double blur_x() const { return m_blur_x; } - double blur_y() const { return m_blur_y; } - void blur_x(double v) { m_blur_x = v; } - void blur_y(double v) { m_blur_y = v; } - void blur(double v) { m_blur_x = m_blur_y = v; } - - //-------------------------------------------------------------------- - void prepare() - { - double scale_x; - double scale_y; - - base_type::interpolator().transformer().scaling_abs(&scale_x, &scale_y); - - if(scale_x * scale_y > m_scale_limit) - { - scale_x = scale_x * m_scale_limit / (scale_x * scale_y); - scale_y = scale_y * m_scale_limit / (scale_x * scale_y); - } - - if(scale_x < 1) scale_x = 1; - if(scale_y < 1) scale_y = 1; - - if(scale_x > m_scale_limit) scale_x = m_scale_limit; - if(scale_y > m_scale_limit) scale_y = m_scale_limit; - - scale_x *= m_blur_x; - scale_y *= m_blur_y; - - if(scale_x < 1) scale_x = 1; - if(scale_y < 1) scale_y = 1; - - m_rx = uround( scale_x * double(image_subpixel_scale)); - m_rx_inv = uround(1.0/scale_x * double(image_subpixel_scale)); - - m_ry = uround( scale_y * double(image_subpixel_scale)); - m_ry_inv = uround(1.0/scale_y * double(image_subpixel_scale)); - } - - protected: - int m_rx; - int m_ry; - int m_rx_inv; - int m_ry_inv; - - private: - double m_scale_limit; - double m_blur_x; - double m_blur_y; - }; - - - - //=====================================================span_image_resample - template - class span_image_resample : - public span_image_filter - { - public: - typedef Source source_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - - //-------------------------------------------------------------------- - span_image_resample() : - m_scale_limit(20), - m_blur_x(image_subpixel_scale), - m_blur_y(image_subpixel_scale) - {} - - //-------------------------------------------------------------------- - span_image_resample(source_type& src, - interpolator_type& inter, - const image_filter_lut& filter) : - base_type(src, inter, &filter), - m_scale_limit(20), - m_blur_x(image_subpixel_scale), - m_blur_y(image_subpixel_scale) - {} - - //-------------------------------------------------------------------- - int scale_limit() const { return m_scale_limit; } - void scale_limit(int v) { m_scale_limit = v; } - - //-------------------------------------------------------------------- - double blur_x() const { return double(m_blur_x) / double(image_subpixel_scale); } - double blur_y() const { return double(m_blur_y) / double(image_subpixel_scale); } - void blur_x(double v) { m_blur_x = uround(v * double(image_subpixel_scale)); } - void blur_y(double v) { m_blur_y = uround(v * double(image_subpixel_scale)); } - void blur(double v) { m_blur_x = - m_blur_y = uround(v * double(image_subpixel_scale)); } - - protected: - AGG_INLINE void adjust_scale(int* rx, int* ry) - { - if(*rx < image_subpixel_scale) *rx = image_subpixel_scale; - if(*ry < image_subpixel_scale) *ry = image_subpixel_scale; - if(*rx > image_subpixel_scale * m_scale_limit) - { - *rx = image_subpixel_scale * m_scale_limit; - } - if(*ry > image_subpixel_scale * m_scale_limit) - { - *ry = image_subpixel_scale * m_scale_limit; - } - *rx = (*rx * m_blur_x) >> image_subpixel_shift; - *ry = (*ry * m_blur_y) >> image_subpixel_shift; - if(*rx < image_subpixel_scale) *rx = image_subpixel_scale; - if(*ry < image_subpixel_scale) *ry = image_subpixel_scale; - } - - int m_scale_limit; - int m_blur_x; - int m_blur_y; - }; - - - - -} - -#endif diff --git a/uppdev/aggdraw/agg_span_image_filter_gray.h b/uppdev/aggdraw/agg_span_image_filter_gray.h deleted file mode 100644 index e5293e1e3..000000000 --- a/uppdev/aggdraw/agg_span_image_filter_gray.h +++ /dev/null @@ -1,757 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// Adaptation for high precision colors has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- -#ifndef AGG_SPAN_IMAGE_FILTER_GRAY_INCLUDED -#define AGG_SPAN_IMAGE_FILTER_GRAY_INCLUDED - -#include "agg_basics.h" -#include "agg_color_gray.h" -#include "agg_span_image_filter.h" - - -namespace agg -{ - - //==============================================span_image_filter_gray_nn - template - class span_image_filter_gray_nn : - public span_image_filter - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - span_image_filter_gray_nn() {} - span_image_filter_gray_nn(source_type& src, - interpolator_type& inter) : - base_type(src, inter, 0) - {} - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - do - { - base_type::interpolator().coordinates(&x, &y); - span->v = *(const value_type*) - base_type::source().span(x >> image_subpixel_shift, - y >> image_subpixel_shift, - 1); - span->a = base_mask; - ++span; - ++base_type::interpolator(); - } while(--len); - } - }; - - - - //=========================================span_image_filter_gray_bilinear - template - class span_image_filter_gray_bilinear : - public span_image_filter - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - span_image_filter_gray_bilinear() {} - span_image_filter_gray_bilinear(source_type& src, - interpolator_type& inter) : - base_type(src, inter, 0) - {} - - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - calc_type fg; - const value_type *fg_ptr; - do - { - int x_hr; - int y_hr; - - base_type::interpolator().coordinates(&x_hr, &y_hr); - - x_hr -= base_type::filter_dx_int(); - y_hr -= base_type::filter_dy_int(); - - int x_lr = x_hr >> image_subpixel_shift; - int y_lr = y_hr >> image_subpixel_shift; - - fg = image_subpixel_scale * image_subpixel_scale / 2; - - x_hr &= image_subpixel_mask; - y_hr &= image_subpixel_mask; - - fg_ptr = (const value_type*)base_type::source().span(x_lr, y_lr, 2); - fg += *fg_ptr * (image_subpixel_scale - x_hr) * (image_subpixel_scale - y_hr); - - fg_ptr = (const value_type*)base_type::source().next_x(); - fg += *fg_ptr * x_hr * (image_subpixel_scale - y_hr); - - fg_ptr = (const value_type*)base_type::source().next_y(); - fg += *fg_ptr * (image_subpixel_scale - x_hr) * y_hr; - - fg_ptr = (const value_type*)base_type::source().next_x(); - fg += *fg_ptr * x_hr * y_hr; - - span->v = value_type(fg >> (image_subpixel_shift * 2)); - span->a = base_mask; - ++span; - ++base_type::interpolator(); - - } while(--len); - } - }; - - - //====================================span_image_filter_gray_bilinear_clip - template - class span_image_filter_gray_bilinear_clip : - public span_image_filter - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - span_image_filter_gray_bilinear_clip() {} - span_image_filter_gray_bilinear_clip(source_type& src, - const color_type& back_color, - interpolator_type& inter) : - base_type(src, inter, 0), - m_back_color(back_color) - {} - const color_type& background_color() const { return m_back_color; } - void background_color(const color_type& v) { m_back_color = v; } - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - calc_type fg; - calc_type src_alpha; - value_type back_v = m_back_color.v; - value_type back_a = m_back_color.a; - - const value_type *fg_ptr; - - int maxx = base_type::source().width() - 1; - int maxy = base_type::source().height() - 1; - - do - { - int x_hr; - int y_hr; - - base_type::interpolator().coordinates(&x_hr, &y_hr); - - x_hr -= base_type::filter_dx_int(); - y_hr -= base_type::filter_dy_int(); - - int x_lr = x_hr >> image_subpixel_shift; - int y_lr = y_hr >> image_subpixel_shift; - - if(x_lr >= 0 && y_lr >= 0 && - x_lr < maxx && y_lr < maxy) - { - fg = image_subpixel_scale * image_subpixel_scale / 2; - - x_hr &= image_subpixel_mask; - y_hr &= image_subpixel_mask; - fg_ptr = (const value_type*)base_type::source().row_ptr(y_lr) + x_lr; - - fg += *fg_ptr++ * (image_subpixel_scale - x_hr) * (image_subpixel_scale - y_hr); - fg += *fg_ptr++ * (image_subpixel_scale - y_hr) * x_hr; - - ++y_lr; - fg_ptr = (const value_type*)base_type::source().row_ptr(y_lr) + x_lr; - - fg += *fg_ptr++ * (image_subpixel_scale - x_hr) * y_hr; - fg += *fg_ptr++ * x_hr * y_hr; - - fg >>= image_subpixel_shift * 2; - src_alpha = base_mask; - } - else - { - unsigned weight; - if(x_lr < -1 || y_lr < -1 || - x_lr > maxx || y_lr > maxy) - { - fg = back_v; - src_alpha = back_a; - } - else - { - fg = - src_alpha = image_subpixel_scale * image_subpixel_scale / 2; - - x_hr &= image_subpixel_mask; - y_hr &= image_subpixel_mask; - - weight = (image_subpixel_scale - x_hr) * - (image_subpixel_scale - y_hr); - if(x_lr >= 0 && y_lr >= 0 && - x_lr <= maxx && y_lr <= maxy) - { - fg += weight * - *((const value_type*)base_type::source().row_ptr(y_lr) + x_lr); - src_alpha += weight * base_mask; - } - else - { - fg += back_v * weight; - src_alpha += back_a * weight; - } - - x_lr++; - - weight = x_hr * (image_subpixel_scale - y_hr); - if(x_lr >= 0 && y_lr >= 0 && - x_lr <= maxx && y_lr <= maxy) - { - fg += weight * - *((const value_type*)base_type::source().row_ptr(y_lr) + x_lr); - src_alpha += weight * base_mask; - } - else - { - fg += back_v * weight; - src_alpha += back_a * weight; - } - - x_lr--; - y_lr++; - - weight = (image_subpixel_scale - x_hr) * y_hr; - if(x_lr >= 0 && y_lr >= 0 && - x_lr <= maxx && y_lr <= maxy) - { - fg += weight * - *((const value_type*)base_type::source().row_ptr(y_lr) + x_lr); - src_alpha += weight * base_mask; - } - else - { - fg += back_v * weight; - src_alpha += back_a * weight; - } - - x_lr++; - - weight = x_hr * y_hr; - if(x_lr >= 0 && y_lr >= 0 && - x_lr <= maxx && y_lr <= maxy) - { - fg += weight * - *((const value_type*)base_type::source().row_ptr(y_lr) + x_lr); - src_alpha += weight * base_mask; - } - else - { - fg += back_v * weight; - src_alpha += back_a * weight; - } - - fg >>= image_subpixel_shift * 2; - src_alpha >>= image_subpixel_shift * 2; - } - } - - span->v = (value_type)fg; - span->a = (value_type)src_alpha; - ++span; - ++base_type::interpolator(); - - } while(--len); - } - private: - color_type m_back_color; - }; - - - - //==============================================span_image_filter_gray_2x2 - template - class span_image_filter_gray_2x2 : - public span_image_filter - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - span_image_filter_gray_2x2() {} - span_image_filter_gray_2x2(source_type& src, - interpolator_type& inter, - const image_filter_lut& filter) : - base_type(src, inter, &filter) - {} - - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - - calc_type fg; - - const value_type *fg_ptr; - const int16* weight_array = base_type::filter().weight_array() + - ((base_type::filter().diameter()/2 - 1) << - image_subpixel_shift); - do - { - int x_hr; - int y_hr; - - base_type::interpolator().coordinates(&x_hr, &y_hr); - - x_hr -= base_type::filter_dx_int(); - y_hr -= base_type::filter_dy_int(); - - int x_lr = x_hr >> image_subpixel_shift; - int y_lr = y_hr >> image_subpixel_shift; - - unsigned weight; - fg = image_filter_scale / 2; - - x_hr &= image_subpixel_mask; - y_hr &= image_subpixel_mask; - - fg_ptr = (const value_type*)base_type::source().span(x_lr, y_lr, 2); - weight = (weight_array[x_hr + image_subpixel_scale] * - weight_array[y_hr + image_subpixel_scale] + - image_filter_scale / 2) >> - image_filter_shift; - fg += weight * *fg_ptr; - - fg_ptr = (const value_type*)base_type::source().next_x(); - weight = (weight_array[x_hr] * - weight_array[y_hr + image_subpixel_scale] + - image_filter_scale / 2) >> - image_filter_shift; - fg += weight * *fg_ptr; - - fg_ptr = (const value_type*)base_type::source().next_y(); - weight = (weight_array[x_hr + image_subpixel_scale] * - weight_array[y_hr] + - image_filter_scale / 2) >> - image_filter_shift; - fg += weight * *fg_ptr; - - fg_ptr = (const value_type*)base_type::source().next_x(); - weight = (weight_array[x_hr] * - weight_array[y_hr] + - image_filter_scale / 2) >> - image_filter_shift; - fg += weight * *fg_ptr; - - fg >>= image_filter_shift; - if(fg > base_mask) fg = base_mask; - - span->v = (value_type)fg; - span->a = base_mask; - ++span; - ++base_type::interpolator(); - } while(--len); - } - }; - - - - //==================================================span_image_filter_gray - template - class span_image_filter_gray : - public span_image_filter - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - span_image_filter_gray() {} - span_image_filter_gray(source_type& src, - interpolator_type& inter, - const image_filter_lut& filter) : - base_type(src, inter, &filter) - {} - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - - int fg; - const value_type *fg_ptr; - - unsigned diameter = base_type::filter().diameter(); - int start = base_type::filter().start(); - const int16* weight_array = base_type::filter().weight_array(); - - int x_count; - int weight_y; - - do - { - base_type::interpolator().coordinates(&x, &y); - - x -= base_type::filter_dx_int(); - y -= base_type::filter_dy_int(); - - int x_hr = x; - int y_hr = y; - - int x_lr = x_hr >> image_subpixel_shift; - int y_lr = y_hr >> image_subpixel_shift; - - fg = image_filter_scale / 2; - - int x_fract = x_hr & image_subpixel_mask; - unsigned y_count = diameter; - - y_hr = image_subpixel_mask - (y_hr & image_subpixel_mask); - fg_ptr = (const value_type*)base_type::source().span(x_lr + start, - y_lr + start, - diameter); - for(;;) - { - x_count = diameter; - weight_y = weight_array[y_hr]; - x_hr = image_subpixel_mask - x_fract; - for(;;) - { - fg += *fg_ptr * - ((weight_y * weight_array[x_hr] + - image_filter_scale / 2) >> - image_filter_shift); - if(--x_count == 0) break; - x_hr += image_subpixel_scale; - fg_ptr = (const value_type*)base_type::source().next_x(); - } - - if(--y_count == 0) break; - y_hr += image_subpixel_scale; - fg_ptr = (const value_type*)base_type::source().next_y(); - } - - fg >>= image_filter_shift; - if(fg < 0) fg = 0; - if(fg > base_mask) fg = base_mask; - span->v = (value_type)fg; - span->a = base_mask; - - ++span; - ++base_type::interpolator(); - - } while(--len); - } - }; - - - - //=========================================span_image_resample_gray_affine - template - class span_image_resample_gray_affine : - public span_image_resample_affine - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef span_image_resample_affine base_type; - typedef typename base_type::interpolator_type interpolator_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::long_type long_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask, - downscale_shift = image_filter_shift - }; - - //-------------------------------------------------------------------- - span_image_resample_gray_affine() {} - span_image_resample_gray_affine(source_type& src, - interpolator_type& inter, - const image_filter_lut& filter) : - base_type(src, inter, filter) - {} - - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - - long_type fg; - - int diameter = base_type::filter().diameter(); - int filter_scale = diameter << image_subpixel_shift; - int radius_x = (diameter * base_type::m_rx) >> 1; - int radius_y = (diameter * base_type::m_ry) >> 1; - int len_x_lr = - (diameter * base_type::m_rx + image_subpixel_mask) >> - image_subpixel_shift; - - const int16* weight_array = base_type::filter().weight_array(); - - do - { - base_type::interpolator().coordinates(&x, &y); - - x += base_type::filter_dx_int() - radius_x; - y += base_type::filter_dy_int() - radius_y; - - fg = image_filter_scale / 2; - - int y_lr = y >> image_subpixel_shift; - int y_hr = ((image_subpixel_mask - (y & image_subpixel_mask)) * - base_type::m_ry_inv) >> - image_subpixel_shift; - int total_weight = 0; - int x_lr = x >> image_subpixel_shift; - int x_hr = ((image_subpixel_mask - (x & image_subpixel_mask)) * - base_type::m_rx_inv) >> - image_subpixel_shift; - - int x_hr2 = x_hr; - const value_type* fg_ptr = - (const value_type*)base_type::source().span(x_lr, y_lr, len_x_lr); - for(;;) - { - int weight_y = weight_array[y_hr]; - x_hr = x_hr2; - for(;;) - { - int weight = (weight_y * weight_array[x_hr] + - image_filter_scale / 2) >> - downscale_shift; - - fg += *fg_ptr * weight; - total_weight += weight; - x_hr += base_type::m_rx_inv; - if(x_hr >= filter_scale) break; - fg_ptr = (const value_type*)base_type::source().next_x(); - } - y_hr += base_type::m_ry_inv; - if(y_hr >= filter_scale) break; - fg_ptr = (const value_type*)base_type::source().next_y(); - } - - fg /= total_weight; - if(fg < 0) fg = 0; - if(fg > base_mask) fg = base_mask; - - span->v = (value_type)fg; - span->a = base_mask; - - ++span; - ++base_type::interpolator(); - } while(--len); - } - }; - - - - //================================================span_image_resample_gray - template - class span_image_resample_gray : - public span_image_resample - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef Interpolator interpolator_type; - typedef span_image_resample base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::long_type long_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask, - downscale_shift = image_filter_shift - }; - - //-------------------------------------------------------------------- - span_image_resample_gray() {} - span_image_resample_gray(source_type& src, - interpolator_type& inter, - const image_filter_lut& filter) : - base_type(src, inter, filter) - {} - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - long_type fg; - - int diameter = base_type::filter().diameter(); - int filter_scale = diameter << image_subpixel_shift; - - const int16* weight_array = base_type::filter().weight_array(); - do - { - int rx; - int ry; - int rx_inv = image_subpixel_scale; - int ry_inv = image_subpixel_scale; - base_type::interpolator().coordinates(&x, &y); - base_type::interpolator().local_scale(&rx, &ry); - base_type::adjust_scale(&rx, &ry); - - rx_inv = image_subpixel_scale * image_subpixel_scale / rx; - ry_inv = image_subpixel_scale * image_subpixel_scale / ry; - - int radius_x = (diameter * rx) >> 1; - int radius_y = (diameter * ry) >> 1; - int len_x_lr = - (diameter * rx + image_subpixel_mask) >> - image_subpixel_shift; - - x += base_type::filter_dx_int() - radius_x; - y += base_type::filter_dy_int() - radius_y; - - fg = image_filter_scale / 2; - - int y_lr = y >> image_subpixel_shift; - int y_hr = ((image_subpixel_mask - (y & image_subpixel_mask)) * - ry_inv) >> - image_subpixel_shift; - int total_weight = 0; - int x_lr = x >> image_subpixel_shift; - int x_hr = ((image_subpixel_mask - (x & image_subpixel_mask)) * - rx_inv) >> - image_subpixel_shift; - int x_hr2 = x_hr; - const value_type* fg_ptr = - (const value_type*)base_type::source().span(x_lr, y_lr, len_x_lr); - - for(;;) - { - int weight_y = weight_array[y_hr]; - x_hr = x_hr2; - for(;;) - { - int weight = (weight_y * weight_array[x_hr] + - image_filter_scale / 2) >> - downscale_shift; - fg += *fg_ptr * weight; - total_weight += weight; - x_hr += rx_inv; - if(x_hr >= filter_scale) break; - fg_ptr = (const value_type*)base_type::source().next_x(); - } - y_hr += ry_inv; - if(y_hr >= filter_scale) break; - fg_ptr = (const value_type*)base_type::source().next_y(); - } - - fg /= total_weight; - if(fg < 0) fg = 0; - if(fg > base_mask) fg = base_mask; - - span->v = (value_type)fg; - span->a = base_mask; - - ++span; - ++base_type::interpolator(); - } while(--len); - } - }; - - -} - - -#endif - - - diff --git a/uppdev/aggdraw/agg_span_image_filter_rgb.h b/uppdev/aggdraw/agg_span_image_filter_rgb.h deleted file mode 100644 index 870b5c36c..000000000 --- a/uppdev/aggdraw/agg_span_image_filter_rgb.h +++ /dev/null @@ -1,901 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// Adaptation for high precision colors has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- -#ifndef AGG_SPAN_IMAGE_FILTER_RGB_INCLUDED -#define AGG_SPAN_IMAGE_FILTER_RGB_INCLUDED - -#include "agg_basics.h" -#include "agg_color_rgba.h" -#include "agg_span_image_filter.h" - - -namespace agg -{ - - //===============================================span_image_filter_rgb_nn - template - class span_image_filter_rgb_nn : - public span_image_filter - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - span_image_filter_rgb_nn() {} - span_image_filter_rgb_nn(source_type& src, - interpolator_type& inter) : - base_type(src, inter, 0) - {} - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - do - { - base_type::interpolator().coordinates(&x, &y); - const value_type* fg_ptr = (const value_type*) - base_type::source().span(x >> image_subpixel_shift, - y >> image_subpixel_shift, - 1); - span->r = fg_ptr[order_type::R]; - span->g = fg_ptr[order_type::G]; - span->b = fg_ptr[order_type::B]; - span->a = base_mask; - ++span; - ++base_type::interpolator(); - - } while(--len); - } - }; - - - - //==========================================span_image_filter_rgb_bilinear - template - class span_image_filter_rgb_bilinear : - public span_image_filter - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - span_image_filter_rgb_bilinear() {} - span_image_filter_rgb_bilinear(source_type& src, - interpolator_type& inter) : - base_type(src, inter, 0) - {} - - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - calc_type fg[3]; - const value_type *fg_ptr; - do - { - int x_hr; - int y_hr; - - base_type::interpolator().coordinates(&x_hr, &y_hr); - - x_hr -= base_type::filter_dx_int(); - y_hr -= base_type::filter_dy_int(); - - int x_lr = x_hr >> image_subpixel_shift; - int y_lr = y_hr >> image_subpixel_shift; - - unsigned weight; - - fg[0] = - fg[1] = - fg[2] = image_subpixel_scale * image_subpixel_scale / 2; - - x_hr &= image_subpixel_mask; - y_hr &= image_subpixel_mask; - - fg_ptr = (const value_type*)base_type::source().span(x_lr, y_lr, 2); - weight = (image_subpixel_scale - x_hr) * - (image_subpixel_scale - y_hr); - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr; - - fg_ptr = (const value_type*)base_type::source().next_x(); - weight = x_hr * (image_subpixel_scale - y_hr); - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr; - - fg_ptr = (const value_type*)base_type::source().next_y(); - weight = (image_subpixel_scale - x_hr) * y_hr; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr; - - fg_ptr = (const value_type*)base_type::source().next_x(); - weight = x_hr * y_hr; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr; - - span->r = value_type(fg[order_type::R] >> (image_subpixel_shift * 2)); - span->g = value_type(fg[order_type::G] >> (image_subpixel_shift * 2)); - span->b = value_type(fg[order_type::B] >> (image_subpixel_shift * 2)); - span->a = base_mask; - - ++span; - ++base_type::interpolator(); - - } while(--len); - } - }; - - - - //=====================================span_image_filter_rgb_bilinear_clip - template - class span_image_filter_rgb_bilinear_clip : - public span_image_filter - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - span_image_filter_rgb_bilinear_clip() {} - span_image_filter_rgb_bilinear_clip(source_type& src, - const color_type& back_color, - interpolator_type& inter) : - base_type(src, inter, 0), - m_back_color(back_color) - {} - const color_type& background_color() const { return m_back_color; } - void background_color(const color_type& v) { m_back_color = v; } - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - calc_type fg[3]; - calc_type src_alpha; - value_type back_r = m_back_color.r; - value_type back_g = m_back_color.g; - value_type back_b = m_back_color.b; - value_type back_a = m_back_color.a; - - const value_type *fg_ptr; - - int maxx = base_type::source().width() - 1; - int maxy = base_type::source().height() - 1; - - do - { - int x_hr; - int y_hr; - - base_type::interpolator().coordinates(&x_hr, &y_hr); - - x_hr -= base_type::filter_dx_int(); - y_hr -= base_type::filter_dy_int(); - - int x_lr = x_hr >> image_subpixel_shift; - int y_lr = y_hr >> image_subpixel_shift; - unsigned weight; - - if(x_lr >= 0 && y_lr >= 0 && - x_lr < maxx && y_lr < maxy) - { - fg[0] = - fg[1] = - fg[2] = image_subpixel_scale * image_subpixel_scale / 2; - - x_hr &= image_subpixel_mask; - y_hr &= image_subpixel_mask; - - fg_ptr = (const value_type*) - base_type::source().row_ptr(y_lr) + x_lr + x_lr + x_lr; - - weight = (image_subpixel_scale - x_hr) * - (image_subpixel_scale - y_hr); - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - - weight = x_hr * (image_subpixel_scale - y_hr); - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - - ++y_lr; - fg_ptr = (const value_type*) - base_type::source().row_ptr(y_lr) + x_lr + x_lr + x_lr; - - weight = (image_subpixel_scale - x_hr) * y_hr; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - - weight = x_hr * y_hr; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - - fg[0] >>= image_subpixel_shift * 2; - fg[1] >>= image_subpixel_shift * 2; - fg[2] >>= image_subpixel_shift * 2; - src_alpha = base_mask; - } - else - { - if(x_lr < -1 || y_lr < -1 || - x_lr > maxx || y_lr > maxy) - { - fg[order_type::R] = back_r; - fg[order_type::G] = back_g; - fg[order_type::B] = back_b; - src_alpha = back_a; - } - else - { - fg[0] = - fg[1] = - fg[2] = - src_alpha = image_subpixel_scale * image_subpixel_scale / 2; - - x_hr &= image_subpixel_mask; - y_hr &= image_subpixel_mask; - - weight = (image_subpixel_scale - x_hr) * - (image_subpixel_scale - y_hr); - if(x_lr >= 0 && y_lr >= 0 && - x_lr <= maxx && y_lr <= maxy) - { - fg_ptr = (const value_type*) - base_type::source().row_ptr(y_lr) + x_lr + x_lr + x_lr; - - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - src_alpha += weight * base_mask; - } - else - { - fg[order_type::R] += back_r * weight; - fg[order_type::G] += back_g * weight; - fg[order_type::B] += back_b * weight; - src_alpha += back_a * weight; - } - - x_lr++; - - weight = x_hr * (image_subpixel_scale - y_hr); - if(x_lr >= 0 && y_lr >= 0 && - x_lr <= maxx && y_lr <= maxy) - { - fg_ptr = (const value_type*) - base_type::source().row_ptr(y_lr) + x_lr + x_lr + x_lr; - - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - src_alpha += weight * base_mask; - } - else - { - fg[order_type::R] += back_r * weight; - fg[order_type::G] += back_g * weight; - fg[order_type::B] += back_b * weight; - src_alpha += back_a * weight; - } - - x_lr--; - y_lr++; - - weight = (image_subpixel_scale - x_hr) * y_hr; - if(x_lr >= 0 && y_lr >= 0 && - x_lr <= maxx && y_lr <= maxy) - { - fg_ptr = (const value_type*) - base_type::source().row_ptr(y_lr) + x_lr + x_lr + x_lr; - - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - src_alpha += weight * base_mask; - } - else - { - fg[order_type::R] += back_r * weight; - fg[order_type::G] += back_g * weight; - fg[order_type::B] += back_b * weight; - src_alpha += back_a * weight; - } - - x_lr++; - - weight = x_hr * y_hr; - if(x_lr >= 0 && y_lr >= 0 && - x_lr <= maxx && y_lr <= maxy) - { - fg_ptr = (const value_type*) - base_type::source().row_ptr(y_lr) + x_lr + x_lr + x_lr; - - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - src_alpha += weight * base_mask; - } - else - { - fg[order_type::R] += back_r * weight; - fg[order_type::G] += back_g * weight; - fg[order_type::B] += back_b * weight; - src_alpha += back_a * weight; - } - - fg[0] >>= image_subpixel_shift * 2; - fg[1] >>= image_subpixel_shift * 2; - fg[2] >>= image_subpixel_shift * 2; - src_alpha >>= image_subpixel_shift * 2; - } - } - - span->r = (value_type)fg[order_type::R]; - span->g = (value_type)fg[order_type::G]; - span->b = (value_type)fg[order_type::B]; - span->a = (value_type)src_alpha; - ++span; - ++base_type::interpolator(); - - } while(--len); - } - private: - color_type m_back_color; - }; - - - - //===============================================span_image_filter_rgb_2x2 - template - class span_image_filter_rgb_2x2 : - public span_image_filter - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - span_image_filter_rgb_2x2() {} - span_image_filter_rgb_2x2(source_type& src, - interpolator_type& inter, - const image_filter_lut& filter) : - base_type(src, inter, &filter) - {} - - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - - calc_type fg[3]; - - const value_type *fg_ptr; - const int16* weight_array = base_type::filter().weight_array() + - ((base_type::filter().diameter()/2 - 1) << - image_subpixel_shift); - do - { - int x_hr; - int y_hr; - - base_type::interpolator().coordinates(&x_hr, &y_hr); - - x_hr -= base_type::filter_dx_int(); - y_hr -= base_type::filter_dy_int(); - - int x_lr = x_hr >> image_subpixel_shift; - int y_lr = y_hr >> image_subpixel_shift; - - unsigned weight; - fg[0] = fg[1] = fg[2] = image_filter_scale / 2; - - x_hr &= image_subpixel_mask; - y_hr &= image_subpixel_mask; - - fg_ptr = (const value_type*)base_type::source().span(x_lr, y_lr, 2); - weight = (weight_array[x_hr + image_subpixel_scale] * - weight_array[y_hr + image_subpixel_scale] + - image_filter_scale / 2) >> - image_filter_shift; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr; - - fg_ptr = (const value_type*)base_type::source().next_x(); - weight = (weight_array[x_hr] * - weight_array[y_hr + image_subpixel_scale] + - image_filter_scale / 2) >> - image_filter_shift; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr; - - fg_ptr = (const value_type*)base_type::source().next_y(); - weight = (weight_array[x_hr + image_subpixel_scale] * - weight_array[y_hr] + - image_filter_scale / 2) >> - image_filter_shift; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr; - - fg_ptr = (const value_type*)base_type::source().next_x(); - weight = (weight_array[x_hr] * - weight_array[y_hr] + - image_filter_scale / 2) >> - image_filter_shift; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr; - - fg[0] >>= image_filter_shift; - fg[1] >>= image_filter_shift; - fg[2] >>= image_filter_shift; - - if(fg[order_type::R] > base_mask) fg[order_type::R] = base_mask; - if(fg[order_type::G] > base_mask) fg[order_type::G] = base_mask; - if(fg[order_type::B] > base_mask) fg[order_type::B] = base_mask; - - span->r = (value_type)fg[order_type::R]; - span->g = (value_type)fg[order_type::G]; - span->b = (value_type)fg[order_type::B]; - span->a = base_mask; - - ++span; - ++base_type::interpolator(); - - } while(--len); - } - }; - - - - //===================================================span_image_filter_rgb - template - class span_image_filter_rgb : - public span_image_filter - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - span_image_filter_rgb() {} - span_image_filter_rgb(source_type& src, - interpolator_type& inter, - const image_filter_lut& filter) : - base_type(src, inter, &filter) - {} - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - - int fg[3]; - const value_type *fg_ptr; - - unsigned diameter = base_type::filter().diameter(); - int start = base_type::filter().start(); - const int16* weight_array = base_type::filter().weight_array(); - - int x_count; - int weight_y; - - do - { - base_type::interpolator().coordinates(&x, &y); - - x -= base_type::filter_dx_int(); - y -= base_type::filter_dy_int(); - - int x_hr = x; - int y_hr = y; - - int x_lr = x_hr >> image_subpixel_shift; - int y_lr = y_hr >> image_subpixel_shift; - - fg[0] = fg[1] = fg[2] = image_filter_scale / 2; - - int x_fract = x_hr & image_subpixel_mask; - unsigned y_count = diameter; - - y_hr = image_subpixel_mask - (y_hr & image_subpixel_mask); - fg_ptr = (const value_type*)base_type::source().span(x_lr + start, - y_lr + start, - diameter); - for(;;) - { - x_count = diameter; - weight_y = weight_array[y_hr]; - x_hr = image_subpixel_mask - x_fract; - for(;;) - { - int weight = (weight_y * weight_array[x_hr] + - image_filter_scale / 2) >> - image_filter_shift; - - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr; - - if(--x_count == 0) break; - x_hr += image_subpixel_scale; - fg_ptr = (const value_type*)base_type::source().next_x(); - } - - if(--y_count == 0) break; - y_hr += image_subpixel_scale; - fg_ptr = (const value_type*)base_type::source().next_y(); - } - - fg[0] >>= image_filter_shift; - fg[1] >>= image_filter_shift; - fg[2] >>= image_filter_shift; - - if(fg[0] < 0) fg[0] = 0; - if(fg[1] < 0) fg[1] = 0; - if(fg[2] < 0) fg[2] = 0; - - if(fg[order_type::R] > base_mask) fg[order_type::R] = base_mask; - if(fg[order_type::G] > base_mask) fg[order_type::G] = base_mask; - if(fg[order_type::B] > base_mask) fg[order_type::B] = base_mask; - - span->r = (value_type)fg[order_type::R]; - span->g = (value_type)fg[order_type::G]; - span->b = (value_type)fg[order_type::B]; - span->a = base_mask; - - ++span; - ++base_type::interpolator(); - - } while(--len); - } - }; - - - - //==========================================span_image_resample_rgb_affine - template - class span_image_resample_rgb_affine : - public span_image_resample_affine - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef span_image_resample_affine base_type; - typedef typename base_type::interpolator_type interpolator_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::long_type long_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask, - downscale_shift = image_filter_shift - }; - - //-------------------------------------------------------------------- - span_image_resample_rgb_affine() {} - span_image_resample_rgb_affine(source_type& src, - interpolator_type& inter, - const image_filter_lut& filter) : - base_type(src, inter, filter) - {} - - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - - long_type fg[3]; - - int diameter = base_type::filter().diameter(); - int filter_scale = diameter << image_subpixel_shift; - int radius_x = (diameter * base_type::m_rx) >> 1; - int radius_y = (diameter * base_type::m_ry) >> 1; - int len_x_lr = - (diameter * base_type::m_rx + image_subpixel_mask) >> - image_subpixel_shift; - - const int16* weight_array = base_type::filter().weight_array(); - - do - { - base_type::interpolator().coordinates(&x, &y); - - x += base_type::filter_dx_int() - radius_x; - y += base_type::filter_dy_int() - radius_y; - - fg[0] = fg[1] = fg[2] = image_filter_scale / 2; - - int y_lr = y >> image_subpixel_shift; - int y_hr = ((image_subpixel_mask - (y & image_subpixel_mask)) * - base_type::m_ry_inv) >> - image_subpixel_shift; - int total_weight = 0; - int x_lr = x >> image_subpixel_shift; - int x_hr = ((image_subpixel_mask - (x & image_subpixel_mask)) * - base_type::m_rx_inv) >> - image_subpixel_shift; - - int x_hr2 = x_hr; - const value_type* fg_ptr = - (const value_type*)base_type::source().span(x_lr, y_lr, len_x_lr); - for(;;) - { - int weight_y = weight_array[y_hr]; - x_hr = x_hr2; - for(;;) - { - int weight = (weight_y * weight_array[x_hr] + - image_filter_scale / 2) >> - downscale_shift; - - fg[0] += *fg_ptr++ * weight; - fg[1] += *fg_ptr++ * weight; - fg[2] += *fg_ptr * weight; - total_weight += weight; - x_hr += base_type::m_rx_inv; - if(x_hr >= filter_scale) break; - fg_ptr = (const value_type*)base_type::source().next_x(); - } - y_hr += base_type::m_ry_inv; - if(y_hr >= filter_scale) break; - fg_ptr = (const value_type*)base_type::source().next_y(); - } - - fg[0] /= total_weight; - fg[1] /= total_weight; - fg[2] /= total_weight; - - if(fg[0] < 0) fg[0] = 0; - if(fg[1] < 0) fg[1] = 0; - if(fg[2] < 0) fg[2] = 0; - - if(fg[order_type::R] > base_mask) fg[order_type::R] = base_mask; - if(fg[order_type::G] > base_mask) fg[order_type::G] = base_mask; - if(fg[order_type::B] > base_mask) fg[order_type::B] = base_mask; - - span->r = (value_type)fg[order_type::R]; - span->g = (value_type)fg[order_type::G]; - span->b = (value_type)fg[order_type::B]; - span->a = base_mask; - - ++span; - ++base_type::interpolator(); - } while(--len); - } - }; - - - - //=================================================span_image_resample_rgb - template - class span_image_resample_rgb : - public span_image_resample - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef Interpolator interpolator_type; - typedef span_image_resample base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::long_type long_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask, - downscale_shift = image_filter_shift - }; - - //-------------------------------------------------------------------- - span_image_resample_rgb() {} - span_image_resample_rgb(source_type& src, - interpolator_type& inter, - const image_filter_lut& filter) : - base_type(src, inter, filter) - {} - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - long_type fg[3]; - - int diameter = base_type::filter().diameter(); - int filter_scale = diameter << image_subpixel_shift; - - const int16* weight_array = base_type::filter().weight_array(); - do - { - int rx; - int ry; - int rx_inv = image_subpixel_scale; - int ry_inv = image_subpixel_scale; - base_type::interpolator().coordinates(&x, &y); - base_type::interpolator().local_scale(&rx, &ry); - base_type::adjust_scale(&rx, &ry); - - rx_inv = image_subpixel_scale * image_subpixel_scale / rx; - ry_inv = image_subpixel_scale * image_subpixel_scale / ry; - - int radius_x = (diameter * rx) >> 1; - int radius_y = (diameter * ry) >> 1; - int len_x_lr = - (diameter * rx + image_subpixel_mask) >> - image_subpixel_shift; - - x += base_type::filter_dx_int() - radius_x; - y += base_type::filter_dy_int() - radius_y; - - fg[0] = fg[1] = fg[2] = image_filter_scale / 2; - - int y_lr = y >> image_subpixel_shift; - int y_hr = ((image_subpixel_mask - (y & image_subpixel_mask)) * - ry_inv) >> - image_subpixel_shift; - int total_weight = 0; - int x_lr = x >> image_subpixel_shift; - int x_hr = ((image_subpixel_mask - (x & image_subpixel_mask)) * - rx_inv) >> - image_subpixel_shift; - int x_hr2 = x_hr; - const value_type* fg_ptr = - (const value_type*)base_type::source().span(x_lr, y_lr, len_x_lr); - - for(;;) - { - int weight_y = weight_array[y_hr]; - x_hr = x_hr2; - for(;;) - { - int weight = (weight_y * weight_array[x_hr] + - image_filter_scale / 2) >> - downscale_shift; - fg[0] += *fg_ptr++ * weight; - fg[1] += *fg_ptr++ * weight; - fg[2] += *fg_ptr * weight; - total_weight += weight; - x_hr += rx_inv; - if(x_hr >= filter_scale) break; - fg_ptr = (const value_type*)base_type::source().next_x(); - } - y_hr += ry_inv; - if(y_hr >= filter_scale) break; - fg_ptr = (const value_type*)base_type::source().next_y(); - } - - fg[0] /= total_weight; - fg[1] /= total_weight; - fg[2] /= total_weight; - - if(fg[0] < 0) fg[0] = 0; - if(fg[1] < 0) fg[1] = 0; - if(fg[2] < 0) fg[2] = 0; - - if(fg[order_type::R] > base_mask) fg[order_type::R] = base_mask; - if(fg[order_type::G] > base_mask) fg[order_type::G] = base_mask; - if(fg[order_type::B] > base_mask) fg[order_type::B] = base_mask; - - span->r = (value_type)fg[order_type::R]; - span->g = (value_type)fg[order_type::G]; - span->b = (value_type)fg[order_type::B]; - span->a = base_mask; - - ++span; - ++base_type::interpolator(); - } while(--len); - } - }; - - -} - - -#endif - - - diff --git a/uppdev/aggdraw/agg_span_image_filter_rgba.h b/uppdev/aggdraw/agg_span_image_filter_rgba.h deleted file mode 100644 index 598ca3780..000000000 --- a/uppdev/aggdraw/agg_span_image_filter_rgba.h +++ /dev/null @@ -1,929 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// Adaptation for high precision colors has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- -#ifndef AGG_SPAN_IMAGE_FILTER_RGBA_INCLUDED -#define AGG_SPAN_IMAGE_FILTER_RGBA_INCLUDED - -#include "agg_basics.h" -#include "agg_color_rgba.h" -#include "agg_span_image_filter.h" - - -namespace agg -{ - - //==============================================span_image_filter_rgba_nn - template - class span_image_filter_rgba_nn : - public span_image_filter - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - span_image_filter_rgba_nn() {} - span_image_filter_rgba_nn(source_type& src, - interpolator_type& inter) : - base_type(src, inter, 0) - {} - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - do - { - base_type::interpolator().coordinates(&x, &y); - const value_type* fg_ptr = (const value_type*) - base_type::source().span(x >> image_subpixel_shift, - y >> image_subpixel_shift, - 1); - span->r = fg_ptr[order_type::R]; - span->g = fg_ptr[order_type::G]; - span->b = fg_ptr[order_type::B]; - span->a = fg_ptr[order_type::A]; - ++span; - ++base_type::interpolator(); - - } while(--len); - } - }; - - - - //=========================================span_image_filter_rgba_bilinear - template - class span_image_filter_rgba_bilinear : - public span_image_filter - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - span_image_filter_rgba_bilinear() {} - span_image_filter_rgba_bilinear(source_type& src, - interpolator_type& inter) : - base_type(src, inter, 0) - {} - - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - - calc_type fg[4]; - const value_type *fg_ptr; - - do - { - int x_hr; - int y_hr; - - base_type::interpolator().coordinates(&x_hr, &y_hr); - - x_hr -= base_type::filter_dx_int(); - y_hr -= base_type::filter_dy_int(); - - int x_lr = x_hr >> image_subpixel_shift; - int y_lr = y_hr >> image_subpixel_shift; - - unsigned weight; - - fg[0] = - fg[1] = - fg[2] = - fg[3] = image_subpixel_scale * image_subpixel_scale / 2; - - x_hr &= image_subpixel_mask; - y_hr &= image_subpixel_mask; - - fg_ptr = (const value_type*)base_type::source().span(x_lr, y_lr, 2); - weight = (image_subpixel_scale - x_hr) * - (image_subpixel_scale - y_hr); - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr; - - fg_ptr = (const value_type*)base_type::source().next_x(); - weight = x_hr * (image_subpixel_scale - y_hr); - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr; - - fg_ptr = (const value_type*)base_type::source().next_y(); - weight = (image_subpixel_scale - x_hr) * y_hr; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr; - - fg_ptr = (const value_type*)base_type::source().next_x(); - weight = x_hr * y_hr; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr; - - span->r = value_type(fg[order_type::R] >> (image_subpixel_shift * 2)); - span->g = value_type(fg[order_type::G] >> (image_subpixel_shift * 2)); - span->b = value_type(fg[order_type::B] >> (image_subpixel_shift * 2)); - span->a = value_type(fg[order_type::A] >> (image_subpixel_shift * 2)); - - ++span; - ++base_type::interpolator(); - - } while(--len); - } - }; - - - //====================================span_image_filter_rgba_bilinear_clip - template - class span_image_filter_rgba_bilinear_clip : - public span_image_filter - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - span_image_filter_rgba_bilinear_clip() {} - span_image_filter_rgba_bilinear_clip(source_type& src, - const color_type& back_color, - interpolator_type& inter) : - base_type(src, inter, 0), - m_back_color(back_color) - {} - const color_type& background_color() const { return m_back_color; } - void background_color(const color_type& v) { m_back_color = v; } - - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - - calc_type fg[4]; - value_type back_r = m_back_color.r; - value_type back_g = m_back_color.g; - value_type back_b = m_back_color.b; - value_type back_a = m_back_color.a; - - const value_type *fg_ptr; - int maxx = base_type::source().width() - 1; - int maxy = base_type::source().height() - 1; - - do - { - int x_hr; - int y_hr; - - base_type::interpolator().coordinates(&x_hr, &y_hr); - - x_hr -= base_type::filter_dx_int(); - y_hr -= base_type::filter_dy_int(); - - int x_lr = x_hr >> image_subpixel_shift; - int y_lr = y_hr >> image_subpixel_shift; - - unsigned weight; - - if(x_lr >= 0 && y_lr >= 0 && - x_lr < maxx && y_lr < maxy) - { - fg[0] = - fg[1] = - fg[2] = - fg[3] = image_subpixel_scale * image_subpixel_scale / 2; - - x_hr &= image_subpixel_mask; - y_hr &= image_subpixel_mask; - - fg_ptr = (const value_type*) - base_type::source().row_ptr(y_lr) + (x_lr << 2); - - weight = (image_subpixel_scale - x_hr) * - (image_subpixel_scale - y_hr); - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr++; - - weight = x_hr * (image_subpixel_scale - y_hr); - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr++; - - ++y_lr; - fg_ptr = (const value_type*) - base_type::source().row_ptr(y_lr) + (x_lr << 2); - - weight = (image_subpixel_scale - x_hr) * y_hr; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr++; - - weight = x_hr * y_hr; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr++; - - fg[0] >>= image_subpixel_shift * 2; - fg[1] >>= image_subpixel_shift * 2; - fg[2] >>= image_subpixel_shift * 2; - fg[3] >>= image_subpixel_shift * 2; - } - else - { - if(x_lr < -1 || y_lr < -1 || - x_lr > maxx || y_lr > maxy) - { - fg[order_type::R] = back_r; - fg[order_type::G] = back_g; - fg[order_type::B] = back_b; - fg[order_type::A] = back_a; - } - else - { - fg[0] = - fg[1] = - fg[2] = - fg[3] = image_subpixel_scale * image_subpixel_scale / 2; - - x_hr &= image_subpixel_mask; - y_hr &= image_subpixel_mask; - - weight = (image_subpixel_scale - x_hr) * - (image_subpixel_scale - y_hr); - if(x_lr >= 0 && y_lr >= 0 && - x_lr <= maxx && y_lr <= maxy) - { - fg_ptr = (const value_type*) - base_type::source().row_ptr(y_lr) + (x_lr << 2); - - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr++; - } - else - { - fg[order_type::R] += back_r * weight; - fg[order_type::G] += back_g * weight; - fg[order_type::B] += back_b * weight; - fg[order_type::A] += back_a * weight; - } - - x_lr++; - - weight = x_hr * (image_subpixel_scale - y_hr); - if(x_lr >= 0 && y_lr >= 0 && - x_lr <= maxx && y_lr <= maxy) - { - fg_ptr = (const value_type*) - base_type::source().row_ptr(y_lr) + (x_lr << 2); - - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr++; - } - else - { - fg[order_type::R] += back_r * weight; - fg[order_type::G] += back_g * weight; - fg[order_type::B] += back_b * weight; - fg[order_type::A] += back_a * weight; - } - - x_lr--; - y_lr++; - - weight = (image_subpixel_scale - x_hr) * y_hr; - if(x_lr >= 0 && y_lr >= 0 && - x_lr <= maxx && y_lr <= maxy) - { - fg_ptr = (const value_type*) - base_type::source().row_ptr(y_lr) + (x_lr << 2); - - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr++; - } - else - { - fg[order_type::R] += back_r * weight; - fg[order_type::G] += back_g * weight; - fg[order_type::B] += back_b * weight; - fg[order_type::A] += back_a * weight; - } - - x_lr++; - - weight = x_hr * y_hr; - if(x_lr >= 0 && y_lr >= 0 && - x_lr <= maxx && y_lr <= maxy) - { - fg_ptr = (const value_type*) - base_type::source().row_ptr(y_lr) + (x_lr << 2); - - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr++; - } - else - { - fg[order_type::R] += back_r * weight; - fg[order_type::G] += back_g * weight; - fg[order_type::B] += back_b * weight; - fg[order_type::A] += back_a * weight; - } - - fg[0] >>= image_subpixel_shift * 2; - fg[1] >>= image_subpixel_shift * 2; - fg[2] >>= image_subpixel_shift * 2; - fg[3] >>= image_subpixel_shift * 2; - } - } - - span->r = (value_type)fg[order_type::R]; - span->g = (value_type)fg[order_type::G]; - span->b = (value_type)fg[order_type::B]; - span->a = (value_type)fg[order_type::A]; - ++span; - ++base_type::interpolator(); - - } while(--len); - } - private: - color_type m_back_color; - }; - - - //==============================================span_image_filter_rgba_2x2 - template - class span_image_filter_rgba_2x2 : - public span_image_filter - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - span_image_filter_rgba_2x2() {} - span_image_filter_rgba_2x2(source_type& src, - interpolator_type& inter, - const image_filter_lut& filter) : - base_type(src, inter, &filter) - {} - - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - - calc_type fg[4]; - - const value_type *fg_ptr; - const int16* weight_array = base_type::filter().weight_array() + - ((base_type::filter().diameter()/2 - 1) << - image_subpixel_shift); - - do - { - int x_hr; - int y_hr; - - base_type::interpolator().coordinates(&x_hr, &y_hr); - - x_hr -= base_type::filter_dx_int(); - y_hr -= base_type::filter_dy_int(); - - int x_lr = x_hr >> image_subpixel_shift; - int y_lr = y_hr >> image_subpixel_shift; - - unsigned weight; - fg[0] = fg[1] = fg[2] = fg[3] = image_filter_scale / 2; - - x_hr &= image_subpixel_mask; - y_hr &= image_subpixel_mask; - - fg_ptr = (const value_type*)base_type::source().span(x_lr, y_lr, 2); - weight = (weight_array[x_hr + image_subpixel_scale] * - weight_array[y_hr + image_subpixel_scale] + - image_filter_scale / 2) >> - image_filter_shift; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr; - - fg_ptr = (const value_type*)base_type::source().next_x(); - weight = (weight_array[x_hr] * - weight_array[y_hr + image_subpixel_scale] + - image_filter_scale / 2) >> - image_filter_shift; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr; - - fg_ptr = (const value_type*)base_type::source().next_y(); - weight = (weight_array[x_hr + image_subpixel_scale] * - weight_array[y_hr] + - image_filter_scale / 2) >> - image_filter_shift; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr; - - fg_ptr = (const value_type*)base_type::source().next_x(); - weight = (weight_array[x_hr] * - weight_array[y_hr] + - image_filter_scale / 2) >> - image_filter_shift; - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr; - - fg[0] >>= image_filter_shift; - fg[1] >>= image_filter_shift; - fg[2] >>= image_filter_shift; - fg[3] >>= image_filter_shift; - - if(fg[order_type::A] > base_mask) fg[order_type::A] = base_mask; - if(fg[order_type::R] > fg[order_type::A]) fg[order_type::R] = fg[order_type::A]; - if(fg[order_type::G] > fg[order_type::A]) fg[order_type::G] = fg[order_type::A]; - if(fg[order_type::B] > fg[order_type::A]) fg[order_type::B] = fg[order_type::A]; - - span->r = (value_type)fg[order_type::R]; - span->g = (value_type)fg[order_type::G]; - span->b = (value_type)fg[order_type::B]; - span->a = (value_type)fg[order_type::A]; - ++span; - ++base_type::interpolator(); - - } while(--len); - } - }; - - - - //==================================================span_image_filter_rgba - template - class span_image_filter_rgba : - public span_image_filter - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef Interpolator interpolator_type; - typedef span_image_filter base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask - }; - - //-------------------------------------------------------------------- - span_image_filter_rgba() {} - span_image_filter_rgba(source_type& src, - interpolator_type& inter, - const image_filter_lut& filter) : - base_type(src, inter, &filter) - {} - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - - int fg[4]; - const value_type *fg_ptr; - - unsigned diameter = base_type::filter().diameter(); - int start = base_type::filter().start(); - const int16* weight_array = base_type::filter().weight_array(); - - int x_count; - int weight_y; - - do - { - base_type::interpolator().coordinates(&x, &y); - - x -= base_type::filter_dx_int(); - y -= base_type::filter_dy_int(); - - int x_hr = x; - int y_hr = y; - - int x_lr = x_hr >> image_subpixel_shift; - int y_lr = y_hr >> image_subpixel_shift; - - fg[0] = fg[1] = fg[2] = fg[3] = image_filter_scale / 2; - - int x_fract = x_hr & image_subpixel_mask; - unsigned y_count = diameter; - - y_hr = image_subpixel_mask - (y_hr & image_subpixel_mask); - fg_ptr = (const value_type*)base_type::source().span(x_lr + start, - y_lr + start, - diameter); - for(;;) - { - x_count = diameter; - weight_y = weight_array[y_hr]; - x_hr = image_subpixel_mask - x_fract; - for(;;) - { - int weight = (weight_y * weight_array[x_hr] + - image_filter_scale / 2) >> - image_filter_shift; - - fg[0] += weight * *fg_ptr++; - fg[1] += weight * *fg_ptr++; - fg[2] += weight * *fg_ptr++; - fg[3] += weight * *fg_ptr; - - if(--x_count == 0) break; - x_hr += image_subpixel_scale; - fg_ptr = (const value_type*)base_type::source().next_x(); - } - - if(--y_count == 0) break; - y_hr += image_subpixel_scale; - fg_ptr = (const value_type*)base_type::source().next_y(); - } - - fg[0] >>= image_filter_shift; - fg[1] >>= image_filter_shift; - fg[2] >>= image_filter_shift; - fg[3] >>= image_filter_shift; - - if(fg[0] < 0) fg[0] = 0; - if(fg[1] < 0) fg[1] = 0; - if(fg[2] < 0) fg[2] = 0; - if(fg[3] < 0) fg[3] = 0; - - if(fg[order_type::A] > base_mask) fg[order_type::A] = base_mask; - if(fg[order_type::R] > fg[order_type::A]) fg[order_type::R] = fg[order_type::A]; - if(fg[order_type::G] > fg[order_type::A]) fg[order_type::G] = fg[order_type::A]; - if(fg[order_type::B] > fg[order_type::A]) fg[order_type::B] = fg[order_type::A]; - - span->r = (value_type)fg[order_type::R]; - span->g = (value_type)fg[order_type::G]; - span->b = (value_type)fg[order_type::B]; - span->a = (value_type)fg[order_type::A]; - ++span; - ++base_type::interpolator(); - - } while(--len); - } - }; - - - - //========================================span_image_resample_rgba_affine - template - class span_image_resample_rgba_affine : - public span_image_resample_affine - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef span_image_resample_affine base_type; - typedef typename base_type::interpolator_type interpolator_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::long_type long_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask, - downscale_shift = image_filter_shift - }; - - //-------------------------------------------------------------------- - span_image_resample_rgba_affine() {} - span_image_resample_rgba_affine(source_type& src, - interpolator_type& inter, - const image_filter_lut& filter) : - base_type(src, inter, filter) - {} - - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - - long_type fg[4]; - - int diameter = base_type::filter().diameter(); - int filter_scale = diameter << image_subpixel_shift; - int radius_x = (diameter * base_type::m_rx) >> 1; - int radius_y = (diameter * base_type::m_ry) >> 1; - int len_x_lr = - (diameter * base_type::m_rx + image_subpixel_mask) >> - image_subpixel_shift; - - const int16* weight_array = base_type::filter().weight_array(); - - do - { - base_type::interpolator().coordinates(&x, &y); - - x += base_type::filter_dx_int() - radius_x; - y += base_type::filter_dy_int() - radius_y; - - fg[0] = fg[1] = fg[2] = fg[3] = image_filter_scale / 2; - - int y_lr = y >> image_subpixel_shift; - int y_hr = ((image_subpixel_mask - (y & image_subpixel_mask)) * - base_type::m_ry_inv) >> - image_subpixel_shift; - int total_weight = 0; - int x_lr = x >> image_subpixel_shift; - int x_hr = ((image_subpixel_mask - (x & image_subpixel_mask)) * - base_type::m_rx_inv) >> - image_subpixel_shift; - - int x_hr2 = x_hr; - const value_type* fg_ptr = - (const value_type*)base_type::source().span(x_lr, y_lr, len_x_lr); - for(;;) - { - int weight_y = weight_array[y_hr]; - x_hr = x_hr2; - for(;;) - { - int weight = (weight_y * weight_array[x_hr] + - image_filter_scale / 2) >> - downscale_shift; - - fg[0] += *fg_ptr++ * weight; - fg[1] += *fg_ptr++ * weight; - fg[2] += *fg_ptr++ * weight; - fg[3] += *fg_ptr++ * weight; - total_weight += weight; - x_hr += base_type::m_rx_inv; - if(x_hr >= filter_scale) break; - fg_ptr = (const value_type*)base_type::source().next_x(); - } - y_hr += base_type::m_ry_inv; - if(y_hr >= filter_scale) break; - fg_ptr = (const value_type*)base_type::source().next_y(); - } - - fg[0] /= total_weight; - fg[1] /= total_weight; - fg[2] /= total_weight; - fg[3] /= total_weight; - - if(fg[0] < 0) fg[0] = 0; - if(fg[1] < 0) fg[1] = 0; - if(fg[2] < 0) fg[2] = 0; - if(fg[3] < 0) fg[3] = 0; - - if(fg[order_type::A] > base_mask) fg[order_type::A] = base_mask; - if(fg[order_type::R] > fg[order_type::A]) fg[order_type::R] = fg[order_type::A]; - if(fg[order_type::G] > fg[order_type::A]) fg[order_type::G] = fg[order_type::A]; - if(fg[order_type::B] > fg[order_type::A]) fg[order_type::B] = fg[order_type::A]; - - span->r = (value_type)fg[order_type::R]; - span->g = (value_type)fg[order_type::G]; - span->b = (value_type)fg[order_type::B]; - span->a = (value_type)fg[order_type::A]; - - ++span; - ++base_type::interpolator(); - } while(--len); - } - }; - - - - //==============================================span_image_resample_rgba - template - class span_image_resample_rgba : - public span_image_resample - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef Interpolator interpolator_type; - typedef span_image_resample base_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::long_type long_type; - enum base_scale_e - { - base_shift = color_type::base_shift, - base_mask = color_type::base_mask, - downscale_shift = image_filter_shift - }; - - //-------------------------------------------------------------------- - span_image_resample_rgba() {} - span_image_resample_rgba(source_type& src, - interpolator_type& inter, - const image_filter_lut& filter) : - base_type(src, inter, filter) - {} - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - base_type::interpolator().begin(x + base_type::filter_dx_dbl(), - y + base_type::filter_dy_dbl(), len); - long_type fg[4]; - - int diameter = base_type::filter().diameter(); - int filter_scale = diameter << image_subpixel_shift; - - const int16* weight_array = base_type::filter().weight_array(); - do - { - int rx; - int ry; - int rx_inv = image_subpixel_scale; - int ry_inv = image_subpixel_scale; - base_type::interpolator().coordinates(&x, &y); - base_type::interpolator().local_scale(&rx, &ry); - base_type::adjust_scale(&rx, &ry); - - rx_inv = image_subpixel_scale * image_subpixel_scale / rx; - ry_inv = image_subpixel_scale * image_subpixel_scale / ry; - - int radius_x = (diameter * rx) >> 1; - int radius_y = (diameter * ry) >> 1; - int len_x_lr = - (diameter * rx + image_subpixel_mask) >> - image_subpixel_shift; - - x += base_type::filter_dx_int() - radius_x; - y += base_type::filter_dy_int() - radius_y; - - fg[0] = fg[1] = fg[2] = fg[3] = image_filter_scale / 2; - - int y_lr = y >> image_subpixel_shift; - int y_hr = ((image_subpixel_mask - (y & image_subpixel_mask)) * - ry_inv) >> - image_subpixel_shift; - int total_weight = 0; - int x_lr = x >> image_subpixel_shift; - int x_hr = ((image_subpixel_mask - (x & image_subpixel_mask)) * - rx_inv) >> - image_subpixel_shift; - int x_hr2 = x_hr; - const value_type* fg_ptr = - (const value_type*)base_type::source().span(x_lr, y_lr, len_x_lr); - - for(;;) - { - int weight_y = weight_array[y_hr]; - x_hr = x_hr2; - for(;;) - { - int weight = (weight_y * weight_array[x_hr] + - image_filter_scale / 2) >> - downscale_shift; - fg[0] += *fg_ptr++ * weight; - fg[1] += *fg_ptr++ * weight; - fg[2] += *fg_ptr++ * weight; - fg[3] += *fg_ptr++ * weight; - total_weight += weight; - x_hr += rx_inv; - if(x_hr >= filter_scale) break; - fg_ptr = (const value_type*)base_type::source().next_x(); - } - y_hr += ry_inv; - if(y_hr >= filter_scale) break; - fg_ptr = (const value_type*)base_type::source().next_y(); - } - - fg[0] /= total_weight; - fg[1] /= total_weight; - fg[2] /= total_weight; - fg[3] /= total_weight; - - if(fg[0] < 0) fg[0] = 0; - if(fg[1] < 0) fg[1] = 0; - if(fg[2] < 0) fg[2] = 0; - if(fg[3] < 0) fg[3] = 0; - - if(fg[order_type::A] > base_mask) fg[order_type::A] = base_mask; - if(fg[order_type::R] > fg[order_type::R]) fg[order_type::R] = fg[order_type::R]; - if(fg[order_type::G] > fg[order_type::G]) fg[order_type::G] = fg[order_type::G]; - if(fg[order_type::B] > fg[order_type::B]) fg[order_type::B] = fg[order_type::B]; - - span->r = (value_type)fg[order_type::R]; - span->g = (value_type)fg[order_type::G]; - span->b = (value_type)fg[order_type::B]; - span->a = (value_type)fg[order_type::A]; - - ++span; - ++base_type::interpolator(); - } while(--len); - } - }; - - -} - - -#endif - - - diff --git a/uppdev/aggdraw/agg_span_interpolator_adaptor.h b/uppdev/aggdraw/agg_span_interpolator_adaptor.h deleted file mode 100644 index b3ff22e23..000000000 --- a/uppdev/aggdraw/agg_span_interpolator_adaptor.h +++ /dev/null @@ -1,86 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_SPAN_INTERPOLATOR_ADAPTOR_INCLUDED -#define AGG_SPAN_INTERPOLATOR_ADAPTOR_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - - //===============================================span_interpolator_adaptor - template - class span_interpolator_adaptor : public Interpolator - { - public: - typedef Interpolator base_type; - typedef typename base_type::trans_type trans_type; - typedef Distortion distortion_type; - - //-------------------------------------------------------------------- - span_interpolator_adaptor() {} - span_interpolator_adaptor(const trans_type& trans, - const distortion_type& dist) : - base_type(trans), - m_distortion(&dist) - { - } - - //-------------------------------------------------------------------- - span_interpolator_adaptor(const trans_type& trans, - const distortion_type& dist, - double x, double y, unsigned len) : - base_type(trans, x, y, len), - m_distortion(&dist) - { - } - - //-------------------------------------------------------------------- - const distortion_type& distortion() const - { - return *m_distortion; - } - - //-------------------------------------------------------------------- - void distortion(const distortion_type& dist) - { - m_distortion = dist; - } - - //-------------------------------------------------------------------- - void coordinates(int* x, int* y) const - { - base_type::coordinates(x, y); - m_distortion->calculate(x, y); - } - - private: - //-------------------------------------------------------------------- - const distortion_type* m_distortion; - }; -} - - -#endif diff --git a/uppdev/aggdraw/agg_span_interpolator_linear.h b/uppdev/aggdraw/agg_span_interpolator_linear.h deleted file mode 100644 index c9bfafdd3..000000000 --- a/uppdev/aggdraw/agg_span_interpolator_linear.h +++ /dev/null @@ -1,241 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_SPAN_INTERPOLATOR_LINEAR_INCLUDED -#define AGG_SPAN_INTERPOLATOR_LINEAR_INCLUDED - -#include "agg_basics.h" -#include "agg_dda_line.h" -#include "agg_trans_affine.h" - -namespace agg -{ - - //================================================span_interpolator_linear - template - class span_interpolator_linear - { - public: - typedef Transformer trans_type; - - enum subpixel_scale_e - { - subpixel_shift = SubpixelShift, - subpixel_scale = 1 << subpixel_shift - }; - - //-------------------------------------------------------------------- - span_interpolator_linear() {} - span_interpolator_linear(const trans_type& trans) : m_trans(&trans) {} - span_interpolator_linear(const trans_type& trans, - double x, double y, unsigned len) : - m_trans(&trans) - { - begin(x, y, len); - } - - //---------------------------------------------------------------- - const trans_type& transformer() const { return *m_trans; } - void transformer(const trans_type& trans) { m_trans = &trans; } - - //---------------------------------------------------------------- - void begin(double x, double y, unsigned len) - { - double tx; - double ty; - - tx = x; - ty = y; - m_trans->transform(&tx, &ty); - int x1 = iround(tx * subpixel_scale); - int y1 = iround(ty * subpixel_scale); - - tx = x + len; - ty = y; - m_trans->transform(&tx, &ty); - int x2 = iround(tx * subpixel_scale); - int y2 = iround(ty * subpixel_scale); - - m_li_x = dda2_line_interpolator(x1, x2, len); - m_li_y = dda2_line_interpolator(y1, y2, len); - } - - //---------------------------------------------------------------- - void resynchronize(double xe, double ye, unsigned len) - { - m_trans->transform(&xe, &ye); - m_li_x = dda2_line_interpolator(m_li_x.y(), iround(xe * subpixel_scale), len); - m_li_y = dda2_line_interpolator(m_li_y.y(), iround(ye * subpixel_scale), len); - } - - //---------------------------------------------------------------- - void operator++() - { - ++m_li_x; - ++m_li_y; - } - - //---------------------------------------------------------------- - void coordinates(int* x, int* y) const - { - *x = m_li_x.y(); - *y = m_li_y.y(); - } - - private: - const trans_type* m_trans; - dda2_line_interpolator m_li_x; - dda2_line_interpolator m_li_y; - }; - - - - - - - //=====================================span_interpolator_linear_subdiv - template - class span_interpolator_linear_subdiv - { - public: - typedef Transformer trans_type; - - enum subpixel_scale_e - { - subpixel_shift = SubpixelShift, - subpixel_scale = 1 << subpixel_shift - }; - - - //---------------------------------------------------------------- - span_interpolator_linear_subdiv() : - m_subdiv_shift(4), - m_subdiv_size(1 << m_subdiv_shift), - m_subdiv_mask(m_subdiv_size - 1) {} - - span_interpolator_linear_subdiv(const trans_type& trans, - unsigned subdiv_shift = 4) : - m_subdiv_shift(subdiv_shift), - m_subdiv_size(1 << m_subdiv_shift), - m_subdiv_mask(m_subdiv_size - 1), - m_trans(&trans) {} - - span_interpolator_linear_subdiv(const trans_type& trans, - double x, double y, unsigned len, - unsigned subdiv_shift = 4) : - m_subdiv_shift(subdiv_shift), - m_subdiv_size(1 << m_subdiv_shift), - m_subdiv_mask(m_subdiv_size - 1), - m_trans(&trans) - { - begin(x, y, len); - } - - //---------------------------------------------------------------- - const trans_type& transformer() const { return *m_trans; } - void transformer(const trans_type& trans) { m_trans = &trans; } - - //---------------------------------------------------------------- - unsigned subdiv_shift() const { return m_subdiv_shift; } - void subdiv_shift(unsigned shift) - { - m_subdiv_shift = shift; - m_subdiv_size = 1 << m_subdiv_shift; - m_subdiv_mask = m_subdiv_size - 1; - } - - //---------------------------------------------------------------- - void begin(double x, double y, unsigned len) - { - double tx; - double ty; - m_pos = 1; - m_src_x = iround(x * subpixel_scale) + subpixel_scale; - m_src_y = y; - m_len = len; - - if(len > m_subdiv_size) len = m_subdiv_size; - tx = x; - ty = y; - m_trans->transform(&tx, &ty); - int x1 = iround(tx * subpixel_scale); - int y1 = iround(ty * subpixel_scale); - - tx = x + len; - ty = y; - m_trans->transform(&tx, &ty); - - m_li_x = dda2_line_interpolator(x1, iround(tx * subpixel_scale), len); - m_li_y = dda2_line_interpolator(y1, iround(ty * subpixel_scale), len); - } - - //---------------------------------------------------------------- - void operator++() - { - ++m_li_x; - ++m_li_y; - if(m_pos >= m_subdiv_size) - { - unsigned len = m_len; - if(len > m_subdiv_size) len = m_subdiv_size; - double tx = double(m_src_x) / double(subpixel_scale) + len; - double ty = m_src_y; - m_trans->transform(&tx, &ty); - m_li_x = dda2_line_interpolator(m_li_x.y(), iround(tx * subpixel_scale), len); - m_li_y = dda2_line_interpolator(m_li_y.y(), iround(ty * subpixel_scale), len); - m_pos = 0; - } - m_src_x += subpixel_scale; - ++m_pos; - --m_len; - } - - //---------------------------------------------------------------- - void coordinates(int* x, int* y) const - { - *x = m_li_x.y(); - *y = m_li_y.y(); - } - - private: - unsigned m_subdiv_shift; - unsigned m_subdiv_size; - unsigned m_subdiv_mask; - const trans_type* m_trans; - dda2_line_interpolator m_li_x; - dda2_line_interpolator m_li_y; - int m_src_x; - double m_src_y; - unsigned m_pos; - unsigned m_len; - }; - - -} - - - -#endif - - diff --git a/uppdev/aggdraw/agg_span_interpolator_persp.h b/uppdev/aggdraw/agg_span_interpolator_persp.h deleted file mode 100644 index 1d9863a43..000000000 --- a/uppdev/aggdraw/agg_span_interpolator_persp.h +++ /dev/null @@ -1,472 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_SPAN_INTERPOLATOR_PERSP_INCLUDED -#define AGG_SPAN_INTERPOLATOR_PERSP_INCLUDED - -#include "agg_trans_perspective.h" -#include "agg_dda_line.h" - -namespace agg -{ - - - - //===========================================span_interpolator_persp_exact - template - class span_interpolator_persp_exact - { - public: - typedef trans_perspective trans_type; - typedef trans_perspective::iterator_x iterator_type; - enum subpixel_scale_e - { - subpixel_shift = SubpixelShift, - subpixel_scale = 1 << subpixel_shift - }; - - //-------------------------------------------------------------------- - span_interpolator_persp_exact() {} - - //-------------------------------------------------------------------- - // Arbitrary quadrangle transformations - span_interpolator_persp_exact(const double* src, const double* dst) - { - quad_to_quad(src, dst); - } - - //-------------------------------------------------------------------- - // Direct transformations - span_interpolator_persp_exact(double x1, double y1, - double x2, double y2, - const double* quad) - { - rect_to_quad(x1, y1, x2, y2, quad); - } - - //-------------------------------------------------------------------- - // Reverse transformations - span_interpolator_persp_exact(const double* quad, - double x1, double y1, - double x2, double y2) - { - quad_to_rect(quad, x1, y1, x2, y2); - } - - //-------------------------------------------------------------------- - // Set the transformations using two arbitrary quadrangles. - void quad_to_quad(const double* src, const double* dst) - { - m_trans_dir.quad_to_quad(src, dst); - m_trans_inv.quad_to_quad(dst, src); - } - - //-------------------------------------------------------------------- - // Set the direct transformations, i.e., rectangle -> quadrangle - void rect_to_quad(double x1, double y1, double x2, double y2, - const double* quad) - { - double src[8]; - src[0] = src[6] = x1; - src[2] = src[4] = x2; - src[1] = src[3] = y1; - src[5] = src[7] = y2; - quad_to_quad(src, quad); - } - - - //-------------------------------------------------------------------- - // Set the reverse transformations, i.e., quadrangle -> rectangle - void quad_to_rect(const double* quad, - double x1, double y1, double x2, double y2) - { - double dst[8]; - dst[0] = dst[6] = x1; - dst[2] = dst[4] = x2; - dst[1] = dst[3] = y1; - dst[5] = dst[7] = y2; - quad_to_quad(quad, dst); - } - - //-------------------------------------------------------------------- - // Check if the equations were solved successfully - bool is_valid() const { return m_trans_dir.is_valid(); } - - //---------------------------------------------------------------- - void begin(double x, double y, unsigned len) - { - m_iterator = m_trans_dir.begin(x, y, 1.0); - double xt = m_iterator.x; - double yt = m_iterator.y; - - double dx; - double dy; - const double delta = 1/double(subpixel_scale); - dx = xt + delta; - dy = yt; - m_trans_inv.transform(&dx, &dy); - dx -= x; - dy -= y; - int sx1 = uround(subpixel_scale/sqrt(dx*dx + dy*dy)) >> subpixel_shift; - dx = xt; - dy = yt + delta; - m_trans_inv.transform(&dx, &dy); - dx -= x; - dy -= y; - int sy1 = uround(subpixel_scale/sqrt(dx*dx + dy*dy)) >> subpixel_shift; - - x += len; - xt = x; - yt = y; - m_trans_dir.transform(&xt, &yt); - - dx = xt + delta; - dy = yt; - m_trans_inv.transform(&dx, &dy); - dx -= x; - dy -= y; - int sx2 = uround(subpixel_scale/sqrt(dx*dx + dy*dy)) >> subpixel_shift; - dx = xt; - dy = yt + delta; - m_trans_inv.transform(&dx, &dy); - dx -= x; - dy -= y; - int sy2 = uround(subpixel_scale/sqrt(dx*dx + dy*dy)) >> subpixel_shift; - - m_scale_x = dda2_line_interpolator(sx1, sx2, len); - m_scale_y = dda2_line_interpolator(sy1, sy2, len); - } - - - //---------------------------------------------------------------- - void resynchronize(double xe, double ye, unsigned len) - { - // Assume x1,y1 are equal to the ones at the previous end point - int sx1 = m_scale_x.y(); - int sy1 = m_scale_y.y(); - - // Calculate transformed coordinates at x2,y2 - double xt = xe; - double yt = ye; - m_trans_dir.transform(&xt, &yt); - - const double delta = 1/double(subpixel_scale); - double dx; - double dy; - - // Calculate scale by X at x2,y2 - dx = xt + delta; - dy = yt; - m_trans_inv.transform(&dx, &dy); - dx -= xe; - dy -= ye; - int sx2 = uround(subpixel_scale/sqrt(dx*dx + dy*dy)) >> subpixel_shift; - - // Calculate scale by Y at x2,y2 - dx = xt; - dy = yt + delta; - m_trans_inv.transform(&dx, &dy); - dx -= xe; - dy -= ye; - int sy2 = uround(subpixel_scale/sqrt(dx*dx + dy*dy)) >> subpixel_shift; - - // Initialize the interpolators - m_scale_x = dda2_line_interpolator(sx1, sx2, len); - m_scale_y = dda2_line_interpolator(sy1, sy2, len); - } - - - - //---------------------------------------------------------------- - void operator++() - { - ++m_iterator; - ++m_scale_x; - ++m_scale_y; - } - - //---------------------------------------------------------------- - void coordinates(int* x, int* y) const - { - *x = iround(m_iterator.x * subpixel_scale); - *y = iround(m_iterator.y * subpixel_scale); - } - - //---------------------------------------------------------------- - void local_scale(int* x, int* y) - { - *x = m_scale_x.y(); - *y = m_scale_y.y(); - } - - //---------------------------------------------------------------- - void transform(double* x, double* y) const - { - m_trans_dir.transform(x, y); - } - - private: - trans_type m_trans_dir; - trans_type m_trans_inv; - iterator_type m_iterator; - dda2_line_interpolator m_scale_x; - dda2_line_interpolator m_scale_y; - }; - - - - - - - - - - - - //============================================span_interpolator_persp_lerp - template - class span_interpolator_persp_lerp - { - public: - typedef trans_perspective trans_type; - enum subpixel_scale_e - { - subpixel_shift = SubpixelShift, - subpixel_scale = 1 << subpixel_shift - }; - - //-------------------------------------------------------------------- - span_interpolator_persp_lerp() {} - - //-------------------------------------------------------------------- - // Arbitrary quadrangle transformations - span_interpolator_persp_lerp(const double* src, const double* dst) - { - quad_to_quad(src, dst); - } - - //-------------------------------------------------------------------- - // Direct transformations - span_interpolator_persp_lerp(double x1, double y1, - double x2, double y2, - const double* quad) - { - rect_to_quad(x1, y1, x2, y2, quad); - } - - //-------------------------------------------------------------------- - // Reverse transformations - span_interpolator_persp_lerp(const double* quad, - double x1, double y1, - double x2, double y2) - { - quad_to_rect(quad, x1, y1, x2, y2); - } - - //-------------------------------------------------------------------- - // Set the transformations using two arbitrary quadrangles. - void quad_to_quad(const double* src, const double* dst) - { - m_trans_dir.quad_to_quad(src, dst); - m_trans_inv.quad_to_quad(dst, src); - } - - //-------------------------------------------------------------------- - // Set the direct transformations, i.e., rectangle -> quadrangle - void rect_to_quad(double x1, double y1, double x2, double y2, - const double* quad) - { - double src[8]; - src[0] = src[6] = x1; - src[2] = src[4] = x2; - src[1] = src[3] = y1; - src[5] = src[7] = y2; - quad_to_quad(src, quad); - } - - - //-------------------------------------------------------------------- - // Set the reverse transformations, i.e., quadrangle -> rectangle - void quad_to_rect(const double* quad, - double x1, double y1, double x2, double y2) - { - double dst[8]; - dst[0] = dst[6] = x1; - dst[2] = dst[4] = x2; - dst[1] = dst[3] = y1; - dst[5] = dst[7] = y2; - quad_to_quad(quad, dst); - } - - //-------------------------------------------------------------------- - // Check if the equations were solved successfully - bool is_valid() const { return m_trans_dir.is_valid(); } - - //---------------------------------------------------------------- - void begin(double x, double y, unsigned len) - { - // Calculate transformed coordinates at x1,y1 - double xt = x; - double yt = y; - m_trans_dir.transform(&xt, &yt); - int x1 = iround(xt * subpixel_scale); - int y1 = iround(yt * subpixel_scale); - - double dx; - double dy; - const double delta = 1/double(subpixel_scale); - - // Calculate scale by X at x1,y1 - dx = xt + delta; - dy = yt; - m_trans_inv.transform(&dx, &dy); - dx -= x; - dy -= y; - int sx1 = uround(subpixel_scale/sqrt(dx*dx + dy*dy)) >> subpixel_shift; - - // Calculate scale by Y at x1,y1 - dx = xt; - dy = yt + delta; - m_trans_inv.transform(&dx, &dy); - dx -= x; - dy -= y; - int sy1 = uround(subpixel_scale/sqrt(dx*dx + dy*dy)) >> subpixel_shift; - - // Calculate transformed coordinates at x2,y2 - x += len; - xt = x; - yt = y; - m_trans_dir.transform(&xt, &yt); - int x2 = iround(xt * subpixel_scale); - int y2 = iround(yt * subpixel_scale); - - // Calculate scale by X at x2,y2 - dx = xt + delta; - dy = yt; - m_trans_inv.transform(&dx, &dy); - dx -= x; - dy -= y; - int sx2 = uround(subpixel_scale/sqrt(dx*dx + dy*dy)) >> subpixel_shift; - - // Calculate scale by Y at x2,y2 - dx = xt; - dy = yt + delta; - m_trans_inv.transform(&dx, &dy); - dx -= x; - dy -= y; - int sy2 = uround(subpixel_scale/sqrt(dx*dx + dy*dy)) >> subpixel_shift; - - // Initialize the interpolators - m_coord_x = dda2_line_interpolator(x1, x2, len); - m_coord_y = dda2_line_interpolator(y1, y2, len); - m_scale_x = dda2_line_interpolator(sx1, sx2, len); - m_scale_y = dda2_line_interpolator(sy1, sy2, len); - } - - - //---------------------------------------------------------------- - void resynchronize(double xe, double ye, unsigned len) - { - // Assume x1,y1 are equal to the ones at the previous end point - int x1 = m_coord_x.y(); - int y1 = m_coord_y.y(); - int sx1 = m_scale_x.y(); - int sy1 = m_scale_y.y(); - - // Calculate transformed coordinates at x2,y2 - double xt = xe; - double yt = ye; - m_trans_dir.transform(&xt, &yt); - int x2 = iround(xt * subpixel_scale); - int y2 = iround(yt * subpixel_scale); - - const double delta = 1/double(subpixel_scale); - double dx; - double dy; - - // Calculate scale by X at x2,y2 - dx = xt + delta; - dy = yt; - m_trans_inv.transform(&dx, &dy); - dx -= xe; - dy -= ye; - int sx2 = uround(subpixel_scale/sqrt(dx*dx + dy*dy)) >> subpixel_shift; - - // Calculate scale by Y at x2,y2 - dx = xt; - dy = yt + delta; - m_trans_inv.transform(&dx, &dy); - dx -= xe; - dy -= ye; - int sy2 = uround(subpixel_scale/sqrt(dx*dx + dy*dy)) >> subpixel_shift; - - // Initialize the interpolators - m_coord_x = dda2_line_interpolator(x1, x2, len); - m_coord_y = dda2_line_interpolator(y1, y2, len); - m_scale_x = dda2_line_interpolator(sx1, sx2, len); - m_scale_y = dda2_line_interpolator(sy1, sy2, len); - } - - - //---------------------------------------------------------------- - void operator++() - { - ++m_coord_x; - ++m_coord_y; - ++m_scale_x; - ++m_scale_y; - } - - //---------------------------------------------------------------- - void coordinates(int* x, int* y) const - { - *x = m_coord_x.y(); - *y = m_coord_y.y(); - } - - //---------------------------------------------------------------- - void local_scale(int* x, int* y) - { - *x = m_scale_x.y(); - *y = m_scale_y.y(); - } - - //---------------------------------------------------------------- - void transform(double* x, double* y) const - { - m_trans_dir.transform(x, y); - } - - private: - trans_type m_trans_dir; - trans_type m_trans_inv; - dda2_line_interpolator m_coord_x; - dda2_line_interpolator m_coord_y; - dda2_line_interpolator m_scale_x; - dda2_line_interpolator m_scale_y; - }; - -} - -#endif diff --git a/uppdev/aggdraw/agg_span_interpolator_trans.h b/uppdev/aggdraw/agg_span_interpolator_trans.h deleted file mode 100644 index 0de1c19dc..000000000 --- a/uppdev/aggdraw/agg_span_interpolator_trans.h +++ /dev/null @@ -1,101 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// Horizontal span interpolator for use with an arbitrary transformer -// The efficiency highly depends on the operations done in the transformer -// -//---------------------------------------------------------------------------- - -#ifndef AGG_SPAN_INTERPOLATOR_TRANS_INCLUDED -#define AGG_SPAN_INTERPOLATOR_TRANS_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - //=================================================span_interpolator_trans - template - class span_interpolator_trans - { - public: - typedef Transformer trans_type; - enum subpixel_scale_e - { - subpixel_shift = SubpixelShift, - subpixel_scale = 1 << subpixel_shift - }; - - //-------------------------------------------------------------------- - span_interpolator_trans() {} - span_interpolator_trans(const trans_type& trans) : m_trans(&trans) {} - span_interpolator_trans(const trans_type& trans, - double x, double y, unsigned) : - m_trans(&trans) - { - begin(x, y, 0); - } - - //---------------------------------------------------------------- - const trans_type& transformer() const { return *m_trans; } - void transformer(const trans_type& trans) { m_trans = &trans; } - - //---------------------------------------------------------------- - void begin(double x, double y, unsigned) - { - m_x = x; - m_y = y; - m_trans->transform(&x, &y); - m_ix = iround(x * subpixel_scale); - m_iy = iround(y * subpixel_scale); - } - - //---------------------------------------------------------------- - void operator++() - { - m_x += 1.0; - double x = m_x; - double y = m_y; - m_trans->transform(&x, &y); - m_ix = iround(x * subpixel_scale); - m_iy = iround(y * subpixel_scale); - } - - //---------------------------------------------------------------- - void coordinates(int* x, int* y) const - { - *x = m_ix; - *y = m_iy; - } - - private: - const trans_type* m_trans; - double m_x; - double m_y; - int m_ix; - int m_iy; - }; - -} - -#endif diff --git a/uppdev/aggdraw/agg_span_pattern_gray.h b/uppdev/aggdraw/agg_span_pattern_gray.h deleted file mode 100644 index 72d2c2708..000000000 --- a/uppdev/aggdraw/agg_span_pattern_gray.h +++ /dev/null @@ -1,102 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// Adaptation for high precision colors has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- - - -#ifndef AGG_SPAN_PATTERN_GRAY_INCLUDED -#define AGG_SPAN_PATTERN_GRAY_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - - //=======================================================span_pattern_gray - template class span_pattern_gray - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - - //-------------------------------------------------------------------- - span_pattern_gray() {} - span_pattern_gray(source_type& src, - unsigned offset_x, unsigned offset_y) : - m_src(&src), - m_offset_x(offset_x), - m_offset_y(offset_y), - m_alpha(color_type::base_mask) - {} - - //-------------------------------------------------------------------- - void attach(source_type& v) { m_src = &v; } - source_type& source() { return *m_src; } - const source_type& source() const { return *m_src; } - - //-------------------------------------------------------------------- - void offset_x(unsigned v) { m_offset_x = v; } - void offset_y(unsigned v) { m_offset_y = v; } - unsigned offset_x() const { return m_offset_x; } - unsigned offset_y() const { return m_offset_y; } - void alpha(value_type v) { m_alpha = v; } - value_type alpha() const { return m_alpha; } - - //-------------------------------------------------------------------- - void prepare() {} - void generate(color_type* span, int x, int y, unsigned len) - { - x += m_offset_x; - y += m_offset_y; - const value_type* p = (const value_type*)m_src->span(x, y, len); - do - { - span->v = *p; - span->a = m_alpha; - p = m_src->next_x(); - ++span; - } - while(--len); - } - - private: - source_type* m_src; - unsigned m_offset_x; - unsigned m_offset_y; - value_type m_alpha; - - }; - -} - -#endif - diff --git a/uppdev/aggdraw/agg_span_pattern_rgb.h b/uppdev/aggdraw/agg_span_pattern_rgb.h deleted file mode 100644 index a2e272f0b..000000000 --- a/uppdev/aggdraw/agg_span_pattern_rgb.h +++ /dev/null @@ -1,105 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// Adaptation for high precision colors has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- - - -#ifndef AGG_SPAN_PATTERN_RGB_INCLUDED -#define AGG_SPAN_PATTERN_RGB_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - - //========================================================span_pattern_rgb - template class span_pattern_rgb - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - - //-------------------------------------------------------------------- - span_pattern_rgb() {} - span_pattern_rgb(source_type& src, - unsigned offset_x, unsigned offset_y) : - m_src(&src), - m_offset_x(offset_x), - m_offset_y(offset_y), - m_alpha(color_type::base_mask) - {} - - //-------------------------------------------------------------------- - void attach(source_type& v) { m_src = &v; } - source_type& source() { return *m_src; } - const source_type& source() const { return *m_src; } - - //-------------------------------------------------------------------- - void offset_x(unsigned v) { m_offset_x = v; } - void offset_y(unsigned v) { m_offset_y = v; } - unsigned offset_x() const { return m_offset_x; } - unsigned offset_y() const { return m_offset_y; } - void alpha(value_type v) { m_alpha = v; } - value_type alpha() const { return m_alpha; } - - //-------------------------------------------------------------------- - void prepare() {} - void generate(color_type* span, int x, int y, unsigned len) - { - x += m_offset_x; - y += m_offset_y; - const value_type* p = (const value_type*)m_src->span(x, y, len); - do - { - span->r = p[order_type::R]; - span->g = p[order_type::G]; - span->b = p[order_type::B]; - span->a = m_alpha; - p = m_src->next_x(); - ++span; - } - while(--len); - } - - private: - source_type* m_src; - unsigned m_offset_x; - unsigned m_offset_y; - value_type m_alpha; - - }; - -} - -#endif - diff --git a/uppdev/aggdraw/agg_span_pattern_rgba.h b/uppdev/aggdraw/agg_span_pattern_rgba.h deleted file mode 100644 index 248ae265c..000000000 --- a/uppdev/aggdraw/agg_span_pattern_rgba.h +++ /dev/null @@ -1,103 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// Adaptation for high precision colors has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- - - -#ifndef AGG_SPAN_PATTERN_RGBA_INCLUDED -#define AGG_SPAN_PATTERN_RGBA_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - - //======================================================span_pattern_rgba - template class span_pattern_rgba - { - public: - typedef Source source_type; - typedef typename source_type::color_type color_type; - typedef typename source_type::order_type order_type; - typedef typename color_type::value_type value_type; - typedef typename color_type::calc_type calc_type; - - //-------------------------------------------------------------------- - span_pattern_rgba() {} - span_pattern_rgba(source_type& src, - unsigned offset_x, unsigned offset_y) : - m_src(&src), - m_offset_x(offset_x), - m_offset_y(offset_y) - {} - - //-------------------------------------------------------------------- - void attach(source_type& v) { m_src = &v; } - source_type& source() { return *m_src; } - const source_type& source() const { return *m_src; } - - //-------------------------------------------------------------------- - void offset_x(unsigned v) { m_offset_x = v; } - void offset_y(unsigned v) { m_offset_y = v; } - unsigned offset_x() const { return m_offset_x; } - unsigned offset_y() const { return m_offset_y; } - void alpha(value_type) {} - value_type alpha() const { return 0; } - - //-------------------------------------------------------------------- - void prepare() {} - void generate(color_type* span, int x, int y, unsigned len) - { - x += m_offset_x; - y += m_offset_y; - const value_type* p = (const value_type*)m_src->span(x, y, len); - do - { - span->r = p[order_type::R]; - span->g = p[order_type::G]; - span->b = p[order_type::B]; - span->a = p[order_type::A]; - p = (const value_type*)m_src->next_x(); - ++span; - } - while(--len); - } - - private: - source_type* m_src; - unsigned m_offset_x; - unsigned m_offset_y; - - }; - -} - -#endif - diff --git a/uppdev/aggdraw/agg_span_solid.h b/uppdev/aggdraw/agg_span_solid.h deleted file mode 100644 index f82f5dc2c..000000000 --- a/uppdev/aggdraw/agg_span_solid.h +++ /dev/null @@ -1,58 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_SPAN_SOLID_INCLUDED -#define AGG_SPAN_SOLID_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - //--------------------------------------------------------------span_solid - template class span_solid - { - public: - typedef ColorT color_type; - - //-------------------------------------------------------------------- - void color(const color_type& c) { m_color = c; } - const color_type& color() const { return m_color; } - - //-------------------------------------------------------------------- - void prepare() {} - - //-------------------------------------------------------------------- - void generate(color_type* span, int x, int y, unsigned len) - { - do { *span++ = m_color; } while(--len); - } - - private: - color_type m_color; - }; - - -} - -#endif diff --git a/uppdev/aggdraw/agg_span_subdiv_adaptor.h b/uppdev/aggdraw/agg_span_subdiv_adaptor.h deleted file mode 100644 index 5edab67b6..000000000 --- a/uppdev/aggdraw/agg_span_subdiv_adaptor.h +++ /dev/null @@ -1,151 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_SPAN_SUBDIV_ADAPTOR_INCLUDED -#define AGG_SPAN_SUBDIV_ADAPTOR_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - - //=================================================span_subdiv_adaptor - template - class span_subdiv_adaptor - { - public: - typedef Interpolator interpolator_type; - typedef typename interpolator_type::trans_type trans_type; - - enum sublixel_scale_e - { - subpixel_shift = SubpixelShift, - subpixel_scale = 1 << subpixel_shift - }; - - - //---------------------------------------------------------------- - span_subdiv_adaptor() : - m_subdiv_shift(4), - m_subdiv_size(1 << m_subdiv_shift), - m_subdiv_mask(m_subdiv_size - 1) {} - - span_subdiv_adaptor(interpolator_type& interpolator, - unsigned subdiv_shift = 4) : - m_subdiv_shift(subdiv_shift), - m_subdiv_size(1 << m_subdiv_shift), - m_subdiv_mask(m_subdiv_size - 1), - m_interpolator(&interpolator) {} - - span_subdiv_adaptor(interpolator_type& interpolator, - double x, double y, unsigned len, - unsigned subdiv_shift = 4) : - m_subdiv_shift(subdiv_shift), - m_subdiv_size(1 << m_subdiv_shift), - m_subdiv_mask(m_subdiv_size - 1), - m_interpolator(&interpolator) - { - begin(x, y, len); - } - - - //---------------------------------------------------------------- - const interpolator_type& interpolator() const { return *m_interpolator; } - void interpolator(interpolator_type& intr) { m_interpolator = &intr; } - - //---------------------------------------------------------------- - const trans_type& transformer() const - { - return *m_interpolator->transformer(); - } - void transformer(const trans_type& trans) - { - m_interpolator->transformer(trans); - } - - //---------------------------------------------------------------- - unsigned subdiv_shift() const { return m_subdiv_shift; } - void subdiv_shift(unsigned shift) - { - m_subdiv_shift = shift; - m_subdiv_size = 1 << m_subdiv_shift; - m_subdiv_mask = m_subdiv_size - 1; - } - - //---------------------------------------------------------------- - void begin(double x, double y, unsigned len) - { - m_pos = 1; - m_src_x = iround(x * subpixel_scale) + subpixel_scale; - m_src_y = y; - m_len = len; - if(len > m_subdiv_size) len = m_subdiv_size; - m_interpolator->begin(x, y, len); - } - - //---------------------------------------------------------------- - void operator++() - { - ++(*m_interpolator); - if(m_pos >= m_subdiv_size) - { - unsigned len = m_len; - if(len > m_subdiv_size) len = m_subdiv_size; - m_interpolator->resynchronize(double(m_src_x) / double(subpixel_scale) + len, - m_src_y, - len); - m_pos = 0; - } - m_src_x += subpixel_scale; - ++m_pos; - --m_len; - } - - //---------------------------------------------------------------- - void coordinates(int* x, int* y) const - { - m_interpolator->coordinates(x, y); - } - - //---------------------------------------------------------------- - void local_scale(int* x, int* y) const - { - m_interpolator->local_scale(x, y); - } - - - private: - unsigned m_subdiv_shift; - unsigned m_subdiv_size; - unsigned m_subdiv_mask; - interpolator_type* m_interpolator; - int m_src_x; - double m_src_y; - unsigned m_pos; - unsigned m_len; - }; - -} - -#endif diff --git a/uppdev/aggdraw/agg_sqrt_tables.cpp b/uppdev/aggdraw/agg_sqrt_tables.cpp deleted file mode 100644 index 52c311c5f..000000000 --- a/uppdev/aggdraw/agg_sqrt_tables.cpp +++ /dev/null @@ -1,120 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#include "agg_basics.h" - -namespace agg -{ - int16u g_sqrt_table[1024] = //----------g_sqrt_table - { - 0, - 2048,2896,3547,4096,4579,5017,5418,5793,6144,6476,6792,7094,7384,7663,7932,8192,8444, - 8689,8927,9159,9385,9606,9822,10033,10240,10443,10642,10837,11029,11217,11403,11585, - 11765,11942,12116,12288,12457,12625,12790,12953,13114,13273,13430,13585,13738,13890, - 14040,14189,14336,14482,14626,14768,14910,15050,15188,15326,15462,15597,15731,15864, - 15995,16126,16255,16384,16512,16638,16764,16888,17012,17135,17257,17378,17498,17618, - 17736,17854,17971,18087,18203,18318,18432,18545,18658,18770,18882,18992,19102,19212, - 19321,19429,19537,19644,19750,19856,19961,20066,20170,20274,20377,20480,20582,20684, - 20785,20886,20986,21085,21185,21283,21382,21480,21577,21674,21771,21867,21962,22058, - 22153,22247,22341,22435,22528,22621,22713,22806,22897,22989,23080,23170,23261,23351, - 23440,23530,23619,23707,23796,23884,23971,24059,24146,24232,24319,24405,24491,24576, - 24661,24746,24831,24915,24999,25083,25166,25249,25332,25415,25497,25580,25661,25743, - 25824,25905,25986,26067,26147,26227,26307,26387,26466,26545,26624,26703,26781,26859, - 26937,27015,27092,27170,27247,27324,27400,27477,27553,27629,27705,27780,27856,27931, - 28006,28081,28155,28230,28304,28378,28452,28525,28599,28672,28745,28818,28891,28963, - 29035,29108,29180,29251,29323,29394,29466,29537,29608,29678,29749,29819,29890,29960, - 30030,30099,30169,30238,30308,30377,30446,30515,30583,30652,30720,30788,30856,30924, - 30992,31059,31127,31194,31261,31328,31395,31462,31529,31595,31661,31727,31794,31859, - 31925,31991,32056,32122,32187,32252,32317,32382,32446,32511,32575,32640,32704,32768, - 32832,32896,32959,33023,33086,33150,33213,33276,33339,33402,33465,33527,33590,33652, - 33714,33776,33839,33900,33962,34024,34086,34147,34208,34270,34331,34392,34453,34514, - 34574,34635,34695,34756,34816,34876,34936,34996,35056,35116,35176,35235,35295,35354, - 35413,35472,35531,35590,35649,35708,35767,35825,35884,35942,36001,36059,36117,36175, - 36233,36291,36348,36406,36464,36521,36578,36636,36693,36750,36807,36864,36921,36978, - 37034,37091,37147,37204,37260,37316,37372,37429,37485,37540,37596,37652,37708,37763, - 37819,37874,37929,37985,38040,38095,38150,38205,38260,38315,38369,38424,38478,38533, - 38587,38642,38696,38750,38804,38858,38912,38966,39020,39073,39127,39181,39234,39287, - 39341,39394,39447,39500,39553,39606,39659,39712,39765,39818,39870,39923,39975,40028, - 40080,40132,40185,40237,40289,40341,40393,40445,40497,40548,40600,40652,40703,40755, - 40806,40857,40909,40960,41011,41062,41113,41164,41215,41266,41317,41368,41418,41469, - 41519,41570,41620,41671,41721,41771,41821,41871,41922,41972,42021,42071,42121,42171, - 42221,42270,42320,42369,42419,42468,42518,42567,42616,42665,42714,42763,42813,42861, - 42910,42959,43008,43057,43105,43154,43203,43251,43300,43348,43396,43445,43493,43541, - 43589,43637,43685,43733,43781,43829,43877,43925,43972,44020,44068,44115,44163,44210, - 44258,44305,44352,44400,44447,44494,44541,44588,44635,44682,44729,44776,44823,44869, - 44916,44963,45009,45056,45103,45149,45195,45242,45288,45334,45381,45427,45473,45519, - 45565,45611,45657,45703,45749,45795,45840,45886,45932,45977,46023,46069,46114,46160, - 46205,46250,46296,46341,46386,46431,46477,46522,46567,46612,46657,46702,46746,46791, - 46836,46881,46926,46970,47015,47059,47104,47149,47193,47237,47282,47326,47370,47415, - 47459,47503,47547,47591,47635,47679,47723,47767,47811,47855,47899,47942,47986,48030, - 48074,48117,48161,48204,48248,48291,48335,48378,48421,48465,48508,48551,48594,48637, - 48680,48723,48766,48809,48852,48895,48938,48981,49024,49067,49109,49152,49195,49237, - 49280,49322,49365,49407,49450,49492,49535,49577,49619,49661,49704,49746,49788,49830, - 49872,49914,49956,49998,50040,50082,50124,50166,50207,50249,50291,50332,50374,50416, - 50457,50499,50540,50582,50623,50665,50706,50747,50789,50830,50871,50912,50954,50995, - 51036,51077,51118,51159,51200,51241,51282,51323,51364,51404,51445,51486,51527,51567, - 51608,51649,51689,51730,51770,51811,51851,51892,51932,51972,52013,52053,52093,52134, - 52174,52214,52254,52294,52334,52374,52414,52454,52494,52534,52574,52614,52654,52694, - 52734,52773,52813,52853,52892,52932,52972,53011,53051,53090,53130,53169,53209,53248, - 53287,53327,53366,53405,53445,53484,53523,53562,53601,53640,53679,53719,53758,53797, - 53836,53874,53913,53952,53991,54030,54069,54108,54146,54185,54224,54262,54301,54340, - 54378,54417,54455,54494,54532,54571,54609,54647,54686,54724,54762,54801,54839,54877, - 54915,54954,54992,55030,55068,55106,55144,55182,55220,55258,55296,55334,55372,55410, - 55447,55485,55523,55561,55599,55636,55674,55712,55749,55787,55824,55862,55900,55937, - 55975,56012,56049,56087,56124,56162,56199,56236,56273,56311,56348,56385,56422,56459, - 56497,56534,56571,56608,56645,56682,56719,56756,56793,56830,56867,56903,56940,56977, - 57014,57051,57087,57124,57161,57198,57234,57271,57307,57344,57381,57417,57454,57490, - 57527,57563,57599,57636,57672,57709,57745,57781,57817,57854,57890,57926,57962,57999, - 58035,58071,58107,58143,58179,58215,58251,58287,58323,58359,58395,58431,58467,58503, - 58538,58574,58610,58646,58682,58717,58753,58789,58824,58860,58896,58931,58967,59002, - 59038,59073,59109,59144,59180,59215,59251,59286,59321,59357,59392,59427,59463,59498, - 59533,59568,59603,59639,59674,59709,59744,59779,59814,59849,59884,59919,59954,59989, - 60024,60059,60094,60129,60164,60199,60233,60268,60303,60338,60373,60407,60442,60477, - 60511,60546,60581,60615,60650,60684,60719,60753,60788,60822,60857,60891,60926,60960, - 60995,61029,61063,61098,61132,61166,61201,61235,61269,61303,61338,61372,61406,61440, - 61474,61508,61542,61576,61610,61644,61678,61712,61746,61780,61814,61848,61882,61916, - 61950,61984,62018,62051,62085,62119,62153,62186,62220,62254,62287,62321,62355,62388, - 62422,62456,62489,62523,62556,62590,62623,62657,62690,62724,62757,62790,62824,62857, - 62891,62924,62957,62991,63024,63057,63090,63124,63157,63190,63223,63256,63289,63323, - 63356,63389,63422,63455,63488,63521,63554,63587,63620,63653,63686,63719,63752,63785, - 63817,63850,63883,63916,63949,63982,64014,64047,64080,64113,64145,64178,64211,64243, - 64276,64309,64341,64374,64406,64439,64471,64504,64536,64569,64601,64634,64666,64699, - 64731,64763,64796,64828,64861,64893,64925,64957,64990,65022,65054,65086,65119,65151, - 65183,65215,65247,65279,65312,65344,65376,65408,65440,65472,65504 - }; - - - int8 g_elder_bit_table[256] = //---------g_elder_bit_table - { - 0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 - }; - -} diff --git a/uppdev/aggdraw/agg_trans_affine.cpp b/uppdev/aggdraw/agg_trans_affine.cpp deleted file mode 100644 index 489c056cc..000000000 --- a/uppdev/aggdraw/agg_trans_affine.cpp +++ /dev/null @@ -1,200 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#include "agg_trans_affine.h" - - - -namespace agg -{ - - //------------------------------------------------------------------------ - const trans_affine& trans_affine::parl_to_parl(const double* src, - const double* dst) - { - sx = src[2] - src[0]; - shy = src[3] - src[1]; - shx = src[4] - src[0]; - sy = src[5] - src[1]; - tx = src[0]; - ty = src[1]; - invert(); - multiply(trans_affine(dst[2] - dst[0], dst[3] - dst[1], - dst[4] - dst[0], dst[5] - dst[1], - dst[0], dst[1])); - return *this; - } - - //------------------------------------------------------------------------ - const trans_affine& trans_affine::rect_to_parl(double x1, double y1, - double x2, double y2, - const double* parl) - { - double src[6]; - src[0] = x1; src[1] = y1; - src[2] = x2; src[3] = y1; - src[4] = x2; src[5] = y2; - parl_to_parl(src, parl); - return *this; - } - - //------------------------------------------------------------------------ - const trans_affine& trans_affine::parl_to_rect(const double* parl, - double x1, double y1, - double x2, double y2) - { - double dst[6]; - dst[0] = x1; dst[1] = y1; - dst[2] = x2; dst[3] = y1; - dst[4] = x2; dst[5] = y2; - parl_to_parl(parl, dst); - return *this; - } - - //------------------------------------------------------------------------ - const trans_affine& trans_affine::multiply(const trans_affine& m) - { - double t0 = sx * m.sx + shy * m.shx; - double t2 = shx * m.sx + sy * m.shx; - double t4 = tx * m.sx + ty * m.shx + m.tx; - shy = sx * m.shy + shy * m.sy; - sy = shx * m.shy + sy * m.sy; - ty = tx * m.shy + ty * m.sy + m.ty; - sx = t0; - shx = t2; - tx = t4; - return *this; - } - - - //------------------------------------------------------------------------ - const trans_affine& trans_affine::invert() - { - double d = determinant_reciprocal(); - - double t0 = sy * d; - sy = sx * d; - shy = -shy * d; - shx = -shx * d; - - double t4 = -tx * t0 - ty * shx; - ty = -tx * shy - ty * sy; - - sx = t0; - tx = t4; - return *this; - } - - - //------------------------------------------------------------------------ - const trans_affine& trans_affine::flip_x() - { - sx = -sx; - shy = -shy; - tx = -tx; - return *this; - } - - //------------------------------------------------------------------------ - const trans_affine& trans_affine::flip_y() - { - shx = -shx; - sy = -sy; - ty = -ty; - return *this; - } - - //------------------------------------------------------------------------ - const trans_affine& trans_affine::reset() - { - sx = sy = 1.0; - shy = shx = tx = ty = 0.0; - return *this; - } - - //------------------------------------------------------------------------ - bool trans_affine::is_identity(double epsilon) const - { - return is_equal_eps(sx, 1.0, epsilon) && - is_equal_eps(shy, 0.0, epsilon) && - is_equal_eps(shx, 0.0, epsilon) && - is_equal_eps(sy, 1.0, epsilon) && - is_equal_eps(tx, 0.0, epsilon) && - is_equal_eps(ty, 0.0, epsilon); - } - - //------------------------------------------------------------------------ - bool trans_affine::is_valid(double epsilon) const - { - return fabs(sx) > epsilon && fabs(sy) > epsilon; - } - - //------------------------------------------------------------------------ - bool trans_affine::is_equal(const trans_affine& m, double epsilon) const - { - return is_equal_eps(sx, m.sx, epsilon) && - is_equal_eps(shy, m.shy, epsilon) && - is_equal_eps(shx, m.shx, epsilon) && - is_equal_eps(sy, m.sy, epsilon) && - is_equal_eps(tx, m.tx, epsilon) && - is_equal_eps(ty, m.ty, epsilon); - } - - //------------------------------------------------------------------------ - double trans_affine::rotation() const - { - double x1 = 0.0; - double y1 = 0.0; - double x2 = 1.0; - double y2 = 0.0; - transform(&x1, &y1); - transform(&x2, &y2); - return atan2(y2-y1, x2-x1); - } - - //------------------------------------------------------------------------ - void trans_affine::translation(double* dx, double* dy) const - { - *dx = tx; - *dy = ty; - } - - //------------------------------------------------------------------------ - void trans_affine::scaling(double* x, double* y) const - { - double x1 = 0.0; - double y1 = 0.0; - double x2 = 1.0; - double y2 = 1.0; - trans_affine t(*this); - t *= trans_affine_rotation(-rotation()); - t.transform(&x1, &y1); - t.transform(&x2, &y2); - *x = x2 - x1; - *y = y2 - y1; - } - - -} - diff --git a/uppdev/aggdraw/agg_trans_affine.h b/uppdev/aggdraw/agg_trans_affine.h deleted file mode 100644 index a9d2bd0a3..000000000 --- a/uppdev/aggdraw/agg_trans_affine.h +++ /dev/null @@ -1,524 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_TRANS_AFFINE_INCLUDED -#define AGG_TRANS_AFFINE_INCLUDED - -#include -#include "agg_basics.h" - -namespace agg -{ - const double affine_epsilon = 1e-14; - - //============================================================trans_affine - // - // See Implementation agg_trans_affine.cpp - // - // Affine transformation are linear transformations in Cartesian coordinates - // (strictly speaking not only in Cartesian, but for the beginning we will - // think so). They are rotation, scaling, translation and skewing. - // After any affine transformation a line segment remains a line segment - // and it will never become a curve. - // - // There will be no math about matrix calculations, since it has been - // described many times. Ask yourself a very simple question: - // "why do we need to understand and use some matrix stuff instead of just - // rotating, scaling and so on". The answers are: - // - // 1. Any combination of transformations can be done by only 4 multiplications - // and 4 additions in floating point. - // 2. One matrix transformation is equivalent to the number of consecutive - // discrete transformations, i.e. the matrix "accumulates" all transformations - // in the order of their settings. Suppose we have 4 transformations: - // * rotate by 30 degrees, - // * scale X to 2.0, - // * scale Y to 1.5, - // * move to (100, 100). - // The result will depend on the order of these transformations, - // and the advantage of matrix is that the sequence of discret calls: - // rotate(30), scaleX(2.0), scaleY(1.5), move(100,100) - // will have exactly the same result as the following matrix transformations: - // - // affine_matrix m; - // m *= rotate_matrix(30); - // m *= scaleX_matrix(2.0); - // m *= scaleY_matrix(1.5); - // m *= move_matrix(100,100); - // - // m.transform_my_point_at_last(x, y); - // - // What is the good of it? In real life we will set-up the matrix only once - // and then transform many points, let alone the convenience to set any - // combination of transformations. - // - // So, how to use it? Very easy - literally as it's shown above. Not quite, - // let us write a correct example: - // - // agg::trans_affine m; - // m *= agg::trans_affine_rotation(30.0 * 3.1415926 / 180.0); - // m *= agg::trans_affine_scaling(2.0, 1.5); - // m *= agg::trans_affine_translation(100.0, 100.0); - // m.transform(&x, &y); - // - // The affine matrix is all you need to perform any linear transformation, - // but all transformations have origin point (0,0). It means that we need to - // use 2 translations if we want to rotate someting around (100,100): - // - // m *= agg::trans_affine_translation(-100.0, -100.0); // move to (0,0) - // m *= agg::trans_affine_rotation(30.0 * 3.1415926 / 180.0); // rotate - // m *= agg::trans_affine_translation(100.0, 100.0); // move back to (100,100) - //---------------------------------------------------------------------- - struct trans_affine - { - double sx, shy, shx, sy, tx, ty; - - //------------------------------------------ Construction - // Identity matrix - trans_affine() : - sx(1.0), shy(0.0), shx(0.0), sy(1.0), tx(0.0), ty(0.0) - {} - - // Custom matrix. Usually used in derived classes - trans_affine(double v0, double v1, double v2, - double v3, double v4, double v5) : - sx(v0), shy(v1), shx(v2), sy(v3), tx(v4), ty(v5) - {} - - // Custom matrix from m[6] - explicit trans_affine(const double* m) : - sx(m[0]), shy(m[1]), shx(m[2]), sy(m[3]), tx(m[4]), ty(m[5]) - {} - - // Rectangle to a parallelogram. - trans_affine(double x1, double y1, double x2, double y2, - const double* parl) - { - rect_to_parl(x1, y1, x2, y2, parl); - } - - // Parallelogram to a rectangle. - trans_affine(const double* parl, - double x1, double y1, double x2, double y2) - { - parl_to_rect(parl, x1, y1, x2, y2); - } - - // Arbitrary parallelogram transformation. - trans_affine(const double* src, const double* dst) - { - parl_to_parl(src, dst); - } - - //---------------------------------- Parellelogram transformations - // transform a parallelogram to another one. Src and dst are - // pointers to arrays of three points (double[6], x1,y1,...) that - // identify three corners of the parallelograms assuming implicit - // fourth point. The arguments are arrays of double[6] mapped - // to x1,y1, x2,y2, x3,y3 where the coordinates are: - // *-----------------* - // / (x3,y3)/ - // / / - // /(x1,y1) (x2,y2)/ - // *-----------------* - const trans_affine& parl_to_parl(const double* src, - const double* dst); - - const trans_affine& rect_to_parl(double x1, double y1, - double x2, double y2, - const double* parl); - - const trans_affine& parl_to_rect(const double* parl, - double x1, double y1, - double x2, double y2); - - - //------------------------------------------ Operations - // Reset - load an identity matrix - const trans_affine& reset(); - - // Direct transformations operations - const trans_affine& translate(double x, double y); - const trans_affine& rotate(double a); - const trans_affine& scale(double s); - const trans_affine& scale(double x, double y); - - // Multiply matrix to another one - const trans_affine& multiply(const trans_affine& m); - - // Multiply "m" to "this" and assign the result to "this" - const trans_affine& premultiply(const trans_affine& m); - - // Multiply matrix to inverse of another one - const trans_affine& multiply_inv(const trans_affine& m); - - // Multiply inverse of "m" to "this" and assign the result to "this" - const trans_affine& premultiply_inv(const trans_affine& m); - - // Invert matrix. Do not try to invert degenerate matrices, - // there's no check for validity. If you set scale to 0 and - // then try to invert matrix, expect unpredictable result. - const trans_affine& invert(); - - // Mirroring around X - const trans_affine& flip_x(); - - // Mirroring around Y - const trans_affine& flip_y(); - - //------------------------------------------- Load/Store - // Store matrix to an array [6] of double - void store_to(double* m) const - { - *m++ = sx; *m++ = shy; *m++ = shx; *m++ = sy; *m++ = tx; *m++ = ty; - } - - // Load matrix from an array [6] of double - const trans_affine& load_from(const double* m) - { - sx = *m++; shy = *m++; shx = *m++; sy = *m++; tx = *m++; ty = *m++; - return *this; - } - - //------------------------------------------- Operators - - // Multiply the matrix by another one - const trans_affine& operator *= (const trans_affine& m) - { - return multiply(m); - } - - // Multiply the matrix by inverse of another one - const trans_affine& operator /= (const trans_affine& m) - { - return multiply_inv(m); - } - - // Multiply the matrix by another one and return - // the result in a separete matrix. - trans_affine operator * (const trans_affine& m) - { - return trans_affine(*this).multiply(m); - } - - // Multiply the matrix by inverse of another one - // and return the result in a separete matrix. - trans_affine operator / (const trans_affine& m) - { - return trans_affine(*this).multiply_inv(m); - } - - // Calculate and return the inverse matrix - trans_affine operator ~ () const - { - trans_affine ret = *this; - return ret.invert(); - } - - // Equal operator with default epsilon - bool operator == (const trans_affine& m) const - { - return is_equal(m, affine_epsilon); - } - - // Not Equal operator with default epsilon - bool operator != (const trans_affine& m) const - { - return !is_equal(m, affine_epsilon); - } - - //-------------------------------------------- Transformations - // Direct transformation of x and y - void transform(double* x, double* y) const; - - // Direct transformation of x and y, 2x2 matrix only, no translation - void transform_2x2(double* x, double* y) const; - - // Inverse transformation of x and y. It works slower than the - // direct transformation. For massive operations it's better to - // invert() the matrix and then use direct transformations. - void inverse_transform(double* x, double* y) const; - - //-------------------------------------------- Auxiliary - // Calculate the determinant of matrix - double determinant() const - { - return sx * sy - shy * shx; - } - - // Calculate the reciprocal of the determinant - double determinant_reciprocal() const - { - return 1.0 / (sx * sy - shy * shx); - } - - // Get the average scale (by X and Y). - // Basically used to calculate the approximation_scale when - // decomposinting curves into line segments. - double scale() const; - - // Check to see if the matrix is not degenerate - bool is_valid(double epsilon = affine_epsilon) const; - - // Check to see if it's an identity matrix - bool is_identity(double epsilon = affine_epsilon) const; - - // Check to see if two matrices are equal - bool is_equal(const trans_affine& m, double epsilon = affine_epsilon) const; - - // Determine the major parameters. Use with caution considering - // possible degenerate cases. - double rotation() const; - void translation(double* dx, double* dy) const; - void scaling(double* x, double* y) const; - void scaling_abs(double* x, double* y) const; - }; - - //------------------------------------------------------------------------ - inline void trans_affine::transform(double* x, double* y) const - { - register double tmp = *x; - *x = tmp * sx + *y * shx + tx; - *y = tmp * shy + *y * sy + ty; - } - - //------------------------------------------------------------------------ - inline void trans_affine::transform_2x2(double* x, double* y) const - { - register double tmp = *x; - *x = tmp * sx + *y * shx; - *y = tmp * shy + *y * sy; - } - - //------------------------------------------------------------------------ - inline void trans_affine::inverse_transform(double* x, double* y) const - { - register double d = determinant_reciprocal(); - register double a = (*x - tx) * d; - register double b = (*y - ty) * d; - *x = a * sy - b * shx; - *y = b * sx - a * shy; - } - - //------------------------------------------------------------------------ - inline double trans_affine::scale() const - { - double x = 0.707106781 * sx + 0.707106781 * shx; - double y = 0.707106781 * shy + 0.707106781 * sy; - return sqrt(x*x + y*y); - } - - //------------------------------------------------------------------------ - inline const trans_affine& trans_affine::translate(double x, double y) - { - tx += x; - ty += y; - return *this; - } - - //------------------------------------------------------------------------ - inline const trans_affine& trans_affine::rotate(double a) - { - double ca = cos(a); - double sa = sin(a); - double t0 = sx * ca - shy * sa; - double t2 = shx * ca - sy * sa; - double t4 = tx * ca - ty * sa; - shy = sx * sa + shy * ca; - sy = shx * sa + sy * ca; - ty = tx * sa + ty * ca; - sx = t0; - shx = t2; - tx = t4; - return *this; - } - - //------------------------------------------------------------------------ - inline const trans_affine& trans_affine::scale(double x, double y) - { - double mm0 = x; // Possible hint for the optimizer - double mm3 = y; - sx *= mm0; - shx *= mm0; - tx *= mm0; - shy *= mm3; - sy *= mm3; - ty *= mm3; - return *this; - } - - //------------------------------------------------------------------------ - inline const trans_affine& trans_affine::scale(double s) - { - double m = s; // Possible hint for the optimizer - sx *= m; - shx *= m; - tx *= m; - shy *= m; - sy *= m; - ty *= m; - return *this; - } - - //------------------------------------------------------------------------ - inline const trans_affine& trans_affine::premultiply(const trans_affine& m) - { - trans_affine t = m; - return *this = t.multiply(*this); - } - - //------------------------------------------------------------------------ - inline const trans_affine& trans_affine::multiply_inv(const trans_affine& m) - { - trans_affine t = m; - t.invert(); - return multiply(t); - } - - //------------------------------------------------------------------------ - inline const trans_affine& trans_affine::premultiply_inv(const trans_affine& m) - { - trans_affine t = m; - t.invert(); - return *this = t.multiply(*this); - } - - //------------------------------------------------------------------------ - inline void trans_affine::scaling_abs(double* x, double* y) const - { - // Used to calculate scaling coefficients in image resampling. - // When there is considerable shear this method gives us much - // better estimation than just sx, sy. - *x = sqrt(sx * sx + shx * shx); - *y = sqrt(shy * shy + sy * sy); - } - - //====================================================trans_affine_rotation - // Rotation matrix. sin() and cos() are calculated twice for the same angle. - // There's no harm because the performance of sin()/cos() is very good on all - // modern processors. Besides, this operation is not going to be invoked too - // often. - class trans_affine_rotation : public trans_affine - { - public: - trans_affine_rotation(double a) : - trans_affine(cos(a), sin(a), -sin(a), cos(a), 0.0, 0.0) - {} - }; - - //====================================================trans_affine_scaling - // Scaling matrix. x, y - scale coefficients by X and Y respectively - class trans_affine_scaling : public trans_affine - { - public: - trans_affine_scaling(double x, double y) : - trans_affine(x, 0.0, 0.0, y, 0.0, 0.0) - {} - - trans_affine_scaling(double s) : - trans_affine(s, 0.0, 0.0, s, 0.0, 0.0) - {} - }; - - //================================================trans_affine_translation - // Translation matrix - class trans_affine_translation : public trans_affine - { - public: - trans_affine_translation(double x, double y) : - trans_affine(1.0, 0.0, 0.0, 1.0, x, y) - {} - }; - - //====================================================trans_affine_skewing - // Sckewing (shear) matrix - class trans_affine_skewing : public trans_affine - { - public: - trans_affine_skewing(double x, double y) : - trans_affine(1.0, tan(y), tan(x), 1.0, 0.0, 0.0) - {} - }; - - - //===============================================trans_affine_line_segment - // Rotate, Scale and Translate, associating 0...dist with line segment - // x1,y1,x2,y2 - class trans_affine_line_segment : public trans_affine - { - public: - trans_affine_line_segment(double x1, double y1, double x2, double y2, - double dist) - { - double dx = x2 - x1; - double dy = y2 - y1; - if(dist > 0.0) - { - multiply(trans_affine_scaling(sqrt(dx * dx + dy * dy) / dist)); - } - multiply(trans_affine_rotation(atan2(dy, dx))); - multiply(trans_affine_translation(x1, y1)); - } - }; - - - //============================================trans_affine_reflection_unit - // Reflection matrix. Reflect coordinates across the line through - // the origin containing the unit vector (ux, uy). - // Contributed by John Horigan - class trans_affine_reflection_unit : public trans_affine - { - public: - trans_affine_reflection_unit(double ux, double uy) : - trans_affine(2.0 * ux * ux - 1.0, - 2.0 * ux * uy, - 2.0 * ux * uy, - 2.0 * uy * uy - 1.0, - 0.0, 0.0) - {} - }; - - - //=================================================trans_affine_reflection - // Reflection matrix. Reflect coordinates across the line through - // the origin at the angle a or containing the non-unit vector (x, y). - // Contributed by John Horigan - class trans_affine_reflection : public trans_affine_reflection_unit - { - public: - trans_affine_reflection(double a) : - trans_affine_reflection_unit(cos(a), sin(a)) - {} - - - trans_affine_reflection(double x, double y) : - trans_affine_reflection_unit(x / sqrt(x * x + y * y), y / sqrt(x * x + y * y)) - {} - }; - -} - - -#endif - diff --git a/uppdev/aggdraw/agg_trans_bilinear.h b/uppdev/aggdraw/agg_trans_bilinear.h deleted file mode 100644 index 215026224..000000000 --- a/uppdev/aggdraw/agg_trans_bilinear.h +++ /dev/null @@ -1,172 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_TRANS_BILINEAR_INCLUDED -#define AGG_TRANS_BILINEAR_INCLUDED - -#include "agg_basics.h" -#include "agg_simul_eq.h" - -namespace agg -{ - - //==========================================================trans_bilinear - class trans_bilinear - { - public: - //-------------------------------------------------------------------- - trans_bilinear() : m_valid(false) {} - - //-------------------------------------------------------------------- - // Arbitrary quadrangle transformations - trans_bilinear(const double* src, const double* dst) - { - quad_to_quad(src, dst); - } - - - //-------------------------------------------------------------------- - // Direct transformations - trans_bilinear(double x1, double y1, double x2, double y2, - const double* quad) - { - rect_to_quad(x1, y1, x2, y2, quad); - } - - - //-------------------------------------------------------------------- - // Reverse transformations - trans_bilinear(const double* quad, - double x1, double y1, double x2, double y2) - { - quad_to_rect(quad, x1, y1, x2, y2); - } - - - //-------------------------------------------------------------------- - // Set the transformations using two arbitrary quadrangles. - void quad_to_quad(const double* src, const double* dst) - { - double left[4][4]; - double right[4][2]; - - unsigned i; - for(i = 0; i < 4; i++) - { - unsigned ix = i * 2; - unsigned iy = ix + 1; - left[i][0] = 1.0; - left[i][1] = src[ix] * src[iy]; - left[i][2] = src[ix]; - left[i][3] = src[iy]; - - right[i][0] = dst[ix]; - right[i][1] = dst[iy]; - } - m_valid = simul_eq<4, 2>::solve(left, right, m_mtx); - } - - - //-------------------------------------------------------------------- - // Set the direct transformations, i.e., rectangle -> quadrangle - void rect_to_quad(double x1, double y1, double x2, double y2, - const double* quad) - { - double src[8]; - src[0] = src[6] = x1; - src[2] = src[4] = x2; - src[1] = src[3] = y1; - src[5] = src[7] = y2; - quad_to_quad(src, quad); - } - - - //-------------------------------------------------------------------- - // Set the reverse transformations, i.e., quadrangle -> rectangle - void quad_to_rect(const double* quad, - double x1, double y1, double x2, double y2) - { - double dst[8]; - dst[0] = dst[6] = x1; - dst[2] = dst[4] = x2; - dst[1] = dst[3] = y1; - dst[5] = dst[7] = y2; - quad_to_quad(quad, dst); - } - - //-------------------------------------------------------------------- - // Check if the equations were solved successfully - bool is_valid() const { return m_valid; } - - //-------------------------------------------------------------------- - // Transform a point (x, y) - void transform(double* x, double* y) const - { - double tx = *x; - double ty = *y; - double xy = tx * ty; - *x = m_mtx[0][0] + m_mtx[1][0] * xy + m_mtx[2][0] * tx + m_mtx[3][0] * ty; - *y = m_mtx[0][1] + m_mtx[1][1] * xy + m_mtx[2][1] * tx + m_mtx[3][1] * ty; - } - - - //-------------------------------------------------------------------- - class iterator_x - { - double inc_x; - double inc_y; - - public: - double x; - double y; - - iterator_x() {} - iterator_x(double tx, double ty, double step, const double m[4][2]) : - inc_x(m[1][0] * step * ty + m[2][0] * step), - inc_y(m[1][1] * step * ty + m[2][1] * step), - x(m[0][0] + m[1][0] * tx * ty + m[2][0] * tx + m[3][0] * ty), - y(m[0][1] + m[1][1] * tx * ty + m[2][1] * tx + m[3][1] * ty) - { - } - - void operator ++ () - { - x += inc_x; - y += inc_y; - } - }; - - iterator_x begin(double x, double y, double step) const - { - return iterator_x(x, y, step, m_mtx); - } - - private: - double m_mtx[4][2]; - bool m_valid; - }; - -} - -#endif diff --git a/uppdev/aggdraw/agg_trans_double_path.cpp b/uppdev/aggdraw/agg_trans_double_path.cpp deleted file mode 100644 index fc3d184e5..000000000 --- a/uppdev/aggdraw/agg_trans_double_path.cpp +++ /dev/null @@ -1,282 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#include "agg_math.h" -#include "agg_trans_double_path.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - trans_double_path::trans_double_path() : - m_kindex1(0.0), - m_kindex2(0.0), - m_base_length(0.0), - m_base_height(1.0), - m_status1(initial), - m_status2(initial), - m_preserve_x_scale(true) - { - } - - - //------------------------------------------------------------------------ - void trans_double_path::reset() - { - m_src_vertices1.remove_all(); - m_src_vertices2.remove_all(); - m_kindex1 = 0.0; - m_kindex1 = 0.0; - m_status1 = initial; - m_status2 = initial; - } - - - //------------------------------------------------------------------------ - void trans_double_path::move_to1(double x, double y) - { - if(m_status1 == initial) - { - m_src_vertices1.modify_last(vertex_dist(x, y)); - m_status1 = making_path; - } - else - { - line_to1(x, y); - } - } - - - //------------------------------------------------------------------------ - void trans_double_path::line_to1(double x, double y) - { - if(m_status1 == making_path) - { - m_src_vertices1.add(vertex_dist(x, y)); - } - } - - - //------------------------------------------------------------------------ - void trans_double_path::move_to2(double x, double y) - { - if(m_status2 == initial) - { - m_src_vertices2.modify_last(vertex_dist(x, y)); - m_status2 = making_path; - } - else - { - line_to2(x, y); - } - } - - - //------------------------------------------------------------------------ - void trans_double_path::line_to2(double x, double y) - { - if(m_status2 == making_path) - { - m_src_vertices2.add(vertex_dist(x, y)); - } - } - - - //------------------------------------------------------------------------ - double trans_double_path::finalize_path(vertex_storage& vertices) - { - unsigned i; - double dist; - double d; - - vertices.close(false); - if(vertices.size() > 2) - { - if(vertices[vertices.size() - 2].dist * 10.0 < - vertices[vertices.size() - 3].dist) - { - d = vertices[vertices.size() - 3].dist + - vertices[vertices.size() - 2].dist; - - vertices[vertices.size() - 2] = - vertices[vertices.size() - 1]; - - vertices.remove_last(); - vertices[vertices.size() - 2].dist = d; - } - } - - dist = 0; - for(i = 0; i < vertices.size(); i++) - { - vertex_dist& v = vertices[i]; - d = v.dist; - v.dist = dist; - dist += d; - } - - return (vertices.size() - 1) / dist; - } - - - //------------------------------------------------------------------------ - void trans_double_path::finalize_paths() - { - if(m_status1 == making_path && m_src_vertices1.size() > 1 && - m_status2 == making_path && m_src_vertices2.size() > 1) - { - m_kindex1 = finalize_path(m_src_vertices1); - m_kindex2 = finalize_path(m_src_vertices2); - m_status1 = ready; - m_status2 = ready; - } - } - - - //------------------------------------------------------------------------ - double trans_double_path::total_length1() const - { - if(m_base_length >= 1e-10) return m_base_length; - return (m_status1 == ready) ? - m_src_vertices1[m_src_vertices1.size() - 1].dist : - 0.0; - } - - - //------------------------------------------------------------------------ - double trans_double_path::total_length2() const - { - if(m_base_length >= 1e-10) return m_base_length; - return (m_status2 == ready) ? - m_src_vertices2[m_src_vertices2.size() - 1].dist : - 0.0; - } - - - //------------------------------------------------------------------------ - void trans_double_path::transform1(const vertex_storage& vertices, - double kindex, double kx, - double *x, double* y) const - { - double x1 = 0.0; - double y1 = 0.0; - double dx = 1.0; - double dy = 1.0; - double d = 0.0; - double dd = 1.0; - *x *= kx; - if(*x < 0.0) - { - // Extrapolation on the left - //-------------------------- - x1 = vertices[0].x; - y1 = vertices[0].y; - dx = vertices[1].x - x1; - dy = vertices[1].y - y1; - dd = vertices[1].dist - vertices[0].dist; - d = *x; - } - else - if(*x > vertices[vertices.size() - 1].dist) - { - // Extrapolation on the right - //-------------------------- - unsigned i = vertices.size() - 2; - unsigned j = vertices.size() - 1; - x1 = vertices[j].x; - y1 = vertices[j].y; - dx = x1 - vertices[i].x; - dy = y1 - vertices[i].y; - dd = vertices[j].dist - vertices[i].dist; - d = *x - vertices[j].dist; - } - else - { - // Interpolation - //-------------------------- - unsigned i = 0; - unsigned j = vertices.size() - 1; - if(m_preserve_x_scale) - { - unsigned k; - for(i = 0; (j - i) > 1; ) - { - if(*x < vertices[k = (i + j) >> 1].dist) - { - j = k; - } - else - { - i = k; - } - } - d = vertices[i].dist; - dd = vertices[j].dist - d; - d = *x - d; - } - else - { - i = unsigned(*x * kindex); - j = i + 1; - dd = vertices[j].dist - vertices[i].dist; - d = ((*x * kindex) - i) * dd; - } - x1 = vertices[i].x; - y1 = vertices[i].y; - dx = vertices[j].x - x1; - dy = vertices[j].y - y1; - } - *x = x1 + dx * d / dd; - *y = y1 + dy * d / dd; - } - - - //------------------------------------------------------------------------ - void trans_double_path::transform(double *x, double *y) const - { - if(m_status1 == ready && m_status2 == ready) - { - if(m_base_length > 1e-10) - { - *x *= m_src_vertices1[m_src_vertices1.size() - 1].dist / - m_base_length; - } - - double x1 = *x; - double y1 = *y; - double x2 = *x; - double y2 = *y; - double dd = m_src_vertices2[m_src_vertices2.size() - 1].dist / - m_src_vertices1[m_src_vertices1.size() - 1].dist; - - transform1(m_src_vertices1, m_kindex1, 1.0, &x1, &y1); - transform1(m_src_vertices2, m_kindex2, dd, &x2, &y2); - - *x = x1 + *y * (x2 - x1) / m_base_height; - *y = y1 + *y * (y2 - y1) / m_base_height; - } - } - -} - diff --git a/uppdev/aggdraw/agg_trans_double_path.h b/uppdev/aggdraw/agg_trans_double_path.h deleted file mode 100644 index 736e921b7..000000000 --- a/uppdev/aggdraw/agg_trans_double_path.h +++ /dev/null @@ -1,140 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_TRANS_DOUBLE_PATH_INCLUDED -#define AGG_TRANS_DOUBLE_PATH_INCLUDED - -#include "agg_basics.h" -#include "agg_vertex_sequence.h" - -namespace agg -{ - - // See also: agg_trans_double_path.cpp - // - //-------------------------------------------------------trans_double_path - class trans_double_path - { - enum status_e - { - initial, - making_path, - ready - }; - - public: - typedef vertex_sequence vertex_storage; - - trans_double_path(); - - //-------------------------------------------------------------------- - void base_length(double v) { m_base_length = v; } - double base_length() const { return m_base_length; } - - //-------------------------------------------------------------------- - void base_height(double v) { m_base_height = v; } - double base_height() const { return m_base_height; } - - //-------------------------------------------------------------------- - void preserve_x_scale(bool f) { m_preserve_x_scale = f; } - bool preserve_x_scale() const { return m_preserve_x_scale; } - - //-------------------------------------------------------------------- - void reset(); - void move_to1(double x, double y); - void line_to1(double x, double y); - void move_to2(double x, double y); - void line_to2(double x, double y); - void finalize_paths(); - - //-------------------------------------------------------------------- - template - void add_paths(VertexSource1& vs1, VertexSource2& vs2, - unsigned path1_id=0, unsigned path2_id=0) - { - double x; - double y; - - unsigned cmd; - - vs1.rewind(path1_id); - while(!is_stop(cmd = vs1.vertex(&x, &y))) - { - if(is_move_to(cmd)) - { - move_to1(x, y); - } - else - { - if(is_vertex(cmd)) - { - line_to1(x, y); - } - } - } - - vs2.rewind(path2_id); - while(!is_stop(cmd = vs2.vertex(&x, &y))) - { - if(is_move_to(cmd)) - { - move_to2(x, y); - } - else - { - if(is_vertex(cmd)) - { - line_to2(x, y); - } - } - } - finalize_paths(); - } - - //-------------------------------------------------------------------- - double total_length1() const; - double total_length2() const; - void transform(double *x, double *y) const; - - private: - double finalize_path(vertex_storage& vertices); - void transform1(const vertex_storage& vertices, - double kindex, double kx, - double *x, double* y) const; - - vertex_storage m_src_vertices1; - vertex_storage m_src_vertices2; - double m_base_length; - double m_base_height; - double m_kindex1; - double m_kindex2; - status_e m_status1; - status_e m_status2; - bool m_preserve_x_scale; - }; - -} - - -#endif diff --git a/uppdev/aggdraw/agg_trans_perspective.h b/uppdev/aggdraw/agg_trans_perspective.h deleted file mode 100644 index 48b9ac8af..000000000 --- a/uppdev/aggdraw/agg_trans_perspective.h +++ /dev/null @@ -1,737 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_TRANS_PERSPECTIVE_INCLUDED -#define AGG_TRANS_PERSPECTIVE_INCLUDED - -#include "agg_trans_affine.h" - -namespace agg -{ - //=======================================================trans_perspective - struct trans_perspective - { - double sx, shy, w0, shx, sy, w1, tx, ty, w2; - - //------------------------------------------------------- Construction - // Identity matrix - trans_perspective() : - sx (1), shy(0), w0(0), - shx(0), sy (1), w1(0), - tx (0), ty (0), w2(1) {} - - // Custom matrix - trans_perspective(double v0, double v1, double v2, - double v3, double v4, double v5, - double v6, double v7, double v8) : - sx (v0), shy(v1), w0(v2), - shx(v3), sy (v4), w1(v5), - tx (v6), ty (v7), w2(v8) {} - - // Custom matrix from m[9] - explicit trans_perspective(const double* m) : - sx (m[0]), shy(m[1]), w0(m[2]), - shx(m[3]), sy (m[4]), w1(m[5]), - tx (m[6]), ty (m[7]), w2(m[8]) {} - - // From affine - explicit trans_perspective(const trans_affine& a) : - sx (a.sx ), shy(a.shy), w0(0), - shx(a.shx), sy (a.sy ), w1(0), - tx (a.tx ), ty (a.ty ), w2(1) {} - - // Rectangle to quadrilateral - trans_perspective(double x1, double y1, double x2, double y2, - const double* quad); - - // Quadrilateral to rectangle - trans_perspective(const double* quad, - double x1, double y1, double x2, double y2); - - // Arbitrary quadrilateral transformations - trans_perspective(const double* src, const double* dst); - - //-------------------------------------- Quadrilateral transformations - // The arguments are double[8] that are mapped to quadrilaterals: - // x1,y1, x2,y2, x3,y3, x4,y4 - bool quad_to_quad(const double* qs, const double* qd); - - bool rect_to_quad(double x1, double y1, - double x2, double y2, - const double* q); - - bool quad_to_rect(const double* q, - double x1, double y1, - double x2, double y2); - - // Map square (0,0,1,1) to the quadrilateral and vice versa - bool square_to_quad(const double* q); - bool quad_to_square(const double* q); - - - //--------------------------------------------------------- Operations - // Reset - load an identity matrix - const trans_perspective& reset(); - - // Invert matrix. Returns false in degenerate case - bool invert(); - - // Direct transformations operations - const trans_perspective& translate(double x, double y); - const trans_perspective& rotate(double a); - const trans_perspective& scale(double s); - const trans_perspective& scale(double x, double y); - - // Multiply the matrix by another one - const trans_perspective& multiply(const trans_perspective& m); - - // Multiply "m" by "this" and assign the result to "this" - const trans_perspective& premultiply(const trans_perspective& m); - - // Multiply matrix to inverse of another one - const trans_perspective& multiply_inv(const trans_perspective& m); - - // Multiply inverse of "m" by "this" and assign the result to "this" - const trans_perspective& premultiply_inv(const trans_perspective& m); - - // Multiply the matrix by another one - const trans_perspective& multiply(const trans_affine& m); - - // Multiply "m" by "this" and assign the result to "this" - const trans_perspective& premultiply(const trans_affine& m); - - // Multiply the matrix by inverse of another one - const trans_perspective& multiply_inv(const trans_affine& m); - - // Multiply inverse of "m" by "this" and assign the result to "this" - const trans_perspective& premultiply_inv(const trans_affine& m); - - //--------------------------------------------------------- Load/Store - void store_to(double* m) const; - const trans_perspective& load_from(const double* m); - - //---------------------------------------------------------- Operators - // Multiply the matrix by another one - const trans_perspective& operator *= (const trans_perspective& m) - { - return multiply(m); - } - const trans_perspective& operator *= (const trans_affine& m) - { - return multiply(m); - } - - // Multiply the matrix by inverse of another one - const trans_perspective& operator /= (const trans_perspective& m) - { - return multiply_inv(m); - } - const trans_perspective& operator /= (const trans_affine& m) - { - return multiply_inv(m); - } - - // Multiply the matrix by another one and return - // the result in a separete matrix. - trans_perspective operator * (const trans_perspective& m) - { - return trans_perspective(*this).multiply(m); - } - trans_perspective operator * (const trans_affine& m) - { - return trans_perspective(*this).multiply(m); - } - - // Multiply the matrix by inverse of another one - // and return the result in a separete matrix. - trans_perspective operator / (const trans_perspective& m) - { - return trans_perspective(*this).multiply_inv(m); - } - trans_perspective operator / (const trans_affine& m) - { - return trans_perspective(*this).multiply_inv(m); - } - - // Calculate and return the inverse matrix - trans_perspective operator ~ () const - { - trans_perspective ret = *this; - ret.invert(); - return ret; - } - - // Equal operator with default epsilon - bool operator == (const trans_perspective& m) const - { - return is_equal(m, affine_epsilon); - } - - // Not Equal operator with default epsilon - bool operator != (const trans_perspective& m) const - { - return !is_equal(m, affine_epsilon); - } - - //---------------------------------------------------- Transformations - // Direct transformation of x and y - void transform(double* x, double* y) const; - - // Direct transformation of x and y, affine part only - void transform_affine(double* x, double* y) const; - - // Direct transformation of x and y, 2x2 matrix only, no translation - void transform_2x2(double* x, double* y) const; - - // Inverse transformation of x and y. It works slow because - // it explicitly inverts the matrix on every call. For massive - // operations it's better to invert() the matrix and then use - // direct transformations. - void inverse_transform(double* x, double* y) const; - - - //---------------------------------------------------------- Auxiliary - const trans_perspective& from_affine(const trans_affine& a); - double determinant() const; - double determinant_reciprocal() const; - - bool is_valid(double epsilon = affine_epsilon) const; - bool is_identity(double epsilon = affine_epsilon) const; - bool is_equal(const trans_perspective& m, - double epsilon = affine_epsilon) const; - - // Determine the major affine parameters. Use with caution - // considering possible degenerate cases. - double scale() const; - double rotation() const; - void translation(double* dx, double* dy) const; - void scaling(double* x, double* y) const; - void scaling_abs(double* x, double* y) const; - - - - //-------------------------------------------------------------------- - class iterator_x - { - double den; - double den_step; - double nom_x; - double nom_x_step; - double nom_y; - double nom_y_step; - - public: - double x; - double y; - - iterator_x() {} - iterator_x(double px, double py, double step, const trans_perspective& m) : - den(px * m.w0 + py * m.w1 + m.w2), - den_step(m.w0 * step), - nom_x(px * m.sx + py * m.shx + m.tx), - nom_x_step(step * m.sx), - nom_y(px * m.shy + py * m.sy + m.ty), - nom_y_step(step * m.shy), - x(nom_x / den), - y(nom_y / den) - {} - - void operator ++ () - { - den += den_step; - nom_x += nom_x_step; - nom_y += nom_y_step; - double d = 1.0 / den; - x = nom_x * d; - y = nom_y * d; - } - }; - - //-------------------------------------------------------------------- - iterator_x begin(double x, double y, double step) const - { - return iterator_x(x, y, step, *this); - } - }; - - - - - - - - - - - - - - - //------------------------------------------------------------------------ - inline bool trans_perspective::square_to_quad(const double* q) - { - double dx = q[0] - q[2] + q[4] - q[6]; - double dy = q[1] - q[3] + q[5] - q[7]; - if(dx == 0.0 && dy == 0.0) - { - // Affine case (parallelogram) - //--------------- - sx = q[2] - q[0]; - shy = q[3] - q[1]; - w0 = 0.0; - shx = q[4] - q[2]; - sy = q[5] - q[3]; - w1 = 0.0; - tx = q[0]; - ty = q[1]; - w2 = 1.0; - } - else - { - double dx1 = q[2] - q[4]; - double dy1 = q[3] - q[5]; - double dx2 = q[6] - q[4]; - double dy2 = q[7] - q[5]; - double den = dx1 * dy2 - dx2 * dy1; - if(den == 0.0) - { - // Singular case - //--------------- - sx = shy = w0 = shx = sy = w1 = tx = ty = w2 = 0.0; - return false; - } - // General case - //--------------- - double u = (dx * dy2 - dy * dx2) / den; - double v = (dy * dx1 - dx * dy1) / den; - sx = q[2] - q[0] + u * q[2]; - shy = q[3] - q[1] + u * q[3]; - w0 = u; - shx = q[6] - q[0] + v * q[6]; - sy = q[7] - q[1] + v * q[7]; - w1 = v; - tx = q[0]; - ty = q[1]; - w2 = 1.0; - } - return true; - } - - //------------------------------------------------------------------------ - inline bool trans_perspective::invert() - { - double d0 = sy * w2 - w1 * ty; - double d1 = w0 * ty - shy * w2; - double d2 = shy * w1 - w0 * sy; - double d = sx * d0 + shx * d1 + tx * d2; - if(d == 0.0) - { - sx = shy = w0 = shx = sy = w1 = tx = ty = w2 = 0.0; - return false; - } - d = 1.0 / d; - trans_perspective a = *this; - sx = d * d0; - shy = d * d1; - w0 = d * d2; - shx = d * (a.w1 *a.tx - a.shx*a.w2); - sy = d * (a.sx *a.w2 - a.w0 *a.tx); - w1 = d * (a.w0 *a.shx - a.sx *a.w1); - tx = d * (a.shx*a.ty - a.sy *a.tx); - ty = d * (a.shy*a.tx - a.sx *a.ty); - w2 = d * (a.sx *a.sy - a.shy*a.shx); - return true; - } - - //------------------------------------------------------------------------ - inline bool trans_perspective::quad_to_square(const double* q) - { - if(!square_to_quad(q)) return false; - invert(); - return true; - } - - //------------------------------------------------------------------------ - inline bool trans_perspective::quad_to_quad(const double* qs, - const double* qd) - { - trans_perspective p; - if(! quad_to_square(qs)) return false; - if(!p.square_to_quad(qd)) return false; - multiply(p); - return true; - } - - //------------------------------------------------------------------------ - inline bool trans_perspective::rect_to_quad(double x1, double y1, - double x2, double y2, - const double* q) - { - double r[8]; - r[0] = r[6] = x1; - r[2] = r[4] = x2; - r[1] = r[3] = y1; - r[5] = r[7] = y2; - return quad_to_quad(r, q); - } - - //------------------------------------------------------------------------ - inline bool trans_perspective::quad_to_rect(const double* q, - double x1, double y1, - double x2, double y2) - { - double r[8]; - r[0] = r[6] = x1; - r[2] = r[4] = x2; - r[1] = r[3] = y1; - r[5] = r[7] = y2; - return quad_to_quad(q, r); - } - - //------------------------------------------------------------------------ - inline trans_perspective::trans_perspective(double x1, double y1, - double x2, double y2, - const double* quad) - { - rect_to_quad(x1, y1, x2, y2, quad); - } - - //------------------------------------------------------------------------ - inline trans_perspective::trans_perspective(const double* quad, - double x1, double y1, - double x2, double y2) - { - quad_to_rect(quad, x1, y1, x2, y2); - } - - //------------------------------------------------------------------------ - inline trans_perspective::trans_perspective(const double* src, - const double* dst) - { - quad_to_quad(src, dst); - } - - //------------------------------------------------------------------------ - inline const trans_perspective& trans_perspective::reset() - { - sx = 1; shy = 0; w0 = 0; - shx = 0; sy = 1; w1 = 0; - tx = 0; ty = 0; w2 = 1; - return *this; - } - - //------------------------------------------------------------------------ - inline const trans_perspective& - trans_perspective::multiply(const trans_perspective& a) - { - trans_perspective b = *this; - sx = a.sx *b.sx + a.shx*b.shy + a.tx*b.w0; - shx = a.sx *b.shx + a.shx*b.sy + a.tx*b.w1; - tx = a.sx *b.tx + a.shx*b.ty + a.tx*b.w2; - shy = a.shy*b.sx + a.sy *b.shy + a.ty*b.w0; - sy = a.shy*b.shx + a.sy *b.sy + a.ty*b.w1; - ty = a.shy*b.tx + a.sy *b.ty + a.ty*b.w2; - w0 = a.w0 *b.sx + a.w1 *b.shy + a.w2*b.w0; - w1 = a.w0 *b.shx + a.w1 *b.sy + a.w2*b.w1; - w2 = a.w0 *b.tx + a.w1 *b.ty + a.w2*b.w2; - return *this; - } - - //------------------------------------------------------------------------ - inline const trans_perspective& - trans_perspective::multiply(const trans_affine& a) - { - trans_perspective b = *this; - sx = a.sx *b.sx + a.shx*b.shy + a.tx*b.w0; - shx = a.sx *b.shx + a.shx*b.sy + a.tx*b.w1; - tx = a.sx *b.tx + a.shx*b.ty + a.tx*b.w2; - shy = a.shy*b.sx + a.sy *b.shy + a.ty*b.w0; - sy = a.shy*b.shx + a.sy *b.sy + a.ty*b.w1; - ty = a.shy*b.tx + a.sy *b.ty + a.ty*b.w2; - return *this; - } - - //------------------------------------------------------------------------ - inline const trans_perspective& - trans_perspective::premultiply(const trans_perspective& b) - { - trans_perspective a = *this; - sx = a.sx *b.sx + a.shx*b.shy + a.tx*b.w0; - shx = a.sx *b.shx + a.shx*b.sy + a.tx*b.w1; - tx = a.sx *b.tx + a.shx*b.ty + a.tx*b.w2; - shy = a.shy*b.sx + a.sy *b.shy + a.ty*b.w0; - sy = a.shy*b.shx + a.sy *b.sy + a.ty*b.w1; - ty = a.shy*b.tx + a.sy *b.ty + a.ty*b.w2; - w0 = a.w0 *b.sx + a.w1 *b.shy + a.w2*b.w0; - w1 = a.w0 *b.shx + a.w1 *b.sy + a.w2*b.w1; - w2 = a.w0 *b.tx + a.w1 *b.ty + a.w2*b.w2; - return *this; - } - - //------------------------------------------------------------------------ - inline const trans_perspective& - trans_perspective::premultiply(const trans_affine& b) - { - trans_perspective a = *this; - sx = a.sx *b.sx + a.shx*b.shy; - shx = a.sx *b.shx + a.shx*b.sy; - tx = a.sx *b.tx + a.shx*b.ty + a.tx; - shy = a.shy*b.sx + a.sy *b.shy; - sy = a.shy*b.shx + a.sy *b.sy; - ty = a.shy*b.tx + a.sy *b.ty + a.ty; - w0 = a.w0 *b.sx + a.w1 *b.shy; - w1 = a.w0 *b.shx + a.w1 *b.sy; - w2 = a.w0 *b.tx + a.w1 *b.ty + a.w2; - return *this; - } - - //------------------------------------------------------------------------ - const trans_perspective& - trans_perspective::multiply_inv(const trans_perspective& m) - { - trans_perspective t = m; - t.invert(); - return multiply(t); - } - - //------------------------------------------------------------------------ - const trans_perspective& - trans_perspective::multiply_inv(const trans_affine& m) - { - trans_affine t = m; - t.invert(); - return multiply(t); - } - - //------------------------------------------------------------------------ - const trans_perspective& - trans_perspective::premultiply_inv(const trans_perspective& m) - { - trans_perspective t = m; - t.invert(); - return *this = t.multiply(*this); - } - - //------------------------------------------------------------------------ - const trans_perspective& - trans_perspective::premultiply_inv(const trans_affine& m) - { - trans_perspective t(m); - t.invert(); - return *this = t.multiply(*this); - } - - //------------------------------------------------------------------------ - inline const trans_perspective& - trans_perspective::translate(double x, double y) - { - tx += x; - ty += y; - return *this; - } - - //------------------------------------------------------------------------ - inline const trans_perspective& trans_perspective::rotate(double a) - { - multiply(trans_affine_rotation(a)); - return *this; - } - - //------------------------------------------------------------------------ - inline const trans_perspective& trans_perspective::scale(double s) - { - multiply(trans_affine_scaling(s)); - return *this; - } - - //------------------------------------------------------------------------ - inline const trans_perspective& trans_perspective::scale(double x, double y) - { - multiply(trans_affine_scaling(x, y)); - return *this; - } - - //------------------------------------------------------------------------ - inline void trans_perspective::transform(double* px, double* py) const - { - double x = *px; - double y = *py; - double m = 1.0 / (x*w0 + y*w1 + w2); - *px = m * (x*sx + y*shx + tx); - *py = m * (x*shy + y*sy + ty); - } - - //------------------------------------------------------------------------ - inline void trans_perspective::transform_affine(double* x, double* y) const - { - double tmp = *x; - *x = tmp * sx + *y * shx + tx; - *y = tmp * shy + *y * sy + ty; - } - - //------------------------------------------------------------------------ - inline void trans_perspective::transform_2x2(double* x, double* y) const - { - double tmp = *x; - *x = tmp * sx + *y * shx; - *y = tmp * shy + *y * sy; - } - - //------------------------------------------------------------------------ - inline void trans_perspective::inverse_transform(double* x, double* y) const - { - trans_perspective t(*this); - if(t.invert()) t.transform(x, y); - } - - //------------------------------------------------------------------------ - inline void trans_perspective::store_to(double* m) const - { - *m++ = sx; *m++ = shy; *m++ = w0; - *m++ = shx; *m++ = sy; *m++ = w1; - *m++ = tx; *m++ = ty; *m++ = w2; - } - - //------------------------------------------------------------------------ - inline const trans_perspective& trans_perspective::load_from(const double* m) - { - sx = *m++; shy = *m++; w0 = *m++; - shx = *m++; sy = *m++; w1 = *m++; - tx = *m++; ty = *m++; w2 = *m++; - return *this; - } - - //------------------------------------------------------------------------ - inline const trans_perspective& - trans_perspective::from_affine(const trans_affine& a) - { - sx = a.sx; shy = a.shy; w0 = 0; - shx = a.shx; sy = a.sy; w1 = 0; - tx = a.tx; ty = a.ty; w2 = 1; - return *this; - } - - //------------------------------------------------------------------------ - inline double trans_perspective::determinant() const - { - return sx * (sy * w2 - ty * w1) + - shx * (ty * w0 - shy * w2) + - tx * (shy * w1 - sy * w0); - } - - //------------------------------------------------------------------------ - inline double trans_perspective::determinant_reciprocal() const - { - return 1.0 / determinant(); - } - - //------------------------------------------------------------------------ - inline bool trans_perspective::is_valid(double epsilon) const - { - return fabs(sx) > epsilon && fabs(sy) > epsilon && fabs(w2) > epsilon; - } - - //------------------------------------------------------------------------ - inline bool trans_perspective::is_identity(double epsilon) const - { - return is_equal_eps(sx, 1.0, epsilon) && - is_equal_eps(shy, 0.0, epsilon) && - is_equal_eps(w0, 0.0, epsilon) && - is_equal_eps(shx, 0.0, epsilon) && - is_equal_eps(sy, 1.0, epsilon) && - is_equal_eps(w1, 0.0, epsilon) && - is_equal_eps(tx, 0.0, epsilon) && - is_equal_eps(ty, 0.0, epsilon) && - is_equal_eps(w2, 1.0, epsilon); - } - - //------------------------------------------------------------------------ - inline bool trans_perspective::is_equal(const trans_perspective& m, - double epsilon) const - { - return is_equal_eps(sx, m.sx, epsilon) && - is_equal_eps(shy, m.shy, epsilon) && - is_equal_eps(w0, m.w0, epsilon) && - is_equal_eps(shx, m.shx, epsilon) && - is_equal_eps(sy, m.sy, epsilon) && - is_equal_eps(w1, m.w1, epsilon) && - is_equal_eps(tx, m.tx, epsilon) && - is_equal_eps(ty, m.ty, epsilon) && - is_equal_eps(w2, m.w2, epsilon); - } - - //------------------------------------------------------------------------ - inline double trans_perspective::scale() const - { - double x = 0.707106781 * sx + 0.707106781 * shx; - double y = 0.707106781 * shy + 0.707106781 * sy; - return sqrt(x*x + y*y); - } - - //------------------------------------------------------------------------ - inline double trans_perspective::rotation() const - { - double x1 = 0.0; - double y1 = 0.0; - double x2 = 1.0; - double y2 = 0.0; - transform(&x1, &y1); - transform(&x2, &y2); - return atan2(y2-y1, x2-x1); - } - - //------------------------------------------------------------------------ - void trans_perspective::translation(double* dx, double* dy) const - { - *dx = tx; - *dy = ty; - } - - //------------------------------------------------------------------------ - void trans_perspective::scaling(double* x, double* y) const - { - double x1 = 0.0; - double y1 = 0.0; - double x2 = 1.0; - double y2 = 1.0; - trans_perspective t(*this); - t *= trans_affine_rotation(-rotation()); - t.transform(&x1, &y1); - t.transform(&x2, &y2); - *x = x2 - x1; - *y = y2 - y1; - } - - //------------------------------------------------------------------------ - void trans_perspective::scaling_abs(double* x, double* y) const - { - *x = sqrt(sx * sx + shx * shx); - *y = sqrt(shy * shy + sy * sy); - } - - -} - -#endif - diff --git a/uppdev/aggdraw/agg_trans_single_path.cpp b/uppdev/aggdraw/agg_trans_single_path.cpp deleted file mode 100644 index 368ab883a..000000000 --- a/uppdev/aggdraw/agg_trans_single_path.cpp +++ /dev/null @@ -1,211 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#include "agg_math.h" -#include "agg_vertex_sequence.h" -#include "agg_trans_single_path.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - trans_single_path::trans_single_path() : - m_base_length(0.0), - m_kindex(0.0), - m_status(initial), - m_preserve_x_scale(true) - { - } - - //------------------------------------------------------------------------ - void trans_single_path::reset() - { - m_src_vertices.remove_all(); - m_kindex = 0.0; - m_status = initial; - } - - //------------------------------------------------------------------------ - void trans_single_path::move_to(double x, double y) - { - if(m_status == initial) - { - m_src_vertices.modify_last(vertex_dist(x, y)); - m_status = making_path; - } - else - { - line_to(x, y); - } - } - - //------------------------------------------------------------------------ - void trans_single_path::line_to(double x, double y) - { - if(m_status == making_path) - { - m_src_vertices.add(vertex_dist(x, y)); - } - } - - - //------------------------------------------------------------------------ - void trans_single_path::finalize_path() - { - if(m_status == making_path && m_src_vertices.size() > 1) - { - unsigned i; - double dist; - double d; - - m_src_vertices.close(false); - if(m_src_vertices.size() > 2) - { - if(m_src_vertices[m_src_vertices.size() - 2].dist * 10.0 < - m_src_vertices[m_src_vertices.size() - 3].dist) - { - d = m_src_vertices[m_src_vertices.size() - 3].dist + - m_src_vertices[m_src_vertices.size() - 2].dist; - - m_src_vertices[m_src_vertices.size() - 2] = - m_src_vertices[m_src_vertices.size() - 1]; - - m_src_vertices.remove_last(); - m_src_vertices[m_src_vertices.size() - 2].dist = d; - } - } - - dist = 0.0; - for(i = 0; i < m_src_vertices.size(); i++) - { - vertex_dist& v = m_src_vertices[i]; - double d = v.dist; - v.dist = dist; - dist += d; - } - m_kindex = (m_src_vertices.size() - 1) / dist; - m_status = ready; - } - } - - - - //------------------------------------------------------------------------ - double trans_single_path::total_length() const - { - if(m_base_length >= 1e-10) return m_base_length; - return (m_status == ready) ? - m_src_vertices[m_src_vertices.size() - 1].dist : - 0.0; - } - - - //------------------------------------------------------------------------ - void trans_single_path::transform(double *x, double *y) const - { - if(m_status == ready) - { - if(m_base_length > 1e-10) - { - *x *= m_src_vertices[m_src_vertices.size() - 1].dist / - m_base_length; - } - - double x1 = 0.0; - double y1 = 0.0; - double dx = 1.0; - double dy = 1.0; - double d = 0.0; - double dd = 1.0; - if(*x < 0.0) - { - // Extrapolation on the left - //-------------------------- - x1 = m_src_vertices[0].x; - y1 = m_src_vertices[0].y; - dx = m_src_vertices[1].x - x1; - dy = m_src_vertices[1].y - y1; - dd = m_src_vertices[1].dist - m_src_vertices[0].dist; - d = *x; - } - else - if(*x > m_src_vertices[m_src_vertices.size() - 1].dist) - { - // Extrapolation on the right - //-------------------------- - unsigned i = m_src_vertices.size() - 2; - unsigned j = m_src_vertices.size() - 1; - x1 = m_src_vertices[j].x; - y1 = m_src_vertices[j].y; - dx = x1 - m_src_vertices[i].x; - dy = y1 - m_src_vertices[i].y; - dd = m_src_vertices[j].dist - m_src_vertices[i].dist; - d = *x - m_src_vertices[j].dist; - } - else - { - // Interpolation - //-------------------------- - unsigned i = 0; - unsigned j = m_src_vertices.size() - 1; - if(m_preserve_x_scale) - { - unsigned k; - for(i = 0; (j - i) > 1; ) - { - if(*x < m_src_vertices[k = (i + j) >> 1].dist) - { - j = k; - } - else - { - i = k; - } - } - d = m_src_vertices[i].dist; - dd = m_src_vertices[j].dist - d; - d = *x - d; - } - else - { - i = unsigned(*x * m_kindex); - j = i + 1; - dd = m_src_vertices[j].dist - m_src_vertices[i].dist; - d = ((*x * m_kindex) - i) * dd; - } - x1 = m_src_vertices[i].x; - y1 = m_src_vertices[i].y; - dx = m_src_vertices[j].x - x1; - dy = m_src_vertices[j].y - y1; - } - double x2 = x1 + dx * d / dd; - double y2 = y1 + dy * d / dd; - *x = x2 - *y * dy / dd; - *y = y2 + *y * dx / dd; - } - } - - -} - diff --git a/uppdev/aggdraw/agg_trans_single_path.h b/uppdev/aggdraw/agg_trans_single_path.h deleted file mode 100644 index 479a1f1cf..000000000 --- a/uppdev/aggdraw/agg_trans_single_path.h +++ /dev/null @@ -1,106 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_TRANS_SINGLE_PATH_INCLUDED -#define AGG_TRANS_SINGLE_PATH_INCLUDED - -#include "agg_basics.h" -#include "agg_vertex_sequence.h" - -namespace agg -{ - - // See also: agg_trans_single_path.cpp - // - //-------------------------------------------------------trans_single_path - class trans_single_path - { - enum status_e - { - initial, - making_path, - ready - }; - - public: - typedef vertex_sequence vertex_storage; - - trans_single_path(); - - //-------------------------------------------------------------------- - void base_length(double v) { m_base_length = v; } - double base_length() const { return m_base_length; } - - //-------------------------------------------------------------------- - void preserve_x_scale(bool f) { m_preserve_x_scale = f; } - bool preserve_x_scale() const { return m_preserve_x_scale; } - - //-------------------------------------------------------------------- - void reset(); - void move_to(double x, double y); - void line_to(double x, double y); - void finalize_path(); - - //-------------------------------------------------------------------- - template - void add_path(VertexSource& vs, unsigned path_id=0) - { - double x; - double y; - - unsigned cmd; - vs.rewind(path_id); - while(!is_stop(cmd = vs.vertex(&x, &y))) - { - if(is_move_to(cmd)) - { - move_to(x, y); - } - else - { - if(is_vertex(cmd)) - { - line_to(x, y); - } - } - } - finalize_path(); - } - - //-------------------------------------------------------------------- - double total_length() const; - void transform(double *x, double *y) const; - - private: - vertex_storage m_src_vertices; - double m_base_length; - double m_kindex; - status_e m_status; - bool m_preserve_x_scale; - }; - - -} - -#endif diff --git a/uppdev/aggdraw/agg_trans_viewport.h b/uppdev/aggdraw/agg_trans_viewport.h deleted file mode 100644 index a9d18b540..000000000 --- a/uppdev/aggdraw/agg_trans_viewport.h +++ /dev/null @@ -1,312 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// Viewport transformer - simple orthogonal conversions from world coordinates -// to screen (device) ones. -// -//---------------------------------------------------------------------------- - -#ifndef AGG_TRANS_VIEWPORT_INCLUDED -#define AGG_TRANS_VIEWPORT_INCLUDED - -#include -#include "agg_trans_affine.h" - - -namespace agg -{ - - enum aspect_ratio_e - { - aspect_ratio_stretch, - aspect_ratio_meet, - aspect_ratio_slice - }; - - - //----------------------------------------------------------trans_viewport - class trans_viewport - { - public: - //------------------------------------------------------------------- - trans_viewport() : - m_world_x1(0.0), - m_world_y1(0.0), - m_world_x2(1.0), - m_world_y2(1.0), - m_device_x1(0.0), - m_device_y1(0.0), - m_device_x2(1.0), - m_device_y2(1.0), - m_aspect(aspect_ratio_stretch), - m_is_valid(true), - m_align_x(0.5), - m_align_y(0.5), - m_wx1(0.0), - m_wy1(0.0), - m_wx2(1.0), - m_wy2(1.0), - m_dx1(0.0), - m_dy1(0.0), - m_kx(1.0), - m_ky(1.0) - {} - - //------------------------------------------------------------------- - void preserve_aspect_ratio(double alignx, - double aligny, - aspect_ratio_e aspect) - { - m_align_x = alignx; - m_align_y = aligny; - m_aspect = aspect; - update(); - } - - //------------------------------------------------------------------- - void device_viewport(double x1, double y1, double x2, double y2) - { - m_device_x1 = x1; - m_device_y1 = y1; - m_device_x2 = x2; - m_device_y2 = y2; - update(); - } - - //------------------------------------------------------------------- - void world_viewport(double x1, double y1, double x2, double y2) - { - m_world_x1 = x1; - m_world_y1 = y1; - m_world_x2 = x2; - m_world_y2 = y2; - update(); - } - - //------------------------------------------------------------------- - void device_viewport(double* x1, double* y1, double* x2, double* y2) const - { - *x1 = m_device_x1; - *y1 = m_device_y1; - *x2 = m_device_x2; - *y2 = m_device_y2; - } - - //------------------------------------------------------------------- - void world_viewport(double* x1, double* y1, double* x2, double* y2) const - { - *x1 = m_world_x1; - *y1 = m_world_y1; - *x2 = m_world_x2; - *y2 = m_world_y2; - } - - //------------------------------------------------------------------- - void world_viewport_actual(double* x1, double* y1, - double* x2, double* y2) const - { - *x1 = m_wx1; - *y1 = m_wy1; - *x2 = m_wx2; - *y2 = m_wy2; - } - - //------------------------------------------------------------------- - bool is_valid() const { return m_is_valid; } - double align_x() const { return m_align_x; } - double align_y() const { return m_align_y; } - aspect_ratio_e aspect_ratio() const { return m_aspect; } - - //------------------------------------------------------------------- - void transform(double* x, double* y) const - { - *x = (*x - m_wx1) * m_kx + m_dx1; - *y = (*y - m_wy1) * m_ky + m_dy1; - } - - //------------------------------------------------------------------- - void transform_scale_only(double* x, double* y) const - { - *x *= m_kx; - *y *= m_ky; - } - - //------------------------------------------------------------------- - void inverse_transform(double* x, double* y) const - { - *x = (*x - m_dx1) / m_kx + m_wx1; - *y = (*y - m_dy1) / m_ky + m_wy1; - } - - //------------------------------------------------------------------- - void inverse_transform_scale_only(double* x, double* y) const - { - *x /= m_kx; - *y /= m_ky; - } - - //------------------------------------------------------------------- - double device_dx() const { return m_dx1 - m_wx1 * m_kx; } - double device_dy() const { return m_dy1 - m_wy1 * m_ky; } - - //------------------------------------------------------------------- - double scale_x() const - { - return m_kx; - } - - //------------------------------------------------------------------- - double scale_y() const - { - return m_ky; - } - - //------------------------------------------------------------------- - double scale() const - { - return (m_kx + m_ky) * 0.5; - } - - //------------------------------------------------------------------- - trans_affine to_affine() const - { - trans_affine mtx = trans_affine_translation(-m_wx1, -m_wy1); - mtx *= trans_affine_scaling(m_kx, m_ky); - mtx *= trans_affine_translation(m_dx1, m_dy1); - return mtx; - } - - //------------------------------------------------------------------- - trans_affine to_affine_scale_only() const - { - return trans_affine_scaling(m_kx, m_ky); - } - - //------------------------------------------------------------------- - unsigned byte_size() const - { - return sizeof(*this); - } - - void serialize(int8u* ptr) const - { - memcpy(ptr, this, sizeof(*this)); - } - - void deserialize(const int8u* ptr) - { - memcpy(this, ptr, sizeof(*this)); - } - - private: - void update(); - - double m_world_x1; - double m_world_y1; - double m_world_x2; - double m_world_y2; - double m_device_x1; - double m_device_y1; - double m_device_x2; - double m_device_y2; - aspect_ratio_e m_aspect; - bool m_is_valid; - double m_align_x; - double m_align_y; - double m_wx1; - double m_wy1; - double m_wx2; - double m_wy2; - double m_dx1; - double m_dy1; - double m_kx; - double m_ky; - }; - - - - //----------------------------------------------------------------------- - inline void trans_viewport::update() - { - const double epsilon = 1e-30; - if(fabs(m_world_x1 - m_world_x2) < epsilon || - fabs(m_world_y1 - m_world_y2) < epsilon || - fabs(m_device_x1 - m_device_x2) < epsilon || - fabs(m_device_y1 - m_device_y2) < epsilon) - { - m_wx1 = m_world_x1; - m_wy1 = m_world_y1; - m_wx2 = m_world_x1 + 1.0; - m_wy2 = m_world_y2 + 1.0; - m_dx1 = m_device_x1; - m_dy1 = m_device_y1; - m_kx = 1.0; - m_ky = 1.0; - m_is_valid = false; - return; - } - - double world_x1 = m_world_x1; - double world_y1 = m_world_y1; - double world_x2 = m_world_x2; - double world_y2 = m_world_y2; - double device_x1 = m_device_x1; - double device_y1 = m_device_y1; - double device_x2 = m_device_x2; - double device_y2 = m_device_y2; - if(m_aspect != aspect_ratio_stretch) - { - double d; - m_kx = (device_x2 - device_x1) / (world_x2 - world_x1); - m_ky = (device_y2 - device_y1) / (world_y2 - world_y1); - - if((m_aspect == aspect_ratio_meet) == (m_kx < m_ky)) - { - d = (world_y2 - world_y1) * m_ky / m_kx; - world_y1 += (world_y2 - world_y1 - d) * m_align_y; - world_y2 = world_y1 + d; - } - else - { - d = (world_x2 - world_x1) * m_kx / m_ky; - world_x1 += (world_x2 - world_x1 - d) * m_align_x; - world_x2 = world_x1 + d; - } - } - m_wx1 = world_x1; - m_wy1 = world_y1; - m_wx2 = world_x2; - m_wy2 = world_y2; - m_dx1 = device_x1; - m_dy1 = device_y1; - m_kx = (device_x2 - device_x1) / (world_x2 - world_x1); - m_ky = (device_y2 - device_y1) / (world_y2 - world_y1); - m_is_valid = true; - } - - -} - - -#endif diff --git a/uppdev/aggdraw/agg_trans_warp_magnifier.cpp b/uppdev/aggdraw/agg_trans_warp_magnifier.cpp deleted file mode 100644 index 0854d06ce..000000000 --- a/uppdev/aggdraw/agg_trans_warp_magnifier.cpp +++ /dev/null @@ -1,79 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#include -#include "agg_trans_warp_magnifier.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - void trans_warp_magnifier::transform(double* x, double* y) const - { - double dx = *x - m_xc; - double dy = *y - m_yc; - double r = sqrt(dx * dx + dy * dy); - if(r < m_radius) - { - *x = m_xc + dx * m_magn; - *y = m_yc + dy * m_magn; - return; - } - - double m = (r + m_radius * (m_magn - 1.0)) / r; - *x = m_xc + dx * m; - *y = m_yc + dy * m; - } - - //------------------------------------------------------------------------ - void trans_warp_magnifier::inverse_transform(double* x, double* y) const - { - // New version by Andrew Skalkin - //----------------- - double dx = *x - m_xc; - double dy = *y - m_yc; - double r = sqrt(dx * dx + dy * dy); - - if(r < m_radius * m_magn) - { - *x = m_xc + dx / m_magn; - *y = m_yc + dy / m_magn; - } - else - { - double rnew = r - m_radius * (m_magn - 1.0); - *x = m_xc + rnew * dx / r; - *y = m_yc + rnew * dy / r; - } - - // Old version - //----------------- - //trans_warp_magnifier t(*this); - //t.magnification(1.0 / m_magn); - //t.radius(m_radius * m_magn); - //t.transform(x, y); - } - - -} diff --git a/uppdev/aggdraw/agg_trans_warp_magnifier.h b/uppdev/aggdraw/agg_trans_warp_magnifier.h deleted file mode 100644 index d80f71152..000000000 --- a/uppdev/aggdraw/agg_trans_warp_magnifier.h +++ /dev/null @@ -1,65 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_WARP_MAGNIFIER_INCLUDED -#define AGG_WARP_MAGNIFIER_INCLUDED - - -namespace agg -{ - - //----------------------------------------------------trans_warp_magnifier - // - // See Inmplementation agg_trans_warp_magnifier.cpp - // - class trans_warp_magnifier - { - public: - trans_warp_magnifier() : m_xc(0.0), m_yc(0.0), m_magn(1.0), m_radius(1.0) {} - - void center(double x, double y) { m_xc = x; m_yc = y; } - void magnification(double m) { m_magn = m; } - void radius(double r) { m_radius = r; } - - double xc() const { return m_xc; } - double yc() const { return m_yc; } - double magnification() const { return m_magn; } - double radius() const { return m_radius; } - - void transform(double* x, double* y) const; - void inverse_transform(double* x, double* y) const; - - private: - double m_xc; - double m_yc; - double m_magn; - double m_radius; - }; - - -} - - -#endif - diff --git a/uppdev/aggdraw/agg_vcgen_bspline.cpp b/uppdev/aggdraw/agg_vcgen_bspline.cpp deleted file mode 100644 index 4483f612e..000000000 --- a/uppdev/aggdraw/agg_vcgen_bspline.cpp +++ /dev/null @@ -1,203 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#include "agg_vcgen_bspline.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - vcgen_bspline::vcgen_bspline() : - m_src_vertices(), - m_spline_x(), - m_spline_y(), - m_interpolation_step(1.0/50.0), - m_closed(0), - m_status(initial), - m_src_vertex(0) - { - } - - - //------------------------------------------------------------------------ - void vcgen_bspline::remove_all() - { - m_src_vertices.remove_all(); - m_closed = 0; - m_status = initial; - m_src_vertex = 0; - } - - - //------------------------------------------------------------------------ - void vcgen_bspline::add_vertex(double x, double y, unsigned cmd) - { - m_status = initial; - if(is_move_to(cmd)) - { - m_src_vertices.modify_last(point_d(x, y)); - } - else - { - if(is_vertex(cmd)) - { - m_src_vertices.add(point_d(x, y)); - } - else - { - m_closed = get_close_flag(cmd); - } - } - } - - - //------------------------------------------------------------------------ - void vcgen_bspline::rewind(unsigned) - { - m_cur_abscissa = 0.0; - m_max_abscissa = 0.0; - m_src_vertex = 0; - if(m_status == initial && m_src_vertices.size() > 2) - { - if(m_closed) - { - m_spline_x.init(m_src_vertices.size() + 8); - m_spline_y.init(m_src_vertices.size() + 8); - m_spline_x.add_point(0.0, m_src_vertices.prev(m_src_vertices.size() - 3).x); - m_spline_y.add_point(0.0, m_src_vertices.prev(m_src_vertices.size() - 3).y); - m_spline_x.add_point(1.0, m_src_vertices[m_src_vertices.size() - 3].x); - m_spline_y.add_point(1.0, m_src_vertices[m_src_vertices.size() - 3].y); - m_spline_x.add_point(2.0, m_src_vertices[m_src_vertices.size() - 2].x); - m_spline_y.add_point(2.0, m_src_vertices[m_src_vertices.size() - 2].y); - m_spline_x.add_point(3.0, m_src_vertices[m_src_vertices.size() - 1].x); - m_spline_y.add_point(3.0, m_src_vertices[m_src_vertices.size() - 1].y); - } - else - { - m_spline_x.init(m_src_vertices.size()); - m_spline_y.init(m_src_vertices.size()); - } - unsigned i; - for(i = 0; i < m_src_vertices.size(); i++) - { - double x = m_closed ? i + 4 : i; - m_spline_x.add_point(x, m_src_vertices[i].x); - m_spline_y.add_point(x, m_src_vertices[i].y); - } - m_cur_abscissa = 0.0; - m_max_abscissa = m_src_vertices.size() - 1; - if(m_closed) - { - m_cur_abscissa = 4.0; - m_max_abscissa += 5.0; - m_spline_x.add_point(m_src_vertices.size() + 4, m_src_vertices[0].x); - m_spline_y.add_point(m_src_vertices.size() + 4, m_src_vertices[0].y); - m_spline_x.add_point(m_src_vertices.size() + 5, m_src_vertices[1].x); - m_spline_y.add_point(m_src_vertices.size() + 5, m_src_vertices[1].y); - m_spline_x.add_point(m_src_vertices.size() + 6, m_src_vertices[2].x); - m_spline_y.add_point(m_src_vertices.size() + 6, m_src_vertices[2].y); - m_spline_x.add_point(m_src_vertices.size() + 7, m_src_vertices.next(2).x); - m_spline_y.add_point(m_src_vertices.size() + 7, m_src_vertices.next(2).y); - } - m_spline_x.prepare(); - m_spline_y.prepare(); - } - m_status = ready; - } - - - - - - - //------------------------------------------------------------------------ - unsigned vcgen_bspline::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_line_to; - while(!is_stop(cmd)) - { - switch(m_status) - { - case initial: - rewind(0); - - case ready: - if(m_src_vertices.size() < 2) - { - cmd = path_cmd_stop; - break; - } - - if(m_src_vertices.size() == 2) - { - *x = m_src_vertices[m_src_vertex].x; - *y = m_src_vertices[m_src_vertex].y; - m_src_vertex++; - if(m_src_vertex == 1) return path_cmd_move_to; - if(m_src_vertex == 2) return path_cmd_line_to; - cmd = path_cmd_stop; - break; - } - - cmd = path_cmd_move_to; - m_status = polygon; - m_src_vertex = 0; - - case polygon: - if(m_cur_abscissa >= m_max_abscissa) - { - if(m_closed) - { - m_status = end_poly; - break; - } - else - { - *x = m_src_vertices[m_src_vertices.size() - 1].x; - *y = m_src_vertices[m_src_vertices.size() - 1].y; - m_status = end_poly; - return path_cmd_line_to; - } - } - - *x = m_spline_x.get_stateful(m_cur_abscissa); - *y = m_spline_y.get_stateful(m_cur_abscissa); - m_src_vertex++; - m_cur_abscissa += m_interpolation_step; - return (m_src_vertex == 1) ? path_cmd_move_to : path_cmd_line_to; - - case end_poly: - m_status = stop; - return path_cmd_end_poly | m_closed; - - case stop: - return path_cmd_stop; - } - } - return cmd; - } - - -} - diff --git a/uppdev/aggdraw/agg_vcgen_bspline.h b/uppdev/aggdraw/agg_vcgen_bspline.h deleted file mode 100644 index d55dd0657..000000000 --- a/uppdev/aggdraw/agg_vcgen_bspline.h +++ /dev/null @@ -1,83 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_VCGEN_BSPLINE_INCLUDED -#define AGG_VCGEN_BSPLINE_INCLUDED - -#include "agg_basics.h" -#include "agg_array.h" -#include "agg_bspline.h" - - -namespace agg -{ - - //==========================================================vcgen_bspline - class vcgen_bspline - { - enum status_e - { - initial, - ready, - polygon, - end_poly, - stop - }; - - public: - typedef pod_bvector vertex_storage; - - vcgen_bspline(); - - void interpolation_step(double v) { m_interpolation_step = v; } - double interpolation_step() const { return m_interpolation_step; } - - // Vertex Generator Interface - void remove_all(); - void add_vertex(double x, double y, unsigned cmd); - - // Vertex Source Interface - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - vcgen_bspline(const vcgen_bspline&); - const vcgen_bspline& operator = (const vcgen_bspline&); - - vertex_storage m_src_vertices; - bspline m_spline_x; - bspline m_spline_y; - double m_interpolation_step; - unsigned m_closed; - status_e m_status; - unsigned m_src_vertex; - double m_cur_abscissa; - double m_max_abscissa; - }; - -} - - -#endif - diff --git a/uppdev/aggdraw/agg_vcgen_contour.cpp b/uppdev/aggdraw/agg_vcgen_contour.cpp deleted file mode 100644 index 02c8b73ff..000000000 --- a/uppdev/aggdraw/agg_vcgen_contour.cpp +++ /dev/null @@ -1,170 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#include -#include "agg_vcgen_contour.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - vcgen_contour::vcgen_contour() : - m_stroker(), - m_width(1), - m_src_vertices(), - m_out_vertices(), - m_status(initial), - m_src_vertex(0), - m_closed(0), - m_orientation(0), - m_auto_detect(false) - { - } - - //------------------------------------------------------------------------ - void vcgen_contour::remove_all() - { - m_src_vertices.remove_all(); - m_closed = 0; - m_orientation = 0; - m_status = initial; - } - - //------------------------------------------------------------------------ - void vcgen_contour::add_vertex(double x, double y, unsigned cmd) - { - m_status = initial; - if(is_move_to(cmd)) - { - m_src_vertices.modify_last(vertex_dist(x, y)); - } - else - { - if(is_vertex(cmd)) - { - m_src_vertices.add(vertex_dist(x, y)); - } - else - { - if(is_end_poly(cmd)) - { - m_closed = get_close_flag(cmd); - if(m_orientation == path_flags_none) - { - m_orientation = get_orientation(cmd); - } - } - } - } - } - - //------------------------------------------------------------------------ - void vcgen_contour::rewind(unsigned) - { - if(m_status == initial) - { - m_src_vertices.close(true); - if(m_auto_detect) - { - if(!is_oriented(m_orientation)) - { - m_orientation = (calc_polygon_area(m_src_vertices) > 0.0) ? - path_flags_ccw : - path_flags_cw; - } - } - if(is_oriented(m_orientation)) - { - m_stroker.width(is_ccw(m_orientation) ? m_width : -m_width); - } - } - m_status = ready; - m_src_vertex = 0; - } - - //------------------------------------------------------------------------ - unsigned vcgen_contour::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_line_to; - while(!is_stop(cmd)) - { - switch(m_status) - { - case initial: - rewind(0); - - case ready: - if(m_src_vertices.size() < 2 + unsigned(m_closed != 0)) - { - cmd = path_cmd_stop; - break; - } - m_status = outline; - cmd = path_cmd_move_to; - m_src_vertex = 0; - m_out_vertex = 0; - - case outline: - if(m_src_vertex >= m_src_vertices.size()) - { - m_status = end_poly; - break; - } - m_stroker.calc_join(m_out_vertices, - m_src_vertices.prev(m_src_vertex), - m_src_vertices.curr(m_src_vertex), - m_src_vertices.next(m_src_vertex), - m_src_vertices.prev(m_src_vertex).dist, - m_src_vertices.curr(m_src_vertex).dist); - ++m_src_vertex; - m_status = out_vertices; - m_out_vertex = 0; - - case out_vertices: - if(m_out_vertex >= m_out_vertices.size()) - { - m_status = outline; - } - else - { - const point_d& c = m_out_vertices[m_out_vertex++]; - *x = c.x; - *y = c.y; - return cmd; - } - break; - - case end_poly: - if(!m_closed) return path_cmd_stop; - m_status = stop; - return path_cmd_end_poly | path_flags_close | path_flags_ccw; - - case stop: - return path_cmd_stop; - } - } - return cmd; - } - -} diff --git a/uppdev/aggdraw/agg_vcgen_contour.h b/uppdev/aggdraw/agg_vcgen_contour.h deleted file mode 100644 index 85ca00e3c..000000000 --- a/uppdev/aggdraw/agg_vcgen_contour.h +++ /dev/null @@ -1,103 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_VCGEN_CONTOUR_INCLUDED -#define AGG_VCGEN_CONTOUR_INCLUDED - -#include "agg_math_stroke.h" - -namespace agg -{ - - //----------------------------------------------------------vcgen_contour - // - // See Implementation agg_vcgen_contour.cpp - // - class vcgen_contour - { - enum status_e - { - initial, - ready, - outline, - out_vertices, - end_poly, - stop - }; - - public: - typedef vertex_sequence vertex_storage; - typedef pod_bvector coord_storage; - - vcgen_contour(); - - void line_cap(line_cap_e lc) { m_stroker.line_cap(lc); } - void line_join(line_join_e lj) { m_stroker.line_join(lj); } - void inner_join(inner_join_e ij) { m_stroker.inner_join(ij); } - - line_cap_e line_cap() const { return m_stroker.line_cap(); } - line_join_e line_join() const { return m_stroker.line_join(); } - inner_join_e inner_join() const { return m_stroker.inner_join(); } - - void width(double w) { m_stroker.width(m_width = w); } - void miter_limit(double ml) { m_stroker.miter_limit(ml); } - void miter_limit_theta(double t) { m_stroker.miter_limit_theta(t); } - void inner_miter_limit(double ml) { m_stroker.inner_miter_limit(ml); } - void approximation_scale(double as) { m_stroker.approximation_scale(as); } - - double width() const { return m_width; } - double miter_limit() const { return m_stroker.miter_limit(); } - double inner_miter_limit() const { return m_stroker.inner_miter_limit(); } - double approximation_scale() const { return m_stroker.approximation_scale(); } - - void auto_detect_orientation(bool v) { m_auto_detect = v; } - bool auto_detect_orientation() const { return m_auto_detect; } - - // Generator interface - void remove_all(); - void add_vertex(double x, double y, unsigned cmd); - - // Vertex Source Interface - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - vcgen_contour(const vcgen_contour&); - const vcgen_contour& operator = (const vcgen_contour&); - - math_stroke m_stroker; - double m_width; - vertex_storage m_src_vertices; - coord_storage m_out_vertices; - status_e m_status; - unsigned m_src_vertex; - unsigned m_out_vertex; - unsigned m_closed; - unsigned m_orientation; - bool m_auto_detect; - }; - -} - -#endif diff --git a/uppdev/aggdraw/agg_vcgen_dash.cpp b/uppdev/aggdraw/agg_vcgen_dash.cpp deleted file mode 100644 index 60d2f9ac9..000000000 --- a/uppdev/aggdraw/agg_vcgen_dash.cpp +++ /dev/null @@ -1,240 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#include -#include "agg_vcgen_dash.h" -#include "agg_shorten_path.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - vcgen_dash::vcgen_dash() : - m_total_dash_len(0.0), - m_num_dashes(0), - m_dash_start(0.0), - m_shorten(0.0), - m_curr_dash_start(0.0), - m_curr_dash(0), - m_src_vertices(), - m_closed(0), - m_status(initial), - m_src_vertex(0) - { - } - - - - //------------------------------------------------------------------------ - void vcgen_dash::remove_all_dashes() - { - m_total_dash_len = 0.0; - m_num_dashes = 0; - m_curr_dash_start = 0.0; - m_curr_dash = 0; - } - - - //------------------------------------------------------------------------ - void vcgen_dash::add_dash(double dash_len, double gap_len) - { - if(m_num_dashes < max_dashes) - { - m_total_dash_len += dash_len + gap_len; - m_dashes[m_num_dashes++] = dash_len; - m_dashes[m_num_dashes++] = gap_len; - } - } - - - //------------------------------------------------------------------------ - void vcgen_dash::dash_start(double ds) - { - m_dash_start = ds; - calc_dash_start(fabs(ds)); - } - - - //------------------------------------------------------------------------ - void vcgen_dash::calc_dash_start(double ds) - { - m_curr_dash = 0; - m_curr_dash_start = 0.0; - while(ds > 0.0) - { - if(ds > m_dashes[m_curr_dash]) - { - ds -= m_dashes[m_curr_dash]; - ++m_curr_dash; - m_curr_dash_start = 0.0; - if(m_curr_dash >= m_num_dashes) m_curr_dash = 0; - } - else - { - m_curr_dash_start = ds; - ds = 0.0; - } - } - } - - - //------------------------------------------------------------------------ - void vcgen_dash::remove_all() - { - m_status = initial; - m_src_vertices.remove_all(); - m_closed = 0; - } - - - //------------------------------------------------------------------------ - void vcgen_dash::add_vertex(double x, double y, unsigned cmd) - { - m_status = initial; - if(is_move_to(cmd)) - { - m_src_vertices.modify_last(vertex_dist(x, y)); - } - else - { - if(is_vertex(cmd)) - { - m_src_vertices.add(vertex_dist(x, y)); - } - else - { - m_closed = get_close_flag(cmd); - } - } - } - - - //------------------------------------------------------------------------ - void vcgen_dash::rewind(unsigned) - { - if(m_status == initial) - { - m_src_vertices.close(m_closed != 0); - shorten_path(m_src_vertices, m_shorten, m_closed); - } - m_status = ready; - m_src_vertex = 0; - } - - - //------------------------------------------------------------------------ - unsigned vcgen_dash::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_move_to; - while(!is_stop(cmd)) - { - switch(m_status) - { - case initial: - rewind(0); - - case ready: - if(m_num_dashes < 2 || m_src_vertices.size() < 2) - { - cmd = path_cmd_stop; - break; - } - m_status = polyline; - m_src_vertex = 1; - m_v1 = &m_src_vertices[0]; - m_v2 = &m_src_vertices[1]; - m_curr_rest = m_v1->dist; - *x = m_v1->x; - *y = m_v1->y; - if(m_dash_start >= 0.0) calc_dash_start(m_dash_start); - return path_cmd_move_to; - - case polyline: - { - double dash_rest = m_dashes[m_curr_dash] - m_curr_dash_start; - - unsigned cmd = (m_curr_dash & 1) ? - path_cmd_move_to : - path_cmd_line_to; - - if(m_curr_rest > dash_rest) - { - m_curr_rest -= dash_rest; - ++m_curr_dash; - if(m_curr_dash >= m_num_dashes) m_curr_dash = 0; - m_curr_dash_start = 0.0; - *x = m_v2->x - (m_v2->x - m_v1->x) * m_curr_rest / m_v1->dist; - *y = m_v2->y - (m_v2->y - m_v1->y) * m_curr_rest / m_v1->dist; - } - else - { - m_curr_dash_start += m_curr_rest; - *x = m_v2->x; - *y = m_v2->y; - ++m_src_vertex; - m_v1 = m_v2; - m_curr_rest = m_v1->dist; - if(m_closed) - { - if(m_src_vertex > m_src_vertices.size()) - { - m_status = stop; - } - else - { - m_v2 = &m_src_vertices - [ - (m_src_vertex >= m_src_vertices.size()) ? 0 : - m_src_vertex - ]; - } - } - else - { - if(m_src_vertex >= m_src_vertices.size()) - { - m_status = stop; - } - else - { - m_v2 = &m_src_vertices[m_src_vertex]; - } - } - } - return cmd; - } - break; - - case stop: - cmd = path_cmd_stop; - break; - } - - } - return path_cmd_stop; - } - - -} - diff --git a/uppdev/aggdraw/agg_vcgen_dash.h b/uppdev/aggdraw/agg_vcgen_dash.h deleted file mode 100644 index 8f195a230..000000000 --- a/uppdev/aggdraw/agg_vcgen_dash.h +++ /dev/null @@ -1,99 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_VCGEN_DASH_INCLUDED -#define AGG_VCGEN_DASH_INCLUDED - -#include "agg_basics.h" -#include "agg_vertex_sequence.h" - -namespace agg -{ - - //---------------------------------------------------------------vcgen_dash - // - // See Implementation agg_vcgen_dash.cpp - // - class vcgen_dash - { - enum max_dashes_e - { - max_dashes = 32 - }; - - enum status_e - { - initial, - ready, - polyline, - stop - }; - - public: - typedef vertex_sequence vertex_storage; - - vcgen_dash(); - - void remove_all_dashes(); - void add_dash(double dash_len, double gap_len); - void dash_start(double ds); - - void shorten(double s) { m_shorten = s; } - double shorten() const { return m_shorten; } - - // Vertex Generator Interface - void remove_all(); - void add_vertex(double x, double y, unsigned cmd); - - // Vertex Source Interface - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - vcgen_dash(const vcgen_dash&); - const vcgen_dash& operator = (const vcgen_dash&); - - void calc_dash_start(double ds); - - double m_dashes[max_dashes]; - double m_total_dash_len; - unsigned m_num_dashes; - double m_dash_start; - double m_shorten; - double m_curr_dash_start; - unsigned m_curr_dash; - double m_curr_rest; - const vertex_dist* m_v1; - const vertex_dist* m_v2; - - vertex_storage m_src_vertices; - unsigned m_closed; - status_e m_status; - unsigned m_src_vertex; - }; - - -} - -#endif diff --git a/uppdev/aggdraw/agg_vcgen_markers_term.cpp b/uppdev/aggdraw/agg_vcgen_markers_term.cpp deleted file mode 100644 index 5863691f6..000000000 --- a/uppdev/aggdraw/agg_vcgen_markers_term.cpp +++ /dev/null @@ -1,108 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#include "agg_vcgen_markers_term.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - void vcgen_markers_term::remove_all() - { - m_markers.remove_all(); - } - - - //------------------------------------------------------------------------ - void vcgen_markers_term::add_vertex(double x, double y, unsigned cmd) - { - if(is_move_to(cmd)) - { - if(m_markers.size() & 1) - { - // Initial state, the first coordinate was added. - // If two of more calls of start_vertex() occures - // we just modify the last one. - m_markers.modify_last(coord_type(x, y)); - } - else - { - m_markers.add(coord_type(x, y)); - } - } - else - { - if(is_vertex(cmd)) - { - if(m_markers.size() & 1) - { - // Initial state, the first coordinate was added. - // Add three more points, 0,1,1,0 - m_markers.add(coord_type(x, y)); - m_markers.add(m_markers[m_markers.size() - 1]); - m_markers.add(m_markers[m_markers.size() - 3]); - } - else - { - if(m_markers.size()) - { - // Replace two last points: 0,1,1,0 -> 0,1,2,1 - m_markers[m_markers.size() - 1] = m_markers[m_markers.size() - 2]; - m_markers[m_markers.size() - 2] = coord_type(x, y); - } - } - } - } - } - - - //------------------------------------------------------------------------ - void vcgen_markers_term::rewind(unsigned path_id) - { - m_curr_id = path_id * 2; - m_curr_idx = m_curr_id; - } - - - //------------------------------------------------------------------------ - unsigned vcgen_markers_term::vertex(double* x, double* y) - { - if(m_curr_id > 2 || m_curr_idx >= m_markers.size()) - { - return path_cmd_stop; - } - const coord_type& c = m_markers[m_curr_idx]; - *x = c.x; - *y = c.y; - if(m_curr_idx & 1) - { - m_curr_idx += 3; - return path_cmd_line_to; - } - ++m_curr_idx; - return path_cmd_move_to; - } - - -} diff --git a/uppdev/aggdraw/agg_vcgen_markers_term.h b/uppdev/aggdraw/agg_vcgen_markers_term.h deleted file mode 100644 index b4abc22ca..000000000 --- a/uppdev/aggdraw/agg_vcgen_markers_term.h +++ /dev/null @@ -1,75 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_VCGEN_MARKERS_TERM_INCLUDED -#define AGG_VCGEN_MARKERS_TERM_INCLUDED - -#include "agg_basics.h" -#include "agg_vertex_sequence.h" - -namespace agg -{ - - //======================================================vcgen_markers_term - // - // See Implemantation agg_vcgen_markers_term.cpp - // Terminal markers generator (arrowhead/arrowtail) - // - //------------------------------------------------------------------------ - class vcgen_markers_term - { - public: - vcgen_markers_term() : m_curr_id(0), m_curr_idx(0) {} - - // Vertex Generator Interface - void remove_all(); - void add_vertex(double x, double y, unsigned cmd); - - // Vertex Source Interface - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - vcgen_markers_term(const vcgen_markers_term&); - const vcgen_markers_term& operator = (const vcgen_markers_term&); - - struct coord_type - { - double x, y; - - coord_type() {} - coord_type(double x_, double y_) : x(x_), y(y_) {} - }; - - typedef pod_bvector coord_storage; - - coord_storage m_markers; - unsigned m_curr_id; - unsigned m_curr_idx; - }; - - -} - -#endif diff --git a/uppdev/aggdraw/agg_vcgen_smooth_poly1.cpp b/uppdev/aggdraw/agg_vcgen_smooth_poly1.cpp deleted file mode 100644 index 359768aa7..000000000 --- a/uppdev/aggdraw/agg_vcgen_smooth_poly1.cpp +++ /dev/null @@ -1,230 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#include "agg_vcgen_smooth_poly1.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - vcgen_smooth_poly1::vcgen_smooth_poly1() : - m_src_vertices(), - m_smooth_value(0.5), - m_closed(0), - m_status(initial), - m_src_vertex(0) - { - } - - - //------------------------------------------------------------------------ - void vcgen_smooth_poly1::remove_all() - { - m_src_vertices.remove_all(); - m_closed = 0; - m_status = initial; - } - - - //------------------------------------------------------------------------ - void vcgen_smooth_poly1::add_vertex(double x, double y, unsigned cmd) - { - m_status = initial; - if(is_move_to(cmd)) - { - m_src_vertices.modify_last(vertex_dist(x, y)); - } - else - { - if(is_vertex(cmd)) - { - m_src_vertices.add(vertex_dist(x, y)); - } - else - { - m_closed = get_close_flag(cmd); - } - } - } - - - //------------------------------------------------------------------------ - void vcgen_smooth_poly1::rewind(unsigned) - { - if(m_status == initial) - { - m_src_vertices.close(m_closed != 0); - } - m_status = ready; - m_src_vertex = 0; - } - - - //------------------------------------------------------------------------ - void vcgen_smooth_poly1::calculate(const vertex_dist& v0, - const vertex_dist& v1, - const vertex_dist& v2, - const vertex_dist& v3) - { - - double k1 = v0.dist / (v0.dist + v1.dist); - double k2 = v1.dist / (v1.dist + v2.dist); - - double xm1 = v0.x + (v2.x - v0.x) * k1; - double ym1 = v0.y + (v2.y - v0.y) * k1; - double xm2 = v1.x + (v3.x - v1.x) * k2; - double ym2 = v1.y + (v3.y - v1.y) * k2; - - m_ctrl1_x = v1.x + m_smooth_value * (v2.x - xm1); - m_ctrl1_y = v1.y + m_smooth_value * (v2.y - ym1); - m_ctrl2_x = v2.x + m_smooth_value * (v1.x - xm2); - m_ctrl2_y = v2.y + m_smooth_value * (v1.y - ym2); - } - - - //------------------------------------------------------------------------ - unsigned vcgen_smooth_poly1::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_line_to; - while(!is_stop(cmd)) - { - switch(m_status) - { - case initial: - rewind(0); - - case ready: - if(m_src_vertices.size() < 2) - { - cmd = path_cmd_stop; - break; - } - - if(m_src_vertices.size() == 2) - { - *x = m_src_vertices[m_src_vertex].x; - *y = m_src_vertices[m_src_vertex].y; - m_src_vertex++; - if(m_src_vertex == 1) return path_cmd_move_to; - if(m_src_vertex == 2) return path_cmd_line_to; - cmd = path_cmd_stop; - break; - } - - cmd = path_cmd_move_to; - m_status = polygon; - m_src_vertex = 0; - - case polygon: - if(m_closed) - { - if(m_src_vertex >= m_src_vertices.size()) - { - *x = m_src_vertices[0].x; - *y = m_src_vertices[0].y; - m_status = end_poly; - return path_cmd_curve4; - } - } - else - { - if(m_src_vertex >= m_src_vertices.size() - 1) - { - *x = m_src_vertices[m_src_vertices.size() - 1].x; - *y = m_src_vertices[m_src_vertices.size() - 1].y; - m_status = end_poly; - return path_cmd_curve3; - } - } - - calculate(m_src_vertices.prev(m_src_vertex), - m_src_vertices.curr(m_src_vertex), - m_src_vertices.next(m_src_vertex), - m_src_vertices.next(m_src_vertex + 1)); - - *x = m_src_vertices[m_src_vertex].x; - *y = m_src_vertices[m_src_vertex].y; - m_src_vertex++; - - if(m_closed) - { - m_status = ctrl1; - return ((m_src_vertex == 1) ? - path_cmd_move_to : - path_cmd_curve4); - } - else - { - if(m_src_vertex == 1) - { - m_status = ctrl_b; - return path_cmd_move_to; - } - if(m_src_vertex >= m_src_vertices.size() - 1) - { - m_status = ctrl_e; - return path_cmd_curve3; - } - m_status = ctrl1; - return path_cmd_curve4; - } - break; - - case ctrl_b: - *x = m_ctrl2_x; - *y = m_ctrl2_y; - m_status = polygon; - return path_cmd_curve3; - - case ctrl_e: - *x = m_ctrl1_x; - *y = m_ctrl1_y; - m_status = polygon; - return path_cmd_curve3; - - case ctrl1: - *x = m_ctrl1_x; - *y = m_ctrl1_y; - m_status = ctrl2; - return path_cmd_curve4; - - case ctrl2: - *x = m_ctrl2_x; - *y = m_ctrl2_y; - m_status = polygon; - return path_cmd_curve4; - - case end_poly: - m_status = stop; - return path_cmd_end_poly | m_closed; - - case stop: - return path_cmd_stop; - } - } - return cmd; - } - -} - diff --git a/uppdev/aggdraw/agg_vcgen_smooth_poly1.h b/uppdev/aggdraw/agg_vcgen_smooth_poly1.h deleted file mode 100644 index 8e10823a5..000000000 --- a/uppdev/aggdraw/agg_vcgen_smooth_poly1.h +++ /dev/null @@ -1,96 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_VCGEN_SMOOTH_POLY1_INCLUDED -#define AGG_VCGEN_SMOOTH_POLY1_INCLUDED - -#include "agg_basics.h" -#include "agg_vertex_sequence.h" - - -namespace agg -{ - - //======================================================vcgen_smooth_poly1 - // - // See Implementation agg_vcgen_smooth_poly1.cpp - // Smooth polygon generator - // - //------------------------------------------------------------------------ - class vcgen_smooth_poly1 - { - enum status_e - { - initial, - ready, - polygon, - ctrl_b, - ctrl_e, - ctrl1, - ctrl2, - end_poly, - stop - }; - - public: - typedef vertex_sequence vertex_storage; - - vcgen_smooth_poly1(); - - void smooth_value(double v) { m_smooth_value = v * 0.5; } - double smooth_value() const { return m_smooth_value * 2.0; } - - // Vertex Generator Interface - void remove_all(); - void add_vertex(double x, double y, unsigned cmd); - - // Vertex Source Interface - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - vcgen_smooth_poly1(const vcgen_smooth_poly1&); - const vcgen_smooth_poly1& operator = (const vcgen_smooth_poly1&); - - void calculate(const vertex_dist& v0, - const vertex_dist& v1, - const vertex_dist& v2, - const vertex_dist& v3); - - vertex_storage m_src_vertices; - double m_smooth_value; - unsigned m_closed; - status_e m_status; - unsigned m_src_vertex; - double m_ctrl1_x; - double m_ctrl1_y; - double m_ctrl2_x; - double m_ctrl2_y; - }; - -} - - -#endif - diff --git a/uppdev/aggdraw/agg_vcgen_stroke.cpp b/uppdev/aggdraw/agg_vcgen_stroke.cpp deleted file mode 100644 index b36927bf3..000000000 --- a/uppdev/aggdraw/agg_vcgen_stroke.cpp +++ /dev/null @@ -1,219 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#include -#include "agg_vcgen_stroke.h" -#include "agg_shorten_path.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - vcgen_stroke::vcgen_stroke() : - m_stroker(), - m_src_vertices(), - m_out_vertices(), - m_shorten(0.0), - m_closed(0), - m_status(initial), - m_src_vertex(0), - m_out_vertex(0) - { - } - - //------------------------------------------------------------------------ - void vcgen_stroke::remove_all() - { - m_src_vertices.remove_all(); - m_closed = 0; - m_status = initial; - } - - - //------------------------------------------------------------------------ - void vcgen_stroke::add_vertex(double x, double y, unsigned cmd) - { - m_status = initial; - if(is_move_to(cmd)) - { - m_src_vertices.modify_last(vertex_dist(x, y)); - } - else - { - if(is_vertex(cmd)) - { - m_src_vertices.add(vertex_dist(x, y)); - } - else - { - m_closed = get_close_flag(cmd); - } - } - } - - //------------------------------------------------------------------------ - void vcgen_stroke::rewind(unsigned) - { - if(m_status == initial) - { - m_src_vertices.close(m_closed != 0); - shorten_path(m_src_vertices, m_shorten, m_closed); - if(m_src_vertices.size() < 3) m_closed = 0; - } - m_status = ready; - m_src_vertex = 0; - m_out_vertex = 0; - } - - - //------------------------------------------------------------------------ - unsigned vcgen_stroke::vertex(double* x, double* y) - { - unsigned cmd = path_cmd_line_to; - while(!is_stop(cmd)) - { - switch(m_status) - { - case initial: - rewind(0); - - case ready: - if(m_src_vertices.size() < 2 + unsigned(m_closed != 0)) - { - cmd = path_cmd_stop; - break; - } - m_status = m_closed ? outline1 : cap1; - cmd = path_cmd_move_to; - m_src_vertex = 0; - m_out_vertex = 0; - break; - - case cap1: - m_stroker.calc_cap(m_out_vertices, - m_src_vertices[0], - m_src_vertices[1], - m_src_vertices[0].dist); - m_src_vertex = 1; - m_prev_status = outline1; - m_status = out_vertices; - m_out_vertex = 0; - break; - - case cap2: - m_stroker.calc_cap(m_out_vertices, - m_src_vertices[m_src_vertices.size() - 1], - m_src_vertices[m_src_vertices.size() - 2], - m_src_vertices[m_src_vertices.size() - 2].dist); - m_prev_status = outline2; - m_status = out_vertices; - m_out_vertex = 0; - break; - - case outline1: - if(m_closed) - { - if(m_src_vertex >= m_src_vertices.size()) - { - m_prev_status = close_first; - m_status = end_poly1; - break; - } - } - else - { - if(m_src_vertex >= m_src_vertices.size() - 1) - { - m_status = cap2; - break; - } - } - m_stroker.calc_join(m_out_vertices, - m_src_vertices.prev(m_src_vertex), - m_src_vertices.curr(m_src_vertex), - m_src_vertices.next(m_src_vertex), - m_src_vertices.prev(m_src_vertex).dist, - m_src_vertices.curr(m_src_vertex).dist); - ++m_src_vertex; - m_prev_status = m_status; - m_status = out_vertices; - m_out_vertex = 0; - break; - - case close_first: - m_status = outline2; - cmd = path_cmd_move_to; - - case outline2: - if(m_src_vertex <= unsigned(m_closed == 0)) - { - m_status = end_poly2; - m_prev_status = stop; - break; - } - - --m_src_vertex; - m_stroker.calc_join(m_out_vertices, - m_src_vertices.next(m_src_vertex), - m_src_vertices.curr(m_src_vertex), - m_src_vertices.prev(m_src_vertex), - m_src_vertices.curr(m_src_vertex).dist, - m_src_vertices.prev(m_src_vertex).dist); - - m_prev_status = m_status; - m_status = out_vertices; - m_out_vertex = 0; - break; - - case out_vertices: - if(m_out_vertex >= m_out_vertices.size()) - { - m_status = m_prev_status; - } - else - { - const point_d& c = m_out_vertices[m_out_vertex++]; - *x = c.x; - *y = c.y; - return cmd; - } - break; - - case end_poly1: - m_status = m_prev_status; - return path_cmd_end_poly | path_flags_close | path_flags_ccw; - - case end_poly2: - m_status = m_prev_status; - return path_cmd_end_poly | path_flags_close | path_flags_cw; - - case stop: - cmd = path_cmd_stop; - break; - } - } - return cmd; - } - -} diff --git a/uppdev/aggdraw/agg_vcgen_stroke.h b/uppdev/aggdraw/agg_vcgen_stroke.h deleted file mode 100644 index e39afb8d5..000000000 --- a/uppdev/aggdraw/agg_vcgen_stroke.h +++ /dev/null @@ -1,111 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_VCGEN_STROKE_INCLUDED -#define AGG_VCGEN_STROKE_INCLUDED - -#include "agg_math_stroke.h" - - -namespace agg -{ - - //============================================================vcgen_stroke - // - // See Implementation agg_vcgen_stroke.cpp - // Stroke generator - // - //------------------------------------------------------------------------ - class vcgen_stroke - { - enum status_e - { - initial, - ready, - cap1, - cap2, - outline1, - close_first, - outline2, - out_vertices, - end_poly1, - end_poly2, - stop - }; - - public: - typedef vertex_sequence vertex_storage; - typedef pod_bvector coord_storage; - - vcgen_stroke(); - - void line_cap(line_cap_e lc) { m_stroker.line_cap(lc); } - void line_join(line_join_e lj) { m_stroker.line_join(lj); } - void inner_join(inner_join_e ij) { m_stroker.inner_join(ij); } - - line_cap_e line_cap() const { return m_stroker.line_cap(); } - line_join_e line_join() const { return m_stroker.line_join(); } - inner_join_e inner_join() const { return m_stroker.inner_join(); } - - void width(double w) { m_stroker.width(w); } - void miter_limit(double ml) { m_stroker.miter_limit(ml); } - void miter_limit_theta(double t) { m_stroker.miter_limit_theta(t); } - void inner_miter_limit(double ml) { m_stroker.inner_miter_limit(ml); } - void approximation_scale(double as) { m_stroker.approximation_scale(as); } - - double width() const { return m_stroker.width(); } - double miter_limit() const { return m_stroker.miter_limit(); } - double inner_miter_limit() const { return m_stroker.inner_miter_limit(); } - double approximation_scale() const { return m_stroker.approximation_scale(); } - - void shorten(double s) { m_shorten = s; } - double shorten() const { return m_shorten; } - - // Vertex Generator Interface - void remove_all(); - void add_vertex(double x, double y, unsigned cmd); - - // Vertex Source Interface - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - private: - vcgen_stroke(const vcgen_stroke&); - const vcgen_stroke& operator = (const vcgen_stroke&); - - math_stroke m_stroker; - vertex_storage m_src_vertices; - coord_storage m_out_vertices; - double m_shorten; - unsigned m_closed; - status_e m_status; - status_e m_prev_status; - unsigned m_src_vertex; - unsigned m_out_vertex; - }; - - -} - -#endif diff --git a/uppdev/aggdraw/agg_vcgen_vertex_sequence.h b/uppdev/aggdraw/agg_vcgen_vertex_sequence.h deleted file mode 100644 index af94f046b..000000000 --- a/uppdev/aggdraw/agg_vcgen_vertex_sequence.h +++ /dev/null @@ -1,144 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_VCGEN_VERTEX_SEQUENCE_INCLUDED -#define AGG_VCGEN_VERTEX_SEQUENCE_INCLUDED - -#include "agg_basics.h" -#include "agg_vertex_sequence.h" -#include "agg_shorten_path.h" - -namespace agg -{ - - //===================================================vcgen_vertex_sequence - class vcgen_vertex_sequence - { - public: - typedef vertex_dist_cmd vertex_type; - typedef vertex_sequence vertex_storage; - - vcgen_vertex_sequence() : - m_flags(0), - m_cur_vertex(0), - m_shorten(0.0), - m_ready(false) - { - } - - // Vertex Generator Interface - void remove_all(); - void add_vertex(double x, double y, unsigned cmd); - - // Vertex Source Interface - void rewind(unsigned path_id); - unsigned vertex(double* x, double* y); - - void shorten(double s) { m_shorten = s; } - double shorten() const { return m_shorten; } - - private: - vcgen_vertex_sequence(const vcgen_vertex_sequence&); - const vcgen_vertex_sequence& operator = (const vcgen_vertex_sequence&); - - vertex_storage m_src_vertices; - unsigned m_flags; - unsigned m_cur_vertex; - double m_shorten; - bool m_ready; - }; - - - //------------------------------------------------------------------------ - inline void vcgen_vertex_sequence::remove_all() - { - m_ready = false; - m_src_vertices.remove_all(); - m_cur_vertex = 0; - m_flags = 0; - } - - //------------------------------------------------------------------------ - inline void vcgen_vertex_sequence::add_vertex(double x, double y, unsigned cmd) - { - m_ready = false; - if(is_move_to(cmd)) - { - m_src_vertices.modify_last(vertex_dist_cmd(x, y, cmd)); - } - else - { - if(is_vertex(cmd)) - { - m_src_vertices.add(vertex_dist_cmd(x, y, cmd)); - } - else - { - m_flags = cmd & path_flags_mask; - } - } - } - - - //------------------------------------------------------------------------ - inline void vcgen_vertex_sequence::rewind(unsigned) - { - if(!m_ready) - { - m_src_vertices.close(is_closed(m_flags)); - shorten_path(m_src_vertices, m_shorten, get_close_flag(m_flags)); - } - m_ready = true; - m_cur_vertex = 0; - } - - //------------------------------------------------------------------------ - inline unsigned vcgen_vertex_sequence::vertex(double* x, double* y) - { - if(!m_ready) - { - rewind(0); - } - - if(m_cur_vertex == m_src_vertices.size()) - { - ++m_cur_vertex; - return path_cmd_end_poly | m_flags; - } - - if(m_cur_vertex > m_src_vertices.size()) - { - return path_cmd_stop; - } - - vertex_type& v = m_src_vertices[m_cur_vertex++]; - *x = v.x; - *y = v.y; - return v.cmd; - } - - -} - -#endif diff --git a/uppdev/aggdraw/agg_vertex_sequence.h b/uppdev/aggdraw/agg_vertex_sequence.h deleted file mode 100644 index 9125577de..000000000 --- a/uppdev/aggdraw/agg_vertex_sequence.h +++ /dev/null @@ -1,178 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_VERTEX_SEQUENCE_INCLUDED -#define AGG_VERTEX_SEQUENCE_INCLUDED - -#include "agg_basics.h" -#include "agg_array.h" -#include "agg_math.h" - -namespace agg -{ - - //----------------------------------------------------------vertex_sequence - // Modified agg::pod_bvector. The data is interpreted as a sequence - // of vertices. It means that the type T must expose: - // - // bool T::operator() (const T& val) - // - // that is called every time new vertex is being added. The main purpose - // of this operator is the possibility to calculate some values during - // adding and to return true if the vertex fits some criteria or false if - // it doesn't. In the last case the new vertex is not added. - // - // The simple example is filtering coinciding vertices with calculation - // of the distance between the current and previous ones: - // - // struct vertex_dist - // { - // double x; - // double y; - // double dist; - // - // vertex_dist() {} - // vertex_dist(double x_, double y_) : - // x(x_), - // y(y_), - // dist(0.0) - // { - // } - // - // bool operator () (const vertex_dist& val) - // { - // return (dist = calc_distance(x, y, val.x, val.y)) > EPSILON; - // } - // }; - // - // Function close() calls this operator and removes the last vertex if - // necessary. - //------------------------------------------------------------------------ - template - class vertex_sequence : public pod_bvector - { - public: - typedef pod_bvector base_type; - - void add(const T& val); - void modify_last(const T& val); - void close(bool remove_flag); - }; - - - - //------------------------------------------------------------------------ - template - void vertex_sequence::add(const T& val) - { - if(base_type::size() > 1) - { - if(!(*this)[base_type::size() - 2]((*this)[base_type::size() - 1])) - { - base_type::remove_last(); - } - } - base_type::add(val); - } - - - //------------------------------------------------------------------------ - template - void vertex_sequence::modify_last(const T& val) - { - base_type::remove_last(); - add(val); - } - - - - //------------------------------------------------------------------------ - template - void vertex_sequence::close(bool closed) - { - while(base_type::size() > 1) - { - if((*this)[base_type::size() - 2]((*this)[base_type::size() - 1])) break; - T t = (*this)[base_type::size() - 1]; - base_type::remove_last(); - modify_last(t); - } - - if(closed) - { - while(base_type::size() > 1) - { - if((*this)[base_type::size() - 1]((*this)[0])) break; - base_type::remove_last(); - } - } - } - - - //-------------------------------------------------------------vertex_dist - // Vertex (x, y) with the distance to the next one. The last vertex has - // distance between the last and the first points if the polygon is closed - // and 0.0 if it's a polyline. - struct vertex_dist - { - double x; - double y; - double dist; - - vertex_dist() {} - vertex_dist(double x_, double y_) : - x(x_), - y(y_), - dist(0.0) - { - } - - bool operator () (const vertex_dist& val) - { - bool ret = (dist = calc_distance(x, y, val.x, val.y)) > vertex_dist_epsilon; - if(!ret) dist = 1.0 / vertex_dist_epsilon; - return ret; - } - }; - - - - //--------------------------------------------------------vertex_dist_cmd - // Save as the above but with additional "command" value - struct vertex_dist_cmd : public vertex_dist - { - unsigned cmd; - - vertex_dist_cmd() {} - vertex_dist_cmd(double x_, double y_, unsigned cmd_) : - vertex_dist(x_, y_), - cmd(cmd_) - { - } - }; - - -} - -#endif diff --git a/uppdev/aggdraw/agg_vpgen_clip_polygon.cpp b/uppdev/aggdraw/agg_vpgen_clip_polygon.cpp deleted file mode 100644 index 2e9502ce0..000000000 --- a/uppdev/aggdraw/agg_vpgen_clip_polygon.cpp +++ /dev/null @@ -1,142 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#include "agg_vpgen_clip_polygon.h" -#include "agg_clip_liang_barsky.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - // Determine the clipping code of the vertex according to the - // Cyrus-Beck line clipping algorithm - // - // | | - // 0110 | 0010 | 0011 - // | | - // -------+--------+-------- clip_box.y2 - // | | - // 0100 | 0000 | 0001 - // | | - // -------+--------+-------- clip_box.y1 - // | | - // 1100 | 1000 | 1001 - // | | - // clip_box.x1 clip_box.x2 - // - // - unsigned vpgen_clip_polygon::clipping_flags(double x, double y) - { - if(x < m_clip_box.x1) - { - if(y > m_clip_box.y2) return 6; - if(y < m_clip_box.y1) return 12; - return 4; - } - - if(x > m_clip_box.x2) - { - if(y > m_clip_box.y2) return 3; - if(y < m_clip_box.y1) return 9; - return 1; - } - - if(y > m_clip_box.y2) return 2; - if(y < m_clip_box.y1) return 8; - - return 0; - } - - //---------------------------------------------------------------------------- - void vpgen_clip_polygon::reset() - { - m_vertex = 0; - m_num_vertices = 0; - } - - //---------------------------------------------------------------------------- - void vpgen_clip_polygon::move_to(double x, double y) - { - m_vertex = 0; - m_num_vertices = 0; - m_clip_flags = clipping_flags(x, y); - if(m_clip_flags == 0) - { - m_x[0] = x; - m_y[0] = y; - m_num_vertices = 1; - } - m_x1 = x; - m_y1 = y; - m_cmd = path_cmd_move_to; - } - - - //---------------------------------------------------------------------------- - void vpgen_clip_polygon::line_to(double x, double y) - { - m_vertex = 0; - m_num_vertices = 0; - unsigned flags = clipping_flags(x, y); - - if(m_clip_flags == flags) - { - if(flags == 0) - { - m_x[0] = x; - m_y[0] = y; - m_num_vertices = 1; - } - } - else - { - m_num_vertices = clip_liang_barsky(m_x1, m_y1, - x, y, - m_clip_box, - m_x, m_y); - } - - m_clip_flags = flags; - m_x1 = x; - m_y1 = y; - } - - - //---------------------------------------------------------------------------- - unsigned vpgen_clip_polygon::vertex(double* x, double* y) - { - if(m_vertex < m_num_vertices) - { - *x = m_x[m_vertex]; - *y = m_y[m_vertex]; - ++m_vertex; - unsigned cmd = m_cmd; - m_cmd = path_cmd_line_to; - return cmd; - } - return path_cmd_stop; - } - - -} diff --git a/uppdev/aggdraw/agg_vpgen_clip_polygon.h b/uppdev/aggdraw/agg_vpgen_clip_polygon.h deleted file mode 100644 index f5e791ebc..000000000 --- a/uppdev/aggdraw/agg_vpgen_clip_polygon.h +++ /dev/null @@ -1,92 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_VPGEN_CLIP_POLYGON_INCLUDED -#define AGG_VPGEN_CLIP_POLYGON_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - - //======================================================vpgen_clip_polygon - // - // See Implementation agg_vpgen_clip_polygon.cpp - // - class vpgen_clip_polygon - { - public: - vpgen_clip_polygon() : - m_clip_box(0, 0, 1, 1), - m_x1(0), - m_y1(0), - m_clip_flags(0), - m_num_vertices(0), - m_vertex(0), - m_cmd(path_cmd_move_to) - { - } - - void clip_box(double x1, double y1, double x2, double y2) - { - m_clip_box.x1 = x1; - m_clip_box.y1 = y1; - m_clip_box.x2 = x2; - m_clip_box.y2 = y2; - m_clip_box.normalize(); - } - - - double x1() const { return m_clip_box.x1; } - double y1() const { return m_clip_box.y1; } - double x2() const { return m_clip_box.x2; } - double y2() const { return m_clip_box.y2; } - - static bool auto_close() { return true; } - static bool auto_unclose() { return false; } - - void reset(); - void move_to(double x, double y); - void line_to(double x, double y); - unsigned vertex(double* x, double* y); - - private: - unsigned clipping_flags(double x, double y); - - private: - rect_d m_clip_box; - double m_x1; - double m_y1; - unsigned m_clip_flags; - double m_x[4]; - double m_y[4]; - unsigned m_num_vertices; - unsigned m_vertex; - unsigned m_cmd; - }; - -} - - -#endif diff --git a/uppdev/aggdraw/agg_vpgen_clip_polyline.cpp b/uppdev/aggdraw/agg_vpgen_clip_polyline.cpp deleted file mode 100644 index 9b2f72680..000000000 --- a/uppdev/aggdraw/agg_vpgen_clip_polyline.cpp +++ /dev/null @@ -1,86 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#include "agg_vpgen_clip_polyline.h" -#include "agg_clip_liang_barsky.h" - -namespace agg -{ - //---------------------------------------------------------------------------- - void vpgen_clip_polyline::reset() - { - m_vertex = 0; - m_num_vertices = 0; - m_move_to = false; - } - - //---------------------------------------------------------------------------- - void vpgen_clip_polyline::move_to(double x, double y) - { - m_vertex = 0; - m_num_vertices = 0; - m_x1 = x; - m_y1 = y; - m_move_to = true; - } - - //---------------------------------------------------------------------------- - void vpgen_clip_polyline::line_to(double x, double y) - { - double x2 = x; - double y2 = y; - unsigned flags = clip_line_segment(&m_x1, &m_y1, &x2, &y2, m_clip_box); - - m_vertex = 0; - m_num_vertices = 0; - if((flags & 4) == 0) - { - if((flags & 1) != 0 || m_move_to) - { - m_x[0] = m_x1; - m_y[0] = m_y1; - m_cmd[0] = path_cmd_move_to; - m_num_vertices = 1; - } - m_x[m_num_vertices] = x2; - m_y[m_num_vertices] = y2; - m_cmd[m_num_vertices++] = path_cmd_line_to; - m_move_to = (flags & 2) != 0; - } - m_x1 = x; - m_y1 = y; - } - - //---------------------------------------------------------------------------- - unsigned vpgen_clip_polyline::vertex(double* x, double* y) - { - if(m_vertex < m_num_vertices) - { - *x = m_x[m_vertex]; - *y = m_y[m_vertex]; - return m_cmd[m_vertex++]; - } - return path_cmd_stop; - } -} diff --git a/uppdev/aggdraw/agg_vpgen_clip_polyline.h b/uppdev/aggdraw/agg_vpgen_clip_polyline.h deleted file mode 100644 index 31ab16e10..000000000 --- a/uppdev/aggdraw/agg_vpgen_clip_polyline.h +++ /dev/null @@ -1,87 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_VPGEN_CLIP_POLYLINE_INCLUDED -#define AGG_VPGEN_CLIP_POLYLINE_INCLUDED - -#include "agg_basics.h" - -namespace agg -{ - - //======================================================vpgen_clip_polyline - // - // See Implementation agg_vpgen_clip_polyline.cpp - // - class vpgen_clip_polyline - { - public: - vpgen_clip_polyline() : - m_clip_box(0, 0, 1, 1), - m_x1(0), - m_y1(0), - m_num_vertices(0), - m_vertex(0), - m_move_to(false) - { - } - - void clip_box(double x1, double y1, double x2, double y2) - { - m_clip_box.x1 = x1; - m_clip_box.y1 = y1; - m_clip_box.x2 = x2; - m_clip_box.y2 = y2; - m_clip_box.normalize(); - } - - double x1() const { return m_clip_box.x1; } - double y1() const { return m_clip_box.y1; } - double x2() const { return m_clip_box.x2; } - double y2() const { return m_clip_box.y2; } - - static bool auto_close() { return false; } - static bool auto_unclose() { return true; } - - void reset(); - void move_to(double x, double y); - void line_to(double x, double y); - unsigned vertex(double* x, double* y); - - private: - rect_d m_clip_box; - double m_x1; - double m_y1; - double m_x[2]; - double m_y[2]; - unsigned m_cmd[2]; - unsigned m_num_vertices; - unsigned m_vertex; - bool m_move_to; - }; - -} - - -#endif diff --git a/uppdev/aggdraw/agg_vpgen_segmentator.cpp b/uppdev/aggdraw/agg_vpgen_segmentator.cpp deleted file mode 100644 index eb5df3f34..000000000 --- a/uppdev/aggdraw/agg_vpgen_segmentator.cpp +++ /dev/null @@ -1,76 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#include -#include "agg_vpgen_segmentator.h" - -namespace agg -{ - - void vpgen_segmentator::move_to(double x, double y) - { - m_x1 = x; - m_y1 = y; - m_dx = 0.0; - m_dy = 0.0; - m_dl = 2.0; - m_ddl = 2.0; - m_cmd = path_cmd_move_to; - } - - void vpgen_segmentator::line_to(double x, double y) - { - m_x1 += m_dx; - m_y1 += m_dy; - m_dx = x - m_x1; - m_dy = y - m_y1; - double len = sqrt(m_dx * m_dx + m_dy * m_dy) * m_approximation_scale; - if(len < 1e-30) len = 1e-30; - m_ddl = 1.0 / len; - m_dl = (m_cmd == path_cmd_move_to) ? 0.0 : m_ddl; - if(m_cmd == path_cmd_stop) m_cmd = path_cmd_line_to; - } - - unsigned vpgen_segmentator::vertex(double* x, double* y) - { - if(m_cmd == path_cmd_stop) return path_cmd_stop; - - unsigned cmd = m_cmd; - m_cmd = path_cmd_line_to; - if(m_dl >= 1.0 - m_ddl) - { - m_dl = 1.0; - m_cmd = path_cmd_stop; - *x = m_x1 + m_dx; - *y = m_y1 + m_dy; - return cmd; - } - *x = m_x1 + m_dx * m_dl; - *y = m_y1 + m_dy * m_dl; - m_dl += m_ddl; - return cmd; - } - -} - diff --git a/uppdev/aggdraw/agg_vpgen_segmentator.h b/uppdev/aggdraw/agg_vpgen_segmentator.h deleted file mode 100644 index eba6052a6..000000000 --- a/uppdev/aggdraw/agg_vpgen_segmentator.h +++ /dev/null @@ -1,70 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_VPGEN_SEGMENTATOR_INCLUDED -#define AGG_VPGEN_SEGMENTATOR_INCLUDED - -#include -#include "agg_basics.h" - -namespace agg -{ - - //=======================================================vpgen_segmentator - // - // See Implementation agg_vpgen_segmentator.cpp - // - class vpgen_segmentator - { - public: - vpgen_segmentator() : m_approximation_scale(1.0) {} - - void approximation_scale(double s) { m_approximation_scale = s; } - double approximation_scale() const { return m_approximation_scale; } - - static bool auto_close() { return false; } - static bool auto_unclose() { return false; } - - void reset() { m_cmd = path_cmd_stop; } - void move_to(double x, double y); - void line_to(double x, double y); - unsigned vertex(double* x, double* y); - - private: - double m_approximation_scale; - double m_x1; - double m_y1; - double m_dx; - double m_dy; - double m_dl; - double m_ddl; - unsigned m_cmd; - }; - - - -} - -#endif - diff --git a/uppdev/aggdraw/aggdraw.cpp b/uppdev/aggdraw/aggdraw.cpp deleted file mode 100644 index a01d4ac69..000000000 --- a/uppdev/aggdraw/aggdraw.cpp +++ /dev/null @@ -1,111 +0,0 @@ -#include "aggdraw.h" - -#include -/* -#include "agg_basics.h" -#include "agg_rendering_buffer.h" -#include "agg_rasterizer_scanline_aa.h" -#include "agg_renderer_primitives.h" -#include "agg_renderer_scanline.h" - -#include "agg_scanline_p.h" -#include "agg_renderer_scanline.h" -#include "agg_pixfmt_rgb.h" -#include "agg_pixfmt_rgba.h" -#include "agg_gamma_lut.h" -#include "agg_conv_dash.h" -#include "agg_conv_stroke.h" -#include "agg_span_gradient.h" -#include "agg_span_interpolator_linear.h" -#include "agg_span_gouraud_rgba.h" -#include "agg_span_allocator.h" -#include "agg_conv_stroke.h" -#include "agg_path_storage.h"*/ - -#define LLOG(a) LOG(a) -#if defined(CPU_64) -#endif -namespace Upp -{ - typedef agg::pixfmt_bgra32 pixfmt_type; - typedef agg::renderer_base renderer_base_type; - typedef agg::renderer_scanline_aa_solid renderer_aa; //renderer_solid - typedef agg::scanline_p8 scanline_type; - typedef agg::rasterizer_scanline_aa<> rasterizer_type; - - - struct AggDraw::AggDrawPrivate - { - AggDrawPrivate(int cx, int cy) - : buff(cx,cy) - , rbuf((agg::int8u *)buff[0], cx, cy, cx * 4) - , pixf(rbuf) - , ren_base(pixf) - , ren_aa(ren_base) - { - ren_base.clear(agg::rgba(1, 1, 1)); - } - - ImageBuffer buff; - agg::rendering_buffer rbuf; - pixfmt_type pixf; - renderer_base_type ren_base; - renderer_aa ren_aa; - rasterizer_type ras_aa; - scanline_type sl; - scanline_type m_sl_p8; - }; - - AggDraw::AggDraw(int cx, int cy) - : data ( new AggDrawPrivate(cx,cy)) - {} - - AggDraw::AggDraw(Size sz) - : data ( new AggDrawPrivate(sz.cx,sz.cy)) - {} - - - AggDraw::~AggDraw() - { - delete data; - } - - - void AggDraw::BeginOp() - { - LLOG("AGG:BeginOP"); - } - - void AggDraw::EndOp() - { - LLOG("AGG:EndOP"); - } - - inline agg::rgba8 AGGColor(Color c) { return agg::rgba8(c.GetR(),c.GetB(),c.GetG());} - - void AggDraw::DrawLineOp(int x1, int y1, int x2, int y2, int width, Color color) - { - data->ren_aa.color(agg::rgba((double)color.GetR()/ 256, (double)color.GetG()/256, (double)color.GetB()/256)); - data->ras_aa.move_to(x1,y1); - data->ras_aa.line_to(x2,y2); - - agg::path_storage path; - path.move_to(x1, y1); - path.line_to(x2, y2); - - agg::conv_stroke stroke(path); - stroke.line_cap(agg::round_cap); - stroke.width(width); - data->ras_aa.add_path(stroke); - } - - - AggDraw::operator Image() - { - agg::render_scanlines(data->ras_aa, data->m_sl_p8, data->ren_aa); - return data->buff; - } - - -} - diff --git a/uppdev/aggdraw/aggdraw.h b/uppdev/aggdraw/aggdraw.h deleted file mode 100644 index 1ec45c089..000000000 --- a/uppdev/aggdraw/aggdraw.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef _PinA_aggdraw_h_ -#define _PinA_aggdraw_h_ - -#include - -// Testing svn rev 329... - -namespace Upp -{ - class AggDraw : public Draw - { - public: - - AggDraw(int cx, int cy); - AggDraw(Size sz); - ~AggDraw(); - - virtual void BeginOp(); - virtual void EndOp(); - virtual void DrawLineOp(int x1, int y1, int x2, int y2, int width, Color color); - - operator Image(); - - private: - - struct AggDrawPrivate; - AggDrawPrivate * data; - - }; -} -#endif diff --git a/uppdev/aggdraw/aggdraw.upp b/uppdev/aggdraw/aggdraw.upp deleted file mode 100644 index e3dc17743..000000000 --- a/uppdev/aggdraw/aggdraw.upp +++ /dev/null @@ -1,13 +0,0 @@ -uses - Core, - Draw, - plugin\agg24; - -file - AggDraw readonly separator, - aggdraw.h, - aggdraw.cpp; - -mainconfig - "" = "DLL GUI"; - diff --git a/uppdev/aggdraw/platform/X11/agg_platform_support.cpp b/uppdev/aggdraw/platform/X11/agg_platform_support.cpp deleted file mode 100644 index f7d907eff..000000000 --- a/uppdev/aggdraw/platform/X11/agg_platform_support.cpp +++ /dev/null @@ -1,1300 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "agg_basics.h" -#include "util/agg_color_conv_rgb8.h" -#include "platform/agg_platform_support.h" - - -namespace agg -{ - //------------------------------------------------------------------------ - class platform_specific - { - public: - platform_specific(pix_format_e format, bool flip_y); - ~platform_specific(); - - void caption(const char* capt); - void put_image(const rendering_buffer* src); - - pix_format_e m_format; - pix_format_e m_sys_format; - int m_byte_order; - bool m_flip_y; - unsigned m_bpp; - unsigned m_sys_bpp; - Display* m_display; - int m_screen; - int m_depth; - Visual* m_visual; - Window m_window; - GC m_gc; - XImage* m_ximg_window; - XSetWindowAttributes m_window_attributes; - Atom m_close_atom; - unsigned char* m_buf_window; - unsigned char* m_buf_img[platform_support::max_images]; - unsigned m_keymap[256]; - - bool m_update_flag; - bool m_resize_flag; - bool m_initialized; - //bool m_wait_mode; - clock_t m_sw_start; - }; - - - - //------------------------------------------------------------------------ - platform_specific::platform_specific(pix_format_e format, bool flip_y) : - m_format(format), - m_sys_format(pix_format_undefined), - m_byte_order(LSBFirst), - m_flip_y(flip_y), - m_bpp(0), - m_sys_bpp(0), - m_display(0), - m_screen(0), - m_depth(0), - m_visual(0), - m_window(0), - m_gc(0), - m_ximg_window(0), - m_close_atom(0), - - m_buf_window(0), - - m_update_flag(true), - m_resize_flag(true), - m_initialized(false) - //m_wait_mode(true) - { - memset(m_buf_img, 0, sizeof(m_buf_img)); - - unsigned i; - for(i = 0; i < 256; i++) - { - m_keymap[i] = i; - } - - m_keymap[XK_Pause&0xFF] = key_pause; - m_keymap[XK_Clear&0xFF] = key_clear; - - m_keymap[XK_KP_0&0xFF] = key_kp0; - m_keymap[XK_KP_1&0xFF] = key_kp1; - m_keymap[XK_KP_2&0xFF] = key_kp2; - m_keymap[XK_KP_3&0xFF] = key_kp3; - m_keymap[XK_KP_4&0xFF] = key_kp4; - m_keymap[XK_KP_5&0xFF] = key_kp5; - m_keymap[XK_KP_6&0xFF] = key_kp6; - m_keymap[XK_KP_7&0xFF] = key_kp7; - m_keymap[XK_KP_8&0xFF] = key_kp8; - m_keymap[XK_KP_9&0xFF] = key_kp9; - - m_keymap[XK_KP_Insert&0xFF] = key_kp0; - m_keymap[XK_KP_End&0xFF] = key_kp1; - m_keymap[XK_KP_Down&0xFF] = key_kp2; - m_keymap[XK_KP_Page_Down&0xFF] = key_kp3; - m_keymap[XK_KP_Left&0xFF] = key_kp4; - m_keymap[XK_KP_Begin&0xFF] = key_kp5; - m_keymap[XK_KP_Right&0xFF] = key_kp6; - m_keymap[XK_KP_Home&0xFF] = key_kp7; - m_keymap[XK_KP_Up&0xFF] = key_kp8; - m_keymap[XK_KP_Page_Up&0xFF] = key_kp9; - m_keymap[XK_KP_Delete&0xFF] = key_kp_period; - m_keymap[XK_KP_Decimal&0xFF] = key_kp_period; - m_keymap[XK_KP_Divide&0xFF] = key_kp_divide; - m_keymap[XK_KP_Multiply&0xFF] = key_kp_multiply; - m_keymap[XK_KP_Subtract&0xFF] = key_kp_minus; - m_keymap[XK_KP_Add&0xFF] = key_kp_plus; - m_keymap[XK_KP_Enter&0xFF] = key_kp_enter; - m_keymap[XK_KP_Equal&0xFF] = key_kp_equals; - - m_keymap[XK_Up&0xFF] = key_up; - m_keymap[XK_Down&0xFF] = key_down; - m_keymap[XK_Right&0xFF] = key_right; - m_keymap[XK_Left&0xFF] = key_left; - m_keymap[XK_Insert&0xFF] = key_insert; - m_keymap[XK_Home&0xFF] = key_delete; - m_keymap[XK_End&0xFF] = key_end; - m_keymap[XK_Page_Up&0xFF] = key_page_up; - m_keymap[XK_Page_Down&0xFF] = key_page_down; - - m_keymap[XK_F1&0xFF] = key_f1; - m_keymap[XK_F2&0xFF] = key_f2; - m_keymap[XK_F3&0xFF] = key_f3; - m_keymap[XK_F4&0xFF] = key_f4; - m_keymap[XK_F5&0xFF] = key_f5; - m_keymap[XK_F6&0xFF] = key_f6; - m_keymap[XK_F7&0xFF] = key_f7; - m_keymap[XK_F8&0xFF] = key_f8; - m_keymap[XK_F9&0xFF] = key_f9; - m_keymap[XK_F10&0xFF] = key_f10; - m_keymap[XK_F11&0xFF] = key_f11; - m_keymap[XK_F12&0xFF] = key_f12; - m_keymap[XK_F13&0xFF] = key_f13; - m_keymap[XK_F14&0xFF] = key_f14; - m_keymap[XK_F15&0xFF] = key_f15; - - m_keymap[XK_Num_Lock&0xFF] = key_numlock; - m_keymap[XK_Caps_Lock&0xFF] = key_capslock; - m_keymap[XK_Scroll_Lock&0xFF] = key_scrollock; - - switch(m_format) - { - default: break; - case pix_format_gray8: - m_bpp = 8; - break; - - case pix_format_rgb565: - case pix_format_rgb555: - m_bpp = 16; - break; - - case pix_format_rgb24: - case pix_format_bgr24: - m_bpp = 24; - break; - - case pix_format_bgra32: - case pix_format_abgr32: - case pix_format_argb32: - case pix_format_rgba32: - m_bpp = 32; - break; - } - m_sw_start = clock(); - } - - //------------------------------------------------------------------------ - platform_specific::~platform_specific() - { - } - - //------------------------------------------------------------------------ - void platform_specific::caption(const char* capt) - { - XTextProperty tp; - tp.value = (unsigned char *)capt; - tp.encoding = XA_WM_NAME; - tp.format = 8; - tp.nitems = strlen(capt); - XSetWMName(m_display, m_window, &tp); - XStoreName(m_display, m_window, capt); - XSetIconName(m_display, m_window, capt); - XSetWMIconName(m_display, m_window, &tp); - } - - - //------------------------------------------------------------------------ - void platform_specific::put_image(const rendering_buffer* src) - { - if(m_ximg_window == 0) return; - m_ximg_window->data = (char*)m_buf_window; - - if(m_format == m_sys_format) - { - XPutImage(m_display, - m_window, - m_gc, - m_ximg_window, - 0, 0, 0, 0, - src->width(), - src->height()); - } - else - { - int row_len = src->width() * m_sys_bpp / 8; - unsigned char* buf_tmp = - new unsigned char[row_len * src->height()]; - - rendering_buffer rbuf_tmp; - rbuf_tmp.attach(buf_tmp, - src->width(), - src->height(), - m_flip_y ? -row_len : row_len); - - switch(m_sys_format) - { - default: break; - case pix_format_rgb555: - switch(m_format) - { - default: break; - case pix_format_rgb555: color_conv(&rbuf_tmp, src, color_conv_rgb555_to_rgb555()); break; - case pix_format_rgb565: color_conv(&rbuf_tmp, src, color_conv_rgb565_to_rgb555()); break; - case pix_format_rgb24: color_conv(&rbuf_tmp, src, color_conv_rgb24_to_rgb555()); break; - case pix_format_bgr24: color_conv(&rbuf_tmp, src, color_conv_bgr24_to_rgb555()); break; - case pix_format_rgba32: color_conv(&rbuf_tmp, src, color_conv_rgba32_to_rgb555()); break; - case pix_format_argb32: color_conv(&rbuf_tmp, src, color_conv_argb32_to_rgb555()); break; - case pix_format_bgra32: color_conv(&rbuf_tmp, src, color_conv_bgra32_to_rgb555()); break; - case pix_format_abgr32: color_conv(&rbuf_tmp, src, color_conv_abgr32_to_rgb555()); break; - } - break; - - case pix_format_rgb565: - switch(m_format) - { - default: break; - case pix_format_rgb555: color_conv(&rbuf_tmp, src, color_conv_rgb555_to_rgb565()); break; - case pix_format_rgb565: color_conv(&rbuf_tmp, src, color_conv_rgb565_to_rgb565()); break; - case pix_format_rgb24: color_conv(&rbuf_tmp, src, color_conv_rgb24_to_rgb565()); break; - case pix_format_bgr24: color_conv(&rbuf_tmp, src, color_conv_bgr24_to_rgb565()); break; - case pix_format_rgba32: color_conv(&rbuf_tmp, src, color_conv_rgba32_to_rgb565()); break; - case pix_format_argb32: color_conv(&rbuf_tmp, src, color_conv_argb32_to_rgb565()); break; - case pix_format_bgra32: color_conv(&rbuf_tmp, src, color_conv_bgra32_to_rgb565()); break; - case pix_format_abgr32: color_conv(&rbuf_tmp, src, color_conv_abgr32_to_rgb565()); break; - } - break; - - case pix_format_rgba32: - switch(m_format) - { - default: break; - case pix_format_rgb555: color_conv(&rbuf_tmp, src, color_conv_rgb555_to_rgba32()); break; - case pix_format_rgb565: color_conv(&rbuf_tmp, src, color_conv_rgb565_to_rgba32()); break; - case pix_format_rgb24: color_conv(&rbuf_tmp, src, color_conv_rgb24_to_rgba32()); break; - case pix_format_bgr24: color_conv(&rbuf_tmp, src, color_conv_bgr24_to_rgba32()); break; - case pix_format_rgba32: color_conv(&rbuf_tmp, src, color_conv_rgba32_to_rgba32()); break; - case pix_format_argb32: color_conv(&rbuf_tmp, src, color_conv_argb32_to_rgba32()); break; - case pix_format_bgra32: color_conv(&rbuf_tmp, src, color_conv_bgra32_to_rgba32()); break; - case pix_format_abgr32: color_conv(&rbuf_tmp, src, color_conv_abgr32_to_rgba32()); break; - } - break; - - case pix_format_abgr32: - switch(m_format) - { - default: break; - case pix_format_rgb555: color_conv(&rbuf_tmp, src, color_conv_rgb555_to_abgr32()); break; - case pix_format_rgb565: color_conv(&rbuf_tmp, src, color_conv_rgb565_to_abgr32()); break; - case pix_format_rgb24: color_conv(&rbuf_tmp, src, color_conv_rgb24_to_abgr32()); break; - case pix_format_bgr24: color_conv(&rbuf_tmp, src, color_conv_bgr24_to_abgr32()); break; - case pix_format_abgr32: color_conv(&rbuf_tmp, src, color_conv_abgr32_to_abgr32()); break; - case pix_format_rgba32: color_conv(&rbuf_tmp, src, color_conv_rgba32_to_abgr32()); break; - case pix_format_argb32: color_conv(&rbuf_tmp, src, color_conv_argb32_to_abgr32()); break; - case pix_format_bgra32: color_conv(&rbuf_tmp, src, color_conv_bgra32_to_abgr32()); break; - } - break; - - case pix_format_argb32: - switch(m_format) - { - default: break; - case pix_format_rgb555: color_conv(&rbuf_tmp, src, color_conv_rgb555_to_argb32()); break; - case pix_format_rgb565: color_conv(&rbuf_tmp, src, color_conv_rgb565_to_argb32()); break; - case pix_format_rgb24: color_conv(&rbuf_tmp, src, color_conv_rgb24_to_argb32()); break; - case pix_format_bgr24: color_conv(&rbuf_tmp, src, color_conv_bgr24_to_argb32()); break; - case pix_format_rgba32: color_conv(&rbuf_tmp, src, color_conv_rgba32_to_argb32()); break; - case pix_format_argb32: color_conv(&rbuf_tmp, src, color_conv_argb32_to_argb32()); break; - case pix_format_abgr32: color_conv(&rbuf_tmp, src, color_conv_abgr32_to_argb32()); break; - case pix_format_bgra32: color_conv(&rbuf_tmp, src, color_conv_bgra32_to_argb32()); break; - } - break; - - case pix_format_bgra32: - switch(m_format) - { - default: break; - case pix_format_rgb555: color_conv(&rbuf_tmp, src, color_conv_rgb555_to_bgra32()); break; - case pix_format_rgb565: color_conv(&rbuf_tmp, src, color_conv_rgb565_to_bgra32()); break; - case pix_format_rgb24: color_conv(&rbuf_tmp, src, color_conv_rgb24_to_bgra32()); break; - case pix_format_bgr24: color_conv(&rbuf_tmp, src, color_conv_bgr24_to_bgra32()); break; - case pix_format_rgba32: color_conv(&rbuf_tmp, src, color_conv_rgba32_to_bgra32()); break; - case pix_format_argb32: color_conv(&rbuf_tmp, src, color_conv_argb32_to_bgra32()); break; - case pix_format_abgr32: color_conv(&rbuf_tmp, src, color_conv_abgr32_to_bgra32()); break; - case pix_format_bgra32: color_conv(&rbuf_tmp, src, color_conv_bgra32_to_bgra32()); break; - } - break; - } - - m_ximg_window->data = (char*)buf_tmp; - XPutImage(m_display, - m_window, - m_gc, - m_ximg_window, - 0, 0, 0, 0, - src->width(), - src->height()); - - delete [] buf_tmp; - } - } - - - //------------------------------------------------------------------------ - platform_support::platform_support(pix_format_e format, bool flip_y) : - m_specific(new platform_specific(format, flip_y)), - m_format(format), - m_bpp(m_specific->m_bpp), - m_window_flags(0), - m_wait_mode(true), - m_flip_y(flip_y), - m_initial_width(10), - m_initial_height(10) - { - strcpy(m_caption, "AGG Application"); - } - - //------------------------------------------------------------------------ - platform_support::~platform_support() - { - delete m_specific; - } - - - - //------------------------------------------------------------------------ - void platform_support::caption(const char* cap) - { - strcpy(m_caption, cap); - if(m_specific->m_initialized) - { - m_specific->caption(cap); - } - } - - - //------------------------------------------------------------------------ - enum xevent_mask_e - { - xevent_mask = - PointerMotionMask| - ButtonPressMask| - ButtonReleaseMask| - ExposureMask| - KeyPressMask| - StructureNotifyMask - }; - - - //------------------------------------------------------------------------ - bool platform_support::init(unsigned width, unsigned height, unsigned flags) - { - m_window_flags = flags; - - m_specific->m_display = XOpenDisplay(NULL); - if(m_specific->m_display == 0) - { - fprintf(stderr, "Unable to open DISPLAY!\n"); - return false; - } - - m_specific->m_screen = XDefaultScreen(m_specific->m_display); - m_specific->m_depth = XDefaultDepth(m_specific->m_display, - m_specific->m_screen); - m_specific->m_visual = XDefaultVisual(m_specific->m_display, - m_specific->m_screen); - unsigned long r_mask = m_specific->m_visual->red_mask; - unsigned long g_mask = m_specific->m_visual->green_mask; - unsigned long b_mask = m_specific->m_visual->blue_mask; - -//printf("depth=%d, red=%08x, green=%08x, blue=%08x\n", -// m_specific->m_depth, -// m_specific->m_visual->red_mask, -// m_specific->m_visual->green_mask, -// m_specific->m_visual->blue_mask); - - -// // NOT COMPLETED YET! -// // Try to find an appropriate Visual if the default doesn't fit. -// if(m_specific->m_depth < 15 || -// r_mask == 0 || g_mask == 0 || b_mask == 0) -// { -// -// // This is an attempt to find an appropriate Visual if -// // the default one doesn't match the minumum requirements -// static int depth[] = { 32, 24, 16, 15 }; -// int i; -// for(int i = 0; i < 4; i++) -// { -// XVisualInfo vi; -// if(XMatchVisualInfo(m_specific->m_display, -// m_specific->m_screen, -// depth[i], -// TrueColor, -// &vi)) -// { -// // printf("TrueColor depth=%d, red=%08x, green=%08x, blue=%08x, bits=%d\n", -// // vi.depth, -// // vi.visual->red_mask, -// // vi.visual->green_mask, -// // vi.visual->blue_mask, -// // vi.bits_per_rgb); -// m_specific->m_depth = vi.depth; -// m_specific->m_visual = vi.visual; -// r_mask = m_specific->m_visual->red_mask; -// g_mask = m_specific->m_visual->green_mask; -// b_mask = m_specific->m_visual->blue_mask; -// break; -// } -// if(XMatchVisualInfo(m_specific->m_display, -// m_specific->m_screen, -// depth[i], -// DirectColor, -// &vi)) -// { -// // printf("DirectColor depth=%d, red=%08x, green=%08x, blue=%08x, bits=%d\n", -// // vi.depth, -// // vi.visual->red_mask, -// // vi.visual->green_mask, -// // vi.visual->blue_mask, -// // vi.bits_per_rgb); -// m_specific->m_depth = vi.depth; -// m_specific->m_visual = vi.visual; -// r_mask = m_specific->m_visual->red_mask; -// g_mask = m_specific->m_visual->green_mask; -// b_mask = m_specific->m_visual->blue_mask; -// break; -// } -// } -// } - - if(m_specific->m_depth < 15 || - r_mask == 0 || g_mask == 0 || b_mask == 0) - { - fprintf(stderr, - "There's no Visual compatible with minimal AGG requirements:\n" - "At least 15-bit color depth and True- or DirectColor class.\n\n"); - XCloseDisplay(m_specific->m_display); - return false; - } - - int t = 1; - int hw_byte_order = LSBFirst; - if(*(char*)&t == 0) hw_byte_order = MSBFirst; - - // Perceive SYS-format by mask - switch(m_specific->m_depth) - { - case 15: - m_specific->m_sys_bpp = 16; - if(r_mask == 0x7C00 && g_mask == 0x3E0 && b_mask == 0x1F) - { - m_specific->m_sys_format = pix_format_rgb555; - m_specific->m_byte_order = hw_byte_order; - } - break; - - case 16: - m_specific->m_sys_bpp = 16; - if(r_mask == 0xF800 && g_mask == 0x7E0 && b_mask == 0x1F) - { - m_specific->m_sys_format = pix_format_rgb565; - m_specific->m_byte_order = hw_byte_order; - } - break; - - case 24: - case 32: - m_specific->m_sys_bpp = 32; - if(g_mask == 0xFF00) - { - if(r_mask == 0xFF && b_mask == 0xFF0000) - { - switch(m_specific->m_format) - { - case pix_format_rgba32: - m_specific->m_sys_format = pix_format_rgba32; - m_specific->m_byte_order = LSBFirst; - break; - - case pix_format_abgr32: - m_specific->m_sys_format = pix_format_abgr32; - m_specific->m_byte_order = MSBFirst; - break; - - default: - m_specific->m_byte_order = hw_byte_order; - m_specific->m_sys_format = - (hw_byte_order == LSBFirst) ? - pix_format_rgba32 : - pix_format_abgr32; - break; - } - } - - if(r_mask == 0xFF0000 && b_mask == 0xFF) - { - switch(m_specific->m_format) - { - case pix_format_argb32: - m_specific->m_sys_format = pix_format_argb32; - m_specific->m_byte_order = MSBFirst; - break; - - case pix_format_bgra32: - m_specific->m_sys_format = pix_format_bgra32; - m_specific->m_byte_order = LSBFirst; - break; - - default: - m_specific->m_byte_order = hw_byte_order; - m_specific->m_sys_format = - (hw_byte_order == MSBFirst) ? - pix_format_argb32 : - pix_format_bgra32; - break; - } - } - } - break; - } - - if(m_specific->m_sys_format == pix_format_undefined) - { - fprintf(stderr, - "RGB masks are not compatible with AGG pixel formats:\n" - "R=%08x, R=%08x, B=%08x\n", r_mask, g_mask, b_mask); - XCloseDisplay(m_specific->m_display); - return false; - } - - - - memset(&m_specific->m_window_attributes, - 0, - sizeof(m_specific->m_window_attributes)); - - m_specific->m_window_attributes.border_pixel = - XBlackPixel(m_specific->m_display, m_specific->m_screen); - - m_specific->m_window_attributes.background_pixel = - XWhitePixel(m_specific->m_display, m_specific->m_screen); - - m_specific->m_window_attributes.override_redirect = 0; - - unsigned long window_mask = CWBackPixel | CWBorderPixel; - - m_specific->m_window = - XCreateWindow(m_specific->m_display, - XDefaultRootWindow(m_specific->m_display), - 0, 0, - width, - height, - 0, - m_specific->m_depth, - InputOutput, - CopyFromParent, - window_mask, - &m_specific->m_window_attributes); - - - m_specific->m_gc = XCreateGC(m_specific->m_display, - m_specific->m_window, - 0, 0); - m_specific->m_buf_window = - new unsigned char[width * height * (m_bpp / 8)]; - - memset(m_specific->m_buf_window, 255, width * height * (m_bpp / 8)); - - m_rbuf_window.attach(m_specific->m_buf_window, - width, - height, - m_flip_y ? -width * (m_bpp / 8) : width * (m_bpp / 8)); - - m_specific->m_ximg_window = - XCreateImage(m_specific->m_display, - m_specific->m_visual, //CopyFromParent, - m_specific->m_depth, - ZPixmap, - 0, - (char*)m_specific->m_buf_window, - width, - height, - m_specific->m_sys_bpp, - width * (m_specific->m_sys_bpp / 8)); - m_specific->m_ximg_window->byte_order = m_specific->m_byte_order; - - m_specific->caption(m_caption); - m_initial_width = width; - m_initial_height = height; - - if(!m_specific->m_initialized) - { - on_init(); - m_specific->m_initialized = true; - } - - trans_affine_resizing(width, height); - on_resize(width, height); - m_specific->m_update_flag = true; - - XSizeHints *hints = XAllocSizeHints(); - if(hints) - { - if(flags & window_resize) - { - hints->min_width = 32; - hints->min_height = 32; - hints->max_width = 4096; - hints->max_height = 4096; - } - else - { - hints->min_width = width; - hints->min_height = height; - hints->max_width = width; - hints->max_height = height; - } - hints->flags = PMaxSize | PMinSize; - - XSetWMNormalHints(m_specific->m_display, - m_specific->m_window, - hints); - - XFree(hints); - } - - - XMapWindow(m_specific->m_display, - m_specific->m_window); - - XSelectInput(m_specific->m_display, - m_specific->m_window, - xevent_mask); - - - m_specific->m_close_atom = XInternAtom(m_specific->m_display, - "WM_DELETE_WINDOW", - false); - - XSetWMProtocols(m_specific->m_display, - m_specific->m_window, - &m_specific->m_close_atom, - 1); - - return true; - } - - - - //------------------------------------------------------------------------ - void platform_support::update_window() - { - m_specific->put_image(&m_rbuf_window); - - // When m_wait_mode is true we can discard all the events - // came while the image is being drawn. In this case - // the X server does not accumulate mouse motion events. - // When m_wait_mode is false, i.e. we have some idle drawing - // we cannot afford to miss any events - XSync(m_specific->m_display, m_wait_mode); - } - - - //------------------------------------------------------------------------ - int platform_support::run() - { - XFlush(m_specific->m_display); - - bool quit = false; - unsigned flags; - int cur_x; - int cur_y; - - while(!quit) - { - if(m_specific->m_update_flag) - { - on_draw(); - update_window(); - m_specific->m_update_flag = false; - } - - if(!m_wait_mode) - { - if(XPending(m_specific->m_display) == 0) - { - on_idle(); - continue; - } - } - - XEvent x_event; - XNextEvent(m_specific->m_display, &x_event); - - // In the Idle mode discard all intermediate MotionNotify events - if(!m_wait_mode && x_event.type == MotionNotify) - { - XEvent te = x_event; - for(;;) - { - if(XPending(m_specific->m_display) == 0) break; - XNextEvent(m_specific->m_display, &te); - if(te.type != MotionNotify) break; - } - x_event = te; - } - - switch(x_event.type) - { - case ConfigureNotify: - { - if(x_event.xconfigure.width != int(m_rbuf_window.width()) || - x_event.xconfigure.height != int(m_rbuf_window.height())) - { - int width = x_event.xconfigure.width; - int height = x_event.xconfigure.height; - - delete [] m_specific->m_buf_window; - m_specific->m_ximg_window->data = 0; - XDestroyImage(m_specific->m_ximg_window); - - m_specific->m_buf_window = - new unsigned char[width * height * (m_bpp / 8)]; - - m_rbuf_window.attach(m_specific->m_buf_window, - width, - height, - m_flip_y ? - -width * (m_bpp / 8) : - width * (m_bpp / 8)); - - m_specific->m_ximg_window = - XCreateImage(m_specific->m_display, - m_specific->m_visual, //CopyFromParent, - m_specific->m_depth, - ZPixmap, - 0, - (char*)m_specific->m_buf_window, - width, - height, - m_specific->m_sys_bpp, - width * (m_specific->m_sys_bpp / 8)); - m_specific->m_ximg_window->byte_order = m_specific->m_byte_order; - - trans_affine_resizing(width, height); - on_resize(width, height); - on_draw(); - update_window(); - } - } - break; - - case Expose: - m_specific->put_image(&m_rbuf_window); - XFlush(m_specific->m_display); - XSync(m_specific->m_display, false); - break; - - case KeyPress: - { - KeySym key = XLookupKeysym(&x_event.xkey, 0); - flags = 0; - if(x_event.xkey.state & Button1Mask) flags |= mouse_left; - if(x_event.xkey.state & Button3Mask) flags |= mouse_right; - if(x_event.xkey.state & ShiftMask) flags |= kbd_shift; - if(x_event.xkey.state & ControlMask) flags |= kbd_ctrl; - - bool left = false; - bool up = false; - bool right = false; - bool down = false; - - switch(m_specific->m_keymap[key & 0xFF]) - { - case key_left: - left = true; - break; - - case key_up: - up = true; - break; - - case key_right: - right = true; - break; - - case key_down: - down = true; - break; - - case key_f2: - copy_window_to_img(max_images - 1); - save_img(max_images - 1, "screenshot"); - break; - } - - if(m_ctrls.on_arrow_keys(left, right, down, up)) - { - on_ctrl_change(); - force_redraw(); - } - else - { - on_key(x_event.xkey.x, - m_flip_y ? - m_rbuf_window.height() - x_event.xkey.y : - x_event.xkey.y, - m_specific->m_keymap[key & 0xFF], - flags); - } - } - break; - - - case ButtonPress: - { - flags = 0; - if(x_event.xbutton.state & ShiftMask) flags |= kbd_shift; - if(x_event.xbutton.state & ControlMask) flags |= kbd_ctrl; - if(x_event.xbutton.button == Button1) flags |= mouse_left; - if(x_event.xbutton.button == Button3) flags |= mouse_right; - - cur_x = x_event.xbutton.x; - cur_y = m_flip_y ? m_rbuf_window.height() - x_event.xbutton.y : - x_event.xbutton.y; - - if(flags & mouse_left) - { - if(m_ctrls.on_mouse_button_down(cur_x, cur_y)) - { - m_ctrls.set_cur(cur_x, cur_y); - on_ctrl_change(); - force_redraw(); - } - else - { - if(m_ctrls.in_rect(cur_x, cur_y)) - { - if(m_ctrls.set_cur(cur_x, cur_y)) - { - on_ctrl_change(); - force_redraw(); - } - } - else - { - on_mouse_button_down(cur_x, cur_y, flags); - } - } - } - if(flags & mouse_right) - { - on_mouse_button_down(cur_x, cur_y, flags); - } - //m_specific->m_wait_mode = m_wait_mode; - //m_wait_mode = true; - } - break; - - - case MotionNotify: - { - flags = 0; - if(x_event.xmotion.state & Button1Mask) flags |= mouse_left; - if(x_event.xmotion.state & Button3Mask) flags |= mouse_right; - if(x_event.xmotion.state & ShiftMask) flags |= kbd_shift; - if(x_event.xmotion.state & ControlMask) flags |= kbd_ctrl; - - cur_x = x_event.xbutton.x; - cur_y = m_flip_y ? m_rbuf_window.height() - x_event.xbutton.y : - x_event.xbutton.y; - - if(m_ctrls.on_mouse_move(cur_x, cur_y, (flags & mouse_left) != 0)) - { - on_ctrl_change(); - force_redraw(); - } - else - { - if(!m_ctrls.in_rect(cur_x, cur_y)) - { - on_mouse_move(cur_x, cur_y, flags); - } - } - } - break; - - case ButtonRelease: - { - flags = 0; - if(x_event.xbutton.state & ShiftMask) flags |= kbd_shift; - if(x_event.xbutton.state & ControlMask) flags |= kbd_ctrl; - if(x_event.xbutton.button == Button1) flags |= mouse_left; - if(x_event.xbutton.button == Button3) flags |= mouse_right; - - cur_x = x_event.xbutton.x; - cur_y = m_flip_y ? m_rbuf_window.height() - x_event.xbutton.y : - x_event.xbutton.y; - - if(flags & mouse_left) - { - if(m_ctrls.on_mouse_button_up(cur_x, cur_y)) - { - on_ctrl_change(); - force_redraw(); - } - } - if(flags & (mouse_left | mouse_right)) - { - on_mouse_button_up(cur_x, cur_y, flags); - } - } - //m_wait_mode = m_specific->m_wait_mode; - break; - - case ClientMessage: - if((x_event.xclient.format == 32) && - (x_event.xclient.data.l[0] == int(m_specific->m_close_atom))) - { - quit = true; - } - break; - } - } - - - unsigned i = platform_support::max_images; - while(i--) - { - if(m_specific->m_buf_img[i]) - { - delete [] m_specific->m_buf_img[i]; - } - } - - delete [] m_specific->m_buf_window; - m_specific->m_ximg_window->data = 0; - XDestroyImage(m_specific->m_ximg_window); - XFreeGC(m_specific->m_display, m_specific->m_gc); - XDestroyWindow(m_specific->m_display, m_specific->m_window); - XCloseDisplay(m_specific->m_display); - - return 0; - } - - - - //------------------------------------------------------------------------ - const char* platform_support::img_ext() const { return ".ppm"; } - - //------------------------------------------------------------------------ - const char* platform_support::full_file_name(const char* file_name) - { - return file_name; - } - - //------------------------------------------------------------------------ - bool platform_support::load_img(unsigned idx, const char* file) - { - if(idx < max_images) - { - char buf[1024]; - strcpy(buf, file); - int len = strlen(buf); - if(len < 4 || strcasecmp(buf + len - 4, ".ppm") != 0) - { - strcat(buf, ".ppm"); - } - - FILE* fd = fopen(buf, "rb"); - if(fd == 0) return false; - - if((len = fread(buf, 1, 1022, fd)) == 0) - { - fclose(fd); - return false; - } - buf[len] = 0; - - if(buf[0] != 'P' && buf[1] != '6') - { - fclose(fd); - return false; - } - - char* ptr = buf + 2; - - while(*ptr && !isdigit(*ptr)) ptr++; - if(*ptr == 0) - { - fclose(fd); - return false; - } - - unsigned width = atoi(ptr); - if(width == 0 || width > 4096) - { - fclose(fd); - return false; - } - while(*ptr && isdigit(*ptr)) ptr++; - while(*ptr && !isdigit(*ptr)) ptr++; - if(*ptr == 0) - { - fclose(fd); - return false; - } - unsigned height = atoi(ptr); - if(height == 0 || height > 4096) - { - fclose(fd); - return false; - } - while(*ptr && isdigit(*ptr)) ptr++; - while(*ptr && !isdigit(*ptr)) ptr++; - if(atoi(ptr) != 255) - { - fclose(fd); - return false; - } - while(*ptr && isdigit(*ptr)) ptr++; - if(*ptr == 0) - { - fclose(fd); - return false; - } - ptr++; - fseek(fd, long(ptr - buf), SEEK_SET); - - create_img(idx, width, height); - bool ret = true; - - if(m_format == pix_format_rgb24) - { - fread(m_specific->m_buf_img[idx], 1, width * height * 3, fd); - } - else - { - unsigned char* buf_img = new unsigned char [width * height * 3]; - rendering_buffer rbuf_img; - rbuf_img.attach(buf_img, - width, - height, - m_flip_y ? - -width * 3 : - width * 3); - - fread(buf_img, 1, width * height * 3, fd); - - switch(m_format) - { - case pix_format_rgb555: - color_conv(m_rbuf_img+idx, &rbuf_img, color_conv_rgb24_to_rgb555()); - break; - - case pix_format_rgb565: - color_conv(m_rbuf_img+idx, &rbuf_img, color_conv_rgb24_to_rgb565()); - break; - - case pix_format_bgr24: - color_conv(m_rbuf_img+idx, &rbuf_img, color_conv_rgb24_to_bgr24()); - break; - - case pix_format_rgba32: - color_conv(m_rbuf_img+idx, &rbuf_img, color_conv_rgb24_to_rgba32()); - break; - - case pix_format_argb32: - color_conv(m_rbuf_img+idx, &rbuf_img, color_conv_rgb24_to_argb32()); - break; - - case pix_format_bgra32: - color_conv(m_rbuf_img+idx, &rbuf_img, color_conv_rgb24_to_bgra32()); - break; - - case pix_format_abgr32: - color_conv(m_rbuf_img+idx, &rbuf_img, color_conv_rgb24_to_abgr32()); - break; - - default: - ret = false; - } - delete [] buf_img; - } - - fclose(fd); - return ret; - } - return false; - } - - - - - //------------------------------------------------------------------------ - bool platform_support::save_img(unsigned idx, const char* file) - { - if(idx < max_images && rbuf_img(idx).buf()) - { - char buf[1024]; - strcpy(buf, file); - int len = strlen(buf); - if(len < 4 || strcasecmp(buf + len - 4, ".ppm") != 0) - { - strcat(buf, ".ppm"); - } - - FILE* fd = fopen(buf, "wb"); - if(fd == 0) return false; - - unsigned w = rbuf_img(idx).width(); - unsigned h = rbuf_img(idx).height(); - - fprintf(fd, "P6\n%d %d\n255\n", w, h); - - unsigned y; - unsigned char* tmp_buf = new unsigned char [w * 3]; - for(y = 0; y < rbuf_img(idx).height(); y++) - { - const unsigned char* src = rbuf_img(idx).row_ptr(m_flip_y ? h - 1 - y : y); - switch(m_format) - { - default: break; - case pix_format_rgb555: - color_conv_row(tmp_buf, src, w, color_conv_rgb555_to_rgb24()); - break; - - case pix_format_rgb565: - color_conv_row(tmp_buf, src, w, color_conv_rgb565_to_rgb24()); - break; - - case pix_format_bgr24: - color_conv_row(tmp_buf, src, w, color_conv_bgr24_to_rgb24()); - break; - - case pix_format_rgb24: - color_conv_row(tmp_buf, src, w, color_conv_rgb24_to_rgb24()); - break; - - case pix_format_rgba32: - color_conv_row(tmp_buf, src, w, color_conv_rgba32_to_rgb24()); - break; - - case pix_format_argb32: - color_conv_row(tmp_buf, src, w, color_conv_argb32_to_rgb24()); - break; - - case pix_format_bgra32: - color_conv_row(tmp_buf, src, w, color_conv_bgra32_to_rgb24()); - break; - - case pix_format_abgr32: - color_conv_row(tmp_buf, src, w, color_conv_abgr32_to_rgb24()); - break; - } - fwrite(tmp_buf, 1, w * 3, fd); - } - delete [] tmp_buf; - fclose(fd); - return true; - } - return false; - } - - - - //------------------------------------------------------------------------ - bool platform_support::create_img(unsigned idx, unsigned width, unsigned height) - { - if(idx < max_images) - { - if(width == 0) width = rbuf_window().width(); - if(height == 0) height = rbuf_window().height(); - delete [] m_specific->m_buf_img[idx]; - m_specific->m_buf_img[idx] = - new unsigned char[width * height * (m_bpp / 8)]; - - m_rbuf_img[idx].attach(m_specific->m_buf_img[idx], - width, - height, - m_flip_y ? - -width * (m_bpp / 8) : - width * (m_bpp / 8)); - return true; - } - return false; - } - - - //------------------------------------------------------------------------ - void platform_support::force_redraw() - { - m_specific->m_update_flag = true; - } - - - //------------------------------------------------------------------------ - void platform_support::message(const char* msg) - { - fprintf(stderr, "%s\n", msg); - } - - //------------------------------------------------------------------------ - void platform_support::start_timer() - { - m_specific->m_sw_start = clock(); - } - - //------------------------------------------------------------------------ - double platform_support::elapsed_time() const - { - clock_t stop = clock(); - return double(stop - m_specific->m_sw_start) * 1000.0 / CLOCKS_PER_SEC; - } - - - //------------------------------------------------------------------------ - void platform_support::on_init() {} - void platform_support::on_resize(int sx, int sy) {} - void platform_support::on_idle() {} - void platform_support::on_mouse_move(int x, int y, unsigned flags) {} - void platform_support::on_mouse_button_down(int x, int y, unsigned flags) {} - void platform_support::on_mouse_button_up(int x, int y, unsigned flags) {} - void platform_support::on_key(int x, int y, unsigned key, unsigned flags) {} - void platform_support::on_ctrl_change() {} - void platform_support::on_draw() {} - void platform_support::on_post_draw(void* raw_handler) {} - - - -} - - -int agg_main(int argc, char* argv[]); - - -int main(int argc, char* argv[]) -{ - return agg_main(argc, argv); -} - - - - - - diff --git a/uppdev/aggdraw/platform/agg_platform_support.h b/uppdev/aggdraw/platform/agg_platform_support.h deleted file mode 100644 index 71c1e101d..000000000 --- a/uppdev/aggdraw/platform/agg_platform_support.h +++ /dev/null @@ -1,680 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// class platform_support -// -// It's not a part of the AGG library, it's just a helper class to create -// interactive demo examples. Since the examples should not be too complex -// this class is provided to support some very basic interactive graphical -// funtionality, such as putting the rendered image to the window, simple -// keyboard and mouse input, window resizing, setting the window title, -// and catching the "idle" events. -// -// The idea is to have a single header file that does not depend on any -// platform (I hate these endless #ifdef/#elif/#elif.../#endif) and a number -// of different implementations depending on the concrete platform. -// The most popular platforms are: -// -// Windows-32 API -// X-Window API -// SDL library (see http://www.libsdl.org/) -// MacOS C/C++ API -// -// This file does not include any system dependent .h files such as -// windows.h or X11.h, so, your demo applications do not depend on the -// platform. The only file that can #include system dependend headers -// is the implementation file agg_platform_support.cpp. Different -// implementations are placed in different directories, such as -// ~/agg/src/platform/win32 -// ~/agg/src/platform/sdl -// ~/agg/src/platform/X11 -// and so on. -// -// All the system dependent stuff sits in the platform_specific -// class which is forward-declared here but not defined. -// The platform_support class has just a pointer to it and it's -// the responsibility of the implementation to create/delete it. -// This class being defined in the implementation file can have -// any platform dependent stuff such as HWND, X11 Window and so on. -// -//---------------------------------------------------------------------------- - - -#ifndef AGG_PLATFORM_SUPPORT_INCLUDED -#define AGG_PLATFORM_SUPPORT_INCLUDED - - -#include "AggDraw/agg_basics.h" -#include "agg_rendering_buffer.h" -#include "agg_trans_viewport.h" -#include "ctrl/agg_ctrl.h" - -namespace agg -{ - - //----------------------------------------------------------window_flag_e - // These are flags used in method init(). Not all of them are - // applicable on different platforms, for example the win32_api - // cannot use a hardware buffer (window_hw_buffer). - // The implementation should simply ignore unsupported flags. - enum window_flag_e - { - window_resize = 1, - window_hw_buffer = 2, - window_keep_aspect_ratio = 4, - window_process_all_keys = 8 - }; - - //-----------------------------------------------------------pix_format_e - // Possible formats of the rendering buffer. Initially I thought that it's - // reasonable to create the buffer and the rendering functions in - // accordance with the native pixel format of the system because it - // would have no overhead for pixel format conersion. - // But eventually I came to a conclusion that having a possibility to - // convert pixel formats on demand is a good idea. First, it was X11 where - // there lots of different formats and visuals and it would be great to - // render everything in, say, RGB-24 and display it automatically without - // any additional efforts. The second reason is to have a possibility to - // debug renderers for different pixel formats and colorspaces having only - // one computer and one system. - // - // This stuff is not included into the basic AGG functionality because the - // number of supported pixel formats (and/or colorspaces) can be great and - // if one needs to add new format it would be good only to add new - // rendering files without having to modify any existing ones (a general - // principle of incapsulation and isolation). - // - // Using a particular pixel format doesn't obligatory mean the necessity - // of software conversion. For example, win32 API can natively display - // gray8, 15-bit RGB, 24-bit BGR, and 32-bit BGRA formats. - // This list can be (and will be!) extended in future. - enum pix_format_e - { - pix_format_undefined = 0, // By default. No conversions are applied - pix_format_bw, // 1 bit per color B/W - pix_format_gray8, // Simple 256 level grayscale - pix_format_gray16, // Simple 65535 level grayscale - pix_format_rgb555, // 15 bit rgb. Depends on the byte ordering! - pix_format_rgb565, // 16 bit rgb. Depends on the byte ordering! - pix_format_rgbAAA, // 30 bit rgb. Depends on the byte ordering! - pix_format_rgbBBA, // 32 bit rgb. Depends on the byte ordering! - pix_format_bgrAAA, // 30 bit bgr. Depends on the byte ordering! - pix_format_bgrABB, // 32 bit bgr. Depends on the byte ordering! - pix_format_rgb24, // R-G-B, one byte per color component - pix_format_bgr24, // B-G-R, native win32 BMP format. - pix_format_rgba32, // R-G-B-A, one byte per color component - pix_format_argb32, // A-R-G-B, native MAC format - pix_format_abgr32, // A-B-G-R, one byte per color component - pix_format_bgra32, // B-G-R-A, native win32 BMP format - pix_format_rgb48, // R-G-B, 16 bits per color component - pix_format_bgr48, // B-G-R, native win32 BMP format. - pix_format_rgba64, // R-G-B-A, 16 bits byte per color component - pix_format_argb64, // A-R-G-B, native MAC format - pix_format_abgr64, // A-B-G-R, one byte per color component - pix_format_bgra64, // B-G-R-A, native win32 BMP format - - end_of_pix_formats - }; - - //-------------------------------------------------------------input_flag_e - // Mouse and keyboard flags. They can be different on different platforms - // and the ways they are obtained are also different. But in any case - // the system dependent flags should be mapped into these ones. The meaning - // of that is as follows. For example, if kbd_ctrl is set it means that the - // ctrl key is pressed and being held at the moment. They are also used in - // the overridden methods such as on_mouse_move(), on_mouse_button_down(), - // on_mouse_button_dbl_click(), on_mouse_button_up(), on_key(). - // In the method on_mouse_button_up() the mouse flags have different - // meaning. They mean that the respective button is being released, but - // the meaning of the keyboard flags remains the same. - // There's absolut minimal set of flags is used because they'll be most - // probably supported on different platforms. Even the mouse_right flag - // is restricted because Mac's mice have only one button, but AFAIK - // it can be simulated with holding a special key on the keydoard. - enum input_flag_e - { - mouse_left = 1, - mouse_right = 2, - kbd_shift = 4, - kbd_ctrl = 8 - }; - - //--------------------------------------------------------------key_code_e - // Keyboard codes. There's also a restricted set of codes that are most - // probably supported on different platforms. Any platform dependent codes - // should be converted into these ones. There're only those codes are - // defined that cannot be represented as printable ASCII-characters. - // All printable ASCII-set can be used in a regular C/C++ manner: - // ' ', 'A', '0' '+' and so on. - // Since the class is used for creating very simple demo-applications - // we don't need very rich possibilities here, just basic ones. - // Actually the numeric key codes are taken from the SDL library, so, - // the implementation of the SDL support does not require any mapping. - enum key_code_e - { - // ASCII set. Should be supported everywhere - key_backspace = 8, - key_tab = 9, - key_clear = 12, - key_return = 13, - key_pause = 19, - key_escape = 27, - - // Keypad - key_delete = 127, - key_kp0 = 256, - key_kp1 = 257, - key_kp2 = 258, - key_kp3 = 259, - key_kp4 = 260, - key_kp5 = 261, - key_kp6 = 262, - key_kp7 = 263, - key_kp8 = 264, - key_kp9 = 265, - key_kp_period = 266, - key_kp_divide = 267, - key_kp_multiply = 268, - key_kp_minus = 269, - key_kp_plus = 270, - key_kp_enter = 271, - key_kp_equals = 272, - - // Arrow-keys and stuff - key_up = 273, - key_down = 274, - key_right = 275, - key_left = 276, - key_insert = 277, - key_home = 278, - key_end = 279, - key_page_up = 280, - key_page_down = 281, - - // Functional keys. You'd better avoid using - // f11...f15 in your applications if you want - // the applications to be portable - key_f1 = 282, - key_f2 = 283, - key_f3 = 284, - key_f4 = 285, - key_f5 = 286, - key_f6 = 287, - key_f7 = 288, - key_f8 = 289, - key_f9 = 290, - key_f10 = 291, - key_f11 = 292, - key_f12 = 293, - key_f13 = 294, - key_f14 = 295, - key_f15 = 296, - - // The possibility of using these keys is - // very restricted. Actually it's guaranteed - // only in win32_api and win32_sdl implementations - key_numlock = 300, - key_capslock = 301, - key_scrollock = 302, - - // Phew! - end_of_key_codes - }; - - - //------------------------------------------------------------------------ - // A predeclaration of the platform dependent class. Since we do not - // know anything here the only we can have is just a pointer to this - // class as a data member. It should be created and destroyed explicitly - // in the constructor/destructor of the platform_support class. - // Although the pointer to platform_specific is public the application - // cannot have access to its members or methods since it does not know - // anything about them and it's a perfect incapsulation :-) - class platform_specific; - - - //----------------------------------------------------------ctrl_container - // A helper class that contains pointers to a number of controls. - // This class is used to ease the event handling with controls. - // The implementation should simply call the appropriate methods - // of this class when appropriate events occur. - class ctrl_container - { - enum max_ctrl_e { max_ctrl = 64 }; - - public: - //-------------------------------------------------------------------- - ctrl_container() : m_num_ctrl(0), m_cur_ctrl(-1) {} - - //-------------------------------------------------------------------- - void add(ctrl& c) - { - if(m_num_ctrl < max_ctrl) - { - m_ctrl[m_num_ctrl++] = &c; - } - } - - //-------------------------------------------------------------------- - bool in_rect(double x, double y) - { - unsigned i; - for(i = 0; i < m_num_ctrl; i++) - { - if(m_ctrl[i]->in_rect(x, y)) return true; - } - return false; - } - - //-------------------------------------------------------------------- - bool on_mouse_button_down(double x, double y) - { - unsigned i; - for(i = 0; i < m_num_ctrl; i++) - { - if(m_ctrl[i]->on_mouse_button_down(x, y)) return true; - } - return false; - } - - //-------------------------------------------------------------------- - bool on_mouse_button_up(double x, double y) - { - unsigned i; - bool flag = false; - for(i = 0; i < m_num_ctrl; i++) - { - if(m_ctrl[i]->on_mouse_button_up(x, y)) flag = true; - } - return flag; - } - - //-------------------------------------------------------------------- - bool on_mouse_move(double x, double y, bool button_flag) - { - unsigned i; - for(i = 0; i < m_num_ctrl; i++) - { - if(m_ctrl[i]->on_mouse_move(x, y, button_flag)) return true; - } - return false; - } - - //-------------------------------------------------------------------- - bool on_arrow_keys(bool left, bool right, bool down, bool up) - { - if(m_cur_ctrl >= 0) - { - return m_ctrl[m_cur_ctrl]->on_arrow_keys(left, right, down, up); - } - return false; - } - - //-------------------------------------------------------------------- - bool set_cur(double x, double y) - { - unsigned i; - for(i = 0; i < m_num_ctrl; i++) - { - if(m_ctrl[i]->in_rect(x, y)) - { - if(m_cur_ctrl != int(i)) - { - m_cur_ctrl = i; - return true; - } - return false; - } - } - if(m_cur_ctrl != -1) - { - m_cur_ctrl = -1; - return true; - } - return false; - } - - private: - ctrl* m_ctrl[max_ctrl]; - unsigned m_num_ctrl; - int m_cur_ctrl; - }; - - - - //---------------------------------------------------------platform_support - // This class is a base one to the apllication classes. It can be used - // as follows: - // - // class the_application : public agg::platform_support - // { - // public: - // the_application(unsigned bpp, bool flip_y) : - // platform_support(bpp, flip_y) - // . . . - // - // //override stuff . . . - // virtual void on_init() - // { - // . . . - // } - // - // virtual void on_draw() - // { - // . . . - // } - // - // virtual void on_resize(int sx, int sy) - // { - // . . . - // } - // // . . . and so on, see virtual functions - // - // - // //any your own stuff . . . - // }; - // - // - // int agg_main(int argc, char* argv[]) - // { - // the_application app(pix_format_rgb24, true); - // app.caption("AGG Example. Lion"); - // - // if(app.init(500, 400, agg::window_resize)) - // { - // return app.run(); - // } - // return 1; - // } - // - // The reason to have agg_main() instead of just main() is that SDL - // for Windows requires including SDL.h if you define main(). Since - // the demo applications cannot rely on any platform/library specific - // stuff it's impossible to include SDL.h into the application files. - // The demo applications are simple and their use is restricted, so, - // this approach is quite reasonable. - // - class platform_support - { - public: - enum max_images_e { max_images = 16 }; - - // format - see enum pix_format_e {}; - // flip_y - true if you want to have the Y-axis flipped vertically. - platform_support(pix_format_e format, bool flip_y); - virtual ~platform_support(); - - // Setting the windows caption (title). Should be able - // to be called at least before calling init(). - // It's perfect if they can be called anytime. - void caption(const char* cap); - const char* caption() const { return m_caption; } - - //-------------------------------------------------------------------- - // These 3 methods handle working with images. The image - // formats are the simplest ones, such as .BMP in Windows or - // .ppm in Linux. In the applications the names of the files - // should not have any file extensions. Method load_img() can - // be called before init(), so, the application could be able - // to determine the initial size of the window depending on - // the size of the loaded image. - // The argument "idx" is the number of the image 0...max_images-1 - bool load_img(unsigned idx, const char* file); - bool save_img(unsigned idx, const char* file); - bool create_img(unsigned idx, unsigned width=0, unsigned height=0); - - //-------------------------------------------------------------------- - // init() and run(). See description before the class for details. - // The necessity of calling init() after creation is that it's - // impossible to call the overridden virtual function (on_init()) - // from the constructor. On the other hand it's very useful to have - // some on_init() event handler when the window is created but - // not yet displayed. The rbuf_window() method (see below) is - // accessible from on_init(). - bool init(unsigned width, unsigned height, unsigned flags); - int run(); - - //-------------------------------------------------------------------- - // The very same parameters that were used in the constructor - pix_format_e format() const { return m_format; } - bool flip_y() const { return m_flip_y; } - unsigned bpp() const { return m_bpp; } - - //-------------------------------------------------------------------- - // The following provides a very simple mechanism of doing someting - // in background. It's not multithreading. When wait_mode is true - // the class waits for the events and it does not ever call on_idle(). - // When it's false it calls on_idle() when the event queue is empty. - // The mode can be changed anytime. This mechanism is satisfactory - // to create very simple animations. - bool wait_mode() const { return m_wait_mode; } - void wait_mode(bool wait_mode) { m_wait_mode = wait_mode; } - - //-------------------------------------------------------------------- - // These two functions control updating of the window. - // force_redraw() is an analog of the Win32 InvalidateRect() function. - // Being called it sets a flag (or sends a message) which results - // in calling on_draw() and updating the content of the window - // when the next event cycle comes. - // update_window() results in just putting immediately the content - // of the currently rendered buffer to the window without calling - // on_draw(). - void force_redraw(); - void update_window(); - - //-------------------------------------------------------------------- - // So, finally, how to draw anythig with AGG? Very simple. - // rbuf_window() returns a reference to the main rendering - // buffer which can be attached to any rendering class. - // rbuf_img() returns a reference to the previously created - // or loaded image buffer (see load_img()). The image buffers - // are not displayed directly, they should be copied to or - // combined somehow with the rbuf_window(). rbuf_window() is - // the only buffer that can be actually displayed. - rendering_buffer& rbuf_window() { return m_rbuf_window; } - rendering_buffer& rbuf_img(unsigned idx) { return m_rbuf_img[idx]; } - - - //-------------------------------------------------------------------- - // Returns file extension used in the implementation for the particular - // system. - const char* img_ext() const; - - //-------------------------------------------------------------------- - void copy_img_to_window(unsigned idx) - { - if(idx < max_images && rbuf_img(idx).buf()) - { - rbuf_window().copy_from(rbuf_img(idx)); - } - } - - //-------------------------------------------------------------------- - void copy_window_to_img(unsigned idx) - { - if(idx < max_images) - { - create_img(idx, rbuf_window().width(), rbuf_window().height()); - rbuf_img(idx).copy_from(rbuf_window()); - } - } - - //-------------------------------------------------------------------- - void copy_img_to_img(unsigned idx_to, unsigned idx_from) - { - if(idx_from < max_images && - idx_to < max_images && - rbuf_img(idx_from).buf()) - { - create_img(idx_to, - rbuf_img(idx_from).width(), - rbuf_img(idx_from).height()); - rbuf_img(idx_to).copy_from(rbuf_img(idx_from)); - } - } - - //-------------------------------------------------------------------- - // Event handlers. They are not pure functions, so you don't have - // to override them all. - // In my demo applications these functions are defined inside - // the the_application class (implicit inlining) which is in general - // very bad practice, I mean vitual inline methods. At least it does - // not make sense. - // But in this case it's quite appropriate bacause we have the only - // instance of the the_application class and it is in the same file - // where this class is defined. - virtual void on_init(); - virtual void on_resize(int sx, int sy); - virtual void on_idle(); - virtual void on_mouse_move(int x, int y, unsigned flags); - virtual void on_mouse_button_down(int x, int y, unsigned flags); - virtual void on_mouse_button_up(int x, int y, unsigned flags); - virtual void on_key(int x, int y, unsigned key, unsigned flags); - virtual void on_ctrl_change(); - virtual void on_draw(); - virtual void on_post_draw(void* raw_handler); - - //-------------------------------------------------------------------- - // Adding control elements. A control element once added will be - // working and reacting to the mouse and keyboard events. Still, you - // will have to render them in the on_draw() using function - // render_ctrl() because platform_support doesn't know anything about - // renderers you use. The controls will be also scaled automatically - // if they provide a proper scaling mechanism (all the controls - // included into the basic AGG package do). - // If you don't need a particular control to be scaled automatically - // call ctrl::no_transform() after adding. - void add_ctrl(ctrl& c) { m_ctrls.add(c); c.transform(m_resize_mtx); } - - //-------------------------------------------------------------------- - // Auxiliary functions. trans_affine_resizing() modifier sets up the resizing - // matrix on the basis of the given width and height and the initial - // width and height of the window. The implementation should simply - // call this function every time when it catches the resizing event - // passing in the new values of width and height of the window. - // Nothing prevents you from "cheating" the scaling matrix if you - // call this function from somewhere with wrong arguments. - // trans_affine_resizing() accessor simply returns current resizing matrix - // which can be used to apply additional scaling of any of your - // stuff when the window is being resized. - // width(), height(), initial_width(), and initial_height() must be - // clear to understand with no comments :-) - void trans_affine_resizing(int width, int height) - { - if(m_window_flags & window_keep_aspect_ratio) - { - //double sx = double(width) / double(m_initial_width); - //double sy = double(height) / double(m_initial_height); - //if(sy < sx) sx = sy; - //m_resize_mtx = trans_affine_scaling(sx, sx); - trans_viewport vp; - vp.preserve_aspect_ratio(0.5, 0.5, aspect_ratio_meet); - vp.device_viewport(0, 0, width, height); - vp.world_viewport(0, 0, m_initial_width, m_initial_height); - m_resize_mtx = vp.to_affine(); - } - else - { - m_resize_mtx = trans_affine_scaling( - double(width) / double(m_initial_width), - double(height) / double(m_initial_height)); - } - } - const trans_affine& trans_affine_resizing() const { return m_resize_mtx; } - double width() const { return m_rbuf_window.width(); } - double height() const { return m_rbuf_window.height(); } - double initial_width() const { return m_initial_width; } - double initial_height() const { return m_initial_height; } - unsigned window_flags() const { return m_window_flags; } - - //-------------------------------------------------------------------- - // Get raw display handler depending on the system. - // For win32 its an HDC, for other systems it can be a pointer to some - // structure. See the implementation files for detals. - // It's provided "as is", so, first you should check if it's not null. - // If it's null the raw_display_handler is not supported. Also, there's - // no guarantee that this function is implemented, so, in some - // implementations you may have simply an unresolved symbol when linking. - void* raw_display_handler(); - - //-------------------------------------------------------------------- - // display message box or print the message to the console - // (depending on implementation) - void message(const char* msg); - - //-------------------------------------------------------------------- - // Stopwatch functions. Function elapsed_time() returns time elapsed - // since the latest start_timer() invocation in millisecods. - // The resolutoin depends on the implementation. - // In Win32 it uses QueryPerformanceFrequency() / QueryPerformanceCounter(). - void start_timer(); - double elapsed_time() const; - - //-------------------------------------------------------------------- - // Get the full file name. In most cases it simply returns - // file_name. As it's appropriate in many systems if you open - // a file by its name without specifying the path, it tries to - // open it in the current directory. The demos usually expect - // all the supplementary files to be placed in the current - // directory, that is usually coincides with the directory where - // the the executable is. However, in some systems (BeOS) it's not so. - // For those kinds of systems full_file_name() can help access files - // preserving commonly used policy. - // So, it's a good idea to use in the demos the following: - // FILE* fd = fopen(full_file_name("some.file"), "r"); - // instead of - // FILE* fd = fopen("some.file", "r"); - const char* full_file_name(const char* file_name); - - public: - platform_specific* m_specific; - ctrl_container m_ctrls; - - // Sorry, I'm too tired to describe the private - // data membders. See the implementations for different - // platforms for details. - private: - platform_support(const platform_support&); - const platform_support& operator = (const platform_support&); - - pix_format_e m_format; - unsigned m_bpp; - rendering_buffer m_rbuf_window; - rendering_buffer m_rbuf_img[max_images]; - unsigned m_window_flags; - bool m_wait_mode; - bool m_flip_y; - char m_caption[256]; - int m_initial_width; - int m_initial_height; - trans_affine m_resize_mtx; - }; - - -} - - - -#endif - diff --git a/uppdev/aggdraw/platform/mac/agg_mac_pmap.cpp b/uppdev/aggdraw/platform/mac/agg_mac_pmap.cpp deleted file mode 100644 index c5510691e..000000000 --- a/uppdev/aggdraw/platform/mac/agg_mac_pmap.cpp +++ /dev/null @@ -1,298 +0,0 @@ -//---------------------------------------------------------------------------- -// -//---------------------------------------------------------------------------- -// Contact: mcseemagg@yahoo.com -// baer@karto.baug.ethz.ch -//---------------------------------------------------------------------------- -// -// class pixel_map -// -//---------------------------------------------------------------------------- - -#include -#include -#include -#include -#include "platform/mac/agg_mac_pmap.h" -#include "agg_basics.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - pixel_map::~pixel_map() - { - destroy(); - } - - - //------------------------------------------------------------------------ - pixel_map::pixel_map() : - m_pmap(0), - m_buf(0), - m_bpp(0), - m_img_size(0) - - { - } - - - //------------------------------------------------------------------------ - void pixel_map::destroy() - { - delete[] m_buf; - m_buf = NULL; - if (m_pmap != nil) - { - DisposeGWorld(m_pmap); - m_pmap = nil; - } - } - - - //------------------------------------------------------------------------ - void pixel_map::create(unsigned width, - unsigned height, - org_e org, - unsigned clear_val) - { - destroy(); - if(width == 0) width = 1; - if(height == 0) height = 1; - m_bpp = org; - - Rect r; - int row_bytes = calc_row_len (width, m_bpp); - MacSetRect(&r, 0, 0, width, height); - m_buf = new unsigned char[m_img_size = row_bytes * height]; - // The Quicktime version for creating GWorlds is more flexible than the classical function. - QTNewGWorldFromPtr (&m_pmap, m_bpp, &r, nil, nil, 0, m_buf, row_bytes); - - // create_gray_scale_palette(m_pmap); I didn't care about gray scale palettes so far. - if(clear_val <= 255) - { - memset(m_buf, clear_val, m_img_size); - } - } - - - - //------------------------------------------------------------------------ - void pixel_map::clear(unsigned clear_val) - { - if(m_buf) memset(m_buf, clear_val, m_img_size); - } - - - //static - //This function is just copied from the Win32 plattform support. - //Is also seems to be appropriate for MacOS as well, but it is not - //thouroughly tested so far. - //------------------------------------------------------------------------ - - unsigned pixel_map::calc_row_len(unsigned width, unsigned bits_per_pixel) - { - unsigned n = width; - unsigned k; - - switch(bits_per_pixel) - { - case 1: k = n; - n = n >> 3; - if(k & 7) n++; - break; - - case 4: k = n; - n = n >> 1; - if(k & 3) n++; - break; - - case 8: - break; - - case 16: n = n << 1; - break; - - case 24: n = (n << 1) + n; - break; - - case 32: n = n << 2; - break; - - default: n = 0; - break; - } - return ((n + 3) >> 2) << 2; - } - - - - - //------------------------------------------------------------------------ - void pixel_map::draw(WindowRef window, const Rect *device_rect, const Rect *pmap_rect) const - { - if(m_pmap == nil || m_buf == NULL) return; - - PixMapHandle pm = GetGWorldPixMap (m_pmap); - CGrafPtr port = GetWindowPort (window); - Rect dest_rect; - - // Again, I used the Quicktime version. - // Good old 'CopyBits' does better interpolation when scaling - // but does not support all pixel depths. - MacSetRect (&dest_rect, 0, 0, this->width(), this->height()); - ImageDescriptionHandle image_description; - MakeImageDescriptionForPixMap (pm, &image_description); - if (image_description != nil) - { - DecompressImage (GetPixBaseAddr (pm), image_description, GetPortPixMap (port), nil, &dest_rect, ditherCopy, nil); - DisposeHandle ((Handle) image_description); - } - } - - - //------------------------------------------------------------------------ - void pixel_map::draw(WindowRef window, int x, int y, double scale) const - { - if(m_pmap == nil || m_buf == NULL) return; - unsigned width = (unsigned)(this->width() * scale); - unsigned height = (unsigned)(this->height() * scale); - Rect rect; - SetRect (&rect, x, y, x + width, y + height); - draw(window, &rect); - } - - - - //------------------------------------------------------------------------ - void pixel_map::blend(WindowRef window, const Rect *device_rect, const Rect *bmp_rect) const - { - draw (window, device_rect, bmp_rect); // currently just mapped to drawing method - } - - - //------------------------------------------------------------------------ - void pixel_map::blend(WindowRef window, int x, int y, double scale) const - { - draw(window, x, y, scale); // currently just mapped to drawing method - } - - - // I let Quicktime handle image import since it supports most popular - // image formats such as: - // *.psd, *.bmp, *.tif, *.png, *.jpg, *.gif, *.pct, *.pcx - //------------------------------------------------------------------------ - bool pixel_map::load_from_qt(const char *filename) - { - FSSpec fss; - OSErr err; - - // get file specification to application directory - err = HGetVol(nil, &fss.vRefNum, &fss.parID); - if (err == noErr) - { - CopyCStringToPascal(filename, fss.name); - GraphicsImportComponent gi; - err = GetGraphicsImporterForFile (&fss, &gi); - if (err == noErr) - { - ImageDescriptionHandle desc; - GraphicsImportGetImageDescription(gi, &desc); -// For simplicity, all images are currently converted to 32 bit. - // create an empty pixelmap - short depth = 32; - create ((**desc).width, (**desc).height, (org_e)depth, 0xff); - DisposeHandle ((Handle)desc); - // let Quicktime draw to pixelmap - GraphicsImportSetGWorld(gi, m_pmap, nil); - GraphicsImportDraw(gi); -// Well, this is a hack. The graphics importer sets the alpha channel of the pixelmap to 0x00 -// for imported images without alpha channel but this would cause agg to draw an invisible image. - // set alpha channel to 0xff - unsigned char * buf = m_buf; - for (unsigned int size = 0; size < m_img_size; size += 4) - { - *buf = 0xff; - buf += 4; - } - } - } - return err == noErr; - } - - - - //------------------------------------------------------------------------ - bool pixel_map::save_as_qt(const char *filename) const - { - FSSpec fss; - OSErr err; - - // get file specification to application directory - err = HGetVol(nil, &fss.vRefNum, &fss.parID); - if (err == noErr) - { - GraphicsExportComponent ge; - CopyCStringToPascal(filename, fss.name); - // I decided to use PNG as output image file type. - // There are a number of other available formats. - // Should I check the file suffix to choose the image file format? - err = OpenADefaultComponent(GraphicsExporterComponentType, kQTFileTypePNG, &ge); - if (err == noErr) - { - err = GraphicsExportSetInputGWorld(ge, m_pmap); - if (err == noErr) - { - err = GraphicsExportSetOutputFile (ge, &fss); - if (err == noErr) - { - GraphicsExportDoExport(ge, nil); - } - } - CloseComponent(ge); - } - } - - return err == noErr; - } - - //------------------------------------------------------------------------ - unsigned char* pixel_map::buf() - { - return m_buf; - } - - //------------------------------------------------------------------------ - unsigned pixel_map::width() const - { - if(m_pmap == nil) return 0; - PixMapHandle pm = GetGWorldPixMap (m_pmap); - Rect bounds; - GetPixBounds (pm, &bounds); - return bounds.right - bounds.left; - } - - //------------------------------------------------------------------------ - unsigned pixel_map::height() const - { - if(m_pmap == nil) return 0; - PixMapHandle pm = GetGWorldPixMap (m_pmap); - Rect bounds; - GetPixBounds (pm, &bounds); - return bounds.bottom - bounds.top; - } - - //------------------------------------------------------------------------ - int pixel_map::row_bytes() const - { - if(m_pmap == nil) return 0; - PixMapHandle pm = GetGWorldPixMap (m_pmap); - return calc_row_len(width(), GetPixDepth(pm)); - } - - - -} - - - diff --git a/uppdev/aggdraw/platform/mac/agg_mac_pmap.h b/uppdev/aggdraw/platform/mac/agg_mac_pmap.h deleted file mode 100644 index e7633b800..000000000 --- a/uppdev/aggdraw/platform/mac/agg_mac_pmap.h +++ /dev/null @@ -1,92 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Copyright (C) 2002 Hansruedi Baer (MacOS support) -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_MAC_PMAP_INCLUDED -#define AGG_MAC_PMAP_INCLUDED - - -#include -#include - - -namespace agg -{ - enum org_e - { - org_mono8 = 8, - org_color16 = 16, - org_color24 = 24, - org_color32 = 32 - }; - - class pixel_map - { - public: - ~pixel_map(); - pixel_map(); - - public: - void destroy(); - void create(unsigned width, - unsigned height, - org_e org, - unsigned clear_val=255); - - void clear(unsigned clear_val=255); - bool load_from_qt(const char* filename); - bool save_as_qt(const char* filename) const; - - void draw(WindowRef window, - const Rect* device_rect=0, - const Rect* bmp_rect=0) const; - void draw(WindowRef window, int x, int y, double scale=1.0) const; - void blend(WindowRef window, - const Rect* device_rect=0, - const Rect* bmp_rect=0) const; - void blend(WindowRef window, int x, int y, double scale=1.0) const; - - unsigned char* buf(); - unsigned width() const; - unsigned height() const; - int row_bytes() const; - unsigned bpp() const { return m_bpp; } - - //Auxiliary static functions - static unsigned calc_row_len(unsigned width, unsigned bits_per_pixel); - private: - pixel_map(const pixel_map&); - const pixel_map& operator = (const pixel_map&); - - private: - GWorldPtr m_pmap; - unsigned char* m_buf; - unsigned m_bpp; - unsigned m_img_size; - }; - -} - - -#endif diff --git a/uppdev/aggdraw/platform/mac/agg_platform_support.cpp b/uppdev/aggdraw/platform/mac/agg_platform_support.cpp deleted file mode 100644 index 19335806e..000000000 --- a/uppdev/aggdraw/platform/mac/agg_platform_support.cpp +++ /dev/null @@ -1,1057 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Copyright (C) 2003 Hansruedi Baer (MacOS support, baer@karto.baug.eth.ch) -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// Note from Hansruedi Baer: -// I tried to retain the original structure for the Win32 platform as far -// as possible. Currently, not all features are implemented but the examples -// should work properly. -// HB -//---------------------------------------------------------------------------- - -#include -#if defined(__MWERKS__) -#include "console.h" -#endif -#include -#include -#include "platform/agg_platform_support.h" -#include "platform/mac/agg_mac_pmap.h" -#include "util/agg_color_conv_rgb8.h" - - -namespace agg -{ - -pascal OSStatus DoWindowClose (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData); -pascal OSStatus DoWindowDrawContent (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData); -pascal OSStatus DoAppQuit (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData); -pascal OSStatus DoMouseDown (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData); -pascal OSStatus DoMouseUp (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData); -pascal OSStatus DoMouseDragged (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData); -pascal OSStatus DoKeyDown (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData); -pascal OSStatus DoKeyUp (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData); -pascal void DoPeriodicTask (EventLoopTimerRef theTimer, void* userData); - - - //------------------------------------------------------------------------ - class platform_specific - { - public: - platform_specific(pix_format_e format, bool flip_y); - - void create_pmap(unsigned width, unsigned height, - rendering_buffer* wnd); - - void display_pmap(WindowRef window, const rendering_buffer* src); - bool load_pmap(const char* fn, unsigned idx, - rendering_buffer* dst); - - bool save_pmap(const char* fn, unsigned idx, - const rendering_buffer* src); - - unsigned translate(unsigned keycode); - - pix_format_e m_format; - pix_format_e m_sys_format; - bool m_flip_y; - unsigned m_bpp; - unsigned m_sys_bpp; - WindowRef m_window; - pixel_map m_pmap_window; - pixel_map m_pmap_img[platform_support::max_images]; - unsigned m_keymap[256]; - unsigned m_last_translated_key; - int m_cur_x; - int m_cur_y; - unsigned m_input_flags; - bool m_redraw_flag; - UnsignedWide m_sw_freq; - UnsignedWide m_sw_start; - }; - - - //------------------------------------------------------------------------ - platform_specific::platform_specific(pix_format_e format, bool flip_y) : - m_format(format), - m_sys_format(pix_format_undefined), - m_flip_y(flip_y), - m_bpp(0), - m_sys_bpp(0), - m_window(nil), - m_last_translated_key(0), - m_cur_x(0), - m_cur_y(0), - m_input_flags(0), - m_redraw_flag(true) - { - memset(m_keymap, 0, sizeof(m_keymap)); - - //Keyboard input is not yet fully supported nor tested - //m_keymap[VK_PAUSE] = key_pause; - m_keymap[kClearCharCode] = key_clear; - - //m_keymap[VK_NUMPAD0] = key_kp0; - //m_keymap[VK_NUMPAD1] = key_kp1; - //m_keymap[VK_NUMPAD2] = key_kp2; - //m_keymap[VK_NUMPAD3] = key_kp3; - //m_keymap[VK_NUMPAD4] = key_kp4; - //m_keymap[VK_NUMPAD5] = key_kp5; - //m_keymap[VK_NUMPAD6] = key_kp6; - //m_keymap[VK_NUMPAD7] = key_kp7; - //m_keymap[VK_NUMPAD8] = key_kp8; - //m_keymap[VK_NUMPAD9] = key_kp9; - //m_keymap[VK_DECIMAL] = key_kp_period; - //m_keymap[VK_DIVIDE] = key_kp_divide; - //m_keymap[VK_MULTIPLY] = key_kp_multiply; - //m_keymap[VK_SUBTRACT] = key_kp_minus; - //m_keymap[VK_ADD] = key_kp_plus; - - m_keymap[kUpArrowCharCode] = key_up; - m_keymap[kDownArrowCharCode] = key_down; - m_keymap[kRightArrowCharCode] = key_right; - m_keymap[kLeftArrowCharCode] = key_left; - //m_keymap[VK_INSERT] = key_insert; - m_keymap[kDeleteCharCode] = key_delete; - m_keymap[kHomeCharCode] = key_home; - m_keymap[kEndCharCode] = key_end; - m_keymap[kPageUpCharCode] = key_page_up; - m_keymap[kPageDownCharCode] = key_page_down; - - //m_keymap[VK_F1] = key_f1; - //m_keymap[VK_F2] = key_f2; - //m_keymap[VK_F3] = key_f3; - //m_keymap[VK_F4] = key_f4; - //m_keymap[VK_F5] = key_f5; - //m_keymap[VK_F6] = key_f6; - //m_keymap[VK_F7] = key_f7; - //m_keymap[VK_F8] = key_f8; - //m_keymap[VK_F9] = key_f9; - //m_keymap[VK_F10] = key_f10; - //m_keymap[VK_F11] = key_f11; - //m_keymap[VK_F12] = key_f12; - //m_keymap[VK_F13] = key_f13; - //m_keymap[VK_F14] = key_f14; - //m_keymap[VK_F15] = key_f15; - - //m_keymap[VK_NUMLOCK] = key_numlock; - //m_keymap[VK_CAPITAL] = key_capslock; - //m_keymap[VK_SCROLL] = key_scrollock; - - switch(m_format) - { - case pix_format_gray8: - m_sys_format = pix_format_gray8; - m_bpp = 8; - m_sys_bpp = 8; - break; - - case pix_format_rgb565: - case pix_format_rgb555: - m_sys_format = pix_format_rgb555; - m_bpp = 16; - m_sys_bpp = 16; - break; - - case pix_format_rgb24: - case pix_format_bgr24: - m_sys_format = pix_format_rgb24; - m_bpp = 24; - m_sys_bpp = 24; - break; - - case pix_format_bgra32: - case pix_format_abgr32: - case pix_format_argb32: - case pix_format_rgba32: - m_sys_format = pix_format_argb32; - m_bpp = 32; - m_sys_bpp = 32; - break; - } - ::Microseconds(&m_sw_freq); - ::Microseconds(&m_sw_start); - } - - - //------------------------------------------------------------------------ - void platform_specific::create_pmap(unsigned width, - unsigned height, - rendering_buffer* wnd) - { - m_pmap_window.create(width, height, org_e(m_bpp)); - wnd->attach(m_pmap_window.buf(), - m_pmap_window.width(), - m_pmap_window.height(), - m_flip_y ? - -m_pmap_window.row_bytes() : - m_pmap_window.row_bytes()); - } - - - //------------------------------------------------------------------------ - void platform_specific::display_pmap(WindowRef window, const rendering_buffer* src) - { - if(m_sys_format == m_format) - { - m_pmap_window.draw(window); - } - else - { - pixel_map pmap_tmp; - pmap_tmp.create(m_pmap_window.width(), - m_pmap_window.height(), - org_e(m_sys_bpp)); - - rendering_buffer rbuf_tmp; - rbuf_tmp.attach(pmap_tmp.buf(), - pmap_tmp.width(), - pmap_tmp.height(), - m_flip_y ? - -pmap_tmp.row_bytes() : - pmap_tmp.row_bytes()); - - switch(m_format) - { - case pix_format_gray8: - return; - - case pix_format_rgb565: - color_conv(&rbuf_tmp, src, color_conv_rgb565_to_rgb555()); - break; - - case pix_format_bgr24: - color_conv(&rbuf_tmp, src, color_conv_bgr24_to_rgb24()); - break; - - case pix_format_abgr32: - color_conv(&rbuf_tmp, src, color_conv_abgr32_to_argb32()); - break; - - case pix_format_bgra32: - color_conv(&rbuf_tmp, src, color_conv_bgra32_to_argb32()); - break; - - case pix_format_rgba32: - color_conv(&rbuf_tmp, src, color_conv_rgba32_to_argb32()); - break; - } - pmap_tmp.draw(window); - } - } - - - //------------------------------------------------------------------------ - bool platform_specific::save_pmap(const char* fn, unsigned idx, - const rendering_buffer* src) - { - if(m_sys_format == m_format) - { - return m_pmap_img[idx].save_as_qt(fn); - } - else - { - pixel_map pmap_tmp; - pmap_tmp.create(m_pmap_img[idx].width(), - m_pmap_img[idx].height(), - org_e(m_sys_bpp)); - - rendering_buffer rbuf_tmp; - rbuf_tmp.attach(pmap_tmp.buf(), - pmap_tmp.width(), - pmap_tmp.height(), - m_flip_y ? - -pmap_tmp.row_bytes() : - pmap_tmp.row_bytes()); - switch(m_format) - { - case pix_format_gray8: - return false; - - case pix_format_rgb565: - color_conv(&rbuf_tmp, src, color_conv_rgb565_to_rgb555()); - break; - - case pix_format_rgb24: - color_conv(&rbuf_tmp, src, color_conv_rgb24_to_bgr24()); - break; - - case pix_format_abgr32: - color_conv(&rbuf_tmp, src, color_conv_abgr32_to_bgra32()); - break; - - case pix_format_argb32: - color_conv(&rbuf_tmp, src, color_conv_argb32_to_bgra32()); - break; - - case pix_format_rgba32: - color_conv(&rbuf_tmp, src, color_conv_rgba32_to_bgra32()); - break; - } - return pmap_tmp.save_as_qt(fn); - } - return true; - } - - - - //------------------------------------------------------------------------ - bool platform_specific::load_pmap(const char* fn, unsigned idx, - rendering_buffer* dst) - { - pixel_map pmap_tmp; - if(!pmap_tmp.load_from_qt(fn)) return false; - - rendering_buffer rbuf_tmp; - rbuf_tmp.attach(pmap_tmp.buf(), - pmap_tmp.width(), - pmap_tmp.height(), - m_flip_y ? - -pmap_tmp.row_bytes() : - pmap_tmp.row_bytes()); - - m_pmap_img[idx].create(pmap_tmp.width(), - pmap_tmp.height(), - org_e(m_bpp), - 0); - - dst->attach(m_pmap_img[idx].buf(), - m_pmap_img[idx].width(), - m_pmap_img[idx].height(), - m_flip_y ? - -m_pmap_img[idx].row_bytes() : - m_pmap_img[idx].row_bytes()); - - switch(m_format) - { - case pix_format_gray8: - return false; - break; - - case pix_format_rgb555: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_rgb555()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_rgb24_to_rgb555()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_argb32_to_rgb555()); break; - } - break; - - case pix_format_rgb565: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_rgb565()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_rgb24_to_rgb565()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_argb32_to_rgb565()); break; - } - break; - - case pix_format_rgb24: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_rgb24()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_rgb24_to_rgb24()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_argb32_to_rgb24()); break; - } - break; - - case pix_format_bgr24: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_bgr24()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_rgb24_to_bgr24()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_argb32_to_bgr24()); break; - } - break; - - case pix_format_abgr32: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_abgr32()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_rgb24_to_abgr32()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_argb32_to_abgr32()); break; - } - break; - - case pix_format_argb32: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_argb32()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_rgb24_to_argb32()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_argb32_to_argb32()); break; - } - break; - - case pix_format_bgra32: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_bgra32()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_rgb24_to_bgra32()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_argb32_to_bgra32()); break; - } - break; - - case pix_format_rgba32: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_rgba32()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_rgb24_to_rgba32()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_argb32_to_rgba32()); break; - } - break; - } - - return true; - } - - - - - - - - - //------------------------------------------------------------------------ - unsigned platform_specific::translate(unsigned keycode) - { - return m_last_translated_key = (keycode > 255) ? 0 : m_keymap[keycode]; - } - - - - //------------------------------------------------------------------------ - platform_support::platform_support(pix_format_e format, bool flip_y) : - m_specific(new platform_specific(format, flip_y)), - m_format(format), - m_bpp(m_specific->m_bpp), - m_window_flags(0), - m_wait_mode(true), - m_flip_y(flip_y), - m_initial_width(10), - m_initial_height(10) - { - strcpy(m_caption, "Anti-Grain Geometry Application"); - } - - - //------------------------------------------------------------------------ - platform_support::~platform_support() - { - delete m_specific; - } - - - - //------------------------------------------------------------------------ - void platform_support::caption(const char* cap) - { - strcpy(m_caption, cap); - if(m_specific->m_window) - { - SetWindowTitleWithCFString (m_specific->m_window, CFStringCreateWithCStringNoCopy (nil, cap, kCFStringEncodingASCII, nil)); - } - } - - - - //------------------------------------------------------------------------ - static unsigned get_key_flags(UInt32 wflags) - { - unsigned flags = 0; - - if(wflags & shiftKey) flags |= kbd_shift; - if(wflags & controlKey) flags |= kbd_ctrl; - - return flags; - } - - - //------------------------------------------------------------------------ - void platform_support::message(const char* msg) - { - SInt16 item; - Str255 p_msg; - - ::CopyCStringToPascal (msg, p_msg); - ::StandardAlert (kAlertPlainAlert, (const unsigned char*) "\013AGG Message", p_msg, NULL, &item); - //::StandardAlert (kAlertPlainAlert, (const unsigned char*) "\pAGG Message", p_msg, NULL, &item); - } - - - //------------------------------------------------------------------------ - void platform_support::start_timer() - { - ::Microseconds (&(m_specific->m_sw_start)); - } - - - //------------------------------------------------------------------------ - double platform_support::elapsed_time() const - { - UnsignedWide stop; - ::Microseconds(&stop); - return double(stop.lo - - m_specific->m_sw_start.lo) * 1e6 / - double(m_specific->m_sw_freq.lo); - } - - - //------------------------------------------------------------------------ - bool platform_support::init(unsigned width, unsigned height, unsigned flags) - { - if(m_specific->m_sys_format == pix_format_undefined) - { - return false; - } - - m_window_flags = flags; - - // application - EventTypeSpec eventType; - EventHandlerUPP handlerUPP; - - eventType.eventClass = kEventClassApplication; - eventType.eventKind = kEventAppQuit; - - handlerUPP = NewEventHandlerUPP(DoAppQuit); - - InstallApplicationEventHandler (handlerUPP, 1, &eventType, nil, nil); - - eventType.eventClass = kEventClassMouse; - eventType.eventKind = kEventMouseDown; - handlerUPP = NewEventHandlerUPP(DoMouseDown); - InstallApplicationEventHandler (handlerUPP, 1, &eventType, this, nil); - - eventType.eventKind = kEventMouseUp; - handlerUPP = NewEventHandlerUPP(DoMouseUp); - InstallApplicationEventHandler (handlerUPP, 1, &eventType, this, nil); - - eventType.eventKind = kEventMouseDragged; - handlerUPP = NewEventHandlerUPP(DoMouseDragged); - InstallApplicationEventHandler (handlerUPP, 1, &eventType, this, nil); - - eventType.eventClass = kEventClassKeyboard; - eventType.eventKind = kEventRawKeyDown; - handlerUPP = NewEventHandlerUPP(DoKeyDown); - InstallApplicationEventHandler (handlerUPP, 1, &eventType, this, nil); - - eventType.eventKind = kEventRawKeyUp; - handlerUPP = NewEventHandlerUPP(DoKeyUp); - InstallApplicationEventHandler (handlerUPP, 1, &eventType, this, nil); - - eventType.eventKind = kEventRawKeyRepeat; - handlerUPP = NewEventHandlerUPP(DoKeyDown); // 'key repeat' is translated to 'key down' - InstallApplicationEventHandler (handlerUPP, 1, &eventType, this, nil); - - WindowAttributes windowAttrs; - Rect bounds; - - // window - windowAttrs = kWindowCloseBoxAttribute | kWindowCollapseBoxAttribute | kWindowStandardHandlerAttribute; - SetRect (&bounds, 0, 0, width, height); - OffsetRect (&bounds, 100, 100); - CreateNewWindow (kDocumentWindowClass, windowAttrs, &bounds, &m_specific->m_window); - - if(m_specific->m_window == nil) - { - return false; - } - - // I assume the text is ASCII. - // Change to kCFStringEncodingMacRoman, kCFStringEncodingISOLatin1, kCFStringEncodingUTF8 or what else you need. - SetWindowTitleWithCFString (m_specific->m_window, CFStringCreateWithCStringNoCopy (nil, m_caption, kCFStringEncodingASCII, nil)); - - eventType.eventClass = kEventClassWindow; - eventType.eventKind = kEventWindowClose; - - handlerUPP = NewEventHandlerUPP(DoWindowClose); - InstallWindowEventHandler (m_specific->m_window, handlerUPP, 1, &eventType, this, NULL); - - eventType.eventKind = kEventWindowDrawContent; - handlerUPP = NewEventHandlerUPP(DoWindowDrawContent); - InstallWindowEventHandler (m_specific->m_window, handlerUPP, 1, &eventType, this, NULL); - - // Periodic task - // Instead of an idle function I use the Carbon event timer. - // You may decide to change the wait value which is currently 50 milliseconds. - EventLoopRef mainLoop; - EventLoopTimerUPP timerUPP; - EventLoopTimerRef theTimer; - - mainLoop = GetMainEventLoop(); - timerUPP = NewEventLoopTimerUPP (DoPeriodicTask); - InstallEventLoopTimer (mainLoop, 0, 50 * kEventDurationMillisecond, timerUPP, this, &theTimer); - - m_specific->create_pmap(width, height, &m_rbuf_window); - m_initial_width = width; - m_initial_height = height; - on_init(); - on_resize(width, height); - m_specific->m_redraw_flag = true; - - ShowWindow (m_specific->m_window); - SetPortWindowPort (m_specific->m_window); - - return true; - } - - - //------------------------------------------------------------------------ - int platform_support::run() - { - - RunApplicationEventLoop (); - return true; - } - - - //------------------------------------------------------------------------ - const char* platform_support::img_ext() const { return ".bmp"; } - - //------------------------------------------------------------------------ - const char* platform_support::full_file_name(const char* file_name) - { - return file_name; - } - - //------------------------------------------------------------------------ - bool platform_support::load_img(unsigned idx, const char* file) - { - if(idx < max_images) - { - char fn[1024]; - strcpy(fn, file); - int len = strlen(fn); -#if defined(__MWERKS__) - if(len < 4 || stricmp(fn + len - 4, ".BMP") != 0) -#else - if(len < 4 || strncasecmp(fn + len - 4, ".BMP", 4) != 0) -#endif - { - strcat(fn, ".bmp"); - } - return m_specific->load_pmap(fn, idx, &m_rbuf_img[idx]); - } - return true; - } - - - - //------------------------------------------------------------------------ - bool platform_support::save_img(unsigned idx, const char* file) - { - if(idx < max_images) - { - char fn[1024]; - strcpy(fn, file); - int len = strlen(fn); -#if defined(__MWERKS__) - if(len < 4 || stricmp(fn + len - 4, ".BMP") != 0) -#else - if(len < 4 || strncasecmp(fn + len - 4, ".BMP", 4) != 0) -#endif - { - strcat(fn, ".bmp"); - } - return m_specific->save_pmap(fn, idx, &m_rbuf_img[idx]); - } - return true; - } - - - - //------------------------------------------------------------------------ - bool platform_support::create_img(unsigned idx, unsigned width, unsigned height) - { - if(idx < max_images) - { - if(width == 0) width = m_specific->m_pmap_window.width(); - if(height == 0) height = m_specific->m_pmap_window.height(); - m_specific->m_pmap_img[idx].create(width, height, org_e(m_specific->m_bpp)); - m_rbuf_img[idx].attach(m_specific->m_pmap_img[idx].buf(), - m_specific->m_pmap_img[idx].width(), - m_specific->m_pmap_img[idx].height(), - m_flip_y ? - -m_specific->m_pmap_img[idx].row_bytes() : - m_specific->m_pmap_img[idx].row_bytes()); - return true; - } - return false; - } - - - //------------------------------------------------------------------------ - void platform_support::force_redraw() - { - Rect bounds; - - m_specific->m_redraw_flag = true; - // on_ctrl_change (); - on_draw(); - - SetRect(&bounds, 0, 0, m_rbuf_window.width(), m_rbuf_window.height()); - InvalWindowRect(m_specific->m_window, &bounds); - } - - - - //------------------------------------------------------------------------ - void platform_support::update_window() - { - m_specific->display_pmap(m_specific->m_window, &m_rbuf_window); - } - - - //------------------------------------------------------------------------ - void platform_support::on_init() {} - void platform_support::on_resize(int sx, int sy) {} - void platform_support::on_idle() {} - void platform_support::on_mouse_move(int x, int y, unsigned flags) {} - void platform_support::on_mouse_button_down(int x, int y, unsigned flags) {} - void platform_support::on_mouse_button_up(int x, int y, unsigned flags) {} - void platform_support::on_key(int x, int y, unsigned key, unsigned flags) {} - void platform_support::on_ctrl_change() {} - void platform_support::on_draw() {} - void platform_support::on_post_draw(void* raw_handler) {} - - -//------------------------------------------------------------------------ -pascal OSStatus DoWindowClose (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData) -{ - userData; - - QuitApplicationEventLoop (); - - return CallNextEventHandler (nextHandler, theEvent); -} - - -//------------------------------------------------------------------------ -pascal OSStatus DoAppQuit (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData) -{ - userData; - - return CallNextEventHandler (nextHandler, theEvent); -} - - -//------------------------------------------------------------------------ -pascal OSStatus DoMouseDown (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData) -{ - Point wheresMyMouse; - UInt32 modifier; - - GetEventParameter (theEvent, kEventParamMouseLocation, typeQDPoint, NULL, sizeof(Point), NULL, &wheresMyMouse); - GlobalToLocal (&wheresMyMouse); - GetEventParameter (theEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifier); - - platform_support * app = reinterpret_cast(userData); - - app->m_specific->m_cur_x = wheresMyMouse.h; - if(app->flip_y()) - { - app->m_specific->m_cur_y = app->rbuf_window().height() - wheresMyMouse.v; - } - else - { - app->m_specific->m_cur_y = wheresMyMouse.v; - } - app->m_specific->m_input_flags = mouse_left | get_key_flags(modifier); - - app->m_ctrls.set_cur(app->m_specific->m_cur_x, - app->m_specific->m_cur_y); - if(app->m_ctrls.on_mouse_button_down(app->m_specific->m_cur_x, - app->m_specific->m_cur_y)) - { - app->on_ctrl_change(); - app->force_redraw(); - } - else - { - if(app->m_ctrls.in_rect(app->m_specific->m_cur_x, - app->m_specific->m_cur_y)) - { - if(app->m_ctrls.set_cur(app->m_specific->m_cur_x, - app->m_specific->m_cur_y)) - { - app->on_ctrl_change(); - app->force_redraw(); - } - } - else - { - app->on_mouse_button_down(app->m_specific->m_cur_x, - app->m_specific->m_cur_y, - app->m_specific->m_input_flags); - } - } - - return CallNextEventHandler (nextHandler, theEvent); -} - - -//------------------------------------------------------------------------ -pascal OSStatus DoMouseUp (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData) -{ - Point wheresMyMouse; - UInt32 modifier; - - GetEventParameter (theEvent, kEventParamMouseLocation, typeQDPoint, NULL, sizeof(Point), NULL, &wheresMyMouse); - GlobalToLocal (&wheresMyMouse); - GetEventParameter (theEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifier); - - platform_support * app = reinterpret_cast(userData); - - app->m_specific->m_cur_x = wheresMyMouse.h; - if(app->flip_y()) - { - app->m_specific->m_cur_y = app->rbuf_window().height() - wheresMyMouse.v; - } - else - { - app->m_specific->m_cur_y = wheresMyMouse.v; - } - app->m_specific->m_input_flags = mouse_left | get_key_flags(modifier); - - if(app->m_ctrls.on_mouse_button_up(app->m_specific->m_cur_x, - app->m_specific->m_cur_y)) - { - app->on_ctrl_change(); - app->force_redraw(); - } - app->on_mouse_button_up(app->m_specific->m_cur_x, - app->m_specific->m_cur_y, - app->m_specific->m_input_flags); - - return CallNextEventHandler (nextHandler, theEvent); -} - - -//------------------------------------------------------------------------ -pascal OSStatus DoMouseDragged (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData) -{ - Point wheresMyMouse; - UInt32 modifier; - - GetEventParameter (theEvent, kEventParamMouseLocation, typeQDPoint, NULL, sizeof(Point), NULL, &wheresMyMouse); - GlobalToLocal (&wheresMyMouse); - GetEventParameter (theEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifier); - - platform_support * app = reinterpret_cast(userData); - - app->m_specific->m_cur_x = wheresMyMouse.h; - if(app->flip_y()) - { - app->m_specific->m_cur_y = app->rbuf_window().height() - wheresMyMouse.v; - } - else - { - app->m_specific->m_cur_y = wheresMyMouse.v; - } - app->m_specific->m_input_flags = mouse_left | get_key_flags(modifier); - - - if(app->m_ctrls.on_mouse_move( - app->m_specific->m_cur_x, - app->m_specific->m_cur_y, - (app->m_specific->m_input_flags & mouse_left) != 0)) - { - app->on_ctrl_change(); - app->force_redraw(); - } - else - { - app->on_mouse_move(app->m_specific->m_cur_x, - app->m_specific->m_cur_y, - app->m_specific->m_input_flags); - } - - return CallNextEventHandler (nextHandler, theEvent); -} - - -//------------------------------------------------------------------------ -pascal OSStatus DoKeyDown (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData) -{ - char key_code; - UInt32 modifier; - - GetEventParameter (theEvent, kEventParamKeyMacCharCodes, typeChar, NULL, sizeof(char), NULL, &key_code); - GetEventParameter (theEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifier); - - platform_support * app = reinterpret_cast(userData); - - app->m_specific->m_last_translated_key = 0; - switch(modifier) - { - case controlKey: - app->m_specific->m_input_flags |= kbd_ctrl; - break; - - case shiftKey: - app->m_specific->m_input_flags |= kbd_shift; - break; - - default: - app->m_specific->translate(key_code); - break; - } - - if(app->m_specific->m_last_translated_key) - { - bool left = false; - bool up = false; - bool right = false; - bool down = false; - - switch(app->m_specific->m_last_translated_key) - { - case key_left: - left = true; - break; - - case key_up: - up = true; - break; - - case key_right: - right = true; - break; - - case key_down: - down = true; - break; - - //On a Mac, screenshots are handled by the system. - case key_f2: - app->copy_window_to_img(agg::platform_support::max_images - 1); - app->save_img(agg::platform_support::max_images - 1, "screenshot"); - break; - } - - - if(app->m_ctrls.on_arrow_keys(left, right, down, up)) - { - app->on_ctrl_change(); - app->force_redraw(); - } - else - { - app->on_key(app->m_specific->m_cur_x, - app->m_specific->m_cur_y, - app->m_specific->m_last_translated_key, - app->m_specific->m_input_flags); - } - } - - return CallNextEventHandler (nextHandler, theEvent); -} - - -//------------------------------------------------------------------------ -pascal OSStatus DoKeyUp (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData) -{ - char key_code; - UInt32 modifier; - - GetEventParameter (theEvent, kEventParamKeyMacCharCodes, typeChar, NULL, sizeof(char), NULL, &key_code); - GetEventParameter (theEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifier); - - platform_support * app = reinterpret_cast(userData); - - app->m_specific->m_last_translated_key = 0; - switch(modifier) - { - case controlKey: - app->m_specific->m_input_flags &= ~kbd_ctrl; - break; - - case shiftKey: - app->m_specific->m_input_flags &= ~kbd_shift; - break; - } - - return CallNextEventHandler (nextHandler, theEvent); -} - - -//------------------------------------------------------------------------ -pascal OSStatus DoWindowDrawContent (EventHandlerCallRef nextHandler, EventRef theEvent, void* userData) -{ - platform_support * app = reinterpret_cast(userData); - - if(app) - { - if(app->m_specific->m_redraw_flag) - { - app->on_draw(); - app->m_specific->m_redraw_flag = false; - } - app->m_specific->display_pmap(app->m_specific->m_window, &app->rbuf_window()); - } - - return CallNextEventHandler (nextHandler, theEvent); -} - - -//------------------------------------------------------------------------ -pascal void DoPeriodicTask (EventLoopTimerRef theTimer, void* userData) -{ - platform_support * app = reinterpret_cast(userData); - - if(!app->wait_mode()) - app->on_idle(); -} - - -} - - - - -//---------------------------------------------------------------------------- -int agg_main(int argc, char* argv[]); - - -// Hm. Classic MacOS does not know command line input. -// CodeWarrior provides a way to mimic command line input. -// The function 'ccommand' can be used to get the command -// line arguments. -//---------------------------------------------------------------------------- -int main(int argc, char* argv[]) -{ -#if defined(__MWERKS__) - // argc = ccommand (&argv); -#endif - - // Check if we are launched by double-clicking under OSX - // Get rid of extra argument, this will confuse the standard argument parsing - // calls used in the examples to get the name of the image file to be used - if ( argc >= 2 && strncmp (argv[1], "-psn", 4) == 0 ) { - argc = 1; - } - -launch: - return agg_main(argc, argv); -} \ No newline at end of file diff --git a/uppdev/aggdraw/platform/sdl/agg_platform_support.cpp b/uppdev/aggdraw/platform/sdl/agg_platform_support.cpp deleted file mode 100644 index 357230b3e..000000000 --- a/uppdev/aggdraw/platform/sdl/agg_platform_support.cpp +++ /dev/null @@ -1,714 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Copyright (C) 2004 Mauricio Piacentini (SDL Support) -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#include -#include "platform/agg_platform_support.h" -#include "SDL.h" -#include "SDL_byteorder.h" - - -namespace agg -{ - - //------------------------------------------------------------------------ - class platform_specific - { - public: - platform_specific(pix_format_e format, bool flip_y); - ~platform_specific(); - - pix_format_e m_format; - pix_format_e m_sys_format; - bool m_flip_y; - unsigned m_bpp; - unsigned m_sys_bpp; - unsigned m_rmask; - unsigned m_gmask; - unsigned m_bmask; - unsigned m_amask; - bool m_update_flag; - bool m_resize_flag; - bool m_initialized; - SDL_Surface* m_surf_screen; - SDL_Surface* m_surf_window; - SDL_Surface* m_surf_img[platform_support::max_images]; - int m_cur_x; - int m_cur_y; - int m_sw_start; - }; - - - - //------------------------------------------------------------------------ - platform_specific::platform_specific(pix_format_e format, bool flip_y) : - m_format(format), - m_sys_format(pix_format_undefined), - m_flip_y(flip_y), - m_bpp(0), - m_sys_bpp(0), - m_update_flag(true), - m_resize_flag(true), - m_initialized(false), - m_surf_screen(0), - m_surf_window(0), - m_cur_x(0), - m_cur_y(0) - { - memset(m_surf_img, 0, sizeof(m_surf_img)); - - switch(m_format) - { - case pix_format_gray8: - m_bpp = 8; - break; - - case pix_format_rgb565: - m_rmask = 0xF800; - m_gmask = 0x7E0; - m_bmask = 0x1F; - m_amask = 0; - m_bpp = 16; - break; - - case pix_format_rgb555: - m_rmask = 0x7C00; - m_gmask = 0x3E0; - m_bmask = 0x1F; - m_amask = 0; - m_bpp = 16; - break; - -#if SDL_BYTEORDER == SDL_LIL_ENDIAN - case pix_format_rgb24: - m_rmask = 0xFF; - m_gmask = 0xFF00; - m_bmask = 0xFF0000; - m_amask = 0; - m_bpp = 24; - break; - - case pix_format_bgr24: - m_rmask = 0xFF0000; - m_gmask = 0xFF00; - m_bmask = 0xFF; - m_amask = 0; - m_bpp = 24; - break; - - case pix_format_bgra32: - m_rmask = 0xFF0000; - m_gmask = 0xFF00; - m_bmask = 0xFF; - m_amask = 0xFF000000; - m_bpp = 32; - break; - - case pix_format_abgr32: - m_rmask = 0xFF000000; - m_gmask = 0xFF0000; - m_bmask = 0xFF00; - m_amask = 0xFF; - m_bpp = 32; - break; - - case pix_format_argb32: - m_rmask = 0xFF00; - m_gmask = 0xFF0000; - m_bmask = 0xFF000000; - m_amask = 0xFF; - m_bpp = 32; - break; - - case pix_format_rgba32: - m_rmask = 0xFF; - m_gmask = 0xFF00; - m_bmask = 0xFF0000; - m_amask = 0xFF000000; - m_bpp = 32; - break; -#else //SDL_BIG_ENDIAN (PPC) - case pix_format_rgb24: - m_rmask = 0xFF0000; - m_gmask = 0xFF00; - m_bmask = 0xFF; - m_amask = 0; - m_bpp = 24; - break; - - case pix_format_bgr24: - m_rmask = 0xFF; - m_gmask = 0xFF00; - m_bmask = 0xFF0000; - m_amask = 0; - m_bpp = 24; - break; - - case pix_format_bgra32: - m_rmask = 0xFF00; - m_gmask = 0xFF0000; - m_bmask = 0xFF000000; - m_amask = 0xFF; - m_bpp = 32; - break; - - case pix_format_abgr32: - m_rmask = 0xFF; - m_gmask = 0xFF00; - m_bmask = 0xFF0000; - m_amask = 0xFF000000; - m_bpp = 32; - break; - - case pix_format_argb32: - m_rmask = 0xFF0000; - m_gmask = 0xFF00; - m_bmask = 0xFF; - m_amask = 0xFF000000; - m_bpp = 32; - break; - - case pix_format_rgba32: - m_rmask = 0xFF000000; - m_gmask = 0xFF0000; - m_bmask = 0xFF00; - m_amask = 0xFF; - m_bpp = 32; - break; -#endif - } - } - - //------------------------------------------------------------------------ - platform_specific::~platform_specific() - { - int i; - for(i = platform_support::max_images - 1; i >= 0; --i) - { - if(m_surf_img[i]) SDL_FreeSurface(m_surf_img[i]); - } - if(m_surf_window) SDL_FreeSurface(m_surf_window); - if(m_surf_screen) SDL_FreeSurface(m_surf_screen); - } - - - - //------------------------------------------------------------------------ - platform_support::platform_support(pix_format_e format, bool flip_y) : - m_specific(new platform_specific(format, flip_y)), - m_format(format), - m_bpp(m_specific->m_bpp), - m_window_flags(0), - m_wait_mode(true), - m_flip_y(flip_y) - { - SDL_Init(SDL_INIT_VIDEO); - strcpy(m_caption, "Anti-Grain Geometry Application"); - } - - - //------------------------------------------------------------------------ - platform_support::~platform_support() - { - delete m_specific; - } - - - - //------------------------------------------------------------------------ - void platform_support::caption(const char* cap) - { - strcpy(m_caption, cap); - if(m_specific->m_initialized) - { - SDL_WM_SetCaption(cap, 0); - } - } - - - - - - //------------------------------------------------------------------------ - bool platform_support::init(unsigned width, unsigned height, unsigned flags) - { - m_window_flags = flags; - unsigned wflags = SDL_SWSURFACE; - - if(m_window_flags & window_hw_buffer) - { - wflags = SDL_HWSURFACE; - } - - if(m_window_flags & window_resize) - { - wflags |= SDL_RESIZABLE; - } - - if(m_specific->m_surf_screen) SDL_FreeSurface(m_specific->m_surf_screen); - - m_specific->m_surf_screen = SDL_SetVideoMode(width, height, m_bpp, wflags); - if(m_specific->m_surf_screen == 0) - { - fprintf(stderr, - "Unable to set %dx%d %d bpp video: %s\n", - width, - height, - m_bpp, - ::SDL_GetError()); - return false; - } - - SDL_WM_SetCaption(m_caption, 0); - - if(m_specific->m_surf_window) SDL_FreeSurface(m_specific->m_surf_window); - - m_specific->m_surf_window = - SDL_CreateRGBSurface(SDL_HWSURFACE, - m_specific->m_surf_screen->w, - m_specific->m_surf_screen->h, - m_specific->m_surf_screen->format->BitsPerPixel, - m_specific->m_rmask, - m_specific->m_gmask, - m_specific->m_bmask, - m_specific->m_amask); - - if(m_specific->m_surf_window == 0) - { - fprintf(stderr, - "Unable to create image buffer %dx%d %d bpp: %s\n", - width, - height, - m_bpp, - SDL_GetError()); - return false; - } - - m_rbuf_window.attach((unsigned char*)m_specific->m_surf_window->pixels, - m_specific->m_surf_window->w, - m_specific->m_surf_window->h, - m_flip_y ? -m_specific->m_surf_window->pitch : - m_specific->m_surf_window->pitch); - - if(!m_specific->m_initialized) - { - m_initial_width = width; - m_initial_height = height; - on_init(); - m_specific->m_initialized = true; - } - on_resize(m_rbuf_window.width(), m_rbuf_window.height()); - m_specific->m_update_flag = true; - return true; - } - - - - //------------------------------------------------------------------------ - void platform_support::update_window() - { - SDL_BlitSurface(m_specific->m_surf_window, 0, m_specific->m_surf_screen, 0); - SDL_UpdateRect(m_specific->m_surf_screen, 0, 0, 0, 0); - } - - - //------------------------------------------------------------------------ - int platform_support::run() - { - SDL_Event event; - bool ev_flag = false; - - for(;;) - { - if(m_specific->m_update_flag) - { - on_draw(); - update_window(); - m_specific->m_update_flag = false; - } - - ev_flag = false; - if(m_wait_mode) - { - SDL_WaitEvent(&event); - ev_flag = true; - } - else - { - if(SDL_PollEvent(&event)) - { - ev_flag = true; - } - else - { - on_idle(); - } - } - - if(ev_flag) - { - if(event.type == SDL_QUIT) - { - break; - } - - int y; - unsigned flags = 0; - - switch (event.type) - { - case SDL_VIDEORESIZE: - if(!init(event.resize.w, event.resize.h, m_window_flags)) return false; - on_resize(m_rbuf_window.width(), m_rbuf_window.height()); - trans_affine_resizing(event.resize.w, event.resize.h); - m_specific->m_update_flag = true; - break; - - case SDL_KEYDOWN: - { - flags = 0; - if(event.key.keysym.mod & KMOD_SHIFT) flags |= kbd_shift; - if(event.key.keysym.mod & KMOD_CTRL) flags |= kbd_ctrl; - - bool left = false; - bool up = false; - bool right = false; - bool down = false; - - switch(event.key.keysym.sym) - { - case key_left: - left = true; - break; - - case key_up: - up = true; - break; - - case key_right: - right = true; - break; - - case key_down: - down = true; - break; - } - - if(m_ctrls.on_arrow_keys(left, right, down, up)) - { - on_ctrl_change(); - force_redraw(); - } - else - { - on_key(m_specific->m_cur_x, - m_specific->m_cur_y, - event.key.keysym.sym, - flags); - } - } - break; - - case SDL_MOUSEMOTION: - y = m_flip_y ? - m_rbuf_window.height() - event.motion.y : - event.motion.y; - - m_specific->m_cur_x = event.motion.x; - m_specific->m_cur_y = y; - flags = 0; - if(event.motion.state & SDL_BUTTON_LMASK) flags |= mouse_left; - if(event.motion.state & SDL_BUTTON_RMASK) flags |= mouse_right; - - if(m_ctrls.on_mouse_move(m_specific->m_cur_x, - m_specific->m_cur_y, - (flags & mouse_left) != 0)) - { - on_ctrl_change(); - force_redraw(); - } - else - { - on_mouse_move(m_specific->m_cur_x, - m_specific->m_cur_y, - flags); - } - SDL_Event eventtrash; - while (SDL_PeepEvents(&eventtrash, 1, SDL_GETEVENT, SDL_EVENTMASK(SDL_MOUSEMOTION))!=0){;} - break; - - case SDL_MOUSEBUTTONDOWN: - y = m_flip_y - ? m_rbuf_window.height() - event.button.y - : event.button.y; - - m_specific->m_cur_x = event.button.x; - m_specific->m_cur_y = y; - flags = 0; - switch(event.button.button) - { - case SDL_BUTTON_LEFT: - { - flags = mouse_left; - -if(m_ctrls.on_mouse_button_down(m_specific->m_cur_x, - m_specific->m_cur_y)) - { - m_ctrls.set_cur(m_specific->m_cur_x, - m_specific->m_cur_y); - on_ctrl_change(); - force_redraw(); - } - else - { - if(m_ctrls.in_rect(m_specific->m_cur_x, - m_specific->m_cur_y)) - { - if(m_ctrls.set_cur(m_specific->m_cur_x, - m_specific->m_cur_y)) - { - on_ctrl_change(); - force_redraw(); - } - } - else - { - on_mouse_button_down(m_specific->m_cur_x, - m_specific->m_cur_y, - flags); - } - } - } - break; - case SDL_BUTTON_RIGHT: - flags = mouse_right; - on_mouse_button_down(m_specific->m_cur_x, - m_specific->m_cur_y, - flags); - break; - } //switch(event.button.button) - break; - - case SDL_MOUSEBUTTONUP: - y = m_flip_y - ? m_rbuf_window.height() - event.button.y - : event.button.y; - - m_specific->m_cur_x = event.button.x; - m_specific->m_cur_y = y; - flags = 0; - if(m_ctrls.on_mouse_button_up(m_specific->m_cur_x, - m_specific->m_cur_y)) - { - on_ctrl_change(); - force_redraw(); - } - on_mouse_button_up(m_specific->m_cur_x, - m_specific->m_cur_y, - flags); - break; - } - } - } - return 0; - } - - - - //------------------------------------------------------------------------ - const char* platform_support::img_ext() const { return ".bmp"; } - - //------------------------------------------------------------------------ - const char* platform_support::full_file_name(const char* file_name) - { - return file_name; - } - - //------------------------------------------------------------------------ - bool platform_support::load_img(unsigned idx, const char* file) - { - if(idx < max_images) - { - if(m_specific->m_surf_img[idx]) SDL_FreeSurface(m_specific->m_surf_img[idx]); - - char fn[1024]; - strcpy(fn, file); - int len = strlen(fn); - if(len < 4 || strcmp(fn + len - 4, ".bmp") != 0) - { - strcat(fn, ".bmp"); - } - - SDL_Surface* tmp_surf = SDL_LoadBMP(fn); - if (tmp_surf == 0) - { - fprintf(stderr, "Couldn't load %s: %s\n", fn, SDL_GetError()); - return false; - } - - SDL_PixelFormat format; - format.palette = 0; - format.BitsPerPixel = m_bpp; - format.BytesPerPixel = m_bpp >> 8; - format.Rmask = m_specific->m_rmask; - format.Gmask = m_specific->m_gmask; - format.Bmask = m_specific->m_bmask; - format.Amask = m_specific->m_amask; - format.Rshift = 0; - format.Gshift = 0; - format.Bshift = 0; - format.Ashift = 0; - format.Rloss = 0; - format.Gloss = 0; - format.Bloss = 0; - format.Aloss = 0; - format.colorkey = 0; - format.alpha = 0; - - m_specific->m_surf_img[idx] = - SDL_ConvertSurface(tmp_surf, - &format, - SDL_SWSURFACE); - - SDL_FreeSurface(tmp_surf); - - if(m_specific->m_surf_img[idx] == 0) return false; - - m_rbuf_img[idx].attach((unsigned char*)m_specific->m_surf_img[idx]->pixels, - m_specific->m_surf_img[idx]->w, - m_specific->m_surf_img[idx]->h, - m_flip_y ? -m_specific->m_surf_img[idx]->pitch : - m_specific->m_surf_img[idx]->pitch); - return true; - - } - return false; - } - - - - - //------------------------------------------------------------------------ - bool platform_support::save_img(unsigned idx, const char* file) - { - if(idx < max_images && m_specific->m_surf_img[idx]) - { - char fn[1024]; - strcpy(fn, file); - int len = strlen(fn); - if(len < 4 || strcmp(fn + len - 4, ".bmp") != 0) - { - strcat(fn, ".bmp"); - } - return SDL_SaveBMP(m_specific->m_surf_img[idx], fn) == 0; - } - return false; - } - - - - //------------------------------------------------------------------------ - bool platform_support::create_img(unsigned idx, unsigned width, unsigned height) - { - if(idx < max_images) - { - - if(m_specific->m_surf_img[idx]) SDL_FreeSurface(m_specific->m_surf_img[idx]); - - m_specific->m_surf_img[idx] = - SDL_CreateRGBSurface(SDL_SWSURFACE, - width, - height, - m_specific->m_surf_screen->format->BitsPerPixel, - m_specific->m_rmask, - m_specific->m_gmask, - m_specific->m_bmask, - m_specific->m_amask); - if(m_specific->m_surf_img[idx] == 0) - { - fprintf(stderr, "Couldn't create image: %s\n", SDL_GetError()); - return false; - } - - m_rbuf_img[idx].attach((unsigned char*)m_specific->m_surf_img[idx]->pixels, - m_specific->m_surf_img[idx]->w, - m_specific->m_surf_img[idx]->h, - m_flip_y ? -m_specific->m_surf_img[idx]->pitch : - m_specific->m_surf_img[idx]->pitch); - - return true; - } - - return false; - } - - //------------------------------------------------------------------------ - void platform_support::start_timer() - { - m_specific->m_sw_start = SDL_GetTicks(); - } - - //------------------------------------------------------------------------ - double platform_support::elapsed_time() const - { - int stop = SDL_GetTicks(); - return double(stop - m_specific->m_sw_start); - } - - //------------------------------------------------------------------------ - void platform_support::message(const char* msg) - { - fprintf(stderr, "%s\n", msg); - } - - //------------------------------------------------------------------------ - void platform_support::force_redraw() - { - m_specific->m_update_flag = true; - } - - - //------------------------------------------------------------------------ - void platform_support::on_init() {} - void platform_support::on_resize(int sx, int sy) {} - void platform_support::on_idle() {} - void platform_support::on_mouse_move(int x, int y, unsigned flags) {} - void platform_support::on_mouse_button_down(int x, int y, unsigned flags) {} - void platform_support::on_mouse_button_up(int x, int y, unsigned flags) {} - void platform_support::on_key(int x, int y, unsigned key, unsigned flags) {} - void platform_support::on_ctrl_change() {} - void platform_support::on_draw() {} - void platform_support::on_post_draw(void* raw_handler) {} - - -} - - -int agg_main(int argc, char* argv[]); - -int main(int argc, char* argv[]) -{ - return agg_main(argc, argv); -} - diff --git a/uppdev/aggdraw/platform/win32/agg_platform_support.cpp b/uppdev/aggdraw/platform/win32/agg_platform_support.cpp deleted file mode 100644 index 9f0429b67..000000000 --- a/uppdev/aggdraw/platform/win32/agg_platform_support.cpp +++ /dev/null @@ -1,1478 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#include -#include -#include "AggDraw/platform/agg_platform_support.h" -#include "platform/win32/agg_win32_bmp.h" -#include "util/agg_color_conv_rgb8.h" -#include "util/agg_color_conv_rgb16.h" - - -namespace agg -{ - - //------------------------------------------------------------------------ - HINSTANCE g_windows_instance = 0; - int g_windows_cmd_show = 0; - - - //------------------------------------------------------------------------ - class platform_specific - { - public: - platform_specific(pix_format_e format, bool flip_y); - - void create_pmap(unsigned width, unsigned height, - rendering_buffer* wnd); - - void display_pmap(HDC dc, const rendering_buffer* src); - bool load_pmap(const char* fn, unsigned idx, - rendering_buffer* dst); - - bool save_pmap(const char* fn, unsigned idx, - const rendering_buffer* src); - - unsigned translate(unsigned keycode); - - pix_format_e m_format; - pix_format_e m_sys_format; - bool m_flip_y; - unsigned m_bpp; - unsigned m_sys_bpp; - HWND m_hwnd; - pixel_map m_pmap_window; - pixel_map m_pmap_img[platform_support::max_images]; - unsigned m_keymap[256]; - unsigned m_last_translated_key; - int m_cur_x; - int m_cur_y; - unsigned m_input_flags; - bool m_redraw_flag; - HDC m_current_dc; - LARGE_INTEGER m_sw_freq; - LARGE_INTEGER m_sw_start; - }; - - - //------------------------------------------------------------------------ - platform_specific::platform_specific(pix_format_e format, bool flip_y) : - m_format(format), - m_sys_format(pix_format_undefined), - m_flip_y(flip_y), - m_bpp(0), - m_sys_bpp(0), - m_hwnd(0), - m_last_translated_key(0), - m_cur_x(0), - m_cur_y(0), - m_input_flags(0), - m_redraw_flag(true), - m_current_dc(0) - { - memset(m_keymap, 0, sizeof(m_keymap)); - - m_keymap[VK_PAUSE] = key_pause; - m_keymap[VK_CLEAR] = key_clear; - - m_keymap[VK_NUMPAD0] = key_kp0; - m_keymap[VK_NUMPAD1] = key_kp1; - m_keymap[VK_NUMPAD2] = key_kp2; - m_keymap[VK_NUMPAD3] = key_kp3; - m_keymap[VK_NUMPAD4] = key_kp4; - m_keymap[VK_NUMPAD5] = key_kp5; - m_keymap[VK_NUMPAD6] = key_kp6; - m_keymap[VK_NUMPAD7] = key_kp7; - m_keymap[VK_NUMPAD8] = key_kp8; - m_keymap[VK_NUMPAD9] = key_kp9; - m_keymap[VK_DECIMAL] = key_kp_period; - m_keymap[VK_DIVIDE] = key_kp_divide; - m_keymap[VK_MULTIPLY] = key_kp_multiply; - m_keymap[VK_SUBTRACT] = key_kp_minus; - m_keymap[VK_ADD] = key_kp_plus; - - m_keymap[VK_UP] = key_up; - m_keymap[VK_DOWN] = key_down; - m_keymap[VK_RIGHT] = key_right; - m_keymap[VK_LEFT] = key_left; - m_keymap[VK_INSERT] = key_insert; - m_keymap[VK_DELETE] = key_delete; - m_keymap[VK_HOME] = key_home; - m_keymap[VK_END] = key_end; - m_keymap[VK_PRIOR] = key_page_up; - m_keymap[VK_NEXT] = key_page_down; - - m_keymap[VK_F1] = key_f1; - m_keymap[VK_F2] = key_f2; - m_keymap[VK_F3] = key_f3; - m_keymap[VK_F4] = key_f4; - m_keymap[VK_F5] = key_f5; - m_keymap[VK_F6] = key_f6; - m_keymap[VK_F7] = key_f7; - m_keymap[VK_F8] = key_f8; - m_keymap[VK_F9] = key_f9; - m_keymap[VK_F10] = key_f10; - m_keymap[VK_F11] = key_f11; - m_keymap[VK_F12] = key_f12; - m_keymap[VK_F13] = key_f13; - m_keymap[VK_F14] = key_f14; - m_keymap[VK_F15] = key_f15; - - m_keymap[VK_NUMLOCK] = key_numlock; - m_keymap[VK_CAPITAL] = key_capslock; - m_keymap[VK_SCROLL] = key_scrollock; - - - switch(m_format) - { - case pix_format_bw: - m_sys_format = pix_format_bw; - m_bpp = 1; - m_sys_bpp = 1; - break; - - case pix_format_gray8: - m_sys_format = pix_format_gray8; - m_bpp = 8; - m_sys_bpp = 8; - break; - - case pix_format_gray16: - m_sys_format = pix_format_gray8; - m_bpp = 16; - m_sys_bpp = 8; - break; - - case pix_format_rgb565: - case pix_format_rgb555: - m_sys_format = pix_format_rgb555; - m_bpp = 16; - m_sys_bpp = 16; - break; - - case pix_format_rgbAAA: - case pix_format_bgrAAA: - case pix_format_rgbBBA: - case pix_format_bgrABB: - m_sys_format = pix_format_bgr24; - m_bpp = 32; - m_sys_bpp = 24; - break; - - case pix_format_rgb24: - case pix_format_bgr24: - m_sys_format = pix_format_bgr24; - m_bpp = 24; - m_sys_bpp = 24; - break; - - case pix_format_rgb48: - case pix_format_bgr48: - m_sys_format = pix_format_bgr24; - m_bpp = 48; - m_sys_bpp = 24; - break; - - case pix_format_bgra32: - case pix_format_abgr32: - case pix_format_argb32: - case pix_format_rgba32: - m_sys_format = pix_format_bgra32; - m_bpp = 32; - m_sys_bpp = 32; - break; - - case pix_format_bgra64: - case pix_format_abgr64: - case pix_format_argb64: - case pix_format_rgba64: - m_sys_format = pix_format_bgra32; - m_bpp = 64; - m_sys_bpp = 32; - break; - } - ::QueryPerformanceFrequency(&m_sw_freq); - ::QueryPerformanceCounter(&m_sw_start); - } - - - //------------------------------------------------------------------------ - void platform_specific::create_pmap(unsigned width, - unsigned height, - rendering_buffer* wnd) - { - m_pmap_window.create(width, height, org_e(m_bpp)); - wnd->attach(m_pmap_window.buf(), - m_pmap_window.width(), - m_pmap_window.height(), - m_flip_y ? - m_pmap_window.stride() : - -m_pmap_window.stride()); - } - - - //------------------------------------------------------------------------ - static void convert_pmap(rendering_buffer* dst, - const rendering_buffer* src, - pix_format_e format) - { - switch(format) - { - case pix_format_gray8: - break; - - case pix_format_gray16: - color_conv(dst, src, color_conv_gray16_to_gray8()); - break; - - case pix_format_rgb565: - color_conv(dst, src, color_conv_rgb565_to_rgb555()); - break; - - case pix_format_rgbAAA: - color_conv(dst, src, color_conv_rgbAAA_to_bgr24()); - break; - - case pix_format_bgrAAA: - color_conv(dst, src, color_conv_bgrAAA_to_bgr24()); - break; - - case pix_format_rgbBBA: - color_conv(dst, src, color_conv_rgbBBA_to_bgr24()); - break; - - case pix_format_bgrABB: - color_conv(dst, src, color_conv_bgrABB_to_bgr24()); - break; - - case pix_format_rgb24: - color_conv(dst, src, color_conv_rgb24_to_bgr24()); - break; - - case pix_format_rgb48: - color_conv(dst, src, color_conv_rgb48_to_bgr24()); - break; - - case pix_format_bgr48: - color_conv(dst, src, color_conv_bgr48_to_bgr24()); - break; - - case pix_format_abgr32: - color_conv(dst, src, color_conv_abgr32_to_bgra32()); - break; - - case pix_format_argb32: - color_conv(dst, src, color_conv_argb32_to_bgra32()); - break; - - case pix_format_rgba32: - color_conv(dst, src, color_conv_rgba32_to_bgra32()); - break; - - case pix_format_bgra64: - color_conv(dst, src, color_conv_bgra64_to_bgra32()); - break; - - case pix_format_abgr64: - color_conv(dst, src, color_conv_abgr64_to_bgra32()); - break; - - case pix_format_argb64: - color_conv(dst, src, color_conv_argb64_to_bgra32()); - break; - - case pix_format_rgba64: - color_conv(dst, src, color_conv_rgba64_to_bgra32()); - break; - } - } - - - //------------------------------------------------------------------------ - void platform_specific::display_pmap(HDC dc, const rendering_buffer* src) - { - if(m_sys_format == m_format) - { - m_pmap_window.draw(dc); - } - else - { - pixel_map pmap_tmp; - pmap_tmp.create(m_pmap_window.width(), - m_pmap_window.height(), - org_e(m_sys_bpp)); - - rendering_buffer rbuf_tmp; - rbuf_tmp.attach(pmap_tmp.buf(), - pmap_tmp.width(), - pmap_tmp.height(), - m_flip_y ? - pmap_tmp.stride() : - -pmap_tmp.stride()); - - convert_pmap(&rbuf_tmp, src, m_format); - pmap_tmp.draw(dc); - } - } - - - - //------------------------------------------------------------------------ - bool platform_specific::save_pmap(const char* fn, unsigned idx, - const rendering_buffer* src) - { - if(m_sys_format == m_format) - { - return m_pmap_img[idx].save_as_bmp(fn); - } - - pixel_map pmap_tmp; - pmap_tmp.create(m_pmap_img[idx].width(), - m_pmap_img[idx].height(), - org_e(m_sys_bpp)); - - rendering_buffer rbuf_tmp; - rbuf_tmp.attach(pmap_tmp.buf(), - pmap_tmp.width(), - pmap_tmp.height(), - m_flip_y ? - pmap_tmp.stride() : - -pmap_tmp.stride()); - - convert_pmap(&rbuf_tmp, src, m_format); - return pmap_tmp.save_as_bmp(fn); - } - - - - //------------------------------------------------------------------------ - bool platform_specific::load_pmap(const char* fn, unsigned idx, - rendering_buffer* dst) - { - pixel_map pmap_tmp; - if(!pmap_tmp.load_from_bmp(fn)) return false; - - rendering_buffer rbuf_tmp; - rbuf_tmp.attach(pmap_tmp.buf(), - pmap_tmp.width(), - pmap_tmp.height(), - m_flip_y ? - pmap_tmp.stride() : - -pmap_tmp.stride()); - - m_pmap_img[idx].create(pmap_tmp.width(), - pmap_tmp.height(), - org_e(m_bpp), - 0); - - dst->attach(m_pmap_img[idx].buf(), - m_pmap_img[idx].width(), - m_pmap_img[idx].height(), - m_flip_y ? - m_pmap_img[idx].stride() : - -m_pmap_img[idx].stride()); - - switch(m_format) - { - case pix_format_gray8: - switch(pmap_tmp.bpp()) - { - //case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_gray8()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_gray8()); break; - //case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_gray8()); break; - } - break; - - case pix_format_gray16: - switch(pmap_tmp.bpp()) - { - //case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_gray16()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_gray16()); break; - //case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_gray16()); break; - } - break; - - case pix_format_rgb555: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_rgb555()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_rgb555()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgb555()); break; - } - break; - - case pix_format_rgb565: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_rgb565()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_rgb565()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgb565()); break; - } - break; - - case pix_format_rgb24: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_rgb24()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_rgb24()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgb24()); break; - } - break; - - case pix_format_bgr24: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_bgr24()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_bgr24()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_bgr24()); break; - } - break; - - case pix_format_rgb48: - switch(pmap_tmp.bpp()) - { - //case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_rgb48()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_rgb48()); break; - //case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgb48()); break; - } - break; - - case pix_format_bgr48: - switch(pmap_tmp.bpp()) - { - //case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_bgr48()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_bgr48()); break; - //case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_bgr48()); break; - } - break; - - case pix_format_abgr32: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_abgr32()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_abgr32()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_abgr32()); break; - } - break; - - case pix_format_argb32: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_argb32()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_argb32()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_argb32()); break; - } - break; - - case pix_format_bgra32: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_bgra32()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_bgra32()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_bgra32()); break; - } - break; - - case pix_format_rgba32: - switch(pmap_tmp.bpp()) - { - case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_rgba32()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_rgba32()); break; - case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgba32()); break; - } - break; - - case pix_format_abgr64: - switch(pmap_tmp.bpp()) - { - //case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_abgr64()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_abgr64()); break; - //case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_abgr64()); break; - } - break; - - case pix_format_argb64: - switch(pmap_tmp.bpp()) - { - //case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_argb64()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_argb64()); break; - //case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_argb64()); break; - } - break; - - case pix_format_bgra64: - switch(pmap_tmp.bpp()) - { - //case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_bgra64()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_bgra64()); break; - //case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_bgra64()); break; - } - break; - - case pix_format_rgba64: - switch(pmap_tmp.bpp()) - { - //case 16: color_conv(dst, &rbuf_tmp, color_conv_rgb555_to_rgba64()); break; - case 24: color_conv(dst, &rbuf_tmp, color_conv_bgr24_to_rgba64()); break; - //case 32: color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgba64()); break; - } - break; - - } - - return true; - } - - - - - - - - - //------------------------------------------------------------------------ - unsigned platform_specific::translate(unsigned keycode) - { - return m_last_translated_key = (keycode > 255) ? 0 : m_keymap[keycode]; - } - - - - //------------------------------------------------------------------------ - platform_support::platform_support(pix_format_e format, bool flip_y) : - m_specific(new platform_specific(format, flip_y)), - m_format(format), - m_bpp(m_specific->m_bpp), - m_window_flags(0), - m_wait_mode(true), - m_flip_y(flip_y), - m_initial_width(10), - m_initial_height(10) - { - strcpy(m_caption, "Anti-Grain Geometry Application"); - } - - - //------------------------------------------------------------------------ - platform_support::~platform_support() - { - delete m_specific; - } - - - - //------------------------------------------------------------------------ - void platform_support::caption(const char* cap) - { - strcpy(m_caption, cap); - if(m_specific->m_hwnd) - { - SetWindowText(m_specific->m_hwnd, m_caption); - } - } - - //------------------------------------------------------------------------ - void platform_support::start_timer() - { - ::QueryPerformanceCounter(&(m_specific->m_sw_start)); - } - - //------------------------------------------------------------------------ - double platform_support::elapsed_time() const - { - LARGE_INTEGER stop; - ::QueryPerformanceCounter(&stop); - return double(stop.QuadPart - - m_specific->m_sw_start.QuadPart) * 1000.0 / - double(m_specific->m_sw_freq.QuadPart); - } - - - - //------------------------------------------------------------------------ - static unsigned get_key_flags(int wflags) - { - unsigned flags = 0; - if(wflags & MK_LBUTTON) flags |= mouse_left; - if(wflags & MK_RBUTTON) flags |= mouse_right; - if(wflags & MK_SHIFT) flags |= kbd_shift; - if(wflags & MK_CONTROL) flags |= kbd_ctrl; - return flags; - } - - - void* platform_support::raw_display_handler() - { - return m_specific->m_current_dc; - } - - - //------------------------------------------------------------------------ - LRESULT CALLBACK window_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) - { - PAINTSTRUCT ps; - HDC paintDC; - - - void* user_data = reinterpret_cast(::GetWindowLong(hWnd, GWL_USERDATA)); - platform_support* app = 0; - - if(user_data) - { - app = reinterpret_cast(user_data); - } - - if(app == 0) - { - if(msg == WM_DESTROY) - { - ::PostQuitMessage(0); - return 0; - } - return ::DefWindowProc(hWnd, msg, wParam, lParam); - } - - HDC dc = ::GetDC(app->m_specific->m_hwnd); - app->m_specific->m_current_dc = dc; - LRESULT ret = 0; - - switch(msg) - { - //-------------------------------------------------------------------- - case WM_CREATE: - break; - - //-------------------------------------------------------------------- - case WM_SIZE: - app->m_specific->create_pmap(LOWORD(lParam), - HIWORD(lParam), - &app->rbuf_window()); - - app->trans_affine_resizing(LOWORD(lParam), HIWORD(lParam)); - app->on_resize(LOWORD(lParam), HIWORD(lParam)); - app->force_redraw(); - break; - - //-------------------------------------------------------------------- - case WM_ERASEBKGND: - break; - - //-------------------------------------------------------------------- - case WM_LBUTTONDOWN: - ::SetCapture(app->m_specific->m_hwnd); - app->m_specific->m_cur_x = int16(LOWORD(lParam)); - if(app->flip_y()) - { - app->m_specific->m_cur_y = app->rbuf_window().height() - int16(HIWORD(lParam)); - } - else - { - app->m_specific->m_cur_y = int16(HIWORD(lParam)); - } - app->m_specific->m_input_flags = mouse_left | get_key_flags(wParam); - - app->m_ctrls.set_cur(app->m_specific->m_cur_x, - app->m_specific->m_cur_y); - if(app->m_ctrls.on_mouse_button_down(app->m_specific->m_cur_x, - app->m_specific->m_cur_y)) - { - app->on_ctrl_change(); - app->force_redraw(); - } - else - { - if(app->m_ctrls.in_rect(app->m_specific->m_cur_x, - app->m_specific->m_cur_y)) - { - if(app->m_ctrls.set_cur(app->m_specific->m_cur_x, - app->m_specific->m_cur_y)) - { - app->on_ctrl_change(); - app->force_redraw(); - } - } - else - { - app->on_mouse_button_down(app->m_specific->m_cur_x, - app->m_specific->m_cur_y, - app->m_specific->m_input_flags); - } - } -/* - if(!app->wait_mode()) - { - app->on_idle(); - } -*/ - break; - - //-------------------------------------------------------------------- - case WM_LBUTTONUP: - ::ReleaseCapture(); - app->m_specific->m_cur_x = int16(LOWORD(lParam)); - if(app->flip_y()) - { - app->m_specific->m_cur_y = app->rbuf_window().height() - int16(HIWORD(lParam)); - } - else - { - app->m_specific->m_cur_y = int16(HIWORD(lParam)); - } - app->m_specific->m_input_flags = mouse_left | get_key_flags(wParam); - - if(app->m_ctrls.on_mouse_button_up(app->m_specific->m_cur_x, - app->m_specific->m_cur_y)) - { - app->on_ctrl_change(); - app->force_redraw(); - } - app->on_mouse_button_up(app->m_specific->m_cur_x, - app->m_specific->m_cur_y, - app->m_specific->m_input_flags); -/* - if(!app->wait_mode()) - { - app->on_idle(); - } -*/ - break; - - - //-------------------------------------------------------------------- - case WM_RBUTTONDOWN: - ::SetCapture(app->m_specific->m_hwnd); - app->m_specific->m_cur_x = int16(LOWORD(lParam)); - if(app->flip_y()) - { - app->m_specific->m_cur_y = app->rbuf_window().height() - int16(HIWORD(lParam)); - } - else - { - app->m_specific->m_cur_y = int16(HIWORD(lParam)); - } - app->m_specific->m_input_flags = mouse_right | get_key_flags(wParam); - app->on_mouse_button_down(app->m_specific->m_cur_x, - app->m_specific->m_cur_y, - app->m_specific->m_input_flags); -/* - if(!app->wait_mode()) - { - app->on_idle(); - } -*/ - break; - - //-------------------------------------------------------------------- - case WM_RBUTTONUP: - ::ReleaseCapture(); - app->m_specific->m_cur_x = int16(LOWORD(lParam)); - if(app->flip_y()) - { - app->m_specific->m_cur_y = app->rbuf_window().height() - int16(HIWORD(lParam)); - } - else - { - app->m_specific->m_cur_y = int16(HIWORD(lParam)); - } - app->m_specific->m_input_flags = mouse_right | get_key_flags(wParam); - app->on_mouse_button_up(app->m_specific->m_cur_x, - app->m_specific->m_cur_y, - app->m_specific->m_input_flags); -/* - if(!app->wait_mode()) - { - app->on_idle(); - } -*/ - break; - - //-------------------------------------------------------------------- - case WM_MOUSEMOVE: - app->m_specific->m_cur_x = int16(LOWORD(lParam)); - if(app->flip_y()) - { - app->m_specific->m_cur_y = app->rbuf_window().height() - int16(HIWORD(lParam)); - } - else - { - app->m_specific->m_cur_y = int16(HIWORD(lParam)); - } - app->m_specific->m_input_flags = get_key_flags(wParam); - - - if(app->m_ctrls.on_mouse_move( - app->m_specific->m_cur_x, - app->m_specific->m_cur_y, - (app->m_specific->m_input_flags & mouse_left) != 0)) - { - app->on_ctrl_change(); - app->force_redraw(); - } - else - { - if(!app->m_ctrls.in_rect(app->m_specific->m_cur_x, - app->m_specific->m_cur_y)) - { - app->on_mouse_move(app->m_specific->m_cur_x, - app->m_specific->m_cur_y, - app->m_specific->m_input_flags); - } - } -/* - if(!app->wait_mode()) - { - app->on_idle(); - } -*/ - break; - - //-------------------------------------------------------------------- - case WM_SYSKEYDOWN: - case WM_KEYDOWN: - app->m_specific->m_last_translated_key = 0; - switch(wParam) - { - case VK_CONTROL: - app->m_specific->m_input_flags |= kbd_ctrl; - break; - - case VK_SHIFT: - app->m_specific->m_input_flags |= kbd_shift; - break; - - default: - app->m_specific->translate(wParam); - break; - } - - if(app->m_specific->m_last_translated_key) - { - bool left = false; - bool up = false; - bool right = false; - bool down = false; - - switch(app->m_specific->m_last_translated_key) - { - case key_left: - left = true; - break; - - case key_up: - up = true; - break; - - case key_right: - right = true; - break; - - case key_down: - down = true; - break; - - case key_f2: - app->copy_window_to_img(agg::platform_support::max_images - 1); - app->save_img(agg::platform_support::max_images - 1, "screenshot"); - break; - } - - if(app->window_flags() & window_process_all_keys) - { - app->on_key(app->m_specific->m_cur_x, - app->m_specific->m_cur_y, - app->m_specific->m_last_translated_key, - app->m_specific->m_input_flags); - } - else - { - if(app->m_ctrls.on_arrow_keys(left, right, down, up)) - { - app->on_ctrl_change(); - app->force_redraw(); - } - else - { - app->on_key(app->m_specific->m_cur_x, - app->m_specific->m_cur_y, - app->m_specific->m_last_translated_key, - app->m_specific->m_input_flags); - } - } - } -/* - if(!app->wait_mode()) - { - app->on_idle(); - } -*/ - break; - - //-------------------------------------------------------------------- - case WM_SYSKEYUP: - case WM_KEYUP: - app->m_specific->m_last_translated_key = 0; - switch(wParam) - { - case VK_CONTROL: - app->m_specific->m_input_flags &= ~kbd_ctrl; - break; - - case VK_SHIFT: - app->m_specific->m_input_flags &= ~kbd_shift; - break; - } - break; - - //-------------------------------------------------------------------- - case WM_CHAR: - case WM_SYSCHAR: - if(app->m_specific->m_last_translated_key == 0) - { - app->on_key(app->m_specific->m_cur_x, - app->m_specific->m_cur_y, - wParam, - app->m_specific->m_input_flags); - } - break; - - //-------------------------------------------------------------------- - case WM_PAINT: - paintDC = ::BeginPaint(hWnd, &ps); - app->m_specific->m_current_dc = paintDC; - if(app->m_specific->m_redraw_flag) - { - app->on_draw(); - app->m_specific->m_redraw_flag = false; - } - app->m_specific->display_pmap(paintDC, &app->rbuf_window()); - app->on_post_draw(paintDC); - app->m_specific->m_current_dc = 0; - ::EndPaint(hWnd, &ps); - break; - - //-------------------------------------------------------------------- - case WM_COMMAND: - break; - - //-------------------------------------------------------------------- - case WM_DESTROY: - ::PostQuitMessage(0); - break; - - //-------------------------------------------------------------------- - default: - ret = ::DefWindowProc(hWnd, msg, wParam, lParam); - break; - } - app->m_specific->m_current_dc = 0; - ::ReleaseDC(app->m_specific->m_hwnd, dc); - return ret; - } - - - //------------------------------------------------------------------------ - void platform_support::message(const char* msg) - { - ::MessageBox(m_specific->m_hwnd, msg, "AGG Message", MB_OK); - } - - - //------------------------------------------------------------------------ - bool platform_support::init(unsigned width, unsigned height, unsigned flags) - { - if(m_specific->m_sys_format == pix_format_undefined) - { - return false; - } - - m_window_flags = flags; - - int wflags = CS_OWNDC | CS_VREDRAW | CS_HREDRAW; - - WNDCLASS wc; - wc.lpszClassName = "AGGAppClass"; - wc.lpfnWndProc = window_proc; - wc.style = wflags; - wc.hInstance = g_windows_instance; - wc.hIcon = LoadIcon(0, IDI_APPLICATION); - wc.hCursor = LoadCursor(0, IDC_ARROW); - wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); - wc.lpszMenuName = "AGGAppMenu"; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - ::RegisterClass(&wc); - - wflags = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX; - - if(m_window_flags & window_resize) - { - wflags |= WS_THICKFRAME | WS_MAXIMIZEBOX; - } - - m_specific->m_hwnd = ::CreateWindow("AGGAppClass", - m_caption, - wflags, - 100, - 100, - width, - height, - 0, - 0, - g_windows_instance, - 0); - - if(m_specific->m_hwnd == 0) - { - return false; - } - - - RECT rct; - ::GetClientRect(m_specific->m_hwnd, &rct); - - ::MoveWindow(m_specific->m_hwnd, // handle to window - 100, // horizontal position - 100, // vertical position - width + (width - (rct.right - rct.left)), - height + (height - (rct.bottom - rct.top)), - FALSE); - - ::SetWindowLong(m_specific->m_hwnd, GWL_USERDATA, (LONG)this); - m_specific->create_pmap(width, height, &m_rbuf_window); - m_initial_width = width; - m_initial_height = height; - on_init(); - m_specific->m_redraw_flag = true; - ::ShowWindow(m_specific->m_hwnd, g_windows_cmd_show); - return true; - } - - - - //------------------------------------------------------------------------ - int platform_support::run() - { - MSG msg; - - for(;;) - { - if(m_wait_mode) - { - if(!::GetMessage(&msg, 0, 0, 0)) - { - break; - } - ::TranslateMessage(&msg); - ::DispatchMessage(&msg); - } - else - { - if(::PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) - { - ::TranslateMessage(&msg); - if(msg.message == WM_QUIT) - { - break; - } - ::DispatchMessage(&msg); - } - else - { - on_idle(); - } - } - } - return (int)msg.wParam; - } - - - //------------------------------------------------------------------------ - const char* platform_support::img_ext() const { return ".bmp"; } - - - //------------------------------------------------------------------------ - const char* platform_support::full_file_name(const char* file_name) - { - return file_name; - } - - //------------------------------------------------------------------------ - bool platform_support::load_img(unsigned idx, const char* file) - { - if(idx < max_images) - { - char fn[1024]; - strcpy(fn, file); - int len = strlen(fn); - if(len < 4 || stricmp(fn + len - 4, ".BMP") != 0) - { - strcat(fn, ".bmp"); - } - return m_specific->load_pmap(fn, idx, &m_rbuf_img[idx]); - } - return true; - } - - - - //------------------------------------------------------------------------ - bool platform_support::save_img(unsigned idx, const char* file) - { - if(idx < max_images) - { - char fn[1024]; - strcpy(fn, file); - int len = strlen(fn); - if(len < 4 || stricmp(fn + len - 4, ".BMP") != 0) - { - strcat(fn, ".bmp"); - } - return m_specific->save_pmap(fn, idx, &m_rbuf_img[idx]); - } - return true; - } - - - - //------------------------------------------------------------------------ - bool platform_support::create_img(unsigned idx, unsigned width, unsigned height) - { - if(idx < max_images) - { - if(width == 0) width = m_specific->m_pmap_window.width(); - if(height == 0) height = m_specific->m_pmap_window.height(); - m_specific->m_pmap_img[idx].create(width, height, org_e(m_specific->m_bpp)); - m_rbuf_img[idx].attach(m_specific->m_pmap_img[idx].buf(), - m_specific->m_pmap_img[idx].width(), - m_specific->m_pmap_img[idx].height(), - m_flip_y ? - m_specific->m_pmap_img[idx].stride() : - -m_specific->m_pmap_img[idx].stride()); - return true; - } - return false; - } - - - //------------------------------------------------------------------------ - void platform_support::force_redraw() - { - m_specific->m_redraw_flag = true; - ::InvalidateRect(m_specific->m_hwnd, 0, FALSE); - } - - - - //------------------------------------------------------------------------ - void platform_support::update_window() - { - HDC dc = ::GetDC(m_specific->m_hwnd); - m_specific->display_pmap(dc, &m_rbuf_window); - ::ReleaseDC(m_specific->m_hwnd, dc); - } - - - //------------------------------------------------------------------------ - void platform_support::on_init() {} - void platform_support::on_resize(int sx, int sy) {} - void platform_support::on_idle() {} - void platform_support::on_mouse_move(int x, int y, unsigned flags) {} - void platform_support::on_mouse_button_down(int x, int y, unsigned flags) {} - void platform_support::on_mouse_button_up(int x, int y, unsigned flags) {} - void platform_support::on_key(int x, int y, unsigned key, unsigned flags) {} - void platform_support::on_ctrl_change() {} - void platform_support::on_draw() {} - void platform_support::on_post_draw(void* raw_handler) {} -} - - - - -namespace agg -{ - // That's ridiculous. I have to parse the command line by myself - // because Windows doesn't provide a method of getting the command - // line arguments in a form of argc, argv. Of course, there's - // CommandLineToArgv() but first, it returns Unicode that I don't - // need to deal with, but most of all, it's not compatible with Win98. - //----------------------------------------------------------------------- - class tokenizer - { - public: - enum sep_flag - { - single, - multiple, - whole_str - }; - - struct token - { - const char* ptr; - unsigned len; - }; - - public: - tokenizer(const char* sep, - const char* trim=0, - const char* quote="\"", - char mask_chr='\\', - sep_flag sf=multiple); - - void set_str(const char* str); - token next_token(); - - private: - int check_chr(const char *str, char chr); - - private: - const char* m_src_string; - int m_start; - const char* m_sep; - const char* m_trim; - const char* m_quote; - char m_mask_chr; - unsigned m_sep_len; - sep_flag m_sep_flag; - }; - - - - //----------------------------------------------------------------------- - inline void tokenizer::set_str(const char* str) - { - m_src_string = str; - m_start = 0; - } - - - //----------------------------------------------------------------------- - inline int tokenizer::check_chr(const char *str, char chr) - { - return int(strchr(str, chr)); - } - - - //----------------------------------------------------------------------- - tokenizer::tokenizer(const char* sep, - const char* trim, - const char* quote, - char mask_chr, - sep_flag sf) : - m_src_string(0), - m_start(0), - m_sep(sep), - m_trim(trim), - m_quote(quote), - m_mask_chr(mask_chr), - m_sep_len(sep ? strlen(sep) : 0), - m_sep_flag(sep ? sf : single) - { - } - - - //----------------------------------------------------------------------- - tokenizer::token tokenizer::next_token() - { - unsigned count = 0; - char quote_chr = 0; - token tok; - - tok.ptr = 0; - tok.len = 0; - if(m_src_string == 0 || m_start == -1) return tok; - - register const char *pstr = m_src_string + m_start; - - if(*pstr == 0) - { - m_start = -1; - return tok; - } - - int sep_len = 1; - if(m_sep_flag == whole_str) sep_len = m_sep_len; - - if(m_sep_flag == multiple) - { - //Pass all the separator symbols at the begin of the string - while(*pstr && check_chr(m_sep, *pstr)) - { - ++pstr; - ++m_start; - } - } - - if(*pstr == 0) - { - m_start = -1; - return tok; - } - - for(count = 0;; ++count) - { - char c = *pstr; - int found = 0; - - //We are outside of qotation: find one of separator symbols - if(quote_chr == 0) - { - if(sep_len == 1) - { - found = check_chr(m_sep, c); - } - else - { - found = strncmp(m_sep, pstr, m_sep_len) == 0; - } - } - - ++pstr; - - if(c == 0 || found) - { - if(m_trim) - { - while(count && - check_chr(m_trim, m_src_string[m_start])) - { - ++m_start; - --count; - } - - while(count && - check_chr(m_trim, m_src_string[m_start + count - 1])) - { - --count; - } - } - - tok.ptr = m_src_string + m_start; - tok.len = count; - - //Next time it will be the next separator character - //But we must check, whether it is NOT the end of the string. - m_start += count; - if(c) - { - m_start += sep_len; - if(m_sep_flag == multiple) - { - //Pass all the separator symbols - //after the end of the string - while(check_chr(m_sep, m_src_string[m_start])) - { - ++m_start; - } - } - } - break; - } - - //Switch quote. If it is not a quote yet, try to check any of - //quote symbols. Otherwise quote must be finished with quote_symb - if(quote_chr == 0) - { - if(check_chr(m_quote, c)) - { - quote_chr = c; - continue; - } - } - else - { - //We are inside quote: pass all the mask symbols - if(m_mask_chr && c == m_mask_chr) - { - if(*pstr) - { - ++count; - ++pstr; - } - continue; - } - if(c == quote_chr) - { - quote_chr = 0; - continue; - } - } - } - return tok; - } - - -} - - - -//---------------------------------------------------------------------------- -int agg_main(int argc, char* argv[]); - - - -//---------------------------------------------------------------------------- -int PASCAL WinMain(HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPSTR lpszCmdLine, - int nCmdShow) -{ - agg::g_windows_instance = hInstance; - agg::g_windows_cmd_show = nCmdShow; - - char* argv_str = new char [strlen(lpszCmdLine) + 3]; - char* argv_ptr = argv_str; - - char* argv[64]; - memset(argv, 0, sizeof(argv)); - - agg::tokenizer cmd_line(" ", "\"' ", "\"'", '\\', agg::tokenizer::multiple); - cmd_line.set_str(lpszCmdLine); - - int argc = 0; - argv[argc++] = argv_ptr; - *argv_ptr++ = 0; - - while(argc < 64) - { - agg::tokenizer::token tok = cmd_line.next_token(); - if(tok.ptr == 0) break; - if(tok.len) - { - memcpy(argv_ptr, tok.ptr, tok.len); - argv[argc++] = argv_ptr; - argv_ptr += tok.len; - *argv_ptr++ = 0; - } - } - - int ret = agg_main(argc, argv); - delete [] argv_str; - - return ret; -} - - - - diff --git a/uppdev/aggdraw/platform/win32/agg_win32_bmp.cpp b/uppdev/aggdraw/platform/win32/agg_win32_bmp.cpp deleted file mode 100644 index 249eac947..000000000 --- a/uppdev/aggdraw/platform/win32/agg_win32_bmp.cpp +++ /dev/null @@ -1,625 +0,0 @@ -//---------------------------------------------------------------------------- -// -//---------------------------------------------------------------------------- -// Contact: mcseemagg@yahoo.com -//---------------------------------------------------------------------------- -// -// class pixel_map -// -//---------------------------------------------------------------------------- - -#include "platform/win32/agg_win32_bmp.h" -#include "agg_basics.h" - -namespace agg -{ - - //------------------------------------------------------------------------ - pixel_map::~pixel_map() - { - destroy(); - } - - - //------------------------------------------------------------------------ - pixel_map::pixel_map() : - m_bmp(0), - m_buf(0), - m_bpp(0), - m_is_internal(false), - m_img_size(0), - m_full_size(0) - - { - } - - - //------------------------------------------------------------------------ - void pixel_map::destroy() - { - if(m_bmp && m_is_internal) delete [] (unsigned char*)m_bmp; - m_bmp = 0; - m_is_internal = false; - m_buf = 0; - } - - - //------------------------------------------------------------------------ - void pixel_map::create(unsigned width, - unsigned height, - org_e org, - unsigned clear_val) - { - destroy(); - if(width == 0) width = 1; - if(height == 0) height = 1; - m_bpp = org; - create_from_bmp(create_bitmap_info(width, height, m_bpp)); - create_gray_scale_palette(m_bmp); - m_is_internal = true; - if(clear_val <= 255) - { - memset(m_buf, clear_val, m_img_size); - } - } - - - //------------------------------------------------------------------------ - HBITMAP pixel_map::create_dib_section(HDC h_dc, - unsigned width, - unsigned height, - org_e org, - unsigned clear_val) - { - destroy(); - if(width == 0) width = 1; - if(height == 0) height = 1; - m_bpp = org; - HBITMAP h_bitmap = create_dib_section_from_args(h_dc, width, height, m_bpp); - create_gray_scale_palette(m_bmp); - m_is_internal = true; - if(clear_val <= 255) - { - memset(m_buf, clear_val, m_img_size); - } - return h_bitmap; - } - - - - //------------------------------------------------------------------------ - void pixel_map::clear(unsigned clear_val) - { - if(m_buf) memset(m_buf, clear_val, m_img_size); - } - - - //------------------------------------------------------------------------ - void pixel_map::attach_to_bmp(BITMAPINFO *bmp) - { - if(bmp) - { - destroy(); - create_from_bmp(bmp); - m_is_internal = false; - } - } - - - - //static - //------------------------------------------------------------------------ - unsigned pixel_map::calc_full_size(BITMAPINFO *bmp) - { - if(bmp == 0) return 0; - - return sizeof(BITMAPINFOHEADER) + - sizeof(RGBQUAD) * calc_palette_size(bmp) + - bmp->bmiHeader.biSizeImage; - } - - //static - //------------------------------------------------------------------------ - unsigned pixel_map::calc_header_size(BITMAPINFO *bmp) - { - if(bmp == 0) return 0; - return sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * calc_palette_size(bmp); - } - - - //static - //------------------------------------------------------------------------ - unsigned pixel_map::calc_palette_size(unsigned clr_used, unsigned bits_per_pixel) - { - int palette_size = 0; - - if(bits_per_pixel <= 8) - { - palette_size = clr_used; - if(palette_size == 0) - { - palette_size = 1 << bits_per_pixel; - } - } - return palette_size; - } - - //static - //------------------------------------------------------------------------ - unsigned pixel_map::calc_palette_size(BITMAPINFO *bmp) - { - if(bmp == 0) return 0; - return calc_palette_size(bmp->bmiHeader.biClrUsed, bmp->bmiHeader.biBitCount); - } - - - //static - //------------------------------------------------------------------------ - unsigned char * pixel_map::calc_img_ptr(BITMAPINFO *bmp) - { - if(bmp == 0) return 0; - return ((unsigned char*)bmp) + calc_header_size(bmp); - } - - //static - //------------------------------------------------------------------------ - BITMAPINFO* pixel_map::create_bitmap_info(unsigned width, - unsigned height, - unsigned bits_per_pixel) - { - unsigned line_len = calc_row_len(width, bits_per_pixel); - unsigned img_size = line_len * height; - unsigned rgb_size = calc_palette_size(0, bits_per_pixel) * sizeof(RGBQUAD); - unsigned full_size = sizeof(BITMAPINFOHEADER) + rgb_size + img_size; - - BITMAPINFO *bmp = (BITMAPINFO *) new unsigned char[full_size]; - - bmp->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - bmp->bmiHeader.biWidth = width; - bmp->bmiHeader.biHeight = height; - bmp->bmiHeader.biPlanes = 1; - bmp->bmiHeader.biBitCount = (unsigned short)bits_per_pixel; - bmp->bmiHeader.biCompression = 0; - bmp->bmiHeader.biSizeImage = img_size; - bmp->bmiHeader.biXPelsPerMeter = 0; - bmp->bmiHeader.biYPelsPerMeter = 0; - bmp->bmiHeader.biClrUsed = 0; - bmp->bmiHeader.biClrImportant = 0; - - return bmp; - } - - - //static - //------------------------------------------------------------------------ - void pixel_map::create_gray_scale_palette(BITMAPINFO *bmp) - { - if(bmp == 0) return; - - unsigned rgb_size = calc_palette_size(bmp); - RGBQUAD *rgb = (RGBQUAD*)(((unsigned char*)bmp) + sizeof(BITMAPINFOHEADER)); - unsigned brightness; - unsigned i; - - for(i = 0; i < rgb_size; i++) - { - brightness = (255 * i) / (rgb_size - 1); - rgb->rgbBlue = - rgb->rgbGreen = - rgb->rgbRed = (unsigned char)brightness; - rgb->rgbReserved = 0; - rgb++; - } - } - - - - //static - //------------------------------------------------------------------------ - unsigned pixel_map::calc_row_len(unsigned width, unsigned bits_per_pixel) - { - unsigned n = width; - unsigned k; - - switch(bits_per_pixel) - { - case 1: k = n; - n = n >> 3; - if(k & 7) n++; - break; - - case 4: k = n; - n = n >> 1; - if(k & 3) n++; - break; - - case 8: - break; - - case 16: n *= 2; - break; - - case 24: n *= 3; - break; - - case 32: n *= 4; - break; - - case 48: n *= 6; - break; - - case 64: n *= 8; - break; - - default: n = 0; - break; - } - return ((n + 3) >> 2) << 2; - } - - - - - - //------------------------------------------------------------------------ - void pixel_map::draw(HDC h_dc, const RECT *device_rect, const RECT *bmp_rect) const - { - if(m_bmp == 0 || m_buf == 0) return; - - unsigned bmp_x = 0; - unsigned bmp_y = 0; - unsigned bmp_width = m_bmp->bmiHeader.biWidth; - unsigned bmp_height = m_bmp->bmiHeader.biHeight; - unsigned dvc_x = 0; - unsigned dvc_y = 0; - unsigned dvc_width = m_bmp->bmiHeader.biWidth; - unsigned dvc_height = m_bmp->bmiHeader.biHeight; - - if(bmp_rect) - { - bmp_x = bmp_rect->left; - bmp_y = bmp_rect->top; - bmp_width = bmp_rect->right - bmp_rect->left; - bmp_height = bmp_rect->bottom - bmp_rect->top; - } - - dvc_x = bmp_x; - dvc_y = bmp_y; - dvc_width = bmp_width; - dvc_height = bmp_height; - - if(device_rect) - { - dvc_x = device_rect->left; - dvc_y = device_rect->top; - dvc_width = device_rect->right - device_rect->left; - dvc_height = device_rect->bottom - device_rect->top; - } - - if(dvc_width != bmp_width || dvc_height != bmp_height) - { - ::SetStretchBltMode(h_dc, COLORONCOLOR); - ::StretchDIBits( - h_dc, // handle of device context - dvc_x, // x-coordinate of upper-left corner of source rect. - dvc_y, // y-coordinate of upper-left corner of source rect. - dvc_width, // width of source rectangle - dvc_height, // height of source rectangle - bmp_x, - bmp_y, // x, y -coordinates of upper-left corner of dest. rect. - bmp_width, // width of destination rectangle - bmp_height, // height of destination rectangle - m_buf, // address of bitmap bits - m_bmp, // address of bitmap data - DIB_RGB_COLORS, // usage - SRCCOPY // raster operation code - ); - } - else - { - ::SetDIBitsToDevice( - h_dc, // handle to device context - dvc_x, // x-coordinate of upper-left corner of - dvc_y, // y-coordinate of upper-left corner of - dvc_width, // source rectangle width - dvc_height, // source rectangle height - bmp_x, // x-coordinate of lower-left corner of - bmp_y, // y-coordinate of lower-left corner of - 0, // first scan line in array - bmp_height, // number of scan lines - m_buf, // address of array with DIB bits - m_bmp, // address of structure with bitmap info. - DIB_RGB_COLORS // RGB or palette indexes - ); - } - } - - - //------------------------------------------------------------------------ - void pixel_map::draw(HDC h_dc, int x, int y, double scale) const - { - if(m_bmp == 0 || m_buf == 0) return; - - unsigned width = unsigned(m_bmp->bmiHeader.biWidth * scale); - unsigned height = unsigned(m_bmp->bmiHeader.biHeight * scale); - RECT rect; - rect.left = x; - rect.top = y; - rect.right = x + width; - rect.bottom = y + height; - draw(h_dc, &rect); - } - - - - - //------------------------------------------------------------------------ - void pixel_map::blend(HDC h_dc, const RECT *device_rect, const RECT *bmp_rect) const - { -#if !defined(AGG_BMP_ALPHA_BLEND) - draw(h_dc, device_rect, bmp_rect); - return; -#else - if(m_bpp != 32) - { - draw(h_dc, device_rect, bmp_rect); - return; - } - - if(m_bmp == 0 || m_buf == 0) return; - - unsigned bmp_x = 0; - unsigned bmp_y = 0; - unsigned bmp_width = m_bmp->bmiHeader.biWidth; - unsigned bmp_height = m_bmp->bmiHeader.biHeight; - unsigned dvc_x = 0; - unsigned dvc_y = 0; - unsigned dvc_width = m_bmp->bmiHeader.biWidth; - unsigned dvc_height = m_bmp->bmiHeader.biHeight; - - if(bmp_rect) - { - bmp_x = bmp_rect->left; - bmp_y = bmp_rect->top; - bmp_width = bmp_rect->right - bmp_rect->left; - bmp_height = bmp_rect->bottom - bmp_rect->top; - } - - dvc_x = bmp_x; - dvc_y = bmp_y; - dvc_width = bmp_width; - dvc_height = bmp_height; - - if(device_rect) - { - dvc_x = device_rect->left; - dvc_y = device_rect->top; - dvc_width = device_rect->right - device_rect->left; - dvc_height = device_rect->bottom - device_rect->top; - } - - HDC mem_dc = ::CreateCompatibleDC(h_dc); - void* buf = 0; - HBITMAP bmp = ::CreateDIBSection( - mem_dc, - m_bmp, - DIB_RGB_COLORS, - &buf, - 0, - 0 - ); - memcpy(buf, m_buf, m_bmp->bmiHeader.biSizeImage); - - HBITMAP temp = (HBITMAP)::SelectObject(mem_dc, bmp); - - BLENDFUNCTION blend; - blend.BlendOp = AC_SRC_OVER; - blend.BlendFlags = 0; - -#if defined(AC_SRC_ALPHA) - blend.AlphaFormat = AC_SRC_ALPHA; -//#elif defined(AC_SRC_NO_PREMULT_ALPHA) -// blend.AlphaFormat = AC_SRC_NO_PREMULT_ALPHA; -#else -#error "No appropriate constant for alpha format. Check version of wingdi.h, There must be AC_SRC_ALPHA or AC_SRC_NO_PREMULT_ALPHA" -#endif - - blend.SourceConstantAlpha = 255; - ::AlphaBlend( - h_dc, - dvc_x, - dvc_y, - dvc_width, - dvc_height, - mem_dc, - bmp_x, - bmp_y, - bmp_width, - bmp_height, - blend - ); - - ::SelectObject(mem_dc, temp); - ::DeleteObject(bmp); - ::DeleteObject(mem_dc); -#endif //defined(AGG_BMP_ALPHA_BLEND) - } - - - //------------------------------------------------------------------------ - void pixel_map::blend(HDC h_dc, int x, int y, double scale) const - { - if(m_bmp == 0 || m_buf == 0) return; - unsigned width = unsigned(m_bmp->bmiHeader.biWidth * scale); - unsigned height = unsigned(m_bmp->bmiHeader.biHeight * scale); - RECT rect; - rect.left = x; - rect.top = y; - rect.right = x + width; - rect.bottom = y + height; - blend(h_dc, &rect); - } - - - //------------------------------------------------------------------------ - bool pixel_map::load_from_bmp(FILE *fd) - { - BITMAPFILEHEADER bmf; - BITMAPINFO *bmi = 0; - unsigned bmp_size; - - fread(&bmf, sizeof(bmf), 1, fd); - if(bmf.bfType != 0x4D42) goto bmperr; - - bmp_size = bmf.bfSize - sizeof(BITMAPFILEHEADER); - - bmi = (BITMAPINFO*) new unsigned char [bmp_size]; - if(fread(bmi, 1, bmp_size, fd) != bmp_size) goto bmperr; - destroy(); - m_bpp = bmi->bmiHeader.biBitCount; - create_from_bmp(bmi); - m_is_internal = 1; - return true; - - bmperr: - if(bmi) delete [] (unsigned char*) bmi; - return false; - } - - - - //------------------------------------------------------------------------ - bool pixel_map::load_from_bmp(const char *filename) - { - FILE *fd = fopen(filename, "rb"); - bool ret = false; - if(fd) - { - ret = load_from_bmp(fd); - fclose(fd); - } - return ret; - } - - - - //------------------------------------------------------------------------ - bool pixel_map::save_as_bmp(FILE *fd) const - { - if(m_bmp == 0) return 0; - - BITMAPFILEHEADER bmf; - - bmf.bfType = 0x4D42; - bmf.bfOffBits = calc_header_size(m_bmp) + sizeof(bmf); - bmf.bfSize = bmf.bfOffBits + m_img_size; - bmf.bfReserved1 = 0; - bmf.bfReserved2 = 0; - - fwrite(&bmf, sizeof(bmf), 1, fd); - fwrite(m_bmp, m_full_size, 1, fd); - return true; - } - - - - //------------------------------------------------------------------------ - bool pixel_map::save_as_bmp(const char *filename) const - { - FILE *fd = fopen(filename, "wb"); - bool ret = false; - if(fd) - { - ret = save_as_bmp(fd); - fclose(fd); - } - return ret; - } - - - //------------------------------------------------------------------------ - unsigned char* pixel_map::buf() - { - return m_buf; - } - - //------------------------------------------------------------------------ - unsigned pixel_map::width() const - { - return m_bmp->bmiHeader.biWidth; - } - - //------------------------------------------------------------------------ - unsigned pixel_map::height() const - { - return m_bmp->bmiHeader.biHeight; - } - - //------------------------------------------------------------------------ - int pixel_map::stride() const - { - return calc_row_len(m_bmp->bmiHeader.biWidth, - m_bmp->bmiHeader.biBitCount); - } - - - //private - //------------------------------------------------------------------------ - void pixel_map::create_from_bmp(BITMAPINFO *bmp) - { - if(bmp) - { - m_img_size = calc_row_len(bmp->bmiHeader.biWidth, - bmp->bmiHeader.biBitCount) * - bmp->bmiHeader.biHeight; - - m_full_size = calc_full_size(bmp); - m_bmp = bmp; - m_buf = calc_img_ptr(bmp); - } - } - - - //private - //------------------------------------------------------------------------ - HBITMAP pixel_map::create_dib_section_from_args(HDC h_dc, - unsigned width, - unsigned height, - unsigned bits_per_pixel) - { - unsigned line_len = calc_row_len(width, bits_per_pixel); - unsigned img_size = line_len * height; - unsigned rgb_size = calc_palette_size(0, bits_per_pixel) * sizeof(RGBQUAD); - unsigned full_size = sizeof(BITMAPINFOHEADER) + rgb_size; - - BITMAPINFO *bmp = (BITMAPINFO *) new unsigned char[full_size]; - - bmp->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - bmp->bmiHeader.biWidth = width; - bmp->bmiHeader.biHeight = height; - bmp->bmiHeader.biPlanes = 1; - bmp->bmiHeader.biBitCount = (unsigned short)bits_per_pixel; - bmp->bmiHeader.biCompression = 0; - bmp->bmiHeader.biSizeImage = img_size; - bmp->bmiHeader.biXPelsPerMeter = 0; - bmp->bmiHeader.biYPelsPerMeter = 0; - bmp->bmiHeader.biClrUsed = 0; - bmp->bmiHeader.biClrImportant = 0; - - void* img_ptr = 0; - HBITMAP h_bitmap = ::CreateDIBSection(h_dc, bmp, DIB_RGB_COLORS, &img_ptr, NULL, 0); - - if(img_ptr) - { - m_img_size = calc_row_len(width, bits_per_pixel) * height; - m_full_size = 0; - m_bmp = bmp; - m_buf = (unsigned char *) img_ptr; - } - - return h_bitmap; - } -} - - - diff --git a/uppdev/aggdraw/platform/win32/agg_win32_bmp.h b/uppdev/aggdraw/platform/win32/agg_win32_bmp.h deleted file mode 100644 index e8b3dad1e..000000000 --- a/uppdev/aggdraw/platform/win32/agg_win32_bmp.h +++ /dev/null @@ -1,123 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_WIN32_BMP_INCLUDED -#define AGG_WIN32_BMP_INCLUDED - - -#include -#include - - -namespace agg -{ - enum org_e - { - org_mono8 = 8, - org_color16 = 16, - org_color24 = 24, - org_color32 = 32, - org_color48 = 48, - org_color64 = 64 - }; - - class pixel_map - { - public: - ~pixel_map(); - pixel_map(); - - public: - void destroy(); - void create(unsigned width, - unsigned height, - org_e org, - unsigned clear_val=256); - HBITMAP create_dib_section(HDC h_dc, - unsigned width, - unsigned height, - org_e org, - unsigned clear_val=256); - - void clear(unsigned clear_val=256); - void attach_to_bmp(BITMAPINFO* bmp); - BITMAPINFO* bitmap_info() { return m_bmp; } - bool load_from_bmp(FILE* fd); - bool save_as_bmp(FILE* fd) const; - bool load_from_bmp(const char* filename); - bool save_as_bmp(const char* filename) const; - - void draw(HDC h_dc, - const RECT* device_rect=0, - const RECT* bmp_rect=0) const; - void draw(HDC h_dc, int x, int y, double scale=1.0) const; - - void blend(HDC h_dc, - const RECT* device_rect=0, - const RECT* bmp_rect=0) const; - void blend(HDC h_dc, int x, int y, double scale=1.0) const; - - - unsigned char* buf(); - unsigned width() const; - unsigned height() const; - int stride() const; - unsigned bpp() const { return m_bpp; } - - //Auxiliary static functions - static unsigned calc_full_size(BITMAPINFO *bmp); - static unsigned calc_header_size(BITMAPINFO *bmp); - static unsigned calc_palette_size(unsigned clr_used, - unsigned bits_per_pixel); - static unsigned calc_palette_size(BITMAPINFO *bmp); - static unsigned char* calc_img_ptr(BITMAPINFO *bmp); - static BITMAPINFO* create_bitmap_info(unsigned width, - unsigned height, - unsigned bits_per_pixel); - static void create_gray_scale_palette(BITMAPINFO *bmp); - static unsigned calc_row_len(unsigned width, unsigned bits_per_pixel); - - private: - pixel_map(const pixel_map&); - const pixel_map& operator = (const pixel_map&); - void create_from_bmp(BITMAPINFO *bmp); - - HBITMAP create_dib_section_from_args(HDC h_dc, - unsigned width, - unsigned height, - unsigned bits_per_pixel); - - private: - BITMAPINFO* m_bmp; - unsigned char* m_buf; - unsigned m_bpp; - bool m_is_internal; - unsigned m_img_size; - unsigned m_full_size; - }; - -} - - -#endif diff --git a/uppdev/aggdraw/util/agg_color_conv.h b/uppdev/aggdraw/util/agg_color_conv.h deleted file mode 100644 index 940d7d155..000000000 --- a/uppdev/aggdraw/util/agg_color_conv.h +++ /dev/null @@ -1,89 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- - -#ifndef AGG_COLOR_CONV_INCLUDED -#define AGG_COLOR_CONV_INCLUDED - -#include -#include "agg_basics.h" -#include "agg_rendering_buffer.h" - - - - -namespace agg -{ - - //--------------------------------------------------------------color_conv - template - void color_conv(RenBuf* dst, const RenBuf* src, CopyRow copy_row_functor) - { - unsigned width = src->width(); - unsigned height = src->height(); - - if(dst->width() < width) width = dst->width(); - if(dst->height() < height) height = dst->height(); - - if(width) - { - unsigned y; - for(y = 0; y < height; y++) - { - copy_row_functor(dst->row_ptr(0, y, width), - src->row_ptr(y), - width); - } - } - } - - - //---------------------------------------------------------color_conv_row - template - void color_conv_row(int8u* dst, - const int8u* src, - unsigned width, - CopyRow copy_row_functor) - { - copy_row_functor(dst, src, width); - } - - - //---------------------------------------------------------color_conv_same - template class color_conv_same - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - memmove(dst, src, width*BPP); - } - }; - - -} - - - -#endif diff --git a/uppdev/aggdraw/util/agg_color_conv_rgb16.h b/uppdev/aggdraw/util/agg_color_conv_rgb16.h deleted file mode 100644 index 4b780a382..000000000 --- a/uppdev/aggdraw/util/agg_color_conv_rgb16.h +++ /dev/null @@ -1,294 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// This part of the library has been sponsored by -// Liberty Technology Systems, Inc., visit http://lib-sys.com -// -// Liberty Technology Systems, Inc. is the provider of -// PostScript and PDF technology for software developers. -// -//---------------------------------------------------------------------------- -// -// A set of functors used with color_conv(). See file agg_color_conv.h -// These functors can convert images with up to 8 bits per component. -// Use convertors in the following way: -// -// agg::color_conv(dst, src, agg::color_conv_XXXX_to_YYYY()); -//---------------------------------------------------------------------------- - -#ifndef AGG_COLOR_CONV_RGB16_INCLUDED -#define AGG_COLOR_CONV_RGB16_INCLUDED - -#include "agg_basics.h" -#include "agg_color_conv.h" - -namespace agg -{ - - //-------------------------------------------------color_conv_gray16_to_gray8 - class color_conv_gray16_to_gray8 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - int16u* s = (int16u*)src; - do - { - *dst++ = *s++ >> 8; - } - while(--width); - } - }; - - - //-----------------------------------------------------color_conv_rgb24_rgb48 - template class color_conv_rgb24_rgb48 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - int16u* d = (int16u*)dst; - do - { - *d++ = (src[I1] << 8) | src[I1]; - *d++ = (src[1] << 8) | src[1] ; - *d++ = (src[I3] << 8) | src[I3]; - src += 3; - } - while(--width); - } - }; - - typedef color_conv_rgb24_rgb48<0,2> color_conv_rgb24_to_rgb48; - typedef color_conv_rgb24_rgb48<0,2> color_conv_bgr24_to_bgr48; - typedef color_conv_rgb24_rgb48<2,0> color_conv_rgb24_to_bgr48; - typedef color_conv_rgb24_rgb48<2,0> color_conv_bgr24_to_rgb48; - - - //-----------------------------------------------------color_conv_rgb24_rgb48 - template class color_conv_rgb48_rgb24 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - const int16u* s = (const int16u*)src; - do - { - *dst++ = s[I1] >> 8; - *dst++ = s[1] >> 8; - *dst++ = s[I3] >> 8; - s += 3; - } - while(--width); - } - }; - - typedef color_conv_rgb48_rgb24<0,2> color_conv_rgb48_to_rgb24; - typedef color_conv_rgb48_rgb24<0,2> color_conv_bgr48_to_bgr24; - typedef color_conv_rgb48_rgb24<2,0> color_conv_rgb48_to_bgr24; - typedef color_conv_rgb48_rgb24<2,0> color_conv_bgr48_to_rgb24; - - - //----------------------------------------------color_conv_rgbAAA_rgb24 - template class color_conv_rgbAAA_rgb24 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - int32u rgb = *(int32u*)src; - dst[R] = int8u(rgb >> 22); - dst[1] = int8u(rgb >> 12); - dst[B] = int8u(rgb >> 2); - src += 4; - dst += 3; - } - while(--width); - } - }; - - typedef color_conv_rgbAAA_rgb24<0,2> color_conv_rgbAAA_to_rgb24; - typedef color_conv_rgbAAA_rgb24<2,0> color_conv_rgbAAA_to_bgr24; - typedef color_conv_rgbAAA_rgb24<2,0> color_conv_bgrAAA_to_rgb24; - typedef color_conv_rgbAAA_rgb24<0,2> color_conv_bgrAAA_to_bgr24; - - - //----------------------------------------------color_conv_rgbBBA_rgb24 - template class color_conv_rgbBBA_rgb24 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - int32u rgb = *(int32u*)src; - dst[R] = int8u(rgb >> 24); - dst[1] = int8u(rgb >> 13); - dst[B] = int8u(rgb >> 2); - src += 4; - dst += 3; - } - while(--width); - } - }; - - typedef color_conv_rgbBBA_rgb24<0,2> color_conv_rgbBBA_to_rgb24; - typedef color_conv_rgbBBA_rgb24<2,0> color_conv_rgbBBA_to_bgr24; - - - //----------------------------------------------color_conv_bgrABB_rgb24 - template class color_conv_bgrABB_rgb24 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - int32u bgr = *(int32u*)src; - dst[R] = int8u(bgr >> 3); - dst[1] = int8u(bgr >> 14); - dst[B] = int8u(bgr >> 24); - src += 4; - dst += 3; - } - while(--width); - } - }; - - typedef color_conv_bgrABB_rgb24<2,0> color_conv_bgrABB_to_rgb24; - typedef color_conv_bgrABB_rgb24<0,2> color_conv_bgrABB_to_bgr24; - - - //-------------------------------------------------color_conv_rgba64_rgba32 - template class color_conv_rgba64_rgba32 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - *dst++ = int8u(((int16u*)src)[I1] >> 8); - *dst++ = int8u(((int16u*)src)[I2] >> 8); - *dst++ = int8u(((int16u*)src)[I3] >> 8); - *dst++ = int8u(((int16u*)src)[I4] >> 8); - src += 8; - } - while(--width); - } - }; - - //------------------------------------------------------------------------ - typedef color_conv_rgba64_rgba32<0,1,2,3> color_conv_rgba64_to_rgba32; //----color_conv_rgba64_to_rgba32 - typedef color_conv_rgba64_rgba32<0,1,2,3> color_conv_argb64_to_argb32; //----color_conv_argb64_to_argb32 - typedef color_conv_rgba64_rgba32<0,1,2,3> color_conv_bgra64_to_bgra32; //----color_conv_bgra64_to_bgra32 - typedef color_conv_rgba64_rgba32<0,1,2,3> color_conv_abgr64_to_abgr32; //----color_conv_abgr64_to_abgr32 - typedef color_conv_rgba64_rgba32<0,3,2,1> color_conv_argb64_to_abgr32; //----color_conv_argb64_to_abgr32 - typedef color_conv_rgba64_rgba32<3,2,1,0> color_conv_argb64_to_bgra32; //----color_conv_argb64_to_bgra32 - typedef color_conv_rgba64_rgba32<1,2,3,0> color_conv_argb64_to_rgba32; //----color_conv_argb64_to_rgba32 - typedef color_conv_rgba64_rgba32<3,0,1,2> color_conv_bgra64_to_abgr32; //----color_conv_bgra64_to_abgr32 - typedef color_conv_rgba64_rgba32<3,2,1,0> color_conv_bgra64_to_argb32; //----color_conv_bgra64_to_argb32 - typedef color_conv_rgba64_rgba32<2,1,0,3> color_conv_bgra64_to_rgba32; //----color_conv_bgra64_to_rgba32 - typedef color_conv_rgba64_rgba32<3,2,1,0> color_conv_rgba64_to_abgr32; //----color_conv_rgba64_to_abgr32 - typedef color_conv_rgba64_rgba32<3,0,1,2> color_conv_rgba64_to_argb32; //----color_conv_rgba64_to_argb32 - typedef color_conv_rgba64_rgba32<2,1,0,3> color_conv_rgba64_to_bgra32; //----color_conv_rgba64_to_bgra32 - typedef color_conv_rgba64_rgba32<0,3,2,1> color_conv_abgr64_to_argb32; //----color_conv_abgr64_to_argb32 - typedef color_conv_rgba64_rgba32<1,2,3,0> color_conv_abgr64_to_bgra32; //----color_conv_abgr64_to_bgra32 - typedef color_conv_rgba64_rgba32<3,2,1,0> color_conv_abgr64_to_rgba32; //----color_conv_abgr64_to_rgba32 - - - - //--------------------------------------------color_conv_rgb24_rgba64 - template class color_conv_rgb24_rgba64 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - int16u* d = (int16u*)dst; - do - { - d[I1] = (src[0] << 8) | src[0]; - d[I2] = (src[1] << 8) | src[1]; - d[I3] = (src[2] << 8) | src[2]; - d[A] = 65535; - d += 4; - src += 3; - } - while(--width); - } - }; - - - //------------------------------------------------------------------------ - typedef color_conv_rgb24_rgba64<1,2,3,0> color_conv_rgb24_to_argb64; //----color_conv_rgb24_to_argb64 - typedef color_conv_rgb24_rgba64<3,2,1,0> color_conv_rgb24_to_abgr64; //----color_conv_rgb24_to_abgr64 - typedef color_conv_rgb24_rgba64<2,1,0,3> color_conv_rgb24_to_bgra64; //----color_conv_rgb24_to_bgra64 - typedef color_conv_rgb24_rgba64<0,1,2,3> color_conv_rgb24_to_rgba64; //----color_conv_rgb24_to_rgba64 - typedef color_conv_rgb24_rgba64<3,2,1,0> color_conv_bgr24_to_argb64; //----color_conv_bgr24_to_argb64 - typedef color_conv_rgb24_rgba64<1,2,3,0> color_conv_bgr24_to_abgr64; //----color_conv_bgr24_to_abgr64 - typedef color_conv_rgb24_rgba64<0,1,2,3> color_conv_bgr24_to_bgra64; //----color_conv_bgr24_to_bgra64 - typedef color_conv_rgb24_rgba64<2,1,0,3> color_conv_bgr24_to_rgba64; //----color_conv_bgr24_to_rgba64 - - - template class color_conv_rgb24_gray16 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - int16u* d = (int16u*)dst; - do - { - *d++ = src[R]*77 + src[1]*150 + src[B]*29; - src += 3; - } - while(--width); - } - }; - - typedef color_conv_rgb24_gray16<0,2> color_conv_rgb24_to_gray16; - typedef color_conv_rgb24_gray16<2,0> color_conv_bgr24_to_gray16; - - -} - - -#endif diff --git a/uppdev/aggdraw/util/agg_color_conv_rgb8.h b/uppdev/aggdraw/util/agg_color_conv_rgb8.h deleted file mode 100644 index 6a7525cf5..000000000 --- a/uppdev/aggdraw/util/agg_color_conv_rgb8.h +++ /dev/null @@ -1,478 +0,0 @@ -//---------------------------------------------------------------------------- -// Anti-Grain Geometry (AGG) - Version 2.5 -// A high quality rendering engine for C++ -// Copyright (C) 2002-2006 Maxim Shemanarev -// Contact: mcseem@antigrain.com -// mcseemagg@yahoo.com -// http://antigrain.com -// -// AGG is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. -// -// AGG is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with AGG; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -// MA 02110-1301, USA. -//---------------------------------------------------------------------------- -// -// A set of functors used with color_conv(). See file agg_color_conv.h -// These functors can convert images with up to 8 bits per component. -// Use convertors in the following way: -// -// agg::color_conv(dst, src, agg::color_conv_XXXX_to_YYYY()); -// whare XXXX and YYYY can be any of: -// rgb24 -// bgr24 -// rgba32 -// abgr32 -// argb32 -// bgra32 -// rgb555 -// rgb565 -//---------------------------------------------------------------------------- - -#ifndef AGG_COLOR_CONV_RGB8_INCLUDED -#define AGG_COLOR_CONV_RGB8_INCLUDED - -#include "agg_basics.h" -#include "agg_color_conv.h" - -namespace agg -{ - - //-----------------------------------------------------color_conv_rgb24 - class color_conv_rgb24 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - *dst++ = src[2]; - *dst++ = src[1]; - *dst++ = src[0]; - src += 3; - } - while(--width); - } - }; - - typedef color_conv_rgb24 color_conv_rgb24_to_bgr24; - typedef color_conv_rgb24 color_conv_bgr24_to_rgb24; - - typedef color_conv_same<3> color_conv_bgr24_to_bgr24; - typedef color_conv_same<3> color_conv_rgb24_to_rgb24; - - - - //------------------------------------------------------color_conv_rgba32 - template class color_conv_rgba32 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - *dst++ = src[I1]; - *dst++ = src[I2]; - *dst++ = src[I3]; - *dst++ = src[I4]; - src += 4; - } - while(--width); - } - }; - - - //------------------------------------------------------------------------ - typedef color_conv_rgba32<0,3,2,1> color_conv_argb32_to_abgr32; //----color_conv_argb32_to_abgr32 - typedef color_conv_rgba32<3,2,1,0> color_conv_argb32_to_bgra32; //----color_conv_argb32_to_bgra32 - typedef color_conv_rgba32<1,2,3,0> color_conv_argb32_to_rgba32; //----color_conv_argb32_to_rgba32 - typedef color_conv_rgba32<3,0,1,2> color_conv_bgra32_to_abgr32; //----color_conv_bgra32_to_abgr32 - typedef color_conv_rgba32<3,2,1,0> color_conv_bgra32_to_argb32; //----color_conv_bgra32_to_argb32 - typedef color_conv_rgba32<2,1,0,3> color_conv_bgra32_to_rgba32; //----color_conv_bgra32_to_rgba32 - typedef color_conv_rgba32<3,2,1,0> color_conv_rgba32_to_abgr32; //----color_conv_rgba32_to_abgr32 - typedef color_conv_rgba32<3,0,1,2> color_conv_rgba32_to_argb32; //----color_conv_rgba32_to_argb32 - typedef color_conv_rgba32<2,1,0,3> color_conv_rgba32_to_bgra32; //----color_conv_rgba32_to_bgra32 - typedef color_conv_rgba32<0,3,2,1> color_conv_abgr32_to_argb32; //----color_conv_abgr32_to_argb32 - typedef color_conv_rgba32<1,2,3,0> color_conv_abgr32_to_bgra32; //----color_conv_abgr32_to_bgra32 - typedef color_conv_rgba32<3,2,1,0> color_conv_abgr32_to_rgba32; //----color_conv_abgr32_to_rgba32 - - //------------------------------------------------------------------------ - typedef color_conv_same<4> color_conv_rgba32_to_rgba32; //----color_conv_rgba32_to_rgba32 - typedef color_conv_same<4> color_conv_argb32_to_argb32; //----color_conv_argb32_to_argb32 - typedef color_conv_same<4> color_conv_bgra32_to_bgra32; //----color_conv_bgra32_to_bgra32 - typedef color_conv_same<4> color_conv_abgr32_to_abgr32; //----color_conv_abgr32_to_abgr32 - - - //--------------------------------------------color_conv_rgb24_rgba32 - template class color_conv_rgb24_rgba32 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - dst[I1] = *src++; - dst[I2] = *src++; - dst[I3] = *src++; - dst[A] = 255; - dst += 4; - } - while(--width); - } - }; - - - //------------------------------------------------------------------------ - typedef color_conv_rgb24_rgba32<1,2,3,0> color_conv_rgb24_to_argb32; //----color_conv_rgb24_to_argb32 - typedef color_conv_rgb24_rgba32<3,2,1,0> color_conv_rgb24_to_abgr32; //----color_conv_rgb24_to_abgr32 - typedef color_conv_rgb24_rgba32<2,1,0,3> color_conv_rgb24_to_bgra32; //----color_conv_rgb24_to_bgra32 - typedef color_conv_rgb24_rgba32<0,1,2,3> color_conv_rgb24_to_rgba32; //----color_conv_rgb24_to_rgba32 - typedef color_conv_rgb24_rgba32<3,2,1,0> color_conv_bgr24_to_argb32; //----color_conv_bgr24_to_argb32 - typedef color_conv_rgb24_rgba32<1,2,3,0> color_conv_bgr24_to_abgr32; //----color_conv_bgr24_to_abgr32 - typedef color_conv_rgb24_rgba32<0,1,2,3> color_conv_bgr24_to_bgra32; //----color_conv_bgr24_to_bgra32 - typedef color_conv_rgb24_rgba32<2,1,0,3> color_conv_bgr24_to_rgba32; //----color_conv_bgr24_to_rgba32 - - - - //-------------------------------------------------color_conv_rgba32_rgb24 - template class color_conv_rgba32_rgb24 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - *dst++ = src[I1]; - *dst++ = src[I2]; - *dst++ = src[I3]; - src += 4; - } - while(--width); - } - }; - - - - //------------------------------------------------------------------------ - typedef color_conv_rgba32_rgb24<1,2,3> color_conv_argb32_to_rgb24; //----color_conv_argb32_to_rgb24 - typedef color_conv_rgba32_rgb24<3,2,1> color_conv_abgr32_to_rgb24; //----color_conv_abgr32_to_rgb24 - typedef color_conv_rgba32_rgb24<2,1,0> color_conv_bgra32_to_rgb24; //----color_conv_bgra32_to_rgb24 - typedef color_conv_rgba32_rgb24<0,1,2> color_conv_rgba32_to_rgb24; //----color_conv_rgba32_to_rgb24 - typedef color_conv_rgba32_rgb24<3,2,1> color_conv_argb32_to_bgr24; //----color_conv_argb32_to_bgr24 - typedef color_conv_rgba32_rgb24<1,2,3> color_conv_abgr32_to_bgr24; //----color_conv_abgr32_to_bgr24 - typedef color_conv_rgba32_rgb24<0,1,2> color_conv_bgra32_to_bgr24; //----color_conv_bgra32_to_bgr24 - typedef color_conv_rgba32_rgb24<2,1,0> color_conv_rgba32_to_bgr24; //----color_conv_rgba32_to_bgr24 - - - //------------------------------------------------color_conv_rgb555_rgb24 - template class color_conv_rgb555_rgb24 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - unsigned rgb = *(int16u*)src; - dst[R] = (int8u)((rgb >> 7) & 0xF8); - dst[1] = (int8u)((rgb >> 2) & 0xF8); - dst[B] = (int8u)((rgb << 3) & 0xF8); - src += 2; - dst += 3; - } - while(--width); - } - }; - - - //------------------------------------------------------------------------ - typedef color_conv_rgb555_rgb24<2,0> color_conv_rgb555_to_bgr24; //----color_conv_rgb555_to_bgr24 - typedef color_conv_rgb555_rgb24<0,2> color_conv_rgb555_to_rgb24; //----color_conv_rgb555_to_rgb24 - - - //-------------------------------------------------color_conv_rgb24_rgb555 - template class color_conv_rgb24_rgb555 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - *(int16u*)dst = (int16u)(((unsigned(src[R]) << 7) & 0x7C00) | - ((unsigned(src[1]) << 2) & 0x3E0) | - ((unsigned(src[B]) >> 3))); - src += 3; - dst += 2; - } - while(--width); - } - }; - - - //------------------------------------------------------------------------ - typedef color_conv_rgb24_rgb555<2,0> color_conv_bgr24_to_rgb555; //----color_conv_bgr24_to_rgb555 - typedef color_conv_rgb24_rgb555<0,2> color_conv_rgb24_to_rgb555; //----color_conv_rgb24_to_rgb555 - - - //-------------------------------------------------color_conv_rgb565_rgb24 - template class color_conv_rgb565_rgb24 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - unsigned rgb = *(int16u*)src; - dst[R] = (rgb >> 8) & 0xF8; - dst[1] = (rgb >> 3) & 0xFC; - dst[B] = (rgb << 3) & 0xF8; - src += 2; - dst += 3; - } - while(--width); - } - }; - - - //------------------------------------------------------------------------ - typedef color_conv_rgb565_rgb24<2,0> color_conv_rgb565_to_bgr24; //----color_conv_rgb565_to_bgr24 - typedef color_conv_rgb565_rgb24<0,2> color_conv_rgb565_to_rgb24; //----color_conv_rgb565_to_rgb24 - - - //-------------------------------------------------color_conv_rgb24_rgb565 - template class color_conv_rgb24_rgb565 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - *(int16u*)dst = (int16u)(((unsigned(src[R]) << 8) & 0xF800) | - ((unsigned(src[1]) << 3) & 0x7E0) | - ((unsigned(src[B]) >> 3))); - src += 3; - dst += 2; - } - while(--width); - } - }; - - - //------------------------------------------------------------------------ - typedef color_conv_rgb24_rgb565<2,0> color_conv_bgr24_to_rgb565; //----color_conv_bgr24_to_rgb565 - typedef color_conv_rgb24_rgb565<0,2> color_conv_rgb24_to_rgb565; //----color_conv_rgb24_to_rgb565 - - - - //-------------------------------------------------color_conv_rgb555_rgba32 - template class color_conv_rgb555_rgba32 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - int rgb = *(int16*)src; - dst[R] = (int8u)((rgb >> 7) & 0xF8); - dst[G] = (int8u)((rgb >> 2) & 0xF8); - dst[B] = (int8u)((rgb << 3) & 0xF8); - dst[A] = (int8u)(rgb >> 15); - src += 2; - dst += 4; - } - while(--width); - } - }; - - - //------------------------------------------------------------------------ - typedef color_conv_rgb555_rgba32<1,2,3,0> color_conv_rgb555_to_argb32; //----color_conv_rgb555_to_argb32 - typedef color_conv_rgb555_rgba32<3,2,1,0> color_conv_rgb555_to_abgr32; //----color_conv_rgb555_to_abgr32 - typedef color_conv_rgb555_rgba32<2,1,0,3> color_conv_rgb555_to_bgra32; //----color_conv_rgb555_to_bgra32 - typedef color_conv_rgb555_rgba32<0,1,2,3> color_conv_rgb555_to_rgba32; //----color_conv_rgb555_to_rgba32 - - - //------------------------------------------------color_conv_rgba32_rgb555 - template class color_conv_rgba32_rgb555 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - *(int16u*)dst = (int16u)(((unsigned(src[R]) << 7) & 0x7C00) | - ((unsigned(src[G]) << 2) & 0x3E0) | - ((unsigned(src[B]) >> 3)) | - ((unsigned(src[A]) << 8) & 0x8000)); - src += 4; - dst += 2; - } - while(--width); - } - }; - - - //------------------------------------------------------------------------ - typedef color_conv_rgba32_rgb555<1,2,3,0> color_conv_argb32_to_rgb555; //----color_conv_argb32_to_rgb555 - typedef color_conv_rgba32_rgb555<3,2,1,0> color_conv_abgr32_to_rgb555; //----color_conv_abgr32_to_rgb555 - typedef color_conv_rgba32_rgb555<2,1,0,3> color_conv_bgra32_to_rgb555; //----color_conv_bgra32_to_rgb555 - typedef color_conv_rgba32_rgb555<0,1,2,3> color_conv_rgba32_to_rgb555; //----color_conv_rgba32_to_rgb555 - - - - //------------------------------------------------color_conv_rgb565_rgba32 - template class color_conv_rgb565_rgba32 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - int rgb = *(int16*)src; - dst[R] = (rgb >> 8) & 0xF8; - dst[G] = (rgb >> 3) & 0xFC; - dst[B] = (rgb << 3) & 0xF8; - dst[A] = 255; - src += 2; - dst += 4; - } - while(--width); - } - }; - - - //------------------------------------------------------------------------ - typedef color_conv_rgb565_rgba32<1,2,3,0> color_conv_rgb565_to_argb32; //----color_conv_rgb565_to_argb32 - typedef color_conv_rgb565_rgba32<3,2,1,0> color_conv_rgb565_to_abgr32; //----color_conv_rgb565_to_abgr32 - typedef color_conv_rgb565_rgba32<2,1,0,3> color_conv_rgb565_to_bgra32; //----color_conv_rgb565_to_bgra32 - typedef color_conv_rgb565_rgba32<0,1,2,3> color_conv_rgb565_to_rgba32; //----color_conv_rgb565_to_rgba32 - - - //------------------------------------------------color_conv_rgba32_rgb565 - template class color_conv_rgba32_rgb565 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - *(int16u*)dst = (int16u)(((unsigned(src[R]) << 8) & 0xF800) | - ((unsigned(src[G]) << 3) & 0x7E0) | - ((unsigned(src[B]) >> 3))); - src += 4; - dst += 2; - } - while(--width); - } - }; - - - //------------------------------------------------------------------------ - typedef color_conv_rgba32_rgb565<1,2,3> color_conv_argb32_to_rgb565; //----color_conv_argb32_to_rgb565 - typedef color_conv_rgba32_rgb565<3,2,1> color_conv_abgr32_to_rgb565; //----color_conv_abgr32_to_rgb565 - typedef color_conv_rgba32_rgb565<2,1,0> color_conv_bgra32_to_rgb565; //----color_conv_bgra32_to_rgb565 - typedef color_conv_rgba32_rgb565<0,1,2> color_conv_rgba32_to_rgb565; //----color_conv_rgba32_to_rgb565 - - - //---------------------------------------------color_conv_rgb555_to_rgb565 - class color_conv_rgb555_to_rgb565 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - unsigned rgb = *(int16u*)src; - *(int16u*)dst = (int16u)(((rgb << 1) & 0xFFC0) | (rgb & 0x1F)); - src += 2; - dst += 2; - } - while(--width); - } - }; - - - //----------------------------------------------color_conv_rgb565_to_rgb555 - class color_conv_rgb565_to_rgb555 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - unsigned rgb = *(int16u*)src; - *(int16u*)dst = (int16u)(((rgb >> 1) & 0x7FE0) | (rgb & 0x1F)); - src += 2; - dst += 2; - } - while(--width); - } - }; - - - //------------------------------------------------------------------------ - typedef color_conv_same<2> color_conv_rgb555_to_rgb555; //----color_conv_rgb555_to_rgb555 - typedef color_conv_same<2> color_conv_rgb565_to_rgb565; //----color_conv_rgb565_to_rgb565 - - - template class color_conv_rgb24_gray8 - { - public: - void operator () (int8u* dst, - const int8u* src, - unsigned width) const - { - do - { - *dst++ = (src[R]*77 + src[1]*150 + src[B]*29) >> 8; - src += 3; - } - while(--width); - } - }; - - typedef color_conv_rgb24_gray8<0,2> color_conv_rgb24_to_gray8; //----color_conv_rgb24_to_gray8 - typedef color_conv_rgb24_gray8<2,0> color_conv_bgr24_to_gray8; //----color_conv_bgr24_to_gray8 - - -} - - - -#endif diff --git a/uppdev/aggtest/aggtest.h b/uppdev/aggtest/aggtest.h deleted file mode 100644 index 2665dde25..000000000 --- a/uppdev/aggtest/aggtest.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef _aggtest_aggtest_h -#define _aggtest_aggtest_h - -// Original sourcecode from Maxim Shemanarev, 2002-2006 -// For Upp rewritten by Jan Dolinár dolik.rce@seznam.cz - -#include -#include -#include - -using namespace Upp; - -class AggTestCtrl:public AggCtrl{ -public: - AggTestCtrl(); - virtual void onDraw(Upp::Draw& dest); - virtual void onInit(); - virtual void onResize(int width,int height); - void parse_lion(); - agg::pixfmt_bgr24 pixf; - agg::renderer_base rb; - agg::renderer_scanline_aa_solid > r; - agg::scanline_u8 sl; - agg::path_storage path; - agg::rasterizer_scanline_aa<> rasterizer; - agg::rgba8 colors[100]; - unsigned path_idx[100]; - unsigned npaths; - double x1,y1,x2,y2; - double base_dx,base_dy,scale; -}; - -#define LAYOUTFILE -#include - -class aggtest : public WithaggtestLayout{ -public: - typedef aggtest CLASSNAME; - aggtest(); -}; - -#endif - diff --git a/uppdev/aggtest/aggtest.lay b/uppdev/aggtest/aggtest.lay deleted file mode 100644 index a20953708..000000000 --- a/uppdev/aggtest/aggtest.lay +++ /dev/null @@ -1,4 +0,0 @@ -LAYOUT(aggtestLayout, 772, 776) - ITEM(AggTestCtrl, MyAgg, HSizePosZ(4, 4).VSizePosZ(8, 8)) -END_LAYOUT - diff --git a/uppdev/aggtest/aggtest.upp b/uppdev/aggtest/aggtest.upp deleted file mode 100644 index ba1cf7422..000000000 --- a/uppdev/aggtest/aggtest.upp +++ /dev/null @@ -1,15 +0,0 @@ -optimize_speed; - -uses - CtrlLib, - AggCtrl; - -file - aggtest.h, - lion.cpp, - main.cpp, - aggtest.lay; - -mainconfig - "" = "GUI"; - diff --git a/uppdev/aggtest/init b/uppdev/aggtest/init deleted file mode 100644 index 9371480d8..000000000 --- a/uppdev/aggtest/init +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef _aggtest_icpp_init_stub -#define _aggtest_icpp_init_stub -#include "CtrlLib/init" -#include "AggCtrl/init" -#endif diff --git a/uppdev/aggtest/lion.cpp b/uppdev/aggtest/lion.cpp deleted file mode 100644 index c00f9ff4c..000000000 --- a/uppdev/aggtest/lion.cpp +++ /dev/null @@ -1,225 +0,0 @@ -#include -#include -#include -#include -#include -#include - -static char g_lion[] = - "f2cc99\n" - "M 69,18 L 82,8 L 99,3 L 118,5 L 135,12 L 149,21 L 156,13 L 165,9 L 177,13 L 183,28 L 180,50 L 164,91 L 155,107 L 154,114 L 151,121 L 141,127 L 139,136 L 155,206 L 157,251 L 126,342 L 133,357 L 128,376 L 83,376 L 75,368 L 67,350 L 61,350 L 53,369 L 4,369 L 2,361 L 5,354 L 12,342 L 16,321 L 4,257 L 4,244 L 7,218 L 9,179 L 26,127 L 43,93 L 32,77 L 30,70 L 24,67 L 16,49 L 17,35 L 18,23 L 30,12 L 40,7 L 53,7 L 62,12 L 69,18 L 69,18 L 69,18\n" - "e5b27f\n" - "M 142,79 L 136,74 L 138,82 L 133,78 L 133,84 L 127,78 L 128,85 L 124,80 L 125,87 L 119,82 L 119,90 L 125,99 L 125,96 L 128,100 L 128,94 L 131,98 L 132,93 L 135,97 L 136,93 L 138,97 L 139,94 L 141,98 L 143,94 L 144,85 L 142,79 L 142,79 L 142,79\n" - "eb8080\n" - "M 127,101 L 132,100 L 137,99 L 144,101 L 143,105 L 135,110 L 127,101 L 127,101 L 127,101\n" - "f2cc99\n" - "M 178,229 L 157,248 L 139,296 L 126,349 L 137,356 L 158,357 L 183,342 L 212,332 L 235,288 L 235,261 L 228,252 L 212,250 L 188,251 L 178,229 L 178,229 L 178,229\n" - "9c826b\n" - "M 56,229 L 48,241 L 48,250 L 57,281 L 63,325 L 71,338 L 81,315 L 76,321 L 79,311 L 83,301 L 75,308 L 80,298 L 73,303 L 76,296 L 71,298 L 74,292 L 69,293 L 74,284 L 78,278 L 71,278 L 74,274 L 68,273 L 70,268 L 66,267 L 68,261 L 60,266 L 62,259 L 65,253 L 57,258 L 59,251 L 55,254 L 55,248 L 60,237 L 54,240 L 58,234 L 54,236 L 56,229 L 56,229 L 56,229\n" - "M 74,363 L 79,368 L 81,368 L 85,362 L 89,363 L 92,370 L 96,373 L 101,372 L 108,361 L 110,371 L 113,373 L 116,371 L 120,358 L 122,363 L 123,371 L 126,371 L 129,367 L 132,357 L 135,361 L 130,376 L 127,377 L 94,378 L 84,376 L 76,371 L 74,363 L 74,363 L 74,363\n" - "M 212,250 L 219,251 L 228,258 L 236,270 L 235,287 L 225,304 L 205,332 L 177,343 L 171,352 L 158,357 L 166,352 L 168,346 L 168,339 L 165,333 L 155,327 L 155,323 L 161,320 L 165,316 L 169,316 L 167,312 L 171,313 L 168,308 L 173,309 L 170,306 L 177,306 L 175,308 L 177,311 L 174,311 L 176,316 L 171,315 L 174,319 L 168,320 L 168,323 L 175,327 L 179,332 L 183,326 L 184,332 L 189,323 L 190,328 L 194,320 L 194,325 L 199,316 L 201,320 L 204,313 L 206,316 L 208,310 L 211,305 L 219,298 L 226,288 L 229,279 L 228,266 L 224,259 L 217,253 L 212,250 L 212,250 L 212,250\n" - "M 151,205 L 151,238 L 149,252 L 141,268 L 128,282 L 121,301 L 130,300 L 126,313 L 118,324 L 116,337 L 120,346 L 133,352 L 133,340 L 137,333 L 145,329 L 156,327 L 153,319 L 153,291 L 157,271 L 170,259 L 178,277 L 193,250 L 174,216 L 151,205 L 151,205 L 151,205\n" - "M 78,127 L 90,142 L 95,155 L 108,164 L 125,167 L 139,175 L 150,206 L 152,191 L 141,140 L 121,148 L 100,136 L 78,127 L 78,127 L 78,127\n" - "M 21,58 L 35,63 L 38,68 L 32,69 L 42,74 L 40,79 L 47,80 L 54,83 L 45,94 L 34,81 L 32,73 L 24,66 L 21,58 L 21,58 L 21,58\n" - "M 71,34 L 67,34 L 66,27 L 59,24 L 54,17 L 48,17 L 39,22 L 30,26 L 28,31 L 31,39 L 38,46 L 29,45 L 36,54 L 41,61 L 41,70 L 50,69 L 54,71 L 55,58 L 67,52 L 76,43 L 76,39 L 68,44 L 71,34 L 71,34 L 71,34\n" - "M 139,74 L 141,83 L 143,89 L 144,104 L 148,104 L 155,106 L 154,86 L 157,77 L 155,72 L 150,77 L 144,77 L 139,74 L 139,74 L 139,74\n" - "M 105,44 L 102,53 L 108,58 L 111,62 L 112,55 L 105,44 L 105,44 L 105,44\n" - "M 141,48 L 141,54 L 144,58 L 139,62 L 137,66 L 136,59 L 137,52 L 141,48 L 141,48 L 141,48\n" - "M 98,135 L 104,130 L 105,134 L 108,132 L 108,135 L 112,134 L 113,137 L 116,136 L 116,139 L 119,139 L 124,141 L 128,140 L 133,138 L 140,133 L 139,140 L 126,146 L 104,144 L 98,135 L 98,135 L 98,135\n" - "M 97,116 L 103,119 L 103,116 L 111,118 L 116,117 L 122,114 L 127,107 L 135,111 L 142,107 L 141,114 L 145,118 L 149,121 L 145,125 L 140,124 L 127,121 L 113,125 L 100,124 L 97,116 L 97,116 L 97,116\n" - "M 147,33 L 152,35 L 157,34 L 153,31 L 160,31 L 156,28 L 161,28 L 159,24 L 163,25 L 163,21 L 165,22 L 170,23 L 167,17 L 172,21 L 174,18 L 175,23 L 176,22 L 177,28 L 177,33 L 174,37 L 176,39 L 174,44 L 171,49 L 168,53 L 164,57 L 159,68 L 156,70 L 154,60 L 150,51 L 146,43 L 144,35 L 147,33 L 147,33 L 147,33\n" - "M 85,72 L 89,74 L 93,75 L 100,76 L 105,75 L 102,79 L 94,79 L 88,76 L 85,72 L 85,72 L 85,72\n" - "M 86,214 L 79,221 L 76,232 L 82,225 L 78,239 L 82,234 L 78,245 L 81,243 L 79,255 L 84,250 L 84,267 L 87,254 L 90,271 L 90,257 L 95,271 L 93,256 L 95,249 L 92,252 L 93,243 L 89,253 L 89,241 L 86,250 L 87,236 L 83,245 L 87,231 L 82,231 L 90,219 L 84,221 L 86,214 L 86,214 L 86,214\n" - "ffcc7f\n" - "M 93,68 L 96,72 L 100,73 L 106,72 L 108,66 L 105,63 L 100,62 L 93,68 L 93,68 L 93,68\n" - "M 144,64 L 142,68 L 142,73 L 146,74 L 150,73 L 154,64 L 149,62 L 144,64 L 144,64 L 144,64\n" - "9c826b\n" - "M 57,91 L 42,111 L 52,105 L 41,117 L 53,112 L 46,120 L 53,116 L 50,124 L 57,119 L 55,127 L 61,122 L 60,130 L 67,126 L 66,134 L 71,129 L 72,136 L 77,130 L 76,137 L 80,133 L 82,138 L 86,135 L 96,135 L 94,129 L 86,124 L 83,117 L 77,123 L 79,117 L 73,120 L 75,112 L 68,116 L 71,111 L 65,114 L 69,107 L 63,110 L 68,102 L 61,107 L 66,98 L 61,103 L 63,97 L 57,99 L 57,91 L 57,91 L 57,91\n" - "M 83,79 L 76,79 L 67,82 L 75,83 L 65,88 L 76,87 L 65,92 L 76,91 L 68,96 L 77,95 L 70,99 L 80,98 L 72,104 L 80,102 L 76,108 L 85,103 L 92,101 L 87,98 L 93,96 L 86,94 L 91,93 L 85,91 L 93,89 L 99,89 L 105,93 L 107,85 L 102,82 L 92,80 L 83,79 L 83,79 L 83,79\n" - "M 109,77 L 111,83 L 109,89 L 113,94 L 117,90 L 117,81 L 114,78 L 109,77 L 109,77 L 109,77\n" - "M 122,128 L 127,126 L 134,127 L 136,129 L 134,130 L 130,128 L 124,129 L 122,128 L 122,128 L 122,128\n" - "M 78,27 L 82,32 L 80,33 L 82,36 L 78,37 L 82,40 L 78,42 L 81,46 L 76,47 L 78,49 L 74,50 L 82,52 L 87,50 L 83,48 L 91,46 L 86,45 L 91,42 L 88,40 L 92,37 L 86,34 L 90,31 L 86,29 L 89,26 L 78,27 L 78,27 L 78,27\n" - "M 82,17 L 92,20 L 79,21 L 90,25 L 81,25 L 94,28 L 93,26 L 101,30 L 101,26 L 107,33 L 108,28 L 111,40 L 113,34 L 115,45 L 117,39 L 119,54 L 121,46 L 124,58 L 126,47 L 129,59 L 130,49 L 134,58 L 133,44 L 137,48 L 133,37 L 137,40 L 133,32 L 126,20 L 135,26 L 132,19 L 138,23 L 135,17 L 142,18 L 132,11 L 116,6 L 94,6 L 78,11 L 92,12 L 80,14 L 90,16 L 82,17 L 82,17 L 82,17\n" - "M 142,234 L 132,227 L 124,223 L 115,220 L 110,225 L 118,224 L 127,229 L 135,236 L 122,234 L 115,237 L 113,242 L 121,238 L 139,243 L 121,245 L 111,254 L 95,254 L 102,244 L 104,235 L 110,229 L 100,231 L 104,224 L 113,216 L 122,215 L 132,217 L 141,224 L 145,230 L 149,240 L 142,234 L 142,234 L 142,234\n" - "M 115,252 L 125,248 L 137,249 L 143,258 L 134,255 L 125,254 L 115,252 L 115,252 L 115,252\n" - "M 114,212 L 130,213 L 140,219 L 147,225 L 144,214 L 137,209 L 128,207 L 114,212 L 114,212 L 114,212\n" - "M 102,263 L 108,258 L 117,257 L 131,258 L 116,260 L 109,265 L 102,263 L 102,263 L 102,263\n" - "M 51,241 L 35,224 L 40,238 L 23,224 L 31,242 L 19,239 L 28,247 L 17,246 L 25,250 L 37,254 L 39,263 L 44,271 L 47,294 L 48,317 L 51,328 L 60,351 L 60,323 L 53,262 L 47,246 L 51,241 L 51,241 L 51,241\n" - "M 2,364 L 9,367 L 14,366 L 18,355 L 20,364 L 26,366 L 31,357 L 35,364 L 39,364 L 42,357 L 47,363 L 53,360 L 59,357 L 54,369 L 7,373 L 2,364 L 2,364 L 2,364\n" - "M 7,349 L 19,345 L 25,339 L 18,341 L 23,333 L 28,326 L 23,326 L 27,320 L 23,316 L 25,311 L 20,298 L 15,277 L 12,264 L 9,249 L 10,223 L 3,248 L 5,261 L 15,307 L 17,326 L 11,343 L 7,349 L 7,349 L 7,349\n" - "M 11,226 L 15,231 L 25,236 L 18,227 L 11,226 L 11,226 L 11,226\n" - "M 13,214 L 19,217 L 32,227 L 23,214 L 16,208 L 15,190 L 24,148 L 31,121 L 24,137 L 14,170 L 8,189 L 13,214 L 13,214 L 13,214\n" - "M 202,254 L 195,258 L 199,260 L 193,263 L 197,263 L 190,268 L 196,268 L 191,273 L 188,282 L 200,272 L 194,272 L 201,266 L 197,265 L 204,262 L 200,258 L 204,256 L 202,254 L 202,254 L 202,254\n" - "845433\n" - "M 151,213 L 165,212 L 179,225 L 189,246 L 187,262 L 179,275 L 176,263 L 177,247 L 171,233 L 163,230 L 165,251 L 157,264 L 146,298 L 145,321 L 133,326 L 143,285 L 154,260 L 153,240 L 151,213 L 151,213 L 151,213\n" - "M 91,132 L 95,145 L 97,154 L 104,148 L 107,155 L 109,150 L 111,158 L 115,152 L 118,159 L 120,153 L 125,161 L 126,155 L 133,164 L 132,154 L 137,163 L 137,152 L 142,163 L 147,186 L 152,192 L 148,167 L 141,143 L 124,145 L 105,143 L 91,132 L 91,132 L 91,132\n" - "9c826b\n" - "M 31,57 L 23,52 L 26,51 L 20,44 L 23,42 L 21,36 L 22,29 L 25,23 L 24,32 L 30,43 L 26,41 L 30,50 L 26,48 L 31,57 L 31,57 L 31,57\n" - "M 147,21 L 149,28 L 155,21 L 161,16 L 167,14 L 175,15 L 173,11 L 161,9 L 147,21 L 147,21 L 147,21\n" - "M 181,39 L 175,51 L 169,57 L 171,65 L 165,68 L 165,75 L 160,76 L 162,91 L 171,71 L 180,51 L 181,39 L 181,39 L 181,39\n" - "M 132,346 L 139,348 L 141,346 L 142,341 L 147,342 L 143,355 L 133,350 L 132,346 L 132,346 L 132,346\n" - "M 146,355 L 151,352 L 155,348 L 157,343 L 160,349 L 151,356 L 147,357 L 146,355 L 146,355 L 146,355\n" - "M 99,266 L 100,281 L 94,305 L 86,322 L 78,332 L 72,346 L 73,331 L 91,291 L 99,266 L 99,266 L 99,266\n" - "M 20,347 L 32,342 L 45,340 L 54,345 L 45,350 L 42,353 L 38,350 L 31,353 L 29,356 L 23,350 L 19,353 L 15,349 L 20,347 L 20,347 L 20,347\n" - "M 78,344 L 86,344 L 92,349 L 88,358 L 84,352 L 78,344 L 78,344 L 78,344\n" - "M 93,347 L 104,344 L 117,345 L 124,354 L 121,357 L 116,351 L 112,351 L 108,355 L 102,351 L 93,347 L 93,347 L 93,347\n" - "000000\n" - "M 105,12 L 111,18 L 113,24 L 113,29 L 119,34 L 116,23 L 112,16 L 105,12 L 105,12 L 105,12\n" - "M 122,27 L 125,34 L 127,43 L 128,34 L 125,29 L 122,27 L 122,27 L 122,27\n" - "M 115,13 L 122,19 L 122,15 L 113,10 L 115,13 L 115,13 L 115,13\n" - "ffe5b2\n" - "M 116,172 L 107,182 L 98,193 L 98,183 L 90,199 L 89,189 L 84,207 L 88,206 L 87,215 L 95,206 L 93,219 L 91,230 L 98,216 L 97,226 L 104,214 L 112,209 L 104,208 L 113,202 L 126,200 L 139,207 L 132,198 L 142,203 L 134,192 L 142,195 L 134,187 L 140,185 L 130,181 L 136,177 L 126,177 L 125,171 L 116,180 L 116,172 L 116,172 L 116,172\n" - "M 74,220 L 67,230 L 67,221 L 59,235 L 63,233 L 60,248 L 70,232 L 65,249 L 71,243 L 67,256 L 73,250 L 69,262 L 73,259 L 71,267 L 76,262 L 72,271 L 78,270 L 76,275 L 82,274 L 78,290 L 86,279 L 86,289 L 92,274 L 88,275 L 87,264 L 82,270 L 82,258 L 77,257 L 78,247 L 73,246 L 77,233 L 72,236 L 74,220 L 74,220 L 74,220\n" - "M 133,230 L 147,242 L 148,250 L 145,254 L 138,247 L 129,246 L 142,245 L 138,241 L 128,237 L 137,238 L 133,230 L 133,230 L 133,230\n" - "M 133,261 L 125,261 L 116,263 L 111,267 L 125,265 L 133,261 L 133,261 L 133,261\n" - "M 121,271 L 109,273 L 103,279 L 99,305 L 92,316 L 85,327 L 83,335 L 89,340 L 97,341 L 94,336 L 101,336 L 96,331 L 103,330 L 97,327 L 108,325 L 99,322 L 109,321 L 100,318 L 110,317 L 105,314 L 110,312 L 107,310 L 113,308 L 105,306 L 114,303 L 105,301 L 115,298 L 107,295 L 115,294 L 108,293 L 117,291 L 109,289 L 117,286 L 109,286 L 118,283 L 112,281 L 118,279 L 114,278 L 119,276 L 115,274 L 121,271 L 121,271 L 121,271\n" - "M 79,364 L 74,359 L 74,353 L 76,347 L 80,351 L 83,356 L 82,360 L 79,364 L 79,364 L 79,364\n" - "M 91,363 L 93,356 L 97,353 L 103,355 L 105,360 L 103,366 L 99,371 L 94,368 L 91,363 L 91,363 L 91,363\n" - "M 110,355 L 114,353 L 118,357 L 117,363 L 113,369 L 111,362 L 110,355 L 110,355 L 110,355\n" - "M 126,354 L 123,358 L 124,367 L 126,369 L 129,361 L 129,357 L 126,354 L 126,354 L 126,354\n" - "M 30,154 L 24,166 L 20,182 L 23,194 L 29,208 L 37,218 L 41,210 L 41,223 L 46,214 L 46,227 L 52,216 L 52,227 L 61,216 L 59,225 L 68,213 L 73,219 L 70,207 L 77,212 L 69,200 L 77,202 L 70,194 L 78,197 L 68,187 L 76,182 L 64,182 L 58,175 L 58,185 L 53,177 L 50,186 L 46,171 L 44,182 L 39,167 L 36,172 L 36,162 L 30,166 L 30,154 L 30,154 L 30,154\n" - "M 44,130 L 41,137 L 45,136 L 43,150 L 48,142 L 48,157 L 53,150 L 52,164 L 60,156 L 61,169 L 64,165 L 66,175 L 70,167 L 74,176 L 77,168 L 80,183 L 85,172 L 90,182 L 93,174 L 98,181 L 99,173 L 104,175 L 105,169 L 114,168 L 102,163 L 95,157 L 94,166 L 90,154 L 87,162 L 82,149 L 75,159 L 72,148 L 68,155 L 67,143 L 62,148 L 62,138 L 58,145 L 56,133 L 52,142 L 52,128 L 49,134 L 47,125 L 44,130 L 44,130 L 44,130\n" - "M 13,216 L 19,219 L 36,231 L 22,223 L 16,222 L 22,227 L 12,224 L 13,220 L 16,220 L 13,216 L 13,216 L 13,216\n" - "M 10,231 L 14,236 L 25,239 L 27,237 L 19,234 L 10,231 L 10,231 L 10,231\n" - "M 9,245 L 14,242 L 25,245 L 13,245 L 9,245 L 9,245 L 9,245\n" - "M 33,255 L 26,253 L 18,254 L 25,256 L 18,258 L 27,260 L 18,263 L 27,265 L 19,267 L 29,270 L 21,272 L 29,276 L 21,278 L 30,281 L 22,283 L 31,287 L 24,288 L 32,292 L 23,293 L 34,298 L 26,299 L 37,303 L 32,305 L 39,309 L 33,309 L 39,314 L 34,314 L 40,318 L 34,317 L 40,321 L 34,321 L 41,326 L 33,326 L 40,330 L 33,332 L 39,333 L 33,337 L 42,337 L 54,341 L 49,337 L 52,335 L 47,330 L 50,330 L 45,325 L 49,325 L 45,321 L 48,321 L 45,316 L 46,306 L 45,286 L 43,274 L 36,261 L 33,255 L 33,255 L 33,255\n" - "M 7,358 L 9,351 L 14,351 L 17,359 L 11,364 L 7,358 L 7,358 L 7,358\n" - "M 44,354 L 49,351 L 52,355 L 49,361 L 44,354 L 44,354 L 44,354\n" - "M 32,357 L 37,353 L 40,358 L 36,361 L 32,357 L 32,357 L 32,357\n" - "M 139,334 L 145,330 L 154,330 L 158,334 L 154,341 L 152,348 L 145,350 L 149,340 L 147,336 L 141,339 L 139,345 L 136,342 L 136,339 L 139,334 L 139,334 L 139,334\n" - "M 208,259 L 215,259 L 212,255 L 220,259 L 224,263 L 225,274 L 224,283 L 220,292 L 208,300 L 206,308 L 203,304 L 199,315 L 197,309 L 195,318 L 193,313 L 190,322 L 190,316 L 185,325 L 182,318 L 180,325 L 172,321 L 178,320 L 176,313 L 186,312 L 180,307 L 188,307 L 184,303 L 191,302 L 186,299 L 195,294 L 187,290 L 197,288 L 192,286 L 201,283 L 194,280 L 203,277 L 198,275 L 207,271 L 200,269 L 209,265 L 204,265 L 212,262 L 208,259 L 208,259 L 208,259\n" - "M 106,126 L 106,131 L 109,132 L 111,134 L 115,132 L 115,135 L 119,133 L 118,137 L 123,137 L 128,137 L 133,134 L 136,130 L 136,127 L 132,124 L 118,128 L 112,128 L 106,126 L 106,126 L 106,126\n" - "M 107,114 L 101,110 L 98,102 L 105,97 L 111,98 L 119,102 L 121,108 L 118,112 L 113,115 L 107,114 L 107,114 L 107,114\n" - "M 148,106 L 145,110 L 146,116 L 150,118 L 152,111 L 151,107 L 148,106 L 148,106 L 148,106\n" - "M 80,55 L 70,52 L 75,58 L 63,57 L 72,61 L 57,61 L 67,66 L 57,67 L 62,69 L 54,71 L 61,73 L 54,77 L 63,78 L 53,85 L 60,84 L 56,90 L 69,84 L 63,82 L 75,76 L 70,75 L 77,72 L 72,71 L 78,69 L 72,66 L 81,67 L 78,64 L 82,63 L 80,60 L 86,62 L 80,55 L 80,55 L 80,55\n" - "M 87,56 L 91,52 L 96,50 L 102,56 L 98,56 L 92,60 L 87,56 L 87,56 L 87,56\n" - "M 85,68 L 89,73 L 98,76 L 106,74 L 96,73 L 91,70 L 85,68 L 85,68 L 85,68\n" - "M 115,57 L 114,64 L 111,64 L 115,75 L 122,81 L 122,74 L 126,79 L 126,74 L 131,78 L 130,72 L 133,77 L 131,68 L 126,61 L 119,57 L 115,57 L 115,57 L 115,57\n" - "M 145,48 L 143,53 L 147,59 L 151,59 L 150,55 L 145,48 L 145,48 L 145,48\n" - "M 26,22 L 34,15 L 43,10 L 52,10 L 59,16 L 47,15 L 32,22 L 26,22 L 26,22 L 26,22\n" - "M 160,19 L 152,26 L 149,34 L 154,33 L 152,30 L 157,30 L 155,26 L 158,27 L 157,23 L 161,23 L 160,19 L 160,19 L 160,19\n" - "000000\n" - "M 98,117 L 105,122 L 109,122 L 105,117 L 113,120 L 121,120 L 130,112 L 128,108 L 123,103 L 123,99 L 128,101 L 132,106 L 135,109 L 142,105 L 142,101 L 145,101 L 145,91 L 148,101 L 145,105 L 136,112 L 135,116 L 143,124 L 148,120 L 150,122 L 142,128 L 133,122 L 121,125 L 112,126 L 103,125 L 100,129 L 96,124 L 98,117 L 98,117 L 98,117\n" - "M 146,118 L 152,118 L 152,115 L 149,115 L 146,118 L 146,118 L 146,118\n" - "M 148,112 L 154,111 L 154,109 L 149,109 L 148,112 L 148,112 L 148,112\n" - "M 106,112 L 108,115 L 114,116 L 118,114 L 106,112 L 106,112 L 106,112\n" - "M 108,108 L 111,110 L 116,110 L 119,108 L 108,108 L 108,108 L 108,108\n" - "M 106,104 L 109,105 L 117,106 L 115,104 L 106,104 L 106,104 L 106,104\n" - "M 50,25 L 41,26 L 34,33 L 39,43 L 49,58 L 36,51 L 47,68 L 55,69 L 54,59 L 61,57 L 74,46 L 60,52 L 67,42 L 57,48 L 61,40 L 54,45 L 60,36 L 59,29 L 48,38 L 52,30 L 47,32 L 50,25 L 50,25 L 50,25\n" - "M 147,34 L 152,41 L 155,49 L 161,53 L 157,47 L 164,47 L 158,43 L 168,44 L 159,40 L 164,37 L 169,37 L 164,33 L 169,34 L 165,28 L 170,30 L 170,25 L 173,29 L 175,27 L 176,32 L 173,36 L 175,39 L 172,42 L 172,46 L 168,49 L 170,55 L 162,57 L 158,63 L 155,58 L 153,50 L 149,46 L 147,34 L 147,34 L 147,34\n" - "M 155,71 L 159,80 L 157,93 L 157,102 L 155,108 L 150,101 L 149,93 L 154,101 L 152,91 L 151,83 L 155,79 L 155,71 L 155,71 L 155,71\n" - "M 112,78 L 115,81 L 114,91 L 112,87 L 113,82 L 112,78 L 112,78 L 112,78\n" - "M 78,28 L 64,17 L 58,11 L 47,9 L 36,10 L 28,16 L 21,26 L 18,41 L 20,51 L 23,61 L 33,65 L 28,68 L 37,74 L 36,81 L 43,87 L 48,90 L 43,100 L 40,98 L 39,90 L 31,80 L 30,72 L 22,71 L 17,61 L 14,46 L 16,28 L 23,17 L 33,9 L 45,6 L 54,6 L 65,12 L 78,28 L 78,28 L 78,28\n" - "M 67,18 L 76,9 L 87,5 L 101,2 L 118,3 L 135,8 L 149,20 L 149,26 L 144,19 L 132,12 L 121,9 L 105,7 L 89,8 L 76,14 L 70,20 L 67,18 L 67,18 L 67,18\n" - "M 56,98 L 48,106 L 56,103 L 47,112 L 56,110 L 52,115 L 57,113 L 52,121 L 62,115 L 58,123 L 65,119 L 63,125 L 69,121 L 68,127 L 74,125 L 74,129 L 79,128 L 83,132 L 94,135 L 93,129 L 85,127 L 81,122 L 76,126 L 75,121 L 71,124 L 71,117 L 66,121 L 66,117 L 62,117 L 64,112 L 60,113 L 60,110 L 57,111 L 61,105 L 57,107 L 60,101 L 55,102 L 56,98 L 56,98 L 56,98\n" - "M 101,132 L 103,138 L 106,134 L 106,139 L 112,136 L 111,142 L 115,139 L 114,143 L 119,142 L 125,145 L 131,142 L 135,138 L 140,134 L 140,129 L 143,135 L 145,149 L 150,171 L 149,184 L 145,165 L 141,150 L 136,147 L 132,151 L 131,149 L 126,152 L 125,150 L 121,152 L 117,148 L 111,152 L 110,148 L 105,149 L 104,145 L 98,150 L 96,138 L 94,132 L 94,130 L 98,132 L 101,132 L 101,132 L 101,132\n" - "M 41,94 L 32,110 L 23,132 L 12,163 L 6,190 L 7,217 L 5,236 L 3,247 L 9,230 L 12,211 L 12,185 L 18,160 L 26,134 L 35,110 L 43,99 L 41,94 L 41,94 L 41,94\n" - "M 32,246 L 41,250 L 50,257 L 52,267 L 53,295 L 53,323 L 59,350 L 54,363 L 51,365 L 44,366 L 42,360 L 40,372 L 54,372 L 59,366 L 62,353 L 71,352 L 75,335 L 73,330 L 66,318 L 68,302 L 64,294 L 67,288 L 63,286 L 63,279 L 59,275 L 58,267 L 56,262 L 50,247 L 42,235 L 44,246 L 32,236 L 35,244 L 32,246 L 32,246 L 32,246\n" - "M 134,324 L 146,320 L 159,322 L 173,327 L 179,337 L 179,349 L 172,355 L 158,357 L 170,350 L 174,343 L 170,333 L 163,328 L 152,326 L 134,329 L 134,324 L 134,324 L 134,324\n" - "M 173,339 L 183,334 L 184,338 L 191,329 L 194,332 L 199,323 L 202,325 L 206,318 L 209,320 L 213,309 L 221,303 L 228,296 L 232,289 L 234,279 L 233,269 L 230,262 L 225,256 L 219,253 L 208,252 L 198,252 L 210,249 L 223,250 L 232,257 L 237,265 L 238,277 L 238,291 L 232,305 L 221,323 L 218,335 L 212,342 L 200,349 L 178,348 L 173,339 L 173,339 L 173,339\n" - "M 165,296 L 158,301 L 156,310 L 156,323 L 162,324 L 159,318 L 162,308 L 162,304 L 165,296 L 165,296 L 165,296\n" - "M 99,252 L 105,244 L 107,234 L 115,228 L 121,228 L 131,235 L 122,233 L 113,235 L 109,246 L 121,239 L 133,243 L 121,243 L 110,251 L 99,252 L 99,252 L 99,252\n" - "M 117,252 L 124,247 L 134,249 L 136,253 L 126,252 L 117,252 L 117,252 L 117,252\n" - "M 117,218 L 132,224 L 144,233 L 140,225 L 132,219 L 117,218 L 117,218 L 117,218\n" - "M 122,212 L 134,214 L 143,221 L 141,213 L 132,210 L 122,212 L 122,212 L 122,212\n" - "M 69,352 L 70,363 L 76,373 L 86,378 L 97,379 L 108,379 L 120,377 L 128,378 L 132,373 L 135,361 L 133,358 L 132,366 L 127,375 L 121,374 L 121,362 L 119,367 L 117,374 L 110,376 L 110,362 L 107,357 L 106,371 L 104,375 L 97,376 L 90,375 L 90,368 L 86,362 L 83,364 L 86,369 L 85,373 L 78,370 L 73,362 L 71,351 L 69,352 L 69,352 L 69,352\n" - "M 100,360 L 96,363 L 99,369 L 102,364 L 100,360 L 100,360 L 100,360\n" - "M 115,360 L 112,363 L 114,369 L 117,364 L 115,360 L 115,360 L 115,360\n" - "M 127,362 L 125,364 L 126,369 L 128,365 L 127,362 L 127,362 L 127,362\n" - "M 5,255 L 7,276 L 11,304 L 15,320 L 13,334 L 6,348 L 2,353 L 0,363 L 5,372 L 12,374 L 25,372 L 38,372 L 44,369 L 42,367 L 36,368 L 31,369 L 30,360 L 27,368 L 20,370 L 16,361 L 15,368 L 10,369 L 3,366 L 3,359 L 6,352 L 11,348 L 17,331 L 19,316 L 12,291 L 9,274 L 5,255 L 5,255 L 5,255\n" - "M 10,358 L 7,362 L 10,366 L 11,362 L 10,358 L 10,358 L 10,358\n" - "M 25,357 L 22,360 L 24,366 L 27,360 L 25,357 L 25,357 L 25,357\n" - "M 37,357 L 34,361 L 36,365 L 38,361 L 37,357 L 37,357 L 37,357\n" - "M 49,356 L 46,359 L 47,364 L 50,360 L 49,356 L 49,356 L 49,356\n" - "M 130,101 L 132,102 L 135,101 L 139,102 L 143,103 L 142,101 L 137,100 L 133,100 L 130,101 L 130,101 L 130,101\n" - "M 106,48 L 105,52 L 108,56 L 109,52 L 106,48 L 106,48 L 106,48\n" - "M 139,52 L 139,56 L 140,60 L 142,58 L 141,56 L 139,52 L 139,52 L 139,52\n" - "M 25,349 L 29,351 L 30,355 L 33,350 L 37,348 L 42,351 L 45,347 L 49,345 L 44,343 L 36,345 L 25,349 L 25,349 L 25,349\n" - "M 98,347 L 105,351 L 107,354 L 109,349 L 115,349 L 120,353 L 118,349 L 113,346 L 104,346 L 98,347 L 98,347 L 98,347\n" - "M 83,348 L 87,352 L 87,357 L 89,351 L 87,348 L 83,348 L 83,348 L 83,348\n" - "M 155,107 L 163,107 L 170,107 L 186,108 L 175,109 L 155,109 L 155,107 L 155,107 L 155,107\n" - "M 153,114 L 162,113 L 175,112 L 192,114 L 173,114 L 154,115 L 153,114 L 153,114 L 153,114\n" - "M 152,118 L 164,120 L 180,123 L 197,129 L 169,123 L 151,120 L 152,118 L 152,118 L 152,118\n" - "M 68,109 L 87,106 L 107,106 L 106,108 L 88,108 L 68,109 L 68,109 L 68,109\n" - "M 105,111 L 95,112 L 79,114 L 71,116 L 85,115 L 102,113 L 105,111 L 105,111 L 105,111\n" - "M 108,101 L 98,99 L 87,99 L 78,99 L 93,100 L 105,102 L 108,101 L 108,101 L 108,101\n" - "M 85,63 L 91,63 L 97,60 L 104,60 L 108,62 L 111,69 L 112,75 L 110,74 L 108,71 L 103,73 L 106,69 L 105,65 L 103,64 L 103,67 L 102,70 L 99,70 L 97,66 L 94,67 L 97,72 L 88,67 L 84,66 L 85,63 L 85,63 L 85,63\n" - "M 140,74 L 141,66 L 144,61 L 150,61 L 156,62 L 153,70 L 150,73 L 152,65 L 150,65 L 151,68 L 149,71 L 146,71 L 144,66 L 143,70 L 143,74 L 140,74 L 140,74 L 140,74\n" - "M 146,20 L 156,11 L 163,9 L 172,9 L 178,14 L 182,18 L 184,32 L 182,42 L 182,52 L 177,58 L 176,67 L 171,76 L 165,90 L 157,105 L 160,92 L 164,85 L 168,78 L 167,73 L 173,66 L 172,62 L 175,59 L 174,55 L 177,53 L 180,46 L 181,29 L 179,21 L 173,13 L 166,11 L 159,13 L 153,18 L 148,23 L 146,20 L 146,20 L 146,20\n" - "M 150,187 L 148,211 L 150,233 L 153,247 L 148,267 L 135,283 L 125,299 L 136,292 L 131,313 L 122,328 L 122,345 L 129,352 L 133,359 L 133,367 L 137,359 L 148,356 L 140,350 L 131,347 L 129,340 L 132,332 L 140,328 L 137,322 L 140,304 L 154,265 L 157,244 L 155,223 L 161,220 L 175,229 L 186,247 L 185,260 L 176,275 L 178,287 L 185,277 L 188,261 L 196,253 L 189,236 L 174,213 L 150,187 L 150,187 L 150,187\n" - "M 147,338 L 142,341 L 143,345 L 141,354 L 147,343 L 147,338 L 147,338 L 147,338\n" - "M 157,342 L 156,349 L 150,356 L 157,353 L 163,346 L 162,342 L 157,342 L 157,342 L 157,342\n" - "M 99,265 L 96,284 L 92,299 L 73,339 L 73,333 L 87,300 L 99,265 L 99,265 L 99,265\n"; - - -unsigned parse_lion(agg::path_storage& path, agg::rgba8* colors, unsigned* path_idx) { - // Parse the lion and then detect its bounding - // box and arrange polygons orientations (make all polygons - // oriented clockwise or counterclockwise) - - const char* ptr = g_lion; - unsigned npaths = 0; - - while (*ptr) { - if (*ptr != 'M' && isalnum(*ptr)) { - unsigned c = 0; - sscanf(ptr, "%x", &c); - - // New color. Every new color creates new path in the path object. - path.close_polygon(); - colors[npaths] = agg::rgb8_packed(c); - path_idx[npaths] = path.start_new_path(); - npaths++; - - while (*ptr && *ptr != '\n') - ptr++; - - if (*ptr == '\n') - ptr++; - } else { - double x = 0.0; - double y = 0.0; - - while (*ptr && *ptr != '\n') { - int c = *ptr; - - while (*ptr && !isdigit(*ptr)) - ptr++; - - x = atof(ptr); - - while (*ptr && isdigit(*ptr)) - ptr++; - - while (*ptr && !isdigit(*ptr)) - ptr++; - - y = atof(ptr); - - if (c == 'M') { - path.close_polygon(); - path.move_to(x, y); - } else { - path.line_to(x, y); - } - - while (*ptr && isdigit(*ptr)) - ptr++; - - while (*ptr && *ptr != '\n' && !isalpha(*ptr)) - ptr++; - } - - if (*ptr == '\n') - ptr++; - } - } - - path.arrange_orientations_all_paths(agg::path_flags_cw); - return npaths; -} - - - -//Copyright (c) 2002-2006 Maxim Shemanarev - diff --git a/uppdev/aggtest/main.cpp b/uppdev/aggtest/main.cpp deleted file mode 100644 index 12427f7f9..000000000 --- a/uppdev/aggtest/main.cpp +++ /dev/null @@ -1,47 +0,0 @@ -#include "aggtest.h" - -// this function is defined in lion.cpp, where's also the description of the lion -unsigned parse_lion(agg::path_storage& ps, agg::rgba8* colors, unsigned* path_idx); - -void AggTestCtrl::parse_lion() { - npaths = ::parse_lion(path, colors, path_idx); - agg::pod_array_adaptor pathidx(path_idx, 100); - agg::bounding_rect(path, pathidx, 0, npaths, &x1, &y1, &x2, &y2); - base_dx=(x2-x1); - base_dy=(y2-y1); -}; -AggTestCtrl::AggTestCtrl(): -pixf(rbuf),rb(pixf),r(rb), -x1(0),y1(0),x2(0),y2(0), -npaths(0),base_dx(0),base_dy(0),scale(1.0){ - SetPixFmt(agg::pix_format_bgr24); - parse_lion(); -}; -void AggTestCtrl::onDraw(Draw& dest){ - scale = 1; - rb.clear(agg::rgba8(255, 255, 255)); - for(int i = 0; i < 200; i++) { - RTIMING("Lion"); - agg::trans_affine mtx; - mtx *= agg::trans_affine_translation(-base_dx/2.0, -base_dy/2.0); - mtx *= agg::trans_affine_scaling(scale, scale); - mtx *= agg::trans_affine_translation(rbuf.width()/2, rbuf.height()/2); - agg::conv_transform trans(path, mtx); - agg::render_all_paths(rasterizer, sl, r, trans, colors, path_idx, npaths); - } -}; -void AggTestCtrl::onInit(){ -}; -void AggTestCtrl::onResize(int width,int height){ - scale=Upp::min(width/base_dx,height/base_dy); - rb.reset_clipping(true); -}; -aggtest::aggtest(){ - CtrlLayout(*this, "AggCtrl"); - SetMinSize(Size(16,16)); - Sizeable(); -}; - -GUI_APP_MAIN { - aggtest().Run(); -} diff --git a/uppdev/aggtest/src.tpp/tst$en-us.tpp b/uppdev/aggtest/src.tpp/tst$en-us.tpp deleted file mode 100644 index f676fa23b..000000000 --- a/uppdev/aggtest/src.tpp/tst$en-us.tpp +++ /dev/null @@ -1,3 +0,0 @@ -topic "u:upp.srcuppdev$.tppTest$en-us.tpp";[ $$0,0#00000000000000000000000000000000:Default] -[{_} -[s0;> u:upp.srcuppdev`$.tppTest`$en`-us.tpp] \ No newline at end of file diff --git a/uppdev/alloctest/alloctest.cpp b/uppdev/alloctest/alloctest.cpp deleted file mode 100644 index 0e7de6897..000000000 --- a/uppdev/alloctest/alloctest.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include - -using namespace Upp; - -CONSOLE_APP_MAIN -{ - -} - diff --git a/uppdev/alloctest/alloctest.upp b/uppdev/alloctest/alloctest.upp deleted file mode 100644 index f5b3b84eb..000000000 --- a/uppdev/alloctest/alloctest.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - Core; - -file - alloctest.cpp; - -mainconfig - "" = ""; - diff --git a/uppdev/alpha/beta/beta.h b/uppdev/alpha/beta/beta.h deleted file mode 100644 index d38b27456..000000000 --- a/uppdev/alpha/beta/beta.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef _beta_beta_h -#define _beta_beta_h - -#include - -#define LAYOUTFILE -#include - -#define IMAGEFILE -#include - -class beta : public WithbetaLayout { -public: - typedef beta CLASSNAME; - beta(); -}; - -#endif diff --git a/uppdev/alpha/beta/beta.iml b/uppdev/alpha/beta/beta.iml deleted file mode 100644 index e69de29bb..000000000 diff --git a/uppdev/alpha/beta/beta.lay b/uppdev/alpha/beta/beta.lay deleted file mode 100644 index a100a508d..000000000 --- a/uppdev/alpha/beta/beta.lay +++ /dev/null @@ -1,8 +0,0 @@ -#ifdef LAYOUTFILE - -LAYOUT(betaLayout, 200, 100) - ITEM(Button, ok, SetLabel("OK").RightPosZ(90, 80).BottomPosZ(4, 22)) - ITEM(Button, cancel, SetLabel("Cancel").RightPosZ(4, 80).BottomPosZ(4, 22)) -END_LAYOUT - -#endif diff --git a/uppdev/alpha/beta/beta.upp b/uppdev/alpha/beta/beta.upp deleted file mode 100644 index 5d9d379e7..000000000 --- a/uppdev/alpha/beta/beta.upp +++ /dev/null @@ -1,12 +0,0 @@ -uses - CtrlLib; - -file - beta.h, - main.cpp, - beta.lay, - beta.iml; - -mainconfig - "" = "GUI MT"; - diff --git a/uppdev/alpha/beta/init b/uppdev/alpha/beta/init deleted file mode 100644 index 009b657fe..000000000 --- a/uppdev/alpha/beta/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _alpha_beta_icpp_init_stub -#define _alpha_beta_icpp_init_stub -#include "CtrlLib/init" -#endif diff --git a/uppdev/alpha/beta/main.cpp b/uppdev/alpha/beta/main.cpp deleted file mode 100644 index fa67aff49..000000000 --- a/uppdev/alpha/beta/main.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "beta.h" - -#define IMAGEFILE -#include - -beta::beta() -{ - CtrlLayoutOKCancel(*this, "Window title"); -} - -GUI_APP_MAIN -{ - beta().Run(); -} diff --git a/uppdev/amd64/amd64.cpp b/uppdev/amd64/amd64.cpp deleted file mode 100644 index 5a3ee5066..000000000 --- a/uppdev/amd64/amd64.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include - -int main(int argc, const char *argv[]) -{ - for(int i = 0; i < 100; i++) { - printf("0x%llX\n", (long long)malloc(1000)); - printf("0x%llX\n", (long long)malloc(100000000)); - } -} diff --git a/uppdev/amd64/amd64.upp b/uppdev/amd64/amd64.upp deleted file mode 100644 index 6387215e7..000000000 --- a/uppdev/amd64/amd64.upp +++ /dev/null @@ -1,5 +0,0 @@ -file - amd64.cpp; - -mainconfig - "" = "ST"; diff --git a/uppdev/asmopt/asmopt.cpp b/uppdev/asmopt/asmopt.cpp deleted file mode 100644 index d791d4bae..000000000 --- a/uppdev/asmopt/asmopt.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include - -using namespace Upp; - -int Count(const Vector& v, const String& x); - -CONSOLE_APP_MAIN -{ - Vector x; - for(int i = 0; i < 1000; i++) - x.Add(AsString(Random(100))); - Cout() << Count(x, "50"); -} diff --git a/uppdev/asmopt/asmopt.upp b/uppdev/asmopt/asmopt.upp deleted file mode 100644 index 1c532c6a3..000000000 --- a/uppdev/asmopt/asmopt.upp +++ /dev/null @@ -1,12 +0,0 @@ -optimize_speed; - -uses - Core; - -file - asmopt2.cpp, - asmopt.cpp; - -mainconfig - "" = ""; - diff --git a/uppdev/asmopt/asmopt2.cpp b/uppdev/asmopt/asmopt2.cpp deleted file mode 100644 index cf717a24a..000000000 --- a/uppdev/asmopt/asmopt2.cpp +++ /dev/null @@ -1,133 +0,0 @@ -#include - -using namespace Upp; - -int Count(const Vector& v, const String& x) -{ - int count = 0; - for(int i = 0; i < v.GetCount(); i++) - if(v[i] == x) - count++; - return count; -} - -004025A0 push r14 -004025A2 xor r14d,r14d -004025A5 push r13 -004025A7 push r12 -004025A9 push rbp -004025AA mov rbp,rdi -004025AD push rbx -004025AE mov eax,dword ptr [rdi+0x8] -004025B1 mov rbx,rsi -004025B4 test eax,eax -004025B6 jle 0x402611 -004025B8 xor r13d,r13d -004025BB xor r12d,r12d -004025BE jmp 0x4025EC - -004025C0 mov rax,Qword ptr [rbx] -004025C3 mov rdx,Qword ptr [rbx+0x8] -004025C7 xor rax,Qword ptr [rdi] -004025CA xor rdx,Qword ptr [rdi+0x8] -004025CE or rax,rdx -004025D1 sete al -004025D4 movzx eax,al -004025D7 cmp eax,0x1 -004025DA sbb r14d,0xFFFFFFFF -004025DE add r13d,0x1 -004025E2 add r12,0x10 -004025E6 cmp dword ptr [rbp+0x8],r13d -004025EA jle 0x402611 -004025EC mov rdi,r12 -004025EF add rdi,Qword ptr [rbp+0x0] -004025F3 movsx eax,byte ptr [rbx+0xE] -004025F7 movsx edx,byte ptr [rdi+0xE] -004025FB or edx,eax -004025FD je 0x4025C0 - -004025FF mov rsi,rbx -00402602 call Upp::String0::LEqual(Upp::String0 const&) const -00402607 test eax,eax -00402609 sete al -0040260C movzx eax,al -0040260F jmp 0x4025D7 - -0040261C mov eax,r14d -0040261F pop rbx -00402620 pop rbp -00402621 pop r12 -00402623 pop r13 -00402625 pop r14 -00402627 ret - -*/ - -For your pleasure, I have tried a little exercise to demonstrate my point. Consider this routine:

- -int Count(const Vector& v, const String& x) {

- int count = 0;

- for(int i = 0; i < v.GetCount(); i++)

- if(v[i] == x)

- count++;

- return count;

-}

- - -This involves high level objects, implemented at library level, Vector and String. There are 3 semantic calls .GetCount, Vector::operator[] and String::operator==. - -It gets compiled into this piece of code: - - -004025A0 push r14
-004025A2 xor r14d,r14d
-004025A5 push r13
-004025A7 push r12
-004025A9 push rbp
-004025AA mov rbp,rdi
-004025AD push rbx
-004025AE mov eax,dword ptr [rdi+0x8]
-004025B1 mov rbx,rsi
-004025B4 test eax,eax
-004025B6 jle 0x402611
-004025B8 xor r13d,r13d
-004025BB xor r12d,r12d
-004025BE jmp 0x4025EC
- -004025C0 mov rax,Qword ptr [rbx]
-004025C3 mov rdx,Qword ptr [rbx+0x8]
-004025C7 xor rax,Qword ptr [rdi]
-004025CA xor rdx,Qword ptr [rdi+0x8]
-004025CE or rax,rdx
-004025D1 sete al
-004025D4 movzx eax,al
-004025D7 cmp eax,0x1
-004025DA sbb r14d,0xFFFFFFFF
-004025DE add r13d,0x1
-004025E2 add r12,0x10
-004025E6 cmp dword ptr [rbp+0x8],r13d
-004025EA jle 0x402611
-004025EC mov rdi,r12
-004025EF add rdi,Qword ptr [rbp+0x0]
-004025F3 movsx eax,byte ptr [rbx+0xE]
-004025F7 movsx edx,byte ptr [rdi+0xE]
-004025FB or edx,eax
-004025FD je 0x4025C0
- -004025FF mov rsi,rbx
-00402602 call Upp::String0::LEqual(Upp::String0 const&) const
-00402607 test eax,eax
-00402609 sete al
-0040260C movzx eax,al
-0040260F jmp 0x4025D7
- -0040261C mov eax,r14d
-0040261F pop rbx
-00402620 pop rbp
-00402621 pop r12
-00402623 pop r13
-00402625 pop r14
-00402627 ret
-
- -Now the fast path of loop gets compressed into opcodes at the range 004025C0 to 004025FD - 64 bytes total. GetCount gets completely out of loop, operator[] is reordered to direct pointer increments (at 4025E2) and unless slow-path is necessarry (004025FF - 0040260F), there are no calls at all. (Note: slow-path is invoked is Strings do not satisfy SSO). diff --git a/uppdev/asmopt/init b/uppdev/asmopt/init deleted file mode 100644 index 50a4dc316..000000000 --- a/uppdev/asmopt/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _asmopt_icpp_init_stub -#define _asmopt_icpp_init_stub -#include "Core/init" -#endif diff --git a/uppdev/ataxx/ataxx.h b/uppdev/ataxx/ataxx.h deleted file mode 100644 index 099de832f..000000000 --- a/uppdev/ataxx/ataxx.h +++ /dev/null @@ -1,68 +0,0 @@ -#ifndef _ataxx_attax_h_ -#define _ataxx_attax_h_ - -#include - -#define LAYOUTFILE -#include - - -long willekeur (int max); -bool oneven (int getal); -void spelerwissel (int & speler); - -struct zet { - // datastructuur om een zet te beschrijven - int speler; // speler die de zet doet - int xbron; // x coordinaat van het virus waarmee gespeeld wordt - int ybron; // y coordinaat van het virus waarmee gespeeld wordt - int xdoel; // x coordinaat van het voelvakje - int ydoel; // y coordinaat van het voelvakje - int aantal; // hulpvariabele: getelde aantal mogelijke zetten - // (om te kunnen communiceren tussen functies) -}; - -class ataxxbord { - // klasse die het ataxx speelbord en acties daarop omschrijft -public: - struct zet randomzet (int speler); // bedenk een willekeurige zet - struct zet strategiezet (int speler); // bedenk een slimme zet - struct zet allezetten (int speler, int maxzet); // doorloopt alle zetten - bool toegestanezet (zet test); // controleer of een zet toegestaan is - void doezet (zet doen); // voert een zet uit - void beginstand(); // initialiseer de beginstand - void omwisselen(); // wisselt rood en blauw om (valsspelen) - int telvirussen (int speler); // telt aantal virussen van een speler - bool bestaanmogelijkezetten (int speler); // kan speler nog zetten? - ataxxbord (int aantalkolommen, int aantalrijen); // constructor - ~ataxxbord(); // destructor - int ** veld; // pointer naar twee-dimensionale dynamische array - // die het speelveld bevat: 0 = leeg veld, - // 1 = bezet door speler 1, 2 = bezet door speler 2 - int maxkolom; // breedte - int maxrij; // hoogte -}; - -struct linkedlist { - // beschrijft een linked list voor ataxx speelborden - ataxxbord * stelling; // het ataxx bord - linkedlist * vorige; // eerder bord - linkedlist * volgende; // volgend bord - linkedlist(); // standaard constructor - linkedlist (int kolommen, int rijen); // constructor (overloaded) - ~linkedlist(); // destructor -}; - -class stapel { - // de stapel bestaat uit een linked list van ataxx bordobjecten - // en een aantal functies om borden toe te voegen of weg te halen -public: - void zetopstapel (const ataxxbord * bord); // voeg een bord toe - void haallaatstevanstapel(); // verwijder het laatste bord - bool isstapelleeg(); // test of de stapel leeg is - linkedlist * lijst; // de lijst met borden - stapel(); // constructor - ~stapel(); // destructor -}; - -#endif diff --git a/uppdev/ataxx/ataxx.upp b/uppdev/ataxx/ataxx.upp deleted file mode 100644 index 0c46472c9..000000000 --- a/uppdev/ataxx/ataxx.upp +++ /dev/null @@ -1,15 +0,0 @@ -uses - CtrlLib, - RichText; - -file - ataxx.h, - hulpfuncties.cpp, - bord.cpp, - stapel.cpp, - main.cpp, - bordselectie.lay, - icon.iml; - -mainconfig - "" = "GUI"; diff --git a/uppdev/ataxx/bord.cpp b/uppdev/ataxx/bord.cpp deleted file mode 100644 index 686f4efda..000000000 --- a/uppdev/ataxx/bord.cpp +++ /dev/null @@ -1,277 +0,0 @@ -#include "ataxx.h" - -// bord.cpp - -ataxxbord::ataxxbord (int aantalkolommen, int aantalrijen) { - // constructor - int i; // hulpvariabele voor iteratie - maxkolom = aantalkolommen; // onthoud maxkolom als afmeting - maxrij = aantalrijen; // onthoud maxrij als afmeting - // dynamische array maken - veld = new int * [maxkolom]; - for (i=0;i maxkolom-1 || test.ydoel > maxrij-1 ) return false; - if ( test.xdoel < 0 || test.ydoel < 0 ) return false; - - // test 2: staat er op het bronveld wel een eigen virus? - if ( veld[test.xbron][test.ybron] != test.speler ) return false; - - // test 3: is het doelvak wel vrij? - if ( veld[test.xdoel][test.ydoel] != 0 ) return false; - - // test 4: afstand bron-doel moet 1 of 2 vakjes zijn, maar niet groter - dx = test.xdoel - test.xbron; - dy = test.ydoel - test.ybron; - // absolute waarden van maken - if ( dx < 0 ) dx *= -1; - if ( dy < 0 ) dy *= -1; - if ( dx > 2 || dy > 2 ) return false; - - // als alle tests doorstaan zijn, is de zet toegestaan - return true; -} - -void ataxxbord::doezet (zet doen) { - // voer een zet uit - - int dx,dy,afstand; // afstanden over x en y die een zet doet - - // nieuwe veld vullen met virus (zowel bij clonatie als verplaatsing) - veld[doen.xdoel][doen.ydoel] = doen.speler; - - // aangrenzende (vijandige) virussen overnemen - for ( dx=doen.xdoel-1; dx<=doen.xdoel+1; dx++ ) { - for ( dy=doen.ydoel-1; dy<=doen.ydoel+1; dy++ ) { - if ( dx>=0 && dy>=0 && dx 0 ) veld[dx][dy] = doen.speler; - } - } - } - - // voor het effect is het van belang of het gaat om een verplaatsing - // of een clonering - // verplaatsingen gaan over afstand 2, clonaties over afstand 1 - // bepaald delta(x) en delta(y) - dx = doen.xdoel - doen.xbron; - dy = doen.ydoel - doen.ybron; - if ( dx < 0 ) dx *= -1; - if ( dy < 0 ) dy *= -1; - // bepaal nu de afstand - if ( dx >= dy ) afstand = dx; - else afstand = dy; - // bij verplaatsing oude veld legen - if ( afstand==2 ) veld[doen.xbron][doen.ybron] = 0; -} - -int ataxxbord::telvirussen (int speler) { - // telt het aantal virussen voor een speler - - int x,y; // hulpvariabelen voor iteraties door veld - int aantal=0; // aantal gevonden virussen - - for (x=0;x0) return true; - else return false; -} - -zet ataxxbord::allezetten (int speler, int maxzet) { - // doorloopt alle mogelijke zetten, en geeft de laatste zet terug of - // de de "maxzet"-ste zet (als maxzet==0 dan de laatste zet) - - int x,y; // hulpvariabelen voor iteraties door veld - int dx,dy; // afstanden over x en y die een zet doet - int aantal=0; // aantal gevonden mogelijke zetten - zet test; // testzet (struct) - zet mogenlijkezet; // onthoud de beste mogelijke zet (struct) - - // initialiseren mogenlijkezet; mocht er geen mogenlijke zet - // gevonden worden, dan wordt toch deze "lege" zet teruggegeven - // om een compiler warning te voorkomen - mogenlijkezet.speler = speler; - mogenlijkezet.xbron = 0; - mogenlijkezet.ybron = 0; - mogenlijkezet.xdoel = 0; - mogenlijkezet.ydoel = 0; - mogenlijkezet.aantal = 0; - - // kijk nu voor alle virussen van de speler wat er mogelijk is - for (x=0;x maxscore ) { - maxscore = score; - maxzet = i; - } - // herstel het juiste bord - for (x=0;x 0 ) return true; - else return false; -} - -void spelerwissel (int & speler) { - // wisselen van speler 1 en 2 - if (speler==1) speler=2; - else speler=1; -} diff --git a/uppdev/ataxx/icon.ico b/uppdev/ataxx/icon.ico deleted file mode 100644 index 4012786aa..000000000 Binary files a/uppdev/ataxx/icon.ico and /dev/null differ diff --git a/uppdev/ataxx/icon.iml b/uppdev/ataxx/icon.iml deleted file mode 100644 index 4d736d22f..000000000 --- a/uppdev/ataxx/icon.iml +++ /dev/null @@ -1,18 +0,0 @@ -IMAGE_BEGIN(pdf) - IMAGE_SCAN("") - IMAGE_SCAN("˄\0\0\377") - IMAGE_SCAN("˄\0\0\377") - IMAGE_SCAN("˄\0\0\377") - IMAGE_SCAN("˄\0\0\377") - IMAGE_SCAN("\0\0\377") - IMAGE_SCAN("\0\0\377") - IMAGE_SCAN("\0\0\377") - IMAGE_SCAN("\0\0\377") - IMAGE_SCAN("") - IMAGE_SCAN("") - IMAGE_SCAN("\0\0\0Ä\0\0\0") - IMAGE_SCAN("\0\0\0Ä\0\0\0") - IMAGE_SCAN("\0\0\0Ä\0\0\0") - IMAGE_SCAN("\0\0\0Ä\0\0\0") - IMAGE_SCAN("") -IMAGE_PACKED(pdf, "\2\20\0\0\0\20\0\0\0\0\0\0\0\377\377\377\377\0\0\0\0") diff --git a/uppdev/ataxx/main.cpp b/uppdev/ataxx/main.cpp deleted file mode 100644 index 152d8f223..000000000 --- a/uppdev/ataxx/main.cpp +++ /dev/null @@ -1,530 +0,0 @@ -/* - Evert Mouw - emouw@liacs.nl - S 0332291 - Programmeermethoden - 4e programmeeropdracht, ATAXX - 2006-12-06 -*/ - -#include "ataxx.h" - -//#include // om pseudorandom getallen te krijgen dmv cosinus - -// globals om te kunnen gebruiken in alle (modal) forms -int kolommen, rijen; // invoer grootte speelbord - -struct MyAppWindow : TopWindow { - // spelgegevens - int speler; // aan de beurt; speler 1 begint altijd - bool slim; // random zetten of slimme zetten? - ataxxbord * bord; // class ataxxbord - stapel geheugen; // om stellingen te onthouden - zet invoer; // ingevoerde zet (struct) - bool invoerstatus; // 1e klik (false) of 2e klik (true) - bool invoermogelijk; // na einde spel op false zetten - // GUI - String bordtekst; - MenuBar menu; - StatusBar status; - int vakjegrootte; - int virusgrootte; - int lijndikte; - bool bordwissel; - int oplichtx; - int oplichty; - typedef MyAppWindow CLASSNAME; - void BordInit(); // startvariabelen vullen - void Nieuw(); // code om nieuw spel te starten - void ZetTerug(); - void Omwisselen(); - void ComputerZet(); - void ToonLegaleZetten(); - void VerbergLegaleZetten(); - void OplichtenUit(); - void Evalueer(); - void Stoppen(); - void Bordgrootte(); - void SpelerKeuze1(); - void SpelerKeuze2(); - void SpeelstijlRandom(); - void SpeelstijlSlim(); - void Spelregels(); - void Informatie(); - void MainMenu(Bar& bar); - void SubMenu1(Bar& bar); - void SubMenu2(Bar& bar); - void SubMenu2b(Bar& bar); - void SubMenu2c(Bar& bar); - void SubMenu3(Bar& bar); - virtual void Paint(Draw& w); - virtual void RightDown(Point, dword flags); - virtual void LeftDown(Point p, dword flags); - MyAppWindow(); // constructor - ~MyAppWindow(); // destructor -}; - -class bordselectie : public WithDlgLayout { -public: - typedef bordselectie CLASSNAME; - bordselectie(int xdefault, int ydefault); - void vullen(int xdefault, int ydefault); - void annuleren(); - void OK(); -}; - -void MyAppWindow::BordInit() { - vakjegrootte = 50; - lijndikte = 2; - virusgrootte = 40; - kolommen = 7; - rijen = 7; - speler = 1; - bordwissel = true; - invoerstatus = false; - invoermogelijk = true; - slim = false; - bordtekst = ""; - oplichtx = -1; - oplichty = -1; - // maak een nieuw ataxxbord object - bord = new ataxxbord (kolommen,rijen); -} - -void MyAppWindow::Nieuw() { - // code om nieuw spel te starten - bord->beginstand(); - while ( geheugen.lijst->stelling != NULL ) { - geheugen.haallaatstevanstapel(); - } - invoermogelijk = true; - bordtekst = ""; - VerbergLegaleZetten(); - oplichtx = -1; - oplichty = -1; - Refresh(); -} - -void MyAppWindow::ZetTerug() { - // stelling terughalen vanuit het geheugen - int x,y; - if ( geheugen.lijst->stelling != NULL ) { - for (x=0;xveld[x][y] = - geheugen.lijst->stelling->veld[x][y]; - } - } - geheugen.haallaatstevanstapel(); - } - else PromptOK("Kan niet verder terug."); - invoerstatus = false; - invoermogelijk = true; - bordtekst = ""; - VerbergLegaleZetten(); - oplichtx = -1; - oplichty = -1; - Refresh(); -} - -void MyAppWindow::Stoppen() { - Break(); -} - -void MyAppWindow::Bordgrootte() { - int hulpx = kolommen; - int hulpy = rijen; - bordselectie invoerraam(kolommen,rijen); - invoerraam.Run(true); - if (hulpx != kolommen || hulpy != rijen ) { - while ( geheugen.lijst->stelling != NULL ) { - geheugen.haallaatstevanstapel(); - } - delete bord; - bord = new ataxxbord (kolommen,rijen); - bordwissel = true; - Nieuw(); - } -} - -void MyAppWindow::SpelerKeuze1() { - speler = 1; - Nieuw(); -} - -void MyAppWindow::SpelerKeuze2() { - speler = 2; - Nieuw(); -} - -void MyAppWindow::SpeelstijlRandom() { - slim = false; - Refresh(); -} - -void MyAppWindow::SpeelstijlSlim() { - slim = true; - Refresh(); -} - -void MyAppWindow::Spelregels() { - String regels; - regels = ""; - regels += "[*A3 spelregels]"; - regels += "&[A2 Een virus kan 1 stap doen (cloneren) of]"; - regels += "&[A2 twee stappen doen (verlaatsen) in iedere]"; - regels += "&[A2 willekeurige richting, behalve naar vakjes]"; - regels += "&[A2 die al bezet zijn. Bij elke clonatie of]"; - regels += "&[A2 verplaatsing komen de aangrenzende]"; - regels += "&[A2 virussen van de vijand in eigen bezit.]"; - PromptOK(regels); -} - -void MyAppWindow::Informatie() { - String regels; - regels = ""; - regels += "[A4 ATAXX]"; - regels += "&[A3* Evert Mouw]"; - regels += "&[A3 S0332291]"; - regels += "&[A2/ emouw@liacs.nl]"; - regels += "&[A2 2006-12-06]"; - PromptOK(regels); -} - -void MyAppWindow::MainMenu(Bar& bar) { - bar.Add("Spel", THISBACK(SubMenu1)); - bar.Add("Instellingen", THISBACK(SubMenu2)); - bar.Add("Hulp", THISBACK(SubMenu3)); -} - -void MyAppWindow::SubMenu1(Bar& bar) { - bar.Add("Nieuw", THISBACK(Nieuw)); - bar.Add("ZetTerug", THISBACK(ZetTerug)); - bar.Add("Omwisselen", THISBACK(Omwisselen)); - bar.Add("Stoppen", THISBACK(Stoppen)); -} - -void MyAppWindow::SubMenu2(Bar& bar) { - bar.Add("Bordgrootte", THISBACK(Bordgrootte)); - bar.Add("Spelerkeuze", THISBACK(SubMenu2b)); - bar.Add("Speelstijl", THISBACK(SubMenu2c)); -} - -void MyAppWindow::SubMenu3(Bar& bar) { - bar.Add("Spelregels", THISBACK(Spelregels)); - bar.Add("Informatie", THISBACK(Informatie)); -} - -void MyAppWindow::SubMenu2b(Bar& bar) { - // sub van Spelerkeuze - bar.Add("Speler 1 (blauw)", THISBACK(SpelerKeuze1)); - bar.Add("Speler 2 (rood)", THISBACK(SpelerKeuze2)); -} - -void MyAppWindow::SubMenu2c(Bar& bar) { - // sub van Speelstijl - bar.Add("Willekeurig", THISBACK(SpeelstijlRandom)); - bar.Add("Slim", THISBACK(SpeelstijlSlim)); -} - -void MyAppWindow::Paint(Draw& w) { - int x,y; - int startx,starty; - String statusregel; - Point centrumpunt; - int raambreedte, raamhoogte; - int centreerx, centreery; - int vijand; - - if (speler==1) vijand=2; - else vijand=1; - - w.DrawRect(GetSize(), Black); // hele achtergrond zwart - // alle virussen tonen - for (x=0;xveld[x][y]==9 ) - w.DrawEllipse(startx, starty, virusgrootte, virusgrootte, LtYellow(), 2, Gray); - if ( bord->veld[x][y]==8 ) - w.DrawEllipse(startx, starty, virusgrootte, virusgrootte, Yellow(), 2, Gray); - if ( bord->veld[x][y]==1 ) - w.DrawEllipse(startx, starty, virusgrootte, virusgrootte, LtBlue(), 2, Gray); - if ( bord->veld[x][y]==2 ) - w.DrawEllipse(startx, starty, virusgrootte, virusgrootte, LtRed(), 2, Gray); - } - } - // geselecteerde kandidaatvirus laten opvallen - if ( invoerstatus && bord->veld[invoer.xbron][invoer.ybron]==speler ) { - startx = invoer.xbron * vakjegrootte; - starty = invoer.ybron * vakjegrootte; - startx += (vakjegrootte-(virusgrootte/2)-lijndikte)/2; - starty += (vakjegrootte-(virusgrootte/2)-lijndikte)/2; - w.DrawEllipse(startx, starty, virusgrootte/2, virusgrootte/2, Yellow()); - } - // laatst gezette computervirus ander kleurtje geven - if ( oplichtx > -1 && oplichty > -1 ) { - startx = oplichtx * vakjegrootte; - starty = oplichty * vakjegrootte; - startx += (vakjegrootte-virusgrootte-lijndikte)/2; - starty += (vakjegrootte-virusgrootte-lijndikte)/2; - if (speler==1) - w.DrawEllipse(startx, starty, virusgrootte, virusgrootte, LtMagenta(), 2, Gray); - if (speler==2) - w.DrawEllipse(startx, starty, virusgrootte, virusgrootte, LtCyan(), 2, Gray); - } - w.DrawText(vakjegrootte, (rijen-1)*(vakjegrootte), 400, bordtekst, Roman(24).Underline().Bold(), Red); - // statusregel - status.Height(20); - // statusregel menselijke speler - statusregel = ""; - //statusregel += "Speler " + Format("%i",speler) + " "; - if (speler==1) statusregel += "blauw"; - else statusregel += "rood"; - statusregel += " ("; - statusregel += "mens"; - statusregel += ") "; - statusregel += "[" + Format("%i",bord->telvirussen(speler)) + "]"; - statusregel += " <--> "; - // statusregel computerspeler - //statusregel += "Speler " + Format("%i",vijand) + " "; - if (vijand==1) statusregel += "blauw"; - else statusregel += "rood"; - statusregel += " ("; - if (slim) statusregel += "slim"; - else statusregel += "willekeurig"; - statusregel += ") "; - statusregel += "[" + Format("%i",bord->telvirussen(vijand)) + "]"; - status = statusregel; - // stel grootte en positie van hoofdraam in (indien 1e start of verandering grootte bord) - if (bordwissel) { - raambreedte = vakjegrootte*kolommen; - raamhoogte = vakjegrootte*rijen + 40; - // bereken het midden van het scherm - centrumpunt = GetWorkArea().CenterPoint(); - centreerx = centrumpunt.x-(int)(.5*raambreedte); - centreery = centrumpunt.y-(int)(.5*raamhoogte); - // SetRect(centreerx, centreery, raambreedte, raamhoogte); - bordwissel = false; - } -} - -void MyAppWindow::RightDown(Point, dword flags) { - // menu ook via rechtermuisknop - MenuBar::Execute(THISBACK(MainMenu)); -} - -void MyAppWindow::LeftDown(Point p, dword flags) { - int x = -1; - int y = -1; - int i; - if ( ! invoermogelijk ) return; - for (i=0;ii*vakjegrootte && p.x < i*vakjegrootte+vakjegrootte ) - x = i; - } - for (i=0;ii*vakjegrootte && p.y < i*vakjegrootte+vakjegrootte ) - y = i; - } - if ( x>-1 && y>-1 ) { - if (invoerstatus) { - // 2e klik - VerbergLegaleZetten(); - invoer.xdoel = x; - invoer.ydoel = y; - invoer.speler = speler; - if (bord->toegestanezet(invoer)) { - geheugen.zetopstapel (bord); - bord->doezet(invoer); - spelerwissel (speler); - ComputerZet(); - } - invoerstatus = false; // weer nieuwe zetinvoer mogelijk maken - } - else { - // 1e klik - invoer.xbron = x; - invoer.ybron = y; - invoer.speler = speler; - ToonLegaleZetten(); - invoerstatus = true; - } - Refresh(); - } -} - -void MyAppWindow::ComputerZet() { - // laat de computer spelen als die aan de beurt is - if ( bord->telvirussen(speler) > 0 && bord->bestaanmogelijkezetten(speler) ) { - if (slim) invoer = bord->strategiezet(speler); - else invoer = bord->randomzet(speler); - if ( bord->toegestanezet(invoer) ) { - bord->doezet (invoer); - // vertraging in het weergeven van de computerzet - oplichtx = invoer.xdoel; - oplichty = invoer.ydoel; - SetTimeCallback(1500, THISBACK(OplichtenUit)); - } - } - spelerwissel (speler); - Evalueer(); -} - -void MyAppWindow::OplichtenUit() { - // het veld even van kleur laten veranderen - uitzetten - oplichtx = -1; - oplichty = -1; - Refresh(); -} - -void MyAppWindow::Omwisselen() { - bord->omwisselen(); - Refresh(); -} - -void MyAppWindow::Evalueer() { - bool kanspeler = false; - bool kanvijand = false; - bool eindespel = false; - int vijand; - - if (speler==1) vijand=2; - else vijand=1; - - // testen op mogelijkheid tot doen van een zet - if ( bord->telvirussen(speler) > 0 && bord->bestaanmogelijkezetten(speler) ) { - kanspeler = true; - } - if ( bord->telvirussen(vijand) > 0 && bord->bestaanmogelijkezetten(vijand) ) { - kanvijand = true; - } - if ( kanspeler==false && kanvijand==false ) eindespel = true; - - // testen op het hebben van virussen - if ( bord->telvirussen(speler) == 0 ) eindespel = true; - if ( bord->telvirussen(vijand) == 0 ) eindespel = true; - - if (eindespel) { - if ( bord->telvirussen(speler) > bord->telvirussen(vijand) ) { - PromptOK ("U heeft gewonnen!!!"); - bordtekst = "gewonnen"; - } - if ( bord->telvirussen(speler) < bord->telvirussen(vijand) ) { - PromptOK ("U heeft verloren..."); - bordtekst = "verloren"; - } - if ( bord->telvirussen(speler) == bord->telvirussen(vijand) ) { - PromptOK ("Gelijk spel."); - bordtekst = "gelijk spel"; - } - invoermogelijk = false; - } - - // computer speelt opnieuw als speler niet kan - if ( bord->telvirussen(speler) > 0 && kanspeler==false && kanvijand==true) { - spelerwissel (speler); - ComputerZet(); - } -} - -void MyAppWindow::ToonLegaleZetten() { - int dx,dy; // afstanden over x en y die een zet doet - int dxtest, dytest; - int afstand; - zet test; - test.speler = invoer.speler; - test.xbron = invoer.xbron; - test.ybron = invoer.ybron; - for (dx=-2;dx<=2;dx++) { - for (dy=-2;dy<=2;dy++) { - test.xdoel = test.xbron + dx; - test.ydoel = test.ybron + dy; - if ( bord->toegestanezet(test) ) { - // verplaatsingen gaan over afstand 2, clonaties over afstand 1 - // bepaald delta(x) en delta(y) - dxtest = dx; - dytest = dy; - if ( dxtest < 0 ) dxtest *= -1; - if ( dytest < 0 ) dytest *= -1; - // bepaal nu de afstand - if ( dxtest >= dytest ) afstand = dxtest; - else afstand = dytest; - // kleur in door bordwaarde op 8 / 9 te zetten - if (afstand==1) - bord->veld[test.xdoel][test.ydoel] = 8; - if (afstand==2) - bord->veld[test.xdoel][test.ydoel] = 9; - } - } - } -} - -void MyAppWindow::VerbergLegaleZetten() { - int x,y; // hulpvariabelen voor iteraties door veld - for (x=0;xveld[x][y] == 8 ) bord->veld[x][y] = 0; - if ( bord->veld[x][y] == 9 ) bord->veld[x][y] = 0; - } - } -} - -MyAppWindow::MyAppWindow() { - BordInit(); - Title("ataxx").MinimizeBox(); - AddFrame(menu); - menu.Set(THISBACK(MainMenu)); - AddFrame(status); -} - -MyAppWindow::~MyAppWindow() { - // destructor - delete bord; -} - -GUI_APP_MAIN { - MyAppWindow ataxx; - ataxx.Run(); -} - -bordselectie::bordselectie(int xdefault, int ydefault) { - CtrlLayout(*this, ""); - vullen(xdefault, ydefault); - Bannuleren <<= THISBACK(annuleren); - BOK <<= THISBACK(OK); -} - -void bordselectie::vullen(int xdefault, int ydefault) { - int i; - int k; - for (i=5;i<30;i++) { - if ( oneven(i) ) { - x.Add(i,Format("%i",i)); - y.Add(i,Format("%i",i)); - } - } - // standaard waarde op huidige bordgrootte zetten - // x - k = x.FindKey(xdefault); - if (k==-1) PromptOK("kolommen niet gevonden"); - x.SetIndex(k); - // y - k = y.FindKey(ydefault); - if (k==-1) PromptOK("rijen niet gevonden"); - y.SetIndex(k); -} - -void bordselectie::annuleren() { - Break(); -} - -void bordselectie::OK() { - kolommen = x.GetData(); - rijen = y.GetData(); - Break(); -} diff --git a/uppdev/ataxx/stapel.cpp b/uppdev/ataxx/stapel.cpp deleted file mode 100644 index a951359ba..000000000 --- a/uppdev/ataxx/stapel.cpp +++ /dev/null @@ -1,73 +0,0 @@ -#include "ataxx.h" -// stapel.cpp - -linkedlist::linkedlist() { - // standaard constructor - vorige = NULL; - volgende = NULL; - stelling = NULL; -} - -linkedlist::linkedlist (int kolommen, int rijen) { - // constructor (overloaded) - vorige = NULL; - volgende = NULL; - stelling = new ataxxbord (kolommen, rijen); -} - -linkedlist::~linkedlist() { - // destructor - delete stelling; -} - -stapel::stapel() { - // constructor - lijst = new linkedlist; -} - -stapel::~stapel() { - // destructor - delete lijst; -} - -void stapel::zetopstapel (const ataxxbord * bord) { - // zet een bordstelling op de stapel - - int x,y; // hulpvariabelen om door het veld te itereren - linkedlist * hulp; // hulpvariabele - - // voeg het bord toe aan de linked list - hulp = lijst; - lijst = new linkedlist (bord->maxkolom, bord->maxrij); - hulp->volgende = lijst; - lijst->vorige = hulp; - // en vul ook de velden goed in - // (dat gebeurt automatisch want het is een dynamische array) - for (x=0;xmaxkolom;x++) { - for (y=0;ymaxrij;y++) { - lijst->stelling->veld[x][y] = bord->veld[x][y]; - } - } -} - -void stapel::haallaatstevanstapel() { - // haal het laatste element (bord/stelling) van de stapel - - linkedlist * hulp; // hulpvariabele - - // alleen als de pointers naar echte objecten verwijzen - // ook daadwerkelijk tot het verwijderen overgaan - if ( lijst != NULL ) { - if ( lijst->vorige != NULL ) { - hulp = lijst->vorige; - delete lijst; - lijst = hulp; - } - } -} - -bool stapel::isstapelleeg() { - // test of een stapel leeg is - if ( lijst == NULL ) return true; - else return false; -} diff --git a/uppdev/benchsin/benchsin.cpp b/uppdev/benchsin/benchsin.cpp deleted file mode 100644 index 62aeb4600..000000000 --- a/uppdev/benchsin/benchsin.cpp +++ /dev/null @@ -1,40 +0,0 @@ -#include - -using namespace Upp; - -CONSOLE_APP_MAIN -{ - double h = 0; - { - RTIMING("sin"); - for(double x = 0; x < 1000000; x += 0.1) - h += sin(x); - } - { - RTIMING("asin"); - for(double x = 0; x < 1000000; x += 0.1) - h += asin(x); - } - { - RTIMING("acos"); - for(double x = 0; x < 1000000; x += 0.1) - h += acos(x); - } - { - RTIMING("add"); - for(double x = 0; x < 1000000; x += 0.1) - h += x; - } - { - RTIMING("mul"); - for(double x = 0; x < 1000000; x += 0.1) - h *= x; - } - { - RTIMING("sqrt"); - for(double x = 0; x < 1000000; x += 0.1) - h += sqrt(x); - } - RDUMP(h); -} - diff --git a/uppdev/benchsin/benchsin.upp b/uppdev/benchsin/benchsin.upp deleted file mode 100644 index cfc1ebca8..000000000 --- a/uppdev/benchsin/benchsin.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - Core; - -file - benchsin.cpp; - -mainconfig - "" = ""; - diff --git a/uppdev/benchsin/init b/uppdev/benchsin/init deleted file mode 100644 index 6c9f451ec..000000000 --- a/uppdev/benchsin/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _benchsin_icpp_init_stub -#define _benchsin_icpp_init_stub -#include "Core/init" -#endif diff --git a/uppdev/bible/bible.cpp b/uppdev/bible/bible.cpp deleted file mode 100644 index dbd459e4a..000000000 --- a/uppdev/bible/bible.cpp +++ /dev/null @@ -1,87 +0,0 @@ -#include - -#include -#include -#include -#include -#include -#include - -using namespace Upp; -using namespace std; - -#ifdef PLATFORM_POSIX -#define DIR "/home/cxl/" -#else -#define DIR "c:/" -#endif - -void StdSortBible() -{ - vector buf; - string linBuf; - { RTIMING("InStd"); - ifstream inFile(DIR "bible.txt"); - buf.reserve(50000); - while(getline(inFile,linBuf)) buf.insert(buf.end(), linBuf); - } - { RTIMING("SortStd"); - sort(buf.begin(), buf.end()); - } - { RTIMING("OutStd"); - ofstream outFile(DIR "output1.txt"); - copy(buf.begin(),buf.end(),ostream_iterator(outFile,"\n")); - } -} - -void StdSortBible2() -{ - multiset buf; - string linBuf; - ifstream inFile(DIR "bible.txt"); - while(getline(inFile,linBuf)) - buf.insert(linBuf); - ofstream outFile("output.txt"); - copy(buf.begin(),buf.end(),ostream_iterator(outFile,"\n")); -} - -void UppSortBible() -{ - Vector v; - { RTIMING("InUpp"); - FileIn in(DIR "bible.txt"); - { - while(!in.IsEof()) - v.Add(in.GetLine()); - } - } - { RTIMING("SortUpp"); - Sort(v); - } - { RTIMING("OutUpp"); - FileOut out(DIR "output2.txt"); - for(int i = 0; i < v.GetCount(); i++) { - { - out << v[i]; - } - { out << "\r\n"; } - } - } -} - -CONSOLE_APP_MAIN -{ - { - RTIMING("std"); - StdSortBible(); - } - { - RTIMING("std multiset"); - StdSortBible2(); - } - { - RTIMING("upp"); - UppSortBible(); - } - ASSERT(LoadFile(DIR "output.txt") == LoadFile(DIR "output2.txt")); -} diff --git a/uppdev/bible/bible.upp b/uppdev/bible/bible.upp deleted file mode 100644 index 651f5b69e..000000000 --- a/uppdev/bible/bible.upp +++ /dev/null @@ -1,10 +0,0 @@ -uses - Core; - -file - bible.cpp optimize_speed, - times.txt; - -mainconfig - "" = "USEMALLOC", - "" = ""; diff --git a/uppdev/bible/init b/uppdev/bible/init deleted file mode 100644 index a7faf8450..000000000 --- a/uppdev/bible/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _bible_icpp_init_stub -#define _bible_icpp_init_stub -#include "Core/init" -#endif diff --git a/uppdev/bible/times.txt b/uppdev/bible/times.txt deleted file mode 100644 index 808bb0858..000000000 --- a/uppdev/bible/times.txt +++ /dev/null @@ -1,23 +0,0 @@ -* c:\out\MSC71cdb\bible.exe 04.04.2008 18:29:28, user: Luzr - -TIMING OutUpp : 27.0 ms - 27.0 ms ( 27.0 ms / 1 ), min: 27.0 ms, max: 27.0 ms, nesting: 1 - 1 -TIMING SortUpp : 24.0 ms - 24.0 ms ( 24.0 ms / 1 ), min: 24.0 ms, max: 24.0 ms, nesting: 1 - 1 -TIMING InUpp : 18.0 ms - 18.0 ms ( 18.0 ms / 1 ), min: 18.0 ms, max: 18.0 ms, nesting: 1 - 1 -TIMING upp : 71.0 ms - 71.0 ms ( 71.0 ms / 1 ), min: 71.0 ms, max: 71.0 ms, nesting: 1 - 1 -TIMING std multiset : 329.0 ms - 329.0 ms (329.0 ms / 1 ), min: 329.0 ms, max: 329.0 ms, nesting: 1 - 1 -TIMING OutStd : 87.0 ms - 87.0 ms ( 87.0 ms / 1 ), min: 87.0 ms, max: 87.0 ms, nesting: 1 - 1 -TIMING SortStd : 72.0 ms - 72.0 ms ( 72.0 ms / 1 ), min: 72.0 ms, max: 72.0 ms, nesting: 1 - 1 -TIMING InStd : 199.0 ms - 199.0 ms (199.0 ms / 1 ), min: 199.0 ms, max: 199.0 ms, nesting: 1 - 1 -TIMING std : 361.0 ms - 361.0 ms (361.0 ms / 1 ), min: 361.0 ms, max: 361.0 ms, nesting: 1 - 1 - -* /home/cxl/upp/out/GCC.Debug_full.Release/bible 05.04.2008 05:25:50, user: cxl - -TIMING OutUpp : 17.0 ms - 17.0 ms ( 17.0 ms / 1 ), min: 17.0 ms, max: 17.0 ms, nesting: 1 - 1 -TIMING SortUpp : 31.0 ms - 31.0 ms ( 31.0 ms / 1 ), min: 31.0 ms, max: 31.0 ms, nesting: 1 - 1 -TIMING InUpp : 16.0 ms - 16.0 ms ( 16.0 ms / 1 ), min: 16.0 ms, max: 16.0 ms, nesting: 1 - 1 -TIMING upp : 66.0 ms - 66.0 ms ( 66.0 ms / 1 ), min: 66.0 ms, max: 66.0 ms, nesting: 1 - 1 -TIMING std multiset : 80.0 ms - 80.0 ms ( 80.0 ms / 1 ), min: 80.0 ms, max: 80.0 ms, nesting: 1 - 1 -TIMING OutStd : 20.0 ms - 20.0 ms ( 20.0 ms / 1 ), min: 20.0 ms, max: 20.0 ms, nesting: 1 - 1 -TIMING SortStd : 47.0 ms - 47.0 ms ( 47.0 ms / 1 ), min: 47.0 ms, max: 47.0 ms, nesting: 1 - 1 -TIMING InStd : 19.0 ms - 19.0 ms ( 19.0 ms / 1 ), min: 19.0 ms, max: 19.0 ms, nesting: 1 - 1 -TIMING std : 91.0 ms - 91.0 ms ( 91.0 ms / 1 ), min: 91.0 ms, max: 91.0 ms, nesting: 1 - 1 diff --git a/uppdev/bigmailer/bigmailer.cpp b/uppdev/bigmailer/bigmailer.cpp deleted file mode 100644 index de6d24d9c..000000000 --- a/uppdev/bigmailer/bigmailer.cpp +++ /dev/null @@ -1,276 +0,0 @@ -#include - - -GUI_APP_MAIN -{ - bigmailer mainWin ; - mainWin.Run(); -} - -bigmailer *bigmailer::mailer = NULL ; - -bigmailer::bigmailer() -{ - mailer = this ; - - AddFrame(mainMenu) ; - Add(tab.SizePos()) ; - - Sizeable().MaximizeBox() ; - - //CtrlLayout(*this ) ; - CtrlLayout(dataPage) ; - - //AddFrame(mainMenu) ;// mail addressees - mainMenu.Add( t_("Addressees"), THISBACK( mnuMailAddr ) ) ; - mainMenu.Add( t_("Messages"), THISBACK( mnuMsg ) ) ; - mainMenu.Add( t_("Send"), THISBACK( mnuSend ) ) ; - mainMenu.Add( t_("?"), THISBACK( mnuHelp ) ) ; - - theCfg.Load() ; // cargamos la configuración - - //tab.Add(listDefinitionPage.SizePos(), t_("List definition") ) ; - - tab.Add(dataPage.SizePos(), t_("Mail Addresses") ) ; - dataPage.btEditFields.WhenAction = THISBACK(DataPageEditFields) ; - //dataPage.btSave.WhenAction = THISBACK(DataPageSave) ; - dataPage.edListName.WhenAction = THISBACK(DataPageTheGridModification) ; - dataPage.btSaveData.WhenAction = THISBACK(DataPageSave) ; - dataPage.theGrid.WhenModification = THISBACK(DataPageTheGridModification); - dataPage.theGrid.Absolute() ; - dataPage.theGrid.Inserting().Removing().Appending().Absolute() - .EditCell().SelectRow(true).ShowRows(true) ; - - - dataPage.btCSV.WhenAction = THISBACK(DataPageImportCSV) ; - dataPage.opErr.WhenAction = THISBACK(DataPageFill) ; - - tab.Add(messagePage.SizePos(), t_("Message's body") ) ; - //tab.WhenSet = THISBACK(onTabSet); - tab.WhenAction = THISBACK(onTabSet); - - lastTabIndex = -1 ; - onStart() ; -} -void bigmailer::onStart() -{ - onCloseList() ; - if (theCfg.lastList.IsEmpty()) - onNewList() ; - else - theDefList.Load(theCfg.lastList) ; - - if (theCfg.lastMsg.IsEmpty()) - onNewMsg() ; - else - messagePage.Load(theCfg.lastMsg) ; - - SetTitle() ; -} -void bigmailer::mnuMailAddr( Bar &bar ) -{ - bar.Add(t_("New"), THISBACK( onNewList) ) ; - bar.Add(t_("Open"), THISBACK( onOpenList) ) ; - bar.Add(t_("Close"), THISBACK( onCloseList) ).Enable(theDefList.IsActive()) ; - bar.MenuSeparator() ; - bar.Add(t_("Print List"), THISBACK( onPrintList) ).Enable(theDefList.IsActive()) ; - bar.MenuSeparator() ; - bar.Add(t_("Exit"), THISBACK( onExit) ) ; -} -void bigmailer::mnuMsg( Bar &bar ) -{ - bar.Add(t_("New"), THISBACK( onNewMsg) ) ; - bar.Add(t_("Open"), THISBACK( onOpenMsg) ) ; - bar.Add(t_("Close"), THISBACK( onCloseMsg) ) ; - bar.MenuSeparator() ; - bar.Add(t_("Print"), THISBACK( onPrintMsg) ) ; -} -void bigmailer::mnuSend( Bar &bar ) -{ - bar.Add(t_("Send big mail"), THISBACK( onSend ) ) ; -} -void bigmailer::mnuHelp( Bar &bar ) -{ - bar.Add(t_("Preferences"), THISBACK( onPreferences )) ; - bar.Add(t_("About..."), THISBACK( onAbout) ) ; -} - -void bigmailer::SetTitle() -{ - String s = t_("The Big Mailer") ; - if ( theDefList.IsActive() ) - { - s << " [ " << theDefList.name << " ]" ; - dataPage.Enable(true) ; - DataPageFill() ; - } - else - { - dataPage.theGrid.Reset() ; - dataPage.Enable(false) ; - } - - if ( ! messagePage.filename.IsEmpty() ) - { - s << " [" << messagePage.filename << " ]" ; - } - tab.GetItem(1).Enable( ! messagePage.filename.IsEmpty() ) ; - - // de momento el tab del cuerpo del mensaje está inactivo - //tab.GetItem(1).Disable() ; messagePage.Show(false) ; - - Title( s ) ; -} - -void bigmailer::onPrintList() -{ -} -void bigmailer::onExit() -{ - onCloseList() ; - onCloseMsg() ; - Close() ; -} - - -void bigmailer::onAbout() -{ - - PromptOK( - "[A5 The Big Emailer]&" - "Copyleft Nicolás Mesas Plaza&&" - "Released under the GPL license version 2 o higther&" - "[^bigmailer.sourceforge.net^ bigmailer.sourceforge.net]" - "]" - ) ; - - -} - -void bigmailer::onTabSet() -{ - if (tab.Get() != lastTabIndex) - { - switch(lastTabIndex) - { - case 0: - DataPageSave() ; - break ; - case 1: - messagePage.Save() ; - break ; - } - - lastTabIndex = tab.Get() ; - switch(lastTabIndex) - { - case 0: - DataPageFill() ; - break ; - case 1: - messagePage.FillFields() ; - break ; - } - } - -} - -void bigmailer::DataPageFill() -{ - dataPage.edListName.SetData(theDefList.name) ; - dataPage.theGrid.Reset() ; - - if (dataPage.opErr.GetData() == false) - { - for (int col = 0; col < theDefList.fields.GetCount(); col++) - dataPage.theGrid.AddColumn(theDefList.fields[col],150).Edit(dataPage_theEdits[col]) ; - //dataPage.theGrid.AddRow( theDefList.data.GetCount() ) ; - for (int row = 0; row < theDefList.data.GetCount(); row++) - { - Vector &d = theDefList.data[row] ; - for (int col = 0; col < d.GetCount(); col++) - { - dataPage.theGrid.Set(row, col, d[col]) ; - } - } - if (dataPage.theGrid.GetColumnCount() > 4) - dataPage.theGrid.Absolute() ; - else - dataPage.theGrid.Proportional() ; - - if (theDefList.data.GetCount() == 0) - dataPage.theGrid.Append() ; - } - else - { - dataPage.theGrid.AddColumn("NAME", 150) ; - dataPage.theGrid.AddColumn("EMAIL", 150) ; - dataPage.theGrid.AddColumn("ERROR MESSAGE",500).Edit(dataPage_editError) ; - //dataPage.theGrid.AddRow(theDefList.data.GetCount()) ; - for (int row = 0; row < theDefList.data.GetCount(); row++) - { - dataPage.theGrid.Set(row, 0, theDefList.data[row][0]) ; - dataPage.theGrid.Set(row, 1, theDefList.data[row][1]) ; - if ( row < theDefList.errors.GetCount() ) - dataPage.theGrid.Set(row, 2, theDefList.errors[row]) ; - } - dataPage.theGrid.Absolute() ; - } - - - dataPage.theGrid.ClearModify() ; - dataPage.edListName.ClearModify() ; - - dataPage.btSaveData.Enable(false) ; - - theCfg.lastList = theDefList.path ; - theCfg.Save() ; -} -void bigmailer::DataPageSave() -{ - if ( dataPage.theGrid.IsModified() || dataPage.edListName.IsModified()) - { - theDefList.name = ~dataPage.edListName ; - dataPage.edListName.ClearModify() ; - - if (dataPage.opErr.GetData() == false) - { - theDefList.data.Clear() ; - for (int row = 0; row < dataPage.theGrid.GetCount(); row++) - { - Vector &v = theDefList.data.Add() ; - for (int col = 0; col < theDefList.fields.GetCount(); col++) - { - v.Add( dataPage.theGrid.Get(row, col) ) ; - } - } - } - else - { - theDefList.errors.Clear() ; - for (int row = 0; row < dataPage.theGrid.GetCount(); row++) - theDefList.errors.Add(dataPage.theGrid.Get(row, 2)) ; - } - - if (theDefList.path.IsEmpty()) - { - FileSel fs; - fs.ActiveDir(ConfigFile("")) ; - fs.Type("list files", "*.list") ; - fs.file.SetData(theDefList.name) ; - - if ( ! fs.ExecuteSelectDir(t_("select a folder to save") ) ) - return; - - theDefList.path = fs.Get() ; - } - - theDefList.Save() ; - dataPage.theGrid.ClearModify() ; - } - dataPage.btSaveData.Enable(false) ; -} -void bigmailer::DataPageTheGridModification() -{ - dataPage.btSaveData.Enable(true) ; -} diff --git a/uppdev/bigmailer/bigmailer.h b/uppdev/bigmailer/bigmailer.h deleted file mode 100644 index 40db43013..000000000 --- a/uppdev/bigmailer/bigmailer.h +++ /dev/null @@ -1,82 +0,0 @@ -#ifndef _bigmailer_bigmailer_h -#define _bigmailer_bigmailer_h - -#include -#include -//#include -#include -#include - -#define LAYOUTFILE -#include - -#include - - -// Configuración -class cfgDlg : public WithCfgLayout { -public: - - typedef cfgDlg CLASSNAME; - - cfgDlg(); - virtual ~cfgDlg(); - - void onBtOK() ; - -}; - -class bigmailer : public TopWindow { //public WithBigMailerLayout { - MenuBar mainMenu ; - TabCtrl tab ; - - //MenuBar mainMenu ; - void mnuMailAddr( Bar &bar ) ; - void mnuMsg( Bar &bar ) ; - void mnuSend( Bar &bar ) ; - void mnuHelp( Bar &bar ) ; - - - void onNewList() ; - void onOpenList() ; - void onCloseList() ; - void onPrintList() ; - void onExit() ; - - void onNewMsg() ; void onStart() ; - void onOpenMsg() ; - void onCloseMsg() ; - void onPrintMsg() ; - - void onSend() ; - - void onPreferences() ; - void onAbout() ; - - int lastTabIndex ; - void onTabSet() ; - - - // Páginas - WithListDataLayout dataPage ; - EditString dataPage_theEdits[30], dataPage_editError ; - void DataPageFill() ; - void DataPageSave() ; - void DataPageTheGridModification() ; - void DataPageEditFields() ; - void DataPageImportCSV() ; - - MessageEditor messagePage ; - - - - static bigmailer *mailer ; -public: - static bigmailer& Mailer() { return *mailer ; } - void SetTitle() ; - - typedef bigmailer CLASSNAME; - bigmailer(); -}; - -#endif diff --git a/uppdev/bigmailer/bigmailer.lay b/uppdev/bigmailer/bigmailer.lay deleted file mode 100644 index 7767d5bd0..000000000 --- a/uppdev/bigmailer/bigmailer.lay +++ /dev/null @@ -1,57 +0,0 @@ -LAYOUT(CfgLayout, 276, 328) - ITEM(DocEdit, edBlackList, SetFrame(BlackFrame()).LeftPosZ(4, 268).BottomPosZ(28, 184)) - ITEM(Button, btOK, SetLabel(t_("OK")).LeftPosZ(200, 70).BottomPosZ(5, 19)) - ITEM(Label, dv___2, SetLabel(t_("Black List (don't send to mails in this list) (one per line)")).SetFont(StdFont(10)).LeftPosZ(4, 268).BottomPosZ(215, 17)) - ITEM(LabelBox, dv___3, SetLabel(t_(" smtp server config ")).LeftPosZ(4, 268).TopPosZ(0, 92)) - ITEM(Label, dv___4, SetLabel(t_("smtp server:")).LeftPosZ(8, 68).TopPosZ(14, 16)) - ITEM(EditString, edServer, SetFrame(BlackFrame()).LeftPosZ(80, 188).TopPosZ(12, 20)) - ITEM(Label, dv___6, SetLabel(t_("user:")).LeftPosZ(8, 68).TopPosZ(40, 16)) - ITEM(EditString, edUser, SetFrame(BlackFrame()).LeftPosZ(80, 188).TopPosZ(38, 20)) - ITEM(Label, dv___8, SetLabel(t_("password:")).LeftPosZ(8, 68).TopPosZ(64, 16)) - ITEM(EditString, edPass, SetFrame(BlackFrame()).LeftPosZ(80, 188).TopPosZ(62, 20)) -END_LAYOUT - -LAYOUT(ListDataLayout, 540, 260) - ITEM(Button, btEditFields, SetLabel(t_("Edit Fields")).RightPosZ(78, 70).TopPosZ(4, 19)) - ITEM(Button, btCSV, SetLabel(t_("\aImport CSV")).RightPosZ(150, 66).TopPosZ(4, 19)) - ITEM(Button, btSaveData, SetLabel(t_("Save")).RightPosZ(10, 66).TopPosZ(4, 19)) - ITEM(GridCtrl, theGrid, HSizePosZ(4, 8).VSizePosZ(28, 5)) - ITEM(EditString, edListName, SetFrame(FieldFrame()).HSizePosZ(72, 292).TopPosZ(4, 17)) - ITEM(Label, dv___5, SetLabel(t_("List name:")).LeftPosZ(4, 64).TopPosZ(4, 17)) - ITEM(Option, opErr, SetLabel(t_("View Errors")).RightPosZ(218, 70).TopPosZ(4, 19)) -END_LAYOUT - -LAYOUT(MessageLayout, 452, 248) - ITEM(Label, dv___0, SetLabel(t_("From:")).LeftPosZ(4, 34).TopPosZ(4, 17)) - ITEM(Label, dv___1, SetLabel(t_("Subject:")).LeftPosZ(140, 44).TopPosZ(4, 17)) - ITEM(ToolBar, toolbar, HSizePosZ(0, 0).TopPosZ(28, 28)) - ITEM(EditString, edFrom, SetFrame(FieldFrame()).LeftPosZ(40, 96).TopPosZ(4, 17)) - ITEM(EditString, edSubject, SetFrame(FieldFrame()).HSizePosZ(188, 76).TopPosZ(4, 17)) - ITEM(RichEdit, editor, HSizePosZ(0, 0).VSizePosZ(56, 0)) - ITEM(Button, btSave, SetLabel(t_("Save")).RightPosZ(2, 70).TopPosZ(4, 19)) -END_LAYOUT - -LAYOUT(DataListDefinition, 288, 220) - ITEM(EditString, edListName, SetFrame(BottomSeparatorFrame()).LeftPosZ(108, 176).TopPosZ(12, 17)) - ITEM(Label, dv___1, SetLabel(t_("List name:")).LeftPosZ(8, 96).TopPosZ(12, 17)) - ITEM(GridCtrl, grid, LeftPosZ(8, 164).TopPosZ(32, 180)) - ITEM(Button, btSave, SetLabel(t_("Save")).RightPosZ(14, 70).BottomPosZ(5, 19)) - ITEM(Button, btCancel, SetLabel(t_("Cancel")).RightPosZ(14, 70).BottomPosZ(29, 19)) - ITEM(RichTextCtrl, labelInfo, LeftPosZ(176, 108).TopPosZ(32, 132)) -END_LAYOUT - -LAYOUT(SendLayout, 380, 100) - ITEM(ProgressIndicator, prog, HSizePosZ(12, 12).BottomPosZ(37, 15)) - ITEM(StaticText, labelInfo, SetAlign(ALIGN_CENTER).LeftPosZ(12, 352).TopPosZ(24, 16)) - ITEM(Button, btOk, SetLabel(t_("OK")).HCenterPosZ(70, -35).TopPosZ(72, 19)) - ITEM(Button, btCancel, SetLabel(t_("Cancel")).HCenterPosZ(70, 37).TopPosZ(72, 19)) -END_LAYOUT - -LAYOUT(csvToDefLayout, 236, 72) - ITEM(Label, dv___0, SetLabel(t_("Field name:")).HSizePosZ(8, 140).TopPosZ(4, 16)) - ITEM(DropList, dropName, LeftPosZ(96, 136).TopPosZ(4, 16)) - ITEM(Label, dv___2, SetLabel(t_("Field email:")).HSizePosZ(8, 140).TopPosZ(24, 16)) - ITEM(DropList, dropEmail, LeftPosZ(96, 136).TopPosZ(24, 16)) - ITEM(Button, btCancel, SetLabel(t_("Cancel")).LeftPosZ(88, 70).TopPosZ(48, 19)) - ITEM(Button, btOk, SetLabel(t_("Ok")).LeftPosZ(160, 70).TopPosZ(48, 19)) -END_LAYOUT diff --git a/uppdev/bigmailer/bigmailer.upp b/uppdev/bigmailer/bigmailer.upp deleted file mode 100644 index 4a9d6d09d..000000000 --- a/uppdev/bigmailer/bigmailer.upp +++ /dev/null @@ -1,26 +0,0 @@ -uses - CtrlLib, - GridCtrl, - RichEdit, - Web, - sTools; - -file - cfgDlg.cpp, - cfg.h, - cfg.cpp, - bigmailer.h, - bigmailer.cpp, - bigmailer.lay, - listDefinition.cpp, - messages.h, - messages.cpp, - smtpEx.cpp, - smtpEx.h, - send.cpp, - csvImport.h, - csvImport.cpp, - csvImport.lay; - -mainconfig - "" = "GUI MT"; diff --git a/uppdev/bigmailer/cfg.cpp b/uppdev/bigmailer/cfg.cpp deleted file mode 100644 index a6316e727..000000000 --- a/uppdev/bigmailer/cfg.cpp +++ /dev/null @@ -1,186 +0,0 @@ -#include -#include -#include -#include "csvImport.h" - -// la configuración -bigMailerCfg theCfg ; // la configuración global - -static int myFilter( int c ) -{ - if (c == '\r' || c == '\n') - return c ; - return 0 ; -} - -void bigMailerCfg::Save() -{ - const String enter = "\r\n" ; - String s = "lastList=" + lastList + enter + - "lastMsg=" + lastMsg + enter + - "smtpServer=" + smtpServer + enter + - "user=" + user + enter + - "pass=" + pass + enter ; - - for (int i = 0; i < blackList.GetCount(); i++) - s << "blacklist_" << i << "=" << blackList[i] << enter ; - - SaveFile(ConfigFile("bigmailer.ini"), s ) ; - -} -void bigMailerCfg::Load() -{ - VectorMap ini = LoadIniFile(ConfigFile("bigmailer.ini")) ; - lastList = ini.Get("lastList", "") ; - lastMsg = ini.Get("lastMsg", "" ) ; - smtpServer = ini.Get("smtpServer", "" ) ; - user = ini.Get("user", "" ) ; - pass = ini.Get("pass", "" ) ; - - - - String s ; - blackList.Clear() ; - for (int i = 0; true; i++) - { - s = ini.Get("blacklist_" + AsString(i), Null) ; - if (s.IsEmpty()) - break ; - blackList.Add(s) ; - } - -} -// definición de la lista ---------------------------------------------------------------------- -// La lista global ----- -defList theDefList ; - -defList::defList() -{ - Clear() ; -} -void defList::Clear() -{ - path = "" ; - name = "" ; - fields.Clear() ; - data.Clear() ; -} -void defList::Load(String filePath) -{ - Clear() ; - - path = filePath ; - name = GetFileTitle(path) ; - VectorMap ini = LoadIniFile(path) ; - fields = Split(ini.Get("fields", ""), ',' ) ; - - CSVParser csv ; - for( int i=0; true; i++) - { - String s = ini.Get("data_" + AsString(i), "") ; - if (s.IsEmpty()) - break ; - - data.Add(csv.ParseLine(s, fields.GetCount()) ) ; - } - - for (int i=0; true; i++) - { - String s = ini.Get("error_" + AsString(i), "") ; - if (s.IsEmpty()) - break ; - errors.Add(s) ; - } - - - // guardamos este como último cargado - theCfg.lastList = path ; - theCfg.Save() ; - -} -void defList::Save() -{ - if (path.IsEmpty()) - { - path = ConfigFile(name + ".list") ; - } - else if ( name != GetFileTitle(path)) - { - path = GetFileDirectory(path) + name + ".list" ; - } - String s ; - s << "name=" << name << "\r\n" - << "fields=" ; - for (int i = 0; i < fields.GetCount(); i++) - s << fields[i] << "," ; - s << "\r\n" ; - for (int i = 0; i < data.GetCount(); i++) - { - s << "data_" << i << "=" ; - Vector&line = data[i] ; - for (int j = 0; j < line.GetCount(); j++) - { - if (j > 0) - s << "," ; - s << "\"" << line[j] << "\"" ; - } - s << "\r\n" ; - } - for (int i = 0; i < errors.GetCount(); i++) - s << "error_" << i << "=" << errors[i] << "\r\n" ; - - - SaveFile(path, s) ; -} -// ------------------------------------------------------------------------------ -defMsg theMsg ; - -void defMsg::Load( String filePath ) -{ - - Clear() ; - - path = filePath ; - name = GetFileTitle(path) ; - VectorMap ini = LoadIniFile(path) ; - from = ini.Get("from") ; - subject = ini.Get("subject") ; - - String s ; - for (int i = 0; true; i++) - { - s = ini.Get("body" + AsString(i), "") ; - if (s.IsEmpty()) - break ; - qtfBody += s + "\r\n" ; - } - - // guardamos este como último cargado - theCfg.lastMsg = path ; - theCfg.Save() ; - -} -void defMsg::Save() -{ - if (path.IsEmpty()) - { - path = ConfigFile(name + ".msg") ; - } - else if ( name != GetFileTitle(path)) - { - path = GetFileDirectory(path) + name + ".msg" ; - } - String f ; - f << "from=" << from << "\r\n" - << "subject="<< subject << "\r\n" ; - - Vector lines = String2VectorString(qtfBody) ; - for (int i = 0; i < lines.GetCount(); i++) - f << "body" << i << "=" << lines[i] << "\r\n" ; - - SaveFile(path, f) ; -} -void defMsg::Clear() -{ - name = from = subject = qtfBody= "" ; -} diff --git a/uppdev/bigmailer/cfg.h b/uppdev/bigmailer/cfg.h deleted file mode 100644 index d0292030a..000000000 --- a/uppdev/bigmailer/cfg.h +++ /dev/null @@ -1,54 +0,0 @@ -#ifndef _cfg_h_ -#define _cfg_h_ -// configuración-------------------------------- -struct bigMailerCfg -{ - String lastList, lastMsg ; - - String smtpServer, user, pass ; // smtp config - - Vector blackList ; - //String dnsServers ; - //String blackList ; - - void Save() ; - void Load() ; -} ; -extern bigMailerCfg theCfg ; - -// definición de una lista ------------------------- -struct defList -{ - String path ; - String name ; - Vector fields ; - - //Vector data ; // cada row es un string separado por comas - Vector< Vector< String > > data ; - Vector< String > errors ; // one line to each data, contains the errors from the last transmision - - defList() ; - void Load(String filePath) ; - void Save() ; - void Clear() ; - bool IsActive() const { return ! name.IsEmpty() ; } -} ; -extern defList theDefList ; - -struct defMsg -{ - String name ; // name of msg - String path ; // file path - - String from ; - String subject ; - String qtfBody ; - - defMsg() { Clear() ; } - void Load( String filePath ) ; - void Save() ; - void Clear() ; - bool IsActive() const { return ! name.IsEmpty() ; } -} ; -extern defMsg theMsg ; -#endif diff --git a/uppdev/bigmailer/cfgDlg.cpp b/uppdev/bigmailer/cfgDlg.cpp deleted file mode 100644 index ca16635b9..000000000 --- a/uppdev/bigmailer/cfgDlg.cpp +++ /dev/null @@ -1,43 +0,0 @@ -#include -#include - - -void bigmailer::onPreferences() -{ - cfgDlg c ; - c.Execute() ; -} - - - -cfgDlg::cfgDlg() -{ - CtrlLayout(*this, t_("Preferences") ); - btOK.WhenAction = THISBACK(onBtOK) ; - - edServer.SetData( theCfg.smtpServer ) ; - edUser.SetData( theCfg.user ) ; - edPass.SetData( theCfg.pass ) ; - - edBlackList.SetData( VectorString2String(theCfg.blackList) ) ; - - -} -cfgDlg::~cfgDlg() -{ -} - -void cfgDlg::onBtOK() -{ - theCfg.smtpServer = ~edServer ; - theCfg.user = ~edUser ; - theCfg.pass = ~edPass ; - - theCfg.blackList = String2VectorString(~edBlackList) ; - theCfg.Save() ; - - Close() ; -} - -/* -*/ diff --git a/uppdev/bigmailer/csvDlg.lay b/uppdev/bigmailer/csvDlg.lay deleted file mode 100644 index cb04dc7e2..000000000 --- a/uppdev/bigmailer/csvDlg.lay +++ /dev/null @@ -1,9 +0,0 @@ -LAYOUT(CSVLayout, 368, 228) - ITEM(DropList, dropCharSet, LeftPosZ(100, 116).TopPosZ(8, 20)) - ITEM(DropList, dropSeparator, LeftPosZ(100, 116).TopPosZ(32, 20)) - ITEM(GridCtrl, gridData, HSizePosZ(4, 4).VSizePosZ(60, 4)) - ITEM(Button, btOk, SetLabel(t_("Ok")).LeftPosZ(288, 70).TopPosZ(8, 19)) - ITEM(Button, btCancel, SetLabel(t_("Cancel")).LeftPosZ(288, 70).TopPosZ(32, 19)) - ITEM(Label, dv___5, SetLabel(t_("Character set:")).LeftPosZ(4, 92).TopPosZ(11, 13)) - ITEM(Label, dv___6, SetLabel(t_("Separator:")).LeftPosZ(4, 92).TopPosZ(36, 13)) -END_LAYOUT diff --git a/uppdev/bigmailer/csvImport.cpp b/uppdev/bigmailer/csvImport.cpp deleted file mode 100644 index cbfa83166..000000000 --- a/uppdev/bigmailer/csvImport.cpp +++ /dev/null @@ -1,174 +0,0 @@ -#include -#include -#include -#include "csvImport.h" - -#define LAYOUTFILE -#include - - -CSVParser::CSVParser() -{ - sData = ""; - nPos = 0; - separator = ',' ; - -} - -Vector CSVParser::ParseLine(const String& sIn, int fieldCount) -{ - sData = sIn; - nPos = 0; - - Vector result ; - for (int i=0; i < fieldCount; i++) - result.Add( GetNext() ) ; - return result ; -} -Vector CSVParser::ParseLine(const String& sIn) -{ - sData = sIn; - nPos = 0; - - String w ; - Vector result ; - while(true) - { - w = GetNext() ; - if (w.IsEmpty()) - break ; - result.Add(w) ; - } - return result ; -} -String CSVParser::GetNext() -{ - bool bQuotes = false; - String sOut = ""; - // Skip spaces - while (nPos < sData.GetLength() && sData[nPos] == ' ') - nPos++; - - // Jump past first " if necessary - if (nPos < sData.GetLength() && sData[nPos] == '"') - { - bQuotes = true; - nPos++; - } - - while (nPos < sData.GetLength()) - { - if (!bQuotes && sData[nPos] == separator) - break; - if (bQuotes && sData[nPos] == '"') - { - if (nPos + 1 >= sData.GetLength() - 1) - break; - if (sData[nPos+1] == separator) - break; - } - sOut += sData[nPos++]; - } - - // Jump past last " if necessary - if (bQuotes && nPos < sData.GetLength() && sData[nPos] == '"') - nPos++; - - // Jump past , if necessary - if (nPos < sData.GetLength() && sData[nPos] == separator) - nPos++; - - return sOut ; -} -// end csvparser -// ---------------------------------------------------------------------------------------- - - - -class CSVDlg : public WithCSVLayout { -public: - - typedef CSVDlg CLASSNAME; - - String filePath ; - - CSVDlg(const String& fPath, csvResult& r ); - - void ShowGrid() ; - - csvResult&result ; - -}; - -bool csvResult::ImportFrom( const String& filePath ) -{ - csvResult r ; - CSVDlg d(filePath, *this) ; - int resp = d.Execute() ; - return (resp == IDOK) ; -} - - - - - -CSVDlg::CSVDlg( const String& fPath, csvResult& r ) : result(r) -{ - filePath = fPath ; - CtrlLayout(*this, t_("Import csv file")); - Sizeable() ; - - int ch ; - while( (ch = enumCharSet()) != 0) - dropCharSet.Add( ch, CharsetName( ch ) ) ; - dropCharSet.SetData(GetDefaultCharset()) ; - - dropSeparator.Add('\t', t_("tab")) ; - dropSeparator.Add(',', t_("coma")) ; - dropSeparator.Add(';', t_("punto y coma")) ; - dropSeparator.SetData(';') ; - - dropCharSet.WhenAction = dropSeparator.WhenAction = THISBACK(ShowGrid) ; - btCancel.WhenAction = Breaker(IDEXIT) ; - btOk.WhenAction = Breaker(IDOK) ; - - gridData.Hide() ; - ShowGrid() ; -} -void CSVDlg::ShowGrid() -{ - - int ch = dropCharSet.GetData() ; - int sep = dropSeparator.GetData() ; - - String x = ToCharset(CHARSET_DEFAULT, LoadFile(filePath), ch, ch) ; - Vector lines = String2VectorString(x) ; - - gridData.Reset() ; - gridData.Absolute() ; - - CSVParser csv ; - csv.SetSeparator(sep) ; - result.fields.Clear() ; result.values.Clear() ; - //Vector fields, values ; - for (int i = 0; i < lines.GetCount(); i++) - { - if (i == 0) // primera línea - { - result.fields = csv.ParseLine( lines[0] ) ; - for (int j = 0; j < result.fields.GetCount(); j++) - gridData.AddColumn(result.fields[j], 60) ; - } - else - { - Vector&v = result.values.Add() ; - - v = csv.ParseLine(lines[i], result.fields.GetCount()) ; - for( int j = 0; j < result.fields.GetCount(); j++) - { - gridData.Set(i-1, j, v[j]) ; - } - } - } - gridData.Show() ; -} diff --git a/uppdev/bigmailer/csvImport.h b/uppdev/bigmailer/csvImport.h deleted file mode 100644 index 0423a7786..000000000 --- a/uppdev/bigmailer/csvImport.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef _csvImport_h_ -#define _csvImport_h_ - -struct csvResult -{ - Vector fields ; - Vector< Vector > values ; - - bool ImportFrom( const String& filePath ) ; -} ; - -// CSVParser inspirated in code from other people ...... -class CSVParser { -private: - String sData; - int nPos; - String GetNext(); - - int separator ; -public: - CSVParser(); - void SetSeparator(int sep ) { separator = sep ; } - - Vector ParseLine(const String &sIn); - Vector ParseLine(const String &sIn, int fieldCount ); -}; - -#endif diff --git a/uppdev/bigmailer/csvImport.lay b/uppdev/bigmailer/csvImport.lay deleted file mode 100644 index cb04dc7e2..000000000 --- a/uppdev/bigmailer/csvImport.lay +++ /dev/null @@ -1,9 +0,0 @@ -LAYOUT(CSVLayout, 368, 228) - ITEM(DropList, dropCharSet, LeftPosZ(100, 116).TopPosZ(8, 20)) - ITEM(DropList, dropSeparator, LeftPosZ(100, 116).TopPosZ(32, 20)) - ITEM(GridCtrl, gridData, HSizePosZ(4, 4).VSizePosZ(60, 4)) - ITEM(Button, btOk, SetLabel(t_("Ok")).LeftPosZ(288, 70).TopPosZ(8, 19)) - ITEM(Button, btCancel, SetLabel(t_("Cancel")).LeftPosZ(288, 70).TopPosZ(32, 19)) - ITEM(Label, dv___5, SetLabel(t_("Character set:")).LeftPosZ(4, 92).TopPosZ(11, 13)) - ITEM(Label, dv___6, SetLabel(t_("Separator:")).LeftPosZ(4, 92).TopPosZ(36, 13)) -END_LAYOUT diff --git a/uppdev/bigmailer/listData.cpp b/uppdev/bigmailer/listData.cpp deleted file mode 100644 index fa82300cd..000000000 --- a/uppdev/bigmailer/listData.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/* -#include - - -ListDataPage::ListDataPage() -{ - CtrlLayout(*this); - - btLoad.WhenAction = THISBACK(Fill) ; - btSave.WhenAction = THISBACK(Save) ; - -} - - -void ListDataPage::Fill() -{ - theGrid.Reset() ; - for (int col = 0; col < theDefList.fields.GetCount(); col++) - { - theGrid.AddColumn(theDefList.fields[col]).Edit(theEdits[col]) ; - } - theGrid.EditCell().SelectRow(true).Removing(true).ShowRows(true) ; - - - for (int row = 0; row < theDefList.data.GetCount(); row++) - { - Vector d = Split(theDefList.data[row], ',') ; - for (int col = 0; col < d.GetCount(); col++) - { - theGrid.Set(row, col, d[col]) ; - } - } - theGrid.ClearModify() ; - -} -void ListDataPage::Save() -{ - if ( ! theGrid.IsModified() ) - return ; - - String line ; - theDefList.data.Clear() ; - for (int row = 0; row < theGrid.GetCount(); row++) - { - line = "" ; - for (int col = 0; col < theDefList.fields.GetCount(); col++) - { - if (col > 0) - line += "," ; - line << theGrid.Get(row, col) ; - } - theDefList.data.Add(line) ; - } -} -*/ \ No newline at end of file diff --git a/uppdev/bigmailer/listDefinition.cpp b/uppdev/bigmailer/listDefinition.cpp deleted file mode 100644 index e87268dda..000000000 --- a/uppdev/bigmailer/listDefinition.cpp +++ /dev/null @@ -1,166 +0,0 @@ -#include -//#include -#include "csvImport.h" - - -void bigmailer::onNewList() -{ - onCloseList() ; - - theDefList.name = t_("new list") ; - theDefList.fields.Add( "name" ) ; - theDefList.fields.Add( "email" ) ; - - SetTitle() ; -} -void bigmailer::onOpenList() -{ - FileSel fs; - fs.ActiveDir(ConfigFile("")) ; - fs.Type("list files", "*.list") ; - - if ( ! fs.ExecuteOpen(t_("select a list file") ) ) - return; - - onCloseList() ; - - theDefList.Load(fs.Get()) ; - SetTitle() ; -} -void bigmailer::onCloseList() -{ - DataPageSave() ; - theDefList.Clear() ; - SetTitle() ; -} - -void bigmailer::DataPageImportCSV() -{ - FileSel fs ; - fs.ActiveDir(ConfigFile("")) ; - fs.Type("csv files", "*.csv") ; - - if ( ! fs.ExecuteOpen(t_("")) ) - return; - - csvResult csv ; - if ( ! csv.ImportFrom(fs.Get()) ) - return ; - - - WithcsvToDefLayout dlg; - CtrlLayout(dlg, "Import From CSV"); - for (int i = 0; i < csv.fields.GetCount(); i++) - { - dlg.dropName.Add( csv.fields[i] ) ; - dlg.dropEmail.Add( csv.fields[i] ) ; - } - dlg.dropName.SetIndex(0) ; - dlg.dropEmail.SetIndex(1) ; - dlg.btOk.WhenAction = Breaker(IDOK) ; - dlg.btCancel.WhenAction = Breaker( IDCANCEL ) ; - if (dlg.Execute() == IDOK) - { - if (PromptOKCancel("Con esta operación se van a eliminar [* TODOS]") == IDOK) - { - // añadimos la cabecera - theDefList.fields.Clear() ; - theDefList.fields.Add( dlg.dropName.GetValue() ) ; - theDefList.fields.Add( dlg.dropEmail.GetValue() ) ; - - for (int i = 0; i < csv.fields.GetCount(); i++) - { - String f = csv.fields[i] ; - if (f != theDefList.fields[0] && f != theDefList.fields[1]) - theDefList.fields.Add(f) ; - } - - - theDefList.data.Clear() ; - for (int i = 0; i < csv.values.GetCount(); i++) // para cada registro - { - Vector& line = csv.values[i] ; - Vector& record = theDefList.data.Add() ; - - for (int j = 0; j < theDefList.fields.GetCount(); j++) - { - String fieldName = theDefList.fields[j] ; - for (int k = 0; k < csv.fields.GetCount(); k++) - { - if (fieldName == csv.fields[k]) - { - record.Add( line[k] ) ; - break ; - } - } - } - } - - theDefList.Save() ; - DataPageFill() ; - - } - } - -} - - - -// --------------------------------------------------------------------------------------------- -class DataListDefinitionDlg : public WithDataListDefinition { -public: - EditString edCell ; - - typedef DataListDefinitionDlg CLASSNAME; - DataListDefinitionDlg(); - void OnSave() ; -}; - -DataListDefinitionDlg::DataListDefinitionDlg() -{ - CtrlLayout(*this, t_("Name and Field definition")); - - edListName.SetData( theDefList.name ) ; - - labelInfo.SetQTF( -t_( -"[ $$0,0#00000000000000000000000000000000:Default]" -"[s0;1 The 2 first fields are obligatory and they are not possible " -"to be modified.&]" -"[s0;1 You can create new fields to personalize its list.]" -)) ; - - grid.Appending().Removing().EditCell().AddColumn(t_("field")).Edit(edCell) ; - grid.AddRow(theDefList.fields.GetCount()) ; - grid.GetRow(0).Editable(false) ; - grid.GetRow(1).Editable(false) ; - - for (int i = 0; i < theDefList.fields.GetCount(); i++) - grid.Set(i,0, theDefList.fields[i]) ; - //grid.SetFixedRows(3) ; - - - btCancel.WhenAction = Breaker(IDCANCEL) ; - btSave.WhenAction = THISBACK(OnSave) ; -} -void DataListDefinitionDlg::OnSave() -{ - theDefList.name = ~edListName ; - theDefList.fields.Clear() ; - - theDefList.fields.Add("NAME") ; - theDefList.fields.Add("EMAIL") ; - - for (int i = 0; i < grid.GetCount(); i++) - theDefList.fields.Add( grid.Get(i,0)) ; - - theDefList.Save() ; - Break(IDOK) ; -} -void bigmailer::DataPageEditFields() -{ - DataListDefinitionDlg eso ; - int resp = eso.Execute() ; - if (resp != IDCANCEL) - DataPageFill() ; -} diff --git a/uppdev/bigmailer/messages.cpp b/uppdev/bigmailer/messages.cpp deleted file mode 100644 index 1301b3c93..000000000 --- a/uppdev/bigmailer/messages.cpp +++ /dev/null @@ -1,209 +0,0 @@ -#include - - -// funcines del menú principal -void bigmailer::onNewMsg() -{ - onCloseMsg() ; - messagePage.filename = ConfigFile("newMessage.qtf") ; - SetTitle() ; - if (tab.Get() != 1) - tab.Set(1) ; - - theCfg.lastMsg = messagePage.filename ; - theCfg.Save() ; - -} -void bigmailer::onOpenMsg() -{ - FileSel fs; - fs.ActiveDir(ConfigFile("")) ; - fs.Type("list files", "*.msg") ; - - if ( ! fs.ExecuteOpen(t_("Select a message file") ) ) - return; - - onCloseMsg() ; - - messagePage.Load(fs.Get()) ; - SetTitle() ; - if (tab.Get() != 1) - tab.Set(1) ; - -} -void bigmailer::onCloseMsg() -{ - messagePage.editor.Clear() ; - messagePage.editor.ClearModify() ; - messagePage.filename = "" ; -} -void bigmailer::onPrintMsg() -{ - //messagePage.editor.Print() ; -} - - -// clase para editar el mensaje - -MessageEditor::MessageEditor() -{ - CtrlLayout( *this ) ; - editor.ClearModify(); - //editor.WhenRefreshBar= THISBACK(SetBar); - SetBar(); - editor.WhenRefreshBar = THISBACK(SetBar); - - btSave.WhenAction = THISBACK(Save) ; - edFrom.WhenAction = edSubject.WhenAction = THISBACK(CheckModify) ; - - -} -void MessageEditor::FillFields() -{ - fields.Clear() ; - for (int i = 0; i < theDefList.fields.GetCount(); i++) - fields.Add(theDefList.fields[i]) ; - fields.WhenAction = THISBACK( OnInsertField ) ; -} - -void MessageEditor::OnInsertField() -{ - if (editor.IsReadOnly()) - return ; - String sel = fields.GetData() ; - if (sel.IsEmpty()) - return ; - sel = "[%" + sel + "%]" ; - editor.PasteText(AsRichText(sel.ToWString())) ; -} - -void MessageEditor::CheckModify() -{ - btSave.Enable( editor.IsModified() || edFrom.IsModified() || edSubject.IsModified() ) ; -} - -void MessageEditor::MainBar(Bar& bar) -{ - - CheckModify() ; - - //bar.Add(editor.IsModified(), "Save", CtrlImg::save(), THISBACK(Save)) - // .Key(K_CTRL_S) - // .Help(t_("Save current document") ); - - bar.Add("SaveAs", CtrlImg::save_as(), THISBACK(SaveAs)) - .Help(t_("Save current document with a new name" ) ); - - bar.Gap(2) ; - editor.CutTool(bar) ; - editor.CopyTool(bar); - editor.PasteTool(bar); - - bar.Gap(2); - editor.FaceTool(bar); - bar.Gap(2) ; - - editor.HeightTool(bar); - bar.Gap(2); - editor.BoldTool(bar); - editor.UnderlineTool(bar) ; - editor.ItalicTool(bar); - - bar.Gap(2); - editor.InkTool(bar); - editor.PaperTool(bar); - - bar.Gap(2) ; - editor.LeftTool(bar); - editor.CenterTool(bar); - editor.RightTool(bar); - editor.JustifyTool(bar); - - bar.Gap(2) ; - editor.ObjectTool(bar) ; - - bar.Gap(2) ; - bar.Add(true, fields, 100) ; - fields.HelpLine( t_("Insert field data in text") ) ; - - -} - -void MessageEditor::SetBar() -{ - toolbar.Set(THISBACK(MainBar)); -} - -void MessageEditor::Load(const String& name) -{ - theMsg.Load(name) ; - edFrom.SetData(theMsg.from) ; - edSubject.SetData(theMsg.subject) ; - editor.SetQTF(theMsg.qtfBody) ; - /* - VectorMap data = LoadIniFile(name + ".ini") ; - edFrom.SetData( data.Get("from") ) ; edFrom.ClearModify() ; - edSubject.SetData( data.Get("subject") ) ; edSubject.ClearModify() ; - - String qtf, s ; - for (int i = 0; true; i++) - { - s = data.Get("body" + AsString(i), "") ; - if (s.IsEmpty()) - break ; - qtf += s + "\r\n" ; - } - editor.SetQTF(qtf) ; - - //editor.SetQTF(LoadFile(name)); -*/ - filename = name; - editor.ClearModify(); - SetBar() ; - bigmailer::Mailer().SetTitle() ; -} - -void MessageEditor::Save() -{ - //if(!editor.IsModified() ) return; - if(filename.IsEmpty()) - SaveAs(); - else - { - theMsg.from = ~edFrom ; - theMsg.subject = ~edSubject ; - theMsg.qtfBody = editor.GetQTF() ; - theMsg.Save() ; - ClearModify(); - } - SetBar() ; - bigmailer::Mailer().SetTitle() ; -} - -void MessageEditor::SaveAs() -{ - /* - String pngStr = LoadFile("/home/nico/dobleDorje4.png") ; - RichObject pngObj("PNG", pngStr) ; - RichPara p ; - RichPara::CharFormat f ; - p.Cat(pngObj,f) ; - //editor.ObjectTool(Bar& bar¸ dword key = 0) - - RichObject CreateImageObject(const Image& img); - String AsQTF(const RichObject& obj); - - */ - - FileSel fs ; - fs.Type(t_("Message files"), "*.msg") ; - fs.ActiveDir(ConfigFile("")) ; - if(fs.ExecuteSaveAs()) - { - filename = fs.Get(); - Save() ; - } - SetBar() ; - bigmailer::Mailer().SetTitle() ; - -} diff --git a/uppdev/bigmailer/messages.h b/uppdev/bigmailer/messages.h deleted file mode 100644 index 82ecd1b9f..000000000 --- a/uppdev/bigmailer/messages.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef _messages_h_ -#define _messages_h_ - -struct MessageEditor : public WithMessageLayout { - - //RichEdit editor; - //ToolBar toolbar; - DropList fields ; - String filename; - - void Load(const String& filename); - void OpenFile(const String& fn); - void Save(); - void SaveAs(); - - void SetBar(); - void MainBar(Bar& bar); - - void OnInsertField() ; - void FillFields() ; - - void CheckModify() ; - -public: - typedef MessageEditor CLASSNAME; - - MessageEditor(); -}; - - - - - - -#endif diff --git a/uppdev/bigmailer/send.cpp b/uppdev/bigmailer/send.cpp deleted file mode 100644 index 509a63cb7..000000000 --- a/uppdev/bigmailer/send.cpp +++ /dev/null @@ -1,114 +0,0 @@ -#include -#include "smtpEx.h" - -/* -class sCrono -{ - Time a, b ; -public: - void start() { a = b = GetSysTime() ; } - void end() { b = GetSysTime() ; } - double result() { return b-a ; } -} ; -*/ - - -static String GetHostFromAddress( const String& address ) -{ - int posAt = address.Find('@') ; - if (posAt == -1) - return address ; - - return address.Mid(posAt+1) ; -} - -void bigmailer::onSend() -{ - const String enter = "\r\n" ; - if (messagePage.editor.IsModified()) - messagePage.Save() ; - // mapa de los campos - VectorMap fldMap ; - for (int i = 0; i < theDefList.fields.GetCount(); i++) - fldMap.Add(theDefList.fields[i], i) ; - - String outHTML ; - - Index css ; - VectorMap links ; - String path = "./" ; - String html = EncodeHtml(messagePage.editor.Get(), css, links, path ) ; - - outHTML << - "\r\n" - "\r\n" - "\r\n" - "\r\n" - "\r\n" - "\r\n" - "\r\n" - << html << "\r\n" - << "\r\n" - "\r\n" ; - - Progress prog ; - prog.Set(0, theDefList.data.GetCount()) ; - prog.Show() ; - - theDefList.errors.Clear() ; - - String theHtml ; - for (int row = 0; row < theDefList.data.GetCount(); row++) - { - String addrTo = theDefList.data[row][1] ; - if (addrTo.IsEmpty()) - { - theDefList.errors.Add(t_("dirección incorrecta")) ; - continue ; - } - - if (prog.Canceled()) - break ; - - - theHtml = outHTML ; - - String s = AsString(row+1) + " / " + AsString( theDefList.data.GetCount() ) ; - prog.SetText(s) ; - - for (int i = 0; i < theDefList.fields.GetCount(); i++) - { - String toFind = "[%" + theDefList.fields[i] + "%]" ; - int from = 0 ; - while( (from = theHtml.Find(toFind, from )) != -1) - { - theHtml.Remove( from, toFind.GetCount() ) ; - theHtml.Insert( from, theDefList.data[row][ fldMap.Get(theDefList.fields[i])] ) ; - } - } - - prog.SetPos(row+1) ; - - SmtpMailEx mail ; - - mail.Host( theCfg.smtpServer ) - .User( theCfg.user ) - .Password( theCfg.pass ) - .From( theMsg.from ) - .ReplyTo( theMsg.from ) - .To( addrTo ) - .Subject( theMsg.subject ) - .Text( "" ) - .Attach("MENSAJE", theHtml, "text/html; charset=utf-8") ; - - if ( ! mail.Send() ) - theDefList.errors.Add(mail.GetError()) ; - else - theDefList.errors.Add("OK") ; - - } - - theDefList.Save() ; -} diff --git a/uppdev/bigmailer/smtpEx.cpp b/uppdev/bigmailer/smtpEx.cpp deleted file mode 100644 index 5aec44a4f..000000000 --- a/uppdev/bigmailer/smtpEx.cpp +++ /dev/null @@ -1,433 +0,0 @@ -#include -#include "smtpEx.h" -#pragma hdrstop - -//#define SMTP_DEBUG // uncomment this line to turn on LOG-based SMTP emulation -#define SMTP_LOG // uncomment this line to turn on command-line based logging of SMTP communication - -static String GetDelimiter(const char *b, const char *e, const String& init = Null) -{ - static const char delimiters[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef" - "ghijklmnopqrstuvxyz()+/:?0123456" - "789abcdefghijklmnopqrstuvwxyzABC" - "DEFGHIJKLMNOPQRSTUVWXYZ012345678"; - - String out = init; - if(b == e) - return out; - if(IsNull(out)) - out.Cat(delimiters[*b++ & 0x7F]); - int l = out.GetLength(); - for(; b != e; b++) - { - b = (const char *)memchr(b, *out, e - b); - if(!b || e - b < l) - return out; - if(!memcmp(b, out, l)) - { - if(e - b == l) - return out + '/'; - out.Cat(delimiters[b[l] & 0x7F]); - } - } - return out; -} - -static void Send(Socket& socket, const String &s, String *transcript = 0, int timeout = 60) -{ -#ifdef SMTP_LOG - puts("Command: " + s); -#endif - if(transcript && !s.IsEmpty()) - { - transcript -> Cat(s); - if(*s.Last() != '\n') - transcript -> Cat('\n'); - } -#ifdef SMTP_DEBUG - GetVppLog().Put(s); - return; -#endif - dword end_time = (timeout >= 0 ? GetTickCount() + 1000 * timeout : 0xFFFFFFFF); - const char *p = s.Begin(), *e = s.End(); - while(p != e) - { - if(GetTickCount() > end_time) - throw Exc("Porucha komunikace: vyprel asov limit."); - - int amount = socket.WriteRaw(p, e - p), err; - if(amount > 0) - { // some data has been sent - reset timeout - p += amount; - end_time = (timeout >= 0 ? GetTickCount() + 1000 * timeout : 0xFFFFFFFF); - } - else if(amount == 0) - throw Exc("Chyba pi zpisu dat do socketu: komunikan kanl byl uzaven."); - else if((err = Socket::GetErrorCode()) != SOCKERR(EWOULDBLOCK)) { - String str; - throw Exc(str << "Chyba pi zpisu dat do socketu, kd chyby: " << err); - } - else - Sleep(100); - } -} - -static String SendRecv(Socket& socket, const String& s, String *transcript = 0, int timeout = 60) -{ - Send(socket, s, transcript, timeout); -#ifdef SMTP_DEBUG - return "250 OK"; -#endif - String dest; - dword end_time = (timeout >= 0 ? GetTickCount() + 1000 * timeout : 0xFFFFFFFF); - for(;;) - { - if(GetTickCount() > end_time) - throw Exc("Porucha komunikace: vyprel asov limit."); - char buffer[1024]; - int amount = socket.ReadRaw(buffer, sizeof(buffer)), err; - if(amount > 0) - { - dest.Cat(buffer, amount); - while(--amount >= 0) - if(buffer[amount] == '\n') - { - if(transcript && !dest.IsEmpty()) - { - transcript -> Cat(dest); - if(*dest.Last() != '\n') - transcript -> Cat('\n'); - } -#ifdef SMTP_LOG - puts("Reply: " + dest); -#endif - - return dest; - } - } - else if(amount == 0) - throw Exc("Chyba pi ten dat ze socketu: komunikan kanl byl uzaven."); - else if((err = Socket::GetErrorCode()) != SOCKERR(EWOULDBLOCK)) { - String str; - throw Exc(str << "Chyba pi ten dat ze socketu, kd chyby: " << err); - } - else - Sleep(100); - } -} - -static void SendRecvOK(Socket& socket, const String& s, String *transcript = 0, int timeout = 60) -{ - String ans = SendRecv(socket, s, transcript, timeout); - if(ans[0] != '2' || ans[1] != '5' || ans[2] != '0') - throw Exc(ans); -} - -////////////////////////////////////////////////////////////////////// -// SmtpMailEx:: - -SmtpMailEx::SmtpMailEx() -: port(25) -, no_header(false) -, no_header_sep(false) -, time_sent(GetSysTime()) -{ -} - -static const char default_mime[] = "application/octet-stream"; - -SmtpMailEx& SmtpMailEx::AttachFile(const char *filename, const char *mime) -{ - Attachment& attach = attachments.Add(); - attach.name = GetFileNamePos(filename); - attach.mime = (mime ? mime : default_mime); - attach.file = filename; - return *this; -} - -SmtpMailEx& SmtpMailEx::Attach(const char *name, String data, const char *mime) -{ - Attachment& attach = attachments.Add(); - attach.name = name; - attach.mime = (mime ? mime : default_mime); - attach.data = data; - return *this; -} - -bool SmtpMailEx::Send() -{ - Socket socket; - String ipaddr; - - try - { - if(IsNull(host)) - throw Exc("Hostitel nen zadn."); - - if(to.IsEmpty()) - throw Exc("Nen zadn pjemce."); - -#ifdef SMTP_DEBUG - ipaddr = "1.2.3.4"; -#else - Socket::Init(); - dword my_addr; - if(!ClientSocket(socket, host, port, true, &my_addr, 100, true)) - throw Exc(NFormat("Nelze otevt socket %s:%d: %s", host, port, Socket::GetErrorText())); - - ipaddr - << (int)((my_addr >> 0) & 0xFF) << '.' - << (int)((my_addr >> 8) & 0xFF) << '.' - << (int)((my_addr >> 16) & 0xFF) << '.' - << (int)((my_addr >> 24) & 0xFF); -#endif - - String *trans_ptr = (transcript ? &transcript_text : 0); - String ans; - - // receive initial message & send hello - SendRecv(socket, Null, trans_ptr, 30); - String org; - int pos = from.Find('@'); - if(pos >= 0) - { - int start = ++pos, len = from.GetLength(); - while(pos < len && from[pos] != '>') - pos++; - org = from.Mid(start, pos - start); - } - else - org << ipaddr; - - //SendRecvOK(socket, "HELO " + org + "\r\n", trans_ptr); - serverGreeting = SendRecv(socket, "EHLO " + org + "\r\n", trans_ptr); - - if ( ! user.IsEmpty() && ! pass.IsEmpty() ) - { - if ( ! authenticate( socket ) ) - return false ; - } - - SendRecvOK(socket, "MAIL FROM:<" + from + ">\r\n", trans_ptr); - for(int i = 0; i < to.GetCount(); i++) - SendRecv(socket, "RCPT TO:<" + to[i] + ">\r\n", trans_ptr); - ans = SendRecv(socket, "DATA\r\n", trans_ptr); - -#ifndef SMTP_DEBUG - if(memcmp(ans, "354", 3)) - throw Exc(ans); -#endif - - String delimiter = GetDelimiter(text.Begin(), text.End(), "?"); - bool multi = !attachments.IsEmpty(); - - { // format message - String msg; - if(!no_header) - { // generate message header - msg << "From: " << from << "\r\n"; - static const AS as_list[] = { TO, CC, BCC }; - static const char *as_name[] = { "To", "CC", "BCC" }; - for(int a = 0; a < __countof(as_list); a++) - { - int pos = 0; - for(int i = 0; i < as.GetCount(); i++) - if(as[i] == as_list[a]) - { - if(pos && pos + to[i].GetLength() >= 70) - { - msg << "\r\n "; - pos = 5; - } - else if(pos) - { - msg << ", "; - pos += 2; - } - else - { - msg << as_name[a] << ": "; - pos = strlen(as_name[a]) + 2; - } - msg << to[i]; - } - if(pos) - msg << "\r\n"; - } - if(!IsNull(subject)) - msg << "Subject: " << subject << "\r\n"; - if(!IsNull(reply_to)) - msg << "Reply-To: " << reply_to << "\r\n"; - if(!IsNull(time_sent)) - { - static const char *dayofweek[] = - { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; - static const char *month[] = - { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; - msg << "Date: " - << dayofweek[DayOfWeek(time_sent)] << ", " - << (int)time_sent.day << ' ' << month[time_sent.month - 1] << ' ' << (int)time_sent.year - << ' ' << Sprintf("%2d:%02d:%02d +0100", time_sent.hour, time_sent.minute, time_sent.second) - << "\r\n"; - } - if(multi) - msg << "Content-Type: Multipart/mixed; boundary=\"" << delimiter << "\"\r\n" - "\r\n" - "--" << delimiter << "\r\n" - "Content-Type: " << (*mime ? ~mime : "text/plain; charset=Windows-1250") << "\r\n" - "Content-Transfer-Encoding: quoted-printable\r\n" - ; - if(!no_header_sep) - msg << "\r\n"; // message separator - } - - bool begin = true; - for(const char *p = text.Begin(), *e = text.End(); p != e; p++) - if(*p >= 33 && *p <= 126 && *p != '=' && (*p != '.' || !begin)) - { - msg.Cat(*p); - begin = false; - } - else if(*p == '.' && begin) - { - msg.Cat(".."); - begin = false; - } - else if(*p == ' ' && p + 1 != e && p[1] != '\r' && p[1] != '\n') - { - msg.Cat(' '); - begin = false; - } - else if(*p == '\r') - ; - else if(*p == '\n') - { - msg.Cat("\r\n"); - begin = true; - } - else - { - static const char hex[] = "0123456789ABCDEF"; - msg.Cat('='); - msg.Cat(hex[(*p >> 4) & 15]); - msg.Cat(hex[*p & 15]); - } - - if(!begin) - msg.Cat("\r\n"); - if(multi) - { - for(int i = 0; i < attachments.GetCount(); i++) - { - const Attachment& a = attachments[i]; - One source; - if(!IsNull(a.file)) - { - One fi = new FileIn(a.file); - if(fi -> IsOpen()) - source = -fi; - } - else - source = new StringStream(a.data); - msg << "--" << delimiter << "\r\n" - "Content-Type: " << a.mime << "; name=\"" << a.name << "\"\r\n" - "Content-Transfer-Encoding: base64\r\n" - "Content-Disposition: attachment; filename=\"" << a.name << "\"\r\n" - "\r\n"; - - char buffer[54]; - for(int c; (c = source -> Get(buffer, sizeof(buffer))) != 0;) - { - msg.Cat(Base64Encode(buffer, buffer + c)); - msg.Cat('\r'); - msg.Cat('\n'); - if(msg.GetLength() >= 65536) - { - ::Send(socket, msg, trans_ptr); - msg = Null; - } - } - } - msg << "--" << delimiter << "--\r\n"; - } - msg.Cat(".\r\n"); - SendRecvOK(socket, msg, trans_ptr); - } - - SendRecv(socket, "QUIT\r\n", trans_ptr); - return true; - } - catch(Exc e) - { - error = e; - return false; - } -} -bool SmtpMailEx::authenticate( Socket &s ) -{ - if( !user.GetLength() ) - { - SendRecv(s, "QUIT\r\n") ; - return false; - } - - String *trans_ptr = (transcript ? &transcript_text : 0); - - // gets the authetification type - String auT = ToUpper(serverGreeting) ; - if (auT.Find("LOGIN") != -1) // login type - { - error = SendRecv(s, "auth LOGIN\r\n", trans_ptr) ; - if(error.Mid(0,16) != "334 VXNlcm5hbWU6") - { - error = "554 Server did not return correct response to \'auth login\' command"; - SendRecv(s, "QUIT\r\n" ) ; - return false; - } - error = SendRecv(s, Base64Encode(user) + "\r\n", trans_ptr) ; - // The server should give us a "334 UGFzc3dvcmQ6" base64 password - if(error.Mid(0,16) != "334 UGFzc3dvcmQ6") - { - error = "554 Server did not return correct password question"; - SendRecv(s, "QUIT\r\n"); - return false; - } - error = SendRecv(s, Base64Encode(pass) + "\r\n", trans_ptr) ; - if(error.Mid(0,3) == "235") - return true; - } - else if (auT.Find("PLAIN") != -1) // plain type - { - // now create the authentication response and send it. - // username\0username\0password\r\n - // i.e. \0fred\0secret\r\n (blank identity) - String enc ; - enc << user << "\0" << user << "\0" << pass << "\r\n" ; - - //std::vector enc; - //std::string::size_type pos = 0; - //for(; pos < user.length(); ++pos) - // enc.push_back(user[pos]); - //enc.push_back('\0'); - //for(pos = 0; pos < user.length(); ++pos) - // enc.push_back(user[pos]); - //enc.push_back('\0'); - //for(pos = 0; pos < pass.length(); ++pos) - // enc.push_back(pass[pos]); - - //enc = base64encode(enc, false); - //greeting = "auth plain "; - //for(std::vector::const_iterator it1 = enc.begin(); it1 < enc.end(); ++it1) - // greeting += *it1; - //greeting += "\r\n"; - - error = SendRecv(s, "auth plain " + Base64Encode(enc) + "\r\n", trans_ptr) ; - if(error.Mid(0,3) == "235") - return true; - } - - - SendRecv( s, "QUIT\r\n" ) ; - return false; -} diff --git a/uppdev/bigmailer/smtpEx.h b/uppdev/bigmailer/smtpEx.h deleted file mode 100644 index 0b8962da4..000000000 --- a/uppdev/bigmailer/smtpEx.h +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef _test_smtp_smtpEx_h_ -#define _test_smtp_smtpEx_h_ -#include -class SmtpMailEx -{ -public: - enum AS { TO, CC, BCC }; - - SmtpMailEx(); - - SmtpMailEx& Host(String h) { host = h; return *this; } - SmtpMailEx& Port(int p) { port = p; return *this; } - SmtpMailEx& From(String f) { from = f; return *this; } - SmtpMailEx& To(String t, AS a = TO) { to.Add(t); as.Add(a); return *this; } - SmtpMailEx& Text(String t, const char *m = 0) { text = t; mime = m; return *this; } - SmtpMailEx& NoHeader() { no_header = true; return *this; } - SmtpMailEx& NoHeaderSep() { no_header_sep = true; return *this; } - SmtpMailEx& ReplyTo(String r) { reply_to = r; return *this; } - SmtpMailEx& TimeSent(Time t) { time_sent = t; return *this; } - SmtpMailEx& Subject(String s) { subject = s; return *this; } - SmtpMailEx& Transcript(bool t = true) { transcript = t; return *this; } - SmtpMailEx& AttachFile(const char *filename, const char *mime = 0); - SmtpMailEx& Attach(const char *name, String data, const char *mime = 0); - SmtpMailEx& User( const String& u ) { user = u ; return *this ; } - SmtpMailEx& Password( const String& p ) { pass = p ; return *this ; } - - - bool Send(); - - String GetError() const { return error; } - String GetTranscript() const { return transcript_text; } - - -private: - - bool authenticate( Socket& s ) ; - String user, pass; - String serverGreeting ; - - struct Attachment - { - String name; // mail name - String file; // source path (dynamic attachments only) - String mime; // content type (application/octet-stream by default) - String data; - }; - - String host; - int port; // default = 25 - String from; - Vector to; - Vector as; - String text; - String mime; // default: text/plain; charset=windows-1250 - bool transcript; // default = false - Array attachments; - - // header-related parts - bool no_header; // default = false - bool no_header_sep; // default = false - Time time_sent; - String reply_to; - String subject; - - // state automaton - String error; - String transcript_text; -}; - -#endif diff --git a/uppdev/bitcnt/bitcnt.cpp b/uppdev/bitcnt/bitcnt.cpp deleted file mode 100644 index 1b79b29a7..000000000 --- a/uppdev/bitcnt/bitcnt.cpp +++ /dev/null @@ -1,155 +0,0 @@ -#include - -using namespace Upp; - -int BitMatch0(dword *a, dword *b, int count) -{ - int pop = 0; - while(count--) { - dword x = *a++ & *b++; - for(int n = 32; n--;) { - pop += x & 1; - x >>= 1; - } - } - return pop; -} - -static byte sBitCnt[] = { 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8 }; - -int BitMatch1(dword *_a, dword *_b, int count) -{ - int pop = 0; - byte *a = (byte *)_a; - byte *b = (byte *)_b; - count <<= 2; - while(count--) - pop += sBitCnt[*a++ & *b++]; - return pop; -} - -extern byte sPop16__[]; - -int BitMatch2(dword *_a, dword *_b, int count) -{ - int pop = 0; - word *a = (word *)_a; - word *b = (word *)_b; - count <<= 1; - while(count--) - pop += sPop16__[*a++ & *b++]; - return pop; -} - -int BitMatch4(dword *a, dword *b, int count) -{ - int pop = 0; - while(count--) { - dword x = *a++ & *b++; - pop += sPop16__[(word)x] + sPop16__[(word)SwapEndian32(x)]; - } - return pop; -} - -int BitMatch21(dword *a, dword *b, int count) -{ - int pop = 0; - while(count--) { - dword x = *a++ & *b++; - x = ((x & 0xaaaaaaaa) >> 1) + (x & 0x55555555); - x = ((x & 0xcccccccc) >> 2) + (x & 0x33333333); - x = ((x & 0xf0f0f0f0) >> 4) + (x & 0x0f0f0f0f); - x = ((x & 0xff00ff00) >> 8) + (x & 0x00ff00ff); - x = ((x & 0xffff0000) >> 16) + (x & 0x0000ffff); - pop += x; - } - return pop; -} - -int BitMatch3(dword *a, dword *b, int count) -{ - int pop = 0; - while(count--) { - dword n = *a++ & *b++; - n = n - ((n >> 1) & 0x55555555); - n = (n & 0x33333333) + ((n >> 2) & 0x33333333); - n = (n + (n >> 4)) & 0x0F0F0F0F; - n *= 0x1010101; - pop += n >> 24; - } - return pop; -} - -int BitMatch41(dword *a, dword *b, int count) -{ - int pop = 0; - while(count--) { - dword n = *a++ & *b++; - n = n - ((n >> 1) & 0x55555555); - n = (n & 0x33333333) + ((n >> 2) & 0x33333333); - n = (n + (n >> 4)) & 0x0F0F0F0F; - n = n + (n >> 8); - n = n + (n >> 16); - pop += n & 31; - } - return pop; -} - -void TestPopCount() -{ - dword a[1024]; - dword b[1024]; - for(int i = 0; i < 500 * 1000; i++) { - for(int q = 0; q < 1024; q++) { - a[q] = MAKELONG(rand(), rand()); - b[q] = MAKELONG(rand(), rand()); - } - if(i % 10000 == 0) - Cout() << i << '\n'; - ASSERT(BitMatch0(a, b, 1024) == BitMatch4(a, b, 1024)); - ASSERT(BitMatch2(a, b, 1024) == BitMatch4(a, b, 1024)); - } -} - -void BenchmarkPopCount() -{ - dword a[1024]; - dword b[1024]; - for(int q = 0; q < 1024; q++) { - a[q] = MAKELONG(rand(), rand()); - b[q] = MAKELONG(rand(), rand()); - } - int cnt = 0; - { - RTIMING("2"); - for(int i = 0; i < 100 * 1000; i++) - cnt += BitMatch2(a, b, 1024); - } - { - RTIMING("4"); - for(int i = 0; i < 100 * 1000; i++) - cnt += BitMatch4(a, b, 1024); - } - RDUMP(cnt); -} - -void GenTable() -{ - String r; - for(int i = 0; i < 65536; i++) { - int n = 0; - for(int j = 0; j < 16; j++) - if(i & (1 << j)) n++; - if((i & 31) == 0) - r << '\n'; - r << n << ','; - } - LOG(r); -} - -CONSOLE_APP_MAIN -{ -// TestPopCount(); return; - BenchmarkPopCount(); -} - diff --git a/uppdev/bitcnt/bitcnt.upp b/uppdev/bitcnt/bitcnt.upp deleted file mode 100644 index cb52f7d0a..000000000 --- a/uppdev/bitcnt/bitcnt.upp +++ /dev/null @@ -1,10 +0,0 @@ -uses - Core; - -file - bitcnt.cpp, - table.cpp; - -mainconfig - "" = ""; - diff --git a/uppdev/bitcnt/init b/uppdev/bitcnt/init deleted file mode 100644 index 099544c8d..000000000 --- a/uppdev/bitcnt/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _bitcnt_icpp_init_stub -#define _bitcnt_icpp_init_stub -#include "Core/init" -#endif diff --git a/uppdev/bitcnt/table.cpp b/uppdev/bitcnt/table.cpp deleted file mode 100644 index a1c23c1fd..000000000 --- a/uppdev/bitcnt/table.cpp +++ /dev/null @@ -1,2050 +0,0 @@ -unsigned char sPop16__[] = { - 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5, - 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, - 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14,11,12,12,13,12,13,13,14,12,13,13,14,13,14,14,15, - 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14,11,12,12,13,12,13,13,14,12,13,13,14,13,14,14,15, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14,11,12,12,13,12,13,13,14,12,13,13,14,13,14,14,15, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14,11,12,12,13,12,13,13,14,12,13,13,14,13,14,14,15, - 4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8,5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14,11,12,12,13,12,13,13,14,12,13,13,14,13,14,14,15, - 5,6,6,7,6,7,7,8,6,7,7,8,7,8,8,9,6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14,11,12,12,13,12,13,13,14,12,13,13,14,13,14,14,15, - 6,7,7,8,7,8,8,9,7,8,8,9,8,9,9,10,7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14,11,12,12,13,12,13,13,14,12,13,13,14,13,14,14,15, - 7,8,8,9,8,9,9,10,8,9,9,10,9,10,10,11,8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14,11,12,12,13,12,13,13,14,12,13,13,14,13,14,14,15, - 8,9,9,10,9,10,10,11,9,10,10,11,10,11,11,12,9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14,11,12,12,13,12,13,13,14,12,13,13,14,13,14,14,15, - 9,10,10,11,10,11,11,12,10,11,11,12,11,12,12,13,10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14, - 10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14,11,12,12,13,12,13,13,14,12,13,13,14,13,14,14,15, - 10,11,11,12,11,12,12,13,11,12,12,13,12,13,13,14,11,12,12,13,12,13,13,14,12,13,13,14,13,14,14,15, - 11,12,12,13,12,13,13,14,12,13,13,14,13,14,14,15,12,13,13,14,13,14,14,15,13,14,14,15,14,15,15,16, -}; diff --git a/uppdev/brc/bin.brc b/uppdev/brc/bin.brc deleted file mode 100644 index 28519ef09..000000000 --- a/uppdev/brc/bin.brc +++ /dev/null @@ -1,3 +0,0 @@ -BINARY(bin_cpp, "bin.cpp" BZ2) -BINARY(bin_brc, "bin.brc" BZ2) -BINARY_MASK(bin_all, "bin.*" BZ2) diff --git a/uppdev/brc/bin.cpp b/uppdev/brc/bin.cpp deleted file mode 100644 index ee4b4a7cc..000000000 --- a/uppdev/brc/bin.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include -#include "bin.brc" -#include - -using namespace Upp; - -//** - -CONSOLE_APP_MAIN -{ - puts(String().Cat() << "brc length: " << bin_brc_length); - fflush(stdout); - puts(String().Cat() << "cpp length: " << bin_cpp_length); - fflush(stdout); - puts(String().Cat() << "all count: " << bin_all_count); - fflush(stdout); -// puts(String().Cat() << "cpp: <<<\n" << (const char *)bin_cpp << "\n>>>"); - MemReadStream in1(bin_cpp, bin_cpp_length); - puts(String().Cat() << "cpp: <<<\n" << BZ2Decompress(in1) << "\n>>>"); - fflush(stdout); -// puts(String().Cat() << "brc: <<<\n" << (const char *)bin_brc << "\n>>>"); - MemReadStream in2(bin_brc, bin_brc_length); - puts(String().Cat() << "brc: <<<\n" << BZ2Decompress(in2) << "\n>>>"); - fflush(stdout); - for(int i = 0; i < bin_all_count; i++) { - puts(String().Cat() << "all length[" << i << "]: " << bin_all_length[i]); - fflush(stdout); - puts(String().Cat() << "all files[" << i << "]: " << bin_all_files[i]); - fflush(stdout); - puts(String().Cat() << "all[" << i << "]: <<<\n" << BZ2Decompress(String(bin_all[i], bin_all_length[i])) << "\n>>>"); - fflush(stdout); - } -} diff --git a/uppdev/brc/brc.brc b/uppdev/brc/brc.brc deleted file mode 100644 index edd4b050b..000000000 --- a/uppdev/brc/brc.brc +++ /dev/null @@ -1,2 +0,0 @@ -BINARY(rodina_macro, "macro.txt") -BINARY(rodina_typ, "zapis.typ") diff --git a/uppdev/brc/brc.cpp b/uppdev/brc/brc.cpp deleted file mode 100644 index 0906ff443..000000000 --- a/uppdev/brc/brc.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include - -#include "brc.brc" - -CONSOLE_APP_MAIN -{ - String s = (char *)rodina_macro; - DUMP(s.GetLength()); - DUMP(rodina_macro_length); - DUMP(s); -} diff --git a/uppdev/brc/brc.upp b/uppdev/brc/brc.upp deleted file mode 100644 index a4b6d665e..000000000 --- a/uppdev/brc/brc.upp +++ /dev/null @@ -1,15 +0,0 @@ -description "Including binary data into application"; - -uses - Core, - plugin\bz2; - -file - ship.usc, - bin.cpp, - bin.brc - depends() bin.cpp; - -mainconfig - "" = ""; - diff --git a/uppdev/brc/macro.txt b/uppdev/brc/macro.txt deleted file mode 100644 index cf6556700..000000000 --- a/uppdev/brc/macro.txt +++ /dev/null @@ -1,12 +0,0 @@ -ANONE A "Ano", N "Ne" - -ZPS NE "Ne", TP "TP", ZTP "ZTP", ZTPP "ZTP/P" - -STDNAVRH ^ - ^ - ; - deti; - CJ "slo jednac" text +; - ZNACKA "Nae znaka" text; - OTEC "Otec" osoba OTEC; - MATKA "Matka" osoba MATKA diff --git a/uppdev/brc/ship.usc b/uppdev/brc/ship.usc deleted file mode 100644 index f92bf221d..000000000 --- a/uppdev/brc/ship.usc +++ /dev/null @@ -1,13 +0,0 @@ -macro "Ship" Ctrl+Shift+W { - ClearConsole(); - cout("Building BRC..."); - if(!Build("")) - cout("Error building BRC."); - else { - cout("Shipping BRC..."); - if(!BuildProject("BRC/ship", "")) - cout("Error shipping BRC."); - else - cout("Build finished successfully."); - } -} diff --git a/uppdev/brc/ship/ship.brc b/uppdev/brc/ship/ship.brc deleted file mode 100644 index 8a6ef2d7c..000000000 --- a/uppdev/brc/ship/ship.brc +++ /dev/null @@ -1 +0,0 @@ -BINARY(BRC, "d:/temp/brc.exe" BZ2) diff --git a/uppdev/brc/ship/ship.cpp b/uppdev/brc/ship/ship.cpp deleted file mode 100644 index bf84a25b3..000000000 --- a/uppdev/brc/ship/ship.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include - -using namespace Upp; - -#include "ship.brc" - -CONSOLE_APP_MAIN -{ - puts("Unpacking BRC.exe..."); - MemReadStream in(BRC, BRC_length); - if(!SaveFile("BRC.exe", BZ2Decompress(in))) - puts("Error unpacking file!"); -} diff --git a/uppdev/brc/ship/ship.upp b/uppdev/brc/ship/ship.upp deleted file mode 100644 index 03c0a1155..000000000 --- a/uppdev/brc/ship/ship.upp +++ /dev/null @@ -1,12 +0,0 @@ -description "Using binary data for installation"; - -uses - plugin\bz2; - -file - ship.cpp, - ship.brc; - -mainconfig - "" = ""; - diff --git a/uppdev/brc/simplebin.brc b/uppdev/brc/simplebin.brc deleted file mode 100644 index a9fbce973..000000000 --- a/uppdev/brc/simplebin.brc +++ /dev/null @@ -1,5 +0,0 @@ -BINARY(source, "simplebin.cpp") -BINARY(binsrc, "simplebin.brc") -BINARY_ARRAY(array, 0, "simplebin.cpp") -BINARY_ARRAY(array, 1, "simplebin.brc") -BINARY_ARRAY(array, 2, "simplebin.upp") diff --git a/uppdev/brc/simplebin.cpp b/uppdev/brc/simplebin.cpp deleted file mode 100644 index 9faf73961..000000000 --- a/uppdev/brc/simplebin.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include - -#include "simplebin.brc" - -CONSOLE_APP_MAIN -{ - puts(NFormat("source (%d) = %s...%s", source_length, String(source, 20), String(source + source_length - 20, 20))); - puts(NFormat("binsrc (%d) = %s...%s", binsrc_length, String(binsrc, 20), String(binsrc + binsrc_length - 20, 20))); - puts(NFormat("array_count = %d", array_count)); - for(int i = 0; i < array_count; i++) - puts(NFormat("array[%d] (%d) = %s...%s", i, array_length[i], String(array[i], 20), String(array[i] + array_length[i] - 20, 20))); -} diff --git a/uppdev/brc/zapis.typ b/uppdev/brc/zapis.typ deleted file mode 100644 index f0a74302f..000000000 --- a/uppdev/brc/zapis.typ +++ /dev/null @@ -1,103 +0,0 @@ -@ZAZNAM "Sociln zznam" _ - "Sociln zznam: <>, <>, otec: <>, matka: <>" - ^ -; -osoby; -update; -PRIJETI "Datum pijet do pe" date today; -/* -OTEC_ZAM "Zamstnn otce" text +; -MATKA_ZAM "Zamstnn matky" text; -OTEC_AZAM " adresa zamstmavatele" text +; -MATKA_AZAM " adresa zamstmavatele" text; -OTEC_DUCH " poivatel dchodu" list ##ANONE = N +; -MATKA_DUCH " poivatel dchodu" list ##ANONE = N; -OTEC_ZPS " ZPS" list ##ZPS = NE +; -MATKA_ZPS " ZPS" list ##ZPS = NE; -*/ - -@UKON "Zznam o konu" _ - ^ - ^ -; - -@ZAPIS "Jin zpis" _ - "<>" -; -POPIS "Popis zpisu" text; - -@NAVRH "Nvrh" _ - "Nvrh na <>" - NAVRH "Nvrh" -; -deti; -ZNACKA "Nae znaka" text; -OTEC "Otec" osoba OTEC; -MATKA "Matka" osoba MATKA; -POPIS "Nvrh na" text; - -@VYCHOVAVYZIVA "Uren vchovy a vivy" VV ##STDNAVRH; -@NEPROVDANAMATKA "Uren vivnho pro neprovdanou matku" VV ##STDNAVRH; -@EXEKUCE "Exekuce" VV ##STDNAVRH; -@URCENIVYZIVNEHO "Uren vivnho" VV ##STDNAVRH; -@SNIZENIVYZIVNEHO "Snen vivnho" VV ##STDNAVRH; -@VVROZVOD "Uren vchovy a vivy po rozvodu" VV ##STDNAVRH; -@ZMENAVYCHOVY "Zmna vchovy" VV ##STDNAVRH; -@ZRUSENIVYZIVNEHO "Zruen vivnho" VV ##STDNAVRH; -@ZVYSENIVYZIVNEHO "Zven vivnho" VV ##STDNAVRH; - -@POPRENIOTCOVSTVI "Popen otcovstv" VZTAH ##STDNAVRH; -@URCENIOTCOVSTVI "Uren otcovstv" VZTAH ##STDNAVRH; -@ZMENAPRIJMENI "Zmna pjmen" VZTAH ##STDNAVRH; - -@MIMOSOUDNISTYK "Mimosoudn dohoda o styku" STYK ##STDNAVRH; -@NAVRHSTYK "pravu styku" STYK ##STDNAVRH; - -@PROTOKOLOSVOJENI "Protokol o osvojeni" VZTAH - ^ - ^ -; -deti; -OSVOJITEL "Osvojitel" osoba; -MATKA "Matka" osoba MATKA; -OTEC "Otec" osoba OTEC; - -@OSVOJENI "Osvojeni manelem matky" VZTAH - "Nvrh na osvojeni: <>, otec: <>, navrhovatel: <>" - ^ -; -deti; -NAVRHOVATEL "Navrhovatel" osoba; -MATKA "Matka" osoba MATKA; -OTEC "Otec" osoba OTEC; - - -@NARIZENIDOHLEDU "Nazen dohledu" DOHLED ##STDNAVRH; -@POUSTAV "PO a stavn pe" DOHLED ##STDNAVRH; -@POZMENA "PO a zmna vchovy" DOHLED ##STDNAVRH; -@PO "PO" DOHLED ##STDNAVRH; -@NEMOCNICE "Proputn do pe matky" DOHLED ##STDNAVRH; - -@REJSTRIK_SVERENYCH "Rejstk dt svench do vchovy jin fyzick osob ne rodie" REJSTRIK - "Rejstk svench dt: Datum pijet: <>: <>, odpovdn osoba: <>" -; -rejstrik "{{1:1:1:2:1:1:2:1:2:2:1:1 " - "Poadov slo:: Datum zpisu:: Spisov znaka OM" - ":: Jmno a pjmen dtte:: Rodn slo:: Forma pe" - ":: Jmno a pjmen odpovdn osoby (pbuzensk vztah):: Rodn slo odpovdn osoby" - ":: Msto trvalho pobytu:: Oznaen orgnu&.j. rozhodnut&datum pr. moci" - ":: Datum pijet dtte do pe:: Datum ukonen pe", - "<>:: <>:: <>:: <>:: <>:: <>:: <> " - ":: <>:: <>:: <>&<>&<>:: <>:: <>" - PRIJETI UKONCENI -; -DITE "Dt" osoba DITE; -FORMA "Forma pe" text; -OSOBA "Odpovdn osoba" osoba; -ADRESA " msto trvalho pobytu" adresa auto; -VZTAH "Pbuzensk vztah" text; -ORGAN "Oznaen orgnu" text; -CJ ".j. rozhodnuti" text +; -NPM "Datum prvn moci" date; -PRIJETI "Datum pijet do pe" date; -UKONCENI "Datum ukonen pe" date; diff --git a/uppdev/bsr/bsr.cpp b/uppdev/bsr/bsr.cpp deleted file mode 100644 index ec1e627a2..000000000 --- a/uppdev/bsr/bsr.cpp +++ /dev/null @@ -1,220 +0,0 @@ -#include - -using namespace Upp; - -#pragma intrinsic(_BitScanForward) - -uint16 g_sqrt_table[1024] = //----------g_sqrt_table -{ - 0, - 2048,2896,3547,4096,4579,5017,5418,5793,6144,6476,6792,7094,7384,7663,7932,8192,8444, - 8689,8927,9159,9385,9606,9822,10033,10240,10443,10642,10837,11029,11217,11403,11585, - 11765,11942,12116,12288,12457,12625,12790,12953,13114,13273,13430,13585,13738,13890, - 14040,14189,14336,14482,14626,14768,14910,15050,15188,15326,15462,15597,15731,15864, - 15995,16126,16255,16384,16512,16638,16764,16888,17012,17135,17257,17378,17498,17618, - 17736,17854,17971,18087,18203,18318,18432,18545,18658,18770,18882,18992,19102,19212, - 19321,19429,19537,19644,19750,19856,19961,20066,20170,20274,20377,20480,20582,20684, - 20785,20886,20986,21085,21185,21283,21382,21480,21577,21674,21771,21867,21962,22058, - 22153,22247,22341,22435,22528,22621,22713,22806,22897,22989,23080,23170,23261,23351, - 23440,23530,23619,23707,23796,23884,23971,24059,24146,24232,24319,24405,24491,24576, - 24661,24746,24831,24915,24999,25083,25166,25249,25332,25415,25497,25580,25661,25743, - 25824,25905,25986,26067,26147,26227,26307,26387,26466,26545,26624,26703,26781,26859, - 26937,27015,27092,27170,27247,27324,27400,27477,27553,27629,27705,27780,27856,27931, - 28006,28081,28155,28230,28304,28378,28452,28525,28599,28672,28745,28818,28891,28963, - 29035,29108,29180,29251,29323,29394,29466,29537,29608,29678,29749,29819,29890,29960, - 30030,30099,30169,30238,30308,30377,30446,30515,30583,30652,30720,30788,30856,30924, - 30992,31059,31127,31194,31261,31328,31395,31462,31529,31595,31661,31727,31794,31859, - 31925,31991,32056,32122,32187,32252,32317,32382,32446,32511,32575,32640,32704,32768, - 32832,32896,32959,33023,33086,33150,33213,33276,33339,33402,33465,33527,33590,33652, - 33714,33776,33839,33900,33962,34024,34086,34147,34208,34270,34331,34392,34453,34514, - 34574,34635,34695,34756,34816,34876,34936,34996,35056,35116,35176,35235,35295,35354, - 35413,35472,35531,35590,35649,35708,35767,35825,35884,35942,36001,36059,36117,36175, - 36233,36291,36348,36406,36464,36521,36578,36636,36693,36750,36807,36864,36921,36978, - 37034,37091,37147,37204,37260,37316,37372,37429,37485,37540,37596,37652,37708,37763, - 37819,37874,37929,37985,38040,38095,38150,38205,38260,38315,38369,38424,38478,38533, - 38587,38642,38696,38750,38804,38858,38912,38966,39020,39073,39127,39181,39234,39287, - 39341,39394,39447,39500,39553,39606,39659,39712,39765,39818,39870,39923,39975,40028, - 40080,40132,40185,40237,40289,40341,40393,40445,40497,40548,40600,40652,40703,40755, - 40806,40857,40909,40960,41011,41062,41113,41164,41215,41266,41317,41368,41418,41469, - 41519,41570,41620,41671,41721,41771,41821,41871,41922,41972,42021,42071,42121,42171, - 42221,42270,42320,42369,42419,42468,42518,42567,42616,42665,42714,42763,42813,42861, - 42910,42959,43008,43057,43105,43154,43203,43251,43300,43348,43396,43445,43493,43541, - 43589,43637,43685,43733,43781,43829,43877,43925,43972,44020,44068,44115,44163,44210, - 44258,44305,44352,44400,44447,44494,44541,44588,44635,44682,44729,44776,44823,44869, - 44916,44963,45009,45056,45103,45149,45195,45242,45288,45334,45381,45427,45473,45519, - 45565,45611,45657,45703,45749,45795,45840,45886,45932,45977,46023,46069,46114,46160, - 46205,46250,46296,46341,46386,46431,46477,46522,46567,46612,46657,46702,46746,46791, - 46836,46881,46926,46970,47015,47059,47104,47149,47193,47237,47282,47326,47370,47415, - 47459,47503,47547,47591,47635,47679,47723,47767,47811,47855,47899,47942,47986,48030, - 48074,48117,48161,48204,48248,48291,48335,48378,48421,48465,48508,48551,48594,48637, - 48680,48723,48766,48809,48852,48895,48938,48981,49024,49067,49109,49152,49195,49237, - 49280,49322,49365,49407,49450,49492,49535,49577,49619,49661,49704,49746,49788,49830, - 49872,49914,49956,49998,50040,50082,50124,50166,50207,50249,50291,50332,50374,50416, - 50457,50499,50540,50582,50623,50665,50706,50747,50789,50830,50871,50912,50954,50995, - 51036,51077,51118,51159,51200,51241,51282,51323,51364,51404,51445,51486,51527,51567, - 51608,51649,51689,51730,51770,51811,51851,51892,51932,51972,52013,52053,52093,52134, - 52174,52214,52254,52294,52334,52374,52414,52454,52494,52534,52574,52614,52654,52694, - 52734,52773,52813,52853,52892,52932,52972,53011,53051,53090,53130,53169,53209,53248, - 53287,53327,53366,53405,53445,53484,53523,53562,53601,53640,53679,53719,53758,53797, - 53836,53874,53913,53952,53991,54030,54069,54108,54146,54185,54224,54262,54301,54340, - 54378,54417,54455,54494,54532,54571,54609,54647,54686,54724,54762,54801,54839,54877, - 54915,54954,54992,55030,55068,55106,55144,55182,55220,55258,55296,55334,55372,55410, - 55447,55485,55523,55561,55599,55636,55674,55712,55749,55787,55824,55862,55900,55937, - 55975,56012,56049,56087,56124,56162,56199,56236,56273,56311,56348,56385,56422,56459, - 56497,56534,56571,56608,56645,56682,56719,56756,56793,56830,56867,56903,56940,56977, - 57014,57051,57087,57124,57161,57198,57234,57271,57307,57344,57381,57417,57454,57490, - 57527,57563,57599,57636,57672,57709,57745,57781,57817,57854,57890,57926,57962,57999, - 58035,58071,58107,58143,58179,58215,58251,58287,58323,58359,58395,58431,58467,58503, - 58538,58574,58610,58646,58682,58717,58753,58789,58824,58860,58896,58931,58967,59002, - 59038,59073,59109,59144,59180,59215,59251,59286,59321,59357,59392,59427,59463,59498, - 59533,59568,59603,59639,59674,59709,59744,59779,59814,59849,59884,59919,59954,59989, - 60024,60059,60094,60129,60164,60199,60233,60268,60303,60338,60373,60407,60442,60477, - 60511,60546,60581,60615,60650,60684,60719,60753,60788,60822,60857,60891,60926,60960, - 60995,61029,61063,61098,61132,61166,61201,61235,61269,61303,61338,61372,61406,61440, - 61474,61508,61542,61576,61610,61644,61678,61712,61746,61780,61814,61848,61882,61916, - 61950,61984,62018,62051,62085,62119,62153,62186,62220,62254,62287,62321,62355,62388, - 62422,62456,62489,62523,62556,62590,62623,62657,62690,62724,62757,62790,62824,62857, - 62891,62924,62957,62991,63024,63057,63090,63124,63157,63190,63223,63256,63289,63323, - 63356,63389,63422,63455,63488,63521,63554,63587,63620,63653,63686,63719,63752,63785, - 63817,63850,63883,63916,63949,63982,64014,64047,64080,64113,64145,64178,64211,64243, - 64276,64309,64341,64374,64406,64439,64471,64504,64536,64569,64601,64634,64666,64699, - 64731,64763,64796,64828,64861,64893,64925,64957,64990,65022,65054,65086,65119,65151, - 65183,65215,65247,65279,65312,65344,65376,65408,65440,65472,65504 -}; - - -int8 g_elder_bit_table[256] = //---------g_elder_bit_table -{ - 0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 -}; - -unsigned fast_sqrt(unsigned val) -{ - unsigned t = val; - int bit=0; - unsigned shift = 11; - - bit = t >> 24; - if(bit) - { - bit = g_elder_bit_table[bit] + 24; - } - else - { - bit = (t >> 16) & 0xFF; - if(bit) - { - bit = g_elder_bit_table[bit] + 16; - } - else - { - bit = (t >> 8) & 0xFF; - if(bit) - { - bit = g_elder_bit_table[bit] + 8; - } - else - { - bit = g_elder_bit_table[t]; - } - } - } - - //This code calculates the sqrt. - bit -= 9; - if(bit > 0) - { - bit = (bit >> 1) + (bit & 1); - shift -= bit; - val >>= (bit << 1); - } - return g_sqrt_table[val] >> shift; -} - -unsigned fast_sqrt2(unsigned val) -{ - unsigned long bit=0; - unsigned shift = 11; - - _BitScanReverse(&bit, val); -/* if(bit) - { - bit = g_elder_bit_table[bit] + 24; - } - else - { - bit = (t >> 16) & 0xFF; - if(bit) - { - bit = g_elder_bit_table[bit] + 16; - } - else - { - bit = (t >> 8) & 0xFF; - if(bit) - { - bit = g_elder_bit_table[bit] + 8; - } - else - { - bit = g_elder_bit_table[t]; - } - } - } -*/ - //This code calculates the sqrt. - bit -= 9; - if(bit > 0) - { - bit = (bit >> 1) + (bit & 1); - shift -= bit; - val >>= (bit << 1); - } - return g_sqrt_table[val] >> shift; -} - -CONSOLE_APP_MAIN -{ - int x = 0; - double dx = 0; - for(int i = 0; i < 100; i++) { - { - RTIMING("Fast2"); - for(int i = 0; i < 100000; i++) - x += fast_sqrt2(i); - } - { - RTIMING("Fast"); - for(int i = 0; i < 100000; i++) - x += fast_sqrt(i); - } - { - RTIMING("Normal"); - for(double i = 0; i < 100000.0; i++) - dx += sqrt(i); - } - } - RDUMP(x); - RDUMP(dx); - return; - unsigned long mask = 0x1000; - unsigned long index; - unsigned char isNonzero; - - for(;;) { - Cout() << "Enter a positive integer as the mask: " << '\n'; - mask = atoi(ReadStdIn()); - isNonzero = _BitScanForward(&index, mask); - if (isNonzero) - Cout() << "Mask: " << mask << " Index: " << index << '\n'; - else - Cout() << "No set bits found. Mask is zero."; - } -} diff --git a/uppdev/bsr/bsr.upp b/uppdev/bsr/bsr.upp deleted file mode 100644 index 1d99d8e8d..000000000 --- a/uppdev/bsr/bsr.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - Core; - -file - bsr.cpp; - -mainconfig - "" = ""; - diff --git a/uppdev/captures/captures.cpp b/uppdev/captures/captures.cpp deleted file mode 100644 index 69a8aec74..000000000 --- a/uppdev/captures/captures.cpp +++ /dev/null @@ -1,74 +0,0 @@ -#include -#include "resource.h" - -LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - PAINTSTRUCT ps; - HDC hdc; - - - switch (message) - { - case WM_PAINT: - hdc = BeginPaint(hWnd, &ps); - - /* Put your drawing code here */ - - EndPaint(hWnd, &ps); - break; - - case WM_DESTROY: - PostQuitMessage(0); - break; - - default: - return DefWindowProc(hWnd, message, wParam, lParam); - } - return 0; -} - -extern "C" __declspec(dllimport) int capture_screen(int x, int y, int cx, int cy, char *filename); - -int APIENTRY WinMain(HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPSTR lpCmdLine, - int nCmdShow) -{ - capture_screen(100, 100, 400, 200, "u:/test.jpg"); - - - WNDCLASSEX wcex; - - wcex.cbSize = sizeof(WNDCLASSEX); - - wcex.style = CS_HREDRAW | CS_VREDRAW; - wcex.lpfnWndProc = (WNDPROC) WndProc; - wcex.cbClsExtra = 0; - wcex.cbWndExtra = 0; - wcex.hInstance = hInstance; - wcex.hCursor = LoadCursor(NULL, IDC_ARROW); - wcex.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); - wcex.lpszMenuName = 0; - wcex.lpszClassName = "UPPW32APP"; - - if(RegisterClassEx(&wcex) == 0) - return FALSE; - - HWND hWnd = CreateWindow(wcex.lpszClassName, "Ultimate application", WS_OVERLAPPEDWINDOW, - CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, - NULL, NULL, hInstance, NULL); - if(!hWnd) - return FALSE; - - ShowWindow(hWnd, nCmdShow); - UpdateWindow(hWnd); - - MSG msg; - while(GetMessage(&msg, NULL, 0, 0)) - { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - - return msg.wParam; -} diff --git a/uppdev/captures/captures.rc b/uppdev/captures/captures.rc deleted file mode 100644 index 2bacc52d9..000000000 --- a/uppdev/captures/captures.rc +++ /dev/null @@ -1,5 +0,0 @@ -#include "resource.h" -#include - - - diff --git a/uppdev/captures/captures.upp b/uppdev/captures/captures.upp deleted file mode 100644 index 9b0c14eee..000000000 --- a/uppdev/captures/captures.upp +++ /dev/null @@ -1,13 +0,0 @@ -library - u:\capture_screen.lib; - -library(WIN32) "kernel32 user32 advapi32 shell32 winmm"; - -file - resource.h, - captures.rc, - captures.cpp; - -mainconfig - "" = "GUI"; - diff --git a/uppdev/captures/init b/uppdev/captures/init deleted file mode 100644 index 6ad4bedab..000000000 --- a/uppdev/captures/init +++ /dev/null @@ -1,3 +0,0 @@ -#ifndef _captures_icpp_init_stub -#define _captures_icpp_init_stub -#endif diff --git a/uppdev/captures/resource.h b/uppdev/captures/resource.h deleted file mode 100644 index 99a809136..000000000 --- a/uppdev/captures/resource.h +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/uppdev/cdburn/burn.cpp b/uppdev/cdburn/burn.cpp deleted file mode 100644 index bdd001e77..000000000 --- a/uppdev/cdburn/burn.cpp +++ /dev/null @@ -1,238 +0,0 @@ -#include - -#include -#include -#include -#include // shell objects like ICDBurn - -struct ShellCDBurn : IRef { - ShellCDBurn() { - LogResult(Create(CLSID_CDBurn, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER)); - } -}; - -ICDBurn *CreateICDBurn() -{ - ICDBurn *p; - return SUCCEEDED(CoCreateInstance(CLSID_CDBurn, NULL, - CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_ICDBurn, (PVOID *) &p)) ? p : NULL; -} - -bool ShellBurnCD(HWND hwnd = NULL) -{ - ICDBurn *p = CreateICDBurn(); - if(!p) - return false; - bool b = SUCCEEDED(p->Burn(hwnd)); - p->Release(); - return b; -} - -String GetRecordableDriveLetter() -{ - ICDBurn *p = CreateICDBurn(); - if(!p) - return Null; - String ret; - BOOL b = FALSE; - WCHAR d[100]={0}; - if(SUCCEEDED(p->HasRecordableDrive(&b)) && b && SUCCEEDED(p->GetRecorderDriveLetter(d, 32))) - ret = WString(d).ToString(); - p->Release(); - return ret; -} - -String GetShellBurnFolderPath() { - TCHAR path[MAX_PATH]={0}; - return SUCCEEDED(SHGetSpecialFolderPath(NULL, path, CSIDL_CDBURN_AREA, FALSE)) ? WString(path).ToString() : Null; -} - -#include "Wininet.h" - -int UploadFile(const String& url, const String& filename, const String& data) { - INTERNET_BUFFERS BufferIn = {0}; - INTERNET_BUFFERS BufferOut = {0}; - BufferIn.dwStructSize = sizeof( INTERNET_BUFFERS ); - BufferOut.dwStructSize = sizeof( INTERNET_BUFFERS ); - - HINTERNET hINet = InternetOpen("U++", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); - if(!hINet) - return GetLastError(); - - int error = 0; - - HINTERNET hConnect = InternetConnect(hINet, url, INTERNET_DEFAULT_HTTPS_PORT, - NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); - HINTERNET hRequest = NULL; - - if(hConnect) { - for(;;) { - if(!hRequest) - hRequest = HttpOpenRequest(hConnect, "PUT", filename, NULL, NULL, NULL, - INTERNET_FLAG_NO_CACHE_WRITE|INTERNET_FLAG_SECURE| - INTERNET_FLAG_IGNORE_CERT_CN_INVALID, - 0); -// ------------------- - DWORD dwFlags; - DWORD dwBuffLen; - InternetQueryOption(hRequest, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID)&dwFlags, &dwBuffLen); - dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA; - InternetSetOption(hRequest, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, sizeof (dwFlags) ); -// ------------------- - if(hRequest && HttpSendRequest(hRequest, NULL, 0, (void*)~data, data.GetLength())) - break; - error = GetLastError(); - if(error == ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED || - error == ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR || - error == ERROR_INTERNET_INCORRECT_PASSWORD || - error == ERROR_INTERNET_INVALID_CA || - error == ERROR_INTERNET_POST_IS_NON_SECURE || - error == ERROR_INTERNET_SEC_CERT_CN_INVALID || - error == ERROR_INTERNET_SEC_CERT_DATE_INVALID) { - if(InternetErrorDlg(::GetDesktopWindow(), hRequest, error, - FLAGS_ERROR_UI_FILTER_FOR_ERRORS | - FLAGS_ERROR_UI_FLAGS_GENERATE_DATA | - FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS, - NULL ) == ERROR_CANCELLED) { - break; - } - else - error = 0; - } - else - break; - } - } - else - error = GetLastError(); - - if(hRequest) - InternetCloseHandle(hRequest); - if(hConnect) - InternetCloseHandle(hConnect); - InternetCloseHandle(hINet); - return error; -} - -String InternetErrorMsg(int error) -{ - static struct { - const char *text; - int error; - } - err[] = { - { "INTERNET_OUT_OF_HANDLES", (INTERNET_ERROR_BASE + 1) }, - { "INTERNET_TIMEOUT", (INTERNET_ERROR_BASE + 2) }, - { "INTERNET_EXTENDED_ERROR", (INTERNET_ERROR_BASE + 3) }, - { "INTERNET_INTERNAL_ERROR", (INTERNET_ERROR_BASE + 4) }, - { "INTERNET_INVALID_URL", (INTERNET_ERROR_BASE + 5) }, - { "INTERNET_UNRECOGNIZED_SCHEME", (INTERNET_ERROR_BASE + 6) }, - { "INTERNET_NAME_NOT_RESOLVED", (INTERNET_ERROR_BASE + 7) }, - { "INTERNET_PROTOCOL_NOT_FOUND", (INTERNET_ERROR_BASE + 8) }, - { "INTERNET_INVALID_OPTION", (INTERNET_ERROR_BASE + 9) }, - { "INTERNET_BAD_OPTION_LENGTH", (INTERNET_ERROR_BASE + 10) }, - { "INTERNET_OPTION_NOT_SETTABLE", (INTERNET_ERROR_BASE + 11) }, - { "INTERNET_SHUTDOWN", (INTERNET_ERROR_BASE + 12) }, - { "INTERNET_INCORRECT_USER_NAME", (INTERNET_ERROR_BASE + 13) }, - { "INTERNET_INCORRECT_PASSWORD", (INTERNET_ERROR_BASE + 14) }, - { "INTERNET_LOGIN_FAILURE", (INTERNET_ERROR_BASE + 15) }, - { "INTERNET_INVALID_OPERATION", (INTERNET_ERROR_BASE + 16) }, - { "INTERNET_OPERATION_CANCELLED", (INTERNET_ERROR_BASE + 17) }, - { "INTERNET_INCORRECT_HANDLE_TYPE", (INTERNET_ERROR_BASE + 18) }, - { "INTERNET_INCORRECT_HANDLE_STATE", (INTERNET_ERROR_BASE + 19) }, - { "INTERNET_NOT_PROXY_REQUEST", (INTERNET_ERROR_BASE + 20) }, - { "INTERNET_REGISTRY_VALUE_NOT_FOUND", (INTERNET_ERROR_BASE + 21) }, - { "INTERNET_BAD_REGISTRY_PARAMETER", (INTERNET_ERROR_BASE + 22) }, - { "INTERNET_NO_DIRECT_ACCESS", (INTERNET_ERROR_BASE + 23) }, - { "INTERNET_NO_CONTEXT", (INTERNET_ERROR_BASE + 24) }, - { "INTERNET_NO_CALLBACK", (INTERNET_ERROR_BASE + 25) }, - { "INTERNET_REQUEST_PENDING", (INTERNET_ERROR_BASE + 26) }, - { "INTERNET_INCORRECT_FORMAT", (INTERNET_ERROR_BASE + 27) }, - { "INTERNET_ITEM_NOT_FOUND", (INTERNET_ERROR_BASE + 28) }, - { "INTERNET_CANNOT_CONNECT", (INTERNET_ERROR_BASE + 29) }, - { "INTERNET_CONNECTION_ABORTED", (INTERNET_ERROR_BASE + 30) }, - { "INTERNET_CONNECTION_RESET", (INTERNET_ERROR_BASE + 31) }, - { "INTERNET_FORCE_RETRY", (INTERNET_ERROR_BASE + 32) }, - { "INTERNET_INVALID_PROXY_REQUEST", (INTERNET_ERROR_BASE + 33) }, - { "INTERNET_NEED_UI", (INTERNET_ERROR_BASE + 34) }, - { "INTERNET_HANDLE_EXISTS", (INTERNET_ERROR_BASE + 36) }, - { "INTERNET_SEC_CERT_DATE_INVALID", (INTERNET_ERROR_BASE + 37) }, - { "INTERNET_SEC_CERT_CN_INVALID", (INTERNET_ERROR_BASE + 38) }, - { "INTERNET_HTTP_TO_HTTPS_ON_REDIR", (INTERNET_ERROR_BASE + 39) }, - { "INTERNET_HTTPS_TO_HTTP_ON_REDIR", (INTERNET_ERROR_BASE + 40) }, - { "INTERNET_MIXED_SECURITY", (INTERNET_ERROR_BASE + 41) }, - { "INTERNET_CHG_POST_IS_NON_SECURE", (INTERNET_ERROR_BASE + 42) }, - { "INTERNET_POST_IS_NON_SECURE", (INTERNET_ERROR_BASE + 43) }, - { "INTERNET_CLIENT_AUTH_CERT_NEEDED", (INTERNET_ERROR_BASE + 44) }, - { "INTERNET_INVALID_CA", (INTERNET_ERROR_BASE + 45) }, - { "INTERNET_CLIENT_AUTH_NOT_SETUP", (INTERNET_ERROR_BASE + 46) }, - { "INTERNET_ASYNC_THREAD_FAILED", (INTERNET_ERROR_BASE + 47) }, - { "INTERNET_REDIRECT_SCHEME_CHANGE", (INTERNET_ERROR_BASE + 48) }, - { "INTERNET_DIALOG_PENDING", (INTERNET_ERROR_BASE + 49) }, - { "INTERNET_RETRY_DIALOG", (INTERNET_ERROR_BASE + 50) }, - { "INTERNET_HTTPS_HTTP_SUBMIT_REDIR", (INTERNET_ERROR_BASE + 52) }, - { "INTERNET_INSERT_CDROM", (INTERNET_ERROR_BASE + 53) }, - { "INTERNET_FORTEZZA_LOGIN_NEEDED", (INTERNET_ERROR_BASE + 54) }, - { "INTERNET_SEC_CERT_ERRORS", (INTERNET_ERROR_BASE + 55) }, - { "INTERNET_SEC_CERT_NO_REV", (INTERNET_ERROR_BASE + 56) }, - { "INTERNET_SEC_CERT_REV_FAILED", (INTERNET_ERROR_BASE + 57) }, - { "FTP_TRANSFER_IN_PROGRESS", (INTERNET_ERROR_BASE + 110) }, - { "FTP_DROPPED", (INTERNET_ERROR_BASE + 111) }, - { "FTP_NO_PASSIVE_MODE", (INTERNET_ERROR_BASE + 112) }, - { "GOPHER_PROTOCOL_ERROR", (INTERNET_ERROR_BASE + 130) }, - { "GOPHER_NOT_FILE", (INTERNET_ERROR_BASE + 131) }, - { "GOPHER_DATA_ERROR", (INTERNET_ERROR_BASE + 132) }, - { "GOPHER_END_OF_DATA", (INTERNET_ERROR_BASE + 133) }, - { "GOPHER_INVALID_LOCATOR", (INTERNET_ERROR_BASE + 134) }, - { "GOPHER_INCORRECT_LOCATOR_TYPE", (INTERNET_ERROR_BASE + 135) }, - { "GOPHER_NOT_GOPHER_PLUS", (INTERNET_ERROR_BASE + 136) }, - { "GOPHER_ATTRIBUTE_NOT_FOUND", (INTERNET_ERROR_BASE + 137) }, - { "GOPHER_UNKNOWN_LOCATOR", (INTERNET_ERROR_BASE + 138) }, - { "HTTP_HEADER_NOT_FOUND", (INTERNET_ERROR_BASE + 150) }, - { "HTTP_DOWNLEVEL_SERVER", (INTERNET_ERROR_BASE + 151) }, - { "HTTP_INVALID_SERVER_RESPONSE", (INTERNET_ERROR_BASE + 152) }, - { "HTTP_INVALID_HEADER", (INTERNET_ERROR_BASE + 153) }, - { "HTTP_INVALID_QUERY_REQUEST", (INTERNET_ERROR_BASE + 154) }, - { "HTTP_HEADER_ALREADY_EXISTS", (INTERNET_ERROR_BASE + 155) }, - { "HTTP_REDIRECT_FAILED", (INTERNET_ERROR_BASE + 156) }, - { "HTTP_NOT_REDIRECTED", (INTERNET_ERROR_BASE + 160) }, - { "HTTP_COOKIE_NEEDS_CONFIRMATION", (INTERNET_ERROR_BASE + 161) }, - { "HTTP_COOKIE_DECLINED", (INTERNET_ERROR_BASE + 162) }, - { "HTTP_REDIRECT_NEEDS_CONFIRMATION", (INTERNET_ERROR_BASE + 168) }, - { "INTERNET_SECURITY_CHANNEL_ERROR", (INTERNET_ERROR_BASE + 157) }, - { "INTERNET_UNABLE_TO_CACHE_FILE", (INTERNET_ERROR_BASE + 158) }, - { "INTERNET_TCPIP_NOT_INSTALLED", (INTERNET_ERROR_BASE + 159) }, - { "INTERNET_DISCONNECTED", (INTERNET_ERROR_BASE + 163) }, - { "INTERNET_SERVER_UNREACHABLE", (INTERNET_ERROR_BASE + 164) }, - { "INTERNET_PROXY_SERVER_UNREACHABLE", (INTERNET_ERROR_BASE + 165) }, - { "INTERNET_BAD_AUTO_PROXY_SCRIPT", (INTERNET_ERROR_BASE + 166) }, - { "INTERNET_UNABLE_TO_DOWNLOAD_SCRIPT", (INTERNET_ERROR_BASE + 167) }, - { "INTERNET_SEC_INVALID_CERT", (INTERNET_ERROR_BASE + 169) }, - { "INTERNET_SEC_CERT_REVOKED", (INTERNET_ERROR_BASE + 170) }, - { "INTERNET_FAILED_DUETOSECURITYCHECK", (INTERNET_ERROR_BASE + 171) }, - { "INTERNET_NOT_INITIALIZED", (INTERNET_ERROR_BASE + 172) }, - { "INTERNET_NEED_MSN_SSPI_PKG", (INTERNET_ERROR_BASE + 173) }, - { "INTERNET_LOGIN_FAILURE_DISPLAY_ENTITY_BODY", (INTERNET_ERROR_BASE + 174) }, - }; - String x = AsString(error); - for(int i = 0; i < __countof(err); i++) - if(err[i].error == error) - return x + ": "+ err[i].text; - return x; -}; - -GUI_APP_MAIN -{ - CoInitialize(NULL); -/* PromptOK(DeQtf(GetShellBurnFolderPath()) + "&" + - DeQtf(GetRecordableDriveLetter())); - SaveFile(AppendFileName(GetShellBurnFolderPath(), "test.txt"), "Hello!"); - ShellBurnCD(); -*/ - - int err = UploadFile("localhost", "/dotazniky/rsa_c.txt", LoadFile("d:/rsa_c.txt")); - DUMP(err); - PromptOK(InternetErrorMsg(err)); - - CoUninitialize(); -} diff --git a/uppdev/cdburn/cdburn.upp b/uppdev/cdburn/cdburn.upp deleted file mode 100644 index 63e90a641..000000000 --- a/uppdev/cdburn/cdburn.upp +++ /dev/null @@ -1,13 +0,0 @@ -uses - CtrlLib, - Ole; - -library "comsupp.lib"; - -library "wininet.lib"; - -file - burn.cpp; - -mainconfig - "" = "GUI ST"; diff --git a/uppdev/ceditor/ceditor.upp b/uppdev/ceditor/ceditor.upp deleted file mode 100644 index 59c78cd45..000000000 --- a/uppdev/ceditor/ceditor.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - CodeEditor; - -file - main.cpp; - -mainconfig - "" = "GUI"; - diff --git a/uppdev/ceditor/init b/uppdev/ceditor/init deleted file mode 100644 index 0c7d3915c..000000000 --- a/uppdev/ceditor/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _ceditor_icpp_init_stub -#define _ceditor_icpp_init_stub -#include "CodeEditor/init" -#endif diff --git a/uppdev/ceditor/main.cpp b/uppdev/ceditor/main.cpp deleted file mode 100644 index 3148ba14d..000000000 --- a/uppdev/ceditor/main.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include - -using namespace Upp; - -GUI_APP_MAIN { - TopWindow win; - CodeEditor editor; - - editor <<= LoadFile("C:/u/highlight/uppsrc/CodeEditor/CodeEditor.cpp"); - editor.Highlight(CodeEditor::HIGHLIGHT_CPP); - - win.Add(editor.SizePos()); - win.Run(); -} \ No newline at end of file diff --git a/uppdev/cekas/cekas.upp b/uppdev/cekas/cekas.upp deleted file mode 100644 index 1eb958080..000000000 --- a/uppdev/cekas/cekas.upp +++ /dev/null @@ -1,2 +0,0 @@ -file - D:\test.html charset "iso8859-2"; diff --git a/uppdev/chn-convert/ChineseCodeLib.cpp b/uppdev/chn-convert/ChineseCodeLib.cpp deleted file mode 100644 index 459f46b0d..000000000 --- a/uppdev/chn-convert/ChineseCodeLib.cpp +++ /dev/null @@ -1,135 +0,0 @@ -// ChineseCodeLib.cpp: implementation of the CChineseCodeLib class. -// -////////////////////////////////////////////////////////////////////// - -#include "stdafx.h" -#include "ChineseCodeLib.h" - -////////////////////////////////////////////////////////////////////// -// Construction/Destruction -////////////////////////////////////////////////////////////////////// - -CChineseCodeLib::CChineseCodeLib() -{ - -} - -CChineseCodeLib::~CChineseCodeLib() -{ - -} - - -void CChineseCodeLib::UTF_8ToUnicode(WCHAR* pOut,char *pText) -{ - char* uchar = (char *)pOut; - - uchar[1] = ((pText[0] & 0x0F) << 4) + ((pText[1] >> 2) & 0x0F); - uchar[0] = ((pText[1] & 0x03) << 6) + (pText[2] & 0x3F); - - return; -} - -void CChineseCodeLib::UnicodeToGB2312(char* pOut,unsigned short uData) -{ - WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(WCHAR),NULL,NULL); - return; -} - -void CChineseCodeLib::Gb2312ToUnicode(WCHAR* pOut,char *gbBuffer) -{ - ::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1); - return; -} - -void CChineseCodeLib::UnicodeToUTF_8(char* pOut,WCHAR* pText) -{ - // note: WCHAR first lower byte then higher byte ע WCHARߵֵ˳,ֽǰֽں - char* pchar = (char *)pText; - - pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4)); - pOut[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6); - pOut[2] = (0x80 | (pchar[0] & 0x3F)); - - return; -} - -void CChineseCodeLib::GB2312ToUTF_8(CString& pOut,char *pText, int pLen) -{ - char buf[4]; - char *rst = new char[pLen / 2 * 3]; - - memset(buf,0,4); - memset(rst,0,pLen + (pLen >> 2) + 2); - - int i = 0; - int j = 0; - while(i < pLen) - { - //if it is English,copy it ӢֱӸƾͿ - if( *(pText + i) >= 0) - { - rst[j++] = pText[i++]; - } - else - { - WCHAR pbuffer; - Gb2312ToUnicode(&pbuffer,pText+i); - - UnicodeToUTF_8(buf,&pbuffer); - - unsigned short int tmp = 0; - tmp = rst[j] = buf[0]; - tmp = rst[j+1] = buf[1]; - tmp = rst[j+2] = buf[2]; - - - j += 3; - i += 2; - } - } - rst[j] = '\0'; - - //ؽ - pOut = rst; - delete []rst; - - return; -} - -void CChineseCodeLib::UTF_8ToGB2312(CString &pOut, char *pText, int pLen) -{ - char * newBuf = new char[pLen]; - char Ctemp[4]; - memset(Ctemp,0,4); - - int i =0; - int j = 0; - - while(i < pLen) - { - if(pText[i] > 0) - { - newBuf[j++] = pText[i++]; - } - else - { - WCHAR Wtemp; - UTF_8ToUnicode(&Wtemp,pText + i); - - UnicodeToGB2312(Ctemp,Wtemp); - - newBuf[j] = Ctemp[0]; - newBuf[j + 1] = Ctemp[1]; - - i += 3; - j += 2; - } - } - newBuf[j] = '\0'; - - pOut = newBuf; - delete []newBuf; - - return; -} diff --git a/uppdev/chn-convert/ChineseCodeLib.h b/uppdev/chn-convert/ChineseCodeLib.h deleted file mode 100644 index 4dbf41f5a..000000000 --- a/uppdev/chn-convert/ChineseCodeLib.h +++ /dev/null @@ -1,37 +0,0 @@ -// ChineseCodeLib.h: interface for the CChineseCodeLib class. -// -////////////////////////////////////////////////////////////////////// -#include -using namespace std; - -/* -functionconvert Chinese GB2312 between UTF-8 -Authorlitz -Email:mycro@163.com -referenceMr.WuKang's ArticalUTF-8GB2312֮Ļ -http://www.vckbase.com/document/viewdoc/?id=1397 -*/ - - -#if !defined(__CCHINESECODELIB_H_) -#define __CCHINESECODELIB_H_ - -class CChineseCodeLib -{ -public: - static void UTF_8ToGB2312(CString& pOut,char *pText, int pLen); - static void GB2312ToUTF_8(CString& pOut,char *pText, int pLen); - // Unicode to UTF-8 - static void UnicodeToUTF_8(char* pOut,WCHAR* pText); - // GB2312 to Unicode - static void Gb2312ToUnicode(WCHAR* pOut,char *gbBuffer); - // Unicode to GB2312 - static void UnicodeToGB2312(char* pOut,unsigned short uData); - // UTF-8 to Unicode - static void UTF_8ToUnicode(WCHAR* pOut,char* pText); - - CChineseCodeLib(); - virtual ~CChineseCodeLib(); -}; - -#endif // !defined(__CCHINESECODELIB_H_) diff --git a/uppdev/chrset/chrset.h b/uppdev/chrset/chrset.h deleted file mode 100644 index a6177c6a3..000000000 --- a/uppdev/chrset/chrset.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef _chrset_chrset_h -#define _chrset_chrset_h - -#include - -#define LAYOUTFILE -#include - - - -class chrset : public WithchrsetLayout { -public: - typedef chrset CLASSNAME; - chrset(); -}; - -#endif diff --git a/uppdev/chrset/chrset.lay b/uppdev/chrset/chrset.lay deleted file mode 100644 index 26318e0ba..000000000 --- a/uppdev/chrset/chrset.lay +++ /dev/null @@ -1,5 +0,0 @@ -LAYOUT(chrsetLayout, 200, 100) - ITEM(Label, lbl1, LeftPosZ(20, 84).TopPosZ(8, 19)) - ITEM(Label, lbl2, LeftPosZ(20, 84).TopPosZ(32, 19)) - ITEM(Label, lbl3, LeftPosZ(20, 84).TopPosZ(56, 19)) -END_LAYOUT diff --git a/uppdev/chrset/chrset.upp b/uppdev/chrset/chrset.upp deleted file mode 100644 index a197625d1..000000000 --- a/uppdev/chrset/chrset.upp +++ /dev/null @@ -1,10 +0,0 @@ -uses - CtrlLib; - -file - chrset.h, - main.cpp charset "UTF-8", - chrset.lay; - -mainconfig - "" = "GUI"; diff --git a/uppdev/chrset/main.cpp b/uppdev/chrset/main.cpp deleted file mode 100644 index 6b46f48f3..000000000 --- a/uppdev/chrset/main.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "chrset.h" - - - -chrset::chrset() -{ - CtrlLayout(*this, "Window title"); - lbl1 = "řeřicha česky"; - lbl2 = "Революция"; - lbl3 = "∑€∂¼œđ"; -} - -GUI_APP_MAIN -{ - DUMP((int)GetDefaultCharset()); - SetDefaultCharset(CHARSET_UTF8); - chrset().Run(); -} diff --git a/uppdev/chtest1123/chtest1123.upp b/uppdev/chtest1123/chtest1123.upp deleted file mode 100644 index 5872304d3..000000000 --- a/uppdev/chtest1123/chtest1123.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - CtrlLib; - -file - main.cpp; - -mainconfig - "" = "GUI"; - diff --git a/uppdev/chtest1123/main.cpp b/uppdev/chtest1123/main.cpp deleted file mode 100644 index db19f5f69..000000000 --- a/uppdev/chtest1123/main.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include - -using namespace Upp; - -struct App : public TopWindow -{ - virtual void Paint(Draw& w) - { - w.DrawRect(GetSize(), White()); - ChPaint(w, GetSize(), Button::StyleScroll().look[0]); - } - - App() - { - } -}; - -GUI_APP_MAIN -{ - App().Run(); -} diff --git a/uppdev/cjk/cjk.upp b/uppdev/cjk/cjk.upp deleted file mode 100644 index 5872304d3..000000000 --- a/uppdev/cjk/cjk.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - CtrlLib; - -file - main.cpp; - -mainconfig - "" = "GUI"; - diff --git a/uppdev/cjk/main.cpp b/uppdev/cjk/main.cpp deleted file mode 100644 index 96849234b..000000000 --- a/uppdev/cjk/main.cpp +++ /dev/null @@ -1,24 +0,0 @@ -#include - -using namespace Upp; - -struct MyApp : TopWindow { - virtual void Paint(Draw& w) { - w.DrawRect(GetSize(), White); - w.DrawText(10, 10, "ultimate++是一个性能优良的C++GUI库"); - w.DrawText(10, 100, "X\357\274\214X"); - WString h("x\357\274\214X"); - w.DrawText(10, 150, h); - DDUMP(h.GetLength()); - } -}; - -GUI_APP_MAIN -{ - DDUMP(WString("\357\274\214")[0]); - DDUMP(WString("X\357\274\214X")); -// for(int i = 0; i < Font::GetFaceCount(); i++) -// LOG(Font::GetFaceName(i)); - MyApp().Run(); -} - diff --git a/uppdev/cmdsrv/cmdsrv.cpp b/uppdev/cmdsrv/cmdsrv.cpp deleted file mode 100644 index c80451bad..000000000 --- a/uppdev/cmdsrv/cmdsrv.cpp +++ /dev/null @@ -1,79 +0,0 @@ -#include - -using namespace Upp; - -#define APP_VERSION "1.0.r1" -#define APP_DATE Date(2005, 2, 22) - -CONSOLE_APP_MAIN -{ - HttpServer server; - int next_id = 0; - server.Logging(); - - Vector cmd; - cmd <<= CommandLine(); - int port = 1536; - if(cmd.GetCount() >= 1) - port = Nvl(ScanInt(cmd[0]), port); - - if(!server.Open(port)) { - puts(Socket::GetErrorText()); - return; - } - - for(;;) { - server.Wait(10000); - if(server.IsError()) { - puts("Server error: " + Socket::GetErrorText()); - puts("Reopening socket..."); - fflush(stdout); - if(!server.Reopen()) - { - puts("Reopen on server socket failed: " + Socket::GetErrorText()); - return; - } - } - fputs(NFormat("\rserver(%d) running at %`", port, GetSysTime()), stdout); - fflush(stdout); - One request = server.GetRequest(); - puts("GetRequest\n"); - if(!request) - continue; - puts("GotRequest\n"); - HttpQuery query = request->GetQuery(); - String header, body; - int items = query.GetInt("ITEMS", 0, 100000, 10); - String svr = query.GetString("SVR"); - Htmls image_page; - int i; - image_page << - "CMDSRV, version " << APP_VERSION << ", release date: " << Format(APP_DATE) << "
\n" - "Copyright © 2005 Tomas Rylek

\n" - "CMDSRV parameters: <port number, default = 1536>

\n" - "Current parameters: cmdsrv " << port << "

\n" - "items (" << FormatInt(items) << ") = number of output lines to generate (default = 10)
\n" - "svr (" << (IsNull(svr) ? "empty" : "" + svr + "") - << ") = identifier for generated output lines (default = test)
\n" - "Example: http://localhost"; - String wisapi = GetFileName(query.GetString("$$WISAPI")); - String sample_query; - sample_query << "items=" << minmax(2 * items, 10, 100000) << "&svr=A"; - if(!IsNull(wisapi)) - image_page << "/dir/" << wisapi << "?"; - else - image_page << ':' << port << "/" << "any?"; - image_page << sample_query << "

\n"; - for(i = 0; i < items; i++) - image_page << "Line #" << (i + 1) << ", svr=" << UrlEncode(svr) << "
\n"; - image_page << "

\n" - "Current request:
\n"; - for(i = 0; i < query.GetCount(); i++) - image_page << ToHtml(query.GetKey(i)) << "=" << ToHtml(query.GetValue(i)) << "
\n"; - - header = HttpContentType(HttpTextHtml(CHARSET_WIN1252)); - body = HtmlTitlePage("Simple text HTTP server", image_page); - request->Write(header, body); - request.Clear(); - } -} diff --git a/uppdev/cmdsrv/cmdsrv.upp b/uppdev/cmdsrv/cmdsrv.upp deleted file mode 100644 index 3f1e85d76..000000000 --- a/uppdev/cmdsrv/cmdsrv.upp +++ /dev/null @@ -1,11 +0,0 @@ -description "Simple HTTP text server"; - -uses - Web; - -file - cmdsrv.cpp; - -mainconfig - "" = ""; - diff --git a/uppdev/coff/uld/diff b/uppdev/coff/uld/diff deleted file mode 100644 index 9147f33f9..000000000 --- a/uppdev/coff/uld/diff +++ /dev/null @@ -1,128 +0,0 @@ --------- linkjob.cpp -[B] linkjob.err(117): 1 lines inserted - +verbose = false; -[B] linkjob.err(266): 1 lines inserted - +"-verbose .. display additional link information\n" -[B] linkjob.err(487): 2 lines inserted - +else if(lcmd == "verbose") - +verbose = true; -[B] linkjob.err(682): 2 lines inserted - +if(verbose) - +PutConsole(NFormat("%s: loading object file", file)); -[B] linkjob.err(697): 2 lines inserted - +if(verbose) - +PutConsole(NFormat("%s: loading static library", file)); -[B] linkjob.err(886): 2 lines inserted - +if(verbose) - +PutConsole(NFormat("%s: loading shared library", file)); -[B] linkjob.err(1998): 2 lines inserted - +else if(sec_atom == rsrc_atom) - +sx = GRP_RSRC; -[A] linkjob.cpp(2072): 7 lines deleted - -int last = groups[i + 1].first_section - 1; - -const Section& lastsec = section_map[last]; - -// const ObjectFile::Section& oflast = GetSection(lastsec.obj_sec); - -while(last >= first && section_map[last].obj_sec.section == 0) - -last--; - -const Section *rawsec = (last >= first ? §ion_map[last] : NULL); - -// const ObjectFile::Section& ofsec = GetSection(sec.obj_sec); -[A] linkjob.cpp(2081): 1 lines replaced - -groups[i].raw_size = rawsec ? rawsec->rva + GetSection(rawsec->obj_sec).size - sec.rva : 0; -[B] linkjob.err(2086): 22 replacement lines - +int last = groups[i + 1].first_section - 1; - +if(last >= first) - +{ - +const Section& lastsec = section_map[last]; - +// if(i != GRP_UDATA) - +{ - +// const ObjectFile::Section& oflast = GetSection(lastsec.obj_sec); - +/* - +while(last >= first) - +{ - +const ObjectFile::Section& ofsec = GetSection(section_map[last].obj_sec); - +if(ofsec.offset) - +break; - +last--; - +} - +const Section *rawsec = (last >= first ? §ion_map[last] : NULL); - +*/ - +// const ObjectFile::Section& ofsec = GetSection(sec.obj_sec); - +// groups[i].raw_size = rawsec ? rawsec->rva + GetSection(rawsec->obj_sec).size - sec.rva : 0; - +groups[i].raw_size = lastsec.rva + GetSection(lastsec.obj_sec).size - sec.rva; - +rfa = (rfa + groups[i].raw_size + file_align - 1) & -file_align; - +} -[A] linkjob.cpp(2083): 1 lines replaced - -rfa = (rfa + groups[i].raw_size + file_align - 1) & -file_align; -[B] linkjob.err(2109): 1 replacement lines - +} -[A] linkjob.cpp(2492): 1 lines replaced - -sechdr.SizeOfRawData = 0; -[B] linkjob.err(2518): 3 replacement lines - +// sechdr.SizeOfRawData = (first.group == GRP_UDATA ? 0 : (sechdr.Misc.VirtualSize + file_align - 1) & -file_align); - +sechdr.SizeOfRawData = (sechdr.Misc.VirtualSize + file_align - 1) & -file_align; - +/* -[A] linkjob.cpp(2496): 1 lines replaced - -if(chk.obj_sec.section != 0) -[B] linkjob.err(2524): 2 replacement lines - +const ObjectFile::Section& ofsec = GetSection(chk.obj_sec); - +if(ofsec.offset) -[A] linkjob.cpp(2498): 1 lines deleted - -const ObjectFile::Section& ofsec = GetSection(chk.obj_sec); -[B] linkjob.err(2531): 2 lines inserted - +sechdr.SizeOfRawData = (sechdr.SizeOfRawData + file_align - 1) & -file_align; - +*/ -[A] linkjob.cpp(2527): 1 lines replaced - -stab.Misc.VirtualSize = stab.SizeOfRawData = output_stab_info.GetCount(); -[B] linkjob.err(2557): 2 replacement lines - +stab.Misc.VirtualSize = output_stab_info.GetCount(); - +stab.SizeOfRawData = (stab.Misc.VirtualSize + file_align - 1) & -file_align; -[A] linkjob.cpp(2540): 1 lines replaced - -stabstr.Misc.VirtualSize = stabstr.SizeOfRawData = output_stab_strings.GetCount(); -[B] linkjob.err(2571): 2 replacement lines - +stabstr.Misc.VirtualSize = output_stab_strings.GetCount(); - +stabstr.SizeOfRawData = (stabstr.Misc.VirtualSize + file_align - 1) & -file_align; -[A] linkjob.cpp(2554): 1 lines replaced - -sym.Misc.VirtualSize = sym.SizeOfRawData = coff_output_symbols.GetCount() * sizeof(COFF_IMAGE_SYMBOL) -[B] linkjob.err(2586): 1 replacement lines - +sym.Misc.VirtualSize = coff_output_symbols.GetCount() * sizeof(COFF_IMAGE_SYMBOL) -[B] linkjob.err(2588): 1 lines inserted - +sym.SizeOfRawData = (sym.Misc.VirtualSize + file_align - 1) & -file_align; -[A] linkjob.cpp(2570): 1 lines replaced - -reloc.Misc.VirtualSize = reloc.SizeOfRawData = output_fixups.GetCount(); -[B] linkjob.err(2603): 2 replacement lines - +reloc.Misc.VirtualSize = output_fixups.GetCount(); - +reloc.SizeOfRawData = (reloc.Misc.VirtualSize + file_align - 1) & -file_align; -[B] linkjob.err(2722): 1 lines inserted - +if(verbose) -[B] linkjob.err(3087): 5 lines inserted - +const ObjectFile::Section& ofsec = GetSection(sec.obj_sec); - +// if(/*ofsec.type == ObjectFile::SEC_INULL ||*/ sec.group == GRP_UDATA) - +// continue; - +if(ofsec.type == ObjectFile::SEC_ANON_COMDAT) - +continue; -[A] linkjob.cpp(3053): 3 lines deleted - -const ObjectFile::Section& ofsec = GetSection(sec.obj_sec); - -if(/*ofsec.type == ObjectFile::SEC_INULL ||*/ ofsec.type == ObjectFile::SEC_ANON_COMDAT) - -continue; -[A] linkjob.cpp(3058): 1 lines deleted - -if(ofsec.offset) -[A] linkjob.cpp(3393): 7 lines replaced - -case GRP_CODE: return "CODE"; - -case GRP_RDATA: return "RDATA"; - -case GRP_EDATA: return "EDATA"; - -case GRP_IDATA: return "IDATA"; - -case GRP_DATA: return "DATA"; - -case GRP_UDATA: return "BSS"; - -case GRP_DEBUG: return "DEBUG"; -[B] linkjob.err(3429): 11 replacement lines - +case GRP_CODE: return "CODE"; - +case GRP_RDATA: return "RDATA"; - +case GRP_EDATA: return "EDATA"; - +case GRP_IDATA: return "IDATA"; - +case GRP_DATA: return "DATA"; - +case GRP_UDATA: return "BSS"; - +case GRP_DEBUG: return "DEBUG"; - +case GRP_RSRC: return "RSRC"; - +case GRP_STAB: return "STAB"; - +case GRP_STABSTR: return "STABSTR"; - +case GRP_SYMBOLS: return "SYMBOLS"; diff --git a/uppdev/coff/uld/dump.cpp b/uppdev/coff/uld/dump.cpp deleted file mode 100644 index 0c56552ed..000000000 --- a/uppdev/coff/uld/dump.cpp +++ /dev/null @@ -1,231 +0,0 @@ -#include "uld.h" -#pragma hdrstop - -class FileDump -{ -public: - FileDump() : dump_stabs(false), dump_globals(false) {} - - void Run(const char *fn); - -private: - void RunCOFF(); - void RunSymbols(int symoff, int symcnt); - void RunStab(int staboff, int stablen, int stroff, int strlen); - -private: - String filename; - FileMapping mapping; - int ne_offset; - bool dump_stabs; - bool dump_globals; -}; - -void FileDump::RunSymbols(int symoff, int symcnt) -{ - const COFF_IMAGE_SYMBOL *sym = (COFF_IMAGE_SYMBOL *)&mapping[symoff]; - const COFF_IMAGE_SYMBOL *end = sym + symcnt; - const char *strtbl = (const char *)end; - puts(NFormat("Global symbol table (%d entries)", symcnt)); - puts("Sect Value Type Cl Name"); - for(; sym < end; sym++) - { - puts(NFormat("%4>04x %08x %04x %02x %s", - sym->SectionNumber, (int)sym->Value, sym->Type, sym->StorageClass, COFFSymbolName(*sym, strtbl))); - if(sym->NumberOfAuxSymbols) - { - if(sym->StorageClass == COFF_IMAGE_SYM_CLASS_FILE) - puts(NFormat("\tFile: %s", (const char *)(sym + 1))); - } - sym += sym->NumberOfAuxSymbols; - } -} - -void FileDump::RunStab(int staboff, int stablen, int stabstroff, int stabstrlen) -{ - int entries = stablen / STAB_STABSIZE; - puts(NFormat("STAB debug info (%d entries)", entries)); - const STAB_INFO *info = (const STAB_INFO *)&mapping[staboff]; - const char *str = (const char *)&mapping[stabstroff]; - int counts[256], sizes[256]; - ZeroArray(counts); - ZeroArray(sizes); - int strtotal = 0; - static VectorMap old_histogram; - VectorMap histogram; - for(int i = 0; i < entries; i++, info++) - { - counts[info->type]++; - int sl = strlen(str + info->strdx) + 1; - sizes[info->type] += sl; - strtotal += sl; - puts(NFormat("%06x %02x %02x %04x %08x %s", - i, info->type, info->other, info->desc, info->value, str + info->strdx)); - String hentry = NFormat("%02x %02x %04x %08x %s", info->type, info->other, info->desc, 0/*info->value*/, str + info->strdx); - histogram.GetAdd(hentry, 0)++; - } - puts(NFormat("%d B, compressed %d B = %d%%", - strtotal, stabstrlen, 100 * (1 - stabstrlen / double(max(strtotal, 1))))); - for(NOMSC6(int) i = 0; i < 256; i++) - if(counts[i]) - puts(NFormat("[%02x]: %6>d times, %8>d B", i, counts[i], sizes[i])); - puts("\nHistogram:"); - Vector order = GetSortOrder(histogram.GetValues(), StdGreater()); - for(NOMSC6(int) i = 0; i < order.GetCount(); i++) - puts(NFormat("%4>d * %s", histogram[order[i]], histogram.GetKey(order[i]))); - if(!old_histogram.IsEmpty()) - { - puts("\nDifferential histogram:"); - VectorMap diff; - diff <<= histogram; - for(int i = 0; i < old_histogram.GetCount(); i++) - diff.GetAdd(old_histogram.GetKey(i), 0) -= old_histogram[i]; - for(NOMSC6(int) i = diff.GetCount(); --i >= 0;) - if(!diff[i]) - diff.Remove(i); - order = GetSortOrder(diff.GetValues(), StdGreater()); - for(NOMSC6(int) i = 0; i < order.GetCount(); i++) - { - String key = diff.GetKey(order[i]); - puts(NFormat("(%4>d) %4>~d <- %4>~d * %s", diff[order[i]], histogram.Get(key, Null), old_histogram.Get(key, Null), key)); - } - } - old_histogram = histogram; -} - -void FileDump::RunCOFF() -{ - const COFF_IMAGE_FILE_HEADER *hdr = (const COFF_IMAGE_FILE_HEADER *)&mapping[ne_offset + 4]; - puts(NFormat("File: %s", filename)); - puts(NFormat("File size: %d B", mapping.GetLength())); - const MachineInfo *mach = COFFMachineList(); - while(mach->name && mach->code != hdr->Machine) - mach++; - puts(NFormat("Machine: 0x%04x (%s)", hdr->Machine, mach->name)); - puts(NFormat("NumberOfSections: %d", hdr->NumberOfSections)); - time_t stamp = hdr->TimeDateStamp; - puts(NFormat("TimeDateStamp: 0x%08x, (%s)", (int)hdr->TimeDateStamp, asctime(localtime(&stamp)))); - puts(NFormat("PointerToSymbolTable: 0x%08x", (int)hdr->PointerToSymbolTable)); - puts(NFormat("NumberOfSymbols: %d", (int)hdr->NumberOfSymbols)); - puts(NFormat("SizeOfOptionalHeader: %d", hdr->SizeOfOptionalHeader)); - puts(NFormat("Characteristics: 0x%08x", hdr->Characteristics)); - if(hdr->SizeOfOptionalHeader < sizeof(COFF_IMAGE_OPTIONAL_HEADER32)) - return; - - const COFF_IMAGE_OPTIONAL_HEADER32 *opthdr = (const COFF_IMAGE_OPTIONAL_HEADER32 *) - &mapping[ne_offset + 4 + sizeof(COFF_IMAGE_FILE_HEADER)]; - - puts(NFormat("Magic: 0x%08x", opthdr->Magic)); - puts(NFormat("MajorLinkerVersion: %d", opthdr->MajorLinkerVersion)); - puts(NFormat("MinorLinkerVersion: %d", opthdr->MinorLinkerVersion)); - puts(NFormat("SizeOfCode: 0x%08x", (int)opthdr->SizeOfCode)); - puts(NFormat("SizeOfInitializedData: 0x%08x", (int)opthdr->SizeOfInitializedData)); - puts(NFormat("SizeOfUninitializedData: 0x%08x", (int)opthdr->SizeOfUninitializedData)); - puts(NFormat("AddressOfEntryPoint: 0x%08x", (int)opthdr->AddressOfEntryPoint)); - puts(NFormat("BaseOfCode: 0x%08x", (int)opthdr->BaseOfCode)); - puts(NFormat("BaseOfData: 0x%08x", (int)opthdr->BaseOfData)); - puts(NFormat("ImageBase: 0x%08x", (int)opthdr->ImageBase)); - puts(NFormat("SectionAlignment: 0x%08x", (int)opthdr->SectionAlignment)); - puts(NFormat("FileAlignment: 0x%08x", (int)opthdr->FileAlignment)); - puts(NFormat("MajorOperatingSystemVersion: %d", opthdr->MajorOperatingSystemVersion)); - puts(NFormat("MinorOperatingSystemVersion: %d", opthdr->MinorOperatingSystemVersion)); - puts(NFormat("MajorImageVersion: %d", opthdr->MajorImageVersion)); - puts(NFormat("MinorImageVersion: %d", opthdr->MinorImageVersion)); - puts(NFormat("MajorSubsystemVersion: %d", opthdr->MajorSubsystemVersion)); - puts(NFormat("MinorSubsystemVersion: %d", opthdr->MinorSubsystemVersion)); - puts(NFormat("Win32VersionValue: %d", (int)opthdr->Win32VersionValue)); - puts(NFormat("SizeOfImage: 0x%08x", (int)opthdr->SizeOfImage)); - puts(NFormat("SizeOfHeaders: 0x%08x", (int)opthdr->SizeOfHeaders)); - puts(NFormat("CheckSum: 0x%08x", (int)opthdr->CheckSum)); - puts(NFormat("Subsystem: %d", opthdr->Subsystem)); - puts(NFormat("DllCharacteristics: 0x%08x", opthdr->DllCharacteristics)); - puts(NFormat("SizeOfStackReserve: 0x%08x", (int)opthdr->SizeOfStackReserve)); - puts(NFormat("SizeOfStackCommit: 0x%08x", (int)opthdr->SizeOfStackCommit)); - puts(NFormat("SizeOfHeapReserve: 0x%08x", (int)opthdr->SizeOfHeapReserve)); - puts(NFormat("SizeOfHeapCommit: 0x%08x", (int)opthdr->SizeOfHeapCommit)); - puts(NFormat("LoaderFlags: 0x%08x", (int)opthdr->LoaderFlags)); - puts(NFormat("NumberOfRvaAndSizes: %d", (int)opthdr->NumberOfRvaAndSizes)); - const COFF_IMAGE_DATA_DIRECTORY *dir = opthdr->DataDirectory; - puts("Index RVA Size"); - int i; - for(i = 0; i < (int)opthdr->NumberOfRvaAndSizes; i++, dir++) - if(dir->VirtualAddress || dir->Size) - puts(NFormat("0x%02x 0x%08x 0x%08x", i, (int)dir->VirtualAddress, (int)dir->Size)); - const COFF_IMAGE_SECTION_HEADER *sechdr = (const COFF_IMAGE_SECTION_HEADER *)dir; - puts("# Section RVA RFA Size PtrData PtrReloc NumReloc PtrLineNo NumLineNo Char"); - int stab_rfa = 0, stabstr_rfa = 0, stab_len = 0, stabstr_len; - for(i = 0; i < hdr->NumberOfSections; i++, sechdr++) - { - char temp[9]; - temp[8] = 0; - memcpy(temp, sechdr->Name, COFF_IMAGE_SIZEOF_SHORT_NAME); - if(!strcmp(temp, ".stab")) - { - stab_rfa = sechdr->PointerToRawData; - stab_len = sechdr->Misc.VirtualSize; - } - else if(!strcmp(temp, ".stabstr")) - { - stabstr_rfa = sechdr->PointerToRawData; - stabstr_len = sechdr->Misc.VirtualSize; - } - String line; - line - << NFormat("%2VirtualAddress, - (int)sechdr->PointerToRawData, - (int)sechdr->Misc.VirtualSize) - << NFormat("0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x", - (int)sechdr->PointerToRawData, - (int)sechdr->PointerToRelocations, (int)sechdr->NumberOfRelocations, - (int)sechdr->PointerToLinenumbers, (int)sechdr->NumberOfLinenumbers, - (int)sechdr->Characteristics); - puts(line); - } - if(dump_globals && hdr->PointerToSymbolTable) - RunSymbols(hdr->PointerToSymbolTable, hdr->NumberOfSymbols); - if(dump_stabs && stab_rfa > 0 && stabstr_rfa > 0) - RunStab(stab_rfa, stab_len, stabstr_rfa, stabstr_len); -} - -void FileDump::Run(const char *fn) -{ - for(;;) - if(!memicmp(fn, "stab;", 5)) - { - fn += 5; - dump_stabs = true; - } - else if(!memicmp(fn, "global;", 7)) - { - fn += 7; - dump_globals = true; - } - else - break; - filename = fn; - if(!mapping.Open(filename = fn)) - throw Exc("file failed to open"); - if(mapping.GetCount() >= 0x40 && mapping[0] == 'M' && mapping[1] == 'Z' - && (ne_offset = PeekIL(&mapping[0x3C])) >= 0x40 && ne_offset < mapping.GetLength() - && PeekIL(&mapping[ne_offset]) == 'P' + 256 * 'E') - { - RunCOFF(); - return; - } - throw Exc("unknown file format"); -} - -void DumpFile(String fn) -{ - try - { - FileDump().Run(fn); - } - catch(Exc e) - { - throw Exc(NFormat("%s: %s", fn, e)); - } -} diff --git a/uppdev/coff/uld/linkjob.cpp b/uppdev/coff/uld/linkjob.cpp deleted file mode 100644 index 0c0117276..000000000 --- a/uppdev/coff/uld/linkjob.cpp +++ /dev/null @@ -1,3831 +0,0 @@ -#include "uld.h" -#pragma hdrstop - -#include "obj.h" -#include "version.h" - -#define LTIMING(x) // RTIMING(x) -#define LDUMP(x) // RDUMP(x) - -static const byte std_stub[] = -{ - 0x4d, 0x5a, 0x90, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, - 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0e, 0x1f, 0xba, 0x0e, 0x00, 0xb4, 0x09, 0xcd, 0x21, 0xb8, 0x01, 0x4c, 0xcd, 0x21, 0x54, 0x68, - 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, - 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x44, 0x4f, 0x53, 0x20, - 0x6d, 0x6f, 0x64, 0x65, 0x2e, 0x0d, 0x0d, 0x0a, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -String LinkJob::Symbol::ToString() const -{ - return NFormat("OBJ %5>d SEC %5>d VAL %8>d TYP %04x", obj_sec.object, obj_sec.section, value, type); -} - -bool LinkJob::GlobalAddressOrder::operator () (int a, int b) const -{ - const Symbol& ga = linkjob.globals[a], & gb = linkjob.globals[b]; - if(ga.obj_sec.section < 0 || gb.obj_sec.section < 0) { - if(ga.obj_sec.section != gb.obj_sec.section) - return ga.obj_sec.section < gb.obj_sec.section; - return ga.value < gb.value; - } - if(ga.obj_sec.object < 0 || gb.obj_sec.object < 0) { - if(ga.obj_sec.object != gb.obj_sec.object) - return ga.obj_sec.object < gb.obj_sec.object; - return ga.value < gb.value; - } - int seca = linkjob.GetSection(ga.obj_sec).sec_map_index; - int secb = linkjob.GetSection(gb.obj_sec).sec_map_index; - if(seca < 0 || secb < 0) - return seca > secb; - int rva = linkjob.section_map[seca].rva - linkjob.section_map[secb].rva; - if(rva) return rva < 0; - if(ga.value != gb.value) - return ga.value < gb.value; - return langinfo(linkjob[linkjob.globals.GetKey(a)], linkjob[linkjob.globals.GetKey(b)]); -} - -/* -unsigned LinkJob::Stab::GetHashValue() const -{ - CombineHash ch; - ch.Put(::GetHashValue(text)); - ch.Put(MAKELONG(MAKEWORD(type, other), desc)); - ch.Put(value); - ch.Put(fixup.object); - ch.Put(fixup.section); - ch.Put(fileatom); - return ch; -} -*/ - -/* -bool LinkJob::Stab::Equals(const Stab& b) const -{ - return type == b.type && other == b.other - && desc == b.desc && value == b.value - && fixup == b.fixup && text == b.text - && fileatom == b.fileatom; -} -*/ - -/* -void LinkJob::Cache::Serialize(Stream& stream) -{ - stream % library % file % time % offset % size; -} -*/ - -bool LinkJob::Resource::Sort(const Resource& r, const Resource& s) -{ - if(r.type_id != s.type_id) - return r.type_id < s.type_id; - if(r.type != s.type) - return r.type < s.type; - if(r.name_id != s.name_id) - return r.name_id < s.name_id; - if(r.name != s.name) - return r.name < s.name; - return r.lang_id < s.lang_id; -} - -LinkJob::LinkJob() -{ - start_time = msecs(); - -// mangling_style = MANGLING_MSC; - file_align = 0x200; - image_align = 0x1000; - image_base = 0; - image_fixed = false; - force_reloc = false; - stack_reserve = 0x100000; - stack_commit = 0x1000; - heap_reserve = 0x100000; - heap_commit = 0x1000; - ignore_code_alignment = true; - merge_gcc_sections = true; - linkermode = (!CompareNoCase(GetFileTitle(GetExeFilePath()), "link") ? MODE_MSLINK : MODE_GNULD); -#ifdef _DEBUG - dump_flags = DUMP_COMMANDLINE; //DUMP_STAT | DUMP_TIMING; -#else - dump_flags = 0; -#endif -#if defined(CPU_IA32) - machine = COFF_IMAGE_FILE_MACHINE_I386; -#else - machine = COFF_IMAGE_FILE_MACHINE_UNKNOWN; -#endif - write_mapfile = false; - mapfile_stdout = false; - write_xref = false; - debug_info_raw = -1; - debug_info = false; - show_logo = true; - autocollect_crt_only = true; -// cache_objects = false; - cache_object_data = false; - static_libraries = true; - make_dll = false; - verbose = false; - major_version = 1; - minor_version = 1; - auto_dll_base = false; - subsystem = COFF_IMAGE_SUBSYSTEM_DEFAULT; - atoms.Add(Null); - text_atom = Atomize(".text"); - data_atom = Atomize(".data"); - edata_atom = Atomize(".edata"); - crt_atom = Atomize(".CRT"); - ctors_atom = Atomize(".ctors"); - dtors_atom = Atomize(".dtors"); - gcc_except_atom = Atomize(".gcc_except_table"); - CTOR_LIST_atom = Atomize("__CTOR_LIST__"); - _CTOR_LIST_atom = Atomize("___CTOR_LIST__"); - CTOR_LIST_END_atom = Atomize("__CTOR_LIST_END__"); - DTOR_LIST_atom = Atomize("__DTOR_LIST__"); - _DTOR_LIST_atom = Atomize("___DTOR_LIST__"); - DTOR_LIST_END_atom = Atomize("__DTOR_LIST_END__"); - idata_atom = atoms.FindAdd(".idata"); - idata_idesc_atom = atoms.FindAdd(".idata$2"); - idata_inull_atom = atoms.FindAdd(".idata$3"); - idata_iat1_atom = atoms.FindAdd(".idata$4"); - idata_iat2_atom = atoms.FindAdd(".idata$5"); - idata_names_atom = atoms.FindAdd(".idata$6"); - rdata_atom = atoms.FindAdd(".rdata"); - bss_atom = atoms.FindAdd(".bss"); - debug_atom = atoms.FindAdd(".debug"); - drectve_atom = Atomize(".drectve"); - stab_atom = Atomize(".stab"); - stabstr_atom = Atomize(".stabstr"); - rsrc_atom = Atomize(".rsrc"); - AddGlobal(Atomize("__image_base__"), Symbol(Null, 0, COFF_IMAGE_SYM_TYPE_BASE)); - AddGlobal(Atomize("__except_list"), Symbol(ObjSec(0, -1), 0)); - AddGlobal(Atomize("___safe_se_handler_count"), Symbol(ObjSec(0, -1), 2)); - - stab_section = -1; - stabstr_section = -1; - symbol_section = -1; - reloc_section = -1; - has_stabs = false; -// has_symbols = false; -// has_relocs = false; - idata_last = -1; - idata_null_found = false; - - mapping_cache_limit = 100; - - { - ASSERT(objects.GetCount() == OBJ_MARKER); - ObjectFile& of = objects.Add(new ObjectFile(*this, OBJ_MARKER, Null, Null, ObjectFile::INTERNAL, 0, Null, 0)); - of.sections.SetCount(OBJM_COUNT); - static const char *sec_names[] = { "..data", ".data$PSR", ".data$PSR", "..bss", ".~bss" }; - for(int i = 1; i < OBJM_COUNT; i++) { - ObjectFile::Section& sec = of.sections[i]; - sec.name_atom = Atomize(sec_names[i - 1]); - sec.sec_atom = (i < OBJM_BSS_BEGIN ? data_atom : bss_atom); - sec.size = sec.raw_size = 0; - sec.flags = (i < OBJM_BSS_BEGIN ? COFF_IMAGE_SCN_CNT_INITIALIZED_DATA : COFF_IMAGE_SCN_CNT_UNINITIALIZED_DATA) - | (COFF_IMAGE_SCN_MEM_READ | COFF_IMAGE_SCN_MEM_WRITE | COFF_IMAGE_SCN_ALIGN_1BYTES); - sec.type = ObjectFile::SEC_RAW; - sec.autocollect = true; - } - AddGlobal(Atomize("__data_start__"), Symbol(ObjSec(OBJ_MARKER, OBJM_DATA_BEGIN))); - AddGlobal(Atomize("__data_end__"), Symbol(ObjSec(OBJ_MARKER, OBJM_BSS_BEGIN))); - AddGlobal(Atomize("___RUNTIME_PSEUDO_RELOC_LIST__"), Symbol(ObjSec(OBJ_MARKER, OBJM_PSEUDO_RELOC_BEGIN))); - AddGlobal(Atomize("___RUNTIME_PSEUDO_RELOC_LIST_END__"), Symbol(ObjSec(OBJ_MARKER, OBJM_PSEUDO_RELOC_END))); - AddGlobal(Atomize("__bss_start__"), Symbol(ObjSec(OBJ_MARKER, OBJM_BSS_BEGIN))); - AddGlobal(Atomize("__bss_end__"), Symbol(ObjSec(OBJ_MARKER, OBJM_BSS_END))); - } - - { - ASSERT(objects.GetCount() == OBJ_CTOR); - ObjectFile& of = objects.Add(new ObjectFile(*this, OBJ_CTOR, Null, Null, ObjectFile::INTERNAL, 0, Null, 0)); - of.sections.SetCount(OBJC_COUNT); - static const char *sec_names[] = { ".ctors", ".ctors$_end", ".dtors", ".dtors$_end", ".idata$6", ".idata$3" }; - for(int i = 1; i < OBJC_COUNT; i++) { - ObjectFile::Section& sec = of.sections[i]; - sec.name_atom = Atomize(sec_names[i - 1]); - sec.sec_atom = (i >= OBJC_IDATA_HOLE ? idata_atom : data_atom); - sec.size = sec.raw_size = (i == OBJC_IDATA_NULL ? sizeof(COFF_IMAGE_IMPORT_DESCRIPTOR) : 4); - sec.flags = COFF_IMAGE_SCN_CNT_INITIALIZED_DATA - | COFF_IMAGE_SCN_MEM_READ | (i == OBJC_IDATA_NULL ? 0 : COFF_IMAGE_SCN_MEM_WRITE) - | COFF_IMAGE_SCN_ALIGN_4BYTES; - sec.section_data.SetCount(sec.size, i == OBJC_CTOR_BEGIN || i == OBJC_DTOR_BEGIN ? 0xFF : 0x00); - sec.type = ObjectFile::SEC_RAW; - sec.autocollect = true; - } - } - -/* - if(idata_last >= 0 && !idata_null_found) { - ObjectFile& of = objects[idata_last]; - ObjectFile::Section& ofsec = of.sections.Add(); -// ObjectFile::Section& prev = of.sections[of.sections.GetCount() - 2]; - ofsec.name_atom = idata_inull_atom; - ofsec.sec_atom = idata_atom; - ofsec.size = sizeof(COFF_IMAGE_IMPORT_DESCRIPTOR); - ofsec.raw_size = 0; - ofsec.offset = 0; - ofsec.flags = COFF_IMAGE_SCN_CNT_INITIALIZED_DATA - | COFF_IMAGE_SCN_MEM_READ | COFF_IMAGE_SCN_MEM_WRITE; - ofsec.ref_sec_index = of.ref_sections.GetCount(); - ofsec.ref_ext_index = of.ref_externals.GetCount(); - ofsec.sec_map_index = -1; - of.used_any = ofsec.used = true; - ofsec.type = ObjectFile::SEC_INULL; - } -*/ - - AddGlobal(CTOR_LIST_atom, Symbol(ObjSec(OBJ_CTOR, OBJC_CTOR_BEGIN), 0, COFF_IMAGE_SYM_TYPE_CTOR_DTOR)); - AddGlobal(_CTOR_LIST_atom, Symbol(ObjSec(OBJ_CTOR, OBJC_CTOR_BEGIN), 0, COFF_IMAGE_SYM_TYPE_CTOR_DTOR)); - AddGlobal(CTOR_LIST_END_atom, Symbol(ObjSec(OBJ_CTOR, OBJC_CTOR_END), 0, COFF_IMAGE_SYM_TYPE_CTOR_DTOR)); - AddGlobal(DTOR_LIST_atom, Symbol(ObjSec(OBJ_CTOR, OBJC_DTOR_BEGIN), 0, COFF_IMAGE_SYM_TYPE_CTOR_DTOR)); - AddGlobal(_DTOR_LIST_atom, Symbol(ObjSec(OBJ_CTOR, OBJC_DTOR_BEGIN), 0, COFF_IMAGE_SYM_TYPE_CTOR_DTOR)); - AddGlobal(DTOR_LIST_END_atom, Symbol(ObjSec(OBJ_CTOR, OBJC_DTOR_END), 0, COFF_IMAGE_SYM_TYPE_CTOR_DTOR)); - - { - ASSERT(objects.GetCount() == OBJ_EXPORT); - ObjectFile& of = objects.Add(new ObjectFile(*this, OBJ_EXPORT, Null, Null, ObjectFile::INTERNAL, 0, Null, 0)); - of.sections.SetCount(OBJE_COUNT); - static const char *sec_names[] = { ".edata$1dir", ".edata$2adr", ".edata$3ptr", ".edata$4ord", ".edata$5nam" }; - for(int i = 1; i < OBJE_COUNT; i++) { - ObjectFile::Section& sec = of.sections[i]; - sec.name_atom = Atomize(sec_names[i - 1]); - sec.sec_atom = edata_atom; - sec.flags = COFF_IMAGE_SCN_CNT_INITIALIZED_DATA - | COFF_IMAGE_SCN_MEM_READ | COFF_IMAGE_SCN_MEM_WRITE | COFF_IMAGE_SCN_ALIGN_4BYTES; - sec.type = ObjectFile::SEC_RAW; - sec.autocollect = true; - } - } - - { - ASSERT(objects.GetCount() == OBJ_RSRC); - ObjectFile& of = objects.Add(new ObjectFile(*this, OBJ_RSRC, Null, Null, ObjectFile::INTERNAL, 0, Null, 0)); - of.sections.SetCount(OBJR_COUNT); - for(int i = 1; i < OBJR_COUNT; i++) { - ObjectFile::Section& sec = of.sections[i]; - sec.name_atom = Atomize(".rsrc$" + FormatInt(i)); - sec.sec_atom = rsrc_atom; - sec.flags = COFF_IMAGE_SCN_CNT_INITIALIZED_DATA | COFF_IMAGE_SCN_MEM_READ | COFF_IMAGE_SCN_ALIGN_4BYTES; - sec.type = ObjectFile::SEC_RAW; - sec.autocollect = true; - } - } - - output_stab_info.SetCountR(STAB_STABSIZE, 0); - output_stab_strings.SetCountR(1, 0); -} - -String LinkJob::DemangleAtom(int atom) const -{ - return ::DemangleName(atoms[atom], linkermode == MODE_MSLINK ? MANGLING_MSC : MANGLING_GCC); -} - -FileMapping& LinkJob::GetMapping(String filename) -{ - int f = mapping_cache.Find(filename); - if(f >= 0) - return mapping_cache[f].mapping; - if(mapping_cache.GetCount() >= mapping_cache_limit) { - for(int t = 0; t < mapping_cache.GetCount() && mapping_cache.GetCount() >= mapping_cache_limit; t++) - if(mapping_cache[t].lock == 0) - mapping_cache.Remove(t--); - } - One nc = new Cache; - nc->lock = 0; - static FileMapping dummy; - if(!nc->mapping.Open(filename)) - return dummy; - Cache *pc = ~nc; - mapping_cache.Add(filename, -nc); - return pc->mapping; -} - -void LinkJob::LockMapping(String filename) -{ - int f = mapping_cache.Find(filename); - if(f >= 0) - mapping_cache[f].lock++; -} - -void LinkJob::UnlockMapping(String filename) -{ - int f = mapping_cache.Find(filename); - if(f >= 0) - mapping_cache[f].lock--; -} - -void LinkJob::ReadCommand(const char *cmd, bool user) -{ - ReadCommand(SplitCmdArgs(cmd), user); -} - -String LinkJob::Usage() -{ - return String().Cat() - << NFormat("uld COFF linker, version %d.%d.r%d, release date: %`\n%s", - ULD_VERSION_MAJOR, ULD_VERSION_MINOR, ULD_VERSION_RELEASE, ULD_DATE, ULD_COPYRIGHT) << "\n" - "\n" - "Currently supported MS linker-compatible options:\n" - "\n" - "-align:\n" - "-alternatename:= .. define weak external\n" - "-base:\n" - "-debug\n" - "-defaultlib:\n" - "-fixed .. build fixed address executable\n" - "-libpath:\n" - "-machine:\n" - "-map[:]\n" - "-merge:

=
\n" - "-nodefaultlib:\n" - "-disallowlib:\n" - "-entry: .. override default entry point\n" - "-nologo .. suppress startup banner\n" - "-out: .. name of exe file to produce\n" - "-stub: .. file to use as DOS stub\n" - "-subsystem:\n" - "-version:[.] .. DLL version number\n" - "-verbose .. display additional link information\n" - "\n" - "Currently supported GNU LD-compatible options:\n" - "\n" - "-Map " - "--subsystem \n" - "--map-file .. outputs on stdout\n" - "--start-group, --end-group (ignored, automatic)\n" - "--gc-sections (ignored, automatic)\n" - "--major-image-version .. major DLL version\n" - "--minor-image-version .. minor DLL version\n" - "-B \n" - "-e .. override default entry point\n" - "-L \n" - "-l .a>\n" - "-M .. write mapfile on stdout\n" - "-O ### .. optimization level (ignored)\n" - "-o ### .. write output on file ###\n" - "-s .. strip debug information from file\n" - "\n" - "uld-specific options:\n" -// "-nocache .. do not cache link information in helper file\n" -// " (default = on)\n" - "-collectdata .. automatically collect all initialized data\n" - " from any referenced object (default=CRT sections only)\n" - "-aligncode .. honor alignment in code sections (default=off)\n" - "-keepsections .. keep /xxx gcc code COMDAT section names\n" - " (default = convert to .text / .data / .bss)\n" - "-dump:[stab;][global;] .. dump executable\n" - "-dumpcollect .. dump object tree collector output\n" - "-dumpcommand .. dump command line as C string constant\n" - "-dumpdll .. dump exports from loaded dynamic libraries\n" - "-dumpexports .. dump export systems with ordinals\n" - "-dumpfixups .. dump fixups\n" - "-dumpimp .. dump import libraries\n" - "-dumpimplib .. dump contents of loaded import libraries\n" - "-dumpobj .. dump object files\n" - "-dumpobjlib .. dump contents of loaded object libraries\n" - "-dumpresource .. dump parsed resource files\n" - "-dumpsec[:all | :defines] .. dump sections\n" - " / all contributions / all contrib's + defined symbols\n" - "-dumpstabs .. dump output stabs\n" - "-dumpstabtypes .. dump stab collector output\n" - "-dumpstat .. dump general linking statistics\n" - "-dumptime .. dump linker phase timing\n" - "-mapall .. write all symbols to map file\n" - "-mapout .. write mapfile to .map\n" - "-mapxref .. write cross references into map file\n" - "-mapunused .. write unused linked in symbols to map file\n" - ; -} - -void LinkJob::ReadCommand(const Vector& cmdlist, bool user) -{ - if(user) - command_args.Append(cmdlist); - int start = msecs(); - for(int i = 0; i < cmdlist.GetCount(); i++) { - String arg = cmdlist[i]; - bool is_opt = false; - if(*arg == '/') { - const char *p = arg; - is_opt = true; - while(*++p && *p != ':' && *p != '=' && *p != '/' && *p != '.') - ; - is_opt = (*p == 0 || *p == ':'); - } - - if(is_opt || *arg == '-') { - const char *ptr = ~arg + 1; - const char *end = ptr; - while(*end && *end != ':') - end++; - String cmd(ptr, end); - String lcmd = ToLower(cmd); - if(cmd == "Map") { - linkermode = MODE_GNULD; - write_mapfile = true; - mapfile = FetchCmdArg(cmdlist, i); - continue; - } - String val; - if(*end == ':') - val = end + 1; - bool eaten = true; - if(lcmd == "align") { - int at = IsDigit(*val) ? ScanInt(val) : 4096; - image_align = 0x100; - while(image_align < at && image_align < 65536) - image_align <<= 1; - if(image_align < 0x1000) - file_align = image_align; - } - else if(lcmd == "alternatename" && !IsNull(val)) { - int q = val.Find('='); - if(q > 0 && q < val.GetLength() - 1) { - String name = val.Left(q), alias = val.Mid(q + 1); - AddWeakExternal(Atomize(name), Atomize(alias)); - } - else - PutStdOut(NFormat("ALTERNATENAME: invalid parameter (expected ident=ident): %s", val)); - } - else if(lcmd == "base") - image_base = ScanCInt(val); - else if(lcmd == "debug") - debug_info_raw = 1; - else if(lcmd == "defaultlib" && !IsNull(val)) - defaultlibs.FindAdd(NormalizePathCase(val)); - else if(lcmd == "entry" && !IsNull(val)) - entrypoint = val; - else if(lcmd == "fixed") - image_fixed = true; - else if(lcmd == "include" && !IsNull(val)) - include_symbols.FindAdd(Atomize(val)); - else if(lcmd == "incremental") { - PutStdOut("(INCREMENTAL: currently ignored)"); - } - else if(lcmd == "libpath" && !IsNull(val)) - libpaths.Add(val); - else if(lcmd == "machine" && !IsNull(val)) { - val = ToUpper(val); - machine = COFFMachineCode(ToUpper(val)); - if(machine == COFF_IMAGE_FILE_MACHINE_UNKNOWN) - PutStdOut(NFormat("Unknown machine type: %s; supported machines are: %s", val, COFFMachineNames())); - } - else if(lcmd == "map") { - write_mapfile = true; -// write_xref = true; - if(!IsNull(val)) - mapfile = val; - } - else if(lcmd == "merge") { - const char *p = val; - while(*p && *p != '=') - p++; - String from(~val, p); - if(*p++ != '=' || !*p || IsNull(from)) - PutStdOut("Invalid syntax of /merge command."); - else - section_merge.GetAdd(Atomize(from)) = Atomize(p); - } - else if((lcmd == "nodefaultlib" || lcmd == "disallowlib") && !IsNull(val)) - nodefaultlibs.FindAdd(NormalizePathCase(val)); - else if(lcmd == "nologo") - show_logo = false; - else if(lcmd == "opt") { - PutStdOut("(OPT: currently ignored)"); - } - else if(lcmd == "out") { - if(!IsNull(outputfile)) - PutStdOut(NFormat("Duplicate output file: %s (was %s)", val, outputfile)); - outputfile = val; - } - else if(lcmd == "pdb") { - PutStdOut("(PDB: currently ignored)"); - } - else if(lcmd == "stub") { - if(!IsNull(stub_filename)) - PutStdOut(NFormat("Duplicate stub file name: %s (was %s)", val, stub_filename)); - stub_filename = val; - } - else if(lcmd == "subsystem" && !IsNull(val)) { - val = ToUpper(val); - /**/ if(val == "CONSOLE") subsystem = COFF_IMAGE_SUBSYSTEM_WINDOWS_CUI; - else if(val == "NATIVE") subsystem = COFF_IMAGE_SUBSYSTEM_NATIVE; - else if(val == "POSIX") subsystem = COFF_IMAGE_SUBSYSTEM_POSIX_CUI; - else if(val == "WINDOWS") subsystem = COFF_IMAGE_SUBSYSTEM_WINDOWS_GUI; -#ifdef COMPILER_MSC - else if(val == "WINDOWSCE") subsystem = COFF_IMAGE_SUBSYSTEM_WINDOWS_CE_GUI; -#endif - else if(val == "OS2") subsystem = COFF_IMAGE_SUBSYSTEM_OS2_CUI; - else - PutStdOut(NFormat("Unknown subsystem: %s", val)); - } - else if(lcmd == "version" && !IsNull(val)) { - const char *p = val; - major_version = (word)ScanInt(p, &p); - if(*p++ == '.' && IsDigit(*p)) - minor_version = (word)ScanInt(p); - } - else - eaten = false; - if(eaten) - linkermode = MODE_MSLINK; - else { - eaten = true; - if(lcmd == "aligncode") - ignore_code_alignment = false; - else if(lcmd == "collectdata") - autocollect_crt_only = false; -// else if(lcmd == "nocache") -// cache_objects = false; - else if(lcmd == "dump" && !IsNull(val)) { - void DumpFile(String fn); - DumpFile(val); - } - else if(lcmd == "dumpcollect") - dump_flags |= DUMP_COLLECTOR; - else if(lcmd == "dumpcommand") - dump_flags |= DUMP_COMMANDLINE; - else if(lcmd == "dumpdll") - dump_flags |= DUMP_DLL_EXPORTS; - else if(lcmd == "dumpexports") - dump_flags |= DUMP_EXPORTS; - else if(lcmd == "dumpfixups") - dump_flags |= DUMP_REF_FIXUPS; - else if(lcmd == "dumpimp") - dump_flags |= DUMP_IMPORT; - else if(lcmd == "dumpimplib") - dump_flags |= DUMP_IMPORT_LIBS; - else if(lcmd == "dumpobj") - dump_flags |= DUMP_OBJECTS; - else if(lcmd == "dumpobjlib") - dump_flags |= DUMP_OBJECT_LIBS; - else if(lcmd == "dumpresource") - dump_flags |= DUMP_RESOURCES; - else if(lcmd == "dumpsec") - dump_flags |= (val == "def" ? DUMP_SEC_DEFINES : val == "all" ? DUMP_SECTIONS_ALL : DUMP_SECTIONS); - else if(lcmd == "dumpstabs") - dump_flags |= DUMP_STABS; - else if(lcmd == "dumpstabtypes") - dump_flags |= DUMP_STAB_TYPES; - else if(lcmd == "dumpstat") - dump_flags |= DUMP_STAT; - else if(lcmd == "dumptime") - dump_flags |= DUMP_TIMING; - else if(lcmd == "mapall") - dump_flags |= DUMP_MAP_ALL; - else if(lcmd == "mapout") - write_mapfile = true; - else if(lcmd == "mapxref") - write_xref = true; - else if(lcmd == "mapunused") - dump_flags |= DUMP_MAP_UNUSED; - else if(lcmd == "verbose") - verbose = true; - else - eaten = false; - } - if(!eaten) { - ptr = ~arg + 1; - const char *pfx; - eaten = true; - switch(*ptr++) { - case '-': - if(pfx = EatPrefix(ptr, "dll-search-prefix=")) - dll_search_prefix = pfx; - else if(!strcmp(ptr, "dynamic")) - static_libraries = false; - else if(!strcmp(ptr, "enable-auto-image-base")) - auto_dll_base = true; - else if(!strcmp(ptr, "gc-sections")) - ; // automatic for the moment - else if(!strcmp(ptr, "major-image-version")) - major_version = (word)ScanInt(FetchCmdArg(cmdlist, i)); - else if(!strcmp(ptr, "map-file")) - write_mapfile = mapfile_stdout = true; - else if(!strcmp(ptr, "minor-image-version")) - minor_version = (word)ScanInt(FetchCmdArg(cmdlist, i)); - else if(!strcmp(ptr, "start-group") || !strcmp(ptr, "end-group")) - ; // ignore these for the moment - else if(!strcmp(ptr, "static")) - static_libraries = true; - else if(!strcmp(ptr, "shared")) - make_dll = true; - else if(!strcmp(ptr, "subsystem")) { - String sub = FetchCmdArg(cmdlist, i); - if(sub == "windows") { - if(subsystem != COFF_IMAGE_SUBSYSTEM_WINDOWS_CUI) - subsystem = COFF_IMAGE_SUBSYSTEM_WINDOWS_GUI; - } - else if(sub == "console") - subsystem = COFF_IMAGE_SUBSYSTEM_WINDOWS_CUI; - else - PutStdOut(NFormat("Unknown --subsystem: %s", sub)); - } - else - eaten = false; - break; - - case 'B': { - String style = FetchCmdArg(cmdlist, i, ptr); - if(style == "static") - static_libraries = true; - else if(style == "dynamic") - static_libraries = true; - else if(style == "shareable") - make_dll = true; - else - eaten = false; - break; - } - - case 'e': - entrypoint = FetchCmdArg(cmdlist, i, ptr); - break; - - case 'L': - libpaths.Add(FetchCmdArg(cmdlist, i, ptr)); - break; - - case 'l': - LoadFile(String().Cat() << "lib" << ptr << ".a", false); - break; - - case 'M': - write_mapfile = true; - mapfile_stdout = true; - break; - - case 'O': - ptr = FetchCmdArg(cmdlist, i, ptr); - PutStdOut(NFormat("(option '-O %s' ignored)", ptr)); - break; - - case 'o': - outputfile = FetchCmdArg(cmdlist, i, ptr); - break; - - case 's': - debug_info_raw = 0; - break; - - default: - eaten = false; - break; - } - if(eaten) - linkermode = MODE_GNULD; - } - if(!eaten) - PutStdOut(NFormat("Unknown option: %s", arg)); - } - else - LoadFile(arg, false); -/* - FindFile ff; - if(ff.Search(arg)) - do - if(ff.IsFile()) { - String fn = AppendFileName(GetFileDirectory(arg), ff.GetName()); - PutStdOut(fn); - fflush(stdout); - LoadFile(fn); - } - while(ff.Next()); -*/ - } -} - -String FindLinkFile(String fn, String dir, bool has_ext) -{ - String natdir = NormalizePathCase(NativePath(dir)); - String nat = NormalizePathCase(NativePath(fn)); - String out; - if(FileExists(out = AppendFileName(natdir, nat))) - return out; - if(has_ext) - return Null; - if(FileExists(out = AppendFileName(natdir, nat + ".obj")) - || FileExists(out = AppendFileName(natdir, nat + ".o")) - || FileExists(out = AppendFileName(natdir, nat + ".lib")) - || FileExists(out = AppendFileName(natdir, nat + ".a")) - || FileExists(out = AppendFileName(natdir, "lib" + nat + ".a"))) - return out; - return Null; -} - -void LinkJob::LoadFile(String fn, bool defaultlib) -{ - LTIMING("LinkJob::LoadFile"); - String relfn = NormalizeRelPath(NormalizePathCase(fn)); - if(loaded_files.Find(relfn) >= 0) - return; - bool has_ext = *GetFileExtPos(relfn); - String file; - ObjectFile::FILETYPE ft = ObjectFile::FULL_PATH; - file = FindLinkFile(relfn, Null, has_ext); - if(IsNull(file) && !IsNull(dll_search_prefix)) - file = FindLinkFile(AppendFileName(GetFileDirectory(relfn), dll_search_prefix + GetFileName(relfn)), Null, has_ext); -#ifdef PLATFORM_WIN32 - String cygfn = TranslateCygWinPath(fn); - if(IsNull(file) && !IsNull(cygfn)) - file = FindLinkFile(cygfn, Null, has_ext); -#endif - if(IsNull(file) && !IsFullPath(relfn)) { - ft = ObjectFile::LIB_PATH; - for(int i = 0; i < libpaths.GetCount(); i++) { - if(!IsNull(file = FindLinkFile(relfn, libpaths[i], has_ext))) - break; -#ifdef PLATFORM_WIN32 - if(!IsNull(cygfn = TranslateCygWinPath(libpaths[i])) && !IsNull(file = FindLinkFile(relfn, cygfn, has_ext))) - break; -#endif - } - } - if(IsNull(outputfile)) - outputfile = ForceExt(file, ""); -// if(cache_objects && IsNull(cache_file_name)) -// cache_file_name = ForceExt(outputfile, ".uld"); - if(defaultlib) - ft = ObjectFile::DEFAULTLIB; - FileMapping& mapping = LinkJob::GetMapping(file); - if(!mapping.IsOpen()) { - PutStdOut(NFormat("File '%s' not found.", fn)); - return; - } - if(loaded_files.Find(file) >= 0) - return; - loaded_files.Add(fn); -// loaded_files.Add(full); - loaded_files.Add(file); - if(dump_flags & DUMP_OBJECTS) - PutStdOut(file); - if(mapping[0] == 'M' && mapping[1] == 'Z') { - LoadDLL(file, mapping, ft); - return; - } - if(*(const word *)~mapping == machine) { - if(ft == ObjectFile::FULL_PATH) - ft = ObjectFile::DIRECT; - LoadObject(file, mapping, ft); - return; - } - if(!memcmp(~mapping, "!\n", 8)) { - LoadLibrary(file, mapping, ft); - return; - } - if(mapping.GetLength() >= 8) { - int long1 = PeekIL(&mapping[0]), long2 = PeekIL(&mapping[4]); - if(long1 >= 0 && long2 >= 0 && long1 + long2 <= mapping.GetLength()) { - LoadResource(file, mapping); - return; - } - } - PutStdOut(NFormat("File '%s' has unknown type.", file)); -} - -void LinkJob::LoadObject(String file, const FileMapping& mapping, ObjectFile::FILETYPE filetype) -{ - LTIMING("LinkJob::LoadObject"); - if(verbose) - PutStdOut(NFormat("%s: loading object file", file)); - int nobj = objects.GetCount(); - ObjectFile& obj = objects.Add(new ObjectFile(*this, nobj, Null, file, filetype, 0, mapping.GetTime(), mapping.GetLength())); - if(filetype == ObjectFile::DIRECT) - obj.autocollect = true; - if(cache_object_data) { - obj.object_data.SetCount(obj.object_size); - memcpy(obj.object_data.Begin(), mapping.Begin(), obj.object_size); - obj.ReadFile(obj.object_data.Begin()); - } - else - obj.ReadFile(~mapping); -} - -void LinkJob::LoadLibrary(String file, const FileMapping& mapping, ObjectFile::FILETYPE filetype) -{ - if(verbose) - PutStdOut(NFormat("%s: loading static library", file)); - LTIMING("LinkJob::LoadLibrary"); - int objcount = -1; - String libprefix = GetFileTitle(file) + ":"; - const byte *ptr = mapping.GetIter(8); - const byte *end = mapping.End(); - const byte *longptr = NULL; -// int objid = 0; - Time file_time = mapping.GetTime(); - enum { HEADER_SIZE = sizeof(COFF_IMAGE_ARCHIVE_MEMBER_HEADER) }; - while(ptr + HEADER_SIZE <= end && ptr[HEADER_SIZE - 2] == COFF_IMAGE_ARCHIVE_END1 - && ptr[HEADER_SIZE - 1] == COFF_IMAGE_ARCHIVE_END2) { -// if(*ptr == '\n') -// ptr++; - int offset = ptr - mapping.Begin(); - COFF_IMAGE_ARCHIVE_MEMBER_HEADER hdr; - memcpy(&hdr, ptr, sizeof(hdr)); - ptr += sizeof(hdr); - int size = atoi((const char *)hdr.Size); - const byte *brk = ptr + ((size + 1) & -2); - if(hdr.Name[0] == '/' && hdr.Name[1] == '/') { // longnames - longptr = ptr; - } - else if(hdr.Name[0] != '/' || hdr.Name[1] != ' ') { // object - const byte *nameptr, *namelim; - if(hdr.Name[0] != '/') { - nameptr = hdr.Name; - namelim = nameptr + __countof(hdr.Name); - } - else { - int loff = atoi((const char *)hdr.Name + 1); - nameptr = longptr + loff; - namelim = end; - } - const byte *p = nameptr; - while(p < namelim && *p && *p != '/') - p++; - String objname(nameptr, p - nameptr); - String modname = libprefix + objname; - const COFF_IMPORT_OBJECT_HEADER *imphdr = (const COFF_IMPORT_OBJECT_HEADER *)ptr; - if(imphdr->Sig1 == 0 && imphdr->Sig2 == 0xFFFF) { - if(imphdr->Machine != machine) - throw Exc(NFormat("%s: invalid machine type (%d) in import library module", file, imphdr->Machine)); - const char *pname = (const char *)ptr + sizeof(COFF_IMPORT_OBJECT_HEADER); - atom_t impsym_atom = Atomize(pname); - atom_t dll_atom = Atomize(NormalizePathCase(pname + strlen(pname) + 1)); - if(dump_flags & DUMP_IMPORT_LIBS) { - String iname = atoms[impsym_atom]; - PutStdOut(NFormat(iname == pname ? "%18d %s" : "%18d %s -> %s", - atoms[dll_atom], offset, imphdr->Hint, pname, atoms[impsym_atom])); - } - int objn = dll_objects.Get(dll_atom, -1); - if(objn < 0) { - dll_objects.Add(dll_atom, objn = objects.GetCount()); - ObjectFile& obj = objects.Add(new ObjectFile(*this, objn, file, objname, filetype, 0, file_time, size)); - obj.dll_atom = dll_atom; - obj.sections.SetCount(ObjectFile::DLL_SECTIONS); - ObjectFile::Section& stubsec = obj.sections[ObjectFile::SEC_DLL_STUBS]; - stubsec.name_atom = stubsec.sec_atom = text_atom; - stubsec.type = ObjectFile::SEC_RAW; - stubsec.flags = COFF_IMAGE_SCN_CNT_CODE | COFF_IMAGE_SCN_ALIGN_1BYTES - | COFF_IMAGE_SCN_MEM_EXECUTE | COFF_IMAGE_SCN_MEM_READ; - ObjectFile::Section& namesec = obj.sections[ObjectFile::SEC_DLL_NAMES]; - namesec.name_atom = idata_names_atom; - namesec.sec_atom = idata_atom; - namesec.type = ObjectFile::SEC_RAW; - namesec.flags = COFF_IMAGE_SCN_CNT_INITIALIZED_DATA | COFF_IMAGE_SCN_ALIGN_2BYTES | COFF_IMAGE_SCN_MEM_READ; - ObjectFile::Section& impsec = obj.sections[ObjectFile::SEC_DLL_IMPORTS]; - impsec.name_atom = idata_iat1_atom; - impsec.sec_atom = idata_atom; - impsec.type = ObjectFile::SEC_RAW; - impsec.flags = COFF_IMAGE_SCN_CNT_INITIALIZED_DATA | COFF_IMAGE_SCN_ALIGN_4BYTES - | COFF_IMAGE_SCN_MEM_READ | COFF_IMAGE_SCN_MEM_WRITE; - ObjectFile::Section& boundsec = obj.sections[ObjectFile::SEC_DLL_BOUND]; - boundsec.name_atom = idata_iat2_atom; - boundsec.sec_atom = idata_atom; - boundsec.type = ObjectFile::SEC_RAW; - boundsec.flags = COFF_IMAGE_SCN_CNT_INITIALIZED_DATA | COFF_IMAGE_SCN_ALIGN_4BYTES - | COFF_IMAGE_SCN_MEM_READ | COFF_IMAGE_SCN_MEM_WRITE; - ObjectFile::Section& descsec = obj.sections[ObjectFile::SEC_DLL_DESCRIPTOR]; - descsec.name_atom = idata_idesc_atom; - descsec.sec_atom = idata_atom; - descsec.type = ObjectFile::SEC_RAW; - descsec.flags = COFF_IMAGE_SCN_CNT_INITIALIZED_DATA | COFF_IMAGE_SCN_ALIGN_4BYTES - | COFF_IMAGE_SCN_MEM_READ | COFF_IMAGE_SCN_MEM_WRITE; -/* - ObjectFile::Section& nullsec = obj.sections[ObjectFile::SEC_DLL_NULL_DESC]; - nullsec.name_atom = idata_inull_atom; - nullsec.sec_atom = idata_atom; - nullsec.flags = COFF_IMAGE_SCN_CNT_INITIALIZED_DATA | COFF_IMAGE_SCN_ALIGN_4BYTES - | COFF_IMAGE_SCN_MEM_READ | COFF_IMAGE_SCN_MEM_WRITE; -*/ - } - ObjectFile::Import& dllimp = objects[objn].imports.Add(); - dllimp.app_atom = impsym_atom; - dllimp.ordinal_hint = imphdr->Hint; - switch(imphdr->NameType) { - case COFF_IMPORT_OBJECT_ORDINAL: - dllimp.ordinal = true; - dllimp.ordinal_hint = imphdr->Ordinal; - while(*pname == '_') - pname++; - break; - - case COFF_IMPORT_OBJECT_NAME: - dllimp.imp_atom = impsym_atom; - break; - - case COFF_IMPORT_OBJECT_NAME_NO_PREFIX: - case COFF_IMPORT_OBJECT_NAME_UNDECORATE: - while(*pname == '@' || *pname == '_' || *pname == '?') - pname++; { - const char *end = pname; - if(imphdr->NameType == COFF_IMPORT_OBJECT_NAME_NO_PREFIX) - end += strlen(end); - else - while(*end && *end != '@') - end++; - dllimp.imp_atom = Atomize(String(pname, end)); - } - break; - - default: - throw Exc(NFormat("%s: invalid import name type (%d)", modname, imphdr->NameType)); - } - Symbol global; - global.obj_sec.object = objn; - global.value = objects[objn].imports.GetCount() - 1; - if(imphdr->Type == COFF_IMPORT_CODE) { - global.obj_sec.section = ObjectFile::SEC_DLL_STUBS; - global.type = COFF_IMAGE_SYM_TYPE_IMPORT_STUB; - AddGlobal(impsym_atom, global); - } - global.obj_sec.section = ObjectFile::SEC_DLL_BOUND; - int import_atom = Atomize(String("__imp__") + pname); - global.type = (imphdr->NameType == COFF_IMPORT_OBJECT_ORDINAL - ? COFF_IMAGE_SYM_TYPE_IMPORT_ORDINAL : COFF_IMAGE_SYM_TYPE_IMPORT_NAME); - AddGlobal(import_atom, global); -// RLOG("Import atom " << atoms[import_atom] << " in " << modname); - } - else { - int nobj = objects.GetCount(); - if(objcount < 0) - objcount = nobj; - ObjectFile& obj = objects.Add(new ObjectFile(*this, nobj, file, objname, - filetype, ptr - mapping.Begin(), file_time, size)); -// if(cache_object_data && filetype != ObjectFile::DEFAULTLIB) -// { -// obj.object_data = String(ptr, size); -// obj.ReadFile(obj.object_data); -// } -// else - obj.ReadFile(ptr); - if(dump_flags & DUMP_OBJECT_LIBS) { - for(int g = 0; g < globals.GetCount(); g++) { - const Symbol& sym = globals[g]; - if(sym.obj_sec.object != nobj || sym.type >= COFF_IMAGE_SYM_TYPE_SPECIAL) - continue; - const ObjectFile& of = objects[sym.obj_sec.object]; - String secname; - if(sym.obj_sec.section < 0) - secname = "ABS"; - else if(sym.obj_sec.section == 0) - secname = "COMDAT"; - else - secname = atoms[of.sections[sym.obj_sec.section].name_atom]; - PutStdOut(NFormat("%15 (unsigned)mapping.GetLength() - || PeekIL(&mapping[header]) != 'P' + 256 * 'E') - throw Exc("not a valid PE file"); - COFF_IMAGE_FILE_HEADER hdr; - COFF_IMAGE_OPTIONAL_HEADER32 opthdr; - memcpy(&hdr, &mapping[header + 4], sizeof(hdr)); - if(hdr.Machine != machine) - throw Exc(NFormat("invalid machine code: %s", COFFMachineName(hdr.Machine))); - if(!(hdr.Characteristics & IMAGE_FILE_DLL)) - throw Exc("not a dynamic library"); - if(hdr.SizeOfOptionalHeader < sizeof(opthdr)) - throw Exc(NFormat("invalid optional header size = %d", hdr.SizeOfOptionalHeader)); - memcpy(&opthdr, &mapping[header + 4 + sizeof(hdr)], sizeof(opthdr)); - if(opthdr.NumberOfRvaAndSizes < COFF_IMAGE_DIRECTORY_ENTRY_EXPORT) - throw Exc("not enough data directories in image (EXPORT section not present)"); - unsigned export_rva = opthdr.DataDirectory[COFF_IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress; - unsigned export_end = export_rva + opthdr.DataDirectory[COFF_IMAGE_DIRECTORY_ENTRY_EXPORT].Size; - Buffer sections(hdr.NumberOfSections); - memcpy(sections, &mapping[header + 4 + sizeof(hdr) + hdr.SizeOfOptionalHeader], - hdr.NumberOfSections * sizeof(COFF_IMAGE_SECTION_HEADER)); - int rva_fpos = 0; - bool found = false; - for(int i = 0; i < hdr.NumberOfSections; i++) { - const COFF_IMAGE_SECTION_HEADER& sec = sections[i]; - if(export_rva >= sec.VirtualAddress && export_end <= sec.VirtualAddress + sec.Misc.VirtualSize) { - rva_fpos = sec.PointerToRawData - sec.VirtualAddress; - found = true; - break; - } - } - if(!found) - throw Exc("invalid export section RVA (not in any section)"); - COFF_IMAGE_EXPORT_DIRECTORY_TABLE expdir; - memcpy(&expdir, &mapping[export_rva + rva_fpos], sizeof(expdir)); - - atom_t dll_atom = Atomize(ToUpper(GetFileName(file))); - int objn = objects.GetCount(); - dll_objects.Add(dll_atom, objn); - ObjectFile& obj = objects.Add(new ObjectFile(*this, objn, Null, file, filetype, 0, mapping.GetTime(), mapping.GetLength())); - obj.dll_atom = dll_atom; - obj.sections.SetCount(ObjectFile::DLL_SECTIONS); - ObjectFile::Section& stubsec = obj.sections[ObjectFile::SEC_DLL_STUBS]; - stubsec.name_atom = stubsec.sec_atom = text_atom; - stubsec.flags = COFF_IMAGE_SCN_CNT_CODE | COFF_IMAGE_SCN_ALIGN_1BYTES - | COFF_IMAGE_SCN_MEM_EXECUTE | COFF_IMAGE_SCN_MEM_READ; - ObjectFile::Section& namesec = obj.sections[ObjectFile::SEC_DLL_NAMES]; - namesec.name_atom = idata_names_atom; - namesec.sec_atom = idata_atom; - namesec.flags = COFF_IMAGE_SCN_CNT_INITIALIZED_DATA | COFF_IMAGE_SCN_ALIGN_2BYTES | COFF_IMAGE_SCN_MEM_READ; - ObjectFile::Section& impsec = obj.sections[ObjectFile::SEC_DLL_IMPORTS]; - impsec.name_atom = idata_iat1_atom; - impsec.sec_atom = idata_atom; - impsec.flags = COFF_IMAGE_SCN_CNT_INITIALIZED_DATA | COFF_IMAGE_SCN_ALIGN_4BYTES - | COFF_IMAGE_SCN_MEM_READ | COFF_IMAGE_SCN_MEM_WRITE; - ObjectFile::Section& boundsec = obj.sections[ObjectFile::SEC_DLL_BOUND]; - boundsec.name_atom = idata_iat2_atom; - boundsec.sec_atom = idata_atom; - boundsec.flags = COFF_IMAGE_SCN_CNT_INITIALIZED_DATA | COFF_IMAGE_SCN_ALIGN_4BYTES - | COFF_IMAGE_SCN_MEM_READ | COFF_IMAGE_SCN_MEM_WRITE; - ObjectFile::Section& descsec = obj.sections[ObjectFile::SEC_DLL_DESCRIPTOR]; - descsec.name_atom = idata_idesc_atom; - descsec.sec_atom = idata_atom; - descsec.flags = COFF_IMAGE_SCN_CNT_INITIALIZED_DATA | COFF_IMAGE_SCN_ALIGN_4BYTES - | COFF_IMAGE_SCN_MEM_READ | COFF_IMAGE_SCN_MEM_WRITE; - - if(dump_flags & DUMP_DLL_EXPORTS) - PutStdOut(NFormat("%s: %d named export(s):", file, (int)expdir.NumberOfNamePointers)); - for(int i = 0; i < (int)expdir.NumberOfNamePointers; i++) { - int nameptr = PeekIL(&mapping[expdir.NamePointerTableRVA + rva_fpos + 4 * i]); - String name = (const char *)&mapping[nameptr + rva_fpos]; - word ordinal = PeekIW(&mapping[expdir.OrdinalTableRVA + rva_fpos + 2 * i]); - if(ordinal >= (int)expdir.AddressTableEntries) - throw Exc(NFormat("export symbol %s has invalid ordinal: %d (# address entries = %d)", - name, ordinal, (int)expdir.AddressTableEntries)); - unsigned bound = PeekIL(&mapping[expdir.ExportAddressTableRVA + rva_fpos + 4 * ordinal]); - - if(dump_flags & DUMP_DLL_EXPORTS) - PutStdOut(NFormat("\t(%d) %s", (int)(ordinal + expdir.OrdinalBase), name)); - ObjectFile::Import& dllimp = obj.imports.Add(); - dllimp.app_atom = Atomize("_" + name); - dllimp.imp_atom = Atomize(name); - dllimp.ordinal_hint = ordinal + expdir.OrdinalBase; - Symbol global; - global.obj_sec.object = objn; - global.value = obj.imports.GetCount() - 1; - unsigned sec_flags = 0; - for(int s = 0; s < hdr.NumberOfSections; s++) { - const COFF_IMAGE_SECTION_HEADER& sec = sections[s]; - if(bound >= sec.VirtualAddress && bound < sec.VirtualAddress + sec.Misc.VirtualSize) { - sec_flags = sec.Characteristics; - break; - } - } - if(sec_flags & COFF_IMAGE_SCN_CNT_CODE) { - global.obj_sec.section = ObjectFile::SEC_DLL_STUBS; - global.type = COFF_IMAGE_SYM_TYPE_IMPORT_STUB; - AddGlobal(dllimp.app_atom, global); - } - global.obj_sec.section = ObjectFile::SEC_DLL_BOUND; - int import_atom = Atomize("__imp__" + name); - global.type = COFF_IMAGE_SYM_TYPE_IMPORT_NAME; - AddGlobal(import_atom, global); - } - } - catch(Exc e) { - PutStdOut(NFormat("%s: %s", file, e)); - } -} - -static const byte *ResString(const byte *ptr, WString& out, int& out_id) -{ - int len = PeekIW(ptr); - if(len == 0xFFFF) { - out_id = PeekIW(ptr + 2); - out = Null; - ptr += 4; - } - else { - out_id = Null; - memcpy(out.GetBuffer(len >> 1), ptr + 2, 2 * (len >> 1)); - out.ReleaseBuffer(len >> 1); - ptr += (len + 5) & -4; - } - return ptr; -} - -void LinkJob::LoadResource(String file, const FileMapping& mapping) -{ - const byte *data = mapping.Begin(), *end = mapping.End(); - int resx = resource_objects.GetCount(); - while(data + 0x20 <= end) { - int datalen = PeekIL(data); - int hdrlen = PeekIL(data + 4); - int skipnext = (datalen + hdrlen + 3) & -4; - if(datalen < 0 || hdrlen < 0x20 || skipnext > end - data) { - PutStdOut(NFormat("%s: invalid resource at offset %08x", file, data - mapping.Begin())); - return; - } - Resource res; - res.data = String(data + hdrlen, datalen); - const byte *next = data + skipnext; - data = ResString(data + 8, res.type, res.type_id); - data = ResString(data, res.name, res.name_id); - res.lang_id = PeekIW(data + 6); - if(datalen > 0) - resource_objects.Add(res); - data = next; - } - - if(dump_flags & DUMP_RESOURCES) { - PutStdOut(NFormat("Resource dump, %d objects (%s):", resource_objects.GetCount() - resx, file)); - PutStdOut("Type Name Lang Size"); - while(resx < resource_objects.GetCount()) { - const Resource& rsrc = resource_objects[resx++]; - String r; - if(!IsNull(rsrc.type)) - r << String(rsrc.type); - else - r << FormatIntHex(rsrc.type_id); - r.Cat(' ', max(1, 10 - r.GetLength())); - if(!IsNull(rsrc.name)) - r << String(rsrc.name); - else - r << FormatIntHex(rsrc.name_id); - r.Cat(' ', max(1, 20 - r.GetLength())); - PutStdOut(NFormat("%s%04x %08x", r, rsrc.lang_id, rsrc.data.GetLength())); - } - } - -/* - ObjectFile& obj = objects.Add(new ObjectFile(*this, objects.GetCount(), Null, file, ObjectFile::INTERNAL, 0, mapping.GetTime(), mapping.GetLength())); - obj.autocollect = true; - obj.sections.SetCount(2); - ObjectFile::Section& data = obj.sections[1]; - data.name_atom = data.sec_atom = rsrc_atom; - data.autocollect = true; - data.type = ObjectFile::SEC_RAW; - data.flags = COFF_IMAGE_SCN_CNT_INITIALIZED_DATA | COFF_IMAGE_SCN_ALIGN_4BYTES | COFF_IMAGE_SCN_MEM_READ; - data.size = data.raw_size = mapping.GetLength(); - data.section_data.SetCount(mapping.GetLength()); - memcpy(data.section_data.Begin(), mapping.Begin(), data.size); -*/ -} - -void LinkJob::Dump() const -{ - RLOG("LinkJob(" << objects.GetCount() << " objects)"); - int i; - RLOG("DefaultLibs: " << defaultlibs.GetCount()); - for(i = 0; i < defaultlibs.GetCount(); i++) - RLOG(NFormat("defaultlib[%d] = %s, %s", i, defaultlibs[i], - nodefaultlibs.Find(defaultlibs[i]) >= 0 ? "ignored" : "used")); - RLOG("NoDefaultLibs: " << nodefaultlibs.GetCount()); - for(i = 0; i < nodefaultlibs.GetCount(); i++) - RLOG(NFormat("nodefaultlib[%d] = %s", i, nodefaultlibs[i])); - int atom_size = (16 + 16) * atoms.GetCount(); - for(i = 0; i < atoms.GetCount(); i++) - atom_size += atoms[i].GetLength(); - RLOG("#atoms = " << atoms.GetCount() << ", size = " << atom_size); - RLOG("#globals = " << globals.GetCount() << ", size = " << globals.GetCount() * (sizeof(Symbol) + 16)); - for(i = 0; i < globals.GetCount(); i++) - RLOG(NFormat("[%3>d]: %30 %s", atoms[atom], atoms[refatom])); -} - -/* -int LinkJob::AddGlobal(int atom, const Symbol& symbol) -{ - globals.Add(atom, symbol); - - int pos = globals.Find(atom); - if(pos < 0) { - pos = globals.GetCount(); - globals.Add(atom, symbol); - return pos; - } - Symbol& old_symbol = globals[pos]; -// if(old_symbol.storage_class != symbol.storage_class) -// PutStdOut(NFormat("%s: storage class mismatch (%02x / %02x)", atoms[atom], old_symbol.storage_class, symbol.storage_class)); - if(old_symbol.section == 0) - old_symbol = symbol; - else if(symbol.section != 0) { // duplicate / comdat - if(old_symbol.type != symbol.type) - PutStdOut(NFormat("%s: symbol type mismatch (%04x / %04x)", atoms[atom], old_symbol.type, symbol.type)); - if(old_symbol.section > 0 && symbol.section > 0) { - ObjectFile::Section& sec1 = objects[old_symbol.object].sections[old_symbol.section]; - ObjectFile::Section& sec2 = objects[symbol.object].sections[symbol.section]; - if((sec1.flags & sec2.flags) & COFF_IMAGE_SCN_LNK_COMDAT) { - if(sec1.comdat_packing != sec2.comdat_packing) - PutStdOut(NFormat("%s: comdat packing style mismatch: %d / %d", - atoms[atom], sec1.comdat_packing, sec2.comdat_packing)); - switch(sec2.comdat_packing) { - case COFF_IMAGE_COMDAT_SELECT_NODUPLICATES: - break; - - case COFF_IMAGE_COMDAT_SELECT_ANY: - return pos; - - case COFF_IMAGE_COMDAT_SELECT_SAME_SIZE: - if(sec2.size == sec1.size) - return pos; - break; - - case COFF_IMAGE_COMDAT_SELECT_EXACT_MATCH: - if(sec2.size == sec1.size && sec2.exact_comdat == sec1.exact_comdat) - return pos; - break; - - case COFF_IMAGE_COMDAT_SELECT_ASSOCIATIVE: - break; - - case COFF_IMAGE_COMDAT_SELECT_LARGEST: - if(sec2.size > sec1.size) - old_symbol = symbol; - return pos; - } - } - } - - PutStdOut(NFormat("%s: duplicate (%s:%d / %s:%d)", atoms[atom], - objects[old_symbol.object].file, old_symbol.section, - objects[symbol.object].file, symbol.section)); - } - return pos; -} -*/ - -void LinkJob::ReadDefaultLibs() -{ - LTIMING("LinkJob::ReadDefaultLibs"); - for(int i = 0; i < defaultlibs.GetCount(); i++) - if(nodefaultlibs.Find(defaultlibs[i]) < 0) { - if(dump_flags & DUMP_OBJECTS) - PutStdOut(NFormat("defaultlib: %s", defaultlibs[i])); - LoadFile(defaultlibs[i], true); - } -} - -void LinkJob::PrepareResourceTree() -{ - if(resource_objects.GetCount() == 0) - return; - ObjectFile& of = objects[OBJ_RSRC]; - of.autocollect = true; - ObjectFile::Section& dirsec = of.sections[OBJR_DIRS]; - ObjectFile::Section& strsec = of.sections[OBJR_STRINGS]; - Sort(resource_objects, &LinkJob::Resource::Sort); - Vector string_relocations; - Vector end, par; -// int stamp = time(NULL); - end.Add(resource_objects.GetCount()); - par.Add(0); - for(int level = 0; level < 3; level++) { - Vector new_end, new_par; - int rix = 0; - for(int part = 0; part < end.GetCount(); part++) { - int eix = end[part], pix = par[part]; - COFF_IMAGE_RESOURCE_DIRECTORY imgdir; - Zero(imgdir); -// imgdir.TimeDateStamp = stamp; - if(pix) - PokeIL(&dirsec.section_data[pix], - dirsec.section_data.GetCount() | COFF_IMAGE_RESOURCE_DATA_IS_DIRECTORY); - int diroff = dirsec.section_data.GetCount(); - int numid = 0, numstr = 0; - CatN(dirsec.section_data, sizeof(imgdir), &imgdir); - const Resource *prev = &resource_objects[rix], *next; - do { - next = (++rix < eix ? &resource_objects[rix] : NULL); - bool eq = next && - ( level == 0 ? next->type_id == prev->type_id && next->type == prev->type - : level == 1 ? next->name_id == prev->name_id && next->name == prev->name - : level == 2 ? next->lang_id == prev->lang_id : true ); - if(!eq) { - COFF_IMAGE_RESOURCE_DIRECTORY_ENTRY entry; - Zero(entry); - if(level == 2) { - numid++; - entry.Id = prev->lang_id; - } - else { - int id = (level ? prev->name_id : prev->type_id); - if(!IsNull(id)) { - numid++; - entry.Id = id; - } - else { - numstr++; - WString w = (level ? prev->name : prev->type); - entry.Name = COFF_IMAGE_RESOURCE_NAME_IS_STRING + strsec.section_data.GetCount(); - string_relocations.Add(dirsec.section_data.GetCount() - + __offsetof(COFF_IMAGE_RESOURCE_DIRECTORY_ENTRY, Name)); - word len = 2 * w.GetLength(); - CatN(strsec.section_data, 2, &len); - CatN(strsec.section_data, 2 * w.GetLength(), w); - } - } - entry.OffsetToDirectory = -1; - new_end.Add(rix); - new_par.Add(dirsec.section_data.GetCount() - + __offsetof(COFF_IMAGE_RESOURCE_DIRECTORY_ENTRY, OffsetToData)); - CatN(dirsec.section_data, sizeof(entry), &entry); - } - } - while(prev = next); - PokeIW(&dirsec.section_data[diroff + __offsetof(COFF_IMAGE_RESOURCE_DIRECTORY, NumberOfIdEntries)], numid); - PokeIW(&dirsec.section_data[diroff + __offsetof(COFF_IMAGE_RESOURCE_DIRECTORY, NumberOfNamedEntries)], numstr); - } - end = new_end; - par = new_par; - } - dirsec.size = dirsec.raw_size = dirsec.section_data.GetCount(); - for(int i = 0; i < string_relocations.GetCount(); i++) { - byte *ptr = &dirsec.section_data[string_relocations[i]]; - PokeIL(ptr, PeekIL(ptr) + dirsec.size); - } - strsec.size = strsec.raw_size = strsec.section_data.GetCount(); - int entoff = dirsec.size + strsec.size; - ObjectFile::Section& entsec = of.sections[OBJR_ENTRIES]; - ObjectFile::Section& datsec = of.sections[OBJR_DATA]; - int pend = 0; - for(int i = 0; i < end.GetCount(); i++) { - const Resource& r = resource_objects[pend]; - int nend = end[i]; - if(nend - pend > 1) { - String dupres; - dupres << "Duplicate resource (type: " - << (!IsNull(r.type_id) ? FormatIntHex(r.type_id, 4) : String(r.type)) - << ", name: " - << (!IsNull(r.name_id) ? FormatIntHex(r.name_id, 4) : String(r.name)) - << ", lang: " - << FormatIntHex(r.lang_id, 4) - << ")"; - PutStdOut(dupres); - } - COFF_IMAGE_RESOURCE_DATA_ENTRY entry; - Zero(entry); - entry.OffsetToData = datsec.section_data.GetCount(); - entry.Size = r.data.GetLength(); - entry.CodePage = 0; //?? - byte *ptr = &dirsec.section_data[par[i]]; - PokeIL(ptr, entsec.section_data.GetCount() + entoff); - CatN(datsec.section_data, r.data.GetLength(), r.data); - CatN0(datsec.section_data, 4 - (r.data.GetLength() & 3)); - CatN(entsec.section_data, sizeof(entry), &entry); - pend = nend; - } - entsec.size = entsec.raw_size = entsec.section_data.GetCount(); - datsec.size = datsec.raw_size = datsec.section_data.GetCount(); -} - -void LinkJob::SetEntryPoint() -{ - if(IsNull(entrypoint)) - if(make_dll) - entrypoint = "_DllMainCRTStartup"; - else if(subsystem == COFF_IMAGE_SUBSYSTEM_WINDOWS_GUI && globals.Find(Atomize("_WinMainCRTStartup")) >= 0) - entrypoint = "_WinMainCRTStartup"; - else - entrypoint = "_mainCRTStartup"; - entrypoint_atom = Atomize(entrypoint); -} - -void LinkJob::SetExportSymbols() -{ - if(exports.IsEmpty() && make_dll) { // collect all globals - int ordinal = 0; - for(int i = 0; i < globals.GetCount(); i++) { - atom_t gatom = globals.GetKey(i); - const Symbol& sym = globals[i]; - if(gatom != entrypoint_atom && sym.external && objects[sym.obj_sec.object].export_symbols && sym.obj_sec.section >= 0) { - String name = atoms[gatom]; - const char *p = name; - if(*p == '_') - p++; - exports.Add(gatom, Export(p, ++ordinal)); - } - } - } -} - -void LinkJob::SetRootSymbols() -{ - AddCollect(entrypoint_atom); - for(int i = 0; i < exports.GetCount(); i++) - AddCollect(exports.GetKey(i)); - for(int i = 0; i < include_symbols.GetCount(); i++) - AddCollect(include_symbols[i]); -} - -void LinkJob::CollectObject(int index) -{ - const ObjectFile& of = objects[index]; - Index osv; - for(int t = 0; t < of.sections.GetCount(); t++) - if(of.sections[t].autocollect) - osv.Add(ObjSec(index, t)); - CollectSectionSymbols(osv, 0); -} - -void LinkJob::CollectSectionSymbols(Index& collect_objsec, int referer_index) -{ - LTIMING("LinkJob::CollectSectionSymbols"); - - int ref = globals.GetKey(referer_index), setref = ref; - for(int si = 0; si < collect_objsec.GetCount(); si++) { - ObjSec objsec = collect_objsec[si]; - ObjectFile& of = objects[objsec.object]; - if(!of.collected) { - of.collected = true; - for(int s = 0; s < of.sections.GetCount(); s++) - if(of.sections[s].autocollect) { - if(dump_flags & DUMP_COLLECTOR) - PutStdOut(NFormat("%s: autocollect section %d, %s", AsString(of), s, atoms[of.sections[s].name_atom])); - collect_objsec.FindAdd(ObjSec(objsec.object, s)); - } - } - - if(objsec.section < 0) - continue; - ObjectFile::Section& ofsec = of.sections[objsec.section]; - if(ofsec.sec_atom == debug_atom || ofsec.comdat_state == ObjectFile::COM_TRASHED) { - if(si == 0) - referer_index = ofsec.comdat_forward; - continue; - } - - bool was_used = ofsec.used; - -// LTIMING("LinkJob::CollectSectionSymbols / unused section"); - if(ofsec.flags & COFF_IMAGE_SCN_LNK_COMDAT) - ofsec.comdat_state = ObjectFile::COM_SELECTED; -/* - if(ofsec.comdat_state != ObjectFile::COM_SELECTED && ()) { -// LTIMING("LinkJob::CollectSectionSymbols / COMDAT"); - Vector candidates; - for(int f = globals.Find(ofsec.name_atom); f >= 0; f = globals.FindNext(f)) - candidates.Add(f); - if(dump_flags & DUMP_COLLECTOR) - PutStdOut(NFormat("\tCOMDAT section (%d candidates)", candidates.GetCount())); - int chosen = -1; - int current = -1; - if(candidates.GetCount() > 1) { - for(int i = 0; i < candidates.GetCount(); i++) { - ObjSec otheros = globals[candidates[i]].obj_sec; - if(otheros == objsec) { // current section - current = i; - continue; - } - ObjectFile& otherof = objects[otheros.object]; - ObjectFile::Section& othersec = otherof.sections[otheros.section]; - if(othersec.used) { - chosen = i; - break; - } - if(!(othersec.flags & COFF_IMAGE_SCN_LNK_COMDAT)) { - puts(NFormat("%s: %s is not a COMDAT, whereas %s:%d is (non-COMDAT selected)", - atoms[ofsec.name_atom], FormatSection(otheros), - AsString(of), objsec.section)); - chosen = i; - } - if(othersec.comdat_packing != ofsec.comdat_packing) { - PutStdOut(NFormat("%s: %s has COMDAT packing style %d, %s has %d", - atoms[ofsec.name_atom], - FormatSection(otheros), othersec.comdat_packing, - FormatSection(objsec), ofsec.comdat_packing)); - } - switch(ofsec.comdat_packing) { - case COFF_IMAGE_COMDAT_SELECT_NODUPLICATES: - PutStdOut(NFormat("%s: duplicate COMDAT definitions %s / %s", - atoms[ofsec.name_atom], FormatSection(otheros), - FormatSection(objsec))); - break; - - case COFF_IMAGE_COMDAT_SELECT_ANY: - break; - - case COFF_IMAGE_COMDAT_SELECT_SAME_SIZE: - if(othersec.size != ofsec.size) - PutStdOut(NFormat("%s: COMDAT size mismatch: %s - %d B, %s - %d B", - atoms[ofsec.name_atom], - FormatSection(otheros), othersec.size, - FormatSection(objsec), ofsec.size)); - - case COFF_IMAGE_COMDAT_SELECT_LARGEST: - if(chosen < 0 && othersec.size > ofsec.size - || chosen >= 0 && othersec.size > GetSection(globals[candidates[chosen]].obj_sec).size) - chosen = i; - break; - - case COFF_IMAGE_COMDAT_SELECT_EXACT_MATCH: - if(othersec.size != ofsec.size - || memcmp(othersec.section_data.Begin(), ofsec.section_data.Begin(), ofsec.size)) - PutStdOut(NFormat("%s: COMDAT data mismatch: %s / %s", - atoms[ofsec.name_atom], FormatSection(otheros), - FormatSection(objsec))); - break; - - case COFF_IMAGE_COMDAT_SELECT_ASSOCIATIVE: - break; - - } - } - if(chosen >= 0) { - int candidate = candidates[chosen]; - if(si == 0) - referer_index = candidate; - ObjSec otheros = globals[candidates[chosen]].obj_sec; - for(int i = 0; i < candidates.GetCount(); i++) - if(i != chosen) { - ObjectFile::Section& othersec = GetSection(globals[candidates[i]].obj_sec); - othersec.comdat_state = ObjectFile::COM_TRASHED; - othersec.comdat_forward = candidate; - } - if(dump_flags & DUMP_COLLECTOR) { - ObjectFile& otherof = objects[otheros.object]; - puts(NFormat("\tCOMDAT section %s discarded, %s selected", - FormatSection(objsec), FormatSection(otheros))); - } - GetSection(otheros).comdat_state = ObjectFile::COM_SELECTED; - collect_objsec.FindAdd(otheros); - continue; - } - else if(current >= 0) { - int candidate = candidates[current]; - for(int i = 0; i < candidates.GetCount(); i++) - if(i != current) { - ObjSec otheros = globals[candidates[i]].obj_sec; - ObjectFile::Section& othersec = GetSection(otheros); - othersec.comdat_state = ObjectFile::COM_TRASHED; - othersec.comdat_forward = candidate; - } - } - } - } -*/ - - of.used_any = ofsec.used = true; - - if(setref) { - for(int rs = global_obj_sec_index.Find(objsec); rs >= 0; rs = global_obj_sec_index.FindNext(rs)) - if(globals.GetKey(rs) == setref) { - globals[rs].linked = globals[rs].used = true; - setref = 0; - break; - } - } - - if(!was_used) { - if(dump_flags & DUMP_COLLECTOR) - PutStdOut(NFormat("%s: collecting section %d (%d B) %s (referer = %s)", - AsString(of), objsec.section, ofsec.size, atoms[ofsec.name_atom], atoms[globals.GetKey(referer_index)])); - for(int rs = global_obj_sec_index.Find(objsec); rs >= 0; rs = global_obj_sec_index.FindNext(rs)) { - int f = collected_symbols.Find(globals.GetKey(rs)); - globals[rs].linked = true; - if(f >= 0 && collected_symbols[f] < 0) { - globals[rs].used = true; - collected_symbols[f] = rs; - } -// bool u = (globals.GetKey(rs) == ref); -// if(u) -// globals[rs].used = true; - if(dump_flags & DUMP_COLLECTOR) - PutStdOut(NFormat("\tdefines: %-30s VAL %08x TYP %04x %[1:*]s", - atoms[globals.GetKey(rs)], globals[rs].value, globals[rs].type, globals[rs].used)); - } - } - - if(objsec.section <= 0) - continue; - - if(!was_used) { - for(int ca = of.comdat_assoc.Find(objsec.section); ca >= 0; ca = of.comdat_assoc.FindNext(ca)) { - // LTIMING("LinkJob::CollectSectionSymbols / COMDAT_ASSOC"); - ObjSec cca(of.index, of.comdat_assoc[ca]); - if(collect_objsec.Find(cca) < 0) { - collect_objsec.Add(cca); - if(!was_used && (dump_flags & DUMP_COLLECTOR)) - PutStdOut(NFormat("\tassoc comdat: %d", cca.section)); - } - } - } - - int sec_end = of.ref_sections.GetCount(); - int ext_end = of.ref_externals.GetCount(); - if(objsec.section + 1 < of.sections.GetCount()) { - sec_end = of.sections[objsec.section + 1].ref_sec_index; - ext_end = of.sections[objsec.section + 1].ref_ext_index; - } - if(ofsec.type == ObjectFile::SEC_STD) { -// LTIMING("LinkJob::CollectSectionSymbols / references + xrefs + collector"); - if(!was_used) { -// LTIMING("LinkJob::CollectSectionSymbols / section references"); - for(int x = ofsec.ref_sec_index; x < sec_end; x++) { - int isec = of.ref_sections[x]; - const ObjectFile::Section& sec = of.sections[isec]; - if(!sec.used) { - collect_objsec.FindAdd(ObjSec(of.index, isec)); - if(!was_used && (dump_flags & DUMP_COLLECTOR)) - PutStdOut(NFormat("\tintra-object reference to section %d", isec)); - } - } -// LTIMING("LinkJob::CollectSectionSymbols / symbol references"); - for(NOMSC6(int) x = ofsec.ref_ext_index; x < ext_end; x++) { - int sx = obj_static_global_index.Get(Point(objsec.object, of.ref_externals[x]), -1); - if(sx >= 0) { // static global - const ObjectFile::Section& sec = GetSection(globals[sx].obj_sec); - if(!sec.used) { - collect_objsec.FindAdd(globals[sx].obj_sec); - if(!was_used && (dump_flags & DUMP_COLLECTOR)) - PutStdOut(NFormat("\tintra-object reference to static %s", atoms[globals.GetKey(sx)])); - } - } - else - AddCollect(of.ref_externals[x]); - } - } - if(write_xref) { - for(int x = ofsec.ref_ext_index; x < ext_end; x++) - collected_referer.GetAdd(of.ref_externals[x]).FindAdd(globals.GetKey(referer_index)); - } - if((dump_flags & DUMP_COLLECTOR) && !was_used) { - for(int x = ofsec.ref_ext_index; x < ext_end; x++) - PutStdOut(NFormat("\treferences: %s", atoms[of.ref_externals[x]])); - } - } - } -} - -void LinkJob::CollectSymbols() -{ -// int xxx = Atomize("__crtBreakAlloc"); - bool error = false; - LTIMING("LinkJob::CollectSymbols"); - for(int i = 0; i < objects.GetCount(); i++) - if(objects[i].autocollect) - CollectObject(i); -/* { - const ObjectFile& of = objects[i]; - Index osv; - for(int t = 0; t < of.sections.GetCount(); t++) - if(of.sections[t].autocollect) - osv.Add(ObjSec(i, t)); - CollectSectionSymbols(osv, 0); - } -*/ - Index undefined; - Vector undef_ref; - for(NOMSC6(int) i = 0; i < collected_symbols.GetCount(); i++) { - atom_t ref = collected_symbols.GetKey(i); -// if(ref == CTOR_LIST_atom || ref == _CTOR_LIST_atom || ref == CTOR_LIST_END_atom -// || ref == DTOR_LIST_atom || ref == _DTOR_LIST_atom || ref == DTOR_LIST_END_atom) -// __asm int 3 - if(dump_flags & DUMP_COLLECTOR) - PutStdOut(NFormat("%s: collecting symbol #%d", atoms[ref], i)); -// if(ref == xxx) -// __asm int 3 - int a, af = globals.Find(ref); - if(af < 0) { -// PutStdOut(NFormat("N/F global: %s", atoms[ref])); - if((a = weak_externals.Find(ref)) >= 0) { - if((af = weak_externals.FindNext(a)) >= 0) - PutStdOut(NFormat("%s: weak external has multiple aliases (%s, %s)", - atoms[ref], atoms[a], atoms[af])); - AddCollect(weak_externals[a]); - if(write_xref) - collected_referer.GetAdd(weak_externals[a]).FindAdd(ref); - continue; - } - if(undefined.Find(collected_symbols.GetKey(i)) < 0) { - undefined.Add(collected_symbols.GetKey(i)); - undef_ref.Add(ext_obj_sec.Get(ref, Null)); - } - continue; - } - int collect_global = -1; - int collect_byfile = -1; -// ObjectFile *collect_file = NULL; -// Index collect_sections; - for(a = af; a >= 0; a = globals.FindNext(a)) { - if(globals[a].used) { - collect_global = a; - break; - } - int secno = globals[a].obj_sec.section; - if(secno > 0) { - ObjectFile& of = objects[globals[a].obj_sec.object]; - if(of.used_any) { - collect_byfile = a; - // globals[a].used = true; - // collected_symbols[i] = a; - // collect_file = &of; - // collect_sections.FindAdd(secno); - } - } - } - if(collect_global < 0) - collect_global = collect_byfile; - if(collect_global < 0) { -// if(ref == Atomize("__acmdln")) -// __asm int 3 - Index comdat_candidates; - Index dflib_candidates; - Index lib_candidates; - Index full_candidates; - Index direct_candidates; - Index inner_candidates; - for(a = af; a >= 0; a = globals.FindNext(a)) { - int atom = globals.GetKey(a); - Symbol& global = globals[a]; - if(global.obj_sec.object < OBJ_FIRST) { - inner_candidates.Add(a); - continue; - } - if(global.obj_sec.section == 0) { - comdat_candidates.Add(a); - continue; - } - const ObjectFile& of = objects[global.obj_sec.object]; - if(of.used_any) - inner_candidates.Add(a); - else if(of.filetype == of.DIRECT) - direct_candidates.Add(a); - else if(of.filetype == of.FULL_PATH) - full_candidates.Add(a); - else if(of.filetype == of.LIB_PATH) - lib_candidates.Add(a); - else - dflib_candidates.Add(a); - } - if(inner_candidates.IsEmpty()) - inner_candidates = direct_candidates; - if(inner_candidates.IsEmpty()) - inner_candidates = full_candidates; - if(inner_candidates.IsEmpty()) - inner_candidates = lib_candidates; - if(inner_candidates.IsEmpty()) - inner_candidates = dflib_candidates; - if(inner_candidates.IsEmpty()) - inner_candidates = comdat_candidates; - if(inner_candidates.GetCount() > 1) { - for(a = 1; a < inner_candidates.GetCount(); a++) { - bool matched = false; - const Symbol& sym1 = globals[inner_candidates[0]]; - const Symbol& sym2 = globals[inner_candidates[a]]; - if(sym1.type != sym2.type) { -/* PutStdOut(NFormat("%s: symbol type mismatch (%s:%d:%04x / %s:%d:%04x)", - atoms[ref], - sym1.obj_sec.object >= 0 ? AsString(objects[sym1.obj_sec.object]) : String("(linker)"), - sym1.obj_sec.section, sym1.type, - sym2.obj_sec.object >= 0 ? AsString(objects[sym2.obj_sec.object]) : String("(linker)"), - sym2.obj_sec.section, sym2.type)); -*/ } - else if((sym1.type == COFF_IMAGE_SYM_TYPE_IMPORT_NAME || sym1.type == COFF_IMAGE_SYM_TYPE_IMPORT_ORDINAL - || sym1.type == COFF_IMAGE_SYM_TYPE_IMPORT_STUB) && sym2.type == sym1.type) { - const ObjectFile::Import& imp1 = objects[sym1.obj_sec.object].imports[sym1.value]; - const ObjectFile::Import& imp2 = objects[sym2.obj_sec.object].imports[sym2.value]; - bool m = true; - if(imp1.imp_atom != imp2.imp_atom) { - m = false; - PutStdOut(NFormat("%s: import name mismatch (%s, %s)", atoms[ref], atoms[imp1.imp_atom], atoms[imp2.imp_atom])); - } - if(sym1.type == COFF_IMAGE_SYM_TYPE_IMPORT_ORDINAL && imp1.ordinal_hint != imp2.ordinal_hint) { - m = false; - PutStdOut(NFormat("%s: import library ordinal mismatch (%d, %d)", atoms[ref], imp1.ordinal_hint, imp2.ordinal_hint)); - } - if(m) - matched = true; - } - else if(sym1.obj_sec.section > 0 && sym2.obj_sec.section > 0) { - ObjectFile::Section& sec1 = GetSection(sym1.obj_sec); - ObjectFile::Section& sec2 = GetSection(sym2.obj_sec); - if((sec1.flags | sec2.flags) & COFF_IMAGE_SCN_LNK_COMDAT) - matched = true; - } - else if(sym1.obj_sec.section == 0 && sym2.obj_sec.section == 0 && sym1.value == sym2.value) - matched = true; - if(!matched) { - PutStdOut(NFormat("%s: duplicate - %s (used) / %s (discarded)", atoms[ref], - FormatSection(sym1.obj_sec), FormatSection(sym2.obj_sec))); - } - } - } - if(!inner_candidates.IsEmpty()) { -// collected_symbols[i] = inner_candidates[0]; - int chosen = inner_candidates[0]; - Symbol& sym = globals[chosen]; -// sym.used = true; - if(sym.obj_sec.object >= 0) { - ObjectFile& fo = objects[sym.obj_sec.object]; -// if(fo.dll_atom) -// __asm int 3 -// if(fo.dll_atom) -// PutStdOut(NFormat("collecting DLL import %s", atoms[ref])); - if(sym.obj_sec.section > 0) - collect_global = chosen; -// { -// collect_file = &fo; -// collect_sections.FindAdd(sym.obj_sec.section); -// } - else if(sym.obj_sec.section == 0) { // anon comdat - int comdat_align = 1; - while(comdat_align < 16 && !(sym.value & comdat_align)) - comdat_align <<= 1; - int v = (fo.sections[0].size + comdat_align - 1) & -comdat_align; - fo.sections[0].size = v + sym.value; - fo.used_any = fo.sections[0].used = true; - sym.value = v; - } - } - if(collect_global < 0) - globals[collected_symbols[i] = chosen].used = true; - } - } - if(collect_global >= 0) // && !collect_file->dll_atom) - { - ObjSec os = globals[collect_global].obj_sec; -// if(os.object == OBJ_CTOR) -// __asm int 3 - if(os.object >= 0) { - Index objsec; - objsec.Add(os); - CollectSectionSymbols(objsec, collect_global); -/* - if(!globals[collect_global].used) { - int i; - for(i = globals.Find(ref); i >= 0 && !globals[i].used; i = globals.FindNext(i)) - ; - collect_global = i; - if(i >= 0) - while((i = globals.FindNext(i)) >= 0 && !globals[i].used) - ; - if(i >= 0) - puts(NFormat("%s: duplicate in %s (used, %s (discarded)", - atoms[ref], FormatSection(globals[collect_global].obj_sec), - FormatSection(globals[i].obj_sec))); - } - if(collect_global < 0) - puts(NFormat("%s: undefined", atoms[ref])); -*/ - } - else - collected_symbols[i] = collect_global; - } - } - - for(NOMSC6(int) i = 0; i < collected_symbols.GetCount(); i++) - if(collected_symbols[i] < 0) { - int atom = collected_symbols.GetKey(i); - int f = globals.Find(atom); - while(f >= 0 && !globals[f].used) - f = globals.FindNext(f); - if(f >= 0) { - int g = f; - while((g = globals.FindNext(g)) >= 0 && !globals[g].used) - ; - if(g >= 0) - puts(NFormat("%s: duplicate in %s (used), %s (discarded)", - atoms[atom], FormatSection(globals[f].obj_sec), FormatSection(globals[g].obj_sec))); - else if(dump_flags & DUMP_COLLECTOR) - puts(NFormat("%s: delayed collect from %s", atoms[atom], FormatSection(globals[f].obj_sec))); - collected_symbols[i] = f; - globals[f].used = true; - } - } - - for(NOMSC6(int) i = 0; i < weak_externals.GetCount(); i++) { - int f = collected_symbols.Find(weak_externals.GetKey(i)); - if(f >= 0 && collected_symbols[f] < 0) - collected_symbols[f] = collected_symbols.Get(weak_externals[i], -1); - } - - if(idata_last >= 0) { - Index collect; - collect.Add(ObjSec(OBJ_CTOR, OBJC_IDATA_HOLE)); - if(!idata_null_found) - collect.Add(ObjSec(OBJ_CTOR, OBJC_IDATA_NULL)); - CollectSectionSymbols(collect, 0); - } - - if(!undefined.IsEmpty()) { - Vector untext; - untext.SetCount(undefined.GetCount()); - int u; - for(u = 0; u < undefined.GetCount(); u++) - untext[u] = atoms[undefined[u]]; - Vector order = GetSortOrder(untext); - PutStdOut(NFormat("%d undefined symbol(s):", untext.GetCount())); - for(u = 0; u < order.GetCount(); u++) { - int o = order[u]; - String ident = untext[o]; - ObjSec obj_sec = ext_obj_sec.Get(undefined[o], Null); - if(!IsNull(obj_sec)) { - String os_globals; - for(int t = global_obj_sec_index.Find(obj_sec); t >= 0; t = global_obj_sec_index.FindNext(t)) - if(os_globals.GetLength() >= 80) { - os_globals << "; ..."; - break; - } - else - os_globals << "; " << DemangleName(atoms[globals.GetKey(t)], linkermode == MODE_GNULD ? MANGLING_GCC : MANGLING_MSC); - PutStdOut(NFormat("%s (referenced from %s%s)", ident, FormatSection(obj_sec), os_globals)); - } - else - PutStdOut(ident); - } - error = true; - } - - if(dump_flags & DUMP_STAT) { - PutStdOut(NFormat("#objects = %d", objects.GetCount())); - int atom_size = (16 + 16) * atoms.GetCount(); - int i; - for(i = 0; i < atoms.GetCount(); i++) - atom_size += atoms[i].GetLength(); - PutStdOut(NFormat("#atoms = %d, size = %d", atoms.GetCount(), atom_size)); - int used_globals = 0; - for(i = 0; i < globals.GetCount(); i++) - if(globals[i].used) - used_globals++; - PutStdOut(NFormat("#globals = %d (%d used), size = %d", globals.GetCount(), used_globals, - (int)(globals.GetCount() * (sizeof(Symbol) + 16)))); - } - - if(error) - throw Exc("linking aborted due to fatal errors"); - - CheckDuplicates(); -} - -void LinkJob::CheckDuplicates() -{ - bool error = false; - for(int i = 0; i < globals.GetCount(); i++) - if(globals[i].type != COFF_IMAGE_SYM_TYPE_SECTION && globals.FindPrev(i) < 0) { - int atom = globals.GetKey(i); - const Symbol *first = NULL; - for(int f = i; f >= 0; f = globals.FindNext(f)) { - const Symbol& global = globals[f]; - if(!global.used || global.obj_sec.object < 0) - continue; - const ObjectFile& object = objects[global.obj_sec.object]; - if(!first) { - first = &global; - continue; - } - if(first -> type == COFF_IMAGE_SYM_TYPE_SECTION && global.type == COFF_IMAGE_SYM_TYPE_SECTION) - continue; - if((first->type == COFF_IMAGE_SYM_TYPE_IMPORT_NAME || first->type == COFF_IMAGE_SYM_TYPE_IMPORT_ORDINAL) - && global.type == first->type) { - const ObjectFile::Import& imp1 = objects[first->obj_sec.object].imports[first->value]; - const ObjectFile::Import& imp2 = objects[global.obj_sec.object].imports[global.value]; - if(imp1.imp_atom != imp2.imp_atom) - PutStdOut(NFormat("%s: import name mismatch (%s, %s)", atoms[atom], atoms[imp1.imp_atom], atoms[imp2.imp_atom])); - if(first->type == COFF_IMAGE_SYM_TYPE_IMPORT_ORDINAL && imp1.ordinal_hint != imp2.ordinal_hint) - PutStdOut(NFormat("%s: import ordinal mismatch (%d, %d)", atoms[atom], imp1.ordinal_hint, imp2.ordinal_hint)); - continue; - } - error = true; - PutStdOut(NFormat("%s: duplicate (%s / %s)", atoms[atom], - FormatSection(first->obj_sec), FormatSection(global.obj_sec))); - } - } -// if(error) -// throw Exc("duplicates found, linking aborted"); -} - -void LinkJob::CollectImports() -{ - for(int i = 0; i < dll_objects.GetCount(); i++) { - ObjectFile& of = objects[dll_objects[i]]; - ASSERT(of.dll_atom); - ASSERT(of.used_imports.IsEmpty()); - if(of.used_any) { - ObjectFile::Section& stubsec = of.sections[ObjectFile::SEC_DLL_STUBS]; - ObjectFile::Section& namesec = of.sections[ObjectFile::SEC_DLL_NAMES]; - ObjectFile::Section& impsec = of.sections[ObjectFile::SEC_DLL_IMPORTS]; - ObjectFile::Section& bimpsec = of.sections[ObjectFile::SEC_DLL_BOUND]; - ObjectFile::Section& descsec = of.sections[ObjectFile::SEC_DLL_DESCRIPTOR]; -// ObjectFile::Section& nullsec = of.sections[ObjectFile::SEC_DLL_NULL_DESC]; - String dllfn = ToUpper(GetFileName(of.object_file)); - CatN(namesec.section_data, dllfn.GetLength() + 1, dllfn); - if(namesec.section_data.GetCount() & 1) - namesec.section_data.Add(0); - namesec.size = namesec.section_data.GetCount(); - int g; - for(g = global_obj_sec_index.Find(ObjSec(of.index, ObjectFile::SEC_DLL_STUBS)); g >= 0; g = global_obj_sec_index.FindNext(g)) { - Symbol& stubimp = globals[g]; - if(!stubimp.used) - continue; -// if(of.used_stubs.Find(stubimp.value) < 0) -// PutStdOut(NFormat("stub import[%d] = %s", of.used_stubs.GetCount(), atoms[globals.GetKey(g)])); - of.used_imports.FindAdd(stubimp.value); - stubimp.value = IMP_STUB_SIZE * of.used_stubs.FindAdd(stubimp.value); - stubsec.used = impsec.used = true; - } - for(g = global_obj_sec_index.Find(ObjSec(of.index, ObjectFile::SEC_DLL_BOUND)); g >= 0; g = global_obj_sec_index.FindNext(g)) { - Symbol& imp = globals[g]; - if(!imp.used) - continue; - ObjectFile::Import& import = of.imports[imp.value]; - of.used_imports.Add(imp.value); - imp.value = IMP_ENTRY_SIZE * (1 + of.used_imports.FindAdd(imp.value)); - impsec.used = true; - } - stubsec.size = IMP_STUB_SIZE * of.used_stubs.GetCount(); - if(!of.used_imports.IsEmpty()) { - ASSERT(impsec.used); - used_dll_objects.Add(of.index); - impsec.used = bimpsec.used = namesec.used = true; - impsec.size = bimpsec.size = IMP_ENTRY_SIZE * (of.used_imports.GetCount() + 1); - impsec.section_data.SetCount(impsec.size, 0); - for(g = 0; g < of.used_imports.GetCount(); g++) { - const ObjectFile::Import& oi = of.imports[of.used_imports[g]]; - int ival = oi.ordinal_hint | 0x80000000; - if(!oi.ordinal) { // create hint/name table entry - ival = namesec.size; - String ia = atoms[oi.imp_atom]; - int offset = CatN0(namesec.section_data, ((ia.GetLength() + 4) & -2)); - PokeIW(&namesec.section_data[offset], oi.ordinal_hint); - memcpy(&namesec.section_data[offset + 2], ia, ia.GetLength()); - namesec.size = namesec.section_data.GetCount(); - } - byte *ient = impsec.section_data.GetIter(IMP_ENTRY_SIZE * (g + 1)); - PokeIL(ient, ival); - } - bimpsec.section_data <<= impsec.section_data; - descsec.used = true; - descsec.size = sizeof(COFF_IMAGE_IMPORT_DESCRIPTOR); -/* - if(used_dll_objects.GetCount() == 1) { - nullsec.used = true; - nullsec.size = sizeof(COFF_IMAGE_IMPORT_DESCRIPTOR); - } -*/ - if(dump_flags & DUMP_IMPORT) { - PutStdOut(NFormat("%s: %d imports used; %d using stub; %d bytes in name table", - of.object_file, of.used_imports.GetCount(), of.used_stubs.GetCount(), namesec.size)); - for(g = 0; g < of.used_imports.GetCount(); g++) { - int uimp = of.used_imports[g]; - const ObjectFile::Import& ofimp = of.imports[uimp]; - if(ofimp.app_atom == ofimp.imp_atom) - PutStdOut(NFormat("\t(%d) %s: %[1:stub]s", - ofimp.ordinal_hint, atoms[ofimp.imp_atom], - of.used_stubs.Find(uimp) >= 0)); - else - PutStdOut(NFormat("\t(%d) %s -> %s: %[1:stub]s", - ofimp.ordinal_hint, atoms[ofimp.app_atom], atoms[ofimp.imp_atom], - of.used_stubs.Find(uimp) >= 0)); - } - } - } - } - } -} - -void LinkJob::CollectExports() -{ - if(exports.IsEmpty()) - return; - ObjectFile& ofe = objects[OBJ_EXPORT]; - ObjectFile::Section& dir = ofe.sections[OBJE_DIRECTORY]; - ObjectFile::Section& adr = ofe.sections[OBJE_ADDRESS_TABLE]; - ObjectFile::Section& ptr = ofe.sections[OBJE_NAME_POINTERS]; - ObjectFile::Section& ord = ofe.sections[OBJE_ORDINALS]; - ObjectFile::Section& nam = ofe.sections[OBJE_NAMES]; - - dir.size = dir.raw_size = sizeof(COFF_IMAGE_EXPORT_DIRECTORY_TABLE); - COFF_IMAGE_EXPORT_DIRECTORY_TABLE expdir; - Zero(expdir); - - int min_ordinal, max_ordinal; - min_ordinal = max_ordinal = exports[0].ordinal; - Vector named_exports; - Vector named_ordinals; - for(int i = 0; i < exports.GetCount(); i++) { - int e = exports[i].ordinal; - if(e < min_ordinal) min_ordinal = e; - if(e > max_ordinal) max_ordinal = e; - if(!IsNull(exports[i].export_name)) { - named_exports.Add(exports[i].export_name); - named_ordinals.Add(e); - } - } - expdir.DateTimeStamp = time(NULL); - expdir.MajorVersion = major_version; - expdir.MinorVersion = minor_version; - expdir.NameRVA = 0; - String dll_name = ToUpper(GetFileName(outputfile)); - CatN(nam.section_data, dll_name.GetLength() + 1, dll_name); - expdir.OrdinalBase = min_ordinal; - expdir.AddressTableEntries = max_ordinal - min_ordinal + 1; - expdir.NumberOfNamePointers = named_exports.GetCount(); - - adr.size = adr.raw_size = 4 * (max_ordinal - min_ordinal + 1); - adr.section_data.SetCount(adr.size, 0); - - IndexSort(named_exports, named_ordinals, StdLess()); - ptr.size = ptr.raw_size = 4 * named_exports.GetCount(); - ord.size = ord.raw_size = 2 * named_exports.GetCount(); - ptr.section_data.SetCount(ptr.size); - ord.section_data.SetCount(ord.size); - - for(int i = 0; i < named_exports.GetCount(); i++) { - PokeIL(ptr.section_data.GetIter(4 * i), nam.section_data.GetCount()); - PokeIW(ord.section_data.GetIter(2 * i), named_ordinals[i] - min_ordinal); - String exp = named_exports[i]; - CatN(nam.section_data, exp.GetLength() + 1, exp); - } - nam.size = nam.raw_size = nam.section_data.GetCount(); - - CatN(dir.section_data, dir.size, &expdir); - - if(dump_flags & DUMP_EXPORTS) { - PutStdOut("Ordinal Export"); - for(int i = 0; i < exports.GetCount(); i++) { - String ename = exports[i].export_name; - String sname = atoms[exports.GetKey(i)]; - if(sname == ename) - PutStdOut(NFormat("%7= 0 && !idata_null_found) { - ObjectFile& of = objects[idata_last]; - ObjectFile::Section& ofsec = of.sections.Add(); -// ObjectFile::Section& prev = of.sections[of.sections.GetCount() - 2]; - ofsec.name_atom = idata_inull_atom; - ofsec.sec_atom = idata_atom; - ofsec.size = sizeof(COFF_IMAGE_IMPORT_DESCRIPTOR); - ofsec.raw_size = 0; - ofsec.offset = 0; - ofsec.flags = COFF_IMAGE_SCN_CNT_INITIALIZED_DATA - | COFF_IMAGE_SCN_MEM_READ | COFF_IMAGE_SCN_MEM_WRITE; - ofsec.ref_sec_index = of.ref_sections.GetCount(); - ofsec.ref_ext_index = of.ref_externals.GetCount(); - ofsec.sec_map_index = -1; - of.used_any = ofsec.used = true; - ofsec.type = ObjectFile::SEC_INULL; - } -*/ - -// for(i = 0; i < SEC_COUNT; i++) -// section_map[i].Clear(); -/* - if(debug_info) { - Section& se = section_map.Add(); - se.obj_sec = Null; - se.group = GRP_SYMBOLS; - se.name = ".symbols"; - se.rva = se.rfa = -1; - se.size = coff_output_symbols.GetCount() * sizeof(COFF_IMAGE_SYMBOL) - + coff_output_symbol_strings.GetLength(); - } -*/ - for(int i = 0; i < objects.GetCount(); i++) - if(objects[i].used_any) { - ObjectFile& of = objects[i]; - for(int s = 0; s < of.sections.GetCount(); s++) - if(of.sections[s].used) { - ObjectFile::Section& ofsec = of.sections[s]; - int sec_atom = section_merge.Get(ofsec.sec_atom, ofsec.sec_atom); - int sx = GRP_NONE; - if(i == OBJ_EXPORT) - sx = GRP_EDATA; - else if(sec_atom == rsrc_atom) - sx = GRP_RSRC; - else if(sec_atom == debug_atom) - sx = GRP_DEBUG; - else if(sec_atom == idata_atom) - sx = GRP_IDATA; - else if(ofsec.flags & COFF_IMAGE_SCN_CNT_CODE) - sx = GRP_CODE; - else if(!(ofsec.flags & COFF_IMAGE_SCN_MEM_WRITE)) - sx = GRP_RDATA; - else if(ofsec.flags & COFF_IMAGE_SCN_CNT_UNINITIALIZED_DATA) - sx = GRP_UDATA; - else - sx = GRP_DATA; - Section& se = section_map.Add(); - se.obj_sec = ObjSec(i, s); - se.group = sx; - se.udata = (ofsec.type == ObjectFile::SEC_ANON_COMDAT - || ofsec.type == ObjectFile::SEC_STD && ofsec.offset == 0 - || (ofsec.flags & (COFF_IMAGE_SCN_CNT_INITIALIZED_DATA - | COFF_IMAGE_SCN_CNT_UNINITIALIZED_DATA | COFF_IMAGE_SCN_CNT_CODE)) - == COFF_IMAGE_SCN_CNT_UNINITIALIZED_DATA); -/* - PutStdOut(NFormat("%s:%d, udata = %[0:no;yes]s, flags = %08x, STD = %d, offset = %d, anon = %d", - AsString(of), s, se.udata, ofsec.flags, ofsec.type == ObjectFile::SEC_STD, ofsec.offset, - (ofsec.type == ObjectFile::SEC_ANON_COMDAT - || ofsec.type == ObjectFile::SEC_STD && ofsec.offset == 0 - || (ofsec.flags & (COFF_IMAGE_SCN_CNT_INITIALIZED_DATA - | COFF_IMAGE_SCN_CNT_UNINITIALIZED_DATA | COFF_IMAGE_SCN_CNT_CODE)) - == COFF_IMAGE_SCN_CNT_UNINITIALIZED_DATA) - )); -*/ - se.sec_atom = (sx == GRP_CODE ? text_atom - : sx == GRP_DATA ? data_atom - : sx == GRP_RDATA ? rdata_atom - : sx == GRP_UDATA ? bss_atom : sec_atom); - se.name = atoms[ofsec.name_atom]; - ASSERT(!se.name.IsEmpty()); - se.size = ofsec.size; - if(ofsec.sec_atom == idata_atom || ofsec.sec_atom == crt_atom) { - se.name << ':'; - if(!IsNull(of.library_file)) - se.name << of.library_file << ':'; - se.name << of.object_file; - } - - if(ofsec.type == ObjectFile::SEC_STD) { - String ofile = Nvl(of.library_file, of.object_file); - FileMapping& mapping = GetMapping(ofile); - if(!mapping.IsOpen()) - throw Exc(NFormat("%s: error opening file", ofile)); - - const byte *begin = mapping.Begin() + of.library_offset; -// const COFF_IMAGE_FILE_HEADER *header = (const COFF_IMAGE_FILE_HEADER *)begin; -// const COFF_IMAGE_SECTION_HEADER *sechdr = (const COFF_IMAGE_SECTION_HEADER *)(begin -// + sizeof(COFF_IMAGE_FILE_HEADER) + header->SizeOfOptionalHeader); - if(ofsec.offset) { - ofsec.section_data.SetCount(ofsec.raw_size); - memcpy(ofsec.section_data.Begin(), begin + ofsec.offset, ofsec.raw_size); - } -/* - if(debug_info) { - const COFF_IMAGE_SYMBOL *symtbl = (const COFF_IMAGE_SYMBOL *) - (begin + header->PointerToSymbolTable); - const COFF_IMAGE_SYMBOL *symend = symtbl + header->NumberOfSymbols; - const char *strtbl = (const char *)symend; - for(const COFF_IMAGE_SYMBOL *symp = symtbl; symp < symend; symp++) { -/ * - if(symp->StorageClass == COFF_IMAGE_SYM_CLASS_STATIC && symp->SectionNumber != 0 - && symp->Value == 0 && symp->NumberOfAuxSymbols >= 1) - symp += symp->NumberOfAuxSymbols; // section entry - else -* / - if((symp->StorageClass == COFF_IMAGE_SYM_CLASS_EXTERNAL - || symp->StorageClass == COFF_IMAGE_SYM_CLASS_WEAK_EXTERNAL) - && AddCOFFSymbol(COFFSymbolName(*symp, strtbl), of.index, *symp)) - for(int naux = symp->NumberOfAuxSymbols; --naux >= 0;) - AddAuxCOFFSymbol(*++symp); - else - symp += symp->NumberOfAuxSymbols; - } - } -*/ - } - } - } - - ZeroArray(groups); - Sort(section_map, &LinkJob::Less); - section_object_index.Reserve(section_map.GetCount()); -// section_obj_sec_index.Reserve(section_map.GetCount()); - int rva = 0; //, rfa = 0; - int prev_sec = 0; - int prev_grp = 0; - for(NOMSC6(int) i = 0; i < section_map.GetCount(); i++) { - Section& section = section_map[i]; - int rva_align = image_align, rfa_align = image_align; - ObjectFile::Section& ofsec = GetSection(section.obj_sec); -// ofsec_atom = ofsec.name_atom; - rva_align = CoffGetLengthAlignment(1 << CoffSectionAlignShift(ofsec.flags), ofsec.size); - rfa_align = rva_align; -// sec_size = ofsec.size; - ofsec.sec_map_index = i; - if(section.sec_atom != prev_sec) { - section_name_map.Add(prev_sec = section.sec_atom, i); - rva_align = max(rva_align, image_align); - rfa_align = max(rfa_align, file_align); - } - section.app_section = section_name_map.GetCount() - 1; - section.rva = rva = (rva + rva_align - 1) & -rva_align; -// section.rfa = rfa = (rfa + rfa_align - 1) & -rfa_align; - if(iat2_rva == 0 && ofsec.name_atom == idata_iat2_atom) - iat2_rva = iat2_end_rva = rva; - if(idesc_rva == 0 && ofsec.sec_atom == idata_atom) - idesc_rva = idesc_end_rva = rva; - if(rsrc_rva == 0 && ofsec.sec_atom == rsrc_atom) - rsrc_rva = rsrc_end_rva = rva; - section_object_index.Add(section.obj_sec.object); -// section_obj_sec_index.Add(section.obj_sec); - rva += section.size; -// rfa += ofsec.size; - if(ofsec.name_atom == idata_iat2_atom) - iat2_end_rva = rva; -// if(ofsec.name_atom == idata_idesc_atom || ofsec.name_atom == idata_inull_atom) -// idesc_end_rva = rva; - if(ofsec.sec_atom == idata_atom) - idesc_end_rva = rva; - if(ofsec.sec_atom == rsrc_atom) - rsrc_end_rva = rva; - const Section *nxt = (i + 1 >= section_map.GetCount() ? NULL : §ion_map[i + 1]); - while(prev_grp <= section.group) - groups[prev_grp++].first_section = i; - } - while(prev_grp <= GRP_COUNT) - groups[prev_grp++].first_section = section_map.GetCount(); - - int rfa = 0, end_rva = 0; - for(NOMSC6(int) i = 0; i <= GRP_COUNT; i++) { - int first = groups[i].first_section; - if(first >= section_map.GetCount()) { - groups[i].rva = end_rva; - groups[i].rfa = rfa; - continue; - } - const Section& sec = section_map[first]; - int last = groups[i + 1].first_section - 1; - const Section& lastsec = section_map[last]; -// const ObjectFile::Section& oflast = GetSection(lastsec.obj_sec); - while(last >= first && section_map[last].udata) - last--; - const Section *rawsec = (last >= first ? §ion_map[last] : NULL); -// const ObjectFile::Section& ofsec = GetSection(sec.obj_sec); - groups[i].rva = sec.rva; - groups[i].rfa = rfa; - groups[i].raw_size = rawsec ? rawsec->rva + GetSection(rawsec->obj_sec).size - sec.rva : 0; - end_rva = (lastsec.rva + sec.size + image_align - 1) & -image_align; - rfa = (rfa + groups[i].raw_size + file_align - 1) & -file_align; - } - - for(NOMSC6(int) i = 0; i < section_map.GetCount(); i++) { - Section& sec = section_map[i]; - Group& grp = groups[sec.group]; - if(!sec.udata) - sec.rfa = sec.rva - grp.rva + grp.rfa; - } - - if(dump_flags & DUMP_STAT) - PutStdOut(NFormat("#collected sections = %d", section_map.GetCount())); -} - -void LinkJob::RelocateGlobals() -{ - for(int i = 0; i < globals.GetCount(); i++) { - Symbol& global = globals[i]; - if(global.used) { - if(global.type != COFF_IMAGE_SYM_TYPE_BASE && global.obj_sec.section >= 0) { - ObjSec os = global.obj_sec; -// if(os.section == 0 && global.type < COFF_IMAGE_SYM_TYPE_SPECIAL) -// os.object = 0; // comdat - global.value += section_map[GetSection(os).sec_map_index].rva + code_rva; - } - global.relocated = true; - } - } -} - -void LinkJob::RelocateExports() -{ - ObjectFile& ofe = objects[OBJ_EXPORT]; - if(!ofe.used_any) - return; - - ObjectFile::Section& dir = ofe.sections[OBJE_DIRECTORY]; - ObjectFile::Section& adr = ofe.sections[OBJE_ADDRESS_TABLE]; - ObjectFile::Section& ptr = ofe.sections[OBJE_NAME_POINTERS]; - ObjectFile::Section& ord = ofe.sections[OBJE_ORDINALS]; - ObjectFile::Section& nam = ofe.sections[OBJE_NAMES]; - ASSERT(dir.sec_map_index >= 0 && adr.sec_map_index >= 0 && nam.sec_map_index >= 0); - - int nam_rva = section_map[nam.sec_map_index].rva + code_rva; - int ptr_rva = section_map[ptr.sec_map_index].rva + code_rva; - int adr_rva = section_map[adr.sec_map_index].rva + code_rva; - - COFF_IMAGE_EXPORT_DIRECTORY_TABLE expdir; - memcpy(&expdir, dir.section_data.Begin(), sizeof(expdir)); - expdir.NameRVA = nam_rva; - expdir.ExportAddressTableRVA = adr_rva; - if(ptr.sec_map_index >= 0) { - ASSERT(ord.sec_map_index >= 0); - expdir.NamePointerTableRVA = ptr_rva; - expdir.OrdinalTableRVA = section_map[ord.sec_map_index].rva + code_rva; - } - memcpy(dir.section_data.Begin(), &expdir, sizeof(expdir)); - - for(int i = 0; i < ptr.size; i += 4) { - byte *p = ptr.section_data.GetIter(i); - PokeIL(p, PeekIL(p) + nam_rva); - } - - for(int i = 0; i < exports.GetCount(); i++) { - int f = collected_symbols.Get(exports.GetKey(i), -1); - if(f >= 0) { - Symbol& sym = globals[f]; - int offset = 4 * (exports[i].ordinal - expdir.OrdinalBase); - PokeIL(adr.section_data.GetIter(offset), sym.value); - } - } -} - -bool LinkJob::Less(const Section& a, const Section& b) -{ - int i; - if((i = a.group - b.group) || (i = cmp(a.name, b.name))) - return i < 0; - if((i = a.obj_sec.object - b.obj_sec.object) || (i = a.obj_sec.section - b.obj_sec.section)) - return i < 0; - return false; -} - -void LinkJob::AddAuxCOFFSymbol(const COFF_IMAGE_SYMBOL& sym) -{ - coff_output_symbols.Add() = sym; -} - -bool LinkJob::AddCOFFSymbol(String name, int object, const COFF_IMAGE_SYMBOL& sym) -{ - int value = sym.Value; - int secno = sym.SectionNumber; -// bool reloc_value = false; - if(*name == '.' && sym.StorageClass != COFF_IMAGE_SYM_CLASS_FILE) - return false; // probably also section entry - if(sym.SectionNumber == 0 && sym.StorageClass == COFF_IMAGE_SYM_CLASS_EXTERNAL - || sym.StorageClass != COFF_IMAGE_SYM_CLASS_EXTERNAL) { -/* || sym.StorageClass == COFF_IMAGE_SYM_CLASS_BLOCK || sym.StorageClass == COFF_IMAGE_SYM_CLASS_FUNCTION - || sym.StorageClass == COFF_IMAGE_SYM_CLASS_END_OF_STRUCT// || sym.StorageClass == COFF_IMAGE_SYM_CLASS_FILE - || sym.StorageClass == COFF_IMAGE_SYM_CLASS_REGISTER_PARAM || sym.StorageClass == COFF_IMAGE_SYM_CLASS_ARGUMENT - || sym.StorageClass == COFF_IMAGE_SYM_CLASS_REGISTER || sym.StorageClass == COFF_IMAGE_SYM_CLASS_AUTOMATIC - || sym.StorageClass == COFF_IMAGE_SYM_CLASS_END_OF_FUNCTION || sym.StorageClass == COFF_IMAGE_SYM_CLASS_SECTION) { // external symbol / anon COMDAT -*/ - return false; -/* - int global = collected_symbols.Get(Atomize(name), -1); - if(global < 0) - return false; - value = globals[global].value; - if(globals[global].obj_sec.section > 0) - reloc_value = true; -*/ - } - - int appsec = sym.SectionNumber; - if(sym.SectionNumber >= 0) { - int sec_map_index = GetSection(ObjSec(object, sym.SectionNumber)).sec_map_index; - if(sec_map_index < 0) - return false; - appsec = section_map[sec_map_index].app_section; - value += section_map[sec_map_index].rva - section_map[section_name_map[appsec]].rva; - appsec++; -// reloc_value = true; - } - - int offset = coff_output_symbols.GetCount() * sizeof(COFF_IMAGE_SYMBOL); - COFF_IMAGE_SYMBOL& outsym = coff_output_symbols.Add(); - Zero(outsym); - if(name.GetLength() <= 8) - memcpy(outsym.N.ShortName, name, name.GetLength()); - else { - outsym.N.Name.Long = coff_output_symbol_strings.GetLength() + 4; - coff_output_symbol_strings.Cat(name, name.GetLength() + 1); -// coff_reloc_offsets.Add(offset + __offsetof(COFF_IMAGE_SYMBOL, N.Name.Long)); - } -// if(reloc_value) -// { -// value += image_base; -// coff_reloc_offsets.Add(offset + __offsetof(COFF_IMAGE_SYMBOL, Value)); -// } - outsym.Value = value; - outsym.SectionNumber = appsec; - outsym.StorageClass = sym.StorageClass; - outsym.Type = sym.Type; - outsym.NumberOfAuxSymbols = sym.NumberOfAuxSymbols; - return true; -} - -void LinkJob::AddGlobal(int atom, const Symbol& symbol) -{ - if(!symbol.external) - obj_static_global_index.Add(Point(symbol.obj_sec.object, atom), globals.GetCount()); - globals.Add(atom, symbol); - global_obj_sec_index.Add(symbol.obj_sec); -} - -void LinkJob::PrepareImageHeader() -{ - output_image_header.Clear(); - String stub_data; - if(!stub_filename.IsEmpty()) { - stub_data = ::LoadFile(stub_filename); - if(stub_data.IsVoid()) - PutStdOut(NFormat("%s: error loading stub file", stub_filename)); - } - if(IsNull(stub_data)) - stub_data = String(std_stub, sizeof(std_stub)); - - CatN(output_image_header, stub_data.GetLength(), stub_data); - if(output_image_header.GetCount() < 0x40) - output_image_header.SetCountR(0x40, 0); - PokeIL(output_image_header.GetIter(0x3C), output_image_header.GetCount()); - CatN(output_image_header, 4, "PE\0\0"); - ifhdr_pos = CatN0(output_image_header, sizeof(COFF_IMAGE_FILE_HEADER)); - iohdr_pos = CatN0(output_image_header, sizeof(COFF_IMAGE_OPTIONAL_HEADER32)); - section_count = section_name_map.GetCount(); - if(has_stabs && debug_info) { - stab_section = section_count++; - stabstr_section = section_count++; - } - if(debug_info) { -// has_symbols = true; - symbol_section = section_count++; - } - if(!image_fixed) { -// has_relocs = true; - reloc_section = section_count++; - } - secmap_pos = CatN0(output_image_header, sizeof(COFF_IMAGE_SECTION_HEADER) * section_count); -// impmap_pos = CatN0(output_image, sizeof(COFF_IMAGE_IMPORT_DESCRIPTOR) * (used_dll_objects.GetCount() + 1)); - header_size = output_image_header.GetCount(); - code_rfa = (header_size + file_align - 1) & -file_align; - code_rva = (header_size + image_align - 1) & -image_align; - output_image_header.SetCount(code_rfa, 0); // + groups[GRP_COUNT].rfa, 0); -// memset(output_image_header.GetIter(code_rfa), 0x90, groups[GRP_DATA_BEGIN].rfa - groups[GRP_TEXT_BEGIN].rfa); -} - -static bool SymTblLess(const COFF_IMAGE_SYMBOL& a, const COFF_IMAGE_SYMBOL& b) -{ - if(a.SectionNumber != b.SectionNumber) return a.SectionNumber < b.SectionNumber; - return a.Value < b.Value; -} - -void LinkJob::PrepareSymbolTable() -{ - LTIMING("LinkJob::PrepareSymbolTable"); - - for(int i = 0; i < globals.GetCount(); i++) { - const Symbol& sym = globals[i]; - if(sym.used && sym.obj_sec.object >= 0) { - COFF_IMAGE_SYMBOL cis; - Zero(cis); - cis.Value = sym.value; - cis.SectionNumber = -1; - cis.StorageClass = COFF_IMAGE_SYM_CLASS_EXTERNAL; - cis.Type = sym.type; - cis.NumberOfAuxSymbols = 0; - if(sym.obj_sec.section >= 0) { - int sec = GetSection(sym.obj_sec).sec_map_index; - if(sec < 0) - continue; - cis.SectionNumber = section_map[sec].app_section; - cis.Value -= section_map[section_name_map[cis.SectionNumber]].rva; - } - String name = atoms[globals.GetKey(i)]; - if(name.GetLength() <= 8) - memcpy(cis.N.ShortName, name, name.GetLength()); - else { - cis.N.Name.Long = coff_output_symbol_strings.GetLength() + 4; - coff_output_symbol_strings.Cat(name, name.GetLength() + 1); - } - coff_output_symbols.Add(cis); - } - } - -/* - for(int i = 0; i < section_name_map.GetCount(); i++) { // generate section beginning symbols - COFF_IMAGE_SYMBOL secsym; - Zero(secsym); - strncpy((char *)secsym.N.ShortName, atoms[section_name_map.GetKey(i)], 8); - secsym.SectionNumber = i + 1; - secsym.Value = 0; - secsym.StorageClass = COFF_IMAGE_SYM_CLASS_EXTERNAL; - coff_output_symbols.Add(secsym); - } -*/ - -// Sort(coff_output_symbols, &SymTblLess); - int rawsize = coff_output_symbols.GetCount() * sizeof(COFF_IMAGE_SYMBOL) - + 4 + coff_output_symbol_strings.GetLength(); - int imagesize = (rawsize + image_align - 1) & -image_align; - int filesize = (rawsize + file_align - 1) & -file_align; - for(int g = GRP_SYMBOLS; ++g <= GRP_COUNT;) { - groups[g].rva += imagesize; - groups[g].rfa += filesize; - } -// for(int g = 0; g < coff_output_symbols.GetCount(); g += 1 + coff_output_symbols[g].NumberOfAuxSymbols) -// if(coff_output_symbols[g].N.Name.Short == 0) -// coff_output_symbols[g].N.Name.Long += groups[GRP_SYMBOLS].rva + code_rva + image_base; -} - -#ifdef CPU_LE // && CPU_32BIT - #define GET_STAB(dest, ptr) dest = (STAB_INFO *)(ptr); -#else - #define GET_STAB(dest, ptr) \ - dest->strdx = PeekIL(ptr + STAB_STRDXOFF); \ - dest->type = ptr[STAB_TYPEOFF]; \ - dest->other = ptr[STAB_OTHEROFF]; \ - dest->desc = PeekIW(ptr + STAB_DESCOFF); \ - dest->value = PeekIL(ptr + STAB_VALUEOFF); -#endif - -void LinkJob::PrepareStabBlocks() -{ - LTIMING("LinkJob::PrepareStabBlocks"); - - int count_stabs = output_stab_info.GetCount() / STAB_STABSIZE; - if(dump_flags & DUMP_STABS) { - STAB_INFO aux_stab, *stab = &aux_stab; - for(int i = 0; i < count_stabs; i++) { - GET_STAB(stab, output_stab_info.GetIter(i * STAB_STABSIZE)); - String desc; - desc << NFormat("[%d]: type %02x, desc %04x, value %08x, %s", - i, stab->type, stab->desc, stab->value, output_stab_strings.GetIter(stab->strdx)); - puts(desc); - } - puts(NFormat("Total %d stabs, .stab = %d B, .stabstr = %d B", - count_stabs, output_stab_info.GetCount(), output_stab_strings.GetCount())); - } -/* - for(int f = 0; f < output_stab_fixup_pos.GetCount(); f++) { - int sec_index = GetSection(output_stab_fixups[f]).sec_map_index; - if(sec_index >= 0) { - int pos = output_stab_fixup_pos[f]; - byte *p = output_stab_info.GetIter(STAB_STABSIZE * pos + STAB_VALOFF); - PokeIL(p, PeekIL(p) + section_map[sec_index].rva + code_rva + image_base); - highlow_fixup_rva.Add(pos * STAB_STABSIZE + STAB_VALOFF + groups[GRP_STAB].rva + code_rva); - } - } -*/ - PokeIW(output_stab_info.GetIter(STAB_DESCOFF), count_stabs); - PokeIL(output_stab_info.GetIter(STAB_VALOFF), output_stab_strings.GetCount()); - - groups[GRP_STABSTR].rva = groups[GRP_STAB].rva + ((output_stab_info.GetCount() + image_align - 1) & -image_align); - groups[GRP_STABSTR].rfa = groups[GRP_STAB].rfa + ((output_stab_info.GetCount() + file_align - 1) & -file_align); - groups[GRP_COUNT].rva = groups[GRP_SYMBOLS].rva = groups[GRP_STABSTR].rva + ((output_stab_strings.GetCount() + image_align - 1) & -image_align); - groups[GRP_COUNT].rfa = groups[GRP_SYMBOLS].rfa = groups[GRP_STABSTR].rfa + ((output_stab_strings.GetCount() + file_align - 1) & -file_align); -} - -void LinkJob::PrepareFixupBlocks() -{ - Sort(highlow_fixup_rva); - int first = -1; - Vector block; - for(int i = 0; i < highlow_fixup_rva.GetCount(); i++) { - int fp = highlow_fixup_rva[i]; - ASSERT(i == 0 || fp > highlow_fixup_rva[i - 1]); // duplicate relocations - if(block.IsEmpty() || ((fp ^ first) & -4096)) { - if(!block.IsEmpty()) { - ASSERT(first >= 0); - if(block.GetCount() & 2) { - block.Add(0); - block.Add(0); - } - int o = CatN(output_fixups, 8, NULL); - PokeIL(&output_fixups[o], first); - PokeIL(&output_fixups[o + 4], 8 + block.GetCount()); - output_fixups.AppendPick(block); - block.Clear(); - } - first = fp & -4096; - } - fp -= first; - block.Add(fp); - block.Add((fp >> 8) + 16 * COFF_IMAGE_REL_BASED_HIGHLOW); - } - if(!block.IsEmpty()) { - ASSERT(first >= 0); - if(block.GetCount() & 2) { - block.Add(0); - block.Add(0); - } - int o = CatN(output_fixups, 8, NULL); - PokeIL(&output_fixups[o], first); - PokeIL(&output_fixups[o + 4], 8 + block.GetCount()); - output_fixups.AppendPick(block); - } -} - -void LinkJob::PrepareImageInfo() -{ - CheckUnresolved(); - if(debug_info && stab_section >= 0) - PrepareStabBlocks(); -// if(has_symbols) - if(symbol_section >= 0) - PrepareSymbolTable(); - if(!image_fixed) - PrepareFixupBlocks(); - - if(dump_flags & DUMP_SECTIONS) { - PutStdOut(NFormat("Sections (%d total, %d parts):", section_name_map.GetCount(), section_map.GetCount())); - for(int i = 0; i < section_name_map.GetCount(); i++) { - const Section& sec = section_map[section_name_map[i]]; - int last_index = (i + 1 < section_name_map.GetCount() - ? section_name_map[i + 1] : section_map.GetCount()) - 1; - const Section& last = section_map[last_index]; - const ObjectFile::Section& oflast = GetSection(last.obj_sec); - PutStdOut(NFormat("%10= 0; s = global_obj_sec_index.FindNext(s)) - if(globals[s].type != COFF_IMAGE_SYM_TYPE_SECTION) - PutStdOut(NFormat("\tdefines: %s", atoms[globals.GetKey(s)])); - } -// for(i = 0; i < section_name_map.GetCount(); i++) -/// PutStdOut(NFormat("%s - } - - int i; - for(i = 0; i < section_name_map.GetCount(); i++) { - COFF_IMAGE_SECTION_HEADER sechdr; - Zero(sechdr); - String name = atoms[section_name_map.GetKey(i)]; - memcpy(sechdr.Name, name, min(name.GetLength(), 8)); - int first_part = section_name_map[i]; - Section& first = section_map[first_part]; - int last_part; - if(i + 1 < section_name_map.GetCount()) - last_part = section_name_map[i + 1] - 1; - else - last_part = section_map.GetCount() - 1; - const Section& last = section_map[last_part]; - sechdr.Misc.VirtualSize = last.rva - first.rva + GetSection(last.obj_sec).size; - sechdr.VirtualAddress = code_rva + first.rva; - sechdr.SizeOfRawData = 0; - for(; last_part >= first_part; last_part--) { - const Section& chk = section_map[last_part]; - if(!chk.udata) { - const ObjectFile::Section& ofsec = GetSection(chk.obj_sec); - sechdr.SizeOfRawData = chk.rva - first.rva + ofsec.size; - break; - } - } - sechdr.SizeOfRawData = (sechdr.SizeOfRawData + file_align - 1) & -file_align; - sechdr.PointerToRawData = (sechdr.SizeOfRawData ? code_rfa + first.rfa : 0); - sechdr.PointerToRelocations = 0; - sechdr.PointerToLinenumbers = 0; - sechdr.Characteristics = GetSection(first.obj_sec).flags - & (COFF_IMAGE_SCN_CNT_CODE | COFF_IMAGE_SCN_CNT_INITIALIZED_DATA | COFF_IMAGE_SCN_CNT_UNINITIALIZED_DATA - | COFF_IMAGE_SCN_MEM_EXECUTE | COFF_IMAGE_SCN_MEM_READ | COFF_IMAGE_SCN_MEM_WRITE - | COFF_IMAGE_SCN_MEM_SHARED | COFF_IMAGE_SCN_MEM_DISCARDABLE | COFF_IMAGE_SCN_MEM_NOT_CACHED - | COFF_IMAGE_SCN_MEM_NOT_PAGED); - memcpy(&output_image_header[secmap_pos + (int)sizeof(COFF_IMAGE_SECTION_HEADER) * i], &sechdr, sizeof(sechdr)); - } - - enum { -// STAB_SEC_STYLE = COFF_IMAGE_SCN_CNT_INITIALIZED_DATA | COFF_IMAGE_SCN_MEM_READ -// | COFF_IMAGE_SCN_MEM_SHARED | COFF_IMAGE_SCN_MEM_DISCARDABLE - STAB_SEC_STYLE = COFF_IMAGE_SCN_MEM_DISCARDABLE | COFF_IMAGE_SCN_MEM_READ - | COFF_IMAGE_SCN_TYPE_NOLOAD | COFF_IMAGE_SCN_LNK_REMOVE - }; - - if(stab_section >= 0) { - COFF_IMAGE_SECTION_HEADER stab; - Zero(stab); - strcpy((char *)stab.Name, ".stab"); - stab.Misc.VirtualSize = output_stab_info.GetCount(); - stab.SizeOfRawData = (stab.Misc.VirtualSize + file_align - 1) & -file_align; - stab.VirtualAddress = groups[GRP_STAB].rva + code_rva; - stab.PointerToRawData = groups[GRP_STAB].rfa + code_rfa; - stab.Characteristics = STAB_SEC_STYLE; - memcpy(&output_image_header[secmap_pos + (int)sizeof(COFF_IMAGE_SECTION_HEADER) * stab_section], - &stab, sizeof(stab)); - } - - if(stabstr_section >= 0) { - COFF_IMAGE_SECTION_HEADER stabstr; - Zero(stabstr); - memcpy((char *)stabstr.Name, ".stabstr", 8); - stabstr.Misc.VirtualSize = output_stab_strings.GetCount(); - stabstr.SizeOfRawData = (stabstr.Misc.VirtualSize + file_align - 1) & -file_align; -// stabstr.Misc.VirtualSize = stabstr.SizeOfRawData = groups[GRP_COUNT].rva - groups[GRP_STABSTR].rva; - stabstr.VirtualAddress = groups[GRP_STABSTR].rva + code_rva; - stabstr.PointerToRawData = groups[GRP_STABSTR].rfa + code_rfa; - stabstr.Characteristics = STAB_SEC_STYLE; - memcpy(&output_image_header[secmap_pos + (int)sizeof(COFF_IMAGE_SECTION_HEADER) * stabstr_section], - &stabstr, sizeof(stabstr)); - } - - if(symbol_section >= 0) { - COFF_IMAGE_SECTION_HEADER sym; - Zero(sym); - strcpy((char *)sym.Name, ".symbol"); - sym.Misc.VirtualSize = coff_output_symbols.GetCount() * sizeof(COFF_IMAGE_SYMBOL) - + 4 + coff_output_symbol_strings.GetLength(); - sym.SizeOfRawData = (sym.Misc.VirtualSize + file_align - 1) & -file_align; - sym.VirtualAddress = groups[GRP_SYMBOLS].rva + code_rva; - sym.PointerToRawData = groups[GRP_SYMBOLS].rfa + code_rfa; - sym.Characteristics = COFF_IMAGE_SCN_LNK_REMOVE | COFF_IMAGE_SCN_MEM_DISCARDABLE - | COFF_IMAGE_SCN_MEM_READ | COFF_IMAGE_SCN_TYPE_NOLOAD; - memcpy(&output_image_header[secmap_pos + (int)sizeof(COFF_IMAGE_SECTION_HEADER) * symbol_section], - &sym, sizeof(sym)); - } - - output_fixup_size = 0; - if(reloc_section >= 0) { // fill in relocation segment header - COFF_IMAGE_SECTION_HEADER reloc; - Zero(reloc); - strcpy((char *)reloc.Name, ".reloc"); - reloc.SizeOfRawData = reloc.Misc.VirtualSize = output_fixups.GetCount(); - output_fixup_size = (reloc.Misc.VirtualSize + file_align - 1) & -file_align; - reloc.VirtualAddress = groups[GRP_COUNT].rva + code_rva; - reloc.PointerToRawData = groups[GRP_COUNT].rfa + code_rfa; - reloc.Characteristics = COFF_IMAGE_SCN_MEM_DISCARDABLE | COFF_IMAGE_SCN_MEM_READ; - memcpy(&output_image_header[secmap_pos + (int)sizeof(COFF_IMAGE_SECTION_HEADER) * reloc_section], - &reloc, sizeof(reloc)); - } - -/* - for(i = 0; i < used_dll_objects.GetCount(); i++) { - const ObjectFile& of = objects[used_dll_objects[i]]; - COFF_IMAGE_IMPORT_DESCRIPTOR idesc; - Zero(idesc); - idesc.OriginalFirstThunk = section_map[of.sections[ObjectFile::SEC_DLL_IMPORTS].sec_map_index].rva; - idesc.ForwarderChain = -1; - idesc.Name = section_map[of.sections[ObjectFile::SEC_DLL_NAMES].sec_map_index].rva; - idesc.FirstThunk = section_map[of.sections[ObjectFile::SEC_DLL_BOUND].sec_map_index].rva; - memcpy(&output_image[impmap_pos + i * (int)sizeof(idesc)], &idesc, sizeof(idesc)); - } -*/ - COFF_IMAGE_OPTIONAL_HEADER32 opthdr; - Zero(opthdr); - opthdr.Magic = 0x10b; // PE32; PE32+ = 0x20b - opthdr.MajorLinkerVersion = ULD_VERSION_MAJOR * 10 + ULD_VERSION_MINOR; - opthdr.MinorLinkerVersion = ULD_VERSION_RELEASE; - opthdr.SizeOfCode = groups[GRP_DATA_BEGIN].rva; - opthdr.SizeOfInitializedData = groups[GRP_BSS_BEGIN].rva - groups[GRP_DATA_BEGIN].rva; - opthdr.SizeOfUninitializedData = groups[GRP_BSS_END].rva - groups[GRP_BSS_BEGIN].rva; - int entry = collected_symbols[0]; - if(entry >= 0) { - const Symbol& sym = globals[entry]; - if(sym.obj_sec.section < 0 && !image_fixed) - PutStdOut(NFormat("%s: absolute entry point in non-fixed application, application may not work", atoms[globals.GetKey(entry)])); - opthdr.AddressOfEntryPoint = sym.value; - } - opthdr.BaseOfCode = code_rva; - opthdr.BaseOfData = code_rva + groups[GRP_DATA_BEGIN].rva; - - opthdr.ImageBase = image_base; - opthdr.SectionAlignment = image_align; - opthdr.FileAlignment = file_align; - opthdr.MajorOperatingSystemVersion = 4; - opthdr.MinorOperatingSystemVersion = 0; - opthdr.MajorImageVersion = major_version; - opthdr.MinorImageVersion = minor_version; - opthdr.MajorSubsystemVersion = 4; - opthdr.MinorSubsystemVersion = 0; - opthdr.Win32VersionValue = 0; -// opthdr.SizeOfImage = (code_rva + groups[GRP_COUNT].rva + output_fixups.GetCount() + file_align - 1) & -file_align; - opthdr.SizeOfImage = code_rva + groups[GRP_COUNT].rva + ((output_fixup_size + image_align - 1) & -image_align); - opthdr.SizeOfHeaders = code_rfa; - opthdr.CheckSum = 0; - opthdr.Subsystem = subsystem; - opthdr.DllCharacteristics; - opthdr.SizeOfStackReserve = stack_reserve; - opthdr.SizeOfStackCommit = stack_commit; - opthdr.SizeOfHeapReserve = heap_reserve; - opthdr.SizeOfHeapCommit = heap_commit; - opthdr.LoaderFlags = 0; - opthdr.NumberOfRvaAndSizes = __countof(opthdr.DataDirectory); - opthdr.DataDirectory[COFF_IMAGE_DIRECTORY_ENTRY_BASERELOC].Size = output_fixups.GetCount(); - if(!output_fixups.IsEmpty()) - opthdr.DataDirectory[COFF_IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress = groups[GRP_COUNT].rva + code_rva; - if(opthdr.DataDirectory[COFF_IMAGE_DIRECTORY_ENTRY_EXPORT].Size = groups[GRP_EDATA].raw_size) - opthdr.DataDirectory[COFF_IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress = groups[GRP_EDATA].rva + code_rva; - if(opthdr.DataDirectory[COFF_IMAGE_DIRECTORY_ENTRY_IMPORT].Size = idesc_end_rva - idesc_rva) - opthdr.DataDirectory[COFF_IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress = idesc_rva + code_rva; - if(opthdr.DataDirectory[COFF_IMAGE_DIRECTORY_ENTRY_IAT].Size = iat2_end_rva - iat2_rva) - opthdr.DataDirectory[COFF_IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress = iat2_rva + code_rva; - if(opthdr.DataDirectory[COFF_IMAGE_DIRECTORY_ENTRY_RESOURCE].Size = rsrc_end_rva - rsrc_rva) - opthdr.DataDirectory[COFF_IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress = code_rva + rsrc_rva; - memcpy(&output_image_header[iohdr_pos], &opthdr, sizeof(opthdr)); - - COFF_IMAGE_FILE_HEADER ifhdr; - Zero(ifhdr); - ifhdr.Machine = machine; - ifhdr.NumberOfSections = section_count; - ifhdr.TimeDateStamp = timestamp = time(NULL); - ifhdr.PointerToSymbolTable = 0; - ifhdr.NumberOfSymbols = 0; - if(symbol_section >= 0) { - ifhdr.PointerToSymbolTable = code_rfa + groups[GRP_SYMBOLS].rfa; - ifhdr.NumberOfSymbols = coff_output_symbols.GetCount(); - } - ifhdr.SizeOfOptionalHeader = sizeof(opthdr); //!! temporary - ifhdr.Characteristics = COFF_IMAGE_FILE_EXECUTABLE_IMAGE - | COFF_IMAGE_FILE_32BIT_MACHINE -// | COFF_IMAGE_FILE_BYTES_REVERSED_LO - | COFF_IMAGE_FILE_LINE_NUMS_STRIPPED - | (debug_info ? 0 : COFF_IMAGE_FILE_LOCAL_SYMS_STRIPPED) - | (debug_info ? 0 : COFF_IMAGE_FILE_DEBUG_STRIPPED) - | (image_fixed ? COFF_IMAGE_FILE_RELOCS_STRIPPED : 0) - | (make_dll ? COFF_IMAGE_FILE_DLL : 0) - // COFF_IMAGE_FILE_AGGRESSIVE_WS_TRIM - // COFF_IMAGE_FILE_LARGE_ADDRESS_AWARE - // COFF_IMAGE_FILE_16BIT_MACHINE - // COFF_IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP - // COFF_IMAGE_FILE_SYSTEM - // COFF_IMAGE_FILE_DLL - // COFF_IMAGE_FILE_UP_SYSTEM_ONLY - // COFF_IMAGE_FILE_BYTES_REVERSED_HI - ; - memcpy(&output_image_header[ifhdr_pos], &ifhdr, sizeof(ifhdr)); - - if(dump_flags & DUMP_STAT) { - PutStdOut(NFormat("Preferred image base: %08x", image_base)); - PutStdOut(NFormat("Entry point RVA: %08x", (int)opthdr.AddressOfEntryPoint)); - } -} - -void LinkJob::WriteImageFile() -{ - outputfile = AppendExt(outputfile, ".exe"); - FileOut fo; - if(!fo.Open(outputfile)) - throw Exc(NFormat("%s: error creating file", outputfile)); - if(verbose) - PutStdOut(NFormat("%s: writing output file (%d bytes)", - outputfile, groups[GRP_COUNT].rfa + code_rfa + output_fixups.GetCount())); - fo.Put(output_image_header.Begin(), output_image_header.GetCount()); - byte fill = 0x90; - for(int i = 0; i < section_map.GetCount(); i++) { - const Section& sec = section_map[i]; - if(sec.udata || sec.rfa < 0) - continue; - int offset = sec.rfa + code_rfa; - if((unsigned)offset > fo.GetPos()) - fo.Put(fill, offset - fo.GetPos()); - const ObjectFile::Section& ofsec = GetSection(sec.obj_sec); - fo.Put(ofsec.section_data.Begin(), min(ofsec.section_data.GetCount(), sec.size)); - if(sec.group != GRP_CODE) - fill = 0x00; - } - if(stab_section >= 0) { - fo.Put(0, int(groups[GRP_STAB].rfa + code_rfa - fo.GetPos())); - fo.Put(output_stab_info.Begin(), output_stab_info.GetCount()); - } - if(stabstr_section >= 0) { - fo.Put(0, int(groups[GRP_STABSTR].rfa + code_rfa - fo.GetPos())); - fo.Put(output_stab_strings.Begin(), output_stab_strings.GetCount()); - } - if(symbol_section >= 0) { - fo.Put(0, int(groups[GRP_SYMBOLS].rfa + code_rfa - fo.GetPos())); - fo.Put(coff_output_symbols.Begin(), coff_output_symbols.GetCount() * sizeof(COFF_IMAGE_SYMBOL)); - fo.PutIL(coff_output_symbol_strings.GetLength() + 4); - fo.Put(coff_output_symbol_strings.Begin(), coff_output_symbol_strings.GetLength()); - } - fo.Put(0, int(code_rfa + groups[GRP_COUNT].rfa - fo.GetPos())); - if(!image_fixed) - fo.Put(output_fixups.Begin(), output_fixups.GetCount()); -// fo.Put(0, int(opthdr.SizeOfImage - fo.GetPos())); - fo.Close(); - if(fo.IsError()) { - FileDelete(outputfile); - throw Exc(NFormat("%s: error writing output file", outputfile)); - } - - if(write_mapfile) - WriteMapFile(); -} - -/* -static const char cachefile_header[32] = "ULD Link Cache File v. 1\r\n\x1A\0"; -enum -{ - CACHE_TAG_SIZE = 32, - CACHE_DIROFF_SIZE = 4, - CACHE_DATA_POS = CACHE_TAG_SIZE + CACHE_DIROFF_SIZE, - CACHE_DIR_HEAD = 0x02468ACE, - CACHE_DIR_TAIL = 0x13579BDF, - CACHE_MAX_SIZE = 500000000, -}; -*/ - -/* -void LinkJob::OpenCacheFile() -{ - cache_dirty = false; - if(!cache_objects || IsNull(cache_file_name)) - return; - if(cache_file.Open(cache_file_name, FileStream::READWRITE)) { - char buffer[CACHE_TAG_SIZE + CACHE_DIROFF_SIZE]; - if(!cache_file.GetAll(buffer, sizeof(buffer)) || memcmp(buffer, cachefile_header, CACHE_TAG_SIZE)) - cache_file.SetError(); - else { - int offset = PeekIL(buffer + CACHE_TAG_SIZE); ASSERT(CACHE_DIROFF_SIZE == 4); - if(offset < CACHE_DATA_POS || offset >= (int)cache_file.GetSize() - 8) - cache_file.SetError(); - else { - cache_file.Seek(offset); - if(cache_file.GetIL() != CACHE_DIR_HEAD) - cache_file.SetError(); - else { - cache_file.SetLoading(); - cache_file % object_cache; - int tail = cache_file.GetIL(); - if(tail != CACHE_DIR_TAIL || cache_file.GetLeft() != 0) - cache_file.SetError(); - } - } - } - if(cache_file.IsError()) { - PutStdOut(NFormat("Rewriting cache file '%s'", cache_file_name)); - object_cache.Clear(); - cache_file.ClearError(); - cache_file.Seek(0); - cache_file.SetSize(0); - } - else - PutStdOut(NFormat("Open cache file '%s', %d objects", cache_file_name, object_cache.GetCount())); - cache_name_index.Clear(); - cache_library_index.Clear(); - for(int i = 0; i < object_cache.GetCount(); i++) { - const Cache& obj = object_cache[i]; - cache_name_index.Add(String().Cat() << obj.library << ':' << obj.file); - cache_library_index.Add(obj.library); - } - } -} -*/ - -/* -void LinkJob::SaveCacheFile() -{ - if(!cache_objects) - return; - if(cache_dirty) { - if(!cache_file.IsError()) { - int first_pos = CACHE_DATA_POS, used_size = 0; - for(int i = 0; i < object_cache.GetCount(); i++) { - used_size += object_cache[i].size; - first_pos = object_cache[i].offset + object_cache[i].size; - } - if(cache_file.GetSize() >= 2u * used_size) - cache_file.SetError(); - else { - cache_file.Seek(first_pos); - cache_file.PutIL(CACHE_DIR_HEAD); - cache_file.SetStoring(); - cache_file % object_cache; - cache_file.PutIL(CACHE_DIR_TAIL); - cache_file.SetSize(cache_file.GetSize()); - if(!cache_file.IsError()) { - cache_file.Seek(CACHE_TAG_SIZE); - cache_file.PutIL(first_pos); - } - } - } - } - cache_file.Close(); - if(cache_file.IsError()) - FileDelete(cache_file_name); -} -*/ - -void LinkJob::WriteImageSections() -{ - LTIMING("LinkJob::WriteImageSections"); - -// OpenCacheFile(); - - for(int i = 0; i < objects.GetCount(); i++) { - ObjectFile& of = objects[i]; - if(!of.used_any) - continue; - if(of.dll_atom) - RelocateImport(of); - else if(i == OBJ_RSRC) - RelocateResource(of); - else if(of.filetype == ObjectFile::INTERNAL) - RelocateInternal(of); - else { - LTIMING("relocating objects"); - RelocateObject(of); - if(debug_info) { - String ofile = Nvl(of.library_file, of.object_file); - FileMapping& mapping = GetMapping(ofile); - if(!mapping.IsOpen()) - throw Exc(NFormat("%s: error opening file", ofile)); - const byte *begin = mapping.Begin() + of.library_offset; - RelocateStabs(of, begin); - } - } - } - -// SaveCacheFile(); -} - -void LinkJob::RelocateImport(ObjectFile& of) -{ - const ObjectFile::Section& stubsec = of.sections[ObjectFile::SEC_DLL_STUBS]; - const ObjectFile::Section& impsec = of.sections[ObjectFile::SEC_DLL_IMPORTS]; - int impsec_rva = section_map[impsec.sec_map_index].rva + code_rva; - const ObjectFile::Section& bimpsec = of.sections[ObjectFile::SEC_DLL_BOUND]; - int bimpsec_rva = section_map[bimpsec.sec_map_index].rva + code_rva; - const ObjectFile::Section& namesec = of.sections[ObjectFile::SEC_DLL_NAMES]; - int namesec_rva = section_map[namesec.sec_map_index].rva + code_rva; - const ObjectFile::Section& descsec = of.sections[ObjectFile::SEC_DLL_DESCRIPTOR]; - int descsec_rva = section_map[descsec.sec_map_index].rva + code_rva; - for(int s = section_object_index.Find(of.index); s >= 0; s = section_object_index.FindNext(s)) { - const Section& sec = section_map[s]; - ASSERT(sec.obj_sec.object == of.index); - int sec_rva = code_rva + sec.rva; -// byte *sbegin = &output_image[code_rfa + sec.rfa]; - ObjectFile::Section& ofsec = of.sections[sec.obj_sec.section]; - ofsec.section_data.SetCount(ofsec.size, 0); - byte *sbegin = ofsec.section_data.Begin(); -// memcpy(sbegin, ofsec.section_data.Begin(), ofsec.section_data.GetCount()); - if(sec.obj_sec.section == ObjectFile::SEC_DLL_STUBS) { - ASSERT(ofsec.size == IMP_STUB_SIZE * of.used_stubs.GetCount()); - for(int i = 0; i < of.used_stubs.GetCount(); i++, sbegin += IMP_STUB_SIZE) { - sbegin[0] = 0xFF; // JMP dword ptr [12345678] - sbegin[1] = 0x25; - int imp = (1 + of.used_imports.Find(of.used_stubs[i])) * IMP_ENTRY_SIZE; - ASSERT(imp >= 0); - PokeIL(sbegin + 2, image_base + bimpsec_rva + imp); - highlow_fixup_rva.Add(sec_rva + 2 + i * IMP_STUB_SIZE); - } - } - else if(sec.obj_sec.section == ObjectFile::SEC_DLL_IMPORTS || sec.obj_sec.section == ObjectFile::SEC_DLL_BOUND) { - for(int i = 0; i < of.used_imports.GetCount(); i++) { - sbegin += IMP_ENTRY_SIZE; - int imptr = PeekIL(sbegin); - if(!(imptr & 0x80000000)) { - ASSERT(namesec_rva >= 0); - imptr += namesec_rva; - PokeIL(sbegin, imptr); -// highlow_fixup_rva.Add(sec_rva + IMP_ENTRY_SIZE * (i + 1)); - } - } - } - else if(sec.obj_sec.section == ObjectFile::SEC_DLL_DESCRIPTOR) { - COFF_IMAGE_IMPORT_DESCRIPTOR idesc; - Zero(idesc); - idesc.OriginalFirstThunk = impsec_rva + IMP_ENTRY_SIZE; - idesc.ForwarderChain = 0; - idesc.Name = namesec_rva; - idesc.FirstThunk = bimpsec_rva + IMP_ENTRY_SIZE; - memcpy(sbegin, &idesc, sizeof(idesc)); -// highlow_fixup_rva.Add(sec_rva + __offsetof(COFF_IMAGE_IMPORT_DESCRIPTOR, OriginalFirstThunk)); -// highlow_fixup_rva.Add(sec_rva + __offsetof(COFF_IMAGE_IMPORT_DESCRIPTOR, Name)); -// highlow_fixup_rva.Add(sec_rva + __offsetof(COFF_IMAGE_IMPORT_DESCRIPTOR, FirstThunk)); - } - } -} - -void LinkJob::RelocateInternal(ObjectFile& of) -{ - LTIMING("LinkJob::RelocateInternal"); - -#ifdef _DEBUG - for(int s = section_object_index.Find(of.index); s >= 0; s = section_object_index.FindNext(s)) { - const Section& sec = section_map[s]; - if(sec.obj_sec.object == 0 && sec.obj_sec.section == 0) - continue; // comdat - ASSERT(sec.obj_sec.object == of.index); -// int destseg_rva = code_rva + sec.rva; -// byte *sbegin = &output_image[code_rfa + sec.rfa]; - const ObjectFile::Section& ofsec = GetSection(sec.obj_sec); -// byte *sbegin = ofsec.section_data.Begin(); - if(/*ofsec.type == ObjectFile::SEC_INULL ||*/ ofsec.type == ObjectFile::SEC_ANON_COMDAT) - continue; - ASSERT(ofsec.type == ObjectFile::SEC_STD || ofsec.type == ObjectFile::SEC_RAW); -// int datalen = min(ofsec.section_data.GetCount(), ofsec.size); -// memcpy(sbegin, ofsec.section_data.Begin(), datalen); - } -#endif -} - -void LinkJob::RelocateResource(ObjectFile& of) -{ - ObjectFile::Section& entsec = of.sections[OBJR_ENTRIES]; - int trg = section_map[entsec.sec_map_index].rva + code_rva; - int sec = section_map[of.sections[OBJR_DATA].sec_map_index].rva + code_rva; - for(int i = __offsetof(COFF_IMAGE_RESOURCE_DATA_ENTRY, OffsetToData); - i < entsec.section_data.GetCount(); i += sizeof(COFF_IMAGE_RESOURCE_DATA_ENTRY)) { - byte *ptr = &entsec.section_data[i]; - PokeIL(ptr, PeekIL(ptr) + sec); - if(!image_fixed) - highlow_fixup_rva.Add(trg + i); - } -} - -void LinkJob::RelocateObject(ObjectFile& of) -{ - LTIMING("LinkJob::RelocateObject"); - -// const COFF_IMAGE_FILE_HEADER *header = (const COFF_IMAGE_FILE_HEADER *)begin; -// const COFF_IMAGE_SECTION_HEADER *sechdr = (const COFF_IMAGE_SECTION_HEADER *)(begin -// + sizeof(COFF_IMAGE_FILE_HEADER) + header->SizeOfOptionalHeader); -// const COFF_IMAGE_SYMBOL *symtbl = (const COFF_IMAGE_SYMBOL *)(begin + header->PointerToSymbolTable); -// const char *strtbl = (const char *)(symtbl + header->NumberOfSymbols); - for(int s = section_object_index.Find(of.index); s >= 0; s = section_object_index.FindNext(s)) { - const Section& sec = section_map[s]; - if(sec.obj_sec.object == 0 && sec.obj_sec.section == 0 || sec.udata) - continue; // comdat - ASSERT(sec.obj_sec.object == of.index); - int destseg_rva = code_rva + sec.rva; -// byte *sbegin = &output_image[code_rfa + sec.rfa]; - ObjectFile::Section& ofsec = GetSection(sec.obj_sec); - ASSERT(ofsec.type == ObjectFile::SEC_STD); -// const COFF_IMAGE_SECTION_HEADER& secdata = sechdr[sec.obj_sec.section - 1]; -// ofsec.section_data.SetCount(ofsec.raw_size); - byte *sbegin = ofsec.section_data.Begin(); -// if(ofsec.offset) -// memcpy(ofsec.section_data.Begin(), begin + ofsec.offset, ofsec.raw_size); -// const COFF_IMAGE_RELOCATION *relptr = (const COFF_IMAGE_RELOCATION *)(begin + secdata.PointerToRelocations); -// const COFF_IMAGE_RELOCATION *relend = relptr + secdata.NumberOfRelocations; - for(const COFF_IMAGE_RELOCATION *relptr = ofsec.coff_reloc.Begin(), - *relend = ofsec.coff_reloc.End(); relptr < relend; relptr++) { - int delta_rva = relptr->VirtualAddress - ofsec.coff_reloc_offset; - int target_rva = destseg_rva + delta_rva; - byte *target = sbegin + delta_rva; //&output_image[(int)(code_rfa + sec.rfa + delta_rva)]; - int value = 0; - ObjSec obj_sec = Null; - ObjectFile::Symbol relsym = of.coff_symbols[(int)relptr->SymbolTableIndex]; - if(relsym.section_atom == 0) { - value = relsym.value; - obj_sec.section = -1; - } - else if(relsym.section_atom < 0) { -/* - else if(relsym.StorageClass == COFF_IMAGE_SYM_CLASS_EXTERNAL -// || relsym.SectionNumber > 0 && of.sections[relsym.SectionNumber].flags & COFF_IMAGE_SCN_LNK_COMDAT - ) { -*/ - int coll = collected_symbols.Find(~relsym.section_atom); - if(coll < 0 || collected_symbols[coll] < 0) { - unresolved.FindAdd(~relsym.section_atom); - continue; - } - const Symbol& sym = globals[collected_symbols[coll]]; - if(!sym.relocated) { - unresolved.FindAdd(~relsym.section_atom); - continue; - } - value = sym.value; - obj_sec = sym.obj_sec; - } - else { // if(relsym.SectionNumber > 0) { - int sec_map_index = of.sections[relsym.section_atom].sec_map_index; - if(sec_map_index >= 0) { - obj_sec.object = of.index; - obj_sec.section = relsym.section_atom; - value = relsym.value + section_map[sec_map_index].rva + code_rva; - } - else - PutStdOut(NFormat("%s(%d): invalid static relocation to section %d", - AsString(of), sec.obj_sec.section, relsym.section_atom)); - } -// else -// PutStdOut(NFormat("%s: invalid relocation to %s (%d)", -// AsString(of), atoms[ref_atom], relsym.SectionNumber)); - switch(relptr->Type) { - case COFF_IMAGE_REL_I386_ABSOLUTE: - break; -// case COFF_IMAGE_REL_I386_DIR16: -// case COFF_IMAGE_REL_I386_REL16: - case COFF_IMAGE_REL_I386_DIR32: - PokeIL(target, PeekIL(target) + value + (obj_sec.section >= 0 ? image_base : 0)); - if(obj_sec.section >= 0 && !image_fixed) - highlow_fixup_rva.Add(target_rva); - break; - - case COFF_IMAGE_REL_I386_DIR32NB: - PokeIL(target, PeekIL(target) + value); - break; - -// case COFF_IMAGE_REL_I386_SEG12: - case COFF_IMAGE_REL_I386_SECTION: - case COFF_IMAGE_REL_I386_SECREL: { - int xsec = obj_sec.section >= 0 ? section_map[GetSection(obj_sec).sec_map_index].app_section : -1; - if(relptr->Type == COFF_IMAGE_REL_I386_SECTION) - PokeIW(target, PeekIW(target) + xsec); - else - PokeIL(target, PeekIL(target) + code_rva + sec.rva - (xsec >= 0 ? section_map[section_name_map[xsec]].rva : 0)); - } - break; - - case COFF_IMAGE_REL_I386_REL32: - PokeIL(target, PeekIL(target) + value - target_rva - 4); - break; - - default: - PutStdOut(NFormat("%s: invalid relocation type %d", AsString(of), relptr->Type)); - break; - } - } - } -} - -void LinkJob::RelocateStabs(ObjectFile& of, const byte *begin) -{ - LTIMING("LinkJob::RelocateStabs"); - - if(of.stab_index < 0 || of.stabstr_index < 0) - return; - if(dump_flags & DUMP_STAB_TYPES) - puts(NFormat("Relocating STABs for object '%s':", AsString(of))); - const char *stabstrtbl = (const char *)begin + of.sections[of.stabstr_index].offset; - const ObjectFile::Section& sec = of.sections[of.stab_index]; - ASSERT(sizeof(STAB_INFO) == 12); - int count = sec.size / sizeof(STAB_INFO); - STAB_INFO aux_stab, *stab = &aux_stab; - STAB_INFO aux_stab2, *stab2 = &aux_stab2; -// int match_inc = -1; -// int begin_inc = -1; - int fileatom = 0; - Vector incl_stack; - bool incl_use = true; - int func_use = -1; -// Stab filestab; - const COFF_IMAGE_FILE_HEADER *header = (const COFF_IMAGE_FILE_HEADER *)begin; - const COFF_IMAGE_SECTION_HEADER *secptr = (const COFF_IMAGE_SECTION_HEADER *)(begin - + sizeof(COFF_IMAGE_FILE_HEADER) + header->SizeOfOptionalHeader) + (of.stab_index - 1); - const COFF_IMAGE_RELOCATION *reloc = (const COFF_IMAGE_RELOCATION *)(begin + secptr->PointerToRelocations); - const COFF_IMAGE_SYMBOL *symtbl = (const COFF_IMAGE_SYMBOL *)(begin + header->PointerToSymbolTable), *symptr = symtbl; - const char *strtbl = (const char *)(symtbl + header->NumberOfSymbols); - Vector stab_ref; - stab_ref.SetCount(count, 0); - - for(int nreloc = secptr->NumberOfRelocations; --nreloc >= 0; reloc++) { - int entry = reloc->VirtualAddress / sizeof(STAB_INFO); - if(entry < 0 || entry >= count) - continue; - const COFF_IMAGE_SYMBOL& sym = symtbl[reloc->SymbolTableIndex]; - if(sym.SectionNumber > 0 && !(of.sections[sym.SectionNumber].flags & COFF_IMAGE_SCN_LNK_COMDAT)) - stab_ref[entry] = ~sym.SectionNumber; - else if(sym.StorageClass == COFF_IMAGE_SYM_CLASS_EXTERNAL || sym.StorageClass == COFF_IMAGE_SYM_CLASS_STATIC) - stab_ref[entry] = NameAtom(sym, strtbl); - } - - Index types_found; - Index type_stab_ident; - Vector type_stab_index; - Vector type_stab_def; - - LTIMING("LinkJob::RelocateStabs / stepping through stabs"); - int lastfile = 0; - const byte *pstab = begin + sec.offset; - int out_index = output_stab_info.GetCount() / STAB_STABSIZE; - for(int istab = 0; istab < count; istab++, pstab += sizeof(STAB_INFO)) { - GET_STAB(stab, pstab) - if(stab->type == 0) - continue; - bool use_stab = !!func_use; - Stab outstab; - outstab.type = stab->type; - if(stab->type == N_BINCL) { // include matching - LTIMING("LinkJob::RelocateStabs / checking includes"); - use_stab = true; - int checksum = 0; - int nesting = 0; - const char *textptr = stabstrtbl + stab->strdx; - const byte *npstab = pstab; - int nstab = istab; - while(++nstab < count) { - npstab += sizeof(STAB_INFO); - GET_STAB(stab2, npstab); - if(stab2->type == N_EINCL) { - if(--nesting < 0) - break; - } - else if(stab2->type == N_BINCL) - nesting++; - else if(nesting == 0) { - LTIMING("LinkJob::RelocateStabs / calculating checksums"); - const char *str = stabstrtbl + stab2->strdx; - for(byte c; c = *str++;) - if(c == '(') { - while((byte)(*str++ - '0') < 10) - ; - str--; - } - else if(*str == '(') { - checksum += c; - str++; - while((byte)(*str++ - '0') < 10) - ; - str--; - } - else if(*str == 0) { - checksum += c; - break; - } - else { - checksum += c; - str++; - } - } - } - String hash; - int len = strlen(textptr); - hash.Reserve(len + sizeof(checksum)); - hash.Cat(textptr, len); - hash.Cat((const char *)&checksum, sizeof(checksum)); - incl_stack.Add(incl_use); - int sc = stab_bincl_map.GetCount(); - incl_use = (stab_bincl_map.FindAdd(hash) >= sc); -// incl_use = true; - if(!incl_use) - outstab.type = N_EXCL; - } - else if(stab->type == N_EINCL) { - use_stab = incl_use; - if(!incl_stack.IsEmpty()) - incl_use = incl_stack.Pop(); - } - else if(stab->type == N_FUN) { - if(stab->strdx) { // beginning - int sr = stab_ref[istab]; - func_use = (sr < 0 ? of.sections[~sr].used : collected_symbols.Find(sr) >= 0) ? 1 : 0; - use_stab = !!func_use; - } - else { - func_use = -1; - } - } - else if(func_use < 0 && (stab->type == N_STSYM || stab->type == N_LCSYM)) { - int sr = stab_ref[istab]; - use_stab = (sr < 0 ? of.sections[~sr].used : collected_symbols.Find(sr) >= 0); - } - else - use_stab &= incl_use; - - if(use_stab) { - LTIMING("LinkJob::RelocateStabs / used stab"); - int value = stab->value; - int ref = stab_ref[istab]; - int xsec; - if(ref < 0 && (xsec = of.sections[~ref].sec_map_index) >= 0) { - value += section_map[xsec].rva + code_rva + image_base; -// highlow_fixup_rva.Add(out_index * STAB_STABSIZE + STAB_VALOFF + groups[GRP_STAB].rva + code_rva); - } - else if(ref > 0) { - int c = collected_symbols.Find(ref); - if(c >= 0) { - const Symbol& sym = globals[collected_symbols[c]]; - value += sym.value + image_base; -// highlow_fixup_rva.Add(out_index * STAB_STABSIZE + STAB_VALOFF + groups[GRP_STAB].rva + code_rva); - } - } - int outdx = 0; - if(stab->strdx) { - const char *text = stabstrtbl + stab->strdx; - int len = strlen(text) + 1; - unsigned hash = memhash(text, len - 1); - for(int f = output_stab_string_hash.Find(hash); f >= 0; f = output_stab_string_hash.FindNext(f)) { - int pos = output_stab_string_hash[f]; - if(!memcmp(output_stab_strings.GetIter(pos), text, len)) { - outdx = pos; - break; - } - } - if(!outdx) { - outdx = output_stab_strings.GetCount(); - output_stab_strings.SetCountR(outdx + len); - memcpy(output_stab_strings.GetIter(outdx), text, len); - output_stab_string_hash.Add(hash, outdx); - } - } - - int ipos = output_stab_info.GetCount(); - output_stab_info.SetCountR(ipos + STAB_STABSIZE); - byte *outstab = output_stab_info.GetIter(ipos); - PokeIL(outstab + STAB_STRDXOFF, outdx); - outstab[STAB_TYPEOFF] = stab->type; - outstab[STAB_OTHEROFF] = stab->other; - PokeIW(outstab + STAB_DESCOFF, stab->desc); - PokeIL(outstab + STAB_VALOFF, value); - out_index++; - } - } -} - -void LinkJob::CheckUnresolved() -{ - if(unresolved.IsEmpty()) - return; - PutStdOut(NFormat("%d unresolved externals:", unresolved.GetCount())); - Vector unrn = unresolved.PickKeys(); - Sort(unrn, AtomOrder(*this)); - for(int i = 0; i < unrn.GetCount(); i++) { - int uatom = unrn[i]; -// PutStdOut(NFormat("%s (%d)", atoms[uatom], collected_symbols.Find(uatom))); - PutStdOut(atoms[uatom]); -#ifdef _DEBUG - int w = weak_externals.Find(uatom); - if(w >= 0) - PutStdOut(NFormat("\t! alias %s", atoms[weak_externals[w]])); -#endif - int e = ext_obj_sec.Find(uatom); - if(e >= 0) - PutStdOut(NFormat("\t? referenced from %s", AsString(objects[ext_obj_sec[e].object]))); - for(int g = globals.Find(uatom); g >= 0; g = globals.FindNext(g)) { - ObjSec os = globals[g].obj_sec; - PutStdOut(NFormat("\t= defined in %s", FormatSection(os))); - } - } -} - -String LinkJob::GetGroupName(int group) -{ - switch(group) { - case GRP_CODE: return "CODE"; - case GRP_RDATA: return "RDATA"; - case GRP_EDATA: return "EDATA"; - case GRP_IDATA: return "IDATA"; - case GRP_DATA: return "DATA"; - case GRP_UDATA: return "BSS"; - case GRP_DEBUG: return "DEBUG"; - case GRP_RSRC: return "RSRC"; - case GRP_STAB: return "STAB"; - case GRP_STABSTR: return "STABSTR"; - case GRP_SYMBOLS: return "SYMBOLS"; - default: NEVER(); return NFormat("(%d)", group); - } -} - -void LinkJob::WriteMapGlobals(String& map, const Vector& used, String name) -{ - map << - "Section Offset RVA FPOS Library Object " << name << "\n"; - - for(int i = 0; i < used.GetCount(); i++) { - const Symbol& sym = globals[used[i]]; - const ObjectFile *of = (sym.obj_sec.object >= 0 ? &objects[sym.obj_sec.object] : NULL); - int atom = globals.GetKey(used[i]); - String section; - int value = sym.value; - int section_rva = 0; - int section_rfa = 0; - int delta_rva = 0; - int delta_rfa = 0; - if(sym.obj_sec.object < 0) - section = "LINKER"; - else if(sym.obj_sec.section < 0) - section = (sym.obj_sec.section == -1 ? "ABS" : "DEBUG"); - else { -// int secx = GetSection0(sym.obj_sec).sec_map_index; - int secx = GetSection(sym.obj_sec).sec_map_index; - if(secx >= 0) { - const Section& sec = section_map[secx]; - section = atoms[section_name_map.GetKey(sec.app_section)]; - const Section& secbegin = section_map[section_name_map[sec.app_section]]; - section_rva = secbegin.rva + code_rva; - section_rfa = secbegin.rfa + code_rfa; - // delta_rva = code_rva; - // delta_rfa = code_rfa + section_rfa; - if(!sym.used) - value += section_rva; - } - else - section = "UNUSED"; - } - map << NFormat("%7library_file) : String(Null), - of ? GetFileName(of->object_file) : String(Null), - DemangleAtom(atom)); - } -} - -void LinkJob::WriteMapFile() -{ - int time = msecs(); - - String map; - map << - "Output file: " << outputfile << "\n" - "Timestamp: " << FormatIntHex(timestamp) << ", " << ctime(×tamp) << - "Load address: " << FormatIntHex(image_base) << "\n" - "\n" - "Segment # Class RVA FPOS Length\n"; - - int i; - for(i = 0; i < section_name_map.GetCount(); i++) { - const Section& sec = section_map[section_name_map[i]]; - int lastid = (i + 1 >= section_name_map.GetCount() ? section_map.GetCount() : section_name_map[i + 1]) - 1; - const Section& lastsec = section_map[lastid]; - String secname = atoms[section_name_map.GetKey(i)]; - map << NFormat("%808x %08x %08x\n", groups[GRP_COUNT].rva, groups[GRP_COUNT].rfa, output_fixups.GetCount()) - << "\n"; - - Vector used; - for(i = 0; i < globals.GetCount(); i++) { - bool u = globals[i].used || (dump_flags & DUMP_MAP_ALL); - if(!u && (dump_flags & DUMP_MAP_UNUSED)) { - const Symbol& sym = globals[i]; - if(sym.obj_sec.object >= 0 && sym.obj_sec.section >= 0 && GetSection(sym.obj_sec).used) { - int f = i; - while((f = globals.FindPrev(f)) >= 0) { - const Symbol& prev = globals[f]; - if(prev.used || prev.obj_sec.object >= 0 && prev.obj_sec.section >= 0 - && GetSection(prev.obj_sec).used) - break; - } - if(f < 0) - u = true; - } - } - if(u) - used.Add(i); - } - - Sort(used, GlobalAddressOrder(*this)); - WriteMapGlobals(map, used, "Publics by address"); - map << "\n"; - Vector demangled; - demangled.SetCount(used.GetCount()); - for(i = 0; i < used.GetCount(); i++) - demangled[i] = DemangleAtom(globals.GetKey(used[i])); - IndexSort(demangled, used, GetLanguageInfo()); - WriteMapGlobals(map, used, "Publics by name"); - - if(write_xref) { - map << "\n" - "Cross-reference map (Target: <- Referer)\n"; - for(int i = 0; i < used.GetCount(); i++) { - int atom = globals.GetKey(used[i]); - map << DemangleAtom(atom) << ":\n"; - Vector referer; - int f = collected_referer.Find(atom); - if(f >= 0) { - for(int r = 0; r < collected_referer[f].GetCount(); r++) - referer.Add(DemangleAtom(collected_referer[f][r])); - Sort(referer, GetLanguageInfo()); - } - for(int r = 0; r < referer.GetCount(); r++) - map << "\t<- " << referer[r] << "\n"; - if(referer.IsEmpty()) - map << "\t(root symbol)\n"; - } - } - - map << "\n" - "DLL Imports:\n"; - for(i = 0; i < used_dll_objects.GetCount(); i++) { - const ObjectFile& of = objects[used_dll_objects[i]]; - map << NFormat("%s (%d imports)\n", of.object_file, of.used_imports.GetCount()); - for(int s = 0; s < of.used_imports.GetCount(); s++) { - const ObjectFile::Import& imp = of.imports[of.used_imports[s]]; - map << NFormat("%5>d %s\n", imp.ordinal_hint, atoms[imp.imp_atom]); - } - } - - if(mapfile_stdout) - PutStdOut(map); - else { - if(IsNull(mapfile)) { - if(mapfile_stdout) - return; - mapfile = ForceExt(outputfile, ".map"); - } - if(!SaveFile(mapfile, map)) { - FileDelete(mapfile); - throw Exc(NFormat("%s: error writing map file", mapfile)); - } - - PutStdOut(NFormat("%s(1): mapfile written in %d msecs", mapfile, msecs(time))); - } -} - -void LinkJob::Link() -{ - if(dump_flags & DUMP_ENVIRONMENT) { - PutStdOut("Environment: <<"); - const VectorMap& env = Environment(); - for(int i = 0; i < env.GetCount(); i++) - PutStdOut(NFormat("%s=%s", env.GetKey(i), env[i])); - PutStdOut(">> End of environment"); - } - - if(dump_flags & DUMP_COMMANDLINE) { - PutStdOut(NFormat("Current directory: %s", GetCurrentDirectory())); - PutStdOut("Command line: <<"); - for(int i = 0; i < command_args.GetCount(); i++) - if(!IsNull(command_args[i])) - PutStdOut(AsCString(command_args[i] + ' ')); - PutStdOut(">> End of command line"); - } - - if(objects.GetCount() <= OBJ_FIRST && IsNull(outputfile)) - return; - - if(!make_dll && !force_reloc) - image_fixed = true; - - if(!image_base) - if(!make_dll) - image_base = 0x400000; - else if(!auto_dll_base) - image_base = 0x10000000; - else - image_base = 0x10000000 + ((GetHashValue(outputfile) % 0x6000) << 16); - - if(subsystem == COFF_IMAGE_SUBSYSTEM_DEFAULT) -#ifdef PLATFORM_WIN32 - subsystem = COFF_IMAGE_SUBSYSTEM_WINDOWS_CUI; -#else - subsystem = COFF_IMAGE_SUBSYSTEM_POSIX; -#endif - - debug_info = (debug_info_raw > 0 || debug_info_raw != 0 && linkermode == MODE_GNULD); - int start = msecs(); - ReadDefaultLibs(); - if(dump_flags & DUMP_TIMING) { - PutStdOut(NFormat("Default libraries: %d msecs", msecs(start))); - PutStdOut(NFormat("Total load time: %d msecs", msecs(start_time))); - } - start = msecs(); - SetEntryPoint(); - SetExportSymbols(); - SetRootSymbols(); - PrepareResourceTree(); - CollectSymbols(); - if(dump_flags & DUMP_TIMING) - PutStdOut(NFormat("Collecting symbols: %d msecs", msecs(start))); - start = msecs(); - CollectImports(); - if(dump_flags & DUMP_TIMING) - PutStdOut(NFormat("Collecting imports: %d msecs", msecs(start))); - start = msecs(); - CollectExports(); - if(dump_flags & DUMP_TIMING) - PutStdOut(NFormat("Collecting exports: %d msecs", msecs(start))); - start = msecs(); - CollectSections(); - if(dump_flags & DUMP_TIMING) - PutStdOut(NFormat("Collecting sections: %d msecs", msecs(start))); - start = msecs(); - PrepareImageHeader(); - if(dump_flags & DUMP_TIMING) - PutStdOut(NFormat("Preparing header: %d msecs", msecs(start))); - start = msecs(); - RelocateGlobals(); - RelocateExports(); - if(dump_flags & DUMP_TIMING) - PutStdOut(NFormat("Relocating globals: %d msecs", msecs(start))); - start = msecs(); - WriteImageSections(); - if(dump_flags & DUMP_TIMING) - PutStdOut(NFormat("Composing sections: %d msecs", msecs(start))); - start = msecs(); - PrepareImageInfo(); - if(dump_flags & DUMP_TIMING) - PutStdOut(NFormat("Composing image: %d msecs", msecs(start))); - start = msecs(); - WriteImageFile(); - if(dump_flags & DUMP_TIMING) - PutStdOut(NFormat("Writing image file: %d msecs", msecs(start))); - if(dump_flags & DUMP_TIMING) - PutStdOut(NFormat("Total link time: %d msecs", msecs(start_time))); -} - -String LinkJob::FormatSection(ObjSec os) const -{ - if(IsNull(os)) - return "(null)"; - return NFormat("%s:%d", AsString(objects[os.object]), os.section); -} diff --git a/uppdev/coff/uld/main.cpp b/uppdev/coff/uld/main.cpp deleted file mode 100644 index 2c7f9b016..000000000 --- a/uppdev/coff/uld/main.cpp +++ /dev/null @@ -1,136 +0,0 @@ -#include "uld.h" -#pragma hdrstop -#include "obj.h" - -void TryMain() -{ -// PutConsole("ULD::TryMain"); - int start = msecs(); - LinkJob linkjob; - String cfgfile = LoadFile(ForceExt(GetExeFilePath(), ".cfg")); - -#ifndef flagTEST - if(CommandLine().IsEmpty()) - { - PutStdOut(LinkJob::Usage()); - return; - } - - linkjob.ReadCommand(cfgfile, false); - linkjob.ReadCommand(CommandLine(), true); - linkjob.Link(); -#else -//* - linkjob.ReadCommand( -// "-dump:J:\\temp\\uppnew\\console\\uld\\MINGW-CONSOLE-DEBUG-DEBUG_FULL-GCC-MAIN-SO-ST-WIN32\\uld.exe " -// "-dump:J:\\temp\\uppnew\\console\\uld\\VC71-CONSOLE-DEBUG-DEBUG_FULL-MAIN-MSC71-SO-ST-WIN32\\uld.exe" -// "-dump:J:\\temp\\uppnew\\console\\uld\\MINGW-CONSOLE-DEBUG-DEBUG_FULL-GCC-MAIN-SO-ST-WIN32\\uld.exe" -// "-dump:j:\\temp\\uuld.exe" - -"-nologo " -//"-map " -//"-dumpcollect " -"-dumpresource " -//"-dumpsec:all " -"-machine:I386 " -"-pdb:j:\\temp\\ideuld.pdb " -"-out:j:\\temp\\ideuld.exe " -"-incremental:yes " -"-debug " -"-OPT:NOREF " -"-subsystem:windows " -"-LIBPATH:F:\\Dev71\\Vc7\\lib " -"-LIBPATH:F:\\Dev71\\Vc7\\PlatformSDK\\Lib " -"-LIBPATH:f:\\w\\ssl\\openssl-0.9.7b\\out32 " -"-LIBPATH:f:\\soft\\mysql\\lib\\opt " -"j:/temp/uppnew/ide/VC71.Debug.Debug_full.Gui.Main.Msc71.St.Uld.Win32/UppDlg.obj " -"j:/temp/uppnew/ide/VC71.Debug.Debug_full.Gui.Main.Msc71.St.Uld.Win32/Template.obj " -"j:/temp/uppnew/ide/VC71.Debug.Debug_full.Gui.Main.Msc71.St.Uld.Win32/languages.obj " -"j:/temp/uppnew/ide/VC71.Debug.Debug_full.Gui.Main.Msc71.St.Uld.Win32/FindInFiles.obj " -"j:/temp/uppnew/ide/VC71.Debug.Debug_full.Gui.Main.Msc71.St.Uld.Win32/Console.obj " -"j:/temp/uppnew/ide/VC71.Debug.Debug_full.Gui.Main.Msc71.St.Uld.Win32/ide.obj " -"j:/temp/uppnew/ide/VC71.Debug.Debug_full.Gui.Main.Msc71.St.Uld.Win32/idefile.obj " -"j:/temp/uppnew/ide/VC71.Debug.Debug_full.Gui.Main.Msc71.St.Uld.Win32/Setup.obj " -"j:/temp/uppnew/ide/VC71.Debug.Debug_full.Gui.Main.Msc71.St.Uld.Win32/SetupKeys.obj " -"j:/temp/uppnew/ide/VC71.Debug.Debug_full.Gui.Main.Msc71.St.Uld.Win32/Custom.obj " -"j:/temp/uppnew/ide/VC71.Debug.Debug_full.Gui.Main.Msc71.St.Uld.Win32/idetool.obj " -"j:/temp/uppnew/ide/VC71.Debug.Debug_full.Gui.Main.Msc71.St.Uld.Win32/idebar.obj " -"j:/temp/uppnew/ide/VC71.Debug.Debug_full.Gui.Main.Msc71.St.Uld.Win32/Uninstall.obj " -"j:/temp/uppnew/ide/VC71.Debug.Debug_full.Gui.Main.Msc71.St.Uld.Win32/idewin.obj " -"j:/temp/uppnew/ide/VC71.Debug.Debug_full.Gui.Main.Msc71.St.Uld.Win32/About.obj " -"j:/temp/uppnew/ide/VC71.Debug.Debug_full.Gui.Main.Msc71.St.Uld.Win32/Util.obj " -"j:/temp/uppnew/ide/VC71.Debug.Debug_full.Gui.Main.Msc71.St.Uld.Win32/Methods.obj " -"j:/temp/uppnew/ide/VC71.Debug.Debug_full.Gui.Main.Msc71.St.Uld.Win32/OutputMode.obj " -"j:/temp/uppnew/ide/VC71.Debug.Debug_full.Gui.Main.Msc71.St.Uld.Win32/Host.obj " -"j:/temp/uppnew/ide/VC71.Debug.Debug_full.Gui.Main.Msc71.St.Uld.Win32/Build.obj " -"j:/temp/uppnew/ide/VC71.Debug.Debug_full.Gui.Main.Msc71.St.Uld.Win32/Debug.obj " -"j:/temp/uppnew/ide/VC71.Debug.Debug_full.Gui.Main.Msc71.St.Uld.Win32/ide$rc.obj " -"j:\\temp\\uppnew\\ide\\Common\\VC71.Debug.Debug_full.Gui.Msc71.St.Win32\\Common.lib " -"j:\\temp\\uppnew\\ide\\Editor\\VC71.Debug.Debug_full.Gui.Msc71.St.Win32\\Editor.lib " -"j:\\temp\\uppnew\\ide\\LayDes\\VC71.Debug.Debug_full.Gui.Msc71.St.Win32\\LayDes.lib " -"j:\\temp\\uppnew\\ide\\IconDes\\VC71.Debug.Debug_full.Gui.Msc71.St.Win32\\IconDes.lib " -"j:\\temp\\uppnew\\ide\\Builders\\VC71.Debug.Debug_full.Gui.Msc71.St.Win32\\Builders.lib " -"j:\\temp\\uppnew\\ide\\Debuggers\\VC71.Debug.Debug_full.Gui.Msc71.St.Win32\\Debuggers.lib " -"j:\\temp\\uppnew\\ide\\Browser\\VC71.Debug.Debug_full.Gui.Msc71.St.Win32\\Browser.lib " -"j:\\temp\\uppnew\\Topic\\VC71.Debug.Debug_full.Gui.Msc71.St.Win32\\Topic.lib " -"j:\\temp\\uppnew\\CtrlLib\\VC71.Debug.Debug_full.Gui.Msc71.St.Win32\\CtrlLib.lib " -"wsock32.lib " -"j:\\temp\\uppnew\\Web\\VC71.Debug.Debug_full.Gui.Msc71.St.Win32\\Web.lib " -"j:\\temp\\uppnew\\plugin\\bz2\\VC71.Debug.Debug_full.Gui.Msc71.St.Win32\\bz2.lib " -"j:\\temp\\uppnew\\Esc\\VC71.Debug.Debug_full.Gui.Msc71.St.Win32\\Esc.lib " -"advapi32.lib " -"winmm.lib " -"shell32.lib " -"j:\\temp\\uppnew\\Core\\VC71.Debug.Debug_full.Gui.Msc71.St.Win32\\Core.lib " -"j:\\temp\\uppnew\\RichEdit\\VC71.Debug.Debug_full.Gui.Msc71.St.Win32\\RichEdit.lib " -"j:\\temp\\uppnew\\RichText\\VC71.Debug.Debug_full.Gui.Msc71.St.Win32\\RichText.lib " -"j:\\temp\\uppnew\\Image\\VC71.Debug.Debug_full.Gui.Msc71.St.Win32\\Image.lib " -"j:\\temp\\uppnew\\plugin\\png\\VC71.Debug.Debug_full.Gui.Msc71.St.Win32\\png.lib " -"user32.lib " -"gdi32.lib " -"j:\\temp\\uppnew\\Draw\\VC71.Debug.Debug_full.Gui.Msc71.St.Win32\\Draw.lib " -"j:\\temp\\uppnew\\plugin\\z\\VC71.Debug.Debug_full.Gui.Msc71.St.Win32\\z.lib " -"j:\\temp\\uppnew\\plugin\\gif\\VC71.Debug.Debug_full.Gui.Msc71.St.Win32\\gif.lib " -"j:\\temp\\uppnew\\plugin\\tif\\VC71.Debug.Debug_full.Gui.Msc71.St.Win32\\tif.lib " -"j:\\temp\\uppnew\\plugin\\jpg\\VC71.Debug.Debug_full.Gui.Msc71.St.Win32\\jpg.lib " -"j:\\temp\\uppnew\\coff\\VC71.Debug.Debug_full.Gui.Msc71.St.Win32\\coff.lib " -"j:\\temp\\uppnew\\docpp\\VC71.Debug.Debug_full.Gui.Msc71.St.Win32\\docpp.lib " -"advapi32.lib " -"comdlg32.lib " -"comctl32.lib " -"j:\\temp\\uppnew\\CtrlCore\\VC71.Debug.Debug_full.Gui.Msc71.St.Win32\\CtrlCore.lib " -"j:\\temp\\uppnew\\DocTypes\\VC71.Debug.Debug_full.Gui.Msc71.St.Win32\\DocTypes.lib " -"shell32.lib " - - , false); - linkjob.Link(); -#endif -} - -CONSOLE_APP_MAIN -{ -/* - { - RTIMING("VectorMap"); - VectorMap temp; - for(int i = 0; i < 1000000; i++) - temp.Add(i, -1); - } -*/ - -// static void *hovno; -// __asm int 3 -// __asm jmp [hovno] - -// PutConsole("ULD::Main"); - - try - { - TryMain(); - } - catch(Exc e) - { - PutStdOut(e); - SetExitCode(1); - } -} diff --git a/uppdev/coff/uld/notes.txt b/uppdev/coff/uld/notes.txt deleted file mode 100644 index 9a46d7225..000000000 --- a/uppdev/coff/uld/notes.txt +++ /dev/null @@ -1,16 +0,0 @@ -padani inicializace - -* ? zarovnat raw data size u segmentu text / data / bss (v hlavicce je vetsi nez v section headeru) - -* ? relokacni informace je cca 1.5 x delsi u ULD - -* ? export section je o 8 bytu delsi u ULD - -* ? reloc section je u ULD DISCARDABLE + READ, u LD je READ + WRITE - navic u LD je pred STABy, u ULD za STABy - -* ? importy u LD jsou serazene podle ordinalu - -* ? exporty u LD jsou serazene podle abecedy - -spojovat templaty diff --git a/uppdev/coff/uld/obj.h b/uppdev/coff/uld/obj.h deleted file mode 100644 index f8ad1aa79..000000000 --- a/uppdev/coff/uld/obj.h +++ /dev/null @@ -1,591 +0,0 @@ -#ifndef _console_uld_obj_h_ -#define _console_uld_obj_h_ - -static inline int CoffSectionAlignShift(int flags) -{ - int v = (flags >> 20) & 15; - return v ? v - 1 : 2; -} - -static inline int CoffGetLengthAlignment(int align, int length) -{ -/* - for(int i = 1; i < align; i <<= 1) - if(length & i) - return i; -*/ - return align; -} - -typedef int atom_t; - -class LinkJob; - -class ObjSec : Moveable -{ -public: - ObjSec() {} - ObjSec(const Nuller& nuller) : object(-1), section(0) {} - ObjSec(int object, int section) : object(object), section(section) {} - - unsigned GetHashValue() const { return CombineHash(::GetHashValue(object), ::GetHashValue(section)); } - bool IsNullInstance() const { return object < 0; } - -public: - int object; - int section; -}; - -inline bool operator == (const ObjSec& a, const ObjSec& b) { return a.object == b.object && a.section == b.section; } -inline bool operator != (const ObjSec& a, const ObjSec& b) { return !(a == b); } - -NTL_MOVEABLE(COFF_IMAGE_SYMBOL) - -class ObjectFile -{ -public: - enum FILETYPE { DIRECT, FULL_PATH, LIB_PATH, DEFAULTLIB, INTERNAL, }; - ObjectFile(LinkJob& job, int index, String library_file, String object_file, - FILETYPE filetype, int library_offset, Time file_time, int object_size); - - void ReadFile(const byte *mapping); - String ToString() const; - - void Dump() const; - -public: - enum SEC_TYPE { SEC_ANON_COMDAT, SEC_STD, SEC_STAB, SEC_STABSTR, /*SEC_INULL,*/ SEC_RAW }; - enum COM_STATE { COM_UNK, COM_SELECTED, COM_TRASHED }; - - struct Symbol : Moveable - { - Symbol() {} - Symbol(int section_atom, int value) : section_atom(section_atom), value(value) {} - - int section_atom; // section > 0 -> section; 0 = absolute; < 0 -> ~atom - int value; - }; - - struct Section - { - Section() : name_atom(0), sec_atom(0), size(0), raw_size(0), offset(0), flags(0), type(SEC_STD) - , ref_sec_index(0), ref_ext_index(0), sec_map_index(-1), comdat_forward(-1) - , used(false), autocollect(false), comdat_state(COM_UNK), comdat_packing(0) {} - - int name_atom; - int sec_atom; - int size; - int raw_size; - int offset; - int flags; - SEC_TYPE type; - bool autocollect; - bool used; - COM_STATE comdat_state; - char comdat_packing; - int ref_sec_index; - int ref_ext_index; - int sec_map_index; - int comdat_forward; - Vector section_data; - Vector coff_reloc; - int coff_reloc_offset; - }; - - struct Import - { - Import() : app_atom(0), imp_atom(0), ordinal_hint(0), ordinal(false) {} - - int app_atom; - int imp_atom; - int ordinal_hint; - bool ordinal; - }; - -public: - LinkJob& linkjob; - int index; - String library_file; - String object_file; - Time file_time; - int object_size; - Vector object_data; - int library_offset; - int dll_atom; - int stab_index; - int stabstr_index; - FILETYPE filetype; - bool autocollect; - bool used_any; - bool collected; - bool has_ctors_dtors; - bool export_symbols; -// String directives; - Vector ref_sections; - Vector ref_externals; - Array
sections; - Array imports; - Index used_stubs; - Index used_imports; - enum - { - SEC_COMDAT, - SEC_DLL_STUBS, - SEC_DLL_NAMES, - SEC_DLL_IMPORTS, - SEC_DLL_BOUND, - SEC_DLL_DESCRIPTOR, -// SEC_DLL_NULL_DESC, - DLL_SECTIONS - }; - VectorMap comdat_assoc; - Vector coff_symbols; -}; - -class LinkJob -{ -public: - enum - { - COFF_IMAGE_SYM_TYPE_SPECIAL = 0xFF00, - COFF_IMAGE_SYM_TYPE_SECTION, - COFF_IMAGE_SYM_TYPE_IMPORT_NAME, - COFF_IMAGE_SYM_TYPE_IMPORT_ORDINAL, - COFF_IMAGE_SYM_TYPE_IMPORT_STUB, - COFF_IMAGE_SYM_TYPE_BASE, - COFF_IMAGE_SYM_TYPE_CTOR_DTOR, - }; - enum SPECIAL_OBJECTS - { - OBJ_MARKER, - OBJ_CTOR, - OBJ_EXPORT, - OBJ_RSRC, - OBJ_FIRST, // first user object - }; - enum - { - OBJM_COMDAT, - OBJM_DATA_BEGIN, - OBJM_PSEUDO_RELOC_BEGIN, - OBJM_PSEUDO_RELOC_END, - OBJM_BSS_BEGIN, - OBJM_BSS_END, - OBJM_COUNT, - }; - enum - { - OBJC_COMDAT, - OBJC_CTOR_BEGIN, - OBJC_CTOR_END, - OBJC_DTOR_BEGIN, - OBJC_DTOR_END, - OBJC_IDATA_HOLE, - OBJC_IDATA_NULL, - OBJC_COUNT - }; - enum - { - OBJE_COMDAT, - OBJE_DIRECTORY, - OBJE_ADDRESS_TABLE, - OBJE_NAME_POINTERS, - OBJE_ORDINALS, - OBJE_NAMES, - OBJE_COUNT, - }; - enum - { - OBJR_COMDAT, - OBJR_DIRS, - OBJR_STRINGS, - OBJR_ENTRIES, - OBJR_DATA, - OBJR_COUNT - }; - - struct Symbol - { - Symbol(ObjSec obj_sec = Null, int value = 0, word type = 0, bool external = false) - : obj_sec(obj_sec), value(value), type(type) - , linked(false), used(false), relocated(false), external(external) {} - - ObjSec obj_sec; - int value; - word type; - bool linked : 1; - bool used : 1; - bool relocated : 1; - bool external : 1; - - String ToString() const; - }; - - enum - { - GRP_CODE, - GRP_RDATA, - GRP_DATA, - GRP_UDATA, - GRP_EDATA, - GRP_IDATA, - GRP_RSRC, - GRP_DEBUG, - GRP_STAB, - GRP_STABSTR, - GRP_SYMBOLS, - GRP_COUNT, - - GRP_NONE = -1, - GRP_TEXT_BEGIN = GRP_CODE, - GRP_DATA_BEGIN = GRP_RDATA, - GRP_BSS_BEGIN = GRP_UDATA, - GRP_BSS_END = GRP_UDATA + 1, - }; - - static String GetGroupName(int group_id); - - struct Group - { - int first_section; - int rva; - int rfa; - int raw_size; - }; - - struct Section - { - Section() : obj_sec(Null), udata(false), group(0), app_section(0), sec_atom(0), rva(-1), rfa(-1), size(0) {} - - ObjSec obj_sec; - byte group; - bool udata; - word app_section; - String name; - int sec_atom; - int rva; - int rfa; - int size; - }; - - struct Stab - { - Stab() : textoff(0), type(0), other(0), desc(0), value(0), /*fileatom(0),*/ fixup(Null) {} - - int textoff; - byte type; - byte other; - word desc; - int value; -// int fileatom; - ObjSec fixup; - -// unsigned GetHashValue() const; -// bool Equals(const Stab& b) const; - -// friend bool operator == (const Stab& a, const Stab& b) { return a.Equals(b); } -// friend bool operator != (const Stab& a, const Stab& b) { return !a.Equals(b); } - }; - - struct Export - { - Export(String export_name, int ordinal) : export_name(export_name), ordinal(ordinal) {} - - String export_name; - int ordinal; - }; - - struct Resource - { - Resource() : name_id(Null), type_id(Null), lang_id(Null) {} - - static bool Sort(const Resource& r, const Resource& s); - - WString name; - WString type; - int name_id; - int type_id; - int lang_id; - String data; - }; - - struct Cache - { - FileMapping mapping; - int lock; - }; - -/* - struct Cache - { - String library; - String file; - Time time; - int offset; - int size; - - void Serialize(Stream& stream); - }; -*/ - - struct AtomOrder - { - AtomOrder(const LinkJob& linkjob) : linkjob(linkjob), langinfo(GetLanguageInfo()) {} - bool operator () (int a, int b) const { return langinfo(linkjob[a], linkjob[b]); } - const LinkJob& linkjob; - const LanguageInfo& langinfo; - }; - - struct GlobalAddressOrder - { - GlobalAddressOrder(const LinkJob& linkjob) : linkjob(linkjob), langinfo(GetLanguageInfo()) {} - bool operator () (int a, int b) const; - const LinkJob& linkjob; - const LanguageInfo& langinfo; - }; - - static bool Less(const Section& a, const Section& b); - -public: - LinkJob(); - - static String Usage(); - - void ReadCommand(const Vector& cmdline, bool user); - void ReadCommand(const char *cmdline, bool user); - void ReadDefaultLibs(); - - void Link(); - - void LoadFile(String file, bool defaultlib); - void LoadObject(String file, const FileMapping& mapping, ObjectFile::FILETYPE filetype); - void LoadDLL(String file, const FileMapping& mapping, ObjectFile::FILETYPE filetype); - void LoadLibrary(String file, const FileMapping& mapping, ObjectFile::FILETYPE filetype); - void LoadResource(String file, const FileMapping& mapping); - - void SetEntryPoint(); - void SetExportSymbols(); - void SetRootSymbols(); - void PrepareResourceTree(); - void CollectSymbols(); - void CollectSectionSymbols(Index& collect_objsec, int referer_index); - void CollectObject(int index); - void CheckDuplicates(); - void CollectImports(); - void CollectExports(); - void CollectSections(); - void PrepareImageHeader(); - void RelocateGlobals(); - void RelocateExports(); - void PrepareImageInfo(); - void WriteImageFile(); -// void OpenCacheFile(); -// void SaveCacheFile(); - void WriteImageSections(); - void RelocateImport(ObjectFile& of); - void RelocateObject(ObjectFile& of); - void RelocateInternal(ObjectFile& of); - void RelocateStabs(ObjectFile& of, const byte *object_ptr); - void RelocateResource(ObjectFile& of); - void CheckUnresolved(); - void PrepareSymbolTable(); - void PrepareStabBlocks(); - void PrepareFixupBlocks(); - void WriteMapFile(); - void WriteMapGlobals(String& map, const Vector& used, String name); - - atom_t Atomize(String atom) { return atoms.FindAdd(atom); } - String operator [] (atom_t atom) const { return atoms[atom]; } - atom_t NameAtom(const COFF_IMAGE_SYMBOL& isym, const char *strtbl) { return Atomize(COFFSymbolName(isym, strtbl)); } - String DemangleAtom(atom_t atom) const; - FileMapping& GetMapping(String filename); - void LockMapping(String filename); - void UnlockMapping(String filename); - - ObjectFile::Section& GetSection(ObjSec os) { return objects[os.object].sections[os.section]; } - const ObjectFile::Section& GetSection(ObjSec os) const { return objects[os.object].sections[os.section]; } -// const ObjectFile::Section& GetSection0(ObjSec os) const { return objects[os.section ? os.object : 0].sections[os.section]; } - String FormatSection(ObjSec os) const; - - void AddExternal(atom_t atom, ObjSec obj_sec) { ext_obj_sec.Add(atom, obj_sec); } - void AddWeakExternal(atom_t atom, int refatom); - void AddGlobal(atom_t atom, const Symbol& symbol); - void AddCollect(atom_t atom) { collected_symbols.FindAdd(atom, -1); } - - bool AddCOFFSymbol(String name, int object, const COFF_IMAGE_SYMBOL& sym); - void AddAuxCOFFSymbol(const COFF_IMAGE_SYMBOL& sym); - - void Dump() const; - -public: - enum - { - DUMP_IMPORT_LIBS = 0x00000001, - DUMP_OBJECT_LIBS = 0x00000002, - DUMP_COLLECTOR = 0x00000004, - DUMP_REF_FIXUPS = 0x00000008, - DUMP_SECTIONS = 0x00000010, - DUMP_SECTIONS_ALL = 0x00000020, - DUMP_SEC_DEFINES = 0x00000040, - DUMP_STAT = 0x00000080, - DUMP_IMPORT = 0x00000100, - DUMP_OBJECTS = 0x00000200, - DUMP_TIMING = 0x00000400, - DUMP_MAP_UNUSED = 0x00000800, - DUMP_STABS = 0x00001000, - DUMP_STAB_TYPES = 0x00002000, - DUMP_MAP_ALL = 0x00004000, - DUMP_EXPORTS = 0x00008000, - DUMP_DLL_EXPORTS = 0x00010000, - DUMP_COMMANDLINE = 0x00020000, - DUMP_ENVIRONMENT = 0x00040000, - DUMP_RESOURCES = 0x00080000, - }; - int dump_flags; - Vector libpaths; - Index defaultlibs; - Index nodefaultlibs; - String dll_search_prefix; - int subsystem; - int machine; - String outputfile; - String mapfile; - bool write_mapfile; - bool mapfile_stdout; - bool write_xref; - signed char debug_info_raw; - bool debug_info; - bool show_logo; - bool autocollect_crt_only; - bool ignore_code_alignment; - bool merge_gcc_sections; - bool static_libraries; - bool make_dll; - bool auto_dll_base; -// bool cache_objects; - bool cache_object_data; - bool verbose; - word major_version; - word minor_version; - enum MODE { MODE_MSLINK, MODE_GNULD }; - MODE linkermode; - int file_align; - int image_align; - int image_base; - bool image_fixed; - bool force_reloc; - int stack_reserve; - int stack_commit; - int heap_reserve; - int heap_commit; - - Index atoms; - atom_t text_atom; - atom_t data_atom; - atom_t edata_atom; - atom_t crt_atom; - atom_t ctors_atom; - atom_t dtors_atom; - atom_t gcc_except_atom; - atom_t CTOR_LIST_atom; - atom_t _CTOR_LIST_atom; - atom_t CTOR_LIST_END_atom; - atom_t DTOR_LIST_atom; - atom_t _DTOR_LIST_atom; - atom_t DTOR_LIST_END_atom; - atom_t idata_atom; - atom_t idata_idesc_atom; - atom_t idata_inull_atom; - atom_t idata_iat1_atom; - atom_t idata_iat2_atom; - atom_t idata_names_atom; - atom_t rdata_atom; - atom_t bss_atom; - atom_t debug_atom; - atom_t drectve_atom; - atom_t stab_atom; - atom_t stabstr_atom; - atom_t rsrc_atom; -// int mangling_style; - - enum { IMP_STUB_SIZE = 6, IMP_ENTRY_SIZE = 4 }; - -// Array object_cache; -// Index cache_name_index; -// Index cache_library_index; -// FileStream cache_file; -// String cache_file_name; -// bool cache_dirty; - - Vector command_args; - Index loaded_files; - Array objects; - VectorMap dll_objects; // dll name -> index into objects - Vector used_dll_objects; - int stab_section; - int stabstr_section; - int symbol_section; - int reloc_section; - int section_count; - bool has_stabs; -// bool has_symbols; -// bool has_relocs; - - String entrypoint; - atom_t entrypoint_atom; - VectorMap collected_symbols; - VectorMap > collected_referer; - VectorMap weak_externals; - VectorMap section_merge; - ArrayMap globals; - Index global_obj_sec_index; - VectorMap obj_static_global_index; - VectorMap ext_obj_sec; - - ArrayMap mapping_cache; - int mapping_cache_limit; - - Segtor section_map; - Index section_object_index; -// Index section_obj_sec_index; - VectorMap section_name_map; // atom -> sec_map_index - Group groups[GRP_COUNT + 1]; - Index unresolved; - - Vector coff_output_symbols; - String coff_output_symbol_strings; -// Vector coff_reloc_offsets; - - SegtorMap exports; - Index include_symbols; - - Array resource_objects; - - Vector output_image_header; - Vector output_fixups; - int output_fixup_size; - VectorMap stab_bincl_map; - Vector output_stab_info; - Vector output_stab_strings; - VectorMap output_stab_string_hash; - Vector highlow_fixup_rva; - time_t timestamp; - int ifhdr_pos; - int iohdr_pos; - int secmap_pos; - int header_size; - int code_rva; - int code_rfa; - int idesc_rva; - int idesc_end_rva; - int rsrc_rva; - int rsrc_end_rva; - int iat2_rva; - int iat2_end_rva; - int idata_last; - bool idata_null_found; - int start_time; - String stub_filename; -}; - -#endif//_console_uld_obj_h_ diff --git a/uppdev/coff/uld/object.cpp b/uppdev/coff/uld/object.cpp deleted file mode 100644 index bdf808dec..000000000 --- a/uppdev/coff/uld/object.cpp +++ /dev/null @@ -1,410 +0,0 @@ -#include "uld.h" -#pragma hdrstop - -#include "obj.h" - -#define LTIMING(x) // RTIMING(x) -#define LDUMP(x) // RDUMP(x) - -/* -static inline unsigned MemHash(const char *b, const char *p) -{ - unsigned out = p - b; - while(p - b >= 4) - { - out ^= PeekIL(b); - b += 4; - } - switch(p - b) - { - case 3: out ^= byte(b[2]) << 16; - case 2: out ^= byte(b[1]) << 8; - case 1: out ^= byte(b[0]) << 0; - } - return out; -} -*/ - -/* -static inline Point ScanStabType(const char *p, const char *& endptr) -{ - ASSERT(*p == '(' && IsDigit(p[1])); - Point out(0, 0); - while(IsDigit(*++p)) - out.x = 10 * out.x + *p - '0'; - if(*p == ',') - while(IsDigit(*++p)) - out.y = 10 * out.y + *p - '0'; - if(*p == ')') - p++; - endptr = p; - return out; -} -*/ - -/* -static inline const char *ScanStab(const char *p) -{ - if(*p == '(') - while(*p && *p++ != ')') - ; - else if(IsDigit(*p)) - while(IsDigit(*++p)) - ; - return p; -} -*/ - -static inline String TrimClassName(String clss) -{ - int f = clss.Find('$'); - if(f >= 0) - clss.Trim(f); - return clss; -} - -static String Undecorate(String s) -{ - const char *p = s; - while(*p && *p != '$') - p++; - if(*p != '$') - return s; - const char *b = ++p; - while(*p && *p != '@') - p++; - return String(b, p); -} - -ObjectFile::ObjectFile(LinkJob& j, int i, String lf, String of, FILETYPE ft, int lo, Time tm, int os) -: linkjob(j), index(i), library_file(lf), object_file(of) -, filetype(ft), library_offset(lo), file_time(tm), object_size(os) -{ - autocollect = collected = used_any = false; - dll_atom = 0; - stab_index = -1; - stabstr_index = -1; - has_ctors_dtors = false; - //!! terrible kludge - String title = ToLower(GetFileTitle(object_file)); - export_symbols = (filetype == DIRECT && title != "dllcrt2" && title != "crtbegin"); -} - -String ObjectFile::ToString() const -{ - if(IsNull(library_file)) - { - if(IsNull(object_file)) - return "(linker)"; - return object_file; - } - return GetFileName(library_file) + ":" + object_file; -} - -void ObjectFile::ReadFile(const byte *begin) -{ - const COFF_IMAGE_FILE_HEADER *header = (const COFF_IMAGE_FILE_HEADER *)begin; - - int i; -/* - const COFF_IMAGE_SYMBOL *symtbl = (const COFF_IMAGE_SYMBOL *)(begin + header->PointerToSymbolTable); - int nsym = header->NumberOfSymbols; - const COFF_IMAGE_SYMBOL *symend = symtbl + nsym; - const char *strtbl = (const char *)symend; - symbols.Reserve(nsym); - while(symtbl < symend) - { - String name; - if(symtbl->N.Name.Short) - name = MaxLenString(symtbl->N.ShortName, 8); - else - name = strtbl + symtbl->N.Name.Long; - int atom = linkjob.Atomize(name); - int naux = symtbl->NumberOfAuxSymbols; - symbols.Add(atom, *symtbl++); - while(--naux >= 0) - symbols.Add(0, *symtbl++); - } -*/ - const COFF_IMAGE_SECTION_HEADER *sechdr = (const COFF_IMAGE_SECTION_HEADER *)(begin - + sizeof(COFF_IMAGE_FILE_HEADER) + header->SizeOfOptionalHeader), *secptr; - sections.SetCount(header->NumberOfSections + 1); - Section& comdat = sections[0]; - comdat.type = SEC_ANON_COMDAT; - comdat.name_atom = comdat.sec_atom = linkjob.bss_atom; - comdat.flags = COFF_IMAGE_SCN_CNT_UNINITIALIZED_DATA | COFF_IMAGE_SCN_ALIGN_16BYTES - | COFF_IMAGE_SCN_MEM_READ | COFF_IMAGE_SCN_MEM_WRITE; - comdat.comdat_packing = 0; - for(i = 1, secptr = sechdr; i < sections.GetCount(); i++, secptr++) - { - Section& sec = sections[i]; - sec.raw_size = secptr->SizeOfRawData; - if(!(sec.size = secptr->Misc.VirtualSize)) - sec.size = sec.raw_size; - sec.offset = secptr->PointerToRawData; - ASSERT(sec.offset >= 0); - sec.flags = secptr->Characteristics; - sec.comdat_packing = 0; - sec.coff_reloc_offset = secptr->VirtualAddress; -// sec.comdat_assoc = 0; - - String secn = MaxLenString(secptr->Name, sizeof(secptr->Name)); -/* - if(linkjob.merge_gcc_sections && secn[0] == '/' && IsDigit(secn[1])) - { - if(sec.flags & COFF_IMAGE_SCN_CNT_CODE) - secn = ".text$" + secn; - else if(sec.flags & COFF_IMAGE_SCN_CNT_INITIALIZED_DATA) - secn = ".data$" + secn; - else - secn = ".bss$" + secn; - } -*/ - sec.name_atom = linkjob.Atomize(secn); - secn = TrimClassName(secn); - sec.sec_atom = linkjob.Atomize(secn); - bool ctor_dtor_section = false; - if(sec.sec_atom == linkjob.ctors_atom || sec.sec_atom == linkjob.dtors_atom) - { - sec.sec_atom = linkjob.data_atom; -// sec.flags = (sec.flags & ~COFF_IMAGE_SCN_ALIGN_MASK) | COFF_IMAGE_SCN_ALIGN_4BYTES; - has_ctors_dtors = ctor_dtor_section = true; - } - if(sec.sec_atom == linkjob.idata_atom) - linkjob.idata_last = index; - if(sec.name_atom == linkjob.idata_inull_atom) - linkjob.idata_null_found = true; - - sec.type = (sec.sec_atom == linkjob.stab_atom - ? SEC_STAB : sec.sec_atom == linkjob.stabstr_atom - ? SEC_STABSTR : SEC_STD); - if(sec.type == SEC_STAB) - stab_index = i; - else if(sec.type == SEC_STABSTR) - stabstr_index = i; - sec.autocollect = sec.type == SEC_STD - && (sec.sec_atom == linkjob.crt_atom - || ctor_dtor_section - || sec.sec_atom == linkjob.idata_atom - || sec.sec_atom == linkjob.rsrc_atom - || !linkjob.autocollect_crt_only && (sec.flags & COFF_IMAGE_SCN_CNT_INITIALIZED_DATA)); - if(sec.name_atom == linkjob.drectve_atom && (sec.flags & COFF_IMAGE_SCN_LNK_INFO)) - { - String directives = String(begin + secptr->PointerToRawData, secptr->SizeOfRawData); - linkjob.ReadCommand(directives, false); - } - } - - if(stab_index >= 0 && stabstr_index >= 0) - linkjob.has_stabs = true; - - coff_symbols.SetCount(header->NumberOfSymbols); - - const COFF_IMAGE_SYMBOL *symtbl = (const COFF_IMAGE_SYMBOL *)(begin + header->PointerToSymbolTable), *symptr = symtbl; - const char *strtbl = (const char *)(symtbl + header->NumberOfSymbols); -// int xxxatom = linkjob.Atomize("?AppMain@@YAXXZ"); - for(i = 0; i < (int)header->NumberOfSymbols; i++, symptr++) - { -// if(symptr->SectionNumber > 0 && linkjob.NameAtom(*symptr, strtbl) == xxxatom) -// __asm int 3; -// RLOG(NFormat("%30SectionNumber, (int)symptr->Value, file)); - - if(symptr->SectionNumber < 0) - coff_symbols[i] = Symbol(symptr->SectionNumber, symptr->Value); - else if(symptr->StorageClass == COFF_IMAGE_SYM_CLASS_STATIC && symptr->SectionNumber != 0 - && symptr->Value == 0 && symptr->NumberOfAuxSymbols >= 1) -// && linkjob.Atomize(TrimClassName(COFFSymbolName(*symptr, strtbl))) == sections[(int)symptr->SectionNumber].name_atom) - { // section aux symbol - LinkJob::Symbol lsym; - lsym.obj_sec.object = index; - lsym.obj_sec.section = symptr->SectionNumber; - lsym.value = 0; - lsym.type = LinkJob::COFF_IMAGE_SYM_TYPE_SECTION; - Section& sec = sections[(int)symptr->SectionNumber]; - if(sec.name_atom != linkjob.ctors_atom && sec.name_atom != linkjob.dtors_atom) - { - String secn = COFFSymbolName(*symptr, strtbl); - sec.name_atom = linkjob.Atomize(secn); - secn = TrimClassName(secn); - sec.sec_atom = linkjob.Atomize(secn); - } - linkjob.AddGlobal(sec.name_atom, lsym); - const COFF_IMAGE_AUX_SYMBOL *aux = (const COFF_IMAGE_AUX_SYMBOL *)(symptr + 1); - if(sec.flags & COFF_IMAGE_SCN_LNK_COMDAT) - { - sec.comdat_packing = aux->Section.Selection; - comdat_assoc.Add(aux->Section.Number, symptr->SectionNumber); -// sec.comdat_assoc = aux->Section.Number; - if(sec.comdat_packing == COFF_IMAGE_COMDAT_SELECT_EXACT_MATCH) - { - secptr = sechdr + (symptr->SectionNumber); - sec.section_data.Reserve(secptr->SizeOfRawData + secptr->NumberOfRelocations * sizeof(COFF_IMAGE_RELOCATION)); - CatN(sec.section_data, secptr->SizeOfRawData, begin + secptr->PointerToRawData); - const COFF_IMAGE_RELOCATION *relptr = (const COFF_IMAGE_RELOCATION *)(begin + secptr->PointerToRelocations); - const COFF_IMAGE_RELOCATION *relend = relptr + secptr->NumberOfRelocations; - while(relptr < relend) - { - COFF_IMAGE_RELOCATION r = *relptr++; - r.SymbolTableIndex = linkjob.NameAtom(symtbl[r.SymbolTableIndex], strtbl); - CatN(sec.section_data, sizeof(COFF_IMAGE_RELOCATION), &r); - } - } - } - coff_symbols[i] = Symbol(lsym.obj_sec.section, 0); - } - else if((symptr->StorageClass == COFF_IMAGE_SYM_CLASS_EXTERNAL || symptr->StorageClass == COFF_IMAGE_SYM_CLASS_STATIC) - && (symptr->SectionNumber != 0 || symptr->Value != 0)) - { - bool glo = (symptr->StorageClass == COFF_IMAGE_SYM_CLASS_EXTERNAL); - LinkJob::Symbol lsym; - lsym.obj_sec.object = index; - lsym.obj_sec.section = symptr->SectionNumber; - lsym.value = symptr->Value; - lsym.type = symptr->Type; - lsym.external = glo; - int atom = linkjob.NameAtom(*symptr, strtbl); - linkjob.AddGlobal(atom, lsym); - coff_symbols[i] = Symbol(glo ? ~atom : lsym.obj_sec.section, lsym.value); - } - else if(symptr->StorageClass == COFF_IMAGE_SYM_CLASS_WEAK_EXTERNAL && symptr->NumberOfAuxSymbols >= 1) - { - int refsym = symptr[1].N.Name.Short; - int sym = linkjob.NameAtom(*symptr, strtbl); - linkjob.AddWeakExternal(sym, linkjob.NameAtom(symtbl[refsym], strtbl)); - coff_symbols[i] = Symbol(~sym, symptr->Value); - } - else if(symptr->StorageClass == COFF_IMAGE_SYM_CLASS_EXTERNAL) - coff_symbols[i] = Symbol(~linkjob.NameAtom(*symptr, strtbl), 0); - else if(symptr->SectionNumber > 0) - coff_symbols[i] = Symbol(symptr->SectionNumber, symptr->Value); - i += symptr->NumberOfAuxSymbols; - symptr += symptr->NumberOfAuxSymbols; - } - - for(i = 1, secptr = sechdr; i < sections.GetCount(); i++, secptr++) - { - Section& sec = sections[i]; - sec.ref_sec_index = ref_sections.GetCount(); - sec.ref_ext_index = ref_externals.GetCount(); - if(sec.type == SEC_STD) - { - sec.coff_reloc.SetCount(secptr->NumberOfRelocations); - memcpy(sec.coff_reloc.Begin(), (const COFF_IMAGE_RELOCATION *)(begin + secptr->PointerToRelocations), - secptr->NumberOfRelocations * sizeof(COFF_IMAGE_RELOCATION)); - const COFF_IMAGE_RELOCATION *reloc = sec.coff_reloc.Begin(); - Index ref_sec, ref_ext; - for(int nreloc = secptr->NumberOfRelocations; --nreloc >= 0; reloc++) - { - const COFF_IMAGE_SYMBOL& sym = symtbl[reloc->SymbolTableIndex]; - if(sym.SectionNumber > 0 && sym.StorageClass != COFF_IMAGE_SYM_CLASS_EXTERNAL) - ref_sec.FindAdd(sym.SectionNumber); - if(sym.StorageClass == COFF_IMAGE_SYM_CLASS_STATIC && sym.SectionNumber > 0 - && sym.Value == 0 && sym.NumberOfAuxSymbols >= 1 && !(sections[sym.SectionNumber].flags & COFF_IMAGE_SCN_LNK_COMDAT)) - {} // no-op for section externals - else if(sym.StorageClass == COFF_IMAGE_SYM_CLASS_EXTERNAL - || sym.StorageClass == COFF_IMAGE_SYM_CLASS_WEAK_EXTERNAL - || sym.StorageClass == COFF_IMAGE_SYM_CLASS_STATIC) - { - int atom = linkjob.NameAtom(sym, strtbl); - if(sym.SectionNumber == 0) - linkjob.AddExternal(atom, ObjSec(index, i)); - ref_ext.FindAdd(atom); - } - /* - { - LinkJob::Symbol symbol; - symbol.object = index; - symbol.value = sym.Value; - symbol.type = sym.Type; - symbol.section = sym.SectionNumber; - ref_ext.FindAdd(linkjob.AddGlobal(linkjob.NameAtom(sym, strtbl), symbol)); - } - */ - } - ref_sections.AppendPick(ref_sec.PickKeys()); - ref_externals.AppendPick(ref_ext.PickKeys()); - } -/* - else if(sec.type == SEC_STAB && stabstr_index >= 0) - { - ASSERT(sizeof(STAB_INFO) == 12); - int count = sec.size / sizeof(STAB_INFO); - stabs.SetCount(count); - const byte *p = begin + sec.offset; -#ifdef CPU_LE // && CPU_32BIT - memcpy(stabs.Begin(), p, count * sizeof(STAB_INFO)); -#else - for(STAB_INFO *sp = stabs.Begin(), *se = stabs.End(); sp < se; sp++, p += 12) - { - sp->strdx = PeekIL(p + STAB_STRDXOFF); - sp->type = p[STAB_TYPEOFF]; - sp->other = p[STAB_OTHEROFF]; - sp->desc = PeekIW(p[STAB_DESCOFF]); - sp->value = PeekIL(p[STAB_VALUEOFF]); - } -#endif - stab_ref.SetCount(count, 0); - for(int nreloc = secptr->NumberOfRelocations; --nreloc >= 0; reloc++) - { - int entry = reloc->VirtualAddress / sizeof(STAB_INFO); - if(entry < 0 || entry >= count) - continue; - const COFF_IMAGE_SYMBOL& sym = symtbl[reloc->SymbolTableIndex]; - if(sym.SectionNumber) - stab_ref[entry] = ~sym.SectionNumber; - else if(sym.StorageClass == COFF_IMAGE_SYM_CLASS_EXTERNAL || sym.StorageClass == COFF_IMAGE_SYM_CLASS_STATIC) - stab_ref[entry] = linkjob.NameAtom(sym, strtbl); - } - if(linkjob.dump_flags & LinkJob::DUMP_STABS) - { - const Section& strsec = sections[stabstr_index]; - puts(NFormat("%s: %d stabs, .stab = %d bytes, .stabstr = %d bytes", - ToString(), count, sec.size, strsec.size)); - const byte *str = begin + strsec.offset; - for(int i = 0; i < stabs.GetCount(); i++) - { - const STAB_INFO& stab = stabs[i]; - String desc; - desc << NFormat("[%d]: offset %08x, type %02x, desc %04x, value %08x, reloc %08x", - i, stab.strdx, stab.type, stab.desc, stab.value, stab_ref[i]); - puts(desc); - if(stab.strdx) - puts((const char *)(str + stab.strdx)); - } - } - } -*/ - } - - ref_sections.Shrink(); - ref_externals.Shrink(); -} - -void ObjectFile::Dump() const -{ - int sym_size = (ref_sections.GetCount() + ref_externals.GetCount()) * sizeof(int); - int sec_size = sections.GetCount() * sizeof(Section); - int mapped_size = sizeof(ObjectFile) + sym_size + sec_size; - - RLOG("ObjectFile(" << library_file << ":" << object_file << "), mapped size = " << mapped_size - << " (" << sym_size << " in symbols, " << sec_size << " in sections)"); -// RLOG("Linker directives: " << directives); - RLOG("#sections = " << sections.GetCount()); -/* - for(int i = 0; i < sections.GetCount(); i++) - { - const Section& sec = sections[i]; - RLOG(NFormat("[%d]: %s", i, linkjob[sec.name_atom])); - int end_ext = (i + 1 < sections.GetCount() ? sections[i + 1].ref_ext_index : ref_externals.GetCount()); - int end_sec = (i + 1 < sections.GetCount() ? sections[i + 1].ref_sec_index : ref_sections.GetCount()); - RLOG("#external references = " << (end_ext - sec.ref_ext_index)); - int r; - for(r = sec.ref_ext_index; r < end_ext; r++) - RLOG(linkjob[linkjob.globals.GetKey(ref_externals[r])]); - RLOG("#section references = " << (end_sec - sec.ref_sec_index)); - for(r = sec.ref_sec_index; r < end_sec; r++) - RLOG(NFormat("%04x", ref_sections[r])); - } -*/ -} diff --git a/uppdev/coff/uld/uld.upp b/uppdev/coff/uld/uld.upp deleted file mode 100644 index 85d98d7d1..000000000 --- a/uppdev/coff/uld/uld.upp +++ /dev/null @@ -1,25 +0,0 @@ -uses - coff; - -target(TEST) "ld-test.exe"; - -target(!TEST) "ld.exe"; - -link(GCC) "-v "; - -file - Main readonly separator, - version.h, - notes.txt, - solved.txt, - uld.h, - dump.cpp, - obj.h, - object.cpp, - linkjob.cpp, - main.cpp, - End readonly separator; - -mainconfig - "" = "CONSOLE ST", - "" = "CONSOLE ST .TEST"; diff --git a/uppdev/coff/uld/version.h b/uppdev/coff/uld/version.h deleted file mode 100644 index d6d732154..000000000 --- a/uppdev/coff/uld/version.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef _console_uld_version_h_ -#define _console_uld_version_h_ - -#define ULD_VERSION_MAJOR 1 -#define ULD_VERSION_MINOR 0 -#define ULD_VERSION_RELEASE 16 -#define ULD_DATE Date(2004, 6, 6) -#define ULD_COPYRIGHT "Copyright (c) 2003,2004 Tomas Rylek" - -#endif diff --git a/uppdev/colorpopup/colorpopup.h b/uppdev/colorpopup/colorpopup.h deleted file mode 100644 index df8f213cb..000000000 --- a/uppdev/colorpopup/colorpopup.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef _colorpopup_colorpopup_h -#define _colorpopup_colorpopup_h - -#include - -using namespace Upp; - -#define LAYOUTFILE -#include - -class colorpopup : public WithcolorpopupLayout { -public: - typedef colorpopup CLASSNAME; - colorpopup(); -}; - -#endif diff --git a/uppdev/colorpopup/colorpopup.lay b/uppdev/colorpopup/colorpopup.lay deleted file mode 100644 index 269b8b51b..000000000 --- a/uppdev/colorpopup/colorpopup.lay +++ /dev/null @@ -1,18 +0,0 @@ -LAYOUT(colorpopupLayout, 700, 240) - ITEM(ColorPusher, c0, LeftPosZ(8, 84).TopPosZ(36, 20)) - ITEM(Label, dv___1, SetLabel(t_("Full. Scolors(0)")).LeftPosZ(8, 84).TopPosZ(8, 19)) - ITEM(Label, dv___2, SetLabel(t_("Full. Scolors(1)")).LeftPosZ(108, 84).TopPosZ(8, 19)) - ITEM(Label, dv___3, SetLabel(t_("NotNull")).LeftPosZ(204, 84).TopPosZ(8, 19)) - ITEM(ColorPusher, c1, LeftPosZ(108, 84).TopPosZ(36, 20)) - ITEM(ColorPusher, c2, LeftPosZ(204, 84).TopPosZ(36, 20)) - ITEM(Label, dv___6, SetLabel(t_("NoRamp")).LeftPosZ(300, 84).TopPosZ(8, 19)) - ITEM(ColorPusher, c3, LeftPosZ(300, 84).TopPosZ(36, 20)) - ITEM(Label, dv___8, SetLabel(t_("NotNull.NoRamp")).LeftPosZ(392, 84).TopPosZ(8, 19)) - ITEM(ColorPusher, c4, LeftPosZ(392, 84).TopPosZ(36, 20)) - ITEM(Label, dv___10, SetLabel(t_("WithVoid")).LeftPosZ(484, 84).TopPosZ(8, 19)) - ITEM(ColorPusher, c5, LeftPosZ(484, 84).TopPosZ(36, 20)) - ITEM(SliderCtrl, dv___12, LeftPosZ(20, 160).TopPosZ(80, 15)) - ITEM(DocEdit, dv___13, HSizePosZ(196, 364).TopPosZ(68, 76)) - ITEM(LineEdit, dv___14, HSizePosZ(196, 364).TopPosZ(148, 76)) -END_LAYOUT - diff --git a/uppdev/colorpopup/colorpopup.upp b/uppdev/colorpopup/colorpopup.upp deleted file mode 100644 index 30ae0ced1..000000000 --- a/uppdev/colorpopup/colorpopup.upp +++ /dev/null @@ -1,11 +0,0 @@ -uses - CtrlLib; - -file - colorpopup.h, - main.cpp, - colorpopup.lay; - -mainconfig - "" = "GUI ST"; - diff --git a/uppdev/colorpopup/init b/uppdev/colorpopup/init deleted file mode 100644 index 85007cdb1..000000000 --- a/uppdev/colorpopup/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _colorpopup_icpp_init_stub -#define _colorpopup_icpp_init_stub -#include "CtrlLib/init" -#endif diff --git a/uppdev/colorpopup/main.cpp b/uppdev/colorpopup/main.cpp deleted file mode 100644 index 62302a887..000000000 --- a/uppdev/colorpopup/main.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include "colorpopup.h" - - - -colorpopup::colorpopup() -{ - CtrlLayout(*this, "Window title"); - c0.SColors(false); - c1.SColors(true); - c2.NotNull(); - c3.NoRampWheel(); - c4.NotNull().NoRampWheel(); - c5.WithVoid(); -} - -GUI_APP_MAIN -{ - DUMP(VoidColor()); - colorpopup().Run(); -} diff --git a/uppdev/cons/cons.cpp b/uppdev/cons/cons.cpp deleted file mode 100644 index b127ec9bc..000000000 --- a/uppdev/cons/cons.cpp +++ /dev/null @@ -1,5 +0,0 @@ -#include "stdio.h" - -void main(int argc, const char *argv[]) -{ -} diff --git a/uppdev/cons/cons.upp b/uppdev/cons/cons.upp deleted file mode 100644 index 0340e709d..000000000 --- a/uppdev/cons/cons.upp +++ /dev/null @@ -1,3 +0,0 @@ -file - cons.upp, - cons.cpp; diff --git a/uppdev/cpp/cpp.cpp b/uppdev/cpp/cpp.cpp deleted file mode 100644 index 58b08ace0..000000000 --- a/uppdev/cpp/cpp.cpp +++ /dev/null @@ -1,354 +0,0 @@ -#include "cpp.h" - -#include - -inline bool IsSpc(byte c) -{ - return c > 0 && c <= 32; -} - -String CppMacro::ToString() const -{ - return String().Cat() << "(" << AsString(param) << ") " << body; -} - -String CppMacro::Expand(const Vector& p) const -{ - String r; - const char *s = body; - while(*s) { - if(IsAlpha(*s) || *s == '_') { - const char *b = s; - s++; - while(IsAlNum(*s) || *s == '_') - s++; - String id(b, s); - static String VA_ARGS("__VA_ARGS__"); // Speed optimization - if(id == VA_ARGS) { - bool next = false; - for(int i = param.GetCount(); i < p.GetCount(); i++) { - if(next) - r.Cat(", "); - r.Cat(p[i]); - next = true; - } - } - else { - int q = param.Find(id); - if(q >= 0) { - if(q < p.GetCount()) - r.Cat(p[q]); - } - else - r.Cat(id); - } - continue; - } - if(s[0] == '#' && s[1] == '#') { - int q = r.GetLength(); - while(q > 0 && IsSpc(r[q - 1])) - q--; - r.Trim(q); - s += 2; - while((byte)*s <= ' ') - s++; - continue; - } - if(*s == '#') { - const char *ss = s + 1; - while(IsSpc(*ss)) - ss++; - if(IsAlpha(*ss) || *ss == '_') { - const char *b = ss; - ss++; - while(IsAlNum(*ss) || *ss == '_') - ss++; - String id(b, ss); - int q = param.Find(id); - if(q >= 0) { - if(q <= p.GetCount()) { - if(q < p.GetCount()) - r.Cat(AsCString(p[q])); - s = ss; - continue; - } - } - r.Cat(String(s, ss)); - s = ss; - continue; - } - } - r.Cat(*s++); - } - return r; -} - -String Cpp::Define(const char *s) -{ - CParser p(s); - String id; - try { - if(!p.IsId()) - return Null; - id = p.ReadId(); - CppMacro& m = macro.GetAdd(id); - m.param.Clear(); - if(p.Char('(')) { - while(p.IsId()) { - m.param.Add(p.ReadId()); - p.Char(','); - } - if(p.Char3('.', '.', '.')) - m.variadic = true; - p.Char(')'); - } - m.body = p.GetPtr(); - } - catch(CParser::Error) {} - return "#define " + id; -} - -const char *Cpp::SkipString(const char *s) -{ - CParser p(s); - p.ReadOneString(*s); - s = p.GetPtr(); - while((byte)*(s - 1) <= ' ') - s--; - return s; -} - -void Cpp::ParamAdd(Vector& param, const char *s, const char *e) -{ - while(s < e && (byte)*s <= ' ') s++; - while(e > s && (byte)*(e - 1) <= ' ') e--; - String h; - while(s < e) { - if((byte)*s <= ' ') { - h.Cat(' '); - s++; - while(s < e && (byte)*s <= ' ') - s++; - } - else - if(*s == '\"' || *s == '\'') { - const char *q = SkipString(s); - h.Cat(String(s, q)); - s = q; - } - else - h.Cat(*s++); - } - param.Add(h); -} - -String Cpp::Expand(const char *s) -{ - StringBuffer r; - while(*s) { - if(incomment) { - if(s[0] == '*' && s[1] == '/') { - incomment = false; - s += 2; - r.Cat("*/"); - } - else - r.Cat(*s++); - } - else - if(iscib2(*s)) { - const char *b = s; - s++; - while(iscid2(*s)) - s++; - String id(b, s); - if(notmacro.Find(id) < 0) { - const CppMacro *m = NULL; - const Cpp *p = this; - while(!m && p) { - m = p->macro.FindPtr(id); - p = p->parent; - } - if(m && !id.StartsWith("__$allowed_on_")) { - Vector param; - const char *s0 = s; - while(*s && (byte)*s <= ' ') - s++; - if(*s == '(') { - s++; - const char *b = s; - int level = 0; - for(;;) - if(*s == ',' && level == 0) { - ParamAdd(param, b, s); - s++; - b = s; - } - else - if(*s == ')') { - s++; - if(level == 0) { - ParamAdd(param, b, s - 1); - break; - } - level--; - } - else - if(*s == '(') { - s++; - level++; - } - else - if(*s == '\0') - break; - else - if(*s == '\"' || *s == '\'') - s = SkipString(s); - else - s++; - } - else - s = s0; // otherwise we eat spaces after parameterless macro - usedmacro.FindAdd(id); - int ti = notmacro.GetCount(); - notmacro.Add(id); - id = '\x1a' + Expand(m->Expand(param)); - notmacro.Trim(ti); - } - else - notmacro.Add(id); - } - r.Cat(id); - } - else - if(s[0] == '/' && s[1] == '*') { - incomment = true; - s += 2; - r.Cat("/*"); - } - else - if(s[0] == '/' && s[1] == '/') { - r.Cat(s); - break; - } - else - r.Cat(*s++); - } - return r; -} - - -void Cpp::DoCpp(Stream& in, Index& header) -{ - Vector ignorelist = Split("__declspec;__cdecl;" - "__out;__in;__inout;__deref_in;__deref_inout;__deref_out;" - "__AuToQuOtE;__xin;__xout;" - "$drv_group;$allowed_on_parameter", - ';'); - for(int i = 0; i < ignorelist.GetCount(); i++) - macro.GetAdd(ignorelist[i]).variadic = true; - Do(in, header); -} - -void Cpp::Parse() -{ - DDUMP(result.GetCount()); - String r = result; - _DBG_ SaveFile("c:/xxx/cpp/" + GetFileTitle(path) + ".hpp", r); - DDUMP(result.GetCount()); - StringStream ss(r); - DDUMP(result.GetCount()); - Parse(ss, Vector(), base, path, THISBACK(AddError)); -} - -void Cpp::Do(Stream& in, Index& header) -{ - incomment = false; - StringBuffer result; - result.Clear(); - result.Reserve(16384); - int lineno = 0; - while(!in.IsEof()) { - String l = in.GetLine(); - lineno++; - int el = 0; - while(*l.Last() == '\\' && !in.IsEof()) { - el++; - l.Trim(l.GetLength() - 1); - l.Cat(in.GetLine()); - } - const char *s = l; - while(*s == ' ') - s++; - if(*s == '#') { - if(strncmp(s + 1, "define", 6) == 0) - result << Define(s + 7) << "\n"; - else { - result.Cat("\n"); - if(strncmp(s + 1, "include", 7) == 0) { - String hdr = Expand(s + 8); - String header_path = GetIncludePath(hdr); - if(path.GetCount() == 0) DLOG("Include file " << String(s + 8) << " not found"); - String include = String().Cat() << path << ':' << lineno << ':' << header_path; - if(path.GetCount() && header.Find(include) < 0) { - DLOG(">>> " << l << " -> " << header_path << LOG_BEGIN); - Parse(result); - header.Add(include); - Cpp cpp; - cpp.WhenError = Proxy(WhenError); - cpp.path = header_path; - cpp.filedir = GetFileFolder(header_path); - cpp.include_path = include_path; - cpp.parent = this; - DDUMP(cpp.macro.GetCount()); - FileIn in(header_path); - cpp.Do(in, header); - DLOG(path << ": " << cpp.macro); - DLOG("USED: " << cpp.usedmacro); - // TODO: caching, this is the place to retrieve used macro values - { RTIMING("Mixing macros"); - for(int i = 0; i < cpp.macro.GetCount(); i++) - macro.GetAdd(cpp.macro.GetKey(i)) = pick(cpp.macro[i]); - } - DDUMP(macro.GetCount()); - RTIMING("Mixing bases"); - for(int i = 0; i < cpp.base.GetCount(); i++) - base.GetAdd(cpp.base.GetKey(i)).AppendPick(cpp.base[i]); - DLOG("---" << LOG_END); - } - notmacro.Clear(); - } - } - } - else { - result.Cat(Expand(l) + "\n"); - } - while(el--) - result.Cat("\n"); - } - Parse(result); -} - -String Cpp::GetIncludePath(const char *s) -{ - while(IsSpace(*s)) - s++; - int type = *s; - if(type == '<' || type == '\"' || type == '?') { - s++; - String name; - if(type == '<') type = '>'; - while(*s != '\r' && *s != '\n') { - if(*s == type) { - if(type == '\"') { - String fn = NormalizePath(name, filedir); - if(FileExists(fn)) - return fn; - } - return GetFileOnPath(name, include_path, false); - } - name.Cat(*s++); - } - } - return Null; -} diff --git a/uppdev/cpp/cpp.h b/uppdev/cpp/cpp.h deleted file mode 100644 index f41f3639b..000000000 --- a/uppdev/cpp/cpp.h +++ /dev/null @@ -1,67 +0,0 @@ -#ifndef _cpp_cpp_h_ -#define _cpp_cpp_h_ - -#include - -#include - -using namespace Upp; - -struct CppMacro : Moveable, DeepCopyOption { - String body; - Index param; - bool variadic; - - String Expand(const Vector& p) const; - - String ToString() const; - - CppMacro() { variadic = false; } - rval_default(CppMacro); - CppMacro(const CppMacro& s, int) { body = s.body, param = clone(s.param); variadic = s.variadic; } -}; - -struct Cpp { - bool incomment; - - String path; - String filedir; - String include_path; - - Index header; - VectorMap macro; - Index usedmacro; - Index notmacro; - - CppBase base; - - Cpp *parent; - - void SyncSet(); - - String Define(const char *s); - - static const char *SkipString(const char *s); - void ParamAdd(Vector& param, const char *b, const char *e); - - String Expand(const char *s); - void Include(const char *s); - String GetIncludePath(const char *s); - - void Parse(); - - void Do(Stream& in, Index& header); - void DoCpp(Stream& in, Index& header); - - Callback3 WhenError; - - void AddError(int ln, const String& s) { WhenError(path, ln, s); } - - Cpp() { parent = NULL; } - - typedef Cpp CLASSNAME; -}; - -String Preprocess(const String& filename, const String& include_path); - -#endif diff --git a/uppdev/cpp/cpp.txt b/uppdev/cpp/cpp.txt deleted file mode 100644 index 30d1625e9..000000000 --- a/uppdev/cpp/cpp.txt +++ /dev/null @@ -1,16 +0,0 @@ -%'\1'%"\2"% -%1 +1%3% -%"1" "2" ","%','% -"a" -"a x y" -"\"A\"" -a3 -3a -a# -a"X" -"Y""X" -x -haha -haha ble -alfa xy.r #hahaha - \ No newline at end of file diff --git a/uppdev/cpp/cpp.upp b/uppdev/cpp/cpp.upp deleted file mode 100644 index e8e53df0e..000000000 --- a/uppdev/cpp/cpp.upp +++ /dev/null @@ -1,15 +0,0 @@ -uses - Core, - CppBase; - -file - cpp.h, - cpp.cpp, - main.cpp, - test.h, - testfile, - cpp.txt; - -mainconfig - "" = ""; - diff --git a/uppdev/cpp/init b/uppdev/cpp/init deleted file mode 100644 index a4d3d782e..000000000 --- a/uppdev/cpp/init +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef _cpp_icpp_init_stub -#define _cpp_icpp_init_stub -#include "Core/init" -#include "CppBase/init" -#endif diff --git a/uppdev/cpp/main.cpp b/uppdev/cpp/main.cpp deleted file mode 100644 index 2d0b89667..000000000 --- a/uppdev/cpp/main.cpp +++ /dev/null @@ -1,55 +0,0 @@ -#include "cpp.h" - -Vector errs; - -void AddError(const String& path, int ln, const String& s) -{ - errs.Add(path + " " + AsString(ln) + ": " + s); -} - -void Test(const char *path) -{ - DDUMP(sizeof(CppItem)); - Cpp cpp; - cpp.WhenError = callback(AddError); - cpp.path = path; - cpp.filedir = GetFileFolder(path); -// cpp.include_path = cpp.filedir;//"C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\Vc\\Include;C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\Include;C:\\OpenSSL-Win32\\include;C:\\u\\pgsql\\include;C:\\u\\OpenSSL-Win32\\include"; -// cpp.include_path = "C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\Vc\\Include;C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\Include;C:\\OpenSSL-Win32\\include;C:\\u\\pgsql\\include;C:\\u\\OpenSSL-Win32\\include"; - cpp.include_path = "C:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\Vc\\Include;C:\\Program Files\\Microsoft SDKs\\Windows\\v7.0\\Include;C:\\u\\OpenSSL-Win32\\include;C:\\u\\pgsql\\include;C:\\Program Files (x86)\\MySQL\\MySQL Connector C 6.1\\include"; - cpp.include_path << ";c:/u/upp.src/uppsrc"; - FileIn in(path); - Index inc; - cpp.DoCpp(in, inc); -// StringStream ss(pp); -// Parse(ss, Vector() << "__cdecl", base, path, callback(AddError)); - DLOG("======================="); - DUMPC(inc); - DLOG("======================="); - DUMPC(errs); - DLOG("======================="); - Qualify(cpp.base); - String out; - for(int i = 0; i < cpp.base.GetCount(); i++) { - out << Nvl(cpp.base.GetKey(i), "") << " {\n"; - const Array& ma = cpp.base[i]; - for(int j = 0; j < ma.GetCount(); j++) { - const CppItem& m = ma[j]; - out << '\t' << CppItemKindAsString(m.kind) << ' ' << m.qitem << ' ' << m.line << "\n"; - // DDUMP(StoreAsString(const_cast(m)).GetCount()); - } - out << "}\n"; - } - LOG(out); -} - -CONSOLE_APP_MAIN -{ - StdLogSetup(LOG_FILE, NULL, 150000000); -// Test(GetDataFile("testfile")); - Test("c:/u/upp.src/uppsrc/CtrlLib/EditField.cpp"); - getchar(); - return; -} - -// TEST:a,b:|a|b|\n diff --git a/uppdev/cpp/test.h b/uppdev/cpp/test.h deleted file mode 100644 index 0940682bc..000000000 --- a/uppdev/cpp/test.h +++ /dev/null @@ -1,165 +0,0 @@ -#include -#include -#include -#include - -#define eprintf(x, ...) if(x) printf(__VA_ARGS__) - -eprintf(TEST, "%d is %d", a, b, c) - -#define TEST test_expanded - -TEST /* TEST in comment */ TEST -/* TEST in comment 2 -TEST second line -*/ TEST - -TEST // TEST - -#undef TEST - -This should not be expanded, it was undefined: TEST - -#define __Expand1(x) x(1) -#define __Expand2(x) __Expand1(x) x(2) -#define __Expand3(x) __Expand2(x) x(3) -#define __Expand4(x) __Expand3(x) x(4) -#define __Expand5(x) __Expand4(x) x(5) -#define __Expand6(x) __Expand5(x) x(6) -#define __Expand7(x) __Expand6(x) x(7) -#define __Expand8(x) __Expand7(x) x(8) -#define __Expand9(x) __Expand8(x) x(9) -#define __Expand10(x) __Expand9(x) x(10) -#define __Expand11(x) __Expand10(x) x(11) -#define __Expand12(x) __Expand11(x) x(12) -#define __Expand13(x) __Expand12(x) x(13) -#define __Expand14(x) __Expand13(x) x(14) -#define __Expand15(x) __Expand14(x) x(15) -#define __Expand16(x) __Expand15(x) x(16) -#define __Expand17(x) __Expand16(x) x(17) -#define __Expand18(x) __Expand17(x) x(18) -#define __Expand19(x) __Expand18(x) x(19) -#define __Expand20(x) __Expand19(x) x(20) -#define __Expand21(x) __Expand20(x) x(21) -#define __Expand22(x) __Expand21(x) x(22) -#define __Expand23(x) __Expand22(x) x(23) -#define __Expand24(x) __Expand23(x) x(24) -#define __Expand25(x) __Expand24(x) x(25) -#define __Expand26(x) __Expand25(x) x(26) -#define __Expand27(x) __Expand26(x) x(27) -#define __Expand28(x) __Expand27(x) x(28) -#define __Expand29(x) __Expand28(x) x(29) -#define __Expand30(x) __Expand29(x) x(30) -#define __Expand31(x) __Expand30(x) x(31) -#define __Expand32(x) __Expand31(x) x(32) -#define __Expand33(x) __Expand32(x) x(33) -#define __Expand34(x) __Expand33(x) x(34) -#define __Expand35(x) __Expand34(x) x(35) -#define __Expand36(x) __Expand35(x) x(36) -#define __Expand37(x) __Expand36(x) x(37) -#define __Expand38(x) __Expand37(x) x(38) -#define __Expand39(x) __Expand38(x) x(39) -#define __Expand40(x) __Expand39(x) x(40) - -#define __Expand(x) __Expand40(x) - -#define __List1(x) x(1) -#define __List2(x) __List1(x), x(2) -#define __List3(x) __List2(x), x(3) -#define __List4(x) __List3(x), x(4) -#define __List5(x) __List4(x), x(5) -#define __List6(x) __List5(x), x(6) -#define __List7(x) __List6(x), x(7) -#define __List8(x) __List7(x), x(8) -#define __List9(x) __List8(x), x(9) -#define __List10(x) __List9(x), x(10) -#define __List11(x) __List10(x), x(11) -#define __List12(x) __List11(x), x(12) -#define __List13(x) __List12(x), x(13) -#define __List14(x) __List13(x), x(14) -#define __List15(x) __List14(x), x(15) -#define __List16(x) __List15(x), x(16) -#define __List17(x) __List16(x), x(17) -#define __List18(x) __List17(x), x(18) -#define __List19(x) __List18(x), x(19) -#define __List20(x) __List19(x), x(20) -#define __List21(x) __List20(x), x(21) -#define __List22(x) __List21(x), x(22) -#define __List23(x) __List22(x), x(23) -#define __List24(x) __List23(x), x(24) -#define __List25(x) __List24(x), x(25) -#define __List26(x) __List25(x), x(26) -#define __List27(x) __List26(x), x(27) -#define __List28(x) __List27(x), x(28) -#define __List29(x) __List28(x), x(29) -#define __List30(x) __List29(x), x(30) -#define __List31(x) __List30(x), x(31) -#define __List32(x) __List31(x), x(32) -#define __List33(x) __List32(x), x(33) -#define __List34(x) __List33(x), x(34) -#define __List35(x) __List34(x), x(35) -#define __List36(x) __List35(x), x(36) -#define __List37(x) __List36(x), x(37) -#define __List38(x) __List37(x), x(38) -#define __List39(x) __List38(x), x(39) -#define __List40(x) __List39(x), x(40) - -#define E__p(I) p##I - -#define ASSTRING_(x) #x -#define ASSTRING(x) ASSTRING_(x) - -#define COMBINE__(a, b) a##b -#define COMBINE(a, b) COMBINE__(a, b) - -#define COMBINE3__(a, b, c) a##b##c -#define COMBINE3(a, b, c) COMBINE3__(a, b, c) - -#define COMBINE4__(a, b, c, d) a##b##c##d -#define COMBINE4(a, b, c, d) COMBINE4__(a, b, c, d) - -#define COMBINE5__(a, b, c, d, e) a##b##c##d##e -#define COMBINE5(a, b, c, d, e) COMBINE5__(a, b, c, d, e) - -#define E__NFValue(I) const Value& COMBINE(p, I) -#define E__NFBody(I) String Format(const char *fmt, __List##I(E__NFValue)); - -EXPAND: __Expand20(E__NFBody) - -ASSTRING(Just a test) - -COMBINE(aaaa, bbbb) - - -#define TEST(x, y) %x%y% -#define TESTS(x) #x -#define TEST2(x, y) x ## y -#define TEST4 alfa x ## y.r #hahaha -#define TESTX x -#define TESTY haha -#define TESTZ haha - -TEST('\1', "\2") -TEST( 1 +1 , 3 ) -TEST( "1" "2" ",", ',') -TESTS(a) -TESTS(a x y) -TESTS("A") -TEST2(a, 3) -TEST2(3, a) -TEST2(a, #) -TEST2(a, "X") -TEST2("Y", "X") -TESTX -TESTY -TESTZ -TEST4 - -#define pow2(x) (x) * (x) -#define dist(a, b) pow2(a.x - b.x) + pow2(a.y - b.y) - -dist(x, y); - -#define __countof(a) int(sizeof(a) / sizeof(a[0])) - -__countof(bla) \ No newline at end of file diff --git a/uppdev/cpp/testfile b/uppdev/cpp/testfile deleted file mode 100644 index f6d254553..000000000 --- a/uppdev/cpp/testfile +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/uppdev/cpp2/cpp.h b/uppdev/cpp2/cpp.h deleted file mode 100644 index 0f7c6ddac..000000000 --- a/uppdev/cpp2/cpp.h +++ /dev/null @@ -1,90 +0,0 @@ -#ifndef _cpp_cpp_h_ -#define _cpp_cpp_h_ - -#include - -#include - -using namespace Upp; - -<<<<<<< .mine -void RemoveComments(String& l, bool& incomment); - -const Index& CppKeywordsIndex(); - -struct CppMacro : Moveable, DeepCopyOption { - String param; - String body; - - String Define(const char *s); - - String Expand(const Vector& p) const; - - String ToString() const; -}; - -enum PPItemType { - PP_DEFINE, - PP_INCLUDE, - PP_USING, - PP_NAMESPACE, - PP_NAMESPACE_END -}; - -struct PPItem : Moveable { - int type; - String id; - CppMacro macro; -}; - -struct PPFile { // contains "macro extract" of file, only info about macros defined and namespaces - FileTime filetime; - Array item; - Index includes; - - void Parse(Stream& in); - - void Dump() const; - -private: - void CheckEndNamespace(Vector& namespace_block, int level); -}; - -const PPFile& GetPPFile(const char *path); - -String GetIncludePath(const String& s, const String& filedir, const String& include_path); - -bool IncludesFile(const String& parent_path, const String& header_path, const String& include_path); - -struct Cpp { - bool incomment; - bool done; - - String include_path; - - VectorMap macro; - - String output; - Index usedmacro; - Index definedmacro; - Index namespace_using; - Vector namespace_stack; - - void Define(const char *s); - - static const char *SkipString(const char *s); - void ParamAdd(Vector& param, const char *b, const char *e); - String Expand(const char *s, Index& notmacro); - String Expand(const char *s); - void Do(const String& sourcefile, Stream& in, const String& currentfile, - Index& visited, const Index *get_macros); - - bool Preprocess(const String& sourcefile, Stream& in, const String& currentfile, - const Index *get_macros = NULL); - - typedef Cpp CLASSNAME; -}; - -======= ->>>>>>> .r8434 -#endif diff --git a/uppdev/cpp2/cpp.txt b/uppdev/cpp2/cpp.txt deleted file mode 100644 index 10d29fcda..000000000 --- a/uppdev/cpp2/cpp.txt +++ /dev/null @@ -1,82 +0,0 @@ -<<<<<<< .mine -30214154======= -Gather files 0.375 -Checking files 0.031 -Removing files 0.000 -Parsing files 5.125 -TIMING PP_DEFINE : 0.00 ns - 0.00 ns (593.00 ms / 12471437 ), min: 0.00 ns, max: 1.00 ms, nesting: 1 - 12471437 -TIMING Parse : 636.94 ms - 554.35 us (637.00 ms / 1149 ), min: 0.00 ns, max: 16.00 ms, nesting: 1 - 1149 -TIMING Expand : 424.95 ms - 376.39 us (425.00 ms / 1129 ), min: 0.00 ns, max: 38.00 ms, nesting: 1 - 1129 -TIMING macros : 500.95 ms - 443.71 us (501.00 ms / 1129 ), min: 0.00 ns, max: 2.00 ms, nesting: 1 - 1129 -TIMING Gather IDs : 208.95 ms - 185.07 us (209.00 ms / 1129 ), min: 0.00 ns, max: 9.00 ms, nesting: 1 - 1129 -TIMING GetMasterFile : 742.94 ms - 646.60 us (743.00 ms / 1149 ), min: 0.00 ns, max: 4.00 ms, nesting: 1 - 1149 -TIMING Preprocess : 3.25 s - 2.83 ms ( 3.25 s / 1149 ), min: 0.00 ns, max: 45.00 ms, nesting: 1 - 1149 -TIMING GetIncludePath : 190.24 ms - 420.12 ns (212.00 ms / 452817 ), min: 0.00 ns, max: 1.00 ms, nesting: 1 - 452817 -TIMING sCppFile make : 999.95 us - 999.95 us ( 1.00 ms / 1 ), min: 1.00 ms, max: 1.00 ms, nesting: 1 - 1 - - -Gather files 0.375 -Checking files 0.016 -Removing files 0.000 -Parsing files 6.531 -TIMING PP_DEFINE : 1.67 s - 134.20 ns ( 2.30 s / 12471407 ), min: 0.00 ns, max: 1.00 ms, nesting: 1 - 12471407 -TIMING Parse : 676.94 ms - 589.16 us (677.00 ms / 1149 ), min: 0.00 ns, max: 27.00 ms, nesting: 1 - 1149 -TIMING Expand : 523.94 ms - 464.08 us (524.00 ms / 1129 ), min: 0.00 ns, max: 39.00 ms, nesting: 1 - 1129 -TIMING GetMasterFile : 728.94 ms - 634.41 us (729.00 ms / 1149 ), min: 0.00 ns, max: 4.00 ms, nesting: 1 - 1149 -TIMING Preprocess : 4.41 s - 3.84 ms ( 4.41 s / 1149 ), min: 0.00 ns, max: 50.00 ms, nesting: 1 - 1149 -TIMING GetIncludePath : 189.15 ms - 417.72 ns (212.00 ms / 452817 ), min: 0.00 ns, max: 1.00 ms, nesting: 1 - 452817 -TIMING sCppFile make : 999.95 us - 999.95 us ( 1.00 ms / 1 ), min: 1.00 ms, max: 1.00 ms, nesting: 1 - 1 - -* c:\upp\cppide.exe 29.03.2015 22:44:02, user: cxl - -Gather files 0.375 -Checking files 0.016 -Removing files 0.000 -Parsing files 5.109 -TIMING PP_DEFINE : 0.00 ns - 0.00 ns (609.00 ms / 12471437 ), min: 0.00 ns, max: 2.00 ms, nesting: 1 - 12471437 -TIMING Parse : 658.94 ms - 573.49 us (659.00 ms / 1149 ), min: 0.00 ns, max: 16.00 ms, nesting: 1 - 1149 -TIMING Expand : 408.94 ms - 362.22 us (409.00 ms / 1129 ), min: 0.00 ns, max: 38.00 ms, nesting: 1 - 1129 -TIMING macros : 487.94 ms - 432.19 us (488.00 ms / 1129 ), min: 0.00 ns, max: 2.00 ms, nesting: 1 - 1129 -TIMING add macro : 65.11 ms - 30.71 ns (169.00 ms / 2120492 ), min: 0.00 ns, max: 1.00 ms, nesting: 1 - 2120492 -TIMING Gather IDs : 382.94 ms - 339.19 us (383.00 ms / 1129 ), min: 0.00 ns, max: 16.00 ms, nesting: 1 - 1129 -TIMING GetMasterFile : 705.94 ms - 614.40 us (706.00 ms / 1149 ), min: 0.00 ns, max: 5.00 ms, nesting: 1 - 1149 -TIMING Preprocess : 3.32 s - 2.89 ms ( 3.32 s / 1149 ), min: 0.00 ns, max: 45.00 ms, nesting: 1 - 1149 -TIMING GetIncludePath : 188.82 ms - 416.98 ns (211.00 ms / 452817 ), min: 0.00 ns, max: 1.00 ms, nesting: 1 - 452817 -TIMING PP read : 302.94 ms - 263.43 us (303.00 ms / 1150 ), min: 0.00 ns, max: 10.00 ms, nesting: 1 - 1150 -TIMING sCppFile make : 999.95 us - 999.95 us ( 1.00 ms / 1 ), min: 1.00 ms, max: 1.00 ms, nesting: 1 - 1 - - -* c:\upp\cppide.exe 30.03.2015 22:21:31, user: cxl - -Gather files 0.687 -Checking files 0.032 -Removing files 0.000 -Parsing files 3.281 -TIMING PP_DEFINES : 0.00 ns - 0.00 ns ( 5.00 ms / 154902 ), min: 0.00 ns, max: 1.00 ms, nesting: 1 - 154902 -TIMING Parse : 631.95 ms - 551.44 us (632.00 ms / 1146 ), min: 0.00 ns, max: 26.00 ms, nesting: 1 - 1146 -TIMING Expand include : 10.90 ms - 4.96 us (11.00 ms / 2199 ), min: 0.00 ns, max: 1.00 ms, nesting: 1 - 2199 -TIMING Expand expand : 544.38 ms - 831.97 ns (574.00 ms / 654331 ), min: 0.00 ns, max: 16.00 ms, nesting: 1 - 654331 -TIMING Expand define : 13.69 ms - 268.12 ns (16.00 ms / 51057 ), min: 0.00 ns, max: 1.00 ms, nesting: 1 - 51057 -TIMING Expand : 737.95 ms - 655.37 us (738.00 ms / 1126 ), min: 0.00 ns, max: 39.00 ms, nesting: 1 - 1126 -TIMING GetMasterFile : 695.95 ms - 607.28 us (696.00 ms / 1146 ), min: 0.00 ns, max: 4.00 ms, nesting: 1 - 1146 -TIMING Preprocess : 1.59 s - 1.38 ms ( 1.59 s / 1146 ), min: 0.00 ns, max: 41.00 ms, nesting: 1 - 1146 -TIMING GetIncludePath : 188.51 ms - 416.39 ns (209.00 ms / 452724 ), min: 0.00 ns, max: 1.00 ms, nesting: 1 - 452724 -TIMING PP read : 492.95 ms - 429.77 us (493.00 ms / 1147 ), min: 0.00 ns, max: 11.00 ms, nesting: 1 - 1147 -TIMING sCppFile make : 999.95 us - 999.95 us ( 1.00 ms / 1 ), min: 1.00 ms, max: 1.00 ms, nesting: 1 - 1 - -Gather files 0.375 -Checking files 0.016 -Removing files 0.000 -Parsing files 3.297 -TIMING PP_DEFINES : 869.25 us - 5.61 ns ( 7.00 ms / 154902 ), min: 0.00 ns, max: 1.00 ms, nesting: 1 - 154902 -TIMING Parse : 656.95 ms - 573.26 us (657.00 ms / 1146 ), min: 0.00 ns, max: 25.00 ms, nesting: 1 - 1146 -TIMING Expand include : 4.91 ms - 2.23 us ( 5.00 ms / 2199 ), min: 0.00 ns, max: 1.00 ms, nesting: 1 - 2199 -TIMING Expand expand : 517.10 ms - 790.28 ns (543.00 ms / 654331 ), min: 0.00 ns, max: 16.00 ms, nesting: 1 - 654331 -TIMING Expand define : 19.98 ms - 391.31 ns (22.00 ms / 51057 ), min: 0.00 ns, max: 1.00 ms, nesting: 1 - 51057 -TIMING Expand : 731.96 ms - 650.05 us (732.00 ms / 1126 ), min: 0.00 ns, max: 40.00 ms, nesting: 1 - 1126 -TIMING GetMasterFile : 699.95 ms - 610.78 us (700.00 ms / 1146 ), min: 0.00 ns, max: 4.00 ms, nesting: 1 - 1146 -TIMING Preprocess : 1.58 s - 1.38 ms ( 1.58 s / 1146 ), min: 0.00 ns, max: 41.00 ms, nesting: 1 - 1146 -TIMING GetIncludePath : 166.08 ms - 366.85 ns (184.00 ms / 452724 ), min: 0.00 ns, max: 1.00 ms, nesting: 1 - 452724 -TIMING PP read : 315.95 ms - 275.46 us (316.00 ms / 1147 ), min: 0.00 ns, max: 11.00 ms, nesting: 1 - 1147 -TIMING sCppFile make : 999.96 us - 999.96 us ( 1.00 ms / 1 ), min: 1.00 ms, max: 1.00 ms, nesting: 1 - 1 ->>>>>>> .r8434 diff --git a/uppdev/cpp2/cpp2.upp b/uppdev/cpp2/cpp2.upp deleted file mode 100644 index 0a611a89d..000000000 --- a/uppdev/cpp2/cpp2.upp +++ /dev/null @@ -1,21 +0,0 @@ -uses - Core, - CppBase; - -file - cpp.h, -<<<<<<< .mine - util.cpp, - macro.cpp, - ppfile.cpp, - cpp.cpp, -======= ->>>>>>> .r8434 - main.cpp, - test.h, - testfile, - cpp.txt; - -mainconfig - "" = ""; - diff --git a/uppdev/cpp2/init b/uppdev/cpp2/init deleted file mode 100644 index 70d84a235..000000000 --- a/uppdev/cpp2/init +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef _cpp2_icpp_init_stub -#define _cpp2_icpp_init_stub -#include "Core/init" -#include "CppBase/init" -#endif diff --git a/uppdev/cpp2/main.cpp b/uppdev/cpp2/main.cpp deleted file mode 100644 index d1cffc6fb..000000000 --- a/uppdev/cpp2/main.cpp +++ /dev/null @@ -1,129 +0,0 @@ -#include "cpp.h" - -Vector errs; - -void AddError(const String& path, int ln, const String& s) -{ - errs.Add(path + " " + AsString(ln) + ": " + s); -} - -String include_path = - "C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\Vc\\Include;C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\Include;C:\\OpenSSL-Win32\\include;C:\\u\\pgsql\\include;C:\\u\\OpenSSL-Win32\\include;" - "C:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\Vc\\Include;C:\\Program Files\\Microsoft SDKs\\Windows\\v7.0\\Include;C:\\u\\OpenSSL-Win32\\include;C:\\u\\pgsql\\include;C:\\Program Files (x86)\\MySQL\\MySQL Connector C 6.1\\include;" - ";c:/u/upp.src/uppsrc"; - -void Test(const char *sourcefile, const char *currentfile) -{ - DUMP(sourcefile); - DUMP(currentfile); - Cpp cpp; - cpp.include_path = include_path; - FileIn in(sourcefile); - { RTIMING("Preprocess"); - cpp.Preprocess(sourcefile, in, currentfile); - DUMP(cpp.namespace_stack); -<<<<<<< .mine - DUMP(cpp.output); -======= ->>>>>>> .r8434 - DUMP(cpp.usedmacro); -<<<<<<< .mine - DUMP(cpp.definedmacro); -======= - DUMP(cpp.macro.GetCount()); ->>>>>>> .r8434 - } - LOG("================================="); -<<<<<<< .mine -/* -======= - LOG(cpp.output); - ->>>>>>> .r8434 -/* - { - Cpp cpp2; - cpp2.include_path = include_path; - cpp2.Preprocess(sourcefile, NilStream(), currentfile, &cpp.usedmacro); - DUMP(cpp2.macro); - } -*/ - for(int i = 0; i < 100; i++) - { - RTIMING("GetMacros"); - Cpp cpp2; - cpp2.include_path = include_path; - cpp2.Preprocess(sourcefile, NilStream(), currentfile, &cpp.usedmacro); - } -*/ -} - -void TestC(const char *ln) -{ - for(int q = 0; q < 2; q++) { - bool incomment = q; - String l = ln; - DUMP(incomment); - LOG(l); - RemoveComments(l, incomment); - LOG(l); - LOG(incomment); - LOG("-----------------------"); - } -} - -CONSOLE_APP_MAIN -{ - StdLogSetup(LOG_FILE, NULL, 150000000); -// Test(GetDataFile("testfile")); -// Test("c:/u/upp.src/uppsrc/CtrlLib/EditField.cpp"); -// getchar(); - -// PPFile f; -// FileIn in(GetDataFile("test.h")); -// f.Parse(in); -// f.Dump(); - - GetPPFile("C:\\u\\upp.src\\uppsrc\\Core\\Core.h").Dump(); - DLOG("=============="); - Test("C:\\u\\upp.src\\uppsrc\\Core\\Format.h", "C:\\u\\upp.src\\uppsrc\\Core\\Format.cpp"); - - return; -<<<<<<< .mine -#endif - { - RTIMING("Pass1"); - Test("C:\\u\\upp.src\\uppsrc\\Core\\Topt.h", "C:\\u\\upp.src\\uppsrc\\Core\\Format.cpp"); - } -#ifndef _DEBUG - for(int i = 0; i < 100; i++) { - Test("C:\\u\\upp.src\\uppsrc\\Core\\Format.h", "C:\\u\\upp.src\\uppsrc\\Core\\Format.cpp"); - } -#endif -#if 0 - { - RTIMING("Pass1"); - Index visited; -// RecursePP("c:/u/upp.src/uppsrc/CtrlLib/EditField.cpp", include_path, visited); - } - - DDUMP(IncludesFile("c:/u/upp.src/uppsrc/CtrlLib/EditField.cpp", "c:/u/upp.src/uppsrc/Core/Core.h", include_path)); - DDUMP(IncludesFile("c:/u/upp.src/uppsrc/CtrlLib/EditField.cpp", "c:/u/upp.src/uppsrc/Core/Core2.h", include_path)); - - for(int i = 0; i < 1000; i++) { - RTIMING("IncludesFile true"); - IncludesFile("c:/u/upp.src/uppsrc/CtrlLib/EditField.cpp", "c:/u/upp.src/uppsrc/Core/Core.h", include_path); - } - - for(int i = 0; i < 1000; i++) { - RTIMING("IncludesFile false"); - IncludesFile("c:/u/upp.src/uppsrc/CtrlLib/EditField.cpp", "c:/u/upp.src/uppsrc/Core/Core1.h", include_path); - } -#endif -// GetPPFile(GetDataFile("test.h")).Dump(); - return; -======= ->>>>>>> .r8434 -} - -// TEST:a,b:|a|b|\n diff --git a/uppdev/cpp2/test.h b/uppdev/cpp2/test.h deleted file mode 100644 index 3d1511a84..000000000 --- a/uppdev/cpp2/test.h +++ /dev/null @@ -1,182 +0,0 @@ -#include -#include -#include -#include - -#define eprintf(x, ...) if(x) printf(__VA_ARGS__) - -eprintf(TEST, "%d is %d", a, b, c) - -#define TEST test_expanded - -TEST /* TEST in comment */ TEST -/* TEST in comment 2 -TEST second line -*/ TEST - -TEST // TEST - -#undef TEST - -This should not be expanded, it was undefined: TEST - -#define __Expand1(x) x(1) -#define __Expand2(x) __Expand1(x) x(2) -#define __Expand3(x) __Expand2(x) x(3) -#define __Expand4(x) __Expand3(x) x(4) -#define __Expand5(x) __Expand4(x) x(5) -#define __Expand6(x) __Expand5(x) x(6) -#define __Expand7(x) __Expand6(x) x(7) -#define __Expand8(x) __Expand7(x) x(8) -#define __Expand9(x) __Expand8(x) x(9) -#define __Expand10(x) __Expand9(x) x(10) -#define __Expand11(x) __Expand10(x) x(11) -#define __Expand12(x) __Expand11(x) x(12) -#define __Expand13(x) __Expand12(x) x(13) -#define __Expand14(x) __Expand13(x) x(14) -#define __Expand15(x) __Expand14(x) x(15) -#define __Expand16(x) __Expand15(x) x(16) -#define __Expand17(x) __Expand16(x) x(17) -#define __Expand18(x) __Expand17(x) x(18) -#define __Expand19(x) __Expand18(x) x(19) -#define __Expand20(x) __Expand19(x) x(20) -#define __Expand21(x) __Expand20(x) x(21) -#define __Expand22(x) __Expand21(x) x(22) -#define __Expand23(x) __Expand22(x) x(23) -#define __Expand24(x) __Expand23(x) x(24) -#define __Expand25(x) __Expand24(x) x(25) -#define __Expand26(x) __Expand25(x) x(26) -#define __Expand27(x) __Expand26(x) x(27) -#define __Expand28(x) __Expand27(x) x(28) -#define __Expand29(x) __Expand28(x) x(29) -#define __Expand30(x) __Expand29(x) x(30) -#define __Expand31(x) __Expand30(x) x(31) -#define __Expand32(x) __Expand31(x) x(32) -#define __Expand33(x) __Expand32(x) x(33) -#define __Expand34(x) __Expand33(x) x(34) -#define __Expand35(x) __Expand34(x) x(35) -#define __Expand36(x) __Expand35(x) x(36) -#define __Expand37(x) __Expand36(x) x(37) -#define __Expand38(x) __Expand37(x) x(38) -#define __Expand39(x) __Expand38(x) x(39) -#define __Expand40(x) __Expand39(x) x(40) - -#define __Expand(x) __Expand40(x) - -#define __List1(x) x(1) -#define __List2(x) __List1(x), x(2) -#define __List3(x) __List2(x), x(3) -#define __List4(x) __List3(x), x(4) -#define __List5(x) __List4(x), x(5) -#define __List6(x) __List5(x), x(6) -#define __List7(x) __List6(x), x(7) -#define __List8(x) __List7(x), x(8) -#define __List9(x) __List8(x), x(9) -#define __List10(x) __List9(x), x(10) -#define __List11(x) __List10(x), x(11) -#define __List12(x) __List11(x), x(12) -#define __List13(x) __List12(x), x(13) -#define __List14(x) __List13(x), x(14) -#define __List15(x) __List14(x), x(15) -#define __List16(x) __List15(x), x(16) -#define __List17(x) __List16(x), x(17) -#define __List18(x) __List17(x), x(18) -#define __List19(x) __List18(x), x(19) -#define __List20(x) __List19(x), x(20) -#define __List21(x) __List20(x), x(21) -#define __List22(x) __List21(x), x(22) -#define __List23(x) __List22(x), x(23) -#define __List24(x) __List23(x), x(24) -#define __List25(x) __List24(x), x(25) -#define __List26(x) __List25(x), x(26) -#define __List27(x) __List26(x), x(27) -#define __List28(x) __List27(x), x(28) -#define __List29(x) __List28(x), x(29) -#define __List30(x) __List29(x), x(30) -#define __List31(x) __List30(x), x(31) -#define __List32(x) __List31(x), x(32) -#define __List33(x) __List32(x), x(33) -#define __List34(x) __List33(x), x(34) -#define __List35(x) __List34(x), x(35) -#define __List36(x) __List35(x), x(36) -#define __List37(x) __List36(x), x(37) -#define __List38(x) __List37(x), x(38) -#define __List39(x) __List38(x), x(39) -#define __List40(x) __List39(x), x(40) - -namespace Test { - -using namespace std; - -#include "LaterInclude.h" - -}; - -using -namespace -Something::otherline; - -namespace -::something::otherthing { - cool! -}; - -#define E__p(I) p##I - -#define ASSTRING_(x) #x -#define ASSTRING(x) ASSTRING_(x) - -#define COMBINE__(a, b) a##b -#define COMBINE(a, b) COMBINE__(a, b) - -#define COMBINE3__(a, b, c) a##b##c -#define COMBINE3(a, b, c) COMBINE3__(a, b, c) - -#define COMBINE4__(a, b, c, d) a##b##c##d -#define COMBINE4(a, b, c, d) COMBINE4__(a, b, c, d) - -#define COMBINE5__(a, b, c, d, e) a##b##c##d##e -#define COMBINE5(a, b, c, d, e) COMBINE5__(a, b, c, d, e) - -#define E__NFValue(I) const Value& COMBINE(p, I) -#define E__NFBody(I) String Format(const char *fmt, __List##I(E__NFValue)); - -EXPAND: __Expand20(E__NFBody) - -ASSTRING(Just a test) - -COMBINE(aaaa, bbbb) - - -#define TEST(x, y) %x%y% -#define TESTS(x) #x -#define TEST2(x, y) x ## y -#define TEST4 alfa x ## y.r #hahaha -#define TESTX x -#define TESTY haha -#define TESTZ haha - -TEST('\1', "\2") -TEST( 1 +1 , 3 ) -TEST( "1" "2" ",", ',') -TESTS(a) -TESTS(a x y) -TESTS("A") -TEST2(a, 3) -TEST2(3, a) -TEST2(a, #) -TEST2(a, "X") -TEST2("Y", "X") -TESTX -TESTY -TESTZ -TEST4 - -#define pow2(x) (x) * (x) -#define dist(a, b) pow2(a.x - b.x) + pow2(a.y - b.y) - -dist(x, y); - -#define __countof(a) int(sizeof(a) / sizeof(a[0])) - -__countof(bla) \ No newline at end of file diff --git a/uppdev/cpp2/testfile b/uppdev/cpp2/testfile deleted file mode 100644 index f6d254553..000000000 --- a/uppdev/cpp2/testfile +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/uppdev/cpp2/util.cpp b/uppdev/cpp2/util.cpp deleted file mode 100644 index 57dff4055..000000000 --- a/uppdev/cpp2/util.cpp +++ /dev/null @@ -1,45 +0,0 @@ -#include "cpp.h" - -void SetSpaces(String& l, int pos, int count) -{ - StringBuffer s = l; - memset(~s + pos, ' ', count); - l = s; -} - -void RemoveComments(String& l, bool& incomment) -{ - int q = -1; - int w = -1; - int lim = l.Find("//"); - if(incomment) - q = w = 0; - else { - q = l.Find("/*"); - if(q >= 0 && q < lim) - w = q + 2; - } - while(q >= 0 && q < lim) { - int eq = l.Find("*/", w); - if(eq < 0) { - incomment = true; - SetSpaces(l, q, l.GetCount() - q); - return; - } - SetSpaces(l, q, eq + 2 - q); - incomment = false; - q = l.Find("/*"); - w = q + 2; - } -} - -const Index& CppKeywordsIndex() -{ - static Index id; - ONCELOCK { - const char **cppk = CppKeyword(); - for(int i = 0; cppk[i]; i++) - id.Add(cppk[i]); - } - return id; -} \ No newline at end of file diff --git a/uppdev/cvlink/cvlink.cpp b/uppdev/cvlink/cvlink.cpp deleted file mode 100644 index b0a490d2e..000000000 --- a/uppdev/cvlink/cvlink.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include - -CONSOLE_APP_MAIN -{ - FindFile ff("d:/wwwupp/*.html"); - while(ff) { - String url = "http://www.ultimatepp.org/" + ff.GetName(); - SaveFile(AppendFileName("d:/wwwlink", ff.GetName()), - "\r\n" - "\r\n" - "Redirecting ... \r\n" - "\r\n" - "\r\n" - "

\r\n" - "Ultimate++ homepage has moved

\r\n" - "" - ); - ff.Next(); - } -} diff --git a/uppdev/cvlink/cvlink.upp b/uppdev/cvlink/cvlink.upp deleted file mode 100644 index eb734ffcc..000000000 --- a/uppdev/cvlink/cvlink.upp +++ /dev/null @@ -1,7 +0,0 @@ -uses Core; - -file - "cvlink.cpp"; - -mainconfig - "" = ""; diff --git a/uppdev/cyclic/cyclic.h b/uppdev/cyclic/cyclic.h deleted file mode 100644 index fce4086b0..000000000 --- a/uppdev/cyclic/cyclic.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef _cyclic_cyclic_h -#define _cyclic_cyclic_h -#include -#include - -#include - -using namespace Upp; - -#define LAYOUTFILE -#include - -class cyclic_space : public TopWindow { -public: - typedef cyclic_space CLASSNAME; - cyclic_space(); - virtual void Paint(Draw& w); - virtual void LeftDown(Point, dword); - virtual bool Key(dword key, int count) { - if (key == K_SPACE) { - for(int i=0;i<1000;i++) - { - step(); - } - return true; - } - return false; - } - void step(); - void reset(int cn); - void change(int num, Color ncs[16]); - void calculate(); - int fd[640][480]; - Color col[16]; - int n; -}; - -class cyclic : public WithcyclicLayout { -public: - typedef cyclic CLASSNAME; - cyclic(); - void Click(); - void Setcols(Color pc[16]); -private: - ColorPusher cols[16]; - Color dc[16]; - Label lbl[16]; -}; -cyclic_space par; - -#endif - diff --git a/uppdev/cyclic/cyclic.lay b/uppdev/cyclic/cyclic.lay deleted file mode 100644 index 15524d6f5..000000000 --- a/uppdev/cyclic/cyclic.lay +++ /dev/null @@ -1,6 +0,0 @@ -LAYOUT(cyclicLayout, 204, 340) - ITEM(Button, okb, SetLabel(t_("Rendben")).LeftPosZ(76, 49).TopPosZ(300, 17)) - ITEM(EditIntSpin, colnum, Min(1).Max(16).NotNull(true).LeftPosZ(128, 56).TopPosZ(268, 21)) - ITEM(Label, lb1, SetLabel(t_("Használt szín")).LeftPosZ(12, 100).TopPosZ(268, 21)) -END_LAYOUT - diff --git a/uppdev/cyclic/cyclic.upp b/uppdev/cyclic/cyclic.upp deleted file mode 100644 index 33e974d1b..000000000 --- a/uppdev/cyclic/cyclic.upp +++ /dev/null @@ -1,11 +0,0 @@ -uses - CtrlLib; - -file - cyclic.h, - main.cpp, - cyclic.lay; - -mainconfig - "" = "GUI"; - diff --git a/uppdev/cyclic/main.cpp b/uppdev/cyclic/main.cpp deleted file mode 100644 index acbdd9428..000000000 --- a/uppdev/cyclic/main.cpp +++ /dev/null @@ -1,209 +0,0 @@ -#include "cyclic.h" - -cyclic_space::cyclic_space() -{ - Sizeable().Zoomable(); - SetRect(100, 100, 640, 480); - col[0] = LtGreen; - col[1] = LtBlue; - col[2] = Green; - col[3] = Red; - col[4] = LtMagenta; - col[5] = Yellow; - col[6] = Cyan; - col[7] = LtRed; - col[8] = LtCyan; - col[9] = Magenta; - col[10] = White; - col[11] = LtYellow; - col[12] = Blue; - col[13] = Gray; - col[14] = LtGray; - col[15] = Black; - BackPaint(); - reset(16); -} -void cyclic_space::reset(int cn) // New random field -{ - int k = cn; - n = cn-1; -// KillTimeCallback(0); - srand ( time(NULL) ); - for(int i=0; i<640; i++) - { - for(int j=0; j<480; j++) - { - fd[i][j]=rand() % k; - } - } -/* for(int i=0;i<1000;i++) - { - step(); - }*/ -// SetTimeCallback(-20, THISBACK(step)); -} -void cyclic_space::change(int num, Color ncs[16]) // new colors from cyclic object -{ - for(int j=0; j<16; j++) - { - col[j] = ncs[j]; - } - reset(num); -} -void cyclic_space::step() -{ - calculate(); - Refresh(); - ProcessEvents(); -} -void cyclic_space::LeftDown(Point, dword) -{ -/* cyclic cs; - cs.Setcols(col); - cs.RunAppModal();*/ - step(); -} -void cyclic_space::calculate() // Next cell generation -{ - int i,j; - int id[480],od[480],ad,dat; - id[0]=od[0]=fd[0][0]; - dat=id[0]= 8?128:28; - y = 8 + 32 * (i % 8); - lbl[i] = Format("%d",i+1); - cols[i].LeftPosZ(x, 64); - cols[i].TopPosZ(y, 24); - lbl[i].LeftPosZ(x-20, 14); - lbl[i].TopPosZ(y, 24); - Add(lbl[i]); - Add(cols[i]); - } -} -void cyclic::Click() -{ - for(int i=0;i<16;i++) - { - dc[i]=cols[i].GetData(); - } - par.change(colnum, dc); - Break(IDOK); -} - -GUI_APP_MAIN -{ - par.Run(); -} - diff --git a/uppdev/cyclic/readme.txt b/uppdev/cyclic/readme.txt deleted file mode 100644 index 1756040a5..000000000 --- a/uppdev/cyclic/readme.txt +++ /dev/null @@ -1 +0,0 @@ -To simplify the situation I have commented out calling the color change (cyclic object job). Instead in cyclic_space::LeftDown function there is the step function. And so one can see the code is able to work by mouse clicks. But if in cyclic_space::reset function 39 - 42 rows are added then there is nothing painted. \ No newline at end of file diff --git a/uppdev/dblclk/dblclk.upp b/uppdev/dblclk/dblclk.upp deleted file mode 100644 index 5872304d3..000000000 --- a/uppdev/dblclk/dblclk.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - CtrlLib; - -file - main.cpp; - -mainconfig - "" = "GUI"; - diff --git a/uppdev/dblclk/main.cpp b/uppdev/dblclk/main.cpp deleted file mode 100644 index 8b6d30fe6..000000000 --- a/uppdev/dblclk/main.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include - -using namespace Upp; - -struct Test : TopWindow { - virtual void LeftDouble(Point p, dword keyflags); - virtual -}; - -GUI_APP_MAIN -{ -} - diff --git a/uppdev/dbldate/dbldate.cpp b/uppdev/dbldate/dbldate.cpp deleted file mode 100644 index 18eff0e90..000000000 --- a/uppdev/dbldate/dbldate.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include - -using namespace Upp; - -CONSOLE_APP_MAIN -{ - for(int i = 0; i < 365 * 100000; i++) { - Date d = i + Date(1, 1, 1); - double x = (d - Date(-4000, 1, 1)) * 1.0E300; - ASSERT(x >= 1.0E300); - Date d1 = int(x / 1.0E300 + 0.5) + Date(-4000, 1, 1); - ASSERT(d == d1); - if((i & 1023) == 0) - Cout() << i / 365 << " " << x << '\n'; - } -} diff --git a/uppdev/dbldate/dbldate.upp b/uppdev/dbldate/dbldate.upp deleted file mode 100644 index 6cdec14be..000000000 --- a/uppdev/dbldate/dbldate.upp +++ /dev/null @@ -1,7 +0,0 @@ -uses Core; - -file - "dbldate.cpp"; - -mainconfig - "" = ""; diff --git a/uppdev/doc.dpp/AppRes_AppRes_GPL_EN-US.dpp b/uppdev/doc.dpp/AppRes_AppRes_GPL_EN-US.dpp deleted file mode 100644 index 4c1e501c2..000000000 --- a/uppdev/doc.dpp/AppRes_AppRes_GPL_EN-US.dpp +++ /dev/null @@ -1,486 +0,0 @@ -ITEM("AppRes", "AppRes", "GPL", "EN-US") EXTERNAL -TXT("[%EN-US3 $$0,0#00000000000000000000000000000000:Default]") -TXT("[{_}%EN-US ") -TXT("[s0;=*R+217 GNU GENERAL PUBLIC LICENSE&]") -TXT("[s0;=/ Version 2, June 1991&]") -TXT("[s0; &]") -TXT("[s0;/ Copyright (C) 1989, 1991 Free Software Foundation, Inc.&]") -TXT("[s0;/ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA&]") -TXT("[s0;b83; Everyone is permitted to copy and distribute verbatim c") -TXT("opies ") -TXT("of this license document, but changing it is not allowed.&]") -TXT("[s0;=b83;*/R4 Preamble&]") -TXT("[s0;b83; The licenses for most software are designed to take awa") -TXT("y ") -TXT("your freedom to share and change it. By contrast, the GNU Gener") -TXT("al ") -TXT("Public License is intended to guarantee your freedom to share ") -TXT("and change free software`--to make sure the software is free ") -TXT("for all its users. This General Public License applies to most ") -TXT("of the Free Software Foundation's software and to any other prog") -TXT("ram ") -TXT("whose authors commit to using it. (Some other Free Software ") -TXT("Foundation software is covered by the GNU Library General Public") -TXT(" ") -TXT("License instead.) You can apply it to your programs, too.&]") -TXT("[s0;b83; When we speak of free software, we are referring to fre") -TXT("edom, ") -TXT("not price. Our General Public Licenses are designed to make ") -TXT("sure that you have the freedom to distribute copies of free soft") -TXT("ware ") -TXT("(and charge for this service if you wish), that you receive sour") -TXT("ce ") -TXT("code or can get it if you want it, that you can change the softw") -TXT("are ") -TXT("or use pieces of it in new free programs; and that you know you ") -TXT("can do these things.&]") -TXT("[s0;b83; To protect your rights, we need to make restrictions th") -TXT("at ") -TXT("forbid anyone to deny you these rights or to ask you to surrende") -TXT("r ") -TXT("the rights. These restrictions translate to certain responsibili") -TXT("ties ") -TXT("for you if you distribute copies of the software, or if you modi") -TXT("fy ") -TXT("it.&]") -TXT("[s0;b83; For example, if you distribute copies of such a program") -TXT(", ") -TXT("whether gratis or for a fee, you must give the recipients all ") -TXT("the rights that you have. You must make sure that they, too, ") -TXT("receive or can get the source code. And you must show them thes") -TXT("e ") -TXT("terms so they know their rights.&]") -TXT("[s0;b83; We protect your rights with two steps: (1) copyright th") -TXT("e ") -TXT("software, and (2) offer you this license which gives you legal ") -TXT("permission to copy, distribute and/or modify the software.&]") -TXT("[s0;b83; Also, for each author's protection and ours, we want to") -TXT(" ") -TXT("make certain that everyone understands that there is no warranty") -TXT(" ") -TXT("for this free software. If the software is modified by someone ") -TXT("else and passed on, we want its recipients to know that what ") -TXT("they have is not the original, so that any problems introduced ") -TXT("by others will not reflect on the original authors' reputations.") -TXT("&]") -TXT("[s0;b83; Finally, any free program is threatened constantly by s") -TXT("oftware ") -TXT("patents. We wish to avoid the danger that redistributors of ") -TXT("a free program will individually obtain patent licenses, in effe") -TXT("ct ") -TXT("making the program proprietary. To prevent this, we have made ") -TXT("it clear that any patent must be licensed for everyone's free ") -TXT("use or not licensed at all.&]") -TXT("[s0;b83; The precise terms and conditions for copying, distribut") -TXT("ion ") -TXT("and modification follow.&]") -TXT("[s0;b83; &]") -TXT("[s0;=b83;*R5 GNU GENERAL PUBLIC LICENSE&]") -TXT("[s0;=R TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFI") -TXT("CATION&]") -TXT("[s0;i128;b83;O9; [*+150 0].-|This License applies to any program") -TXT(" or ") -TXT("other work which contains a notice placed by the copyright holde") -TXT("r ") -TXT("saying it may be distributed under the terms of this General ") -TXT("Public License. The \"Program\", below, refers to any such progra") -TXT("m ") -TXT("or work, and a \"work based on the Program\" means either the Prog") -TXT("ram ") -TXT("or any derivative work under copyright law:&]") -TXT("[s0;l128;b83;/ that is to say, a work containing the Program or ") -TXT("a ") -TXT("portion of it, either verbatim or with modifications and/or tran") -TXT("slated ") -TXT("into another language. (Hereinafter, translation is included ") -TXT("without limitation in the term \"modification\".) Each licensee ") -TXT("is addressed as \"you\".&]") -TXT("[s0;l128;b83; Activities other than copying, distribution and mo") -TXT("dification ") -TXT("are not covered by this License; they are outside its scope. ") -TXT(" The act of running the Program is not restricted, and the outpu") -TXT("t ") -TXT("from the Program is covered only if its contents constitute a ") -TXT("work based on the Program (independent of having been made by ") -TXT("running the Program). Whether that is true depends on what the ") -TXT("Program does.&]") -TXT("[s0;i128;b83;O9; [*5 1].-|You may copy and distribute verbatim c") -TXT("opies ") -TXT("of the Program's source code as you receive it, in any medium, ") -TXT("provided that you conspicuously and appropriately publish on ") -TXT("each copy an appropriate copyright notice and disclaimer of warr") -TXT("anty; ") -TXT("keep intact all the notices that refer to this License and to ") -TXT("the absence of any warranty; and give any other recipients of ") -TXT("the Program a copy of this License along with the Program.&]") -TXT("[s0;l128;b83; You may charge a fee for the physical act of trans") -TXT("ferring ") -TXT("a copy, and you may at your option offer warranty protection ") -TXT("in exchange for a fee.&]") -TXT("[s0;i128;b83;O9; [*5 2].-|You may modify your copy or copies of ") -TXT("the ") -TXT("Program or any portion of it, thus forming a work based on the ") -TXT("Program, and copy and distribute such modifications or work unde") -TXT("r ") -TXT("the terms of Section 1 above, provided that you also meet all ") -TXT("of these conditions:&]") -TXT("[s0;l128;i150;b83;O9; a)-|You must cause the modified files to c") -TXT("arry ") -TXT("prominent notices stating that you changed the files and the ") -TXT("date of any change.&]") -TXT("[s0;l128;i150;b83;O9; b)-|You must cause any work that you distr") -TXT("ibute ") -TXT("or publish, that in whole or in part contains or is derived from") -TXT(" ") -TXT("the Program or any part thereof, to be licensed as a whole at ") -TXT("no charge to all third parties under the terms of this License.&") -TXT("]") -TXT("[s0;l128;i150;b83;O9; c)-|If the modified program normally reads") -TXT(" commands ") -TXT("interactively when run, you must cause it, when started running ") -TXT("for such interactive use in the most ordinary way, to print or ") -TXT("display an announcement including an appropriate copyright notic") -TXT("e ") -TXT("and a notice that there is no warranty (or else, saying that ") -TXT("you provide a warranty) and that users may redistribute the prog") -TXT("ram ") -TXT("under these conditions, and telling the user how to view a copy ") -TXT("of this License. (Exception: if the Program itself is interacti") -TXT("ve ") -TXT("but does not normally print such an announcement, your work base") -TXT("d ") -TXT("on the Program is not required to print an announcement.)&]") -TXT("[s0;l128;b83; These requirements apply to the modified work as a") -TXT(" ") -TXT("whole. If identifiable sections of that work are not derived ") -TXT("from the Program, and can be reasonably considered independent ") -TXT("and separate works in themselves, then this License, and its ") -TXT("terms, do not apply to those sections when you distribute them ") -TXT("as separate works. But when you distribute the same sections ") -TXT("as part of a whole which is a work based on the Program, the ") -TXT("distribution of the whole must be on the terms of this License, ") -TXT("whose permissions for other licensees extend to the entire whole") -TXT(", ") -TXT("and thus to each and every part regardless of who wrote it.&]") -TXT("[s0;l128;b83; Thus, it is not the intent of this section to clai") -TXT("m ") -TXT("rights or contest your rights to work written entirely by you; ") -TXT("rather, the intent is to exercise the right to control the distr") -TXT("ibution ") -TXT("of derivative or collective works based on the Program.&]") -TXT("[s0;l128;b83; In addition, mere aggregation of another work not ") -TXT("based ") -TXT("on the Program with the Program (or with a work based on the ") -TXT("Program) on a volume of a storage or distribution medium does ") -TXT("not bring the other work under the scope of this License.&]") -TXT("[s0;i128;b83;O9; [*5 3].-|You may copy and distribute the Progra") -TXT("m (or ") -TXT("a work based on it, under Section 2) in object code or executabl") -TXT("e ") -TXT("form under the terms of Sections 1 and 2 above provided that ") -TXT("you also do one of the following:&]") -TXT("[s0;l128;i150;b83;O9; a)-|Accompany it with the complete corresp") -TXT("onding ") -TXT("machine-readable source code, which must be distributed under ") -TXT("the terms of Sections 1 and 2 above on a medium customarily used") -TXT(" ") -TXT("for software interchange; or,&]") -TXT("[s0;l128;i150;b83;O9; b)-|Accompany it with a written offer, val") -TXT("id ") -TXT("for at least three years, to give any third party, for a charge ") -TXT("no more than your cost of physically performing source distribut") -TXT("ion, ") -TXT("a complete machine-readable copy of the corresponding source ") -TXT("code, to be distributed under the terms of Sections 1 and 2 abov") -TXT("e ") -TXT("on a medium customarily used for software interchange; or,&]") -TXT("[s0;l128;i150;b83;O9; c)-|Accompany it with the information you ") -TXT("received ") -TXT("as to the offer to distribute corresponding source code. (This ") -TXT("alternative is allowed only for noncommercial distribution and ") -TXT("only if you received the program in object code or executable ") -TXT("form with such an offer, in accord with Subsection b above.)&]") -TXT("[s0;l128;b83; The source code for a work means the preferred for") -TXT("m ") -TXT("of the work for making modifications to it. For an executable ") -TXT("work, complete source code means all the source code for all ") -TXT("modules it contains, plus any associated interface definition ") -TXT("files, plus the scripts used to control compilation and installa") -TXT("tion ") -TXT("of the executable. However, as a special exception, the source ") -TXT("code distributed need not include anything that is normally dist") -TXT("ributed ") -TXT("(in either source or binary form) with the major components (com") -TXT("piler, ") -TXT("kernel, and so on) of the operating system on which the executab") -TXT("le ") -TXT("runs, unless that component itself accompanies the executable.&]") -TXT("[s0;l128;b83; If distribution of executable or object code is ma") -TXT("de ") -TXT("by offering access to copy from a designated place, then offerin") -TXT("g ") -TXT("equivalent access to copy the source code from the same place ") -TXT("counts as distribution of the source code, even though third ") -TXT("parties are not compelled to copy the source along with the obje") -TXT("ct ") -TXT("code.&]") -TXT("[s0;i128;b83;O9; [*5 4].-|You may not copy, modify, sublicense, ") -TXT("or distribute ") -TXT("the Program except as expressly provided under this License. ") -TXT(" Any attempt otherwise to copy, modify, sublicense or distribute") -TXT(" ") -TXT("the Program is void, and will automatically terminate your right") -TXT("s ") -TXT("under this License. However, parties who have received copies, ") -TXT("or rights, from you under this License will not have their licen") -TXT("ses ") -TXT("terminated so long as such parties remain in full compliance.&]") -TXT("[s0;i128;b83;O9; [*5 5].-|You are not required to accept this Li") -TXT("cense, ") -TXT("since you have not signed it. However, nothing else grants you ") -TXT("permission to modify or distribute the Program or its derivative") -TXT(" ") -TXT("works. These actions are prohibited by law if you do not accept") -TXT(" ") -TXT("this License. Therefore, by modifying or distributing the Progr") -TXT("am ") -TXT("(or any work based on the Program), you indicate your acceptance") -TXT(" ") -TXT("of this License to do so, and all its terms and conditions for ") -TXT("copying, distributing or modifying the Program or works based ") -TXT("on it.&]") -TXT("[s0;i128;b83;O9; [*5 6].-|Each time you redistribute the Program") -TXT(" (or ") -TXT("any work based on the Program), the recipient automatically rece") -TXT("ives ") -TXT("a license from the original licensor to copy, distribute or modi") -TXT("fy ") -TXT("the Program subject to these terms and conditions. You may not ") -TXT("impose any further restrictions on the recipients' exercise of ") -TXT("the rights granted herein. You are not responsible for enforcing") -TXT(" ") -TXT("compliance by third parties to this License.&]") -TXT("[s0;i128;b83;O9; [*5 7].-|If, as a consequence of a court judgme") -TXT("nt or ") -TXT("allegation of patent infringement or for any other reason (not ") -TXT("limited to patent issues), conditions are imposed on you (whethe") -TXT("r ") -TXT("by court order, agreement or otherwise) that contradict the cond") -TXT("itions ") -TXT("of this License, they do not excuse you from the conditions of ") -TXT("this License. If you cannot distribute so as to satisfy simulta") -TXT("neously ") -TXT("your obligations under this License and any other pertinent obli") -TXT("gations, ") -TXT("then as a consequence you may not distribute the Program at all.") -TXT(" ") -TXT(" For example, if a patent license would not permit royalty-free ") -TXT("redistribution of the Program by all those who receive copies ") -TXT("directly or indirectly through you, then the only way you could ") -TXT("satisfy both it and this License would be to refrain entirely ") -TXT("from distribution of the Program.&]") -TXT("[s0;l128;b83; If any portion of this section is held invalid or ") -TXT("unenforceable ") -TXT("under any particular circumstance, the balance of the section ") -TXT("is intended to apply and the section as a whole is intended to ") -TXT("apply in other circumstances.&]") -TXT("[s0;l128;b83; It is not the purpose of this section to induce yo") -TXT("u ") -TXT("to infringe any patents or other property right claims or to ") -TXT("contest validity of any such claims; this section has the sole ") -TXT("purpose of protecting the integrity of the free software distrib") -TXT("ution ") -TXT("system, which is implemented by public license practices. Many ") -TXT("people have made generous contributions to the wide range of ") -TXT("software distributed through that system in reliance on consiste") -TXT("nt ") -TXT("application of that system; it is up to the author/donor to deci") -TXT("de ") -TXT("if he or she is willing to distribute software through any other") -TXT(" ") -TXT("system and a licensee cannot impose that choice.&]") -TXT("[s0;l128;b83; This section is intended to make thoroughly clear ") -TXT("what ") -TXT("is believed to be a consequence of the rest of this License.&]") -TXT("[s0;i128;b83;O9; [*5 8].-|If the distribution and/or use of the ") -TXT("Program ") -TXT("is restricted in certain countries either by patents or by copyr") -TXT("ighted ") -TXT("interfaces, the original copyright holder who places the Program") -TXT(" ") -TXT("under this License may add an explicit geographical distribution") -TXT(" ") -TXT("limitation excluding those countries, so that distribution is ") -TXT("permitted only in or among countries not thus excluded. In such") -TXT(" ") -TXT("case, this License incorporates the limitation as if written ") -TXT("in the body of this License.&]") -TXT("[s0;i128;b83;O9; [*5 9].-|The Free Software Foundation may publi") -TXT("sh revised ") -TXT("and/or new versions of the General Public License from time to ") -TXT("time. Such new versions will be similar in spirit to the presen") -TXT("t ") -TXT("version, but may differ in detail to address new problems or ") -TXT("concerns.&]") -TXT("[s0;l128;b83; Each version is given a distinguishing version num") -TXT("ber. ") -TXT(" If the Program specifies a version number of this License which") -TXT(" ") -TXT("applies to it and \"any later version\", you have the option of ") -TXT("following the terms and conditions either of that version or ") -TXT("of any later version published by the Free Software Foundation. ") -TXT(" If the Program does not specify a version number of this Licens") -TXT("e, ") -TXT("you may choose any version ever published by the Free Software ") -TXT("Foundation.&]") -TXT("[s0;i160;b83;O9; [*5 10]. If you wish to incorporate parts of th") -TXT("e Program ") -TXT("into other free programs whose distribution conditions are diffe") -TXT("rent, ") -TXT("write to the author to ask for permission. For software which ") -TXT("is copyrighted by the Free Software Foundation, write to the ") -TXT("Free Software Foundation; we sometimes make exceptions for this.") -TXT(" ") -TXT(" Our decision will be guided by the two goals of preserving the ") -TXT("free status of all derivatives of our free software and of promo") -TXT("ting ") -TXT("the sharing and reuse of software generally.&]") -TXT("[s0;i160;b83;O9; &]") -TXT("[s0;=b83;*/R+150 NO WARRANTY&]") -TXT("[s0;i256;b83;O9;c [*c5 11][c . ]Because the program is licensed ") -TXT("free ") -TXT("of charge, there is no warranty for the program, to the extent ") -TXT("permitted by applicable law._ Except when otherwise stated in ") -TXT("writing the copyright holders and[c2 /]or other parties provide ") -TXT("the program \"[/ as is]\" without warranty of any kind, either exp") -TXT("ressed ") -TXT("or implied, including, but not limited to, the implied warrantie") -TXT("s ") -TXT("of merchantability and fitness for a particular purpose._ The ") -TXT("entire risk as to the quality and performance of the program ") -TXT("is with you._ Should the program prove defective, you assume ") -TXT("the cost of all necessary servicing, repair or correction.&]") -TXT("[s0;i256;b83;O9;c [*c5 12][c .]-|In no event unless required by ") -TXT("applicable ") -TXT("law or agreed to in writing will any copyright holder, or any ") -TXT("other party who may modify and[c2 /]or redistribute the program ") -TXT("as permitted above, be liable to you for damages, including any ") -TXT("general, special, incidental or consequential damages arising ") -TXT("out of the use or inability to use the program [c2 (]including ") -TXT("but not limited to loss of data or data being rendered inaccurat") -TXT("e ") -TXT("or losses sustained by you or third parties or a failure of the ") -TXT("program to operate with any other programs[c2 )], even if such ") -TXT("holder or other party has been advised of the possibility of ") -TXT("such damages.&]") -TXT("[s0;b83; &]") -TXT("[s0;=*R4 END OF TERMS AND CONDITIONS&]") -TXT("[s0; &]") -TXT("[s0; &]") -TXT("[s0;*/ How to Apply These Terms to Your New Programs&]") -TXT("[s0;2 &]") -TXT("[s0;/2 If you develop a new program, and you want it to be of th") -TXT("e ") -TXT("greatest possible use to the public, the best way to achieve ") -TXT("this is to make it free software which everyone can redistribute") -TXT(" ") -TXT("and change under these terms.&]") -TXT("[s0;/2 &]") -TXT("[s0;/2 To do so, attach the following notices to the program. I") -TXT("t ") -TXT("is safest to attach them to the start of each source file to ") -TXT("most effectively convey the exclusion of warranty; and each file") -TXT(" ") -TXT("should have at least the \"copyright\" line and a pointer to where") -TXT(" ") -TXT("the full notice is found.&]") -TXT("[s0;/2 &]") -TXT("[s0;C2 &]") -TXT("[s0;C2 Copyright (C) &]") -TXT("[s0;C2 &]") -TXT("[s0;C2 This program is free software; you can redistribute i") -TXT("t ") -TXT("and/or modify&]") -TXT("[s0;C2 it under the terms of the GNU General Public License ") -TXT("as ") -TXT("published by&]") -TXT("[s0;C2 the Free Software Foundation; either version 2 of the") -TXT(" ") -TXT("License, or&]") -TXT("[s0;C2 (at your option) any later version.&]") -TXT("[s0;C2 &]") -TXT("[s0;C2 This program is distributed in the hope that it will ") -TXT("be ") -TXT("useful,&]") -TXT("[s0;C2 but WITHOUT ANY WARRANTY; without even the implied wa") -TXT("rranty ") -TXT("of&]") -TXT("[s0;C2 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ") -TXT(" ") -TXT("See the&]") -TXT("[s0;C2 GNU General Public License for more details.&]") -TXT("[s0;C2 &]") -TXT("[s0;C2 You should have received a copy of the GNU General Pu") -TXT("blic ") -TXT("License&]") -TXT("[s0;C2 along with this program; if not, write to the Free So") -TXT("ftware&]") -TXT("[s0;C2 Foundation, Inc., 59 Temple Place, Suite 330, Boston,") -TXT(" ") -TXT("MA 02111-1307 USA&]") -TXT("[s0;C2 &]") -TXT("[s0; &]") -TXT("[s0;/2 Also add information on how to contact you by electronic ") -TXT("and ") -TXT("paper mail.&]") -TXT("[s0;/2 &]") -TXT("[s0;/2 If the program is interactive, make it output a short not") -TXT("ice ") -TXT("like this when it starts in an interactive mode:&]") -TXT("[s0; &]") -TXT("[s0;C2 Gnomovision version 69, Copyright (C) year name of a") -TXT("uthor&]") -TXT("[s0;C2 Gnomovision comes with ABSOLUTELY NO WARRANTY; for de") -TXT("tails ") -TXT("type ``show w'.&]") -TXT("[s0;C2 This is free software, and you are welcome to redistr") -TXT("ibute ") -TXT("it&]") -TXT("[s0;C2 under certain conditions; type ``show c' for details.") -TXT("&]") -TXT("[s0;C2 &]") -TXT("[s0;/2 The hypothetical commands ``show w' and ``show c' should ") -TXT("show ") -TXT("the appropriate parts of the General Public License. Of course,") -TXT(" ") -TXT("the commands you use may be called something other than ``show ") -TXT("w' and ``show c'; they could even be mouse-clicks or menu items`") -TXT("--whatever ") -TXT("suits your program.&]") -TXT("[s0;/2 &]") -TXT("[s0;/2 You should also get your employer (if you work as a progr") -TXT("ammer) ") -TXT("or your school, if any, to sign a \"copyright disclaimer\" for ") -TXT("the program, if necessary. Here is a sample; alter the names:&]") -TXT("[s0; &]") -TXT("[s0;C2 Yoyodyne, Inc., hereby disclaims all copyright interest") -TXT(" ") -TXT("in the program&]") -TXT("[s0;C2 ``Gnomovision' (which makes passes at compilers) writte") -TXT("n ") -TXT("by James Hacker.&]") -TXT("[s0;C2 &]") -TXT("[s0;C2 , 1 April 1989&]") -TXT("[s0;C2 Ty Coon, President of Vice&]") -TXT("[s0;C2 &]") -TXT("[s0;/2 This General Public License does not permit incorporating") -TXT(" ") -TXT("your program into proprietary programs. If your program is a ") -TXT("subroutine library, you may consider it more useful to permit ") -TXT("linking proprietary applications with the library. If this is ") -TXT("what you want to do, use the GNU Library General Public License ") -TXT("instead of this License.&]") -TXT("[s0;2 ") -END_ITEM diff --git a/uppdev/double/double.cpp b/uppdev/double/double.cpp deleted file mode 100644 index 7e3d7ad6c..000000000 --- a/uppdev/double/double.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include - -using namespace Upp; - -CONSOLE_APP_MAIN -{ - double x = 0; - for(int i = 0; i < 10000000; i++) - x += 0.01; - DUMP(x); -} - diff --git a/uppdev/double/double.upp b/uppdev/double/double.upp deleted file mode 100644 index af6da7ee7..000000000 --- a/uppdev/double/double.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - Core; - -file - double.cpp; - -mainconfig - "" = ""; - diff --git a/uppdev/editint/editint.h b/uppdev/editint/editint.h deleted file mode 100644 index 302cf8918..000000000 --- a/uppdev/editint/editint.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef _editint_editint_h -#define _editint_editint_h - -#include - -using namespace Upp; - -#define LAYOUTFILE -#include - - - -class editint : public WitheditintLayout { -public: - typedef editint CLASSNAME; - editint(); -}; - -#endif diff --git a/uppdev/editint/editint.lay b/uppdev/editint/editint.lay deleted file mode 100644 index dfdf727b3..000000000 --- a/uppdev/editint/editint.lay +++ /dev/null @@ -1,3 +0,0 @@ -LAYOUT(editintLayout, 200, 100) - ITEM(EditInt, dv___0, LeftPosZ(36, 48).TopPosZ(28, 19)) -END_LAYOUT diff --git a/uppdev/editint/editint.upp b/uppdev/editint/editint.upp deleted file mode 100644 index 8e754862f..000000000 --- a/uppdev/editint/editint.upp +++ /dev/null @@ -1,10 +0,0 @@ -uses - CtrlLib; - -file - editint.h, - main.cpp, - editint.lay; - -mainconfig - "" = "GUI"; diff --git a/uppdev/editint/main.cpp b/uppdev/editint/main.cpp deleted file mode 100644 index 1e3f38883..000000000 --- a/uppdev/editint/main.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include "editint.h" - - - -editint::editint() -{ - CtrlLayout(*this, "Window title"); -} - -GUI_APP_MAIN -{ - editint().Run(); -} diff --git a/uppdev/editwithkey/editwithkey.h b/uppdev/editwithkey/editwithkey.h deleted file mode 100644 index 6cfd0f49e..000000000 --- a/uppdev/editwithkey/editwithkey.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef _editwithkey_editwithkey_h -#define _editwithkey_editwithkey_h - -#include - -using namespace Upp; - -//#define LAYOUTFILE -//#include - -class element: public TopWindow -{ -public: - typedef element CLASSNAME; - element(); - - void Increment(); - virtual bool Key(dword key, int count); - -private: - Button _test; - EditField _edit; - EditField _edit2; - int _count; - -}; - - -//class editwithkey : public WitheditwithkeyLayout { -class editwithkey : public TopWindow -{ -public: - typedef editwithkey CLASSNAME; - editwithkey(); - -private: - element _test; - element _test2; -}; - -#endif - diff --git a/uppdev/editwithkey/editwithkey.upp b/uppdev/editwithkey/editwithkey.upp deleted file mode 100644 index a16b7ea8b..000000000 --- a/uppdev/editwithkey/editwithkey.upp +++ /dev/null @@ -1,10 +0,0 @@ -uses - CtrlLib; - -file - editwithkey.h, - main.cpp; - -mainconfig - "" = "GUI"; - diff --git a/uppdev/editwithkey/init b/uppdev/editwithkey/init deleted file mode 100644 index 03e33a9a5..000000000 --- a/uppdev/editwithkey/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _editwithkey_icpp_init_stub -#define _editwithkey_icpp_init_stub -#include "CtrlLib/init" -#endif diff --git a/uppdev/editwithkey/main.cpp b/uppdev/editwithkey/main.cpp deleted file mode 100644 index 68cfcd6ff..000000000 --- a/uppdev/editwithkey/main.cpp +++ /dev/null @@ -1,70 +0,0 @@ -#include "editwithkey.h" -#include - -element::element() -{ - _count = 0; - _test.SetRect(20,10,160,20); - _test.SetLabel("increment"); - _test <<= callback(this, &element::Increment); - Add(_test); - - _edit.SetRect(20,40,160,20); - _edit.AlignRight(); - _edit.SetData(Sprintf("%d",_count)); - Add(_edit); - - _edit2.SetRect(20,70,160,20); - _edit2.AlignRight(); - _edit2.SetData(Sprintf("%d",_count)); - Add(_edit2); -} - -void element::Increment() -{ - _count++; - _edit.SetData(Sprintf("%d",_count)); -} - -bool element::Key(dword key, int count) -{ - if(key == K_ENTER) { - String tmp; - if(_edit.HasFocus()) - { - tmp = _edit.GetData(); - std::stringstream ssStream(~tmp); - ssStream >> _count; - _edit.SetData(Sprintf("%d",_count)); - } - if(_edit2.HasFocus()) - { - /*do something else*/ - } - - - - return true; // key accepted - } - return TopWindow::Key(key, count); -} - - - -editwithkey::editwithkey() -{ -// CtrlLayout(*this, "Window title"); - SetRect(0,0,200,200); - CenterScreen(); - _test.SetRect(0,0,200,100); - _test2.SetRect(0,100,200,100); - - Add(_test); - Add(_test2); -} - -GUI_APP_MAIN -{ - editwithkey().Run(); -} - diff --git a/uppdev/empty/empty.upp b/uppdev/empty/empty.upp deleted file mode 100644 index e69de29bb..000000000 diff --git a/uppdev/endsession/endsession.upp b/uppdev/endsession/endsession.upp deleted file mode 100644 index 6284f1903..000000000 --- a/uppdev/endsession/endsession.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - CtrlLib; - -file - - "main.cpp"; - -mainconfig - "" = "GUI ST"; diff --git a/uppdev/endsession/main.cpp b/uppdev/endsession/main.cpp deleted file mode 100644 index 70da23141..000000000 --- a/uppdev/endsession/main.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include - -GUI_APP_MAIN -{ - TopWindow win; - win.Run(); - LOG("After Run();"); -} diff --git a/uppdev/errno/errno.cpp b/uppdev/errno/errno.cpp deleted file mode 100644 index 0d886cb42..000000000 --- a/uppdev/errno/errno.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include - -using namespace Upp; - -CONSOLE_APP_MAIN -{ - FileIn in("34523"); - DUMP(errno); - DUMP(strerror(errno)); - char h[100]; - DUMP(strerror_r(errno, h, 100)); - DUMP(h); - DUMP(GetLastErrorMessage()); -} - diff --git a/uppdev/errno/errno.upp b/uppdev/errno/errno.upp deleted file mode 100644 index 084467192..000000000 --- a/uppdev/errno/errno.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - Core; - -file - errno.cpp; - -mainconfig - "" = ""; - diff --git a/uppdev/exedir/exedir.upp b/uppdev/exedir/exedir.upp deleted file mode 100644 index a7daadaee..000000000 --- a/uppdev/exedir/exedir.upp +++ /dev/null @@ -1,8 +0,0 @@ -uses - Core; - -file - main.cpp; - -mainconfig - "" = ""; diff --git a/uppdev/exedir/main.cpp b/uppdev/exedir/main.cpp deleted file mode 100644 index 54c868f59..000000000 --- a/uppdev/exedir/main.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include - -CONSOLE_APP_MAIN -{ - DUMP(GetExeFilePath()); - DUMP(GetExeDirFile("test")); -} diff --git a/uppdev/exif/exif.upp b/uppdev/exif/exif.upp deleted file mode 100644 index 5872304d3..000000000 --- a/uppdev/exif/exif.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - CtrlLib; - -file - main.cpp; - -mainconfig - "" = "GUI"; - diff --git a/uppdev/exif/main.cpp b/uppdev/exif/main.cpp deleted file mode 100644 index 4ce1b6990..000000000 --- a/uppdev/exif/main.cpp +++ /dev/null @@ -1,76 +0,0 @@ - -struct ExifReader { - String app1; - bool le; - - const byte *Begin() const { return (const byte *)~app1 + 6; } - const byte *End() const { return (const byte *)app1.End(); } - operator bool() const { return app1.GetCount(); } - - uint32 Peek32(const byte *ptr) const { return (le ? Peek32le : Peek32be)(ptr); } - uint16 Peek16(const byte *ptr) const { return (le ? Peek16le : Peek16be)(ptr); } - - String GetThumbnail() const; - - ExifReader(const String& app1); -}; - -ExifReader::ExifReader(const String& q) -{ - app1 = q; - if(app1.GetCount() > 30 && memcmp(~app1, "ExifReader", 4) == 0) - if(app1[6] == 'I') - le = true; - else - if(app1[6] == 'M') - le = false; - else - app1.Clear(); - else - app1.Clear(); -} - -String ExifReader::GetThumbnail() const -{ - if(!app1.GetCount()) - return Null; - const byte *begin = Begin(); - const byte *end = End(); - const byte *p = begin + Peek32(begin + 4); - if(p + 2 >= end) return Null; - p += Peek16(p) * 12 + 2; - if(p + 4 >= end) return Null; - p = begin + Peek32(p); - if(p <= begin || p + 2 >= end) return Null; - word count = Peek16(p); - p += 2; - dword offset = 0; - dword len = 0; - for(int n = 0; n < count; n++) { - if(p + 12 >= end) Null; - if(Peek32(p + 4) == 1) { - dword val = 0; - switch(Peek16(p + 2)) { - case 4: - case 9: - val = Peek32(p + 8); - break; - case 3: - case 8: - val = Peek16(p + 8); - break; - } - if(val) - switch(Peek16(p)) { - case 0x201: - offset = val; - break; - case 0x202: - len = val; - break; - } - } - p += 12; - } - return offset && len && begin + offset + len < end ? String(begin + offset, len) : String(); -} diff --git a/uppdev/ezcomm/columnlist.JPG b/uppdev/ezcomm/columnlist.JPG deleted file mode 100644 index e04a9f468..000000000 Binary files a/uppdev/ezcomm/columnlist.JPG and /dev/null differ diff --git a/uppdev/ezcomm/ezcomm.lay b/uppdev/ezcomm/ezcomm.lay deleted file mode 100644 index 89530a711..000000000 --- a/uppdev/ezcomm/ezcomm.lay +++ /dev/null @@ -1,33 +0,0 @@ -LAYOUT(ezcommwinLayout, 512, 380) - ITEM(LabelBox, dv___0, SetLabel(t_("local")).LeftPosZ(8, 244).TopPosZ(8, 344)) - ITEM(LabelBox, dv___1, SetLabel(t_("remote")).LeftPosZ(256, 244).TopPosZ(8, 344)) - ITEM(Label, lbl_ip_lcl, SetLabel(t_("address")).SetAlign(ALIGN_CENTER).HSizePosZ(20, 348).TopPosZ(20, 18)) - ITEM(Label, lbl_port_lcl, SetLabel(t_("port")).SetAlign(ALIGN_CENTER).HSizePosZ(176, 272).TopPosZ(20, 18)) - ITEM(Label, lbl_ip_list, SetLabel(t_("address (list)")).SetAlign(ALIGN_CENTER).HSizePosZ(268, 24).TopPosZ(20, 18)) - ITEM(Label, lbl_ip_rmt, SetLabel(t_("address")).SetAlign(ALIGN_CENTER).HSizePosZ(268, 100).TopPosZ(56, 18)) - ITEM(Label, lbl_port_rmt, SetLabel(t_("port")).SetAlign(ALIGN_CENTER).HSizePosZ(424, 24).TopPosZ(56, 18)) - ITEM(Label, lbl_hist_lcl, SetLabel(t_("content history")).SetAlign(ALIGN_CENTER).HSizePosZ(20, 288).TopPosZ(92, 18)) - ITEM(Label, dv___8, SetLabel(t_("content history")).SetAlign(ALIGN_CENTER).HSizePosZ(284, 24).TopPosZ(92, 18)) - ITEM(Label, dv___9, SetLabel(t_("content")).SetAlign(ALIGN_CENTER).LeftPosZ(20, 220).TopPosZ(128, 18)) - ITEM(Label, dv___10, SetLabel(t_("content")).SetAlign(ALIGN_CENTER).HSizePosZ(268, 24).TopPosZ(128, 18)) - ITEM(WithDropChoice, ip_lcl, SetDropLines(8).Tip(t_("local address")).LeftPosZ(20, 144).TopPosZ(36, 21)) - ITEM(WithDropChoice, port_lcl, SetDropLines(8).Tip(t_("local port")).LeftPosZ(176, 64).TopPosZ(36, 21)) - ITEM(WithDropChoice, ip_rmt, SetDropLines(8).Tip(t_("remote address")).LeftPosZ(268, 144).TopPosZ(36, 21)) - ITEM(WithDropChoice, port_rmt, SetDropLines(8).Tip(t_("remote port")).LeftPosZ(424, 64).TopPosZ(36, 21)) - ITEM(DropList, hist_text_out, Tip(t_("text sent")).LeftPosZ(20, 204).TopPosZ(108, 21)) - ITEM(LineEdit, text_out, Tip(t_("text to be sent")).LeftPosZ(20, 220).TopPosZ(144, 204)) - ITEM(Button, butt_out, SetFont(StdFontZ(20).Bold()).Tip(t_("to send the text")).LeftPosZ(20, 220).TopPosZ(356, 48)) - ITEM(DropList, hist_addr_in, SetFrame(OutsetFrame()).Tip(t_("remote socket")).LeftPosZ(268, 220).TopPosZ(36, 21)) - ITEM(EditString, ip_src, SetEditable(false).Tip(t_("source address")).LeftPosZ(268, 144).TopPosZ(72, 20)) - ITEM(EditInt, port_src, SetEditable(false).Tip(t_("source port")).LeftPosZ(424, 64).TopPosZ(72, 19)) - ITEM(DropList, hist_text_in, SetFrame(OutsetFrame()).Tip(t_("text received")).LeftPosZ(284, 204).TopPosZ(108, 21)) - ITEM(LineEdit, text_in, SetEditable(false).SetFrame(OutsetFrame()).Tip(t_("text received")).LeftPosZ(268, 220).TopPosZ(144, 204)) - ITEM(DocEdit, info, SetFrame(NullFrame()).WantFocus(false).Tip(t_("status history")).SetEditable(false).LeftPosZ(268, 220).TopPosZ(356, 48)) - ITEM(Button, butt_in, SetLabel(t_("listen")).SetFont(StdFontZ(11).Bold()).Tip(t_("to start/stop listening")).LeftPosZ(108, 132).TopPosZ(64, 24)) - ITEM(Switch, comm_type, SetLabel(t_("UDP\nTCP")).LeftPosZ(20, 84).TopPosZ(68, 17)) - ITEM(ImageCtrl, arr_o, LeftPosZ(224, 16).TopPosZ(112, 16)) - ITEM(ImageCtrl, arr_i, LeftPosZ(268, 16).TopPosZ(112, 16)) - ITEM(ImageCtrl, arr_r, LeftPosZ(244, 16).TopPosZ(40, 16)) - ITEM(ImageCtrl, arr_l, LeftPosZ(252, 16).TopPosZ(72, 16)) -END_LAYOUT - diff --git a/uppdev/ezcomm/ezcomm.upp b/uppdev/ezcomm/ezcomm.upp deleted file mode 100644 index ccf87c020..000000000 --- a/uppdev/ezcomm/ezcomm.upp +++ /dev/null @@ -1,18 +0,0 @@ -description "EZ Comm\377"; - -uses - CtrlLib; - -library(WIN32) ws2_32; - -options - -DULTIMATEPP; - -file - main.h, - main.cpp, - ezcomm.lay; - -mainconfig - "" = "GUI MT"; - diff --git a/uppdev/ezcomm/init b/uppdev/ezcomm/init deleted file mode 100644 index 44f694cb0..000000000 --- a/uppdev/ezcomm/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _ezcomm_icpp_init_stub -#define _ezcomm_icpp_init_stub -#include "CtrlLib/init" -#endif diff --git a/uppdev/ezcomm/main.cpp b/uppdev/ezcomm/main.cpp deleted file mode 100644 index dc47ef066..000000000 --- a/uppdev/ezcomm/main.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/*************************************************************************** - main - description - ------------------- - begin : Aug. 2, 2007 - copyright : (C) 2007 by Allen - email : bon_ami_@hotmail.com - ***************************************************************************/ - -/*************************************************************************** - * * - * Explicit Distribution Limitation * - * This rule overrides others below. * - * This program may not be modified or used by, or, if possible, * - * redistributed to people described as below, * - * 1.Japanese who hold hostility against Chinese. * - * 2.or, those who discriminate against people based solely on race, * - * gender or sexual orientation. * - * * - ***************************************************************************/ -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -/* - * source code of EZ Comm Project Ultimate++ functionalities - */ - -#include "main.h" - -GUI_APP_MAIN -{ - ezcommwin ezcw; - - ezcw.Run(); -} - diff --git a/uppdev/ezcomm/main.h b/uppdev/ezcomm/main.h deleted file mode 100644 index a6847f870..000000000 --- a/uppdev/ezcomm/main.h +++ /dev/null @@ -1,50 +0,0 @@ -/*************************************************************************** - main - description - ------------------- - begin : Aug. 2, 2007 - copyright : (C) 2007 by Allen - email : bon_ami_@hotmail.com - ***************************************************************************/ - -/*************************************************************************** - * * - * Explicit Distribution Limitation * - * This rule overrides others below. * - * This program may not be modified or used by, or, if possible, * - * redistributed to people described as below, * - * 1.Japanese who hold hostility against Chinese. * - * 2.or, those who discriminate against people based solely on race, * - * gender or sexual orientation. * - * * - ***************************************************************************/ -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -/* - * header of EZ Comm Project Ultimate++ functionalities - */ - -#ifndef _ezcomm_ezcomm_h -#define _ezcomm_ezcomm_h - -#include - -using namespace Upp; - -#define LAYOUTFILE -#include - -class ezcommwin : public WithezcommwinLayout { -public: - ColumnList cl; - typedef ezcommwin CLASSNAME; - ezcommwin() { Add(cl.LeftPos(10, 100).TopPos(30, 80)); } -}; - -#endif - diff --git a/uppdev/ezcomm/memfail.JPG b/uppdev/ezcomm/memfail.JPG deleted file mode 100644 index 6b0645570..000000000 Binary files a/uppdev/ezcomm/memfail.JPG and /dev/null differ diff --git a/uppdev/f602/f602.cpp b/uppdev/f602/f602.cpp deleted file mode 100644 index 5dd63f8bf..000000000 --- a/uppdev/f602/f602.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include - -using namespace Upp; - -CONSOLE_APP_MAIN -{ - XmlNode n = ParseXML(LoadFile("e:/form.xml")); -// DUMP(AsXML(n)); - const XmlNode& sig = n["dsig:Signature"]; - for(int i = 0; i < sig.GetCount(); i++) { - if(sig[i].IsTag() && sig[i].GetTag() == "dsig:Object" && sig[i]["d:root"]["d:priloha_pdf"].GetCount()) { - DUMP(AsXML(sig[i]["d:root"]["d:priloha_pdf"]["d:pocet_stran"])); - DUMP(~sig[i]["d:root"]["d:priloha_pdf"]["d:pocet_stran"]); - SaveFile("e:/test.pdf", Base64Decode(~sig[i]["d:root"]["d:priloha_pdf"]["d:base64data"])); - } - } -} diff --git a/uppdev/f602/f602.upp b/uppdev/f602/f602.upp deleted file mode 100644 index 9e37a341e..000000000 --- a/uppdev/f602/f602.upp +++ /dev/null @@ -1,10 +0,0 @@ -uses - Core, - Web; - -file - f602.cpp; - -mainconfig - "" = ""; - diff --git a/uppdev/f602/init b/uppdev/f602/init deleted file mode 100644 index 5829a8814..000000000 --- a/uppdev/f602/init +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef _f602_icpp_init_stub -#define _f602_icpp_init_stub -#include "Core/init" -#include "Web/init" -#endif diff --git a/uppdev/foreach/foreach.cpp b/uppdev/foreach/foreach.cpp deleted file mode 100644 index c6d364f9c..000000000 --- a/uppdev/foreach/foreach.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include - -using namespace Upp; - -#define foreach(v, a) for(int i_ = 0; i_ < a.GetCount(); i_++) \ - for(bool b = true; b;) \ - for(v = a[i_]; b; b = false) - -CONSOLE_APP_MAIN -{ - Vector x; - for(int i = 0; i < 10; i++) - x.Add(i); - foreach(int e, x) - DUMP(e); -} diff --git a/uppdev/foreach/foreach.upp b/uppdev/foreach/foreach.upp deleted file mode 100644 index 7ee383441..000000000 --- a/uppdev/foreach/foreach.upp +++ /dev/null @@ -1,8 +0,0 @@ -uses - Core; - -file - foreach.cpp; - -mainconfig - "" = ""; diff --git a/uppdev/gcc40/gcc40.cpp b/uppdev/gcc40/gcc40.cpp deleted file mode 100644 index fa8a3cbc0..000000000 --- a/uppdev/gcc40/gcc40.cpp +++ /dev/null @@ -1,164 +0,0 @@ -#include - -//#include - -enum { COUNT = 600 }; - -const char *s[COUNT]; - -LONG x[100000]; - -inline void Inc(long& i) -{ - i++; -} - -#define ATOMIC_INCREMENT_32(_ptr) \ - void *p = _ptr; \ - __asm mov ecx, p; \ - __asm mov eax, 1; \ - __asm lock xadd dword ptr [ECX], EAX; \ - - -__declspec(thread) LONG *queue[100]; -__declspec(thread) int queue_i; - -struct Qfast { - LONG *ptr[100]; - int i; - - Qfast() { i = 0; } -}; - -__declspec(thread) Qfast *fq; - - -template -struct SSO { - byte x[N]; -}; - -SSO<16> a[100000]; -SSO<16> b[100000]; - -SSO<32> a32[100000]; -SSO<32> b32[100000]; - -struct SSOF { - dword a, b, c, d; - - void operator=(const SSOF& o) { a = o.a; b = o.b; c = o.c; d = o.d; } -}; - -SSOF af[100000]; -SSOF bf[100000]; - -#define N 500000 - -CONSOLE_APP_MAIN -{ - fq = new Qfast; - { - TimeStop raw_inc; - for(int j = 0; j < 10000; j++) - for(int i = 0; i < 10000; i++) - Inc(x[i]); - RDUMP(raw_inc); - } - for(int i = 0; i < 10000; i += 5) - a[i].x[15] = a32[i].x[31] = 255; - { - TimeStop que; - for(int j = 0; j < N; j++) - for(int i = 0; i < 100; i++) { - if(queue_i >= 100) { - for(int i = 0; i < 100; i++) - ++*queue[i]; - queue_i = 0; - } - queue[queue_i++] = &x[i]; - } - RDUMP(que); - } - { - TimeStop qfast; - for(int j = 0; j < N; j++) - for(int i = 0; i < 100; i++) { - Qfast *q = fq; - if(q->i >= 100) { - LONG **p = q->ptr; - LONG **e = q->ptr + 100; - while(p < e) { - ++*p; - p++; - } - q->i = 0; - } - q->ptr[q->i++] = &x[i]; - } - RDUMP(qfast); - } -// { -// TimeStop _Interlocked; -// for(int j = 0; j < N; j++) -// for(int i = 0; i < 100; i++) -// _InterlockedIncrement(&x[i]); -// RDUMP(_Interlocked); -// } - { - TimeStop Interlocked; - for(int j = 0; j < N; j++) - for(int i = 0; i < 100; i++) - InterlockedIncrement(&x[i]); - RDUMP(Interlocked); - } - { - TimeStop raw_inc; - for(int j = 0; j < N; j++) - for(int i = 0; i < 100; i++) - Inc(x[i]); - RDUMP(raw_inc); - } - { - TimeStop SSO16; - for(int j = 0; j < N; j++) - for(int i = 0; i < 100; i++) - if(b[i].x[15] < 15) - a[i] = b[i]; - RDUMP(SSO16); - } - { - TimeStop SSO32; - for(int j = 0; j < N; j++) - for(int i = 0; i < 100; i++) - if(b32[i].x[31] < 15) - a32[i] = b32[i]; - RDUMP(SSO32); - } - { - TimeStop SSOF; - for(int j = 0; j < N; j++) - for(int i = 0; i < 100; i++) - af[i] = bf[i]; - RDUMP(SSOF); - } - { - TimeStop HEAP; - for(int j = 0; j < N; j++) - for(int i = 0; i < 100; i++) { - byte *b = new byte[i]; - delete b; - } - RDUMP(HEAP); - } -/* { - TimeStop MALLOC; - for(int j = 0; j < N; j++) - for(int i = 0; i < 100; i++) { - void *b = malloc(i); - free(b); - } - RDUMP(MALLOC); - }*/ - delete fq; -} diff --git a/uppdev/gcc40/gcc40.upp b/uppdev/gcc40/gcc40.upp deleted file mode 100644 index 4a2e423eb..000000000 --- a/uppdev/gcc40/gcc40.upp +++ /dev/null @@ -1,11 +0,0 @@ -optimize_speed; - -uses - Core; - -file - gcc40.cpp; - -mainconfig - "" = "", - "" = "MT"; diff --git a/uppdev/gccbug1/gccbug1.cpp b/uppdev/gccbug1/gccbug1.cpp deleted file mode 100644 index 010393cfc..000000000 --- a/uppdev/gccbug1/gccbug1.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include - -struct Base { - int x; - int y; -}; - -struct Derived : Base {}; -/* -struct Foo { - int a; - int b; - - operator Bar() const; -}; - -struct Bar : Foo { -}; - -Foo::operator Bar() const { return *(Bar *)this; } -*/ -void Do(Base& a) -{ - Derived b = *(Derived *)&a; - std::cout << b.x << ", " << b.y << '\n'; -} - -int main(int argc, const char **argv) -{ - Derived f; - f.x = 12345; - f.y = 54321; - Do(f); - - return 0; -} diff --git a/uppdev/gccbug1/gccbug1.upp b/uppdev/gccbug1/gccbug1.upp deleted file mode 100644 index 6443099c7..000000000 --- a/uppdev/gccbug1/gccbug1.upp +++ /dev/null @@ -1,6 +0,0 @@ -file - - "gccbug1.cpp"; - -mainconfig - "" = "CONSOLE ST"; diff --git a/uppdev/glcapture/glcapture.upp b/uppdev/glcapture/glcapture.upp deleted file mode 100644 index d68c71e1d..000000000 --- a/uppdev/glcapture/glcapture.upp +++ /dev/null @@ -1,5 +0,0 @@ -uses - GLCtrl; - -file - main.cpp; diff --git a/uppdev/glcapture/main.cpp b/uppdev/glcapture/main.cpp deleted file mode 100644 index 56895656b..000000000 --- a/uppdev/glcapture/main.cpp +++ /dev/null @@ -1,143 +0,0 @@ -#include -#include -#include -#include -//7#include - -using namespace Upp; - -#define LAYOUTFILE -#include - -class Ball -{ -public: - float x,y,z,r; -}; - -double rand01() { return rand()/(double)(RAND_MAX+1); } -double rand10() { return -10+20*rand01(); } - -//double randn() { return (drand48()+drand48()+drand48())/3.0-0.5; } - - -class MyGLArea : public GLCtrl { -public: - Vector balls; - float x_angle_deg; - float y_angle_deg; - bool mousedown; - Point pprev; - - MyGLArea() { - mousedown=false; - x_angle_deg=0; - y_angle_deg=0; - - int i; - for(i=0;i<200;i++) { - Ball* b = new Ball; - b->x = rand10(); - b->y = rand10(); - b->z = rand10(); - b->r = exp(log(0.5)+rand01()*(log(2)-log(0.5))); - balls.Add(b); - } - - - } - - - virtual void GLPaint() { - StdView(); - - glClearColor(0,0,0,1); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - float s=15; - glOrtho(-s,s, -s,s, -s,s); - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - glRotatef(x_angle_deg,0,1,0); - glRotatef(y_angle_deg,1,0,0); - - #if 0 - glColor3f(1,1,1); - glBegin(GL_QUADS); - glVertex2f(-9,-9); - glVertex2f( 9,-9); - glVertex2f( 9, 9); - glVertex2f(-9, 9); - glEnd(); - #else - - glEnable(GL_LIGHTING); - glEnable(GL_LIGHT0); - glEnable(GL_NORMALIZE); - int i; - for(i=0;ix,b->y,b->z); - glutSolidSphere(b->r, 20,20); - glPopMatrix(); - } - - #endif - - glFlush(); - } - - virtual void LeftDown(Point p, dword keyflags) { - SetCapture(); - pprev = p; - } - - virtual void MouseMove(Point p, dword keyflags) { - if(IsCapture()) { - int dx=p.x-pprev.x; - int dy=p.y-pprev.y; - x_angle_deg += dx; - y_angle_deg += dy; - pprev = p; - this->Refresh(); - } - } - - virtual void LeftUp(Point p, dword keyflags) { - mousedown=false; - } - - virtual bool Key(dword key, int count) { - switch(key) { - case 'a': - ::PromptOK("'a' key was pressed"); - break; - } - } -}; - -class SphereSkin : public WithSphereSkinLayout { -public: - MyGLArea gl_area; - StatusBar status; - - typedef SphereSkin CLASSNAME; - - SphereSkin() { - CtrlLayout(*this, "SphereSkin"); - this->SetFrameRect(50,50, 500,500); - Sizeable().Zoomable(); - Add(gl_area.SizePos()); - AddFrame(status); - } -}; - - -GUI_APP_MAIN -{ - SphereSkin().Run(); -} diff --git a/uppdev/gogo/foo/foo.upp b/uppdev/gogo/foo/foo.upp deleted file mode 100644 index e69de29bb..000000000 diff --git a/uppdev/google_upload/google_upload.cpp b/uppdev/google_upload/google_upload.cpp deleted file mode 100644 index 245c62879..000000000 --- a/uppdev/google_upload/google_upload.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include - -using namespace Upp; - -CONSOLE_APP_MAIN -{ - -} diff --git a/uppdev/google_upload/google_upload.upp b/uppdev/google_upload/google_upload.upp deleted file mode 100644 index 21ad21c3e..000000000 --- a/uppdev/google_upload/google_upload.upp +++ /dev/null @@ -1,11 +0,0 @@ -uses - Core, - Web/SSL; - -file - up.py, - google_upload.cpp; - -mainconfig - "" = ""; - diff --git a/uppdev/google_upload/init b/uppdev/google_upload/init deleted file mode 100644 index b44bd5c57..000000000 --- a/uppdev/google_upload/init +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef _google_upload_icpp_init_stub -#define _google_upload_icpp_init_stub -#include "Core/init" -#include "Web/SSL/init" -#endif diff --git a/uppdev/google_upload/up.py b/uppdev/google_upload/up.py deleted file mode 100644 index dc8925aae..000000000 --- a/uppdev/google_upload/up.py +++ /dev/null @@ -1,192 +0,0 @@ - - -def upload(file, project_name, user_name, password, summary, labels=None): - """Upload a file to a Google Code project's file server. - - Args: - file: The local path to the file. - project_name: The name of your project on Google Code. - user_name: Your Google account name. - password: The googlecode.com password for your account. - Note that this is NOT your global Google Account password! - summary: A small description for the file. - labels: an optional list of label strings with which to tag the file. - - Returns: a tuple: - http_status: 201 if the upload succeeded, something else if an - error occured. - http_reason: The human-readable string associated with http_status - file_url: If the upload succeeded, the URL of the file on Google - Code, None otherwise. - """ - # The login is the user part of user@gmail.com. If the login provided - # is in the full user@domain form, strip it down. - if user_name.endswith('@gmail.com'): - user_name = user_name[:user_name.index('@gmail.com')] - - form_fields = [('summary', summary)] - if labels is not None: - form_fields.extend([('label', l.strip()) for l in labels]) - - content_type, body = encode_upload_request(form_fields, file) - - upload_host = '%s.googlecode.com' % project_name - upload_uri = '/files' - auth_token = base64.b64encode('%s:%s'% (user_name, password)) - headers = { - 'Authorization': 'Basic %s' % auth_token, - 'User-Agent': 'Googlecode.com uploader v0.9.4', - 'Content-Type': content_type, - } - - server = httplib.HTTPSConnection(upload_host) - server.request('POST', upload_uri, body, headers) - resp = server.getresponse() - server.close() - - if resp.status == 201: - location = resp.getheader('Location', None) - else: - location = None - return resp.status, resp.reason, location - - -def encode_upload_request(fields, file_path): - """Encode the given fields and file into a multipart form body. - - fields is a sequence of (name, value) pairs. file is the path of - the file to upload. The file will be uploaded to Google Code with - the same file name. - - Returns: (content_type, body) ready for httplib.HTTP instance - """ - BOUNDARY = '----------Googlecode_boundary_reindeer_flotilla' - CRLF = '\r\n' - - body = [] - - # Add the metadata about the upload first - for key, value in fields: - body.extend( - ['--' + BOUNDARY, - 'Content-Disposition: form-data; name="%s"' % key, - '', - value, - ]) - - # Now add the file itself - file_name = os.path.basename(file_path) - f = open(file_path, 'rb') - file_content = f.read() - f.close() - - body.extend( - ['--' + BOUNDARY, - 'Content-Disposition: form-data; name="filename"; filename="%s"' - % file_name, - # The upload server determines the mime-type, no need to set it. - 'Content-Type: application/octet-stream', - '', - file_content, - ]) - - # Finalize the form body - body.extend(['--' + BOUNDARY + '--', '']) - - return 'multipart/form-data; boundary=%s' % BOUNDARY, CRLF.join(body) - - -def upload_find_auth(file_path, project_name, summary, labels=None, - user_name=None, password=None, tries=3): - """Find credentials and upload a file to a Google Code project's file server. - - file_path, project_name, summary, and labels are passed as-is to upload. - - Args: - file_path: The local path to the file. - project_name: The name of your project on Google Code. - summary: A small description for the file. - labels: an optional list of label strings with which to tag the file. - config_dir: Path to Subversion configuration directory, 'none', or None. - user_name: Your Google account name. - tries: How many attempts to make. - """ - - while tries > 0: - if user_name is None: - # Read username if not specified or loaded from svn config, or on - # subsequent tries. - sys.stdout.write('Please enter your googlecode.com username: ') - sys.stdout.flush() - user_name = sys.stdin.readline().rstrip() - if password is None: - # Read password if not loaded from svn config, or on subsequent tries. - print 'Please enter your googlecode.com password.' - print '** Note that this is NOT your Gmail account password! **' - print 'It is the password you use to access Subversion repositories,' - print 'and can be found here: http://code.google.com/hosting/settings' - password = getpass.getpass() - - status, reason, url = upload(file_path, project_name, user_name, password, - summary, labels) - # Returns 403 Forbidden instead of 401 Unauthorized for bad - # credentials as of 2007-07-17. - if status in [httplib.FORBIDDEN, httplib.UNAUTHORIZED]: - # Rest for another try. - user_name = password = None - tries = tries - 1 - else: - # We're done. - break - - return status, reason, url - - -def main(): - parser = optparse.OptionParser(usage='googlecode-upload.py -s SUMMARY ' - '-p PROJECT [options] FILE') - parser.add_option('-s', '--summary', dest='summary', - help='Short description of the file') - parser.add_option('-p', '--project', dest='project', - help='Google Code project name') - parser.add_option('-u', '--user', dest='user', - help='Your Google Code username') - parser.add_option('-w', '--password', dest='password', - help='Your Google Code password') - parser.add_option('-l', '--labels', dest='labels', - help='An optional list of comma-separated labels to attach ' - 'to the file') - - options, args = parser.parse_args() - - if not options.summary: - parser.error('File summary is missing.') - elif not options.project: - parser.error('Project name is missing.') - elif len(args) < 1: - parser.error('File to upload not provided.') - elif len(args) > 1: - parser.error('Only one file may be specified.') - - file_path = args[0] - - if options.labels: - labels = options.labels.split(',') - else: - labels = None - - status, reason, url = upload_find_auth(file_path, options.project, - options.summary, labels, - options.user, options.password) - if url: - print 'The file was uploaded successfully.' - print 'URL: %s' % url - return 0 - else: - print 'An error occurred. Your file was not uploaded.' - print 'Google Code upload server said: %s (%s)' % (reason, status) - return 1 - - -if __name__ == '__main__': - sys.exit(main()) diff --git a/uppdev/gtkskin/chgtk.cpp b/uppdev/gtkskin/chgtk.cpp deleted file mode 100644 index 35d4db5fd..000000000 --- a/uppdev/gtkskin/chgtk.cpp +++ /dev/null @@ -1,211 +0,0 @@ -#include - -using namespace Upp; - -#define Time XTime -#define Font XFont -#define Display XDisplay -#define Picture XPicture - -#include -#include -#include - -#undef Picture -#undef Time -#undef Font -#undef Display - -enum { - GTK_BOX, - GTK_CHECK, - GTK_OPTION, - GTK_ARROW, - GTK_SLIDER, - GTK_ICON, - GTK_EXT, - GTK_SHADOW, - GTK_FOCUS, - GTK_FLATBOX, - GTK_BGBOX, - GTK_THEMEICON, - - GTK_MARGIN1 = 0x0010, - GTK_MARGIN2 = 0x0020, - GTK_MARGIN3 = 0x0030, - GTK_MARGIN4 = 0x0040, - - GTK_VAL1 = 0x0100, - GTK_VAL2 = 0x0200, - GTK_VAL3 = 0x0300, - GTK_VAL4 = 0x0400, - - GTK_TOP = 0x1000, - GTK_VCENTER = 0x2000, - GTK_BOTTOM = 0x3000, - GTK_LEFT = 0x4000, - GTK_HCENTER = 0x5000, - GTK_RIGHT = 0x6000, - - GTK_DEFLATE1 = 0x10000, - GTK_DEFLATE2 = 0x20000, - GTK_DEFLATE3 = 0x30000, - GTK_DEFLATE4 = 0x40000, - - GTK_RANGEA = 0x100000, - GTK_RANGEB = 0x200000, - GTK_RANGEC = 0x400000, - GTK_RANGED = 0x800000, -}; - -struct G_rect { int x, y, cx, cy; }; -struct G_color { dword _; word r, g, b; }; - -#ifdef CPU_64 -#define GTK__ALLOCATION_OFFSET 64 -#define GTK__COLOR_OFFSET 24 -#else -#define GTK__ALLOCATION_OFFSET 36 -#define GTK__COLOR_OFFSET 12 -#endif - -namespace Upp { -GtkWidget *gtk__parent(); -GtkWidget *Setup(GtkWidget *widget); -void ChGtkNew(GtkWidget *widget, const char *detail, int type); -Value GtkMakeCh(int shadow, int state); -Image GetGTK(GtkWidget *widget, int state, int shadow, const char *detail, int type, int cx, int cy); -int GtkInt(GtkWidget *widget, const char *id); -Color ChGtkColor(int ii, GtkWidget *widget); -Image GtkImage(const char *id, int size, int maxh = INT_MAX); -}; - -struct Test : TopWindow { -// EditIntSpin n; - virtual void Paint(Draw& draw) { - Size sz = GetSize(); - int isz = 16; - draw.DrawRect(GetSize(), SColorFace()); - draw.DrawImage(100, 100, UPP::GtkImage("gtk-ok", 16)); - draw.DrawImage(200, 100, UPP::GtkImage("gtk-yes", 16)); - draw.DrawImage(220, 100, UPP::GtkImage("gtk-yes", 4)); - return; - } - - void DoRefresh() { Refresh(); } - - typedef Test CLASSNAME; - - Test() { - Sizeable(); - } -}; - -GUI_APP_MAIN { - PromptYesNo("This is prompt dialog"); - PromptRetryCancel("This is prompt dialog"); - PromptAbortRetryIgnore("This is prompt dialog"); - PromptOK("This is prompt dialog"); - PromptOKCancel("This is prompt dialog"); - PromptYesNoCancel("This is prompt dialog"); - PromptAbortRetry("This is prompt dialog"); - PromptAbortRetryIgnore("This is prompt dialog"); - -/* - if(GNOME()) { - Exclamation("Warning!"); - GNOME().gnome_triggers_vdo("", "question", NULL); - FileSel fs; - fs.ExecuteOpen(); - } -*/ - PromptYesNo("Yes or no ?"); - Exclamation("Warning!"); - PromptOK("Info..."); - -// DeleteFolderDeep(GetHomeDirFile(".gtkskin")); -// RealizeDirectory(GetHomeDirFile(".gtkskin")); - - char *theme; - g_object_get(gtk_settings_get_default(), "gtk-theme-name", &theme, NULL); - DUMP(theme); - Test().Run(); -} - -/* -// ChPaint(w, 0, 300, 14, 14, ChGet("ScrollBarUp")); - //w.DrawRect(GetSize(), White()); - G_color *c = (G_color *)(24 + (byte *)GTK().gtk_widget_get_style(gtk__parent())); - for(int b = 0; b < 8; b++) - for(int a = 0; a < 5; a++) { -// Image m = GetGTK(gtk__vscrollbar, a, b, "vscrollbar", GTK_BOX|GTK_TOP, 14, 14); - static G_obj *menu = Gtk_menu(); - Image m = GetGTK(menu, a, b, "menu", GTK_BOX, 64, 18); -// Image m = GetGTK(GTK().gtk_notebook_new, a, b, "notebook", GTK_BOX, 64, 24); - - if(b < 5) - switch((int)~n) { - case 0: m = GetGTK(gtk__radiobutton, a, b, "radiobutton", GTK_OPTION|GTK_MARGIN1, isz, isz); break; - case 1: m = GetGTK(GTK().gtk_check_button_new, a, b, "checkbutton", GTK_CHECK|GTK_MARGIN1, isz, isz); break; - case 2: m = GetGTK(GTK().gtk_button_new, a, b, "button", GTK_BOX|GTK_MARGIN1, 64, 24); break; - case 3: m = GetGTK(gtk__defaultbutton, a, b, "button", GTK_BOX|GTK_MARGIN1, 64, 24); break; - case 4: m = GetGTK(gtk__vscrollbar, a, b, "vscrollbar", GTK_BOX|GTK_TOP|GTK_MARGIN1, 14, 14); break; - case 5: m = GetGTK(gtk__vscrollbar, a, b, "vscrollbar", GTK_BOX|GTK_BOTTOM|GTK_MARGIN1, 14, 14); break; - case 6: m = GetGTK(gtk__vscrollbar, a, b, "trough", GTK_BOX, 16, 30); break; - case 7: m = GetGTK(gtk__vscrollbar, a, b, "vscrollbar", GTK_ARROW|GTK_MARGIN1, 14, 14); break; - case 8: m = GetGTK(gtk__vscrollbar, a, b, "vscrollbar", GTK_ARROW|GTK_VAL1|GTK_MARGIN1, 14, 14); break; - case 9: m = GetGTK(gtk__vscrollbar, a, b, "slider", GTK_SLIDER, 16, 30); break; -// case 0: m = GetGTK(gtk__parent(), a, b, "gtk-dialog-info", GTK_ICON, 0, 0); break; - - } - w.DrawRect(a * 80 + 60, b * 40 + 30, 30, 30, Color(c->r >> 8, c->g >> 8, c->b >> 8)); - w.DrawImage(a * 80, b * 40, m); - w.DrawText(a * 80 + 60, b * 40 + 20, Format("%d,%d", b, a)); - c++; -*/ - - -/* -MIST: -GtkInt(w, "inner-border") = 0 -GtkInt(w, "interior-focus") = 1 -GtkInt(w, "focus-line-width") = 1 - - -*/ - -/* -// draw.DrawRect(GetSize(), White()); - { - GtkWidget *tooltip = gtk_window_new(GTK_WINDOW_POPUP); - gtk_widget_realize(tooltip); - GtkStyle* style = gtk_rc_get_style_by_paths(gtk_settings_get_default(), - "gtk-tooltips", "GtkWindow", - GTK_TYPE_WINDOW); - - gtk_style_attach(style, tooltip->window); - - - - static GtkWidget *toolbar; - if(!toolbar) { - GtkWidget *handle = Setup(gtk_handle_box_new()); - toolbar = gtk_toolbar_new(); - gtk_container_add(GTK_CONTAINER(handle), toolbar); - gtk_widget_realize(toolbar); - gtk_widget_show(toolbar); - } - - GtkWidget *w = Setup(gtk_text_view_new()); - // w = Setup(gtk_window_new(GTK_WINDOW_POPUP)); - - for(int x = 0; x < 5; x++) - for(int y = 0; y < 5; y++) { -// draw.DrawText(x * 100, y * 30, AsString(10 * x + y) + "Progam", Arial(0), ChGtkColor(5 * x + y, menu_item)); -// menu_item->state = x; - draw.DrawImage(x * 100, y * 30, -// GetGTK(toolbar, x, y, "toolbar", GTK_BGBOX, 90, 25)); - GetGTK(w, 32, 32, "gnome-fs-home", GTK_THEMEICON, 32, 32)); - } - } -*/ diff --git a/uppdev/gtkskin/gtkskin.upp b/uppdev/gtkskin/gtkskin.upp deleted file mode 100644 index 0d49ec1cb..000000000 --- a/uppdev/gtkskin/gtkskin.upp +++ /dev/null @@ -1,8 +0,0 @@ -uses - CtrlLib; - -file - chgtk.cpp; - -mainconfig - "" = "GUI"; diff --git a/uppdev/guimtbug/guimtbug.upp b/uppdev/guimtbug/guimtbug.upp deleted file mode 100644 index a456850d0..000000000 --- a/uppdev/guimtbug/guimtbug.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - CtrlLib; - -file - main.cpp; - -mainconfig - "" = "GUI MT"; - diff --git a/uppdev/guimtbug/init b/uppdev/guimtbug/init deleted file mode 100644 index 682401cfc..000000000 --- a/uppdev/guimtbug/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _guimtbug_icpp_init_stub -#define _guimtbug_icpp_init_stub -#include "CtrlLib/init" -#endif diff --git a/uppdev/guimtbug/main.cpp b/uppdev/guimtbug/main.cpp deleted file mode 100644 index 248273dd3..000000000 --- a/uppdev/guimtbug/main.cpp +++ /dev/null @@ -1,90 +0,0 @@ -#include - -using namespace Upp; - -class TestThread : public TopWindow -{ - protected: - bool stop; - void buttonCb(void); - Thread thr; - virtual void thrCb(void); - - void Stop(); - - ProgressIndicator progress; - Button button; - StatusBar status; - - public: - typedef TestThread CLASSNAME; - - TestThread(); - -}; - -void TestThread::thrCb(void) -{ - { - GuiLock __; - status.Set("Running, " + FormatInt(thr.GetCount()) + " threads"); - } - for(;;) - { - { - GuiLock __; - if(progress < 100) - progress++; - else - progress = 0; - if(stop) - break; - } - Sleep(1000); - } - { - GuiLock __; - status.Set("Idle...."); - } - PostCallback(THISBACK(Stop)); -} - -void TestThread::Stop() -{ - button.SetLabel("START"); -} - - -void TestThread::buttonCb(void) -{ - if(stop) - { - stop = false; - button.SetLabel("STOP"); - thr.Run(THISBACK(thrCb)); - } - else - stop = true; -} - -TestThread::TestThread() -{ - SetRect(0, 0, 300, 150); - Add(button); - button.TopPos(90, 30).HCenterPos(100); - button.SetLabel("START"); - Add(progress); - progress.TopPos(30, 40).HCenterPos(250); - progress.Set(0, 100); - AddFrame(status); - status.Set(" "); - - stop = true; - button <<= THISBACK(buttonCb); - -} - -GUI_APP_MAIN -{ - TestThread().Run(); -} diff --git a/uppdev/guiplatform.h b/uppdev/guiplatform.h deleted file mode 100644 index a937a1afd..000000000 --- a/uppdev/guiplatform.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifdef flagSKELETON -#define GUIPLATFORM_INCLUDE -#endif - -#ifdef flagWINALT -#define GUIPLATFORM_INCLUDE -#endif - -#ifdef flagWINFB -#define GUIPLATFORM_KEYCODES_INCLUDE -#define GUIPLATFORM_INCLUDE -#define FRAMEBUFFER_INCLUDE -#endif - -#ifdef flagLINUXFB -#define GUIPLATFORM_KEYCODES_INCLUDE -#define GUIPLATFORM_INCLUDE -#define FRAMEBUFFER_INCLUDE -#endif - -#ifdef flagSDLFB -#define GUIPLATFORM_KEYCODES_INCLUDE -//need to make SDL_keysym.h known before K_ enum -#define GUIPLATFORM_INCLUDE -#define FRAMEBUFFER_INCLUDE -#endif - -#ifdef flagWINGL -#define GUIPLATFORM_KEYCODES_INCLUDE -#define GUIPLATFORM_INCLUDE -#endif diff --git a/uppdev/hahaha/hahaha.upp b/uppdev/hahaha/hahaha.upp deleted file mode 100644 index b63fbe3ea..000000000 --- a/uppdev/hahaha/hahaha.upp +++ /dev/null @@ -1,2 +0,0 @@ -file - main.cpp; diff --git a/uppdev/hahaha/init b/uppdev/hahaha/init deleted file mode 100644 index da3c183fa..000000000 --- a/uppdev/hahaha/init +++ /dev/null @@ -1,3 +0,0 @@ -#ifndef _hahaha_icpp_init_stub -#define _hahaha_icpp_init_stub -#endif diff --git a/uppdev/hahaha/main.cpp b/uppdev/hahaha/main.cpp deleted file mode 100644 index 419f0bd2b..000000000 --- a/uppdev/hahaha/main.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include - -void main() -{ - printf("Hello world"); -} \ No newline at end of file diff --git a/uppdev/hash2/hash2.cpp b/uppdev/hash2/hash2.cpp deleted file mode 100644 index bd4962ebc..000000000 --- a/uppdev/hash2/hash2.cpp +++ /dev/null @@ -1,125 +0,0 @@ -#include - -using namespace Upp; - -int q = 0; - -#define N 100 * 1000 * 1000 - -void Benchmark() -{ - { - RTIMING("XOR-folding"); - for(int h = 0; h < N; h++) { - q += 255 & ((h >> 24) ^ (h >> 16) ^ (h >> 8) ^ h); - } - } - { - RTIMING("%"); - for(int i = 0; i < N; i++) { - q += i % 257; - } - } - { - RTIMING("&"); - for(int i = 0; i < N; i++) { - q += i & 255; - } - } -} - -unsigned HashFold(unsigned h) -{ - return (h >> 23) - (h >> 9) - (h >> 15) - h; -} - -template -void TestCollisions(const char *desc, const Index& data) -{ - VectorMap hash1, hash2, hash3; - int m1 = 0, m2 = 0, m3 = 0; - int a = Pow2Bound(data.GetCount()) - 1; - int mod = PrimeBound(data.GetCount()); - for(int i = 0; i < data.GetCount(); i++) { - unsigned h = GetHashValue(data[i]); - m1 = max(m1, ++hash1.GetAdd(h % mod, 0)); - m2 = max(m2, ++hash2.GetAdd(a & HashFold(h), 0)); - } - LOG(desc << ", unique " << data.GetCount()); - LOG("mod unique: " << hash1.GetCount() << ", worst: " << m1 << " (% " << mod << ")"); - LOG("fold unique: " << hash2.GetCount() << ", worst: " << m2 << " (& " << a << ")"); -} - -void TestCollisions(String desc, const char *file) -{ - FileIn in(file); - Index data; - while(!in.IsEof()) - data.FindAdd(in.GetLine()); - TestCollisions(desc + " " + file, data); -} - -CONSOLE_APP_MAIN { - Benchmark(); - int q = 0; - for(int i = 0; i < 100000; i++) - if((HashFold(i) & 31) == 0) { - LOG(i << " - " << i - q); - q = i; - } - TestCollisions("", "e:/bookmarks.html"); - TestCollisions("", "e:/test.txt"); - Index x; - for(int i = 0; i < 1000 * 100; i++) - x.FindAdd(FormatIntBase(i, 2)); - TestCollisions("Bin100", x); - x.Clear(); - for(int i = 0; i < 1000 * 10; i++) - x.FindAdd(FormatIntBase(i, 2)); - TestCollisions("Bin10", x); - x.Clear(); - for(int i = 0; i < 1000 * 100; i++) - x.FindAdd(FormatIntBase(i, 16)); - TestCollisions("Hex100", x); - x.Clear(); - for(int i = 0; i < 1000 * 10; i++) - x.FindAdd(FormatIntBase(i, 16)); - TestCollisions("Hex10", x); - - for(int n = 10; n <= 1000 * 1000; n = 10 * n) { - x.Clear(); - for(int i = 0; i < n; i++) - x.FindAdd(FormatIntBase(i, 10)); - TestCollisions("Dec" + AsString(n), x); - } - x.Clear(); - FileIn in("d:/uppsrc/CtrlLib/ArrayCtrl.cpp"); - for(;;) { - int c = in.Get(); - if(c < 0) break; - if(isalpha(c) || c == '_') { - String id; - id.Cat(c); - c = in.Get(); - while(c >= 0 && (isalnum(c) || c == '_')) { - id.Cat(c); - c = in.Get(); - } - x.FindAdd(id); - } - else - if(isdigit(c)) - do c = in.Get(); - while(c >= 0 && (isalnum(c) || c == '.')); - } - TestCollisions("cpp ids", x); - - Index y; - for(int i = 0; i < 100000; i++) - y.FindAdd(i); - TestCollisions("i100000", y); - y.Clear(); - for(int i = 0; i < 30000; i++) - y.FindAdd(rand()); - TestCollisions("i rand", y); -} diff --git a/uppdev/hash2/hash2.upp b/uppdev/hash2/hash2.upp deleted file mode 100644 index d8e0c8af3..000000000 --- a/uppdev/hash2/hash2.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - Core; - -file - hash2.cpp; - -mainconfig - "" = ""; - diff --git a/uppdev/hash2/init b/uppdev/hash2/init deleted file mode 100644 index 153fbd2a4..000000000 --- a/uppdev/hash2/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _hash2_icpp_init_stub -#define _hash2_icpp_init_stub -#include "Core/init" -#endif diff --git a/uppdev/heapbench/heapbench.cpp b/uppdev/heapbench/heapbench.cpp deleted file mode 100644 index 935db6db5..000000000 --- a/uppdev/heapbench/heapbench.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include - -class A { - A *a; - A *b; - -public: - A(int n) { - if(n) { - a = new A(n - 1); - b = new A(n - 1); - } - else - a = b = NULL; - } - ~A() { - delete a; - delete b; - } -}; - -CONSOLE_APP_MAIN -{ - A *a[256]; - for(int i = 0; i < 256; i++) - a[i] = new A(10); - for (int i = 0; i < 10000; ++i) { - delete a[i & 255]; - a[i & 255] = new A(10); - } - for(int i = 0; i < 256; i++) - delete a[i]; -} diff --git a/uppdev/heapbench/heapbench.upp b/uppdev/heapbench/heapbench.upp deleted file mode 100644 index b0fca0b0c..000000000 --- a/uppdev/heapbench/heapbench.upp +++ /dev/null @@ -1,12 +0,0 @@ -optimize_speed; - -uses - Core; - -file - heapbench.cpp; - -mainconfig - "" = "MT", - "" = "USEMALLOC", - "" = ""; diff --git a/uppdev/hiddisk/hiddisk.h b/uppdev/hiddisk/hiddisk.h deleted file mode 100644 index b4df61a7d..000000000 --- a/uppdev/hiddisk/hiddisk.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef _hiddisk_hiddisk_h -#define _hiddisk_hiddisk_h - -#include - -using namespace Upp; - -#define LAYOUTFILE -#include - - - -class hiddisk : public WithhiddiskLayout { -public: - typedef hiddisk CLASSNAME; - hiddisk(); -private: - void start(); - void stop(); - void setup(); - void uninst(); -}; - -#endif - diff --git a/uppdev/hiddisk/hiddisk.lay b/uppdev/hiddisk/hiddisk.lay deleted file mode 100644 index 694506793..000000000 --- a/uppdev/hiddisk/hiddisk.lay +++ /dev/null @@ -1,7 +0,0 @@ -LAYOUT(hiddiskLayout, 92, 192) - ITEM(Button, btn_start, SetLabel(t_("启动")).LeftPosZ(16, 56).TopPosZ(16, 28)) - ITEM(Button, btn_stop, SetLabel(t_("停止")).LeftPosZ(16, 56).TopPosZ(60, 28)) - ITEM(Button, btn_setup, SetLabel(t_("安装")).LeftPosZ(16, 56).TopPosZ(104, 28)) - ITEM(Button, btn_uninst, SetLabel(t_("卸载")).LeftPosZ(16, 56).TopPosZ(148, 28)) -END_LAYOUT - diff --git a/uppdev/hiddisk/hiddisk.upp b/uppdev/hiddisk/hiddisk.upp deleted file mode 100644 index b4e6f58ee..000000000 --- a/uppdev/hiddisk/hiddisk.upp +++ /dev/null @@ -1,11 +0,0 @@ -uses - CtrlLib; - -file - hiddisk.h, - main.cpp, - hiddisk.lay; - -mainconfig - "" = "GUI"; - diff --git a/uppdev/hiddisk/init b/uppdev/hiddisk/init deleted file mode 100644 index 037683aea..000000000 --- a/uppdev/hiddisk/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _hiddisk_icpp_init_stub -#define _hiddisk_icpp_init_stub -#include "CtrlLib/init" -#endif diff --git a/uppdev/hiddisk/main.cpp b/uppdev/hiddisk/main.cpp deleted file mode 100644 index 0312e6545..000000000 --- a/uppdev/hiddisk/main.cpp +++ /dev/null @@ -1,59 +0,0 @@ -#include "hiddisk.h" -#include - -int PromptYesNo2(const char *msg, const char *title){ - BeepQuestion(); - return Prompt(callback(LaunchWebBrowser), - title, CtrlImg::question(), msg, false, - t_("是(&Y)"), t_("否(&N)"), NULL); -} - -void PromptOK2(const char *msg, const char *title) { - BeepInformation(); - Prompt(title, CtrlImg::information(), msg, t_("OK")); -} - -hiddisk::hiddisk() -{ - CtrlLayout(*this, "隐藏盘管理器"); - this->btn_start <<= THISBACK(start); - this->btn_stop <<= THISBACK(stop); - this->btn_setup <<= THISBACK(setup); - this->btn_uninst <<= THISBACK(uninst); -} - -GUI_APP_MAIN -{ - hiddisk().Run(); -} - -void hiddisk::start(){ - std::system("if exist d:\\recycler\\hiddisk\\nul subst.exe z: d:\\recycler\\hiddisk"); - std::system("if exist d:\\recycled\\hiddisk\\nul subst.exe z: d:\\recycled\\hiddisk"); - std::system("if exist d:\\$RECYCLE.BIN\\hiddisk\\nul subst.exe z: d:\\$RECYCLE.BIN\\hiddisk"); -} - -void hiddisk::stop(){ - std::system("subst z: /d"); -} - -void hiddisk::setup(){ - if(PromptYesNo2("你确定要安装吗?", "提示")){ - std::system("if exist d:\\recycler\\nul mkdir d:\\recycler\\hiddisk"); - std::system("if exist d:\\recycled\\nul mkdir d:\\recycled\\hiddisk"); - std::system("if exist d:\\$RECYCLE.BIN\\nul mkdir d:\\$RECYCLE.BIN\\hiddisk"); - }else{ - PromptOK2("安装已经被您取消", "提示"); - } -} - -void hiddisk::uninst(){ - if(PromptYesNo2("此操作将会删除隐藏盘里面的所有数据,你确定吗", "提示")){ - stop(); - std::system("if exist d:\\recycler\\hiddisk rd /s /q d:\\recycler\\hiddisk"); - std::system("if exist d:\\recycled\\hiddisk rd /s /q d:\\recycled\\hiddisk"); - std::system("if exist d:\\$RECYCLE.BIN\\hiddisk rd /s /q d:\\$RECYCLE.BIN\\hiddisk"); - }else{ - PromptOK2("卸载操作已经被您取消", "提示"); - } -} diff --git a/uppdev/idetest/idetest.upp b/uppdev/idetest/idetest.upp deleted file mode 100644 index 522a8d1fa..000000000 --- a/uppdev/idetest/idetest.upp +++ /dev/null @@ -1,2 +0,0 @@ -file - test.iml; diff --git a/uppdev/idmapBench/bench.txt b/uppdev/idmapBench/bench.txt deleted file mode 100644 index 70c68dab6..000000000 --- a/uppdev/idmapBench/bench.txt +++ /dev/null @@ -1,7 +0,0 @@ -2875 -... -2421 with local buffer -.... ------------------ -2203 StringBuffer -2219 String \ No newline at end of file diff --git a/uppdev/idmapBench/idmapBench.upp b/uppdev/idmapBench/idmapBench.upp deleted file mode 100644 index e658a3d12..000000000 --- a/uppdev/idmapBench/idmapBench.upp +++ /dev/null @@ -1,16 +0,0 @@ -description "C++ standard library vs. U++ Core benchmark"; - -optimize_speed; - -uses - Core; - -file - main.cpp, - bench.txt; - -mainconfig - "" = "", - "" = "USEMALLOC", - "" = "MT", - "" = "USEMALLOC MT"; diff --git a/uppdev/idmapBench/init b/uppdev/idmapBench/init deleted file mode 100644 index 89cc29e03..000000000 --- a/uppdev/idmapBench/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _idmapBench_icpp_init_stub -#define _idmapBench_icpp_init_stub -#include "Core/init" -#endif diff --git a/uppdev/idmapBench/main.cpp b/uppdev/idmapBench/main.cpp deleted file mode 100644 index 7a1e8d36a..000000000 --- a/uppdev/idmapBench/main.cpp +++ /dev/null @@ -1,265 +0,0 @@ -#define NDEBUG -#define _SECURE_SCL 0 - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -//#define TEST_HASHMAP - -#ifdef TEST_HASHMAP - -#ifdef COMPILER_GCC -#include -#else -#include -#endif - -#endif - -using namespace std; -using namespace Upp; - -#ifndef _DEBUG -#define BENCHMARK -#endif - -#ifdef BENCHMARK -#define NO_OUTPUT // for benchmark purposes, output is omitted -#endif - -void BenchNTL(const char *file) { - FileIn in(file); - if (!in) { - std::cout << "Cannot open input file.\n"; - return; - } - - VectorMap > map; - int line = 1; - - for(;;) { - int c = in.Get(); - if(c < 0) break; - if(IsAlpha(c) || c == '_') { - String id; - id.Cat(c); - c = in.Get(); - while(c >= 0 && (IsAlNum(c) || c == '_')) { - id.Cat(c); - c = in.Get(); - } - map.GetAdd(id).Add(line); - } - else - if(IsDigit(c)) - do c = in.Get(); - while(c >= 0 && (IsAlNum(c) || c == '.')); - if(c == '\n') - ++line; - } - -// RTIMING("Sort"); - Vector order = GetSortOrder(map.GetKeys()); -#ifndef NO_OUTPUT - FileOut out("c:\\out1.txt"); - for(int i = 0; i < order.GetCount(); i++) { - out << ~map.GetKey(order[i]) << ": "; - const Vector& l = map[order[i]]; - for(int i = 0; i < l.GetCount(); i++) { - if(i) out << ", "; - out << l[i]; - } - out << '\n'; - } -#endif -} - -void BenchNTL2(const char *file) { - FileIn in(file); - if (!in) { - std::cout << "Cannot open input file.\n"; - return; - } - - VectorMap > map; - String w = LoadFile(file); - CParser p(w); - while(!p.IsEof()) - if(p.IsId()) - map.GetAdd(p.ReadId()).Add(p.GetLine()); - else - p.SkipTerm(); - -// RTIMING("Sort"); - Vector order = GetSortOrder(map.GetKeys()); -#ifndef NO_OUTPUT - FileOut out("c:\\out2.txt"); - for(int i = 0; i < order.GetCount(); i++) { - out << ~map.GetKey(order[i]) << ": "; - const Vector& l = map[order[i]]; - for(int i = 0; i < l.GetCount(); i++) { - if(i) out << ", "; - out << l[i]; - } - out << '\n'; - } -#endif -} - -template -void BenchSTL(Container& imap, const char *file) { - std::ifstream in(file); - if (!in) { - std::cout << "Cannot open input file.\n"; - return; - } - - int line = 1; - - for(;;) { - int c = in.get(); - if(c == EOF) break; - if(isalpha(c) || c == '_') { - string id; - id += c; - c = in.get(); - while(c != EOF && (isalnum(c) || c == '_')) { - id += c; - c = in.get(); - } - imap[id].push_back(line); - } - else - if(isdigit(c)) - do c = in.get(); - while(c != EOF && (isalnum(c) || c == '.')); - if(c == '\n') - ++line; - } -} - -void BenchMap(const char *file) -{ - map< string, vector > imap; - BenchSTL(imap, file); -#ifndef NO_OUTPUT - map< std::string, vector >::const_iterator e = imap.end(); - for(map< std::string, vector >::const_iterator i = imap.begin(); i != e; i++) { - std::cout << i->first << ": "; - vector::const_iterator e = i->second.end(); - vector::const_iterator b = i->second.begin(); - for(vector::const_iterator j = b; j != e; j++) { - if(j != b) std::cout << ", "; - std::cout << *j; - } - std::cout << '\n'; - } -#endif -} - -#ifdef TEST_HASHMAP - -#ifdef COMPILER_GCC -typedef std::tr1::unordered_map< string, vector > HashMap; -#else -typedef stdext::hash_map< string, vector > HashMap; -#endif - -inline bool h_less(const HashMap::value_type *a, const HashMap::value_type *b) -{ - return a->first < b->first; -} - -void BenchHashMap(const char *file) -{ - HashMap imap; - BenchSTL(imap, file); - vector< const HashMap::value_type * > order; - for(HashMap::const_iterator i = imap.begin(); i != imap.end(); i++) - order.push_back(&*i); - sort(order.begin(), order.end(), h_less); - -#ifndef NO_OUTPUT - vector< const HashMap::value_type * >::const_iterator e = order.end(); - for(vector< const HashMap::value_type * >::const_iterator i = order.begin(); i != e; i++) { - std::cout << (*i)->first << ": "; - vector::const_iterator e = (*i)->second.end(); - vector::const_iterator b = (*i)->second.begin(); - for(vector::const_iterator j = b; j != e; j++) { - if(j != b) std::cout << ", "; - std::cout << *j; - } - std::cout << '\n'; - } -#endif -} - -#endif - -#ifdef NO_OUTPUT -#define N 10000 -#else -#define N 1 -#endif - -CONSOLE_APP_MAIN -{ - String fn; - int argc = CommandLine().GetCount(); - const Vector& argv = CommandLine(); - if(argc < 1) - fn = GetDataFile("main.cpp"); - else - fn = argv[0]; - - BenchNTL(fn); // first run to cache the file -/* -#ifdef TEST_HASHMAP - { - BenchHashMap(fn); - TimeStop tm; - for(int n = 0; n < N; n++) - BenchHashMap(fn); - cout << "STL hash_map time: " << tm.Elapsed() << " ms \n"; - } -#endif - - if(0) { - BenchMap(fn); - TimeStop tm; - for(int n = 0; n < N; n++) - BenchMap(fn); - cout << "STL map time: " << tm.Elapsed() << " ms \n"; - } -*/ - { - BenchNTL(fn); - #ifdef BENCHMARK - TimeStop tm; - for(int n = 0; n < N; n++) - BenchNTL(fn); - cout << "NTL time: " << tm.Elapsed() << " ms\n"; - #endif - } - { - BenchNTL2(fn); - #ifdef BENCHMARK - TimeStop tm; - for(int n = 0; n < N; n++) - BenchNTL2(fn); - cout << "NTL2 time: " << tm.Elapsed() << " ms\n"; - #endif - } - #ifndef BENCHMARK - ASSERT(LoadFile("c:\\out1.txt") == LoadFile("c:\\out2.txt")); - #endif -} diff --git a/uppdev/idmapBench/numbers.txt b/uppdev/idmapBench/numbers.txt deleted file mode 100644 index 918431562..000000000 --- a/uppdev/idmapBench/numbers.txt +++ /dev/null @@ -1,11 +0,0 @@ -------------------------- -OldCore: -STL map time: 3500 ms -NTL time: 1968 ms -------------------------- -NewCore: -New heap, new String: -STL map time: 3469 ms -NTL time: 1359 ms - -************************* diff --git a/uppdev/imlibbrowse/imlibbrowse.upp b/uppdev/imlibbrowse/imlibbrowse.upp deleted file mode 100644 index fabf1ca70..000000000 --- a/uppdev/imlibbrowse/imlibbrowse.upp +++ /dev/null @@ -1,58 +0,0 @@ -file - D:\imlib2-1.2.0\src\lib\blend.h, - D:\imlib2-1.2.0\src\lib\color.h, - D:\imlib2-1.2.0\src\lib\color_helpers.h, - D:\imlib2-1.2.0\src\lib\colormod.h, - D:\imlib2-1.2.0\src\lib\common.h, - D:\imlib2-1.2.0\src\lib\context.h, - D:\imlib2-1.2.0\src\lib\draw.h, - D:\imlib2-1.2.0\src\lib\dynamic_filters.h, - D:\imlib2-1.2.0\src\lib\file.h, - D:\imlib2-1.2.0\src\lib\filter.h, - D:\imlib2-1.2.0\src\lib\font.h, - D:\imlib2-1.2.0\src\lib\format.h, - D:\imlib2-1.2.0\src\lib\grab.h, - D:\imlib2-1.2.0\src\lib\grad.h, - D:\imlib2-1.2.0\src\lib\image.h, - D:\imlib2-1.2.0\src\lib\Imlib2.h, - D:\imlib2-1.2.0\src\lib\loaderpath.h, - D:\imlib2-1.2.0\src\lib\rend.h, - D:\imlib2-1.2.0\src\lib\rgba.h, - D:\imlib2-1.2.0\src\lib\rgbadraw.h, - D:\imlib2-1.2.0\src\lib\rotate.h, - D:\imlib2-1.2.0\src\lib\scale.h, - D:\imlib2-1.2.0\src\lib\script.h, - D:\imlib2-1.2.0\src\lib\span.h, - D:\imlib2-1.2.0\src\lib\updates.h, - D:\imlib2-1.2.0\src\lib\ximage.h, - D:\imlib2-1.2.0\src\lib\api.c, - D:\imlib2-1.2.0\src\lib\blend.c, - D:\imlib2-1.2.0\src\lib\color.c, - D:\imlib2-1.2.0\src\lib\color_helpers.c, - D:\imlib2-1.2.0\src\lib\colormod.c, - D:\imlib2-1.2.0\src\lib\context.c, - D:\imlib2-1.2.0\src\lib\draw.c, - D:\imlib2-1.2.0\src\lib\dynamic_filters.c, - D:\imlib2-1.2.0\src\lib\ellipse.c, - D:\imlib2-1.2.0\src\lib\file.c, - D:\imlib2-1.2.0\src\lib\filter.c, - D:\imlib2-1.2.0\src\lib\font_draw.c, - D:\imlib2-1.2.0\src\lib\font_load.c, - D:\imlib2-1.2.0\src\lib\font_main.c, - D:\imlib2-1.2.0\src\lib\font_query.c, - D:\imlib2-1.2.0\src\lib\format.c, - D:\imlib2-1.2.0\src\lib\grab.c, - D:\imlib2-1.2.0\src\lib\grad.c, - D:\imlib2-1.2.0\src\lib\image.c, - D:\imlib2-1.2.0\src\lib\line.c, - D:\imlib2-1.2.0\src\lib\polygon.c, - D:\imlib2-1.2.0\src\lib\rectangle.c, - D:\imlib2-1.2.0\src\lib\rend.c, - D:\imlib2-1.2.0\src\lib\rgba.c, - D:\imlib2-1.2.0\src\lib\rgbadraw.c, - D:\imlib2-1.2.0\src\lib\rotate.c, - D:\imlib2-1.2.0\src\lib\scale.c, - D:\imlib2-1.2.0\src\lib\script.c, - D:\imlib2-1.2.0\src\lib\span.c, - D:\imlib2-1.2.0\src\lib\updates.c, - D:\imlib2-1.2.0\src\lib\ximage.c; diff --git a/uppdev/in64/in64.upp b/uppdev/in64/in64.upp deleted file mode 100644 index 913cd5238..000000000 --- a/uppdev/in64/in64.upp +++ /dev/null @@ -1,8 +0,0 @@ -uses - Core; - -file - main.cpp; - -mainconfig - "" = "CONSOLE ST"; diff --git a/uppdev/in64/main.cpp b/uppdev/in64/main.cpp deleted file mode 100644 index 2ade821a4..000000000 --- a/uppdev/in64/main.cpp +++ /dev/null @@ -1,45 +0,0 @@ -#include - -using namespace Upp; - -CONSOLE_APP_MAIN -{ - uint64 a = Random(100), b = Random(100); - uint64 c = a * b; - uint64 d = b / a; - DUMP(sizeof(int *)); - DUMP(sizeof(int)); - DUMP(sizeof(dword)); - DUMP(sizeof(int64)); - -/* - for(int i = 0; i < 20; i++) - Cout() << (a = a * 13) << '\n'; - - Value x = (int64)500; - Value y = (double)500; - Value z = (int)500; - DUMP((x == y)); - DUMP((y == z)); - DUMP((z == x)); - DUMP((y == x)); - DUMP((y == y)); - DUMP((x == z)); - z = (int)501; - DUMP((x == y)); - DUMP((y == z)); - DUMP((z == x)); - DUMP((y == x)); - DUMP((y == y)); - DUMP((x == z)); - DUMP(((int)x)); - DUMP(((int)y)); - DUMP(((int)z)); - DUMP(((double)x)); - DUMP(((double)y)); - DUMP(((double)z)); - DUMP(((int64)x)); - DUMP(((int64)y)); - DUMP(((int64)z)); -*/ -} diff --git a/uppdev/inline/inline.cpp b/uppdev/inline/inline.cpp deleted file mode 100644 index c8ae1271e..000000000 --- a/uppdev/inline/inline.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include - -#define INTERLOCKED static StaticCriticalSection MK__s; CriticalSection::Lock COMBINE(MK__s, _lock)(MK__s) - -#define INITLOCK \ -static volatile bool init; \ -if(!init) \ - for(CriticalSection::LockMain __; !init; init = true) \ - -CONSOLE_APP_MAIN -{ -for(static volatile bool b; !b;) \ - for(static StaticCriticalSection section; !b;) \ - for(CriticalSection::Lock lock(section); !b; b = true) - LOG("INIT!"); - } -} diff --git a/uppdev/inline/inline.upp b/uppdev/inline/inline.upp deleted file mode 100644 index cb0c61336..000000000 --- a/uppdev/inline/inline.upp +++ /dev/null @@ -1,7 +0,0 @@ -uses Core; - -file - "inline.cpp"; - -mainconfig - "" = "CONSOLE ST"; diff --git a/uppdev/j2/IniReader.cpp b/uppdev/j2/IniReader.cpp deleted file mode 100644 index 358338a2b..000000000 --- a/uppdev/j2/IniReader.cpp +++ /dev/null @@ -1,79 +0,0 @@ -#include "IniReader.h" - -#include -using namespace std; -#include - -CIniReader::CIniReader(char* szFileName) - -{ - - memset(m_szFileName, 0x00, 255); - - memcpy(m_szFileName, szFileName, strlen(szFileName)); - -} - -int CIniReader::ReadInteger(char* szSection, char* szKey, int iDefaultValue) - -{ - - int iResult = GetPrivateProfileInt(szSection, szKey, iDefaultValue, m_szFileName); - - return iResult; - -} - -float CIniReader::ReadFloat(char* szSection, char* szKey, float fltDefaultValue) - -{ - - char szResult[255]; - - char szDefault[255]; - - float fltResult; - - sprintf(szDefault, "%f",fltDefaultValue); - - GetPrivateProfileString(szSection, szKey, szDefault, szResult, 255, m_szFileName); - - fltResult = atof(szResult); - - return fltResult; - -} - -bool CIniReader::ReadBoolean(char* szSection, char* szKey, bool bolDefaultValue) - -{ - - char szResult[255]; - - char szDefault[255]; - - bool bolResult; - - sprintf(szDefault, "%s", bolDefaultValue? "True" : "False"); - - GetPrivateProfileString(szSection, szKey, szDefault, szResult, 255, m_szFileName); - - bolResult = (strcmp(szResult, "True") == 0 || strcmp(szResult, "true") == 0) ? true : false; - - return bolResult; - -} - -char* CIniReader::ReadString(char* szSection, char* szKey, const char* szDefaultValue) - -{ - - char* szResult = new char[255]; - - memset(szResult, 0x00, 255); - - GetPrivateProfileString(szSection, szKey, szDefaultValue, szResult, 255, m_szFileName); - - return szResult; - -} diff --git a/uppdev/j2/IniReader.h b/uppdev/j2/IniReader.h deleted file mode 100644 index 68714ee87..000000000 --- a/uppdev/j2/IniReader.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef INIREADER_H - -#define INIREADER_H -//using namespace std; -class CIniReader - -{ - -public: - - CIniReader(char* szFileName); - - int ReadInteger(char* szSection, char* szKey, int iDefaultValue); - - float ReadFloat(char* szSection, char* szKey, float fltDefaultValue); - - bool ReadBoolean(char* szSection, char* szKey, bool bolDefaultValue); - - char* ReadString(char* szSection, char* szKey, const char* szDefaultValue); - -private: - - char m_szFileName[255]; - -}; - -#endif//INIREADER_H diff --git a/uppdev/j2/chatbot.cpp b/uppdev/j2/chatbot.cpp deleted file mode 100644 index de6a8cab6..000000000 --- a/uppdev/j2/chatbot.cpp +++ /dev/null @@ -1,1691 +0,0 @@ -#include - -#include "windows.h" -#include "ChatBot.h" -//#include -#include -#include "IniReader.h" - -using namespace Upp; - -void ChatBotClass::checksendlog() { - vector::iterator it; - time_t timenow=time(NULL); - for(it = sendlog.begin(); it != sendlog.end(); it++) { - MStruct msg; - msg=*it; - if ((timenow-msg.timestamp)>3) { - printf("resend: (%s)(%i)\n",msg.message.print(),msg.timestamp); - resendcheck=0; - MString k; - k=msg.message.print(); - k+="(R)"; - say(k.print()); - resendcheck=1; - sendlog.erase(it); - return; - } - } -} - -void ChatBotClass::addtosendlog (MString message) { - if (message.beginswith("/")) return; - MStruct msg; - msg.nick=""; - msg.message=message; - msg.timestamp=time(NULL); - sendlog.push_back(msg); -// printf("addtosend (%s)(%i)\n",message.print(),msg.timestamp); -} -void ChatBotClass::delfromsendlog (MString message) { -// printf("delfr:(%s)\n",message.print()); - vector::iterator it; - int counter=0; - message.erase(" "); - message.erase("_"); - message.erase("*"); -// printf("chx:[(%s)]\n",message.print()); - for(it = sendlog.begin(); it != sendlog.end(); it++) { - MStruct msg; - msg=*it; - MString k; - k=msg.message.print(); - k.erase("‏"); - k.erase("‎"); - k.erase("⇒"); -// k.erase("⇑"); -// k.erase("⇓"); - k.replace(""","\""); - k.replace("ß",""); - k.replace("<","<"); - k.replace(">",">"); - - k.replace("","e"); - k.replace("","a"); - k.replace("","i"); - k.replace("","o"); - k.replace("","u"); - k.replace("ä",""); - k.replace("ü",""); - k.replace("ö",""); - k.replace("Ä",""); //wg. umlaute werden mit lowercase ncht in klein buchstaben verwandelt - k.replace("Ü",""); - k.replace("Ö",""); - - k.erase("+"); - k.erase(" "); - k.erase("_"); - k.erase("*"); -// printf("chs:[(%s)]\n",k.print()); - if (k==message) { -// printf("delfromsendlog: (%s)(%i)\n",message.print(),msg.timestamp); - sendlog.erase(it); - return; - } - } -} - -void ChatBotClass::addtomessagelog(MString sender, MString message) { - MStruct msg; - msg.nick=sender; - msg.message=message; - msg.timestamp=time(NULL); - messagelog.push_back(msg); - - MString zielnick; - MString zielstring; - int zc=1;int sc=1; - int firsttimestamp;int lasttimestamp;int lasttimestamp2; - vector::iterator it; - int counter=0; - for(it = messagelog.begin(); it != messagelog.end(); it++) { - MStruct o; - o=*it; - if (counter==0) {zielnick=o.nick;zielstring=o.message;firsttimestamp=o.timestamp;} - if (counter!=0) if (o.nick==zielnick) {zc++;lasttimestamp=o.timestamp;} - if (counter!=0) if (o.nick==zielnick&&o.message==zielstring) {sc++;lasttimestamp2=o.timestamp;} -// printf("%s %i\n",o.nick.print(),o.timestamp); - counter++; - } - if (zc>3) if ((lasttimestamp-firsttimestamp)<2) {addtosperrlist(zielnick);messagelog.clear();} - if (sc>3) if ((lasttimestamp2-firsttimestamp)<7) {addtosperrlist(zielnick);messagelog.clear();} - if (messagelog.size()>4) messagelog.erase(messagelog.begin()); -} - -bool ChatBotClass::onsperrliste(MString nick) { - vector::iterator it; - for(it = sperrnicks.begin(); it != sperrnicks.end(); it++) { - MString o; - o=*it; -// printf("%s %s\n",nick.print(),o.print()); - if (o==nick) return(1); - } - return(0); -} - -void ChatBotClass::addtosperrlist(MString nick) { - if (nick!="Wenlok") { - FILE *fd; - if (NULL == (fd = fopen (".\\sperrliste.ini", "a+"))) printf("error: can't open file sperrliste.ini\n"); - fprintf (fd, "%s\n",nick.print()); - fclose(fd); - sperrnicks.push_back(nick); - cout<::iterator it; - for(it = sperrnicks.begin(); it != sperrnicks.end(); it++) { - MString o; - o=*it; -// cout<pixels + (xoff+x)*3 + y*surface->pitch); - g = *((unsigned char*)surface->pixels + (xoff+x)*3 + y*surface->pitch + 1); - b = *((unsigned char*)surface->pixels + (xoff+x)*3 + y*surface->pitch + 2); - bool first = ret&0x40000000; - ret<<=1; - ret |= first; - ret^=(r < 128 && g < 128 && b < 128)?1:0; - if (r < 128 && g < 128 && b < 128) printf("x"); else printf("."); - } - printf("\n"); - } - return ret; -} -*/ -int ChatBotClass::LadeDatei(char *datei,char *speichername) { - printf("Lade Datei: %s\n",datei); - - SOCKET passSocket; - WORD sockVersion; - WSADATA wsaData; - int nret; - sockVersion = MAKEWORD(1, 1); - WSAStartup(sockVersion, &wsaData); - LPHOSTENT hostEntry; -// hostEntry = gethostbyname("chatcity.de"); // Specifying the server by its name; - if (!anonymize) hostEntry = gethostbyname("213.203.200.84"); - else hostEntry = gethostbyname("http://www.waythru.com/index.php?q=213.203.200.84"); - - // another option is gethostbyaddr() - if (!hostEntry) { - nret = WSAGetLastError(); - ReportError(nret, "gethostbyname()"); // Report the error as before - WSACleanup(); - return NETWORK_ERROR; - } - passSocket = socket(AF_INET, // Go over TCP/IP - SOCK_STREAM, // This is a stream-oriented socket - IPPROTO_TCP); // Use TCP rather than UDP - if (passSocket == INVALID_SOCKET) { - nret = WSAGetLastError(); - ReportError(nret, "socket()"); - WSACleanup(); - return NETWORK_ERROR; - } - - SOCKADDR_IN serverInfo; - serverInfo.sin_family = AF_INET; - serverInfo.sin_addr = *((LPIN_ADDR)*hostEntry->h_addr_list); // See the explanation in the tutorial - serverInfo.sin_port = htons(80); // Change to network-byte order and - nret = connect(passSocket, - (LPSOCKADDR)&serverInfo, - sizeof(struct sockaddr)); - if (nret == SOCKET_ERROR) { - nret = WSAGetLastError(); - ReportError(nret, "connect()"); - WSACleanup(); - return NETWORK_ERROR; - } - // Send/receive, then cleanup: - - char s[2000]; - strcpy(s,"GET /securitycode/index.php?0.42204000+1194905347 HTTP/1.1\r\n"); - strcat(s,"User-Agent: Opera/9.10 (Windows NT 5.1; U; en)\r\n"); - strcat(s,"Host: chats.kunden.abacho.net\r\n"); - strcat(s,"Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\n"); - strcat(s,"Accept-Language: de-DE,de;q=0.9,en;q=0.8\r\n"); - strcat(s,"Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\n"); - strcat(s,"Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0\r\n"); - strcat(s,"Referer: http://home.chatcity.de/registrierung/\r\n"); - strcat(s,"Connection: Keep-Alive, TE\r\n"); - strcat(s,"TE: deflate, gzip, chunked, identity, trailers\r\n"); - strcat(s,"\r\n"); - int nReadAmount=send(passSocket,s,strlen(s),0); - - - FILE *fd2; - fd2 = fopen (speichername, "w"); - - MString x; - char pBuffer[1024]; - - int y; -/* y=recv(passSocket,pBuffer,1024,0) { - fprintf (fd2,pBuffer); - printf("[%i][]\n",y); - Sleep(100); -// x+=pBuffer; -} -*/ -/* - int v=1; - while(v!=15) { - for (int i=0;i<6048;i++) pBuffer[i]=0; - recv(passSocket,pBuffer,1024,0); - x+=pBuffer; - v++; - printf("%s\n",x.print()); - printf("%i, %i\n",v,x.strlength()); - } - */ -/* - FILE *fd2; - fd2 = fopen (speichername, "w"); - fprintf (fd2,x.print()); - */ - fclose(fd2); - - closesocket(passSocket); -} - /* -ChatBotClass::ChatBotClass() -{ - autokicknicksonsperrlist=0; - autoaddtosperrlistonspaming=0; - anonymize=0; - leseeigenenschrieb=1; - beepmyname=1; - rawtext=0; - floodpref1=""; - floodpref2=""; - seconds1=time(NULL); - readsperrliste(); - readschlussel(); - resendcheck=1; -} -*/ - -void ChatBotClass::Write2Log(char *name,char *text) { - time_t rawtime; - time ( &rawtime ); - - FILE *fd2; - fd2 = fopen (name, "a+"); -// fprintf (fd2,ctime (&rawtime)); - fprintf (fd2,text); - fprintf (fd2,"\n"); - fclose(fd2); -} - -/* -ChatBotClass::~ChatBotClass() -{ -} -*/ - -void ChatBotClass::webpage() { - if (errorcode) return; - char *name; - FILE *fd2; - MString p; - name=(char*)malloc(255); - sprintf(name,"channel.htm"); - if (NULL == (fd2 = fopen (name, "w"))) - { - printf ("Can't open it ejecting!\n"); - } - else - { - printf ("file erzeugt\n"); - } - - fprintf (fd2, "\n %i\n",Nicknum); - fprintf (fd2, ""); - printf("ok\n"); - for (int i=0;i"); - else - fprintf (fd2, ""); - fprintf (fd2,"\n",Nicks[i].print(),Nicks[i].print()); - } - fprintf (fd2, "
name: %s
"); - fprintf (fd2, "\n"); - fclose (fd2); - - printf ("lade hoch\n"); -/* - netbuf *nControl; - FtpInit (); - FtpConnect ("web7.webmailer.de", &nControl); - FtpLogin ("www.ph2.net", "abulafia", nControl); -// FtpChdir("Fragen", nControl); - FtpPut (name, name, FTPLIB_ASCII, nControl); - FtpQuit (nControl); - printf ("hochgeladen\n"); - */ -} - - -int ChatBotClass::login(const char *name, char *pwd, char *chan) { - Write2Log("connectionlog.txt","Login\n"); - isinsep=0; - peopleinsep=0; - seconds1=time(NULL); - aktivechannel=chan; - UserName=name; - Passwort=pwd; - GetIDandSID(); - GetChatOut(); -} - -int ChatBotClass::login() { - peopleinsep=0; - isinsep=0; - GetIDandSID(); - GetChatOut(); -} - -void ChatBotClass::Exit() { - WSACleanup(); -} - -void ChatBotClass::ReportError(int errorCodex, const char *whichFunc) { - Write2Log("connectionlog.txt","Error:\n"); - sendlog.clear(); - printf("sendlog cleared\n"); - char errorMsg[92]; - ZeroMemory(errorMsg, 92); // automatically NULL-terminate the string - sprintf(errorMsg, "SOCKETERROR: Call to %s returned error %d!", (char *)whichFunc, errorCodex); - Write2Log("connectionlog.txt",errorMsg); - ErrorMsg=errorMsg; - errorcode=errorCodex; -} - -void ChatBotClass::readHTMLout(void (*pfi)(MString Text)) { - if (errorcode) return; - char pBuffer[6048]; - MString Sender[40]; - MString message[40]; - MString col[40]; - int flag[40]; - MString packet; - for (int i=0;i<6048;i++) pBuffer[i]=0; - int len=recv(sendHTMLSocket,pBuffer,6048,0); - for (int i=0;((pBuffer!=""));i++) packet.concat(pBuffer[i]); -} - -struct list_entry { - int sock; - struct list_entry *next; -}; - -struct list_type { - struct list_entry *data; - unsigned count; -}; - - -void ChatBotClass::readchatline2(void (*pfi)(int fl, String col, String Sender, String Message)) { -printf("inreadchat\n"); - -printf("inreadchat\n"); - if (errorcode) return; - printf("inreadchat\n"); - char pBuffer[8000]; - String Sender[40]; - String message[40]; - String col[40]; - int flag[40]; - MString packet; - - for (int i=0;i<40;i++) { - col[i]="000000"; - } - - for (int i=0;i<8000;i++) pBuffer[i]=0; - - unsigned long a[1]; - a[1]=1; - int e = ioctlsocket(sendSocket, FIONBIO, a); - if (e == -1) { - errorcode=1; - printf("ioctlsocket failed\n"); - } - -int len = recv(sendSocket,pBuffer,8000,0); -if (len<0) {checksendlog();return;} - if (len==0) { - errorcode=1; - printf("len=0\n"); - ReportError(999, "Zerolengthreturn"); - } - - for (int i=0;((pBuffer[i]!=(int)0));i++) packet.concat(pBuffer[i]); - printf("RAW[%s]\n",packet.print()); - int mc=0; - -if (packet.includes("Du bist eine gewisse Zeit des Chats verwiesen worden!
")) { - errorcode=1;ReportError(1000, "Du bist eine gewisse Zeit des Chats verwiesen worden"); - } - - packet.erase(""); - packet.erase(""); - packet.erase(""); - packet.erase(""); - packet.erase(""); - packet.erase(""); - packet.erase(""); - - packet.preconcat("
"); - if (rawtext) { col[0]="000000";flag[0]=0;message[0]=packet.print();Sender[0]="RAW"; mc+=1;} - - if ((!packet.includes("***newpage***"))) { - packet.replace("","e"); - packet.replace("","a"); - packet.replace("","i"); - packet.replace("","o"); - packet.replace("","u"); - packet.replace("ä",""); - packet.replace("ü",""); - packet.replace("ö",""); - packet.replace("Ä",""); //wg. umlaute werden mit lowercase ncht in klein buchstaben verwandelt - packet.replace("Ü",""); - packet.replace("Ö",""); - packet.erase(" "); - packet.replace("
",""); - packet.replace("
\n
  • ","
  • "); - for (int i=0;i<40;i++) flag[i]=0; - int x=1; - MString ppacket; - do { - x++; - ppacket=packet.getbedfirst("
    ","
    "); - if (ppacket.found) goto ok; - ppacket=packet.getbedfirst("
    ","
    "); - if (ppacket.found) goto ok; - ppacket=packet.getbedfirst("
    ","
    "); - if (ppacket.found) goto ok; - ppacket=packet.getbedfirst("
    ","
    "); - if (ppacket.found) goto ok; - goto ok2; - ok: - - packet.erase(0,4); - packet.erase(ppacket.print()); - ppacket.concat("
    "); - //Normaler Chatschrieb - printf("%s\n",ppacket.print()); - - if (ppacket.includes("")) { - MString k; - k=ppacket.getbedfirst(""); - col[mc]=k.print(); - k=ppacket.getbedfirst("",":"); - Sender[mc]=k.print(); - k=ppacket.getbedfirst("
    : ","
    "); - message[mc]=k.print(); - mc++; - } - - //Du flsterst zu ... - if (ppacket.includes("")) { - MString k; - col[mc]="000000"; - k=ppacket.getbedfirst("",":"); - Sender[mc]=k.print(); - k="Du fluesterst zu "; - k+=Sender[mc]; - k+=":"; - k+=ppacket.getbedfirst("
    : ","
    "); - message[mc]=k.print(); - Sender[mc]="---"; - flag[mc]=4; - mc++; - } - //... flstert ... - if (ppacket.includes("")) { - MString k; - col[mc]="000000"; - k=ppacket.getbedfirst("","
    "); - Sender[mc]=k.print(); - k=ppacket.getbedfirst(" ","
    "); - message[mc]=k.print(); - flag[mc]=3; - mc++; - } - - //me - if (ppacket.includes("")) { - MString k; - col[mc]="000000"; - k=ppacket.getbedfirst("","
    "); - message[mc]=k.print(); - Sender[mc]="..."; - flag[mc]=4; - mc++; - } - - printf("xx1\n"); - - //Bob Nachrichten, gemischtes - if (ppacket.includes("")) { - MString k; - k=ppacket.getbedfirst("MrBob: ","
    "); - - - if (k.includes("Du gehst in das Separee")) { - sepname=k.getbedfirst("Du gehst in das Separee ",""); - k.erase(""); - if (isinsep) ChatterSepList.abmelden(k); - } - if (k.includes("ist wieder da.")) { - MString k;k=message[mc];k.erase(" ist wieder da."); - k.erase(""); - if (isinsep) ChatterSepList.anmelden(k); - } - if (k.includes("ist im Augenblick abgemeldet")) { - MString k;k=message[mc];k.erase(" ist im Augenblick abgemeldet"); - if (isinsep) ChatterSepList.abmelden(k); - } - if (k.includes("betritt das Separee")) { - if (autokicknicksonsperrlist) { - MString k;k=message[mc];k.erase(" betritt das Separee"); - if (onsperrliste(k)) {MString x;x="/sepkick ";x+=k;say(x.print());message[mc]="Nick on Sperrlist joined";} - peopleinsep++; - ChatterSepList.AddChatter(k); - } else { - MString k;k=message[mc];k.erase(" betritt das Separee"); - ChatterSepList.AddChatter(k); - peopleinsep++; - } - } - if (k.includes("Schwupp und raus aus dem Separee")) { - isinsep=0; - peopleinsep=0; - ChatterSepList.clearall(); - } - k.erase(""); - k.erase(""); - k.erase(""); - k.erase(""); - k.erase(""); - - message[mc]=k.print(); - Sender[mc]="Wenlok"; - flag[mc]=1; - mc++; - - } - printf("xx1\n"); - //Userlist anzeigen - - if (ppacket.includes("")) { - MString k; - k=ppacket.getbedfirst("",""); - k+=":\n"; - k+=ppacket.getbedfirst("","
    "); - k.replace("",""); - k.replace("",""); - k.replace("
  • ","\n"); - // message[mc].replace("offen...","offen...\n"); - Sender[mc]="Wenlok"; - Nicks[0]=k.getbedfirst("[","]"); - Nicknum=1; - do { - Nicks[Nicknum]=k.getbednext("[","]"); - Nicknum++; - } while ((Nicks[Nicknum-1]!="")&&Nicknum<200); - message[mc]=k.print(); - Nicknum--; - mc++; - //webpage(); - } - - } while (x<50); - printf("xx2\n"); - ok2: - printf("HI"); - - for (int o=0;o","_"); - message[o].replace("","_"); - message[o].replace("","_"); - message[o].replace("","_"); - message[o].replace("","*"); - message[o].replace("","*"); - message[o].replace(""","\""); - message[o].replace("ß",""); - message[o].replace("<","<"); - message[o].replace(">",">"); - message[o].erase("⇒"); - message[o].erase("⇐"); - message[o].erase("‎"); - message[o].erase("‏"); - - - if (message[o].beginswith("!who")) { - ChatterSepList.printchatter(); - } - if (message[o].beginswith("!botdata")) { - MString p; - p="conf:: "; - p+="isinsep:"; - if (isinsep) {p+="1";p+=" sepname:";p+=sepname;} else p+="0"; - if (isinsep) {p+=" peopleinsep:";p+=peopleinsep;} - p+=" channel:"; - p+=aktivechannel; - p+=" isonline:"; - if (isonline()) p+="1"; else p+="0"; - p+=" name:"; - p+=UserName; - p+=" autoaddtosperrlistonspaming:"; - p+=autoaddtosperrlistonspaming; - p+=" autokicknicksonsperrlist:"; - p+=autokicknicksonsperrlist; - say(p.print()); - } -*/ - if (message[o]=="!autoaddtosperrlistonspaming") autoaddtosperrlistonspaming=!autoaddtosperrlistonspaming; - if (message[o]=="!autokicknicksonsperrlist") autokicknicksonsperrlist=!autokicknicksonsperrlist; -/* - if (message[o].includes("automatisch") and Sender[o].includes("Wenlok") ){ - say("/alive"); - } else { - - if (beepmyname) if ( - (message[o].includes(UserName))&& - ((!Sender[o].includes("Wenlok"))&&(!Sender[o].includes("RAW"))) - ) Beep(500,100); - - //if ((Sender[o]==UserName)) delfromsendlog(message[o]); - */ - - -// if (!onsperrliste(Sender[o])) { -// if (autoaddtosperrlistonspaming) if ((Sender[o]!=UserName)) addtomessagelog(Sender[o],message[o]); -// printf("GOT[%i|%s|%s|%s]\n",flag[o],col[o].print(),Sender[o].print(),message[o].print()); - if (!leseeigenenschrieb) { if ((Sender[o]!=UserName)) pfi(flag[o],col[o],Sender[o],message[o]);} - else pfi(flag[o],col[o],Sender[o],message[o]); -// } - - //pfi(flag[o],col[o],Sender[o],message[o]); - - - } - - } - // checksendlog(); - - -} - -void ChatBotClass::readchatline(void (*pfi)(int fl, MString col, MString Sender, MString Message)) { -printf("inreadchat\n"); - -printf("inreadchat\n"); - if (errorcode) return; - printf("inreadchat\n"); - char pBuffer[8000]; - MString Sender[40]; - MString message[40]; - MString col[40]; - int flag[40]; - MString packet; - - for (int i=0;i<8000;i++) pBuffer[i]=0; - - unsigned long a[1]; - a[1]=1; - int e = ioctlsocket(sendSocket, FIONBIO, a); - if (e == -1) { - errorcode=1; - printf("ioctlsocket failed\n"); - } - -int len = recv(sendSocket,pBuffer,8000,0); -if (len<0) {checksendlog();return;} - if (len==0) { - errorcode=1; - printf("len=0\n"); - ReportError(999, "Zerolengthreturn"); - } - - for (int i=0;((pBuffer[i]!=(int)0));i++) packet.concat(pBuffer[i]); - printf("RAW[%s]\n",packet.print()); - int mc=0; - - if (packet.includes("Du bist eine gewisse Zeit des Chats verwiesen worden!")) { - errorcode=1;ReportError(1000, "Du bist eine gewisse Zeit des Chats verwiesen worden"); - } - - packet.erase(""); - packet.erase(""); - packet.erase(""); - packet.erase(""); - packet.erase(""); - packet.erase(""); - packet.erase(""); - -// for (int i=0;i"); - if (rawtext) { col[0]="000000";flag[0]=0;message[0]=packet;Sender[0]="RAW"; mc+=1; - } - - if ((!packet.includes("***newpage***"))) { - packet.replace("","e"); - packet.replace("","a"); - packet.replace("","i"); - packet.replace("","o"); - packet.replace("","u"); - packet.replace("ä",""); - packet.replace("ü",""); - packet.replace("ö",""); - packet.replace("Ä",""); //wg. umlaute werden mit lowercase ncht in klein buchstaben verwandelt - packet.replace("Ü",""); - packet.replace("Ö",""); - packet.erase(" "); - packet.replace("
    ",""); - packet.replace("
    \n
  • ","
  • "); - - for (int i=0;i<40;i++) flag[i]=0; - - - int x=1; - MString ppacket; - - /* - do { - x++; - ppacket=packet.getbedfirst("
    ","
    "); - if (ppacket.found) goto ok; - ppacket=packet.getbedfirst("
    ","
    "); - if (ppacket.found) goto ok; - ppacket=packet.getbedfirst("
    ","
    "); - if (ppacket.found) goto ok; - ppacket=packet.getbedfirst("
    ","
    "); - if (ppacket.found) goto ok; - goto ok2; - ok: - packet.erase(0,4); - packet.erase(ppacket.print()); - ppacket.concat("
    "); - //Normaler Chatschrieb - - if (ppacket.includes("")) { -// printf("habs %s\n",packet.print()); - col[mc]=ppacket.getbedfirst(""); - Sender[mc]=ppacket.getbedfirst("",":"); - message[mc]=ppacket.getbedfirst("
    : ","
    "); - mc++; - } - //Du flsterst zu ... - if (ppacket.includes("")) { - col[mc]="000000"; - Sender[mc]=ppacket.getbedfirst("",":"); - message[mc]="Du flsterst zu "; - message[mc]+=Sender[mc].print(); - message[mc]+=":"; - message[mc]+=ppacket.getbedfirst(": ","
    "); - Sender[mc]="---"; - flag[mc]=4; - mc++; - } - //... flstert ... - if (ppacket.includes("")) { - Sender[mc]=ppacket.getbedfirst("","
    "); - message[mc]=ppacket.getbedfirst(" ","
    "); - flag[mc]=3; - mc++; - } - //me - if (ppacket.includes("")) { - message[mc]=ppacket.getbedfirst("","
    "); - Sender[mc]="..."; - flag[mc]=4; - mc++; - } - //Bob Nachrichten, gemischtes - if (ppacket.includes("")) { - message[mc]=ppacket.getbedfirst("MrBob: ","
    "); - if (message[mc].includes("Du gehst in das Separee")) { - sepname=message[mc].getbedfirst("Du gehst in das Separee ",""); - k.erase(""); - if (isinsep) ChatterSepList.abmelden(k); - } - if (message[mc].includes("ist wieder da.")) { - MString k;k=message[mc];k.erase(" ist wieder da."); - k.erase(""); - if (isinsep) ChatterSepList.anmelden(k); - } - - if (message[mc].includes("ist im Augenblick abgemeldet")) { - MString k;k=message[mc];k.erase(" ist im Augenblick abgemeldet"); - if (isinsep) ChatterSepList.abmelden(k); - } - if (message[mc].includes("betritt das Separee")) { - if (autokicknicksonsperrlist) { - MString k;k=message[mc];k.erase(" betritt das Separee"); - if (onsperrliste(k)) {MString x;x="/sepkick ";x+=k;say(x.print());message[mc]="Nick on Sperrlist joined";} - peopleinsep++; - ChatterSepList.AddChatter(k); - } else { - MString k;k=message[mc];k.erase(" betritt das Separee"); - ChatterSepList.AddChatter(k); - peopleinsep++; - } - } - if (message[mc].includes("Schwupp und raus aus dem Separee")) { - isinsep=0; - peopleinsep=0; - ChatterSepList.clearall(); - } - message[mc].erase(""); - message[mc].erase(""); - message[mc].erase(""); - message[mc].erase(""); - message[mc].erase(""); - Sender[mc]="Wenlok"; - flag[mc]=1; - mc++; - } - //Userlist anzeigen - if (ppacket.includes("")) { - message[mc]=ppacket.getbedfirst("",""); - message[mc]+=":\n"; - message[mc]+=ppacket.getbedfirst("","
    "); - message[mc].replace("",""); - message[mc].replace("",""); - message[mc].replace("
  • ","\n"); -// message[mc].replace("offen...","offen...\n"); - Sender[mc]="Wenlok"; - Nicks[0]=message[mc].getbedfirst("[","]"); - Nicknum=1; - do { - Nicks[Nicknum]=message[mc].getbednext("[","]"); - Nicknum++; - } while ((Nicks[Nicknum-1]!="")&&Nicknum<200); - Nicknum--; - mc++; - webpage(); - } - } while (x<50); - - if (x>20) Write2Log("debuglog.txt","x>20 in function readchatline\n"); - */ - ok2: - for (int o=0;o","_"); - message[o].replace("","_"); - message[o].replace("","_"); - message[o].replace("","_"); - message[o].replace("","*"); - message[o].replace("","*"); - message[o].replace(""","\""); - message[o].replace("ß",""); - message[o].replace("<","<"); - message[o].replace(">",">"); - message[o].erase("⇒"); - message[o].erase("⇐"); - message[o].erase("‎"); - message[o].erase("‏"); - - - if (message[o].beginswith("!who")) { - ChatterSepList.printchatter(); - } - if (message[o].beginswith("!botdata")) { - MString p; - p="conf:: "; - p+="isinsep:"; - if (isinsep) {p+="1";p+=" sepname:";p+=sepname;} else p+="0"; - if (isinsep) {p+=" peopleinsep:";p+=peopleinsep;} - p+=" channel:"; - p+=aktivechannel; - p+=" isonline:"; - if (isonline()) p+="1"; else p+="0"; - p+=" name:"; - p+=UserName; - p+=" autoaddtosperrlistonspaming:"; - p+=autoaddtosperrlistonspaming; - p+=" autokicknicksonsperrlist:"; - p+=autokicknicksonsperrlist; - say(p.print()); - } - - if (message[o]=="!autoaddtosperrlistonspaming") autoaddtosperrlistonspaming=!autoaddtosperrlistonspaming; - if (message[o]=="!autokicknicksonsperrlist") autokicknicksonsperrlist=!autokicknicksonsperrlist; - - if (message[o].includes("automatisch") && Sender[o].includes("Wenlok") ){ - say("/alive"); - } else { - - if (beepmyname) if ( - (message[o].includes(UserName))&& - ((!Sender[o].includes("Wenlok"))&&(!Sender[o].includes("RAW"))) - ) Beep(500,100); - - //if ((Sender[o]==UserName)) delfromsendlog(message[o]); - /* - if (!onsperrliste(Sender[o])) { - if (autoaddtosperrlistonspaming) if ((Sender[o]!=UserName)) addtomessagelog(Sender[o],message[o]); - printf("GOT[%i|%s|%s|%s]\n",flag[o],col[o].print(),Sender[o].print(),message[o].print()); - if (!leseeigenenschrieb) { if ((Sender[o]!=UserName)) pfi(flag[o],col[o],Sender[o],message[o]);} - else pfi(flag[o],col[o],Sender[o],message[o]); - } - */ - } - - } - - } - // checksendlog(); - -} - - - - -int ChatBotClass::GetChatOut() { - if(errorcode) return(1); - WORD sockVersion; - WSADATA wsaData; - int nret; - sockVersion = MAKEWORD(1, 1); - WSAStartup(sockVersion, &wsaData); - LPHOSTENT hostEntry; - printf("gettin chatout\n"); - if (!anonymize) hostEntry = gethostbyname("213.203.200.72"); - else hostEntry = gethostbyname("http://www.waythru.com/index.php?q=http://213.203.200.72"); -printf("endgetcahtout\n"); - if (!hostEntry) { - nret = WSAGetLastError(); - ReportError(nret, "gethostbyname()"); // Report the error as before - printf("ERROR\n"); - WSACleanup(); - return NETWORK_ERROR; - } - sendSocket = socket(AF_INET, // Go over TCP/IP - SOCK_STREAM, // This is a stream-oriented socket - IPPROTO_TCP); // Use TCP rather than UDP - - if (sendSocket == INVALID_SOCKET) { - nret = WSAGetLastError(); - ReportError(nret, "socket()"); - WSACleanup(); - return NETWORK_ERROR; - } -printf("endgetcahtout\n"); - SOCKADDR_IN serverInfo; - serverInfo.sin_family = AF_INET; - serverInfo.sin_addr = *((LPIN_ADDR)*hostEntry->h_addr_list); // See the explanation in the tutorial - serverInfo.sin_port = htons(80); // Change to network-byte order and - nret = connect(sendSocket, - (LPSOCKADDR)&serverInfo, - sizeof(struct sockaddr)); - - if (nret == SOCKET_ERROR) { - nret = WSAGetLastError(); - ReportError(nret, "connect()"); - WSACleanup(); - return NETWORK_ERROR; - } - - char s[3000]; - strcpy(s,"GET /chatout?MODE=1048576&CHANNEL="); - strcat(s,aktivechannel.print()); - strcat(s,"&PROVIDER=REG&NICKNAME="); - strcat(s,UserName); - strcat(s,"&PW="); - strcat(s,PW.print()); - strcat(s,"&SID="); - strcat(s,Sid.print()); - strcat(s,"&ID="); - strcat(s,ID.print()); - strcat(s,"&KEY="); - strcat(s,"258"); - strcat(s,"&SBG=1 HTTP/1.1\n"); - strcat(s,"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 8.51\n"); - strcat(s,"Host: 213.203.200.72\n"); - strcat(s,"Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\n"); - strcat(s,"Accept-Language: en\n"); - strcat(s,"Accept-Charset: windows-1252, utf-8, utf-16, iso-8859-1;q=0.6, *;q=0.1\n"); - strcat(s,"Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0\n"); - strcat(s,"Referer: http://www.chatcity.de/cgi-bin/cc2005/wwb/wwb.cgi\n"); - strcat(s,"Connection: Keep-Alive, TE\n"); - strcat(s,"TE: deflate, gzip, chunked, identity, trailers\n\n\n"); - int nReadAmount=send(sendSocket,s,strlen(s),0); - printf("endgetcahtout\n"); -} - -int ChatBotClass::say(char *textin) { - if (textin!="") { - //Write2Log("ChatBotClasslog.txt",textin); -// printf("in say\n"); - if (errorcode) return(1); - //split long messages - MString msgs[20]; - MString buf; - buf=textin; - - int counter=0; - for (int i=0;((i<1+(int)(buf.strlength()/MessageSplitLength))&&(counter<20));i++) { -// printf("%i\n",i); - msgs[i]=buf.copy(MessageSplitLength,i*MessageSplitLength); -// printf("%s\n",msgs[i].print()); - counter++; - } -// printf("ok\n"); - for (int u=0;uh_addr_list); // See the explanation in the tutorial - serverInfo.sin_port = htons(80); // Change to network-byte order and - nret = connect(sendSocket, - (LPSOCKADDR)&serverInfo, - sizeof(struct sockaddr)); - - if (nret == SOCKET_ERROR) { - nret = WSAGetLastError(); - ReportError(nret, "connect()"); - WSACleanup(); - return NETWORK_ERROR; - } - - send(sendSocket,s,strlen(s),0); - closesocket(sendSocket); - fertig: - int v=0; - } - } -// printf(" say raus\n"); -} - - -int ChatBotClass::GetIDandSID() { - if (errorcode) return(1); - SOCKET passSocket; - WORD sockVersion; - WSADATA wsaData; - int nret; - sockVersion = MAKEWORD(1, 1); - WSAStartup(sockVersion, &wsaData); - LPHOSTENT hostEntry; - printf("gettin id and sid\n"); -// hostEntry = gethostbyname("chatcity.de"); // Specifying the server by its name; - - if (!anonymize) hostEntry = gethostbyname("213.203.200.70"); - else hostEntry = gethostbyname("http://www.waythru.com/index.php?q=http://213.203.200.70"); - - // another option is gethostbyaddr() - if (!hostEntry) { - nret = WSAGetLastError(); - ReportError(nret, "gethostbyname()"); // Report the error as before - WSACleanup(); - return NETWORK_ERROR; - } - passSocket = socket(AF_INET, // Go over TCP/IP - SOCK_STREAM, // This is a stream-oriented socket - IPPROTO_TCP); // Use TCP rather than UDP - if (passSocket == INVALID_SOCKET) { - nret = WSAGetLastError(); - ReportError(nret, "socket()"); - WSACleanup(); - return NETWORK_ERROR; - } - - SOCKADDR_IN serverInfo; - serverInfo.sin_family = AF_INET; - serverInfo.sin_addr = *((LPIN_ADDR)*hostEntry->h_addr_list); // See the explanation in the tutorial - serverInfo.sin_port = htons(80); // Change to network-byte order and - nret = connect(passSocket, - (LPSOCKADDR)&serverInfo, - sizeof(struct sockaddr)); - if (nret == SOCKET_ERROR) { - nret = WSAGetLastError(); - ReportError(nret, "connect()"); - WSACleanup(); - return NETWORK_ERROR; - } - // Send/receive, then cleanup: - MString contentlenght; - contentlenght+=113-20+strlen(UserName)+aktivechannel.strlength(); - - char s[2000]; - strcpy(s,"POST /cgi-bin/cc2005/wwb/wwb.cgi HTTP/1.1\n"); - strcat(s,"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 8.51\n"); - strcat(s,"Host: www.chatcity.de\n"); - strcat(s,"Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\n"); - strcat(s,"Accept-Language: en\n"); - strcat(s,"Accept-Charset: windows-1252, utf-8, utf-16, iso-8859-1;q=0.6, *;q=0.1\n"); - strcat(s,"Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0\n"); - strcat(s,"Referer: http://home.chatcity.de/pages/bereich3.php\n"); - strcat(s,"Connection: Keep-Alive, TE\n"); - strcat(s,"TE: deflate, gzip, chunked, identity, trailers\n"); - strcat(s,"Content-Type: application/x-www-form-urlencoded\n"); - strcat(s,"Content-Length: "); - strcat(s,contentlenght.print()); - strcat(s,"\n\n"); - strcat(s,"_CID=login%2Flo&PROVIDER=REG&KEY=258&MODE=1048576"); - strcat(s,"&NAME="); - strcat(s,UserName); - strcat(s,"&PW="); - strcat(s,Passwort); - strcat(s,"&CHANNEL="); - strcat(s,aktivechannel.print()); - strcat(s,"&Chat=+++++Chatten+++++"); - - int nReadAmount=send(passSocket,s,strlen(s),0); - MString x; - MString XSID; - MString XID; - MString XPW; - MString XKEY; - char pBuffer[6048]; - int v=1; - while(v!=15) { - for (int i=0;i<6048;i++) pBuffer[i]=0; - recv(passSocket,pBuffer,1048,0); - x=pBuffer; - XSID="";XID=""; - XSID=x.getbedfirst("&SID=","&ID="); - XID=x.getbedfirst("&ID=","&KEY="); - XPW=x.getbedfirst("&PW=","&SID="); - XKEY=x.getbedfirst("&KEY=","&SBG="); - if ((XSID!="")&&(XID!="")&&(XPW!="")) break; - v++; - } - if ((XSID!="")&&(XID!="")&&(XPW!="")) { - printf("Erfolg: SID=%s ID=%s PW=%s KEY=%s\n",XSID.print(),XID.print(),XPW.print(),XKEY.print()); - } else { - printf("Konnte keine ID/SID bekommen\n");} - Sid=XSID.print(); - ID=XID.print(); - PW=XPW.print(); - KEY=XKEY.print(); - closesocket(passSocket); -} - -int ChatBotClass::getregistrationform() { - SOCKET passSocket; - WORD sockVersion; - WSADATA wsaData; - int nret; - sockVersion = MAKEWORD(1, 1); - WSAStartup(sockVersion, &wsaData); - LPHOSTENT hostEntry; - printf("gettin regform\n"); - - if (!anonymize) hostEntry = gethostbyname("213.203.200.2"); - else hostEntry = gethostbyname("http://www.waythru.com/index.php?q=http://213.203.200.2"); - - if (!hostEntry) { - nret = WSAGetLastError(); - ReportError(nret, "gethostbyname()"); // Report the error as before - WSACleanup(); - return NETWORK_ERROR; - } - passSocket = socket(AF_INET, // Go over TCP/IP - SOCK_STREAM, // This is a stream-oriented socket - IPPROTO_TCP); // Use TCP rather than UDP - if (passSocket == INVALID_SOCKET) { - nret = WSAGetLastError(); - ReportError(nret, "socket()"); - WSACleanup(); - return NETWORK_ERROR; - } - - SOCKADDR_IN serverInfo; - serverInfo.sin_family = AF_INET; - serverInfo.sin_addr = *((LPIN_ADDR)*hostEntry->h_addr_list); // See the explanation in the tutorial - serverInfo.sin_port = htons(80); // Change to network-byte order and - nret = connect(passSocket, - (LPSOCKADDR)&serverInfo, - sizeof(struct sockaddr)); - if (nret == SOCKET_ERROR) { - nret = WSAGetLastError(); - ReportError(nret, "connect()"); - WSACleanup(); - return NETWORK_ERROR; - } - // Send/receive, then cleanup: - - char s[2000]; - - strcpy(s,"GET /registrierung/ HTTP/1.1\r\n"); - strcat(s,"User-Agent: Opera/9.10 (Windows NT 5.1; U; en)\r\n"); - strcat(s,"Host: home.chatcity.de\r\n"); - strcat(s,"Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\n"); - strcat(s,"Accept-Language: de-DE,de;q=0.9,en;q=0.8\r\n"); - strcat(s,"Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\n"); - strcat(s,"Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0\r\n"); - strcat(s,"Cookie: POPUPCHECK=1194890296737\r\n"); - strcat(s,"Cookie2: $Version=1\r\n"); - strcat(s,"Cache-Control: no-cache\r\n"); - strcat(s,"Connection: Keep-Alive, TE\r\n"); - strcat(s,"TE: deflate, gzip, chunked, identity, trailers\r\n"); - strcat(s,"\r\n"); - - int nReadAmount=send(passSocket,s,strlen(s),0); - - MString x; - MString Bild; - char pBuffer[26048]; - int v=1; - while(v!=55) { - for (int i=0;i<6048;i++) pBuffer[i]=0; - recv(passSocket,pBuffer,1412,0); - x=pBuffer; - if (x.includes("securitycode")) { - Bild=x.getbedfirst("securitycode/index.php?","\" width=\"80\""); - printf("gefunden\n");goto fertig; - } - v++; - } - fertig: - MString Bildadr; - Bildadr="wget -nd -r http://chats.kunden.abacho.net/securitycode/index.php?"; - Bildadr+=Bild.print(); - Bildadr+=" -O index.php"; - closesocket(passSocket); - printf("%s\n",Bildadr.print()); - system(Bildadr.print()); -// SDL_Surface *image; -// image=IMG_Load("index.php"); - unsigned int hash; - - for (int i=0;i<5;i++) { -// c2[i]=CalcHash(image,i*16); - } - for (int i=0;i<5;i++) printf(">>%u\n",c2[i]); - - system("del index.php"); -// SDL_UnlockSurface(image); -} - -int ChatBotClass::registername(char *nickname, char *pwd, char *email) { - readschlussel(); - for (int i=0;i<5;i++) { - for (int l=0;l<35;l++) { - if (c2[i]==schlussel[l].schl) { - printf("%s",schlussel[l].zeichen.print()); - checkcode=checkcode+schlussel[l].zeichen.print(); - } - } - } - printf("\n"); - - SOCKET passSocket; - WORD sockVersion; - WSADATA wsaData; - int nret; - sockVersion = MAKEWORD(1, 1); - WSAStartup(sockVersion, &wsaData); - LPHOSTENT hostEntry; - printf("register name\n"); - - if (!anonymize) hostEntry = gethostbyname("213.203.200.2"); - else hostEntry = gethostbyname("http://www.waythru.com/index.php?q=http://213.203.200.2"); - - // another option is gethostbyaddr() - if (!hostEntry) { - nret = WSAGetLastError(); - ReportError(nret, "gethostbyname()"); // Report the error as before - WSACleanup(); - return NETWORK_ERROR; - } - passSocket = socket(AF_INET, // Go over TCP/IP - SOCK_STREAM, // This is a stream-oriented socket - IPPROTO_TCP); // Use TCP rather than UDP - if (passSocket == INVALID_SOCKET) { - nret = WSAGetLastError(); - ReportError(nret, "socket()"); - WSACleanup(); - return NETWORK_ERROR; - } - - SOCKADDR_IN serverInfo; - serverInfo.sin_family = AF_INET; - serverInfo.sin_addr = *((LPIN_ADDR)*hostEntry->h_addr_list); // See the explanation in the tutorial - serverInfo.sin_port = htons(80); // Change to network-byte order and - nret = connect(passSocket, - (LPSOCKADDR)&serverInfo, - sizeof(struct sockaddr)); - if (nret == SOCKET_ERROR) { - nret = WSAGetLastError(); - ReportError(nret, "connect()"); - WSACleanup(); - return NETWORK_ERROR; - } - // Send/receive, then cleanup: - - - char s[20000]; - - strcpy(s,"POST /registrierung/ HTTP/1.1\r\n"); - strcat(s,"User-Agent: Opera/9.10 (Windows NT 5.1; U; en)\r\n"); - strcat(s,"Host: home.chatcity.de\r\n"); - strcat(s,"Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\n"); - strcat(s,"Accept-Language: de-DE,de;q=0.9,en;q=0.8\r\n"); - strcat(s,"Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\n"); - strcat(s,"Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0\r\n"); - strcat(s,"Referer: http://home.chatcity.de/registrierung/\r\n"); - strcat(s,"Cookie: POPUPCHECK=1194890296737\r\n"); - strcat(s,"Cookie2: $Version=1\r\n"); - strcat(s,"Connection: Keep-Alive, TE\r\n"); - strcat(s,"TE: deflate, gzip, chunked, identity, trailers\r\n"); - strcat(s,"Content-Length: 468\r\n"); - strcat(s,"Content-Type: application/x-www-form-urlencoded\r\n"); - strcat(s,"\r\n"); - -MString securecode; -securecode=checkcode.print();; - -// cmd=login&nickname=Schnee8876&pwd1=mdykoz&pwd2=mdykoz&email1=chochmah%40gmx.net&email2=chochmah%40gmx.net&securecode=NG979&newsletter=1&gender=1&showgender=1&get_datum_tag=09&get_datum_monat=05&get_datum_jahr=1981&plz=&wohnort=&id_card=1&m - strcat(s,"cmd=login&nickname="); - strcat(s,nickname); - strcat(s,"&pwd1="); - strcat(s,pwd); - strcat(s,"&pwd2="); - strcat(s,pwd); - strcat(s,"&email1="); - strcat(s,email); -// email //email @ als %40 - strcat(s,"&email2="); - strcat(s,email); - strcat(s,"&securecode="); - strcat(s,securecode.print()); - strcat(s,"&newsletter=1&gender=1&showgender=1&get_datum_tag=09&get_datum_monat=05&get_datum_jahr=1981&plz=&wohnort=&id_card=1&motto=&img_idcard=http%3A%2F%2F&hobby=&interessen=&buecher=&filme=&fernsehsendungen=&musik=&sprachen=&ichsuche=&homepage=&essen=&reiseziel=&getraenke=&tier=&cc=%23000000&sc=%23FFFFFF&system_msg=1&agb=1&agbsubmit=+++registrieren+++"); - - - int nReadAmount=send(passSocket,s,strlen(s),0); - printf("%s %i\n",s,nReadAmount); - - - strcpy(s,"GET /registrierung/register.php HTTP/1.1\r\n"); - strcat(s,"User-Agent: Opera/9.10 (Windows NT 5.1; U; en)\r\n"); - strcat(s,"Host: home.chatcity.de\r\n"); - strcat(s,"Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\n"); - strcat(s,"Accept-Language: de-DE,de;q=0.9,en;q=0.8\r\n"); - strcat(s,"Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\n"); - strcat(s,"Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0\r\n"); - strcat(s,"Referer: http://home.chatcity.de/registrierung/\r\n"); - strcat(s,"Cookie: POPUPCHECK=1194890296737\r\n"); - strcat(s,"Cookie2: $Version=1\r\n"); - strcat(s,"Connection: Keep-Alive, TE\r\n"); - strcat(s,"TE: deflate, gzip, chunked, identity, trailers\r\n"); - strcat(s,"\r\n"); - - nReadAmount=send(passSocket,s,strlen(s),0); - printf("%s %i\n",s,nReadAmount); - - printf("registrierung fertig\n"); - - char pBuffer[1024]; - int y; - MString x; - do { - y=recv(passSocket,pBuffer,1024,0); - Sleep(100); - } while (y>0); - closesocket(passSocket); -} - -void ChatBotClass::registernickname(char *nickname, char *pwd, char *email) { - getregistrationform(); - registername(nickname,pwd,email); -} - diff --git a/uppdev/j2/chatbot.h b/uppdev/j2/chatbot.h deleted file mode 100644 index a0084d9fe..000000000 --- a/uppdev/j2/chatbot.h +++ /dev/null @@ -1,119 +0,0 @@ -#ifndef CHATBOT_H -#define CHATBOT_H -using namespace std; -#include -#include -#include -#include "chatterlistclass.h" -//#include -using namespace Upp; - -#include -#include "MString.h" -#include -#include - -#define NETWORK_ERROR -1 -#define NETWORK_OK 0 - -class ChatBotClass -{ - private: - - typedef struct { - unsigned int schl; - MString zeichen; - float width; - } schlusselstruct; - - typedef struct { - MString nick; - MString message; - time_t timestamp; - } MStruct; - - - int Nicknum, - Sepnum; - MString Nicks[100]; //depr - MString SepNick[100]; //depr - - unsigned int c2[5]; - MString checkcode; - static int const MessageSplitLength=255; - MString ID; - MString Sid; - MString PW; - MString KEY; - SOCKET sendSocket,sendHTMLSocket; - const char *UserName, *Passwort, *Channel; - MString floodpref1,floodpref2; - void ReportError(int errorCode, const char *whichFunc); - time_t seconds1; - void Write2Log(char *name,char *text); - void readsperrliste(); - vector sperrnicks; - vector messagelog; - vector sendlog; - bool onsperrliste(MString nick); - void addtomessagelog(MString sender, MString message); - void addtosperrlist(MString nick); - bool resendcheck; - public: - schlusselstruct schlussel[40]; - time_t timeoflastrec() {return(seconds1);} - void updatetimeoflastrec() {seconds1=time(NULL);}; - bool isonline() {if (errorcode) return(0); else return(1);} - bool isinsep; - int peopleinsep; - MString sepname; - MString aktivechannel; - bool leseeigenenschrieb; - bool rawtext; - bool beepmyname; - bool autokicknicksonsperrlist; - bool autoaddtosperrlistonspaming; - int errorcode; - MString ErrorMsg; - bool anonymize; - ChatterListClass ChatterSepList; - - ChatBotClass(){ - autokicknicksonsperrlist=0; - autoaddtosperrlistonspaming=0; - anonymize=0; - leseeigenenschrieb=1; - beepmyname=1; - rawtext=0; - floodpref1=""; - floodpref2=""; - seconds1=time(NULL); - readsperrliste(); - readschlussel(); - resendcheck=1;}; - ~ChatBotClass(){}; - void webpage(); - void botdata(); - int login(const char *name, char *pwd, char *chan); - int login(); - int GetIDandSID(); - int GetChatOut(); - int say(char *text); - void readchatline(void (*pfi)(int fl, MString col, MString Sender, MString Message)); - void readchatline2(void (*pfi)(int fl, String colG, String SenderG, String MessageG)); - void readHTMLout(void (*pfi)(MString Text)); - void Exit(); - int GetIDCard(MString m,MString *Statement); - int getregistrationform(); - int registername(char *nickname, char *pwd, char *email); - int LadeDatei(char *datei,char *speichername); -// unsigned int CalcHash(SDL_Surface *surface, int xoff); - void readschlussel(); - void registernickname(char *nickname, char *pwd, char *email); - void addtosendlog (MString message); - void delfromsendlog (MString message); - void checksendlog(); - }; - -#endif // CHATBOT_H - diff --git a/uppdev/j2/chatterlistclass.cpp b/uppdev/j2/chatterlistclass.cpp deleted file mode 100644 index 2fecd59b6..000000000 --- a/uppdev/j2/chatterlistclass.cpp +++ /dev/null @@ -1,114 +0,0 @@ -#include "ChatterListClass.h" -#include - -ChatterListClass::ChatterListClass() { -} - -void ChatterListClass::clearall() { - chatter.clear(); -} - -void ChatterListClass::printchatter() { - MString k; - k="ChatterinSepList: "; - vector::iterator it; - for(it = chatter.begin(); it != chatter.end(); it++) { - chatterstruct wle; - wle=*it; - k=k+wle.Chatter; - k=k+"("; - if(wle.abgemeldet==1)k+="abgemeldet";else k+="angemeldet"; - k=k+") "; - } -// printf("%s\n",k.print()); -} - - -int ChatterListClass::ChatterAngemeldet() { - int num=0; - vector::iterator it; - for(it = chatter.begin(); it != chatter.end(); it++) { - chatterstruct wle; - wle=*it; - if (wle.abgemeldet==0) num++; - } -// printf("%i Chatter angemeldet im Sep\n",num); - return(num); -} - -void ChatterListClass::anmelden(MString Chatter) { - printf("|%s|\n",Chatter.print()); - vector::iterator it; - for(it = chatter.begin(); it != chatter.end(); it++) { - chatterstruct wle; - wle=*it; - if (wle.Chatter==Chatter) { - it->abgemeldet=0; //fehler hier - printf("%s jetzt angemeldet\n",Chatter.print()); - } - } -} - -void ChatterListClass::abmelden(MString Chatter) { - printf("|%s|\n",Chatter.print()); - vector::iterator it; - for(it = chatter.begin(); it != chatter.end(); it++) { - chatterstruct wle; - wle=*it; - if (wle.Chatter==Chatter) { - it->abgemeldet=1; - printf("%s jetzt abgemeldet\n",Chatter.print()); - } - } -} - -bool ChatterListClass::AddChatter(MString Chatter) { - vector::iterator it; - for(it = chatter.begin(); it != chatter.end(); it++) { - chatterstruct wle; - wle=*it; - if (wle.Chatter==Chatter) return(0); - } - chatterstruct wle; - wle.Chatter = Chatter.print(); - wle.abgemeldet=0; - chatter.push_back(wle); - printf("%s zur Chatterliste hinzugefgt\n",Chatter.print()); - return(1); -} - -bool ChatterListClass::RemoveChatter(MString Chatter) { - vector::iterator it; - for(it = chatter.begin(); it != chatter.end(); it++) { - chatterstruct wle; - wle=*it; - if (wle.Chatter==Chatter) { - chatter.erase(it); - printf("%s aus der Chatterliste gelscht\n",Chatter.print()); - return(1); - } - } - printf("%s nicht in der Chatterliste vorhanden, konnte nicht gelscht werden\n",Chatter.print()); - return(0); -} - -/* -int ChatterListClass::AddUserZahlenraten(MString Chatter, float Antwort, float Zielwert) { - if (Antwort == 0) return(0); - printf("auswerten zaoh\n"); - vector::iterator it; - for(it = chatter.begin(); it != chatter.end(); it++) { - chatterstruct wle; - wle=*it; - if (wle.Chatter==Chatter) return(0); - } - chatterstruct wle; - wle.Chatter = Chatter.print(); - wle.Pkt = Antwort; - chatter.push_back(wle); - printf("%f %f\n",Antwort,Zielwert); - if (Antwort==Zielwert) return(1); - return(0); -} - -*/ diff --git a/uppdev/j2/chatterlistclass.h b/uppdev/j2/chatterlistclass.h deleted file mode 100644 index 68b042331..000000000 --- a/uppdev/j2/chatterlistclass.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef ChatterListClass_H -#define ChatterListClass_H -#include "mstring.h" -#include -using namespace std; - - typedef struct { - MString Chatter; - int abgemeldet; - } chatterstruct; - -class ChatterListClass -{ -private: - -public: - vector chatter; - ChatterListClass(); - void printchatter(); - void anmelden(MString name); - void abmelden(MString name); - bool AddChatter(MString name); - bool RemoveChatter(MString name); - void clearall(); - int ChatterInSep(){return(chatter.size());} - int ChatterAngemeldet(); -}; - -#endif diff --git a/uppdev/j2/init b/uppdev/j2/init deleted file mode 100644 index 56d48b958..000000000 --- a/uppdev/j2/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _j2_icpp_init_stub -#define _j2_icpp_init_stub -#include "CtrlLib/init" -#endif diff --git a/uppdev/j2/j2.h b/uppdev/j2/j2.h deleted file mode 100644 index 01ad57c01..000000000 --- a/uppdev/j2/j2.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef _j2_j2_h -#define _j2_j2_h - -#include - -using namespace Upp; - -#define LAYOUTFILE -#include - -class j2 : public Withj2Layout { -public: - typedef j2 CLASSNAME; - void Quit(); - void DragEnter(); - void GotFocus(); - j2(); -}; - -#endif - diff --git a/uppdev/j2/j2.lay b/uppdev/j2/j2.lay deleted file mode 100644 index 6b47986f9..000000000 --- a/uppdev/j2/j2.lay +++ /dev/null @@ -1,6 +0,0 @@ -LAYOUT(j2Layout, 624, 436) - ITEM(LineEdit, a, LeftPosZ(4, 564).TopPosZ(412, 20)) - ITEM(RichTextView, e, LeftPosZ(0, 624).TopPosZ(0, 408)) - ITEM(Button, mbu, SetLabel(t_("TEST")).Tip(t_("thistip")).HCenterPosZ(40, 284).TopPosZ(412, 19)) -END_LAYOUT - diff --git a/uppdev/j2/j2.upp b/uppdev/j2/j2.upp deleted file mode 100644 index 443c88ea3..000000000 --- a/uppdev/j2/j2.upp +++ /dev/null @@ -1,21 +0,0 @@ -description "j2"; - -uses - CtrlLib; - -file - j2.h, - IniReader.cpp, - IniReader.h, - chatterlistclass.h, - chatterlistclass.cpp, - chatbot.cpp, - chatbot.h, - main.cpp, - mstring.cpp, - mstring.h, - j2.lay; - -mainconfig - "" = "CONSOLE"; - diff --git a/uppdev/j2/main.cpp b/uppdev/j2/main.cpp deleted file mode 100644 index 73458324a..000000000 --- a/uppdev/j2/main.cpp +++ /dev/null @@ -1,165 +0,0 @@ -#include "j2.h" - -#include "IniReader.h" -#include "MString.h" -#include "ChatBot.h" - -j2 HG; -String qtfx; -ChatBotClass ChatBot1; -void (*pfi) (int fl, String colG, String SenderG, String MessageG); -char *inibotName; -char *inibotPass; -char *inibotInitialChannel; - - -j2::j2() { - qtfx = "Joachim [@4 Green text]{@40}.1&"; - CtrlLayout(*this, "Joachim 0.1"); - SetLanguage( LNG_('D','E','D','E') ); - SetDefaultCharset(CHARSET_UTF8); - e.SetQTF(qtfx); - mbu <<= THISBACK(Quit); - a << THISBACK(DragEnter); - a << THISBACK(GotFocus); -} - -void j2::Quit() { - qtfx<<"test&"; - e.SetQTF(qtfx); - ChatBot1.login(inibotName,inibotPass,inibotInitialChannel); - ChatBot1.readchatline2(pfi); -} - -void j2::GotFocus() { - e.SetQTF(qtfx); - e.ScrollEnd(); -} -void j2::DragEnter() { - - String x; - char *t; - t = new char[2000]; - x=~a; - if (strlen(x)<1) return; - if (x[1]==char(10)) {a.Clear();return;} - if (x[(int)strlen(x)-1]==char(10)) { - int i=0; - do { - t[i]=x[i]; - i++; - } while (x[i]!=char(10)); - ChatBot1.say(t); - // qtfx<< ~a<<"&"; - // e.SetQTF(qtfx); - e.SetQTF(qtfx); - e.ScrollEnd(); - a.Clear(); - } - -} - -void readinifile() { - CIniReader iniReader(".\\joachim.ini"); - inibotName = iniReader.ReadString("GeneralSetting", "BotName", "PowerMops"); - inibotPass = iniReader.ReadString("GeneralSetting", "BotPass", "mdykoz"); - inibotInitialChannel = iniReader.ReadString("GeneralSetting", "InitialChannel", "Halle1"); -} -int size; - -void textin_cb(int x,String farbe,String Sender,String text) { - size++; - if (farbe=="") farbe="000000"; - - int col[6]; - for (int i=0;i<6;i++) { - if (farbe[i]=='0') col[i]=0; - if (farbe[i]=='1') col[i]=1; - if (farbe[i]=='2') col[i]=2; - if (farbe[i]=='3') col[i]=3; - if (farbe[i]=='4') col[i]=4; - if (farbe[i]=='5') col[i]=5; - if (farbe[i]=='6') col[i]=6; - if (farbe[i]=='7') col[i]=7; - if (farbe[i]=='8') col[i]=8; - if (farbe[i]=='9') col[i]=9; - if (farbe[i]=='a') col[i]=10; - if (farbe[i]=='b') col[i]=11; - if (farbe[i]=='c') col[i]=12; - if (farbe[i]=='d') col[i]=13; - if (farbe[i]=='e') col[i]=14; - if (farbe[i]=='f') col[i]=15; - if (farbe[i]=='A') col[i]=10; - if (farbe[i]=='B') col[i]=11; - if (farbe[i]=='C') col[i]=12; - if (farbe[i]=='D') col[i]=13; - if (farbe[i]=='E') col[i]=14; - if (farbe[i]=='F') col[i]=15; - } - int num[3]; - for (int i=0;i<3;i++) { - num[i]=col[i*2]*16+col[1+i*2]; - } - qtfx<<"[@("< -#include -using namespace std; - -//erase(x) : lscht alle vorkommen von x aus dem Wort -//concat(x) : fgt dem wort x hinten an -//replace(x,y) : ersetzt alle x im wort durch y -//equal(x) : liefert eins wenn das wort mit x bereinstimmt, null sonst -//includes(x) : liefert eins wenn x im wort vorkommt - -class MString { - -private: - int bedpos; - char str[8000]; - string stt; -public: - bool found; -public: - MString(); - ~MString(); - void set(char *s); - void operator=(char *s){set(s);} - void operator=(MString M){stt=M.stt;found=M.found;bedpos=M.bedpos;} - void operator=(int x); - void operator=(string s){stt=s;} - char *print(){ - if (stt.length()>=8000) printf("STRINGERROR>8000"); - for (int i=0;((i<=stt.length())&&(i<8000));i++) str[i]=stt[i]; - return(str); - } - string getstring() {string x;x=stt;return(x);} - char stringval(int i) {if (i -#include -#include - -using std::istream; -using std::string; -using std::vector; -using std::cin; - -istream& read_words(istream& input_stream, vector& words) -{ - words.clear(); - - string word; - - while (input_stream >> word) - { - words.push_back(word); - } - - return input_stream; -} - -int main() -{ - vector words; - - read_words(cin, words); - - return 0; -} diff --git a/uppdev/kmedis/kmedis.h b/uppdev/kmedis/kmedis.h deleted file mode 100644 index 615abd911..000000000 --- a/uppdev/kmedis/kmedis.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef _kmedis_h -#define _kmedis_h -//--------------------------------------------------------------------------- - -#include - -using namespace Upp; - -#define LAYOUTFILE -#include - -//--------------------------------------------------------------------------- -class Kmedis: public WithKmedisLayout { -public: - typedef Kmedis CLASSNAME; - Kmedis(); - - virtual void Close(); -}; - -//--------------------------------------------------------------------------- -#endif diff --git a/uppdev/kmedis/kmedis.lay b/uppdev/kmedis/kmedis.lay deleted file mode 100644 index c54dd12a0..000000000 --- a/uppdev/kmedis/kmedis.lay +++ /dev/null @@ -1,3 +0,0 @@ -LAYOUT(KmedisLayout, 894, 594) -END_LAYOUT - diff --git a/uppdev/kmedis/kmedis.upp b/uppdev/kmedis/kmedis.upp deleted file mode 100644 index 19e7d961d..000000000 --- a/uppdev/kmedis/kmedis.upp +++ /dev/null @@ -1,14 +0,0 @@ -description "KME dispecing\377"; - -uses - CtrlLib; - -file - main.cpp, - kmedis.h, - kmedis.t charset "UTF-8", - kmedis.lay; - -mainconfig - "" = "GUI"; - diff --git a/uppdev/kmedis/main.cpp b/uppdev/kmedis/main.cpp deleted file mode 100644 index 84c526af1..000000000 --- a/uppdev/kmedis/main.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include "kmedis.h" - -//--------------------------------------------------------------------------- -#define TOP_WINDOW_TITLE "KMEdis" - -//--------------------------------------------------------------------------- -Kmedis::Kmedis() -{ - CtrlLayout(*this, TOP_WINDOW_TITLE); - CenterScreen(); - - //---------------------------------------------------------- - SetTimeCallback(1500, THISBACK(Close)); -} - - -void Kmedis::Close() -{ - RLOG("B"); - WithKmedisLayout::Close(); - RLOG("C"); -} - -//--------------------------------------------------------------------------- -GUI_APP_MAIN -{ - Kmedis kmedis; - RLOG("A"); -// kmedis.Minimize(); - kmedis.Run(); - RLOG("D"); -} diff --git a/uppdev/kmedis/tst/tst.py b/uppdev/kmedis/tst/tst.py deleted file mode 100644 index 5d78a021b..000000000 --- a/uppdev/kmedis/tst/tst.py +++ /dev/null @@ -1,5 +0,0 @@ -import os, time - -while True: - os.spawnl(os.P_WAIT, 'kmedis.exe') -# time.sleep(1) \ No newline at end of file diff --git a/uppdev/kmedis/tst/tst2.py b/uppdev/kmedis/tst/tst2.py deleted file mode 100644 index 2a49dae87..000000000 --- a/uppdev/kmedis/tst/tst2.py +++ /dev/null @@ -1,6 +0,0 @@ -import os - -PYTHON_EXE = 'C:\Prog\Python25\python.exe' - -for i in range(20): - os.spawnl(os.P_NOWAIT, PYTHON_EXE, PYTHON_EXE, 'tst.py') diff --git a/uppdev/libfetch/libfetch.upp b/uppdev/libfetch/libfetch.upp deleted file mode 100644 index e69de29bb..000000000 diff --git a/uppdev/listBench/listBench.cpp b/uppdev/listBench/listBench.cpp deleted file mode 100644 index b9fdba0fe..000000000 --- a/uppdev/listBench/listBench.cpp +++ /dev/null @@ -1,63 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -const int REP = 100000; -const int N = 1000; -const int AND = 31; -const int LIM = 15; - -inline bool llim(int x) -{ - return x < LIM; -} - -CONSOLE_APP_MAIN -{ - Vector seq; - for(int i = 0; i < N; i++) - seq.Add(rand() & AND); - for(int n = 0; n < REP; n++) { - { - Vector s(seq, 1); - RTIMING("Vector trivial"); - Vector t; - for(int i = 0; i < s.GetCount(); i++) - if(s[i] >= LIM) - t.Add(s[i]); - } - { - Vector s(seq, 1); - RTIMING("Vector reserve"); - Vector t; - t.Reserve(s.GetCount()); - for(int i = 0; i < s.GetCount(); i++) - if(s[i] >= LIM) - t.Add(s[i]); - } - { - Vector s(seq, 1); - RTIMING("Vector single"); - int q = 0; - for(int i = 0; i < s.GetCount(); i++) - if(s[i] >= LIM) - s[q++] = s[i]; - s.SetCount(q); - } - { - list l(seq.Begin(), seq.End()); - RTIMING("list remove_if"); - l.remove_if(llim); - } - } -} diff --git a/uppdev/listBench/listBench.upp b/uppdev/listBench/listBench.upp deleted file mode 100644 index 25046a3c5..000000000 --- a/uppdev/listBench/listBench.upp +++ /dev/null @@ -1,7 +0,0 @@ -uses Core; - -file - "listBench.cpp"; - -mainconfig - "" = ""; diff --git a/uppdev/lua/lua.hpp b/uppdev/lua/lua.hpp deleted file mode 100644 index 6c10bc055..000000000 --- a/uppdev/lua/lua.hpp +++ /dev/null @@ -1,9 +0,0 @@ -// lua.hpp -// Lua header files for C++ -// <> not supplied automatically because Lua also compiles as C++ - -extern "C" { -#include "lua.h" -#include "lualib.h" -#include "lauxlib.h" -} diff --git a/uppdev/lua/lua.upp b/uppdev/lua/lua.upp deleted file mode 100644 index 3a8829c84..000000000 --- a/uppdev/lua/lua.upp +++ /dev/null @@ -1,61 +0,0 @@ -optimize_speed; - -flags(NOTMFC) "!GUI !CONSOLE"; - -file - "Original files" readonly separator, - src/lapi.c, - src/lapi.h, - src/lauxlib.c, - src/lauxlib.h, - src/lbaselib.c, - src/lcode.c, - src/lcode.h, - src/ldblib.c, - src/ldebug.c, - src/ldebug.h, - src/ldo.c, - src/ldo.h, - src/lfunc.c, - src/lfunc.h, - src/lgc.c, - src/lgc.h, - src/linit.c, - src/liolib.c, - src/llex.c, - src/llex.h, - src/llimits.h, - src/lmathlib.c, - src/lmem.c, - src/lmem.h, - src/loadlib.c, - src/lobject.c, - src/lobject.h, - src/lopcodes.c, - src/lopcodes.h, - src/loslib.c, - src/lparser.c, - src/lparser.h, - src/lstate.c, - src/lstate.h, - src/lstring.c, - src/lstring.h, - src/lstrlib.c, - src/ltable.c, - src/ltable.h, - src/ltablib.c, - src/ltm.c, - src/ltm.h, - src/lua.c, - src/lua.h, - src/luaconf.h, - src/lualib.h, - src/lvm.c, - src/lvm.h, - src/lzio.c, - src/lzio.h, - src/ldump.c, - src/luac.c, - src/lundump.c, - src/lundump.h, - src/print.c; diff --git a/uppdev/lua/src/lapi.c b/uppdev/lua/src/lapi.c deleted file mode 100644 index c93b02ea6..000000000 --- a/uppdev/lua/src/lapi.c +++ /dev/null @@ -1,1079 +0,0 @@ -/* -** $Id: lapi.c,v 2.55 2006/06/07 12:37:17 roberto Exp $ -** Lua API -** See Copyright Notice in lua.h -*/ - - -#include -#include -#include -#include - -#define lapi_c -#define LUA_CORE - -#include "lua.h" - -#include "lapi.h" -#include "ldebug.h" -#include "ldo.h" -#include "lfunc.h" -#include "lgc.h" -#include "lmem.h" -#include "lobject.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "ltm.h" -#include "lundump.h" -#include "lvm.h" - - - -const char lua_ident[] = - "$Lua: " LUA_RELEASE " " LUA_COPYRIGHT " $\n" - "$Authors: " LUA_AUTHORS " $\n" - "$URL: www.lua.org $\n"; - - - -#define api_checknelems(L, n) api_check(L, (n) <= (L->top - L->base)) - -#define api_checkvalidindex(L, i) api_check(L, (i) != luaO_nilobject) - -#define api_incr_top(L) {api_check(L, L->top < L->ci->top); L->top++;} - - - -static TValue *index2adr (lua_State *L, int idx) { - if (idx > 0) { - TValue *o = L->base + (idx - 1); - api_check(L, idx <= L->ci->top - L->base); - if (o >= L->top) return cast(TValue *, luaO_nilobject); - else return o; - } - else if (idx > LUA_REGISTRYINDEX) { - api_check(L, idx != 0 && -idx <= L->top - L->base); - return L->top + idx; - } - else switch (idx) { /* pseudo-indices */ - case LUA_REGISTRYINDEX: return registry(L); - case LUA_ENVIRONINDEX: { - Closure *func = curr_func(L); - sethvalue(L, &L->env, func->c.env); - return &L->env; - } - case LUA_GLOBALSINDEX: return gt(L); - default: { - Closure *func = curr_func(L); - idx = LUA_GLOBALSINDEX - idx; - return (idx <= func->c.nupvalues) - ? &func->c.upvalue[idx-1] - : cast(TValue *, luaO_nilobject); - } - } -} - - -static Table *getcurrenv (lua_State *L) { - if (L->ci == L->base_ci) /* no enclosing function? */ - return hvalue(gt(L)); /* use global table as environment */ - else { - Closure *func = curr_func(L); - return func->c.env; - } -} - - -void luaA_pushobject (lua_State *L, const TValue *o) { - setobj2s(L, L->top, o); - api_incr_top(L); -} - - -LUA_API int lua_checkstack (lua_State *L, int size) { - int res; - lua_lock(L); - if ((L->top - L->base + size) > LUAI_MAXCSTACK) - res = 0; /* stack overflow */ - else { - luaD_checkstack(L, size); - if (L->ci->top < L->top + size) - L->ci->top = L->top + size; - res = 1; - } - lua_unlock(L); - return res; -} - - -LUA_API void lua_xmove (lua_State *from, lua_State *to, int n) { - int i; - if (from == to) return; - lua_lock(to); - api_checknelems(from, n); - api_check(from, G(from) == G(to)); - api_check(from, to->ci->top - to->top >= n); - from->top -= n; - for (i = 0; i < n; i++) { - setobj2s(to, to->top++, from->top + i); - } - lua_unlock(to); -} - - -LUA_API lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf) { - lua_CFunction old; - lua_lock(L); - old = G(L)->panic; - G(L)->panic = panicf; - lua_unlock(L); - return old; -} - - -LUA_API lua_State *lua_newthread (lua_State *L) { - lua_State *L1; - lua_lock(L); - luaC_checkGC(L); - L1 = luaE_newthread(L); - setthvalue(L, L->top, L1); - api_incr_top(L); - lua_unlock(L); - luai_userstatethread(L, L1); - return L1; -} - - - -/* -** basic stack manipulation -*/ - - -LUA_API int lua_gettop (lua_State *L) { - return cast_int(L->top - L->base); -} - - -LUA_API void lua_settop (lua_State *L, int idx) { - lua_lock(L); - if (idx >= 0) { - api_check(L, idx <= L->stack_last - L->base); - while (L->top < L->base + idx) - setnilvalue(L->top++); - L->top = L->base + idx; - } - else { - api_check(L, -(idx+1) <= (L->top - L->base)); - L->top += idx+1; /* `subtract' index (index is negative) */ - } - lua_unlock(L); -} - - -LUA_API void lua_remove (lua_State *L, int idx) { - StkId p; - lua_lock(L); - p = index2adr(L, idx); - api_checkvalidindex(L, p); - while (++p < L->top) setobjs2s(L, p-1, p); - L->top--; - lua_unlock(L); -} - - -LUA_API void lua_insert (lua_State *L, int idx) { - StkId p; - StkId q; - lua_lock(L); - p = index2adr(L, idx); - api_checkvalidindex(L, p); - for (q = L->top; q>p; q--) setobjs2s(L, q, q-1); - setobjs2s(L, p, L->top); - lua_unlock(L); -} - - -LUA_API void lua_replace (lua_State *L, int idx) { - StkId o; - lua_lock(L); - /* explicit test for incompatible code */ - if (idx == LUA_ENVIRONINDEX && L->ci == L->base_ci) - luaG_runerror(L, "no calling environment"); - api_checknelems(L, 1); - o = index2adr(L, idx); - api_checkvalidindex(L, o); - if (idx == LUA_ENVIRONINDEX) { - Closure *func = curr_func(L); - api_check(L, ttistable(L->top - 1)); - func->c.env = hvalue(L->top - 1); - luaC_barrier(L, func, L->top - 1); - } - else { - setobj(L, o, L->top - 1); - if (idx < LUA_GLOBALSINDEX) /* function upvalue? */ - luaC_barrier(L, curr_func(L), L->top - 1); - } - L->top--; - lua_unlock(L); -} - - -LUA_API void lua_pushvalue (lua_State *L, int idx) { - lua_lock(L); - setobj2s(L, L->top, index2adr(L, idx)); - api_incr_top(L); - lua_unlock(L); -} - - - -/* -** access functions (stack -> C) -*/ - - -LUA_API int lua_type (lua_State *L, int idx) { - StkId o = index2adr(L, idx); - return (o == luaO_nilobject) ? LUA_TNONE : ttype(o); -} - - -LUA_API const char *lua_typename (lua_State *L, int t) { - UNUSED(L); - return (t == LUA_TNONE) ? "no value" : luaT_typenames[t]; -} - - -LUA_API int lua_iscfunction (lua_State *L, int idx) { - StkId o = index2adr(L, idx); - return iscfunction(o); -} - - -LUA_API int lua_isnumber (lua_State *L, int idx) { - TValue n; - const TValue *o = index2adr(L, idx); - return tonumber(o, &n); -} - - -LUA_API int lua_isstring (lua_State *L, int idx) { - int t = lua_type(L, idx); - return (t == LUA_TSTRING || t == LUA_TNUMBER); -} - - -LUA_API int lua_isuserdata (lua_State *L, int idx) { - const TValue *o = index2adr(L, idx); - return (ttisuserdata(o) || ttislightuserdata(o)); -} - - -LUA_API int lua_rawequal (lua_State *L, int index1, int index2) { - StkId o1 = index2adr(L, index1); - StkId o2 = index2adr(L, index2); - return (o1 == luaO_nilobject || o2 == luaO_nilobject) ? 0 - : luaO_rawequalObj(o1, o2); -} - - -LUA_API int lua_equal (lua_State *L, int index1, int index2) { - StkId o1, o2; - int i; - lua_lock(L); /* may call tag method */ - o1 = index2adr(L, index1); - o2 = index2adr(L, index2); - i = (o1 == luaO_nilobject || o2 == luaO_nilobject) ? 0 : equalobj(L, o1, o2); - lua_unlock(L); - return i; -} - - -LUA_API int lua_lessthan (lua_State *L, int index1, int index2) { - StkId o1, o2; - int i; - lua_lock(L); /* may call tag method */ - o1 = index2adr(L, index1); - o2 = index2adr(L, index2); - i = (o1 == luaO_nilobject || o2 == luaO_nilobject) ? 0 - : luaV_lessthan(L, o1, o2); - lua_unlock(L); - return i; -} - - - -LUA_API lua_Number lua_tonumber (lua_State *L, int idx) { - TValue n; - const TValue *o = index2adr(L, idx); - if (tonumber(o, &n)) - return nvalue(o); - else - return 0; -} - - -LUA_API lua_Integer lua_tointeger (lua_State *L, int idx) { - TValue n; - const TValue *o = index2adr(L, idx); - if (tonumber(o, &n)) { - lua_Integer res; - lua_Number num = nvalue(o); - lua_number2integer(res, num); - return res; - } - else - return 0; -} - - -LUA_API int lua_toboolean (lua_State *L, int idx) { - const TValue *o = index2adr(L, idx); - return !l_isfalse(o); -} - - -LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) { - StkId o = index2adr(L, idx); - if (!ttisstring(o)) { - lua_lock(L); /* `luaV_tostring' may create a new string */ - if (!luaV_tostring(L, o)) { /* conversion failed? */ - if (len != NULL) *len = 0; - lua_unlock(L); - return NULL; - } - luaC_checkGC(L); - o = index2adr(L, idx); /* previous call may reallocate the stack */ - lua_unlock(L); - } - if (len != NULL) *len = tsvalue(o)->len; - return svalue(o); -} - - -LUA_API size_t lua_objlen (lua_State *L, int idx) { - StkId o = index2adr(L, idx); - switch (ttype(o)) { - case LUA_TSTRING: return tsvalue(o)->len; - case LUA_TUSERDATA: return uvalue(o)->len; - case LUA_TTABLE: return luaH_getn(hvalue(o)); - case LUA_TNUMBER: { - size_t l; - lua_lock(L); /* `luaV_tostring' may create a new string */ - l = (luaV_tostring(L, o) ? tsvalue(o)->len : 0); - lua_unlock(L); - return l; - } - default: return 0; - } -} - - -LUA_API lua_CFunction lua_tocfunction (lua_State *L, int idx) { - StkId o = index2adr(L, idx); - return (!iscfunction(o)) ? NULL : clvalue(o)->c.f; -} - - -LUA_API void *lua_touserdata (lua_State *L, int idx) { - StkId o = index2adr(L, idx); - switch (ttype(o)) { - case LUA_TUSERDATA: return (rawuvalue(o) + 1); - case LUA_TLIGHTUSERDATA: return pvalue(o); - default: return NULL; - } -} - - -LUA_API lua_State *lua_tothread (lua_State *L, int idx) { - StkId o = index2adr(L, idx); - return (!ttisthread(o)) ? NULL : thvalue(o); -} - - -LUA_API const void *lua_topointer (lua_State *L, int idx) { - StkId o = index2adr(L, idx); - switch (ttype(o)) { - case LUA_TTABLE: return hvalue(o); - case LUA_TFUNCTION: return clvalue(o); - case LUA_TTHREAD: return thvalue(o); - case LUA_TUSERDATA: - case LUA_TLIGHTUSERDATA: - return lua_touserdata(L, idx); - default: return NULL; - } -} - - - -/* -** push functions (C -> stack) -*/ - - -LUA_API void lua_pushnil (lua_State *L) { - lua_lock(L); - setnilvalue(L->top); - api_incr_top(L); - lua_unlock(L); -} - - -LUA_API void lua_pushnumber (lua_State *L, lua_Number n) { - lua_lock(L); - setnvalue(L->top, n); - api_incr_top(L); - lua_unlock(L); -} - - -LUA_API void lua_pushinteger (lua_State *L, lua_Integer n) { - lua_lock(L); - setnvalue(L->top, cast_num(n)); - api_incr_top(L); - lua_unlock(L); -} - - -LUA_API void lua_pushlstring (lua_State *L, const char *s, size_t len) { - lua_lock(L); - luaC_checkGC(L); - setsvalue2s(L, L->top, luaS_newlstr(L, s, len)); - api_incr_top(L); - lua_unlock(L); -} - - -LUA_API void lua_pushstring (lua_State *L, const char *s) { - if (s == NULL) - lua_pushnil(L); - else - lua_pushlstring(L, s, strlen(s)); -} - - -LUA_API const char *lua_pushvfstring (lua_State *L, const char *fmt, - va_list argp) { - const char *ret; - lua_lock(L); - luaC_checkGC(L); - ret = luaO_pushvfstring(L, fmt, argp); - lua_unlock(L); - return ret; -} - - -LUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...) { - const char *ret; - va_list argp; - lua_lock(L); - luaC_checkGC(L); - va_start(argp, fmt); - ret = luaO_pushvfstring(L, fmt, argp); - va_end(argp); - lua_unlock(L); - return ret; -} - - -LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) { - Closure *cl; - lua_lock(L); - luaC_checkGC(L); - api_checknelems(L, n); - cl = luaF_newCclosure(L, n, getcurrenv(L)); - cl->c.f = fn; - L->top -= n; - while (n--) - setobj2n(L, &cl->c.upvalue[n], L->top+n); - setclvalue(L, L->top, cl); - lua_assert(iswhite(obj2gco(cl))); - api_incr_top(L); - lua_unlock(L); -} - - -LUA_API void lua_pushboolean (lua_State *L, int b) { - lua_lock(L); - setbvalue(L->top, (b != 0)); /* ensure that true is 1 */ - api_incr_top(L); - lua_unlock(L); -} - - -LUA_API void lua_pushlightuserdata (lua_State *L, void *p) { - lua_lock(L); - setpvalue(L->top, p); - api_incr_top(L); - lua_unlock(L); -} - - -LUA_API int lua_pushthread (lua_State *L) { - lua_lock(L); - setthvalue(L, L->top, L); - api_incr_top(L); - lua_unlock(L); - return (G(L)->mainthread == L); -} - - - -/* -** get functions (Lua -> stack) -*/ - - -LUA_API void lua_gettable (lua_State *L, int idx) { - StkId t; - lua_lock(L); - t = index2adr(L, idx); - api_checkvalidindex(L, t); - luaV_gettable(L, t, L->top - 1, L->top - 1); - lua_unlock(L); -} - - -LUA_API void lua_getfield (lua_State *L, int idx, const char *k) { - StkId t; - TValue key; - lua_lock(L); - t = index2adr(L, idx); - api_checkvalidindex(L, t); - setsvalue(L, &key, luaS_new(L, k)); - luaV_gettable(L, t, &key, L->top); - api_incr_top(L); - lua_unlock(L); -} - - -LUA_API void lua_rawget (lua_State *L, int idx) { - StkId t; - lua_lock(L); - t = index2adr(L, idx); - api_check(L, ttistable(t)); - setobj2s(L, L->top - 1, luaH_get(hvalue(t), L->top - 1)); - lua_unlock(L); -} - - -LUA_API void lua_rawgeti (lua_State *L, int idx, int n) { - StkId o; - lua_lock(L); - o = index2adr(L, idx); - api_check(L, ttistable(o)); - setobj2s(L, L->top, luaH_getnum(hvalue(o), n)); - api_incr_top(L); - lua_unlock(L); -} - - -LUA_API void lua_createtable (lua_State *L, int narray, int nrec) { - lua_lock(L); - luaC_checkGC(L); - sethvalue(L, L->top, luaH_new(L, narray, nrec)); - api_incr_top(L); - lua_unlock(L); -} - - -LUA_API int lua_getmetatable (lua_State *L, int objindex) { - const TValue *obj; - Table *mt = NULL; - int res; - lua_lock(L); - obj = index2adr(L, objindex); - switch (ttype(obj)) { - case LUA_TTABLE: - mt = hvalue(obj)->metatable; - break; - case LUA_TUSERDATA: - mt = uvalue(obj)->metatable; - break; - default: - mt = G(L)->mt[ttype(obj)]; - break; - } - if (mt == NULL) - res = 0; - else { - sethvalue(L, L->top, mt); - api_incr_top(L); - res = 1; - } - lua_unlock(L); - return res; -} - - -LUA_API void lua_getfenv (lua_State *L, int idx) { - StkId o; - lua_lock(L); - o = index2adr(L, idx); - api_checkvalidindex(L, o); - switch (ttype(o)) { - case LUA_TFUNCTION: - sethvalue(L, L->top, clvalue(o)->c.env); - break; - case LUA_TUSERDATA: - sethvalue(L, L->top, uvalue(o)->env); - break; - case LUA_TTHREAD: - setobj2s(L, L->top, gt(thvalue(o))); - break; - default: - setnilvalue(L->top); - break; - } - api_incr_top(L); - lua_unlock(L); -} - - -/* -** set functions (stack -> Lua) -*/ - - -LUA_API void lua_settable (lua_State *L, int idx) { - StkId t; - lua_lock(L); - api_checknelems(L, 2); - t = index2adr(L, idx); - api_checkvalidindex(L, t); - luaV_settable(L, t, L->top - 2, L->top - 1); - L->top -= 2; /* pop index and value */ - lua_unlock(L); -} - - -LUA_API void lua_setfield (lua_State *L, int idx, const char *k) { - StkId t; - TValue key; - lua_lock(L); - api_checknelems(L, 1); - t = index2adr(L, idx); - api_checkvalidindex(L, t); - setsvalue(L, &key, luaS_new(L, k)); - luaV_settable(L, t, &key, L->top - 1); - L->top--; /* pop value */ - lua_unlock(L); -} - - -LUA_API void lua_rawset (lua_State *L, int idx) { - StkId t; - lua_lock(L); - api_checknelems(L, 2); - t = index2adr(L, idx); - api_check(L, ttistable(t)); - setobj2t(L, luaH_set(L, hvalue(t), L->top-2), L->top-1); - luaC_barriert(L, hvalue(t), L->top-1); - L->top -= 2; - lua_unlock(L); -} - - -LUA_API void lua_rawseti (lua_State *L, int idx, int n) { - StkId o; - lua_lock(L); - api_checknelems(L, 1); - o = index2adr(L, idx); - api_check(L, ttistable(o)); - setobj2t(L, luaH_setnum(L, hvalue(o), n), L->top-1); - luaC_barriert(L, hvalue(o), L->top-1); - L->top--; - lua_unlock(L); -} - - -LUA_API int lua_setmetatable (lua_State *L, int objindex) { - TValue *obj; - Table *mt; - lua_lock(L); - api_checknelems(L, 1); - obj = index2adr(L, objindex); - api_checkvalidindex(L, obj); - if (ttisnil(L->top - 1)) - mt = NULL; - else { - api_check(L, ttistable(L->top - 1)); - mt = hvalue(L->top - 1); - } - switch (ttype(obj)) { - case LUA_TTABLE: { - hvalue(obj)->metatable = mt; - if (mt) - luaC_objbarriert(L, hvalue(obj), mt); - break; - } - case LUA_TUSERDATA: { - uvalue(obj)->metatable = mt; - if (mt) - luaC_objbarrier(L, rawuvalue(obj), mt); - break; - } - default: { - G(L)->mt[ttype(obj)] = mt; - break; - } - } - L->top--; - lua_unlock(L); - return 1; -} - - -LUA_API int lua_setfenv (lua_State *L, int idx) { - StkId o; - int res = 1; - lua_lock(L); - api_checknelems(L, 1); - o = index2adr(L, idx); - api_checkvalidindex(L, o); - api_check(L, ttistable(L->top - 1)); - switch (ttype(o)) { - case LUA_TFUNCTION: - clvalue(o)->c.env = hvalue(L->top - 1); - break; - case LUA_TUSERDATA: - uvalue(o)->env = hvalue(L->top - 1); - break; - case LUA_TTHREAD: - sethvalue(L, gt(thvalue(o)), hvalue(L->top - 1)); - break; - default: - res = 0; - break; - } - luaC_objbarrier(L, gcvalue(o), hvalue(L->top - 1)); - L->top--; - lua_unlock(L); - return res; -} - - -/* -** `load' and `call' functions (run Lua code) -*/ - - -#define adjustresults(L,nres) \ - { if (nres == LUA_MULTRET && L->top >= L->ci->top) L->ci->top = L->top; } - - -#define checkresults(L,na,nr) \ - api_check(L, (nr) == LUA_MULTRET || (L->ci->top - L->top >= (nr) - (na))) - - -LUA_API void lua_call (lua_State *L, int nargs, int nresults) { - StkId func; - lua_lock(L); - api_checknelems(L, nargs+1); - checkresults(L, nargs, nresults); - func = L->top - (nargs+1); - luaD_call(L, func, nresults); - adjustresults(L, nresults); - lua_unlock(L); -} - - - -/* -** Execute a protected call. -*/ -struct CallS { /* data to `f_call' */ - StkId func; - int nresults; -}; - - -static void f_call (lua_State *L, void *ud) { - struct CallS *c = cast(struct CallS *, ud); - luaD_call(L, c->func, c->nresults); -} - - - -LUA_API int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc) { - struct CallS c; - int status; - ptrdiff_t func; - lua_lock(L); - api_checknelems(L, nargs+1); - checkresults(L, nargs, nresults); - if (errfunc == 0) - func = 0; - else { - StkId o = index2adr(L, errfunc); - api_checkvalidindex(L, o); - func = savestack(L, o); - } - c.func = L->top - (nargs+1); /* function to be called */ - c.nresults = nresults; - status = luaD_pcall(L, f_call, &c, savestack(L, c.func), func); - adjustresults(L, nresults); - lua_unlock(L); - return status; -} - - -/* -** Execute a protected C call. -*/ -struct CCallS { /* data to `f_Ccall' */ - lua_CFunction func; - void *ud; -}; - - -static void f_Ccall (lua_State *L, void *ud) { - struct CCallS *c = cast(struct CCallS *, ud); - Closure *cl; - cl = luaF_newCclosure(L, 0, getcurrenv(L)); - cl->c.f = c->func; - setclvalue(L, L->top, cl); /* push function */ - api_incr_top(L); - setpvalue(L->top, c->ud); /* push only argument */ - api_incr_top(L); - luaD_call(L, L->top - 2, 0); -} - - -LUA_API int lua_cpcall (lua_State *L, lua_CFunction func, void *ud) { - struct CCallS c; - int status; - lua_lock(L); - c.func = func; - c.ud = ud; - status = luaD_pcall(L, f_Ccall, &c, savestack(L, L->top), 0); - lua_unlock(L); - return status; -} - - -LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data, - const char *chunkname) { - ZIO z; - int status; - lua_lock(L); - if (!chunkname) chunkname = "?"; - luaZ_init(L, &z, reader, data); - status = luaD_protectedparser(L, &z, chunkname); - lua_unlock(L); - return status; -} - - -LUA_API int lua_dump (lua_State *L, lua_Writer writer, void *data) { - int status; - TValue *o; - lua_lock(L); - api_checknelems(L, 1); - o = L->top - 1; - if (isLfunction(o)) - status = luaU_dump(L, clvalue(o)->l.p, writer, data, 0); - else - status = 1; - lua_unlock(L); - return status; -} - - -LUA_API int lua_status (lua_State *L) { - return L->status; -} - - -/* -** Garbage-collection function -*/ - -LUA_API int lua_gc (lua_State *L, int what, int data) { - int res = 0; - global_State *g; - lua_lock(L); - g = G(L); - switch (what) { - case LUA_GCSTOP: { - g->GCthreshold = MAX_LUMEM; - break; - } - case LUA_GCRESTART: { - g->GCthreshold = g->totalbytes; - break; - } - case LUA_GCCOLLECT: { - luaC_fullgc(L); - break; - } - case LUA_GCCOUNT: { - /* GC values are expressed in Kbytes: #bytes/2^10 */ - res = cast_int(g->totalbytes >> 10); - break; - } - case LUA_GCCOUNTB: { - res = cast_int(g->totalbytes & 0x3ff); - break; - } - case LUA_GCSTEP: { - lu_mem a = (cast(lu_mem, data) << 10); - if (a <= g->totalbytes) - g->GCthreshold = g->totalbytes - a; - else - g->GCthreshold = 0; - while (g->GCthreshold <= g->totalbytes) - luaC_step(L); - if (g->gcstate == GCSpause) /* end of cycle? */ - res = 1; /* signal it */ - break; - } - case LUA_GCSETPAUSE: { - res = g->gcpause; - g->gcpause = data; - break; - } - case LUA_GCSETSTEPMUL: { - res = g->gcstepmul; - g->gcstepmul = data; - break; - } - default: res = -1; /* invalid option */ - } - lua_unlock(L); - return res; -} - - - -/* -** miscellaneous functions -*/ - - -LUA_API int lua_error (lua_State *L) { - lua_lock(L); - api_checknelems(L, 1); - luaG_errormsg(L); - lua_unlock(L); - return 0; /* to avoid warnings */ -} - - -LUA_API int lua_next (lua_State *L, int idx) { - StkId t; - int more; - lua_lock(L); - t = index2adr(L, idx); - api_check(L, ttistable(t)); - more = luaH_next(L, hvalue(t), L->top - 1); - if (more) { - api_incr_top(L); - } - else /* no more elements */ - L->top -= 1; /* remove key */ - lua_unlock(L); - return more; -} - - -LUA_API void lua_concat (lua_State *L, int n) { - lua_lock(L); - api_checknelems(L, n); - if (n >= 2) { - luaC_checkGC(L); - luaV_concat(L, n, cast_int(L->top - L->base) - 1); - L->top -= (n-1); - } - else if (n == 0) { /* push empty string */ - setsvalue2s(L, L->top, luaS_newlstr(L, "", 0)); - api_incr_top(L); - } - /* else n == 1; nothing to do */ - lua_unlock(L); -} - - -LUA_API lua_Alloc lua_getallocf (lua_State *L, void **ud) { - lua_Alloc f; - lua_lock(L); - if (ud) *ud = G(L)->ud; - f = G(L)->frealloc; - lua_unlock(L); - return f; -} - - -LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud) { - lua_lock(L); - G(L)->ud = ud; - G(L)->frealloc = f; - lua_unlock(L); -} - - -LUA_API void *lua_newuserdata (lua_State *L, size_t size) { - Udata *u; - lua_lock(L); - luaC_checkGC(L); - u = luaS_newudata(L, size, getcurrenv(L)); - setuvalue(L, L->top, u); - api_incr_top(L); - lua_unlock(L); - return u + 1; -} - - - - -static const char *aux_upvalue (StkId fi, int n, TValue **val) { - Closure *f; - if (!ttisfunction(fi)) return NULL; - f = clvalue(fi); - if (f->c.isC) { - if (!(1 <= n && n <= f->c.nupvalues)) return NULL; - *val = &f->c.upvalue[n-1]; - return ""; - } - else { - Proto *p = f->l.p; - if (!(1 <= n && n <= p->sizeupvalues)) return NULL; - *val = f->l.upvals[n-1]->v; - return getstr(p->upvalues[n-1]); - } -} - - -LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) { - const char *name; - TValue *val; - lua_lock(L); - name = aux_upvalue(index2adr(L, funcindex), n, &val); - if (name) { - setobj2s(L, L->top, val); - api_incr_top(L); - } - lua_unlock(L); - return name; -} - - -LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) { - const char *name; - TValue *val; - StkId fi; - lua_lock(L); - fi = index2adr(L, funcindex); - api_checknelems(L, 1); - name = aux_upvalue(fi, n, &val); - if (name) { - L->top--; - setobj(L, val, L->top); - luaC_barrier(L, clvalue(fi), L->top); - } - lua_unlock(L); - return name; -} diff --git a/uppdev/lua/src/lapi.h b/uppdev/lua/src/lapi.h deleted file mode 100644 index e6864e4d9..000000000 --- a/uppdev/lua/src/lapi.h +++ /dev/null @@ -1,16 +0,0 @@ -/* -** $Id: lapi.h,v 2.2 2005/04/25 19:24:10 roberto Exp $ -** Auxiliary functions from Lua API -** See Copyright Notice in lua.h -*/ - -#ifndef lapi_h -#define lapi_h - - -#include "lobject.h" - - -LUAI_FUNC void luaA_pushobject (lua_State *L, const TValue *o); - -#endif diff --git a/uppdev/lua/src/lauxlib.c b/uppdev/lua/src/lauxlib.c deleted file mode 100644 index cc508d8bc..000000000 --- a/uppdev/lua/src/lauxlib.c +++ /dev/null @@ -1,652 +0,0 @@ -/* -** $Id: lauxlib.c,v 1.159 2006/03/21 19:31:09 roberto Exp $ -** Auxiliary functions for building Lua libraries -** See Copyright Notice in lua.h -*/ - - -#include -#include -#include -#include -#include -#include - - -/* This file uses only the official API of Lua. -** Any function declared here could be written as an application function. -*/ - -#define lauxlib_c -#define LUA_LIB - -#include "lua.h" - -#include "lauxlib.h" - - -#define FREELIST_REF 0 /* free list of references */ - - -/* convert a stack index to positive */ -#define abs_index(L, i) ((i) > 0 || (i) <= LUA_REGISTRYINDEX ? (i) : \ - lua_gettop(L) + (i) + 1) - - -/* -** {====================================================== -** Error-report functions -** ======================================================= -*/ - - -LUALIB_API int luaL_argerror (lua_State *L, int narg, const char *extramsg) { - lua_Debug ar; - if (!lua_getstack(L, 0, &ar)) /* no stack frame? */ - return luaL_error(L, "bad argument #%d (%s)", narg, extramsg); - lua_getinfo(L, "n", &ar); - if (strcmp(ar.namewhat, "method") == 0) { - narg--; /* do not count `self' */ - if (narg == 0) /* error is in the self argument itself? */ - return luaL_error(L, "calling " LUA_QS " on bad self (%s)", - ar.name, extramsg); - } - if (ar.name == NULL) - ar.name = "?"; - return luaL_error(L, "bad argument #%d to " LUA_QS " (%s)", - narg, ar.name, extramsg); -} - - -LUALIB_API int luaL_typerror (lua_State *L, int narg, const char *tname) { - const char *msg = lua_pushfstring(L, "%s expected, got %s", - tname, luaL_typename(L, narg)); - return luaL_argerror(L, narg, msg); -} - - -static void tag_error (lua_State *L, int narg, int tag) { - luaL_typerror(L, narg, lua_typename(L, tag)); -} - - -LUALIB_API void luaL_where (lua_State *L, int level) { - lua_Debug ar; - if (lua_getstack(L, level, &ar)) { /* check function at level */ - lua_getinfo(L, "Sl", &ar); /* get info about it */ - if (ar.currentline > 0) { /* is there info? */ - lua_pushfstring(L, "%s:%d: ", ar.short_src, ar.currentline); - return; - } - } - lua_pushliteral(L, ""); /* else, no information available... */ -} - - -LUALIB_API int luaL_error (lua_State *L, const char *fmt, ...) { - va_list argp; - va_start(argp, fmt); - luaL_where(L, 1); - lua_pushvfstring(L, fmt, argp); - va_end(argp); - lua_concat(L, 2); - return lua_error(L); -} - -/* }====================================================== */ - - -LUALIB_API int luaL_checkoption (lua_State *L, int narg, const char *def, - const char *const lst[]) { - const char *name = (def) ? luaL_optstring(L, narg, def) : - luaL_checkstring(L, narg); - int i; - for (i=0; lst[i]; i++) - if (strcmp(lst[i], name) == 0) - return i; - return luaL_argerror(L, narg, - lua_pushfstring(L, "invalid option " LUA_QS, name)); -} - - -LUALIB_API int luaL_newmetatable (lua_State *L, const char *tname) { - lua_getfield(L, LUA_REGISTRYINDEX, tname); /* get registry.name */ - if (!lua_isnil(L, -1)) /* name already in use? */ - return 0; /* leave previous value on top, but return 0 */ - lua_pop(L, 1); - lua_newtable(L); /* create metatable */ - lua_pushvalue(L, -1); - lua_setfield(L, LUA_REGISTRYINDEX, tname); /* registry.name = metatable */ - return 1; -} - - -LUALIB_API void *luaL_checkudata (lua_State *L, int ud, const char *tname) { - void *p = lua_touserdata(L, ud); - if (p != NULL) { /* value is a userdata? */ - if (lua_getmetatable(L, ud)) { /* does it have a metatable? */ - lua_getfield(L, LUA_REGISTRYINDEX, tname); /* get correct metatable */ - if (lua_rawequal(L, -1, -2)) { /* does it have the correct mt? */ - lua_pop(L, 2); /* remove both metatables */ - return p; - } - } - } - luaL_typerror(L, ud, tname); /* else error */ - return NULL; /* to avoid warnings */ -} - - -LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *mes) { - if (!lua_checkstack(L, space)) - luaL_error(L, "stack overflow (%s)", mes); -} - - -LUALIB_API void luaL_checktype (lua_State *L, int narg, int t) { - if (lua_type(L, narg) != t) - tag_error(L, narg, t); -} - - -LUALIB_API void luaL_checkany (lua_State *L, int narg) { - if (lua_type(L, narg) == LUA_TNONE) - luaL_argerror(L, narg, "value expected"); -} - - -LUALIB_API const char *luaL_checklstring (lua_State *L, int narg, size_t *len) { - const char *s = lua_tolstring(L, narg, len); - if (!s) tag_error(L, narg, LUA_TSTRING); - return s; -} - - -LUALIB_API const char *luaL_optlstring (lua_State *L, int narg, - const char *def, size_t *len) { - if (lua_isnoneornil(L, narg)) { - if (len) - *len = (def ? strlen(def) : 0); - return def; - } - else return luaL_checklstring(L, narg, len); -} - - -LUALIB_API lua_Number luaL_checknumber (lua_State *L, int narg) { - lua_Number d = lua_tonumber(L, narg); - if (d == 0 && !lua_isnumber(L, narg)) /* avoid extra test when d is not 0 */ - tag_error(L, narg, LUA_TNUMBER); - return d; -} - - -LUALIB_API lua_Number luaL_optnumber (lua_State *L, int narg, lua_Number def) { - return luaL_opt(L, luaL_checknumber, narg, def); -} - - -LUALIB_API lua_Integer luaL_checkinteger (lua_State *L, int narg) { - lua_Integer d = lua_tointeger(L, narg); - if (d == 0 && !lua_isnumber(L, narg)) /* avoid extra test when d is not 0 */ - tag_error(L, narg, LUA_TNUMBER); - return d; -} - - -LUALIB_API lua_Integer luaL_optinteger (lua_State *L, int narg, - lua_Integer def) { - return luaL_opt(L, luaL_checkinteger, narg, def); -} - - -LUALIB_API int luaL_getmetafield (lua_State *L, int obj, const char *event) { - if (!lua_getmetatable(L, obj)) /* no metatable? */ - return 0; - lua_pushstring(L, event); - lua_rawget(L, -2); - if (lua_isnil(L, -1)) { - lua_pop(L, 2); /* remove metatable and metafield */ - return 0; - } - else { - lua_remove(L, -2); /* remove only metatable */ - return 1; - } -} - - -LUALIB_API int luaL_callmeta (lua_State *L, int obj, const char *event) { - obj = abs_index(L, obj); - if (!luaL_getmetafield(L, obj, event)) /* no metafield? */ - return 0; - lua_pushvalue(L, obj); - lua_call(L, 1, 1); - return 1; -} - - -LUALIB_API void (luaL_register) (lua_State *L, const char *libname, - const luaL_Reg *l) { - luaI_openlib(L, libname, l, 0); -} - - -static int libsize (const luaL_Reg *l) { - int size = 0; - for (; l->name; l++) size++; - return size; -} - - -LUALIB_API void luaI_openlib (lua_State *L, const char *libname, - const luaL_Reg *l, int nup) { - if (libname) { - int size = libsize(l); - /* check whether lib already exists */ - luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", size); - lua_getfield(L, -1, libname); /* get _LOADED[libname] */ - if (!lua_istable(L, -1)) { /* not found? */ - lua_pop(L, 1); /* remove previous result */ - /* try global variable (and create one if it does not exist) */ - if (luaL_findtable(L, LUA_GLOBALSINDEX, libname, size) != NULL) - luaL_error(L, "name conflict for module " LUA_QS, libname); - lua_pushvalue(L, -1); - lua_setfield(L, -3, libname); /* _LOADED[libname] = new table */ - } - lua_remove(L, -2); /* remove _LOADED table */ - lua_insert(L, -(nup+1)); /* move library table to below upvalues */ - } - for (; l->name; l++) { - int i; - for (i=0; ifunc, nup); - lua_setfield(L, -(nup+2), l->name); - } - lua_pop(L, nup); /* remove upvalues */ -} - - - -/* -** {====================================================== -** getn-setn: size for arrays -** ======================================================= -*/ - -#if defined(LUA_COMPAT_GETN) - -static int checkint (lua_State *L, int topop) { - int n = (lua_type(L, -1) == LUA_TNUMBER) ? lua_tointeger(L, -1) : -1; - lua_pop(L, topop); - return n; -} - - -static void getsizes (lua_State *L) { - lua_getfield(L, LUA_REGISTRYINDEX, "LUA_SIZES"); - if (lua_isnil(L, -1)) { /* no `size' table? */ - lua_pop(L, 1); /* remove nil */ - lua_newtable(L); /* create it */ - lua_pushvalue(L, -1); /* `size' will be its own metatable */ - lua_setmetatable(L, -2); - lua_pushliteral(L, "kv"); - lua_setfield(L, -2, "__mode"); /* metatable(N).__mode = "kv" */ - lua_pushvalue(L, -1); - lua_setfield(L, LUA_REGISTRYINDEX, "LUA_SIZES"); /* store in register */ - } -} - - -LUALIB_API void luaL_setn (lua_State *L, int t, int n) { - t = abs_index(L, t); - lua_pushliteral(L, "n"); - lua_rawget(L, t); - if (checkint(L, 1) >= 0) { /* is there a numeric field `n'? */ - lua_pushliteral(L, "n"); /* use it */ - lua_pushinteger(L, n); - lua_rawset(L, t); - } - else { /* use `sizes' */ - getsizes(L); - lua_pushvalue(L, t); - lua_pushinteger(L, n); - lua_rawset(L, -3); /* sizes[t] = n */ - lua_pop(L, 1); /* remove `sizes' */ - } -} - - -LUALIB_API int luaL_getn (lua_State *L, int t) { - int n; - t = abs_index(L, t); - lua_pushliteral(L, "n"); /* try t.n */ - lua_rawget(L, t); - if ((n = checkint(L, 1)) >= 0) return n; - getsizes(L); /* else try sizes[t] */ - lua_pushvalue(L, t); - lua_rawget(L, -2); - if ((n = checkint(L, 2)) >= 0) return n; - return (int)lua_objlen(L, t); -} - -#endif - -/* }====================================================== */ - - - -LUALIB_API const char *luaL_gsub (lua_State *L, const char *s, const char *p, - const char *r) { - const char *wild; - size_t l = strlen(p); - luaL_Buffer b; - luaL_buffinit(L, &b); - while ((wild = strstr(s, p)) != NULL) { - luaL_addlstring(&b, s, wild - s); /* push prefix */ - luaL_addstring(&b, r); /* push replacement in place of pattern */ - s = wild + l; /* continue after `p' */ - } - luaL_addstring(&b, s); /* push last suffix */ - luaL_pushresult(&b); - return lua_tostring(L, -1); -} - - -LUALIB_API const char *luaL_findtable (lua_State *L, int idx, - const char *fname, int szhint) { - const char *e; - lua_pushvalue(L, idx); - do { - e = strchr(fname, '.'); - if (e == NULL) e = fname + strlen(fname); - lua_pushlstring(L, fname, e - fname); - lua_rawget(L, -2); - if (lua_isnil(L, -1)) { /* no such field? */ - lua_pop(L, 1); /* remove this nil */ - lua_createtable(L, 0, (*e == '.' ? 1 : szhint)); /* new table for field */ - lua_pushlstring(L, fname, e - fname); - lua_pushvalue(L, -2); - lua_settable(L, -4); /* set new table into field */ - } - else if (!lua_istable(L, -1)) { /* field has a non-table value? */ - lua_pop(L, 2); /* remove table and value */ - return fname; /* return problematic part of the name */ - } - lua_remove(L, -2); /* remove previous table */ - fname = e + 1; - } while (*e == '.'); - return NULL; -} - - - -/* -** {====================================================== -** Generic Buffer manipulation -** ======================================================= -*/ - - -#define bufflen(B) ((B)->p - (B)->buffer) -#define bufffree(B) ((size_t)(LUAL_BUFFERSIZE - bufflen(B))) - -#define LIMIT (LUA_MINSTACK/2) - - -static int emptybuffer (luaL_Buffer *B) { - size_t l = bufflen(B); - if (l == 0) return 0; /* put nothing on stack */ - else { - lua_pushlstring(B->L, B->buffer, l); - B->p = B->buffer; - B->lvl++; - return 1; - } -} - - -static void adjuststack (luaL_Buffer *B) { - if (B->lvl > 1) { - lua_State *L = B->L; - int toget = 1; /* number of levels to concat */ - size_t toplen = lua_strlen(L, -1); - do { - size_t l = lua_strlen(L, -(toget+1)); - if (B->lvl - toget + 1 >= LIMIT || toplen > l) { - toplen += l; - toget++; - } - else break; - } while (toget < B->lvl); - lua_concat(L, toget); - B->lvl = B->lvl - toget + 1; - } -} - - -LUALIB_API char *luaL_prepbuffer (luaL_Buffer *B) { - if (emptybuffer(B)) - adjuststack(B); - return B->buffer; -} - - -LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) { - while (l--) - luaL_addchar(B, *s++); -} - - -LUALIB_API void luaL_addstring (luaL_Buffer *B, const char *s) { - luaL_addlstring(B, s, strlen(s)); -} - - -LUALIB_API void luaL_pushresult (luaL_Buffer *B) { - emptybuffer(B); - lua_concat(B->L, B->lvl); - B->lvl = 1; -} - - -LUALIB_API void luaL_addvalue (luaL_Buffer *B) { - lua_State *L = B->L; - size_t vl; - const char *s = lua_tolstring(L, -1, &vl); - if (vl <= bufffree(B)) { /* fit into buffer? */ - memcpy(B->p, s, vl); /* put it there */ - B->p += vl; - lua_pop(L, 1); /* remove from stack */ - } - else { - if (emptybuffer(B)) - lua_insert(L, -2); /* put buffer before new value */ - B->lvl++; /* add new value into B stack */ - adjuststack(B); - } -} - - -LUALIB_API void luaL_buffinit (lua_State *L, luaL_Buffer *B) { - B->L = L; - B->p = B->buffer; - B->lvl = 0; -} - -/* }====================================================== */ - - -LUALIB_API int luaL_ref (lua_State *L, int t) { - int ref; - t = abs_index(L, t); - if (lua_isnil(L, -1)) { - lua_pop(L, 1); /* remove from stack */ - return LUA_REFNIL; /* `nil' has a unique fixed reference */ - } - lua_rawgeti(L, t, FREELIST_REF); /* get first free element */ - ref = (int)lua_tointeger(L, -1); /* ref = t[FREELIST_REF] */ - lua_pop(L, 1); /* remove it from stack */ - if (ref != 0) { /* any free element? */ - lua_rawgeti(L, t, ref); /* remove it from list */ - lua_rawseti(L, t, FREELIST_REF); /* (t[FREELIST_REF] = t[ref]) */ - } - else { /* no free elements */ - ref = (int)lua_objlen(L, t); - ref++; /* create new reference */ - } - lua_rawseti(L, t, ref); - return ref; -} - - -LUALIB_API void luaL_unref (lua_State *L, int t, int ref) { - if (ref >= 0) { - t = abs_index(L, t); - lua_rawgeti(L, t, FREELIST_REF); - lua_rawseti(L, t, ref); /* t[ref] = t[FREELIST_REF] */ - lua_pushinteger(L, ref); - lua_rawseti(L, t, FREELIST_REF); /* t[FREELIST_REF] = ref */ - } -} - - - -/* -** {====================================================== -** Load functions -** ======================================================= -*/ - -typedef struct LoadF { - int extraline; - FILE *f; - char buff[LUAL_BUFFERSIZE]; -} LoadF; - - -static const char *getF (lua_State *L, void *ud, size_t *size) { - LoadF *lf = (LoadF *)ud; - (void)L; - if (lf->extraline) { - lf->extraline = 0; - *size = 1; - return "\n"; - } - if (feof(lf->f)) return NULL; - *size = fread(lf->buff, 1, LUAL_BUFFERSIZE, lf->f); - return (*size > 0) ? lf->buff : NULL; -} - - -static int errfile (lua_State *L, const char *what, int fnameindex) { - const char *serr = strerror(errno); - const char *filename = lua_tostring(L, fnameindex) + 1; - lua_pushfstring(L, "cannot %s %s: %s", what, filename, serr); - lua_remove(L, fnameindex); - return LUA_ERRFILE; -} - - -LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) { - LoadF lf; - int status, readstatus; - int c; - int fnameindex = lua_gettop(L) + 1; /* index of filename on the stack */ - lf.extraline = 0; - if (filename == NULL) { - lua_pushliteral(L, "=stdin"); - lf.f = stdin; - } - else { - lua_pushfstring(L, "@%s", filename); - lf.f = fopen(filename, "r"); - if (lf.f == NULL) return errfile(L, "open", fnameindex); - } - c = getc(lf.f); - if (c == '#') { /* Unix exec. file? */ - lf.extraline = 1; - while ((c = getc(lf.f)) != EOF && c != '\n') ; /* skip first line */ - if (c == '\n') c = getc(lf.f); - } - if (c == LUA_SIGNATURE[0] && lf.f != stdin) { /* binary file? */ - fclose(lf.f); - lf.f = fopen(filename, "rb"); /* reopen in binary mode */ - if (lf.f == NULL) return errfile(L, "reopen", fnameindex); - /* skip eventual `#!...' */ - while ((c = getc(lf.f)) != EOF && c != LUA_SIGNATURE[0]) ; - lf.extraline = 0; - } - ungetc(c, lf.f); - status = lua_load(L, getF, &lf, lua_tostring(L, -1)); - readstatus = ferror(lf.f); - if (lf.f != stdin) fclose(lf.f); /* close file (even in case of errors) */ - if (readstatus) { - lua_settop(L, fnameindex); /* ignore results from `lua_load' */ - return errfile(L, "read", fnameindex); - } - lua_remove(L, fnameindex); - return status; -} - - -typedef struct LoadS { - const char *s; - size_t size; -} LoadS; - - -static const char *getS (lua_State *L, void *ud, size_t *size) { - LoadS *ls = (LoadS *)ud; - (void)L; - if (ls->size == 0) return NULL; - *size = ls->size; - ls->size = 0; - return ls->s; -} - - -LUALIB_API int luaL_loadbuffer (lua_State *L, const char *buff, size_t size, - const char *name) { - LoadS ls; - ls.s = buff; - ls.size = size; - return lua_load(L, getS, &ls, name); -} - - -LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s) { - return luaL_loadbuffer(L, s, strlen(s), s); -} - - - -/* }====================================================== */ - - -static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) { - (void)ud; - (void)osize; - if (nsize == 0) { - free(ptr); - return NULL; - } - else - return realloc(ptr, nsize); -} - - -static int panic (lua_State *L) { - (void)L; /* to avoid warnings */ - fprintf(stderr, "PANIC: unprotected error in call to Lua API (%s)\n", - lua_tostring(L, -1)); - return 0; -} - - -LUALIB_API lua_State *luaL_newstate (void) { - lua_State *L = lua_newstate(l_alloc, NULL); - if (L) lua_atpanic(L, &panic); - return L; -} diff --git a/uppdev/lua/src/lauxlib.h b/uppdev/lua/src/lauxlib.h deleted file mode 100644 index 20976c5eb..000000000 --- a/uppdev/lua/src/lauxlib.h +++ /dev/null @@ -1,172 +0,0 @@ -/* -** $Id: lauxlib.h,v 1.88 2006/04/12 20:31:15 roberto Exp $ -** Auxiliary functions for building Lua libraries -** See Copyright Notice in lua.h -*/ - - -#ifndef lauxlib_h -#define lauxlib_h - - -#include -#include - -#include "lua.h" - - -#if defined(LUA_COMPAT_GETN) -LUALIB_API int (luaL_getn) (lua_State *L, int t); -LUALIB_API void (luaL_setn) (lua_State *L, int t, int n); -#else -#define luaL_getn(L,i) ((int)lua_objlen(L, i)) -#define luaL_setn(L,i,j) ((void)0) /* no op! */ -#endif - -#if defined(LUA_COMPAT_OPENLIB) -#define luaI_openlib luaL_openlib -#endif - - -/* extra error code for `luaL_load' */ -#define LUA_ERRFILE (LUA_ERRERR+1) - - -typedef struct luaL_Reg { - const char *name; - lua_CFunction func; -} luaL_Reg; - - - -LUALIB_API void (luaI_openlib) (lua_State *L, const char *libname, - const luaL_Reg *l, int nup); -LUALIB_API void (luaL_register) (lua_State *L, const char *libname, - const luaL_Reg *l); -LUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e); -LUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e); -LUALIB_API int (luaL_typerror) (lua_State *L, int narg, const char *tname); -LUALIB_API int (luaL_argerror) (lua_State *L, int numarg, const char *extramsg); -LUALIB_API const char *(luaL_checklstring) (lua_State *L, int numArg, - size_t *l); -LUALIB_API const char *(luaL_optlstring) (lua_State *L, int numArg, - const char *def, size_t *l); -LUALIB_API lua_Number (luaL_checknumber) (lua_State *L, int numArg); -LUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int nArg, lua_Number def); - -LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int numArg); -LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int nArg, - lua_Integer def); - -LUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg); -LUALIB_API void (luaL_checktype) (lua_State *L, int narg, int t); -LUALIB_API void (luaL_checkany) (lua_State *L, int narg); - -LUALIB_API int (luaL_newmetatable) (lua_State *L, const char *tname); -LUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname); - -LUALIB_API void (luaL_where) (lua_State *L, int lvl); -LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...); - -LUALIB_API int (luaL_checkoption) (lua_State *L, int narg, const char *def, - const char *const lst[]); - -LUALIB_API int (luaL_ref) (lua_State *L, int t); -LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref); - -LUALIB_API int (luaL_loadfile) (lua_State *L, const char *filename); -LUALIB_API int (luaL_loadbuffer) (lua_State *L, const char *buff, size_t sz, - const char *name); -LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s); - -LUALIB_API lua_State *(luaL_newstate) (void); - - -LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, const char *p, - const char *r); - -LUALIB_API const char *(luaL_findtable) (lua_State *L, int idx, - const char *fname, int szhint); - - - - -/* -** =============================================================== -** some useful macros -** =============================================================== -*/ - -#define luaL_argcheck(L, cond,numarg,extramsg) \ - ((void)((cond) || luaL_argerror(L, (numarg), (extramsg)))) -#define luaL_checkstring(L,n) (luaL_checklstring(L, (n), NULL)) -#define luaL_optstring(L,n,d) (luaL_optlstring(L, (n), (d), NULL)) -#define luaL_checkint(L,n) ((int)luaL_checkinteger(L, (n))) -#define luaL_optint(L,n,d) ((int)luaL_optinteger(L, (n), (d))) -#define luaL_checklong(L,n) ((long)luaL_checkinteger(L, (n))) -#define luaL_optlong(L,n,d) ((long)luaL_optinteger(L, (n), (d))) - -#define luaL_typename(L,i) lua_typename(L, lua_type(L,(i))) - -#define luaL_dofile(L, fn) \ - (luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0)) - -#define luaL_dostring(L, s) \ - (luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0)) - -#define luaL_getmetatable(L,n) (lua_getfield(L, LUA_REGISTRYINDEX, (n))) - -#define luaL_opt(L,f,n,d) (lua_isnoneornil(L,(n)) ? (d) : f(L,(n))) - -/* -** {====================================================== -** Generic Buffer manipulation -** ======================================================= -*/ - - - -typedef struct luaL_Buffer { - char *p; /* current position in buffer */ - int lvl; /* number of strings in the stack (level) */ - lua_State *L; - char buffer[LUAL_BUFFERSIZE]; -} luaL_Buffer; - -#define luaL_addchar(B,c) \ - ((void)((B)->p < ((B)->buffer+LUAL_BUFFERSIZE) || luaL_prepbuffer(B)), \ - (*(B)->p++ = (char)(c))) - -/* compatibility only */ -#define luaL_putchar(B,c) luaL_addchar(B,c) - -#define luaL_addsize(B,n) ((B)->p += (n)) - -LUALIB_API void (luaL_buffinit) (lua_State *L, luaL_Buffer *B); -LUALIB_API char *(luaL_prepbuffer) (luaL_Buffer *B); -LUALIB_API void (luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l); -LUALIB_API void (luaL_addstring) (luaL_Buffer *B, const char *s); -LUALIB_API void (luaL_addvalue) (luaL_Buffer *B); -LUALIB_API void (luaL_pushresult) (luaL_Buffer *B); - - -/* }====================================================== */ - - -/* compatibility with ref system */ - -/* pre-defined references */ -#define LUA_NOREF (-2) -#define LUA_REFNIL (-1) - -#define lua_ref(L,lock) ((lock) ? luaL_ref(L, LUA_REGISTRYINDEX) : \ - (lua_pushstring(L, "unlocked references are obsolete"), lua_error(L), 0)) - -#define lua_unref(L,ref) luaL_unref(L, LUA_REGISTRYINDEX, (ref)) - -#define lua_getref(L,ref) lua_rawgeti(L, LUA_REGISTRYINDEX, (ref)) - - -#define luaL_reg luaL_Reg - -#endif diff --git a/uppdev/lua/src/lbaselib.c b/uppdev/lua/src/lbaselib.c deleted file mode 100644 index 756491e59..000000000 --- a/uppdev/lua/src/lbaselib.c +++ /dev/null @@ -1,642 +0,0 @@ -/* -** $Id: lbaselib.c,v 1.191 2006/06/02 15:34:00 roberto Exp $ -** Basic library -** See Copyright Notice in lua.h -*/ - - - -#include -#include -#include -#include - -#define lbaselib_c -#define LUA_LIB - -#include "lua.h" - -#include "lauxlib.h" -#include "lualib.h" - - - - -/* -** If your system does not support `stdout', you can just remove this function. -** If you need, you can define your own `print' function, following this -** model but changing `fputs' to put the strings at a proper place -** (a console window or a log file, for instance). -*/ -static int luaB_print (lua_State *L) { - int n = lua_gettop(L); /* number of arguments */ - int i; - lua_getglobal(L, "tostring"); - for (i=1; i<=n; i++) { - const char *s; - lua_pushvalue(L, -1); /* function to be called */ - lua_pushvalue(L, i); /* value to print */ - lua_call(L, 1, 1); - s = lua_tostring(L, -1); /* get result */ - if (s == NULL) - return luaL_error(L, LUA_QL("tostring") " must return a string to " - LUA_QL("print")); - if (i>1) fputs("\t", stdout); - fputs(s, stdout); - lua_pop(L, 1); /* pop result */ - } - fputs("\n", stdout); - return 0; -} - - -static int luaB_tonumber (lua_State *L) { - int base = luaL_optint(L, 2, 10); - if (base == 10) { /* standard conversion */ - luaL_checkany(L, 1); - if (lua_isnumber(L, 1)) { - lua_pushnumber(L, lua_tonumber(L, 1)); - return 1; - } - } - else { - const char *s1 = luaL_checkstring(L, 1); - char *s2; - unsigned long n; - luaL_argcheck(L, 2 <= base && base <= 36, 2, "base out of range"); - n = strtoul(s1, &s2, base); - if (s1 != s2) { /* at least one valid digit? */ - while (isspace((unsigned char)(*s2))) s2++; /* skip trailing spaces */ - if (*s2 == '\0') { /* no invalid trailing characters? */ - lua_pushnumber(L, (lua_Number)n); - return 1; - } - } - } - lua_pushnil(L); /* else not a number */ - return 1; -} - - -static int luaB_error (lua_State *L) { - int level = luaL_optint(L, 2, 1); - lua_settop(L, 1); - if (lua_isstring(L, 1) && level > 0) { /* add extra information? */ - luaL_where(L, level); - lua_pushvalue(L, 1); - lua_concat(L, 2); - } - return lua_error(L); -} - - -static int luaB_getmetatable (lua_State *L) { - luaL_checkany(L, 1); - if (!lua_getmetatable(L, 1)) { - lua_pushnil(L); - return 1; /* no metatable */ - } - luaL_getmetafield(L, 1, "__metatable"); - return 1; /* returns either __metatable field (if present) or metatable */ -} - - -static int luaB_setmetatable (lua_State *L) { - int t = lua_type(L, 2); - luaL_checktype(L, 1, LUA_TTABLE); - luaL_argcheck(L, t == LUA_TNIL || t == LUA_TTABLE, 2, - "nil or table expected"); - if (luaL_getmetafield(L, 1, "__metatable")) - luaL_error(L, "cannot change a protected metatable"); - lua_settop(L, 2); - lua_setmetatable(L, 1); - return 1; -} - - -static void getfunc (lua_State *L) { - if (lua_isfunction(L, 1)) lua_pushvalue(L, 1); - else { - lua_Debug ar; - int level = luaL_optint(L, 1, 1); - luaL_argcheck(L, level >= 0, 1, "level must be non-negative"); - if (lua_getstack(L, level, &ar) == 0) - luaL_argerror(L, 1, "invalid level"); - lua_getinfo(L, "f", &ar); - if (lua_isnil(L, -1)) - luaL_error(L, "no function environment for tail call at level %d", - level); - } -} - - -static int luaB_getfenv (lua_State *L) { - getfunc(L); - if (lua_iscfunction(L, -1)) /* is a C function? */ - lua_pushvalue(L, LUA_GLOBALSINDEX); /* return the thread's global env. */ - else - lua_getfenv(L, -1); - return 1; -} - - -static int luaB_setfenv (lua_State *L) { - luaL_checktype(L, 2, LUA_TTABLE); - getfunc(L); - lua_pushvalue(L, 2); - if (lua_isnumber(L, 1) && lua_tonumber(L, 1) == 0) { - /* change environment of current thread */ - lua_pushthread(L); - lua_insert(L, -2); - lua_setfenv(L, -2); - return 0; - } - else if (lua_iscfunction(L, -2) || lua_setfenv(L, -2) == 0) - luaL_error(L, - LUA_QL("setfenv") " cannot change environment of given object"); - return 1; -} - - -static int luaB_rawequal (lua_State *L) { - luaL_checkany(L, 1); - luaL_checkany(L, 2); - lua_pushboolean(L, lua_rawequal(L, 1, 2)); - return 1; -} - - -static int luaB_rawget (lua_State *L) { - luaL_checktype(L, 1, LUA_TTABLE); - luaL_checkany(L, 2); - lua_settop(L, 2); - lua_rawget(L, 1); - return 1; -} - -static int luaB_rawset (lua_State *L) { - luaL_checktype(L, 1, LUA_TTABLE); - luaL_checkany(L, 2); - luaL_checkany(L, 3); - lua_settop(L, 3); - lua_rawset(L, 1); - return 1; -} - - -static int luaB_gcinfo (lua_State *L) { - lua_pushinteger(L, lua_getgccount(L)); - return 1; -} - - -static int luaB_collectgarbage (lua_State *L) { - static const char *const opts[] = {"stop", "restart", "collect", - "count", "step", "setpause", "setstepmul", NULL}; - static const int optsnum[] = {LUA_GCSTOP, LUA_GCRESTART, LUA_GCCOLLECT, - LUA_GCCOUNT, LUA_GCSTEP, LUA_GCSETPAUSE, LUA_GCSETSTEPMUL}; - int o = luaL_checkoption(L, 1, "collect", opts); - int ex = luaL_optint(L, 2, 0); - int res = lua_gc(L, optsnum[o], ex); - switch (optsnum[o]) { - case LUA_GCCOUNT: { - int b = lua_gc(L, LUA_GCCOUNTB, 0); - lua_pushnumber(L, res + ((lua_Number)b/1024)); - return 1; - } - case LUA_GCSTEP: { - lua_pushboolean(L, res); - return 1; - } - default: { - lua_pushnumber(L, res); - return 1; - } - } -} - - -static int luaB_type (lua_State *L) { - luaL_checkany(L, 1); - lua_pushstring(L, luaL_typename(L, 1)); - return 1; -} - - -static int luaB_next (lua_State *L) { - luaL_checktype(L, 1, LUA_TTABLE); - lua_settop(L, 2); /* create a 2nd argument if there isn't one */ - if (lua_next(L, 1)) - return 2; - else { - lua_pushnil(L); - return 1; - } -} - - -static int luaB_pairs (lua_State *L) { - luaL_checktype(L, 1, LUA_TTABLE); - lua_pushvalue(L, lua_upvalueindex(1)); /* return generator, */ - lua_pushvalue(L, 1); /* state, */ - lua_pushnil(L); /* and initial value */ - return 3; -} - - -static int ipairsaux (lua_State *L) { - int i = luaL_checkint(L, 2); - luaL_checktype(L, 1, LUA_TTABLE); - i++; /* next value */ - lua_pushinteger(L, i); - lua_rawgeti(L, 1, i); - return (lua_isnil(L, -1)) ? 0 : 2; -} - - -static int luaB_ipairs (lua_State *L) { - luaL_checktype(L, 1, LUA_TTABLE); - lua_pushvalue(L, lua_upvalueindex(1)); /* return generator, */ - lua_pushvalue(L, 1); /* state, */ - lua_pushinteger(L, 0); /* and initial value */ - return 3; -} - - -static int load_aux (lua_State *L, int status) { - if (status == 0) /* OK? */ - return 1; - else { - lua_pushnil(L); - lua_insert(L, -2); /* put before error message */ - return 2; /* return nil plus error message */ - } -} - - -static int luaB_loadstring (lua_State *L) { - size_t l; - const char *s = luaL_checklstring(L, 1, &l); - const char *chunkname = luaL_optstring(L, 2, s); - return load_aux(L, luaL_loadbuffer(L, s, l, chunkname)); -} - - -static int luaB_loadfile (lua_State *L) { - const char *fname = luaL_optstring(L, 1, NULL); - return load_aux(L, luaL_loadfile(L, fname)); -} - - -/* -** Reader for generic `load' function: `lua_load' uses the -** stack for internal stuff, so the reader cannot change the -** stack top. Instead, it keeps its resulting string in a -** reserved slot inside the stack. -*/ -static const char *generic_reader (lua_State *L, void *ud, size_t *size) { - (void)ud; /* to avoid warnings */ - luaL_checkstack(L, 2, "too many nested functions"); - lua_pushvalue(L, 1); /* get function */ - lua_call(L, 0, 1); /* call it */ - if (lua_isnil(L, -1)) { - *size = 0; - return NULL; - } - else if (lua_isstring(L, -1)) { - lua_replace(L, 3); /* save string in a reserved stack slot */ - return lua_tolstring(L, 3, size); - } - else luaL_error(L, "reader function must return a string"); - return NULL; /* to avoid warnings */ -} - - -static int luaB_load (lua_State *L) { - int status; - const char *cname = luaL_optstring(L, 2, "=(load)"); - luaL_checktype(L, 1, LUA_TFUNCTION); - lua_settop(L, 3); /* function, eventual name, plus one reserved slot */ - status = lua_load(L, generic_reader, NULL, cname); - return load_aux(L, status); -} - - -static int luaB_dofile (lua_State *L) { - const char *fname = luaL_optstring(L, 1, NULL); - int n = lua_gettop(L); - if (luaL_loadfile(L, fname) != 0) lua_error(L); - lua_call(L, 0, LUA_MULTRET); - return lua_gettop(L) - n; -} - - -static int luaB_assert (lua_State *L) { - luaL_checkany(L, 1); - if (!lua_toboolean(L, 1)) - return luaL_error(L, "%s", luaL_optstring(L, 2, "assertion failed!")); - return lua_gettop(L); -} - - -static int luaB_unpack (lua_State *L) { - int i, e, n; - luaL_checktype(L, 1, LUA_TTABLE); - i = luaL_optint(L, 2, 1); - e = luaL_opt(L, luaL_checkint, 3, luaL_getn(L, 1)); - n = e - i + 1; /* number of elements */ - if (n <= 0) return 0; /* empty range */ - luaL_checkstack(L, n, "table too big to unpack"); - for (; i<=e; i++) /* push arg[i...e] */ - lua_rawgeti(L, 1, i); - return n; -} - - -static int luaB_select (lua_State *L) { - int n = lua_gettop(L); - if (lua_type(L, 1) == LUA_TSTRING && *lua_tostring(L, 1) == '#') { - lua_pushinteger(L, n-1); - return 1; - } - else { - int i = luaL_checkint(L, 1); - if (i < 0) i = n + i; - else if (i > n) i = n; - luaL_argcheck(L, 1 <= i, 1, "index out of range"); - return n - i; - } -} - - -static int luaB_pcall (lua_State *L) { - int status; - luaL_checkany(L, 1); - status = lua_pcall(L, lua_gettop(L) - 1, LUA_MULTRET, 0); - lua_pushboolean(L, (status == 0)); - lua_insert(L, 1); - return lua_gettop(L); /* return status + all results */ -} - - -static int luaB_xpcall (lua_State *L) { - int status; - luaL_checkany(L, 2); - lua_settop(L, 2); - lua_insert(L, 1); /* put error function under function to be called */ - status = lua_pcall(L, 0, LUA_MULTRET, 1); - lua_pushboolean(L, (status == 0)); - lua_replace(L, 1); - return lua_gettop(L); /* return status + all results */ -} - - -static int luaB_tostring (lua_State *L) { - luaL_checkany(L, 1); - if (luaL_callmeta(L, 1, "__tostring")) /* is there a metafield? */ - return 1; /* use its value */ - switch (lua_type(L, 1)) { - case LUA_TNUMBER: - lua_pushstring(L, lua_tostring(L, 1)); - break; - case LUA_TSTRING: - lua_pushvalue(L, 1); - break; - case LUA_TBOOLEAN: - lua_pushstring(L, (lua_toboolean(L, 1) ? "true" : "false")); - break; - case LUA_TNIL: - lua_pushliteral(L, "nil"); - break; - default: - lua_pushfstring(L, "%s: %p", luaL_typename(L, 1), lua_topointer(L, 1)); - break; - } - return 1; -} - - -static int luaB_newproxy (lua_State *L) { - lua_settop(L, 1); - lua_newuserdata(L, 0); /* create proxy */ - if (lua_toboolean(L, 1) == 0) - return 1; /* no metatable */ - else if (lua_isboolean(L, 1)) { - lua_newtable(L); /* create a new metatable `m' ... */ - lua_pushvalue(L, -1); /* ... and mark `m' as a valid metatable */ - lua_pushboolean(L, 1); - lua_rawset(L, lua_upvalueindex(1)); /* weaktable[m] = true */ - } - else { - int validproxy = 0; /* to check if weaktable[metatable(u)] == true */ - if (lua_getmetatable(L, 1)) { - lua_rawget(L, lua_upvalueindex(1)); - validproxy = lua_toboolean(L, -1); - lua_pop(L, 1); /* remove value */ - } - luaL_argcheck(L, validproxy, 1, "boolean or proxy expected"); - lua_getmetatable(L, 1); /* metatable is valid; get it */ - } - lua_setmetatable(L, 2); - return 1; -} - - -static const luaL_Reg base_funcs[] = { - {"assert", luaB_assert}, - {"collectgarbage", luaB_collectgarbage}, - {"dofile", luaB_dofile}, - {"error", luaB_error}, - {"gcinfo", luaB_gcinfo}, - {"getfenv", luaB_getfenv}, - {"getmetatable", luaB_getmetatable}, - {"loadfile", luaB_loadfile}, - {"load", luaB_load}, - {"loadstring", luaB_loadstring}, - {"next", luaB_next}, - {"pcall", luaB_pcall}, - {"print", luaB_print}, - {"rawequal", luaB_rawequal}, - {"rawget", luaB_rawget}, - {"rawset", luaB_rawset}, - {"select", luaB_select}, - {"setfenv", luaB_setfenv}, - {"setmetatable", luaB_setmetatable}, - {"tonumber", luaB_tonumber}, - {"tostring", luaB_tostring}, - {"type", luaB_type}, - {"unpack", luaB_unpack}, - {"xpcall", luaB_xpcall}, - {NULL, NULL} -}; - - -/* -** {====================================================== -** Coroutine library -** ======================================================= -*/ - -static int auxresume (lua_State *L, lua_State *co, int narg) { - int status; - if (!lua_checkstack(co, narg)) - luaL_error(L, "too many arguments to resume"); - if (lua_status(co) == 0 && lua_gettop(co) == 0) { - lua_pushliteral(L, "cannot resume dead coroutine"); - return -1; /* error flag */ - } - lua_xmove(L, co, narg); - status = lua_resume(co, narg); - if (status == 0 || status == LUA_YIELD) { - int nres = lua_gettop(co); - if (!lua_checkstack(L, nres)) - luaL_error(L, "too many results to resume"); - lua_xmove(co, L, nres); /* move yielded values */ - return nres; - } - else { - lua_xmove(co, L, 1); /* move error message */ - return -1; /* error flag */ - } -} - - -static int luaB_coresume (lua_State *L) { - lua_State *co = lua_tothread(L, 1); - int r; - luaL_argcheck(L, co, 1, "coroutine expected"); - r = auxresume(L, co, lua_gettop(L) - 1); - if (r < 0) { - lua_pushboolean(L, 0); - lua_insert(L, -2); - return 2; /* return false + error message */ - } - else { - lua_pushboolean(L, 1); - lua_insert(L, -(r + 1)); - return r + 1; /* return true + `resume' returns */ - } -} - - -static int luaB_auxwrap (lua_State *L) { - lua_State *co = lua_tothread(L, lua_upvalueindex(1)); - int r = auxresume(L, co, lua_gettop(L)); - if (r < 0) { - if (lua_isstring(L, -1)) { /* error object is a string? */ - luaL_where(L, 1); /* add extra info */ - lua_insert(L, -2); - lua_concat(L, 2); - } - lua_error(L); /* propagate error */ - } - return r; -} - - -static int luaB_cocreate (lua_State *L) { - lua_State *NL = lua_newthread(L); - luaL_argcheck(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), 1, - "Lua function expected"); - lua_pushvalue(L, 1); /* move function to top */ - lua_xmove(L, NL, 1); /* move function from L to NL */ - return 1; -} - - -static int luaB_cowrap (lua_State *L) { - luaB_cocreate(L); - lua_pushcclosure(L, luaB_auxwrap, 1); - return 1; -} - - -static int luaB_yield (lua_State *L) { - return lua_yield(L, lua_gettop(L)); -} - - -static int luaB_costatus (lua_State *L) { - lua_State *co = lua_tothread(L, 1); - luaL_argcheck(L, co, 1, "coroutine expected"); - if (L == co) lua_pushliteral(L, "running"); - else { - switch (lua_status(co)) { - case LUA_YIELD: - lua_pushliteral(L, "suspended"); - break; - case 0: { - lua_Debug ar; - if (lua_getstack(co, 0, &ar) > 0) /* does it have frames? */ - lua_pushliteral(L, "normal"); /* it is running */ - else if (lua_gettop(co) == 0) - lua_pushliteral(L, "dead"); - else - lua_pushliteral(L, "suspended"); /* initial state */ - break; - } - default: /* some error occured */ - lua_pushliteral(L, "dead"); - break; - } - } - return 1; -} - - -static int luaB_corunning (lua_State *L) { - if (lua_pushthread(L)) - return 0; /* main thread is not a coroutine */ - else - return 1; -} - - -static const luaL_Reg co_funcs[] = { - {"create", luaB_cocreate}, - {"resume", luaB_coresume}, - {"running", luaB_corunning}, - {"status", luaB_costatus}, - {"wrap", luaB_cowrap}, - {"yield", luaB_yield}, - {NULL, NULL} -}; - -/* }====================================================== */ - - -static void auxopen (lua_State *L, const char *name, - lua_CFunction f, lua_CFunction u) { - lua_pushcfunction(L, u); - lua_pushcclosure(L, f, 1); - lua_setfield(L, -2, name); -} - - -static void base_open (lua_State *L) { - /* set global _G */ - lua_pushvalue(L, LUA_GLOBALSINDEX); - lua_setglobal(L, "_G"); - /* open lib into global table */ - luaL_register(L, "_G", base_funcs); - lua_pushliteral(L, LUA_VERSION); - lua_setglobal(L, "_VERSION"); /* set global _VERSION */ - /* `ipairs' and `pairs' need auxliliary functions as upvalues */ - auxopen(L, "ipairs", luaB_ipairs, ipairsaux); - auxopen(L, "pairs", luaB_pairs, luaB_next); - /* `newproxy' needs a weaktable as upvalue */ - lua_createtable(L, 0, 1); /* new table `w' */ - lua_pushvalue(L, -1); /* `w' will be its own metatable */ - lua_setmetatable(L, -2); - lua_pushliteral(L, "kv"); - lua_setfield(L, -2, "__mode"); /* metatable(w).__mode = "kv" */ - lua_pushcclosure(L, luaB_newproxy, 1); - lua_setglobal(L, "newproxy"); /* set global `newproxy' */ -} - - -LUALIB_API int luaopen_base (lua_State *L) { - base_open(L); - luaL_register(L, LUA_COLIBNAME, co_funcs); - return 2; -} diff --git a/uppdev/lua/src/lcode.c b/uppdev/lua/src/lcode.c deleted file mode 100644 index 056efba42..000000000 --- a/uppdev/lua/src/lcode.c +++ /dev/null @@ -1,822 +0,0 @@ -/* -** $Id: lcode.c,v 2.25 2006/03/21 19:28:49 roberto Exp $ -** Code generator for Lua -** See Copyright Notice in lua.h -*/ - - -#include - -#define lcode_c -#define LUA_CORE - -#include "lua.h" - -#include "lcode.h" -#include "ldebug.h" -#include "ldo.h" -#include "lgc.h" -#include "llex.h" -#include "lmem.h" -#include "lobject.h" -#include "lopcodes.h" -#include "lparser.h" -#include "ltable.h" - - -#define hasjumps(e) ((e)->t != (e)->f) - - -static int isnumeral(expdesc *e) { - return (e->k == VKNUM && e->t == NO_JUMP && e->f == NO_JUMP); -} - - -void luaK_nil (FuncState *fs, int from, int n) { - Instruction *previous; - if (fs->pc > fs->lasttarget) { /* no jumps to current position? */ - if (fs->pc == 0) /* function start? */ - return; /* positions are already clean */ - if (GET_OPCODE(*(previous = &fs->f->code[fs->pc-1])) == OP_LOADNIL) { - int pfrom = GETARG_A(*previous); - int pto = GETARG_B(*previous); - if (pfrom <= from && from <= pto+1) { /* can connect both? */ - if (from+n-1 > pto) - SETARG_B(*previous, from+n-1); - return; - } - } - } - luaK_codeABC(fs, OP_LOADNIL, from, from+n-1, 0); /* else no optimization */ -} - - -int luaK_jump (FuncState *fs) { - int jpc = fs->jpc; /* save list of jumps to here */ - int j; - fs->jpc = NO_JUMP; - j = luaK_codeAsBx(fs, OP_JMP, 0, NO_JUMP); - luaK_concat(fs, &j, jpc); /* keep them on hold */ - return j; -} - - -void luaK_ret (FuncState *fs, int first, int nret) { - luaK_codeABC(fs, OP_RETURN, first, nret+1, 0); -} - - -static int condjump (FuncState *fs, OpCode op, int A, int B, int C) { - luaK_codeABC(fs, op, A, B, C); - return luaK_jump(fs); -} - - -static void fixjump (FuncState *fs, int pc, int dest) { - Instruction *jmp = &fs->f->code[pc]; - int offset = dest-(pc+1); - lua_assert(dest != NO_JUMP); - if (abs(offset) > MAXARG_sBx) - luaX_syntaxerror(fs->ls, "control structure too long"); - SETARG_sBx(*jmp, offset); -} - - -/* -** returns current `pc' and marks it as a jump target (to avoid wrong -** optimizations with consecutive instructions not in the same basic block). -*/ -int luaK_getlabel (FuncState *fs) { - fs->lasttarget = fs->pc; - return fs->pc; -} - - -static int getjump (FuncState *fs, int pc) { - int offset = GETARG_sBx(fs->f->code[pc]); - if (offset == NO_JUMP) /* point to itself represents end of list */ - return NO_JUMP; /* end of list */ - else - return (pc+1)+offset; /* turn offset into absolute position */ -} - - -static Instruction *getjumpcontrol (FuncState *fs, int pc) { - Instruction *pi = &fs->f->code[pc]; - if (pc >= 1 && testTMode(GET_OPCODE(*(pi-1)))) - return pi-1; - else - return pi; -} - - -/* -** check whether list has any jump that do not produce a value -** (or produce an inverted value) -*/ -static int need_value (FuncState *fs, int list) { - for (; list != NO_JUMP; list = getjump(fs, list)) { - Instruction i = *getjumpcontrol(fs, list); - if (GET_OPCODE(i) != OP_TESTSET) return 1; - } - return 0; /* not found */ -} - - -static int patchtestreg (FuncState *fs, int node, int reg) { - Instruction *i = getjumpcontrol(fs, node); - if (GET_OPCODE(*i) != OP_TESTSET) - return 0; /* cannot patch other instructions */ - if (reg != NO_REG && reg != GETARG_B(*i)) - SETARG_A(*i, reg); - else /* no register to put value or register already has the value */ - *i = CREATE_ABC(OP_TEST, GETARG_B(*i), 0, GETARG_C(*i)); - - return 1; -} - - -static void removevalues (FuncState *fs, int list) { - for (; list != NO_JUMP; list = getjump(fs, list)) - patchtestreg(fs, list, NO_REG); -} - - -static void patchlistaux (FuncState *fs, int list, int vtarget, int reg, - int dtarget) { - while (list != NO_JUMP) { - int next = getjump(fs, list); - if (patchtestreg(fs, list, reg)) - fixjump(fs, list, vtarget); - else - fixjump(fs, list, dtarget); /* jump to default target */ - list = next; - } -} - - -static void dischargejpc (FuncState *fs) { - patchlistaux(fs, fs->jpc, fs->pc, NO_REG, fs->pc); - fs->jpc = NO_JUMP; -} - - -void luaK_patchlist (FuncState *fs, int list, int target) { - if (target == fs->pc) - luaK_patchtohere(fs, list); - else { - lua_assert(target < fs->pc); - patchlistaux(fs, list, target, NO_REG, target); - } -} - - -void luaK_patchtohere (FuncState *fs, int list) { - luaK_getlabel(fs); - luaK_concat(fs, &fs->jpc, list); -} - - -void luaK_concat (FuncState *fs, int *l1, int l2) { - if (l2 == NO_JUMP) return; - else if (*l1 == NO_JUMP) - *l1 = l2; - else { - int list = *l1; - int next; - while ((next = getjump(fs, list)) != NO_JUMP) /* find last element */ - list = next; - fixjump(fs, list, l2); - } -} - - -void luaK_checkstack (FuncState *fs, int n) { - int newstack = fs->freereg + n; - if (newstack > fs->f->maxstacksize) { - if (newstack >= MAXSTACK) - luaX_syntaxerror(fs->ls, "function or expression too complex"); - fs->f->maxstacksize = cast_byte(newstack); - } -} - - -void luaK_reserveregs (FuncState *fs, int n) { - luaK_checkstack(fs, n); - fs->freereg += n; -} - - -static void freereg (FuncState *fs, int reg) { - if (!ISK(reg) && reg >= fs->nactvar) { - fs->freereg--; - lua_assert(reg == fs->freereg); - } -} - - -static void freeexp (FuncState *fs, expdesc *e) { - if (e->k == VNONRELOC) - freereg(fs, e->u.s.info); -} - - -static int addk (FuncState *fs, TValue *k, TValue *v) { - lua_State *L = fs->L; - TValue *idx = luaH_set(L, fs->h, k); - Proto *f = fs->f; - int oldsize = f->sizek; - if (ttisnumber(idx)) { - lua_assert(luaO_rawequalObj(&fs->f->k[cast_int(nvalue(idx))], v)); - return cast_int(nvalue(idx)); - } - else { /* constant not found; create a new entry */ - setnvalue(idx, cast_num(fs->nk)); - luaM_growvector(L, f->k, fs->nk, f->sizek, TValue, - MAXARG_Bx, "constant table overflow"); - while (oldsize < f->sizek) setnilvalue(&f->k[oldsize++]); - setobj(L, &f->k[fs->nk], v); - luaC_barrier(L, f, v); - return fs->nk++; - } -} - - -int luaK_stringK (FuncState *fs, TString *s) { - TValue o; - setsvalue(fs->L, &o, s); - return addk(fs, &o, &o); -} - - -int luaK_numberK (FuncState *fs, lua_Number r) { - TValue o; - setnvalue(&o, r); - return addk(fs, &o, &o); -} - - -static int boolK (FuncState *fs, int b) { - TValue o; - setbvalue(&o, b); - return addk(fs, &o, &o); -} - - -static int nilK (FuncState *fs) { - TValue k, v; - setnilvalue(&v); - /* cannot use nil as key; instead use table itself to represent nil */ - sethvalue(fs->L, &k, fs->h); - return addk(fs, &k, &v); -} - - -void luaK_setreturns (FuncState *fs, expdesc *e, int nresults) { - if (e->k == VCALL) { /* expression is an open function call? */ - SETARG_C(getcode(fs, e), nresults+1); - } - else if (e->k == VVARARG) { - SETARG_B(getcode(fs, e), nresults+1); - SETARG_A(getcode(fs, e), fs->freereg); - luaK_reserveregs(fs, 1); - } -} - - -void luaK_setoneret (FuncState *fs, expdesc *e) { - if (e->k == VCALL) { /* expression is an open function call? */ - e->k = VNONRELOC; - e->u.s.info = GETARG_A(getcode(fs, e)); - } - else if (e->k == VVARARG) { - SETARG_B(getcode(fs, e), 2); - e->k = VRELOCABLE; /* can relocate its simple result */ - } -} - - -void luaK_dischargevars (FuncState *fs, expdesc *e) { - switch (e->k) { - case VLOCAL: { - e->k = VNONRELOC; - break; - } - case VUPVAL: { - e->u.s.info = luaK_codeABC(fs, OP_GETUPVAL, 0, e->u.s.info, 0); - e->k = VRELOCABLE; - break; - } - case VGLOBAL: { - e->u.s.info = luaK_codeABx(fs, OP_GETGLOBAL, 0, e->u.s.info); - e->k = VRELOCABLE; - break; - } - case VINDEXED: { - freereg(fs, e->u.s.aux); - freereg(fs, e->u.s.info); - e->u.s.info = luaK_codeABC(fs, OP_GETTABLE, 0, e->u.s.info, e->u.s.aux); - e->k = VRELOCABLE; - break; - } - case VVARARG: - case VCALL: { - luaK_setoneret(fs, e); - break; - } - default: break; /* there is one value available (somewhere) */ - } -} - - -static int code_label (FuncState *fs, int A, int b, int jump) { - luaK_getlabel(fs); /* those instructions may be jump targets */ - return luaK_codeABC(fs, OP_LOADBOOL, A, b, jump); -} - - -static void discharge2reg (FuncState *fs, expdesc *e, int reg) { - luaK_dischargevars(fs, e); - switch (e->k) { - case VNIL: { - luaK_nil(fs, reg, 1); - break; - } - case VFALSE: case VTRUE: { - luaK_codeABC(fs, OP_LOADBOOL, reg, e->k == VTRUE, 0); - break; - } - case VK: { - luaK_codeABx(fs, OP_LOADK, reg, e->u.s.info); - break; - } - case VKNUM: { - luaK_codeABx(fs, OP_LOADK, reg, luaK_numberK(fs, e->u.nval)); - break; - } - case VRELOCABLE: { - Instruction *pc = &getcode(fs, e); - SETARG_A(*pc, reg); - break; - } - case VNONRELOC: { - if (reg != e->u.s.info) - luaK_codeABC(fs, OP_MOVE, reg, e->u.s.info, 0); - break; - } - default: { - lua_assert(e->k == VVOID || e->k == VJMP); - return; /* nothing to do... */ - } - } - e->u.s.info = reg; - e->k = VNONRELOC; -} - - -static void discharge2anyreg (FuncState *fs, expdesc *e) { - if (e->k != VNONRELOC) { - luaK_reserveregs(fs, 1); - discharge2reg(fs, e, fs->freereg-1); - } -} - - -static void exp2reg (FuncState *fs, expdesc *e, int reg) { - discharge2reg(fs, e, reg); - if (e->k == VJMP) - luaK_concat(fs, &e->t, e->u.s.info); /* put this jump in `t' list */ - if (hasjumps(e)) { - int final; /* position after whole expression */ - int p_f = NO_JUMP; /* position of an eventual LOAD false */ - int p_t = NO_JUMP; /* position of an eventual LOAD true */ - if (need_value(fs, e->t) || need_value(fs, e->f)) { - int fj = (e->k == VJMP) ? NO_JUMP : luaK_jump(fs); - p_f = code_label(fs, reg, 0, 1); - p_t = code_label(fs, reg, 1, 0); - luaK_patchtohere(fs, fj); - } - final = luaK_getlabel(fs); - patchlistaux(fs, e->f, final, reg, p_f); - patchlistaux(fs, e->t, final, reg, p_t); - } - e->f = e->t = NO_JUMP; - e->u.s.info = reg; - e->k = VNONRELOC; -} - - -void luaK_exp2nextreg (FuncState *fs, expdesc *e) { - luaK_dischargevars(fs, e); - freeexp(fs, e); - luaK_reserveregs(fs, 1); - exp2reg(fs, e, fs->freereg - 1); -} - - -int luaK_exp2anyreg (FuncState *fs, expdesc *e) { - luaK_dischargevars(fs, e); - if (e->k == VNONRELOC) { - if (!hasjumps(e)) return e->u.s.info; /* exp is already in a register */ - if (e->u.s.info >= fs->nactvar) { /* reg. is not a local? */ - exp2reg(fs, e, e->u.s.info); /* put value on it */ - return e->u.s.info; - } - } - luaK_exp2nextreg(fs, e); /* default */ - return e->u.s.info; -} - - -void luaK_exp2val (FuncState *fs, expdesc *e) { - if (hasjumps(e)) - luaK_exp2anyreg(fs, e); - else - luaK_dischargevars(fs, e); -} - - -int luaK_exp2RK (FuncState *fs, expdesc *e) { - luaK_exp2val(fs, e); - switch (e->k) { - case VKNUM: - case VTRUE: - case VFALSE: - case VNIL: { - if (fs->nk <= MAXINDEXRK) { /* constant fit in RK operand? */ - e->u.s.info = (e->k == VNIL) ? nilK(fs) : - (e->k == VKNUM) ? luaK_numberK(fs, e->u.nval) : - boolK(fs, (e->k == VTRUE)); - e->k = VK; - return RKASK(e->u.s.info); - } - else break; - } - case VK: { - if (e->u.s.info <= MAXINDEXRK) /* constant fit in argC? */ - return RKASK(e->u.s.info); - else break; - } - default: break; - } - /* not a constant in the right range: put it in a register */ - return luaK_exp2anyreg(fs, e); -} - - -void luaK_storevar (FuncState *fs, expdesc *var, expdesc *ex) { - switch (var->k) { - case VLOCAL: { - freeexp(fs, ex); - exp2reg(fs, ex, var->u.s.info); - return; - } - case VUPVAL: { - int e = luaK_exp2anyreg(fs, ex); - luaK_codeABC(fs, OP_SETUPVAL, e, var->u.s.info, 0); - break; - } - case VGLOBAL: { - int e = luaK_exp2anyreg(fs, ex); - luaK_codeABx(fs, OP_SETGLOBAL, e, var->u.s.info); - break; - } - case VINDEXED: { - int e = luaK_exp2RK(fs, ex); - luaK_codeABC(fs, OP_SETTABLE, var->u.s.info, var->u.s.aux, e); - break; - } - default: { - lua_assert(0); /* invalid var kind to store */ - break; - } - } - freeexp(fs, ex); -} - - -void luaK_self (FuncState *fs, expdesc *e, expdesc *key) { - int func; - luaK_exp2anyreg(fs, e); - freeexp(fs, e); - func = fs->freereg; - luaK_reserveregs(fs, 2); - luaK_codeABC(fs, OP_SELF, func, e->u.s.info, luaK_exp2RK(fs, key)); - freeexp(fs, key); - e->u.s.info = func; - e->k = VNONRELOC; -} - - -static void invertjump (FuncState *fs, expdesc *e) { - Instruction *pc = getjumpcontrol(fs, e->u.s.info); - lua_assert(testTMode(GET_OPCODE(*pc)) && GET_OPCODE(*pc) != OP_TESTSET && - GET_OPCODE(*pc) != OP_TEST); - SETARG_A(*pc, !(GETARG_A(*pc))); -} - - -static int jumponcond (FuncState *fs, expdesc *e, int cond) { - if (e->k == VRELOCABLE) { - Instruction ie = getcode(fs, e); - if (GET_OPCODE(ie) == OP_NOT) { - fs->pc--; /* remove previous OP_NOT */ - return condjump(fs, OP_TEST, GETARG_B(ie), 0, !cond); - } - /* else go through */ - } - discharge2anyreg(fs, e); - freeexp(fs, e); - return condjump(fs, OP_TESTSET, NO_REG, e->u.s.info, cond); -} - - -void luaK_goiftrue (FuncState *fs, expdesc *e) { - int pc; /* pc of last jump */ - luaK_dischargevars(fs, e); - switch (e->k) { - case VK: case VKNUM: case VTRUE: { - pc = NO_JUMP; /* always true; do nothing */ - break; - } - case VFALSE: { - pc = luaK_jump(fs); /* always jump */ - break; - } - case VJMP: { - invertjump(fs, e); - pc = e->u.s.info; - break; - } - default: { - pc = jumponcond(fs, e, 0); - break; - } - } - luaK_concat(fs, &e->f, pc); /* insert last jump in `f' list */ - luaK_patchtohere(fs, e->t); - e->t = NO_JUMP; -} - - -static void luaK_goiffalse (FuncState *fs, expdesc *e) { - int pc; /* pc of last jump */ - luaK_dischargevars(fs, e); - switch (e->k) { - case VNIL: case VFALSE: { - pc = NO_JUMP; /* always false; do nothing */ - break; - } - case VTRUE: { - pc = luaK_jump(fs); /* always jump */ - break; - } - case VJMP: { - pc = e->u.s.info; - break; - } - default: { - pc = jumponcond(fs, e, 1); - break; - } - } - luaK_concat(fs, &e->t, pc); /* insert last jump in `t' list */ - luaK_patchtohere(fs, e->f); - e->f = NO_JUMP; -} - - -static void codenot (FuncState *fs, expdesc *e) { - luaK_dischargevars(fs, e); - switch (e->k) { - case VNIL: case VFALSE: { - e->k = VTRUE; - break; - } - case VK: case VKNUM: case VTRUE: { - e->k = VFALSE; - break; - } - case VJMP: { - invertjump(fs, e); - break; - } - case VRELOCABLE: - case VNONRELOC: { - discharge2anyreg(fs, e); - freeexp(fs, e); - e->u.s.info = luaK_codeABC(fs, OP_NOT, 0, e->u.s.info, 0); - e->k = VRELOCABLE; - break; - } - default: { - lua_assert(0); /* cannot happen */ - break; - } - } - /* interchange true and false lists */ - { int temp = e->f; e->f = e->t; e->t = temp; } - removevalues(fs, e->f); - removevalues(fs, e->t); -} - - -void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) { - t->u.s.aux = luaK_exp2RK(fs, k); - t->k = VINDEXED; -} - - -static int constfolding (OpCode op, expdesc *e1, expdesc *e2) { - lua_Number v1, v2, r; - if (!isnumeral(e1) || !isnumeral(e2)) return 0; - v1 = e1->u.nval; - v2 = e2->u.nval; - switch (op) { - case OP_ADD: r = luai_numadd(v1, v2); break; - case OP_SUB: r = luai_numsub(v1, v2); break; - case OP_MUL: r = luai_nummul(v1, v2); break; - case OP_DIV: - if (v2 == 0) return 0; /* do not attempt to divide by 0 */ - r = luai_numdiv(v1, v2); break; - case OP_MOD: - if (v2 == 0) return 0; /* do not attempt to divide by 0 */ - r = luai_nummod(v1, v2); break; - case OP_POW: r = luai_numpow(v1, v2); break; - case OP_UNM: r = luai_numunm(v1); break; - case OP_LEN: return 0; /* no constant folding for 'len' */ - default: lua_assert(0); r = 0; break; - } - if (luai_numisnan(r)) return 0; /* do not attempt to produce NaN */ - e1->u.nval = r; - return 1; -} - - -static void codearith (FuncState *fs, OpCode op, expdesc *e1, expdesc *e2) { - if (constfolding(op, e1, e2)) - return; - else { - int o1 = luaK_exp2RK(fs, e1); - int o2 = (op != OP_UNM && op != OP_LEN) ? luaK_exp2RK(fs, e2) : 0; - freeexp(fs, e2); - freeexp(fs, e1); - e1->u.s.info = luaK_codeABC(fs, op, 0, o1, o2); - e1->k = VRELOCABLE; - } -} - - -static void codecomp (FuncState *fs, OpCode op, int cond, expdesc *e1, - expdesc *e2) { - int o1 = luaK_exp2RK(fs, e1); - int o2 = luaK_exp2RK(fs, e2); - freeexp(fs, e2); - freeexp(fs, e1); - if (cond == 0 && op != OP_EQ) { - int temp; /* exchange args to replace by `<' or `<=' */ - temp = o1; o1 = o2; o2 = temp; /* o1 <==> o2 */ - cond = 1; - } - e1->u.s.info = condjump(fs, op, cond, o1, o2); - e1->k = VJMP; -} - - -void luaK_prefix (FuncState *fs, UnOpr op, expdesc *e) { - expdesc e2; - e2.t = e2.f = NO_JUMP; e2.k = VKNUM; e2.u.nval = 0; - switch (op) { - case OPR_MINUS: { - if (e->k == VK) - luaK_exp2anyreg(fs, e); /* cannot operate on non-numeric constants */ - codearith(fs, OP_UNM, e, &e2); - break; - } - case OPR_NOT: codenot(fs, e); break; - case OPR_LEN: { - luaK_exp2anyreg(fs, e); /* cannot operate on constants */ - codearith(fs, OP_LEN, e, &e2); - break; - } - default: lua_assert(0); - } -} - - -void luaK_infix (FuncState *fs, BinOpr op, expdesc *v) { - switch (op) { - case OPR_AND: { - luaK_goiftrue(fs, v); - break; - } - case OPR_OR: { - luaK_goiffalse(fs, v); - break; - } - case OPR_CONCAT: { - luaK_exp2nextreg(fs, v); /* operand must be on the `stack' */ - break; - } - default: { - if (!isnumeral(v)) luaK_exp2RK(fs, v); - break; - } - } -} - - -void luaK_posfix (FuncState *fs, BinOpr op, expdesc *e1, expdesc *e2) { - switch (op) { - case OPR_AND: { - lua_assert(e1->t == NO_JUMP); /* list must be closed */ - luaK_dischargevars(fs, e2); - luaK_concat(fs, &e2->f, e1->f); - *e1 = *e2; - break; - } - case OPR_OR: { - lua_assert(e1->f == NO_JUMP); /* list must be closed */ - luaK_dischargevars(fs, e2); - luaK_concat(fs, &e2->t, e1->t); - *e1 = *e2; - break; - } - case OPR_CONCAT: { - luaK_exp2val(fs, e2); - if (e2->k == VRELOCABLE && GET_OPCODE(getcode(fs, e2)) == OP_CONCAT) { - lua_assert(e1->u.s.info == GETARG_B(getcode(fs, e2))-1); - freeexp(fs, e1); - SETARG_B(getcode(fs, e2), e1->u.s.info); - e1->k = VRELOCABLE; e1->u.s.info = e2->u.s.info; - } - else { - luaK_exp2nextreg(fs, e2); /* operand must be on the 'stack' */ - codearith(fs, OP_CONCAT, e1, e2); - } - break; - } - case OPR_ADD: codearith(fs, OP_ADD, e1, e2); break; - case OPR_SUB: codearith(fs, OP_SUB, e1, e2); break; - case OPR_MUL: codearith(fs, OP_MUL, e1, e2); break; - case OPR_DIV: codearith(fs, OP_DIV, e1, e2); break; - case OPR_MOD: codearith(fs, OP_MOD, e1, e2); break; - case OPR_POW: codearith(fs, OP_POW, e1, e2); break; - case OPR_EQ: codecomp(fs, OP_EQ, 1, e1, e2); break; - case OPR_NE: codecomp(fs, OP_EQ, 0, e1, e2); break; - case OPR_LT: codecomp(fs, OP_LT, 1, e1, e2); break; - case OPR_LE: codecomp(fs, OP_LE, 1, e1, e2); break; - case OPR_GT: codecomp(fs, OP_LT, 0, e1, e2); break; - case OPR_GE: codecomp(fs, OP_LE, 0, e1, e2); break; - default: lua_assert(0); - } -} - - -void luaK_fixline (FuncState *fs, int line) { - fs->f->lineinfo[fs->pc - 1] = line; -} - - -static int luaK_code (FuncState *fs, Instruction i, int line) { - Proto *f = fs->f; - dischargejpc(fs); /* `pc' will change */ - /* put new instruction in code array */ - luaM_growvector(fs->L, f->code, fs->pc, f->sizecode, Instruction, - MAX_INT, "code size overflow"); - f->code[fs->pc] = i; - /* save corresponding line information */ - luaM_growvector(fs->L, f->lineinfo, fs->pc, f->sizelineinfo, int, - MAX_INT, "code size overflow"); - f->lineinfo[fs->pc] = line; - return fs->pc++; -} - - -int luaK_codeABC (FuncState *fs, OpCode o, int a, int b, int c) { - lua_assert(getOpMode(o) == iABC); - lua_assert(getBMode(o) != OpArgN || b == 0); - lua_assert(getCMode(o) != OpArgN || c == 0); - return luaK_code(fs, CREATE_ABC(o, a, b, c), fs->ls->lastline); -} - - -int luaK_codeABx (FuncState *fs, OpCode o, int a, unsigned int bc) { - lua_assert(getOpMode(o) == iABx || getOpMode(o) == iAsBx); - lua_assert(getCMode(o) == OpArgN); - return luaK_code(fs, CREATE_ABx(o, a, bc), fs->ls->lastline); -} - - -void luaK_setlist (FuncState *fs, int base, int nelems, int tostore) { - int c = (nelems - 1)/LFIELDS_PER_FLUSH + 1; - int b = (tostore == LUA_MULTRET) ? 0 : tostore; - lua_assert(tostore != 0); - if (c <= MAXARG_C) - luaK_codeABC(fs, OP_SETLIST, base, b, c); - else { - luaK_codeABC(fs, OP_SETLIST, base, b, 0); - luaK_code(fs, cast(Instruction, c), fs->ls->lastline); - } - fs->freereg = base + 1; /* free registers with list values */ -} diff --git a/uppdev/lua/src/lcode.h b/uppdev/lua/src/lcode.h deleted file mode 100644 index 4e4b52748..000000000 --- a/uppdev/lua/src/lcode.h +++ /dev/null @@ -1,76 +0,0 @@ -/* -** $Id: lcode.h,v 1.48 2006/03/21 19:28:03 roberto Exp $ -** Code generator for Lua -** See Copyright Notice in lua.h -*/ - -#ifndef lcode_h -#define lcode_h - -#include "llex.h" -#include "lobject.h" -#include "lopcodes.h" -#include "lparser.h" - - -/* -** Marks the end of a patch list. It is an invalid value both as an absolute -** address, and as a list link (would link an element to itself). -*/ -#define NO_JUMP (-1) - - -/* -** grep "ORDER OPR" if you change these enums -*/ -typedef enum BinOpr { - OPR_ADD, OPR_SUB, OPR_MUL, OPR_DIV, OPR_MOD, OPR_POW, - OPR_CONCAT, - OPR_NE, OPR_EQ, - OPR_LT, OPR_LE, OPR_GT, OPR_GE, - OPR_AND, OPR_OR, - OPR_NOBINOPR -} BinOpr; - - -typedef enum UnOpr { OPR_MINUS, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr; - - -#define getcode(fs,e) ((fs)->f->code[(e)->u.s.info]) - -#define luaK_codeAsBx(fs,o,A,sBx) luaK_codeABx(fs,o,A,(sBx)+MAXARG_sBx) - -#define luaK_setmultret(fs,e) luaK_setreturns(fs, e, LUA_MULTRET) - -LUAI_FUNC int luaK_codeABx (FuncState *fs, OpCode o, int A, unsigned int Bx); -LUAI_FUNC int luaK_codeABC (FuncState *fs, OpCode o, int A, int B, int C); -LUAI_FUNC void luaK_fixline (FuncState *fs, int line); -LUAI_FUNC void luaK_nil (FuncState *fs, int from, int n); -LUAI_FUNC void luaK_reserveregs (FuncState *fs, int n); -LUAI_FUNC void luaK_checkstack (FuncState *fs, int n); -LUAI_FUNC int luaK_stringK (FuncState *fs, TString *s); -LUAI_FUNC int luaK_numberK (FuncState *fs, lua_Number r); -LUAI_FUNC void luaK_dischargevars (FuncState *fs, expdesc *e); -LUAI_FUNC int luaK_exp2anyreg (FuncState *fs, expdesc *e); -LUAI_FUNC void luaK_exp2nextreg (FuncState *fs, expdesc *e); -LUAI_FUNC void luaK_exp2val (FuncState *fs, expdesc *e); -LUAI_FUNC int luaK_exp2RK (FuncState *fs, expdesc *e); -LUAI_FUNC void luaK_self (FuncState *fs, expdesc *e, expdesc *key); -LUAI_FUNC void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k); -LUAI_FUNC void luaK_goiftrue (FuncState *fs, expdesc *e); -LUAI_FUNC void luaK_storevar (FuncState *fs, expdesc *var, expdesc *e); -LUAI_FUNC void luaK_setreturns (FuncState *fs, expdesc *e, int nresults); -LUAI_FUNC void luaK_setoneret (FuncState *fs, expdesc *e); -LUAI_FUNC int luaK_jump (FuncState *fs); -LUAI_FUNC void luaK_ret (FuncState *fs, int first, int nret); -LUAI_FUNC void luaK_patchlist (FuncState *fs, int list, int target); -LUAI_FUNC void luaK_patchtohere (FuncState *fs, int list); -LUAI_FUNC void luaK_concat (FuncState *fs, int *l1, int l2); -LUAI_FUNC int luaK_getlabel (FuncState *fs); -LUAI_FUNC void luaK_prefix (FuncState *fs, UnOpr op, expdesc *v); -LUAI_FUNC void luaK_infix (FuncState *fs, BinOpr op, expdesc *v); -LUAI_FUNC void luaK_posfix (FuncState *fs, BinOpr op, expdesc *v1, expdesc *v2); -LUAI_FUNC void luaK_setlist (FuncState *fs, int base, int nelems, int tostore); - - -#endif diff --git a/uppdev/lua/src/ldblib.c b/uppdev/lua/src/ldblib.c deleted file mode 100644 index ece256b5d..000000000 --- a/uppdev/lua/src/ldblib.c +++ /dev/null @@ -1,396 +0,0 @@ -/* -** $Id: ldblib.c,v 1.104 2005/12/29 15:32:11 roberto Exp $ -** Interface from Lua to its debug API -** See Copyright Notice in lua.h -*/ - - -#include -#include -#include - -#define ldblib_c -#define LUA_LIB - -#include "lua.h" - -#include "lauxlib.h" -#include "lualib.h" - - - -static int db_getregistry (lua_State *L) { - lua_pushvalue(L, LUA_REGISTRYINDEX); - return 1; -} - - -static int db_getmetatable (lua_State *L) { - luaL_checkany(L, 1); - if (!lua_getmetatable(L, 1)) { - lua_pushnil(L); /* no metatable */ - } - return 1; -} - - -static int db_setmetatable (lua_State *L) { - int t = lua_type(L, 2); - luaL_argcheck(L, t == LUA_TNIL || t == LUA_TTABLE, 2, - "nil or table expected"); - lua_settop(L, 2); - lua_pushboolean(L, lua_setmetatable(L, 1)); - return 1; -} - - -static int db_getfenv (lua_State *L) { - lua_getfenv(L, 1); - return 1; -} - - -static int db_setfenv (lua_State *L) { - luaL_checktype(L, 2, LUA_TTABLE); - lua_settop(L, 2); - if (lua_setfenv(L, 1) == 0) - luaL_error(L, LUA_QL("setfenv") - " cannot change environment of given object"); - return 1; -} - - -static void settabss (lua_State *L, const char *i, const char *v) { - lua_pushstring(L, v); - lua_setfield(L, -2, i); -} - - -static void settabsi (lua_State *L, const char *i, int v) { - lua_pushinteger(L, v); - lua_setfield(L, -2, i); -} - - -static lua_State *getthread (lua_State *L, int *arg) { - if (lua_isthread(L, 1)) { - *arg = 1; - return lua_tothread(L, 1); - } - else { - *arg = 0; - return L; - } -} - - -static void treatstackoption (lua_State *L, lua_State *L1, const char *fname) { - if (L == L1) { - lua_pushvalue(L, -2); - lua_remove(L, -3); - } - else - lua_xmove(L1, L, 1); - lua_setfield(L, -2, fname); -} - - -static int db_getinfo (lua_State *L) { - lua_Debug ar; - int arg; - lua_State *L1 = getthread(L, &arg); - const char *options = luaL_optstring(L, arg+2, "flnSu"); - if (lua_isnumber(L, arg+1)) { - if (!lua_getstack(L1, (int)lua_tointeger(L, arg+1), &ar)) { - lua_pushnil(L); /* level out of range */ - return 1; - } - } - else if (lua_isfunction(L, arg+1)) { - lua_pushfstring(L, ">%s", options); - options = lua_tostring(L, -1); - lua_pushvalue(L, arg+1); - lua_xmove(L, L1, 1); - } - else - return luaL_argerror(L, arg+1, "function or level expected"); - if (!lua_getinfo(L1, options, &ar)) - return luaL_argerror(L, arg+2, "invalid option"); - lua_createtable(L, 0, 2); - if (strchr(options, 'S')) { - settabss(L, "source", ar.source); - settabss(L, "short_src", ar.short_src); - settabsi(L, "linedefined", ar.linedefined); - settabsi(L, "lastlinedefined", ar.lastlinedefined); - settabss(L, "what", ar.what); - } - if (strchr(options, 'l')) - settabsi(L, "currentline", ar.currentline); - if (strchr(options, 'u')) - settabsi(L, "nups", ar.nups); - if (strchr(options, 'n')) { - settabss(L, "name", ar.name); - settabss(L, "namewhat", ar.namewhat); - } - if (strchr(options, 'L')) - treatstackoption(L, L1, "activelines"); - if (strchr(options, 'f')) - treatstackoption(L, L1, "func"); - return 1; /* return table */ -} - - -static int db_getlocal (lua_State *L) { - int arg; - lua_State *L1 = getthread(L, &arg); - lua_Debug ar; - const char *name; - if (!lua_getstack(L1, luaL_checkint(L, arg+1), &ar)) /* out of range? */ - return luaL_argerror(L, arg+1, "level out of range"); - name = lua_getlocal(L1, &ar, luaL_checkint(L, arg+2)); - if (name) { - lua_xmove(L1, L, 1); - lua_pushstring(L, name); - lua_pushvalue(L, -2); - return 2; - } - else { - lua_pushnil(L); - return 1; - } -} - - -static int db_setlocal (lua_State *L) { - int arg; - lua_State *L1 = getthread(L, &arg); - lua_Debug ar; - if (!lua_getstack(L1, luaL_checkint(L, arg+1), &ar)) /* out of range? */ - return luaL_argerror(L, arg+1, "level out of range"); - luaL_checkany(L, arg+3); - lua_settop(L, arg+3); - lua_xmove(L, L1, 1); - lua_pushstring(L, lua_setlocal(L1, &ar, luaL_checkint(L, arg+2))); - return 1; -} - - -static int auxupvalue (lua_State *L, int get) { - const char *name; - int n = luaL_checkint(L, 2); - luaL_checktype(L, 1, LUA_TFUNCTION); - if (lua_iscfunction(L, 1)) return 0; /* cannot touch C upvalues from Lua */ - name = get ? lua_getupvalue(L, 1, n) : lua_setupvalue(L, 1, n); - if (name == NULL) return 0; - lua_pushstring(L, name); - lua_insert(L, -(get+1)); - return get + 1; -} - - -static int db_getupvalue (lua_State *L) { - return auxupvalue(L, 1); -} - - -static int db_setupvalue (lua_State *L) { - luaL_checkany(L, 3); - return auxupvalue(L, 0); -} - - - -static const char KEY_HOOK = 'h'; - - -static void hookf (lua_State *L, lua_Debug *ar) { - static const char *const hooknames[] = - {"call", "return", "line", "count", "tail return"}; - lua_pushlightuserdata(L, (void *)&KEY_HOOK); - lua_rawget(L, LUA_REGISTRYINDEX); - lua_pushlightuserdata(L, L); - lua_rawget(L, -2); - if (lua_isfunction(L, -1)) { - lua_pushstring(L, hooknames[(int)ar->event]); - if (ar->currentline >= 0) - lua_pushinteger(L, ar->currentline); - else lua_pushnil(L); - lua_assert(lua_getinfo(L, "lS", ar)); - lua_call(L, 2, 0); - } -} - - -static int makemask (const char *smask, int count) { - int mask = 0; - if (strchr(smask, 'c')) mask |= LUA_MASKCALL; - if (strchr(smask, 'r')) mask |= LUA_MASKRET; - if (strchr(smask, 'l')) mask |= LUA_MASKLINE; - if (count > 0) mask |= LUA_MASKCOUNT; - return mask; -} - - -static char *unmakemask (int mask, char *smask) { - int i = 0; - if (mask & LUA_MASKCALL) smask[i++] = 'c'; - if (mask & LUA_MASKRET) smask[i++] = 'r'; - if (mask & LUA_MASKLINE) smask[i++] = 'l'; - smask[i] = '\0'; - return smask; -} - - -static void gethooktable (lua_State *L) { - lua_pushlightuserdata(L, (void *)&KEY_HOOK); - lua_rawget(L, LUA_REGISTRYINDEX); - if (!lua_istable(L, -1)) { - lua_pop(L, 1); - lua_createtable(L, 0, 1); - lua_pushlightuserdata(L, (void *)&KEY_HOOK); - lua_pushvalue(L, -2); - lua_rawset(L, LUA_REGISTRYINDEX); - } -} - - -static int db_sethook (lua_State *L) { - int arg; - lua_State *L1 = getthread(L, &arg); - if (lua_isnoneornil(L, arg+1)) { - lua_settop(L, arg+1); - lua_sethook(L1, NULL, 0, 0); /* turn off hooks */ - } - else { - const char *smask = luaL_checkstring(L, arg+2); - int count = luaL_optint(L, arg+3, 0); - luaL_checktype(L, arg+1, LUA_TFUNCTION); - lua_sethook(L1, hookf, makemask(smask, count), count); - } - gethooktable(L1); - lua_pushlightuserdata(L1, L1); - lua_pushvalue(L, arg+1); - lua_xmove(L, L1, 1); - lua_rawset(L1, -3); /* set new hook */ - lua_pop(L1, 1); /* remove hook table */ - return 0; -} - - -static int db_gethook (lua_State *L) { - int arg; - lua_State *L1 = getthread(L, &arg); - char buff[5]; - int mask = lua_gethookmask(L1); - lua_Hook hook = lua_gethook(L1); - if (hook != NULL && hook != hookf) /* external hook? */ - lua_pushliteral(L, "external hook"); - else { - gethooktable(L1); - lua_pushlightuserdata(L1, L1); - lua_rawget(L1, -2); /* get hook */ - lua_remove(L1, -2); /* remove hook table */ - lua_xmove(L1, L, 1); - } - lua_pushstring(L, unmakemask(mask, buff)); - lua_pushinteger(L, lua_gethookcount(L1)); - return 3; -} - - -static int db_debug (lua_State *L) { - for (;;) { - char buffer[250]; - fputs("lua_debug> ", stderr); - if (fgets(buffer, sizeof(buffer), stdin) == 0 || - strcmp(buffer, "cont\n") == 0) - return 0; - if (luaL_loadbuffer(L, buffer, strlen(buffer), "=(debug command)") || - lua_pcall(L, 0, 0, 0)) { - fputs(lua_tostring(L, -1), stderr); - fputs("\n", stderr); - } - lua_settop(L, 0); /* remove eventual returns */ - } -} - - -#define LEVELS1 12 /* size of the first part of the stack */ -#define LEVELS2 10 /* size of the second part of the stack */ - -static int db_errorfb (lua_State *L) { - int level; - int firstpart = 1; /* still before eventual `...' */ - int arg; - lua_State *L1 = getthread(L, &arg); - lua_Debug ar; - if (lua_isnumber(L, arg+2)) { - level = (int)lua_tointeger(L, arg+2); - lua_pop(L, 1); - } - else - level = (L == L1) ? 1 : 0; /* level 0 may be this own function */ - if (lua_gettop(L) == arg) - lua_pushliteral(L, ""); - else if (!lua_isstring(L, arg+1)) return 1; /* message is not a string */ - else lua_pushliteral(L, "\n"); - lua_pushliteral(L, "stack traceback:"); - while (lua_getstack(L1, level++, &ar)) { - if (level > LEVELS1 && firstpart) { - /* no more than `LEVELS2' more levels? */ - if (!lua_getstack(L1, level+LEVELS2, &ar)) - level--; /* keep going */ - else { - lua_pushliteral(L, "\n\t..."); /* too many levels */ - while (lua_getstack(L1, level+LEVELS2, &ar)) /* find last levels */ - level++; - } - firstpart = 0; - continue; - } - lua_pushliteral(L, "\n\t"); - lua_getinfo(L1, "Snl", &ar); - lua_pushfstring(L, "%s:", ar.short_src); - if (ar.currentline > 0) - lua_pushfstring(L, "%d:", ar.currentline); - if (*ar.namewhat != '\0') /* is there a name? */ - lua_pushfstring(L, " in function " LUA_QS, ar.name); - else { - if (*ar.what == 'm') /* main? */ - lua_pushfstring(L, " in main chunk"); - else if (*ar.what == 'C' || *ar.what == 't') - lua_pushliteral(L, " ?"); /* C function or tail call */ - else - lua_pushfstring(L, " in function <%s:%d>", - ar.short_src, ar.linedefined); - } - lua_concat(L, lua_gettop(L) - arg); - } - lua_concat(L, lua_gettop(L) - arg); - return 1; -} - - -static const luaL_Reg dblib[] = { - {"debug", db_debug}, - {"getfenv", db_getfenv}, - {"gethook", db_gethook}, - {"getinfo", db_getinfo}, - {"getlocal", db_getlocal}, - {"getregistry", db_getregistry}, - {"getmetatable", db_getmetatable}, - {"getupvalue", db_getupvalue}, - {"setfenv", db_setfenv}, - {"sethook", db_sethook}, - {"setlocal", db_setlocal}, - {"setmetatable", db_setmetatable}, - {"setupvalue", db_setupvalue}, - {"traceback", db_errorfb}, - {NULL, NULL} -}; - - -LUALIB_API int luaopen_debug (lua_State *L) { - luaL_register(L, LUA_DBLIBNAME, dblib); - return 1; -} diff --git a/uppdev/lua/src/ldebug.c b/uppdev/lua/src/ldebug.c deleted file mode 100644 index 65355b642..000000000 --- a/uppdev/lua/src/ldebug.c +++ /dev/null @@ -1,619 +0,0 @@ -/* -** $Id: ldebug.c,v 2.29 2005/12/22 16:19:56 roberto Exp $ -** Debug Interface -** See Copyright Notice in lua.h -*/ - - -#include -#include -#include - - -#define ldebug_c -#define LUA_CORE - -#include "lua.h" - -#include "lapi.h" -#include "lcode.h" -#include "ldebug.h" -#include "ldo.h" -#include "lfunc.h" -#include "lobject.h" -#include "lopcodes.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "ltm.h" -#include "lvm.h" - - - -static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name); - - -static int currentpc (lua_State *L, CallInfo *ci) { - if (!isLua(ci)) return -1; /* function is not a Lua function? */ - if (ci == L->ci) - ci->savedpc = L->savedpc; - return pcRel(ci->savedpc, ci_func(ci)->l.p); -} - - -static int currentline (lua_State *L, CallInfo *ci) { - int pc = currentpc(L, ci); - if (pc < 0) - return -1; /* only active lua functions have current-line information */ - else - return getline(ci_func(ci)->l.p, pc); -} - - -/* -** this function can be called asynchronous (e.g. during a signal) -*/ -LUA_API int lua_sethook (lua_State *L, lua_Hook func, int mask, int count) { - if (func == NULL || mask == 0) { /* turn off hooks? */ - mask = 0; - func = NULL; - } - L->hook = func; - L->basehookcount = count; - resethookcount(L); - L->hookmask = cast_byte(mask); - return 1; -} - - -LUA_API lua_Hook lua_gethook (lua_State *L) { - return L->hook; -} - - -LUA_API int lua_gethookmask (lua_State *L) { - return L->hookmask; -} - - -LUA_API int lua_gethookcount (lua_State *L) { - return L->basehookcount; -} - - -LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) { - int status; - CallInfo *ci; - lua_lock(L); - for (ci = L->ci; level > 0 && ci > L->base_ci; ci--) { - level--; - if (f_isLua(ci)) /* Lua function? */ - level -= ci->tailcalls; /* skip lost tail calls */ - } - if (level == 0 && ci > L->base_ci) { /* level found? */ - status = 1; - ar->i_ci = cast_int(ci - L->base_ci); - } - else if (level < 0) { /* level is of a lost tail call? */ - status = 1; - ar->i_ci = 0; - } - else status = 0; /* no such level */ - lua_unlock(L); - return status; -} - - -static Proto *getluaproto (CallInfo *ci) { - return (isLua(ci) ? ci_func(ci)->l.p : NULL); -} - - -static const char *findlocal (lua_State *L, CallInfo *ci, int n) { - const char *name; - Proto *fp = getluaproto(ci); - if (fp && (name = luaF_getlocalname(fp, n, currentpc(L, ci))) != NULL) - return name; /* is a local variable in a Lua function */ - else { - StkId limit = (ci == L->ci) ? L->top : (ci+1)->func; - if (limit - ci->base >= n && n > 0) /* is 'n' inside 'ci' stack? */ - return "(*temporary)"; - else - return NULL; - } -} - - -LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n) { - CallInfo *ci = L->base_ci + ar->i_ci; - const char *name = findlocal(L, ci, n); - lua_lock(L); - if (name) - luaA_pushobject(L, ci->base + (n - 1)); - lua_unlock(L); - return name; -} - - -LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) { - CallInfo *ci = L->base_ci + ar->i_ci; - const char *name = findlocal(L, ci, n); - lua_lock(L); - if (name) - setobjs2s(L, ci->base + (n - 1), L->top - 1); - L->top--; /* pop value */ - lua_unlock(L); - return name; -} - - -static void funcinfo (lua_Debug *ar, Closure *cl) { - if (cl->c.isC) { - ar->source = "=[C]"; - ar->linedefined = -1; - ar->lastlinedefined = -1; - ar->what = "C"; - } - else { - ar->source = getstr(cl->l.p->source); - ar->linedefined = cl->l.p->linedefined; - ar->lastlinedefined = cl->l.p->lastlinedefined; - ar->what = (ar->linedefined == 0) ? "main" : "Lua"; - } - luaO_chunkid(ar->short_src, ar->source, LUA_IDSIZE); -} - - -static void info_tailcall (lua_Debug *ar) { - ar->name = ar->namewhat = ""; - ar->what = "tail"; - ar->lastlinedefined = ar->linedefined = ar->currentline = -1; - ar->source = "=(tail call)"; - luaO_chunkid(ar->short_src, ar->source, LUA_IDSIZE); - ar->nups = 0; -} - - -static void collectvalidlines (lua_State *L, Closure *f) { - if (f == NULL || f->c.isC) { - setnilvalue(L->top); - } - else { - Table *t = luaH_new(L, 0, 0); - int *lineinfo = f->l.p->lineinfo; - int i; - for (i=0; il.p->sizelineinfo; i++) - setbvalue(luaH_setnum(L, t, lineinfo[i]), 1); - sethvalue(L, L->top, t); - } - incr_top(L); -} - - -static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar, - Closure *f, CallInfo *ci) { - int status = 1; - if (f == NULL) { - info_tailcall(ar); - return status; - } - for (; *what; what++) { - switch (*what) { - case 'S': { - funcinfo(ar, f); - break; - } - case 'l': { - ar->currentline = (ci) ? currentline(L, ci) : -1; - break; - } - case 'u': { - ar->nups = f->c.nupvalues; - break; - } - case 'n': { - ar->namewhat = (ci) ? getfuncname(L, ci, &ar->name) : NULL; - if (ar->namewhat == NULL) { - ar->namewhat = ""; /* not found */ - ar->name = NULL; - } - break; - } - case 'L': - case 'f': /* handled by lua_getinfo */ - break; - default: status = 0; /* invalid option */ - } - } - return status; -} - - -LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) { - int status; - Closure *f = NULL; - CallInfo *ci = NULL; - lua_lock(L); - if (*what == '>') { - StkId func = L->top - 1; - luai_apicheck(L, ttisfunction(func)); - what++; /* skip the '>' */ - f = clvalue(func); - L->top--; /* pop function */ - } - else if (ar->i_ci != 0) { /* no tail call? */ - ci = L->base_ci + ar->i_ci; - lua_assert(ttisfunction(ci->func)); - f = clvalue(ci->func); - } - status = auxgetinfo(L, what, ar, f, ci); - if (strchr(what, 'f')) { - if (f == NULL) setnilvalue(L->top); - else setclvalue(L, L->top, f); - incr_top(L); - } - if (strchr(what, 'L')) - collectvalidlines(L, f); - lua_unlock(L); - return status; -} - - -/* -** {====================================================== -** Symbolic Execution and code checker -** ======================================================= -*/ - -#define check(x) if (!(x)) return 0; - -#define checkjump(pt,pc) check(0 <= pc && pc < pt->sizecode) - -#define checkreg(pt,reg) check((reg) < (pt)->maxstacksize) - - - -static int precheck (const Proto *pt) { - check(pt->maxstacksize <= MAXSTACK); - lua_assert(pt->numparams+(pt->is_vararg & VARARG_HASARG) <= pt->maxstacksize); - lua_assert(!(pt->is_vararg & VARARG_NEEDSARG) || - (pt->is_vararg & VARARG_HASARG)); - check(pt->sizeupvalues <= pt->nups); - check(pt->sizelineinfo == pt->sizecode || pt->sizelineinfo == 0); - check(GET_OPCODE(pt->code[pt->sizecode-1]) == OP_RETURN); - return 1; -} - - -#define checkopenop(pt,pc) luaG_checkopenop((pt)->code[(pc)+1]) - -int luaG_checkopenop (Instruction i) { - switch (GET_OPCODE(i)) { - case OP_CALL: - case OP_TAILCALL: - case OP_RETURN: - case OP_SETLIST: { - check(GETARG_B(i) == 0); - return 1; - } - default: return 0; /* invalid instruction after an open call */ - } -} - - -static int checkArgMode (const Proto *pt, int r, enum OpArgMask mode) { - switch (mode) { - case OpArgN: check(r == 0); break; - case OpArgU: break; - case OpArgR: checkreg(pt, r); break; - case OpArgK: - check(ISK(r) ? INDEXK(r) < pt->sizek : r < pt->maxstacksize); - break; - } - return 1; -} - - -static Instruction symbexec (const Proto *pt, int lastpc, int reg) { - int pc; - int last; /* stores position of last instruction that changed `reg' */ - last = pt->sizecode-1; /* points to final return (a `neutral' instruction) */ - check(precheck(pt)); - for (pc = 0; pc < lastpc; pc++) { - Instruction i = pt->code[pc]; - OpCode op = GET_OPCODE(i); - int a = GETARG_A(i); - int b = 0; - int c = 0; - check(op < NUM_OPCODES); - checkreg(pt, a); - switch (getOpMode(op)) { - case iABC: { - b = GETARG_B(i); - c = GETARG_C(i); - check(checkArgMode(pt, b, getBMode(op))); - check(checkArgMode(pt, c, getCMode(op))); - break; - } - case iABx: { - b = GETARG_Bx(i); - if (getBMode(op) == OpArgK) check(b < pt->sizek); - break; - } - case iAsBx: { - b = GETARG_sBx(i); - if (getBMode(op) == OpArgR) { - int dest = pc+1+b; - check(0 <= dest && dest < pt->sizecode); - if (dest > 0) { - /* cannot jump to a setlist count */ - Instruction d = pt->code[dest-1]; - check(!(GET_OPCODE(d) == OP_SETLIST && GETARG_C(d) == 0)); - } - } - break; - } - } - if (testAMode(op)) { - if (a == reg) last = pc; /* change register `a' */ - } - if (testTMode(op)) { - check(pc+2 < pt->sizecode); /* check skip */ - check(GET_OPCODE(pt->code[pc+1]) == OP_JMP); - } - switch (op) { - case OP_LOADBOOL: { - check(c == 0 || pc+2 < pt->sizecode); /* check its jump */ - break; - } - case OP_LOADNIL: { - if (a <= reg && reg <= b) - last = pc; /* set registers from `a' to `b' */ - break; - } - case OP_GETUPVAL: - case OP_SETUPVAL: { - check(b < pt->nups); - break; - } - case OP_GETGLOBAL: - case OP_SETGLOBAL: { - check(ttisstring(&pt->k[b])); - break; - } - case OP_SELF: { - checkreg(pt, a+1); - if (reg == a+1) last = pc; - break; - } - case OP_CONCAT: { - check(b < c); /* at least two operands */ - break; - } - case OP_TFORLOOP: { - check(c >= 1); /* at least one result (control variable) */ - checkreg(pt, a+2+c); /* space for results */ - if (reg >= a+2) last = pc; /* affect all regs above its base */ - break; - } - case OP_FORLOOP: - case OP_FORPREP: - checkreg(pt, a+3); - /* go through */ - case OP_JMP: { - int dest = pc+1+b; - /* not full check and jump is forward and do not skip `lastpc'? */ - if (reg != NO_REG && pc < dest && dest <= lastpc) - pc += b; /* do the jump */ - break; - } - case OP_CALL: - case OP_TAILCALL: { - if (b != 0) { - checkreg(pt, a+b-1); - } - c--; /* c = num. returns */ - if (c == LUA_MULTRET) { - check(checkopenop(pt, pc)); - } - else if (c != 0) - checkreg(pt, a+c-1); - if (reg >= a) last = pc; /* affect all registers above base */ - break; - } - case OP_RETURN: { - b--; /* b = num. returns */ - if (b > 0) checkreg(pt, a+b-1); - break; - } - case OP_SETLIST: { - if (b > 0) checkreg(pt, a + b); - if (c == 0) pc++; - break; - } - case OP_CLOSURE: { - int nup; - check(b < pt->sizep); - nup = pt->p[b]->nups; - check(pc + nup < pt->sizecode); - for (; nup>0; nup--) { - OpCode op1 = GET_OPCODE(pt->code[pc+nup]); - check(op1 == OP_GETUPVAL || op1 == OP_MOVE); - } - break; - } - case OP_VARARG: { - check((pt->is_vararg & VARARG_ISVARARG) && - !(pt->is_vararg & VARARG_NEEDSARG)); - b--; - if (b == LUA_MULTRET) check(checkopenop(pt, pc)); - checkreg(pt, a+b-1); - break; - } - default: break; - } - } - return pt->code[last]; -} - -#undef check -#undef checkjump -#undef checkreg - -/* }====================================================== */ - - -int luaG_checkcode (const Proto *pt) { - return (symbexec(pt, pt->sizecode, NO_REG) != 0); -} - - -static const char *kname (Proto *p, int c) { - if (ISK(c) && ttisstring(&p->k[INDEXK(c)])) - return svalue(&p->k[INDEXK(c)]); - else - return "?"; -} - - -static const char *getobjname (lua_State *L, CallInfo *ci, int stackpos, - const char **name) { - if (isLua(ci)) { /* a Lua function? */ - Proto *p = ci_func(ci)->l.p; - int pc = currentpc(L, ci); - Instruction i; - *name = luaF_getlocalname(p, stackpos+1, pc); - if (*name) /* is a local? */ - return "local"; - i = symbexec(p, pc, stackpos); /* try symbolic execution */ - lua_assert(pc != -1); - switch (GET_OPCODE(i)) { - case OP_GETGLOBAL: { - int g = GETARG_Bx(i); /* global index */ - lua_assert(ttisstring(&p->k[g])); - *name = svalue(&p->k[g]); - return "global"; - } - case OP_MOVE: { - int a = GETARG_A(i); - int b = GETARG_B(i); /* move from `b' to `a' */ - if (b < a) - return getobjname(L, ci, b, name); /* get name for `b' */ - break; - } - case OP_GETTABLE: { - int k = GETARG_C(i); /* key index */ - *name = kname(p, k); - return "field"; - } - case OP_GETUPVAL: { - int u = GETARG_B(i); /* upvalue index */ - *name = p->upvalues ? getstr(p->upvalues[u]) : "?"; - return "upvalue"; - } - case OP_SELF: { - int k = GETARG_C(i); /* key index */ - *name = kname(p, k); - return "method"; - } - default: break; - } - } - return NULL; /* no useful name found */ -} - - -static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name) { - Instruction i; - if ((isLua(ci) && ci->tailcalls > 0) || !isLua(ci - 1)) - return NULL; /* calling function is not Lua (or is unknown) */ - ci--; /* calling function */ - i = ci_func(ci)->l.p->code[currentpc(L, ci)]; - if (GET_OPCODE(i) == OP_CALL || GET_OPCODE(i) == OP_TAILCALL || - GET_OPCODE(i) == OP_TFORLOOP) - return getobjname(L, ci, GETARG_A(i), name); - else - return NULL; /* no useful name can be found */ -} - - -/* only ANSI way to check whether a pointer points to an array */ -static int isinstack (CallInfo *ci, const TValue *o) { - StkId p; - for (p = ci->base; p < ci->top; p++) - if (o == p) return 1; - return 0; -} - - -void luaG_typeerror (lua_State *L, const TValue *o, const char *op) { - const char *name = NULL; - const char *t = luaT_typenames[ttype(o)]; - const char *kind = (isinstack(L->ci, o)) ? - getobjname(L, L->ci, cast_int(o - L->base), &name) : - NULL; - if (kind) - luaG_runerror(L, "attempt to %s %s " LUA_QS " (a %s value)", - op, kind, name, t); - else - luaG_runerror(L, "attempt to %s a %s value", op, t); -} - - -void luaG_concaterror (lua_State *L, StkId p1, StkId p2) { - if (ttisstring(p1)) p1 = p2; - lua_assert(!ttisstring(p1)); - luaG_typeerror(L, p1, "concatenate"); -} - - -void luaG_aritherror (lua_State *L, const TValue *p1, const TValue *p2) { - TValue temp; - if (luaV_tonumber(p1, &temp) == NULL) - p2 = p1; /* first operand is wrong */ - luaG_typeerror(L, p2, "perform arithmetic on"); -} - - -int luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p2) { - const char *t1 = luaT_typenames[ttype(p1)]; - const char *t2 = luaT_typenames[ttype(p2)]; - if (t1[2] == t2[2]) - luaG_runerror(L, "attempt to compare two %s values", t1); - else - luaG_runerror(L, "attempt to compare %s with %s", t1, t2); - return 0; -} - - -static void addinfo (lua_State *L, const char *msg) { - CallInfo *ci = L->ci; - if (isLua(ci)) { /* is Lua code? */ - char buff[LUA_IDSIZE]; /* add file:line information */ - int line = currentline(L, ci); - luaO_chunkid(buff, getstr(getluaproto(ci)->source), LUA_IDSIZE); - luaO_pushfstring(L, "%s:%d: %s", buff, line, msg); - } -} - - -void luaG_errormsg (lua_State *L) { - if (L->errfunc != 0) { /* is there an error handling function? */ - StkId errfunc = restorestack(L, L->errfunc); - if (!ttisfunction(errfunc)) luaD_throw(L, LUA_ERRERR); - setobjs2s(L, L->top, L->top - 1); /* move argument */ - setobjs2s(L, L->top - 1, errfunc); /* push function */ - incr_top(L); - luaD_call(L, L->top - 2, 1); /* call it */ - } - luaD_throw(L, LUA_ERRRUN); -} - - -void luaG_runerror (lua_State *L, const char *fmt, ...) { - va_list argp; - va_start(argp, fmt); - addinfo(L, luaO_pushvfstring(L, fmt, argp)); - va_end(argp); - luaG_errormsg(L); -} diff --git a/uppdev/lua/src/ldebug.h b/uppdev/lua/src/ldebug.h deleted file mode 100644 index 4dae94c3a..000000000 --- a/uppdev/lua/src/ldebug.h +++ /dev/null @@ -1,33 +0,0 @@ -/* -** $Id: ldebug.h,v 2.3 2005/04/25 19:24:10 roberto Exp $ -** Auxiliary functions from Debug Interface module -** See Copyright Notice in lua.h -*/ - -#ifndef ldebug_h -#define ldebug_h - - -#include "lstate.h" - - -#define pcRel(pc, p) (cast(int, (pc) - (p)->code) - 1) - -#define getline(f,pc) (((f)->lineinfo) ? (f)->lineinfo[pc] : 0) - -#define resethookcount(L) (L->hookcount = L->basehookcount) - - -LUAI_FUNC void luaG_typeerror (lua_State *L, const TValue *o, - const char *opname); -LUAI_FUNC void luaG_concaterror (lua_State *L, StkId p1, StkId p2); -LUAI_FUNC void luaG_aritherror (lua_State *L, const TValue *p1, - const TValue *p2); -LUAI_FUNC int luaG_ordererror (lua_State *L, const TValue *p1, - const TValue *p2); -LUAI_FUNC void luaG_runerror (lua_State *L, const char *fmt, ...); -LUAI_FUNC void luaG_errormsg (lua_State *L); -LUAI_FUNC int luaG_checkcode (const Proto *pt); -LUAI_FUNC int luaG_checkopenop (Instruction i); - -#endif diff --git a/uppdev/lua/src/ldo.c b/uppdev/lua/src/ldo.c deleted file mode 100644 index edaf738ec..000000000 --- a/uppdev/lua/src/ldo.c +++ /dev/null @@ -1,514 +0,0 @@ -/* -** $Id: ldo.c,v 2.38 2006/06/05 19:36:14 roberto Exp $ -** Stack and Call structure of Lua -** See Copyright Notice in lua.h -*/ - - -#include -#include -#include - -#define ldo_c -#define LUA_CORE - -#include "lua.h" - -#include "ldebug.h" -#include "ldo.h" -#include "lfunc.h" -#include "lgc.h" -#include "lmem.h" -#include "lobject.h" -#include "lopcodes.h" -#include "lparser.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "ltm.h" -#include "lundump.h" -#include "lvm.h" -#include "lzio.h" - - - - -/* -** {====================================================== -** Error-recovery functions -** ======================================================= -*/ - - -/* chain list of long jump buffers */ -struct lua_longjmp { - struct lua_longjmp *previous; - luai_jmpbuf b; - volatile int status; /* error code */ -}; - - -void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop) { - switch (errcode) { - case LUA_ERRMEM: { - setsvalue2s(L, oldtop, luaS_newliteral(L, MEMERRMSG)); - break; - } - case LUA_ERRERR: { - setsvalue2s(L, oldtop, luaS_newliteral(L, "error in error handling")); - break; - } - case LUA_ERRSYNTAX: - case LUA_ERRRUN: { - setobjs2s(L, oldtop, L->top - 1); /* error message on current top */ - break; - } - } - L->top = oldtop + 1; -} - - -static void restore_stack_limit (lua_State *L) { - lua_assert(L->stack_last - L->stack == L->stacksize - EXTRA_STACK - 1); - if (L->size_ci > LUAI_MAXCALLS) { /* there was an overflow? */ - int inuse = cast_int(L->ci - L->base_ci); - if (inuse + 1 < LUAI_MAXCALLS) /* can `undo' overflow? */ - luaD_reallocCI(L, LUAI_MAXCALLS); - } -} - - -static void resetstack (lua_State *L, int status) { - L->ci = L->base_ci; - L->base = L->ci->base; - luaF_close(L, L->base); /* close eventual pending closures */ - luaD_seterrorobj(L, status, L->base); - L->nCcalls = 0; - L->allowhook = 1; - restore_stack_limit(L); - L->errfunc = 0; - L->errorJmp = NULL; -} - - -void luaD_throw (lua_State *L, int errcode) { - if (L->errorJmp) { - L->errorJmp->status = errcode; - LUAI_THROW(L, L->errorJmp); - } - else { - L->status = cast_byte(errcode); - if (G(L)->panic) { - resetstack(L, errcode); - lua_unlock(L); - G(L)->panic(L); - } - exit(EXIT_FAILURE); - } -} - - -int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) { - struct lua_longjmp lj; - lj.status = 0; - lj.previous = L->errorJmp; /* chain new error handler */ - L->errorJmp = &lj; - LUAI_TRY(L, &lj, - (*f)(L, ud); - ); - L->errorJmp = lj.previous; /* restore old error handler */ - return lj.status; -} - -/* }====================================================== */ - - -static void correctstack (lua_State *L, TValue *oldstack) { - CallInfo *ci; - GCObject *up; - L->top = (L->top - oldstack) + L->stack; - for (up = L->openupval; up != NULL; up = up->gch.next) - gco2uv(up)->v = (gco2uv(up)->v - oldstack) + L->stack; - for (ci = L->base_ci; ci <= L->ci; ci++) { - ci->top = (ci->top - oldstack) + L->stack; - ci->base = (ci->base - oldstack) + L->stack; - ci->func = (ci->func - oldstack) + L->stack; - } - L->base = (L->base - oldstack) + L->stack; -} - - -void luaD_reallocstack (lua_State *L, int newsize) { - TValue *oldstack = L->stack; - int realsize = newsize + 1 + EXTRA_STACK; - lua_assert(L->stack_last - L->stack == L->stacksize - EXTRA_STACK - 1); - luaM_reallocvector(L, L->stack, L->stacksize, realsize, TValue); - L->stacksize = realsize; - L->stack_last = L->stack+newsize; - correctstack(L, oldstack); -} - - -void luaD_reallocCI (lua_State *L, int newsize) { - CallInfo *oldci = L->base_ci; - luaM_reallocvector(L, L->base_ci, L->size_ci, newsize, CallInfo); - L->size_ci = newsize; - L->ci = (L->ci - oldci) + L->base_ci; - L->end_ci = L->base_ci + L->size_ci - 1; -} - - -void luaD_growstack (lua_State *L, int n) { - if (n <= L->stacksize) /* double size is enough? */ - luaD_reallocstack(L, 2*L->stacksize); - else - luaD_reallocstack(L, L->stacksize + n); -} - - -static CallInfo *growCI (lua_State *L) { - if (L->size_ci > LUAI_MAXCALLS) /* overflow while handling overflow? */ - luaD_throw(L, LUA_ERRERR); - else { - luaD_reallocCI(L, 2*L->size_ci); - if (L->size_ci > LUAI_MAXCALLS) - luaG_runerror(L, "stack overflow"); - } - return ++L->ci; -} - - -void luaD_callhook (lua_State *L, int event, int line) { - lua_Hook hook = L->hook; - if (hook && L->allowhook) { - ptrdiff_t top = savestack(L, L->top); - ptrdiff_t ci_top = savestack(L, L->ci->top); - lua_Debug ar; - ar.event = event; - ar.currentline = line; - if (event == LUA_HOOKTAILRET) - ar.i_ci = 0; /* tail call; no debug information about it */ - else - ar.i_ci = cast_int(L->ci - L->base_ci); - luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */ - L->ci->top = L->top + LUA_MINSTACK; - lua_assert(L->ci->top <= L->stack_last); - L->allowhook = 0; /* cannot call hooks inside a hook */ - lua_unlock(L); - (*hook)(L, &ar); - lua_lock(L); - lua_assert(!L->allowhook); - L->allowhook = 1; - L->ci->top = restorestack(L, ci_top); - L->top = restorestack(L, top); - } -} - - -static StkId adjust_varargs (lua_State *L, Proto *p, int actual) { - int i; - int nfixargs = p->numparams; - Table *htab = NULL; - StkId base, fixed; - for (; actual < nfixargs; ++actual) - setnilvalue(L->top++); -#if defined(LUA_COMPAT_VARARG) - if (p->is_vararg & VARARG_NEEDSARG) { /* compat. with old-style vararg? */ - int nvar = actual - nfixargs; /* number of extra arguments */ - lua_assert(p->is_vararg & VARARG_HASARG); - luaC_checkGC(L); - htab = luaH_new(L, nvar, 1); /* create `arg' table */ - for (i=0; itop - nvar + i); - /* store counter in field `n' */ - setnvalue(luaH_setstr(L, htab, luaS_newliteral(L, "n")), cast_num(nvar)); - } -#endif - /* move fixed parameters to final position */ - fixed = L->top - actual; /* first fixed argument */ - base = L->top; /* final position of first argument */ - for (i=0; itop++, fixed+i); - setnilvalue(fixed+i); - } - /* add `arg' parameter */ - if (htab) { - sethvalue(L, L->top++, htab); - lua_assert(iswhite(obj2gco(htab))); - } - return base; -} - - -static StkId tryfuncTM (lua_State *L, StkId func) { - const TValue *tm = luaT_gettmbyobj(L, func, TM_CALL); - StkId p; - ptrdiff_t funcr = savestack(L, func); - if (!ttisfunction(tm)) - luaG_typeerror(L, func, "call"); - /* Open a hole inside the stack at `func' */ - for (p = L->top; p > func; p--) setobjs2s(L, p, p-1); - incr_top(L); - func = restorestack(L, funcr); /* previous call may change stack */ - setobj2s(L, func, tm); /* tag method is the new function to be called */ - return func; -} - - - -#define inc_ci(L) \ - ((L->ci == L->end_ci) ? growCI(L) : \ - (condhardstacktests(luaD_reallocCI(L, L->size_ci)), ++L->ci)) - - -int luaD_precall (lua_State *L, StkId func, int nresults) { - LClosure *cl; - ptrdiff_t funcr; - if (!ttisfunction(func)) /* `func' is not a function? */ - func = tryfuncTM(L, func); /* check the `function' tag method */ - funcr = savestack(L, func); - cl = &clvalue(func)->l; - L->ci->savedpc = L->savedpc; - if (!cl->isC) { /* Lua function? prepare its call */ - CallInfo *ci; - StkId st, base; - Proto *p = cl->p; - luaD_checkstack(L, p->maxstacksize); - func = restorestack(L, funcr); - if (!p->is_vararg) { /* no varargs? */ - base = func + 1; - if (L->top > base + p->numparams) - L->top = base + p->numparams; - } - else { /* vararg function */ - int nargs = cast_int(L->top - func) - 1; - base = adjust_varargs(L, p, nargs); - func = restorestack(L, funcr); /* previous call may change the stack */ - } - ci = inc_ci(L); /* now `enter' new function */ - ci->func = func; - L->base = ci->base = base; - ci->top = L->base + p->maxstacksize; - lua_assert(ci->top <= L->stack_last); - L->savedpc = p->code; /* starting point */ - ci->tailcalls = 0; - ci->nresults = nresults; - for (st = L->top; st < ci->top; st++) - setnilvalue(st); - L->top = ci->top; - if (L->hookmask & LUA_MASKCALL) { - L->savedpc++; /* hooks assume 'pc' is already incremented */ - luaD_callhook(L, LUA_HOOKCALL, -1); - L->savedpc--; /* correct 'pc' */ - } - return PCRLUA; - } - else { /* if is a C function, call it */ - CallInfo *ci; - int n; - luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */ - ci = inc_ci(L); /* now `enter' new function */ - ci->func = restorestack(L, funcr); - L->base = ci->base = ci->func + 1; - ci->top = L->top + LUA_MINSTACK; - lua_assert(ci->top <= L->stack_last); - ci->nresults = nresults; - if (L->hookmask & LUA_MASKCALL) - luaD_callhook(L, LUA_HOOKCALL, -1); - lua_unlock(L); - n = (*curr_func(L)->c.f)(L); /* do the actual call */ - lua_lock(L); - if (n < 0) /* yielding? */ - return PCRYIELD; - else { - luaD_poscall(L, L->top - n); - return PCRC; - } - } -} - - -static StkId callrethooks (lua_State *L, StkId firstResult) { - ptrdiff_t fr = savestack(L, firstResult); /* next call may change stack */ - luaD_callhook(L, LUA_HOOKRET, -1); - if (f_isLua(L->ci)) { /* Lua function? */ - while (L->ci->tailcalls--) /* call hook for eventual tail calls */ - luaD_callhook(L, LUA_HOOKTAILRET, -1); - } - return restorestack(L, fr); -} - - -int luaD_poscall (lua_State *L, StkId firstResult) { - StkId res; - int wanted, i; - CallInfo *ci; - if (L->hookmask & LUA_MASKRET) - firstResult = callrethooks(L, firstResult); - ci = L->ci--; - res = ci->func; /* res == final position of 1st result */ - wanted = ci->nresults; - L->base = (ci - 1)->base; /* restore base */ - L->savedpc = (ci - 1)->savedpc; /* restore savedpc */ - /* move results to correct place */ - for (i = wanted; i != 0 && firstResult < L->top; i--) - setobjs2s(L, res++, firstResult++); - while (i-- > 0) - setnilvalue(res++); - L->top = res; - return (wanted - LUA_MULTRET); /* 0 iff wanted == LUA_MULTRET */ -} - - -/* -** Call a function (C or Lua). The function to be called is at *func. -** The arguments are on the stack, right after the function. -** When returns, all the results are on the stack, starting at the original -** function position. -*/ -void luaD_call (lua_State *L, StkId func, int nResults) { - if (++L->nCcalls >= LUAI_MAXCCALLS) { - if (L->nCcalls == LUAI_MAXCCALLS) - luaG_runerror(L, "C stack overflow"); - else if (L->nCcalls >= (LUAI_MAXCCALLS + (LUAI_MAXCCALLS>>3))) - luaD_throw(L, LUA_ERRERR); /* error while handing stack error */ - } - if (luaD_precall(L, func, nResults) == PCRLUA) /* is a Lua function? */ - luaV_execute(L, 1); /* call it */ - L->nCcalls--; - luaC_checkGC(L); -} - - -static void resume (lua_State *L, void *ud) { - StkId firstArg = cast(StkId, ud); - CallInfo *ci = L->ci; - if (L->status == 0) { /* start coroutine? */ - lua_assert(ci == L->base_ci && firstArg > L->base); - if (luaD_precall(L, firstArg - 1, LUA_MULTRET) != PCRLUA) - return; - } - else { /* resuming from previous yield */ - lua_assert(L->status == LUA_YIELD); - L->status = 0; - if (!f_isLua(ci)) { /* `common' yield? */ - /* finish interrupted execution of `OP_CALL' */ - lua_assert(GET_OPCODE(*((ci-1)->savedpc - 1)) == OP_CALL || - GET_OPCODE(*((ci-1)->savedpc - 1)) == OP_TAILCALL); - if (luaD_poscall(L, firstArg)) /* complete it... */ - L->top = L->ci->top; /* and correct top if not multiple results */ - } - else /* yielded inside a hook: just continue its execution */ - L->base = L->ci->base; - } - luaV_execute(L, cast_int(L->ci - L->base_ci)); -} - - -static int resume_error (lua_State *L, const char *msg) { - L->top = L->ci->base; - setsvalue2s(L, L->top, luaS_new(L, msg)); - incr_top(L); - lua_unlock(L); - return LUA_ERRRUN; -} - - -LUA_API int lua_resume (lua_State *L, int nargs) { - int status; - lua_lock(L); - if (L->status != LUA_YIELD) { - if (L->status != 0) - return resume_error(L, "cannot resume dead coroutine"); - else if (L->ci != L->base_ci) - return resume_error(L, "cannot resume non-suspended coroutine"); - } - luai_userstateresume(L, nargs); - lua_assert(L->errfunc == 0 && L->nCcalls == 0); - status = luaD_rawrunprotected(L, resume, L->top - nargs); - if (status != 0) { /* error? */ - L->status = cast_byte(status); /* mark thread as `dead' */ - luaD_seterrorobj(L, status, L->top); - L->ci->top = L->top; - } - else - status = L->status; - lua_unlock(L); - return status; -} - - -LUA_API int lua_yield (lua_State *L, int nresults) { - luai_userstateyield(L, nresults); - lua_lock(L); - if (L->nCcalls > 0) - luaG_runerror(L, "attempt to yield across metamethod/C-call boundary"); - L->base = L->top - nresults; /* protect stack slots below */ - L->status = LUA_YIELD; - lua_unlock(L); - return -1; -} - - -int luaD_pcall (lua_State *L, Pfunc func, void *u, - ptrdiff_t old_top, ptrdiff_t ef) { - int status; - unsigned short oldnCcalls = L->nCcalls; - ptrdiff_t old_ci = saveci(L, L->ci); - lu_byte old_allowhooks = L->allowhook; - ptrdiff_t old_errfunc = L->errfunc; - L->errfunc = ef; - status = luaD_rawrunprotected(L, func, u); - if (status != 0) { /* an error occurred? */ - StkId oldtop = restorestack(L, old_top); - luaF_close(L, oldtop); /* close eventual pending closures */ - luaD_seterrorobj(L, status, oldtop); - L->nCcalls = oldnCcalls; - L->ci = restoreci(L, old_ci); - L->base = L->ci->base; - L->savedpc = L->ci->savedpc; - L->allowhook = old_allowhooks; - restore_stack_limit(L); - } - L->errfunc = old_errfunc; - return status; -} - - - -/* -** Execute a protected parser. -*/ -struct SParser { /* data to `f_parser' */ - ZIO *z; - Mbuffer buff; /* buffer to be used by the scanner */ - const char *name; -}; - -static void f_parser (lua_State *L, void *ud) { - int i; - Proto *tf; - Closure *cl; - struct SParser *p = cast(struct SParser *, ud); - int c = luaZ_lookahead(p->z); - luaC_checkGC(L); - tf = ((c == LUA_SIGNATURE[0]) ? luaU_undump : luaY_parser)(L, p->z, - &p->buff, p->name); - cl = luaF_newLclosure(L, tf->nups, hvalue(gt(L))); - cl->l.p = tf; - for (i = 0; i < tf->nups; i++) /* initialize eventual upvalues */ - cl->l.upvals[i] = luaF_newupval(L); - setclvalue(L, L->top, cl); - incr_top(L); -} - - -int luaD_protectedparser (lua_State *L, ZIO *z, const char *name) { - struct SParser p; - int status; - p.z = z; p.name = name; - luaZ_initbuffer(L, &p.buff); - status = luaD_pcall(L, f_parser, &p, savestack(L, L->top), L->errfunc); - luaZ_freebuffer(L, &p.buff); - return status; -} diff --git a/uppdev/lua/src/ldo.h b/uppdev/lua/src/ldo.h deleted file mode 100644 index 4e4c2f6fb..000000000 --- a/uppdev/lua/src/ldo.h +++ /dev/null @@ -1,56 +0,0 @@ -/* -** $Id: ldo.h,v 2.7 2005/08/24 16:15:49 roberto Exp $ -** Stack and Call structure of Lua -** See Copyright Notice in lua.h -*/ - -#ifndef ldo_h -#define ldo_h - - -#include "lobject.h" -#include "lstate.h" -#include "lzio.h" - - -#define luaD_checkstack(L,n) \ - if ((char *)L->stack_last - (char *)L->top <= (n)*(int)sizeof(TValue)) \ - luaD_growstack(L, n); \ - else condhardstacktests(luaD_reallocstack(L, L->stacksize - EXTRA_STACK - 1)); - - -#define incr_top(L) {luaD_checkstack(L,1); L->top++;} - -#define savestack(L,p) ((char *)(p) - (char *)L->stack) -#define restorestack(L,n) ((TValue *)((char *)L->stack + (n))) - -#define saveci(L,p) ((char *)(p) - (char *)L->base_ci) -#define restoreci(L,n) ((CallInfo *)((char *)L->base_ci + (n))) - - -/* results from luaD_precall */ -#define PCRLUA 0 /* initiated a call to a Lua function */ -#define PCRC 1 /* did a call to a C function */ -#define PCRYIELD 2 /* C funtion yielded */ - - -/* type of protected functions, to be ran by `runprotected' */ -typedef void (*Pfunc) (lua_State *L, void *ud); - -LUAI_FUNC int luaD_protectedparser (lua_State *L, ZIO *z, const char *name); -LUAI_FUNC void luaD_callhook (lua_State *L, int event, int line); -LUAI_FUNC int luaD_precall (lua_State *L, StkId func, int nresults); -LUAI_FUNC void luaD_call (lua_State *L, StkId func, int nResults); -LUAI_FUNC int luaD_pcall (lua_State *L, Pfunc func, void *u, - ptrdiff_t oldtop, ptrdiff_t ef); -LUAI_FUNC int luaD_poscall (lua_State *L, StkId firstResult); -LUAI_FUNC void luaD_reallocCI (lua_State *L, int newsize); -LUAI_FUNC void luaD_reallocstack (lua_State *L, int newsize); -LUAI_FUNC void luaD_growstack (lua_State *L, int n); - -LUAI_FUNC void luaD_throw (lua_State *L, int errcode); -LUAI_FUNC int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud); - -LUAI_FUNC void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop); - -#endif diff --git a/uppdev/lua/src/ldump.c b/uppdev/lua/src/ldump.c deleted file mode 100644 index 788cdcfa8..000000000 --- a/uppdev/lua/src/ldump.c +++ /dev/null @@ -1,164 +0,0 @@ -/* -** $Id: ldump.c,v 1.15 2006/02/16 15:53:49 lhf Exp $ -** save precompiled Lua chunks -** See Copyright Notice in lua.h -*/ - -#include - -#define ldump_c -#define LUA_CORE - -#include "lua.h" - -#include "lobject.h" -#include "lstate.h" -#include "lundump.h" - -typedef struct { - lua_State* L; - lua_Writer writer; - void* data; - int strip; - int status; -} DumpState; - -#define DumpMem(b,n,size,D) DumpBlock(b,(n)*(size),D) -#define DumpVar(x,D) DumpMem(&x,1,sizeof(x),D) - -static void DumpBlock(const void* b, size_t size, DumpState* D) -{ - if (D->status==0) - { - lua_unlock(D->L); - D->status=(*D->writer)(D->L,b,size,D->data); - lua_lock(D->L); - } -} - -static void DumpChar(int y, DumpState* D) -{ - char x=(char)y; - DumpVar(x,D); -} - -static void DumpInt(int x, DumpState* D) -{ - DumpVar(x,D); -} - -static void DumpNumber(lua_Number x, DumpState* D) -{ - DumpVar(x,D); -} - -static void DumpVector(const void* b, int n, size_t size, DumpState* D) -{ - DumpInt(n,D); - DumpMem(b,n,size,D); -} - -static void DumpString(const TString* s, DumpState* D) -{ - if (s==NULL || getstr(s)==NULL) - { - size_t size=0; - DumpVar(size,D); - } - else - { - size_t size=s->tsv.len+1; /* include trailing '\0' */ - DumpVar(size,D); - DumpBlock(getstr(s),size,D); - } -} - -#define DumpCode(f,D) DumpVector(f->code,f->sizecode,sizeof(Instruction),D) - -static void DumpFunction(const Proto* f, const TString* p, DumpState* D); - -static void DumpConstants(const Proto* f, DumpState* D) -{ - int i,n=f->sizek; - DumpInt(n,D); - for (i=0; ik[i]; - DumpChar(ttype(o),D); - switch (ttype(o)) - { - case LUA_TNIL: - break; - case LUA_TBOOLEAN: - DumpChar(bvalue(o),D); - break; - case LUA_TNUMBER: - DumpNumber(nvalue(o),D); - break; - case LUA_TSTRING: - DumpString(rawtsvalue(o),D); - break; - default: - lua_assert(0); /* cannot happen */ - break; - } - } - n=f->sizep; - DumpInt(n,D); - for (i=0; ip[i],f->source,D); -} - -static void DumpDebug(const Proto* f, DumpState* D) -{ - int i,n; - n= (D->strip) ? 0 : f->sizelineinfo; - DumpVector(f->lineinfo,n,sizeof(int),D); - n= (D->strip) ? 0 : f->sizelocvars; - DumpInt(n,D); - for (i=0; ilocvars[i].varname,D); - DumpInt(f->locvars[i].startpc,D); - DumpInt(f->locvars[i].endpc,D); - } - n= (D->strip) ? 0 : f->sizeupvalues; - DumpInt(n,D); - for (i=0; iupvalues[i],D); -} - -static void DumpFunction(const Proto* f, const TString* p, DumpState* D) -{ - DumpString((f->source==p || D->strip) ? NULL : f->source,D); - DumpInt(f->linedefined,D); - DumpInt(f->lastlinedefined,D); - DumpChar(f->nups,D); - DumpChar(f->numparams,D); - DumpChar(f->is_vararg,D); - DumpChar(f->maxstacksize,D); - DumpCode(f,D); - DumpConstants(f,D); - DumpDebug(f,D); -} - -static void DumpHeader(DumpState* D) -{ - char h[LUAC_HEADERSIZE]; - luaU_header(h); - DumpBlock(h,LUAC_HEADERSIZE,D); -} - -/* -** dump Lua function as precompiled chunk -*/ -int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip) -{ - DumpState D; - D.L=L; - D.writer=w; - D.data=data; - D.strip=strip; - D.status=0; - DumpHeader(&D); - DumpFunction(f,NULL,&D); - return D.status; -} diff --git a/uppdev/lua/src/lfunc.c b/uppdev/lua/src/lfunc.c deleted file mode 100644 index 460a0edfe..000000000 --- a/uppdev/lua/src/lfunc.c +++ /dev/null @@ -1,173 +0,0 @@ -/* -** $Id: lfunc.c,v 2.12 2005/12/22 16:19:56 roberto Exp $ -** Auxiliary functions to manipulate prototypes and closures -** See Copyright Notice in lua.h -*/ - - -#include - -#define lfunc_c -#define LUA_CORE - -#include "lua.h" - -#include "lfunc.h" -#include "lgc.h" -#include "lmem.h" -#include "lobject.h" -#include "lstate.h" - - - -Closure *luaF_newCclosure (lua_State *L, int nelems, Table *e) { - Closure *c = cast(Closure *, luaM_malloc(L, sizeCclosure(nelems))); - luaC_link(L, obj2gco(c), LUA_TFUNCTION); - c->c.isC = 1; - c->c.env = e; - c->c.nupvalues = cast_byte(nelems); - return c; -} - - -Closure *luaF_newLclosure (lua_State *L, int nelems, Table *e) { - Closure *c = cast(Closure *, luaM_malloc(L, sizeLclosure(nelems))); - luaC_link(L, obj2gco(c), LUA_TFUNCTION); - c->l.isC = 0; - c->l.env = e; - c->l.nupvalues = cast_byte(nelems); - while (nelems--) c->l.upvals[nelems] = NULL; - return c; -} - - -UpVal *luaF_newupval (lua_State *L) { - UpVal *uv = luaM_new(L, UpVal); - luaC_link(L, obj2gco(uv), LUA_TUPVAL); - uv->v = &uv->u.value; - setnilvalue(uv->v); - return uv; -} - - -UpVal *luaF_findupval (lua_State *L, StkId level) { - global_State *g = G(L); - GCObject **pp = &L->openupval; - UpVal *p; - UpVal *uv; - while ((p = ngcotouv(*pp)) != NULL && p->v >= level) { - lua_assert(p->v != &p->u.value); - if (p->v == level) { /* found a corresponding upvalue? */ - if (isdead(g, obj2gco(p))) /* is it dead? */ - changewhite(obj2gco(p)); /* ressurect it */ - return p; - } - pp = &p->next; - } - uv = luaM_new(L, UpVal); /* not found: create a new one */ - uv->tt = LUA_TUPVAL; - uv->marked = luaC_white(g); - uv->v = level; /* current value lives in the stack */ - uv->next = *pp; /* chain it in the proper position */ - *pp = obj2gco(uv); - uv->u.l.prev = &g->uvhead; /* double link it in `uvhead' list */ - uv->u.l.next = g->uvhead.u.l.next; - uv->u.l.next->u.l.prev = uv; - g->uvhead.u.l.next = uv; - lua_assert(uv->u.l.next->u.l.prev == uv && uv->u.l.prev->u.l.next == uv); - return uv; -} - - -static void unlinkupval (UpVal *uv) { - lua_assert(uv->u.l.next->u.l.prev == uv && uv->u.l.prev->u.l.next == uv); - uv->u.l.next->u.l.prev = uv->u.l.prev; /* remove from `uvhead' list */ - uv->u.l.prev->u.l.next = uv->u.l.next; -} - - -void luaF_freeupval (lua_State *L, UpVal *uv) { - if (uv->v != &uv->u.value) /* is it open? */ - unlinkupval(uv); /* remove from open list */ - luaM_free(L, uv); /* free upvalue */ -} - - -void luaF_close (lua_State *L, StkId level) { - UpVal *uv; - global_State *g = G(L); - while ((uv = ngcotouv(L->openupval)) != NULL && uv->v >= level) { - GCObject *o = obj2gco(uv); - lua_assert(!isblack(o) && uv->v != &uv->u.value); - L->openupval = uv->next; /* remove from `open' list */ - if (isdead(g, o)) - luaF_freeupval(L, uv); /* free upvalue */ - else { - unlinkupval(uv); - setobj(L, &uv->u.value, uv->v); - uv->v = &uv->u.value; /* now current value lives here */ - luaC_linkupval(L, uv); /* link upvalue into `gcroot' list */ - } - } -} - - -Proto *luaF_newproto (lua_State *L) { - Proto *f = luaM_new(L, Proto); - luaC_link(L, obj2gco(f), LUA_TPROTO); - f->k = NULL; - f->sizek = 0; - f->p = NULL; - f->sizep = 0; - f->code = NULL; - f->sizecode = 0; - f->sizelineinfo = 0; - f->sizeupvalues = 0; - f->nups = 0; - f->upvalues = NULL; - f->numparams = 0; - f->is_vararg = 0; - f->maxstacksize = 0; - f->lineinfo = NULL; - f->sizelocvars = 0; - f->locvars = NULL; - f->linedefined = 0; - f->lastlinedefined = 0; - f->source = NULL; - return f; -} - - -void luaF_freeproto (lua_State *L, Proto *f) { - luaM_freearray(L, f->code, f->sizecode, Instruction); - luaM_freearray(L, f->p, f->sizep, Proto *); - luaM_freearray(L, f->k, f->sizek, TValue); - luaM_freearray(L, f->lineinfo, f->sizelineinfo, int); - luaM_freearray(L, f->locvars, f->sizelocvars, struct LocVar); - luaM_freearray(L, f->upvalues, f->sizeupvalues, TString *); - luaM_free(L, f); -} - - -void luaF_freeclosure (lua_State *L, Closure *c) { - int size = (c->c.isC) ? sizeCclosure(c->c.nupvalues) : - sizeLclosure(c->l.nupvalues); - luaM_freemem(L, c, size); -} - - -/* -** Look for n-th local variable at line `line' in function `func'. -** Returns NULL if not found. -*/ -const char *luaF_getlocalname (const Proto *f, int local_number, int pc) { - int i; - for (i = 0; isizelocvars && f->locvars[i].startpc <= pc; i++) { - if (pc < f->locvars[i].endpc) { /* is variable active? */ - local_number--; - if (local_number == 0) - return getstr(f->locvars[i].varname); - } - } - return NULL; /* not found */ -} diff --git a/uppdev/lua/src/lfunc.h b/uppdev/lua/src/lfunc.h deleted file mode 100644 index 61550fd7c..000000000 --- a/uppdev/lua/src/lfunc.h +++ /dev/null @@ -1,34 +0,0 @@ -/* -** $Id: lfunc.h,v 2.4 2005/04/25 19:24:10 roberto Exp $ -** Auxiliary functions to manipulate prototypes and closures -** See Copyright Notice in lua.h -*/ - -#ifndef lfunc_h -#define lfunc_h - - -#include "lobject.h" - - -#define sizeCclosure(n) (cast(int, sizeof(CClosure)) + \ - cast(int, sizeof(TValue)*((n)-1))) - -#define sizeLclosure(n) (cast(int, sizeof(LClosure)) + \ - cast(int, sizeof(TValue *)*((n)-1))) - - -LUAI_FUNC Proto *luaF_newproto (lua_State *L); -LUAI_FUNC Closure *luaF_newCclosure (lua_State *L, int nelems, Table *e); -LUAI_FUNC Closure *luaF_newLclosure (lua_State *L, int nelems, Table *e); -LUAI_FUNC UpVal *luaF_newupval (lua_State *L); -LUAI_FUNC UpVal *luaF_findupval (lua_State *L, StkId level); -LUAI_FUNC void luaF_close (lua_State *L, StkId level); -LUAI_FUNC void luaF_freeproto (lua_State *L, Proto *f); -LUAI_FUNC void luaF_freeclosure (lua_State *L, Closure *c); -LUAI_FUNC void luaF_freeupval (lua_State *L, UpVal *uv); -LUAI_FUNC const char *luaF_getlocalname (const Proto *func, int local_number, - int pc); - - -#endif diff --git a/uppdev/lua/src/lgc.c b/uppdev/lua/src/lgc.c deleted file mode 100644 index c8d3b9155..000000000 --- a/uppdev/lua/src/lgc.c +++ /dev/null @@ -1,710 +0,0 @@ -/* -** $Id: lgc.c,v 2.38 2006/05/24 14:34:06 roberto Exp $ -** Garbage Collector -** See Copyright Notice in lua.h -*/ - -#include - -#define lgc_c -#define LUA_CORE - -#include "lua.h" - -#include "ldebug.h" -#include "ldo.h" -#include "lfunc.h" -#include "lgc.h" -#include "lmem.h" -#include "lobject.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "ltm.h" - - -#define GCSTEPSIZE 1024u -#define GCSWEEPMAX 40 -#define GCSWEEPCOST 10 -#define GCFINALIZECOST 100 - - -#define maskmarks cast_byte(~(bitmask(BLACKBIT)|WHITEBITS)) - -#define makewhite(g,x) \ - ((x)->gch.marked = cast_byte(((x)->gch.marked & maskmarks) | luaC_white(g))) - -#define white2gray(x) reset2bits((x)->gch.marked, WHITE0BIT, WHITE1BIT) -#define black2gray(x) resetbit((x)->gch.marked, BLACKBIT) - -#define stringmark(s) reset2bits((s)->tsv.marked, WHITE0BIT, WHITE1BIT) - - -#define isfinalized(u) testbit((u)->marked, FINALIZEDBIT) -#define markfinalized(u) l_setbit((u)->marked, FINALIZEDBIT) - - -#define KEYWEAK bitmask(KEYWEAKBIT) -#define VALUEWEAK bitmask(VALUEWEAKBIT) - - - -#define markvalue(g,o) { checkconsistency(o); \ - if (iscollectable(o) && iswhite(gcvalue(o))) reallymarkobject(g,gcvalue(o)); } - -#define markobject(g,t) { if (iswhite(obj2gco(t))) \ - reallymarkobject(g, obj2gco(t)); } - - -#define setthreshold(g) (g->GCthreshold = (g->estimate/100) * g->gcpause) - - -static void removeentry (Node *n) { - lua_assert(ttisnil(gval(n))); - if (iscollectable(gkey(n))) - setttype(gkey(n), LUA_TDEADKEY); /* dead key; remove it */ -} - - -static void reallymarkobject (global_State *g, GCObject *o) { - lua_assert(iswhite(o) && !isdead(g, o)); - white2gray(o); - switch (o->gch.tt) { - case LUA_TSTRING: { - return; - } - case LUA_TUSERDATA: { - Table *mt = gco2u(o)->metatable; - gray2black(o); /* udata are never gray */ - if (mt) markobject(g, mt); - markobject(g, gco2u(o)->env); - return; - } - case LUA_TUPVAL: { - UpVal *uv = gco2uv(o); - markvalue(g, uv->v); - if (uv->v == &uv->u.value) /* closed? */ - gray2black(o); /* open upvalues are never black */ - return; - } - case LUA_TFUNCTION: { - gco2cl(o)->c.gclist = g->gray; - g->gray = o; - break; - } - case LUA_TTABLE: { - gco2h(o)->gclist = g->gray; - g->gray = o; - break; - } - case LUA_TTHREAD: { - gco2th(o)->gclist = g->gray; - g->gray = o; - break; - } - case LUA_TPROTO: { - gco2p(o)->gclist = g->gray; - g->gray = o; - break; - } - default: lua_assert(0); - } -} - - -static void marktmu (global_State *g) { - GCObject *u = g->tmudata; - if (u) { - do { - u = u->gch.next; - makewhite(g, u); /* may be marked, if left from previous GC */ - reallymarkobject(g, u); - } while (u != g->tmudata); - } -} - - -/* move `dead' udata that need finalization to list `tmudata' */ -size_t luaC_separateudata (lua_State *L, int all) { - global_State *g = G(L); - size_t deadmem = 0; - GCObject **p = &g->mainthread->next; - GCObject *curr; - while ((curr = *p) != NULL) { - if (!(iswhite(curr) || all) || isfinalized(gco2u(curr))) - p = &curr->gch.next; /* don't bother with them */ - else if (fasttm(L, gco2u(curr)->metatable, TM_GC) == NULL) { - markfinalized(gco2u(curr)); /* don't need finalization */ - p = &curr->gch.next; - } - else { /* must call its gc method */ - deadmem += sizeudata(gco2u(curr)); - markfinalized(gco2u(curr)); - *p = curr->gch.next; - /* link `curr' at the end of `tmudata' list */ - if (g->tmudata == NULL) /* list is empty? */ - g->tmudata = curr->gch.next = curr; /* creates a circular list */ - else { - curr->gch.next = g->tmudata->gch.next; - g->tmudata->gch.next = curr; - g->tmudata = curr; - } - } - } - return deadmem; -} - - -static int traversetable (global_State *g, Table *h) { - int i; - int weakkey = 0; - int weakvalue = 0; - const TValue *mode; - if (h->metatable) - markobject(g, h->metatable); - mode = gfasttm(g, h->metatable, TM_MODE); - if (mode && ttisstring(mode)) { /* is there a weak mode? */ - weakkey = (strchr(svalue(mode), 'k') != NULL); - weakvalue = (strchr(svalue(mode), 'v') != NULL); - if (weakkey || weakvalue) { /* is really weak? */ - h->marked &= ~(KEYWEAK | VALUEWEAK); /* clear bits */ - h->marked |= cast_byte((weakkey << KEYWEAKBIT) | - (weakvalue << VALUEWEAKBIT)); - h->gclist = g->weak; /* must be cleared after GC, ... */ - g->weak = obj2gco(h); /* ... so put in the appropriate list */ - } - } - if (weakkey && weakvalue) return 1; - if (!weakvalue) { - i = h->sizearray; - while (i--) - markvalue(g, &h->array[i]); - } - i = sizenode(h); - while (i--) { - Node *n = gnode(h, i); - lua_assert(ttype(gkey(n)) != LUA_TDEADKEY || ttisnil(gval(n))); - if (ttisnil(gval(n))) - removeentry(n); /* remove empty entries */ - else { - lua_assert(!ttisnil(gkey(n))); - if (!weakkey) markvalue(g, gkey(n)); - if (!weakvalue) markvalue(g, gval(n)); - } - } - return weakkey || weakvalue; -} - - -/* -** All marks are conditional because a GC may happen while the -** prototype is still being created -*/ -static void traverseproto (global_State *g, Proto *f) { - int i; - if (f->source) stringmark(f->source); - for (i=0; isizek; i++) /* mark literals */ - markvalue(g, &f->k[i]); - for (i=0; isizeupvalues; i++) { /* mark upvalue names */ - if (f->upvalues[i]) - stringmark(f->upvalues[i]); - } - for (i=0; isizep; i++) { /* mark nested protos */ - if (f->p[i]) - markobject(g, f->p[i]); - } - for (i=0; isizelocvars; i++) { /* mark local-variable names */ - if (f->locvars[i].varname) - stringmark(f->locvars[i].varname); - } -} - - - -static void traverseclosure (global_State *g, Closure *cl) { - markobject(g, cl->c.env); - if (cl->c.isC) { - int i; - for (i=0; ic.nupvalues; i++) /* mark its upvalues */ - markvalue(g, &cl->c.upvalue[i]); - } - else { - int i; - lua_assert(cl->l.nupvalues == cl->l.p->nups); - markobject(g, cl->l.p); - for (i=0; il.nupvalues; i++) /* mark its upvalues */ - markobject(g, cl->l.upvals[i]); - } -} - - -static void checkstacksizes (lua_State *L, StkId max) { - int ci_used = cast_int(L->ci - L->base_ci); /* number of `ci' in use */ - int s_used = cast_int(max - L->stack); /* part of stack in use */ - if (L->size_ci > LUAI_MAXCALLS) /* handling overflow? */ - return; /* do not touch the stacks */ - if (4*ci_used < L->size_ci && 2*BASIC_CI_SIZE < L->size_ci) - luaD_reallocCI(L, L->size_ci/2); /* still big enough... */ - condhardstacktests(luaD_reallocCI(L, ci_used + 1)); - if (4*s_used < L->stacksize && - 2*(BASIC_STACK_SIZE+EXTRA_STACK) < L->stacksize) - luaD_reallocstack(L, L->stacksize/2); /* still big enough... */ - condhardstacktests(luaD_reallocstack(L, s_used)); -} - - -static void traversestack (global_State *g, lua_State *l) { - StkId o, lim; - CallInfo *ci; - markvalue(g, gt(l)); - lim = l->top; - for (ci = l->base_ci; ci <= l->ci; ci++) { - lua_assert(ci->top <= l->stack_last); - if (lim < ci->top) lim = ci->top; - } - for (o = l->stack; o < l->top; o++) - markvalue(g, o); - for (; o <= lim; o++) - setnilvalue(o); - checkstacksizes(l, lim); -} - - -/* -** traverse one gray object, turning it to black. -** Returns `quantity' traversed. -*/ -static l_mem propagatemark (global_State *g) { - GCObject *o = g->gray; - lua_assert(isgray(o)); - gray2black(o); - switch (o->gch.tt) { - case LUA_TTABLE: { - Table *h = gco2h(o); - g->gray = h->gclist; - if (traversetable(g, h)) /* table is weak? */ - black2gray(o); /* keep it gray */ - return sizeof(Table) + sizeof(TValue) * h->sizearray + - sizeof(Node) * sizenode(h); - } - case LUA_TFUNCTION: { - Closure *cl = gco2cl(o); - g->gray = cl->c.gclist; - traverseclosure(g, cl); - return (cl->c.isC) ? sizeCclosure(cl->c.nupvalues) : - sizeLclosure(cl->l.nupvalues); - } - case LUA_TTHREAD: { - lua_State *th = gco2th(o); - g->gray = th->gclist; - th->gclist = g->grayagain; - g->grayagain = o; - black2gray(o); - traversestack(g, th); - return sizeof(lua_State) + sizeof(TValue) * th->stacksize + - sizeof(CallInfo) * th->size_ci; - } - case LUA_TPROTO: { - Proto *p = gco2p(o); - g->gray = p->gclist; - traverseproto(g, p); - return sizeof(Proto) + sizeof(Instruction) * p->sizecode + - sizeof(Proto *) * p->sizep + - sizeof(TValue) * p->sizek + - sizeof(int) * p->sizelineinfo + - sizeof(LocVar) * p->sizelocvars + - sizeof(TString *) * p->sizeupvalues; - } - default: lua_assert(0); return 0; - } -} - - -static size_t propagateall (global_State *g) { - size_t m = 0; - while (g->gray) m += propagatemark(g); - return m; -} - - -/* -** The next function tells whether a key or value can be cleared from -** a weak table. Non-collectable objects are never removed from weak -** tables. Strings behave as `values', so are never removed too. for -** other objects: if really collected, cannot keep them; for userdata -** being finalized, keep them in keys, but not in values -*/ -static int iscleared (const TValue *o, int iskey) { - if (!iscollectable(o)) return 0; - if (ttisstring(o)) { - stringmark(rawtsvalue(o)); /* strings are `values', so are never weak */ - return 0; - } - return iswhite(gcvalue(o)) || - (ttisuserdata(o) && (!iskey && isfinalized(uvalue(o)))); -} - - -/* -** clear collected entries from weaktables -*/ -static void cleartable (GCObject *l) { - while (l) { - Table *h = gco2h(l); - int i = h->sizearray; - lua_assert(testbit(h->marked, VALUEWEAKBIT) || - testbit(h->marked, KEYWEAKBIT)); - if (testbit(h->marked, VALUEWEAKBIT)) { - while (i--) { - TValue *o = &h->array[i]; - if (iscleared(o, 0)) /* value was collected? */ - setnilvalue(o); /* remove value */ - } - } - i = sizenode(h); - while (i--) { - Node *n = gnode(h, i); - if (!ttisnil(gval(n)) && /* non-empty entry? */ - (iscleared(key2tval(n), 1) || iscleared(gval(n), 0))) { - setnilvalue(gval(n)); /* remove value ... */ - removeentry(n); /* remove entry from table */ - } - } - l = h->gclist; - } -} - - -static void freeobj (lua_State *L, GCObject *o) { - switch (o->gch.tt) { - case LUA_TPROTO: luaF_freeproto(L, gco2p(o)); break; - case LUA_TFUNCTION: luaF_freeclosure(L, gco2cl(o)); break; - case LUA_TUPVAL: luaF_freeupval(L, gco2uv(o)); break; - case LUA_TTABLE: luaH_free(L, gco2h(o)); break; - case LUA_TTHREAD: { - lua_assert(gco2th(o) != L && gco2th(o) != G(L)->mainthread); - luaE_freethread(L, gco2th(o)); - break; - } - case LUA_TSTRING: { - G(L)->strt.nuse--; - luaM_freemem(L, o, sizestring(gco2ts(o))); - break; - } - case LUA_TUSERDATA: { - luaM_freemem(L, o, sizeudata(gco2u(o))); - break; - } - default: lua_assert(0); - } -} - - - -#define sweepwholelist(L,p) sweeplist(L,p,MAX_LUMEM) - - -static GCObject **sweeplist (lua_State *L, GCObject **p, lu_mem count) { - GCObject *curr; - global_State *g = G(L); - int deadmask = otherwhite(g); - while ((curr = *p) != NULL && count-- > 0) { - if (curr->gch.tt == LUA_TTHREAD) /* sweep open upvalues of each thread */ - sweepwholelist(L, &gco2th(curr)->openupval); - if ((curr->gch.marked ^ WHITEBITS) & deadmask) { /* not dead? */ - lua_assert(!isdead(g, curr) || testbit(curr->gch.marked, FIXEDBIT)); - makewhite(g, curr); /* make it white (for next cycle) */ - p = &curr->gch.next; - } - else { /* must erase `curr' */ - lua_assert(isdead(g, curr) || deadmask == bitmask(SFIXEDBIT)); - *p = curr->gch.next; - if (curr == g->rootgc) /* is the first element of the list? */ - g->rootgc = curr->gch.next; /* adjust first */ - freeobj(L, curr); - } - } - return p; -} - - -static void checkSizes (lua_State *L) { - global_State *g = G(L); - /* check size of string hash */ - if (g->strt.nuse < cast(lu_int32, g->strt.size/4) && - g->strt.size > MINSTRTABSIZE*2) - luaS_resize(L, g->strt.size/2); /* table is too big */ - /* check size of buffer */ - if (luaZ_sizebuffer(&g->buff) > LUA_MINBUFFER*2) { /* buffer too big? */ - size_t newsize = luaZ_sizebuffer(&g->buff) / 2; - luaZ_resizebuffer(L, &g->buff, newsize); - } -} - - -static void GCTM (lua_State *L) { - global_State *g = G(L); - GCObject *o = g->tmudata->gch.next; /* get first element */ - Udata *udata = rawgco2u(o); - const TValue *tm; - /* remove udata from `tmudata' */ - if (o == g->tmudata) /* last element? */ - g->tmudata = NULL; - else - g->tmudata->gch.next = udata->uv.next; - udata->uv.next = g->mainthread->next; /* return it to `root' list */ - g->mainthread->next = o; - makewhite(g, o); - tm = fasttm(L, udata->uv.metatable, TM_GC); - if (tm != NULL) { - lu_byte oldah = L->allowhook; - lu_mem oldt = g->GCthreshold; - L->allowhook = 0; /* stop debug hooks during GC tag method */ - g->GCthreshold = 2*g->totalbytes; /* avoid GC steps */ - setobj2s(L, L->top, tm); - setuvalue(L, L->top+1, udata); - L->top += 2; - luaD_call(L, L->top - 2, 0); - L->allowhook = oldah; /* restore hooks */ - g->GCthreshold = oldt; /* restore threshold */ - } -} - - -/* -** Call all GC tag methods -*/ -void luaC_callGCTM (lua_State *L) { - while (G(L)->tmudata) - GCTM(L); -} - - -void luaC_freeall (lua_State *L) { - global_State *g = G(L); - int i; - g->currentwhite = WHITEBITS | bitmask(SFIXEDBIT); /* mask to collect all elements */ - sweepwholelist(L, &g->rootgc); - for (i = 0; i < g->strt.size; i++) /* free all string lists */ - sweepwholelist(L, &g->strt.hash[i]); -} - - -static void markmt (global_State *g) { - int i; - for (i=0; imt[i]) markobject(g, g->mt[i]); -} - - -/* mark root set */ -static void markroot (lua_State *L) { - global_State *g = G(L); - g->gray = NULL; - g->grayagain = NULL; - g->weak = NULL; - markobject(g, g->mainthread); - /* make global table be traversed before main stack */ - markvalue(g, gt(g->mainthread)); - markvalue(g, registry(L)); - markmt(g); - g->gcstate = GCSpropagate; -} - - -static void remarkupvals (global_State *g) { - UpVal *uv; - for (uv = g->uvhead.u.l.next; uv != &g->uvhead; uv = uv->u.l.next) { - lua_assert(uv->u.l.next->u.l.prev == uv && uv->u.l.prev->u.l.next == uv); - if (isgray(obj2gco(uv))) - markvalue(g, uv->v); - } -} - - -static void atomic (lua_State *L) { - global_State *g = G(L); - size_t udsize; /* total size of userdata to be finalized */ - /* remark occasional upvalues of (maybe) dead threads */ - remarkupvals(g); - /* traverse objects cautch by write barrier and by 'remarkupvals' */ - propagateall(g); - /* remark weak tables */ - g->gray = g->weak; - g->weak = NULL; - lua_assert(!iswhite(obj2gco(g->mainthread))); - markobject(g, L); /* mark running thread */ - markmt(g); /* mark basic metatables (again) */ - propagateall(g); - /* remark gray again */ - g->gray = g->grayagain; - g->grayagain = NULL; - propagateall(g); - udsize = luaC_separateudata(L, 0); /* separate userdata to be finalized */ - marktmu(g); /* mark `preserved' userdata */ - udsize += propagateall(g); /* remark, to propagate `preserveness' */ - cleartable(g->weak); /* remove collected objects from weak tables */ - /* flip current white */ - g->currentwhite = cast_byte(otherwhite(g)); - g->sweepstrgc = 0; - g->sweepgc = &g->rootgc; - g->gcstate = GCSsweepstring; - g->estimate = g->totalbytes - udsize; /* first estimate */ -} - - -static l_mem singlestep (lua_State *L) { - global_State *g = G(L); - /*lua_checkmemory(L);*/ - switch (g->gcstate) { - case GCSpause: { - markroot(L); /* start a new collection */ - return 0; - } - case GCSpropagate: { - if (g->gray) - return propagatemark(g); - else { /* no more `gray' objects */ - atomic(L); /* finish mark phase */ - return 0; - } - } - case GCSsweepstring: { - lu_mem old = g->totalbytes; - sweepwholelist(L, &g->strt.hash[g->sweepstrgc++]); - if (g->sweepstrgc >= g->strt.size) /* nothing more to sweep? */ - g->gcstate = GCSsweep; /* end sweep-string phase */ - lua_assert(old >= g->totalbytes); - g->estimate -= old - g->totalbytes; - return GCSWEEPCOST; - } - case GCSsweep: { - lu_mem old = g->totalbytes; - g->sweepgc = sweeplist(L, g->sweepgc, GCSWEEPMAX); - if (*g->sweepgc == NULL) { /* nothing more to sweep? */ - checkSizes(L); - g->gcstate = GCSfinalize; /* end sweep phase */ - } - lua_assert(old >= g->totalbytes); - g->estimate -= old - g->totalbytes; - return GCSWEEPMAX*GCSWEEPCOST; - } - case GCSfinalize: { - if (g->tmudata) { - GCTM(L); - if (g->estimate > GCFINALIZECOST) - g->estimate -= GCFINALIZECOST; - return GCFINALIZECOST; - } - else { - g->gcstate = GCSpause; /* end collection */ - g->gcdept = 0; - return 0; - } - } - default: lua_assert(0); return 0; - } -} - - -void luaC_step (lua_State *L) { - global_State *g = G(L); - l_mem lim = (GCSTEPSIZE/100) * g->gcstepmul; - if (lim == 0) - lim = (MAX_LUMEM-1)/2; /* no limit */ - g->gcdept += g->totalbytes - g->GCthreshold; - do { - lim -= singlestep(L); - if (g->gcstate == GCSpause) - break; - } while (lim > 0); - if (g->gcstate != GCSpause) { - if (g->gcdept < GCSTEPSIZE) - g->GCthreshold = g->totalbytes + GCSTEPSIZE; /* - lim/g->gcstepmul;*/ - else { - g->gcdept -= GCSTEPSIZE; - g->GCthreshold = g->totalbytes; - } - } - else { - lua_assert(g->totalbytes >= g->estimate); - setthreshold(g); - } -} - - -void luaC_fullgc (lua_State *L) { - global_State *g = G(L); - if (g->gcstate <= GCSpropagate) { - /* reset sweep marks to sweep all elements (returning them to white) */ - g->sweepstrgc = 0; - g->sweepgc = &g->rootgc; - /* reset other collector lists */ - g->gray = NULL; - g->grayagain = NULL; - g->weak = NULL; - g->gcstate = GCSsweepstring; - } - lua_assert(g->gcstate != GCSpause && g->gcstate != GCSpropagate); - /* finish any pending sweep phase */ - while (g->gcstate != GCSfinalize) { - lua_assert(g->gcstate == GCSsweepstring || g->gcstate == GCSsweep); - singlestep(L); - } - markroot(L); - while (g->gcstate != GCSpause) { - singlestep(L); - } - setthreshold(g); -} - - -void luaC_barrierf (lua_State *L, GCObject *o, GCObject *v) { - global_State *g = G(L); - lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o)); - lua_assert(g->gcstate != GCSfinalize && g->gcstate != GCSpause); - lua_assert(ttype(&o->gch) != LUA_TTABLE); - /* must keep invariant? */ - if (g->gcstate == GCSpropagate) - reallymarkobject(g, v); /* restore invariant */ - else /* don't mind */ - makewhite(g, o); /* mark as white just to avoid other barriers */ -} - - -void luaC_barrierback (lua_State *L, Table *t) { - global_State *g = G(L); - GCObject *o = obj2gco(t); - lua_assert(isblack(o) && !isdead(g, o)); - lua_assert(g->gcstate != GCSfinalize && g->gcstate != GCSpause); - black2gray(o); /* make table gray (again) */ - t->gclist = g->grayagain; - g->grayagain = o; -} - - -void luaC_link (lua_State *L, GCObject *o, lu_byte tt) { - global_State *g = G(L); - o->gch.next = g->rootgc; - g->rootgc = o; - o->gch.marked = luaC_white(g); - o->gch.tt = tt; -} - - -void luaC_linkupval (lua_State *L, UpVal *uv) { - global_State *g = G(L); - GCObject *o = obj2gco(uv); - o->gch.next = g->rootgc; /* link upvalue into `rootgc' list */ - g->rootgc = o; - if (isgray(o)) { - if (g->gcstate == GCSpropagate) { - gray2black(o); /* closed upvalues need barrier */ - luaC_barrier(L, uv, uv->v); - } - else { /* sweep phase: sweep it (turning it into white) */ - makewhite(g, o); - lua_assert(g->gcstate != GCSfinalize && g->gcstate != GCSpause); - } - } -} diff --git a/uppdev/lua/src/lgc.h b/uppdev/lua/src/lgc.h deleted file mode 100644 index d939aabc8..000000000 --- a/uppdev/lua/src/lgc.h +++ /dev/null @@ -1,110 +0,0 @@ -/* -** $Id: lgc.h,v 2.15 2005/08/24 16:15:49 roberto Exp $ -** Garbage Collector -** See Copyright Notice in lua.h -*/ - -#ifndef lgc_h -#define lgc_h - - -#include "lobject.h" - - -/* -** Possible states of the Garbage Collector -*/ -#define GCSpause 0 -#define GCSpropagate 1 -#define GCSsweepstring 2 -#define GCSsweep 3 -#define GCSfinalize 4 - - -/* -** some userful bit tricks -*/ -#define resetbits(x,m) ((x) &= cast(lu_byte, ~(m))) -#define setbits(x,m) ((x) |= (m)) -#define testbits(x,m) ((x) & (m)) -#define bitmask(b) (1<<(b)) -#define bit2mask(b1,b2) (bitmask(b1) | bitmask(b2)) -#define l_setbit(x,b) setbits(x, bitmask(b)) -#define resetbit(x,b) resetbits(x, bitmask(b)) -#define testbit(x,b) testbits(x, bitmask(b)) -#define set2bits(x,b1,b2) setbits(x, (bit2mask(b1, b2))) -#define reset2bits(x,b1,b2) resetbits(x, (bit2mask(b1, b2))) -#define test2bits(x,b1,b2) testbits(x, (bit2mask(b1, b2))) - - - -/* -** Layout for bit use in `marked' field: -** bit 0 - object is white (type 0) -** bit 1 - object is white (type 1) -** bit 2 - object is black -** bit 3 - for userdata: has been finalized -** bit 3 - for tables: has weak keys -** bit 4 - for tables: has weak values -** bit 5 - object is fixed (should not be collected) -** bit 6 - object is "super" fixed (only the main thread) -*/ - - -#define WHITE0BIT 0 -#define WHITE1BIT 1 -#define BLACKBIT 2 -#define FINALIZEDBIT 3 -#define KEYWEAKBIT 3 -#define VALUEWEAKBIT 4 -#define FIXEDBIT 5 -#define SFIXEDBIT 6 -#define WHITEBITS bit2mask(WHITE0BIT, WHITE1BIT) - - -#define iswhite(x) test2bits((x)->gch.marked, WHITE0BIT, WHITE1BIT) -#define isblack(x) testbit((x)->gch.marked, BLACKBIT) -#define isgray(x) (!isblack(x) && !iswhite(x)) - -#define otherwhite(g) (g->currentwhite ^ WHITEBITS) -#define isdead(g,v) ((v)->gch.marked & otherwhite(g) & WHITEBITS) - -#define changewhite(x) ((x)->gch.marked ^= WHITEBITS) -#define gray2black(x) l_setbit((x)->gch.marked, BLACKBIT) - -#define valiswhite(x) (iscollectable(x) && iswhite(gcvalue(x))) - -#define luaC_white(g) cast(lu_byte, (g)->currentwhite & WHITEBITS) - - -#define luaC_checkGC(L) { \ - condhardstacktests(luaD_reallocstack(L, L->stacksize - EXTRA_STACK - 1)); \ - if (G(L)->totalbytes >= G(L)->GCthreshold) \ - luaC_step(L); } - - -#define luaC_barrier(L,p,v) { if (valiswhite(v) && isblack(obj2gco(p))) \ - luaC_barrierf(L,obj2gco(p),gcvalue(v)); } - -#define luaC_barriert(L,t,v) { if (valiswhite(v) && isblack(obj2gco(t))) \ - luaC_barrierback(L,t); } - -#define luaC_objbarrier(L,p,o) \ - { if (iswhite(obj2gco(o)) && isblack(obj2gco(p))) \ - luaC_barrierf(L,obj2gco(p),obj2gco(o)); } - -#define luaC_objbarriert(L,t,o) \ - { if (iswhite(obj2gco(o)) && isblack(obj2gco(t))) luaC_barrierback(L,t); } - -LUAI_FUNC size_t luaC_separateudata (lua_State *L, int all); -LUAI_FUNC void luaC_callGCTM (lua_State *L); -LUAI_FUNC void luaC_freeall (lua_State *L); -LUAI_FUNC void luaC_step (lua_State *L); -LUAI_FUNC void luaC_fullgc (lua_State *L); -LUAI_FUNC void luaC_link (lua_State *L, GCObject *o, lu_byte tt); -LUAI_FUNC void luaC_linkupval (lua_State *L, UpVal *uv); -LUAI_FUNC void luaC_barrierf (lua_State *L, GCObject *o, GCObject *v); -LUAI_FUNC void luaC_barrierback (lua_State *L, Table *t); - - -#endif diff --git a/uppdev/lua/src/linit.c b/uppdev/lua/src/linit.c deleted file mode 100644 index f302caea6..000000000 --- a/uppdev/lua/src/linit.c +++ /dev/null @@ -1,37 +0,0 @@ -/* -** $Id: linit.c,v 1.14 2005/12/29 15:32:11 roberto Exp $ -** Initialization of libraries for lua.c -** See Copyright Notice in lua.h -*/ - - -#define linit_c -#define LUA_LIB - -#include "lua.h" - -#include "lualib.h" -#include "lauxlib.h" - - -static const luaL_Reg lualibs[] = { - {"", luaopen_base}, - {LUA_LOADLIBNAME, luaopen_package}, - {LUA_TABLIBNAME, luaopen_table}, - {LUA_IOLIBNAME, luaopen_io}, - {LUA_OSLIBNAME, luaopen_os}, - {LUA_STRLIBNAME, luaopen_string}, - {LUA_MATHLIBNAME, luaopen_math}, - {LUA_DBLIBNAME, luaopen_debug}, - {NULL, NULL} -}; - - -LUALIB_API void luaL_openlibs (lua_State *L) { - const luaL_Reg *lib = lualibs; - for (; lib->func; lib++) { - lua_pushcfunction(L, lib->func); - lua_pushstring(L, lib->name); - lua_call(L, 1, 0); - } -} diff --git a/uppdev/lua/src/liolib.c b/uppdev/lua/src/liolib.c deleted file mode 100644 index ab1136041..000000000 --- a/uppdev/lua/src/liolib.c +++ /dev/null @@ -1,531 +0,0 @@ -/* -** $Id: liolib.c,v 2.73 2006/05/08 20:14:16 roberto Exp $ -** Standard I/O (and system) library -** See Copyright Notice in lua.h -*/ - - -#include -#include -#include -#include - -#define liolib_c -#define LUA_LIB - -#include "lua.h" - -#include "lauxlib.h" -#include "lualib.h" - - - -#define IO_INPUT 1 -#define IO_OUTPUT 2 - - -static const char *const fnames[] = {"input", "output"}; - - -static int pushresult (lua_State *L, int i, const char *filename) { - int en = errno; /* calls to Lua API may change this value */ - if (i) { - lua_pushboolean(L, 1); - return 1; - } - else { - lua_pushnil(L); - if (filename) - lua_pushfstring(L, "%s: %s", filename, strerror(en)); - else - lua_pushfstring(L, "%s", strerror(en)); - lua_pushinteger(L, en); - return 3; - } -} - - -static void fileerror (lua_State *L, int arg, const char *filename) { - lua_pushfstring(L, "%s: %s", filename, strerror(errno)); - luaL_argerror(L, arg, lua_tostring(L, -1)); -} - - -#define topfile(L) ((FILE **)luaL_checkudata(L, 1, LUA_FILEHANDLE)) - - -static int io_type (lua_State *L) { - void *ud; - luaL_checkany(L, 1); - ud = lua_touserdata(L, 1); - lua_getfield(L, LUA_REGISTRYINDEX, LUA_FILEHANDLE); - if (ud == NULL || !lua_getmetatable(L, 1) || !lua_rawequal(L, -2, -1)) - lua_pushnil(L); /* not a file */ - else if (*((FILE **)ud) == NULL) - lua_pushliteral(L, "closed file"); - else - lua_pushliteral(L, "file"); - return 1; -} - - -static FILE *tofile (lua_State *L) { - FILE **f = topfile(L); - if (*f == NULL) - luaL_error(L, "attempt to use a closed file"); - return *f; -} - - - -/* -** When creating file handles, always creates a `closed' file handle -** before opening the actual file; so, if there is a memory error, the -** file is not left opened. -*/ -static FILE **newfile (lua_State *L) { - FILE **pf = (FILE **)lua_newuserdata(L, sizeof(FILE *)); - *pf = NULL; /* file handle is currently `closed' */ - luaL_getmetatable(L, LUA_FILEHANDLE); - lua_setmetatable(L, -2); - return pf; -} - - -/* -** this function has a separated environment, which defines the -** correct __close for 'popen' files -*/ -static int io_pclose (lua_State *L) { - FILE **p = topfile(L); - int ok = lua_pclose(L, *p); - *p = NULL; - return pushresult(L, ok, NULL); -} - - -static int io_fclose (lua_State *L) { - FILE **p = topfile(L); - int ok = (fclose(*p) == 0); - *p = NULL; - return pushresult(L, ok, NULL); -} - - -static int aux_close (lua_State *L) { - lua_getfenv(L, 1); - lua_getfield(L, -1, "__close"); - return (lua_tocfunction(L, -1))(L); -} - - -static int io_close (lua_State *L) { - if (lua_isnone(L, 1)) - lua_rawgeti(L, LUA_ENVIRONINDEX, IO_OUTPUT); - tofile(L); /* make sure argument is a file */ - return aux_close(L); -} - - -static int io_gc (lua_State *L) { - FILE *f = *topfile(L); - /* ignore closed files and standard files */ - if (f != NULL && f != stdin && f != stdout && f != stderr) - aux_close(L); - return 0; -} - - -static int io_tostring (lua_State *L) { - FILE *f = *topfile(L); - if (f == NULL) - lua_pushstring(L, "file (closed)"); - else - lua_pushfstring(L, "file (%p)", f); - return 1; -} - - -static int io_open (lua_State *L) { - const char *filename = luaL_checkstring(L, 1); - const char *mode = luaL_optstring(L, 2, "r"); - FILE **pf = newfile(L); - *pf = fopen(filename, mode); - return (*pf == NULL) ? pushresult(L, 0, filename) : 1; -} - - -static int io_popen (lua_State *L) { - const char *filename = luaL_checkstring(L, 1); - const char *mode = luaL_optstring(L, 2, "r"); - FILE **pf = newfile(L); - *pf = lua_popen(L, filename, mode); - return (*pf == NULL) ? pushresult(L, 0, filename) : 1; -} - - -static int io_tmpfile (lua_State *L) { - FILE **pf = newfile(L); - *pf = tmpfile(); - return (*pf == NULL) ? pushresult(L, 0, NULL) : 1; -} - - -static FILE *getiofile (lua_State *L, int findex) { - FILE *f; - lua_rawgeti(L, LUA_ENVIRONINDEX, findex); - f = *(FILE **)lua_touserdata(L, -1); - if (f == NULL) - luaL_error(L, "standard %s file is closed", fnames[findex - 1]); - return f; -} - - -static int g_iofile (lua_State *L, int f, const char *mode) { - if (!lua_isnoneornil(L, 1)) { - const char *filename = lua_tostring(L, 1); - if (filename) { - FILE **pf = newfile(L); - *pf = fopen(filename, mode); - if (*pf == NULL) - fileerror(L, 1, filename); - } - else { - tofile(L); /* check that it's a valid file handle */ - lua_pushvalue(L, 1); - } - lua_rawseti(L, LUA_ENVIRONINDEX, f); - } - /* return current value */ - lua_rawgeti(L, LUA_ENVIRONINDEX, f); - return 1; -} - - -static int io_input (lua_State *L) { - return g_iofile(L, IO_INPUT, "r"); -} - - -static int io_output (lua_State *L) { - return g_iofile(L, IO_OUTPUT, "w"); -} - - -static int io_readline (lua_State *L); - - -static void aux_lines (lua_State *L, int idx, int toclose) { - lua_pushvalue(L, idx); - lua_pushboolean(L, toclose); /* close/not close file when finished */ - lua_pushcclosure(L, io_readline, 2); -} - - -static int f_lines (lua_State *L) { - tofile(L); /* check that it's a valid file handle */ - aux_lines(L, 1, 0); - return 1; -} - - -static int io_lines (lua_State *L) { - if (lua_isnoneornil(L, 1)) { /* no arguments? */ - /* will iterate over default input */ - lua_rawgeti(L, LUA_ENVIRONINDEX, IO_INPUT); - return f_lines(L); - } - else { - const char *filename = luaL_checkstring(L, 1); - FILE **pf = newfile(L); - *pf = fopen(filename, "r"); - if (*pf == NULL) - fileerror(L, 1, filename); - aux_lines(L, lua_gettop(L), 1); - return 1; - } -} - - -/* -** {====================================================== -** READ -** ======================================================= -*/ - - -static int read_number (lua_State *L, FILE *f) { - lua_Number d; - if (fscanf(f, LUA_NUMBER_SCAN, &d) == 1) { - lua_pushnumber(L, d); - return 1; - } - else return 0; /* read fails */ -} - - -static int test_eof (lua_State *L, FILE *f) { - int c = getc(f); - ungetc(c, f); - lua_pushlstring(L, NULL, 0); - return (c != EOF); -} - - -static int read_line (lua_State *L, FILE *f) { - luaL_Buffer b; - luaL_buffinit(L, &b); - for (;;) { - size_t l; - char *p = luaL_prepbuffer(&b); - if (fgets(p, LUAL_BUFFERSIZE, f) == NULL) { /* eof? */ - luaL_pushresult(&b); /* close buffer */ - return (lua_strlen(L, -1) > 0); /* check whether read something */ - } - l = strlen(p); - if (l == 0 || p[l-1] != '\n') - luaL_addsize(&b, l); - else { - luaL_addsize(&b, l - 1); /* do not include `eol' */ - luaL_pushresult(&b); /* close buffer */ - return 1; /* read at least an `eol' */ - } - } -} - - -static int read_chars (lua_State *L, FILE *f, size_t n) { - size_t rlen; /* how much to read */ - size_t nr; /* number of chars actually read */ - luaL_Buffer b; - luaL_buffinit(L, &b); - rlen = LUAL_BUFFERSIZE; /* try to read that much each time */ - do { - char *p = luaL_prepbuffer(&b); - if (rlen > n) rlen = n; /* cannot read more than asked */ - nr = fread(p, sizeof(char), rlen, f); - luaL_addsize(&b, nr); - n -= nr; /* still have to read `n' chars */ - } while (n > 0 && nr == rlen); /* until end of count or eof */ - luaL_pushresult(&b); /* close buffer */ - return (n == 0 || lua_strlen(L, -1) > 0); -} - - -static int g_read (lua_State *L, FILE *f, int first) { - int nargs = lua_gettop(L) - 1; - int success; - int n; - clearerr(f); - if (nargs == 0) { /* no arguments? */ - success = read_line(L, f); - n = first+1; /* to return 1 result */ - } - else { /* ensure stack space for all results and for auxlib's buffer */ - luaL_checkstack(L, nargs+LUA_MINSTACK, "too many arguments"); - success = 1; - for (n = first; nargs-- && success; n++) { - if (lua_type(L, n) == LUA_TNUMBER) { - size_t l = (size_t)lua_tointeger(L, n); - success = (l == 0) ? test_eof(L, f) : read_chars(L, f, l); - } - else { - const char *p = lua_tostring(L, n); - luaL_argcheck(L, p && p[0] == '*', n, "invalid option"); - switch (p[1]) { - case 'n': /* number */ - success = read_number(L, f); - break; - case 'l': /* line */ - success = read_line(L, f); - break; - case 'a': /* file */ - read_chars(L, f, ~((size_t)0)); /* read MAX_SIZE_T chars */ - success = 1; /* always success */ - break; - default: - return luaL_argerror(L, n, "invalid format"); - } - } - } - } - if (ferror(f)) - return pushresult(L, 0, NULL); - if (!success) { - lua_pop(L, 1); /* remove last result */ - lua_pushnil(L); /* push nil instead */ - } - return n - first; -} - - -static int io_read (lua_State *L) { - return g_read(L, getiofile(L, IO_INPUT), 1); -} - - -static int f_read (lua_State *L) { - return g_read(L, tofile(L), 2); -} - - -static int io_readline (lua_State *L) { - FILE *f = *(FILE **)lua_touserdata(L, lua_upvalueindex(1)); - int sucess; - if (f == NULL) /* file is already closed? */ - luaL_error(L, "file is already closed"); - sucess = read_line(L, f); - if (ferror(f)) - return luaL_error(L, "%s", strerror(errno)); - if (sucess) return 1; - else { /* EOF */ - if (lua_toboolean(L, lua_upvalueindex(2))) { /* generator created file? */ - lua_settop(L, 0); - lua_pushvalue(L, lua_upvalueindex(1)); - aux_close(L); /* close it */ - } - return 0; - } -} - -/* }====================================================== */ - - -static int g_write (lua_State *L, FILE *f, int arg) { - int nargs = lua_gettop(L) - 1; - int status = 1; - for (; nargs--; arg++) { - if (lua_type(L, arg) == LUA_TNUMBER) { - /* optimization: could be done exactly as for strings */ - status = status && - fprintf(f, LUA_NUMBER_FMT, lua_tonumber(L, arg)) > 0; - } - else { - size_t l; - const char *s = luaL_checklstring(L, arg, &l); - status = status && (fwrite(s, sizeof(char), l, f) == l); - } - } - return pushresult(L, status, NULL); -} - - -static int io_write (lua_State *L) { - return g_write(L, getiofile(L, IO_OUTPUT), 1); -} - - -static int f_write (lua_State *L) { - return g_write(L, tofile(L), 2); -} - - -static int f_seek (lua_State *L) { - static const int mode[] = {SEEK_SET, SEEK_CUR, SEEK_END}; - static const char *const modenames[] = {"set", "cur", "end", NULL}; - FILE *f = tofile(L); - int op = luaL_checkoption(L, 2, "cur", modenames); - long offset = luaL_optlong(L, 3, 0); - op = fseek(f, offset, mode[op]); - if (op) - return pushresult(L, 0, NULL); /* error */ - else { - lua_pushinteger(L, ftell(f)); - return 1; - } -} - - -static int f_setvbuf (lua_State *L) { - static const int mode[] = {_IONBF, _IOFBF, _IOLBF}; - static const char *const modenames[] = {"no", "full", "line", NULL}; - FILE *f = tofile(L); - int op = luaL_checkoption(L, 2, NULL, modenames); - lua_Integer sz = luaL_optinteger(L, 3, LUAL_BUFFERSIZE); - int res = setvbuf(f, NULL, mode[op], sz); - return pushresult(L, res == 0, NULL); -} - - - -static int io_flush (lua_State *L) { - return pushresult(L, fflush(getiofile(L, IO_OUTPUT)) == 0, NULL); -} - - -static int f_flush (lua_State *L) { - return pushresult(L, fflush(tofile(L)) == 0, NULL); -} - - -static const luaL_Reg iolib[] = { - {"close", io_close}, - {"flush", io_flush}, - {"input", io_input}, - {"lines", io_lines}, - {"open", io_open}, - {"output", io_output}, - {"popen", io_popen}, - {"read", io_read}, - {"tmpfile", io_tmpfile}, - {"type", io_type}, - {"write", io_write}, - {NULL, NULL} -}; - - -static const luaL_Reg flib[] = { - {"close", io_close}, - {"flush", f_flush}, - {"lines", f_lines}, - {"read", f_read}, - {"seek", f_seek}, - {"setvbuf", f_setvbuf}, - {"write", f_write}, - {"__gc", io_gc}, - {"__tostring", io_tostring}, - {NULL, NULL} -}; - - -static void createmeta (lua_State *L) { - luaL_newmetatable(L, LUA_FILEHANDLE); /* create metatable for file handles */ - lua_pushvalue(L, -1); /* push metatable */ - lua_setfield(L, -2, "__index"); /* metatable.__index = metatable */ - luaL_register(L, NULL, flib); /* file methods */ -} - - -static void createstdfile (lua_State *L, FILE *f, int k, const char *fname) { - *newfile(L) = f; - if (k > 0) { - lua_pushvalue(L, -1); - lua_rawseti(L, LUA_ENVIRONINDEX, k); - } - lua_setfield(L, -2, fname); -} - - -LUALIB_API int luaopen_io (lua_State *L) { - createmeta(L); - /* create (private) environment (with fields IO_INPUT, IO_OUTPUT, __close) */ - lua_createtable(L, 2, 1); - lua_replace(L, LUA_ENVIRONINDEX); - /* open library */ - luaL_register(L, LUA_IOLIBNAME, iolib); - /* create (and set) default files */ - createstdfile(L, stdin, IO_INPUT, "stdin"); - createstdfile(L, stdout, IO_OUTPUT, "stdout"); - createstdfile(L, stderr, 0, "stderr"); - /* create environment for 'popen' */ - lua_getfield(L, -1, "popen"); - lua_createtable(L, 0, 1); - lua_pushcfunction(L, io_pclose); - lua_setfield(L, -2, "__close"); - lua_setfenv(L, -2); - lua_pop(L, 1); /* pop 'popen' */ - /* set default close function */ - lua_pushcfunction(L, io_fclose); - lua_setfield(L, LUA_ENVIRONINDEX, "__close"); - return 1; -} diff --git a/uppdev/lua/src/llex.c b/uppdev/lua/src/llex.c deleted file mode 100644 index a24227336..000000000 --- a/uppdev/lua/src/llex.c +++ /dev/null @@ -1,460 +0,0 @@ -/* -** $Id: llex.c,v 2.20 2006/03/09 18:14:31 roberto Exp $ -** Lexical Analyzer -** See Copyright Notice in lua.h -*/ - - -#include -#include -#include - -#define llex_c -#define LUA_CORE - -#include "lua.h" - -#include "ldo.h" -#include "llex.h" -#include "lobject.h" -#include "lparser.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "lzio.h" - - - -#define next(ls) (ls->current = zgetc(ls->z)) - - - - -#define currIsNewline(ls) (ls->current == '\n' || ls->current == '\r') - - -/* ORDER RESERVED */ -const char *const luaX_tokens [] = { - "and", "break", "do", "else", "elseif", - "end", "false", "for", "function", "if", - "in", "local", "nil", "not", "or", "repeat", - "return", "then", "true", "until", "while", - "..", "...", "==", ">=", "<=", "~=", - "", "", "", "", - NULL -}; - - -#define save_and_next(ls) (save(ls, ls->current), next(ls)) - - -static void save (LexState *ls, int c) { - Mbuffer *b = ls->buff; - if (b->n + 1 > b->buffsize) { - size_t newsize; - if (b->buffsize >= MAX_SIZET/2) - luaX_lexerror(ls, "lexical element too long", 0); - newsize = b->buffsize * 2; - luaZ_resizebuffer(ls->L, b, newsize); - } - b->buffer[b->n++] = cast(char, c); -} - - -void luaX_init (lua_State *L) { - int i; - for (i=0; itsv.reserved = cast_byte(i+1); /* reserved word */ - } -} - - -#define MAXSRC 80 - - -const char *luaX_token2str (LexState *ls, int token) { - if (token < FIRST_RESERVED) { - lua_assert(token == cast(unsigned char, token)); - return (iscntrl(token)) ? luaO_pushfstring(ls->L, "char(%d)", token) : - luaO_pushfstring(ls->L, "%c", token); - } - else - return luaX_tokens[token-FIRST_RESERVED]; -} - - -static const char *txtToken (LexState *ls, int token) { - switch (token) { - case TK_NAME: - case TK_STRING: - case TK_NUMBER: - save(ls, '\0'); - return luaZ_buffer(ls->buff); - default: - return luaX_token2str(ls, token); - } -} - - -void luaX_lexerror (LexState *ls, const char *msg, int token) { - char buff[MAXSRC]; - luaO_chunkid(buff, getstr(ls->source), MAXSRC); - msg = luaO_pushfstring(ls->L, "%s:%d: %s", buff, ls->linenumber, msg); - if (token) - luaO_pushfstring(ls->L, "%s near " LUA_QS, msg, txtToken(ls, token)); - luaD_throw(ls->L, LUA_ERRSYNTAX); -} - - -void luaX_syntaxerror (LexState *ls, const char *msg) { - luaX_lexerror(ls, msg, ls->t.token); -} - - -TString *luaX_newstring (LexState *ls, const char *str, size_t l) { - lua_State *L = ls->L; - TString *ts = luaS_newlstr(L, str, l); - TValue *o = luaH_setstr(L, ls->fs->h, ts); /* entry for `str' */ - if (ttisnil(o)) - setbvalue(o, 1); /* make sure `str' will not be collected */ - return ts; -} - - -static void inclinenumber (LexState *ls) { - int old = ls->current; - lua_assert(currIsNewline(ls)); - next(ls); /* skip `\n' or `\r' */ - if (currIsNewline(ls) && ls->current != old) - next(ls); /* skip `\n\r' or `\r\n' */ - if (++ls->linenumber >= MAX_INT) - luaX_syntaxerror(ls, "chunk has too many lines"); -} - - -void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source) { - ls->decpoint = '.'; - ls->L = L; - ls->lookahead.token = TK_EOS; /* no look-ahead token */ - ls->z = z; - ls->fs = NULL; - ls->linenumber = 1; - ls->lastline = 1; - ls->source = source; - luaZ_resizebuffer(ls->L, ls->buff, LUA_MINBUFFER); /* initialize buffer */ - next(ls); /* read first char */ -} - - - -/* -** ======================================================= -** LEXICAL ANALYZER -** ======================================================= -*/ - - - -static int check_next (LexState *ls, const char *set) { - if (!strchr(set, ls->current)) - return 0; - save_and_next(ls); - return 1; -} - - -static void buffreplace (LexState *ls, char from, char to) { - size_t n = luaZ_bufflen(ls->buff); - char *p = luaZ_buffer(ls->buff); - while (n--) - if (p[n] == from) p[n] = to; -} - - -static void trydecpoint (LexState *ls, SemInfo *seminfo) { - /* format error: try to update decimal point separator */ - struct lconv *cv = localeconv(); - char old = ls->decpoint; - ls->decpoint = (cv ? cv->decimal_point[0] : '.'); - buffreplace(ls, old, ls->decpoint); /* try updated decimal separator */ - if (!luaO_str2d(luaZ_buffer(ls->buff), &seminfo->r)) { - /* format error with correct decimal point: no more options */ - buffreplace(ls, ls->decpoint, '.'); /* undo change (for error message) */ - luaX_lexerror(ls, "malformed number", TK_NUMBER); - } -} - - -/* LUA_NUMBER */ -static void read_numeral (LexState *ls, SemInfo *seminfo) { - lua_assert(isdigit(ls->current)); - do { - save_and_next(ls); - } while (isdigit(ls->current) || ls->current == '.'); - if (check_next(ls, "Ee")) /* `E'? */ - check_next(ls, "+-"); /* optional exponent sign */ - while (isalnum(ls->current) || ls->current == '_') - save_and_next(ls); - save(ls, '\0'); - buffreplace(ls, '.', ls->decpoint); /* follow locale for decimal point */ - if (!luaO_str2d(luaZ_buffer(ls->buff), &seminfo->r)) /* format error? */ - trydecpoint(ls, seminfo); /* try to update decimal point separator */ -} - - -static int skip_sep (LexState *ls) { - int count = 0; - int s = ls->current; - lua_assert(s == '[' || s == ']'); - save_and_next(ls); - while (ls->current == '=') { - save_and_next(ls); - count++; - } - return (ls->current == s) ? count : (-count) - 1; -} - - -static void read_long_string (LexState *ls, SemInfo *seminfo, int sep) { - int cont = 0; - (void)(cont); /* avoid warnings when `cont' is not used */ - save_and_next(ls); /* skip 2nd `[' */ - if (currIsNewline(ls)) /* string starts with a newline? */ - inclinenumber(ls); /* skip it */ - for (;;) { - switch (ls->current) { - case EOZ: - luaX_lexerror(ls, (seminfo) ? "unfinished long string" : - "unfinished long comment", TK_EOS); - break; /* to avoid warnings */ -#if defined(LUA_COMPAT_LSTR) - case '[': { - if (skip_sep(ls) == sep) { - save_and_next(ls); /* skip 2nd `[' */ - cont++; -#if LUA_COMPAT_LSTR == 1 - if (sep == 0) - luaX_lexerror(ls, "nesting of [[...]] is deprecated", '['); -#endif - } - break; - } -#endif - case ']': { - if (skip_sep(ls) == sep) { - save_and_next(ls); /* skip 2nd `]' */ -#if defined(LUA_COMPAT_LSTR) && LUA_COMPAT_LSTR == 2 - cont--; - if (sep == 0 && cont >= 0) break; -#endif - goto endloop; - } - break; - } - case '\n': - case '\r': { - save(ls, '\n'); - inclinenumber(ls); - if (!seminfo) luaZ_resetbuffer(ls->buff); /* avoid wasting space */ - break; - } - default: { - if (seminfo) save_and_next(ls); - else next(ls); - } - } - } endloop: - if (seminfo) - seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + (2 + sep), - luaZ_bufflen(ls->buff) - 2*(2 + sep)); -} - - -static void read_string (LexState *ls, int del, SemInfo *seminfo) { - save_and_next(ls); - while (ls->current != del) { - switch (ls->current) { - case EOZ: - luaX_lexerror(ls, "unfinished string", TK_EOS); - continue; /* to avoid warnings */ - case '\n': - case '\r': - luaX_lexerror(ls, "unfinished string", TK_STRING); - continue; /* to avoid warnings */ - case '\\': { - int c; - next(ls); /* do not save the `\' */ - switch (ls->current) { - case 'a': c = '\a'; break; - case 'b': c = '\b'; break; - case 'f': c = '\f'; break; - case 'n': c = '\n'; break; - case 'r': c = '\r'; break; - case 't': c = '\t'; break; - case 'v': c = '\v'; break; - case '\n': /* go through */ - case '\r': save(ls, '\n'); inclinenumber(ls); continue; - case EOZ: continue; /* will raise an error next loop */ - default: { - if (!isdigit(ls->current)) - save_and_next(ls); /* handles \\, \", \', and \? */ - else { /* \xxx */ - int i = 0; - c = 0; - do { - c = 10*c + (ls->current-'0'); - next(ls); - } while (++i<3 && isdigit(ls->current)); - if (c > UCHAR_MAX) - luaX_lexerror(ls, "escape sequence too large", TK_STRING); - save(ls, c); - } - continue; - } - } - save(ls, c); - next(ls); - continue; - } - default: - save_and_next(ls); - } - } - save_and_next(ls); /* skip delimiter */ - seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + 1, - luaZ_bufflen(ls->buff) - 2); -} - - -static int llex (LexState *ls, SemInfo *seminfo) { - luaZ_resetbuffer(ls->buff); - for (;;) { - switch (ls->current) { - case '\n': - case '\r': { - inclinenumber(ls); - continue; - } - case '-': { - next(ls); - if (ls->current != '-') return '-'; - /* else is a comment */ - next(ls); - if (ls->current == '[') { - int sep = skip_sep(ls); - luaZ_resetbuffer(ls->buff); /* `skip_sep' may dirty the buffer */ - if (sep >= 0) { - read_long_string(ls, NULL, sep); /* long comment */ - luaZ_resetbuffer(ls->buff); - continue; - } - } - /* else short comment */ - while (!currIsNewline(ls) && ls->current != EOZ) - next(ls); - continue; - } - case '[': { - int sep = skip_sep(ls); - if (sep >= 0) { - read_long_string(ls, seminfo, sep); - return TK_STRING; - } - else if (sep == -1) return '['; - else luaX_lexerror(ls, "invalid long string delimiter", TK_STRING); - } - case '=': { - next(ls); - if (ls->current != '=') return '='; - else { next(ls); return TK_EQ; } - } - case '<': { - next(ls); - if (ls->current != '=') return '<'; - else { next(ls); return TK_LE; } - } - case '>': { - next(ls); - if (ls->current != '=') return '>'; - else { next(ls); return TK_GE; } - } - case '~': { - next(ls); - if (ls->current != '=') return '~'; - else { next(ls); return TK_NE; } - } - case '"': - case '\'': { - read_string(ls, ls->current, seminfo); - return TK_STRING; - } - case '.': { - save_and_next(ls); - if (check_next(ls, ".")) { - if (check_next(ls, ".")) - return TK_DOTS; /* ... */ - else return TK_CONCAT; /* .. */ - } - else if (!isdigit(ls->current)) return '.'; - else { - read_numeral(ls, seminfo); - return TK_NUMBER; - } - } - case EOZ: { - return TK_EOS; - } - default: { - if (isspace(ls->current)) { - lua_assert(!currIsNewline(ls)); - next(ls); - continue; - } - else if (isdigit(ls->current)) { - read_numeral(ls, seminfo); - return TK_NUMBER; - } - else if (isalpha(ls->current) || ls->current == '_') { - /* identifier or reserved word */ - TString *ts; - do { - save_and_next(ls); - } while (isalnum(ls->current) || ls->current == '_'); - ts = luaX_newstring(ls, luaZ_buffer(ls->buff), - luaZ_bufflen(ls->buff)); - if (ts->tsv.reserved > 0) /* reserved word? */ - return ts->tsv.reserved - 1 + FIRST_RESERVED; - else { - seminfo->ts = ts; - return TK_NAME; - } - } - else { - int c = ls->current; - next(ls); - return c; /* single-char tokens (+ - / ...) */ - } - } - } - } -} - - -void luaX_next (LexState *ls) { - ls->lastline = ls->linenumber; - if (ls->lookahead.token != TK_EOS) { /* is there a look-ahead token? */ - ls->t = ls->lookahead; /* use this one */ - ls->lookahead.token = TK_EOS; /* and discharge it */ - } - else - ls->t.token = llex(ls, &ls->t.seminfo); /* read next token */ -} - - -void luaX_lookahead (LexState *ls) { - lua_assert(ls->lookahead.token == TK_EOS); - ls->lookahead.token = llex(ls, &ls->lookahead.seminfo); -} diff --git a/uppdev/lua/src/llex.h b/uppdev/lua/src/llex.h deleted file mode 100644 index 9e45fc664..000000000 --- a/uppdev/lua/src/llex.h +++ /dev/null @@ -1,81 +0,0 @@ -/* -** $Id: llex.h,v 1.58 2006/03/23 18:23:32 roberto Exp $ -** Lexical Analyzer -** See Copyright Notice in lua.h -*/ - -#ifndef llex_h -#define llex_h - -#include "lobject.h" -#include "lzio.h" - - -#define FIRST_RESERVED 257 - -/* maximum length of a reserved word */ -#define TOKEN_LEN (sizeof("function")/sizeof(char)) - - -/* -* WARNING: if you change the order of this enumeration, -* grep "ORDER RESERVED" -*/ -enum RESERVED { - /* terminal symbols denoted by reserved words */ - TK_AND = FIRST_RESERVED, TK_BREAK, - TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FALSE, TK_FOR, TK_FUNCTION, - TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT, - TK_RETURN, TK_THEN, TK_TRUE, TK_UNTIL, TK_WHILE, - /* other terminal symbols */ - TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE, TK_NUMBER, - TK_NAME, TK_STRING, TK_EOS -}; - -/* number of reserved words */ -#define NUM_RESERVED (cast(int, TK_WHILE-FIRST_RESERVED+1)) - - -/* array with token `names' */ -LUAI_DATA const char *const luaX_tokens []; - - -typedef union { - lua_Number r; - TString *ts; -} SemInfo; /* semantics information */ - - -typedef struct Token { - int token; - SemInfo seminfo; -} Token; - - -typedef struct LexState { - int current; /* current character (charint) */ - int linenumber; /* input line counter */ - int lastline; /* line of last token `consumed' */ - Token t; /* current token */ - Token lookahead; /* look ahead token */ - struct FuncState *fs; /* `FuncState' is private to the parser */ - struct lua_State *L; - ZIO *z; /* input stream */ - Mbuffer *buff; /* buffer for tokens */ - TString *source; /* current source name */ - char decpoint; /* locale decimal point */ -} LexState; - - -LUAI_FUNC void luaX_init (lua_State *L); -LUAI_FUNC void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, - TString *source); -LUAI_FUNC TString *luaX_newstring (LexState *ls, const char *str, size_t l); -LUAI_FUNC void luaX_next (LexState *ls); -LUAI_FUNC void luaX_lookahead (LexState *ls); -LUAI_FUNC void luaX_lexerror (LexState *ls, const char *msg, int token); -LUAI_FUNC void luaX_syntaxerror (LexState *ls, const char *s); -LUAI_FUNC const char *luaX_token2str (LexState *ls, int token); - - -#endif diff --git a/uppdev/lua/src/llimits.h b/uppdev/lua/src/llimits.h deleted file mode 100644 index dd576afc1..000000000 --- a/uppdev/lua/src/llimits.h +++ /dev/null @@ -1,128 +0,0 @@ -/* -** $Id: llimits.h,v 1.69 2005/12/27 17:12:00 roberto Exp $ -** Limits, basic types, and some other `installation-dependent' definitions -** See Copyright Notice in lua.h -*/ - -#ifndef llimits_h -#define llimits_h - - -#include -#include - - -#include "lua.h" - - -typedef LUAI_UINT32 lu_int32; - -typedef LUAI_UMEM lu_mem; - -typedef LUAI_MEM l_mem; - - - -/* chars used as small naturals (so that `char' is reserved for characters) */ -typedef unsigned char lu_byte; - - -#define MAX_SIZET ((size_t)(~(size_t)0)-2) - -#define MAX_LUMEM ((lu_mem)(~(lu_mem)0)-2) - - -#define MAX_INT (INT_MAX-2) /* maximum value of an int (-2 for safety) */ - -/* -** conversion of pointer to integer -** this is for hashing only; there is no problem if the integer -** cannot hold the whole pointer value -*/ -#define IntPoint(p) ((unsigned int)(lu_mem)(p)) - - - -/* type to ensure maximum alignment */ -typedef LUAI_USER_ALIGNMENT_T L_Umaxalign; - - -/* result of a `usual argument conversion' over lua_Number */ -typedef LUAI_UACNUMBER l_uacNumber; - - -/* internal assertions for in-house debugging */ -#ifdef lua_assert - -#define check_exp(c,e) (lua_assert(c), (e)) -#define api_check(l,e) lua_assert(e) - -#else - -#define lua_assert(c) ((void)0) -#define check_exp(c,e) (e) -#define api_check luai_apicheck - -#endif - - -#ifndef UNUSED -#define UNUSED(x) ((void)(x)) /* to avoid warnings */ -#endif - - -#ifndef cast -#define cast(t, exp) ((t)(exp)) -#endif - -#define cast_byte(i) cast(lu_byte, (i)) -#define cast_num(i) cast(lua_Number, (i)) -#define cast_int(i) cast(int, (i)) - - - -/* -** type for virtual-machine instructions -** must be an unsigned with (at least) 4 bytes (see details in lopcodes.h) -*/ -typedef lu_int32 Instruction; - - - -/* maximum stack for a Lua function */ -#define MAXSTACK 250 - - - -/* minimum size for the string table (must be power of 2) */ -#ifndef MINSTRTABSIZE -#define MINSTRTABSIZE 32 -#endif - - -/* minimum size for string buffer */ -#ifndef LUA_MINBUFFER -#define LUA_MINBUFFER 32 -#endif - - -#ifndef lua_lock -#define lua_lock(L) ((void) 0) -#define lua_unlock(L) ((void) 0) -#endif - -#ifndef luai_threadyield -#define luai_threadyield(L) {lua_unlock(L); lua_lock(L);} -#endif - - -/* -** macro to control inclusion of some hard tests on stack reallocation -*/ -#ifndef HARDSTACKTESTS -#define condhardstacktests(x) ((void)0) -#else -#define condhardstacktests(x) x -#endif - -#endif diff --git a/uppdev/lua/src/lmathlib.c b/uppdev/lua/src/lmathlib.c deleted file mode 100644 index 5db3ccfb0..000000000 --- a/uppdev/lua/src/lmathlib.c +++ /dev/null @@ -1,262 +0,0 @@ -/* -** $Id: lmathlib.c,v 1.67 2005/08/26 17:36:32 roberto Exp $ -** Standard mathematical library -** See Copyright Notice in lua.h -*/ - - -#include -#include - -#define lmathlib_c -#define LUA_LIB - -#include "lua.h" - -#include "lauxlib.h" -#include "lualib.h" - - -#undef PI -#define PI (3.14159265358979323846) -#define RADIANS_PER_DEGREE (PI/180.0) - - - -static int math_abs (lua_State *L) { - lua_pushnumber(L, fabs(luaL_checknumber(L, 1))); - return 1; -} - -static int math_sin (lua_State *L) { - lua_pushnumber(L, sin(luaL_checknumber(L, 1))); - return 1; -} - -static int math_sinh (lua_State *L) { - lua_pushnumber(L, sinh(luaL_checknumber(L, 1))); - return 1; -} - -static int math_cos (lua_State *L) { - lua_pushnumber(L, cos(luaL_checknumber(L, 1))); - return 1; -} - -static int math_cosh (lua_State *L) { - lua_pushnumber(L, cosh(luaL_checknumber(L, 1))); - return 1; -} - -static int math_tan (lua_State *L) { - lua_pushnumber(L, tan(luaL_checknumber(L, 1))); - return 1; -} - -static int math_tanh (lua_State *L) { - lua_pushnumber(L, tanh(luaL_checknumber(L, 1))); - return 1; -} - -static int math_asin (lua_State *L) { - lua_pushnumber(L, asin(luaL_checknumber(L, 1))); - return 1; -} - -static int math_acos (lua_State *L) { - lua_pushnumber(L, acos(luaL_checknumber(L, 1))); - return 1; -} - -static int math_atan (lua_State *L) { - lua_pushnumber(L, atan(luaL_checknumber(L, 1))); - return 1; -} - -static int math_atan2 (lua_State *L) { - lua_pushnumber(L, atan2(luaL_checknumber(L, 1), luaL_checknumber(L, 2))); - return 1; -} - -static int math_ceil (lua_State *L) { - lua_pushnumber(L, ceil(luaL_checknumber(L, 1))); - return 1; -} - -static int math_floor (lua_State *L) { - lua_pushnumber(L, floor(luaL_checknumber(L, 1))); - return 1; -} - -static int math_fmod (lua_State *L) { - lua_pushnumber(L, fmod(luaL_checknumber(L, 1), luaL_checknumber(L, 2))); - return 1; -} - -static int math_modf (lua_State *L) { - double ip; - double fp = modf(luaL_checknumber(L, 1), &ip); - lua_pushnumber(L, ip); - lua_pushnumber(L, fp); - return 2; -} - -static int math_sqrt (lua_State *L) { - lua_pushnumber(L, sqrt(luaL_checknumber(L, 1))); - return 1; -} - -static int math_pow (lua_State *L) { - lua_pushnumber(L, pow(luaL_checknumber(L, 1), luaL_checknumber(L, 2))); - return 1; -} - -static int math_log (lua_State *L) { - lua_pushnumber(L, log(luaL_checknumber(L, 1))); - return 1; -} - -static int math_log10 (lua_State *L) { - lua_pushnumber(L, log10(luaL_checknumber(L, 1))); - return 1; -} - -static int math_exp (lua_State *L) { - lua_pushnumber(L, exp(luaL_checknumber(L, 1))); - return 1; -} - -static int math_deg (lua_State *L) { - lua_pushnumber(L, luaL_checknumber(L, 1)/RADIANS_PER_DEGREE); - return 1; -} - -static int math_rad (lua_State *L) { - lua_pushnumber(L, luaL_checknumber(L, 1)*RADIANS_PER_DEGREE); - return 1; -} - -static int math_frexp (lua_State *L) { - int e; - lua_pushnumber(L, frexp(luaL_checknumber(L, 1), &e)); - lua_pushinteger(L, e); - return 2; -} - -static int math_ldexp (lua_State *L) { - lua_pushnumber(L, ldexp(luaL_checknumber(L, 1), luaL_checkint(L, 2))); - return 1; -} - - - -static int math_min (lua_State *L) { - int n = lua_gettop(L); /* number of arguments */ - lua_Number dmin = luaL_checknumber(L, 1); - int i; - for (i=2; i<=n; i++) { - lua_Number d = luaL_checknumber(L, i); - if (d < dmin) - dmin = d; - } - lua_pushnumber(L, dmin); - return 1; -} - - -static int math_max (lua_State *L) { - int n = lua_gettop(L); /* number of arguments */ - lua_Number dmax = luaL_checknumber(L, 1); - int i; - for (i=2; i<=n; i++) { - lua_Number d = luaL_checknumber(L, i); - if (d > dmax) - dmax = d; - } - lua_pushnumber(L, dmax); - return 1; -} - - -static int math_random (lua_State *L) { - /* the `%' avoids the (rare) case of r==1, and is needed also because on - some systems (SunOS!) `rand()' may return a value larger than RAND_MAX */ - lua_Number r = (lua_Number)(rand()%RAND_MAX) / (lua_Number)RAND_MAX; - switch (lua_gettop(L)) { /* check number of arguments */ - case 0: { /* no arguments */ - lua_pushnumber(L, r); /* Number between 0 and 1 */ - break; - } - case 1: { /* only upper limit */ - int u = luaL_checkint(L, 1); - luaL_argcheck(L, 1<=u, 1, "interval is empty"); - lua_pushnumber(L, floor(r*u)+1); /* int between 1 and `u' */ - break; - } - case 2: { /* lower and upper limits */ - int l = luaL_checkint(L, 1); - int u = luaL_checkint(L, 2); - luaL_argcheck(L, l<=u, 2, "interval is empty"); - lua_pushnumber(L, floor(r*(u-l+1))+l); /* int between `l' and `u' */ - break; - } - default: return luaL_error(L, "wrong number of arguments"); - } - return 1; -} - - -static int math_randomseed (lua_State *L) { - srand(luaL_checkint(L, 1)); - return 0; -} - - -static const luaL_Reg mathlib[] = { - {"abs", math_abs}, - {"acos", math_acos}, - {"asin", math_asin}, - {"atan2", math_atan2}, - {"atan", math_atan}, - {"ceil", math_ceil}, - {"cosh", math_cosh}, - {"cos", math_cos}, - {"deg", math_deg}, - {"exp", math_exp}, - {"floor", math_floor}, - {"fmod", math_fmod}, - {"frexp", math_frexp}, - {"ldexp", math_ldexp}, - {"log10", math_log10}, - {"log", math_log}, - {"max", math_max}, - {"min", math_min}, - {"modf", math_modf}, - {"pow", math_pow}, - {"rad", math_rad}, - {"random", math_random}, - {"randomseed", math_randomseed}, - {"sinh", math_sinh}, - {"sin", math_sin}, - {"sqrt", math_sqrt}, - {"tanh", math_tanh}, - {"tan", math_tan}, - {NULL, NULL} -}; - - -/* -** Open math library -*/ -LUALIB_API int luaopen_math (lua_State *L) { - luaL_register(L, LUA_MATHLIBNAME, mathlib); - lua_pushnumber(L, PI); - lua_setfield(L, -2, "pi"); - lua_pushnumber(L, HUGE_VAL); - lua_setfield(L, -2, "huge"); -#if defined(LUA_COMPAT_MOD) - lua_getfield(L, -1, "fmod"); - lua_setfield(L, -2, "mod"); -#endif - return 1; -} diff --git a/uppdev/lua/src/lmem.c b/uppdev/lua/src/lmem.c deleted file mode 100644 index ca8db593e..000000000 --- a/uppdev/lua/src/lmem.c +++ /dev/null @@ -1,85 +0,0 @@ -/* -** $Id: lmem.c,v 1.70 2005/12/26 13:35:47 roberto Exp $ -** Interface to Memory Manager -** See Copyright Notice in lua.h -*/ - - -#include - -#define lmem_c -#define LUA_CORE - -#include "lua.h" - -#include "ldebug.h" -#include "ldo.h" -#include "lmem.h" -#include "lobject.h" -#include "lstate.h" - - - -/* -** About the realloc function: -** void * frealloc (void *ud, void *ptr, size_t osize, size_t nsize); -** (`osize' is the old size, `nsize' is the new size) -** -** Lua ensures that (ptr == NULL) iff (osize == 0). -** -** * frealloc(ud, NULL, 0, x) creates a new block of size `x' -** -** * frealloc(ud, p, x, 0) frees the block `p' -** (in this specific case, frealloc must return NULL). -** particularly, frealloc(ud, NULL, 0, 0) does nothing -** (which is equivalent to free(NULL) in ANSI C) -** -** frealloc returns NULL if it cannot create or reallocate the area -** (any reallocation to an equal or smaller size cannot fail!) -*/ - - - -#define MINSIZEARRAY 4 - - -void *luaM_growaux_ (lua_State *L, void *block, int *size, size_t size_elems, - int limit, const char *errormsg) { - void *newblock; - int newsize; - if (*size >= limit/2) { /* cannot double it? */ - if (*size >= limit) /* cannot grow even a little? */ - luaG_runerror(L, errormsg); - newsize = limit; /* still have at least one free place */ - } - else { - newsize = (*size)*2; - if (newsize < MINSIZEARRAY) - newsize = MINSIZEARRAY; /* minimum size */ - } - newblock = luaM_reallocv(L, block, *size, newsize, size_elems); - *size = newsize; /* update only when everything else is OK */ - return newblock; -} - - -void *luaM_toobig (lua_State *L) { - luaG_runerror(L, "memory allocation error: block too big"); - return NULL; /* to avoid warnings */ -} - - - -/* -** generic allocation routine. -*/ -void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) { - global_State *g = G(L); - lua_assert((osize == 0) == (block == NULL)); - block = (*g->frealloc)(g->ud, block, osize, nsize); - if (block == NULL && nsize > 0) - luaD_throw(L, LUA_ERRMEM); - lua_assert((nsize == 0) == (block == NULL)); - g->totalbytes = (g->totalbytes - osize) + nsize; - return block; -} diff --git a/uppdev/lua/src/lmem.h b/uppdev/lua/src/lmem.h deleted file mode 100644 index f463d46b9..000000000 --- a/uppdev/lua/src/lmem.h +++ /dev/null @@ -1,48 +0,0 @@ -/* -** $Id: lmem.h,v 1.31 2005/04/25 19:24:10 roberto Exp $ -** Interface to Memory Manager -** See Copyright Notice in lua.h -*/ - -#ifndef lmem_h -#define lmem_h - - -#include - -#include "llimits.h" -#include "lua.h" - -#define MEMERRMSG "not enough memory" - - -#define luaM_reallocv(L,b,on,n,e) \ - ((cast(size_t, (n)+1) <= MAX_SIZET/(e)) ? /* +1 to avoid warnings */ \ - luaM_realloc_(L, (b), (on)*(e), (n)*(e)) : \ - luaM_toobig(L)) - -#define luaM_freemem(L, b, s) luaM_realloc_(L, (b), (s), 0) -#define luaM_free(L, b) luaM_realloc_(L, (b), sizeof(*(b)), 0) -#define luaM_freearray(L, b, n, t) luaM_reallocv(L, (b), n, 0, sizeof(t)) - -#define luaM_malloc(L,t) luaM_realloc_(L, NULL, 0, (t)) -#define luaM_new(L,t) cast(t *, luaM_malloc(L, sizeof(t))) -#define luaM_newvector(L,n,t) \ - cast(t *, luaM_reallocv(L, NULL, 0, n, sizeof(t))) - -#define luaM_growvector(L,v,nelems,size,t,limit,e) \ - if ((nelems)+1 > (size)) \ - ((v)=cast(t *, luaM_growaux_(L,v,&(size),sizeof(t),limit,e))) - -#define luaM_reallocvector(L, v,oldn,n,t) \ - ((v)=cast(t *, luaM_reallocv(L, v, oldn, n, sizeof(t)))) - - -LUAI_FUNC void *luaM_realloc_ (lua_State *L, void *block, size_t oldsize, - size_t size); -LUAI_FUNC void *luaM_toobig (lua_State *L); -LUAI_FUNC void *luaM_growaux_ (lua_State *L, void *block, int *size, - size_t size_elem, int limit, - const char *errormsg); - -#endif diff --git a/uppdev/lua/src/loadlib.c b/uppdev/lua/src/loadlib.c deleted file mode 100644 index dbd4ea3f6..000000000 --- a/uppdev/lua/src/loadlib.c +++ /dev/null @@ -1,662 +0,0 @@ -/* -** $Id: loadlib.c,v 1.52 2006/04/10 18:27:23 roberto Exp $ -** Dynamic library loader for Lua -** See Copyright Notice in lua.h -** -** This module contains an implementation of loadlib for Unix systems -** that have dlfcn, an implementation for Darwin (Mac OS X), an -** implementation for Windows, and a stub for other systems. -*/ - - -#include -#include - - -#define loadlib_c -#define LUA_LIB - -#include "lauxlib.h" -#include "lobject.h" -#include "lua.h" -#include "lualib.h" - - -/* prefix for open functions in C libraries */ -#define LUA_POF "luaopen_" - -/* separator for open functions in C libraries */ -#define LUA_OFSEP "_" - - -#define LIBPREFIX "LOADLIB: " - -#define POF LUA_POF -#define LIB_FAIL "open" - - -/* error codes for ll_loadfunc */ -#define ERRLIB 1 -#define ERRFUNC 2 - -#define setprogdir(L) ((void)0) - - -static void ll_unloadlib (void *lib); -static void *ll_load (lua_State *L, const char *path); -static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym); - - - -#if defined(LUA_DL_DLOPEN) -/* -** {======================================================================== -** This is an implementation of loadlib based on the dlfcn interface. -** The dlfcn interface is available in Linux, SunOS, Solaris, IRIX, FreeBSD, -** NetBSD, AIX 4.2, HPUX 11, and probably most other Unix flavors, at least -** as an emulation layer on top of native functions. -** ========================================================================= -*/ - -#include - -static void ll_unloadlib (void *lib) { - dlclose(lib); -} - - -static void *ll_load (lua_State *L, const char *path) { - void *lib = dlopen(path, RTLD_NOW); - if (lib == NULL) lua_pushstring(L, dlerror()); - return lib; -} - - -static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) { - lua_CFunction f = (lua_CFunction)dlsym(lib, sym); - if (f == NULL) lua_pushstring(L, dlerror()); - return f; -} - -/* }====================================================== */ - - - -#elif defined(LUA_DL_DLL) -/* -** {====================================================================== -** This is an implementation of loadlib for Windows using native functions. -** ======================================================================= -*/ - -#include - - -#undef setprogdir - -static void setprogdir (lua_State *L) { - char buff[MAX_PATH + 1]; - char *lb; - DWORD nsize = sizeof(buff)/sizeof(char); - DWORD n = GetModuleFileName(NULL, buff, nsize); - if (n == 0 || n == nsize || (lb = strrchr(buff, '\\')) == NULL) - luaL_error(L, "unable to get ModuleFileName"); - else { - *lb = '\0'; - luaL_gsub(L, lua_tostring(L, -1), LUA_EXECDIR, buff); - lua_remove(L, -2); /* remove original string */ - } -} - - -static void pusherror (lua_State *L) { - int error = GetLastError(); - char buffer[128]; - if (FormatMessage(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, error, 0, buffer, sizeof(buffer), NULL)) - lua_pushstring(L, buffer); - else - lua_pushfstring(L, "system error %d\n", error); -} - -static void ll_unloadlib (void *lib) { - FreeLibrary((HINSTANCE)lib); -} - - -static void *ll_load (lua_State *L, const char *path) { - HINSTANCE lib = LoadLibrary(path); - if (lib == NULL) pusherror(L); - return lib; -} - - -static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) { - lua_CFunction f = (lua_CFunction)GetProcAddress((HINSTANCE)lib, sym); - if (f == NULL) pusherror(L); - return f; -} - -/* }====================================================== */ - - - -#elif defined(LUA_DL_DYLD) -/* -** {====================================================================== -** Native Mac OS X / Darwin Implementation -** ======================================================================= -*/ - -#include - - -/* Mac appends a `_' before C function names */ -#undef POF -#define POF "_" LUA_POF - - -static void pusherror (lua_State *L) { - const char *err_str; - const char *err_file; - NSLinkEditErrors err; - int err_num; - NSLinkEditError(&err, &err_num, &err_file, &err_str); - lua_pushstring(L, err_str); -} - - -static const char *errorfromcode (NSObjectFileImageReturnCode ret) { - switch (ret) { - case NSObjectFileImageInappropriateFile: - return "file is not a bundle"; - case NSObjectFileImageArch: - return "library is for wrong CPU type"; - case NSObjectFileImageFormat: - return "bad format"; - case NSObjectFileImageAccess: - return "cannot access file"; - case NSObjectFileImageFailure: - default: - return "unable to load library"; - } -} - - -static void ll_unloadlib (void *lib) { - NSUnLinkModule((NSModule)lib, NSUNLINKMODULE_OPTION_RESET_LAZY_REFERENCES); -} - - -static void *ll_load (lua_State *L, const char *path) { - NSObjectFileImage img; - NSObjectFileImageReturnCode ret; - /* this would be a rare case, but prevents crashing if it happens */ - if(!_dyld_present()) { - lua_pushliteral(L, "dyld not present"); - return NULL; - } - ret = NSCreateObjectFileImageFromFile(path, &img); - if (ret == NSObjectFileImageSuccess) { - NSModule mod = NSLinkModule(img, path, NSLINKMODULE_OPTION_PRIVATE | - NSLINKMODULE_OPTION_RETURN_ON_ERROR); - NSDestroyObjectFileImage(img); - if (mod == NULL) pusherror(L); - return mod; - } - lua_pushstring(L, errorfromcode(ret)); - return NULL; -} - - -static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) { - NSSymbol nss = NSLookupSymbolInModule((NSModule)lib, sym); - if (nss == NULL) { - lua_pushfstring(L, "symbol " LUA_QS " not found", sym); - return NULL; - } - return (lua_CFunction)NSAddressOfSymbol(nss); -} - -/* }====================================================== */ - - - -#else -/* -** {====================================================== -** Fallback for other systems -** ======================================================= -*/ - -#undef LIB_FAIL -#define LIB_FAIL "absent" - - -#define DLMSG "dynamic libraries not enabled; check your Lua installation" - - -static void ll_unloadlib (void *lib) { - (void)lib; /* to avoid warnings */ -} - - -static void *ll_load (lua_State *L, const char *path) { - (void)path; /* to avoid warnings */ - lua_pushliteral(L, DLMSG); - return NULL; -} - - -static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) { - (void)lib; (void)sym; /* to avoid warnings */ - lua_pushliteral(L, DLMSG); - return NULL; -} - -/* }====================================================== */ -#endif - - - -static void **ll_register (lua_State *L, const char *path) { - void **plib; - lua_pushfstring(L, "%s%s", LIBPREFIX, path); - lua_gettable(L, LUA_REGISTRYINDEX); /* check library in registry? */ - if (!lua_isnil(L, -1)) /* is there an entry? */ - plib = (void **)lua_touserdata(L, -1); - else { /* no entry yet; create one */ - lua_pop(L, 1); - plib = (void **)lua_newuserdata(L, sizeof(const void *)); - *plib = NULL; - luaL_getmetatable(L, "_LOADLIB"); - lua_setmetatable(L, -2); - lua_pushfstring(L, "%s%s", LIBPREFIX, path); - lua_pushvalue(L, -2); - lua_settable(L, LUA_REGISTRYINDEX); - } - return plib; -} - - -/* -** __gc tag method: calls library's `ll_unloadlib' function with the lib -** handle -*/ -static int gctm (lua_State *L) { - void **lib = (void **)luaL_checkudata(L, 1, "_LOADLIB"); - if (*lib) ll_unloadlib(*lib); - *lib = NULL; /* mark library as closed */ - return 0; -} - - -static int ll_loadfunc (lua_State *L, const char *path, const char *sym) { - void **reg = ll_register(L, path); - if (*reg == NULL) *reg = ll_load(L, path); - if (*reg == NULL) - return ERRLIB; /* unable to load library */ - else { - lua_CFunction f = ll_sym(L, *reg, sym); - if (f == NULL) - return ERRFUNC; /* unable to find function */ - lua_pushcfunction(L, f); - return 0; /* return function */ - } -} - - -static int ll_loadlib (lua_State *L) { - const char *path = luaL_checkstring(L, 1); - const char *init = luaL_checkstring(L, 2); - int stat = ll_loadfunc(L, path, init); - if (stat == 0) /* no errors? */ - return 1; /* return the loaded function */ - else { /* error; error message is on stack top */ - lua_pushnil(L); - lua_insert(L, -2); - lua_pushstring(L, (stat == ERRLIB) ? LIB_FAIL : "init"); - return 3; /* return nil, error message, and where */ - } -} - - - -/* -** {====================================================== -** 'require' function -** ======================================================= -*/ - - -static int readable (const char *filename) { - FILE *f = fopen(filename, "r"); /* try to open file */ - if (f == NULL) return 0; /* open failed */ - fclose(f); - return 1; -} - - -static const char *pushnexttemplate (lua_State *L, const char *path) { - const char *l; - while (*path == *LUA_PATHSEP) path++; /* skip separators */ - if (*path == '\0') return NULL; /* no more templates */ - l = strchr(path, *LUA_PATHSEP); /* find next separator */ - if (l == NULL) l = path + strlen(path); - lua_pushlstring(L, path, l - path); /* template */ - return l; -} - - -static const char *findfile (lua_State *L, const char *name, - const char *pname) { - const char *path; - name = luaL_gsub(L, name, ".", LUA_DIRSEP); - lua_getfield(L, LUA_ENVIRONINDEX, pname); - path = lua_tostring(L, -1); - if (path == NULL) - luaL_error(L, LUA_QL("package.%s") " must be a string", pname); - lua_pushstring(L, ""); /* error accumulator */ - while ((path = pushnexttemplate(L, path)) != NULL) { - const char *filename; - filename = luaL_gsub(L, lua_tostring(L, -1), LUA_PATH_MARK, name); - if (readable(filename)) /* does file exist and is readable? */ - return filename; /* return that file name */ - lua_pop(L, 2); /* remove path template and file name */ - luaO_pushfstring(L, "\n\tno file " LUA_QS, filename); - lua_concat(L, 2); - } - return NULL; /* not found */ -} - - -static void loaderror (lua_State *L, const char *filename) { - luaL_error(L, "error loading module " LUA_QS " from file " LUA_QS ":\n\t%s", - lua_tostring(L, 1), filename, lua_tostring(L, -1)); -} - - -static int loader_Lua (lua_State *L) { - const char *filename; - const char *name = luaL_checkstring(L, 1); - filename = findfile(L, name, "path"); - if (filename == NULL) return 1; /* library not found in this path */ - if (luaL_loadfile(L, filename) != 0) - loaderror(L, filename); - return 1; /* library loaded successfully */ -} - - -static const char *mkfuncname (lua_State *L, const char *modname) { - const char *funcname; - const char *mark = strchr(modname, *LUA_IGMARK); - if (mark) modname = mark + 1; - funcname = luaL_gsub(L, modname, ".", LUA_OFSEP); - funcname = lua_pushfstring(L, POF"%s", funcname); - lua_remove(L, -2); /* remove 'gsub' result */ - return funcname; -} - - -static int loader_C (lua_State *L) { - const char *funcname; - const char *name = luaL_checkstring(L, 1); - const char *filename = findfile(L, name, "cpath"); - if (filename == NULL) return 1; /* library not found in this path */ - funcname = mkfuncname(L, name); - if (ll_loadfunc(L, filename, funcname) != 0) - loaderror(L, filename); - return 1; /* library loaded successfully */ -} - - -static int loader_Croot (lua_State *L) { - const char *funcname; - const char *filename; - const char *name = luaL_checkstring(L, 1); - const char *p = strchr(name, '.'); - int stat; - if (p == NULL) return 0; /* is root */ - lua_pushlstring(L, name, p - name); - filename = findfile(L, lua_tostring(L, -1), "cpath"); - if (filename == NULL) return 1; /* root not found */ - funcname = mkfuncname(L, name); - if ((stat = ll_loadfunc(L, filename, funcname)) != 0) { - if (stat != ERRFUNC) loaderror(L, filename); /* real error */ - luaO_pushfstring(L, "\n\tno module " LUA_QS " in file " LUA_QS, - name, filename); - return 1; /* function not found */ - } - return 1; -} - - -static int loader_preload (lua_State *L) { - const char *name = luaL_checkstring(L, 1); - lua_getfield(L, LUA_ENVIRONINDEX, "preload"); - if (!lua_istable(L, -1)) - luaL_error(L, LUA_QL("package.preload") " must be a table"); - lua_getfield(L, -1, name); - if (lua_isnil(L, -1)) /* not found? */ - luaO_pushfstring(L, "\n\tno field package.preload['%s']", name); - return 1; -} - - -static const int sentinel_ = 0; -#define sentinel ((void *)&sentinel_) - - -static int ll_require (lua_State *L) { - const char *name = luaL_checkstring(L, 1); - int i; - lua_settop(L, 1); /* _LOADED table will be at index 2 */ - lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED"); - lua_getfield(L, 2, name); - if (lua_toboolean(L, -1)) { /* is it there? */ - if (lua_touserdata(L, -1) == sentinel) /* check loops */ - luaL_error(L, "loop or previous error loading module " LUA_QS, name); - return 1; /* package is already loaded */ - } - /* else must load it; iterate over available loaders */ - lua_getfield(L, LUA_ENVIRONINDEX, "loaders"); - if (!lua_istable(L, -1)) - luaL_error(L, LUA_QL("package.loaders") " must be a table"); - lua_pushstring(L, ""); /* error message accumulator */ - for (i=1; ; i++) { - lua_rawgeti(L, -2, i); /* get a loader */ - if (lua_isnil(L, -1)) - luaL_error(L, "module " LUA_QS " not found:%s", - name, lua_tostring(L, -2)); - lua_pushstring(L, name); - lua_call(L, 1, 1); /* call it */ - if (lua_isfunction(L, -1)) /* did it find module? */ - break; /* module loaded successfully */ - else if (lua_isstring(L, -1)) /* loader returned error message? */ - lua_concat(L, 2); /* accumulate it */ - else - lua_pop(L, 1); - } - lua_pushlightuserdata(L, sentinel); - lua_setfield(L, 2, name); /* _LOADED[name] = sentinel */ - lua_pushstring(L, name); /* pass name as argument to module */ - lua_call(L, 1, 1); /* run loaded module */ - if (!lua_isnil(L, -1)) /* non-nil return? */ - lua_setfield(L, 2, name); /* _LOADED[name] = returned value */ - lua_getfield(L, 2, name); - if (lua_touserdata(L, -1) == sentinel) { /* module did not set a value? */ - lua_pushboolean(L, 1); /* use true as result */ - lua_pushvalue(L, -1); /* extra copy to be returned */ - lua_setfield(L, 2, name); /* _LOADED[name] = true */ - } - return 1; -} - -/* }====================================================== */ - - - -/* -** {====================================================== -** 'module' function -** ======================================================= -*/ - - -static void setfenv (lua_State *L) { - lua_Debug ar; - lua_getstack(L, 1, &ar); - lua_getinfo(L, "f", &ar); - lua_pushvalue(L, -2); - lua_setfenv(L, -2); - lua_pop(L, 1); -} - - -static void dooptions (lua_State *L, int n) { - int i; - for (i = 2; i <= n; i++) { - lua_pushvalue(L, i); /* get option (a function) */ - lua_pushvalue(L, -2); /* module */ - lua_call(L, 1, 0); - } -} - - -static void modinit (lua_State *L, const char *modname) { - const char *dot; - lua_pushvalue(L, -1); - lua_setfield(L, -2, "_M"); /* module._M = module */ - lua_pushstring(L, modname); - lua_setfield(L, -2, "_NAME"); - dot = strrchr(modname, '.'); /* look for last dot in module name */ - if (dot == NULL) dot = modname; - else dot++; - /* set _PACKAGE as package name (full module name minus last part) */ - lua_pushlstring(L, modname, dot - modname); - lua_setfield(L, -2, "_PACKAGE"); -} - - -static int ll_module (lua_State *L) { - const char *modname = luaL_checkstring(L, 1); - int loaded = lua_gettop(L) + 1; /* index of _LOADED table */ - lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED"); - lua_getfield(L, loaded, modname); /* get _LOADED[modname] */ - if (!lua_istable(L, -1)) { /* not found? */ - lua_pop(L, 1); /* remove previous result */ - /* try global variable (and create one if it does not exist) */ - if (luaL_findtable(L, LUA_GLOBALSINDEX, modname, 1) != NULL) - return luaL_error(L, "name conflict for module " LUA_QS, modname); - lua_pushvalue(L, -1); - lua_setfield(L, loaded, modname); /* _LOADED[modname] = new table */ - } - /* check whether table already has a _NAME field */ - lua_getfield(L, -1, "_NAME"); - if (!lua_isnil(L, -1)) /* is table an initialized module? */ - lua_pop(L, 1); - else { /* no; initialize it */ - lua_pop(L, 1); - modinit(L, modname); - } - lua_pushvalue(L, -1); - setfenv(L); - dooptions(L, loaded - 1); - return 0; -} - - -static int ll_seeall (lua_State *L) { - luaL_checktype(L, 1, LUA_TTABLE); - if (!lua_getmetatable(L, 1)) { - lua_createtable(L, 0, 1); /* create new metatable */ - lua_pushvalue(L, -1); - lua_setmetatable(L, 1); - } - lua_pushvalue(L, LUA_GLOBALSINDEX); - lua_setfield(L, -2, "__index"); /* mt.__index = _G */ - return 0; -} - - -/* }====================================================== */ - - - -/* auxiliary mark (for internal use) */ -#define AUXMARK "\1" - -static void setpath (lua_State *L, const char *fieldname, const char *envname, - const char *def) { - const char *path = getenv(envname); - if (path == NULL) /* no environment variable? */ - lua_pushstring(L, def); /* use default */ - else { - /* replace ";;" by ";AUXMARK;" and then AUXMARK by default path */ - path = luaL_gsub(L, path, LUA_PATHSEP LUA_PATHSEP, - LUA_PATHSEP AUXMARK LUA_PATHSEP); - luaL_gsub(L, path, AUXMARK, def); - lua_remove(L, -2); - } - setprogdir(L); - lua_setfield(L, -2, fieldname); -} - - -static const luaL_Reg pk_funcs[] = { - {"loadlib", ll_loadlib}, - {"seeall", ll_seeall}, - {NULL, NULL} -}; - - -static const luaL_Reg ll_funcs[] = { - {"module", ll_module}, - {"require", ll_require}, - {NULL, NULL} -}; - - -static const lua_CFunction loaders[] = - {loader_preload, loader_Lua, loader_C, loader_Croot, NULL}; - - -LUALIB_API int luaopen_package (lua_State *L) { - int i; - /* create new type _LOADLIB */ - luaL_newmetatable(L, "_LOADLIB"); - lua_pushcfunction(L, gctm); - lua_setfield(L, -2, "__gc"); - /* create `package' table */ - luaL_register(L, LUA_LOADLIBNAME, pk_funcs); -#if defined(LUA_COMPAT_LOADLIB) - lua_getfield(L, -1, "loadlib"); - lua_setfield(L, LUA_GLOBALSINDEX, "loadlib"); -#endif - lua_pushvalue(L, -1); - lua_replace(L, LUA_ENVIRONINDEX); - /* create `loaders' table */ - lua_createtable(L, 0, sizeof(loaders)/sizeof(loaders[0]) - 1); - /* fill it with pre-defined loaders */ - for (i=0; loaders[i] != NULL; i++) { - lua_pushcfunction(L, loaders[i]); - lua_rawseti(L, -2, i+1); - } - lua_setfield(L, -2, "loaders"); /* put it in field `loaders' */ - setpath(L, "path", LUA_PATH, LUA_PATH_DEFAULT); /* set field `path' */ - setpath(L, "cpath", LUA_CPATH, LUA_CPATH_DEFAULT); /* set field `cpath' */ - /* store config information */ - lua_pushstring(L, LUA_DIRSEP "\n" LUA_PATHSEP "\n" LUA_PATH_MARK "\n" - LUA_EXECDIR "\n" LUA_IGMARK); - lua_setfield(L, -2, "config"); - /* set field `loaded' */ - luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 2); - lua_setfield(L, -2, "loaded"); - /* set field `preload' */ - lua_newtable(L); - lua_setfield(L, -2, "preload"); - lua_pushvalue(L, LUA_GLOBALSINDEX); - luaL_register(L, NULL, ll_funcs); /* open lib into global table */ - lua_pop(L, 1); - return 1; /* return 'package' table */ -} diff --git a/uppdev/lua/src/lobject.c b/uppdev/lua/src/lobject.c deleted file mode 100644 index 1e9a87f1d..000000000 --- a/uppdev/lua/src/lobject.c +++ /dev/null @@ -1,214 +0,0 @@ -/* -** $Id: lobject.c,v 2.22 2006/02/10 17:43:52 roberto Exp $ -** Some generic functions over Lua objects -** See Copyright Notice in lua.h -*/ - -#include -#include -#include -#include -#include - -#define lobject_c -#define LUA_CORE - -#include "lua.h" - -#include "ldo.h" -#include "lmem.h" -#include "lobject.h" -#include "lstate.h" -#include "lstring.h" -#include "lvm.h" - - - -const TValue luaO_nilobject_ = {{NULL}, LUA_TNIL}; - - -/* -** converts an integer to a "floating point byte", represented as -** (eeeeexxx), where the real value is (1xxx) * 2^(eeeee - 1) if -** eeeee != 0 and (xxx) otherwise. -*/ -int luaO_int2fb (unsigned int x) { - int e = 0; /* expoent */ - while (x >= 16) { - x = (x+1) >> 1; - e++; - } - if (x < 8) return x; - else return ((e+1) << 3) | (cast_int(x) - 8); -} - - -/* converts back */ -int luaO_fb2int (int x) { - int e = (x >> 3) & 31; - if (e == 0) return x; - else return ((x & 7)+8) << (e - 1); -} - - -int luaO_log2 (unsigned int x) { - static const lu_byte log_2[256] = { - 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 - }; - int l = -1; - while (x >= 256) { l += 8; x >>= 8; } - return l + log_2[x]; - -} - - -int luaO_rawequalObj (const TValue *t1, const TValue *t2) { - if (ttype(t1) != ttype(t2)) return 0; - else switch (ttype(t1)) { - case LUA_TNIL: - return 1; - case LUA_TNUMBER: - return luai_numeq(nvalue(t1), nvalue(t2)); - case LUA_TBOOLEAN: - return bvalue(t1) == bvalue(t2); /* boolean true must be 1 !! */ - case LUA_TLIGHTUSERDATA: - return pvalue(t1) == pvalue(t2); - default: - lua_assert(iscollectable(t1)); - return gcvalue(t1) == gcvalue(t2); - } -} - - -int luaO_str2d (const char *s, lua_Number *result) { - char *endptr; - *result = lua_str2number(s, &endptr); - if (endptr == s) return 0; /* conversion failed */ - if (*endptr == 'x' || *endptr == 'X') /* maybe an hexadecimal constant? */ - *result = cast_num(strtoul(s, &endptr, 16)); - if (*endptr == '\0') return 1; /* most common case */ - while (isspace(cast(unsigned char, *endptr))) endptr++; - if (*endptr != '\0') return 0; /* invalid trailing characters? */ - return 1; -} - - - -static void pushstr (lua_State *L, const char *str) { - setsvalue2s(L, L->top, luaS_new(L, str)); - incr_top(L); -} - - -/* this function handles only `%d', `%c', %f, %p, and `%s' formats */ -const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) { - int n = 1; - pushstr(L, ""); - for (;;) { - const char *e = strchr(fmt, '%'); - if (e == NULL) break; - setsvalue2s(L, L->top, luaS_newlstr(L, fmt, e-fmt)); - incr_top(L); - switch (*(e+1)) { - case 's': { - const char *s = va_arg(argp, char *); - if (s == NULL) s = "(null)"; - pushstr(L, s); - break; - } - case 'c': { - char buff[2]; - buff[0] = cast(char, va_arg(argp, int)); - buff[1] = '\0'; - pushstr(L, buff); - break; - } - case 'd': { - setnvalue(L->top, cast_num(va_arg(argp, int))); - incr_top(L); - break; - } - case 'f': { - setnvalue(L->top, cast_num(va_arg(argp, l_uacNumber))); - incr_top(L); - break; - } - case 'p': { - char buff[4*sizeof(void *) + 8]; /* should be enough space for a `%p' */ - sprintf(buff, "%p", va_arg(argp, void *)); - pushstr(L, buff); - break; - } - case '%': { - pushstr(L, "%"); - break; - } - default: { - char buff[3]; - buff[0] = '%'; - buff[1] = *(e+1); - buff[2] = '\0'; - pushstr(L, buff); - break; - } - } - n += 2; - fmt = e+2; - } - pushstr(L, fmt); - luaV_concat(L, n+1, cast_int(L->top - L->base) - 1); - L->top -= n; - return svalue(L->top - 1); -} - - -const char *luaO_pushfstring (lua_State *L, const char *fmt, ...) { - const char *msg; - va_list argp; - va_start(argp, fmt); - msg = luaO_pushvfstring(L, fmt, argp); - va_end(argp); - return msg; -} - - -void luaO_chunkid (char *out, const char *source, size_t bufflen) { - if (*source == '=') { - strncpy(out, source+1, bufflen); /* remove first char */ - out[bufflen-1] = '\0'; /* ensures null termination */ - } - else { /* out = "source", or "...source" */ - if (*source == '@') { - size_t l; - source++; /* skip the `@' */ - bufflen -= sizeof(" '...' "); - l = strlen(source); - strcpy(out, ""); - if (l > bufflen) { - source += (l-bufflen); /* get last part of file name */ - strcat(out, "..."); - } - strcat(out, source); - } - else { /* out = [string "string"] */ - size_t len = strcspn(source, "\n\r"); /* stop at first newline */ - bufflen -= sizeof(" [string \"...\"] "); - if (len > bufflen) len = bufflen; - strcpy(out, "[string \""); - if (source[len] != '\0') { /* must truncate? */ - strncat(out, source, len); - strcat(out, "..."); - } - else - strcat(out, source); - strcat(out, "\"]"); - } - } -} diff --git a/uppdev/lua/src/lobject.h b/uppdev/lua/src/lobject.h deleted file mode 100644 index bcf167387..000000000 --- a/uppdev/lua/src/lobject.h +++ /dev/null @@ -1,380 +0,0 @@ -/* -** $Id: lobject.h,v 2.20 2006/01/18 11:37:34 roberto Exp $ -** Type definitions for Lua objects -** See Copyright Notice in lua.h -*/ - - -#ifndef lobject_h -#define lobject_h - - -#include - - -#include "llimits.h" -#include "lua.h" - - -/* tags for values visible from Lua */ -#define LAST_TAG LUA_TTHREAD - -#define NUM_TAGS (LAST_TAG+1) - - -/* -** Extra tags for non-values -*/ -#define LUA_TPROTO (LAST_TAG+1) -#define LUA_TUPVAL (LAST_TAG+2) -#define LUA_TDEADKEY (LAST_TAG+3) - - -/* -** Union of all collectable objects -*/ -typedef union GCObject GCObject; - - -/* -** Common Header for all collectable objects (in macro form, to be -** included in other objects) -*/ -#define CommonHeader GCObject *next; lu_byte tt; lu_byte marked - - -/* -** Common header in struct form -*/ -typedef struct GCheader { - CommonHeader; -} GCheader; - - - - -/* -** Union of all Lua values -*/ -typedef union { - GCObject *gc; - void *p; - lua_Number n; - int b; -} Value; - - -/* -** Tagged Values -*/ - -#define TValuefields Value value; int tt - -typedef struct lua_TValue { - TValuefields; -} TValue; - - -/* Macros to test type */ -#define ttisnil(o) (ttype(o) == LUA_TNIL) -#define ttisnumber(o) (ttype(o) == LUA_TNUMBER) -#define ttisstring(o) (ttype(o) == LUA_TSTRING) -#define ttistable(o) (ttype(o) == LUA_TTABLE) -#define ttisfunction(o) (ttype(o) == LUA_TFUNCTION) -#define ttisboolean(o) (ttype(o) == LUA_TBOOLEAN) -#define ttisuserdata(o) (ttype(o) == LUA_TUSERDATA) -#define ttisthread(o) (ttype(o) == LUA_TTHREAD) -#define ttislightuserdata(o) (ttype(o) == LUA_TLIGHTUSERDATA) - -/* Macros to access values */ -#define ttype(o) ((o)->tt) -#define gcvalue(o) check_exp(iscollectable(o), (o)->value.gc) -#define pvalue(o) check_exp(ttislightuserdata(o), (o)->value.p) -#define nvalue(o) check_exp(ttisnumber(o), (o)->value.n) -#define rawtsvalue(o) check_exp(ttisstring(o), &(o)->value.gc->ts) -#define tsvalue(o) (&rawtsvalue(o)->tsv) -#define rawuvalue(o) check_exp(ttisuserdata(o), &(o)->value.gc->u) -#define uvalue(o) (&rawuvalue(o)->uv) -#define clvalue(o) check_exp(ttisfunction(o), &(o)->value.gc->cl) -#define hvalue(o) check_exp(ttistable(o), &(o)->value.gc->h) -#define bvalue(o) check_exp(ttisboolean(o), (o)->value.b) -#define thvalue(o) check_exp(ttisthread(o), &(o)->value.gc->th) - -#define l_isfalse(o) (ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0)) - -/* -** for internal debug only -*/ -#define checkconsistency(obj) \ - lua_assert(!iscollectable(obj) || (ttype(obj) == (obj)->value.gc->gch.tt)) - -#define checkliveness(g,obj) \ - lua_assert(!iscollectable(obj) || \ - ((ttype(obj) == (obj)->value.gc->gch.tt) && !isdead(g, (obj)->value.gc))) - - -/* Macros to set values */ -#define setnilvalue(obj) ((obj)->tt=LUA_TNIL) - -#define setnvalue(obj,x) \ - { TValue *i_o=(obj); i_o->value.n=(x); i_o->tt=LUA_TNUMBER; } - -#define setpvalue(obj,x) \ - { TValue *i_o=(obj); i_o->value.p=(x); i_o->tt=LUA_TLIGHTUSERDATA; } - -#define setbvalue(obj,x) \ - { TValue *i_o=(obj); i_o->value.b=(x); i_o->tt=LUA_TBOOLEAN; } - -#define setsvalue(L,obj,x) \ - { TValue *i_o=(obj); \ - i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TSTRING; \ - checkliveness(G(L),i_o); } - -#define setuvalue(L,obj,x) \ - { TValue *i_o=(obj); \ - i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TUSERDATA; \ - checkliveness(G(L),i_o); } - -#define setthvalue(L,obj,x) \ - { TValue *i_o=(obj); \ - i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TTHREAD; \ - checkliveness(G(L),i_o); } - -#define setclvalue(L,obj,x) \ - { TValue *i_o=(obj); \ - i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TFUNCTION; \ - checkliveness(G(L),i_o); } - -#define sethvalue(L,obj,x) \ - { TValue *i_o=(obj); \ - i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TTABLE; \ - checkliveness(G(L),i_o); } - -#define setptvalue(L,obj,x) \ - { TValue *i_o=(obj); \ - i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TPROTO; \ - checkliveness(G(L),i_o); } - - - - -#define setobj(L,obj1,obj2) \ - { const TValue *o2=(obj2); TValue *o1=(obj1); \ - o1->value = o2->value; o1->tt=o2->tt; \ - checkliveness(G(L),o1); } - - -/* -** different types of sets, according to destination -*/ - -/* from stack to (same) stack */ -#define setobjs2s setobj -/* to stack (not from same stack) */ -#define setobj2s setobj -#define setsvalue2s setsvalue -#define sethvalue2s sethvalue -#define setptvalue2s setptvalue -/* from table to same table */ -#define setobjt2t setobj -/* to table */ -#define setobj2t setobj -/* to new object */ -#define setobj2n setobj -#define setsvalue2n setsvalue - -#define setttype(obj, tt) (ttype(obj) = (tt)) - - -#define iscollectable(o) (ttype(o) >= LUA_TSTRING) - - - -typedef TValue *StkId; /* index to stack elements */ - - -/* -** String headers for string table -*/ -typedef union TString { - L_Umaxalign dummy; /* ensures maximum alignment for strings */ - struct { - CommonHeader; - lu_byte reserved; - unsigned int hash; - size_t len; - } tsv; -} TString; - - -#define getstr(ts) cast(const char *, (ts) + 1) -#define svalue(o) getstr(tsvalue(o)) - - - -typedef union Udata { - L_Umaxalign dummy; /* ensures maximum alignment for `local' udata */ - struct { - CommonHeader; - struct Table *metatable; - struct Table *env; - size_t len; - } uv; -} Udata; - - - - -/* -** Function Prototypes -*/ -typedef struct Proto { - CommonHeader; - TValue *k; /* constants used by the function */ - Instruction *code; - struct Proto **p; /* functions defined inside the function */ - int *lineinfo; /* map from opcodes to source lines */ - struct LocVar *locvars; /* information about local variables */ - TString **upvalues; /* upvalue names */ - TString *source; - int sizeupvalues; - int sizek; /* size of `k' */ - int sizecode; - int sizelineinfo; - int sizep; /* size of `p' */ - int sizelocvars; - int linedefined; - int lastlinedefined; - GCObject *gclist; - lu_byte nups; /* number of upvalues */ - lu_byte numparams; - lu_byte is_vararg; - lu_byte maxstacksize; -} Proto; - - -/* masks for new-style vararg */ -#define VARARG_HASARG 1 -#define VARARG_ISVARARG 2 -#define VARARG_NEEDSARG 4 - - -typedef struct LocVar { - TString *varname; - int startpc; /* first point where variable is active */ - int endpc; /* first point where variable is dead */ -} LocVar; - - - -/* -** Upvalues -*/ - -typedef struct UpVal { - CommonHeader; - TValue *v; /* points to stack or to its own value */ - union { - TValue value; /* the value (when closed) */ - struct { /* double linked list (when open) */ - struct UpVal *prev; - struct UpVal *next; - } l; - } u; -} UpVal; - - -/* -** Closures -*/ - -#define ClosureHeader \ - CommonHeader; lu_byte isC; lu_byte nupvalues; GCObject *gclist; \ - struct Table *env - -typedef struct CClosure { - ClosureHeader; - lua_CFunction f; - TValue upvalue[1]; -} CClosure; - - -typedef struct LClosure { - ClosureHeader; - struct Proto *p; - UpVal *upvals[1]; -} LClosure; - - -typedef union Closure { - CClosure c; - LClosure l; -} Closure; - - -#define iscfunction(o) (ttype(o) == LUA_TFUNCTION && clvalue(o)->c.isC) -#define isLfunction(o) (ttype(o) == LUA_TFUNCTION && !clvalue(o)->c.isC) - - -/* -** Tables -*/ - -typedef union TKey { - struct { - TValuefields; - struct Node *next; /* for chaining */ - } nk; - TValue tvk; -} TKey; - - -typedef struct Node { - TValue i_val; - TKey i_key; -} Node; - - -typedef struct Table { - CommonHeader; - lu_byte flags; /* 1<

    lsizenode)) - - -#define luaO_nilobject (&luaO_nilobject_) - -LUAI_DATA const TValue luaO_nilobject_; - -#define ceillog2(x) (luaO_log2((x)-1) + 1) - -LUAI_FUNC int luaO_log2 (unsigned int x); -LUAI_FUNC int luaO_int2fb (unsigned int x); -LUAI_FUNC int luaO_fb2int (int x); -LUAI_FUNC int luaO_rawequalObj (const TValue *t1, const TValue *t2); -LUAI_FUNC int luaO_str2d (const char *s, lua_Number *result); -LUAI_FUNC const char *luaO_pushvfstring (lua_State *L, const char *fmt, - va_list argp); -LUAI_FUNC const char *luaO_pushfstring (lua_State *L, const char *fmt, ...); -LUAI_FUNC void luaO_chunkid (char *out, const char *source, size_t len); - - -#endif diff --git a/uppdev/lua/src/lopcodes.c b/uppdev/lua/src/lopcodes.c deleted file mode 100644 index d3d3a90bd..000000000 --- a/uppdev/lua/src/lopcodes.c +++ /dev/null @@ -1,101 +0,0 @@ -/* -** $Id: lopcodes.c,v 1.37 2005/11/08 19:45:36 roberto Exp $ -** See Copyright Notice in lua.h -*/ - - -#define lopcodes_c -#define LUA_CORE - - -#include "lopcodes.h" - - -/* ORDER OP */ - -const char *const luaP_opnames[NUM_OPCODES+1] = { - "MOVE", - "LOADK", - "LOADBOOL", - "LOADNIL", - "GETUPVAL", - "GETGLOBAL", - "GETTABLE", - "SETGLOBAL", - "SETUPVAL", - "SETTABLE", - "NEWTABLE", - "SELF", - "ADD", - "SUB", - "MUL", - "DIV", - "MOD", - "POW", - "UNM", - "NOT", - "LEN", - "CONCAT", - "JMP", - "EQ", - "LT", - "LE", - "TEST", - "TESTSET", - "CALL", - "TAILCALL", - "RETURN", - "FORLOOP", - "FORPREP", - "TFORLOOP", - "SETLIST", - "CLOSE", - "CLOSURE", - "VARARG", - NULL -}; - - -#define opmode(t,a,b,c,m) (((t)<<7) | ((a)<<6) | ((b)<<4) | ((c)<<2) | (m)) - -const lu_byte luaP_opmodes[NUM_OPCODES] = { -/* T A B C mode opcode */ - opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_MOVE */ - ,opmode(0, 1, OpArgK, OpArgN, iABx) /* OP_LOADK */ - ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_LOADBOOL */ - ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_LOADNIL */ - ,opmode(0, 1, OpArgU, OpArgN, iABC) /* OP_GETUPVAL */ - ,opmode(0, 1, OpArgK, OpArgN, iABx) /* OP_GETGLOBAL */ - ,opmode(0, 1, OpArgR, OpArgK, iABC) /* OP_GETTABLE */ - ,opmode(0, 0, OpArgK, OpArgN, iABx) /* OP_SETGLOBAL */ - ,opmode(0, 0, OpArgU, OpArgN, iABC) /* OP_SETUPVAL */ - ,opmode(0, 0, OpArgK, OpArgK, iABC) /* OP_SETTABLE */ - ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_NEWTABLE */ - ,opmode(0, 1, OpArgR, OpArgK, iABC) /* OP_SELF */ - ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_ADD */ - ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_SUB */ - ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_MUL */ - ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_DIV */ - ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_MOD */ - ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_POW */ - ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_UNM */ - ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_NOT */ - ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_LEN */ - ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_CONCAT */ - ,opmode(0, 0, OpArgR, OpArgN, iAsBx) /* OP_JMP */ - ,opmode(1, 0, OpArgK, OpArgK, iABC) /* OP_EQ */ - ,opmode(1, 0, OpArgK, OpArgK, iABC) /* OP_LT */ - ,opmode(1, 0, OpArgK, OpArgK, iABC) /* OP_LE */ - ,opmode(1, 1, OpArgR, OpArgU, iABC) /* OP_TEST */ - ,opmode(1, 1, OpArgR, OpArgU, iABC) /* OP_TESTSET */ - ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_CALL */ - ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_TAILCALL */ - ,opmode(0, 0, OpArgU, OpArgN, iABC) /* OP_RETURN */ - ,opmode(0, 1, OpArgR, OpArgN, iAsBx) /* OP_FORLOOP */ - ,opmode(0, 1, OpArgR, OpArgN, iAsBx) /* OP_FORPREP */ - ,opmode(1, 0, OpArgN, OpArgU, iABC) /* OP_TFORLOOP */ - ,opmode(0, 0, OpArgU, OpArgU, iABC) /* OP_SETLIST */ - ,opmode(0, 0, OpArgN, OpArgN, iABC) /* OP_CLOSE */ - ,opmode(0, 1, OpArgU, OpArgN, iABx) /* OP_CLOSURE */ - ,opmode(0, 1, OpArgU, OpArgN, iABC) /* OP_VARARG */ -}; diff --git a/uppdev/lua/src/lopcodes.h b/uppdev/lua/src/lopcodes.h deleted file mode 100644 index d46b56bc0..000000000 --- a/uppdev/lua/src/lopcodes.h +++ /dev/null @@ -1,268 +0,0 @@ -/* -** $Id: lopcodes.h,v 1.125 2006/03/14 19:04:44 roberto Exp $ -** Opcodes for Lua virtual machine -** See Copyright Notice in lua.h -*/ - -#ifndef lopcodes_h -#define lopcodes_h - -#include "llimits.h" - - -/*=========================================================================== - We assume that instructions are unsigned numbers. - All instructions have an opcode in the first 6 bits. - Instructions can have the following fields: - `A' : 8 bits - `B' : 9 bits - `C' : 9 bits - `Bx' : 18 bits (`B' and `C' together) - `sBx' : signed Bx - - A signed argument is represented in excess K; that is, the number - value is the unsigned value minus K. K is exactly the maximum value - for that argument (so that -max is represented by 0, and +max is - represented by 2*max), which is half the maximum for the corresponding - unsigned argument. -===========================================================================*/ - - -enum OpMode {iABC, iABx, iAsBx}; /* basic instruction format */ - - -/* -** size and position of opcode arguments. -*/ -#define SIZE_C 9 -#define SIZE_B 9 -#define SIZE_Bx (SIZE_C + SIZE_B) -#define SIZE_A 8 - -#define SIZE_OP 6 - -#define POS_OP 0 -#define POS_A (POS_OP + SIZE_OP) -#define POS_C (POS_A + SIZE_A) -#define POS_B (POS_C + SIZE_C) -#define POS_Bx POS_C - - -/* -** limits for opcode arguments. -** we use (signed) int to manipulate most arguments, -** so they must fit in LUAI_BITSINT-1 bits (-1 for sign) -*/ -#if SIZE_Bx < LUAI_BITSINT-1 -#define MAXARG_Bx ((1<>1) /* `sBx' is signed */ -#else -#define MAXARG_Bx MAX_INT -#define MAXARG_sBx MAX_INT -#endif - - -#define MAXARG_A ((1<>POS_OP) & MASK1(SIZE_OP,0))) -#define SET_OPCODE(i,o) ((i) = (((i)&MASK0(SIZE_OP,POS_OP)) | \ - ((cast(Instruction, o)<>POS_A) & MASK1(SIZE_A,0))) -#define SETARG_A(i,u) ((i) = (((i)&MASK0(SIZE_A,POS_A)) | \ - ((cast(Instruction, u)<>POS_B) & MASK1(SIZE_B,0))) -#define SETARG_B(i,b) ((i) = (((i)&MASK0(SIZE_B,POS_B)) | \ - ((cast(Instruction, b)<>POS_C) & MASK1(SIZE_C,0))) -#define SETARG_C(i,b) ((i) = (((i)&MASK0(SIZE_C,POS_C)) | \ - ((cast(Instruction, b)<>POS_Bx) & MASK1(SIZE_Bx,0))) -#define SETARG_Bx(i,b) ((i) = (((i)&MASK0(SIZE_Bx,POS_Bx)) | \ - ((cast(Instruction, b)< C) then pc++ */ -OP_TESTSET,/* A B C if (R(B) <=> C) then R(A) := R(B) else pc++ */ - -OP_CALL,/* A B C R(A), ... ,R(A+C-2) := R(A)(R(A+1), ... ,R(A+B-1)) */ -OP_TAILCALL,/* A B C return R(A)(R(A+1), ... ,R(A+B-1)) */ -OP_RETURN,/* A B return R(A), ... ,R(A+B-2) (see note) */ - -OP_FORLOOP,/* A sBx R(A)+=R(A+2); - if R(A) =) R(A)*/ -OP_CLOSURE,/* A Bx R(A) := closure(KPROTO[Bx], R(A), ... ,R(A+n)) */ - -OP_VARARG/* A B R(A), R(A+1), ..., R(A+B-1) = vararg */ -} OpCode; - - -#define NUM_OPCODES (cast(int, OP_VARARG) + 1) - - - -/*=========================================================================== - Notes: - (*) In OP_CALL, if (B == 0) then B = top. C is the number of returns - 1, - and can be 0: OP_CALL then sets `top' to last_result+1, so - next open instruction (OP_CALL, OP_RETURN, OP_SETLIST) may use `top'. - - (*) In OP_VARARG, if (B == 0) then use actual number of varargs and - set top (like in OP_CALL with C == 0). - - (*) In OP_RETURN, if (B == 0) then return up to `top' - - (*) In OP_SETLIST, if (B == 0) then B = `top'; - if (C == 0) then next `instruction' is real C - - (*) For comparisons, A specifies what condition the test should accept - (true or false). - - (*) All `skips' (pc++) assume that next instruction is a jump -===========================================================================*/ - - -/* -** masks for instruction properties. The format is: -** bits 0-1: op mode -** bits 2-3: C arg mode -** bits 4-5: B arg mode -** bit 6: instruction set register A -** bit 7: operator is a test -*/ - -enum OpArgMask { - OpArgN, /* argument is not used */ - OpArgU, /* argument is used */ - OpArgR, /* argument is a register or a jump offset */ - OpArgK /* argument is a constant or register/constant */ -}; - -LUAI_DATA const lu_byte luaP_opmodes[NUM_OPCODES]; - -#define getOpMode(m) (cast(enum OpMode, luaP_opmodes[m] & 3)) -#define getBMode(m) (cast(enum OpArgMask, (luaP_opmodes[m] >> 4) & 3)) -#define getCMode(m) (cast(enum OpArgMask, (luaP_opmodes[m] >> 2) & 3)) -#define testAMode(m) (luaP_opmodes[m] & (1 << 6)) -#define testTMode(m) (luaP_opmodes[m] & (1 << 7)) - - -LUAI_DATA const char *const luaP_opnames[NUM_OPCODES+1]; /* opcode names */ - - -/* number of list items to accumulate before a SETLIST instruction */ -#define LFIELDS_PER_FLUSH 50 - - -#endif diff --git a/uppdev/lua/src/loslib.c b/uppdev/lua/src/loslib.c deleted file mode 100644 index fcb31f4a9..000000000 --- a/uppdev/lua/src/loslib.c +++ /dev/null @@ -1,232 +0,0 @@ -/* -** $Id: loslib.c,v 1.19 2006/04/26 18:19:49 roberto Exp $ -** Standard Operating System library -** See Copyright Notice in lua.h -*/ - - -#include -#include -#include -#include -#include - -#define loslib_c -#define LUA_LIB - -#include "lua.h" - -#include "lauxlib.h" -#include "lualib.h" - - -static int os_pushresult (lua_State *L, int i, const char *filename) { - int en = errno; /* calls to Lua API may change this value */ - if (i) { - lua_pushboolean(L, 1); - return 1; - } - else { - lua_pushnil(L); - lua_pushfstring(L, "%s: %s", filename, strerror(en)); - lua_pushinteger(L, en); - return 3; - } -} - - -static int os_execute (lua_State *L) { - lua_pushinteger(L, system(luaL_optstring(L, 1, NULL))); - return 1; -} - - -static int os_remove (lua_State *L) { - const char *filename = luaL_checkstring(L, 1); - return os_pushresult(L, remove(filename) == 0, filename); -} - - -static int os_rename (lua_State *L) { - const char *fromname = luaL_checkstring(L, 1); - const char *toname = luaL_checkstring(L, 2); - return os_pushresult(L, rename(fromname, toname) == 0, fromname); -} - - -static int os_tmpname (lua_State *L) { - char buff[LUA_TMPNAMBUFSIZE]; - int err; - lua_tmpnam(buff, err); - if (err) - return luaL_error(L, "unable to generate a unique filename"); - lua_pushstring(L, buff); - return 1; -} - - -static int os_getenv (lua_State *L) { - lua_pushstring(L, getenv(luaL_checkstring(L, 1))); /* if NULL push nil */ - return 1; -} - - -static int os_clock (lua_State *L) { - lua_pushnumber(L, ((lua_Number)clock())/(lua_Number)CLOCKS_PER_SEC); - return 1; -} - - -/* -** {====================================================== -** Time/Date operations -** { year=%Y, month=%m, day=%d, hour=%H, min=%M, sec=%S, -** wday=%w+1, yday=%j, isdst=? } -** ======================================================= -*/ - -static void setfield (lua_State *L, const char *key, int value) { - lua_pushinteger(L, value); - lua_setfield(L, -2, key); -} - -static void setboolfield (lua_State *L, const char *key, int value) { - if (value < 0) /* undefined? */ - return; /* does not set field */ - lua_pushboolean(L, value); - lua_setfield(L, -2, key); -} - -static int getboolfield (lua_State *L, const char *key) { - int res; - lua_getfield(L, -1, key); - res = lua_isnil(L, -1) ? -1 : lua_toboolean(L, -1); - lua_pop(L, 1); - return res; -} - - -static int getfield (lua_State *L, const char *key, int d) { - int res; - lua_getfield(L, -1, key); - if (lua_isnumber(L, -1)) - res = (int)lua_tointeger(L, -1); - else { - if (d < 0) - return luaL_error(L, "field " LUA_QS " missing in date table", key); - res = d; - } - lua_pop(L, 1); - return res; -} - - -static int os_date (lua_State *L) { - const char *s = luaL_optstring(L, 1, "%c"); - time_t t = luaL_opt(L, (time_t)luaL_checknumber, 2, time(NULL)); - struct tm *stm; - if (*s == '!') { /* UTC? */ - stm = gmtime(&t); - s++; /* skip `!' */ - } - else - stm = localtime(&t); - if (stm == NULL) /* invalid date? */ - lua_pushnil(L); - else if (strcmp(s, "*t") == 0) { - lua_createtable(L, 0, 9); /* 9 = number of fields */ - setfield(L, "sec", stm->tm_sec); - setfield(L, "min", stm->tm_min); - setfield(L, "hour", stm->tm_hour); - setfield(L, "day", stm->tm_mday); - setfield(L, "month", stm->tm_mon+1); - setfield(L, "year", stm->tm_year+1900); - setfield(L, "wday", stm->tm_wday+1); - setfield(L, "yday", stm->tm_yday+1); - setboolfield(L, "isdst", stm->tm_isdst); - } - else { - char b[256]; - if (strftime(b, sizeof(b), s, stm)) - lua_pushstring(L, b); - else - return luaL_error(L, LUA_QL("date") " format too long"); - } - return 1; -} - - -static int os_time (lua_State *L) { - time_t t; - if (lua_isnoneornil(L, 1)) /* called without args? */ - t = time(NULL); /* get current time */ - else { - struct tm ts; - luaL_checktype(L, 1, LUA_TTABLE); - lua_settop(L, 1); /* make sure table is at the top */ - ts.tm_sec = getfield(L, "sec", 0); - ts.tm_min = getfield(L, "min", 0); - ts.tm_hour = getfield(L, "hour", 12); - ts.tm_mday = getfield(L, "day", -1); - ts.tm_mon = getfield(L, "month", -1) - 1; - ts.tm_year = getfield(L, "year", -1) - 1900; - ts.tm_isdst = getboolfield(L, "isdst"); - t = mktime(&ts); - } - if (t == (time_t)(-1)) - lua_pushnil(L); - else - lua_pushnumber(L, (lua_Number)t); - return 1; -} - - -static int os_difftime (lua_State *L) { - lua_pushnumber(L, difftime((time_t)(luaL_checknumber(L, 1)), - (time_t)(luaL_optnumber(L, 2, 0)))); - return 1; -} - -/* }====================================================== */ - - -static int os_setlocale (lua_State *L) { - static const int cat[] = {LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, - LC_NUMERIC, LC_TIME}; - static const char *const catnames[] = {"all", "collate", "ctype", "monetary", - "numeric", "time", NULL}; - const char *l = luaL_optstring(L, 1, NULL); - int op = luaL_checkoption(L, 2, "all", catnames); - lua_pushstring(L, setlocale(cat[op], l)); - return 1; -} - - -static int os_exit (lua_State *L) { - exit(luaL_optint(L, 1, EXIT_SUCCESS)); - return 0; /* to avoid warnings */ -} - -static const luaL_Reg syslib[] = { - {"clock", os_clock}, - {"date", os_date}, - {"difftime", os_difftime}, - {"execute", os_execute}, - {"exit", os_exit}, - {"getenv", os_getenv}, - {"remove", os_remove}, - {"rename", os_rename}, - {"setlocale", os_setlocale}, - {"time", os_time}, - {"tmpname", os_tmpname}, - {NULL, NULL} -}; - -/* }====================================================== */ - - - -LUALIB_API int luaopen_os (lua_State *L) { - luaL_register(L, LUA_OSLIBNAME, syslib); - return 1; -} diff --git a/uppdev/lua/src/lparser.c b/uppdev/lua/src/lparser.c deleted file mode 100644 index f1f937d02..000000000 --- a/uppdev/lua/src/lparser.c +++ /dev/null @@ -1,1337 +0,0 @@ -/* -** $Id: lparser.c,v 2.42 2006/06/05 15:57:59 roberto Exp $ -** Lua Parser -** See Copyright Notice in lua.h -*/ - - -#include - -#define lparser_c -#define LUA_CORE - -#include "lua.h" - -#include "lcode.h" -#include "ldebug.h" -#include "ldo.h" -#include "lfunc.h" -#include "llex.h" -#include "lmem.h" -#include "lobject.h" -#include "lopcodes.h" -#include "lparser.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" - - - -#define hasmultret(k) ((k) == VCALL || (k) == VVARARG) - -#define getlocvar(fs, i) ((fs)->f->locvars[(fs)->actvar[i]]) - -#define luaY_checklimit(fs,v,l,m) if ((v)>(l)) errorlimit(fs,l,m) - - -/* -** nodes for block list (list of active blocks) -*/ -typedef struct BlockCnt { - struct BlockCnt *previous; /* chain */ - int breaklist; /* list of jumps out of this loop */ - lu_byte nactvar; /* # active locals outside the breakable structure */ - lu_byte upval; /* true if some variable in the block is an upvalue */ - lu_byte isbreakable; /* true if `block' is a loop */ -} BlockCnt; - - - -/* -** prototypes for recursive non-terminal functions -*/ -static void chunk (LexState *ls); -static void expr (LexState *ls, expdesc *v); - - -static void anchor_token (LexState *ls) { - if (ls->t.token == TK_NAME || ls->t.token == TK_STRING) { - TString *ts = ls->t.seminfo.ts; - luaX_newstring(ls, getstr(ts), ts->tsv.len); - } -} - - -static void error_expected (LexState *ls, int token) { - luaX_syntaxerror(ls, - luaO_pushfstring(ls->L, LUA_QS " expected", luaX_token2str(ls, token))); -} - - -static void errorlimit (FuncState *fs, int limit, const char *what) { - const char *msg = (fs->f->linedefined == 0) ? - luaO_pushfstring(fs->L, "main function has more than %d %s", limit, what) : - luaO_pushfstring(fs->L, "function at line %d has more than %d %s", - fs->f->linedefined, limit, what); - luaX_lexerror(fs->ls, msg, 0); -} - - -static int testnext (LexState *ls, int c) { - if (ls->t.token == c) { - luaX_next(ls); - return 1; - } - else return 0; -} - - -static void check (LexState *ls, int c) { - if (ls->t.token != c) - error_expected(ls, c); -} - -static void checknext (LexState *ls, int c) { - check(ls, c); - luaX_next(ls); -} - - -#define check_condition(ls,c,msg) { if (!(c)) luaX_syntaxerror(ls, msg); } - - - -static void check_match (LexState *ls, int what, int who, int where) { - if (!testnext(ls, what)) { - if (where == ls->linenumber) - error_expected(ls, what); - else { - luaX_syntaxerror(ls, luaO_pushfstring(ls->L, - LUA_QS " expected (to close " LUA_QS " at line %d)", - luaX_token2str(ls, what), luaX_token2str(ls, who), where)); - } - } -} - - -static TString *str_checkname (LexState *ls) { - TString *ts; - check(ls, TK_NAME); - ts = ls->t.seminfo.ts; - luaX_next(ls); - return ts; -} - - -static void init_exp (expdesc *e, expkind k, int i) { - e->f = e->t = NO_JUMP; - e->k = k; - e->u.s.info = i; -} - - -static void codestring (LexState *ls, expdesc *e, TString *s) { - init_exp(e, VK, luaK_stringK(ls->fs, s)); -} - - -static void checkname(LexState *ls, expdesc *e) { - codestring(ls, e, str_checkname(ls)); -} - - -static int registerlocalvar (LexState *ls, TString *varname) { - FuncState *fs = ls->fs; - Proto *f = fs->f; - int oldsize = f->sizelocvars; - luaM_growvector(ls->L, f->locvars, fs->nlocvars, f->sizelocvars, - LocVar, SHRT_MAX, "too many local variables"); - while (oldsize < f->sizelocvars) f->locvars[oldsize++].varname = NULL; - f->locvars[fs->nlocvars].varname = varname; - luaC_objbarrier(ls->L, f, varname); - return fs->nlocvars++; -} - - -#define new_localvarliteral(ls,v,n) \ - new_localvar(ls, luaX_newstring(ls, "" v, (sizeof(v)/sizeof(char))-1), n) - - -static void new_localvar (LexState *ls, TString *name, int n) { - FuncState *fs = ls->fs; - luaY_checklimit(fs, fs->nactvar+n+1, LUAI_MAXVARS, "local variables"); - fs->actvar[fs->nactvar+n] = cast(unsigned short, registerlocalvar(ls, name)); -} - - -static void adjustlocalvars (LexState *ls, int nvars) { - FuncState *fs = ls->fs; - fs->nactvar = cast_byte(fs->nactvar + nvars); - for (; nvars; nvars--) { - getlocvar(fs, fs->nactvar - nvars).startpc = fs->pc; - } -} - - -static void removevars (LexState *ls, int tolevel) { - FuncState *fs = ls->fs; - while (fs->nactvar > tolevel) - getlocvar(fs, --fs->nactvar).endpc = fs->pc; -} - - -static int indexupvalue (FuncState *fs, TString *name, expdesc *v) { - int i; - Proto *f = fs->f; - int oldsize = f->sizeupvalues; - for (i=0; inups; i++) { - if (fs->upvalues[i].k == v->k && fs->upvalues[i].info == v->u.s.info) { - lua_assert(f->upvalues[i] == name); - return i; - } - } - /* new one */ - luaY_checklimit(fs, f->nups + 1, LUAI_MAXUPVALUES, "upvalues"); - luaM_growvector(fs->L, f->upvalues, f->nups, f->sizeupvalues, - TString *, MAX_INT, ""); - while (oldsize < f->sizeupvalues) f->upvalues[oldsize++] = NULL; - f->upvalues[f->nups] = name; - luaC_objbarrier(fs->L, f, name); - lua_assert(v->k == VLOCAL || v->k == VUPVAL); - fs->upvalues[f->nups].k = cast_byte(v->k); - fs->upvalues[f->nups].info = cast_byte(v->u.s.info); - return f->nups++; -} - - -static int searchvar (FuncState *fs, TString *n) { - int i; - for (i=fs->nactvar-1; i >= 0; i--) { - if (n == getlocvar(fs, i).varname) - return i; - } - return -1; /* not found */ -} - - -static void markupval (FuncState *fs, int level) { - BlockCnt *bl = fs->bl; - while (bl && bl->nactvar > level) bl = bl->previous; - if (bl) bl->upval = 1; -} - - -static int singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) { - if (fs == NULL) { /* no more levels? */ - init_exp(var, VGLOBAL, NO_REG); /* default is global variable */ - return VGLOBAL; - } - else { - int v = searchvar(fs, n); /* look up at current level */ - if (v >= 0) { - init_exp(var, VLOCAL, v); - if (!base) - markupval(fs, v); /* local will be used as an upval */ - return VLOCAL; - } - else { /* not found at current level; try upper one */ - if (singlevaraux(fs->prev, n, var, 0) == VGLOBAL) - return VGLOBAL; - var->u.s.info = indexupvalue(fs, n, var); /* else was LOCAL or UPVAL */ - var->k = VUPVAL; /* upvalue in this level */ - return VUPVAL; - } - } -} - - -static void singlevar (LexState *ls, expdesc *var) { - TString *varname = str_checkname(ls); - FuncState *fs = ls->fs; - if (singlevaraux(fs, varname, var, 1) == VGLOBAL) - var->u.s.info = luaK_stringK(fs, varname); /* info points to global name */ -} - - -static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) { - FuncState *fs = ls->fs; - int extra = nvars - nexps; - if (hasmultret(e->k)) { - extra++; /* includes call itself */ - if (extra < 0) extra = 0; - luaK_setreturns(fs, e, extra); /* last exp. provides the difference */ - if (extra > 1) luaK_reserveregs(fs, extra-1); - } - else { - if (e->k != VVOID) luaK_exp2nextreg(fs, e); /* close last expression */ - if (extra > 0) { - int reg = fs->freereg; - luaK_reserveregs(fs, extra); - luaK_nil(fs, reg, extra); - } - } -} - - -static void enterlevel (LexState *ls) { - if (++ls->L->nCcalls > LUAI_MAXCCALLS) - luaX_lexerror(ls, "chunk has too many syntax levels", 0); -} - - -#define leavelevel(ls) ((ls)->L->nCcalls--) - - -static void enterblock (FuncState *fs, BlockCnt *bl, lu_byte isbreakable) { - bl->breaklist = NO_JUMP; - bl->isbreakable = isbreakable; - bl->nactvar = fs->nactvar; - bl->upval = 0; - bl->previous = fs->bl; - fs->bl = bl; - lua_assert(fs->freereg == fs->nactvar); -} - - -static void leaveblock (FuncState *fs) { - BlockCnt *bl = fs->bl; - fs->bl = bl->previous; - removevars(fs->ls, bl->nactvar); - if (bl->upval) - luaK_codeABC(fs, OP_CLOSE, bl->nactvar, 0, 0); - /* a block either controls scope or breaks (never both) */ - lua_assert(!bl->isbreakable || !bl->upval); - lua_assert(bl->nactvar == fs->nactvar); - fs->freereg = fs->nactvar; /* free registers */ - luaK_patchtohere(fs, bl->breaklist); -} - - -static void pushclosure (LexState *ls, FuncState *func, expdesc *v) { - FuncState *fs = ls->fs; - Proto *f = fs->f; - int oldsize = f->sizep; - int i; - luaM_growvector(ls->L, f->p, fs->np, f->sizep, Proto *, - MAXARG_Bx, "constant table overflow"); - while (oldsize < f->sizep) f->p[oldsize++] = NULL; - f->p[fs->np++] = func->f; - luaC_objbarrier(ls->L, f, func->f); - init_exp(v, VRELOCABLE, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np-1)); - for (i=0; if->nups; i++) { - OpCode o = (func->upvalues[i].k == VLOCAL) ? OP_MOVE : OP_GETUPVAL; - luaK_codeABC(fs, o, 0, func->upvalues[i].info, 0); - } -} - - -static void open_func (LexState *ls, FuncState *fs) { - lua_State *L = ls->L; - Proto *f = luaF_newproto(L); - fs->f = f; - fs->prev = ls->fs; /* linked list of funcstates */ - fs->ls = ls; - fs->L = L; - ls->fs = fs; - fs->pc = 0; - fs->lasttarget = -1; - fs->jpc = NO_JUMP; - fs->freereg = 0; - fs->nk = 0; - fs->np = 0; - fs->nlocvars = 0; - fs->nactvar = 0; - fs->bl = NULL; - f->source = ls->source; - f->maxstacksize = 2; /* registers 0/1 are always valid */ - fs->h = luaH_new(L, 0, 0); - /* anchor table of constants and prototype (to avoid being collected) */ - sethvalue2s(L, L->top, fs->h); - incr_top(L); - setptvalue2s(L, L->top, f); - incr_top(L); -} - - -static void close_func (LexState *ls) { - lua_State *L = ls->L; - FuncState *fs = ls->fs; - Proto *f = fs->f; - removevars(ls, 0); - luaK_ret(fs, 0, 0); /* final return */ - luaM_reallocvector(L, f->code, f->sizecode, fs->pc, Instruction); - f->sizecode = fs->pc; - luaM_reallocvector(L, f->lineinfo, f->sizelineinfo, fs->pc, int); - f->sizelineinfo = fs->pc; - luaM_reallocvector(L, f->k, f->sizek, fs->nk, TValue); - f->sizek = fs->nk; - luaM_reallocvector(L, f->p, f->sizep, fs->np, Proto *); - f->sizep = fs->np; - luaM_reallocvector(L, f->locvars, f->sizelocvars, fs->nlocvars, LocVar); - f->sizelocvars = fs->nlocvars; - luaM_reallocvector(L, f->upvalues, f->sizeupvalues, f->nups, TString *); - f->sizeupvalues = f->nups; - lua_assert(luaG_checkcode(f)); - lua_assert(fs->bl == NULL); - ls->fs = fs->prev; - L->top -= 2; /* remove table and prototype from the stack */ - /* last token read was anchored in defunct function; must reanchor it */ - if (fs) anchor_token(ls); -} - - -Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, const char *name) { - struct LexState lexstate; - struct FuncState funcstate; - lexstate.buff = buff; - luaX_setinput(L, &lexstate, z, luaS_new(L, name)); - open_func(&lexstate, &funcstate); - funcstate.f->is_vararg = VARARG_ISVARARG; /* main func. is always vararg */ - luaX_next(&lexstate); /* read first token */ - chunk(&lexstate); - check(&lexstate, TK_EOS); - close_func(&lexstate); - lua_assert(funcstate.prev == NULL); - lua_assert(funcstate.f->nups == 0); - lua_assert(lexstate.fs == NULL); - return funcstate.f; -} - - - -/*============================================================*/ -/* GRAMMAR RULES */ -/*============================================================*/ - - -static void field (LexState *ls, expdesc *v) { - /* field -> ['.' | ':'] NAME */ - FuncState *fs = ls->fs; - expdesc key; - luaK_exp2anyreg(fs, v); - luaX_next(ls); /* skip the dot or colon */ - checkname(ls, &key); - luaK_indexed(fs, v, &key); -} - - -static void yindex (LexState *ls, expdesc *v) { - /* index -> '[' expr ']' */ - luaX_next(ls); /* skip the '[' */ - expr(ls, v); - luaK_exp2val(ls->fs, v); - checknext(ls, ']'); -} - - -/* -** {====================================================================== -** Rules for Constructors -** ======================================================================= -*/ - - -struct ConsControl { - expdesc v; /* last list item read */ - expdesc *t; /* table descriptor */ - int nh; /* total number of `record' elements */ - int na; /* total number of array elements */ - int tostore; /* number of array elements pending to be stored */ -}; - - -static void recfield (LexState *ls, struct ConsControl *cc) { - /* recfield -> (NAME | `['exp1`]') = exp1 */ - FuncState *fs = ls->fs; - int reg = ls->fs->freereg; - expdesc key, val; - int rkkey; - if (ls->t.token == TK_NAME) { - luaY_checklimit(fs, cc->nh, MAX_INT, "items in a constructor"); - checkname(ls, &key); - } - else /* ls->t.token == '[' */ - yindex(ls, &key); - cc->nh++; - checknext(ls, '='); - rkkey = luaK_exp2RK(fs, &key); - expr(ls, &val); - luaK_codeABC(fs, OP_SETTABLE, cc->t->u.s.info, rkkey, luaK_exp2RK(fs, &val)); - fs->freereg = reg; /* free registers */ -} - - -static void closelistfield (FuncState *fs, struct ConsControl *cc) { - if (cc->v.k == VVOID) return; /* there is no list item */ - luaK_exp2nextreg(fs, &cc->v); - cc->v.k = VVOID; - if (cc->tostore == LFIELDS_PER_FLUSH) { - luaK_setlist(fs, cc->t->u.s.info, cc->na, cc->tostore); /* flush */ - cc->tostore = 0; /* no more items pending */ - } -} - - -static void lastlistfield (FuncState *fs, struct ConsControl *cc) { - if (cc->tostore == 0) return; - if (hasmultret(cc->v.k)) { - luaK_setmultret(fs, &cc->v); - luaK_setlist(fs, cc->t->u.s.info, cc->na, LUA_MULTRET); - cc->na--; /* do not count last expression (unknown number of elements) */ - } - else { - if (cc->v.k != VVOID) - luaK_exp2nextreg(fs, &cc->v); - luaK_setlist(fs, cc->t->u.s.info, cc->na, cc->tostore); - } -} - - -static void listfield (LexState *ls, struct ConsControl *cc) { - expr(ls, &cc->v); - luaY_checklimit(ls->fs, cc->na, MAXARG_Bx, "items in a constructor"); - cc->na++; - cc->tostore++; -} - - -static void constructor (LexState *ls, expdesc *t) { - /* constructor -> ?? */ - FuncState *fs = ls->fs; - int line = ls->linenumber; - int pc = luaK_codeABC(fs, OP_NEWTABLE, 0, 0, 0); - struct ConsControl cc; - cc.na = cc.nh = cc.tostore = 0; - cc.t = t; - init_exp(t, VRELOCABLE, pc); - init_exp(&cc.v, VVOID, 0); /* no value (yet) */ - luaK_exp2nextreg(ls->fs, t); /* fix it at stack top (for gc) */ - checknext(ls, '{'); - do { - lua_assert(cc.v.k == VVOID || cc.tostore > 0); - if (ls->t.token == '}') break; - closelistfield(fs, &cc); - switch(ls->t.token) { - case TK_NAME: { /* may be listfields or recfields */ - luaX_lookahead(ls); - if (ls->lookahead.token != '=') /* expression? */ - listfield(ls, &cc); - else - recfield(ls, &cc); - break; - } - case '[': { /* constructor_item -> recfield */ - recfield(ls, &cc); - break; - } - default: { /* constructor_part -> listfield */ - listfield(ls, &cc); - break; - } - } - } while (testnext(ls, ',') || testnext(ls, ';')); - check_match(ls, '}', '{', line); - lastlistfield(fs, &cc); - SETARG_B(fs->f->code[pc], luaO_int2fb(cc.na)); /* set initial array size */ - SETARG_C(fs->f->code[pc], luaO_int2fb(cc.nh)); /* set initial table size */ -} - -/* }====================================================================== */ - - - -static void parlist (LexState *ls) { - /* parlist -> [ param { `,' param } ] */ - FuncState *fs = ls->fs; - Proto *f = fs->f; - int nparams = 0; - f->is_vararg = 0; - if (ls->t.token != ')') { /* is `parlist' not empty? */ - do { - switch (ls->t.token) { - case TK_NAME: { /* param -> NAME */ - new_localvar(ls, str_checkname(ls), nparams++); - break; - } - case TK_DOTS: { /* param -> `...' */ - luaX_next(ls); -#if defined(LUA_COMPAT_VARARG) - /* use `arg' as default name */ - new_localvarliteral(ls, "arg", nparams++); - f->is_vararg = VARARG_HASARG | VARARG_NEEDSARG; -#endif - f->is_vararg |= VARARG_ISVARARG; - break; - } - default: luaX_syntaxerror(ls, " or " LUA_QL("...") " expected"); - } - } while (!f->is_vararg && testnext(ls, ',')); - } - adjustlocalvars(ls, nparams); - f->numparams = cast_byte(fs->nactvar - (f->is_vararg & VARARG_HASARG)); - luaK_reserveregs(fs, fs->nactvar); /* reserve register for parameters */ -} - - -static void body (LexState *ls, expdesc *e, int needself, int line) { - /* body -> `(' parlist `)' chunk END */ - FuncState new_fs; - open_func(ls, &new_fs); - new_fs.f->linedefined = line; - checknext(ls, '('); - if (needself) { - new_localvarliteral(ls, "self", 0); - adjustlocalvars(ls, 1); - } - parlist(ls); - checknext(ls, ')'); - chunk(ls); - new_fs.f->lastlinedefined = ls->linenumber; - check_match(ls, TK_END, TK_FUNCTION, line); - close_func(ls); - pushclosure(ls, &new_fs, e); -} - - -static int explist1 (LexState *ls, expdesc *v) { - /* explist1 -> expr { `,' expr } */ - int n = 1; /* at least one expression */ - expr(ls, v); - while (testnext(ls, ',')) { - luaK_exp2nextreg(ls->fs, v); - expr(ls, v); - n++; - } - return n; -} - - -static void funcargs (LexState *ls, expdesc *f) { - FuncState *fs = ls->fs; - expdesc args; - int base, nparams; - int line = ls->linenumber; - switch (ls->t.token) { - case '(': { /* funcargs -> `(' [ explist1 ] `)' */ - if (line != ls->lastline) - luaX_syntaxerror(ls,"ambiguous syntax (function call x new statement)"); - luaX_next(ls); - if (ls->t.token == ')') /* arg list is empty? */ - args.k = VVOID; - else { - explist1(ls, &args); - luaK_setmultret(fs, &args); - } - check_match(ls, ')', '(', line); - break; - } - case '{': { /* funcargs -> constructor */ - constructor(ls, &args); - break; - } - case TK_STRING: { /* funcargs -> STRING */ - codestring(ls, &args, ls->t.seminfo.ts); - luaX_next(ls); /* must use `seminfo' before `next' */ - break; - } - default: { - luaX_syntaxerror(ls, "function arguments expected"); - return; - } - } - lua_assert(f->k == VNONRELOC); - base = f->u.s.info; /* base register for call */ - if (hasmultret(args.k)) - nparams = LUA_MULTRET; /* open call */ - else { - if (args.k != VVOID) - luaK_exp2nextreg(fs, &args); /* close last argument */ - nparams = fs->freereg - (base+1); - } - init_exp(f, VCALL, luaK_codeABC(fs, OP_CALL, base, nparams+1, 2)); - luaK_fixline(fs, line); - fs->freereg = base+1; /* call remove function and arguments and leaves - (unless changed) one result */ -} - - - - -/* -** {====================================================================== -** Expression parsing -** ======================================================================= -*/ - - -static void prefixexp (LexState *ls, expdesc *v) { - /* prefixexp -> NAME | '(' expr ')' */ - switch (ls->t.token) { - case '(': { - int line = ls->linenumber; - luaX_next(ls); - expr(ls, v); - check_match(ls, ')', '(', line); - luaK_dischargevars(ls->fs, v); - return; - } - case TK_NAME: { - singlevar(ls, v); - return; - } - default: { - luaX_syntaxerror(ls, "unexpected symbol"); - return; - } - } -} - - -static void primaryexp (LexState *ls, expdesc *v) { - /* primaryexp -> - prefixexp { `.' NAME | `[' exp `]' | `:' NAME funcargs | funcargs } */ - FuncState *fs = ls->fs; - prefixexp(ls, v); - for (;;) { - switch (ls->t.token) { - case '.': { /* field */ - field(ls, v); - break; - } - case '[': { /* `[' exp1 `]' */ - expdesc key; - luaK_exp2anyreg(fs, v); - yindex(ls, &key); - luaK_indexed(fs, v, &key); - break; - } - case ':': { /* `:' NAME funcargs */ - expdesc key; - luaX_next(ls); - checkname(ls, &key); - luaK_self(fs, v, &key); - funcargs(ls, v); - break; - } - case '(': case TK_STRING: case '{': { /* funcargs */ - luaK_exp2nextreg(fs, v); - funcargs(ls, v); - break; - } - default: return; - } - } -} - - -static void simpleexp (LexState *ls, expdesc *v) { - /* simpleexp -> NUMBER | STRING | NIL | true | false | ... | - constructor | FUNCTION body | primaryexp */ - switch (ls->t.token) { - case TK_NUMBER: { - init_exp(v, VKNUM, 0); - v->u.nval = ls->t.seminfo.r; - break; - } - case TK_STRING: { - codestring(ls, v, ls->t.seminfo.ts); - break; - } - case TK_NIL: { - init_exp(v, VNIL, 0); - break; - } - case TK_TRUE: { - init_exp(v, VTRUE, 0); - break; - } - case TK_FALSE: { - init_exp(v, VFALSE, 0); - break; - } - case TK_DOTS: { /* vararg */ - FuncState *fs = ls->fs; - check_condition(ls, fs->f->is_vararg, - "cannot use " LUA_QL("...") " outside a vararg function"); - fs->f->is_vararg &= ~VARARG_NEEDSARG; /* don't need 'arg' */ - init_exp(v, VVARARG, luaK_codeABC(fs, OP_VARARG, 0, 1, 0)); - break; - } - case '{': { /* constructor */ - constructor(ls, v); - return; - } - case TK_FUNCTION: { - luaX_next(ls); - body(ls, v, 0, ls->linenumber); - return; - } - default: { - primaryexp(ls, v); - return; - } - } - luaX_next(ls); -} - - -static UnOpr getunopr (int op) { - switch (op) { - case TK_NOT: return OPR_NOT; - case '-': return OPR_MINUS; - case '#': return OPR_LEN; - default: return OPR_NOUNOPR; - } -} - - -static BinOpr getbinopr (int op) { - switch (op) { - case '+': return OPR_ADD; - case '-': return OPR_SUB; - case '*': return OPR_MUL; - case '/': return OPR_DIV; - case '%': return OPR_MOD; - case '^': return OPR_POW; - case TK_CONCAT: return OPR_CONCAT; - case TK_NE: return OPR_NE; - case TK_EQ: return OPR_EQ; - case '<': return OPR_LT; - case TK_LE: return OPR_LE; - case '>': return OPR_GT; - case TK_GE: return OPR_GE; - case TK_AND: return OPR_AND; - case TK_OR: return OPR_OR; - default: return OPR_NOBINOPR; - } -} - - -static const struct { - lu_byte left; /* left priority for each binary operator */ - lu_byte right; /* right priority */ -} priority[] = { /* ORDER OPR */ - {6, 6}, {6, 6}, {7, 7}, {7, 7}, {7, 7}, /* `+' `-' `/' `%' */ - {10, 9}, {5, 4}, /* power and concat (right associative) */ - {3, 3}, {3, 3}, /* equality and inequality */ - {3, 3}, {3, 3}, {3, 3}, {3, 3}, /* order */ - {2, 2}, {1, 1} /* logical (and/or) */ -}; - -#define UNARY_PRIORITY 8 /* priority for unary operators */ - - -/* -** subexpr -> (simpleexp | unop subexpr) { binop subexpr } -** where `binop' is any binary operator with a priority higher than `limit' -*/ -static BinOpr subexpr (LexState *ls, expdesc *v, unsigned int limit) { - BinOpr op; - UnOpr uop; - enterlevel(ls); - uop = getunopr(ls->t.token); - if (uop != OPR_NOUNOPR) { - luaX_next(ls); - subexpr(ls, v, UNARY_PRIORITY); - luaK_prefix(ls->fs, uop, v); - } - else simpleexp(ls, v); - /* expand while operators have priorities higher than `limit' */ - op = getbinopr(ls->t.token); - while (op != OPR_NOBINOPR && priority[op].left > limit) { - expdesc v2; - BinOpr nextop; - luaX_next(ls); - luaK_infix(ls->fs, op, v); - /* read sub-expression with higher priority */ - nextop = subexpr(ls, &v2, priority[op].right); - luaK_posfix(ls->fs, op, v, &v2); - op = nextop; - } - leavelevel(ls); - return op; /* return first untreated operator */ -} - - -static void expr (LexState *ls, expdesc *v) { - subexpr(ls, v, 0); -} - -/* }==================================================================== */ - - - -/* -** {====================================================================== -** Rules for Statements -** ======================================================================= -*/ - - -static int block_follow (int token) { - switch (token) { - case TK_ELSE: case TK_ELSEIF: case TK_END: - case TK_UNTIL: case TK_EOS: - return 1; - default: return 0; - } -} - - -static void block (LexState *ls) { - /* block -> chunk */ - FuncState *fs = ls->fs; - BlockCnt bl; - enterblock(fs, &bl, 0); - chunk(ls); - lua_assert(bl.breaklist == NO_JUMP); - leaveblock(fs); -} - - -/* -** structure to chain all variables in the left-hand side of an -** assignment -*/ -struct LHS_assign { - struct LHS_assign *prev; - expdesc v; /* variable (global, local, upvalue, or indexed) */ -}; - - -/* -** check whether, in an assignment to a local variable, the local variable -** is needed in a previous assignment (to a table). If so, save original -** local value in a safe place and use this safe copy in the previous -** assignment. -*/ -static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) { - FuncState *fs = ls->fs; - int extra = fs->freereg; /* eventual position to save local variable */ - int conflict = 0; - for (; lh; lh = lh->prev) { - if (lh->v.k == VINDEXED) { - if (lh->v.u.s.info == v->u.s.info) { /* conflict? */ - conflict = 1; - lh->v.u.s.info = extra; /* previous assignment will use safe copy */ - } - if (lh->v.u.s.aux == v->u.s.info) { /* conflict? */ - conflict = 1; - lh->v.u.s.aux = extra; /* previous assignment will use safe copy */ - } - } - } - if (conflict) { - luaK_codeABC(fs, OP_MOVE, fs->freereg, v->u.s.info, 0); /* make copy */ - luaK_reserveregs(fs, 1); - } -} - - -static void assignment (LexState *ls, struct LHS_assign *lh, int nvars) { - expdesc e; - check_condition(ls, VLOCAL <= lh->v.k && lh->v.k <= VINDEXED, - "syntax error"); - if (testnext(ls, ',')) { /* assignment -> `,' primaryexp assignment */ - struct LHS_assign nv; - nv.prev = lh; - primaryexp(ls, &nv.v); - if (nv.v.k == VLOCAL) - check_conflict(ls, lh, &nv.v); - assignment(ls, &nv, nvars+1); - } - else { /* assignment -> `=' explist1 */ - int nexps; - checknext(ls, '='); - nexps = explist1(ls, &e); - if (nexps != nvars) { - adjust_assign(ls, nvars, nexps, &e); - if (nexps > nvars) - ls->fs->freereg -= nexps - nvars; /* remove extra values */ - } - else { - luaK_setoneret(ls->fs, &e); /* close last expression */ - luaK_storevar(ls->fs, &lh->v, &e); - return; /* avoid default */ - } - } - init_exp(&e, VNONRELOC, ls->fs->freereg-1); /* default assignment */ - luaK_storevar(ls->fs, &lh->v, &e); -} - - -static int cond (LexState *ls) { - /* cond -> exp */ - expdesc v; - expr(ls, &v); /* read condition */ - if (v.k == VNIL) v.k = VFALSE; /* `falses' are all equal here */ - luaK_goiftrue(ls->fs, &v); - return v.f; -} - - -static void breakstat (LexState *ls) { - FuncState *fs = ls->fs; - BlockCnt *bl = fs->bl; - int upval = 0; - while (bl && !bl->isbreakable) { - upval |= bl->upval; - bl = bl->previous; - } - if (!bl) - luaX_syntaxerror(ls, "no loop to break"); - if (upval) - luaK_codeABC(fs, OP_CLOSE, bl->nactvar, 0, 0); - luaK_concat(fs, &bl->breaklist, luaK_jump(fs)); -} - - -static void whilestat (LexState *ls, int line) { - /* whilestat -> WHILE cond DO block END */ - FuncState *fs = ls->fs; - int whileinit; - int condexit; - BlockCnt bl; - luaX_next(ls); /* skip WHILE */ - whileinit = luaK_getlabel(fs); - condexit = cond(ls); - enterblock(fs, &bl, 1); - checknext(ls, TK_DO); - block(ls); - luaK_patchlist(fs, luaK_jump(fs), whileinit); - check_match(ls, TK_END, TK_WHILE, line); - leaveblock(fs); - luaK_patchtohere(fs, condexit); /* false conditions finish the loop */ -} - - -static void repeatstat (LexState *ls, int line) { - /* repeatstat -> REPEAT block UNTIL cond */ - int condexit; - FuncState *fs = ls->fs; - int repeat_init = luaK_getlabel(fs); - BlockCnt bl1, bl2; - enterblock(fs, &bl1, 1); /* loop block */ - enterblock(fs, &bl2, 0); /* scope block */ - luaX_next(ls); /* skip REPEAT */ - chunk(ls); - check_match(ls, TK_UNTIL, TK_REPEAT, line); - condexit = cond(ls); /* read condition (inside scope block) */ - if (!bl2.upval) { /* no upvalues? */ - leaveblock(fs); /* finish scope */ - luaK_patchlist(ls->fs, condexit, repeat_init); /* close the loop */ - } - else { /* complete semantics when there are upvalues */ - breakstat(ls); /* if condition then break */ - luaK_patchtohere(ls->fs, condexit); /* else... */ - leaveblock(fs); /* finish scope... */ - luaK_patchlist(ls->fs, luaK_jump(fs), repeat_init); /* and repeat */ - } - leaveblock(fs); /* finish loop */ -} - - -static int exp1 (LexState *ls) { - expdesc e; - int k; - expr(ls, &e); - k = e.k; - luaK_exp2nextreg(ls->fs, &e); - return k; -} - - -static void forbody (LexState *ls, int base, int line, int nvars, int isnum) { - /* forbody -> DO block */ - BlockCnt bl; - FuncState *fs = ls->fs; - int prep, endfor; - adjustlocalvars(ls, 3); /* control variables */ - checknext(ls, TK_DO); - prep = isnum ? luaK_codeAsBx(fs, OP_FORPREP, base, NO_JUMP) : luaK_jump(fs); - enterblock(fs, &bl, 0); /* scope for declared variables */ - adjustlocalvars(ls, nvars); - luaK_reserveregs(fs, nvars); - block(ls); - leaveblock(fs); /* end of scope for declared variables */ - luaK_patchtohere(fs, prep); - endfor = (isnum) ? luaK_codeAsBx(fs, OP_FORLOOP, base, NO_JUMP) : - luaK_codeABC(fs, OP_TFORLOOP, base, 0, nvars); - luaK_fixline(fs, line); /* pretend that `OP_FOR' starts the loop */ - luaK_patchlist(fs, (isnum ? endfor : luaK_jump(fs)), prep + 1); -} - - -static void fornum (LexState *ls, TString *varname, int line) { - /* fornum -> NAME = exp1,exp1[,exp1] forbody */ - FuncState *fs = ls->fs; - int base = fs->freereg; - new_localvarliteral(ls, "(for index)", 0); - new_localvarliteral(ls, "(for limit)", 1); - new_localvarliteral(ls, "(for step)", 2); - new_localvar(ls, varname, 3); - checknext(ls, '='); - exp1(ls); /* initial value */ - checknext(ls, ','); - exp1(ls); /* limit */ - if (testnext(ls, ',')) - exp1(ls); /* optional step */ - else { /* default step = 1 */ - luaK_codeABx(fs, OP_LOADK, fs->freereg, luaK_numberK(fs, 1)); - luaK_reserveregs(fs, 1); - } - forbody(ls, base, line, 1, 1); -} - - -static void forlist (LexState *ls, TString *indexname) { - /* forlist -> NAME {,NAME} IN explist1 forbody */ - FuncState *fs = ls->fs; - expdesc e; - int nvars = 0; - int line; - int base = fs->freereg; - /* create control variables */ - new_localvarliteral(ls, "(for generator)", nvars++); - new_localvarliteral(ls, "(for state)", nvars++); - new_localvarliteral(ls, "(for control)", nvars++); - /* create declared variables */ - new_localvar(ls, indexname, nvars++); - while (testnext(ls, ',')) - new_localvar(ls, str_checkname(ls), nvars++); - checknext(ls, TK_IN); - line = ls->linenumber; - adjust_assign(ls, 3, explist1(ls, &e), &e); - luaK_checkstack(fs, 3); /* extra space to call generator */ - forbody(ls, base, line, nvars - 3, 0); -} - - -static void forstat (LexState *ls, int line) { - /* forstat -> FOR (fornum | forlist) END */ - FuncState *fs = ls->fs; - TString *varname; - BlockCnt bl; - enterblock(fs, &bl, 1); /* scope for loop and control variables */ - luaX_next(ls); /* skip `for' */ - varname = str_checkname(ls); /* first variable name */ - switch (ls->t.token) { - case '=': fornum(ls, varname, line); break; - case ',': case TK_IN: forlist(ls, varname); break; - default: luaX_syntaxerror(ls, LUA_QL("=") " or " LUA_QL("in") " expected"); - } - check_match(ls, TK_END, TK_FOR, line); - leaveblock(fs); /* loop scope (`break' jumps to this point) */ -} - - -static int test_then_block (LexState *ls) { - /* test_then_block -> [IF | ELSEIF] cond THEN block */ - int condexit; - luaX_next(ls); /* skip IF or ELSEIF */ - condexit = cond(ls); - checknext(ls, TK_THEN); - block(ls); /* `then' part */ - return condexit; -} - - -static void ifstat (LexState *ls, int line) { - /* ifstat -> IF cond THEN block {ELSEIF cond THEN block} [ELSE block] END */ - FuncState *fs = ls->fs; - int flist; - int escapelist = NO_JUMP; - flist = test_then_block(ls); /* IF cond THEN block */ - while (ls->t.token == TK_ELSEIF) { - luaK_concat(fs, &escapelist, luaK_jump(fs)); - luaK_patchtohere(fs, flist); - flist = test_then_block(ls); /* ELSEIF cond THEN block */ - } - if (ls->t.token == TK_ELSE) { - luaK_concat(fs, &escapelist, luaK_jump(fs)); - luaK_patchtohere(fs, flist); - luaX_next(ls); /* skip ELSE (after patch, for correct line info) */ - block(ls); /* `else' part */ - } - else - luaK_concat(fs, &escapelist, flist); - luaK_patchtohere(fs, escapelist); - check_match(ls, TK_END, TK_IF, line); -} - - -static void localfunc (LexState *ls) { - expdesc v, b; - FuncState *fs = ls->fs; - new_localvar(ls, str_checkname(ls), 0); - init_exp(&v, VLOCAL, fs->freereg); - luaK_reserveregs(fs, 1); - adjustlocalvars(ls, 1); - body(ls, &b, 0, ls->linenumber); - luaK_storevar(fs, &v, &b); - /* debug information will only see the variable after this point! */ - getlocvar(fs, fs->nactvar - 1).startpc = fs->pc; -} - - -static void localstat (LexState *ls) { - /* stat -> LOCAL NAME {`,' NAME} [`=' explist1] */ - int nvars = 0; - int nexps; - expdesc e; - do { - new_localvar(ls, str_checkname(ls), nvars++); - } while (testnext(ls, ',')); - if (testnext(ls, '=')) - nexps = explist1(ls, &e); - else { - e.k = VVOID; - nexps = 0; - } - adjust_assign(ls, nvars, nexps, &e); - adjustlocalvars(ls, nvars); -} - - -static int funcname (LexState *ls, expdesc *v) { - /* funcname -> NAME {field} [`:' NAME] */ - int needself = 0; - singlevar(ls, v); - while (ls->t.token == '.') - field(ls, v); - if (ls->t.token == ':') { - needself = 1; - field(ls, v); - } - return needself; -} - - -static void funcstat (LexState *ls, int line) { - /* funcstat -> FUNCTION funcname body */ - int needself; - expdesc v, b; - luaX_next(ls); /* skip FUNCTION */ - needself = funcname(ls, &v); - body(ls, &b, needself, line); - luaK_storevar(ls->fs, &v, &b); - luaK_fixline(ls->fs, line); /* definition `happens' in the first line */ -} - - -static void exprstat (LexState *ls) { - /* stat -> func | assignment */ - FuncState *fs = ls->fs; - struct LHS_assign v; - primaryexp(ls, &v.v); - if (v.v.k == VCALL) /* stat -> func */ - SETARG_C(getcode(fs, &v.v), 1); /* call statement uses no results */ - else { /* stat -> assignment */ - v.prev = NULL; - assignment(ls, &v, 1); - } -} - - -static void retstat (LexState *ls) { - /* stat -> RETURN explist */ - FuncState *fs = ls->fs; - expdesc e; - int first, nret; /* registers with returned values */ - luaX_next(ls); /* skip RETURN */ - if (block_follow(ls->t.token) || ls->t.token == ';') - first = nret = 0; /* return no values */ - else { - nret = explist1(ls, &e); /* optional return values */ - if (hasmultret(e.k)) { - luaK_setmultret(fs, &e); - if (e.k == VCALL && nret == 1) { /* tail call? */ - SET_OPCODE(getcode(fs,&e), OP_TAILCALL); - lua_assert(GETARG_A(getcode(fs,&e)) == fs->nactvar); - } - first = fs->nactvar; - nret = LUA_MULTRET; /* return all values */ - } - else { - if (nret == 1) /* only one single value? */ - first = luaK_exp2anyreg(fs, &e); - else { - luaK_exp2nextreg(fs, &e); /* values must go to the `stack' */ - first = fs->nactvar; /* return all `active' values */ - lua_assert(nret == fs->freereg - first); - } - } - } - luaK_ret(fs, first, nret); -} - - -static int statement (LexState *ls) { - int line = ls->linenumber; /* may be needed for error messages */ - switch (ls->t.token) { - case TK_IF: { /* stat -> ifstat */ - ifstat(ls, line); - return 0; - } - case TK_WHILE: { /* stat -> whilestat */ - whilestat(ls, line); - return 0; - } - case TK_DO: { /* stat -> DO block END */ - luaX_next(ls); /* skip DO */ - block(ls); - check_match(ls, TK_END, TK_DO, line); - return 0; - } - case TK_FOR: { /* stat -> forstat */ - forstat(ls, line); - return 0; - } - case TK_REPEAT: { /* stat -> repeatstat */ - repeatstat(ls, line); - return 0; - } - case TK_FUNCTION: { - funcstat(ls, line); /* stat -> funcstat */ - return 0; - } - case TK_LOCAL: { /* stat -> localstat */ - luaX_next(ls); /* skip LOCAL */ - if (testnext(ls, TK_FUNCTION)) /* local function? */ - localfunc(ls); - else - localstat(ls); - return 0; - } - case TK_RETURN: { /* stat -> retstat */ - retstat(ls); - return 1; /* must be last statement */ - } - case TK_BREAK: { /* stat -> breakstat */ - luaX_next(ls); /* skip BREAK */ - breakstat(ls); - return 1; /* must be last statement */ - } - default: { - exprstat(ls); - return 0; /* to avoid warnings */ - } - } -} - - -static void chunk (LexState *ls) { - /* chunk -> { stat [`;'] } */ - int islast = 0; - enterlevel(ls); - while (!islast && !block_follow(ls->t.token)) { - islast = statement(ls); - testnext(ls, ';'); - lua_assert(ls->fs->f->maxstacksize >= ls->fs->freereg && - ls->fs->freereg >= ls->fs->nactvar); - ls->fs->freereg = ls->fs->nactvar; /* free registers */ - } - leavelevel(ls); -} - -/* }====================================================================== */ diff --git a/uppdev/lua/src/lparser.h b/uppdev/lua/src/lparser.h deleted file mode 100644 index c6a8e3223..000000000 --- a/uppdev/lua/src/lparser.h +++ /dev/null @@ -1,82 +0,0 @@ -/* -** $Id: lparser.h,v 1.57 2006/03/09 18:14:31 roberto Exp $ -** Lua Parser -** See Copyright Notice in lua.h -*/ - -#ifndef lparser_h -#define lparser_h - -#include "llimits.h" -#include "lobject.h" -#include "lzio.h" - - -/* -** Expression descriptor -*/ - -typedef enum { - VVOID, /* no value */ - VNIL, - VTRUE, - VFALSE, - VK, /* info = index of constant in `k' */ - VKNUM, /* nval = numerical value */ - VLOCAL, /* info = local register */ - VUPVAL, /* info = index of upvalue in `upvalues' */ - VGLOBAL, /* info = index of table; aux = index of global name in `k' */ - VINDEXED, /* info = table register; aux = index register (or `k') */ - VJMP, /* info = instruction pc */ - VRELOCABLE, /* info = instruction pc */ - VNONRELOC, /* info = result register */ - VCALL, /* info = instruction pc */ - VVARARG /* info = instruction pc */ -} expkind; - -typedef struct expdesc { - expkind k; - union { - struct { int info, aux; } s; - lua_Number nval; - } u; - int t; /* patch list of `exit when true' */ - int f; /* patch list of `exit when false' */ -} expdesc; - - -typedef struct upvaldesc { - lu_byte k; - lu_byte info; -} upvaldesc; - - -struct BlockCnt; /* defined in lparser.c */ - - -/* state needed to generate code for a given function */ -typedef struct FuncState { - Proto *f; /* current function header */ - Table *h; /* table to find (and reuse) elements in `k' */ - struct FuncState *prev; /* enclosing function */ - struct LexState *ls; /* lexical state */ - struct lua_State *L; /* copy of the Lua state */ - struct BlockCnt *bl; /* chain of current blocks */ - int pc; /* next position to code (equivalent to `ncode') */ - int lasttarget; /* `pc' of last `jump target' */ - int jpc; /* list of pending jumps to `pc' */ - int freereg; /* first free register */ - int nk; /* number of elements in `k' */ - int np; /* number of elements in `p' */ - short nlocvars; /* number of elements in `locvars' */ - lu_byte nactvar; /* number of active local variables */ - upvaldesc upvalues[LUAI_MAXUPVALUES]; /* upvalues */ - unsigned short actvar[LUAI_MAXVARS]; /* declared-variable stack */ -} FuncState; - - -LUAI_FUNC Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, - const char *name); - - -#endif diff --git a/uppdev/lua/src/lstate.c b/uppdev/lua/src/lstate.c deleted file mode 100644 index 639877b80..000000000 --- a/uppdev/lua/src/lstate.c +++ /dev/null @@ -1,213 +0,0 @@ -/* -** $Id: lstate.c,v 2.36 2006/05/24 14:15:50 roberto Exp $ -** Global State -** See Copyright Notice in lua.h -*/ - - -#include - -#define lstate_c -#define LUA_CORE - -#include "lua.h" - -#include "ldebug.h" -#include "ldo.h" -#include "lfunc.h" -#include "lgc.h" -#include "llex.h" -#include "lmem.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "ltm.h" - - -#define state_size(x) (sizeof(x) + LUAI_EXTRASPACE) -#define fromstate(l) (cast(lu_byte *, (l)) - LUAI_EXTRASPACE) -#define tostate(l) (cast(lua_State *, cast(lu_byte *, l) + LUAI_EXTRASPACE)) - - -/* -** Main thread combines a thread state and the global state -*/ -typedef struct LG { - lua_State l; - global_State g; -} LG; - - - -static void stack_init (lua_State *L1, lua_State *L) { - /* initialize CallInfo array */ - L1->base_ci = luaM_newvector(L, BASIC_CI_SIZE, CallInfo); - L1->ci = L1->base_ci; - L1->size_ci = BASIC_CI_SIZE; - L1->end_ci = L1->base_ci + L1->size_ci - 1; - /* initialize stack array */ - L1->stack = luaM_newvector(L, BASIC_STACK_SIZE + EXTRA_STACK, TValue); - L1->stacksize = BASIC_STACK_SIZE + EXTRA_STACK; - L1->top = L1->stack; - L1->stack_last = L1->stack+(L1->stacksize - EXTRA_STACK)-1; - /* initialize first ci */ - L1->ci->func = L1->top; - setnilvalue(L1->top++); /* `function' entry for this `ci' */ - L1->base = L1->ci->base = L1->top; - L1->ci->top = L1->top + LUA_MINSTACK; -} - - -static void freestack (lua_State *L, lua_State *L1) { - luaM_freearray(L, L1->base_ci, L1->size_ci, CallInfo); - luaM_freearray(L, L1->stack, L1->stacksize, TValue); -} - - -/* -** open parts that may cause memory-allocation errors -*/ -static void f_luaopen (lua_State *L, void *ud) { - global_State *g = G(L); - UNUSED(ud); - stack_init(L, L); /* init stack */ - sethvalue(L, gt(L), luaH_new(L, 0, 2)); /* table of globals */ - sethvalue(L, registry(L), luaH_new(L, 0, 2)); /* registry */ - luaS_resize(L, MINSTRTABSIZE); /* initial size of string table */ - luaT_init(L); - luaX_init(L); - luaS_fix(luaS_newliteral(L, MEMERRMSG)); - g->GCthreshold = 4*g->totalbytes; -} - - -static void preinit_state (lua_State *L, global_State *g) { - G(L) = g; - L->stack = NULL; - L->stacksize = 0; - L->errorJmp = NULL; - L->hook = NULL; - L->hookmask = 0; - L->basehookcount = 0; - L->allowhook = 1; - resethookcount(L); - L->openupval = NULL; - L->size_ci = 0; - L->nCcalls = 0; - L->status = 0; - L->base_ci = L->ci = NULL; - L->savedpc = NULL; - L->errfunc = 0; - setnilvalue(gt(L)); -} - - -static void close_state (lua_State *L) { - global_State *g = G(L); - luaF_close(L, L->stack); /* close all upvalues for this thread */ - luaC_freeall(L); /* collect all objects */ - lua_assert(g->rootgc == obj2gco(L)); - lua_assert(g->strt.nuse == 0); - luaM_freearray(L, G(L)->strt.hash, G(L)->strt.size, TString *); - luaZ_freebuffer(L, &g->buff); - freestack(L, L); - lua_assert(g->totalbytes == sizeof(LG)); - (*g->frealloc)(g->ud, fromstate(L), state_size(LG), 0); -} - - -lua_State *luaE_newthread (lua_State *L) { - lua_State *L1 = tostate(luaM_malloc(L, state_size(lua_State))); - luaC_link(L, obj2gco(L1), LUA_TTHREAD); - preinit_state(L1, G(L)); - stack_init(L1, L); /* init stack */ - setobj2n(L, gt(L1), gt(L)); /* share table of globals */ - L1->hookmask = L->hookmask; - L1->basehookcount = L->basehookcount; - L1->hook = L->hook; - resethookcount(L1); - lua_assert(iswhite(obj2gco(L1))); - return L1; -} - - -void luaE_freethread (lua_State *L, lua_State *L1) { - luaF_close(L1, L1->stack); /* close all upvalues for this thread */ - lua_assert(L1->openupval == NULL); - luai_userstatefree(L1); - freestack(L, L1); - luaM_freemem(L, fromstate(L1), state_size(lua_State)); -} - - -LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) { - int i; - lua_State *L; - global_State *g; - void *l = (*f)(ud, NULL, 0, state_size(LG)); - if (l == NULL) return NULL; - L = tostate(l); - g = &((LG *)L)->g; - L->next = NULL; - L->tt = LUA_TTHREAD; - g->currentwhite = bit2mask(WHITE0BIT, FIXEDBIT); - L->marked = luaC_white(g); - set2bits(L->marked, FIXEDBIT, SFIXEDBIT); - preinit_state(L, g); - g->frealloc = f; - g->ud = ud; - g->mainthread = L; - g->uvhead.u.l.prev = &g->uvhead; - g->uvhead.u.l.next = &g->uvhead; - g->GCthreshold = 0; /* mark it as unfinished state */ - g->strt.size = 0; - g->strt.nuse = 0; - g->strt.hash = NULL; - setnilvalue(registry(L)); - luaZ_initbuffer(L, &g->buff); - g->panic = NULL; - g->gcstate = GCSpause; - g->rootgc = obj2gco(L); - g->sweepstrgc = 0; - g->sweepgc = &g->rootgc; - g->gray = NULL; - g->grayagain = NULL; - g->weak = NULL; - g->tmudata = NULL; - g->totalbytes = sizeof(LG); - g->gcpause = LUAI_GCPAUSE; - g->gcstepmul = LUAI_GCMUL; - g->gcdept = 0; - for (i=0; imt[i] = NULL; - if (luaD_rawrunprotected(L, f_luaopen, NULL) != 0) { - /* memory allocation error: free partial state */ - close_state(L); - L = NULL; - } - else - luai_userstateopen(L); - return L; -} - - -static void callallgcTM (lua_State *L, void *ud) { - UNUSED(ud); - luaC_callGCTM(L); /* call GC metamethods for all udata */ -} - - -LUA_API void lua_close (lua_State *L) { - L = G(L)->mainthread; /* only the main thread can be closed */ - lua_lock(L); - luaF_close(L, L->stack); /* close all upvalues for this thread */ - luaC_separateudata(L, 1); /* separate udata that have GC metamethods */ - L->errfunc = 0; /* no error function during GC metamethods */ - do { /* repeat until no more errors */ - L->ci = L->base_ci; - L->base = L->top = L->ci->base; - L->nCcalls = 0; - } while (luaD_rawrunprotected(L, callallgcTM, NULL) != 0); - lua_assert(G(L)->tmudata == NULL); - luai_userstateclose(L); - close_state(L); -} diff --git a/uppdev/lua/src/lstate.h b/uppdev/lua/src/lstate.h deleted file mode 100644 index 8edd9e5a7..000000000 --- a/uppdev/lua/src/lstate.h +++ /dev/null @@ -1,167 +0,0 @@ -/* -** $Id: lstate.h,v 2.24 2006/02/06 18:27:59 roberto Exp $ -** Global State -** See Copyright Notice in lua.h -*/ - -#ifndef lstate_h -#define lstate_h - -#include "lua.h" - -#include "lobject.h" -#include "ltm.h" -#include "lzio.h" - - - -struct lua_longjmp; /* defined in ldo.c */ - - -/* table of globals */ -#define gt(L) (&L->l_gt) - -/* registry */ -#define registry(L) (&G(L)->l_registry) - - -/* extra stack space to handle TM calls and some other extras */ -#define EXTRA_STACK 5 - - -#define BASIC_CI_SIZE 8 - -#define BASIC_STACK_SIZE (2*LUA_MINSTACK) - - - -typedef struct stringtable { - GCObject **hash; - lu_int32 nuse; /* number of elements */ - int size; -} stringtable; - - -/* -** informations about a call -*/ -typedef struct CallInfo { - StkId base; /* base for this function */ - StkId func; /* function index in the stack */ - StkId top; /* top for this function */ - const Instruction *savedpc; - int nresults; /* expected number of results from this function */ - int tailcalls; /* number of tail calls lost under this entry */ -} CallInfo; - - - -#define curr_func(L) (clvalue(L->ci->func)) -#define ci_func(ci) (clvalue((ci)->func)) -#define f_isLua(ci) (!ci_func(ci)->c.isC) -#define isLua(ci) (ttisfunction((ci)->func) && f_isLua(ci)) - - -/* -** `global state', shared by all threads of this state -*/ -typedef struct global_State { - stringtable strt; /* hash table for strings */ - lua_Alloc frealloc; /* function to reallocate memory */ - void *ud; /* auxiliary data to `frealloc' */ - lu_byte currentwhite; - lu_byte gcstate; /* state of garbage collector */ - int sweepstrgc; /* position of sweep in `strt' */ - GCObject *rootgc; /* list of all collectable objects */ - GCObject **sweepgc; /* position of sweep in `rootgc' */ - GCObject *gray; /* list of gray objects */ - GCObject *grayagain; /* list of objects to be traversed atomically */ - GCObject *weak; /* list of weak tables (to be cleared) */ - GCObject *tmudata; /* last element of list of userdata to be GC */ - Mbuffer buff; /* temporary buffer for string concatentation */ - lu_mem GCthreshold; - lu_mem totalbytes; /* number of bytes currently allocated */ - lu_mem estimate; /* an estimate of number of bytes actually in use */ - lu_mem gcdept; /* how much GC is `behind schedule' */ - int gcpause; /* size of pause between successive GCs */ - int gcstepmul; /* GC `granularity' */ - lua_CFunction panic; /* to be called in unprotected errors */ - TValue l_registry; - struct lua_State *mainthread; - UpVal uvhead; /* head of double-linked list of all open upvalues */ - struct Table *mt[NUM_TAGS]; /* metatables for basic types */ - TString *tmname[TM_N]; /* array with tag-method names */ -} global_State; - - -/* -** `per thread' state -*/ -struct lua_State { - CommonHeader; - lu_byte status; - StkId top; /* first free slot in the stack */ - StkId base; /* base of current function */ - global_State *l_G; - CallInfo *ci; /* call info for current function */ - const Instruction *savedpc; /* `savedpc' of current function */ - StkId stack_last; /* last free slot in the stack */ - StkId stack; /* stack base */ - CallInfo *end_ci; /* points after end of ci array*/ - CallInfo *base_ci; /* array of CallInfo's */ - int stacksize; - int size_ci; /* size of array `base_ci' */ - unsigned short nCcalls; /* number of nested C calls */ - lu_byte hookmask; - lu_byte allowhook; - int basehookcount; - int hookcount; - lua_Hook hook; - TValue l_gt; /* table of globals */ - TValue env; /* temporary place for environments */ - GCObject *openupval; /* list of open upvalues in this stack */ - GCObject *gclist; - struct lua_longjmp *errorJmp; /* current error recover point */ - ptrdiff_t errfunc; /* current error handling function (stack index) */ -}; - - -#define G(L) (L->l_G) - - -/* -** Union of all collectable objects -*/ -union GCObject { - GCheader gch; - union TString ts; - union Udata u; - union Closure cl; - struct Table h; - struct Proto p; - struct UpVal uv; - struct lua_State th; /* thread */ -}; - - -/* macros to convert a GCObject into a specific value */ -#define rawgco2ts(o) check_exp((o)->gch.tt == LUA_TSTRING, &((o)->ts)) -#define gco2ts(o) (&rawgco2ts(o)->tsv) -#define rawgco2u(o) check_exp((o)->gch.tt == LUA_TUSERDATA, &((o)->u)) -#define gco2u(o) (&rawgco2u(o)->uv) -#define gco2cl(o) check_exp((o)->gch.tt == LUA_TFUNCTION, &((o)->cl)) -#define gco2h(o) check_exp((o)->gch.tt == LUA_TTABLE, &((o)->h)) -#define gco2p(o) check_exp((o)->gch.tt == LUA_TPROTO, &((o)->p)) -#define gco2uv(o) check_exp((o)->gch.tt == LUA_TUPVAL, &((o)->uv)) -#define ngcotouv(o) \ - check_exp((o) == NULL || (o)->gch.tt == LUA_TUPVAL, &((o)->uv)) -#define gco2th(o) check_exp((o)->gch.tt == LUA_TTHREAD, &((o)->th)) - -/* macro to convert any Lua object into a GCObject */ -#define obj2gco(v) (cast(GCObject *, (v))) - - -LUAI_FUNC lua_State *luaE_newthread (lua_State *L); -LUAI_FUNC void luaE_freethread (lua_State *L, lua_State *L1); - -#endif diff --git a/uppdev/lua/src/lstring.c b/uppdev/lua/src/lstring.c deleted file mode 100644 index ed4655295..000000000 --- a/uppdev/lua/src/lstring.c +++ /dev/null @@ -1,110 +0,0 @@ -/* -** $Id: lstring.c,v 2.8 2005/12/22 16:19:56 roberto Exp $ -** String table (keeps all strings handled by Lua) -** See Copyright Notice in lua.h -*/ - - -#include - -#define lstring_c -#define LUA_CORE - -#include "lua.h" - -#include "lmem.h" -#include "lobject.h" -#include "lstate.h" -#include "lstring.h" - - - -void luaS_resize (lua_State *L, int newsize) { - GCObject **newhash; - stringtable *tb; - int i; - if (G(L)->gcstate == GCSsweepstring) - return; /* cannot resize during GC traverse */ - newhash = luaM_newvector(L, newsize, GCObject *); - tb = &G(L)->strt; - for (i=0; isize; i++) { - GCObject *p = tb->hash[i]; - while (p) { /* for each node in the list */ - GCObject *next = p->gch.next; /* save next */ - unsigned int h = gco2ts(p)->hash; - int h1 = lmod(h, newsize); /* new position */ - lua_assert(cast_int(h%newsize) == lmod(h, newsize)); - p->gch.next = newhash[h1]; /* chain it */ - newhash[h1] = p; - p = next; - } - } - luaM_freearray(L, tb->hash, tb->size, TString *); - tb->size = newsize; - tb->hash = newhash; -} - - -static TString *newlstr (lua_State *L, const char *str, size_t l, - unsigned int h) { - TString *ts; - stringtable *tb; - if (l+1 > (MAX_SIZET - sizeof(TString))/sizeof(char)) - luaM_toobig(L); - ts = cast(TString *, luaM_malloc(L, (l+1)*sizeof(char)+sizeof(TString))); - ts->tsv.len = l; - ts->tsv.hash = h; - ts->tsv.marked = luaC_white(G(L)); - ts->tsv.tt = LUA_TSTRING; - ts->tsv.reserved = 0; - memcpy(ts+1, str, l*sizeof(char)); - ((char *)(ts+1))[l] = '\0'; /* ending 0 */ - tb = &G(L)->strt; - h = lmod(h, tb->size); - ts->tsv.next = tb->hash[h]; /* chain new entry */ - tb->hash[h] = obj2gco(ts); - tb->nuse++; - if (tb->nuse > cast(lu_int32, tb->size) && tb->size <= MAX_INT/2) - luaS_resize(L, tb->size*2); /* too crowded */ - return ts; -} - - -TString *luaS_newlstr (lua_State *L, const char *str, size_t l) { - GCObject *o; - unsigned int h = cast(unsigned int, l); /* seed */ - size_t step = (l>>5)+1; /* if string is too long, don't hash all its chars */ - size_t l1; - for (l1=l; l1>=step; l1-=step) /* compute hash */ - h = h ^ ((h<<5)+(h>>2)+cast(unsigned char, str[l1-1])); - for (o = G(L)->strt.hash[lmod(h, G(L)->strt.size)]; - o != NULL; - o = o->gch.next) { - TString *ts = rawgco2ts(o); - if (ts->tsv.len == l && (memcmp(str, getstr(ts), l) == 0)) { - /* string may be dead */ - if (isdead(G(L), o)) changewhite(o); - return ts; - } - } - return newlstr(L, str, l, h); /* not found */ -} - - -Udata *luaS_newudata (lua_State *L, size_t s, Table *e) { - Udata *u; - if (s > MAX_SIZET - sizeof(Udata)) - luaM_toobig(L); - u = cast(Udata *, luaM_malloc(L, s + sizeof(Udata))); - u->uv.marked = luaC_white(G(L)); /* is not finalized */ - u->uv.tt = LUA_TUSERDATA; - u->uv.len = s; - u->uv.metatable = NULL; - u->uv.env = e; - /* chain it on udata list (after main thread) */ - u->uv.next = G(L)->mainthread->next; - G(L)->mainthread->next = obj2gco(u); - return u; -} diff --git a/uppdev/lua/src/lstring.h b/uppdev/lua/src/lstring.h deleted file mode 100644 index 6d59e6e32..000000000 --- a/uppdev/lua/src/lstring.h +++ /dev/null @@ -1,31 +0,0 @@ -/* -** $Id: lstring.h,v 1.43 2005/04/25 19:24:10 roberto Exp $ -** String table (keep all strings handled by Lua) -** See Copyright Notice in lua.h -*/ - -#ifndef lstring_h -#define lstring_h - - -#include "lgc.h" -#include "lobject.h" -#include "lstate.h" - - -#define sizestring(s) (sizeof(union TString)+((s)->len+1)*sizeof(char)) - -#define sizeudata(u) (sizeof(union Udata)+(u)->len) - -#define luaS_new(L, s) (luaS_newlstr(L, s, strlen(s))) -#define luaS_newliteral(L, s) (luaS_newlstr(L, "" s, \ - (sizeof(s)/sizeof(char))-1)) - -#define luaS_fix(s) l_setbit((s)->tsv.marked, FIXEDBIT) - -LUAI_FUNC void luaS_resize (lua_State *L, int newsize); -LUAI_FUNC Udata *luaS_newudata (lua_State *L, size_t s, Table *e); -LUAI_FUNC TString *luaS_newlstr (lua_State *L, const char *str, size_t l); - - -#endif diff --git a/uppdev/lua/src/lstrlib.c b/uppdev/lua/src/lstrlib.c deleted file mode 100644 index 566b3ead3..000000000 --- a/uppdev/lua/src/lstrlib.c +++ /dev/null @@ -1,867 +0,0 @@ -/* -** $Id: lstrlib.c,v 1.132 2006/04/26 20:41:19 roberto Exp $ -** Standard library for string operations and pattern-matching -** See Copyright Notice in lua.h -*/ - - -#include -#include -#include -#include -#include - -#define lstrlib_c -#define LUA_LIB - -#include "lua.h" - -#include "lauxlib.h" -#include "lualib.h" - - -/* macro to `unsign' a character */ -#define uchar(c) ((unsigned char)(c)) - - - -static int str_len (lua_State *L) { - size_t l; - luaL_checklstring(L, 1, &l); - lua_pushinteger(L, l); - return 1; -} - - -static ptrdiff_t posrelat (ptrdiff_t pos, size_t len) { - /* relative string position: negative means back from end */ - return (pos>=0) ? pos : (ptrdiff_t)len+pos+1; -} - - -static int str_sub (lua_State *L) { - size_t l; - const char *s = luaL_checklstring(L, 1, &l); - ptrdiff_t start = posrelat(luaL_checkinteger(L, 2), l); - ptrdiff_t end = posrelat(luaL_optinteger(L, 3, -1), l); - if (start < 1) start = 1; - if (end > (ptrdiff_t)l) end = (ptrdiff_t)l; - if (start <= end) - lua_pushlstring(L, s+start-1, end-start+1); - else lua_pushliteral(L, ""); - return 1; -} - - -static int str_reverse (lua_State *L) { - size_t l; - luaL_Buffer b; - const char *s = luaL_checklstring(L, 1, &l); - luaL_buffinit(L, &b); - while (l--) luaL_addchar(&b, s[l]); - luaL_pushresult(&b); - return 1; -} - - -static int str_lower (lua_State *L) { - size_t l; - size_t i; - luaL_Buffer b; - const char *s = luaL_checklstring(L, 1, &l); - luaL_buffinit(L, &b); - for (i=0; i 0) - luaL_addlstring(&b, s, l); - luaL_pushresult(&b); - return 1; -} - - -static int str_byte (lua_State *L) { - size_t l; - const char *s = luaL_checklstring(L, 1, &l); - ptrdiff_t posi = posrelat(luaL_optinteger(L, 2, 1), l); - ptrdiff_t pose = posrelat(luaL_optinteger(L, 3, posi), l); - int n, i; - if (posi <= 0) posi = 1; - if ((size_t)pose > l) pose = l; - if (posi > pose) return 0; /* empty interval; return no values */ - n = (int)(pose - posi + 1); - if (posi + n <= pose) /* overflow? */ - luaL_error(L, "string slice too long"); - luaL_checkstack(L, n, "string slice too long"); - for (i=0; i= ms->level || ms->capture[l].len == CAP_UNFINISHED) - return luaL_error(ms->L, "invalid capture index"); - return l; -} - - -static int capture_to_close (MatchState *ms) { - int level = ms->level; - for (level--; level>=0; level--) - if (ms->capture[level].len == CAP_UNFINISHED) return level; - return luaL_error(ms->L, "invalid pattern capture"); -} - - -static const char *classend (MatchState *ms, const char *p) { - switch (*p++) { - case L_ESC: { - if (*p == '\0') - luaL_error(ms->L, "malformed pattern (ends with " LUA_QL("%%") ")"); - return p+1; - } - case '[': { - if (*p == '^') p++; - do { /* look for a `]' */ - if (*p == '\0') - luaL_error(ms->L, "malformed pattern (missing " LUA_QL("]") ")"); - if (*(p++) == L_ESC && *p != '\0') - p++; /* skip escapes (e.g. `%]') */ - } while (*p != ']'); - return p+1; - } - default: { - return p; - } - } -} - - -static int match_class (int c, int cl) { - int res; - switch (tolower(cl)) { - case 'a' : res = isalpha(c); break; - case 'c' : res = iscntrl(c); break; - case 'd' : res = isdigit(c); break; - case 'l' : res = islower(c); break; - case 'p' : res = ispunct(c); break; - case 's' : res = isspace(c); break; - case 'u' : res = isupper(c); break; - case 'w' : res = isalnum(c); break; - case 'x' : res = isxdigit(c); break; - case 'z' : res = (c == 0); break; - default: return (cl == c); - } - return (islower(cl) ? res : !res); -} - - -static int matchbracketclass (int c, const char *p, const char *ec) { - int sig = 1; - if (*(p+1) == '^') { - sig = 0; - p++; /* skip the `^' */ - } - while (++p < ec) { - if (*p == L_ESC) { - p++; - if (match_class(c, uchar(*p))) - return sig; - } - else if ((*(p+1) == '-') && (p+2 < ec)) { - p+=2; - if (uchar(*(p-2)) <= c && c <= uchar(*p)) - return sig; - } - else if (uchar(*p) == c) return sig; - } - return !sig; -} - - -static int singlematch (int c, const char *p, const char *ep) { - switch (*p) { - case '.': return 1; /* matches any char */ - case L_ESC: return match_class(c, uchar(*(p+1))); - case '[': return matchbracketclass(c, p, ep-1); - default: return (uchar(*p) == c); - } -} - - -static const char *match (MatchState *ms, const char *s, const char *p); - - -static const char *matchbalance (MatchState *ms, const char *s, - const char *p) { - if (*p == 0 || *(p+1) == 0) - luaL_error(ms->L, "unbalanced pattern"); - if (*s != *p) return NULL; - else { - int b = *p; - int e = *(p+1); - int cont = 1; - while (++s < ms->src_end) { - if (*s == e) { - if (--cont == 0) return s+1; - } - else if (*s == b) cont++; - } - } - return NULL; /* string ends out of balance */ -} - - -static const char *max_expand (MatchState *ms, const char *s, - const char *p, const char *ep) { - ptrdiff_t i = 0; /* counts maximum expand for item */ - while ((s+i)src_end && singlematch(uchar(*(s+i)), p, ep)) - i++; - /* keeps trying to match with the maximum repetitions */ - while (i>=0) { - const char *res = match(ms, (s+i), ep+1); - if (res) return res; - i--; /* else didn't match; reduce 1 repetition to try again */ - } - return NULL; -} - - -static const char *min_expand (MatchState *ms, const char *s, - const char *p, const char *ep) { - for (;;) { - const char *res = match(ms, s, ep+1); - if (res != NULL) - return res; - else if (ssrc_end && singlematch(uchar(*s), p, ep)) - s++; /* try with one more repetition */ - else return NULL; - } -} - - -static const char *start_capture (MatchState *ms, const char *s, - const char *p, int what) { - const char *res; - int level = ms->level; - if (level >= LUA_MAXCAPTURES) luaL_error(ms->L, "too many captures"); - ms->capture[level].init = s; - ms->capture[level].len = what; - ms->level = level+1; - if ((res=match(ms, s, p)) == NULL) /* match failed? */ - ms->level--; /* undo capture */ - return res; -} - - -static const char *end_capture (MatchState *ms, const char *s, - const char *p) { - int l = capture_to_close(ms); - const char *res; - ms->capture[l].len = s - ms->capture[l].init; /* close capture */ - if ((res = match(ms, s, p)) == NULL) /* match failed? */ - ms->capture[l].len = CAP_UNFINISHED; /* undo capture */ - return res; -} - - -static const char *match_capture (MatchState *ms, const char *s, int l) { - size_t len; - l = check_capture(ms, l); - len = ms->capture[l].len; - if ((size_t)(ms->src_end-s) >= len && - memcmp(ms->capture[l].init, s, len) == 0) - return s+len; - else return NULL; -} - - -static const char *match (MatchState *ms, const char *s, const char *p) { - init: /* using goto's to optimize tail recursion */ - switch (*p) { - case '(': { /* start capture */ - if (*(p+1) == ')') /* position capture? */ - return start_capture(ms, s, p+2, CAP_POSITION); - else - return start_capture(ms, s, p+1, CAP_UNFINISHED); - } - case ')': { /* end capture */ - return end_capture(ms, s, p+1); - } - case L_ESC: { - switch (*(p+1)) { - case 'b': { /* balanced string? */ - s = matchbalance(ms, s, p+2); - if (s == NULL) return NULL; - p+=4; goto init; /* else return match(ms, s, p+4); */ - } - case 'f': { /* frontier? */ - const char *ep; char previous; - p += 2; - if (*p != '[') - luaL_error(ms->L, "missing " LUA_QL("[") " after " - LUA_QL("%%f") " in pattern"); - ep = classend(ms, p); /* points to what is next */ - previous = (s == ms->src_init) ? '\0' : *(s-1); - if (matchbracketclass(uchar(previous), p, ep-1) || - !matchbracketclass(uchar(*s), p, ep-1)) return NULL; - p=ep; goto init; /* else return match(ms, s, ep); */ - } - default: { - if (isdigit(uchar(*(p+1)))) { /* capture results (%0-%9)? */ - s = match_capture(ms, s, uchar(*(p+1))); - if (s == NULL) return NULL; - p+=2; goto init; /* else return match(ms, s, p+2) */ - } - goto dflt; /* case default */ - } - } - } - case '\0': { /* end of pattern */ - return s; /* match succeeded */ - } - case '$': { - if (*(p+1) == '\0') /* is the `$' the last char in pattern? */ - return (s == ms->src_end) ? s : NULL; /* check end of string */ - else goto dflt; - } - default: dflt: { /* it is a pattern item */ - const char *ep = classend(ms, p); /* points to what is next */ - int m = ssrc_end && singlematch(uchar(*s), p, ep); - switch (*ep) { - case '?': { /* optional */ - const char *res; - if (m && ((res=match(ms, s+1, ep+1)) != NULL)) - return res; - p=ep+1; goto init; /* else return match(ms, s, ep+1); */ - } - case '*': { /* 0 or more repetitions */ - return max_expand(ms, s, p, ep); - } - case '+': { /* 1 or more repetitions */ - return (m ? max_expand(ms, s+1, p, ep) : NULL); - } - case '-': { /* 0 or more repetitions (minimum) */ - return min_expand(ms, s, p, ep); - } - default: { - if (!m) return NULL; - s++; p=ep; goto init; /* else return match(ms, s+1, ep); */ - } - } - } - } -} - - - -static const char *lmemfind (const char *s1, size_t l1, - const char *s2, size_t l2) { - if (l2 == 0) return s1; /* empty strings are everywhere */ - else if (l2 > l1) return NULL; /* avoids a negative `l1' */ - else { - const char *init; /* to search for a `*s2' inside `s1' */ - l2--; /* 1st char will be checked by `memchr' */ - l1 = l1-l2; /* `s2' cannot be found after that */ - while (l1 > 0 && (init = (const char *)memchr(s1, *s2, l1)) != NULL) { - init++; /* 1st char is already checked */ - if (memcmp(init, s2+1, l2) == 0) - return init-1; - else { /* correct `l1' and `s1' to try again */ - l1 -= init-s1; - s1 = init; - } - } - return NULL; /* not found */ - } -} - - -static void push_onecapture (MatchState *ms, int i, const char *s, - const char *e) { - if (i >= ms->level) { - if (i == 0) /* ms->level == 0, too */ - lua_pushlstring(ms->L, s, e - s); /* add whole match */ - else - luaL_error(ms->L, "invalid capture index"); - } - else { - ptrdiff_t l = ms->capture[i].len; - if (l == CAP_UNFINISHED) luaL_error(ms->L, "unfinished capture"); - if (l == CAP_POSITION) - lua_pushinteger(ms->L, ms->capture[i].init - ms->src_init + 1); - else - lua_pushlstring(ms->L, ms->capture[i].init, l); - } -} - - -static int push_captures (MatchState *ms, const char *s, const char *e) { - int i; - int nlevels = (ms->level == 0 && s) ? 1 : ms->level; - luaL_checkstack(ms->L, nlevels, "too many captures"); - for (i = 0; i < nlevels; i++) - push_onecapture(ms, i, s, e); - return nlevels; /* number of strings pushed */ -} - - -static int str_find_aux (lua_State *L, int find) { - size_t l1, l2; - const char *s = luaL_checklstring(L, 1, &l1); - const char *p = luaL_checklstring(L, 2, &l2); - ptrdiff_t init = posrelat(luaL_optinteger(L, 3, 1), l1) - 1; - if (init < 0) init = 0; - else if ((size_t)(init) > l1) init = (ptrdiff_t)l1; - if (find && (lua_toboolean(L, 4) || /* explicit request? */ - strpbrk(p, SPECIALS) == NULL)) { /* or no special characters? */ - /* do a plain search */ - const char *s2 = lmemfind(s+init, l1-init, p, l2); - if (s2) { - lua_pushinteger(L, s2-s+1); - lua_pushinteger(L, s2-s+l2); - return 2; - } - } - else { - MatchState ms; - int anchor = (*p == '^') ? (p++, 1) : 0; - const char *s1=s+init; - ms.L = L; - ms.src_init = s; - ms.src_end = s+l1; - do { - const char *res; - ms.level = 0; - if ((res=match(&ms, s1, p)) != NULL) { - if (find) { - lua_pushinteger(L, s1-s+1); /* start */ - lua_pushinteger(L, res-s); /* end */ - return push_captures(&ms, NULL, 0) + 2; - } - else - return push_captures(&ms, s1, res); - } - } while (s1++ < ms.src_end && !anchor); - } - lua_pushnil(L); /* not found */ - return 1; -} - - -static int str_find (lua_State *L) { - return str_find_aux(L, 1); -} - - -static int str_match (lua_State *L) { - return str_find_aux(L, 0); -} - - -static int gmatch_aux (lua_State *L) { - MatchState ms; - size_t ls; - const char *s = lua_tolstring(L, lua_upvalueindex(1), &ls); - const char *p = lua_tostring(L, lua_upvalueindex(2)); - const char *src; - ms.L = L; - ms.src_init = s; - ms.src_end = s+ls; - for (src = s + (size_t)lua_tointeger(L, lua_upvalueindex(3)); - src <= ms.src_end; - src++) { - const char *e; - ms.level = 0; - if ((e = match(&ms, src, p)) != NULL) { - lua_Integer newstart = e-s; - if (e == src) newstart++; /* empty match? go at least one position */ - lua_pushinteger(L, newstart); - lua_replace(L, lua_upvalueindex(3)); - return push_captures(&ms, src, e); - } - } - return 0; /* not found */ -} - - -static int gmatch (lua_State *L) { - luaL_checkstring(L, 1); - luaL_checkstring(L, 2); - lua_settop(L, 2); - lua_pushinteger(L, 0); - lua_pushcclosure(L, gmatch_aux, 3); - return 1; -} - - -static int gfind_nodef (lua_State *L) { - return luaL_error(L, LUA_QL("string.gfind") " was renamed to " - LUA_QL("string.gmatch")); -} - - -static void add_s (MatchState *ms, luaL_Buffer *b, const char *s, - const char *e) { - size_t l, i; - const char *news = lua_tolstring(ms->L, 3, &l); - for (i = 0; i < l; i++) { - if (news[i] != L_ESC) - luaL_addchar(b, news[i]); - else { - i++; /* skip ESC */ - if (!isdigit(uchar(news[i]))) - luaL_addchar(b, news[i]); - else if (news[i] == '0') - luaL_addlstring(b, s, e - s); - else { - push_onecapture(ms, news[i] - '1', s, e); - luaL_addvalue(b); /* add capture to accumulated result */ - } - } - } -} - - -static void add_value (MatchState *ms, luaL_Buffer *b, const char *s, - const char *e) { - lua_State *L = ms->L; - switch (lua_type(L, 3)) { - case LUA_TNUMBER: - case LUA_TSTRING: { - add_s(ms, b, s, e); - return; - } - case LUA_TFUNCTION: { - int n; - lua_pushvalue(L, 3); - n = push_captures(ms, s, e); - lua_call(L, n, 1); - break; - } - case LUA_TTABLE: { - push_onecapture(ms, 0, s, e); - lua_gettable(L, 3); - break; - } - default: { - luaL_argerror(L, 3, "string/function/table expected"); - return; - } - } - if (!lua_toboolean(L, -1)) { /* nil or false? */ - lua_pop(L, 1); - lua_pushlstring(L, s, e - s); /* keep original text */ - } - else if (!lua_isstring(L, -1)) - luaL_error(L, "invalid replacement value (a %s)", luaL_typename(L, -1)); - luaL_addvalue(b); /* add result to accumulator */ -} - - -static int str_gsub (lua_State *L) { - size_t srcl; - const char *src = luaL_checklstring(L, 1, &srcl); - const char *p = luaL_checkstring(L, 2); - int max_s = luaL_optint(L, 4, srcl+1); - int anchor = (*p == '^') ? (p++, 1) : 0; - int n = 0; - MatchState ms; - luaL_Buffer b; - luaL_buffinit(L, &b); - ms.L = L; - ms.src_init = src; - ms.src_end = src+srcl; - while (n < max_s) { - const char *e; - ms.level = 0; - e = match(&ms, src, p); - if (e) { - n++; - add_value(&ms, &b, src, e); - } - if (e && e>src) /* non empty match? */ - src = e; /* skip it */ - else if (src < ms.src_end) - luaL_addchar(&b, *src++); - else break; - if (anchor) break; - } - luaL_addlstring(&b, src, ms.src_end-src); - luaL_pushresult(&b); - lua_pushinteger(L, n); /* number of substitutions */ - return 2; -} - -/* }====================================================== */ - - -/* maximum size of each formatted item (> len(format('%99.99f', -1e308))) */ -#define MAX_ITEM 512 -/* valid flags in a format specification */ -#define FLAGS "-+ #0" -/* -** maximum size of each format specification (such as '%-099.99d') -** (+10 accounts for %99.99x plus margin of error) -*/ -#define MAX_FORMAT (sizeof(FLAGS) + sizeof(LUA_INTFRMLEN) + 10) - - -static void addquoted (lua_State *L, luaL_Buffer *b, int arg) { - size_t l; - const char *s = luaL_checklstring(L, arg, &l); - luaL_addchar(b, '"'); - while (l--) { - switch (*s) { - case '"': case '\\': case '\n': { - luaL_addchar(b, '\\'); - luaL_addchar(b, *s); - break; - } - case '\r': { - luaL_addlstring(b, "\\r", 2); - break; - } - case '\0': { - luaL_addlstring(b, "\\000", 4); - break; - } - default: { - luaL_addchar(b, *s); - break; - } - } - s++; - } - luaL_addchar(b, '"'); -} - -static const char *scanformat (lua_State *L, const char *strfrmt, char *form) { - const char *p = strfrmt; - while (strchr(FLAGS, *p)) p++; /* skip flags */ - if ((size_t)(p - strfrmt) >= sizeof(FLAGS)) - luaL_error(L, "invalid format (repeated flags)"); - if (isdigit(uchar(*p))) p++; /* skip width */ - if (isdigit(uchar(*p))) p++; /* (2 digits at most) */ - if (*p == '.') { - p++; - if (isdigit(uchar(*p))) p++; /* skip precision */ - if (isdigit(uchar(*p))) p++; /* (2 digits at most) */ - } - if (isdigit(uchar(*p))) - luaL_error(L, "invalid format (width or precision too long)"); - *(form++) = '%'; - strncpy(form, strfrmt, p - strfrmt + 1); - form += p - strfrmt + 1; - *form = '\0'; - return p; -} - - -static void addintlen (char *form) { - size_t l = strlen(form); - char spec = form[l - 1]; - strcpy(form + l - 1, LUA_INTFRMLEN); - form[l + sizeof(LUA_INTFRMLEN) - 2] = spec; - form[l + sizeof(LUA_INTFRMLEN) - 1] = '\0'; -} - - -static int str_format (lua_State *L) { - int arg = 1; - size_t sfl; - const char *strfrmt = luaL_checklstring(L, arg, &sfl); - const char *strfrmt_end = strfrmt+sfl; - luaL_Buffer b; - luaL_buffinit(L, &b); - while (strfrmt < strfrmt_end) { - if (*strfrmt != L_ESC) - luaL_addchar(&b, *strfrmt++); - else if (*++strfrmt == L_ESC) - luaL_addchar(&b, *strfrmt++); /* %% */ - else { /* format item */ - char form[MAX_FORMAT]; /* to store the format (`%...') */ - char buff[MAX_ITEM]; /* to store the formatted item */ - arg++; - strfrmt = scanformat(L, strfrmt, form); - switch (*strfrmt++) { - case 'c': { - sprintf(buff, form, (int)luaL_checknumber(L, arg)); - break; - } - case 'd': case 'i': { - addintlen(form); - sprintf(buff, form, (LUA_INTFRM_T)luaL_checknumber(L, arg)); - break; - } - case 'o': case 'u': case 'x': case 'X': { - addintlen(form); - sprintf(buff, form, (unsigned LUA_INTFRM_T)luaL_checknumber(L, arg)); - break; - } - case 'e': case 'E': case 'f': - case 'g': case 'G': { - sprintf(buff, form, (double)luaL_checknumber(L, arg)); - break; - } - case 'q': { - addquoted(L, &b, arg); - continue; /* skip the 'addsize' at the end */ - } - case 's': { - size_t l; - const char *s = luaL_checklstring(L, arg, &l); - if (!strchr(form, '.') && l >= 100) { - /* no precision and string is too long to be formatted; - keep original string */ - lua_pushvalue(L, arg); - luaL_addvalue(&b); - continue; /* skip the `addsize' at the end */ - } - else { - sprintf(buff, form, s); - break; - } - } - default: { /* also treat cases `pnLlh' */ - return luaL_error(L, "invalid option " LUA_QL("%%%c") " to " - LUA_QL("format"), *(strfrmt - 1)); - } - } - luaL_addlstring(&b, buff, strlen(buff)); - } - } - luaL_pushresult(&b); - return 1; -} - - -static const luaL_Reg strlib[] = { - {"byte", str_byte}, - {"char", str_char}, - {"dump", str_dump}, - {"find", str_find}, - {"format", str_format}, - {"gfind", gfind_nodef}, - {"gmatch", gmatch}, - {"gsub", str_gsub}, - {"len", str_len}, - {"lower", str_lower}, - {"match", str_match}, - {"rep", str_rep}, - {"reverse", str_reverse}, - {"sub", str_sub}, - {"upper", str_upper}, - {NULL, NULL} -}; - - -static void createmetatable (lua_State *L) { - lua_createtable(L, 0, 1); /* create metatable for strings */ - lua_pushliteral(L, ""); /* dummy string */ - lua_pushvalue(L, -2); - lua_setmetatable(L, -2); /* set string metatable */ - lua_pop(L, 1); /* pop dummy string */ - lua_pushvalue(L, -2); /* string library... */ - lua_setfield(L, -2, "__index"); /* ...is the __index metamethod */ - lua_pop(L, 1); /* pop metatable */ -} - - -/* -** Open string library -*/ -LUALIB_API int luaopen_string (lua_State *L) { - luaL_register(L, LUA_STRLIBNAME, strlib); -#if defined(LUA_COMPAT_GFIND) - lua_getfield(L, -1, "gmatch"); - lua_setfield(L, -2, "gfind"); -#endif - createmetatable(L); - return 1; -} diff --git a/uppdev/lua/src/ltable.c b/uppdev/lua/src/ltable.c deleted file mode 100644 index 6b732f17c..000000000 --- a/uppdev/lua/src/ltable.c +++ /dev/null @@ -1,588 +0,0 @@ -/* -** $Id: ltable.c,v 2.32 2006/01/18 11:49:02 roberto Exp $ -** Lua tables (hash) -** See Copyright Notice in lua.h -*/ - - -/* -** Implementation of tables (aka arrays, objects, or hash tables). -** Tables keep its elements in two parts: an array part and a hash part. -** Non-negative integer keys are all candidates to be kept in the array -** part. The actual size of the array is the largest `n' such that at -** least half the slots between 0 and n are in use. -** Hash uses a mix of chained scatter table with Brent's variation. -** A main invariant of these tables is that, if an element is not -** in its main position (i.e. the `original' position that its hash gives -** to it), then the colliding element is in its own main position. -** Hence even when the load factor reaches 100%, performance remains good. -*/ - -#include -#include - -#define ltable_c -#define LUA_CORE - -#include "lua.h" - -#include "ldebug.h" -#include "ldo.h" -#include "lgc.h" -#include "lmem.h" -#include "lobject.h" -#include "lstate.h" -#include "ltable.h" - - -/* -** max size of array part is 2^MAXBITS -*/ -#if LUAI_BITSINT > 26 -#define MAXBITS 26 -#else -#define MAXBITS (LUAI_BITSINT-2) -#endif - -#define MAXASIZE (1 << MAXBITS) - - -#define hashpow2(t,n) (gnode(t, lmod((n), sizenode(t)))) - -#define hashstr(t,str) hashpow2(t, (str)->tsv.hash) -#define hashboolean(t,p) hashpow2(t, p) - - -/* -** for some types, it is better to avoid modulus by power of 2, as -** they tend to have many 2 factors. -*/ -#define hashmod(t,n) (gnode(t, ((n) % ((sizenode(t)-1)|1)))) - - -#define hashpointer(t,p) hashmod(t, IntPoint(p)) - - -/* -** number of ints inside a lua_Number -*/ -#define numints cast_int(sizeof(lua_Number)/sizeof(int)) - - - -#define dummynode (&dummynode_) - -static const Node dummynode_ = { - {{NULL}, LUA_TNIL}, /* value */ - {{{NULL}, LUA_TNIL, NULL}} /* key */ -}; - - -/* -** hash for lua_Numbers -*/ -static Node *hashnum (const Table *t, lua_Number n) { - unsigned int a[numints]; - int i; - n += 1; /* normalize number (avoid -0) */ - lua_assert(sizeof(a) <= sizeof(n)); - memcpy(a, &n, sizeof(a)); - for (i = 1; i < numints; i++) a[0] += a[i]; - return hashmod(t, a[0]); -} - - - -/* -** returns the `main' position of an element in a table (that is, the index -** of its hash value) -*/ -static Node *mainposition (const Table *t, const TValue *key) { - switch (ttype(key)) { - case LUA_TNUMBER: - return hashnum(t, nvalue(key)); - case LUA_TSTRING: - return hashstr(t, rawtsvalue(key)); - case LUA_TBOOLEAN: - return hashboolean(t, bvalue(key)); - case LUA_TLIGHTUSERDATA: - return hashpointer(t, pvalue(key)); - default: - return hashpointer(t, gcvalue(key)); - } -} - - -/* -** returns the index for `key' if `key' is an appropriate key to live in -** the array part of the table, -1 otherwise. -*/ -static int arrayindex (const TValue *key) { - if (ttisnumber(key)) { - lua_Number n = nvalue(key); - int k; - lua_number2int(k, n); - if (luai_numeq(cast_num(k), n)) - return k; - } - return -1; /* `key' did not match some condition */ -} - - -/* -** returns the index of a `key' for table traversals. First goes all -** elements in the array part, then elements in the hash part. The -** beginning of a traversal is signalled by -1. -*/ -static int findindex (lua_State *L, Table *t, StkId key) { - int i; - if (ttisnil(key)) return -1; /* first iteration */ - i = arrayindex(key); - if (0 < i && i <= t->sizearray) /* is `key' inside array part? */ - return i-1; /* yes; that's the index (corrected to C) */ - else { - Node *n = mainposition(t, key); - do { /* check whether `key' is somewhere in the chain */ - /* key may be dead already, but it is ok to use it in `next' */ - if (luaO_rawequalObj(key2tval(n), key) || - (ttype(gkey(n)) == LUA_TDEADKEY && iscollectable(key) && - gcvalue(gkey(n)) == gcvalue(key))) { - i = cast_int(n - gnode(t, 0)); /* key index in hash table */ - /* hash elements are numbered after array ones */ - return i + t->sizearray; - } - else n = gnext(n); - } while (n); - luaG_runerror(L, "invalid key to " LUA_QL("next")); /* key not found */ - return 0; /* to avoid warnings */ - } -} - - -int luaH_next (lua_State *L, Table *t, StkId key) { - int i = findindex(L, t, key); /* find original element */ - for (i++; i < t->sizearray; i++) { /* try first array part */ - if (!ttisnil(&t->array[i])) { /* a non-nil value? */ - setnvalue(key, cast_num(i+1)); - setobj2s(L, key+1, &t->array[i]); - return 1; - } - } - for (i -= t->sizearray; i < sizenode(t); i++) { /* then hash part */ - if (!ttisnil(gval(gnode(t, i)))) { /* a non-nil value? */ - setobj2s(L, key, key2tval(gnode(t, i))); - setobj2s(L, key+1, gval(gnode(t, i))); - return 1; - } - } - return 0; /* no more elements */ -} - - -/* -** {============================================================= -** Rehash -** ============================================================== -*/ - - -static int computesizes (int nums[], int *narray) { - int i; - int twotoi; /* 2^i */ - int a = 0; /* number of elements smaller than 2^i */ - int na = 0; /* number of elements to go to array part */ - int n = 0; /* optimal size for array part */ - for (i = 0, twotoi = 1; twotoi/2 < *narray; i++, twotoi *= 2) { - if (nums[i] > 0) { - a += nums[i]; - if (a > twotoi/2) { /* more than half elements present? */ - n = twotoi; /* optimal size (till now) */ - na = a; /* all elements smaller than n will go to array part */ - } - } - if (a == *narray) break; /* all elements already counted */ - } - *narray = n; - lua_assert(*narray/2 <= na && na <= *narray); - return na; -} - - -static int countint (const TValue *key, int *nums) { - int k = arrayindex(key); - if (0 < k && k <= MAXASIZE) { /* is `key' an appropriate array index? */ - nums[ceillog2(k)]++; /* count as such */ - return 1; - } - else - return 0; -} - - -static int numusearray (const Table *t, int *nums) { - int lg; - int ttlg; /* 2^lg */ - int ause = 0; /* summation of `nums' */ - int i = 1; /* count to traverse all array keys */ - for (lg=0, ttlg=1; lg<=MAXBITS; lg++, ttlg*=2) { /* for each slice */ - int lc = 0; /* counter */ - int lim = ttlg; - if (lim > t->sizearray) { - lim = t->sizearray; /* adjust upper limit */ - if (i > lim) - break; /* no more elements to count */ - } - /* count elements in range (2^(lg-1), 2^lg] */ - for (; i <= lim; i++) { - if (!ttisnil(&t->array[i-1])) - lc++; - } - nums[lg] += lc; - ause += lc; - } - return ause; -} - - -static int numusehash (const Table *t, int *nums, int *pnasize) { - int totaluse = 0; /* total number of elements */ - int ause = 0; /* summation of `nums' */ - int i = sizenode(t); - while (i--) { - Node *n = &t->node[i]; - if (!ttisnil(gval(n))) { - ause += countint(key2tval(n), nums); - totaluse++; - } - } - *pnasize += ause; - return totaluse; -} - - -static void setarrayvector (lua_State *L, Table *t, int size) { - int i; - luaM_reallocvector(L, t->array, t->sizearray, size, TValue); - for (i=t->sizearray; iarray[i]); - t->sizearray = size; -} - - -static void setnodevector (lua_State *L, Table *t, int size) { - int lsize; - if (size == 0) { /* no elements to hash part? */ - t->node = cast(Node *, dummynode); /* use common `dummynode' */ - lsize = 0; - } - else { - int i; - lsize = ceillog2(size); - if (lsize > MAXBITS) - luaG_runerror(L, "table overflow"); - size = twoto(lsize); - t->node = luaM_newvector(L, size, Node); - for (i=0; ilsizenode = cast_byte(lsize); - t->lastfree = gnode(t, size); /* all positions are free */ -} - - -static void resize (lua_State *L, Table *t, int nasize, int nhsize) { - int i; - int oldasize = t->sizearray; - int oldhsize = t->lsizenode; - Node *nold = t->node; /* save old hash ... */ - if (nasize > oldasize) /* array part must grow? */ - setarrayvector(L, t, nasize); - /* create new hash part with appropriate size */ - setnodevector(L, t, nhsize); - if (nasize < oldasize) { /* array part must shrink? */ - t->sizearray = nasize; - /* re-insert elements from vanishing slice */ - for (i=nasize; iarray[i])) - setobjt2t(L, luaH_setnum(L, t, i+1), &t->array[i]); - } - /* shrink array */ - luaM_reallocvector(L, t->array, oldasize, nasize, TValue); - } - /* re-insert elements from hash part */ - for (i = twoto(oldhsize) - 1; i >= 0; i--) { - Node *old = nold+i; - if (!ttisnil(gval(old))) - setobjt2t(L, luaH_set(L, t, key2tval(old)), gval(old)); - } - if (nold != dummynode) - luaM_freearray(L, nold, twoto(oldhsize), Node); /* free old array */ -} - - -void luaH_resizearray (lua_State *L, Table *t, int nasize) { - int nsize = (t->node == dummynode) ? 0 : sizenode(t); - resize(L, t, nasize, nsize); -} - - -static void rehash (lua_State *L, Table *t, const TValue *ek) { - int nasize, na; - int nums[MAXBITS+1]; /* nums[i] = number of keys between 2^(i-1) and 2^i */ - int i; - int totaluse; - for (i=0; i<=MAXBITS; i++) nums[i] = 0; /* reset counts */ - nasize = numusearray(t, nums); /* count keys in array part */ - totaluse = nasize; /* all those keys are integer keys */ - totaluse += numusehash(t, nums, &nasize); /* count keys in hash part */ - /* count extra key */ - nasize += countint(ek, nums); - totaluse++; - /* compute new size for array part */ - na = computesizes(nums, &nasize); - /* resize the table to new computed sizes */ - resize(L, t, nasize, totaluse - na); -} - - - -/* -** }============================================================= -*/ - - -Table *luaH_new (lua_State *L, int narray, int nhash) { - Table *t = luaM_new(L, Table); - luaC_link(L, obj2gco(t), LUA_TTABLE); - t->metatable = NULL; - t->flags = cast_byte(~0); - /* temporary values (kept only if some malloc fails) */ - t->array = NULL; - t->sizearray = 0; - t->lsizenode = 0; - t->node = cast(Node *, dummynode); - setarrayvector(L, t, narray); - setnodevector(L, t, nhash); - return t; -} - - -void luaH_free (lua_State *L, Table *t) { - if (t->node != dummynode) - luaM_freearray(L, t->node, sizenode(t), Node); - luaM_freearray(L, t->array, t->sizearray, TValue); - luaM_free(L, t); -} - - -static Node *getfreepos (Table *t) { - while (t->lastfree-- > t->node) { - if (ttisnil(gkey(t->lastfree))) - return t->lastfree; - } - return NULL; /* could not find a free place */ -} - - - -/* -** inserts a new key into a hash table; first, check whether key's main -** position is free. If not, check whether colliding node is in its main -** position or not: if it is not, move colliding node to an empty place and -** put new key in its main position; otherwise (colliding node is in its main -** position), new key goes to an empty position. -*/ -static TValue *newkey (lua_State *L, Table *t, const TValue *key) { - Node *mp = mainposition(t, key); - if (!ttisnil(gval(mp)) || mp == dummynode) { - Node *othern; - Node *n = getfreepos(t); /* get a free place */ - if (n == NULL) { /* cannot find a free place? */ - rehash(L, t, key); /* grow table */ - return luaH_set(L, t, key); /* re-insert key into grown table */ - } - lua_assert(n != dummynode); - othern = mainposition(t, key2tval(mp)); - if (othern != mp) { /* is colliding node out of its main position? */ - /* yes; move colliding node into free position */ - while (gnext(othern) != mp) othern = gnext(othern); /* find previous */ - gnext(othern) = n; /* redo the chain with `n' in place of `mp' */ - *n = *mp; /* copy colliding node into free pos. (mp->next also goes) */ - gnext(mp) = NULL; /* now `mp' is free */ - setnilvalue(gval(mp)); - } - else { /* colliding node is in its own main position */ - /* new node will go into free position */ - gnext(n) = gnext(mp); /* chain new position */ - gnext(mp) = n; - mp = n; - } - } - gkey(mp)->value = key->value; gkey(mp)->tt = key->tt; - luaC_barriert(L, t, key); - lua_assert(ttisnil(gval(mp))); - return gval(mp); -} - - -/* -** search function for integers -*/ -const TValue *luaH_getnum (Table *t, int key) { - /* (1 <= key && key <= t->sizearray) */ - if (cast(unsigned int, key-1) < cast(unsigned int, t->sizearray)) - return &t->array[key-1]; - else { - lua_Number nk = cast_num(key); - Node *n = hashnum(t, nk); - do { /* check whether `key' is somewhere in the chain */ - if (ttisnumber(gkey(n)) && luai_numeq(nvalue(gkey(n)), nk)) - return gval(n); /* that's it */ - else n = gnext(n); - } while (n); - return luaO_nilobject; - } -} - - -/* -** search function for strings -*/ -const TValue *luaH_getstr (Table *t, TString *key) { - Node *n = hashstr(t, key); - do { /* check whether `key' is somewhere in the chain */ - if (ttisstring(gkey(n)) && rawtsvalue(gkey(n)) == key) - return gval(n); /* that's it */ - else n = gnext(n); - } while (n); - return luaO_nilobject; -} - - -/* -** main search function -*/ -const TValue *luaH_get (Table *t, const TValue *key) { - switch (ttype(key)) { - case LUA_TNIL: return luaO_nilobject; - case LUA_TSTRING: return luaH_getstr(t, rawtsvalue(key)); - case LUA_TNUMBER: { - int k; - lua_Number n = nvalue(key); - lua_number2int(k, n); - if (luai_numeq(cast_num(k), nvalue(key))) /* index is int? */ - return luaH_getnum(t, k); /* use specialized version */ - /* else go through */ - } - default: { - Node *n = mainposition(t, key); - do { /* check whether `key' is somewhere in the chain */ - if (luaO_rawequalObj(key2tval(n), key)) - return gval(n); /* that's it */ - else n = gnext(n); - } while (n); - return luaO_nilobject; - } - } -} - - -TValue *luaH_set (lua_State *L, Table *t, const TValue *key) { - const TValue *p = luaH_get(t, key); - t->flags = 0; - if (p != luaO_nilobject) - return cast(TValue *, p); - else { - if (ttisnil(key)) luaG_runerror(L, "table index is nil"); - else if (ttisnumber(key) && luai_numisnan(nvalue(key))) - luaG_runerror(L, "table index is NaN"); - return newkey(L, t, key); - } -} - - -TValue *luaH_setnum (lua_State *L, Table *t, int key) { - const TValue *p = luaH_getnum(t, key); - if (p != luaO_nilobject) - return cast(TValue *, p); - else { - TValue k; - setnvalue(&k, cast_num(key)); - return newkey(L, t, &k); - } -} - - -TValue *luaH_setstr (lua_State *L, Table *t, TString *key) { - const TValue *p = luaH_getstr(t, key); - if (p != luaO_nilobject) - return cast(TValue *, p); - else { - TValue k; - setsvalue(L, &k, key); - return newkey(L, t, &k); - } -} - - -static int unbound_search (Table *t, unsigned int j) { - unsigned int i = j; /* i is zero or a present index */ - j++; - /* find `i' and `j' such that i is present and j is not */ - while (!ttisnil(luaH_getnum(t, j))) { - i = j; - j *= 2; - if (j > cast(unsigned int, MAX_INT)) { /* overflow? */ - /* table was built with bad purposes: resort to linear search */ - i = 1; - while (!ttisnil(luaH_getnum(t, i))) i++; - return i - 1; - } - } - /* now do a binary search between them */ - while (j - i > 1) { - unsigned int m = (i+j)/2; - if (ttisnil(luaH_getnum(t, m))) j = m; - else i = m; - } - return i; -} - - -/* -** Try to find a boundary in table `t'. A `boundary' is an integer index -** such that t[i] is non-nil and t[i+1] is nil (and 0 if t[1] is nil). -*/ -int luaH_getn (Table *t) { - unsigned int j = t->sizearray; - if (j > 0 && ttisnil(&t->array[j - 1])) { - /* there is a boundary in the array part: (binary) search for it */ - unsigned int i = 0; - while (j - i > 1) { - unsigned int m = (i+j)/2; - if (ttisnil(&t->array[m - 1])) j = m; - else i = m; - } - return i; - } - /* else must find a boundary in hash part */ - else if (t->node == dummynode) /* hash part is empty? */ - return j; /* that is easy... */ - else return unbound_search(t, j); -} - - - -#if defined(LUA_DEBUG) - -Node *luaH_mainposition (const Table *t, const TValue *key) { - return mainposition(t, key); -} - -int luaH_isdummy (Node *n) { return n == dummynode; } - -#endif diff --git a/uppdev/lua/src/ltable.h b/uppdev/lua/src/ltable.h deleted file mode 100644 index bb898409b..000000000 --- a/uppdev/lua/src/ltable.h +++ /dev/null @@ -1,40 +0,0 @@ -/* -** $Id: ltable.h,v 2.10 2006/01/10 13:13:06 roberto Exp $ -** Lua tables (hash) -** See Copyright Notice in lua.h -*/ - -#ifndef ltable_h -#define ltable_h - -#include "lobject.h" - - -#define gnode(t,i) (&(t)->node[i]) -#define gkey(n) (&(n)->i_key.nk) -#define gval(n) (&(n)->i_val) -#define gnext(n) ((n)->i_key.nk.next) - -#define key2tval(n) (&(n)->i_key.tvk) - - -LUAI_FUNC const TValue *luaH_getnum (Table *t, int key); -LUAI_FUNC TValue *luaH_setnum (lua_State *L, Table *t, int key); -LUAI_FUNC const TValue *luaH_getstr (Table *t, TString *key); -LUAI_FUNC TValue *luaH_setstr (lua_State *L, Table *t, TString *key); -LUAI_FUNC const TValue *luaH_get (Table *t, const TValue *key); -LUAI_FUNC TValue *luaH_set (lua_State *L, Table *t, const TValue *key); -LUAI_FUNC Table *luaH_new (lua_State *L, int narray, int lnhash); -LUAI_FUNC void luaH_resizearray (lua_State *L, Table *t, int nasize); -LUAI_FUNC void luaH_free (lua_State *L, Table *t); -LUAI_FUNC int luaH_next (lua_State *L, Table *t, StkId key); -LUAI_FUNC int luaH_getn (Table *t); - - -#if defined(LUA_DEBUG) -LUAI_FUNC Node *luaH_mainposition (const Table *t, const TValue *key); -LUAI_FUNC int luaH_isdummy (Node *n); -#endif - - -#endif diff --git a/uppdev/lua/src/ltablib.c b/uppdev/lua/src/ltablib.c deleted file mode 100644 index a157ad669..000000000 --- a/uppdev/lua/src/ltablib.c +++ /dev/null @@ -1,277 +0,0 @@ -/* -** $Id: ltablib.c,v 1.38 2005/10/23 17:38:15 roberto Exp $ -** Library for Table Manipulation -** See Copyright Notice in lua.h -*/ - - -#include - -#define ltablib_c -#define LUA_LIB - -#include "lua.h" - -#include "lauxlib.h" -#include "lualib.h" - - -#define aux_getn(L,n) (luaL_checktype(L, n, LUA_TTABLE), luaL_getn(L, n)) - - -static int foreachi (lua_State *L) { - int i; - int n = aux_getn(L, 1); - luaL_checktype(L, 2, LUA_TFUNCTION); - for (i=1; i <= n; i++) { - lua_pushvalue(L, 2); /* function */ - lua_pushinteger(L, i); /* 1st argument */ - lua_rawgeti(L, 1, i); /* 2nd argument */ - lua_call(L, 2, 1); - if (!lua_isnil(L, -1)) - return 1; - lua_pop(L, 1); /* remove nil result */ - } - return 0; -} - - -static int foreach (lua_State *L) { - luaL_checktype(L, 1, LUA_TTABLE); - luaL_checktype(L, 2, LUA_TFUNCTION); - lua_pushnil(L); /* first key */ - while (lua_next(L, 1)) { - lua_pushvalue(L, 2); /* function */ - lua_pushvalue(L, -3); /* key */ - lua_pushvalue(L, -3); /* value */ - lua_call(L, 2, 1); - if (!lua_isnil(L, -1)) - return 1; - lua_pop(L, 2); /* remove value and result */ - } - return 0; -} - - -static int maxn (lua_State *L) { - lua_Number max = 0; - luaL_checktype(L, 1, LUA_TTABLE); - lua_pushnil(L); /* first key */ - while (lua_next(L, 1)) { - lua_pop(L, 1); /* remove value */ - if (lua_type(L, -1) == LUA_TNUMBER) { - lua_Number v = lua_tonumber(L, -1); - if (v > max) max = v; - } - } - lua_pushnumber(L, max); - return 1; -} - - -static int getn (lua_State *L) { - lua_pushinteger(L, aux_getn(L, 1)); - return 1; -} - - -static int setn (lua_State *L) { - luaL_checktype(L, 1, LUA_TTABLE); -#ifndef luaL_setn - luaL_setn(L, 1, luaL_checkint(L, 2)); -#else - luaL_error(L, LUA_QL("setn") " is obsolete"); -#endif - lua_pushvalue(L, 1); - return 1; -} - - -static int tinsert (lua_State *L) { - int e = aux_getn(L, 1) + 1; /* first empty element */ - int pos; /* where to insert new element */ - switch (lua_gettop(L)) { - case 2: { /* called with only 2 arguments */ - pos = e; /* insert new element at the end */ - break; - } - case 3: { - int i; - pos = luaL_checkint(L, 2); /* 2nd argument is the position */ - if (pos > e) e = pos; /* `grow' array if necessary */ - for (i = e; i > pos; i--) { /* move up elements */ - lua_rawgeti(L, 1, i-1); - lua_rawseti(L, 1, i); /* t[i] = t[i-1] */ - } - break; - } - default: { - return luaL_error(L, "wrong number of arguments to " LUA_QL("insert")); - } - } - luaL_setn(L, 1, e); /* new size */ - lua_rawseti(L, 1, pos); /* t[pos] = v */ - return 0; -} - - -static int tremove (lua_State *L) { - int e = aux_getn(L, 1); - int pos = luaL_optint(L, 2, e); - if (e == 0) return 0; /* table is `empty' */ - luaL_setn(L, 1, e - 1); /* t.n = n-1 */ - lua_rawgeti(L, 1, pos); /* result = t[pos] */ - for ( ;pos= P */ - while (lua_rawgeti(L, 1, ++i), sort_comp(L, -1, -2)) { - if (i>u) luaL_error(L, "invalid order function for sorting"); - lua_pop(L, 1); /* remove a[i] */ - } - /* repeat --j until a[j] <= P */ - while (lua_rawgeti(L, 1, --j), sort_comp(L, -3, -1)) { - if (j - -#define ltm_c -#define LUA_CORE - -#include "lua.h" - -#include "lobject.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "ltm.h" - - - -const char *const luaT_typenames[] = { - "nil", "boolean", "userdata", "number", - "string", "table", "function", "userdata", "thread", - "proto", "upval" -}; - - -void luaT_init (lua_State *L) { - static const char *const luaT_eventname[] = { /* ORDER TM */ - "__index", "__newindex", - "__gc", "__mode", "__eq", - "__add", "__sub", "__mul", "__div", "__mod", - "__pow", "__unm", "__len", "__lt", "__le", - "__concat", "__call" - }; - int i; - for (i=0; itmname[i] = luaS_new(L, luaT_eventname[i]); - luaS_fix(G(L)->tmname[i]); /* never collect these names */ - } -} - - -/* -** function to be used with macro "fasttm": optimized for absence of -** tag methods -*/ -const TValue *luaT_gettm (Table *events, TMS event, TString *ename) { - const TValue *tm = luaH_getstr(events, ename); - lua_assert(event <= TM_EQ); - if (ttisnil(tm)) { /* no tag method? */ - events->flags |= cast_byte(1u<metatable; - break; - case LUA_TUSERDATA: - mt = uvalue(o)->metatable; - break; - default: - mt = G(L)->mt[ttype(o)]; - } - return (mt ? luaH_getstr(mt, G(L)->tmname[event]) : luaO_nilobject); -} diff --git a/uppdev/lua/src/ltm.h b/uppdev/lua/src/ltm.h deleted file mode 100644 index 85aed7906..000000000 --- a/uppdev/lua/src/ltm.h +++ /dev/null @@ -1,54 +0,0 @@ -/* -** $Id: ltm.h,v 2.6 2005/06/06 13:30:25 roberto Exp $ -** Tag methods -** See Copyright Notice in lua.h -*/ - -#ifndef ltm_h -#define ltm_h - - -#include "lobject.h" - - -/* -* WARNING: if you change the order of this enumeration, -* grep "ORDER TM" -*/ -typedef enum { - TM_INDEX, - TM_NEWINDEX, - TM_GC, - TM_MODE, - TM_EQ, /* last tag method with `fast' access */ - TM_ADD, - TM_SUB, - TM_MUL, - TM_DIV, - TM_MOD, - TM_POW, - TM_UNM, - TM_LEN, - TM_LT, - TM_LE, - TM_CONCAT, - TM_CALL, - TM_N /* number of elements in the enum */ -} TMS; - - - -#define gfasttm(g,et,e) ((et) == NULL ? NULL : \ - ((et)->flags & (1u<<(e))) ? NULL : luaT_gettm(et, e, (g)->tmname[e])) - -#define fasttm(l,et,e) gfasttm(G(l), et, e) - -LUAI_DATA const char *const luaT_typenames[]; - - -LUAI_FUNC const TValue *luaT_gettm (Table *events, TMS event, TString *ename); -LUAI_FUNC const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, - TMS event); -LUAI_FUNC void luaT_init (lua_State *L); - -#endif diff --git a/uppdev/lua/src/lua.c b/uppdev/lua/src/lua.c deleted file mode 100644 index cd5d8a311..000000000 --- a/uppdev/lua/src/lua.c +++ /dev/null @@ -1,389 +0,0 @@ -/* -** $Id: lua.c,v 1.160 2006/06/02 15:34:00 roberto Exp $ -** Lua stand-alone interpreter -** See Copyright Notice in lua.h -*/ - - -#include -#include -#include -#include - -#define lua_c - -#include "lua.h" - -#include "lauxlib.h" -#include "lualib.h" - - - -static lua_State *globalL = NULL; - -static const char *progname = LUA_PROGNAME; - - - -static void lstop (lua_State *L, lua_Debug *ar) { - (void)ar; /* unused arg. */ - lua_sethook(L, NULL, 0, 0); - luaL_error(L, "interrupted!"); -} - - -static void laction (int i) { - signal(i, SIG_DFL); /* if another SIGINT happens before lstop, - terminate process (default action) */ - lua_sethook(globalL, lstop, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT, 1); -} - - -static void print_usage (void) { - fprintf(stderr, - "usage: %s [options] [script [args]].\n" - "Available options are:\n" - " -e stat execute string " LUA_QL("stat") "\n" - " -l name require library " LUA_QL("name") "\n" - " -i enter interactive mode after executing " LUA_QL("script") "\n" - " -v show version information\n" - " -- stop handling options\n" - " - execute stdin and stop handling options\n" - , - progname); - fflush(stderr); -} - - -static void l_message (const char *pname, const char *msg) { - if (pname) fprintf(stderr, "%s: ", pname); - fprintf(stderr, "%s\n", msg); - fflush(stderr); -} - - -static int report (lua_State *L, int status) { - if (status && !lua_isnil(L, -1)) { - const char *msg = lua_tostring(L, -1); - if (msg == NULL) msg = "(error object is not a string)"; - l_message(progname, msg); - lua_pop(L, 1); - } - return status; -} - - -static int traceback (lua_State *L) { - lua_getfield(L, LUA_GLOBALSINDEX, "debug"); - if (!lua_istable(L, -1)) { - lua_pop(L, 1); - return 1; - } - lua_getfield(L, -1, "traceback"); - if (!lua_isfunction(L, -1)) { - lua_pop(L, 2); - return 1; - } - lua_pushvalue(L, 1); /* pass error message */ - lua_pushinteger(L, 2); /* skip this function and traceback */ - lua_call(L, 2, 1); /* call debug.traceback */ - return 1; -} - - -static int docall (lua_State *L, int narg, int clear) { - int status; - int base = lua_gettop(L) - narg; /* function index */ - lua_pushcfunction(L, traceback); /* push traceback function */ - lua_insert(L, base); /* put it under chunk and args */ - signal(SIGINT, laction); - status = lua_pcall(L, narg, (clear ? 0 : LUA_MULTRET), base); - signal(SIGINT, SIG_DFL); - lua_remove(L, base); /* remove traceback function */ - /* force a complete garbage collection in case of errors */ - if (status != 0) lua_gc(L, LUA_GCCOLLECT, 0); - return status; -} - - -static void print_version (void) { - l_message(NULL, LUA_RELEASE " " LUA_COPYRIGHT); -} - - -static int getargs (lua_State *L, char **argv, int n) { - int narg; - int i; - int argc = 0; - while (argv[argc]) argc++; /* count total number of arguments */ - narg = argc - (n + 1); /* number of arguments to the script */ - luaL_checkstack(L, narg + 3, "too many arguments to script"); - for (i=n+1; i < argc; i++) - lua_pushstring(L, argv[i]); - lua_createtable(L, narg, n + 1); - for (i=0; i < argc; i++) { - lua_pushstring(L, argv[i]); - lua_rawseti(L, -2, i - n); - } - return narg; -} - - -static int dofile (lua_State *L, const char *name) { - int status = luaL_loadfile(L, name) || docall(L, 0, 1); - return report(L, status); -} - - -static int dostring (lua_State *L, const char *s, const char *name) { - int status = luaL_loadbuffer(L, s, strlen(s), name) || docall(L, 0, 1); - return report(L, status); -} - - -static int dolibrary (lua_State *L, const char *name) { - lua_getglobal(L, "require"); - lua_pushstring(L, name); - return report(L, lua_pcall(L, 1, 0, 0)); -} - - -static const char *get_prompt (lua_State *L, int firstline) { - const char *p; - lua_getfield(L, LUA_GLOBALSINDEX, firstline ? "_PROMPT" : "_PROMPT2"); - p = lua_tostring(L, -1); - if (p == NULL) p = (firstline ? LUA_PROMPT : LUA_PROMPT2); - lua_pop(L, 1); /* remove global */ - return p; -} - - -static int incomplete (lua_State *L, int status) { - if (status == LUA_ERRSYNTAX) { - size_t lmsg; - const char *msg = lua_tolstring(L, -1, &lmsg); - const char *tp = msg + lmsg - (sizeof(LUA_QL("")) - 1); - if (strstr(msg, LUA_QL("")) == tp) { - lua_pop(L, 1); - return 1; - } - } - return 0; /* else... */ -} - - -static int pushline (lua_State *L, int firstline) { - char buffer[LUA_MAXINPUT]; - char *b = buffer; - size_t l; - const char *prmt = get_prompt(L, firstline); - if (lua_readline(L, b, prmt) == 0) - return 0; /* no input */ - l = strlen(b); - if (l > 0 && b[l-1] == '\n') /* line ends with newline? */ - b[l-1] = '\0'; /* remove it */ - if (firstline && b[0] == '=') /* first line starts with `=' ? */ - lua_pushfstring(L, "return %s", b+1); /* change it to `return' */ - else - lua_pushstring(L, b); - lua_freeline(L, b); - return 1; -} - - -static int loadline (lua_State *L) { - int status; - lua_settop(L, 0); - if (!pushline(L, 1)) - return -1; /* no input */ - for (;;) { /* repeat until gets a complete line */ - status = luaL_loadbuffer(L, lua_tostring(L, 1), lua_strlen(L, 1), "=stdin"); - if (!incomplete(L, status)) break; /* cannot try to add lines? */ - if (!pushline(L, 0)) /* no more input? */ - return -1; - lua_pushliteral(L, "\n"); /* add a new line... */ - lua_insert(L, -2); /* ...between the two lines */ - lua_concat(L, 3); /* join them */ - } - lua_saveline(L, 1); - lua_remove(L, 1); /* remove line */ - return status; -} - - -static void dotty (lua_State *L) { - int status; - const char *oldprogname = progname; - progname = NULL; - while ((status = loadline(L)) != -1) { - if (status == 0) status = docall(L, 0, 0); - report(L, status); - if (status == 0 && lua_gettop(L) > 0) { /* any result to print? */ - lua_getglobal(L, "print"); - lua_insert(L, 1); - if (lua_pcall(L, lua_gettop(L)-1, 0, 0) != 0) - l_message(progname, lua_pushfstring(L, - "error calling " LUA_QL("print") " (%s)", - lua_tostring(L, -1))); - } - } - lua_settop(L, 0); /* clear stack */ - fputs("\n", stdout); - fflush(stdout); - progname = oldprogname; -} - - -static int handle_script (lua_State *L, char **argv, int n) { - int status; - const char *fname; - int narg = getargs(L, argv, n); /* collect arguments */ - lua_setglobal(L, "arg"); - fname = argv[n]; - if (strcmp(fname, "-") == 0 && strcmp(argv[n-1], "--") != 0) - fname = NULL; /* stdin */ - status = luaL_loadfile(L, fname); - lua_insert(L, -(narg+1)); - if (status == 0) - status = docall(L, narg, 0); - else - lua_pop(L, narg); - return report(L, status); -} - - -/* check that argument has no extra characters at the end */ -#define notail(x) {if ((x)[2] != '\0') return -1;} - - -static int collectargs (char **argv, int *pi, int *pv, int *pe) { - int i; - for (i = 1; argv[i] != NULL; i++) { - if (argv[i][0] != '-') /* not an option? */ - return i; - switch (argv[i][1]) { /* option */ - case '-': - notail(argv[i]); - return (argv[i+1] != NULL ? i+1 : 0); - case '\0': - return i; - case 'i': - notail(argv[i]); - *pi = 1; /* go through */ - case 'v': - notail(argv[i]); - *pv = 1; - break; - case 'e': - *pe = 1; /* go through */ - case 'l': - if (argv[i][2] == '\0') { - i++; - if (argv[i] == NULL) return -1; - } - break; - default: return -1; /* invalid option */ - } - } - return 0; -} - - -static int runargs (lua_State *L, char **argv, int n) { - int i; - for (i = 1; i < n; i++) { - if (argv[i] == NULL) continue; - lua_assert(argv[i][0] == '-'); - switch (argv[i][1]) { /* option */ - case 'e': { - const char *chunk = argv[i] + 2; - if (*chunk == '\0') chunk = argv[++i]; - lua_assert(chunk != NULL); - if (dostring(L, chunk, "=(command line)") != 0) - return 1; - break; - } - case 'l': { - const char *filename = argv[i] + 2; - if (*filename == '\0') filename = argv[++i]; - lua_assert(filename != NULL); - if (dolibrary(L, filename)) - return 1; /* stop if file fails */ - break; - } - default: break; - } - } - return 0; -} - - -static int handle_luainit (lua_State *L) { - const char *init = getenv(LUA_INIT); - if (init == NULL) return 0; /* status OK */ - else if (init[0] == '@') - return dofile(L, init+1); - else - return dostring(L, init, "=" LUA_INIT); -} - - -struct Smain { - int argc; - char **argv; - int status; -}; - - -static int pmain (lua_State *L) { - struct Smain *s = (struct Smain *)lua_touserdata(L, 1); - char **argv = s->argv; - int script; - int has_i = 0, has_v = 0, has_e = 0; - globalL = L; - if (argv[0] && argv[0][0]) progname = argv[0]; - lua_gc(L, LUA_GCSTOP, 0); /* stop collector during initialization */ - luaL_openlibs(L); /* open libraries */ - lua_gc(L, LUA_GCRESTART, 0); - s->status = handle_luainit(L); - if (s->status != 0) return 0; - script = collectargs(argv, &has_i, &has_v, &has_e); - if (script < 0) { /* invalid args? */ - print_usage(); - s->status = 1; - return 0; - } - if (has_v) print_version(); - s->status = runargs(L, argv, (script > 0) ? script : s->argc); - if (s->status != 0) return 0; - if (script) - s->status = handle_script(L, argv, script); - if (s->status != 0) return 0; - if (has_i) - dotty(L); - else if (script == 0 && !has_e && !has_v) { - if (lua_stdin_is_tty()) { - print_version(); - dotty(L); - } - else dofile(L, NULL); /* executes stdin as a file */ - } - return 0; -} - - -int main (int argc, char **argv) { - int status; - struct Smain s; - lua_State *L = lua_open(); /* create state */ - if (L == NULL) { - l_message(argv[0], "cannot create state: not enough memory"); - return EXIT_FAILURE; - } - s.argc = argc; - s.argv = argv; - status = lua_cpcall(L, &pmain, &s); - report(L, status); - lua_close(L); - return (status || s.status) ? EXIT_FAILURE : EXIT_SUCCESS; -} diff --git a/uppdev/lua/src/lua.h b/uppdev/lua/src/lua.h deleted file mode 100644 index 1b9531170..000000000 --- a/uppdev/lua/src/lua.h +++ /dev/null @@ -1,385 +0,0 @@ -/* -** $Id: lua.h,v 1.218 2006/06/02 15:34:00 roberto Exp $ -** Lua - An Extensible Extension Language -** Lua.org, PUC-Rio, Brazil (http://www.lua.org) -** See Copyright Notice at the end of this file -*/ - - -#ifndef lua_h -#define lua_h - -#include -#include - - -#include "luaconf.h" - - -#define LUA_VERSION "Lua 5.1" -#define LUA_RELEASE "Lua 5.1.1" -#define LUA_VERSION_NUM 501 -#define LUA_COPYRIGHT "Copyright (C) 1994-2006 Lua.org, PUC-Rio" -#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo & W. Celes" - - -/* mark for precompiled code (`Lua') */ -#define LUA_SIGNATURE "\033Lua" - -/* option for multiple returns in `lua_pcall' and `lua_call' */ -#define LUA_MULTRET (-1) - - -/* -** pseudo-indices -*/ -#define LUA_REGISTRYINDEX (-10000) -#define LUA_ENVIRONINDEX (-10001) -#define LUA_GLOBALSINDEX (-10002) -#define lua_upvalueindex(i) (LUA_GLOBALSINDEX-(i)) - - -/* thread status; 0 is OK */ -#define LUA_YIELD 1 -#define LUA_ERRRUN 2 -#define LUA_ERRSYNTAX 3 -#define LUA_ERRMEM 4 -#define LUA_ERRERR 5 - - -typedef struct lua_State lua_State; - -typedef int (*lua_CFunction) (lua_State *L); - - -/* -** functions that read/write blocks when loading/dumping Lua chunks -*/ -typedef const char * (*lua_Reader) (lua_State *L, void *ud, size_t *sz); - -typedef int (*lua_Writer) (lua_State *L, const void* p, size_t sz, void* ud); - - -/* -** prototype for memory-allocation functions -*/ -typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize); - - -/* -** basic types -*/ -#define LUA_TNONE (-1) - -#define LUA_TNIL 0 -#define LUA_TBOOLEAN 1 -#define LUA_TLIGHTUSERDATA 2 -#define LUA_TNUMBER 3 -#define LUA_TSTRING 4 -#define LUA_TTABLE 5 -#define LUA_TFUNCTION 6 -#define LUA_TUSERDATA 7 -#define LUA_TTHREAD 8 - - - -/* minimum Lua stack available to a C function */ -#define LUA_MINSTACK 20 - - -/* -** generic extra include file -*/ -#if defined(LUA_USER_H) -#include LUA_USER_H -#endif - - -/* type of numbers in Lua */ -typedef LUA_NUMBER lua_Number; - - -/* type for integer functions */ -typedef LUA_INTEGER lua_Integer; - - - -/* -** state manipulation -*/ -LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud); -LUA_API void (lua_close) (lua_State *L); -LUA_API lua_State *(lua_newthread) (lua_State *L); - -LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf); - - -/* -** basic stack manipulation -*/ -LUA_API int (lua_gettop) (lua_State *L); -LUA_API void (lua_settop) (lua_State *L, int idx); -LUA_API void (lua_pushvalue) (lua_State *L, int idx); -LUA_API void (lua_remove) (lua_State *L, int idx); -LUA_API void (lua_insert) (lua_State *L, int idx); -LUA_API void (lua_replace) (lua_State *L, int idx); -LUA_API int (lua_checkstack) (lua_State *L, int sz); - -LUA_API void (lua_xmove) (lua_State *from, lua_State *to, int n); - - -/* -** access functions (stack -> C) -*/ - -LUA_API int (lua_isnumber) (lua_State *L, int idx); -LUA_API int (lua_isstring) (lua_State *L, int idx); -LUA_API int (lua_iscfunction) (lua_State *L, int idx); -LUA_API int (lua_isuserdata) (lua_State *L, int idx); -LUA_API int (lua_type) (lua_State *L, int idx); -LUA_API const char *(lua_typename) (lua_State *L, int tp); - -LUA_API int (lua_equal) (lua_State *L, int idx1, int idx2); -LUA_API int (lua_rawequal) (lua_State *L, int idx1, int idx2); -LUA_API int (lua_lessthan) (lua_State *L, int idx1, int idx2); - -LUA_API lua_Number (lua_tonumber) (lua_State *L, int idx); -LUA_API lua_Integer (lua_tointeger) (lua_State *L, int idx); -LUA_API int (lua_toboolean) (lua_State *L, int idx); -LUA_API const char *(lua_tolstring) (lua_State *L, int idx, size_t *len); -LUA_API size_t (lua_objlen) (lua_State *L, int idx); -LUA_API lua_CFunction (lua_tocfunction) (lua_State *L, int idx); -LUA_API void *(lua_touserdata) (lua_State *L, int idx); -LUA_API lua_State *(lua_tothread) (lua_State *L, int idx); -LUA_API const void *(lua_topointer) (lua_State *L, int idx); - - -/* -** push functions (C -> stack) -*/ -LUA_API void (lua_pushnil) (lua_State *L); -LUA_API void (lua_pushnumber) (lua_State *L, lua_Number n); -LUA_API void (lua_pushinteger) (lua_State *L, lua_Integer n); -LUA_API void (lua_pushlstring) (lua_State *L, const char *s, size_t l); -LUA_API void (lua_pushstring) (lua_State *L, const char *s); -LUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt, - va_list argp); -LUA_API const char *(lua_pushfstring) (lua_State *L, const char *fmt, ...); -LUA_API void (lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n); -LUA_API void (lua_pushboolean) (lua_State *L, int b); -LUA_API void (lua_pushlightuserdata) (lua_State *L, void *p); -LUA_API int (lua_pushthread) (lua_State *L); - - -/* -** get functions (Lua -> stack) -*/ -LUA_API void (lua_gettable) (lua_State *L, int idx); -LUA_API void (lua_getfield) (lua_State *L, int idx, const char *k); -LUA_API void (lua_rawget) (lua_State *L, int idx); -LUA_API void (lua_rawgeti) (lua_State *L, int idx, int n); -LUA_API void (lua_createtable) (lua_State *L, int narr, int nrec); -LUA_API void *(lua_newuserdata) (lua_State *L, size_t sz); -LUA_API int (lua_getmetatable) (lua_State *L, int objindex); -LUA_API void (lua_getfenv) (lua_State *L, int idx); - - -/* -** set functions (stack -> Lua) -*/ -LUA_API void (lua_settable) (lua_State *L, int idx); -LUA_API void (lua_setfield) (lua_State *L, int idx, const char *k); -LUA_API void (lua_rawset) (lua_State *L, int idx); -LUA_API void (lua_rawseti) (lua_State *L, int idx, int n); -LUA_API int (lua_setmetatable) (lua_State *L, int objindex); -LUA_API int (lua_setfenv) (lua_State *L, int idx); - - -/* -** `load' and `call' functions (load and run Lua code) -*/ -LUA_API void (lua_call) (lua_State *L, int nargs, int nresults); -LUA_API int (lua_pcall) (lua_State *L, int nargs, int nresults, int errfunc); -LUA_API int (lua_cpcall) (lua_State *L, lua_CFunction func, void *ud); -LUA_API int (lua_load) (lua_State *L, lua_Reader reader, void *dt, - const char *chunkname); - -LUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data); - - -/* -** coroutine functions -*/ -LUA_API int (lua_yield) (lua_State *L, int nresults); -LUA_API int (lua_resume) (lua_State *L, int narg); -LUA_API int (lua_status) (lua_State *L); - -/* -** garbage-collection function and options -*/ - -#define LUA_GCSTOP 0 -#define LUA_GCRESTART 1 -#define LUA_GCCOLLECT 2 -#define LUA_GCCOUNT 3 -#define LUA_GCCOUNTB 4 -#define LUA_GCSTEP 5 -#define LUA_GCSETPAUSE 6 -#define LUA_GCSETSTEPMUL 7 - -LUA_API int (lua_gc) (lua_State *L, int what, int data); - - -/* -** miscellaneous functions -*/ - -LUA_API int (lua_error) (lua_State *L); - -LUA_API int (lua_next) (lua_State *L, int idx); - -LUA_API void (lua_concat) (lua_State *L, int n); - -LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud); -LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud); - - - -/* -** =============================================================== -** some useful macros -** =============================================================== -*/ - -#define lua_pop(L,n) lua_settop(L, -(n)-1) - -#define lua_newtable(L) lua_createtable(L, 0, 0) - -#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n))) - -#define lua_pushcfunction(L,f) lua_pushcclosure(L, (f), 0) - -#define lua_strlen(L,i) lua_objlen(L, (i)) - -#define lua_isfunction(L,n) (lua_type(L, (n)) == LUA_TFUNCTION) -#define lua_istable(L,n) (lua_type(L, (n)) == LUA_TTABLE) -#define lua_islightuserdata(L,n) (lua_type(L, (n)) == LUA_TLIGHTUSERDATA) -#define lua_isnil(L,n) (lua_type(L, (n)) == LUA_TNIL) -#define lua_isboolean(L,n) (lua_type(L, (n)) == LUA_TBOOLEAN) -#define lua_isthread(L,n) (lua_type(L, (n)) == LUA_TTHREAD) -#define lua_isnone(L,n) (lua_type(L, (n)) == LUA_TNONE) -#define lua_isnoneornil(L, n) (lua_type(L, (n)) <= 0) - -#define lua_pushliteral(L, s) \ - lua_pushlstring(L, "" s, (sizeof(s)/sizeof(char))-1) - -#define lua_setglobal(L,s) lua_setfield(L, LUA_GLOBALSINDEX, (s)) -#define lua_getglobal(L,s) lua_getfield(L, LUA_GLOBALSINDEX, (s)) - -#define lua_tostring(L,i) lua_tolstring(L, (i), NULL) - - - -/* -** compatibility macros and functions -*/ - -#define lua_open() luaL_newstate() - -#define lua_getregistry(L) lua_pushvalue(L, LUA_REGISTRYINDEX) - -#define lua_getgccount(L) lua_gc(L, LUA_GCCOUNT, 0) - -#define lua_Chunkreader lua_Reader -#define lua_Chunkwriter lua_Writer - - - -/* -** {====================================================================== -** Debug API -** ======================================================================= -*/ - - -/* -** Event codes -*/ -#define LUA_HOOKCALL 0 -#define LUA_HOOKRET 1 -#define LUA_HOOKLINE 2 -#define LUA_HOOKCOUNT 3 -#define LUA_HOOKTAILRET 4 - - -/* -** Event masks -*/ -#define LUA_MASKCALL (1 << LUA_HOOKCALL) -#define LUA_MASKRET (1 << LUA_HOOKRET) -#define LUA_MASKLINE (1 << LUA_HOOKLINE) -#define LUA_MASKCOUNT (1 << LUA_HOOKCOUNT) - -typedef struct lua_Debug lua_Debug; /* activation record */ - - -/* Functions to be called by the debuger in specific events */ -typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar); - - -LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar); -LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar); -LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n); -LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n); -LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n); -LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n); - -LUA_API int lua_sethook (lua_State *L, lua_Hook func, int mask, int count); -LUA_API lua_Hook lua_gethook (lua_State *L); -LUA_API int lua_gethookmask (lua_State *L); -LUA_API int lua_gethookcount (lua_State *L); - - -struct lua_Debug { - int event; - const char *name; /* (n) */ - const char *namewhat; /* (n) `global', `local', `field', `method' */ - const char *what; /* (S) `Lua', `C', `main', `tail' */ - const char *source; /* (S) */ - int currentline; /* (l) */ - int nups; /* (u) number of upvalues */ - int linedefined; /* (S) */ - int lastlinedefined; /* (S) */ - char short_src[LUA_IDSIZE]; /* (S) */ - /* private part */ - int i_ci; /* active function */ -}; - -/* }====================================================================== */ - - -/****************************************************************************** -* Copyright (C) 1994-2006 Lua.org, PUC-Rio. All rights reserved. -* -* Permission is hereby granted, free of charge, to any person obtaining -* a copy of this software and associated documentation files (the -* "Software"), to deal in the Software without restriction, including -* without limitation the rights to use, copy, modify, merge, publish, -* distribute, sublicense, and/or sell copies of the Software, and to -* permit persons to whom the Software is furnished to do so, subject to -* the following conditions: -* -* The above copyright notice and this permission notice shall be -* included in all copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -******************************************************************************/ - - -#endif diff --git a/uppdev/lua/src/luac.c b/uppdev/lua/src/luac.c deleted file mode 100644 index 4601b329c..000000000 --- a/uppdev/lua/src/luac.c +++ /dev/null @@ -1,200 +0,0 @@ -/* -** $Id: luac.c,v 1.54 2006/06/02 17:37:11 lhf Exp $ -** Lua compiler (saves bytecodes to files; also list bytecodes) -** See Copyright Notice in lua.h -*/ - -#include -#include -#include -#include - -#define luac_c -#define LUA_CORE - -#include "lua.h" -#include "lauxlib.h" - -#include "ldo.h" -#include "lfunc.h" -#include "lmem.h" -#include "lobject.h" -#include "lopcodes.h" -#include "lstring.h" -#include "lundump.h" - -#define PROGNAME "luac" /* default program name */ -#define OUTPUT PROGNAME ".out" /* default output file */ - -static int listing=0; /* list bytecodes? */ -static int dumping=1; /* dump bytecodes? */ -static int stripping=0; /* strip debug information? */ -static char Output[]={ OUTPUT }; /* default output file name */ -static const char* output=Output; /* actual output file name */ -static const char* progname=PROGNAME; /* actual program name */ - -static void fatal(const char* message) -{ - fprintf(stderr,"%s: %s\n",progname,message); - exit(EXIT_FAILURE); -} - -static void cannot(const char* what) -{ - fprintf(stderr,"%s: cannot %s %s: %s\n",progname,what,output,strerror(errno)); - exit(EXIT_FAILURE); -} - -static void usage(const char* message) -{ - if (*message=='-') - fprintf(stderr,"%s: unrecognized option " LUA_QS "\n",progname,message); - else - fprintf(stderr,"%s: %s\n",progname,message); - fprintf(stderr, - "usage: %s [options] [filenames].\n" - "Available options are:\n" - " - process stdin\n" - " -l list\n" - " -o name output to file " LUA_QL("name") " (default is \"%s\")\n" - " -p parse only\n" - " -s strip debug information\n" - " -v show version information\n" - " -- stop handling options\n", - progname,Output); - exit(EXIT_FAILURE); -} - -#define IS(s) (strcmp(argv[i],s)==0) - -static int doargs(int argc, char* argv[]) -{ - int i; - int version=0; - if (argv[0]!=NULL && *argv[0]!=0) progname=argv[0]; - for (i=1; itop+(i))->l.p) - -static const Proto* combine(lua_State* L, int n) -{ - if (n==1) - return toproto(L,-1); - else - { - int i,pc; - Proto* f=luaF_newproto(L); - setptvalue2s(L,L->top,f); incr_top(L); - f->source=luaS_newliteral(L,"=(" PROGNAME ")"); - f->maxstacksize=1; - pc=2*n+1; - f->code=luaM_newvector(L,pc,Instruction); - f->sizecode=pc; - f->p=luaM_newvector(L,n,Proto*); - f->sizep=n; - pc=0; - for (i=0; ip[i]=toproto(L,i-n-1); - f->code[pc++]=CREATE_ABx(OP_CLOSURE,0,i); - f->code[pc++]=CREATE_ABC(OP_CALL,0,1,1); - } - f->code[pc++]=CREATE_ABC(OP_RETURN,0,1,0); - return f; - } -} - -static int writer(lua_State* L, const void* p, size_t size, void* u) -{ - UNUSED(L); - return (fwrite(p,size,1,(FILE*)u)!=1) && (size!=0); -} - -struct Smain { - int argc; - char** argv; -}; - -static int pmain(lua_State* L) -{ - struct Smain* s = (struct Smain*)lua_touserdata(L, 1); - int argc=s->argc; - char** argv=s->argv; - const Proto* f; - int i; - if (!lua_checkstack(L,argc)) fatal("too many input files"); - for (i=0; i1); - if (dumping) - { - FILE* D= (output==NULL) ? stdout : fopen(output,"wb"); - if (D==NULL) cannot("open"); - lua_lock(L); - luaU_dump(L,f,writer,D,stripping); - lua_unlock(L); - if (ferror(D)) cannot("write"); - if (fclose(D)) cannot("close"); - } - return 0; -} - -int main(int argc, char* argv[]) -{ - lua_State* L; - struct Smain s; - int i=doargs(argc,argv); - argc-=i; argv+=i; - if (argc<=0) usage("no input files given"); - L=lua_open(); - if (L==NULL) fatal("not enough memory for state"); - s.argc=argc; - s.argv=argv; - if (lua_cpcall(L,pmain,&s)!=0) fatal(lua_tostring(L,-1)); - lua_close(L); - return EXIT_SUCCESS; -} diff --git a/uppdev/lua/src/luaconf.h b/uppdev/lua/src/luaconf.h deleted file mode 100644 index 8ed9d4bb8..000000000 --- a/uppdev/lua/src/luaconf.h +++ /dev/null @@ -1,761 +0,0 @@ -/* -** $Id: luaconf.h,v 1.82 2006/04/10 18:27:23 roberto Exp $ -** Configuration file for Lua -** See Copyright Notice in lua.h -*/ - - -#ifndef lconfig_h -#define lconfig_h - -#include -#include - - -/* -** ================================================================== -** Search for "@@" to find all configurable definitions. -** =================================================================== -*/ - - -/* -@@ LUA_ANSI controls the use of non-ansi features. -** CHANGE it (define it) if you want Lua to avoid the use of any -** non-ansi feature or library. -*/ -#if defined(__STRICT_ANSI__) -#define LUA_ANSI -#endif - - -#if !defined(LUA_ANSI) && defined(_WIN32) -#define LUA_WIN -#endif - -#if defined(LUA_USE_LINUX) -#define LUA_USE_POSIX -#define LUA_USE_DLOPEN /* needs an extra library: -ldl */ -#define LUA_USE_READLINE /* needs some extra libraries */ -#endif - -#if defined(LUA_USE_MACOSX) -#define LUA_USE_POSIX -#define LUA_DL_DYLD /* does not need extra library */ -#endif - - - -/* -@@ LUA_USE_POSIX includes all functionallity listed as X/Open System -@* Interfaces Extension (XSI). -** CHANGE it (define it) if your system is XSI compatible. -*/ -#if defined(LUA_USE_POSIX) -#define LUA_USE_MKSTEMP -#define LUA_USE_ISATTY -#define LUA_USE_POPEN -#define LUA_USE_ULONGJMP -#endif - - -/* -@@ LUA_PATH and LUA_CPATH are the names of the environment variables that -@* Lua check to set its paths. -@@ LUA_INIT is the name of the environment variable that Lua -@* checks for initialization code. -** CHANGE them if you want different names. -*/ -#define LUA_PATH "LUA_PATH" -#define LUA_CPATH "LUA_CPATH" -#define LUA_INIT "LUA_INIT" - - -/* -@@ LUA_PATH_DEFAULT is the default path that Lua uses to look for -@* Lua libraries. -@@ LUA_CPATH_DEFAULT is the default path that Lua uses to look for -@* C libraries. -** CHANGE them if your machine has a non-conventional directory -** hierarchy or if you want to install your libraries in -** non-conventional directories. -*/ -#if defined(_WIN32) -/* -** In Windows, any exclamation mark ('!') in the path is replaced by the -** path of the directory of the executable file of the current process. -*/ -#define LUA_LDIR "!\\lua\\" -#define LUA_CDIR "!\\" -#define LUA_PATH_DEFAULT \ - ".\\?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;" \ - LUA_CDIR"?.lua;" LUA_CDIR"?\\init.lua" -#define LUA_CPATH_DEFAULT \ - ".\\?.dll;" LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll" - -#else -#define LUA_ROOT "/usr/local/" -#define LUA_LDIR LUA_ROOT "share/lua/5.1/" -#define LUA_CDIR LUA_ROOT "lib/lua/5.1/" -#define LUA_PATH_DEFAULT \ - "./?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?/init.lua;" \ - LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua" -#define LUA_CPATH_DEFAULT \ - "./?.so;" LUA_CDIR"?.so;" LUA_CDIR"loadall.so" -#endif - - -/* -@@ LUA_DIRSEP is the directory separator (for submodules). -** CHANGE it if your machine does not use "/" as the directory separator -** and is not Windows. (On Windows Lua automatically uses "\".) -*/ -#if defined(_WIN32) -#define LUA_DIRSEP "\\" -#else -#define LUA_DIRSEP "/" -#endif - - -/* -@@ LUA_PATHSEP is the character that separates templates in a path. -@@ LUA_PATH_MARK is the string that marks the substitution points in a -@* template. -@@ LUA_EXECDIR in a Windows path is replaced by the executable's -@* directory. -@@ LUA_IGMARK is a mark to ignore all before it when bulding the -@* luaopen_ function name. -** CHANGE them if for some reason your system cannot use those -** characters. (E.g., if one of those characters is a common character -** in file/directory names.) Probably you do not need to change them. -*/ -#define LUA_PATHSEP ";" -#define LUA_PATH_MARK "?" -#define LUA_EXECDIR "!" -#define LUA_IGMARK "-" - - -/* -@@ LUA_INTEGER is the integral type used by lua_pushinteger/lua_tointeger. -** CHANGE that if ptrdiff_t is not adequate on your machine. (On most -** machines, ptrdiff_t gives a good choice between int or long.) -*/ -#define LUA_INTEGER ptrdiff_t - - -/* -@@ LUA_API is a mark for all core API functions. -@@ LUALIB_API is a mark for all standard library functions. -** CHANGE them if you need to define those functions in some special way. -** For instance, if you want to create one Windows DLL with the core and -** the libraries, you may want to use the following definition (define -** LUA_BUILD_AS_DLL to get it). -*/ -#if defined(LUA_BUILD_AS_DLL) - -#if defined(LUA_CORE) || defined(LUA_LIB) -#define LUA_API __declspec(dllexport) -#else -#define LUA_API __declspec(dllimport) -#endif - -#else - -#define LUA_API extern - -#endif - -/* more often than not the libs go together with the core */ -#define LUALIB_API LUA_API - - -/* -@@ LUAI_FUNC is a mark for all extern functions that are not to be -@* exported to outside modules. -@@ LUAI_DATA is a mark for all extern (const) variables that are not to -@* be exported to outside modules. -** CHANGE them if you need to mark them in some special way. Elf/gcc -** (versions 3.2 and later) mark them as "hidden" to optimize access -** when Lua is compiled as a shared library. -*/ -#if defined(luaall_c) -#define LUAI_FUNC static -#define LUAI_DATA /* empty */ - -#elif defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) >= 302) && \ - defined(__ELF__) -#define LUAI_FUNC __attribute__((visibility("hidden"))) extern -#define LUAI_DATA LUAI_FUNC - -#else -#define LUAI_FUNC extern -#define LUAI_DATA extern -#endif - - - -/* -@@ LUA_QL describes how error messages quote program elements. -** CHANGE it if you want a different appearance. -*/ -#define LUA_QL(x) "'" x "'" -#define LUA_QS LUA_QL("%s") - - -/* -@@ LUA_IDSIZE gives the maximum size for the description of the source -@* of a function in debug information. -** CHANGE it if you want a different size. -*/ -#define LUA_IDSIZE 60 - - -/* -** {================================================================== -** Stand-alone configuration -** =================================================================== -*/ - -#if defined(lua_c) || defined(luaall_c) - -/* -@@ lua_stdin_is_tty detects whether the standard input is a 'tty' (that -@* is, whether we're running lua interactively). -** CHANGE it if you have a better definition for non-POSIX/non-Windows -** systems. -*/ -#if defined(LUA_USE_ISATTY) -#include -#define lua_stdin_is_tty() isatty(0) -#elif defined(LUA_WIN) -#include -#include -#define lua_stdin_is_tty() _isatty(_fileno(stdin)) -#else -#define lua_stdin_is_tty() 1 /* assume stdin is a tty */ -#endif - - -/* -@@ LUA_PROMPT is the default prompt used by stand-alone Lua. -@@ LUA_PROMPT2 is the default continuation prompt used by stand-alone Lua. -** CHANGE them if you want different prompts. (You can also change the -** prompts dynamically, assigning to globals _PROMPT/_PROMPT2.) -*/ -#define LUA_PROMPT "> " -#define LUA_PROMPT2 ">> " - - -/* -@@ LUA_PROGNAME is the default name for the stand-alone Lua program. -** CHANGE it if your stand-alone interpreter has a different name and -** your system is not able to detect that name automatically. -*/ -#define LUA_PROGNAME "lua" - - -/* -@@ LUA_MAXINPUT is the maximum length for an input line in the -@* stand-alone interpreter. -** CHANGE it if you need longer lines. -*/ -#define LUA_MAXINPUT 512 - - -/* -@@ lua_readline defines how to show a prompt and then read a line from -@* the standard input. -@@ lua_saveline defines how to "save" a read line in a "history". -@@ lua_freeline defines how to free a line read by lua_readline. -** CHANGE them if you want to improve this functionality (e.g., by using -** GNU readline and history facilities). -*/ -#if defined(LUA_USE_READLINE) -#include -#include -#include -#define lua_readline(L,b,p) ((void)L, ((b)=readline(p)) != NULL) -#define lua_saveline(L,idx) \ - if (lua_strlen(L,idx) > 0) /* non-empty line? */ \ - add_history(lua_tostring(L, idx)); /* add it to history */ -#define lua_freeline(L,b) ((void)L, free(b)) -#else -#define lua_readline(L,b,p) \ - ((void)L, fputs(p, stdout), fflush(stdout), /* show prompt */ \ - fgets(b, LUA_MAXINPUT, stdin) != NULL) /* get line */ -#define lua_saveline(L,idx) { (void)L; (void)idx; } -#define lua_freeline(L,b) { (void)L; (void)b; } -#endif - -#endif - -/* }================================================================== */ - - -/* -@@ LUAI_GCPAUSE defines the default pause between garbage-collector cycles -@* as a percentage. -** CHANGE it if you want the GC to run faster or slower (higher values -** mean larger pauses which mean slower collection.) You can also change -** this value dynamically. -*/ -#define LUAI_GCPAUSE 200 /* 200% (wait memory to double before next GC) */ - - -/* -@@ LUAI_GCMUL defines the default speed of garbage collection relative to -@* memory allocation as a percentage. -** CHANGE it if you want to change the granularity of the garbage -** collection. (Higher values mean coarser collections. 0 represents -** infinity, where each step performs a full collection.) You can also -** change this value dynamically. -*/ -#define LUAI_GCMUL 200 /* GC runs 'twice the speed' of memory allocation */ - - - -/* -@@ LUA_COMPAT_GETN controls compatibility with old getn behavior. -** CHANGE it (define it) if you want exact compatibility with the -** behavior of setn/getn in Lua 5.0. -*/ -#undef LUA_COMPAT_GETN - -/* -@@ LUA_COMPAT_LOADLIB controls compatibility about global loadlib. -** CHANGE it to undefined as soon as you do not need a global 'loadlib' -** function (the function is still available as 'package.loadlib'). -*/ -#undef LUA_COMPAT_LOADLIB - -/* -@@ LUA_COMPAT_VARARG controls compatibility with old vararg feature. -** CHANGE it to undefined as soon as your programs use only '...' to -** access vararg parameters (instead of the old 'arg' table). -*/ -#define LUA_COMPAT_VARARG - -/* -@@ LUA_COMPAT_MOD controls compatibility with old math.mod function. -** CHANGE it to undefined as soon as your programs use 'math.fmod' or -** the new '%' operator instead of 'math.mod'. -*/ -#define LUA_COMPAT_MOD - -/* -@@ LUA_COMPAT_LSTR controls compatibility with old long string nesting -@* facility. -** CHANGE it to 2 if you want the old behaviour, or undefine it to turn -** off the advisory error when nesting [[...]]. -*/ -#define LUA_COMPAT_LSTR 1 - -/* -@@ LUA_COMPAT_GFIND controls compatibility with old 'string.gfind' name. -** CHANGE it to undefined as soon as you rename 'string.gfind' to -** 'string.gmatch'. -*/ -#define LUA_COMPAT_GFIND - -/* -@@ LUA_COMPAT_OPENLIB controls compatibility with old 'luaL_openlib' -@* behavior. -** CHANGE it to undefined as soon as you replace to 'luaL_registry' -** your uses of 'luaL_openlib' -*/ -#define LUA_COMPAT_OPENLIB - - - -/* -@@ luai_apicheck is the assert macro used by the Lua-C API. -** CHANGE luai_apicheck if you want Lua to perform some checks in the -** parameters it gets from API calls. This may slow down the interpreter -** a bit, but may be quite useful when debugging C code that interfaces -** with Lua. A useful redefinition is to use assert.h. -*/ -#if defined(LUA_USE_APICHECK) -#include -#define luai_apicheck(L,o) { (void)L; assert(o); } -#else -#define luai_apicheck(L,o) { (void)L; } -#endif - - -/* -@@ LUAI_BITSINT defines the number of bits in an int. -** CHANGE here if Lua cannot automatically detect the number of bits of -** your machine. Probably you do not need to change this. -*/ -/* avoid overflows in comparison */ -#if INT_MAX-20 < 32760 -#define LUAI_BITSINT 16 -#elif INT_MAX > 2147483640L -/* int has at least 32 bits */ -#define LUAI_BITSINT 32 -#else -#error "you must define LUA_BITSINT with number of bits in an integer" -#endif - - -/* -@@ LUAI_UINT32 is an unsigned integer with at least 32 bits. -@@ LUAI_INT32 is an signed integer with at least 32 bits. -@@ LUAI_UMEM is an unsigned integer big enough to count the total -@* memory used by Lua. -@@ LUAI_MEM is a signed integer big enough to count the total memory -@* used by Lua. -** CHANGE here if for some weird reason the default definitions are not -** good enough for your machine. (The definitions in the 'else' -** part always works, but may waste space on machines with 64-bit -** longs.) Probably you do not need to change this. -*/ -#if LUAI_BITSINT >= 32 -#define LUAI_UINT32 unsigned int -#define LUAI_INT32 int -#define LUAI_MAXINT32 INT_MAX -#define LUAI_UMEM size_t -#define LUAI_MEM ptrdiff_t -#else -/* 16-bit ints */ -#define LUAI_UINT32 unsigned long -#define LUAI_INT32 long -#define LUAI_MAXINT32 LONG_MAX -#define LUAI_UMEM unsigned long -#define LUAI_MEM long -#endif - - -/* -@@ LUAI_MAXCALLS limits the number of nested calls. -** CHANGE it if you need really deep recursive calls. This limit is -** arbitrary; its only purpose is to stop infinite recursion before -** exhausting memory. -*/ -#define LUAI_MAXCALLS 20000 - - -/* -@@ LUAI_MAXCSTACK limits the number of Lua stack slots that a C function -@* can use. -** CHANGE it if you need lots of (Lua) stack space for your C -** functions. This limit is arbitrary; its only purpose is to stop C -** functions to consume unlimited stack space. -*/ -#define LUAI_MAXCSTACK 2048 - - - -/* -** {================================================================== -** CHANGE (to smaller values) the following definitions if your system -** has a small C stack. (Or you may want to change them to larger -** values if your system has a large C stack and these limits are -** too rigid for you.) Some of these constants control the size of -** stack-allocated arrays used by the compiler or the interpreter, while -** others limit the maximum number of recursive calls that the compiler -** or the interpreter can perform. Values too large may cause a C stack -** overflow for some forms of deep constructs. -** =================================================================== -*/ - - -/* -@@ LUAI_MAXCCALLS is the maximum depth for nested C calls (short) and -@* syntactical nested non-terminals in a program. -*/ -#define LUAI_MAXCCALLS 200 - - -/* -@@ LUAI_MAXVARS is the maximum number of local variables per function -@* (must be smaller than 250). -*/ -#define LUAI_MAXVARS 200 - - -/* -@@ LUAI_MAXUPVALUES is the maximum number of upvalues per function -@* (must be smaller than 250). -*/ -#define LUAI_MAXUPVALUES 60 - - -/* -@@ LUAL_BUFFERSIZE is the buffer size used by the lauxlib buffer system. -*/ -#define LUAL_BUFFERSIZE BUFSIZ - -/* }================================================================== */ - - - - -/* -** {================================================================== -@@ LUA_NUMBER is the type of numbers in Lua. -** CHANGE the following definitions only if you want to build Lua -** with a number type different from double. You may also need to -** change lua_number2int & lua_number2integer. -** =================================================================== -*/ - -#define LUA_NUMBER_DOUBLE -#define LUA_NUMBER double - -/* -@@ LUAI_UACNUMBER is the result of an 'usual argument conversion' -@* over a number. -*/ -#define LUAI_UACNUMBER double - - -/* -@@ LUA_NUMBER_SCAN is the format for reading numbers. -@@ LUA_NUMBER_FMT is the format for writing numbers. -@@ lua_number2str converts a number to a string. -@@ LUAI_MAXNUMBER2STR is maximum size of previous conversion. -@@ lua_str2number converts a string to a number. -*/ -#define LUA_NUMBER_SCAN "%lf" -#define LUA_NUMBER_FMT "%.14g" -#define lua_number2str(s,n) sprintf((s), LUA_NUMBER_FMT, (n)) -#define LUAI_MAXNUMBER2STR 32 /* 16 digits, sign, point, and \0 */ -#define lua_str2number(s,p) strtod((s), (p)) - - -/* -@@ The luai_num* macros define the primitive operations over numbers. -*/ -#if defined(LUA_CORE) -#include -#define luai_numadd(a,b) ((a)+(b)) -#define luai_numsub(a,b) ((a)-(b)) -#define luai_nummul(a,b) ((a)*(b)) -#define luai_numdiv(a,b) ((a)/(b)) -#define luai_nummod(a,b) ((a) - floor((a)/(b))*(b)) -#define luai_numpow(a,b) (pow(a,b)) -#define luai_numunm(a) (-(a)) -#define luai_numeq(a,b) ((a)==(b)) -#define luai_numlt(a,b) ((a)<(b)) -#define luai_numle(a,b) ((a)<=(b)) -#define luai_numisnan(a) (!luai_numeq((a), (a))) -#endif - - -/* -@@ lua_number2int is a macro to convert lua_Number to int. -@@ lua_number2integer is a macro to convert lua_Number to lua_Integer. -** CHANGE them if you know a faster way to convert a lua_Number to -** int (with any rounding method and without throwing errors) in your -** system. In Pentium machines, a naive typecast from double to int -** in C is extremely slow, so any alternative is worth trying. -*/ - -/* On a Pentium, resort to a trick */ -#if defined(LUA_NUMBER_DOUBLE) && !defined(LUA_ANSI) && !defined(__SSE2__) && \ - (defined(__i386) || defined (_M_IX86) || defined(__i386__)) - -/* On a Microsoft compiler, use assembler */ -#if defined(_MSC_VER) - -#define lua_number2int(i,d) __asm fld d __asm fistp i -#define lua_number2integer(i,n) lua_number2int(i, n) - -/* the next trick should work on any Pentium, but sometimes clashes - with a DirectX idiosyncrasy */ -#else - -union luai_Cast { double l_d; long l_l; }; -#define lua_number2int(i,d) \ - { volatile union luai_Cast u; u.l_d = (d) + 6755399441055744.0; (i) = u.l_l; } -#define lua_number2integer(i,n) lua_number2int(i, n) - -#endif - - -/* this option always works, but may be slow */ -#else -#define lua_number2int(i,d) ((i)=(int)(d)) -#define lua_number2integer(i,d) ((i)=(lua_Integer)(d)) - -#endif - -/* }================================================================== */ - - -/* -@@ LUAI_USER_ALIGNMENT_T is a type that requires maximum alignment. -** CHANGE it if your system requires alignments larger than double. (For -** instance, if your system supports long doubles and they must be -** aligned in 16-byte boundaries, then you should add long double in the -** union.) Probably you do not need to change this. -*/ -#define LUAI_USER_ALIGNMENT_T union { double u; void *s; long l; } - - -/* -@@ LUAI_THROW/LUAI_TRY define how Lua does exception handling. -** CHANGE them if you prefer to use longjmp/setjmp even with C++ -** or if want/don't to use _longjmp/_setjmp instead of regular -** longjmp/setjmp. By default, Lua handles errors with exceptions when -** compiling as C++ code, with _longjmp/_setjmp when asked to use them, -** and with longjmp/setjmp otherwise. -*/ -#if defined(__cplusplus) -/* C++ exceptions */ -#define LUAI_THROW(L,c) throw(c) -#define LUAI_TRY(L,c,a) try { a } catch(...) \ - { if ((c)->status == 0) (c)->status = -1; } -#define luai_jmpbuf int /* dummy variable */ - -#elif defined(LUA_USE_ULONGJMP) -/* in Unix, try _longjmp/_setjmp (more efficient) */ -#define LUAI_THROW(L,c) _longjmp((c)->b, 1) -#define LUAI_TRY(L,c,a) if (_setjmp((c)->b) == 0) { a } -#define luai_jmpbuf jmp_buf - -#else -/* default handling with long jumps */ -#define LUAI_THROW(L,c) longjmp((c)->b, 1) -#define LUAI_TRY(L,c,a) if (setjmp((c)->b) == 0) { a } -#define luai_jmpbuf jmp_buf - -#endif - - -/* -@@ LUA_MAXCAPTURES is the maximum number of captures that a pattern -@* can do during pattern-matching. -** CHANGE it if you need more captures. This limit is arbitrary. -*/ -#define LUA_MAXCAPTURES 32 - - -/* -@@ lua_tmpnam is the function that the OS library uses to create a -@* temporary name. -@@ LUA_TMPNAMBUFSIZE is the maximum size of a name created by lua_tmpnam. -** CHANGE them if you have an alternative to tmpnam (which is considered -** insecure) or if you want the original tmpnam anyway. By default, Lua -** uses tmpnam except when POSIX is available, where it uses mkstemp. -*/ -#if defined(loslib_c) || defined(luaall_c) - -#if defined(LUA_USE_MKSTEMP) -#include -#define LUA_TMPNAMBUFSIZE 32 -#define lua_tmpnam(b,e) { \ - strcpy(b, "/tmp/lua_XXXXXX"); \ - e = mkstemp(b); \ - if (e != -1) close(e); \ - e = (e == -1); } - -#else -#define LUA_TMPNAMBUFSIZE L_tmpnam -#define lua_tmpnam(b,e) { e = (tmpnam(b) == NULL); } -#endif - -#endif - - -/* -@@ lua_popen spawns a new process connected to the current one through -@* the file streams. -** CHANGE it if you have a way to implement it in your system. -*/ -#if defined(LUA_USE_POPEN) - -#define lua_popen(L,c,m) ((void)L, popen(c,m)) -#define lua_pclose(L,file) ((void)L, (pclose(file) != -1)) - -#elif defined(LUA_WIN) - -#define lua_popen(L,c,m) ((void)L, _popen(c,m)) -#define lua_pclose(L,file) ((void)L, (_pclose(file) != -1)) - -#else - -#define lua_popen(L,c,m) ((void)((void)c, m), \ - luaL_error(L, LUA_QL("popen") " not supported"), (FILE*)0) -#define lua_pclose(L,file) ((void)((void)L, file), 0) - -#endif - -/* -@@ LUA_DL_* define which dynamic-library system Lua should use. -** CHANGE here if Lua has problems choosing the appropriate -** dynamic-library system for your platform (either Windows' DLL, Mac's -** dyld, or Unix's dlopen). If your system is some kind of Unix, there -** is a good chance that it has dlopen, so LUA_DL_DLOPEN will work for -** it. To use dlopen you also need to adapt the src/Makefile (probably -** adding -ldl to the linker options), so Lua does not select it -** automatically. (When you change the makefile to add -ldl, you must -** also add -DLUA_USE_DLOPEN.) -** If you do not want any kind of dynamic library, undefine all these -** options. -** By default, _WIN32 gets LUA_DL_DLL and MAC OS X gets LUA_DL_DYLD. -*/ -#if defined(LUA_USE_DLOPEN) -#define LUA_DL_DLOPEN -#endif - -#if defined(LUA_WIN) -#define LUA_DL_DLL -#endif - - -/* -@@ LUAI_EXTRASPACE allows you to add user-specific data in a lua_State -@* (the data goes just *before* the lua_State pointer). -** CHANGE (define) this if you really need that. This value must be -** a multiple of the maximum alignment required for your machine. -*/ -#define LUAI_EXTRASPACE 0 - - -/* -@@ luai_userstate* allow user-specific actions on threads. -** CHANGE them if you defined LUAI_EXTRASPACE and need to do something -** extra when a thread is created/deleted/resumed/yielded. -*/ -#define luai_userstateopen(L) ((void)L) -#define luai_userstateclose(L) ((void)L) -#define luai_userstatethread(L,L1) ((void)L) -#define luai_userstatefree(L) ((void)L) -#define luai_userstateresume(L,n) ((void)L) -#define luai_userstateyield(L,n) ((void)L) - - -/* -@@ LUA_INTFRMLEN is the length modifier for integer conversions -@* in 'string.format'. -@@ LUA_INTFRM_T is the integer type correspoding to the previous length -@* modifier. -** CHANGE them if your system supports long long or does not support long. -*/ - -#if defined(LUA_USELONGLONG) - -#define LUA_INTFRMLEN "ll" -#define LUA_INTFRM_T long long - -#else - -#define LUA_INTFRMLEN "l" -#define LUA_INTFRM_T long - -#endif - - - -/* =================================================================== */ - -/* -** Local configuration. You can use this space to add your redefinitions -** without modifying the main part of the file. -*/ - - - -#endif diff --git a/uppdev/lua/src/lualib.h b/uppdev/lua/src/lualib.h deleted file mode 100644 index f9732364e..000000000 --- a/uppdev/lua/src/lualib.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -** $Id: lualib.h,v 1.36 2005/12/27 17:12:00 roberto Exp $ -** Lua standard libraries -** See Copyright Notice in lua.h -*/ - - -#ifndef lualib_h -#define lualib_h - -#include "lua.h" - - -/* Key to file-handle type */ -#define LUA_FILEHANDLE "FILE*" - - -#define LUA_COLIBNAME "coroutine" -LUALIB_API int (luaopen_base) (lua_State *L); - -#define LUA_TABLIBNAME "table" -LUALIB_API int (luaopen_table) (lua_State *L); - -#define LUA_IOLIBNAME "io" -LUALIB_API int (luaopen_io) (lua_State *L); - -#define LUA_OSLIBNAME "os" -LUALIB_API int (luaopen_os) (lua_State *L); - -#define LUA_STRLIBNAME "string" -LUALIB_API int (luaopen_string) (lua_State *L); - -#define LUA_MATHLIBNAME "math" -LUALIB_API int (luaopen_math) (lua_State *L); - -#define LUA_DBLIBNAME "debug" -LUALIB_API int (luaopen_debug) (lua_State *L); - -#define LUA_LOADLIBNAME "package" -LUALIB_API int (luaopen_package) (lua_State *L); - - -/* open all previous libraries */ -LUALIB_API void (luaL_openlibs) (lua_State *L); - - - -#ifndef lua_assert -#define lua_assert(x) ((void)0) -#endif - - -#endif diff --git a/uppdev/lua/src/lundump.c b/uppdev/lua/src/lundump.c deleted file mode 100644 index b6ea01693..000000000 --- a/uppdev/lua/src/lundump.c +++ /dev/null @@ -1,223 +0,0 @@ -/* -** $Id: lundump.c,v 1.60 2006/02/16 15:53:49 lhf Exp $ -** load precompiled Lua chunks -** See Copyright Notice in lua.h -*/ - -#include - -#define lundump_c -#define LUA_CORE - -#include "lua.h" - -#include "ldebug.h" -#include "ldo.h" -#include "lfunc.h" -#include "lmem.h" -#include "lobject.h" -#include "lstring.h" -#include "lundump.h" -#include "lzio.h" - -typedef struct { - lua_State* L; - ZIO* Z; - Mbuffer* b; - const char* name; -} LoadState; - -#ifdef LUAC_TRUST_BINARIES -#define IF(c,s) -#else -#define IF(c,s) if (c) error(S,s) - -static void error(LoadState* S, const char* why) -{ - luaO_pushfstring(S->L,"%s: %s in precompiled chunk",S->name,why); - luaD_throw(S->L,LUA_ERRSYNTAX); -} -#endif - -#define LoadMem(S,b,n,size) LoadBlock(S,b,(n)*(size)) -#define LoadByte(S) (lu_byte)LoadChar(S) -#define LoadVar(S,x) LoadMem(S,&x,1,sizeof(x)) -#define LoadVector(S,b,n,size) LoadMem(S,b,n,size) - -static void LoadBlock(LoadState* S, void* b, size_t size) -{ - size_t r=luaZ_read(S->Z,b,size); - IF (r!=0, "unexpected end"); -} - -static int LoadChar(LoadState* S) -{ - char x; - LoadVar(S,x); - return x; -} - -static int LoadInt(LoadState* S) -{ - int x; - LoadVar(S,x); - IF (x<0, "bad integer"); - return x; -} - -static lua_Number LoadNumber(LoadState* S) -{ - lua_Number x; - LoadVar(S,x); - return x; -} - -static TString* LoadString(LoadState* S) -{ - size_t size; - LoadVar(S,size); - if (size==0) - return NULL; - else - { - char* s=luaZ_openspace(S->L,S->b,size); - LoadBlock(S,s,size); - return luaS_newlstr(S->L,s,size-1); /* remove trailing '\0' */ - } -} - -static void LoadCode(LoadState* S, Proto* f) -{ - int n=LoadInt(S); - f->code=luaM_newvector(S->L,n,Instruction); - f->sizecode=n; - LoadVector(S,f->code,n,sizeof(Instruction)); -} - -static Proto* LoadFunction(LoadState* S, TString* p); - -static void LoadConstants(LoadState* S, Proto* f) -{ - int i,n; - n=LoadInt(S); - f->k=luaM_newvector(S->L,n,TValue); - f->sizek=n; - for (i=0; ik[i]); - for (i=0; ik[i]; - int t=LoadChar(S); - switch (t) - { - case LUA_TNIL: - setnilvalue(o); - break; - case LUA_TBOOLEAN: - setbvalue(o,LoadChar(S)); - break; - case LUA_TNUMBER: - setnvalue(o,LoadNumber(S)); - break; - case LUA_TSTRING: - setsvalue2n(S->L,o,LoadString(S)); - break; - default: - IF (1, "bad constant"); - break; - } - } - n=LoadInt(S); - f->p=luaM_newvector(S->L,n,Proto*); - f->sizep=n; - for (i=0; ip[i]=NULL; - for (i=0; ip[i]=LoadFunction(S,f->source); -} - -static void LoadDebug(LoadState* S, Proto* f) -{ - int i,n; - n=LoadInt(S); - f->lineinfo=luaM_newvector(S->L,n,int); - f->sizelineinfo=n; - LoadVector(S,f->lineinfo,n,sizeof(int)); - n=LoadInt(S); - f->locvars=luaM_newvector(S->L,n,LocVar); - f->sizelocvars=n; - for (i=0; ilocvars[i].varname=NULL; - for (i=0; ilocvars[i].varname=LoadString(S); - f->locvars[i].startpc=LoadInt(S); - f->locvars[i].endpc=LoadInt(S); - } - n=LoadInt(S); - f->upvalues=luaM_newvector(S->L,n,TString*); - f->sizeupvalues=n; - for (i=0; iupvalues[i]=NULL; - for (i=0; iupvalues[i]=LoadString(S); -} - -static Proto* LoadFunction(LoadState* S, TString* p) -{ - Proto* f=luaF_newproto(S->L); - setptvalue2s(S->L,S->L->top,f); incr_top(S->L); - f->source=LoadString(S); if (f->source==NULL) f->source=p; - f->linedefined=LoadInt(S); - f->lastlinedefined=LoadInt(S); - f->nups=LoadByte(S); - f->numparams=LoadByte(S); - f->is_vararg=LoadByte(S); - f->maxstacksize=LoadByte(S); - LoadCode(S,f); - LoadConstants(S,f); - LoadDebug(S,f); - IF (!luaG_checkcode(f), "bad code"); - S->L->top--; - return f; -} - -static void LoadHeader(LoadState* S) -{ - char h[LUAC_HEADERSIZE]; - char s[LUAC_HEADERSIZE]; - luaU_header(h); - LoadBlock(S,s,LUAC_HEADERSIZE); - IF (memcmp(h,s,LUAC_HEADERSIZE)!=0, "bad header"); -} - -/* -** load precompiled chunk -*/ -Proto* luaU_undump (lua_State* L, ZIO* Z, Mbuffer* buff, const char* name) -{ - LoadState S; - if (*name=='@' || *name=='=') - S.name=name+1; - else if (*name==LUA_SIGNATURE[0]) - S.name="binary string"; - else - S.name=name; - S.L=L; - S.Z=Z; - S.b=buff; - LoadHeader(&S); - return LoadFunction(&S,luaS_newliteral(L,"=?")); -} - -/* -* make header -*/ -void luaU_header (char* h) -{ - int x=1; - memcpy(h,LUA_SIGNATURE,sizeof(LUA_SIGNATURE)-1); - h+=sizeof(LUA_SIGNATURE)-1; - *h++=(char)LUAC_VERSION; - *h++=(char)LUAC_FORMAT; - *h++=(char)*(char*)&x; /* endianness */ - *h++=(char)sizeof(int); - *h++=(char)sizeof(size_t); - *h++=(char)sizeof(Instruction); - *h++=(char)sizeof(lua_Number); - *h++=(char)(((lua_Number)0.5)==0); /* is lua_Number integral? */ -} diff --git a/uppdev/lua/src/lundump.h b/uppdev/lua/src/lundump.h deleted file mode 100644 index 20f38847e..000000000 --- a/uppdev/lua/src/lundump.h +++ /dev/null @@ -1,36 +0,0 @@ -/* -** $Id: lundump.h,v 1.40 2005/11/11 14:03:13 lhf Exp $ -** load precompiled Lua chunks -** See Copyright Notice in lua.h -*/ - -#ifndef lundump_h -#define lundump_h - -#include "lobject.h" -#include "lzio.h" - -/* load one chunk; from lundump.c */ -LUAI_FUNC Proto* luaU_undump (lua_State* L, ZIO* Z, Mbuffer* buff, const char* name); - -/* make header; from lundump.c */ -LUAI_FUNC void luaU_header (char* h); - -/* dump one chunk; from ldump.c */ -LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip); - -#ifdef luac_c -/* print one chunk; from print.c */ -LUAI_FUNC void luaU_print (const Proto* f, int full); -#endif - -/* for header of binary files -- this is Lua 5.1 */ -#define LUAC_VERSION 0x51 - -/* for header of binary files -- this is the official format */ -#define LUAC_FORMAT 0 - -/* size of header of binary files */ -#define LUAC_HEADERSIZE 12 - -#endif diff --git a/uppdev/lua/src/lvm.c b/uppdev/lua/src/lvm.c deleted file mode 100644 index 1aba2a165..000000000 --- a/uppdev/lua/src/lvm.c +++ /dev/null @@ -1,762 +0,0 @@ -/* -** $Id: lvm.c,v 2.63 2006/06/05 15:58:59 roberto Exp $ -** Lua virtual machine -** See Copyright Notice in lua.h -*/ - - -#include -#include -#include - -#define lvm_c -#define LUA_CORE - -#include "lua.h" - -#include "ldebug.h" -#include "ldo.h" -#include "lfunc.h" -#include "lgc.h" -#include "lobject.h" -#include "lopcodes.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "ltm.h" -#include "lvm.h" - - - -/* limit for table tag-method chains (to avoid loops) */ -#define MAXTAGLOOP 100 - - -const TValue *luaV_tonumber (const TValue *obj, TValue *n) { - lua_Number num; - if (ttisnumber(obj)) return obj; - if (ttisstring(obj) && luaO_str2d(svalue(obj), &num)) { - setnvalue(n, num); - return n; - } - else - return NULL; -} - - -int luaV_tostring (lua_State *L, StkId obj) { - if (!ttisnumber(obj)) - return 0; - else { - char s[LUAI_MAXNUMBER2STR]; - lua_Number n = nvalue(obj); - lua_number2str(s, n); - setsvalue2s(L, obj, luaS_new(L, s)); - return 1; - } -} - - -static void traceexec (lua_State *L, const Instruction *pc) { - lu_byte mask = L->hookmask; - const Instruction *oldpc = L->savedpc; - L->savedpc = pc; - if (mask > LUA_MASKLINE) { /* instruction-hook set? */ - if (L->hookcount == 0) { - resethookcount(L); - luaD_callhook(L, LUA_HOOKCOUNT, -1); - } - } - if (mask & LUA_MASKLINE) { - Proto *p = ci_func(L->ci)->l.p; - int npc = pcRel(pc, p); - int newline = getline(p, npc); - /* call linehook when enter a new function, when jump back (loop), - or when enter a new line */ - if (npc == 0 || pc <= oldpc || newline != getline(p, pcRel(oldpc, p))) - luaD_callhook(L, LUA_HOOKLINE, newline); - } -} - - -static void callTMres (lua_State *L, StkId res, const TValue *f, - const TValue *p1, const TValue *p2) { - ptrdiff_t result = savestack(L, res); - setobj2s(L, L->top, f); /* push function */ - setobj2s(L, L->top+1, p1); /* 1st argument */ - setobj2s(L, L->top+2, p2); /* 2nd argument */ - luaD_checkstack(L, 3); - L->top += 3; - luaD_call(L, L->top - 3, 1); - res = restorestack(L, result); - L->top--; - setobjs2s(L, res, L->top); -} - - - -static void callTM (lua_State *L, const TValue *f, const TValue *p1, - const TValue *p2, const TValue *p3) { - setobj2s(L, L->top, f); /* push function */ - setobj2s(L, L->top+1, p1); /* 1st argument */ - setobj2s(L, L->top+2, p2); /* 2nd argument */ - setobj2s(L, L->top+3, p3); /* 3th argument */ - luaD_checkstack(L, 4); - L->top += 4; - luaD_call(L, L->top - 4, 0); -} - - -void luaV_gettable (lua_State *L, const TValue *t, TValue *key, StkId val) { - int loop; - for (loop = 0; loop < MAXTAGLOOP; loop++) { - const TValue *tm; - if (ttistable(t)) { /* `t' is a table? */ - Table *h = hvalue(t); - const TValue *res = luaH_get(h, key); /* do a primitive get */ - if (!ttisnil(res) || /* result is no nil? */ - (tm = fasttm(L, h->metatable, TM_INDEX)) == NULL) { /* or no TM? */ - setobj2s(L, val, res); - return; - } - /* else will try the tag method */ - } - else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_INDEX))) - luaG_typeerror(L, t, "index"); - if (ttisfunction(tm)) { - callTMres(L, val, tm, t, key); - return; - } - t = tm; /* else repeat with `tm' */ - } - luaG_runerror(L, "loop in gettable"); -} - - -void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val) { - int loop; - for (loop = 0; loop < MAXTAGLOOP; loop++) { - const TValue *tm; - if (ttistable(t)) { /* `t' is a table? */ - Table *h = hvalue(t); - TValue *oldval = luaH_set(L, h, key); /* do a primitive set */ - if (!ttisnil(oldval) || /* result is no nil? */ - (tm = fasttm(L, h->metatable, TM_NEWINDEX)) == NULL) { /* or no TM? */ - setobj2t(L, oldval, val); - luaC_barriert(L, h, val); - return; - } - /* else will try the tag method */ - } - else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_NEWINDEX))) - luaG_typeerror(L, t, "index"); - if (ttisfunction(tm)) { - callTM(L, tm, t, key, val); - return; - } - t = tm; /* else repeat with `tm' */ - } - luaG_runerror(L, "loop in settable"); -} - - -static int call_binTM (lua_State *L, const TValue *p1, const TValue *p2, - StkId res, TMS event) { - const TValue *tm = luaT_gettmbyobj(L, p1, event); /* try first operand */ - if (ttisnil(tm)) - tm = luaT_gettmbyobj(L, p2, event); /* try second operand */ - if (!ttisfunction(tm)) return 0; - callTMres(L, res, tm, p1, p2); - return 1; -} - - -static const TValue *get_compTM (lua_State *L, Table *mt1, Table *mt2, - TMS event) { - const TValue *tm1 = fasttm(L, mt1, event); - const TValue *tm2; - if (tm1 == NULL) return NULL; /* no metamethod */ - if (mt1 == mt2) return tm1; /* same metatables => same metamethods */ - tm2 = fasttm(L, mt2, event); - if (tm2 == NULL) return NULL; /* no metamethod */ - if (luaO_rawequalObj(tm1, tm2)) /* same metamethods? */ - return tm1; - return NULL; -} - - -static int call_orderTM (lua_State *L, const TValue *p1, const TValue *p2, - TMS event) { - const TValue *tm1 = luaT_gettmbyobj(L, p1, event); - const TValue *tm2; - if (ttisnil(tm1)) return -1; /* no metamethod? */ - tm2 = luaT_gettmbyobj(L, p2, event); - if (!luaO_rawequalObj(tm1, tm2)) /* different metamethods? */ - return -1; - callTMres(L, L->top, tm1, p1, p2); - return !l_isfalse(L->top); -} - - -static int l_strcmp (const TString *ls, const TString *rs) { - const char *l = getstr(ls); - size_t ll = ls->tsv.len; - const char *r = getstr(rs); - size_t lr = rs->tsv.len; - for (;;) { - int temp = strcoll(l, r); - if (temp != 0) return temp; - else { /* strings are equal up to a `\0' */ - size_t len = strlen(l); /* index of first `\0' in both strings */ - if (len == lr) /* r is finished? */ - return (len == ll) ? 0 : 1; - else if (len == ll) /* l is finished? */ - return -1; /* l is smaller than r (because r is not finished) */ - /* both strings longer than `len'; go on comparing (after the `\0') */ - len++; - l += len; ll -= len; r += len; lr -= len; - } - } -} - - -int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r) { - int res; - if (ttype(l) != ttype(r)) - return luaG_ordererror(L, l, r); - else if (ttisnumber(l)) - return luai_numlt(nvalue(l), nvalue(r)); - else if (ttisstring(l)) - return l_strcmp(rawtsvalue(l), rawtsvalue(r)) < 0; - else if ((res = call_orderTM(L, l, r, TM_LT)) != -1) - return res; - return luaG_ordererror(L, l, r); -} - - -static int lessequal (lua_State *L, const TValue *l, const TValue *r) { - int res; - if (ttype(l) != ttype(r)) - return luaG_ordererror(L, l, r); - else if (ttisnumber(l)) - return luai_numle(nvalue(l), nvalue(r)); - else if (ttisstring(l)) - return l_strcmp(rawtsvalue(l), rawtsvalue(r)) <= 0; - else if ((res = call_orderTM(L, l, r, TM_LE)) != -1) /* first try `le' */ - return res; - else if ((res = call_orderTM(L, r, l, TM_LT)) != -1) /* else try `lt' */ - return !res; - return luaG_ordererror(L, l, r); -} - - -int luaV_equalval (lua_State *L, const TValue *t1, const TValue *t2) { - const TValue *tm; - lua_assert(ttype(t1) == ttype(t2)); - switch (ttype(t1)) { - case LUA_TNIL: return 1; - case LUA_TNUMBER: return luai_numeq(nvalue(t1), nvalue(t2)); - case LUA_TBOOLEAN: return bvalue(t1) == bvalue(t2); /* true must be 1 !! */ - case LUA_TLIGHTUSERDATA: return pvalue(t1) == pvalue(t2); - case LUA_TUSERDATA: { - if (uvalue(t1) == uvalue(t2)) return 1; - tm = get_compTM(L, uvalue(t1)->metatable, uvalue(t2)->metatable, - TM_EQ); - break; /* will try TM */ - } - case LUA_TTABLE: { - if (hvalue(t1) == hvalue(t2)) return 1; - tm = get_compTM(L, hvalue(t1)->metatable, hvalue(t2)->metatable, TM_EQ); - break; /* will try TM */ - } - default: return gcvalue(t1) == gcvalue(t2); - } - if (tm == NULL) return 0; /* no TM? */ - callTMres(L, L->top, tm, t1, t2); /* call TM */ - return !l_isfalse(L->top); -} - - -void luaV_concat (lua_State *L, int total, int last) { - do { - StkId top = L->base + last + 1; - int n = 2; /* number of elements handled in this pass (at least 2) */ - if (!tostring(L, top-2) || !tostring(L, top-1)) { - if (!call_binTM(L, top-2, top-1, top-2, TM_CONCAT)) - luaG_concaterror(L, top-2, top-1); - } else if (tsvalue(top-1)->len > 0) { /* if len=0, do nothing */ - /* at least two string values; get as many as possible */ - size_t tl = tsvalue(top-1)->len; - char *buffer; - int i; - /* collect total length */ - for (n = 1; n < total && tostring(L, top-n-1); n++) { - size_t l = tsvalue(top-n-1)->len; - if (l >= MAX_SIZET - tl) luaG_runerror(L, "string length overflow"); - tl += l; - } - buffer = luaZ_openspace(L, &G(L)->buff, tl); - tl = 0; - for (i=n; i>0; i--) { /* concat all strings */ - size_t l = tsvalue(top-i)->len; - memcpy(buffer+tl, svalue(top-i), l); - tl += l; - } - setsvalue2s(L, top-n, luaS_newlstr(L, buffer, tl)); - } - total -= n-1; /* got `n' strings to create 1 new */ - last -= n-1; - } while (total > 1); /* repeat until only 1 result left */ -} - - -static void Arith (lua_State *L, StkId ra, const TValue *rb, - const TValue *rc, TMS op) { - TValue tempb, tempc; - const TValue *b, *c; - if ((b = luaV_tonumber(rb, &tempb)) != NULL && - (c = luaV_tonumber(rc, &tempc)) != NULL) { - lua_Number nb = nvalue(b), nc = nvalue(c); - switch (op) { - case TM_ADD: setnvalue(ra, luai_numadd(nb, nc)); break; - case TM_SUB: setnvalue(ra, luai_numsub(nb, nc)); break; - case TM_MUL: setnvalue(ra, luai_nummul(nb, nc)); break; - case TM_DIV: setnvalue(ra, luai_numdiv(nb, nc)); break; - case TM_MOD: setnvalue(ra, luai_nummod(nb, nc)); break; - case TM_POW: setnvalue(ra, luai_numpow(nb, nc)); break; - case TM_UNM: setnvalue(ra, luai_numunm(nb)); break; - default: lua_assert(0); break; - } - } - else if (!call_binTM(L, rb, rc, ra, op)) - luaG_aritherror(L, rb, rc); -} - - - -/* -** some macros for common tasks in `luaV_execute' -*/ - -#define runtime_check(L, c) { if (!(c)) break; } - -#define RA(i) (base+GETARG_A(i)) -/* to be used after possible stack reallocation */ -#define RB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgR, base+GETARG_B(i)) -#define RC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgR, base+GETARG_C(i)) -#define RKB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, \ - ISK(GETARG_B(i)) ? k+INDEXK(GETARG_B(i)) : base+GETARG_B(i)) -#define RKC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgK, \ - ISK(GETARG_C(i)) ? k+INDEXK(GETARG_C(i)) : base+GETARG_C(i)) -#define KBx(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, k+GETARG_Bx(i)) - - -#define dojump(L,pc,i) {(pc) += (i); luai_threadyield(L);} - - -#define Protect(x) { L->savedpc = pc; {x;}; base = L->base; } - - -#define arith_op(op,tm) { \ - TValue *rb = RKB(i); \ - TValue *rc = RKC(i); \ - if (ttisnumber(rb) && ttisnumber(rc)) { \ - lua_Number nb = nvalue(rb), nc = nvalue(rc); \ - setnvalue(ra, op(nb, nc)); \ - } \ - else \ - Protect(Arith(L, ra, rb, rc, tm)); \ - } - - - -void luaV_execute (lua_State *L, int nexeccalls) { - LClosure *cl; - StkId base; - TValue *k; - const Instruction *pc; - reentry: /* entry point */ - lua_assert(isLua(L->ci)); - pc = L->savedpc; - cl = &clvalue(L->ci->func)->l; - base = L->base; - k = cl->p->k; - /* main loop of interpreter */ - for (;;) { - const Instruction i = *pc++; - StkId ra; - if ((L->hookmask & (LUA_MASKLINE | LUA_MASKCOUNT)) && - (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) { - traceexec(L, pc); - if (L->status == LUA_YIELD) { /* did hook yield? */ - L->savedpc = pc - 1; - return; - } - base = L->base; - } - /* warning!! several calls may realloc the stack and invalidate `ra' */ - ra = RA(i); - lua_assert(base == L->base && L->base == L->ci->base); - lua_assert(base <= L->top && L->top <= L->stack + L->stacksize); - lua_assert(L->top == L->ci->top || luaG_checkopenop(i)); - switch (GET_OPCODE(i)) { - case OP_MOVE: { - setobjs2s(L, ra, RB(i)); - continue; - } - case OP_LOADK: { - setobj2s(L, ra, KBx(i)); - continue; - } - case OP_LOADBOOL: { - setbvalue(ra, GETARG_B(i)); - if (GETARG_C(i)) pc++; /* skip next instruction (if C) */ - continue; - } - case OP_LOADNIL: { - TValue *rb = RB(i); - do { - setnilvalue(rb--); - } while (rb >= ra); - continue; - } - case OP_GETUPVAL: { - int b = GETARG_B(i); - setobj2s(L, ra, cl->upvals[b]->v); - continue; - } - case OP_GETGLOBAL: { - TValue g; - TValue *rb = KBx(i); - sethvalue(L, &g, cl->env); - lua_assert(ttisstring(rb)); - Protect(luaV_gettable(L, &g, rb, ra)); - continue; - } - case OP_GETTABLE: { - Protect(luaV_gettable(L, RB(i), RKC(i), ra)); - continue; - } - case OP_SETGLOBAL: { - TValue g; - sethvalue(L, &g, cl->env); - lua_assert(ttisstring(KBx(i))); - Protect(luaV_settable(L, &g, KBx(i), ra)); - continue; - } - case OP_SETUPVAL: { - UpVal *uv = cl->upvals[GETARG_B(i)]; - setobj(L, uv->v, ra); - luaC_barrier(L, uv, ra); - continue; - } - case OP_SETTABLE: { - Protect(luaV_settable(L, ra, RKB(i), RKC(i))); - continue; - } - case OP_NEWTABLE: { - int b = GETARG_B(i); - int c = GETARG_C(i); - sethvalue(L, ra, luaH_new(L, luaO_fb2int(b), luaO_fb2int(c))); - Protect(luaC_checkGC(L)); - continue; - } - case OP_SELF: { - StkId rb = RB(i); - setobjs2s(L, ra+1, rb); - Protect(luaV_gettable(L, rb, RKC(i), ra)); - continue; - } - case OP_ADD: { - arith_op(luai_numadd, TM_ADD); - continue; - } - case OP_SUB: { - arith_op(luai_numsub, TM_SUB); - continue; - } - case OP_MUL: { - arith_op(luai_nummul, TM_MUL); - continue; - } - case OP_DIV: { - arith_op(luai_numdiv, TM_DIV); - continue; - } - case OP_MOD: { - arith_op(luai_nummod, TM_MOD); - continue; - } - case OP_POW: { - arith_op(luai_numpow, TM_POW); - continue; - } - case OP_UNM: { - TValue *rb = RB(i); - if (ttisnumber(rb)) { - lua_Number nb = nvalue(rb); - setnvalue(ra, luai_numunm(nb)); - } - else { - Protect(Arith(L, ra, rb, rb, TM_UNM)); - } - continue; - } - case OP_NOT: { - int res = l_isfalse(RB(i)); /* next assignment may change this value */ - setbvalue(ra, res); - continue; - } - case OP_LEN: { - const TValue *rb = RB(i); - switch (ttype(rb)) { - case LUA_TTABLE: { - setnvalue(ra, cast_num(luaH_getn(hvalue(rb)))); - break; - } - case LUA_TSTRING: { - setnvalue(ra, cast_num(tsvalue(rb)->len)); - break; - } - default: { /* try metamethod */ - Protect( - if (!call_binTM(L, rb, luaO_nilobject, ra, TM_LEN)) - luaG_typeerror(L, rb, "get length of"); - ) - } - } - continue; - } - case OP_CONCAT: { - int b = GETARG_B(i); - int c = GETARG_C(i); - Protect(luaV_concat(L, c-b+1, c); luaC_checkGC(L)); - setobjs2s(L, RA(i), base+b); - continue; - } - case OP_JMP: { - dojump(L, pc, GETARG_sBx(i)); - continue; - } - case OP_EQ: { - TValue *rb = RKB(i); - TValue *rc = RKC(i); - Protect( - if (equalobj(L, rb, rc) == GETARG_A(i)) - dojump(L, pc, GETARG_sBx(*pc)); - ) - pc++; - continue; - } - case OP_LT: { - Protect( - if (luaV_lessthan(L, RKB(i), RKC(i)) == GETARG_A(i)) - dojump(L, pc, GETARG_sBx(*pc)); - ) - pc++; - continue; - } - case OP_LE: { - Protect( - if (lessequal(L, RKB(i), RKC(i)) == GETARG_A(i)) - dojump(L, pc, GETARG_sBx(*pc)); - ) - pc++; - continue; - } - case OP_TEST: { - if (l_isfalse(ra) != GETARG_C(i)) - dojump(L, pc, GETARG_sBx(*pc)); - pc++; - continue; - } - case OP_TESTSET: { - TValue *rb = RB(i); - if (l_isfalse(rb) != GETARG_C(i)) { - setobjs2s(L, ra, rb); - dojump(L, pc, GETARG_sBx(*pc)); - } - pc++; - continue; - } - case OP_CALL: { - int b = GETARG_B(i); - int nresults = GETARG_C(i) - 1; - if (b != 0) L->top = ra+b; /* else previous instruction set top */ - L->savedpc = pc; - switch (luaD_precall(L, ra, nresults)) { - case PCRLUA: { - nexeccalls++; - goto reentry; /* restart luaV_execute over new Lua function */ - } - case PCRC: { - /* it was a C function (`precall' called it); adjust results */ - if (nresults >= 0) L->top = L->ci->top; - base = L->base; - continue; - } - default: { - return; /* yield */ - } - } - } - case OP_TAILCALL: { - int b = GETARG_B(i); - if (b != 0) L->top = ra+b; /* else previous instruction set top */ - L->savedpc = pc; - lua_assert(GETARG_C(i) - 1 == LUA_MULTRET); - switch (luaD_precall(L, ra, LUA_MULTRET)) { - case PCRLUA: { - /* tail call: put new frame in place of previous one */ - CallInfo *ci = L->ci - 1; /* previous frame */ - int aux; - StkId func = ci->func; - StkId pfunc = (ci+1)->func; /* previous function index */ - if (L->openupval) luaF_close(L, ci->base); - L->base = ci->base = ci->func + ((ci+1)->base - pfunc); - for (aux = 0; pfunc+aux < L->top; aux++) /* move frame down */ - setobjs2s(L, func+aux, pfunc+aux); - ci->top = L->top = func+aux; /* correct top */ - lua_assert(L->top == L->base + clvalue(func)->l.p->maxstacksize); - ci->savedpc = L->savedpc; - ci->tailcalls++; /* one more call lost */ - L->ci--; /* remove new frame */ - goto reentry; - } - case PCRC: { /* it was a C function (`precall' called it) */ - base = L->base; - continue; - } - default: { - return; /* yield */ - } - } - } - case OP_RETURN: { - int b = GETARG_B(i); - if (b != 0) L->top = ra+b-1; - if (L->openupval) luaF_close(L, base); - L->savedpc = pc; - b = luaD_poscall(L, ra); - if (--nexeccalls == 0) /* was previous function running `here'? */ - return; /* no: return */ - else { /* yes: continue its execution */ - if (b) L->top = L->ci->top; - lua_assert(isLua(L->ci)); - lua_assert(GET_OPCODE(*((L->ci)->savedpc - 1)) == OP_CALL); - goto reentry; - } - } - case OP_FORLOOP: { - lua_Number step = nvalue(ra+2); - lua_Number idx = luai_numadd(nvalue(ra), step); /* increment index */ - lua_Number limit = nvalue(ra+1); - if (luai_numlt(0, step) ? luai_numle(idx, limit) - : luai_numle(limit, idx)) { - dojump(L, pc, GETARG_sBx(i)); /* jump back */ - setnvalue(ra, idx); /* update internal index... */ - setnvalue(ra+3, idx); /* ...and external index */ - } - continue; - } - case OP_FORPREP: { - const TValue *init = ra; - const TValue *plimit = ra+1; - const TValue *pstep = ra+2; - L->savedpc = pc; /* next steps may throw errors */ - if (!tonumber(init, ra)) - luaG_runerror(L, LUA_QL("for") " initial value must be a number"); - else if (!tonumber(plimit, ra+1)) - luaG_runerror(L, LUA_QL("for") " limit must be a number"); - else if (!tonumber(pstep, ra+2)) - luaG_runerror(L, LUA_QL("for") " step must be a number"); - setnvalue(ra, luai_numsub(nvalue(ra), nvalue(pstep))); - dojump(L, pc, GETARG_sBx(i)); - continue; - } - case OP_TFORLOOP: { - StkId cb = ra + 3; /* call base */ - setobjs2s(L, cb+2, ra+2); - setobjs2s(L, cb+1, ra+1); - setobjs2s(L, cb, ra); - L->top = cb+3; /* func. + 2 args (state and index) */ - Protect(luaD_call(L, cb, GETARG_C(i))); - L->top = L->ci->top; - cb = RA(i) + 3; /* previous call may change the stack */ - if (!ttisnil(cb)) { /* continue loop? */ - setobjs2s(L, cb-1, cb); /* save control variable */ - dojump(L, pc, GETARG_sBx(*pc)); /* jump back */ - } - pc++; - continue; - } - case OP_SETLIST: { - int n = GETARG_B(i); - int c = GETARG_C(i); - int last; - Table *h; - if (n == 0) { - n = cast_int(L->top - ra) - 1; - L->top = L->ci->top; - } - if (c == 0) c = cast_int(*pc++); - runtime_check(L, ttistable(ra)); - h = hvalue(ra); - last = ((c-1)*LFIELDS_PER_FLUSH) + n; - if (last > h->sizearray) /* needs more space? */ - luaH_resizearray(L, h, last); /* pre-alloc it at once */ - for (; n > 0; n--) { - TValue *val = ra+n; - setobj2t(L, luaH_setnum(L, h, last--), val); - luaC_barriert(L, h, val); - } - continue; - } - case OP_CLOSE: { - luaF_close(L, ra); - continue; - } - case OP_CLOSURE: { - Proto *p; - Closure *ncl; - int nup, j; - p = cl->p->p[GETARG_Bx(i)]; - nup = p->nups; - ncl = luaF_newLclosure(L, nup, cl->env); - ncl->l.p = p; - for (j=0; jl.upvals[j] = cl->upvals[GETARG_B(*pc)]; - else { - lua_assert(GET_OPCODE(*pc) == OP_MOVE); - ncl->l.upvals[j] = luaF_findupval(L, base + GETARG_B(*pc)); - } - } - setclvalue(L, ra, ncl); - Protect(luaC_checkGC(L)); - continue; - } - case OP_VARARG: { - int b = GETARG_B(i) - 1; - int j; - CallInfo *ci = L->ci; - int n = cast_int(ci->base - ci->func) - cl->p->numparams - 1; - if (b == LUA_MULTRET) { - Protect(luaD_checkstack(L, n)); - ra = RA(i); /* previous call may change the stack */ - b = n; - L->top = ra + n; - } - for (j = 0; j < b; j++) { - if (j < n) { - setobjs2s(L, ra + j, ci->base - n + j); - } - else { - setnilvalue(ra + j); - } - } - continue; - } - } - } -} diff --git a/uppdev/lua/src/lvm.h b/uppdev/lua/src/lvm.h deleted file mode 100644 index c070b5262..000000000 --- a/uppdev/lua/src/lvm.h +++ /dev/null @@ -1,36 +0,0 @@ -/* -** $Id: lvm.h,v 2.5 2005/08/22 18:54:49 roberto Exp $ -** Lua virtual machine -** See Copyright Notice in lua.h -*/ - -#ifndef lvm_h -#define lvm_h - - -#include "ldo.h" -#include "lobject.h" -#include "ltm.h" - - -#define tostring(L,o) ((ttype(o) == LUA_TSTRING) || (luaV_tostring(L, o))) - -#define tonumber(o,n) (ttype(o) == LUA_TNUMBER || \ - (((o) = luaV_tonumber(o,n)) != NULL)) - -#define equalobj(L,o1,o2) \ - (ttype(o1) == ttype(o2) && luaV_equalval(L, o1, o2)) - - -LUAI_FUNC int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r); -LUAI_FUNC int luaV_equalval (lua_State *L, const TValue *t1, const TValue *t2); -LUAI_FUNC const TValue *luaV_tonumber (const TValue *obj, TValue *n); -LUAI_FUNC int luaV_tostring (lua_State *L, StkId obj); -LUAI_FUNC void luaV_gettable (lua_State *L, const TValue *t, TValue *key, - StkId val); -LUAI_FUNC void luaV_settable (lua_State *L, const TValue *t, TValue *key, - StkId val); -LUAI_FUNC void luaV_execute (lua_State *L, int nexeccalls); -LUAI_FUNC void luaV_concat (lua_State *L, int total, int last); - -#endif diff --git a/uppdev/lua/src/lzio.c b/uppdev/lua/src/lzio.c deleted file mode 100644 index 39147f7aa..000000000 --- a/uppdev/lua/src/lzio.c +++ /dev/null @@ -1,80 +0,0 @@ -/* -** $Id: lzio.c,v 1.31 2005/06/03 20:15:29 roberto Exp $ -** a generic input stream interface -** See Copyright Notice in lua.h -*/ - - -#include - -#define lzio_c -#define LUA_CORE - -#include "lua.h" - -#include "llimits.h" -#include "lmem.h" -#include "lstate.h" -#include "lzio.h" - - -int luaZ_fill (ZIO *z) { - size_t size; - lua_State *L = z->L; - const char *buff; - lua_unlock(L); - buff = z->reader(L, z->data, &size); - lua_lock(L); - if (buff == NULL || size == 0) return EOZ; - z->n = size - 1; - z->p = buff; - return char2int(*(z->p++)); -} - - -int luaZ_lookahead (ZIO *z) { - if (z->n == 0) { - if (luaZ_fill(z) == EOZ) - return EOZ; - else { - z->n++; /* luaZ_fill removed first byte; put back it */ - z->p--; - } - } - return char2int(*z->p); -} - - -void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, void *data) { - z->L = L; - z->reader = reader; - z->data = data; - z->n = 0; - z->p = NULL; -} - - -/* --------------------------------------------------------------- read --- */ -size_t luaZ_read (ZIO *z, void *b, size_t n) { - while (n) { - size_t m; - if (luaZ_lookahead(z) == EOZ) - return n; /* return number of missing bytes */ - m = (n <= z->n) ? n : z->n; /* min. between n and z->n */ - memcpy(b, z->p, m); - z->n -= m; - z->p += m; - b = (char *)b + m; - n -= m; - } - return 0; -} - -/* ------------------------------------------------------------------------ */ -char *luaZ_openspace (lua_State *L, Mbuffer *buff, size_t n) { - if (n > buff->buffsize) { - if (n < LUA_MINBUFFER) n = LUA_MINBUFFER; - luaZ_resizebuffer(L, buff, n); - } - return buff->buffer; -} diff --git a/uppdev/lua/src/lzio.h b/uppdev/lua/src/lzio.h deleted file mode 100644 index e1db942f7..000000000 --- a/uppdev/lua/src/lzio.h +++ /dev/null @@ -1,67 +0,0 @@ -/* -** $Id: lzio.h,v 1.21 2005/05/17 19:49:15 roberto Exp $ -** Buffered streams -** See Copyright Notice in lua.h -*/ - - -#ifndef lzio_h -#define lzio_h - -#include "lua.h" - -#include "lmem.h" - - -#define EOZ (-1) /* end of stream */ - -typedef struct Zio ZIO; - -#define char2int(c) cast(int, cast(unsigned char, (c))) - -#define zgetc(z) (((z)->n--)>0 ? char2int(*(z)->p++) : luaZ_fill(z)) - -typedef struct Mbuffer { - char *buffer; - size_t n; - size_t buffsize; -} Mbuffer; - -#define luaZ_initbuffer(L, buff) ((buff)->buffer = NULL, (buff)->buffsize = 0) - -#define luaZ_buffer(buff) ((buff)->buffer) -#define luaZ_sizebuffer(buff) ((buff)->buffsize) -#define luaZ_bufflen(buff) ((buff)->n) - -#define luaZ_resetbuffer(buff) ((buff)->n = 0) - - -#define luaZ_resizebuffer(L, buff, size) \ - (luaM_reallocvector(L, (buff)->buffer, (buff)->buffsize, size, char), \ - (buff)->buffsize = size) - -#define luaZ_freebuffer(L, buff) luaZ_resizebuffer(L, buff, 0) - - -LUAI_FUNC char *luaZ_openspace (lua_State *L, Mbuffer *buff, size_t n); -LUAI_FUNC void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, - void *data); -LUAI_FUNC size_t luaZ_read (ZIO* z, void* b, size_t n); /* read next n bytes */ -LUAI_FUNC int luaZ_lookahead (ZIO *z); - - - -/* --------- Private Part ------------------ */ - -struct Zio { - size_t n; /* bytes still unread */ - const char *p; /* current position in buffer */ - lua_Reader reader; - void* data; /* additional data */ - lua_State *L; /* Lua state (for reader) */ -}; - - -LUAI_FUNC int luaZ_fill (ZIO *z); - -#endif diff --git a/uppdev/lua/src/print.c b/uppdev/lua/src/print.c deleted file mode 100644 index 05dbce68a..000000000 --- a/uppdev/lua/src/print.c +++ /dev/null @@ -1,227 +0,0 @@ -/* -** $Id: print.c,v 1.55 2006/05/31 13:30:05 lhf Exp $ -** print bytecodes -** See Copyright Notice in lua.h -*/ - -#include -#include - -#define luac_c -#define LUA_CORE - -#include "ldebug.h" -#include "lobject.h" -#include "lopcodes.h" -#include "lundump.h" - -#define PrintFunction luaU_print - -#define Sizeof(x) ((int)sizeof(x)) -#define VOID(p) ((const void*)(p)) - -static void PrintString(const TString* ts) -{ - const char* s=getstr(ts); - int n=ts->tsv.len; - int i; - putchar('"'); - for (i=0; ik[i]; - switch (ttype(o)) - { - case LUA_TNIL: - printf("nil"); - break; - case LUA_TBOOLEAN: - printf(bvalue(o) ? "true" : "false"); - break; - case LUA_TNUMBER: - printf(LUA_NUMBER_FMT,nvalue(o)); - break; - case LUA_TSTRING: - PrintString(rawtsvalue(o)); - break; - default: /* cannot happen */ - printf("? type=%d",ttype(o)); - break; - } -} - -static void PrintCode(const Proto* f) -{ - const Instruction* code=f->code; - int pc,n=f->sizecode; - for (pc=0; pc0) printf("[%d]\t",line); else printf("[-]\t"); - printf("%-9s\t",luaP_opnames[o]); - switch (getOpMode(o)) - { - case iABC: - printf("%d",a); - if (getBMode(o)!=OpArgN) printf(" %d",ISK(b) ? (-1-INDEXK(b)) : b); - if (getCMode(o)!=OpArgN) printf(" %d",ISK(c) ? (-1-INDEXK(c)) : c); - break; - case iABx: - if (getBMode(o)==OpArgK) printf("%d %d",a,-1-bx); else printf("%d %d",a,bx); - break; - case iAsBx: - if (o==OP_JMP) printf("%d",sbx); else printf("%d %d",a,sbx); - break; - } - switch (o) - { - case OP_LOADK: - printf("\t; "); PrintConstant(f,bx); - break; - case OP_GETUPVAL: - case OP_SETUPVAL: - printf("\t; %s", (f->sizeupvalues>0) ? getstr(f->upvalues[b]) : "-"); - break; - case OP_GETGLOBAL: - case OP_SETGLOBAL: - printf("\t; %s",svalue(&f->k[bx])); - break; - case OP_GETTABLE: - case OP_SELF: - if (ISK(c)) { printf("\t; "); PrintConstant(f,INDEXK(c)); } - break; - case OP_SETTABLE: - case OP_ADD: - case OP_SUB: - case OP_MUL: - case OP_DIV: - case OP_POW: - case OP_EQ: - case OP_LT: - case OP_LE: - if (ISK(b) || ISK(c)) - { - printf("\t; "); - if (ISK(b)) PrintConstant(f,INDEXK(b)); else printf("-"); - printf(" "); - if (ISK(c)) PrintConstant(f,INDEXK(c)); else printf("-"); - } - break; - case OP_JMP: - case OP_FORLOOP: - case OP_FORPREP: - printf("\t; to %d",sbx+pc+2); - break; - case OP_CLOSURE: - printf("\t; %p",VOID(f->p[bx])); - break; - case OP_SETLIST: - if (c==0) printf("\t; %d",(int)code[++pc]); - else printf("\t; %d",c); - break; - default: - break; - } - printf("\n"); - } -} - -#define SS(x) (x==1)?"":"s" -#define S(x) x,SS(x) - -static void PrintHeader(const Proto* f) -{ - const char* s=getstr(f->source); - if (*s=='@' || *s=='=') - s++; - else if (*s==LUA_SIGNATURE[0]) - s="(bstring)"; - else - s="(string)"; - printf("\n%s <%s:%d,%d> (%d instruction%s, %d bytes at %p)\n", - (f->linedefined==0)?"main":"function",s, - f->linedefined,f->lastlinedefined, - S(f->sizecode),f->sizecode*Sizeof(Instruction),VOID(f)); - printf("%d%s param%s, %d slot%s, %d upvalue%s, ", - f->numparams,f->is_vararg?"+":"",SS(f->numparams), - S(f->maxstacksize),S(f->nups)); - printf("%d local%s, %d constant%s, %d function%s\n", - S(f->sizelocvars),S(f->sizek),S(f->sizep)); -} - -static void PrintConstants(const Proto* f) -{ - int i,n=f->sizek; - printf("constants (%d) for %p:\n",n,VOID(f)); - for (i=0; isizelocvars; - printf("locals (%d) for %p:\n",n,VOID(f)); - for (i=0; ilocvars[i].varname),f->locvars[i].startpc+1,f->locvars[i].endpc+1); - } -} - -static void PrintUpvalues(const Proto* f) -{ - int i,n=f->sizeupvalues; - printf("upvalues (%d) for %p:\n",n,VOID(f)); - if (f->upvalues==NULL) return; - for (i=0; iupvalues[i])); - } -} - -void PrintFunction(const Proto* f, int full) -{ - int i,n=f->sizep; - PrintHeader(f); - PrintCode(f); - if (full) - { - PrintConstants(f); - PrintLocals(f); - PrintUpvalues(f); - } - for (i=0; ip[i],full); -} diff --git a/uppdev/mapbench/mapbench.cpp b/uppdev/mapbench/mapbench.cpp deleted file mode 100644 index f11ab5626..000000000 --- a/uppdev/mapbench/mapbench.cpp +++ /dev/null @@ -1,305 +0,0 @@ -#define NDEBUG - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace std; -using namespace Upp; - -namespace Upp { -NTL_MOVEABLE(std::string); // Illegal! -}; - -inline -unsigned GetHashValue(const std::string& x) -{ - unsigned hash = 2166136261U; - for(size_t i = 0; i != x.size(); ++i) - hash = 16777619 * hash + x[i]; - return hash; -} - -double StopTime() -{ - static int clk; - int q = clock(); - int n = q - clk; - clk = q; - return (double) n / CLOCKS_PER_SEC; -} - -void PrintLine() -{ - cout << "-------------------------------------------------------\n"; -} - -template -void benchmark_VectorMap(const Vector& key, const Vector& fkey, int count) -{ - StopTime(); - cout << count << " items\n"; - { - int i; - VectorMap map; - StopTime(); - for(i = 0; i < count; i++) - map.Add(key[i], i); - cout << "Adding done in " << StopTime() << " s\n"; - for(int j = 0; j < 2; j++) { - for(i = 0; i < count; i++) - if(map.Get(fkey[i]) != i) { - cout << "ERROR !\n"; - abort(); - } - cout << "Search done in " << StopTime() << " s\n"; - } - for(i = 0; i < count; i++) - map.UnlinkKey(key[i]); - cout << "Unlinking done in " << StopTime() << " s\n"; - for(i = 0; i < count; i++) - map.Put(key[i], i); - cout << "Putting done in " << StopTime() << " s\n"; - } -} - -template -void benchmark_stlmap(const Vector& key, const Vector& fkey, int count) -{ - StopTime(); - cout << count << " items\n"; - { - int i; - Map map; - StopTime(); - for(i = 0; i < count; i++) - map.insert(make_pair(key[i], i)); - cout << "Inserting done in " << StopTime() << " s\n"; - for(i = 0; i < count; i++) - if(map.find(fkey[i])->second != i) { - cout << "ERROR !\n"; - abort(); - } - cout << "Search done in " << StopTime() << " s\n"; - for(i = 0; i < count; i++) - map.erase(key[i]); - cout << "Removing keys done in " << StopTime() << " s\n"; - } -} - -CONSOLE_APP_MAIN -{ - int n; - string h = "tst"; - - Vector key; - for(int i = 0; i < 1000000; i++) { - char h[50]; -// sprintf(h, "%.10f", (double) i / 7); - key.Add(FormatIntHex(i)); - } - std::random_shuffle(key.Begin(), key.End()); - - for(int i = 0; i < 5; i++) - cout << key[i] << '\n'; - - Vector skey, skey2; - for(int i = 0; i < 1000000; i++) { - skey.Add(key[i]); - skey2.Add(key[i]); - } - -/* cout << "ADDING ELEMENTS TO VECTOR\n\n"; - - - StopTime(); - for(n = 0; n < 100; n++) { - vector v; - for(int i = 0; i < 50000; i++) - v.push_back(i); - } - cout << "Adding 50000 elements to vector done in " << StopTime() / 100 << " s\n"; - StopTime(); - for(n = 0; n < 100; n++) { - Vector v; - for(int i = 0; i < 50000; i++) - v.Add(i); - } - cout << "Adding 50000 elements to Vector done in " << StopTime() / 100 << " s\n"; - PrintLine(); - StopTime(); - for(n = 0; n < 10; n++) { - vector v; - for(int i = 0; i < 50000; i++) - v.push_back(key[i]); - } - cout << "Adding 50000 elements to vector done in " << StopTime() / 10 << " s\n"; - StopTime(); - for(n = 0; n < 10; n++) { - Vector v; - for(int i = 0; i < 50000; i++) - v.Add(key[i]); - } - cout << "Adding 50000 elements to Vector done in " << StopTime() / 10 << " s\n"; - PrintLine(); - - StopTime(); - for(n = 0; n < 1000; n++) - { - vector< vector > v; - for(int i = 0; i < 100; i++) { - vector x; - for(int q = 0; q < 100; q++) - x.push_back(q); - v.push_back(x); - } - } - cout << "Adding 100x100 elements to vector< vector > done in " << StopTime() << " ms\n"; - StopTime(); - for(n = 0; n < 1000; n++) - { - vector< vector > v; - for(int i = 0; i < 100; i++) { - vector x; - v.push_back(x); - vector& w = v.back(); - for(int q = 0; q < 100; q++) - w.push_back(q); - } - } - cout << "Adding 100x100 elements to vector< vector > (smart version) done in " << StopTime() << " ms\n"; - StopTime(); - for(n = 0; n < 1000; n++) - { - Vector< Vector > v; - for(int i = 0; i < 100; i++) { - Vector& w = v.Add(); - for(int q = 0; q < 100; q++) - w.Add(q); - } - } - cout << "Adding 100x100 elements to Vector< Vector > done in " << StopTime() << " ms\n"; - PrintLine(); - - StopTime(); - for(n = 0; n < 1000; n++) - { - vector< vector > v; - for(int i = 0; i < 100; i++) { - vector x; - for(int q = 0; q < 100; q++) - x.push_back(key[q]); - v.push_back(x); - } - } - cout << "Adding 100x100 elements to vector< vector > done in " << StopTime() << " ms\n"; - StopTime(); - for(n = 0; n < 1000; n++) - { - vector< vector > v; - for(int i = 0; i < 100; i++) { - vector x; - v.push_back(x); - vector& w = v.back(); - for(int q = 0; q < 100; q++) - w.push_back(key[q]); - } - } - cout << "Adding 100x100 elements to vector< vector > (smart version) done in " << StopTime() << " ms\n"; - StopTime(); - for(n = 0; n < 1000; n++) - { - Vector< Vector > v; - for(int i = 0; i < 100; i++) { - Vector& w = v.Add(); - for(int q = 0; q < 100; q++) - w.Add(key[q]); - } - } - cout << "Adding 100x100 elements to Vector< Vector > done in " << StopTime() << " ms\n"; - PrintLine(); -*/ - -// return; -/* - StopTime(); - { - for(int i = 0; i < 1000; i++) { - int i; - deque d; - for(i = 0; i < 50000; i++) - d.push_front(i); - for(i = 0; i < 50000; i++) { - d.pop_back(); - d.push_front(i); - } - for(i = 0; i < 50000; i++) - d.pop_back(); - } - } - cout << "Passing 150000 elements through deque done in " << StopTime() << " ms\n"; - - StopTime(); - { - for(int i = 0; i < 1000; i++) { - int i; - BiVector d; - for(i = 0; i < 50000; i++) - d.AddHead(i); - for(i = 0; i < 50000; i++) { - d.DropTail(); - d.AddHead(i); - } - for(i = 0; i < 50000; i++) - d.DropTail(); - } - } - cout << "Passing 150000 elements through BiVector done in " << StopTime() << " ms\n"; -*/ - cout << "\n\nMAP BENCHMARKS\n\n"; -/* { - Vector key; - for(int i = 0; i < 1000000; i++) - key.Add(i); - std::random_shuffle(key.Begin(), key.End()); - - cout << "\nVectorMap benchmark "; - benchmark_VectorMap(key, 1000000); - cout << "\nmap benchmark "; - benchmark_map(key, 1000000); - - PrintLine(); - - cout << "\nVectorMap benchmark "; - benchmark_VectorMap(key, 100000); - cout << "\nmap benchmark "; - benchmark_map(key, 100000); - } - PrintLine(); -*/ - { - cout << "\nVectorMap benchmark "; - benchmark_VectorMap(skey, skey2, 1000000); - cout << "\nmap benchmark "; - benchmark_stlmap< string, map >(key, 1000000); - cout << "\nmap benchmark "; - benchmark_stlmap< String, map >(skey, 1000000); - - PrintLine(); - - cout << "\nVectorMap benchmark "; - benchmark_VectorMap(skey, skey2, 100000); - cout << "\nmap benchmark "; - benchmark_stlmap< string, map >(key, 100000); - cout << "\nmap benchmark "; - benchmark_stlmap< string, map >(skey, 100000); - } -} diff --git a/uppdev/mapbench/mapbench.upp b/uppdev/mapbench/mapbench.upp deleted file mode 100644 index fdcebfb6b..000000000 --- a/uppdev/mapbench/mapbench.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - Core; - -file - mapbench.cpp; - -mainconfig - "" = ""; - diff --git a/uppdev/mcore/mcore.cpp b/uppdev/mcore/mcore.cpp deleted file mode 100644 index 5f958268c..000000000 --- a/uppdev/mcore/mcore.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include - -CONSOLE_APP_MAIN -{ - Parallel m; - for(int i = 0; i < 100; i++) - m * callback1(Test, i); - m.Wait(); -} diff --git a/uppdev/mcore/mcore.upp b/uppdev/mcore/mcore.upp deleted file mode 100644 index 2c29e53ce..000000000 --- a/uppdev/mcore/mcore.upp +++ /dev/null @@ -1,8 +0,0 @@ -uses - Core; - -file - mcore.cpp; - -mainconfig - "" = ""; diff --git a/uppdev/md5/init b/uppdev/md5/init deleted file mode 100644 index 4b8068cb8..000000000 --- a/uppdev/md5/init +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _md5_icpp_init_stub -#define _md5_icpp_init_stub -#include "Core/init" -#include "Web/init" -#include "plugin\zip/init" -#endif diff --git a/uppdev/md5/md5.cpp b/uppdev/md5/md5.cpp deleted file mode 100644 index 65b613836..000000000 --- a/uppdev/md5/md5.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include -#include - -using namespace Upp; - -CONSOLE_APP_MAIN -{ - String x = MD5Digest("alajos"); - LOGHEXDUMP(x, x.GetCount()); - String r; - for(int i = 0; i < x.GetCount(); i++) { - r << FormatIntHex((byte)x[i], 2); - } - DUMP(r); -} diff --git a/uppdev/md5/md5.upp b/uppdev/md5/md5.upp deleted file mode 100644 index 8199b1f77..000000000 --- a/uppdev/md5/md5.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - Core, - Web; - -file - md5.cpp; - -mainconfig - "" = ""; diff --git a/uppdev/memset/memset.cpp b/uppdev/memset/memset.cpp deleted file mode 100644 index a90feab76..000000000 --- a/uppdev/memset/memset.cpp +++ /dev/null @@ -1,176 +0,0 @@ -#include - -#include - -void Set(dword *t, dword value, int count) -{ - while(count--) - *t++ = value; -} - -void Set2(dword *t, dword value, int count) -{ - count >>= 3; - while(count--) { - t[0] = value; - t[1] = value; - t[2] = value; - t[3] = value; - t[4] = value; - t[5] = value; - t[6] = value; - t[7] = value; - t += 8; - } -} - -void Set3(dword *t, dword value, int count) -{ - count >>= 4; - while(count--) { - t[0] = value; - t[1] = value; - t[2] = value; - t[3] = value; - t[4] = value; - t[5] = value; - t[6] = value; - t[7] = value; - t[8] = value; - t[9] = value; - t[10] = value; - t[11] = value; - t[12] = value; - t[13] = value; - t[14] = value; - t[15] = value; - t += 16; - } -} - -void SetMMX(dword *_t, dword value, int count) -{ - __m64 val = _mm_set_pi32(value, value); - count >>= 3; - __m64 *t = (__m64 *)_t; - while(count--) { - t[0] = val; - t[1] = val; - t[2] = val; - t[3] = val; - t += 4; - } - _mm_empty(); -} - -void SetMMX2(dword *_t, dword value, int count) -{ - __m64 val = _mm_set_pi32(value, value); - count >>= 3; - __m64 *t = (__m64 *)_t; - while(count--) { - _mm_stream_pi(t + 0, val); - _mm_stream_pi(t + 1, val); - _mm_stream_pi(t + 2, val); - _mm_stream_pi(t + 3, val); - t += 4; - } - _mm_sfence(); - _mm_empty(); -} - -void SetMMX3(dword *_t, dword value, int count) -{ - __m64 val = _mm_set_pi32(value, value); - count >>= 4; - __m64 *t = (__m64 *)_t; - while(count--) { - t[0] = val; - t[1] = val; - t[2] = val; - t[3] = val; - t[4] = val; - t[5] = val; - t[6] = val; - t[7] = val; - t += 8; - } - _mm_empty(); -} - -void SetSSE2(dword *_t, dword value, int count) -{ - __m128i val; - dword *x = (dword *)&val; - x[0] = value; - x[1] = value; - x[2] = value; - x[3] = value; - count >>= 4; - __m128i *t = (__m128i *)_t; - __m128i v1 = val; - while(count--) { - t[0] = v1; - t[1] = v1; - t[2] = v1; - t[3] = v1; - t += 4; - } -} - -void SetSSE22(dword *_t, dword value, int count) -{ - __m128i val; - dword *x = (dword *)&val; - x[0] = value; - x[1] = value; - x[2] = value; - x[3] = value; - count >>= 5; - __m128i *t = (__m128i *)_t; - __m128i v1 = val; - while(count--) { - t[0] = v1; - t[1] = v1; - t[2] = v1; - t[3] = v1; - t[5] = v1; - t[6] = v1; - t[7] = v1; - t[8] = v1; - t += 8; - } -} - -dword target[1024*1024]; - -void Test(const char *name, void (*set)(dword *t, dword value, int count), int kb) -{ - TimeStop tm; - int N = (kb < 256 ? 1500 : 500) * 1024 / kb; - int m = kb * 1024; - for(int i = 0; i < N; i++) - (*set)(target, 123456, m); - double ms = (double)tm.Elapsed() / N; - RLOG("\t" << name << ": " << 1000 / max(ms, 0.001) * 4 * kb / 1024 << " MB/s"); - Cout() << name << "\n"; -} - -CONSOLE_APP_MAIN -{ -// for(int i = 4; i <= 512; i = 150 * i / 100) { - int i = 1024; - { - RLOG(4 * i << "KB"); - Cout() << 4 * i << "KB \n"; - Test("Set", Set, i); - Test("Set2", Set2, i); - Test("Set3", Set3, i); - Test("SetMMX", SetMMX, i); - Test("SetMMX2", SetMMX2, i); - Test("SetMMX3", SetMMX3, i); - Test("SetSSE2", SetSSE2, i); - Test("SetSSE22", SetSSE22, i); - RLOG("-------------"); - } -} diff --git a/uppdev/memset/memset.upp b/uppdev/memset/memset.upp deleted file mode 100644 index ac9daf9fa..000000000 --- a/uppdev/memset/memset.upp +++ /dev/null @@ -1,7 +0,0 @@ -uses Core; - -file - "memset.cpp"; - -mainconfig - "" = ""; diff --git a/uppdev/menubug/main.cpp b/uppdev/menubug/main.cpp deleted file mode 100644 index 664ba330b..000000000 --- a/uppdev/menubug/main.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include "menubug.h" - - - -MenuBug::MenuBug() -{ - -} - -void MenuBug::RightDown(Point pt, dword keyflags) -{ - MenuBar menu; - menu.Add("Pokus", Callback()); - menu.Execute(pt + GetScreenView().TopLeft()); -} - -GUI_APP_MAIN -{ - MemoryWatch(0x10408C8); - MenuBug().Run(); -} diff --git a/uppdev/menubug/menubug.h b/uppdev/menubug/menubug.h deleted file mode 100644 index 9bbdfda21..000000000 --- a/uppdev/menubug/menubug.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _menubug_menubug_h -#define _menubug_menubug_h - -#include - -using namespace Upp; - -class MenuBug : public TopWindow { -public: - typedef MenuBug CLASSNAME; - MenuBug(); - - virtual void RightDown(Point pt, dword keyflags); -}; - -#endif diff --git a/uppdev/menubug/menubug.upp b/uppdev/menubug/menubug.upp deleted file mode 100644 index f08938bbc..000000000 --- a/uppdev/menubug/menubug.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - CtrlLib; - -file - menubug.h, - main.cpp; - -mainconfig - "" = "GUI"; diff --git a/uppdev/mimetab/init b/uppdev/mimetab/init deleted file mode 100644 index 3b8a4d313..000000000 --- a/uppdev/mimetab/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _mimetab_icpp_init_stub -#define _mimetab_icpp_init_stub -#include "Core/init" -#endif diff --git a/uppdev/mimetab/mime.txt b/uppdev/mimetab/mime.txt deleted file mode 100644 index 2b1bea03d..000000000 --- a/uppdev/mimetab/mime.txt +++ /dev/null @@ -1,160 +0,0 @@ - .ai - application/postscript - .aif - audio/x-aiff - .aifc - audio/x-aiff - .aiff - audio/x-aiff - .asc - text/plain - .au - audio/basic - .avi - video/x-msvideo - .bcpio - application/x-bcpio - .bin - application/octet-stream - .c - text/plain - .cc - text/plain - .ccad - application/clariscad - .cdf - application/x-netcdf - .class - application/octet-stream - .cpio - application/x-cpio - .cpt - application/mac-compactpro - .csh - application/x-csh - .css - text/css - .dcr - application/x-director - .dir - application/x-director - .dms - application/octet-stream - .doc - application/msword - .drw - application/drafting - .dvi - application/x-dvi - .dwg - application/acad - .dxf - application/dxf - .dxr - application/x-director - .eps - application/postscript - .etx - text/x-setext - .exe - application/octet-stream - .ez - application/andrew-inset - .f - text/plain - .f90 - text/plain - .fli - video/x-fli - .gif - image/gif - .gtar - application/x-gtar - .gz - application/x-gzip - .h - text/plain - .hdf - application/x-hdf - .hh - text/plain - .hqx - application/mac-binhex40 - .htm - text/html - .html - text/html - .ice - x-conference/x-cooltalk - .ief - image/ief - .iges - model/iges - .igs - model/iges - .ips - application/x-ipscript - .ipx - application/x-ipix - .jpe - image/jpeg - .jpeg - image/jpeg - .jpg - image/jpeg - .js - application/x-javascript - .kar - audio/midi - .latex - application/x-latex - .lha - application/octet-stream - .lsp - application/x-lisp - .lzh - application/octet-stream - .m - text/plain - .man - application/x-troff-man - .me - application/x-troff-me - .mesh - model/mesh - .mid - audio/midi - .midi - audio/midi - .mif - application/vnd.mif - .mime - www/mime - .mov - video/quicktime - .movie - video/x-sgi-movie - .mp2 - audio/mpeg - .mp3 - audio/mpeg - .mpe - video/mpeg - .mpeg - video/mpeg - .mpg - video/mpeg - .mpga - audio/mpeg - .ms - application/x-troff-ms - .msh - model/mesh - .nc - application/x-netcdf - .oda - application/oda - .pbm - image/x-portable-bitmap - .pdb - chemical/x-pdb - .pdf - application/pdf - .pgm - image/x-portable-graymap - .pgn - application/x-chess-pgn - .png - image/png - .pnm - image/x-portable-anymap - .pot - application/mspowerpoint - .ppm - image/x-portable-pixmap - .pps - application/mspowerpoint - .ppt - application/mspowerpoint - .ppz - application/mspowerpoint - .pre - application/x-freelance - .prt - application/pro_eng - .ps - application/postscript - .qt - video/quicktime - .ra - audio/x-realaudio - .ram - audio/x-pn-realaudio - .ras - image/cmu-raster - .rgb - image/x-rgb - .rm - audio/x-pn-realaudio - .roff - application/x-troff - .rpm - audio/x-pn-realaudio-plugin - .rtf - text/rtf - .rtx - text/richtext - .scm - application/x-lotusscreencam - .set - application/set - .sgm - text/sgml - .sgml - text/sgml - .sh - application/x-sh - .shar - application/x-shar - .silo - model/mesh - .sit - application/x-stuffit - .skd - application/x-koan - .skm - application/x-koan - .skp - application/x-koan - .skt - application/x-koan - .smi - application/smil - .smil - application/smil - .snd - audio/basic - .sol - application/solids - .spl - application/x-futuresplash - .src - application/x-wais-source - .step - application/STEP - .stl - application/SLA - .stp - application/STEP - .sv4cpio - application/x-sv4cpio - .sv4crc - application/x-sv4crc - .swf - application/x-shockwave-flash - .t - application/x-troff - .tar - application/x-tar - .tcl - application/x-tcl - .tex - application/x-tex - .texi - application/x-texinfo - .texinfo - application/x-texinfo - .tif - image/tiff - .tiff - image/tiff - .tr - application/x-troff - .tsi - audio/TSP-audio - .tsp - application/dsptype - .tsv - text/tab-separated-values - .txt - text/plain - .unv - application/i-deas - .ustar - application/x-ustar - .vcd - application/x-cdlink - .vda - application/vda - .viv - video/vnd.vivo - .vivo - video/vnd.vivo - .vrml - model/vrml - .wav - audio/x-wav - .wrl - model/vrml - .xbm - image/x-xbitmap - .xlc - application/vnd.ms-excel - .xll - application/vnd.ms-excel - .xlm - application/vnd.ms-excel - .xls - application/vnd.ms-excel - .xlw - application/vnd.ms-excel - .xml - text/xml - .xpm - image/x-xpixmap - .xwd - image/x-xwindowdump - .xyz - chemical/x-pdb - .zip - application/zip diff --git a/uppdev/mimetab/mimetab.cpp b/uppdev/mimetab/mimetab.cpp deleted file mode 100644 index 3ac3cdf81..000000000 --- a/uppdev/mimetab/mimetab.cpp +++ /dev/null @@ -1,80 +0,0 @@ -#include - -using namespace Upp; - -struct ExtToMime { - Index major; - Index minor; - VectorMap map; - - void Load(const char *file); - void Refresh(); - bool GetMime(const String& ext, String& maj, String& min); -}; - -void ExtToMime::Load(const char *fn) -{ - FileIn in(fn); - if(in) - while(!in.IsEof()) { - String ln = TrimLeft(TrimRight(in.GetLine())); - if(ln[0] != '#') { - int q = ln.Find(':'); - if(q >= 0) { - String h = ln.Mid(0, q); - int w = h.Find('/'); - if(w >= 0) { - int x = ln.Find("*.", q); - if(x >= 0) { - String ext = ln.Mid(x + 2); - if(ext.GetCount() && map.Find(ext) < 0) - map.Add(ext, MAKELONG(minor.FindAdd(h.Mid(w + 1)), major.FindAdd(h.Mid(0, w)))); - } - } - } - } - } -} - -void ExtToMime::Refresh() -{ - major.Clear(); - minor.Clear(); - map.Clear(); - Load("/usr/local/share/mime/globs"); - Load("/usr/share/mime/globs"); -} - -bool ExtToMime::GetMime(const String& ext, String& maj, String& min) -{ - ONCELOCK { - Refresh(); - } - int q = map.Find(ext); - if(q < 0) - return false; - dword x = map[q]; - maj = major[HIWORD(x)]; - min = minor[LOWORD(x)]; -} - -String GetMime(const String& ext) -{ - String a, b; - if(Single().GetMime(ext, a, b)) - return a + '/' + b; - else - return Null; -} - -CONSOLE_APP_MAIN -{ - DUMP(GetMime("skr")); - DUMP(GetMime("ai")); - DUMP(GetMime("jpg")); - DUMP(GetMime("bcpio")); - DUMP(GetMime("jpeg")); - DUMP(GetMime("zip")); - DUMP(GetMime("xyz")); - DUMP(GetMime("basdf")); -} diff --git a/uppdev/mimetab/mimetab.upp b/uppdev/mimetab/mimetab.upp deleted file mode 100644 index 365e9e470..000000000 --- a/uppdev/mimetab/mimetab.upp +++ /dev/null @@ -1,10 +0,0 @@ -uses - Core; - -file - mime.txt, - mimetab.cpp; - -mainconfig - "" = ""; - diff --git a/uppdev/modeless/main.cpp b/uppdev/modeless/main.cpp deleted file mode 100644 index b1eeeb0b8..000000000 --- a/uppdev/modeless/main.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include - -GUI_APP_MAIN -{ - TopWindow winA, winB; - TopWindow win; - - win.OpenMain(); - winA.SetRect(100, 100, 100, 100); - winA.Open(&win); - winB.SetRect(100, 100, 100, 100); - winB.Open(&win); - EditField f; - winA.Add(f.SizePos()); - win.Run(); -} diff --git a/uppdev/modeless/modeless.upp b/uppdev/modeless/modeless.upp deleted file mode 100644 index 6284f1903..000000000 --- a/uppdev/modeless/modeless.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - CtrlLib; - -file - - "main.cpp"; - -mainconfig - "" = "GUI ST"; diff --git a/uppdev/mt/init b/uppdev/mt/init deleted file mode 100644 index 35ffb6e33..000000000 --- a/uppdev/mt/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _mt_icpp_init_stub -#define _mt_icpp_init_stub -#include "Core/init" -#endif diff --git a/uppdev/mt/mt.cpp b/uppdev/mt/mt.cpp deleted file mode 100644 index f9be4a87c..000000000 --- a/uppdev/mt/mt.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include - -using namespace Upp; - -CONSOLE_APP_MAIN -{ - Mutex m; - static StaticMutex n; - for(int i = 0; i < 10000000; i++) { - { - RTIMING("Mutex::Enter"); - m.Enter(); - m.Leave(); - } - { - RTIMING("Mutex::TryEnter"); - if(m.TryEnter()) - m.Leave(); - } - { - RTIMING("StaticMutex::Enter"); - __BREAK__; - n.Enter(); - n.Leave(); - } - { - RTIMING("StaticMutex::TryEnter"); - if(n.TryEnter()) - n.Leave(); - } - } -} diff --git a/uppdev/mt/mt.upp b/uppdev/mt/mt.upp deleted file mode 100644 index f5feff001..000000000 --- a/uppdev/mt/mt.upp +++ /dev/null @@ -1,12 +0,0 @@ -optimize_speed; - -uses - Core; - -file - mt.cpp; - -mainconfig - "" = "MT", - "" = ""; - diff --git a/uppdev/mtbug/init b/uppdev/mtbug/init deleted file mode 100644 index beda730c0..000000000 --- a/uppdev/mtbug/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _console_mtbug_icpp_init_stub -#define _console_mtbug_icpp_init_stub -#include "Core/init" -#endif diff --git a/uppdev/mtbug/mtbug.cpp b/uppdev/mtbug/mtbug.cpp deleted file mode 100644 index 740234ceb..000000000 --- a/uppdev/mtbug/mtbug.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include - -using namespace Upp; - -static const int ITEMS = 10000; -static const int PASSES = 5; -static const int THREADS = 4; - -volatile Atomic items[ITEMS]; - -static void ThreadProc(volatile Atomic *item, bool *finish) -{ - AtomicInc(*item); - *finish = true; -} - -static void TryMain() -{ - for(int pass = 1; pass <= PASSES; pass++) { - puts(NFormat("pass #%d", pass)); - fflush(stdout); - for(int i = 0; i < ITEMS; i += THREADS) { - if(i % (100 * THREADS) == 0) { - puts(NFormat("i = %d", i)); - fflush(stdout); - } - bool thread_finished[THREADS]; - for(int t = 0; t < THREADS; t++) { - if(i + t < ITEMS) { - thread_finished[t] = false; - Thread().Run(callback2(&ThreadProc, &items[i + t], &thread_finished[t])); - } - else - thread_finished[t] = true; - } - for(;;) { - bool done = true; - for(int t = 0; t < THREADS; t++) - if(!thread_finished[t]) { - done = false; - break; - } - if(done) - break; - Sleep(10); - } - } - for(int i = 0; i < ITEMS; i++) - if(items[i] != pass) - RLOG("pass #" << pass << ": error at [" << i << "] = " << (int)items[i]); - } -} - -CONSOLE_APP_MAIN { - TryMain(); -} diff --git a/uppdev/mtbug/mtbug.upp b/uppdev/mtbug/mtbug.upp deleted file mode 100644 index 01069e594..000000000 --- a/uppdev/mtbug/mtbug.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - Core; - -file - mtbug.cpp; - -mainconfig - "" = "MT"; - diff --git a/uppdev/multimap/multimap.cpp b/uppdev/multimap/multimap.cpp deleted file mode 100644 index 2160d7b1b..000000000 --- a/uppdev/multimap/multimap.cpp +++ /dev/null @@ -1,41 +0,0 @@ -#include -#include -#include -#include -using namespace std; - -CONSOLE_APP_MAIN -{ - string filename; - multimap wpairs; - typedef multimap::iterator mit; - wpairs.clear(); - wpairs.insert(pair("butor","asztal")); - wpairs.insert(pair("butor","szek")); - wpairs.insert(pair("butor","szekreny")); - wpairs.insert(pair("gyumolcs","alma")); - wpairs.insert(pair("gyumolcs","barack")); - wpairs.insert(pair("gyumolcs","cseresznye")); - wpairs.insert(pair("gyumolcs","korte")); - wpairs.insert(pair("gyumolcs","meggy")); - wpairs.insert(pair("gyumolcs","szilva")); - wpairs.insert(pair("fa","fenyo")); - wpairs.insert(pair("fa","hars")); - wpairs.insert(pair("fa","nyar")); - wpairs.insert(pair("fa","nyir")); - wpairs.insert(pair("fa","ostorfa")); - wpairs.insert(pair("fa","platan")); - wpairs.insert(pair("fa","tolgy")); - wpairs.insert(pair("aaa","ak")); - wpairs.insert(pair("bbb","bek")); - wpairs.insert(pair("ccc","cek")); - wpairs.insert(pair("ddd","dek")); - wpairs.insert(pair("ooo","ok")); - wpairs.insert(pair("zzz","zek")); - string b = "fa"; - mit lower = wpairs.lower_bound(b); - mit upper = wpairs.upper_bound(b); - cout << lower->second << endl; - cout << upper->second << endl; - cout << wpairs.count(b); -} diff --git a/uppdev/multimap/multimap.upp b/uppdev/multimap/multimap.upp deleted file mode 100644 index abd3a2ca4..000000000 --- a/uppdev/multimap/multimap.upp +++ /dev/null @@ -1,7 +0,0 @@ -uses Core; - -file - "multimap.cpp"; - -mainconfig - "" = "CONSOLE ST"; diff --git a/uppdev/myProblem/init b/uppdev/myProblem/init deleted file mode 100644 index 719082536..000000000 --- a/uppdev/myProblem/init +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef _myProblem_icpp_init_stub -#define _myProblem_icpp_init_stub -#include "CtrlLib/init" -#include "GLCtrl/init" -#endif diff --git a/uppdev/myProblem/main.cpp b/uppdev/myProblem/main.cpp deleted file mode 100644 index 8556bca9d..000000000 --- a/uppdev/myProblem/main.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "myProblem.h" - -GUI_APP_MAIN -{ - TopWindow a; - Splitter b; - WithmyProblemLayout c; - CtrlLayout(c); - LineEdit d; - b.Horz(d, c); - a.Add(b); - a.Run(); -} - diff --git a/uppdev/myProblem/myProblem.h b/uppdev/myProblem/myProblem.h deleted file mode 100644 index 1baae3988..000000000 --- a/uppdev/myProblem/myProblem.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _myProblem_myProblem_h -#define _myProblem_myProblem_h - -#include -#include - -using namespace Upp; - -#define LAYOUTFILE -#include - -#endif - diff --git a/uppdev/myProblem/myProblem.lay b/uppdev/myProblem/myProblem.lay deleted file mode 100644 index 29e129954..000000000 --- a/uppdev/myProblem/myProblem.lay +++ /dev/null @@ -1,4 +0,0 @@ -LAYOUT(myProblemLayout, 412, 320) - ITEM(GLCtrl, opengl, HSizePosZ(20, 4).VSizePosZ(20, 4)) -END_LAYOUT - diff --git a/uppdev/myProblem/myProblem.upp b/uppdev/myProblem/myProblem.upp deleted file mode 100644 index f9dbb2e03..000000000 --- a/uppdev/myProblem/myProblem.upp +++ /dev/null @@ -1,12 +0,0 @@ -uses - CtrlLib, - GLCtrl; - -file - myProblem.h, - main.cpp, - myProblem.lay; - -mainconfig - "" = "GUI"; - diff --git a/uppdev/n1/main.cpp b/uppdev/n1/main.cpp deleted file mode 100644 index be6d244bb..000000000 --- a/uppdev/n1/main.cpp +++ /dev/null @@ -1,111 +0,0 @@ -#include - -#include -#include -#include -#include -#include -#include - -struct MyItem { - virtual void Process(XmlParser& p); - virtual void AddTo(Ctrl& parent); - virtual void Remove(); - virtual String GetResults(); -}; - -struct MyOptionItem : MyItem { - Option x; - - virtual String GetResults() { - return x ? "on" : "off"; - } -}; - -struct MyButton : MyItem { - Button button; - - virtual void Process(XmlParser& p) { - - } - virtual void AddTo(Ctrl& parent) { - parent.Add(button); - } - virtual void Remove() { - button.Remove(); - } - - virtual String GetResults() { - return Null; - } -} - -struct TheGui { - Index ids; - Array items; - Index parent_ids; - - int selected; - - void RemoveWithParent(const String& id, Vector& remove) { - for(;;) { - int q = parent_ids.Find(id); - if(q < 0) - break; - RemoveWithParent(ids[q]); - } - ids.Unlink(q); - remove.Add(q); - parent_ids.Unlinke(q); - } - -public: - void Select(const String& id) { - selected = ids.Find(id); - } - - void Remove(const String& parent); - - void RemoveSelected() { - if(selected < 0) - RemoveWithParent(ids[selected]); - } - - TheGui() { - selected = -1; - } -}; - - -void NotesCheck(STATUS nError) -{ - if(nError == NOERROR) - return; - char h[256]; - OSLoadString(GetModuleHandle(NULL), ERR(nError), h, 255); - Exclamation(h); - abort(); -} - -GUI_APP_MAIN -{ - if (NotesInitExtended(__argc, __argv) != NOERROR) { - Exclamation("Unable to Initialize Notes!"); - return; - } - - char h[256]; - -// OSPathNetConstruct(NULL, "Notes3/MU_HP", "DOKUMENT\\LIB_test.nsf", h); - - DUMP(h); - - DBHANDLE hNotesDB; - NotesCheck(NSFDbOpen("c:/notesapi/notedata/intro.nsf", &hNotesDB)); - NotesCheck(NSFDbInfoGet(hNotesDB, h)); - - DUMP(h); - NotesCheck(NSFDbClose(hNotesDB)); - - NotesTerm(); -} diff --git a/uppdev/n1/n1.upp b/uppdev/n1/n1.upp deleted file mode 100644 index 18a8f4195..000000000 --- a/uppdev/n1/n1.upp +++ /dev/null @@ -1,12 +0,0 @@ -uses - CtrlLib; - -library "notes.lib"; - -options "-DNT"; - -file - main.cpp; - -mainconfig - "" = "GUI ST"; diff --git a/uppdev/namespace/main.cpp b/uppdev/namespace/main.cpp deleted file mode 100644 index 3a1ff7c88..000000000 --- a/uppdev/namespace/main.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include - -struct Test : Upp::TopWindow { - Upp::EditString text; -}; - -GUI_APP_MAIN -{ - Upp::PromptOK("OK!"); -} diff --git a/uppdev/namespace/namespace.cpp b/uppdev/namespace/namespace.cpp deleted file mode 100644 index 41bccd6b1..000000000 --- a/uppdev/namespace/namespace.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include - -#include - -namespace upp { - -template -struct ImTest { -// friend void Foo(T& x) {} -}; - -struct string { int x; }; - -}; - -template -struct ImTest2 { -public: - friend void Foo(T& x) {} -}; - -using namespace upp; -using namespace std; - -CONSOLE_APP_MAIN -{ -// upp::ImTest alfa; - upp::string x; - std::string y; - -// ImTest2 beta; -// int x; -/// Foo(x); -// double y; -// Foo(y); -} diff --git a/uppdev/namespace/namespace.upp b/uppdev/namespace/namespace.upp deleted file mode 100644 index 653e41eae..000000000 --- a/uppdev/namespace/namespace.upp +++ /dev/null @@ -1,8 +0,0 @@ -uses - CtrlLib; - -file - main.cpp; - -mainconfig - "" = "GUI"; diff --git a/uppdev/nested/test/main.cpp b/uppdev/nested/test/main.cpp deleted file mode 100644 index b1618b542..000000000 --- a/uppdev/nested/test/main.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include "test.h" - - - -test::test() -{ - CtrlLayout(*this, "Window title"); -} - -GUI_APP_MAIN -{ - test().Run(); -} diff --git a/uppdev/nested/test/nested/test.lay b/uppdev/nested/test/nested/test.lay deleted file mode 100644 index f02ff99f0..000000000 --- a/uppdev/nested/test/nested/test.lay +++ /dev/null @@ -1,4 +0,0 @@ - -LAYOUT(testLayout, 200, 100) - -END_LAYOUT diff --git a/uppdev/nested/test/nested/test.upp b/uppdev/nested/test/nested/test.upp deleted file mode 100644 index 67d70bf8a..000000000 --- a/uppdev/nested/test/nested/test.upp +++ /dev/null @@ -1,12 +0,0 @@ -uses - CtrlLib; - -file - "nested/test.h" - , main.cpp - , "nested/test.lay" - -; - -mainconfig - "" = "GUI"; diff --git a/uppdev/nested/test/test.h b/uppdev/nested/test/test.h deleted file mode 100644 index 8a1f04c88..000000000 --- a/uppdev/nested/test/test.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef _test_test_h -#define _test_test_h - -#include - -#define LAYOUTFILE -#include - - - -class test : public WithtestLayout { -public: - typedef test CLASSNAME; - test(); -}; - -#endif diff --git a/uppdev/nested/test/test.upp b/uppdev/nested/test/test.upp deleted file mode 100644 index e69de29bb..000000000 diff --git a/uppdev/odbctest/init b/uppdev/odbctest/init deleted file mode 100644 index 78a3537b2..000000000 --- a/uppdev/odbctest/init +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef _odbctest_icpp_init_stub -#define _odbctest_icpp_init_stub -#include "Core/init" -#include "ODBC/init" -#endif diff --git a/uppdev/odbctest/odbctest.cpp b/uppdev/odbctest/odbctest.cpp deleted file mode 100644 index d85dbd551..000000000 --- a/uppdev/odbctest/odbctest.cpp +++ /dev/null @@ -1,134 +0,0 @@ -#include -#include -#include - -#define MAXDSN 25 -#define MAXUID 25 -#define MAXAUTHSTR 25 -#define MAXBUFLEN 255 -#define BUFFERSIZE 450 - -using namespace Upp; - -void ProcessLogMessages(HDBC hdbc, HSTMT hstmt, char *logstring) -{ - SQLCHAR SqlState[6], Msg[SQL_MAX_MESSAGE_LENGTH]; - SQLINTEGER NativeError; - SQLSMALLINT MsgLen; - if(SQLGetDiagRec(SQL_HANDLE_DBC, hdbc, 1, SqlState, &NativeError, - Msg, sizeof(Msg), &MsgLen) != SQL_NO_DATA) { - DDUMP((char *)SqlState); - DDUMP((char *)Msg); - } - LOG(logstring); -} - - -CONSOLE_APP_MAIN -{ - HENV henv = SQL_NULL_HENV; - HDBC hdbc1 = SQL_NULL_HDBC; - HSTMT hstmt1 = SQL_NULL_HSTMT; - char logstring[MAXBUFLEN] = ""; - - RETCODE retcode; - SWORD cntr; - //SQLGetData variables. - UCHAR Data[BUFFERSIZE]; - SDWORD cbBatch = (SDWORD)sizeof(Data)-1; - SDWORD cbBinSize; - // Clear data array. - for(cntr = 0; cntr < BUFFERSIZE; cntr++) - Data[cntr] = 0x00; - // Allocate the ODBC environment and save handle. - retcode = SQLAllocEnv (&henv); - - SQLAllocConnect(henv, &hdbc1); - - char tmpStr[1024]; - char maxStr[1024]; -// strcpy(tmpStr, "Provider=SQL Server Native Client 10.0;Data Source=QUAD\\SQLEXPRESS;Trusted_Connection=Yes;"); - strcpy(tmpStr, "DRIVER=SQL Server Native Client 10.0;SERVER=QUAD\\SQLEXPRESS;DATABASE=Holly;UID=test;PWD=koblih;"); -// strcpy(tmpStr, "DRIVER=SQL Server Native Client 10.0;SERVER=QUAD\\SQLEXPRESS;Trusted_Connection=Yes;"); - memset(maxStr, 0x00, sizeof(maxStr)); - SQLSMALLINT returnSize=0; - retcode = ::SQLDriverConnect(hdbc1, NULL, (SQLCHAR *)tmpStr, strlen(tmpStr), (SQLCHAR *)maxStr, sizeof(maxStr), &returnSize, - SQL_DRIVER_NOPROMPT ); - DDUMP(retcode); -/* - // Allocate ODBC connection and connect. - retcode = SQLAllocConnect(henv, &hdbc1); - // Make the connection, then print the information messages. - retcode = SQLConnect(hdbc1, szDSN, (SWORD)strlen((char *)szDSN), - szUID, (SWORD)strlen((char *)szUID), - szAuthStr, - (SWORD)strlen((char *)szAuthStr));*/ - if ( (retcode != SQL_SUCCESS) && - (retcode != SQL_SUCCESS_WITH_INFO) ) { - ProcessLogMessages(hdbc1, hstmt1, - "SQLConnect() Failed\n\n"); - return; - } - else { - ProcessLogMessages(hdbc1, hstmt1, - "\nConnect Successful\n\n"); - } - // Allocate the statement handle. - retcode = SQLAllocStmt(hdbc1,&hstmt1); - // Execute the SELECT statement. - retcode = SQLExecDirect(hstmt1, (SQLCHAR *)"SELECT TEXT FROM SUBJECT_ATTR", SQL_NTS); - if ( (retcode != SQL_SUCCESS) && - (retcode != SQL_SUCCESS_WITH_INFO) ) { - ProcessLogMessages(hdbc1, hstmt1, - "SQLExecDirect hstmt1 Failed\n\n"); - return; - } - // Get first row. - for(;;) { - retcode = SQLFetch(hstmt1); - if(retcode == SQL_NO_DATA) - break; - if ( (retcode != SQL_SUCCESS) && - (retcode != SQL_SUCCESS_WITH_INFO) ) { - ProcessLogMessages(hdbc1, hstmt1, - "SQLFetch hstmt1 Failed\n\n"); - return; - } - - SQLLEN len; - byte buffer[1024]; - SQLGetData(hstmt1, 1, SQL_C_CHAR, buffer, 1024, &len); - if(len > 0) - DDUMP(String(buffer, len)); - else - LOG("NULL"); - - // Get the SQL_LONG column. CbBatch has size of data chunk - // the buffer can handle. Call SQLGetData until - // SQL_NO_DATA_FOUND. cbBinSize on each call has the - // amount of data left to transfer. -/* cntr = 1; - do { - retcode = SQLGetData(hstmt1, // hstmt - 1, // ipar - SQL_C_BINARY, // fCType - Data, // rgbValue - cbBatch, // cbValueMax - &cbBinSize); // pcbValue - printf("GetData iteration %d, pcbValue = %d\n", cntr++, cbBinSize); - if ( (retcode != SQL_SUCCESS) && - (retcode != SQL_SUCCESS_WITH_INFO) && - retcode != SQL_NO_DATA_FOUND ){ - ProcessLogMessages(hdbc1, hstmt1, "SQLGetData hstmt1 Failed\n\n"); - return; - } - } while (retcode != SQL_NO_DATA_FOUND); -*/ /* Clean up. */ - } - LOG("OK"); - SQLFreeStmt(hstmt1, SQL_DROP); - SQLDisconnect(hdbc1); - SQLFreeConnect (hdbc1); - SQLFreeEnv(henv); - return; -} diff --git a/uppdev/odbctest/odbctest.upp b/uppdev/odbctest/odbctest.upp deleted file mode 100644 index 4a43b00b2..000000000 --- a/uppdev/odbctest/odbctest.upp +++ /dev/null @@ -1,13 +0,0 @@ -uses - Core, - ODBC; - -library - odbc32.lib; - -file - odbctest.cpp; - -mainconfig - "" = ""; - diff --git a/uppdev/pady/main.cpp b/uppdev/pady/main.cpp deleted file mode 100644 index 0bc833a3c..000000000 --- a/uppdev/pady/main.cpp +++ /dev/null @@ -1,71 +0,0 @@ -#include -#include - -SqlId PRIJM("PRIJM"); -SqlId JMENO("JMENO"); -SqlId OSOBA("OSOBA"); -SqlId TYP("TYP"); - -Index txt; - -void FetchData() -{ - while(SQL.Fetch()) { - String s = SQL[0]; - if(s.Find(' ') < 0) - txt.FindAdd(s); - } -} - -void FetchDatabase() -{ - SQL * Select(PRIJM).From(OSOBA).Where(TYP == "M" || TYP == "Z"); - FetchData(); - SQL * Select(JMENO).From(OSOBA).Where(TYP == "M" || TYP == "Z"); - FetchData(); - String s; -} - -struct ReversedCompare { - bool operator()(const String& a, const String& b) const { - const char *ap = a.End(); - const char *bp = b.End(); - for(;;) { - if(ap == a.Begin()) - return bp != b.Begin(); - if(bp == b.Begin()) - return false; - if(*--ap != *--bp) { - int c1 = ToAscii(*ap, CHARSET_WIN1250); - int c2 = ToAscii(*bp, CHARSET_WIN1250); - if(c1 != c2) - return c1 < c2; - return *ap < *bp; - } - } - } -}; - -GUI_APP_MAIN -{ - SetDefaultCharset(CHARSET_WIN1250); - Oracle7 oracle; - oracle.Open("mb/idismain@cxl"); - SQL = oracle; -/* FetchDatabase(); - oracle.Open("idis_main/main_idis@cxl"); - SQL = oracle; - FetchDatabase(); - Vector x = txt.PickKeys(); - Sort(x, ReversedCompare());*/ - SQL * Select(JMENO, PRIJM, TYP).From(OSOBA).Where(TYP == "Z" || TYP == "M"); - while(SQL.Fetch()) { - LOG(SklonJmeno(SQL[0], SQL[1], (String)SQL[2] == "Z", 1) << - ", bez " << SklonJmeno(SQL[0], SQL[1], (String)SQL[2] == "Z", 2) << - ", k " << SklonJmeno(SQL[0], SQL[1], (String)SQL[2] == "Z", 3) << - ", vidm " << SklonJmeno(SQL[0], SQL[1], (String)SQL[2] == "Z", 4) << - ", volm " << SklonJmeno(SQL[0], SQL[1], (String)SQL[2] == "Z", 5) << - ", o " << SklonJmeno(SQL[0], SQL[1], (String)SQL[2] == "Z", 6) << - ", s " << SklonJmeno(SQL[0], SQL[1], (String)SQL[2] == "Z", 7)); - } -} diff --git a/uppdev/pady/pady.upp b/uppdev/pady/pady.upp deleted file mode 100644 index a17da42ea..000000000 --- a/uppdev/pady/pady.upp +++ /dev/null @@ -1,8 +0,0 @@ -uses - Core; - -file - main.cpp charset "windows-1250"; - -mainconfig - "" = "GUI ST"; diff --git a/uppdev/pdfPolygon/pdfPolygon.cpp b/uppdev/pdfPolygon/pdfPolygon.cpp deleted file mode 100644 index 4b00ca188..000000000 --- a/uppdev/pdfPolygon/pdfPolygon.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include - -CONSOLE_APP_MAIN -{ - PdfDraw pdf; - pdf.StartPage(); - pdf.DrawRect(300,300,500,400,Gray); - - Vector v; - v< - -using namespace Upp; - -String GetPidExePath(int pid) -{ - static char h[_MAX_PATH + 1]; - char link[100]; -#ifdef PLATFORM_FREEBSD - sprintf(link, "/proc/%d/file", pid); -#else - sprintf(link, "/proc/%d/exe", pid); -#endif - int ret = readlink(link, h, _MAX_PATH); - if(ret > 0 && ret < _MAX_PATH) - h[ret] = '\0'; - else - *h = '\0'; - return h; -} - -CONSOLE_APP_MAIN -{ - DUMP(GetExeFilePath()); - DUMP(GetPidExePath(getpid())); -} diff --git a/uppdev/pid/pid.upp b/uppdev/pid/pid.upp deleted file mode 100644 index 406179d0c..000000000 --- a/uppdev/pid/pid.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - Core; - -file - pid.cpp; - -mainconfig - "" = ""; - diff --git a/uppdev/pthread_tls/init b/uppdev/pthread_tls/init deleted file mode 100644 index 2c8a7ead1..000000000 --- a/uppdev/pthread_tls/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _pthread_tls_icpp_init_stub -#define _pthread_tls_icpp_init_stub -#include "Core/init" -#endif diff --git a/uppdev/pthread_tls/pthread_tls.cpp b/uppdev/pthread_tls/pthread_tls.cpp deleted file mode 100644 index 1a5ae959b..000000000 --- a/uppdev/pthread_tls/pthread_tls.cpp +++ /dev/null @@ -1,96 +0,0 @@ -#include -#include -#include -#include - -//#include - -#ifndef TLS_PRE_ALLOC -#define TLS_PRE_ALLOC false -#endif - -#ifndef NUM_THREADS -#define NUM_THREADS 10 -#endif - -#ifndef NUM_TESTS -#define NUM_TESTS 1<<28 -#endif - -pthread_key_t p_key; - -struct tls_ { - int id; - long check; -}; - -#if TLS_PRE_ALLOC -static tls_ tls[NUM_THREADS]; -#endif - -bool update_tls() { - tls_ *tmp = (tls_*)pthread_getspecific(p_key); - volatile long chk = tmp->check; - tmp->check += 1; - if (chk+1 == tmp->check) - return true; - else - return false; -} - -void* work(void* p_tls) { - pthread_setspecific(p_key, p_tls); - printf("Starting thread id: %d, v: %d\n", ((tls_*)pthread_getspecific(p_key))->id, ((tls_*)pthread_getspecific(p_key))->check); - int test_nr = 0; - do { - if (!update_tls()) - return NULL; - } while (NUM_TESTS < 0 || ++test_nr < NUM_TESTS); - tls_ *tmp = (tls_*)pthread_getspecific(p_key); - printf("Leaving thread %d value %d ...\n", tmp->id, tmp->check); -#if !TLS_PRE_ALLOC - free(tmp); - pthread_setspecific(p_key, NULL); -#endif - return (void*)-1; -} - -int main(int argc, const char *argv[]) -{ - clock_t clk = clock(); - pthread_key_create(&p_key, NULL); - pthread_t threads[NUM_THREADS]; - long ret; - void* ret_ptr = &ret; - int thread_id = 0; - while (thread_id < NUM_THREADS) { -#if TLS_PRE_ALLOC - printf("Thread specific data is pre allocated ...\n", thread_id); - tls[thread_id].id = thread_id; - tls[thread_id].check = thread_id; - if (pthread_create(&threads[thread_id], NULL, work, &tls[thread_id]) != 0) { - printf("Cannot create thread %d\n", thread_id); - break; - } -#else - printf("Allocating thread specific data for thread %d ...\n", thread_id); - tls_ *tls = new tls_; - tls->id = thread_id; - tls->check = thread_id; - if (pthread_create(&threads[thread_id], NULL, work, tls) != 0) { - printf("Cannot create thread %d\n", thread_id); - break; - } -#endif - thread_id++; - } - for (int i=0; i < thread_id; i++) { - pthread_join(threads[i], &ret_ptr); - if (!ret_ptr) - printf("thread %d TSS update has errors !!!\n", i); - } - pthread_key_delete(p_key); - printf("CPU time: %f\n", (float)(clock()-clk)/CLOCKS_PER_SEC); - return 0; -} - diff --git a/uppdev/pthread_tls/pthread_tls.upp b/uppdev/pthread_tls/pthread_tls.upp deleted file mode 100644 index 8801b70ca..000000000 --- a/uppdev/pthread_tls/pthread_tls.upp +++ /dev/null @@ -1,14 +0,0 @@ -description "pthread thread local storage test\377"; - -uses - Core; - -library - pthread; - -file - pthread_tls.cpp; - -mainconfig - "" = ""; - diff --git a/uppdev/radial/main.cpp b/uppdev/radial/main.cpp deleted file mode 100644 index 419bae3ef..000000000 --- a/uppdev/radial/main.cpp +++ /dev/null @@ -1,106 +0,0 @@ -#include "radial.h" - -RadialDemo::RadialDemo() -{ - Sizeable().Zoomable(); - Title("Radial basis transform demo"); - BackPaint(); - - Add(array.VSizePos(0, 30).LeftPos(0, 200)); - Add(recalc.BottomPos(0, 22).LeftPos(0, 80)); - recalc.SetLabel("Calculate"); - recalc <<= THISBACK(Recalc); - array.AutoHideSb(); - array.Inserting().Removing().Duplicating().NoAskRemove(); - array.AddColumn("Source").SetDisplay(ColorDisplay()).Edit(source); - array.AddColumn("Target").SetDisplay(ColorDisplay()).Edit(target); - array.Add(White(), Yellow()); - array.Add(LtRed(), LtBlue()); - array.Add(Black(), LtGreen()); - array.Add(LtMagenta(), White()); - array.Add(Gray(), LtRed()); - - Recalc(); -} - -void RadialDemo::Recalc() -{ - Vector sc, tc; - int n = array.GetCount(); - sc.SetCount(n); - tc.SetCount(n); - for(int i = 0; i < n; i++) { - sc[i] = array.Get(i, 0); - tc[i] = array.Get(i, 1); - } - transform = CalcTransform(sc, tc); - Refresh(); -} - -void RadialDemo::Paint(Draw& draw) -{ - draw.DrawRect(draw.GetClip(), SWhite()); - PaintSection(draw, Point(220, 10), Point(220, 230), Size(200, 200), LtRed(), LtGreen(), LtCyan()); - PaintSection(draw, Point(440, 10), Point(440, 230), Size(200, 200), Black(), LtGray(), White()); - PaintSection(draw, Point(660, 10), Point(660, 230), Size(200, 200), LtBlue(), LtMagenta(), White()); -} - -void RadialDemo::PaintSection(Draw& draw, Point src, Point dst, Size sz, Color lt, Color rt, Color rb) -{ - ImageBuffer sbuf(sz), dbuf(sz); - for(int x = 0; x < sz.cx; x++) - for(int y = 0; y < sz.cy; y++) { - int r = lt.GetR() + iscale(rt.GetR() - lt.GetR(), x, sz.cx) - + iscale(rb.GetR() - rt.GetR(), y, sz.cy); - int g = lt.GetG() + iscale(rt.GetG() - lt.GetG(), x, sz.cx) - + iscale(rb.GetG() - rt.GetG(), y, sz.cy); - int b = lt.GetB() + iscale(rt.GetB() - lt.GetB(), x, sz.cx) - + iscale(rb.GetB() - rt.GetB(), y, sz.cy); - Color c(minmax(r, 0, 255), minmax(g, 0, 255), minmax(b, 0, 255)); - sbuf[y][x] = RGBA(c); - dbuf[y][x] = RGBA(transform.Transform(c)); - } - draw.DrawImage(src.x, src.y, sbuf); - draw.DrawImage(dst.x, dst.y, dbuf); -} - -Image RadialRecolor(const Image& m) -{ - Vector src; - Vector tgt; - src.Add(Black); tgt.Add(SColorText); - src.Add(Gray); tgt.Add(SColorShadow); - src.Add(LtGray); tgt.Add(SColorFace); - src.Add(White); tgt.Add(SColorLight); - src.Add(Yellow); tgt.Add(SColorPaper); - src.Add(LtBlue); tgt.Add(SColorHighlight); - RadialBasisTransform rbt = CalcTransform(src, tgt); - ImageBuffer b(m.GetSize()); - const RGBA *s = m; - const RGBA *e = s + b.GetLength(); - RGBA *t = b; - while(s < e) { - *t = rbt.Transform(*s); - t->a = s->a; - t++; - s++; - } - b.SetHotSpot(m.GetHotSpot()); - return b; -} - -struct ChApp : TopWindow { - virtual void Paint(Draw& w) - { - static Image m = RadialRecolor(CtrlsImg::OkB()); - ChPaint(w, GetSize(), m); - } - - ChApp() { Sizeable().Zoomable(); SetRect(0, 0, 50, 20); } -}; - -GUI_APP_MAIN -{ - ChApp().Run(); -// RadialDemo().Run(); -} diff --git a/uppdev/radial/radial.cpp b/uppdev/radial/radial.cpp deleted file mode 100644 index 50d163740..000000000 --- a/uppdev/radial/radial.cpp +++ /dev/null @@ -1,201 +0,0 @@ -#include "radial.h" - -Pointf3 RadialBasisTransform::Transform(Pointf3 pt) const -{ - Pointf3 out(0, 0, 0); // = pt * affine; - for(int i = 0; i < anchor.GetCount(); i++) - out += radial[i] * exp(-Squared(pt - anchor[i]) / sigma2[i]); - return out; -} - -Color RadialBasisTransform::Transform(Color c) const -{ - if(IsNull(c)) return c; - Pointf3 out = Transform(Pointf3(c.GetR(), c.GetG(), c.GetB())); - return Color(fround(minmax(out.x, 0.0, 255.0)), fround(minmax(out.y, 0.0, 255.0)), fround(minmax(out.z, 0.0, 255.0))); -} - -/* -double RadialBasisTransform::MinSquared(Pointf3 pt) const -{ -// if(IsAffine()) -// return Null; - double d = Squared(pt - anchor[0]); - for(int i = 1; i < anchor.GetCount(); i++) - d = min(d, Squared(pt - anchor[i])); - return d; -} -*/ - -RadialBasisTransform CalcTransform(const Array& source, const Array& target /*, const Vector& rad*/) -{ - int n = source.GetCount(); - ASSERT(n == target.GetCount()); - - RadialBasisTransform rbt; - -/* - switch(n) { - case 0: return rbt; - case 1: rbt.affine.a = target[0] - source[0]; return rbt; - case 2: rbt.affine = Matrixf3Affine(source[0], target[0], source[1], target[1]); return rbt; - case 3: rbt.affine = Matrixf3Affine(source[0], target[0], source[1], target[1], source[2], target[2]); return rbt; - case 4: rbt.affine = Matrixf3Affine(source[0], target[0], source[1], target[1], source[2], target[2], source[3], target[3]); return rbt; - } -*/ - - enum { -// AXX, AXY, AXZ, AYX, AYY, AYZ, AZX, AZY, AZZ, BX, BY, BZ, - RX, RY, RZ - }; - LinearSolver solver(/*12 +*/ 3 * n); - double xmin, xmax, ymin, ymax, zmin, zmax; - xmin = ymin = zmin = +1e100; - xmax = ymax = zmax = -1e100; - int i; - for(i = 0; i < n; i++) { - Pointf3 src = source[i]; - if(src.x < xmin) xmin = src.x; - if(src.x > xmax) xmax = src.x; - if(src.y < ymin) ymin = src.y; - if(src.y > ymax) ymax = src.y; - if(src.z < zmin) zmin = src.z; - if(src.z > zmax) zmax = src.z; - } - double sigma2 = pow((xmax - xmin) * (ymax - ymin) * (zmax - zmin), 2.0 / 3.0) / n; - - for(i = 0; i < n; i++) { - ASSERT(!IsNull(source[i]) && !IsNull(target[i])); - Pointf3 si = source[i], ti = target[i]; -/* - solver(AXX, AXX) += si.x * si.x; - solver(AXX, AYX) += si.y * si.x; - solver(AXX, AZX) += si.z * si.x; - solver(AXX, BX) += 1.0 * si.x; - solver.Right(AXX) += ti.x * si.x; - - solver(AYX, AXX) += si.x * si.y; - solver(AYX, AYX) += si.y * si.y; - solver(AYX, AZX) += si.z * si.y; - solver(AYX, BX) += 1.0 * si.y; - solver.Right(AYX) += ti.x * si.y; - - solver(AZX, AXX) += si.x * si.z; - solver(AZX, AYX) += si.y * si.z; - solver(AZX, AZX) += si.z * si.z; - solver(AZX, BX) += 1.0 * si.z; - solver.Right(AZX) += ti.x * si.z; - - solver(BX, AXX) += si.x; - solver(BX, AYX) += si.y; - solver(BX, AZX) += si.z; - solver(BX, BX) += 1; - solver.Right(BX) += ti.x; - - solver(AXY, AXY) += si.x * si.x; - solver(AXY, AYY) += si.y * si.x; - solver(AXY, AZY) += si.z * si.x; - solver(AXY, BY) += 1 * si.x; - solver.Right(AXY) += ti.y * si.x; - - solver(AYY, AXY) += si.x * si.y; - solver(AYY, AYY) += si.y * si.y; - solver(AYY, AZY) += si.z * si.y; - solver(AYY, BY) += 1 * si.y; - solver.Right(AYY) += ti.y * si.y; - - solver(AZY, AXY) += si.x * si.z; - solver(AZY, AYY) += si.y * si.z; - solver(AZY, AZY) += si.z * si.z; - solver(AZY, BY) += 1 * si.z; - solver.Right(AZY) += ti.y * si.z; - - solver(BY, AXY) += si.x; - solver(BY, AYY) += si.y; - solver(BY, AZY) += si.z; - solver(BY, BY) += 1; - solver.Right(BY) += ti.y; - - solver(AXZ, AXZ) += si.x * si.x; - solver(AXZ, AYZ) += si.y * si.x; - solver(AXZ, AZZ) += si.z * si.x; - solver(AXZ, BZ) += 1 * si.x; - solver.Right(AXZ) += ti.z * si.x; - - solver(AYZ, AXZ) += si.x * si.y; - solver(AYZ, AYZ) += si.y * si.y; - solver(AYZ, AZZ) += si.z * si.y; - solver(AYZ, BZ) += 1 * si.y; - solver.Right(AYZ) += ti.z * si.y; - - solver(AZZ, AXZ) += si.x * si.z; - solver(AZZ, AYZ) += si.y * si.z; - solver(AZZ, AZZ) += si.z * si.z; - solver(AZZ, BZ) += 1 * si.z; - solver.Right(AZZ) += ti.z * si.z; - - solver(BZ, AXZ) += si.x; - solver(BZ, AYZ) += si.y; - solver(BZ, AZZ) += si.z; - solver(BZ, BZ) += 1; - solver.Right(BZ) += ti.z; -*/ - int rx = RX + 3 * i, ry = RY + 3 * i, rz = RZ + 3 * i; -// solver(rx, AXX) = solver(ry, AXY) = solver(rz, AXZ) = si.x; -// solver(rx, AYX) = solver(ry, AYY) = solver(rz, AYZ) = si.y; -// solver(rx, AZX) = solver(ry, AZY) = solver(rz, AZZ) = si.z; -// solver(rx, BX) = solver(ry, BY) = solver(rz, BZ) = 1; - solver.Right(rx) = ti.x; - solver.Right(ry) = ti.y; - solver.Right(rz) = ti.z; - for(int r = 0; r < n; r++) { -// double s2 = rad[r]; -// s2 = (s2 ? s2 * s2 : sigma2); - solver(rx, RX + 3 * r) = solver(ry, RY + 3 * r) = solver(rz, RZ + 3 * r) - = exp(-Squared(source[r] - si) / sigma2); - } - } - - Vector out = solver.Solve(); -/* - rbt.affine.x.x = Nvl(out[AXX], 1.0); - rbt.affine.x.y = Nvl(out[AXY], 0.0); - rbt.affine.x.z = Nvl(out[AXZ], 0.0); - rbt.affine.y.x = Nvl(out[AYX], 0.0); - rbt.affine.y.y = Nvl(out[AYY], 1.0); - rbt.affine.y.z = Nvl(out[AYZ], 0.0); - rbt.affine.z.x = Nvl(out[AZX], 0.0); - rbt.affine.z.y = Nvl(out[AZY], 0.0); - rbt.affine.z.z = Nvl(out[AZZ], 1.0); - rbt.affine.a.x = Nvl(out[BX], 0.0); - rbt.affine.a.y = Nvl(out[BY], 0.0); - rbt.affine.a.z = Nvl(out[BZ], 0.0); -*/ - for(i = 0; i < n; i++) { - Pointf3 a(out[RX + 3 * i], out[RY + 3 * i], out[RZ + 3 * i]); - if(!IsNull(a.x) && !IsNull(a.y) && !IsNull(a.z) - && (fabs(a.x) >= 1 || fabs(a.y) >= 1 || fabs(a.z) >= 1)) { - rbt.radial.Add(a); -// double s2 = rad[i]; - rbt.sigma2.Add(sigma2); //s2 ? s2 * s2 : sigma2); - rbt.anchor.Add(source[i]); - } - } - - return rbt; -} - -RadialBasisTransform CalcTransform(const Vector& source, const Vector& target) -{ - int n = source.GetCount(); - ASSERT(n == target.GetCount()); - Array spt, dpt; - spt.Reserve(n); - dpt.Reserve(n); - for(int i = 0; i < n; i++) - if(!IsNull(source[i]) && !IsNull(target[i])) { - spt.Add(Pointf3(source[i].GetR(), source[i].GetG(), source[i].GetB())); - dpt.Add(Pointf3(target[i].GetR(), target[i].GetG(), target[i].GetB())); - } - return CalcTransform(spt, dpt); -} diff --git a/uppdev/radial/radial.h b/uppdev/radial/radial.h deleted file mode 100644 index 9bec8fe0b..000000000 --- a/uppdev/radial/radial.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef _radial_radial_h -#define _radial_radial_h - -#include -#include - -class RadialBasisTransform : DeepCopyOption -{ -public: - RadialBasisTransform() {} //: affine(Matrixf3_1()) {} -// RadialBasisTransform(const RadialBasisTransform& rbt, int deep) -// : sigma2(rbt.sigma2, 0), radial(rbt.radial, 0), anchor(rbt.anchor, 0), affine(rbt.affine) {} - -// bool IsAffine() const { return radial.IsEmpty(); } - Pointf3 Transform(Pointf3 pt) const; -// double MinSquared(Pointf3 pt) const; - - Color Transform(Color c) const; - -public: - Vector sigma2; // Gaussian radial: f(d) = exp(-d^2/sigma2) - Array radial; // t(s) = sum(i=0..N-1) of radial[i] * f(||s-anchor[i]||) + affine(s) - Array anchor; -// Matrixf3 affine; -}; - -RadialBasisTransform CalcTransform(const Vector& source, const Vector& target); - -class RadialDemo : public TopWindow { -public: - typedef RadialDemo CLASSNAME; - RadialDemo(); - - virtual void Paint(Draw& draw); - -private: - void PaintSection(Draw& draw, Point src, Point dst, Size sz, Color lt, Color rt, Color rb); - void Recalc(); - -private: - RadialBasisTransform transform; - ArrayCtrl array; - Button recalc; - ColorCtrl source, target; -}; - -#endif diff --git a/uppdev/radial/radial.upp b/uppdev/radial/radial.upp deleted file mode 100644 index d29c568a8..000000000 --- a/uppdev/radial/radial.upp +++ /dev/null @@ -1,11 +0,0 @@ -uses - CtrlLib, - Geom; - -file - radial.h, - radial.cpp, - main.cpp; - -mainconfig - "" = "GUI"; diff --git a/uppdev/rand/init b/uppdev/rand/init deleted file mode 100644 index ac15b7900..000000000 --- a/uppdev/rand/init +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef _rand_icpp_init_stub -#define _rand_icpp_init_stub -#include "Core/init" -#endif diff --git a/uppdev/rand/rand.cpp b/uppdev/rand/rand.cpp deleted file mode 100644 index cd1cddf73..000000000 --- a/uppdev/rand/rand.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include "Core/Core.h" - -using namespace Upp; - -int main(int argc, const char *argv[]) -{ - Cout() << rand() << '\n'; - return 0; -} - diff --git a/uppdev/rand/rand.upp b/uppdev/rand/rand.upp deleted file mode 100644 index 7eb330dfb..000000000 --- a/uppdev/rand/rand.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - Core; - -file - rand.cpp; - -mainconfig - "" = ""; - diff --git a/uppdev/readdbf/club.dbf b/uppdev/readdbf/club.dbf deleted file mode 100644 index 02c16547a..000000000 --- a/uppdev/readdbf/club.dbf +++ /dev/null @@ -1 +0,0 @@ -j0 \ No newline at end of file diff --git a/uppdev/readdbf/readdbf.cpp b/uppdev/readdbf/readdbf.cpp deleted file mode 100644 index 22555473d..000000000 --- a/uppdev/readdbf/readdbf.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include -#include - -using namespace Upp; - -CONSOLE_APP_MAIN -{ int i; - int NFields; - DbfStream dbf; - - if(!dbf.Open(GetDataFile("club.dbf"), false) ) { - return; - } - -// int NFields = dbf.GetFieldCount(); -// DUMP(NFields); -/* while(dbf.Fetch()) { - String text; - // for (i=0; i<3; i++) { - text << dbf["CODE"] << dbf["CLUB"]; - // } - text << "\n"; - Cout() << text; - } - */ - dbf.Close(); -} diff --git a/uppdev/readdbf/readdbf.upp b/uppdev/readdbf/readdbf.upp deleted file mode 100644 index c188c00d5..000000000 --- a/uppdev/readdbf/readdbf.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - Core, - TCore; - -file - readdbf.cpp; - -mainconfig - "" = ""; diff --git a/uppdev/robot/main.cpp b/uppdev/robot/main.cpp deleted file mode 100644 index e8ef435f9..000000000 --- a/uppdev/robot/main.cpp +++ /dev/null @@ -1,361 +0,0 @@ -#include "robot.h" - -int OpenGL::InitGL(GLvoid) // All Setup For OpenGL Goes Here -{ - if (!LoadGLTextures()) // Jump To Texture Loading Routine ( NEW ) - { - return FALSE; // If Texture Didn't Load Return FALSE - } - - glEnable(GL_TEXTURE_2D); // Enable Texture Mapping ( NEW ) - glShadeModel(GL_SMOOTH); // Enable Smooth Shading - glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background - glClearDepth(1.0f); // Depth Buffer Setup - glEnable(GL_DEPTH_TEST); // Enables Depth Testing - glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do - glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations - return TRUE; // Initialization Went OK -} - -void OpenGL::GLPaint() -{ - //StdView(); - - - - glShadeModel(GL_SMOOTH); - glClearColor(0.0f, 0.0f, 0.0f, 0.5f); - glClearDepth(1.0f); - glEnable(GL_DEPTH_TEST); - glDepthFunc(GL_LEQUAL); - glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); - - Size sz = GetSize(); - glViewport(0, 0, (GLsizei)sz.cx, (GLsizei)sz.cy); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - gluPerspective(55.0f, (GLfloat)(sz.cx)/(GLfloat)(sz.cy), 1.0f, 100.0f); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - - - - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer - glLoadIdentity(); // Reset The View - glRotatef(45,1.0f,0,0); -//glRotatef(sceneroty,0,1.0,0); - glTranslatef(-0.0f,-50.0f,-50.0f); // Move Right 1.5 Units And Into The Screen 7.0 - //glRotatef(rquad,1.0f,1.0f,1.0f); // Rotate The Quad On The X axis ( NEW ) - -glBindTexture(GL_TEXTURE_2D, texture[0]); - glBegin(GL_QUADS); // Draw A Quad - - glColor3f(0.0f,1.0f,0.0f); // Set The Color To Green - glTexCoord2f(0.0f, 1.0f);glVertex3f( szerokosc/2, 0.0f,-dlugosc/2); // Top Right Of The Quad (Top) - glTexCoord2f(1.0f, 0.0f);glVertex3f(-szerokosc/2, 0.0f,-dlugosc/2); // Top Left Of The Quad (Top) - glTexCoord2f(1.0f, 1.0f);glVertex3f(-szerokosc/2, 0.0f, dlugosc/2); // Bottom Left Of The Quad (Top) - glTexCoord2f(0.0f, 1.0f);glVertex3f( szerokosc/2, 0.0f, dlugosc/2); // Bottom Right Of The Quad (Top) - - glColor3f(1.0f,0.0f,0.0f); - glTexCoord2f(0.0f, 1.0f);glVertex3f( szerokosc/2, 0.0f,-dlugosc/2); // Top Right Of The Quad (Top) - glTexCoord2f(20.0f, 1.0f);glVertex3f( szerokosc/2, wysokosc,-dlugosc/2); // Top Right Of The Quad (Top) - glTexCoord2f(20.0f, 0.0f);glVertex3f(-szerokosc/2, wysokosc,-dlugosc/2); // Top Left Of The Quad (Top) - glTexCoord2f(1.0f, 0.0f);glVertex3f(-szerokosc/2, 0.0f,-dlugosc/2); // Top Left Of The Quad (Top) - - glColor3f(1.0f,1.0f,0.0f); - glTexCoord2f(0.0f, 1.0f);glVertex3f( szerokosc/2, 0.0f, dlugosc/2); // Top Right Of The Quad (Top) - glTexCoord2f(20.0f, 1.0f);glVertex3f( szerokosc/2, wysokosc, dlugosc/2); // Top Right Of The Quad (Top) - glTexCoord2f(20.0f, 0.0f);glVertex3f(-szerokosc/2, wysokosc, dlugosc/2); // Top Left Of The Quad (Top) - glTexCoord2f(1.0f, 0.0f);glVertex3f(-szerokosc/2, 0.0f, dlugosc/2); // Top Left Of The Quad (Top) - - - glColor3f(1.0f,0.0f,1.0f); - glTexCoord2f(0.0f, 1.0f);glVertex3f( szerokosc/2, 0.0f, dlugosc/2); // Top Right Of The Quad (Top) - glTexCoord2f(20.0f, 1.0f);glVertex3f( szerokosc/2, wysokosc, dlugosc/2); // Top Right Of The Quad (Top) - glTexCoord2f(20.0f, 0.0f);glVertex3f(szerokosc/2, wysokosc, -dlugosc/2); // Top Left Of The Quad (Top) - glTexCoord2f(1.0f, 0.0f);glVertex3f(szerokosc/2, 0.0f, -dlugosc/2); // Top Left Of The Quad (Top) - - glColor3f(0.0f,1.0f,1.0f); - glTexCoord2f(0.0f, 1.0f);glVertex3f( -szerokosc/2, 0.0f, dlugosc/2); // Top Right Of The Quad (Top) - glTexCoord2f(20.0f, 1.0f);glVertex3f( -szerokosc/2, wysokosc, dlugosc/2); // Top Right Of The Quad (Top) - glTexCoord2f(20.0f, 0.0f);glVertex3f(-szerokosc/2, wysokosc, -dlugosc/2); // Top Left Of The Quad (Top) - glTexCoord2f(1.0f, 0.0f);glVertex3f(-szerokosc/2, 0.0f, -dlugosc/2); // Top Left Of The Quad (Top) - - - /* glColor3f(1.0f,0.5f,0.0f); // Set The Color To Orange - glVertex3f( 1.0f,-1.0f, 1.0f); // Top Right Of The Quad (Bottom) - glVertex3f(-1.0f,-1.0f, 1.0f); // Top Left Of The Quad (Bottom) - glVertex3f(-1.0f,-1.0f,-1.0f); // Bottom Left Of The Quad (Bottom) - glVertex3f( 1.0f,-1.0f,-1.0f); // Bottom Right Of The Quad (Bottom) - glColor3f(1.0f,0.0f,0.0f); // Set The Color To Red - glVertex3f( 1.0f, 1.0f, 1.0f); // Top Right Of The Quad (Front) - glVertex3f(-1.0f, 1.0f, 1.0f); // Top Left Of The Quad (Front) - glVertex3f(-1.0f,-1.0f, 1.0f); // Bottom Left Of The Quad (Front) - glVertex3f( 1.0f,-1.0f, 1.0f); // Bottom Right Of The Quad (Front) - glColor3f(1.0f,1.0f,0.0f); // Set The Color To Yellow - glVertex3f( 1.0f,-1.0f,-1.0f); // Top Right Of The Quad (Back) - glVertex3f(-1.0f,-1.0f,-1.0f); // Top Left Of The Quad (Back) - glVertex3f(-1.0f, 1.0f,-1.0f); // Bottom Left Of The Quad (Back) - glVertex3f( 1.0f, 1.0f,-1.0f); // Bottom Right Of The Quad (Back) - glColor3f(0.0f,0.0f,1.0f); // Set The Color To Blue - glVertex3f(-1.0f, 1.0f, 1.0f); // Top Right Of The Quad (Left) - glVertex3f(-1.0f, 1.0f,-1.0f); // Top Left Of The Quad (Left) - glVertex3f(-1.0f,-1.0f,-1.0f); // Bottom Left Of The Quad (Left) - glVertex3f(-1.0f,-1.0f, 1.0f); // Bottom Right Of The Quad (Left) - glColor3f(1.0f,0.0f,1.0f); // Set The Color To Violet - glVertex3f( 1.0f, 1.0f,-1.0f); // Top Right Of The Quad (Right) - glVertex3f( 1.0f, 1.0f, 1.0f); // Top Left Of The Quad (Right) - glVertex3f( 1.0f,-1.0f, 1.0f); // Bottom Left Of The Quad (Right) - glVertex3f( 1.0f,-1.0f,-1.0f); // Bottom Right Of The Quad (Right) - */ - glEnd(); - for (int i=0;isizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); - } - - if (TextureImage[0]) // If Texture Exists - { - if (TextureImage[0]->data) // If Texture Image Exists - { - free(TextureImage[0]->data); // Free The Texture Image Memory - } - - free(TextureImage[0]); // Free The Image Structure - } - - return Status; // Return The Status -} - - -GLvoid OpenGL::ReSizeGLScene(GLsizei width, GLsizei height) -{ - if (height==0) // Prevent A Divide By Zero By - { - height=1; // Making Height Equal One - } - - glViewport(0,0,width,height); // Reset The Current Viewport - - glMatrixMode(GL_PROJECTION); // Select The Projection Matrix - glLoadIdentity(); // Reset The Projection Matrix - - // Calculate The Aspect Ratio Of The Window - gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); - - glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix - glLoadIdentity(); // Reset The Modelview Matrix -}; - -void OpenGL::NextMove() -{ - if ((rx+dx+1>dlugosc/2) || (rx+dx-1<-dlugosc/2)) dx=-dx; - if ((ry+dy+1>szerokosc/2) || (ry+dy-1<-szerokosc/2)) dy=-dy; - for (int i=0;ilistaP[i].x1) && (rx+dx+1listaP[i].y1) && (ry+dy+1listaP[i].y1) && (ry+dy+10 && teren.ilP<100) teren.lista.SetCount(teren.ilP); -} -void robot::UstawTeren() -{ - _przeszkoda P; - gl.ilP=teren.ilP; - gl.listaP.Clear(); - for (int i=0;i -#include -#include - -#define LAYOUTFILE -#include - - -class _przeszkoda:Moveable<_przeszkoda> { -public: - GLfloat x1,x2,y1,y2; - _przeszkoda(){x1=0;x2=0;y1=0;y2=0;} -}; - - -struct OpenGL : GLCtrl { -AUX_RGBImageRec *LoadBMP(char *Filename); -int LoadGLTextures(); -int InitGL(); -void NextMove(); -Vector<_przeszkoda> listaP; -GLuint texture[1]; // Storage For One Texture -GLfloat szerokosc,dlugosc,wysokosc,rx,ry,dx,dy; -GLfloat sceneroty,lookupdown; -int ilP; -GLvoid ReSizeGLScene(GLsizei width, GLsizei height); -virtual void GLPaint(); -}; - -class robot : public WithrobotLayout { -public: - - typedef robot CLASSNAME; - EditField arr_edit; - WithzadanieLayout zadanie; - WithterenLayout teren; - WithprobotaLayout probota; - - EditDouble x1, y1, x2, y2; - - OpenGL gl; - void Change(); - void UstawTeren(); - void ilPrzeszkod(); - robot(); -}; - -#endif diff --git a/uppdev/robot/robot.lay b/uppdev/robot/robot.lay deleted file mode 100644 index 1cbb2a196..000000000 --- a/uppdev/robot/robot.lay +++ /dev/null @@ -1,20 +0,0 @@ -LAYOUT(robotLayout, 648, 440) - ITEM(TabCtrl, tab, HSizePosZ(10, 11).TopPosZ(4, 106)) -END_LAYOUT - -LAYOUT(terenLayout, 636, 84) - ITEM(EditIntSpin, Eszerokosc, Min(5).Max(99).NotNull(true).LeftPosZ(128, 48).TopPosZ(4, 19)) - ITEM(EditIntSpin, Edlugosc, Min(5).Max(99).NotNull(true).LeftPosZ(128, 48).TopPosZ(20, 19)) - ITEM(Button, Bteren, SetLabel(t_("reset")).LeftPosZ(68, 68).TopPosZ(60, 20)) - ITEM(ArrayCtrl, lista, HSizePosZ(180, 12).VSizePosZ(4, 4)) - ITEM(Label, l1, SetLabel(t_("szeroko pomieszczenia:")).LeftPosZ(8, 120).TopPosZ(4, 19)) - ITEM(Label, dv___5, SetLabel(t_("dugo pomieszczenia:")).LeftPosZ(20, 112).TopPosZ(20, 19)) - ITEM(EditIntSpin, ilP, Min(1).Max(99).NotNull(true).LeftPosZ(128, 48).TopPosZ(36, 19)) - ITEM(Label, dv___7, SetLabel(t_("ilo przeszkd:")).LeftPosZ(44, 76).TopPosZ(36, 19)) -END_LAYOUT - -LAYOUT(zadanieLayout, 400, 200) -END_LAYOUT - -LAYOUT(probotaLayout, 400, 200) -END_LAYOUT diff --git a/uppdev/robot/robot.upp b/uppdev/robot/robot.upp deleted file mode 100644 index 245f41ac2..000000000 --- a/uppdev/robot/robot.upp +++ /dev/null @@ -1,13 +0,0 @@ -optimize_speed; - -uses - CtrlLib, - GLCtrl; - -file - robot.h, - main.cpp, - robot.lay; - -mainconfig - "" = "GUI"; diff --git a/uppdev/rsa/rsa.cpp b/uppdev/rsa/rsa.cpp deleted file mode 100644 index 4a87296c9..000000000 --- a/uppdev/rsa/rsa.cpp +++ /dev/null @@ -1,1251 +0,0 @@ -#include "includes.h" -#include -#include - -int rsa_verbose = 1; - -#define MAX_PRIMES_IN_TABLE 1050 /* must be more than # primes */ - -static const unsigned int small_primes[MAX_PRIMES_IN_TABLE + 1] = -{ /* 2 is eliminated by trying only odd numbers. */ - 3, 5, 7, 11, 13, 17, 19, - 23, 29, 31, 37, 41, 43, 47, 53, - 59, 61, 67, 71, 73, 79, 83, 89, - 97, 101, 103, 107, 109, 113, 127, 131, - 137, 139, 149, 151, 157, 163, 167, 173, - 179, 181, 191, 193, 197, 199, 211, 223, - 227, 229, 233, 239, 241, 251, 257, 263, - 269, 271, 277, 281, 283, 293, 307, 311, - 313, 317, 331, 337, 347, 349, 353, 359, - 367, 373, 379, 383, 389, 397, 401, 409, - 419, 421, 431, 433, 439, 443, 449, 457, - 461, 463, 467, 479, 487, 491, 499, 503, - 509, 521, 523, 541, 547, 557, 563, 569, - 571, 577, 587, 593, 599, 601, 607, 613, - 617, 619, 631, 641, 643, 647, 653, 659, - 661, 673, 677, 683, 691, 701, 709, 719, - 727, 733, 739, 743, 751, 757, 761, 769, - 773, 787, 797, 809, 811, 821, 823, 827, - 829, 839, 853, 857, 859, 863, 877, 881, - - 883, 887, 907, 911, 919, 929, 937, 941, - - 947, 953, 967, 971, 977, 983, 991, 997, - - 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, - - 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, - - 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, - - 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, - - 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, - - 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, - - 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, - - 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, - - 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, - - 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, - - 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, - - 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, - - 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, - - 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, - - 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, - - 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, - - 1951, 1973, 1979, 1987, 1993, 1997, 1999, 2003, - - 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, - - 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, - - 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, - - 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, - - 2269, 2273, 2281, 2287, 2293, 2297, 2309, 2311, - - 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, - - 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, - - 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, - - 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, - - 2591, 2593, 2609, 2617, 2621, 2633, 2647, 2657, - - 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, - - 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, - - 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, - - 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861, - - 2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939, - - 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, - - 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, - - 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, - - 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221, - - 3229, 3251, 3253, 3257, 3259, 3271, 3299, 3301, - - 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, - - 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, - - 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, - - 3499, 3511, 3517, 3527, 3529, 3533, 3539, 3541, - - 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, - - 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671, - - 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, - - 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, - - 3803, 3821, 3823, 3833, 3847, 3851, 3853, 3863, - - 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, - - 3929, 3931, 3943, 3947, 3967, 3989, 4001, 4003, - - 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, - - 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, - - 4133, 4139, 4153, 4157, 4159, 4177, 4201, 4211, - - 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, - - 4261, 4271, 4273, 4283, 4289, 4297, 4327, 4337, - - 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, - - 4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, - - 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547, - - 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, - - 4637, 4639, 4643, 4649, 4651, 4657, 4663, 4673, - - 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, - - 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, - - 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909, - - 4919, 4931, 4933, 4937, 4943, 4951, 4957, 4967, - - 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011, - - 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, - - 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, - - 5171, 5179, 5189, 5197, 5209, 5227, 5231, 5233, - - 5237, 5261, 5273, 5279, 5281, 5297, 5303, 5309, - - 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, - - 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, - - 5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, - - 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573, - - 5581, 5591, 5623, 5639, 5641, 5647, 5651, 5653, - - 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, - - 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, - - 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, - - 5851, 5857, 5861, 5867, 5869, 5879, 5881, 5897, - - 5903, 5923, 5927, 5939, 5953, 5981, 5987, 6007, - - 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, - - 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, - - 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, - - 6217, 6221, 6229, 6247, 6257, 6263, 6269, 6271, - - 6277, 6287, 6299, 6301, 6311, 6317, 6323, 6329, - - 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379, - - 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, - - 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, - - 6569, 6571, 6577, 6581, 6599, 6607, 6619, 6637, - - 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701, - - 6703, 6709, 6719, 6733, 6737, 6761, 6763, 6779, - - 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, - - 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, - - 6911, 6917, 6947, 6949, 6959, 6961, 6967, 6971, - - 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027, - - 7039, 7043, 7057, 7069, 7079, 7103, 7109, 7121, - - 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, - - 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, - - 7283, 7297, 7307, 7309, 7321, 7331, 7333, 7349, - - 7351, 7369, 7393, 7411, 7417, 7433, 7451, 7457, - - 7459, 7477, 7481, 7487, 7489, 7499, 7507, 7517, - - 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, - - 7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, - - 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, - - 7699, 7703, 7717, 7723, 7727, 7741, 7753, 7757, - - 7759, 7789, 7793, 7817, 7823, 7829, 7841, 7853, - - 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, - - 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, - - 8011, 8017, 8039, 8053, 8059, 8069, 8081, 8087, - - 8089, 8093, 8101, 8111, 8117, 8123, 8147, 8161, - - 8167, 8171, 8179, 8191, - - 0}; - - - -/* Generate a random number of the desired number of bits. */ - - - -void rsa_random_integer(MP_INT *ret, RandomState *state, unsigned int bits) - -{ - - unsigned int bytes = (bits + 7) / 8; - - char *str = xmalloc(bytes * 2 + 1); - - unsigned int i; - - - - /* We first create a random hex number of the desired size, and then - - convert it to a mp-int. */ - - for (i = 0; i < bytes; i++) - - sprintf(str + 2 * i, "%02x", random_get_byte(state)); - - - - /* Convert it to the internal representation. */ - - if (mpz_set_str(ret, str, 16) < 0) - - fatal("Intenal error, mpz_set_str returned error"); - - - - /* Clear extra data. */ - - memset(str, 0, 2 * bytes); - - xfree(str); - - - - /* Reduce it to the desired number of bits. */ - - mpz_mod_2exp(ret, ret, bits); - -} - - - -/* Returns a prime number of the specified number of bits. The number - - will have the highest bit set and two lowest bits set. */ - - - -void rsa_random_prime(MP_INT *ret, RandomState *state, unsigned int bits) - -{ - - MP_INT start, aux; - - unsigned int num_primes; - - int *moduli; - - long difference; - - - - mpz_init(&start); - - mpz_init(&aux); - - - - retry: - - - - /* Pick a random integer of the appropriate size. */ - - rsa_random_integer(&start, state, bits); - - - - /* Set the two highest bits. */ - - mpz_set_ui(&aux, 3); - - mpz_mul_2exp(&aux, &aux, bits - 2); - - mpz_ior(&start, &start, &aux); - - /* Set the lowest bit to make it odd. */ - - mpz_set_ui(&aux, 1); - - mpz_ior(&start, &start, &aux); - - - - /* Initialize moduli of the small primes with respect to the given - - random number. */ - - moduli = xmalloc(MAX_PRIMES_IN_TABLE * sizeof(moduli[0])); - - if (bits < 16) - - num_primes = 0; /* Don\'t use the table for very small numbers. */ - - else - - { - - for (num_primes = 0; small_primes[num_primes] != 0; num_primes++) - - { - - mpz_mod_ui(&aux, &start, small_primes[num_primes]); - - moduli[num_primes] = mpz_get_ui(&aux); - - } - - } - - - - /* Look for numbers that are not evenly divisible by any of the small - - primes. */ - - for (difference = 0; ; difference += 2) - - { - - unsigned int i; - - - - if (difference > 0x70000000) - - { /* Should never happen, I think... */ - - if (rsa_verbose) - - fprintf(stderr, - - "rsa_random_prime: failed to find a prime, retrying.\n"); - - xfree(moduli); - - goto retry; - - } - - - - /* Check if it is a multiple of any small prime. Note that this - - updates the moduli into negative values as difference grows. */ - - for (i = 0; i < num_primes; i++) - - { - - while (moduli[i] + difference >= small_primes[i]) - - moduli[i] -= small_primes[i]; - - if (moduli[i] + difference == 0) - - break; - - } - - if (i < num_primes) - - continue; /* Multiple of a known prime. */ - - - - /* It passed the small prime test (not divisible by any of them). */ - - if (rsa_verbose) - - { - - fprintf(stderr, "."); - - } - - - - /* Compute the number in question. */ - - mpz_add_ui(ret, &start, difference); - - - - /* Perform the fermat test for witness 2. This means: - - it is not prime if 2^n mod n != 2. */ - - mpz_set_ui(&aux, 2); - - mpz_powm(&aux, &aux, ret, ret); - - if (mpz_cmp_ui(&aux, 2) == 0) - - { - - /* Passed the fermat test for witness 2. */ - - if (rsa_verbose) - - { - - fprintf(stderr, "+"); - - } - - /* Perform a more tests. These are probably unnecessary. */ - - if (mpz_probab_prime_p(ret, 20)) - - break; /* It is a prime with probability 1 - 2^-40. */ - - } - - } - - - - /* Found a (probable) prime. It is in ret. */ - - if (rsa_verbose) - - { - - fprintf(stderr, "+ (distance %ld)\n", difference); - - } - - - - /* Free the small prime moduli; they are no longer needed. */ - - xfree(moduli); - - - - /* Sanity check: does it still have the high bit set (we might have - - wrapped around)? */ - - mpz_div_2exp(&aux, ret, bits - 1); - - if (mpz_get_ui(&aux) != 1) - - { - - if (rsa_verbose) - - fprintf(stderr, "rsa_random_prime: high bit not set, retrying.\n"); - - goto retry; - - } - - mpz_clear(&start); - - mpz_clear(&aux); - - /* Return value already set in ret. */ - -} - - - -/* Computes the multiplicative inverse of a number using Euclids algorithm. - - Computes x such that a * x mod n = 1, where 0 < a < n. */ - - - -static void mpz_mod_inverse(MP_INT *x, MP_INT *a, MP_INT *n) - -{ - - MP_INT g0, g1, v0, v1, div, mod, aux; - - mpz_init_set(&g0, n); - - mpz_init_set(&g1, a); - - mpz_init_set_ui(&v0, 0); - - mpz_init_set_ui(&v1, 1); - - mpz_init(&div); - - mpz_init(&mod); - - mpz_init(&aux); - - while (mpz_cmp_ui(&g1, 0) != 0) - - { - - mpz_divmod(&div, &mod, &g0, &g1); - - mpz_mul(&aux, &div, &v1); - - mpz_sub(&aux, &v0, &aux); - - mpz_set(&v0, &v1); - - mpz_set(&v1, &aux); - - mpz_set(&g0, &g1); - - mpz_set(&g1, &mod); - - } - - if (mpz_cmp_ui(&v0, 0) < 0) - - mpz_add(x, &v0, n); - - else - - mpz_set(x, &v0); - - - - mpz_clear(&g0); - - mpz_clear(&g1); - - mpz_clear(&v0); - - mpz_clear(&v1); - - mpz_clear(&div); - - mpz_clear(&mod); - - mpz_clear(&aux); - -} - - - -/* Given mutual primes p and q, derives RSA key components n, e, d, and u. - - The exponent e will be at least ebits bits in size. - - p must be smaller than q. */ - - - -static void derive_rsa_keys(MP_INT *n, MP_INT *e, MP_INT *d, MP_INT *u, - - MP_INT *p, MP_INT *q, - - unsigned int ebits) - -{ - - MP_INT p_minus_1, q_minus_1, aux, phi, G, F; - - - - assert(mpz_cmp(p, q) < 0); - - - - mpz_init(&p_minus_1); - - mpz_init(&q_minus_1); - - mpz_init(&aux); - - mpz_init(&phi); - - mpz_init(&G); - - mpz_init(&F); - - - - /* Compute p-1 and q-1. */ - - mpz_sub_ui(&p_minus_1, p, 1); - - mpz_sub_ui(&q_minus_1, q, 1); - - - - /* phi = (p - 1) * (q - 1); the number of positive integers less than p*q - - that are relatively prime to p*q. */ - - mpz_mul(&phi, &p_minus_1, &q_minus_1); - - - - /* G is the number of "spare key sets" for a given modulus n. The smaller - - G is, the better. The smallest G can get is 2. */ - - mpz_gcd(&G, &p_minus_1, &q_minus_1); - - - - if (rsa_verbose) - - { - - if (mpz_cmp_ui(&G, 100) >= 0) - - { - - fprintf(stderr, "Warning: G="); - - mpz_out_str(stdout, 10, &G); - - fprintf(stderr, " is large (many spare key sets); key may be bad!\n"); - - } - - } - - - - /* F = phi / G; the number of relative prime numbers per spare key set. */ - - mpz_div(&F, &phi, &G); - - - - /* Find a suitable e (the public exponent). */ - - mpz_set_ui(e, 1); - - mpz_mul_2exp(e, e, ebits); - - mpz_sub_ui(e, e, 1); /* make lowest bit 1, and substract 2. */ - - /* Keep adding 2 until it is relatively prime to (p-1)(q-1). */ - - do - - { - - mpz_add_ui(e, e, 2); - - mpz_gcd(&aux, e, &phi); - - } - - while (mpz_cmp_ui(&aux, 1) != 0); - - - - /* d is the multiplicative inverse of e, mod F. Could also be mod - - (p-1)(q-1); however, we try to choose the smallest possible d. */ - - mpz_mod_inverse(d, e, &F); - - - - /* u is the multiplicative inverse of p, mod q, if p < q. It is used - - when doing private key RSA operations using the chinese remainder - - theorem method. */ - - mpz_mod_inverse(u, p, q); - - - - /* n = p * q (the public modulus). */ - - mpz_mul(n, p, q); - - - - /* Clear auxiliary variables. */ - - mpz_clear(&p_minus_1); - - mpz_clear(&q_minus_1); - - mpz_clear(&aux); - - mpz_clear(&phi); - - mpz_clear(&G); - - mpz_clear(&F); - -} - - - -/* Generates RSA public and private keys. This initializes the data - - structures; they should be freed with rsa_clear_private_key and - - rsa_clear_public_key. */ - - - -void rsa_generate_key(RSAPrivateKey *prv, RSAPublicKey *pub, - - RandomState *state, unsigned int bits) - -{ - - MP_INT test, aux; - - unsigned int pbits, qbits; - - int ret; - - - - mpz_init(&prv->q); - - mpz_init(&prv->p); - - mpz_init(&prv->e); - - mpz_init(&prv->d); - - mpz_init(&prv->u); - - mpz_init(&prv->n); - - mpz_init(&test); - - mpz_init(&aux); - - - - /* Compute the number of bits in each prime. */ - - pbits = bits / 2; - - qbits = bits - pbits; - - - -#ifndef RSAREF - - retry0: - -#endif /* !RSAREF */ - - - - if (rsa_verbose) - - { - - fprintf(stderr, "Generating p: "); - - } - - - - /* Generate random number p. */ - - rsa_random_prime(&prv->p, state, pbits); - - - - retry: - - - - if (rsa_verbose) - - { - - fprintf(stderr, "Generating q: "); - - } - - - - /* Generate random number q. */ - - rsa_random_prime(&prv->q, state, qbits); - - - - /* Sort them so that p < q. */ - - ret = mpz_cmp(&prv->p, &prv->q); - - if (ret == 0) - - { - - if (rsa_verbose) - - fprintf(stderr, "Generated the same prime twice!\n"); - - goto retry; - - } - - if (ret > 0) - - { - - mpz_set(&aux, &prv->p); - - mpz_set(&prv->p, &prv->q); - - mpz_set(&prv->q, &aux); - - } - - - - /* Make sure that p and q are not too close together (I am not sure if this - - is important). */ - - mpz_sub(&aux, &prv->q, &prv->p); - - mpz_div_2exp(&test, &prv->q, 10); - - if (mpz_cmp(&aux, &test) < 0) - - { - - if (rsa_verbose) - - fprintf(stderr, "The primes are too close together.\n"); - - goto retry; - - } - - - - /* Make certain p and q are relatively prime (in case one or both were false - - positives... Though this is quite impossible). */ - - mpz_gcd(&aux, &prv->p, &prv->q); - - if (mpz_cmp_ui(&aux, 1) != 0) - - { - - if (rsa_verbose) - - fprintf(stderr, "The primes are not relatively prime!\n"); - - goto retry; - - } - - - - /* Derive the RSA private key from the primes. */ - - if (rsa_verbose) - - fprintf(stderr, "Computing the keys...\n"); - - derive_rsa_keys(&prv->n, &prv->e, &prv->d, &prv->u, &prv->p, &prv->q, 5); - - prv->bits = bits; - - - - /* Initialize the public key with public data from the private key. */ - - pub->bits = bits; - - mpz_init_set(&pub->n, &prv->n); - - mpz_init_set(&pub->e, &prv->e); - - - -#ifndef RSAREF /* I don't want to kludge these to work with RSAREF. */ - - /* Test that the key really works. This should never fail (I think). */ - - if (rsa_verbose) - - fprintf(stderr, "Testing the keys...\n"); - - rsa_random_integer(&test, state, bits); - - mpz_mod(&test, &test, &pub->n); /* must be less than n. */ - - rsa_private(&aux, &test, prv); - - rsa_public(&aux, &aux, pub); - - if (mpz_cmp(&aux, &test) != 0) - - { - - if (rsa_verbose) - - fprintf(stderr, "**** private+public failed to decrypt.\n"); - - goto retry0; - - } - - - - rsa_public(&aux, &test, pub); - - rsa_private(&aux, &aux, prv); - - if (mpz_cmp(&aux, &test) != 0) - - { - - if (rsa_verbose) - - fprintf(stderr, "**** public+private failed to decrypt.\n"); - - goto retry0; - - } - -#endif /* !RSAREF */ - - - - mpz_clear(&aux); - - mpz_clear(&test); - - - - if (rsa_verbose) - - fprintf(stderr, "Key generation complete.\n"); - -} - - - -/* Frees any memory associated with the private key. */ - - - -void rsa_clear_private_key(RSAPrivateKey *prv) - -{ - - prv->bits = 0; - - mpz_clear(&prv->n); - - mpz_clear(&prv->e); - - mpz_clear(&prv->d); - - mpz_clear(&prv->u); - - mpz_clear(&prv->p); - - mpz_clear(&prv->q); - -} - - - -/* Frees any memory associated with the public key. */ - - - -void rsa_clear_public_key(RSAPublicKey *pub) - -{ - - pub->bits = 0; - - mpz_clear(&pub->e); - - mpz_clear(&pub->n); - -} - - - -#ifndef RSAREF - - - -/* Performs a private-key RSA operation (encrypt/decrypt). The computation - - is done using the Chinese Remainder Theorem, which is faster than - - direct modular exponentiation. */ - - - -void rsa_private(MP_INT *output, MP_INT *input, RSAPrivateKey *prv) - -{ - - MP_INT dp, dq, p2, q2, k; - - - - /* Initialize temporary variables. */ - - mpz_init(&dp); - - mpz_init(&dq); - - mpz_init(&p2); - - mpz_init(&q2); - - mpz_init(&k); - - - - /* Compute dp = d mod p-1. */ - - mpz_sub_ui(&dp, &prv->p, 1); - - mpz_mod(&dp, &prv->d, &dp); - - - - /* Compute dq = d mod q-1. */ - - mpz_sub_ui(&dq, &prv->q, 1); - - mpz_mod(&dq, &prv->d, &dq); - - - - /* Compute p2 = (input mod p) ^ dp mod p. */ - - mpz_mod(&p2, input, &prv->p); - - mpz_powm(&p2, &p2, &dp, &prv->p); - - - - /* Compute q2 = (input mod q) ^ dq mod q. */ - - mpz_mod(&q2, input, &prv->q); - - mpz_powm(&q2, &q2, &dq, &prv->q); - - - - /* Compute k = ((q2 - p2) mod q) * u mod q. */ - - mpz_sub(&k, &q2, &p2); - - mpz_mul(&k, &k, &prv->u); - - mpz_mmod(&k, &k, &prv->q); - - - - /* Compute output = p2 + p * k. */ - - mpz_mul(output, &prv->p, &k); - - mpz_add(output, output, &p2); - - - - /* Clear temporary variables. */ - - mpz_clear(&dp); - - mpz_clear(&dq); - - mpz_clear(&p2); - - mpz_clear(&q2); - - mpz_clear(&k); - -} - - - -/* Performs a public-key RSA operation (encrypt/decrypt). */ - - - -void rsa_public(MP_INT *output, MP_INT *input, RSAPublicKey *pub) - -{ - - mpz_powm(output, input, &pub->e, &pub->n); - -} - - - -#endif /* !RSAREF */ - - - -/* Special realloc that zeroes the old memory before freeing it. */ - - - -static void *rsa_realloc(void *ptr, size_t old_size, size_t new_size) - -{ - - int s; - - void *p = xmalloc(new_size); - - s = old_size; - - if (old_size > new_size) - - s = new_size; - - memcpy(p, ptr, s); - - memset(ptr, 0, old_size); - - xfree(ptr); - - return p; - -} - - - -/* Special free that zeroes the memory before freeing it. */ - - - -static void rsa_free(void *ptr, size_t size) - -{ - - memset(ptr, 0, size); - - xfree(ptr); - -} - - - -/* Sets MP_INT memory allocation routines to ones that clear any memory - - when freed. */ - - - -void rsa_set_mp_memory_allocation(void) - -{ - - mp_set_memory_functions(xmalloc, rsa_realloc, rsa_free); - -} - - - -/* Set whether to output verbose messages during key generation. */ - - - -void rsa_set_verbose(int verbose) - -{ - - rsa_verbose = verbose; - -} - -/* program ends */ \ No newline at end of file diff --git a/uppdev/rsa/rsa.upp b/uppdev/rsa/rsa.upp deleted file mode 100644 index f19210ef2..000000000 --- a/uppdev/rsa/rsa.upp +++ /dev/null @@ -1,2 +0,0 @@ -file - rsa.cpp; diff --git a/uppdev/rtftest/rtftest.cpp b/uppdev/rtftest/rtftest.cpp deleted file mode 100644 index 5b606bfc0..000000000 --- a/uppdev/rtftest/rtftest.cpp +++ /dev/null @@ -1,116 +0,0 @@ -#include - -using namespace Upp; - -static void CatChart(RichText& out, String title, Drawing dwg) -{ - RichTable table; - table.AddColumn(1); - table.SetQTF(0, 0, title); - table[0][0].format.color = GrayColor(240); - RichObject object = CreateDrawingObject(dwg, dwg.GetSize(), dwg.GetSize()); - RichPara para; - para.format.align = ALIGN_CENTER; - para.Cat(object, para.format); - RichTxt txt; - txt.Cat(para, out.GetStyles()); - table.SetPick(1, 0, txt); - table.format.keep = true; - out.CatPick(table); - out.Cat(RichPara()); -} - -static void PaintLegend(Draw& draw, Rect& outer, const Vector& linie, bool do_rtext) -{ - Vector order = GetSortOrder(linie, GetLanguageInfo()); - - static const int LINE_WD = 150; - static const int TEXT_HT = 80; - static const int LEG_OUTER_GAP = 100; - static const int LEG_INNER_GAP = 30; - - RichPara legend_para; - RichPara::CharFormat fmt; - fmt.Face(Font::ARIAL).Height(TEXT_HT); - for(int o = 0; o < order.GetCount(); o++) { - String l = linie[order[o]]; - WString ltext = l.ToWString(); - - DrawingDraw ddraw(LINE_WD, TEXT_HT); - ddraw.DrawLine(0, TEXT_HT / 2, LINE_WD, TEXT_HT / 2, 5, LtGreen()); - - if(o) { - legend_para.Cat(WString(0xa0, 1), fmt); - legend_para.Cat(WString(0xa0, 1), fmt); - legend_para.Cat(WString(0xa0, 1), fmt); - legend_para.Cat(WString(' ', 1), fmt); - } - - legend_para.Cat(CreateDrawingObject(ddraw, LINE_WD, TEXT_HT), fmt); - legend_para.Cat(WString(0xa0, 1), fmt); - legend_para.Cat(WString(0xa0, 1), fmt); - for(int i = 0; i < ltext.GetLength(); i++) - if(ltext[i] == ' ') - ltext.Set(i, 0xA0); - legend_para.Cat(ltext, fmt); - } - RichText rtext; - rtext.Cat(legend_para); - rtext.Normalize(); - - DDUMP(AsQTF(rtext)); - - int wd = min(rtext.GetWidth(), outer.Width() - 2 * LEG_INNER_GAP); - int ht = rtext.GetHeight(wd); - - Rect leg_rc; - leg_rc.left = (outer.left + outer.right - wd - 2 * LEG_INNER_GAP) >> 1; - leg_rc.right = leg_rc.left + wd + 2 * LEG_INNER_GAP; - leg_rc.top = outer.top; - leg_rc.bottom = leg_rc.top + ht + 2 * LEG_INNER_GAP; - - DrawFatFrame(draw, leg_rc, Black(), 10); - if(do_rtext) - rtext.Paint(draw, leg_rc.left + LEG_INNER_GAP, leg_rc.top + LEG_INNER_GAP, wd); - - outer.top = leg_rc.bottom + LEG_OUTER_GAP; -} - -void VHBChartPrekroceniPrutoku(RichText& out, bool do_rtext) -{ - Size dwg_size = iscale(Size(140, 100), 6000, 254); - - DrawingDraw draw(dwg_size); - - Rect outer(dwg_size); - outer.Deflate(50); - - Vector linie; - for(int i = 0; i < 10; i++) - linie.Add(NFormat("testovaci linie [%d]", i)); - - PaintLegend(draw, outer, linie, do_rtext); - - Rect inner = outer, fixed = outer; - - while(inner.Width() >= 100 && inner.Height() >= 100) { - DrawFatFrame(draw, inner, LtRed(), 20); - inner.Deflate(100); - } - - CatChart(out, "[A1 [= VHBChartPrekroceniPrutoku", draw); -} - -GUI_APP_MAIN { - RichText richtext; - - VHBChartPrekroceniPrutoku(richtext, false); - VHBChartPrekroceniPrutoku(richtext, true); - - WriteClipboard("Rich text format", EncodeRTF(richtext)); - - Report report; - report.Put(richtext); - - Perform(report); -} diff --git a/uppdev/rtftest/rtftest.upp b/uppdev/rtftest/rtftest.upp deleted file mode 100644 index 05648e6a7..000000000 --- a/uppdev/rtftest/rtftest.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - Report; - -file - rtftest.cpp; - -mainconfig - "" = "GUI"; - diff --git a/uppdev/sTools/sTools.cpp b/uppdev/sTools/sTools.cpp deleted file mode 100644 index b98bc9245..000000000 --- a/uppdev/sTools/sTools.cpp +++ /dev/null @@ -1,73 +0,0 @@ -#include -#include - -void replaceInto( const char* marca, const char* newText, String& buffer ) -{ - const int lMarca = strlen( marca ) ; - const int lNew = strlen( newText ) ; - int pos = 1 ; - while (pos < buffer.GetLength() ) - { - if (buffer.Mid(pos, lMarca) == marca) - { - buffer.Remove(pos, lMarca ) ; - buffer.Insert(pos, newText ) ; - pos += lNew ; - } - else - pos ++ ; - } -} -String SetQ( const String s ) -{ - return "'" + s + "'" ; -} -String Set2Q( const String s ) -{ - return "\"" + s + "\"" ; -} - -String VectorString2String( Vector& v, const char * separador) -{ - String result ; - for (int i = 0; i < v.GetCount(); i++) - { - if (i > 0) - result += separador ; - result += v[i] ; - } - return result ; -} - -static int myFilter( int c ) -{ - if (c == '\r' || c == '\n') - return c ; - return 0 ; -} -Vector String2VectorString( const String& str) -{ - return Split(str, myFilter) ; -} - -int enumCharSet() -{ - static int chs[] = { - CHARSET_ISO8859_1, CHARSET_ISO8859_2, CHARSET_ISO8859_3, CHARSET_ISO8859_4,CHARSET_ISO8859_5, - CHARSET_ISO8859_6, CHARSET_ISO8859_7, CHARSET_ISO8859_8, CHARSET_ISO8859_9, CHARSET_ISO8859_10, - CHARSET_ISO8859_13, CHARSET_ISO8859_14, CHARSET_ISO8859_15, CHARSET_ISO8859_16, CHARSET_WIN1250, - CHARSET_WIN1251, CHARSET_WIN1252, CHARSET_WIN1253, CHARSET_WIN1254, CHARSET_WIN1255,CHARSET_WIN1256, - CHARSET_WIN1257, CHARSET_WIN1258, CHARSET_KOI8_R, CHARSET_CP852, CHARSET_MJK, - CHARSET_UTF8 } ; - static int i = -1, size = sizeof(chs) / sizeof(chs[0]) ; - if (i >= size ) - { - i = -1 ; - return 0 ; - } - else if (i == -1) - i = 0 ; - else - i++ ; - return chs[i] ; -} diff --git a/uppdev/sTools/sTools.h b/uppdev/sTools/sTools.h deleted file mode 100644 index c25561327..000000000 --- a/uppdev/sTools/sTools.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef _sTools_h_ -#define _sTools_h_ - -void replaceInto( const char* marca, const char* newText, String& buffer ) ; -String SetQ( const String s ) ; -String Set2Q( const String s ) ; - -String VectorString2String( Vector& v, const char * separador = "\r\n") ; -Vector String2VectorString( const String& str ) ; - -int enumCharSet() ; -#endif diff --git a/uppdev/sTools/sTools.upp b/uppdev/sTools/sTools.upp deleted file mode 100644 index 3c3f76ee5..000000000 --- a/uppdev/sTools/sTools.upp +++ /dev/null @@ -1,3 +0,0 @@ -file - sTools.cpp, - sTools.h; diff --git a/uppdev/sdiff/main.cpp b/uppdev/sdiff/main.cpp deleted file mode 100644 index 10b794e33..000000000 --- a/uppdev/sdiff/main.cpp +++ /dev/null @@ -1,50 +0,0 @@ -#include - -String GenString(int len) -{ - String result; - while(len--) - result.Cat(255 - rand() % 226); - return result; -} - -void Main() -{ - String master = LoadFile("e:\\file1.txt"); - String data = LoadFile("e:\\file2.txt"); - TimeStop(); -// LOG("Test"); -// RDUMP(TimeStop()); -// RDUMP(DiffPack(master, data).GetLength()); - TimeStop(); - for(int i = 0; i < 10; i++) - { - RDUMP(DiffPack(master, data).GetLength()); -// ASSERT(DiffUnpack(master, pack) == data); - } - RDUMP(TimeStop()); - - String s = GenString(500000); - String z = String(0, 1000000); - TimeStop(); - RDUMP(DiffPack(s, s + s).GetLength()); - RDUMP(TimeStop()); - RDUMP(DiffPack(z, z).GetLength()); - RDUMP(TimeStop()); - int q = 0; - for(;;) { - if(q++ % 1000) - printf("%d\r\n", q); - if(rand() % 5 == 0) - master = data; - int n = rand() % 50; - if(rand() & 1) - data.Insert(rand() % data.GetLength(), GenString(n)); - else { - if(n < data.GetLength()) - data.Remove(rand() % (data.GetLength() - n), n); - } - String pack = DiffPack(master, data); - ASSERT(DiffUnpack(master, pack) == data); - } -} diff --git a/uppdev/sdiff/prj.aux b/uppdev/sdiff/prj.aux deleted file mode 100644 index 7b9db8ef1..000000000 --- a/uppdev/sdiff/prj.aux +++ /dev/null @@ -1,5 +0,0 @@ -file - e:\out\upp/sdiff/CONSOLE-IA32-MAIN-MSC-RELEASE-ST-STATIC-WIN32\sdiff.log, - e:\out\upp/sdiff/CONSOLE-DEBUG-IA32-MAIN-MSC-ST-STATIC-WIN32\sdiff.log, - e:\file2.txt charset "windows-1250", - e:\file1.txt charset "windows-1250"; diff --git a/uppdev/sdiff/sdiff.upp b/uppdev/sdiff/sdiff.upp deleted file mode 100644 index c93aa785f..000000000 --- a/uppdev/sdiff/sdiff.upp +++ /dev/null @@ -1,8 +0,0 @@ -uses - Core; - -file - main.cpp; - -mainconfig - "" = normal "CONSOLE ST STATIC"; diff --git a/uppdev/sdlt1/sdlt1.cpp b/uppdev/sdlt1/sdlt1.cpp deleted file mode 100644 index 578a23571..000000000 --- a/uppdev/sdlt1/sdlt1.cpp +++ /dev/null @@ -1,65 +0,0 @@ -#include "sdlt1.h" - -SDL_Surface * OpenScreen(const int width, const int height, const int bpp, const int flags) -{ - SDL_Surface * screen = SDL_SetVideoMode(width, height, bpp, flags); - if(!screen) - { - printf("Couldn't set display mode: %s\n", SDL_GetError()); - return NULL; - } - return screen; -} - -void Paint(SDL_Surface * surface) -{ - /* Put your painting code here */ -} - -int main(int argc, char **argv) -{ - if(SDL_Init(SDL_INIT_VIDEO) < 0) - return 1; - - int videoflags = SDL_HWSURFACE | SDL_HWACCEL | SDL_FULLSCREEN | SDL_DOUBLEBUF; - SDL_Surface * screen = OpenScreen(1024, 768, 32, videoflags); - if(!screen) - return 1; - - SDL_Event event; - bool done = false; - - while(!done) - { - if(SDL_PollEvent(&event)) - { - switch (event.type) - { - case SDL_KEYDOWN: - if(event.key.keysym.sym == SDLK_LALT || event.key.keysym.sym == SDLK_TAB) - break; - if(event.key.keysym.sym == SDLK_RETURN) - { - videoflags ^= SDL_FULLSCREEN; - screen = OpenScreen(screen->w, screen->h, screen->format->BitsPerPixel, videoflags); - if(!screen) - done = true; - break; - } - case SDL_QUIT: - done = true; - break; - default: - break; - } - } - else - { - Paint(screen); - SDL_Flip(screen); - } - } - SDL_FreeSurface(screen); - SDL_Quit(); - return 0; -} diff --git a/uppdev/sdlt1/sdlt1.h b/uppdev/sdlt1/sdlt1.h deleted file mode 100644 index 3476acbed..000000000 --- a/uppdev/sdlt1/sdlt1.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _sdlt1_sdlt1_h -#define _sdlt1_sdlt1_h - -#include - -#endif diff --git a/uppdev/sdlt1/sdlt1.upp b/uppdev/sdlt1/sdlt1.upp deleted file mode 100644 index c13e31859..000000000 --- a/uppdev/sdlt1/sdlt1.upp +++ /dev/null @@ -1,15 +0,0 @@ -uses - plugin\sdl, - Web\SSL; - -library(MSC) "SDL SDLmain"; - -library(GCC WIN32) "SDL.dll SDLmain"; - -file - sdlt1.h, - sdlt1.cpp; - -mainconfig - "" = ""; - diff --git a/uppdev/server.crt b/uppdev/server.crt deleted file mode 100644 index fb5ad4f7c..000000000 --- a/uppdev/server.crt +++ /dev/null @@ -1,15 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICVzCCAcACCQDKDpTIkLkBjDANBgkqhkiG9w0BAQUFADBwMQswCQYDVQQGEwJD -WjELMAkGA1UECAwCQ1oxDTALBgNVBAcMBHRlc3QxDTALBgNVBAoMBHRlc3QxDTAL -BgNVBAsMBHRlc3QxEjAQBgNVBAMMCWxvY2FsaG9zdDETMBEGCSqGSIb3DQEJARYE -dGVzdDAeFw0xNDAzMDIxNTQ1MjVaFw0xNjEyMjAxNTQ1MjVaMHAxCzAJBgNVBAYT -AkNaMQswCQYDVQQIDAJDWjENMAsGA1UEBwwEdGVzdDENMAsGA1UECgwEdGVzdDEN -MAsGA1UECwwEdGVzdDESMBAGA1UEAwwJbG9jYWxob3N0MRMwEQYJKoZIhvcNAQkB -FgR0ZXN0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDioZOQ8350EYK+GSg2 -uxEdcpqiRLgVVzwpDGYS2w0ongU/wE6kpWqvVoq8tYg+19uUQRQnTl1AE9XGvvfc -PeO1cr1tmjDse85TJMwzOPjEcbFXV4VaUdR04NbsZR9gXy7kXMDu1pwfuOuWsUkU -or1QeeQygeIo4hMw+HGEs1GVZwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAJiS4a0v -BqY1MzuwAamrgfDMTquF/Dm8OrFM9JHSSYdjabgDBpyjVMNZ1R+mkt4MP9iqfT9T -MLeGg++W3IvqwY6KfKS2NqFrphTah6vW1TziinyLEgcIqwThVRTjNLRcMJmP1FQr -GOmkNO242TKanRs1Pq1jZNZXPVRXXf0S+gfQ ------END CERTIFICATE----- diff --git a/uppdev/server.csr b/uppdev/server.csr deleted file mode 100644 index 4eaf20dc9..000000000 --- a/uppdev/server.csr +++ /dev/null @@ -1,12 +0,0 @@ ------BEGIN CERTIFICATE REQUEST----- -MIIBsDCCARkCAQAwcDELMAkGA1UEBhMCQ1oxCzAJBgNVBAgMAkNaMQ0wCwYDVQQH -DAR0ZXN0MQ0wCwYDVQQKDAR0ZXN0MQ0wCwYDVQQLDAR0ZXN0MRIwEAYDVQQDDAls -b2NhbGhvc3QxEzARBgkqhkiG9w0BCQEWBHRlc3QwgZ8wDQYJKoZIhvcNAQEBBQAD -gY0AMIGJAoGBAOKhk5DzfnQRgr4ZKDa7ER1ymqJEuBVXPCkMZhLbDSieBT/ATqSl -aq9Wiry1iD7X25RBFCdOXUAT1ca+99w947VyvW2aMOx7zlMkzDM4+MRxsVdXhVpR -1HTg1uxlH2BfLuRcwO7WnB+465axSRSivVB55DKB4ijiEzD4cYSzUZVnAgMBAAGg -ADANBgkqhkiG9w0BAQUFAAOBgQBMA01No5HMp7HQ8CQZTpC4YlR3WyOundPrZhEq -A38eLhE3vkByl1rclOQ/lv6ya0amIDj50nLzYrrn2JfF+ePllIU0H441ns9HRAYW -Dc8cLIP99H17/P73wOIyKnf7I7DXY8O6ff/9S/AHodBTcW8XwGiVg75BZqurhgY5 -IJ0jfQ== ------END CERTIFICATE REQUEST----- diff --git a/uppdev/server.key b/uppdev/server.key deleted file mode 100644 index 08c5e678e..000000000 --- a/uppdev/server.key +++ /dev/null @@ -1,15 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIICXQIBAAKBgQDioZOQ8350EYK+GSg2uxEdcpqiRLgVVzwpDGYS2w0ongU/wE6k -pWqvVoq8tYg+19uUQRQnTl1AE9XGvvfcPeO1cr1tmjDse85TJMwzOPjEcbFXV4Va -UdR04NbsZR9gXy7kXMDu1pwfuOuWsUkUor1QeeQygeIo4hMw+HGEs1GVZwIDAQAB -AoGBAIGsiB4JZRKOrmuNQ3hFg16BI7+zaE01tAOcx48EbbwO5tv6ckU9LRUUhJ/D -kyi6JDbpIdn3ud2fO9PTk0ke1Hn7ehHn47k39Ady/4TZUlYohjrNjBbSQs4FD3A8 -npq5wiHg4Bokfz2Bd9HzSaaIC8gZvDXg6OBBby4HzQ4KoFlRAkEA88bqfDVZ4d7m -7rjppvTI5IleH2rmAm7tQSRg9j6qZxw0ZYiOCyyNMnzb0TjdEhPH0b6SZqWMYh3b -MDzGFu7JSQJBAO3+lDK7Zkia9UtOm17qUvTcMzi5rmW8kfeog5Tzwx80mUsvC7Gk -MZX7XDajKMz5rhW8ex4iDcMQM8/RQEu+mS8CQCoEfyYpi/SClwtOk/dS+c1qX+7K -XhrNQ9eWjZ/j7TsYgW9+ufzzEONC4iCNzIzxG9/rGRDYN/oxazZFQ19wiQECQHc3 -iIslPqZuISP5G3FfVfDcgTgQI2FJJaF2o3sw5HQ0R/nWdjglNMWZpWalMqIDDIZM -5SuCCXzGF/4pJtkKf/cCQQDM09LC+cJMVPyzDmgEUu+izq8HtN7LYoxL2ikf1gLD -qTGUlTl9/+b5UVc95OpWykU7y6C+F3Vi2US1a3tU214u ------END RSA PRIVATE KEY----- diff --git a/uppdev/shutdown/shutdown.upp b/uppdev/shutdown/shutdown.upp deleted file mode 100644 index e69de29bb..000000000 diff --git a/uppdev/sic.oold/Sic.cpp b/uppdev/sic.oold/Sic.cpp deleted file mode 100644 index 88c32e452..000000000 --- a/uppdev/sic.oold/Sic.cpp +++ /dev/null @@ -1,879 +0,0 @@ -#include - -void LambdaArgs(CParser& p, SLambda& l) -{ - p.PassChar('('); - if(!p.Char(')')) - for(;;) { - l.ref.Add(p.Char('&')); - l.arg.Add(p.ReadId()); - if(p.Char(')')) - break; - p.PassChar(','); - } - l.ref.Shrink(); - l.arg.Shrink(); -} - -String Sic::ReadName() -{ - if(Id("operator")) { - if(Char2('+', '=')) - return "operator+="; - else - if(Char2('-', '=')) - return "operator-="; - else - if(Char2('*', '=')) - return "operator*="; - else - if(Char2('/', '=')) - return "operator/="; - else - if(Char2('%', '=')) - return "operator%="; - else - if(Char2('>', '<')) - return "operator><"; - else - if(Char2('=', '=')) - return "operator=="; - else - if(Char2('<', '<')) - return "operator<<"; - else - ThrowError("invalid operator"); - } - return ReadId(); -} - -SVal Sic::ReadLambda() -{ - SVal lambda; - SLambda& l = lambda.CreateLambda(); - LambdaArgs(*this, l); - if(!IsChar('{')) - ThrowError("missing '{'"); - const char *t = GetPtr(); - SkipStatement(); - l.code = String(t, GetPtr()); - return lambda; -} - -SVal Sic::ExecuteLambda(const String& id, SVal lambda, SVal *self, Vector& arg) -{ - if(!lambda.IsLambda()) - ThrowError("lambda required"); - const SLambda& l = lambda.GetLambda(); - if(l.arg.GetCount() != arg.GetCount()) - ThrowError("invalid number of arguments in call to '" + id + "'"); - if(l.escape) { - SVal ret_val = (*l.escape)(*this, arg); - return ret_val; - } - if(stack_level > 40) - ThrowError("Stack overflow"); - Sic sub(global, l.code); - sub.self = self; - sub.stack_level = stack_level + 1; - for(int i = 0; i < l.arg.GetCount(); i++) { - Var& v = sub.var.GetAdd(l.arg[i]); - if(l.ref[i]) { - if(!arg[i].lvalue) - ThrowError("l-value required for " + l.arg[i] + - " argument in call to '" + id + "'"); - v.ref = arg[i].lvalue; - } - else - v.var = arg[i]; - } - sub.Run(); - return sub.return_value; -} - -Sic::SRVal Sic::Term() -{ - if(IsInt()) - return ReadInt(); - if(IsString()) - return ReadString(); - if(Char('@')) - return ReadLambda(); - SRVal v; - if(Id("void")) - return v; - if(Char('{')) { - SVal map; - map.SetMap(); - if(!Char('}')) - for(;;) { - SVal v = Exp(); - if(Char(':')) - map.Set(v) = Exp(); - else - map.Add() = v; - if(Char('}')) - break; - PassChar(','); - } - return map; - } - if(Char('(')) { - SRVal v = Exp(); - PassChar(')'); - return v; - } - SVal *_self = NULL; - bool _global = false; - if(Char('.')) { - if(!self) - ThrowError("member-access in non-member lambda"); - _self = self; - } - else - if(Char(':')) - _global = true; - if(IsId()) { - String id = ReadName(); - int ii; - SVal *self = _self; - if(!_self && !_global && var.Find(id) < 0 && - IsChar('(') && (ii = global.Find(id)) >= 0 && - global[ii].IsLambda()) - v = global[ii]; - else { - if(_self) - v.lvalue = &_self->Set(id); - else - if(_global) - v.lvalue = &global.GetAdd(id); - else { - Var& q = var.GetAdd(id); - if(q.ref) - v.lvalue = q.ref; - else - v.lvalue = &q.var; - } - for(;;) - if(Char('[')) { - self = v.lvalue; - if(Char(']')) - v.lvalue = &v.lvalue->Add(); - else { - SVal x = Exp(); - v.lvalue = &v.lvalue->Set(x); - PassChar(']'); - } - } - else - if(Char('.')) { - self = v.lvalue; - id = ReadId(); - v.lvalue = &v.lvalue->Set(id); - } - else - break; - } - if(Char('(')) { - Vector arg; - if(!Char(')')) - for(;;) { - arg.Add(Exp()); - if(Char(')')) break; - PassChar(','); - } - v = ExecuteLambda(id, v, self, arg); - } - } - else - ThrowError("invalid expression"); - return v; -} - -void Escape(ArrayMap& global, - const char *function, - SVal (*fn)(Sic& sic, Vector& var)) -{ - CParser p(function); - SVal& v = global.GetAdd(p.ReadId()); - SLambda& l = v.CreateLambda(); - l.escape = fn; - LambdaArgs(p, l); -} - -Sic::SRVal Sic::Unary() -{ - SRVal a; - if(Char2('+', '+')) { - a = Unary(); - if(!a->IsNumber()) - ThrowError("invalid type for prefix '++' operator"); - if(!a.lvalue) - ThrowError("l-value required for prefix '++' operator"); - *a.lvalue = a->GetNumber() + 1; - } - else - if(Char2('-', '-')) { - a = Unary(); - if(!a->IsNumber()) - ThrowError("invalid type for prefix '--' operator"); - if(!a.lvalue) - ThrowError("l-value required for prefix '--' operator"); - *a.lvalue = a->GetNumber() - 1; - } - else - if(Char('-')) { - a = Unary(); - if(a->IsNumber()) - a = -a->GetNumber(); - else - ThrowError("incompatible types for unary '-' operator"); - } - else - if(Char('+')) { - a = Unary(); - if(a->IsNumber()) - a = -a->GetNumber(); - else - ThrowError("incompatible types for unary '+' operator"); - } - else - if(Char('!')) - a = !IsTrue(Unary()); - else - if(Char('~')) { - a = Unary(); - if(a->IsNumber()) - a = ~(int)a->GetNumber(); - else - ThrowError("incompatible types for unary '~' operator"); - } - else - a = Term(); - - if(Char2('+', '+')) { - if(!a->IsNumber()) - ThrowError("invalid type for postfix '++' operator"); - if(!a.lvalue) - ThrowError("l-value required for postfix '++' operator"); - SRVal x = a->GetNumber(); - *a.lvalue = a->GetNumber() + 1; - return x; - } - if(Char2('-', '-')) { - if(!a->IsNumber()) - ThrowError("invalid type for postfix '--' operator"); - if(!a.lvalue) - ThrowError("l-value required for postfix '--' operator"); - SRVal x = a->GetNumber(); - *a.lvalue = a->GetNumber() - 1; - return x; - } - return a; -} - -Sic::SRVal Sic::Operator(Sic::SRVal a, Sic::SRVal b, const char *oper, const char *op, bool sym) -{ - if(a->IsMap()) { - const ArrayMap& m = a->GetMap(); - int q = m.Find(String(oper)); - if(q >= 0 && m[q].IsLambda()) { - Vector arg; - arg.SetCount(1); - arg[0] = b; - ExecuteLambda(oper, m[q], a.lvalue ? a.lvalue : &a.rvalue, arg); - return a; - } - } - if(sym) - return Operator(b, a, oper, op); - ThrowError(String() << "incompatible types for '" << op << "' operator"); - return a; -} - -Sic::SRVal Sic::Mul() -{ - SRVal a = Unary(); - for(;;) - if(!IsChar2('*', '=') && Char('*')) { - SRVal b = Unary(); - if(a->IsNumber() && b->IsNumber()) - a = a->GetNumber() * b->GetNumber(); - else - a = Operator(~a, ~b, "operator*=", "*", true); - } - else - if(!IsChar2('/', '=') && Char('/')) { - SRVal b = Unary(); - if(a->IsNumber() && b->IsNumber()) - a = a->GetNumber() / b->GetNumber(); - else - a = Operator(~a, b, "operator/=", "/"); - } - else - if(!IsChar2('%', '=') && Char('%')) { - SRVal b = Unary(); - if(a->IsNumber() && b->IsNumber()) - a = (int)a->GetNumber() % (int)b->GetNumber(); - else - a = Operator(~a, b, "operator%=", "%"); - } - else - return a; -} - -Sic::SRVal Sic::Add() -{ - SRVal a = Sic::Mul(); - for(;;) - if(!IsChar2('+', '=') && Char('+')) { - SRVal b = Mul(); - if(a->IsNumber() && b->IsNumber()) - a = a->GetNumber() + b->GetNumber(); - else - if(a->IsString() && b->IsString()) - a = a->GetString() + b->GetString(); - else - a = Operator(~a, ~b, "operator+=", "+", true); - } - else - if(!IsChar2('-', '=') && Char('-')) { - SRVal b = Mul(); - if(a->IsNumber() && b->IsNumber()) - a = a->GetNumber() - b->GetNumber(); - else - a = Operator(~a, b, "operator-=", "-"); - } - else - return a; -} - -Sic::SRVal Sic::Shift() -{ - SRVal a = Add(); - for(;;) - if(Char2('<', '<')) { - SRVal b = Add(); - if(a->IsNumber() && b->IsNumber()) - a = (int)a->GetNumber() << (int)b->GetNumber(); - else { - if(a->IsVoid()) - if(a.lvalue) - *a.lvalue = String(); - else - a.rvalue = String(); - if(a->IsString()) { - if(b->IsString()) - a.lvalue->GetString() << b->GetString(); - else - if(b->IsNumber()) - a.lvalue->GetString() << b->GetNumber(); - else - if(!b->IsVoid()) - ThrowError("Not implemented"); - } - else - a = Operator(a, b, "operator<<", "<<", true); - } - } - else - if(Char2('>', '>')) { - SRVal b = Add(); - if(a->IsNumber() && b->IsNumber()) - a = (int)a->GetNumber() >> (int)b->GetNumber(); - else - ThrowError("incompatible types for '>>' operator"); - } - else - return a; - -} - -int Sic::DoCompare(const SVal& a) -{ - SVal b = Shift(); - if(a.IsNumber() && b.IsNumber()) - return a.GetNumber() - b.GetNumber(); - if(a.IsString() && b.IsString()) - return a.GetString().Compare(b.GetString()); - ThrowError("incompatible types for comparison operator"); - return 0; -} - -Sic::SRVal Sic::Compare() -{ - SRVal a = Shift(); - for(;;) - if(Char2('>', '=')) - a = DoCompare(a) >= 0; - else - if(Char2('<', '=')) - a = DoCompare(a) <= 0; - else - if(Char('>')) - a = DoCompare(a) > 0; - else - if(Char('<')) - a = DoCompare(a) < 0; - else - return a; -} - -Sic::SRVal Sic::Equal() -{ - SRVal a = Compare(); - for(;;) - if(Char2('=', '=')) { - SRVal b = Compare(); - a = int(~a == ~b); - } - else - if(Char2('!', '=')) { - SRVal b = Compare(); - a = int(~a != ~b); - } - else - return a; -} - -Sic::SRVal Sic::BinAnd() -{ - SRVal a = Equal(); - while(!IsChar2('&', '&') && Char('&')) { - SRVal b = Equal(); - if(a->IsNumber() && b->IsNumber()) - a = (int)a->GetNumber() & (int)b->GetNumber(); - else - ThrowError("incompatible types for '&' operator"); - } - return a; -} - -Sic::SRVal Sic::BinXor() -{ - SRVal a = BinAnd(); - while(Char('^')) { - SRVal b = BinAnd(); - if(a->IsNumber() && b->IsNumber()) - a = (int)a->GetNumber() ^ (int)b->GetNumber(); - else - ThrowError("incompatible types for '^' operator"); - } - return a; -} - -Sic::SRVal Sic::BinOr() -{ - SRVal a = BinXor(); - while(!IsChar2('|', '|') && Char('|')) { - SRVal b = BinXor(); - if(a->IsNumber() && b->IsNumber()) - a = (int)a->GetNumber() | (int)b->GetNumber(); - else - ThrowError("incompatible types for '|' operator"); - } - return a; -} - -Sic::SRVal Sic::And() -{ - SRVal a = BinOr(); - while(Char2('&', '&')) { - SRVal b = BinOr(); - a = IsTrue(a) && IsTrue(b); - } - return a; -} - -Sic::SRVal Sic::Or() -{ - SRVal a = And(); - while(Char2('|', '|')) { - SRVal b = And(); - a = IsTrue(a) || IsTrue(b); - } - return a; -} - -Sic::SRVal Sic::Cond() -{ - SRVal a = Or(); - if(Char('?')) { - SRVal b = Or(); - PassChar(':'); - SRVal c = Or(); - return IsTrue(a) ? b : c; - } - return a; -} - -Sic::SRVal Sic::Assign() -{ - SRVal a = Cond(); - if(Char('=')) { - SRVal b = Assign(); - if(!a.lvalue) - ThrowError("l-value required on the left side of '=' operator"); - *a.lvalue = b; - } - else - if(Char2('+', '=')) { - SRVal b = Assign(); - if(!a.lvalue) - ThrowError("l-value required on the left side of '+=' operator"); - if(a->IsNumber() && b->IsNumber()) - *a.lvalue = a->GetNumber() + b->GetNumber(); - else - if(a->IsString() && b->IsString()) - a.lvalue->GetString() += b->GetString(); - else - Operator(a, b, "operator+=", "+="); - } - else - if(Char2('-', '=')) { - SRVal b = Assign(); - if(!a.lvalue) - ThrowError("l-value required on the left side of '-=' operator"); - if(a->IsNumber() && b->IsNumber()) - *a.lvalue = a->GetNumber() - b->GetNumber(); - else - Operator(a, b, "operator-=", "-="); - } - else - if(Char2('*', '=')) { - SRVal b = Assign(); - if(!a.lvalue) - ThrowError("l-value required on the left side of '*=' operator"); - if(a->IsNumber() && b->IsNumber()) - *a.lvalue = a->GetNumber() * b->GetNumber(); - else - Operator(a, b, "operator*=", "*="); - } - else - if(Char2('/', '=')) { - SRVal b = Assign(); - if(!a.lvalue) - ThrowError("l-value required on the left side of '/=' operator"); - if(a->IsNumber() && b->IsNumber()) - *a.lvalue = a->GetNumber() / b->GetNumber(); - else - Operator(a, b, "operator/=", "/="); - } - else - if(Char2('%', '=')) { - SRVal b = Assign(); - if(!a.lvalue) - ThrowError("l-value required on the left side of '%=' operator"); - if(a->IsNumber() && b->IsNumber()) - *a.lvalue = (int)a->GetNumber() % (int)b->GetNumber(); - else - Operator(a, b, "operator%=", "%="); - } - else - if(Char2(':', '=')) { - if(!a.lvalue) - ThrowError("l-value required on the left side of ':='"); - while(Char('.')) { - String id = ReadName(); - a.lvalue->Set(id) = ReadLambda(); - } - } - return a; -} - -Sic::SRVal Sic::Exp() -{ - return Assign(); -} - -void Sic::SkipTerm() -{ - if(IsEof()) - throw CParser::Error("unexpected end of file"); - CParser::SkipTerm(); -} - -void Sic::SkipExp() -{ - int level = 0; - for(;;) { - if(IsChar(';')) - return; - if(IsChar(')') && level == 0) - return; - if(Char(')')) - level--; - else - if(Char('(')) - level++; - else - SkipTerm(); - } -} - -void Sic::SkipStatement() -{ - for(;;) { - if(Char(';')) return; - if(Char('{')) - break; - SkipTerm(); - } - int level = 1; - while(level > 0) { - if(Char('{')) level++; - else - if(Char('}')) level--; - else - SkipTerm(); - } -} - -bool Sic::PCond() -{ - PassChar('('); - bool c = IsTrue(Exp()); - PassChar(')'); - return c; -} - -void Sic::FinishSwitch() -{ - while(!Char('}') && no_break && no_return) { - if(Id("case")) { - Exp(); - PassChar(':'); - } - else - if(Id("default")) - PassChar(':'); - DoStatement(); - } -} - -void Sic::DoStatement() -{ - if(Id("if")) - if(PCond()) { - DoStatement(); - if(Id("else")) - SkipStatement(); - } - else { - SkipStatement(); - if(Id("else")) - DoStatement(); - } - else - if(Id("do")) { - loop++; - const char *term = GetPtr(); - do { - SetPtr(term); - DoStatement(); - PassId("while"); - } - while(PCond() && no_break && no_return); - PassChar(';'); - no_break = true; - loop--; - } - else - if(Id("while")) { - loop++; - const char *term = GetPtr(); - for(;;) { - SetPtr(term); - if(!PCond() || !no_break || !no_return) { - SkipStatement(); - break; - } - DoStatement(); - } - no_break = true; - loop--; - } - else - if(Id("for")) { - loop++; - PassChar('('); - if(!Char(';')) { - Exp(); - PassChar(';'); - } - const char *cond = NULL; - if(!Char(';')) { - cond = GetPtr(); - SkipExp(); - PassChar(';'); - } - const char *after = NULL; - if(!Char(')')) { - after = GetPtr(); - SkipExp(); - PassChar(')'); - } - const char *stmt = GetPtr(); - for(;;) { - bool c = true; - if(cond) { - SetPtr(cond); - c = IsTrue(Exp()); - } - SetPtr(stmt); - if(!c || !no_break || !no_return) { - SkipStatement(); - break; - } - DoStatement(); - if(after) { - SetPtr(after); - Exp()->Dump(); - } - } - no_break = true; - loop--; - } - else - if(Id("foreach")) { - loop++; - PassChar('('); - SVal *value = Exp().lvalue; - SVal *key = NULL; - if(Char(':')) { - key = value; - value = Exp().lvalue; - } - if(!value || !key) - ThrowError("l-value expected in 'foreach' statement"); - PassId("in"); - SVal c = Exp(); - if(!c.IsMap()) - ThrowError("container expected in 'foreach' statement"); - PassChar(')'); - const char *stmt = GetPtr(); - const ArrayMap& map = c.GetMap(); - for(int i = 0; i < map.GetCount() && no_break && no_return; i++) { - if(!map.IsUnlinked(i) && !map[i].IsVoid()) { - if(key) - *key = map.GetKey(i); - *value = map[i]; - SetPtr(stmt); - DoStatement(); - } - } - no_break = true; - loop--; - } - else - if(Id("break")) { - if(!loop) - ThrowError("misplaced 'break'"); - no_break = false; - PassChar(';'); - } - else - if(Id("case")) - ThrowError("misplaced 'case'"); - else - if(Id("default")) - ThrowError("misplaced 'default'"); - else - if(Id("else")) - ThrowError("misplaced 'else'"); - else - if(Id("return")) { - no_return = false; - if(!Char(';')) { - return_value = Exp(); - PassChar(';'); - } - else - return_value = Null; - } - else - if(Id("switch")) { - loop++; - PassChar('('); - SVal a = Exp(); - PassChar(')'); - PassChar('{'); - while(!Char('{')) { - if(Id("case")) { - SVal b = Exp(); - PassChar(':'); - if(a == b) { - FinishSwitch(); - break; - } - } - else - if(Id("default")) { - PassChar(':'); - FinishSwitch(); - break; - } - else - SkipStatement(); - } - loop--; - no_break = true; - } - else - if(Char('{')) { - while(!Char('}') && no_break && no_return) - DoStatement(); - } - else - if(!Char(';')) { - SVal v = Exp(); - Char(';'); - } -} - -void Sic::Run() -{ - no_return = no_break = true; - loop = 0; - while(!IsEof() && no_return && no_break) - DoStatement(); -} - -void Scan(ArrayMap& global, const char *file) -{ - Sic p(global, file); - while(!p.IsEof()) { - SVal& v = global.GetAdd(p.ReadId()); - SLambda& l = v.CreateLambda(); - LambdaArgs(p, l); - const char *t = p.GetPtr(); - if(!p.IsChar('{')) - p.ThrowError("missing function body"); - p.SkipStatement(); - l.code = String(t, p.GetPtr()); - } -} - -SVal Execute(ArrayMap& global, const char *name, const Vector& arg) -{ - int ii = global.Find(name); - if(ii < 0 || !global[ii].IsLambda()) - throw CParser::Error("invalid function name"); - const SLambda& l = global[ii].GetLambda(); - if(arg.GetCount() != l.arg.GetCount()) - throw CParser::Error("invalid number of arguments"); - Sic sub(global, l.code); - for(int i = 0; i < l.arg.GetCount(); i++) { - Sic::Var& v = sub.var.GetAdd(l.arg[i]); - v.var = arg[i]; - if(l.ref[i]) - v.ref = &v.var; - } - sub.Run(); - return sub.return_value; -} - -SVal Execute(ArrayMap& global, const char *name) -{ - return Execute(global, name, Vector()); -} diff --git a/uppdev/sic.oold/Sic.h b/uppdev/sic.oold/Sic.h deleted file mode 100644 index a2d3e7744..000000000 --- a/uppdev/sic.oold/Sic.h +++ /dev/null @@ -1,156 +0,0 @@ -#include - -enum { SV_VOID, SV_NUMBER, SV_STRING, SV_MAP, SV_LAMBDA }; - -struct SValMap; -struct SLambda; - -class SVal : Moveable { - struct SValMap; - - int type; - String string; - double number; - int ipos; - - struct SLambdaRef; - union { - SValMap *map; - SLambdaRef *lambda; - }; - - void Free(); - void Assign(const SVal& s); - -public: - int GetType() const { return type; } - bool IsVoid() const { return type == SV_VOID; } - bool IsNumber() const { return type == SV_NUMBER; } - bool IsString() const { return type == SV_STRING; } - bool IsMap() const { return type == SV_MAP; } - bool IsLambda() const { return type == SV_LAMBDA; } - - double GetNumber() const { ASSERT(IsNumber()); return number; } - const String& GetString() const { ASSERT(IsString()); return string; } - String& GetString() { ASSERT(IsString()); return string; } - const SLambda& GetLambda() const; - const ArrayMap& GetMap() const; - - unsigned GetHashValue() const; - bool operator==(const SVal& a) const; - bool operator!=(const SVal& a) const { return !(*this == a); } - - void operator=(const Nuller&); - void operator=(double d); - void operator=(const String& s); - - SLambda& CreateLambda(); - - void SetMap(); - SVal& Set(SVal key); - SVal& Add(); - - void operator=(const SVal& s); - - String Dump() const; - - SVal(); - SVal(const SVal& src); - SVal(const Nuller& s); - SVal(const String& s); - SVal(double n); - ~SVal(); -}; - -inline unsigned GetHashValue(const SVal& v) -{ - return v.GetHashValue(); -} - -bool IsTrue(const SVal& a); - -struct Sic : public CParser { - struct SRVal : Moveable { - SVal *lvalue; - SVal rvalue; - - operator const SVal&() { return lvalue ? *lvalue : rvalue; } - const SVal *operator->() const { return lvalue ? lvalue : &rvalue; } - const SVal& operator~() const { return lvalue ? *lvalue : rvalue; } - - SRVal() { lvalue = NULL; } - SRVal(const SVal& a) { rvalue = a; lvalue = NULL; } - SRVal(double d) { rvalue = d; lvalue = NULL; } - SRVal(const String& s) { rvalue = s; lvalue = NULL; } - }; - - struct Var : Moveable { - SVal *ref; - SVal var; - - Var() { ref = NULL; } - }; - - ArrayMap& global; - SVal *self; - ArrayMap var; - int loop; - bool no_break, no_return; - SVal return_value; - int stack_level; - - int DoCompare(const SVal& a); - SVal ReadLambda(); - String ReadName(); - SVal ExecuteLambda(const String& id, SVal lambda, SVal *self, Vector& arg); - SRVal Operator(Sic::SRVal a, Sic::SRVal b, const char *oper, const char *op, - bool sym = false); - - SRVal Term(); - SRVal Unary(); - SRVal Mul(); - SRVal Add(); - SRVal Shift(); - SRVal Compare(); - SRVal Equal(); - SRVal BinAnd(); - SRVal BinXor(); - SRVal BinOr(); - SRVal And(); - SRVal Or(); - SRVal Cond(); - SRVal Assign(); - SRVal Exp(); - - void SkipTerm(); - void SkipStatement(); - void SkipExp(); - bool PCond(); - void FinishSwitch(); - void DoStatement(); - - void Run(); - - Sic(ArrayMap& global, const char *s) : global(global), CParser(s) - { stack_level = 0; self = NULL; } -}; - -struct SLambda { - Vector arg; - Vector ref; - String code; - SVal (*escape)(Sic& sic, Vector& var); - - SLambda() { escape = NULL; } -}; - -void Escape(ArrayMap& global, - const char *function, - SVal (*fn)(Sic& sic, Vector& arg)); - -void Scan(ArrayMap& global, const char *file); - -void StdLib(ArrayMap& global); - -SVal Execute(ArrayMap& global, const char *fnname, const Vector& arg); -SVal Execute(ArrayMap& global, const char *fnname); diff --git a/uppdev/sic.oold/Sic.upp b/uppdev/sic.oold/Sic.upp deleted file mode 100644 index 05bd2e614..000000000 --- a/uppdev/sic.oold/Sic.upp +++ /dev/null @@ -1,12 +0,0 @@ -uses - Core; - -file - Sic.h, - sval.cpp, - Sic.cpp, - StdLib.cpp, - main.cpp; - -mainconfig - "Normal" = normal "CONSOLE WIN32 ST STATIC"; diff --git a/uppdev/sic.oold/StdLib.cpp b/uppdev/sic.oold/StdLib.cpp deleted file mode 100644 index e90f64e0e..000000000 --- a/uppdev/sic.oold/StdLib.cpp +++ /dev/null @@ -1,74 +0,0 @@ -#include - -SVal SIC_DefFn(Sic& sic, Vector& arg) -{ - if(!arg[0]->IsString()) - sic.ThrowError("name of function must be a string in call to 'def_fn'"); - sic.global.GetAdd(arg[0]->GetString()) = arg[1]; - return Null; -} - -SVal SIC_count(Sic& sic, Vector& arg) -{ - if(arg[0]->IsMap()) - return arg[0]->GetMap().GetCount(); - if(arg[0]->IsString()) - return arg[0]->GetString().GetLength(); - if(arg[0]->IsVoid()) - return 0; - return 1; -} - -SVal SIC_is_string(Sic& sic, Vector& arg) -{ - return int(arg[0]->IsString()); -} - -SVal SIC_is_number(Sic& sic, Vector& arg) -{ - return int(arg[0]->IsNumber()); -} - -SVal SIC_get_item(Sic& sic, Vector& arg) -{ - if(!arg[1]->IsNumber()) - sic.ThrowError("second argument of 'get_item' must be a number"); - int q = arg[1]->GetNumber(); - if(arg[0]->IsMap()) { - if(q < 0 || q >= arg[0]->GetMap().GetCount()) - sic.ThrowError("out of range in call to 'get_item'"); - return arg[0]->GetMap()[q]; - } - if(arg[0]->IsString()) { - String s = arg[0]->GetString(); - if(q < 0 || q >= s.GetLength()) - sic.ThrowError("out of range in call to 'get_item'"); - return s[q]; - } - sic.ThrowError("argument of 'get_item' must be either a string or container"); - return Null; -} - -SVal SIC_get_key(Sic& sic, Vector& arg) -{ - if(!arg[1]->IsNumber()) - sic.ThrowError("second argument of 'get_key' must be a number"); - int q = arg[1]->GetNumber(); - if(arg[0]->IsMap()) { - if(q < 0 || q >= arg[0]->GetMap().GetCount()) - sic.ThrowError("out of range in call to 'get_item'"); - return arg[0]->GetMap().GetKey(q); - } - return q; -} - -void StdLib(ArrayMap& global) -{ - Escape(global, "is_number(x)", SIC_is_number); - Escape(global, "is_string(x)", SIC_is_string); - - Escape(global, "def_fn(x, y)", SIC_DefFn); - Escape(global, "count(x)", SIC_count); - Escape(global, "get_item(x, i)", SIC_get_item); - Escape(global, "get_key(x, i)", SIC_get_key); -} diff --git a/uppdev/sic.oold/main.cpp b/uppdev/sic.oold/main.cpp deleted file mode 100644 index a5ca16731..000000000 --- a/uppdev/sic.oold/main.cpp +++ /dev/null @@ -1,49 +0,0 @@ -#include "Sic.h" - -SVal SIC_Print(Sic& sic, Vector& arg) -{ - if(arg[0]->IsString()) - VppLog() << arg[0]->GetString(); - else - if(arg[0]->IsNumber()) - VppLog() << arg[0]->GetNumber(); - else - if(!arg[0]->IsVoid()) - sic.ThrowError("invalid argument to 'print'"); - - return Null; -} - -SVal SIC_DumpLocals(Sic& sic, Vector& arg) -{ - LOG("--- DUMP of SIC local variables -------------------------"); - for(int i = 0; i < sic.var.GetCount(); i++) { - const Sic::Var& v = sic.var[i]; - RLOG(sic.var.GetKey(i) << " = " << (v.ref ? v.ref->Dump() : v.var.Dump())); - } - LOG("---------------------------------------------------------"); - return Null; -} - -void Main() -{ - String code = LoadFile("E:\\sic.sic"); - ArrayMap global; - - Escape(global, "print(x)", SIC_Print); - Escape(global, "dump_locals()", SIC_DumpLocals); - - StdLib(global); - - try { - Scan(global, code); - TimeStop(); - SVal ret = Execute(global, "main"); - RLOG(TimeStop()); - RLOG("RETURN VALUE: " << ret.Dump()); - } - catch(CParser::Error& e) - { - RLOG(e); - } -} diff --git a/uppdev/sic.oold/prj.aux b/uppdev/sic.oold/prj.aux deleted file mode 100644 index 0de9b8fec..000000000 --- a/uppdev/sic.oold/prj.aux +++ /dev/null @@ -1,4 +0,0 @@ -file - E:\sic.sic, - e:\out\upp/Sic/CONSOLE-DEBUG-IA32-MAIN-MSC-ST-STATIC-WIN32\Sic.log, - e:\out\upp/Sic/CONSOLE-IA32-MAIN-MSC-RELEASE-ST-STATIC-WIN32\Sic.log; diff --git a/uppdev/sic.oold/sval.cpp b/uppdev/sic.oold/sval.cpp deleted file mode 100644 index 789475aa9..000000000 --- a/uppdev/sic.oold/sval.cpp +++ /dev/null @@ -1,254 +0,0 @@ -#include - -struct SVal::SValMap { - Atomic refcount; - ArrayMap map; - - void Retain() { AtomicInc(refcount); } - void Release() { if(AtomicDec(refcount) == 0) delete this; } - - SValMap *Copy(); - SValMap *Clone(); - - SValMap() { AtomicWrite(refcount, 1); } -}; - -struct SVal::SLambdaRef : SLambda { - Atomic refcount; - void Retain() { AtomicInc(refcount); } - void Release() { if(AtomicDec(refcount) == 0) delete this; } - SLambdaRef() { refcount = 1; } -}; - -SVal::SValMap *SVal::SValMap::Copy() -{ - SValMap *c = new SValMap; - c->map <<= map; - return c; -} - -SVal::SValMap *SVal::SValMap::Clone() -{ - if(AtomicRead(refcount) == 1) - return this; - SValMap *c = Copy(); - Release(); - return c; -} - -SVal::SVal() -{ - type = SV_VOID; -} - -void SVal::Free() -{ - string.Clear(); - if(type == SV_MAP) - map->Release(); - if(type == SV_LAMBDA) - lambda->Release(); -} - -SVal::~SVal() -{ - Free(); -} - -void SVal::Assign(const SVal& s) -{ - type = s.type; - if(type == SV_MAP) { - map = s.map; - ipos = s.ipos; - map->Retain(); - } - else - if(type == SV_LAMBDA) { - lambda = s.lambda; - lambda->Retain(); - } - else { - string = s.string; - number = s.number; - } -} - -void SVal::operator=(const SVal& s) -{ - Free(); - Assign(s); -} - -const ArrayMap& SVal::GetMap() const -{ - ASSERT(IsMap()); - return map->map; -} - -void SVal::SetMap() -{ - if(type == SV_MAP) - map = map->Clone(); - else { - map = new SValMap(); - ipos = 0; - type = SV_MAP; - } -} - -SVal::SVal(const SVal& s) -{ - Assign(s); -} - -void SVal::operator=(const Nuller&) -{ - Free(); - type = SV_VOID; -} - -void SVal::operator=(double n) -{ - Free(); - type = SV_NUMBER; - number = n; -} - -void SVal::operator=(const String& s) -{ - Free(); - type = SV_STRING; - string = s; -} - -SVal::SVal(const String& s) -{ - type = SV_STRING; - string = s; -} - -SVal::SVal(const Nuller& s) -{ - type = SV_VOID; -} - -SVal::SVal(double n) -{ - type = SV_NUMBER; - number = n; -} - -SLambda& SVal::CreateLambda() -{ - Free(); - lambda = new SLambdaRef; - type = SV_LAMBDA; - return *lambda; -} - -const SLambda& SVal::GetLambda() const -{ - ASSERT(IsLambda()); - return *lambda; -} - -SVal& SVal::Set(SVal key) -{ - SetMap(); - if(key.IsNumber()) - ipos = key.GetNumber() + 1; - return map->map.GetAdd(key); -} - -SVal& SVal::Add() -{ - SetMap(); - return map->map.GetAdd(ipos++); -} - -unsigned SVal::GetHashValue() const -{ - switch(type) { - case SV_NUMBER: - return ::GetHashValue(number); - case SV_STRING: - return ::GetHashValue(string); - case SV_MAP: - unsigned hash = 0; - for(int i = 0; i < map->map.GetCount(); i++) - hash ^= ::GetHashValue(map->map.GetKey(i)) ^ ::GetHashValue(map->map[i]); - return hash; - } - return 0; -} - -bool SVal::operator==(const SVal& a) const -{ - switch(type) { - case SV_VOID: - return a.type == SV_VOID; - case SV_NUMBER: - return a.type == SV_NUMBER && number == a.number; - case SV_STRING: - return a.type == SV_STRING && string == a.string; - case SV_MAP: - if(a.type != SV_MAP) return false; - if(map->map.GetCount() != a.map->map.GetCount()) - return false; - for(int i = 0; i < map->map.GetCount(); i++) { - SVal key = map->map.GetKey(i); - int q = a.map->map.Find(key); - if(q < 0) - return false; - if(map->map[i] != a.map->map[q]) - return false; - } - return true; - } - return false; -} - -String SVal::Dump() const -{ - String r; - int i; - switch(type) { - case SV_NUMBER: - return Format("%g", number); - case SV_STRING: - return AsCString(string); - case SV_LAMBDA: - r = "@("; - for(i = 0; i < lambda->arg.GetCount(); i++) { - if(i) - r << ", "; - if(lambda->ref[i]) - r << "&"; - r << lambda->arg[i]; - } - r << ")\n" << lambda->code; - return r; - case SV_MAP: - r << "{ "; - for(i = 0; i < map->map.GetCount(); i++) { - if(i) - r << ", "; - r << map->map.GetKey(i).Dump() << ":" << map->map[i].Dump(); - } - r << " }"; - return r; - } - return "void"; -} - -bool IsTrue(const SVal& a) -{ - if(a.IsNumber()) - return a.GetNumber(); - if(a.IsString()) - return a.GetString().GetLength(); - if(a.IsMap()) - return a.GetMap().GetCount(); - return false; -} diff --git a/uppdev/slidertest/main.cpp b/uppdev/slidertest/main.cpp deleted file mode 100644 index 95f652dd7..000000000 --- a/uppdev/slidertest/main.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include "slidertest.h" - - - -slidertest::slidertest() -{ - CtrlLayout(*this, "Window title"); - - sldRegH << THISBACK2( OnSlider, &sldRegH, &txtRegH ); - sldRegV << THISBACK2( OnSlider, &sldRegV, &txtRegV ); - sldRevH << THISBACK2( OnSlider, &sldRevH, &txtRevH ); - sldRevV << THISBACK2( OnSlider, &sldRevV, &txtRevV ); - - sldRegH.MinMax( -100, 100 ); - sldRevH.MinMax( 100, -100 ); - sldRegV.MinMax( -100, 100 ); - sldRevV.MinMax( 100, -100 ); -} - -void slidertest::OnSlider( SliderCtrl* sld, StaticText* txt ) -{ - txt->SetText( sld->GetData().ToString().Begin() ); -} - -GUI_APP_MAIN -{ - slidertest().Run(); -} - diff --git a/uppdev/slidertest/slidertest.h b/uppdev/slidertest/slidertest.h deleted file mode 100644 index c57c46327..000000000 --- a/uppdev/slidertest/slidertest.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef _slidertest_slidertest_h -#define _slidertest_slidertest_h - -#include - -using namespace Upp; - -#define LAYOUTFILE -#include - - - -class slidertest : public WithslidertestLayout { -public: - typedef slidertest CLASSNAME; - slidertest(); - - void OnSlider( SliderCtrl* sld, StaticText* txt ); - -}; - -#endif - diff --git a/uppdev/slidertest/slidertest.lay b/uppdev/slidertest/slidertest.lay deleted file mode 100644 index 291dc4fd4..000000000 --- a/uppdev/slidertest/slidertest.lay +++ /dev/null @@ -1,15 +0,0 @@ -LAYOUT(slidertestLayout, 452, 220) - ITEM(SliderCtrl, sldRevV, LeftPosZ(336, 28).TopPosZ(44, 100)) - ITEM(Label, dv___1, SetLabel(t_("Reverse Horz")).LeftPosZ(40, 112).TopPosZ(96, 21)) - ITEM(StaticText, txtRevH, LeftPosZ(40, 40).TopPosZ(144, 19)) - ITEM(StaticText, txtRevV, LeftPosZ(336, 40).TopPosZ(144, 19)) - ITEM(StaticText, txtRegV, LeftPosZ(208, 40).TopPosZ(144, 19)) - ITEM(StaticText, txtRegH, LeftPosZ(40, 40).TopPosZ(68, 19)) - ITEM(Label, dv___6, SetLabel(t_("Reverse Vert")).LeftPosZ(336, 84).TopPosZ(20, 21)) - ITEM(Label, dv___7, SetLabel(t_("Regular Vert")).LeftPosZ(208, 84).TopPosZ(20, 21)) - ITEM(Label, dv___8, SetLabel(t_("Regular Horz")).LeftPosZ(40, 112).TopPosZ(20, 21)) - ITEM(SliderCtrl, sldRegV, LeftPosZ(208, 28).TopPosZ(44, 100)) - ITEM(SliderCtrl, sldRevH, LeftPosZ(40, 112).TopPosZ(120, 24)) - ITEM(SliderCtrl, sldRegH, LeftPosZ(40, 112).TopPosZ(44, 24)) -END_LAYOUT - diff --git a/uppdev/slidertest/slidertest.upp b/uppdev/slidertest/slidertest.upp deleted file mode 100644 index 2cfc59304..000000000 --- a/uppdev/slidertest/slidertest.upp +++ /dev/null @@ -1,11 +0,0 @@ -uses - CtrlLib; - -file - slidertest.h, - main.cpp, - slidertest.lay; - -mainconfig - "" = "GUI"; - diff --git a/uppdev/smallrpcserver/smallrpcserver.upp b/uppdev/smallrpcserver/smallrpcserver.upp deleted file mode 100644 index 734cbf80b..000000000 --- a/uppdev/smallrpcserver/smallrpcserver.upp +++ /dev/null @@ -1,11 +0,0 @@ -uses - Core, - Web/SSL, - XmlRpc; - -file - smallserver.h, - smallserver.cpp; - -mainconfig - "" = ""; diff --git a/uppdev/smallrpcserver/smallserver.cpp b/uppdev/smallrpcserver/smallserver.cpp deleted file mode 100644 index 0df5a0bda..000000000 --- a/uppdev/smallrpcserver/smallserver.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include "smallserver.h" - -void Hello::Help(String& s) { - s<<"just says hello"; -} - -void Hello::Signature(ValueArray& sig) { - LOG("i get asked"); - ValueArray va; - va.Add(String()); - sig.Add(va); -} - -void Hello::Execute(Value& res, ValueArray va) { - res = "Hello out there!"; -} - -CONSOLE_APP_MAIN { - XmlRpcServer server; - Hello h; - Value v; - h.Execute(v,ValueArray()); - LOG(v.ToString()); - server.SysMethods(); - server.Add(&h); - if(server.Open(8080)) { - server.Run(); - } -} diff --git a/uppdev/smallrpcserver/smallserver.h b/uppdev/smallrpcserver/smallserver.h deleted file mode 100644 index da82bc92e..000000000 --- a/uppdev/smallrpcserver/smallserver.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef _smallrpcserver_smallserver_h_ -#define _smallrpcserver_smallserver_h_ -#include -#include -#include - - -class Hello : public XmlRpcMethod { - public: - Hello() : XmlRpcMethod("hello") {} - void Help(String& h); - void Signature(ValueArray& va); - void Execute(Value& result,ValueArray params); -}; - - - -#endif diff --git a/uppdev/sqlite3sch/init b/uppdev/sqlite3sch/init deleted file mode 100644 index b480e0e30..000000000 --- a/uppdev/sqlite3sch/init +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef _sqlite3sch_icpp_init_stub -#define _sqlite3sch_icpp_init_stub -#include "Core/init" -#include "plugin\sqlite3/init" -#endif diff --git a/uppdev/sqlite3sch/schema.sch b/uppdev/sqlite3sch/schema.sch deleted file mode 100644 index edb7a691f..000000000 --- a/uppdev/sqlite3sch/schema.sch +++ /dev/null @@ -1,5 +0,0 @@ -TABLE_(PERSON) - INT_ (ID) PRIMARY_KEY AUTO_INCREMENT - STRING_ (NAME, 80) NOT_NULL SQLDEFAULT("") - STRING_ (ADDRESS, 128) -END_TABLE diff --git a/uppdev/sqlite3sch/sqlite3sch.cpp b/uppdev/sqlite3sch/sqlite3sch.cpp deleted file mode 100644 index 0094390ad..000000000 --- a/uppdev/sqlite3sch/sqlite3sch.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include -#include - -using namespace Upp; - -#define SCHEMADIALECT -#define MODEL -#include "Sql/sch_header.h" - -#include -#include - -CONSOLE_APP_MAIN -{ - Sqlite3Session sqlite3; - if(!sqlite3.Open(ConfigFile("simple.db"))) { - Cout() << "Can't create or open database file\n"; - return; - } - -#ifdef _DEBUG - sqlite3.SetTrace(); -#endif - - - SQL = sqlite3; - - SQL.Execute("drop table PERSON"); - - SqlSchema sch(SQLITE3); - All_Tables(sch); - SqlPerformScript(sch.Upgrade()); - SqlPerformScript(sch.Attributes()); - SQL.ClearError(); - - { - SqlMassInsert ins(PERSON); - ins(NAME, "a name")(ADDRESS, "an address").EndRow(); - } - - DDUMP(SQL ^ Select(ADDRESS, NAME).From(PERSON)); - Value v = SQL ^ Select(ADDRESS, NAME).From(PERSON); - DDUMP(v[ADDRESS]); - DDUMP(v[NAME]); - - { - SqlMassInsert ins(PERSON); - for(int i = 0; i < 10000; i++) - ins(ADDRESS, "adr " + AsString(i))(NAME, "name " + AsString(i)).EndRow(); - } - DDUMP(SQL ^ Select(ADDRESS, NAME).From(PERSON)); -} diff --git a/uppdev/sqlite3sch/sqlite3sch.upp b/uppdev/sqlite3sch/sqlite3sch.upp deleted file mode 100644 index fff87f832..000000000 --- a/uppdev/sqlite3sch/sqlite3sch.upp +++ /dev/null @@ -1,11 +0,0 @@ -uses - Core, - plugin\sqlite3; - -file - sqlite3sch.cpp, - schema.sch; - -mainconfig - "" = ""; - diff --git a/uppdev/src/Comm/Comm.upp b/uppdev/src/Comm/Comm.upp deleted file mode 100644 index 49c0b917c..000000000 --- a/uppdev/src/Comm/Comm.upp +++ /dev/null @@ -1,3 +0,0 @@ -file - Comport.cpp, - Comport.hpp; diff --git a/uppdev/src/Comm/Comport.cpp b/uppdev/src/Comm/Comport.cpp deleted file mode 100644 index 4d33300bc..000000000 --- a/uppdev/src/Comm/Comport.cpp +++ /dev/null @@ -1,244 +0,0 @@ -#ifndef _COMPORT_ - #include "ComPort.hpp" -#endif - -//using namespace std; - -COMPort::COMPort () : dcb (NULL) { - dcb = new char [sizeof(DCB)]; - getState(); // Riempie il DCB con le impostazioni attuali della porta - setBlockingMode(); - setHandshaking(); - open = false; -} - -COMPort::~COMPort() { - delete [] dcb; - - CloseHandle ((HANDLE)portHandle); - open = false; -} - -COMPort& COMPort::connect(const char * const portName, unsigned long _rate, Parity _parity, DataBits _bytesize, StopBits _stopbits ) { - DCB & aDCB = *((LPDCB)dcb); - - if(!open) { - portHandle = (unsigned) CreateFile ( portName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL ); - if (portHandle == HFILE_ERROR) return *this; - - aDCB.fBinary = true; - aDCB.fNull = false; - aDCB.BaudRate = _rate; - aDCB.Parity = _parity; - aDCB.ByteSize = _bytesize; - aDCB.StopBits = _stopbits; - aDCB.fAbortOnError = true; - - open = true; - return setState(); - } - else return *this; -} - -COMPort& COMPort::disconnect() { - if(open) CloseHandle((HANDLE)portHandle); - open = false; -} - -void COMPort::getState () const { - if (!GetCommState ( (HANDLE)portHandle, (LPDCB)dcb ) ) { - } -} - -COMPort& COMPort::setState () { - if (!SetCommState ( (HANDLE)portHandle, (LPDCB)dcb ) ) { - } - - return *this; -} - -COMPort& COMPort::setBitRate ( unsigned long Param ) { - DCB & aDCB = *((LPDCB)dcb); - aDCB.BaudRate = Param; - return setState(); -} - -unsigned long COMPort::bitRate() const { - DCB & aDCB = *((LPDCB)dcb); - return aDCB.BaudRate; -} - -COMPort& COMPort::setLineCharacteristics( char * inConfig ) { - COMMTIMEOUTS aTimeout; - if ( !BuildCommDCBAndTimeouts ( inConfig, (LPDCB)dcb, &aTimeout ) ) { - } - if ( ! SetCommTimeouts ( (HANDLE(portHandle)), &aTimeout ) ) { - } - return setState(); -} - -char COMPort::read () { - char buffer; - DWORD charsRead = 0; - - ReadFile ((HANDLE(portHandle)), &buffer, sizeof(char), &charsRead, NULL); - return buffer; -} - -unsigned long COMPort::readString ( void *inBuffer, const unsigned long inCharsReq) { - DWORD charsRead = 0; - - ReadFile ((HANDLE(portHandle)), inBuffer, inCharsReq, &charsRead, NULL); - return charsRead; -} - -COMPort & COMPort::write ( const char inChar ) { - char buffer = inChar; - DWORD charsWritten = 0; - - if ( !WriteFile ( (HANDLE(portHandle)), &buffer, sizeof(char), &charsWritten, NULL) ) { - } - return *this; -} - -unsigned long COMPort::writeString ( const void *inBuffer, const unsigned long inBufSize ) { - - DWORD charsWritten = 0; - - if ( !WriteFile ( (HANDLE(portHandle)), inBuffer, inBufSize, &charsWritten, NULL ) ) { - } - - return charsWritten; -} - -COMPort& COMPort::setxONxOFF ( bool Param ) { - DCB & aDCB = *((LPDCB)dcb); - aDCB.fOutX = Param ? 1 : 0; - aDCB.fInX = Param ? 1 : 0; - return setState(); -} - -bool COMPort::isxONxOFF () const { - DCB & aDCB = *((LPDCB)dcb); - return (aDCB.fOutX && aDCB.fInX); -} - -COMPort& COMPort::setBlockingMode ( unsigned long inReadInterval, unsigned long inReadMultiplyer, unsigned long inReadConstant ) { - COMMTIMEOUTS commTimeout; - - if ( !GetCommTimeouts ( (HANDLE(portHandle)), &commTimeout ) ) { - } - commTimeout.ReadIntervalTimeout = inReadInterval; - if ( inReadInterval==MAXDWORD ) { - commTimeout.ReadTotalTimeoutMultiplier = 0; - commTimeout.ReadTotalTimeoutConstant = 0; - } - else { - commTimeout.ReadTotalTimeoutMultiplier = inReadMultiplyer; - commTimeout.ReadTotalTimeoutConstant = inReadConstant; - } - if ( !SetCommTimeouts ( (HANDLE(portHandle)), &commTimeout) ) { - } - return *this; -} - -COMPort & COMPort::setHandshaking ( bool inHandshaking ) { - DCB & aDCB = *((LPDCB)dcb); - - if (inHandshaking) { - aDCB.fOutxCtsFlow = TRUE; - aDCB.fOutxDsrFlow = FALSE; - aDCB.fRtsControl = RTS_CONTROL_HANDSHAKE; - } - else { - aDCB.fOutxCtsFlow = FALSE; - aDCB.fOutxDsrFlow = FALSE; - aDCB.fRtsControl = RTS_CONTROL_ENABLE; - } - return setState(); -} - -unsigned long COMPort::getMaximumBitRate() const { - COMMPROP aProp; - if ( !GetCommProperties ( (HANDLE)portHandle, &aProp ) ) { - } - return aProp.dwMaxBaud; -} - -COMPort::MSPack COMPort::getModemSignals() const { - MSPack aPack; - - if ( !GetCommModemStatus ( (HANDLE)portHandle, (LPDWORD)&aPack ) ) { - } - return aPack; -} - -COMPort& COMPort::setParity ( Parity Param ) { - DCB & aDCB = *((LPDCB)dcb); - aDCB.Parity = Param; - - return setState(); -} - -COMPort& COMPort::setDataBits ( DataBits Param ) { - DCB & aDCB = *((LPDCB)dcb); - aDCB.ByteSize = Param; - - return setState(); -} - -COMPort& COMPort::setStopBits ( StopBits Param ) { - DCB & aDCB = *((LPDCB)dcb); - aDCB.StopBits = Param; - - return setState(); -} - -COMPort::Parity COMPort::parity () const { - DCB & aDCB = *((LPDCB)dcb); - - return (COMPort::Parity)aDCB.Parity; -} - -COMPort::DataBits COMPort::dataBits () const { - DCB & aDCB = *((LPDCB)dcb); - - return (COMPort::DataBits)aDCB.ByteSize; -} - -COMPort::StopBits COMPort::stopBits () const { - DCB & aDCB = *((LPDCB)dcb); - - return (COMPort::StopBits)aDCB.StopBits; -} - -COMPort::errorStatus COMPort::clearError() const { - errorStatus eS; - BOOL fOOP, fOVERRUN, fPTO, fRXOVER, fRXPARITY, fTXFULL; - BOOL fBREAK, fDNS, fFRAME, fIOE, fMODE; - - // Get and clear current errors on the port. - if (!ClearCommError((HANDLE(portHandle)), &eS.dwErrors, &eS.comStat)) { - } - return eS; -} - -bool COMPort::Setup(DWORD dwInQueue, DWORD dwOutQueue) { - return SetupComm((HANDLE(portHandle)), dwInQueue, dwOutQueue); -} - -bool COMPort::Purge(DWORD dwFlags) { - return PurgeComm((HANDLE(portHandle)), dwFlags); -} - -bool COMPort::ClearWriteBuffer() { - return Purge(PURGE_TXCLEAR); -} - -bool COMPort::ClearReadBuffer() { - return Purge(PURGE_RXCLEAR); -} - -bool COMPort::Flush() { - return FlushFileBuffers((HANDLE(portHandle))); -} diff --git a/uppdev/src/Comm/Comport.hpp b/uppdev/src/Comm/Comport.hpp deleted file mode 100644 index e19aa807d..000000000 --- a/uppdev/src/Comm/Comport.hpp +++ /dev/null @@ -1,124 +0,0 @@ -#ifndef _COMPORT_ -#define _COMPORT_ - -#ifndef _WINDOWS_ - #define WIN32_LEAN_AND_MEAN - #include -#endif - -#ifndef _STDEXCEPT_ - #include -#endif - -class COMPort { -public: - bool open; - - enum Parity { - None = 0 - , Odd - , Even - , Mark - , Space - }; - - enum DataBits { - db4 = 4 - , db5 - , db6 - , db7 - , db8 - }; - - enum StopBits { - sb1 = 0, - sb15, - sb2 - }; - - enum BitRate { - br110 = 110, - br300 = 300, - br600 = 600, - br1200 = 1200, - br2400 = 2400, - br4800 = 4800, - br9600 = 9600, - br19200 = 19200, - br28800 = 28800, - br38400 = 38400, - br56000 = 56000, - br57600 = 57600, - br115200 = 115200, - br256000 = 256000 - }; - - // for function getModemSignals - struct MSPack { - unsigned char DTR : 1; - unsigned char RTS : 1; - unsigned char : 2; - unsigned char CTS : 1; - unsigned char DSR : 1; - unsigned char RI : 1; - unsigned char DCD : 1; - }; - - // for function clearError - struct errorStatus { - COMSTAT comStat; - DWORD dwErrors; - }; - -private: - - // disable copy constructor and assignment operator - COMPort (const COMPort &); - COMPort& operator= (const COMPort &); - - void getState () const; - COMPort& setState (); - - unsigned portHandle; - char * dcb; - -protected: - -public: - - COMPort& connect( const char * const portName, unsigned long baudRate, Parity parity, DataBits bytesize, StopBits stopbits ); - COMPort& disconnect(); - char read (); - COMPort & write (const char inChar); - unsigned long readString ( void *, const unsigned long count ); - unsigned long writeString ( const void *, const unsigned long count ); - COMPort& setBitRate ( unsigned long Param ); - unsigned long bitRate () const; - COMPort& setParity ( Parity Param ); - Parity parity () const; - COMPort& setDataBits ( DataBits Param ); - DataBits dataBits () const; - COMPort& setStopBits ( StopBits Param ); - StopBits stopBits () const; - COMPort & setHandshaking ( bool inHandshaking = true ); - COMPort& setLineCharacteristics ( char * Param ); - unsigned long getMaximumBitRate () const; - COMPort & setxONxOFF ( bool Param = true); - bool isxONxOFF () const; - MSPack getModemSignals () const; - COMPort& setBlockingMode ( unsigned long inReadInterval = 0, unsigned long inReadMultiplyer = 0, unsigned long inReadConstant = 0 ); - errorStatus clearError() const; - bool Setup(DWORD dwInQueue, DWORD dwOutQueue); - bool Purge(DWORD dwFlags); - bool ClearWriteBuffer(); - bool ClearReadBuffer(); - bool Flush(); - - bool IsOpen() { return open; } - - COMPort (); - ~COMPort (); - -}; - -#endif diff --git a/uppdev/src/Unzip/Unzip.cpp b/uppdev/src/Unzip/Unzip.cpp deleted file mode 100644 index bd92591a2..000000000 --- a/uppdev/src/Unzip/Unzip.cpp +++ /dev/null @@ -1,79 +0,0 @@ -#include "Unzip.h" - -void WINAPI ReceiveDllMessage(unsigned long ucsize, unsigned long csiz, unsigned cfactor, unsigned mo, unsigned dy, unsigned yr, unsigned hh, unsigned mm, char c, LPSTR filename, LPSTR methbuf, unsigned long crc, char fCrypt) { - TotalSize += ucsize; -} - -int WINAPI password(LPSTR p, int n, LPCSTR m, LPCSTR name) { - return 1; -} - -int WINAPI DisplayBuf(LPSTR buf, unsigned long size) { - return (int)(unsigned int) size; -} - -int WINAPI DisplayProgress(LPCSTR buf, unsigned long size) { - - doneSize += size; - UnzipPi.Set((int)doneSize, (int)TotalSize); - return 0; -} - -int WINAPI GetReplaceDlgRetVal(LPSTR filename) { - return 1; -} - -int Extract(const String& ZipFile, const String& OutDir, bool WithProgress) { - int r; - HANDLE hDCL = GlobalAlloc( GPTR, (DWORD)sizeof(DCL)); - LPDCL lpDCL = (LPDCL)GlobalLock(hDCL); - HANDLE hUF = GlobalAlloc( GPTR, (DWORD)sizeof(USERFUNCTIONS)); - LPUSERFUNCTIONS lpUserFunctions = (LPUSERFUNCTIONS)GlobalLock(hUF); - - ProgressEnabled = WithProgress; - lpDCL->ncflag = 0; - lpDCL->fQuiet = 0; - lpDCL->ntflag = 0; - lpDCL->nzflag = 0; - lpDCL->ndflag = 1; - lpDCL->naflag = 0; - lpDCL->nfflag = 0; - lpDCL->noflag = 1; - lpDCL->nZIflag = 0; - lpDCL->C_flag = 0; - lpDCL->ExtractOnlyNewer = 0; - lpDCL->PromptToOverwrite = 0; - lpDCL->SpaceToUnderscore = 0; - lpDCL->fPrivilege = 1; - lpDCL->lpszZipFN = (char*)~ZipFile; - lpDCL->lpszExtractDir = (char*)~OutDir; - - lpUserFunctions->password = password; - lpUserFunctions->print = DisplayBuf; - lpUserFunctions->sound = NULL; - lpUserFunctions->replace = GetReplaceDlgRetVal; - lpUserFunctions->SendApplicationMessage = ReceiveDllMessage; - lpUserFunctions->ServCallBk = DisplayProgress; - - ExternLib lib((char*)~String(GetExeDirFile("") + "unzip32.dll")); - if(lib.IsOpen()) { - UNZIP unZip = (UNZIP)lib.GetProc("Wiz_SingleEntryUnzip"); - UnzipPi.SetText("Installazione in corso"); - UnzipPi.Set(0, 100); - doneSize = 0; - TotalSize = 0; - lpDCL->nvflag = 1; // listen - r = unZip(0, NULL, 0, NULL, lpDCL, lpUserFunctions); - lpDCL->nvflag = 0; // work - r = unZip(0, NULL, 0, NULL, lpDCL, lpUserFunctions); - UnzipPi.Close(); - } - else r = 1000001; - - GlobalUnlock(hDCL); - GlobalFree(hDCL); - GlobalUnlock(hUF); - GlobalFree(hUF); - - return r; -} diff --git a/uppdev/src/Unzip/Unzip.h b/uppdev/src/Unzip/Unzip.h deleted file mode 100644 index 5d215c079..000000000 --- a/uppdev/src/Unzip/Unzip.h +++ /dev/null @@ -1,133 +0,0 @@ -#ifndef _Unzip_Unzip_h_ -#define _Unzip_Unzip_h_ - -#include - -#ifndef Far -# define Far far -#endif - -#ifdef WIN32 -# define far -# define _far -# define __far -# define near -# define _near -# define __near -# ifndef FAR -# define FAR -# endif -#endif - -#define IDM_REPLACE_NO 100 -#define IDM_REPLACE_TEXT 101 -#define IDM_REPLACE_YES 102 -#define IDM_REPLACE_ALL 103 -#define IDM_REPLACE_NONE 104 -#define IDM_REPLACE_RENAME 105 -#define IDM_REPLACE_HELP 106 - -/* external return codes */ -#define PK_OK 0 /* no error */ -#define PK_COOL 0 /* no error */ -#define PK_WARN 1 /* warning error */ -#define PK_ERR 2 /* error in zipfile */ -#define PK_BADERR 3 /* severe error in zipfile */ -#define PK_MEM 4 /* insufficient memory (during initialization) */ -#define PK_MEM2 5 /* insufficient memory (password failure) */ -#define PK_MEM3 6 /* insufficient memory (file decompression) */ -#define PK_MEM4 7 /* insufficient memory (memory decompression) */ -#define PK_MEM5 8 /* insufficient memory (not yet used) */ -#define PK_NOZIP 9 /* zipfile not found */ -#define PK_PARAM 10 /* bad or illegal parameters specified */ -#define PK_FIND 11 /* no files found */ -#define PK_DISK 50 /* disk full */ -#define PK_EOF 51 /* unexpected EOF */ - -#define IZ_CTRLC 80 /* user hit ^C to terminate */ -#define IZ_UNSUP 81 /* no files found: all unsup. compr/encrypt. */ -#define IZ_BADPWD 82 /* no files found: all had bad password */ - -/* return codes of password fetches (negative = user abort; positive = error) */ -#define IZ_PW_ENTERED 0 /* got some password string; use/try it */ -#define IZ_PW_CANCEL -1 /* no password available (for this entry) */ -#define IZ_PW_CANCELALL -2 /* no password, skip any further pwd. request */ -#define IZ_PW_ERROR 5 /* = PK_MEM2 : failure (no mem, no tty, ...) */ - -/* flag values for status callback function */ -#define UZ_ST_START_EXTRACT 1 /* no details */ -#define UZ_ST_IN_PROGRESS 2 /* no details */ -#define UZ_ST_FINISH_MEMBER 3 /* 'details': extracted size */ - -/* return values of status callback function */ -#define UZ_ST_CONTINUE 0 -#define UZ_ST_BREAK 1 - - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef DEFINED_ONCE -#define DEFINED_ONCE -typedef int (WINAPI DLLPRNT) (LPSTR, unsigned long); -typedef int (WINAPI DLLPASSWORD) (LPSTR, int, LPCSTR, LPCSTR); -typedef int (WINAPI DLLSERVICE) (LPCSTR, unsigned long); -#endif -typedef void (WINAPI DLLSND) (void); -typedef int (WINAPI DLLREPLACE)(LPSTR); -typedef void (WINAPI DLLMESSAGE)(unsigned long, unsigned long, unsigned, unsigned, unsigned, unsigned, unsigned, unsigned, char, LPSTR, LPSTR, unsigned long, char); - -typedef struct { - DLLPRNT *print; - DLLSND *sound; - DLLREPLACE *replace; - DLLPASSWORD *password; - DLLMESSAGE *SendApplicationMessage; - DLLSERVICE *ServCallBk; - unsigned long TotalSizeComp; - unsigned long TotalSize; - unsigned long CompFactor; - unsigned long NumMembers; - WORD cchComment; -} USERFUNCTIONS, far * LPUSERFUNCTIONS; - -typedef struct { - int ExtractOnlyNewer; - int SpaceToUnderscore; - int PromptToOverwrite; - int fQuiet; - int ncflag; - int ntflag; - int nvflag; - int nfflag; - int nzflag; - int ndflag; - int noflag; - int naflag; - int nZIflag; - int C_flag; - int fPrivilege; - LPSTR lpszZipFN; - LPSTR lpszExtractDir; -} DCL, far * LPDCL; - -#ifdef __cplusplus -} -#endif - -typedef int (WINAPI * UNZIP)(int, char **, int, char **, LPDCL, LPUSERFUNCTIONS); - -unsigned long doneSize; -unsigned long TotalSize; -bool ProgressEnabled; -Progress UnzipPi; - -void WINAPI ReceiveDllMessage(unsigned long ucsize, unsigned long csiz, unsigned cfactor, unsigned mo, unsigned dy, unsigned yr, unsigned hh, unsigned mm, char c, LPSTR filename, LPSTR methbuf, unsigned long crc, char fCrypt); -int WINAPI password(LPSTR p, int n, LPCSTR m, LPCSTR name); -int WINAPI DisplayBuf(LPSTR buf, unsigned long size); -int WINAPI DisplayProgress(LPCSTR buf, unsigned long size); -int WINAPI GetReplaceDlgRetVal(LPSTR filename); -int Extract(const String& ZipFile, const String& OutDir = Null, bool WithProgress = false); - -#endif diff --git a/uppdev/src/Unzip/Unzip.upp b/uppdev/src/Unzip/Unzip.upp deleted file mode 100644 index 7f7eddda3..000000000 --- a/uppdev/src/Unzip/Unzip.upp +++ /dev/null @@ -1,3 +0,0 @@ -file - Unzip.h, - Unzip.cpp; diff --git a/uppdev/src/support/Core.cpp b/uppdev/src/support/Core.cpp deleted file mode 100644 index eab6e1a9f..000000000 --- a/uppdev/src/support/Core.cpp +++ /dev/null @@ -1,209 +0,0 @@ -#include "support.h" - -double MyScanDouble(const char *p, const char **endptr) -{ - const char *begin = p; - while(*p && (byte)*p <= ' ') - p++; - bool neg = false; - if(*p == '+' || *p == '-') - neg = (*p++ == '-'); - if((byte)(*p - '0') >= 10 && !(*p == *GetSystemDecimalSeparator() && (byte)(p[1] - '0') < 10)) - { - if(endptr) *endptr = begin; - return Null; - } - double mantissa = 0; - char c; - int exp = 0; - while((byte)(*p - '0') < 10) - if((c = *p++) != '0') - { - if(exp) { mantissa *= ipow10(exp); exp = 0; } - mantissa = 10 * mantissa + c - '0'; - } - else - exp++; - int raise = exp; - if(*p == *GetSystemDecimalSeparator()) // decimal part - while((byte)((c = *++p) - '0') < 10) - if(c != '0') - { - if(raise) { mantissa *= ipow10(raise); exp -= raise; raise = 0; } - exp--; - mantissa = 10 * mantissa + c - '0'; - } - else - raise++; - if(*p == 'E' || *p == 'e') - { // exponent - int vexp = ScanInt(p + 1, endptr); - if(!IsNull(vexp)) - exp += vexp; - } - else - if(endptr) *endptr = p; - if(exp) - { - double e = ipow10(tabs(exp)); - mantissa = (exp > 0 ? mantissa * e : mantissa / e); - } - return neg ? -mantissa : mantissa; -} - -double MyScanDouble(const wchar *p, const wchar **endptr) -{ - const wchar *begin = p; - while(*p && *p <= ' ') - p++; - bool neg = false; - if(*p == '+' || *p == '-') - neg = (*p++ == '-'); - if((unsigned)(*p - '0') >= 10) - { - if(endptr) *endptr = begin; - return Null; - } - double mantissa = 0; - wchar c; - int exp = 0; - while((unsigned)(*p - '0') < 10) - if((c = *p++) != '0') - { - if(exp) { mantissa *= ipow10(exp); exp = 0; } - mantissa = 10 * mantissa + c - '0'; - } - else - exp++; - int raise = exp; - if(*p == *GetSystemDecimalSeparator()) // decimal part - while((unsigned)((c = *++p) - '0') < 10) - if(c != '0') - { - if(raise) { mantissa *= ipow10(raise); exp -= raise; raise = 0; } - exp--; - mantissa = 10 * mantissa + c - '0'; - } - else - raise++; - if(*p == 'E' || *p == 'e') - { // exponent - int vexp = ScanInt(p + 1, endptr); - if(!IsNull(vexp)) - exp += vexp; - } - else - if(endptr) *endptr = p; - if(exp) - { - double e = ipow10(tabs(exp)); - mantissa = (exp > 0 ? mantissa * e : mantissa / e); - } - return neg ? -mantissa : mantissa; -} - -String MyFormatDouble(double d, int digits, int flags, int pad_exp) -{ - if(IsNull(d)) - return Null; - - double ad = fabs(d); - bool is_exp = (flags & FD_EXP); - if(!(flags & FD_FIX)) - { - is_exp = ad && (ad <= 1e-15 || ad >= 1e15); - if(flags & FD_REL) - { - double bd = ipow10(2 * digits); - if(ad && (ad * bd <= 1 || ad >= bd)) - is_exp = true; - } - } - if(is_exp) - return MyFormatDoubleExp(d, digits, flags, pad_exp); - else - return MyFormatDoubleFix(d, digits, flags); -} - -String MyFormatDoubleFix(double d, int digits, int flags) -{ - if(IsNull(d)) - return Null; - int exp; - String dig = FormatDoubleDigits(d, digits, flags, exp); - if(flags & FD_REL) - digits = max(0, digits - Nvl(exp, 0) - 1); - String out; - if(flags & FD_SIGN || d < 0 && !IsNull(exp)) - out.Cat(d >= 0 ? '+' : '-'); - if(IsNull(exp) || exp < -digits) - { - out.Cat('0'); - if(flags & FD_ZERO) - { - out.Cat(*GetSystemDecimalSeparator()); - out.Cat('0', digits); - } - } - else if(exp < 0) - { - out.Cat("0"); - out.Cat(*GetSystemDecimalSeparator()); - out.Cat('0', -1 - exp); - int fill = digits + exp + 1; - if(!(flags & FD_ZERO) || dig.GetLength() >= fill) - out.Cat(dig, min(fill, dig.GetLength())); - else - { - out.Cat(dig); - out.Cat('0', fill - dig.GetLength()); - } - } - else if(exp < dig.GetLength()) - { - out.Cat(dig, ++exp); - if(digits > 0 && ((flags & FD_ZERO) || dig.GetLength() > exp)) - { - out.Cat(*GetSystemDecimalSeparator()); - if(!(flags & FD_ZERO) || dig.GetLength() - exp >= digits) - out.Cat(dig.Begin() + exp, min(dig.GetLength() - exp, digits)); - else - { - out.Cat(dig.Begin() + exp, dig.GetLength() - exp); - out.Cat('0', digits - (dig.GetLength() - exp)); - } - } - } - else - { - out.Cat(dig); - out.Cat('0', exp - dig.GetLength() + 1); - if(digits > 0 && (flags & FD_ZERO)) - { - out.Cat(*GetSystemDecimalSeparator()); - out.Cat('0', digits); - } - } - return out; -} - -String MyFormatDoubleExp(double d, int digits, int flags, int fill_exp) -{ - if(IsNull(d)) - return Null; - int exp; - String dig = FormatDoubleDigits(d, digits, flags | FD_REL, exp); - exp = Nvl(exp, 0); - String out; - if(flags & FD_SIGN || d < 0 && !IsNull(exp)) - out.Cat(d >= 0 ? '+' : '-'); - out.Cat(dig[0]); - if(dig.GetLength() > 1) - { - out.Cat(*GetSystemDecimalSeparator()); - out.Cat(dig.Begin() + 1, dig.GetLength() - 1); - } - out.Cat(flags & FD_CAP_E ? 'E' : 'e'); - out.Cat(FormatIntDec(exp, fill_exp, '0', flags & FD_SIGN_EXP)); - return out; -} diff --git a/uppdev/src/support/Core.h b/uppdev/src/support/Core.h deleted file mode 100644 index b75f40920..000000000 --- a/uppdev/src/support/Core.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef _src_support_Core_h_ -#define _src_support_Core_h_ - -const char* GetSystemDecimalSeparator() -{ -#ifdef PLATFORM_WIN32 - return ~GetWinRegString("sDecimal", "Control Panel\\International", HKEY_CURRENT_USER).Mid(0, 1); -#else - return '.'; -#endif -} - -double MyScanDouble(const char *p, const char **endptr = NULL); -double MyScanDouble(const wchar *p, const wchar **endptr = NULL); -String MyFormatDouble(double d, int digits=10, int flags=0, int pad_exp=0); -String MyFormatDoubleFix(double d, int digits, int flags); -String MyFormatDoubleExp(double d, int digits, int flags, int fill_exp); - -#endif diff --git a/uppdev/src/support/Ctrl.cpp b/uppdev/src/support/Ctrl.cpp deleted file mode 100644 index 9a9cc3514..000000000 --- a/uppdev/src/support/Ctrl.cpp +++ /dev/null @@ -1,55 +0,0 @@ -#include -#ifdef flagGUI - -bool DropSelect(String& s, const char *title, const char *label, const Vector& lst) -{ - int i; - - WithDropSelectPanel dlg; - CtrlLayoutOKCancel(dlg, title); - dlg.lbl = label; - for (i = 0; i < lst.GetCount(); i++) - { - dlg.list.Add(AsString(lst[i])); - } - if(dlg.list.GetCount() > 0) - //dlg.list.SetIndex(0); - dlg.list.SetData(s); - - if(dlg.Execute() == IDOK) { - s = ~dlg.list; - return true; - } - return false; -} - -bool PromptPanelOKCancel(const String& tag, const String& text) { - - WithpromptPanel dlg; - CtrlLayoutOKCancel(dlg, "Info"); - dlg.Sizeable(); - dlg.tag = tag; - dlg.text.Set(text); - if(dlg.Execute() == IDOK) { - return true; - } - return false; -} - -/* -MyVectorText::MyVectorText() { - - OutlineWidth(2).OutlineColor(Null).FillColor(Null).MarginHorz(0).MarginVert(0).Style(1).Rounding(14); - - return; -} -*/ - -Zoom ZoomP(Ctrl &ctrl, int percent) { - Zoom z; - z.d = ctrl.GetSize().cx; - z.m = (int)(((double)percent/1000)*z.d); - return z; -} - -#endif diff --git a/uppdev/src/support/Ctrl.h b/uppdev/src/support/Ctrl.h deleted file mode 100644 index 0e86c041c..000000000 --- a/uppdev/src/support/Ctrl.h +++ /dev/null @@ -1,68 +0,0 @@ -#ifndef _src_support_Ctrl_h_ -#define _src_support_Ctrl_h_ - -#include -#include -#include - -#include - -#define IMAGECLASS commonImg -#define IMAGEFILE -#include - -#define IMAGECLASS commonImg -#define IMAGEFILE -#include - -// layout -#define LAYOUTFILE -#include - -bool DropSelect(String& s, const char *title, const char *label, const Vector& lst); -bool PromptPanelOKCancel(const String& tag, const String& text); - -class SupDropList : public DropList { -protected: - int PreviousIndex; - int CurrIndex; - Callback _action; - -private: - void KeepCurrIndex() { PreviousIndex=CurrIndex; CurrIndex=GetIndex(); return; } - void NewAction() { KeepCurrIndex(); _action(); return; } - -public: - // methods - void GoBackPrevious() { if(PreviousIndex>=0) SetIndex(PreviousIndex); } - void SetIndex(int i) { SetData(GetKey(i)); KeepCurrIndex(); } - - // operators overload - Callback operator<<=(Callback action) { _action=action; WhenAction=THISBACK(NewAction); return _action; } - Callback& operator<<(Callback action) { _action=action; return WhenAction<OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); - return true; -} - -int PeFile::GetSectionIndex(const char *name) const { - for(int i = 0, n = headers->FileHeader.NumberOfSections; i < n; i++) - if(!strcmp((const char *)sections[i].Name, name)) - return i; - return -1; -} - -int PeFile::GetExportCount() const { - return exports ? exports->NumberOfNames : 0; -} - -const char *PeFile::GetExport(int index) const { - if(!exports || index < 0 || index >= (int) exports->NumberOfNames) - return 0; - return data + ((const dword *)(data + (dword)exports->AddressOfNames))[index]; -} - -static bool EqualMem(const char *a, const char *b, int len, bool case_sensitive) { - if(case_sensitive) - return !memcmp(a, b, len); - else - return !memicmp(a, b, len); -} - -const char *PeFile::FindExportRaw(const char *name, bool case_sensitive) const { - if(!exports || !name || !*name) - return 0; - int len = strlen(name); - const dword *pnames = (const dword *)(data + (dword)exports->AddressOfNames); - for(int i = 0; i < (int) exports->NumberOfNames; i++) { - const char *exp = data + pnames[i]; - int elen = strlen(exp); - if(elen < len) - continue; - if(elen == len && EqualMem(exp, name, len, case_sensitive)) - return exp; - if(EqualMem(exp, name, len, case_sensitive) && exp[len] == '@') - return exp; - if(exp[0] == '_' && EqualMem(exp + 1, name, len, case_sensitive) - && (exp[len + 1] == '@' || exp[len + 1] == 0)) - return exp; - } - return 0; -} - -void PeFile::LoadFuncsName(Vector& names) { - - if(!exports) return; - const dword *pnames = (const dword *)(data + (dword)exports->AddressOfNames); - for(int i = 0; i < (int) exports->NumberOfNames; i++) { - const char *exp = data + pnames[i]; - names.Add(String(exp)); - } - return; -} - -HMODULE ExternLib::Load(const char *fn) { - hmod = LoadLibrary(fn); - if(!hmod) return 0; - - PeFile pe; - if(!pe.Open((const char *)hmod)) { - FreeLibrary(hmod); - return 0; - } - - funcsName.Clear(); - pe.LoadFuncsName(funcsName); - - if(funcsName.GetCount()<1) { - FreeLibrary(hmod); - return 0; - } - return hmod; -} - -FARPROC WINAPI ExternLib::GetProc(const String& funcName) { - for(int i=0; i& names); - - int GetSectionIndex(const char *name) const; - -private: - const char *data; - const IMAGE_NT_HEADERS *headers; - const IMAGE_SECTION_HEADER *sections; - const IMAGE_EXPORT_DIRECTORY *exports; -}; - -class ExternLib { - public: - HMODULE hmod; - Vector funcsName; - - HMODULE Load(const char *fn); - FARPROC WINAPI GetProc(const String& funcName); - - void Close() { FreeLibrary(hmod); } - bool IsOpen() { return hmod != 0; } - - Vector GetFuncsList() { return funcsName; } - - ExternLib(); - ExternLib(const char* fn) { Load(fn); } - ~ExternLib() { Close(); } - -}; - -typedef Value (*ExternFunction)(Vector *args); - -#endif diff --git a/uppdev/src/support/common.iml b/uppdev/src/support/common.iml deleted file mode 100644 index fa668c190..000000000 --- a/uppdev/src/support/common.iml +++ /dev/null @@ -1,528 +0,0 @@ -IMAGE_BEGIN(folder_1_16) - IMAGE_SCAN("ă\0\0\0") - IMAGE_SCAN("\0\0\0\35\2\35\0\0\0ă\0\0\0") - IMAGE_SCAN("\1\0\0\0\35\35\0\0\0\377\377\377\2\35\0\0\0") - IMAGE_SCAN("\2\0\0\0\35\35\0\0\0\377\377\377\35\2\35\0\0\0") - IMAGE_SCAN("\0\0\0\377\377\377\35\35\1\0\0\0") - IMAGE_SCAN("\2\0\0\0\35\377\377\377\35\35\35\1\0\0\0") - IMAGE_SCAN("\2\0\0\0\377\377\377\35\35\35\1\0\0\0") - IMAGE_SCAN("\3\0\0\0\377\377\377\35\35\35\1\0\0\0") - IMAGE_SCAN("\3\0\0\0\377\377\377\35\35\35\1\0\0\0") - IMAGE_SCAN("\3\0\0\0\377\377\377\35\35\35\1\0\0\0") - IMAGE_SCAN("\3\0\0\0\377\377\377\35\35\35\1\0\0\0") - IMAGE_SCAN("\3\0\0\0\377\377\377\35\35\35\1\0\0\0") - IMAGE_SCAN("\4\0\0\0\377\377\377\35\35\35\0\0\0") - IMAGE_SCAN("\2\0\0\0\377\377\377\35\0\0\0") - IMAGE_SCAN("\1\0\0\0\35\0\0\0") - IMAGE_SCAN("\0\0\0") -IMAGE_PACKED(folder_1_16, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(open_1_16) - IMAGE_SCAN("Ă\0\0\0") - IMAGE_SCAN("\0\0\0\35\1\0\0\0Ń\0\0\0") - IMAGE_SCAN("\1\0\0\0\35\35\0\0\0\377\377\377\1\0\0\0") - IMAGE_SCAN("\3\0\0\0\35\35\0\0\0\377\377\377\35\2\35\0\0\0") - IMAGE_SCAN("\0\0\0\377\377\377\0\0\0\35\1\0\0\0\35\2\35\0\0\0") - IMAGE_SCAN("\3\0\0\0\35\377\377\377\35\1\0\0\0\35\0\0\0\35\2\35\0\0\0") - IMAGE_SCAN("\2\0\0\0\377\377\377\35\1\0\0\0\35\0\0\0\35\2\35\0\0\0") - IMAGE_SCAN("\2\0\0\0\377\377\377\35\0\0\0\1\35\0\0\0") - IMAGE_SCAN("\2\0\0\0\377\377\377\35\0\0\0\35\1&") - IMAGE_SCAN("\2\0\0\0\377\377\377\35\0\0\0\35&") - IMAGE_SCAN("\2\0\0\0\377\377\377\35\1\0\0\0\35&") - IMAGE_SCAN("\2\0\0\0\377\377\377\35\1\0\0\0\35&\1\0\0\0") - IMAGE_SCAN("\2\0\0\0\377\377\377\35\1\0\0\0\35&\0\0\0") - IMAGE_SCAN("\5\0\0\0\377\377\377\35\0\0\0\35&\0\0\0") - IMAGE_SCAN("\4\0\0\0\377\377\377\0\0\0&\0\0\0") - IMAGE_SCAN("\0\0\0") -IMAGE_PACKED(open_1_16, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(save_1_16) - IMAGE_SCAN("ʄ\0\0\0") - IMAGE_SCAN("Ƅ\0\0\0\4\377\377\377\0\0\0\377CC\0\0\0") - IMAGE_SCAN("„\0\0\0\377\377\377\4\0\0\0ii\0\0\0") - IMAGE_SCAN("\1\377nn\1\0\0\0\377\377\377\7\377\377\377\0\0\0\377CC\0\0\0") - IMAGE_SCAN("\15ccc\377RR\377nn\0\0\0\377\377\377\377\377\377\0\0\0ii\0\0\0") - IMAGE_SCAN("\15\377nn\377XX\0\0\0\377\377\377\0\0\0\377CC\0\0\0") - IMAGE_SCAN("\7ccc\377RR\377nn\0\0\0\377\377\377˃\0\0\0\377CC\1\0\0\0") - IMAGE_SCAN("\3yxx\377nn\377XX\0\0\0\1ee\377CC\2KK\0\0\0") - IMAGE_SCAN("\1yxx\377nn\1\377XX\377nn\377XX\4\377XX\0\0\0") - IMAGE_SCAN("\1yxx\377XX\377``Ȃ\4\35\35\35\35\0\0\0") - IMAGE_SCAN("\3yxx\377XX\377nn߂\35\35\3\35\35\0\0\0") - IMAGE_SCAN("\4___\377OO\377XX߂\35\35\3\35\35\0\0\0") - IMAGE_SCAN("\3ccc\377OO\377XX\3Ȃ\35\35\3\35\35\0\0\0") - IMAGE_SCAN("\4___\377OO\377XX\1\35\35\1\0\0\0") - IMAGE_SCAN("\3___\377OO\377XX") - IMAGE_SCAN("\1___\0\0\0") -IMAGE_PACKED(save_1_16, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(saveAs_1_16) - IMAGE_SCAN("ʄ\0\0\0") - IMAGE_SCAN("Ƅ\0\0\0\4\377\377\377\0\0\0 \377\0\0\0") - IMAGE_SCAN("„\0\0\0\377\377\377\4\0\0\0 \377\0\0\0") - IMAGE_SCAN("\1\1\0\0\0\377\377\377\7\377\377\377\0\0\0 \377\0\0\0") - IMAGE_SCAN("\15ccc\0\0\0\377\377\377\377\377\377\0\0\0 \377\0\0\0") - IMAGE_SCAN("\1\12\0\0\0\377\377\377\0\0\0 \377\0\0\0") - IMAGE_SCAN("\7ccc\0\0\0\377\377\377˃\0\0\0\00388 \377\0\0\0") - IMAGE_SCAN("\1yxx\0\0\088\2 \377\0\0\0") - IMAGE_SCAN("\2yxx\1ll\377\4 \377\0\0\0") - IMAGE_SCAN("\1yxx\1Ȃ\4 \377 \377\0\0\0") - IMAGE_SCAN("\3yxx߂ \377\3 \377\0\0\0") - IMAGE_SCAN("\1___\1߂ \377\3 \377\0\0\0") - IMAGE_SCAN("\3ccc\3Ȃ \377\3 \377\0\0\0") - IMAGE_SCAN("\1___\1\1 \377\1\0\0\0") - IMAGE_SCAN("\3___") - IMAGE_SCAN("\1___\0\0\0") -IMAGE_PACKED(saveAs_1_16, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(new_1_16) - IMAGE_SCAN("Ņ\0\0\0") - IMAGE_SCAN("Ä\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\377\377\1\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\377\377\1\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\377\377\3\0\0\0ă\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\377\377\0\0\0\3\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\377\377\5\377\377\377\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\377\377\1\377\377\377\2\0\0\0") - IMAGE_SCAN("\3\0\0\0\377\377\377\377\377\377\2\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\377\377\3\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\377\377\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\377\377\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\377\377\2\0\0\0") - IMAGE_SCAN("\2\0\0\0\377\377\377\1\0\0\0") - IMAGE_SCAN("\2\0\0\0\377\377\377\0\0\0") - IMAGE_SCAN("Â\0\0\0") -IMAGE_PACKED(new_1_16, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(delete_1_16) - IMAGE_SCAN("") - IMAGE_SCAN("") - IMAGE_SCAN("\0\0\1\377\377\377Ȃ\0\0\1\377\377\377") - IMAGE_SCAN("\0\0\1\377\377\377ł\0\0\1\377\377\377") - IMAGE_SCAN("„\0\0\1\377\377\377Â\0\0\1\377\377\377") - IMAGE_SCAN("ă\0\0\1\377\377\377\2\0\0\377\377\377") - IMAGE_SCAN("Ņ\0\0\1\377\377\377") - IMAGE_SCAN("ƃ\0\0\1\377\377\377") - IMAGE_SCAN("Ņ\0\0\1\377\377\377") - IMAGE_SCAN("ă\0\0\1\377\377\377\0\0\1\377\377\377") - IMAGE_SCAN("Ã\0\0\1\377\377\377Â\0\0\1\377\377\377") - IMAGE_SCAN("ƒ\0\0\1\377\377\377\2\0\0\377\377\377") - IMAGE_SCAN("ƒ\0\0\1\377\377\377\2\0\0\377\377\377") - IMAGE_SCAN("\2\0\0\377\377\377") - IMAGE_SCAN("\2\0\0\377\377\377") -IMAGE_PACKED(delete_1_16, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(edit_1_16) - IMAGE_SCAN("Ņ\0\0\0Ă0/\377") - IMAGE_SCAN("Ä\0\0\0\1\0\0\0\1\0\0\00/\377") - IMAGE_SCAN("\1\0\0\0\377\377\377\1\0\0\0Ă\0\0\0;\0010/\377") - IMAGE_SCAN("\2\0\0\0\377\377\377\0\0\0\2\377\377\377\0\0\0\1\0\0\0;\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\377\377\4\0\0\0\0\0\0;\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\377\377\0\0\0;\1\0\0\0") - IMAGE_SCAN("\3\0\0\0\377\377\377\0\0\0\377\377\377\1\0\0\0;\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\377\377\2\0\0\0;\3\0\0\0\0\0\0") - IMAGE_SCAN("\12\0\0\0\377\377\377\377\377\377\33w;\0\0\0\0\0\0") - IMAGE_SCAN("\3\0\0\0\377\377\377\0\0\0\33w\5\0\0\0\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\377\377\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\377\377\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\377\377\2\0\0\0") - IMAGE_SCAN("\2\0\0\0\377\377\377\1\0\0\0") - IMAGE_SCAN("\2\0\0\0\377\377\377\0\0\0") - IMAGE_SCAN("Â\0\0\0") -IMAGE_PACKED(edit_1_16, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(print_1_16) - IMAGE_SCAN("") - IMAGE_SCAN("ʼn\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\377\377\1\0\0\0") - IMAGE_SCAN("\2\0\0\0\377\377\377\0\0\0\2\377\377\377\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\377\377\1\0\0\0") - IMAGE_SCAN("\2\0\0\0\377\377\377\0\0\0\1\377\377\377\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\377\377\5\0\0\0vvv\0\0\0vvv\0\0\0") - IMAGE_SCAN("\0\0\0\3vvv\0\0\0vvv\0\0\0") - IMAGE_SCAN("\1\0\0\0\5\5\0\0\0vvv\0\0\0vvv\0\0\0") - IMAGE_SCAN("\0\0\0vvv\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\4υ\3\0\0\0vvv\0\0\0") - IMAGE_SCAN("\1\0\0\0\52\377\0\0\0") - IMAGE_SCAN("\0\0\0\2vvv\0\0\0") - IMAGE_SCAN("\6\0\0\0τ\3\0\0\0vvv\0\0\0") - IMAGE_SCAN("‹\0\0\0") -IMAGE_PACKED(print_1_16, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(close_1_16) - IMAGE_SCAN("") - IMAGE_SCAN("\0\0\0") - IMAGE_SCAN("\1\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\0\0\0Ƃ\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\0\0\0ă\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0ƒ\0\0\0ƒ\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0Æ\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0Ą\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0Ą\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0Æ\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0ƒ\0\0\0ƒ\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\0\0\0ă\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\0\0\0Ƃ\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\1\0\0\0") - IMAGE_SCAN("\0\0\0") -IMAGE_PACKED(close_1_16, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(quit_1_16) - IMAGE_SCAN("Œ\377\377\377") - IMAGE_SCAN("\1\377\377\377\377\1\377\377\377") - IMAGE_SCAN("\1\377\377\377\377\2uu\377ll\377\'\'\1\377\377\377") - IMAGE_SCAN("\1\377\377\377\377\377\377\377\377\2uu\377ll\377\'\'\377\377\377\3\'\'\"\"\377\377\377") - IMAGE_SCAN("\1\377\377\377\377\377\377\377pp\377\'\'\377\377\377\3\'\'\"\"\377\377\377") - IMAGE_SCAN("\1\377\377\377\377\377\377\377((\377\377\377\377\1((\377\"\"\1\377\377\377") - IMAGE_SCAN("\2\377\377\377\377uu\377\1\377\377\377\377((\377\"\"\1\377\377\377") - IMAGE_SCAN("\1\377\377\377\377\1ll\377((\377\377\377\377((\377\"\"\1\377\377\377") - IMAGE_SCAN("\3\377\377\377\377ll\377((\377\377\377\377\1((\377\"\"\1\377\377\377") - IMAGE_SCAN("\2\377\377\377\377((\377\377\377\377\"\"\1\377\377\377") - IMAGE_SCAN("\1\377\377\377((\377\377\377\377((\377\377\377\377\"\"\1\377\377\377") - IMAGE_SCAN("\1\377\377\377%%\377\377\377%%\"\"ك\377\377\377\3%%\"\"\377\377\377") - IMAGE_SCAN("\1\377\377\377,,т\377\377\377,,т\377\377\377,,\1\377\377\377") - IMAGE_SCAN("\1\377\377\377,,\1\377\377\377") - IMAGE_SCAN("\1\377\377\377,,ф\"\"ق,,\1\377\377\377") - IMAGE_SCAN("Œ\377\377\377") -IMAGE_PACKED(quit_1_16, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(cut_1_6) - IMAGE_SCAN("") - IMAGE_SCAN("\1\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\1\0\0\0") - IMAGE_SCAN("ł\0\0\0\0\0\0") - IMAGE_SCAN("\1\0\0\0\1\0\0\0") - IMAGE_SCAN("ƃ\0\0\0") - IMAGE_SCAN("\1\0\0\0") - IMAGE_SCAN("\3\0\0\0\0\0\0\0") - IMAGE_SCAN("\1\0\0\0\0") - IMAGE_SCAN("ă\0\0\1\0\0\1\0\0") - IMAGE_SCAN("\1\0\0\1\0\0\1\0\0\1\0\0") - IMAGE_SCAN("\1\0\0\1\0\0\1\0\0\1\0\0") - IMAGE_SCAN("\1\0\0\1\0\0‚\0\0") - IMAGE_SCAN("Ă\0\0") -IMAGE_PACKED(cut_1_6, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(copy_1_16) - IMAGE_SCAN("") - IMAGE_SCAN("\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\377\377\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\377\377\3\0\0\0\377\377\377\0\0\0") - IMAGE_SCAN("\2\0\0\0\377\377\377\0\0\0\2\377\377\377\0\0\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\377\377\1\0\0\377\377\377\0\0") - IMAGE_SCAN("\2\0\0\0\377\377\377\0\0\0\1\0\0\377\377\377\3\0\0\377\377\377\0\0") - IMAGE_SCAN("\1\0\0\0\377\377\377\2\0\0\377\377\377\0\0\0\1\377\377\377\0\0") - IMAGE_SCAN("\2\0\0\0\377\377\377\0\0\0\1\0\0\377\377\377\1\0\0") - IMAGE_SCAN("\1\0\0\0\377\377\377\2\0\0\377\377\377\0\0\0\2\377\377\377\0\0") - IMAGE_SCAN("\0\0\0\1\0\0\377\377\377\1\0\0") - IMAGE_SCAN("\2\0\0\377\377\377\0\0\0\2\377\377\377\0\0") - IMAGE_SCAN("\1\0\0\377\377\377\1\0\0") - IMAGE_SCAN("Ɖ\0\0") -IMAGE_PACKED(copy_1_16, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(paste_1_16) - IMAGE_SCAN("") - IMAGE_SCAN("ń\0\0\0") - IMAGE_SCAN("\0\0\0\0\377\377\0\0\0") - IMAGE_SCAN("\6\0\0\0\0\0\0\0\0\377\377\0\0\0\6\0\377\377\0\0\0\0\0\0\0\0") - IMAGE_SCAN("\4\0\0\0\0\0\0\0\4\0\0\0\0\0\0\0") - IMAGE_SCAN("\3\0\0\0\0\0\0\0\3\0\0\0\0") - IMAGE_SCAN("\16\0\0\0\0\0\0\0\0\0\0\0\0") - IMAGE_SCAN("\6\0\0\0\0\0\0\0\1\0\0\0") - IMAGE_SCAN("\7\0\0\0\0\0\0\0\0\377\377\377\0\0") - IMAGE_SCAN("\7\0\0\0\0\0\0\0\377\377\377\3\0\0\377\377\377\0\0") - IMAGE_SCAN("\10\0\0\0\0\0\0\0\0\377\377\377\0\0\1\377\377\377\0\0") - IMAGE_SCAN("\7\0\0\0\0\0\0\0\377\377\377\1\0\0") - IMAGE_SCAN("\10\0\0\0\0\0\0\0\0\377\377\377\0\0\2\377\377\377\0\0") - IMAGE_SCAN("\0\0\0\1\0\0\377\377\377\1\0\0") - IMAGE_SCAN("Ɖ\0\0") -IMAGE_PACKED(paste_1_16, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(moveUp_1_16) - IMAGE_SCAN("\1\377\0\0") - IMAGE_SCAN("˂\377\0\0") - IMAGE_SCAN("ʄ\377\0\0") - IMAGE_SCAN("˂\377\0\0\1\377\0\0") - IMAGE_SCAN("\1\1\377\0\0\1\377\0\0") - IMAGE_SCAN("\1\1\377\0\0") - IMAGE_SCAN("\1\1\377\0\0") - IMAGE_SCAN("\1\377\0\0") - IMAGE_SCAN("\4\0\0\0\0\0\0\3\0\0\0\0\0\0\1\377\0\0") - IMAGE_SCAN("\0\0\0\1\0\0\0\377\0\0") - IMAGE_SCAN("\3\0\0\0\0\0\0\4\0\0\0\0\0\0") - IMAGE_SCAN("") - IMAGE_SCAN("\1") - IMAGE_SCAN("\1") - IMAGE_SCAN("\1") -IMAGE_PACKED(moveUp_1_16, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(moveDown_1_16) - IMAGE_SCAN("") - IMAGE_SCAN("") - IMAGE_SCAN("") - IMAGE_SCAN("") - IMAGE_SCAN("") - IMAGE_SCAN("\3\0\0\0\0\0\0\4\0\0\0\0\0\0") - IMAGE_SCAN("\0\0\0\1\0\0\0\377\0\0") - IMAGE_SCAN("\4\0\0\0\0\0\0\3\0\0\0\0\0\0\1\377\0\0") - IMAGE_SCAN("\1\377\0\0") - IMAGE_SCAN("\1\377\0\0") - IMAGE_SCAN("\1\377\0\0") - IMAGE_SCAN("\1\377\0\0\1\377\0\0") - IMAGE_SCAN("˂\377\0\0\1\377\0\0") - IMAGE_SCAN("ʄ\377\0\0") - IMAGE_SCAN("˂\377\0\0") - IMAGE_SCAN("\1\377\0\0") -IMAGE_PACKED(moveDown_1_16, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(help_1_16) - IMAGE_SCAN("ņ\0\0\0") - IMAGE_SCAN("Â\0\0\0Ƃ\0\0\0") - IMAGE_SCAN("\1\0\0\0Ä\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\2\0\0\0\36\377\36\377\377\1\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\2\0\0\0\36\377\36\377\377\2\30\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\3\0\0\0\36\377\36\377\377\0\0\0\3\36\377\377\30\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0ă\0\0\0\36\377\377\2\30\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\4\0\0\0\35\30\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\4\0\0\0\36\377\377\35\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0Ƃ\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0Ƃ\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\4\0\0\0\36\377\377\35\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0\4\0\0\0\35\30\0\0\0\1\0\0\0") - IMAGE_SCAN("\1\0\0\0Ă\0\0\0\1\0\0\0") - IMAGE_SCAN("Â\0\0\0Ƃ\0\0\0") - IMAGE_SCAN("ņ\0\0\0") -IMAGE_PACKED(help_1_16, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(keys_1_16) - IMAGE_SCAN("") - IMAGE_SCAN("‡\0\0\0Lυ\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\1\0\0\0\2z\377\0\0\0L\1\0\0\0\377\2") - IMAGE_SCAN("\14\0\0\0\377\0\0\0z\377z\377\0\0\0L\0\0\0\377\0\0\0\1z\377") - IMAGE_SCAN("\5\0\0\0z\377\0\0\0\4L\0\0\0\1") - IMAGE_SCAN("\1\0\0\0z\377\5z\377\0\0\0L\0\0\0\1z\377") - IMAGE_SCAN("\0\0\0Lχ\0\0\0") - IMAGE_SCAN("g\1\0\0\0L\1\0\0\0g") - IMAGE_SCAN("\1\0\0\0Lχ\0\0\0Lτ\0\0\0") - IMAGE_SCAN("\3\0\0\0L\0\0\0\377\2\1\0\0\0L\4\0\0\0\377\0\0\0") - IMAGE_SCAN("\4\0\0\0L\0\0\0\377\0\0\0z\377\0\0\0\4L\0\0\0\377\0\0\0") - IMAGE_SCAN("\10L\0\0\0z\377\0\0\0\6L\0\0\0") - IMAGE_SCAN("\2L\0\0\0\1z\377\1\0\0\0L\1\0\0\0\3z\377z\377") - IMAGE_SCAN("\0\0\0Lφ\0\0\0") - IMAGE_SCAN("\2g\0\0\0g\1\0\0\0g\1\0\0\0g") - IMAGE_SCAN("\0\0\0Lχ\0\0\0Lσ\0\0\0") -IMAGE_PACKED(keys_1_16, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(calcolatrice_1_16) - IMAGE_SCAN("") - IMAGE_SCAN("\377") - IMAGE_SCAN("\1\377\36\36\2") - IMAGE_SCAN("\2\377\36\36KK\2") - IMAGE_SCAN("\2\377\36\36\1") - IMAGE_SCAN("\377") - IMAGE_SCAN("\1\377\2\0\0\0\2\0\0\0܂\377\2\0\0\377") - IMAGE_SCAN("\2\377Ղ\0\0\0\2Ղ\0\0\0\2\377\0\0\377\1") - IMAGE_SCAN("\377\1܃\1") - IMAGE_SCAN("\1\377\2\0\0\0\377\2\0\0\0\2\0\0\0") - IMAGE_SCAN("\2\377Ղ\0\0\0\2\377Ղ\0\0\0\2Ղ\0\0\0\1") - IMAGE_SCAN("\377") - IMAGE_SCAN("\1\377\2\0\0\0܂\2\0\0\0܂\2\0\0\0") - IMAGE_SCAN("\2\377Ղ\0\0\0\2Ղ\0\0\0\2Ղ\0\0\0\1") - IMAGE_SCAN("\1\377") -IMAGE_PACKED(calcolatrice_1_16, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(calcolatrice_2_16) - IMAGE_SCAN("") - IMAGE_SCAN("\377nn") - IMAGE_SCAN("\1\377nn\36\36\2\35\35") - IMAGE_SCAN("\2\377nn\36\36KK\2\35\35") - IMAGE_SCAN("\2\377nn\36\36\1\35\35") - IMAGE_SCAN("\1\377nn\377ll\377^^\377XX\1\35\35") - IMAGE_SCAN("\1\377nn\377\377\377\2\0\0\0\377^^\377\377\377\2\0\0\0\377XX\377\377\377\2\0\0\377\35\35") - IMAGE_SCAN("\2\377nn\377\377\377\0\0\0\2\377^^\377\377\377\0\0\0\2\377XX\377\377\377\0\0\377\1\35\35") - IMAGE_SCAN("\1\377nn\377ll\1\377^^\377XX\1\35\35") - IMAGE_SCAN("\1\377nn\377\377\377\2\0\0\0\377^^\377\377\377\2\0\0\0\377XX\377\377\377\2\0\0\0\35\35") - IMAGE_SCAN("\2\377nn\377\377\377\0\0\0\2\377^^\377\377\377\0\0\0\2\377XX\377\377\377\0\0\0\1\35\35") - IMAGE_SCAN("\1\377nn\377ll\1\377^^\377XX\1\35\35") - IMAGE_SCAN("\1\377nn\377\377\377\2\0\0\0\377XX\377\377\377\2\0\0\0\377XX\377\377\377\2\0\0\0\35\35") - IMAGE_SCAN("\2\377nn\377\377\377\0\0\0\2\377XX\377\377\377\0\0\0\2\377XX\377\377\377\0\0\0\1\35\35") - IMAGE_SCAN("\1\377nn\35\35") -IMAGE_PACKED(calcolatrice_2_16, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(package_1_16) - IMAGE_SCAN("") - IMAGE_SCAN("ƅ\0\0\0") - IMAGE_SCAN("…\0\0\0\3\377\377\377\377\377\377\0\0\0") - IMAGE_SCAN("\1\0\0\0\377\377\377\1\0\0\0\377\377\377\5\0\0\0\377\377\377\0\0\0") - IMAGE_SCAN("\2\0\0\0\377\377\377\0\377\0\10\0\0\0\377\377\377\377\377\377\0\0\0\0\377\0\0\0\0") - IMAGE_SCAN("\2\0\0\0\377\377\377\0\377\0\1\0\0\0\377\377\377\5\0\0\0\0\377\0\0\0\0") - IMAGE_SCAN("\0\0\0\3\377\377\377\377\377\377\0\0\0") - IMAGE_SCAN("\1\0\0\0\1\0\0\0\377\377\377\6\0\0\0\0\0\0") - IMAGE_SCAN("\7\0\0\0\0\0\0\377\377\377\5\0\0\0\0\0\0") - IMAGE_SCAN("\12\0\0\0\0\0\0\377\377\377\0\0\0\1\0\0\0") - IMAGE_SCAN("\0\0\0\1\377\377\377\0\0\0") - IMAGE_SCAN("\2\0\0\0\377\377\377\0\377\0\10\0\0\0\377\377\377\0\0\0\0\377\0\0\0\0") - IMAGE_SCAN("\2\0\0\0\2\0\0\0\377\377\377\1\0\0\0\1\0\0\0") - IMAGE_SCAN("…\0\0\0\3\377\377\377\0\0\0") - IMAGE_SCAN("ƅ\0\0\0") -IMAGE_PACKED(package_1_16, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(topic_1_16) - IMAGE_SCAN("") - IMAGE_SCAN("Ê") - IMAGE_SCAN("\1\0\377\0\1") - IMAGE_SCAN("Ê") - IMAGE_SCAN("\1\377\377\377\1") - IMAGE_SCAN("\2\377\377\377\2\377\377\377") - IMAGE_SCAN("\1\377\377\377\1") - IMAGE_SCAN("\2\377\377\377\2\377\377\377") - IMAGE_SCAN("\1\377\377\377\1") - IMAGE_SCAN("\2\377\377\377\2\377\377\377") - IMAGE_SCAN("\1\377\377\377") - IMAGE_SCAN("\2\377\377\377\4\377\377\377\0\377\377") - IMAGE_SCAN("\1\377\377\377\1\0\377\377\1") - IMAGE_SCAN("\1\377\377\377\1\0\377\377\1") - IMAGE_SCAN("Ê") -IMAGE_PACKED(topic_1_16, "\2\20\0\0\0\20\0\0\0\0\0\0\0\377\377\377\377\0\0\0\0") -IMAGE_BEGIN(group_1_16) - IMAGE_SCAN("") - IMAGE_SCAN("ĉ") - IMAGE_SCAN("\1\0\377\0") - IMAGE_SCAN("\2\0\377\0") - IMAGE_SCAN("\1\0\377\0\1\377\377\377") - IMAGE_SCAN("\5\377\377\377\377\377\377") - IMAGE_SCAN("\1\377\377\377\1\377\377\377\3\377\377\377") - IMAGE_SCAN("\2\377\377\377\7\377\377\377\377\377\377\377\377\377") - IMAGE_SCAN("\1\377\377\377\2\377\377\377\2\377\377\377") - IMAGE_SCAN("\2\377\377\377\1\377\377\377\1\0\377\377") - IMAGE_SCAN("\1\377\377\377\0\377\377\3\0\377\377") - IMAGE_SCAN("\2\377\377\377\4\377\377\377\0\377\377\0\377\377\3\0\377\377") - IMAGE_SCAN("\1\377\377\377\1\0\377\377\2\0\377\377") - IMAGE_SCAN("\1\377\377\377\1\0\377\377") - IMAGE_SCAN("") -IMAGE_PACKED(group_1_16, "\2\20\0\0\0\20\0\0\0\0\0\0\0\377\377\377\377\0\0\0\0") -IMAGE_BEGIN(label_1_16) - IMAGE_SCAN("") - IMAGE_SCAN("") - IMAGE_SCAN("Ń") - IMAGE_SCAN("\3\0\377\0\3\0\377\0") - IMAGE_SCAN("\2\0\377\0\2\0\377\0") - IMAGE_SCAN("„\0\377\0") - IMAGE_SCAN("\1\0\377\0\1") - IMAGE_SCAN("ƒ\0\377\0\0\377\0") - IMAGE_SCAN("\1\0\377\0\1\1\0\377\0\1") - IMAGE_SCAN("ƒ\0\377\0\0\377\0") - IMAGE_SCAN("\1\0\377\0\1") - IMAGE_SCAN("„\0\377\0") - IMAGE_SCAN("\2\0\377\0\2\0\377\0") - IMAGE_SCAN("\3\0\377\0\3\0\377\0") - IMAGE_SCAN("Ń") -IMAGE_PACKED(label_1_16, "\2\20\0\0\0\20\0\0\0\0\0\0\0\377\377\377\377\0\0\0\0") -IMAGE_BEGIN(check0_1_13) - IMAGE_SCAN("f33") - IMAGE_SCAN("\1f33\1؂\2\2f33") - IMAGE_SCAN("\1f33\1؂\7f33") - IMAGE_SCAN("\1f33\4\2f33") - IMAGE_SCAN("\1f33\2ރ\3f33") - IMAGE_SCAN("\2f33܂\2f33") - IMAGE_SCAN("\3f33\2f33") - IMAGE_SCAN("\2f33\1\2\1f33") - IMAGE_SCAN("\1f33\1\1\1f33") - IMAGE_SCAN("\5f33\2\1f33") - IMAGE_SCAN("\1f33\5\1f33") - IMAGE_SCAN("\1f33\7\1f33") - IMAGE_SCAN("f33") -IMAGE_PACKED(check0_1_13, "\2\15\0\0\0\15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(check1_1_13) - IMAGE_SCAN("f33") - IMAGE_SCAN("\1f33\1؂\2\2f33") - IMAGE_SCAN("\1f33\1؂\7f33") - IMAGE_SCAN("\1f33\4\4\0\0f33") - IMAGE_SCAN("\1f33\2ރ\0\0\3f33") - IMAGE_SCAN("\4f33\0\0\0\0\3f33") - IMAGE_SCAN("\3f33ڂ\0\0\1\0\0\2f33") - IMAGE_SCAN("\1f33څ\0\0\2\1f33") - IMAGE_SCAN("\1f33\0\0\1\1f33") - IMAGE_SCAN("\6f33\0\0\2\1f33") - IMAGE_SCAN("\1f33\5\1f33") - IMAGE_SCAN("\1f33\7\1f33") - IMAGE_SCAN("f33") -IMAGE_PACKED(check1_1_13, "\2\15\0\0\0\15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(trash_1_48) - IMAGE_SCAN("ǐ") - IMAGE_SCAN("ǐ\2Ȓɔ˗\2̜ǐ") - IMAGE_SCAN("\1ɗō\2Ǐǐɔ˗\2\377̙") - IMAGE_SCAN("\4‡ÉĊō\2Ǐǐɔ˗\2ү") - IMAGE_SCAN("\7}‡ÉĊō\2Ǐǐɔ˗\1ppp") - IMAGE_SCAN("\12o}\177‡ÉĊō\2Ǐǐɔ\2\377ޱppp") - IMAGE_SCAN("\16ozxz|}\177‡ÉĊō\5Ǐǐԡ\377ppp") - IMAGE_SCAN("Ճo\17ruwxz|}\177‡ÉĊō\1ݭ\377\377\1ppp") - IMAGE_SCAN("ņ\377դ\6kwklopr\5uwxz|\177\10‡Éȏ练\377\377\1ppp") - IMAGE_SCAN("\4ѥ\377դ\377\377迂\377\7\377\377\377ܱٱ̤sc\1eg\13kloprtuwxz|\177\6ҝ\377ԃ\377\377\2зppp") - IMAGE_SCAN("\2Ξ\377漈\377\377\32\377\377\377\377کƊpegikloprtuwxz|\177\177ϙȅ\377\377\2ҹppp") - IMAGE_SCAN("\2\377ܯ\377\377\24\377\377\377ҜĆokloprtuwxz‡ک\377Ӈ\377\377\2ҹppp") - IMAGE_SCAN("\2Ѫ\377А\377\377\16\377\377\377\377ܪ֡ϖƊȌעܪ\377ъ\377\377\2kkk") - IMAGE_SCAN("\1Ѫ\377\377\2\377\377ۂ\377\2\377\377ݎ\377\377\2kkk") - IMAGE_SCAN("\1Ѫ\377\377\3\377\377\377\377\377م\377\377\2kkk") - IMAGE_SCAN("\1Ѫ\377\377\1\377\377\377\377\377\377\5\377\377\377\377\377\377݄\377\377\2~kkk") - IMAGE_SCAN("\2Ѫ\377͗\377\13\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377湀̀\377ԃ\377\3\377ىkkk") - IMAGE_SCAN("\2Ѫ\377ĕ\377\5\377\377\377ߦ`^@@\7ҏ\20\20̀\377\377΃\377\3\377fffkkk") - IMAGE_SCAN("\2Ѫ\377乔\377\4\377\37700\0\0\6\20\02000\0\0̀\377\377̃\377\2\377ppp") - IMAGE_SCAN("\1\377ݰ\377\3\377\20\20\0\0\3̀\377\377Ń\377\2kkk") - IMAGE_SCAN("\1հ\377\2\20\20\0\0\3̀\377\377\377\2ͱkkk") - IMAGE_SCAN("\1\377ة\377\3\377\377@@\0\0\3\20\20@@ \0\0\3̀\377\377羃\377\2kkk") - IMAGE_SCAN("\2\377ة\377ޱ\377߳\2\377ⴿޭ\0\0\6\20\20ٝ\377\377\377\377\377\377ҏ\0\0\3̀\377\377乃\377߳\2kkk") - IMAGE_SCAN("‚\377ة\377٪\13\377ۮ\377@@\0\0@@\377\377\377\377ٝ\0\0\3̀\377\377߳\377٪\3\377ޱkkk") - IMAGE_SCAN("Ñ\377֦\13\377\0\0PP\377\377\377\377\20\20\0\0\3̀\377\377ܯ\377֦\3\377ೆ~kkk") - IMAGE_SCAN("\1\377ϝ\377Ѡ\13\377Ӣ\377ⴏІ \377\377\377\377\377\37700\0\0\7̀\377\377\377ҡ\377Ѡ\377ppp") - IMAGE_SCAN("\1\377ϝ\377̙\7\377Ӣ\377@@߫\377҂\377\377\1po\0\0\01300@@``̀\377\377\377ة\377̙\377kkk") - IMAGE_SCAN("Â\377ϝ\377̙\30\377֦\377PP\377\377\377\377湿\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377ޯߦ\377\377ة\377ֲ̙kkk") - IMAGE_SCAN("\1ƍȒ\30٨\377۟Ք\377\377\377\377\377\377\377\377\377ǿ\377\377\377\377\377\377\377\377PP\377\377֦ȒĦkkk") - IMAGE_SCAN("\1ƍƎ\1٨\377\3؛mpo@@\0\0\15 \377\377@@\377ԡƎkkk") - IMAGE_SCAN("\1ƍÉ\1̕\377\1m\0\0\15\377\377\377\37700pi\377ʒǎkkk") - IMAGE_SCAN("Ăƍ\3ʒ\377ⴀm\0\0\16̀\377\377\377\377\377\377`^\0\0\377ћzkkk") - IMAGE_SCAN("Ŏ\177\4Ɗפ\377ⴀm\0\0\1@@\377\377\13\377\377`^\0\00000\377ݭ\177کkkk") - IMAGE_SCAN("\1pz\7ћ\377\377\377\377ⴀm\0\0\00600\377\377\377\377ٝ \0\0\6ߦ\377ҝzkkk") - IMAGE_SCAN("\1pu\12ƒ\377\377\377\377ڬ\377զ\377ة\377ⴀm\0\0\00100\0\0\7@@\377\377\377\377\377ϖֲkkk") - IMAGE_SCAN("ƅp\10\177\377\377\377\377ܯ\377ڬ\377զ\377դ\2\377ⴀm\0\0\2\20\20ԃ\377\377\3ͱkkk") - IMAGE_SCAN("Ƃmk\15Ж\377\377\377\377\377߳\377ۮ\377٪\377զ\377Ѡ\377џ\377ⴟҍ\0\0\5\20\20\377\377\377\377݂\377\377\2kkk") - IMAGE_SCAN("\1mg\21ݪ\377\377\377\377\377\377߳\377ۮ\377٪\377զ\377џ\377ϝ\377ⴿޭ\0\0\20\02000\0\0\6@@\377\377\377\377\377݂\377\377\2nnjkkk") - IMAGE_SCAN("Ƃm\24lj\377\377\377\377\377\377\377߳\377ۮ\377٪\377զ\377ҡ\377џ\377ⴿޭ\0\0І\377Ք``@@\7po\377\377\377\377\377\377\377\377؂\377\377\2vvv") - IMAGE_SCAN("!‚\377\377\377\377\377\377\377߳\377ݰ\377ڬ\377ة\377զ\377Ӣ\377ⴿޭPL\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377ލkkk") - IMAGE_SCAN(" ‚\377\377\377\377\377\377\377\377\377߳\377ۮ\377ڬ\377ة\377զ\377\377\377ޱ\377\377\377\377\377\377\377\377\377\377֍kkk") - IMAGE_SCAN("\11‚\377\377\377\377\377\377\377\377㸂\377߳\1\377ۮ\377ڬ\20\377\377\377\377\377߳\377\377\377\377\377\377\377\377\377зhhd") - IMAGE_SCAN("\6\377\377\377\377\377Ă\377\25\377\377\377\377߳\377ݰ\377ۮ\377ݰ\377\377\377߳\377\377\377\377\377\377\377\377ʃzddd") - IMAGE_SCAN("\14fff\377\377\377\377\377\377\377\377\377\377\377ೃ\377߳\13\377\377\377\377\377\377\377\377з{bbb") - IMAGE_SCAN("\6fff\377\377\377\377Â\377\1\377漂\377㸃\377\11\377\377\377\377\377rrnnnn") - IMAGE_SCAN("ʂfff\4\377\377\377̓\377\7\377\377\377\377\377rrn\1nnn") - IMAGE_SCAN("̌fff\1ppp") -IMAGE_PACKED(trash_1_48, "\0020\0\0\0000\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(trash_1_32) - IMAGE_SCAN("\2ѪȒ") - IMAGE_SCAN("\10ٱōƎȒɔ˗̜") - IMAGE_SCAN("\13ÉĊōƎȒɔ\377̙үkkk") - IMAGE_SCAN("\7հ\177ÉĊƎ\4Ȓɔ̤kkk") - IMAGE_SCAN("\20ٱljtx|}\177ÉĊōƎݭҹkkk") - IMAGE_SCAN("\3ܱ\377ⷂ\26ٱ̤ljilmorux|}\177Éȏ\377\377\377ҹkkk") - IMAGE_SCAN("\2\377ة\377ք\377\377\22\377֡ljmilprux|}פ\377\377؂\377\377\2ҹkkk") - IMAGE_SCAN("\2\377ة\377͉\377\377\6\377\377עϖƊȌ\3ܪ\377؅\377\377\2kkk") - IMAGE_SCAN("\1\377ة\377\377ރ\377݅\377\377\6\377\377\377\377\377\377\377ީkkk") - IMAGE_SCAN("\1\377ة\377\377\7\377\377\377\377\377\377\377\377\377\377\377\377\377\2kkk") - IMAGE_SCAN("\2\377ة\377͎\377\11ߦ̀ҏ@@\377\377\377\377\2~kkk") - IMAGE_SCAN("\1\377ۮ\377\3\377 \0\0\7 @@\377\377\377\377kkk") - IMAGE_SCAN("\1ܱ\377\3\377\20\20\0\0\2@@\377Ђ\377\2\377kkk") - IMAGE_SCAN("\1ٱ\377\6\37700\0\0 ̀@@\0\0\2@@\377̂\377\2\377kkk") - IMAGE_SCAN("‹\377ۮ\7\377ޱҍ\0\0І\377\377ǃ\0\0\6@@\377\377٪\377ةĦkkk") - IMAGE_SCAN("\2\377ۮ\377զ\377դ\7\377PPІ\377\377\37700\0\0\6@@\377\377ڬ\377Ѡkkk") - IMAGE_SCAN("\1\377ϝ\377̙\6\377PP\377\377po@@\10pòߦ\377\377̙kkk") - IMAGE_SCAN("\1\377ϝ˗\20\377۟Ք\377\377\377\377ǿ\377\377\377\377\377̀\377ޱɔvvvkkk") - IMAGE_SCAN("\1\377ϝƎ\3\377@@\0\0\2\20\20\377ׂІ\3\377٪ǐvvv") - IMAGE_SCAN("Â\2̕\377ۄ\0\0\6ߦ\377\377\377\377\20\20澂ϙ\1kkk") - IMAGE_SCAN("Ć}\5Ɗک\377\377ۃ\0\0\12 ̀\0\0@@\377ҝעkkk") - IMAGE_SCAN("Ąt\7ʒ\377\377\377ۮ\377֦\377ۇ\0\0\6\20\20\377\377\377Ħkkk") - IMAGE_SCAN("Ăk\11r\377\377߳\377ۮ\377Ӣ\377֦\377ۇ\0\0\2ٝ\377\377\377\377\2kkk") - IMAGE_SCAN("\15m\377\377\377\377߳\377ۮ\377Ӣ\377Ѡ\377\0\0̀@@\0\0\7PP\377\377\377\377\377hhd") - IMAGE_SCAN("\25Ȍ\377\377\377\377\377\377ۮ\377ة\377Ӣ\377`^\377\377\377\377\377\377\377\377\377bbb") - IMAGE_SCAN("\6Ȍ\377\377\377\377ᵃ\377ڬ\2\377\377ς\377\7\377\377\377\377\377Ħbbb") - IMAGE_SCAN("\22Ȍ\377\377\377\377\377\377߳\377ݰ\377ޱ\377\377\377\377\377\377зvvvfff") - IMAGE_SCAN("\6fff\377\377\377\377亂\377\10\377\377\377\377ʱrrnkkk") - IMAGE_SCAN("ǂfff\13\377\377\377\377зҹrrnkkkz") - IMAGE_SCAN("Ɉfff") -IMAGE_PACKED(trash_1_32, "\2 \0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") -IMAGE_BEGIN(trash_1_16) - IMAGE_SCAN("\4}ɗɔѪ") - IMAGE_SCAN("\7}ÉƎ\377ݰkkk") - IMAGE_SCAN("\377ڬ\12̤sorx}ȏ\377\377\377kkk") - IMAGE_SCAN("\1\377ڬ\377\377\5\377˃\377\377\1kkk") - IMAGE_SCAN("\1\377ڬ\377\377\7ۿ@@\377\377kkk") - IMAGE_SCAN("\1\377ڬ\377\2 \0\0\4@@\377ͱkkk") - IMAGE_SCAN("\1\377ڬ\377߳\2\377PP̀\5\0\0@@\377©kkk") - IMAGE_SCAN("\1\377ڬ\377Ӣ\4\377ǀ̀po@@\3澤nnj") - IMAGE_SCAN("ɔ\1\377߳@@\6 ԏҏ؛{hhd") - IMAGE_SCAN("\14Ɗϙ\377@@\0\0PP@@\377nnj") - IMAGE_SCAN("\6̤\377\377\377Ӣ@@\0\0\4 \377\377kkk") - IMAGE_SCAN("\13lj\377\377ݰ\377ة@@\377\377\377ۙkkk") - IMAGE_SCAN("\12kkk\377\377\377\377\377\377Ħvvvppp") - IMAGE_SCAN("\2kkk\3kkkppp") - IMAGE_SCAN("Ąkkk") -IMAGE_PACKED(trash_1_16, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") diff --git a/uppdev/src/support/common.key b/uppdev/src/support/common.key deleted file mode 100644 index dd9c1a054..000000000 --- a/uppdev/src/support/common.key +++ /dev/null @@ -1,15 +0,0 @@ -KEY(OPENFILE, t_("Open"), K_CTRL_O) -KEY(NEWFILE, t_("New"), K_CTRL_N) -KEY(SAVE, t_("Save"), K_CTRL_S) -KEY(SAVEAS, t_("Save as"), 0) -KEY(DELETEFILE, t_("Remove"), K_CTRL_D) -KEY(CLOSEFILE, t_("Close"), K_CTRL_Q) -KEY(PRINT, t_("Print"), K_CTRL_P) -KEY(SETTINGS t_("Settings") 0) - -KEY(QUIT, t_("Quit"), K_CTRL_X) -KEY(FASTKEYS, t_("Keys"), K_CTRL_K) - -KEY(INFO, t_("About"), 0) - -KEY(SELECTALL, t_("Select all"), K_CTRL_A|K_SHIFT_CTRL_NUMPAD5) diff --git a/uppdev/src/support/common.t b/uppdev/src/support/common.t deleted file mode 100644 index e595846b2..000000000 --- a/uppdev/src/support/common.t +++ /dev/null @@ -1,47 +0,0 @@ - -// Ctrl.lay - -T_("O&k") -itIT("O&k") - -T_("&Cancel") -itIT("&Annulla") - - -// common.key - -T_("Open") -itIT("Apri") - -T_("New") -itIT("Nuovo") - -T_("Save") -itIT("Salva") - -T_("Save as") -itIT("Salva come") - -T_("Remove") -itIT("Elimina") - -T_("Close") -itIT("Chiudi") - -T_("Print") -itIT("Stampa") - -T_("Settings") -itIT("Impostazioni") - -T_("Quit") -itIT("Esci") - -T_("Keys") -itIT("Tasti veloci") - -T_("About") -itIT("Informazioni") - -T_("Select all") -itIT("Seleziona tutto") diff --git a/uppdev/src/support/geom.cpp b/uppdev/src/support/geom.cpp deleted file mode 100644 index 1ddcaf883..000000000 --- a/uppdev/src/support/geom.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include "support.h" - -double LinearInterpolation(double x, Point_ p1, Point_ p2, bool yx) { - double y, k; - - if(!yx) { - k = ((p2.y - p1.y) / (p2.x - p1.x)); - if(k >= 0) y = x - (p1.x * k) + p1.y; - else y = (p1.x * k) - x + p1.y; - } - else { - k = ((p2.y - p1.y) / (p2.x - p1.x)); - if(k < 0) y = p2.x - ((p2.x - x) * k); - else y = p1.x + ((x - p1.y) / k); // 20.07.2005 provato - OK - } -#ifdef _WITH_DEBUG -RLOG("\nLinearInterpolation()"); -RLOG("k: " + FormatDouble(k)); -RLOG("x: " + FormatDouble(x)); -RLOG("p1: " + FormatDouble(p1.x) + "," + FormatDouble(p1.y)); -RLOG("p2: " + FormatDouble(p2.x) + "," + FormatDouble(p2.y)); -RLOG("y: " + FormatDouble(y)); -#endif - return y; -} diff --git a/uppdev/src/support/geom.h b/uppdev/src/support/geom.h deleted file mode 100644 index 30761877a..000000000 --- a/uppdev/src/support/geom.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _src_support_geom_h_ -#define _src_support_geom_h_ - -double LinearInterpolation(double x, Point_ p1, Point_ p2, bool yx=false); - -#endif diff --git a/uppdev/src/support/support.h b/uppdev/src/support/support.h deleted file mode 100644 index 0f139a5f4..000000000 --- a/uppdev/src/support/support.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef _common_common_h -#define _common_common_h - -#include - -#include -#include -#include -#include - -#ifdef flagGUI -#include -#endif - -#endif diff --git a/uppdev/src/support/support.icpp b/uppdev/src/support/support.icpp deleted file mode 100644 index e7869e364..000000000 --- a/uppdev/src/support/support.icpp +++ /dev/null @@ -1,4 +0,0 @@ -#include "support.h" - -#define TFILE -#include diff --git a/uppdev/src/support/support.upp b/uppdev/src/support/support.upp deleted file mode 100644 index fc086a9d3..000000000 --- a/uppdev/src/support/support.upp +++ /dev/null @@ -1,26 +0,0 @@ -options(_DEBUG) "-D_WITH_DEBUG"; - -file - support.h, - Core readonly separator, - Core.h, - Core.cpp, - Ctrl readonly separator, - Ctrl.h, - Ctrl.cpp, - Ctrl.lay, - ExternLib readonly separator, - ExternLib.h, - ExternLib.cpp, - utils readonly separator, - utils.h, - utils.cpp, - Geom readonly separator, - geom.h, - geom.cpp - options "-D__WITH_DEBUG", - common readonly separator, - common.key, - common.iml, - common.t, - support.icpp; diff --git a/uppdev/src/support/utils.cpp b/uppdev/src/support/utils.cpp deleted file mode 100644 index da9ab93bc..000000000 --- a/uppdev/src/support/utils.cpp +++ /dev/null @@ -1,123 +0,0 @@ -#include - -String pathToString(const char *p, bool last_sep) { - String r; - - while(*p) { - if(*p == '\\') { - r.Cat('\\'); - r.Cat('\\'); - } - else - r.Cat(*p); - - p++; - } - - if(!last_sep) - r.Remove(r.GetLength()-2, 2); - - return r; -} - -int StringSearch(const String &string, const String& key) { - for(int i=0; i<(string.GetLength()-key.GetLength()); i++) { - if(string.Mid(i, key.GetLength()) == key) { - return i; - } - } - return -1; -} - -int CountRecurrence(const String &s, const String &k) { - int r=0; - - for(int i=0; i<(s.GetLength()-(k.GetLength()-1)); i++) { - if(s.Mid(i, k.GetLength()) == k) { - i += (k.GetLength()-1); - r++; - } - } - return r; -} - -String RemoveQuote(const String &str) { - - if(str.Left(1) == "\"" && str.Right(1) == "\"") { - if(str.GetCount() == 2) return String(""); - return str.Mid(1, str.GetLength()-2); - } - return str; -} - -bool IsQuoted(const String &s) { - - if(s.Left(1) == "\"" && s.Right(1) == "\"") { - return true; - } - return false; -} - -bool isBitSet(int _byte, int _bitno) { - int val; - - val = 1 << _bitno; - return (_byte & val) >> _bitno; -} - -void bitSet(int *ptr, int _bitno, bool b) { - int val = 0; - - if(b) { - val = (1 << _bitno); -#ifdef _WITH_DEBUG -RLOG(Format("bitSet():val = %s", FormatUnsigned(val))); -#endif - *ptr |= val; - } - else { - val = (1 << _bitno); -#ifdef _WITH_DEBUG -RLOG(Format("bitSet():val = %s; ~val = %s", FormatUnsigned(val), FormatUnsigned(~val))); -#endif - *ptr &= ~val; - } - return; -} - -String GetVolumeSn(const String &vol, int len) { - dword sn; - - // Win API - if(!GetVolumeInformation(vol, NULL, 0, &sn, NULL, NULL, NULL, 0)) sn = 71511731; -#ifdef _WITH_DEBUG -RLOG("GetVolumeSn():sn = " + AsString(sn)); -#endif - - return String(AsString(sn)).Right(len); -} - -unsigned int GetLockNumber(const String& pcID) { - int n[] = {3, 5, 7, 11, 13, 17}; - int p; - unsigned int r = 0; - - p = 0; - for(int i=0; i5) p=0; - } - return r * 2707; -} - -String MyKeyReplace(const String& raw, const String& key, const String& value) { - int i; - String result = raw; - - if((i = StringSearch(result, (String)"<<" + key + ">>")) >= 0) { - result.Remove(i, key.GetLength()+4); - result.Insert(i, value); - } - return result; -} diff --git a/uppdev/src/support/utils.h b/uppdev/src/support/utils.h deleted file mode 100644 index 9bc633cb0..000000000 --- a/uppdev/src/support/utils.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef _src_support_utils_h_ -#define _src_support_utils_h_ - -// functions -String pathToString(const char *p, bool last_sep = true); -int StringSearch(const String &string, const String& key); -int CountRecurrence(const String &s, const String &k); -String RemoveQuote(const String &str); -bool IsQuoted(const String &s); - -bool isBitSet(int _byte, int _bitno); -void bitSet(int *ptr, int _bitno, bool b=true); - -String GetVolumeSn(const String &vol, int len); -unsigned int GetLockNumber(const String& pcID); - -String MyKeyReplace(const String& raw, const String& key, const String& value); - -#endif diff --git a/uppdev/stack/main.cpp b/uppdev/stack/main.cpp deleted file mode 100644 index 52163111e..000000000 --- a/uppdev/stack/main.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include - -struct App : public TopWindow -{ - TreeCtrl tree; - ArrayCtrl array; - Splitter splitter; - - App() - { - splitter.Horz(tree, array); - Add(splitter); - splitter.SetPos(1500); // << SetPos seems to be guilty of the crashes. - Sizeable().Zoomable(); - } -}; - -GUI_APP_MAIN -{ - App().Run(); -} diff --git a/uppdev/stack/stack.upp b/uppdev/stack/stack.upp deleted file mode 100644 index 6284f1903..000000000 --- a/uppdev/stack/stack.upp +++ /dev/null @@ -1,9 +0,0 @@ -uses - CtrlLib; - -file - - "main.cpp"; - -mainconfig - "" = "GUI ST"; diff --git a/uppdev/stdapp/EnhParentCtrl.cpp b/uppdev/stdapp/EnhParentCtrl.cpp deleted file mode 100644 index e0fb1e9f4..000000000 --- a/uppdev/stdapp/EnhParentCtrl.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include - -void EnhancedParentCtrl::RightDown(Point, dword) -{ - MenuBar::Execute(THISBACK(LocalMenu)); -} - -void EnhancedParentCtrl::LocalMenu(Bar& bar) -{ - bar.Add(t_("Local menu 1"), THISBACK1(OnLocal, t_("Local menu 1"))); - bar.Add(t_("Local menu 2"), THISBACK1(OnLocal, t_("Local menu 2"))); - bar.Add(t_("Local menu 3"), THISBACK1(OnLocal, t_("Local menu 3"))); -} - -void EnhancedParentCtrl::OnLocal(String menu_name) -{ - Exclamation(Format("You still have to write your own \"%s\" code!", menu_name)); -} diff --git a/uppdev/stdapp/EnhParentCtrl.hpp b/uppdev/stdapp/EnhParentCtrl.hpp deleted file mode 100644 index c66d50e3f..000000000 --- a/uppdev/stdapp/EnhParentCtrl.hpp +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef ENH_PARENT_CTRL_HPP -#define ENH_PARENT_CTRL_HPP - -#include -using namespace Upp; - -class EnhancedParentCtrl : public ParentCtrl -{ -private: - virtual void RightDown(Point, dword); - void LocalMenu(Bar& bar); - void OnLocal(String menu_name); - - typedef EnhancedParentCtrl CLASSNAME; - -public: -}; - -#endif diff --git a/uppdev/stdapp/UPP_Logo_033.iml b/uppdev/stdapp/UPP_Logo_033.iml deleted file mode 100644 index 15e50a7a9..000000000 --- a/uppdev/stdapp/UPP_Logo_033.iml +++ /dev/null @@ -1,625 +0,0 @@ -IMAGE_ID(AppLogo) - -IMAGE_BEGIN_DATA -IMAGE_DATA(120,156,237,157,7,120,20,231,181,247,215,41,118,156,196,73,156,114,147,248,75,226,56,205,169,55,61,55,113,218,77,226) -IMAGE_DATA(56,55,137,29,247,130,193,166,26,48,189,55,209,59,66,72,128,64,18,168,32,132,16,18,170,72,168,129,36,212,251,246) -IMAGE_DATA(38,237,74,171,222,123,165,243,255,206,57,179,35,4,198,196,56,142,193,177,222,231,57,207,204,238,172,86,210,204,111,254) -IMAGE_DATA(167,188,101,52,129,26,15,141,218,48,214,198,218,88,27,107,99,237,54,181,43,183,251,15,24,107,255,49,237,202,40,187) -IMAGE_DATA(241,241,43,215,31,187,50,250,231,222,236,59,113,147,227,99,237,63,161,241,213,173,239,24,134,179,121,200,109,195,110,163) -IMAGE_DATA(253,150,65,183,13,137,217,235,123,49,125,230,235,120,249,229,241,120,125,214,108,204,154,61,231,26,155,56,105,18,29,123) -IMAGE_DATA(25,167,115,138,209,216,117,22,77,93,231,208,210,125,14,173,61,103,145,152,146,129,113,227,94,198,212,169,211,48,103,206) -IMAGE_DATA(28,178,185,178,229,207,207,152,57,19,93,125,103,209,63,124,17,3,103,47,98,240,236,37,12,157,187,136,225,115,151,112) -IMAGE_DATA(246,60,217,133,75,56,119,225,50,206,95,188,130,11,151,174,224,34,217,165,203,87,112,249,50,112,249,10,145,237,182,177) -IMAGE_DATA(118,231,55,67,77,63,114,109,221,200,123,19,43,176,247,136,229,89,58,177,100,173,23,158,124,254,85,124,234,254,207,66) -IMAGE_DATA(163,185,107,196,62,240,129,15,226,145,223,253,9,211,102,45,70,106,158,25,230,186,1,88,235,7,96,111,28,68,69,211) -IMAGE_DATA(32,178,75,109,88,234,177,17,207,190,48,30,119,223,125,15,56,221,249,252,23,30,192,180,25,115,224,227,123,0,205,61) -IMAGE_DATA(231,208,222,123,30,29,253,23,208,53,112,1,61,131,23,208,59,116,145,248,187,128,1,98,112,136,184,27,62,207,204,17) -IMAGE_DATA(111,23,47,147,169,204,169,188,221,238,179,56,214,222,74,99,214,84,174,242,221,54,250,181,202,90,97,69,47,138,42,123) -IMAGE_DATA(80,92,217,139,157,126,71,133,23,197,238,194,31,31,123,28,122,87,31,125,87,31,76,117,125,176,16,103,182,134,1,84) -IMAGE_DATA(16,107,149,77,172,141,195,162,141,53,109,195,152,49,123,161,252,220,241,132,52,69,251,136,177,86,178,246,190,155,177,118) -IMAGE_DATA(121,140,181,255,128,118,75,172,145,21,19,111,177,25,250,81,172,105,48,99,222,10,232,233,123,140,181,253,164,105,253,111) -IMAGE_DATA(100,141,124,114,149,155,181,189,1,161,184,139,126,198,92,213,140,38,242,177,172,105,99,172,189,63,218,173,177,214,35,172) -IMAGE_DATA(165,21,85,93,195,218,130,21,155,228,123,140,53,10,107,214,55,232,218,85,214,130,195,99,112,239,189,31,69,69,77,187) -IMAGE_DATA(176,198,186,214,214,123,97,140,181,247,65,123,119,89,59,139,99,113,169,248,228,39,63,133,202,218,142,49,214,222,103,237) -IMAGE_DATA(182,177,86,55,198,218,251,173,221,26,107,221,40,38,222,82,139,156,183,204,154,154,27,140,177,246,254,109,99,172,141,181) -IMAGE_DATA(119,171,221,186,15,237,125,71,89,107,236,28,66,177,222,142,215,102,204,134,171,161,227,166,172,157,37,214,170,93,181,56) -IMAGE_DATA(18,30,129,254,129,33,165,166,123,135,177,118,249,242,101,92,186,116,233,13,239,115,189,249,194,133,11,183,225,47,186,115) -IMAGE_DATA(218,237,100,173,182,181,31,207,189,48,14,31,249,200,189,242,61,174,198,127,198,218,101,60,251,236,115,242,217,144,67,135) -IMAGE_DATA(239,72,214,50,51,51,113,228,200,145,55,188,223,211,211,131,69,139,22,221,134,191,232,206,105,183,147,181,102,210,53,39) -IMAGE_DATA(105,217,39,63,117,191,124,79,123,207,217,107,88,115,184,26,222,160,107,30,30,107,240,133,47,124,1,25,25,89,119,164) -IMAGE_DATA(15,141,143,143,199,238,221,187,223,240,126,71,71,7,158,123,238,185,219,240,23,221,57,237,118,251,208,150,158,243,248,210) -IMAGE_DATA(151,190,44,223,211,214,123,110,132,53,39,113,246,200,35,191,33,214,46,73,31,213,217,243,151,37,94,59,119,254,34,218) -IMAGE_DATA(218,187,222,213,120,205,106,181,34,60,60,252,166,159,137,138,138,194,146,37,75,240,212,83,79,225,143,127,252,163,236,7) -IMAGE_DATA(4,4,64,171,213,202,254,236,217,179,241,173,111,125,75,246,217,222,143,125,184,119,34,107,245,45,157,248,191,191,61,142) -IMAGE_DATA(175,126,245,161,145,254,80,133,181,203,146,27,244,245,15,97,112,232,236,187,230,67,103,205,154,133,113,227,198,221,244,51) -IMAGE_DATA(53,53,53,40,43,43,131,151,151,23,22,47,94,140,242,242,114,84,86,86,162,179,179,83,246,51,50,50,240,167,63,253) -IMAGE_DATA(73,62,195,246,126,108,239,52,107,25,37,246,127,137,53,171,163,22,191,122,228,215,210,143,117,247,221,119,227,15,127,248) -IMAGE_DATA(19,126,255,191,127,192,105,242,153,204,90,85,117,13,30,123,236,47,40,42,46,25,97,141,141,175,95,92,92,156,252,79) -IMAGE_DATA(28,159,159,58,117,10,135,15,31,30,137,211,57,46,79,78,78,134,159,159,31,206,158,61,123,205,57,224,207,235,116,58) -IMAGE_DATA(68,70,70,34,53,53,21,7,14,28,144,152,107,96,96,0,46,151,11,223,253,238,119,225,233,233,137,166,166,38,249,236) -IMAGE_DATA(240,240,48,242,243,243,69,235,248,247,140,206,5,110,230,67,159,127,254,249,127,227,149,188,243,219,59,83,243,216,248,142) -IMAGE_DATA(232,90,59,247,141,118,15,194,100,83,190,255,203,95,249,10,106,234,154,81,93,219,128,206,158,1,172,89,187,30,159,251) -IMAGE_DATA(220,231,228,88,97,97,177,226,67,137,183,244,244,116,252,232,71,63,194,207,126,246,51,241,77,204,9,143,89,250,248,199) -IMAGE_DATA(63,14,179,217,44,108,108,222,188,25,43,86,172,192,135,63,252,225,17,38,185,245,246,246,98,250,244,233,240,245,245,21) -IMAGE_DATA(13,98,134,62,250,209,143,202,119,228,229,229,73,60,255,145,143,124,4,171,86,173,130,191,191,191,48,201,254,144,125,99) -IMAGE_DATA(87,87,151,196,96,252,190,218,236,118,59,138,138,138,222,112,158,135,134,134,132,229,247,115,123,39,88,155,187,116,221,59) -IMAGE_DATA(198,26,251,208,54,226,141,95,127,237,107,95,87,198,180,157,83,98,54,131,209,138,135,31,254,246,53,172,25,140,38,164) -IMAGE_DATA(164,164,98,225,194,133,18,43,241,117,62,121,242,36,206,159,63,143,7,30,120,0,103,206,156,193,190,125,251,196,199,241) -IMAGE_DATA(245,190,239,190,251,232,243,41,242,191,247,245,245,81,76,248,136,196,85,106,115,58,157,184,231,158,123,80,85,85,37,175) -IMAGE_DATA(15,29,58,132,111,127,251,219,162,93,236,19,127,250,211,159,202,86,109,28,123,61,241,196,19,239,238,69,123,143,182,183) -IMAGE_DATA(195,26,247,81,221,117,215,93,35,172,77,156,62,255,45,177,230,34,214,130,142,68,83,222,73,172,213,119,40,99,138,110) -IMAGE_DATA(16,175,181,186,89,123,232,107,95,27,149,135,42,241,218,83,79,61,115,13,107,217,57,185,20,195,93,196,111,126,243,27) -IMAGE_DATA(172,93,187,86,252,38,251,57,102,229,211,159,254,180,196,236,170,206,20,22,22,138,102,181,181,181,137,254,77,156,56,17) -IMAGE_DATA(227,199,143,191,38,78,95,183,110,157,196,240,252,29,220,248,248,235,175,191,142,115,231,206,225,209,71,31,197,150,45,91) -IMAGE_DATA(70,62,203,239,177,150,46,95,190,252,221,189,104,239,209,246,118,88,203,212,214,227,83,247,127,102,132,181,39,159,31,175) -IMAGE_DATA(140,41,122,11,172,121,237,57,128,207,126,238,243,112,212,119,190,45,214,158,126,250,217,107,125,40,113,210,212,220,140,207) -IMAGE_DATA(124,230,51,194,9,115,196,141,125,224,119,190,243,29,137,189,84,110,60,60,60,240,187,223,253,78,52,138,235,96,159,248) -IMAGE_DATA(196,39,80,87,87,55,114,46,216,135,126,141,126,231,180,105,211,228,53,235,32,191,142,142,142,70,90,90,154,176,219,208) -IMAGE_DATA(208,32,199,56,230,91,189,122,53,126,249,203,95,162,153,126,255,88,251,231,237,237,176,86,104,239,194,143,127,254,136,123) -IMAGE_DATA(92,174,6,223,253,193,143,161,171,238,253,167,125,239,204,218,228,215,102,227,39,63,253,5,106,219,6,223,49,214,78,158) -IMAGE_DATA(76,22,110,216,223,169,109,202,148,41,248,225,15,127,40,177,61,55,230,237,7,63,248,1,118,237,218,37,175,255,252,231) -IMAGE_DATA(63,99,194,132,9,35,159,103,109,99,46,191,254,245,175,143,212,55,140,70,163,124,47,243,53,121,242,100,252,228,39,63) -IMAGE_DATA(17,70,131,131,131,197,103,115,156,198,126,120,172,189,181,246,118,88,43,113,244,97,201,26,207,17,93,187,231,35,247,34) -IMAGE_DATA(50,185,192,205,218,192,13,198,229,42,172,89,107,58,240,229,7,31,194,252,197,43,209,160,206,73,248,39,172,41,243,15) -IMAGE_DATA(148,62,131,27,179,6,44,88,176,64,98,51,85,211,56,231,124,248,225,135,49,105,210,164,17,255,200,220,220,123,239,189) -IMAGE_DATA(18,107,213,215,215,75,76,150,152,152,56,114,30,74,75,75,133,49,254,12,31,231,120,207,219,219,27,63,255,249,207,113) -IMAGE_DATA(145,124,52,199,105,47,189,244,18,42,42,42,36,39,120,63,214,199,254,213,246,246,88,235,69,182,190,1,223,250,206,15) -IMAGE_DATA(70,230,28,252,230,15,143,161,196,214,114,195,113,185,142,230,65,98,109,16,115,22,46,199,167,63,243,89,20,234,42,208) -IMAGE_DATA(216,73,172,117,159,189,41,107,15,62,248,224,8,107,111,166,107,231,207,95,32,189,249,169,240,166,54,230,233,99,31,251) -IMAGE_DATA(152,228,145,106,227,154,5,243,194,220,112,110,201,241,38,51,195,141,125,39,215,197,56,214,251,222,247,190,135,254,254,126) -IMAGE_DATA(241,155,127,255,251,223,37,119,109,111,111,199,231,63,255,121,204,157,59,247,154,115,199,190,152,25,30,107,111,173,25,111) -IMAGE_DATA(192,218,104,123,3,107,149,10,107,101,206,94,196,101,104,241,208,55,148,188,144,175,221,175,127,255,40,142,37,101,195,84) -IMAGE_DATA(219,39,172,217,221,172,101,21,91,49,238,149,169,184,239,19,159,132,95,208,81,212,183,15,163,161,83,213,181,115,248,194) -IMAGE_DATA(23,30,144,239,104,238,28,68,247,192,121,202,71,135,36,87,229,126,82,179,205,129,230,182,78,100,158,201,149,126,131,39) -IMAGE_DATA(158,120,82,62,155,155,155,47,172,177,143,228,92,131,117,73,109,97,97,97,248,254,247,191,127,77,29,141,125,38,199,240) -IMAGE_DATA(217,217,217,82,15,225,239,104,109,109,149,126,202,149,43,87,138,47,100,63,201,90,232,227,227,131,218,218,90,233,11,227) -IMAGE_DATA(122,89,80,80,16,94,120,225,5,241,193,28,195,113,99,237,12,13,13,149,188,117,172,189,149,118,229,26,93,187,241,60) -IMAGE_DATA(42,213,152,183,30,247,252,22,230,77,241,165,25,165,46,76,157,181,20,15,124,233,171,196,219,7,112,55,249,166,7,31) -IMAGE_DATA(250,134,204,171,250,29,105,221,195,223,249,62,113,115,63,30,249,237,31,17,115,50,27,174,214,33,212,18,107,245,29,103) -IMAGE_DATA(81,168,181,225,185,23,199,83,204,253,25,124,234,83,247,227,137,39,159,70,102,78,17,105,219,121,76,121,109,134,232,229) -IMAGE_DATA(103,72,7,255,247,15,127,66,110,126,17,102,207,153,39,26,120,255,253,247,227,247,191,255,61,105,79,12,98,98,98,36) -IMAGE_DATA(111,228,26,154,218,166,78,157,250,6,13,250,230,55,191,41,172,156,56,113,2,14,135,67,124,37,251,199,87,94,121,69) -IMAGE_DATA(116,139,227,57,142,199,30,122,232,33,20,20,20,72,221,141,63,243,235,95,255,90,116,210,102,179,225,139,95,252,162,228) -IMAGE_DATA(22,156,19,204,156,57,19,122,189,254,221,190,96,239,209,166,204,26,238,30,80,198,142,189,153,117,188,137,41,227,205,20) -IMAGE_DATA(235,36,107,106,39,173,211,153,16,25,117,156,98,230,0,137,155,3,2,252,17,23,127,2,21,78,23,122,6,206,141,154) -IMAGE_DATA(3,170,204,3,237,237,31,70,83,75,59,218,58,186,201,122,208,210,214,33,253,79,231,47,94,198,192,224,48,197,83,73) -IMAGE_DATA(98,61,189,125,56,127,225,18,49,209,129,238,238,30,210,162,94,241,127,253,253,3,194,4,199,87,163,27,199,242,236,7) -IMAGE_DATA(71,183,211,167,79,75,29,86,141,179,184,102,203,241,26,215,45,228,108,92,81,106,194,141,141,141,242,154,217,75,74,74) -IMAGE_DATA(26,121,205,141,127,15,107,25,231,164,131,131,131,99,49,219,88,27,107,99,109,172,141,181,177,54,214,198,218,88,27,107) -IMAGE_DATA(99,109,172,189,173,54,150,75,141,181,119,187,141,49,55,214,254,61,141,75,67,125,131,195,104,235,238,71,207,192,48,6) -IMAGE_DATA(134,206,225,252,133,139,99,53,163,177,246,142,55,30,183,223,210,217,11,123,85,29,26,219,122,80,223,210,37,219,150,142) -IMAGE_DATA(62,116,244,12,162,111,224,44,134,207,94,192,249,243,23,113,137,62,123,21,193,155,173,17,57,214,198,218,27,219,57,210) -IMAGE_DATA(176,6,98,203,92,225,26,225,172,153,56,107,233,100,235,71,91,231,0,186,186,134,208,221,57,136,174,118,50,218,118,118) -IMAGE_DATA(12,160,187,155,56,236,27,194,240,240,121,92,188,116,105,148,14,142,241,55,214,110,220,6,73,179,28,13,157,48,218,170) -IMAGE_DATA(80,219,212,33,140,117,244,14,138,79,21,230,218,233,53,177,213,217,70,124,145,117,182,244,163,161,166,11,213,206,54,84) -IMAGE_DATA(218,155,97,179,54,194,106,107,130,195,217,138,186,198,110,180,211,103,251,250,21,45,188,116,233,242,219,244,197,55,254,25) -IMAGE_DATA(254,174,139,23,47,161,167,119,8,131,196,248,37,247,216,199,177,246,222,104,61,253,231,96,170,106,131,193,230,18,77,107) -IMAGE_DATA(237,234,67,47,249,205,238,254,97,180,119,13,160,157,116,173,155,116,173,163,181,31,237,205,125,104,111,234,67,99,109,55) -IMAGE_DATA(28,196,153,197,88,15,163,190,22,122,93,45,180,186,58,178,122,104,13,13,208,155,26,81,78,199,116,166,6,152,108,141) -IMAGE_DATA(112,184,90,209,212,218,131,110,98,248,236,57,102,240,205,214,182,189,34,1,228,197,139,151,69,47,251,136,41,214,207,238) -IMAGE_DATA(174,65,226,189,31,141,13,204,120,11,210,51,141,8,138,42,64,66,134,25,249,90,23,44,142,102,250,254,94,12,12,158) -IMAGE_DATA(27,197,247,104,31,63,166,181,119,66,235,238,59,139,82,75,19,233,90,181,104,90,23,249,197,129,225,11,164,27,23,208) -IMAGE_DATA(75,199,186,187,135,201,127,14,161,171,149,184,107,238,71,83,125,15,106,171,58,72,211,154,96,54,212,193,64,140,25,244) -IMAGE_DATA(117,194,154,78,223,0,131,177,17,90,125,61,10,75,92,200,202,115,32,45,203,138,147,167,140,56,121,218,132,212,76,11) -IMAGE_DATA(210,179,45,200,41,118,160,204,80,75,49,98,11,26,154,187,165,239,157,125,57,247,115,51,103,206,202,102,184,136,127,87) -IMAGE_DATA(117,43,26,72,115,155,137,163,102,186,15,106,235,218,81,89,81,143,232,132,2,120,6,164,97,87,208,105,248,132,100,192) -IMAGE_DATA(231,80,38,246,31,201,33,254,242,113,60,69,135,140,194,10,232,173,245,168,111,234,166,188,231,236,88,158,115,135,180,46) -IMAGE_DATA(210,142,220,114,23,12,86,23,58,123,134,40,23,56,71,154,114,17,231,206,94,194,57,218,158,29,188,128,190,46,226,141) -IMAGE_DATA(89,115,107,154,203,209,6,155,165,65,116,205,100,168,23,222,116,196,23,179,166,55,144,166,145,190,229,23,85,17,107,21) -IMAGE_DATA(72,203,180,34,41,221,136,184,147,90,28,79,40,195,209,152,98,28,57,94,136,208,99,121,8,163,109,68,124,9,98,137) -IMAGE_DATA(143,228,76,51,206,20,85,162,204,88,139,114,61,105,21,233,97,13,175,57,217,210,131,54,210,87,190,15,234,26,59,224) -IMAGE_DATA(112,52,224,112,196,105,108,245,137,70,202,137,3,168,169,61,141,226,178,60,164,156,206,193,225,168,44,236,15,203,192,94) -IMAGE_DATA(98,207,55,44,27,1,17,185,56,153,101,161,252,231,141,107,184,140,181,119,191,177,95,203,42,118,146,223,171,150,28,160) -IMAGE_DATA(159,88,27,24,56,143,33,98,236,194,16,177,214,127,30,253,157,195,18,167,181,212,247,42,177,90,101,43,172,38,102,173) -IMAGE_DATA(17,38,99,3,116,228,67,203,181,117,194,88,25,109,75,202,106,144,87,200,172,85,10,107,39,211,77,136,73,210,34,42) -IMAGE_DATA(190,20,225,209,10,103,33,17,121,8,102,59,150,143,67,228,15,15,69,21,34,144,94,7,28,57,3,255,35,217,8,137) -IMAGE_DATA(204,71,100,98,41,49,104,66,102,161,93,214,46,170,111,234,132,211,217,136,160,35,233,240,244,138,64,73,138,55,46,158) -IMAGE_DATA(219,79,46,50,146,180,235,52,253,55,197,56,59,84,142,182,214,50,88,172,122,28,140,56,131,228,51,102,153,59,58,214) -IMAGE_DATA(110,127,99,255,149,85,228,36,31,232,64,123,91,159,228,155,157,237,20,163,117,12,161,215,109,29,20,167,181,52,244,160) -IMAGE_DATA(222,213,37,254,211,233,102,205,200,154,198,254,147,249,42,117,161,168,164,26,5,164,103,185,133,78,228,209,54,187,192,137) -IMAGE_DATA(83,217,54,164,100,88,16,75,172,69,18,107,170,174,29,138,44,64,208,209,92,225,237,112,116,17,194,162,139,17,120,52) -IMAGE_DATA(15,251,66,179,176,55,36,147,44,67,246,247,4,103,192,235,96,58,42,170,154,73,195,218,136,181,38,248,31,62,5,111) -IMAGE_DATA(239,99,176,102,239,195,229,243,97,184,114,233,36,174,92,206,35,230,138,200,114,201,18,201,50,16,30,147,129,51,197,60) -IMAGE_DATA(135,115,140,181,59,161,113,253,44,163,208,65,172,216,209,88,215,137,166,186,46,52,212,118,209,126,23,90,201,103,182,52) -IMAGE_DATA(42,90,86,227,108,71,181,163,21,142,138,22,84,88,155,137,181,70,202,11,200,119,150,215,162,152,24,43,42,173,70,62) -IMAGE_DATA(49,150,157,91,129,44,178,51,249,14,209,181,211,57,118,98,205,138,19,169,70,28,63,81,142,99,113,165,98,161,164,99) -IMAGE_DATA(204,90,40,105,90,152,176,86,36,26,183,95,88,35,206,14,159,129,31,153,79,208,41,120,250,167,162,138,98,55,23,229) -IMAGE_DATA(24,142,202,38,248,134,164,195,119,119,36,106,74,15,226,202,133,56,92,185,88,72,172,85,19,82,45,100,78,224,114,62) -IMAGE_DATA(46,156,205,35,118,79,35,183,204,137,115,231,47,208,241,209,121,194,24,123,183,163,245,83,238,150,81,92,133,162,98,59) -IMAGE_DATA(241,68,241,56,241,84,93,217,130,170,138,102,210,176,118,212,85,119,208,126,139,228,157,149,54,54,98,141,204,78,251,22) -IMAGE_DATA(51,229,20,148,119,150,49,111,165,228,55,11,28,194,89,102,14,49,70,122,118,58,219,78,185,129,13,201,167,205,162,109) -IMAGE_DATA(241,41,6,68,39,146,47,77,40,23,182,66,136,45,54,230,142,45,132,180,238,64,120,142,240,182,143,98,174,61,193,167) -IMAGE_DATA(225,29,152,14,111,210,181,154,106,250,91,106,40,94,163,188,193,251,96,10,2,246,68,162,217,16,12,92,72,2,46,234) -IMAGE_DATA(137,175,30,250,111,46,19,70,93,192,37,45,134,250,74,224,79,177,27,199,111,7,194,79,35,42,169,16,89,133,22,202) -IMAGE_DATA(129,106,209,218,222,51,150,47,188,235,237,138,212,169,50,41,103,204,47,176,193,73,185,101,133,185,142,172,30,118,83,29) -IMAGE_DATA(28,182,38,137,205,42,172,141,176,153,21,179,83,206,106,179,54,17,107,45,180,109,129,153,120,211,17,111,197,28,163,145) -IMAGE_DATA(207,204,37,203,204,85,114,2,230,235,228,41,51,177,102,161,28,212,138,228,83,22,196,37,235,73,223,180,56,74,218,118) -IMAGE_DATA(152,124,169,240,70,177,25,251,212,67,110,214,124,15,41,62,116,23,113,230,19,120,138,244,45,147,180,182,19,13,164,187) -IMAGE_DATA(172,171,187,136,181,224,125,71,209,105,13,4,206,146,191,60,175,37,190,88,211,134,104,219,76,252,149,82,44,80,66,204) -IMAGE_DATA(102,96,149,103,20,102,44,63,136,233,203,3,48,115,197,1,204,89,117,16,199,226,115,71,230,37,223,236,220,252,59,207) -IMAGE_DATA(251,237,251,221,239,70,187,241,223,63,124,238,2,206,148,213,34,55,223,66,28,213,195,106,168,129,141,56,179,17,111,149) -IMAGE_DATA(92,27,35,61,179,82,190,201,57,167,133,243,1,226,205,108,82,204,72,185,129,145,182,92,231,40,34,94,243,216,135,146) -IMAGE_DATA(239,60,117,198,70,140,153,144,144,162,71,98,154,65,152,83,181,45,49,141,243,4,29,162,200,159,30,141,43,17,206,84) -IMAGE_DATA(125,11,36,159,234,79,249,35,107,154,47,177,166,104,90,26,189,159,77,249,111,151,240,86,65,127,143,79,96,26,194,252) -IMAGE_DATA(195,208,109,245,195,149,129,72,96,40,19,56,167,35,230,108,180,37,238,206,102,160,190,38,159,252,112,38,150,108,58,130) -IMAGE_DATA(233,203,2,136,183,3,152,178,104,63,166,46,218,135,108,210,183,183,115,174,222,217,118,253,239,248,207,170,7,246,246,93) -IMAGE_DATA(132,179,106,24,21,149,195,176,218,135,104,191,151,182,213,200,42,97,77,178,194,110,101,221,106,164,88,172,14,86,214,54) -IMAGE_DATA(217,111,16,61,99,206,70,24,163,156,192,104,228,250,134,187,198,65,185,65,110,1,51,102,37,61,51,35,137,248,138,79) -IMAGE_DATA(214,74,62,192,188,113,172,198,150,68,249,104,98,154,81,222,139,61,169,228,10,170,182,5,75,14,154,45,49,154,202,154) -IMAGE_DATA(79,80,58,105,88,26,66,35,115,197,151,179,153,233,111,99,31,122,212,63,4,61,22,47,114,153,7,112,165,135,120,235) -IMAGE_DATA(79,6,6,210,221,219,24,232,117,25,240,37,214,22,172,13,37,61,59,136,105,75,252,48,121,161,47,230,174,9,34,221) -IMAGE_DATA(45,131,205,86,1,187,189,18,149,142,42,56,216,156,213,168,170,170,161,252,163,149,172,11,245,245,253,168,107,24,64,109) -IMAGE_DATA(221,16,189,30,66,109,253,89,84,187,134,81,53,202,28,85,103,197,156,213,103,41,150,36,171,81,172,166,150,63,59,72) -IMAGE_DATA(251,67,98,53,181,195,242,94,109,253,48,234,234,121,30,207,217,107,214,207,26,28,186,132,198,166,115,104,106,62,75,118) -IMAGE_DATA(14,93,221,231,73,119,223,219,117,154,246,206,243,208,25,7,81,88,210,79,108,245,161,172,172,9,133,197,122,138,215,92) -IMAGE_DATA(148,63,86,192,89,209,42,113,191,194,22,113,102,86,76,137,205,26,37,54,211,115,93,131,252,165,86,91,15,173,190,1) -IMAGE_DATA(165,218,218,17,206,82,78,147,150,49,99,39,74,17,157,80,138,152,196,114,169,117,68,159,40,147,45,199,107,9,98,122) -IMAGE_DATA(177,168,132,50,137,219,148,154,7,233,90,120,46,249,79,98,140,245,140,204,235,64,42,118,6,164,32,34,182,136,98,199) -IMAGE_DATA(54,84,81,44,89,88,226,132,207,193,100,132,239,223,143,30,227,102,160,137,120,107,221,15,116,4,227,74,103,40,25,197) -IMAGE_DATA(112,221,33,200,205,73,129,79,240,41,204,241,8,38,93,115,107,218,226,253,88,181,61,2,89,217,69,200,203,47,66,65) -IMAGE_DATA(97,41,229,68,58,50,45,74,203,116,208,233,205,48,113,12,106,110,163,123,176,71,204,108,233,131,193,212,7,189,113,0) -IMAGE_DATA(90,195,0,202,245,253,114,14,117,198,126,232,77,3,48,152,7,97,178,12,194,106,27,130,205,126,213,44,214,126,122,79) -IMAGE_DATA(49,123,197,32,221,223,67,168,116,14,138,57,156,60,255,171,123,196,143,247,145,6,184,106,21,70,107,235,134,201,186,209) -IMAGE_DATA(223,215,119,11,49,229,205,244,240,246,104,100,123,199,57,148,105,7,40,182,82,88,43,41,107,38,223,103,68,90,190,19) -IMAGE_DATA(57,5,118,242,79,45,98,86,138,201,172,22,37,246,87,181,76,79,92,113,31,84,41,113,86,76,254,178,132,252,46,215) -IMAGE_DATA(209,10,138,171,145,65,185,102,90,134,25,137,41,58,68,199,23,33,42,182,16,81,241,37,194,216,113,50,102,138,89,139) -IMAGE_DATA(61,169,163,120,77,39,117,93,165,6,82,134,35,49,156,35,80,206,72,113,218,1,210,181,221,20,159,109,223,159,140,29) -IMAGE_DATA(254,41,240,10,80,88,139,78,44,35,205,105,167,235,213,74,185,173,29,94,254,73,136,216,183,19,61,90,15,192,181,17) -IMAGE_DATA(168,221,14,212,123,226,74,163,23,177,183,147,184,243,71,220,137,19,196,107,154,104,218,107,75,253,71,88,219,190,47,142) -IMAGE_DATA(226,133,18,138,79,139,133,181,226,18,173,176,86,86,174,39,141,54,19,91,77,196,86,187,48,102,50,43,198,172,105,13) -IMAGE_DATA(253,194,25,27,51,167,35,246,222,46,107,246,74,138,7,26,26,71,180,173,183,247,194,53,172,85,58,91,100,174,234,173) -IMAGE_DATA(229,47,87,112,142,215,160,56,123,201,205,240,63,123,198,235,191,183,181,181,159,67,185,110,144,114,198,126,228,23,145,174) -IMAGE_DATA(105,219,200,42,113,50,187,2,233,103,44,176,208,121,174,176,183,74,204,207,177,191,149,182,6,169,213,214,41,117,13,49) -IMAGE_DATA(151,228,1,220,47,192,241,217,25,169,215,82,44,70,57,64,124,82,57,233,89,9,162,226,138,17,73,198,181,91,230,44) -IMAGE_DATA(58,81,39,49,26,179,198,198,190,51,60,182,120,36,23,61,64,49,218,254,80,202,7,130,51,164,190,177,213,247,36,89) -IMAGE_DATA(18,60,253,146,177,147,94,159,72,211,163,166,166,19,85,148,139,158,202,182,192,203,239,4,142,237,221,128,158,226,69,128) -IMAGE_DATA(109,5,80,177,6,112,172,3,156,27,128,42,218,54,239,67,200,145,88,236,60,144,44,113,218,107,75,252,133,51,102,206) -IMAGE_DATA(47,52,153,24,43,17,93,203,203,47,70,97,81,153,112,166,213,25,97,48,208,57,32,93,215,25,218,137,39,98,204,216) -IMAGE_DATA(75,241,232,85,214,20,99,125,27,20,109,211,155,6,71,88,27,205,217,63,101,173,162,83,230,174,142,176,214,55,154,181) -IMAGE_DATA(179,228,215,111,149,53,165,127,153,125,111,103,215,5,210,204,11,164,149,202,56,176,219,198,90,219,57,210,162,254,17,211) -IMAGE_DATA(234,58,200,15,54,34,37,199,65,121,162,137,206,113,189,240,101,33,77,179,219,90,105,219,34,253,78,172,99,92,207,200) -IMAGE_DATA(201,171,144,26,90,33,105,89,142,187,126,150,158,69,185,102,186,81,98,180,19,110,223,200,190,243,24,249,189,48,242,139) -IMAGE_DATA(92,187,141,166,215,92,91,139,36,238,34,98,75,16,70,90,22,122,188,64,56,59,200,121,39,197,102,108,172,99,204,216) -IMAGE_DATA(166,221,39,176,209,231,4,182,236,77,196,214,125,73,148,87,24,81,227,234,68,29,197,81,169,89,70,120,237,139,71,148) -IMAGE_DATA(207,50,244,231,190,14,104,231,1,122,98,206,184,4,48,47,3,44,75,112,185,198,23,251,14,70,99,211,158,56,201,11) -IMAGE_DATA(94,163,88,109,42,233,218,44,202,65,185,190,155,79,140,229,229,21,146,182,149,16,107,165,40,47,55,146,223,172,33,46) -IMAGE_DATA(234,232,58,119,209,121,232,38,253,234,37,235,19,99,238,202,116,252,186,135,182,61,116,191,118,211,123,93,196,96,183,152) -IMAGE_DATA(209,220,75,188,13,140,152,217,58,32,186,104,177,42,102,181,245,17,95,189,196,91,47,177,70,230,232,129,147,182,117,13) -IMAGE_DATA(195,168,111,36,198,40,38,172,116,52,192,100,170,34,182,171,40,183,87,214,215,189,21,93,187,112,225,50,253,204,121,116) -IMAGE_DATA(117,94,64,183,155,183,166,166,54,89,251,230,118,180,214,214,115,164,75,172,103,253,40,45,239,151,115,166,211,183,35,53) -IMAGE_DATA(215,73,215,208,76,122,229,146,250,133,193,72,49,139,169,137,98,148,70,250,92,173,176,149,77,156,157,201,181,75,253,140) -IMAGE_DATA(125,102,102,174,98,105,153,22,226,140,98,126,138,251,227,147,13,162,91,49,238,62,2,238,31,96,99,190,88,223,142,16) -IMAGE_DATA(119,204,23,215,112,37,239,36,206,252,15,179,158,157,38,253,74,193,230,61,39,176,126,87,28,89,44,214,120,198,96,29) -IMAGE_DATA(237,111,164,247,210,232,62,112,145,166,185,136,183,248,212,114,236,216,27,141,104,239,133,24,206,36,214,242,167,3,133,51) -IMAGE_DATA(128,98,218,47,157,69,54,19,3,182,61,216,190,55,10,43,183,31,27,241,157,156,27,204,95,27,140,184,164,51,196,90) -IMAGE_DATA(137,232,25,199,106,90,173,145,248,168,37,94,186,68,111,42,28,125,180,223,67,186,69,92,105,251,196,152,183,82,109,55) -IMAGE_DATA(113,198,214,69,231,173,139,238,209,118,58,63,29,116,174,58,137,183,46,209,62,131,185,95,204,100,233,39,214,122,175,99) -IMAGE_DATA(173,139,88,235,166,239,239,145,120,77,226,182,42,202,207,170,57,71,235,151,53,9,121,110,61,175,225,214,214,214,250,134) -IMAGE_DATA(181,124,255,89,27,24,184,120,13,107,45,45,253,178,150,210,173,126,207,59,213,152,181,226,50,62,119,20,227,234,200,23) -IMAGE_DATA(208,125,170,211,119,35,61,223,37,125,223,249,69,78,58,151,245,116,188,94,250,54,217,95,22,20,85,35,183,208,129,51) -IMAGE_DATA(249,149,194,217,169,44,43,82,41,54,75,167,45,231,3,169,153,54,226,204,140,132,84,147,212,205,184,78,27,65,113,216) -IMAGE_DATA(49,178,136,184,18,233,95,15,59,94,52,146,111,30,224,254,206,176,44,209,51,246,157,172,103,187,14,164,137,134,173,243) -IMAGE_DATA(138,197,234,29,199,225,177,253,56,86,109,139,194,42,218,95,179,51,70,180,172,146,235,203,20,179,29,139,47,196,102,175) -IMAGE_DATA(163,56,177,115,1,206,167,205,1,78,79,1,50,94,5,178,38,2,103,200,178,39,162,173,124,15,54,120,71,97,241,198) -IMAGE_DATA(195,120,117,222,30,76,90,224,43,188,45,221,28,134,244,140,124,20,22,150,81,220,201,241,25,251,76,23,49,208,73,121) -IMAGE_DATA(0,107,83,15,189,86,182,229,164,99,197,165,189,116,175,49,103,87,89,211,234,89,243,186,228,30,29,205,154,222,212,255) -IMAGE_DATA(6,214,84,222,152,53,91,69,183,155,181,110,69,219,156,67,35,172,57,156,253,178,182,42,175,67,195,177,22,219,173,214) -IMAGE_DATA(154,7,6,56,143,237,37,78,135,68,211,170,170,154,100,221,27,94,143,233,118,52,102,141,245,76,137,57,232,188,152,40) -IMAGE_DATA(30,49,119,227,84,65,141,176,150,83,88,137,18,238,3,160,184,63,159,180,140,99,177,76,210,48,238,111,98,203,200,169) -IMAGE_DATA(64,234,105,139,196,102,201,92,191,72,37,191,153,102,20,214,226,146,141,194,217,81,210,176,35,209,197,82,171,101,95,121) -IMAGE_DATA(152,56,59,20,169,104,216,65,138,253,253,15,103,73,191,0,215,89,185,182,161,230,2,155,118,39,96,237,206,88,98,44) -IMAGE_DATA(18,203,55,71,96,249,214,99,100,145,196,91,148,104,174,201,218,64,49,117,11,249,222,28,172,219,30,134,84,175,217,184) -IMAGE_DATA(28,79,140,37,76,32,123,30,72,122,1,72,126,1,87,82,94,68,93,14,179,22,141,217,171,2,49,97,142,15,94,153) -IMAGE_DATA(187,27,83,22,238,35,189,140,164,24,160,12,69,197,229,194,89,57,105,26,155,205,214,64,12,244,210,249,232,36,158,58) -IMAGE_DATA(137,33,69,211,152,181,162,146,94,58,39,138,15,213,26,20,214,180,204,154,161,131,62,215,41,63,195,126,84,101,205,200) -IMAGE_DATA(70,126,212,200,172,93,163,107,204,90,143,252,158,74,210,78,133,181,65,97,173,210,57,32,172,93,250,23,198,163,48,167) -IMAGE_DATA(188,222,146,195,225,164,251,146,226,1,235,173,251,225,119,178,181,182,158,21,255,169,55,246,75,76,171,104,124,39,78,23) -IMAGE_DATA(186,144,66,113,87,78,65,37,114,101,44,144,67,250,152,88,187,216,71,178,241,235,52,169,253,155,70,234,180,236,43,57) -IMAGE_DATA(230,231,190,128,152,147,122,28,163,28,32,60,65,139,176,216,82,233,75,87,253,37,91,192,225,51,8,8,59,131,125,33) -IMAGE_DATA(153,216,19,116,74,252,166,248,206,3,169,226,59,55,144,191,92,227,25,45,154,182,130,24,91,182,37,130,116,72,97,46) -IMAGE_DATA(57,195,128,34,109,53,202,13,181,164,139,25,240,216,28,132,204,109,211,128,163,47,145,61,71,246,56,16,249,15,32,138) -IMAGE_DATA(44,246,25,232,146,247,73,172,198,126,115,194,28,111,210,182,221,82,91,219,19,152,40,122,166,26,51,87,84,92,38,177) -IMAGE_DATA(82,91,59,199,77,28,239,147,214,27,216,122,201,186,40,174,237,146,173,209,84,79,26,86,67,92,213,193,104,172,165,253) -IMAGE_DATA(10,122,175,146,216,114,144,142,85,211,182,131,182,29,164,101,157,116,78,59,40,63,104,34,45,163,184,183,162,133,246,27) -IMAGE_DATA(161,45,55,83,46,111,37,198,109,244,115,78,226,140,98,182,234,30,84,187,104,91,213,173,176,230,206,21,250,251,7,73) -IMAGE_DATA(163,90,201,159,182,145,47,108,67,119,119,175,251,216,205,184,185,34,159,57,119,238,44,229,181,61,194,153,186,30,206,237) -IMAGE_DATA(104,172,107,90,189,162,241,156,39,89,232,126,179,216,122,145,85,92,135,180,108,43,233,150,210,135,201,177,254,201,52,183) -IMAGE_DATA(209,126,50,233,152,218,231,196,251,204,90,188,244,53,149,137,150,113,31,192,113,98,45,138,252,104,196,73,3,194,137,185) -IMAGE_DATA(208,227,197,194,152,212,50,136,49,63,202,51,89,199,246,242,248,198,131,105,164,103,74,159,192,54,138,253,55,250,196,147) -IMAGE_DATA(255,140,145,24,109,37,249,206,229,196,217,146,141,225,88,188,225,8,22,109,8,163,24,173,12,103,10,236,200,45,174,196) -IMAGE_DATA(222,144,84,44,243,240,65,254,90,98,44,224,239,100,143,1,7,31,5,130,104,27,242,23,32,252,73,100,29,247,197,182) -IMAGE_DATA(253,137,226,55,39,206,223,131,87,220,172,133,199,230,203,181,215,25,42,36,86,227,220,160,184,164,92,184,104,239,56,139) -IMAGE_DATA(102,186,23,27,155,134,73,67,217,247,181,72,78,106,32,63,105,52,181,41,113,187,209,65,166,108,245,6,19,189,111,165) -IMAGE_DATA(56,222,10,19,197,242,38,115,43,157,215,86,210,178,54,58,167,173,20,43,213,139,85,86,146,30,219,107,137,65,139,196) -IMAGE_DATA(99,45,45,205,168,175,111,22,190,170,92,221,168,174,161,109,85,231,53,172,245,246,246,161,161,177,129,62,223,68,241,61) -IMAGE_DATA(127,190,65,214,133,123,171,26,117,229,202,155,141,123,126,247,26,223,187,58,202,169,204,22,53,31,31,160,243,57,136,51) -IMAGE_DATA(197,13,228,67,45,20,135,153,200,44,72,36,205,226,250,5,91,66,178,78,198,58,114,31,19,51,198,125,76,92,143,141) -IMAGE_DATA(163,28,128,89,59,198,241,25,251,78,178,99,201,38,50,3,142,38,233,113,56,166,4,193,162,103,228,47,15,101,136,134) -IMAGE_DATA(49,95,172,105,42,103,219,247,159,20,223,201,185,0,199,105,43,73,207,216,88,203,22,111,60,130,133,235,14,99,209,198) -IMAGE_DATA(48,36,164,149,35,237,140,9,89,196,219,14,191,4,44,152,179,10,229,11,127,5,120,254,26,240,250,45,224,77,182,251) -IMAGE_DATA(119,192,158,223,19,111,79,33,241,208,126,236,240,79,34,214,246,81,172,182,87,120,155,190,212,143,252,189,133,252,48,229) -IMAGE_DATA(67,6,171,212,213,138,138,181,228,107,106,36,94,23,63,86,203,241,250,0,234,234,41,222,50,83,62,72,122,197,204,153) -IMAGE_DATA(173,77,196,154,147,24,83,204,96,172,188,134,53,206,27,153,51,147,165,237,198,172,85,212,202,90,132,106,60,214,223,63) -IMAGE_DATA(252,6,214,248,184,26,91,41,172,53,142,176,86,85,85,253,54,234,109,183,179,93,65,107,27,251,80,138,125,41,207,50) -IMAGE_DATA(91,187,197,20,93,171,69,252,41,238,71,210,75,63,18,247,47,197,36,150,34,54,177,76,244,107,116,255,18,51,22,147) -IMAGE_DATA(168,212,98,163,18,74,37,199,60,26,71,57,38,249,205,163,164,103,71,147,136,181,68,189,212,207,14,30,201,33,159,73) -IMAGE_DATA(156,9,95,105,162,103,108,92,99,245,228,188,211,205,217,58,175,56,97,108,217,166,163,164,105,199,196,127,178,177,166,173) -IMAGE_DATA(32,238,146,78,233,200,199,27,73,123,205,164,129,209,152,51,109,14,108,179,127,2,172,249,25,176,238,23,192,6,178,205) -IMAGE_DATA(255,3,108,33,11,124,14,65,126,129,164,107,9,194,152,106,11,215,133,160,168,172,142,206,1,241,228,168,166,88,76,71) -IMAGE_DATA(241,83,53,122,251,134,209,210,54,44,231,198,89,197,125,82,3,228,191,134,40,134,171,33,134,156,196,73,43,233,94,39) -IMAGE_DATA(113,71,218,100,174,22,99,238,248,121,10,215,178,70,218,71,156,153,45,237,116,78,219,232,231,174,213,53,214,45,149,165) -IMAGE_DATA(129,1,55,107,213,196,154,139,183,93,255,132,181,170,247,24,107,228,67,233,156,234,140,28,123,116,208,253,218,69,231,165) -IMAGE_DATA(142,238,113,11,78,229,87,144,15,212,33,42,190,88,24,138,77,210,73,141,76,250,51,137,51,213,98,69,203,180,82,191) -IMAGE_DATA(96,223,25,30,93,164,212,53,120,75,58,198,185,39,251,83,117,76,36,231,2,172,99,35,140,81,108,198,53,180,29,254) -IMAGE_DATA(201,146,119,170,154,38,190,211,205,26,251,206,165,155,105,75,251,139,214,135,193,99,71,36,18,79,105,113,50,131,98,194) -IMAGE_DATA(148,82,172,217,17,142,69,47,79,64,213,148,239,3,11,254,27,88,244,67,96,233,143,128,229,100,43,200,246,189,136,61) -IMAGE_DATA(62,129,216,224,19,43,177,218,43,115,125,164,191,125,237,206,8,84,56,187,81,87,71,113,60,233,154,201,84,65,58,223) -IMAGE_DATA(41,115,102,154,154,251,73,239,122,41,190,234,37,109,163,184,221,193,113,23,105,152,201,78,218,223,40,236,152,232,92,177) -IMAGE_DATA(206,153,57,62,163,56,205,96,52,211,113,11,221,183,196,154,197,70,231,179,202,109,213,148,211,214,16,31,45,168,174,86) -IMAGE_DATA(140,115,194,74,135,139,56,110,34,205,108,166,45,189,239,106,133,171,166,77,198,127,74,31,108,13,179,213,38,214,212,212) -IMAGE_DATA(42,107,94,242,26,188,108,22,242,191,239,181,117,160,59,59,57,78,171,147,154,165,213,86,79,231,201,41,121,88,122,174) -IMAGE_DATA(13,199,136,43,174,191,242,248,178,227,210,183,84,46,245,126,238,195,60,65,126,147,141,115,0,126,143,107,178,199,212,186) -IMAGE_DATA(44,177,198,245,140,80,178,112,122,29,201,126,53,190,68,250,158,2,194,178,21,127,201,140,145,142,237,32,159,185,109,159) -IMAGE_DATA(210,39,192,249,0,179,198,154,182,122,71,52,86,83,94,32,90,182,254,176,248,207,69,20,171,49,111,107,118,70,17,227) -IMAGE_DATA(197,56,145,206,227,66,242,176,108,115,40,150,60,253,15,184,94,122,24,152,250,29,224,53,178,153,223,5,102,127,143,236) -IMAGE_DATA(219,56,239,51,30,59,60,67,164,223,243,149,121,62,110,214,124,177,251,224,73,98,169,79,180,171,162,146,199,248,246,210) -IMAGE_DATA(245,110,38,78,92,228,67,155,73,71,184,78,209,66,28,114,141,177,146,206,83,3,49,230,34,6,91,233,92,181,8,67) -IMAGE_DATA(102,11,229,2,166,10,97,208,32,62,212,162,240,102,177,210,113,7,172,116,220,106,115,144,14,86,209,119,183,145,127,108) -IMAGE_DATA(37,107,35,205,106,150,220,208,225,172,131,211,89,79,58,214,64,108,181,160,150,56,171,171,99,107,37,254,154,137,195,22) -IMAGE_DATA(212,55,180,208,177,122,52,52,212,75,124,207,214,221,221,125,91,227,252,183,211,58,58,88,203,236,162,251,86,91,181,248) -IMAGE_DATA(0,238,159,73,37,223,20,65,108,29,57,94,160,140,155,149,218,107,185,112,199,140,37,157,178,200,86,25,235,168,67,132) -IMAGE_DATA(244,49,149,72,109,86,56,139,42,144,177,142,135,69,223,138,165,214,17,124,44,15,126,20,171,249,28,76,199,46,255,84) -IMAGE_DATA(108,19,190,18,176,201,39,65,24,99,214,184,111,128,243,130,181,94,177,82,75,147,56,141,24,155,191,54,84,98,181,133) -IMAGE_DATA(196,221,58,175,227,244,251,242,136,95,30,115,148,129,197,235,2,225,241,215,71,209,248,143,175,1,47,146,141,251,6,48) -IMAGE_DATA(254,155,192,171,108,223,64,167,215,52,108,244,60,34,181,53,230,140,115,208,105,20,183,5,30,61,67,185,98,159,228,67) -IMAGE_DATA(117,245,67,162,95,102,139,67,106,186,133,69,229,18,187,21,20,41,245,144,146,82,61,241,82,79,156,177,63,108,161,109) -IMAGE_DATA(163,124,86,24,51,218,101,171,196,107,87,181,205,98,173,84,120,187,134,181,54,55,107,45,196,90,157,194,90,21,179,214) -IMAGE_DATA(232,102,173,245,58,214,154,133,53,167,179,134,114,136,150,183,48,198,238,206,109,157,157,93,114,78,236,21,164,107,60,142) -IMAGE_DATA(155,238,91,62,47,233,185,22,28,225,113,217,199,114,197,247,177,111,148,90,63,249,203,88,138,245,37,31,32,31,202,172) -IMAGE_DATA(29,39,254,88,195,120,12,208,53,227,106,143,43,99,29,249,253,32,50,238,71,151,49,104,228,59,119,236,103,159,73,58) -IMAGE_DATA(70,92,177,207,228,190,129,141,196,220,198,221,241,238,28,52,150,124,229,113,172,216,22,41,122,54,111,245,33,177,185,30) -IMAGE_DATA(193,228,51,143,201,252,168,208,200,44,242,199,73,152,239,225,135,13,127,248,21,58,254,252,37,92,249,251,151,129,39,190) -IMAGE_DATA(2,60,245,32,240,204,87,129,103,31,68,211,182,89,88,189,61,28,179,86,30,196,248,217,187,40,86,219,141,89,43,2) -IMAGE_DATA(72,27,243,229,255,174,174,233,19,109,42,38,158,56,23,101,182,242,11,74,145,151,95,34,188,153,40,39,224,254,42,102) -IMAGE_DATA(164,194,209,40,53,13,174,111,176,223,85,234,21,196,154,81,97,205,68,172,153,136,53,179,217,38,231,149,57,179,218,156) -IMAGE_DATA(116,78,171,137,175,54,241,145,174,218,118,97,205,225,80,88,171,34,214,170,133,181,86,183,174,181,11,107,204,25,91,131) -IMAGE_DATA(155,53,174,149,189,151,124,230,245,173,189,163,147,206,27,157,27,11,197,189,214,14,169,53,90,43,58,40,94,115,82,222) -IMAGE_DATA(88,76,121,99,182,212,96,195,121,254,9,197,246,225,113,37,148,99,150,73,44,23,67,254,51,138,56,99,221,10,116,215) -IMAGE_DATA(252,57,30,227,125,102,139,199,3,5,71,40,181,52,62,198,181,52,142,213,118,82,124,182,239,96,50,130,2,19,177,221) -IMAGE_DATA(215,173,99,59,99,196,119,10,103,187,20,77,99,227,56,141,25,155,179,42,24,179,87,6,201,24,141,53,59,34,16,120) -IMAGE_DATA(36,141,56,206,196,78,255,120,204,92,186,11,91,127,241,125,244,253,230,11,192,239,191,8,252,225,1,224,209,255,7,60) -IMAGE_DATA(70,246,215,47,193,190,105,33,249,227,8,76,94,184,23,47,207,242,194,148,133,190,88,188,62,24,233,25,69,40,47,55) -IMAGE_DATA(208,255,94,1,173,206,132,114,157,82,203,229,125,206,73,115,242,138,145,75,204,149,235,152,41,167,140,127,97,6,115,233) -IMAGE_DATA(125,222,50,151,60,238,168,180,204,64,190,64,49,238,175,231,159,215,233,77,50,70,132,235,195,252,92,54,163,201,38,188) -IMAGE_DATA(217,217,42,232,126,182,85,141,188,111,50,87,136,47,182,210,123,124,159,219,43,170,37,150,115,86,213,202,51,236,93,174) -IMAGE_DATA(58,25,87,119,43,172,157,59,119,30,61,61,125,226,183,184,255,243,78,96,180,181,181,157,206,175,193,205,27,253,191,148) -IMAGE_DATA(31,89,236,93,56,157,95,139,67,28,95,29,206,144,26,44,251,69,30,83,198,53,255,112,202,47,195,227,20,59,66,90) -IMAGE_DATA(39,227,180,143,40,53,179,253,135,148,62,128,0,122,205,227,105,15,132,103,203,156,59,30,179,189,47,52,83,198,111,115) -IMAGE_DATA(190,25,122,40,25,135,130,79,192,215,255,132,232,25,115,198,249,192,90,175,24,209,51,174,167,45,166,156,96,254,154,80) -IMAGE_DATA(210,178,16,225,108,198,210,0,233,55,95,189,45,28,1,161,41,8,10,79,39,125,140,197,180,5,219,225,253,189,175,97) -IMAGE_DATA(248,199,159,5,126,70,246,139,207,1,191,252,47,224,145,207,19,119,95,70,246,186,21,88,239,125,92,88,83,99,181,149) -IMAGE_DATA(91,15,163,176,132,252,98,133,147,174,107,181,196,94,22,202,51,77,102,187,140,89,99,142,216,151,22,20,150,73,191,130) -IMAGE_DATA(170,115,5,238,253,171,172,93,173,3,51,107,42,171,138,25,221,204,89,228,252,94,213,184,42,217,215,233,45,163,120,179) -IMAGE_DATA(143,232,160,205,238,148,124,216,89,229,146,103,162,178,217,237,21,35,207,101,187,89,227,122,28,251,170,182,182,14,202,83) -IMAGE_DATA(57,207,233,148,159,187,93,253,82,163,27,255,61,124,110,249,60,241,249,168,160,120,213,94,233,66,102,129,3,161,196,212) -IMAGE_DATA(129,176,44,225,75,157,67,119,88,198,49,22,138,5,71,230,147,126,229,19,143,228,27,131,51,176,135,226,176,61,20,247) -IMAGE_DATA(171,53,51,246,151,74,223,19,25,197,105,74,237,54,67,198,107,239,13,76,133,223,193,68,108,115,231,158,27,188,137,53) -IMAGE_DATA(174,221,146,190,121,120,42,122,182,96,237,97,133,51,210,180,233,75,252,49,109,209,126,138,179,252,176,114,203,97,250,249) -IMAGE_DATA(19,164,161,169,164,139,49,152,50,103,3,14,124,253,1,92,124,248,83,192,119,200,190,119,63,240,131,251,113,229,135,159) -IMAGE_DATA(6,126,243,85,36,174,242,32,134,163,164,111,234,85,98,109,10,49,183,201,39,18,90,226,192,78,172,89,172,21,114,173) -IMAGE_DATA(249,26,243,117,215,234,204,226,59,85,13,99,198,242,10,202,144,87,88,78,198,236,149,139,169,124,41,99,43,21,238,84) -IMAGE_DATA(214,248,156,170,246,78,177,246,86,106,28,124,252,122,214,90,90,90,101,157,253,219,173,109,109,237,29,40,163,243,163,167) -IMAGE_DATA(115,97,147,243,94,169,228,161,217,70,98,173,68,88,11,21,214,138,165,94,198,126,53,136,251,203,201,79,250,241,184,236) -IMAGE_DATA(160,211,194,151,79,64,10,118,81,78,185,115,95,146,152,231,254,36,202,53,211,148,190,167,144,211,110,230,50,221,117,220) -IMAGE_DATA(76,25,103,203,249,167,90,231,224,92,128,53,109,53,113,166,176,22,129,5,235,66,197,127,206,90,17,136,215,136,177,41) -IMAGE_DATA(11,124,49,121,193,94,172,164,188,211,219,63,134,180,141,114,88,98,109,210,244,149,136,120,224,211,184,242,229,143,3,15) -IMAGE_DATA(222,7,60,244,9,224,235,100,223,248,36,177,246,48,194,151,111,192,138,173,225,120,97,198,14,241,161,175,82,46,186,43) -IMAGE_DATA(32,14,165,229,172,57,20,103,81,172,229,168,106,128,193,228,36,134,180,56,147,91,140,204,236,66,100,229,20,226,76,78) -IMAGE_DATA(49,189,46,66,118,94,9,114,243,137,61,98,174,160,136,52,175,88,71,126,86,39,190,86,53,97,173,220,56,138,55,147) -IMAGE_DATA(196,112,236,75,153,181,171,121,130,114,158,153,233,209,62,118,52,107,246,10,101,12,186,179,234,214,88,227,198,181,56,149) -IMAGE_DATA(53,142,145,184,30,199,99,69,70,143,49,191,29,141,235,73,90,189,197,93,55,114,200,255,86,83,219,128,204,124,179,172) -IMAGE_DATA(197,18,64,172,113,157,44,148,53,141,56,227,109,208,177,2,101,158,38,215,45,246,39,194,203,63,153,242,202,100,108,223) -IMAGE_DATA(19,143,109,20,219,111,247,101,189,58,1,79,63,30,71,155,38,121,167,119,16,105,93,240,41,236,35,238,246,133,112,125) -IMAGE_DATA(45,85,250,215,57,247,84,227,179,213,59,163,201,127,70,73,62,176,68,213,181,213,33,152,185,252,128,104,26,179,54,145) -IMAGE_DATA(114,200,149,91,152,181,88,248,133,36,98,243,238,227,120,229,149,121,72,252,244,199,128,207,221,11,252,215,71,129,207,147) -IMAGE_DATA(125,241,99,184,242,0,189,247,187,31,97,247,178,173,88,68,241,217,179,83,183,226,69,226,109,2,229,7,129,225,105,200) -IMAGE_DATA(201,47,35,222,44,180,45,21,182,206,228,150,8,75,37,60,118,205,194,227,91,108,228,103,141,40,46,51,161,168,148,238) -IMAGE_DATA(71,138,171,172,20,75,153,136,25,35,229,160,54,210,255,10,138,169,42,40,110,175,112,82,236,65,124,88,73,143,108,20) -IMAGE_DATA(107,89,201,76,20,127,153,72,195,204,244,51,86,250,108,13,197,248,181,141,45,168,35,171,165,125,87,109,19,92,20,251) -IMAGE_DATA(215,52,52,195,78,159,47,45,45,35,254,244,208,145,217,43,28,104,106,37,77,106,235,68,107,123,23,125,182,238,45,179) -IMAGE_DATA(198,241,89,91,91,59,229,25,117,48,24,140,242,156,16,126,70,248,237,102,173,189,157,199,190,216,96,160,88,173,92,111) -IMAGE_DATA(117,159,91,35,226,82,138,112,128,226,123,95,226,130,117,45,132,231,106,138,223,44,36,77,203,21,157,226,90,44,51,198) -IMAGE_DATA(172,121,146,166,177,113,172,207,126,145,53,75,53,102,138,231,9,200,231,121,190,0,215,213,252,148,218,45,231,2,236,59) -IMAGE_DATA(153,175,149,219,163,176,116,211,81,137,211,22,110,8,83,52,141,226,52,30,59,59,117,161,210,183,196,125,152,43,183,132) -IMAGE_DATA(96,199,222,72,98,61,142,114,138,112,188,252,204,100,156,249,232,221,192,125,247,0,159,32,251,228,71,128,251,217,238,193) -IMAGE_DATA(149,63,254,10,155,151,237,196,252,213,129,120,102,202,86,60,63,109,27,241,234,131,19,233,133,196,7,93,11,75,61,197) -IMAGE_DATA(105,181,164,107,181,104,235,232,64,99,75,23,106,234,219,96,166,247,10,75,12,40,160,243,81,110,160,188,147,242,80,39) -IMAGE_DATA(215,198,106,41,95,172,87,24,169,107,106,65,21,189,174,170,105,112,179,166,112,102,35,246,216,204,194,153,75,88,179,57) -IMAGE_DATA(106,232,243,173,98,245,205,109,178,101,222,234,26,249,189,54,249,253,213,85,213,226,255,120,222,65,43,233,82,51,93,155) -IMAGE_DATA(54,182,142,110,212,212,213,191,229,220,64,198,227,118,117,201,51,191,185,239,129,247,239,132,252,160,181,173,11,101,134,10) -IMAGE_DATA(177,18,173,21,5,165,102,228,151,152,144,112,170,12,251,40,214,247,161,184,42,144,215,62,32,59,120,52,15,254,196,153) -IMAGE_DATA(159,204,161,203,146,249,192,187,72,183,188,14,164,83,110,201,28,165,203,62,215,51,182,201,88,90,165,110,182,133,246,153) -IMAGE_DATA(183,237,251,221,124,237,86,106,182,106,206,201,53,91,53,231,228,92,96,14,105,153,212,55,214,48,107,129,152,206,115,3) -IMAGE_DATA(136,49,54,30,167,177,122,107,8,54,123,31,193,182,61,199,224,177,61,12,175,252,229,121,104,63,244,33,92,249,240,135) -IMAGE_DATA(129,123,216,136,187,123,239,198,149,123,63,140,193,191,62,134,245,107,253,233,123,14,224,233,41,91,240,244,228,205,120,109) -IMAGE_DATA(137,47,202,77,149,164,25,109,104,235,234,20,253,232,234,233,69,123,39,235,72,59,154,41,95,106,163,253,198,150,54,58) -IMAGE_DATA(214,142,234,186,102,89,179,169,148,206,81,185,145,124,31,253,172,158,116,141,181,170,138,124,64,117,93,163,108,153,47,59) -IMAGE_DATA(49,103,103,214,136,45,19,229,156,102,187,75,120,179,81,28,172,112,117,149,181,154,17,214,90,225,172,174,27,169,159,49) -IMAGE_DATA(19,189,253,131,104,33,206,90,137,51,182,218,91,96,141,27,231,2,252,28,46,238,111,189,221,140,169,173,187,111,0,182) -IMAGE_DATA(154,102,49,71,67,27,236,181,45,112,54,180,226,84,129,21,123,14,157,150,185,112,254,225,196,216,81,210,178,176,28,248) -IMAGE_DATA(134,102,99,119,112,38,188,3,79,99,119,16,207,161,59,45,175,119,147,111,228,125,54,158,47,188,131,252,39,215,101,55) -IMAGE_DATA(120,199,75,158,201,99,184,55,112,190,201,227,132,40,54,91,179,83,97,140,181,108,229,118,165,111,157,231,210,205,94,29) -IMAGE_DATA(140,215,151,7,98,182,71,48,230,49,107,171,130,70,230,162,240,24,141,233,203,252,225,177,37,8,27,60,67,177,121,87) -IMAGE_DATA(56,150,111,10,198,171,143,60,6,243,7,62,140,75,100,151,63,200,246,33,217,94,249,224,7,209,246,228,83,88,191,53) -IMAGE_DATA(20,51,150,249,225,57,210,52,102,109,201,166,16,88,171,27,81,221,212,129,170,198,54,184,154,219,81,79,177,68,61,221) -IMAGE_DATA(119,174,230,78,184,154,120,159,24,236,232,66,3,189,223,200,199,152,57,226,162,154,206,77,13,111,73,215,70,172,174,73) -IMAGE_DATA(244,205,94,85,123,141,49,99,22,98,205,66,91,251,40,93,83,173,86,124,170,178,95,229,82,88,99,63,199,188,245,245) -IMAGE_DATA(15,136,174,177,181,136,15,173,71,75,107,139,172,37,199,235,222,220,41,252,220,74,235,166,255,201,65,62,193,65,231,171) -IMAGE_DATA(146,172,130,238,81,222,102,22,91,137,25,246,119,73,10,99,135,206,96,79,8,249,77,226,139,53,140,141,247,119,135,80) -IMAGE_DATA(126,64,241,254,222,80,101,94,250,110,138,201,84,157,219,42,99,131,120,12,119,188,82,211,144,28,83,225,139,117,76,237) -IMAGE_DATA(79,95,178,41,92,250,212,185,78,203,172,177,150,205,33,198,230,175,85,88,155,181,42,80,230,216,177,166,49,115,43,55) -IMAGE_DATA(29,192,218,237,33,216,228,117,4,75,55,28,196,196,255,254,21,44,119,221,131,225,187,62,130,179,180,61,247,129,123,112) -IMAGE_DATA(158,236,194,7,239,70,253,115,227,176,126,103,4,166,46,218,131,151,102,238,160,120,109,59,253,79,113,244,63,55,19,103) -IMAGE_DATA(116,95,49,55,77,108,45,138,209,123,85,77,202,177,42,138,163,170,26,154,220,231,167,17,21,228,43,237,174,122,49,27) -IMAGE_DATA(199,105,110,166,88,207,172,92,55,225,120,205,29,155,177,63,53,83,206,201,102,177,43,113,156,170,129,108,46,117,75,223) -IMAGE_DATA(205,62,89,222,39,94,107,233,119,114,60,215,192,254,153,124,170,201,204,125,16,102,84,58,156,104,34,61,108,229,248,141) -IMAGE_DATA(140,107,103,183,59,254,186,213,198,241,90,185,129,242,124,202,199,180,70,155,123,223,134,228,140,18,108,221,159,64,241,125) -IMAGE_DATA(146,48,198,58,198,198,235,3,237,240,75,21,221,242,58,112,74,222,243,9,86,244,108,79,136,178,214,6,207,123,226,122) -IMAGE_DATA(45,199,100,236,47,215,146,150,121,184,253,36,235,23,243,197,241,153,50,110,227,8,22,174,15,147,190,39,137,207,136,45) -IMAGE_DATA(158,191,41,126,116,77,8,109,73,231,136,189,215,150,6,144,249,137,45,223,224,143,181,219,130,176,158,180,109,33,249,199) -IMAGE_DATA(105,223,250,49,172,154,143,161,135,172,79,243,81,244,147,13,104,238,197,224,221,31,131,118,226,235,196,251,113,202,95,119) -IMAGE_DATA(99,194,28,47,76,154,239,131,67,199,78,209,245,119,18,23,110,54,200,56,54,175,172,82,234,61,204,133,108,233,184,217) -IMAGE_DATA(238,144,207,114,62,160,231,126,79,138,107,121,159,141,57,82,190,163,74,120,146,215,149,85,98,204,157,250,25,229,253,106) -IMAGE_DATA(137,235,70,243,166,238,187,84,214,70,241,199,245,91,30,219,198,253,158,108,92,47,224,231,14,182,180,178,117,160,190,161) -IMAGE_DATA(241,61,247,140,111,53,15,229,241,91,90,178,50,202,195,217,146,79,23,147,207,139,38,109,58,65,250,198,181,254,116,138) -IMAGE_DATA(183,120,78,19,199,92,220,143,201,49,88,138,104,216,174,131,167,196,188,3,149,245,131,182,19,99,91,247,81,142,73,177) -IMAGE_DATA(217,122,138,201,86,239,84,98,127,117,172,198,146,141,71,221,122,118,53,215,100,190,84,127,41,107,109,144,142,41,243,157) -IMAGE_DATA(252,69,203,216,166,45,217,47,253,152,139,214,236,133,199,230,0,172,217,70,60,174,220,139,249,95,249,30,177,246,41,180) -IMAGE_DATA(145,117,104,62,137,78,178,46,205,125,232,249,232,103,144,62,125,9,214,121,71,137,166,141,159,237,69,249,236,30,196,158) -IMAGE_DATA(204,189,166,255,200,108,85,234,12,54,225,134,184,224,154,4,29,51,82,222,201,166,167,28,93,103,84,238,65,222,55,88) -IMAGE_DATA(152,185,10,69,179,220,188,170,172,89,42,156,239,8,107,14,167,75,226,51,181,255,115,96,112,240,26,214,170,171,93,183) -IMAGE_DATA(117,60,247,219,105,92,135,81,235,60,60,150,72,75,185,40,179,151,114,186,8,171,119,68,96,211,158,4,89,27,116,27) -IMAGE_DATA(233,216,182,125,138,109,218,163,176,198,204,109,35,166,182,251,41,204,241,118,227,30,230,43,65,108,173,59,54,91,181,93) -IMAGE_DATA(137,251,185,15,125,225,186,48,44,88,119,24,11,72,199,152,51,142,201,230,184,235,181,50,111,147,244,107,202,162,125,164) -IMAGE_DATA(67,190,138,81,62,192,249,39,207,69,225,249,79,172,79,179,150,238,196,162,213,123,177,108,35,241,184,104,7,22,124,246) -IMAGE_DATA(107,176,105,254,11,245,154,207,161,129,172,73,243,89,52,223,245,25,116,124,246,33,196,205,242,192,138,173,71,40,78,219) -IMAGE_DATA(130,231,95,219,134,89,203,247,35,45,179,88,254,87,3,241,99,96,118,200,184,159,138,249,226,45,247,159,240,123,229,116) -IMAGE_DATA(94,216,248,124,112,142,206,188,25,136,61,149,53,11,105,158,112,105,119,186,153,114,8,107,138,93,199,90,133,219,135,142) -IMAGE_DATA(98,141,247,93,170,142,185,125,40,111,107,200,191,51,107,45,196,26,199,248,236,43,249,121,168,236,67,155,137,183,230,22) -IMAGE_DATA(98,205,85,35,53,16,245,248,123,161,79,158,181,89,173,115,171,125,201,172,113,169,116,61,22,111,8,193,122,239,24,226) -IMAGE_DATA(44,21,219,72,195,118,248,167,201,118,51,235,154,239,73,225,106,3,207,219,220,147,40,58,198,91,214,48,181,47,243,170) -IMAGE_DATA(223,140,148,90,6,235,153,228,153,236,39,137,45,238,19,96,77,155,237,214,52,214,49,158,179,57,121,62,215,209,148,241) -IMAGE_DATA(140,60,38,131,251,149,184,207,156,183,175,144,31,156,54,111,11,102,18,99,243,86,249,226,149,25,235,176,248,190,7,97) -IMAGE_DATA(209,124,25,149,154,47,193,169,121,0,213,154,47,194,165,249,2,154,31,250,9,14,204,219,68,126,54,24,79,188,178,30) -IMAGE_DATA(79,78,220,128,5,107,14,34,175,80,59,114,127,41,255,179,82,75,101,147,123,142,216,226,227,220,207,169,90,73,153,17) -IMAGE_DATA(101,82,167,53,141,216,232,190,1,233,79,229,26,174,250,158,251,123,184,70,174,214,106,213,58,173,106,35,181,91,155,115) -IMAGE_DATA(164,175,128,251,65,29,206,26,177,106,242,163,181,196,99,29,241,215,208,216,36,227,35,77,38,147,140,95,171,168,168,68) -IMAGE_DATA(3,197,146,202,28,132,86,209,12,206,57,239,228,166,232,218,85,214,248,94,215,147,165,101,20,19,11,1,88,187,243,184) -IMAGE_DATA(176,182,157,56,219,74,156,177,109,33,174,54,17,111,170,118,113,205,127,29,229,155,18,151,237,80,98,127,37,30,163,216) -IMAGE_DATA(108,179,226,43,57,46,99,29,99,77,155,199,188,185,99,50,149,51,142,201,166,201,92,116,63,209,48,102,108,252,172,93) -IMAGE_DATA(24,247,250,78,169,245,143,123,125,151,212,97,95,122,109,43,94,126,205,3,175,206,92,143,25,139,189,241,226,196,101,88) -IMAGE_DATA(113,239,131,208,105,190,14,163,230,107,48,107,30,34,238,30,36,159,250,21,212,125,255,143,216,58,111,43,102,44,241,197) -IMAGE_DATA(95,199,173,198,223,199,175,35,173,14,147,241,28,204,133,194,137,197,253,127,43,204,93,229,198,36,227,136,184,111,160,68) -IMAGE_DATA(198,127,232,133,181,209,166,246,123,170,115,175,148,190,119,211,53,125,84,10,207,22,119,191,128,195,237,183,21,19,45,101) -IMAGE_DATA(222,220,239,115,95,193,104,222,164,223,189,166,142,172,30,78,202,19,26,41,70,227,90,25,199,111,173,173,109,196,95,51) -IMAGE_DATA(197,116,205,194,90,93,93,195,29,63,118,146,251,49,148,243,99,145,57,61,6,238,179,161,237,169,172,18,204,92,190,143) -IMAGE_DATA(252,95,164,194,154,95,26,241,150,42,172,109,218,123,146,244,46,129,252,163,194,22,251,72,54,15,79,142,203,162,164,127) -IMAGE_DATA(137,249,90,186,153,199,158,133,83,220,127,196,109,236,63,195,48,159,252,39,215,206,230,172,62,36,188,49,107,51,150,93) -IMAGE_DATA(93,247,64,245,161,172,99,47,11,111,94,194,217,179,147,55,227,153,73,235,240,194,196,229,24,55,213,3,83,230,237,192) -IMAGE_DATA(211,47,206,193,154,15,63,132,34,205,119,81,172,249,54,74,52,15,163,76,243,45,104,137,189,170,95,62,131,213,243,61) -IMAGE_DATA(73,39,119,225,175,47,173,194,147,175,110,128,231,254,232,17,93,18,109,211,91,71,180,77,153,179,167,28,99,45,83,250) -IMAGE_DATA(160,116,210,55,90,90,202,250,166,48,166,140,235,184,218,23,117,99,214,76,55,96,237,106,31,212,173,176,198,227,36,43) -IMAGE_DATA(43,29,215,212,215,122,123,251,133,51,54,214,182,234,106,101,124,219,157,204,26,247,101,240,57,215,185,231,142,41,172,85) -IMAGE_DATA(32,227,76,41,102,46,243,165,88,231,168,248,75,102,140,99,54,85,211,216,95,114,141,204,99,135,194,23,251,201,21,98) -IMAGE_DATA(81,162,103,106,14,192,90,54,127,205,97,37,215,220,160,196,106,243,214,30,18,109,155,187,38,152,116,141,53,237,160,204) -IMAGE_DATA(51,121,141,98,255,41,11,247,16,103,62,228,67,119,97,194,108,79,140,155,177,29,207,77,221,132,103,94,93,131,39,39) -IMAGE_DATA(172,194,83,19,150,227,217,9,75,240,226,148,85,152,182,208,11,143,63,57,21,235,63,240,13,100,221,245,19,100,105,126) -IMAGE_DATA(136,108,205,127,35,87,243,3,228,19,123,150,71,167,96,249,210,61,148,67,28,130,199,150,16,108,242,142,128,111,72,18) -IMAGE_DATA(162,19,115,145,145,93,70,250,102,84,98,54,142,249,69,211,20,223,57,154,53,230,172,164,212,32,198,172,137,63,45,213) -IMAGE_DATA(203,86,97,76,245,169,111,69,215,174,230,35,188,229,254,118,225,205,61,118,247,122,214,170,170,107,71,120,171,168,116,10) -IMAGE_DATA(75,23,46,92,84,158,29,210,211,135,6,138,243,216,143,50,111,156,43,220,233,172,41,186,102,22,51,26,43,233,252,216) -IMAGE_DATA(40,30,182,35,59,79,79,49,86,8,54,238,230,245,86,210,165,86,203,117,52,63,94,3,225,104,14,109,179,233,189,12) -IMAGE_DATA(233,231,244,14,74,163,60,52,149,242,208,20,248,4,41,219,157,254,220,167,126,28,235,119,29,195,70,239,72,108,216,117) -IMAGE_DATA(20,235,189,142,98,245,246,195,88,190,41,16,203,54,28,192,146,245,254,152,239,225,139,89,203,188,49,99,145,39,233,212) -IMAGE_DATA(86,76,154,189,25,175,190,190,1,227,166,173,198,243,147,86,136,61,243,202,82,60,61,126,17,237,47,199,75,164,103,19) -IMAGE_DATA(102,174,195,228,57,155,49,123,165,47,30,255,191,9,216,168,249,30,146,53,191,194,73,205,255,32,69,243,115,164,105,126) -IMAGE_DATA(138,83,119,253,24,165,79,44,192,156,37,123,232,119,30,145,254,133,53,158,71,165,254,177,117,31,253,79,254,9,56,121) -IMAGE_DATA(170,228,170,15,229,123,204,205,155,202,83,89,153,73,225,139,56,211,106,89,243,204,178,45,43,55,187,95,95,27,191,241) -IMAGE_DATA(216,44,101,28,145,194,153,112,108,180,141,140,81,83,199,120,176,153,40,247,40,45,45,165,251,218,0,189,78,79,175,173) -IMAGE_DATA(196,24,199,105,181,228,47,235,136,191,10,148,151,151,211,223,101,16,179,217,43,196,79,170,108,53,53,241,248,73,158,43) -IMAGE_DATA(104,26,153,127,112,167,231,165,28,175,233,116,118,25,11,200,254,132,235,1,39,50,140,72,201,177,34,37,215,142,212,252) -IMAGE_DATA(10,164,228,81,252,70,219,51,165,78,228,105,107,144,85,82,45,239,39,102,89,16,119,202,128,232,84,45,142,37,22,35) -IMAGE_DATA(50,169,4,17,137,133,8,141,201,197,129,163,60,182,35,5,190,135,146,105,155,140,125,135,78,98,111,112,34,118,7,38) -IMAGE_DATA(192,251,64,156,216,158,160,4,178,19,240,62,24,239,126,47,158,142,159,128,143,124,38,65,106,174,158,100,219,246,70,99) -IMAGE_DATA(203,158,227,148,247,198,144,197,82,14,28,141,117,94,145,164,145,65,248,219,239,159,199,38,98,235,184,230,15,100,191,67) -IMAGE_DATA(140,230,55,136,215,252,26,9,31,252,21,50,94,240,192,107,139,247,146,102,42,181,18,214,206,89,43,3,72,83,3,177) -IMAGE_DATA(98,75,24,210,41,78,224,249,79,60,15,138,199,123,104,133,37,147,240,166,211,89,133,55,45,109,101,191,196,32,251,229) -IMAGE_DATA(90,54,210,63,217,154,71,116,144,77,213,53,213,127,114,12,168,176,102,127,3,107,204,82,117,117,53,233,83,15,249,195) -IMAGE_DATA(94,52,18,59,149,142,218,17,214,172,182,74,153,103,197,177,25,127,134,227,179,90,98,173,174,190,81,120,99,29,227,177) -IMAGE_DATA(27,252,179,108,92,107,187,93,107,194,188,213,198,125,187,6,225,204,38,188,133,31,231,190,167,36,36,103,91,136,55,11) -IMAGE_DATA(82,115,173,178,77,203,179,34,171,184,18,133,58,23,10,200,242,203,171,145,87,238,68,78,169,3,103,138,200,231,22,218) -IMAGE_DATA(144,81,96,69,122,174,25,201,89,6,196,165,150,34,46,173,20,49,41,37,136,74,42,198,241,147,37,196,99,33,142,198) -IMAGE_DATA(231,35,44,54,15,161,209,185,8,138,60,131,192,136,44,226,146,215,146,39,237,12,74,193,174,192,100,210,209,36,236,240) -IMAGE_DATA(59,65,250,19,79,113,97,20,229,30,145,98,30,158,199,200,103,71,80,238,113,148,226,195,163,88,184,46,16,127,253,197) -IMAGE_DATA(19,164,107,191,69,176,230,47,8,213,60,134,48,205,163,8,215,252,9,199,238,121,20,81,19,55,227,245,21,1,210,23) -IMAGE_DATA(202,54,119,117,32,229,59,129,244,115,193,162,183,197,101,236,63,43,96,36,99,93,99,93,231,177,224,60,54,136,253,103) -IMAGE_DATA(153,196,103,22,241,159,229,164,101,58,29,107,141,85,238,77,214,54,102,77,177,209,186,246,22,89,179,86,8,43,106,173) -IMAGE_DATA(162,179,171,231,26,214,108,118,199,53,99,35,121,156,208,104,214,56,15,189,211,117,236,250,198,253,6,114,14,181,202,121) -IMAGE_DATA(63,22,155,129,149,91,130,16,157,148,143,248,212,18,36,16,47,9,167,202,145,72,150,156,105,64,106,142,25,233,249,86) -IMAGE_DATA(226,203,142,220,146,74,177,172,66,187,48,150,152,161,67,108,90,25,142,39,19,95,39,89,231,138,16,113,162,0,71,226) -IMAGE_DATA(242,132,47,133,177,28,4,71,157,81,56,59,118,70,56,11,8,207,128,255,145,211,216,123,136,251,189,136,181,0,174,219) -IMAGE_DATA(197,99,51,105,24,179,182,110,87,148,212,149,215,238,138,20,214,152,185,53,59,143,97,225,218,3,120,236,251,127,193,90) -IMAGE_DATA(205,159,225,171,121,18,251,53,79,32,64,243,56,14,106,254,134,67,31,127,18,65,211,189,40,30,60,40,140,205,95,19) -IMAGE_DATA(132,69,235,67,132,51,54,207,253,113,196,1,93,119,91,189,204,187,83,227,85,206,145,152,17,171,181,90,230,24,243,107) -IMAGE_DATA(214,48,190,31,21,206,232,51,90,183,185,53,239,170,182,169,62,84,241,163,28,7,94,235,67,175,142,241,230,181,53,120) -IMAGE_DATA(109,191,179,103,207,201,120,237,246,182,46,55,107,202,92,23,59,125,174,185,185,133,180,234,2,46,156,191,72,250,214,67) -IMAGE_DATA(58,71,121,66,109,189,248,210,202,202,202,59,62,239,188,190,181,183,119,211,57,52,201,185,230,181,41,98,72,123,150,109) -IMAGE_DATA(60,136,136,184,108,196,156,44,66,28,233,82,44,105,84,2,49,148,116,90,135,147,204,91,174,9,217,197,21,200,43,173) -IMAGE_DATA(68,14,109,51,136,189,148,51,70,36,156,214,18,107,165,194,217,85,214,10,137,181,92,226,44,87,88,59,236,230,45,240) -IMAGE_DATA(88,150,240,22,20,153,37,251,129,199,50,177,255,176,162,109,94,254,137,194,218,166,61,49,194,154,202,27,155,170,109,171) -IMAGE_DATA(105,59,151,226,181,63,127,253,207,88,169,121,10,219,53,47,194,83,243,60,188,52,207,194,71,243,12,14,124,118,2,118) -IMAGE_DATA(207,242,17,29,155,191,54,72,106,133,108,204,217,124,242,161,1,97,233,50,87,221,104,114,136,15,229,53,18,120,93,4) -IMAGE_DATA(169,155,17,95,28,171,73,110,110,168,148,117,59,140,70,158,111,236,130,158,182,229,58,138,107,13,85,116,206,236,162,113) -IMAGE_DATA(170,177,15,214,185,243,90,69,39,157,226,163,121,45,6,139,69,153,103,192,198,113,25,143,127,174,172,36,182,28,245,194) -IMAGE_DATA(150,204,219,171,98,223,200,214,12,151,171,137,114,2,94,87,168,89,230,185,52,112,223,173,211,233,174,175,153,100,109,43) -IMAGE_DATA(30,107,59,186,113,191,252,240,240,185,59,182,159,180,173,173,155,206,145,75,137,215,232,220,36,164,20,82,46,121,136,252) -IMAGE_DATA(30,233,90,26,251,193,50,196,167,151,201,220,95,158,143,201,188,165,101,155,144,89,96,19,222,88,223,120,206,85,82,166) -IMAGE_DATA(94,142,197,211,231,88,215,142,38,228,139,166,241,54,60,62,143,44,95,76,120,163,120,142,181,141,45,68,140,184,35,222) -IMAGE_DATA(252,14,159,194,158,224,20,138,209,78,96,219,126,69,215,54,238,142,22,198,86,239,140,196,26,175,40,209,51,54,158,171) -IMAGE_DATA(50,99,177,23,30,253,210,159,177,88,51,142,180,237,85,172,215,112,158,48,30,155,53,47,195,255,171,115,177,97,246,110) -IMAGE_DATA(98,237,32,22,185,181,108,30,105,27,235,219,2,98,239,88,124,182,204,3,101,6,120,78,20,115,197,156,24,105,159,231) -IMAGE_DATA(22,51,55,37,148,167,154,205,46,209,123,206,205,217,143,150,145,182,233,245,149,116,220,46,218,198,239,243,107,97,205,253) -IMAGE_DATA(29,10,107,182,107,88,227,245,25,236,118,23,49,162,112,198,91,153,31,170,206,219,115,54,92,199,154,194,91,77,141,50) -IMAGE_DATA(79,185,170,170,150,242,1,165,15,148,25,27,26,26,122,3,83,253,3,195,164,29,125,50,151,186,167,103,144,52,243,246) -IMAGE_DATA(143,89,187,218,174,200,152,129,114,29,223,163,181,50,231,54,57,189,20,30,196,218,241,147,5,72,34,159,200,252,200,28) -IMAGE_DATA(115,102,41,67,143,68,209,54,61,210,200,151,102,82,124,150,73,113,26,107,218,9,242,177,113,196,100,12,105,32,235,25) -IMAGE_DATA(243,117,56,38,91,244,140,247,21,230,242,69,215,84,222,66,142,103,187,89,59,131,67,199,73,227,220,218,230,29,120,114) -IMAGE_DATA(132,181,13,62,188,222,154,226,59,133,51,175,99,162,105,43,183,133,99,18,229,162,191,255,220,163,152,163,153,74,188,189) -IMAGE_DATA(134,165,154,105,88,174,153,66,58,55,25,251,126,176,6,75,231,250,96,30,249,207,37,27,15,201,184,220,121,171,15,98) -IMAGE_DATA(246,170,0,209,181,244,44,45,93,239,58,241,129,202,156,245,42,137,89,117,238,26,163,129,215,132,145,53,29,107,68,219) -IMAGE_DATA(216,119,26,77,156,67,84,193,160,231,248,214,41,140,41,156,85,8,107,156,51,232,175,99,141,215,149,17,214,136,105,155) -IMAGE_DATA(123,14,149,202,153,98,215,179,214,124,149,53,210,181,154,218,38,153,39,234,168,172,190,233,248,53,101,158,193,0,218,249) -IMAGE_DATA(217,213,157,125,50,199,156,215,52,186,93,235,250,189,177,93,145,191,77,171,107,146,117,252,180,196,92,122,70,25,177,22) -IMAGE_DATA(76,218,84,40,108,113,140,198,235,102,156,60,67,219,108,218,82,220,159,66,251,28,159,177,157,38,255,153,150,99,34,61) -IMAGE_DATA(43,151,92,128,237,120,114,177,240,21,26,125,198,109,57,196,86,142,240,197,198,175,15,49,103,110,214,130,35,89,215,50) -IMAGE_DATA(40,79,224,185,48,105,148,151,158,196,118,63,30,99,25,43,243,159,20,29,59,134,181,110,77,99,206,150,108,10,197,184) -IMAGE_DATA(105,30,120,228,147,143,98,154,102,46,102,146,205,214,204,193,92,205,108,204,211,204,196,158,71,60,177,96,193,94,225,138) -IMAGE_DATA(57,91,188,33,88,198,230,206,89,117,0,75,54,28,66,78,190,158,116,134,215,36,171,147,181,214,216,159,242,156,127,206) -IMAGE_DATA(15,44,22,226,201,224,16,190,152,65,179,185,134,120,169,166,243,67,247,35,197,25,122,99,173,248,1,157,206,33,113,28) -IMAGE_DATA(111,217,159,106,71,88,179,185,121,85,52,77,213,53,158,167,103,119,207,219,171,96,95,74,62,84,205,7,216,151,86,146) -IMAGE_DATA(137,79,21,238,26,81,85,93,143,106,87,35,49,215,72,159,117,93,141,223,46,92,20,127,57,186,241,58,184,109,109,125) -IMAGE_DATA(35,172,181,146,191,178,90,109,111,240,179,183,179,241,223,167,211,215,144,185,200,63,212,35,45,195,134,21,155,131,68,215) -IMAGE_DATA(82,136,43,214,47,102,234,84,158,186,181,136,113,206,169,190,199,198,90,199,235,107,176,22,178,190,177,255,12,141,206,38) -IMAGE_DATA(142,50,137,161,211,56,120,244,180,232,22,199,103,74,140,150,41,140,177,29,164,252,192,143,226,39,214,180,189,33,41,20) -IMAGE_DATA(179,37,139,31,221,186,47,78,124,232,250,93,74,46,202,126,211,99,7,143,17,9,35,63,24,44,53,183,95,222,251,56) -IMAGE_DATA(38,104,150,227,85,205,82,76,210,44,193,20,205,34,76,213,44,192,238,191,144,126,45,221,55,194,218,194,117,65,162,107) -IMAGE_DATA(243,86,31,192,6,202,65,117,122,135,248,55,171,181,22,38,163,67,98,52,142,91,37,31,144,62,5,206,203,137,37,138) -IMAGE_DATA(209,172,214,6,225,141,207,19,199,107,58,3,231,12,46,122,77,122,198,186,70,26,167,19,157,227,122,151,139,172,70,244) -IMAGE_DATA(208,192,107,178,153,20,227,159,227,122,26,143,255,231,152,75,234,105,204,154,59,102,227,26,72,89,89,185,251,152,105,164) -IMAGE_DATA(223,147,63,207,102,183,59,81,223,208,142,198,134,14,52,54,242,252,168,158,107,250,63,217,95,54,55,119,161,173,181,71) -IMAGE_DATA(88,227,181,64,120,253,143,59,105,29,134,246,182,94,57,135,229,186,58,242,1,181,178,30,233,178,45,129,56,158,84,128) -IMAGE_DATA(244,28,243,8,87,153,133,86,210,48,139,152,194,153,133,24,51,9,103,172,115,201,89,196,90,166,78,182,156,31,176,207) -IMAGE_DATA(100,31,26,28,73,121,230,145,52,138,197,82,165,222,182,255,112,26,229,157,167,132,53,182,128,240,211,216,71,90,182,59) -IMAGE_DATA(56,89,124,231,206,3,137,216,117,32,9,94,1,39,176,99,127,2,249,209,24,241,163,156,31,112,157,99,57,113,182,100) -IMAGE_DATA(99,168,196,251,127,123,246,117,252,236,67,207,226,89,205,58,60,167,89,141,23,52,30,120,73,179,10,227,62,176,28,94) -IMAGE_DATA(79,135,98,206,138,125,194,214,156,85,254,152,179,210,143,242,214,0,172,217,126,24,7,195,82,136,35,126,110,70,163,248) -IMAGE_DATA(74,139,197,33,115,238,56,46,227,220,128,53,200,100,118,137,230,241,218,125,92,91,227,184,76,167,227,184,150,152,51,144) -IMAGE_DATA(198,185,217,210,143,248,83,39,249,86,98,141,226,16,19,243,70,140,202,58,128,196,155,81,120,115,201,181,231,120,107,112) -IMAGE_DATA(112,144,238,241,78,241,159,149,60,247,157,88,227,254,247,186,186,58,12,12,12,200,113,213,248,53,27,179,213,64,156,53) -IMAGE_DATA(184,89,115,185,26,164,238,166,250,84,142,221,58,58,58,228,119,56,29,172,215,246,59,110,77,134,214,182,30,58,191,141) -IMAGE_DATA(116,159,242,179,10,42,144,91,96,196,170,173,138,174,169,156,101,80,30,192,251,236,47,217,20,206,20,173,99,255,201,250) -IMAGE_DATA(199,186,118,130,243,7,242,165,28,179,113,45,45,44,54,103,68,215,252,195,210,132,53,191,48,133,53,174,245,74,189,247) -IMAGE_DATA(48,207,175,226,185,47,73,178,142,26,199,105,236,59,183,249,198,97,7,231,8,180,191,137,107,183,187,34,137,181,112,186) -IMAGE_DATA(15,184,255,62,24,179,86,248,227,143,127,157,140,31,221,245,10,254,170,217,138,191,105,54,227,113,205,38,252,67,179,1) -IMAGE_DATA(79,125,104,61,182,189,28,129,165,235,3,241,202,172,29,24,55,99,27,130,143,38,195,200,107,87,153,155,36,31,224,245) -IMAGE_DATA(173,202,203,45,82,75,43,145,185,118,38,148,150,115,95,129,210,255,100,112,199,90,74,158,90,75,156,85,209,249,169,150) -IMAGE_DATA(124,148,185,42,103,191,201,249,168,155,47,131,158,222,231,227,55,96,205,192,26,71,175,107,106,174,174,85,219,215,55,48) -IMAGE_DATA(194,26,231,160,172,91,55,139,199,120,125,182,250,250,246,17,214,120,205,5,102,107,244,231,153,55,174,161,112,45,132,57) -IMAGE_DATA(227,249,6,119,82,107,107,27,32,214,154,228,121,45,90,173,242,92,160,21,155,14,18,107,133,35,124,49,87,204,20,91) -IMAGE_DATA(42,197,108,234,126,90,142,178,207,126,147,115,213,56,183,69,167,40,121,40,179,198,57,38,243,198,254,211,255,72,250,8) -IMAGE_DATA(103,172,111,236,55,217,103,122,31,228,231,22,36,72,223,17,247,13,108,218,29,45,124,113,205,99,243,158,24,233,235,242) -IMAGE_DATA(216,113,4,203,54,29,146,250,237,44,210,171,233,75,246,224,119,127,156,128,31,104,94,199,255,106,118,225,15,154,157,248) -IMAGE_DATA(163,102,7,30,213,108,199,95,239,217,129,141,83,40,111,221,30,134,103,38,109,192,203,175,111,199,233,108,189,204,109,175) -IMAGE_DATA(168,232,132,153,124,103,85,85,135,172,27,202,181,216,146,18,45,116,20,107,177,63,101,125,227,28,160,140,121,51,240,28) -IMAGE_DATA(229,90,250,185,122,137,49,202,181,28,179,213,184,235,29,156,87,56,133,53,222,42,26,199,57,173,194,216,136,15,21,93) -IMAGE_DATA(171,19,214,184,127,124,120,248,172,212,203,186,186,123,221,62,84,201,13,184,158,118,51,214,120,125,182,218,186,214,145,245) -IMAGE_DATA(101,42,43,171,223,180,150,203,239,189,157,181,156,255,189,237,10,177,214,67,247,115,61,89,13,221,207,13,40,42,177,195) -IMAGE_DATA(99,91,48,162,221,172,169,26,166,250,74,54,149,57,54,126,205,122,22,69,159,143,73,45,17,255,201,185,129,202,154,154) -IMAGE_DATA(27,40,117,141,76,97,205,95,98,179,52,241,157,162,105,1,60,151,52,30,91,247,70,83,44,21,129,117,210,111,122,132) -IMAGE_DATA(98,120,138,177,60,252,137,171,189,120,117,238,46,76,154,183,83,250,78,103,46,241,196,140,37,187,240,235,223,76,192,119) -IMAGE_DATA(41,78,251,31,141,47,217,30,252,74,179,27,191,209,248,224,207,247,237,197,202,233,71,233,231,131,241,248,132,181,152,178) -IMAGE_DATA(192,27,89,217,229,20,99,183,147,158,181,145,78,53,82,62,216,36,235,246,241,28,98,238,3,54,203,90,96,38,226,203) -IMAGE_DATA(170,104,24,247,191,203,250,243,22,201,11,152,75,206,13,180,204,148,161,142,172,94,214,201,213,25,56,134,227,45,31,115) -IMAGE_DATA(231,13,204,155,172,165,219,44,102,52,53,43,122,106,117,207,123,119,247,31,40,53,16,37,63,224,247,120,126,250,155,241) -IMAGE_DATA(193,122,200,181,95,238,247,52,155,205,210,111,240,94,27,3,222,74,186,86,92,218,76,231,177,89,206,97,65,81,37,214) -IMAGE_DATA(122,134,34,54,185,96,148,175,84,152,59,157,103,194,169,220,171,218,198,219,36,233,43,40,21,214,162,83,138,69,215,98) -IMAGE_DATA(83,184,63,170,192,93,195,205,145,184,45,36,42,83,114,0,223,144,100,248,28,76,36,45,59,1,47,127,94,163,40,2) -IMAGE_DATA(203,55,31,146,177,114,60,151,238,149,185,222,164,67,59,241,226,12,79,153,203,249,220,180,173,50,247,233,201,137,27,241) -IMAGE_DATA(234,156,29,152,239,177,7,243,86,237,198,236,229,187,241,203,255,25,143,111,104,214,147,182,29,192,15,53,254,248,49,217) -IMAGE_DATA(79,52,251,241,216,23,15,97,209,108,138,233,54,5,226,241,137,107,41,55,56,72,247,144,129,242,186,54,210,3,30,95) -IMAGE_DATA(221,134,198,166,14,186,94,141,226,35,109,246,6,25,35,196,107,61,74,253,191,220,32,58,87,92,90,78,90,229,18,157) -IMAGE_DATA(227,207,86,84,54,201,190,145,159,253,102,107,36,166,56,127,173,167,243,86,235,102,141,243,6,151,228,170,138,166,53,185) -IMAGE_DATA(159,11,113,45,107,214,107,88,83,106,186,252,30,231,153,55,171,105,112,127,39,251,69,54,174,101,220,169,53,219,55,107) -IMAGE_DATA(204,90,89,121,35,202,40,102,43,46,109,32,115,97,245,182,67,136,74,204,149,250,89,6,231,3,20,151,41,166,176,38) -IMAGE_DATA(57,1,251,208,108,165,175,128,235,28,177,105,37,178,141,38,77,139,72,200,195,145,88,55,95,17,236,39,121,188,248,113) -IMAGE_DATA(44,35,166,102,175,244,199,212,69,123,49,126,206,46,25,3,41,99,109,221,227,110,121,92,228,75,51,61,197,152,177,103) -IMAGE_DATA(167,110,193,63,94,221,32,99,106,31,159,176,30,147,231,123,97,233,6,127,178,253,152,183,98,55,126,242,223,47,227,65) -IMAGE_DATA(242,155,223,212,28,194,195,154,96,124,91,19,132,239,104,2,241,216,215,143,99,222,220,16,76,241,240,195,223,103,109,146) -IMAGE_DATA(249,164,102,107,35,154,136,47,94,11,215,98,169,149,62,0,135,163,133,52,204,76,239,213,75,140,198,53,14,102,142,99) -IMAGE_DATA(249,82,247,250,28,74,61,131,24,164,88,204,98,169,147,60,149,185,50,176,150,113,77,210,173,105,172,111,90,189,203,93) -IMAGE_DATA(19,81,214,6,191,202,26,63,59,141,52,201,234,116,179,86,229,94,179,200,53,210,127,192,99,218,184,127,244,206,242,123) -IMAGE_DATA(239,100,187,130,150,86,126,46,80,35,197,41,196,90,73,189,212,61,124,3,19,112,52,46,27,153,20,171,101,184,57,83) -IMAGE_DATA(125,166,162,103,156,119,106,145,152,81,134,152,148,66,132,199,241,122,68,252,12,89,158,199,30,5,15,138,225,23,173,63) -IMAGE_DATA(36,207,223,153,190,52,64,230,218,241,92,1,126,166,192,75,51,189,240,194,244,237,50,87,243,197,233,59,232,245,78,49) -IMAGE_DATA(214,49,30,15,201,199,216,120,110,192,51,83,54,227,169,73,155,132,183,199,39,172,195,244,197,62,88,190,49,64,108,214) -IMAGE_DATA(18,47,124,231,155,227,241,69,242,157,95,209,132,19,115,71,240,85,77,24,190,166,9,197,223,126,144,132,215,231,5,192) -IMAGE_DATA(63,60,3,153,185,102,121,126,150,81,234,27,252,204,31,138,191,44,53,20,91,183,144,31,109,148,156,192,194,235,41,148) -IMAGE_DATA(153,164,175,189,164,164,92,214,139,231,126,82,233,131,210,43,235,133,149,150,42,113,152,94,229,202,160,196,104,18,175,233) -IMAGE_DATA(175,178,166,198,104,204,226,181,172,185,117,205,122,117,61,182,171,253,8,236,67,29,255,225,172,65,250,207,170,156,53,178) -IMAGE_DATA(230,9,199,195,188,77,78,203,198,145,152,76,169,97,36,101,80,94,153,82,132,99,9,185,56,68,49,23,199,90,28,203) -IMAGE_DATA(115,237,107,253,174,104,44,223,26,46,107,62,242,188,129,215,150,249,11,87,60,182,118,170,251,57,60,147,100,124,237,158) -IMAGE_DATA(145,103,10,240,56,219,23,167,147,127,124,77,225,237,217,169,219,100,159,217,98,45,123,102,202,22,217,50,119,188,85,153) -IMAGE_DATA(99,63,186,96,181,63,105,110,176,140,123,123,229,245,141,120,240,255,189,138,207,146,142,125,94,19,137,47,144,125,81,115) -IMAGE_DATA(12,15,104,34,240,228,175,51,240,58,253,254,212,244,28,228,230,21,202,115,166,242,242,10,80,144,95,132,124,222,22,20) -IMAGE_DATA(161,168,168,4,133,133,197,244,58,159,246,139,232,120,30,242,243,11,149,227,133,87,143,23,210,126,105,105,185,242,220,189) -IMAGE_DATA(50,173,248,87,173,86,71,91,54,253,136,105,181,6,247,49,238,79,53,42,198,117,58,238,35,213,170,227,39,141,202,120) -IMAGE_DATA(181,55,108,13,178,70,224,123,109,173,229,91,109,156,175,112,29,135,243,100,213,218,41,151,46,55,84,34,60,54,3,203) -IMAGE_DATA(183,80,238,183,62,84,225,105,13,207,75,87,230,8,204,95,119,152,44,84,198,114,179,241,124,40,158,111,167,60,63,64) -IMAGE_DATA(89,211,157,199,114,243,28,40,117,44,55,243,198,190,82,213,177,23,72,215,20,206,118,184,227,178,77,162,99,236,59,153) -IMAGE_DATA(49,230,141,231,14,171,28,174,220,18,140,245,59,15,99,225,90,63,60,55,113,5,62,255,217,87,241,73,98,235,211,154) -IMAGE_DATA(88,178,24,124,70,19,77,118,28,47,254,37,7,243,87,5,160,164,76,39,113,244,155,25,199,217,170,89,173,86,49,155) -IMAGE_DATA(205,38,235,96,112,223,54,215,170,120,62,9,143,35,171,175,175,151,245,87,152,7,117,205,218,183,99,234,57,190,254,253) -IMAGE_DATA(247,226,250,183,111,167,169,207,89,184,214,46,83,126,144,79,241,250,94,204,88,30,32,107,184,240,188,0,230,140,231,161) -IMAGE_DATA(240,252,58,102,139,247,121,28,55,207,85,225,215,236,43,213,53,94,216,152,185,241,179,189,197,20,214,20,222,56,86,99) -IMAGE_DATA(227,216,140,89,226,53,132,20,93,219,172,232,217,52,229,181,24,177,247,244,164,13,50,166,119,173,231,97,44,94,23,128) -IMAGE_DATA(39,199,45,196,167,238,155,140,143,17,103,31,215,156,192,125,100,159,208,36,224,19,119,133,227,183,63,59,137,149,155,131) -IMAGE_DATA(229,57,199,204,203,104,227,177,18,163,141,89,98,227,113,139,108,188,214,10,179,197,207,109,82,249,226,113,100,204,3,247) -IMAGE_DATA(247,112,76,174,214,19,222,105,123,63,183,132,212,66,76,91,184,27,211,151,249,141,112,53,147,215,66,91,234,47,115,79) -IMAGE_DATA(120,206,19,239,243,188,97,102,79,153,223,233,175,204,77,225,181,94,104,203,207,25,27,63,91,209,53,241,159,51,60,69) -IMAGE_DATA(215,148,57,120,196,29,241,246,188,59,126,83,243,78,222,62,255,218,22,60,53,113,3,237,111,194,2,143,189,216,226,19) -IMAGE_DATA(78,249,69,20,214,237,12,195,162,117,126,248,219,179,179,113,223,189,175,227,163,196,216,189,196,215,189,119,121,227,99,119) -IMAGE_DATA(47,198,23,191,48,25,191,123,108,17,60,247,69,73,93,128,141,199,122,221,204,174,231,80,101,79,213,51,142,163,88,207) -IMAGE_DATA(120,252,235,141,198,87,140,181,127,189,37,166,23,83,238,231,45,235,26,240,220,77,101,62,186,18,235,179,118,49,71,147) -IMAGE_DATA(23,238,31,97,110,180,49,107,10,103,74,126,169,250,76,102,137,99,127,37,7,165,24,142,140,143,43,188,109,33,125,219) -IMAGE_DATA(132,87,102,111,195,70,207,16,196,36,156,150,49,174,204,131,209,108,133,207,193,120,108,216,21,78,113,219,62,252,233,241) -IMAGE_DATA(169,248,248,61,115,241,137,143,206,195,151,191,50,17,63,253,213,171,248,203,51,179,241,220,228,213,152,181,108,55,194,162) -IMAGE_DATA(82,197,23,94,111,236,27,223,204,70,179,199,204,49,111,172,111,188,214,1,215,89,217,247,113,127,209,157,62,15,243,189) -IMAGE_DATA(216,82,179,202,48,101,161,143,60,87,71,213,46,149,53,53,175,100,158,120,95,89,3,193,111,68,211,56,102,83,116,108) -IMAGE_DATA(135,48,198,57,128,18,247,111,147,215,10,127,148,135,178,205,220,74,57,166,55,118,237,143,64,202,169,92,202,251,172,168) -IMAGE_DATA(188,1,11,249,69,90,108,246,137,32,157,243,197,147,227,151,224,183,127,158,132,39,94,154,143,9,51,55,82,124,182,23) -IMAGE_DATA(251,131,99,112,42,51,95,214,91,185,17,103,111,102,111,198,155,170,109,252,188,98,238,243,25,99,237,223,215,50,243,12) -IMAGE_DATA(18,175,241,58,84,175,175,84,215,218,80,152,99,45,123,117,222,94,138,193,118,75,76,54,217,189,54,26,115,169,104,218) -IMAGE_DATA(110,209,46,117,29,170,167,39,109,150,117,14,158,161,216,235,89,138,201,94,156,190,5,243,86,250,226,64,104,60,114,242) -IMAGE_DATA(74,96,187,129,230,220,136,139,164,212,28,44,92,195,107,231,122,99,249,198,3,8,10,59,129,236,220,98,216,172,182,91) -IMAGE_DATA(226,235,102,172,141,214,53,238,15,103,93,227,152,141,251,186,199,124,232,191,167,229,22,153,49,99,153,175,196,107,50,95) -IMAGE_DATA(120,84,62,192,115,212,39,206,247,21,109,83,244,77,121,110,221,107,238,154,7,243,199,186,198,57,230,83,147,54,74,95) -IMAGE_DATA(209,11,20,123,121,108,57,136,240,168,20,20,149,104,111,192,214,141,249,26,109,156,39,38,156,204,148,53,186,237,182,183) -IMAGE_DATA(207,215,205,244,108,116,188,166,106,26,231,6,220,39,196,185,193,251,61,142,255,119,180,34,173,29,179,87,249,99,230,114) -IMAGE_DATA(127,119,94,112,112,68,219,88,215,38,47,80,98,127,54,94,99,155,249,82,106,107,251,100,189,237,113,51,119,96,234,2) -IMAGE_DATA(47,108,245,62,140,216,196,12,169,47,93,189,190,118,177,127,133,149,119,130,177,235,181,140,57,227,92,148,227,52,149,51) -IMAGE_DATA(30,79,161,230,5,119,194,218,237,255,137,205,96,113,97,222,234,0,121,222,137,186,94,149,186,198,163,90,207,96,206,84) -IMAGE_DATA(109,227,154,6,199,119,188,254,222,254,224,88,100,156,41,130,133,124,219,141,226,240,59,145,177,209,185,167,242,92,79,69) -IMAGE_DATA(207,198,56,251,247,183,246,206,94,44,88,123,80,230,88,206,93,19,34,235,59,42,254,211,239,106,31,192,76,79,210,48) -IMAGE_DATA(47,172,222,22,130,136,232,52,242,141,186,81,117,134,219,207,215,205,124,229,245,140,113,108,198,90,198,53,14,142,207,56) -IMAGE_DATA(23,96,191,201,125,221,99,156,253,123,27,135,37,59,246,69,83,204,182,95,250,5,102,175,10,146,250,7,63,31,128,199) -IMAGE_DATA(143,109,221,125,20,241,39,179,160,55,154,229,186,241,245,227,235,120,59,249,122,179,90,198,232,26,154,202,151,234,43,71) -IMAGE_DATA(51,198,181,13,246,153,156,7,112,206,249,94,28,79,241,222,108,87,144,120,170,24,211,22,239,37,109,243,199,202,173,161) -IMAGE_DATA(8,10,79,70,110,129,86,158,243,224,170,113,201,154,174,14,167,99,68,47,110,7,99,111,86,39,27,173,95,106,94,121) -IMAGE_DATA(125,191,0,251,202,209,140,113,95,17,107,25,251,76,30,195,115,39,141,161,254,79,111,141,205,29,136,79,45,68,149,171) -IMAGE_DATA(81,214,222,231,250,57,247,219,176,22,240,117,123,183,245,236,173,212,97,175,215,47,213,71,142,214,48,53,30,99,95,57) -IMAGE_DATA(154,49,238,27,230,126,201,49,45,187,61,141,239,109,142,89,216,175,188,25,107,42,111,215,51,119,171,236,221,172,174,127) -IMAGE_DATA(189,102,221,136,173,209,254,113,52,95,163,53,140,25,83,251,208,249,127,82,231,246,170,140,141,213,52,110,95,227,115,207) -IMAGE_DATA(113,11,223,247,172,1,124,173,88,27,248,58,242,53,229,235,171,250,169,235,185,187,222,222,42,67,111,165,207,242,70,108) -IMAGE_DATA(221,140,47,85,195,56,230,231,220,146,25,227,123,136,125,229,24,99,119,78,227,126,25,246,47,170,182,241,245,99,222,248) -IMAGE_DATA(154,242,245,229,107,173,250,43,149,129,235,199,84,92,63,230,226,173,142,193,24,237,11,111,198,149,234,27,89,119,213,24) -IMAGE_DATA(236,70,124,241,255,193,247,14,255,79,99,241,216,157,215,248,154,176,143,225,220,140,121,227,235,199,215,146,175,43,95,99) -IMAGE_DATA(190,214,124,205,249,218,179,169,252,141,182,209,188,220,200,174,255,188,202,147,202,212,205,184,98,221,82,217,82,253,35,199) -IMAGE_DATA(96,55,226,107,76,195,238,252,166,242,198,215,141,175,161,140,171,164,235,202,215,152,175,53,95,115,190,246,204,128,202,159) -IMAGE_DATA(106,204,200,91,49,245,243,252,243,170,169,76,189,25,87,204,189,202,22,223,7,236,235,249,158,224,24,108,140,175,247,110) -IMAGE_DATA(227,235,197,215,142,175,33,51,199,215,149,175,175,58,214,148,175,59,95,127,230,128,121,80,57,84,89,188,153,169,159,83) -IMAGE_DATA(89,186,17,79,234,216,214,209,92,177,110,141,102,139,227,175,49,190,254,115,26,107,28,215,210,89,231,56,190,102,238,248) -IMAGE_DATA(154,243,181,103,205,99,14,152,135,209,99,203,223,234,24,105,245,185,56,252,29,234,26,159,163,153,226,223,165,114,197,191) -IMAGE_DATA(159,217,226,191,101,244,120,217,177,246,159,215,212,57,214,172,33,172,37,124,237,153,1,230,143,121,184,126,93,10,230,229) -IMAGE_DATA(70,166,30,31,205,210,232,185,144,163,153,82,159,83,114,231,205,237,30,107,239,118,83,249,83,25,100,99,70,152,197,55) -IMAGE_DATA(51,62,174,114,164,218,245,227,250,199,218,88,27,107,99,109,172,141,181,177,54,214,222,139,237,255,3,38,71,107,185,0) -IMAGE_END_DATA(19872, 1) diff --git a/uppdev/stdapp/icon.ico b/uppdev/stdapp/icon.ico deleted file mode 100644 index 4012786aa..000000000 Binary files a/uppdev/stdapp/icon.ico and /dev/null differ diff --git a/uppdev/stdapp/stdapp.cpp b/uppdev/stdapp/stdapp.cpp deleted file mode 100644 index a64a1bfec..000000000 --- a/uppdev/stdapp/stdapp.cpp +++ /dev/null @@ -1,240 +0,0 @@ -#include - -#define IMAGECLASS stdappImg -#define IMAGEFILE -#include - -#define TOPICFILE -#include - -GUI_APP_MAIN -{ - stdapp app; - - /* text configuration file selected - String cfg_file = ConfigFile(); - app.GetBinCfg(cfg_file); - text configuration file selected */ - - // text configuration file selected - app.GetTxtCfg(); - // text configuration file selected - - if (app.cfg.show_splash) - { - Splash splash(app.cfg.language, SPLASH_PERIOD); - Ctrl::EventLoop(); - } - if (app.cfg.restore_cfg) - { - if (app.cfg.maximized) - app.Maximize(); - else if (app.cfg.minimized) - app.Minimize(); - else - app.NoCenter(); - } - app.SetRect(app.cfg.main_window_left, app.cfg.main_window_top, app.cfg.main_window_width, app.cfg.main_window_height); - app.Init(); - app.Run(); - - /* text configuration file selected - app.SaveBinCfg(cfg_file); - text configuration file selected */ - - // text configuration file selected - app.SaveTxtCfg(); - // text configuration file selected -} - -stdapp::stdapp() -{ - CtrlLayout(*this); - Icon(stdappImg::app_icon_16(), stdappImg::app_icon_16()); - Zoomable().Sizeable(); - menu.WhenHelp = status; - AddFrame(menu); - CtrlLayout(view); - view.SizePos(); - Add(view); - AddFrame(tools); - AddFrame(status); - help.SetRect(help_window_left, help_window_top, help_window_width, help_window_height); -} - -void stdapp::Init() -{ - SetLanguage(cfg.language); - Title(APP_TITLE); - menu.Set(THISBACK(MainBar)); - tools.Set(THISBACK(Toolbar)); - status.Set(t_("Ready")); - CtrlLayout(language); - CtrlLayout(configuration); - CtrlLayout(splash_screen); - CtrlLayoutOKCancel(options, t_("Options")); - CtrlLayoutOK(about, t_("About ...")); -} - -/* text configuration file selected -void stdapp::GetBinCfg(String cfg_file) -{ - LoadFromFile(cfg, cfg_file); -} -text configuration file selected */ - -// text configuration file selected -void stdapp::GetTxtCfg() -{ - VectorMap cfg_data_in = LoadIniFile(IniFile); - if (cfg_data_in.Get("RESTORE_CFG", Null) == "true") - { - int tmp; - - cfg.restore_cfg = true; - cfg.show_splash = cfg_data_in.Get("SHOW_SPLASH", Null) == "true" ? true : false; - cfg.maximized = cfg_data_in.Get("MAXIMIZED", Null) == "true" ? true : false; - cfg.minimized = cfg_data_in.Get("MINIMIZED", Null) == "true" ? true : false; - tmp = ScanInt(cfg_data_in.Get("TOP_WINDOW_LEFT", Null)); - cfg.main_window_left = IsNull(tmp) ? default_main_window_left : tmp; - tmp = ScanInt(cfg_data_in.Get("TOP_WINDOW_TOP", Null)); - cfg.main_window_top = IsNull(tmp) ? default_main_window_top : tmp; - tmp = ScanInt(cfg_data_in.Get("TOP_WINDOW_WIDTH", Null)); - cfg.main_window_width = IsNull(tmp) ? default_main_window_width : tmp; - tmp = ScanInt(cfg_data_in.Get("TOP_WINDOW_HEIGHT", Null)); - cfg.main_window_height = IsNull(tmp) ? default_main_window_height : tmp; - tmp = ScanInt(cfg_data_in.Get("LANGUAGE", Null)); - cfg.language = IsNull(tmp) ? default_language : tmp; - } -} -// text configuration file selected - -/* text configuration file selected -void stdapp::SaveBinCfg(String cfg_file) -{ - GetCurrentCfg(); - - if(!StoreToFile(cfg, cfg_file)) - Exclamation(t_("Error saving configuration!")); -} -text configuration file selected */ - -// text configuration file selected -void stdapp::SaveTxtCfg() -{ - GetCurrentCfg(); - - String cfg_data_out; - cfg_data_out - << APP_TITLE << ": Configuration Text File" << "\n\n" - << "RESTORE_CFG = " << (cfg.restore_cfg ? "true" : "false") << "\n" - << "SHOW_SPLASH = " << (cfg.show_splash ? "true" : "false") << "\n" - << "MAXIMIZED = " << (cfg.maximized ? "true" : "false") << "\n" - << "MINIMIZED = " << (cfg.minimized ? "true" : "false") << "\n" - << "TOP_WINDOW_LEFT = " << AsString(cfg.main_window_left) << "\n" - << "TOP_WINDOW_TOP = " << AsString(cfg.main_window_top) << "\n" - << "TOP_WINDOW_WIDTH = " << AsString(cfg.main_window_width) << "\n" - << "TOP_WINDOW_HEIGHT = " << AsString(cfg.main_window_height) << "\n" - << "LANGUAGE = " << AsString(cfg.language) << "\n" - ; - if(!SaveFile(IniFile, cfg_data_out)) - Exclamation(t_("Error saving configuration!")); -} -// text configuration file selected - -void stdapp::GetCurrentCfg() -{ - cfg.maximized = IsMaximized(); - cfg.minimized = IsMinimized(); - Rect main_window = GetRect(); - cfg.main_window_left = main_window.left; - cfg.main_window_top = main_window.top; - cfg.main_window_width = main_window.right - main_window.left; - cfg.main_window_height = main_window.bottom - main_window.top; -} - - -void stdapp::MainBar(Bar& bar) -{ - bar.Add(t_("&File"), THISBACK(File)); - bar.Add(t_("&Edit"), THISBACK(Edit)); - bar.Add(t_("&Settings"), THISBACK(Settings)); - bar.Add(t_("&Help"), THISBACK(Help)); -} - -void stdapp::Toolbar(Bar& bar) -{ - bar.Add(stdappImg::doc_new(), THISBACK(OnNew)).Tip(t_("New")); - bar.Add(stdappImg::doc_load(), THISBACK(OnLoad)).Tip(t_("Open ...")); - bar.Add(stdappImg::doc_save(), THISBACK(OnSave)).Tip(t_("Save")); - bar.Add(stdappImg::doc_save_as(), THISBACK(OnSaveAs)).Tip(t_("Save as ...")); - bar.Add(stdappImg::doc_print(), THISBACK(OnPrint)).Tip(t_("Print ...")); - bar.Separator(); - bar.Add(stdappImg::doc_cut(), THISBACK(OnCut)).Tip(t_("Cut")); - bar.Add(stdappImg::doc_copy(), THISBACK(OnCopy)).Tip(t_("Copy")); - bar.Add(stdappImg::doc_paste(), THISBACK(OnPaste)).Tip(t_("Paste")); - bar.Add(stdappImg::doc_delete(), THISBACK(OnDelete)).Tip(t_("Delete")); - bar.Separator(); - bar.Add(stdappImg::doc_undo(), THISBACK(OnUndo)).Tip(t_("Undo")); - bar.Add(stdappImg::doc_redo(), THISBACK(OnRedo)).Tip(t_("Redo")); -} - -void stdapp::Paint(Draw& w) -{ - w.DrawRect(GetSize(), SWhite); -} - -bool stdapp::Key(dword key, int) -{ - if (key == K_F2) - { - OnF2Key(); - return true; - } - else if (key == K_SHIFT_F3) - { - OnShiftF3Key(); - return true; - } - else if (key == K_SHIFT_CTRL_1) - { - OnShiftCtrl1Key(); - return true; - } - else if (key == K_ALT_A) - { - OnAltAKey(); - return true; - } - else if (key == K_CTRL_B) - { - OnCtrlBKey(); - return true; - } - return false; -} - -void stdapp::OnF2Key() -{ - Exclamation("You still have to write your own \"F2-key\" code!"); -} - -void stdapp::OnShiftF3Key() -{ - Exclamation("You still have to write your own \"Shift+F3-key\" code!"); -} - -void stdapp::OnShiftCtrl1Key() -{ - Exclamation("You still have to write your own \"Shift+Ctrl+1-key\" code!"); -} - -void stdapp::OnAltAKey() -{ - Exclamation("You still have to write your own \"Alt+A-key\" code!"); -} - -void stdapp::OnCtrlBKey() -{ - Exclamation("You still have to write your own \"Ctrl+B-key\" code!"); -} diff --git a/uppdev/stdapp/stdapp.hpp b/uppdev/stdapp/stdapp.hpp deleted file mode 100644 index 7ff88f78b..000000000 --- a/uppdev/stdapp/stdapp.hpp +++ /dev/null @@ -1,68 +0,0 @@ -#ifndef STDAPP_HPP -#define STDAPP_HPP - -#include -#include -#include -#include - -#define TFILE -#include - -#define LAYOUTFILE -#include -#define LAYOUTFILE -#include -#define LAYOUTFILE -#include - -#define IMAGECLASS stdappImg -#define IMAGEFILE -#include - -class stdapp : public WithstdappLayoutMain -{ -private: - WithstdappLayoutView view; - WithstdappLayoutTab options; - WithstdappLayoutLang language; - WithstdappLayoutCfg configuration; - WithstdappLayoutSplash splash_screen; - HelpWindow help; - WithstdappLayoutAbout about; - - void GetCurrentCfg(); - void MainBar(Bar& bar); - void Toolbar(Bar& bar); - #include - #include - #include - #include - virtual void Paint(Draw& w); - bool Key(dword key, int); - void OnF2Key(); - void OnShiftF3Key(); - void OnShiftCtrl1Key(); - void OnAltAKey(); - void OnCtrlBKey(); - - typedef stdapp CLASSNAME; - -public: - Cfg cfg; - - stdapp(); - /* text configuration file selected - void GetBinCfg(String cfg_file); - void SaveBinCfg(String cfg_file); - text configuration file selected */ - - // text configuration file selected - void GetTxtCfg(); - void SaveTxtCfg(); - // text configuration file selected - - void Init(); -}; - -#endif diff --git a/uppdev/stdapp/stdapp.iml b/uppdev/stdapp/stdapp.iml deleted file mode 100644 index 395700d0c..000000000 --- a/uppdev/stdapp/stdapp.iml +++ /dev/null @@ -1,134 +0,0 @@ -IMAGE_ID(app_icon_16) -IMAGE_ID(doc_new) -IMAGE_ID(doc_load) -IMAGE_ID(doc_save) -IMAGE_ID(doc_save_as) -IMAGE_ID(doc_print) -IMAGE_ID(doc_cut) -IMAGE_ID(doc_copy) -IMAGE_ID(doc_paste) -IMAGE_ID(doc_delete) -IMAGE_ID(doc_undo) -IMAGE_ID(doc_redo) - -IMAGE_BEGIN_DATA -IMAGE_DATA(120,156,237,154,9,84,84,71,186,199,187,17,84,76,140,146,168,99,136,184,145,196,196,101,76,230,229,197,196,196,193,125) -IMAGE_DATA(50,38,241,153,69,227,60,77,92,0,145,85,16,1,17,20,205,32,8,26,77,120,17,17,136,196,37,108,42,40,32,168) -IMAGE_DATA(24,33,160,136,108,42,65,22,17,17,80,217,105,68,17,5,245,255,234,43,184,215,219,77,55,52,198,243,206,155,115,230) -IMAGE_DATA(158,243,63,117,111,213,247,171,175,110,81,245,85,213,109,100,3,101,3,101,194,133,44,25,254,168,88,45,61,202,255,191) -IMAGE_DATA(230,85,203,187,123,150,230,75,165,154,247,44,253,107,210,179,248,251,252,203,72,166,38,85,189,151,61,37,159,213,13,171) -IMAGE_DATA(206,135,170,125,119,252,191,160,100,210,96,96,110,110,142,77,155,54,117,169,109,219,220,17,18,178,26,209,81,86,216,232) -IMAGE_DATA(102,132,89,211,117,48,224,5,26,196,50,94,222,221,213,212,16,132,150,70,75,180,54,125,138,166,154,89,136,10,55,194) -IMAGE_DATA(178,197,122,208,215,127,194,215,213,213,161,166,166,134,171,182,182,86,84,99,125,28,99,173,240,240,238,100,60,186,183,146) -IMAGE_DATA(201,10,15,26,63,196,47,123,6,97,210,59,58,34,175,202,82,125,164,166,134,96,230,119,46,227,44,240,184,245,24,211) -IMAGE_DATA(113,60,106,182,70,246,153,97,88,188,80,79,137,87,101,73,119,20,65,29,188,21,99,19,241,184,45,137,221,219,33,39) -IMAGE_DATA(109,24,230,125,162,43,242,234,216,250,250,122,220,110,56,138,251,183,45,240,232,238,84,60,106,113,96,90,141,182,166,25) -IMAGE_DATA(56,18,110,136,215,140,229,26,121,98,73,138,134,235,184,171,240,103,117,152,162,237,206,108,166,89,104,174,95,12,171,21) -IMAGE_DATA(47,67,46,151,41,241,170,108,67,67,67,135,202,113,167,241,40,154,27,253,152,2,225,239,239,194,255,118,210,191,159,38) -IMAGE_DATA(86,161,80,136,106,108,108,228,182,196,244,148,39,182,59,94,19,119,251,246,109,81,154,120,117,126,5,159,2,219,212,212) -IMAGE_DATA(164,21,175,218,102,129,237,138,239,201,37,229,181,153,127,170,90,188,120,177,200,255,97,73,131,193,216,113,111,194,118,149) -IMAGE_DATA(117,39,89,88,154,115,141,121,227,245,46,43,35,219,156,156,28,181,74,75,59,11,83,243,101,24,62,220,72,35,111,101) -IMAGE_DATA(179,18,201,201,73,240,223,181,147,43,48,56,0,97,17,7,186,213,167,255,245,49,231,169,141,231,207,159,71,104,104,40) -IMAGE_DATA(23,149,105,115,145,29,241,203,76,151,40,249,23,248,230,230,187,26,37,229,191,94,178,72,173,127,178,203,202,202,232,36) -IMAGE_DATA(117,252,31,241,255,143,69,95,105,229,191,176,176,64,45,63,255,171,47,184,255,101,235,2,241,142,249,129,30,105,134,245) -IMAGE_DATA(79,156,39,255,244,156,86,88,139,211,185,85,90,137,108,137,17,252,211,125,212,185,10,108,59,90,216,173,124,162,242,17) -IMAGE_DATA(154,114,93,228,5,255,135,25,191,245,72,1,183,161,212,55,186,0,91,152,237,230,67,151,177,41,34,15,238,161,185,112) -IMAGE_DATA(222,119,17,171,67,46,32,56,177,68,201,255,66,231,32,4,177,60,251,61,57,176,255,233,2,236,126,202,129,93,112,14) -IMAGE_DATA(108,153,108,130,114,96,29,148,13,171,192,28,88,238,206,198,74,166,31,227,139,69,62,226,96,4,124,152,47,178,177,14) -IMAGE_DATA(36,187,236,118,187,128,108,172,8,200,130,57,75,205,119,101,193,204,63,11,166,59,179,16,120,242,26,190,112,240,199,184) -IMAGE_DATA(201,31,99,226,71,22,61,238,119,210,219,31,91,62,251,96,240,159,211,38,227,245,15,63,194,208,9,83,48,226,253,79) -IMAGE_DATA(48,113,193,26,188,103,177,21,31,172,240,194,116,115,71,252,217,100,106,151,149,13,125,243,93,188,53,103,49,38,154,124) -IMAGE_DATA(130,237,161,39,112,177,84,129,179,197,117,8,74,41,133,133,111,8,166,219,122,227,185,254,253,52,242,38,31,207,195,10) -IMAGE_DATA(7,71,44,183,119,194,28,219,205,152,182,38,16,51,215,134,96,79,82,17,126,43,170,197,103,94,209,152,107,181,30,118) -IMAGE_DATA(246,214,157,52,233,189,119,97,237,96,135,242,91,37,124,128,151,148,229,227,124,126,9,236,118,199,243,119,56,152,89,14) -IMAGE_DATA(191,132,223,241,229,250,32,92,46,189,169,20,12,238,222,189,203,235,88,237,100,141,71,143,30,241,21,129,86,134,210,242) -IMAGE_DATA(107,112,9,56,194,121,215,176,12,236,136,205,193,20,235,237,56,116,42,149,149,51,27,178,107,168,199,157,187,119,196,118) -IMAGE_DATA(60,108,123,136,90,182,178,17,35,21,241,11,253,126,237,148,207,119,28,119,158,240,173,173,173,168,174,174,65,198,133,51) -IMAGE_DATA(188,60,32,233,42,28,66,146,68,57,134,36,195,63,177,144,151,237,140,136,70,13,179,165,85,74,224,31,60,120,192,235) -IMAGE_DATA(184,113,227,6,206,102,38,137,117,16,71,58,152,94,202,243,252,66,15,113,27,122,119,90,237,164,60,189,191,106,29,135) -IMAGE_DATA(50,43,120,61,31,88,239,16,89,178,33,91,41,223,210,210,130,138,138,10,177,14,82,78,94,58,76,108,182,243,122,2) -IMAGE_DATA(163,226,120,222,195,135,15,185,13,217,210,138,43,240,143,31,63,238,50,112,83,123,73,194,238,73,149,167,133,135,2,130) -IMAGE_DATA(84,103,207,158,85,186,87,85,126,126,190,18,79,121,33,33,33,136,142,142,198,169,83,167,112,230,204,25,164,167,167,227) -IMAGE_DATA(226,197,139,136,136,136,64,110,110,174,152,158,56,113,2,25,25,25,34,159,157,157,141,212,212,84,68,70,70,32,46,46) -IMAGE_DATA(14,41,41,41,34,159,153,153,137,240,176,112,92,186,116,137,165,97,60,77,136,143,87,226,75,74,74,112,245,234,85,81) -IMAGE_DATA(151,47,95,230,186,112,225,130,70,9,60,205,1,117,115,67,27,17,251,239,96,240,239,96,240,255,42,24,236,63,176,23) -IMAGE_DATA(251,152,246,247,80,2,207,39,81,113,49,75,139,59,238,175,182,223,23,183,79,174,98,118,95,204,82,26,111,87,59,238) -IMAGE_DATA(41,95,224,233,72,16,125,228,48,162,142,68,177,52,138,165,135,249,179,84,138,6,5,231,27,20,116,12,81,240,103,129) -IMAGE_DATA(167,43,225,120,124,151,162,75,198,63,2,61,185,164,188,54,151,58,254,153,6,131,103,118,246,96,90,240,213,124,68,178) -IMAGE_DATA(45,83,119,34,59,117,60,149,209,192,148,106,139,239,102,165,231,251,247,239,115,187,174,120,138,202,36,98,5,9,121,218) -IMAGE_DATA(240,52,208,165,172,32,154,192,52,240,187,226,169,92,240,149,150,150,198,57,74,207,157,59,199,213,157,127,226,175,95,191) -IMAGE_DATA(142,242,242,114,62,105,136,191,121,243,38,110,221,186,133,202,202,202,110,253,223,187,119,143,29,5,154,85,116,143,139,202) -IMAGE_DATA(212,241,38,83,77,176,126,131,59,54,123,121,226,224,193,131,124,5,164,84,85,148,31,25,25,201,237,200,158,56,226,233) -IMAGE_DATA(158,38,58,245,157,176,138,119,37,122,151,170,170,42,206,9,60,5,228,188,188,60,30,144,163,162,162,120,95,151,150,150) -IMAGE_DATA(242,62,40,43,43,227,253,65,253,66,147,152,86,240,236,172,76,37,158,130,75,22,91,133,105,149,37,93,187,118,77,20) -IMAGE_DATA(49,66,126,81,81,17,182,109,245,229,59,1,41,79,193,245,244,233,211,240,218,236,137,117,174,107,185,156,157,214,96,173) -IMAGE_DATA(179,19,156,215,172,198,106,135,85,88,227,184,154,63,199,196,196,168,229,19,19,19,249,174,129,116,252,248,241,14,37,32) -IMAGE_DATA(158,237,4,98,99,99,113,236,216,49,36,36,36,240,124,26,11,82,158,22,136,130,130,2,118,156,43,228,162,123,85,209) -IMAGE_DATA(110,129,82,218,213,80,95,9,252,231,95,124,198,239,123,42,226,52,6,3,250,62,176,233,219,13,112,115,95,219,105,160) -IMAGE_DATA(17,184,217,251,159,93,6,3,159,173,94,124,240,153,153,47,199,223,231,124,164,84,246,237,63,61,112,41,247,2,172,109) -IMAGE_DATA(53,159,117,124,183,121,35,55,239,34,95,121,151,155,45,21,243,71,27,143,66,228,161,48,164,165,167,114,31,154,120,175) -IMAGE_DATA(45,158,136,61,118,132,13,250,102,56,185,56,138,109,216,250,221,22,100,229,156,199,225,168,72,172,113,114,208,200,143,24) -IMAGE_DATA(49,156,219,22,95,45,226,43,0,181,245,203,249,159,35,254,120,44,178,115,50,121,251,102,206,154,209,101,31,184,111,88) -IMAGE_DATA(135,99,241,49,124,210,121,122,109,194,158,144,32,246,28,139,132,19,113,88,182,124,73,183,1,117,216,176,87,184,159,178) -IMAGE_DATA(178,82,190,251,8,12,222,133,240,136,95,224,237,227,201,203,180,9,202,255,248,239,175,112,226,100,60,42,171,110,241,126) -IMAGE_DATA(251,110,135,47,251,251,205,211,58,168,255,229,63,222,134,15,243,119,54,45,21,177,49,209,240,159,48,86,107,223,75,251) -IMAGE_DATA(247,199,254,193,131,17,218,187,55,246,205,153,133,80,29,29,156,51,124,25,251,135,12,193,215,172,76,19,55,255,249,231) -IMAGE_DATA(17,222,167,15,46,142,28,137,236,225,195,17,63,224,5,88,246,146,35,84,183,23,206,27,26,226,2,203,63,63,98,4) -IMAGE_DATA(194,251,245,131,137,190,190,114,48,99,207,97,204,95,54,43,119,101,254,18,7,189,132,80,185,156,151,233,203,101,200,52) -IMAGE_DATA(26,134,196,193,47,241,178,243,195,134,241,182,45,144,180,37,240,197,23,241,187,177,49,230,117,48,105,204,38,172,223,147) -IMAGE_DATA(221,108,88,175,94,72,102,239,64,247,115,153,13,181,133,24,177,156,213,149,201,24,186,95,193,234,190,52,106,20,182,75) -IMAGE_DATA(120,111,246,94,121,172,126,155,190,125,249,115,14,189,135,129,129,88,238,207,238,139,198,140,65,38,123,239,44,35,35,4) -IMAGE_DATA(176,58,140,245,244,196,114,186,15,98,117,228,142,30,141,12,230,135,108,130,37,60,189,127,32,107,195,129,1,3,16,202) -IMAGE_DATA(250,94,202,74,109,190,101,109,10,97,242,103,18,109,164,193,96,252,248,113,108,128,79,215,74,127,158,56,161,147,147,25) -IMAGE_DATA(51,167,195,195,195,67,43,81,29,154,248,181,107,93,224,226,210,89,148,79,210,134,55,51,51,197,134,13,110,106,87,117) -IMAGE_DATA(117,90,178,244,107,37,158,68,193,70,219,139,234,80,245,79,121,116,53,54,42,186,148,58,158,222,87,240,79,54,231,206) -IMAGE_DATA(165,169,149,58,158,88,83,211,229,79,237,223,197,197,25,206,206,206,221,250,215,196,19,187,124,249,50,173,252,211,145,129) -IMAGE_DATA(86,126,129,119,119,119,135,147,147,19,87,119,254,233,152,209,210,114,15,169,103,82,69,222,213,213,21,235,214,185,242,84) -IMAGE_DATA(202,171,106,219,118,31,37,17,63,97,194,120,30,224,5,81,222,227,199,143,212,182,57,32,112,39,79,239,223,103,199,162) -IMAGE_DATA(27,229,220,86,117,60,82,208,110,109,125,208,137,149,242,21,21,237,172,173,157,149,90,158,118,79,244,142,180,168,61,124) -IMAGE_DATA(216,134,182,182,54,190,19,8,8,244,23,253,170,155,11,124,33,88,180,144,247,129,166,49,191,194,194,76,153,237,238,152) -IMAGE_DATA(48,123,246,44,254,243,133,84,148,167,41,170,143,125,133,69,68,19,57,108,102,202,97,61,179,23,179,95,132,157,59,125) -IMAGE_DATA(176,107,151,47,23,221,83,30,149,145,141,25,179,29,51,180,157,213,97,145,123,229,52,57,146,61,95,197,129,13,127,133) -IMAGE_DATA(189,173,25,190,249,230,27,54,192,220,177,113,227,122,46,154,224,148,103,103,99,134,189,238,83,113,194,195,152,251,163,159) -IMAGE_DATA(214,250,232,202,88,157,58,72,219,50,6,14,171,204,248,22,159,182,147,180,101,147,138,242,248,57,155,213,127,214,123,12) -IMAGE_DATA(44,167,201,208,75,71,153,95,177,210,172,203,129,76,151,133,165,25,82,188,222,232,196,159,245,126,93,137,143,101,91,66) -IMAGE_DATA(169,20,108,167,209,19,94,42,133,130,126,246,170,213,200,91,119,225,63,38,46,14,71,217,182,182,166,166,170,71,60,181) -IMAGE_DATA(183,190,190,14,181,181,53,156,45,46,46,210,154,111,96,59,187,186,58,250,216,87,141,234,234,74,92,185,82,136,172,236) -IMAGE_DATA(12,173,249,186,186,118,159,85,108,103,67,59,50,218,229,28,63,113,76,51,63,67,153,39,159,149,149,55,217,145,32,159) -IMAGE_DATA(109,217,227,149,2,184,54,124,101,229,13,182,85,191,140,223,82,78,179,109,125,156,18,75,99,71,19,111,111,107,202,119) -IMAGE_DATA(181,244,65,84,16,245,35,5,23,129,21,36,240,52,254,45,166,202,113,146,141,233,176,245,31,192,145,141,97,250,133,77) -IMAGE_DATA(85,251,221,167,136,138,117,27,13,243,142,241,207,231,159,161,140,63,211,220,210,70,166,127,125,50,255,212,6,3,91,59) -IMAGE_DATA(107,173,87,84,178,85,13,8,148,79,19,81,250,63,2,194,111,255,82,85,87,87,43,69,212,129,175,205,192,200,57,222) -IMAGE_DATA(60,143,206,196,194,153,72,42,225,235,234,149,43,87,248,249,143,108,137,17,88,250,153,104,157,187,11,63,15,254,250,235) -IMAGE_DATA(175,74,162,47,195,130,146,146,146,144,156,156,204,109,137,33,86,224,231,46,178,226,95,158,131,131,131,69,5,5,5,169) -IMAGE_DATA(21,217,170,242,227,63,247,194,184,207,58,139,242,213,73,149,95,232,155,209,35,169,242,79,35,41,79,63,183,245,68,2) -IMAGE_DATA(63,116,210,10,177,158,158,138,216,39,227,143,250,63,157,237,174,150,33,44,60,20,118,171,108,112,232,240,65,216,216,90) -IMAGE_DATA(33,42,250,48,236,29,108,113,228,72,52,203,239,60,246,72,142,107,236,89,192,72,128,189,163,29,190,255,225,123,248,250) -IMAGE_DATA(250,96,239,190,189,240,220,236,201,142,106,123,224,177,209,29,17,145,17,204,78,253,49,209,131,22,158,77,27,225,202,198) -IMAGE_DATA(6,157,239,215,111,116,67,226,169,147,216,190,227,59,132,135,135,115,190,160,32,31,155,189,58,31,149,23,44,248,18,27) -IMAGE_DATA(60,220,248,98,19,20,188,155,183,123,173,155,11,114,46,228,192,205,205,21,71,142,70,35,48,40,128,127,179,240,241,245) -IMAGE_DATA(198,148,41,31,42,241,219,119,108,229,59,134,255,249,241,7,118,156,222,136,31,252,118,240,93,64,89,217,117,172,93,231) -IMAGE_DATA(140,159,246,4,113,254,187,237,91,249,55,16,27,27,203,78,254,137,165,15,157,66,158,223,143,223,179,247,14,102,71,78) -IMAGE_DATA(31,201,46,122,6,219,61,46,131,169,217,114,237,119,6,164,51,63,107,119,190,84,213,128,231,219,217,167,225,251,246,109) -IMAGE_DATA(231,218,238,28,238,49,47,101,219,110,188,38,182,225,144,159,1,2,54,25,96,237,74,3,232,233,117,207,222,43,123,27) -IMAGE_DATA(173,21,35,209,90,231,136,214,218,85,104,169,178,67,99,185,37,130,189,12,176,119,139,1,94,232,47,87,98,169,78,145) -IMAGE_DATA(189,62,17,45,229,127,193,237,226,55,209,204,238,41,173,200,30,130,186,162,119,113,175,210,18,229,217,211,112,152,181,231) -IMAGE_DATA(229,161,79,234,144,178,247,25,219,210,33,129,175,202,53,18,69,245,148,101,79,133,255,198,39,239,34,182,189,222,149,243) -IMAGE_DATA(119,75,199,35,63,89,87,148,148,47,77,127,14,119,110,90,33,57,212,16,254,30,6,157,223,191,222,25,87,82,117,121) -IMAGE_DATA(250,160,198,82,73,45,37,122,140,239,135,194,148,62,168,189,186,10,9,193,134,234,251,144,177,36,161,255,69,69,200,209) -IMAGE_DATA(80,102,135,210,243,3,208,116,195,18,137,33,47,107,254,59,116,240,66,254,107,195,101,152,252,22,59,219,111,144,161,249) -IMAGE_DATA(150,45,20,229,206,248,109,127,103,94,218,167,234,198,207,160,129,50,164,31,210,193,237,91,222,72,217,103,160,145,239,106) -IMAGE_DATA(252,103,68,188,128,170,162,175,17,23,60,170,199,227,219,112,176,140,245,223,116,20,156,153,129,165,95,116,237,95,157,254) -IMAGE_DATA(54,89,134,253,187,255,6,79,135,231,159,106,110,206,155,217,15,159,205,122,14,47,14,144,228,247,244,215,132,185,129,189) -IMAGE_DATA(49,112,132,252,169,26,32,240,164,65,111,232,60,53,31,117,199,166,189,142,49,93,215,161,195,182,109,131,199,234,224,173) -IMAGE_DATA(37,186,48,89,175,39,250,38,190,187,58,12,70,201,241,174,181,46,236,92,244,225,151,108,130,168,219,108,85,106,178,70) -IMAGE_DATA(108,179,35,66,21,203,224,152,59,68,99,29,127,154,160,131,41,174,122,56,88,48,19,209,10,11,236,173,158,135,159,139) -IMAGE_DATA(95,85,18,241,210,58,134,141,104,103,251,27,202,241,190,189,46,34,10,103,227,168,194,28,7,174,189,138,93,37,99,69) -IMAGE_DATA(46,186,192,80,100,73,78,191,15,21,235,32,158,222,245,251,152,241,56,90,191,20,191,148,190,206,237,73,233,23,245,225) -IMAGE_DATA(114,113,144,18,75,242,45,127,71,233,29,254,190,165,31,142,86,155,226,228,245,183,145,153,247,39,4,229,143,198,222,43) -IMAGE_DATA(198,74,42,186,102,172,150,37,125,250,163,62,98,234,204,144,157,255,42,252,126,126,78,236,115,169,178,242,134,171,101,133) -IMAGE_DATA(191,239,233,242,217,216,29,170,135,57,126,189,97,60,171,23,6,24,201,149,202,53,177,66,121,76,193,36,158,14,25,167) -IMAGE_DATA(190,188,171,49,76,101,71,243,222,195,220,221,189,159,106,252,127,224,164,135,45,65,175,192,201,67,87,173,255,238,100,244) -IMAGE_DATA(190,14,38,46,236,11,135,13,134,152,255,165,28,186,125,122,62,71,250,189,36,199,200,169,58,24,54,73,7,250,47,202) -IMAGE_DATA(209,171,23,155,11,58,221,115,255,11,204,97,120,187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) -IMAGE_END_DATA(3808, 12) diff --git a/uppdev/stdapp/stdapp.lay b/uppdev/stdapp/stdapp.lay deleted file mode 100644 index a1bba0a91..000000000 --- a/uppdev/stdapp/stdapp.lay +++ /dev/null @@ -1,8 +0,0 @@ -LAYOUT(stdappLayoutMain, 488, 348) - ITEM(MenuBar, menu, HSizePosZ(0, 0).TopPosZ(0, 24)) - ITEM(StatusBar, status, HSizePosZ(0, 0).BottomPosZ(0, 24)) - ITEM(ToolBar, tools, HSizePosZ(0, 0).TopPosZ(24, 24)) -END_LAYOUT - -LAYOUT(stdappLayoutView, 400, 200) -END_LAYOUT diff --git a/uppdev/stdapp/stdapp.rc b/uppdev/stdapp/stdapp.rc deleted file mode 100644 index c1b6adf5b..000000000 --- a/uppdev/stdapp/stdapp.rc +++ /dev/null @@ -1 +0,0 @@ -5555 ICON DISCARDABLE "../StdAppUPT_16.ico" diff --git a/uppdev/stdapp/stdapp.t b/uppdev/stdapp/stdapp.t deleted file mode 100644 index 5d305958a..000000000 --- a/uppdev/stdapp/stdapp.t +++ /dev/null @@ -1,190 +0,0 @@ -#ifdef _MSC_VER -#pragma setlocale("C") -#endif -// stdappDef.hpp - -T_("February 19, 2007") -deDE("19. Februar 2007") - -T_("Based on Werner Wenzel's Standard Application UPT") -deDE("Basierend auf Werner Wenzels Standard Application UPT") - -T_("My Application") -deDE("Meine Anwendung") - -T_("V1.0.0.0") -deDE("V1.0.0.0") - - -// stdapp.cpp - -T_("Ready") -deDE("Bereit") - -T_("Options") -deDE("Optionen") - -T_("About ...") -deDE("Über ...") - -T_("Error saving configuration!") -deDE("Fehler beim Speichern der Konfiguration!") - -T_("&File") -deDE("&Datei") - -T_("&Edit") -deDE("&Bearbeiten") - -T_("&Settings") -deDE("&Einstellungen") - -T_("&Help") -deDE("&Hilfe") - -T_("New") -deDE("Neu") - -T_("Open ...") -deDE("Öffnen ...") - -T_("Save") -deDE("Speichern") - -T_("Save as ...") -deDE("Speichern unter ...") - -T_("Print ...") -deDE("Drucken ...") - -T_("Cut") -deDE("Ausschneiden") - -T_("Copy") -deDE("Kopieren") - -T_("Paste") -deDE("Einfügen") - -T_("Delete") -deDE("Löschen") - -T_("Undo") -deDE("Rückgängig") - -T_("Redo") -deDE("Wiederholen") - - -// stdappFile.cpp - -T_("Create a new object") -deDE("Ein neues Objekt erstellen") - -T_("Open an existing object") -deDE("Ein bestehendes Objekt öffnen") - -T_("Save the current object") -deDE("Das aktuelle Objekt speichern") - -T_("Save the current object under a different name") -deDE("Das aktuelle Objekt unter einem anderen Namen speichern") - -T_("Print the current object") -deDE("Das aktuelle Objekt drucken") - -T_("Exit") -deDE("Beenden") - -T_("Exit the application") -deDE("Die Anwendung beenden") - -T_("Opening aborted") -deDE("Öffnen abgebrochen") - -T_("Saving-as aborted") -deDE("Speichern unter ... abgebrochen") - - -// stdappEdit.cpp - -T_("Cut out the current object") -deDE("Das aktuelle Objekt ausschneiden") - -T_("Copy the current object to the clipboard") -deDE("Das aktuelle Objekt in die Zwischenablage kopieren") - -T_("Paste an object from the clipboard") -deDE("Ein Objekt aus der Zwischenablage einfügen") - -T_("Delete the current object") -deDE("Das aktuelle Objekt löschen") - -T_("Undo the last operation") -deDE("Die letzte Operation rückgängig machen") - -T_("Redo the last undone operation") -deDE("Die letzte rückgängig gemachte Operation wiederholen") - - -// stdappSettings.cpp - -T_("International") -deDE("International") - -T_("Select the application language") -deDE("Die Sprache der Anwendung auswählen") - -T_("Customize application") -deDE("Die Anwendung personalisieren") - -T_("Language") -deDE("Sprache") - -T_("Configuration") -deDE("Konfiguration") - -T_("Splash screen") -deDE("Splashscreen") - - -// stdappSettings.lay - -T_("OK") -deDE("OK") - -T_("Cancel") -deDE("Abbrechen") - -T_("Select language") -deDE("Sprache auswählen") - -T_("Restore configuration") -deDE("Konfiguration wiederherstellen") - -T_("Show splash screen") -deDE("Splashscreen zeigen") - - -// stdappHelp.cpp - -T_("Help") -deDE("Hilfe") - -T_("Get help with the application") -deDE("Hilfe bei der Anwendung erhalten") - -T_("Get information about the application") -deDE("Informationen über die Anwendung erhalten") - - -// EnhParentCtrl.cpp - -T_("Local menu 1") -deDE("Kontextmenü 1") - -T_("Local menu 2") -deDE("Kontextmenü 2") - -T_("Local menu 3") -deDE("Kontextmenü 3") diff --git a/uppdev/stdapp/stdapp.upp b/uppdev/stdapp/stdapp.upp deleted file mode 100644 index 74498819c..000000000 --- a/uppdev/stdapp/stdapp.upp +++ /dev/null @@ -1,31 +0,0 @@ -uses - CtrlLib; - -file - stdappDef.hpp charset "UTF-8", - UPP_Logo_033.iml charset "UTF-8", - stdappCfg.hpp charset "UTF-8", - stdappCfg.cpp charset "UTF-8", - stdappSplash.hpp charset "UTF-8", - stdappSplash.cpp charset "UTF-8", - stdapp.hpp charset "UTF-8", - stdapp.cpp charset "UTF-8", - stdapp.lay charset "UTF-8", - stdapp.iml charset "UTF-8", - stdapp.rc charset "UTF-8", - stdapp.t charset "UTF-8", - stdappFile.hpp charset "UTF-8", - stdappFile.cpp charset "UTF-8", - stdappEdit.hpp charset "UTF-8", - stdappEdit.cpp charset "UTF-8", - stdappSettings.hpp charset "UTF-8", - stdappSettings.cpp charset "UTF-8", - stdappSettings.lay charset "UTF-8", - stdappHelp.hpp charset "UTF-8", - stdappHelp.cpp charset "UTF-8", - stdappHelp.lay charset "UTF-8", - EnhParentCtrl.hpp charset "UTF-8", - EnhParentCtrl.cpp charset "UTF-8"; - -mainconfig - "" = "GUI"; diff --git a/uppdev/stdapp/stdappCfg.cpp b/uppdev/stdapp/stdappCfg.cpp deleted file mode 100644 index 52fb28e1d..000000000 --- a/uppdev/stdapp/stdappCfg.cpp +++ /dev/null @@ -1,42 +0,0 @@ -#include - -Cfg::Cfg( - const int init_language, - const bool init_restore_cfg, - const bool init_show_splash, - const bool init_maximized, - const bool init_minimized, - const int init_main_window_left, - const int init_main_window_top, - const int init_main_window_width, - const int init_main_window_height - ) - : - restore_cfg(init_restore_cfg), - show_splash(init_show_splash), - maximized(init_maximized), - minimized(init_minimized), - main_window_left(init_main_window_left), - main_window_top(init_main_window_top), - main_window_width(init_main_window_width), - main_window_height(init_main_window_height), - language(init_language) -{ -} - -/* text configuration file selected -void Cfg::Serialize(Stream& stream) -{ - stream - % restore_cfg - % show_splash - % maximized - % minimized - % main_window_left - % main_window_top - % main_window_width - % main_window_height - % language - ; -} -text configuration file selected */ diff --git a/uppdev/stdapp/stdappCfg.hpp b/uppdev/stdapp/stdappCfg.hpp deleted file mode 100644 index 6b64a67df..000000000 --- a/uppdev/stdapp/stdappCfg.hpp +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef STDAPP_CFG_HPP -#define STDAPP_CFG_HPP - -#include - -class Cfg -{ -public: - bool restore_cfg; - bool show_splash; - bool maximized; - bool minimized; - int main_window_left; - int main_window_top; - int main_window_width; - int main_window_height; - int language; - - Cfg( - const int init_language = default_language, - const bool init_restore_cfg = default_restore_cfg, - const bool init_show_splash = default_show_splash, - const bool init_maximized = default_maximized, - const bool init_minimized = default_minimized, - const int init_main_window_left = default_main_window_left, - const int init_main_window_top = default_main_window_top, - const int init_main_window_width = default_main_window_width, - const int init_main_window_height = default_main_window_height - ); - - /* text configuration file selected - void Serialize(Stream& stream); - text configuration file selected */ -}; - -#endif diff --git a/uppdev/stdapp/stdappDef.hpp b/uppdev/stdapp/stdappDef.hpp deleted file mode 100644 index 7c42726d8..000000000 --- a/uppdev/stdapp/stdappDef.hpp +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef STDAPP_DEF_HPP -#define STDAPP_DEF_HPP - -#include -using namespace Upp; - -#define APP_COPYRIGHT t_("February 19, 2007"); -#define APP_SUBTITLE t_("Based on Werner Wenzel's Standard Application UPT") -#define APP_TITLE t_("My Application") -#define APP_VERSION t_("V1.0.0.0") - -#define SPLASH_FONT_1 Courier -#define SPLASH_FONT_2 Courier -#define SPLASH_FONT_3 Courier -#define SPLASH_FONT_4 Courier -#define SPLASH_FONT_SIZE_1 16 -#define SPLASH_FONT_SIZE_2 12 -#define SPLASH_FONT_SIZE_3 12 -#define SPLASH_FONT_SIZE_4 12 -#define SPLASH_INK_COLOR_1 Blue -#define SPLASH_INK_COLOR_2 Blue -#define SPLASH_INK_COLOR_3 Blue -#define SPLASH_INK_COLOR_4 Blue -#define SPLASH_PAPER_COLOR Yellow -#define SPLASH_PERIOD 5000 -#define SPLASH_RECT_CX 600 -#define SPLASH_RECT_CY 70 - -const int default_language = LNG_ENGLISH; -const int default_main_window_height = 600; -const int default_main_window_left = 0; -const int default_main_window_top = 0; -const int default_main_window_width = 800; -const bool default_maximized = false; -const bool default_minimized = false; -const bool default_show_splash = true; -const bool default_restore_cfg = false; -const int help_window_height = 400; -const int help_window_left = 0; -const int help_window_top = 0; -const int help_window_width = 600; -const String IniFile = "stdapp.ini"; - -#endif diff --git a/uppdev/stdapp/stdappEdit.cpp b/uppdev/stdapp/stdappEdit.cpp deleted file mode 100644 index 3f1eae5e6..000000000 --- a/uppdev/stdapp/stdappEdit.cpp +++ /dev/null @@ -1,42 +0,0 @@ -#include - -void stdapp::Edit(Bar& bar) -{ - bar.Add(t_("Cut"), THISBACK(OnCut)).Key(K_CTRL_X).Help(t_("Cut out the current object")); - bar.Add(t_("Copy"), THISBACK(OnCopy)).Key(K_CTRL_C).Help(t_("Copy the current object to the clipboard")); - bar.Add(t_("Paste"), THISBACK(OnPaste)).Key(K_CTRL_V).Help(t_("Paste an object from the clipboard")); - bar.Add(t_("Delete"), THISBACK(OnDelete)).Help(t_("Delete the current object")); - bar.MenuSeparator(); - bar.Add(t_("Undo"), THISBACK(OnUndo)).Key(K_CTRL_Z).Help(t_("Undo the last operation")); - bar.Add(t_("Redo"), THISBACK(OnRedo)).Key(K_SHIFT_CTRL_Z).Help(t_("Redo the last undone operation")); -} - -void stdapp::OnCut() -{ - Exclamation("You still have to write your own \"Cut\" code!"); -} - -void stdapp::OnCopy() -{ - Exclamation("You still have to write your own \"Copy\" code!"); -} - -void stdapp::OnPaste() -{ - Exclamation("You still have to write your own \"Paste\" code!"); -} - -void stdapp::OnDelete() -{ - Exclamation("You still have to write your own \"Delete\" code!"); -} - -void stdapp::OnUndo() -{ - Exclamation("You still have to write your own \"Undo\" code!"); -} - -void stdapp::OnRedo() -{ - Exclamation("You still have to write your own \"Redo\" code!"); -} diff --git a/uppdev/stdapp/stdappEdit.hpp b/uppdev/stdapp/stdappEdit.hpp deleted file mode 100644 index 71ce66c7b..000000000 --- a/uppdev/stdapp/stdappEdit.hpp +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef STDAPP_EDIT_HPP -#define STDAPP_EDIT_HPP - -void Edit(Bar& bar); -void OnCut(); -void OnCopy(); -void OnPaste(); -void OnDelete(); -void OnUndo(); -void OnRedo(); - -#endif diff --git a/uppdev/stdapp/stdappFile.cpp b/uppdev/stdapp/stdappFile.cpp deleted file mode 100644 index ce94b19eb..000000000 --- a/uppdev/stdapp/stdappFile.cpp +++ /dev/null @@ -1,60 +0,0 @@ -#include - -void stdapp::File(Bar& bar) -{ - bar.Add(t_("New"), THISBACK(OnNew)).Key(K_CTRL_N).Help(t_("Create a new object")); - bar.Add(t_("Open ..."), THISBACK(OnLoad)).Key(K_CTRL_L).Help(t_("Open an existing object")); - bar.MenuSeparator(); - bar.Add(t_("Save"), THISBACK(OnSave)).Key(K_CTRL_S).Help(t_("Save the current object")); - bar.Add(t_("Save as ..."), THISBACK(OnSaveAs)).Key(K_CTRL_A).Help(t_("Save the current object under a different name")); - bar.MenuSeparator(); - bar.Add(t_("Print ..."), THISBACK(OnPrint)).Key(K_CTRL_P).Help(t_("Print the current object")); - bar.MenuSeparator(); - bar.Add(t_("Exit"), THISBACK(Exit)).Key(K_CTRL_Q).Help(t_("Exit the application")); -} - -void stdapp::OnNew() -{ - Exclamation("You still have to write your own \"New\" code!"); -} - -void stdapp::OnLoad() -{ - static FileSelector fs; - - if(fs.ExecuteOpen()) - { - String file_name = fs; - Exclamation("You still have to complete your own \"OnLoad\" code!"); - } - else - status.Temporary(t_("Opening aborted")); -} - -void stdapp::OnSave() -{ - Exclamation("You still have to write your own \"Save\" code!"); -} - -void stdapp::OnSaveAs() -{ - static FileSelector fs; - - if(fs.ExecuteSaveAs()) - { - String file_name = fs; - Exclamation("You still have to complete your own \"Save-as\" code!"); - } - else - status.Temporary(t_("Saving-as aborted")); -} - -void stdapp::OnPrint() -{ - Exclamation("You still have to write your own \"Print\" code!"); -} - -void stdapp::Exit() -{ - Close(); -} diff --git a/uppdev/stdapp/stdappFile.hpp b/uppdev/stdapp/stdappFile.hpp deleted file mode 100644 index 686a6d7a9..000000000 --- a/uppdev/stdapp/stdappFile.hpp +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef STDAPP_FILE_HPP -#define STDAPP_FILE_HPP - -void File(Bar& bar); -void OnNew(); -void OnLoad(); -void OnSave(); -void OnSaveAs(); -void OnPrint(); -void Exit(); - -#endif diff --git a/uppdev/stdapp/stdappHelp.cpp b/uppdev/stdapp/stdappHelp.cpp deleted file mode 100644 index 786eea2fd..000000000 --- a/uppdev/stdapp/stdappHelp.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#include - -void stdapp::Help(Bar& bar) -{ - bar.Add(t_("Help"), THISBACK(OnHelp)).Key(K_F1).Help(t_("Get help with the application")); - bar.Add(t_("About ..."), THISBACK(OnAbout)).Key(K_CTRL_I).Help(t_("Get information about the application")); -} - -void stdapp::OnAbout() -{ - Image logo = UPP_LogoImg::AppLogo(); - about.logo_ctrl.SetImage(logo); - about.text_1 = APP_TITLE; - about.text_2 = APP_VERSION; - about.text_3 = APP_SUBTITLE; - about.text_4 = APP_COPYRIGHT; - about.ok <<= THISBACK(OnAboutOK); - about.Execute(); -} - -void stdapp::OnAboutOK() -{ - about.Close(); -} - -void stdapp::OnHelp() -{ - switch(cfg.language) - { - case LNG_('D', 'E', 'D', 'E'): - help.GoTo("topic://stdapp/stdappHelp/Inhaltsverzeichnis$de-de"); - break; - default: - help.GoTo("topic://stdapp/stdappHelp/Index$en-us"); - } - help.Execute(); -} diff --git a/uppdev/stdapp/stdappHelp.hpp b/uppdev/stdapp/stdappHelp.hpp deleted file mode 100644 index 04dfe7773..000000000 --- a/uppdev/stdapp/stdappHelp.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef STDAPP_HELP_HPP -#define STDAPP_HELP_HPP - -void Help(Bar& bar); -void OnAbout(); -void OnAboutOK(); -void OnHelp(); - -#endif diff --git a/uppdev/stdapp/stdappHelp.lay b/uppdev/stdapp/stdappHelp.lay deleted file mode 100644 index d4c0970c9..000000000 --- a/uppdev/stdapp/stdappHelp.lay +++ /dev/null @@ -1,8 +0,0 @@ -LAYOUT(stdappLayoutAbout, 500, 123) - ITEM(ImageCtrl, logo_ctrl, LeftPosZ(0, 155).TopPosZ(0, 123)) - ITEM(StaticText, text_1, SetAlign(ALIGN_CENTER).SetFont(StdFont(16).Bold()).RightPosZ(8, 328).TopPosZ(8, 20)) - ITEM(StaticText, text_2, SetAlign(ALIGN_CENTER).SetFont(StdFont(12).Bold()).RightPosZ(8, 328).TopPosZ(28, 20)) - ITEM(StaticText, text_3, SetAlign(ALIGN_CENTER).SetFont(StdFont(12).Italic()).RightPosZ(8, 328).TopPosZ(48, 20)) - ITEM(StaticText, text_4, SetAlign(ALIGN_CENTER).SetFont(StdFont(10)).RightPosZ(8, 328).TopPosZ(68, 20)) - ITEM(Button, ok, SetLabel(t_("OK")).RightPosZ(132, 80).VSizePosZ(96, 7)) -END_LAYOUT diff --git a/uppdev/stdapp/stdappHelp.tpp/Index$en-us.tpp b/uppdev/stdapp/stdappHelp.tpp/Index$en-us.tpp deleted file mode 100644 index 124588b80..000000000 --- a/uppdev/stdapp/stdappHelp.tpp/Index$en-us.tpp +++ /dev/null @@ -1,3 +0,0 @@ -TITLE("My Application V1.0.0.0 Help") -COMPRESSED -120,156,173,209,77,11,130,64,16,6,224,191,50,144,117,136,204,117,38,58,20,29,162,130,78,17,104,39,81,183,143,13,2,81,193,245,84,253,247,74,169,8,130,161,214,61,237,206,46,239,187,240,4,96,89,162,39,90,130,89,163,185,58,110,203,68,135,193,57,190,182,23,43,123,227,65,80,136,241,164,59,4,127,187,75,20,100,71,152,101,169,86,169,46,58,225,243,170,222,69,58,203,79,123,57,146,142,116,54,107,95,198,158,62,76,243,252,227,176,84,201,125,224,87,15,99,33,92,105,169,84,218,101,17,13,160,26,194,253,139,110,29,247,115,170,87,238,244,59,248,35,29,130,40,2,251,18,62,159,84,53,253,87,149,65,7,178,29,104,220,65,108,7,213,29,131,255,37,240,155,4,54,32,129,188,4,154,74,32,47,129,166,18,200,75,96,35,18,244,77,130,26,144,32,94,130,76,37,136,151,32,83,9,226,37,30,29,20,222,0,209,162,154,62, diff --git a/uppdev/stdapp/stdappHelp.tpp/Inhaltsverzeichnis$de-de.tpp b/uppdev/stdapp/stdappHelp.tpp/Inhaltsverzeichnis$de-de.tpp deleted file mode 100644 index e9e3e57e4..000000000 --- a/uppdev/stdapp/stdappHelp.tpp/Inhaltsverzeichnis$de-de.tpp +++ /dev/null @@ -1,3 +0,0 @@ -TITLE("Meine Anwendung V1.0.0.0 Hilfe") -COMPRESSED -120,156,173,209,207,11,130,48,20,192,241,127,101,144,117,136,172,245,94,116,40,58,4,5,117,145,64,61,137,58,201,133,130,153,232,234,208,143,255,61,75,42,58,68,171,233,105,190,141,247,61,124,28,162,105,180,67,27,244,203,55,154,241,77,176,79,132,235,156,252,75,115,110,232,182,73,156,130,142,39,237,33,89,166,81,144,136,226,192,243,35,143,215,81,26,23,45,247,113,87,157,60,177,203,226,53,27,177,30,235,217,43,139,249,166,8,167,89,246,246,179,224,73,57,176,34,190,13,152,79,105,159,105,33,103,122,200,189,1,185,15,137,145,119,73,57,175,54,254,188,216,78,5,207,197,107,251,91,130,56,158,71,244,179,251,122,244,168,117,159,69,165,20,200,165,160,134,20,202,165,176,74,13,254,23,130,15,66,80,139,16,72,10,129,186,16,72,10,129,186,16,72,10,65,45,66,248,65,8,107,17,66,73,33,84,23,66,73,33,84,23,66,73,161,91,10,221,43,40,236,179,16, diff --git a/uppdev/stdapp/stdappHelp.tpp/Subtopic_001_001$en-us.tpp b/uppdev/stdapp/stdappHelp.tpp/Subtopic_001_001$en-us.tpp deleted file mode 100644 index d72448760..000000000 --- a/uppdev/stdapp/stdappHelp.tpp/Subtopic_001_001$en-us.tpp +++ /dev/null @@ -1,3 +0,0 @@ -TITLE("My Application V1.0.0.0 Help") -COMPRESSED -120,156,139,86,80,81,49,208,49,80,54,32,0,172,92,82,211,18,75,115,74,98,163,171,227,107,85,93,253,116,67,131,21,162,139,13,172,109,181,204,20,130,75,147,74,242,11,50,147,21,128,166,24,234,1,177,90,44,76,10,194,138,3,75,39,88,37,232,39,232,135,6,132,36,196,7,151,164,56,22,20,160,112,60,82,115,128,2,158,121,41,169,21,9,42,169,121,9,186,165,197,113,10,33,137,73,57,169,10,249,105,10,206,249,121,37,169,121,37,197,164,154,23,2,86,24,15,116,19,194,208,208,2,136,41,80,199,25,41,184,148,230,230,86,42,100,0,53,40,148,164,86,148,196,2,0,1,1,85,165, diff --git a/uppdev/stdapp/stdappHelp.tpp/Subtopic_001_002$en-us.tpp b/uppdev/stdapp/stdappHelp.tpp/Subtopic_001_002$en-us.tpp deleted file mode 100644 index b1e41d40c..000000000 --- a/uppdev/stdapp/stdappHelp.tpp/Subtopic_001_002$en-us.tpp +++ /dev/null @@ -1,3 +0,0 @@ -TITLE("My Application V1.0.0.0 Help") -COMPRESSED -120,156,139,86,80,81,49,208,49,80,54,32,0,172,92,82,211,18,75,115,74,98,163,171,227,107,85,93,253,116,67,131,21,162,139,13,172,109,181,204,20,130,75,147,74,242,11,50,147,21,128,166,24,234,25,24,24,169,197,194,164,32,172,56,176,116,130,85,130,126,130,126,104,64,72,66,124,112,73,138,99,65,1,10,199,35,53,7,40,224,153,151,146,90,145,160,146,154,151,160,91,90,28,167,16,146,152,148,147,170,144,159,166,224,156,159,87,146,154,87,82,76,170,121,33,96,133,241,64,119,33,12,13,45,128,152,2,117,156,145,130,75,105,110,110,165,66,6,80,131,66,73,106,69,73,44,0,1,193,85,166, diff --git a/uppdev/stdapp/stdappHelp.tpp/Subtopic_001_003$en-us.tpp b/uppdev/stdapp/stdappHelp.tpp/Subtopic_001_003$en-us.tpp deleted file mode 100644 index 3028abff5..000000000 --- a/uppdev/stdapp/stdappHelp.tpp/Subtopic_001_003$en-us.tpp +++ /dev/null @@ -1,3 +0,0 @@ -TITLE("My Application V1.0.0.0 Help") -COMPRESSED -120,156,139,86,80,81,49,208,49,80,54,32,0,172,92,82,211,18,75,115,74,98,163,171,227,107,85,93,253,116,67,131,21,162,139,13,172,109,181,204,20,130,75,147,74,242,11,50,147,21,128,166,24,234,25,24,24,171,197,194,164,32,172,56,176,116,130,85,130,126,130,126,104,64,72,66,124,112,73,138,99,65,1,10,199,35,53,7,40,224,153,151,146,90,145,160,146,154,151,160,91,90,28,167,16,146,152,148,147,170,144,159,166,224,156,159,87,146,154,87,82,76,170,121,33,96,133,241,64,119,33,12,13,45,128,152,2,117,156,145,130,75,105,110,110,165,66,6,80,131,66,73,106,69,73,44,0,2,129,85,167, diff --git a/uppdev/stdapp/stdappHelp.tpp/Subtopic_002_001$en-us.tpp b/uppdev/stdapp/stdappHelp.tpp/Subtopic_002_001$en-us.tpp deleted file mode 100644 index 811c9e7c7..000000000 --- a/uppdev/stdapp/stdappHelp.tpp/Subtopic_002_001$en-us.tpp +++ /dev/null @@ -1,3 +0,0 @@ -TITLE("My Application V1.0.0.0 Help") -COMPRESSED -120,156,139,86,80,81,49,208,49,80,54,32,0,172,92,82,211,18,75,115,74,98,163,171,227,107,85,93,253,116,67,131,21,162,139,13,172,109,181,204,20,130,75,147,74,242,11,50,147,21,128,166,24,233,25,24,24,170,197,194,164,32,172,56,176,116,130,85,130,126,130,126,104,64,72,66,124,112,73,138,99,65,1,10,199,35,53,7,40,224,153,151,146,90,145,160,146,154,151,160,91,90,28,167,16,146,152,148,147,170,144,159,166,224,156,159,87,146,154,87,82,76,170,121,33,96,133,241,64,119,33,12,13,45,128,152,2,117,156,145,130,75,105,110,110,165,66,6,80,131,66,73,106,69,73,44,0,1,241,85,167, diff --git a/uppdev/stdapp/stdappHelp.tpp/Subtopic_002_002$en-us.tpp b/uppdev/stdapp/stdappHelp.tpp/Subtopic_002_002$en-us.tpp deleted file mode 100644 index 3da1676b0..000000000 --- a/uppdev/stdapp/stdappHelp.tpp/Subtopic_002_002$en-us.tpp +++ /dev/null @@ -1,3 +0,0 @@ -TITLE("My Application V1.0.0.0 Help") -COMPRESSED -120,156,139,86,80,81,49,208,49,80,54,32,0,172,92,82,211,18,75,115,74,98,163,171,227,107,85,93,253,116,67,131,21,162,139,13,172,109,181,204,20,130,75,147,74,242,11,50,147,21,128,166,24,233,1,177,90,44,76,10,194,138,3,75,39,88,37,232,39,232,135,6,132,36,196,7,151,164,56,22,20,160,112,60,82,115,128,2,158,121,41,169,21,9,42,169,121,9,186,165,197,113,10,33,137,73,57,169,10,249,105,10,206,249,121,37,169,121,37,197,164,154,23,2,86,24,15,116,19,194,208,208,2,136,41,80,199,25,41,184,148,230,230,86,42,100,0,53,40,148,164,86,148,196,2,0,2,177,85,168, diff --git a/uppdev/stdapp/stdappHelp.tpp/Subtopic_002_003$en-us.tpp b/uppdev/stdapp/stdappHelp.tpp/Subtopic_002_003$en-us.tpp deleted file mode 100644 index b619cf694..000000000 --- a/uppdev/stdapp/stdappHelp.tpp/Subtopic_002_003$en-us.tpp +++ /dev/null @@ -1,3 +0,0 @@ -TITLE("My Application V1.0.0.0 Help") -COMPRESSED -120,156,139,86,80,81,49,208,49,80,54,32,0,172,92,82,211,18,75,115,74,98,163,171,227,107,85,93,253,116,67,131,21,162,139,13,172,109,181,204,20,130,75,147,74,242,11,50,147,21,128,166,24,233,25,24,24,171,197,194,164,32,172,56,176,116,130,85,130,126,130,126,104,64,72,66,124,112,73,138,99,65,1,10,199,35,53,7,40,224,153,151,146,90,145,160,146,154,151,160,91,90,28,167,16,146,152,148,147,170,144,159,166,224,156,159,87,146,154,87,82,76,170,121,33,96,133,241,64,119,33,12,13,45,128,152,2,117,156,145,130,75,105,110,110,165,66,6,80,131,66,73,106,69,73,44,0,3,113,85,169, diff --git a/uppdev/stdapp/stdappHelp.tpp/Subtopic_003_001$en-us.tpp b/uppdev/stdapp/stdappHelp.tpp/Subtopic_003_001$en-us.tpp deleted file mode 100644 index dd1576783..000000000 --- a/uppdev/stdapp/stdappHelp.tpp/Subtopic_003_001$en-us.tpp +++ /dev/null @@ -1,3 +0,0 @@ -TITLE("My Application V1.0.0.0 Help") -COMPRESSED -120,156,139,86,80,81,49,208,49,80,54,32,0,172,92,82,211,18,75,115,74,98,163,171,227,107,85,93,253,116,67,131,21,162,139,13,172,109,181,204,20,130,75,147,74,242,11,50,147,21,128,166,24,235,25,24,24,170,197,194,164,32,172,56,176,116,130,85,130,126,130,126,104,64,72,66,124,112,73,138,99,65,1,10,199,35,53,7,40,224,153,151,146,90,145,160,146,154,151,160,91,90,28,167,16,146,152,148,147,170,144,159,166,224,156,159,87,146,154,87,82,76,170,121,33,96,133,241,64,119,33,12,13,45,128,152,2,117,156,145,130,75,105,110,110,165,66,6,80,131,66,73,106,69,73,44,0,2,225,85,169, diff --git a/uppdev/stdapp/stdappHelp.tpp/Subtopic_003_002$en-us.tpp b/uppdev/stdapp/stdappHelp.tpp/Subtopic_003_002$en-us.tpp deleted file mode 100644 index bd5b694a3..000000000 --- a/uppdev/stdapp/stdappHelp.tpp/Subtopic_003_002$en-us.tpp +++ /dev/null @@ -1,3 +0,0 @@ -TITLE("My Application V1.0.0.0 Help") -COMPRESSED -120,156,139,86,80,81,49,208,49,80,54,32,0,172,92,82,211,18,75,115,74,98,163,171,227,107,85,93,253,116,67,131,21,162,139,13,172,109,181,204,20,130,75,147,74,242,11,50,147,21,128,166,24,235,25,24,24,169,197,194,164,32,172,56,176,116,130,85,130,126,130,126,104,64,72,66,124,112,73,138,99,65,1,10,199,35,53,7,40,224,153,151,146,90,145,160,146,154,151,160,91,90,28,167,16,146,152,148,147,170,144,159,166,224,156,159,87,146,154,87,82,76,170,121,33,96,133,241,64,119,33,12,13,45,128,152,2,117,156,145,130,75,105,110,110,165,66,6,80,131,66,73,106,69,73,44,0,3,161,85,170, diff --git a/uppdev/stdapp/stdappHelp.tpp/Subtopic_003_003$en-us.tpp b/uppdev/stdapp/stdappHelp.tpp/Subtopic_003_003$en-us.tpp deleted file mode 100644 index ff5ae5ead..000000000 --- a/uppdev/stdapp/stdappHelp.tpp/Subtopic_003_003$en-us.tpp +++ /dev/null @@ -1,3 +0,0 @@ -TITLE("My Application V1.0.0.0 Help") -COMPRESSED -120,156,139,86,80,81,49,208,49,80,54,32,0,172,92,82,211,18,75,115,74,98,163,171,227,107,85,93,253,116,67,131,21,162,139,13,172,109,181,204,20,130,75,147,74,242,11,50,147,21,128,166,24,235,1,177,90,44,76,10,194,138,3,75,39,88,37,232,39,232,135,6,132,36,196,7,151,164,56,22,20,160,112,60,82,115,128,2,158,121,41,169,21,9,42,169,121,9,186,165,197,113,10,33,137,73,57,169,10,249,105,10,206,249,121,37,169,121,37,197,164,154,23,2,86,24,15,116,19,194,208,208,2,136,41,80,199,25,41,184,148,230,230,86,42,100,0,53,40,148,164,86,148,196,2,0,4,97,85,171, diff --git a/uppdev/stdapp/stdappHelp.tpp/Thema_001$de-de.tpp b/uppdev/stdapp/stdappHelp.tpp/Thema_001$de-de.tpp deleted file mode 100644 index e7f1abea7..000000000 --- a/uppdev/stdapp/stdappHelp.tpp/Thema_001$de-de.tpp +++ /dev/null @@ -1,3 +0,0 @@ -TITLE("Meine Anwendung V1.0.0.0 Hilfe") -COMPRESSED -120,156,139,86,80,81,49,208,49,80,54,32,0,172,92,82,211,18,75,115,74,98,163,171,227,107,85,93,253,116,67,131,21,162,139,13,172,109,181,204,20,66,50,82,115,19,21,252,138,244,20,12,12,12,213,98,97,194,16,86,92,73,126,65,102,114,130,85,130,126,130,126,104,64,72,66,124,112,73,138,99,65,1,10,199,35,53,7,36,144,87,146,90,84,2,50,43,33,30,104,16,132,80,73,73,77,208,77,73,141,83,64,200,194,108,210,131,219,70,145,29,70,4,236,48,162,130,29,198,4,236,48,134,216,65,114,144,121,230,101,36,230,148,20,151,165,22,85,165,102,38,103,228,101,22,35,44,194,148,139,5,0,132,31,158,144, diff --git a/uppdev/stdapp/stdappHelp.tpp/Thema_002$de-de.tpp b/uppdev/stdapp/stdappHelp.tpp/Thema_002$de-de.tpp deleted file mode 100644 index a2200f8eb..000000000 --- a/uppdev/stdapp/stdappHelp.tpp/Thema_002$de-de.tpp +++ /dev/null @@ -1,3 +0,0 @@ -TITLE("Meine Anwendung V1.0.0.0 Hilfe") -COMPRESSED -120,156,139,86,80,81,49,208,49,80,54,32,0,172,92,82,211,18,75,115,74,98,163,171,227,107,85,93,253,116,67,131,21,162,139,13,172,109,181,204,20,66,50,82,115,19,21,252,138,244,20,12,12,140,212,98,97,194,16,86,92,73,126,65,102,114,130,85,130,126,130,126,104,64,72,66,124,112,73,138,99,65,1,10,199,35,53,7,36,144,87,146,90,84,2,50,43,33,30,104,16,136,48,76,80,73,73,77,208,77,73,141,83,64,200,194,108,210,3,202,83,193,14,35,2,118,24,81,193,14,99,2,118,24,67,236,32,57,200,60,243,50,18,115,74,138,203,82,139,170,82,51,147,51,242,50,139,17,22,97,202,197,2,0,138,249,158,151, diff --git a/uppdev/stdapp/stdappHelp.tpp/Thema_003$de-de.tpp b/uppdev/stdapp/stdappHelp.tpp/Thema_003$de-de.tpp deleted file mode 100644 index e28418888..000000000 --- a/uppdev/stdapp/stdappHelp.tpp/Thema_003$de-de.tpp +++ /dev/null @@ -1,3 +0,0 @@ -TITLE("Meine Anwendung V1.0.0.0 Hilfe") -COMPRESSED -120,156,139,86,80,81,49,208,49,80,54,32,0,172,92,82,211,18,75,115,74,98,163,171,227,107,85,93,253,116,67,131,21,162,139,13,172,109,181,204,20,66,50,82,115,19,21,252,138,244,20,12,12,140,213,98,97,194,16,86,92,73,126,65,102,114,130,85,130,126,130,126,104,64,72,66,124,112,73,138,99,65,1,10,199,35,53,7,36,144,87,146,90,84,2,50,43,33,30,104,16,136,48,76,80,73,73,77,208,77,73,141,83,64,200,194,108,210,3,202,83,193,14,35,2,118,24,81,193,14,99,2,118,64,67,141,228,32,243,204,203,72,204,41,41,46,75,45,170,74,205,76,206,200,203,44,70,88,132,41,23,11,0,145,211,158,158, diff --git a/uppdev/stdapp/stdappHelp.tpp/Topic_001$en-us.tpp b/uppdev/stdapp/stdappHelp.tpp/Topic_001$en-us.tpp deleted file mode 100644 index c8a78bcfb..000000000 --- a/uppdev/stdapp/stdappHelp.tpp/Topic_001$en-us.tpp +++ /dev/null @@ -1,3 +0,0 @@ -TITLE("My Application V1.0.0.0 Help") -COMPRESSED -120,156,139,86,80,81,49,208,49,80,54,32,0,172,92,82,211,18,75,115,74,98,163,171,227,107,85,93,253,116,67,131,21,162,139,13,172,109,181,204,20,66,242,11,50,147,21,128,70,24,170,197,194,196,32,172,184,18,144,84,130,85,130,126,130,126,104,64,72,66,124,112,73,138,99,65,1,10,199,35,53,7,40,16,92,154,4,81,27,15,52,6,66,168,164,230,37,232,150,22,199,41,192,228,192,86,232,193,173,161,192,112,35,220,134,27,81,108,184,49,110,195,141,33,134,147,28,58,158,121,41,169,21,8,99,67,18,147,114,82,21,242,211,20,156,243,243,74,82,243,74,138,99,1,242,255,143,233, diff --git a/uppdev/stdapp/stdappHelp.tpp/Topic_002$en-us.tpp b/uppdev/stdapp/stdappHelp.tpp/Topic_002$en-us.tpp deleted file mode 100644 index 148d692a2..000000000 --- a/uppdev/stdapp/stdappHelp.tpp/Topic_002$en-us.tpp +++ /dev/null @@ -1,3 +0,0 @@ -TITLE("My Application V1.0.0.0 Help") -COMPRESSED -120,156,139,86,80,81,49,208,49,80,54,32,0,172,92,82,211,18,75,115,74,98,163,171,227,107,85,93,253,116,67,131,21,162,139,13,172,109,181,204,20,66,242,11,50,147,21,128,70,24,169,197,194,196,32,172,184,18,144,84,130,85,130,126,130,126,104,64,72,66,124,112,73,138,99,65,1,10,199,35,53,7,40,16,92,154,4,81,27,15,52,6,68,24,38,168,164,230,37,232,150,22,199,41,192,228,192,86,232,1,165,40,54,220,8,183,225,70,20,27,110,140,219,112,99,136,225,36,135,142,103,94,74,106,5,194,216,144,196,164,156,84,133,252,52,5,231,252,188,146,212,188,146,226,88,0,249,41,143,240, diff --git a/uppdev/stdapp/stdappHelp.tpp/Topic_003$en-us.tpp b/uppdev/stdapp/stdappHelp.tpp/Topic_003$en-us.tpp deleted file mode 100644 index 13ef614b3..000000000 --- a/uppdev/stdapp/stdappHelp.tpp/Topic_003$en-us.tpp +++ /dev/null @@ -1,3 +0,0 @@ -TITLE("My Application V1.0.0.0 Help") -COMPRESSED -120,156,139,86,80,81,49,208,49,80,54,32,0,172,92,82,211,18,75,115,74,98,163,171,227,107,85,93,253,116,67,131,21,162,139,13,172,109,181,204,20,66,242,11,50,147,21,128,70,24,171,197,194,196,32,172,184,18,144,84,130,85,130,126,130,126,104,64,72,66,124,112,73,138,99,65,1,10,199,35,53,7,40,16,92,154,4,81,27,15,52,6,68,24,38,168,164,230,37,232,150,22,199,41,192,228,192,86,232,1,165,40,54,220,8,183,225,70,20,27,110,140,219,112,104,0,145,28,58,158,121,41,169,21,8,99,67,18,147,114,82,21,242,211,20,156,243,243,74,82,243,74,138,99,1,255,83,143,247, diff --git a/uppdev/stdapp/stdappHelp.tpp/Unterthema_001_001$de-de.tpp b/uppdev/stdapp/stdappHelp.tpp/Unterthema_001_001$de-de.tpp deleted file mode 100644 index 005cc2c2f..000000000 --- a/uppdev/stdapp/stdappHelp.tpp/Unterthema_001_001$de-de.tpp +++ /dev/null @@ -1,3 +0,0 @@ -TITLE("Meine Anwendung V1.0.0.0 Hilfe") -COMPRESSED -120,156,139,86,80,81,49,208,49,80,54,32,0,172,92,82,211,18,75,115,74,98,163,171,227,107,85,93,253,116,67,131,21,162,139,13,172,109,181,204,20,66,243,74,82,139,74,50,82,115,19,21,252,138,244,20,12,12,12,245,128,88,45,22,38,15,97,197,149,228,23,100,38,39,88,37,232,39,232,135,6,132,36,196,7,151,164,56,22,20,160,112,60,82,115,128,2,158,121,25,137,57,37,197,101,169,69,85,169,153,201,25,121,153,197,9,42,41,169,9,186,41,169,113,10,152,114,164,154,30,2,114,104,66,60,208,133,8,83,29,75,211,202,15,47,41,42,129,26,6,117,177,145,130,75,105,110,110,101,130,174,71,102,78,90,106,73,106,69,73,44,0,177,84,97,211, diff --git a/uppdev/stdapp/stdappHelp.tpp/Unterthema_001_002$de-de.tpp b/uppdev/stdapp/stdappHelp.tpp/Unterthema_001_002$de-de.tpp deleted file mode 100644 index e53be0001..000000000 --- a/uppdev/stdapp/stdappHelp.tpp/Unterthema_001_002$de-de.tpp +++ /dev/null @@ -1,3 +0,0 @@ -TITLE("Meine Anwendung V1.0.0.0 Hilfe") -COMPRESSED -120,156,139,86,80,81,49,208,49,80,54,32,0,172,92,82,211,18,75,115,74,98,163,171,227,107,85,93,253,116,67,131,21,162,139,13,172,109,181,204,20,66,243,74,82,139,74,50,82,115,19,21,252,138,244,20,12,12,12,245,12,12,140,212,98,97,242,16,86,92,73,126,65,102,114,130,85,130,126,130,126,104,64,72,66,124,112,73,138,99,65,1,10,199,35,53,7,40,224,153,151,145,152,83,82,92,150,90,84,149,154,153,156,145,151,89,156,160,146,146,154,160,155,146,26,167,128,41,71,170,233,33,32,135,38,196,3,93,137,48,213,177,52,173,252,240,146,162,18,168,97,80,23,27,41,184,148,230,230,86,38,232,122,100,230,164,165,150,164,86,148,196,2,0,178,42,97,212, diff --git a/uppdev/stdapp/stdappHelp.tpp/Unterthema_001_003$de-de.tpp b/uppdev/stdapp/stdappHelp.tpp/Unterthema_001_003$de-de.tpp deleted file mode 100644 index 2125e0979..000000000 --- a/uppdev/stdapp/stdappHelp.tpp/Unterthema_001_003$de-de.tpp +++ /dev/null @@ -1,3 +0,0 @@ -TITLE("Meine Anwendung V1.0.0.0 Hilfe") -COMPRESSED -120,156,139,86,80,81,49,208,49,80,54,32,0,172,92,82,211,18,75,115,74,98,163,171,227,107,85,93,253,116,67,131,21,162,139,13,172,109,181,204,20,66,243,74,82,139,74,50,82,115,19,21,252,138,244,20,12,12,12,245,12,12,140,213,98,97,242,16,86,92,73,126,65,102,114,130,85,130,126,130,126,104,64,72,66,124,112,73,138,99,65,1,10,199,35,53,7,40,224,153,151,145,152,83,82,92,150,90,84,149,154,153,156,145,151,89,156,160,146,146,154,160,155,146,26,167,128,41,71,170,233,33,32,135,38,196,3,93,137,48,213,177,52,173,252,240,146,162,18,168,97,80,23,27,41,184,148,230,230,86,38,232,122,100,230,164,165,150,164,86,148,196,2,0,179,0,97,213, diff --git a/uppdev/stdapp/stdappHelp.tpp/Unterthema_002_001$de-de.tpp b/uppdev/stdapp/stdappHelp.tpp/Unterthema_002_001$de-de.tpp deleted file mode 100644 index c9e218b41..000000000 --- a/uppdev/stdapp/stdappHelp.tpp/Unterthema_002_001$de-de.tpp +++ /dev/null @@ -1,3 +0,0 @@ -TITLE("Meine Anwendung V1.0.0.0 Hilfe") -COMPRESSED -120,156,139,86,80,81,49,208,49,80,54,32,0,172,92,82,211,18,75,115,74,98,163,171,227,107,85,93,253,116,67,131,21,162,139,13,172,109,181,204,20,66,243,74,82,139,74,50,82,115,19,21,252,138,244,20,12,12,140,244,12,12,12,213,98,97,242,16,86,92,73,126,65,102,114,130,85,130,126,130,126,104,64,72,66,124,112,73,138,99,65,1,10,199,35,53,7,40,224,153,151,145,152,83,82,92,150,90,84,149,154,153,156,145,151,89,156,160,146,146,154,160,155,146,26,167,128,41,71,170,233,33,32,135,38,196,3,93,137,48,213,177,52,173,252,240,146,162,18,168,97,80,23,27,41,184,148,230,230,86,38,232,122,100,230,164,165,150,164,86,148,196,2,0,178,98,97,213, diff --git a/uppdev/stdapp/stdappHelp.tpp/Unterthema_002_002$de-de.tpp b/uppdev/stdapp/stdappHelp.tpp/Unterthema_002_002$de-de.tpp deleted file mode 100644 index 8fe56657e..000000000 --- a/uppdev/stdapp/stdappHelp.tpp/Unterthema_002_002$de-de.tpp +++ /dev/null @@ -1,3 +0,0 @@ -TITLE("Meine Anwendung V1.0.0.0 Hilfe") -COMPRESSED -120,156,139,86,80,81,49,208,49,80,54,32,0,172,92,82,211,18,75,115,74,98,163,171,227,107,85,93,253,116,67,131,21,162,139,13,172,109,181,204,20,66,243,74,82,139,74,50,82,115,19,21,252,138,244,20,12,12,140,244,128,88,45,22,38,15,97,197,149,228,23,100,38,39,88,37,232,39,232,135,6,132,36,196,7,151,164,56,22,20,160,112,60,82,115,128,2,158,121,25,137,57,37,197,101,169,69,85,169,153,201,25,121,153,197,9,42,41,169,9,186,41,169,113,10,152,114,164,154,30,2,114,104,66,60,208,133,8,83,29,75,211,202,15,47,41,42,129,26,6,117,177,145,130,75,105,110,110,101,130,174,71,102,78,90,106,73,106,69,73,44,0,179,56,97,214, diff --git a/uppdev/stdapp/stdappHelp.tpp/Unterthema_002_003$de-de.tpp b/uppdev/stdapp/stdappHelp.tpp/Unterthema_002_003$de-de.tpp deleted file mode 100644 index e071524b7..000000000 --- a/uppdev/stdapp/stdappHelp.tpp/Unterthema_002_003$de-de.tpp +++ /dev/null @@ -1,3 +0,0 @@ -TITLE("Meine Anwendung V1.0.0.0 Hilfe") -COMPRESSED -120,156,139,86,80,81,49,208,49,80,54,32,0,172,92,82,211,18,75,115,74,98,163,171,227,107,85,93,253,116,67,131,21,162,139,13,172,109,181,204,20,66,243,74,82,139,74,50,82,115,19,21,252,138,244,20,12,12,140,244,12,12,140,213,98,97,242,16,86,92,73,126,65,102,114,130,85,130,126,130,126,104,64,72,66,124,112,73,138,99,65,1,10,199,35,53,7,40,224,153,151,145,152,83,82,92,150,90,84,149,154,153,156,145,151,89,156,160,146,146,154,160,155,146,26,167,128,41,71,170,233,33,32,135,38,196,3,93,137,48,213,177,52,173,252,240,146,162,18,168,97,80,23,27,41,184,148,230,230,86,38,232,122,100,230,164,165,150,164,86,148,196,2,0,180,14,97,215, diff --git a/uppdev/stdapp/stdappHelp.tpp/Unterthema_003_001$de-de.tpp b/uppdev/stdapp/stdappHelp.tpp/Unterthema_003_001$de-de.tpp deleted file mode 100644 index 04b015e4b..000000000 --- a/uppdev/stdapp/stdappHelp.tpp/Unterthema_003_001$de-de.tpp +++ /dev/null @@ -1,3 +0,0 @@ -TITLE("Meine Anwendung V1.0.0.0 Hilfe") -COMPRESSED -120,156,139,86,80,81,49,208,49,80,54,32,0,172,92,82,211,18,75,115,74,98,163,171,227,107,85,93,253,116,67,131,21,162,139,13,172,109,181,204,20,66,243,74,82,139,74,50,82,115,19,21,252,138,244,20,12,12,140,245,12,12,12,213,98,97,242,16,86,92,73,126,65,102,114,130,85,130,126,130,126,104,64,72,66,124,112,73,138,99,65,1,10,199,35,53,7,40,224,153,151,145,152,83,82,92,150,90,84,149,154,153,156,145,151,89,156,160,146,146,154,160,155,146,26,167,128,41,71,170,233,33,32,135,38,196,3,93,137,48,213,177,52,173,252,240,146,162,18,168,97,80,23,27,41,184,148,230,230,86,38,232,122,100,230,164,165,150,164,86,148,196,2,0,179,112,97,215, diff --git a/uppdev/stdapp/stdappHelp.tpp/Unterthema_003_002$de-de.tpp b/uppdev/stdapp/stdappHelp.tpp/Unterthema_003_002$de-de.tpp deleted file mode 100644 index a3c29f831..000000000 --- a/uppdev/stdapp/stdappHelp.tpp/Unterthema_003_002$de-de.tpp +++ /dev/null @@ -1,3 +0,0 @@ -TITLE("Meine Anwendung V1.0.0.0 Hilfe") -COMPRESSED -120,156,139,86,80,81,49,208,49,80,54,32,0,172,92,82,211,18,75,115,74,98,163,171,227,107,85,93,253,116,67,131,21,162,139,13,172,109,181,204,20,66,243,74,82,139,74,50,82,115,19,21,252,138,244,20,12,12,140,245,12,12,140,212,98,97,242,16,86,92,73,126,65,102,114,130,85,130,126,130,126,104,64,72,66,124,112,73,138,99,65,1,10,199,35,53,7,40,224,153,151,145,152,83,82,92,150,90,84,149,154,153,156,145,151,89,156,160,146,146,154,160,155,146,26,167,128,41,71,170,233,33,32,135,38,196,3,93,137,48,213,177,52,173,252,240,146,162,18,168,97,80,23,27,41,184,148,230,230,86,38,232,122,100,230,164,165,150,164,86,148,196,2,0,180,70,97,216, diff --git a/uppdev/stdapp/stdappHelp.tpp/Unterthema_003_003$de-de.tpp b/uppdev/stdapp/stdappHelp.tpp/Unterthema_003_003$de-de.tpp deleted file mode 100644 index fb9cdad10..000000000 --- a/uppdev/stdapp/stdappHelp.tpp/Unterthema_003_003$de-de.tpp +++ /dev/null @@ -1,3 +0,0 @@ -TITLE("Meine Anwendung V1.0.0.0 Hilfe") -COMPRESSED -120,156,139,86,80,81,49,208,49,80,54,32,0,172,92,82,211,18,75,115,74,98,163,171,227,107,85,93,253,116,67,131,21,162,139,13,172,109,181,204,20,66,243,74,82,139,74,50,82,115,19,21,252,138,244,20,12,12,140,245,128,88,45,22,38,15,97,197,149,228,23,100,38,39,88,37,232,39,232,135,6,132,36,196,7,151,164,56,22,20,160,112,60,82,115,128,2,158,121,25,137,57,37,197,101,169,69,85,169,153,201,25,121,153,197,9,42,41,169,9,186,41,169,113,10,152,114,164,154,30,2,114,104,66,60,208,133,8,83,29,75,211,202,15,47,41,42,129,26,6,117,177,145,130,75,105,110,110,101,130,174,71,102,78,90,106,73,106,69,73,44,0,181,28,97,217, diff --git a/uppdev/stdapp/stdappHelp.tpp/all.i b/uppdev/stdapp/stdappHelp.tpp/all.i deleted file mode 100644 index 17e0df838..000000000 --- a/uppdev/stdapp/stdappHelp.tpp/all.i +++ /dev/null @@ -1,103 +0,0 @@ -TOPIC("Index$en-us") -#include "Index$en-us.tpp" -END_TOPIC - -TOPIC("Inhaltsverzeichnis$de-de") -#include "Inhaltsverzeichnis$de-de.tpp" -END_TOPIC - -TOPIC("Subtopic_001_001$en-us") -#include "Subtopic_001_001$en-us.tpp" -END_TOPIC - -TOPIC("Subtopic_001_002$en-us") -#include "Subtopic_001_002$en-us.tpp" -END_TOPIC - -TOPIC("Subtopic_001_003$en-us") -#include "Subtopic_001_003$en-us.tpp" -END_TOPIC - -TOPIC("Subtopic_002_001$en-us") -#include "Subtopic_002_001$en-us.tpp" -END_TOPIC - -TOPIC("Subtopic_002_002$en-us") -#include "Subtopic_002_002$en-us.tpp" -END_TOPIC - -TOPIC("Subtopic_002_003$en-us") -#include "Subtopic_002_003$en-us.tpp" -END_TOPIC - -TOPIC("Subtopic_003_001$en-us") -#include "Subtopic_003_001$en-us.tpp" -END_TOPIC - -TOPIC("Subtopic_003_002$en-us") -#include "Subtopic_003_002$en-us.tpp" -END_TOPIC - -TOPIC("Subtopic_003_003$en-us") -#include "Subtopic_003_003$en-us.tpp" -END_TOPIC - -TOPIC("Thema_001$de-de") -#include "Thema_001$de-de.tpp" -END_TOPIC - -TOPIC("Thema_002$de-de") -#include "Thema_002$de-de.tpp" -END_TOPIC - -TOPIC("Thema_003$de-de") -#include "Thema_003$de-de.tpp" -END_TOPIC - -TOPIC("Topic_001$en-us") -#include "Topic_001$en-us.tpp" -END_TOPIC - -TOPIC("Topic_002$en-us") -#include "Topic_002$en-us.tpp" -END_TOPIC - -TOPIC("Topic_003$en-us") -#include "Topic_003$en-us.tpp" -END_TOPIC - -TOPIC("Unterthema_001_001$de-de") -#include "Unterthema_001_001$de-de.tpp" -END_TOPIC - -TOPIC("Unterthema_001_002$de-de") -#include "Unterthema_001_002$de-de.tpp" -END_TOPIC - -TOPIC("Unterthema_001_003$de-de") -#include "Unterthema_001_003$de-de.tpp" -END_TOPIC - -TOPIC("Unterthema_002_001$de-de") -#include "Unterthema_002_001$de-de.tpp" -END_TOPIC - -TOPIC("Unterthema_002_002$de-de") -#include "Unterthema_002_002$de-de.tpp" -END_TOPIC - -TOPIC("Unterthema_002_003$de-de") -#include "Unterthema_002_003$de-de.tpp" -END_TOPIC - -TOPIC("Unterthema_003_001$de-de") -#include "Unterthema_003_001$de-de.tpp" -END_TOPIC - -TOPIC("Unterthema_003_002$de-de") -#include "Unterthema_003_002$de-de.tpp" -END_TOPIC - -TOPIC("Unterthema_003_003$de-de") -#include "Unterthema_003_003$de-de.tpp" -END_TOPIC diff --git a/uppdev/stdapp/stdappSettings.cpp b/uppdev/stdapp/stdappSettings.cpp deleted file mode 100644 index cbfba1c33..000000000 --- a/uppdev/stdapp/stdappSettings.cpp +++ /dev/null @@ -1,59 +0,0 @@ -#include - -void stdapp::Settings(Bar& bar) -{ - bar.Add(t_("International"), THISBACK(OnInternational)).Help(t_("Select the application language")); - bar.Add(t_("Options"), THISBACK(OnOptions)).Key(K_CTRL_O).Help(t_("Customize application")); -} - -void stdapp::OnInternational(Bar& bar) -{ - bar.Add("Deutsch", THISBACK1(OnLanguage, LNG_('D', 'E', 'D', 'E'))) - .Check(cfg.language == LNG_('D', 'E', 'D', 'E') ? true : false) - .Help("Deutsch als Sprache auswählen"); - bar.Add("English", THISBACK1(OnLanguage, LNG_('E', 'N', 'U', 'S'))) - .Check(cfg.language == LNG_('E', 'N', 'U', 'S') ? true : false) - .Help("Select English as language"); -} - -void stdapp::OnOptions() -{ - static bool tabs_added = false; - - if (tabs_added) - { - options.tab.Reset(); - } - else - tabs_added = true; - options.tab.Add(language, t_("Language")); - options.tab.Add(configuration, t_("Configuration")); - options.tab.Add(splash_screen, t_("Splash screen")); - options.Title(t_("Options")); - language.current_language <<= cfg.language; - configuration.restore_cfg <<= cfg.restore_cfg; - splash_screen.show_splash <<= cfg.show_splash; - options.ok <<= THISBACK(OnOptionsOK); - options.cancel <<= THISBACK(OnOptionsCancel); - options.Execute(); -} - -void stdapp::OnOptionsOK() -{ - cfg.language = ~language.current_language; - cfg.restore_cfg = ~configuration.restore_cfg; - cfg.show_splash = ~splash_screen.show_splash; - options.Close(); - Init(); -} - -void stdapp::OnOptionsCancel() -{ - options.Close(); -} - -void stdapp::OnLanguage(const int language_id) -{ - cfg.language = language_id; - Init(); -} diff --git a/uppdev/stdapp/stdappSettings.hpp b/uppdev/stdapp/stdappSettings.hpp deleted file mode 100644 index 8c8aed75b..000000000 --- a/uppdev/stdapp/stdappSettings.hpp +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef STDAPP_SETTINGS_HPP -#define STDAPP_SETTINGS_HPP - -void Settings(Bar& bar); -void OnInternational(Bar& bar); -void OnOptions(); -void OnOptionsOK(); -void OnOptionsCancel(); -void OnLanguage(const int language_id); - -#endif diff --git a/uppdev/stdapp/stdappSettings.lay b/uppdev/stdapp/stdappSettings.lay deleted file mode 100644 index 2a78ccea3..000000000 --- a/uppdev/stdapp/stdappSettings.lay +++ /dev/null @@ -1,18 +0,0 @@ -LAYOUT(stdappLayoutTab, 296, 208) - ITEM(TabCtrl, tab, HCenterPosZ(256, 0).TopPosZ(20, 128)) - ITEM(Button, ok, SetLabel(t_("OK")).LeftPosZ(20, 80).BottomPosZ(20, 20)) - ITEM(Button, cancel, SetLabel(t_("Cancel")).RightPosZ(20, 80).BottomPosZ(20, 20)) -END_LAYOUT - -LAYOUT(stdappLayoutLang, 256, 128) - ITEM(LNGCtrl, current_language, RightPosZ(144, 92).VCenterPosZ(24, -16)) - ITEM(Label, language_label, SetLabel(t_("Select language")).LeftPosZ(112, 100).VCenterPosZ(20, -18)) -END_LAYOUT - -LAYOUT(stdappLayoutCfg, 256, 128) - ITEM(Option, restore_cfg, SetLabel(t_("Restore configuration")).LeftPosZ(20, 216).VCenterPosZ(20, -18)) -END_LAYOUT - -LAYOUT(stdappLayoutSplash, 256, 128) - ITEM(Option, show_splash, SetLabel(t_("Show splash screen")).HCenterPosZ(216, 0).VCenterPosZ(20, -18)) -END_LAYOUT diff --git a/uppdev/stdapp/stdappSplash.cpp b/uppdev/stdapp/stdappSplash.cpp deleted file mode 100644 index c17ccb994..000000000 --- a/uppdev/stdapp/stdappSplash.cpp +++ /dev/null @@ -1,70 +0,0 @@ -#include - -#define IMAGECLASS UPP_LogoImg -#define IMAGEFILE -#include - -Splash::Splash(const int language, const int ms) -{ - SetLanguage(language); - SetRect(GetWorkArea().CenterRect(MakeSplash(*this, widgets) + 2)); - SetFrame(BlackFrame()); - PopUp(NULL, false, false, true); - SetTimeCallback(ms, THISBACK(CloseSplash)); -} - -Size Splash::MakeSplash(Ctrl& parent, Array& widgets) -{ - Image logo = UPP_LogoImg::AppLogo(); - - Size logo_size = logo.GetSize(); - Size rect_size; - rect_size.cx = max(SPLASH_RECT_CX, logo_size.cx); - rect_size.cy = max(SPLASH_RECT_CY, logo_size.cy); - - parent.Add(widgets.Create().Color(SPLASH_PAPER_COLOR).SizePos()); - - ImageCtrl& image = widgets.Create(); - image.SetImage(logo); - image.LeftPos(0, logo_size.cx).VSizePos(); - parent.Add(image); - - Label& label_1 = widgets.Create